IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAAAsAAABfX2luaXRfXy5weVBLAwQUAAAAAAAAACEA6OeQvFkeAABZHgAACwAAAF9fbWFpbl9fLnB5IyBDb3B5cmlnaHQgMjAxNyBUaGUgQmF6ZWwgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIwojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIwojICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoiIiJUaGUgcGlwdG9vbCBtb2R1bGUgaW1wb3J0cyBwaXAgcmVxdWlyZW1lbnRzIGludG8gQmF6ZWwgcnVsZXMuIiIiCgojIEJvaWxlcnBsYXRlIGFkZGVkIGJ5IHN1YnBhci9jb21waWxlci9weXRob25fYXJjaGl2ZS5weQpmcm9tIHN1YnBhci5ydW50aW1lIGltcG9ydCBzdXBwb3J0IGFzIF8KXy5zZXR1cChpbXBvcnRfcm9vdHM9WydweXBpX19zZXR1cHRvb2xzXzM4XzJfNCcsICdweXBpX19waXBfOV8wXzMnLCAncHlwaV9fd2hlZWxfMF8zMF8wYTAnLCAnYmF6ZWxfdG9vbHMnLCAncHlwaV9fcGlwXzlfMF8zJywgJ3B5cGlfX3NldHVwdG9vbHNfMzhfMl80JywgJ3B5cGlfX3doZWVsXzBfMzBfMGEwJywgJ3J1bGVzX3B5dGhvbiddLCB6aXBfc2FmZT1UcnVlKQpkZWwgXwojIEVuZCBib2lsZXJwbGF0ZQppbXBvcnQgYXJncGFyc2UKaW1wb3J0IGF0ZXhpdAppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHBrZ3V0aWwKaW1wb3J0IHBrZ19yZXNvdXJjZXMKaW1wb3J0IHJlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHppcGZpbGUKCiMgTm90ZTogV2UgY2FyZWZ1bGx5IGltcG9ydCB0aGUgZm9sbG93aW5nIG1vZHVsZXMgaW4gYSBwYXJ0aWN1bGFyCiMgb3JkZXIsIHNpbmNlIHRoZXNlIG1vZHVsZXMgbW9kaWZ5IHRoZSBpbXBvcnQgcGF0aCBhbmQgbWFjaGluZXJ5LgppbXBvcnQgcGtnX3Jlc291cmNlcwoKCmRlZiBleHRyYWN0X3BhY2thZ2VzKHBhY2thZ2VfbmFtZXMpOgogICAgIiIiRXh0cmFjdCB6aXBmaWxlIGNvbnRlbnRzIHRvIGRpc2sgYW5kIGFkZCB0byBpbXBvcnQgcGF0aCIiIgoKICAgICMgU2V0IGEgc2FmZSBleHRyYWN0aW9uIGRpcgogICAgZXh0cmFjdGlvbl90bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIGF0ZXhpdC5yZWdpc3RlcihsYW1iZGE6IHNodXRpbC5ybXRyZWUoCiAgICAgICAgZXh0cmFjdGlvbl90bXBkaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkpCiAgICBwa2dfcmVzb3VyY2VzLnNldF9leHRyYWN0aW9uX3BhdGgoZXh0cmFjdGlvbl90bXBkaXIpCgogICAgIyBFeHRyYWN0IGVhY2ggcGFja2FnZSB0byBkaXNrCiAgICBkaXJzX3RvX2FkZCA9IFtdCiAgICBmb3IgcGFja2FnZV9uYW1lIGluIHBhY2thZ2VfbmFtZXM6CiAgICAgICAgcmVxID0gcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZShwYWNrYWdlX25hbWUpCiAgICAgICAgZXh0cmFjdGlvbl9kaXIgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKHJlcSwgJycpCiAgICAgICAgZGlyc190b19hZGQuYXBwZW5kKGV4dHJhY3Rpb25fZGlyKQoKICAgICMgQWRkIGV4dHJhY3RlZCBkaXJlY3RvcmllcyB0byBpbXBvcnQgcGF0aCBhaGVhZCBvZiB0aGVpciB6aXAgZmlsZQogICAgIyBjb3VudGVycGFydHMuCiAgICBzeXMucGF0aFswOjBdID0gZGlyc190b19hZGQKICAgIGV4aXN0aW5nX3B5dGhvbnBhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcpCiAgICBpZiBleGlzdGluZ19weXRob25wYXRoOgogICAgICAgIGRpcnNfdG9fYWRkLmV4dGVuZChleGlzdGluZ19weXRob25wYXRoLnNwbGl0KCc6JykpCiAgICBvcy5lbnZpcm9uWydQWVRIT05QQVRIJ10gPSAnOicuam9pbihkaXJzX3RvX2FkZCkKCgojIFdoZWVsLCBwaXAsIGFuZCBzZXR1cHRvb2xzIGFyZSBtdWNoIGhhcHBpZXIgcnVubmluZyBmcm9tIGFjdHVhbAojIGZpbGVzIG9uIGRpc2ssIHJhdGhlciB0aGFuIGVudHJpZXMgaW4gYSB6aXBmaWxlLiAgRXh0cmFjdCB6aXBmaWxlCiMgY29udGVudHMsIGFkZCB0aG9zZSBjb250ZW50cyB0byB0aGUgcGF0aCwgdGhlbiBpbXBvcnQgdGhlbS4KZXh0cmFjdF9wYWNrYWdlcyhbJ3BpcCcsICdzZXR1cHRvb2xzJywgJ3doZWVsJ10pCgojIERlZmVhdCBwaXAncyBhdHRlbXB0IHRvIG1hbmdsZSBzeXMucGF0aApzYXZlZF9zeXNfcGF0aCA9IHN5cy5wYXRoCnN5cy5wYXRoID0gc3lzLnBhdGhbOl0KaW1wb3J0IHBpcApzeXMucGF0aCA9IHNhdmVkX3N5c19wYXRoCgppbXBvcnQgc2V0dXB0b29scwppbXBvcnQgd2hlZWwKCgpkZWYgcGlwX21haW4oYXJndik6CiAgICAjIEV4dHJhY3QgdGhlIGNlcnRpZmljYXRlcyBmcm9tIHRoZSBQQVIgZm9sbG93aW5nIHRoZSBleGFtcGxlIG9mIGdldC1waXAucHkKICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvZ2V0LXBpcC9ibG9iLzQzMGJhMzc3NzZhZTJhZDg5L3RlbXBsYXRlLnB5I0wxNjQtTDE2OAogICAgY2VydF90bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIGNlcnRfcGF0aCA9IG9zLnBhdGguam9pbihjZXJ0X3RtcGRpciwgImNhY2VydC5wZW0iKQogICAgYXRleGl0LnJlZ2lzdGVyKGxhbWJkYTogc2h1dGlsLnJtdHJlZShjZXJ0X3RtcGRpciwgaWdub3JlX2Vycm9ycz1UcnVlKSkKICAgIHdpdGggb3BlbihjZXJ0X3BhdGgsICJ3YiIpIGFzIGNlcnQ6CiAgICAgIGNlcnQud3JpdGUocGtndXRpbC5nZXRfZGF0YSgicGlwLl92ZW5kb3IucmVxdWVzdHMiLCAiY2FjZXJ0LnBlbSIpKQogICAgYXJndiA9IFsiLS1kaXNhYmxlLXBpcC12ZXJzaW9uLWNoZWNrIiwgIi0tY2VydCIsIGNlcnRfcGF0aF0gKyBhcmd2CiAgICByZXR1cm4gcGlwLm1haW4oYXJndikKCmZyb20gcnVsZXNfcHl0aG9uLndobCBpbXBvcnQgV2hlZWwKCnBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKAogICAgZGVzY3JpcHRpb249J0ltcG9ydCBQeXRob24gZGVwZW5kZW5jaWVzIGludG8gQmF6ZWwuJykKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tbmFtZScsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9KCdUaGUgbmFtZXNwYWNlIG9mIHRoZSBpbXBvcnQuJykpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWlucHV0JywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSByZXF1aXJlbWVudHMudHh0IGZpbGUgdG8gaW1wb3J0LicpKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1vdXRwdXQnLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVGhlIHJlcXVpcmVtZW50cy5iemwgZmlsZSB0byBleHBvcnQuJykpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWRpcmVjdG9yeScsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9KCdUaGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdG8gcHV0IC53aGwgZmlsZXMuJykpCgpkZWYgZGV0ZXJtaW5lX3Bvc3NpYmxlX2V4dHJhcyh3aGxzKToKICAiIiJEZXRlcm1pbmVzIHRoZSBsaXN0IG9mIHBvc3NpYmxlICJleHRyYXMiIGZvciBlYWNoIC53aGwKCiAgVGhlIHBvc3NpYmlsaXR5IG9mIGFuIGV4dHJhIGlzIGRldGVybWluZWQgYnkgbG9va2luZyBhdCBpdHMKICBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cywgYW5kIGRldGVybWluaW5lIHdoZXRoZXIgdGhleSBhcmUKICBzYXRpc2ZpZWQgYnkgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgYXZhaWxhYmxlIHdoZWVscy4KCiAgQXJnczoKICAgIHdobHM6IGEgbGlzdCBvZiBXaGVlbCBvYmplY3RzCgogIFJldHVybnM6CiAgICBhIGRpY3QgdGhhdCBpcyBrZXllZCBieSB0aGUgV2hlZWwgb2JqZWN0cyBpbiB3aGxzLCBhbmQgd2hvc2UKICAgIHZhbHVlcyBhcmUgbGlzdHMgb2YgcG9zc2libGUgZXh0cmFzLgogICIiIgogIHdobF9tYXAgPSB7CiAgICB3aGwuZGlzdHJpYnV0aW9uKCk6IHdobAogICAgZm9yIHdobCBpbiB3aGxzCiAgfQoKICAjIFRPRE8obWF0dG1vb3IpOiBDb25zaWRlciBtZW1vaXppbmcgaWYgdGhpcyByZWN1cnNpb24gZXZlciBiZWNvbWVzCiAgIyBleHBlbnNpdmUgZW5vdWdoIHRvIHdhcnJhbnQgaXQuCiAgZGVmIGlzX3Bvc3NpYmxlKGRpc3RybywgZXh0cmEpOgogICAgZGlzdHJvID0gZGlzdHJvLnJlcGxhY2UoIi0iLCAiXyIpCiAgICAjIElmIHdlIGRvbid0IGhhdmUgdGhlIC53aGwgYXQgYWxsLCB0aGVuIHRoaXMgaXNuJ3QgcG9zc2libGUuCiAgICBpZiBkaXN0cm8gbm90IGluIHdobF9tYXA6CiAgICAgIHJldHVybiBGYWxzZQogICAgd2hsID0gd2hsX21hcFtkaXN0cm9dCiAgICAjIElmIHdlIGhhdmUgdGhlIC53aGwsIGFuZCB3ZSBkb24ndCBuZWVkIGFueXRoaW5nIGV4dHJhIHRoZW4KICAgICMgd2UgY2FuIHNhdGlzZnkgdGhpcyBkZXBlbmRlbmN5LgogICAgaWYgbm90IGV4dHJhOgogICAgICByZXR1cm4gVHJ1ZQogICAgIyBJZiB3ZSBkbyBuZWVkIHNvbWV0aGluZyBleHRyYSwgdGhlbiBjaGVjayB0aGUgZXh0cmEncwogICAgIyBkZXBlbmRlbmNpZXMgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIGZ1bGx5IHNhdGlzZmllZC4KICAgIGZvciBleHRyYV9kZXAgaW4gd2hsLmRlcGVuZGVuY2llcyhleHRyYT1leHRyYSk6CiAgICAgIHJlcSA9IHBrZ19yZXNvdXJjZXMuUmVxdWlyZW1lbnQucGFyc2UoZXh0cmFfZGVwKQogICAgICAjIENoZWNrIHRoYXQgdGhlIGRlcCBhbmQgYW55IGV4dHJhcyBhcmUgYWxsIHBvc3NpYmxlLgogICAgICBpZiBub3QgaXNfcG9zc2libGUocmVxLnByb2plY3RfbmFtZSwgTm9uZSk6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgIGZvciBlIGluIHJlcS5leHRyYXM6CiAgICAgICAgaWYgbm90IGlzX3Bvc3NpYmxlKHJlcS5wcm9qZWN0X25hbWUsIGUpOgogICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAjIElmIGFsbCBvZiB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBleHRyYSBhcmUgc2F0aXNmaWFibGUgdGhlbgogICAgIyBpdCBpcyBwb3NzaWJsZSB0byBjb25zdHJ1Y3QgdGhpcyBkZXBlbmRlbmN5LgogICAgcmV0dXJuIFRydWUKCiAgcmV0dXJuIHsKICAgIHdobDogWwogICAgICBleHRyYQogICAgICBmb3IgZXh0cmEgaW4gd2hsLmV4dHJhcygpCiAgICAgIGlmIGlzX3Bvc3NpYmxlKHdobC5kaXN0cmlidXRpb24oKSwgZXh0cmEpCiAgICBdCiAgICBmb3Igd2hsIGluIHdobHMKICB9CgpkZWYgbWFpbigpOgogIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCgogICMgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2Jsb2IvOS4wLjEvcGlwL19faW5pdF9fLnB5I0wyMDkKICBpZiBwaXBfbWFpbihbIndoZWVsIiwgIi13IiwgYXJncy5kaXJlY3RvcnksICItciIsIGFyZ3MuaW5wdXRdKToKICAgIHN5cy5leGl0KDEpCgogICMgRW51bWVyYXRlIHRoZSAud2hsIGZpbGVzIHdlIGRvd25sb2FkZWQuCiAgZGVmIGxpc3Rfd2hscygpOgogICAgZGlyID0gYXJncy5kaXJlY3RvcnkgKyAnLycKICAgIGZvciByb290LCB1bnVzZWRfZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKGRpcik6CiAgICAgIGZvciBmbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgaWYgZm5hbWUuZW5kc3dpdGgoJy53aGwnKToKICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihyb290LCBmbmFtZSkKCiAgd2hscyA9IFtXaGVlbChwYXRoKSBmb3IgcGF0aCBpbiBsaXN0X3dobHMoKV0KICBwb3NzaWJsZV9leHRyYXMgPSBkZXRlcm1pbmVfcG9zc2libGVfZXh0cmFzKHdobHMpCgogIGRlZiB3aGxfbGlicmFyeSh3aGVlbCk6CiAgICAjIEluZGVudGF0aW9uIGhlcmUgbWF0dGVycy4gIHdobF9saWJyYXJ5IG11c3QgYmUgd2l0aGluIHRoZSBzY29wZQogICAgIyBvZiB0aGUgZnVuY3Rpb24gYmVsb3cuICBXZSBhbHNvIGF2b2lkIHJlaW1wb3J0aW5nIGFuIGV4aXN0aW5nIFdITC4KICAgIHJldHVybiAiIiIKICBpZiAie3JlcG9fbmFtZX0iIG5vdCBpbiBuYXRpdmUuZXhpc3RpbmdfcnVsZXMoKToKICAgIHdobF9saWJyYXJ5KAogICAgICAgIG5hbWUgPSAie3JlcG9fbmFtZX0iLAogICAgICAgIHdobCA9ICJAe25hbWV9Ly86e3BhdGh9IiwKICAgICAgICByZXF1aXJlbWVudHMgPSAiQHtuYW1lfS8vOnJlcXVpcmVtZW50cy5iemwiLAogICAgICAgIGV4dHJhcyA9IFt7ZXh0cmFzfV0KICAgICkiIiIuZm9ybWF0KG5hbWU9YXJncy5uYW1lLCByZXBvX25hbWU9d2hlZWwucmVwb3NpdG9yeV9uYW1lKCksCiAgICAgICAgICAgICAgICBwYXRoPXdoZWVsLmJhc2VuYW1lKCksCiAgICAgICAgICAgICAgICBleHRyYXM9JywnLmpvaW4oWwogICAgICAgICAgICAgICAgICAnIiVzIicgJSBleHRyYQogICAgICAgICAgICAgICAgICBmb3IgZXh0cmEgaW4gcG9zc2libGVfZXh0cmFzLmdldCh3aGVlbCwgW10pCiAgICAgICAgICAgICAgICBdKSkKCiAgd2hsX3RhcmdldHMgPSAnLCcuam9pbihbCiAgICAnLCcuam9pbihbCiAgICAgICciJXMiOiAiQCVzLy86cGtnIicgJSAod2hsLmRpc3RyaWJ1dGlvbigpLmxvd2VyKCksIHdobC5yZXBvc2l0b3J5X25hbWUoKSkKICAgIF0gKyBbCiAgICAgICMgRm9yIGV2ZXJ5IGV4dHJhIHRoYXQgaXMgcG9zc2libGUgZnJvbSB0aGlzIHJlcXVpcmVtZW50cy50eHQKICAgICAgJyIlc1slc10iOiAiQCVzLy86JXMiJyAlICh3aGwuZGlzdHJpYnV0aW9uKCkubG93ZXIoKSwgZXh0cmEubG93ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGwucmVwb3NpdG9yeV9uYW1lKCksIGV4dHJhKQogICAgICBmb3IgZXh0cmEgaW4gcG9zc2libGVfZXh0cmFzLmdldCh3aGwsIFtdKQogICAgXSkKICAgIGZvciB3aGwgaW4gd2hscwogIF0pCgogIHdpdGggb3BlbihhcmdzLm91dHB1dCwgJ3cnKSBhcyBmOgogICAgZi53cml0ZSgiIiJcCiMgSW5zdGFsbCBwaXAgcmVxdWlyZW1lbnRzLgojCiMgR2VuZXJhdGVkIGZyb20ge2lucHV0fQoKbG9hZCgiQHJ1bGVzX3B5dGhvbi8vcHl0aG9uOndobC5iemwiLCAid2hsX2xpYnJhcnkiKQoKZGVmIHBpcF9pbnN0YWxsKCk6CiAge3dobF9saWJyYXJpZXN9CgpfcmVxdWlyZW1lbnRzID0ge3sKICB7bWFwcGluZ3N9Cn19CgphbGxfcmVxdWlyZW1lbnRzID0gX3JlcXVpcmVtZW50cy52YWx1ZXMoKQoKZGVmIHJlcXVpcmVtZW50KG5hbWUpOgogIG5hbWVfa2V5ID0gbmFtZS5yZXBsYWNlKCItIiwgIl8iKS5sb3dlcigpCiAgaWYgbmFtZV9rZXkgbm90IGluIF9yZXF1aXJlbWVudHM6CiAgICBmYWlsKCJDb3VsZCBub3QgZmluZCBwaXAtcHJvdmlkZWQgZGVwZW5kZW5jeTogJyVzJyIgJSBuYW1lKQogIHJldHVybiBfcmVxdWlyZW1lbnRzW25hbWVfa2V5XQoiIiIuZm9ybWF0KGlucHV0PWFyZ3MuaW5wdXQsCiAgICAgICAgICAgd2hsX2xpYnJhcmllcz0nXG4nLmpvaW4obWFwKHdobF9saWJyYXJ5LCB3aGxzKSkgaWYgd2hscyBlbHNlICJwYXNzIiwKICAgICAgICAgICBtYXBwaW5ncz13aGxfdGFyZ2V0cykpCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogIG1haW4oKQpQSwMEFAAAAAAAAAAhAE85aVXiDQAA4g0AACYAAABiYXplbF90b29scy90b29scy9weXRob24vcHkzd3JhcHBlci5zaCMhL2Jpbi9zaAoKIyBEb24ndCBzZXQgLWUgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHJvYnVzdCB0cmFwcGluZyBhbmQgcHJpbnRpbmcgb2YgZXJyb3JzLgpzZXQgLXUKCiMgV2UgdXNlIC9iaW4vc2ggcmF0aGVyIHRoYW4gL2Jpbi9iYXNoIGZvciBwb3J0YWJpbGl0eS4gU2VlIGRpc2N1c3Npb24gaGVyZToKIyBodHRwczovL2dyb3Vwcy5nb29nbGUuY29tL2ZvcnVtLz9ub21vYmlsZT10cnVlIyF0b3BpYy9iYXplbC1kZXYvNFFsXzdlRGNMQzAKIyBXZSBkbyBsb3NlIHRoZSBhYmlsaXR5IHRvIHNldCAtbyBwaXBlZmFpbC4KClNUUklDVD0iMSIKCmlmIFsgIiRTVFJJQ1QiID0gIjEiIF07IHRoZW4KICBGQUlMVVJFX0hFQURFUj0iXApFcnJvciBvY2N1cnJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIHVzZSB0aGUgZGVmYXVsdCBQeXRob24gdG9vbGNoYWluIFwKKEBiYXplbF90b29scy8vdG9vbHMvcHl0aG9uOmF1dG9kZXRlY3RpbmdfdG9vbGNoYWluKS4iCmVsc2UKICBGQUlMVVJFX0hFQURFUj0iXApFcnJvciBvY2N1cnJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIHVzZSB0aGUgbm9uLXN0cmljdCBhdXRvZGV0ZWN0aW5nIFB5dGhvbiBcCnRvb2xjaGFpbiAoQGJhemVsX3Rvb2xzLy90b29scy9weXRob246YXV0b2RldGVjdGluZ190b29sY2hhaW5fbm9uc3RyaWN0KS4iCmZpCgpkaWUoKSB7CiAgZWNobyAiJEZBSUxVUkVfSEVBREVSIiAxPiYyCiAgZWNobyAiJDEiIDE+JjIKICBleGl0IDEKfQoKIyBXZSB1c2UgYHdoaWNoYCB0byBsb2NhdGUgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBjb21tYW5kIG9uIFBBVEguIGBjb21tYW5kIC12YAojIGlzIGFub3RoZXIgb3B0aW9uLCBidXQgaXQgZG9lc24ndCBjaGVjayB3aGV0aGVyIHRoZSBmaWxlIGl0IGZpbmRzIGhhcyB0aGUKIyBleGVjdXRhYmxlIGJpdC4KIwojIEEgdHJpY2t5IHNpdHVhdGlvbiBoYXBwZW5zIHdoZW4gdGhpcyB3cmFwcGVyIGlzIGludm9rZWQgYXMgcGFydCBvZiBydW5uaW5nIGEKIyB0b29sLCBlLmcuIHBhc3NpbmcgYSBweV9iaW5hcnkgdGFyZ2V0IHRvIGBjdHguYWN0aW9ucy5ydW4oKWAuIEJhemVsIHdpbGwgdW5zZXQKIyB0aGUgUEFUSCB2YXJpYWJsZS4gVGhlbiB0aGUgc2hlbGwgd2lsbCBzZWUgdGhlcmUncyBubyBQQVRIIGFuZCBpbml0aWFsaXplIGl0cwojIG93biwgc29tZXRpbWVzIHdpdGhvdXQgZXhwb3J0aW5nIGl0LiBUaGlzIGNhdXNlcyBgd2hpY2hgIHRvIGZhaWwgYW5kIHRoaXMKIyBzY3JpcHQgdG8gdGhpbmsgdGhlcmUncyBubyBQeXRob24gaW50ZXJwcmV0ZXIgaW5zdGFsbGVkLiBUbyBhdm9pZCB0aGlzIHdlCiMgZXhwbGljaXRseSBwYXNzIFBBVEggdG8gZWFjaCBgd2hpY2hgIGludm9jYXRpb24uIFdlIGNhbid0IGp1c3QgZXhwb3J0IFBBVEgKIyBiZWNhdXNlIHRoYXQgd291bGQgbW9kaWZ5IHRoZSBlbnZpcm9ubWVudCBzZWVuIGJ5IHRoZSBmaW5hbCB1c2VyIFB5dGhvbgojIHByb2dyYW0uCiMKIyBTZWUgYWxzbzoKIwojICAgICBodHRwczovL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9jb250aW51b3VzLWludGVncmF0aW9uL2lzc3Vlcy81NzgKIyAgICAgaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvYmF6ZWwvaXNzdWVzLzg0MTQKIyAgICAgaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvYmF6ZWwvaXNzdWVzLzg0MTUKCiMgVHJ5IHRoZSAicHl0aG9uMyIgY29tbWFuZCBuYW1lIGZpcnN0LCB0aGVuIGZhbGwgYmFjayBvbiAicHl0aG9uIi4KUFlUSE9OX0JJTj0iJChQQVRIPSIkUEFUSCIgd2hpY2ggcHl0aG9uMyAyPiAvZGV2L251bGwpIgpVU0VEX0ZBTExCQUNLPSIwIgppZiBbIC16ICIke1BZVEhPTl9CSU46LX0iIF07IHRoZW4KICBQWVRIT05fQklOPSIkKFBBVEg9IiRQQVRIIiB3aGljaCBweXRob24gMj4vZGV2L251bGwpIgogIFVTRURfRkFMTEJBQ0s9IjEiCmZpCmlmIFsgLXogIiR7UFlUSE9OX0JJTjotfSIgXTsgdGhlbgogIGRpZSAiTmVpdGhlciAncHl0aG9uMycgbm9yICdweXRob24nIHdlcmUgZm91bmQgb24gdGhlIHRhcmdldCBcCnBsYXRmb3JtJ3MgUEFUSCwgd2hpY2ggaXM6CgokUEFUSAoKUGxlYXNlIGVuc3VyZSBhbiBpbnRlcnByZXRlciBpcyBhdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybSAoYW5kIG1hcmtlZCBcCmV4ZWN1dGFibGUpLCBvciBlbHNlIHJlZ2lzdGVyIGFuIGFwcHJvcHJpYXRlIFB5dGhvbiB0b29sY2hhaW4gYXMgcGVyIHRoZSBcCmRvY3VtZW50YXRpb24gZm9yIHB5X3J1bnRpbWVfcGFpciBcCihodHRwczovL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9iYXplbC9ibG9iL21hc3Rlci90b29scy9weXRob24vdG9vbGNoYWluLmJ6bCkuIgpmaQoKaWYgWyAiJFNUUklDVCIgPSAiMSIgXTsgdGhlbgogICMgVmVyaWZ5IHRoYXQgd2UgZ3JhYmJlZCBhbiBpbnRlcnByZXRlciB3aXRoIHRoZSByaWdodCB2ZXJzaW9uLgogIFZFUlNJT05fU1RSPSIkKCIkUFlUSE9OX0JJTiIgLVYgMj4mMSkiIFwKICAgICAgfHwgZGllICJDb3VsZCBub3QgZ2V0IGludGVycHJldGVyIHZlcnNpb24gdmlhICckUFlUSE9OX0JJTiAtViciCiAgaWYgISBlY2hvICIkVkVSU0lPTl9TVFIiIHwgZ3JlcCAtcSAiIDNcLiIgOyB0aGVuCiAgICAgIGRpZSAiQWNjb3JkaW5nIHRvICckUFlUSE9OX0JJTiAtVicsIHZlcnNpb24gaXMgJyRWRVJTSU9OX1NUUicsIGJ1dCB3ZSBcCm5lZWQgdmVyc2lvbiAzLiBQQVRIIGlzOgoKJFBBVEgKClBsZWFzZSBlbnN1cmUgYW4gaW50ZXJwcmV0ZXIgd2l0aCB2ZXJzaW9uIDMgaXMgYXZhaWxhYmxlIG9uIHRoaXMgXApwbGF0Zm9ybSBhcyAncHl0aG9uMycgb3IgJ3B5dGhvbicsIG9yIGVsc2UgcmVnaXN0ZXIgYW4gYXBwcm9wcmlhdGUgXApQeXRob24gdG9vbGNoYWluIGFzIHBlciB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgcHlfcnVudGltZV9wYWlyIFwKKGh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL2JhemVsL2Jsb2IvbWFzdGVyL3Rvb2xzL3B5dGhvbi90b29sY2hhaW4uYnpsKS4KCk5vdGUgdGhhdCBwcmlvciB0byBCYXplbCAwLjI3LCB0aGVyZSB3YXMgbm8gY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIFwKaW50ZXJwcmV0ZXIncyB2ZXJzaW9uIG1hdGNoZWQgdGhlIHZlcnNpb24gZGVjbGFyZWQgYnkgdGhlIHRhcmdldCAoIzQ4MTUpLiBJZiBcCnlvdXIgYnVpbGQgd29ya2VkIHByaW9yIHRvIEJhemVsIDAuMjcsIGFuZCB5b3UncmUgc3VyZSB5b3VyIHRhcmdldHMgZG8gbm90IFwKcmVxdWlyZSBQeXRob24gMywgeW91IGNhbiBvcHQgb3V0IG9mIHRoaXMgdmVyc2lvbiBjaGVjayBieSB1c2luZyB0aGUgXApub24tc3RyaWN0IGF1dG9kZXRlY3RpbmcgdG9vbGNoYWluIGluc3RlYWQgb2YgdGhlIHN0YW5kYXJkIGF1dG9kZXRlY3RpbmcgXAp0b29sY2hhaW4uIFRoaXMgY2FuIGJlIGRvbmUgYnkgcGFzc2luZyB0aGUgZmxhZyBcClxgLS1leHRyYV90b29sY2hhaW5zPUBiYXplbF90b29scy8vdG9vbHMvcHl0aG9uOmF1dG9kZXRlY3RpbmdfdG9vbGNoYWluX25vbnN0cmljdFxgIFwKb24gdGhlIGNvbW1hbmQgbGluZSBvciBhZGRpbmcgaXQgdG8geW91ciBiYXplbHJjLiIKICBmaQpmaQoKZXhlYyAiJFBZVEhPTl9CSU4iICIkQCIKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAAbAAAAcHlwaV9fcGlwXzlfMF8zL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQCrcTRXBwUAAAcFAAAzAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vREVTQ1JJUFRJT04ucnN0cGlwCj09PQoKVGhlIGBQeVBBIHJlY29tbWVuZGVkCjxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuL2xhdGVzdC9jdXJyZW50Lz5gXwp0b29sIGZvciBpbnN0YWxsaW5nIFB5dGhvbiBwYWNrYWdlcy4KCiogYEluc3RhbGxhdGlvbiA8aHR0cHM6Ly9waXAucHlwYS5pby9lbi9zdGFibGUvaW5zdGFsbGluZy5odG1sPmBfCiogYERvY3VtZW50YXRpb24gPGh0dHBzOi8vcGlwLnB5cGEuaW8vPmBfCiogYENoYW5nZWxvZyA8aHR0cHM6Ly9waXAucHlwYS5pby9lbi9zdGFibGUvbmV3cy5odG1sPmBfCiogYEdpdGh1YiBQYWdlIDxodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXA+YF8KKiBgSXNzdWUgVHJhY2tpbmcgPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXM+YF8KKiBgVXNlciBtYWlsaW5nIGxpc3QgPGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9weXRob24tdmlydHVhbGVudj5gXwoqIGBEZXYgbWFpbGluZyBsaXN0IDxodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvcHlwYS1kZXY+YF8KKiBVc2VyIElSQzogI3B5cGEgb24gRnJlZW5vZGUuCiogRGV2IElSQzogI3B5cGEtZGV2IG9uIEZyZWVub2RlLgoKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9weXBpL3YvcGlwLnN2ZwogICA6dGFyZ2V0OiBodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpL3BpcAoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3RyYXZpcy9weXBhL3BpcC9tYXN0ZXIuc3ZnCiAgIDp0YXJnZXQ6IGh0dHA6Ly90cmF2aXMtY2kub3JnL3B5cGEvcGlwCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYXBwdmV5b3IvY2kvcHlwYS9waXAuc3ZnCiAgIDp0YXJnZXQ6IGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvcHlwYS9waXAvaGlzdG9yeQoKLi4gaW1hZ2U6OiBodHRwczovL3JlYWR0aGVkb2NzLm9yZy9wcm9qZWN0cy9waXAvYmFkZ2UvP3ZlcnNpb249c3RhYmxlCiAgIDp0YXJnZXQ6IGh0dHBzOi8vcGlwLnB5cGEuaW8vZW4vc3RhYmxlCgpDb2RlIG9mIENvbmR1Y3QKLS0tLS0tLS0tLS0tLS0tCgpFdmVyeW9uZSBpbnRlcmFjdGluZyBpbiB0aGUgcGlwIHByb2plY3QncyBjb2RlYmFzZXMsIGlzc3VlIHRyYWNrZXJzLCBjaGF0CnJvb21zLCBhbmQgbWFpbGluZyBsaXN0cyBpcyBleHBlY3RlZCB0byBmb2xsb3cgdGhlIGBQeVBBIENvZGUgb2YgQ29uZHVjdGBfLgoKLi4gX1B5UEEgQ29kZSBvZiBDb25kdWN0OiBodHRwczovL3d3dy5weXBhLmlvL2VuL2xhdGVzdC9jb2RlLW9mLWNvbmR1Y3QvCgoKUEsDBBQAAAAAAAAAIQA8UH8l+QkAAPkJAAAsAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vTUVUQURBVEFNZXRhZGF0YS1WZXJzaW9uOiAyLjAKTmFtZTogcGlwClZlcnNpb246IDkuMC4zClN1bW1hcnk6IFRoZSBQeVBBIHJlY29tbWVuZGVkIHRvb2wgZm9yIGluc3RhbGxpbmcgUHl0aG9uIHBhY2thZ2VzLgpIb21lLXBhZ2U6IGh0dHBzOi8vcGlwLnB5cGEuaW8vCkF1dGhvcjogVGhlIHBpcCBkZXZlbG9wZXJzCkF1dGhvci1lbWFpbDogcHl0aG9uLXZpcnR1YWxlbnZAZ3JvdXBzLmdvb2dsZS5jb20KTGljZW5zZTogTUlUCktleXdvcmRzOiBlYXN5X2luc3RhbGwgZGlzdHV0aWxzIHNldHVwdG9vbHMgZWdnIHZpcnR1YWxlbnYKUGxhdGZvcm06IFVOS05PV04KQ2xhc3NpZmllcjogRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZQpDbGFzc2lmaWVyOiBJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzCkNsYXNzaWZpZXI6IExpY2Vuc2UgOjogT1NJIEFwcHJvdmVkIDo6IE1JVCBMaWNlbnNlCkNsYXNzaWZpZXI6IFRvcGljIDo6IFNvZnR3YXJlIERldmVsb3BtZW50IDo6IEJ1aWxkIFRvb2xzCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjYKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy4zCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjQKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNQpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogSW1wbGVtZW50YXRpb24gOjogUHlQeQpSZXF1aXJlcy1QeXRob246ID49Mi42LCE9My4wLiosIT0zLjEuKiwhPTMuMi4qClByb3ZpZGVzLUV4dHJhOiB0ZXN0aW5nClByb3ZpZGVzLUV4dHJhOiB0ZXN0aW5nClJlcXVpcmVzLURpc3Q6IHB5dGVzdDsgZXh0cmEgPT0gJ3Rlc3RpbmcnClJlcXVpcmVzLURpc3Q6IHZpcnR1YWxlbnYgKD49MS4xMCk7IGV4dHJhID09ICd0ZXN0aW5nJwpSZXF1aXJlcy1EaXN0OiBzY3JpcHR0ZXN0ICg+PTEuMyk7IGV4dHJhID09ICd0ZXN0aW5nJwpSZXF1aXJlcy1EaXN0OiBtb2NrOyBleHRyYSA9PSAndGVzdGluZycKUmVxdWlyZXMtRGlzdDogcHJldGVuZDsgZXh0cmEgPT0gJ3Rlc3RpbmcnCgpwaXAKPT09CgpUaGUgYFB5UEEgcmVjb21tZW5kZWQKPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvZW4vbGF0ZXN0L2N1cnJlbnQvPmBfCnRvb2wgZm9yIGluc3RhbGxpbmcgUHl0aG9uIHBhY2thZ2VzLgoKKiBgSW5zdGFsbGF0aW9uIDxodHRwczovL3BpcC5weXBhLmlvL2VuL3N0YWJsZS9pbnN0YWxsaW5nLmh0bWw+YF8KKiBgRG9jdW1lbnRhdGlvbiA8aHR0cHM6Ly9waXAucHlwYS5pby8+YF8KKiBgQ2hhbmdlbG9nIDxodHRwczovL3BpcC5weXBhLmlvL2VuL3N0YWJsZS9uZXdzLmh0bWw+YF8KKiBgR2l0aHViIFBhZ2UgPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcD5gXwoqIGBJc3N1ZSBUcmFja2luZyA8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcz5gXwoqIGBVc2VyIG1haWxpbmcgbGlzdCA8aHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL3B5dGhvbi12aXJ0dWFsZW52PmBfCiogYERldiBtYWlsaW5nIGxpc3QgPGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9weXBhLWRldj5gXwoqIFVzZXIgSVJDOiAjcHlwYSBvbiBGcmVlbm9kZS4KKiBEZXYgSVJDOiAjcHlwYS1kZXYgb24gRnJlZW5vZGUuCgoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3B5cGkvdi9waXAuc3ZnCiAgIDp0YXJnZXQ6IGh0dHBzOi8vcHlwaS5weXRob24ub3JnL3B5cGkvcGlwCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vdHJhdmlzL3B5cGEvcGlwL21hc3Rlci5zdmcKICAgOnRhcmdldDogaHR0cDovL3RyYXZpcy1jaS5vcmcvcHlwYS9waXAKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9hcHB2ZXlvci9jaS9weXBhL3BpcC5zdmcKICAgOnRhcmdldDogaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vcHJvamVjdC9weXBhL3BpcC9oaXN0b3J5CgouLiBpbWFnZTo6IGh0dHBzOi8vcmVhZHRoZWRvY3Mub3JnL3Byb2plY3RzL3BpcC9iYWRnZS8/dmVyc2lvbj1zdGFibGUKICAgOnRhcmdldDogaHR0cHM6Ly9waXAucHlwYS5pby9lbi9zdGFibGUKCkNvZGUgb2YgQ29uZHVjdAotLS0tLS0tLS0tLS0tLS0KCkV2ZXJ5b25lIGludGVyYWN0aW5nIGluIHRoZSBwaXAgcHJvamVjdCdzIGNvZGViYXNlcywgaXNzdWUgdHJhY2tlcnMsIGNoYXQKcm9vbXMsIGFuZCBtYWlsaW5nIGxpc3RzIGlzIGV4cGVjdGVkIHRvIGZvbGxvdyB0aGUgYFB5UEEgQ29kZSBvZiBDb25kdWN0YF8uCgouLiBfUHlQQSBDb2RlIG9mIENvbmR1Y3Q6IGh0dHBzOi8vd3d3LnB5cGEuaW8vZW4vbGF0ZXN0L2NvZGUtb2YtY29uZHVjdC8KCgpQSwMEFAAAAAAAAAAhAFf+I+WYYgAAmGIAACoAAABweXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9SRUNPUkRwaXAvX19pbml0X18ucHksc2hhMjU2PWF4dklqV19NZ2htR2I5VlFFYlJma3lzMWE1aktHc3l5WjBkZjBNLWJlUFUsMTE5NTYNCnBpcC9fX21haW5fXy5weSxzaGEyNTY9VjZLaC1JRURFRnB0MWNhaFJFNk1halVGXzE0cUpSX1Fzdm40TWpXWlh6RSw1ODQNCnBpcC9iYXNlY29tbWFuZC5weSxzaGEyNTY9VFRsbVplc1E0VnV4Y3RvMktxd1pHbWdtTjVpb0hFbF9EZUZldjlpZV9TQSwxMTkxMA0KcGlwL2Jhc2VwYXJzZXIucHksc2hhMjU2PUFLTU9lRjNmVHJScm9pdjBEbVRRYmRpTFcwRFF1eDJLcUdDX2RKSkI5ZDAsMTA0NjUNCnBpcC9jbWRvcHRpb25zLnB5LHNoYTI1Nj04SkNjRjJrS0FGMmNGblY3N29XLTNEc0hKaWZyOWpGMld1Q2h6endnY3dnLDE2NDc0DQpwaXAvZG93bmxvYWQucHksc2hhMjU2PV9WSmFOR3NkYXdPTmQ5c2hhc2w3TXhOelRvOGcwRUFDbjJnYTZHUmpNNW8sMzIxNTMNCnBpcC9leGNlcHRpb25zLnB5LHNoYTI1Nj1CdnFILUp3M3RQMmItMklKMmtqclFlbU9BUE1xS3JRTUxSSVpIWlFwSlhrLDgxMjENCnBpcC9pbmRleC5weSxzaGEyNTY9TDZVaHRBRVpjMnF3N0JxZlFya1BRY3cyZ0NnRXczR3VrTFJTQTk1Qk55SSwzOTk1MA0KcGlwL2xvY2F0aW9ucy5weSxzaGEyNTY9OXJKUmxnb25DNlFDMnpHREluXzdtWGFvWjlfdEZfSUhNMkJRaFdWUmdibyw1NjI2DQpwaXAvcGVwNDI1dGFncy5weSxzaGEyNTY9cTNrZWM0ZjZOSHN6dUdZSWhHSWJWdnM4OTZEMDZ1SkFuS0ZnSl93Y2U0NCwxMDk4MA0KcGlwL3N0YXR1c19jb2Rlcy5weSxzaGEyNTY9RjZ1REc2R2o3Uk5LUUpVRG5kODdRS3FJMTZVcy10LUIwd1BGXzRRTXBXYywxNTYNCnBpcC93aGVlbC5weSxzaGEyNTY9UVNXbUdzMnVpLW40VU1XbTBKVVk2YU1DY3dOS3VuZ1Z6YldzeEk5S2xKUSwzMjAxMA0KcGlwL192ZW5kb3IvX19pbml0X18ucHksc2hhMjU2PVdhYVNKM3JvU1NKX1V2NHlLQXhsR29oS0VIOVlVQTNhSWgxWGcySWpmZ1UsNDY3MA0KcGlwL192ZW5kb3IvYXBwZGlycy5weSxzaGEyNTY9LTlVT0laeTYyYWhDUVZZOS1iN05uNl81XzRZNm9vSG52NzJ0TThpSGk5WSwyMjM2OA0KcGlwL192ZW5kb3IvZGlzdHJvLnB5LHNoYTI1Nj1BNERvdXc5cGNxZFl4RFRwNWItT1IwMmZ4VlhuZldzLXdDMXdBODlyaFJrLDM4MzQ5DQpwaXAvX3ZlbmRvci9pcGFkZHJlc3MucHksc2hhMjU2PXdpbWJxY0U3cnd3RVRsdWNuOEFfNFFkXy1OS1hQT0JjTnhKSGFyVW9YbmcsODAxNzYNCnBpcC9fdmVuZG9yL29yZGVyZWRkaWN0LnB5LHNoYTI1Nj00S3NGdWM2VjhJZ0hST0NIVXUtNHZDcnIyMVpQUGVhN1owY3ZYOUFqUTd3LDQwOTQNCnBpcC9fdmVuZG9yL3B5cGFyc2luZy5weSxzaGEyNTY9N3ZBdVVWYmg2dHhVS1FSMkl6SjhfOURLbUQ1dnRtNU1Ec3NXa0kwa2E4bywyMjQxNzENCnBpcC9fdmVuZG9yL3JlLXZlbmRvci5weSxzaGEyNTY9UGNkWjQwZDBvaE1zZEptQTR0MEFlQVdiUFhpMXRGc3ZBd0E1S0U1RkdlWSw3NzMNCnBpcC9fdmVuZG9yL3JldHJ5aW5nLnB5LHNoYTI1Nj1rM2ZmbGY1X01tMFhjSUpZaEI3VGozNGJxQ0NQaFVEa1lieDFOdlcyRlBFLDk5NzINCnBpcC9fdmVuZG9yL3NpeC5weSxzaGEyNTY9QTZoZEpaVmpJM3RfZ2VlYlo5QnpVdndScklYbzBsZnd6UWxNMkxjS3lhcywzMDA5OA0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL19faW5pdF9fLnB5LHNoYTI1Nj1VUHlGbHowZElqeHVzdTVJVGlnOVVERkpkU1k1TFR3aWpobGRuMEFmeXpVLDMwMg0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL19jbWQucHksc2hhMjU2PU1QeFpmWmQyTEtEelZyczU1WDN3QTFyc0kyWXVQOGV2TFpTd1FqMGRJazAsMTMyMA0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2FkYXB0ZXIucHksc2hhMjU2PVJhR1l5UkEtUkExSjBBbkU2N0d6RVlGUEJ1NFlINEVRVXZRcVRLYTU3aU0sNDYwOA0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlLnB5LHNoYTI1Nj14dGwtVi1wcjlLU3Q5VnZGRFJDQjl5ckhQRXZxdmJrLTVNMXZBSW5aYjVrLDc5MA0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NvbXBhdC5weSxzaGEyNTY9Mk1UT3lJMUpsR19nSnBmdXkzLVVRUWxLTVJpSmltUi1YWEIwc3I0NHdqMCwzODANCnBpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jb250cm9sbGVyLnB5LHNoYTI1Nj1lbERzTGNhWUExNW5jb2RSbUhuV1FwNmVrVV9vY0VHdERlR0xic25UanpvLDEzMDI0DQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvZmlsZXdyYXBwZXIucHksc2hhMjU2PV9LOGNTdG1YcUQzM20xNVBmc1E4cmxwbzZGZlhqVmJLbWp2TFh5SUNSZ0ksMjUzMQ0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2hldXJpc3RpY3MucHksc2hhMjU2PVd0SnJWc3lXanBQOVdvVWlEVmRUWlpSTkJDejVaVnB0YVFwWW5xb2ZEUVUsNDE0MQ0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL3NlcmlhbGl6ZS5weSxzaGEyNTY9WE02ZWxHOURTTmV4d2FPQ2dNalV0ZnJISFc1TkFCNlRTYklmM3gyMzV4cyw2NTM2DQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvd3JhcHBlci5weSxzaGEyNTY9S3F5dV8zVFdfNTRYRHVkaGE0LUhGMjF2eUVPQUo0Wm5SWEZ5c1RpTG1YQSw0OTgNCnBpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jYWNoZXMvX19pbml0X18ucHksc2hhMjU2PXVXblV0eU12SFlfTFVMYUxfNF9JUjFGX3hQZ0s1ekhmSnlSbkJxNERuUEUsMzY5DQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY2FjaGVzL2ZpbGVfY2FjaGUucHksc2hhMjU2PUZzRHVnM2J3VUFRM29rampmR3p4bERhQmYyZndWU24xaUJLTVRMNlN5R1UsMzUzMg0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlcy9yZWRpc19jYWNoZS5weSxzaGEyNTY9WHl3cXhrUzlNa0NhZmxUT1lfd2pyRTAybmVLZHl3QjlZd2xPQmJQN1l3Yyw5NzMNCnBpcC9fdmVuZG9yL2NlcnRpZmkvX19pbml0X18ucHksc2hhMjU2PVFTUnkxVXp0RS1pMDlJdUdJS0t1YzE5MGswN2x0Nmt0YWJiZWxQTUlab2MsNjMNCnBpcC9fdmVuZG9yL2NlcnRpZmkvX19tYWluX18ucHksc2hhMjU2PUZpT1l0MUZsdHN0N3drOURSYTZHQ29CcjhxQlV4bE5RdV9NS0pmMDRFNnMsNDENCnBpcC9fdmVuZG9yL2NlcnRpZmkvY2FjZXJ0LnBlbSxzaGEyNTY9N0NFWGZMSHhEd3ZEcHdWdTB5XzJsZkpZazYzY1UtS1VLSV9ETDFMcThVbywyNzEwODgNCnBpcC9fdmVuZG9yL2NlcnRpZmkvY29yZS5weSxzaGEyNTY9eFBRRGRHX3NpeTVBN0JmcUdXYTdSSmhjQTYxeFhFcVBpU3J3OUdOeWhIRSw4MzYNCnBpcC9fdmVuZG9yL2NoYXJkZXQvX19pbml0X18ucHksc2hhMjU2PVlzUDV3UWxzSEoyYXVGMVJaSmZ5cGlTckNBN19iUWlSbTNFU19OSTc2LVksMTU1OQ0KcGlwL192ZW5kb3IvY2hhcmRldC9iaWc1ZnJlcS5weSxzaGEyNTY9RF96SzVHeXpvVnNSZXMwSGtMSnppbHRGUVgwYktDTE9yRmU5X3hEdk9fOCwzMTI1NA0KcGlwL192ZW5kb3IvY2hhcmRldC9iaWc1cHJvYmVyLnB5LHNoYTI1Nj1rQnhIYmRldEJwUGU3eHJsYi1lOTkwaW90NjRnX2VHU0xkMzJsQjdfaDNNLDE3NTcNCnBpcC9fdmVuZG9yL2NoYXJkZXQvY2hhcmRpc3RyaWJ1dGlvbi5weSxzaGEyNTY9M3dvV1M2MktyR29vS3lxejR6UVNuakZiSnBhNlY3ZzAyZGFBaWJUd2NsOCw5NDExDQpwaXAvX3ZlbmRvci9jaGFyZGV0L2NoYXJzZXRncm91cHByb2Jlci5weSxzaGEyNTY9NmJEdThZSWlSdVNjWDRjYTlJZ2IwVTY5VEEyUEdYWERlajZDYzRfOWtPNCwzNzg3DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2NoYXJzZXRwcm9iZXIucHksc2hhMjU2PUtTbXdKRXJqeXB5ajBiUlptQzVGNWVNN2M4WVFnTFlJalpYaW50Wk5zdGcsNTExMA0KcGlwL192ZW5kb3IvY2hhcmRldC9jb2RpbmdzdGF0ZW1hY2hpbmUucHksc2hhMjU2PVZZcF82Y3l5a2k1c0hnWERTWm5YVzRxMW9lbEhjM2N1OUF5UVRYN3V1ZzgsMzU5MA0KcGlwL192ZW5kb3IvY2hhcmRldC9jb21wYXQucHksc2hhMjU2PVBLVHpIa1NidGJIRHFTOVB5dWpNYlg3NHExYThtTXBlUVREVnNRaFpNUncsMTEzNA0KcGlwL192ZW5kb3IvY2hhcmRldC9jcDk0OXByb2Jlci5weSxzaGEyNTY9VFo0MzRRWDh6ekJzblV2TF84d200QVFWVFoyWmtxRUVRTF9sTnc5ZjlvdywxODU1DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2VudW1zLnB5LHNoYTI1Nj1BaW13ZGI5YXMxZEpLWmFGTlVIMk9oV0lWQlZkNlprSkpfV0s1c05ZOGNVLDE2NjENCnBpcC9fdmVuZG9yL2NoYXJkZXQvZXNjcHJvYmVyLnB5LHNoYTI1Nj1ra3lxVmcxWXczRElPQU1KMmJkbHlRZ1VGUWh1SEFXOGRVR3NrVG9OV1NjLDM5NTANCnBpcC9fdmVuZG9yL2NoYXJkZXQvZXNjc20ucHksc2hhMjU2PVJ1WGxnTnZUSURhcm5kdmxsTkNrNVdaQklwZEN4UTBrY2Q5RUF1eFVoODQsMTA1MTANCnBpcC9fdmVuZG9yL2NoYXJkZXQvZXVjanBwcm9iZXIucHksc2hhMjU2PWlEOEpkcDBJU1JqZ2ppVk43ZjBlOHhHZVFKNUdNMm9lWjFkQThuYlNlVXcsMzc0OQ0KcGlwL192ZW5kb3IvY2hhcmRldC9ldWNrcmZyZXEucHksc2hhMjU2PS03R2RtdmdXZXo0LWVPNFN1WHBhN3RCaURpNXZSWFE4V3ZkRkF6VmFTZm8sMTM1NDYNCnBpcC9fdmVuZG9yL2NoYXJkZXQvZXVja3Jwcm9iZXIucHksc2hhMjU2PU1xRk1UUVh4VzRIYnpJcFo5bEtESEIzR044U1A0eWlIZW5UbWY4Z19QeFksMTc0OA0KcGlwL192ZW5kb3IvY2hhcmRldC9ldWN0d2ZyZXEucHksc2hhMjU2PU5vMVd5ZHVGT2dCNVZJVFVBN1BMeUM1b0pSTnpSeU1iQnhhS0kxbDE2TUEsMzE2MjENCnBpcC9fdmVuZG9yL2NoYXJkZXQvZXVjdHdwcm9iZXIucHksc2hhMjU2PTEzcDZFUDR5UmF4cW5QNGlIdHhIT0o2UjJ6eEhxMV9tOGhUUmp6Vlo5NWMsMTc0Nw0KcGlwL192ZW5kb3IvY2hhcmRldC9nYjIzMTJmcmVxLnB5LHNoYTI1Nj1KWDhsc3dlS0xtbkN3bWs4VUhFUXNMZ2tyX3JQX2tFYnZpdkM0cVBPcmxjLDIwNzE1DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2diMjMxMnByb2Jlci5weSxzaGEyNTY9Z0d2SVdpOVdoRGpFLXhRWEh2Tkl5cm5MdkViTUFZZ3lVU1o2NUhVZnlsdywxNzU0DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2hlYnJld3Byb2Jlci5weSxzaGEyNTY9YzNTWi1LN2h2eXpHWTZKUkFaeEpnd0pfc1VTOWswV1lrdk1ZMDBZQllGbywxMzgzOA0KcGlwL192ZW5kb3IvY2hhcmRldC9qaXNmcmVxLnB5LHNoYTI1Nj12cG1KdjJCdTBKOGduTVZSUEhNRmVmVFJ2b19oYTFtcnlMaWc4Q0J3Z09nLDI1Nzc3DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2pwY250eC5weSxzaGEyNTY9UFlsTnFSVVFUOExNM2NUNUZtSEdQMGlpc2NGbFRXRUQ5Mk1BTHZCdW5nbywxOTY0Mw0KcGlwL192ZW5kb3IvY2hhcmRldC9sYW5nYnVsZ2FyaWFubW9kZWwucHksc2hhMjU2PTFIcVFTOVBidG5qMXhRZ3hpdEpNdnc4WDZrS3I1T29ja05DWldmRVFyUEUsMTI4MzkNCnBpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2N5cmlsbGljbW9kZWwucHksc2hhMjU2PUxPRGFqdnNldEg4N3lZRERRS0EyQ1VMWFVIODd0STIyM2RoZmpoOVp4OWMsMTc5NDgNCnBpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2dyZWVrbW9kZWwucHksc2hhMjU2PThZQVc3YlU4WXdTSmFwMGtJSlNiUE13MUJFcXpHald6cWNxZjBXZ1VLQUEsMTI2ODgNCnBpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2hlYnJld21vZGVsLnB5LHNoYTI1Nj1KU25xbUU1RTYydERMVFBUdkxwUXNnNWdPTU80UGJkV1J2VjdBdmtjMEhBLDExMzQ1DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdodW5nYXJpYW5tb2RlbC5weSxzaGEyNTY9UmhhcFlTRzVsMFphTy1WVjRGYW41c1cwV1JHUXFod0JNNjF5eDN5eHlPQSwxMjU5Mg0KcGlwL192ZW5kb3IvY2hhcmRldC9sYW5ndGhhaW1vZGVsLnB5LHNoYTI1Nj04bDAxNzNHdV9XNkc4bXhtUU9URUY0bHMyWWRFN0Z4V2YzUWtTeEVHWEpRLDExMjkwDQpwaXAvX3ZlbmRvci9jaGFyZGV0L2xhbmd0dXJraXNobW9kZWwucHksc2hhMjU2PVcyMmVSTkpzcUk2dVdBZndYU0tWV1duQ2VyWXFySThkWlFUbV9NMGxSRmssMTExMDINCnBpcC9fdmVuZG9yL2NoYXJkZXQvbGF0aW4xcHJvYmVyLnB5LHNoYTI1Nj1TMklvT1JoRmszOUZFRk9sU0ZXdGdWeWJSaVA2aDdCbExsZEhWY2xOa1U4LDUzNzANCnBpcC9fdmVuZG9yL2NoYXJkZXQvbWJjaGFyc2V0cHJvYmVyLnB5LHNoYTI1Nj1BUjk1ZUZIOXZ1cVNmdkxRWk4tTDVpamVhMjVOT0JDb1hxdzhzNU85eExRLDM0MTMNCnBpcC9fdmVuZG9yL2NoYXJkZXQvbWJjc2dyb3VwcHJvYmVyLnB5LHNoYTI1Nj1oNlRSbm5ZcTJPeEcxV2RENUpPeXhjZFZwbjdkRzBxLXZCOG5XcjVtYmg0LDIwMTINCnBpcC9fdmVuZG9yL2NoYXJkZXQvbWJjc3NtLnB5LHNoYTI1Nj1TWTMyd1ZJRjNIemNqWTNCYUVzcHk5bWV0Yk5TS3hJSUIwUktQbjd0anBJLDI1NDgxDQpwaXAvX3ZlbmRvci9jaGFyZGV0L3NiY2hhcnNldHByb2Jlci5weSxzaGEyNTY9TERTcENsZERDRmxZd1VrR2t3RDJvRnhMbFBXSVdYVDA5YWtIXzJQaVk3NCw1NjU3DQpwaXAvX3ZlbmRvci9jaGFyZGV0L3NiY3Nncm91cHByb2Jlci5weSxzaGEyNTY9MUlwcmNDQl9rMXFmbW54R0M2TUJieEVMbEtxRDNzY1c2UzhZSXdkZXlYQSwzNTQ2DQpwaXAvX3ZlbmRvci9jaGFyZGV0L3NqaXNwcm9iZXIucHksc2hhMjU2PUlJdC1sWmowV0pxSzRybVVaektaUDRHSmxFOEtVRXRGWVZ1WTk2ZWs1TVEsMzc3NA0KcGlwL192ZW5kb3IvY2hhcmRldC91bml2ZXJzYWxkZXRlY3Rvci5weSxzaGEyNTY9cUwwMTc0bFNaRTQ0MmVCMjFubmt0VDlfVmNBeWUwN2xhRldVZVVyanR0WSwxMjQ4NQ0KcGlwL192ZW5kb3IvY2hhcmRldC91dGY4cHJvYmVyLnB5LHNoYTI1Nj1JZEQ4djN6V09zQjhPTGl5UGkteV9mcXdpcFJGeFY5TmMxZUtCTFN1SUV3LDI3NjYNCnBpcC9fdmVuZG9yL2NoYXJkZXQvdmVyc2lvbi5weSxzaGEyNTY9c3AzQjA4bXJEWEItcGYzSzlmcUpfemVESE9DTEM4UnJuZ1F5REZhcF83ZywyNDINCnBpcC9fdmVuZG9yL2NoYXJkZXQvY2xpL19faW5pdF9fLnB5LHNoYTI1Nj1BYnBIR2NnTGIta1JzSkdud0ZFa3RrN3V6cFpPQ2NCWTc0LVlCZHJLVkdzLDENCnBpcC9fdmVuZG9yL2NoYXJkZXQvY2xpL2NoYXJkZXRlY3QucHksc2hhMjU2PVlCTzhMNG1YbzBXUjZfLUZqaF84UXhQQm9FQk5xQjlvTnhOcmRjNTRBUXMsMjczOA0KcGlwL192ZW5kb3IvY29sb3JhbWEvX19pbml0X18ucHksc2hhMjU2PTl4QnlyVHZrOXVwa0w1TkdWNUl0MkVqZTQta3pOTHdhXzFsR1BXcFhvTlUsMjQwDQpwaXAvX3ZlbmRvci9jb2xvcmFtYS9hbnNpLnB5LHNoYTI1Nj1GaTB1bi1RTHFSbS12N29fbktpT3F5QzhQYXBCSks3RExWX3E5TEt0VE8wLDI1MjQNCnBpcC9fdmVuZG9yL2NvbG9yYW1hL2Fuc2l0b3dpbjMyLnB5LHNoYTI1Nj1nSlpCMzVMYmRqYXR5a2QyenJVVW5va016a3ZjRmdzY3luX3ROeHhNRkhBLDk2NjgNCnBpcC9fdmVuZG9yL2NvbG9yYW1hL2luaXRpYWxpc2UucHksc2hhMjU2PWNIcVZKdGI4Mk9HN0hVQ3h2UTJqb0c3Tl9Db3hiSUtiSV9mZ3J5WmtqMjAsMTkxNw0KcGlwL192ZW5kb3IvY29sb3JhbWEvd2luMzIucHksc2hhMjU2PV9TQ0VvVEtfR0EydFUxbmhiYXlLS2FjLXY5Sm45OGxDUElGT2VGTUdDSFEsNTM2NQ0KcGlwL192ZW5kb3IvY29sb3JhbWEvd2ludGVybS5weSxzaGEyNTY9VjdVN29qd0cxcTRuNlBLcmlwakV2V19odFlRaTV1ZVhTTTNMVVVvcXFEWSw2MjkwDQpwaXAvX3ZlbmRvci9kaXN0bGliL19faW5pdF9fLnB5LHNoYTI1Nj0tYVVlTk5DZmlJR18xVHFmMTlCSDB4TE51QktHWDFJN2xOaGNMWWdGVUVBLDU4MQ0KcGlwL192ZW5kb3IvZGlzdGxpYi9jb21wYXQucHksc2hhMjU2PUZ6S2xQOWROVU1ILWpfMUxDVm5qZ3g2S2dVYnBuUmpUallrVGtEWVJQbEksNDA4MDENCnBpcC9fdmVuZG9yL2Rpc3RsaWIvZGF0YWJhc2UucHksc2hhMjU2PWpuaUptWWswTWoydDZnWllibm42OFR2UXduVlowa1h5ZXVmXzNBeEZjbGssNDk2NzINCnBpcC9fdmVuZG9yL2Rpc3RsaWIvaW5kZXgucHksc2hhMjU2PUN3OGd4RnFfN3hYdmRnRXhMM2VmakxBWTNFQVBETVNMM1ZBNDJSa2JRQnMsMjEwODUNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvbG9jYXRvcnMucHksc2hhMjU2PWhEX0htM2FTTDlEa2xZOUN4eWN0Mm5fNzRnWjB4TkZGR0I1TDdNNmRzMTQsNTEwMTMNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvbWFuaWZlc3QucHksc2hhMjU2PTNxRXVaaEhsRGJ2eVlaMUJaYmRhcERBaXZnTWdVd1dwWjAwY21YcWNuMTgsMTQ4MTANCnBpcC9fdmVuZG9yL2Rpc3RsaWIvbWFya2Vycy5weSxzaGEyNTY9aVJyVld3cHlWd2prS0pTWDhORVE5Ml9NUk13cFJPY2ZOR0tDRC1DaDFRTSw2MjgyDQpwaXAvX3ZlbmRvci9kaXN0bGliL21ldGFkYXRhLnB5LHNoYTI1Nj1oVXNmN1FoMkFlNENDa0wzM3FLOHBwd0M4WlR6VDdlcDZIajlSS3BpaktVLDM4ODMzDQpwaXAvX3ZlbmRvci9kaXN0bGliL3Jlc291cmNlcy5weSxzaGEyNTY9VkZCVmJGcUxWcURCU1FEWGNGUUhyWDFLRWN1b0R4VEs2OTlZZGlfYmV5YywxMDc2Ng0KcGlwL192ZW5kb3IvZGlzdGxpYi9zY3JpcHRzLnB5LHNoYTI1Nj14cGVoTmZJU0dQVE54UVp1MDJLOVJ3MlFiTnhfMlE0ZW1lUHYzVzVYMGl3LDE1MjI0DQpwaXAvX3ZlbmRvci9kaXN0bGliL3QzMi5leGUsc2hhMjU2PWNwMFVBVUREcjF0R0F4OGFkbEt4V2JDSElhLW9CM2J4ZXY1ell6Z0FyOEUsODkwODgNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvdDY0LmV4ZSxzaGEyNTY9RmlsakRQY1g5cXZvZTlGWUVfOXBORUhxYnFNbmhjQ091SV9vTEo0RjlGOCw5Nzc5Mg0KcGlwL192ZW5kb3IvZGlzdGxpYi91dGlsLnB5LHNoYTI1Nj1FMndVLVJaU2hQTUZVTUpyOWtQbWVtVFVMaW5NNHFEem9zTlBpaEN1S0UwLDUyOTkxDQpwaXAvX3ZlbmRvci9kaXN0bGliL3ZlcnNpb24ucHksc2hhMjU2PUNnZ2hPVXlseEdEN2RFQTJTM012V2p4N21ZXzJiV3NsdUYwT2YzWXhsNFksMjM3MTENCnBpcC9fdmVuZG9yL2Rpc3RsaWIvdzMyLmV4ZSxzaGEyNTY9TEl0ckJKZXNFcXQyUVRRdUIteWhhMlliTWVnVVJIbUhtZFN4aGpCcW1uYyw4NTUwNA0KcGlwL192ZW5kb3IvZGlzdGxpYi93NjQuZXhlLHNoYTI1Nj1uX1Bpb0JDN2x0ejdzQWsxV0xiTHpaSmdTNFIyYXhTeV8wSFBmOFpDc0VnLDk0MjA4DQpwaXAvX3ZlbmRvci9kaXN0bGliL3doZWVsLnB5LHNoYTI1Nj1VUDUzY0t4T001cjdiSFNTLW41cHJGNmh3SkVWc01XOVpOSnV0T3VDMjZjLDM5MTE1DQpwaXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9fX2luaXRfXy5weSxzaGEyNTY9YnFTX2RUT0g2dVc5aUdnZDB1emZwUGpvNnZaNHhwUFo3a3lmWkoydk5hdywyNzQNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L21pc2MucHksc2hhMjU2PUtXZWNJTmRiRk5PeFNPUDFmR0Y2ODBDSm5hQzZTNGZCUmdFdGFZVHcwaWcsOTcxDQpwaXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9zaHV0aWwucHksc2hhMjU2PVZXMXQzdVlxVWpXWkg3alYtNlFpaW1MaG5sZG9WNXVJcEg0RXVpVDFqZncsMjU2NDcNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L3N5c2NvbmZpZy5jZmcsc2hhMjU2PXN3Wkt4cTlSWTVlOXIzUFhDcmx2UVBNc3ZPZGlXWkJUSExFYnFTOExKTFUsMjYxNw0KcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvc3lzY29uZmlnLnB5LHNoYTI1Nj1lU0V5Smc3anhGX2VIbEhHOElPdGw5M2tiMDdVb01JUnAxd1lzUGVHaTlrLDI2OTU1DQpwaXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC90YXJmaWxlLnB5LHNoYTI1Nj1JaHA3clhSY2piSUt3OENPbTl3U2VQVjlBUkdYYlNGOWdHWEFNbjJRLUtVLDkyNjI4DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9fX2luaXRfXy5weSxzaGEyNTY9SnNJd21GbGRrLTlyYUJhZFBTVFM3NEpyZm1Kdm96Yy0zYWVrTWk3SHI5cyw3ODANCnBpcC9fdmVuZG9yL2h0bWw1bGliL19paGF0ZXhtbC5weSxzaGEyNTY9dHpYeWdZbWlzVW1pRVV0MnY3RTFBYjUwQUtRc3JELVNnbFBSblk3NXZNRSwxNjcwNQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvX2lucHV0c3RyZWFtLnB5LHNoYTI1Nj1DNGxYNWdVQndlYk9XeTQxaFlQMlpCcGtQVk52eGtfaFpCbTNPVnlQWk00LDMyNTMyDQpwaXAvX3ZlbmRvci9odG1sNWxpYi9fdG9rZW5pemVyLnB5LHNoYTI1Nj1ZQWFPRUJENnFjNUlTcTlYdDlOaWYxT0ZnY3liVFRmTWR3cUJrWmhwQXE0LDc2NTgwDQpwaXAvX3ZlbmRvci9odG1sNWxpYi9fdXRpbHMucHksc2hhMjU2PWJTNlRIVmxMOFp5VGNJNkNJeGlNNnh4dUhzRThpMWo1T2dkM0hhMUc4NFUsNDA5Ng0KcGlwL192ZW5kb3IvaHRtbDVsaWIvY29uc3RhbnRzLnB5LHNoYTI1Nj1EZmMxRnYzXzlmcmt0Z1dqZzR0YmotQ2pNTXAwMktvOXFNZTRpbDFCVmRvLDgzMzg3DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9odG1sNXBhcnNlci5weSxzaGEyNTY9RG1sdTlobHE1d19pZDZtQlp5WV9zRTVMdWtJQUNndkc0a3BnSXNkZWQ4USwxMTcxNzANCnBpcC9fdmVuZG9yL2h0bWw1bGliL3NlcmlhbGl6ZXIucHksc2hhMjU2PVVycnNhMGNQUExxTlgtVWJKV1MyZ1Voc18wNnFWYk54WnZVbnJtR1pLNkUsMTQxNzcNCnBpcC9fdmVuZG9yL2h0bWw1bGliL190cmllL19faW5pdF9fLnB5LHNoYTI1Nj04VlIxYmNnRDJPcGVTMlhFeHB1NXlCaFBfUTFLLWx3S2JCS0lDQlBmMWtVLDI4OQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvX2Jhc2UucHksc2hhMjU2PTZQX0FjSW9HanR3QjJxQWxoVjhINFZQLXp0UXhvWEZHd3Q0TnlNcUdfS3csOTc5DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9kYXRyaWUucHksc2hhMjU2PUVRcHFTZmtaUnVUYkUtRHVoVzd4TWRWRHhkWk5aMENmbW5ZZkhBXzN6eE0sMTE3OA0KcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvcHkucHksc2hhMjU2PXdYbVFMclpSZjRNeVdOeWcwbTNoODFtOUluaExSN0dKMDAybUlJWmgtOG8sMTc3NQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9fX2luaXRfXy5weSxzaGEyNTY9NDdERVFwajhIQlNhLV9USW1XLTVKQ2V1UWVSa201Tk1wSldaRzNoU3VGVSwwDQpwaXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2FscGhhYmV0aWNhbGF0dHJpYnV0ZXMucHksc2hhMjU2PURYdi1QMnZkUTVGM09UV002UVo2S2h5RGxBV205MHBiZnJEMUJrOURfbDAsNjIxDQpwaXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2Jhc2UucHksc2hhMjU2PXotSVU5WkFZanBzVnNxbVZ0N2t1V0M2M2pSMTFoRE1yNkNWcnZ1YW84VzAsMjg2DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2luamVjdF9tZXRhX2NoYXJzZXQucHksc2hhMjU2PTJRX0puTXNjbl90TmJWX3FwZ1lOXzVNM1BuQkdmbXV2RUNNS0RFeEhVY1ksMjc0Mg0KcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9saW50LnB5LHNoYTI1Nj1xZjVjTHJUNnhYZDhWN0dIMVJfM2xLeElqdUpTZnBiV1RwU3dhZ2xZZER3LDMzNjUNCnBpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvb3B0aW9uYWx0YWdzLnB5LHNoYTI1Nj1FSGlnNGtNLVFpTGp1eFZKM0ZBQUZOeS0xMGs0YVY2SEpiUXpIS1pfM3U4LDEwNTM0DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL3Nhbml0aXplci5weSxzaGEyNTY9N1BxSnJobTZtbzNKdmFIazJJUVc3aTc0T3I3UXRkLUZWOFVmdEpJeUR5cywyNTExMg0KcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy93aGl0ZXNwYWNlLnB5LHNoYTI1Nj1LUHQwNjduWVRxcWk4S0xUQ2x5eW5uNGVWek5EQ18tTUFwWE5WSFJYVlgwLDExMzkNCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVhZGFwdGVycy9fX2luaXRfXy5weSxzaGEyNTY9bDNMY3FNU0V5b2g5OUpoX2VXakdleEhuSXZLaExBWG9QLUxEejg4d2h1TSwyMDgNCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVhZGFwdGVycy9nZW5zaGkucHksc2hhMjU2PTZWSXVIRE5vRXh2MUpXdjNlUGo2VjVDTS10Y3lpVVNXZTVfSGQyZWpid1ksMTU1NQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWFkYXB0ZXJzL3NheC5weSxzaGEyNTY9M29mNHZ2YVVZSUFpYzdwbmdlYndKVjI0aHBPUzdaZzlnZ0phX1dRZWd5NCwxNjYxDQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvX19pbml0X18ucHksc2hhMjU2PVVsQjRvcmtUZ1poRklLUWRYcnRpV245Y3BLU3N1aG5PUU9JSGVEMEZ2NGssMzQwNg0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2Jhc2UucHksc2hhMjU2PTR2ZGptX1oyZl9HVFFCd0tuV2xyelZjY3RUYi1LNXNmTjhwWERhV09EaUEsMTM5NDINCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9kb20ucHksc2hhMjU2PVNZM01zaWpYeXpkTlBjOGFLNUlRc3VwQm9NOEo2N3k1NkRnTnRHdnNiOWcsODgzNQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2V0cmVlLnB5LHNoYTI1Nj1hcUlCT0dqX2RGWXFCVVJJY1RlZ0dOQmhBSUpPdzVpRkRIYjRqcmtZSC04LDEyNzY0DQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvZXRyZWVfbHhtbC5weSxzaGEyNTY9Q0Vnd0hNSVFadklERkFxY3Q0a3FQa1Z0eUtJbTllZkhGcV9WZUV4RVBDQSwxNDE2MQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvX19pbml0X18ucHksc2hhMjU2PUNGcFVPQ2ZMdWhBZ1ZKOE5Zazl3dmlDdTFraFludjdYUlN0dnl6VTFGd3MsNTU0NA0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvYmFzZS5weSxzaGEyNTY9ZWktMmNGYk5GZDBnUmp5YUZteG54WkdMTklENG8wYkhGQ0g5Yk15WjVCayw0OTM5DQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9kb20ucHksc2hhMjU2PUVIeUZSOEQ4bFlObnlEVTlseF9JS2lnVkpSeWVjVUd1YTBtT2k3SEJ1a2MsMTQxMw0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvZXRyZWUucHksc2hhMjU2PThqVkxFWTJGamdONFJGdWd3aEFoNDRsOVNjVllvRFN0UUZDbmxQd3ZhZkksNDY4NA0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvZXRyZWVfbHhtbC5weSxzaGEyNTY9c1k2d2ZSc2hXVGxsdTZuNDhUUFdwS3NRUlBwLTBDUXJUMGhqX0FkekhTVSw2MzA5DQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9nZW5zaGkucHksc2hhMjU2PTREMlBFQ1o1bjNaTjNxdTNqTWw5eVk3Qjgxam5RQXBCUVNWbGZhSXVZYkEsMjMwOQ0KcGlwL192ZW5kb3IvaWRuYS9fX2luaXRfXy5weSxzaGEyNTY9OU50N3hweWV0M0RtT3JQVUdvb0RkQXdtSFpadTFxVUF5MkVhSjkza0dpUSw1OA0KcGlwL192ZW5kb3IvaWRuYS9jb2RlYy5weSxzaGEyNTY9bHZZYjd5dTdQaEFxRmFBSUFkV2N3Z2FXSTJVbWdzZVV1YS0xYzBBc0cwQSwzMjk5DQpwaXAvX3ZlbmRvci9pZG5hL2NvbXBhdC5weSxzaGEyNTY9Ui1oMjlELTZtcm5KemJYeHltcldVVzdpWlV2eS0yNlRRd1owaWo1N2k0VSwyMzINCnBpcC9fdmVuZG9yL2lkbmEvY29yZS5weSxzaGEyNTY9R2FmaVdkWVFJSzVUU2pXZFJ6Q1lDaG83MDRBTHRNQ3JWX2RuWFhuNTdVMCwxMTM5MA0KcGlwL192ZW5kb3IvaWRuYS9pZG5hZGF0YS5weSxzaGEyNTY9LUNnODNsdXJLb0E5cDdsYjBsTUFzb3MwckZ6MWRuS3JHZUJFM284VXVDQSwzMjk5OQ0KcGlwL192ZW5kb3IvaWRuYS9pbnRyYW5nZXMucHksc2hhMjU2PVRZMWxweFpJUVdFUDZ0TnFqWmtGQTVoZ29NV09qMU9CbW5VRzhpaFQ4N0UsMTc0OQ0KcGlwL192ZW5kb3IvaWRuYS9wYWNrYWdlX2RhdGEucHksc2hhMjU2PUtNU1VUU19NN1paN1VnbF9WX0VPeFYtRDNvN3Y3eVZrdDQ1SktfYnBXMjQsMjENCnBpcC9fdmVuZG9yL2lkbmEvdXRzNDZkYXRhLnB5LHNoYTI1Nj1ZeWxRWUJmbGpBeF9XVnFSMkQ3SGdjR0d5VkNXd1BtNnVGMzhhRVJ1aHl3LDE4NDk0NA0KcGlwL192ZW5kb3IvbG9ja2ZpbGUvX19pbml0X18ucHksc2hhMjU2PVRxcHo5MER3S1lmaFBzZnpWT0psODRUTDg3cGRGRTVlUE5IZFhBeHM0VGssOTM3MQ0KcGlwL192ZW5kb3IvbG9ja2ZpbGUvbGlua2xvY2tmaWxlLnB5LHNoYTI1Nj1DN09IM0g0R2RLNjh1NEZRZ3A4ZmtQMmtPNGZ5VVRTeWozWDZibGdmb2JjLDI2NTINCnBpcC9fdmVuZG9yL2xvY2tmaWxlL21rZGlybG9ja2ZpbGUucHksc2hhMjU2PWUzcWdJTC1ldFpNTHNTLTNmdDE5aVdfOElRMzYwSE5rR09xRTN5QktzVXcsMzA5Ng0KcGlwL192ZW5kb3IvbG9ja2ZpbGUvcGlkbG9ja2ZpbGUucHksc2hhMjU2PXVrSDl1azZORnV4eVZtRzVRaVd3NGlLcTNmVDdNanFVZ3VYOTVhdllQSVksNjA5MA0KcGlwL192ZW5kb3IvbG9ja2ZpbGUvc3FsaXRlbG9ja2ZpbGUucHksc2hhMjU2PW8yVE1rTVJZMGl3bi1pTDFYTVJSSUZTdE1Va1M0aTNhamNlZVlObnRLRmcsNTUwNg0KcGlwL192ZW5kb3IvbG9ja2ZpbGUvc3ltbGlua2xvY2tmaWxlLnB5LHNoYTI1Nj1BQndYWG12VEh2Q2w1dmlQYmxTaEwzUEctZ0dzTGlUMXJvQU1mRFJ3aGk4LDI2MTYNCnBpcC9fdmVuZG9yL3BhY2thZ2luZy9fX2Fib3V0X18ucHksc2hhMjU2PXprY0NQVE5fNlRjTFcwTnJsZzAxNzYtUjFRUV9XVlBUbThzejFSNC1Iak0sNzIwDQpwaXAvX3ZlbmRvci9wYWNrYWdpbmcvX19pbml0X18ucHksc2hhMjU2PV92TmFjNVRyendzcnpiT0ZJYkYtNWNIcWNfWTJhUFQyRDd6cklSMDZCT28sNTEzDQpwaXAvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weSxzaGEyNTY9VmlfQTByQVFlSGJVLWE5WDB0dDF5UW05UnFrZ1FiRFN4elJ3OFdsVTlrQSw4NjANCnBpcC9fdmVuZG9yL3BhY2thZ2luZy9fc3RydWN0dXJlcy5weSxzaGEyNTY9UkltRUNKNGNfd1RsYVRZWXdaWUxIRWllYkRNYUFKbUsxb1BBUmh3MVQ1bywxNDE2DQpwaXAvX3ZlbmRvci9wYWNrYWdpbmcvbWFya2Vycy5weSxzaGEyNTY9bXRnMm5waEpFMW9RTzM5ZzFEZ3NkUHNNTy1ndUJCQ2xwUi1BRVlGcmJNZyw4MjMwDQpwaXAvX3ZlbmRvci9wYWNrYWdpbmcvcmVxdWlyZW1lbnRzLnB5LHNoYTI1Nj1TRDdkVkpHamRQVXF0b0hiNDdxd0s2d1dKVFFkLVpYV2p4cEpnODNVY0JBLDQzMjcNCnBpcC9fdmVuZG9yL3BhY2thZ2luZy9zcGVjaWZpZXJzLnB5LHNoYTI1Nj1TQU1SZXJ6TzNmSzJJa0ZaQ2Faa3V3WmFMX0VHcUhOT3o0cG5pNHZobk4wLDI4MDI1DQpwaXAvX3ZlbmRvci9wYWNrYWdpbmcvdXRpbHMucHksc2hhMjU2PTNtNld2UG02Tk54RThya1RHbW4wcjc1Ql9HWlNHZzdpa2FmeEhzQk4xV0EsNDIxDQpwaXAvX3ZlbmRvci9wYWNrYWdpbmcvdmVyc2lvbi5weSxzaGEyNTY9T3dHbnhZZnIyZ2hOell4NTlxV0lCa3JLM1NuQjZuLVpmZDFYYUxwbm5NMCwxMTU1Ng0KcGlwL192ZW5kb3IvcGtnX3Jlc291cmNlcy9fX2luaXRfXy5weSxzaGEyNTY9Q2N3dUh0Q0JabjlPVGttZ0Y5Y0ZwYWRJQU1obHJuWlRWS1RPbzRWMnA1OCwxMDMyMzANCnBpcC9fdmVuZG9yL3Byb2dyZXNzL19faW5pdF9fLnB5LHNoYTI1Nj1XbjEwNzRMVURab3ZkNHpmb1ZZb2puUEJnT2M2Y3RIYlFYN3JwX3A4bFJBLDMwMjMNCnBpcC9fdmVuZG9yL3Byb2dyZXNzL2Jhci5weSxzaGEyNTY9WU5QSmVScndZVktGTzJueWFFd3NRallCeWFtTVdUZ0pNdlFPMU5wRC1BWSwyNjg1DQpwaXAvX3ZlbmRvci9wcm9ncmVzcy9jb3VudGVyLnB5LHNoYTI1Nj1rRXFBOGpXRWR3cmM2UF85VmFSeDdiak9Id2s5Z3hsLVE5b1ZiUTA4djVjLDE1MDINCnBpcC9fdmVuZG9yL3Byb2dyZXNzL2hlbHBlcnMucHksc2hhMjU2PUZlaGZ3WlR2LTVjQ2ZzYmNNbHZsVWttM3haMGNSaHNldjZYVnBtZVRGNGMsMjg1NA0KcGlwL192ZW5kb3IvcHJvZ3Jlc3Mvc3Bpbm5lci5weSxzaGEyNTY9aUNWdFVRYmFKVUZIVGpuMVpMUFFMUFllYW80bEM5YVhBYV9IeEllVUs2aywxMzE0DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9fX2luaXRfXy5weSxzaGEyNTY9SlJGVkJ3Nkp5Vjk4V1FTcXY4anNoYzVfZzl4SWJMaGV2STVMSGFWaTlJNCwzNTc1DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9fX3ZlcnNpb25fXy5weSxzaGEyNTY9QlEyNzlianFRXzhQSGh2RF9GTjM2VXVGcWpiU1Vxc203Yk1leUpWLWtWbyw0MzYNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL19pbnRlcm5hbF91dGlscy5weSxzaGEyNTY9WngzUG5FVWNjeWZzQi1pZTExblpWQVc4cUNsSnkwZ3gxcU5NRTdyZ1QxOCwxMDk2DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9hZGFwdGVycy5weSxzaGEyNTY9TEFheTNPSDBaYnZJNmJEV19NNU9mMDZ0VTV6MmZuQ2ZscnBfWG0zOEtzWSwyMTAxNg0KcGlwL192ZW5kb3IvcmVxdWVzdHMvYXBpLnB5LHNoYTI1Nj1CcVZabnZzV3U2UHdtMHZRM2Z3X0RqOV9JLWdjT1I5Q2JTY0IyaHRQQXJBLDYyMzcNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL2F1dGgucHksc2hhMjU2PTRLQ0ZRSHJMMUxjb3gzdU1oNHRqT2gzT3JKaHctRjV6dGk5MXdZLVp5VFksOTcyOA0KcGlwL192ZW5kb3IvcmVxdWVzdHMvY2FjZXJ0LnBlbSxzaGEyNTY9N0NFWGZMSHhEd3ZEcHdWdTB5XzJsZkpZazYzY1UtS1VLSV9ETDFMcThVbywyNzEwODgNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL2NlcnRzLnB5LHNoYTI1Nj1uWFJWcTlEdEdtdl8xQVlid2pUdTlVcmdBY2RKdjA1WnZrTmVhb0xPWnhZLDQ2NQ0KcGlwL192ZW5kb3IvcmVxdWVzdHMvY29tcGF0LnB5LHNoYTI1Nj1rY3FoVjdVNDNjNGk4T3VrNWU1WWRKWE1ERW1XTkxUOTdMWW02VW9yLTc0LDE2MjYNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL2Nvb2tpZXMucHksc2hhMjU2PXU3UUM1aG1sb013ZFQ5LTJ0YXo1R3B3QXZ6cDJMVFVTOWNQNFNXVUtuZk0sMTgyMDgNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL2V4Y2VwdGlvbnMucHksc2hhMjU2PW9ad1l3Q202NVkwRk11RnFvakVnVWxXVUJRNE1rWFJ5NVVSSFYxYjk4TDQsMzExNQ0KcGlwL192ZW5kb3IvcmVxdWVzdHMvaGVscC5weSxzaGEyNTY9VXVCVHRjN3RFcG5VX2l2bnB1azJoamd6dVM2ejdHblRFa1NiRU5sYzFYUSwzNjY3DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9ob29rcy5weSxzaGEyNTY9SFhBSG9DMUZOVEZSWlg2LWxOZHZQTTdUc3Q0a3ZHd1lUTi1BT0tSeG9SVSw3NjcNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL21vZGVscy5weSxzaGEyNTY9bGN6MkdFT2UyZU91LUdxQUdkcEEwdkpVcEk3RUU0ZURTbFdJNzhSOFk2NCwzNDA1MQ0KcGlwL192ZW5kb3IvcmVxdWVzdHMvcGFja2FnZXMucHksc2hhMjU2PW5qSm1WaWZZNGFTY3R1VzNQUDVFRlJDeGpFd01SRE82Sl9mZUcyZEtXc0ksNjk1DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9zZXNzaW9ucy5weSxzaGEyNTY9X0E1cXBmcm9oSFZGWUxFdVZ5RUo0djMtbElsTndPM0dwSEctTHprV0ZDTSwyNzU0Ng0KcGlwL192ZW5kb3IvcmVxdWVzdHMvc3RhdHVzX2NvZGVzLnB5LHNoYTI1Nj1hOWJ3dVU3bE1yNEhzaHNSWmR6QmJVc1lWc0lvNEZ1OUdZZzFYRlRGRlBjLDMzMjMNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL3N0cnVjdHVyZXMucHksc2hhMjU2PXlleEN2V2JYNDBNNkU4bUxRT3BBR1paLVpvQW55YVQyZG5pLUJwLWI0MmcsMzAxMg0KcGlwL192ZW5kb3IvcmVxdWVzdHMvdXRpbHMucHksc2hhMjU2PXNQRWtTVkxYbkdsZm9iYkpNbng1RTlWYzRrZnY2VHBGV3BIS0ZCOHdPOFUsMjc2NTINCnBpcC9fdmVuZG9yL3VybGxpYjMvX19pbml0X18ucHksc2hhMjU2PUVmVVBGOVJIdmVhRjlnNWRjSzVrQnNHRHA1THJJQi0zOTZNcEsyUlFrMUksMjg1Mw0KcGlwL192ZW5kb3IvdXJsbGliMy9fY29sbGVjdGlvbnMucHksc2hhMjU2PWIwLXg0NUxCQXJzOTZSdW01eEdBYlBzcml3ZkIzTVpWUWJzdjdsRmlVd0UsMTAyMDQNCnBpcC9fdmVuZG9yL3VybGxpYjMvY29ubmVjdGlvbi5weSxzaGEyNTY9NEdLUjh1WEh6NklwenRZaHR1aEtCcVhqODRIYmJGVUYzQ3Z3eW1HZkxEMCwxMzAwMw0KcGlwL192ZW5kb3IvdXJsbGliMy9jb25uZWN0aW9ucG9vbC5weSxzaGEyNTY9NXViOENYbktzMXdjMlgtTXl1VlZQbzNfOXNjV0xnaFNnYkhPSlRwUVh1RSwzNTM1OA0KcGlwL192ZW5kb3IvdXJsbGliMy9leGNlcHRpb25zLnB5LHNoYTI1Nj1kejFnQkVndFJPbkxyVzhWOTExS2hWWldlQW4zSDJPaERHenRXTlhRcHIwLDY2MDMNCnBpcC9fdmVuZG9yL3VybGxpYjMvZmllbGRzLnB5LHNoYTI1Nj1Zck5STThSQlVtTThndVhLVVFGYTNrd2o2WHZRWjc4WjhpbkU2bC1ZSy1FLDU5NDMNCnBpcC9fdmVuZG9yL3VybGxpYjMvZmlsZXBvc3QucHksc2hhMjU2PU5GNlJseTY2YmlsV1Utc2RVTFhqQ2RRZ04xdVJ4ZkZSZWRlaWZjUkx6a1UsMjMyMQ0KcGlwL192ZW5kb3IvdXJsbGliMy9wb29sbWFuYWdlci5weSxzaGEyNTY9LTUxQkFQbEQwTWdFQ1lkdUhoZmJaQ0VpWm9VX05ERk9LWWxoU2ppZmYyUSwxNjM0NQ0KcGlwL192ZW5kb3IvdXJsbGliMy9yZXF1ZXN0LnB5LHNoYTI1Nj13cnQyRDBTV0xMZ1RSS3JSbmFab3BocTJ4WHBDdk5SZDdSTVQ2RjVvNWhZLDU5NDYNCnBpcC9fdmVuZG9yL3VybGxpYjMvcmVzcG9uc2UucHksc2hhMjU2PTdtR1VIMzVMMklQdVpWT1k3UXZEUTFHU1NLSWY2VjZnZUpYVGhkam1RRDQsMjI5MDMNCnBpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fX2luaXRfXy5weSxzaGEyNTY9NDdERVFwajhIQlNhLV9USW1XLTVKQ2V1UWVSa201Tk1wSldaRzNoU3VGVSwwDQpwaXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvYXBwZW5naW5lLnB5LHNoYTI1Nj00MWwzYXJUeS1rQkJwT2RWcFNQWVZDNjRRbzdSTG5YbkRFRDZoY0l0aEEwLDEwODY1DQpwaXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvbnRsbXBvb2wucHksc2hhMjU2PVE5LXJPNVJoMi1JcXlFZDRaaWNwVERmTW5PbGYwSVBQQ2tqaENoQkNqVjQsNDQ3OA0KcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL3B5b3BlbnNzbC5weSxzaGEyNTY9QnhKMXlNUEU2MmR1dUhKUDZqbFp4THpfRk5US2JXSTBiLW5WUktsQkRnSSwxNTM1NA0KcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL3NlY3VyZXRyYW5zcG9ydC5weSxzaGEyNTY9WlJQejZRMXRuc3U5SDFCT0FRVlVTSEl5b3dXbWZhQmI3cEdsYkc1aU9QaywzMDUwMQ0KcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL3NvY2tzLnB5LHNoYTI1Nj16UFlVS01nX2MwbjlIRmpaUEc5bkdOMmtqcGFIN3FVQ1p4ckQ1QjdHMF9JLDYxOTUNCnBpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fc2VjdXJldHJhbnNwb3J0L19faW5pdF9fLnB5LHNoYTI1Nj00N0RFUXBqOEhCU2EtX1RJbVctNUpDZXVRZVJrbTVOTXBKV1pHM2hTdUZVLDANCnBpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fc2VjdXJldHJhbnNwb3J0L2JpbmRpbmdzLnB5LHNoYTI1Nj14MmtMU2gtQVNaS3N1bjBGeHRyYUJ1TFZlM29IdXRoNFlXNnlaNVZvZi13LDE3NTYwDQpwaXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvX3NlY3VyZXRyYW5zcG9ydC9sb3dfbGV2ZWwucHksc2hhMjU2PVViaFV5a0VINkhVSUp1ZDlfcm5fNllXamlvbms1aXFfcnE2WXJoVk02Q28sMTIwNjINCnBpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvX19pbml0X18ucHksc2hhMjU2PW5sQ2hyR3prakNrbWhDWDlIckZfcUhQVWdvc2ZzUFFrVklKeGlpTGhrOWcsMTA5DQpwaXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL29yZGVyZWRfZGljdC5weSxzaGEyNTY9VlFhUE9OZmhWTXNiOEI2M1hnN1pPeWRKcUlFX2p6ZU1oVk4zUGVjNm9ndyw4OTM1DQpwaXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL3NpeC5weSxzaGEyNTY9QTZoZEpaVmpJM3RfZ2VlYlo5QnpVdndScklYbzBsZnd6UWxNMkxjS3lhcywzMDA5OA0KcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9iYWNrcG9ydHMvX19pbml0X18ucHksc2hhMjU2PTQ3REVRcGo4SEJTYS1fVEltVy01SkNldVFlUmttNU5NcEpXWkczaFN1RlUsMA0KcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9iYWNrcG9ydHMvbWFrZWZpbGUucHksc2hhMjU2PXIxSUFEb2xfcEJCcTJZMXViNENQeXVTMmhYdVNoSzQ3bmZGbmdaUmNSaEksMTQ2MQ0KcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9zc2xfbWF0Y2hfaG9zdG5hbWUvX19pbml0X18ucHksc2hhMjU2PVdCVmJ4UUJvak5BeGZad05hdmtveDNCZ0ppTUE5QkptbS1fZndkMGpEX28sNjg4DQpwaXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL3NzbF9tYXRjaF9ob3N0bmFtZS9faW1wbGVtZW50YXRpb24ucHksc2hhMjU2PWxBajdxR0NaTE9sZGhuOGdaRFk2VHFwNG12Z2tiVGZ5NGs0Z0RJRFJvOGcsNTcwMg0KcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL19faW5pdF9fLnB5LHNoYTI1Nj02UmFuNG9BVkl5NDBDdV9vRVBXbk5WOWJ3RjVyWHg2RzFEVVo3b2VoalBZLDEwNDQNCnBpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9jb25uZWN0aW9uLnB5LHNoYTI1Nj1fNl81SlpKRjNISFJYUjdIYXhIZzNtazdxTUtLM04wbmwzREw4Z0ZBZm80LDQyMzcNCnBpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9yZXF1ZXN0LnB5LHNoYTI1Nj1INV9sckh2dHdsMlUyQmJUMVVZTjlIcHJ1TmMxZ3NORmx6Mm5qUW1oUHJRLDM3MDUNCnBpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9yZXNwb25zZS5weSxzaGEyNTY9U1NOTDg4OFctTVE4dDNIQWk0NGtOR2dGNjgycDZIX195dEVYekJZeFZfTSwyMzQzDQpwaXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvcmV0cnkucHksc2hhMjU2PXA0TEhtLU9WYU5kTnlaLWhvQW9kVElveE5vY0F1dWVnVDM2SHhfR2N3a2csMTQ2MDENCnBpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9zZWxlY3RvcnMucHksc2hhMjU2PVBJSU56d2ppRDVaNkl5VEtBMXRSNW4xa0NPWHlUaHBEQ0UyZkNWRnpMZU0sMjExNDcNCnBpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9zc2xfLnB5LHNoYTI1Nj1ZcGNpTTBtTl9yZDI3d2NoTEVOU3hUTmE3UFdFZ1oyTVA5YXRlRnVyQ2VvLDEyMjA4DQpwaXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvdGltZW91dC5weSxzaGEyNTY9N2xITnJnTDVZSDJjSTFqLXlabnpWX0o4akJsUlZkbUZoUWFOeU0xXzJiOCw5NzU3DQpwaXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvdXJsLnB5LHNoYTI1Nj1xQ1lfSEhVWHZvMDV3QXNFRVJBTGdFeHRsZ3hMbkFIU1E3Y2UxYi1nM1NNLDY0ODcNCnBpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC93YWl0LnB5LHNoYTI1Nj1RX3BkX2JENmlhUGdSS3dFbWNqVFlEclNQajREZDRvanlrbXFBMzk4YjhvLDE0NTENCnBpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy9fX2luaXRfXy5weSxzaGEyNTY9dDdyQVFReFh3YWxZLWFrOWhUbDczcUhqaGlhOVVILXNMLWUwMHFRckJwbywxMDU3Ng0KcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL2xhYmVscy5weSxzaGEyNTY9NEFPX0t4VGRkcUd0ckw5bnM3a0FQamIwQ2NONnhzQ0l4YkszN0hZOXIzRSw4OTc5DQpwaXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MvbWtsYWJlbHMucHksc2hhMjU2PUdZSWV5d25wYUxuUDBHU2ljOExGV2dkMFVWdk9fbDFOYzZZb0YtODdSXzQsMTMwNQ0KcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL3Rlc3RzLnB5LHNoYTI1Nj03dlRrN0xnT0puX3QxWHRUX3Zpb2ZabEVKN2NKQ3pQZV9odlZIT2tjUWw4LDY1NjINCnBpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy94X3VzZXJfZGVmaW5lZC5weSxzaGEyNTY9NzJjZlBSaGJma1JDR2trQThabnZWVjdVbm9pTGI1dVBNaFh3aHJYaUxQayw0MzA2DQpwaXAvY29tbWFuZHMvX19pbml0X18ucHksc2hhMjU2PTJVcTNIQ2RqY2hKRDlGTDFMQjdyZDV2NlV5U1ZBVml6WDBXM0VYM2hJb0UsMjI0NA0KcGlwL2NvbW1hbmRzL2NoZWNrLnB5LHNoYTI1Nj0tQTdHSTEtV1pCaDlhNFA2VW9IX2FSLUo3SThMejhseTdtM3duQ2ptZXZzLDEzODINCnBpcC9jb21tYW5kcy9jb21wbGV0aW9uLnB5LHNoYTI1Nj1ra1BnVlg3U1VjSl84SnV3NUdrZ1dheEhOOV80NXdtQXI5bUdzMXpYRUVzLDI0NTMNCnBpcC9jb21tYW5kcy9kb3dubG9hZC5weSxzaGEyNTY9OFJ1dVBtU1lnQXEzaUVEVHFaWV8xUERYUnFSRWRVVUxITmpXSmVBdjdNbyw3ODEwDQpwaXAvY29tbWFuZHMvZnJlZXplLnB5LHNoYTI1Nj1oNi15Rk1wakNqYk5qOC1nT201VXVvRjZjZzE0TjVyUFY0VENpM19DZXVJLDI4MzUNCnBpcC9jb21tYW5kcy9oYXNoLnB5LHNoYTI1Nj1NQ3Q0akVGeWZvY2UwbFZlTkV6MXg0OXVhVFktVkRrS2lCdnZ4clZjSGt3LDE1OTcNCnBpcC9jb21tYW5kcy9oZWxwLnB5LHNoYTI1Nj04NEhXa0VkbkdQX0FFQkhubjhnSlAyVGUwWFRYUktGb1hxWG9wYk9aVE5vLDk4Mg0KcGlwL2NvbW1hbmRzL2luc3RhbGwucHksc2hhMjU2PW92RzlwOW4xWDJOUHFNZ0ZWdFN1VDlrTWJMQWR4MXIzWVNTaVhTdmdPS0ksMTc0MTINCnBpcC9jb21tYW5kcy9saXN0LnB5LHNoYTI1Nj05M2JDaUZ5dDJRdXRfWUhrWUhKTVpIcFhsYWRteHNqUy15T3RaZWIzdXFJLDExMzY5DQpwaXAvY29tbWFuZHMvc2VhcmNoLnB5LHNoYTI1Nj1vVHM5UU5kZWZucm1DVl9KZWZ0RzBQR2lNdVlWbWlFREYxT1VhWXNtRGFvLDQ1MDINCnBpcC9jb21tYW5kcy9zaG93LnB5LHNoYTI1Nj1aWU01N183VThLUDlNUUlJeUhLUWRaeG1pRVpCeXktRFJ6QjY5N1ZGb1RZLDU4OTENCnBpcC9jb21tYW5kcy91bmluc3RhbGwucHksc2hhMjU2PXR6OGNYejRXZHBVZG50M1J2cGRRd0g2X1NOTUI1MGVnQklaV2ExZHdmY2MsMjg4NA0KcGlwL2NvbW1hbmRzL3doZWVsLnB5LHNoYTI1Nj16NVNFaHdzMllSTWIwTWwxSUVrZzZqRlpNTFJwTGw4NmJIQ3JRYll0NXpvLDc3MjkNCnBpcC9jb21wYXQvX19pbml0X18ucHksc2hhMjU2PTJYc19JcHNtZFJnSGJRZ1FPMGM4X2xQdkhKblFYSHlHV3hQYkxiWUpMNGMsNDY3Mg0KcGlwL2NvbXBhdC9kaWN0Y29uZmlnLnB5LHNoYTI1Nj1kUnJlbFBEV3JjZURTekZUNTFSVEVWWTJHdU03VUR5YzVJZ2hfdG40RnZrLDIzMDk2DQpwaXAvbW9kZWxzL19faW5pdF9fLnB5LHNoYTI1Nj0wUnM3X1JBNER4ZU9rV1Q1Q3E0Q1F6RHJTRWh2WWNOM1RIMmNhenI3MlBFLDcxDQpwaXAvbW9kZWxzL2luZGV4LnB5LHNoYTI1Nj1wVWZiT19fdjNtRDlqLTJuX0Nsd1BTOHBWeXg0bDJ3SXd5dld0OEdNQ1JBLDQ4Nw0KcGlwL29wZXJhdGlvbnMvX19pbml0X18ucHksc2hhMjU2PTQ3REVRcGo4SEJTYS1fVEltVy01SkNldVFlUmttNU5NcEpXWkczaFN1RlUsMA0KcGlwL29wZXJhdGlvbnMvY2hlY2sucHksc2hhMjU2PXV3VU45Y3Mxc1BvN2MwU2o2cFJyU3Y3YjIyUGsyOVNYVUltVGVsVmNoTVEsMTU5MA0KcGlwL29wZXJhdGlvbnMvZnJlZXplLnB5LHNoYTI1Nj1rLTd3N0xzTS1ScFB2N0VSQnpIaVBwWWtILUd1WWZITHlSLUNwXzFWUEwwLDUxOTQNCnBpcC9yZXEvX19pbml0X18ucHksc2hhMjU2PXZGd1pZOF9WYzFXVTF6RkFlc3BnMU15X3JfQVQzbjdjTjBXOWVYMEVGcWssMjc2DQpwaXAvcmVxL3JlcV9maWxlLnB5LHNoYTI1Nj1mRzlNRHNYVU5QaG1Hd3hVaXdySVhFeW55RDhRN3MzTDQ3LWhMWlBEWHEwLDExOTI2DQpwaXAvcmVxL3JlcV9pbnN0YWxsLnB5LHNoYTI1Nj1nWXJILWx3UU1tdDU1VlZiYXZfRXRSSVB1OTRjUWJIRkhtX0txNkFlSGJnLDQ2NDg3DQpwaXAvcmVxL3JlcV9zZXQucHksc2hhMjU2PWpIc3BYcWNBMkZ4Y0YwNWRnVUlBWjVodVlQdjZibjB3UlVYMFo3UEttYUEsMzQ0NjINCnBpcC9yZXEvcmVxX3VuaW5zdGFsbC5weSxzaGEyNTY9ZmRIMlZnQ2pFQzhOUllEUzdmUnUzWkphQkJVRXktTjVtdXd4RFg1TUJOTSw2ODk3DQpwaXAvdXRpbHMvX19pbml0X18ucHksc2hhMjU2PUhYX3dZUzE1b2lZT3otSDNxRzFLYmkxQ1k3QUdXQ05LNWpsb2lEMGZhdWMsMjcxODcNCnBpcC91dGlscy9hcHBkaXJzLnB5LHNoYTI1Nj1rajJMSy1JMmZDNVFuRWhfQV92LWV2X0lRTWNYYVdXRjVERTM5c052Q0xRLDg4MTENCnBpcC91dGlscy9idWlsZC5weSxzaGEyNTY9NHNtTFJyZlNDbVhtakVuVm5NRmgydEJFcE5jU0xSZTZKMGVqWkotd1dKRSwxMzEyDQpwaXAvdXRpbHMvZGVwcmVjYXRpb24ucHksc2hhMjU2PVhfRk1qdERiTUpxZnFFa2RScmtpLW1ZeUlkUEI2STZESFVUQ0FfQ2hZNk0sMjIzMg0KcGlwL3V0aWxzL2VuY29kaW5nLnB5LHNoYTI1Nj1OUXhHaUZTNUdiZUF2ZUxaVG54OTJ0NXIwUFlxdnQwaVJuUDJ1OVNHRzF3LDk3MQ0KcGlwL3V0aWxzL2ZpbGVzeXN0ZW0ucHksc2hhMjU2PVpFVkJ1WU0zZnFyMl9sZ09FU2g0WTdmUEZzekdENDc0elZtX00zTWI1VGssODk5DQpwaXAvdXRpbHMvZ2xpYmMucHksc2hhMjU2PWpjUVlqdF9vSkxQS1ZaQjI4S2F1eTRTdzcwelMtd2F3eG9VMUhIWDM2XzAsMjkzOQ0KcGlwL3V0aWxzL2hhc2hlcy5weSxzaGEyNTY9b01rN2NkM1BiSmd6cFNReVhxMU15dE11ZDVmNkg1T2EyWVk1aFl1Q3E2SSwyODY2DQpwaXAvdXRpbHMvbG9nZ2luZy5weSxzaGEyNTY9N3lXdTRnWnctUWNsajdYODBRVmRwR1drZFRXR0tUNExpVVZLY0UwNHBybywzMzI3DQpwaXAvdXRpbHMvb3V0ZGF0ZWQucHksc2hhMjU2PWZOd09DTDVyMkVmdFBHaGdDWUdNS3UwMzJIQzhjVi1KQXI5bHAwSG1Ub00sNTQ1NQ0KcGlwL3V0aWxzL3BhY2thZ2luZy5weSxzaGEyNTY9cWhtbGkxNG9kdzZESWhXSmdRWVMyUTBSclNicjhuWE5jRzQ4ZjV5VFJtcywyMDgwDQpwaXAvdXRpbHMvc2V0dXB0b29sc19idWlsZC5weSxzaGEyNTY9MGJsZnNjbU5KV19pWjVEY3N3SmVEQl9QYnRURWpmSzlSTDFSMVdFRFcyRSwyNzgNCnBpcC91dGlscy91aS5weSxzaGEyNTY9cGJEa1NBZXVtWjZqZFpjT0oyeUFieDhpQmdlUDJ6ZnBxTm5MSksxZ3NrUSwxMTU5Nw0KcGlwL3Zjcy9fX2luaXRfXy5weSxzaGEyNTY9V2FmRmxpVVRITW1zU0lTVjhQSHAxTTVFWEROU1d5SnI3OHpLYVFtUExkWSwxMjM3NA0KcGlwL3Zjcy9iYXphYXIucHksc2hhMjU2PXRZVHdjNGI0b2ZmOG1yME8ybzhTaUdlanFCREp4Y2JEQk1TTWQ5LUlTWWMsMzgwMw0KcGlwL3Zjcy9naXQucHksc2hhMjU2PTVMZldyeWk3OEEtMlVMakVaSnZDVGFySl8zbDh2ZW53WEFTbHdtOGhpdWcsMTExOTcNCnBpcC92Y3MvbWVyY3VyaWFsLnB5LHNoYTI1Nj14RzZyRGl3SENSeXRKRXMyM1NJSEJYbF9Td1FvMmpra2REXzZyVlZQNWg0LDM0NzINCnBpcC92Y3Mvc3VidmVyc2lvbi5weSxzaGEyNTY9R0F1WDJTazdJWnZKeUV6RU5LY1ZsZF93R0JyUTNmcFhEbFhqYXBaRVlkSSw5MzUwDQpwaXAtOS4wLjMuZGlzdC1pbmZvL0RFU0NSSVBUSU9OLnJzdCxzaGEyNTY9VmE4V2oxWEJwVGJWUTJaNDFtWlJKZEFMRWV6aWlTX1pld1duMUgyZWNZNCwxMjg3DQpwaXAtOS4wLjMuZGlzdC1pbmZvL01FVEFEQVRBLHNoYTI1Nj1rTTJ6WERvSVBpWjJxb2pma2FEQzdhS3FURnd1d2dNUlZKN0ZZVXRBQVZrLDI1NTMNCnBpcC05LjAuMy5kaXN0LWluZm8vUkVDT1JELCwNCnBpcC05LjAuMy5kaXN0LWluZm8vV0hFRUwsc2hhMjU2PWtkc04tNU9KQVpJaUhOLWlPNFJobDgyS3lTMGJEV2Y0dUJ3TWJrTmFmcjgsMTEwDQpwaXAtOS4wLjMuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHQsc2hhMjU2PVEtZlIydGNwOURSZGVYb0duMXdSNjdYZWN5MzJvNUV5UUVuekRnaHdxcWssNjgNCnBpcC05LjAuMy5kaXN0LWluZm8vbWV0YWRhdGEuanNvbixzaGEyNTY9NExtcnVpM2tuTDBiZ294bDE4c2N5czFVenRPZnVnVWZDekFSY3BLVzR6QSwxNTY1DQpwaXAtOS4wLjMuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHQsc2hhMjU2PXp1dXVlNGtub3lKLVV3UFBYZzhmZXpTN1ZDclhKUXJBUDd6ZU51d3ZGUWcsNA0KUEsDBBQAAAAAAAAAIQD23dK+bgAAAG4AAAApAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vV0hFRUxXaGVlbC1WZXJzaW9uOiAxLjAKR2VuZXJhdG9yOiBiZGlzdF93aGVlbCAoMC4zMC4wKQpSb290LUlzLVB1cmVsaWI6IHRydWUKVGFnOiBweTItbm9uZS1hbnkKVGFnOiBweTMtbm9uZS1hbnkKClBLAwQUAAAAAAAAACEAtBeYxEQAAABEAAAANAAAAHB5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHRbY29uc29sZV9zY3JpcHRzXQpwaXAgPSBwaXA6bWFpbgpwaXAzID0gcGlwOm1haW4KcGlwMy42ID0gcGlwOm1haW4KClBLAwQUAAAAAAAAACEAyOC3mx0GAAAdBgAAMQAAAHB5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL21ldGFkYXRhLmpzb257ImNsYXNzaWZpZXJzIjogWyJEZXZlbG9wbWVudCBTdGF0dXMgOjogNSAtIFByb2R1Y3Rpb24vU3RhYmxlIiwgIkludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMiLCAiTGljZW5zZSA6OiBPU0kgQXBwcm92ZWQgOjogTUlUIExpY2Vuc2UiLCAiVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogQnVpbGQgVG9vbHMiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNiIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi43IiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjMiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNCIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy41IiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiBJbXBsZW1lbnRhdGlvbiA6OiBQeVB5Il0sICJleHRlbnNpb25zIjogeyJweXRob24uY29tbWFuZHMiOiB7IndyYXBfY29uc29sZSI6IHsicGlwIjogInBpcDptYWluIiwgInBpcDMiOiAicGlwOm1haW4iLCAicGlwMy42IjogInBpcDptYWluIn19LCAicHl0aG9uLmRldGFpbHMiOiB7ImNvbnRhY3RzIjogW3siZW1haWwiOiAicHl0aG9uLXZpcnR1YWxlbnZAZ3JvdXBzLmdvb2dsZS5jb20iLCAibmFtZSI6ICJUaGUgcGlwIGRldmVsb3BlcnMiLCAicm9sZSI6ICJhdXRob3IifV0sICJkb2N1bWVudF9uYW1lcyI6IHsiZGVzY3JpcHRpb24iOiAiREVTQ1JJUFRJT04ucnN0In0sICJwcm9qZWN0X3VybHMiOiB7IkhvbWUiOiAiaHR0cHM6Ly9waXAucHlwYS5pby8ifX0sICJweXRob24uZXhwb3J0cyI6IHsiY29uc29sZV9zY3JpcHRzIjogeyJwaXAiOiAicGlwOm1haW4iLCAicGlwMyI6ICJwaXA6bWFpbiIsICJwaXAzLjYiOiAicGlwOm1haW4ifX19LCAiZXh0cmFzIjogWyJ0ZXN0aW5nIl0sICJnZW5lcmF0b3IiOiAiYmRpc3Rfd2hlZWwgKDAuMzAuMCkiLCAia2V5d29yZHMiOiBbImVhc3lfaW5zdGFsbCIsICJkaXN0dXRpbHMiLCAic2V0dXB0b29scyIsICJlZ2ciLCAidmlydHVhbGVudiJdLCAibGljZW5zZSI6ICJNSVQiLCAibWV0YWRhdGFfdmVyc2lvbiI6ICIyLjAiLCAibmFtZSI6ICJwaXAiLCAicmVxdWlyZXNfcHl0aG9uIjogIj49Mi42LCE9My4wLiosIT0zLjEuKiwhPTMuMi4qIiwgInJ1bl9yZXF1aXJlcyI6IFt7ImV4dHJhIjogInRlc3RpbmciLCAicmVxdWlyZXMiOiBbIm1vY2siLCAicHJldGVuZCIsICJweXRlc3QiLCAic2NyaXB0dGVzdCAoPj0xLjMpIiwgInZpcnR1YWxlbnYgKD49MS4xMCkiXX1dLCAic3VtbWFyeSI6ICJUaGUgUHlQQSByZWNvbW1lbmRlZCB0b29sIGZvciBpbnN0YWxsaW5nIFB5dGhvbiBwYWNrYWdlcy4iLCAidGVzdF9yZXF1aXJlcyI6IFt7InJlcXVpcmVzIjogWyJtb2NrIiwgInByZXRlbmQiLCAicHl0ZXN0IiwgInNjcmlwdHRlc3QgKD49MS4zKSIsICJ2aXJ0dWFsZW52ICg+PTEuMTApIl19XSwgInZlcnNpb24iOiAiOS4wLjMifVBLAwQUAAAAAAAAACEAxx+XwgQAAAAEAAAAMQAAAHB5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHRwaXAKUEsDBBQAAAAAAAAAIQANW9B2tC4AALQuAAAfAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fX2luaXRfXy5weSMhL3Vzci9iaW4vZW52IHB5dGhvbgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvY2FsZQppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IG9wdHBhcnNlCmltcG9ydCB3YXJuaW5ncwoKaW1wb3J0IHN5cwppbXBvcnQgcmUKCiMgMjAxNi0wNi0xNyBiYXJyeUBkZWJpYW4ub3JnOiB1cmxsaWIzIDEuMTQgYWRkZWQgb3B0aW9uYWwgc3VwcG9ydCBmb3Igc29ja3MsCiMgYnV0IGlmIGludm9rZWQgKGkuZS4gaW1wb3J0ZWQpLCBpdCB3aWxsIGlzc3VlIGEgd2FybmluZyB0byBzdGRlcnIgaWYgc29ja3MKIyBpc24ndCBhdmFpbGFibGUuICByZXF1ZXN0cyB1bmNvbmRpdGlvbmFsbHkgaW1wb3J0cyB1cmxsaWIzJ3Mgc29ja3MgY29udHJpYgojIG1vZHVsZSwgdHJpZ2dlcmluZyB0aGlzIHdhcm5pbmcuICBUaGUgd2FybmluZyBicmVha3MgREVQLTggdGVzdHMgKGJlY2F1c2Ugb2YKIyB0aGUgc3RkZXJyIG91dHB1dCkgYW5kIGlzIGp1c3QgcGxhaW4gYW5ub3lpbmcgaW4gbm9ybWFsIHVzYWdlLiAgSSBkb24ndCB3YW50CiMgdG8gYWRkIHNvY2tzIGFzIHlldCBhbm90aGVyIGRlcGVuZGVuY3kgZm9yIHBpcCwgbm9yIGRvIEkgd2FudCB0byBhbGxvdy1zdGRlcgojIGluIHRoZSBERVAtOCB0ZXN0cywgc28ganVzdCBzdXBwcmVzcyB0aGUgd2FybmluZy4gIHBkYiB0ZWxscyBtZSB0aGlzIGhhcyB0bwojIGJlIGRvbmUgYmVmb3JlIHRoZSBpbXBvcnQgb2YgcGlwLnZjcy4KZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IERlcGVuZGVuY3lXYXJuaW5nCndhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCBjYXRlZ29yeT1EZXBlbmRlbmN5V2FybmluZykgICMgbm9xYQoKIyBXZSB3YW50IHRvIGluamVjdCB0aGUgdXNlIG9mIFNlY3VyZVRyYW5zcG9ydCBhcyBlYXJseSBhcyBwb3NzaWJsZSBzbyB0aGF0IGFueQojIHJlZmVyZW5jZXMgb3Igc2Vzc2lvbnMgb3Igd2hhdCBoYXZlIHlvdSBhcmUgZW5zdXJlZCB0byBoYXZlIGl0LCBob3dldmVyIHdlCiMgb25seSB3YW50IHRvIGRvIHRoaXMgaW4gdGhlIGNhc2UgdGhhdCB3ZSdyZSBydW5uaW5nIG9uIG1hY09TIGFuZCB0aGUgbGlua2VkCiMgT3BlblNTTCBpcyB0b28gb2xkIHRvIGhhbmRsZSBUTFN2MS4yCnRyeToKICAgIGltcG9ydCBzc2wKZXhjZXB0IEltcG9ydEVycm9yOgogICAgcGFzcwplbHNlOgogICAgaWYgKHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIiBhbmQKICAgICAgICAgICAgZ2V0YXR0cihzc2wsICJPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIiwgMCkgPCAweDEwMDAxMDBmKTogICMgT3BlblNTTCAxLjAuMQogICAgICAgIHRyeToKICAgICAgICAgICAgZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmNvbnRyaWIgaW1wb3J0IHNlY3VyZXRyYW5zcG9ydAogICAgICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIE9TRXJyb3IpOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VjdXJldHJhbnNwb3J0LmluamVjdF9pbnRvX3VybGxpYjMoKQoKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgSW5zdGFsbGF0aW9uRXJyb3IsIENvbW1hbmRFcnJvciwgUGlwRXJyb3IKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGdldF9pbnN0YWxsZWRfZGlzdHJpYnV0aW9ucywgZ2V0X3Byb2cKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGRlcHJlY2F0aW9uLCBkaXN0X2lzX2VkaXRhYmxlCmZyb20gcGlwLnZjcyBpbXBvcnQgZ2l0LCBtZXJjdXJpYWwsIHN1YnZlcnNpb24sIGJhemFhciAgIyBub3FhCmZyb20gcGlwLmJhc2VwYXJzZXIgaW1wb3J0IENvbmZpZ09wdGlvblBhcnNlciwgVXBkYXRpbmdEZWZhdWx0c0hlbHBGb3JtYXR0ZXIKZnJvbSBwaXAuY29tbWFuZHMgaW1wb3J0IGdldF9zdW1tYXJpZXMsIGdldF9zaW1pbGFyX2NvbW1hbmRzCmZyb20gcGlwLmNvbW1hbmRzIGltcG9ydCBjb21tYW5kc19kaWN0CmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBJbnNlY3VyZVJlcXVlc3RXYXJuaW5nCgoKIyBhc3NpZ25tZW50IGZvciBmbGFrZTggdG8gYmUgaGFwcHkKCiMgVGhpcyBmaXhlcyBhIHBlY3VsaWFyaXR5IHdoZW4gaW1wb3J0aW5nIHZpYSBfX2ltcG9ydF9fIC0gYXMgd2UgYXJlCiMgaW5pdGlhbGlzaW5nIHRoZSBwaXAgbW9kdWxlLCAiZnJvbSBwaXAgaW1wb3J0IGNtZG9wdGlvbnMiIGlzIHJlY3Vyc2l2ZQojIGFuZCBhcHBlYXJzIG5vdCB0byB3b3JrIHByb3Blcmx5IGluIHRoYXQgc2l0dWF0aW9uLgppbXBvcnQgcGlwLmNtZG9wdGlvbnMKY21kb3B0aW9ucyA9IHBpcC5jbWRvcHRpb25zCgojIFRoZSB2ZXJzaW9uIGFzIHVzZWQgaW4gdGhlIHNldHVwLnB5IGFuZCB0aGUgZG9jcyBjb25mLnB5Cl9fdmVyc2lvbl9fID0gIjkuMC4zIgoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKIyBIaWRlIHRoZSBJbnNlY3VyZVJlcXVlc3RXYXJuaW5nIGZyb20gdXJsbGliMwp3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgY2F0ZWdvcnk9SW5zZWN1cmVSZXF1ZXN0V2FybmluZykKCgpkZWYgYXV0b2NvbXBsZXRlKCk6CiAgICAiIiJDb21tYW5kIGFuZCBvcHRpb24gY29tcGxldGlvbiBmb3IgdGhlIG1haW4gb3B0aW9uIHBhcnNlciAoYW5kIG9wdGlvbnMpCiAgICBhbmQgaXRzIHN1YmNvbW1hbmRzIChhbmQgb3B0aW9ucykuCgogICAgRW5hYmxlIGJ5IHNvdXJjaW5nIG9uZSBvZiB0aGUgY29tcGxldGlvbiBzaGVsbCBzY3JpcHRzIChiYXNoLCB6c2ggb3IgZmlzaCkuCiAgICAiIiIKICAgICMgRG9uJ3QgY29tcGxldGUgaWYgdXNlciBoYXNuJ3Qgc291cmNlZCBiYXNoX2NvbXBsZXRpb24gZmlsZS4KICAgIGlmICdQSVBfQVVUT19DT01QTEVURScgbm90IGluIG9zLmVudmlyb246CiAgICAgICAgcmV0dXJuCiAgICBjd29yZHMgPSBvcy5lbnZpcm9uWydDT01QX1dPUkRTJ10uc3BsaXQoKVsxOl0KICAgIGN3b3JkID0gaW50KG9zLmVudmlyb25bJ0NPTVBfQ1dPUkQnXSkKICAgIHRyeToKICAgICAgICBjdXJyZW50ID0gY3dvcmRzW2N3b3JkIC0gMV0KICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgIGN1cnJlbnQgPSAnJwoKICAgIHN1YmNvbW1hbmRzID0gW2NtZCBmb3IgY21kLCBzdW1tYXJ5IGluIGdldF9zdW1tYXJpZXMoKV0KICAgIG9wdGlvbnMgPSBbXQogICAgIyBzdWJjb21tYW5kCiAgICB0cnk6CiAgICAgICAgc3ViY29tbWFuZF9uYW1lID0gW3cgZm9yIHcgaW4gY3dvcmRzIGlmIHcgaW4gc3ViY29tbWFuZHNdWzBdCiAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICBzdWJjb21tYW5kX25hbWUgPSBOb25lCgogICAgcGFyc2VyID0gY3JlYXRlX21haW5fcGFyc2VyKCkKICAgICMgc3ViY29tbWFuZCBvcHRpb25zCiAgICBpZiBzdWJjb21tYW5kX25hbWU6CiAgICAgICAgIyBzcGVjaWFsIGNhc2U6ICdoZWxwJyBzdWJjb21tYW5kIGhhcyBubyBvcHRpb25zCiAgICAgICAgaWYgc3ViY29tbWFuZF9uYW1lID09ICdoZWxwJzoKICAgICAgICAgICAgc3lzLmV4aXQoMSkKICAgICAgICAjIHNwZWNpYWwgY2FzZTogbGlzdCBsb2NhbGx5IGluc3RhbGxlZCBkaXN0cyBmb3IgdW5pbnN0YWxsIGNvbW1hbmQKICAgICAgICBpZiBzdWJjb21tYW5kX25hbWUgPT0gJ3VuaW5zdGFsbCcgYW5kIG5vdCBjdXJyZW50LnN0YXJ0c3dpdGgoJy0nKToKICAgICAgICAgICAgaW5zdGFsbGVkID0gW10KICAgICAgICAgICAgbGMgPSBjdXJyZW50Lmxvd2VyKCkKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZ2V0X2luc3RhbGxlZF9kaXN0cmlidXRpb25zKGxvY2FsX29ubHk9VHJ1ZSk6CiAgICAgICAgICAgICAgICBpZiBkaXN0LmtleS5zdGFydHN3aXRoKGxjKSBhbmQgZGlzdC5rZXkgbm90IGluIGN3b3Jkc1sxOl06CiAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkLmFwcGVuZChkaXN0LmtleSkKICAgICAgICAgICAgIyBpZiB0aGVyZSBhcmUgbm8gZGlzdHMgaW5zdGFsbGVkLCBmYWxsIGJhY2sgdG8gb3B0aW9uIGNvbXBsZXRpb24KICAgICAgICAgICAgaWYgaW5zdGFsbGVkOgogICAgICAgICAgICAgICAgZm9yIGRpc3QgaW4gaW5zdGFsbGVkOgogICAgICAgICAgICAgICAgICAgIHByaW50KGRpc3QpCiAgICAgICAgICAgICAgICBzeXMuZXhpdCgxKQoKICAgICAgICBzdWJjb21tYW5kID0gY29tbWFuZHNfZGljdFtzdWJjb21tYW5kX25hbWVdKCkKICAgICAgICBvcHRpb25zICs9IFsob3B0LmdldF9vcHRfc3RyaW5nKCksIG9wdC5uYXJncykKICAgICAgICAgICAgICAgICAgICBmb3Igb3B0IGluIHN1YmNvbW1hbmQucGFyc2VyLm9wdGlvbl9saXN0X2FsbAogICAgICAgICAgICAgICAgICAgIGlmIG9wdC5oZWxwICE9IG9wdHBhcnNlLlNVUFBSRVNTX0hFTFBdCgogICAgICAgICMgZmlsdGVyIG91dCBwcmV2aW91c2x5IHNwZWNpZmllZCBvcHRpb25zIGZyb20gYXZhaWxhYmxlIG9wdGlvbnMKICAgICAgICBwcmV2X29wdHMgPSBbeC5zcGxpdCgnPScpWzBdIGZvciB4IGluIGN3b3Jkc1sxOmN3b3JkIC0gMV1dCiAgICAgICAgb3B0aW9ucyA9IFsoeCwgdikgZm9yICh4LCB2KSBpbiBvcHRpb25zIGlmIHggbm90IGluIHByZXZfb3B0c10KICAgICAgICAjIGZpbHRlciBvcHRpb25zIGJ5IGN1cnJlbnQgaW5wdXQKICAgICAgICBvcHRpb25zID0gWyhrLCB2KSBmb3IgaywgdiBpbiBvcHRpb25zIGlmIGsuc3RhcnRzd2l0aChjdXJyZW50KV0KICAgICAgICBmb3Igb3B0aW9uIGluIG9wdGlvbnM6CiAgICAgICAgICAgIG9wdF9sYWJlbCA9IG9wdGlvblswXQogICAgICAgICAgICAjIGFwcGVuZCAnPScgdG8gb3B0aW9ucyB3aGljaCByZXF1aXJlIGFyZ3MKICAgICAgICAgICAgaWYgb3B0aW9uWzFdOgogICAgICAgICAgICAgICAgb3B0X2xhYmVsICs9ICc9JwogICAgICAgICAgICBwcmludChvcHRfbGFiZWwpCiAgICBlbHNlOgogICAgICAgICMgc2hvdyBtYWluIHBhcnNlciBvcHRpb25zIG9ubHkgd2hlbiBuZWNlc3NhcnkKICAgICAgICBpZiBjdXJyZW50LnN0YXJ0c3dpdGgoJy0nKSBvciBjdXJyZW50LnN0YXJ0c3dpdGgoJy0tJyk6CiAgICAgICAgICAgIG9wdHMgPSBbaS5vcHRpb25fbGlzdCBmb3IgaSBpbiBwYXJzZXIub3B0aW9uX2dyb3Vwc10KICAgICAgICAgICAgb3B0cy5hcHBlbmQocGFyc2VyLm9wdGlvbl9saXN0KQogICAgICAgICAgICBvcHRzID0gKG8gZm9yIGl0IGluIG9wdHMgZm9yIG8gaW4gaXQpCgogICAgICAgICAgICBzdWJjb21tYW5kcyArPSBbaS5nZXRfb3B0X3N0cmluZygpIGZvciBpIGluIG9wdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGkuaGVscCAhPSBvcHRwYXJzZS5TVVBQUkVTU19IRUxQXQoKICAgICAgICBwcmludCgnICcuam9pbihbeCBmb3IgeCBpbiBzdWJjb21tYW5kcyBpZiB4LnN0YXJ0c3dpdGgoY3VycmVudCldKSkKICAgIHN5cy5leGl0KDEpCgoKZGVmIGNyZWF0ZV9tYWluX3BhcnNlcigpOgogICAgcGFyc2VyX2t3ID0gewogICAgICAgICd1c2FnZSc6ICdcbiVwcm9nIDxjb21tYW5kPiBbb3B0aW9uc10nLAogICAgICAgICdhZGRfaGVscF9vcHRpb24nOiBGYWxzZSwKICAgICAgICAnZm9ybWF0dGVyJzogVXBkYXRpbmdEZWZhdWx0c0hlbHBGb3JtYXR0ZXIoKSwKICAgICAgICAnbmFtZSc6ICdnbG9iYWwnLAogICAgICAgICdwcm9nJzogZ2V0X3Byb2coKSwKICAgIH0KCiAgICBwYXJzZXIgPSBDb25maWdPcHRpb25QYXJzZXIoKipwYXJzZXJfa3cpCiAgICBwYXJzZXIuZGlzYWJsZV9pbnRlcnNwZXJzZWRfYXJncygpCgogICAgcGlwX3BrZ19kaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpKQogICAgcGFyc2VyLnZlcnNpb24gPSAncGlwICVzIGZyb20gJXMgKHB5dGhvbiAlcyknICUgKAogICAgICAgIF9fdmVyc2lvbl9fLCBwaXBfcGtnX2Rpciwgc3lzLnZlcnNpb25bOjNdKQoKICAgICMgYWRkIHRoZSBnZW5lcmFsIG9wdGlvbnMKICAgIGdlbl9vcHRzID0gY21kb3B0aW9ucy5tYWtlX29wdGlvbl9ncm91cChjbWRvcHRpb25zLmdlbmVyYWxfZ3JvdXAsIHBhcnNlcikKICAgIHBhcnNlci5hZGRfb3B0aW9uX2dyb3VwKGdlbl9vcHRzKQoKICAgIHBhcnNlci5tYWluID0gVHJ1ZSAgIyBzbyB0aGUgaGVscCBmb3JtYXR0ZXIga25vd3MKCiAgICAjIGNyZWF0ZSBjb21tYW5kIGxpc3RpbmcgZm9yIGRlc2NyaXB0aW9uCiAgICBjb21tYW5kX3N1bW1hcmllcyA9IGdldF9zdW1tYXJpZXMoKQogICAgZGVzY3JpcHRpb24gPSBbJyddICsgWyclLTI3cyAlcycgJSAoaSwgaikgZm9yIGksIGogaW4gY29tbWFuZF9zdW1tYXJpZXNdCiAgICBwYXJzZXIuZGVzY3JpcHRpb24gPSAnXG4nLmpvaW4oZGVzY3JpcHRpb24pCgogICAgcmV0dXJuIHBhcnNlcgoKCmRlZiBwYXJzZW9wdHMoYXJncyk6CiAgICBwYXJzZXIgPSBjcmVhdGVfbWFpbl9wYXJzZXIoKQoKICAgICMgTm90ZTogcGFyc2VyIGNhbGxzIGRpc2FibGVfaW50ZXJzcGVyc2VkX2FyZ3MoKSwgc28gdGhlIHJlc3VsdCBvZiB0aGlzCiAgICAjIGNhbGwgaXMgdG8gc3BsaXQgdGhlIGluaXRpYWwgYXJncyBpbnRvIHRoZSBnZW5lcmFsIG9wdGlvbnMgYmVmb3JlIHRoZQogICAgIyBzdWJjb21tYW5kIGFuZCBldmVyeXRoaW5nIGVsc2UuCiAgICAjIEZvciBleGFtcGxlOgogICAgIyAgYXJnczogWyctLXRpbWVvdXQ9NScsICdpbnN0YWxsJywgJy0tdXNlcicsICdJTklUb29scyddCiAgICAjICBnZW5lcmFsX29wdGlvbnM6IFsnLS10aW1lb3V0PT01J10KICAgICMgIGFyZ3NfZWxzZTogWydpbnN0YWxsJywgJy0tdXNlcicsICdJTklUb29scyddCiAgICBnZW5lcmFsX29wdGlvbnMsIGFyZ3NfZWxzZSA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3MpCgogICAgIyAtLXZlcnNpb24KICAgIGlmIGdlbmVyYWxfb3B0aW9ucy52ZXJzaW9uOgogICAgICAgIHN5cy5zdGRvdXQud3JpdGUocGFyc2VyLnZlcnNpb24pCiAgICAgICAgc3lzLnN0ZG91dC53cml0ZShvcy5saW5lc2VwKQogICAgICAgIHN5cy5leGl0KCkKCiAgICAjIHBpcCB8fCBwaXAgaGVscCAtPiBwcmludF9oZWxwKCkKICAgIGlmIG5vdCBhcmdzX2Vsc2Ugb3IgKGFyZ3NfZWxzZVswXSA9PSAnaGVscCcgYW5kIGxlbihhcmdzX2Vsc2UpID09IDEpOgogICAgICAgIHBhcnNlci5wcmludF9oZWxwKCkKICAgICAgICBzeXMuZXhpdCgpCgogICAgIyB0aGUgc3ViY29tbWFuZCBuYW1lCiAgICBjbWRfbmFtZSA9IGFyZ3NfZWxzZVswXQoKICAgIGlmIGNtZF9uYW1lIG5vdCBpbiBjb21tYW5kc19kaWN0OgogICAgICAgIGd1ZXNzID0gZ2V0X3NpbWlsYXJfY29tbWFuZHMoY21kX25hbWUpCgogICAgICAgIG1zZyA9IFsndW5rbm93biBjb21tYW5kICIlcyInICUgY21kX25hbWVdCiAgICAgICAgaWYgZ3Vlc3M6CiAgICAgICAgICAgIG1zZy5hcHBlbmQoJ21heWJlIHlvdSBtZWFudCAiJXMiJyAlIGd1ZXNzKQoKICAgICAgICByYWlzZSBDb21tYW5kRXJyb3IoJyAtICcuam9pbihtc2cpKQoKICAgICMgYWxsIHRoZSBhcmdzIHdpdGhvdXQgdGhlIHN1YmNvbW1hbmQKICAgIGNtZF9hcmdzID0gYXJnc1s6XQogICAgY21kX2FyZ3MucmVtb3ZlKGNtZF9uYW1lKQoKICAgIHJldHVybiBjbWRfbmFtZSwgY21kX2FyZ3MKCgpkZWYgY2hlY2tfaXNvbGF0ZWQoYXJncyk6CiAgICBpc29sYXRlZCA9IEZhbHNlCgogICAgaWYgIi0taXNvbGF0ZWQiIGluIGFyZ3M6CiAgICAgICAgaXNvbGF0ZWQgPSBUcnVlCgogICAgcmV0dXJuIGlzb2xhdGVkCgoKZGVmIG1haW4oYXJncz1Ob25lKToKICAgIGlmIGFyZ3MgaXMgTm9uZToKICAgICAgICBhcmdzID0gc3lzLmFyZ3ZbMTpdCgogICAgIyBDb25maWd1cmUgb3VyIGRlcHJlY2F0aW9uIHdhcm5pbmdzIHRvIGJlIHNlbnQgdGhyb3VnaCBsb2dnZXJzCiAgICBkZXByZWNhdGlvbi5pbnN0YWxsX3dhcm5pbmdfbG9nZ2VyKCkKCiAgICBhdXRvY29tcGxldGUoKQoKICAgIHRyeToKICAgICAgICBjbWRfbmFtZSwgY21kX2FyZ3MgPSBwYXJzZW9wdHMoYXJncykKICAgIGV4Y2VwdCBQaXBFcnJvciBhcyBleGM6CiAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiRVJST1I6ICVzIiAlIGV4YykKICAgICAgICBzeXMuc3RkZXJyLndyaXRlKG9zLmxpbmVzZXApCiAgICAgICAgc3lzLmV4aXQoMSkKCiAgICAjIE5lZWRlZCBmb3IgbG9jYWxlLmdldHByZWZlcnJlZGVuY29kaW5nKEZhbHNlKSB0byB3b3JrCiAgICAjIGluIHBpcC51dGlscy5lbmNvZGluZy5hdXRvX2RlY29kZQogICAgdHJ5OgogICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0FMTCwgJycpCiAgICBleGNlcHQgbG9jYWxlLkVycm9yIGFzIGU6CiAgICAgICAgIyBzZXRsb2NhbGUgY2FuIGFwcGFyZW50bHkgY3Jhc2ggaWYgbG9jYWxlIGFyZSB1bmluaXRpYWxpemVkCiAgICAgICAgbG9nZ2VyLmRlYnVnKCJJZ25vcmluZyBlcnJvciAlcyB3aGVuIHNldHRpbmcgbG9jYWxlIiwgZSkKICAgIGNvbW1hbmQgPSBjb21tYW5kc19kaWN0W2NtZF9uYW1lXShpc29sYXRlZD1jaGVja19pc29sYXRlZChjbWRfYXJncykpCiAgICByZXR1cm4gY29tbWFuZC5tYWluKGNtZF9hcmdzKQoKCiMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAjIFdyaXRpbmcgZnJlZXplIGZpbGVzCgpjbGFzcyBGcm96ZW5SZXF1aXJlbWVudChvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCByZXEsIGVkaXRhYmxlLCBjb21tZW50cz0oKSk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgIHNlbGYucmVxID0gcmVxCiAgICAgICAgc2VsZi5lZGl0YWJsZSA9IGVkaXRhYmxlCiAgICAgICAgc2VsZi5jb21tZW50cyA9IGNvbW1lbnRzCgogICAgX3Jldl9yZSA9IHJlLmNvbXBpbGUocictcihcZCspJCcpCiAgICBfZGF0ZV9yZSA9IHJlLmNvbXBpbGUocictKDIwXGRcZFxkXGRcZFxkKSQnKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fZGlzdChjbHMsIGRpc3QsIGRlcGVuZGVuY3lfbGlua3MpOgogICAgICAgIGxvY2F0aW9uID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLmFic3BhdGgoZGlzdC5sb2NhdGlvbikpCiAgICAgICAgY29tbWVudHMgPSBbXQogICAgICAgIGZyb20gcGlwLnZjcyBpbXBvcnQgdmNzLCBnZXRfc3JjX3JlcXVpcmVtZW50CiAgICAgICAgaWYgZGlzdF9pc19lZGl0YWJsZShkaXN0KSBhbmQgdmNzLmdldF9iYWNrZW5kX25hbWUobG9jYXRpb24pOgogICAgICAgICAgICBlZGl0YWJsZSA9IFRydWUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVxID0gZ2V0X3NyY19yZXF1aXJlbWVudChkaXN0LCBsb2NhdGlvbikKICAgICAgICAgICAgZXhjZXB0IEluc3RhbGxhdGlvbkVycm9yIGFzIGV4YzoKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGVuIHRyeWluZyB0byBnZXQgcmVxdWlyZW1lbnQgZm9yIFZDUyBzeXN0ZW0gJXMsICIKICAgICAgICAgICAgICAgICAgICAiZmFsbGluZyBiYWNrIHRvIHVuZWRpdGFibGUgZm9ybWF0IiwgZXhjCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICByZXEgPSBOb25lCiAgICAgICAgICAgIGlmIHJlcSBpcyBOb25lOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBkZXRlcm1pbmUgcmVwb3NpdG9yeSBsb2NhdGlvbiBvZiAlcycsIGxvY2F0aW9uCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBjb21tZW50cy5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgJyMjICEhIENvdWxkIG5vdCBkZXRlcm1pbmUgcmVwb3NpdG9yeSBsb2NhdGlvbicKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJlcSA9IGRpc3QuYXNfcmVxdWlyZW1lbnQoKQogICAgICAgICAgICAgICAgZWRpdGFibGUgPSBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGVkaXRhYmxlID0gRmFsc2UKICAgICAgICAgICAgcmVxID0gZGlzdC5hc19yZXF1aXJlbWVudCgpCiAgICAgICAgICAgIHNwZWNzID0gcmVxLnNwZWNzCiAgICAgICAgICAgIGFzc2VydCBsZW4oc3BlY3MpID09IDEgYW5kIHNwZWNzWzBdWzBdIGluIFsiPT0iLCAiPT09Il0sIFwKICAgICAgICAgICAgICAgICdFeHBlY3RlZCAxIHNwZWMgd2l0aCA9PSBvciA9PT07IHNwZWNzID0gJXI7IGRpc3QgPSAlcicgJSBcCiAgICAgICAgICAgICAgICAoc3BlY3MsIGRpc3QpCiAgICAgICAgICAgIHZlcnNpb24gPSBzcGVjc1swXVsxXQogICAgICAgICAgICB2ZXJfbWF0Y2ggPSBjbHMuX3Jldl9yZS5zZWFyY2godmVyc2lvbikKICAgICAgICAgICAgZGF0ZV9tYXRjaCA9IGNscy5fZGF0ZV9yZS5zZWFyY2godmVyc2lvbikKICAgICAgICAgICAgaWYgdmVyX21hdGNoIG9yIGRhdGVfbWF0Y2g6CiAgICAgICAgICAgICAgICBzdm5fYmFja2VuZCA9IHZjcy5nZXRfYmFja2VuZCgnc3ZuJykKICAgICAgICAgICAgICAgIGlmIHN2bl9iYWNrZW5kOgogICAgICAgICAgICAgICAgICAgIHN2bl9sb2NhdGlvbiA9IHN2bl9iYWNrZW5kKCkuZ2V0X2xvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICBkaXN0LAogICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5X2xpbmtzLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIG5vdCBzdm5fbG9jYXRpb246CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICdXYXJuaW5nOiBjYW5ub3QgZmluZCBzdm4gbG9jYXRpb24gZm9yICVzJywgcmVxKQogICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgJyMjIEZJWE1FOiBjb3VsZCBub3QgZmluZCBzdm4gVVJMIGluIGRlcGVuZGVuY3lfbGlua3MgJwogICAgICAgICAgICAgICAgICAgICAgICAnZm9yIHRoaXMgcGFja2FnZTonCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjb21tZW50cy5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICcjIEluc3RhbGxpbmcgYXMgZWRpdGFibGUgdG8gc2F0aXNmeSByZXF1aXJlbWVudCAlczonICUKICAgICAgICAgICAgICAgICAgICAgICAgcmVxCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGlmIHZlcl9tYXRjaDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV2ID0gdmVyX21hdGNoLmdyb3VwKDEpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgcmV2ID0gJ3slc30nICUgZGF0ZV9tYXRjaC5ncm91cCgxKQogICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIHJlcSA9ICclc0AlcyNlZ2c9JXMnICUgKAogICAgICAgICAgICAgICAgICAgICAgICBzdm5fbG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIHJldiwKICAgICAgICAgICAgICAgICAgICAgICAgY2xzLmVnZ19uYW1lKGRpc3QpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgIHJldHVybiBjbHMoZGlzdC5wcm9qZWN0X25hbWUsIHJlcSwgZWRpdGFibGUsIGNvbW1lbnRzKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBlZ2dfbmFtZShkaXN0KToKICAgICAgICBuYW1lID0gZGlzdC5lZ2dfbmFtZSgpCiAgICAgICAgbWF0Y2ggPSByZS5zZWFyY2gocictcHlcZFwuXGQkJywgbmFtZSkKICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgbmFtZSA9IG5hbWVbOm1hdGNoLnN0YXJ0KCldCiAgICAgICAgcmV0dXJuIG5hbWUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXEgPSBzZWxmLnJlcQogICAgICAgIGlmIHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgIHJlcSA9ICctZSAlcycgJSByZXEKICAgICAgICByZXR1cm4gJ1xuJy5qb2luKGxpc3Qoc2VsZi5jb21tZW50cykgKyBbc3RyKHJlcSldKSArICdcbicKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgc3lzLmV4aXQobWFpbigpKQpQSwMEFAAAAAAAAAAhAEtJpGVIAgAASAIAAB8AAABweXBpX19waXBfOV8wXzMvcGlwL19fbWFpbl9fLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBvcwppbXBvcnQgc3lzCgojIElmIHdlIGFyZSBydW5uaW5nIGZyb20gYSB3aGVlbCwgYWRkIHRoZSB3aGVlbCB0byBzeXMucGF0aAojIFRoaXMgYWxsb3dzIHRoZSB1c2FnZSBweXRob24gcGlwLSoud2hsL3BpcCBpbnN0YWxsIHBpcC0qLndobAppZiBfX3BhY2thZ2VfXyA9PSAnJzoKICAgICMgX19maWxlX18gaXMgcGlwLSoud2hsL3BpcC9fX21haW5fXy5weQogICAgIyBmaXJzdCBkaXJuYW1lIGNhbGwgc3RyaXBzIG9mICcvX19tYWluX18ucHknLCBzZWNvbmQgc3RyaXBzIG9mZiAnL3BpcCcKICAgICMgUmVzdWx0aW5nIHBhdGggaXMgdGhlIG5hbWUgb2YgdGhlIHdoZWVsIGl0c2VsZgogICAgIyBBZGQgdGhhdCB0byBzeXMucGF0aCBzbyB3ZSBjYW4gaW1wb3J0IHBpcAogICAgcGF0aCA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQogICAgc3lzLnBhdGguaW5zZXJ0KDAsIHBhdGgpCgppbXBvcnQgcGlwICAjIG5vcWEKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBzeXMuZXhpdChwaXAubWFpbigpKQpQSwMEFAAAAAAAAAAhAE+9zEg+EgAAPhIAACcAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvX19pbml0X18ucHkiIiIKcGlwLl92ZW5kb3IgaXMgZm9yIHZlbmRvcmluZyBkZXBlbmRlbmNpZXMgb2YgcGlwIHRvIHByZXZlbnQgbmVlZGluZyBwaXAgdG8KZGVwZW5kIG9uIHNvbWV0aGluZyBleHRlcm5hbC4KCkZpbGVzIGluc2lkZSBvZiBwaXAuX3ZlbmRvciBzaG91bGQgYmUgY29uc2lkZXJlZCBpbW11dGFibGUgYW5kIHNob3VsZCBvbmx5IGJlCnVwZGF0ZWQgdG8gdmVyc2lvbnMgZnJvbSB1cHN0cmVhbS4KIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgZ2xvYgppbXBvcnQgb3MucGF0aAppbXBvcnQgc3lzCgojIERvd25zdHJlYW0gcmVkaXN0cmlidXRvcnMgd2hpY2ggaGF2ZSBkZWJ1bmRsZWQgb3VyIGRlcGVuZGVuY2llcyBzaG91bGQgYWxzbwojIHBhdGNoIHRoaXMgdmFsdWUgdG8gYmUgdHJ1ZS4gVGhpcyB3aWxsIHRyaWdnZXIgdGhlIGFkZGl0aW9uYWwgcGF0Y2hpbmcKIyB0byBjYXVzZSB0aGluZ3MgbGlrZSAic2l4IiB0byBiZSBhdmFpbGFibGUgYXMgcGlwLgpERUJVTkRMRUQgPSBGYWxzZQoKIyBCeSBkZWZhdWx0LCBsb29rIGluIHRoaXMgZGlyZWN0b3J5IGZvciBhIGJ1bmNoIG9mIC53aGwgZmlsZXMgd2hpY2ggd2Ugd2lsbAojIGFkZCB0byB0aGUgYmVnaW5uaW5nIG9mIHN5cy5wYXRoIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGltcG9ydCBhbnl0aGluZy4gVGhpcwojIGlzIGRvbmUgdG8gc3VwcG9ydCBkb3duc3RyZWFtIHJlLWRpc3RyaWJ1dG9ycyBsaWtlIERlYmlhbiBhbmQgRmVkb3JhIHdobwojIHdpc2ggdG8gY3JlYXRlIHRoZWlyIG93biBXaGVlbHMgZm9yIG91ciBkZXBlbmRlbmNpZXMgdG8gYWlkIGluIGRlYnVuZGxpbmcuCldIRUVMX0RJUiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQoKCiMgRGVmaW5lIGEgc21hbGwgaGVscGVyIGZ1bmN0aW9uIHRvIGFsaWFzIG91ciB2ZW5kb3JlZCBtb2R1bGVzIHRvIHRoZSByZWFsIG9uZXMKIyBpZiB0aGUgdmVuZG9yZWQgb25lcyBkbyBub3QgZXhpc3QuIFRoaXMgaWRlYSBvZiB0aGlzIHdhcyB0YWtlbiBmcm9tCiMgaHR0cHM6Ly9naXRodWIuY29tL2tlbm5ldGhyZWl0ei9yZXF1ZXN0cy9wdWxsLzI1NjcuCmRlZiB2ZW5kb3JlZChtb2R1bGVuYW1lKToKICAgIHZlbmRvcmVkX25hbWUgPSAiezB9LnsxfSIuZm9ybWF0KF9fbmFtZV9fLCBtb2R1bGVuYW1lKQoKICAgIHRyeToKICAgICAgICBfX2ltcG9ydF9fKHZlbmRvcmVkX25hbWUsIGdsb2JhbHMoKSwgbG9jYWxzKCksIGxldmVsPTApCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBfX2ltcG9ydF9fKG1vZHVsZW5hbWUsIGdsb2JhbHMoKSwgbG9jYWxzKCksIGxldmVsPTApCiAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAjIFdlIGNhbiBqdXN0IHNpbGVudGx5IGFsbG93IGltcG9ydCBmYWlsdXJlcyB0byBwYXNzIGhlcmUuIElmIHdlCiAgICAgICAgICAgICMgZ290IHRvIHRoaXMgcG9pbnQgaXQgbWVhbnMgdGhhdCBgYGltcG9ydCBwaXAuX3ZlbmRvci53aGF0ZXZlcmBgCiAgICAgICAgICAgICMgZmFpbGVkIGFuZCBzbyBkaWQgYGBpbXBvcnQgd2hhdGV2ZXJgYC4gU2luY2Ugd2UncmUgaW1wb3J0aW5nIHRoaXMKICAgICAgICAgICAgIyB1cGZyb250IGluIGFuIGF0dGVtcHQgdG8gYWxpYXMgaW1wb3J0cywgbm90IGVycm9yaW5nIGhlcmUgd2lsbAogICAgICAgICAgICAjIGp1c3QgbWVhbiB3ZSBnZXQgYSByZWd1bGFyIGltcG9ydCBlcnJvciB3aGVuZXZlciBwaXAgKmFjdHVhbGx5KgogICAgICAgICAgICAjIHRyaWVzIHRvIGltcG9ydCBvbmUgb2YgdGhlc2UgbW9kdWxlcyB0byB1c2UgaXQsIHdoaWNoIGFjdHVhbGx5CiAgICAgICAgICAgICMgZ2l2ZXMgdXMgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSB0aGFuIHdlIHdvdWxkIGhhdmUgb3RoZXJ3aXNlCiAgICAgICAgICAgICMgZ290dGVuLgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3lzLm1vZHVsZXNbdmVuZG9yZWRfbmFtZV0gPSBzeXMubW9kdWxlc1ttb2R1bGVuYW1lXQogICAgICAgICAgICBiYXNlLCBoZWFkID0gdmVuZG9yZWRfbmFtZS5yc3BsaXQoIi4iLCAxKQogICAgICAgICAgICBzZXRhdHRyKHN5cy5tb2R1bGVzW2Jhc2VdLCBoZWFkLCBzeXMubW9kdWxlc1ttb2R1bGVuYW1lXSkKCgojIElmIHdlJ3JlIG9wZXJhdGluZyBpbiBhIGRlYnVuZGxlZCBzZXR1cCwgdGhlbiB3ZSB3YW50IHRvIGdvIGFoZWFkIGFuZCB0cmlnZ2VyCiMgdGhlIGFsaWFzaW5nIG9mIG91ciB2ZW5kb3JlZCBsaWJyYXJpZXMgYXMgd2VsbCBhcyBsb29raW5nIGZvciB3aGVlbHMgdG8gYWRkCiMgdG8gb3VyIHN5cy5wYXRoLiBUaGlzIHdpbGwgY2F1c2UgYWxsIG9mIHRoaXMgY29kZSB0byBiZSBhIG5vLW9wIHR5cGljYWxseQojIGhvd2V2ZXIgZG93bnN0cmVhbSByZWRpc3RyaWJ1dG9ycyBjYW4gZW5hYmxlIGl0IGluIGEgY29uc2lzdGVudCB3YXkgYWNyb3NzCiMgYWxsIHBsYXRmb3Jtcy4KaWYgREVCVU5ETEVEOgogICAgIyBBY3R1YWxseSBsb29rIGluc2lkZSBvZiBXSEVFTF9ESVIgdG8gZmluZCAud2hsIGZpbGVzIGFuZCBhZGQgdGhlbSB0byB0aGUKICAgICMgZnJvbnQgb2Ygb3VyIHN5cy5wYXRoLgogICAgc3lzLnBhdGhbOl0gPSBnbG9iLmdsb2Iob3MucGF0aC5qb2luKFdIRUVMX0RJUiwgIioud2hsIikpICsgc3lzLnBhdGgKCiAgICAjIEFjdHVhbGx5IGFsaWFzIGFsbCBvZiBvdXIgdmVuZG9yZWQgZGVwZW5kZW5jaWVzLgogICAgdmVuZG9yZWQoImNhY2hlY29udHJvbCIpCiAgICB2ZW5kb3JlZCgiY29sb3JhbWEiKQogICAgdmVuZG9yZWQoImRpc3RsaWIiKQogICAgdmVuZG9yZWQoImRpc3RybyIpCiAgICB2ZW5kb3JlZCgiaHRtbDVsaWIiKQogICAgdmVuZG9yZWQoImxvY2tmaWxlIikKICAgIHZlbmRvcmVkKCJzaXgiKQogICAgdmVuZG9yZWQoInNpeC5tb3ZlcyIpCiAgICB2ZW5kb3JlZCgic2l4Lm1vdmVzLnVybGxpYiIpCiAgICB2ZW5kb3JlZCgicGFja2FnaW5nIikKICAgIHZlbmRvcmVkKCJwYWNrYWdpbmcudmVyc2lvbiIpCiAgICB2ZW5kb3JlZCgicGFja2FnaW5nLnNwZWNpZmllcnMiKQogICAgdmVuZG9yZWQoInBrZ19yZXNvdXJjZXMiKQogICAgdmVuZG9yZWQoInByb2dyZXNzIikKICAgIHZlbmRvcmVkKCJyZXRyeWluZyIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLl9jb2xsZWN0aW9ucyIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5jb25uZWN0aW9uIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLmNvbm5lY3Rpb25wb29sIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLmNvbnRyaWIiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMuY29udHJpYi5udGxtcG9vbCIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5jb250cmliLnB5b3BlbnNzbCIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5leGNlcHRpb25zIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLmZpZWxkcyIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5maWxlcG9zdCIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5wYWNrYWdlcyIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5wYWNrYWdlcy5vcmRlcmVkX2RpY3QiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMucGFja2FnZXMuc2l4IikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnBhY2thZ2VzLnNzbF9tYXRjaF9ob3N0bmFtZSIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5wYWNrYWdlcy5zc2xfbWF0Y2hfaG9zdG5hbWUuIgogICAgICAgICAgICAgIl9pbXBsZW1lbnRhdGlvbiIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5wb29sbWFuYWdlciIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5yZXF1ZXN0IikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnJlc3BvbnNlIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnV0aWwiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMudXRpbC5jb25uZWN0aW9uIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnV0aWwucmVxdWVzdCIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy51dGlsLnJlc3BvbnNlIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnV0aWwucmV0cnkiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMudXRpbC5zc2xfIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnV0aWwudGltZW91dCIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy51dGlsLnVybCIpClBLAwQUAAAAAAAAACEAhYmWimBXAABgVwAAJgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9hcHBkaXJzLnB5IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogdXRmLTggLSotCiMgQ29weXJpZ2h0IChjKSAyMDA1LTIwMTAgQWN0aXZlU3RhdGUgU29mdHdhcmUgSW5jLgojIENvcHlyaWdodCAoYykgMjAxMyBFZGR5IFBldHJpyJlvcgoKIiIiVXRpbGl0aWVzIGZvciBkZXRlcm1pbmluZyBhcHBsaWNhdGlvbi1zcGVjaWZpYyBkaXJzLgoKU2VlIDxodHRwOi8vZ2l0aHViLmNvbS9BY3RpdmVTdGF0ZS9hcHBkaXJzPiBmb3IgZGV0YWlscyBhbmQgdXNhZ2UuCiIiIgojIERldiBOb3RlczoKIyAtIE1TRE4gb24gd2hlcmUgdG8gc3RvcmUgYXBwIGRhdGEgZmlsZXM6CiMgICBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2RlZmF1bHQuYXNweD9zY2lkPWtiO2VuLXVzOzMxMDI5NCNYU0xUSDMxOTQxMjExMjMxMjAxMjExMjAxMjAKIyAtIG1hY09TOiBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL01hY09TWC9Db25jZXB0dWFsL0JQRmlsZVN5c3RlbS9pbmRleC5odG1sCiMgLSBYREcgc3BlYyBmb3IgVW4qeDogaHR0cDovL3N0YW5kYXJkcy5mcmVlZGVza3RvcC5vcmcvYmFzZWRpci1zcGVjL2Jhc2VkaXItc3BlYy1sYXRlc3QuaHRtbAoKX192ZXJzaW9uX2luZm9fXyA9ICgxLCA0LCAwKQpfX3ZlcnNpb25fXyA9ICcuJy5qb2luKG1hcChzdHIsIF9fdmVyc2lvbl9pbmZvX18pKQoKCmltcG9ydCBzeXMKaW1wb3J0IG9zCgpQWTMgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDMKCmlmIFBZMzoKICAgIHVuaWNvZGUgPSBzdHIKCmlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CiAgICBpbXBvcnQgcGxhdGZvcm0KICAgIG9zX25hbWUgPSBwbGF0Zm9ybS5qYXZhX3ZlcigpWzNdWzBdCiAgICBpZiBvc19uYW1lLnN0YXJ0c3dpdGgoJ1dpbmRvd3MnKTogIyAiV2luZG93cyBYUCIsICJXaW5kb3dzIDciLCBldGMuCiAgICAgICAgc3lzdGVtID0gJ3dpbjMyJwogICAgZWxpZiBvc19uYW1lLnN0YXJ0c3dpdGgoJ01hYycpOiAjICJtYWNPUyIsIGV0Yy4KICAgICAgICBzeXN0ZW0gPSAnZGFyd2luJwogICAgZWxzZTogIyAiTGludXgiLCAiU3VuT1MiLCAiRnJlZUJTRCIsIGV0Yy4KICAgICAgICAjIFNldHRpbmcgdGhpcyB0byAibGludXgyIiBpcyBub3QgaWRlYWwsIGJ1dCBvbmx5IFdpbmRvd3Mgb3IgTWFjCiAgICAgICAgIyBhcmUgYWN0dWFsbHkgY2hlY2tlZCBmb3IgYW5kIHRoZSByZXN0IG9mIHRoZSBtb2R1bGUgZXhwZWN0cwogICAgICAgICMgKnN5cy5wbGF0Zm9ybSogc3R5bGUgc3RyaW5ncy4KICAgICAgICBzeXN0ZW0gPSAnbGludXgyJwplbHNlOgogICAgc3lzdGVtID0gc3lzLnBsYXRmb3JtCgoKCmRlZiB1c2VyX2RhdGFfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgcm9hbWluZz1GYWxzZSk6CiAgICByIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBkYXRhIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAicm9hbWluZyIgKGJvb2xlYW4sIGRlZmF1bHQgRmFsc2UpIGNhbiBiZSBzZXQgVHJ1ZSB0byB1c2UgdGhlIFdpbmRvd3MKICAgICAgICAgICAgcm9hbWluZyBhcHBkYXRhIGRpcmVjdG9yeS4gVGhhdCBtZWFucyB0aGF0IGZvciB1c2VycyBvbiBhIFdpbmRvd3MKICAgICAgICAgICAgbmV0d29yayBzZXR1cCBmb3Igcm9hbWluZyBwcm9maWxlcywgdGhpcyB1c2VyIGRhdGEgd2lsbCBiZQogICAgICAgICAgICBzeW5jJ2Qgb24gbG9naW4uIFNlZQogICAgICAgICAgICA8aHR0cDovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2NjNzY2NDg5KFdTLjEwKS5hc3B4PgogICAgICAgICAgICBmb3IgYSBkaXNjdXNzaW9uIG9mIGlzc3Vlcy4KCiAgICBUeXBpY2FsIHVzZXIgZGF0YSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgbWFjT1M6ICAgICAgICAgICAgICAgICAgfi9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvPEFwcE5hbWU+CiAgICAgICAgVW5peDogICAgICAgICAgICAgICAgICAgfi8ubG9jYWwvc2hhcmUvPEFwcE5hbWU+ICAgICMgb3IgaW4gJFhER19EQVRBX0hPTUUsIGlmIGRlZmluZWQKICAgICAgICBXaW4gWFAgKG5vdCByb2FtaW5nKTogICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXDx1c2VybmFtZT5cQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT4KICAgICAgICBXaW4gWFAgKHJvYW1pbmcpOiAgICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXDx1c2VybmFtZT5cTG9jYWwgU2V0dGluZ3NcQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT4KICAgICAgICBXaW4gNyAgKG5vdCByb2FtaW5nKTogICBDOlxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcTG9jYWxcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CiAgICAgICAgV2luIDcgIChyb2FtaW5nKTogICAgICAgQzpcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXFJvYW1pbmdcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CgogICAgRm9yIFVuaXgsIHdlIGZvbGxvdyB0aGUgWERHIHNwZWMgYW5kIHN1cHBvcnQgJFhER19EQVRBX0hPTUUuCiAgICBUaGF0IG1lYW5zLCBieSBkZWZhdWx0ICJ+Ly5sb2NhbC9zaGFyZS88QXBwTmFtZT4iLgogICAgIiIiCiAgICBpZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgICAgICBpZiBhcHBhdXRob3IgaXMgTm9uZToKICAgICAgICAgICAgYXBwYXV0aG9yID0gYXBwbmFtZQogICAgICAgIGNvbnN0ID0gcm9hbWluZyBhbmQgIkNTSURMX0FQUERBVEEiIG9yICJDU0lETF9MT0NBTF9BUFBEQVRBIgogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKF9nZXRfd2luX2ZvbGRlcihjb25zdCkpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgYXBwYXV0aG9yIGlzIG5vdCBGYWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwYXV0aG9yLCBhcHBuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxpZiBzeXN0ZW0gPT0gJ2Rhcndpbic6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguZXhwYW5kdXNlcignfi9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvJykKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19EQVRBX0hPTUUnLCBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vLmxvY2FsL3NoYXJlIikpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmRlZiBzaXRlX2RhdGFfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgbXVsdGlwYXRoPUZhbHNlKToKICAgICIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc2hhcmVkIGRhdGEgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJtdWx0aXBhdGgiIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBvbmx5IGFwcGxpY2FibGUgdG8gKm5peAogICAgICAgICAgICB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50aXJlIGxpc3Qgb2YgZGF0YSBkaXJzIHNob3VsZCBiZQogICAgICAgICAgICByZXR1cm5lZC4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGl0ZW0gZnJvbSBYREdfREFUQV9ESVJTIGlzCiAgICAgICAgICAgIHJldHVybmVkLCBvciAnL3Vzci9sb2NhbC9zaGFyZS88QXBwTmFtZT4nLAogICAgICAgICAgICBpZiBYREdfREFUQV9ESVJTIGlzIG5vdCBzZXQKCiAgICBUeXBpY2FsIHVzZXIgZGF0YSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgbWFjT1M6ICAgICAgL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICAvdXNyL2xvY2FsL3NoYXJlLzxBcHBOYW1lPiBvciAvdXNyL3NoYXJlLzxBcHBOYW1lPgogICAgICAgIFdpbiBYUDogICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcQWxsIFVzZXJzXEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CiAgICAgICAgVmlzdGE6ICAgICAgKEZhaWwhICJDOlxQcm9ncmFtRGF0YSIgaXMgYSBoaWRkZW4gKnN5c3RlbSogZGlyZWN0b3J5IG9uIFZpc3RhLikKICAgICAgICBXaW4gNzogICAgICBDOlxQcm9ncmFtRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT4gICAjIEhpZGRlbiwgYnV0IHdyaXRlYWJsZSBvbiBXaW4gNy4KCiAgICBGb3IgVW5peCwgdGhpcyBpcyB1c2luZyB0aGUgJFhER19EQVRBX0RJUlNbMF0gZGVmYXVsdC4KCiAgICBXQVJOSU5HOiBEbyBub3QgdXNlIHRoaXMgb24gV2luZG93cy4gU2VlIHRoZSBWaXN0YS1GYWlsIG5vdGUgYWJvdmUgZm9yIHdoeS4KICAgICIiIgogICAgaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICAgICAgaWYgYXBwYXV0aG9yIGlzIE5vbmU6CiAgICAgICAgICAgIGFwcGF1dGhvciA9IGFwcG5hbWUKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChfZ2V0X3dpbl9mb2xkZXIoIkNTSURMX0NPTU1PTl9BUFBEQVRBIikpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgYXBwYXV0aG9yIGlzIG5vdCBGYWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwYXV0aG9yLCBhcHBuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxpZiBzeXN0ZW0gPT0gJ2Rhcndpbic6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguZXhwYW5kdXNlcignL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydCcpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxzZToKICAgICAgICAjIFhERyBkZWZhdWx0IGZvciAkWERHX0RBVEFfRElSUwogICAgICAgICMgb25seSBmaXJzdCwgaWYgbXVsdGlwYXRoIGlzIEZhbHNlCiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0RBVEFfRElSUycsCiAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoc2VwLmpvaW4oWycvdXNyL2xvY2FsL3NoYXJlJywgJy91c3Ivc2hhcmUnXSkpCiAgICAgICAgcGF0aGxpc3QgPSBbb3MucGF0aC5leHBhbmR1c2VyKHgucnN0cmlwKG9zLnNlcCkpIGZvciB4IGluIHBhdGguc3BsaXQob3MucGF0aHNlcCldCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgdmVyc2lvbjoKICAgICAgICAgICAgICAgIGFwcG5hbWUgPSBvcy5wYXRoLmpvaW4oYXBwbmFtZSwgdmVyc2lvbikKICAgICAgICAgICAgcGF0aGxpc3QgPSBbb3Muc2VwLmpvaW4oW3gsIGFwcG5hbWVdKSBmb3IgeCBpbiBwYXRobGlzdF0KCiAgICAgICAgaWYgbXVsdGlwYXRoOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aHNlcC5qb2luKHBhdGhsaXN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhdGggPSBwYXRobGlzdFswXQogICAgICAgIHJldHVybiBwYXRoCgogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmRlZiB1c2VyX2NvbmZpZ19kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCByb2FtaW5nPUZhbHNlKToKICAgIHIiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGNvbmZpZyBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgInJvYW1pbmciIChib29sZWFuLCBkZWZhdWx0IEZhbHNlKSBjYW4gYmUgc2V0IFRydWUgdG8gdXNlIHRoZSBXaW5kb3dzCiAgICAgICAgICAgIHJvYW1pbmcgYXBwZGF0YSBkaXJlY3RvcnkuIFRoYXQgbWVhbnMgdGhhdCBmb3IgdXNlcnMgb24gYSBXaW5kb3dzCiAgICAgICAgICAgIG5ldHdvcmsgc2V0dXAgZm9yIHJvYW1pbmcgcHJvZmlsZXMsIHRoaXMgdXNlciBkYXRhIHdpbGwgYmUKICAgICAgICAgICAgc3luYydkIG9uIGxvZ2luLiBTZWUKICAgICAgICAgICAgPGh0dHA6Ly90ZWNobmV0Lm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9jYzc2NjQ4OShXUy4xMCkuYXNweD4KICAgICAgICAgICAgZm9yIGEgZGlzY3Vzc2lvbiBvZiBpc3N1ZXMuCgogICAgVHlwaWNhbCB1c2VyIGRhdGEgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIG1hY09TOiAgICAgICAgICAgICAgICAgIHNhbWUgYXMgdXNlcl9kYXRhX2RpcgogICAgICAgIFVuaXg6ICAgICAgICAgICAgICAgICAgIH4vLmNvbmZpZy88QXBwTmFtZT4gICAgICMgb3IgaW4gJFhER19DT05GSUdfSE9NRSwgaWYgZGVmaW5lZAogICAgICAgIFdpbiAqOiAgICAgICAgICAgICAgICAgIHNhbWUgYXMgdXNlcl9kYXRhX2RpcgoKICAgIEZvciBVbml4LCB3ZSBmb2xsb3cgdGhlIFhERyBzcGVjIGFuZCBzdXBwb3J0ICRYREdfQ09ORklHX0hPTUUuCiAgICBUaGF0IG1lYW5zLCBieSBkZWFmdWx0ICJ+Ly5jb25maWcvPEFwcE5hbWU+Ii4KICAgICIiIgogICAgaWYgc3lzdGVtIGluIFsid2luMzIiLCAiZGFyd2luIl06CiAgICAgICAgcGF0aCA9IHVzZXJfZGF0YV9kaXIoYXBwbmFtZSwgYXBwYXV0aG9yLCBOb25lLCByb2FtaW5nKQogICAgZWxzZToKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfQ09ORklHX0hPTUUnLCBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vLmNvbmZpZyIpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpkZWYgc2l0ZV9jb25maWdfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgbXVsdGlwYXRoPUZhbHNlKToKICAgICIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc2hhcmVkIGRhdGEgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJtdWx0aXBhdGgiIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBvbmx5IGFwcGxpY2FibGUgdG8gKm5peAogICAgICAgICAgICB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50aXJlIGxpc3Qgb2YgY29uZmlnIGRpcnMgc2hvdWxkIGJlCiAgICAgICAgICAgIHJldHVybmVkLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgaXRlbSBmcm9tIFhER19DT05GSUdfRElSUyBpcwogICAgICAgICAgICByZXR1cm5lZCwgb3IgJy9ldGMveGRnLzxBcHBOYW1lPicsIGlmIFhER19DT05GSUdfRElSUyBpcyBub3Qgc2V0CgogICAgVHlwaWNhbCB1c2VyIGRhdGEgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIG1hY09TOiAgICAgIHNhbWUgYXMgc2l0ZV9kYXRhX2RpcgogICAgICAgIFVuaXg6ICAgICAgIC9ldGMveGRnLzxBcHBOYW1lPiBvciAkWERHX0NPTkZJR19ESVJTW2ldLzxBcHBOYW1lPiBmb3IgZWFjaCB2YWx1ZSBpbgogICAgICAgICAgICAgICAgICAgICRYREdfQ09ORklHX0RJUlMKICAgICAgICBXaW4gKjogICAgICBzYW1lIGFzIHNpdGVfZGF0YV9kaXIKICAgICAgICBWaXN0YTogICAgICAoRmFpbCEgIkM6XFByb2dyYW1EYXRhIiBpcyBhIGhpZGRlbiAqc3lzdGVtKiBkaXJlY3Rvcnkgb24gVmlzdGEuKQoKICAgIEZvciBVbml4LCB0aGlzIGlzIHVzaW5nIHRoZSAkWERHX0NPTkZJR19ESVJTWzBdIGRlZmF1bHQsIGlmIG11bHRpcGF0aD1GYWxzZQoKICAgIFdBUk5JTkc6IERvIG5vdCB1c2UgdGhpcyBvbiBXaW5kb3dzLiBTZWUgdGhlIFZpc3RhLUZhaWwgbm90ZSBhYm92ZSBmb3Igd2h5LgogICAgIiIiCiAgICBpZiBzeXN0ZW0gaW4gWyJ3aW4zMiIsICJkYXJ3aW4iXToKICAgICAgICBwYXRoID0gc2l0ZV9kYXRhX2RpcihhcHBuYW1lLCBhcHBhdXRob3IpCiAgICAgICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgZWxzZToKICAgICAgICAjIFhERyBkZWZhdWx0IGZvciAkWERHX0NPTkZJR19ESVJTCiAgICAgICAgIyBvbmx5IGZpcnN0LCBpZiBtdWx0aXBhdGggaXMgRmFsc2UKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfQ09ORklHX0RJUlMnLCAnL2V0Yy94ZGcnKQogICAgICAgIHBhdGhsaXN0ID0gW29zLnBhdGguZXhwYW5kdXNlcih4LnJzdHJpcChvcy5zZXApKSBmb3IgeCBpbiBwYXRoLnNwbGl0KG9zLnBhdGhzZXApXQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIHZlcnNpb246CiAgICAgICAgICAgICAgICBhcHBuYW1lID0gb3MucGF0aC5qb2luKGFwcG5hbWUsIHZlcnNpb24pCiAgICAgICAgICAgIHBhdGhsaXN0ID0gW29zLnNlcC5qb2luKFt4LCBhcHBuYW1lXSkgZm9yIHggaW4gcGF0aGxpc3RdCgogICAgICAgIGlmIG11bHRpcGF0aDoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGhzZXAuam9pbihwYXRobGlzdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXRoID0gcGF0aGxpc3RbMF0KICAgIHJldHVybiBwYXRoCgoKZGVmIHVzZXJfY2FjaGVfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgb3Bpbmlvbj1UcnVlKToKICAgIHIiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGNhY2hlIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAib3BpbmlvbiIgKGJvb2xlYW4pIGNhbiBiZSBGYWxzZSB0byBkaXNhYmxlIHRoZSBhcHBlbmRpbmcgb2YKICAgICAgICAgICAgIkNhY2hlIiB0byB0aGUgYmFzZSBhcHAgZGF0YSBkaXIgZm9yIFdpbmRvd3MuIFNlZQogICAgICAgICAgICBkaXNjdXNzaW9uIGJlbG93LgoKICAgIFR5cGljYWwgdXNlciBjYWNoZSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgbWFjT1M6ICAgICAgfi9MaWJyYXJ5L0NhY2hlcy88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICB+Ly5jYWNoZS88QXBwTmFtZT4gKFhERyBkZWZhdWx0KQogICAgICAgIFdpbiBYUDogICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlxMb2NhbCBTZXR0aW5nc1xBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPlxDYWNoZQogICAgICAgIFZpc3RhOiAgICAgIEM6XFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxMb2NhbFw8QXBwQXV0aG9yPlw8QXBwTmFtZT5cQ2FjaGUKCiAgICBPbiBXaW5kb3dzIHRoZSBvbmx5IHN1Z2dlc3Rpb24gaW4gdGhlIE1TRE4gZG9jcyBpcyB0aGF0IGxvY2FsIHNldHRpbmdzIGdvIGluCiAgICB0aGUgYENTSURMX0xPQ0FMX0FQUERBVEFgIGRpcmVjdG9yeS4gVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIG5vbi1yb2FtaW5nCiAgICBhcHAgZGF0YSBkaXIgKHRoZSBkZWZhdWx0IHJldHVybmVkIGJ5IGB1c2VyX2RhdGFfZGlyYCBhYm92ZSkuIEFwcHMgdHlwaWNhbGx5CiAgICBwdXQgY2FjaGUgZGF0YSBzb21ld2hlcmUgKnVuZGVyKiB0aGUgZ2l2ZW4gZGlyIGhlcmUuIFNvbWUgZXhhbXBsZXM6CiAgICAgICAgLi4uXE1vemlsbGFcRmlyZWZveFxQcm9maWxlc1w8UHJvZmlsZU5hbWU+XENhY2hlCiAgICAgICAgLi4uXEFjbWVcU3VwZXJBcHBcQ2FjaGVcMS4wCiAgICBPUElOSU9OOiBUaGlzIGZ1bmN0aW9uIGFwcGVuZHMgIkNhY2hlIiB0byB0aGUgYENTSURMX0xPQ0FMX0FQUERBVEFgIHZhbHVlLgogICAgVGhpcyBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUgYG9waW5pb249RmFsc2VgIG9wdGlvbi4KICAgICIiIgogICAgaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICAgICAgaWYgYXBwYXV0aG9yIGlzIE5vbmU6CiAgICAgICAgICAgIGFwcGF1dGhvciA9IGFwcG5hbWUKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChfZ2V0X3dpbl9mb2xkZXIoIkNTSURMX0xPQ0FMX0FQUERBVEEiKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiBhcHBhdXRob3IgaXMgbm90IEZhbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBhdXRob3IsIGFwcG5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICAgICAgICAgIGlmIG9waW5pb246CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICJDYWNoZSIpCiAgICBlbGlmIHN5c3RlbSA9PSAnZGFyd2luJzoKICAgICAgICBwYXRoID0gb3MucGF0aC5leHBhbmR1c2VyKCd+L0xpYnJhcnkvQ2FjaGVzJykKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19DQUNIRV9IT01FJywgb3MucGF0aC5leHBhbmR1c2VyKCd+Ly5jYWNoZScpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpkZWYgdXNlcl9sb2dfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgb3Bpbmlvbj1UcnVlKToKICAgIHIiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGxvZyBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgIm9waW5pb24iIChib29sZWFuKSBjYW4gYmUgRmFsc2UgdG8gZGlzYWJsZSB0aGUgYXBwZW5kaW5nIG9mCiAgICAgICAgICAgICJMb2dzIiB0byB0aGUgYmFzZSBhcHAgZGF0YSBkaXIgZm9yIFdpbmRvd3MsIGFuZCAibG9nIiB0byB0aGUKICAgICAgICAgICAgYmFzZSBjYWNoZSBkaXIgZm9yIFVuaXguIFNlZSBkaXNjdXNzaW9uIGJlbG93LgoKICAgIFR5cGljYWwgdXNlciBjYWNoZSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgbWFjT1M6ICAgICAgfi9MaWJyYXJ5L0xvZ3MvPEFwcE5hbWU+CiAgICAgICAgVW5peDogICAgICAgfi8uY2FjaGUvPEFwcE5hbWU+L2xvZyAgIyBvciB1bmRlciAkWERHX0NBQ0hFX0hPTUUgaWYgZGVmaW5lZAogICAgICAgIFdpbiBYUDogICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlxMb2NhbCBTZXR0aW5nc1xBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPlxMb2dzCiAgICAgICAgVmlzdGE6ICAgICAgQzpcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXExvY2FsXDxBcHBBdXRob3I+XDxBcHBOYW1lPlxMb2dzCgogICAgT24gV2luZG93cyB0aGUgb25seSBzdWdnZXN0aW9uIGluIHRoZSBNU0ROIGRvY3MgaXMgdGhhdCBsb2NhbCBzZXR0aW5ncwogICAgZ28gaW4gdGhlIGBDU0lETF9MT0NBTF9BUFBEQVRBYCBkaXJlY3RvcnkuIChOb3RlOiBJJ20gaW50ZXJlc3RlZCBpbgogICAgZXhhbXBsZXMgb2Ygd2hhdCBzb21lIHdpbmRvd3MgYXBwcyB1c2UgZm9yIGEgbG9ncyBkaXIuKQoKICAgIE9QSU5JT046IFRoaXMgZnVuY3Rpb24gYXBwZW5kcyAiTG9ncyIgdG8gdGhlIGBDU0lETF9MT0NBTF9BUFBEQVRBYAogICAgdmFsdWUgZm9yIFdpbmRvd3MgYW5kIGFwcGVuZHMgImxvZyIgdG8gdGhlIHVzZXIgY2FjaGUgZGlyIGZvciBVbml4LgogICAgVGhpcyBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUgYG9waW5pb249RmFsc2VgIG9wdGlvbi4KICAgICIiIgogICAgaWYgc3lzdGVtID09ICJkYXJ3aW4iOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIG9zLnBhdGguZXhwYW5kdXNlcignfi9MaWJyYXJ5L0xvZ3MnKSwKICAgICAgICAgICAgYXBwbmFtZSkKICAgIGVsaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICAgICAgcGF0aCA9IHVzZXJfZGF0YV9kaXIoYXBwbmFtZSwgYXBwYXV0aG9yLCB2ZXJzaW9uKQogICAgICAgIHZlcnNpb24gPSBGYWxzZQogICAgICAgIGlmIG9waW5pb246CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgIkxvZ3MiKQogICAgZWxzZToKICAgICAgICBwYXRoID0gdXNlcl9jYWNoZV9kaXIoYXBwbmFtZSwgYXBwYXV0aG9yLCB2ZXJzaW9uKQogICAgICAgIHZlcnNpb24gPSBGYWxzZQogICAgICAgIGlmIG9waW5pb246CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgImxvZyIpCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKY2xhc3MgQXBwRGlycyhvYmplY3QpOgogICAgIiIiQ29udmVuaWVuY2Ugd3JhcHBlciBmb3IgZ2V0dGluZyBhcHBsaWNhdGlvbiBkaXJzLiIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFwcG5hbWUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIHJvYW1pbmc9RmFsc2UsCiAgICAgICAgICAgICAgICAgbXVsdGlwYXRoPUZhbHNlKToKICAgICAgICBzZWxmLmFwcG5hbWUgPSBhcHBuYW1lCiAgICAgICAgc2VsZi5hcHBhdXRob3IgPSBhcHBhdXRob3IKICAgICAgICBzZWxmLnZlcnNpb24gPSB2ZXJzaW9uCiAgICAgICAgc2VsZi5yb2FtaW5nID0gcm9hbWluZwogICAgICAgIHNlbGYubXVsdGlwYXRoID0gbXVsdGlwYXRoCgogICAgQHByb3BlcnR5CiAgICBkZWYgdXNlcl9kYXRhX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gdXNlcl9kYXRhX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uLCByb2FtaW5nPXNlbGYucm9hbWluZykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzaXRlX2RhdGFfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiBzaXRlX2RhdGFfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24sIG11bHRpcGF0aD1zZWxmLm11bHRpcGF0aCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1c2VyX2NvbmZpZ19kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHVzZXJfY29uZmlnX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24sIHJvYW1pbmc9c2VsZi5yb2FtaW5nKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNpdGVfY29uZmlnX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gc2l0ZV9jb25maWdfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24sIG11bHRpcGF0aD1zZWxmLm11bHRpcGF0aCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1c2VyX2NhY2hlX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gdXNlcl9jYWNoZV9kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24pCgogICAgQHByb3BlcnR5CiAgICBkZWYgdXNlcl9sb2dfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiB1c2VyX2xvZ19kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uKQoKCiMtLS0tIGludGVybmFsIHN1cHBvcnQgc3R1ZmYKCmRlZiBfZ2V0X3dpbl9mb2xkZXJfZnJvbV9yZWdpc3RyeShjc2lkbF9uYW1lKToKICAgICIiIlRoaXMgaXMgYSBmYWxsYmFjayB0ZWNobmlxdWUgYXQgYmVzdC4gSSdtIG5vdCBzdXJlIGlmIHVzaW5nIHRoZQogICAgcmVnaXN0cnkgZm9yIHRoaXMgZ3VhcmFudGVlcyB1cyB0aGUgY29ycmVjdCBhbnN3ZXIgZm9yIGFsbCBDU0lETF8qCiAgICBuYW1lcy4KICAgICIiIgogICAgaW1wb3J0IF93aW5yZWcKCiAgICBzaGVsbF9mb2xkZXJfbmFtZSA9IHsKICAgICAgICAiQ1NJRExfQVBQREFUQSI6ICJBcHBEYXRhIiwKICAgICAgICAiQ1NJRExfQ09NTU9OX0FQUERBVEEiOiAiQ29tbW9uIEFwcERhdGEiLAogICAgICAgICJDU0lETF9MT0NBTF9BUFBEQVRBIjogIkxvY2FsIEFwcERhdGEiLAogICAgfVtjc2lkbF9uYW1lXQoKICAgIGtleSA9IF93aW5yZWcuT3BlbktleSgKICAgICAgICBfd2lucmVnLkhLRVlfQ1VSUkVOVF9VU0VSLAogICAgICAgIHIiU29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cRXhwbG9yZXJcU2hlbGwgRm9sZGVycyIKICAgICkKICAgIGRpciwgdHlwZSA9IF93aW5yZWcuUXVlcnlWYWx1ZUV4KGtleSwgc2hlbGxfZm9sZGVyX25hbWUpCiAgICByZXR1cm4gZGlyCgoKZGVmIF9nZXRfd2luX2ZvbGRlcl93aXRoX3B5d2luMzIoY3NpZGxfbmFtZSk6CiAgICBmcm9tIHdpbjMyY29tLnNoZWxsIGltcG9ydCBzaGVsbGNvbiwgc2hlbGwKICAgIGRpciA9IHNoZWxsLlNIR2V0Rm9sZGVyUGF0aCgwLCBnZXRhdHRyKHNoZWxsY29uLCBjc2lkbF9uYW1lKSwgMCwgMCkKICAgICMgVHJ5IHRvIG1ha2UgdGhpcyBhIHVuaWNvZGUgcGF0aCBiZWNhdXNlIFNIR2V0Rm9sZGVyUGF0aCBkb2VzCiAgICAjIG5vdCByZXR1cm4gdW5pY29kZSBzdHJpbmdzIHdoZW4gdGhlcmUgaXMgdW5pY29kZSBkYXRhIGluIHRoZQogICAgIyBwYXRoLgogICAgdHJ5OgogICAgICAgIGRpciA9IHVuaWNvZGUoZGlyKQoKICAgICAgICAjIERvd25ncmFkZSB0byBzaG9ydCBwYXRoIG5hbWUgaWYgaGF2ZSBoaWdoYml0IGNoYXJzLiBTZWUKICAgICAgICAjIDxodHRwOi8vYnVncy5hY3RpdmVzdGF0ZS5jb20vc2hvd19idWcuY2dpP2lkPTg1MDk5Pi4KICAgICAgICBoYXNfaGlnaF9jaGFyID0gRmFsc2UKICAgICAgICBmb3IgYyBpbiBkaXI6CiAgICAgICAgICAgIGlmIG9yZChjKSA+IDI1NToKICAgICAgICAgICAgICAgIGhhc19oaWdoX2NoYXIgPSBUcnVlCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIGhhc19oaWdoX2NoYXI6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGltcG9ydCB3aW4zMmFwaQogICAgICAgICAgICAgICAgZGlyID0gd2luMzJhcGkuR2V0U2hvcnRQYXRoTmFtZShkaXIpCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CiAgICAgICAgcGFzcwogICAgcmV0dXJuIGRpcgoKCmRlZiBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9jdHlwZXMoY3NpZGxfbmFtZSk6CiAgICBpbXBvcnQgY3R5cGVzCgogICAgY3NpZGxfY29uc3QgPSB7CiAgICAgICAgIkNTSURMX0FQUERBVEEiOiAyNiwKICAgICAgICAiQ1NJRExfQ09NTU9OX0FQUERBVEEiOiAzNSwKICAgICAgICAiQ1NJRExfTE9DQUxfQVBQREFUQSI6IDI4LAogICAgfVtjc2lkbF9uYW1lXQoKICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoMTAyNCkKICAgIGN0eXBlcy53aW5kbGwuc2hlbGwzMi5TSEdldEZvbGRlclBhdGhXKE5vbmUsIGNzaWRsX2NvbnN0LCBOb25lLCAwLCBidWYpCgogICAgIyBEb3duZ3JhZGUgdG8gc2hvcnQgcGF0aCBuYW1lIGlmIGhhdmUgaGlnaGJpdCBjaGFycy4gU2VlCiAgICAjIDxodHRwOi8vYnVncy5hY3RpdmVzdGF0ZS5jb20vc2hvd19idWcuY2dpP2lkPTg1MDk5Pi4KICAgIGhhc19oaWdoX2NoYXIgPSBGYWxzZQogICAgZm9yIGMgaW4gYnVmOgogICAgICAgIGlmIG9yZChjKSA+IDI1NToKICAgICAgICAgICAgaGFzX2hpZ2hfY2hhciA9IFRydWUKICAgICAgICAgICAgYnJlYWsKICAgIGlmIGhhc19oaWdoX2NoYXI6CiAgICAgICAgYnVmMiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoMTAyNCkKICAgICAgICBpZiBjdHlwZXMud2luZGxsLmtlcm5lbDMyLkdldFNob3J0UGF0aE5hbWVXKGJ1Zi52YWx1ZSwgYnVmMiwgMTAyNCk6CiAgICAgICAgICAgIGJ1ZiA9IGJ1ZjIKCiAgICByZXR1cm4gYnVmLnZhbHVlCgpkZWYgX2dldF93aW5fZm9sZGVyX3dpdGhfam5hKGNzaWRsX25hbWUpOgogICAgaW1wb3J0IGFycmF5CiAgICBmcm9tIGNvbS5zdW4gaW1wb3J0IGpuYQogICAgZnJvbSBjb20uc3VuLmpuYS5wbGF0Zm9ybSBpbXBvcnQgd2luMzIKCiAgICBidWZfc2l6ZSA9IHdpbjMyLldpbkRlZi5NQVhfUEFUSCAqIDIKICAgIGJ1ZiA9IGFycmF5Lnplcm9zKCdjJywgYnVmX3NpemUpCiAgICBzaGVsbCA9IHdpbjMyLlNoZWxsMzIuSU5TVEFOQ0UKICAgIHNoZWxsLlNIR2V0Rm9sZGVyUGF0aChOb25lLCBnZXRhdHRyKHdpbjMyLlNobE9iaiwgY3NpZGxfbmFtZSksIE5vbmUsIHdpbjMyLlNobE9iai5TSEdGUF9UWVBFX0NVUlJFTlQsIGJ1ZikKICAgIGRpciA9IGpuYS5OYXRpdmUudG9TdHJpbmcoYnVmLnRvc3RyaW5nKCkpLnJzdHJpcCgiXDAiKQoKICAgICMgRG93bmdyYWRlIHRvIHNob3J0IHBhdGggbmFtZSBpZiBoYXZlIGhpZ2hiaXQgY2hhcnMuIFNlZQogICAgIyA8aHR0cDovL2J1Z3MuYWN0aXZlc3RhdGUuY29tL3Nob3dfYnVnLmNnaT9pZD04NTA5OT4uCiAgICBoYXNfaGlnaF9jaGFyID0gRmFsc2UKICAgIGZvciBjIGluIGRpcjoKICAgICAgICBpZiBvcmQoYykgPiAyNTU6CiAgICAgICAgICAgIGhhc19oaWdoX2NoYXIgPSBUcnVlCiAgICAgICAgICAgIGJyZWFrCiAgICBpZiBoYXNfaGlnaF9jaGFyOgogICAgICAgIGJ1ZiA9IGFycmF5Lnplcm9zKCdjJywgYnVmX3NpemUpCiAgICAgICAga2VybmVsID0gd2luMzIuS2VybmVsMzIuSU5TVEFOQ0UKICAgICAgICBpZiBrZXJuYWwuR2V0U2hvcnRQYXRoTmFtZShkaXIsIGJ1ZiwgYnVmX3NpemUpOgogICAgICAgICAgICBkaXIgPSBqbmEuTmF0aXZlLnRvU3RyaW5nKGJ1Zi50b3N0cmluZygpKS5yc3RyaXAoIlwwIikKCiAgICByZXR1cm4gZGlyCgppZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgIHRyeToKICAgICAgICBpbXBvcnQgd2luMzJjb20uc2hlbGwKICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9weXdpbjMyCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgd2luZGxsCiAgICAgICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl93aXRoX2N0eXBlcwogICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaW1wb3J0IGNvbS5zdW4uam5hCiAgICAgICAgICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9qbmEKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX2Zyb21fcmVnaXN0cnkKCgojLS0tLSBzZWxmIHRlc3QgY29kZQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIGFwcG5hbWUgPSAiTXlBcHAiCiAgICBhcHBhdXRob3IgPSAiTXlDb21wYW55IgoKICAgIHByb3BzID0gKCJ1c2VyX2RhdGFfZGlyIiwgInNpdGVfZGF0YV9kaXIiLAogICAgICAgICAgICAgInVzZXJfY29uZmlnX2RpciIsICJzaXRlX2NvbmZpZ19kaXIiLAogICAgICAgICAgICAgInVzZXJfY2FjaGVfZGlyIiwgInVzZXJfbG9nX2RpciIpCgogICAgcHJpbnQoIi0tIGFwcCBkaXJzICh3aXRoIG9wdGlvbmFsICd2ZXJzaW9uJykiKQogICAgZGlycyA9IEFwcERpcnMoYXBwbmFtZSwgYXBwYXV0aG9yLCB2ZXJzaW9uPSIxLjAiKQogICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAocHJvcCwgZ2V0YXR0cihkaXJzLCBwcm9wKSkpCgogICAgcHJpbnQoIlxuLS0gYXBwIGRpcnMgKHdpdGhvdXQgb3B0aW9uYWwgJ3ZlcnNpb24nKSIpCiAgICBkaXJzID0gQXBwRGlycyhhcHBuYW1lLCBhcHBhdXRob3IpCiAgICBmb3IgcHJvcCBpbiBwcm9wczoKICAgICAgICBwcmludCgiJXM6ICVzIiAlIChwcm9wLCBnZXRhdHRyKGRpcnMsIHByb3ApKSkKCiAgICBwcmludCgiXG4tLSBhcHAgZGlycyAod2l0aG91dCBvcHRpb25hbCAnYXBwYXV0aG9yJykiKQogICAgZGlycyA9IEFwcERpcnMoYXBwbmFtZSkKICAgIGZvciBwcm9wIGluIHByb3BzOgogICAgICAgIHByaW50KCIlczogJXMiICUgKHByb3AsIGdldGF0dHIoZGlycywgcHJvcCkpKQoKICAgIHByaW50KCJcbi0tIGFwcCBkaXJzICh3aXRoIGRpc2FibGVkICdhcHBhdXRob3InKSIpCiAgICBkaXJzID0gQXBwRGlycyhhcHBuYW1lLCBhcHBhdXRob3I9RmFsc2UpCiAgICBmb3IgcHJvcCBpbiBwcm9wczoKICAgICAgICBwcmludCgiJXM6ICVzIiAlIChwcm9wLCBnZXRhdHRyKGRpcnMsIHByb3ApKSkKUEsDBBQAAAAAAAAAIQAAVqw6LgEAAC4BAAA0AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9fX2luaXRfXy5weSIiIkNhY2hlQ29udHJvbCBpbXBvcnQgSW50ZXJmYWNlLgoKTWFrZSBpdCBlYXN5IHRvIGltcG9ydCBmcm9tIGNhY2hlY29udHJvbCB3aXRob3V0IGxvbmcgbmFtZXNwYWNlcy4KIiIiCl9fYXV0aG9yX18gPSAnRXJpYyBMYXJzb24nCl9fZW1haWxfXyA9ICdlcmljQGlvbnJvY2sub3JnJwpfX3ZlcnNpb25fXyA9ICcwLjExLjcnCgpmcm9tIC53cmFwcGVyIGltcG9ydCBDYWNoZUNvbnRyb2wKZnJvbSAuYWRhcHRlciBpbXBvcnQgQ2FjaGVDb250cm9sQWRhcHRlcgpmcm9tIC5jb250cm9sbGVyIGltcG9ydCBDYWNoZUNvbnRyb2xsZXIKUEsDBBQAAAAAAAAAIQDaVEalKAUAACgFAAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9fY21kLnB5aW1wb3J0IGxvZ2dpbmcKCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHJlcXVlc3RzCgpmcm9tIHBpcC5fdmVuZG9yLmNhY2hlY29udHJvbC5hZGFwdGVyIGltcG9ydCBDYWNoZUNvbnRyb2xBZGFwdGVyCmZyb20gcGlwLl92ZW5kb3IuY2FjaGVjb250cm9sLmNhY2hlIGltcG9ydCBEaWN0Q2FjaGUKZnJvbSBwaXAuX3ZlbmRvci5jYWNoZWNvbnRyb2wuY29udHJvbGxlciBpbXBvcnQgbG9nZ2VyCgpmcm9tIGFyZ3BhcnNlIGltcG9ydCBBcmd1bWVudFBhcnNlcgoKCmRlZiBzZXR1cF9sb2dnaW5nKCk6CiAgICBsb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5ERUJVRykKICAgIGhhbmRsZXIgPSBsb2dnaW5nLlN0cmVhbUhhbmRsZXIoKQogICAgbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcikKCgpkZWYgZ2V0X3Nlc3Npb24oKToKICAgIGFkYXB0ZXIgPSBDYWNoZUNvbnRyb2xBZGFwdGVyKAogICAgICAgIERpY3RDYWNoZSgpLAogICAgICAgIGNhY2hlX2V0YWdzPVRydWUsCiAgICAgICAgc2VyaWFsaXplcj1Ob25lLAogICAgICAgIGhldXJpc3RpYz1Ob25lLAogICAgKQogICAgc2VzcyA9IHJlcXVlc3RzLlNlc3Npb24oKQogICAgc2Vzcy5tb3VudCgnaHR0cDovLycsIGFkYXB0ZXIpCiAgICBzZXNzLm1vdW50KCdodHRwczovLycsIGFkYXB0ZXIpCgogICAgc2Vzcy5jYWNoZV9jb250cm9sbGVyID0gYWRhcHRlci5jb250cm9sbGVyCiAgICByZXR1cm4gc2VzcwoKCmRlZiBnZXRfYXJncygpOgogICAgcGFyc2VyID0gQXJndW1lbnRQYXJzZXIoKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgndXJsJywgaGVscD0nVGhlIFVSTCB0byB0cnkgYW5kIGNhY2hlJykKICAgIHJldHVybiBwYXJzZXIucGFyc2VfYXJncygpCgoKZGVmIG1haW4oYXJncz1Ob25lKToKICAgIGFyZ3MgPSBnZXRfYXJncygpCiAgICBzZXNzID0gZ2V0X3Nlc3Npb24oKQoKICAgICMgTWFrZSBhIHJlcXVlc3QgdG8gZ2V0IGEgcmVzcG9uc2UKICAgIHJlc3AgPSBzZXNzLmdldChhcmdzLnVybCkKCiAgICAjIFR1cm4gb24gbG9nZ2luZwogICAgc2V0dXBfbG9nZ2luZygpCgogICAgIyB0cnkgc2V0dGluZyB0aGUgY2FjaGUKICAgIHNlc3MuY2FjaGVfY29udHJvbGxlci5jYWNoZV9yZXNwb25zZShyZXNwLnJlcXVlc3QsIHJlc3AucmF3KQoKICAgICMgTm93IHRyeSB0byBnZXQgaXQKICAgIGlmIHNlc3MuY2FjaGVfY29udHJvbGxlci5jYWNoZWRfcmVxdWVzdChyZXNwLnJlcXVlc3QpOgogICAgICAgIHByaW50KCdDYWNoZWQhJykKICAgIGVsc2U6CiAgICAgICAgcHJpbnQoJ05vdCBjYWNoZWQgOignKQoKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBtYWluKCkKUEsDBBQAAAAAAAAAIQBQ5qksABIAAAASAAAzAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9hZGFwdGVyLnB5aW1wb3J0IHR5cGVzCmltcG9ydCBmdW5jdG9vbHMKCmZyb20gcGlwLl92ZW5kb3IucmVxdWVzdHMuYWRhcHRlcnMgaW1wb3J0IEhUVFBBZGFwdGVyCgpmcm9tIC5jb250cm9sbGVyIGltcG9ydCBDYWNoZUNvbnRyb2xsZXIKZnJvbSAuY2FjaGUgaW1wb3J0IERpY3RDYWNoZQpmcm9tIC5maWxld3JhcHBlciBpbXBvcnQgQ2FsbGJhY2tGaWxlV3JhcHBlcgoKCmNsYXNzIENhY2hlQ29udHJvbEFkYXB0ZXIoSFRUUEFkYXB0ZXIpOgogICAgaW52YWxpZGF0aW5nX21ldGhvZHMgPSBzZXQoWydQVVQnLCAnREVMRVRFJ10pCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhY2hlPU5vbmUsCiAgICAgICAgICAgICAgICAgY2FjaGVfZXRhZ3M9VHJ1ZSwKICAgICAgICAgICAgICAgICBjb250cm9sbGVyX2NsYXNzPU5vbmUsCiAgICAgICAgICAgICAgICAgc2VyaWFsaXplcj1Ob25lLAogICAgICAgICAgICAgICAgIGhldXJpc3RpYz1Ob25lLAogICAgICAgICAgICAgICAgICphcmdzLCAqKmt3KToKICAgICAgICBzdXBlcihDYWNoZUNvbnRyb2xBZGFwdGVyLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprdykKICAgICAgICBzZWxmLmNhY2hlID0gY2FjaGUgb3IgRGljdENhY2hlKCkKICAgICAgICBzZWxmLmhldXJpc3RpYyA9IGhldXJpc3RpYwoKICAgICAgICBjb250cm9sbGVyX2ZhY3RvcnkgPSBjb250cm9sbGVyX2NsYXNzIG9yIENhY2hlQ29udHJvbGxlcgogICAgICAgIHNlbGYuY29udHJvbGxlciA9IGNvbnRyb2xsZXJfZmFjdG9yeSgKICAgICAgICAgICAgc2VsZi5jYWNoZSwKICAgICAgICAgICAgY2FjaGVfZXRhZ3M9Y2FjaGVfZXRhZ3MsCiAgICAgICAgICAgIHNlcmlhbGl6ZXI9c2VyaWFsaXplciwKICAgICAgICApCgogICAgZGVmIHNlbmQoc2VsZiwgcmVxdWVzdCwgKiprdyk6CiAgICAgICAgIiIiCiAgICAgICAgU2VuZCBhIHJlcXVlc3QuIFVzZSB0aGUgcmVxdWVzdCBpbmZvcm1hdGlvbiB0byBzZWUgaWYgaXQKICAgICAgICBleGlzdHMgaW4gdGhlIGNhY2hlIGFuZCBjYWNoZSB0aGUgcmVzcG9uc2UgaWYgd2UgbmVlZCB0byBhbmQgY2FuLgogICAgICAgICIiIgogICAgICAgIGlmIHJlcXVlc3QubWV0aG9kID09ICdHRVQnOgogICAgICAgICAgICBjYWNoZWRfcmVzcG9uc2UgPSBzZWxmLmNvbnRyb2xsZXIuY2FjaGVkX3JlcXVlc3QocmVxdWVzdCkKICAgICAgICAgICAgaWYgY2FjaGVkX3Jlc3BvbnNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuYnVpbGRfcmVzcG9uc2UocmVxdWVzdCwgY2FjaGVkX3Jlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9jYWNoZT1UcnVlKQoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZXRhZ3MgYW5kIGFkZCBoZWFkZXJzIGlmIGFwcHJvcHJpYXRlCiAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVycy51cGRhdGUoCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xsZXIuY29uZGl0aW9uYWxfaGVhZGVycyhyZXF1ZXN0KQogICAgICAgICAgICApCgogICAgICAgIHJlc3AgPSBzdXBlcihDYWNoZUNvbnRyb2xBZGFwdGVyLCBzZWxmKS5zZW5kKHJlcXVlc3QsICoqa3cpCgogICAgICAgIHJldHVybiByZXNwCgogICAgZGVmIGJ1aWxkX3Jlc3BvbnNlKHNlbGYsIHJlcXVlc3QsIHJlc3BvbnNlLCBmcm9tX2NhY2hlPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBCdWlsZCBhIHJlc3BvbnNlIGJ5IG1ha2luZyBhIHJlcXVlc3Qgb3IgdXNpbmcgdGhlIGNhY2hlLgoKICAgICAgICBUaGlzIHdpbGwgZW5kIHVwIGNhbGxpbmcgc2VuZCBhbmQgcmV0dXJuaW5nIGEgcG90ZW50aWFsbHkKICAgICAgICBjYWNoZWQgcmVzcG9uc2UKICAgICAgICAiIiIKICAgICAgICBpZiBub3QgZnJvbV9jYWNoZSBhbmQgcmVxdWVzdC5tZXRob2QgPT0gJ0dFVCc6CiAgICAgICAgICAgICMgQ2hlY2sgZm9yIGFueSBoZXVyaXN0aWNzIHRoYXQgbWlnaHQgdXBkYXRlIGhlYWRlcnMKICAgICAgICAgICAgIyBiZWZvcmUgdHJ5aW5nIHRvIGNhY2hlLgogICAgICAgICAgICBpZiBzZWxmLmhldXJpc3RpYzoKICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5oZXVyaXN0aWMuYXBwbHkocmVzcG9uc2UpCgogICAgICAgICAgICAjIGFwcGx5IGFueSBleHBpcmF0aW9uIGhldXJpc3RpY3MKICAgICAgICAgICAgaWYgcmVzcG9uc2Uuc3RhdHVzID09IDMwNDoKICAgICAgICAgICAgICAgICMgV2UgbXVzdCBoYXZlIHNlbnQgYW4gRVRhZyByZXF1ZXN0LiBUaGlzIGNvdWxkIG1lYW4KICAgICAgICAgICAgICAgICMgdGhhdCB3ZSd2ZSBiZWVuIGV4cGlyZWQgYWxyZWFkeSBvciB0aGF0IHdlIHNpbXBseQogICAgICAgICAgICAgICAgIyBoYXZlIGFuIGV0YWcuIEluIGVpdGhlciBjYXNlLCB3ZSB3YW50IHRvIHRyeSBhbmQKICAgICAgICAgICAgICAgICMgdXBkYXRlIHRoZSBjYWNoZSBpZiB0aGF0IGlzIHRoZSBjYXNlLgogICAgICAgICAgICAgICAgY2FjaGVkX3Jlc3BvbnNlID0gc2VsZi5jb250cm9sbGVyLnVwZGF0ZV9jYWNoZWRfcmVzcG9uc2UoCiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCwgcmVzcG9uc2UKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBpZiBjYWNoZWRfcmVzcG9uc2UgaXMgbm90IHJlc3BvbnNlOgogICAgICAgICAgICAgICAgICAgIGZyb21fY2FjaGUgPSBUcnVlCgogICAgICAgICAgICAgICAgIyBXZSBhcmUgZG9uZSB3aXRoIHRoZSBzZXJ2ZXIgcmVzcG9uc2UsIHJlYWQgYQogICAgICAgICAgICAgICAgIyBwb3NzaWJsZSByZXNwb25zZSBib2R5IChjb21wbGlhbnQgc2VydmVycyB3aWxsCiAgICAgICAgICAgICAgICAjIG5vdCByZXR1cm4gb25lLCBidXQgd2UgY2Fubm90IGJlIDEwMCUgc3VyZSkgYW5kCiAgICAgICAgICAgICAgICAjIHJlbGVhc2UgdGhlIGNvbm5lY3Rpb24gYmFjayB0byB0aGUgcG9vbC4KICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlYWQoZGVjb2RlX2NvbnRlbnQ9RmFsc2UpCiAgICAgICAgICAgICAgICByZXNwb25zZS5yZWxlYXNlX2Nvbm4oKQoKICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gY2FjaGVkX3Jlc3BvbnNlCgogICAgICAgICAgICAjIFdlIGFsd2F5cyBjYWNoZSB0aGUgMzAxIHJlc3BvbnNlcwogICAgICAgICAgICBlbGlmIHJlc3BvbnNlLnN0YXR1cyA9PSAzMDE6CiAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xsZXIuY2FjaGVfcmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIFdyYXAgdGhlIHJlc3BvbnNlIGZpbGUgd2l0aCBhIHdyYXBwZXIgdGhhdCB3aWxsIGNhY2hlIHRoZQogICAgICAgICAgICAgICAgIyAgIHJlc3BvbnNlIHdoZW4gdGhlIHN0cmVhbSBoYXMgYmVlbiBjb25zdW1lZC4KICAgICAgICAgICAgICAgIHJlc3BvbnNlLl9mcCA9IENhbGxiYWNrRmlsZVdyYXBwZXIoCiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuX2ZwLAogICAgICAgICAgICAgICAgICAgIGZ1bmN0b29scy5wYXJ0aWFsKAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRyb2xsZXIuY2FjaGVfcmVzcG9uc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIHJlc3BvbnNlLmNodW5rZWQ6CiAgICAgICAgICAgICAgICAgICAgc3VwZXJfdXBkYXRlX2NodW5rX2xlbmd0aCA9IHJlc3BvbnNlLl91cGRhdGVfY2h1bmtfbGVuZ3RoCgogICAgICAgICAgICAgICAgICAgIGRlZiBfdXBkYXRlX2NodW5rX2xlbmd0aChzZWxmKToKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJfdXBkYXRlX2NodW5rX2xlbmd0aCgpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuY2h1bmtfbGVmdCA9PSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZnAuX2Nsb3NlKCkKICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5fdXBkYXRlX2NodW5rX2xlbmd0aCA9IHR5cGVzLk1ldGhvZFR5cGUoX3VwZGF0ZV9jaHVua19sZW5ndGgsIHJlc3BvbnNlKQoKICAgICAgICByZXNwID0gc3VwZXIoQ2FjaGVDb250cm9sQWRhcHRlciwgc2VsZikuYnVpbGRfcmVzcG9uc2UoCiAgICAgICAgICAgIHJlcXVlc3QsIHJlc3BvbnNlCiAgICAgICAgKQoKICAgICAgICAjIFNlZSBpZiB3ZSBzaG91bGQgaW52YWxpZGF0ZSB0aGUgY2FjaGUuCiAgICAgICAgaWYgcmVxdWVzdC5tZXRob2QgaW4gc2VsZi5pbnZhbGlkYXRpbmdfbWV0aG9kcyBhbmQgcmVzcC5vazoKICAgICAgICAgICAgY2FjaGVfdXJsID0gc2VsZi5jb250cm9sbGVyLmNhY2hlX3VybChyZXF1ZXN0LnVybCkKICAgICAgICAgICAgc2VsZi5jYWNoZS5kZWxldGUoY2FjaGVfdXJsKQoKICAgICAgICAjIEdpdmUgdGhlIHJlcXVlc3QgYSBmcm9tX2NhY2hlIGF0dHIgdG8gbGV0IHBlb3BsZSB1c2UgaXQKICAgICAgICByZXNwLmZyb21fY2FjaGUgPSBmcm9tX2NhY2hlCgogICAgICAgIHJldHVybiByZXNwCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgIHNlbGYuY2FjaGUuY2xvc2UoKQogICAgICAgIHN1cGVyKENhY2hlQ29udHJvbEFkYXB0ZXIsIHNlbGYpLmNsb3NlKCkKUEsDBBQAAAAAAAAAIQASqsbwFgMAABYDAAAxAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jYWNoZS5weSIiIgpUaGUgY2FjaGUgb2JqZWN0IEFQSSBmb3IgaW1wbGVtZW50aW5nIGNhY2hlcy4gVGhlIGRlZmF1bHQgaXMgYSB0aHJlYWQKc2FmZSBpbi1tZW1vcnkgZGljdGlvbmFyeS4KIiIiCmZyb20gdGhyZWFkaW5nIGltcG9ydCBMb2NrCgoKY2xhc3MgQmFzZUNhY2hlKG9iamVjdCk6CgogICAgZGVmIGdldChzZWxmLCBrZXkpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkKCkKCiAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkKCkKCiAgICBkZWYgZGVsZXRlKHNlbGYsIGtleSk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWQoKQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICBwYXNzCgoKY2xhc3MgRGljdENhY2hlKEJhc2VDYWNoZSk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGluaXRfZGljdD1Ob25lKToKICAgICAgICBzZWxmLmxvY2sgPSBMb2NrKCkKICAgICAgICBzZWxmLmRhdGEgPSBpbml0X2RpY3Qgb3Ige30KCiAgICBkZWYgZ2V0KHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5nZXQoa2V5LCBOb25lKQoKICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgIHNlbGYuZGF0YS51cGRhdGUoe2tleTogdmFsdWV9KQoKICAgIGRlZiBkZWxldGUoc2VsZiwga2V5KToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgaWYga2V5IGluIHNlbGYuZGF0YToKICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5wb3Aoa2V5KQpQSwMEFAAAAAAAAAAhAJ4dVvxxAQAAcQEAADsAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlcy9fX2luaXRfXy5weWZyb20gdGV4dHdyYXAgaW1wb3J0IGRlZGVudAoKdHJ5OgogICAgZnJvbSAuZmlsZV9jYWNoZSBpbXBvcnQgRmlsZUNhY2hlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIG5vdGljZSA9IGRlZGVudCgnJycKICAgIE5PVEU6IEluIG9yZGVyIHRvIHVzZSB0aGUgRmlsZUNhY2hlIHlvdSBtdXN0IGhhdmUKICAgIGxvY2tmaWxlIGluc3RhbGxlZC4gWW91IGNhbiBpbnN0YWxsIGl0IHZpYSBwaXA6CiAgICAgIHBpcCBpbnN0YWxsIGxvY2tmaWxlCiAgICAnJycpCiAgICBwcmludChub3RpY2UpCgoKdHJ5OgogICAgaW1wb3J0IHJlZGlzCiAgICBmcm9tIC5yZWRpc19jYWNoZSBpbXBvcnQgUmVkaXNDYWNoZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBwYXNzClBLAwQUAAAAAAAAACEAwacG/8wNAADMDQAAPQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY2FjaGVzL2ZpbGVfY2FjaGUucHlpbXBvcnQgaGFzaGxpYgppbXBvcnQgb3MKCmZyb20gcGlwLl92ZW5kb3IubG9ja2ZpbGUgaW1wb3J0IExvY2tGaWxlCmZyb20gcGlwLl92ZW5kb3IubG9ja2ZpbGUubWtkaXJsb2NrZmlsZSBpbXBvcnQgTWtkaXJMb2NrRmlsZQoKZnJvbSAuLmNhY2hlIGltcG9ydCBCYXNlQ2FjaGUKZnJvbSAuLmNvbnRyb2xsZXIgaW1wb3J0IENhY2hlQ29udHJvbGxlcgoKCmRlZiBfc2VjdXJlX29wZW5fd3JpdGUoZmlsZW5hbWUsIGZtb2RlKToKICAgICMgV2Ugb25seSB3YW50IHRvIHdyaXRlIHRvIHRoaXMgZmlsZSwgc28gb3BlbiBpdCBpbiB3cml0ZSBvbmx5IG1vZGUKICAgIGZsYWdzID0gb3MuT19XUk9OTFkKCiAgICAjIG9zLk9fQ1JFQVQgfCBvcy5PX0VYQ0wgd2lsbCBmYWlsIGlmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLCBzbyB3ZSBvbmx5CiAgICAjICB3aWxsIG9wZW4gKm5ldyogZmlsZXMuCiAgICAjIFdlIHNwZWNpZnkgdGhpcyBiZWNhdXNlIHdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIG1vZGUgd2UgcGFzcyBpcyB0aGUKICAgICMgbW9kZSBvZiB0aGUgZmlsZS4KICAgIGZsYWdzIHw9IG9zLk9fQ1JFQVQgfCBvcy5PX0VYQ0wKCiAgICAjIERvIG5vdCBmb2xsb3cgc3ltbGlua3MgdG8gcHJldmVudCBzb21lb25lIGZyb20gbWFraW5nIGEgc3ltbGluayB0aGF0CiAgICAjIHdlIGZvbGxvdyBhbmQgaW5zZWN1cmVseSBvcGVuIGEgY2FjaGUgZmlsZS4KICAgIGlmIGhhc2F0dHIob3MsICJPX05PRk9MTE9XIik6CiAgICAgICAgZmxhZ3MgfD0gb3MuT19OT0ZPTExPVwoKICAgICMgT24gV2luZG93cyB3ZSdsbCBtYXJrIHRoaXMgZmlsZSBhcyBiaW5hcnkKICAgIGlmIGhhc2F0dHIob3MsICJPX0JJTkFSWSIpOgogICAgICAgIGZsYWdzIHw9IG9zLk9fQklOQVJZCgogICAgIyBCZWZvcmUgd2Ugb3BlbiBvdXIgZmlsZSwgd2Ugd2FudCB0byBkZWxldGUgYW55IGV4aXN0aW5nIGZpbGUgdGhhdCBpcwogICAgIyB0aGVyZQogICAgdHJ5OgogICAgICAgIG9zLnJlbW92ZShmaWxlbmFtZSkKICAgIGV4Y2VwdCAoSU9FcnJvciwgT1NFcnJvcik6CiAgICAgICAgIyBUaGUgZmlsZSBtdXN0IG5vdCBleGlzdCBhbHJlYWR5LCBzbyB3ZSBjYW4ganVzdCBza2lwIGFoZWFkIHRvIG9wZW5pbmcKICAgICAgICBwYXNzCgogICAgIyBPcGVuIG91ciBmaWxlLCB0aGUgdXNlIG9mIG9zLk9fQ1JFQVQgfCBvcy5PX0VYQ0wgd2lsbCBlbnN1cmUgdGhhdCBpZiBhCiAgICAjIHJhY2UgY29uZGl0aW9uIGhhcHBlbnMgYmV0d2VlbiB0aGUgb3MucmVtb3ZlIGFuZCB0aGlzIGxpbmUsIHRoYXQgYW4KICAgICMgZXJyb3Igd2lsbCBiZSByYWlzZWQuIEJlY2F1c2Ugd2UgdXRpbGl6ZSBhIGxvY2tmaWxlIHRoaXMgc2hvdWxkIG9ubHkKICAgICMgaGFwcGVuIGlmIHNvbWVvbmUgaXMgYXR0ZW1wdGluZyB0byBhdHRhY2sgdXMuCiAgICBmZCA9IG9zLm9wZW4oZmlsZW5hbWUsIGZsYWdzLCBmbW9kZSkKICAgIHRyeToKICAgICAgICByZXR1cm4gb3MuZmRvcGVuKGZkLCAid2IiKQogICAgZXhjZXB0OgogICAgICAgICMgQW4gZXJyb3Igb2NjdXJyZWQgd3JhcHBpbmcgb3VyIEZEIGluIGEgZmlsZSBvYmplY3QKICAgICAgICBvcy5jbG9zZShmZCkKICAgICAgICByYWlzZQoKCmNsYXNzIEZpbGVDYWNoZShCYXNlQ2FjaGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpcmVjdG9yeSwgZm9yZXZlcj1GYWxzZSwgZmlsZW1vZGU9MG8wNjAwLAogICAgICAgICAgICAgICAgIGRpcm1vZGU9MG8wNzAwLCB1c2VfZGlyX2xvY2s9Tm9uZSwgbG9ja19jbGFzcz1Ob25lKToKCiAgICAgICAgaWYgdXNlX2Rpcl9sb2NrIGlzIG5vdCBOb25lIGFuZCBsb2NrX2NsYXNzIGlzIG5vdCBOb25lOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJDYW5ub3QgdXNlIHVzZV9kaXJfbG9jayBhbmQgbG9ja19jbGFzcyB0b2dldGhlciIpCgogICAgICAgIGlmIHVzZV9kaXJfbG9jazoKICAgICAgICAgICAgbG9ja19jbGFzcyA9IE1rZGlyTG9ja0ZpbGUKCiAgICAgICAgaWYgbG9ja19jbGFzcyBpcyBOb25lOgogICAgICAgICAgICBsb2NrX2NsYXNzID0gTG9ja0ZpbGUKCiAgICAgICAgc2VsZi5kaXJlY3RvcnkgPSBkaXJlY3RvcnkKICAgICAgICBzZWxmLmZvcmV2ZXIgPSBmb3JldmVyCiAgICAgICAgc2VsZi5maWxlbW9kZSA9IGZpbGVtb2RlCiAgICAgICAgc2VsZi5kaXJtb2RlID0gZGlybW9kZQogICAgICAgIHNlbGYubG9ja19jbGFzcyA9IGxvY2tfY2xhc3MKCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGVuY29kZSh4KToKICAgICAgICByZXR1cm4gaGFzaGxpYi5zaGEyMjQoeC5lbmNvZGUoKSkuaGV4ZGlnZXN0KCkKCiAgICBkZWYgX2ZuKHNlbGYsIG5hbWUpOgogICAgICAgICMgTk9URTogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBjaGFuZ2UgYXMgc29tZSBtYXkgZGVwZW5kIG9uIGl0LgogICAgICAgICMgICAgICAgU2VlOiBodHRwczovL2dpdGh1Yi5jb20vaW9ucm9jay9jYWNoZWNvbnRyb2wvaXNzdWVzLzYzCiAgICAgICAgaGFzaGVkID0gc2VsZi5lbmNvZGUobmFtZSkKICAgICAgICBwYXJ0cyA9IGxpc3QoaGFzaGVkWzo1XSkgKyBbaGFzaGVkXQogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5kaXJlY3RvcnksICpwYXJ0cykKCiAgICBkZWYgZ2V0KHNlbGYsIGtleSk6CiAgICAgICAgbmFtZSA9IHNlbGYuX2ZuKGtleSkKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMobmFtZSk6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIHdpdGggb3BlbihuYW1lLCAncmInKSBhcyBmaDoKICAgICAgICAgICAgcmV0dXJuIGZoLnJlYWQoKQoKICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgbmFtZSA9IHNlbGYuX2ZuKGtleSkKCiAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9zLm1ha2VkaXJzKG9zLnBhdGguZGlybmFtZShuYW1lKSwgc2VsZi5kaXJtb2RlKQogICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgT1NFcnJvcik6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgd2l0aCBzZWxmLmxvY2tfY2xhc3MobmFtZSkgYXMgbG9jazoKICAgICAgICAgICAgIyBXcml0ZSBvdXIgYWN0dWFsIGZpbGUKICAgICAgICAgICAgd2l0aCBfc2VjdXJlX29wZW5fd3JpdGUobG9jay5wYXRoLCBzZWxmLmZpbGVtb2RlKSBhcyBmaDoKICAgICAgICAgICAgICAgIGZoLndyaXRlKHZhbHVlKQoKICAgIGRlZiBkZWxldGUoc2VsZiwga2V5KToKICAgICAgICBuYW1lID0gc2VsZi5fZm4oa2V5KQogICAgICAgIGlmIG5vdCBzZWxmLmZvcmV2ZXI6CiAgICAgICAgICAgIG9zLnJlbW92ZShuYW1lKQoKCmRlZiB1cmxfdG9fZmlsZV9wYXRoKHVybCwgZmlsZWNhY2hlKToKICAgICIiIlJldHVybiB0aGUgZmlsZSBjYWNoZSBwYXRoIGJhc2VkIG9uIHRoZSBVUkwuCgogICAgVGhpcyBkb2VzIG5vdCBlbnN1cmUgdGhlIGZpbGUgZXhpc3RzIQogICAgIiIiCiAgICBrZXkgPSBDYWNoZUNvbnRyb2xsZXIuY2FjaGVfdXJsKHVybCkKICAgIHJldHVybiBmaWxlY2FjaGUuX2ZuKGtleSkKUEsDBBQAAAAAAAAAIQDTiMZUzQMAAM0DAAA+AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jYWNoZXMvcmVkaXNfY2FjaGUucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCgpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQoKCmRlZiB0b3RhbF9zZWNvbmRzKHRkKToKICAgICIiIlB5dGhvbiAyLjYgY29tcGF0YWJpbGl0eSIiIgogICAgaWYgaGFzYXR0cih0ZCwgJ3RvdGFsX3NlY29uZHMnKToKICAgICAgICByZXR1cm4gdGQudG90YWxfc2Vjb25kcygpCgogICAgbXMgPSB0ZC5taWNyb3NlY29uZHMKICAgIHNlY3MgPSAodGQuc2Vjb25kcyArIHRkLmRheXMgKiAyNCAqIDM2MDApCiAgICByZXR1cm4gKG1zICsgc2VjcyAqIDEwKio2KSAvIDEwKio2CgoKY2xhc3MgUmVkaXNDYWNoZShvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25uKToKICAgICAgICBzZWxmLmNvbm4gPSBjb25uCgogICAgZGVmIGdldChzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiBzZWxmLmNvbm4uZ2V0KGtleSkKCiAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUsIGV4cGlyZXM9Tm9uZSk6CiAgICAgICAgaWYgbm90IGV4cGlyZXM6CiAgICAgICAgICAgIHNlbGYuY29ubi5zZXQoa2V5LCB2YWx1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBleHBpcmVzID0gZXhwaXJlcyAtIGRhdGV0aW1lLm5vdygpCiAgICAgICAgICAgIHNlbGYuY29ubi5zZXRleChrZXksIHRvdGFsX3NlY29uZHMoZXhwaXJlcyksIHZhbHVlKQoKICAgIGRlZiBkZWxldGUoc2VsZiwga2V5KToKICAgICAgICBzZWxmLmNvbm4uZGVsZXRlKGtleSkKCiAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgIiIiSGVscGVyIGZvciBjbGVhcmluZyBhbGwgdGhlIGtleXMgaW4gYSBkYXRhYmFzZS4gVXNlIHdpdGgKICAgICAgICBjYXV0aW9uISIiIgogICAgICAgIGZvciBrZXkgaW4gc2VsZi5jb25uLmtleXMoKToKICAgICAgICAgICAgc2VsZi5jb25uLmRlbGV0ZShrZXkpCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgIHNlbGYuY29ubi5kaXNjb25uZWN0KCkKUEsDBBQAAAAAAAAAIQAtPC0zfAEAAHwBAAAyAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jb21wYXQucHl0cnk6CiAgICBmcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgdXJsam9pbgpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIHVybHBhcnNlIGltcG9ydCB1cmxqb2luCgoKdHJ5OgogICAgaW1wb3J0IGNQaWNrbGUgYXMgcGlja2xlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydCBwaWNrbGUKCgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMucmVzcG9uc2UgaW1wb3J0IEhUVFBSZXNwb25zZQpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMudXRpbCBpbXBvcnQgaXNfZnBfY2xvc2VkCgojIFJlcGxpY2F0ZSBzb21lIHNpeCBiZWhhdmlvdXIKdHJ5OgogICAgdGV4dF90eXBlID0gKHVuaWNvZGUsKQpleGNlcHQgTmFtZUVycm9yOgogICAgdGV4dF90eXBlID0gKHN0ciwpClBLAwQUAAAAAAAAACEAx2C53uAyAADgMgAANgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY29udHJvbGxlci5weSIiIgpUaGUgaHR0cGxpYjIgYWxnb3JpdGhtcyBwb3J0ZWQgZm9yIHVzZSB3aXRoIHJlcXVlc3RzLgoiIiIKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHJlCmltcG9ydCBjYWxlbmRhcgppbXBvcnQgdGltZQpmcm9tIGVtYWlsLnV0aWxzIGltcG9ydCBwYXJzZWRhdGVfdHoKCmZyb20gcGlwLl92ZW5kb3IucmVxdWVzdHMuc3RydWN0dXJlcyBpbXBvcnQgQ2FzZUluc2Vuc2l0aXZlRGljdAoKZnJvbSAuY2FjaGUgaW1wb3J0IERpY3RDYWNoZQpmcm9tIC5zZXJpYWxpemUgaW1wb3J0IFNlcmlhbGl6ZXIKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKClVSSSA9IHJlLmNvbXBpbGUociJeKChbXjovPyNdKyk6KT8oLy8oW14vPyNdKikpPyhbXj8jXSopKFw/KFteI10qKSk/KCMoLiopKT8iKQoKCmRlZiBwYXJzZV91cmkodXJpKToKICAgICIiIlBhcnNlcyBhIFVSSSB1c2luZyB0aGUgcmVnZXggZ2l2ZW4gaW4gQXBwZW5kaXggQiBvZiBSRkMgMzk4Ni4KCiAgICAgICAgKHNjaGVtZSwgYXV0aG9yaXR5LCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpID0gcGFyc2VfdXJpKHVyaSkKICAgICIiIgogICAgZ3JvdXBzID0gVVJJLm1hdGNoKHVyaSkuZ3JvdXBzKCkKICAgIHJldHVybiAoZ3JvdXBzWzFdLCBncm91cHNbM10sIGdyb3Vwc1s0XSwgZ3JvdXBzWzZdLCBncm91cHNbOF0pCgoKY2xhc3MgQ2FjaGVDb250cm9sbGVyKG9iamVjdCk6CiAgICAiIiJBbiBpbnRlcmZhY2UgdG8gc2VlIGlmIHJlcXVlc3Qgc2hvdWxkIGNhY2hlZCBvciBub3QuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYWNoZT1Ob25lLCBjYWNoZV9ldGFncz1UcnVlLCBzZXJpYWxpemVyPU5vbmUpOgogICAgICAgIHNlbGYuY2FjaGUgPSBjYWNoZSBvciBEaWN0Q2FjaGUoKQogICAgICAgIHNlbGYuY2FjaGVfZXRhZ3MgPSBjYWNoZV9ldGFncwogICAgICAgIHNlbGYuc2VyaWFsaXplciA9IHNlcmlhbGl6ZXIgb3IgU2VyaWFsaXplcigpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3VybG5vcm0oY2xzLCB1cmkpOgogICAgICAgICIiIk5vcm1hbGl6ZSB0aGUgVVJMIHRvIGNyZWF0ZSBhIHNhZmUga2V5IGZvciB0aGUgY2FjaGUiIiIKICAgICAgICAoc2NoZW1lLCBhdXRob3JpdHksIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCkgPSBwYXJzZV91cmkodXJpKQogICAgICAgIGlmIG5vdCBzY2hlbWUgb3Igbm90IGF1dGhvcml0eToKICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJPbmx5IGFic29sdXRlIFVSSXMgYXJlIGFsbG93ZWQuIHVyaSA9ICVzIiAlIHVyaSkKCiAgICAgICAgc2NoZW1lID0gc2NoZW1lLmxvd2VyKCkKICAgICAgICBhdXRob3JpdHkgPSBhdXRob3JpdHkubG93ZXIoKQoKICAgICAgICBpZiBub3QgcGF0aDoKICAgICAgICAgICAgcGF0aCA9ICIvIgoKICAgICAgICAjIENvdWxkIGRvIHN5bnRheCBiYXNlZCBub3JtYWxpemF0aW9uIG9mIHRoZSBVUkkgYmVmb3JlCiAgICAgICAgIyBjb21wdXRpbmcgdGhlIGRpZ2VzdC4gU2VlIFNlY3Rpb24gNi4yLjIgb2YgU3RkIDY2LgogICAgICAgIHJlcXVlc3RfdXJpID0gcXVlcnkgYW5kICI/Ii5qb2luKFtwYXRoLCBxdWVyeV0pIG9yIHBhdGgKICAgICAgICBkZWZyYWdfdXJpID0gc2NoZW1lICsgIjovLyIgKyBhdXRob3JpdHkgKyByZXF1ZXN0X3VyaQoKICAgICAgICByZXR1cm4gZGVmcmFnX3VyaQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGNhY2hlX3VybChjbHMsIHVyaSk6CiAgICAgICAgcmV0dXJuIGNscy5fdXJsbm9ybSh1cmkpCgogICAgZGVmIHBhcnNlX2NhY2hlX2NvbnRyb2woc2VsZiwgaGVhZGVycyk6CiAgICAgICAgIiIiCiAgICAgICAgUGFyc2UgdGhlIGNhY2hlIGNvbnRyb2wgaGVhZGVycyByZXR1cm5pbmcgYSBkaWN0aW9uYXJ5IHdpdGggdmFsdWVzCiAgICAgICAgZm9yIHRoZSBkaWZmZXJlbnQgZGlyZWN0aXZlcy4KICAgICAgICAiIiIKICAgICAgICByZXR2YWwgPSB7fQoKICAgICAgICBjY19oZWFkZXIgPSAnY2FjaGUtY29udHJvbCcKICAgICAgICBpZiAnQ2FjaGUtQ29udHJvbCcgaW4gaGVhZGVyczoKICAgICAgICAgICAgY2NfaGVhZGVyID0gJ0NhY2hlLUNvbnRyb2wnCgogICAgICAgIGlmIGNjX2hlYWRlciBpbiBoZWFkZXJzOgogICAgICAgICAgICBwYXJ0cyA9IGhlYWRlcnNbY2NfaGVhZGVyXS5zcGxpdCgnLCcpCiAgICAgICAgICAgIHBhcnRzX3dpdGhfYXJncyA9IFsKICAgICAgICAgICAgICAgIHR1cGxlKFt4LnN0cmlwKCkubG93ZXIoKSBmb3IgeCBpbiBwYXJ0LnNwbGl0KCI9IiwgMSldKQogICAgICAgICAgICAgICAgZm9yIHBhcnQgaW4gcGFydHMgaWYgLTEgIT0gcGFydC5maW5kKCI9IikKICAgICAgICAgICAgXQogICAgICAgICAgICBwYXJ0c193b19hcmdzID0gWwogICAgICAgICAgICAgICAgKG5hbWUuc3RyaXAoKS5sb3dlcigpLCAxKQogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gcGFydHMgaWYgLTEgPT0gbmFtZS5maW5kKCI9IikKICAgICAgICAgICAgXQogICAgICAgICAgICByZXR2YWwgPSBkaWN0KHBhcnRzX3dpdGhfYXJncyArIHBhcnRzX3dvX2FyZ3MpCiAgICAgICAgcmV0dXJuIHJldHZhbAoKICAgIGRlZiBjYWNoZWRfcmVxdWVzdChzZWxmLCByZXF1ZXN0KToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBjYWNoZWQgcmVzcG9uc2UgaWYgaXQgZXhpc3RzIGluIHRoZSBjYWNoZSwgb3RoZXJ3aXNlCiAgICAgICAgcmV0dXJuIEZhbHNlLgogICAgICAgICIiIgogICAgICAgIGNhY2hlX3VybCA9IHNlbGYuY2FjaGVfdXJsKHJlcXVlc3QudXJsKQogICAgICAgIGxvZ2dlci5kZWJ1ZygnTG9va2luZyB1cCAiJXMiIGluIHRoZSBjYWNoZScsIGNhY2hlX3VybCkKICAgICAgICBjYyA9IHNlbGYucGFyc2VfY2FjaGVfY29udHJvbChyZXF1ZXN0LmhlYWRlcnMpCgogICAgICAgICMgQmFpbCBvdXQgaWYgdGhlIHJlcXVlc3QgaW5zaXN0cyBvbiBmcmVzaCBkYXRhCiAgICAgICAgaWYgJ25vLWNhY2hlJyBpbiBjYzoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZXF1ZXN0IGhlYWRlciBoYXMgIm5vLWNhY2hlIiwgY2FjaGUgYnlwYXNzZWQnKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgaWYgJ21heC1hZ2UnIGluIGNjIGFuZCBjY1snbWF4LWFnZSddID09IDA6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVxdWVzdCBoZWFkZXIgaGFzICJtYXhfYWdlIiBhcyAwLCBjYWNoZSBieXBhc3NlZCcpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIFJlcXVlc3QgYWxsb3dzIHNlcnZpbmcgZnJvbSB0aGUgY2FjaGUsIGxldCdzIHNlZSBpZiB3ZSBmaW5kIHNvbWV0aGluZwogICAgICAgIGNhY2hlX2RhdGEgPSBzZWxmLmNhY2hlLmdldChjYWNoZV91cmwpCiAgICAgICAgaWYgY2FjaGVfZGF0YSBpcyBOb25lOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ05vIGNhY2hlIGVudHJ5IGF2YWlsYWJsZScpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIENoZWNrIHdoZXRoZXIgaXQgY2FuIGJlIGRlc2VyaWFsaXplZAogICAgICAgIHJlc3AgPSBzZWxmLnNlcmlhbGl6ZXIubG9hZHMocmVxdWVzdCwgY2FjaGVfZGF0YSkKICAgICAgICBpZiBub3QgcmVzcDoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0NhY2hlIGVudHJ5IGRlc2VyaWFsaXphdGlvbiBmYWlsZWQsIGVudHJ5IGlnbm9yZWQnKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBJZiB3ZSBoYXZlIGEgY2FjaGVkIDMwMSwgcmV0dXJuIGl0IGltbWVkaWF0ZWx5LiBXZSBkb24ndAogICAgICAgICMgbmVlZCB0byB0ZXN0IG91ciByZXNwb25zZSBmb3Igb3RoZXIgaGVhZGVycyBiL2MgaXQgaXMKICAgICAgICAjIGludHJpbnNpY2FsbHkgImNhY2hlYWJsZSIgYXMgaXQgaXMgUGVybWFuZW50LgogICAgICAgICMgU2VlOgogICAgICAgICMgICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNC4yCiAgICAgICAgIwogICAgICAgICMgQ2xpZW50IGNhbiB0cnkgdG8gcmVmcmVzaCB0aGUgdmFsdWUgYnkgcmVwZWF0aW5nIHRoZSByZXF1ZXN0CiAgICAgICAgIyB3aXRoIGNhY2hlIGJ1c3RpbmcgaGVhZGVycyBhcyB1c3VhbCAoaWUgbm8tY2FjaGUpLgogICAgICAgIGlmIHJlc3Auc3RhdHVzID09IDMwMToKICAgICAgICAgICAgbXNnID0gKCdSZXR1cm5pbmcgY2FjaGVkICIzMDEgTW92ZWQgUGVybWFuZW50bHkiIHJlc3BvbnNlICcKICAgICAgICAgICAgICAgICAgICcoaWdub3JpbmcgZGF0ZSBhbmQgZXRhZyBpbmZvcm1hdGlvbiknKQogICAgICAgICAgICBsb2dnZXIuZGVidWcobXNnKQogICAgICAgICAgICByZXR1cm4gcmVzcAoKICAgICAgICBoZWFkZXJzID0gQ2FzZUluc2Vuc2l0aXZlRGljdChyZXNwLmhlYWRlcnMpCiAgICAgICAgaWYgbm90IGhlYWRlcnMgb3IgJ2RhdGUnIG5vdCBpbiBoZWFkZXJzOgogICAgICAgICAgICBpZiAnZXRhZycgbm90IGluIGhlYWRlcnM6CiAgICAgICAgICAgICAgICAjIFdpdGhvdXQgZGF0ZSBvciBldGFnLCB0aGUgY2FjaGVkIHJlc3BvbnNlIGNhbiBuZXZlciBiZSB1c2VkCiAgICAgICAgICAgICAgICAjIGFuZCBzaG91bGQgYmUgZGVsZXRlZC4KICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUHVyZ2luZyBjYWNoZWQgcmVzcG9uc2U6IG5vIGRhdGUgb3IgZXRhZycpCiAgICAgICAgICAgICAgICBzZWxmLmNhY2hlLmRlbGV0ZShjYWNoZV91cmwpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnSWdub3JpbmcgY2FjaGVkIHJlc3BvbnNlOiBubyBkYXRlJykKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIG5vdyA9IHRpbWUudGltZSgpCiAgICAgICAgZGF0ZSA9IGNhbGVuZGFyLnRpbWVnbSgKICAgICAgICAgICAgcGFyc2VkYXRlX3R6KGhlYWRlcnNbJ2RhdGUnXSkKICAgICAgICApCiAgICAgICAgY3VycmVudF9hZ2UgPSBtYXgoMCwgbm93IC0gZGF0ZSkKICAgICAgICBsb2dnZXIuZGVidWcoJ0N1cnJlbnQgYWdlIGJhc2VkIG9uIGRhdGU6ICVpJywgY3VycmVudF9hZ2UpCgogICAgICAgICMgVE9ETzogVGhlcmUgaXMgYW4gYXNzdW1wdGlvbiB0aGF0IHRoZSByZXN1bHQgd2lsbCBiZSBhCiAgICAgICAgIyAgICAgICB1cmxsaWIzIHJlc3BvbnNlIG9iamVjdC4gVGhpcyBtYXkgbm90IGJlIGJlc3Qgc2luY2Ugd2UKICAgICAgICAjICAgICAgIGNvdWxkIHByb2JhYmx5IGF2b2lkIGluc3RhbnRpYXRpbmcgb3IgY29uc3RydWN0aW5nIHRoZQogICAgICAgICMgICAgICAgcmVzcG9uc2UgdW50aWwgd2Uga25vdyB3ZSBuZWVkIGl0LgogICAgICAgIHJlc3BfY2MgPSBzZWxmLnBhcnNlX2NhY2hlX2NvbnRyb2woaGVhZGVycykKCiAgICAgICAgIyBkZXRlcm1pbmUgZnJlc2huZXNzCiAgICAgICAgZnJlc2huZXNzX2xpZmV0aW1lID0gMAoKICAgICAgICAjIENoZWNrIHRoZSBtYXgtYWdlIHByYWdtYSBpbiB0aGUgY2FjaGUgY29udHJvbCBoZWFkZXIKICAgICAgICBpZiAnbWF4LWFnZScgaW4gcmVzcF9jYyBhbmQgcmVzcF9jY1snbWF4LWFnZSddLmlzZGlnaXQoKToKICAgICAgICAgICAgZnJlc2huZXNzX2xpZmV0aW1lID0gaW50KHJlc3BfY2NbJ21heC1hZ2UnXSkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGcmVzaG5lc3MgbGlmZXRpbWUgZnJvbSBtYXgtYWdlOiAlaScsCiAgICAgICAgICAgICAgICAgICAgICAgICBmcmVzaG5lc3NfbGlmZXRpbWUpCgogICAgICAgICMgSWYgdGhlcmUgaXNuJ3QgYSBtYXgtYWdlLCBjaGVjayBmb3IgYW4gZXhwaXJlcyBoZWFkZXIKICAgICAgICBlbGlmICdleHBpcmVzJyBpbiBoZWFkZXJzOgogICAgICAgICAgICBleHBpcmVzID0gcGFyc2VkYXRlX3R6KGhlYWRlcnNbJ2V4cGlyZXMnXSkKICAgICAgICAgICAgaWYgZXhwaXJlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGV4cGlyZV90aW1lID0gY2FsZW5kYXIudGltZWdtKGV4cGlyZXMpIC0gZGF0ZQogICAgICAgICAgICAgICAgZnJlc2huZXNzX2xpZmV0aW1lID0gbWF4KDAsIGV4cGlyZV90aW1lKQogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJGcmVzaG5lc3MgbGlmZXRpbWUgZnJvbSBleHBpcmVzOiAlaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlc2huZXNzX2xpZmV0aW1lKQoKICAgICAgICAjIERldGVybWluZSBpZiB3ZSBhcmUgc2V0dGluZyBmcmVzaG5lc3MgbGltaXQgaW4gdGhlCiAgICAgICAgIyByZXF1ZXN0LiBOb3RlLCB0aGlzIG92ZXJyaWRlcyB3aGF0IHdhcyBpbiB0aGUgcmVzcG9uc2UuCiAgICAgICAgaWYgJ21heC1hZ2UnIGluIGNjOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmcmVzaG5lc3NfbGlmZXRpbWUgPSBpbnQoY2NbJ21heC1hZ2UnXSkKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRnJlc2huZXNzIGxpZmV0aW1lIGZyb20gcmVxdWVzdCBtYXgtYWdlOiAlaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlc2huZXNzX2xpZmV0aW1lKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIGZyZXNobmVzc19saWZldGltZSA9IDAKCiAgICAgICAgaWYgJ21pbi1mcmVzaCcgaW4gY2M6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG1pbl9mcmVzaCA9IGludChjY1snbWluLWZyZXNoJ10pCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgbWluX2ZyZXNoID0gMAogICAgICAgICAgICAjIGFkanVzdCBvdXIgY3VycmVudCBhZ2UgYnkgb3VyIG1pbiBmcmVzaAogICAgICAgICAgICBjdXJyZW50X2FnZSArPSBtaW5fZnJlc2gKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdBZGp1c3RlZCBjdXJyZW50IGFnZSBmcm9tIG1pbi1mcmVzaDogJWknLAogICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9hZ2UpCgogICAgICAgICMgUmV0dXJuIGVudHJ5IGlmIGl0IGlzIGZyZXNoIGVub3VnaAogICAgICAgIGlmIGZyZXNobmVzc19saWZldGltZSA+IGN1cnJlbnRfYWdlOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1RoZSByZXNwb25zZSBpcyAiZnJlc2giLCByZXR1cm5pbmcgY2FjaGVkIHJlc3BvbnNlJykKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCclaSA+ICVpJywgZnJlc2huZXNzX2xpZmV0aW1lLCBjdXJyZW50X2FnZSkKICAgICAgICAgICAgcmV0dXJuIHJlc3AKCiAgICAgICAgIyB3ZSdyZSBub3QgZnJlc2guIElmIHdlIGRvbid0IGhhdmUgYW4gRXRhZywgY2xlYXIgaXQgb3V0CiAgICAgICAgaWYgJ2V0YWcnIG5vdCBpbiBoZWFkZXJzOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAnVGhlIGNhY2hlZCByZXNwb25zZSBpcyAic3RhbGUiIHdpdGggbm8gZXRhZywgcHVyZ2luZycKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLmNhY2hlLmRlbGV0ZShjYWNoZV91cmwpCgogICAgICAgICMgcmV0dXJuIHRoZSBvcmlnaW5hbCBoYW5kbGVyCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIGNvbmRpdGlvbmFsX2hlYWRlcnMoc2VsZiwgcmVxdWVzdCk6CiAgICAgICAgY2FjaGVfdXJsID0gc2VsZi5jYWNoZV91cmwocmVxdWVzdC51cmwpCiAgICAgICAgcmVzcCA9IHNlbGYuc2VyaWFsaXplci5sb2FkcyhyZXF1ZXN0LCBzZWxmLmNhY2hlLmdldChjYWNoZV91cmwpKQogICAgICAgIG5ld19oZWFkZXJzID0ge30KCiAgICAgICAgaWYgcmVzcDoKICAgICAgICAgICAgaGVhZGVycyA9IENhc2VJbnNlbnNpdGl2ZURpY3QocmVzcC5oZWFkZXJzKQoKICAgICAgICAgICAgaWYgJ2V0YWcnIGluIGhlYWRlcnM6CiAgICAgICAgICAgICAgICBuZXdfaGVhZGVyc1snSWYtTm9uZS1NYXRjaCddID0gaGVhZGVyc1snRVRhZyddCgogICAgICAgICAgICBpZiAnbGFzdC1tb2RpZmllZCcgaW4gaGVhZGVyczoKICAgICAgICAgICAgICAgIG5ld19oZWFkZXJzWydJZi1Nb2RpZmllZC1TaW5jZSddID0gaGVhZGVyc1snTGFzdC1Nb2RpZmllZCddCgogICAgICAgIHJldHVybiBuZXdfaGVhZGVycwoKICAgIGRlZiBjYWNoZV9yZXNwb25zZShzZWxmLCByZXF1ZXN0LCByZXNwb25zZSwgYm9keT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBBbGdvcml0aG0gZm9yIGNhY2hpbmcgcmVxdWVzdHMuCgogICAgICAgIFRoaXMgYXNzdW1lcyBhIHJlcXVlc3RzIFJlc3BvbnNlIG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICAjIEZyb20gaHR0cGxpYjI6IERvbid0IGNhY2hlIDIwNidzIHNpbmNlIHdlIGFyZW4ndCBnb2luZyB0bwogICAgICAgICMgICAgICAgICAgICAgICAgaGFuZGxlIGJ5dGUgcmFuZ2UgcmVxdWVzdHMKICAgICAgICBjYWNoZWFibGVfc3RhdHVzX2NvZGVzID0gWzIwMCwgMjAzLCAzMDAsIDMwMV0KICAgICAgICBpZiByZXNwb25zZS5zdGF0dXMgbm90IGluIGNhY2hlYWJsZV9zdGF0dXNfY29kZXM6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICdTdGF0dXMgY29kZSAlcyBub3QgaW4gJXMnLAogICAgICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzLAogICAgICAgICAgICAgICAgY2FjaGVhYmxlX3N0YXR1c19jb2RlcwogICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICByZXNwb25zZV9oZWFkZXJzID0gQ2FzZUluc2Vuc2l0aXZlRGljdChyZXNwb25zZS5oZWFkZXJzKQoKICAgICAgICAjIElmIHdlJ3ZlIGJlZW4gZ2l2ZW4gYSBib2R5LCBvdXIgcmVzcG9uc2UgaGFzIGEgQ29udGVudC1MZW5ndGgsIHRoYXQKICAgICAgICAjIENvbnRlbnQtTGVuZ3RoIGlzIHZhbGlkIHRoZW4gd2UgY2FuIGNoZWNrIHRvIHNlZSBpZiB0aGUgYm9keSB3ZSd2ZQogICAgICAgICMgYmVlbiBnaXZlbiBtYXRjaGVzIHRoZSBleHBlY3RlZCBzaXplLCBhbmQgaWYgaXQgZG9lc24ndCB3ZSdsbCBqdXN0CiAgICAgICAgIyBza2lwIHRyeWluZyB0byBjYWNoZSBpdC4KICAgICAgICBpZiAoYm9keSBpcyBub3QgTm9uZSBhbmQKICAgICAgICAgICAgICAgICJjb250ZW50LWxlbmd0aCIgaW4gcmVzcG9uc2VfaGVhZGVycyBhbmQKICAgICAgICAgICAgICAgIHJlc3BvbnNlX2hlYWRlcnNbImNvbnRlbnQtbGVuZ3RoIl0uaXNkaWdpdCgpIGFuZAogICAgICAgICAgICAgICAgaW50KHJlc3BvbnNlX2hlYWRlcnNbImNvbnRlbnQtbGVuZ3RoIl0pICE9IGxlbihib2R5KSk6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBjY19yZXEgPSBzZWxmLnBhcnNlX2NhY2hlX2NvbnRyb2wocmVxdWVzdC5oZWFkZXJzKQogICAgICAgIGNjID0gc2VsZi5wYXJzZV9jYWNoZV9jb250cm9sKHJlc3BvbnNlX2hlYWRlcnMpCgogICAgICAgIGNhY2hlX3VybCA9IHNlbGYuY2FjaGVfdXJsKHJlcXVlc3QudXJsKQogICAgICAgIGxvZ2dlci5kZWJ1ZygnVXBkYXRpbmcgY2FjaGUgd2l0aCByZXNwb25zZSBmcm9tICIlcyInLCBjYWNoZV91cmwpCgogICAgICAgICMgRGVsZXRlIGl0IGZyb20gdGhlIGNhY2hlIGlmIHdlIGhhcHBlbiB0byBoYXZlIGl0IHN0b3JlZCB0aGVyZQogICAgICAgIG5vX3N0b3JlID0gRmFsc2UKICAgICAgICBpZiBjYy5nZXQoJ25vLXN0b3JlJyk6CiAgICAgICAgICAgIG5vX3N0b3JlID0gVHJ1ZQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1Jlc3BvbnNlIGhlYWRlciBoYXMgIm5vLXN0b3JlIicpCiAgICAgICAgaWYgY2NfcmVxLmdldCgnbm8tc3RvcmUnKToKICAgICAgICAgICAgbm9fc3RvcmUgPSBUcnVlCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVxdWVzdCBoZWFkZXIgaGFzICJuby1zdG9yZSInKQogICAgICAgIGlmIG5vX3N0b3JlIGFuZCBzZWxmLmNhY2hlLmdldChjYWNoZV91cmwpOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1B1cmdpbmcgZXhpc3RpbmcgY2FjaGUgZW50cnkgdG8gaG9ub3IgIm5vLXN0b3JlIicpCiAgICAgICAgICAgIHNlbGYuY2FjaGUuZGVsZXRlKGNhY2hlX3VybCkKCiAgICAgICAgIyBJZiB3ZSd2ZSBiZWVuIGdpdmVuIGFuIGV0YWcsIHRoZW4ga2VlcCB0aGUgcmVzcG9uc2UKICAgICAgICBpZiBzZWxmLmNhY2hlX2V0YWdzIGFuZCAnZXRhZycgaW4gcmVzcG9uc2VfaGVhZGVyczoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdDYWNoaW5nIGR1ZSB0byBldGFnJykKICAgICAgICAgICAgc2VsZi5jYWNoZS5zZXQoCiAgICAgICAgICAgICAgICBjYWNoZV91cmwsCiAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZXIuZHVtcHMocmVxdWVzdCwgcmVzcG9uc2UsIGJvZHk9Ym9keSksCiAgICAgICAgICAgICkKCiAgICAgICAgIyBBZGQgdG8gdGhlIGNhY2hlIGFueSAzMDFzLiBXZSBkbyB0aGlzIGJlZm9yZSBsb29raW5nIHRoYXQKICAgICAgICAjIHRoZSBEYXRlIGhlYWRlcnMuCiAgICAgICAgZWxpZiByZXNwb25zZS5zdGF0dXMgPT0gMzAxOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0NhY2hpbmcgcGVybWFuYW50IHJlZGlyZWN0JykKICAgICAgICAgICAgc2VsZi5jYWNoZS5zZXQoCiAgICAgICAgICAgICAgICBjYWNoZV91cmwsCiAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZXIuZHVtcHMocmVxdWVzdCwgcmVzcG9uc2UpCiAgICAgICAgICAgICkKCiAgICAgICAgIyBBZGQgdG8gdGhlIGNhY2hlIGlmIHRoZSByZXNwb25zZSBoZWFkZXJzIGRlbWFuZCBpdC4gSWYgdGhlcmUKICAgICAgICAjIGlzIG5vIGRhdGUgaGVhZGVyIHRoZW4gd2UgY2FuJ3QgZG8gYW55dGhpbmcgYWJvdXQgZXhwaXJpbmcKICAgICAgICAjIHRoZSBjYWNoZS4KICAgICAgICBlbGlmICdkYXRlJyBpbiByZXNwb25zZV9oZWFkZXJzOgogICAgICAgICAgICAjIGNhY2hlIHdoZW4gdGhlcmUgaXMgYSBtYXgtYWdlID4gMAogICAgICAgICAgICBpZiBjYyBhbmQgY2MuZ2V0KCdtYXgtYWdlJyk6CiAgICAgICAgICAgICAgICBpZiBjY1snbWF4LWFnZSddLmlzZGlnaXQoKSBhbmQgaW50KGNjWydtYXgtYWdlJ10pID4gMDoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0NhY2hpbmcgYi9jIGRhdGUgZXhpc3RzIGFuZCBtYXgtYWdlID4gMCcpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jYWNoZS5zZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlX3VybCwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVyLmR1bXBzKHJlcXVlc3QsIHJlc3BvbnNlLCBib2R5PWJvZHkpLAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgSWYgdGhlIHJlcXVlc3QgY2FuIGV4cGlyZSwgaXQgbWVhbnMgd2Ugc2hvdWxkIGNhY2hlIGl0CiAgICAgICAgICAgICMgaW4gdGhlIG1lYW50aW1lLgogICAgICAgICAgICBlbGlmICdleHBpcmVzJyBpbiByZXNwb25zZV9oZWFkZXJzOgogICAgICAgICAgICAgICAgaWYgcmVzcG9uc2VfaGVhZGVyc1snZXhwaXJlcyddOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQ2FjaGluZyBiL2Mgb2YgZXhwaXJlcyBoZWFkZXInKQogICAgICAgICAgICAgICAgICAgIHNlbGYuY2FjaGUuc2V0KAogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV91cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplci5kdW1wcyhyZXF1ZXN0LCByZXNwb25zZSwgYm9keT1ib2R5KSwKICAgICAgICAgICAgICAgICAgICApCgogICAgZGVmIHVwZGF0ZV9jYWNoZWRfcmVzcG9uc2Uoc2VsZiwgcmVxdWVzdCwgcmVzcG9uc2UpOgogICAgICAgICIiIk9uIGEgMzA0IHdlIHdpbGwgZ2V0IGEgbmV3IHNldCBvZiBoZWFkZXJzIHRoYXQgd2Ugd2FudCB0bwogICAgICAgIHVwZGF0ZSBvdXIgY2FjaGVkIHZhbHVlIHdpdGgsIGFzc3VtaW5nIHdlIGhhdmUgb25lLgoKICAgICAgICBUaGlzIHNob3VsZCBvbmx5IGV2ZXIgYmUgY2FsbGVkIHdoZW4gd2UndmUgc2VudCBhbiBFVGFnIGFuZAogICAgICAgIGdvdHRlbiBhIDMwNCBhcyB0aGUgcmVzcG9uc2UuCiAgICAgICAgIiIiCiAgICAgICAgY2FjaGVfdXJsID0gc2VsZi5jYWNoZV91cmwocmVxdWVzdC51cmwpCgogICAgICAgIGNhY2hlZF9yZXNwb25zZSA9IHNlbGYuc2VyaWFsaXplci5sb2FkcygKICAgICAgICAgICAgcmVxdWVzdCwKICAgICAgICAgICAgc2VsZi5jYWNoZS5nZXQoY2FjaGVfdXJsKQogICAgICAgICkKCiAgICAgICAgaWYgbm90IGNhY2hlZF9yZXNwb25zZToKICAgICAgICAgICAgIyB3ZSBkaWRuJ3QgaGF2ZSBhIGNhY2hlZCByZXNwb25zZQogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UKCiAgICAgICAgIyBMZXRzIHVwZGF0ZSBvdXIgaGVhZGVycyB3aXRoIHRoZSBoZWFkZXJzIGZyb20gdGhlIG5ldyByZXF1ZXN0OgogICAgICAgICMgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXA0LWNvbmRpdGlvbmFsLTI2I3NlY3Rpb24tNC4xCiAgICAgICAgIwogICAgICAgICMgVGhlIHNlcnZlciBpc24ndCBzdXBwb3NlZCB0byBzZW5kIGhlYWRlcnMgdGhhdCB3b3VsZCBtYWtlCiAgICAgICAgIyB0aGUgY2FjaGVkIGJvZHkgaW52YWxpZC4gQnV0Li4uIGp1c3QgaW4gY2FzZSwgd2UnbGwgYmUgc3VyZQogICAgICAgICMgdG8gc3RyaXAgb3V0IG9uZXMgd2Uga25vdyB0aGF0IG1pZ2h0IGJlIHByb2JsbWF0aWMgZHVlIHRvCiAgICAgICAgIyB0eXBpY2FsIGFzc3VtcHRpb25zLgogICAgICAgIGV4Y2x1ZGVkX2hlYWRlcnMgPSBbCiAgICAgICAgICAgICJjb250ZW50LWxlbmd0aCIsCiAgICAgICAgXQoKICAgICAgICBjYWNoZWRfcmVzcG9uc2UuaGVhZGVycy51cGRhdGUoCiAgICAgICAgICAgIGRpY3QoKGssIHYpIGZvciBrLCB2IGluIHJlc3BvbnNlLmhlYWRlcnMuaXRlbXMoKQogICAgICAgICAgICAgICAgIGlmIGsubG93ZXIoKSBub3QgaW4gZXhjbHVkZWRfaGVhZGVycykKICAgICAgICApCgogICAgICAgICMgd2Ugd2FudCBhIDIwMCBiL2Mgd2UgaGF2ZSBjb250ZW50IHZpYSB0aGUgY2FjaGUKICAgICAgICBjYWNoZWRfcmVzcG9uc2Uuc3RhdHVzID0gMjAwCgogICAgICAgICMgdXBkYXRlIG91ciBjYWNoZQogICAgICAgIHNlbGYuY2FjaGUuc2V0KAogICAgICAgICAgICBjYWNoZV91cmwsCiAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplci5kdW1wcyhyZXF1ZXN0LCBjYWNoZWRfcmVzcG9uc2UpLAogICAgICAgICkKCiAgICAgICAgcmV0dXJuIGNhY2hlZF9yZXNwb25zZQpQSwMEFAAAAAAAAAAhAGwmNHzjCQAA4wkAADcAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2ZpbGV3cmFwcGVyLnB5ZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwoKCmNsYXNzIENhbGxiYWNrRmlsZVdyYXBwZXIob2JqZWN0KToKICAgICIiIgogICAgU21hbGwgd3JhcHBlciBhcm91bmQgYSBmcCBvYmplY3Qgd2hpY2ggd2lsbCB0ZWUgZXZlcnl0aGluZyByZWFkIGludG8gYQogICAgYnVmZmVyLCBhbmQgd2hlbiB0aGF0IGZpbGUgaXMgY2xvc2VkIGl0IHdpbGwgZXhlY3V0ZSBhIGNhbGxiYWNrIHdpdGggdGhlCiAgICBjb250ZW50cyBvZiB0aGF0IGJ1ZmZlci4KCiAgICBBbGwgYXR0cmlidXRlcyBhcmUgcHJveGllZCB0byB0aGUgdW5kZXJseWluZyBmaWxlIG9iamVjdC4KCiAgICBUaGlzIGNsYXNzIHVzZXMgbWVtYmVycyB3aXRoIGEgZG91YmxlIHVuZGVyc2NvcmUgKF9fKSBsZWFkaW5nIHByZWZpeCBzbyBhcwogICAgbm90IHRvIGFjY2lkZW50YWxseSBzaGFkb3cgYW4gYXR0cmlidXRlLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZwLCBjYWxsYmFjayk6CiAgICAgICAgc2VsZi5fX2J1ZiA9IEJ5dGVzSU8oKQogICAgICAgIHNlbGYuX19mcCA9IGZwCiAgICAgICAgc2VsZi5fX2NhbGxiYWNrID0gY2FsbGJhY2sKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAgIyBUaGUgdmFndWFyaWVzIG9mIGdhcmJhZ2UgY29sbGVjdGlvbiBtZWFucyB0aGF0IHNlbGYuX19mcCBpcwogICAgICAgICMgbm90IGFsd2F5cyBzZXQuICBCeSB1c2luZyBfX2dldGF0dHJpYnV0ZV9fIGFuZCB0aGUgcHJpdmF0ZQogICAgICAgICMgbmFtZVswXSBhbGxvd3MgbG9va2luZyB1cCB0aGUgYXR0cmlidXRlIHZhbHVlIGFuZCByYWlzaW5nIGFuCiAgICAgICAgIyBBdHRyaWJ1dGVFcnJvciB3aGVuIGl0IGRvZXNuJ3QgZXhpc3QuIFRoaXMgc3RvcCB0aGlnbnMgZnJvbQogICAgICAgICMgaW5maW5pdGVseSByZWN1cnNpbmcgY2FsbHMgdG8gZ2V0YXR0ciBpbiB0aGUgY2FzZSB3aGVyZQogICAgICAgICMgc2VsZi5fX2ZwIGhhc24ndCBiZWVuIHNldC4KICAgICAgICAjCiAgICAgICAgIyBbMF0gaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMi9yZWZlcmVuY2UvZXhwcmVzc2lvbnMuaHRtbCNhdG9tLWlkZW50aWZpZXJzCiAgICAgICAgZnAgPSBzZWxmLl9fZ2V0YXR0cmlidXRlX18oJ19DYWxsYmFja0ZpbGVXcmFwcGVyX19mcCcpCiAgICAgICAgcmV0dXJuIGdldGF0dHIoZnAsIG5hbWUpCgogICAgZGVmIF9faXNfZnBfY2xvc2VkKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19mcC5mcCBpcyBOb25lCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBwYXNzCgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19mcC5jbG9zZWQKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgIyBXZSBqdXN0IGRvbid0IGNhY2hlIGl0IHRoZW4uCiAgICAgICAgIyBUT0RPOiBBZGQgc29tZSBsb2dnaW5nIGhlcmUuLi4KICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX2Nsb3NlKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX19jYWxsYmFjazoKICAgICAgICAgICAgc2VsZi5fX2NhbGxiYWNrKHNlbGYuX19idWYuZ2V0dmFsdWUoKSkKCiAgICAgICAgIyBXZSBhc3NpZ24gdGhpcyB0byBOb25lIGhlcmUsIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIGNhbiBnZXQgaW50bwogICAgICAgICMgcmVhbGx5IHRyaWNreSBwcm9ibGVtcyB3aGVyZSB0aGUgQ1B5dGhvbiBpbnRlcnByZXRlciBkZWFkIGxvY2tzCiAgICAgICAgIyBiZWNhdXNlIHRoZSBjYWxsYmFjayBpcyBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIHNvbWV0aGluZyB3aGljaAogICAgICAgICMgaGFzIGEgX19kZWxfXyBtZXRob2QuIFNldHRpbmcgdGhpcyB0byBOb25lIGJyZWFrcyB0aGUgY3ljbGUKICAgICAgICAjIGFuZCBhbGxvd3MgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHRvIGRvIGl0J3MgdGhpbmcgbm9ybWFsbHkuCiAgICAgICAgc2VsZi5fX2NhbGxiYWNrID0gTm9uZQoKICAgIGRlZiByZWFkKHNlbGYsIGFtdD1Ob25lKToKICAgICAgICBkYXRhID0gc2VsZi5fX2ZwLnJlYWQoYW10KQogICAgICAgIHNlbGYuX19idWYud3JpdGUoZGF0YSkKICAgICAgICBpZiBzZWxmLl9faXNfZnBfY2xvc2VkKCk6CiAgICAgICAgICAgIHNlbGYuX2Nsb3NlKCkKCiAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBkZWYgX3NhZmVfcmVhZChzZWxmLCBhbXQpOgogICAgICAgIGRhdGEgPSBzZWxmLl9fZnAuX3NhZmVfcmVhZChhbXQpCiAgICAgICAgaWYgYW10ID09IDIgYW5kIGRhdGEgPT0gYidcclxuJzoKICAgICAgICAgICAgIyB1cmxsaWIgZXhlY3V0ZXMgdGhpcyByZWFkIHRvIHRvc3MgdGhlIENSTEYgYXQgdGhlIGVuZAogICAgICAgICAgICAjIG9mIHRoZSBjaHVuay4KICAgICAgICAgICAgcmV0dXJuIGRhdGEKCiAgICAgICAgc2VsZi5fX2J1Zi53cml0ZShkYXRhKQogICAgICAgIGlmIHNlbGYuX19pc19mcF9jbG9zZWQoKToKICAgICAgICAgICAgc2VsZi5fY2xvc2UoKQoKICAgICAgICByZXR1cm4gZGF0YQpQSwMEFAAAAAAAAAAhAA5UHvwtEAAALRAAADYAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2hldXJpc3RpY3MucHlpbXBvcnQgY2FsZW5kYXIKaW1wb3J0IHRpbWUKCmZyb20gZW1haWwudXRpbHMgaW1wb3J0IGZvcm1hdGRhdGUsIHBhcnNlZGF0ZSwgcGFyc2VkYXRlX3R6Cgpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZSwgdGltZWRlbHRhCgpUSU1FX0ZNVCA9ICIlYSwgJWQgJWIgJVkgJUg6JU06JVMgR01UIgoKCmRlZiBleHBpcmVfYWZ0ZXIoZGVsdGEsIGRhdGU9Tm9uZSk6CiAgICBkYXRlID0gZGF0ZSBvciBkYXRldGltZS5ub3coKQogICAgcmV0dXJuIGRhdGUgKyBkZWx0YQoKCmRlZiBkYXRldGltZV90b19oZWFkZXIoZHQpOgogICAgcmV0dXJuIGZvcm1hdGRhdGUoY2FsZW5kYXIudGltZWdtKGR0LnRpbWV0dXBsZSgpKSkKCgpjbGFzcyBCYXNlSGV1cmlzdGljKG9iamVjdCk6CgogICAgZGVmIHdhcm5pbmcoc2VsZiwgcmVzcG9uc2UpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIHZhbGlkIDF4eCB3YXJuaW5nIGhlYWRlciB2YWx1ZSBkZXNjcmliaW5nIHRoZSBjYWNoZQogICAgICAgIGFkanVzdG1lbnRzLgoKICAgICAgICBUaGUgcmVzcG9uc2UgaXMgcHJvdmlkZWQgdG9vIGFsbG93IHdhcm5pbmdzIGxpa2UgMTEzCiAgICAgICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzNCNzZWN0aW9uLTUuNS40IHdoZXJlIHdlIG5lZWQKICAgICAgICB0byBleHBsaWNpdGx5IHNheSByZXNwb25zZSBpcyBvdmVyIDI0IGhvdXJzIG9sZC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gJzExMCAtICJSZXNwb25zZSBpcyBTdGFsZSInCgogICAgZGVmIHVwZGF0ZV9oZWFkZXJzKHNlbGYsIHJlc3BvbnNlKToKICAgICAgICAiIiJVcGRhdGUgdGhlIHJlc3BvbnNlIGhlYWRlcnMgd2l0aCBhbnkgbmV3IGhlYWRlcnMuCgogICAgICAgIE5PVEU6IFRoaXMgU0hPVUxEIGFsd2F5cyBpbmNsdWRlIHNvbWUgV2FybmluZyBoZWFkZXIgdG8KICAgICAgICAgICAgICBzaWduaWZ5IHRoYXQgdGhlIHJlc3BvbnNlIHdhcyBjYWNoZWQgYnkgdGhlIGNsaWVudCwgbm90CiAgICAgICAgICAgICAgYnkgd2F5IG9mIHRoZSBwcm92aWRlZCBoZWFkZXJzLgogICAgICAgICIiIgogICAgICAgIHJldHVybiB7fQoKICAgIGRlZiBhcHBseShzZWxmLCByZXNwb25zZSk6CiAgICAgICAgdXBkYXRlZF9oZWFkZXJzID0gc2VsZi51cGRhdGVfaGVhZGVycyhyZXNwb25zZSkKCiAgICAgICAgaWYgdXBkYXRlZF9oZWFkZXJzOgogICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzLnVwZGF0ZSh1cGRhdGVkX2hlYWRlcnMpCiAgICAgICAgICAgIHdhcm5pbmdfaGVhZGVyX3ZhbHVlID0gc2VsZi53YXJuaW5nKHJlc3BvbnNlKQogICAgICAgICAgICBpZiB3YXJuaW5nX2hlYWRlcl92YWx1ZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMudXBkYXRlKHsnV2FybmluZyc6IHdhcm5pbmdfaGVhZGVyX3ZhbHVlfSkKCiAgICAgICAgcmV0dXJuIHJlc3BvbnNlCgoKY2xhc3MgT25lRGF5Q2FjaGUoQmFzZUhldXJpc3RpYyk6CiAgICAiIiIKICAgIENhY2hlIHRoZSByZXNwb25zZSBieSBwcm92aWRpbmcgYW4gZXhwaXJlcyAxIGRheSBpbiB0aGUKICAgIGZ1dHVyZS4KICAgICIiIgogICAgZGVmIHVwZGF0ZV9oZWFkZXJzKHNlbGYsIHJlc3BvbnNlKToKICAgICAgICBoZWFkZXJzID0ge30KCiAgICAgICAgaWYgJ2V4cGlyZXMnIG5vdCBpbiByZXNwb25zZS5oZWFkZXJzOgogICAgICAgICAgICBkYXRlID0gcGFyc2VkYXRlKHJlc3BvbnNlLmhlYWRlcnNbJ2RhdGUnXSkKICAgICAgICAgICAgZXhwaXJlcyA9IGV4cGlyZV9hZnRlcih0aW1lZGVsdGEoZGF5cz0xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPWRhdGV0aW1lKCpkYXRlWzo2XSkpCiAgICAgICAgICAgIGhlYWRlcnNbJ2V4cGlyZXMnXSA9IGRhdGV0aW1lX3RvX2hlYWRlcihleHBpcmVzKQogICAgICAgICAgICBoZWFkZXJzWydjYWNoZS1jb250cm9sJ10gPSAncHVibGljJwogICAgICAgIHJldHVybiBoZWFkZXJzCgoKY2xhc3MgRXhwaXJlc0FmdGVyKEJhc2VIZXVyaXN0aWMpOgogICAgIiIiCiAgICBDYWNoZSAqKmFsbCoqIHJlcXVlc3RzIGZvciBhIGRlZmluZWQgdGltZSBwZXJpb2QuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKiprdyk6CiAgICAgICAgc2VsZi5kZWx0YSA9IHRpbWVkZWx0YSgqKmt3KQoKICAgIGRlZiB1cGRhdGVfaGVhZGVycyhzZWxmLCByZXNwb25zZSk6CiAgICAgICAgZXhwaXJlcyA9IGV4cGlyZV9hZnRlcihzZWxmLmRlbHRhKQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICdleHBpcmVzJzogZGF0ZXRpbWVfdG9faGVhZGVyKGV4cGlyZXMpLAogICAgICAgICAgICAnY2FjaGUtY29udHJvbCc6ICdwdWJsaWMnLAogICAgICAgIH0KCiAgICBkZWYgd2FybmluZyhzZWxmLCByZXNwb25zZSk6CiAgICAgICAgdG1wbCA9ICcxMTAgLSBBdXRvbWF0aWNhbGx5IGNhY2hlZCBmb3IgJXMuIFJlc3BvbnNlIG1pZ2h0IGJlIHN0YWxlJwogICAgICAgIHJldHVybiB0bXBsICUgc2VsZi5kZWx0YQoKCmNsYXNzIExhc3RNb2RpZmllZChCYXNlSGV1cmlzdGljKToKICAgICIiIgogICAgSWYgdGhlcmUgaXMgbm8gRXhwaXJlcyBoZWFkZXIgYWxyZWFkeSwgZmFsbCBiYWNrIG9uIExhc3QtTW9kaWZpZWQKICAgIHVzaW5nIHRoZSBoZXVyaXN0aWMgZnJvbQogICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzNCNzZWN0aW9uLTQuMi4yCiAgICB0byBjYWxjdWxhdGUgYSByZWFzb25hYmxlIHZhbHVlLgoKICAgIEZpcmVmb3ggYWxzbyBkb2VzIHNvbWV0aGluZyBsaWtlIHRoaXMgcGVyCiAgICBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0NhY2hpbmdfRkFRCiAgICBodHRwOi8vbHhyLm1vemlsbGEub3JnL21vemlsbGEtcmVsZWFzZS9zb3VyY2UvbmV0d2Vyay9wcm90b2NvbC9odHRwL25zSHR0cFJlc3BvbnNlSGVhZC5jcHAjMzk3CiAgICBVbmxpa2UgbW96aWxsYSB3ZSBsaW1pdCB0aGlzIHRvIDI0LWhyLgogICAgIiIiCiAgICBjYWNoZWFibGVfYnlfZGVmYXVsdF9zdGF0dXNlcyA9IHNldChbCiAgICAgICAgMjAwLCAyMDMsIDIwNCwgMjA2LCAzMDAsIDMwMSwgNDA0LCA0MDUsIDQxMCwgNDE0LCA1MDEKICAgIF0pCgogICAgZGVmIHVwZGF0ZV9oZWFkZXJzKHNlbGYsIHJlc3ApOgogICAgICAgIGhlYWRlcnMgPSByZXNwLmhlYWRlcnMKCiAgICAgICAgaWYgJ2V4cGlyZXMnIGluIGhlYWRlcnM6CiAgICAgICAgICAgIHJldHVybiB7fQoKICAgICAgICBpZiAnY2FjaGUtY29udHJvbCcgaW4gaGVhZGVycyBhbmQgaGVhZGVyc1snY2FjaGUtY29udHJvbCddICE9ICdwdWJsaWMnOgogICAgICAgICAgICByZXR1cm4ge30KCiAgICAgICAgaWYgcmVzcC5zdGF0dXMgbm90IGluIHNlbGYuY2FjaGVhYmxlX2J5X2RlZmF1bHRfc3RhdHVzZXM6CiAgICAgICAgICAgIHJldHVybiB7fQoKICAgICAgICBpZiAnZGF0ZScgbm90IGluIGhlYWRlcnMgb3IgJ2xhc3QtbW9kaWZpZWQnIG5vdCBpbiBoZWFkZXJzOgogICAgICAgICAgICByZXR1cm4ge30KCiAgICAgICAgZGF0ZSA9IGNhbGVuZGFyLnRpbWVnbShwYXJzZWRhdGVfdHooaGVhZGVyc1snZGF0ZSddKSkKICAgICAgICBsYXN0X21vZGlmaWVkID0gcGFyc2VkYXRlKGhlYWRlcnNbJ2xhc3QtbW9kaWZpZWQnXSkKICAgICAgICBpZiBkYXRlIGlzIE5vbmUgb3IgbGFzdF9tb2RpZmllZCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4ge30KCiAgICAgICAgbm93ID0gdGltZS50aW1lKCkKICAgICAgICBjdXJyZW50X2FnZSA9IG1heCgwLCBub3cgLSBkYXRlKQogICAgICAgIGRlbHRhID0gZGF0ZSAtIGNhbGVuZGFyLnRpbWVnbShsYXN0X21vZGlmaWVkKQogICAgICAgIGZyZXNobmVzc19saWZldGltZSA9IG1heCgwLCBtaW4oZGVsdGEgLyAxMCwgMjQgKiAzNjAwKSkKICAgICAgICBpZiBmcmVzaG5lc3NfbGlmZXRpbWUgPD0gY3VycmVudF9hZ2U6CiAgICAgICAgICAgIHJldHVybiB7fQoKICAgICAgICBleHBpcmVzID0gZGF0ZSArIGZyZXNobmVzc19saWZldGltZQogICAgICAgIHJldHVybiB7J2V4cGlyZXMnOiB0aW1lLnN0cmZ0aW1lKFRJTUVfRk1ULCB0aW1lLmdtdGltZShleHBpcmVzKSl9CgogICAgZGVmIHdhcm5pbmcoc2VsZiwgcmVzcCk6CiAgICAgICAgcmV0dXJuIE5vbmUKUEsDBBQAAAAAAAAAIQASYYC4iBkAAIgZAAA1AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9zZXJpYWxpemUucHlpbXBvcnQgYmFzZTY0CmltcG9ydCBpbwppbXBvcnQganNvbgppbXBvcnQgemxpYgoKZnJvbSBwaXAuX3ZlbmRvci5yZXF1ZXN0cy5zdHJ1Y3R1cmVzIGltcG9ydCBDYXNlSW5zZW5zaXRpdmVEaWN0Cgpmcm9tIC5jb21wYXQgaW1wb3J0IEhUVFBSZXNwb25zZSwgcGlja2xlLCB0ZXh0X3R5cGUKCgpkZWYgX2I2NF9lbmNvZGVfYnl0ZXMoYik6CiAgICByZXR1cm4gYmFzZTY0LmI2NGVuY29kZShiKS5kZWNvZGUoImFzY2lpIikKCgpkZWYgX2I2NF9lbmNvZGVfc3RyKHMpOgogICAgcmV0dXJuIF9iNjRfZW5jb2RlX2J5dGVzKHMuZW5jb2RlKCJ1dGY4IikpCgoKZGVmIF9iNjRfZW5jb2RlKHMpOgogICAgaWYgaXNpbnN0YW5jZShzLCB0ZXh0X3R5cGUpOgogICAgICAgIHJldHVybiBfYjY0X2VuY29kZV9zdHIocykKICAgIHJldHVybiBfYjY0X2VuY29kZV9ieXRlcyhzKQoKCmRlZiBfYjY0X2RlY29kZV9ieXRlcyhiKToKICAgIHJldHVybiBiYXNlNjQuYjY0ZGVjb2RlKGIuZW5jb2RlKCJhc2NpaSIpKQoKCmRlZiBfYjY0X2RlY29kZV9zdHIocyk6CiAgICByZXR1cm4gX2I2NF9kZWNvZGVfYnl0ZXMocykuZGVjb2RlKCJ1dGY4IikKCgpjbGFzcyBTZXJpYWxpemVyKG9iamVjdCk6CgogICAgZGVmIGR1bXBzKHNlbGYsIHJlcXVlc3QsIHJlc3BvbnNlLCBib2R5PU5vbmUpOgogICAgICAgIHJlc3BvbnNlX2hlYWRlcnMgPSBDYXNlSW5zZW5zaXRpdmVEaWN0KHJlc3BvbnNlLmhlYWRlcnMpCgogICAgICAgIGlmIGJvZHkgaXMgTm9uZToKICAgICAgICAgICAgYm9keSA9IHJlc3BvbnNlLnJlYWQoZGVjb2RlX2NvbnRlbnQ9RmFsc2UpCgogICAgICAgICAgICAjIE5PVEU6IDk5JSBzdXJlIHRoaXMgaXMgZGVhZCBjb2RlLiBJJ20gb25seSBsZWF2aW5nIGl0CiAgICAgICAgICAgICMgICAgICAgaGVyZSBiL2MgSSBkb24ndCBoYXZlIGEgdGVzdCB5ZXQgdG8gcHJvdmUKICAgICAgICAgICAgIyAgICAgICBpdC4gQmFzaWNhbGx5LCBiZWZvcmUgdXNpbmcKICAgICAgICAgICAgIyAgICAgICBgY2FjaGVjb250cm9sLmZpbGV3cmFwcGVyLkNhbGxiYWNrRmlsZVdyYXBwZXJgLAogICAgICAgICAgICAjICAgICAgIHRoaXMgbWFkZSBhbiBlZmZvcnQgdG8gcmVzZXQgdGhlIGZpbGUgaGFuZGxlLiBUaGUKICAgICAgICAgICAgIyAgICAgICBgQ2FsbGJhY2tGaWxlV3JhcHBlcmAgc2hvcnQgY2lyY3VpdHMgdGhpcyBjb2RlIGJ5CiAgICAgICAgICAgICMgICAgICAgc2V0dGluZyB0aGUgYm9keSBhcyB0aGUgY29udGVudCBpcyBjb25zdW1lZCwgdGhlCiAgICAgICAgICAgICMgICAgICAgcmVzdWx0IGJlaW5nIGEgYGJvZHlgIGFyZ3VtZW50IGlzICphbHdheXMqIHBhc3NlZAogICAgICAgICAgICAjICAgICAgIGludG8gY2FjaGVfcmVzcG9uc2UsIGFuZCBpbiB0dXJuLAogICAgICAgICAgICAjICAgICAgIGBTZXJpYWxpemVyLmR1bXBgLgogICAgICAgICAgICByZXNwb25zZS5fZnAgPSBpby5CeXRlc0lPKGJvZHkpCgogICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICJyZXNwb25zZSI6IHsKICAgICAgICAgICAgICAgICJib2R5IjogX2I2NF9lbmNvZGVfYnl0ZXMoYm9keSksCiAgICAgICAgICAgICAgICAiaGVhZGVycyI6IGRpY3QoCiAgICAgICAgICAgICAgICAgICAgKF9iNjRfZW5jb2RlKGspLCBfYjY0X2VuY29kZSh2KSkKICAgICAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiByZXNwb25zZS5oZWFkZXJzLml0ZW1zKCkKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAic3RhdHVzIjogcmVzcG9uc2Uuc3RhdHVzLAogICAgICAgICAgICAgICAgInZlcnNpb24iOiByZXNwb25zZS52ZXJzaW9uLAogICAgICAgICAgICAgICAgInJlYXNvbiI6IF9iNjRfZW5jb2RlX3N0cihyZXNwb25zZS5yZWFzb24pLAogICAgICAgICAgICAgICAgInN0cmljdCI6IHJlc3BvbnNlLnN0cmljdCwKICAgICAgICAgICAgICAgICJkZWNvZGVfY29udGVudCI6IHJlc3BvbnNlLmRlY29kZV9jb250ZW50LAogICAgICAgICAgICB9LAogICAgICAgIH0KCiAgICAgICAgIyBDb25zdHJ1Y3Qgb3VyIHZhcnkgaGVhZGVycwogICAgICAgIGRhdGFbInZhcnkiXSA9IHt9CiAgICAgICAgaWYgInZhcnkiIGluIHJlc3BvbnNlX2hlYWRlcnM6CiAgICAgICAgICAgIHZhcmllZF9oZWFkZXJzID0gcmVzcG9uc2VfaGVhZGVyc1sndmFyeSddLnNwbGl0KCcsJykKICAgICAgICAgICAgZm9yIGhlYWRlciBpbiB2YXJpZWRfaGVhZGVyczoKICAgICAgICAgICAgICAgIGhlYWRlciA9IGhlYWRlci5zdHJpcCgpCiAgICAgICAgICAgICAgICBkYXRhWyJ2YXJ5Il1baGVhZGVyXSA9IHJlcXVlc3QuaGVhZGVycy5nZXQoaGVhZGVyLCBOb25lKQoKICAgICAgICAjIEVuY29kZSBvdXIgVmFyeSBoZWFkZXJzIHRvIGVuc3VyZSB0aGV5IGNhbiBiZSBzZXJpYWxpemVkIGFzIEpTT04KICAgICAgICBkYXRhWyJ2YXJ5Il0gPSBkaWN0KAogICAgICAgICAgICAoX2I2NF9lbmNvZGUoayksIF9iNjRfZW5jb2RlKHYpIGlmIHYgaXMgbm90IE5vbmUgZWxzZSB2KQogICAgICAgICAgICBmb3IgaywgdiBpbiBkYXRhWyJ2YXJ5Il0uaXRlbXMoKQogICAgICAgICkKCiAgICAgICAgcmV0dXJuIGIiLCIuam9pbihbCiAgICAgICAgICAgIGIiY2M9MiIsCiAgICAgICAgICAgIHpsaWIuY29tcHJlc3MoCiAgICAgICAgICAgICAgICBqc29uLmR1bXBzKAogICAgICAgICAgICAgICAgICAgIGRhdGEsIHNlcGFyYXRvcnM9KCIsIiwgIjoiKSwgc29ydF9rZXlzPVRydWUsCiAgICAgICAgICAgICAgICApLmVuY29kZSgidXRmOCIpLAogICAgICAgICAgICApLAogICAgICAgIF0pCgogICAgZGVmIGxvYWRzKHNlbGYsIHJlcXVlc3QsIGRhdGEpOgogICAgICAgICMgU2hvcnQgY2lyY3VpdCBpZiB3ZSd2ZSBiZWVuIGdpdmVuIGFuIGVtcHR5IHNldCBvZiBkYXRhCiAgICAgICAgaWYgbm90IGRhdGE6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIERldGVybWluZSB3aGF0IHZlcnNpb24gb2YgdGhlIHNlcmlhbGl6ZXIgdGhlIGRhdGEgd2FzIHNlcmlhbGl6ZWQKICAgICAgICAjIHdpdGgKICAgICAgICB0cnk6CiAgICAgICAgICAgIHZlciwgZGF0YSA9IGRhdGEuc3BsaXQoYiIsIiwgMSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgdmVyID0gYiJjYz0wIgoKICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IG91ciAidmVyIiBpcyBhY3R1YWxseSBhIHZlcnNpb24gYW5kIGlzbid0IGEgZmFsc2UKICAgICAgICAjIHBvc2l0aXZlIGZyb20gYSAsIGJlaW5nIGluIHRoZSBkYXRhIHN0cmVhbS4KICAgICAgICBpZiB2ZXJbOjNdICE9IGIiY2M9IjoKICAgICAgICAgICAgZGF0YSA9IHZlciArIGRhdGEKICAgICAgICAgICAgdmVyID0gYiJjYz0wIgoKICAgICAgICAjIEdldCB0aGUgdmVyc2lvbiBudW1iZXIgb3V0IG9mIHRoZSBjYz1OCiAgICAgICAgdmVyID0gdmVyLnNwbGl0KGIiPSIsIDEpWy0xXS5kZWNvZGUoImFzY2lpIikKCiAgICAgICAgIyBEaXNwYXRjaCB0byB0aGUgYWN0dWFsIGxvYWQgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gdmVyc2lvbgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgIl9sb2Fkc192ezB9Ii5mb3JtYXQodmVyKSkocmVxdWVzdCwgZGF0YSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICMgVGhpcyBpcyBhIHZlcnNpb24gd2UgZG9uJ3QgaGF2ZSBhIGxvYWRzIGZ1bmN0aW9uIGZvciwgc28gd2UnbGwKICAgICAgICAgICAgIyBqdXN0IHRyZWF0IGl0IGFzIGEgbWlzcyBhbmQgcmV0dXJuIE5vbmUKICAgICAgICAgICAgcmV0dXJuCgogICAgZGVmIHByZXBhcmVfcmVzcG9uc2Uoc2VsZiwgcmVxdWVzdCwgY2FjaGVkKToKICAgICAgICAiIiJWZXJpZnkgb3VyIHZhcnkgaGVhZGVycyBtYXRjaCBhbmQgY29uc3RydWN0IGEgcmVhbCB1cmxsaWIzCiAgICAgICAgSFRUUFJlc3BvbnNlIG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICAjIFNwZWNpYWwgY2FzZSB0aGUgJyonIFZhcnkgdmFsdWUgYXMgaXQgbWVhbnMgd2UgY2Fubm90IGFjdHVhbGx5CiAgICAgICAgIyBkZXRlcm1pbmUgaWYgdGhlIGNhY2hlZCByZXNwb25zZSBpcyBzdWl0YWJsZSBmb3IgdGhpcyByZXF1ZXN0LgogICAgICAgIGlmICIqIiBpbiBjYWNoZWQuZ2V0KCJ2YXJ5Iiwge30pOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBFbnN1cmUgdGhhdCB0aGUgVmFyeSBoZWFkZXJzIGZvciB0aGUgY2FjaGVkIHJlc3BvbnNlIG1hdGNoIG91cgogICAgICAgICMgcmVxdWVzdAogICAgICAgIGZvciBoZWFkZXIsIHZhbHVlIGluIGNhY2hlZC5nZXQoInZhcnkiLCB7fSkuaXRlbXMoKToKICAgICAgICAgICAgaWYgcmVxdWVzdC5oZWFkZXJzLmdldChoZWFkZXIsIE5vbmUpICE9IHZhbHVlOgogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGJvZHlfcmF3ID0gY2FjaGVkWyJyZXNwb25zZSJdLnBvcCgiYm9keSIpCgogICAgICAgIGhlYWRlcnMgPSBDYXNlSW5zZW5zaXRpdmVEaWN0KGRhdGE9Y2FjaGVkWydyZXNwb25zZSddWydoZWFkZXJzJ10pCiAgICAgICAgaWYgaGVhZGVycy5nZXQoJ3RyYW5zZmVyLWVuY29kaW5nJywgJycpID09ICdjaHVua2VkJzoKICAgICAgICAgICAgaGVhZGVycy5wb3AoJ3RyYW5zZmVyLWVuY29kaW5nJykKCiAgICAgICAgY2FjaGVkWydyZXNwb25zZSddWydoZWFkZXJzJ10gPSBoZWFkZXJzCgogICAgICAgIHRyeToKICAgICAgICAgICAgYm9keSA9IGlvLkJ5dGVzSU8oYm9keV9yYXcpCiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgIyBUaGlzIGNhbiBoYXBwZW4gaWYgY2FjaGVjb250cm9sIHNlcmlhbGl6ZWQgdG8gdjEgZm9ybWF0IChwaWNrbGUpCiAgICAgICAgICAgICMgdXNpbmcgUHl0aG9uIDIuIEEgUHl0aG9uIDIgc3RyKGJ5dGUgc3RyaW5nKSB3aWxsIGJlIHVucGlja2xlZCBhcwogICAgICAgICAgICAjIGEgUHl0aG9uIDMgc3RyICh1bmljb2RlIHN0cmluZyksIHdoaWNoIHdpbGwgY2F1c2UgdGhlIGFib3ZlIHRvCiAgICAgICAgICAgICMgZmFpbCB3aXRoOgogICAgICAgICAgICAjCiAgICAgICAgICAgICMgICAgIFR5cGVFcnJvcjogJ3N0cicgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYnVmZmVyIGludGVyZmFjZQogICAgICAgICAgICBib2R5ID0gaW8uQnl0ZXNJTyhib2R5X3Jhdy5lbmNvZGUoJ3V0ZjgnKSkKCiAgICAgICAgcmV0dXJuIEhUVFBSZXNwb25zZSgKICAgICAgICAgICAgYm9keT1ib2R5LAogICAgICAgICAgICBwcmVsb2FkX2NvbnRlbnQ9RmFsc2UsCiAgICAgICAgICAgICoqY2FjaGVkWyJyZXNwb25zZSJdCiAgICAgICAgKQoKICAgIGRlZiBfbG9hZHNfdjAoc2VsZiwgcmVxdWVzdCwgZGF0YSk6CiAgICAgICAgIyBUaGUgb3JpZ2luYWwgbGVnYWN5IGNhY2hlIGRhdGEuIFRoaXMgZG9lc24ndCBjb250YWluIGVub3VnaAogICAgICAgICMgaW5mb3JtYXRpb24gdG8gY29uc3RydWN0IGV2ZXJ5dGhpbmcgd2UgbmVlZCwgc28gd2UnbGwgdHJlYXQgdGhpcyBhcwogICAgICAgICMgYSBtaXNzLgogICAgICAgIHJldHVybgoKICAgIGRlZiBfbG9hZHNfdjEoc2VsZiwgcmVxdWVzdCwgZGF0YSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBjYWNoZWQgPSBwaWNrbGUubG9hZHMoZGF0YSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHJldHVybiBzZWxmLnByZXBhcmVfcmVzcG9uc2UocmVxdWVzdCwgY2FjaGVkKQoKICAgIGRlZiBfbG9hZHNfdjIoc2VsZiwgcmVxdWVzdCwgZGF0YSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBjYWNoZWQgPSBqc29uLmxvYWRzKHpsaWIuZGVjb21wcmVzcyhkYXRhKS5kZWNvZGUoInV0ZjgiKSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgV2UgbmVlZCB0byBkZWNvZGUgdGhlIGl0ZW1zIHRoYXQgd2UndmUgYmFzZTY0IGVuY29kZWQKICAgICAgICBjYWNoZWRbInJlc3BvbnNlIl1bImJvZHkiXSA9IF9iNjRfZGVjb2RlX2J5dGVzKAogICAgICAgICAgICBjYWNoZWRbInJlc3BvbnNlIl1bImJvZHkiXQogICAgICAgICkKICAgICAgICBjYWNoZWRbInJlc3BvbnNlIl1bImhlYWRlcnMiXSA9IGRpY3QoCiAgICAgICAgICAgIChfYjY0X2RlY29kZV9zdHIoayksIF9iNjRfZGVjb2RlX3N0cih2KSkKICAgICAgICAgICAgZm9yIGssIHYgaW4gY2FjaGVkWyJyZXNwb25zZSJdWyJoZWFkZXJzIl0uaXRlbXMoKQogICAgICAgICkKICAgICAgICBjYWNoZWRbInJlc3BvbnNlIl1bInJlYXNvbiJdID0gX2I2NF9kZWNvZGVfc3RyKAogICAgICAgICAgICBjYWNoZWRbInJlc3BvbnNlIl1bInJlYXNvbiJdLAogICAgICAgICkKICAgICAgICBjYWNoZWRbInZhcnkiXSA9IGRpY3QoCiAgICAgICAgICAgIChfYjY0X2RlY29kZV9zdHIoayksIF9iNjRfZGVjb2RlX3N0cih2KSBpZiB2IGlzIG5vdCBOb25lIGVsc2UgdikKICAgICAgICAgICAgZm9yIGssIHYgaW4gY2FjaGVkWyJ2YXJ5Il0uaXRlbXMoKQogICAgICAgICkKCiAgICAgICAgcmV0dXJuIHNlbGYucHJlcGFyZV9yZXNwb25zZShyZXF1ZXN0LCBjYWNoZWQpClBLAwQUAAAAAAAAACEAi3vFQvIBAADyAQAAMwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvd3JhcHBlci5weWZyb20gLmFkYXB0ZXIgaW1wb3J0IENhY2hlQ29udHJvbEFkYXB0ZXIKZnJvbSAuY2FjaGUgaW1wb3J0IERpY3RDYWNoZQoKCmRlZiBDYWNoZUNvbnRyb2woc2VzcywKICAgICAgICAgICAgICAgICBjYWNoZT1Ob25lLAogICAgICAgICAgICAgICAgIGNhY2hlX2V0YWdzPVRydWUsCiAgICAgICAgICAgICAgICAgc2VyaWFsaXplcj1Ob25lLAogICAgICAgICAgICAgICAgIGhldXJpc3RpYz1Ob25lKToKCiAgICBjYWNoZSA9IGNhY2hlIG9yIERpY3RDYWNoZSgpCiAgICBhZGFwdGVyID0gQ2FjaGVDb250cm9sQWRhcHRlcigKICAgICAgICBjYWNoZSwKICAgICAgICBjYWNoZV9ldGFncz1jYWNoZV9ldGFncywKICAgICAgICBzZXJpYWxpemVyPXNlcmlhbGl6ZXIsCiAgICAgICAgaGV1cmlzdGljPWhldXJpc3RpYywKICAgICkKICAgIHNlc3MubW91bnQoJ2h0dHA6Ly8nLCBhZGFwdGVyKQogICAgc2Vzcy5tb3VudCgnaHR0cHM6Ly8nLCBhZGFwdGVyKQoKICAgIHJldHVybiBzZXNzClBLAwQUAAAAAAAAACEAFHAFRz8AAAA/AAAALwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jZXJ0aWZpL19faW5pdF9fLnB5ZnJvbSAuY29yZSBpbXBvcnQgd2hlcmUsIG9sZF93aGVyZQoKX192ZXJzaW9uX18gPSAiMjAxOC4wMS4xOCIKUEsDBBQAAAAAAAAAIQCDK9rBKQAAACkAAAAvAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NlcnRpZmkvX19tYWluX18ucHlmcm9tIGNlcnRpZmkgaW1wb3J0IHdoZXJlCnByaW50KHdoZXJlKCkpClBLAwQUAAAAAAAAACEABaHa9fAiBADwIgQALgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jZXJ0aWZpL2NhY2VydC5wZW0KIyBJc3N1ZXI6IENOPUdsb2JhbFNpZ24gUm9vdCBDQSBPPUdsb2JhbFNpZ24gbnYtc2EgT1U9Um9vdCBDQQojIFN1YmplY3Q6IENOPUdsb2JhbFNpZ24gUm9vdCBDQSBPPUdsb2JhbFNpZ24gbnYtc2EgT1U9Um9vdCBDQQojIExhYmVsOiAiR2xvYmFsU2lnbiBSb290IENBIgojIFNlcmlhbDogNDgzNTcwMzI3ODQ1OTcwNzY2OTAwNTIwNAojIE1ENSBGaW5nZXJwcmludDogM2U6NDU6NTI6MTU6MDk6NTE6OTI6ZTE6Yjc6NWQ6Mzc6OWY6YjE6ODc6Mjk6OGEKIyBTSEExIEZpbmdlcnByaW50OiBiMTpiYzo5Njo4YjpkNDpmNDo5ZDo2MjoyYTphODo5YTo4MTpmMjoxNTowMTo1MjphNDoxZDo4Mjo5YwojIFNIQTI1NiBGaW5nZXJwcmludDogZWI6ZDQ6MTA6NDA6ZTQ6YmI6M2U6Yzc6NDI6Yzk6ZTM6ODE6ZDM6MWU6ZjI6YTQ6MWE6NDg6YjY6Njg6NWM6OTY6ZTc6Y2U6ZjM6YzE6ZGY6NmM6ZDQ6MzM6MWM6OTkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURkVENDQWwyZ0F3SUJBZ0lMQkFBQUFBQUJGVXRhdzVRd0RRWUpLb1pJaHZjTkFRRUZCUUF3VnpFTE1Ba0cKQTFVRUJoTUNRa1V4R1RBWEJnTlZCQW9URUVkc2IySmhiRk5wWjI0Z2JuWXRjMkV4RURBT0JnTlZCQXNUQjFKdgpiM1FnUTBFeEd6QVpCZ05WQkFNVEVrZHNiMkpoYkZOcFoyNGdVbTl2ZENCRFFUQWVGdzA1T0RBNU1ERXhNakF3Ck1EQmFGdzB5T0RBeE1qZ3hNakF3TURCYU1GY3hDekFKQmdOVkJBWVRBa0pGTVJrd0Z3WURWUVFLRXhCSGJHOWkKWVd4VGFXZHVJRzUyTFhOaE1SQXdEZ1lEVlFRTEV3ZFNiMjkwSUVOQk1Sc3dHUVlEVlFRREV4SkhiRzlpWVd4VAphV2R1SUZKdmIzUWdRMEV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRGFEdWFaCmpjNmo0MCtLZnZ2eGk0TWxhK3BJSC9FcXNMbVZFUVM5OEdQUjRtZG16eHpkenh0SUsrNk5pWTZhcnltQVphdnAKeHkwU3k2c2NUSEFIb1QwS01NMFZqVS80M2RTTVVCVWM3MUR1eEM3My9PbFM4cEY5NEczVk5UQ09Ya056OGtIcAoxV3Jqc29rNlZqazRid1k4aUdsYktrM0ZwMVM0YkluTW0vazh5dVg5aWZVU1BKSjRsdGJjZEc2VFJHSFJqY2RHCnNuVU9odWdaaXRWdGJOVjRGcFdpNmNnS09PdnlKQk5QYzFTVEU0VTZHN3dlTkxXTEJZeTVkNHV4Mng4Z2thc0oKVTI2UXpuczNkTGx3UjVFaVVXTVdlYTZ4cmtFbUNNZ1pLOUZHcWtqV1pDclhnelQvTENyQmJCbERTZ2VGNTlOOAo5aUZvNytyeVVwOS9rNURQQWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFCkJUQURBUUgvTUIwR0ExVWREZ1FXQkJSZ2UyWWFSUTJYeW9sUUwzMEV6VFNvLy96OVN6QU5CZ2txaGtpRzl3MEIKQVFVRkFBT0NBUUVBMW5QbmZFOTIwSTIvN0xxaXZqVEZLREsxZlB4c25Dd3J2UW1lVTc5clhxb1JTTGJsQ0tPegp5ajFoVGROR0NiTSt3NkRqWTFVYjhycnZyVG5oUTdrNG8rWXZpaVk3NzZCUVZ2bkdDdjA0emNRTGNGR1VsNWdFCjM4TmZsTlVWeVJSQm5NUmRkV1FWRGY5Vk1PeUdqLzhON3l5NVkwYjJxdnpmdkduOUxoSklaSnJnbGZDbTd5bVAKQWJFVnRRd2RwZjVwTEdra2VCNnpweHh4WXU3S3lKZXNGMTJLd3ZoSGhtNHF4Rll4bGRCbmlZVXIrV3ltWFVhZApES3FDNUpsUjNYQzMyMVk5WWVScTRWelc5djQ5M2tITUI2NWpVcjlUVS9RcjZjZjl0dmVDWDRYU1FSamJnYk1FCkhNVWZwSUJ2RlNESjNneUlDaDNXWmxYaS9FakpLU1pwNEE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBSb290IENBIC0gUjIKIyBTdWJqZWN0OiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIFJvb3QgQ0EgLSBSMgojIExhYmVsOiAiR2xvYmFsU2lnbiBSb290IENBIC0gUjIiCiMgU2VyaWFsOiA0ODM1NzAzMjc4NDU5NjgyODg1NjU4MTI1CiMgTUQ1IEZpbmdlcnByaW50OiA5NDoxNDo3Nzo3ZTozZTo1ZTpmZDo4ZjozMDpiZDo0MTpiMDpjZjplNzpkMDozMAojIFNIQTEgRmluZ2VycHJpbnQ6IDc1OmUwOmFiOmI2OjEzOjg1OjEyOjI3OjFjOjA0OmY4OjVmOmRkOmRlOjM4OmU0OmI3OjI0OjJlOmZlCiMgU0hBMjU2IEZpbmdlcnByaW50OiBjYTo0MjpkZDo0MTo3NDo1ZjpkMDpiODoxZTpiOTowMjozNjoyYzpmOTpkODpiZjo3MTo5ZDphMTpiZDoxYjoxZTpmYzo5NDo2Zjo1Yjo0Yzo5OTpmNDoyYzoxYjo5ZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHVqQ0NBcUtnQXdJQkFnSUxCQUFBQUFBQkQ0WW01ZzB3RFFZSktvWklodmNOQVFFRkJRQXdUREVnTUI0RwpBMVVFQ3hNWFIyeHZZbUZzVTJsbmJpQlNiMjkwSUVOQklDMGdVakl4RXpBUkJnTlZCQW9UQ2tkc2IySmhiRk5wCloyNHhFekFSQmdOVkJBTVRDa2RzYjJKaGJGTnBaMjR3SGhjTk1EWXhNakUxTURnd01EQXdXaGNOTWpFeE1qRTEKTURnd01EQXdXakJNTVNBd0hnWURWUVFMRXhkSGJHOWlZV3hUYVdkdUlGSnZiM1FnUTBFZ0xTQlNNakVUTUJFRwpBMVVFQ2hNS1IyeHZZbUZzVTJsbmJqRVRNQkVHQTFVRUF4TUtSMnh2WW1Gc1UybG5iakNDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS2JQSkE2K0xtOG9tVVZDeEtzK0lWU2JDOU4vaEhENkVyUEwKdjRkZnhuK0cwN0l3WE5iOXJmRjczT1g0WUpZSmtoRDEwRlBlKzN0K2M0aXNVb2g3U3FiS1NhWmVxS2VNV2hHOAplb0xydm96cHM2eVdKUWVYU3BrcUJ5KzBIbmUvaWcrMUFud2JscmpGdVRvc3ZOWVN1ZXRaZmVMUUJvWmZYa2xxCnRUbGVpRFRzdkhnTUNKaUViS2pOUzdTZ2ZReDVUZkM0TGNzaHl0VnNXMzNob0NtRW9mblRsRW5MSkdLUklMemQKQzlYWnpQbnFKd29yYzVIR25SdXN5TXZvNEtEMEw1Q0xUZnV3Tmh2MkdYcUY0RzN5WVJPSVhKL2drd3BSbDRwYQp6cStyMWZlcUNhcGd2ZHpaWDk5eXFXQVRYZ0FCeVVyNlA2VHFCd01oQW82Q3lnUENtNDhDQXdFQUFhT0JuRENCCm1UQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVW0rSUgKVjJjY0hzQnFCdDVadEpvdDM5d1poaTR3TmdZRFZSMGZCQzh3TFRBcm9DbWdKNFlsYUhSMGNEb3ZMMk55YkM1bgpiRzlpWVd4emFXZHVMbTVsZEM5eWIyOTBMWEl5TG1OeWJEQWZCZ05WSFNNRUdEQVdnQlNiNGdkWFp4d2V3R29HCjNsbTBtaTNmM0JtR0xqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFtWUZUaHh4b2w0YVI3T0JLdUVRTHE0R3MKSjAvV3diZ2NRM2l6REpyODZpdzhibUViVFVzcDlaOEZIU2JCdU9tREFHSkZ0cWtJazdtcE0wc1ltc0w0aDRoTwoyOTF4TkJyQlZOcEdQK0RUS3F0dFZDTDFPbUxOSUcrNktZblgzWkh1MDF5aVBxRmJRZlhmNVdSRExlblZPYXZTCm90KzNpOURBZ0JrY1JjQXRqT2o0TGFSMFZrbkZCYlZQRmQ1dVJIZzVoNmgrdS9ONUdKRzc5Rytkd2ZDTU5ZeGQKQWZ2RGJibnZSRzE1UmpGK0N2NnBnc0gvNzZ0dUlNUlF5VitkVFpzWGpBemxBY21nUVdwelUvcWxVTFJ1SlEvNwpUQmowL1ZMWmptbXg2QkVQM29qWSt4MUo5NnJlbGM4Z2VNSmdFdHNsUUl4cS9INUNPRUJrRXZlZWdlR1RMZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIlZlcmlzaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyIKIyBTZXJpYWw6IDIwNjY4NDY5NjI3OTQ3MjMxMDI1NDI3Nzg3MDE4MDk2NjcyMzQxNQojIE1ENSBGaW5nZXJwcmludDogY2Q6Njg6YjY6YTc6Yzc6YzQ6Y2U6NzU6ZTA6MWQ6NGY6NTc6NDQ6NjE6OTI6MDkKIyBTSEExIEZpbmdlcnByaW50OiAxMzoyZDowZDo0NTo1Mzo0Yjo2OTo5NzpjZDpiMjpkNTpjMzozOTplMjo1NTo3Njo2MDo5Yjo1YzpjNgojIFNIQTI1NiBGaW5nZXJwcmludDogZWI6MDQ6Y2Y6NWU6YjE6ZjM6OWE6ZmE6NzY6MmY6MmI6YjE6MjA6ZjI6OTY6Y2I6YTU6MjA6YzE6Yjk6N2Q6YjE6NTg6OTU6NjU6Yjg6MWM6Yjk6YTE6N2I6NzI6NDQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVHakNDQXdJQ0VRQ2JmZ1pKb3o1aXVkWHVrRWh4S2U5WE1BMEdDU3FHU0liM0RRRUJCUVVBTUlIS01Rc3cKQ1FZRFZRUUdFd0pWVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabApjbWxUYVdkdUlGUnlkWE4wSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1CkxDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4UlRCREJnTlZCQU1UUEZabGNtbFQKYVdkdUlFTnNZWE56SURNZ1VIVmliR2xqSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcApkSGtnTFNCSE16QWVGdzA1T1RFd01ERXdNREF3TURCYUZ3MHpOakEzTVRZeU16VTVOVGxhTUlIS01Rc3dDUVlEClZRUUdFd0pWVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabGNtbFQKYVdkdUlGUnlkWE4wSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1TENCSgpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4UlRCREJnTlZCQU1UUEZabGNtbFRhV2R1CklFTnNZWE56SURNZ1VIVmliR2xqSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2cKTFNCSE16Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU11Nm5GTDhlQjhhSG04YgpOM085K01scmxCSXdUL0EyUi9YUWtRcjFGOGlsWWNFV1FFMzdpbUdRNVhZZ3dSRUdmYXNzYnFiMUVVR08raTJ0CkttRlpwR2NtVE5Eb3ZGSmJjQ0FFV05GNnlhUnB2SU1YWkswRmk3elFXTTZOalBYcjhFSkpDNTJYSjJjeWJ1R3UKa3hVY2NMd2dUUzhZM3BLSTZHeUZWeEVhNlg3akpoRlVva1dXVllQS01Jbm8zTmlqN1NxQVAzOTVaVmMrRlNCbQpDQytWazcrcVJ5K29ScGZ3RXVMK3dnb3JVZVoyNXJkR3QrSU5wc3lvdzB4WlZZbm02Rk5jSE9xZDhHSVdDNmZKClh3enczc0oyenEvM2F2TDZRYWFpTXhUSjVYcGowNTVpTjlXRlpaNE81bE1rZEJ0ZUhSSlRXOGNzNTROSk94V3UKaW1pNVY1Y0NBd0VBQVRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQUVSU1d3YXVTQ1BjL0w4bXkvdVJhbjJUZQoyeUZQaHBrMGRqWlgzZEFWTDhXdGZ4VWZOMkp6UHRUblg4NFhBOXMxK2l2YnJtQUpYeDVmajI2N0N6M3FXaE1lCkRHQnZ0Y0MxSXlJdUJ3dkxxWFRMUjdzZHdkZWxhOHd2MGtMOVNkMm5pYzlUdXRvQVdpaS9ndC80dWhNZFVJYUMKL1k0d2p5bEdzQjQ5TmRvNFloWVlTcTNtdGxGczNxOWk2d0hRSGlUK2VvOFNHaEpvdVB0bW1SUVVSVnl1NTY1cApGNEVyV2pmSlhpcjB4dUtoWEZTYnBsUUF6L0R4d2NlWU1CbzdOaGJibzI3cS9hMnl3dHJ2QWtjVGlzRHhzekd0ClR4emhUNXl2RHd5ZDkzZ04yUFExVm9EYXQyMFhqNTBlZ1dUaC9zVkZ1cTFydVFwNlRrOUxoTzVMOFgzZEVRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KSBPPUVudHJ1c3QubmV0IE9VPXd3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikvKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZAojIFN1YmplY3Q6IENOPUVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KSBPPUVudHJ1c3QubmV0IE9VPXd3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikvKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZAojIExhYmVsOiAiRW50cnVzdC5uZXQgUHJlbWl1bSAyMDQ4IFNlY3VyZSBTZXJ2ZXIgQ0EiCiMgU2VyaWFsOiA5NDYwNjkyNDAKIyBNRDUgRmluZ2VycHJpbnQ6IGVlOjI5OjMxOmJjOjMyOjdlOjlhOmU2OmU4OmI1OmY3OjUxOmI0OjM0OjcxOjkwCiMgU0hBMSBGaW5nZXJwcmludDogNTA6MzA6MDY6MDk6MWQ6OTc6ZDQ6ZjU6YWU6Mzk6Zjc6Y2I6ZTc6OTI6N2Q6N2Q6NjU6MmQ6MzQ6MzEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDZkOmM0OjcxOjcyOmUwOjFjOmJjOmIwOmJmOjYyOjU4OjBkOjg5OjVmOmUyOmI4OmFjOjlhOmQ0OmY4OjczOjgwOjFlOjBjOjEwOmI5OmM4OjM3OmQyOjFlOmIxOjc3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFS2pDQ0F4S2dBd0lCQWdJRU9HUGUrREFOQmdrcWhraUc5dzBCQVFVRkFEQ0J0REVVTUJJR0ExVUVDaE1MClJXNTBjblZ6ZEM1dVpYUXhRREErQmdOVkJBc1VOM2QzZHk1bGJuUnlkWE4wTG01bGRDOURVRk5mTWpBME9DQnAKYm1OdmNuQXVJR0o1SUhKbFppNGdLR3hwYldsMGN5QnNhV0ZpTGlreEpUQWpCZ05WQkFzVEhDaGpLU0F4T1RrNQpJRVZ1ZEhKMWMzUXVibVYwSUV4cGJXbDBaV1F4TXpBeEJnTlZCQU1US2tWdWRISjFjM1F1Ym1WMElFTmxjblJwClptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDZ3lNRFE0S1RBZUZ3MDVPVEV5TWpReE56VXdOVEZhRncweU9UQTMKTWpReE5ERTFNVEphTUlHME1SUXdFZ1lEVlFRS0V3dEZiblJ5ZFhOMExtNWxkREZBTUQ0R0ExVUVDeFEzZDNkMwpMbVZ1ZEhKMWMzUXVibVYwTDBOUVUxOHlNRFE0SUdsdVkyOXljQzRnWW5rZ2NtVm1MaUFvYkdsdGFYUnpJR3hwCllXSXVLVEVsTUNNR0ExVUVDeE1jS0dNcElERTVPVGtnUlc1MGNuVnpkQzV1WlhRZ1RHbHRhWFJsWkRFek1ERUcKQTFVRUF4TXFSVzUwY25WemRDNXVaWFFnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dLREl3TkRncApNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXJVMUxxUktHc3VxaklBY1ZGbVFxCkswdlJ2d3RLVFk3dGdIYWxaN2Q0UU1CelFzaG93TnRUSzkxZXVIYVlOWk9MR3AxOEV6b09IMXUzSHMvbEpCUWUKc1lHcGpYMjR6R3RMQS9FQ0ROeXJwVUFrQUg5MGxLR2RDQ216aUF2MWgzZWRWYzNrdzM3WGFtU3JoUlNHbFZ1WApNbEJ2UGNpNlpnemovTDI0U2NGMmlVa1ovY0Nvdlltalp5L0duN3h4R1dDNExla3N5WkIyWm51VTRxOTQxbVZUClhUelduTExQS1FQNUw2UlFzdFJJemdVeVZZcjlzbVJNRHVTWUIzWGJmOSs1Q0ZWZ2hUQXArWHRJcEdtRzR6VS8KSG9aZGVub1Z2ZThBamhVaVZCY0FrQ2FUdkE1SmFKRy8rRWZUblpWQ3dRNU4zMjhtejhNWUlXSm1RM0RXMWNBSAo0UUlEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WCkhRNEVGZ1FVVmVTQjBSR0F2dGlKdVFpak1mbWhKQWtXdVhBd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFEdWIKajFhYk1PZFRtWHg2ZWFkTmw5Y1psWkQ3QmgvS00zeEdZNCtXWmlUNlFCc2hKOHJtY25QeVQvNHhtZjNJREV4bwpVOGFBZ2hPWStyYXQybDA5OGM1dTloVVJsSUlNN2orVnJ4R3JEOWN2M2g4RGoxY3NIc203bWhwRWxlc1lUNllmCnpYMVhFQytiQkFsYWhMVnUyQjA2NGRhZTBXeDVYbmtjRk1YajBFeVRPMlU4N2Q4OXZxYmxsUnJEdFJuRHZWNWIKdS84ajcyZ1p5eEtUSjF3RExXOHcwQjYyR3F6ZVd2ZlJxcWducHY1NWdjUjVtVE5YdWhLd3FlQkNiSlBLVnQ3KwpiWVFMQ0l0K2plclhtQ0hHOCtjOGVTOWVuTkZNRlkzaDdDSTN6SnBEQzVmY2dKQ05zMmViYjBnSUZWYlB2L0VyCmZGNmFkdWxaa01WOGd6VVJaVkU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1CYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290IE89QmFsdGltb3JlIE9VPUN5YmVyVHJ1c3QKIyBTdWJqZWN0OiBDTj1CYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290IE89QmFsdGltb3JlIE9VPUN5YmVyVHJ1c3QKIyBMYWJlbDogIkJhbHRpbW9yZSBDeWJlclRydXN0IFJvb3QiCiMgU2VyaWFsOiAzMzU1NDYxNwojIE1ENSBGaW5nZXJwcmludDogYWM6YjY6OTQ6YTU6OWM6MTc6ZTA6ZDc6OTE6NTI6OWI6YjE6OTc6MDY6YTY6ZTQKIyBTSEExIEZpbmdlcnByaW50OiBkNDpkZToyMDpkMDo1ZTo2NjpmYzo1MzpmZToxYTo1MDo4ODoyYzo3ODpkYjoyODo1MjpjYTplNDo3NAojIFNIQTI1NiBGaW5nZXJwcmludDogMTY6YWY6NTc6YTk6ZjY6NzY6YjA6YWI6MTI6NjA6OTU6YWE6NWU6YmE6ZGU6ZjI6MmE6YjM6MTE6MTk6ZDY6NDQ6YWM6OTU6Y2Q6NGI6OTM6ZGI6ZjM6ZjI6NmE6ZWIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURkekNDQWwrZ0F3SUJBZ0lFQWdBQXVUQU5CZ2txaGtpRzl3MEJBUVVGQURCYU1Rc3dDUVlEVlFRR0V3SkoKUlRFU01CQUdBMVVFQ2hNSlFtRnNkR2x0YjNKbE1STXdFUVlEVlFRTEV3cERlV0psY2xSeWRYTjBNU0l3SUFZRApWUVFERXhsQ1lXeDBhVzF2Y21VZ1EzbGlaWEpVY25WemRDQlNiMjkwTUI0WERUQXdNRFV4TWpFNE5EWXdNRm9YCkRUSTFNRFV4TWpJek5Ua3dNRm93V2pFTE1Ba0dBMVVFQmhNQ1NVVXhFakFRQmdOVkJBb1RDVUpoYkhScGJXOXkKWlRFVE1CRUdBMVVFQ3hNS1EzbGlaWEpVY25WemRERWlNQ0FHQTFVRUF4TVpRbUZzZEdsdGIzSmxJRU41WW1WeQpWSEoxYzNRZ1VtOXZkRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLTUV1eUtyCm1EMVg2Q1p5bXJWNTFDbmk0ZWlWZ0xHdzQxdU9LeW1hWk4raFhlMndDUVZ0MnlndXptS2lZdjYwaU5vUzZ6anIKSVozQVFTc0JVbnVJZDlNY2o4ZTZ1WWkxYWdubmMrZ1JRS2ZSek1waWpTM2xqd3VtVU5Lb1VNTW82dldySlllSwptcFljcVdlNFB3elY5L2xTRXkvQ0c5VndjUENQd0JMS0JzdWE0ZG5LTTNwMzF2anN1ZkZvUkVKSUU5TEF3cVN1ClhtRCt0cVlGL0xUZEIxa0MxRmtZbUdQMXBXUGdrQXg5WGJJR2V2T0Y2dXZVQTY1ZWhENWYveFh0YWJ6NU9UWnkKZGM5M1VrM3p5WkFzdVQzbHlTTlRQeDhrbUNGY0I1a3B2Y1k2N09kdWhqcHJsM1JqTTcxb0dESHdlSTEydi95ZQpqbDBxaHFkTmtOd25HamtDQXdFQUFhTkZNRU13SFFZRFZSME9CQllFRk9XZFdUQ0NSMWpNclBvSVZEYUdlenExCkJFM3dNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUU13RGdZRFZSMFBBUUgvQkFRREFnRUdNQTBHQ1NxR1NJYjMKRFFFQkJRVUFBNElCQVFDRkRGMk81RzlSYUVJRm9OMjdUeWNsaEFPOTkyVDlMZGN3NDZRUUYrdmFLU20yZVQ5Mgo5aGtUSTdnUUN2bFlwTlJoY0wwRVlXb1NpaGZWQ3IzRnZEQjgxdWtNSlkyR1FFL3N6S04rT01ZM0VVL3QzV2d4CmprelNzd0YwN3I1MVhnZElHbjl3L3haY2hNQjVoYmdGL1grK1pSR2pEOEFDdFBoU056a0UxYWt4ZWhpL29DcjAKRXBuM28wV0M0enhlOVoyZXRjaWVmQzdJcEo1T0NCUkxiZjF3YldzYVk3MWs1aCszenZEeW55NjdHN2Z5VUloegprc0xpNHhhTm1qSUNxNDRZM2VrUUVlNStOYXVRcno0d2xIclFNejJuWlEvMS9JNmVZczlIUkN3Qlhic2R0VExTClI5STRMdEQrZ2R3eWFoNjE3anpWL09lQkhSbkRKRUxxWXptcAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9vdCBPPUFkZFRydXN0IEFCIE9VPUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrCiMgU3ViamVjdDogQ049QWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9vdCBPPUFkZFRydXN0IEFCIE9VPUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrCiMgTGFiZWw6ICJBZGRUcnVzdCBFeHRlcm5hbCBSb290IgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogMWQ6MzU6NTQ6MDQ6ODU6Nzg6YjA6M2Y6NDI6NDI6NGQ6YmY6MjA6NzM6MGE6M2YKIyBTSEExIEZpbmdlcnByaW50OiAwMjpmYTpmMzplMjo5MTo0Mzo1NDo2ODo2MDo3ODo1Nzo2OTo0ZDpmNTplNDo1Yjo2ODo4NToxODo2OAojIFNIQTI1NiBGaW5nZXJwcmludDogNjg6N2Y6YTQ6NTE6Mzg6MjI6Nzg6ZmY6ZjA6Yzg6YjE6MWY6OGQ6NDM6ZDU6NzY6Njc6MWM6NmU6YjI6YmM6ZWE6YjQ6MTM6ZmI6ODM6ZDk6NjU6ZDA6NmQ6MmY6ZjIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVOakNDQXg2Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJ2TVFzd0NRWURWUVFHRXdKVFJURVUKTUJJR0ExVUVDaE1MUVdSa1ZISjFjM1FnUVVJeEpqQWtCZ05WQkFzVEhVRmtaRlJ5ZFhOMElFVjRkR1Z5Ym1GcwpJRlJVVUNCT1pYUjNiM0pyTVNJd0lBWURWUVFERXhsQlpHUlVjblZ6ZENCRmVIUmxjbTVoYkNCRFFTQlNiMjkwCk1CNFhEVEF3TURVek1ERXdORGd6T0ZvWERUSXdNRFV6TURFd05EZ3pPRm93YnpFTE1Ba0dBMVVFQmhNQ1UwVXgKRkRBU0JnTlZCQW9UQzBGa1pGUnlkWE4wSUVGQ01TWXdKQVlEVlFRTEV4MUJaR1JVY25WemRDQkZlSFJsY201aApiQ0JVVkZBZ1RtVjBkMjl5YXpFaU1DQUdBMVVFQXhNWlFXUmtWSEoxYzNRZ1JYaDBaWEp1WVd3Z1EwRWdVbTl2CmREQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxmM0dqUG04Z0FFTFRuZ1RsdnQKSDd4c0Q4MjEraU8yenQ2YkVUT1hwQ2xNZlpPZnZVcThrKzBER3VPUHorVnRVRnJXbHltVVdvQ3dTWHJiTHBYOQp1TXEvTnpndEhqNlJRYTF3VnNmd1R6L29NcDUweXNpUVZPbkdYdzk0blpwQVBBNnNZYXBlRkkrZWg2RnFVTnpYCm1rNnZCYk9tY1pTY2NiTlFZQXJIRTUwNEI0WUNxT21vYVNZWWtLdE1zRThqcXpwUGhOamZ6cC9oYVcrNzEwTFgKYTBUa3g2M3ViVUZmY2xweENEZXplV1drV2FDVU4vY0FMdzNDa25MYTBEaHkyeFNvUmNSZEtuMjN0TmJFN3F6TgpFMFMzeVN2ZFF3QWwrbUc1YVdwWUl4RzNwek9QVm5WWjljMHAxMGEzQ2l0bHR0TkNieFd5dUh2NzcrbGRVOVUwCldpY0NBd0VBQWFPQjNEQ0IyVEFkQmdOVkhRNEVGZ1FVcmIyWWVqUzBKdmY2eENaVTd3Tzk0Q1RMVkJvd0N3WUQKVlIwUEJBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3Z1prR0ExVWRJd1NCa1RDQmpvQVVyYjJZZWpTMApKdmY2eENaVTd3Tzk0Q1RMVkJxaGM2UnhNRzh4Q3pBSkJnTlZCQVlUQWxORk1SUXdFZ1lEVlFRS0V3dEJaR1JVCmNuVnpkQ0JCUWpFbU1DUUdBMVVFQ3hNZFFXUmtWSEoxYzNRZ1JYaDBaWEp1WVd3Z1ZGUlFJRTVsZEhkdmNtc3gKSWpBZ0JnTlZCQU1UR1VGa1pGUnlkWE4wSUVWNGRHVnlibUZzSUVOQklGSnZiM1NDQVFFd0RRWUpLb1pJaHZjTgpBUUVGQlFBRGdnRUJBTENiNElVbHd0WWo0ZytXQnBLZFFaaWMyWVI1Z2RrZVd4UUhJelpsajdEWWQ3dXNRV3hICllJTlJzUGt5UGVmODlpWVR4NEFXcGI5YS9JZlBlSG1KSVpyaVRBY0toalc4OHQ1UnhOS1d0OXgrVHU1dy9SdzUKNnd3Q1VSUXRqcjBXNE1IZlJuWG5KSzNzOUVLMGhaTndFR2U2blFZMVNoalRLM3JNVVVLaGVtUFI1cnVoeFN2QwpOcjRURGVhOVkzNTVlNmNKRFVDcmF0MlBpc1AyOW93YVFnVlIxRVgxbjZkaUlXZ1ZJRU04bWVkOHZTVFlxWkVYCmM0Zy9WaHN4T0JpMGNRK2F6Y2dPbm80dUcrR01tSVBMSHpIeFJFekdCSE5KZG1BUHgvaTlGNEJyTHVuTVRBNWEKbW5rUElBb3UxWjVqSmg1VmtwVFlnaGRhZTlDOHg0OU9oZ1E9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1FbnRydXN0LCBJbmMuIE9VPXd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZS8oYykgMjAwNiBFbnRydXN0LCBJbmMuCiMgU3ViamVjdDogQ049RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89RW50cnVzdCwgSW5jLiBPVT13d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVuY2UvKGMpIDIwMDYgRW50cnVzdCwgSW5jLgojIExhYmVsOiAiRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMTE2NDY2MDgyMAojIE1ENSBGaW5nZXJwcmludDogZDY6YTU6YzM6ZWQ6NWQ6ZGQ6M2U6MDA6YzE6M2Q6ODc6OTI6MWY6MWQ6M2Y6ZTQKIyBTSEExIEZpbmdlcnByaW50OiBiMzoxZTpiMTpiNzo0MDplMzo2Yzo4NDowMjpkYTpkYzozNzpkNDo0ZDpmNTpkNDo2Nzo0OTo1MjpmOQojIFNIQTI1NiBGaW5nZXJwcmludDogNzM6YzE6NzY6NDM6NGY6MWI6YzY6ZDU6YWQ6ZjQ6NWI6MGU6NzY6ZTc6Mjc6Mjg6N2M6OGQ6ZTU6NzY6MTY6YzE6ZTY6ZTY6MTQ6MWE6MmI6MmM6YmM6N2Q6OGU6NGMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVrVENDQTNtZ0F3SUJBZ0lFUld0UVZEQU5CZ2txaGtpRzl3MEJBUVVGQURDQnNERUxNQWtHQTFVRUJoTUMKVlZNeEZqQVVCZ05WQkFvVERVVnVkSEoxYzNRc0lFbHVZeTR4T1RBM0JnTlZCQXNUTUhkM2R5NWxiblJ5ZFhOMApMbTVsZEM5RFVGTWdhWE1nYVc1amIzSndiM0poZEdWa0lHSjVJSEpsWm1WeVpXNWpaVEVmTUIwR0ExVUVDeE1XCktHTXBJREl3TURZZ1JXNTBjblZ6ZEN3Z1NXNWpMakV0TUNzR0ExVUVBeE1rUlc1MGNuVnpkQ0JTYjI5MElFTmwKY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEEyTVRFeU56SXdNak0wTWxvWERUSTJNVEV5TnpJdwpOVE0wTWxvd2diQXhDekFKQmdOVkJBWVRBbFZUTVJZd0ZBWURWUVFLRXcxRmJuUnlkWE4wTENCSmJtTXVNVGt3Ck53WURWUVFMRXpCM2QzY3VaVzUwY25WemRDNXVaWFF2UTFCVElHbHpJR2x1WTI5eWNHOXlZWFJsWkNCaWVTQnkKWldabGNtVnVZMlV4SHpBZEJnTlZCQXNURmloaktTQXlNREEySUVWdWRISjFjM1FzSUVsdVl5NHhMVEFyQmdOVgpCQU1USkVWdWRISjFjM1FnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQ0FTSXdEUVlKCktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxhVnRrTkMrc1p0S205STM1Uk1PVmNGN3NONUVVRm8KTnUzcy9wb0JqNkU0S1B6M0VFWm1MazBlR3JFYVRzYlJ3SldJc01uL01Zc3pBOXUzZzNzK0lJUmU3YkpXS0tmNAo0TGxBY1RmRnkwY09seXBvd0NLVlloWGJSOW4xMEN2L2drdkpyVDdlVE51UWdGQS9DWXFFQU93d0NqMFl6ZnY5CktsbWFJNVVYTEVXZUgyNURlVzBNWEpqK1NLZkZJMGRjWHYxdTV4NjA5bWhGMFlhRFc2S0tqYkhqS1lEK0pYR0kKcmI2OGo2eFNsa3VxVVkza0V6RVo2RTVObjl1c3MyclZ2RGxVY2NwNmVuK1EzWDBkZ05tQnUxa213aEgrNXBQaQo5NERrWmZzME53NHBnSEJOcnppR0xwNS9WNitlRjY3ckhNc29JVisySE5qbm9nUWkrZFBhMk1zQ0F3RUFBYU9CCnNEQ0JyVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QXJCZ05WSFJBRUpEQWkKZ0E4eU1EQTJNVEV5TnpJd01qTTBNbHFCRHpJd01qWXhNVEkzTWpBMU16UXlXakFmQmdOVkhTTUVHREFXZ0JSbwprT1JucEtaVGdNZUdacVR4OTB0RCs0UzliVEFkQmdOVkhRNEVGZ1FVYUpEa1o2U21VNERIaG1hazhmZExRL3VFCnZXMHdIUVlKS29aSWh2WjlCMEVBQkJBd0Roc0lWamN1TVRvMExqQURBZ1NRTUEwR0NTcUdTSWIzRFFFQkJRVUEKQTRJQkFRQ1QxREN3MXdNZ0t0RDVZK2lSREFVZ3FWOFp5bnR5VHRTeDI5Q1crMVJhR1N3TUNQZXl2SVdvblg5dApPMUt6S3R2bjFJU01ZL1lQeXlZQmtWQnM5RjhVNHBOMHdCT2VNRHBRNDdSZ3hSendJa1NOY1Vlc3lCcko2WnVhCkFHQVQvM0IrWHhGTlNSdXpGVko3eVZUYXY1MlZyMnVhMko3cDhlUkRqZUlSUkRxL3I3MkRRbk5TaTZxN3B5blAKOVdRY0NrM1J2S3FzbnlyUS8zOS8ybjNxc2Uwd0pjR0UyalRTVzNpRFZ1eWNOc01tNGhIMlowa2RrcXVNKyt2LwpldTZGU3FkUWdQQ25YRXFVTGw4Rm1UeFNRZUROdEdQUEFVTzZuSVBjajJBNzgxcTB0SHV1Mmd1UU9IWHZnUjFtCjB2ZFhjRGF6di93b3IzRWxoVnNUL2g1L1dyUTgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdlb1RydXN0IEdsb2JhbCBDQSBPPUdlb1RydXN0IEluYy4KIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBHbG9iYWwgQ0EgTz1HZW9UcnVzdCBJbmMuCiMgTGFiZWw6ICJHZW9UcnVzdCBHbG9iYWwgQ0EiCiMgU2VyaWFsOiAxNDQ0NzAKIyBNRDUgRmluZ2VycHJpbnQ6IGY3Ojc1OmFiOjI5OmZiOjUxOjRlOmI3Ojc3OjVlOmZmOjA1OjNjOjk5OjhlOmY1CiMgU0hBMSBGaW5nZXJwcmludDogZGU6Mjg6ZjQ6YTQ6ZmY6ZTU6Yjk6MmY6YTM6YzU6MDM6ZDE6YTM6NDk6YTc6Zjk6OTY6MmE6ODI6MTIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGZmOjg1OjZhOjJkOjI1OjFkOmNkOjg4OmQzOjY2OjU2OmY0OjUwOjEyOjY3Ojk4OmNmOmFiOmFhOmRlOjQwOjc5OjljOjcyOjJkOmU0OmQyOmI1OmRiOjM2OmE3OjNhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEVkRDQ0FqeWdBd0lCQWdJREFqUldNQTBHQ1NxR1NJYjNEUUVCQlFVQU1FSXhDekFKQmdOVkJBWVRBbFZUCk1SWXdGQVlEVlFRS0V3MUhaVzlVY25WemRDQkpibU11TVJzd0dRWURWUVFERXhKSFpXOVVjblZ6ZENCSGJHOWkKWVd3Z1EwRXdIaGNOTURJd05USXhNRFF3TURBd1doY05Nakl3TlRJeE1EUXdNREF3V2pCQ01Rc3dDUVlEVlFRRwpFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakViTUJrR0ExVUVBeE1TUjJWdlZISjFjM1FnClIyeHZZbUZzSUVOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMnN3WVl6RDkKOUJjakdsWitXOTg4YkRqa2NiZDRrZFM4b2RoTStLaER0Z1BwVFNFSENJamFXQzltT1NtOUJYaUxuVGpvQmJkcQpmbkdrNXNSZ3ByRHZnT1NKS0ErZUpkYnRnL090cHBISG1NbENHRFVVbmEyWVJwSXVUOHJ4aDBQQkZwVlhMVkR2CmlTMkFlbGV0OHU1ZmE5SUFqYmtVK0JRVk5kbkFScU43Y3NpUnY4bFZLODNRbHo2Y0ptVE0zODZER1hIS1R1YlUKMVh1cEdjMVYzc2pzMGw0NFUrVmNUNHd0L2xBak52eG01c3VPcERrWkFMZVZBam1SQ3c3K09DN1JIUVdhOWswKwpidzhISGE4c0hvOWdPZUw2TmxNVE9kUmVKaXZiUGFnVXZUTHJHQU1vVWdSeDVhc3pQZUU0dXdjMmhHS2NlZW9XCk1QUmZ3Q3ZvY1d2aytRSURBUUFCbzFNd1VUQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCVEEKZXBob2pZbjdxd1ZrREJGOXFuMWx1TXJNVGpBZkJnTlZIU01FR0RBV2dCVEFlcGhvalluN3F3VmtEQkY5cW4xbAp1TXJNVGpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQU5lTXBhdVV2WFZTT0tWQ1VuNWthRk9TUGVDcGlsS0luClo1N1F6eHBlUituQnNxVFAzVUVhQlU2YlMrNUtiMVZTc3lTaE53cnJaSFlxTGl6ei9UdDFrTC82Y2RqSFBUZlMKdFFXVllybW0zb2s5Tm5zNGQwaVhyS1lnank2bXlRekNzcGxGQU1mT0VWRWlJdUNsNnJZVlNBbGs2bDVQZFBjRgpQc2VLVWd6YkZiUzliWnZseHJGVWFLbmphWkMybXFVUHVMay9JSDJ1U3JXNG5PUWR0cXZtbEtYQng0T3QyL1VuCmh3NEViTlgvM2FCZDdZZFN0eXNWQXE0NXBtcDA2ZHJFNTd4Tk5CNnBYRTB6WDVJSkw0aG1YWGVYeHgxMkU2blYKNWZFV0NSRTExYXpiSkhGd0xKaFdDOWtYdE5IalVTdGVkZWpWME54UE5PM0NCV2FBb2N2bU13PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdlb1RydXN0IFVuaXZlcnNhbCBDQSBPPUdlb1RydXN0IEluYy4KIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBVbml2ZXJzYWwgQ0EgTz1HZW9UcnVzdCBJbmMuCiMgTGFiZWw6ICJHZW9UcnVzdCBVbml2ZXJzYWwgQ0EiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiA5Mjo2NTo1ODo4YjphMjoxYTozMTo3Mjo3Mzo2ODo1YzpiNDphNTo3YTowNzo0OAojIFNIQTEgRmluZ2VycHJpbnQ6IGU2OjIxOmYzOjM1OjQzOjc5OjA1OjlhOjRiOjY4OjMwOjlkOjhhOjJmOjc0OjIyOjE1Ojg3OmVjOjc5CiMgU0hBMjU2IEZpbmdlcnByaW50OiBhMDo0NTo5Yjo5Zjo2MzpiMjoyNTo1OTpmNTpmYTo1ZDo0Yzo2ZDpiMzpmOTpmNzoyZjpmMTo5Mzo0MjowMzozNTo3ODpmMDo3MzpiZjoxZDoxYjo0NjpjYjpiOToxMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmFEQ0NBMUNnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQkZNUXN3Q1FZRFZRUUdFd0pWVXpFVwpNQlFHQTFVRUNoTU5SMlZ2VkhKMWMzUWdTVzVqTGpFZU1Cd0dBMVVFQXhNVlIyVnZWSEoxYzNRZ1ZXNXBkbVZ5CmMyRnNJRU5CTUI0WERUQTBNRE13TkRBMU1EQXdNRm9YRFRJNU1ETXdOREExTURBd01Gb3dSVEVMTUFrR0ExVUUKQmhNQ1ZWTXhGakFVQmdOVkJBb1REVWRsYjFSeWRYTjBJRWx1WXk0eEhqQWNCZ05WQkFNVEZVZGxiMVJ5ZFhOMApJRlZ1YVhabGNuTmhiQ0JEUVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBS1lWClZhQ2p4dUFmakowaFVOZkJ2aXRidGFTZW9kbHlXTDBBRzB5L1lja1VIVVdDcThZZGdOWTk2eENjT3E5dEpQaTgKY1FHZUJ2VjhYeDdCRGxYS2c1cFpNSzRaeXpCSWxlMGlONDMwU3BweVpqNnRsY0RnRmdEZ0VCOHJNUTdYbEZUVApRak9nTkIwZVJYYmRUOG9ZTit5RkZYb1pDUHpWeDV6dzhxa3VFS21TNWoxWVBha1dhRHd2ZFNFWWZ5aDNwZUZoCkY3ZW02ZmdlbWR0emJ2UUtvaUZzN3RxcWhaSm1yL1o2YTRMYXVpSUlOUS9QUXZFMSttcnVmaXNsekRvUjVHMnYKYzdKMkhhM1FzbmhuR3FRNUhGRUxaMWFEL1RoZERjN2Q4THNybGgvZWV6SlMvUjI3dFFhaHNpRmVwZGFWYUgvdwptWjdjUlFnKzU5SUpEVFdVM1lCT1U1Zlh0UWxFSUdRV0Z3TUNURk1OYU43VnFuSk5rMjJDRHR1Y3ZjKzA4MXhkClZIcHBDWmJXMnhIQmpYV290TTg1eU00OHZDUjg1bUxLNGIxOXA3MVhaUXZrL2lYdHRta1EzQ2dhUnIwQkhkQ1gKdGVHWU84QTNaTlk5bE80TDRmVW9yZ3RXdjNHTEl5bEJqb2JGUzFKNzJIR3JING9WcGp1RFd0ZFlBVkhHVEVIWgpmOWhCWjNLaUtOOWdnNm1leUh2OFUzTnlXZldUZWhkMkRzNzM1VnpaQzFVMG9xcGJ0V3BVNXhQS1YreVhiZlJlCkJpOUZpMWpVSXhhUzVCWnVLR05aTU45UUFaeGppUnFmMnhlVWduQTN3eVNlbWtmV1dzcE9xR21KY2grUmJOdCsKbmh1dHh4OXozU3hQR1dYOWY1TkFFQzdTOE8wOG5pNG9QbWttTThWN0FnTUJBQUdqWXpCaE1BOEdBMVVkRXdFQgovd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTnE3THFxd0RMaUlKbEYwWEcwRDA4RFlqM3JXTUI4R0ExVWRJd1FZCk1CYUFGTnE3THFxd0RMaUlKbEYwWEcwRDA4RFlqM3JXTUE0R0ExVWREd0VCL3dRRUF3SUJoakFOQmdrcWhraUcKOXcwQkFRVUZBQU9DQWdFQU1Yam14N1hmdUpSQXlYSEVxRFhzUmgzQ2hmTW9XSWF3Qy95T3NqbVBSRldyWklSYwphYW5RbWpnOCt1VWZOZVZFNDRCNWxHaWt1OFNmUGVFMHpUQkdpMVFybGFYdjl6K1poUDAxNXM4eHh0eHF2NmZYCkl3amhtRjdEV2doMnFhYXZkeSszWUwxRVJtcnZsLzl6bGNHTzZKUDcvVEczN0ZjUkVVV2JNUEVhaURuQlR6eW4KQU5YSC9LdHRnQ0p3cFF6Z1hRUXBBdnZMb0pIUmZOYkRmbERWblZpK1FUanJ1WFU4RmRtYnlVcURXY0RhVS8wegp1ellZbTRVUEZkM3VMYXgyazduWkFZMUlFS2o3OVRpRzhkc0t4cjJFb3lOQjN0WjNiNFhVaFJ4UTRLNVJpcnFOClBuYml1Y29uOGwrZjcyNVpEUWJZS3hlazBueHJ1MThVR2tpUEdrem5zMGNjamt4Rkt5RHVTTi9uM1FtT0dLamEKUUkyU0poRlRZWE5kNjczbnhFMHBOMkhyckRrdFp5NFcxdlVBZzRXaHpIOTJ4SDNrdDB0bTd3TkZZR20yREZLVwprb1JlcHFPMXBENHIyY3pZRzBlcThrVGFUL2tENlBBVXl6L3pnOTdRd1ZUanQrZ0tOMDJMSUZrRE1CbWhMTWk5CkVSL2Zyc2xLeGZNblptYUdyR2lSLzlubVV4d1BpMXhwWlFvbXlCNDB3MTFSZTllcG5BYWhOdDNWaVpTODJlUXQKREY0SmJBaVhmS005ZkpQL1A2RVVwOCsxWGV2YjJ4ekVkdCtJdWIxRkJaVWJydnhHYWt5dlNPUE9yZy9TZnV2bQpiSnhQZ1dwNlpLeTdQdFhueTNZdXhhZEl3VnlRRDh2SVAvcm1NdUdORzIrazVvN1krU2xJaXM1ei9pdz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdlb1RydXN0IFVuaXZlcnNhbCBDQSAyIE89R2VvVHJ1c3QgSW5jLgojIFN1YmplY3Q6IENOPUdlb1RydXN0IFVuaXZlcnNhbCBDQSAyIE89R2VvVHJ1c3QgSW5jLgojIExhYmVsOiAiR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiAzNDpmYzpiODpkMDozNjpkYjo5ZToxNDpiMzpjMjpmMjpkYjo4ZjplNDo5NDpjNwojIFNIQTEgRmluZ2VycHJpbnQ6IDM3OjlhOjE5OjdiOjQxOjg1OjQ1OjM1OjBjOmE2OjAzOjY5OmYzOjNjOjJlOmFmOjQ3OjRmOjIwOjc5CiMgU0hBMjU2IEZpbmdlcnByaW50OiBhMDoyMzo0ZjozYjpjODo1Mjo3YzphNTo2Mjo4ZTplYzo4MTphZDo1ZDo2OTo4OTo1ZDphNTo2ODowZDpjOToxZDoxYzpiODo0Nzo3ZjozMzpmODo3ODpiOTo1YjowYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmJEQ0NBMVNnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQkhNUXN3Q1FZRFZRUUdFd0pWVXpFVwpNQlFHQTFVRUNoTU5SMlZ2VkhKMWMzUWdTVzVqTGpFZ01CNEdBMVVFQXhNWFIyVnZWSEoxYzNRZ1ZXNXBkbVZ5CmMyRnNJRU5CSURJd0hoY05NRFF3TXpBME1EVXdNREF3V2hjTk1qa3dNekEwTURVd01EQXdXakJITVFzd0NRWUQKVlFRR0V3SlZVekVXTUJRR0ExVUVDaE1OUjJWdlZISjFjM1FnU1c1akxqRWdNQjRHQTFVRUF4TVhSMlZ2VkhKMQpjM1FnVlc1cGRtVnljMkZzSUVOQklESXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRQ3pWRkxCeVQ3eTJkeXhVeHBaS2VleHcwVW81ZGZSN2NYRlM2R3FkSHRYcjBvbS9OajFYcWR1R2R0MERFODEKV3pJTEFlUGI2M3AzTmVxcVd1RFc2S0ZYbFBDUW8zUldsRVF3QXg1Y1RpdUZKblNDZWd4Mm9HOU56a0V0b0JVRwpGRiszUXMxN2oxaGhOTndxQ1BrdXd3R21Ja1FjVEFlQzVsdk8wRXA4Qk5NWmN5ZndxcGgvTHE5TzY0Y2VKSGRxClhiYm9XMFc2M01PaEJXOVdqbzhRSnFWSnd5N1hRWWNpNEUrR3ltQzE2cUZqd0FHWEVIbTlBRHdTYlNzVnNheEwKc2U0WXVVNlczTngyL3p1K3oxOER3UHc3Nkw1R0cvL2FRTUpTOS83ak92ZHFkelhRMm8zclhoaHFNY2NldWp3YgpLTlpyVk1hcVc5ZWlMQnNaektJQzlwdFp2VGRyaHJWdGdyclk2c2xXdktrMldQMCtHZlB0RENhcGt6ajRUOEZkCklnYlFsK3JocmNaVjRJRXJLSU02K3ZSN0lWRUF2bEk0enMxbWVhajBnVmJpMElNSlIxRmJVR3JQMjBnYVhUNzMKeS9abDkyenhsZmdDT3pKV2dqbDZXNzB2aVJ1L29iVG8vMytOak44RDhXQk9XQkZNNjZNL0VDdURtZ0Z6MlpSdApoQUFuWnF6d2NFQUpRcEt0VDVNTllRbFJKTmlTMVF1VVliS0hzdTMvbWpYL2hWVEs3VVJEckJzOEZtdElTZ29jClFJZ2Zrc0lMQUFYLzhzZ0NTcVNxcWN5Wmxwd3ZXT0I5NGI2N0I5eGZCSEpjTVRURDdGOHQ0RDFra0NMbTBleTQKTHQxWnJ0bWhONzlVTmR4ek1rK01CQjR6c3NsRzhkaGN5RlZReVdpOXFMbzJDUUlEQVFBQm8yTXdZVEFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSMjgxWGgrcVEyKy9DZlhHSng3VHowUnpnUUt6QWZCZ05WCkhTTUVHREFXZ0JSMjgxWGgrcVEyKy9DZlhHSng3VHowUnpnUUt6QU9CZ05WSFE4QkFmOEVCQU1DQVlZd0RRWUoKS29aSWh2Y05BUUVGQlFBRGdnSUJBR2JCeGlQejJlQXVibC9vejY2d3NDVk5LL2c3V0p0QUpEZGF5NnNXU2YregpkWGt6b1M5dGNCYzBrZjVuZm8vc20rVmVncWxWSHkvYzFGRUhFdjZzRmo0c05jWmovTndRNncyanF0Qjh6TkhRCkwxRXV4QlJhM3VnWjRUN0d6S1FwNXk2RXFnWXdlSFpVY3lpWVdUamdBQTFpMDBKOUlaK3VQVHFNMWZwM0RSZ3IKRmc1Zk51SDhLclV3Sk0vZ1l3eDdXQnIrbWJwQ0VyR1I5SHhvNHNqb3J5enF5WDZ1dXlvOURSWGNOSlcyR0hTbwphZy9IdFBRVHhPUmI3UXJTcEpkTUt1MHZiQktKUGZFbmNLcHFBMUlobjBDb1oxRHk4MW9mMzk4ajl0eDRUdWFZClQxVTZVK1B2OHZTZngzellXSzhwSXBlNDRMMlJMckIyN0ZjUnorOHBSUFBwaFhwZ1krUmRNNGtYMlRHcTJ0YnoKR0RWeXo0Y3JMMk1qaEYyRWpEOVhvSWo4bVpFb0ptbVoxSStYUkw2TzFVaXhwQ2dwOFJXMDRlV2UzZmlQcG04bQoxd2s4T2h3UkRxWnNOL2V0Ukljc0tNZllkSUt6MEc5S1Y3czFLU2VnaStnaHA0ZGtObDNNMkJhc3g3SW5RSkpWCk9DaU5VVzdkRkdkVGJIRmNKb1JOZFZxMmZtQldxVTJ0KzVzZWwvTU4yZEtYVkhmYVBSSzM0Qjd2Q0FhcytZV0gKNmFMY3IzNFlFb1A5VmhkQkx0VXBnbjJaOURIMmNhblBMQUVucFFXNXFySklUaXJ2bjVOU1VaVThVbk9PVmt3WApRTUFKS09TTGFraFQyK3pOVlZYeHh2anBvaXhNcHRFbVgzNnZXa3phSDZieUhDeCtyZ0lXMGxiUUwxZFRSK2lTCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1WaXNhIGVDb21tZXJjZSBSb290IE89VklTQSBPVT1WaXNhIEludGVybmF0aW9uYWwgU2VydmljZSBBc3NvY2lhdGlvbgojIFN1YmplY3Q6IENOPVZpc2EgZUNvbW1lcmNlIFJvb3QgTz1WSVNBIE9VPVZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2aWNlIEFzc29jaWF0aW9uCiMgTGFiZWw6ICJWaXNhIGVDb21tZXJjZSBSb290IgojIFNlcmlhbDogMjU5NTIxODA3NzYyODU4MzYwNDgwMjQ4OTAyNDE1MDU1NjU3OTQKIyBNRDUgRmluZ2VycHJpbnQ6IGZjOjExOmI4OmQ4OjA4OjkzOjMwOjAwOjZkOjIzOmY5OjdlOmViOjUyOjFlOjAyCiMgU0hBMSBGaW5nZXJwcmludDogNzA6MTc6OWI6ODY6OGM6MDA6YTQ6ZmE6NjA6OTE6NTI6MjI6M2Y6OWY6M2U6MzI6YmQ6ZTA6MDU6NjIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDY5OmZhOmM5OmJkOjU1OmZiOjBhOmM3OjhkOjUzOmJiOmVlOjVjOmYxOmQ1Ojk3Ojk4OjlmOmQwOmFhOmFiOjIwOmEyOjUxOjUxOmJkOmYxOjczOjNlOmU3OmQxOjIyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEb2pDQ0FvcWdBd0lCQWdJUUU0WTFUUjAvQnZMQitXVUYxWkFjWWpBTkJna3Foa2lHOXcwQkFRVUZBREJyCk1Rc3dDUVlEVlFRR0V3SlZVekVOTUFzR0ExVUVDaE1FVmtsVFFURXZNQzBHQTFVRUN4TW1WbWx6WVNCSmJuUmwKY201aGRHbHZibUZzSUZObGNuWnBZMlVnUVhOemIyTnBZWFJwYjI0eEhEQWFCZ05WQkFNVEUxWnBjMkVnWlVOdgpiVzFsY21ObElGSnZiM1F3SGhjTk1ESXdOakkyTURJeE9ETTJXaGNOTWpJd05qSTBNREF4TmpFeVdqQnJNUXN3CkNRWURWUVFHRXdKVlV6RU5NQXNHQTFVRUNoTUVWa2xUUVRFdk1DMEdBMVVFQ3hNbVZtbHpZU0JKYm5SbGNtNWgKZEdsdmJtRnNJRk5sY25acFkyVWdRWE56YjJOcFlYUnBiMjR4SERBYUJnTlZCQU1URTFacGMyRWdaVU52YlcxbApjbU5sSUZKdmIzUXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdlY5NVdIbTZoCjJtQ3hsQ2ZMRjlzSFA0Q0ZUOGljdHREMGIwL1BtZGpoMjhKSVhEcXNPVFBISDJxTEpqMHJOZlZJc1pIQkFrNEUKbHBGN3NEUHdzUlJPRVcrMVFLOGJSYVZLNzM2MnJQS2dIMWcvRWtaZ1BJMmg0SDNQVno0ekh2dEg4YW9WbHdkVgpacVcxTFM3WWdGbXlwdzIzUnV3aFkvODFxNlVDenlyMFRQNTc5WlJkaEUybzhtQ1AydzRsUEo5emNjK1UzMHJxCjI5OXlPSXp6bHIzeEY3elN1anRGV3NhbjlzWVhpd0dkL0Jtb0tvTVd1RHBJL2s0K29Lc0dHZWxUODRBVEIrMHQKdno4S1BGVWdPU3dzQUdsMGxVcThJTEtwZWVVWWlaR28zQnhONzd0K053dGQvam1saUZLTUFHenNHSHhCdmZhTApkWGU2WUoyRTUvNHRBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFECkFnRUdNQjBHQTFVZERnUVdCQlFWT0lNUFB5dy9jRE1lelViK0I0d2c0TmZEdHpBTkJna3Foa2lHOXcwQkFRVUYKQUFPQ0FRRUFYL0ZCZlh4Y0NMa3I0TldTUi9wblhLVVR3d01obXl0TWlVYlBXVTNKL3FWQXRtUE4zWEVvbFdjUgp6Q1NzMDBSc2NhNEJJR3NEb284WXR5azZmZVVXWUZONFBNQ3ZGWVAzajFJekpMMWtrNWZ1aS9mYkdLaHRjYlAzCkxCZlFkQ1ZwOS81clBKUytUVXRCakU3aWM5RGprQ0p6UTgzejcrcHp6a1dLc0taSi8weDluWEdJeEhZZGtGc2QKN3YzTTkrNzlZS1d4ZWhaeDBSYlFmQkk4YkdtWDI2NWZPWnB3THdVOEdVWUVtU0EyMEdCdVlRYTdGa0tNY1BjdworK0RiWnFNQUFiM21MTnFSWDZCR2kwMXFuRDA5M1FWRy9uYS9vQW84NUFEbUo3Zi9oQzNldWlJbmxoQng2eUx0CjM5OHpuTS9qcmE2TzFJN21UMUd2RnBMZ1hQWUhEdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BQUEgQ2VydGlmaWNhdGUgU2VydmljZXMgTz1Db21vZG8gQ0EgTGltaXRlZAojIFN1YmplY3Q6IENOPUFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlcyBPPUNvbW9kbyBDQSBMaW1pdGVkCiMgTGFiZWw6ICJDb21vZG8gQUFBIFNlcnZpY2VzIHJvb3QiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiA0OTo3OTowNDpiMDplYjo4NzoxOTphYzo0NzpiMDpiYzoxMTo1MTo5Yjo3NDpkMAojIFNIQTEgRmluZ2VycHJpbnQ6IGQxOmViOjIzOmE0OjZkOjE3OmQ2OjhmOmQ5OjI1OjY0OmMyOmYxOmYxOjYwOjE3OjY0OmQ4OmUzOjQ5CiMgU0hBMjU2IEZpbmdlcnByaW50OiBkNzphNzphMDpmYjo1ZDo3ZToyNzozMTpkNzo3MTplOTo0ODo0ZTpiYzpkZTpmNzoxZDo1ZjowYzozZTowYToyOTo0ODo3ODoyYjpjODozZTplMDplYTo2OTo5ZTpmNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU1qQ0NBeHFnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQjdNUXN3Q1FZRFZRUUdFd0pIUWpFYgpNQmtHQTFVRUNBd1NSM0psWVhSbGNpQk5ZVzVqYUdWemRHVnlNUkF3RGdZRFZRUUhEQWRUWVd4bWIzSmtNUm93CkdBWURWUVFLREJGRGIyMXZaRzhnUTBFZ1RHbHRhWFJsWkRFaE1COEdBMVVFQXd3WVFVRkJJRU5sY25ScFptbGoKWVhSbElGTmxjblpwWTJWek1CNFhEVEEwTURFd01UQXdNREF3TUZvWERUSTRNVEl6TVRJek5UazFPVm93ZXpFTApNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdNRWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFCkJ3d0hVMkZzWm05eVpERWFNQmdHQTFVRUNnd1JRMjl0YjJSdklFTkJJRXhwYldsMFpXUXhJVEFmQmdOVkJBTU0KR0VGQlFTQkRaWEowYVdacFkyRjBaU0JUWlhKMmFXTmxjekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUApBRENDQVFvQ2dnRUJBTDVBbmZSdTRlcDJoeHhOUlVTT3ZrYklnd2Fkd1NyK0dCK081QUw2ODZ0ZFVJb1dNUXVhCkJ0REZjQ0xOU1MxVVk4eTJibWhHQzFQcXkwd2t3THh5VHVyeEZhNzBWSm9TQ3NONnNqTmc0dHFKVmZNaVdQUGUKM00vdmc0YWlqSlJQbjJqeW1KQkdoQ2ZIZHIvanpEVXNpMTRIWkdXQ3dFaXdxSkg1WVo5MklGQ29rY2RtdGV0NApZZ05XOElvYUUrb3hveDZnbWYwNDl2WW5NbGh2Qi9WcnVQc1VLNiszcXN6V1kxOXpqTm9GbWFnNHFNc1hlRFpSCnJPbWU5SGc2amM4UDJVTGltQXlyTDU4T0FkN3ZuNWxKOFMzZnJIUk5HNWkxUjhYbEtkSDVrQmpIWXB5K2c4Y20KZXo2S0pjZkEzWjNtTldnUUlKMlAyTjdTdzRTY0RWN29MOGtDQXdFQUFhT0J3RENCdlRBZEJnTlZIUTRFRmdRVQpvQkVLSXo2VzhRZnM0cThwNzRLbGY5QXdwTFF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3ZXdZRFZSMGZCSFF3Y2pBNG9EYWdOSVl5YUhSMGNEb3ZMMk55YkM1amIyMXZaRzlqWVM1amIyMHYKUVVGQlEyVnlkR2xtYVdOaGRHVlRaWEoyYVdObGN5NWpjbXd3TnFBMG9ES0dNR2gwZEhBNkx5OWpjbXd1WTI5dApiMlJ2TG01bGRDOUJRVUZEWlhKMGFXWnBZMkYwWlZObGNuWnBZMlZ6TG1OeWJEQU5CZ2txaGtpRzl3MEJBUVVGCkFBT0NBUUVBQ0ZiOEF2Q2I2UCtrK3RaN3hrU0F6ay9FeGZZQVdNeW10cndVU1dnRWR1am03bDNzQWc5ZzFvMVEKR0U4bVRnSGo1ckNsN3IrOGRGUkJ2LzM4RXJqSFQxcjBpV0FGZjJDM0JVcno5dkhDdjhTNWRJYTJMWDFyek5MegpSdDB2eHVCcXc4TTBBeXg5bHQxYXdnNm5DcG5CQll1ckRDL3pYRHJQYkRkVkNZZmVVMEJzV08vOHRxdGxiZ1QyCkc5dzg0Rm9WeHA3WjhWbElNQ0ZsQTJ6czZTRno3SnNEb2VBM3JhQVZHSS82dWdMT3B5eXBFQk1zMU9VSUpxc2kKbDJENGtGNTAxS0thVTczeXFXamdvbTdDMTJ5eG93K2V2K3RvNTFieXJ2TGpLemc2Q1lHMWE0WFh2aTN0UHhxMwpzbVBpOVdJc2d0UnFBRUZROFRtRG41WHBOcGFZYmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049UXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVF1b1ZhZGlzIExpbWl0ZWQgT1U9Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPVF1b1ZhZGlzIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1RdW9WYWRpcyBMaW1pdGVkIE9VPVJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIlF1b1ZhZGlzIFJvb3QgQ0EiCiMgU2VyaWFsOiA5ODUwMjY2OTkKIyBNRDUgRmluZ2VycHJpbnQ6IDI3OmRlOjM2OmZlOjcyOmI3OjAwOjAzOjAwOjlkOmY0OmYwOjFlOjZjOjA0OjI0CiMgU0hBMSBGaW5nZXJwcmludDogZGU6M2Y6NDA6YmQ6NTA6OTM6ZDM6OWI6NmM6NjA6ZjY6ZGE6YmM6MDc6NjI6MDE6MDA6ODk6NzY6YzkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGE0OjVlOmRlOjNiOmJiOmYwOjljOjhhOmUxOjVjOjcyOmVmOmMwOjcyOjY4OmQ2OjkzOmEyOjFjOjk5OjZmOmQ1OjFlOjY3OmNhOjA3Ojk0OjYwOmZkOjZkOjg4OjczCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGMERDQ0JMaWdBd0lCQWdJRU9yWlFpekFOQmdrcWhraUc5dzBCQVFVRkFEQi9NUXN3Q1FZRFZRUUdFd0pDClRURVpNQmNHQTFVRUNoTVFVWFZ2Vm1Ga2FYTWdUR2x0YVhSbFpERWxNQ01HQTFVRUN4TWNVbTl2ZENCRFpYSjAKYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRFdU1Dd0dBMVVFQXhNbFVYVnZWbUZrYVhNZ1VtOXZkQ0JEWlhKMAphV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwd01UQXpNVGt4T0RNek16TmFGdzB5TVRBek1UY3hPRE16Ck16TmFNSDh4Q3pBSkJnTlZCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk1hVzFwZEdWa01TVXcKSXdZRFZRUUxFeHhTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVM0d0xBWURWUVFERXlWUgpkVzlXWVdScGN5QlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUlCSWpBTkJna3Foa2lHCjl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF2MkcxbFZPNlYvejY4bWNMT2hyZkVZQmtsYlRSdk0xNnovWXAKbGk0a1ZFQWtPUGNhaGR4WVRNdWtKMEtYMEorRGlzUGtCZ05iQUtWUkhuQUVkT0xCMURxcjE2MDdCeGdGanYyRApyT3BtMlJnYmFJcjFWeHFZdXZYdGRqMTgyZDZVYWp0TEY4SFZqNzFsT0RxVjBEMVZOazdmZVZjeEtoN1lXV1ZKCldDQ1lmcXRmZnAvcDFrM3NnM1NweDJ6WTdpbEtoU29HRlBsVTV0UGFaUWVMWXpjUzE5RHN3M3NnUVVTajdjdWcKRitGeFpjNGRaakgzZGdFWnlIMERXTGFWU1IybUVpYm94Z3gyNE9ObXkrcGRwaWJ1NWN4ZnZXZW5BU2NPb3NwVQp4YkY2bFIxeEhrb3BpZ1BjYWtYQnBCbGViemJOdzZLd3QvNWNPT0pTdlBoRVErYVF1d0lEQVFBQm80SUNVakNDCkFrNHdQUVlJS3dZQkJRVUhBUUVFTVRBdk1DMEdDQ3NHQVFVRkJ6QUJoaUZvZEhSd2N6b3ZMMjlqYzNBdWNYVnYKZG1Ga2FYTnZabVp6YUc5eVpTNWpiMjB3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekNDQVJvR0ExVWRJQVNDQVJFdwpnZ0VOTUlJQkNRWUpLd1lCQkFHK1dBQUJNSUg3TUlIVUJnZ3JCZ0VGQlFjQ0FqQ0J4eHFCeEZKbGJHbGhibU5sCklHOXVJSFJvWlNCUmRXOVdZV1JwY3lCU2IyOTBJRU5sY25ScFptbGpZWFJsSUdKNUlHRnVlU0J3WVhKMGVTQmgKYzNOMWJXVnpJR0ZqWTJWd2RHRnVZMlVnYjJZZ2RHaGxJSFJvWlc0Z1lYQndiR2xqWVdKc1pTQnpkR0Z1WkdGeQpaQ0IwWlhKdGN5QmhibVFnWTI5dVpHbDBhVzl1Y3lCdlppQjFjMlVzSUdObGNuUnBabWxqWVhScGIyNGdjSEpoClkzUnBZMlZ6TENCaGJtUWdkR2hsSUZGMWIxWmhaR2x6SUVObGNuUnBabWxqWVhSbElGQnZiR2xqZVM0d0lnWUkKS3dZQkJRVUhBZ0VXRm1oMGRIQTZMeTkzZDNjdWNYVnZkbUZrYVhNdVltMHdIUVlEVlIwT0JCWUVGSXRMYmUzVApLYmtHR2V3NU9hbndsNFJxeSsvZk1JR3VCZ05WSFNNRWdhWXdnYU9BRkl0TGJlM1RLYmtHR2V3NU9hbndsNFJxCnkrL2ZvWUdFcElHQk1IOHhDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXAKZEdWa01TVXdJd1lEVlFRTEV4eFNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUzR3TEFZRApWUVFERXlWUmRXOVdZV1JwY3lCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNWdnUTZ0bENMCk1BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQWl0UVV0ZjcwbXBLbkdkU2sKZm5JWWo5bG9mRklrM1dkdk9YckVxbDQ5NGxpd1RYQ1loR0hvRytOcEdBN08rMGRRb0U3LzhDUWZ2YkxPOVNmOAo3QzlUcW5ON0F6MTBidVlXbnV1bExzUy9WaWRRSzJLNnZrc2NQRlZjUVIwa3ZvSWdSMTNWUkg1NkZtamZmVTFSCmNIaFhIVE1lL1FLWm5Bek5DZ1ZQeDd1T3BIWDZTbTJ4Z0k0SlZybWNHbUQrWGNIWGV0d1JlTkRXWGNHMzFhMHkKbVFNNmlzeFVKVGt4Z1hzVElsRzZSbXlodTU3NkJHeEpKblNQMG5QcnpEQ2k1dXBaSW9mNGwvVU8vZXJNa3FRVwp4RklZNmlIT3NmSG1oSUhsdXFtR0tQSkRXbDBTbmF3ZTJhamxDbXFuZjZDSEtjL3lpVTNVN01YaTVuclFOaU9LClNuUTIrUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENBIDIgTz1RdW9WYWRpcyBMaW1pdGVkCiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDQSAyIE89UXVvVmFkaXMgTGltaXRlZAojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSAyIgojIFNlcmlhbDogMTI4OQojIE1ENSBGaW5nZXJwcmludDogNWU6Mzk6N2I6ZGQ6Zjg6YmE6ZWM6ODI6ZTk6YWM6NjI6YmE6MGM6NTQ6MDA6MmIKIyBTSEExIEZpbmdlcnByaW50OiBjYTozYTpmYjpjZjoxMjo0MDozNjo0Yjo0NDpiMjoxNjoyMDo4ODo4MDo0ODozOToxOTo5Mzo3YzpmNwojIFNIQTI1NiBGaW5nZXJwcmludDogODU6YTA6ZGQ6N2Q6ZDc6MjA6YWQ6Yjc6ZmY6MDU6Zjg6M2Q6NTQ6MmI6MjA6OWQ6Yzc6ZmY6NDU6Mjg6Zjc6ZDY6Nzc6YjE6ODM6ODk6ZmU6YTU6ZTU6YzQ6OWU6ODYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ0ekNDQTUrZ0F3SUJBZ0lDQlFrd0RRWUpLb1pJaHZjTkFRRUZCUUF3UlRFTE1Ba0dBMVVFQmhNQ1FrMHgKR1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1URWxGMWIxWmhaR2x6SUZKdgpiM1FnUTBFZ01qQWVGdzB3TmpFeE1qUXhPREkzTURCYUZ3MHpNVEV4TWpReE9ESXpNek5hTUVVeEN6QUpCZ05WCkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXBkR1ZrTVJzd0dRWURWUVFERXhKUmRXOVcKWVdScGN5QlNiMjkwSUVOQklESXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDYQpHTXBMbEEwQUxhOERLWXJ3RDRISXJrd1poUjBJbjZzcFJJWHpMNEd0TWg2UVJyK2poaVlhSHY1K0hCZzZYSnhnCkZ5bzZkSU16TUgxaFZCSEw3YXZnNXRLaWZ2VnJieGkzQ2dzdC9lays3d3JHc3hEcDNNSkdGL2hkL2FUYS81NUoKV3B6bU0rWWtsdmMvdWxzckhIbzF3dFpuL3F0bVVJdHRLR0FyNzlkZ3c4ZVR2STAya2ZOLytOc1JFOFNjZDNiQgpycmNDYW9GNnFVV0Q0Z1htdVZiQmxEZVBTSEZqSXV3WFpRZVZpa3ZmajhaYUN1V3c0MTllYXhHckRQbUY2MFRwCitBUno4dW4rWEppTTlYT3ZhN1IremRSY0FpdE1PZUd5bFpVdFFvZlgxYk9RUTdkc0UvSGUzZmJFK0lrLzBYWDEKa3NPUjFZcUkwSkRzM0czZWljSmxjWmFMRFFQOW5MOWJGcXlTMityK2VYeXQ2Ni8zRnN2YnpTVXI1Ui83bXAvaQpVY3c2VXd4STVnNjl5YlIyQmxMbUVST0ZjbU1EQk9BRU5pc2dHUUxvZEtjZnRzbFdadkIxSmR4bndRNWhZSWl6ClB0R28vS1BhSGJEUnNTTlUzMFIyYmUxQjJNR3lJclpUSE44MUhkeWhkeW94NUMzMTVlWGJ5T0QvNVlEWEMyT2cKL3pPaEQ3b3NGUlhxbDdQU29yVys4b3lXSGhxUEhXeWtZVGU1aG5NejE1ZVduaU45Z3FSTWdlS2gwYnBuWDVVSApveWNSN2hZUWU3eEZTa3l5Qk5Lcjc5WDlERkhPVUdvSU1mbVIyZ3lQWkZ3RHd6cUxJRDl1aldjOU90YitmVnVJCnlWNzd6R0hjaXpOMzAwUXlOUWxpQkpJV0VOaWVKMGY3T3lIaitPc2RXd0lEQVFBQm80R3dNSUd0TUE4R0ExVWQKRXdFQi93UUZNQU1CQWY4d0N3WURWUjBQQkFRREFnRUdNQjBHQTFVZERnUVdCQlFhaEdLOFNFd3pKUVRVN3REMgpBOFFaUnRHVWF6QnVCZ05WSFNNRVp6QmxnQlFhaEdLOFNFd3pKUVRVN3REMkE4UVpSdEdVYTZGSnBFY3dSVEVMCk1Ba0dBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhHekFaQmdOVkJBTVQKRWxGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTW9JQ0JRa3dEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBRDRLRmsyZgpCbHVvcm5GZEx3VXZaK1lUUllQRU52Ynp3Q1lNRGJWSFpGMzR0SExKUnFVREdDZFZpWGg5ZHVxV05JQVhJTnpuCmcvaU4vQWU0Mmw5TkxtZXloUDNaUlB4M1VJSG1mTFRKRFF0eVUvaDJCd2RCUjVZTSsrQ0NKcE5WalA0aUgyQmwKZkYvbkpyUDNNcENZVU5RM2NWWDJraUY0OTVWNSt2Z3RKb2RtVmpCM3BqZDRNMUlRV0s0L1lZN3lhckh2R0g1SwpXV1BLamFKVzFhY3Z2RllmenpuQjR2c0txQlVzZlUxNlk4WnNsMFE4MG0vRFNoY0srSkRTVjZJWlVhVXRsMEhhCkIwK3BVTnFRalpSRzRUN3dsUDBRQURqMU8raEE0YlJ1VmhvZ3pHOVlqZTB1UlkvVzZaTS81N0VzM3pyV0lvemMKaExzaWI5RDQ1TVk1NlFTSVBNTzY2MVY2YllDWkpQVnNBZnY0bDdDVVcrdjkwbS94ZDJnTk5XUWpyTGhWb1FQUgpUVUlaM1BoMVdWYWorYWhKZWZpdkRya1JvSHkzYXUwMDBMWW1ZamdhaHd6NDZQMHUwNUIvQjVFcUhkWitYSVdECm1iQTRDRC9wWHZrMUIrVEpZbTVYZjZkUWxmZTZ5SnZtanFJQnhkWm12M2xoOHp3YzRibUNYRjJndytuWVNMMFoKb2hFVUdXNnloaHRvUGtnM0dvaTNYWlplbk1mdkoySUk0cEVaWE5MeElkMjZGMEtDbDNHQlV6R3BuL1o5WXI5eQo0YU9USGN5S0psb0pPTkRPMXcyQUZyUjRwVHFIVEkyS3BkVkdsL0lzRUxtOFZDTEFBVkJwUTU3MHN1OXQrT3phCjhlT3g3OStSajFRcUN5WEJKaG5FVWhBRlpkV0NFT3JDTWMwdQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049UXVvVmFkaXMgUm9vdCBDQSAzIE89UXVvVmFkaXMgTGltaXRlZAojIFN1YmplY3Q6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBMYWJlbDogIlF1b1ZhZGlzIFJvb3QgQ0EgMyIKIyBTZXJpYWw6IDE0NzgKIyBNRDUgRmluZ2VycHJpbnQ6IDMxOjg1OjNjOjYyOjk0Ojk3OjYzOmI5OmFhOmZkOjg5OjRlOmFmOjZmOmUwOmNmCiMgU0hBMSBGaW5nZXJwcmludDogMWY6NDk6MTQ6Zjc6ZDg6NzQ6OTU6MWQ6ZGQ6YWU6MDI6YzA6YmU6ZmQ6M2E6MmQ6ODI6NzU6NTE6ODUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE4OmYxOmZjOjdmOjIwOjVkOmY4OmFkOmRkOmViOjdmOmUwOjA3OmRkOjU3OmUzOmFmOjM3OjVhOjljOjRkOjhkOjczOjU0OjZiOmY0OmYxOmZlOmQxOmUxOjhkOjM1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHblRDQ0JJV2dBd0lCQWdJQ0JjWXdEUVlKS29aSWh2Y05BUUVGQlFBd1JURUxNQWtHQTFVRUJoTUNRazB4CkdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEd6QVpCZ05WQkFNVEVsRjFiMVpoWkdseklGSnYKYjNRZ1EwRWdNekFlRncwd05qRXhNalF4T1RFeE1qTmFGdzB6TVRFeE1qUXhPVEEyTkRSYU1FVXhDekFKQmdOVgpCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk1hVzFwZEdWa01Sc3dHUVlEVlFRREV4SlJkVzlXCllXUnBjeUJTYjI5MElFTkJJRE13Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRRE0KVjBJV1ZKem1tTlBUVGU3KzdjZWZRemxLWmJQb0ZvZzAydzFaa1hUUGtyZ0VRSzBDU3pHcnZJMlJhTmdnRGhvQgo0aHA3VGhkZDRvcTNQNWthemV0aHE4SmxwaCszdDcyM2ovejljSThMb0dlK0FhSlp6M0htRHlsMi83RldlVVVyCkg1NTZWT2lqS1RWb3BBRlBENlF1Tis4YnYrT1BFS2h5cTFoWDUxU0d5TW56VzlvczJsMk9ianlqUHRyN2d1WGQKOGx5eUJUTnZpamJPMEJOTy83OUtERFJNcHNNaHZWQUVWZXV4dTUzN1JSNWtGZDVWQVl3Q2RyWExvVDlDYWJ3dgp2V2hERmxhSktqZGhrZjJtcms3QXl4UmxsRGRMa2didkJOREluSWpiQzN1QnI3RTlLc1JsT25pMjd0eUFzZExUCm1adzY3bXRhYTdPTnQ5WE9uTUsrcFVzdkZyR2VhRHNHYjY1OW4vamU3TXdwcDVpakpVTXY3L0ZmSnVHSVRmaGUKYnRmWkZHNFpNMm1uTzRTSms4UlRWUk9oVVhoQStMakpvdTU3dWxKQ2c1NFU3UVZTV2xsV3A1ZjhuVDhLS2RqYwpUNUVPRTd6ZWxhVGZpNW0rckpzemlPKzFnYThieGlKVHlQYkg3cGNVc01WOGVGTEk4TTV1ZDJDRXB1a3FkaUR0CldBRVhNSlBwR292Z2MyUFphcEtVU1U2MHJVcUZ4S01pTVB3SjdXZ2ljNmFJREZVaFdNWGhPcDhxM2NyaGtPRFoKYzZ0c2dMam9DMlNUb0p5TUdmK3owZ3pza1NhSGlyT2k0WENQTEFybHpXMW9VZXZhUHdWL2l6TG1FMXhyL2w5QQo0aUxJdExSa1Q5YTZmVWcrcUdrTTE3dUdjY2x6dUQ4N25TVkwydjlBNndJREFRQUJvNElCbFRDQ0FaRXdEd1lEClZSMFRBUUgvQkFVd0F3RUIvekNCNFFZRFZSMGdCSUhaTUlIV01JSFRCZ2tyQmdFRUFiNVlBQU13Z2NVd2daTUcKQ0NzR0FRVUZCd0lDTUlHR0dvR0RRVzU1SUhWelpTQnZaaUIwYUdseklFTmxjblJwWm1sallYUmxJR052Ym5OMAphWFIxZEdWeklHRmpZMlZ3ZEdGdVkyVWdiMllnZEdobElGRjFiMVpoWkdseklGSnZiM1FnUTBFZ015QkRaWEowCmFXWnBZMkYwWlNCUWIyeHBZM2tnTHlCRFpYSjBhV1pwWTJGMGFXOXVJRkJ5WVdOMGFXTmxJRk4wWVhSbGJXVnUKZEM0d0xRWUlLd1lCQlFVSEFnRVdJV2gwZEhBNkx5OTNkM2N1Y1hWdmRtRmthWE5uYkc5aVlXd3VZMjl0TDJOdwpjekFMQmdOVkhROEVCQU1DQVFZd0hRWURWUjBPQkJZRUZQTEFFK0NDUXo3NzdpOW5NcFkxWE51NHl3TFFNRzRHCkExVWRJd1JuTUdXQUZQTEFFK0NDUXo3NzdpOW5NcFkxWE51NHl3TFFvVW1rUnpCRk1Rc3dDUVlEVlFRR0V3SkMKVFRFWk1CY0dBMVVFQ2hNUVVYVnZWbUZrYVhNZ1RHbHRhWFJsWkRFYk1Ca0dBMVVFQXhNU1VYVnZWbUZrYVhNZwpVbTl2ZENCRFFTQXpnZ0lGeGpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQWdFQVQ2MmdMRXo2d1BKdjkyWlZxeU0wCjd1Y3Ayc05idHJDRDJkRFE0aUg3ODJDbk8xMWdVeWVpbS9ZSUlpcm52NkJ5NVp3a2FqR3hrSG9uMjRRUmlTZW0KZDFvNDE3K3Nodnp1WFlPOEJzYlJkMnNQYlNRdlMzcHNwd2VXeXVPRW42MklpeDJyRm8xYlpoZlpGdlNMZ05MZAorTEoydy93NEU2b00za0pwSzI3elBPdUFKOXYxcGtRTm4xcFZXUXZWRFZKSXhhNmY4aStBeGVveVVEVVNseTdCCjRmL3hJNGhST0oveVpsWjI1dzlSbDZWU0RFMUpVWlUyUGIraVN3d1FIWWFaVEtyemNoR1Q1T3IybTlxb1hhZE4KdDU0Q3JuTUF5Tm9qQStqNTZobDBZZ0NVeXlJZ3ZwU25XYldDYXI2WmVYcXA4a29rVXZkMC9icE81cWdkQW02eApEWUJFd2E3VEl6ZGZ1NFY4SzVJdTZINmxpOTJaNGI4bmJ5MWRxbnVIL2dyZFMveU85U2JrYm5CQ2JqUHNNWjU3Cms4SGt5V2thUGNCclRpSnQ3cXRZVGNiUVFjRXI2azhTaDE3clJkaHM5WmdDMDZEWVZZb0dtUm1pb0hmUk1KNnMKekhYdWcvV3dZam5QYkZmaVROS1JDdzUxS0J1YXYvMGFRL0hLZC9zN2oyRzRhU2dXUWdSZWNDb2NJZGlQNGIwagpXeTEwUUpMWll4a05jOTFwdkdKSHZPQjBLN0xyZmI1Qkc3WEFSc1doSXN0ZlRzRW9rdDRZdXRVcUtMc1JpeGVUCm1KbGdsRndqejFvbmwxNExCUWFUTng0N2FUYnJxWjVoSFk4eTJvNE0xblErZXdrazJnRjNSOFE3elRTTW1mWEsKNFNWaE03SlpHK0p1MXpkWHRnMnBFdG89Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPVNFQ09NIFRydXN0Lm5ldCBPVT1TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEKIyBTdWJqZWN0OiBPPVNFQ09NIFRydXN0Lm5ldCBPVT1TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEKIyBMYWJlbDogIlNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdCBDQSIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IGYxOmJjOjYzOjZhOjU0OmUwOmI1OjI3OmY1OmNkOmU3OjFhOmUzOjRkOjZlOjRhCiMgU0hBMSBGaW5nZXJwcmludDogMzY6YjE6MmI6NDk6Zjk6ODE6OWU6ZDc6NGM6OWU6YmM6Mzg6MGY6YzY6NTY6OGY6NWQ6YWM6YjI6ZjcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGU3OjVlOjcyOmVkOjlmOjU2OjBlOmVjOjZlOmI0OjgwOjAwOjczOmE0OjNmOmMzOmFkOjE5OjE5OjVhOjM5OjIyOjgyOjAxOjc4Ojk1Ojk3OjRhOjk5OjAyOjZiOjZjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEV2pDQ0FrS2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURCUU1Rc3dDUVlEVlFRR0V3SktVREVZCk1CWUdBMVVFQ2hNUFUwVkRUMDBnVkhKMWMzUXVibVYwTVNjd0pRWURWUVFMRXg1VFpXTjFjbWwwZVNCRGIyMXQKZFc1cFkyRjBhVzl1SUZKdmIzUkRRVEV3SGhjTk1ETXdPVE13TURReU1EUTVXaGNOTWpNd09UTXdNRFF5TURRNQpXakJRTVFzd0NRWURWUVFHRXdKS1VERVlNQllHQTFVRUNoTVBVMFZEVDAwZ1ZISjFjM1F1Ym1WME1TY3dKUVlEClZRUUxFeDVUWldOMWNtbDBlU0JEYjIxdGRXNXBZMkYwYVc5dUlGSnZiM1JEUVRFd2dnRWlNQTBHQ1NxR1NJYjMKRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDenMvNS8wMjJ4N3haOFY2VU1iWGFLTDB1L1pQdE03b3J3OHlsOAo5Zi91S3VEcDZicGJaQ0thbW04c09pWnBVUVdaSnR6VkhHcHh4cHA5SHAzZGZHekdqR2RuU2o3NGNiQVpKNmtKCkRLYVZ2MHVNRFBwVm1Edlk2Q0toUzNFNGVheVhrbW16aVg3cUlXZ0dtQlNXaDlKaE5yeHRKMWFlVis3QXdGYjkKTXMrazJZN0NJOWVOcVBQWUpheVg1SEE0OUxZNnRKMDdseVpEbzZHOFNWbHlUQ013aHdGWTlrNitIR2hXWnEvTgpRVjNJczAwcVZVYXJIOW9lNGtBOTI4MTl1WktBbkRmZERKWmtuZHdpOTJTTDMySGVGWlJTRmFCOVVzbExxQ0hKCnhySHR5OE9WWU5FUDhLdHcrTi9MVFg3czF2cXIyYjEvVlBLbDZYbjYyZFoySkNoekFnTUJBQUdqUHpBOU1CMEcKQTFVZERnUVdCQlNnYzBtWmFOeUZXMlhqbXlndlY1KzlNN3dIU0RBTEJnTlZIUThFQkFNQ0FRWXdEd1lEVlIwVApBUUgvQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBYUVDcHFMdmtUMTE1c3dXMUY3TmdFK3ZHCmtsM2cwZE5xL3Z1K20yMi94d1Z0V1NERUhQQzMyb1JZQW1QNlNCYnZUNlVMOTBxWThqK2VHNjFIYTJQT0NFZnIKVWo5NG5LOU5ydmpWVDgrYW1Db1FRVGxTeE4zWm13N3Zrd0d1c2k3S2FFSWtRbXl3c3pvK3plbmFTTVFWeStuNQpCdytTVUVtSzNUR1hYOG5wTjZvN1dXV1hsRExKczU4K09tSll4VW10WWc1eHBUS3FMOGFKZGtOQUV4Tm5QYUpVCkpSREw4VHJ5MmZyYlNWYTdwdjZuUVRYRDRJaGh5WWpIM3pZUUlwaFo2ckJLKzFZV2MyNnNUZmNpb1UrdEhYb3QKUlNmbE1NRmU4dG9UeXlWQ1VaVkhBNHhzSWN4MFF1MVQvek9Manc5WEFSWXZ6NmJ1eVhBaUZMMzl2bXdMQXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U29uZXJhIENsYXNzMiBDQSBPPVNvbmVyYQojIFN1YmplY3Q6IENOPVNvbmVyYSBDbGFzczIgQ0EgTz1Tb25lcmEKIyBMYWJlbDogIlNvbmVyYSBDbGFzcyAyIFJvb3QgQ0EiCiMgU2VyaWFsOiAyOQojIE1ENSBGaW5nZXJwcmludDogYTM6ZWM6NzU6MGY6MmU6ODg6ZGY6ZmE6NDg6MDE6NGU6MGI6NWM6NDg6NmY6ZmIKIyBTSEExIEZpbmdlcnByaW50OiAzNzpmNzo2ZDplNjowNzo3Yzo5MDpjNTpiMTozZTo5MzoxYTpiNzo0MToxMDpiNDpmMjplNDo5YToyNwojIFNIQTI1NiBGaW5nZXJwcmludDogNzk6MDg6YjQ6MDM6MTQ6YzE6Mzg6MTA6MGI6NTE6OGQ6MDc6MzU6ODA6N2Y6ZmI6ZmM6Zjg6NTE6OGE6MDA6OTU6MzM6NzE6MDU6YmE6Mzg6NmI6MTU6M2Q6ZDk6MjcKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJRENDQWdpZ0F3SUJBZ0lCSFRBTkJna3Foa2lHOXcwQkFRVUZBREE1TVFzd0NRWURWUVFHRXdKR1NURVAKTUEwR0ExVUVDaE1HVTI5dVpYSmhNUmt3RndZRFZRUURFeEJUYjI1bGNtRWdRMnhoYzNNeUlFTkJNQjRYRFRBeApNRFF3TmpBM01qazBNRm9YRFRJeE1EUXdOakEzTWprME1Gb3dPVEVMTUFrR0ExVUVCaE1DUmtreER6QU5CZ05WCkJBb1RCbE52Ym1WeVlURVpNQmNHQTFVRUF4TVFVMjl1WlhKaElFTnNZWE56TWlCRFFUQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFKQVhTaldkeXZBTmxzZEUraFkzL0VpOXZYK0FMVFU3NFcrbwpaNm0vQXh4TmpHOHlSOVZCYUtRVEJNRTFESnFFUS94Y0hmK0pzK2dYR00yUlgvdUo0K3EvVGwxOEd5YlRkWG50CjVvVGpWK1d0S2NUME9pam5wWHVFTm1tei9WNTJ2YU10bWRPUVRpTW9mUmhqOFZRN0pwMTJXNWRDc3YrdThFN3MKM1RtVlRvTUdmK2RKUU1qRkFiSlVXbVlkUGZ6NTZUd0tub0c0Y1BBQmkrUWpWSHpJcnZpUUhnQ1djdFJVejJFagp2T3I3blFLVjBiYTVjVHBwQ0Q4UHRPRkN4NGoxUDVpb3A3b2M0SEZ4NzFoWGdWQjZYR3QwUmc2REE1akRqcWh1CjhuWXliaWVEd25QejNCam90SlBxZFVSckJHQWdjVmVIbmZPK29KQWpQWW9rNGRvaDI4TUNBd0VBQWFNek1ERXcKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFSQmdOVkhRNEVDZ1FJU3FDcVdJVFRYand3Q3dZRFZSMFBCQVFEQWdFRwpNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUJhem9mNUZuSVZWMHNkMlp2bm9pWXc3Sk5uMzlZdDBqU3Y5emlsCnpxc1d1YXN2ZkRYTHJOQVB0RXdyL0lEdmE0eVJYeloyOTl1ekd4bnE5TElSL1dGeFJMOG9zem9kdjdORDZKKy8KM0RFSWNiQ2RqZFkwUnpLUXhtVWs5NkJLZkFSemp6bHZGNHh5dGIxTHlIcjRlNFBES0U2Y0NlcG5QN0puQkJ2RApGTnI0NTBra2tkQWRhdnBoT2U5cjV5RjFCZ2ZZRXJRaElIQkNjWUhhUEpvMnZxWmJEV3BzbWgrUmUvbjU3MEs2ClRrNmV6QXlObE56WlJaeGU3RUpRWTY3MFhjU3hFdHpLTzZndW5SUmFCWFczN05kajRybzF0Z1FJa2VqYW5aejIKWnJVWXJBcW1WQ1kwTTlJYndkUi9HanFPQzZveWJ0djhUeVdmMlRMSGxscHdyTjlNCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1YUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1YUmFtcCBTZWN1cml0eSBTZXJ2aWNlcyBJbmMgT1U9d3d3LnhyYW1wc2VjdXJpdHkuY29tCiMgU3ViamVjdDogQ049WFJhbXAgR2xvYmFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89WFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jIE9VPXd3dy54cmFtcHNlY3VyaXR5LmNvbQojIExhYmVsOiAiWFJhbXAgR2xvYmFsIENBIFJvb3QiCiMgU2VyaWFsOiAxMDcxMDg5MDg4MDM2NTE1MDk2OTI5ODAxMjQyMzM3NDUwMTQ5NTcKIyBNRDUgRmluZ2VycHJpbnQ6IGExOjBiOjQ0OmIzOmNhOjEwOmQ4OjAwOjZlOjlkOjBmOmQ4OjBmOjkyOjBhOmQxCiMgU0hBMSBGaW5nZXJwcmludDogYjg6MDE6ODY6ZDE6ZWI6OWM6ODY6YTU6NDE6MDQ6Y2Y6MzA6NTQ6ZjM6NGM6NTI6Yjc6ZTU6NTg6YzYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGNlOmNkOmRjOjkwOjUwOjk5OmQ4OmRhOmRmOmM1OmIxOmQyOjA5OmI3OjM3OmNiOmUyOmMxOjhjOmZiOjJjOjEwOmMwOmZmOjBiOmNmOjBkOjMyOjg2OmZjOjFhOmEyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTURDQ0F4aWdBd0lCQWdJUVVKUnM3QmpxMVp4TjFaZnZkWStnclRBTkJna3Foa2lHOXcwQkFRVUZBRENCCmdqRUxNQWtHQTFVRUJoTUNWVk14SGpBY0JnTlZCQXNURlhkM2R5NTRjbUZ0Y0hObFkzVnlhWFI1TG1OdmJURWsKTUNJR0ExVUVDaE1iV0ZKaGJYQWdVMlZqZFhKcGRIa2dVMlZ5ZG1salpYTWdTVzVqTVMwd0t3WURWUVFERXlSWQpVbUZ0Y0NCSGJHOWlZV3dnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTURReE1UQXhNVGN4Ck5EQTBXaGNOTXpVd01UQXhNRFV6TnpFNVdqQ0JnakVMTUFrR0ExVUVCaE1DVlZNeEhqQWNCZ05WQkFzVEZYZDMKZHk1NGNtRnRjSE5sWTNWeWFYUjVMbU52YlRFa01DSUdBMVVFQ2hNYldGSmhiWEFnVTJWamRYSnBkSGtnVTJWeQpkbWxqWlhNZ1NXNWpNUzB3S3dZRFZRUURFeVJZVW1GdGNDQkhiRzlpWVd3Z1EyVnlkR2xtYVdOaGRHbHZiaUJCCmRYUm9iM0pwZEhrd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNZSkI2OUZiUzYKMzhlTXBTZTJPQXRwODdaT3FDd3VJUjFjUk44aFhYNGpkUDVlZnJSS3Q2YXRINjdnQmhiaW0xdlpaM1JyWFlDUApLWjJHRzltY0RaaHRkaEFvV09SbHNIOUttSG1mNE1NeGZvQXJ0WXpBUURzUmh0RExvb1kyWUtUVk1JSnQyVzdRCkR4SUVNNWRmVDJGYThPVDVrYXZuSFR1ODZNLzBheTAwZk9KSVlSeU84MkZFekcrZ1NxbVVzRTNhNTZrMGVuSTQKcUVITVBKUVJmZXZJcG95M2hzdktNenZaUFRlTCszbytoaXpuYzljS1Y2eGtteG5yOUE4RUNJcXNBeGNaWlBSYQpKU0tOTkN5eTltZ2RFbTNUaWg0VTJzU1BwdUlqaGRWNkRiMXE0T25zN0JlN1FodG5xaVh0UllNaC9NSEpmTlZpClB2cnl4UzNUL2RSbEFnTUJBQUdqZ1o4d2dad3dFd1lKS3dZQkJBR0NOeFFDQkFZZUJBQkRBRUV3Q3dZRFZSMFAKQkFRREFnR0dNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTVpQb2owR1k0UUpuTTVpNUFTcwpqVnkxNmJZYk1EWUdBMVVkSHdRdk1DMHdLNkFwb0NlR0pXaDBkSEE2THk5amNtd3VlSEpoYlhCelpXTjFjbWwwCmVTNWpiMjB2V0VkRFFTNWpjbXd3RUFZSkt3WUJCQUdDTnhVQkJBTUNBUUV3RFFZSktvWklodmNOQVFFRkJRQUQKZ2dFQkFKRVZPUU1CRzJmN1NoejVDbUJib2RwTmwyTDVKRk1uMTRKa1RwQXV3MGtiSzVyYy9LaDRaelh4SGZBUgp2YmRJNHhEMkRkOC8wc20ycWxXa1NMb0MyOTVaTGhWYk81MFdmVWZYTitwZlRYWVNOcnNmMTZHQkJFWWdveXh0CnFaNEJmajhwemdDVDMvM0prbk9KaVdTZTV5dmtISkVzMHJuT2ZjNXZNWm5UNXI3U0hwRHdDUlI1WENPclRkTGEKSVI5Tm1YbWQ0YzhubnhDYkhJZ05zSXBrUVRHNERteVFKS1NiWEhHUHVydCtIQnZiYW9BUElienAyNmEzUVBTeQppNm14NU8rYUd0QTlhWm51cUNpajRUeXo4TElSbk05OFFPYmQ1ME45b3RnNnRhbU44alNaeE5RUTRRYjlDWVFRCk8rN0VUUFRzSjN4Q3duUjhnb29KeWJRREpidz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuIE9VPUdvIERhZGR5IENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBPPVRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLiBPVT1HbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJHbyBEYWRkeSBDbGFzcyAyIENBIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogOTE6ZGU6MDY6MjU6YWI6ZGE6ZmQ6MzI6MTc6MGM6YmI6MjU6MTc6MmE6ODQ6NjcKIyBTSEExIEZpbmdlcnByaW50OiAyNzo5NjpiYTplNjozZjoxODowMTplMjo3NzoyNjoxYjphMDpkNzo3Nzo3MDowMjo4ZjoyMDplZTplNAojIFNIQTI1NiBGaW5nZXJwcmludDogYzM6ODQ6NmI6ZjI6NGI6OWU6OTM6Y2E6NjQ6Mjc6NGM6MGU6YzY6N2M6MWU6Y2M6NWU6MDI6NGY6ZmM6YWM6ZDI6ZDc6NDA6MTk6MzU6MGU6ODE6ZmU6NTQ6NmE6ZTQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVBRENDQXVpZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJqTVFzd0NRWURWUVFHRXdKVlV6RWgKTUI4R0ExVUVDaE1ZVkdobElFZHZJRVJoWkdSNUlFZHliM1Z3TENCSmJtTXVNVEV3THdZRFZRUUxFeWhIYnlCRQpZV1JrZVNCRGJHRnpjeUF5SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRBME1EWXlPVEUzCk1EWXlNRm9YRFRNME1EWXlPVEUzTURZeU1Gb3dZekVMTUFrR0ExVUVCaE1DVlZNeElUQWZCZ05WQkFvVEdGUm8KWlNCSGJ5QkVZV1JrZVNCSGNtOTFjQ3dnU1c1akxqRXhNQzhHQTFVRUN4TW9SMjhnUkdGa1pIa2dRMnhoYzNNZwpNaUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQ0NBU0F3RFFZSktvWklodmNOQVFFQkJRQURnZ0VOCkFEQ0NBUWdDZ2dFQkFONmQxK3BYR0VtaFcrdlhYMGlHNnI3ZC8rVHZaeHowWldpelYzR2dYbmU3N1p0SjZYQ0EKUFZZWVl3aHYydkxNMEQ5L0FsUWlWQkRZc29IVXdIVTlTMy9IZDhNK2VLc2FBN1VnYXk5cUs3SEZpSDdFdXg2dwp3ZGhGSjIrcU4xajNoeWJYMkMzMnFSZTNIM0kyVHFZWFAyV1lrdHNxYmwyaS9vamdDOTUvNVkwVjRldkxPdFhpCkVxSVRMZGlPcjE4U1BhQUlCUWkyWEtWbE9BUkZtUjZqWUdCMHhVR2xjbUliWXNVZmIxOGFRcjRDVVdXb3JpTVkKYXZ4NEE2bE5mNEREK3F0YS9LRkFwTW9aRnY2eXlPOWVjdzN1ZDcyYTlubVl2TEVIWjZJVkRkMmdXTVpFZXdvKwpZaWhmdWtFSFUxalBFWDQ0ZE1YNC83VnBrSStFZE9xWEc2OENBUU9qZ2NBd2diMHdIUVlEVlIwT0JCWUVGTkxFCnNOS1IxRXdSY2JOaHl6MmgvdDJvYXRUak1JR05CZ05WSFNNRWdZVXdnWUtBRk5MRXNOS1IxRXdSY2JOaHl6MmgKL3Qyb2F0VGpvV2VrWlRCak1Rc3dDUVlEVlFRR0V3SlZVekVoTUI4R0ExVUVDaE1ZVkdobElFZHZJRVJoWkdSNQpJRWR5YjNWd0xDQkpibU11TVRFd0x3WURWUVFMRXloSGJ5QkVZV1JrZVNCRGJHRnpjeUF5SUVObGNuUnBabWxqCllYUnBiMjRnUVhWMGFHOXlhWFI1Z2dFQU1Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQUQKZ2dFQkFESkw4N0xLUHBIOEVzYWhCNHlPZDZBekJoUmNrQjRZOXdpbVBRb1orWWVBRVc1cDVKWVhNUDgwa1dOeQpPTzdNSEFHakhaUW9wREgyZXNSVTEvYmxNVmdEb3N6T1l0dVVSWE8xdjBYSkpMWFZnZ0t0STNscGpiaTJUYzdQClRNb3pJK2djaUtxZGkwRnVGc2tnNVltZXpUdmFjUGQrbVNZZ0ZGUWxxMjV6aGVhYklaMEtiSUlPcVBqQ0RQb1EKSG15Vzc0Y054QTloaTYzdWd5dVYrSTZTaEhJNTZ5RHFnKzJEelpkdUNMenJUaWEyY3l2azAvWk0vaVp4NG1FUgpkRXIvVnhxSEQzVklMczlSYVJlZ0FoSmhsZFhSUUxJUVRPN0VyQkJEcHFXZUN0V1ZZcG9OejRpQ3hUSU01Q3VmClJlWU5ueWljc2JrcVdsZXROdyt2SFgvYnZaOD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLiBPVT1TdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IE89U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLiBPVT1TdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiU3RhcmZpZWxkIENsYXNzIDIgQ0EiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiAzMjo0YTo0YjpiYjpjODo2Mzo2OTo5YjpiZTo3NDo5YTpjNjpkZDoxZDo0NjoyNAojIFNIQTEgRmluZ2VycHJpbnQ6IGFkOjdlOjFjOjI4OmIwOjY0OmVmOjhmOjYwOjAzOjQwOjIwOjE0OmMzOmQwOmUzOjM3OjBlOmI1OjhhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNDo2NTpmYToyMDo1Mzo5NzpiODo3NjpmYTphNjpmMDphOTo5NTo4ZTo1NTo5MDplNDowZjpjYzo3ZjphYTo0ZjpiNzpjMjpjODo2Nzo3NToyMTpmYjo1ZjpiNjo1OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUR6Q0NBdmVnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQm9NUXN3Q1FZRFZRUUdFd0pWVXpFbApNQ01HQTFVRUNoTWNVM1JoY21acFpXeGtJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakV5TURBR0ExVUVDeE1wClUzUmhjbVpwWld4a0lFTnNZWE56SURJZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EUXcKTmpJNU1UY3pPVEUyV2hjTk16UXdOakk1TVRjek9URTJXakJvTVFzd0NRWURWUVFHRXdKVlV6RWxNQ01HQTFVRQpDaE1jVTNSaGNtWnBaV3hrSUZSbFkyaHViMnh2WjJsbGN5d2dTVzVqTGpFeU1EQUdBMVVFQ3hNcFUzUmhjbVpwClpXeGtJRU5zWVhOeklESWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd2dnRWdNQTBHQ1NxR1NJYjMKRFFFQkFRVUFBNElCRFFBd2dnRUlBb0lCQVFDM01zais2WEdtQklXdERCRmszODVONzhnREdJYy9vYXY3UEthZgo4TU9oMnRUWWJpdFRrUHNrcEQ2RThKN29YK3psSjBUMUtLWS9lOTdnS3ZESXIxTXZuc29GQVpNZWoyWWNPYWROCitscTJjd1FsWnV0M2YrZFp4a3FaSlJSVTZ5Ykg4MzhaMVRCd2o2K3dSaXIvcmVzcDdkZWZxZ1NIbzlUNWlhVTAKWDl0RGtZSTIyV1k4c2JpNWd2MmNPajRReUR2dkJtVm1lcHNaR0QzL2NWRThNQzVmdmoxM2M3SmRCbXpESTFhYQpLNFVta2h5bkFyUGtQdzJ2Q0htQ3VEWTk2cHpUTmJPOGFjcjF6SjNvL1dTTkY0QXpibDVLWFpuSkhvZTBuUnJBCjFXNFROU05lMzV0ZlBlL1c5M2JDNmo2N2VBMGNRbWRyQk5qNDF0cHZpL0pFb0FHckFnRURvNEhGTUlIQ01CMEcKQTFVZERnUVdCQlMvWDdmUnp0MGZodlJiVmF6YzF4RENEcW1JNXpDQmtnWURWUjBqQklHS01JR0hnQlMvWDdmUgp6dDBmaHZSYlZhemMxeERDRHFtSTU2RnNwR293YURFTE1Ba0dBMVVFQmhNQ1ZWTXhKVEFqQmdOVkJBb1RIRk4wCllYSm1hV1ZzWkNCVVpXTm9ibTlzYjJkcFpYTXNJRWx1WXk0eE1qQXdCZ05WQkFzVEtWTjBZWEptYVdWc1pDQkQKYkdGemN5QXlJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNWdnRUFNQXdHQTFVZEV3UUZNQU1CQWY4dwpEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBQVdkUDRpZDBja2FWYUdzYWZQeldkcWJBWWNhVDFlcG9Ya0pLdHYzCkw3SWV6TWRlYXRpRGg2R1g3MGsxUG5jR1FWaGl2NDVZdUFwblAreXozU0ZtSDhsVStuTE1QVXhBMklHdmQ1NkQKZXJ1aXgvVTBGNDdaRVVEMC9Dd3FUUlYvcDJKZExpWFRBQXNnR2gxbytSZTQ5TDJMN1NoWjNVMFdpeGVEeUxKbAp4eTE2cGFxOFU0WnQzVmVreXZnZ1FRdG84UFQ3ZEw1V1hYcDU5ZmtkaGVNdGxiNzFjWkJEekkwZm1nQUtoeW5wClZTSllBQ1BxNHhKREtWdEhDTjJNUVdwbEJxamxJYXBCdEpVaGxibDkwVFNyRTlhdHZOemlQVG5OdlQ1MWNLRVkKV1FQSklyU1BuTlZlS3RlbHR0UUtiZmkzUUJGR21oOTVEbUsvRDVmczRDOGZGNVE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPUdvdmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IE89R292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJUYWl3YW4gR1JDQSIKIyBTZXJpYWw6IDQyMDIzMDcwODA3NzA4NzI0MTU5OTkxMTQwNTU2NTI3MDY2ODcwCiMgTUQ1IEZpbmdlcnByaW50OiAzNzo4NTo0NDo1MzozMjo0NToxZjoyMDpmMDpmMzo5NTplMToyNTpjNDo0Mzo0ZQojIFNIQTEgRmluZ2VycHJpbnQ6IGY0OjhiOjExOmJmOmRlOmFiOmJlOjk0OjU0OjIwOjcxOmU2OjQxOmRlOjZiOmJlOjg4OjJiOjQwOmI5CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3NjowMDoyOTo1ZTplZjplODo1Yjo5ZToxZjpkNjoyNDpkYjo3NjowNjoyYTphYTphZTo1OTo4MTo4YTo1NDpkMjo3Nzo0YzpkNDpjMDpiMjpjMDoxMTozMTplMTpiMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmNqQ0NBMXFnQXdJQkFnSVFINTFaV3RjdndnWkVwWUFJYWVOZTlqQU5CZ2txaGtpRzl3MEJBUVVGQURBLwpNUXN3Q1FZRFZRUUdFd0pVVnpFd01DNEdBMVVFQ2d3blIyOTJaWEp1YldWdWRDQlNiMjkwSUVObGNuUnBabWxqCllYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUQXlNVEl3TlRFek1qTXpNMW9YRFRNeU1USXdOVEV6TWpNek0xb3cKUHpFTE1Ba0dBMVVFQmhNQ1ZGY3hNREF1QmdOVkJBb01KMGR2ZG1WeWJtMWxiblFnVW05dmRDQkRaWEowYVdacApZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCCkFKb2x1T3pNb25Xb2UvZk9XMW1LeWRHR0VnaFU3Snp5NTBiMmlQTjg2YVhmVEVjMnBCc0JISDhlVjRxTnc4WFIKSWVQYUpEOUlLL3VmTHFHVTV5d2NrOUcvR3dHSFU1bk9wL1VLSVhaMy82bTN4bk9VVDBiM0VFazMrcWhaU1YxcQpnUWRXOG9yNUJ0RDNjQ0pOdExkQnVUSzRzZkN4dzV3L2NQMVQzWUdxMkdONDl0aFRicUdzYW9Ra2NsU0d4dEt5Cnlod09lWUhXdFhCaUNBRXVUazhPMVJHdnFhL2xtci9jeklkdEp1VEpWNkw3bHZuTTRUOVRqR3hNZnB0VENBdHMKRi90bnlNS3RzYzJBdEpmY2RnRVdGZWxxMTZUaGVFZk9odFg3TWZQNk1iNDBxaWo3Y0V3ZFNjZXZMSjF0WnFhMgpqV1IrdFNCcW5UdUJ0bzlBQUdkTGlZYTR6R1grRlZQcEJNSFdYeDFFMXdvdko1cEdmYUVOZGExVWhoWGNTVHZ4CmxzNFBtNkRzbzNwZHZ0VXFkVUxsZTk2bHRxcXZLS3lza0t3NHQ5Vm9OU1o2M1BjNzgvMUZtOUc3UTNodWIvRkMKVkdxWThBMnRsK2xTWHVuVmFuTGVhdmNiWUJUMHBlUzJjV2VxSCtyaVRjRkNRUDVuUmhjNEwwYy9jWnl1NVNISwpZUzF0QjZpRWZDM3VVU1h4WTVDZS9lRlhpR3Z2aWlOdHNlYTlQNjNSUFpZTGhZM05heWU3dHdXYjdMdVJxUW9ICkVnS1hUaUNROFA4Tkh1SkJPOU5BT3VlTlhkcG01QUt3QjFLWVhBNk9NNXpDcHBYN1ZSbHVUSTZ1U3crOXdUaE4KWG8rRUhXYk54V0NXdEZKYUJZbU9sWHFZd1pFOGxTT3lEdlI1dE1sOHdVb2hBZ01CQUFHamFqQm9NQjBHQTFVZApEZ1FXQkJUTXpPL01LV0NrTzdHU3RqejZNbUtQckNVVk96QU1CZ05WSFJNRUJUQURBUUgvTURrR0JHY3FCd0FFCk1UQXZNQzBDQVFBd0NRWUZLdzREQWhvRkFEQUhCZ1ZuS2dNQUFBUVVBNXZ3SWhQL2xTZzIwOXlld0RMN01UcUsKVVdVd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFFQ0FTdm9teWM1ZU1OMVBoblIyV1BXdXM0TXplS1I2ZEJjWgpUdWxTdGJuZ0NuUmlxbWpLZUtCTW1vNHNJeTdWYWhJa3Y5Um8wNHJRMkp5ZnRCOE0zamgrVnpqOGplSlBYZ3lmCnF6dlMvM1dYeTZUalp3ai81Y0FXdFVnQmZlbjVDdjhiNVdwcHYzZ2hxTUtuSTZtR3EzWlc2QTRNOWhQZEttYUsKWkVrOUdoaUhrQVNmUWxLM1Q4ditSMEYyTmUvL0FIWTJSVEtieGthRlhlSWtzQjdqU0phWVYwZVVWWG9QUWJGRQpKUFBCL2hwcnY0ajl3YWJhazJCZWdVcVpJSnhJWmhtMUFIbFVEN2dzTDB1OHFWMWJZSCtNaDZYZ1VtTXF2dGc3CmhVQVYvaDYyWlQvRlM5cCt0WG8xS2FNdWVwaGdJcVAwZlNkT0xlcTBkRHpwRDZRekR4QVJ2Qk1CMXVVTzA3KzEKRXFMaFJTUEF6QWh1WWJlSnE0UGpKQjdtWFFmbkh5QSt6MmZJNTZ3d2JTZExhRzVMS2x3Q0NEVGIrSGJrWjZNbQpuRCtpTXNKS3hZRVlNUkJXcW9UdkxRci91QjkzMHIrbFdLQmk1TmRMa1hXTmlZQ1lmbTNMVTA1ZXIvYXlsNFdYCnVkcFZCcmtrN3RmR09CNWpHeEk3bGVGWXJQTGZoTlZmbVM4TlZWdm1PTnN1UDNMcFNJWEx1eWtUang0NFZibnoKc3NRd21TTk9YZkpJb1JJTTNCS1FDWkJVa1FNOFIrWFZ5V1hndDB0OTdFZlRzd3Mrclo3UWRBQU82NzFScmNEZQpMTUREYXY3djNBdW4ra2JmWU51Y3BsbFFkU05wYzVPeStmd0MwMGZtY2M0UUF1NG5qSVQvckVVTkUxeURNdUFsCnBZWXNmUFFTCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EiCiMgU2VyaWFsOiAxNzE1NDcxNzkzNDEyMDU4Nzg2MjE2Nzc5NDkxNDA3MTQyNTA4MQojIE1ENSBGaW5nZXJwcmludDogODc6Y2U6MGI6N2I6MmE6MGU6NDk6MDA6ZTE6NTg6NzE6OWI6Mzc6YTg6OTM6NzIKIyBTSEExIEZpbmdlcnByaW50OiAwNTo2MzpiODo2MzowZDo2MjpkNzo1YTpiYjpjODphYjoxZTo0YjpkZjpiNTphODo5OTpiMjo0ZDo0MwojIFNIQTI1NiBGaW5nZXJwcmludDogM2U6OTA6OTk6YjU6MDE6NWU6OGY6NDg6NmM6MDA6YmM6ZWE6OWQ6MTE6MWU6ZTc6MjE6ZmE6YmE6MzU6NWE6ODk6YmM6ZjE6ZGY6Njk6NTY6MWU6M2Q6YzY6MzI6NWMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR0ekNDQXArZ0F3SUJBZ0lRRE9mZzVSZllSdjZQNVdEOEcvQXdPVEFOQmdrcWhraUc5dzBCQVFVRkFEQmwKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2CmIzUWdRMEV3SGhjTk1EWXhNVEV3TURBd01EQXdXaGNOTXpFeE1URXdNREF3TURBd1dqQmxNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObApjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1EwRXdnZ0VpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3REaFhPNUVPQVhMR0g4N2RnK1hFU3BhN2MKSnBTSXF2VE85U0E1S0ZoZ0RQaUEycWtWbFRKaFBMV3hLSVNLaXR5ZkNneURGM3FQa0t5SzUzbFRYREdFS3ZZUAptREkyZHN6ZTNUeW9vdTlxK3lIeVVtSGZueURYSCtLeDJmNFlaTklTVzEvNVdCZzF2RWZOb1RiNWEzL1VzRGcrCndSdkRqRFBaMkM4WS9pZ1BzNmVEMXNOdVJNQmhOWllXL2xtY2kzWnQxL0dpU3cwci93dHkycDVnMEk2UU5jWjQKVlljZ29jL2xiUXJJU1h3eG1ETnNJdW1IMERKYW9yb1RnaEh0T1JlZG1UcHlvZWI2cE5uVkZ6RjFyb1Y5SXE0LwpBVWFHOWloNXlMSGE1RmNYeEg0Y0RyQzBrcVpXczcyeWwrMnFwL0MzeGFnL2xSYlEvNkdXNndoZkdIZFBBZ01CCkFBR2pZekJoTUE0R0ExVWREd0VCL3dRRUF3SUJoakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVcKQkJSRjY2S3Y5SkxMZ2pFdFVZdW5weUdkODIzSUR6QWZCZ05WSFNNRUdEQVdnQlJGNjZLdjlKTExnakV0VVl1bgpweUdkODIzSUR6QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFvZzY4MytMdDhPTnljM3BrbEwvM2NtYllNdVJDCmRXS3VoK3Z5MWRuZVZyT2Z6TTRVS0xrTmwyQmNFa3hZNU5NOWcwbEZXSmMxYVJxb1IrcFd4bm1yRXRobmdZVGYKZndrOGxPYTRKaXdndlQyektJbjNYLzhpNHBlRUgrbGw3NGZnMzhGblNiTmQ2N0lKS3VzbTdYaStmVDhyODdjbQpOVzFmaVFHMlNWdWZBUVdicXowbHdjeTJmOEx4YjRiRyttUm82NEV0bE90Q3QvcU1IdDFpOGI1UVo3ZHN2ZlB4Ckgyc01OZ2NXZnpkOHFWdHRldkVTUm1DRDF5Y0V2a3ZPbDc3RFp5cG9FZCtBNXd3elpyOFREUlJ1ODM4Zll4QWUKK28wYkpXMXNqNlczWVFHeDBxTW1vUkJ4bmEzaXcvbkRtVkczS3djSXppN21VTEtuK2dwRkw2THc4Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgR2xvYmFsIFJvb3QgQ0EiCiMgU2VyaWFsOiAxMDk0NDcxOTU5ODk1MjA0MDM3NDk1MTgzMjk2Mzc5NDQ1NDM0NgojIE1ENSBGaW5nZXJwcmludDogNzk6ZTQ6YTk6ODQ6MGQ6N2Q6M2E6OTY6ZDc6YzA6NGY6ZTI6NDM6NGM6ODk6MmUKIyBTSEExIEZpbmdlcnByaW50OiBhODo5ODo1ZDozYTo2NTplNTplNTpjNDpiMjpkNzpkNjo2ZDo0MDpjNjpkZDoyZjpiMTo5Yzo1NDozNgojIFNIQTI1NiBGaW5nZXJwcmludDogNDM6NDg6YTA6ZTk6NDQ6NGM6Nzg6Y2I6MjY6NWU6MDU6OGQ6NWU6ODk6NDQ6YjQ6ZDg6NGY6OTY6NjI6YmQ6MjY6ZGI6MjU6N2Y6ODk6MzQ6YTQ6NDM6Yzc6MDE6NjEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURyekNDQXBlZ0F3SUJBZ0lRQ0R2Z1ZwQkNSckdoZFdySldaSEhTakFOQmdrcWhraUc5dzBCQVFVRkFEQmgKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1TQXdIZ1lEVlFRREV4ZEVhV2RwUTJWeWRDQkhiRzlpWVd3Z1VtOXZkQ0JEClFUQWVGdzB3TmpFeE1UQXdNREF3TURCYUZ3MHpNVEV4TVRBd01EQXdNREJhTUdFeEN6QUpCZ05WQkFZVEFsVlQKTVJVd0V3WURWUVFLRXd4RWFXZHBRMlZ5ZENCSmJtTXhHVEFYQmdOVkJBc1RFSGQzZHk1a2FXZHBZMlZ5ZEM1agpiMjB4SURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFTkJNSUlCSWpBTkJna3Foa2lHCjl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUE0anZoRVhMZXFLVFRvMWVxVUtLUEMzZVF5YUtsN2hMT2xsc0IKQ1NETUFaT25UakMzVS9kRHhHa0FWNTNpalNMZGh3WkFBSUVKenM0Ymc3L2Z6VHR4UnVMV1pzY0ZzM1luRm85NwpuaDZWZmU2M1NLTUkydGF2ZWd3NUJtVi9TbDBmdkJmNHE3N3VLTmQwZjNwNG1WbUZhRzVjSXpKTHYwN0E2RnB0CjQzQy9keEMvL0FIMmhkbW9SQkJZTXFsMUdOWFJvcjVINGlkcTlKb3orRWtJWUl2VVg3UTZoTCtocWtwTWZUN1AKVDE5c2RsNmdTemVSbnR3aTVtM09GQnFPYXN2K3piTVVaQmZIV3ltZU1yL3k3dnJUQzBMVXE3ZEJNdG9NMU8vNApnZFc3alZnL3RSdm9TU2lpY05veEJOMzNzaGJ5VEFwT0I2anRTajFldFgramtNT3ZKd0lEQVFBQm8yTXdZVEFPCkJnTlZIUThCQWY4RUJBTUNBWVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVQTk1UU5WYlIKVEx0bThLUGlHeHZEbDdJOTBWVXdId1lEVlIwakJCZ3dGb0FVQTk1UU5WYlJUTHRtOEtQaUd4dkRsN0k5MFZVdwpEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBTXVjTjZwSUV4SUsrdDFFbkU5U3NQVGZyZ1QxZVhrSW95UVkvRXNyCmhNQXR1ZFhIL3ZUQkgxakx1RzJjZW5Ubm1DbXJFYlhqY0tDaHpVeUltWk9Na1hEaXF3OGN2cE9wLzJQVjVBZGcKMDZPL25Wc0o4ZFdPNDFQMGptUDZQNmZidEdiZlltYlcwVzVCamZJdHRlcDNTcCtkV09JcldjQkFJKzB0S0lKRgpQbmxVa2lhWTRJQklxRGZ2OE5aNVlCYmVyT2dPelc2c1JCYzRMMG5hNFVVK0tyazJVODg2VUFiM0x1akVWMGxzCllTRVkxUVN0ZUR3c09vQnJwK3V2RlJUcDJJbkJ1VGhzNHBGc2l2OWt1WGNsVnpEQUd5U2o0ZHpwMzBkOHRiUWsKQ0FVdzdDMjlDNzlGdjFDNXFmUHJtQUVTcmNpSXhwZzBYNDBLUE1icDFaV1ZiZDQ9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EiCiMgU2VyaWFsOiAzNTUzNDAwMDc2NDEwNTQ3OTE5NzI0NzMwNzM0Mzc4MTAwMDg3CiMgTUQ1IEZpbmdlcnByaW50OiBkNDo3NDpkZTo1Nzo1YzozOTpiMjpkMzo5Yzo4NTo4MzpjNTpjMDo2NTo0OTo4YQojIFNIQTEgRmluZ2VycHJpbnQ6IDVmOmI3OmVlOjA2OjMzOmUyOjU5OmRiOmFkOjBjOjRjOjlhOmU2OmQzOjhmOjFhOjYxOmM3OmRjOjI1CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3NDozMTplNTpmNDpjMzpjMTpjZTo0Njo5MDo3Nzo0ZjowYjo2MTplMDo1NDo0MDo4ODozYjphOTphMDoxZTpkMDowYjphNjphYjpkNzo4MDo2ZTpkMzpiMToxODpjZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHhUQ0NBcTJnQXdJQkFnSVFBcXhjSm1vTFFKdVBDM255cmtZbGR6QU5CZ2txaGtpRzl3MEJBUVVGQURCcwpNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNzd0tRWURWUVFERXlKRWFXZHBRMlZ5ZENCSWFXZG9JRUZ6YzNWeVlXNWoKWlNCRlZpQlNiMjkwSUVOQk1CNFhEVEEyTVRFeE1EQXdNREF3TUZvWERUTXhNVEV4TURBd01EQXdNRm93YkRFTApNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREVScFoybERaWEowSUVsdVl6RVpNQmNHQTFVRUN4TVFkM2QzCkxtUnBaMmxqWlhKMExtTnZiVEVyTUNrR0ExVUVBeE1pUkdsbmFVTmxjblFnU0dsbmFDQkJjM04xY21GdVkyVWcKUlZZZ1VtOXZkQ0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTWJNNVhQbQorOVM3NVMwdE1xYmY1WUUveWMwbFNiWnhLc1BWbERSbm9nb2NzRjlwcGtDeHhMZXlqOUNZcEtsQldUclQzSlRXClBOdDBPS1JLekUwbGd2ZEtwVk1TT083elNXMXhrWDVqdHF1bVg4T2toUGhQWWxHKytNWHMyemlTNHdibENKRU0KeENoQlZmdkxXb2tWZm5Ib05iOU5jZ2s5dmpvNFVGdDNNUnVOczhja1JacW5yRzBBRkZvRXQ3b1Q2MUVLbUVGQgpJazVsWVllQlFWQ21lVnlKM2hsS1Y5VXU1bDBjVXl4K21NMGFCaGFrYUhQUU5BUVRYS0Z4MDFwOFZkdGVaT0UzCmh6QldCT1VSdENtQUV2RjVPWWlpQWhGOEoyYTNpTGQ0OHNvS3FEaXJDbVRDdjJaZGxZVEJvU1VlaDEwYVVBc2cKRXN4QnUyNExVVGk0UzhzQ0F3RUFBYU5qTUdFd0RnWURWUjBQQVFIL0JBUURBZ0dHTUE4R0ExVWRFd0VCL3dRRgpNQU1CQWY4d0hRWURWUjBPQkJZRUZMRSt3MmtEK0w5SEFkU1lKaG9JQXU5alpDdkRNQjhHQTFVZEl3UVlNQmFBCkZMRSt3MmtEK0w5SEFkU1lKaG9JQXU5alpDdkRNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUFjR2dhWDNOZWMKbnp5SVpnWUlWeUhiSVVmNEttZXF2eGd5ZGtBUVY4R0s4M3JaRVdXT05mcWUvRVcxbnRsTU1VdTRrZWhETEk2egplTTdiNDFONWNkYmxJWlFCMmxXSG1pUms5b3Btek42Y044Mm9OTEZwbXlQSW5uZ2lLM0JENDFWSE1XRVo3MWpGCmhTOU9NUGFnTVJZanlPZmlaUll6eTc4YUc2QTkrTXBlaXpHTFlBaUpMUXdHWEZLM3hQa0ttTkVWWDU4U3ZudzIKWXppOVJLUi81Q1lyQ3NTWGFRM3BqT0xBRUZlNHlIWVNrVlh5U0duWXZDb0NXdzlFMUNBeDIvUzZjQ1pka0dDZQp2RXNYQ1MrMHl4NURhTWtISjhIU1hQZnFJYmxvRXB3OG5MK2UvSUJjbTJQTjdFZXFKU2Rub0RmekFJSjlWTmVwCitPa3VFNk4zNkI5SwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2xhc3MgMiBQcmltYXJ5IENBIE89Q2VydHBsdXMKIyBTdWJqZWN0OiBDTj1DbGFzcyAyIFByaW1hcnkgQ0EgTz1DZXJ0cGx1cwojIExhYmVsOiAiQ2VydHBsdXMgQ2xhc3MgMiBQcmltYXJ5IENBIgojIFNlcmlhbDogMTc3NzcwMjA4MDQ1OTM0MDQwMjQxNDY4NzYwNDg4MzI3NTk1MDQzCiMgTUQ1IEZpbmdlcnByaW50OiA4ODoyYzo4Yzo1MjpiODphMjozYzpmMzpmNzpiYjowMzplYTphZTphYzo0MjowYgojIFNIQTEgRmluZ2VycHJpbnQ6IDc0OjIwOjc0OjQxOjcyOjljOmRkOjkyOmVjOjc5OjMxOmQ4OjIzOjEwOjhkOmMyOjgxOjkyOmUyOmJiCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwZjo5OTozYzo4YTplZjo5NzpiYTphZjo1Njo4NzoxNDowZTpkNTo5YTpkMTo4MjoxYjpiNDphZjphYzpmMDphYTo5YTo1ODpiNTpkNTo3YTozMzo4YTozYTpmYjpjYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGtqQ0NBbnFnQXdJQkFnSVJBSVc5Uy9QWTJ1TnA5cFRYWDhPbFJDTXdEUVlKS29aSWh2Y05BUUVGQlFBdwpQVEVMTUFrR0ExVUVCaE1DUmxJeEVUQVBCZ05WQkFvVENFTmxjblJ3YkhWek1Sc3dHUVlEVlFRREV4SkRiR0Z6CmN5QXlJRkJ5YVcxaGNua2dRMEV3SGhjTk9Ua3dOekEzTVRjd05UQXdXaGNOTVRrd056QTJNak0xT1RVNVdqQTkKTVFzd0NRWURWUVFHRXdKR1VqRVJNQThHQTFVRUNoTUlRMlZ5ZEhCc2RYTXhHekFaQmdOVkJBTVRFa05zWVhOegpJRElnVUhKcGJXRnllU0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTnhRCmx0QVMrRFhTQ0hoNnRsSncvVy91ejdrUnkxMTM0ZXpwZmdTTjFzeHZjME5YWUt3ekNrVHNBMThjZ0NTUjVhaVIKVmhLQzkrQXI5TnV1WVM2SkVJMXJiTHF6QXIzVk5zVklOeVBpOEZvM1VqTVhFdUxSWUUyK0wwRVI0L1lYSlF5TAprY0FibVh1WlZnMnY3dEs4UjFmamVVbDdOSWtuSklUZXNlenBXRTcrVHQ5YXZrR3RyQWpGR0E3djBsUHViTkNkCkVnRVRqZHlBWXZlVnFVU0lTbkZPWUZXZTJ5TVplVllIREQ5akMxeXc0cjUrRmZ5VU0xaEJPSFRFNFkrTDN5YXMKSDdXTE83ZERXV3V3SktadGtJdkVjdXBkTTVpM3k5NWVlKytVOFJzK3lza2h3Y1dZQXFxaTlsdDNtL1YrbGxVMApIR2Rwd1BGQzQwZXMvQ2djWmxVQ0F3RUFBYU9CakRDQmlUQVBCZ05WSFJNRUNEQUdBUUgvQWdFS01Bc0dBMVVkCkR3UUVBd0lCQmpBZEJnTlZIUTRFRmdRVTQzTXQzOHNPS0F6ZTNiT2t5bm00anJ2b01Ja3dFUVlKWUlaSUFZYjQKUWdFQkJBUURBZ0VHTURjR0ExVWRId1F3TUM0d0xLQXFvQ2lHSm1oMGRIQTZMeTkzZDNjdVkyVnlkSEJzZFhNdQpZMjl0TDBOU1RDOWpiR0Z6Y3pJdVkzSnNNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUNuVk0rSVJCbkwzOVIvCkFOOVdNMksxOTFFQmtPdkRQOUdJUk9ra1hlL25GTDBndDVvOEFQNXRuOXVRM05mMFl0YUxjRjNuNVFSSXFXaDgKeWZGQzgyeC94WHA4SFZHSXV0SUtQaWRkM2kxUlR0TVRaR25rTHVQVDU1c0ptYWJnbFp2T0d0ZC92anpPVXJNUgpGY0VQRjgwRHU1d2xGYnFpZG9uOEJ2RVkwSk5MRG55Q3Q2WDA5bC8rN1VDbW5ZUjBPYm5jSG9VVzJpa2JoaU1BCnlidUpmbTZBaUI0dkZMUURKS2d5YndPYVJ5d3d2bGJHcDBJQ2NCdnFRTmk2QlFOd0I2U1cvLzFJTXdyaDNLV0IKa0p0TjNYM241N0xOWE1ocWxmaWw5bzNFWFhnSXZuc0cxa25QR1RaUUl5NEk1cDRGVFVjWTFSYnBzZGEyRU5XNwpsNytpanJSVQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RFNUIFJvb3QgQ0EgWDMgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4KIyBTdWJqZWN0OiBDTj1EU1QgUm9vdCBDQSBYMyBPPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLgojIExhYmVsOiAiRFNUIFJvb3QgQ0EgWDMiCiMgU2VyaWFsOiA5MTI5OTczNTU3NTMzOTk1MzMzNTkxOTI2Njk2NTgwMzc3ODE1NQojIE1ENSBGaW5nZXJwcmludDogNDE6MDM6NTI6ZGM6MGY6Zjc6NTA6MWI6MTY6ZjA6MDI6OGU6YmE6NmY6NDU6YzUKIyBTSEExIEZpbmdlcnByaW50OiBkYTpjOTowMjo0Zjo1NDpkODpmNjpkZjo5NDo5Mzo1ZjpiMTo3MzoyNjozODpjYTo2YTpkNzo3YzoxMwojIFNIQTI1NiBGaW5nZXJwcmludDogMDY6ODc6MjY6MDM6MzE6YTc6MjQ6MDM6ZDk6MDk6ZjE6MDU6ZTY6OWI6Y2Y6MGQ6MzI6ZTE6YmQ6MjQ6OTM6ZmY6YzY6ZDk6MjA6NmQ6MTE6YmM6ZDY6Nzc6MDc6MzkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURTakNDQWpLZ0F3SUJBZ0lRUksrd2dOYWpKN3FKTURtR0x2aEFhekFOQmdrcWhraUc5dzBCQVFVRkFEQS8KTVNRd0lnWURWUVFLRXh0RWFXZHBkR0ZzSUZOcFoyNWhkSFZ5WlNCVWNuVnpkQ0JEYnk0eEZ6QVZCZ05WQkFNVApEa1JUVkNCU2IyOTBJRU5CSUZnek1CNFhEVEF3TURrek1ESXhNVEl4T1ZvWERUSXhNRGt6TURFME1ERXhOVm93ClB6RWtNQ0lHQTFVRUNoTWJSR2xuYVhSaGJDQlRhV2R1WVhSMWNtVWdWSEoxYzNRZ1EyOHVNUmN3RlFZRFZRUUQKRXc1RVUxUWdVbTl2ZENCRFFTQllNekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQgpBTit2NlpkUUNJTlh0TXhpWmZhUWd1ekgweXhyTU1wYjdObkRmY2RBd1JnVWkrRG9NM1pKS3VNL0lVbVRyRTRPCnJ6NUl5Mlh1L05NaEQyWFNLdGt5ajR6bDkzZXdFbnUxbGNDSm82bTY3WE11ZWd3R01vT2lmb29VTU0wUm9PRXEKT0xsNUNqSDlVTDJBWmQrM1VXT0R5T0tJWWVwTFlZSHNVbXU1b3VKTEdpaWZTS09lRE5vSmpqNFhMaDdkSU45Ygp4aXFLcXk2OWNLM0ZDeG9sa0hSeXhYdHFxelRXTUluLzVXZ1RlMVFMeU5hdTdGcWNraDQ5WkxPTXh0Ky95VUZ3CjdCWnkxU2JzT0ZVNVE5RDgvUmhjUVBHWDY5V2FtNDBkdXRvbHVjYlkzOEVWQWpxcjJtN3hQaTcxWEFpY1BOYUQKYWVRUW14a3F0aWxYNCtVOW01L3dBbDBDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVgpIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRk1TbnNhUjdMSEg2MitGTGtIWC94QlZnaFlrUU1BMEdDU3FHClNJYjNEUUVCQlFVQUE0SUJBUUNqR2l5YkZ3QmNxUjd1S0dZM09yK0R4ejlMd3dtZ2xTQmQ0OWxaUk5JK0RUNjkKaWt1Z2RCL09FSUtjZEJvZGZwZ2EzY3NUUzdNZ1JPU1I2Y3o4ZmFYYmF1WCs1djNnVHQyM0FEcTFjRW12OHVYcgpBdkhSQW9zWnk1UTZYa2pFR0I1WUdWOGVBbHJ3RFBHeHJhbmNXWWFMYnVtUjlZYksrcmxtTTZwWlc4N2lweFp6ClI4c3J6Sm13TjBqUDQxWkw5YzhQREhJeWg4YndSTHRUY20xRDlTWkltbEpudDFpci9tZDJjWGpiRGFKV0ZCTTUKSkRHRm9xZ0NXakJINGQxUUI3d0NDWkFBNjJSallKc1d2SWpKRXViU2ZaR0wrVDB5aldXMDZYeXhWM2JxeGJZbwpPYjhWWlJ6STluZVdhZ3FOZHd2WWtRc0VqZ2ZiS2JZSzdwMkNOVFVRCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1Td2lzc1NpZ24gR29sZCBDQSAtIEcyIE89U3dpc3NTaWduIEFHCiMgU3ViamVjdDogQ049U3dpc3NTaWduIEdvbGQgQ0EgLSBHMiBPPVN3aXNzU2lnbiBBRwojIExhYmVsOiAiU3dpc3NTaWduIEdvbGQgQ0EgLSBHMiIKIyBTZXJpYWw6IDEzNDkyODE1NTYxODA2OTkxMjgwCiMgTUQ1IEZpbmdlcnByaW50OiAyNDo3NzpkOTphODo5MTpkMTozYjpmYTo4ODoyZDpjMjpmZjpmODpjZDozMzo5MwojIFNIQTEgRmluZ2VycHJpbnQ6IGQ4OmM1OjM4OjhhOmI3OjMwOjFiOjFiOjZlOmQ0OjdhOmU2OjQ1OjI1OjNhOjZmOjlmOjFhOjI3OjYxCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2MjpkZDowYjplOTpiOTpmNTowYToxNjozZTphMDpmODplNzo1YzowNTozYjoxZTpjYTo1NzplYTo1NTpjODo2ODo4Zjo2NDo3Yzo2ODo4MTpmMjpjODozNTo3Yjo5NQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnVqQ0NBNktnQXdJQkFnSUpBTHRBSEVQMVhrK3dNQTBHQ1NxR1NJYjNEUUVCQlFVQU1FVXhDekFKQmdOVgpCQVlUQWtOSU1SVXdFd1lEVlFRS0V3eFRkMmx6YzFOcFoyNGdRVWN4SHpBZEJnTlZCQU1URmxOM2FYTnpVMmxuCmJpQkhiMnhrSUVOQklDMGdSekl3SGhjTk1EWXhNREkxTURnek1ETTFXaGNOTXpZeE1ESTFNRGd6TURNMVdqQkYKTVFzd0NRWURWUVFHRXdKRFNERVZNQk1HQTFVRUNoTU1VM2RwYzNOVGFXZHVJRUZITVI4d0hRWURWUVFERXhaVApkMmx6YzFOcFoyNGdSMjlzWkNCRFFTQXRJRWN5TUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDCkNnS0NBZ0VBcitUdWZvc2tEaEp1cVZBdEZrUTdrcEpjeXJoZGhKSkNFeXE4WlZlQ1FENVhKTTFRaXlVcXQyLzgKNzZMUXdCOENKRW9UbG84akUrWW9XQUNqUjhjR3A0UWpLN3U5bGl0L1ZjeUx3VmNmRG1KbEQ5MDlWb3B6MnE1KwpiYnFCSEg1Q2pDQTEyVU5OaFBxRTIxSXM4dzRuZHd0cnZ4RXZjbmlmTHRnKzVoZzNXaXB5K2RwaWtKS1Z5aCtjCjZiTThLOHZ6QVJPL1dzL0J0UXBndmQyMW1XUlR1S0NXczIvaUpuZVJqT0JpRUFLZk5BK2sxWkl6VWQ2K2picUUKZW1BOGF0dWZLK3plM2dFL2JrM2xVSWJMdEsvdFJFREZ5bHFNMnRJcmZLanV2cWJsQ3FvT3BkOEZVcmRWeHlKZApNbXFYbDJNVDI4bmJlVFo3aFRwS3hWS0orU1RublhlcGd2OVZIS1Z4YVN2UkFpVHlzeWJVYTlvRVZlWEJDc2R0Ck1EZVFLdVNlRkROZUZoZFZ4VnUxeXpTSmt2R2RKbytoQjlUR3NuaFEyd3dNQzN3TGpFSFh1ZW5kaklqM28wMnkKTXN6WUY5ck50ODVtbmRUOVh2KzlsejRwZGVkK3AySllyeVUwcFVISFBid05VTW9EQXc4SVdoK1ZjM2hpdjY5eQpGR2tPcGVVRERuaU9KaWhDOEFjTFlpQVFaemxHK3FrRHpBUTRlbWJ2SUlPMWpFcFdqcEVBL0k1Y2d0NklvTVBpCmFHNTlqZTg4M1dYMFhheFI3eVNBcnFwV2wyLzVyWDNhWVQrWWR6eWxrYlljakNiYVphSUpiY0hpVk9PNXlreE0KZ0k5M2UyQ2FIdCsyOGtnZURycE9WRzJZNE9HaUdxSjNVTS9FWTVMc1J4bWQ2K1pyenNFQ0F3RUFBYU9CckRDQgpxVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVXeVY3CmxxUmxVWDY0T2ZQQWVHWmU2RHJuOE80d0h3WURWUjBqQkJnd0ZvQVVXeVY3bHFSbFVYNjRPZlBBZUdaZTZEcm4KOE80d1JnWURWUjBnQkQ4d1BUQTdCZ2xnaFhRQldRRUNBUUV3TGpBc0JnZ3JCZ0VGQlFjQ0FSWWdhSFIwY0RvdgpMM0psY0c5emFYUnZjbmt1YzNkcGMzTnphV2R1TG1OdmJTOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBQ2U2CjQ1Ujg4YTdBM2hmbTVkalY5VlN3Zy9TN3pWNEZlMCtmZFdhdlBPaFdmdnh5ZURnRDJTdGlHd0M1K09sZ3pjek8KVVlySFVERnU0VXArR0M5cFdiWTlaSUVyNDRPRTVpS0hqbjNnN2dLWlliZ2U5TGdyaUJJV2hNSXhremlXTWFhNQpPMU0vd3lTVFZsdHBrdXpGd2JzNEFPUHNGNm00M01kOEFZT2ZNa2U2VWlJMEhUSjZDVmFuZkNVMnFUMUwyc0NDCmJ3cTdFc2lIU3ljUitSNHR4NU0vbnR0ZkptdFMyUzZLOFJUR1JJMFZxYmUvdmQ2bUd1NnVMZnRJZHhmK3UreXYKR1BVcVVmQTVoSmVWYkc0Ynd5dkVkR0I1SmJBS0o5L2ZYdEk1ejBWOVFrdmZzeXdleGNaZHlsVTZvSnhwbW8vYQo3N0t3UEorSGJCSXJaWEFWVWpFYUpNOXZNU05RSDR4UGp5UERkRUZqSEZXb0ZOMCs0RkZRei9FYk1GWU9rckNDCmhkaUR5eUprdkMyNEpkVlVvcmdHNnEyU3BDU2d3WWExU2hOcVI4OHVDMWFWVk12T210dHF0S2F5MjBFSWhpZDMKOTJxZ1Ftd0xPTTdYZFZBeWtzTGZLekFpU05EVlFUZ2xYYVRwWFovR2xIWFFSZjB3bDBPUGtLc0t4NFp6WUVwcApMZDZsZU5jRzJtcWVTejUzT2lBVElnSFF2MmllWTJCck5VMExiYnFoUGNDVDRIOGpzMVd0Y2lWT1J2blNGdSt3ClpNRUJudW5Lb0dxWURzL1lZUEl2U2Jqa1F1RTROUmIweUc1UDk0Rlc2THFqdmlPdnJ2MXZBK0FDT3pCMitodHQKUWM4QnNlbTR5V2IwMnliek9xUjA4a2trVzhtdzBGZkIrajU2NFpmSgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyIE89U3dpc3NTaWduIEFHCiMgU3ViamVjdDogQ049U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyIE89U3dpc3NTaWduIEFHCiMgTGFiZWw6ICJTd2lzc1NpZ24gU2lsdmVyIENBIC0gRzIiCiMgU2VyaWFsOiA1NzAwMzgzMDUzMTE3NTk5NTYzCiMgTUQ1IEZpbmdlcnByaW50OiBlMDowNjphMTpjOTo3ZDpjZjpjOTpmYzowZDpjMDo1Njo3NTo5NjpkODo2MjoxMwojIFNIQTEgRmluZ2VycHJpbnQ6IDliOmFhOmU1OjlmOjU2OmVlOjIxOmNiOjQzOjVhOmJlOjI1OjkzOmRmOmE3OmYwOjQwOmQxOjFkOmNiCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZTo2Yzo0ZDphMjpiYjpiOTpiYTo1OTpiNjpmMzo5Mzo5Nzo2ODozNzo0Mjo0NjpjMzpjMDowNTo5OTozZjphOTo4ZjowMjowZDoxZDplZDpiZTpkNDo4YTo4MTpkNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnZUQ0NBNldnQXdJQkFnSUlUeHZVTDFTN0wwc3dEUVlKS29aSWh2Y05BUUVGQlFBd1J6RUxNQWtHQTFVRQpCaE1DUTBneEZUQVRCZ05WQkFvVERGTjNhWE56VTJsbmJpQkJSekVoTUI4R0ExVUVBeE1ZVTNkcGMzTlRhV2R1CklGTnBiSFpsY2lCRFFTQXRJRWN5TUI0WERUQTJNVEF5TlRBNE16STBObG9YRFRNMk1UQXlOVEE0TXpJME5sb3cKUnpFTE1Ba0dBMVVFQmhNQ1EwZ3hGVEFUQmdOVkJBb1RERk4zYVhOelUybG5iaUJCUnpFaE1COEdBMVVFQXhNWQpVM2RwYzNOVGFXZHVJRk5wYkhabGNpQkRRU0F0SUVjeU1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBCk1JSUNDZ0tDQWdFQXhQR0hmOU40TWZjNHlmakRtVU84eC9lOE4rZE9jYnBMajZWekhWeHVtSzREVjY0NE4wTXYKRnowZnlNNW9FTUY0cmhrREt4RDZMSG1EOXVpNWFMbFY4Z1JFcHpuNS9BU0xIdkdpVFNmNVlYdTZ0K1dpRTdicgpZVDdRYk5IbSsvcGU3UjIwbnFBMVc2R1N5L0JKa3Y2RkNnVSs1dGtMNGsrNzNKVTMvSkhwTWpVaTBSODZUaWVGCm5iQVZsRExhWVExSFRXQkNycEpINklOYVVGanBpb3U1WGFIYzNabEtIelpudTBqa2c3WTM2MGc2cnc5bmp4Y0gKNkFUSzcyb3hoOVRBdHZtVWNYdG5aTGkya1VwQ2UyVXVNR29NOVpEdWxlYnl6WUxzMmFGSzdQYXlTK1ZGaGVadAplSk1FTHB5Q2JUYXB4REZrSDRhREN5cjBOUXA0eVZYUFFiQkg2VENmbWI1aHFBYUV1U2g2WHpqWkc2azRzSU4vCmM4SERPMGdxZ2c4aG03ak1xRFhEaEJ1RHN6NitwSlZwQVRxSkFIZ0UyY24wbVJtclZuNWJpNFk1RlpHa0VDd0oKTW9CZ3M1UEFLcllZQzUxK2pVbnlFRXAvK2RWR0x4bVNvNW1uSnF5N2pEem1EcnhIQjl4elVmRndaQzhJK2JSSApIVEJzUk9vcE40V1NhR2E4Z3pqK2V6a3UwMUR3SC90ZVlMYXBwdm9uUWZHYkdITHk5WVIwU3NsbnhGU3VTR1RmCmpORnVzQjNoQjQ4SUhwbWNjZWxNMktYM1J4SWZkTkZSbm9iendxSWpRQXR6MjB1bTUzTUdqTUdnNmNGWnJFYjYKNWkvNHozR2NSbTI1eEJXTk9Ia0RSVWp2eEYzWENPNkhPU0tHc2cwUFdFUDNjYWxJTHYzcTFoOENBd0VBQWFPQgpyRENCcVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVCkY2RE53ZVJCdGpwYk84dEZuYjBjd3BqNmhsZ3dId1lEVlIwakJCZ3dGb0FVRjZETndlUkJ0anBiTzh0Rm5iMGMKd3BqNmhsZ3dSZ1lEVlIwZ0JEOHdQVEE3QmdsZ2hYUUJXUUVEQVFFd0xqQXNCZ2dyQmdFRkJRY0NBUllnYUhSMApjRG92TDNKbGNHOXphWFJ2Y25rdWMzZHBjM056YVdkdUxtTnZiUzh3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCCkFIUEdnZUFuMGkwUDRKVXc0cHBCZjFBc1gxOWlZYW1HYW1rWURIUkoxbDJFNmtGU0dHOVlyVkJXSUdyR3ZTaHAKV0pIY2tSRTFxVG9kdkJxbFlKN1lIMzlGa1duWmZydDRjc0VHRHlyT2o0VndZYXlnelF1NE9TbFdoREpPaHJzOQp4Q3JaMXg5eTd2NVJvU0pCc1hFQ1l4cUNzR0tyWGxjU0g5L0wzWFdnd0YxNWtJd2I0RkRtM2pIK21IdHdYNldRCjJLMzRBclp2MDJEZFFFc2l4VDJ0T25xZkdocEhrWGt6dW9MY01ta0RsbTRmUy9CeC91Tm5jcUN4djF5TDVQcVoKSXNlRXVSdU5JNWMvN1NYZ3oyVzc5V0VFNzkwZXNscEJJbHFobjEwczZGdkpiYWtNREhpcVlNWldqd0ZhREdpOAphUmw1eEI5K2x3Vy94ZWtrVVY3VTFVdFQ3ZGtqV2pZRFphUEJBNjFCTVBOR0c0V1FyMlcxMWJIa0ZsdDRkUjJYCmVtMVpxU3FQZTk3RGg0a1FtVWx6ZU1nOXZWRTFkQ3JWOFg1cEd5cTdPNzBsdUpwYVBYSmhrR2FIN2d6V1RkUVIKZEF0cS9nc0QvS05WVjRuK1NzdXVXeGNGeVBLTkl6RlRPTkl0YWorQ3VZMElhdmRlUVhSdXd4RitCNndwWUpFLwpPTXBYRUEyOU1DL0hwZVpCb05xdUJZZWFvS1JsYkV3SkRJbTZ1Tk81d0pPS01QcU41WnByRlFGT1o2cmFZbFkrCmhBaG0wc1EyZmFjK0VQeUk0TlNBNVFDOXF2Tk9CcU42YXZsaWN1TUpUK3ViRGdFajhaKzdmTnpjYkJHWEpiTHkKdEdNVTBnWXFaNHlEOWM3cUI5aWFhaDdzNUFxN0trenJDV0E1enNwaTJDNXUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1HZW9UcnVzdCBJbmMuCiMgU3ViamVjdDogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUdlb1RydXN0IEluYy4KIyBMYWJlbDogIkdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAzMjc5ODIyNjU1MTI1Njk2MzMyNDMxMzgwNjQzNjk4MTk4MjM2OQojIE1ENSBGaW5nZXJwcmludDogMDI6MjY6YzM6MDE6NWU6MDg6MzA6Mzc6NDM6YTk6ZDA6N2Q6Y2Y6Mzc6ZTY6YmYKIyBTSEExIEZpbmdlcnByaW50OiAzMjozYzoxMTo4ZToxYjpmNzpiODpiNjo1Mjo1NDplMjplMjoxMDowZDpkNjowMjo5MDozNzpmMDo5NgojIFNIQTI1NiBGaW5nZXJwcmludDogMzc6ZDU6MTA6MDY6YzU6MTI6ZWE6YWI6NjI6NjQ6MjE6ZjE6ZWM6OGM6OTI6MDE6M2Y6YzU6Zjg6MmE6ZTk6OGU6ZTU6MzM6ZWI6NDY6MTk6Yjg6ZGU6YjQ6ZDA6NmMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURmRENDQW1TZ0F3SUJBZ0lRR0t5MWF2MXB0aFU2WTJ5djJ2ckVvVEFOQmdrcWhraUc5dzBCQVFVRkFEQlkKTVFzd0NRWURWUVFHRXdKVlV6RVdNQlFHQTFVRUNoTU5SMlZ2VkhKMWMzUWdTVzVqTGpFeE1DOEdBMVVFQXhNbwpSMlZ2VkhKMWMzUWdVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MHdOakV4Ck1qY3dNREF3TURCYUZ3MHpOakEzTVRZeU16VTVOVGxhTUZneEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUsKRXcxSFpXOVVjblZ6ZENCSmJtTXVNVEV3THdZRFZRUURFeWhIWlc5VWNuVnpkQ0JRY21sdFlYSjVJRU5sY25ScApabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDCkFRRUF2cmdWZS8vVWZIMW5yWU5rZThoQ1V5M2Y5b1FJSUdIV0FWbHFuRVFScis5Mi9aVit6bUV3dTNxRFh3SzkKQVdiSzdoV05iNkV3bkwyaGhaNlVPdk5XaUFBeHo5anVhcFlDMmUwRGpQdDFiZWZxdUZVV0JSYWE5T0Jlc1lqQQpaSVZjRlUySXg3ZTY0SFhwclFVOW5jZUpTT0M3S01nRDRUQ1RaRjVTd0Zsd0lqVlhpSXJ4bFFxRDE3d3hjd0UwCjdlOUdjZUJyQXFnMWNtdVhtMmJneXh4NVg5Z2FCR2dlUndMbW5XRGlOcGNCMzg0MWt0KytaOGR0ZDFrN2o1M1cKa0JXVXZFSTBFTUU1K2JFblBuN1dpblhGc3ErVzA2TGVtK1NZdm4zaDZZR3R0bS84MXc3YTREU3dEUnAzNStNSQptTzlZK3B5RXR6YXZ3dCtzMHZRUUJuQnhOUUlEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHCkExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVTE5WUVFaY1ZpL0NQTm1GYlN2dHIyWm5KTTVJd0RRWUoKS29aSWh2Y05BUUVGQlFBRGdnRUJBRnB3Znl6ZHR6UlA5WVpScVNhK1M3aXE4WEVOM0dISG9PbzBIbnAzRHdRMQo2Q2VQYkpDL2tSWWtSajVLVHM0ckZ0VUxVaDM4SDJlaUFrVXhUODd6K2dPbmVaMVRhdG5hWXpyNGdOZlRtZUdsCjRiN1VWWEdZTlRxK2srcXVyVUt5a0cvZy9DRk5OV016aVVuV20wN0t4K2RPQ1FEMzJzZnZtV0taZDdhVklsNksKb0t2MHVIaVl5amdabWNseW5uak5TNnl2R2FCekVpMzh3a0c2Z1pIYUZsb3h0L20wY1lBU1NKbHljMXBaVThGagpValB0cDhuU09RSncrdUN4UW1ZcHFwdFI3VEJVSWhSZjJhc2R3ZVNVOFBqMUsvZnF5bmhHMXJpUi9hWU5LeG9VCkFUNkE4RUtnbFFkZWJjM01TNlJGamFzUzZMUGVXdVdnZk9nUEloMWE2Vms9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj10aGF3dGUgUHJpbWFyeSBSb290IENBIE89dGhhd3RlLCBJbmMuIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24vKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj10aGF3dGUgUHJpbWFyeSBSb290IENBIE89dGhhd3RlLCBJbmMuIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24vKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogInRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EiCiMgU2VyaWFsOiA2OTUyOTE4MTk5MjAzOTIwMzU2NjI5ODk1Mzc4NzcxMjk0MDkwOQojIE1ENSBGaW5nZXJwcmludDogOGM6Y2E6ZGM6MGI6MjI6Y2U6ZjU6YmU6NzI6YWM6NDE6MWE6MTE6YTg6ZDg6MTIKIyBTSEExIEZpbmdlcnByaW50OiA5MTpjNjpkNjplZTozZTo4YTpjODo2Mzo4NDplNTo0ODpjMjo5OToyOTo1Yzo3NTo2Yzo4MTo3Yjo4MQojIFNIQTI1NiBGaW5nZXJwcmludDogOGQ6NzI6MmY6ODE6YTk6YzE6MTM6YzA6Nzk6MWQ6ZjE6MzY6YTI6OTY6NmQ6YjI6NmM6OTU6MGE6OTc6MWQ6YjQ6NmI6NDE6OTk6ZjQ6ZWE6NTQ6Yjc6OGI6ZmI6OWYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVJRENDQXdpZ0F3SUJBZ0lRTkU3VlZ5RFY3ZXhKOUMvT045c3JiVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKcVRFTE1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RESFJvWVhkMFpTd2dTVzVqTGpFb01DWUdBMVVFQ3hNZgpRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFNE1EWUdBMVVFQ3hNdktHTXBJREl3Ck1EWWdkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4SHpBZEJnTlYKQkFNVEZuUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEV3SGhjTk1EWXhNVEUzTURBd01EQXdXaGNOTXpZdwpOekUyTWpNMU9UVTVXakNCcVRFTE1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RESFJvWVhkMFpTd2dTVzVqCkxqRW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFNE1EWUcKQTFVRUN4TXZLR01wSURJd01EWWdkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObApJRzl1YkhreEh6QWRCZ05WQkFNVEZuUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEV3Z2dFaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNzb1BEN2dGblVuTWVrejUyaFdYTUpFRVVNRFN4dWFQRnMKVzBob1NWazMvQXN6R2NKM2Y4d1FMWlUwSE9iclRRbW5ITks0eVpjMkFyZUoxQ1JmQnNETVJKU1VqUUppYit0YQozUkdOS0pwY2hKQVFlZzI5ZEdZdmFqaWc0dFZVUk9zZEI1OEh1bS91NmYxT0N5bjFQb1NnQWZHY3EvZ2Nmb21rCjZLSFljV1VObzFGNzdyelNJbUFOdVZ1ZDM3cjhVVnNMcjVpeTZTN3BCT2hpaDk0cnlOZE93VXhrSHQzUGgxaTYKU2svS2FBY2RISjFLeHRVdmtjeDhjWEljeGNCbjZ6TDl5WkpjbE5xRndKdS9VMzByQ2ZTTW5aRWZsMnBTeTk0SgpOcVIzMkh1SFVFVFZQbTRwYWZzNVNTWWVDYVdBZTBBdDYrZ25oY24rWWYxKzVueVhIZFdkQWdNQkFBR2pRakJBCk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJSN1cwWFAKcjg3TGV2MHhraHBxdHZORzYxZElVREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBZVJIQVM3T1J0dnp3NldmVQpEVzVGdmxYb2s5TE9Bei90MmlXd0hWZkxIanAyb0V6c1VIYm9aSElNcEtueHVJdlcxb2VFdXpMbFFSSEFkOW16CllKM3JHOVhSYmtSRXFhWUI3RlZpSFhlNFhJNUlTWHljTzFjUnJLMXpONDR2ZUZ5UWFFZlpZR0RtL0FjOUlpQVgKeFBjVzZjVFljdm5JYzN6ZkZpOFZxVDc5YWllMm9ldGF1cGdmMWVOTlpBcWRFOGhodXZVNUhJZTZ1TDE3SW4vMgovcXhBZWVXc0VHODlqeHQ1ZG92RU43TWhHSVRsTmdEcll5Q1p1ZW4rTXdTN1FjakJBdmxFWXlDZWdjNUMwOVkvCkxIYlRZNXhaM1krbTRRNmdMa0gzTHBWSHo3ejlNL1AyQzJGK2ZwRXJnVWZDSnpEdXB4QmRONDljT1N2a0JQQjcKalZhTWFBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNSBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDYgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNSBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDYgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiVmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc1IgojIFNlcmlhbDogMzMwMzc2NDQxNjc1NjgwNTg5NzAxNjQ3MTk0NzU2NzYxMDE0NTAKIyBNRDUgRmluZ2VycHJpbnQ6IGNiOjE3OmU0OjMxOjY3OjNlOmUyOjA5OmZlOjQ1OjU3OjkzOmYzOjBhOmZhOjFjCiMgU0hBMSBGaW5nZXJwcmludDogNGU6YjY6ZDU6Nzg6NDk6OWI6MWM6Y2Y6NWY6NTg6MWU6YWQ6NTY6YmU6M2Q6OWI6Njc6NDQ6YTU6ZTUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDlhOmNmOmFiOjdlOjQzOmM4OmQ4OjgwOmQwOjZiOjI2OjJhOjk0OmRlOmVlOmU0OmI0OjY1Ojk5Ojg5OmMzOmQwOmNhOmYxOjliOmFmOjY0OjA1OmU0OjFhOmI3OmRmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFMHpDQ0E3dWdBd0lCQWdJUUdOclJuaVo5Nkx0S0lWak56R3M3U2pBTkJna3Foa2lHOXcwQkFRVUZBRENCCnlqRUxNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUwKRXhaV1pYSnBVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOaUJXWlhKcApVMmxuYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNVVV3UXdZRFZRUURFenhXClpYSnBVMmxuYmlCRGJHRnpjeUF6SUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjAKYUc5eWFYUjVJQzBnUnpVd0hoY05NRFl4TVRBNE1EQXdNREF3V2hjTk16WXdOekUyTWpNMU9UVTVXakNCeWpFTApNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUxFeFpXClpYSnBVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOaUJXWlhKcFUybG4KYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNVVV3UXdZRFZRUURFenhXWlhKcApVMmxuYmlCRGJHRnpjeUF6SUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5CmFYUjVJQzBnUnpVd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN2SkFnSUtYbzEKbm1BTXF1ZExPMDdjZkx3OFJSeTdLK0QrS1FMNVZ3aWpaSVVWSi9YeHJjZ3hpVjBpNkNxcXBrS3pqL2k1VmJleAp0MHV6L285K0IxZnM3MFBiWm1JVlljOWdEYVRZM3ZqZ3cySUlQVlFUNjBuS1dWU0ZKdVVyanh1ZjYvV2hrY0l6ClNkaERZMnBTUzlLUDZIQlJUZEdKYVh2SGNQYXozQkowMjN0ZFMxYlRscjhWZDZHdzlLSWw4cThja21jWTVmUUcKQk8rUXVlUUE1TjA2dFJuL0FycjBQTzdnaStzM2krejAxNnp5OXZBOXI5MTFrVE1aSFJ4QXkzUWtHU0dUMlJUKwpyQ3BTeDQvVkJFbmtqV05IaUR4cGc4ditSNzByZmsvRmxhNE9uZFRSUThCbmMrTVVDSDdsUDU5enVETUt6MTAvCk5JZVdpdTVUNkNVVkFnTUJBQUdqZ2JJd2dhOHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEUKQkFNQ0FRWXdiUVlJS3dZQkJRVUhBUXdFWVRCZm9WMmdXekJaTUZjd1ZSWUphVzFoWjJVdloybG1NQ0V3SHpBSApCZ1VyRGdNQ0dnUVVqK1hUR29hc2pZNXJ3OCtBYXRSSUdDeDdHUzR3SlJZamFIUjBjRG92TDJ4dloyOHVkbVZ5CmFYTnBaMjR1WTI5dEwzWnpiRzluYnk1bmFXWXdIUVlEVlIwT0JCWUVGSC9UWmFmQzNleTc4REFKODBNNStnS3YKTXpFek1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQ1RKRW93WDJMUDJCcVlMejNxM0prdHZYZjJwWGtpT096RQpwNkI0RXExaURrVndaTVhubDJZdG1BbCtYNi9XekNobDhnR3FDQnBIM3ZuNWZKSmFDR2tnRGRrK2JXNDhEVzdZCjVnYVJRQmk1K01IdDM5dEJxdUNXSU1uTlpCVTRnY21VN3FLRUtRc1RiNDdiRE4wbEF0dWtpeGxFMGtGNkJXbEsKV0U5Z3luNkNhZ3NDcWlVWE9iWGJmK2VFWlNxVmlyMkczbDZCRm9NdEVNemUvYWlDS20wb0h3MEx4T1huR2lZWgo0ZlFSYnhDMWxmem5RZ1V5Mjg2ZFVWNG90cDZGMDF2dnBYMUZRSEtPdHc1ckRnYjdNelZJY2JpZEo0dkVaVjhOCmhuYWNSSHIybFZ6MlhUSUlNNlJVdGhnL2FGenlRa3FGT0ZTRFg5SG9MUEtzRWRhbzdXTnEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNlY3VyZVRydXN0IENBIE89U2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24KIyBTdWJqZWN0OiBDTj1TZWN1cmVUcnVzdCBDQSBPPVNlY3VyZVRydXN0IENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTZWN1cmVUcnVzdCBDQSIKIyBTZXJpYWw6IDE3MTk5Nzc0NTg5MTI1Mjc3Nzg4MzYyNzU3MDE0MjY2ODYyMDMyCiMgTUQ1IEZpbmdlcnByaW50OiBkYzozMjpjMzphNzo2ZDoyNTo1NzpjNzo2ODowOTo5ZDplYToyZDphOTphMjpkMQojIFNIQTEgRmluZ2VycHJpbnQ6IDg3OjgyOmM2OmMzOjA0OjM1OjNiOmNmOmQyOjk2OjkyOmQyOjU5OjNlOjdkOjQ0OmQ5OjM0OmZmOjExCiMgU0hBMjU2IEZpbmdlcnByaW50OiBmMTpjMTpiNTowYTplNTphMjowZDpkODowMzowZTpjOTpmNjpiYzoyNDo4MjozZDpkMzo2NzpiNToyNTo1Nzo1OTpiNDplNzoxYjo2MTpmYzplOTpmNzozNzo1ZDo3MwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHVEQ0NBcUNnQXdJQkFnSVFEUENPWEFnV3BhMUNmL0RySnhoWjBEQU5CZ2txaGtpRzl3MEJBUVVGQURCSQpNUXN3Q1FZRFZRUUdFd0pWVXpFZ01CNEdBMVVFQ2hNWFUyVmpkWEpsVkhKMWMzUWdRMjl5Y0c5eVlYUnBiMjR4CkZ6QVZCZ05WQkFNVERsTmxZM1Z5WlZSeWRYTjBJRU5CTUI0WERUQTJNVEV3TnpFNU16RXhPRm9YRFRJNU1USXoKTVRFNU5EQTFOVm93U0RFTE1Ba0dBMVVFQmhNQ1ZWTXhJREFlQmdOVkJBb1RGMU5sWTNWeVpWUnlkWE4wSUVOdgpjbkJ2Y21GMGFXOXVNUmN3RlFZRFZRUURFdzVUWldOMWNtVlVjblZ6ZENCRFFUQ0NBU0l3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLdWtnZVdWemZYMkZJN0NUOHJVNG5pVldKeEI0UTJaUUNRWE9aRXoKWnVtKzRZT3ZZbHlKMGZ3a1cyR3o0QkVSUVJ3ZGJ2QzR1L2plcDRHNnBrakdueDI5dm82cFFUNjRsTzBwR3RTTwowZ01kQSs5dERXY2NWOWNHcmNySTlmNE9yMllsU0FTV0MxMmp1aGJEQ0UvUlJ2Z1VYUExJWGdHWmJmMkl6SWFvCndXOHhRbXhTUG1qTDh4azAzN3VIR0ZhQUpzVFEzTUJ2Mzk2Z3dwRVdvR1FSUzBTOEh2Ym4rbVBlWnF4MnBIR2oKN0RhVWFIcDNwTEhuRGkrQmV1SzFjb2J2b211TDhBL2IwMWsvdW5LOFJDU2M0M096OTY5WEwwSW1uYWwwdWdCUwo4a3ZOVTN4SEN6YUZEbWFwQ0pjV05GZkJadmVBNCsxd1ZNZVQ0QzRvRlZtSHVyc0NBd0VBQWFPQm5UQ0JtakFUCkJna3JCZ0VFQVlJM0ZBSUVCaDRFQUVNQVFUQUxCZ05WSFE4RUJBTUNBWVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBZEJnTlZIUTRFRmdRVVFqSzJGdm9FL2Y1ZFMzckQvZmRNUUIxYVE2OHdOQVlEVlIwZkJDMHdLekFwb0NlZwpKWVlqYUhSMGNEb3ZMMk55YkM1elpXTjFjbVYwY25WemRDNWpiMjB2VTFSRFFTNWpjbXd3RUFZSkt3WUJCQUdDCk54VUJCQU1DQVFBd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFERHRUMHJoV0RwU2NsdTFwcU5sR0thN1VUdDMKNlozcTA1OWM0RVZsZXczS1crSndVTEtVQlJTdVNjZU5RUWNTYzVSK0RDTWgvYndRZjJBUVduTDFtQTZzN0xsLwozWHB2WGRNYzlQK0lCV2xDcVFWeHlMZXNKdWd1dEl4cS8zSGN1TEhmbWJ4OElWUXI1RmlpdTFjcHJwNnBveGttCkQ1a3VDTER2L1duUG1Sb0pqZU9ubnl2Sk5qUjdKTE40VEpVWHBBWW1IclprVWpaZllHZlpuTVVGZEF2blp5UFMKQ1B5STZhNkxmK0V3OURkKy9jWXkyaTJlUkRBd2JPNEgzdEkwL05ML1FQWkw5R1pHQmxTbThqSUtZeVl3YTV2UgozSXRIdXVHNTFXTFFvcUQwWndWNEtXTWFid1RXK01aTW81cXhON1NONVNoTEhaNHN3cmhvdk8wQzdqRT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNlY3VyZSBHbG9iYWwgQ0EgTz1TZWN1cmVUcnVzdCBDb3Jwb3JhdGlvbgojIFN1YmplY3Q6IENOPVNlY3VyZSBHbG9iYWwgQ0EgTz1TZWN1cmVUcnVzdCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU2VjdXJlIEdsb2JhbCBDQSIKIyBTZXJpYWw6IDk3NTE4MzYxNjc3MzEwNTE1NTQyMzIxMTk0ODE0NTY5Nzg1OTcKIyBNRDUgRmluZ2VycHJpbnQ6IGNmOmY0OjI3OjBkOmQ0OmVkOmRjOjY1OjE2OjQ5OjZkOjNkOmRhOmJmOjZlOmRlCiMgU0hBMSBGaW5nZXJwcmludDogM2E6NDQ6NzM6NWE6ZTU6ODE6OTA6MWY6MjQ6ODY6NjE6NDY6MWU6M2I6OWM6YzQ6NWY6ZjU6M2E6MWIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQyOjAwOmY1OjA0OjNhOmM4OjU5OjBlOmJiOjUyOjdkOjIwOjllOmQxOjUwOjMwOjI5OmZiOmNiOmQ0OjFjOmExOmI1OjA2OmVjOjI3OmYxOjVhOmRlOjdkOmFjOjY5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdkRDQ0FxU2dBd0lCQWdJUUIxWWlwT2pVaW9sTjlCUEk4UGpxcFRBTkJna3Foa2lHOXcwQkFRVUZBREJLCk1Rc3dDUVlEVlFRR0V3SlZVekVnTUI0R0ExVUVDaE1YVTJWamRYSmxWSEoxYzNRZ1EyOXljRzl5WVhScGIyNHgKR1RBWEJnTlZCQU1URUZObFkzVnlaU0JIYkc5aVlXd2dRMEV3SGhjTk1EWXhNVEEzTVRrME1qSTRXaGNOTWpreApNak14TVRrMU1qQTJXakJLTVFzd0NRWURWUVFHRXdKVlV6RWdNQjRHQTFVRUNoTVhVMlZqZFhKbFZISjFjM1FnClEyOXljRzl5WVhScGIyNHhHVEFYQmdOVkJBTVRFRk5sWTNWeVpTQkhiRzlpWVd3Z1EwRXdnZ0VpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3ZOUzdZckd4VmFRWng1Uk5vSkxOUDJNd2hSL2p4WURpSgppUVBwdmVwZVJsTUozRnoxV3VqM1JTb0M2ekZoMXlrelRNN0hmQW8zZmcrNk1wamhIWmV2ajhmY3lUaVc4OXNhCi9GSHRhTWJRYnFSOEpOR3VRc2lXVUdNdTRQNTEvcGluWDBrdWxlTTVNMlNPSHFSZmtOSm5QTExaL2tHNVZhY0oKam5JRkhvdmRSSVdDUXRCSndCMWc4TkVYTEpYcjlxWEJrcVBGd3FjSVlBMWdCQkNXZVo0V05PYXB0dm9sUlRuSQpIbVg1ay9XcThWTGNtWmc5cFlZYUREVXora3VsQkFZVkhER0E3Nm9ZYThKNzE5ck8rVE1nMWZXOWFqTXRnUVQ3CnNGelVuS1BpWEIzanFVSjFYbnZVZCs4NVZMckpDaGdiRXBsSkw0aEwvVkJpMFhQbmozcERBZ01CQUFHamdaMHcKZ1pvd0V3WUpLd1lCQkFHQ054UUNCQVllQkFCREFFRXdDd1lEVlIwUEJBUURBZ0dHTUE4R0ExVWRFd0VCL3dRRgpNQU1CQWY4d0hRWURWUjBPQkJZRUZLOUVCTUpCZmtpRDIwNDVBdXpzaEhybXpzbWtNRFFHQTFVZEh3UXRNQ3N3CkthQW5vQ1dHSTJoMGRIQTZMeTlqY213dWMyVmpkWEpsZEhKMWMzUXVZMjl0TDFOSFEwRXVZM0pzTUJBR0NTc0cKQVFRQmdqY1ZBUVFEQWdFQU1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQmpHZ2hBZmFSZVV3MTMySHF1SHcwTApVUllEN3hoOHlPT3ZhbGlURkdDUnNvVGNpRTYrT1lvNjgrYUNpVjBCTjdPckpLUVZEcEkxV2twRVhrNVgrblhPCkgwak9adlE4UUNhU21Hd2I3aVJHREJlelVxWGJwWkdSenpmVGIrY25DRHBPR1I4NnAxaGNGODk1UDR2a3A5TW0KSTUwbUQxaHAvRWQrc3RDTmk1Ty9LVTlEYVhSMlowdlBCNHptQXZlMTRiUkR0VXN0RkovNTNDWU52NlpIZEFiWQppTkU2S1RDRXp0STVnR0licU1kWFNieHFWVkZuRlVxK05RZmsxWFdZTjNrd0ZOc3BuV3pGYWN4SFZhSXc5OHhjCmY4TERtQnhyVGhhQTYzcDRaVVdpQUJxdkRBMVZaRFJJdUpLNThiUlFLZkpQSXgvYWJLd2ZST0hkSTNoUlc4Y1cKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgU3ViamVjdDogQ049Q09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89Q09NT0RPIENBIExpbWl0ZWQKIyBMYWJlbDogIkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDEwNDM1MDUxMzY0ODI0OTIzMjk0MTk5ODUwODk4NTgzNDQ2NDU3MwojIE1ENSBGaW5nZXJwcmludDogNWM6NDg6ZGM6Zjc6NDI6NzI6ZWM6NTY6OTQ6NmQ6MWM6Y2M6NzE6MzU6ODA6NzUKIyBTSEExIEZpbmdlcnByaW50OiA2NjozMTpiZjo5ZTpmNzo0Zjo5ZTpiNjpjOTpkNTphNjowYzpiYTo2YTpiZTpkMTpmNzpiZDplZjo3YgojIFNIQTI1NiBGaW5nZXJwcmludDogMGM6MmM6ZDY6M2Q6Zjc6ODA6NmY6YTM6OTk6ZWQ6ZTg6MDk6MTE6NmI6NTc6NWI6Zjg6Nzk6ODk6ZjA6NjU6MTg6Zjk6ODA6OGM6ODY6MDU6MDM6MTc6OGI6YWY6NjYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVIVENDQXdXZ0F3SUJBZ0lRVG9FdGlvSmw0QXNDN2o0MUFrYmxQVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKZ1RFTE1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0RwpBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEp6QWxCZ05WCkJBTVRIa05QVFU5RVR5QkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MHdOakV5TURFd01EQXcKTURCYUZ3MHlPVEV5TXpFeU16VTVOVGxhTUlHQk1Rc3dDUVlEVlFRR0V3SkhRakViTUJrR0ExVUVDQk1TUjNKbApZWFJsY2lCTllXNWphR1Z6ZEdWeU1SQXdEZ1lEVlFRSEV3ZFRZV3htYjNKa01Sb3dHQVlEVlFRS0V4RkRUMDFQClJFOGdRMEVnVEdsdGFYUmxaREVuTUNVR0ExVUVBeE1lUTA5TlQwUlBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjAKYUc5eWFYUjVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTBFQ0xpM0xqa1J2MwpVY0ViVkFTWTA2bS93ZWFLWFR1SCs3dUl6ZzNqTHo4R2x2Q2lLVkNacnRzN29WZXdkRkZ4emUxQ2tVMUIvcW5JCjJHcUdkMFM3V1dhWFVGNjAxQ3h3Uk0vYU41VkNhVHd3eEhHelV2QWhUYUhZdWpsOEhKNmpKSjN5Z3hhWXFoWjgKUTVzVlc3ZXVOSkgrMUdJbUdFYWFQK3ZCK2ZHUVYrdXNlZzJMMjNJd2FtYlY0RWFqY054bzJmOEVTSWwzM3JYcAorMmR0UWVtOE9iMHkyV0lDOGJHb1BXNDNuT0l2NHRPaUpvdkd1RlZEaU9FalBxWFNKRGxxUjZzQTFLR3pxU1grCkRUK25IYnJUVWNFTHBOcXNPTzlWVUNRRlpVYVRORTh0amEzRzFDRVowbzdLQldGeEIzTkg1WW9aRXIwRVRjNU8KbktWSXJMc205d0lEQVFBQm80R09NSUdMTUIwR0ExVWREZ1FXQkJRTFdPV0x4a3dWTjZSQXFUQ3BJYjVITmxwVwovekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QkpCZ05WSFI4RVFqQkFNRDZnClBLQTZoamhvZEhSd09pOHZZM0pzTG1OdmJXOWtiMk5oTG1OdmJTOURUMDFQUkU5RFpYSjBhV1pwWTJGMGFXOXUKUVhWMGFHOXlhWFI1TG1OeWJEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFQcGllbS9ZYjZkYzV0M2l1SFhJWQpTZE9INUVPQzZ6L0pxdldvdGU5VmZDRlNaZm5WRGVGczlENk1rM09STGdMRVRnZHhiOENQT0dFSXFCNkJDc0F2CklDOUJpNUhjU0VXODhjYmV1blpyTThnQUxURkdUTzNubmMrSWxQOHp3RmJvSklZbXVOZzRPTjhxYTkwU3pNYy8KUnhkTW9zSUdsZ25XMi80L1BFWkIzMWppVmc4OE84RWNrelhaT0ZLczdzanNMakJPbERXMEpCOUxlR25hOGdJNAp6SlZTay9Cd0pWbWNJR2ZFN3ZtTFYySDBrblo5UDRTTlZiZm81YXpWOGZVWlZxWmErNUFjcjVQcjVSelVaNWRkCkJBNitDNE9tRjRPNU1CS2d4VE1WQmJrTis4Y0ZkdVBZU28zOE5CZWp4aUVvdmpCRk1SN0hlTDVZWVRpc08rSUIKWlE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049TmV0d29yayBTb2x1dGlvbnMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IE89TmV0d29yayBTb2x1dGlvbnMgTC5MLkMuCiMgU3ViamVjdDogQ049TmV0d29yayBTb2x1dGlvbnMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IE89TmV0d29yayBTb2x1dGlvbnMgTC5MLkMuCiMgTGFiZWw6ICJOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkiCiMgU2VyaWFsOiAxMTY2OTc5MTUxNTI5Mzc0OTc0OTA0Mzc1NTYzODY4MTI0ODc5MDQKIyBNRDUgRmluZ2VycHJpbnQ6IGQzOmYzOmE2OjE2OmMwOmZhOjZiOjFkOjU5OmIxOjJkOjk2OjRkOjBlOjExOjJlCiMgU0hBMSBGaW5nZXJwcmludDogNzQ6Zjg6YTM6YzM6ZWY6ZTc6YjM6OTA6MDY6NGI6ODM6OTA6M2M6MjE6NjQ6NjA6MjA6ZTU6ZGY6Y2UKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE1OmYwOmJhOjAwOmEzOmFjOjdhOmYzOmFjOjg4OjRjOjA3OjJiOjEwOjExOmEwOjc3OmJkOjc3OmMwOjk3OmY0OjAxOjY0OmIyOmY4OjU5OjhhOmJkOjgzOjg2OjBjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlENWpDQ0FzNmdBd0lCQWdJUVY4c3piOEpjRnVaSEZoZmprREZvNERBTkJna3Foa2lHOXcwQkFRVUZBREJpCk1Rc3dDUVlEVlFRR0V3SlZVekVoTUI4R0ExVUVDaE1ZVG1WMGQyOXlheUJUYjJ4MWRHbHZibk1nVEM1TUxrTXUKTVRBd0xnWURWUVFERXlkT1pYUjNiM0pySUZOdmJIVjBhVzl1Y3lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcApkSGt3SGhjTk1EWXhNakF4TURBd01EQXdXaGNOTWpreE1qTXhNak0xT1RVNVdqQmlNUXN3Q1FZRFZRUUdFd0pWClV6RWhNQjhHQTFVRUNoTVlUbVYwZDI5eWF5QlRiMngxZEdsdmJuTWdUQzVNTGtNdU1UQXdMZ1lEVlFRREV5ZE8KWlhSM2IzSnJJRk52YkhWMGFXOXVjeUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrd2dnRWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEa3ZINlNNRzNHMkk0ckM3eEd6dUFubHQ3ZStmb1Mwend6CmM3TUVMN3h4ak9XZnRpSmdQbDlkemduL2dnd2JtbEZRR2lhSjNkVmhYUm5jRWc4dENxSkRYUmZRTkpJZzZuUFAKT0N3R0pnbDZjdmY2VURMNHdwUFRhYUlqemtHeHpPVFZIemJSaWpyNGpHUGlGRmxwN1EzVGYydm91QVBsVDJybAptR05wU0FXK0x2OHp0dW1YV1duNFp4bXVrMkdXUkJYVGNyQS92R3A5N0VoL2pjT3JxbkVyVTJsQlV6UzFzTG5GCkJnckVzRVgxUVYxdWlVVjdQVHNtakhUQzVkTFJmYklSMVB0WU1pS2FnTW5jL1F6cGYxNERsODQ3QUJTSEozQTQKcVk1dXN5ZDJtRkhnQmVNaHF4clZoU0k4S2JXYUZzV0FxUFM3YXpDUEwwWUNvckVNSXVEVEFnTUJBQUdqZ1pjdwpnWlF3SFFZRFZSME9CQllFRkNFd3lmc0ExMDZZMm9lcUt0Q25MckZBTWFkTU1BNEdBMVVkRHdFQi93UUVBd0lCCkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01GSUdBMVVkSHdSTE1Fa3dSNkJGb0VPR1FXaDBkSEE2THk5amNtd3UKYm1WMGMyOXNjM05zTG1OdmJTOU9aWFIzYjNKclUyOXNkWFJwYjI1elEyVnlkR2xtYVdOaGRHVkJkWFJvYjNKcApkSGt1WTNKc01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQzdya3ZudDFmcmY2b3R0M05IaFdyQjVLVWQ1T2M4CjZmUlpaWGUxZWx0YWpTVTI0SHFYTGpqQVYyQ0RtQWFEbjdsMmVtNVE0THFJTFB4RnpCaXdtWlZSRHV3ZHVJai8KaDFBY2dzTGo0REtBdjZBTFI4akRNZStaWnpLQVR4Y2hlUXhwWE41ZU5LNEN0U2JxVU45L0dHVXN5ZkpqNGFrSAovbnh4SDJzekpHb2VCZmNGYU1CcUVzc3VYbUhMcmlqVGZzSzBacEVtWHp3dUpGL0xXQS9yS095dkVaYnozSHR2CndLZUk4bE4zczJCZXJxNG8yalVzYnpSRjB5YmgzdXhiVHlkckZueTlSQVFZZ3JPSmVSY1FjVDE2b2haTzlRSE4KcEd4bGFLRkpkbHhEeWRpOE5tZHNwWlMxMU15NXZXbzFWaUhlMk1Qcis4dWtZRXl3VmFDZ2UxZXkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIFN1YmplY3Q6IENOPUNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIExhYmVsOiAiQ09NT0RPIEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDQxNTc4MjgzODY3MDg2NjkyNjM4MjU2OTIxNTg5NzA3OTM4MDkwCiMgTUQ1IEZpbmdlcnByaW50OiA3Yzo2MjpmZjo3NDo5ZDozMTo1Mzo1ZTo2ODo0YTpkNTo3ODphYToxZTpiZjoyMwojIFNIQTEgRmluZ2VycHJpbnQ6IDlmOjc0OjRlOjlmOjJiOjRkOmJhOmVjOjBmOjMxOjJjOjUwOmI2OjU2OjNiOjhlOjJkOjkzOmMzOjExCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNzo5Mzo5Mjo3YTowNjoxNDo1NDo5Nzo4OTphZDpjZToyZjo4ZjozNDpmNzpmMDpiNjo2ZDowZjozYTplMzphMzpiODo0ZDoyMTplYzoxNTpkYjpiYTo0ZjphZDpjNwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2lUQ0NBZytnQXdJQkFnSVFIMGV2cW1JQWNGQlVUQUdlbTJPWktqQUtCZ2dxaGtqT1BRUURBekNCaFRFTApNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFCkJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRUNoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVkJBTVQKSWtOUFRVOUVUeUJGUTBNZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EZ3dNekEyTURBdwpNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaFRFTE1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5ClpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2hNUlEwOU4KVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVkJBTVRJa05QVFU5RVR5QkZRME1nUTJWeWRHbG1hV05oZEdsdgpiaUJCZFhSb2IzSnBkSGt3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUURSM3N2ZGNtQ0ZZWDdkZVNSCkZ0U3JZcG4xUGxJTEJzNUJBSCtYNFFva1BCMEJCTzQ5MG8wSmx3emdkZVQ2KzNlS0t2VURZRXMyaXhZakZxMEoKY2ZSSzlDaFF0UDZJSEc0L2JDOHZDVmxicFZzTE01bml3ejJKK1dvczc3TFRCdW1qUWpCQU1CMEdBMVVkRGdRVwpCQlIxY2FjWlNCbThuWjNxUVVmZmxNUklkNW5UZVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBS0JnZ3Foa2pPUFFRREF3Tm9BREJsQWpFQTd3TmJlcXkzZUFweXQ0amYvN1ZHRkFrSytxRG0KZlFqR0dvZTlHS2h6dlNiS1lBeWR6cG1mejF3UE1PRytGREhxQWpBVTlKTThTYWN6ZXBCR1I3TmpmUk9iVHJkdgpHRGVBVS83ZElPQTFtamJSeHdHNTV0emQ4LzhkTERvV1Y5bVNPZFk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1PSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdBIENBIE89V0lTZUtleSBPVT1Db3B5cmlnaHQgKGMpIDIwMDUvT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZAojIFN1YmplY3Q6IENOPU9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0EgQ0EgTz1XSVNlS2V5IE9VPUNvcHlyaWdodCAoYykgMjAwNS9PSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkCiMgTGFiZWw6ICJPSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdBIENBIgojIFNlcmlhbDogODY3MTg4Nzc4NzExMzMxNTkwOTAwODA1NTU5MTE4MjM1NDgzMTQKIyBNRDUgRmluZ2VycHJpbnQ6IGJjOjZjOjUxOjMzOmE3OmU5OmQzOjY2OjYzOjU0OjE1OjcyOjFiOjIxOjkyOjkzCiMgU0hBMSBGaW5nZXJwcmludDogNTk6MjI6YTE6ZTE6NWE6ZWE6MTY6MzU6MjE6Zjg6OTg6Mzk6NmE6NDY6NDY6YjA6NDQ6MWI6MGY6YTkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQxOmM5OjIzOjg2OjZhOmI0OmNhOmQ2OmI3OmFkOjU3OjgwOjgxOjU4OjJlOjAyOjA3Ojk3OmE2OmNiOmRmOjRmOmZmOjc4OmNlOjgzOjk2OmIzOjg5OjM3OmQ3OmY1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEOFRDQ0F0bWdBd0lCQWdJUVFUMXl4L1JySDRGRGZmSFNLRlRmbWpBTkJna3Foa2lHOXcwQkFRVUZBRENCCmlqRUxNQWtHQTFVRUJoTUNRMGd4RURBT0JnTlZCQW9UQjFkSlUyVkxaWGt4R3pBWkJnTlZCQXNURWtOdmNIbHkKYVdkb2RDQW9ZeWtnTWpBd05URWlNQ0FHQTFVRUN4TVpUMGxUVkVVZ1JtOTFibVJoZEdsdmJpQkZibVJ2Y25ObApaREVvTUNZR0ExVUVBeE1mVDBsVFZFVWdWMGxUWlV0bGVTQkhiRzlpWVd3Z1VtOXZkQ0JIUVNCRFFUQWVGdzB3Ck5URXlNVEV4TmpBek5EUmFGdzB6TnpFeU1URXhOakE1TlRGYU1JR0tNUXN3Q1FZRFZRUUdFd0pEU0RFUU1BNEcKQTFVRUNoTUhWMGxUWlV0bGVURWJNQmtHQTFVRUN4TVNRMjl3ZVhKcFoyaDBJQ2hqS1NBeU1EQTFNU0l3SUFZRApWUVFMRXhsUFNWTlVSU0JHYjNWdVpHRjBhVzl1SUVWdVpHOXljMlZrTVNnd0pnWURWUVFERXg5UFNWTlVSU0JYClNWTmxTMlY1SUVkc2IySmhiQ0JTYjI5MElFZEJJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEEKTUlJQkNnS0NBUUVBeTArekFKczlOdDM1MFVscWF4QkpIK3pZSzdMRytES0JLVU9WVEpvWkl5RVZSZDdqeUJ4UgpWVnV1aytnMy95dHI2ZFRxdmlyZHFGRXIxMmJEWVZ4Z0FzajF6bko3TzdqeVRtVUltczJrYWhuQkFidHpwdGYyCnc5M052S1NMdFpsaHVBR2lvOVJOMUFVOWthMzR0QWh4Wks5dzhSeHJmdmJEZDUwa2MzdmtESXpoMlRiaG1Zc0YKbVF2dFJURUp5c0lBMi9keW9KYXFsWWZRanNlMllYTU5kbWFNM0J1MFk2S2ZmNU1UTVBHaEo5dloveXhWaUpHZwo0RThIc0NoV2pCZ2JsMFNPaWQzZ0YyN25LdStQT1FveGhJTFlRQlJKTG5wQjVLZis0MlRNd1ZseFN5d2hwMXQ5CjRCM1JMb0didzlobzk3MldHNnh3c1JZVUM5dGd1U1lCQlFJREFRQUJvMUV3VHpBTEJnTlZIUThFQkFNQ0FZWXcKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVc3dOK3JqYThzSG5SM0pRbXRoRytJYkpwaHBRdwpFQVlKS3dZQkJBR0NOeFVCQkFNQ0FRQXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRXVoL3d1SGJyUDV3VU94ClNQTW93QjB1eVFsQitwUUFIS1NrcTBsUGp6MGU3MDF2dmJ5azl2SW1NTWtReWgySSszUVpINFZGdmJCc1VmazIKZnR2MVRESTZRVTliUjgvb0N5MjJ4Qm1kZE1WSHhqdHFENndVMnp6MGM1eXBCZDhBM0hSNCt2ZzFZRmtDRXhoOAp2UHROc0NCdFE3dGdNSHBuTTF6Rm1kSDRMVGxTYy91TXFwY2xYSExaQ0I2clRqempnVEdmQTZiN3dQNHBpRlhhCmhOVlFBN2JpaEtPbU5xb1JPZ0hoR0V2V1JHaXpQZmxUZElTelJwRkdsZ0MzZ0N5MjRlTVE0dHVpNXlpUEFaWmkKRmo0QTR4eWxOb0VZb2t4U2RzQVJvMjdtSGJyaldyNDJVOFUrZFkrR2FTbFlVN1djdTIrZlhNVVk3TjB2NFpqSgovTDdmQ2cwPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2VydGlnbmEgTz1EaGlteW90aXMKIyBTdWJqZWN0OiBDTj1DZXJ0aWduYSBPPURoaW15b3RpcwojIExhYmVsOiAiQ2VydGlnbmEiCiMgU2VyaWFsOiAxODM2NDgwMjk3NDIwOTM2MjE3NQojIE1ENSBGaW5nZXJwcmludDogYWI6NTc6YTY6NWI6N2Q6NDI6ODI6MTk6YjU6ZDg6NTg6MjY6Mjg6NWU6ZmQ6ZmYKIyBTSEExIEZpbmdlcnByaW50OiBiMToyZToxMzo2Mzo0NTo4NjphNDo2ZjoxYTpiMjo2MDo2ODozNzo1ODoyZDpjNDphYzpmZDo5NDo5NwojIFNIQTI1NiBGaW5nZXJwcmludDogZTM6YjY6YTI6ZGI6MmU6ZDc6Y2U6NDg6ODQ6MmY6N2E6YzU6MzI6NDE6Yzc6Yjc6MWQ6NTQ6MTQ6NGI6ZmI6NDA6YzE6MWY6M2Y6MWQ6MGI6NDI6ZjU6ZWU6YTE6MmQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxRENDQXBDZ0F3SUJBZ0lKQVA3YzR3RVB5VWovTUEwR0NTcUdTSWIzRFFFQkJRVUFNRFF4Q3pBSkJnTlYKQkFZVEFrWlNNUkl3RUFZRFZRUUtEQWxFYUdsdGVXOTBhWE14RVRBUEJnTlZCQU1NQ0VObGNuUnBaMjVoTUI0WApEVEEzTURZeU9URTFNVE13TlZvWERUSTNNRFl5T1RFMU1UTXdOVm93TkRFTE1Ba0dBMVVFQmhNQ1JsSXhFakFRCkJnTlZCQW9NQ1VSb2FXMTViM1JwY3pFUk1BOEdBMVVFQXd3SVEyVnlkR2xuYm1Fd2dnRWlNQTBHQ1NxR1NJYjMKRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFESWFQSEoxdGF6TkhVbWdoN3N0TDdxWE9FbTdSRkhZZUdpZkJaNApRQ0hrWUo1YXlHUGh4TEdXa3Y4WWJXa2o0U3RpOTkzaU5pK1JCN2xJenc3c2ViWXM1elJMY0FnbG96eUhHeG55CmdRY1BPSkFaMHhIK2hyVHkwVjRlSHBiTmdHek9PekdUdHZLZzBLbVZFbjJsbXN4cnlJUldpak9wNXlJVlV4YncKekJmc1YxL3BvZ3FZQ2Q3alg1eHYzRWpqaFFzVldxYTZuNnhJNHdteTkvUXkzbDQwdmh4NFhVSmJ6ZzRpajAyUQoxMzB5R0xNTExHcS9qajhVRVlrZ0RuY1V0VDJVQ0lmM0pSN1ZzbUFBN0c4cUtDVnVLajRZWXhjbFB6NUVJQmIyCkpzZ2xyZ1ZLdE9kakxQT01GbE4rWFBzUkdnakJSbUtmSXJqeHdvMXAzUG82V0FiZkFnTUJBQUdqZ2J3d2dia3cKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVR3UzK1FUbVF0Q1JadmdIeVV0VkY5bG81M0JFdwpaQVlEVlIwakJGMHdXNEFVR3UzK1FUbVF0Q1JadmdIeVV0VkY5bG81M0JHaE9LUTJNRFF4Q3pBSkJnTlZCQVlUCkFrWlNNUkl3RUFZRFZRUUtEQWxFYUdsdGVXOTBhWE14RVRBUEJnTlZCQU1NQ0VObGNuUnBaMjVoZ2drQS90emoKQVEvSlNQOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CRUdDV0NHU0FHRytFSUJBUVFFQXdJQUJ6QU5CZ2txaGtpRwo5dzBCQVFVRkFBT0NBUUVBaFFNZWtuSDJRcS9obzJHZTYvUEFEL0tsMU5xVjV0YSthRFk5Zm00ZlRJcnYwUThoCmJWNmxVbVBPRXZqdkt0cHY2emYrRXdMSHl6cytJbXZhWVM1LzFISTkzVERoSGt4QUdZd1AxNXpSZ3pCN21GbmMKZmNhNURDbE1vVE9pNjJjNlpZVFRsdUx0ZGtWd2o3VXIzdmtqMWtsdVBCUzF4cDgxSGxEUXdZOXFjRVFDWXN1dQpIV2hCcDZwWDZGT3FCOUlHOXRVVUJndVJBM1VzYkhLMVlaV2FEWXU1RGVmMTMxVE4zdWJZMWdrSWwyUGx3UzZ3CnQwUW13Q2JBcjFVd25qdlZOaW9aQlBSY0h2L1BMTGYvMFAySFFCSFZFU083U01BaHFhUW9MZjBWK0xCT0svUXcKV3lIOEVaRTB2a0h2ZTUyWGRmK1hsY0NXV0MvcXUwYlh1K1RaTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIgTz1EZXV0c2NoZSBUZWxla29tIEFHIE9VPVQtVGVsZVNlYyBUcnVzdCBDZW50ZXIKIyBTdWJqZWN0OiBDTj1EZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EgMiBPPURldXRzY2hlIFRlbGVrb20gQUcgT1U9VC1UZWxlU2VjIFRydXN0IENlbnRlcgojIExhYmVsOiAiRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIiCiMgU2VyaWFsOiAzOAojIE1ENSBGaW5nZXJwcmludDogNzQ6MDE6NGE6OTE6YjE6MDg6YzQ6NTg6Y2U6NDc6Y2Q6ZjA6ZGQ6MTE6NTM6MDgKIyBTSEExIEZpbmdlcnByaW50OiA4NTphNDowODpjMDo5YzoxOTozZTo1ZDo1MTo1ODo3ZDpjZDpkNjoxMzozMDpmZDo4YzpkZTozNzpiZgojIFNIQTI1NiBGaW5nZXJwcmludDogYjY6MTk6MWE6NTA6ZDA6YzM6OTc6N2Y6N2Q6YTk6OWI6Y2Q6YWE6Yzg6NmE6MjI6N2Q6YWU6Yjk6Njc6OWU6Yzc6MGI6YTM6YjA6Yzk6ZDk6MjI6NzE6YzE6NzA6ZDMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURuekNDQW9lZ0F3SUJBZ0lCSmpBTkJna3Foa2lHOXcwQkFRVUZBREJ4TVFzd0NRWURWUVFHRXdKRVJURWMKTUJvR0ExVUVDaE1UUkdWMWRITmphR1VnVkdWc1pXdHZiU0JCUnpFZk1CMEdBMVVFQ3hNV1ZDMVVaV3hsVTJWagpJRlJ5ZFhOMElFTmxiblJsY2pFak1DRUdBMVVFQXhNYVJHVjFkSE5qYUdVZ1ZHVnNaV3R2YlNCU2IyOTBJRU5CCklESXdIaGNOT1Rrd056QTVNVEl4TVRBd1doY05NVGt3TnpBNU1qTTFPVEF3V2pCeE1Rc3dDUVlEVlFRR0V3SkUKUlRFY01Cb0dBMVVFQ2hNVFJHVjFkSE5qYUdVZ1ZHVnNaV3R2YlNCQlJ6RWZNQjBHQTFVRUN4TVdWQzFVWld4bApVMlZqSUZSeWRYTjBJRU5sYm5SbGNqRWpNQ0VHQTFVRUF4TWFSR1YxZEhOamFHVWdWR1ZzWld0dmJTQlNiMjkwCklFTkJJREl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3JDNk0xNElzcEZMRVUKaGE4OEVPUTVielZkU3E3ZDZtR05sVW4wYjJTakdtQm1wS2xBSW9UWjFLWGxlSk1PYUFHdHVVMWNPczdUdUtoQwpRTi9QbzdxQ1dXcVNHNndjbXRvSUt5VW4rV2tqUi9IZzZ5eDZtL1VUQXRCK05IekNuandBV2F2MTJnejFNandyCnJGRGExc1BlZzVUS3FBeVpNZzRJU0ZaYmF2dmE0VmhZQVVsZmNrRThGUVlCamwydHFyaVR0TTJlNjZmb2FpMVMKTk5zNjcxeDFVZHJiOHpINTduR1lNc1JVRlVRTStadFY3YTNmR0FpZ280YUtTZTVUQlk4WlROWGVXSG1iMG1vYwpRcXZGMWFmUGFBK1c1T0ZobUhaaHlKRjgxajRBNHBGUWgrR2RDdWF0bDlJZHhqcDl5N3phQXpUVmpsc0I5V29ICnR4YTJia3AvQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJReHcza2J1dlZUMXhmZ2lYb3RGMndLc3l1ZE16QVAKQmdOVkhSTUVDREFHQVFIL0FnRUZNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQwpBUUVBbEdSWnJUbGs1eW5yRS81YXc0c1RWOGdFSlBCMGQ4Qmc0MmY3NlltbWc3K1dnbnh1MU1NOTc1NkFicnNwCnRKaDZzVHRVNnprWFIzNGFqZ3Y4SHpGWk1RU3l6aGZ6TE1kaU5sWGlJdGlKVmJTWVNLcGsrdFljTnRoRWVGcGEKSXpwWGwvVjZNRSt1bjJwTVN5dU9vQVBqUHVDcDFOSjcwck9vNG5JOHJaNy9nRm5rbTBXMDlqdXd6VGtabURMbAo2aUZoa09ReElZNDBzZmN2TlVxRkVOcm5pamNodmxsajRQS0ZpREZUMUZRVWhYQjU5QzRHZHlkMUx4KzRpdm4rCnhicllOdVNEN09kbHQ3OWpXdk5HcjRHVU45UkJqTllqMWg3UDlXZ2JSR09pV3Jxbk5WbWg1WEFGbXc0alY1bVUKQ20yNk9XTW9ocEx6R0lUWSs5SFBCVlprVnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q3liZXJ0cnVzdCBHbG9iYWwgUm9vdCBPPUN5YmVydHJ1c3QsIEluYwojIFN1YmplY3Q6IENOPUN5YmVydHJ1c3QgR2xvYmFsIFJvb3QgTz1DeWJlcnRydXN0LCBJbmMKIyBMYWJlbDogIkN5YmVydHJ1c3QgR2xvYmFsIFJvb3QiCiMgU2VyaWFsOiA0ODM1NzAzMjc4NDU5NjgyODc3NDg0MzYwCiMgTUQ1IEZpbmdlcnByaW50OiA3MjplNDo0YTo4NzplMzo2OTo0MDo4MDo3NzplYTpiYzplMzpmNDpmZjpmMDplMQojIFNIQTEgRmluZ2VycHJpbnQ6IDVmOjQzOmU1OmIxOmJmOmY4Ojc4OjhjOmFjOjFjOmM3OmNhOjRhOjlhOmM2OjIyOjJiOmNjOjM0OmM2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5NjowYTpkZjowMDo2MzplOTo2Mzo1Njo3NTowYzoyOTo2NTpkZDowYTowODo2NzpkYTowYjo5YzpiZDo2ZTo3Nzo3MTo0YTplYTpmYjoyMzo0OTphYjozOTozZDphMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRG9UQ0NBb21nQXdJQkFnSUxCQUFBQUFBQkQ0V3FMVWd3RFFZSktvWklodmNOQVFFRkJRQXdPekVZTUJZRwpBMVVFQ2hNUFEzbGlaWEowY25WemRDd2dTVzVqTVI4d0hRWURWUVFERXhaRGVXSmxjblJ5ZFhOMElFZHNiMkpoCmJDQlNiMjkwTUI0WERUQTJNVEl4TlRBNE1EQXdNRm9YRFRJeE1USXhOVEE0TURBd01Gb3dPekVZTUJZR0ExVUUKQ2hNUFEzbGlaWEowY25WemRDd2dTVzVqTVI4d0hRWURWUVFERXhaRGVXSmxjblJ5ZFhOMElFZHNiMkpoYkNCUwpiMjkwTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUErTWk4dlJSUVpoUC84Tk41CjdDUHl0eHJIam9YeEVuT21HYW9RMjV5aVpYUmFkejVSZlZiMjNDTzIxTzFmV0xFM1RkVkpEbTcxYW9mVzBvelMKSjhiaS96YWZtR1dnRTA3R0ttU2IxWkFTenhRRzlEdmoxQ2krNkE3NHEwNUlsRzJPbFRFUVhPMmlMYjNWT20yeQpITHRnd0VaTEFmVkpybjVHaXRCMGphRU1Bczd1L09lUHVHdG04MzlFQUw5bUpSUXIzUkF3SFFlV1AwMzJhN2lQCnQzc01wVGpyM2tmYjFWMDUvSWluODljcWRQSG9XcUk3bjFDNnBveEZOY0pRWlpYY1k0THYzYjkzVFp4aXlXTnoKRnRBcEQwbXBTUEN6cXJkc3hhY3dPVUJkcnNUaVhTWlQ4TTRjSXdoaHFKUVp1Z1JpUU93Zk9IQjNFZ1p4cHpBWQpYU1VucFFJREFRQUJvNEdsTUlHaU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvCk1CMEdBMVVkRGdRV0JCUzJDSHNOZXN5c0lFeUdWakplejZ0dWhTMXdWekEvQmdOVkhSOEVPREEyTURTZ01xQXcKaGk1b2RIUndPaTh2ZDNkM01pNXdkV0pzYVdNdGRISjFjM1F1WTI5dEwyTnliQzlqZEM5amRISnZiM1F1WTNKcwpNQjhHQTFVZEl3UVlNQmFBRkxZSWV3MTZ6S3dnVElaV01sN1BxMjZGTFhCWE1BMEdDU3FHU0liM0RRRUJCUVVBCkE0SUJBUUJXN3dvam9GUk9sWmZKK0luYVJjSFVvd0FsOUI4VHE3ZWpoVmhwd2pDdDJCV0tMZVBKellGYStITWoKV3FkOEJmUDlJanNPMFFiRTJ6Wk1jd1NPNWJBaTVNWHpMcVhaSStPNFRrb2dwMjRDSko4aVlHZDdpeDF5Q2NVeApYT2w1bjRCSFBhMmhDd2NVUFVmL0Eya2FEQXRFNTJNbHAzK3l5YmgyaE8wajluMEhxMFYrMDkrenYrbUt0czJvCm9tY3JVdFczWmZBNVRHT2drWG1UVWc5VTNZTzduOUdQcDFOenc4di9NT3g4QkxqWVJCK1RYM0VKSXJkdVB1b2MKQTA2ZEdpQmgrNEUzN0Y3OENrV3IxK2NYVmRDZzZtQ2JwdmJqakZzcHdnWmdGSjB0bDB5cGt4V2RZY1FCWDBqVwpXTDFXTVJKT0VjZ2g0TE1Sa1dYYnRLYUlPTTVWCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPUNodW5naHdhIFRlbGVjb20gQ28uLCBMdGQuIE9VPWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IE89Q2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4gT1U9ZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJlUEtJIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAyODk1NjA4ODY4MjczNTE4OTY1NTAzMDUyOTA1NzM1Mjc2MDQ3NwojIE1ENSBGaW5nZXJwcmludDogMWI6MmU6MDA6Y2E6MjY6MDY6OTA6M2Q6YWQ6ZmU6NmY6MTU6Njg6ZDM6NmI6YjMKIyBTSEExIEZpbmdlcnByaW50OiA2Nzo2NTowZDpmMTo3ZTo4ZTo3ZTo1Yjo4Mjo0MDphNDpmNDo1Njo0YjpjZjplMjozZDo2OTpjNjpmMAojIFNIQTI1NiBGaW5nZXJwcmludDogYzA6YTY6ZjQ6ZGM6NjM6YTI6NGI6ZmQ6Y2Y6NTQ6ZWY6MmE6NmE6MDg6MmE6MGE6NzI6ZGU6MzU6ODA6M2U6MmY6ZjU6ZmY6NTI6N2E6ZTU6ZDg6NzI6MDY6ZGY6ZDUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZzRENDQTVpZ0F3SUJBZ0lRRmNpOVpVZGNyN2lYQUY3a0J0SzhuVEFOQmdrcWhraUc5dzBCQVFVRkFEQmUKTVFzd0NRWURWUVFHRXdKVVZ6RWpNQ0VHQTFVRUNnd2FRMmgxYm1kb2QyRWdWR1ZzWldOdmJTQkRieTRzSUV4MApaQzR4S2pBb0JnTlZCQXNNSVdWUVMwa2dVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlCkZ3MHdOREV5TWpBd01qTXhNamRhRncwek5ERXlNakF3TWpNeE1qZGFNRjR4Q3pBSkJnTlZCQVlUQWxSWE1TTXcKSVFZRFZRUUtEQnBEYUhWdVoyaDNZU0JVWld4bFkyOXRJRU52TGl3Z1RIUmtMakVxTUNnR0ExVUVDd3doWlZCTApTU0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGCkFBT0NBZzhBTUlJQ0NnS0NBZ0VBNFNVUDdvM2JpRE4xWjgydEgzMDZUbTJkMHk4VTgyTjB5d0VoYWpmcWhGQUgKU3laYkNVTnNJWjVxeU5VRDlXQnBqOHp3SXVRZjUvZHFJakczTEJYeTRQNEFha1AvaDJYR3RSckJwMHh0SW5BaAppakh5bDNTSkNSSW1ISjdLMlJLaWxUemE2V2UvQ0tCazQ5WkN0MFh2bC9UMjlkZTFTaFVDV0gyWVdFdGd2TTNYCkRab1RNMVBSWWZsNjFkZDRzNW96OXdDR3poMU5sRGl2cU94NFVYQ0tYQkNEVVNIM0VUMDBobDdsU00yWGdZSTEKVEJuc1pmWnJ4UVdoN2tjVDFyTWhKNVFRQ3Rra083cStSQk5HTUQrWFBOalgxMnJ1T3pqaks5U1hEcmtiNXdkSgpmemNxK1hkNHoxVHRXMGFkbzRBT2tVUEIxbHRmRkxxZnBvMGtSMEJadjNJNHNqWnNOLytaMFYwT1dRcXJhZmZBCnNnUkZlbFFBcnI1VDlyWG40Zmc4b3pIU3FmNGhVbVRGcG1md2RRY0dsQlNCVmNZbjVBR1BGOEZxY2RlK1MvdVUKV0gxK0VUT3hRdmRpYkJqV3p3bG9QbjlzOWg2UFlxMmxZOXNKcHg4aVFrRWViNW1LUHRmNVAwQjZlYkNsQVpMUwpuVDBJRmFVUUFTMnpNbmFvbFEyemVwcjdCeEI0RVcvaGo4ZTZEeVVhZENybEhKaEJtZDhoaCtpVkJtb0tzMnBICmRtWDJPcytQWWhjWmV3b296UnJTZ3g0aHh5eS92djloYUxkbkc3dDRUWTNPWitYa3dZNjNJMmJpblpCMU5KaXAKTml1S21wUzVuZXpNaXJINEpZbGNXcll2akI5dGVTU25VbWpEaERYaVpvMWpEaVZOMVJteTVuazNweUtkVkRFQwpBd0VBQWFOcU1HZ3dIUVlEVlIwT0JCWUVGQjRNOTdabjh1R1NKZ2xGd0ZVNUxuYy9Ra3FpTUF3R0ExVWRFd1FGCk1BTUJBZjh3T1FZRVp5b0hBQVF4TUM4d0xRSUJBREFKQmdVckRnTUNHZ1VBTUFjR0JXY3FBd0FBQkJSRnNNTEgKQ2xaODdsdDRESlg1R0ZQQnBoellFREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBZ0VBQ2JPRFUxa0JQcFZKdWZHQgp1dmwySUNPMUoyQjAxR3FaTkY1c0FGUFpuL0ttc1NRSFJHb3F4cVdPZUJMb1I5bFlHeE1xWG5tYm53b3FaNllsClB3WnBWblBEaW1aSSt5bUJWM1FHeXB6cUtPZzRaeVlyOGRXMVAyV1QrRFpkam8yTlFDQ0hHZXJ2SjhBOXREa1AKSlh0b1VIUlZuQXhaZlZvOVFaUWxVZ2pnUnl3Vk1SblZ2d2RWeHJzU3RaZjBYNE9GdW5IQjJXeUJFWFlLQ3JDLwpncGYzNmozNit1d3RxU2lVTzFiZDBsRXVyc0M5Q0JXTWQxSTBsdGFick5NZGptRVBOWHVicmpscEMySmdRQ0EyCmo2LzdOdTR0Q0VvZHVMK2JYUGpxcFJ1Z2M2YlkrRzdnTXdSZmFLb25oKzNad1pDYzdiM2phald2WTkrckdObTYKNXVsSzZsQ0tEMkdUSHVJdEdlSXdsRFdTWFE2MkI2OFpnSTlIa0ZGTExrM2RoZUxTQ2xJS0Y1cjhHckJRQXVVQgpvMk0zSVV4RXhKdFJtUkVPYzV3R2oxUXVweWhlUkRtSFZpMDN2WVZFbE9FTVN5eWN3NUtGTkdITEQ3aWJTa05TCi9qUTZmYmpwS2R4MnFjZ3crQlJ4Z01ZZU5raDBJa0ZjaDRMb0dIR0xRWWxFNTM1WVc2aTRqUlBwcDJ6RFIrMnoKR3AxaXJvMkM2cFNlM1ZrUXc2M2Q0azNqTWRYSDdPanlzUDZTSGhZS0d2elo4L2dudHNtK0hiUnNaSkIvOU9URQpXOWMzcmtJTzNhUWFiM3lJVk1VV2J1RjZhQzc0T3I4TnBEeUpPM2luVG1PREJDRUlaNDN5Z2tuUVcvMnh6UStECmhOUStJSVgzU2owcm5QMHFDZ2xONm9INEVadz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89Y2VydFNJR04gT1U9Y2VydFNJR04gUk9PVCBDQQojIFN1YmplY3Q6IE89Y2VydFNJR04gT1U9Y2VydFNJR04gUk9PVCBDQQojIExhYmVsOiAiY2VydFNJR04gUk9PVCBDQSIKIyBTZXJpYWw6IDM1MjEwMjI3MjQ5MTU0CiMgTUQ1IEZpbmdlcnByaW50OiAxODo5ODpjMDpkNjplOTozYTpmYzpmOTpiMDpmNTowYzpmNzo0YjowMTo0NDoxNwojIFNIQTEgRmluZ2VycHJpbnQ6IGZhOmI3OmVlOjM2Ojk3OjI2OjYyOmZiOjJkOmIwOjJhOmY2OmJmOjAzOmZkOmU4OjdjOjRiOjJmOjliCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlYTphOTo2MjpjNDpmYTo0YTo2YjphZjplYjplNDoxNToxOTo2ZDozNToxYzpjZDo4ODo4ZDo0Zjo1MzpmMzpmYTo4YTplNjpkNzpjNDo2NjphOTo0ZTo2MDo0MjpiYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRE9EQ0NBaUNnQXdJQkFnSUdJQVlGRm5BQ01BMEdDU3FHU0liM0RRRUJCUVVBTURzeEN6QUpCZ05WQkFZVApBbEpQTVJFd0R3WURWUVFLRXdoalpYSjBVMGxIVGpFWk1CY0dBMVVFQ3hNUVkyVnlkRk5KUjA0Z1VrOVBWQ0JEClFUQWVGdzB3TmpBM01EUXhOekl3TURSYUZ3MHpNVEEzTURReE56SXdNRFJhTURzeEN6QUpCZ05WQkFZVEFsSlAKTVJFd0R3WURWUVFLRXdoalpYSjBVMGxIVGpFWk1CY0dBMVVFQ3hNUVkyVnlkRk5KUjA0Z1VrOVBWQ0JEUVRDQwpBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxjenVYN0lKVXFPdGR1MEtCdXFWNURvCjBTTFRaTHJUaytqVXJJWmhRR3BnVjJoVWhFMjhhbFFDQmYvZm01b3FybDBIajByREtIL3YreXY2ZWZISHJmQVEKVXlTUWkyYkpxSWlycjFxakFPbSt1a2J1VzNON0xCZUNnVjVpTEtFQ1piTzl4U3NBZnNUOEF6TlhEZTNpK3M1ZApSZFk0elRXMnNzSFFuSUZLcXVTeUFWd2RqMStaeExHdDI0Z2g2NUFJZ29Eek1LTkQ1cENDcmxVb1NlMWIxNmtRCk9BNytqMHhibTBicVFmV3dDSFREMElnenRuelhkTi9jaE5GRERuVTVvU1ZBS09wNHl3NHNMam1kakl0dUZod3YKSm9JUTR1TmxsQW9Fd0Y3M1hWdjRFT0xRdW5wTCs5NDNBQUFhV3lqajBweHpQaktIbUtISlVTL1gzcXd6czA4QwpBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQWNZd0hRWURWUjBPCkJCWUVGT0NNbTlzbFNiUHhmSWJXc2tLSEM5QnJvTm5rTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFBKzBoeUoKTGpYOCtIWGQ1bjlsaVBSeVRNa3MxekpPODkwWmVVZTlqanRia3c5UVNTUVRheFFHY3U4SjA2R2g0MENFeWVjWQpNblE4U0c0UG4wdlU5eDdUazRaa1ZKZGpjbERWVmMvNklKTUNvcHZESTVOT0ZsVjJvSEI1YmMwaEg4OHZMYndaCjQ0Z3grRmthZ1FuSWw2WjB4MkRFVzh4WGpySjEvUnNDQ2R0WmIzS1RhZmN4UWRhSU9MK0hzcjBXZWZtcTVMNkkKSmQxaEp5TWN0VEVIQkRhMEdwQzlvSFJ4VUlsdHZCVGpENGF1OGFzK3g2QUp6S05JMGVEYlpPZVN0Yyt2Y2tOdwppL25EaER3VHFuNlNtMWRUay9wd3dwRU9NZm1iWjEzcGxqaGVYN056VG9nVlo5NmVkaEJpSUw1VmFaVkRBRGxOCjl1NndXazVKUkZSWVgwS0QKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyBPPUdlb1RydXN0IEluYy4gT1U9KGMpIDIwMDggR2VvVHJ1c3QgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIE89R2VvVHJ1c3QgSW5jLiBPVT0oYykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIkdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyIKIyBTZXJpYWw6IDI4ODA5MTA1NzY5OTI4NTY0MzEzOTg0MDg1MjA5OTc1ODg1NTk5CiMgTUQ1IEZpbmdlcnByaW50OiBiNTplODozNDozNjpjOToxMDo0NDo1ODo0ODo3MDo2ZDoyZTo4MzpkNDpiODowNQojIFNIQTEgRmluZ2VycHJpbnQ6IDAzOjllOmVkOmI4OjBiOmU3OmEwOjNjOjY5OjUzOjg5OjNiOjIwOmQyOmQ5OjMyOjNhOjRjOjJhOmZkCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiNDo3ODpiODoxMjoyNTowZDpmODo3ODo2Mzo1YzoyYTphNzplYzo3ZDoxNTo1ZTphYTo2Mjo1ZTplODoyOToxNjplMjpjZDoyOTo0Mzo2MTo4ODo2YzpkMTpmYjpkNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRC9qQ0NBdWFnQXdJQkFnSVFGYXh1bEJteWVVdEI5aWVwd3hnUEh6QU5CZ2txaGtpRzl3MEJBUXNGQURDQgptREVMTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVZGxiMVJ5ZFhOMElFbHVZeTR4T1RBM0JnTlZCQXNUCk1DaGpLU0F5TURBNElFZGxiMVJ5ZFhOMElFbHVZeTRnTFNCR2IzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXMKZVRFMk1EUUdBMVVFQXhNdFIyVnZWSEoxYzNRZ1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodgpjbWwwZVNBdElFY3pNQjRYRFRBNE1EUXdNakF3TURBd01Gb1hEVE0zTVRJd01USXpOVGsxT1Zvd2daZ3hDekFKCkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUhaVzlVY25WemRDQkpibU11TVRrd053WURWUVFMRXpBb1l5a2cKTWpBd09DQkhaVzlVY25WemRDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4TmpBMApCZ05WQkFNVExVZGxiMVJ5ZFhOMElGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnCkxTQkhNekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOemlYbUpZSFROWE9USXoKK3V2TGg0eW4xRXJkQm9qcVpJNHhtS1U0a0I2WXp5NWpLL0JHdkVTeWlhSEFLQXhKY0NHVm4yVEFwcE1TQW1VbQpoc2FsaWZENjE0U2djSzlQR3BjL0JrVFZ5ZXR5RUgza01TajdIR0htS0FkRWM1SWlhYWNEaUd5ZFk4aFMycGduCjV3aE1jRDYweVJMQnhXZURYVFB6QXhIc2F0QlQ0dEc2Tm1DVWdMdGhZMnhiRjM3ZlFKUWVxdzNDSVNod2lQL1cKSm14c1lBUWxUbFYrZmUrL2xFamV0eDNkY0kwRlg0aWxtL0xDN3VyUlFFRnRZamdkVmdiRkEwZFJJQm44ZXhBTApEbUt1ZGxXL1gzZStQa2tCVXoyWUpRTjJKRm9kdE51SjZubmx0ck03UDdwTUtFRi9CcXhxanNIUTlnVWRmZVpDCmh1T2wxVWNDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXcKSFFZRFZSME9CQllFRk1SNXlvNmhUZ01kSE54cjJ6RmJsRDQvTUg4dE1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQgpBUUF0eFJQUFZvQjdlbmk5bjY0c21lZnYydCtVWGdscHArZHVhSXk5Y3I1SHFRNlhFcmhLOFdUVE9kOGxOTlRCCnpVNkI4QThFeENTek5KYkdwcW93MzJoaGM5ZjVqb1dKN3c1ZWxTaEtLaWVQRUk0dWZJYkVBcDdhREhkbERrUU4Ka3YzOXN4WTIraEVOSFl3T0I0bHFLVmIzY3ZUZEZaeDNOV1pYcXhOVDJJN0JRTVhYRXhaYWNzZTNhUUhFZXJHRApBV2g5alVHaGxCakJKVno4OFA2REFvZDhEUTNQTGdoY1NrQU5QdXlCWWVZazI4cmdEaTBIc2o1VzNJMzFRWVVIClNKc01DOHRKUDMzc3QvM0xqV2VKR3F2dHV4NmpBQWdJRnlxQ1hERmRSb290RDRhYmRObEYrOVJBc1hxcWFDMkcKc3BraTRjRXJ4NXo0ODErb2doTHJHUkV0Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj10aGF3dGUgUHJpbWFyeSBSb290IENBIC0gRzIgTz10aGF3dGUsIEluYy4gT1U9KGMpIDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj10aGF3dGUgUHJpbWFyeSBSb290IENBIC0gRzIgTz10aGF3dGUsIEluYy4gT1U9KGMpIDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogInRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMiIKIyBTZXJpYWw6IDcxNzU4MzIwNjcyODI1NDEwMDIwNjYxNjIxMDg1MjU2NDcyNDA2CiMgTUQ1IEZpbmdlcnByaW50OiA3NDo5ZDplYTo2MDoyNDpjNDpmZDoyMjo1MzozZTpjYzozYTo3MjpkOToyOTo0ZgojIFNIQTEgRmluZ2VycHJpbnQ6IGFhOmRiOmJjOjIyOjIzOjhmOmM0OjAxOmExOjI3OmJiOjM4OmRkOmY0OjFkOmRiOjA4OjllOmYwOjEyCiMgU0hBMjU2IEZpbmdlcnByaW50OiBhNDozMTowZDo1MDphZjoxODphNjo0NDo3MTo5MDozNzoyYTo4NjphZjphZjo4Yjo5NToxZjpmYjo0MzoxZDo4Mzo3ZjoxZTo1Njo4ODpiNDo1OTo3MTplZDoxNTo1NwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2lEQ0NBZzJnQXdJQkFnSVFOZndtWE5tRVQ4azlKajFYbTY3WFZqQUtCZ2dxaGtqT1BRUURBekNCaERFTApNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREhSb1lYZDBaU3dnU1c1akxqRTRNRFlHQTFVRUN4TXZLR01wCklESXdNRGNnZEdoaGQzUmxMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreEpEQWkKQmdOVkJBTVRHM1JvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnUTBFZ0xTQkhNakFlRncwd056RXhNRFV3TURBdwpNREJhRncwek9EQXhNVGd5TXpVNU5UbGFNSUdFTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1kR2hoCmQzUmxMQ0JKYm1NdU1UZ3dOZ1lEVlFRTEV5OG9ZeWtnTWpBd055QjBhR0YzZEdVc0lFbHVZeTRnTFNCR2IzSWcKWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFa01DSUdBMVVFQXhNYmRHaGhkM1JsSUZCeWFXMWhjbmtnVW05dgpkQ0JEUVNBdElFY3lNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRW90V2NnbnVWbmZGU2VJZitpaGEvCkJlYmZvd0pQRFFmR0FGRzZEQUpTTFNLa1FqbkUvby9xeWNHKzFFMy9uM3FlNHJGOG1xMm5oZ2x6aDlIbm11TjYKcGFwdSs3cXpjTUJuaUtJMTFLT2FzZjJ0d3U4eCtxaTU4L3NJeHBIUit5bVZvMEl3UURBUEJnTlZIUk1CQWY4RQpCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVW10Z0FNQURuYTMrRkdPNkx0czZLCkRQZ1I0YnN3Q2dZSUtvWkl6ajBFQXdNRGFRQXdaZ0l4QU4zNDRGZEhXNmZtQ3NPOTlZQ0tselVORzRrOFZJWjMKS01xaDlIbmV0ZVk0c1BCbGNJeC9BbFRDdi8vWW9UN1p6d0l4QU1TTmxQemNVOUxjblhnV0h4VXpJMU5TNDFveApYWjNLcnIwVEtVUU5KMXVvNTJpY0V2ZFlQeTV5QWxlamo2RVVMZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj10aGF3dGUgUHJpbWFyeSBSb290IENBIC0gRzMgTz10aGF3dGUsIEluYy4gT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbi8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMyBPPXRoYXd0ZSwgSW5jLiBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLyhjKSAyMDA4IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJ0aGF3dGUgUHJpbWFyeSBSb290IENBIC0gRzMiCiMgU2VyaWFsOiAxMjc2MTQxNTcwNTY2ODEyOTk4MDU1NTY0NzYyNzU5OTU0MTQ3NzkKIyBNRDUgRmluZ2VycHJpbnQ6IGZiOjFiOjVkOjQzOjhhOjk0OmNkOjQ0OmM2Ojc2OmYyOjQzOjRiOjQ3OmU3OjMxCiMgU0hBMSBGaW5nZXJwcmludDogZjE6OGI6NTM6OGQ6MWI6ZTk6MDM6YjY6YTY6ZjA6NTY6NDM6NWI6MTc6MTU6ODk6Y2E6ZjM6NmI6ZjIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDRiOjAzOmY0OjU4OjA3OmFkOjcwOmYyOjFiOmZjOjJjOmFlOjcxOmM5OmZkOmU0OjYwOjRjOjA2OjRjOmY1OmZmOmI2Ojg2OmJhOmU1OmRiOmFhOmQ3OmZkOmQzOjRjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFS2pDQ0F4S2dBd0lCQWdJUVlBR1h0MGFuNnJTMG10WkxML2VRK3pBTkJna3Foa2lHOXcwQkFRc0ZBRENCCnJqRUxNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREhSb1lYZDBaU3dnU1c1akxqRW9NQ1lHQTFVRUN4TWYKUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObGN5QkVhWFpwYzJsdmJqRTRNRFlHQTFVRUN4TXZLR01wSURJdwpNRGdnZEdoaGQzUmxMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreEpEQWlCZ05WCkJBTVRHM1JvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnUTBFZ0xTQkhNekFlRncwd09EQTBNREl3TURBd01EQmEKRncwek56RXlNREV5TXpVNU5UbGFNSUd1TVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1kR2hoZDNSbApMQ0JKYm1NdU1TZ3dKZ1lEVlFRTEV4OURaWEowYVdacFkyRjBhVzl1SUZObGNuWnBZMlZ6SUVScGRtbHphVzl1Ck1UZ3dOZ1lEVlFRTEV5OG9ZeWtnTWpBd09DQjBhR0YzZEdVc0lFbHVZeTRnTFNCR2IzSWdZWFYwYUc5eWFYcGwKWkNCMWMyVWdiMjVzZVRFa01DSUdBMVVFQXhNYmRHaGhkM1JsSUZCeWFXMWhjbmtnVW05dmRDQkRRU0F0SUVjegpNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXNyOG5MUHZiMkZ2ZGVIc2JubmRtCmdjcyt2SHl1ODZZbm1qU2phREZ4T0ROaTVQTnhabm14cVdXanBZdlZqMkF0UDBMTXFtc3l3Q1BMTEVIZDVOLzgKWVp6aWM3SWlsUkZER0YvRXRoOVhiQW9GV0NMSU5rdzZmS1hSejRhdmlLZEVBaE4wY1hNS1Fsa0MrQnNVYTBMZgpiMSs2YTRLaW5Wdm5TcjBlQVhMYlMzVG9PMzkvZlI4RXRDYWI0TFJhckVjOVZialhzQ1pTS0FFeFFHYlkyU1M5Cjlpclk3Q0ZKWEp2MmV1bC9WVFYrbG11Tms1TW55NUs3NnF4QXdKL0MrSURQWGZSYTNNNTBocVkrYkF0VHlyMlMKemhrR2N1WU1YRGhweHdUV3ZHek9XL2IzYUp6Y0pSVklpS0hwcWZpWW5PRHoxVEVvWVJGc1o1YU5PWm5Md2tVawpPUUlEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WCkhRNEVGZ1FVcld5cWxHQ2M3ZVQvK2o0S2RDdGpBL2UyV2I4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFCcEEKMkpWbHJBbVNpY1k1OUJEbHFRNW1VMTE0M3Zva2tidm5SRkhmeGhZMEN1OXFSRkhxS3dlS0EzckQ2ejhLTEZJVwpvQ3REdVNXUVAzQ3BNeVZ0UlJvb095ZlBxc01wUWh2Zk8wekFNelJiUVlpL2F5dGxyeWp2c3ZYRHFtYk9lMWJ1CnQ4akxaOEhKbkJvWXVNVERTUVB4WUE1UXpVYkY4M2Q1OTdZVjREamJ4eThvb0F3L2R5WjAyU1VTMmpIYUdoN2MKS1VHUklqeHBwN3NDOHJaY0p3T0o5QWJxbStSeWd1T2hDY0hwQUJuVFB0UndhN3B4cHFwWXJ2Uzc2V3kyNzRmTQptN3YvT2VaV1lkTUtwOFJjVEdCN0JYY21lci9ZQjFJc1l2ZHdZOWs1dkc4Y3dubmNkaW12enNVc1pBUmVpRFp1Ck1kUkFHbUkwTmo4MUFhNnNZNkE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIgTz1HZW9UcnVzdCBJbmMuIE9VPShjKSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiBPPUdlb1RydXN0IEluYy4gT1U9KGMpIDIwMDcgR2VvVHJ1c3QgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJHZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIiCiMgU2VyaWFsOiA4MDY4Mjg2MzIwMzM4MTA2NTc4MjE3NzkwODc1MTc5NDYxOTI0MwojIE1ENSBGaW5nZXJwcmludDogMDE6NWU6ZDg6NmI6YmQ6NmY6M2Q6OGU6YTE6MzE6Zjg6MTI6ZTA6OTg6NzM6NmEKIyBTSEExIEZpbmdlcnByaW50OiA4ZDoxNzo4NDpkNTozNzpmMzowMzo3ZDplYzo3MDpmZTo1Nzo4Yjo1MTo5YTo5OTplNjoxMDpkNzpiMAojIFNIQTI1NiBGaW5nZXJwcmludDogNWU6ZGI6N2E6YzQ6M2I6ODI6YTA6NmE6ODc6NjE6ZTg6ZDc6YmU6NDk6Nzk6ZWI6ZjI6NjE6MWY6N2Q6ZDc6OWI6Zjk6MWM6MWM6NmI6NTY6NmE6MjE6OWU6ZDc6NjYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNyakNDQWpXZ0F3SUJBZ0lRUExMMFNBb0E0djdySkR0ZVlEN0RhekFLQmdncWhrak9QUVFEQXpDQm1ERUwKTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVZGxiMVJ5ZFhOMElFbHVZeTR4T1RBM0JnTlZCQXNUTUNoagpLU0F5TURBM0lFZGxiMVJ5ZFhOMElFbHVZeTRnTFNCR2IzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEUyCk1EUUdBMVVFQXhNdFIyVnZWSEoxYzNRZ1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDAKZVNBdElFY3lNQjRYRFRBM01URXdOVEF3TURBd01Gb1hEVE00TURFeE9ESXpOVGsxT1Zvd2daZ3hDekFKQmdOVgpCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUhaVzlVY25WemRDQkpibU11TVRrd053WURWUVFMRXpBb1l5a2dNakF3Ck55QkhaVzlVY25WemRDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4TmpBMEJnTlYKQkFNVExVZGxiMVJ5ZFhOMElGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnTFNCSApNakIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJCV3g2UDBERlVQbHJPdUhOeEZpNzlLRE5sSjlSVmNMClNvMTdWRHM2Ymw4VkFzQlFwczhsTDMzS1NMakhVR01jS2lFSWZKbzIyQXYrMFNiRldERXdLQ1h6WFYyanVMYWwKdEpMdGJDeWY2OTFEaWFJOFMwaVJIVkRzSnQvV1lDNjlJYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTwpCZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZCVmZOVmRSVmZzbHNxMERhZndCby9xK0VWWFZNQW9HCkNDcUdTTTQ5QkFNREEyY0FNR1FDTUdTV1dhYm9DZDZMdXZwYWlJandINUhUUnFqeVNrd0NZL3RzWHpqYkxrR1QKcVE3bW5kd3hITEtncHhnY2VlSEhOZ0l3T2xhdm1uUnM5dnVENERQVENGK2huTUpibjBiV3RzdVJCbU9pQnVjegpyRDZvZ1JMUXk3clFrZ3UybnBhcUJBK0sKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049VmVyaVNpZ24gVW5pdmVyc2FsIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIlZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogODUyMDk1NzQ3MzQwODQ1ODE5MTc3NjM3NTI2NDQwMzE3MjY4NzcKIyBNRDUgRmluZ2VycHJpbnQ6IDhlOmFkOmI1OjAxOmFhOjRkOjgxOmU0OjhjOjFkOmQxOmUxOjE0OjAwOjk1OjE5CiMgU0hBMSBGaW5nZXJwcmludDogMzY6Nzk6Y2E6MzU6NjY6ODc6NzI6MzA6NGQ6MzA6YTU6ZmI6ODc6M2I6MGY6YTc6N2I6Yjc6MGQ6NTQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDIzOjk5OjU2OjExOjI3OmE1OjcxOjI1OmRlOjhjOmVmOmVhOjYxOjBkOmRmOjJmOmEwOjc4OmI1OmM4OjA2OjdmOjRlOjgyOjgyOjkwOmJmOmI4OjYwOmU4OjRiOjNjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFdVRDQ0E2R2dBd0lCQWdJUVFCckVaQ0d6RXlFRERydmtFaHJGSFRBTkJna3Foa2lHOXcwQkFRc0ZBRENCCnZURUxNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUwKRXhaV1pYSnBVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdPQ0JXWlhKcApVMmxuYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNVGd3TmdZRFZRUURFeTlXClpYSnBVMmxuYmlCVmJtbDJaWEp6WVd3Z1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWUKRncwd09EQTBNREl3TURBd01EQmFGdzB6TnpFeU1ERXlNelU1TlRsYU1JRzlNUXN3Q1FZRFZRUUdFd0pWVXpFWApNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eEh6QWRCZ05WQkFzVEZsWmxjbWxUYVdkdUlGUnlkWE4wCklFNWxkSGR2Y21zeE9qQTRCZ05WQkFzVE1TaGpLU0F5TURBNElGWmxjbWxUYVdkdUxDQkpibU11SUMwZ1JtOXkKSUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreE9EQTJCZ05WQkFNVEwxWmxjbWxUYVdkdUlGVnVhWFpsY25OaApiQ0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGCkFBT0NBUThBTUlJQkNnS0NBUUVBeDJFM1hyRUJOTnRpMXhXYi8xaGFqQ01qMW1DT2tkZVFtSU42NWxnWk9JekYKOXVWa2hiU2ljZnZ0dmJuYXpVMEF0TWd0YzZYSGFYR1ZIems4c2tRSG5PZ08razFLeENIZktXR1BNaUpoZ3NXSApIMjZNZkY4V0lGRkUwWEJQVityakhPUE1lZTVZMkE3Q3MwV1R3Q3pubWhjcmV3QTNla0V6ZU9FejR2TVFHbitICkxMNzI5ZmRDNHVXL2gyS0pYd0JMMzhYZDVIVkVNa0U2SG5GdWFjc0xkVVlJMGNyU0s1WFF6L3U1UUd0a2pGZE4KL0JNUmVZVHRYbFQyTko4SUFmTVFKUVlYU3RyeEhYcG1hNWhnWnFUWjc5SXVndkh3N3ducVJNa1ZhdUlEYmpQVApySjlWQU1mMkNHcVV1Vi9jNERQeGhHRDVXeWNSdFB3VzhydFdhb0FsalFJREFRQUJvNEd5TUlHdk1BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01HMEdDQ3NHQVFVRkJ3RU1CR0V3WDZGZG9Gc3cKV1RCWE1GVVdDV2x0WVdkbEwyZHBaakFoTUI4d0J3WUZLdzREQWhvRUZJL2wweHFHckkyT2E4UFBnR3JVU0JncwpleGt1TUNVV0kyaDBkSEE2THk5c2IyZHZMblpsY21semFXZHVMbU52YlM5MmMyeHZaMjh1WjJsbU1CMEdBMVVkCkRnUVdCQlMyZC9wcFNFZWZVeExWd3VvSE1uWUgwWmNIR1RBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQVN2ajQKc0FQbUxHZDc1SlIzWTh4dVRQbDlEZzNjeUxrMXVYQlBZL29rK215RGpFZWRPMlB6bXZsMk1wV1JzWGU4ckpxKwpzZVF4SWNhQmxWWmFEckhDMUxHbVdhenhZOHU0VEIxWmtFcnZrQllvSDFxdUVQdUJVRGdNYk16eFBjUDFZK096CjR5SEpKRG5wL1JWbVJ2UWJFZEJOYzZOOVJ2azk3YWhmWXRUeFAvamdkRmNyR0oyQnRNUW8ycFNYcFhEcnJCMisKQnhIdzFkdmQ1WXp3MVRLd2crWlg0bysvdnFHcXZ6MGR0ZFE0NnRld1hEcFBhaitQd0dac1k2cnAyYVFXOUlIUgpsUlFPZmMyVk5OblNqM0J6Z1h1Y2ZyMllZZGhGaDVpUXhldUdNTVkxdi9EL3cxV0lnMHZ2QlpJR2NmSzRtSk8zCjdNMkNZZkU0NWsrWG1DcGFqUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAyMDA3IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAyMDA3IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIlZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNCIKIyBTZXJpYWw6IDYzMTQzNDg0MzQ4MTUzNTA2NjY1MzExOTg1NTAxNDU4NjQwMDUxCiMgTUQ1IEZpbmdlcnByaW50OiAzYTo1MjplMTplNzpmZDo2ZjozYTplMzo2ZjpmMzo2Zjo5OToxYjpmOToyMjo0MQojIFNIQTEgRmluZ2VycHJpbnQ6IDIyOmQ1OmQ4OmRmOjhmOjAyOjMxOmQxOjhkOmY3OjlkOmI3OmNmOjhhOjJkOjY0OmM5OjNmOjZjOjNhCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2OTpkZDpkNzplYTo5MDpiYjo1NzpjOTozZToxMzo1ZDpjODo1ZTphNjpmYzpkNTo0ODowYjo2MDozMjozOTpiZDpjNDo1NDpmYzo3NTo4YjoyYToyNjpjZjo3Zjo3OQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGhEQ0NBd3FnQXdJQkFnSVFMNEQrSTR3T0lnOUlaeElva1llc3N6QUtCZ2dxaGtqT1BRUURBekNCeWpFTApNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUxFeFpXClpYSnBVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOeUJXWlhKcFUybG4KYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNVVV3UXdZRFZRUURFenhXWlhKcApVMmxuYmlCRGJHRnpjeUF6SUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5CmFYUjVJQzBnUnpRd0hoY05NRGN4TVRBMU1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCeWpFTE1Ba0cKQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUxFeFpXWlhKcApVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOeUJXWlhKcFUybG5iaXdnClNXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNVVV3UXdZRFZRUURFenhXWlhKcFUybG4KYmlCRGJHRnpjeUF6SUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNQpJQzBnUnpRd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVNuVm5wOFV0cGttdzR0WE5oZXJKSTkvZ0htCkdVbzlGQU5MK21BbklObURpV242Vk1hYUdGNVZLbVRlQnZhTlNqdXRFRHhsUFpDSUJJbmdNR0d6cmwwQnAzdmUKZkxLK3ltVmhBSWF1Mm85NzBJbXRUUjFabWtHeHZFZUEzSjVpdy9tamdiSXdnYTh3RHdZRFZSMFRBUUgvQkFVdwpBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3YlFZSUt3WUJCUVVIQVF3RVlUQmZvVjJnV3pCWk1GY3dWUllKCmFXMWhaMlV2WjJsbU1DRXdIekFIQmdVckRnTUNHZ1FVaitYVEdvYXNqWTVydzgrQWF0UklHQ3g3R1M0d0pSWWoKYUhSMGNEb3ZMMnh2WjI4dWRtVnlhWE5wWjI0dVkyOXRMM1p6Ykc5bmJ5NW5hV1l3SFFZRFZSME9CQllFRkxNVwprZjN1cG03a3RTNUpqNGQ0Z1lEczViRzFNQW9HQ0NxR1NNNDlCQU1EQTJnQU1HVUNNR1loREJnbVlGbzRlMVpDCjRLZjhOb1JSa1NBc2RrMURQY1FkaENQUXJOWjhOUWJPeldtOWtBM2JiRWhDSFE2cVFnSXhBSnc5U0Rrak9WZ2EKRlJKWmFwN3YxVm15SFZJc21YSE54eW5mR3lwaGUzSFIzdlBBNVEwNlNxb3RwOWlHS3QwdUVBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEZcdTAxNTF0YW5ceGZhc1x4ZWR0dlx4ZTFueSBPPU5ldExvY2sgS2Z0LiBPVT1UYW5ceGZhc1x4ZWR0dlx4ZTFueWtpYWRceGYzayAoQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcykKIyBTdWJqZWN0OiBDTj1OZXRMb2NrIEFyYW55IChDbGFzcyBHb2xkKSBGXHUwMTUxdGFuXHhmYXNceGVkdHZceGUxbnkgTz1OZXRMb2NrIEtmdC4gT1U9VGFuXHhmYXNceGVkdHZceGUxbnlraWFkXHhmM2sgKENlcnRpZmljYXRpb24gU2VydmljZXMpCiMgTGFiZWw6ICJOZXRMb2NrIEFyYW55IChDbGFzcyBHb2xkKSBGXHUwMTUxdGFuXHhmYXNceGVkdHZceGUxbnkiCiMgU2VyaWFsOiA4MDU0NDI3NDg0MTYxNgojIE1ENSBGaW5nZXJwcmludDogYzU6YTE6Yjc6ZmY6NzM6ZGQ6ZDY6ZDc6MzQ6MzI6MTg6ZGY6ZmM6M2M6YWQ6ODgKIyBTSEExIEZpbmdlcnByaW50OiAwNjowODozZjo1OTozZjoxNTphMTowNDphMDo2OTphNDo2YjphOTowMzpkMDowNjpiNzo5NzowOTo5MQojIFNIQTI1NiBGaW5nZXJwcmludDogNmM6NjE6ZGE6YzM6YTI6ZGU6ZjA6MzE6NTA6NmI6ZTA6MzY6ZDI6YTY6ZmU6NDA6MTk6OTQ6ZmI6ZDE6M2Q6Zjk6Yzg6ZDQ6NjY6NTk6OTI6NzQ6YzQ6NDY6ZWM6OTgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVGVENDQXYyZ0F3SUJBZ0lHU1VFczVBQVFNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR25NUXN3Q1FZRFZRUUcKRXdKSVZURVJNQThHQTFVRUJ3d0lRblZrWVhCbGMzUXhGVEFUQmdOVkJBb01ERTVsZEV4dlkyc2dTMlowTGpFMwpNRFVHQTFVRUN3d3VWR0Z1dzdwenc2MTBkc09oYm5scmFXRmt3N05ySUNoRFpYSjBhV1pwWTJGMGFXOXVJRk5sCmNuWnBZMlZ6S1RFMU1ETUdBMVVFQXd3c1RtVjBURzlqYXlCQmNtRnVlU0FvUTJ4aGMzTWdSMjlzWkNrZ1JzV1IKZEdGdXc3cHp3NjEwZHNPaGJua3dIaGNOTURneE1qRXhNVFV3T0RJeFdoY05Namd4TWpBMk1UVXdPREl4V2pDQgpwekVMTUFrR0ExVUVCaE1DU0ZVeEVUQVBCZ05WQkFjTUNFSjFaR0Z3WlhOME1SVXdFd1lEVlFRS0RBeE9aWFJNCmIyTnJJRXRtZEM0eE56QTFCZ05WQkFzTUxsUmhic082YzhPdGRIYkRvVzU1YTJsaFpNT3pheUFvUTJWeWRHbG0KYVdOaGRHbHZiaUJUWlhKMmFXTmxjeWt4TlRBekJnTlZCQU1NTEU1bGRFeHZZMnNnUVhKaGJua2dLRU5zWVhOegpJRWR2YkdRcElFYkZrWFJoYnNPNmM4T3RkSGJEb1c1NU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBCk1JSUJDZ0tDQVFFQXhDUmVjNzVMYlJURG9mVGpsNUJ1MGpCRkhqenVaOWxrNEJxS2Y4b3d5b1BqSU1IajlEclQKbEY4YWZGdHR2ekJQaENmMm54OUp2TWFaQ3BEeUQvVi9RNFEzWTFHTGVxVncvSHBZelk2YjdjTkdiSVJ3WGRyegpBWkFqL0U0d3FYN2hKMlBuN1dROG9MakpNMlArRnBEL3NMajkxNmpBd0pSREM3YlZXYWFlVnRBa0gzQjVyOXM1ClZBMWxkZGtWUVpRQnIxN3M5bzN4LzYxay9pQ2ExMXpyL3FZZkNHU2ppM1pWclI0N0tHQXVoeVhvcXE4ZnhtUkcKSUxkd2Z6emVTTnVXVTdjNWQrUWE0c2NXaEhhWFd5KzdHUldGK0dtRjlabW5xZkkwcDZtMnBnUDhiNFk5Vkh4MgpCSnRyK1VCZEFEVEhMcGwxbmVXSUE2cE4rQVBTUW5iQUd3SURBS2lMbzBVd1F6QVNCZ05WSFJNQkFmOEVDREFHCkFRSC9BZ0VFTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVelBwbmsvQzJ1TkNsd0I3elUvMk0KVTkrRDE1WXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS3QvN2h3V3FadzhVUUNnd0JFSUJhZVo1bThCaUZSaApidkc1R0sxS3JmNkJRQ09VTC90MWZDOG9TMklrZ1lJTDlXSHhIRzY0WVRqcmdmcGlvVHRhWXRPVVpjVGg1bTJDCitDOGxjTEloSnNGeVVSK01MTU9Fa01OYWo3clA5S2RscGV1WTBmc0Zza1oxRlNOcWI0VmpNSUR3MVo0ZktSekMKYkxCUVdWMlFXenVvRFREUHYzMS96dkdkZzczSlJtNGdwdmxoVWJvaEwzdStwUlZqb2RTVmgvR2V1Zk9KOHoyRgp1TGpidnJXNUtmbmFOd1VBU1pRRGhFVG52ME14ejNXTEpkSDBwbVQxa3ZhckJlczk2YVVMTm1MYXpBWmZOb3UyClhqRzRLdnRlOW5IZlJDYWV4T1lOa2JRdWRaV0FVV3BMTUthd1lxR1Q4WnZZenNSamRUOVpSN0U9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgU3ViamVjdDogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMiBPPVN0YWF0IGRlciBOZWRlcmxhbmRlbgojIExhYmVsOiAiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMiIKIyBTZXJpYWw6IDEwMDAwMDEyCiMgTUQ1IEZpbmdlcnByaW50OiA3YzphNTowZjpmODo1Yjo5YTo3ZDo2ZDozMDphZTo1NDo1YTplMzo0MjphMjo4YQojIFNIQTEgRmluZ2VycHJpbnQ6IDU5OmFmOjgyOjc5OjkxOjg2OmM3OmI0Ojc1OjA3OmNiOmNmOjAzOjU3OjQ2OmViOjA0OmRkOmI3OjE2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA2Njo4Yzo4Mzo5NDo3ZDphNjozYjo3Mjo0YjplYzplMTo3NDozYzozMTphMDplNjphZTpkMDpkYjo4ZTpjNTpiMzoxYjplMzo3NzpiYjo3ODo0Zjo5MTpiNjo3MTo2ZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnlqQ0NBN0tnQXdJQkFnSUVBSmlXakRBTkJna3Foa2lHOXcwQkFRc0ZBREJhTVFzd0NRWURWUVFHRXdKTwpUREVlTUJ3R0ExVUVDZ3dWVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdU1Tc3dLUVlEVlFRRERDSlRkR0ZoCmRDQmtaWElnVG1Wa1pYSnNZVzVrWlc0Z1VtOXZkQ0JEUVNBdElFY3lNQjRYRFRBNE1ETXlOakV4TVRneE4xb1gKRFRJd01ETXlOVEV4TURNeE1Gb3dXakVMTUFrR0ExVUVCaE1DVGt3eEhqQWNCZ05WQkFvTUZWTjBZV0YwSUdSbApjaUJPWldSbGNteGhibVJsYmpFck1Da0dBMVVFQXd3aVUzUmhZWFFnWkdWeUlFNWxaR1Z5YkdGdVpHVnVJRkp2CmIzUWdRMEVnTFNCSE1qQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU1WWjUyOTEKcWo1TG5MVzRySjRMNVBuWnlxdGRqN1U1RUlMWHIxSGdPK0VBU0dyUDJ1RUdReEdacWhRbEVxMGk2QUJ0UThTcAp1T1VmaVV0bnZXRkk3LzNTNEdDSTVia1lZQ2pEZHl1dHNEZXFOOTVrV1NwR1YrUkx1ZmczZk5VMjU0REJ0dlBVClo1dVc2TTdYeGdwVDBHdEpsdk9qQ3dWM1NQY2w1WENzTUJRZ0plTi9kVnJsU1BoT2V3TUhCUHFDWVlkdThEdkUKcE1mUTlYUStwVjBhQ1BLYkpkTDJyQVFtUGxVNllpaWxlN0l3ci9nM3d0RzYxamo5OU85Sk1EZVpKaUZJaFFHcAo1UmJuM0pCVjN3L29PTTJaTnlGUFhmVWliMnJGRWhaZ0YxWHlaV2FtcHpDUk9NRTRIWVlFaExvYUpYaGVuYS9NClVHRFdFNGRTN1dNZmJXVjl3aFVZZE1yaGZtUXBqSExZRmhOOUMwbEs4U2diSUhScnhUM2RzS3BJQ1QwdWdwVE4KR21YWks0aWFtYndZZnAvdWZXWjhQcjJVdUlIT3paZ3dlTUZ2WjlDK1grQm83ZDdpc2Nrc1dYaVNxdDhyWUdQeQo1VjY1NDhyNmYxQ0dQcUkwR0F3SmFDZ1JIT1RodVZ3K1I3b3lQeGpNVzRUMTgydDB4SEowNGVPTG9FcTlqV1l2CjZxMDEyaURUaUlKaDhCSWl0cnpRMWFUc3IxU0lKU1E4cDIyeGNpay9QbGVtZjFXdmJpYkcvdWZNUUZ4UlJJRUsKZU41S3psVy9IZFhadDFidjhIYi9DM20xcjczN3FXbVJScGRvZ0JRMkhiTi91eW1ZTnFVZytvSmdZak9rN05hNgpCNmR1eGM4VXB1ZldralRZZ2ZYOEhWMnFYQjcybzAwN3VQYzVBZ01CQUFHamdaY3dnWlF3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pCU0JnTlZIU0FFU3pCSk1FY0dCRlVkSUFBd1B6QTlCZ2dyQmdFRkJRY0NBUll4YUhSMGNEb3YKTDNkM2R5NXdhMmx2ZG1WeWFHVnBaQzV1YkM5d2IyeHBZMmxsY3k5eWIyOTBMWEJ2YkdsamVTMUhNakFPQmdOVgpIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkpGb01vY1ZIWW5pdGZHc05pZzBqUXQ4WW9qck1BMEdDU3FHClNJYjNEUUVCQ3dVQUE0SUNBUUNvUVVwbktwS0JnbEJ1NGRmWXN6azc4d0lWQ1ZCUjd5MjlKSHVJaGp2NXRMeVMKQ1phNTlzQ3JJMkFHZVl3UlRsSFNlWUF6KzUxSXZ1eEJRNEVmZmtkQUhPVjZDTXFxaTNXdEZNVEM2R1k4Z2dlbgo1aWVDV3hqbUQyN1pVRDZLUWhncHhyUlcvRllRb0FVWHZRd2pmL1NUN1p3YVViN2RSVUcva1NTMEg0enBYODk3CklabWZsWjg1T2tZY2JQbk5lNXlRelNpcHg2bFZ1NnhpTkdJMUUwc1VPbFdEdVlhTmtxYkc5QWNsVk13V1Z4SksKZ25qSUZOa1hnaVl0WFNBZmVhNysxSEFXRnBXRDJEVTUvMUpkZFJ3V3hSTlZ6MGZNZFdWU1N0N3dzS2ZrQ3BZTAorNjNDNGlXRXN0M2t2WDVaYkp2dzhOam55dkxwbHpoK2liN00remtYWVQ5eTJ6cVIyR1VCR1IydFVLUlhDbnhMCnZKeHhjeXBGVVJtRnpJNzlSNmQwbFIybzBhOU9GN0ZwSnNLcWVGZGJ4VTJuNVo0RkY1VEtzbCtnU1JpTk5Pa20KYkVnZXFtaVNCZUdDYzFxYjNBZGJDRzE5bmRlTklkbjhGQ0Nxd2tYZlArY0FzbEhrd3ZnRnVYa2FqRFR6bmx2awpOMXRyU3Q4c1Y0cEFXamE2M1hWRUNEZENjQXorM0Y0aG9LT0t3SkNjYU5wUTVrVVFSM2kyVHRKbHljTTMzK0ZDClk3QlhOMFV0ZTRxY3Z3WHFaVlV6OXprUXhTZ3FJWG9iaXNRaytUOFZ5Sm9WSVBWVllwYnRiWk5Rdk9TcWVLM1oKeXdwbGg2Wm13Y1NCbzNjNldCNEw3b09MblI3U1VxVE1IVyt3bUcyVU1iWDRjUXJjdWZ4OU1tRG02NitLQVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SG9uZ2tvbmcgUG9zdCBSb290IENBIDEgTz1Ib25na29uZyBQb3N0CiMgU3ViamVjdDogQ049SG9uZ2tvbmcgUG9zdCBSb290IENBIDEgTz1Ib25na29uZyBQb3N0CiMgTGFiZWw6ICJIb25na29uZyBQb3N0IFJvb3QgQ0EgMSIKIyBTZXJpYWw6IDEwMDAKIyBNRDUgRmluZ2VycHJpbnQ6IGE4OjBkOjZmOjM5Ojc4OmI5OjQzOjZkOjc3OjQyOjZkOjk4OjVhOmNjOjIzOmNhCiMgU0hBMSBGaW5nZXJwcmludDogZDY6ZGE6YTg6MjA6OGQ6MDk6ZDI6MTU6NGQ6MjQ6YjU6MmY6Y2I6MzQ6NmU6YjI6NTg6YjI6OGE6NTgKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGY5OmU2OjdkOjMzOjZjOjUxOjAwOjJhOmMwOjU0OmM2OjMyOjAyOjJkOjY2OmRkOmEyOmU3OmUzOmZmOmYxOjBhOmQwOjYxOmVkOjMxOmQ4OmJiOmI0OjEwOmNmOmIyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlETURDQ0FoaWdBd0lCQWdJQ0ErZ3dEUVlKS29aSWh2Y05BUUVGQlFBd1J6RUxNQWtHQTFVRUJoTUNTRXN4CkZqQVVCZ05WQkFvVERVaHZibWRyYjI1bklGQnZjM1F4SURBZUJnTlZCQU1URjBodmJtZHJiMjVuSUZCdmMzUWcKVW05dmRDQkRRU0F4TUI0WERUQXpNRFV4TlRBMU1UTXhORm9YRFRJek1EVXhOVEEwTlRJeU9Wb3dSekVMTUFrRwpBMVVFQmhNQ1NFc3hGakFVQmdOVkJBb1REVWh2Ym1kcmIyNW5JRkJ2YzNReElEQWVCZ05WQkFNVEYwaHZibWRyCmIyNW5JRkJ2YzNRZ1VtOXZkQ0JEUVNBeE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0MKQVFFQXJQODR0dWxtQWtuam9yVGhrUGxBajNuNTRyMTUvZ0s5N2lTU0hTTDIyb1Z5YWY3WFB3blUzWkcxQXB6UQpqVnJoVmNOUWhya3BKc0xqMmFEeGFRTW9JSUJGSWkxV3B6dFVsVllpV1I4bzN4OGdQVzJpTnI0am9MRnV0YkVuClB6bFRDZXFyYXVoMHNzSmxYSTYvZk1ONGhNMmVGdnoxTGs4Z0tnaWZkL1BGSHNTYVVtWWVTRjdqRUFhUElwamgKWlk0YlhTTm1PN2lsTWxISWhxcWhxWjUvZHBUQ3BteTNRZkRWeUFZNDV0UU00dk03VEcxUWpNU0RKOEVUaEZrOQpublYwdHRnQ1hqcVFlc0JDTm5Mc2FrM2M3OFFBM3hNWVYxOG1lTWpXQ25sM3YvZXZ0M2E1cFF1RUYxMFE2bS9oCnE1VVJYMjA4bzF4TmcxdnlzeG1LZ0lzTGh3SURBUUFCb3lZd0pEQVNCZ05WSFJNQkFmOEVDREFHQVFIL0FnRUQKTUE0R0ExVWREd0VCL3dRRUF3SUJ4akFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBRGtiVlBLN2loOWxlZ1lzQwptRUVJakV5ODJ0dnVKeHVDNTJwRjdCYUxUNFdnODdKd3ZWcVd1c3B1YmU1R2kyN25LaTZXc3hrejY3U2ZxTEkzCjdwaW9sN1l1dG1jbjFLWkovUnlUWlhhZVFpL2NJbXlhVC9KYUZUbXhjZGNyVWVodEhKakEyU3Iwb1lKNzFjbEIKb2lNQmREaFZpdys1TG1laUlBUTMycHdMMHhjaDRJK1hlVFJ2aEVnQ0lETWI1alJFbjVGdzlJQmVoRVBDS2RKcwpFaFRrWVkyc0VKQ2VoRkM3OEpadlJaK0s4OHBzVC9vUk9oVVZSc1BOSDROYkxVRVM3VkJuUVJNOUlhdVVpcXBPCmZNR3grNmZXdFNjdmw2dHU0QjNpMFJ3c0gwVGkvTDZSb1p6NzFpbFRjNGFmVTloRERsM1dZNEp4SFlCMHl2YmkKQW12WldnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNlY3VyZVNpZ24gUm9vdENBMTEgTz1KYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuCiMgU3ViamVjdDogQ049U2VjdXJlU2lnbiBSb290Q0ExMSBPPUphcGFuIENlcnRpZmljYXRpb24gU2VydmljZXMsIEluYy4KIyBMYWJlbDogIlNlY3VyZVNpZ24gUm9vdENBMTEiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiBiNzo1Mjo3NDplMjo5MjpiNDo4MDo5MzpmMjo3NTplNDpjYzpkNzpmMjplYToyNgojIFNIQTEgRmluZ2VycHJpbnQ6IDNiOmM0OjlmOjQ4OmY4OmYzOjczOmEwOjljOjFlOmJkOmY4OjViOmIxOmMzOjY1OmM3OmQ4OjExOmIzCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZjowZjplZTpmYjo5ZTozYTo1ODoxYTpkNTpmOTplOTpkYjo3NTo4OTo5ODo1Nzo0MzpkMjo2MTowODo1Yzo0ZDozMTo0Zjo2Zjo1ZDo3Mjo1OTphYTo0MjoxNjoxMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGJUQ0NBbFdnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQllNUXN3Q1FZRFZRUUdFd0pLVURFcgpNQ2tHQTFVRUNoTWlTbUZ3WVc0Z1EyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMmFXTmxjeXdnU1c1akxqRWNNQm9HCkExVUVBeE1UVTJWamRYSmxVMmxuYmlCU2IyOTBRMEV4TVRBZUZ3MHdPVEEwTURnd05EVTJORGRhRncweU9UQTAKTURnd05EVTJORGRhTUZneEN6QUpCZ05WQkFZVEFrcFFNU3N3S1FZRFZRUUtFeUpLWVhCaGJpQkRaWEowYVdacApZMkYwYVc5dUlGTmxjblpwWTJWekxDQkpibU11TVJ3d0dnWURWUVFERXhOVFpXTjFjbVZUYVdkdUlGSnZiM1JEClFURXhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQS9YZXFwUnlRQlR2TFRKc3oKaTFvVVJhVG5rQmJSMzFmU0lSQ2tGLzNmck5ZZnArVGJmUGZzMzdnRDJwUlkvVjF5Zkl3L1h3Rm5kQldXNHdJOApoOXV1eXdHT3d2Tm14b1ZGOUFMR09yVmlzcS82bkwrazV0U0FNSmp6RGJhVGo2blUyRGJ5c1B5S3lpeWhGVE9WCk1kckFHL0x1WXBtR1l6Ky8zWk1xZzZoMnVSTWZ0ODVPUW9XUEl1Y3VHdktWQ2JJRnRVUk9kNkVndmFueVRncDkKVUszMUJRMUZUMFp4L1NnK1Uvc0UyQzNYWlIxS0cvclBPN0F4bWpWdXlJc0cwd0NSOHBRSVpVeXhOQVlBZW9uaQo4TWNEV2MvVjF1aW5NclBtbUVDR3hjMG5Fb3ZNZTg2M0VUeGlZQWNqUGl0QWJwU0FDVzIyczI5M2J6VUlVUHNDCmg4VStpUUlEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVVy9oTlQ3S2xodFE2MHZGam1xQytDZlpYdDk0d0RnWUQKVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQgpBS0NoT0JabUxxZFdIeUdjQnZvZDdia2l4VGdtMkU1UDdLTi9lZDVHSWFHSGQ0OEhDSnF5cE1XdkR6S1lDM3htCktiYWJmU1ZTU1VPclRDNHJibnB3cnhZTzR3SnMrMExtR0oxRjJGWEk2RHZkNStIMExnc2NORnhzV0VyN2pJaFEKWDVVY3YrMnJJclZsczRXNm5nKzRyZVY2RzRwUU9oMjlEYng3VkZBTHVVS3ZWYUFZZ2ExbG1lKys1SnkveElXcgpRYkpVYjl3bHplMTQ0bzRNalFsSjNXTjdXbW1XQWlHb3ZWSlo2WDAxeThoU3luK0IvdGxyMC9jUjdTWGYrT2Y1CnBQcHlsNFJURGFYUU1oaFJkbGtVYkEvcjdGK0FqSFZEZzhPRm1QOU1uaTBONUhlRGswNjFsZ2VMS0JPYmpCbU4KUVNkSlFPN2U1aU5FT2R5aEl0YTZBL0k9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1NaWNyb3NlYyBlLVN6aWdubyBSb290IENBIDIwMDkgTz1NaWNyb3NlYyBMdGQuCiMgU3ViamVjdDogQ049TWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQSAyMDA5IE89TWljcm9zZWMgTHRkLgojIExhYmVsOiAiTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQSAyMDA5IgojIFNlcmlhbDogMTQwMTQ3MTI3NzYxOTU3ODQ0NzMKIyBNRDUgRmluZ2VycHJpbnQ6IGY4OjQ5OmY0OjAzOmJjOjQ0OjJkOjgzOmJlOjQ4OjY5OjdkOjI5OjY0OmZjOmIxCiMgU0hBMSBGaW5nZXJwcmludDogODk6ZGY6NzQ6ZmU6NWM6ZjQ6MGY6NGE6ODA6Zjk6ZTM6Mzc6N2Q6NTQ6ZGE6OTE6ZTE6MDE6MzE6OGUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDNjOjVmOjgxOmZlOmE1OmZhOmI4OjJjOjY0OmJmOmEyOmVhOmVjOmFmOmNkOmU4OmUwOjc3OmZjOjg2OjIwOmE3OmNhOmU1OjM3OjE2OjNkOmYzOjZlOmRiOmYzOjc4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFQ2pDQ0F2S2dBd0lCQWdJSkFNSitRd1JPUno4Wk1BMEdDU3FHU0liM0RRRUJDd1VBTUlHQ01Rc3dDUVlEClZRUUdFd0pJVlRFUk1BOEdBMVVFQnd3SVFuVmtZWEJsYzNReEZqQVVCZ05WQkFvTURVMXBZM0p2YzJWaklFeDAKWkM0eEp6QWxCZ05WQkFNTUhrMXBZM0p2YzJWaklHVXRVM3BwWjI1dklGSnZiM1FnUTBFZ01qQXdPVEVmTUIwRwpDU3FHU0liM0RRRUpBUllRYVc1bWIwQmxMWE42YVdkdWJ5NW9kVEFlRncwd09UQTJNVFl4TVRNd01UaGFGdzB5Ck9URXlNekF4TVRNd01UaGFNSUdDTVFzd0NRWURWUVFHRXdKSVZURVJNQThHQTFVRUJ3d0lRblZrWVhCbGMzUXgKRmpBVUJnTlZCQW9NRFUxcFkzSnZjMlZqSUV4MFpDNHhKekFsQmdOVkJBTU1IazFwWTNKdmMyVmpJR1V0VTNwcApaMjV2SUZKdmIzUWdRMEVnTWpBd09URWZNQjBHQ1NxR1NJYjNEUUVKQVJZUWFXNW1iMEJsTFhONmFXZHVieTVvCmRUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU9uNGovTmpyZHFHMktmZ1F2dlAKa2Q2bUp2aVpwV053clp1dXlqTkFmVzJXYnFFT1JPN2hFNTJVUWxLYXZYV0ZkQ3lvRGgyVHRoaTNqQ3lvei90YwpjYm5hN1A3b2ZvL2tMeDJ5cUhXSDJMZWg1VHZQbVVwRzBJTVpmY0NoRWh5VmJVcjAyTWVsVFRNdWhUbEFkWDRVCmZJQVNtRkRIUVdlNG9JQmhWS1pzVGgvZ25RNEg2Y202TStmK3dGVW9MQUtBcHhuMW50eFZVd09YZXdkSS81bjcKTjRva3hGbk1VQkJqanFxcEdyQ0VHb2I1WDd1eFVHNmswUXJNMVhGK0g2Y2JmUFZUYmlKZnl5dm0xSHhkcnRiQwp4a3psQlFIWjdWZjh3U041L1BySUpJT1Y4N1ZxVVFIUWQ5YnBFcUg1R29QN2dodTVzSmYwZGdZelEwbWcvd3UxCityVUNBd0VBQWFPQmdEQitNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEcKQTFVZERnUVdCQlRMRDhiZlFrUE1QY3UxU0NPaEducW1LcnMwYURBZkJnTlZIU01FR0RBV2dCVExEOGJmUWtQTQpQY3UxU0NPaEducW1LcnMwYURBYkJnTlZIUkVFRkRBU2dSQnBibVp2UUdVdGMzcHBaMjV2TG1oMU1BMEdDU3FHClNJYjNEUUVCQ3dVQUE0SUJBUURKMFE1ZUx0WE1zM3creS93OS93MG9sWk1FeUwvYXpYbTRRNUR3cEw3djh1OGgKbUx6VTFGMEc5dTVDN0RCc29LcXB5dkd2aXZvL0MzTnFQdW91UUg0ZnJsUmhlZXN1Q0RmWEkvT01uNzRkc2VHawpkZHVnNGxRVXNib2NLYVFZOWhLNm9oUVU0ekUxeUVEL3QrQUZkbGZCSEZueStML2s3U1ZpWElUd2ZuNGZzNzc1CnR5RVJ6QU1CVm5DbkVKSWVHelNCSHEyY0dzTUVQTzBDWWRZZUJ2TmZPb2Z5Sy9GRmgrVTlyTkhIVjRTOWE2N2MKMlBtMkcySndDejAyeVVMeU10ZDZZZWJTMnozUHlLbkptOXpiV0VUWGJ6aXZmM2pUbzYwYWRib2N3VFo4ang1dApITU4xUnE0MUJhYjJYRDBoN2xid3lZSWlMWHBVcTNERGZTSmxnbkNXCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIFJvb3QgQ0EgLSBSMwojIFN1YmplY3Q6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gUm9vdCBDQSAtIFIzCiMgTGFiZWw6ICJHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMyIKIyBTZXJpYWw6IDQ4MzU3MDMyNzg0NTk3NTk0MjYyMDk5NTQKIyBNRDUgRmluZ2VycHJpbnQ6IGM1OmRmOmI4OjQ5OmNhOjA1OjEzOjU1OmVlOjJkOmJhOjFhOmMzOjNlOmIwOjI4CiMgU0hBMSBGaW5nZXJwcmludDogZDY6OWI6NTY6MTE6NDg6ZjA6MWM6Nzc6YzU6NDU6Nzg6YzE6MDk6MjY6ZGY6NWI6ODU6Njk6NzY6YWQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGNiOmI1OjIyOmQ3OmI3OmYxOjI3OmFkOjZhOjAxOjEzOjg2OjViOmRmOjFjOmQ0OjEwOjJlOjdkOjA3OjU5OmFmOjYzOjVhOjdjOmY0OjcyOjBkOmM5OjYzOmM1OjNiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEWHpDQ0FrZWdBd0lCQWdJTEJBQUFBQUFCSVZoVENLSXdEUVlKS29aSWh2Y05BUUVMQlFBd1RERWdNQjRHCkExVUVDeE1YUjJ4dlltRnNVMmxuYmlCU2IyOTBJRU5CSUMwZ1VqTXhFekFSQmdOVkJBb1RDa2RzYjJKaGJGTnAKWjI0eEV6QVJCZ05WQkFNVENrZHNiMkpoYkZOcFoyNHdIaGNOTURrd016RTRNVEF3TURBd1doY05Namt3TXpFNApNVEF3TURBd1dqQk1NU0F3SGdZRFZRUUxFeGRIYkc5aVlXeFRhV2R1SUZKdmIzUWdRMEVnTFNCU016RVRNQkVHCkExVUVDaE1LUjJ4dlltRnNVMmxuYmpFVE1CRUdBMVVFQXhNS1IyeHZZbUZzVTJsbmJqQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNd2xkcEI1Qm5naUZ2WEFnN2FFeWlpZS9RVjJFY1d0aUhMOApSZ0pEeDdLS25RUmZKTXN1UytGZ2drYmhVcXNNZ1Vkd2JOMWswZXYxTEtNUGdqME1LNjZYMTdZVWhoQjV1enNUCmdIZU1DT0ZKMG1waUx4OWUrcFpvMzRrbmxUaWZCdGMreWNzbVdRMXozckRJNlNZT2d4WEc3MXVMMGdSZ3lrbW0KS1BacE8vYkx5Q2lSNVoyS1lWYzNySFFVM0hUZ091NXlMeTZjKzlDN3YvVTlBT0VHTStpQ0s2NVRwam9XYzR6ZApRUTRnT3NDMHA2SHBzaytRTGpKZzZWZkx1UVNTYUdqbE9DWmdkYktmZC8rUkZPK3VJRW44clVBVlNORUNNV0VaClhyaVg3NjEzdDJTYWVyOWZ3UlB2bTJMN0RXemdWR2tXcVFQYWJ1bURrM0YyeG1tRmdoY0NBd0VBQWFOQ01FQXcKRGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGSS93UzMrbwpMa1VrcmsxUSttT2FpOTdpM1J1OE1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQkxRTnZBVUtyK3lBenY5NVpVClJVbTdsZ0FKUWF5ekU0YUdLQWN6eW12bWRMbTZBQzJ1cEFyVDlmSHhENHEvYzJkS2c4ZEVlM2pncjI1c2J3TXAKampNNVJjT081TGxYYktyOEVwYnNVOFl0NUNSc3VaUmorOXhUYUdkV1BvTzR6elVodzhsby9zN2F3bE9xekpDSwo2ZkJkUm95VjNYcFlLQm92SGQ3TkFEZEJqKzFFYmRkVEtKZCs4MmNFSGhYWGlwYTAwOTVNSjZSTUczTnpkdlFYCm1jSWZlZzdqTFFpdENod3MvenlyVlE0UGtYNDI2OE5YU2I3aExpMThZSXZEUVZFVEk1M085ekpybEFHb21lY3MKTXg4Nk95WFNoa0RPT3l5R2VNbGhMeFM2N3R0VmI5K0U3Z1VKVGIwbzJITE8wMkpRWlI3cmtwZURNZG16dGNwSApXRDlmCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgKIyBTdWJqZWN0OiBDTj1BdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgKIyBMYWJlbDogIkF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2OCIKIyBTZXJpYWw6IDYwNDcyNzQyOTcyNjI3NTM4ODcKIyBNRDUgRmluZ2VycHJpbnQ6IDczOjNhOjc0OjdhOmVjOmJiOmEzOjk2OmE2OmMyOmU0OmUyOmM4OjliOmMwOmMzCiMgU0hBMSBGaW5nZXJwcmludDogYWU6YzU6ZmI6M2Y6Yzg6ZTE6YmY6YzQ6ZTU6NGY6MDM6MDc6NWE6OWE6ZTg6MDA6Yjc6Zjc6YjY6ZmEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDA0OjA0OjgwOjI4OmJmOjFmOjI4OjY0OmQ0OjhmOjlhOmQ0OmQ4OjMyOjk0OjM2OjZhOjgyOjg4OjU2OjU1OjNmOjNiOjE0OjMwOjNmOjkwOjE0OjdmOjVkOjQwOmVmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHRkRDQ0EveWdBd0lCQWdJSVUrdzc3dnV5U0Y4d0RRWUpLb1pJaHZjTkFRRUZCUUF3VVRFTE1Ba0dBMVVFCkJoTUNSVk14UWpCQUJnTlZCQU1NT1VGMWRHOXlhV1JoWkNCa1pTQkRaWEowYVdacFkyRmphVzl1SUVacGNtMWgKY0hKdlptVnphVzl1WVd3Z1EwbEdJRUUyTWpZek5EQTJPREFlRncwd09UQTFNakF3T0RNNE1UVmFGdzB6TURFeQpNekV3T0RNNE1UVmFNRkV4Q3pBSkJnTlZCQVlUQWtWVE1VSXdRQVlEVlFRREREbEJkWFJ2Y21sa1lXUWdaR1VnClEyVnlkR2xtYVdOaFkybHZiaUJHYVhKdFlYQnliMlpsYzJsdmJtRnNJRU5KUmlCQk5qSTJNelF3Tmpnd2dnSWkKTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFES2xtdU82dmo3OGFJMTRIOU0ydUREVXRkOQp0aERJQWw2elF5ckVUMnF5eWh4ZEtKcDRFUnBwV1ZldnRTQkM1SXNQNXQ5YnBnT1NML1VSNUdMWE1uRTQyUVFNCmNhczlVWDRQQjk5akJWenB2NVJ2d1NtQ3dMVGFVYkRCUEx1dE4wcGN5dkZMTmc0a3E3L0RoSGY5cUZEMHNlZkcKTDlJdFdZMTZDazZXYVZJQ3FqYVk3UHo2RklNTU54L0pramQvMTRFdDVjUzU0RDQwL21mMFBtYlIwL1JBejE1aQpOQTl3Qmo0Z0dGck85M0liSld5VGRCU1RvM094RHFxSEVDTlpYeUFGR1VmdGFJNlNFc3BkL05ZcnNwSThJTS9oClg2OGd2cUIyZjNibDdCcUdZVE0rNTN1MFA2QVBqcUs1YW0rNWh5WnZRV3lJcGxEOWFtTUw5Wk1XR3htUHN1MmIKbThtUTlRRU0zeGs5RHo0NEk4a3Zqd3pSQXY0YlZkWk8wSTA4cjArazgvNnZLdE1GblhrSW9jdFhNYlNjeUpDeQpaL1FZRnBNNi9FZlkwWGlXTVIrNkt3eGZYWm10WTRsYUpDQjIyTi85cTA2bUlxcWRYdVluaW4xb0thUG5pcmphCkVic1hMWm1kRXlSRzk4WGkySitPZjhlUGRHMWFzdWh5OWF6dUpCQ3RMeFRhL3kyYVJuRkh2a0xmdXdIYjlIL1QKS0k4eFdWdlR5UUttdEZMS2JwZjdROFVJSm0rSzlMdjlueWlxRGRWRjh4TTZIZGpBZUk5Qlp6d2VsR1N1ZXd2Rgo2TmtCaURrYWw0WmtRZFU3aHd4dStnL0d2VWdVdnpsTjFKNUJ0bytXSFdPV2s5bVZCbmd4YUo0M0JqdUFpVVZoCk9TUEhHMFNqRmVVYytKSXd1d0lEQVFBQm80SHZNSUhzTUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFFd0RnWUQKVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUmx6ZXVyTlI0QVBuN1ZkTUFjdEhOSERocGtMekNCcGdZRApWUjBnQklHZU1JR2JNSUdZQmdSVkhTQUFNSUdQTUM4R0NDc0dBUVVGQndJQkZpTm9kSFJ3T2k4dmQzZDNMbVpwCmNtMWhjSEp2Wm1WemFXOXVZV3d1WTI5dEwyTndjekJjQmdnckJnRUZCUWNDQWpCUUhrNEFVQUJoQUhNQVpRQnYKQUNBQVpBQmxBQ0FBYkFCaEFDQUFRZ0J2QUc0QVlRQnVBRzhBZGdCaEFDQUFOQUEzQUNBQVFnQmhBSElBWXdCbApBR3dBYndCdUFHRUFJQUF3QURnQU1BQXhBRGN3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUJkOW9QbTAzY1hGCjY2MUxKTFdoQXF2ZHBZaEtzZzlWU3l0WGpEdmxNZDMreERMeDUxdGtsall5R095bE1uZlg0MFMyd0JFcWdMazkKYW01OG05T3QvTVBXbytaa0tYelI0VGdlZ2l2L0oyV3YreFlWeEM1eGhPVzEvL3FrUjcxa01ydjJKWVNpSjBMMQpJTERDRXhBUnpSQVZ1a0tRS3RKRTRaWW02ekZJRXYwcTJza0d6M1FlcVV2Vmh5ajVlVFNTUGk1RTZQYVBUNDgxClB5V3pPZHhqS3BCcklGL0VVaEpPbHl3cXJKMlgza2p5bzJiYnd0S0RsYVptcDU0bEQra0xNNUZsQ2xyRDJWUVMKM2EvRFRnNGZKbDROM0xPTjdOV0JjTjdTVHlRRjgyeE85VXhKWm8zUi85SUxKVUZJL2xHRXhrS3ZnQVRQMEg1awpTZVR5MzZMc3NVekFLaDNudExGbG9zUzg4WmowcW5BSFk3UzQyanRNK2tBaU1Gc1JwdkFGRHNZQ0EwaXJocHVGCjNkdmQ2cUoyZ0hOOTlad0V4RVdONTdrY2k1N3ExM1hSY3JIZWRVVG5RbjNpVjJ0OTNKbThQWU1vNm9DVGpjVk0KWmNGd2diZzQvRU14c3ZZRE5FZXlyUHNpQnNzZTNSZEhIRjltdWRNYW90b1JzYVM4SThua3ZvZi91WlMyK0YwZwpTdFJmNTcxb2UyWHlGUjdTT3FrdDZkaHJKS3lYV0VSSHJWa1k4U0ZsY043T05HQ29RUEh6UEtUREtDT00vaWN6ClEwQ2dGenpyNmp1d2NxYWp1VXBMWGhaSTlMSzh5SXlTeFoyZnJISTJ2RFNBTkd1cGk1TEF1QmZ0N0haVDlTUUIKakxNaTZFdDhWY2FkK3FNVXUyV0ZibTVQRW40S1BKMlYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUl6ZW5wZS5jb20gTz1JWkVOUEUgUy5BLgojIFN1YmplY3Q6IENOPUl6ZW5wZS5jb20gTz1JWkVOUEUgUy5BLgojIExhYmVsOiAiSXplbnBlLmNvbSIKIyBTZXJpYWw6IDkxNzU2MzA2NTQ5MDM4OTI0MTU5NTUzNjY4Njk5MTQwMjYyMQojIE1ENSBGaW5nZXJwcmludDogYTY6YjA6Y2Q6ODU6ODA6ZGE6NWM6NTA6MzQ6YTM6Mzk6OTA6MmY6NTU6Njc6NzMKIyBTSEExIEZpbmdlcnByaW50OiAyZjo3ODozZDoyNTo1MjoxODphNzo0YTo2NTozOTo3MTpiNToyYzphMjo5Yzo0NToxNTo2ZjplOToxOQojIFNIQTI1NiBGaW5nZXJwcmludDogMjU6MzA6Y2M6OGU6OTg6MzI6MTU6MDI6YmE6ZDk6NmY6OWI6MWY6YmE6MWI6MDk6OWU6MmQ6Mjk6OWU6MGY6NDU6NDg6YmI6OTE6NGY6MzY6M2I6YzA6ZDQ6NTM6MWYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUY4VENDQTltZ0F3SUJBZ0lRQUxDM1doWklYNy9oeS9XTDF4bm1mVEFOQmdrcWhraUc5dzBCQVFzRkFEQTQKTVFzd0NRWURWUVFHRXdKRlV6RVVNQklHQTFVRUNnd0xTVnBGVGxCRklGTXVRUzR4RXpBUkJnTlZCQU1NQ2tsNgpaVzV3WlM1amIyMHdIaGNOTURjeE1qRXpNVE13T0RJNFdoY05NemN4TWpFek1EZ3lOekkxV2pBNE1Rc3dDUVlEClZRUUdFd0pGVXpFVU1CSUdBMVVFQ2d3TFNWcEZUbEJGSUZNdVFTNHhFekFSQmdOVkJBTU1Da2w2Wlc1d1pTNWoKYjIwd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURKMDNyS0R4NnNwNGJvRm1WcQpzY0liUlRKeGxkbitFRnZNcitlbGVRR1BpY1BLOGxWeDkzZStkNVR6Y3FRc1JOaWVrcHNVT3FIbkpKQUtDbGFPCnhkZ21sT0haU09FdFB0b0tjdDJqbVJYYWdhS0g5SHR1Sm5lSldLM1c2d3l5UVhwemJtM2JlbmhCNlFpSUVuNkgKTG1ZUlkyeFUrenlkY3NDOEx2L0N0OTBOZHVNNjEvZTBhTDZpOWVPQmJzRkdiMTJONEUzR1ZGV0pHak14Q3JGWAp1YU9LbU1Qc096VEZsVUZwZm5YQ1BDREZZYnBSUjZBZ2tKT2hrRXZ6VG55RlJWU2EwUVVtUWJDMVRSMHp2c1FECnlDVjh3WERiTy9RSkxWUW5TS3d2NGNTc1Bzakxra3hUT1RjajdOTUIrZUFKUkUxTlpNRGhEVnFISXJ5dEc2UCsKSnJVVjg2ZjhoQm5wN0tHSXRFUnBoSVB6aWRGMEJxbk1DOWJDM2llRlVDYktGN2pKZW9kV0xCb0JIbXkrRTYwUQpyTFVrOVRpUm9kWkwydkc3MHQ1SHRmRzhnZlpaYTg4WlUrbU5GY3RLeTZsdlJPVWJRYy9oaHFmSzBHcWZ2RXlOCkJqTmFvb1hsa0RXZ1lsd1dUdkRqb3ZvREdyUXNjYk5ZTE41N0M5c2FEK3ZlSVI4R2R3WURzTW52bWZ6QXVVOEwKaGlqKzBybnE0OXFsdzBkcEV1RGI4UFlaaSsxN2NOY0MxdTJIR0Nnc0JDUk1kK1JJaWhyR081clVEOHI2ZGRJQgpRRnFOZWIrTHowdlBxaGJCbGVTdFRJbytGNUhVc1dMbGd1V0FCS1FEZm8yLzJuK2lENWRQRE5NTis5ZlI1WEorCkhNaDMvMXVhRDdldUJVYmw4YWdXN0Vla0Z3SURBUUFCbzRIMk1JSHpNSUd3QmdOVkhSRUVnYWd3Z2FXQkQybHUKWm05QWFYcGxibkJsTG1OdmJhU0JrVENCampGSE1FVUdBMVVFQ2d3K1NWcEZUbEJGSUZNdVFTNGdMU0JEU1VZZwpRVEF4TXpNM01qWXdMVkpOWlhKakxsWnBkRzl5YVdFdFIyRnpkR1ZwZWlCVU1UQTFOU0JHTmpJZ1V6Z3hRekJCCkJnTlZCQWtNT2tGMlpHRWdaR1ZzSUUxbFpHbDBaWEp5WVc1bGJ5QkZkRzl5WW1sa1pXRWdNVFFnTFNBd01UQXgKTUNCV2FYUnZjbWxoTFVkaGMzUmxhWG93RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQwpBUVl3SFFZRFZSME9CQllFRkIwY1pRNm84aVY3dEpIUDVMR3g1cjFWZEd3Rk1BMEdDU3FHU0liM0RRRUJDd1VBCkE0SUNBUUI0cGd3V1NwOU1pRHJBeXc2bEZuMmZ1VWhmR0k4TllqYjJ6Umxyckt2VjlwRjlybkh6UDdNT2VJV2IKbGFRbklVZENTbnhJT3ZWRmZMTU1qbEY0ckpVVDNzYjlmYmdha0V5cmtnUEg3VUlCemcvWXNmcWlrdUZnYmE1Ngphd21xeGludWFFbG5NSUFrZWpFV09WdCs4Und1M1d3SnJmSXh3WUpPdWJ2NXZyOHFoVC9BUUtNNldmeFpTendvCkpOdTBGWFd1RFlpNkxuUEF2VmlINVVMeTYxN3VIakFpbWNzMzBjUWhiSUhzdm0wbTVoemtRaUNlUjdDc2cxbHcKTERYV3J6WTB0TTA3K0RLbzcrTjRpZnVOUlN6YW5MaCtRQnhoNXo2aWtpeEw4czM2bUxZcC8vUHllNmtmTHFDVApWeXZlaFFQNWFUZkxubmhxQmJURk1YaUo3SHFuaGVHNWV6emV2aDU1aE02ZmNBNVp3alV1a0NveDJlUkZla0drCkxoT2JOQTVtZTBtclpKZlFSc041blhKUVk2YVlXd2E5U0czWU9ZTnc2RFh3QmRHcXZPUGJ5QUxxZlAyQzJzSmIKVWpXdW1EcXR1aldUSTZjZlNOMDFScGl5RUdqa3BUSENDbGd1R1lFUXlWQjEvT3BhRnM0UjErN3ZVSWd0WWY4LwpRbk1GbEVQVmpqeE9BVG9acFI5R1RuZlFYZVdCSWlHSC9wUjloTmlUcmRab1EwaXkyK3R6Sk9lUmYxU2t0b0ErCm5hTThUSExDVjhTZzFNdzRKODdWQnA2aVNObnBuODZDY0RhVG1qdmZsaUhqV2JjTTJwRTM4UDFaV3JPWnlHbHMKUXlZQk5XTmdWWWtET25YWXVrclpWUC91M29EWUxkRTQxVjR0QzVoOVBtemIvQ2FJeHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDggTz1BQyBDYW1lcmZpcm1hIFMuQS4KIyBTdWJqZWN0OiBDTj1DaGFtYmVycyBvZiBDb21tZXJjZSBSb290IC0gMjAwOCBPPUFDIENhbWVyZmlybWEgUy5BLgojIExhYmVsOiAiQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgiCiMgU2VyaWFsOiAxMTgwNjgyMjQ4NDgwMTU5NzE0NgojIE1ENSBGaW5nZXJwcmludDogNWU6ODA6OWU6ODQ6NWE6MGU6NjU6MGI6MTc6MDI6ZjM6NTU6MTg6MmE6M2U6ZDcKIyBTSEExIEZpbmdlcnByaW50OiA3ODo2YTo3NDphYzo3NjphYjoxNDo3Zjo5Yzo2YTozMDo1MDpiYTo5ZTphODo3ZTpmZTo5YTpjZTozYwojIFNIQTI1NiBGaW5nZXJwcmludDogMDY6M2U6NGE6ZmE6YzQ6OTE6ZGY6ZDM6MzI6ZjM6MDg6OWI6ODU6NDI6ZTk6NDY6MTc6ZDg6OTM6ZDc6ZmU6OTQ6NGU6MTA6YTc6OTM6N2U6ZTI6OWQ6OTY6OTM6YzAKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUhUekNDQlRlZ0F3SUJBZ0lKQUtQYVFuNmtzYTdhTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUd1TVFzd0NRWUQKVlFRR0V3SkZWVEZETUVFR0ExVUVCeE02VFdGa2NtbGtJQ2h6WldVZ1kzVnljbVZ1ZENCaFpHUnlaWE56SUdGMApJSGQzZHk1allXMWxjbVpwY20xaExtTnZiUzloWkdSeVpYTnpLVEVTTUJBR0ExVUVCUk1KUVRneU56UXpNamczCk1Sc3dHUVlEVlFRS0V4SkJReUJEWVcxbGNtWnBjbTFoSUZNdVFTNHhLVEFuQmdOVkJBTVRJRU5vWVcxaVpYSnoKSUc5bUlFTnZiVzFsY21ObElGSnZiM1FnTFNBeU1EQTRNQjRYRFRBNE1EZ3dNVEV5TWprMU1Gb1hEVE00TURjegpNVEV5TWprMU1Gb3dnYTR4Q3pBSkJnTlZCQVlUQWtWVk1VTXdRUVlEVlFRSEV6cE5ZV1J5YVdRZ0tITmxaU0JqCmRYSnlaVzUwSUdGa1pISmxjM01nWVhRZ2QzZDNMbU5oYldWeVptbHliV0V1WTI5dEwyRmtaSEpsYzNNcE1SSXcKRUFZRFZRUUZFd2xCT0RJM05ETXlPRGN4R3pBWkJnTlZCQW9URWtGRElFTmhiV1Z5Wm1seWJXRWdVeTVCTGpFcApNQ2NHQTFVRUF4TWdRMmhoYldKbGNuTWdiMllnUTI5dGJXVnlZMlVnVW05dmRDQXRJREl3TURnd2dnSWlNQTBHCkNTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDdkFNdHdOeXVBV2tvNmJIaVVmYU4vR2gvMk5kVzkKMjhzTlJISStKcktRVXJwak95aFliNld6YlpTbTg5MWtERlgyOXVmeUlpS0FYdUZpeHJZcDRZRnM4ci9sZlRKcQpWS0F5R1ZuK0g0dlhQV0NHaFNSdjR4R3pkejRnbGpVaGE3TUkyWEF1WlBlRWtsUFdEckNRaW9yamg0MEcwNzJRCkR1S1pvUnVHRHRxYUNyc0xZVkFHVXZHZWYzYnN5dy9RSGczUG1UQTlITVJGRUZpczF0UG8xK1hxeFFFSGQ5WlIKNWdOL2lraWxUV2gxdWVtOG5rNFpjZlV5UzV4dFlCa0wrOHlkZGR5L0pzMlBrM2c1ZVhOZUpRN0tYT3QzRWdmTApaRUZIY3BPclVNUHJDWFprTk5JNXQzWVJDUTEyUmNTcHJqMXFyN1Y5WlMrVVdCRHNYSHl2ZnVLMkdOblFtMDVhClNkK3BaZ3ZNUE1aNGZLZWNIZVBPamxPK0JkNWdEMnZsR3RzLzQrRWh5U25COGVzSG5GSWJBVVJSUEhzbDE4VGwKVWxSZEpRZktGaUM0cmVSQjdub0kvcGx2ZzZhUkFyQnNObFZxNTMzMWx1YktnZGFYOFpTRDZlMndzV3NTYVI2cworMTJweFpqcHRGdFllcjQ5b2tRNlkxblVDeVhlRzArOTVRR2V6ZElwMVo4WEdRcHZ2d3lRMHdsZjJlT0tOY3g1CldrMFpONUszeE1HdHIvUjVKSnF5QVF1eHIxeVc4NEF5KzF3OW1QR2dQMHJldnErVUx0bFZtaGR1WUoxamJMaGoKeWE2QlhCZzE0SkM3dmp4UE55SzVmdXZQbm5jaHBqMDRnZnRJMmpFOUsrT0o5ZEMxdlg3Z1VNUVNpYk1qbWhBeApoZHV1Yis4NE14aDJFUUlEQVFBQm80SUJiRENDQVdnd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkREQWRCZ05WCkhRNEVGZ1FVK1NTc0Q3SzErSG5BK21DSUc4VFpUUUtlRnhrd2dlTUdBMVVkSXdTQjJ6Q0IySUFVK1NTc0Q3SzEKK0huQSttQ0lHOFRaVFFLZUZ4bWhnYlNrZ2JFd2dhNHhDekFKQmdOVkJBWVRBa1ZWTVVNd1FRWURWUVFIRXpwTgpZV1J5YVdRZ0tITmxaU0JqZFhKeVpXNTBJR0ZrWkhKbGMzTWdZWFFnZDNkM0xtTmhiV1Z5Wm1seWJXRXVZMjl0CkwyRmtaSEpsYzNNcE1SSXdFQVlEVlFRRkV3bEJPREkzTkRNeU9EY3hHekFaQmdOVkJBb1RFa0ZESUVOaGJXVnkKWm1seWJXRWdVeTVCTGpFcE1DY0dBMVVFQXhNZ1EyaGhiV0psY25NZ2IyWWdRMjl0YldWeVkyVWdVbTl2ZENBdApJREl3TURpQ0NRQ2oya0orcExHdTJqQU9CZ05WSFE4QkFmOEVCQU1DQVFZd1BRWURWUjBnQkRZd05EQXlCZ1JWCkhTQUFNQ293S0FZSUt3WUJCUVVIQWdFV0hHaDBkSEE2THk5d2IyeHBZM2t1WTJGdFpYSm1hWEp0WVM1amIyMHcKRFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUpBU3J5STF3cU01OEM3ZTZiWHBlSHhJdmo5OVJaSmU2ZHF4R2Z3VwpQSiswVzJhZWF1ZkR1VjJJNkErdHp5TVAzaVU2WHN4UHBjRzFMYXdrMGxnSDNxTFBhWVJnTStnUURST3BJOUNGCjVZNTdwcDQ5Y2hOeU0vV3FmY1pqSHdqMC9nRi9KTThyTEZRSjN1SXJiWkxHT1U4VzZqeCtla2JVUldwR3FPdDEKZ2xhbnE2QjhhQk16OXAwdzhHOG5PU1FqS3BEOWtDazE4cFBmTktYRzkvanZqQTlpU255dTAvVlUrSTIybWxhSApGb0k2TTZ0YUlnajNncnJxTHVCSG1yUzFSYU1GTzluY0xrVkFPK3JjZitnNzY5SHNKdGcxcERERk9xeFhuck4yCnBTQjcrUjVLQldJQnBpaDFZSmVTRFc0K1RUZEREWklWbkJnaXpWR1pvQ2thUEYrS01qTmJNTWVKTDBlWUQ2TUQKeHZieHJOOHk4Tm1CR3VTY3ZmYUFGUERSTExtRjlkaWpzY2lsSWVVY0U1ZnVEcjNmS2Fudk5GTmIwK1JxRTRRRwp0aklDeEZLdUl0TGNzaUZDR3RwQThDbko3QW9NWE9MUXVzeEkwemNLekJJS2lubXdQUU4vYVV2ME5DQjlzelRxCmprdGs5VDc5c3lObkZRMEV1UEF0d1FsUlBMSnNGZkNsSTllRGRPVGxMc24rbUNkQ3hxdkduckRRV3ppbG0xRGUKZmhpWXRVVTc5bm0wNlBjYWV3YUQrOUNMMnJ2SHZSaXJDRzg4Z0d0QVB4a1p1bVdLNXI3VlhOTTIxKzlBVWlSZwpPR2NFTWV5UDg0TEczcmxWOHpzeGtWcmN0UWdWclhZbENnMTdMb2ZpREtZR3ZDWVFiVGVkN04xNGpIeUF4ZkRaCmQwalEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwOCBPPUFDIENhbWVyZmlybWEgUy5BLgojIFN1YmplY3Q6IENOPUdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwOCBPPUFDIENhbWVyZmlybWEgUy5BLgojIExhYmVsOiAiR2xvYmFsIENoYW1iZXJzaWduIFJvb3QgLSAyMDA4IgojIFNlcmlhbDogMTQ1NDE1MTE3NzMxMTE3ODg0OTQKIyBNRDUgRmluZ2VycHJpbnQ6IDllOjgwOmZmOjc4OjAxOjBjOjJlOmMxOjM2OmJkOmZlOjk2OjkwOjZlOjA4OmYzCiMgU0hBMSBGaW5nZXJwcmludDogNGE6YmQ6ZWU6ZWM6OTU6MGQ6MzU6OWM6ODk6YWU6Yzc6NTI6YTE6MmM6NWI6Mjk6ZjY6ZDY6YWE6MGMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDEzOjYzOjM1OjQzOjkzOjM0OmE3OjY5OjgwOjE2OmEwOmQzOjI0OmRlOjcyOjI4OjRlOjA3OjlkOjdiOjUyOjIwOmJiOjhmOmJkOjc0Ojc4OjE2OmVlOmJlOmJhOmNhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlIU1RDQ0JUR2dBd0lCQWdJSkFNbk4wK25WZlNQT01BMEdDU3FHU0liM0RRRUJCUVVBTUlHc01Rc3dDUVlEClZRUUdFd0pGVlRGRE1FRUdBMVVFQnhNNlRXRmtjbWxrSUNoelpXVWdZM1Z5Y21WdWRDQmhaR1J5WlhOeklHRjAKSUhkM2R5NWpZVzFsY21acGNtMWhMbU52YlM5aFpHUnlaWE56S1RFU01CQUdBMVVFQlJNSlFUZ3lOelF6TWpnMwpNUnN3R1FZRFZRUUtFeEpCUXlCRFlXMWxjbVpwY20xaElGTXVRUzR4SnpBbEJnTlZCQU1USGtkc2IySmhiQ0JECmFHRnRZbVZ5YzJsbmJpQlNiMjkwSUMwZ01qQXdPREFlRncwd09EQTRNREV4TWpNeE5EQmFGdzB6T0RBM016RXgKTWpNeE5EQmFNSUdzTVFzd0NRWURWUVFHRXdKRlZURkRNRUVHQTFVRUJ4TTZUV0ZrY21sa0lDaHpaV1VnWTNWeQpjbVZ1ZENCaFpHUnlaWE56SUdGMElIZDNkeTVqWVcxbGNtWnBjbTFoTG1OdmJTOWhaR1J5WlhOektURVNNQkFHCkExVUVCUk1KUVRneU56UXpNamczTVJzd0dRWURWUVFLRXhKQlF5QkRZVzFsY21acGNtMWhJRk11UVM0eEp6QWwKQmdOVkJBTVRIa2RzYjJKaGJDQkRhR0Z0WW1WeWMybG5iaUJTYjI5MElDMGdNakF3T0RDQ0FpSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU1EZlZ0UGtPcHQyUmJRVDIvL0J0aG1MTjBFWWxWSkg2eGVkCktZaU9OV3dHTWk1SFl2TkpCTDk5UkRheGNjeTlXZ2x6MWRtRlJQK1JWeVhmWGphT2NORmNjVU1kMmRydlhOTDcKRzcwNnRjdXRvOHhFcHcydUlSVS91WHBia25YWXBCSTRpUm1LdDREUzRqSnZWcHlSMW9nUUM3TjBaSkowWVBQMgp6eGhQWUxJajBNYzd6bUZMbVkvQ0ROQkFzcGpjRGFoT283a0tybUNnclVWU1k3cG12V2pnK2I0YXFJRzdIa0Y0CmRkUEIvZ0JWc0lkVTZDZVFOUjFNTTYyWC9KY3VtSVMvTE1tanY5R1lFUlR0WS9qS21JaFlGNW50UlFPWGZqeUcKSG9pTXZ2S1JoSTlsTk5nQVRIMjNNUmRhS1hvS0dDUXdvemUxZXFrQmZTYlcrUTZPV2ZIOUd6TzFLVHNYTzBHMgpJZDNVd0QybG41OGZRMURKdTd4c2VwZVk3czJNSC91Y1VhNkxjTDBubjNIQWE2eDlrR2JvMTEwNkRiRFZ3bzNWCnlKMmR3VzNRMEw5UjVPUDR3emcycnRhbmRlYXZoRU5kazVJTWFnZmVPeDJZSXRhc3dUWGJvNkFsLzNLMWRoM2UKYmVrc1ppeFNoTkJGa3M0YzVlVXpIZHdIVTFTanFvSTdtamN2M04yZ1pPbm0zYjJ1L0dTRkhUeW55UWJlaFA5cgo2R3NhUE1XaXMwTDdpd2srWHdoU3gyTEUxQVZ4djhSazVQaWhnK2crRXB1b0h0UTJUUzl4OW8wbzlvT3BFOUpoCndaRzdTTUEwajBHTVMwemJhUkwvVUpTY0lJTlpjKzE4b2ZMeC9kMzNTZE5EV0tCV1k4bzlQZVUxVmxucERzb2cKekN0TGt5a1BBZ01CQUFHamdnRnFNSUlCWmpBU0JnTlZIUk1CQWY4RUNEQUdBUUgvQWdFTU1CMEdBMVVkRGdRVwpCQlM1Q2NxY0h0dlRiRHBycnUxVThWdVRCalV1WGpDQjRRWURWUjBqQklIWk1JSFdnQlM1Q2NxY0h0dlRiRHByCnJ1MVU4VnVUQmpVdVhxR0JzcVNCcnpDQnJERUxNQWtHQTFVRUJoTUNSVlV4UXpCQkJnTlZCQWNUT2sxaFpISnAKWkNBb2MyVmxJR04xY25KbGJuUWdZV1JrY21WemN5QmhkQ0IzZDNjdVkyRnRaWEptYVhKdFlTNWpiMjB2WVdSawpjbVZ6Y3lreEVqQVFCZ05WQkFVVENVRTRNamMwTXpJNE56RWJNQmtHQTFVRUNoTVNRVU1nUTJGdFpYSm1hWEp0CllTQlRMa0V1TVNjd0pRWURWUVFERXg1SGJHOWlZV3dnUTJoaGJXSmxjbk5wWjI0Z1VtOXZkQ0F0SURJd01EaUMKQ1FESnpkUHAxWDBqempBT0JnTlZIUThCQWY4RUJBTUNBUVl3UFFZRFZSMGdCRFl3TkRBeUJnUlZIU0FBTUNvdwpLQVlJS3dZQkJRVUhBZ0VXSEdoMGRIQTZMeTl3YjJ4cFkza3VZMkZ0WlhKbWFYSnRZUzVqYjIwd0RRWUpLb1pJCmh2Y05BUUVGQlFBRGdnSUJBSUNJZjNEZWtpalpCWlJHLzVCWHFmRXYzeG9OYS9wOERoeEpKSGtuMkVhcWJ5bFoKVW9od0V1cmRQZldiVTFSdjRXQ2lxQW01N090WmZNWTE4ZHdZNmZGbjVhKzZSZUFKM3NwRUQ4SVhEbmVSUlhvegpYMStXTEdpTHdVZVBtSnM5d096TDlkV0Nrb1ExMGI0Mk9GWnlNVnRITGFvWHBHTlI2d29Cclgvc2RaN0xvUi94CmZ4S3h1ZVJrZjJmV0l5cjB1RGxkbU9naHArRzlQVUlhZEpwd3IyaHNVRjFKei8vN0RsM21MRWZYZ1RwWkFMVnoKYTJNZzlqRkZDRGtPOUhCK1FIQmFQOUJyUXFsMFBTZ3ZBbTExY3BVSmpVaGp4c1lqVjVLVFhqWEJqZmtLOXl5ZApZaHoyclh6ZHBqRWV0ckhIZm9VbStxUnF0ZHBqTU5Idmt6ZXlaaTk5QmZmbnQwdVlsRFhBMlRvcHdaMnlVRE1kClNxbGFwc2tENyszMDU2aHVpclJYaE91a1A5RHVxcXFIVzJQb2srSnJxTlM0Y25ockcrMDU1RjNMbTZxSDFVOU8KQVA3WmFwODhNUThvQWdGOW1PaW5zS0prbm5uNFNQSVZxY3pteUVUclAzaVo4bnR4UGp6eG1LZkZHQkkvNXJzbwpNMExwUlFwOGJmS0dlUy9GZ2hsOUNZbDhzbFIyaUs3ZXdmUE00VzdiTWRhVHJwbWc3eVZxYzVpSld6b3VFNGdlCnY4Q1NsRFFiNHllM2l4NXZRdi9uNlRlYlVCMHRvdmtDN3N0WVdEcHh2R2pqcXNHdkhDZ2ZvdHdqWlQrQjZxNloKMDlnd3p4TU5UeFhKaEx5blNDMzRNQ04zMkVaTGVXMzJqTzA2ZjJBUmVQVHBtNjdWVk1CMGdORUxRcC9CCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIE89R29EYWRkeS5jb20sIEluYy4KIyBTdWJqZWN0OiBDTj1HbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIE89R29EYWRkeS5jb20sIEluYy4KIyBMYWJlbDogIkdvIERhZGR5IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiA4MDozYTpiYzoyMjpjMTplNjpmYjo4ZDo5YjozYjoyNzo0YTozMjoxYjo5YTowMQojIFNIQTEgRmluZ2VycHJpbnQ6IDQ3OmJlOmFiOmM5OjIyOmVhOmU4OjBlOjc4Ojc4OjM0OjYyOmE3OjlmOjQ1OmMyOjU0OmZkOmU2OjhiCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0NToxNDowYjozMjo0NzplYjo5YzpjODpjNTpiNDpmMDpkNzpiNTozMDo5MTpmNzozMjo5MjowODo5ZTo2ZTo1YTo2MzplMjo3NDo5ZDpkMzphYzphOToxOTo4ZTpkYQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHhUQ0NBcTJnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JnekVMTUFrR0ExVUVCaE1DVlZNeApFREFPQmdOVkJBZ1RCMEZ5YVhwdmJtRXhFekFSQmdOVkJBY1RDbE5qYjNSMGMyUmhiR1V4R2pBWUJnTlZCQW9UCkVVZHZSR0ZrWkhrdVkyOXRMQ0JKYm1NdU1URXdMd1lEVlFRREV5aEhieUJFWVdSa2VTQlNiMjkwSUVObGNuUnAKWm1sallYUmxJRUYxZEdodmNtbDBlU0F0SUVjeU1CNFhEVEE1TURrd01UQXdNREF3TUZvWERUTTNNVEl6TVRJegpOVGsxT1Zvd2dZTXhDekFKQmdOVkJBWVRBbFZUTVJBd0RnWURWUVFJRXdkQmNtbDZiMjVoTVJNd0VRWURWUVFICkV3cFRZMjkwZEhOa1lXeGxNUm93R0FZRFZRUUtFeEZIYjBSaFpHUjVMbU52YlN3Z1NXNWpMakV4TUM4R0ExVUUKQXhNb1IyOGdSR0ZrWkhrZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrZ0xTQkhNakNDQVNJdwpEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDl4WWdqeCtsazA5eHZKR0tQM2dFbFk2U0tECkU2YkZJRU1CTzRUeDVvVkpueWZxOW9RYlRxQzAyM0NZeHpJQnNRVStCMDd1OVBwUEwxa3dJdWVyR1ZacjRvQUgKL1BNV2RZQTVVWHZsK1RXMmRFNnBqWUlUNUxZL3FRT0QrcUsraWhWcWY5NEx3N1laRkFYSzZzT29CSlE3Um53eQpEZk1BWmlMSWpXbHROb3dSR0xmVHNoeGd0RGo2QW96TzA5MUdCOTRLUHV0ZGZNaDgrN0FyVTZTU1ltbFJKUVZoCkdrU0JqQ3lwUTVZajM2dzZnWm9PS2NVY3FlbGRIcmFlbmpBS09jN3hpSUQ3UzEzTU11eUZZa01sTkFKV0p3R1IKdER0d0tqOXVzZWljaUFGOW45VDUyMU50WUoyL0xPZFlxN2hmUnZ6T3hCc0RQQW5yU1RGY2FVYXo0RWNDQXdFQQpBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFCkZEcWFoUWNRWnlpMjcvYTlCVUZ1SU1HVTJnL2VNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUNaMjExNTFmbVgKV1djRFlmRitPd1l4ZFMyaElJNVBaWWUwOTZhY3ZOanBMOURiV3U3UGRJeHp0RGhDMmdWNytBSjF1UDJsc2RldQo5dGZlRTh0VEVINktSdEdYK3JjdUt4R3JrTEFuZ1Bub24xcnBONStyNU45c3M0VVhuVDNaSkU5NWtUWFdYd1RyCmdJT3JtZ0l0dFJEMDJKREhCSE5BN1hJbG9LbWY3SjZyYUJLWlY4YVBFam9KcEwxRS9RWVZOOEdiNURLajdUam8KMkdUekxINFUvQUxxbjgzL0IyZ1gyeUtRT0MxNmpkRlU4V25qWHpQS2VqMTdDdVBLZjE4NTVlSjF1c1YyR0RQTwpMUEF2VEszM3NlZk9UNmpFbTBwVUJzVi9mZFVJRCtJYy9uNFh1S3hlOXRRV3NrTUpERTMycDJ1MG1ZUmx5bnFJCjR1SkV2bHozNmh6MQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3RhcmZpZWxkIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuCiMgU3ViamVjdDogQ049U3RhcmZpZWxkIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuCiMgTGFiZWw6ICJTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IGQ2OjM5OjgxOmM2OjUyOjdlOjk2OjY5OmZjOmZjOmNhOjY2OmVkOjA1OmYyOjk2CiMgU0hBMSBGaW5nZXJwcmludDogYjU6MWM6MDY6N2M6ZWU6MmI6MGM6M2Q6Zjg6NTU6YWI6MmQ6OTI6ZjQ6ZmU6Mzk6ZDQ6ZTc6MGY6MGUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDJjOmUxOmNiOjBiOmY5OmQyOmY5OmUxOjAyOjk5OjNmOmJlOjIxOjUxOjUyOmMzOmIyOmRkOjBjOmFiOmRlOjFjOjY4OmU1OjMxOjliOjgzOjkxOjU0OmRiOmI3OmY1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEM1RDQ0FzV2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQmp6RUxNQWtHQTFVRUJoTUNWVk14CkVEQU9CZ05WQkFnVEIwRnlhWHB2Ym1FeEV6QVJCZ05WQkFjVENsTmpiM1IwYzJSaGJHVXhKVEFqQmdOVkJBb1QKSEZOMFlYSm1hV1ZzWkNCVVpXTm9ibTlzYjJkcFpYTXNJRWx1WXk0eE1qQXdCZ05WQkFNVEtWTjBZWEptYVdWcwpaQ0JTYjI5MElFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlU0F0SUVjeU1CNFhEVEE1TURrd01UQXdNREF3Ck1Gb1hEVE0zTVRJek1USXpOVGsxT1Zvd2dZOHhDekFKQmdOVkJBWVRBbFZUTVJBd0RnWURWUVFJRXdkQmNtbDYKYjI1aE1STXdFUVlEVlFRSEV3cFRZMjkwZEhOa1lXeGxNU1V3SXdZRFZRUUtFeHhUZEdGeVptbGxiR1FnVkdWagphRzV2Ykc5bmFXVnpMQ0JKYm1NdU1USXdNQVlEVlFRREV5bFRkR0Z5Wm1sbGJHUWdVbTl2ZENCRFpYSjBhV1pwClkyRjBaU0JCZFhSb2IzSnBkSGtnTFNCSE1qQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0MKZ2dFQkFMM3R3UVA4OW8vOEFyRnZXNTlJMloxNTRxSzNBMkZXR01OSHR0ZktQVFV1aVVQM29XbWIzb29hL1JNZwpuTFJKZHpJcFZ2MjU3SXpkSXZweTNDZGhsKzcyV29Uc2JobTVpU3pjaEZ2VmRQdHJYOFdKcFJCU2lVWlY5TGgxCkhPWi81RlN1Uy9oVmNsY0NHZmdYY1ZuckhpZ0hkTVdkU0w1c3RQU2tzUE5rTjNtU3dPeEdYbi9oYlZOTVlxL04KSHd0anV6cWQrL3g1QUpoaGRNOG1na0JqODdKeWFoa05tY3JVRG5YTU4vdUxpY0ZaOFdKL1g3TmZaVEQ0cDdkTgpkbG9lZGw0MHdPaVdWcG1Lcy9CL3BNMjkzREl4ZkpIUDRGOFIrR3VxU1Z6Um1aVFJvdU5qV3dsMnRWWmk0VXQwCkhaYlVKdFFJQkZuUW1BNE81dDc4dyt3ZmtQRUNBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU8KQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGSHdNTWgrbjJUQi94SDFvbzJLb29jNnJCMXNuTUEwRwpDU3FHU0liM0RRRUJDd1VBQTRJQkFRQVJXZm9sVHdOdmxKazdtaCtDaFRuVWRnV1VYdUVvazIxaVhRbkNvS2pVCnNIVTQ4VFJxbmVTZmlvWW1VZVlzMGNZdGJwVWdTcElCN0xpS1ozc3g0bWN1akpVREppNURuVW94OWc2MURMdTMKNGpkL0lyb0FvdzU3VXZ0cnV6dkUwM2xSVHMyUTlHY0hHY2c4Um5vTkFYM0ZXT2R0NW9Vd0Y1b2t4QkRnQlBmZwo4bi9VcWdyL1FoMDM3WlRsWkZrU0lIYzQwekkrT0lGMWxuUDZhSSt4eTg0ZnhlejZuSDdQZnJIeEJ5MjIvTC9LCnBML1Fsd1ZLdk9vWUtBS1F2VlI0Q1NGeDA5RjlIZGtXc0tsaFBkQUtBQ0w4eDN2TENXUkZDenRBZ2ZkOWZETDEKbU1wWWpuMHE3cEJaYzJUNU5uUmVKYUgxWmdVdWZ6a1ZxU3I3VUl1T2hXbjAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIE89U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLgojIFN1YmplY3Q6IENOPVN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIE89U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLgojIExhYmVsOiAiU3RhcmZpZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiAxNzozNTo3NDphZjo3Yjo2MToxYzplYjpmNDpmOTozYzplMjplZTo0MDpmOTphMgojIFNIQTEgRmluZ2VycHJpbnQ6IDkyOjVhOjhmOjhkOjJjOjZkOjA0OmUwOjY2OjVmOjU5OjZhOmZmOjIyOmQ4OjYzOmU4OjI1OjZmOjNmCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1Njo4ZDo2OTowNTphMjpjODo4NzowODphNDpiMzowMjo1MTo5MDplZDpjZjplZDpiMTo5Nzo0YTo2MDo2YToxMzpjNjplNToyOTowZjpjYjoyYTplNjozZTpkYTpiNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDd6Q0NBdGVnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JtREVMTUFrR0ExVUVCaE1DVlZNeApFREFPQmdOVkJBZ1RCMEZ5YVhwdmJtRXhFekFSQmdOVkJBY1RDbE5qYjNSMGMyUmhiR1V4SlRBakJnTlZCQW9UCkhGTjBZWEptYVdWc1pDQlVaV05vYm05c2IyZHBaWE1zSUVsdVl5NHhPekE1QmdOVkJBTVRNbE4wWVhKbWFXVnMKWkNCVFpYSjJhV05sY3lCU2IyOTBJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVNBdElFY3lNQjRYRFRBNQpNRGt3TVRBd01EQXdNRm9YRFRNM01USXpNVEl6TlRrMU9Wb3dnWmd4Q3pBSkJnTlZCQVlUQWxWVE1SQXdEZ1lEClZRUUlFd2RCY21sNmIyNWhNUk13RVFZRFZRUUhFd3BUWTI5MGRITmtZV3hsTVNVd0l3WURWUVFLRXh4VGRHRnkKWm1sbGJHUWdWR1ZqYUc1dmJHOW5hV1Z6TENCSmJtTXVNVHN3T1FZRFZRUURFekpUZEdGeVptbGxiR1FnVTJWeQpkbWxqWlhNZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrZ0xTQkhNakNDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTlVNT3NRcStVN2k5YjRabDErT2lGT3hIei9MejU4Z0UyMHAKT3NnUGZUejNhM1k0WTlrMllLaWJYbHdBZ0xJdldYLzJoL2tsUTRibmFSdFNtcERoY2VQWUxRMU9iL2JJU2RtMgo4eHBXcml1MmRCVHJ6L3NtNHhxNkhaWXVhanRZbElsSFZ2OGxvSk53VTRQYWhIUVV3MmVlQkdnNjM0NUFXaDFLClRzOURrVHZuVnRZQWNNdFM3bnQ5cmpybnZESDVSZmJDWU04VFdRSXJnTXcwUjkrNTNwQmxiUUxQTEpHbXB1ZmUKaFJoSmZHWk9venB0cWJYdU5DNjZEUU80TTk5SDY3RnJqU1habTg2QjBVVkdNcFp3aDk0Q0RrbERoYlpzYzd0awo2bUZCck1uVVZOK0hMOGNpc2liTW4xbFVhSi84dmlvdnhGVWNkVUJnRjRVQ1ZUbUxmd1VDQXdFQUFhTkNNRUF3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkp4ZkFOK3EKQWRjd0t6aUlvcmh0U3B6eUVaR0RNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUJMTnFhRWQybmRPeG1mWnlNSQpidzVoeWYyRTNGL1lOb0hOMkJ0QkxaOWczY2NhYU5uUmJvYmhpQ1BQRTk1RHorSTBzd1NkSHluVnYvaGV5TlhCCnZlNlNiekowOHBHQ0w3MkNRbnF0S3JjZ2ZVMjhlbFVTd2hYcXZmZHFsUzVzZEovUEhMVHl4UUdqaGRCeVBxMXoKcXd1YmRReHRSYmVPbEt5V043V2cwSThWUnc3ajZJUGRqLzN2UVFGM3pDZXBZb1V6OGpjSTczSFBkd2JleUJrZAppRURQZlVZZC94N0g0YzcvSTl2RytvMVZUcWtDNTBjUlJqNzAvYjE3S1NhN3FXRmlOeWkyTFNyMkVJWmt5WENuCjBxMjNLWEI1Nmp6YVl5V2YvV2kzTU94dyszV0t0MjFnWjdJZXlMbnAyS2h2QW90bkRVMG1WM0hhSVB6QlNsQ04Kc1NpNgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QWZmaXJtVHJ1c3QgQ29tbWVyY2lhbCBPPUFmZmlybVRydXN0CiMgU3ViamVjdDogQ049QWZmaXJtVHJ1c3QgQ29tbWVyY2lhbCBPPUFmZmlybVRydXN0CiMgTGFiZWw6ICJBZmZpcm1UcnVzdCBDb21tZXJjaWFsIgojIFNlcmlhbDogODYwODM1NTk3Nzk2NDEzODg3NgojIE1ENSBGaW5nZXJwcmludDogODI6OTI6YmE6NWI6ZWY6Y2Q6OGE6NmY6YTY6M2Q6NTU6Zjk6ODQ6ZjY6ZDY6YjcKIyBTSEExIEZpbmdlcnByaW50OiBmOTpiNTpiNjozMjo0NTo1Zjo5YzpiZTplYzo1Nzo1Zjo4MDpkYzplOTo2ZToyYzpjNzpiMjo3ODpiNwojIFNIQTI1NiBGaW5nZXJwcmludDogMDM6NzY6YWI6MWQ6NTQ6YzU6Zjk6ODA6M2M6ZTQ6YjI6ZTI6MDE6YTA6ZWU6N2U6ZWY6N2I6NTc6YjY6MzY6ZTg6YTk6M2M6OWI6OGQ6NDg6NjA6Yzk6NmY6NWY6YTcKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURURENDQWpTZ0F3SUJBZ0lJZDNjR0p5YXBzWHd3RFFZSktvWklodmNOQVFFTEJRQXdSREVMTUFrR0ExVUUKQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnBjbTFVY25WegpkQ0JEYjIxdFpYSmphV0ZzTUI0WERURXdNREV5T1RFME1EWXdObG9YRFRNd01USXpNVEUwTURZd05sb3dSREVMCk1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnAKY20xVWNuVnpkQ0JEYjIxdFpYSmphV0ZzTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQwpBUUVBOWh0UFp3Y3JvUlgxQmlMTEh3R3k0M05GQmtSSkxMdEpKUlRXenNPM3F5eFB4a0V5bEZmNkVxZGJEdUtQCkh4NkdHYWVxdFMyNVh3Mkt3cStGTlhreUxic2NZamZ5c1Z0S1Bjck5jVi9wUXI2VTZNamUrU0pJWk1ibHE4WXIKYmEwRjhQclZDOCthNWZCUXBJczdSNlVqVzNwNitETS91TytabCtNZ3dkWW9pYytVKzdsRjdlTkFGeEhVZFBBTApNZUlySm1xYlRGZXVyQ0ErdWtWNkJmTzltMmtWcm4xT0lHUEVOWFk2QndMSk4vM0hSKzdvOFhZZGN4WHlsNlMxCnlIcDUyVUtxSzM5Yy9zNG1UNk5tZ1RXdlJMcFVIaHd3TW1XZDVqeVRYbEJPZXVNNjFHN01HdnY1MGpldUpDcXIKVndNaUtBMUpkWCszS05wMXY0N2ozQTU1TVFJREFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVW5aUEdVNHRleXE4LwpueDRQNVptVnZDVDJsSTh3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEUVlKCktvWklodmNOQVFFTEJRQURnZ0VCQUZpczlBUU96Y0FOL3dyOTFMb1dYeW05ZTJpWldFblN0QjAzVFg4bmZVWUcKWFVQR2hpNCtjN0ltZlUrVHFiYkVLcHFySVpjVXNkNk0wNnVKRmRockpOVHhGcTdZcEZ6VWYxR083UmdCc1pOagp2Yno0WVlDYW5ySE9RbkRpcVgwR0pYMG5vZjV2N0xNZUpOcmpTMVVhQURzMXREdloxMTB3L1lFVGlmTENCaXZ0Clo4U095VU95WEdzVmlRSzhZdnhPOHJVenFySnYwd3FpVU9QMk8rZ3VSTUxiWmppcE0xWkk4VzBiTTQwTmpEOWcKTjUzVHltMStOSDRObjNKMml4dWZjdjFTTlVGRkFwWXZITEthYzBraHNVbEhSVWUwNzJvMEVjbE5tc3hadDlZQwpubHBPWmJXVXJodmZLYkFXOGI4QW5nYzZGMlMxQkxVaklaa0tsVHVYZk84PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QWZmaXJtVHJ1c3QgTmV0d29ya2luZyBPPUFmZmlybVRydXN0CiMgU3ViamVjdDogQ049QWZmaXJtVHJ1c3QgTmV0d29ya2luZyBPPUFmZmlybVRydXN0CiMgTGFiZWw6ICJBZmZpcm1UcnVzdCBOZXR3b3JraW5nIgojIFNlcmlhbDogODk1NzM4MjgyNzIwNjU0Nzc1NwojIE1ENSBGaW5nZXJwcmludDogNDI6NjU6Y2E6YmU6MDE6OWE6OWE6NGM6YTk6OGM6NDE6NDk6Y2Q6YzA6ZDU6N2YKIyBTSEExIEZpbmdlcnByaW50OiAyOTozNjoyMTowMjo4YjoyMDplZDowMjpmNTo2NjpjNTozMjpkMTpkNjplZDo5MDo5Zjo0NTowMDoyZgojIFNIQTI1NiBGaW5nZXJwcmludDogMGE6ODE6ZWM6NWE6OTI6OTc6Nzc6ZjE6NDU6OTA6NGE6ZjM6OGQ6NWQ6NTA6OWY6NjY6YjU6ZTI6YzU6OGY6Y2Q6YjU6MzE6MDU6OGI6MGU6MTc6ZjM6ZjA6YjQ6MWIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURURENDQWpTZ0F3SUJBZ0lJZkU4RU9SelVtUzB3RFFZSktvWklodmNOQVFFRkJRQXdSREVMTUFrR0ExVUUKQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnBjbTFVY25WegpkQ0JPWlhSM2IzSnJhVzVuTUI0WERURXdNREV5T1RFME1EZ3lORm9YRFRNd01USXpNVEUwTURneU5Gb3dSREVMCk1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnAKY20xVWNuVnpkQ0JPWlhSM2IzSnJhVzVuTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQwpBUUVBdElUTU14Y3VhNVJzYTJGU29PdWp6M21VVE9XVWdKbkxWV1JFWlk5blpPSUc0MXczU2ZZdm00U0VIaTN5CllKMHdUc3lFaGVJc3p4NmUvamFyTTNjMVJOZzFsaG85TnVoNkR0alZSNkZxYVl2Wi9MczZybmxhMWZUV2NidWEKa0NOcm1yZUlkSWNNSGwrNW5pMzZxMU1yM0x0MlBwTk1DQWlNSHFJakhOUnFyU0s2bVFFdWJXWEx2aVJtVlNSTApRRVN4RzlmaHdvWEEzaEEvUGUyNC9QSHhJMVBjdjJXWGI5bjVRSEdOZmIyVjFNNitvRjRuSTk3OXB0QW1EZ0FwCjZ6eEc4RDFndno5UTB0d21RVkdlRkRkQ0JLTndWNmdiaCswdCtudnVqQXJqcVdhSkdjdEIrZDFFTm1IUDRuZEcKeUgzMjlKS0JOdjNiTlBGeWZ2TU1GcjIwRlFJREFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVUJ4L1M1NXphd202aQpRTFN3ZWxBUVVIVEV5TDB3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0VCQUlsWHNoWjZxTUw5MXRtYm16VENuTFF5RkUybnBOL3N2cWUrK0VQYmtUZk8KdERJdVVGVWFOVTUyUTNFZzc1TjNUaFZ3TG9mRHdSMXQzTXUxSjlRc1Z0RlNVenBFMG5QSXhCc0ZaVnBpa3B6dQpRWTB4MitjMDZsa2gxUUY2MTJTNFpEbk55ZTJ2N1VzRFNLZWdtUUdBM0dXak5xNWxXVWhQZ2t2SVpmRlhIZVZaCkxnby9iTmpSOWVVSnRHeFVBQXJnRlUySGRXMjNXSlphM1czU0FLRDBtMGkrd3pla3VqYmdmSWVGbHhvVm90NHUKb2x1OXJ4ajVrRkROY0ZuNEoyZEh5OGVnQnpwOTBTeGRiQms2WnJWOS9aRnZnckcrQ0pQYkZFZnhvamZIUlo0OAp4M2V2WktpVDMvWnBnNEpnOGtsQ05PMWFBRlNGSEJZMmtneGMrcWF0djlzPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QWZmaXJtVHJ1c3QgUHJlbWl1bSBPPUFmZmlybVRydXN0CiMgU3ViamVjdDogQ049QWZmaXJtVHJ1c3QgUHJlbWl1bSBPPUFmZmlybVRydXN0CiMgTGFiZWw6ICJBZmZpcm1UcnVzdCBQcmVtaXVtIgojIFNlcmlhbDogNzg5MzcwNjU0MDczNDM1MjExMAojIE1ENSBGaW5nZXJwcmludDogYzQ6NWQ6MGU6NDg6YjY6YWM6Mjg6MzA6NGU6MGE6YmM6Zjk6Mzg6MTY6ODc6NTcKIyBTSEExIEZpbmdlcnByaW50OiBkODphNjozMzoyYzplMDowMzo2ZjpiMTo4NTpmNjo2Mzo0Zjo3ZDo2YTowNjo2NToyNjozMjoyODoyNwojIFNIQTI1NiBGaW5nZXJwcmludDogNzA6YTc6M2Y6N2Y6Mzc6NmI6NjA6MDc6NDI6NDg6OTA6NDU6MzQ6YjE6MTQ6ODI6ZDU6YmY6MGU6Njk6OGU6Y2M6NDk6OGQ6ZjU6MjU6Nzc6ZWI6ZjI6ZTk6M2I6OWEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZSakNDQXk2Z0F3SUJBZ0lJYll3VVJyR21DdTR3RFFZSktvWklodmNOQVFFTUJRQXdRVEVMTUFrR0ExVUUKQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVJ3d0dnWURWUVFEREJOQlptWnBjbTFVY25WegpkQ0JRY21WdGFYVnRNQjRYRFRFd01ERXlPVEUwTVRBek5sb1hEVFF3TVRJek1URTBNVEF6Tmxvd1FURUxNQWtHCkExVUVCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUnd3R2dZRFZRUUREQk5CWm1acGNtMVUKY25WemRDQlFjbVZ0YVhWdE1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBeEJMZgpxVi8rUWQzZDlaK0s0L2FzNFR4NG1yelk4SDk2b0RNcTNJMGdXNjR0YitlVDJUWndhbWpQamxHamhWdG5CS0FRCkpHOWRLSUxCbDFmWVNDa1R0dUcra1UzZmhReFRHSm9lSktKUGovQ2loUXZMOUNsLzBxUlk3aVpOeWFxb2U1cloKK2pqZVJGY1Y1ZmlNeU5sSTRnMFdKeDBleUlPRkpiZTZxbFZCekFNaVN5MlJqWXZtaWE5bXgrbi9LK2s4ck5yUwpzOFBoYUp5SitIb0FWdDcwVlpWcys3cGszV0tMM3d0M011dGl6Q2FhbTd1cVlvTk10QVo2TU1ncHYrMEdUWmU1CkhNUXhLOVZmdkZNU0Y1eVpWeWxtZDJFaE1RY3VKVW1kR1BMdTh5dHhqTFc2T1FkSmQvenZMcEtRQlkwdEwzZDcKNzBPL05idWEyUGx6cHl6eTBGZnVLRTRtWDQrUWFBa3Z1UGpjQnVrdW1qNVJwOUVpeEFxbk9FaHNzL24vZmF1RwpWK082MW9WNGQ3cEQ2a2gvOXRpK0kyMGV2OUUyYkZoYzhlNmtHVlFhOVFQU2R1YmhqTDA4czlOSVMrTEkrSCtTCnFIWkduRUpsUHFRZXdRY0RXa1l0dUpmenQ5V3lWU0h2dXR4TUFKZjdGSlVuTTcvb1EwZEcwZ2laRm1BN21uN1MKNXUwNDZ1d0JIanhJVmtrSngwdzNBSjZJRHNCejRXOW02WEpITUQ0UTVRc0R5WnBDQUd6RmxINWh4SXJmZjRJYQpDMW5FV1RKM3M3eGdhVlk1L2JRR2V5eldaRGJadlVqdGhCOStwU0tQS3JoQzlJSzMxRk9RZUU0dEd2MkJiMFRYCk93RjBsa0xnQU9JdWErckY3bktzdTcvKzZxcW8rTnoyc25tS3RtY0NBd0VBQWFOQ01FQXdIUVlEVlIwT0JCWUUKRkozQVo2WU1JdGttOVVXcnBtVlNFU2ZZUmF4ak1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFILwpCQVFEQWdFR01BMEdDU3FHU0liM0RRRUJEQVVBQTRJQ0FRQ3pWMDBRWWs0NjVLenF1Qnl2TWlQSXMwbGFVWngyCktJMTVxbGRHRjlYMVV2YTNST2dJUkw4WWhOSUxnTTNGRXYwQVZRVmhoMEhjdFNTZVBNVFl5UHR3bmk5NGxvTWcKTnQ1OEQya1RpS1YxTnBnSXBzYmZyTTdqV05hM1B0NjY4K3MwUU5paWdmVjRQeS9WcGZ6Wm90UmVCQTRYcmY1Qgo4T1d5Y3ZwRWdqTkM2QzFZOTFhTVlqKzZRckNjREZ4K0xtVW1YRk5QQUxKNGZxRU5tUzJOdUIyT29zU3cvV0RRCk1LU095QVJpcWNUdE5kNTZsKzBPT0Y2U0w1TndwYW1jYjZkOUV4MSt4Z2hJc1Y1bjYxRUlKZW5tSld0U0taR2MKMGpsekNGZmVtUWEwVzUwUUJ1SENBS2k0SEVvQ0NoVFF3VUhLKzR3MUlYMkNPUEtwVkpFWk5aT1ViV282eGJMUQp1NG1HaytpYnlRODZwM3E0b2ZCNFJ2cjhOeS9saW9UejMvNEUyYUZvb0M4azRnbVZCdFdWeXVFa2x1dDg5cE1GCnUrMXo2UzNSZFRuWDV5VGIyRTVmUTQrZTBCUTV2MVZ3U0psWE1iU2M3a3FZQTVZd0gyQUc3aHNqL29GZ0l4cEgKWW9XbHpCazBnRyt6ckJyam4vQjdTSzNWQWRsbnRxbHlrK290WnJXeXVPUTlQTEx2VEl6cTZ3ZS9xeldhVllhOApHS2ExcUY2MGcyeHJhVURUbjl6eHcybHJ1ZUZ0Q2ZUeHFsQjJDbnA5ZWhlaFZaWkNtVEVKM1dBUmpRVXdmdWFPClJ0R2RGTnJIRitRRmxvekVKTFVienhRSHNrRDRvNTVCaHJ3RTBHdVd5Q3FBTlAyLzd3YWozVmpGaFQwK2ovNmUKS2VDMnVBbG9HUndZUXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MgTz1BZmZpcm1UcnVzdAojIFN1YmplY3Q6IENOPUFmZmlybVRydXN0IFByZW1pdW0gRUNDIE89QWZmaXJtVHJ1c3QKIyBMYWJlbDogIkFmZmlybVRydXN0IFByZW1pdW0gRUNDIgojIFNlcmlhbDogODQwMTIyNDkwNzg2MTQ5MDI2MAojIE1ENSBGaW5nZXJwcmludDogNjQ6YjA6MDk6NTU6Y2Y6YjE6ZDU6OTk6ZTI6YmU6MTM6YWI6YTY6NWQ6ZWE6NGQKIyBTSEExIEZpbmdlcnByaW50OiBiODoyMzo2YjowMDoyZjoxZDoxNjo4Njo1MzowMTo1NTo2YzoxMTphNDozNzpjYTplYjpmZjpjMzpiYgojIFNIQTI1NiBGaW5nZXJwcmludDogYmQ6NzE6ZmQ6ZjY6ZGE6OTc6ZTQ6Y2Y6NjI6ZDE6NjQ6N2E6ZGQ6MjU6ODE6YjA6N2Q6Nzk6YWQ6Zjg6Mzk6N2U6YjQ6ZWM6YmE6OWM6NWU6ODQ6ODg6ODI6MTQ6MjMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUIvakNDQVlXZ0F3SUJBZ0lJZEpjbGlzYy9lbFF3Q2dZSUtvWkl6ajBFQXdNd1JURUxNQWtHQTFVRUJoTUMKVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNU0F3SGdZRFZRUUREQmRCWm1acGNtMVVjblZ6ZENCUQpjbVZ0YVhWdElFVkRRekFlRncweE1EQXhNamt4TkRJd01qUmFGdzAwTURFeU16RXhOREl3TWpSYU1FVXhDekFKCkJnTlZCQVlUQWxWVE1SUXdFZ1lEVlFRS0RBdEJabVpwY20xVWNuVnpkREVnTUI0R0ExVUVBd3dYUVdabWFYSnQKVkhKMWMzUWdVSEpsYldsMWJTQkZRME13ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUU5NRjRiRlowRAowS0Y1TmJjNlBKSjZ5aFVjeldMem5DWmNCejNsVlBxajFzd1M2dlFVWCtpT0dhc3ZMa2ptckJoRGVLelFOOE85CnNzMHM1a2ZpR3VaanVEMHVMM2pFVDl2MEQ2Um9URlZ5YTVVZFRoaENsWGpNTnp5UjRwdGxLeW1qUWpCQU1CMEcKQTFVZERnUVdCQlNhcnlsNndCRTFOU1pSTUFERGF2NUExYTdXUERBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0RwpBMVVkRHdFQi93UUVBd0lCQmpBS0JnZ3Foa2pPUFFRREF3Tm5BREJrQWpBWENmT0hpRkJhcjhqQVFyOUhYL1ZzCmFvYmd4Q2QwNURoVDF3Vi9HelRqeGkrenlnazhONTNYNTdoRzhmMmg0bkVDTUVKWmgwUFVVZCs2MHdreVdzNkkKZmxjOW5GOUNhL1VITGJYd2dwUDVXVyt1WlBwWTVZc2U0Mk8rdFlITmJ3S01lUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIE89VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLiBPVT1DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1DZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIE89VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLiBPVT1DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIkNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EiCiMgU2VyaWFsOiAyNzk3NDQKIyBNRDUgRmluZ2VycHJpbnQ6IGQ1OmU5OjgxOjQwOmM1OjE4OjY5OmZjOjQ2OjJjOjg5Ojc1OjYyOjBmOmFhOjc4CiMgU0hBMSBGaW5nZXJwcmludDogMDc6ZTA6MzI6ZTA6MjA6Yjc6MmM6M2Y6MTk6MmY6MDY6Mjg6YTI6NTk6M2E6MTk6YTc6MGY6MDY6OWUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDVjOjU4OjQ2OjhkOjU1OmY1OjhlOjQ5OjdlOjc0OjM5OjgyOmQyOmI1OjAwOjEwOmI2OmQxOjY1OjM3OjRhOmNmOjgzOmE3OmQ0OmEzOjJkOmI3OjY4OmM0OjQwOjhlCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdXpDQ0FxT2dBd0lCQWdJREJFVEFNQTBHQ1NxR1NJYjNEUUVCQlFVQU1INHhDekFKQmdOVkJBWVRBbEJNCk1TSXdJQVlEVlFRS0V4bFZibWw2WlhSdklGUmxZMmh1YjJ4dloybGxjeUJUTGtFdU1TY3dKUVlEVlFRTEV4NUQKWlhKMGRXMGdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhreElqQWdCZ05WQkFNVEdVTmxjblIxYlNCVQpjblZ6ZEdWa0lFNWxkSGR2Y21zZ1EwRXdIaGNOTURneE1ESXlNVEl3TnpNM1doY05Namt4TWpNeE1USXdOek0zCldqQitNUXN3Q1FZRFZRUUdFd0pRVERFaU1DQUdBMVVFQ2hNWlZXNXBlbVYwYnlCVVpXTm9ibTlzYjJkcFpYTWcKVXk1QkxqRW5NQ1VHQTFVRUN4TWVRMlZ5ZEhWdElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVNJdwpJQVlEVlFRREV4bERaWEowZFcwZ1ZISjFjM1JsWkNCT1pYUjNiM0pySUVOQk1JSUJJakFOQmdrcWhraUc5dzBCCkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTQvdDlvM0s2d3ZESkZJZjFhd0ZPNFc1QUI3cHRKMTEvOTFzdHMxckgKVVYrcnBES21ZWWUyYmcrRzBqQUNsL2pYYVZlaEdEbGRhbVI1eGdGWnJEd3hTamg4MGdUU1N5am9JRjg3QjZMTQpUWFBiODY1UHgxYlZXcWVXaWZyenEyalVJNFpaSjg4Sko3eXNibktESERCeTMrQ2k2ZExoZEhVWnZTcWVleFZVCkJCdlhRem10VlNqRjRocTc5TURrcmpoSk04eDJoWjg1UmRLa252SVNqRkg0Zk9RdGYvV3NYK3NXbjdFdDBick0Ka1VKM1RDWEprRGh2Mi9ETSs0NGVsMWsrMVdCTzVnVW83VWw1RTB1NlNOc3YrWExUT2NyK0g5ZzBjdlcwUU04eApBY1BzM2hFdEYxMGZ1RkRSWGhtbmFkNEhNeWpLVUpYNXAxVExWSVpRUmFuNVNRSURBUUFCbzBJd1FEQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlFJZHMzTEIvOGs5c1hON2J1UXZPS0VOMFoxOXpBT0JnTlYKSFE4QkFmOEVCQU1DQVFZd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFLYW9yU0xPQVQybW8vOWkwRWlkaTE1eQpzSGhFNDl3Y3J3bjlJMGo2dlNyRXVWVUV0UkNqalNmZUM0SmowTzdlRERkNVFWc2lzckNhUVZ5bWNPRFUwSGZMCkk5TUE0R3hXTCtGcERRM1pxcjhoZ1ZEWkJxV28vNVUzMEtyKzRyUDFtUzFGaElybFFnblhkQUl2OTRuWW1lbTgKSjlSSGpib05SaHgzenhTa0hMbWtNY1NjS0hRRE5QOHpHU2FsNlExMHR6Nlh4bmJvSjVhalp0M2hydkpCVzhxWQpWb056Y09TR0d0SXhRYm92dmkwVFduWnZUdWhPZ1E0L1d3TWlvQksrWmxnUlNzc0R4TFFxS2kyV0YrQTVWTHhJCjAzWW5uWm90QnFiSjdEblNxOXVmbWdzbkFqVXBzVUNWNS9ub25GV0lHVWJXdHpUMWZzNDVtdGs0OFZIM1R5dz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRXQ0EgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVRBSVdBTi1DQSBPVT1Sb290IENBCiMgU3ViamVjdDogQ049VFdDQSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VEFJV0FOLUNBIE9VPVJvb3QgQ0EKIyBMYWJlbDogIlRXQ0EgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IGFhOjA4OjhmOmY2OmY5OjdiOmI3OmYyOmIxOmE3OjFlOjliOmVhOmVhOmJkOjc5CiMgU0hBMSBGaW5nZXJwcmludDogY2Y6OWU6ODc6NmQ6ZDM6ZWI6ZmM6NDI6MjY6OTc6YTM6YjU6YTM6N2E6YTA6NzY6YTk6MDY6MjM6NDgKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJmOmQ4OjhmOmUxOjEwOjFjOjQxOmFlOjNlOjgwOjFiOmY4OmJlOjU2OjM1OjBlOmU5OmJhOmQxOmE2OmI5OmJkOjUxOjVlOmRjOjVjOjZkOjViOjg3OjExOmFjOjQ0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZXpDQ0FtT2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCZk1Rc3dDUVlEVlFRR0V3SlVWekVTCk1CQUdBMVVFQ2d3SlZFRkpWMEZPTFVOQk1SQXdEZ1lEVlFRTERBZFNiMjkwSUVOQk1Tb3dLQVlEVlFRRERDRlUKVjBOQklGSnZiM1FnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTURnd09ESTRNRGN5TkRNegpXaGNOTXpBeE1qTXhNVFUxT1RVNVdqQmZNUXN3Q1FZRFZRUUdFd0pVVnpFU01CQUdBMVVFQ2d3SlZFRkpWMEZPCkxVTkJNUkF3RGdZRFZRUUxEQWRTYjI5MElFTkJNU293S0FZRFZRUUREQ0ZVVjBOQklGSnZiM1FnUTJWeWRHbG0KYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQgpBUUN3Zm5LNHBBT1U1cWZlQ1RpUlNoRkFoNmQ4V1dRVWU3VVJFTjMrdjlYQXUxYmloU1gwTlhJUCtGUFFRZUZFCkFjSzBITU14UWhaSGhUTWlkcklLYncvbEpWQlBoWWErdjVndUVHY2V2aEVGaGdXUXhGblFmSGdRc0lCY3QrSEgKSzNYTGZKK3V0ZEdkSXpkanA5eENvaTJTQkJ0UXdYdTRQaHZKVmdTTEwxS2JyYWxXNmNIL3JhbFloekMyZ2ZlWApSZndaVnpzcmIrUkg5SmxGL2gzeCtKZWppQjAzSEZ5UDRIWWxtbEQ0b0ZUL1JKQjJJOUl5eHNPckJyLzgrNy96CnJYMlNZZ0piS2RNMW81T2FRMlJnWGJMNk12ODdCSzlOUUdyNXgrUHZJLzFyeStVUGl6Z043Z3I4L2crWW56QXgKM1d4U1pmbUxnYjRpNFJ4WUE3cVJHNGtIQWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJScU9Gc21qZDZMV3ZKUGVsU0RHUmpqQ0RXbXVqQU5CZ2txCmhraUc5dzBCQVFVRkFBT0NBUUVBUE5WM1BkcmZpYnFIREFoVWFpQlFrcjZ3UVQyNUptU0RDaS9vUU1DWEtDZUMKTUVySmsvOXE1NllBZjRsQ210WVI1VlBPTDh6eTJnWEUvdUpReERxR2ZjemFmaEFKTzVJMUtsT3kvdXNyQmRscwpYZWJRNzlOcVpwNFZLSVY2NklJQXJCNm5DV2xXUXROb1VSaStWSnEvUkVHNlNiNGd1bWxjN3JoM3pjNXNINjJECmxoaDlEclVVT1lUeEtPa3RvNTU3SG5weVdvT3plVy92dFB6UUNxVllUMGJmKzIxNVdmS0VJbEt1RDh6N2ZEdm4KYXNwSFljTjYrTk9TQkIrNElJVGhObFFXeDBEZU80cHozTi9HQ1V6ZjdOci8xRk5Db2NueVloMGlnenlYeGZrWgpZaWVzWlNMWDB6ekc1WTZ5VTh4Snpyd3cvbnNPTTVENzdkSVVrUjhIcnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1TRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuIE9VPVNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMgojIFN1YmplY3Q6IE89U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELiBPVT1TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTIKIyBMYWJlbDogIlNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMiIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDZjOjM5OjdkOmE0OjBlOjU1OjU5OmIyOjNmOmQ2OjQxOmIxOjEyOjUwOmRlOjQzCiMgU0hBMSBGaW5nZXJwcmludDogNWY6M2I6OGM6ZjI6Zjg6MTA6YjM6N2Q6Nzg6YjQ6Y2U6ZWM6MTk6MTk6YzM6NzM6MzQ6Yjk6Yzc6NzQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDUxOjNiOjJjOmVjOmI4OjEwOmQ0OmNkOmU1OmRkOjg1OjM5OjFhOmRmOmM2OmMyOmRkOjYwOmQ4OjdiOmI3OjM2OmQyOmI1OjIxOjQ4OjRhOmE0OjdhOjBlOmJlOmY2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURCZE1Rc3dDUVlEVlFRR0V3SktVREVsCk1DTUdBMVVFQ2hNY1UwVkRUMDBnVkhKMWMzUWdVM2x6ZEdWdGN5QkRUeTRzVEZSRUxqRW5NQ1VHQTFVRUN4TWUKVTJWamRYSnBkSGtnUTI5dGJYVnVhV05oZEdsdmJpQlNiMjkwUTBFeU1CNFhEVEE1TURVeU9UQTFNREF6T1ZvWApEVEk1TURVeU9UQTFNREF6T1Zvd1hURUxNQWtHQTFVRUJoTUNTbEF4SlRBakJnTlZCQW9USEZORlEwOU5JRlJ5CmRYTjBJRk41YzNSbGJYTWdRMDh1TEV4VVJDNHhKekFsQmdOVkJBc1RIbE5sWTNWeWFYUjVJRU52YlcxMWJtbGoKWVhScGIyNGdVbTl2ZEVOQk1qQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU5BVgpPVkt4VXJPNnhWbUN4RjFTcmpwRFpZQkx4L0tXdk5zMmw5YW1aSXlvWHZEakNoejMzNWM5UzY3Mlhld2h0VUdyCnpibCtkcCsrK1Q0Mk5LQTd3Zll4RVVWMGt6MVhnTVg1aVpuSzVhdHExTFhhUVpBUXdkYldRb25Ddi9RNEVwVk0KVkFYM051UkZnM3NVWmRiY0RFM1IzbjRNcXp2RUZiNDZWcVphYjNacFVxbDZ1Y2pyYXBwZFV0QXRDbXMxRmdrUQpoTkJxeWpvR0FEZEg1SDVYVHorTDYyZTRpS3JGdmxOVnNwSEVmYm13aFJrR2VDN2JZUnI2aGZWS2thSG5GdFdPCm9qbmZsTGh3SHlnL2kveEFYbU9EUElNcUdwbHJ6OTVaYWp2OGJ4YlhILzFLRU90T2doWTZyQ2NNVS9HdDFTU3cKYXdOUXdTMDhGdDFFTkNjYWRmc0NBd0VBQWFOQ01FQXdIUVlEVlIwT0JCWUVGQXFGcVhkbEJaaDhRSUg0RDVjcwpPUEVLN0R6UE1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUEwR0NTcUdTSWIzCkRRRUJDd1VBQTRJQkFRQk1PcU5FckxsRnNjZVRmc2dMQ2tMZlpPb2M3bGxzQ0xxSlgycktTcFdlZW84SHhkcEYKY29KeERqclN6RytudEtFanUvWWtuOHNYL295bXpzTFMyOHlOL0hIOEF5bkJiRjB6WDJTMlpUdUpieGgyZVBYYwpva2dmR1QrT2srdngraGZ1elU3akJCSlYxdVhrM2ZzK0JYemlIVjdHcDd5WFQyZzY5ZWt1Q2tPMnIxZGNZbWg4CnQvMmppb1NnckdLK0t3bUhOUEJxQWJ1YktWWTgvZ0EzenlOczhVNnF0blJHRW15UjdqVFY3SnFSNTBTK2tERnkKMVVrQzlnTGw5Qi9yZk5tV1Zhbi83SXI1bVVmL05Wb0NxZ1RMaWx1SGNTbVJ2YVMwZWcyOW12VlhJd0FISVJjLwpTam5SQlVrTHA3WTNnYVZkaktvelhvRW9mS2Q5SitzQXJvMDMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTEgTz1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTEgTz1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eQojIExhYmVsOiAiSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMSIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDczOjlmOjRjOjRiOjczOjViOjc5OmU5OmZhOmJhOjFjOmVmOjZlOmNiOmQ1OmM5CiMgU0hBMSBGaW5nZXJwcmludDogZmU6NDU6NjU6OWI6Nzk6MDM6NWI6OTg6YTE6NjE6YjU6NTE6MmU6YWM6ZGE6NTg6MDk6NDg6MjI6NGQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJjOjEwOjRmOjE1OmE0OjhiOmU3OjA5OmRjOmE1OjQyOmE3OmUxOmQ0OmI5OmRmOjZmOjA1OjQ1OjI3OmU4OjAyOmVhOmE5OjJkOjU5OjU0OjQ0OjI1OjhhOmZlOjcxCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTVRDQ0F4bWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURDQmxURUxNQWtHQTFVRUJoTUNSMUl4ClJEQkNCZ05WQkFvVE8waGxiR3hsYm1saklFRmpZV1JsYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjEKZEdsdmJuTWdRMlZ5ZEM0Z1FYVjBhRzl5YVhSNU1VQXdQZ1lEVlFRREV6ZElaV3hzWlc1cFl5QkJZMkZrWlcxcApZeUJoYm1RZ1VtVnpaV0Z5WTJnZ1NXNXpkR2wwZFhScGIyNXpJRkp2YjNSRFFTQXlNREV4TUI0WERURXhNVEl3Ck5qRXpORGsxTWxvWERUTXhNVEl3TVRFek5EazFNbG93Z1pVeEN6QUpCZ05WQkFZVEFrZFNNVVF3UWdZRFZRUUsKRXp0SVpXeHNaVzVwWXlCQlkyRmtaVzFwWXlCaGJtUWdVbVZ6WldGeVkyZ2dTVzV6ZEdsMGRYUnBiMjV6SUVObApjblF1SUVGMWRHaHZjbWwwZVRGQU1ENEdBMVVFQXhNM1NHVnNiR1Z1YVdNZ1FXTmhaR1Z0YVdNZ1lXNWtJRkpsCmMyVmhjbU5vSUVsdWMzUnBkSFYwYVc5dWN5QlNiMjkwUTBFZ01qQXhNVENDQVNJd0RRWUpLb1pJaHZjTkFRRUIKQlFBRGdnRVBBRENDQVFvQ2dnRUJBS2xUQU9NdXB2YU8rbURZTFpVKytDd3FWRTdOdVlSaGxGaFBqejJMNUVQegpkWW1OVWVURE45S0tpRTE1SHJjUzNVTjRTb3FTNXRkSTFRK2tPaWxFTmJnSDltZ2RWYzA0VWZDTUpER0ZyNFBKCmZlbDNyKzBhZTUwWCtiT2RPRkFQcGxwNWtZQ3ZONjZtMHpIN3RTWUpuVHhhNzFIRks5K1dYZXN5SGdMYWNFbnMKYmd6SW1qZU45L0UyWUVzbUxJS2UwSGp6RFE5anBGRXc0ZmtySnhJSDJPcTlHR0tZc0ZrM2ZiN3U4eUJSUWxxRAo3NU82YVJYeFlwMmZtVG1Db2JkMExvdlV4UXQ3TC9ESUN0bzllUXFha3h5bEtISnprVU9hcDlGTmhZUzVxWFNQCkZFREgzTjZzUVdSc3RCbWJBbU50SkdTUFJMSWw2czVkZEF4ak1seU5oK1VDQXdFQUFhT0JpVENCaGpBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01Bc0dBMVVkRHdRRUF3SUJCakFkQmdOVkhRNEVGZ1FVcHBGQy9STmhTaU9lQ0tRcAo1ZGdUQkNQdVFTVXdSd1lEVlIwZUJFQXdQcUE4TUFXQ0F5NW5jakFGZ2dNdVpYVXdCb0lFTG1Wa2RUQUdnZ1F1CmIzSm5NQVdCQXk1bmNqQUZnUU11WlhVd0JvRUVMbVZrZFRBR2dRUXViM0puTUEwR0NTcUdTSWIzRFFFQkJRVUEKQTRJQkFRQWY3M2xCNFh0dVA3S01oamRDU2s0Y054Nk5acm9rZ2NsUEVnOGh3QU9YaGlWdFhkTWlLYWhzb2cycAo2ejBHVzVrNng4ekRtalIvcXc3SVRoemgrdVRjelEyK3Z5VCtiT2Ryd2czSUJwNU9qV0VvcG1yOTVmWmk2aGc4ClRxQlRuYkk2bk91bG5KRVd0azJDNEF3RlNLbHM5Y3o0eTUxSnRQQUNwZjF3QSsyS0lhV3VFNFpKd3pOenZvYzcKZElzWFJTWk1GcEdEL21kOXpVMWpaL3J6QXhLV2VBYU5zV2Z0amorK24wOEM5Yk1KTC9OTWg5OHF5NVY4QWN5cwpObnEvb25ONjk0L0J0WnFoRkxLUE01OE43eUxjWm51RXZVVVhCajA4eXJsM05JL0s2czgvTVQ3amlPT0FTU1hJCmw3V2RtcGxOc0R6NFNnQ2JaTjJmT1V2Uko5ZTQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFjdGFsaXMgQXV0aGVudGljYXRpb24gUm9vdCBDQSBPPUFjdGFsaXMgUy5wLkEuLzAzMzU4NTIwOTY3CiMgU3ViamVjdDogQ049QWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBIE89QWN0YWxpcyBTLnAuQS4vMDMzNTg1MjA5NjcKIyBMYWJlbDogIkFjdGFsaXMgQXV0aGVudGljYXRpb24gUm9vdCBDQSIKIyBTZXJpYWw6IDYyNzE4NDQ3NzI0MjQ3NzA1MDgKIyBNRDUgRmluZ2VycHJpbnQ6IDY5OmMxOjBkOjRmOjA3OmEzOjFiOmMzOmZlOjU2OjNkOjA0OmJjOjExOmY2OmE2CiMgU0hBMSBGaW5nZXJwcmludDogZjM6NzM6YjM6ODc6MDY6NWE6Mjg6ODQ6OGE6ZjI6ZjM6NGE6Y2U6MTk6MmI6ZGQ6Yzc6OGU6OWM6YWMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU1OjkyOjYwOjg0OmVjOjk2OjNhOjY0OmI5OjZlOjJhOmJlOjAxOmNlOjBiOmE4OjZhOjY0OmZiOmZlOmJjOmM3OmFhOmI1OmFmOmMxOjU1OmIzOjdmOmQ3OjYwOjY2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdXpDQ0E2T2dBd0lCQWdJSVZ3b1JsMExFNDh3d0RRWUpLb1pJaHZjTkFRRUxCUUF3YXpFTE1Ba0dBMVVFCkJoTUNTVlF4RGpBTUJnTlZCQWNNQlUxcGJHRnVNU013SVFZRFZRUUtEQnBCWTNSaGJHbHpJRk11Y0M1QkxpOHcKTXpNMU9EVXlNRGsyTnpFbk1DVUdBMVVFQXd3ZVFXTjBZV3hwY3lCQmRYUm9aVzUwYVdOaGRHbHZiaUJTYjI5MApJRU5CTUI0WERURXhNRGt5TWpFeE1qSXdNbG9YRFRNd01Ea3lNakV4TWpJd01sb3dhekVMTUFrR0ExVUVCaE1DClNWUXhEakFNQmdOVkJBY01CVTFwYkdGdU1TTXdJUVlEVlFRS0RCcEJZM1JoYkdseklGTXVjQzVCTGk4d016TTEKT0RVeU1EazJOekVuTUNVR0ExVUVBd3dlUVdOMFlXeHBjeUJCZFhSb1pXNTBhV05oZEdsdmJpQlNiMjkwSUVOQgpNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQXA4YkVwU21rTE8vbEdNV3dVS052ClVUdWZDbHJKd2tnNENzSWNvQmgva2JXSHVVQS8zUjFvSHdpRDFTMGVpS0Q0ajFhUGJaa0NrcEFXMVY4SWJJblgKNGF5OElNS3g0SU5SaW1sTkFKWmFieS9BUkg2akR1U1J6Vmp1M1B2SEhrVkgzU2U1Q0FHZnBpRWQ5VUV0TDB6OQpLSzNnaXEwaXRGWmxqb1pVajVOREtkNDVSbmlqTUNPNnpmQjlFMWZBWGRLRGEwaE14S3VmZ0ZwYk9yM0pweUkvCmdDY3pXdzYzaWd4ZEJ6Y0l5MnpTZWtjaVJEWEZ6TXd1anQwcTdiZDlaZzFmWVZFaVZSdmpSdVBqUGRBMVlwcmIKcnhUSVc2SE1pUnZoTUNiOG9Kc2ZnYWRISHdUcm96bVNCcCtaMDcvVDZrOVFuQm4rbG9jZVBHWDJveGdrZzRZUQo1MVErcURwMkpFK0JJY1hqRHdMNGs1UkhJTHYrMUE3VGFMbmR4SHFFZ3VOVFZIbmQyNXpTOGdlYkxyYThQdTJGCmJlOGxFZktYR2tKaDkwcVg2SXV4RUFmNlpZR3lvam5QOXp6L0dQdkc4VnFMV2VJQ3JIdVMwRTRVVDFsRjlneGUKS0YrdzZEOUZ6OCt2bTIvN2hOTjNXcFZ2ckpTRW51Njh3RXFQU3BQNFJDSGlNVVZoVUU0UTJPTTFmRXdadE40Rgp2Nk1HbjhpMXplUWYxeGNHRFhxVmRGVU5hQnI4RUJ0aVpKMXQ0SldndzVRSFZ3MFU1cjBGKzdpZjV0K0w0c2JuCmZwYjJVOFdBTkZBb1dQQVNVSEVYTUxybWVHTzg5TEt0bXl1eS91RTVqRjY2Q3lDVTNudUR1UC9qVm8yM0VlazcKalBLeHdWMmRwQXRNSzlteUdQVzFuMHNDQXdFQUFhTmpNR0V3SFFZRFZSME9CQllFRkZMWWlEckluM2htN1luegplemh3bE1rQ0FqYlFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVVXRpSU9zaWZlR2J0CmlmTjdPSENVeVFJQ050QXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRQUwKZTNLSHdHQ21TVXlJV09ZZGlQY1VaRWltMkZnS0RrOFROZDgxSGRUdEJqSElnVDVxMWQwN0dqTHVrRDBSMGk3MApqc05qTGlObXNHZStiN2JBRXpsZ3FxSTBKWk4xVXQ2bm5hME9oNGxTY1dvV1BCa2RnL2lhS1dXKzlEK2EyZkR6CldvY2hjWUJOeStBNG16KzcrdUF3VGMrRzAyVVFHUmpSbHdLeEszSkNhS3lndlU1YTJoaS9hNWlCMFAyYXZsNFYKU00wUkZibkFLVnkwNklqM1BqYXV0Mkw5SG1MZWNIZ1FIRWhiMnJ5a09McG43VlUrWGxmZjFBTkFUSUdrMGs5agpwd2xDQ1JUOEFLbkNnSE5QTHNCQTJSRjdTT3A2QXNEVDZ5Z0JKbGgwd2NCekltMlRsZjA1ZmJzcTQvYUM0eXlYClgwNGZrWlQ2L2l5ajJIWWF1RTJ5T0UrYitoMUlZSGttNHZQOXFkQ2E2SENQU1hyVzViMEtEdHN0ODQyLzYrT2sKZmN2SGxYSG8ycU44eGNMNGRKSUVHNGFzcENKVFFMYXMva3gyei91VU1zQTFuM1kvYnVXUWJxQ21KcUs0TEw3UgpLNFg5cDJqSXVnRXJzV3gwSGJoemxlZnV0OGNsOEFCTUFMSit0Z3VMSFBQQVVKNGx1ZUFJM2pabS96ZWwwYnRVClpDekpKN1ZMa241bC85TXQ0YmxPdkgra1FTR1FRWGVtT1IvcW51T2YwR1p2QmV5cWRuNi9heGFnNjdYSC9KSlUKTHlzUkp5VTNlRXhSYXJEenpGaGRGUEZxU0JYL3dnZTJzWTBQamx4UVJyTTl2d0dZVDdKWlZFYytOSHQ0YlZhVApMblBxWmloNHpSMFV2NkNQTHk2NExvN3lGSXJNNmJWOCsyeWRES1hobGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1UcnVzdGlzIExpbWl0ZWQgT1U9VHJ1c3RpcyBGUFMgUm9vdCBDQQojIFN1YmplY3Q6IE89VHJ1c3RpcyBMaW1pdGVkIE9VPVRydXN0aXMgRlBTIFJvb3QgQ0EKIyBMYWJlbDogIlRydXN0aXMgRlBTIFJvb3QgQ0EiCiMgU2VyaWFsOiAzNjA1MzY0MDM3NTM5OTAzNDMwNDcyNDk4ODk3NTU2MzcxMDU1MwojIE1ENSBGaW5nZXJwcmludDogMzA6Yzk6ZTc6MWU6NmI6ZTY6MTQ6ZWI6NjU6YjI6MTY6Njk6MjA6MzE6Njc6NGQKIyBTSEExIEZpbmdlcnByaW50OiAzYjpjMDozODowYjozMzpjMzpmNjphNjowYzo4NjoxNToyMjo5MzpkOTpkZjpmNTo0Yjo4MTpjMDowNAojIFNIQTI1NiBGaW5nZXJwcmludDogYzE6YjQ6ODI6OTk6YWI6YTU6MjA6OGY6ZTk6NjM6MGE6Y2U6NTU6Y2E6Njg6YTA6M2U6ZGE6NWE6NTE6OWM6ODg6MDI6YTA6ZDM6YTY6NzM6YmU6OGY6OGU6NTU6N2QKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURaekNDQWsrZ0F3SUJBZ0lRR3grdHRpRDVKTk0yYS9mSDhZeWdXVEFOQmdrcWhraUc5dzBCQVFVRkFEQkYKTVFzd0NRWURWUVFHRXdKSFFqRVlNQllHQTFVRUNoTVBWSEoxYzNScGN5Qk1hVzFwZEdWa01Sd3dHZ1lEVlFRTApFeE5VY25WemRHbHpJRVpRVXlCU2IyOTBJRU5CTUI0WERUQXpNVEl5TXpFeU1UUXdObG9YRFRJME1ERXlNVEV4Ck16WTFORm93UlRFTE1Ba0dBMVVFQmhNQ1IwSXhHREFXQmdOVkJBb1REMVJ5ZFhOMGFYTWdUR2x0YVhSbFpERWMKTUJvR0ExVUVDeE1UVkhKMWMzUnBjeUJHVUZNZ1VtOXZkQ0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRApnZ0VQQURDQ0FRb0NnZ0VCQU1WUWU1NDdOZERmeEl6TmpwdnRvOEEybWZSQzZxYytnSU1QcHFkWmg4bVFSVU4rCkFPcUdlU29EdlQwM21ZbG10K1dLVm9hVG5HaExhQVNNazVNQ1BqRFNOem9pWVlrY2hVNTlqOVd2ZXpYMmZpaEgKaVRIY0RubGtINW5TVzdyK2YyQy9yZXZuUERncGFpL2xrUXRWLyt4dldOVXR5ZDVNWm5HUEROY0UyZ2ZtSGhqagp2U2tDcVBvYzRWdTVnNmhCU0x3YWNZM25ZdVV0c3V2ZmZNL2JxMXJLTWZGTUl2TUZFL2VDK1hONURMN1hTeHpBCjBSVThrMEZrMGVhK0l4Y2lBSWxlSDJ1bHJHNm5TNHp0bzNMbXIyTk5MNFhTRkRXYUxrNk02aktZS0lhaGtRbEIKT3JUaDQvTDY4TWtLb2tIZHFlTUR4NGdWT3h6VUdwVFhuMlJaRW0wQ0F3RUFBYU5UTUZFd0R3WURWUjBUQVFILwpCQVV3QXdFQi96QWZCZ05WSFNNRUdEQVdnQlM2K25FbGVZdFhRU1VoaGd0eDY3SmtEb3NoWnpBZEJnTlZIUTRFCkZnUVV1dnB4SlhtTFYwRWxJWVlMY2V1eVpBNkxJV2N3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUg1WS8vMDEKR1gyY0dFK2VzQ3U4am93VS95eWcya2RidysrQkxhOEY2blJJVy9NK1RnZkhiY1d6azg4aU5WeTJQM1VuWHdtVwp6YUQrdmtBTVhCSlYrSk9DeWlucFhqOVdWNHM0TnZkRkdrd296WjVCdU8xV1RJU2tRTWk0c0tVcmFYQUVhc1A0CjFCSXkrUTdEc2R3eWhFUXNiOHRHRCtwbVFROVA4VmlscGcwTkQySGVwWjVkZldXaFBCZm5xRlZPNzZESDdjWkUKZjFUMW8rQ1A4SHhWSW84cHRvR2o0VzFPTEJ1QVoreXRJSjhNWW1IVmwvOUQ3UzNCMmwwcEtvVS9yR1h1aGc4RgpqWkJmMys2ZjlML3VIZnVZNUgrUUs0UjRFQTVzU1ZQdkZWdGxSa3BkcjdyN09uSWR6ZllsaUI2WHpDR2NLUUVOClpldFgyZk5YbHJ0SXpZRT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUJ1eXBhc3MgQ2xhc3MgMiBSb290IENBIE89QnV5cGFzcyBBUy05ODMxNjMzMjcKIyBTdWJqZWN0OiBDTj1CdXlwYXNzIENsYXNzIDIgUm9vdCBDQSBPPUJ1eXBhc3MgQVMtOTgzMTYzMzI3CiMgTGFiZWw6ICJCdXlwYXNzIENsYXNzIDIgUm9vdCBDQSIKIyBTZXJpYWw6IDIKIyBNRDUgRmluZ2VycHJpbnQ6IDQ2OmE3OmQyOmZlOjQ1OmZiOjY0OjVhOmE4OjU5OjkwOjliOjc4OjQ0OjliOjI5CiMgU0hBMSBGaW5nZXJwcmludDogNDk6MGE6NzU6NzQ6ZGU6ODc6MGE6NDc6ZmU6NTg6ZWU6ZjY6Yzc6NmI6ZWI6YzY6MGI6MTI6NDA6OTkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDlhOjExOjQwOjI1OjE5OjdjOjViOmI5OjVkOjk0OmU2OjNkOjU1OmNkOjQzOjc5OjA4OjQ3OmI2OjQ2OmIyOjNjOmRmOjExOmFkOmE0OmEwOjBlOmZmOjE1OmZiOjQ4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGV1RDQ0EwR2dBd0lCQWdJQkFqQU5CZ2txaGtpRzl3MEJBUXNGQURCT01Rc3dDUVlEVlFRR0V3Sk9UekVkCk1Cc0dBMVVFQ2d3VVFuVjVjR0Z6Y3lCQlV5MDVPRE14TmpNek1qY3hJREFlQmdOVkJBTU1GMEoxZVhCaGMzTWcKUTJ4aGMzTWdNaUJTYjI5MElFTkJNQjRYRFRFd01UQXlOakE0TXpnd00xb1hEVFF3TVRBeU5qQTRNemd3TTFvdwpUakVMTUFrR0ExVUVCaE1DVGs4eEhUQWJCZ05WQkFvTUZFSjFlWEJoYzNNZ1FWTXRPVGd6TVRZek16STNNU0F3CkhnWURWUVFEREJkQ2RYbHdZWE56SUVOc1lYTnpJRElnVW05dmRDQkRRVENDQWlJd0RRWUpLb1pJaHZjTkFRRUIKQlFBRGdnSVBBRENDQWdvQ2dnSUJBTmZIWHZmQkI5UjMrME1oOVBUMWFlVHVNZ0hibzRZZjVGa051dWQxZzFMcgo2aHhoRlVpN0hRZktqSzZ3M0phZDZzTmdrb2FDS0hPY1ZnYi9TMlR3RENvM1NiWGx6d3g4N3ZGS3UzTXdaZlBWCkw0TzJmdVBuOVo2cllQblQ4WjJTZElya0hKYXNXNERwdGZReGg2TlIvTWQrb1crT1UzZlVsOEZWTTVJK0dDOTEKMUsyR1NjdVZyMVFHYk5nR0U0MWIvK0VtR1ZuQUpMcUJjWG1RUkZCb0pKUmZ1TE1SOFNsQllhTkJ5eU0yMWNIeApNbEFRVG4vMGhwUHNoTk9PdkV1L1hBRk9CejNjRklxVUNxVHFjL3NMVWVnVEJ4ajZEdkVyMFZRVmZUemg5N1FaClFtZGlYbmZnb2xYc3R0bHBGOVU2cjBUdFNzV2U1SG9uZk9WMTE2ckxKZWZmYXdyYkQwMlRUcWlnelhzdThsa0IKYXJjTnVBZUJmb3M0R3pqbUNsZVpQZTRoNktQMURCYmRpK3cwanB3cUhBQVZGNDFvZzlKd254Z0l6UkZvMWNscgpVczNFUm8vY3RmUFlWM01lNlpRNUJML1QzampldEZQc2FSeWlmc1NQNUJ0d3JmS2krZnYzRm1SbWFaOUpVYUxpCkZSaG5Ca3AvMVd5MVRiTXo0R0hyWGI3cG1BOHkxeDFMUEM1YUFWS1JDZkxmNm8zWUJrQmpxaEhrL3NNM25oUlMKUC9UaXpQSmhrOUg5WjJ2WFVxNi9hS3RBUTZCWE5WTjQ4RlA0WVVJSFpNYlhiNXRNT0ExanJHS3ZOb3VpY3dvTgo5U0c5ZEtwTjZuSURTZHZIWHgxaVk4ZjkzWkhzTSs3MWJiUnVNR2pleU5ZbXNIVmVlN1FISUppaGRqSzRUV3hQCkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZNbUFkK0Jpa29MMVJwenoKdXZkTXc5NjRvNjA1TUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBVTE4aAo5YnF3T2xJNUxKS3diQURKNzg0Zzd3YnlscDdwcEhSL2VoYjh0L1cyK3hVYlA2dW13SEpkRUxGeDdyeFA0NjJzCkEyMHVjUzZ2eE9PdG83ME1FYWUwLzBxeWV4QVFINmRYUWJMQXJ2UXNXZFpIRUlqeklWRXBNTXBnaHE5R3F4M3QKT2x1d2xONUU0MEVJb3NIc0hkYjlUN2JXUjlBVUM4cm15clY3ZDM1QkgxNkR4N2FNT1phd1A1YUJRVzlna09MbworZnNpY2RsOXN6MUd2N1NFcjVBY0Q0OFNhcS92N2g1NnJnSktpaGNyZHY2c1ZJa2tMRTgvdHJLblRveW9rWmY3CktjWjdYQzI1eTJhMnQ2aGJFbEdGdFFsK1luaHcvcWxxWUxZZERua00vY3JxSklCeXc1Yy84bmVyUXlJS3grdTIKRElTQ0xJQnJRWW9Jd091bGE5K1pFc3VLMVY2QURKSGdKZ2cyU01YNk9CRTEveVdETGZKNnY5cjlqdjZseTBVcwpIOFNJVTY1M0R0bWFkc1dPTEIyanV0WHNNcTdBcXF6MzBYcE42OVFINGtqM0lvNndwSjlxem82eXNtRDBveUxRCkkrdVVXbnBwM1ErL1FGZXNhMWxRMmFPWjRXNytqUUY1SnlNVjNwS2Rld2xOV3VkTFNEQmFHT1lLYmVhUDROSzcKNXQ5OGJpR0N3V2c1VGJTWVdHWml6RXFRWHNQNkp3U3hlUlYwbWN5K3JTRGVKbUFjNjFaUnBxUHE1S00vcC85aAozUEZhVFd3eUkwUHVyS2p1N2tvU0NUeGRjY0srZWZyQ2gyZ2RDLzFjYWN3RzBKcDlWSmtxeVRrYUdhOUxLa1B6ClkxMWFXT0l2NHgza3FkYlFDdENldjllQkNmSEp4eVlOckpnV1ZxQT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUJ1eXBhc3MgQ2xhc3MgMyBSb290IENBIE89QnV5cGFzcyBBUy05ODMxNjMzMjcKIyBTdWJqZWN0OiBDTj1CdXlwYXNzIENsYXNzIDMgUm9vdCBDQSBPPUJ1eXBhc3MgQVMtOTgzMTYzMzI3CiMgTGFiZWw6ICJCdXlwYXNzIENsYXNzIDMgUm9vdCBDQSIKIyBTZXJpYWw6IDIKIyBNRDUgRmluZ2VycHJpbnQ6IDNkOjNiOjE4OjllOjJjOjY0OjVhOmU4OmQ1Ojg4OmNlOjBlOmY5OjM3OmMyOmVjCiMgU0hBMSBGaW5nZXJwcmludDogZGE6ZmE6Zjc6ZmE6NjY6ODQ6ZWM6MDY6OGY6MTQ6NTA6YmQ6Yzc6YzI6ODE6YTU6YmM6YTk6NjQ6NTcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGVkOmY3OmViOmJjOmEyOjdhOjJhOjM4OjRkOjM4OjdiOjdkOjQwOjEwOmM2OjY2OmUyOmVkOmI0Ojg0OjNlOjRjOjI5OmI0OmFlOjFkOjViOjkzOjMyOmU2OmIyOjRkCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGV1RDQ0EwR2dBd0lCQWdJQkFqQU5CZ2txaGtpRzl3MEJBUXNGQURCT01Rc3dDUVlEVlFRR0V3Sk9UekVkCk1Cc0dBMVVFQ2d3VVFuVjVjR0Z6Y3lCQlV5MDVPRE14TmpNek1qY3hJREFlQmdOVkJBTU1GMEoxZVhCaGMzTWcKUTJ4aGMzTWdNeUJTYjI5MElFTkJNQjRYRFRFd01UQXlOakE0TWpnMU9Gb1hEVFF3TVRBeU5qQTRNamcxT0ZvdwpUakVMTUFrR0ExVUVCaE1DVGs4eEhUQWJCZ05WQkFvTUZFSjFlWEJoYzNNZ1FWTXRPVGd6TVRZek16STNNU0F3CkhnWURWUVFEREJkQ2RYbHdZWE56SUVOc1lYTnpJRE1nVW05dmRDQkRRVENDQWlJd0RRWUpLb1pJaHZjTkFRRUIKQlFBRGdnSVBBRENDQWdvQ2dnSUJBS1hhQ3BVV1VPT1Y4bDZkZGpFR01ucWI4UkIydUFDYXRWSTJ6U1JIc0o4WQpaTHlhOXZyVmVkaVFZa3dpTDk0NFBkYmdxT2tjTE50NEVlbU9hRkVWY3Nmek00ZmtvRjBMWE9CWEJ5b3c5YzNFCk4zY29UUmlSNXIvVlV2MXhMWEErNThiRWl1UHdLQXYwZHBpaGk0ZFZzam9UL0xjK0p6ZU9JdU9vVHlydllMczkKdHpuRERnRkhtVjBTVDl0RCtsZWg3Zm1kdmhGSEpsc1RtS3RkRm9xd054eFhuVVgvaUpZMnY3dktCM3R2aDJQWAowREpxMWwxc0RQR3piam5pYXpFdU9RQW5GTjQ0d093WlpvWVM2SjF5RmhOa1VzZXBOeHo5Z2pEdGhCZ2Q5SzVjCi8zQVRBT3V4OVRONlM5WlYrQVdOUzJtdzliTW9ObHdVeEZGelRXc0w4VFFIMnhjNTE5d29lMnYxbi9NdXdVOFgKS2hEenpNcm82LzFycXk2YW55MkNiZ1RVVWdHVExUMkcvSDc4Mys5Q0hhWnI3N2tneHZlOW9LZVYvYWZtaVNUWQp6SXcwYk9Jakw5a1NHaUc1VlpGdkM1RjVHUXl0UUlnTGNPSjYwZzdZYUVpN2doTTVFRmpwMkNvSHhoTGJXTnZTCk8xVVFSd1VWWjJKK0dHT21SajhKRGxReVhyOE5Zbm9uNzREbzI5bExCbG8zV2lYUUNCSjMxRzhKVUpjOXlCM0QKMzR4Rk1GYkcwMlNyWnZQQVhwYWN3OFR2dzN4cml6cDVmN05KenozaWlaK2dNRXVGdVp5VUpIbVBmV3VwUldnUApLOUR4Mmh6TGFiaktTV0p0eU5Call0MWdEMWlxajZHOEJhVm1vczhiZHJLRVpMRk1PVkxBTUxyd2pFc0NzTGEzCkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZFZTR6Zi9sYis3NHN1d3YKVGc3NUpiQ09QR3ZETUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBQUNBagpRVFVFa01KQVltRHY0alZNMXorczRqU1F1S0Z2ZHZvV0ZxUklOeXpwa01MeVBQZ0tuOWlCNWJ0YjJpVXNwS2RWCmNTUXk5c2dMOHJ4cStKT3NzZ2ZDWDUvYnpNaUtxcjVxYitGSkVNd3gxNEM3dThqWW9nNWtWK3FpOWNLcE1SWFMKSUdycy9DSUJLTStHdUlBZXFjd1JwVHp5RnJOSG5melNnQ0hFeTlCSGNFR2h5b01aQ0N4dDhsMTNuSW9VRTlRMgpISkx3NVFZMzNLYm1rSnM0ajF4ckcwYUdRMEpmUGdFSFUxUmRaWDMzaW5PaG1sUmFIeWxERkNmQ2hRKzFpSHNhCk81UzNIV0NudFp6bktXbFhXcHVUZWtNd0d3UFhZc2hBcHFyOFpPUksxNUZUQWFnZ2lHNmNYMFM1eTJDQk5PeHYKMDMzYVNGL3J0SkM4TGFrY0M2d2MxYUpvSUlBRTF2eXhqeSs3U2pFTlNvWWM2K0kyS1NiMTJ0akU4blZoejM2dQpkbU5LZWtCbGs0ZjRIb0NNaHVXRzFvOE8vRk1zWU9nV1lScWlQa043elRsZ1ZHcjE4b2ttQVdpRFNLSXo2TWtFCmtiSVJOQkUrNnRCREdSOERrNUFNLzFFOVYvUkJidUhMb0w3cnlXUE5iY3prK0RhcWFKM3R2VjJYY0VRTnRnNDEKM09FTVhidWdVWlRMZmhickVTK2pra1hJVEhIWnZNbVpVbGRHTDFEUHZUVnA5RDBWemdhbExBOCs5b0c2bEx2RAp1NzlsZU5LR2VmOUpPeHFERFBEZWVPekk4azFNR3Q2Q0tmakJXdHJ0N3VZblh1aEYwSjBjVWFob3EwVGowSXRxCjQvZzd1OXhOMTJUeVViN21xcXRhNlRIdUJyeHp2eE5pQ3AvSHVaYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMgTz1ULVN5c3RlbXMgRW50ZXJwcmlzZSBTZXJ2aWNlcyBHbWJIIE9VPVQtU3lzdGVtcyBUcnVzdCBDZW50ZXIKIyBTdWJqZWN0OiBDTj1ULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAzIE89VC1TeXN0ZW1zIEVudGVycHJpc2UgU2VydmljZXMgR21iSCBPVT1ULVN5c3RlbXMgVHJ1c3QgQ2VudGVyCiMgTGFiZWw6ICJULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAzIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogY2E6ZmI6NDA6YTg6NGU6Mzk6OTI6OGE6MWQ6ZmU6OGU6MmY6YzQ6Mjc6ZWE6ZWYKIyBTSEExIEZpbmdlcnByaW50OiA1NTphNjo3MjozZTpjYjpmMjplYzpjZDpjMzoyMzo3NDo3MDoxOTo5ZDoyYTpiZToxMTplMzo4MTpkMQojIFNIQTI1NiBGaW5nZXJwcmludDogZmQ6NzM6ZGE6ZDM6MWM6NjQ6NGY6ZjE6YjQ6M2I6ZWY6MGM6Y2Q6ZGE6OTY6NzE6MGI6OWM6ZDk6ODc6NWU6Y2E6N2U6MzE6NzA6N2E6ZjM6ZTk6NmQ6NTI6MmI6YmQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR3ekNDQXF1Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXgKS3pBcEJnTlZCQW9NSWxRdFUzbHpkR1Z0Y3lCRmJuUmxjbkJ5YVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZApCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlVjblZ6ZENCRFpXNTBaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sCll5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklETXdIaGNOTURneE1EQXhNVEF5T1RVMldoY05Nek14TURBeE1qTTEKT1RVNVdqQ0JnakVMTUFrR0ExVUVCaE1DUkVVeEt6QXBCZ05WQkFvTUlsUXRVM2x6ZEdWdGN5QkZiblJsY25CeQphWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVY25WemRDQkRaVzUwClpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmxZeUJIYkc5aVlXeFNiMjkwSUVOc1lYTnpJRE13Z2dFaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUM5ZFpQd1lpSnZKSzdnZW5hc2ZiM1pKTlc0dC96Tgo4RUxnNjNpSVZsNmJtbFFkVFF5Szl0UFBjUFJTdGRpVEJPTkdobkZCU2l2d0tpeFZBOVpJdytBNU9PM3lYRHcvClJMeVRQV0dyVHMwTnZ2QWdKMWdPUkg4RUdvZWwxNVlVTnBEUVNYdWhkZnNhYTNPeCtNNnBDU3p5VTlYREZFUzQKaHFYMml5czUycU16Vk5uNmNocjNJaFVjaUpGcmYyYmx3MnFBc0NUejM0WkZpUDBaZjNXSEh4K3hHd3B6SkZ1NQpaZUFzVk1oZzAyWVhQK0hNVkROemtRSTZwbjk3ZGptaUg1YTJPSzYxeUpOMEhaNjV0T1ZnblM5VzBlRHJYbHRNCkVuQU1iRVFncXhIWTlCbjIwcHhTTitmNnRzSXhPMHJVRkptdHh4cjFYVi82QjdoOERSL1dneDZ6QWdNQkFBR2oKUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJTMQpBL2QyTzJHQ2FoS3FHRlByQXlHVXYvN095akFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBVmozdmxOVzkybk95CldMNnVrSzJZSjVmK0FiR3dVZ0M0VGVRYklYUWJmc0R1WG1rcUphOWMxaDNhMG5uSjg1Y3A0SWFIM2dSWkQvRloKMUdTRlM1bXZKUVFleVVhcGw5NkNzaHR3bjV6MnIzRXgzWHNGcFN6VHVjcEg5c3J5OXVldHVVZy92QmEzd1czMAo2Z212N1BPMTV3V2VwaDZLVTFIV2s0SE1kSlAydWRxbUpRVjBlVnArUUQ2Q1N5WVJNRzdoUDBISFJ3QTExZlhUCjkxUStnVDNhU1dxYXMrOFFQZWJyYjlISUlrZkx6TThCTVpMWkdPTWl2Z2tlR2o1YXN1UnJERlI2ZlVOT3VJbWwKZTllaVBaYUd6UEltTkMxcWtwMmFHdEF3NGwxT0JMQmZpeUIrZDhFOWxZTFJScG83UEhpNGI2SFFEV1NpZUI0cApUcFBEcEZRVVd3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUVFIENlcnRpZmljYXRpb24gQ2VudHJlIFJvb3QgQ0EgTz1BUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzCiMgU3ViamVjdDogQ049RUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQSBPPUFTIFNlcnRpZml0c2VlcmltaXNrZXNrdXMKIyBMYWJlbDogIkVFIENlcnRpZmljYXRpb24gQ2VudHJlIFJvb3QgQ0EiCiMgU2VyaWFsOiAxMTIzMjQ4Mjg2NzYyMDAyOTE4NzE5MjY0MzE4ODg0OTQ5NDU4NjYKIyBNRDUgRmluZ2VycHJpbnQ6IDQzOjVlOjg4OmQ0OjdkOjFhOjRhOjdlOmZkOjg0OjJlOjUyOmViOjAxOmQ0OjZmCiMgU0hBMSBGaW5nZXJwcmludDogYzk6YTg6Yjk6ZTc6NTU6ODA6NWU6NTg6ZTM6NTM6Nzc6YTc6MjU6ZWI6YWY6YzM6N2I6Mjc6Y2M6ZDcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDNlOjg0OmJhOjQzOjQyOjkwOjg1OjE2OmU3Ojc1OjczOmMwOjk5OjJmOjA5Ojc5OmNhOjA4OjRlOjQ2Ojg1OjY4OjFmOmYxOjk1OmNjOmJhOjhhOjIyOjliOjhhOjc2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFQXpDQ0F1dWdBd0lCQWdJUVZJRDVvSFB0UHdCTXlvblk0M0htU2pBTkJna3Foa2lHOXcwQkFRVUZBREIxCk1Rc3dDUVlEVlFRR0V3SkZSVEVpTUNBR0ExVUVDZ3daUVZNZ1UyVnlkR2xtYVhSelpXVnlhVzFwYzJ0bGMydDEKY3pFb01DWUdBMVVFQXd3ZlJVVWdRMlZ5ZEdsbWFXTmhkR2x2YmlCRFpXNTBjbVVnVW05dmRDQkRRVEVZTUJZRwpDU3FHU0liM0RRRUpBUllKY0d0cFFITnJMbVZsTUNJWUR6SXdNVEF4TURNd01UQXhNRE13V2hnUE1qQXpNREV5Ck1UY3lNelU1TlRsYU1IVXhDekFKQmdOVkJBWVRBa1ZGTVNJd0lBWURWUVFLREJsQlV5QlRaWEowYVdacGRITmwKWlhKcGJXbHphMlZ6YTNWek1TZ3dKZ1lEVlFRRERCOUZSU0JEWlhKMGFXWnBZMkYwYVc5dUlFTmxiblJ5WlNCUwpiMjkwSUVOQk1SZ3dGZ1lKS29aSWh2Y05BUWtCRmdsd2EybEFjMnN1WldVd2dnRWlNQTBHQ1NxR1NJYjNEUUVCCkFRVUFBNElCRHdBd2dnRUtBb0lCQVFESUlNRHM0TVZMcXdkNGxmTkU3dnNMRFA5MGptRzdzV0xxSTlpcm9XVXkKZXV1T0YwK1cyQXA3a2FKamJNZU1UQzU1djZrRi9HbGNsWTFpK2JsdzdjTlJmZENUNW16ck1Fdmh2SDIvVXB2TwpibnRsOGppeHdLSXk3Mkt5YU9CaFU4RTJsZi9zbExvMnJwd2NweklQNVh5MHhtOTAvWHNZNkt4WDdRWWdTekl3CldGdjl6YWptb2Z4d3ZJNlNjOXVYcDN3aHJqM0I5VWlIYkNlOW55VjBnVld3OTNYMlBhUmthOVpQNTg1QXJRL2QKTXRPOGloSlRtTW1KK3hBZFRYN05maDlXRFNGd2hmWWdneC8ydWg4RWorcDNpRFhFLytwT29ZdE5QMk1iUk1ORQoxQ1YyeXJlTjF4NUtabVROWE1XY2crSENDSWlhN0U2ajhUNGNMTmxzSGFGTEFnTUJBQUdqZ1lvd2dZY3dEd1lEClZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGQkx5V2o3cVZoeS8KelFhczhmRWx5YWxMMUJTWk1FVUdBMVVkSlFRK01Ed0dDQ3NHQVFVRkJ3TUNCZ2dyQmdFRkJRY0RBUVlJS3dZQgpCUVVIQXdNR0NDc0dBUVVGQndNRUJnZ3JCZ0VGQlFjRENBWUlLd1lCQlFVSEF3a3dEUVlKS29aSWh2Y05BUUVGCkJRQURnZ0VCQUh2MjVNQU5xaGxIdDAxWG8vNnR1N0ZxMVErZTIrUmp4WTZoVUZhVGxyZzR3Q1FpWnJ4VEZHR1YKdjlESEtwWTVQMzBvc3hCQUlXckVyN0JTZHhqaGx0aFdYZVBkTmw0ZHAxQlVvTVVxNUtxTWxJcFBuVFgvZHFRRwpFNUdpb24wQVJEOVYwNEk4R3RWYnZGWk1JaTVHUTRva1FDM3pFcmc3Y0Jxa2xya2FyNGRCR21vWURRWlB4ejV1CnVTbE5EVW1KRVljeVcrWkxCTWprWE9aMGM1UmRGcGdUbGY3NzI3RkU1VHB3ckRkcjVyTXpjaWpKczFlZzlnSVcKaUFZTHRxWkxJQ2pVM2oyTHJUY0ZVM1QrYnN5OFF4ZHhYdm5GekJxcFllNzNkZ3p6Y3ZSeXJjOXlBallIUjgvdgpHVkNKWU16cEpKVVB3c3NkOG05MmtNZk1kY0dXeFowPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiAyMDA5IE89RC1UcnVzdCBHbWJICiMgU3ViamVjdDogQ049RC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiAyMDA5IE89RC1UcnVzdCBHbWJICiMgTGFiZWw6ICJELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIDIwMDkiCiMgU2VyaWFsOiA2MjM2MDMKIyBNRDUgRmluZ2VycHJpbnQ6IGNkOmUwOjI1OjY5OjhkOjQ3OmFjOjljOjg5OjM1OjkwOmY3OmZkOjUxOjNkOjJmCiMgU0hBMSBGaW5nZXJwcmludDogNTg6ZTg6YWI6YjA6MzY6MTU6MzM6ZmI6ODA6Zjc6OWI6MWI6NmQ6Mjk6ZDM6ZmY6OGQ6NWY6MDA6ZjAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQ5OmU3OmE0OjQyOmFjOmYwOmVhOjYyOjg3OjA1OjAwOjU0OmI1OjI1OjY0OmI2OjUwOmU0OmY0OjllOjQyOmUzOjQ4OmQ2OmFhOjM4OmUwOjM5OmU5OjU3OmIxOmMxCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTXpDQ0F4dWdBd0lCQWdJRENZUHpNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1FMHhDekFKQmdOVkJBWVRBa1JGCk1SVXdFd1lEVlFRS0RBeEVMVlJ5ZFhOMElFZHRZa2d4SnpBbEJnTlZCQU1NSGtRdFZGSlZVMVFnVW05dmRDQkQKYkdGemN5QXpJRU5CSURJZ01qQXdPVEFlRncwd09URXhNRFV3T0RNMU5UaGFGdzB5T1RFeE1EVXdPRE0xTlRoYQpNRTB4Q3pBSkJnTlZCQVlUQWtSRk1SVXdFd1lEVlFRS0RBeEVMVlJ5ZFhOMElFZHRZa2d4SnpBbEJnTlZCQU1NCkhrUXRWRkpWVTFRZ1VtOXZkQ0JEYkdGemN5QXpJRU5CSURJZ01qQXdPVENDQVNJd0RRWUpLb1pJaHZjTkFRRUIKQlFBRGdnRVBBRENDQVFvQ2dnRUJBTk95U3M5NlIrOTFteVA2T2kvV1VFV0pOVHJHYTl2KzJ3Qm9xT0FERVIwMwpVQWlmVFVwb2xEV3pVOUdVWTZjZ1ZxL2VVWGpzS2ozelNFaFFQZ3JmUmxXTEoyM0RFRTBOa1ZKRDJJZmdYVTQyCnRTSEtYemxBQkY5YmZzeWp4aXVwUUI3Wk5vVFdTUE9TSGpSR0lDVEJwRkdPU2hydlVEOXBYUmwvUmNQSEFZOVIKeVNQb2NxNjB2RllKZnhMTEhMR3ZLWkFLeVZYTUQ5TzBHdTFITlZwSzdaeHpCQ0hRcXIwTUU3VUF5aVpzeEdzTQpsRnFWbE5wUW12SC9wU3RtTWFUSk9LRGZIUis0Q1M3enAraG5VcXVWSCtCR1B0aWt3OHBheFRHQTZFaWFuNVJwCi9obmQySE44Z2NxVzNvN3RzeklGWllRMDV1YjlWeEMxWDNhL0w3QVFEY1VDQXdFQUFhT0NBUm93Z2dFV01BOEcKQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGUDNhRk1TZk1ONGh2UjVDT2Z5cll5Tko0UEdFTUE0RwpBMVVkRHdFQi93UUVBd0lCQmpDQjB3WURWUjBmQklITE1JSElNSUdBb0g2Z2ZJWjZiR1JoY0RvdkwyUnBjbVZqCmRHOXllUzVrTFhSeWRYTjBMbTVsZEM5RFRqMUVMVlJTVlZOVUpUSXdVbTl2ZENVeU1FTnNZWE56SlRJd015VXkKTUVOQkpUSXdNaVV5TURJd01Ea3NUejFFTFZSeWRYTjBKVEl3UjIxaVNDeERQVVJGUDJObGNuUnBabWxqWVhSbApjbVYyYjJOaGRHbHZibXhwYzNRd1E2QkJvRCtHUFdoMGRIQTZMeTkzZDNjdVpDMTBjblZ6ZEM1dVpYUXZZM0pzCkwyUXRkSEoxYzNSZmNtOXZkRjlqYkdGemMxOHpYMk5oWHpKZk1qQXdPUzVqY213d0RRWUpLb1pJaHZjTkFRRUwKQlFBRGdnRUJBSCtYMnpESTM2U2NmU0Y2Z0hET0ZCSnBpQlNWWUVRQnJMTHBNRStiVU1KbTJINk5NTFZ3TWVuaQphY2Z6Y05zZ0ZZYlFEZkMrckFGMWhNNStuMDIvdDJBN25QUEtIZUplYU5pam5aZmxRR0RTTmlIKzBMUzRGOXAwCm8zL1UzN0NZQXF4dmEyc3NKU1J5b1dYdUpWcmw1akxuOHQrclNmcnprR2tqMndUWjUxeFkvR1hVbDc3TS9DNEsKekNVcU5RVDRZSkVWZFQxQi95TWZHY2hzNjRKVEJLYmtUQ0pOall5NnpsdHo3R1JVVUczUm5GWDdhY00ydzR5OApQSVdtYXdvbURlQ1RtR0N1ZnNZa2w0cGhYNUdPWnBJSmh6Yk5pNXN0UHZaUjFGRFVXU2k5Zy9MTUtIdFRobTNZCkpvaHcxK3FSelQ2NXlzQ1FibHJHWG5SbDExeitvK0k9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1ELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIEVWIDIwMDkgTz1ELVRydXN0IEdtYkgKIyBTdWJqZWN0OiBDTj1ELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIEVWIDIwMDkgTz1ELVRydXN0IEdtYkgKIyBMYWJlbDogIkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOSIKIyBTZXJpYWw6IDYyMzYwNAojIE1ENSBGaW5nZXJwcmludDogYWE6YzY6NDM6MmM6NWU6MmQ6Y2Q6YzQ6MzQ6YzA6NTA6NGY6MTE6MDI6NGY6YjYKIyBTSEExIEZpbmdlcnByaW50OiA5NjpjOToxYjowYjo5NTpiNDoxMDo5ODo0MjpmYTpkMDpkODoyMjo3OTpmZTo2MDpmYTpiOToxNjo4MwojIFNIQTI1NiBGaW5nZXJwcmludDogZWU6YzU6NDk6NmI6OTg6OGM6ZTk6ODY6MjU6Yjk6MzQ6MDk6MmU6ZWM6Mjk6MDg6YmU6ZDA6YjA6ZjM6MTY6YzI6ZDQ6NzM6MGM6ODQ6ZWE6ZjE6ZjM6ZDM6NDg6ODEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVRekNDQXl1Z0F3SUJBZ0lEQ1lQME1BMEdDU3FHU0liM0RRRUJDd1VBTUZBeEN6QUpCZ05WQkFZVEFrUkYKTVJVd0V3WURWUVFLREF4RUxWUnlkWE4wSUVkdFlrZ3hLakFvQmdOVkJBTU1JVVF0VkZKVlUxUWdVbTl2ZENCRApiR0Z6Y3lBeklFTkJJRElnUlZZZ01qQXdPVEFlRncwd09URXhNRFV3T0RVd05EWmFGdzB5T1RFeE1EVXdPRFV3Ck5EWmFNRkF4Q3pBSkJnTlZCQVlUQWtSRk1SVXdFd1lEVlFRS0RBeEVMVlJ5ZFhOMElFZHRZa2d4S2pBb0JnTlYKQkFNTUlVUXRWRkpWVTFRZ1VtOXZkQ0JEYkdGemN5QXpJRU5CSURJZ1JWWWdNakF3T1RDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUpueGhEUnd1aSszTUtDT3ZYd0V6NzVpdkpuOWdwZlNlZ3BuCmxqZ0o5aEJPbFNKem1ZM2FGUzNuQmZ3WmN5SzNqcGdBdkR3OXJLRnMrOVo1SlV1dDhNeGsyb2crS2JnUENkTTAKM1RQMVl0SGh6Um5wN2hoUFRGaXU0aDdXREZzVld0ZzZ1TVFZWkI3ak03SzFpWGRPREwvWmxHc1RsMjhTby82WgpxUVRNRmV4Z2FEYnRDSHUzOWIrVDdXWXhnNHpHY1RTSFRoZnFyNHVSalJ4V1FhNGlOMTQzOGgzWjBTME5MMmxSCnA3NW1wb282S3IzSEdySGhGUEMrT2gyNXoxdXhhdjYwc1VZZ292c2VPM0R2azVoOWpIT1c4c1h2aFhDdEtTYjgKSGdRK0hLRFlEOHRTZzJKODdvdFRsWkNwVjZMcVlRWFkrVTNFSi9wdXJlMzUxMUgzYTZVQ0F3RUFBYU9DQVNRdwpnZ0VnTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk5PVWlreGlFeW9aTHN5dmNvcDlOdGVhCkhOeG5NQTRHQTFVZER3RUIvd1FFQXdJQkJqQ0IzUVlEVlIwZkJJSFZNSUhTTUlHSG9JR0VvSUdCaG45c1pHRncKT2k4dlpHbHlaV04wYjNKNUxtUXRkSEoxYzNRdWJtVjBMME5PUFVRdFZGSlZVMVFsTWpCU2IyOTBKVEl3UTJ4aApjM01sTWpBekpUSXdRMEVsTWpBeUpUSXdSVllsTWpBeU1EQTVMRTg5UkMxVWNuVnpkQ1V5TUVkdFlrZ3NRejFFClJUOWpaWEowYVdacFkyRjBaWEpsZG05allYUnBiMjVzYVhOME1FYWdSS0JDaGtCb2RIUndPaTh2ZDNkM0xtUXQKZEhKMWMzUXVibVYwTDJOeWJDOWtMWFJ5ZFhOMFgzSnZiM1JmWTJ4aGMzTmZNMTlqWVY4eVgyVjJYekl3TURrdQpZM0pzTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFBMDdYdGFQS1NVaU84YUVYVUhMN1ArUFBvZVVTYnJoL1lwCjN1RHgxTVlrQ2VuQnoxVWJ0RERaemhyK0JsR21GYVF0NzdKTHZ5QW9KVW5ScGpaM05PaGszMUt4RWNkemVzMDUKbnNLdGpIRWg4bHBycjk4OFRsV3Zzb1JsRkltNWQ4c3FNYjdQbzIzUGIwaVVNa1p2NTNHTW9LYUVHVGNIOGdORgpDU3VHZFh6ZlgybFhBTnR1MktaeUlrdFExSFdZVnQrM0dQOURRMUN1ZWtSNzhIbFIxME05cDlPQjAvREpUN25hCnhwZUcwSUxENUVKdC9yRGlaRTRPSnVkQU5DYTFDSW5YQ0dOak9DZDFIalBxYnFqZG41bFBkRTJCaVlCTDNacVgKS1Z3dnZvRkJ1WXovNm4xZ0JwN04xejNUTHFNVnZLam1KdVZ2dzl5NEF5SHFueGJ4TEZTMQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q0EgRGlzaWcgUm9vdCBSMiBPPURpc2lnIGEucy4KIyBTdWJqZWN0OiBDTj1DQSBEaXNpZyBSb290IFIyIE89RGlzaWcgYS5zLgojIExhYmVsOiAiQ0EgRGlzaWcgUm9vdCBSMiIKIyBTZXJpYWw6IDEwNTcyMzUwNjAyMzkzMzM4MjExCiMgTUQ1IEZpbmdlcnByaW50OiAyNjowMTpmYjpkODoyNzphNzoxNzo5YTo0NTo1NDozODoxYTo0MzowMTozYjowMwojIFNIQTEgRmluZ2VycHJpbnQ6IGI1OjYxOmViOmVhOmE0OmRlOmU0OjI1OjRiOjY5OjFhOjk4OmE1OjU3OjQ3OmMyOjM0OmM3OmQ5OjcxCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlMjozZDo0YTowMzo2ZDo3Yjo3MDplOTpmNTo5NTpiMTo0MjoyMDo3OTpkMjpiOToxZTpkZjpiYjoxZjpiNjo1MTphMDo2MzozZTphYTo4YTo5ZDpjNTpmODowNzowMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmFUQ0NBMUdnQXdJQkFnSUpBSks0aU51d2lzRmpNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1GSXhDekFKQmdOVgpCQVlUQWxOTE1STXdFUVlEVlFRSEV3cENjbUYwYVhOc1lYWmhNUk13RVFZRFZRUUtFd3BFYVhOcFp5QmhMbk11Ck1Sa3dGd1lEVlFRREV4QkRRU0JFYVhOcFp5QlNiMjkwSUZJeU1CNFhEVEV5TURjeE9UQTVNVFV6TUZvWERUUXkKTURjeE9UQTVNVFV6TUZvd1VqRUxNQWtHQTFVRUJoTUNVMHN4RXpBUkJnTlZCQWNUQ2tKeVlYUnBjMnhoZG1FeApFekFSQmdOVkJBb1RDa1JwYzJsbklHRXVjeTR4R1RBWEJnTlZCQU1URUVOQklFUnBjMmxuSUZKdmIzUWdVakl3CmdnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNpbzhRQUNkYUZYUzF0RlBiQ3czT2UKTmNKeFZYNkIrNnRHVU9EQmZFbDQ1cXQ1V0R6YS8zd2NuOWlYQW5nK2EwRUU2VUc5dmdNc1JmWXZaTlNyWGFOSApQV1NiNldpYXhzd2JQN3Erc29zMEFpNllWUm44akcrcVg5cE16azBESWFQWTBqU1RWcGJMVEF3QUZqeGZHczNJCngyeW1yZE14cDd6bzVlRm0xdEw3QTdSQlpja1FyZzRGWThhQWFta3cvZEx1a084Tko5K2ZsWFAwNFNYYWJCYmUKUVRnMDZvdjgwZWdFRkdFdFFYNnN4M2RPeTFGVSsxNlNHQnNFV21qR3ljVDZ0eE9nbUxjUks3ZldWOHg4bmhmUgp5eVgraGs0a0xsWU1lRTJlQVJLbUs2Y0JaVzU4WWgyRWhOL3F3R3UxcFNxVmc4TlRFUXh6SFF1eVJwRFJRanJPClFHNlZyZi9HbEsxdWw0U09mVytlaW9BTlNXMXo0bnVTSHNQendmUHJMZ1Z2MlJ2UE4zWUV5TFJhNUJlbnk5MTIKSDlBWmR1Z3NCYlBXbkRUWWx0eGhoNUVGNUVRSU04SGF1UWhsMUs2eU5nM3J1amk2RE9XYm51dU5adDJaejlhSgpRZllFa29vcEtXMXJPaHpuZFgwQ2NRN3p3T2U5eXhuZG5XQ3l3bVpndHJFRTdzbm1ocm1hWmtDbzV4SHRnVVVECmkvWm5XZWpCQmhHOTNjK0FBazlsUUhoY1IxREltK1lmZ1h2a1JLaGJoWnJpM2xyVngvazZSR1pMNURKVWZPUnMKbkxNT1BSZWlzalFTMW42eXFFbTcwWG9vUUw2aUZoL2Y1RGNmRVhQN2tBcGxRNklOZlBnR0FWVXpmYkFOdVBUMQpycVZDVjN3MkVZeDdYc1FEbll4NW5RSURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkCkR3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVV0Wm40cjdDVTllTWcxZ3F0ems1V3BDNXVRdTB3RFFZSktvWkkKaHZjTkFRRUxCUUFEZ2dJQkFDWUdYbkRuWlRQSWdtN1puQmM2RzNwbXNnSDJlRHRwWGkvcS8wNzVLTU9ZS21GTQp0Q1FTaW4xdEVSVDNuTFhLNXJ5ZUo0NU1HY2lwdlhyQTF6WU9iWVZ5YnFqR29tMzIrbk5qZjd4dWVRZ2NuWXFmCkdvcFRwdGk3MlRWVnNSSEZxUU96Vmp1NWhKTWlYbjdCOWhKU2krb3NaN3orTmt6MXVNL1JzMG1TTzlNcERwa2IKbHZkaHVEdkVLN1o0YkxRamIvRDkwN0plZFIrWmxhaXM5dHJoeFRGNys5RkdzOUs4WjdSaVZMb0o5Mk93azZLYQorZWxTTG90Z0Vxdjg5V0JXN3hCY2k4UWFRdHlEVzJRT3k3Vzgxay9CZkR4dWpSTnQrM3ZyTU5EY1RhL0YxYmFsClRGdHh5ZWd4dnVnNEJraWhHdUxxMHQ0U09WZ2EvNEFPZ25YbXQ4a0hiQTd2L3pqeG1ISEV0MzhPRmRBbGFiMGkKblN2dEJmWkdSNnp0d1BEVU8rTHM3cFpia0JOT0hsWTY2N0R2bHJ1V0l4RzY4a09HZEdTVnlDaDEzeDAxdXRJMwpnemhUT0RZN3oyenArV3NPMFBzRTZFOTMxMlVCZUlZTWVqNGhZdkYvWTNFTXlaOUUyNmdub25XK2JvRSsxOERyCkc1Z1BjRncwc29yTXdJVVk2MjU2cy9kYW9RZS9xVUtTODJBaWwrUVVvUWViVG5iQWpuMzlwQ1hIUiszL0gzT3MKek1PbDZXOEtqcHRsd2xDRnRhT2dVeExNVllkaDg0R3VFRVpodlVRaHVNSTlkTTkrSkRYNkhBY09tejBpeXU4eApMNHlzRXIzdlFDajhLV2Vmc2hOUFppVEVVeG5wSGlrVjcrWnRzSDh0Wi8zemJCdDFScVBsU2hmcHBOY0wKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFDQ1ZSQUlaMSBPPUFDQ1YgT1U9UEtJQUNDVgojIFN1YmplY3Q6IENOPUFDQ1ZSQUlaMSBPPUFDQ1YgT1U9UEtJQUNDVgojIExhYmVsOiAiQUNDVlJBSVoxIgojIFNlcmlhbDogNjgyODUwMzM4NDc0ODY5NjgwMAojIE1ENSBGaW5nZXJwcmludDogZDA6YTA6NWE6ZWU6MDU6YjY6MDk6OTQ6MjE6YTE6N2Q6ZjE6YjI6Mjk6ODI6MDIKIyBTSEExIEZpbmdlcnByaW50OiA5MzowNTo3YTo4ODoxNTpjNjo0ZjpjZTo4ODoyZjpmYTo5MToxNjo1MjoyODo3ODpiYzo1Mzo2NDoxNwojIFNIQTI1NiBGaW5nZXJwcmludDogOWE6NmU6YzA6MTI6ZTE6YTc6ZGE6OWQ6YmU6MzQ6MTk6NGQ6NDc6OGE6ZDc6YzA6ZGI6MTg6MjI6ZmI6MDc6MWQ6ZjE6Mjk6ODE6NDk6NmU6ZDE6MDQ6Mzg6NDE6MTMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUgwekNDQmJ1Z0F3SUJBZ0lJWHNPM3BrTi9wT0F3RFFZSktvWklodmNOQVFFRkJRQXdRakVTTUJBR0ExVUUKQXd3SlFVTkRWbEpCU1ZveE1SQXdEZ1lEVlFRTERBZFFTMGxCUTBOV01RMHdDd1lEVlFRS0RBUkJRME5XTVFzdwpDUVlEVlFRR0V3SkZVekFlRncweE1UQTFNRFV3T1RNM016ZGFGdzB6TURFeU16RXdPVE0zTXpkYU1FSXhFakFRCkJnTlZCQU1NQ1VGRFExWlNRVWxhTVRFUU1BNEdBMVVFQ3d3SFVFdEpRVU5EVmpFTk1Bc0dBMVVFQ2d3RVFVTkQKVmpFTE1Ba0dBMVVFQmhNQ1JWTXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDYgpxYXUvWVVxWHJ5K1hacHAwWDlEWmx2M1A0dVJtN3g4ZlJ6UENSS1BmbXQ0ZnRWVGRGWHhwTlJGdnU4Z01qbW9ZCkh0aVAyUmE4RUVnMlhQQmpzNUJhWENRMzE2UFd5d2x4dWZFQmNvU3dmZHROZ00zODAyL0orTnEyRG9MU1JZV28KRzJpb1BlajBSR3k5b2NMTEE3Nk1QaE1BaE45S1NNRGpJZ3JvNlRlbkdFeXhDUTBqVm44RVRka1hoQmlseU5wQQpsSFByemc1WFBBT0JPcDBLb1ZkRGFheFhiWG1RZU9XMXREdll2RXlOS0tHbm82ZTZBazRsMFNxdTdhNERJcmhyCklBOHdLRlNWZitEdXpncG1uZEZBTFc0aXI1MGF3UVVaMG0vQThwLzRlN01DUXZ0UXFSMHRrdzhqcThiQkQ1TC8KMEtJVjlWTUpjUnovUlJPRTVpWmUrT0NJSEFyOEZyYW9jd2E0OEdPRUFxREdXdXpuZE45d3JxT0RKZXJXeDVlSAprNmZHaW9vemwyQTNFRDZYUG00cEZkYWhEOUdJTEJLZmI2cWt4a0xyUWFMamxVUFRBWVZ0anJzNzh5TTJ4LzQ3CjRLRWxCMGlyeVlsMC93aVBnTC9BbG1Yejd1eExhTDJkaU1NeHMwRHg2TS8yT0x1YzVORi8xT1ZZbTN6NjFQTU8KbTNXUjVMcFNMaGwrMGZYTldobjh1Z2IyKzFLb1M1a0UzZmo1dEl0UW8wNWlpZkNISlBxRFFzR0grdFV0S1NwYQpjWHBrYXRjbllHTU4yODVKOVkwZmtJa3lGL2h6UTdqU1dwT0dZZGJoZFFycWVXWjJpRTl4NndRbDFncGFlcFBsCnVVc1hRQSt4dHJuMTNrL2M0TE9zT3hGd1lJUktRMjZaSU1BcGNRckFaUUlEQVFBQm80SUN5ekNDQXNjd2ZRWUkKS3dZQkJRVUhBUUVFY1RCdk1Fd0dDQ3NHQVFVRkJ6QUNoa0JvZEhSd09pOHZkM2QzTG1GalkzWXVaWE12Wm1scwpaV0ZrYldsdUwwRnlZMmhwZG05ekwyTmxjblJwWm1sallXUnZjeTl5WVdsNllXTmpkakV1WTNKME1COEdDQ3NHCkFRVUZCekFCaGhOb2RIUndPaTh2YjJOemNDNWhZMk4yTG1Wek1CMEdBMVVkRGdRV0JCVFNoN1RqM3pjbmsxWDIKVnVxQjVUYk1qQjQvdlRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZOS0h0T1BmTnllVApWZlpXNm9IbE5zeU1Iais5TUlJQmN3WURWUjBnQklJQmFqQ0NBV1l3Z2dGaUJnUlZIU0FBTUlJQldEQ0NBU0lHCkNDc0dBUVVGQndJQ01JSUJGQjZDQVJBQVFRQjFBSFFBYndCeUFHa0FaQUJoQUdRQUlBQmtBR1VBSUFCREFHVUEKY2dCMEFHa0FaZ0JwQUdNQVlRQmpBR2tBOHdCdUFDQUFVZ0JoQU8wQWVnQWdBR1FBWlFBZ0FHd0FZUUFnQUVFQQpRd0JEQUZZQUlBQW9BRUVBWndCbEFHNEFZd0JwQUdFQUlBQmtBR1VBSUFCVUFHVUFZd0J1QUc4QWJBQnZBR2NBCjdRQmhBQ0FBZVFBZ0FFTUFaUUJ5QUhRQWFRQm1BR2tBWXdCaEFHTUFhUUR6QUc0QUlBQkZBR3dBWlFCakFIUUEKY2dEekFHNEFhUUJqQUdFQUxBQWdBRU1BU1FCR0FDQUFVUUEwQURZQU1BQXhBREVBTlFBMkFFVUFLUUF1QUNBQQpRd0JRQUZNQUlBQmxBRzRBSUFCb0FIUUFkQUJ3QURvQUx3QXZBSGNBZHdCM0FDNEFZUUJqQUdNQWRnQXVBR1VBCmN6QXdCZ2dyQmdFRkJRY0NBUllrYUhSMGNEb3ZMM2QzZHk1aFkyTjJMbVZ6TDJ4bFoybHpiR0ZqYVc5dVgyTXUKYUhSdE1GVUdBMVVkSHdST01Fd3dTcUJJb0VhR1JHaDBkSEE2THk5M2QzY3VZV05qZGk1bGN5OW1hV3hsWVdSdAphVzR2UVhKamFHbDJiM012WTJWeWRHbG1hV05oWkc5ekwzSmhhWHBoWTJOMk1WOWtaWEl1WTNKc01BNEdBMVVkCkR3RUIvd1FFQXdJQkJqQVhCZ05WSFJFRUVEQU9nUXhoWTJOMlFHRmpZM1l1WlhNd0RRWUpLb1pJaHZjTkFRRUYKQlFBRGdnSUJBSmN4QXAvbi9VTm5TRVFVNUNtSDdVd29adENQTmRwTlliZEtsMDIxMjVEZ0JTNE94bm5ROHBkcApENzBFUjltKzI3VXAycHZacnFtWjFkTThNSlAxamFHby9BYU5SUFRLRnBWOE05eGlpNmczK0NmWUNTMGI3OGdVCkp5Q3BaRVQvTHRaMXFteE5ZRUFaU1VOVVk5cml6THBtNVU5RWVsdlphb0VyUU5WLytRRW5XQ3pJN1VpUmZEK20KQU0vRUtYTVJOdDZHR1Q2ZDdobUtHOVd3N1k0OW5DckFEZGc5WnVNOERiM1ZsRnppNHFjMUd3UUE5ajlhamVwRAp2VitKSGFuQnNNeVo0azBBQ3RySkoxdm5FNUJjNVBVem9sVnQzT0FKVFMreEpsc25kUUFKeEdKM0tRaGZubG1zCnRuNnRuMVF3SWdQQkhuRmsvdms0Q3BZWTNRSVVyQ1BMQmh3ZXBIMk5EZDRuUWVpdDJoVzNzQ1BkSzZqVDJpV0gKN2VoVlJFMkk5RForaEpwNHJQY09Wa2tPMWpNbDFvUlFRbXdnRWgwcTFiNjg4bkNCcEhCZ3ZnVzFtNTRFUkw1aApJNnpwcFNTTUVZQ1VXcUtpdVVuU3dkelJwKzB4RVN5ZUdhYnU0Vlhod09yUERZVGtGN2VpZktYZVZTVUc3c3pBCmgxeEEyc3lWUDFYZ05jZTRoTDYwWGMxNmd3Rnk3b2ZtWHgydXRZWEdKdC9td1pycEhnSkhueXFvYmFsYnoreEYKZDMrWUo1b3lYU3JqaE83Rm1HWXZsaUFkM2RqREo5ZXcrZjdaZmMzUW40OExGRmhSbnkrTHd6Z3QzdWlQMW8ySApwUFZXUXhhWkxQU2tWclEwdUdFM3ljSllnQnVnbDZIOFdZM3BFZmJSRDB0Vk5FWXFpNFk3Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UV0NBIEdsb2JhbCBSb290IENBIE89VEFJV0FOLUNBIE9VPVJvb3QgQ0EKIyBTdWJqZWN0OiBDTj1UV0NBIEdsb2JhbCBSb290IENBIE89VEFJV0FOLUNBIE9VPVJvb3QgQ0EKIyBMYWJlbDogIlRXQ0EgR2xvYmFsIFJvb3QgQ0EiCiMgU2VyaWFsOiAzMjYyCiMgTUQ1IEZpbmdlcnByaW50OiBmOTowMzo3ZTpjZjplNjo5ZTozYzo3Mzo3YToyYTo5MDowNzo2OTpmZjoyYjo5NgojIFNIQTEgRmluZ2VycHJpbnQ6IDljOmJiOjQ4OjUzOmY2OmE0OmY2OmQzOjUyOmE0OmU4OjMyOjUyOjU1OjYwOjEzOmY1OmFkOmFmOjY1CiMgU0hBMjU2IEZpbmdlcnByaW50OiA1OTo3Njo5MDowNzpmNzo2ODo1ZDowZjpjZDo1MDo4NzoyZjo5Zjo5NTpkNTo3NTo1YTo1YjoyYjo0NTo3ZDo4MTpmMzo2OToyYjo2MTowYTo5ODo2NzoyZjowZToxYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlFUQ0NBeW1nQXdJQkFnSUNETDR3RFFZSktvWklodmNOQVFFTEJRQXdVVEVMTUFrR0ExVUVCaE1DVkZjeApFakFRQmdOVkJBb1RDVlJCU1ZkQlRpMURRVEVRTUE0R0ExVUVDeE1IVW05dmRDQkRRVEVjTUJvR0ExVUVBeE1UClZGZERRU0JIYkc5aVlXd2dVbTl2ZENCRFFUQWVGdzB4TWpBMk1qY3dOakk0TXpOYUZ3MHpNREV5TXpFeE5UVTUKTlRsYU1GRXhDekFKQmdOVkJBWVRBbFJYTVJJd0VBWURWUVFLRXdsVVFVbFhRVTR0UTBFeEVEQU9CZ05WQkFzVApCMUp2YjNRZ1EwRXhIREFhQmdOVkJBTVRFMVJYUTBFZ1IyeHZZbUZzSUZKdmIzUWdRMEV3Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUN3QmR2STY0ekVib29oNzQ1Tm5IRUtIMUp3N1cyQ25KZkYKMTB4T1JVbkxRRUsxRWpSc0djSjBwREZmaFFLWDdFTXpDbFBTbkl5T3Q3aDUyeXZWYXZLT1pzVHVLd0VIa3RTegowQUxmVVBaVnIyWU95K0JIWUM4ck1qazFVam9vZy9oN0ZzWVl1R0xXUnlXUnp2QVpFazJ0WS9YVFAzVmZLZkNoCk1Cd3FvSmltRmIzdS9SazI4T0tSUTQvNnl0WVFKMGxNNzkzQjhZVndtOHJxcUZwRC9HMkdiM1BwTjBXcDhEYkgKekloMUhydHNCditiYXo0WDdHR3FjWHpHSGFMM1Nla1Z0VHpXb1dIMUVmY0ZieDM5RWI3UU1BZkNLYkFKVGliYwo0Nktva1dvZndwRkZpRnpsbUxoeHBSVVp5WHgxRWN4d2RFOHRteDJSUlAxV0tLRCt1NFpxeVBwY0MxamN4a3QyCnlLc2kyWE1QcGZSYUFvay9UNTRpZ3U2aWRGTXFQVk1uYVIxc2pqSXNaQUFtWTJFMlRxTkd0ejk5c3kyc2JaQ2kKbGFMT3o5cUM1d2MwR1picHVDR3FLWDZtT0w2T0tVb2habmtmczhPMUNXZmUxdFFIUnZNcTJ1WWlOMkRMZ2JZUApvQS9weUpWL3YxV1JCWHJQUFJYQWI5NEpsQUdEMXpRYnpFQ2w4TGliWjlXWWtUdW5oSGlWSnFSYUNQZ3JkTFFBCkJEemZ1QlNPNk4rcGpXeG5rak1kd0xmUzdKTEl2Z20vTENrRmJ3SnJudSs4dnlxOFc4QlFqMEZ3Y1lleVRiY0UKcVlTak1xK3U3bXNYaTdLeC9temhrSXlJcUpkSXpzaE55L01HejE5cUNrS3hIaDUzTDQ2ZzVwSU9CdndGSXRJbQo0VEZSZlRMY0R3SURBUUFCb3lNd0lUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFYelNCZHUrV0hkWGx0ZGtDWTRRV3dhNmdjRkduOTB4SE5jZ0wKMXlnOWlYSFpxak5CNmhRYmJDRUF3R3hDR1g2ZmFWc2dRdCtpMHRyRWZKZExqYkRvck1qdXBXa0VtUXFTcHFzbgpMaHBOZ2IrRTFIQWVyVWYrL1VxZE0rRHl1Y1JGQ0NFSzJtbHBjM0lOdmpUK2xJdXR3eDQxMTZLRDcrVTR4NldGCkg2dlBOT3cvS1A0TThWZUdUc2xWOXh6VTJLVjlCbnB2MWQ4UTM0Rk9JV1d4dHVFWGVaVkZCczVmek54R2lXTm8KUkkyVDlHUndvRDJkS0FYRE9YQzRZbnNnL2VUYjZRaWh1SjQ5Q2NkUCt5ejRrM1pCM2xMZzRWZlNuUU84ZDU3KwpuaWxlOThGUllCL2UyZ3V5TFhXM1EwaVQ1L1o1eG9SZGdGbGdsUHg0bUk4OGsxSHRRSkFIMzJSakpNdE9jUVdoCjE1UWFpREx4SW5RaXJxV20yQkpwVEdDakF1NHI3TlJqa2d0ZXZpOTJhNk8ySnJ5UEE5Z0s4a3hrUnIwNVl1V1cKNnpSakVTak1sZkd0NysvY2dGaEk2VXU0Nm1XczZmeUF0YlhJUmZtc3daL1p1ZXBpaUk3RThVdURFcTNtaTRUVwpuc0xyZ3hpZmFyc2JKR0F6Y016czl6THpYTmw1ZmUrZXBQN0pJOE1rN2hXU3NUMlJUeWFHdldaekpCUHFwSzVqCndhMTloQU04RUhpR0czbmp4UFB5QkpVZ3JpT0N4TE02QUdLLzVqWWs0VmU2eHg2UWRkVmZQNVZoSzhFN3plV3oKYUdIUVJpYXBJVkpwTGVzdXgrdDN6cVk2dFFNelQzYlI1MXhVQVYzTGVQVEpETC9QRW80WExTTm9sT2VyL3FteQpLd2JRQk0wPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VGVsaWFTb25lcmEgUm9vdCBDQSB2MSBPPVRlbGlhU29uZXJhCiMgU3ViamVjdDogQ049VGVsaWFTb25lcmEgUm9vdCBDQSB2MSBPPVRlbGlhU29uZXJhCiMgTGFiZWw6ICJUZWxpYVNvbmVyYSBSb290IENBIHYxIgojIFNlcmlhbDogMTk5MDQxOTY2NzQxMDkwMTA3OTY0OTA0Mjg3MjE3Nzg2ODAxNTU4CiMgTUQ1IEZpbmdlcnByaW50OiAzNzo0MTo0OToxYjoxODo1Njo5YToyNjpmNTphZDpjMjo2NjpmYjo0MDphNTo0YwojIFNIQTEgRmluZ2VycHJpbnQ6IDQzOjEzOmJiOjk2OmYxOmQ1Ojg2OjliOmMxOjRlOjZhOjkyOmY2OmNmOmY2OjM0OjY5Ojg3OjgyOjM3CiMgU0hBMjU2IEZpbmdlcnByaW50OiBkZDo2OTozNjpmZToyMTpmODpmMDo3NzpjMToyMzphMTphNToyMTpjMToyMjoyNDpmNzoyMjo1NTpiNzozZTowMzphNzoyNjowNjo5MzplODphMjo0YjowZjphMzo4OQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRk9EQ0NBeUNnQXdJQkFnSVJBSlcrRnFEM0xrYnhlem1DY3ZxTHpaWXdEUVlKS29aSWh2Y05BUUVGQlFBdwpOekVVTUJJR0ExVUVDZ3dMVkdWc2FXRlRiMjVsY21FeEh6QWRCZ05WQkFNTUZsUmxiR2xoVTI5dVpYSmhJRkp2CmIzUWdRMEVnZGpFd0hoY05NRGN4TURFNE1USXdNRFV3V2hjTk16SXhNREU0TVRJd01EVXdXakEzTVJRd0VnWUQKVlFRS0RBdFVaV3hwWVZOdmJtVnlZVEVmTUIwR0ExVUVBd3dXVkdWc2FXRlRiMjVsY21FZ1VtOXZkQ0JEUVNCMgpNVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFNSys2eWZ3SWFQemFTWlZmcDNGClZSYVJYUDN2SWI5VGdIb3QwcEdNWXpIdzdDVHd3NlhTY253UWJmUTN0K1htZkhucWpMV0NpNjVJdHF3QTNHVjEKN0NwTlg4R0g5U0JsSzRHb1J6NkpJNVV3RnBCLzZGY0hTT2NacnI5Rlo3RTNHd1lxL3Q3NXJIMkQrMTY2NUkrWApaNzVMam8xa0IxYzRWV2swTmowVFNPOVA0dE5tSHFUUEdyZGVOalBVdEFhOUdBSDlkNFJRQUVYMWpGM29JN3grCi9qWGg3VkI3cVRDTkdkTUpqbWhuWGI4OGx4aFR1eWxpeGNwZWNzSEhsdFRiTGFDMEgya0Q3T3JpVVBFTVBQQ3MKODFNdDhCejE3V3c1T1hPQUZzaFNzQ1BONEQ3YzNUeEhvTHMxaXVLWWFJdSs1Yjl5N3RMNnBlMFM3ZnlZR0trbQpkdHdvU3hBZ0hOTi9GbmN0N1crQTkwbTdVd1c3WFdqSDFNaDFGaitKV292M0YwZlVUUEhTaVhrK1RUMllxR0hlCk9oN1MrRjRENE1ISkhJelRqVTNUbFRhek4xOWpZNXN6RlBBdEptdFRmSW1NTXNKdTdEMGhBRG5Kb1dqaVVJTXUKc0Rvcjh6YWdyQy9rYjJIQ1VRazVQb3RUdWJ0bjJ0eFR1WFpaTnAxRDVTRGdQVEpnaFNKUnQ4Y3p1OTBWTDZSNApwZ2Q3Z1VZMkJJYmRlVFhIbFN3N3NLTVhOZVZ6SDdSY1dlL2E2aEJsZTNyUWY1K3p0Q28zTzNDTG0xdTVLN2ZzCnNsRVNsMU1wV3RUd0VoRGNUd0s3RXBJdll0US9hVU44RGRiOFdIVUJpSjFZRmt2ZXVwRC9Sd0dKQm1yMlg3S1EKYXJNQ3BnS0l2N05IZmlyWjFmcG9lRFZOQWdNQkFBR2pQekE5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3Q3dZRApWUjBQQkFRREFnRUdNQjBHQTFVZERnUVdCQlR3ajFrNEFMUDFqNXFXRE5YcitudXFGK2dURWpBTkJna3Foa2lHCjl3MEJBUVVGQUFPQ0FnRUF2dVJjWWs0azlBd0kvL0RUREdqa2swa2lQMFFuYjd0dDNvTm16cWpNRGZ6MW1nYmwKZHhTUjY1MUJlNWtxaE9YLy9DSEJYZkRrSDFlM2RhbWhYd0ltLzlmSDkwN2VUL2ozSEViQWVrOUFMQ0kxOEJteAowR3RuTExDbzRNQkFOelgyaEZ4YzQ2OUNlUDZueVExUTZnMkVkdlpSNzROVHhuci9EbFpKTG85NjFnem1KMVRqClRRcGdjbUxOa1FmV3BiL0ltV3Z0eEJubXEwd1JPTVZ2TWVKdVNjZy9kb0FtQXlZcDREYjI5aUJUNHhkd05CZWQKWTJnZWErekRUWWE0RXpBdlhVWU5SMFBWRzZwWkRybGNqUVpJclhTSFg4ZjhNVlJCRStMSElRNmU0QjRONGNCNwpRNFdReFlwWXhtVUtlRmZ5eGlNUEFka2dTOTRQKzVLRmRTcGNjNDF0ZXlXUnl1NUZyZ1pMQU16VHNWbFEyanFJCk95bERSbDZYSzFUT1UyK05TdWVXK3I5eERrS0xmUDBvb05CSXl0ckVnVXk3b25PVEpzanJETlltaUxiQUpNKzcKdlZ2cmRYM3BDSTZHTXl4NWR3bHBwWW44czNDUWgzYVAweUs3UXM2OWN3c2dKaXJRbXoxd0hpUnN6WWQycVJlVwp0ODhOa3Z1T0dLbVlTZEdlL21CRWNpRzVHZTNDOVRIeE9VaUlrQ1IxVkJhdHp2VDRhUlJrT2Z1anVMcHdRTWNuCkhML0VWbFA2WTJYUTh4d09GdlZyaGxoTkdOVGtEWTZsblZ1UjNIWWtVRC9HS3Z2WnQ1eTExdWJRMmVnWml4VngKU0syMzZ0aFppTlNRdnhhejJlbXNXV0ZVeUJ5NnlzSEs0YmtnVEk4Nms0bWxvTXkvMC9aMXBIV1diVlk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89RS1UdVx1MDExZnJhIEVCRyBCaWxpXHUwMTVmaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuXHUwMTVlLiBPVT1FLVR1Z3JhIFNlcnRpZmlrYXN5b24gTWVya2V6aQojIFN1YmplY3Q6IENOPUUtVHVncmEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1FLVR1XHUwMTFmcmEgRUJHIEJpbGlcdTAxNWZpbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS5cdTAxNWUuIE9VPUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppCiMgTGFiZWw6ICJFLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogNzY2NzQ0NzIwNjcwMzI1NDM1NQojIE1ENSBGaW5nZXJwcmludDogYjg6YTE6MDM6NjM6YjA6YmQ6MjE6NzE6NzA6OGE6NmY6MTM6M2E6YmI6Nzk6NDkKIyBTSEExIEZpbmdlcnByaW50OiA1MTpjNjplNzowODo0OTowNjo2ZTpmMzo5MjpkNDo1YzphMDowZDo2ZDphMzo2Mjo4ZjpjMzo1MjozOQojIFNIQTI1NiBGaW5nZXJwcmludDogYjA6YmY6ZDU6MmI6YjA6ZDc6ZDk6YmQ6OTI6YmY6NWQ6NGQ6YzE6M2Q6YTI6NTU6YzA6MmM6NTQ6MmY6Mzc6ODM6NjU6ZWE6ODk6Mzk6MTE6ZjU6NWU6NTU6ZjI6M2MKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdTekNDQkRPZ0F3SUJBZ0lJYW1nK25GR2J5MU13RFFZSktvWklodmNOQVFFTEJRQXdnYkl4Q3pBSkJnTlYKQkFZVEFsUlNNUTh3RFFZRFZRUUhEQVpCYm10aGNtRXhRREErQmdOVkJBb01OMFV0VkhYRW4zSmhJRVZDUnlCQwphV3hweFo5cGJTQlVaV3R1YjJ4dmFtbHNaWEpwSUhabElFaHBlbTFsZEd4bGNta2dRUzdGbmk0eEpqQWtCZ05WCkJBc01IVVV0VkhWbmNtRWdVMlZ5ZEdsbWFXdGhjM2x2YmlCTlpYSnJaWHBwTVNnd0pnWURWUVFEREI5RkxWUjEKWjNKaElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERURXpNRE13TlRFeU1EazBPRm9YRFRJegpNRE13TXpFeU1EazBPRm93Z2JJeEN6QUpCZ05WQkFZVEFsUlNNUTh3RFFZRFZRUUhEQVpCYm10aGNtRXhRREErCkJnTlZCQW9NTjBVdFZIWEVuM0poSUVWQ1J5QkNhV3hweFo5cGJTQlVaV3R1YjJ4dmFtbHNaWEpwSUhabElFaHAKZW0xbGRHeGxjbWtnUVM3Rm5pNHhKakFrQmdOVkJBc01IVVV0VkhWbmNtRWdVMlZ5ZEdsbWFXdGhjM2x2YmlCTgpaWEpyWlhwcE1TZ3dKZ1lEVlFRRERCOUZMVlIxWjNKaElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Ck1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBNHZVL2t3VlJIb1ZpVkY1NkMvVVkKQjRPdWZxOTg5OVNLYTZWalF6bTVTL2ZEeG1TSlBaUXVWSUJTT1RrSFMwdmRoUWQyaDh5L0w1Vk16SDJuUGJ4SApENWh3K0l5RkhuU09rbTBiUU5HWkRidDFic2lwYTVyQWhER3Z5a1BMNnlzMDZJK1hhd0diMVE1S0NLcGJrblNGClE5T0FycUdJVzY2ejZsN0xGcHAzUk1paDlsUm96dDZQbHl1NlcwQUNER1FYd0xXVHplSHhFMmJPREhudjBaRW8KcTErZ0VsSXdjeG1PaitHTUI2TER1MHJ3Nmg4VnFPNGx6S1JHK0JzaTc3TU9RN29zSkxqRkxGelVIUGhkWkwzRAprMTRvcHo4bjhZNGUweXBRQmFOVjJjdm5PVlBBbUo2TVZHS0xKckQzZlkxODVNYWVaa0pWZ2tmbnNsaU5admNICmZDNDI1bEFjUDl0REpNVy9oa2Q1czNrYzkxcjBFK3hzK0QvaVdSK1Y3a0krdWEyb01vVkpsMGIrU3pHUFdzdXQKZEVjZjZaRzMzeWdFSXFEVUQxM2llVS9xYklXR3ZhaW16dVQ2dytHenJ0NDhVZTdMRTN3QmY0UU9YVkdVbmhNTQp0aTZsVFBrNWNEWnZsc291REVSVnhjcjZYUUtqMzlaa2pGcXpBUXFwdFFwSEYvL3ZrVUFxanFGR09qR1k1Ukg4CnpMdEpWb3I4dWRCaG1tOWxiT2JEeXo1MVNmNlBwK0tKeFdmWG5VWVRUakYyT3lTem5oRmxocXQvN3gzVStMem4KckZwY3QxcEhYRlhPVmJRaWNWdGJDL0RQM0tCaFpPcXAxMmdLWTZmZ0RUK2dyOU9xMG43dlVhRG1VU3RWa2hVWApVOHUzWmc1bVRQajVkVXlRNXhKd3gwVUNBd0VBQWFOak1HRXdIUVlEVlIwT0JCWUVGQzdqMjdKSjBKeFVlVno2Ckp5cit6RTdTNkU1VU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVMdVBic2tuUW5GUjUKWFBvbkt2N01UdExvVGxRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFBRgpOenIwVGJkRjRrVjFKSSsyZDFMb0hOZ1FrMlh6OGxrR3BENGVLZXhkMGRDcmZPQUtrRWg0N1U2WUE1bitLR0NSCkhUQWR1R044cU9ZMXRmclRZWGJtMWdkTHltbWFzb1I2ZDVORkZ4V2ZKTkNZRXhML3U2QXUvVTVNaC9qT1hLcVkKR3dYZ0FFWktnb0NsTTRzbzNPMDQwOS9sUHVuKysxbmRZWVJQMGxTV0UyRVRQbytBYWI2VFI3VTFROUphdXoxYwo3N05DUjgwN1ZSTUdzQW5iL1dQMk9vZ0ttVzkrNGM0YlUycEVaaU5SQ0h1OFcxS2kvUVkzT0VCaGowcVd1SkEzCitHYkhlSkFBRlM2THJWRTFVd2VvYTJpdStVNDhCeWJOQ0FWd3pEay9kcjJsMDJjbUFZYW1VOUpnTzN4RGYxV0sKdkpVYXdTZzVUQjlEMHBIMGNsbUt1VmI4UDdTZDJuQ2NkbHFNUTFEdWpqQnlUZC8vU2ZmR3FXZlpiYXdDRWVJNgpGaVduV0FqTGIxTkJuRWc0UjJnejBkZkhqOVIwSWRUREJaQjYvODZXaUxFVktWMGpxOUJnb1JKUDN2UVh6VExsCnliL0lRNjM5TG83eHIrTDBtUG9TSHlEWXdLY01oY1dROURzdGxpYXhMTDVNcSt1eDBvckoyM2dURHg0Sm5XMlAKQUo4QzJzSDZIM3A2Q2NSSzVvZ3FsNStKaS8wM1gxODZ6amhaaGt1dmNRdTAyUEp3VDU4eUUrT3dwMWZsMnRwRAp5NFEwOGlqRTZtMzBLdS9CYTNiYSszNjdoVHpTVThKTnZuSGhSZEg5STJjTkUzWDd6MlZuSXAydXNBblJDZjhkCk5MLytJNWMzMGpuNlBRMEdDN1RiTzZPcmIxd2R0bjdvczRJMDdRWmNKQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1ULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAyIE89VC1TeXN0ZW1zIEVudGVycHJpc2UgU2VydmljZXMgR21iSCBPVT1ULVN5c3RlbXMgVHJ1c3QgQ2VudGVyCiMgU3ViamVjdDogQ049VC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMiBPPVQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkggT1U9VC1TeXN0ZW1zIFRydXN0IENlbnRlcgojIExhYmVsOiAiVC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMiIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDJiOjliOjllOmU0OjdiOjZjOjFmOjAwOjcyOjFhOmNjOmMxOjc3Ojc5OmRmOjZhCiMgU0hBMSBGaW5nZXJwcmludDogNTk6MGQ6MmQ6N2Q6ODg6NGY6NDA6MmU6NjE6N2U6YTU6NjI6MzI6MTc6NjU6Y2Y6MTc6ZDg6OTQ6ZTkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDkxOmUyOmY1Ojc4OjhkOjU4OjEwOmViOmE3OmJhOjU4OjczOjdkOmUxOjU0OjhhOjhlOmNhOmNkOjAxOjQ1Ojk4OmJjOjBiOjE0OjNlOjA0OjFiOjE3OjA1OjI1OjUyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEd3pDQ0FxdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURDQmdqRUxNQWtHQTFVRUJoTUNSRVV4Ckt6QXBCZ05WQkFvTUlsUXRVM2x6ZEdWdGN5QkZiblJsY25CeWFYTmxJRk5sY25acFkyVnpJRWR0WWtneEh6QWQKQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVY25WemRDQkRaVzUwWlhJeEpUQWpCZ05WQkFNTUhGUXRWR1ZzWlZObApZeUJIYkc5aVlXeFNiMjkwSUVOc1lYTnpJREl3SGhjTk1EZ3hNREF4TVRBME1ERTBXaGNOTXpNeE1EQXhNak0xCk9UVTVXakNCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXhLekFwQmdOVkJBb01JbFF0VTNsemRHVnRjeUJGYm5SbGNuQnkKYVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZEJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVWNuVnpkQ0JEWlc1MApaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURJd2dnRWlNQTBHCkNTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDcVg5b2JYK2h6a2VYYVhQU2k1a2ZsODJoVllBVWQKQXFTem0xbnpIb3F2TkszOERjTFpTQm51YVkvSklQd2hxZ2NaN2JCY3JHWEhYKzBDZkh0OExSdld1cm1Bd2hpQwpGb1Q2WnJBSXhsUWpnZVROdVVrLzlrOXVOMGdvT0EvRnZ1ZG9jUDA1bDAzU3g1aVJVS3JFUkxNamZUbEg2VkppCjFoS1RYcmN4bGtJRiszYW5IcVAxd3Z6cGVzVnNxWEZQNnN0NHZHQ3Z4OTcwMmN1K2ZqT2xicFNEOERUNklhdnEKam5LZ1A2VGVNRnZ2aGsxcWxWdERSS2dRRlJ6bEFWZkZtUEhtQmlpUnFpREZ0MU1tVVVPeUN4R1ZXT0hBRDNiWgp3STE4Z2ZOeWNKNXYvaHFPMlY4MXhySnZOSHkrU0UvaVdqblgySjE0bnArR1BnTmVHWXRFb3RYSEFnTUJBQUdqClFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUy8KV1NBMkFIbWdvQ0pyak5YeVlkSzRMTXVDU2pBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQU1RT2lZUXNmZE9oeQpOc1p0K1UyZStpS280WUZXejgyN24rcXJrUms0cjZwOEZVM3p0cU9OcGZTTzlrU3BwK2dobGEwK0FHSVdpUEFDCnV2eGhJK1l6bXpCNmF6WmllNjBFSTRSWVplTGJLNHJuSlZNM1lsTmZ2Tm9CWWltaXBpZHg1am9pZnNGdkhaVncKSUVvSE5OL3EveFdBNWJyWGV0aGJkWHdGZWlsSGZrQ29NUk4zelVBN3RGRkhlaTRSNDBjUjNwMW0wSXZWVkdiNgpnMVhxZk1JcGlSdnBiN1BPNGdXRXlTOCtlSVZpYnNsZndYaGpkRmpBU0JnTW1UbnJwTXdhdFhsYWpSV2MyQlFOCjlub0hWOGNpZ3dVdFBKc2xKajBZczZsRGZNaklxMlNQRHFPL25CdWRNTnZhMEJrdXFqengrek9BZHVUTnJSbFAKQlNlT0U2RnV3Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BdG9zIFRydXN0ZWRSb290IDIwMTEgTz1BdG9zCiMgU3ViamVjdDogQ049QXRvcyBUcnVzdGVkUm9vdCAyMDExIE89QXRvcwojIExhYmVsOiAiQXRvcyBUcnVzdGVkUm9vdCAyMDExIgojIFNlcmlhbDogNjY0Mzg3NzQ5NzgxMzMxNjQwMgojIE1ENSBGaW5nZXJwcmludDogYWU6Yjk6YzQ6MzI6NGI6YWM6N2Y6NWQ6NjY6Y2M6Nzc6OTQ6YmI6MmE6Nzc6NTYKIyBTSEExIEZpbmdlcnByaW50OiAyYjpiMTpmNTozZTo1NTowYzoxZDpjNTpmMTpkNDplNjpiNzo2YTo0Njo0Yjo1NTowNjowMjphYzoyMQojIFNIQTI1NiBGaW5nZXJwcmludDogZjM6NTY6YmU6YTI6NDQ6Yjc6YTk6MWU6YjM6NWQ6NTM6Y2E6OWE6ZDc6ODY6NGE6Y2U6MDE6OGU6MmQ6MzU6ZDU6Zjg6Zjk6NmQ6ZGY6Njg6YTY6ZjQ6MWE6YTQ6NzQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURkekNDQWwrZ0F3SUJBZ0lJWERQTFlpeGZzekl3RFFZSktvWklodmNOQVFFTEJRQXdQREVlTUJ3R0ExVUUKQXd3VlFYUnZjeUJVY25WemRHVmtVbTl2ZENBeU1ERXhNUTB3Q3dZRFZRUUtEQVJCZEc5ek1Rc3dDUVlEVlFRRwpFd0pFUlRBZUZ3MHhNVEEzTURjeE5EVTRNekJhRncwek1ERXlNekV5TXpVNU5UbGFNRHd4SGpBY0JnTlZCQU1NCkZVRjBiM01nVkhKMWMzUmxaRkp2YjNRZ01qQXhNVEVOTUFzR0ExVUVDZ3dFUVhSdmN6RUxNQWtHQTFVRUJoTUMKUkVVd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNWaFR1WGJ5bzdManZQcHZNcApOYjdQR0t3K3F0bjRUYUErR2tlNXZKcmY4djdNUGtmb2VwYkNKSTQxOUtrTS9JTDliY0Z5WWllOTZtdnI1NHJNClZENlFVTStBMUpYNzZMV0MxQlRGdHFsVkpWZmJzVkQyc0dCa1dYcHB6d08zYncyK3lqNXZkSExxcWpBcWMySysKU1pGaHlCSCtEZ01xOTJvZzNBSVZEVjRWYXZ6amdzRzF4WjFrQ1d5aldaZ0hKOGNibGl0aGRIRnNRL0gzTllrUQo0SjdzVmFFM0lxS0hCQVVzUjMyMEhMbGlLV1lveXJmaGsvV2tsQU9adVhDRnRlWkk2bzFRL05uZXpHOEhEdDBMCmNwMkFNQllIbFQ4b0R2M0ZkVTlUMW5TYXRDUXVqZ0tSejNiRm14NVZkSng0SWJId0xmRUxuOExWbGhnZjhGUWkKZW93SEFnTUJBQUdqZlRCN01CMEdBMVVkRGdRV0JCU25wUWF4TEtZSllPN1JsK2x3cnJ3N0dXemJJVEFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZLZWxCckVzcGdsZzd0R1g2WEN1dkRzWmJOc2hNQmdHCkExVWRJQVFSTUE4d0RRWUxLd1lCQkFHd0xRTUVBUUV3RGdZRFZSMFBBUUgvQkFRREFnR0dNQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFBbWR6VGJsRWlHS2tHZExENEdrR0RFakt3TFZMZ2Z1WHZUQnpuaytqNTdzajFPN1o4agp2WmZ6YTF6djd2MUFwdCtoazZFS2hxenZJTkI1QWIxNDl4bllKREUwQkFHbXVoV2F3eWZjMkU4UHpCaGovNWtQCkRwRnJkUmJoSWZ6WUpzZEh0NmJQV0hKeGZycmhUWlZITzhtdmJhRzB3ZXlKOXJRUE9MWGlaTndsejZiYjY1cGMKbWFIRkNONzk1dHJWMWxwRkRNUzN3clVVNzdRUi93NFZ0ZlgxMjhhOTYxcW44RllpcVR4bFZNWVZxTDJHbnMyRApsbWg2Y1lHSjRRdmg2aEViYUFqTWFaN3Nua0dlUkRJbWV1S0hDbkU5NitSYXBOTGJ4YzNHM21CL3VmTlBSSkx2CktyY1lQcWNaMlF0OXNUZEJRckM2WUIzeS9na1JzUENIZTZlZAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049UXVvVmFkaXMgUm9vdCBDQSAxIEczIE89UXVvVmFkaXMgTGltaXRlZAojIFN1YmplY3Q6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBMYWJlbDogIlF1b1ZhZGlzIFJvb3QgQ0EgMSBHMyIKIyBTZXJpYWw6IDY4NzA0OTY0OTYyNjY2OTI1MDczNjI3MTAzNzYwNjU1NDYyNDA3ODcyMDAzNDE5NQojIE1ENSBGaW5nZXJwcmludDogYTQ6YmM6NWI6M2Y6ZmU6Mzc6OWE6ZmE6NjQ6ZjA6ZTI6ZmE6MDU6M2Q6MGI6YWIKIyBTSEExIEZpbmdlcnByaW50OiAxYjo4ZTplYTo1Nzo5NjoyOToxYTpjOTozOTplYTpiODowYTo4MToxYTo3Mzo3MzpjMDo5Mzo3OTo2NwojIFNIQTI1NiBGaW5nZXJwcmludDogOGE6ODY6NmY6ZDE6YjI6NzY6YjU6N2U6NTc6OGU6OTI6MWM6NjU6ODI6OGE6MmI6ZWQ6NTg6ZTk6ZjI6ZjI6ODg6MDU6NDE6MzQ6Yjc6ZjE6ZjQ6YmY6Yzk6Y2M6NzQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZZRENDQTBpZ0F3SUJBZ0lVZUZoZkxxMHNHVXZqTndjMU5CTW90WmJVWlpNd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NERUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4SGpBYwpCZ05WQkFNVEZWRjFiMVpoWkdseklGSnZiM1FnUTBFZ01TQkhNekFlRncweE1qQXhNVEl4TnpJM05EUmFGdzAwCk1qQXhNVEl4TnpJM05EUmFNRWd4Q3pBSkJnTlZCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk0KYVcxcGRHVmtNUjR3SEFZRFZRUURFeFZSZFc5V1lXUnBjeUJTYjI5MElFTkJJREVnUnpNd2dnSWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDZ3ZsQVFqdW55YkVDMEJKeUZ1VEhLM0Mza0Vha0VQQnRWCndlZFlNQjBrdE1QdmhkNk1MT0hCUGQrQzVrK3RSNGRzN0Z0SndVclZ1NC9zaDZ4L2dwcUc3RDBEbVZJQjBqV2UKck5yd1U4bG1QTlNzQWdIYUpOTTdxQUpHcjZRYzQvaHpXSGEzOWc2UURiWHd6OHo2K2NaTTVjT0dNQXFORjM0MQo2OFhmdXc2Y3dJMkg0NGc0aFdmNlBzZXI0Qk9jQlJpWXo1UDFzWkswL0NQVHo5WEVKMG5nbmp5YkNLT0xYU29oCjRQdzVxbFBhZlg3UEdnbFR2RjBGQk0raFNvK0xkb0lOb2ZqU3h4UjNXNUEyQjRHYlBnYjZVbDVqeGFZQS9xWHAKVWh0U3RaSTVjZ01KWXIyd1lCWnVwdDBsd2dObTNmTUUwVURpVG91RzlHL2xnNkFuaEY0RXdmV1F2VEE5eE8rbwphYnc0bTZTa2x0RmkybW5BQVphdXk4UlJOT29NcXY4aGpsbVBTbHprWVpxbjB1a3FlSTFSUFRvVjdxSlpqcWxjCjNzWDVrQ0xsaUVWeDNaR1piSHFmUFQyWWZGNzJ2aFpvb0Y2dUN5UDhXZytxSW5ZdHlhRVFIZVRUUkNPUWlKL0cKS3ViWDlacXpXQjR2TUlrSUcxU2l0WmdqN0FoM0hKVmRZZEhMaVp4Zm9rcVJtdThocWtrV0NLaTlZU2d4eVhTdApoZmJaeGJHTDBlVVFNazFmaXlBNlBFa2ZNNFZaRGR2TENYVkRhWFA3YTNGOThOL0VUSDNHb3k3SWxYbkxjNktPClRrMGsrMTdrQkw1eUc2WW5MVWxhbVhyWFhBa2d0MytVdVUveERSeGVpRUliRWJmbmtkdWViUFJxMzR3R21BT3QKekNqdnBVZnpVd0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQgpCakFkQmdOVkhRNEVGZ1FVbzVmVzgxNmlFT0dyUlo4OEYyUTg3Z0Z3bk13d0RRWUpLb1pJaHZjTkFRRUxCUUFECmdnSUJBQmo2VzNYOFBuckhYM2ZIeXQvUFg4TVN4RUJkMURLcXVHclgxUlVWUnBnanBlYVFXeGlaVE9PdFFxT0MKTVRhSXplbjd4QVNXU0lzQng0MEJ6MXN6QnBaR1puUWRUKzNCdHJtMERXSE1ZMzdYTG5lTWxod3FJMmhyaFZkMgpjRE1UL3VGUHBpTjNHUG9hak9pOVpjblBQL1RKRjl6cng3ekFCQzR0Umk5cFpzTWJqLzdzUHRQS2xMOTJDaVVOCnFYc0NIS25RTzE4THdJRTZQV1RodjZjdFRyMU54TmdweGlJWTBNV3NjZ0tDUDZvNm9qb2lsekhkQ0dQRGRSUzUKWUNndFcyamdGcWxtZ2lOUjlldFQyREdiZSttM25VdnJpQmJQK1YwNGlra3dqKzN4NnhuMGR4b3hHRTFuVkd3dgpiMlg1Mnozc0lleGU5UFNMeW1CbFZORnhaUFQ1cHFPQk16WXpjZkNrZUY5T3JZTWgzalJKamVoWnJKM3lkbG8yCjhoUDByK0FKeDJFcWJQZmduYTY3aGtvb2J5N3V0SG5Oa0RQRHMzYjY5ZkJzblFHUStwNlE5cHh5ejBmYXd4L2sKTlNCVDhsVFIzMkdEcGdMaUpUamVoVEl0WG5PUVVsMUN4TTQ5UytINUdZUWQxYUpRekVIN1FSVER2ZGJKV3FOagpaZ0tBdlFVNk8wZWM3QUFtVFBXSVViK29JMzhZQjdBTDdZc21vV1RUWVVyclhKL2VzNjluQTdNZjNXMWRhV2hwCnExNDY3SHhwdk1jN2hVNmVGYm0wRlUvRGxYcFkxOGxzNld5NTh5bGpYclFzOEMwOTdWcGw0S2xiUU1KSW1ZRnQKbmg4R0tqd1N0SXNQbTZJazhLYU4xbnJnUzdaa2xtT1ZoTUpLelJ3dUpJY3pZT1hECi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENBIDIgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDQSAyIEczIE89UXVvVmFkaXMgTGltaXRlZAojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSAyIEczIgojIFNlcmlhbDogMzkwMTU2MDc5NDU4OTU5MjU3NDQ2MTMzMTY5MjY2MDc5OTYyMDI2ODI0NzI1ODAwCiMgTUQ1IEZpbmdlcnByaW50OiBhZjowYzo4Njo2ZTpiZjo0MDoyZDo3ZjowYjozZToxMjo1MDpiYToxMjozZDowNgojIFNIQTEgRmluZ2VycHJpbnQ6IDA5OjNjOjYxOmYzOjhiOjhiOmRjOjdkOjU1OmRmOjc1OjM4OjAyOjA1OjAwOmUxOjI1OmY1OmM4OjM2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA4ZjplNDpmYjowYTpmOTozYTo0ZDowZDo2NzpkYjowYjplYjpiMjozZTozNzpjNzoxYjpmMzoyNTpkYzpiYzpkZDoyNDowZTphMDo0ZDphZjo1ODpiNDo3ZToxODo0MAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRllEQ0NBMGlnQXdJQkFnSVVSRmMwSkZ1QmlaczE4czY0S3p0YnB5YndkU2d3RFFZSktvWklodmNOQVFFTApCUUF3U0RFTE1Ba0dBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhIakFjCkJnTlZCQU1URlZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTWlCSE16QWVGdzB4TWpBeE1USXhPRFU1TXpKYUZ3MDAKTWpBeE1USXhPRFU1TXpKYU1FZ3hDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTQphVzFwZEdWa01SNHdIQVlEVlFRREV4VlJkVzlXWVdScGN5QlNiMjkwSUVOQklESWdSek13Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNocmlXeUFSamNWNGcvUnV2NXIrTHJJM0hpbXRGaFppRmYKcXE4blVlVnVHeGJVTFgxUXNGTjN2WGc2WU9Ka0FwdDhocHZXR282dC94OFZmOVdWSGhMTDVoU0VCTUhmTnJNVwpuNHJqeWR1WU5NN1lNeGNvUnZ5bnlmRFN0TlZOQ1hKSitmS0g0Nm5hZmFGOWE3STZKYWx0VWtTcytMNXUrOXltCmM1R1FZYVlERkNEeTU0ZWppSzJ0b0l6L3Bnc2xVaVhuRmdIVnk3ZzFnUXlqTy9EaDRmeGFYYzZBY1czNFNhcysKTzdxNDE0QUIrNlhyVzdQRlhtQXFNYUN2TitnZ09wK29NaXdNekFrZDA1Nk9YYnhNbU83RkdtaDc3Rk9tNlJRMQpvOS9OZ0o4TVNQc2M5UEcvU3JqNjFZeHhTc2NmcmY1Qm1yT0RYZktFVnUrbFYwUE9LYTJNcTFXL3hQdGJBZDBqCklhRllBSTdEMEdvVDdSUGpFaXVBM0dmbWxiTE5IaUp1S3ZoQjFQTEtGQWVOaWxVU3htbjF1SVpvTDFOZXNOS3EKSWNHWTVqRGpaMVhIbTI2c0dhaFZwa1VHMENNNjIrdGxYU29SRWZBN1Q4cHQ5RFRFY2VUL0FGcjJYSzRqWUlWego4ZVFRc1NXdTFaSzdFOEVNNERuYXREbFh0YXMxcW5JaE80TTE1ekhmZWlGdXVESUlmUjB5a1JWS1luTFA0M2VoCnZOVVJHM1lCWndqZ1FRdkQ2eFZ1K0tRWjJhS3JyK0luVWxZckFvb3NGQ1Q1djBJQ3Z5Ykl4by9nYmpoOVV5M2wKN1ppemxXTm9mL2sxOU4rSXhXQTFrc0I4YVJ4aGxSYlE2OTRMcno0RUVFVmxXRkE0cjBqeVdiWVc4andOa0FMRwpjQzRCclR3VjF3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCCkJqQWRCZ05WSFE0RUZnUVU3ZWR2ZGxxL1lPeEpXOGFsZDd0eUZuR2J4RDB3RFFZSktvWklodmNOQVFFTEJRQUQKZ2dJQkFKSGZnRDlEQ1g1eHd2ZnJzNGlQNFZHeXZEMTErU2hkeUx5Wm0zdGRxdVhLNFFyMzZMTFRuOTFuTVg2NgpBYXJIYWtFN2tOUUlYTEpnYXBEd3lNNERZdm1MN2Z0dUt0d0dUVHdwRDRrV2lsaE1TQS9vaEdIcVBIS21kK1JDCnJvaWpRMWg1ZnE3S3BWTU5xVDF3dlNBWllhUnNPUHhETXVIQlIvLzQ3UEVSSWpLV25NTDJXMm1XZXlBTVEwR2EKVy9aWkdZamVWWWczVVF0NFhBb2VvMEw5eDUySUQ4RHllQUlrVkpPdmlZZUl5VXFBSGVyUWJqNWhMamE3TlE0bgpsdjFtTkR0aGNuUHhGbHhIQmxSSkFIcFlFckFLNzRYOXNiZ3pkV3FUSEJMbVlGNXZIWC9KSHlQTGhHR2ZIb0pFCitWK3RZbFVrbWxLWTdWSG5vWDZYT3VZdkh4SGFVNEFzaFo2ck5SRGJJbDlxeFY2WFUvSXlBZ2t3bzFqd0RRSFYKY3NheGZHbDd3L1UyUmN4aGJsNU1sTVZlcnVnT1hvdS85ODNnN2FFT0d6UHVWQmorRDc3dmZvUnJRK053bU50ZApkYklOV1FlRkZTTTUxdkhmcVNZUDFrakhzNllpOVRNM1dwVkhuM3U2R0JWdi85WVVaSU5KMGdwbklkc1BOV05nCktDTGpzWldEellXbTNTOFA1MmRTYnJzdmhYejFTblBueFQ3QXZTRVNCVC84dHdOSkFsdklKZWJpVkRqMWVZZU0KSFZPeVRvVjdCampITFBqNHNIS05KZVYzVXZRREhFaW1VRitJSURCdThvSkRxejJYaE9kVCt5SEJUdzhpbW9hNApXU3IyUnowWmlDM29oZUdlN0lVSWFyRnNOTWtkN0Vnck8zanRac1NPZVdtRDNuK00KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENBIDMgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIDMgRzMiCiMgU2VyaWFsOiAyNjgwOTA3NjExNzA0NjE0NjI0NjM5OTU5NTIxNTczMjcyNDIxMzcwODkyMzk1ODEKIyBNRDUgRmluZ2VycHJpbnQ6IGRmOjdkOmI5OmFkOjU0OjZmOjY4OmExOmRmOjg5OjU3OjAzOjk3OjQzOmIwOmQ3CiMgU0hBMSBGaW5nZXJwcmludDogNDg6MTI6YmQ6OTI6M2M6YTg6YzQ6Mzk6MDY6ZTc6MzA6NmQ6Mjc6OTY6ZTY6YTQ6Y2Y6MjI6MmU6N2QKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDg4OmVmOjgxOmRlOjIwOjJlOmIwOjE4OjQ1OjJlOjQzOmY4OjY0OjcyOjVjOmVhOjVmOmJkOjFmOmMyOmQ5OmQyOjA1OjczOjA3OjA5OmM1OmQ4OmI4OjY5OjBmOjQ2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWURDQ0EwaWdBd0lCQWdJVUx2V2JBaWluMjNyLzFhT3A3cjBEb004U2FoMHdEUVlKS29aSWh2Y05BUUVMCkJRQXdTREVMTUFrR0ExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEhqQWMKQmdOVkJBTVRGVkYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNeUJITXpBZUZ3MHhNakF4TVRJeU1ESTJNekphRncwMApNakF4TVRJeU1ESTJNekphTUVneEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNCmFXMXBkR1ZrTVI0d0hBWURWUVFERXhWUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURNZ1J6TXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3p5dzRRWjQ3cUZKZW5NaW9LVmpaL2FFekhzMjg2SXhTUgoveGwvcGNxczdyTjJuWHJwaXh1cmF6SGIrZ3RUVEsvRnBScDVQSXBNLzZ6ZkpkNU8yWUl5QzBUZXl0dU1yS051CkZvTTdwbVJMTW9uN0ZoWTRmdXRENHROMFNzSmlDbk1LM1VtelY5S3dDb1dkY1R6ZW84dkFNdk1CT1NCREd6WFIKVTdPeDdzV1RhWUkrRnJVb1JxSGU2b2tKN1VPNEJVYUtodlZaUjc0YmJ3RWhFTG45cWRJb3loQTVDY29UTnMrYwpyYTFBZEhrckFqODAvL29nYVgzVDdtSDF1clBuTU5BM0k0WnlZVVVwU0Zsb2IzZW1Mb0crQjAxdnI4N0VSUk9SCkZIQUdqeCtmK0lkcHNRN3Z3NGtaNitvY1lmeDZiSXJjMWdNTG5pYTZFdDNVVkRtckpxTXo2bldCMmkzTkQwL2sKQTlIdkZaY2JhNURGQXBDVFpnSWhzVWZlaTVwS2dMbFZqN1dpTDhEV00yZmFmc1NudEFSRTYwZjc1bGk1OXd6dwpleXV4d0hBcHcwQmlMVHRJYWR3alBFanJld2w1cVczYXFEQ1l6NEJ5QTRpbVcwYXVjbmw4Q0FNaFphNjM0UnlsCnNTcWlNZDVtQlBmQWRPaHgzdjg5V2N5V0poS0xoWlZYR3F0cmRRdEVQUkVvUEh0aHQrS1BaMC9sN0R4TVlJQnAKVnpnZUFWdU5WZWpIMzhETWR5TTBTWFY4OXBnUjZ5M2U3VUV1RkFVQ2YrRCtJT3MxNXhHc0lzNVhQZDdKTUcwUQpBNFhOOGYrTUZyWEJzajZJYkdCL2tFK1Y5L1l0clFFNUJ3VDZkWUI5djBsUTdlL0p4SHdjNjRCKzI3YlEzUlArCnlkT2MxN0tYcVFJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBZEJnTlZIUTRFRmdRVXhoZlF2S2pxQWtQeUd3YVpYU3VRSUxuWG5PUXdEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0lCQURSaDJWYTFFb2RWVGQyak5URkd1NlFIY3J4ZllXTG9wZnNMTjdFOHRyUDZLWjEvQXZXa3lhaVR0M3B4CktHbVBjK0ZTa05yVnZqcmx0M1pxVm9BaDMxM202VHFlNVQ3Mm9tbkhLZ3F3R0VmY0lIQjlVcU0rV1h6QnVzbkkKRlVCaHluTFdjS3pTdC9BYzVJWXA4TTd2YUdQUXRTQ0tGV0dhZm9hWXRNbkNkdnZNdWpBV3pLTmh4blFUNVd2dgpveFhxQS80VGkyVGswOEhTNklUN1NkRVFUWGxtNjZyOTlJMHhIbkFVcmR6ZVp4Tk1nUlZodkxmWmtYZHhHWUZnCnUvQllwYldjQy9lUElsVW53RXNCYlR1WkRkUWRtMk5uTDlEdURjcG12SlJQcHEzdC9PNWpyRmMvWlNYUHNvYVAKMEFqL3VIWVVidDdsSit5cmVMVlR1YlkvNkNENTBxaStZVWJLaDR5RTgvbnhvR2liSWg2Qkpwc1FCSkZ4d0FZZgozS0RUdVZhbjQ1Z3RmNE9kMzR3cm5ES09NcFR3QVR3aUtwOUR3aTdEbURrSE9IdjhYZ0JDSC9NeUpubURoUGJsCjhNRlJFc0FMSGdRakRGU2xUQzlKeFVyUnRtNWdEV3Y4YTR1RkpHUzNpUTZySlVkYlBNOStTYjNINlFyRzJ2ZCsKRGhjSTAwaVgwSEdTOEE4NVBqUnFISDNZOGlLdXUybjBNN1NtU0ZYUkR3NG02T3kyQ3kybmhUWE4vVm5JbjlITgpQbG9wTkxrOWhNNnhaZFJaa1pGV2RTSEJkNTc1ZXVGZ25kT3RCQmowZk90ZWs0OVRTaUlwK0VnclBrMkdyRnQvCnl3YVpXV0RZV0dXVmpVVFI5MzkrSjM5OXJvRDFCMHkyUHB4eFZKa0VTLzFZK1pqMAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEcyIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEcyIgojIFNlcmlhbDogMTUzODUzNDgxNjA4NDAyMTM5Mzg2NDMwMzM2MjA4OTQ5MDU0MTkKIyBNRDUgRmluZ2VycHJpbnQ6IDkyOjM4OmI5OmY4OjYzOjI0OjgyOjY1OjJjOjU3OjMzOmU2OmZlOjgxOjhmOjlkCiMgU0hBMSBGaW5nZXJwcmludDogYTE6NGI6NDg6ZDk6NDM6ZWU6MGE6MGU6NDA6OTA6NGY6M2M6ZTA6YTQ6YzA6OTE6OTM6NTE6NWQ6M2YKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDdkOjA1OmViOmI2OjgyOjMzOjlmOjhjOjk0OjUxOmVlOjA5OjRlOmViOmZlOmZhOjc5OjUzOmExOjE0OmVkOmIyOmY0OjQ5OjQ5OjQ1OjJmOmFiOjdkOjJmOmMxOjg1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEbGpDQ0FuNmdBd0lCQWdJUUM1TWNPdFk1Witwbkk3L0RyNXIwU3pBTkJna3Foa2lHOXcwQkFRc0ZBREJsCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdgpiM1FnUnpJd0hoY05NVE13T0RBeE1USXdNREF3V2hjTk16Z3dNVEUxTVRJd01EQXdXakJsTVFzd0NRWURWUVFHCkV3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmwKY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWdSekl3Z2dFaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURaNXlndlVqODJja21Ja3pUeitHb2VNVlNBCm42MVVRYlZIMzVhbzFLK0FMYmtLejNYOWlhVjlKUHJqSWd3cnZKVVhDek8vR1UxQkJwQUF2UXhORVA0SHRlY2MKYmlKVk1XV1h2ZE1YMGg1aTg5dnFiRkNNUDRRTWxzKzN5d1BneW0yaEZFd2JpZDN0QUxCU2ZLK1JiTEU0RTlIcApFZ2pBQUxBY0t4SGFkM0EybTY3T2VZZmNnbkRtQ1hSd1ZXbXZvMmlmdjkyMmViUHluWEFwVmZTci81Vmg4OGxBCmJ4M1J2cE83MDRncXU1Mi9jbHBXY1RzLzFQUFJDdjRvNzZQdTJabXZBOU9QWUxmeWtxR3h2WW1KSHpETnc2WXUKWWpPdUZnSjNSRnJuZ1FvOHAwUXVlYmcvQkx4Y29JZmhHNjlSanMzc0xQcjQvbTN3T255cWkrUm5sVEdOQWdNQgpBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUIwR0ExVWREZ1FXCkJCVE93MHE1bVZYeXVOdGd2NmwrdlZhMWx6YW4xakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBeXFWVmpPUEkKUVc1cEo2ZDFFZTg4aGpadjBwM0dlRGdkYVphaWtta3VPR3liZlFUVWlhV3hNVGVLeVNITXEyek5peHlhMXI5SQowakptd1lyQTh5ODY3OERqMUpHRzBWRGpBOXR6ZDI5S09WUHQzaWJIdFgydkswTFJkV0xqU2lzQ3gxQkw0R25pCmxtd09SR1lRUkkrdEJldjRlYXltRytnM05KMVR5V0dxb2xLdlNuQVdoc0k2eUxFVGNEYll6KzcwQ2pUVlcwejkKQjV5aXV0a0JjbHp6VGNIZERyRWNEY1JqdnEzMEZQdUo3S0pCRGt6TXlGZEEwRzREcXMwTWpvbVptV3p3UERDdgpPTjl2dktPK0tTQW5xM1QvRXlKNDNwZFNWUjZEdFZRZ0ErNnV3RTlXM2pmTXczK3FCQ2U3MDNlNFl0c1hmSndvCkloTnpiTThtOVlvcDV3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMyBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEczIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMyIKIyBTZXJpYWw6IDE1NDU5MzEyOTgxMDA4NTUzNzMxOTI4Mzg0OTUzMTM1NDI2Nzk2CiMgTUQ1IEZpbmdlcnByaW50OiA3Yzo3Zjo2NTozMTowYzo4MTpkZjo4ZDpiYTozZTo5OTplMjo1YzphZDo2ZTpmYgojIFNIQTEgRmluZ2VycHJpbnQ6IGY1OjE3OmEyOjRmOjlhOjQ4OmM2OmM5OmY4OmEyOjAwOjI2OjlmOmRjOjBmOjQ4OjJjOmFiOjMwOjg5CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3ZTozNzpjYjo4Yjo0Yzo0NzowOTowYzphYjozNjo1NToxYjphNjpmNDo1ZDpiODo0MDo2ODowZjpiYToxNjo2YTo5NToyZDpiMTowMDo3MTo3Zjo0MzowNTozZjpjMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1JqQ0NBYzJnQXdJQkFnSVFDNkZhK2gzZm9MVkpSSy9OSktCczdEQUtCZ2dxaGtqT1BRUURBekJsTVFzdwpDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1ClpHbG5hV05sY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWcKUnpNd0hoY05NVE13T0RBeE1USXdNREF3V2hjTk16Z3dNVEUxTVRJd01EQXdXakJsTVFzd0NRWURWUVFHRXdKVgpVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1ClkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWdSek13ZGpBUUJnY3EKaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFaNTd5c1JHWHR6YmcvV1B1TnNWZXBSQzBGRmZMdkMvOFFkSisxWWxKZgpabjRmNWR3YlJYa0x6TVpUQ3AyTlhRTFpxVm5lQWxyMmxTb09qVGhLaWtuR3ZNWURPQWRmVmRwK0NXN2lmMTdRClJTQVBXWFlRMXFBazhDM2VOdkpzS1RtalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC8KQkFRREFnR0dNQjBHQTFVZERnUVdCQlRMMEwycDRaZ0ZVYUZOTjZLRGVjNk5IU3JraERBS0JnZ3Foa2pPUFFRRApBd05uQURCa0FqQWxwSUZGQW1zU1MzVjBUOGdqNDNEeWRYTGVmSW53ejVGeVlaNWVFSkpaVnJtRHh4RG5PT2xZCkpqWjkxZVEwaGprQ01IdzJVL0F3NVdKak9wbml0cU03bXpUNkh0b1FrbkZla1JPbjNhUnVrc3d5MXZVaFpzY3YKNnBaamFtVkZrcFVCdEE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgRzIgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IEcyIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEdsb2JhbCBSb290IEcyIgojIFNlcmlhbDogNDI5Mzc0MzU0MDA0Njk3NTM3ODUzNDg3OTUwMzIwMjI1MzU0MQojIE1ENSBGaW5nZXJwcmludDogZTQ6YTY6OGE6Yzg6NTQ6YWM6NTI6NDI6NDY6MGE6ZmQ6NzI6NDg6MWI6MmE6NDQKIyBTSEExIEZpbmdlcnByaW50OiBkZjozYzoyNDpmOTpiZjpkNjo2Njo3NjoxYjoyNjo4MDo3MzpmZTowNjpkMTpjYzo4ZDo0Zjo4MjphNAojIFNIQTI1NiBGaW5nZXJwcmludDogY2I6M2M6Y2I6Yjc6NjA6MzE6ZTU6ZTA6MTM6OGY6OGQ6ZDM6OWE6MjM6Zjk6ZGU6NDc6ZmY6YzM6NWU6NDM6YzE6MTQ6NGM6ZWE6Mjc6ZDQ6NmE6NWE6YjE6Y2I6NWYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURqakNDQW5hZ0F3SUJBZ0lRQXpyeDVxY1JxYUM3S0dTeEhRbjY1VEFOQmdrcWhraUc5dzBCQVFzRkFEQmgKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1TQXdIZ1lEVlFRREV4ZEVhV2RwUTJWeWRDQkhiRzlpWVd3Z1VtOXZkQ0JICk1qQWVGdzB4TXpBNE1ERXhNakF3TURCYUZ3MHpPREF4TVRVeE1qQXdNREJhTUdFeEN6QUpCZ05WQkFZVEFsVlQKTVJVd0V3WURWUVFLRXd4RWFXZHBRMlZ5ZENCSmJtTXhHVEFYQmdOVkJBc1RFSGQzZHk1a2FXZHBZMlZ5ZEM1agpiMjB4SURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFY3lNSUlCSWpBTkJna3Foa2lHCjl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF1emZOTk54N2E4bXlhSkN0U25YL1Jyb2hDZ2lOOVJsVXlmdUkKMi9PdThqcUprVHg2NXFzR0dtdlByQzNvWGdra1JMcGltbjdXbzZoKzRGUjFJQVdzVUxlY1l4cHNNTnphSHhteAoxeDdlL2RmZ3k1U0RONjdzSDBOTzNYc3MwcjB1cFMva3FiaXRPdFNacExZbDZadHJBR0NTWVA5UElVa1k5MmVRCnEyRUduSS95dXVtMDZaSXlhN1h6VitoZEc4Mk1IYXVWQkpWSjh6VXRsdU5KYmQxMzQvdEpTN1NzVlFlcGo1V3oKdENPN1RHMUY4UGFwc3BVd3RQMU1WWXduU2xjVWZJS2R6WE9TMHhaS0JneU1VTkdQSGdtK0Y2SG1JY3I5ZytVUQp2SU9sQ3NSbktQWnpGQlE5Um5iRGh4U0pJVFJOcnc5RkRLWkpvYnE3bk1XeE00TXBoUUlEQVFBQm8wSXdRREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJoakFkQmdOVkhRNEVGZ1FVVGlKVUlCaVYKNXVOdTVnLzYrcmtTN1FZWGp6a3dEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBR0JuS0pSdkRraGo2ekhkNm1jWQoxWWw5UE1XTFNuL3B2dHNyRjkrd1gzTjNLaklUT1lGblFvUWo4a1ZuTmV5SXYvaVBzR0VNTktTdUlFeUV4dHY0Ck5lRjIyZCttUXJ2SFJBaUdmelowSkZyYWJBMFVXVFc5OGtuZHRoL0pzdzFIS2oyWkw3dGN1N1hVSU9HWlgxTkcKRmR0b20vRHpNTlUrTWVLTmhKN2ppdHJhbGo0MUU2VmY4UGx3VUhCSFFSRlhHVTdBajY0R3hKVVRGeThiSlo5MQo4ckdPbWFGdkU3RkJjZjZJS3NoUEVDQlYxL01VUmVYZ1JQVHFoNVV5a3c3K1UwYjZMSjMvaXlLNVM5a0pSYVRlCnBMaWFXTjBiZlZLZmpsbERpSUdrbmliVmI2M2REY1kzZmUwRGtodmxkMTkyN2p5TnhGMVdXNkxaWm02ek5UZmwKTXJZPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgRzMgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IEczIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEdsb2JhbCBSb290IEczIgojIFNlcmlhbDogNzA4OTI0NDQ2OTAzMDI5MzI5MTc2MDA4MzMzMzg4NDM2NDE0NgojIE1ENSBGaW5nZXJwcmludDogZjU6NWQ6YTQ6NTA6YTU6ZmI6Mjg6N2U6MWU6MGY6MGQ6Y2M6OTY6NTc6NTY6Y2EKIyBTSEExIEZpbmdlcnByaW50OiA3ZTowNDpkZTo4OTo2YTozZTo2Njo2ZDowMDplNjo4NzpkMzozZjpmYTpkOTozYjplODozZDozNDo5ZQojIFNIQTI1NiBGaW5nZXJwcmludDogMzE6YWQ6NjY6NDg6Zjg6MTA6NDE6Mzg6Yzc6Mzg6ZjM6OWU6YTQ6MzI6MDE6MzM6Mzk6M2U6M2E6MTg6Y2M6MDI6Mjk6NmU6Zjk6N2M6MmE6Yzk6ZWY6Njc6MzE6ZDAKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNQekNDQWNXZ0F3SUJBZ0lRQlZWV3ZQSmVwRFUxdzZRUDFhdEZjakFLQmdncWhrak9QUVFEQXpCaE1Rc3cKQ1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdQpaR2xuYVdObGNuUXVZMjl0TVNBd0hnWURWUVFERXhkRWFXZHBRMlZ5ZENCSGJHOWlZV3dnVW05dmRDQkhNekFlCkZ3MHhNekE0TURFeE1qQXdNREJhRncwek9EQXhNVFV4TWpBd01EQmFNR0V4Q3pBSkJnTlZCQVlUQWxWVE1SVXcKRXdZRFZRUUtFd3hFYVdkcFEyVnlkQ0JKYm1NeEdUQVhCZ05WQkFzVEVIZDNkeTVrYVdkcFkyVnlkQzVqYjIweApJREFlQmdOVkJBTVRGMFJwWjJsRFpYSjBJRWRzYjJKaGJDQlNiMjkwSUVjek1IWXdFQVlIS29aSXpqMENBUVlGCks0RUVBQ0lEWWdBRTNhZlp1NHE0Qy9zTGZ5SFM4TDYrYy9NelhScThOT3JleHB1ODBKWDI4TXpRQzdwaFcxRkcKZnA0dG4rNk9Zd3dYN0FkdzljK0VMa0NEbk9nL1FXMDdyZE9rRkZrMmVKMERRKzRRRTJ4eTNxNklwNkZydFVQTwpaOXdqL3dNY28rSStvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJoakFkCkJnTlZIUTRFRmdRVXM5dElwUG1oeGRpdU5rSE1FV05wWWltOFM4WXdDZ1lJS29aSXpqMEVBd01EYUFBd1pRSXgKQUsyODhtdy9Fa3JSTFRuRENnbVhjL1NJTm95SUo3dm1pSTFRaGFkaitaNHkzbWFURC9ITXNRbVAzV3lyK210LwpvQUl3T1daYndtU051SjVRM0tqVlNhTHR4OXpSU1g4WEFiaklobzlPaklncnFKcXBpc1hSQUwzNFZPS2E1VnQ4CnN5Y1gKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNCBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0IE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNCIKIyBTZXJpYWw6IDc0NTE1MDA1NTg5NzczNzA3Nzc5MzAwODQ4NjkwMTY2MTQyMzYKIyBNRDUgRmluZ2VycHJpbnQ6IDc4OmYyOmZjOmFhOjYwOjFmOjJmOmI0OmViOmM5OjM3OmJhOjUzOjJlOjc1OjQ5CiMgU0hBMSBGaW5nZXJwcmludDogZGQ6ZmI6MTY6Y2Q6NDk6MzE6Yzk6NzM6YTI6MDM6N2Q6M2Y6Yzg6M2E6NGQ6N2Q6Nzc6NWQ6MDU6ZTQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU1OjJmOjdiOmRjOmYxOmE3OmFmOjllOjZjOmU2OjcyOjAxOjdmOjRmOjEyOmFiOmY3OjcyOjQwOmM3OjhlOjc2OjFhOmMyOjAzOmQxOmQ5OmQyOjBhOmM4Ojk5Ojg4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGa0RDQ0EzaWdBd0lCQWdJUUJac2JWNTZPSVRMaU9RZTlwM2QxWERBTkJna3Foa2lHOXcwQkFRd0ZBREJpCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU0V3SHdZRFZRUURFeGhFYVdkcFEyVnlkQ0JVY25WemRHVmtJRkp2YjNRZwpSelF3SGhjTk1UTXdPREF4TVRJd01EQXdXaGNOTXpnd01URTFNVEl3TURBd1dqQmlNUXN3Q1FZRFZRUUdFd0pWClV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXUKWTI5dE1TRXdId1lEVlFRREV4aEVhV2RwUTJWeWRDQlVjblZ6ZEdWa0lGSnZiM1FnUnpRd2dnSWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDLzVwQnphTjY3NUYxS1BEQWlNR2t6N01LbkpTN0pJVDN5Cml0aFp3dUVwcHoxWXEzYWF6YTU3RzRRTnhEQWY4eHVrT0JiclZzYVhiUjJyc25ueXloSFM1Ri9XQlR4U0QxSWYKeHA0VnBYNituNmxYRmxsVmNxOW9rM0RDc3JwMW1XcHpNcFRSRUVRUUx0K0M4d2VFNW5RN2JYSGlMUXdiN2lEVgp5U0FkWXlrdHp1eGVUc2lUK0NGaG16VHJCY1plN0ZzYXZPdkp6ODJzTkVCZnNYcG03bmZJU0tobVYxZWZWRmlPCkRDdTNUNmN3MlZidXludGQ0NjNKVDE3bE5lY3h5OXFUWHR5T2o0RGF0cEdZUUpCNXczakh0ckhFdFdvWU9BTVEKamRqVU42UXVCWDJJOVlJK0VKRndxMVdDUVRMWDJ3UnpLbTZSQVh3aFROUzhyaHNEZFYxNFp0azZNVVNhTTBDLwpDTmRhU2FUQzVxbWdaOTJrSjd5aFR6bTFFVmdYOXlSY1JvOWs5OEZwaUhhWWRqMVpYVUoyaDRtWGFYcEk4T0NpCkVodG1tblRLM2tzZTV3NWpydWJVNzVLU09wNDkzQURrUlNXSnRwcEVHU3Qrd0pTMDBtRnQ2elBaeGQ5TEJBRE0KZlJ5Vnc0LzNJYkt5RWJlN2YvTFZqSEFzUVdDcXNXTVlSSlVhZG1KKzlvQ3crK2hrcGpQUmlRZmh2YmZtUTZRWQp1S1ozQWVFUGxBd2hIYkpVS1NXSmJPVU9VbEZIZEw0bXJMWkJkZDU2ckYrTlA4bTgwMEVSRWx2bEVGRHJNY1hLCmNoWWlDZDk4VEhVL1krd2hYOFFnVVd0dnNhdUdpMC9DMWtWZm5TRDhvUjdGd0kraXNYNEtKcG4xNUdrdm1CMHQKOWRtcHNoM2xHd0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQgpoakFkQmdOVkhRNEVGZ1FVN05mamd0SnhYV1JNM3k1blArZTZtSzRjRDA4d0RRWUpLb1pJaHZjTkFRRU1CUUFECmdnSUJBTHRoMlgycGJMNFh4SkVidzZHaUFJM2paR2dQVnM5M3JuRDUvWnBLbWJuSmVGd01ERi9rNWhRcFZnczIKU1YxRVkrQ3RuSllZWmhzakRUMTU2VzFyMWxUNDBqekJRMEN1SFZEMVV2eVFPN3VZbVdscng4R25xR2lrSjl5ZAorU2V1TUlXNTltZE5PajZQV1RraVUwVHJ5RjBEeXUxUWVuMWlJUXFBeUhObTBhQUZZRi9vcGJTbnI2ajNiVFdjCmZGcUsxcUk0bWZONGkvUk4waUFMM2dUdWpKdEhnWElOd0JReTd6QlpMcTdnY2ZKVzVHcVhiNUpRYlphTmFIcWEKc2pZVWVnYnlKTGtKRVZEWENMRzRpWHFFSTJGQ0tlV2p6YUlnUWRmUm5HVFo2aWFoaXhUWFRCbXlVRUZ4UFQ5TgpjQ09HREVyY2dkTE1NcFNFRFFnSmx4eFB3TzVySUhRdzB1QTVOQkNGSVJVQkNPaFZNdDV4U2Rrb0YxQk41cjVOCjBYV3MwTXI3UWJoRHBhclR3d1ZFVHl3Mm0rTDY0a1c0STFOc0JtOW5WWDlHdFV3L2JpaGFlU2JTcEtoaWw5SWUKNHUxS2k3d2IvVWRLRGQ5blpuNnlXMEhRTytUME8vUUVZK252d2xRQVVhQ0tLc25PZU16VjZvY0VHTFBPcjBtSQpyL09TbWJhejVtRVAwb1VBNTFBYTVCdVZuUm1odVp5eG03RUFIdS9RRDA5Q2JNa0t2TzVEK2pweHBjaE5KcVUxCi9ZbGR2SVZpSFRMU29DdFU3WnBYd2R2NkVNOFp0NHRLRzQ4QnRpZVZVK2kyaVcxYnZHalVJK2lMVWFKVytmQ20KZ0tEV0hyTzhEdzlUZFNtcTZoTjM1TjZNZ1NHdEJ4QkhFYTJIUFFmUmRielA4MlorCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89Q09NT0RPIENBIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1DT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89Q09NT0RPIENBIExpbWl0ZWQKIyBMYWJlbDogIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAxMDE5MDkwODQ1Mzc1ODIwOTMzMDg5NDEzNjM1MjQ4NzMxOTMxMTcKIyBNRDUgRmluZ2VycHJpbnQ6IDFiOjMxOmIwOjcxOjQwOjM2OmNjOjE0OjM2OjkxOmFkOmM0OjNlOmZkOmVjOjE4CiMgU0hBMSBGaW5nZXJwcmludDogYWY6ZTU6ZDI6NDQ6YTg6ZDE6MTk6NDI6MzA6ZmY6NDc6OWY6ZTI6Zjg6OTc6YmI6Y2Q6N2E6OGM6YjQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDUyOmYwOmUxOmM0OmU1OjhlOmM2OjI5OjI5OjFiOjYwOjMxOjdmOjA3OjQ2OjcxOmI4OjVkOjdlOmE4OjBkOjViOjA3OjI3OjM0OjYzOjUzOjRiOjMyOmI0OjAyOjM0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGMkRDQ0E4Q2dBd0lCQWdJUVRLcjV5dHRqYitBZjkwN1lXd09HblRBTkJna3Foa2lHOXcwQkFRd0ZBRENCCmhURUxNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEcKQTFVRUJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRUNoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVgpCQU1USWtOUFRVOUVUeUJTVTBFZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1UQXdNVEU1Ck1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaFRFTE1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ1QKRWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2hNUgpRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVkJBTVRJa05QVFU5RVR5QlNVMEVnUTJWeWRHbG1hV05oCmRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ1IKNkZTUzBncFdzYXdOSk4zRnowUm5kSmtyTjZOOUkzQUFjYnhUMzhUNktoS1BTMzhRVnIyZmNISzNZWC9KU3c4WApwejNqc0FSaDd2OFJsOGYwaGo0SytqNWMrWlBtTkhyWkZHdm5uTE9Gb0lKNmRxOXhrTmZzL1EzNm5HejYzN0NDCjlCUisrYjdFcGk5UGY1bC90ZnhuUTNLOURBRFdpZXRyTE5QdGo1Z2NGS3QrNWVOdS9OaW81SklrMmtOcllyaFYKL2VyQnZHeTJpL01Palpya20yeHBtZmg0U0RCRjFhM2hEVHhGWVB3eWxsRW52R2ZEeWk2MmErcEd4OGNnb0xFZgpaZDVJQ0xxa1RxbnlnMFkzaE92b3pJRklRMmRPY2lxYlhMMU1HeWlLWENKN3RLdVkyZTdnVVlQRENVWk9iVDZaCitwVVgybnd6VjBFOGpWSHRDN1pjcnl4akd0OVh5RCs4NlYzRW02OUZtZUtqV2lTMHVxbFdQYzl2cXY5SldMN3cKcVAvMHVLM3BOL3U2dVBRTE92bm9RMEllaWRpRXl4UHgyYnZoaVdDNGpDaFdyQlFkbkFybmNldlBEdDA5cVphaApTTDA4OTYrMURTSk13QkdCN0ZZNzl0T2k0bHUzc2dRaVVwV0FrMm5vamt4bDhaRURMWEIwQXVxTFp4VXBhVklDCnU5ZmZVR3BWUnIrZ295aGhmM0RRdzZLcUxDR3FSODRvbkFaRmRyK0NHQ2UwMWE2MHkxRG1hL1JNaG5FdzZhYmYKRm9iZzJQOUEzZnZRUW9oL296TTZMbHdlUVJHQlk4NFljV3NyN0thS3R6RmNPbXBINE1ONVdkWWdHcS95YXBpcQpjcnhYU3RKTG5ic1EvTEJNUWVYdEhUMWVLSjJjekwrelVkcW5SK1dFVXdJREFRQUJvMEl3UURBZEJnTlZIUTRFCkZnUVV1NjkrQWozNnB2RThoSTZ0N2ppWTdOa3lNdFF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIKL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTUJRQURnZ0lCQUFyeDFVYUV0NjVSdTJ5eVRVRVVBSk5Nbk12bAp3RlRQb0NXT0F2bjlzS0lOOVNDWVBCTXRyRmFpc05aK0VaTHBMcnFlTHBweXNiMFpSR3hoTmFLYXRCWVNhVnFNCjRkYytwQnJvTHdQMHJtRWRFQnNxcEl0NnhmNEZwdUhBMXNqK25xNlBLN285bWZqWWN3bFlSbTZtblBUWEo5T1YKMmplRGNoelRjK0NpUjVrRE9GM1ZTWGtBS1J6SDdKc2dIQWNrYVZkNHNqbjhPb1NndFp4OGpiOHVrMkludHpuYQpGeGl1dlR3SmFQK0VtenpWMWdzRDQxZWVGUGZSNjAvSXZZY2p0N1pKUTNtRlhMcnJrZ3VoeHVob3FFd1dzUnFaCkN1aFRMSks3b1FrWWRReGxxSHZMSTdjYXdpaUZ3eHYvMEN0aTc2UjdDWkdZWjR3VUFjMW9CbXBqSVhVRGdJaUsKYm9IR2hmS3BwQzNuOUtVa0VFZUR5czMwalhsWXNRYWI1eG9xMlowQjE1Ujk3UU5LeXZEYjZLa0JQdlZXbWNrZQpqa2s5dStVSnVlQlBTWkk5Rm9KQXpNeFp4dVk2N1JJdWFUeHNsYkg5cWgxN2Y0YStIZzR5UnZ2N0U0OTFmMHlMClMwWmovZ0EwUUhEQnc3bWgzYVp3NGdTelFienBnSkhxWkp4NjRTSURxWnh1Ync1bFQyeUhoMTd6YnFENWRhV2IKUU9oVHNpZWRTcm5BZHlHTi80ZnkzcnlNN3hmZnQwa0wwZkp1TUFzYURrNTI3Ukg4OWVsV3NuMi94MjBLazR5bAowTUMySGI0NlRwU2kxMjVzQzhLS2ZQb2c4OFRrNWMwTnFNdVJrckY4aGV5MUZHbG1Eb0xuemM3SUxhWlJmeUhCCk5WT0ZCa3BkbjYyN0cxOTAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UaGUgVVNFUlRSVVNUIE5ldHdvcmsKIyBTdWJqZWN0OiBDTj1VU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VGhlIFVTRVJUUlVTVCBOZXR3b3JrCiMgTGFiZWw6ICJVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMjY0NTA5Mzc2NDc4MTA1ODc4NzU5MTg3MTY0NTY2NTc4ODcxNwojIE1ENSBGaW5nZXJwcmludDogMWI6ZmU6Njk6ZDE6OTE6Yjc6MTk6MzM6YTM6NzI6YTg6MGY6ZTE6NTU6ZTU6YjUKIyBTSEExIEZpbmdlcnByaW50OiAyYjo4ZjoxYjo1NzozMzowZDpiYjphMjpkMDo3YTo2Yzo1MTpmNzowZTplOTowZDpkYTpiOTphZDo4ZQojIFNIQTI1NiBGaW5nZXJwcmludDogZTc6OTM6Yzk6YjA6MmY6ZDg6YWE6MTM6ZTI6MWM6MzE6MjI6OGE6Y2M6YjA6ODE6MTk6NjQ6M2I6NzQ6OWM6ODk6ODk6NjQ6YjE6NzQ6NmQ6NDY6YzM6ZDQ6Y2I6ZDIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYzakNDQThhZ0F3SUJBZ0lRQWYxdE1QeWp5bEdvRzd4a0RqVURMVEFOQmdrcWhraUc5dzBCQVF3RkFEQ0IKaURFTE1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbApjbk5sZVNCRGFYUjVNUjR3SEFZRFZRUUtFeFZVYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WCkJBTVRKVlZUUlZKVWNuVnpkQ0JTVTBFZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1UQXcKTWpBeE1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaURFTE1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVgpCQWdUQ2s1bGR5QktaWEp6WlhreEZEQVNCZ05WQkFjVEMwcGxjbk5sZVNCRGFYUjVNUjR3SEFZRFZRUUtFeFZVCmFHVWdWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVkJBTVRKVlZUUlZKVWNuVnpkQ0JTVTBFZ1EyVnkKZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJSwpBb0lDQVFDQUVtVVhOZzdEMndpejBLeFhEWGJ0elNmVFRLMVFnMkhpcWlCTkNTMWtDZHpPaVovTVBhbnM5cy9CCjNQSFRzZFo3TnlnUkswZmFPY2E4T2htMFg2YTlmWjJqWTBLMmR2S3BPeXVSK09KdjBPd1dJSkFKUHVMb2RNa1kKdEpIVVltVGJmNk1HOFlnWWFwQWlQTHorRS9DSEZIdjI1QitPMU9SUnhoRm5SZ2hSeTRZVVZEKzhNLzUrYkp6LwpGcDBZdlZHT05hYW5ac2h5WjlzaFpySFVtM2dEd0ZBNjZNenczTHllVFA2dkJaWTFIMWRhdC8vTytUMjNMTGIyClZOM0k1eEk2VGE1TWlyZGNtclMzSUQzS2Z5STBybjQ3YUdZQlJPY0JUa1pUbXpOZzk1UytVemVRYzBQek1zTlQKNzl1cS9uUk9hY2RyakdDVDNzVEhETi9oTXE3TWt6dFJlSlZuaSs0OVZ2NE0wR2tQR3cvekpTWnJNMjMzYmtmNgpjMFBsZmc2bFpyRXBmREtFWTFXSnhBM0JrMVF3R1JPczAzMDNwK3RkT213MVhOdEIxeExhcVVrTDM5aUFpZ21UCllvNjFaczhsaU0yRXVMRS9wRGtQMlFLZTZ4Sk1sWHp6YXdXcFhoYUR6TGhuNHVnVG5jeGJndE5NcysxYi85N2wKYzZ3ak95MEF2elZWZEFsSjJFbFlHbitTTnVaUmtnN3pKbjBjVFJlOHlleERKdEMvUVY5QXFVUkU5Sm5uVjRlZQpVQjlYVktnKy9YUmpMN0ZRWlFubVdFSXVReHBNdFBBbFIxbjZCQjZUMUNaR1NsQ0JzdDYrZUxmOFp4WGh5VmVFCkhnOWoxdWxpdXRaZlZTN3FYTVlvQ0FRbE9iZ09LNm55VEpjY0J6OE5Vdlh0N3krQ0R3SURBUUFCbzBJd1FEQWQKQmdOVkhRNEVGZ1FVVTNtL1dxb3JTczlVZ09IWW04Q2Q4cklEWnNzd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4RwpBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRU1CUUFEZ2dJQkFGelVmQTNQOXdGOVFabGxESFBGClVwL0wrTStaQm44YjJrTVZuNTRDVlZlV0ZQRlNQQ2VIbENqdEh6b0JONkoyL0ZOUXdJU2J4bXRPdW93aFQ2S08KVldLUjgya1YyTHlJNDhTcUMvM3ZxT2xMVlNvR0lHMVZlQ2taN2w4d1hFc2tFVlgvSkpwdVhpb3I3Z3RObjMvMwpBVGlVRkpWREJ3bjdZS251SEtzU2pLQ2FYcWVZYWxsdGl6OEkrOGpSUmE4WUZXU1FFZzl6S0M3RjRpUk8vRmpzCjhQUkYvaUt6NnkrTzB0bEZZUVhCbDIrb2RuS1BpNHcycjc4TkJjNXhqZWFtYng5c3BuRml4ZGpRZzNJTThXY1IKaVF5Y0UweHlOTis4MVhIZnFuSGQ0YmxzakR3U1hXWGF2VmNTdGtOci8rWGVUV1lSVWMrWnJ1d1h0dWh4a1l6ZQpTZjdkTlhHaUZTZVVITTloNHlhN2I2Tm5KU0ZkNXQwZEN5NW9HenVDcit5RFo0WFVtRkYwc2JtWmdJbi9mM2daClhIbEtZQzZTUUs1TU55b3N5Y2RpeUE1ZDl6WmJ5dUFsSlFHMDNSb0huSGNBUDlEYzFldzkxUHE3UDh5RjFtOS8KcVMzZnVRTDM5WmVhdFRYYXcyZXdoMHFwS0o0amp2OWNKMnZoc0UvekIrNEFMdFJaaDh0U1FaWHE5RWZYN21SQgpWWHlOV1FLVjNXS2R3cm51V2loMGhLV2J0NURIREFmZjlZazJkRExXS01Hd3NBdmduRXpESE5iODQybTFSMGFCCkw2S0NxOU5qUkhERWpmOHRNN3F0ajN1MWNJaXVQaG5QUUNqWS9NaVF1MTJaSXZWUzVsakZINGd4USs2SUhkZkcKamp4RGFoMm5HTjU5UFJieFl2bktrS2o5Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1VU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VGhlIFVTRVJUUlVTVCBOZXR3b3JrCiMgU3ViamVjdDogQ049VVNFUlRydXN0IEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVRoZSBVU0VSVFJVU1QgTmV0d29yawojIExhYmVsOiAiVVNFUlRydXN0IEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDEyMzAxMzgyMzcyMDE5OTQ4MTQ1NjU2OTcyMDQ0Mzk5NzU3MjEzNAojIE1ENSBGaW5nZXJwcmludDogZmE6Njg6YmM6ZDk6YjU6N2Y6YWQ6ZmQ6Yzk6MWQ6MDY6ODM6Mjg6Y2M6MjQ6YzEKIyBTSEExIEZpbmdlcnByaW50OiBkMTpjYjpjYTo1ZDpiMjpkNToyYTo3Zjo2OTozYjo2Nzo0ZDplNTpmMDo1YToxZDowYzo5NTo3ZDpmMAojIFNIQTI1NiBGaW5nZXJwcmludDogNGY6ZjQ6NjA6ZDU6NGI6OWM6ODY6ZGE6YmY6YmM6ZmM6NTc6MTI6ZTA6NDA6MGQ6MmI6ZWQ6M2Y6YmM6NGQ6NGY6YmQ6YWE6ODY6ZTA6NmE6ZGM6ZDI6YTk6YWQ6N2EKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNqekNDQWhXZ0F3SUJBZ0lRWEl1WnhWcVV4ZEp4VnQ3TmlZRE1KakFLQmdncWhrak9QUVFEQXpDQmlERUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsY25ObAplU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlVhR1VnVlZORlVsUlNWVk5VSUU1bGRIZHZjbXN4TGpBc0JnTlZCQU1UCkpWVlRSVkpVY25WemRDQkZRME1nUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTVRBd01qQXgKTURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JpREVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVApDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbGNuTmxlU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlVhR1VnClZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WQkFNVEpWVlRSVkpVY25WemRDQkZRME1nUTJWeWRHbG0KYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUWFyRlJhcWZsbwpJK2Q2MVNSdlU4WmEyRXVyeHRXMjBlWnpjYTdkbk5ZTVlmM2JvSWtEdUFVVTdGZk83bDAvNGlHenp2ZlVpbm5nCm80TitMWmZRWWNUeG1kd2xrV09yZnpDanRIRGl4NkV6blBPL0xseFRzVit6ZlRKL2lqVGplWG1qUWpCQU1CMEcKQTFVZERnUVdCQlE2NFFtRzFNOFp3cFoyZEVsMjNPQTF4bU5qbWpBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRApWUjBUQVFIL0JBVXdBd0VCL3pBS0JnZ3Foa2pPUFFRREF3Tm9BREJsQWpBMlo2RVdDTnprbHdCQkhVNis0V01CCnp6dXFRaEZrb0oyVU9RSVJlVng3SGZwa3VlNFdRck8vaXNJSnhPemtzVTBDTVFEcEttRkhqRkpLUzA0WWNQYlcKUk5adTlZTzZiVmk5Sk5sV1NPcnZ4S0pHZ1locU9rYlJxWnROeVdIYTBWMVhhaGc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQKIyBTdWJqZWN0OiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQKIyBMYWJlbDogIkdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNCIKIyBTZXJpYWw6IDE0MzY3MTQ4Mjk0OTIyOTY0NDgwODU5MDIyMTI1ODAwOTc3ODk3NDc0CiMgTUQ1IEZpbmdlcnByaW50OiAyMDpmMDoyNzo2ODpkMTo3ZTphMDo5ZDowZTplNjoyYTpjYTpkZjo1Yzo4OTo4ZQojIFNIQTEgRmluZ2VycHJpbnQ6IDY5OjY5OjU2OjJlOjQwOjgwOmY0OjI0OmExOmU3OjE5OjlmOjE0OmJhOmYzOmVlOjU4OmFiOjZhOmJiCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZTpjOTo0OToxMTpjMjo5NTo1Njo3NjpkYjo2YzowYTo1NTowOTo4NjpkNzo2ZTozYjphMDowNTo2Njo3Yzo0NDoyYzo5Nzo2MjpiNDpmYjpiNzo3MzpkZToyMjo4YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQjRUQ0NBWWVnQXdJQkFnSVJLamlrSEpZS0JONUNzaWlsQytnMG1BSXdDZ1lJS29aSXpqMEVBd0l3VURFawpNQ0lHQTFVRUN4TWJSMnh2WW1Gc1UybG5iaUJGUTBNZ1VtOXZkQ0JEUVNBdElGSTBNUk13RVFZRFZRUUtFd3BICmJHOWlZV3hUYVdkdU1STXdFUVlEVlFRREV3cEhiRzlpWVd4VGFXZHVNQjRYRFRFeU1URXhNekF3TURBd01Gb1gKRFRNNE1ERXhPVEF6TVRRd04xb3dVREVrTUNJR0ExVUVDeE1iUjJ4dlltRnNVMmxuYmlCRlEwTWdVbTl2ZENCRApRU0F0SUZJME1STXdFUVlEVlFRS0V3cEhiRzlpWVd4VGFXZHVNUk13RVFZRFZRUURFd3BIYkc5aVlXeFRhV2R1Ck1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXVNWjUwNDlzSlE2Zkxqa1pIQU9rcnBybE9RY0oKRnNwanNibUcrSXBYd1ZmT1F2cHpvZmRsUXY4ZXdRQ3libk1PLzhjaDVSaWtxdGx4UDZqVXVjNk1IYU5DTUVBdwpEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZGU3dlNjFGCnVPSkFmL3NLYnZ1K004azhvNFRWTUFvR0NDcUdTTTQ5QkFNQ0EwZ0FNRVVDSVFEY2txR2dFNmJQQTdEbXhDR1gKa1BvVVZ5MEQ3TzQ4MDI3S3FHeDJ2S0xldXdJZ0o2aUZKeldiVnNhajhrZlN0MjRiQWdBWHFtZW1GWkhlK3BUcwpld3Y0bjRRPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1CiMgU3ViamVjdDogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1CiMgTGFiZWw6ICJHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjUiCiMgU2VyaWFsOiAzMjc4NTc5MjA5OTk5MDUwNzIyNjY4MDY5ODAxMTU2MDk0NzkzMTI0NAojIE1ENSBGaW5nZXJwcmludDogOWY6YWQ6M2I6MWM6MDI6MWU6OGE6YmE6MTc6NzQ6Mzg6ODE6MGM6YTI6YmM6MDgKIyBTSEExIEZpbmdlcnByaW50OiAxZjoyNDpjNjozMDpjZDphNDoxODplZjoyMDo2OTpmZjphZDo0ZjpkZDo1Zjo0NjozYToxYjo2OTphYQojIFNIQTI1NiBGaW5nZXJwcmludDogMTc6OWY6YmM6MTQ6OGE6M2Q6ZDA6MGY6ZDI6NGU6YTE6MzQ6NTg6Y2M6NDM6YmY6YTc6ZjU6OWM6ODE6ODI6ZDc6ODM6YTU6MTM6ZjY6ZWI6ZWM6MTA6MGM6ODk6MjQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNIakNDQWFTZ0F3SUJBZ0lSWUZsSjRDWXV1MVg1Q25lS2NmbEsyR3d3Q2dZSUtvWkl6ajBFQXdNd1VERWsKTUNJR0ExVUVDeE1iUjJ4dlltRnNVMmxuYmlCRlEwTWdVbTl2ZENCRFFTQXRJRkkxTVJNd0VRWURWUVFLRXdwSApiRzlpWVd4VGFXZHVNUk13RVFZRFZRUURFd3BIYkc5aVlXeFRhV2R1TUI0WERURXlNVEV4TXpBd01EQXdNRm9YCkRUTTRNREV4T1RBek1UUXdOMW93VURFa01DSUdBMVVFQ3hNYlIyeHZZbUZzVTJsbmJpQkZRME1nVW05dmRDQkQKUVNBdElGSTFNUk13RVFZRFZRUUtFd3BIYkc5aVlXeFRhV2R1TVJNd0VRWURWUVFERXdwSGJHOWlZV3hUYVdkdQpNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRVIwVU9sdnQ5WGIvcE9kRWgrSjhMdHRWN0hwSTZTRmtjCjhHSXhMY0I2S1A0YXAxeXp0c3lYNTBYVVdQclJkMjFEb3NDSFpUUUtIM3JkNnp3em9jV2RUYVJ2UVpVNGY4a2UKaE92Um5rbVNoNVNIRERxRlNtYWZuVm1UVFpkaEJvWktvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRApWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVVBlWXBTSnZxQjhvaFJFb20zbTdlMG9QUW4xa3dDZ1lJCktvWkl6ajBFQXdNRGFBQXdaUUl4QU9WcEVzbHUyOFl4dWdsQjRaZjQrLzJhNG4wU3llMThaTlBMQlNXTFZ0bWcKNTE1ZFRndURuRnQyS2FBSkppRnFZZ0l3Y2RLMWoxenFPK0Y0Q1lXb2RaSTd5Rno5U084TmRDS29DT0p1eFVuTwp4d3k4cDJGcDhmYzc0U3JMK1N2elpwQTMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzMgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBTdWJqZWN0OiBDTj1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgTGFiZWw6ICJTdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczIgojIFNlcmlhbDogMTAwMDMwMDEKIyBNRDUgRmluZ2VycHJpbnQ6IDBiOjQ2OjY3OjA3OmRiOjEwOjJmOjE5OjhjOjM1OjUwOjYwOmQxOjBiOmY0OjM3CiMgU0hBMSBGaW5nZXJwcmludDogZDg6ZWI6NmI6NDE6NTE6OTI6NTk6ZTA6ZjM6ZTc6ODU6MDA6YzA6M2Q6YjY6ODg6OTc6Yzk6ZWU6ZmMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDNjOjRmOmIwOmI5OjVhOmI4OmIzOjAwOjMyOmY0OjMyOmI4OjZmOjUzOjVmOmUxOjcyOmMxOjg1OmQwOmZkOjM5Ojg2OjU4OjM3OmNmOjM2OjE4OjdmOmE2OmY0OjI4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGZERDQ0ExeWdBd0lCQWdJRUFKaWlPVEFOQmdrcWhraUc5dzBCQVFzRkFEQmFNUXN3Q1FZRFZRUUdFd0pPClRERWVNQndHQTFVRUNnd1ZVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1TVNzd0tRWURWUVFERENKVGRHRmgKZENCa1pYSWdUbVZrWlhKc1lXNWtaVzRnVW05dmRDQkRRU0F0SUVjek1CNFhEVEV6TVRFeE5ERXhNamcwTWxvWApEVEk0TVRFeE16SXpNREF3TUZvd1dqRUxNQWtHQTFVRUJoTUNUa3d4SGpBY0JnTlZCQW9NRlZOMFlXRjBJR1JsCmNpQk9aV1JsY214aGJtUmxiakVyTUNrR0ExVUVBd3dpVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdUlGSnYKYjNRZ1EwRWdMU0JITXpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTDR5b2xRUApjUHNzWEZucmJNU2tVZWlGS3JQTVNqVHlzRi96RHNjY1BWTWVpQWhvMkc4OXJjS2V6SUpuQnllSGFIRTZuM1dXCklrWUZzTzJ0eDF1ZUt0NmMvRHJHbGFmMUYyY1k1eTlKQ0F4Y3orYk1OTzE0KzFDeDNHc3k4S0wrdGp6azdGcVgKeHo4ZWNBZ3dvTnpGczIxdjBJSnlFYXZTZ1doWmdoZTNlSkpnK3N6ZVA0VHJqVGd6a0FweUkvbzF6Q1p4TWRGeQpLSkxaV3lOdFpyVnRCMExycGpQT2t0dkE5bXhqZU0zS1RqMjE1VktiOGI0NzVsUmdzR1llQ2FzSC9sU0pFVUxSCjl5UzZZSGdhbVBmSkVmMFd3VFVhVkhYdlE5UGxyazdPNTN2RHhrNWhVVXVybWtWTG9SOUJ2VWhURlhGa0M0YXoKNVM2K3pxUWJ3U21Fb3JYTENDTjJReUlrSHhjRTFHNmN4dngvSzJZYTdJcmwxczlOOVdNSnR4VTUxbnVzNitOOAo2VTc4ZFVMSTdWaVZEQVpDb3B6MzVIQ3ozM0p2V2pkQWlkaUZwTmZ4Qzk1REdkUktXQ3lNaWptZXY0U0g4Ulk3Ck5nenAwN1RLYkJsQlVnbWhIYkJxdjRMdmNGRWhNdHdGZG96TDkyVGtBMUN2akpGbnE4WHk3bGpZM3I3MzV6SFAKYk1rN2NjSFZpTFZsdk1Eb0Z4Y0hFclZjMHFzZ2s3VG1nb053TnNYTm80MnRpK3lqd1VPSDVrUGlOTDZWaXpYdApCem5hcUIxNm56YWVFckFNWlJLUUZXRFpKa0JFNDFaZ3BSRFVhano5UWR3T1drZTI3NWRoZFUvWi9zZXlIZFR0ClhVbXpxV3JMWm9RVDFWeWczTjl1ZHdiUmNYWElWMit2RDNkYkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUlVyZnJIa2xldXlqV2NMaEw3NUxwZApJTnlVVnpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQU1KbWRCVExJWGc0N21BRTZpcVRuQi9kNitPZWEzMUJEClU1Y3FQY284UjVndTRSVjc4Wkx6WWRxUUpSWmx3SjlVWFE0RE8xdDNBcHlFdGcyWVh6VGRPMlBDd3lpQndwd3AKTGluaXlNTUI4alBxS3FyTUNRajNaV2ZHemQvVHRpdW52Y3pSRG5CZnVDUFJ5NUZPQ3ZUSWV1WFpZemJCMU4vOApJcGYzWUYzcUtTOVlzcjFZdlkyV1R4QjF2MGg3UFZHSG9UeDBJc0w4QjMrQTNNU3MvbXJCY0RDdzZZNXA0aXhwCmdaUUp1dDMrVGNDRGpKUll3RVlncjV3ZkF2ZzFWVWt2UnRUQThLQ1dBZzh6eFhIem5pTjlsTGY5T3RNSmd3WWgKL1dBOXJqTEEwdTZOcHZEbnRJSjhDc3h3eVhtQStQNU05eldFR1lveCt3cloxMytiOEtLYWE4TUZTdTFCWUJRdwowYW9SUW03VEl3SUVDOFpsM2QxU2Q5cUJhN0tvK2dFNHVaYnFLbXhubDRtVW5yemhWTlhrYW5qdlNyMHJtajFBCmZzYkFkZEp1KzJndzdPeUxuZmxKTlpvYUxObXpsVG5WSHBMM3BybGxMK1U5YlRwSVRBamM1Q2dTS0w1OU5WenEKNEJaK0V4dHExejdYbnZ3dGRiTEJGTlVqQTl0YmJ3cytlQzhOM2pPTkZyZEk1NE9hZ1E5N3dVTk5WUVFYT0VwUgoxVm1paVhUVG43NGVTOWZHYmJlSUpHOWdrYVNDaFZ0V1FielFSS3RxRTc3UkxGaTNFak5Zc2pkajNCUDFsQjAvClFGSDFUL1U2N2NqRjY4SWVIUmFWZXNkK1FuR1Ria3NWdHpEZnF1MVhoVWlzSFdyZE9Xbms0WGw0dnM0RnY2RU0KOTRCN0lXY25NRms9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQSBPPVN0YWF0IGRlciBOZWRlcmxhbmRlbgojIFN1YmplY3Q6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBSb290IENBIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgTGFiZWw6ICJTdGFhdCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQSIKIyBTZXJpYWw6IDEwMDAwMDEzCiMgTUQ1IEZpbmdlcnByaW50OiBmYzowNjphZjo3YjplODoxYTpmMTo5YTpiNDplODpkMjo3MDoxZjpjMDpmNTpiYQojIFNIQTEgRmluZ2VycHJpbnQ6IDc2OmUyOjdlOmMxOjRmOmRiOjgyOmMxOmMwOmE2Ojc1OmI1OjA1OmJlOjNkOjI5OmI0OmVkOmRiOmJiCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0ZDoyNDo5MTo0MTo0YzpmZTo5NTo2Nzo0NjplYzo0YzplZjphNjpjZjo2Zjo3MjplMjo4YToxMzoyOTo0MzoyZjo5ZDo4YTo5MDo3YTpjNDpjYjo1ZDphZDpjMTo1YQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmNEQ0NBMWlnQXdJQkFnSUVBSmlXalRBTkJna3Foa2lHOXcwQkFRc0ZBREJZTVFzd0NRWURWUVFHRXdKTwpUREVlTUJ3R0ExVUVDZ3dWVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdU1Ta3dKd1lEVlFRRERDQlRkR0ZoCmRDQmtaWElnVG1Wa1pYSnNZVzVrWlc0Z1JWWWdVbTl2ZENCRFFUQWVGdzB4TURFeU1EZ3hNVEU1TWpsYUZ3MHkKTWpFeU1EZ3hNVEV3TWpoYU1GZ3hDekFKQmdOVkJBWVRBazVNTVI0d0hBWURWUVFLREJWVGRHRmhkQ0JrWlhJZwpUbVZrWlhKc1lXNWtaVzR4S1RBbkJnTlZCQU1NSUZOMFlXRjBJR1JsY2lCT1pXUmxjbXhoYm1SbGJpQkZWaUJTCmIyOTBJRU5CTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUE0OGQraWZra1N6clMKTTRNMUxHbnMzQW1rNDFHb0pTdDV1QWc5NEpHNmhJWEdoYVRLNXNrdVU2VEpKQjc5VldaeFhTekZZR2dFdDluQwpVaVk0aUtUV08wQ213czAvelppVHMxUVVXSlpWMVZEK2hxMmtZMzljaC9hTzVpZVNaeGVTQWdNczNOWm1kTzNkClovL0JZWTFqVHcrYmJSY3dKdStyMGg4UW9QbkZmeFpwZ1FOSDdSNW9qWEtoVGJJbXhycHNYMjNXcjlHeEU0NnAKcmZOZWFYVW1HRDVCS3lGLzdvdGRCd2FkUThRcENpdjhLajZHeXp5RE92bkpEZHJGbWVLOGVFRXpkdUcvTDEzbApwSmhRREJYZDRQcWNmemhvMExLbWVxZlJNYjEraWxnblE3TzZNNUhUcDVnVlhKcm0wdzkxMmZ4Qm1KYytxaVhiCmo1SXVzSHNNWC9GanFUZjVtM1ZwVENnbUpkclY4aEp3UlZYajMzTmVOL1VoYkpDT05WckoweVByMDhDK2VLeEMKS0ZobXBVWnRjQUxYRVBsTFZQeGRoa3FIejMvS1Jhd1JXclVnVVkwdmlFZVhPY0RQdXNCQ0FVQ1pTQ0VMYTZmUwovWmJWMGI1R25VbmdDNmFnSWs0NDBNRThNTHh3anl4MXpOREZqRkU3UFpRSVpDWmhmYm5EWlk4VW5DSFFxdjBYCmNnT1B2WnVNNWw1VG5ybWQ3NEs3NGJ6aWNrRmJJWlRUUlRlVTBkOEpPVjNuSTZxYUhjcHRxQXFHaFlxQ3ZrSUgKMXZJNGduUGFoMXZsUE5PZVBxYzdudlFEcy9ueGZSTjBBdis3b2VYNkFIa2NwbVpCaUZ4Z1Y2WXVDY1M2L1pyUApweDlBdzd2TVdncFZTenM0ZGxHNFk0dUVsQmJtVnZNQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZQNnJBSkNZbmlUOHFjd2FpdnNudUw4d2JxZzcKTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFEUGR5eHVWcjVPczdhRUFKU3JSOGtOMG5iSGhwOGRCOU8ydExzSQplSzlwMGd0SjNqUEZySzNDaUFKOUJyYzFBc0ZneWIvRTZKVGUxTk9wRXlWYS9tNmlybjBGM0gzemJQQitwbzN1CjJkZk9XQmZvcVNtdWMwaUg1NXZLYmltaFpGOFpFL2V1QmhEL1VjYWJUVlVsVDVPWkVBRlRkZkVUenNlbVFVSFMKdjRpbGYwWDhyTGlsdFRNTWdzVDdCL1pxNVNXRVh3Ykt3WVk1RWR0WXpYYzdMTUpNRDE2YTQvQ3JQbUViVUNUQwp3UFR4R2ZBUktiYWxHQUtiMTJOTWNJeEhvd05EWExsZFJxQU5iLzlaanI3ZG4zTERXeXZmakZ2TzVReEdiSkt5CkNxTk1WRUlZRlJJWXZkcjh1blJ1LzhHMm9HVFlxVjlWcnA5Y2FuYVcySE5uaC90TmYxenVhY3B6RVB1S3FmMmUKdlRZNFNVbUg5QTRVOE9tSHVEK25UM3Bham5uVWsrUzdhRktFckd6cDg1aHdWWEl5K1RTckswbTF6U0JpNURwNgpaMk9ybHR4dHJwZnMvSjkyVm9ndVpzOWJ0c21rc05jRnV1RW5MNU83SmlxaWs3QWI4NDYrSFVDanVUYVBQb0lhCkdsNkk2bEQ0V2VLRFJpa0w0MFJjNFpXMmFaQ2FGRytYcm9IUGFPK1ptcjYxNStGLytQb1RSeFpNekcwSVFPZUwKZUc5UWdrUlFQMllHaXF0RGhGWktEeUF0aGc3MTB0dlNlb3BMemFYb1R2RmVKaVVCV1NPZ2Z0TDJmaUZYMXllOApGVmRNcEViQjRJTWVERXhOSDA4R0dlTDVxUFE2Z3FHeWVVTjUxcTF2ZWllUUE2VHFKSWMvMmIzWjZmSmZVRWtjCjd1elhMZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEgTz1JZGVuVHJ1c3QKIyBTdWJqZWN0OiBDTj1JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEgTz1JZGVuVHJ1c3QKIyBMYWJlbDogIklkZW5UcnVzdCBDb21tZXJjaWFsIFJvb3QgQ0EgMSIKIyBTZXJpYWw6IDEzMjk4ODIxMDM0OTQ2MzQyMzkwNTIwMDAzODc3Nzk2ODM5NDI2CiMgTUQ1IEZpbmdlcnByaW50OiBiMzozZTo3Nzo3Mzo3NTplZTphMDpkMzplMzo3ZTo0OTo2Mzo0OTo1OTpiYjpjNwojIFNIQTEgRmluZ2VycHJpbnQ6IGRmOjcxOjdlOmFhOjRhOmQ5OjRlOmM5OjU1Ojg0Ojk5OjYwOjJkOjQ4OmRlOjVmOmJjOmYwOjNhOjI1CiMgU0hBMjU2IEZpbmdlcnByaW50OiA1ZDo1Njo0OTo5YjplNDpkMjplMDo4YjpjZjpjYTpkMDo4YTozZTozODo3MjozZDo1MDo1MDozYjpkZTo3MDo2OTo0ODplNDoyZjo1NTo2MDozMDoxOTplNToyODphZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRllEQ0NBMGlnQXdJQkFnSVFDZ0ZDZ0FBQUFVVWp5RVMxQUFBQUFqQU5CZ2txaGtpRzl3MEJBUXNGQURCSwpNUXN3Q1FZRFZRUUdFd0pWVXpFU01CQUdBMVVFQ2hNSlNXUmxibFJ5ZFhOME1TY3dKUVlEVlFRREV4NUpaR1Z1ClZISjFjM1FnUTI5dGJXVnlZMmxoYkNCU2IyOTBJRU5CSURFd0hoY05NVFF3TVRFMk1UZ3hNakl6V2hjTk16UXcKTVRFMk1UZ3hNakl6V2pCS01Rc3dDUVlEVlFRR0V3SlZVekVTTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wTVNjdwpKUVlEVlFRREV4NUpaR1Z1VkhKMWMzUWdRMjl0YldWeVkybGhiQ0JTYjI5MElFTkJJREV3Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNuVUJuZVA1azkxRE5HOFc5UllZS3lxVStQWjRsZGhObFQKM1F3bzJkZncvNjZWUTNLWitiVmRmSXJCUXVFeFVIVFJnUTE4elpzaHEwUGlySzFlaG03ekNZb2ZXaks5b3V1VQorZWhjQ3V6L21OS3ZjYk8wVTU5T2grK1N2TDNzVHpJd2lFc1hYbGZFVThMMkFwZU4yV0lydnlRZllvM2Z3N2dwClMwbDRQSk5naUNMOG1kbzJ5TUtpMUN4VUFHYzFibk8vQWxqd3BOM2xzS0ltZXNyZ05xVVpGdlg5dCsrdVAwRDEKYlZvRS9jNDB5aVRjZENNYlhUTVRFbDNFQVNYMk1OMENYWi9nMVVlOXRPc2JvYnRKU2RpZld3THppdVFra09SaQpUMC9CcjRzT2RCZW8wWEtJYW5vQlNjeTBSbm5HRjdIYW1CNEhXZnAxSVlWbDNaQld6dnVycFdDZHhKMzVVckNMCnZZZjVqeXNqQ2lOMk8vY3o0Y2tBODJuNVM2TGdUcngra3ptRUIvZEVjSDcrQjFybHNhelJHTXp5TmVWSlNRaksKVnNrOSt3OFlmWXM3d1JQQ1RZL0pUdzQzNlIraERtcmZZaTdMTlFaUmVTeklKVGowK2t1bmlWeWMwdU1OT1laSwpkSHpWV1lmQ1AwNE1YRkwwUGZkU2d2SHFvNno5U1RRYUtQTkJpRG9UN3VqZS81a2RYN3JMNkI3eXVWQmd3REhUCmMrWHZ2cUR0TXd0MHZpQWd4R2RzOEFnRGVsV0FmMFpPbHFmMEhqN2g5dGdKNFROa0syUFhNbDZmK2NCN0QzaHYKbDd5VG12bWNFcEI0ZW9DSEZkZHlkSnhWZEhpeHV1RnVjQVM2VDZDNmFNTjcvekh3Y3owOWxDcXhDMEVPb1A1TgppR1ZyZVRPMDF3SURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QWRCZ05WSFE0RUZnUVU3VVFad05Qd0JvdnVwSHUrUXVjbVZNaU9Obll3RFFZSktvWklodmNOQVFFTEJRQUQKZ2dJQkFBMnVrREwycGt0OFJIWVpZUjRuS00xZVZPOGx2T01Ja1BrcDE2NW9DT0dVQUZqdkxpNStVMUtNdGx3SAo2b2k2bVl0UWxOZUNnTjloQ1FDVHJRMFU1czdCOGplVWVMQmZuTE9pYzdpUEJaTTR6WTArc0xqN3dNK3g4dXd0CkxSdk03S3FhczZwZ2doc3RPOE9FUFZlS2xoNmNkYmpUTU0xZ0NJT1EwNDVVOFUxbXdGMTBBMENqN29WK3doOTMKbkFib3dhY1lYVktWN2NuZEpaNXQrcW50b3pvMDBGbDcydTFROHpXLzdlc1VUVEhIWVBUYThZZWM0a2ppeHNVMword1lRK25WWlpqRkhLZHAybWh6cGdxN3ZtcmxSOTRnam1tbVZZanpsVllBMjExUUMvL0c1WGM3VUkyL1lSWVJLClcyWHZpUXpkRktjZ3l4aWxKYlFOK1FId290TDBBTWgwanFFcVNJNWwyeFBFNGlVWGZldStoMXNYSUZSUmswcFQKQXd2c1hjb3o3V0w5UmNjdlc5eFlvSUE1NXZyWC9oTVVwdTA5bEVwQ2ROVERkMWx6elk5R3ZsVTQ3L3Jva1RMcQpsMWdFSXQ0NHc4eThiY2t6T21vS2FUK2d5T3B5ajR4amhpTzliVHlXbnBYZ1NVeXFvcmtxRzV3MmdYanR3K2hHCjRpWlpSSFVlMlhXSlVjMFFoSjFoWU10ZCtaY2lUWTZZNXVOLzlsdTdyczNLU29GclhndnpVZUYwSytsK0o2ZloKbVVsTytLV0EyeVVQSEdOaWlza3paMnM4RUlQR3JkNm96UmFPamZBSE4zR2Y4cXY4UWZYQmkrd0FOMTBKNVU2QQo3L3F4WERnR3BSdEs0ZHc0TFR6Y3F4K1FHdFZLbk83UmNHek03dlJYK0JpNmhHNkgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUlkZW5UcnVzdCBQdWJsaWMgU2VjdG9yIFJvb3QgQ0EgMSBPPUlkZW5UcnVzdAojIFN1YmplY3Q6IENOPUlkZW5UcnVzdCBQdWJsaWMgU2VjdG9yIFJvb3QgQ0EgMSBPPUlkZW5UcnVzdAojIExhYmVsOiAiSWRlblRydXN0IFB1YmxpYyBTZWN0b3IgUm9vdCBDQSAxIgojIFNlcmlhbDogMTMyOTg4MjEwMzQ5NDYzNDIzOTA1MjE5NzYxNTY4NDM5MzM2OTgKIyBNRDUgRmluZ2VycHJpbnQ6IDM3OjA2OmE1OmIwOmZjOjg5OjlkOmJhOmY0OjZiOjhjOjFhOjY0OmNkOmQ1OmJhCiMgU0hBMSBGaW5nZXJwcmludDogYmE6Mjk6NDE6NjA6Nzc6OTg6M2Y6ZjQ6ZjM6ZWY6ZjI6MzE6MDU6M2I6MmU6ZWE6NmQ6NGQ6NDU6ZmQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDMwOmQwOjg5OjVhOjlhOjQ0OjhhOjI2OjIwOjkxOjYzOjU1OjIyOmQxOmY1OjIwOjEwOmI1Ojg2OjdhOmNhOmUxOjJjOjc4OmVmOjk1OjhmOmQ0OmY0OjM4OjlmOjJmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWmpDQ0EwNmdBd0lCQWdJUUNnRkNnQUFBQVVVanowWjhBQUFBQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJOCk1Rc3dDUVlEVlFRR0V3SlZVekVTTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wTVNvd0tBWURWUVFERXlGSlpHVnUKVkhKMWMzUWdVSFZpYkdsaklGTmxZM1J2Y2lCU2IyOTBJRU5CSURFd0hoY05NVFF3TVRFMk1UYzFNek15V2hjTgpNelF3TVRFMk1UYzFNek15V2pCTk1Rc3dDUVlEVlFRR0V3SlZVekVTTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wCk1Tb3dLQVlEVlFRREV5RkpaR1Z1VkhKMWMzUWdVSFZpYkdsaklGTmxZM1J2Y2lCU2IyOTBJRU5CSURFd2dnSWkKTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDMklwVDhwRWl2NkVkckN2c25kdVR5UDRvNwpla29zTVNxTWpiQ3B3ekZycUhkMmhDYTJySUZDRFFqclZWaTdldmk4WlgzeW9HMkxxRWZwWW5ZZUVlNElGTkd5ClJCYjA2dEQ2SGk5ZTI4dHpRYTY4QUxCS0swQ3lyT0U3UzhJdG5lU2htK3dhT2g3d0NMUFE1Q1ExQjUrY3RNbFMKYmRzSHlvKzFXL0NEODAvSExhWElyY3VWSUtReEtGZFlXdVNORzVxcm5nME04Z296T1NJNUNwY3U4MU4zdVVSRgovWVRMTmlDQldTMmFiMjFJU0dIS1ROOVQwYTlTdkVTZnF5OXJnM0x2ZFlEYUJqTWJYY2phWThaTnpheG1NYzNSCjNqNkhFRGJodWFSNjcyQlFzc3ZLcGxiZ042K3JOQk01SmVnNVp1U1llcW9TbUp4WlpvWStyZkd3eWo0R0QzdncKRVVzM29FUnRlOHVvakhIMDFiV1JOc3p3RmNZcjNsRVhzWmRNVUQyeGxWbDhCWDB0SWRVQXZ3Rm5vbDU3cGx6eQo5eUx4a0EyVDI2cEVVV2JNZlhZRDYycW9LamdabDNZTmE0cGgrYnoyN25iOWNDdmRLVHo0Q2g1YlFoeUxWaTlWCkd4eWhMclhIRnViNHFqeVNqbW0yQWNHMWhwMkpEd3M0bEZUbzZ0eWVQU1c4VXlidDFhczVxc1ZBVEZTcnNyVFoKMmZqWGN0c2N2RzI5WlYvdmlEVXFaaS91OXJObDhET05mSmhCYVVZUFF4eHArcHUxMEdGcXpjcEwyVXlRUnFzVgpXYUZIVkNrdWd5aGZITUtpcTNJWEFBYU9SZXlMNGpNOWY5b1pST1JpY3NQZklzYnlWdFRkWDVWeTdXMWY5MGdEClcvM0ZLcUQyY3lPRUVCc0I1d0lEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVNDNIZ250aW5RdG5iY1pGcmxKUHJ3NlBSRktNd0RRWUpLb1pJaHZjTgpBUUVMQlFBRGdnSUJBRWY2M1Fxd0VaRTRyVTFkOStVT2wxUVpna2lIVkl5cVpKbllXdjZJQWNWWXBabXhJMVFqCnQyb2RJRmZsQVdKQkY5TUoyM1hMYmxTUWRmNGFuNEVLd3QzWDl3blFXM0lWNUI0SmFqMHo4eUdhNWhWK3JWSFYKRFJEdGZVTEFqKzdBbWdqVlFkWmNEaUZwYm9CaERoWEF1TS9GU1JKU3pMNDZ6TlF1T0FYZU5mMGZiN2lBYUpnOQpUYURLUUdYU2MzejFpOWtLbFQvWVB5TnRHdEVxSkJuWmhiTVg3M2h1cVZqUkk5UEhFKzF5Slg5ZHNYTncwSDhHCmx3bUVLWUJoSGZwZS8zT3NvT09KdUJ4eEZjYmVNWDhTM09GdG02L242SjkxZUV5clJqdWF6cjhGR0YxTkZUd1cKbWhsUUJKcXltbTlsaTFKZlBGZ0VLQ1hBWm1FeGZybmdkYmthcUlIV2NoZXp4UU14TlJGNGVLTGc2VENNZjREZgpXTjg4dWllVzRvQTBiZU9ZMDJRbnJFaCtLSGRjeGlWaEpmaUZER1g2eERJdnBaZ0Y1UGdMWnhZV3hvSzRNaG41CitibDUzQi9ONjYrckR0MGIyMFhrZXVjQzRwVmQvR253VTJsaGxYVjVDMTVWNWpnY2xLbFpNNTdJY1hSNWYxR0oKdHNocXVERElhampEYnA3aE54YnFCV0pNV3hKSDdhZTBzMWhXeDBuemZ4Sm9DVEZ4OEczNFRrZjcxb1h1eFZoQQpHYVFkcC9sTFF6ZmNhRnBQeit2Q1pIVGV0QlhaOUZSVUdpOGMxNWR4VkpDTzJTQ2RVeXQvcTQvaTZqQzhVRGZ2CjhVZTFmWHdzQk94b25iUkpSQkQwY2tzY1pPZjg1bXVRM1dsOWFmMEFWcVczckxhdHQ4bytBZStjCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiBPPUVudHJ1c3QsIEluYy4gT1U9U2VlIHd3dy5lbnRydXN0Lm5ldC9sZWdhbC10ZXJtcy8oYykgMjAwOSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiBPPUVudHJ1c3QsIEluYy4gT1U9U2VlIHd3dy5lbnRydXN0Lm5ldC9sZWdhbC10ZXJtcy8oYykgMjAwOSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIgojIFNlcmlhbDogMTI0Njk4OTM1MgojIE1ENSBGaW5nZXJwcmludDogNGI6ZTI6Yzk6OTE6OTY6NjU6MGM6ZjQ6MGU6NWE6OTM6OTI6YTA6MGE6ZmU6YjIKIyBTSEExIEZpbmdlcnByaW50OiA4YzpmNDoyNzpmZDo3OTowYzozYTpkMTo2NjowNjo4ZDplODoxZTo1NzplZjpiYjo5MzoyMjo3MjpkNAojIFNIQTI1NiBGaW5nZXJwcmludDogNDM6ZGY6NTc6NzQ6YjA6M2U6N2Y6ZWY6NWY6ZTQ6MGQ6OTM6MWE6N2I6ZWQ6ZjE6YmI6MmU6NmI6NDI6NzM6OGM6NGU6NmQ6Mzg6NDE6MTA6M2Q6M2E6YTc6ZjM6MzkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVQakNDQXlhZ0F3SUJBZ0lFU2xPTUtEQU5CZ2txaGtpRzl3MEJBUXNGQURDQnZqRUxNQWtHQTFVRUJoTUMKVlZNeEZqQVVCZ05WQkFvVERVVnVkSEoxYzNRc0lFbHVZeTR4S0RBbUJnTlZCQXNUSDFObFpTQjNkM2N1Wlc1MApjblZ6ZEM1dVpYUXZiR1ZuWVd3dGRHVnliWE14T1RBM0JnTlZCQXNUTUNoaktTQXlNREE1SUVWdWRISjFjM1FzCklFbHVZeTRnTFNCbWIzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEV5TURBR0ExVUVBeE1wUlc1MGNuVnoKZENCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDMGdSekl3SGhjTk1Ea3dOekEzTVRjeQpOVFUwV2hjTk16QXhNakEzTVRjMU5UVTBXakNCdmpFTE1Ba0dBMVVFQmhNQ1ZWTXhGakFVQmdOVkJBb1REVVZ1CmRISjFjM1FzSUVsdVl5NHhLREFtQmdOVkJBc1RIMU5sWlNCM2QzY3VaVzUwY25WemRDNXVaWFF2YkdWbllXd3QKZEdWeWJYTXhPVEEzQmdOVkJBc1RNQ2hqS1NBeU1EQTVJRVZ1ZEhKMWMzUXNJRWx1WXk0Z0xTQm1iM0lnWVhWMAphRzl5YVhwbFpDQjFjMlVnYjI1c2VURXlNREFHQTFVRUF4TXBSVzUwY25WemRDQlNiMjkwSUVObGNuUnBabWxqCllYUnBiMjRnUVhWMGFHOXlhWFI1SUMwZ1J6SXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUsKQW9JQkFRQzZoTFp5MjU0TWErS1o2VEFCcDNicU1yaVZRUnJKMm1GT1dITFAvdmFDZWI5ellRWUtwU2ZZczEvVApSVTRjY3RaT012SnlpZy8zZ3huUWFvQ0FBRVVlc01mbm1yOFNWeWNjbzJndkNvZTlhbXNPWG1YekhIZlYxSVdOCmNDRzBzekxuaTZMVmhqa0NzYmpTUjg3a3lVbkVPNmZlKzFSOVY3N3c2RzdDZWJJNkMxWGlVSmdXTWhOY0wzaFcKd2NLVXMvSmE1Q2VhbnlUWHh1elFteVdDNDh6Q3hFWEZqSmQ2Qm1zcUVaK3BDbTVJTzIvYjFCRVpRdmVQQjcvMQpVMStjUHZRWExPWnByRTR5VEdKMzZyZm81YnMwdkJtTHJweFI1N2QrdFZPeE15TGxiYzl3UEJyNjRwdG50b1AwCmphV3ZZa3hONEZpc1pEUVNBL2kyalpSakpLUnhBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVAKQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJxY2laNjBCN3ZmZWM3YVZIVWJJMmZrQkptcXpBTgpCZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFlWjhkbHNhMmVUOGlqWWZUaHdNRVlHcHJtaTVaaVhNUnJFUFI5UlAvCmpUa3J3UEs5VDNDTXFTL3FGOFFMVko3VUc1YVlNenlvcldLaUFIYXJXV2x1QmgxK3hMbEVqWml2RXRSaDJ3b1oKUmtmejYvZGp3VUFGUUtYU3QvUzFtamEvcVloMmlBUlZCQ3VjaDM4YU56eCtMYVVhMk5TSlhzcTlyRDFzMkcydgoxZk4yRDgwN2lEZ2luV3lUbXNROXY0SWJaVCttRDEycS9PV3lGY3ExcmNhOFBkQ0U2T29HY3JCTk9USjR2ejRSCm5BdWtuWm9oOC9DYkN6QjQyOEhjaDBQK3ZHT2F5c1hDSE1uSGpmODdFbGdJNXJZOTdIb3NUdnVEbHM0TVBHbUgKVkhPa2M4S1QvMUVRckJWVUFkajhCYkdKb1g5MGc1cEoxOXhPZTRwSWI0dEY5Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBFQzEgTz1FbnRydXN0LCBJbmMuIE9VPVNlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMvKGMpIDIwMTIgRW50cnVzdCwgSW5jLiAtIGZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxIE89RW50cnVzdCwgSW5jLiBPVT1TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zLyhjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxIgojIFNlcmlhbDogNTE1NDMxMjQ0ODE5MzA2NDkxMTQxMTYxMzMzNjkKIyBNRDUgRmluZ2VycHJpbnQ6IGI2OjdlOjFkOmYwOjU4OmM1OjQ5OjZjOjI0OjNiOjNkOmVkOjk4OjE4OmVkOmJjCiMgU0hBMSBGaW5nZXJwcmludDogMjA6ZDg6MDY6NDA6ZGY6OWI6MjU6ZjU6MTI6MjU6M2E6MTE6ZWE6Zjc6NTk6OGE6ZWI6MTQ6YjU6NDcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDAyOmVkOjBlOmIyOjhjOjE0OmRhOjQ1OjE2OjVjOjU2OjY3OjkxOjcwOjBkOjY0OjUxOmQ3OmZiOjU2OmYwOmIyOmFiOjFkOjNiOjhlOmIwOjcwOmU1OjZlOmRmOmY1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDK1RDQ0FvQ2dBd0lCQWdJTkFLYUxlU2tBQUFBQVVOQ1IrVEFLQmdncWhrak9QUVFEQXpDQnZ6RUxNQWtHCkExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVVnVkSEoxYzNRc0lFbHVZeTR4S0RBbUJnTlZCQXNUSDFObFpTQjMKZDNjdVpXNTBjblZ6ZEM1dVpYUXZiR1ZuWVd3dGRHVnliWE14T1RBM0JnTlZCQXNUTUNoaktTQXlNREV5SUVWdQpkSEoxYzNRc0lFbHVZeTRnTFNCbWIzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEV6TURFR0ExVUVBeE1xClJXNTBjblZ6ZENCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDMGdSVU14TUI0WERURXkKTVRJeE9ERTFNalV6TmxvWERUTTNNVEl4T0RFMU5UVXpObG93Z2I4eEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRApWUVFLRXcxRmJuUnlkWE4wTENCSmJtTXVNU2d3SmdZRFZRUUxFeDlUWldVZ2QzZDNMbVZ1ZEhKMWMzUXVibVYwCkwyeGxaMkZzTFhSbGNtMXpNVGt3TndZRFZRUUxFekFvWXlrZ01qQXhNaUJGYm5SeWRYTjBMQ0JKYm1NdUlDMGcKWm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hNekF4QmdOVkJBTVRLa1Z1ZEhKMWMzUWdVbTl2ZENCRApaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNBdElFVkRNVEIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpCkEySUFCSVFUeWRDNmJVRjc0bXpRNjFWZlpnSWFKUFJiaVdsSDQ3akNmZkh5QXNXZm9QWmIxWXNHR1laUFV4QnQKQnlRbm9hRDQxVWNaWVV4OXlwTW42blFNNzIrV0NmNWo3SEJkTnExbmQ2N0puWHhWUkRxaVkxRWY5ZU5pMUtsSApCejdNSUtOQ01FQXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPCkJCWUVGTGRqNXhyZGpla0lwbFdEcE9CcVVFRmxFVUpKTUFvR0NDcUdTTTQ5QkFNREEyY0FNR1FDTUdGNTJPVkMKUjk4Y3JsT1pGN1p2SEgzaHZ4R1UwUU9JZGVTTmlhU0tkMGJlYldIdkF2WDd0ZC9NL2s3Ly9xbm1wd0l3VzVuWApoVGNHdFhzSS9lc25pMHFVK2VINnA0NG1DT2g4a21odGM5aHZKcXdoQXJpWnR5WkJXeVZncnRCSUd1NEcKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNGQ0EgRVYgUk9PVCBPPUNoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUNGQ0EgRVYgUk9PVCBPPUNoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiQ0ZDQSBFViBST09UIgojIFNlcmlhbDogNDA3NTU1Mjg2CiMgTUQ1IEZpbmdlcnByaW50OiA3NDplMTpiNjplZDoyNjo3YTo3YTo0NDozMDozMzo5NDphYjo3YjoyNzo4MTozMAojIFNIQTEgRmluZ2VycHJpbnQ6IGUyOmI4OjI5OjRiOjU1Ojg0OmFiOjZiOjU4OmMyOjkwOjQ2OjZjOmFjOjNmOmI4OjM5OjhmOjg0OjgzCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1YzpjMzpkNzo4ZTo0ZToxZDo1ZTo0NTo1NDo3YTowNDplNjo4NzozZTo2NDpmOTowYzpmOTo1Mzo2ZDoxYzpjYzoyZTpmODowMDpmMzo1NTpjNDpjNTpmZDo3MDpmZAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmpUQ0NBM1dnQXdJQkFnSUVHRXJNMWpBTkJna3Foa2lHOXcwQkFRc0ZBREJXTVFzd0NRWURWUVFHRXdKRApUakV3TUM0R0ExVUVDZ3duUTJocGJtRWdSbWx1WVc1amFXRnNJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5CmFYUjVNUlV3RXdZRFZRUUREQXhEUmtOQklFVldJRkpQVDFRd0hoY05NVEl3T0RBNE1ETXdOekF4V2hjTk1qa3gKTWpNeE1ETXdOekF4V2pCV01Rc3dDUVlEVlFRR0V3SkRUakV3TUM0R0ExVUVDZ3duUTJocGJtRWdSbWx1WVc1agphV0ZzSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUlV3RXdZRFZRUUREQXhEUmtOQklFVldJRkpQClQxUXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFEWFhXdk5FRDhmQlZuVkJVMDMKc1E3c21DdU9GUjM2azBzWGdpRnhFRkxYVVdSd0ZzSlZhVTJPRlcyZnZ3d2J3dUNqWjlZTXJNOGlycTkzVkNwTApUSXBUVW5yRDdpN2VzM0Vsd2VsZFBlNmhMNlAzS2p6Skl4MXFxeDJocC9IejdLRFZSTThWejNJdkhXT1g2Sm41Ci9aT2tWSUJNVXRSU3F5NUozNUROdUYrK1A5Nmh5azBnMUNYb2hDbFR0N0dJSC8vNjJwQ2ZDcWt0UVQreDhSZ3AKN2haWkxEUkpHcWdHMTZpSTBnTnllakxpNm1oTmJpeVdaWHZLV2ZyeTR0M3VNQ3o3ekVhc3hHUHJiMzgyS3pSegpFcFIvMzh3bW52RnlYVkJsV1k5cHM0ZGVNbS9ER0lxMWxZK3dlamZlV2tVN3h6Ymg3MmZST2RPWFczTmlHVWd0Cmh4d0crM1NZSUVsejhBWFNHN0dnbzdjYmNOT0lhYmxhMWpqMFl0d2xpM2kvK09oK3VGekpsVTlmcHkyNUlHdlAKYTkzMURmU0N0L1N5Wmk0UUtQYVhXbnVXRm84QkdTMXNibjg1V0Faa2d3R0RnOE5Oa3QweXhvZWtOK2tXenFvdAphSzhLZ1dVNmNNR2JyVTF0Vk1vcUxVdUZHN09BNW5CRkRXdGVOZkIvTzdpYzVBUndpUklsazlvS21TSmdhbU5nClRuWUdtRTY5ZzYwZFdJb2xoZExIWlI0dGpzYmZ0c2JoZjRvRUlSVXBkUEErbkpDZERDN3hpajVhcWd3SkhzZlYKUEtQdGw4TWVOUG80K1FnTzQ4QmRLNFBSVm1ySnRxaFVVeTU0TW1jOWduOTAwUHZodGdWZ3VYRGJqZ3Y1RTFodgpjV0FRVWhDNXdVRUo3M0lmWnpGNC81WUZqUUlEQVFBQm8yTXdZVEFmQmdOVkhTTUVHREFXZ0JUai9pMzlLTkFMCnRicTJvc1MvQnFvRmpKUDdMekFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWQKQmdOVkhRNEVGZ1FVNC80dC9TalFDN1c2dHFMRXZ3YXFCWXlUK3k4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQgpBQ1hHdW12cmg4dmVnam1XUGZCRXAydUVjd1BlblN0UHVpQi92SGl5ejVld0c1enoxM2t1OVVpMjB2c1hpT2JUCmVqL3RVeFBRNGk5cWVjc0FJeWptSGpkWE5ZbUV3blpQTkRhdFo4UE9RUWFJeGZmdTJCcTQxZ3QvVVArVHFoZEwKak96dFVtQ3lwQWJxVHV2MGF4bjk2L1VhNENVcW10ekhRVGIzeUhRRmhEbVZPZFlMTzZRbitnallYQjc0QkdCUwpFU2dvQS8vdlUyWUFwVW8wRm1aOC9RbWtycDVuR205QkMyc0dFNXVQaG5FRnRDK05pV1l6S1haVW1oSDRKL3F5ClA1SGd6ZzBiOHpBYXJiOGlYUnZUdnlVRlRlR1NHbitabnp4RWs4clVRRWxzZ0lmWEJEckRNbEkxRGxiNHBkMTkKeElzTkVSOVR5eDZ5Rjdab2QxcmcxTXZJQjY3MU9pNk9ON2ZRQVV0REtYZU1PWmVQZ2xyNFVlV0pvQmpuYUg5ZApDaTc3bzBjT1BhWWplc1lCeDQvSVhyOXRnRmEraWlTNk0rcWY0VElSbnZIU1Q0RDJHMEN2T0o0UlVIbHpFaExOCjVteWRMSWh5UERDQkJwRWk2bG10MmhrdUlzS051WXlINEdhOGN5TmZJV1JqZ0VqMW9Ed1lQWlRJU0VFZFFMcGUKL3Y1V09hSEl6MTZlR1dSR0VOb1hrYmNGZ0t5TG1aSjk1NkxZQndzMkorZEllV0NLdzljVFhQaHlRTjlLeTgrWgpBQW9BQ3hHVjJsWkZBNGdLbjJmUTFYbXhxSTFBYlEzQ2VrRDY4MTlrUjVMTFU3bTdXYzVQL2RBVlV3SFkzK3ZaCjVuYnYwQ083TzZsNXM5VUNLYzJKbzVZUFNqWG5Ua0xBZGMwSHorWXM2M3N1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UXHhkY1JLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhXHUwMTFmbGF5XHUwMTMxY1x1MDEzMXNcdTAxMzEgSDUgTz1UXHhkY1JLVFJVU1QgQmlsZ2kgXHUwMTMwbGV0aVx1MDE1ZmltIHZlIEJpbGlcdTAxNWZpbSBHXHhmY3ZlbmxpXHUwMTFmaSBIaXptZXRsZXJpIEEuXHUwMTVlLgojIFN1YmplY3Q6IENOPVRceGRjUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2FcdTAxMWZsYXlcdTAxMzFjXHUwMTMxc1x1MDEzMSBINSBPPVRceGRjUktUUlVTVCBCaWxnaSBcdTAxMzBsZXRpXHUwMTVmaW0gdmUgQmlsaVx1MDE1ZmltIEdceGZjdmVubGlcdTAxMWZpIEhpem1ldGxlcmkgQS5cdTAxNWUuCiMgTGFiZWw6ICJUXHhkY1JLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhXHUwMTFmbGF5XHUwMTMxY1x1MDEzMXNcdTAxMzEgSDUiCiMgU2VyaWFsOiAxNTYyMzM2OTkxNzI0ODEKIyBNRDUgRmluZ2VycHJpbnQ6IGRhOjcwOjhlOmYwOjIyOmRmOjkzOjI2OmY2OjVmOjlmOmQzOjE1OjA2OjUyOjRlCiMgU0hBMSBGaW5nZXJwcmludDogYzQ6MTg6ZjY6NGQ6NDY6ZDE6ZGY6MDA6M2Q6Mjc6MzA6MTM6NzI6NDM6YTk6MTI6MTE6YzY6NzU6ZmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQ5OjM1OjFiOjkwOjM0OjQ0OmMxOjg1OmNjOmRjOjVjOjY5OjNkOjI0OmQ4OjU1OjVjOmIyOjA4OmQ2OmE4OjE0OjEzOjA3OjY5OjlmOjRhOmYwOjYzOjE5OjlkOjc4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFSnpDQ0F3K2dBd0lCQWdJSEFJNFgvaVFnZ1RBTkJna3Foa2lHOXcwQkFRc0ZBRENCc1RFTE1Ba0dBMVVFCkJoTUNWRkl4RHpBTkJnTlZCQWNNQmtGdWEyRnlZVEZOTUVzR0ExVUVDZ3hFVk1PY1VrdFVVbFZUVkNCQ2FXeG4KYVNERXNHeGxkR25GbjJsdElIWmxJRUpwYkduRm4ybHRJRWZEdkhabGJteHB4SjlwSUVocGVtMWxkR3hsY21rZwpRUzdGbmk0eFFqQkFCZ05WQkFNTU9WVERuRkpMVkZKVlUxUWdSV3hsYTNSeWIyNXBheUJUWlhKMGFXWnBhMkVnClNHbDZiV1YwSUZOaHhKOXNZWG5Fc1dQRXNYUEVzU0JJTlRBZUZ3MHhNekEwTXpBd09EQTNNREZhRncweU16QTAKTWpnd09EQTNNREZhTUlHeE1Rc3dDUVlEVlFRR0V3SlVVakVQTUEwR0ExVUVCd3dHUVc1cllYSmhNVTB3U3dZRApWUVFLREVSVXc1eFNTMVJTVlZOVUlFSnBiR2RwSU1Td2JHVjBhY1dmYVcwZ2RtVWdRbWxzYWNXZmFXMGdSOE84CmRtVnViR25FbjJrZ1NHbDZiV1YwYkdWeWFTQkJMc1dlTGpGQ01FQUdBMVVFQXd3NVZNT2NVa3RVVWxWVFZDQkYKYkdWcmRISnZibWxySUZObGNuUnBabWxyWVNCSWFYcHRaWFFnVTJIRW4yeGhlY1N4WThTeGM4U3hJRWcxTUlJQgpJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBcENVWjRXV2U2MGdoVUVvSTVSSHdXcm9tCi80Tlp6a1FxTC83aHptQUQvSTBEcGUzL2E2aTZ6RFFHbjFrMTl1d3N1NTM3alZKcDQ1d25FRlB6cEFMRnAva1IKR21sMWJzTWRpOUdZalpPSHAzR1hEU0hIbWZsUzB5eGpYVlc4NkI4QlNMbGcva0pLOXNpQXJzMW1lcDVGaW1oMwo0a2hvbjZMYThlSEJFSi9yUENtQnArRXlDTlNnQmJHTSs0MldBQTQrSmQ5VGhpSTcvUFM5OHdsK2QreUc2dzh6CjVVTlA5RlIxYlNtWkxtWmFROS9MWE1ySTVUanhmanMxblEvMHhWcWh6UE1nZ0NUVFYrd1Z1blVsbStoa1M3TTAKaE84RXVQYkpiS29DUHJaVjRqSTNYL3htbDEvTjFwN0hJTDlOeHF3L2RWOGM3VEtjZkdrQWFaSGpJeGhUNlFJRApBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVWcGtISHRPc0RHbGt0QXhRUjk1RExMNGd3UHN3RGdZRFZSMFBBUUgvCkJBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUo1RmRuc1gKU0RMeU9Jc3B2ZTZXU2s2QkdMRlJSeUROMEdTeERzblpBZGtKenNpWjNHZ2xFOVJjOHFQb0JQNXlDY2NMcWgwbApWWDZXbWxlM3VzVVJlaG5tcDM0OWhRNzErUzRwTCtmNWJGZ1dWMUFsOWo0dVBxcnRkM0dxcXBtV1JncXVqdXdxClVSYXdYczNxWndRY1dERDFZSXE5cHIxTjVaYTAvRUtKQVd2MmNNaFFPUXd0MVdiWnlOS3pNcmNiR1czTE0vbmYKcGVZVmhEZnd3dkpsbHBLUWQvQ3Q5SkRwRVhqWGs0bkFQUXU2S2ZUb21aMXlqdTJkTCs2U2ZhSHgvMTI2TTJDRgpZdjRIQXFHRVZrYStsZ3FhRTljaFRMZDhCNTlPVGorUmRQc25uUkhNM2VheHluRk5FeGM1SnNVcElTdVRLV3FXCitxdEI0VXUyTlF2QW14VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnRpbm9taXMgLSBSb290IENBIE89Q2VydGlub21pcyBPVT0wMDAyIDQzMzk5ODkwMwojIFN1YmplY3Q6IENOPUNlcnRpbm9taXMgLSBSb290IENBIE89Q2VydGlub21pcyBPVT0wMDAyIDQzMzk5ODkwMwojIExhYmVsOiAiQ2VydGlub21pcyAtIFJvb3QgQ0EiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiAxNDowYTpmZDo4ZDphODoyODpiNTozODo2OTpkYjo1Njo3ZTo2MToyMjowMzozZgojIFNIQTEgRmluZ2VycHJpbnQ6IDlkOjcwOmJiOjAxOmE1OmE0OmEwOjE4OjExOjJlOmY3OjFjOjAxOmI5OjMyOmM1OjM0OmU3Ojg4OmE4CiMgU0hBMjU2IEZpbmdlcnByaW50OiAyYTo5OTpmNTpiYzoxMTo3NDpiNzozYzpiYjoxZDo2MjowODo4NDplMDoxYzozNDplNToxYzpjYjozOTo3ODpkYToxMjo1ZjowZTozMzoyNjo4ODo4MzpiZjo0MTo1OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmtqQ0NBM3FnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQmFNUXN3Q1FZRFZRUUdFd0pHVWpFVApNQkVHQTFVRUNoTUtRMlZ5ZEdsdWIyMXBjekVYTUJVR0ExVUVDeE1PTURBd01pQTBNek01T1RnNU1ETXhIVEFiCkJnTlZCQU1URkVObGNuUnBibTl0YVhNZ0xTQlNiMjkwSUVOQk1CNFhEVEV6TVRBeU1UQTVNVGN4T0ZvWERUTXoKTVRBeU1UQTVNVGN4T0Zvd1dqRUxNQWtHQTFVRUJoTUNSbEl4RXpBUkJnTlZCQW9UQ2tObGNuUnBibTl0YVhNeApGekFWQmdOVkJBc1REakF3TURJZ05ETXpPVGs0T1RBek1SMHdHd1lEVlFRREV4UkRaWEowYVc1dmJXbHpJQzBnClVtOXZkQ0JEUVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTlRNQ1Fvc1A1TDIKZnhTZUM1eWFhaDFBTUdUOXF0OE9IZ1pibjFDRjZzMk5xME5uM3JENmZvQ1dub1I0a2tqVzR6bnV6dVJaV0pmbApMaWVZNnBPb2Q1dEs4TzkwZ0Mzck1CKzEyY2VBbkdJbmtZandTb25kM0lqbUZQblZBeS8vbGR1OW4rd3MraFFWCldaVUt4a2Q4YVJpNXB3UDV5bmFwejhkdnRGNEYvdTdCVXJKMU1vZnM3U2xtTy9OS0ZvTDIxcHJiY3BqcDN2REYKVEtXcnRlb0I0b3d1Wkg5a2IvMmpKWk9MeUtJT1NZMDA4Qi9zV0VVdU5LcUVVTDNuc2tvVHVMQVByamhkc0trYgo1blBKV3FIWlprQ3FxVTJtTkFLdGhINnlJOEg3S3NabjlEUzJzSlZxTTA5eFJMV3R3SGt6aU9DLzdhT2dGTFNjCkNiQUs0MkMrK1BobWlNMWI4WGNGNExWemJzRjlSaTZPU3llbXpUVUsvZVZOZmFvcW95bkhXbWdFNk9YV2s2UmkKd3NYbTlFL0crWjhhallKSkdZcktXVU02NkEweXdmUk1Fd052YnFZL2tYUEx5bk52RWlDTDdzQ0NlTjVMTHNKSgp3eDN0RnZZazlDY2JYRmN4M0ZYdXFCNXZiS3ppUmN4WFY0cDFWeG5ndFZpWlNUWXhQRE1CYlJaS3piZ3FnNFNHCm0vbGcwaDl0a1FQVFlLYlZQWnJkZDVBOU5hU2ZEMTcxVWtScHVjQzYzTTk5MzN6WnhLeUdJaks4ZTJ1UjczcjQKRjJpdzRsTlZZQzJ2UHNLRDJOa0pLL0RBWk51SGk1SE1rZXNFL1hhMGxacm1GQVliMVRRZHZ0ai9kQnhUaFpuZwpXVkpLWWUySW5tdEppVVorSUZyWjUwcmxhdTdTWlJGREFnTUJBQUdqWXpCaE1BNEdBMVVkRHdFQi93UUVBd0lCCkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCVHZrVXoxcGNNdzZDOEk2dE54SXFTU2FIaDAKMlRBZkJnTlZIU01FR0RBV2dCVHZrVXoxcGNNdzZDOEk2dE54SXFTU2FIaDAyVEFOQmdrcWhraUc5dzBCQVFzRgpBQU9DQWdFQWZqMVUyaUpkR2xnK08xUW51cnJNeU9NYWF1bysrUkxyVmw4OVVNN2c2a2dtSnM5NVZuNlJISmsvCjBLR1JIQ3dQVDVpVldWTzkwQ0xZaUYyY04vejdaTUY0akl1YVlBbnExZm9oWDlCMFplZFF4Yjh1dVFzTHJiV3cKRjZZU2pOUmllT3BXYXV3SzBrRERQQVV3UGsyVXQ1OUtBOU45SjB1Mi9rVE8raGt6R20ya1F0SGR6TWpJMXhaUwpnMDgxbExNU1ZYM2w0a0xyNUp5VENjQk1Xd2VyeDIwUm9GQVhsQ09vdFFxU0Q3SjZ3V0FzT013YXBsdi84Z3pqCnFoOGMzTGlna3lmZVkrTi9JWjg2NVo3NjRCTnFkZXVXWEdLUmxJNW5VN2FKK0JJSnkyOVNXd055aGxDVkNOU04KaDRZVkg1VWsyS1J2bXM2a25adHQwckoyQm9iR1ZnakY2d25hTnNJYlcwRytZU3JqY09hNHB2aTJXc1M5SWZmLwpxbCtoYkhZNVp0YnFURlhoQURPYkU1aGp5Vy9RQVNBSk4xTG5ERTgremJ6MVg1WW5weUFDbGVBdTZBZEJCUjhWCmJ0YXc1Qm5nRHdLVEFDZHl4WXZSVkI5ZFNzTkFsMzVWcG56Qk13UVVBUjFKSUdrTEdaT2RibGdpOTBBTVJnd2oKWS9NNTBuOTJVYWYweUtIeERIWWlJMFpTS1MzaW8wRUhWbW1ZMGdVSnZHbkhXbUhOajRGZ0ZVMkEzWkRpZmNSUQo4b3c3YmtySHh1YUFLenlCdkJHQUZoQW4xL0ROUDNuTWN5ckRmbE9SMW03NDlmUEgwRkZOamt1bFcrWVpGenZXCmdRbmNJdHp1anJuRWoxUGhaN3N6dUlnVlJzL3RhVFgvZFExRzg4NXg0Y1ZyaGtJR3VVRT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0IgQ0EgTz1XSVNlS2V5IE9VPU9JU1RFIEZvdW5kYXRpb24gRW5kb3JzZWQKIyBTdWJqZWN0OiBDTj1PSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdCIENBIE89V0lTZUtleSBPVT1PSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkCiMgTGFiZWw6ICJPSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdCIENBIgojIFNlcmlhbDogMTU3NzY4NTk1NjE2NTg4NDE0NDIyMTU5Mjc4OTY2NzUwNzU3NTY4CiMgTUQ1IEZpbmdlcnByaW50OiBhNDplYjpiOTo2MToyODoyZTpiNzoyZjo5ODpiMDozNToyNjo5MDo5OTo1MToxZAojIFNIQTEgRmluZ2VycHJpbnQ6IDBmOmY5OjQwOjc2OjE4OmQzOmQ3OjZhOjRiOjk4OmYwOmE4OjM1OjllOjBjOmZkOjI3OmFjOmNjOmVkCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2Yjo5YzowODplODo2ZTpiMDpmNzo2NzpjZjphZDo2NTpjZDo5ODpiNjoyMTo0OTplNTo0OTo0YTo2NzpmNTo4NDo1ZTo3YjpkMTplZDowMTo5ZjoyNzpiODo2YjpkNgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHRUQ0NBcDJnQXdJQkFnSVFkckVnVW5Ud2hZZEdzL2dqR3ZiQ3dEQU5CZ2txaGtpRzl3MEJBUXNGQURCdApNUXN3Q1FZRFZRUUdFd0pEU0RFUU1BNEdBMVVFQ2hNSFYwbFRaVXRsZVRFaU1DQUdBMVVFQ3hNWlQwbFRWRVVnClJtOTFibVJoZEdsdmJpQkZibVJ2Y25ObFpERW9NQ1lHQTFVRUF4TWZUMGxUVkVVZ1YwbFRaVXRsZVNCSGJHOWkKWVd3Z1VtOXZkQ0JIUWlCRFFUQWVGdzB4TkRFeU1ERXhOVEF3TXpKYUZ3MHpPVEV5TURFeE5URXdNekZhTUcweApDekFKQmdOVkJBWVRBa05JTVJBd0RnWURWUVFLRXdkWFNWTmxTMlY1TVNJd0lBWURWUVFMRXhsUFNWTlVSU0JHCmIzVnVaR0YwYVc5dUlFVnVaRzl5YzJWa01TZ3dKZ1lEVlFRREV4OVBTVk5VUlNCWFNWTmxTMlY1SUVkc2IySmgKYkNCU2IyOTBJRWRDSUVOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMkJlMwpIRW9rS3RhWHNjcmlIdnQ5T08rWTliSTVtRTRudUJGZGU5SWxsSWlDRlNacUd6RzdxRnNoSVN2WUQwNmZXdkd4Cld1UjUxaklqSytGVHpKbEZYSHRQcmJ5L2gwb0xTNWRhcVBaSTdIMTdEYzBoQnQrZUZmMUJpa2kzSVBTaGVodFgKMUYxUS83cG4yQ09aSDhnLzQ5Ny9iMXQzc1d0dXVNbGs5K0hLUVVZT0tYSFF1U1A4eVlGZlR2ZHYzNytFclhOawp1N2RDam1uMjFIWWRmcDJudUZlS1VXZHkxOVNvdUpWVVFITUQ5dXIwNi80b1FuYy9uU01ic3JZOWdCUUhUQzVQCjk5VUtGZzI5WmtNM2ZpTkRlY05BaHZWTUtkcU9tcTBOcFFTSGlCNkY0K2xUMVp2SWl3TmplT3ZnR1VwdXV5OXIKTTJSWWs2MXB2NDhiNzRKSXh3SURBUUFCbzFFd1R6QUxCZ05WSFE4RUJBTUNBWVl3RHdZRFZSMFRBUUgvQkFVdwpBd0VCL3pBZEJnTlZIUTRFRmdRVU5RL0lObU5lNHFQcytUdG1GYzVSVXVPUm1qMHdFQVlKS3dZQkJBR0NOeFVCCkJBTUNBUUF3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUVCTSs0ZXltWUdRZnAzRnNMQW16WWg3S3pLTmJyZ2gKY1ZpWGZhNDNGSzgrNS9lYTRuMzJjWmlaQktwRGRIaWo0MGxoUG5PTVRaVGcrWEhFdGhZT1UzZ2YxcUtITHdJNQpnU2s4cnhXWUlURCtLSkFBak5IaHkvcGV5UDM0RUVZN29uaENrUmQwVlFyZVVHZE5adEduLy8zWndMV29vNHJPClp2VVBRODJuSzFkN1kwWnFxaTVTMlBUdDRXMnRLWkI0U0xyaEk2cWppZXkxcTViQXRFdWlIWmVlZXZKdVFISGYKYVBGbFRjNThCZDlUWmFtbDhMR1hCSEFWUmdPWTFOSy9WTFNnV0gxU2I5cFdKbUxVMk51Sk1XOGM4Q0xDMDJJYwpOYzFNYVJWVUdwQ1kzdXNlWDhwM3g4dU9QVU5wbkpwWTBDUTczeHRBbG40MXJZSEhUbkc2aUJNPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U1pBRklSIFJPT1QgQ0EyIE89S3Jham93YSBJemJhIFJvemxpY3plbmlvd2EgUy5BLgojIFN1YmplY3Q6IENOPVNaQUZJUiBST09UIENBMiBPPUtyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4KIyBMYWJlbDogIlNaQUZJUiBST09UIENBMiIKIyBTZXJpYWw6IDM1NzA0MzAzNDc2NzE4NjkxNDIxNzI3NzM0NDU4NzM4Njc0MzM3NzU1ODI5NjI5MgojIE1ENSBGaW5nZXJwcmludDogMTE6NjQ6YzE6ODk6YjA6MjQ6YjE6OGM6YjE6MDc6N2U6ODk6OWU6NTE6OWU6OTkKIyBTSEExIEZpbmdlcnByaW50OiBlMjo1MjpmYTo5NTozZjplZDpkYjoyNDo2MDpiZDo2ZToyODpmMzo5YzpjYzpjZjo1ZTpiMzozZjpkZQojIFNIQTI1NiBGaW5nZXJwcmludDogYTE6MzM6OWQ6MzM6Mjg6MWE6MGI6NTY6ZTU6NTc6ZDM6ZDM6MmI6MWM6ZTc6Zjk6MzY6N2U6YjA6OTQ6YmQ6NWY6YTc6MmE6N2U6NTA6MDQ6Yzg6ZGU6ZDc6Y2E6ZmUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURjakNDQWxxZ0F3SUJBZ0lVUG9wZEIreFYwakxWdCtPMlh3SHJMZHprMXVRd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1VURUxNQWtHQTFVRUJoTUNVRXd4S0RBbUJnTlZCQW9NSDB0eVlXcHZkMkVnU1hwaVlTQlNiM3BzYVdONgpaVzVwYjNkaElGTXVRUzR4R0RBV0JnTlZCQU1NRDFOYVFVWkpVaUJTVDA5VUlFTkJNakFlRncweE5URXdNVGt3Ck56UXpNekJhRncwek5URXdNVGt3TnpRek16QmFNRkV4Q3pBSkJnTlZCQVlUQWxCTU1TZ3dKZ1lEVlFRS0RCOUwKY21GcWIzZGhJRWw2WW1FZ1VtOTZiR2xqZW1WdWFXOTNZU0JUTGtFdU1SZ3dGZ1lEVlFRRERBOVRXa0ZHU1ZJZwpVazlQVkNCRFFUSXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDM3ZENVFxRXZOClFMWE9ZZWVXeXJTaDJnd2lzUHExZTNZQWQ0d0x6MzJvaHN3bVVlUWdQWVVNMWxqajUvUXFHSjNhMGE0bTd1dFQKM1BTUTFoTktESkE4dy9UYTBvNE5ranJjc2JIL09ON0R1aTFmZ0xrQ3ZVcWRHdyswdzhMQlp3UGQzQnVjUGJPdwozZ0FlcURSSHU1cnIvZ3NVdlRhRTJnMGd2L3BieTZrV0lLMDVZTzR2ZGJibmw1ejVQdjErVFc5TkwrK0lEV3I2CjNmRTliaUNsb0JLMFRYQzV6dGR5TzRtVHA0Q0VIQ2RKY2ttMS96dVZuc0hNeUFIczZBNktDcGJuczZhSDVkYjUKQlNzTmwwQndQTHFzZFZxYzFVMmRBZ3JTUzV0bVMwWUhGMld0bjJ5SUFOd2lpZURoWk5SbnZERjVZVHk3eWtITgpYR29BeUR3NGpsaXZBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFECkFnRUdNQjBHQTFVZERnUVdCQlF1RnFsS0dMWEx6UFZ2VVBNalgvaGQ1Nnp3eURBTkJna3Foa2lHOXcwQkFRc0YKQUFPQ0FRRUF0WFA0QTl4Wld4MTI2YU1xZTVBb3NrM0FNMCtxbXJIVXVPUW4vNm1XbWM1RzRHMThUS0k0cEFadwo4UFJCRWV3L1I0MC9jb2Y1Ty8ya2J5dFRBT0QvT2JscUJ3N3JIUnoyb25LUXk0STlFWUtMMHJ1ZktxOGg1bU9HCm5Ya1o3L2U3RERXUXc0cnRUdy8xekJMWnBENjdvUHdnbFY5UEppOFJJNE5PZFFjUHY1dlJ0QjNwRUFUK3ltQ1AKb2t5NHJjL2hrQS9OcmdySFhYdTNVTkxVWWZyVkZkdlhuNGRSVk91bDQrdkpoYUFsSURmN2pzNE1OSVRoUElHeQpkMDVEcFloZmhtZWhQZWEwWEdHMlB0dit0eWpGb2dldXRjcktqU29TNzVmdHdqQ2t5U3A2Ky9OTkl4dVpNelNnCkx2V3BDei9VWGVIUGhKL2lHY0pmaXRZZ0h1Tnp0dz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIDIgTz1Vbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuIE9VPUNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgMiBPPVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4gT1U9Q2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIDIiCiMgU2VyaWFsOiA0NDk3OTkwMDAxNzIwNDM4MzA5OTQ2Mzc2NDM1NzUxMjU5Njk2OQojIE1ENSBGaW5nZXJwcmludDogNmQ6NDY6OWU6ZDk6MjU6NmQ6MDg6MjM6NWI6NWU6NzQ6N2Q6MWU6Mjc6ZGI6ZjIKIyBTSEExIEZpbmdlcnByaW50OiBkMzpkZDo0ODozZToyYjpiZjo0YzowNTplODphZjoxMDpmNTpmYTo3NjoyNjpjZjpkMzpkYzozMDo5MgojIFNIQTI1NiBGaW5nZXJwcmludDogYjY6NzY6ZjI6ZWQ6ZGE6ZTg6Nzc6NWM6ZDM6NmM6YjA6ZjY6M2M6ZDE6ZDQ6NjA6Mzk6NjE6ZjQ6OWU6NjI6NjU6YmE6MDE6M2E6MmY6MDM6MDc6YjY6ZDA6Yjg6MDQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYwakNDQTdxZ0F3SUJBZ0lRSWRiUVNrOGxEOGt5Ti95cVhoS042VEFOQmdrcWhraUc5dzBCQVEwRkFEQ0IKZ0RFTE1Ba0dBMVVFQmhNQ1VFd3hJakFnQmdOVkJBb1RHVlZ1YVhwbGRHOGdWR1ZqYUc1dmJHOW5hV1Z6SUZNdQpRUzR4SnpBbEJnTlZCQXNUSGtObGNuUjFiU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVURWtNQ0lHCkExVUVBeE1iUTJWeWRIVnRJRlJ5ZFhOMFpXUWdUbVYwZDI5eWF5QkRRU0F5TUNJWUR6SXdNVEV4TURBMk1EZ3oKT1RVMldoZ1BNakEwTmpFd01EWXdPRE01TlRaYU1JR0FNUXN3Q1FZRFZRUUdFd0pRVERFaU1DQUdBMVVFQ2hNWgpWVzVwZW1WMGJ5QlVaV05vYm05c2IyZHBaWE1nVXk1QkxqRW5NQ1VHQTFVRUN4TWVRMlZ5ZEhWdElFTmxjblJwClptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TUXdJZ1lEVlFRREV4dERaWEowZFcwZ1ZISjFjM1JsWkNCT1pYUjMKYjNKcklFTkJJREl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQzkrWGo0NXRXQQpER1NkaGh1V1pHYy9Jam9lZFFGOTcvdGNaNHpKekZ4cnFaSG11VUxsSUV1YjJwdDd1WmxkMlp1QVM5ZUVRQ3NuCjAraTZNTHMrQ1JxblNaWHZLMEFrd3BmSHArNmJKZStvQ2dDWGhWcXFuZHdweWVJMUIrdHdUVXJXd2JOV3VLRkIKT0p2Uit6Ri9qK0JmNGJFL0Q0NFdTV0RYQm8wWSthb21FS3NxMDlEUlo0MGJScjVITU5VdWN0SEZZOXJuWTNsRQpma3RqSkltR0xqUS9LVXhTaXlxbndPS1JLSW01d0Z2NUhkbm5KNjMvbWdLWHdjWlFrcHNDTEwycHVUUlpDcitFClN2L2Yvck9mNjltZTRKZ2o3S1pyZHhZcTI4eXRPeHlraDl4R2MxNFpZbWhGVitTUWdrSzdRdGJ3WWVEQm96MW0KbzEzMEdPNkl5WTBYUlNtWk1uVUNNZTRwSnNockF1YTFZa1YvTnhWYUkyaUoxRDdlVGlldzhFQU12RTBYeTAyaQpzeDdRQmxyZDlwUFBWM1daOWZxR0dtZDRzNytXL2pUY3ZlZFNWdVd6NVhWNzEwR1JCZHhkYWVPVkRVTzUvSU9XCk9aVjdiSUJhVHhOeXh0ZDlLWHBFdWxLa0t0VkJSZ2tnL2lLZ3Rsc3dqYnlKRE5YWGNQaUhVdjNhNzZ4UkxnZXoKVHY3UUNkcHc3NWo2VnVadDI3VlhTOXpsTENVVnlKNHVlRTc0MnB5ZWhpektWL01hNWNpU2l4cUNsbnJEdkZBUwphZGdPV2thTE91c20raVBKdHJDQnZrSUFwUGpXL2pBdXg5Skc5dVdPZGYzeXpMblFoMXZNQmhCZ3U0TTF0MTVuCjNrZnNtVWp4cEtFVi9xMk1ZbzQ1VlU4NUZybXhZNTMvdHdJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQUQKQVFIL01CMEdBMVVkRGdRV0JCUzJvVlE1QXNPZ1A0Nkt2UHJVK0J5bTBUb08vVEFPQmdOVkhROEJBZjhFQkFNQwpBUVl3RFFZSktvWklodmNOQVFFTkJRQURnZ0lCQUhHbERzN2s2YjgvT05XSldzUUNZZnRNeFJRWExZdFBVMnNRCkYveGxoTWNRU1pEZTI4Y21rNGdtYjNEV0FsNDVvUGVQcTVhMXBSTmNnUlJ0RG9HQ0VSdUtUc1pQcGQxaUhrVGYKQ1ZuMFczY0xOK21MSU1iNENrNHVXQnpyTTlEUGhtREoydnVBTDU1TVlJUjRQU0ZrMXZ0Qkh4Z1A1OGwxY2IyOQpYTjQwaHo1QnNBNzJ1ZFkvQ1JPV0ZDL2VtaDFhdVZiT05UcXdYM0JOWHVNcDhTTW9jbG0ycThLTVppWWNkeXdtCmRqV0xLS2Rwb1BrNzlTUGRoUkIweVpBRFZwSG5yN3BIMUJLWEVTTGpva21VYk9lM2xFdTZMYVRhTTR0TXBrVC8KV2p6R0hXVFl0VEhrcGp4NnFGY0wyKzFoR3N2eHpuTjNZNlNIYjB4Uk9OYmtYOGVmdG9FcTVJVkllVmhlTy9qYgpBb0pud1RuYnczUkxQVFllK1NtVGlHaGJxRVFaSWZDbjZJRU5MT2lUTnJRM3NzcXdHeVo2bWlVZm1wcUFua3NxClAvdWptdjV6TW5IQ25zWnk0WXBvSi9Ia0Q3VEVUS1Zoay9pWEVBY3FNQ1dwdWNoeHVPOW96QzErOWVCK0Q0S28KYjdhNmJJTkRkODJLa2hlaG5sdDRGajFGNGpOeTNlRm15cG5UeWNVbS9RMW9CRWF1dHRtYmpMNFp2ckhHOGhuagpYQUxLTE5odlNnZlp5VFhhUUhYeXhLY1piNTVDRUpoMTVwV0xZTHp0eFJMWGlzN1ZtRnhXbGdQRjduY0dOZi9QCjVPNC9FMkh1MjlvdGhmRE5ycDJ5R0FsRnc1S2hjaGY4UjdhZ0N5enh4TjVEYUFocVh6dndkbVA3ekFZc3BzYmkKRHJXNXZpU1AKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUgTz1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUgTz1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eQojIExhYmVsOiAiSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxNSIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IGNhOmZmOmUyOmRiOjAzOmQ5OmNiOjRiOmU5OjBmOmFkOjg0OmZkOjdiOjE4OmNlCiMgU0hBMSBGaW5nZXJwcmludDogMDE6MGM6MDY6OTU6YTY6OTg6MTk6MTQ6ZmY6YmY6NWY6YzY6YjA6YjY6OTU6ZWE6Mjk6ZTk6MTI6YTYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGEwOjQwOjkyOjlhOjAyOmNlOjUzOmI0OmFjOmY0OmYyOmZmOmM2Ojk4OjFjOmU0OjQ5OjZmOjc1OjVlOjZkOjQ1OmZlOjBiOjJhOjY5OjJiOmNkOjUyOjUyOjNmOjM2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHQ3pDQ0EvT2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQnBqRUxNQWtHQTFVRUJoTUNSMUl4CkR6QU5CZ05WQkFjVEJrRjBhR1Z1Y3pGRU1FSUdBMVVFQ2hNN1NHVnNiR1Z1YVdNZ1FXTmhaR1Z0YVdNZ1lXNWsKSUZKbGMyVmhjbU5vSUVsdWMzUnBkSFYwYVc5dWN5QkRaWEowTGlCQmRYUm9iM0pwZEhreFFEQStCZ05WQkFNVApOMGhsYkd4bGJtbGpJRUZqWVdSbGJXbGpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxZEdsdmJuTWdVbTl2CmRFTkJJREl3TVRVd0hoY05NVFV3TnpBM01UQXhNVEl4V2hjTk5EQXdOak13TVRBeE1USXhXakNCcGpFTE1Ba0cKQTFVRUJoTUNSMUl4RHpBTkJnTlZCQWNUQmtGMGFHVnVjekZFTUVJR0ExVUVDaE03U0dWc2JHVnVhV01nUVdOaApaR1Z0YVdNZ1lXNWtJRkpsYzJWaGNtTm9JRWx1YzNScGRIVjBhVzl1Y3lCRFpYSjBMaUJCZFhSb2IzSnBkSGt4ClFEQStCZ05WQkFNVE4waGxiR3hsYm1saklFRmpZV1JsYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjEKZEdsdmJuTWdVbTl2ZEVOQklESXdNVFV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQwpBUURDK0trL0c0bjhQRHdFWFQyUU5yQ1JPbms4WmxydmJUa0JTUnEwdDg5L1RTTlR0NUFBNHhNcUtLWXg4WkVBCjR5anNyaUZCemgvYS9YMFNXd0dERDdtd1g1bmg4aEtEZ0UwR1B0K3NyK2VoaUdzeHIvQ0wwQmd6dU50RmFqVDAKQW9Ba0tBb0NGWlZlZGlvTm1Ub1VXL2JMeTFPOEUwMEJpRGVVSlJ0Q3ZDTFlqcU9XWGpyWk10cys2UEFRWmUxMAo0UytuZks4bk5Mc3BmWnUyenduSTVkTUsvSWhsWlhRSzNITWNYTTFBc1J6VXRvU01URkRQYUk2b1dhN0NKMDZDCm9qWGRGUFFmLzdKMzFZY3ZxbTU5SkNmbnhzc201dVgrWndkajJFVU4zVHBaWlRsWWVwS1pjajJjaEY2SUlialYKOUN6ODJYQlNUM2k0dlR3cmk1V1k5YlBSYU04Z0ZINU1YRi9uaStYMU5ZRVpOOWNSQ0xkbXZ0Tkt6b05YQURyRApnZmdYeTVJMlhkR2oySFViNFlzbjZucElRZjFGR1FhdEo1bE93WEJIM2JXZmdWTVM1YkdNU0YweFF4ZmpqTVo2Clk1WkxLVEJPaEU1aUdWNDh6cGVRcFg4QjY1M2crSXVKM1NXWVBaSzJmdS9aOFZGUmZTMG15R2xaWWVDc2FyZ3EKTmhFRWVsQzlNb1MrTDl4eTFkY2RGa2ZrUjJZZ1AvU1d4YStPQVhxbEQzcGs5UTBZaDltdWlOWDZoTUU2d0drbwpMZklOYUZHcTQ2VjN4cVNRRHFFM2l6RWpSOEVKQ090dTkzaWIxNEw4aENDWlNSbTJFa2F4KzBWVkZxbWpaYXljCkJ3L3FhOXdmTGdaeTdJYUlFdVF0MjE4RkwrVHdBOU1tTStlQXdzMUNvUmMwQ3dJREFRQUJvMEl3UURBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVWNSVm55TWpKdlhWZApjdEE0R0dxZDgzRWtWQXN3RFFZSktvWklodmNOQVFFTEJRQURnZ0lCQUhXN2JWUkxxaEJZUmpUeVl0Y1dObDBJClh0VnN5SWU5dEM1RzhqSDRmT3BDdFpNV1ZkeWhEQktnMm1GK0QxaFljMlJ5eCtoRmp0eXA4aVkveG5tTXNWTUkKTTRHd1ZoTys1bEZjMkpzS1QwdWNWbE1DNlUvMkRXRHFUVUpWNkh3YklTSFRHenJNZC9LNGtQRm94L2xhL3ZvdAo5TC9KOVVVYnpqZ1FLamVLZWFPMDR3bHNoWWFULzRtV0ozaUJqMmZqUm5SVWp0a05hZUpLOUUxMEEvK3lkKzJWClo1ZmtzY1dydjJvajZOU1U0a1FvWXNSTDR2RFk0aWxyR25CK0pHR1RlMDhETWlVTlJTUXJsclJHYXI5S0MvZWEKajhHc0dzVm44MjgwMHZwelk0enZGckNvcEVZcStPc1M3SEswNy9ncmZveFN3SXVFVlBrdlB1TlZxTnhtc2RuaApYOWl6akZrMFdhU3JUMnk3SHhqYmRhdll5NUxObERoaERnY0dIMHRHRVBFVnZvMkZYRHRLSzRGNUQ3UnBuMGxRCmwwMzNEbFpkd0pWcXdqYkRHMmpKOVNyY1I1cStzczdGSmVqNkE3bmErUlp1a1lUMUhDakkvQ2JNMXh5UVZxZGYKYnpvRXZNMTRpUXVPRHkranFrK2lHeEk5RmdoQUQvRkdUTmVxZXdqQkN2VnRKOTRDajhyRHRTdks2ZXZJSVZNNApwY3c3MkhjM01LSlAyVy9SOGtDdFFYb1h4ZFpLTlltM1FkVjhobjlWVFlOS3BYTWd3RHF2a1BHYUpJN1pqbkhLCmU3aUcycktQbVQ0ZEV3MFNFZTdVcS9EcEZYWUM1T0RmcWlBZVcyR0ZaRUNwa0pjTnJWUFNXaDJIYWdDWFpXSzAKdm05cXAvVXNRdTB5cmJZaG5yNjgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1IE89SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290Q0EgMjAxNSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgTGFiZWw6ICJIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290Q0EgMjAxNSIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDgxOmU1OmI0OjE3OmViOmMyOmY1OmUxOjRiOjBkOjQxOjdiOjQ5OjkyOmZlOmVmCiMgU0hBMSBGaW5nZXJwcmludDogOWY6ZjE6NzE6OGQ6OTI6ZDU6OWE6ZjM6N2Q6NzQ6OTc6YjQ6YmM6NmY6ODQ6Njg6MGI6YmE6YjY6NjYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQ0OmI1OjQ1OmFhOjhhOjI1OmU2OjVhOjczOmNhOjE1OmRjOjI3OmZjOjM2OmQyOjRjOjFjOmI5Ojk1OjNhOjA2OjY1OjM5OmIxOjE1OjgyOmRjOjQ4OjdiOjQ4OjMzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDd3pDQ0FrcWdBd0lCQWdJQkFEQUtCZ2dxaGtqT1BRUURBakNCcWpFTE1Ba0dBMVVFQmhNQ1IxSXhEekFOCkJnTlZCQWNUQmtGMGFHVnVjekZFTUVJR0ExVUVDaE03U0dWc2JHVnVhV01nUVdOaFpHVnRhV01nWVc1a0lGSmwKYzJWaGNtTm9JRWx1YzNScGRIVjBhVzl1Y3lCRFpYSjBMaUJCZFhSb2IzSnBkSGt4UkRCQ0JnTlZCQU1UTzBobApiR3hsYm1saklFRmpZV1JsYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjFkR2x2Ym5NZ1JVTkRJRkp2CmIzUkRRU0F5TURFMU1CNFhEVEUxTURjd056RXdNemN4TWxvWERUUXdNRFl6TURFd016Y3hNbG93Z2FveEN6QUoKQmdOVkJBWVRBa2RTTVE4d0RRWURWUVFIRXdaQmRHaGxibk14UkRCQ0JnTlZCQW9UTzBobGJHeGxibWxqSUVGagpZV1JsYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjFkR2x2Ym5NZ1EyVnlkQzRnUVhWMGFHOXlhWFI1Ck1VUXdRZ1lEVlFRREV6dElaV3hzWlc1cFl5QkJZMkZrWlcxcFl5QmhibVFnVW1WelpXRnlZMmdnU1c1emRHbDAKZFhScGIyNXpJRVZEUXlCU2IyOTBRMEVnTWpBeE5UQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkpLZwpRZWhMZ29SYzR2Z3hFWm1HWkU0SkpTK2RRUzhLcmpWUGRKV3lVV1Jyald2bVAzQ1Y4QVZFUjZaeU9GQjJsUUphCmpxNG9udmt0VHBudkxFaHZUQ1VwNk5GeFc5OGR3WFUzdE5mNmUzcENuR29LVmxwOGFRdXFnQWtrYkg3QlJxTkMKTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkxRaQpDNEtaSkFFT25MdmtEdjIvKzVjZ2s1a3FNQW9HQ0NxR1NNNDlCQU1DQTJjQU1HUUNNR2ZPRm1JNG9xeGlSYWVwCmxTVEFHaWVjTWp2QXdOVzZxZWY0QkVOVGhlNVNJZDZkOVNXRFBwNVlTeS9YWnhNT0lRSXdCZUYxQWQ1bzdTb2YKVFV3SkNBM3NTNjFrRnlqbmRjNUZaWEloRjhzaVFRNk1FNWc0bWxSdG04cmlmT29DV0NLUgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2VydHBsdXMgUm9vdCBDQSBHMSBPPUNlcnRwbHVzCiMgU3ViamVjdDogQ049Q2VydHBsdXMgUm9vdCBDQSBHMSBPPUNlcnRwbHVzCiMgTGFiZWw6ICJDZXJ0cGx1cyBSb290IENBIEcxIgojIFNlcmlhbDogMTQ5MTkxMTU2NTc3OTg5ODM1NjcwOTczMTE3Njk2NTYxNTU2NDYzNzcxMwojIE1ENSBGaW5nZXJwcmludDogN2Y6MDk6OWM6Zjc6ZDk6Yjk6NWM6Njk6Njk6NTY6ZDU6Mzc6M2U6MTQ6MGQ6NDIKIyBTSEExIEZpbmdlcnByaW50OiAyMjpmZDpkMDpiNzpmZDphMjo0ZTowZDphYzo0OToyYzphMDphYzphNjo3Yjo2YToxZjplMzpmNzo2NgojIFNIQTI1NiBGaW5nZXJwcmludDogMTU6MmE6NDA6MmI6ZmM6ZGY6MmM6ZDU6NDg6MDU6NGQ6MjI6NzU6YjM6OWM6N2Y6Y2E6M2U6YzA6OTc6ODA6Nzg6YjA6ZjA6ZWE6NzY6ZTU6NjE6YTY6Yzc6NDM6M2UKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZhekNDQTFPZ0F3SUJBZ0lTRVNCVmcrUXRQbFJXaFMyRE43Y3MzRVlSTUEwR0NTcUdTSWIzRFFFQkRRVUEKTUQ0eEN6QUpCZ05WQkFZVEFrWlNNUkV3RHdZRFZRUUtEQWhEWlhKMGNHeDFjekVjTUJvR0ExVUVBd3dUUTJWeQpkSEJzZFhNZ1VtOXZkQ0JEUVNCSE1UQWVGdzB4TkRBMU1qWXdNREF3TURCYUZ3MHpPREF4TVRVd01EQXdNREJhCk1ENHhDekFKQmdOVkJBWVRBa1pTTVJFd0R3WURWUVFLREFoRFpYSjBjR3gxY3pFY01Cb0dBMVVFQXd3VFEyVnkKZEhCc2RYTWdVbTl2ZENCRFFTQkhNVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQgpBTnBRaDdiYXVLaytuV1Q2VmpPYVZqMFc1UU9Wc2pRY21tMWlCZFRZaitlSlpKKzYyMlNMWk9aNUttSE5yNDlhCmlaRmx1Vmo4dEFOZmtUOHRFQlhnZnMrOC9IOURaNml0WGpZajJKaXpUZk5EbmpsOEt2enNpTldJN25DOWhSWXQKNmt1SlBLTnhRdjRjL2RNY0xSQzRobFRxUTdqYnhvZmFxSzZBSmM5NkpoMnFrYkJJYjY2MTNwN1kxL29BL2NhUAowRkc3WW4ya3NZeXkveUFSdWpWakJZWkhZRU16a1BaSG9nTlBsazJkVDhIcTZweWkvalF1M3JmS0czYWt0NjJmCjZhalVlRDk0L3ZJNENUWWQwaFlDeU93cWFLLzFqcFR2TFJONkhrSktIUlV4cmd3RVYveGhjL014Vm9ZeGdLREUKRVc0d2R1T1U4RjhFeEt5SGNvbVl4WjNNVndpYTlBejhmWG9GT3ZwSGdEbTJ6NFFUZDI4bjZ2K1daeGNJYmVrTgoxaU5RTUxBVmRCTSs1Uy8vRHMzRUMwcGQ4TmdBTTBsbTY2RVlmRmt1UFNpNVlYSEx0YVc2dU9yYzRuQnZDR3JjCmgyYzA3OTh3Y3QzenlUOGovelhodmlFcElEQ0I1Qm1sSU9rbHluTXhkQ20rNGtMVjg3SW1ac2RvL1JtejV5Q1QKbWVoZDRGNkg1MGJvSlp3S0tTVFV6VmlHVWtBa3Nuc1BtQklnSlBhUWJFZklEYnNZSUM3Wi9meUw4aW5xaDNTVgo0RUpRZUlRRVFXR3c5Q0VqankzTEtDSHlhbXowR3FiRkZMUTNaVStWL1lESStITGxKV3ZFWUxGN2JZNUtpblBPCldmdHdlbk1HRTluVGREY2tRUW9SYjVmYzUrUitvYjBWOHJxSER6MW9paFlIQWdNQkFBR2pZekJoTUE0R0ExVWQKRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJTb3djQ2JrYWhERlh4ZApCaWUwS2xIWWx3dUJzVEFmQmdOVkhTTUVHREFXZ0JTb3djQ2JrYWhERlh4ZEJpZTBLbEhZbHd1QnNUQU5CZ2txCmhraUc5dzBCQVEwRkFBT0NBZ0VBbkZadkFYN1J2VXoxaXNid0poL2s0RGdZekRMREtUdWRRU2swWWNiWDhBQ2gKNjZSeWo1UVh2Qk1zZGJSWDdncDhDWHJjMWNxaDBEUVQrSGVybitYKzJCNTBpb1VIajMvTWVYcktsczNOL1UvNwovU01Oa1BYMFh0UEdZWDJlRWVBQzdna0UyUWZkcG9xM0RJTWt1NE5Ra3Y1Z2RSRSsySjJ3aW5xMTRKMmJ5NUJTClM3Q1RLdFErRmpQbG5zWmxGVDVrT3dRLzJ3eVBYMXdkYVIrdjgra2hqUFB2bC9hYXR4bTJoSFNjbzFTMWNFNWoKMkZkZFV5R2JRSkpEK3RaM1ZUTlBaTlg3MEN4cWptMGxwdStGNkFMRVV6NjVub2U4ekRVYTNxSHBpbU9IWlI0UgpLdHRqZDVjVXZwb1VtUkd5d082d1QvZ1VJVEpEVDUrcm9zdW9ENm83QmxYR0VpbFhDTlEzMTRjbnJVbFpwNUdyClJIcGVqWERibDg1SVVMRnprL2J3ZzJENXpmSGhNZjFiZkhFaFl4UVVxcS9GM3BOK2FMSHNJcUtxa0hXZXRVTnkKNm1TamhFdjlES2dtYTNHWDdsWmpadWhDVlBuSEhkL1FqMXZmeURCdmlQNE54RE1jVTZpai9VZ1E4dVFLVHVFVgpWL3h1WkREQ1ZSSGM2cW5OU2xTc0tXTkV6MHBBb05ab1dSc3orZTg2aTlzZ2t0eENoTDhCcTRmQTFTQ0MyOGE1Cmc0VkNYQTlETzJwSk5kV1k5QlcvK21HQkRBa2dHTkxRRnd6TFNBQlE2WGFDakdUWE9xQUhWY3dlTWNEdk9yUmwKKytPL1FtdWVENmk5YTVqYzJOdkxpNlRkMTFuMGJ0Mytxc09SMEM1Q0I4QU1UVlBOSkxGTVd4NVI5Ti9wa3ZvPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2VydHBsdXMgUm9vdCBDQSBHMiBPPUNlcnRwbHVzCiMgU3ViamVjdDogQ049Q2VydHBsdXMgUm9vdCBDQSBHMiBPPUNlcnRwbHVzCiMgTGFiZWw6ICJDZXJ0cGx1cyBSb290IENBIEcyIgojIFNlcmlhbDogMTQ5MjA4NzA5NjEzMTUzNjg0NDIwOTU2MzUwOTIyODk1MTg3NTg2MTU4OQojIE1ENSBGaW5nZXJwcmludDogYTc6ZWU6YzQ6Nzg6MmQ6MWI6ZWU6MmQ6Yjk6Mjk6Y2U6ZDY6YTc6OTY6MzI6MzEKIyBTSEExIEZpbmdlcnByaW50OiA0Zjo2NTo4ZToxZjplOTowNjpkODoyODowMjplOTo1NDo0Nzo0MTpjOTo1NDoyNTo1ZDo2OTpjYzoxYQojIFNIQTI1NiBGaW5nZXJwcmludDogNmM6YzA6NTA6NDE6ZTY6NDQ6NWU6NzQ6Njk6NmM6NGM6ZmI6Yzk6Zjg6MGY6NTQ6M2I6N2U6YWI6YmI6NDQ6YjQ6Y2U6NmY6Nzg6N2M6NmE6OTk6NzE6YzQ6MmY6MTcKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNIRENDQWFLZ0F3SUJBZ0lTRVNEWmtjNnVvK2pGNS8vcEFxL1BjN3hWTUFvR0NDcUdTTTQ5QkFNRE1ENHgKQ3pBSkJnTlZCQVlUQWtaU01SRXdEd1lEVlFRS0RBaERaWEowY0d4MWN6RWNNQm9HQTFVRUF3d1RRMlZ5ZEhCcwpkWE1nVW05dmRDQkRRU0JITWpBZUZ3MHhOREExTWpZd01EQXdNREJhRncwek9EQXhNVFV3TURBd01EQmFNRDR4CkN6QUpCZ05WQkFZVEFrWlNNUkV3RHdZRFZRUUtEQWhEWlhKMGNHeDFjekVjTUJvR0ExVUVBd3dUUTJWeWRIQnMKZFhNZ1VtOXZkQ0JEUVNCSE1qQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQk0wUFcxYUMzL0JGR3RhdAo5M253SGNtc2x0YWVUcHdmdEVJUnlvYS9iZnVGbzhYbEdWelg3cVkvYVdmWWVPS215Y1RiTFhrdTU0dU5BbTh4CklrMEc0MkJ5UlowT1FuZWV6cy9sZjRXYkdPVDh6QzV5MHhhVFRzcVpZMXloQlNwc0JxTmpNR0V3RGdZRFZSMFAKQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk5xRFl3SjVqdHBNeGp3agpGTmlQd3lDcktHQlpNQjhHQTFVZEl3UVlNQmFBRk5xRFl3SjVqdHBNeGp3akZOaVB3eUNyS0dCWk1Bb0dDQ3FHClNNNDlCQU1EQTJnQU1HVUNNSEQrc0F2Wjk0T1g3UE5WSGRUY3N3WU8vak9ZbllzNWtHdVVJZTIyMTEzV1ROY2gKcCtlL0lROHJ6ZmNxM0lVSG5RSXhBSVlVRnVYY3NHWEN3STRVbjc4a0Ztamx2UGw1YWR5dFJTdjN0akZ6ekFhbApVNU9SR3BPdWNHcG51dGVlNVdFYVh3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU9wZW5UcnVzdCBSb290IENBIEcxIE89T3BlblRydXN0CiMgU3ViamVjdDogQ049T3BlblRydXN0IFJvb3QgQ0EgRzEgTz1PcGVuVHJ1c3QKIyBMYWJlbDogIk9wZW5UcnVzdCBSb290IENBIEcxIgojIFNlcmlhbDogMTQ5MjAzNjU3NzgxMTk0NzAxMzc3MDQwMDEyNzAzNDgyNTE3ODg0NDc3NQojIE1ENSBGaW5nZXJwcmludDogNzY6MDA6Y2M6ODE6Mjk6Y2Q6NTU6NWU6ODg6NmE6N2E6MmU6Zjc6NGQ6Mzk6ZGEKIyBTSEExIEZpbmdlcnByaW50OiA3OTo5MTplODozNDpmNzplMjplZTpkZDowODo5NTowMTo1MjplOTo1NToyZDoxNDplOTo1ODpkNTo3ZQojIFNIQTI1NiBGaW5nZXJwcmludDogNTY6Yzc6NzE6Mjg6ZDk6OGM6MTg6ZDk6MWI6NGM6ZmQ6ZmY6YmM6MjU6ZWU6OTE6MDM6ZDQ6NzU6OGU6YTI6YWI6YWQ6ODI6NmE6OTA6ZjM6NDU6N2Q6NDY6MGU6YjQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZiekNDQTFlZ0F3SUJBZ0lTRVNDemtGVTVmWDgyYldUQ3A1OXJZNDVuTUEwR0NTcUdTSWIzRFFFQkN3VUEKTUVBeEN6QUpCZ05WQkFZVEFrWlNNUkl3RUFZRFZRUUtEQWxQY0dWdVZISjFjM1F4SFRBYkJnTlZCQU1NRkU5dwpaVzVVY25WemRDQlNiMjkwSUVOQklFY3hNQjRYRFRFME1EVXlOakE0TkRVMU1Gb1hEVE00TURFeE5UQXdNREF3Ck1Gb3dRREVMTUFrR0ExVUVCaE1DUmxJeEVqQVFCZ05WQkFvTUNVOXdaVzVVY25WemRERWRNQnNHQTFVRUF3d1UKVDNCbGJsUnlkWE4wSUZKdmIzUWdRMEVnUnpFd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJSwpBb0lDQVFENGVVYmFsc1V3WG9weEF5MXdwTHV3eFFqY3plWTF3SUNrRVMzZDVvZXVYVDJSMG9kc043ZmFZcDZiCndpVFhqL0hicHFiZlJtOVJwbkhMUGhzeFoyTDNFVnMwSjlWNVRveWJXTDBpRUExY0p3emRNT1dvMDEwaE9IUVgKL3VNZnRrODdheTNiZldBZmpIMU1CY0xyQVJZVm1CU08wWkIzSWovc3dqbTRlVHJ3U1NUaWxaSGNZVFNTakZSMAo3N0Y5akFIaU9IM0JYMnBmSkxLT1loZXRlU0N0cXgyMzRMU1dTRTltUXhBR0ZpUUQ0ZUNjanNaR1Q0NGFtZUdQCnVZNHpiR25lV0syZ0RxZGtWQkZwUkdaUFRCS25qaXg5eE5SYnhRQTBNTUhabWY0eXpnZUV0RTdOQ3Y4MlRXTHgKcDJOWDVOdHFwNjYvSzduSjVySW5pZVYrbWh4TmFNYkJHTjR6SzFGR1N4eU85ejBNK1lvMEZNVDdNelVqOGN6eApLc2VsdTdDaXp2NVRhMDFCRzJZb3NwYjZwNjRLVHJrNU0wU2NkTUdUSFBqZ25pUWxRL0diSTRLcTN5d2dzTncyClRnT3pmQUxVNW5zYXFvY1R2ejZoZEx1YkR1SEFrNS9YcEdiS3V4czc0ekQwTTFtS0IzSURWZWR6YWdNeGJtK1cKRytPaW42K1N4KzMxUXJjbFREc1RCTThjbHE4Y0lxUFFxd1d5VEJJalV0ejlHVnNubkI0N2V2MUNJOXNqZ0JQdwp2RkVWVkpTbWR6N1FkRkc5VVJRSU9UZkxIelNwTUoxU2hDNVZrTEc2MzFVQUM5aFdMYkZKU1hLQXFXTFh3UFlZCkVRUlZ6WFI3ejJGd2VmUjdMRnhja3Z6bHVGcXJUSk9Wb1NmdXBiN1BjU05DdXB0MkxRSURBUUFCbzJNd1lUQU8KQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVsMFloVnlFMQoyalpWeC9QeE4zRGxDUGFUS2JZd0h3WURWUjBqQkJnd0ZvQVVsMFloVnlFMTJqWlZ4L1B4TjNEbENQYVRLYll3CkRRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFCM2RBbUI4NERXbjVwaDc2a1RPWjBCUDhwTnVadFE1aVNhczAwMEUKUEx1SElUODM5SEVsMmt1NnE1YUNnWkcyN2RteHBHV1g0bTlrV2FTVzdtREtIeVA3UmJyL2p5VHd5cWt4ZjNrZgpnTE10TXJwa1oyQ3Z1Vm5OMzVwSjA2aUNzZm1ZbElyTTRMdmdCQnVaWUxGR1pkd0lvckpHbmtTSTZwTitWeGJTCkZYSmZMa3VyMUoxanVPTkk1ZjZFTGxnS24wTWQvcmNZa29aRFN3NmNNb1lzWVBYcFNPcVY3WEFwOGRVdi9UVzAKVjgvYmhVaVp1Y0p2YkkvTmVKV3NaQ2o5VnJERGI4TytXVkxoWDRTUGdQTDBEVGF0ZHJPanRlRmtkanBZM0gxUApYbFpzNVZWWlY2WGY4WXBtTUl6VVVtSTRkN1MrS05mS05zU2JCZkQ0RmR2YjhlODBuUjE0U29oV1oyNWcvNC9JCmkrR092VUtwTXdwWlFoSVNLdnF4blVPT0JadVoybUt0VnphekhiWU5lUzJXdU92eURFc01wWlRHTUtjbUdTM3QKVEFaUU1QSDlXRDI1U3hkZkdiUnFoRlMwT0U4NW9nMldhTU1vbFAzdExSOUthME9XTHBBQkVQczRwb0VMMEw5MQowOVM1enZFL2J3NGNIamR4NVJpSGRSay9VTGxlcEVVMHJiREs1dVVUZGc4eEZLbU9MWlRXMVlWTmN4VlBTL0t5ClB1MXN2ZjBPbldaenNEMjA5NytvNEJHa3hLNTFDVXBqQUVnZ3BzYWRDd21LdE9EbXpqN0hQaVk0NlN2ZXBnaEoKQXdTUWl1bVB2K2kydENxakk0MGNITEk1a3FpUEFseEFPWFhVYzBFQ2Q5N040RU9IMXVTNlNzTnNFbi8rS3VZagoxb3h4Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMiBPPU9wZW5UcnVzdAojIFN1YmplY3Q6IENOPU9wZW5UcnVzdCBSb290IENBIEcyIE89T3BlblRydXN0CiMgTGFiZWw6ICJPcGVuVHJ1c3QgUm9vdCBDQSBHMiIKIyBTZXJpYWw6IDE0OTIwMTI0NDgwNDI3MDIwOTY5ODY4NzU5ODc2NzY5MzU1NzM0MTU0NDEKIyBNRDUgRmluZ2VycHJpbnQ6IDU3OjI0OmI2OjU5OjI0OjZiOmFlOmM4OmZlOjFjOjBjOjIwOmYyOmMwOjRlOmViCiMgU0hBMSBGaW5nZXJwcmludDogNzk6NWY6ODg6NjA6YzU6YWI6N2M6M2Q6OTI6ZTY6Y2I6ZjQ6OGQ6ZTE6NDU6Y2Q6MTE6ZWY6NjA6MGIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDI3Ojk5OjU4OjI5OmZlOjZhOjc1OjE1OmMxOmJmOmU4OjQ4OmY5OmM0Ojc2OjFkOmIxOjZjOjIyOjU5OjI5OjI1OjdiOmY0OjBkOjA4Ojk0OmYyOjllOmE4OmJhOmYyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYnpDQ0ExZWdBd0lCQWdJU0VTQ2hhUnUvdmJtOVVwYVBJK2hJdnlZUk1BMEdDU3FHU0liM0RRRUJEUVVBCk1FQXhDekFKQmdOVkJBWVRBa1pTTVJJd0VBWURWUVFLREFsUGNHVnVWSEoxYzNReEhUQWJCZ05WQkFNTUZFOXcKWlc1VWNuVnpkQ0JTYjI5MElFTkJJRWN5TUI0WERURTBNRFV5TmpBd01EQXdNRm9YRFRNNE1ERXhOVEF3TURBdwpNRm93UURFTE1Ba0dBMVVFQmhNQ1JsSXhFakFRQmdOVkJBb01DVTl3Wlc1VWNuVnpkREVkTUJzR0ExVUVBd3dVClQzQmxibFJ5ZFhOMElGSnZiM1FnUTBFZ1J6SXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUsKQW9JQ0FRRE10bGVsTTVRUWdUSlQzMkYrRDNZNXoxekNVM1VkU1hxV09OMmljMnJ4Yjk1ZW9scTVjU0crTnRtaAovTHp1YktoOE5CcHhHdWdhMkY4T1JBYnRwK0R6MG1FTDRES2lsdEU0OE1MYUFSZjg1S3hQNk82SkhuU3JUNzhlCkNiWTJhbGJ6NGU2V2lXWWtCdVROUWpwSzNlQ2FzTVNDUmJQK3lhdGNmRDdKNnhjdkRIMXVycVdQeUt3bENtLzYKMVVXWTBqVUo5Z05EbFA3WnZ5Q1ZlWUNZaXRtSk5idFJHNlEzZmZ5Wk82di92NndOajBPeG1Yc1dFSDRkYjBmRQpGWThFbGdnR1FnVDRoTllkdkpHbVFyNUoxV3FJUDd3dFVkR2VqZUJTekZmZE5UVlkyN1NQSklqa2k5L2NhMVRTCmdTdXl6cEpMSEI5RytoM1lrc3QyWjdVSm1RbmxyQmNVVlhER1BLQldDZ096M0dJWjM4aTFNSC8xUENaMUViM1gKRzdPSG5nZXZaWEhsb004YXB3a1FIWk9KWmx2b1BHSXl0YlU2YnVtRkFZdWVRNHhuY3loWlcrdmozQ3pNcFNaeQpZaEswNXB5RFJQWlJwT0xBZWlSWHlnNmxQenExTzR2bGR1NXc1cExlRmx3b1c1Y1pKNUwrZXBKVXpwTTVDaGFICnZHT3o5YkdUWE9CdXQ5RHErV0l5aUVUN3Z5Y290akNWWFJJb3VaVytqMU1ZNWFJWUZ1SldwTElzRVBVZE42YjQKdC9iUVdWeUo5OExWdFpSMDBkWCtHN2J3NXRZZWU5STh5NmpqOVJqeklSOXU3MDFvQm5zdFhXNURpYWJBK2FDLwpnaDdQVTMrMDZ5emJYZlpxZlVBa0JYS0pPQUdUeTNIQ09WMEdFZlp2ZVBnM0RUbUVKd0lEQVFBQm8yTXdZVEFPCkJnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVYWpuNlFpTDMKNW9rQVRWNTlNNFBMdUc1M2hxOHdId1lEVlIwakJCZ3dGb0FVYWpuNlFpTDM1b2tBVFY1OU00UEx1RzUzaHE4dwpEUVlKS29aSWh2Y05BUUVOQlFBRGdnSUJBSmpMcTBBODVUTUNsMzh0aDZhUDFGNUtyN2dlNTd0eCs0QmtKYW16CkdqNW9YU2NtcDdvcTRmQlhnd3BrVHg0aWRCdnBrRi93ck0vL1QyaDZPS1FRYkEyeHg2UjNnQmkyb2loRWRxYzAKblhHRUw4cFowa2VJbVVFaXlUQ1lZVzQ5cUtnRmJkRWZ3RkZFVm44bk5RTGRYcGdLUXVzd3Y0MmhtMUdxTytxVApSbVRGQUhuZUlXdjJWNkNHMXdaeTdIQkdTNHR6M2FBaGRUN2NIY0NQMDA5ekhJWFovbjlpeUpWdnR0TjdqTHBUCndtK2JSRXg1MEIxd3M5ZWZBdlN5QjdESDVmaXRJdzZtVnNrcEVuZEkyUzlHL1R2dy9IUndrcVdPT0FnZlpEQzIKdDB2N05xd1FqcUJTTTJPZEF6Vld4V205eGlOYUo1VDJwQkw0TFRNOG9WYWxYOVlaNmUxOENMMTN6U2RrekpUYQpUa1pRaCtENXdWT0FIcnV0KzBkU2l4djlvdm5lRGlLM1BUTlpiTlRlOVpVR01nMVJHVUZjUGs4Rzk3a3JnQ2YyCm82cDZmQWJoUThNVE9XSWFOcjNnS0M2VUF1UXBMbUJWcmtBOXNIU1NYdkFnWkpZL1gwVmRpTFdLMmdLZ1cwVlUKM2pnOUNjQ29TbVZHRnZ5cXYxUk9UVnUrT0VPM0tNcUxNNm9hSmJvbFhDa3ZXMHB1ak9vdG5DcjJCWGJnZDVlQQppTjFuRTI4ZGFDU0xUN2QwZ2VYMFlKOTZWZGMrTjlvV2F6NTNySzRZY0pVSWVTa0RpdjdCTzdNL0dnK2tPMTRmCldLR1Z5YXN2YzByUUxXNmFXUTlWR0hndFBGR21sNHZtdTdKd3Frd1Izdjk4S3pmVWV0RjNOSS9uK1VMM1BJRU0KUzFJSwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049T3BlblRydXN0IFJvb3QgQ0EgRzMgTz1PcGVuVHJ1c3QKIyBTdWJqZWN0OiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMyBPPU9wZW5UcnVzdAojIExhYmVsOiAiT3BlblRydXN0IFJvb3QgQ0EgRzMiCiMgU2VyaWFsOiAxNDkyMTA0OTA4MjcxNDg1NjUzMDcxMjE5OTQxODY0MTcxMTcwNDU1NjE1CiMgTUQ1IEZpbmdlcnByaW50OiAyMTozNzpiNDoxNzoxNjo5Mjo3Yjo2Nzo0Njo3MDphOTo5NjpkNzphODoxMzoyNAojIFNIQTEgRmluZ2VycHJpbnQ6IDZlOjI2OjY0OmYzOjU2OmJmOjM0OjU1OmJmOmQxOjkzOjNmOjdjOjAxOmRlOmQ4OjEzOmRhOjhhOmE2CiMgU0hBMjU2IEZpbmdlcnByaW50OiBiNzpjMzo2MjozMTo3MDo2ZTo4MTowNzo4YzozNjo3YzpiODo5NjoxOTo4ZjoxZTozMjowODpkZDo5Mjo2OTo0OTpkZDo4Zjo1NzowOTphNDoxMDpmNzo1Yjo2Mjo5MgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0lUQ0NBYWFnQXdJQkFnSVNFU0RtK0V6OEpMQytCVUNzMm9NYk5HQS9NQW9HQ0NxR1NNNDlCQU1ETUVBeApDekFKQmdOVkJBWVRBa1pTTVJJd0VBWURWUVFLREFsUGNHVnVWSEoxYzNReEhUQWJCZ05WQkFNTUZFOXdaVzVVCmNuVnpkQ0JTYjI5MElFTkJJRWN6TUI0WERURTBNRFV5TmpBd01EQXdNRm9YRFRNNE1ERXhOVEF3TURBd01Gb3cKUURFTE1Ba0dBMVVFQmhNQ1JsSXhFakFRQmdOVkJBb01DVTl3Wlc1VWNuVnpkREVkTUJzR0ExVUVBd3dVVDNCbApibFJ5ZFhOMElGSnZiM1FnUTBFZ1J6TXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFSSzdsaXVUY3BtCjNnWTZveEg4NEJqd2JoeTZMVEFNaWRuVzdwdHpnNmtqRll3dldZcGEzUlRxblZrclE3Y0c3REsydXU1QnRhMWQKb1lYTTZoMFVacU5uZmtiaWxQUG50bGFoRlZtaFR6ZVh1U0lldlJIcjlMSWZYc01VbXVYWmw1bWpZekJoTUE0RwpBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSSGQ4TVVpMkk1CkRNbHY0VkJOMEJCWTNKV0liVEFmQmdOVkhTTUVHREFXZ0JSSGQ4TVVpMkk1RE1sdjRWQk4wQkJZM0pXSWJUQUsKQmdncWhrak9QUVFEQXdOcEFEQm1BakVBajZqY25ib01CQmY2RmVrOUx5a0JsNytCRmpOQWsyejgrZTJBY0crcQpqOXVFd292MU5jb0czR1J2YUJiaGo1RzVBakVBMkV1bHk4TFFDR3pwR1B0YTNVMWZKQXV3QUNFbDc0K25CQ1p4CjRueHA1VjJhK0VFZk96bVRrNTFWNnMyTjhmdkIKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUlTUkcgUm9vdCBYMSBPPUludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwCiMgU3ViamVjdDogQ049SVNSRyBSb290IFgxIE89SW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAKIyBMYWJlbDogIklTUkcgUm9vdCBYMSIKIyBTZXJpYWw6IDE3Mjg4NjkyODY2OTc5MDQ3NjA2NDY3MDI0MzUwNDE2OTA2MTEyMAojIE1ENSBGaW5nZXJwcmludDogMGM6ZDI6Zjk6ZTA6ZGE6MTc6NzM6ZTk6ZWQ6ODY6NGQ6YTU6ZTM6NzA6ZTc6NGUKIyBTSEExIEZpbmdlcnByaW50OiBjYTpiZDoyYTo3OTphMTowNzo2YTozMTpmMjoxZDoyNTozNjozNTpjYjowMzo5ZDo0MzoyOTphNTplOAojIFNIQTI1NiBGaW5nZXJwcmludDogOTY6YmM6ZWM6MDY6MjY6NDk6NzY6ZjM6NzQ6NjA6Nzc6OWE6Y2Y6Mjg6YzU6YTc6Y2Y6ZTg6YTM6YzA6YWE6ZTE6MWE6OGY6ZmM6ZWU6MDU6YzA6YmQ6ZGY6MDg6YzYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZhekNDQTFPZ0F3SUJBZ0lSQUlJUXo3RFNRT05aUkdQZ3UyT0Npd0F3RFFZSktvWklodmNOQVFFTEJRQXcKVHpFTE1Ba0dBMVVFQmhNQ1ZWTXhLVEFuQmdOVkJBb1RJRWx1ZEdWeWJtVjBJRk5sWTNWeWFYUjVJRkpsYzJWaApjbU5vSUVkeWIzVndNUlV3RXdZRFZRUURFd3hKVTFKSElGSnZiM1FnV0RFd0hoY05NVFV3TmpBME1URXdORE00CldoY05NelV3TmpBME1URXdORE00V2pCUE1Rc3dDUVlEVlFRR0V3SlZVekVwTUNjR0ExVUVDaE1nU1c1MFpYSnUKWlhRZ1UyVmpkWEpwZEhrZ1VtVnpaV0Z5WTJnZ1IzSnZkWEF4RlRBVEJnTlZCQU1UREVsVFVrY2dVbTl2ZENCWQpNVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLM29KSFAwRkRmem01NHJWeWdjCmg3N2N0OTg0a0l4dVBPWlhvSGozZGNLaS92VnFidllBVHlqYjNtaUdiRVNUdHJGai9SUVNhNzhmMHVveG15RisKMFRNOHVrajEzWG5mczdqL0V2RWhta3ZCaW9aeGFVcG1abXlQZmp4d3Y2MHBJZ2J6NU1EbWdLN2lTNCszbVg2VQpBNS9UUjVkOG1VZ2pVK2c0cms4S2I0TXUwVWxYaklCMHR0b3YwRGlOZXdOd0lSdDE4akE4K28rdTNkcGpxK3NXClQ4S09FVXQrend2by83VjNMdlN5ZTByZ1RCSWxESENOQXltZzRWTWs3QlBaN2htL0VMTktqRCtKbzJGUjNxeUgKQjVUMFkzSHNMdUp2VzVpQjRZbGNOSGxzZHU4N2tHSjU1dHVrbWk4bXhkQVE0UTdlMlJDT0Z2dTM5NmozeCtVQwpCNWlQTmdpVjUrSTNsZzAyZFo3N0RuS3hIWnU4QS9sSkJkaUIzUVcwS3RaQjZhd0JkcFVLRDlqZjFiMFNIelV2CktCZHMwcGpCcUFsa2QyNUhON3JPckZsZWFKMS9jdGFKeFFaQktUNVpQdDBtOVNUSkVhZGFvMHhBSDBhaG1iV24KT2xGdWhqdWVmWEtuRWdWNFdlMCtVWGdWQ3dPUGpkQXZCYkkrZTBvY1MzTUZFdnpHNnVCUUUzeERrM1N6eW5UbgpqaDhCQ05BdzFGdHhOclFIdXNFd01GeEl0NEk3bUtaOVlJcWlveW1DekxxOWd3UWJvb01EUWFIV0JmRWJ3cmJ3CnFIeUdPMGFvU0NxSTNIYWFkcjhmYXFVOUdZL3JPUE5rM3NnckRRb28vL2ZiNGhWQzFDTFFKMTNoZWY0WTUzQ0kKclU3bTJZczZ4dDBuVVc3L3ZHVDFNME5QQWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSNXRGbm1lN2JsNUFGemdBaUl5QnBZOXVtYmJqQU5CZ2txCmhraUc5dzBCQVFzRkFBT0NBZ0VBVlI5WXFieXlxRkRRRExIWUdta2dKeWtJckdGMVhJcHUrSUxsYVMvVjlsWkwKdWJoekVGblRJWmQrNTB4eCs3TFNZSzA1cUF2cUZ5RldoZkZRRGxucnp1Qlo2YnJKRmUrR25ZK0VnUGJrNlpHUQozQmViWWh0RjhHYVYwbnh2d3VvNzd4L1B5OWF1Si9HcHNNaXUvWDErbXZvaUJPdi8yWC9xa1NzaXNSY09qL0tLCk5GdFkyUHdCeVZTNXVDYk1pb2d6aVV3dGhEeUMzKzZXVndXNkxMdjN4TGZIVGp1Q3ZqSElJbk56a3RIQ2dLUTUKT1JBekk0Sk1QSitHc2xXWUhiNHBob3dpbTU3aWF6dFhPb0p3VGR3Sng0bkxDZ2ROYk9oZGpzbnZ6cXZIdTdVcgpUa1hXU3RBbXpPVnl5Z2hxcFpYakZhSDNwTzNKTEYrbCsvK3NLQUl1dnRkN3UrTnhlNUFXMHdkZVJsTjhOd2RDCmpOUEVscHpWbWJVcTRKVWFnRWl1VERrSHpzeEhwRktWSzdxNCs2M1NNMU45NVIxTmJkV2hzY2RDYitaQUp6VmMKb3lpM0I0M25qVE9RNXlPZisxQ2NlV3hHMWJRVnM1WnVmcHNNbGpxNFVpMC8xbHZoK3dqQ2hQNGtxS09KMnF4cQo0Umdxc2FoRFlWdlRIOXc3alhieUxlaU5kZDhYTTJ3OVUvdDd5MEZmLzl5aTBHRTQ0WmE0ckYyTE45ZDExVFBBCm1SR3VuVUhCY25XRXZnSkJRbDluSkVpVTBac252Z2MvdWJoUGdYUlI0WHEzN1owajRyN2cxU2dFRXp3eEE1N2QKZW15UHhnY1l4bi9lUjQ0L0tKNEVCcytsVkRSM3ZleUptK2tYUTk5YjIxLytqaDVYb3MxQW5YNWlJdHJlR0NjPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1GTk1ULVJDTSBPVT1BQyBSQUlaIEZOTVQtUkNNCiMgU3ViamVjdDogTz1GTk1ULVJDTSBPVT1BQyBSQUlaIEZOTVQtUkNNCiMgTGFiZWw6ICJBQyBSQUlaIEZOTVQtUkNNIgojIFNlcmlhbDogNDg1ODc2MzA4MjA2NDQ4ODA0NzAxNTU0NjgyNzYwNTU0NzU5CiMgTUQ1IEZpbmdlcnByaW50OiBlMjowOTowNDpiNDpkMzpiZDpkMTphMDoxNDpmZDoxYTpkMjo0NzpjNDo1NzoxZAojIFNIQTEgRmluZ2VycHJpbnQ6IGVjOjUwOjM1OjA3OmIyOjE1OmM0Ojk1OjYyOjE5OmUyOmE4OjlhOjViOjQyOjk5OjJjOjRjOjJjOjIwCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlYjpjNTo1NzowYzoyOTowMTo4Yzo0ZDo2NzpiMTphYToxMjo3YjphZjoxMjpmNzowMzpiNDo2MToxZTpiYzoxNzpiNzpkYTpiNTo1NzozODo5NDoxNzo5Yjo5MzpmYQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmd6Q0NBMnVnQXdJQkFnSVBYWk9OTUdjMnlBWWRHc2RVaEdrSE1BMEdDU3FHU0liM0RRRUJDd1VBTURzeApDekFKQmdOVkJBWVRBa1ZUTVJFd0R3WURWUVFLREFoR1RrMVVMVkpEVFRFWk1CY0dBMVVFQ3d3UVFVTWdVa0ZKCldpQkdUazFVTFZKRFRUQWVGdzB3T0RFd01qa3hOVFU1TlRaYUZ3MHpNREF4TURFd01EQXdNREJhTURzeEN6QUoKQmdOVkJBWVRBa1ZUTVJFd0R3WURWUVFLREFoR1RrMVVMVkpEVFRFWk1CY0dBMVVFQ3d3UVFVTWdVa0ZKV2lCRwpUazFVTFZKRFRUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUxweGdIcE1obTUvCnlCTnR3TVo5SEFDWGp5d01JN3NRbWtDcEdyZUhpUGliVm1yNzVudU9pNUtPcHlWZFdSSGJOaTYzVVJjZnFRZ2YKQkJja1dLbzNTaGpmNVRuVVYvM1h3U3lSQVpIaUl0UUR3Rmo4ZDBmc2p6NTBRN3FzTkkxTk9IWm5qckRJYnpBegpXSEZjdFBWcmJ0UUJVTGdUZm14S28wblJJQm51dk1BcEdHV24zdjd2M1FxUUllY2FaNUpDRUpoZlR6QzhQaHhGCnRCRFhhRUFVd0VENjUzY1hldVlMajJWYlBObWFVdHUxdlo1R3p6M3JrUVVDd0pheWRreE5FSlk3a3ZxY2Z3K1oKMzc0ak5VVWVBbHordGFpYm1TWGFYdk1pd3puMTVDb3UwOFlmeEd5cXhSeHFBUVZLTDlMRndhZzBKbDFtcGRJQwpJZmtZdHdiMVRwbHZxS3RNVWVqUFVCakZkOGc1Q1N4SmtqS1pxTHNYRjNtd1dzWG1vOFJaWlVjMWcxNnA2RFVMCm1idmt6U0RHbTBvR09iVm8vQ0s2N2xXTUswN3E4N0hqL0xhWm10VkMrbkZOQ00rSEhtcHhmZm5UdE9tbGNZRjcKd2s1SGxxWDJkb1dqS0kvcGdHNkJVNlZ0WDdoSStjTDVOcVl1U2YrNGxzS01CN09iaUZqODZ4c2MzaTF3NHBlUwpNS0dKNDd4VnFDZldTKzJRcll2Nll5VlpMYWcxM2NxWE03emx6Y2VkMGV6dlhnNUtrQVltWTYyNTJUVXRCN3AyClpTeXNWNDk5OUFlVTE0RUNsbDJqQjBuVmV0QlgrUnZuVTBaMXFyQjVRc3RvY1FqcFlMMDVhYzcwcjhOV1FNZXQKVXFJSjVHK0dSNG9mNnlnblhZTWdyd1RKYkZhYWkwYjFBZ01CQUFHamdZTXdnWUF3RHdZRFZSMFRBUUgvQkFVdwpBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRlBkOXhmM0U2Sm9iZDJTbjlSMmd6TCtICllKcHRNRDRHQTFVZElBUTNNRFV3TXdZRVZSMGdBREFyTUNrR0NDc0dBUVVGQndJQkZoMW9kSFJ3T2k4dmQzZDMKTG1ObGNuUXVabTV0ZEM1bGN5OWtjR056THpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQUI1QkszL01qVHZERApuRkZsbTV3aW9vb01oZk56S1d0Ti9nSGlxUXhqQWI4RVo2V2RtRi85QVJQNjdKcGk2WWIrdG1MU2JreVUrOEIxClJYeGxEUGl5Tjgrc0Q4K05iL2taOTQvc0h2SndudkRLdU8rMy8zWTNkbHYyYm9qenIySXlJcE1OT21xT0ZHWU0KTFZOMFYyVWUxYkxkSTRFN3BXWWpKMmNKaitGM3FrUE5aVkVJN1ZGWS91WTUrY3RIaEtRVjhYYTdwTzZrTzhSZgo3N0l6bGhFWXQ4bGx2aGpobzZUYytoajUwN3dUbXpsNk5MclRRZnY2TW9vcXR5dUdDMm1ET0w3TmlpNExjSzJOCkpwTHVIdlVCS3dyWjFwZWJidUNvR1J3NklZc01Ia0N0QStmZFpuNzF1U0FOQStpVytZSkYxRG5nb0FCZDE1am0KZlo1bmM4T2FLdmVyaTZFNkZPODB2RklPaVppYUJFQ0VIWDVGYVpOWHp1dk8rRkI4VHh4dUJFT2IrZFk3SXhqcAo2bzdSVFVhTjhUdmthc3E2K3lPM20vcVpBU2xhV0ZvdDQvblViUTRtcmNGdU5Md3krQXdGK21XajJ6czNneUxwCjF0eHlNLzFkOGlDOWRqd2oyaWozK1J2cldXVFYzRjl5ZmlEOHpZbTFrR2ROWW5vL1RxMGR3em4rZXZRb0Z0OUIKOWtpQUJkY1BVWG1zRUt2VTdBTm01bXF3dWpHU1FrQnF2anJUY3VGcU4xVzhyQjJWdDJsaDhrT1JkT2FnMHdvawpScUVJcjliYVJSbVcxRk1kVzRSNThNRDNSKytMajhVR3JwMU1ZcDMvUmdUNDA4bTJFQ1ZBZGY0V3FzbEtZSVl2CnV1OHdkK1JVNHJpRW1WaUFxaE9MVVRwUFNQYUx0ck09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BbWF6b24gUm9vdCBDQSAxIE89QW1hem9uCiMgU3ViamVjdDogQ049QW1hem9uIFJvb3QgQ0EgMSBPPUFtYXpvbgojIExhYmVsOiAiQW1hem9uIFJvb3QgQ0EgMSIKIyBTZXJpYWw6IDE0MzI2Njk3ODkxNjY1NTg1Njg3ODAzNDcxMjMxNzIzMDA1NDUzODM2OTk5NAojIE1ENSBGaW5nZXJwcmludDogNDM6YzY6YmY6YWU6ZWM6ZmU6YWQ6MmY6MTg6YzY6ODg6Njg6MzA6ZmM6Yzg6ZTYKIyBTSEExIEZpbmdlcnByaW50OiA4ZDphNzpmOTo2NTplYzo1ZTpmYzozNzo5MTowZjoxYzo2ZTo1OTpmZDpjMTpjYzo2YTo2ZTpkZToxNgojIFNIQTI1NiBGaW5nZXJwcmludDogOGU6Y2Q6ZTY6ODg6NGY6M2Q6ODc6YjE6MTI6NWI6YTM6MWE6YzM6ZmM6YjE6M2Q6NzA6MTY6ZGU6N2Y6NTc6Y2M6OTA6NGY6ZTE6Y2I6OTc6YzY6YWU6OTg6MTk6NmUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURRVENDQWltZ0F3SUJBZ0lUQm15Zno1bS9qQW81NHZCNGlrUG1salpieWpBTkJna3Foa2lHOXcwQkFRc0YKQURBNU1Rc3dDUVlEVlFRR0V3SlZVekVQTUEwR0ExVUVDaE1HUVcxaGVtOXVNUmt3RndZRFZRUURFeEJCYldGNgpiMjRnVW05dmRDQkRRU0F4TUI0WERURTFNRFV5TmpBd01EQXdNRm9YRFRNNE1ERXhOekF3TURBd01Gb3dPVEVMCk1Ba0dBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBb1RCa0Z0WVhwdmJqRVpNQmNHQTFVRUF4TVFRVzFoZW05dUlGSnYKYjNRZ1EwRWdNVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMSjRnSEhLZU5YagpjYTlIZ0ZCMGZXN1kxNGgyOUpsbzkxZ2hZUGwwaEFFdnJBSXRodE9nUTNwT3NxVFFOcm9Cdm8zYlNNZ0hGelpNCjlPNklJOGMrNnpmMXRSbjRTV2l3M3RlNWRqZ2RZWjZrL29JMnBlVktWdVJGNGZuOXRCYjZkTnFjbXpVNUwvcXcKSUZBR2JIclFnTEttK2Evc1J4bVBVRGdIM0tLSE9WajR1dFdwK1Vobk1KYnVsSGhlYjRtalVjQXdobWFoUldhNgpWT3VqdzVINVNOei8wZWd3TFgwdGRIQTExNGdrOTU3RVdXNjdjNGNYOGpKR0tMaEQrcmNkcXNxMDhwOGtEaTFMCjkzRmNYbW4vNnBVQ3l6aUtybEE0Yjl2N0xXSWJ4Y2NlVk9GMzRHZklENXlISTlZL1FDQi9JSURFZ0V3K095UW0KamdTdWJKcklxZzBDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQwpBWVl3SFFZRFZSME9CQllFRklRWXpJVTA3THdNbEpRdUNGbWN4N0lRVGdvSU1BMEdDU3FHU0liM0RRRUJDd1VBCkE0SUJBUUNZOGpkYVFaQ2hHc1YyVVNnZ05pTU9ydVlvdTZyNGxLNUlwREIvRy93a2pVdTB5S0dYOXJieGVuREkKVTVQTUNDamptQ1hQSTZUNTNpSFRmSVVKclU2YWRUckNDMnFKZUhaRVJ4aGxiSTFCamp0L21zdjB0YWRRMXdVcwpOK2dEUzYzcFlhQUNidlh5OE1XeTdWdTMzUHFVWEhlZUU2Vi9VcTJWOHZpVE85NkxYRnZLV2xKYllLOFU5MHZ2Cm8vdWZRSlZ0TVZUOFF0UEhSaDhqcmRrUFNIQ2EyWFY0Y2RGeVF6UjFibGRad2dKY0ptQXB6eU1aRm82SVE2WFUKNU1zSSt5TVJRK2hES1hKaW9hbGRYZ2pVa0s2NDJNNFV3dEJWOG9iMnhKTkRkMlpod0xub1FkZVhlR0FEYmtweQpycVhSZmJvUW5vWnNHNHE1V1RQNDY4U1F2dkc1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BbWF6b24gUm9vdCBDQSAyIE89QW1hem9uCiMgU3ViamVjdDogQ049QW1hem9uIFJvb3QgQ0EgMiBPPUFtYXpvbgojIExhYmVsOiAiQW1hem9uIFJvb3QgQ0EgMiIKIyBTZXJpYWw6IDE0MzI2Njk4Mjg4NTk2MzU1MTgxODM0OTE2MDY1ODkyNTAwNjk3MDY1MzIzOQojIE1ENSBGaW5nZXJwcmludDogYzg6ZTU6OGQ6Y2U6YTg6NDI6ZTI6N2E6YzA6MmE6NWM6N2M6OWU6MjY6YmY6NjYKIyBTSEExIEZpbmdlcnByaW50OiA1YTo4YzplZjo0NTpkNzphNjo5ODo1OTo3Njo3YTo4Yzo4Yjo0NDo5NjpiNTo3ODpjZjo0Nzo0YjoxYQojIFNIQTI1NiBGaW5nZXJwcmludDogMWI6YTU6YjI6YWE6OGM6NjU6NDA6MWE6ODI6OTY6MDE6MTg6Zjg6MGI6ZWM6NGY6NjI6MzA6NGQ6ODM6Y2U6YzQ6NzE6M2E6MTk6YzM6OWM6MDE6MWU6YTQ6NmQ6YjQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZRVENDQXltZ0F3SUJBZ0lUQm15ZjBwWTFocDhLRCtXR2VQaGJKcnVLTnpBTkJna3Foa2lHOXcwQkFRd0YKQURBNU1Rc3dDUVlEVlFRR0V3SlZVekVQTUEwR0ExVUVDaE1HUVcxaGVtOXVNUmt3RndZRFZRUURFeEJCYldGNgpiMjRnVW05dmRDQkRRU0F5TUI0WERURTFNRFV5TmpBd01EQXdNRm9YRFRRd01EVXlOakF3TURBd01Gb3dPVEVMCk1Ba0dBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBb1RCa0Z0WVhwdmJqRVpNQmNHQTFVRUF4TVFRVzFoZW05dUlGSnYKYjNRZ1EwRWdNakNDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLMldueTJjU2t4SwpnWGxSbWV5S3kydGdVUk84VFcwRy9MQUlqZDBaRUdySEpndzEyTUJ2SUlUcGxMR2JoUVBEVzl0SzZNajRrSGJaClcwL2pUT2dHTmszTW1xdzlESkFya3RRR0dXQ3NOMFI1aFlHQ3JWbzM0QTNNbmFaTVVuYnFRNTIzQk5GUTlsWGcKMWRLbVNZWHBOK25LZnE1Y2xVMUltait1SUZwdGlKWFpOTGhTR2tPUXNMOXNCYm0yZUxmcTBPUTZQQkpUWXY5Swo4bnUrTlFXcEVqVGo4MlIwWWl3OUFFbGFLUDR5Ukx1SDNXVW5BbkU3MmtyM0g5ck45eUZWa0U4UDdLNkM0WjlyCjJVWFR1L0JmaCswOExEbUcyai9lN0hKVjYzbWpyZHZkZkxDNkhNNzgzazgxZHM4UCtIZ2ZhalpSUmlkaFcrbWUKei9DaVZYMThKWXB2TDdURno0UXVLLzBOVVJCcysxOGJ2QnQreGE0N21BRXhrdjhMVi9TYXNybFg2YXZ2RFhiUgo4Tzcwem9hbjRHN3B0R21oMzJuMk04WnBMcGNUbnFXSHNGY1FnVGZKVTdPN2YvYVMwWnpRR1BTU2J0cURUNlpqCm1VeWwrMTd2SVdSNklGOXNaSVVWeXpmcFlnd0xLaGJjQVM0eTJqNUw5WjQ2OWhkQWxPK2VrUWlHK3I1anFGb3oKN010MFE1WDViR2xTTnNjcGIveFZBMXdmKzUrOVIrdm5TVWVWQzA2SklnbEo0UFZoSHZHL0xvcHlib0JaLzFjNgorWFV5bzA1ZjdPMG9ZdGxOYy9MTWdSZGc3YzNyM051bnlzVitBcjN5VkFoVS9iUXRDU3dYVkVxWTBWVGhVV2NJCjB1MXVmbTgvMGkyQldTbG15NUE1bFJFZWRDZiszZXV2QWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUIKQWY4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUIwR0ExVWREZ1FXQkJTd0RQQk1NUFFGV0FKSS9UUGxVcTlMaE9ObQpVakFOQmdrcWhraUc5dzBCQVF3RkFBT0NBZ0VBcXFpQWp3NTRvK0NpMU0zbTlaaDZPK29BQTdDWERwTzhXcWoyCkxJeHloNm14L0g5ei9XTnhlS1dIV2M4dzRRMFFzaE5hYllMMWF1YUFuNkFGQzJqa1IydkhhdCsyL1hjeWN1VVkKK2duMG9KTXNYZEtNZFlWMlpaQU1BM20zTVNOanJYaURDWVpvaE1yLytjOG1tcEo1NTgxTHhlZGhweGZMODZrUwprNU5ycCtndlU1TEVZRml3ekFKUkdGdUZqV0paWTdhdHRONmEreWIzQUNmQVhWVTNkSm5KVUgvaldTNUU0eXdsCjd1eE1NbmUwbnhycFMxMGd4ZHI5SEljV3hrUG8xTHNtbWtWd1hxa0xOMVBpUm5zbi9lQkc4b20zekVLMnl5Z20KYnRtbHlUcklRUk5nOTFDTUZhNnliUm9WR2xkNDVwSXEyV1dRZ2o5c0FxK3VFam9ubGpZRTF4MmlnR09wbS9IbAp1clI4RkxCT3liRWZkRjg0OWxIcW0vb3NvaEhVcVMwbkdrV3hyN0pPY1EzQVdFYldhUWJMVTh1ei9tdEJ6VUYrCmZVd1BmSEo1ZWxuTlhrb09ySnVwbUhONWZMVDB6TG00Qnd5eWRGeTR4MitJb1pDbjlLcjV2MmM2OUJvVlloNjMKbjc0OXNTbXZaNkVTOGxnUUdWTURNQnU0R29uMm5MMlhBNDZqQ2ZNZGl5SHh0Ti9rSE5HZlpRSUc2bHpXRTdPRQo3NktsWEl4M0thZG93R3V1UU5Lb3RPck44STFMT0p3Wm1oc29WTGlKa08vS2RZRStIdkprSk1jWXIwNy9SNTRICjlqVmxwTk1LVnYvMUYyUnM3NmdpSlVtVHR0OEFGOXBZZmwzdXhSdXcwZEZmSVJESCtmTzZBZ29uQjhYeDFzZlQKNFBzSllHdz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFtYXpvbiBSb290IENBIDMgTz1BbWF6b24KIyBTdWJqZWN0OiBDTj1BbWF6b24gUm9vdCBDQSAzIE89QW1hem9uCiMgTGFiZWw6ICJBbWF6b24gUm9vdCBDQSAzIgojIFNlcmlhbDogMTQzMjY2OTg2Njk5MDkwNzY2Mjk0NzAwNjM1MzgxMjMwOTM0Nzg4NjY1OTMwCiMgTUQ1IEZpbmdlcnByaW50OiBhMDpkNDplZjowYjpmNzpiNTpkODo0OTo5NToyYTplYzpmNTpjNDpmYzo4MTo4NwojIFNIQTEgRmluZ2VycHJpbnQ6IDBkOjQ0OmRkOjhjOjNjOjhjOjFhOjFhOjU4Ojc1OjY0OjgxOmU5OjBmOjJlOjJhOmZmOmIzOmQyOjZlCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxODpjZTo2YzpmZTo3YjpmMTo0ZTo2MDpiMjplMzo0NzpiODpkZjplODo2ODpjYjozMTpkMDoyZTpiYjozYTpkYToyNzoxNTo2OTpmNTowMzo0MzpiNDo2ZDpiMzphNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQnRqQ0NBVnVnQXdJQkFnSVRCbXlmMVhTWE5tWS9Pd3VhMmVpZWRnUHlTakFLQmdncWhrak9QUVFEQWpBNQpNUXN3Q1FZRFZRUUdFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJrd0Z3WURWUVFERXhCQmJXRjZiMjRnClVtOXZkQ0JEUVNBek1CNFhEVEUxTURVeU5qQXdNREF3TUZvWERUUXdNRFV5TmpBd01EQXdNRm93T1RFTE1Ba0cKQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHZiakVaTUJjR0ExVUVBeE1RUVcxaGVtOXVJRkp2YjNRZwpRMEVnTXpCWk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQkNtWHA4WkJmOEFObStnQkcxYkc4bEtsCnVpMnlFdWpTTHRmNnljWFlxbTBmYzRFN081aHJPWHd6cGNWT2hvNkFGMmhpUlZkOVJGZ2RzemZsWndqclp0NmoKUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUIwR0ExVWREZ1FXQkJTcgp0dHZYQnA0M3JEQ0dCNUZ3eDV6RUdiRjR3REFLQmdncWhrak9QUVFEQWdOSkFEQkdBaUVBNElXU294ZTNqZmtyCkJxV1RyQnFZYUdGeSt1R2gwUHNjZUdDbVE1bkZ1TVFDSVFDY0F1L3hsSnl6bHZucnhpcjR0aXorT3BBVUZ0ZU0KWXlSSUhOOHdmZFZvT3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QW1hem9uIFJvb3QgQ0EgNCBPPUFtYXpvbgojIFN1YmplY3Q6IENOPUFtYXpvbiBSb290IENBIDQgTz1BbWF6b24KIyBMYWJlbDogIkFtYXpvbiBSb290IENBIDQiCiMgU2VyaWFsOiAxNDMyNjY5ODk3NTgwODA3NjM5NzQxMDUyMDA2MzA3NjM4Nzc4NDkyODQ4NzgKIyBNRDUgRmluZ2VycHJpbnQ6IDg5OmJjOjI3OmQ1OmViOjE3OjhkOjA2OjZhOjY5OmQ1OmZkOjg5OjQ3OmI0OmNkCiMgU0hBMSBGaW5nZXJwcmludDogZjY6MTA6ODQ6MDc6ZDY6Zjg6YmI6Njc6OTg6MGM6YzI6ZTI6NDQ6YzI6ZWI6YWU6MWM6ZWY6NjM6YmUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGUzOjVkOjI4OjQxOjllOmQwOjIwOjI1OmNmOmE2OjkwOjM4OmNkOjYyOjM5OjYyOjQ1OjhkOmE1OmM2Ojk1OmZiOmRlOmEzOmMyOjJiOjBiOmZiOjI1Ojg5OjcwOjkyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCOGpDQ0FYaWdBd0lCQWdJVEJteWYxOEc3RUV3cFErVnhlM3NzeUJyQkRqQUtCZ2dxaGtqT1BRUURBekE1Ck1Rc3dDUVlEVlFRR0V3SlZVekVQTUEwR0ExVUVDaE1HUVcxaGVtOXVNUmt3RndZRFZRUURFeEJCYldGNmIyNGcKVW05dmRDQkRRU0EwTUI0WERURTFNRFV5TmpBd01EQXdNRm9YRFRRd01EVXlOakF3TURBd01Gb3dPVEVMTUFrRwpBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBb1RCa0Z0WVhwdmJqRVpNQmNHQTFVRUF4TVFRVzFoZW05dUlGSnZiM1FnClEwRWdOREIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJOS3JpamRQbzFNTi9zR0tlMHVvZTBaTFk3QmkKOWkwYjJ3aHhJZElBNkdPOW1pZjc4RGx1WGVvOXBjbUJxcU5iSUpoRlhSYmIvZWdRYmVPYzRPTzlYNFJpODNCawpNNkRMSkM5d3VvaWhLcUIxK0lHdVlnYkVnZHM1Ymltd0h2b3VYS05DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QU9CZ05WSFE4QkFmOEVCQU1DQVlZd0hRWURWUjBPQkJZRUZOUHN4enBsYnN6aDJuYWFWdnVjODRadFYrV0IKTUFvR0NDcUdTTTQ5QkFNREEyZ0FNR1VDTURxTElmRzlmaEd0ME85WWxpL1c2NTEra0kwcnoyWlZ3eXpqS0tsdwpDa2NPOERkWkV2OHRtWlFvVGlwUE5VMHpXZ0l4QU9wMUFFNDd4RHFVRXBISldFYWRJUk55cDRpY2l1Uk1TdHVXCjFLeUxhMnRKRWxNenJkZmt2aVQ4dFFwMjFLVzhFQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1MdXhUcnVzdCBHbG9iYWwgUm9vdCAyIE89THV4VHJ1c3QgUy5BLgojIFN1YmplY3Q6IENOPUx1eFRydXN0IEdsb2JhbCBSb290IDIgTz1MdXhUcnVzdCBTLkEuCiMgTGFiZWw6ICJMdXhUcnVzdCBHbG9iYWwgUm9vdCAyIgojIFNlcmlhbDogNTk5MTQzMzgyMjU3MzQxNDcxMjM5NDEwNTgzNzY3ODgxMTAzMDU4MjI0ODk1MjEKIyBNRDUgRmluZ2VycHJpbnQ6IGIyOmUxOjA5OjAwOjYxOmFmOmY3OmYxOjkxOjZmOmM0OmFkOjhkOjVlOjNiOjdjCiMgU0hBMSBGaW5nZXJwcmludDogMWU6MGU6NTY6MTk6MGE6ZDE6OGI6MjU6OTg6YjI6MDQ6NDQ6ZmY6NjY6OGE6MDQ6MTc6OTk6NWY6M2YKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU0OjQ1OjVmOjcxOjI5OmMyOjBiOjE0OjQ3OmM0OjE4OmY5Ojk3OjE2OjhmOjI0OmM1OjhmOmM1OjAyOjNiOmY1OmRhOjViOmUyOmViOjZlOjFkOmQ4OjkwOjJlOmQ1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGd3pDQ0E2dWdBd0lCQWdJVUNuNm0zMHRFbnRwcUpJV2U1cmdWMHhaL3U3RXdEUVlKS29aSWh2Y05BUUVMCkJRQXdSakVMTUFrR0ExVUVCaE1DVEZVeEZqQVVCZ05WQkFvTURVeDFlRlJ5ZFhOMElGTXVRUzR4SHpBZEJnTlYKQkFNTUZreDFlRlJ5ZFhOMElFZHNiMkpoYkNCU2IyOTBJREl3SGhjTk1UVXdNekExTVRNeU1UVTNXaGNOTXpVdwpNekExTVRNeU1UVTNXakJHTVFzd0NRWURWUVFHRXdKTVZURVdNQlFHQTFVRUNnd05USFY0VkhKMWMzUWdVeTVCCkxqRWZNQjBHQTFVRUF3d1dUSFY0VkhKMWMzUWdSMnh2WW1Gc0lGSnZiM1FnTWpDQ0FpSXdEUVlKS29aSWh2Y04KQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU5lRmw3OFJtT253WW9OTVBJZjVVMm8zQy9JUFBJZk9iOXdtS2IzRgppYnJKZ3ozMzdzcGJ4bTFKYzdUSlJxTWJOQk0vd1lsRlYvVFpzZnMyWlV2N0NPSkljUkhJYmp1ZW5kK0paVGVtCmhmWTdSQmkyeGpjd1lrU1NsMmw5UWpBazVBME1pV3RqM3NYaDMwNnBGR3hUNEdITzloY3ZIVHk5NWlKTUhaUDEKRU1TaGR1eHEzc1ZzMzVhMFZrQkN3R0tTTUtFdEZaU2cwaUFHQ1c1cWJlWHJ0NzdVOFBFVmZJdm1Ucm9UekVzbgpYcGs4RjEyUGdYOHpQVS9UUHh2c1hEL3dQRXgxYnZLbTFaM2FMUWRqQXNaeTZaUzhURW1WVDRoU3lOdm9hWUw0CnpEUmJJdkNHcDRtOVNBcHRab0Z0eU1oayt3SGg5T0hlMlo3ZDIxdlVLcGttRlJzZVRKSXBncDdWa29HU1FYQVoKOTZUbGswdThkMmN4M1J6OU1YQU5GNWtNK1F3NUdTb1h0VEJ4VmRVUHJsamhQUzgwbTgrZjluaUZ3cE42Y2o1bQpqNXdXRVdDUG5vbHZaNzdnUjFvN0RKcG5pODlHeHE0NG8vS252T2JXaFdzekpIQWlTOHNJbTd2SStBSXBIYjRnCkRFYS9hNGVic3lwbVFqVkdiS3E2cmZtWWUrbFFWUlF4djdIYUxlMkFyV2drKzJtcjJIRVRNT1puczRkQS9ZbCsKOGtQUkVkOHZaUzlremw4VXViRy9NYjJIZUZwWlpZaXEvRmt5U0liV1RMa3BTNVhUZHZOM0pXMUNIRGlEVGYyagpYNXQvTGF4NUd3NUNNWmRqcFB1S2FkVWlEVFNRTUM2b3RPQnR0cFNzdkl0TzEzRDh4VGlPWkNYaFRUbVF6c21ICmhGaHhBZ01CQUFHamdhZ3dnYVV3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekJDQmdOVkhTQUVPekE1TURjR0J5dUIKS3dFQkFRb3dMREFxQmdnckJnRUZCUWNDQVJZZWFIUjBjSE02THk5eVpYQnZjMmwwYjNKNUxteDFlSFJ5ZFhOMApMbXgxTUE0R0ExVWREd0VCL3dRRUF3SUJCakFmQmdOVkhTTUVHREFXZ0JUL0dDaDIrVWdGTEtHdThTc2JLN0pUCitFdDhzekFkQmdOVkhRNEVGZ1FVL3hnb2R2bElCU3locnZFckd5dXlVL2hMZkxNd0RRWUpLb1pJaHZjTkFRRUwKQlFBRGdnSUJBR29aRk8xdWVjRXNoOVFOY0g3WDluakpDd1JPeExIT2szRCtzRlRBTXMyWk1HUVh2dy9sNGpQOQpCelpBY2c0YXRtcFoxZ0RsYUNEZExuSU5IMnBrTVNDRWZVbW1XamZyUmNtRjlkVEhGNWtINXB0VjVBem9xYlRPCmpGdTFFVnpQaWc0TjFxeDNnZjR5bkNTZWNzNVU4OUJ2b2xiVzdNTTNMR1ZZdmxjQUd2STErdXQ3TVYzQ3dSSTkKbG9HSWxvbkJXVng2NW45d05PZUQ0ckhoNGJoWTc5U1Y1R0NjOEphWGNvenJoQUl1Wlkra3Q5Si9aOTNJMDU1YwpxcW1rb0NVVUJwdnNUMzR0QzM4ZGRmRXoyTzNPdUhWdFBsdTVtQjB4RFZiWVF3OHdrYklFYTkxV3ZwV0FWV2UrCjJNMkQyUmp1TGcrR0xaS2VjQlBzM2xISlEzZ0NwVTNJK1YvRWtWaEdGbmRhZEtwQXZBZWZNTG14OXhJWDNlUC8KSkVBZGVtclJUeGdLcXBBZDYwQWUzNkVlUkpJUW12S040ZEZMUnA3b1JVS1g2a1daOCt4bTFRTDY4cVpLSktyZQp6cm5LK1QrVGIvbWp1dXFsUHBtdC9mOTdtZlZsN3ZCWktHZlhrSldrRTRTcGhNSG96czUxazJNYXZEenExV1FmCkxTb1NPY2JEV2pMdFI1RVdEcnc0d1ZEZWo4b3FrRFFjN2tHVW5GNFpMdmhGU1psMGtiQUViK01FV3JHcktxdisKeDlDV3R0cmhTbVFHYm1CTnZVSk8vM2phSk1vYnROZVdPV3l1OFE2cXAzMUlpeUJNejJUV3VKZEdzRTdSS2xZNgpvSk85cjRBazRBcCs1OHJWeXVpRlZkdzJLdUdVYUpQSFpuSkVENEFoTW13bHh5T0Fnd3JyCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UVUJJVEFLIEthbXUgU00gU1NMIEtvayBTZXJ0aWZpa2FzaSAtIFN1cnVtIDEgTz1UdXJraXllIEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsgT1U9S2FtdSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkgLSBLYW11IFNNCiMgU3ViamVjdDogQ049VFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxIE89VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLIE9VPUthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTQojIExhYmVsOiAiVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogZGM6MDA6ODE6ZGM6Njk6MmY6M2U6MmY6YjA6M2I6ZjY6M2Q6NWE6OTE6OGU6NDkKIyBTSEExIEZpbmdlcnByaW50OiAzMTo0Mzo2NDo5YjplYzpjZToyNzplYzplZDozYTozZjowYjo4ZjowZDplNDplODo5MTpkZDplZTpjYQojIFNIQTI1NiBGaW5nZXJwcmludDogNDY6ZWQ6YzM6Njg6OTA6NDY6ZDU6M2E6NDU6M2Y6YjM6MTA6NGE6Yjg6MGQ6Y2E6ZWM6NjU6OGI6MjY6NjA6ZWE6MTY6Mjk6ZGQ6N2U6ODY6Nzk6OTA6NjQ6ODc6MTYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVZekNDQTB1Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCMGpFTE1Ba0dBMVVFQmhNQ1ZGSXgKR0RBV0JnTlZCQWNURDBkbFlucGxJQzBnUzI5allXVnNhVEZDTUVBR0ExVUVDaE01VkhWeWEybDVaU0JDYVd4cApiWE5sYkNCMlpTQlVaV3R1YjJ4dmFtbHJJRUZ5WVhOMGFYSnRZU0JMZFhKMWJYVWdMU0JVVlVKSlZFRkxNUzB3Ckt3WURWUVFMRXlSTFlXMTFJRk5sY25ScFptbHJZWE41YjI0Z1RXVnlhMlY2YVNBdElFdGhiWFVnVTAweE5qQTAKQmdOVkJBTVRMVlJWUWtsVVFVc2dTMkZ0ZFNCVFRTQlRVMHdnUzI5cklGTmxjblJwWm1scllYTnBJQzBnVTNWeQpkVzBnTVRBZUZ3MHhNekV4TWpVd09ESTFOVFZhRncwME16RXdNalV3T0RJMU5UVmFNSUhTTVFzd0NRWURWUVFHCkV3SlVVakVZTUJZR0ExVUVCeE1QUjJWaWVtVWdMU0JMYjJOaFpXeHBNVUl3UUFZRFZRUUtFemxVZFhKcmFYbGwKSUVKcGJHbHRjMlZzSUhabElGUmxhMjV2Ykc5cWFXc2dRWEpoYzNScGNtMWhJRXQxY25WdGRTQXRJRlJWUWtsVQpRVXN4TFRBckJnTlZCQXNUSkV0aGJYVWdVMlZ5ZEdsbWFXdGhjM2x2YmlCTlpYSnJaWHBwSUMwZ1MyRnRkU0JUClRURTJNRFFHQTFVRUF4TXRWRlZDU1ZSQlN5QkxZVzExSUZOTklGTlRUQ0JMYjJzZ1UyVnlkR2xtYVd0aGMya2cKTFNCVGRYSjFiU0F4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFyM1V3TTZxNwphOU9aTEJJM2hObU5lNWVBMDI3bi81dFFsVDZRbFZaQzF4bDhKb1NOa3ZvQkhUb1A0bVE0dDR5ODZJajVpeVNyCkxxUDFOK1JBamhnbGVZTjFIenYvYktqRnhsYjR0TzJLUktPcmJFejhIZERjNzJpOXorU3F6dkJWOTZJMDFJTnIKTjN3Y3d2NjFBK3hYenJ5MHRjWHRBQTlUTnlwTjlFOE1nL3VHejh2K2pFNjloL21uaXlGWG5IcmZBMmVKTEoyWApZYWNRdUZXUWZ3NHRKemgwMytmOTJrNFM0MDBWSWdMSTRPRDhENjJLMThsVVVNdzdEOG9XZ0lUUVVWYkRqbFovCmlTSXpMK2FGQ3IybHFCczIzdFBjTEcwN3h4TzlXU01zNXVXazk5Z0w3ZXFRUUVTb2xidVQxZENBTkxaR2VBNGYKQUpORzRlN3ArZXhQRndJREFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVVpUL0hpb2JHUE4wOFZGdzErRHJ0VWd4SApWOGd3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVMCkJRQURnZ0VCQUNvLzRmRXlqcTdobUZ4TFhzOXJIbW9KMGlLcEVzZGVWMzF6Vm1TQWhIcVQ1QW01RU0yZktpZmgKQUhlK1NNZzFxSUdmNUxnc3lYOE9zTkpMTjEzcXVkVUxYalM5OUhNcHcrMG1GWngrQ0ZPS1dJM1FTeWpmd2JQZgpJUFA1NCtNNjM4eWNsTmhPVDhOckY3ZjNjdWl0WmpPMUpWT3I0UGhNcVozOThnMjZycm5acXNacitaTzdycXU0Cmx6d0RHcnBEeHBhNVJYSTRzNmVobGoyUmUzN0FJVk5NaCszeUMxU1ZVWlBWSXFVTml2R1REajVVRHJEWXlVN2MKOGpFeVZ1cGsrZXExblJabVFuTHpmOU94TVVQOHBJNFg4VzBqcTVSbStLMzdEd2h1SmkxL0Z3Y0pzb3o3VU1DZgpsbzNQdHYwQW5Wb1VtcjhDUlBYQndwOGlYcUlQb2VNPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R0RDQSBUcnVzdEFVVEggUjUgUk9PVCBPPUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuCiMgU3ViamVjdDogQ049R0RDQSBUcnVzdEFVVEggUjUgUk9PVCBPPUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuCiMgTGFiZWw6ICJHRENBIFRydXN0QVVUSCBSNSBST09UIgojIFNlcmlhbDogOTAwOTg5OTY1MDc0MDEyMDE4NgojIE1ENSBGaW5nZXJwcmludDogNjM6Y2M6ZDk6M2Q6MzQ6MzU6NWM6NmY6NTM6YTM6ZTI6MDg6NzA6NDg6MWY6YjQKIyBTSEExIEZpbmdlcnByaW50OiAwZjozNjozODo1Yjo4MToxYToyNTpjMzo5YjozMTo0ZTo4MzpjYTplOTozNDo2Njo3MDpjYzo3NDpiNAojIFNIQTI1NiBGaW5nZXJwcmludDogYmY6ZmY6OGY6ZDA6NDQ6MzM6NDg6N2Q6NmE6OGE6YTY6MGM6MWE6Mjk6NzY6N2E6OWY6YzI6YmI6YjA6NWU6NDI6MGY6NzE6M2E6MTM6Yjk6OTI6ODk6MWQ6Mzg6OTMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZpRENDQTNDZ0F3SUJBZ0lJZlFtWC92Qkg2bm93RFFZSktvWklodmNOQVFFTEJRQXdZakVMTUFrR0ExVUUKQmhNQ1EwNHhNakF3QmdOVkJBb01LVWRWUVU1SElFUlBUa2NnUTBWU1ZFbEdTVU5CVkVVZ1FWVlVTRTlTU1ZSWgpJRU5QTGl4TVZFUXVNUjh3SFFZRFZRUUREQlpIUkVOQklGUnlkWE4wUVZWVVNDQlNOU0JTVDA5VU1CNFhEVEUwCk1URXlOakExTVRNeE5Wb1hEVFF3TVRJek1URTFOVGsxT1Zvd1lqRUxNQWtHQTFVRUJoTUNRMDR4TWpBd0JnTlYKQkFvTUtVZFZRVTVISUVSUFRrY2dRMFZTVkVsR1NVTkJWRVVnUVZWVVNFOVNTVlJaSUVOUExpeE1WRVF1TVI4dwpIUVlEVlFRRERCWkhSRU5CSUZSeWRYTjBRVlZVU0NCU05TQlNUMDlVTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGCkFBT0NBZzhBTUlJQ0NnS0NBZ0VBMmFNVzhNaDBkSGViN3pNTk93WitWZnkxWUk5MmhoSkNmVlptUG9pQzdYSmoKRHA2TDNUUXNBbEZSd3huOVdWU0V5ZkZyczB5dzZlaEdYVGpHb3FjdUVWZTZnaFdpbkk5dHNKbEtDdkxyaVhCagpUbm5FdDF1OW9sMng4a0VDSzYycE9xUHNlUXJzWHpyai9lK0FQSzAwbXhxcmlDWjdWcUtDaGgvck5ZbURmMSt1CktVNDl0bTdzcnNId0o1dXU0L1RzNzY1Lzk0WTljbnJycGZ0WlRxZnJsWXdpT1huaExRaVB6THlSdUVIM0ZNRWoKcWNPdG1rVkVzN0xYTE0zR0tlSlFFSzVjeTRLT0Z4ZzJmWmZtaUpxd1RUUUo5Q3k1V21ZcXNCZWJuaDUyblVwbQpNVUhmUC92RkJ1OGJ0bjRhUmpiM1pHTTc0emtZSStkbmRSVFZkVmVTTjcyK2Foc21VUEkySmdhUXhYQUJaRzEyClp1R1IyMjRId0dHQUxySXVMNHh3cDlFN1BMT1I1RzYyeER0dzhteVNsd25OUjMwWXdQTzduZy9XaTY0SHRsb1AKemdzTVI2ZmxQcmk5ZmNlYk5hQmhsenBCZFJmTUs1WjNLcEloSHRtVmRpQm5hTThOdmQvV0h3bHFtdUxNYzNHawpMMzBTZ0xkVE1FWmVTMVNaRDJmSnBjanlJTUdDN0owUjM4SUMreG83MGUwZ211OWxaSklRRFNyaTNuRHhHR2VDCmpHSGV1THpSTDV6N0Q5QXI3UnQydWVRNVZmajRvUjI0cW9BQVRJTG5zbjhKdUx3d29DOE45VktlanZlU3N3b0EKSFFCVWx3YmdzUWZaeHc5Y1pYMDhiVmxYNU8ybGplbEFVNThWUzZCeDlob2g0OXB3QmlGWUZJZUZkM21xZ25rQwpBd0VBQWFOQ01FQXdIUVlEVlIwT0JCWUVGT0xKUUo5Tnp1aWFvWHpQRGo5bHhTbUlhaGxSTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFEUlNWZmcKcDh4b1dMb0JEeXNaelkyd1lVV3NFZTFqVUduNEgzKytGby85bmVzTHFqSkhkdEpuSk8yOWZETXlseXJIQllabQpEUmQ5RkJVYjFPdjlINXIyWHBkcHR4b2xwQXF6a1Q5Zk5xeUw3RmVvUHVlQmloaFhPWVYwR2tMSDZWc1RYNC81CkNPbVNkSTMxUjlLck85YjdlR1pPTm4zNTZaTHBCTjc5U1dQOGJmc1VjWk5uTDBkS3Q3bi9IaXB6Y0VZd3YxcnkKTDNtbDRZME0yZm15WXplTU4yV0ZjR3BjV3dseXVhMWpQTEhkK1B3eXZ6ZUc1THVPbUNkK3VoOFc0WEFSOGdQZgpKV0l5SnlZWU1vU2Yvd0E2RTdxYVRmUlB1QlJ3SXJIS0s1RE9LY0Z3OUMrZGYvS1FIdFphMzdkRy9PYUcrc3ZnCklIWjZ1cWJMOVh6ZVlxV3hpKzdlZ21hS1Rqb3dIeitBeTYwbnVneGUxOUN4VnNwM2NiSzFkYUZRcVVCREY4SW8KMmM5U2kxdklZOVJDUHFBemVrWXU5d29nUmxSK2FrOHg4WUYrUW5RNFpYTW43c1o4dUk3WHBUclhtS0djakJCVgowOXRMN0VDUThzMXVWOUppRG54WGs3R25iYzJkZzdzcTUrVzJPM0ZZcmYzUlJieGFrZTVURlcvVFJRbDFicnFRClhSNEV6emZmSHFobXNZem1JR3J2L0VoT2RKaENyeWx2TG1ySCszM1JaakVpeklZQWZtYURERUwwdlRTU3d4cnEKVDhwK2NrMExjSXltU0x1bW9SVDIrMWhFbVJTdXFndVRhYUFwSlVxbHl5dmRpbVlIRm5nVlYzRWI3UFZIaFBPZQpNVGQ2MVg4a3JlUzgvZjNNYm9Qb0RLaTNRV3dIM2IwOGhwY3YwZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UcnVzdENvciBSb290Q2VydCBDQS0xIE89VHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuIE9VPVRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPVRydXN0Q29yIFJvb3RDZXJ0IENBLTEgTz1UcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4gT1U9VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiMgTGFiZWw6ICJUcnVzdENvciBSb290Q2VydCBDQS0xIgojIFNlcmlhbDogMTU3NTI0NDQwOTU4MTEwMDY0ODkKIyBNRDUgRmluZ2VycHJpbnQ6IDZlOjg1OmYxOmRjOjFhOjAwOmQzOjIyOmQ1OmIyOmIyOmFjOjZiOjM3OjA1OjQ1CiMgU0hBMSBGaW5nZXJwcmludDogZmY6YmQ6Y2Q6ZTc6ODI6Yzg6NDM6NWU6M2M6NmY6MjY6ODY6NWM6Y2E6YTg6M2E6NDU6NWI6YzM6MGEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGQ0OjBlOjljOjg2OmNkOjhmOmU0OjY4OmMxOjc3OjY5OjU5OmY0OjllOmE3Ojc0OmZhOjU0Ojg2Ojg0OmI2OmM0OjA2OmYzOjkwOjkyOjYxOmY0OmRjOmUyOjU3OjVjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTURDQ0F4aWdBd0lCQWdJSkFOcWI3SEh6QTdBWk1BMEdDU3FHU0liM0RRRUJDd1VBTUlHa01Rc3dDUVlEClZRUUdFd0pRUVRFUE1BMEdBMVVFQ0F3R1VHRnVZVzFoTVJRd0VnWURWUVFIREF0UVlXNWhiV0VnUTJsMGVURWsKTUNJR0ExVUVDZ3diVkhKMWMzUkRiM0lnVTNsemRHVnRjeUJUTGlCa1pTQlNMa3d1TVNjd0pRWURWUVFMREI1VQpjblZ6ZEVOdmNpQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGt4SHpBZEJnTlZCQU1NRmxSeWRYTjBRMjl5CklGSnZiM1JEWlhKMElFTkJMVEV3SGhjTk1UWXdNakEwTVRJek1qRTJXaGNOTWpreE1qTXhNVGN5TXpFMldqQ0IKcERFTE1Ba0dBMVVFQmhNQ1VFRXhEekFOQmdOVkJBZ01CbEJoYm1GdFlURVVNQklHQTFVRUJ3d0xVR0Z1WVcxaApJRU5wZEhreEpEQWlCZ05WQkFvTUcxUnlkWE4wUTI5eUlGTjVjM1JsYlhNZ1V5NGdaR1VnVWk1TUxqRW5NQ1VHCkExVUVDd3dlVkhKMWMzUkRiM0lnUTJWeWRHbG1hV05oZEdVZ1FYVjBhRzl5YVhSNU1SOHdIUVlEVlFRRERCWlUKY25WemRFTnZjaUJTYjI5MFEyVnlkQ0JEUVMweE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQgpDZ0tDQVFFQXY0NjNsZUxDSmhKck14bkhRRmdLcTFtcWpRQ2ovSURIVUh1TzFDQW11aklTMkNOVVNTVVFJcGlkClJ0TEJ5WjVPR3k0c0RqanpHaVZvSEtaYUJlWWVpMGkvbUpaMFBtbks2YlY0cFFhODFRQmVDUXJ5SjNwUy9DM1YKc2VxMGlXRWs4eG9UMjZuUFV1ME1KTHE1bnV4K0FIVDZrNjFzS1pLdVViUzcwMWUvcy9Pb2paejBKRXNxMXBtZQo5Sjcrd0g1Q091Y0xsVlBhdDJnT2tFejdjRCtQU2l5VTh5YmRZMm1wbE5nUVRzVkhDSkNaR3hkTnVXeHU3MkNWCkVZNGhnTFc5b0hQWTBMSjN4RVhxV2liN1puWjIrQVlmWVcwUFZjV0R0eEJXY2dZSHBmT3hHZ01GWkE2ZFdvclcKaG5BYkpONytLSW9yMEdxdy9IcWkzTEo1RG90bER3SURBUUFCbzJNd1lUQWRCZ05WSFE0RUZnUVU3bXRKUEhvLwpEZU94Q2JlS3lLc1puM016VU9jd0h3WURWUjBqQkJnd0ZvQVU3bXRKUEhvL0RlT3hDYmVLeUtzWm4zTXpVT2N3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3RFFZSktvWklodmNOQVFFTEJRQUQKZ2dFQkFDVVkxSkdQRSs2UEhoMFJVOW90UkNrWm9CNXJNWjVORHA2dFBWeEJiNVVySktGNW1EbzROdnU3WnA1SQovNUNRN3ozVXVKdTBoM1UvSUp2T2NzK2hWY0ZOWktJWkJxRUhNd3dMS2VYeDZxdWo3TFVLZEpESGZYTHkxMXlmCmtlK1JpN2ZjN1dhaXo0NW1PN3lmT2dMZ0o5MFdtTUNWMUFxazVJR2FkWlExbkpCZmlEY0dyVm1WQ3JEUlo5TVoKeW9ubk1sbzJIRDZDcUZxVHZzYlFaSkcyejltMkdNL2JmdEpsbzZiRWpoY3h3ZnQrZHR2VGhlTllzbmQ2ZGp0cwpMMUFjNTl2Mloza2Y5WUtWbWdlbkZLK1AzQ2doWnduUzFrMWFIQmtjam5kY3c1UWtQVEpyUzM3VWVKU0R2amROCnpsL0hIazQ4NElremxRc1BwVExXUEZwNUxCaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRydXN0Q29yIFJvb3RDZXJ0IENBLTIgTz1UcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4gT1U9VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiMgU3ViamVjdDogQ049VHJ1c3RDb3IgUm9vdENlcnQgQ0EtMiBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBMYWJlbDogIlRydXN0Q29yIFJvb3RDZXJ0IENBLTIiCiMgU2VyaWFsOiAyNzExNjk0NTEwMTk5MTAxNjk4CiMgTUQ1IEZpbmdlcnByaW50OiBhMjplMTpmODoxODowYjpiYTo0NTpkNTpjNzo0MToyYTpiYjozNzo1Mjo0NTo2NAojIFNIQTEgRmluZ2VycHJpbnQ6IGI4OmJlOjZkOmNiOjU2OmYxOjU1OmI5OjYzOmQ0OjEyOmNhOjRlOjA2OjM0OmM3Ojk0OmIyOjFjOmMwCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwNzo1MzplOTo0MDozNzo4YzoxYjpkNTplMzo4Mzo2ZTozOTo1ZDphZTphNTpjYjo4Mzo5ZTo1MDo0NjpmMTpiZDowZTphZToxOTo1MTpjZjoxMDpmZTpjNzpjOTo2NQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR0x6Q0NCQmVnQXdJQkFnSUlKYUhmeWpQTFdRSXdEUVlKS29aSWh2Y05BUUVMQlFBd2dhUXhDekFKQmdOVgpCQVlUQWxCQk1ROHdEUVlEVlFRSURBWlFZVzVoYldFeEZEQVNCZ05WQkFjTUMxQmhibUZ0WVNCRGFYUjVNU1F3CklnWURWUVFLREJ0VWNuVnpkRU52Y2lCVGVYTjBaVzF6SUZNdUlHUmxJRkl1VEM0eEp6QWxCZ05WQkFzTUhsUnkKZFhOMFEyOXlJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVRFZk1CMEdBMVVFQXd3V1ZISjFjM1JEYjNJZwpVbTl2ZEVObGNuUWdRMEV0TWpBZUZ3MHhOakF5TURReE1qTXlNak5hRncwek5ERXlNekV4TnpJMk16bGFNSUdrCk1Rc3dDUVlEVlFRR0V3SlFRVEVQTUEwR0ExVUVDQXdHVUdGdVlXMWhNUlF3RWdZRFZRUUhEQXRRWVc1aGJXRWcKUTJsMGVURWtNQ0lHQTFVRUNnd2JWSEoxYzNSRGIzSWdVM2x6ZEdWdGN5QlRMaUJrWlNCU0xrd3VNU2N3SlFZRApWUVFMREI1VWNuVnpkRU52Y2lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hIekFkQmdOVkJBTU1GbFJ5CmRYTjBRMjl5SUZKdmIzUkRaWEowSUVOQkxUSXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUsKQW9JQ0FRQ25JRzdDS3FKaUpKV1Fkc2c0Zm9EU3E4R2JaUVdVOU1FS0VOVUNyTzJmazhlSHlMQW5LMElNUFFvKwpRVnFlZGQyTnl1Q2I3R2d5cEdtU2FJd0xnUTVXb0Q0YTNTd2xGSUl2bDlOa1J2UlVxZHc2VkMweEs1bUM4dGtxCjErOXhBTGd4cEw1NkpBZkRRaUR5aXRTU0JCdGxWa3hzMVB1MllWcEhJN1RZYWJTM090QjBQQXgxb1l4T2RxSHAKMnlxbE8vck9zUDkrYWlqOUp4eklzZWtwOFZkdVpMVFF3UlZ0RHI0dURrYklYdlJSL3U4T1l6bzdjYnJQYjFuSwpET09iWFVtNFRPSlhzWmlLUWxlY2R1L3Z2ZEZvcU5MMENidDNOYjRsZ2dqRUZpeEVJRmFwUkJGMzcxMjBIYXBlCmF6NkxNdllITDFjRWtzcjEvcDNDNmVpempreExBakhaNUR4SWdpZjNHSUoyU0RweHNST2hPZFV1eFRUQ0hXS0YKM3dQK1RmU3ZQZDljVzQzNmNPR2xmaWZIaGk1cWp4TEdoRjVEVVZDY0dadDQ1dnoyN1VkK2V6MW03eE1UaUY4OApvV1A3K2F5SE5aL3pncDZrUHdxY01XbUxtYVNJU281dVprM3ZGc1FQZVNnaFlBMkZGbjNYVkRqeGtsYjl0VE5NCmc5elhFSjlML2NiNFFyMjZmSE1DNFA5OXpWdmgxS3hoZTFmVlNudGIxSVZZSjEyLytDdGdyS0FtcmhRaEo4WjMKbWpPQVBGNUdQL2ZEc2FPR004Ym9YZzI1TlN5cVJzR0ZBbldBb09zayt4V3E1R2QvYm5jLzlBU0tMM3g3NHhkaAo4TjBKcVNESXZnbWswSDVFdzdJd1NqaXFxZXdZbWdlQ0s5dTRuQml0MnVCR0Y2elBYUUlEQVFBQm8yTXdZVEFkCkJnTlZIUTRFRmdRVTJmNGhRRzZVbnJ5YlBaeDltQ0FaNVl3d1lySXdId1lEVlIwakJCZ3dGb0FVMmY0aFFHNlUKbnJ5YlBaeDltQ0FaNVl3d1lySXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVlZdwpEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBSjVGbmd3N3R1L2hPc2g4MFFBOXorTHFCcld5T3JzR1MyaDYwQ09YCmRLY3M4QWpZZVZyWFdvU0syQkthRzlsOVhFMXd4YVg1cStXamlZbmRBZnJzM2ZucGtwZmJzRVpDODlOaXFwWCsKTVdjVWFWaVFDcW9MN2pjangxQlJ0UFYrbnVONzkrVE1Rakl0U1F6TC8wa01teDQwL1c1dWxvcDVBN1p2MnduTAovVjlsRkRmaE9QWHpZUlpZNUxWdERRc0VHejlRTFgrengzb2FGb0JnK0lvZjZSc3F4dm02QVJwcHY5Sll4MVJYCkNJL2hPV0IzUzZ4WmhCcUk4ZDNMVDNqWDUrRXpMZnp1UWZvZ3NMN0w5emlVd09IUWhRKzc3U3h6cSszK2tuWWEKWkg5YkRUTUpCek43Qmo4UnBGeHdQSVhBeitPUXFJTjMrdHZteFl4b1p4Qm5wVkl0OE1TWmozKy8wV3ZpdFVmVwoyZENGbVUyVW13OUxqZTRBV2tjZEVRT3NRUml2aDdkdkREcVB5cy9jQThHaUNjamwvWUJleUdCQ0FSc2FVMXE3Ck42YTN2THFFNlI1c0d0UmsydFJEL3BPTFMvSXNlUllRMUpNTGlJK2gySVlVUnBGSG15Z2s3MWRTVGx4Q25LcjMKU2V3bjZFQWVzNmFKSW5LYzlRMHp0RmlqTUR2ZDFHcFVrNzRhVGZPVGxQZjhoQXMvaENCY05BTkV4ZHF0dkFyQgpBczhlNVpUWjg0NWIyRXp3bmV4aEY3c1VNbFFNQWltVEhwS0c5bi92NTVJRkRsbmRtUWd1THZxY0FGTFR4V1lwCjVLZVhSS1FPS0lFVE5jWDJiMlRtUWNUVkw4dzBSU1hQUVFDV1BVb3V3cGFZVDA1S25KZTMyeCtTTXNqL0QxRnUKMXV3SgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VHJ1c3RDb3IgRUNBLTEgTz1UcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4gT1U9VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiMgU3ViamVjdDogQ049VHJ1c3RDb3IgRUNBLTEgTz1UcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4gT1U9VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiMgTGFiZWw6ICJUcnVzdENvciBFQ0EtMSIKIyBTZXJpYWw6IDk1NDgyNDI5NDY5ODg2MjU5ODQKIyBNRDUgRmluZ2VycHJpbnQ6IDI3OjkyOjIzOjFkOjBhOmY1OjQwOjdjOmU5OmU2OjZiOjlkOmQ4OmY1OmU3OjZjCiMgU0hBMSBGaW5nZXJwcmludDogNTg6ZDE6ZGY6OTU6OTU6Njc6NmI6NjM6YzA6ZjA6NWI6MWM6MTc6NGQ6OGI6ODQ6MGI6Yzg6Nzg6YmQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDVhOjg4OjVkOmIxOjljOjAxOmQ5OjEyOmM1Ojc1OjkzOjg4OjkzOjhjOmFmOmJiOmRmOjAzOjFhOmIyOmQ0OjhlOjkxOmVlOjE1OjU4OjliOjQyOjk3OjFkOjAzOjljCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFSURDQ0F3aWdBd0lCQWdJSkFJU0NMRjhjWXRCQU1BMEdDU3FHU0liM0RRRUJDd1VBTUlHY01Rc3dDUVlEClZRUUdFd0pRUVRFUE1BMEdBMVVFQ0F3R1VHRnVZVzFoTVJRd0VnWURWUVFIREF0UVlXNWhiV0VnUTJsMGVURWsKTUNJR0ExVUVDZ3diVkhKMWMzUkRiM0lnVTNsemRHVnRjeUJUTGlCa1pTQlNMa3d1TVNjd0pRWURWUVFMREI1VQpjblZ6ZEVOdmNpQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGt4RnpBVkJnTlZCQU1NRGxSeWRYTjBRMjl5CklFVkRRUzB4TUI0WERURTJNREl3TkRFeU16SXpNMW9YRFRJNU1USXpNVEUzTWpnd04xb3dnWnd4Q3pBSkJnTlYKQkFZVEFsQkJNUTh3RFFZRFZRUUlEQVpRWVc1aGJXRXhGREFTQmdOVkJBY01DMUJoYm1GdFlTQkRhWFI1TVNRdwpJZ1lEVlFRS0RCdFVjblZ6ZEVOdmNpQlRlWE4wWlcxeklGTXVJR1JsSUZJdVRDNHhKekFsQmdOVkJBc01IbFJ5CmRYTjBRMjl5SUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVURVhNQlVHQTFVRUF3d09WSEoxYzNSRGIzSWcKUlVOQkxURXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEUGorQVJ0WitvZG5iYgozdzlVNzNOaktZS3RSOGFqYSszK1h6UDRRMUhwR2pPUk1SZWdkTVRVcHdIbXNwSSthcDN0RHZsMG1FRFRQd09BCkJvSkE2TEhpcDFHbkhZTW1hNnZlK2hlUks5akdyQjZ4bmhrQjFaZW02ZzIzeEZVZkozelNDTlYySHlrVmgwQTUKM1RoRkVYWFFtcWMwNEwvTnlGSWR1VWQrRGJpN3hnejJjMWNXV241RGtSOVZPc1p0UkFTcW5LbWNwMHlKRjRPdQpvd1JlVW9DTEhoSWxFUm5YREgxOU1VUkI2dHV2c0J6dmdkQXN4Wm9obXozdFFqdFFKdkxzem5GaEJtSWhWRTUvCndaMCtmeUNNZ01zcTJKZGl5SU16a1gyd29sb1BWK2c3elBJbHN0UjhMK3hOeHFFNkZYcm50bDAxOWZaSVNqWkYKWnRTNm1GakJBZ01CQUFHall6QmhNQjBHQTFVZERnUVdCQlJFbmtqMXpHMUkxS0JMZi81WkpDK0RsNW1haGpBZgpCZ05WSFNNRUdEQVdnQlJFbmtqMXpHMUkxS0JMZi81WkpDK0RsNW1haGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvCk1BNEdBMVVkRHdFQi93UUVBd0lCaGpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQUJUNDFYQlZ3bThuSGMyRnYKY2l2VXdvL3lRMTBDenNTVXVaUVJnMmRkNG1kc2RYYS91d3lxTnNhdFI1TmozQjUrMXQ0dS91a1pNamdEZnhUMgpBSE1zV2JFaEJ1SDdyQmlWREtQL21aYjNLeWViMVNUTUhkM0JPdUNZUkxERTVENTNzWE9wWkN6MkhBRjhQMTFGCmhjQ0Y1eVdQbGR3WDh6eWZHbTZ3eXVNZEt1bE1ZL29rWVdMVzJuNjJIR3oxQWgzVUt0MVZrT3NxRVVjOExsNTAKc29JaXBYMVRIMFhzSjVGOTV5SVc2TUJvTnRqRzhVK0FSREw1NGRIUkhhcmVxS3VjQksrdElBNWttRTJsYThCSQpXSlpwVGR3SGpGR1RvdCtmRHoyTFlMU0NqYW9JVG1KRjRQa0wwdURnUEZ2ZVhIRW5KY0xtQTRHTEVGUGp4MVdpCnRKL1g1Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIE89U1NMIENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSBPPVNTTCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSIKIyBTZXJpYWw6IDg4NzU2NDAyOTY1NTgzMTAwNDEKIyBNRDUgRmluZ2VycHJpbnQ6IDg2OjY5OjEyOmMwOjcwOmYxOmVjOmFjOmFjOmMyOmQ1OmJjOmE1OjViOmExOjI5CiMgU0hBMSBGaW5nZXJwcmludDogYjc6YWI6MzM6MDg6ZDE6ZWE6NDQ6Nzc6YmE6MTQ6ODA6MTI6NWE6NmY6YmQ6YTk6MzY6NDk6MGM6YmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDg1OjY2OjZhOjU2OjJlOmUwOmJlOjVjOmU5OjI1OmMxOmQ4Ojg5OjBhOjZmOjc2OmE4OjdlOmMxOjZkOjRkOjdkOjVmOjI5OmVhOjc0OjE5OmNmOjIwOjEyOjNiOjY5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGM1RDQ0E4V2dBd0lCQWdJSWV5eWIweGFBTXBrd0RRWUpLb1pJaHZjTkFRRUxCUUF3ZkRFTE1Ba0dBMVVFCkJoTUNWVk14RGpBTUJnTlZCQWdNQlZSbGVHRnpNUkF3RGdZRFZRUUhEQWRJYjNWemRHOXVNUmd3RmdZRFZRUUsKREE5VFUwd2dRMjl5Y0c5eVlYUnBiMjR4TVRBdkJnTlZCQU1NS0ZOVFRDNWpiMjBnVW05dmRDQkRaWEowYVdacApZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQlNVMEV3SGhjTk1UWXdNakV5TVRjek9UTTVXaGNOTkRFd01qRXlNVGN6Ck9UTTVXakI4TVFzd0NRWURWUVFHRXdKVlV6RU9NQXdHQTFVRUNBd0ZWR1Y0WVhNeEVEQU9CZ05WQkFjTUIwaHYKZFhOMGIyNHhHREFXQmdOVkJBb01EMU5UVENCRGIzSndiM0poZEdsdmJqRXhNQzhHQTFVRUF3d29VMU5NTG1OdgpiU0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUZKVFFUQ0NBaUl3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFQa1AzYU1yZmN2UUt2N3NaNFdtNXk0YnVuZmg0L1d2cE96NlNsMlIKeEZkSGF4aDNhM2J5L1pQa1BRL0NGcDRMWnNOV2xKNFhnNFhPVnUveUZ2MEFZdlVpQ1ZUb1pSZE9RYm5nVDBhWApxaHZJdUc1aVhtbXhYOXNxQW43OGJNcnpRZGp0ME9qOFAyRkk3YkFERkIwUURrc1o0THRPN0labC96YnpYbWNDCkM1MkdWV0g5ZWpqdC91SVpBTGR2b1ZCaWRYUThvUHJJSlpLMGJub2l4L2dlb2VPeTNaRXhxeXNkQlArbFNnUTMKNllXa015djk0dFpWTkh3WnBFcG94N0tvMDdmS29aT0k2OEdYdkl6NUhka2loQ1IweHdROWFxa3BrOHpydUZ2aAovbDhscWpSWXlNRWpWSjBibUJIRE9KeCtQWVpzcFE5QWhud0M5RndDVHlqTHJuR2ZEenJJTS80UkpUWHEvTHJGCllEM1pmQmpWc3FuVGRYZ0RjaUxLT3NNZjd5emxMcW42bml5MlVVYjlyd1BXNm1CbzZvVVdObXVGNlI3QXM5M0UKSk55QUtvRkJiWlEreU9ESmdVRUFubDYvZjhVSW1LSVlMRUpBcy9sdk9DZExUb0QwUFlGSDRJaDg2aHpPdFhWYwpVUzRjSzM4YWNpam5BTFhSZE1iWDVKK3RCNU8yVXpVMS9EZmt3L1pkRnI0aGM5NlNDdmlnWTJxOGxwSnFQdmk4ClpWV2IzdlVOaVNZRS9DVWFwaVZweThKdHluemlXVitYck92dkxzaTgxeHRaUEN2TThobklrMnNuWXhuUC9Pa20KK01weG0zK1QvalJuaEU2WjYveXplQWt6Y0xwbXBuYnRHM1ByR3FVTnhDSVRJSlJXQ2s0c2JFNngvYytjQ2JxaQpNKzJIQWdNQkFBR2pZekJoTUIwR0ExVWREZ1FXQkJUZEJBa0hvdlY2ZlZKVEVwS1Y3amlBSlEybVdUQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjhHQTFVZEl3UVlNQmFBRk4wRUNRZWk5WHA5VWxNU2twWHVPSUFsRGFaWk1BNEcKQTFVZER3RUIvd1FFQXdJQmhqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFJQmdSbENuN0pwMGNIaDV3WWZHVgpjcE54Sksxb2sxaU9NcThiczNBRC9DVXJkSVdRUFhocTlMbUxwWmM3dFJpUnV4Nm4rVUJia2ZsVm1hOGVFZEJjCkhhZG00N0dVQnd3eU9hYnFHN0I1MkIyY2NFVGppdDNFK1pVZmlqaERQd0dGcFVlblBVYXl2T1VpYVBkN25OZ3MKUGdvaHlDMHpyTC9GZ1preGRNRjFjY1crc2ZBalJmU2RhL3daWTUyanZBVEdHQXNsdTFPSkQ3T0FVTjVGN2tSLwpxNVI0WkpqVDlpamRoOWh3WlhUN0Rya1Q2NmNQWWFreWxzemV1KzFqVEJpN3FVRDNvRlJ1SUloeGRSanFlclEwCmN1QWpKM2RjdHBEcWhpVkFxKzh6RDh1ZmdyNmlJUHYydFMwYTVzS0ZzWFFQKzhobEFxUlNBVWZkU1NMQnY5anIKYTZ4KzN1eGpNeFczSXdpUHhnK05RVnJkanNXNWorVkZQM2pidXRJYlFMSCtjVTAvNElHaXVsNjA3QlhnazkwSQpIMzdoVlprTElkNlRuZ3I3NXFOSnZUWXcvdWQzc3FCMWw3VXRnWWdYWlNEMzJwQUFuOGxTekRMS05YejFQUS9ZCks5ZjFKbXpKQmpTV0Z1cHdXUm95ZVhrTHRvaC9EMUpJUGI5czJLSkVMdEZPdDNKWTA0a1RsZjVFcS9qWGl4dHUKbkx3c29GdlZhZ0N2WHpmaDFmb1FDNWljaHVjbWo4N3c3RzZLVnd1QTQwNnl3S0JqWVpDNlZXZzNkR3Eya3R1ZgpvWVlpdG1VbkR1eTJuMEpnNUdmQ3RkcEJDOFRUaTJFYnZQb2ZrU3ZYUkFkZXVpbXMyY1hwNzFOSVd1dUE4U2hZCkljMndCbFg3Sno5VGtIQ3BCQjVYSjdrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyBPPVNTTCBDb3Jwb3JhdGlvbgojIFN1YmplY3Q6IENOPVNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MgTz1TU0wgQ29ycG9yYXRpb24KIyBMYWJlbDogIlNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MiCiMgU2VyaWFsOiA4NDk1NzIzODEzMjk3MjE2NDI0CiMgTUQ1IEZpbmdlcnByaW50OiAyZTpkYTplNDozOTo3Zjo5Yzo4ZjozNzpkMTo3MDo5ZjoyNjoxNzo1MTozYTo4ZQojIFNIQTEgRmluZ2VycHJpbnQ6IGMzOjE5OjdjOjM5OjI0OmU2OjU0OmFmOjFiOmM0OmFiOjIwOjk1OjdhOmUyOmMzOjBlOjEzOjAyOjZhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzNDoxNzpiYjowNjpjYzo2MDowNzpkYToxYjo5NjoxYzo5MjowYjo4YTpiNDpjZTozZjphZDo4MjowZTo0YTphMzowYjo5YTpjYjpjNDphNzo0ZTpiZDpjZTpiYzo2NQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2pUQ0NBaFNnQXdJQkFnSUlkZWJmeThGb1c2Z3dDZ1lJS29aSXpqMEVBd0l3ZkRFTE1Ba0dBMVVFQmhNQwpWVk14RGpBTUJnTlZCQWdNQlZSbGVHRnpNUkF3RGdZRFZRUUhEQWRJYjNWemRHOXVNUmd3RmdZRFZRUUtEQTlUClUwd2dRMjl5Y0c5eVlYUnBiMjR4TVRBdkJnTlZCQU1NS0ZOVFRDNWpiMjBnVW05dmRDQkRaWEowYVdacFkyRjAKYVc5dUlFRjFkR2h2Y21sMGVTQkZRME13SGhjTk1UWXdNakV5TVRneE5EQXpXaGNOTkRFd01qRXlNVGd4TkRBegpXakI4TVFzd0NRWURWUVFHRXdKVlV6RU9NQXdHQTFVRUNBd0ZWR1Y0WVhNeEVEQU9CZ05WQkFjTUIwaHZkWE4wCmIyNHhHREFXQmdOVkJBb01EMU5UVENCRGIzSndiM0poZEdsdmJqRXhNQzhHQTFVRUF3d29VMU5NTG1OdmJTQlMKYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUVWRFF6QjJNQkFHQnlxR1NNNDlBZ0VHQlN1QgpCQUFpQTJJQUJFVnVxVkRFcGlNMm5sOG9qUmZMbGlKa1A5eDZqaDNNQ0xPaWNTUzZqa201QkJ0SGxsaXJMWlhJCjdaNElOY2duNjRtTVUxanJZb3IrOEZzUGF6RlNZMEU3aWMzczdMYU5HZE0wQjl5N3hnWi93a1dWN010L3FDUGcKQ2VtQit2TkgwNk5qTUdFd0hRWURWUjBPQkJZRUZJTFJoWE13NXpVRTA0NENrdnZscE5IRUllak5NQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVWd0R0ZjekRuTlFUVGpnS1MrK1drMGNRaDZNMHdEZ1lEClZSMFBBUUgvQkFRREFnR0dNQW9HQ0NxR1NNNDlCQU1DQTJjQU1HUUNNRy9uNjFrUnBHRFBZYkNXZSswRitTOFQKa2R6dDVmeFFheEZHUnJNY0lRQml1NzdENStqTkI1bjVEUXRkY2o3RXFnSXdIN3k2QytJd0pQdDhiWUJWQ3BrKwpnQTB6NVdhanM2TzdwZFdMandrc3BsMSs0dkFIQ0dodDBueHBibC9mNVdwbAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSBSMiBPPVNTTCBDb3Jwb3JhdGlvbgojIFN1YmplY3Q6IENOPVNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EgUjIgTz1TU0wgQ29ycG9yYXRpb24KIyBMYWJlbDogIlNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EgUjIiCiMgU2VyaWFsOiA2MjQ4MjI3NDk0MzUyOTQzMzUwCiMgTUQ1IEZpbmdlcnByaW50OiBlMToxZTozMTo1ODoxYTphZTo1NDo1MzowMjpmNjoxNzo2YToxMTo3Yjo0ZDo5NQojIFNIQTEgRmluZ2VycHJpbnQ6IDc0OjNhOmYwOjUyOjliOmQwOjMyOmEwOmY0OjRhOjgzOmNkOmQ0OmJhOmE5OjdiOjdjOjJlOmM0OjlhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAyZTo3YjpmMTo2YzpjMjoyNDo4NTphNzpiYjplMjphYTo4Njo5Njo3NTowNzo2MTpiMDphZTozOTpiZTozYjoyZjplOTpkMDpjYzo2ZDo0ZTpmNzozNDo5MTo0Mjo1YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjZ6Q0NBOU9nQXdJQkFnSUlWcllwelRTOGVQWXdEUVlKS29aSWh2Y05BUUVMQlFBd2dZSXhDekFKQmdOVgpCQVlUQWxWVE1RNHdEQVlEVlFRSURBVlVaWGhoY3pFUU1BNEdBMVVFQnd3SFNHOTFjM1J2YmpFWU1CWUdBMVVFCkNnd1BVMU5NSUVOdmNuQnZjbUYwYVc5dU1UY3dOUVlEVlFRRERDNVRVMHd1WTI5dElFVldJRkp2YjNRZ1EyVnkKZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ1VsTkJJRkl5TUI0WERURTNNRFV6TVRFNE1UUXpOMW9YRFRReQpNRFV6TURFNE1UUXpOMW93Z1lJeEN6QUpCZ05WQkFZVEFsVlRNUTR3REFZRFZRUUlEQVZVWlhoaGN6RVFNQTRHCkExVUVCd3dIU0c5MWMzUnZiakVZTUJZR0ExVUVDZ3dQVTFOTUlFTnZjbkJ2Y21GMGFXOXVNVGN3TlFZRFZRUUQKREM1VFUwd3VZMjl0SUVWV0lGSnZiM1FnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dVbE5CSUZJeQpNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQWp6WmxRT0hXVGNEWHRPbEcybXZxCk0wZk5UUGw5ZmI2OUxUM3cyM2poaHFYWnVnbFhhTzFYUHFEUUNFR0Q1eWhCSkIvamNoWFFBUnI3WG5BanNzdWYKT2VQUHhVN0drbTBteG51N3M5b25uUXFHNllFM0JmN3djWEhzd3h6cFk2SVhGSjN2RzJmVGhWVUNBdFpKeWN4YQo0YkgzYnpLZnlkUTdpRUdvbkwzTHE5dHRld2tmb2t4eWtOb3JDUHpQUEZUT1p3K296MTJXR1F2RTQzTHJyZEY5CkhTZnZrdXNRdjF2ck82L1BnTjNCMHBZRVczcCtwS2s4T0hha1lvNmdPVjdxZDg5ZEFGbVBaaXcrQjZLakJTWVIKYVpmcWhiY1BsZ3RMeUVEaFVMb3Vpc3YzRDVvaTUzK2FOeFBOOGswVGF5SFJ3TXdpOHFGRzlrUnBuTXBoTlFjQQpiOVpoQ0JIcXVyajI2Yk5nNVUyNTdKOFVac2xYV052TmgybjRpb1lTQTBlL1poTjJySGQ5TkNTRmc4M1hxcHlRCkdwOGhMSDk0dDJTNDJPaW05SGl6VmN1RTBqTEVlSzZqajJIZHpnaFRyZXlJL0JYa21nM21ueHAzemt5UHVCUVYKUFdLY2hqZ0dBR1lTNUZsMldsUEFBcGlpRUN0b1JIdU9lYzR6U25hcVc0RVdHN1dLMk5BQWUxNWl0QW5XaG1NTwpwZ1dWU2Jvb2k0aVRzalFjMktSVmJyY2MwTjZaVlRzajlDTGcrU2xtSnV3Z1VIZmJTZ3VQdnVVQ1lIQkJYdFN1ClVEa2lGQ2JMc2p0emRGVkhCM21CT2Fnd0UwVGxCSXF1bGhNbFFnKzVVOFNiL00za0hONDgrcXZXQmtvZlo2YVkKTUJ6ZExOdmNHSlZYWnNiL1hJdFc5WGNDQXdFQUFhTmpNR0V3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFmQmdOVgpIU01FR0RBV2dCVDVZTHZVNDlVMDlyajFCb0FscDNQYlJtbW9uakFkQmdOVkhRNEVGZ1FVK1dDNzFPUFZOUGE0CjlRYUFKYWR6MjBacHFKNHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRQlcKczQ3TENwMUpqcitreEpHN1poY0ZVWmgxKytWUUxIcWU4UlQ2cTlPS1B2K1JLWTlqaTlpMHFWUUJEYjZUaGkvNQpTbTNIWHZWWCtjcFZIQksrUnc4MnhkOXF0OXQxd2tjbGY3bnhZL2hvTFZVRTBmS05zS1RQdkR4ZUgzam5wYUFnCmNMQUV4YmYzY3FmZUlnMjlNeVZHakdTU0p1TStMbU9XMnB1TVBmZ1lDZGNEekgyR2d1REtCQWRSVU5mL2t0VU0KNzlxR241blg2N2V2YU9JNUpwUzZhTGUvZzlQcWVtYzlZbWV1SmVWeTZPTGs3SzRTOWtzclBKL3BzRUR6T0ZTegovYmRveU5yR2oxRThzdnVSM0J6bm01M2h0dzF5aitLa3hLbDQrZXNVck1aREJjSmxPU2dZQXNPQ3NwMEZ2bVh0CmxsOWxkRHo3Q1RVdWU1d1QvUnNQWGNkdGdUcFdEOHc3NGE4Q0x5S3NSc3BHUEtBY1ROWkV0RjR1WEJWbUNlRW0KS2Y3R1VtRzZzWFAvd3d5YzVXeHFsRDhVeWtBV2xZVHpXYW1zWDB4aGsyM1JPOHlpbFF3aXBtZG5SQzY1MmRLSwpRYk5tQzFyN2ZTT2w4aHF3Lzk2Ymc1UXUwVC9ma3JlUnJ3VTdaY2VnYkxITlloTERrQnZqSmM0MHZHOTNkckVRCncvY0ZHc0RXcjNSaVNCZDNrbW1RWVJ6ZWxZQjBWSThZSE1QekE5Qy9wRU4xaGxNWWVnb3VDUncybjVIOWdvb2kKUzlFT1VDWGR5d01NRjhtREFBaE9OVTJLaSszd0FwUm1MRVIveTVVbmxoZXRDVENzdG5FWGJvc1g5aHdKMUMwNwptS1Z4MDFRVDJXRHo5VXRtVC9yeDdpQVNqYlNzVjdGRlk2R3NkcW5DK3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyBPPVNTTCBDb3Jwb3JhdGlvbgojIFN1YmplY3Q6IENOPVNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MgTz1TU0wgQ29ycG9yYXRpb24KIyBMYWJlbDogIlNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MiCiMgU2VyaWFsOiAzMTgyMjQ2NTI2NzU0NTU1Mjg1CiMgTUQ1IEZpbmdlcnByaW50OiA1OTo1MzoyMjo2NTo4Mzo0MjowMTo1NDpjMDpjZTo0MjpiOTo1YTo3YzpmMjo5MAojIFNIQTEgRmluZ2VycHJpbnQ6IDRjOmRkOjUxOmEzOmQxOmY1OjIwOjMyOjE0OmIwOmM2OmM1OjMyOjIzOjAzOjkxOmM3OjQ2OjQyOjZkCiMgU0hBMjU2IEZpbmdlcnByaW50OiAyMjphMjpjMTpmNzpiZDplZDo3MDo0YzpjMTplNzowMTpiNTpmNDowODpjMzoxMDo4ODowZjplOTo1NjpiNTpkZToyYTo0YTo0NDpmOTo5Yzo4NzozYToyNTphNzpjOAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2xEQ0NBaHFnQXdJQkFnSUlMQ21jV3hidEJaVXdDZ1lJS29aSXpqMEVBd0l3ZnpFTE1Ba0dBMVVFQmhNQwpWVk14RGpBTUJnTlZCQWdNQlZSbGVHRnpNUkF3RGdZRFZRUUhEQWRJYjNWemRHOXVNUmd3RmdZRFZRUUtEQTlUClUwd2dRMjl5Y0c5eVlYUnBiMjR4TkRBeUJnTlZCQU1NSzFOVFRDNWpiMjBnUlZZZ1VtOXZkQ0JEWlhKMGFXWnAKWTJGMGFXOXVJRUYxZEdodmNtbDBlU0JGUTBNd0hoY05NVFl3TWpFeU1UZ3hOVEl6V2hjTk5ERXdNakV5TVRneApOVEl6V2pCL01Rc3dDUVlEVlFRR0V3SlZVekVPTUF3R0ExVUVDQXdGVkdWNFlYTXhFREFPQmdOVkJBY01CMGh2CmRYTjBiMjR4R0RBV0JnTlZCQW9NRDFOVFRDQkRiM0p3YjNKaGRHbHZiakUwTURJR0ExVUVBd3dyVTFOTUxtTnYKYlNCRlZpQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJRVZEUXpCMk1CQUdCeXFHU000OQpBZ0VHQlN1QkJBQWlBMklBQktvU1I1Q1lHL3Z2dzBBSGd5Qk84VENDb2diUjhwS0dZZkwySVdqS0FNVEg2a01BClZJYmMvUi9mQUxoQllsemNjQll5M2grWjFNekZCOGdJSDJFV0IxRTlmVndIVStNMU9JemZ6Wi9aTGcxS3Roa3UKV25CYUJ1Mis4S0d3eXRBSkthTmpNR0V3SFFZRFZSME9CQllFRkZ2S1h1WGUwb0dxemFndFpGRzIyWEtibCtaUApNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVVzhwZTVkN1NnYXJOcUMxa1ViYlpjcHVYCjVrOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01Bb0dDQ3FHU000OUJBTUNBMmdBTUdVQ01RQ0s1a0NKTit2cDFSUFoKeXRSckpQT3dQWWRHV0Jyc3NkOXYrMWE2Y0d2SE9Nem9zWXhQRC9meFozWU9nOUFlVVk4Q01EMzJJeWdtVE1aZwpoNU1tbTdJMUhyclc5enpSSE03NkpUeW1Hb0VWVy9NU0QyenVaWXJKaDZqNUIrQmltb3hjU2c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tClBLAwQUAAAAAAAAACEACRNCR0QDAABEAwAAKwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jZXJ0aWZpL2NvcmUucHkjIS91c3IvYmluL2VudiBweXRob24KIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpjZXJ0aWZpLnB5Cn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIHJldHVybnMgdGhlIGluc3RhbGxhdGlvbiBsb2NhdGlvbiBvZiBjYWNlcnQucGVtLgoiIiIKaW1wb3J0IG9zCmltcG9ydCB3YXJuaW5ncwoKCmNsYXNzIERlcHJlY2F0ZWRCdW5kbGVXYXJuaW5nKERlcHJlY2F0aW9uV2FybmluZyk6CiAgICAiIiIKICAgIFRoZSB3ZWFrIHNlY3VyaXR5IGJ1bmRsZSBpcyBiZWluZyBkZXByZWNhdGVkLiBQbGVhc2UgYm90aGVyIHlvdXIgc2VydmljZQogICAgcHJvdmlkZXIgdG8gZ2V0IHRoZW0gdG8gc3RvcCB1c2luZyBjcm9zcy1zaWduZWQgcm9vdHMuCiAgICAiIiIKCgpkZWYgd2hlcmUoKToKICAgIGYgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCgogICAgcmV0dXJuIG9zLnBhdGguam9pbihmLCAnY2FjZXJ0LnBlbScpCgoKZGVmIG9sZF93aGVyZSgpOgogICAgd2FybmluZ3Mud2FybigKICAgICAgICAiVGhlIHdlYWsgc2VjdXJpdHkgYnVuZGxlIGhhcyBiZWVuIHJlbW92ZWQuIGNlcnRpZmkub2xkX3doZXJlKCkgaXMgbm93IGFuIGFsaWFzICIKICAgICAgICAib2YgY2VydGlmaS53aGVyZSgpLiBQbGVhc2UgdXBkYXRlIHlvdXIgY29kZSB0byB1c2UgY2VydGlmaS53aGVyZSgpIGluc3RlYWQuICIKICAgICAgICAiY2VydGlmaS5vbGRfd2hlcmUoKSB3aWxsIGJlIHJlbW92ZWQgaW4gMjAxOC4iLAogICAgICAgIERlcHJlY2F0ZWRCdW5kbGVXYXJuaW5nCiAgICApCiAgICByZXR1cm4gd2hlcmUoKQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHByaW50KHdoZXJlKCkpClBLAwQUAAAAAAAAACEA8M8PUxcGAAAXBgAALwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L19faW5pdF9fLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKZnJvbSAuY29tcGF0IGltcG9ydCBQWTIsIFBZMwpmcm9tIC51bml2ZXJzYWxkZXRlY3RvciBpbXBvcnQgVW5pdmVyc2FsRGV0ZWN0b3IKZnJvbSAudmVyc2lvbiBpbXBvcnQgX192ZXJzaW9uX18sIFZFUlNJT04KCgpkZWYgZGV0ZWN0KGJ5dGVfc3RyKToKICAgICIiIgogICAgRGV0ZWN0IHRoZSBlbmNvZGluZyBvZiB0aGUgZ2l2ZW4gYnl0ZSBzdHJpbmcuCgogICAgOnBhcmFtIGJ5dGVfc3RyOiAgICAgVGhlIGJ5dGUgc2VxdWVuY2UgdG8gZXhhbWluZS4KICAgIDp0eXBlIGJ5dGVfc3RyOiAgICAgIGBgYnl0ZXNgYCBvciBgYGJ5dGVhcnJheWBgCiAgICAiIiIKICAgIGlmIG5vdCBpc2luc3RhbmNlKGJ5dGVfc3RyLCBieXRlYXJyYXkpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGJ5dGVfc3RyLCBieXRlcyk6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignRXhwZWN0ZWQgb2JqZWN0IG9mIHR5cGUgYnl0ZXMgb3IgYnl0ZWFycmF5LCBnb3Q6ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7MH0nLmZvcm1hdCh0eXBlKGJ5dGVfc3RyKSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYnl0ZV9zdHIgPSBieXRlYXJyYXkoYnl0ZV9zdHIpCiAgICBkZXRlY3RvciA9IFVuaXZlcnNhbERldGVjdG9yKCkKICAgIGRldGVjdG9yLmZlZWQoYnl0ZV9zdHIpCiAgICByZXR1cm4gZGV0ZWN0b3IuY2xvc2UoKQpQSwMEFAAAAAAAAAAhADm/hBAWegAAFnoAAC8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9iaWc1ZnJlcS5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBCaWc1IGZyZXF1ZW5jeSB0YWJsZQojIGJ5IFRhaXdhbidzIE1hbmRhcmluIFByb21vdGlvbiBDb3VuY2lsCiMgPGh0dHA6Ly93d3cuZWR1LnR3OjgxL21hbmRyLz4KIwojIDEyOCAgLS0+IDAuNDIyNjEKIyAyNTYgIC0tPiAwLjU3ODUxCiMgNTEyICAtLT4gMC43NDg1MQojIDEwMjQgLS0+IDAuODkzODQKIyAyMDQ4IC0tPiAwLjk3NTgzCiMKIyBJZGVhbCBEaXN0cmlidXRpb24gUmF0aW8gPSAwLjc0ODUxLygxLTAuNzQ4NTEpID0yLjk4CiMgUmFuZG9tIERpc3RyaWJ1dGlvbiBSYXRpb24gPSA1MTIvKDU0MDEtNTEyKT0wLjEwNQojCiMgVHlwaWNhbCBEaXN0cmlidXRpb24gUmF0aW8gYWJvdXQgMjUlIG9mIElkZWFsIG9uZSwgc3RpbGwgbXVjaCBoaWdoZXIgdGhhbiBSRFIKCkJJRzVfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8gPSAwLjc1CgojQ2hhciB0byBGcmVxT3JkZXIgdGFibGUKQklHNV9UQUJMRV9TSVpFID0gNTM3NgoKQklHNV9DSEFSX1RPX0ZSRVFfT1JERVIgPSAoCiAgIDEsMTgwMSwxNTA2LCAyNTUsMTQzMSwgMTk4LCAgIDksICA4MiwgICA2LDUwMDgsIDE3NywgMjAyLDM2ODEsMTI1NiwyODIxLCAxMTAsICMgICAxNgozODE0LCAgMzMsMzI3NCwgMjYxLCAgNzYsICA0NCwyMTE0LCAgMTYsMjk0NiwyMTg3LDExNzYsIDY1OSwzOTcxLCAgMjYsMzQ1MSwyNjUzLCAjICAgMzIKMTE5OCwzOTcyLDMzNTAsNDIwMiwgNDEwLDIyMTUsIDMwMiwgNTkwLCAzNjEsMTk2NCwgICA4LCAyMDQsICA1OCw0NTEwLDUwMDksMTkzMiwgIyAgIDQ4CiAgNjMsNTAxMCw1MDExLCAzMTcsMTYxNCwgIDc1LCAyMjIsIDE1OSw0MjAzLDI0MTcsMTQ4MCw1MDEyLDM1NTUsMzA5MSwgMjI0LDI4MjIsICMgICA2NAozNjgyLCAgIDMsICAxMCwzOTczLDE0NzEsICAyOSwyNzg3LDExMzUsMjg2NiwxOTQwLCA4NzMsIDEzMCwzMjc1LDExMjMsIDMxMiw1MDEzLCAjICAgODAKNDUxMSwyMDUyLCA1MDcsIDI1MiwgNjgyLDUwMTQsIDE0MiwxOTE1LCAxMjQsIDIwNiwyOTQ3LCAgMzQsMzU1NiwzMjA0LCAgNjQsIDYwNCwgIyAgIDk2CjUwMTUsMjUwMSwxOTc3LDE5NzgsIDE1NSwxOTkxLCA2NDUsIDY0MSwxNjA2LDUwMTYsMzQ1MiwgMzM3LCAgNzIsIDQwNiw1MDE3LCAgODAsICMgIDExMgogNjMwLCAyMzgsMzIwNSwxNTA5LCAyNjMsIDkzOSwxMDkyLDI2NTQsIDc1NiwxNDQwLDEwOTQsMzQ1MywgNDQ5LCAgNjksMjk4NywgNTkxLCAjICAxMjgKIDE3OSwyMDk2LCA0NzEsIDExNSwyMDM1LDE4NDQsICA2MCwgIDUwLDI5ODgsIDEzNCwgODA2LDE4NjksIDczNCwyMDM2LDM0NTQsIDE4MCwgIyAgMTQ0CiA5OTUsMTYwNywgMTU2LCA1MzcsMjkwNywgNjg4LDUwMTgsIDMxOSwxMzA1LCA3NzksMjE0NSwgNTE0LDIzNzksIDI5OCw0NTEyLCAzNTksICMgIDE2MAoyNTAyLCAgOTAsMjcxNiwxMzM4LCA2NjMsICAxMSwgOTA2LDEwOTksMjU1MywgIDIwLDI0NDEsIDE4MiwgNTMyLDE3MTYsNTAxOSwgNzMyLCAjICAxNzYKMTM3Niw0MjA0LDEzMTEsMTQyMCwzMjA2LCAgMjUsMjMxNywxMDU2LCAxMTMsIDM5OSwgMzgyLDE5NTAsIDI0MiwzNDU1LDI0NzQsIDUyOSwgIyAgMTkyCjMyNzYsIDQ3NSwxNDQ3LDM2ODMsNTAyMCwgMTE3LCAgMjEsIDY1NiwgODEwLDEyOTcsMjMwMCwyMzM0LDM1NTcsNTAyMSwgMTI2LDQyMDUsICMgIDIwOAogNzA2LCA0NTYsIDE1MCwgNjEzLDQ1MTMsICA3MSwxMTE4LDIwMzcsNDIwNiwgMTQ1LDMwOTIsICA4NSwgODM1LCA0ODYsMjExNSwxMjQ2LCAjICAyMjQKMTQyNiwgNDI4LCA3MjcsMTI4NSwxMDE1LCA4MDAsIDEwNiwgNjIzLCAzMDMsMTI4MSw1MDIyLDIxMjgsMjM1OSwgMzQ3LDM4MTUsIDIyMSwgIyAgMjQwCjM1NTgsMzEzNSw1MDIzLDE5NTYsMTE1Myw0MjA3LCAgODMsIDI5NiwxMTk5LDMwOTMsIDE5MiwgNjI0LCAgOTMsNTAyNCwgODIyLDE4OTgsICMgIDI1NgoyODIzLDMxMzYsIDc5NSwyMDY1LCA5OTEsMTU1NCwxNTQyLDE1OTIsICAyNywgIDQzLDI4NjcsIDg1OSwgMTM5LDE0NTYsIDg2MCw0NTE0LCAjICAyNzIKIDQzNywgNzEyLDM5NzQsIDE2NCwyMzk3LDMxMzcsIDY5NSwgMjExLDMwMzcsMjA5NywgMTk1LDM5NzUsMTYwOCwzNTU5LDM1NjAsMzY4NCwgIyAgMjg4CjM5NzYsIDIzNCwgODExLDI5ODksMjA5OCwzOTc3LDIyMzMsMTQ0MSwzNTYxLDE2MTUsMjM4MCwgNjY4LDIwNzcsMTYzOCwgMzA1LCAyMjgsICMgIDMwNAoxNjY0LDQ1MTUsIDQ2NywgNDE1LDUwMjUsIDI2MiwyMDk5LDE1OTMsIDIzOSwgMTA4LCAzMDAsIDIwMCwxMDMzLCA1MTIsMTI0NywyMDc4LCAjICAzMjAKNTAyNiw1MDI3LDIxNzYsMzIwNywzNjg1LDI2ODIsIDU5MywgODQ1LDEwNjIsMzI3NywgIDg4LDE3MjMsMjAzOCwzOTc4LDE5NTEsIDIxMiwgIyAgMzM2CiAyNjYsIDE1MiwgMTQ5LCA0NjgsMTg5OSw0MjA4LDQ1MTYsICA3NywgMTg3LDUwMjgsMzAzOCwgIDM3LCAgIDUsMjk5MCw1MDI5LDM5NzksICMgIDM1Mgo1MDMwLDUwMzEsICAzOSwyNTI0LDQ1MTcsMjkwOCwzMjA4LDIwNzksICA1NSwgMTQ4LCAgNzQsNDUxOCwgNTQ1LCA0ODMsMTQ3NCwxMDI5LCAjICAzNjgKMTY2NSwgMjE3LDE4NzAsMTUzMSwzMTM4LDExMDQsMjY1NSw0MjA5LCAgMjQsIDE3MiwzNTYyLCA5MDAsMzk4MCwzNTYzLDM1NjQsNDUxOSwgIyAgMzg0CiAgMzIsMTQwOCwyODI0LDEzMTIsIDMyOSwgNDg3LDIzNjAsMjI1MSwyNzE3LCA3ODQsMjY4MywgICA0LDMwMzksMzM1MSwxNDI3LDE3ODksICMgIDQwMAogMTg4LCAxMDksIDQ5OSw1MDMyLDM2ODYsMTcxNywxNzkwLCA4ODgsMTIxNywzMDQwLDQ1MjAsNTAzMywzNTY1LDUwMzQsMzM1MiwxNTIwLCAjICA0MTYKMzY4NywzOTgxLCAxOTYsMTAzNCwgNzc1LDUwMzUsNTAzNiwgOTI5LDE4MTYsIDI0OSwgNDM5LCAgMzgsNTAzNywxMDYzLDUwMzgsIDc5NCwgIyAgNDMyCjM5ODIsMTQzNSwyMzAxLCAgNDYsIDE3OCwzMjc4LDIwNjYsNTAzOSwyMzgxLDUwNDAsIDIxNCwxNzA5LDQ1MjEsIDgwNCwgIDM1LCA3MDcsICMgIDQ0OAogMzI0LDM2ODgsMTYwMSwyNTU0LCAxNDAsIDQ1OSw0MjEwLDUwNDEsNTA0MiwxMzY1LCA4MzksIDI3MiwgOTc4LDIyNjIsMjU4MCwzNDU2LCAjICA0NjQKMjEyOSwxMzYzLDM2ODksMTQyMywgNjk3LCAxMDAsMzA5NCwgIDQ4LCAgNzAsMTIzMSwgNDk1LDMxMzksMjE5Niw1MDQzLDEyOTQsNTA0NCwgIyAgNDgwCjIwODAsIDQ2MiwgNTg2LDEwNDIsMzI3OSwgODUzLCAyNTYsIDk4OCwgMTg1LDIzODIsMzQ1NywxNjk4LCA0MzQsMTA4NCw1MDQ1LDM0NTgsICMgIDQ5NgogMzE0LDI2MjUsMjc4OCw0NTIyLDIzMzUsMjMzNiwgNTY5LDIyODUsIDYzNywxODE3LDI1MjUsIDc1NywxMTYyLDE4NzksMTYxNiwzNDU5LCAjICA1MTIKIDI4NywxNTc3LDIxMTYsIDc2OCw0NTIzLDE2NzEsMjg2OCwzNTY2LDI1MjYsMTMyMSwzODE2LCA5MDksMjQxOCw1MDQ2LDQyMTEsIDkzMywgIyAgNTI4CjM4MTcsNDIxMiwyMDUzLDIzNjEsMTIyMiw0NTI0LCA3NjUsMjQxOSwxMzIyLCA3ODYsNDUyNSw1MDQ3LDE5MjAsMTQ2MiwxNjc3LDI5MDksICMgIDU0NAoxNjk5LDUwNDgsNDUyNiwxNDI0LDI0NDIsMzE0MCwzNjkwLDI2MDAsMzM1MywxNzc1LDE5NDEsMzQ2MCwzOTgzLDQyMTMsIDMwOSwxMzY5LCAjICA1NjAKMTEzMCwyODI1LCAzNjQsMjIzNCwxNjUzLDEyOTksMzk4NCwzNTY3LDM5ODUsMzk4NiwyNjU2LCA1MjUsMTA4NSwzMDQxLCA5MDIsMjAwMSwgIyAgNTc2CjE0NzUsIDk2NCw0NTI3LCA0MjEsMTg0NSwxNDE1LDEwNTcsMjI4NiwgOTQwLDEzNjQsMzE0MSwgMzc2LDQ1MjgsNDUyOSwxMzgxLCAgIDcsICMgIDU5MgoyNTI3LCA5ODMsMjM4MywgMzM2LDE3MTAsMjY4NCwxODQ2LCAzMjEsMzQ2MSwgNTU5LDExMzEsMzA0MiwyNzUyLDE4MDksMTEzMiwxMzEzLCAjICA2MDgKIDI2NSwxNDgxLDE4NTgsNTA0OSwgMzUyLDEyMDMsMjgyNiwzMjgwLCAxNjcsMTA4OSwgNDIwLDI4MjcsIDc3NiwgNzkyLDE3MjQsMzU2OCwgIyAgNjI0CjQyMTQsMjQ0MywzMjgxLDUwNTAsNDIxNSw1MDUxLCA0NDYsIDIyOSwgMzMzLDI3NTMsIDkwMSwzODE4LDEyMDAsMTU1Nyw0NTMwLDI2NTcsICMgIDY0MAoxOTIxLCAzOTUsMjc1NCwyNjg1LDM4MTksNDIxNiwxODM2LCAxMjUsIDkxNiwzMjA5LDI2MjYsNDUzMSw1MDUyLDUwNTMsMzgyMCw1MDU0LCAjICA2NTYKNTA1NSw1MDU2LDQ1MzIsMzE0MiwzNjkxLDExMzMsMjU1NSwxNzU3LDM0NjIsMTUxMCwyMzE4LDE0MDksMzU2OSw1MDU3LDIxNDYsIDQzOCwgIyAgNjcyCjI2MDEsMjkxMCwyMzg0LDMzNTQsMTA2OCwgOTU4LDMwNDMsIDQ2MSwgMzExLDI4NjksMjY4Niw0MjE3LDE5MTYsMzIxMCw0MjE4LDE5NzksICMgIDY4OAogMzgzLCA3NTAsMjc1NSwyNjI3LDQyMTksIDI3NCwgNTM5LCAzODUsMTI3OCwxNDQyLDUwNTgsMTE1NCwxOTY1LCAzODQsIDU2MSwgMjEwLCAjICA3MDQKICA5OCwxMjk1LDI1NTYsMzU3MCw1MDU5LDE3MTEsMjQyMCwxNDgyLDM0NjMsMzk4NywyOTExLDEyNTcsIDEyOSw1MDYwLDM4MjEsIDY0MiwgIyAgNzIwCiA1MjMsMjc4OSwyNzkwLDI2NTgsNTA2MSwgMTQxLDIyMzUsMTMzMywgIDY4LCAxNzYsIDQ0MSwgODc2LCA5MDcsNDIyMCwgNjAzLDI2MDIsICMgIDczNgogNzEwLCAxNzEsMzQ2NCwgNDA0LCA1NDksICAxOCwzMTQzLDIzOTgsMTQxMCwzNjkyLDE2NjYsNTA2MiwzNTcxLDQ1MzMsMjkxMiw0NTM0LCAjICA3NTIKNTA2MywyOTkxLCAzNjgsNTA2NCwgMTQ2LCAzNjYsICA5OSwgODcxLDM2OTMsMTU0MywgNzQ4LCA4MDcsMTU4NiwxMTg1LCAgMjIsMjI2MywgIyAgNzY4CiAzNzksMzgyMiwzMjExLDUwNjUsMzIxMiwgNTA1LDE5NDIsMjYyOCwxOTkyLDEzODIsMjMxOSw1MDY2LCAzODAsMjM2MiwgMjE4LCA3MDIsICMgIDc4NAoxODE4LDEyNDgsMzQ2NSwzMDQ0LDM1NzIsMzM1NSwzMjgyLDUwNjcsMjk5MiwzNjk0LCA5MzAsMzI4MywzODIzLDUwNjgsICA1OSw1MDY5LCAjICA4MDAKIDU4NSwgNjAxLDQyMjEsIDQ5NywzNDY2LDExMTIsMTMxNCw0NTM1LDE4MDIsNTA3MCwxMjIzLDE0NzIsMjE3Nyw1MDcxLCA3NDksMTgzNywgIyAgODE2CiA2OTAsMTkwMCwzODI0LDE3NzMsMzk4OCwxNDc2LCA0MjksMTA0MywxNzkxLDIyMzYsMjExNywgOTE3LDQyMjIsIDQ0NywxMDg2LDE2MjksICMgIDgzMgo1MDcyLCA1NTYsNTA3Myw1MDc0LDIwMjEsMTY1NCwgODQ0LDEwOTAsIDEwNSwgNTUwLCA5NjYsMTc1OCwyODI4LDEwMDgsMTc4MywgNjg2LCAjICA4NDgKMTA5NSw1MDc1LDIyODcsIDc5MywxNjAyLDUwNzYsMzU3MywyNjAzLDQ1MzYsNDIyMywyOTQ4LDIzMDIsNDUzNywzODI1LCA5ODAsMjUwMywgIyAgODY0CiA1NDQsIDM1MywgNTI3LDQ1MzgsIDkwOCwyNjg3LDI5MTMsNTA3NywgMzgxLDI2MjksMTk0MywxMzQ4LDUwNzgsMTM0MSwxMjUyLCA1NjAsICMgIDg4MAozMDk1LDUwNzksMzQ2NywyODcwLDUwODAsMjA1NCwgOTczLCA4ODYsMjA4MSwgMTQzLDQ1MzksNTA4MSw1MDgyLCAxNTcsMzk4OSwgNDk2LCAjICA4OTYKNDIyNCwgIDU3LCA4NDAsIDU0MCwyMDM5LDQ1NDAsNDU0MSwzNDY4LDIxMTgsMTQ0NSwgOTcwLDIyNjQsMTc0OCwxOTY2LDIwODIsNDIyNSwgIyAgOTEyCjMxNDQsMTIzNCwxNzc2LDMyODQsMjgyOSwzNjk1LCA3NzMsMTIwNiwyMTMwLDEwNjYsMjA0MCwxMzI2LDM5OTAsMTczOCwxNzI1LDQyMjYsICMgIDkyOAogMjc5LDMxNDUsICA1MSwxNTQ0LDI2MDQsIDQyMywxNTc4LDIxMzEsMjA2NywgMTczLDQ1NDIsMTg4MCw1MDgzLDUwODQsMTU4MywgMjY0LCAjICA5NDQKIDYxMCwzNjk2LDQ1NDMsMjQ0NCwgMjgwLCAxNTQsNTA4NSw1MDg2LDUwODcsMTczOSwgMzM4LDEyODIsMzA5NiwgNjkzLDI4NzEsMTQxMSwgIyAgOTYwCjEwNzQsMzgyNiwyNDQ1LDUwODgsNDU0NCw1MDg5LDUwOTAsMTI0MCwgOTUyLDIzOTksNTA5MSwyOTE0LDE1MzgsMjY4OCwgNjg1LDE0ODMsICMgIDk3Ngo0MjI3LDI0NzUsMTQzNiwgOTUzLDQyMjgsMjA1NSw0NTQ1LCA2NzEsMjQwMCwgIDc5LDQyMjksMjQ0NiwzMjg1LCA2MDgsIDU2NywyNjg5LCAjICA5OTIKMzQ2OSw0MjMwLDQyMzEsMTY5MSwgMzkzLDEyNjEsMTc5MiwyNDAxLDUwOTIsNDU0Niw1MDkzLDUwOTQsNTA5NSw1MDk2LDEzODMsMTY3MiwgIyAxMDA4CjM4MjcsMzIxMywxNDY0LCA1MjIsMTExOSwgNjYxLDExNTAsIDIxNiwgNjc1LDQ1NDcsMzk5MSwxNDMyLDM1NzQsIDYwOSw0NTQ4LDI2OTAsICMgMTAyNAoyNDAyLDUwOTcsNTA5OCw1MDk5LDQyMzIsMzA0NSwgICAwLDUxMDAsMjQ3NiwgMzE1LCAyMzEsMjQ0NywgMzAxLDMzNTYsNDU0OSwyMzg1LCAjIDEwNDAKNTEwMSwgMjMzLDQyMzMsMzY5NywxODE5LDQ1NTAsNDU1MSw1MTAyLCAgOTYsMTc3NywxMzE1LDIwODMsNTEwMywgMjU3LDUxMDQsMTgxMCwgIyAxMDU2CjM2OTgsMjcxOCwxMTM5LDE4MjAsNDIzNCwyMDIyLDExMjQsMjE2NCwyNzkxLDE3NzgsMjY1OSw1MTA1LDMwOTcsIDM2MywxNjU1LDMyMTQsICMgMTA3Mgo1MTA2LDI5OTMsNTEwNyw1MTA4LDUxMDksMzk5MiwxNTY3LDM5OTMsIDcxOCwgMTAzLDMyMTUsIDg0OSwxNDQzLCAzNDEsMzM1NywyOTQ5LCAjIDEwODgKMTQ4NCw1MTEwLDE3MTIsIDEyNywgIDY3LCAzMzksNDIzNSwyNDAzLCA2NzksMTQxMiwgODIxLDUxMTEsNTExMiwgODM0LCA3MzgsIDM1MSwgIyAxMTA0CjI5OTQsMjE0NywgODQ2LCAyMzUsMTQ5NywxODgxLCA0MTgsMTk5MywzODI4LDI3MTksIDE4NiwxMTAwLDIxNDgsMjc1NiwzNTc1LDE1NDUsICMgMTEyMAoxMzU1LDI5NTAsMjg3MiwxMzc3LCA1ODMsMzk5NCw0MjM2LDI1ODEsMjk5NSw1MTEzLDEyOTgsMzY5OSwxMDc4LDI1NTcsMzcwMCwyMzYzLCAjIDExMzYKICA3OCwzODI5LDM4MzAsIDI2NywxMjg5LDIxMDAsMjAwMiwxNTk0LDQyMzcsIDM0OCwgMzY5LDEyNzQsMjE5NywyMTc4LDE4MzgsNDU1MiwgIyAxMTUyCjE4MjEsMjgzMCwzNzAxLDI3NTcsMjI4OCwyMDAzLDQ1NTMsMjk1MSwyNzU4LCAxNDQsMzM1OCwgODgyLDQ1NTQsMzk5NSwyNzU5LDM0NzAsICMgMTE2OAo0NTU1LDI5MTUsNTExNCw0MjM4LDE3MjYsIDMyMCw1MTE1LDM5OTYsMzA0NiwgNzg4LDI5OTYsNTExNiwyODMxLDE3NzQsMTMyNywyODczLCAjIDExODQKMzk5NywyODMyLDUxMTcsMTMwNiw0NTU2LDIwMDQsMTcwMCwzODMxLDM1NzYsMjM2NCwyNjYwLCA3ODcsMjAyMywgNTA2LCA4MjQsMzcwMiwgIyAxMjAwCiA1MzQsIDMyMyw0NTU3LDEwNDQsMzM1OSwyMDI0LDE5MDEsIDk0NiwzNDcxLDUxMTgsMTc3OSwxNTAwLDE2NzgsNTExOSwxODgyLDQ1NTgsICMgMTIxNgogMTY1LCAyNDMsNDU1OSwzNzAzLDI1MjgsIDEyMywgNjgzLDQyMzksIDc2NCw0NTYwLCAgMzYsMzk5OCwxNzkzLCA1ODksMjkxNiwgODE2LCAjIDEyMzIKIDYyNiwxNjY3LDMwNDcsMjIzNywxNjM5LDE1NTUsMTYyMiwzODMyLDM5OTksNTEyMCw0MDAwLDI4NzQsMTM3MCwxMjI4LDE5MzMsIDg5MSwgIyAxMjQ4CjIwODQsMjkxNywgMzA0LDQyNDAsNTEyMSwgMjkyLDI5OTcsMjcyMCwzNTc3LCA2OTEsMjEwMSw0MjQxLDExMTUsNDU2MSwgMTE4LCA2NjIsICMgMTI2NAo1MTIyLCA2MTEsMTE1NiwgODU0LDIzODYsMTMxNiwyODc1LCAgIDIsIDM4NiwgNTE1LDI5MTgsNTEyMyw1MTI0LDMyODYsIDg2OCwyMjM4LCAjIDEyODAKMTQ4NiwgODU1LDI2NjEsIDc4NSwyMjE2LDMwNDgsNTEyNSwxMDQwLDMyMTYsMzU3OCw1MTI2LDMxNDYsIDQ0OCw1MTI3LDE1MjUsNTEyOCwgIyAxMjk2CjIxNjUsNDU2Miw1MTI5LDM4MzMsNTEzMCw0MjQyLDI4MzMsMzU3OSwzMTQ3LCA1MDMsIDgxOCw0MDAxLDMxNDgsMTU2OCwgODE0LCA2NzYsICMgMTMxMgoxNDQ0LCAzMDYsMTc0OSw1MTMxLDM4MzQsMTQxNiwxMDMwLCAxOTcsMTQyOCwgODA1LDI4MzQsMTUwMSw0NTYzLDUxMzIsNTEzMyw1MTM0LCAjIDEzMjgKMTk5NCw1MTM1LDQ1NjQsNTEzNiw1MTM3LDIxOTgsICAxMywyNzkyLDM3MDQsMjk5OCwzMTQ5LDEyMjksMTkxNyw1MTM4LDM4MzUsMjEzMiwgIyAxMzQ0CjUxMzksNDI0Myw0NTY1LDI0MDQsMzU4MCw1MTQwLDIyMTcsMTUxMSwxNzI3LDExMjAsNTE0MSw1MTQyLCA2NDYsMzgzNiwyNDQ4LCAzMDcsICMgMTM2MAo1MTQzLDUxNDQsMTU5NSwzMjE3LDUxNDUsNTE0Niw1MTQ3LDM3MDUsMTExMywxMzU2LDQwMDIsMTQ2NSwyNTI5LDI1MzAsNTE0OCwgNTE5LCAjIDEzNzYKNTE0OSwgMTI4LDIxMzMsICA5MiwyMjg5LDE5ODAsNTE1MCw0MDAzLDE1MTIsIDM0MiwzMTUwLDIxOTksNTE1MSwyNzkzLDIyMTgsMTk4MSwgIyAxMzkyCjMzNjAsNDI0NCwgMjkwLDE2NTYsMTMxNywgNzg5LCA4MjcsMjM2NSw1MTUyLDM4MzcsNDU2NiwgNTYyLCA1ODEsNDAwNCw1MTUzLCA0MDEsICMgMTQwOAo0NTY3LDIyNTIsICA5NCw0NTY4LDUxNTQsMTM5OSwyNzk0LDUxNTUsMTQ2MywyMDI1LDQ1NjksMzIxOCwxOTQ0LDUxNTYsIDgyOCwxMTA1LCAjIDE0MjQKNDI0NSwxMjYyLDEzOTQsNTE1Nyw0MjQ2LCA2MDUsNDU3MCw1MTU4LDE3ODQsMjg3Niw1MTU5LDI4MzUsIDgxOSwyMTAyLCA1NzgsMjIwMCwgIyAxNDQwCjI5NTIsNTE2MCwxNTAyLCA0MzYsMzI4Nyw0MjQ3LDMyODgsMjgzNiw0MDA1LDI5MTksMzQ3MiwzNDczLDUxNjEsMjcyMSwyMzIwLDUxNjIsICMgMTQ1Ngo1MTYzLDIzMzcsMjA2OCwgIDIzLDQ1NzEsIDE5MywgODI2LDM4MzgsMjEwMywgNjk5LDE2MzAsNDI0OCwzMDk4LCAzOTAsMTc5NCwxMDY0LCAjIDE0NzIKMzU4MSw1MTY0LDE1NzksMzA5OSwzMTAwLDE0MDAsNTE2NSw0MjQ5LDE4MzksMTY0MCwyODc3LDUxNjYsNDU3Miw0NTczLCAxMzcsNDI1MCwgIyAxNDg4CiA1OTgsMzEwMSwxOTY3LCA3ODAsIDEwNCwgOTc0LDI5NTMsNTE2NywgMjc4LCA4OTksIDI1MywgNDAyLCA1NzIsIDUwNCwgNDkzLDEzMzksICMgMTUwNAo1MTY4LDQwMDYsMTI3NSw0NTc0LDI1ODIsMjU1OCw1MTY5LDM3MDYsMzA0OSwzMTAyLDIyNTMsIDU2NSwxMzM0LDI3MjIsIDg2MywgIDQxLCAjIDE1MjAKNTE3MCw1MTcxLDQ1NzUsNTE3MiwxNjU3LDIzMzgsICAxOSwgNDYzLDI3NjAsNDI1MSwgNjA2LDUxNzMsMjk5OSwzMjg5LDEwODcsMjA4NSwgIyAxNTM2CjEzMjMsMjY2MiwzMDAwLDUxNzQsMTYzMSwxNjIzLDE3NTAsNDI1MiwyNjkxLDUxNzUsMjg3OCwgNzkxLDI3MjMsMjY2MywyMzM5LCAyMzIsICMgMTU1MgoyNDIxLDUxNzYsMzAwMSwxNDk4LDUxNzcsMjY2NCwyNjMwLCA3NTUsMTM2NiwzNzA3LDMyOTAsMzE1MSwyMDI2LDE2MDksIDExOSwxOTE4LCAjIDE1NjgKMzQ3NCwgODYyLDEwMjYsNDI1Myw1MTc4LDQwMDcsMzgzOSw0NTc2LDQwMDgsNDU3NywyMjY1LDE5NTIsMjQ3Nyw1MTc5LDExMjUsIDgxNywgIyAxNTg0CjQyNTQsNDI1NSw0MDA5LDE1MTMsMTc2NiwyMDQxLDE0ODcsNDI1NiwzMDUwLDMyOTEsMjgzNywzODQwLDMxNTIsNTE4MCw1MTgxLDE1MDcsICMgMTYwMAo1MTgyLDI2OTIsIDczMywgIDQwLDE2MzIsMTEwNiwyODc5LCAzNDUsNDI1NywgODQxLDI1MzEsIDIzMCw0NTc4LDMwMDIsMTg0NywzMjkyLCAjIDE2MTYKMzQ3NSw1MTgzLDEyNjMsIDk4NiwzNDc2LDUxODQsIDczNSwgODc5LCAyNTQsMTEzNywgODU3LCA2MjIsMTMwMCwxMTgwLDEzODgsMTU2MiwgIyAxNjMyCjQwMTAsNDAxMSwyOTU0LCA5NjcsMjc2MSwyNjY1LDEzNDksIDU5MiwyMTM0LDE2OTIsMzM2MSwzMDAzLDE5OTUsNDI1OCwxNjc5LDQwMTIsICMgMTY0OAoxOTAyLDIxODgsNTE4NSwgNzM5LDM3MDgsMjcyNCwxMjk2LDEyOTAsNTE4Niw0MjU5LDIyMDEsMjIwMiwxOTIyLDE1NjMsMjYwNSwyNTU5LCAjIDE2NjQKMTg3MSwyNzYyLDMwMDQsNTE4NywgNDM1LDUxODgsIDM0MywxMTA4LCA1OTYsICAxNywxNzUxLDQ1NzksMjIzOSwzNDc3LDM3MDksNTE4OSwgIyAxNjgwCjQ1ODAsIDI5NCwzNTgyLDI5NTUsMTY5MywgNDc3LCA5NzksIDI4MSwyMDQyLDM1ODMsIDY0MywyMDQzLDM3MTAsMjYzMSwyNzk1LDIyNjYsICMgMTY5NgoxMDMxLDIzNDAsMjEzNSwyMzAzLDM1ODQsNDU4MSwgMzY3LDEyNDksMjU2MCw1MTkwLDM1ODUsNTE5MSw0NTgyLDEyODMsMzM2MiwyMDA1LCAjIDE3MTIKIDI0MCwxNzYyLDMzNjMsNDU4Myw0NTg0LCA4MzYsMTA2OSwzMTUzLCA0NzQsNTE5MiwyMTQ5LDI1MzIsIDI2OCwzNTg2LDUxOTMsMzIxOSwgIyAxNzI4CjE1MjEsMTI4NCw1MTk0LDE2NTgsMTU0Niw0MjYwLDUxOTUsMzU4NywzNTg4LDUxOTYsNDI2MSwzMzY0LDI2OTMsMTY4NSw0MjYyLCA5NjEsICMgMTc0NAoxNjczLDI2MzIsIDE5MCwyMDA2LDIyMDMsMzg0MSw0NTg1LDQ1ODYsNTE5NywgNTcwLDI1MDQsMzcxMSwxNDkwLDUxOTgsNDU4NywyNjMzLCAjIDE3NjAKMzI5MywxOTU3LDQ1ODgsIDU4NCwxNTE0LCAzOTYsMTA0NSwxOTQ1LDUxOTksNDU4OSwxOTY4LDI0NDksNTIwMCw1MjAxLDQ1OTAsNDAxMywgIyAxNzc2CiA2MTksNTIwMiwzMTU0LDMyOTQsIDIxNSwyMDA3LDI3OTYsMjU2MSwzMjIwLDQ1OTEsMzIyMSw0NTkyLCA3NjMsNDI2MywzODQyLDQ1OTMsICMgMTc5Mgo1MjAzLDUyMDQsMTk1OCwxNzY3LDI5NTYsMzM2NSwzNzEyLDExNzQsIDQ1MiwxNDc3LDQ1OTQsMzM2NiwzMTU1LDUyMDUsMjgzOCwxMjUzLCAjIDE4MDgKMjM4NywyMTg5LDEwOTEsMjI5MCw0MjY0LCA0OTIsNTIwNiwgNjM4LDExNjksMTgyNSwyMTM2LDE3NTIsNDAxNCwgNjQ4LCA5MjYsMTAyMSwgIyAxODI0CjEzMjQsNDU5NSwgNTIwLDQ1OTYsIDk5NywgODQ3LDEwMDcsIDg5Miw0NTk3LDM4NDMsMjI2NywxODcyLDM3MTMsMjQwNSwxNzg1LDQ1OTgsICMgMTg0MAoxOTUzLDI5NTcsMzEwMywzMjIyLDE3MjgsNDI2NSwyMDQ0LDM3MTQsNDU5OSwyMDA4LDE3MDEsMzE1NiwxNTUxLCAgMzAsMjI2OCw0MjY2LCAjIDE4NTYKNTIwNywyMDI3LDQ2MDAsMzU4OSw1MjA4LCA1MDEsNTIwOSw0MjY3LCA1OTQsMzQ3OCwyMTY2LDE4MjIsMzU5MCwzNDc5LDM1OTEsMzIyMywgIyAxODcyCiA4MjksMjgzOSw0MjY4LDUyMTAsMTY4MCwzMTU3LDEyMjUsNDI2OSw1MjExLDMyOTUsNDYwMSw0MjcwLDMxNTgsMjM0MSw1MjEyLDQ2MDIsICMgMTg4OAo0MjcxLDUyMTMsNDAxNSw0MDE2LDUyMTQsMTg0OCwyMzg4LDI2MDYsMzM2Nyw1MjE1LDQ2MDMsIDM3NCw0MDE3LCA2NTIsNDI3Miw0MjczLCAjIDE5MDQKIDM3NSwxMTQwLCA3OTgsNTIxNiw1MjE3LDUyMTgsMjM2Niw0NjA0LDIyNjksIDU0NiwxNjU5LCAxMzgsMzA1MSwyNDUwLDQ2MDUsNTIxOSwgIyAxOTIwCjIyNTQsIDYxMiwxODQ5LCA5MTAsIDc5NiwzODQ0LDE3NDAsMTM3MSwgODI1LDM4NDUsMzg0Niw1MjIwLDI5MjAsMjU2Miw1MjIxLCA2OTIsICMgMTkzNgogNDQ0LDMwNTIsMjYzNCwgODAxLDQ2MDYsNDI3NCw1MjIyLDE0OTEsIDI0NCwxMDUzLDMwNTMsNDI3NSw0Mjc2LCAzNDAsNTIyMyw0MDE4LCAjIDE5NTIKMTA0MSwzMDA1LCAyOTMsMTE2OCwgIDg3LDEzNTcsNTIyNCwxNTM5LCA5NTksNTIyNSwyMjQwLCA3MjEsIDY5NCw0Mjc3LDM4NDcsIDIxOSwgIyAxOTY4CjE0NzgsIDY0NCwxNDE3LDMzNjgsMjY2NiwxNDEzLDE0MDEsMTMzNSwxMzg5LDQwMTksNTIyNiw1MjI3LDMwMDYsMjM2NywzMTU5LDE4MjYsICMgMTk4NAogNzMwLDE1MTUsIDE4NCwyODQwLCAgNjYsNDYwNyw1MjI4LDE2NjAsMjk1OCwgMjQ2LDMzNjksIDM3OCwxNDU3LCAyMjYsMzQ4MCwgOTc1LCAjIDIwMDAKNDAyMCwyOTU5LDEyNjQsMzU5MiwgNjc0LCA2OTYsNTIyOSwgMTYzLDUyMzAsMTE0MSwyNDIyLDIxNjcsIDcxMywzNTkzLDMzNzAsNDYwOCwgIyAyMDE2CjQwMjEsNTIzMSw1MjMyLDExODYsICAxNSw1MjMzLDEwNzksMTA3MCw1MjM0LDE1MjIsMzIyNCwzNTk0LCAyNzYsMTA1MCwyNzI1LCA3NTgsICMgMjAzMgoxMTI2LCA2NTMsMjk2MCwzMjk2LDUyMzUsMjM0MiwgODg5LDM1OTUsNDAyMiwzMTA0LDMwMDcsIDkwMywxMjUwLDQ2MDksNDAyMywzNDgxLCAjIDIwNDgKMzU5NiwxMzQyLDE2ODEsMTcxOCwgNzY2LDMyOTcsIDI4NiwgIDg5LDI5NjEsMzcxNSw1MjM2LDE3MTMsNTIzNywyNjA3LDMzNzEsMzAwOCwgIyAyMDY0CjUyMzgsMjk2MiwyMjE5LDMyMjUsMjg4MCw1MjM5LDQ2MTAsMjUwNSwyNTMzLCAxODEsIDM4NywxMDc1LDQwMjQsIDczMSwyMTkwLDMzNzIsICMgMjA4MAo1MjQwLDMyOTgsIDMxMCwgMzEzLDM0ODIsMjMwNCwgNzcwLDQyNzgsICA1NCwzMDU0LCAxODksNDYxMSwzMTA1LDM4NDgsNDAyNSw1MjQxLCAjIDIwOTYKMTIzMCwxNjE3LDE4NTAsIDM1NSwzNTk3LDQyNzksNDYxMiwzMzczLCAxMTEsNDI4MCwzNzE2LDEzNTAsMzE2MCwzNDgzLDMwNTUsNDI4MSwgIyAyMTEyCjIxNTAsMzI5OSwzNTk4LDUyNDIsMjc5Nyw0MDI2LDQwMjcsMzAwOSwgNzIyLDIwMDksNTI0MywxMDcxLCAyNDcsMTIwNywyMzQzLDI0NzgsICMgMjEyOAoxMzc4LDQ2MTMsMjAxMCwgODY0LDE0MzcsMTIxNCw0NjE0LCAzNzMsMzg0OSwxMTQyLDIyMjAsIDY2Nyw0NjE1LCA0NDIsMjc2MywyNTYzLCAjIDIxNDQKMzg1MCw0MDI4LDE5NjksNDI4MiwzMzAwLDE4NDAsIDgzNywgMTcwLDExMDcsIDkzNCwxMzM2LDE4ODMsNTI0NCw1MjQ1LDIxMTksNDI4MywgIyAyMTYwCjI4NDEsIDc0MywxNTY5LDUyNDYsNDYxNiw0Mjg0LCA1ODIsMjM4OSwxNDE4LDM0ODQsNTI0NywxODAzLDUyNDgsIDM1NywxMzk1LDE3MjksICMgMjE3NgozNzE3LDMzMDEsMjQyMywxNTY0LDIyNDEsNTI0OSwzMTA2LDM4NTEsMTYzMyw0NjE3LDExMTQsMjA4Niw0Mjg1LDE1MzIsNTI1MCwgNDgyLCAjIDIxOTIKMjQ1MSw0NjE4LDUyNTEsNTI1MiwxNDkyLCA4MzMsMTQ2Niw1MjUzLDI3MjYsMzU5OSwxNjQxLDI4NDIsNTI1NCwxNTI2LDEyNzIsMzcxOCwgIyAyMjA4CjQyODYsMTY4NiwxNzk1LCA0MTYsMjU2NCwxOTAzLDE5NTQsMTgwNCw1MjU1LDM4NTIsMjc5OCwzODUzLDExNTksMjMyMSw1MjU2LDI4ODEsICMgMjIyNAo0NjE5LDE2MTAsMTU4NCwzMDU2LDI0MjQsMjc2NCwgNDQzLDMzMDIsMTE2MywzMTYxLDUyNTcsNTI1OCw0MDI5LDUyNTksNDI4NywyNTA2LCAjIDIyNDAKMzA1Nyw0NjIwLDQwMzAsMzE2MiwyMTA0LDE2NDcsMzYwMCwyMDExLDE4NzMsNDI4OCw1MjYwLDQyODksIDQzMSwzNDg1LDUyNjEsIDI1MCwgIyAyMjU2CiAgOTcsICA4MSw0MjkwLDUyNjIsMTY0OCwxODUxLDE1NTgsIDE2MCwgODQ4LDUyNjMsIDg2NiwgNzQwLDE2OTQsNTI2NCwyMjA0LDI4NDMsICMgMjI3MgozMjI2LDQyOTEsNDYyMSwzNzE5LDE2ODcsIDk1MCwyNDc5LCA0MjYsIDQ2OSwzMjI3LDM3MjAsMzcyMSw0MDMxLDUyNjUsNTI2NiwxMTg4LCAjIDIyODgKIDQyNCwxOTk2LCA4NjEsMzYwMSw0MjkyLDM4NTQsMjIwNSwyNjk0LCAxNjgsMTIzNSwzNjAyLDQyOTMsNTI2NywyMDg3LDE2NzQsNDYyMiwgIyAyMzA0CjMzNzQsMzMwMywgMjIwLDI1NjUsMTAwOSw1MjY4LDM4NTUsIDY3MCwzMDEwLCAzMzIsMTIwOCwgNzE3LDUyNjksNTI3MCwzNjAzLDI0NTIsICMgMjMyMAo0MDMyLDMzNzUsNTI3MSwgNTEzLDUyNzIsMTIwOSwyODgyLDMzNzYsMzE2Myw0NjIzLDEwODAsNTI3Myw1Mjc0LDUyNzUsNTI3NiwyNTM0LCAjIDIzMzYKMzcyMiwzNjA0LCA4MTUsMTU4Nyw0MDMzLDQwMzQsNTI3NywzNjA1LDM0ODYsMzg1NiwxMjU0LDQ2MjQsMTMyOCwzMDU4LDEzOTAsNDAzNSwgIyAyMzUyCjE3NDEsNDAzNiwzODU3LDQwMzcsNTI3OCwgMjM2LDM4NTgsMjQ1MywzMzA0LDUyNzksNTI4MCwzNzIzLDM4NTksMTI3MywzODYwLDQ2MjUsICMgMjM2OAo1MjgxLCAzMDgsNTI4Miw0NjI2LCAyNDUsNDYyNywxODUyLDI0ODAsMTMwNywyNTgzLCA0MzAsIDcxNSwyMTM3LDI0NTQsNTI4MywgMjcwLCAjIDIzODQKIDE5OSwyODgzLDQwMzgsNTI4NCwzNjA2LDI3MjcsMTc1MywgNzYxLDE3NTQsIDcyNSwxNjYxLDE4NDEsNDYyOCwzNDg3LDM3MjQsNTI4NSwgIyAyNDAwCjUyODYsIDU4NywgIDE0LDMzMDUsIDIyNywyNjA4LCAzMjYsIDQ4MCwyMjcwLCA5NDMsMjc2NSwzNjA3LCAyOTEsIDY1MCwxODg0LDUyODcsICMgMjQxNgoxNzAyLDEyMjYsIDEwMiwxNTQ3LCAgNjIsMzQ4OCwgOTA0LDQ2MjksMzQ4OSwxMTY0LDQyOTQsNTI4OCw1Mjg5LDEyMjQsMTU0OCwyNzY2LCAjIDI0MzIKIDM5MSwgNDk4LDE0OTMsNTI5MCwxMzg2LDE0MTksNTI5MSwyMDU2LDExNzcsNDYzMCwgODEzLCA4ODAsMTA4MSwyMzY4LCA1NjYsMTE0NSwgIyAyNDQ4CjQ2MzEsMjI5MSwxMDAxLDEwMzUsMjU2NiwyNjA5LDIyNDIsIDM5NCwxMjg2LDUyOTIsNTI5MywyMDY5LDUyOTQsICA4NiwxNDk0LDE3MzAsICMgMjQ2NAo0MDM5LCA0OTEsMTU4OCwgNzQ1LCA4OTcsMjk2MywgODQzLDMzNzcsNDA0MCwyNzY3LDI4ODQsMzMwNiwxNzY4LCA5OTgsMjIyMSwyMDcwLCAjIDI0ODAKIDM5NywxODI3LDExOTUsMTk3MCwzNzI1LDMwMTEsMzM3OCwgMjg0LDUyOTUsMzg2MSwyNTA3LDIxMzgsMjEyMCwxOTA0LDUyOTYsNDA0MSwgIyAyNDk2CjIxNTEsNDA0Miw0Mjk1LDEwMzYsMzQ5MCwxOTA1LCAxMTQsMjU2Nyw0Mjk2LCAyMDksMTUyNyw1Mjk3LDUyOTgsMjk2NCwyODQ0LDI2MzUsICMgMjUxMgoyMzkwLDI3MjgsMzE2NCwgODEyLDI1NjgsNTI5OSwzMzA3LDUzMDAsMTU1OSwgNzM3LDE4ODUsMzcyNiwxMjEwLCA4ODUsICAyOCwyNjk1LCAjIDI1MjgKMzYwOCwzODYyLDUzMDEsNDI5NywxMDA0LDE3ODAsNDYzMiw1MzAyLCAzNDYsMTk4MiwyMjIyLDI2OTYsNDYzMywzODYzLDE3NDIsIDc5NywgIyAyNTQ0CjE2NDIsNDA0MywxOTM0LDEwNzIsMTM4NCwyMTUyLCA4OTYsNDA0NCwzMzA4LDM3MjcsMzIyOCwyODg1LDM2MDksNTMwMywyNTY5LDE5NTksICMgMjU2MAo0NjM0LDI0NTUsMTc4Niw1MzA0LDUzMDUsNTMwNiw0MDQ1LDQyOTgsMTAwNSwxMzA4LDM3MjgsNDI5OSwyNzI5LDQ2MzUsNDYzNiwxNTI4LCAjIDI1NzYKMjYxMCwgMTYxLDExNzgsNDMwMCwxOTgzLCA5ODcsNDYzNywxMTAxLDQzMDEsIDYzMSw0MDQ2LDExNTcsMzIyOSwyNDI1LDEzNDMsMTI0MSwgIyAyNTkyCjEwMTYsMjI0MywyNTcwLCAzNzIsIDg3NywyMzQ0LDI1MDgsMTE2MCwgNTU1LDE5MzUsIDkxMSw0MDQ3LDUzMDcsIDQ2NiwxMTcwLCAxNjksICMgMjYwOAoxMDUxLDI5MjEsMjY5NywzNzI5LDI0ODEsMzAxMiwxMTgyLDIwMTIsMjU3MSwxMjUxLDI2MzYsNTMwOCwgOTkyLDIzNDUsMzQ5MSwxNTQwLCAjIDI2MjQKMjczMCwxMjAxLDIwNzEsMjQwNiwxOTk3LDI0ODIsNTMwOSw0NjM4LCA1MjgsMTkyMywyMTkxLDE1MDMsMTg3NCwxNTcwLDIzNjksMzM3OSwgIyAyNjQwCjMzMDksNTMxMCwgNTU3LDEwNzMsNTMxMSwxODI4LDM0OTIsMjA4OCwyMjcxLDMxNjUsMzA1OSwzMTA3LCA3NjcsMzEwOCwyNzk5LDQ2MzksICMgMjY1NgoxMDA2LDQzMDIsNDY0MCwyMzQ2LDEyNjcsMjE3OSwzNzMwLDMyMzAsIDc3OCw0MDQ4LDMyMzEsMjczMSwxNTk3LDI2NjcsNTMxMiw0NjQxLCAjIDI2NzIKNTMxMywzNDkzLDUzMTQsNTMxNSw1MzE2LDMzMTAsMjY5OCwxNDMzLDMzMTEsIDEzMSwgIDk1LDE1MDQsNDA0OSwgNzIzLDQzMDMsMzE2NiwgIyAyNjg4CjE4NDIsMzYxMCwyNzY4LDIxOTIsNDA1MCwyMDI4LDIxMDUsMzczMSw1MzE3LDMwMTMsNDA1MSwxMjE4LDUzMTgsMzM4MCwzMjMyLDQwNTIsICMgMjcwNAo0MzA0LDI1ODQsIDI0OCwxNjM0LDM4NjQsIDkxMiw1MzE5LDI4NDUsMzczMiwzMDYwLDM4NjUsIDY1NCwgIDUzLDUzMjAsMzAxNCw1MzIxLCAjIDI3MjAKMTY4OCw0NjQyLCA3NzcsMzQ5NCwxMDMyLDQwNTMsMTQyNSw1MzIyLCAxOTEsIDgyMCwyMTIxLDI4NDYsIDk3MSw0NjQzLCA5MzEsMzIzMywgIyAyNzM2CiAxMzUsIDY2NCwgNzgzLDM4NjYsMTk5OCwgNzcyLDI5MjIsMTkzNiw0MDU0LDM4NjcsNDY0NCwyOTIzLDMyMzQsIDI4MiwyNzMyLCA2NDAsICMgMjc1MgoxMzcyLDM0OTUsMTEyNywgOTIyLCAzMjUsMzM4MSw1MzIzLDUzMjQsIDcxMSwyMDQ1LDUzMjUsNTMyNiw0MDU1LDIyMjMsMjgwMCwxOTM3LCAjIDI3NjgKNDA1NiwzMzgyLDIyMjQsMjI1NSwzODY4LDIzMDUsNTMyNyw0NjQ1LDM4NjksMTI1OCwzMzEyLDQwNTcsMzIzNSwyMTM5LDI5NjUsNDA1OCwgIyAyNzg0CjQwNTksNTMyOCwyMjI1LCAyNTgsMzIzNiw0NjQ2LCAxMDEsMTIyNyw1MzI5LDMzMTMsMTc1NSw1MzMwLDEzOTEsMzMxNCw1MzMxLDI5MjQsICMgMjgwMAoyMDU3LCA4OTMsNTMzMiw1MzMzLDUzMzQsMTQwMiw0MzA1LDIzNDcsNTMzNSw1MzM2LDMyMzcsMzYxMSw1MzM3LDUzMzgsIDg3OCwxMzI1LCAjIDI4MTYKMTc4MSwyODAxLDQ2NDcsIDI1OSwxMzg1LDI1ODUsIDc0NCwxMTgzLDIyNzIsNDY0OCw1MzM5LDQwNjAsMjUwOSw1MzQwLCA2ODQsMTAyNCwgIyAyODMyCjQzMDYsNTM0MSwgNDcyLDM2MTIsMzQ5NiwxMTY1LDMzMTUsNDA2MSw0MDYyLCAzMjIsMjE1MywgODgxLCA0NTUsMTY5NSwxMTUyLDEzNDAsICMgMjg0OAogNjYwLCA1NTQsMjE1NCw0NjQ5LDEwNTgsNDY1MCw0MzA3LCA4MzAsMTA2NSwzMzgzLDQwNjMsNDY1MSwxOTI0LDUzNDIsMTcwMywxOTE5LCAjIDI4NjQKNTM0MywgOTMyLDIyNzMsIDEyMiw1MzQ0LDQ2NTIsIDk0NywgNjc3LDUzNDUsMzg3MCwyNjM3LCAyOTcsMTkwNiwxOTI1LDIyNzQsNDY1MywgIyAyODgwCjIzMjIsMzMxNiw1MzQ2LDUzNDcsNDMwOCw1MzQ4LDQzMDksICA4NCw0MzEwLCAxMTIsIDk4OSw1MzQ5LCA1NDcsMTA1OSw0MDY0LCA3MDEsICMgMjg5NgozNjEzLDEwMTksNTM1MCw0MzExLDUzNTEsMzQ5NywgOTQyLCA2MzksIDQ1NywyMzA2LDI0NTYsIDk5MywyOTY2LCA0MDcsIDg1MSwgNDk0LCAjIDI5MTIKNDY1NCwzMzg0LCA5MjcsNTM1MiwxMjM3LDUzNTMsMjQyNiwzMzg1LCA1NzMsNDMxMiwgNjgwLCA5MjEsMjkyNSwxMjc5LDE4NzUsIDI4NSwgIyAyOTI4CiA3OTAsMTQ0OCwxOTg0LCA3MTksMjE2OCw1MzU0LDUzNTUsNDY1NSw0MDY1LDQwNjYsMTY0OSw1MzU2LDE1NDEsIDU2Myw1MzU3LDEwNzcsICMgMjk0NAo1MzU4LDMzODYsMzA2MSwzNDk4LCA1MTEsMzAxNSw0MDY3LDQwNjgsMzczMyw0MDY5LDEyNjgsMjU3MiwzMzg3LDMyMzgsNDY1Niw0NjU3LCAjIDI5NjAKNTM1OSwgNTM1LDEwNDgsMTI3NiwxMTg5LDI5MjYsMjAyOSwzMTY3LDE0MzgsMTM3MywyODQ3LDI5NjcsMTEzNCwyMDEzLDUzNjAsNDMxMywgIyAyOTc2CjEyMzgsMjU4NiwzMTA5LDEyNTksNTM2MSwgNzAwLDUzNjIsMjk2OCwzMTY4LDM3MzQsNDMxNCw1MzYzLDQzMTUsMTE0NiwxODc2LDE5MDcsICMgMjk5Mgo0NjU4LDI2MTEsNDA3MCwgNzgxLDI0MjcsIDEzMiwxNTg5LCAyMDMsIDE0NywgMjczLDI4MDIsMjQwNywgODk4LDE3ODcsMjE1NSw0MDcxLCAjIDMwMDgKNDA3Miw1MzY0LDM4NzEsMjgwMyw1MzY1LDUzNjYsNDY1OSw0NjYwLDUzNjcsMzIzOSw1MzY4LDE2MzUsMzg3MiwgOTY1LDUzNjksMTgwNSwgIyAzMDI0CjI2OTksMTUxNiwzNjE0LDExMjEsMTA4MiwxMzI5LDMzMTcsNDA3MywxNDQ5LDM4NzMsICA2NSwxMTI4LDI4NDgsMjkyNywyNzY5LDE1OTAsICMgMzA0MAozODc0LDUzNzAsNTM3MSwgIDEyLDI2NjgsICA0NSwgOTc2LDI1ODcsMzE2OSw0NjYxLCA1MTcsMjUzNSwxMDEzLDEwMzcsMzI0MCw1MzcyLCAjIDMwNTYKMzg3NSwyODQ5LDUzNzMsMzg3Niw1Mzc0LDM0OTksNTM3NSwyNjEyLCA2MTQsMTk5OSwyMzIzLDM4NzcsMzExMCwyNzMzLDI2MzgsNTM3NiwgIyAzMDcyCjI1ODgsNDMxNiwgNTk5LDEyNjksNTM3NywxODExLDM3MzUsNTM3OCwyNzAwLDMxMTEsIDc1OSwxMDYwLCA0ODksMTgwNiwzMzg4LDMzMTgsICMgMzA4OAoxMzU4LDUzNzksNTM4MCwyMzkxLDEzODcsMTIxNSwyNjM5LDIyNTYsIDQ5MCw1MzgxLDUzODIsNDMxNywxNzU5LDIzOTIsMjM0OCw1MzgzLCAjIDMxMDQKNDY2MiwzODc4LDE5MDgsNDA3NCwyNjQwLDE4MDcsMzI0MSw0NjYzLDM1MDAsMzMxOSwyNzcwLDIzNDksIDg3NCw1Mzg0LDUzODUsMzUwMSwgIyAzMTIwCjM3MzYsMTg1OSwgIDkxLDI5MjgsMzczNywzMDYyLDM4NzksNDY2NCw1Mzg2LDMxNzAsNDA3NSwyNjY5LDUzODcsMzUwMiwxMjAyLDE0MDMsICMgMzEzNgozODgwLDI5NjksMjUzNiwxNTE3LDI1MTAsNDY2NSwzNTAzLDI1MTEsNTM4OCw0NjY2LDUzODksMjcwMSwxODg2LDE0OTUsMTczMSw0MDc2LCAjIDMxNTIKMjM3MCw0NjY3LDUzOTAsMjAzMCw1MzkxLDUzOTIsNDA3NywyNzAyLDEyMTYsIDIzNywyNTg5LDQzMTgsMjMyNCw0MDc4LDM4ODEsNDY2OCwgIyAzMTY4CjQ2NjksMjcwMywzNjE1LDM1MDQsIDQ0NSw0NjcwLDUzOTMsNTM5NCw1Mzk1LDUzOTYsMjc3MSwgIDYxLDQwNzksMzczOCwxODIzLDQwODAsICMgMzE4NAo1Mzk3LCA2ODcsMjA0NiwgOTM1LCA5MjUsIDQwNSwyNjcwLCA3MDMsMTA5NiwxODYwLDI3MzQsNDY3MSw0MDgxLDE4NzcsMTM2NywyNzA0LCAjIDMyMDAKMzM4OSwgOTE4LDIxMDYsMTc4MiwyNDgzLCAzMzQsMzMyMCwxNjExLDEwOTMsNDY3MiwgNTY0LDMxNzEsMzUwNSwzNzM5LDMzOTAsIDk0NSwgIyAzMjE2CjI2NDEsMjA1OCw0NjczLDUzOTgsMTkyNiwgODcyLDQzMTksNTM5OSwzNTA2LDI3MDUsMzExMiwgMzQ5LDQzMjAsMzc0MCw0MDgyLDQ2NzQsICMgMzIzMgozODgyLDQzMjEsMzc0MSwyMTU2LDQwODMsNDY3NSw0Njc2LDQzMjIsNDY3NywyNDA4LDIwNDcsIDc4Miw0MDg0LCA0MDAsIDI1MSw0MzIzLCAjIDMyNDgKMTYyNCw1NDAwLDU0MDEsIDI3NywzNzQyLCAyOTksMTI2NSwgNDc2LDExOTEsMzg4MywyMTIyLDQzMjQsNDMyNSwxMTA5LCAyMDUsNTQwMiwgIyAzMjY0CjI1OTAsMTAwMCwyMTU3LDM2MTYsMTg2MSw1NDAzLDU0MDQsNTQwNSw0Njc4LDU0MDYsNDY3OSwyNTczLCAxMDcsMjQ4NCwyMTU4LDQwODUsICMgMzI4MAozNTA3LDMxNzIsNTQwNywxNTMzLCA1NDEsMTMwMSwgMTU4LCA3NTMsNDMyNiwyODg2LDM2MTcsNTQwOCwxNjk2LCAzNzAsMTA4OCw0MzI3LCAjIDMyOTYKNDY4MCwzNjE4LCA1NzksIDMyNywgNDQwLCAxNjIsMjI0NCwgMjY5LDE5MzgsMTM3NCwzNTA4LCA5NjgsMzA2MywgIDU2LDEzOTYsMzExMywgIyAzMzEyCjIxMDcsMzMyMSwzMzkxLDU0MDksMTkyNywyMTU5LDQ2ODEsMzAxNiw1NDEwLDM2MTksNTQxMSw1NDEyLDM3NDMsNDY4MiwyNDg1LDU0MTMsICMgMzMyOAoyODA0LDU0MTQsMTY1MCw0NjgzLDU0MTUsMjYxMyw1NDE2LDU0MTcsNDA4NiwyNjcxLDMzOTIsMTE0OSwzMzkzLDQwODcsMzg4NCw0MDg4LCAjIDMzNDQKNTQxOCwxMDc2LCAgNDksNTQxOSwgOTUxLDMyNDIsMzMyMiwzMzIzLCA0NTAsMjg1MCwgOTIwLDU0MjAsMTgxMiwyODA1LDIzNzEsNDMyOCwgIyAzMzYwCjE5MDksMTEzOCwyMzcyLDM4ODUsMzUwOSw1NDIxLDMyNDMsNDY4NCwxOTEwLDExNDcsMTUxOCwyNDI4LDQ2ODUsMzg4Niw1NDIyLDQ2ODYsICMgMzM3NgoyMzkzLDI2MTQsIDI2MCwxNzk2LDMyNDQsNTQyMyw1NDI0LDM4ODcsMzMyNCwgNzA4LDU0MjUsMzYyMCwxNzA0LDU0MjYsMzYyMSwxMzUxLCAjIDMzOTIKMTYxOCwzMzk0LDMwMTcsMTg4NywgOTQ0LDQzMjksMzM5NSw0MzMwLDMwNjQsMzM5Niw0MzMxLDU0MjcsMzc0NCwgNDIyLCA0MTMsMTcxNCwgIyAzNDA4CjMzMjUsIDUwMCwyMDU5LDIzNTAsNDMzMiwyNDg2LDU0MjgsMTM0NCwxOTExLCA5NTQsNTQyOSwxNjY4LDU0MzAsNTQzMSw0MDg5LDI0MDksICMgMzQyNAo0MzMzLDM2MjIsMzg4OCw0MzM0LDU0MzIsMjMwNywxMzE4LDI1MTIsMzExNCwgMTMzLDMxMTUsMjg4Nyw0Njg3LCA2MjksICAzMSwyODUxLCAjIDM0NDAKMjcwNiwzODg5LDQ2ODgsIDg1MCwgOTQ5LDQ2ODksNDA5MCwyOTcwLDE3MzIsMjA4OSw0MzM1LDE0OTYsMTg1Myw1NDMzLDQwOTEsIDYyMCwgIyAzNDU2CjMyNDUsIDk4MSwxMjQyLDM3NDUsMzM5NywxNjE5LDM3NDYsMTY0MywzMzI2LDIxNDAsMjQ1NywxOTcxLDE3MTksMzUxMCwyMTY5LDU0MzQsICMgMzQ3MgozMjQ2LDU0MzUsNTQzNiwzMzk4LDE4MjksNTQzNywxMjc3LDQ2OTAsMTU2NSwyMDQ4LDU0MzgsMTYzNiwzNjIzLDMxMTYsNTQzOSwgODY5LCAjIDM0ODgKMjg1MiwgNjU1LDM4OTAsMzg5MSwzMTE3LDQwOTIsMzAxOCwzODkyLDEzMTAsMzYyNCw0NjkxLDU0NDAsNTQ0MSw1NDQyLDE3MzMsIDU1OCwgIyAzNTA0CjQ2OTIsMzc0NywgMzM1LDE1NDksMzA2NSwxNzU2LDQzMzYsMzc0OCwxOTQ2LDM1MTEsMTgzMCwxMjkxLDExOTIsIDQ3MCwyNzM1LDIxMDgsICMgMzUyMAoyODA2LCA5MTMsMTA1NCw0MDkzLDU0NDMsMTAyNyw1NDQ0LDMwNjYsNDA5NCw0NjkzLCA5ODIsMjY3MiwzMzk5LDMxNzMsMzUxMiwzMjQ3LCAjIDM1MzYKMzI0OCwxOTQ3LDI4MDcsNTQ0NSwgNTcxLDQ2OTQsNTQ0NiwxODMxLDU0NDcsMzYyNSwyNTkxLDE1MjMsMjQyOSw1NDQ4LDIwOTAsIDk4NCwgIyAzNTUyCjQ2OTUsMzc0OSwxOTYwLDU0NDksMzc1MCwgODUyLCA5MjMsMjgwOCwzNTEzLDM3NTEsIDk2OSwxNTE5LCA5OTksMjA0OSwyMzI1LDE3MDUsICMgMzU2OAo1NDUwLDMxMTgsIDYxNSwxNjYyLCAxNTEsIDU5Nyw0MDk1LDI0MTAsMjMyNiwxMDQ5LCAyNzUsNDY5NiwzNzUyLDQzMzcsIDU2OCwzNzUzLCAjIDM1ODQKMzYyNiwyNDg3LDQzMzgsMzc1NCw1NDUxLDI0MzAsMjI3NSwgNDA5LDMyNDksNTQ1MiwxNTY2LDI4ODgsMzUxNCwxMDAyLCA3NjksMjg1MywgIyAzNjAwCiAxOTQsMjA5MSwzMTc0LDM3NTUsMjIyNiwzMzI3LDQzMzksIDYyOCwxNTA1LDU0NTMsNTQ1NCwxNzYzLDIxODAsMzAxOSw0MDk2LCA1MjEsICMgMzYxNgoxMTYxLDI1OTIsMTc4OCwyMjA2LDI0MTEsNDY5Nyw0MDk3LDE2MjUsNDM0MCw0MzQxLCA0MTIsICA0MiwzMTE5LCA0NjQsNTQ1NSwyNjQyLCAjIDM2MzIKNDY5OCwzNDAwLDE3NjAsMTU3MSwyODg5LDM1MTUsMjUzNywxMjE5LDIyMDcsMzg5MywyNjQzLDIxNDEsMjM3Myw0Njk5LDQ3MDAsMzMyOCwgIyAzNjQ4CjE2NTEsMzQwMSwzNjI3LDU0NTYsNTQ1NywzNjI4LDI0ODgsMzUxNiw1NDU4LDM3NTYsNTQ1OSw1NDYwLDIyNzYsMjA5MiwgNDYwLDU0NjEsICMgMzY2NAo0NzAxLDU0NjIsMzAyMCwgOTYyLCA1ODgsMzYyOSwgMjg5LDMyNTAsMjY0NCwxMTE2LCAgNTIsNTQ2MywzMDY3LDE3OTcsNTQ2NCw1NDY1LCAjIDM2ODAKNTQ2NiwxNDY3LDU0NjcsMTU5OCwxMTQzLDM3NTcsNDM0MiwxOTg1LDE3MzQsMTA2Nyw0NzAyLDEyODAsMzQwMiwgNDY1LDQ3MDMsMTU3MiwgIyAzNjk2CiA1MTAsNTQ2OCwxOTI4LDIyNDUsMTgxMywxNjQ0LDM2MzAsNTQ2OSw0NzA0LDM3NTgsNTQ3MCw1NDcxLDI2NzMsMTU3MywxNTM0LDU0NzIsICMgMzcxMgo1NDczLCA1MzYsMTgwOCwxNzYxLDM1MTcsMzg5NCwzMTc1LDI2NDUsNTQ3NCw1NDc1LDU0NzYsNDcwNSwzNTE4LDI5MjksMTkxMiwyODA5LCAjIDM3MjgKNTQ3NywzMzI5LDExMjIsIDM3NywzMjUxLDU0NzgsIDM2MCw1NDc5LDU0ODAsNDM0MywxNTI5LCA1NTEsNTQ4MSwyMDYwLDM3NTksMTc2OSwgIyAzNzQ0CjI0MzEsNTQ4MiwyOTMwLDQzNDQsMzMzMCwzMTIwLDIzMjcsMjEwOSwyMDMxLDQ3MDYsMTQwNCwgMTM2LDE0NjgsMTQ3OSwgNjcyLDExNzEsICMgMzc2MAozMjUyLDIzMDgsIDI3MSwzMTc2LDU0ODMsMjc3Miw1NDg0LDIwNTAsIDY3OCwyNzM2LCA4NjUsMTk0OCw0NzA3LDU0ODUsMjAxNCw0MDk4LCAjIDM3NzYKMjk3MSw1NDg2LDI3MzcsMjIyNywxMzk3LDMwNjgsMzc2MCw0NzA4LDQ3MDksMTczNSwyOTMxLDM0MDMsMzYzMSw1NDg3LDM4OTUsIDUwOSwgIyAzNzkyCjI4NTQsMjQ1OCwyODkwLDM4OTYsNTQ4OCw1NDg5LDMxNzcsMzE3OCw0NzEwLDQzNDUsMjUzOCw0NzExLDIzMDksMTE2NiwxMDEwLCA1NTIsICMgMzgwOAogNjgxLDE4ODgsNTQ5MCw1NDkxLDI5NzIsMjk3Myw0MDk5LDEyODcsMTU5NiwxODYyLDMxNzksIDM1OCwgNDUzLCA3MzYsIDE3NSwgNDc4LCAjIDM4MjQKMTExNywgOTA1LDExNjcsMTA5Nyw1NDkyLDE4NTQsMTUzMCw1NDkzLDE3MDYsNTQ5NCwyMTgxLDM1MTksMjI5MiwzNzYxLDM1MjAsMzYzMiwgIyAzODQwCjQzNDYsMjA5Myw0MzQ3LDU0OTUsMzQwNCwxMTkzLDI0ODksNDM0OCwxNDU4LDIxOTMsMjIwOCwxODYzLDE4ODksMTQyMSwzMzMxLDI5MzIsICMgMzg1NgozMDY5LDIxODIsMzUyMSwgNTk1LDIxMjMsNTQ5Niw0MTAwLDU0OTcsNTQ5OCw0MzQ5LDE3MDcsMjY0NiwgMjIzLDM3NjIsMTM1OSwgNzUxLCAjIDM4NzIKMzEyMSwgMTgzLDM1MjIsNTQ5OSwyODEwLDMwMjEsIDQxOSwyMzc0LCA2MzMsIDcwNCwzODk3LDIzOTQsIDI0MSw1NTAwLDU1MDEsNTUwMiwgIyAzODg4CiA4MzgsMzAyMiwzNzYzLDIyNzcsMjc3MywyNDU5LDM4OTgsMTkzOSwyMDUxLDQxMDEsMTMwOSwzMTIyLDIyNDYsMTE4MSw1NTAzLDExMzYsICMgMzkwNAoyMjA5LDM4OTksMjM3NSwxNDQ2LDQzNTAsMjMxMCw0NzEyLDU1MDQsNTUwNSw0MzUxLDEwNTUsMjYxNSwgNDg0LDM3NjQsNTUwNiw0MTAyLCAjIDM5MjAKIDYyNSw0MzUyLDIyNzgsMzQwNSwxNDk5LDQzNTMsNDEwMyw1NTA3LDQxMDQsNDM1NCwzMjUzLDIyNzksMjI4MCwzNTIzLDU1MDgsNTUwOSwgIyAzOTM2CjI3NzQsIDgwOCwyNjE2LDM3NjUsMzQwNiw0MTA1LDQzNTUsMzEyMywyNTM5LCA1MjYsMzQwNywzOTAwLDQzNTYsIDk1NSw1NTEwLDE2MjAsICMgMzk1Mgo0MzU3LDI2NDcsMjQzMiw1NTExLDE0MjksMzc2NiwxNjY5LDE4MzIsIDk5NCwgOTI4LDU1MTIsMzYzMywxMjYwLDU1MTMsNTUxNCw1NTE1LCAjIDM5NjgKMTk0OSwyMjkzLCA3NDEsMjkzMywxNjI2LDQzNTgsMjczOCwyNDYwLCA4NjcsMTE4NCwgMzYyLDM0MDgsMTM5Miw1NTE2LDU1MTcsNDEwNiwgIyAzOTg0CjQzNTksMTc3MCwxNzM2LDMyNTQsMjkzNCw0NzEzLDQ3MTQsMTkyOSwyNzA3LDE0NTksMTE1OCw1NTE4LDMwNzAsMzQwOSwyODkxLDEyOTIsICMgNDAwMAoxOTMwLDI1MTMsMjg1NSwzNzY3LDE5ODYsMTE4NywyMDcyLDIwMTUsMjYxNyw0MzYwLDU1MTksMjU3NCwyNTE0LDIxNzAsMzc2OCwyNDkwLCAjIDQwMTYKMzMzMiw1NTIwLDM3NjksNDcxNSw1NTIxLDU1MjIsIDY2NiwxMDAzLDMwMjMsMTAyMiwzNjM0LDQzNjEsNTUyMyw0NzE2LDE4MTQsMjI1NywgIyA0MDMyCiA1NzQsMzkwMSwxNjAzLCAyOTUsMTUzNSwgNzA1LDM5MDIsNDM2MiwgMjgzLCA4NTgsIDQxNyw1NTI0LDU1MjUsMzI1NSw0NzE3LDQ3MTgsICMgNDA0OAozMDcxLDEyMjAsMTg5MCwxMDQ2LDIyODEsMjQ2MSw0MTA3LDEzOTMsMTU5OSwgNjg5LDI1NzUsIDM4OCw0MzYzLDU1MjYsMjQ5MSwgODAyLCAjIDQwNjQKNTUyNywyODExLDM5MDMsMjA2MSwxNDA1LDIyNTgsNTUyOCw0NzE5LDM5MDQsMjExMCwxMDUyLDEzNDUsMzI1NiwxNTg1LDU1MjksIDgwOSwgIyA0MDgwCjU1MzAsNTUzMSw1NTMyLCA1NzUsMjczOSwzNTI0LCA5NTYsMTU1MiwxNDY5LDExNDQsMjMyOCw1NTMzLDIzMjksMTU2MCwyNDYyLDM2MzUsICMgNDA5NgozMjU3LDQxMDgsIDYxNiwyMjEwLDQzNjQsMzE4MCwyMTgzLDIyOTQsNTUzNCwxODMzLDU1MzUsMzUyNSw0NzIwLDU1MzYsMTMxOSwzNzcwLCAjIDQxMTIKMzc3MSwxMjExLDM2MzYsMTAyMywzMjU4LDEyOTMsMjgxMiw1NTM3LDU1MzgsNTUzOSwzOTA1LCA2MDcsMjMxMSwzOTA2LCA3NjIsMjg5MiwgIyA0MTI4CjE0MzksNDM2NSwxMzYwLDQ3MjEsMTQ4NSwzMDcyLDU1NDAsNDcyMiwxMDM4LDQzNjYsMTQ1MCwyMDYyLDI2NDgsNDM2NywxMzc5LDQ3MjMsICMgNDE0NAoyNTkzLDU1NDEsNTU0Miw0MzY4LDEzNTIsMTQxNCwyMzMwLDI5MzUsMTE3Miw1NTQzLDU1NDQsMzkwNywzOTA4LDQ3MjQsMTc5OCwxNDUxLCAjIDQxNjAKNTU0NSw1NTQ2LDU1NDcsNTU0OCwyOTM2LDQxMDksNDExMCwyNDkyLDIzNTEsIDQxMSw0MTExLDQxMTIsMzYzNywzMzMzLDMxMjQsNDcyNSwgIyA0MTc2CjE1NjEsMjY3NCwxNDUyLDQxMTMsMTM3NSw1NTQ5LDU1NTAsICA0NywyOTc0LCAzMTYsNTU1MSwxNDA2LDE1OTEsMjkzNywzMTgxLDU1NTIsICMgNDE5MgoxMDI1LDIxNDIsMzEyNSwzMTgyLCAzNTQsMjc0MCwgODg0LDIyMjgsNDM2OSwyNDEyLCA1MDgsMzc3MiwgNzI2LDM2MzgsIDk5NiwyNDMzLCAjIDQyMDgKMzYzOSwgNzI5LDU1NTMsIDM5MiwyMTk0LDE0NTMsNDExNCw0NzI2LDM3NzMsNTU1NCw1NTU1LDI0NjMsMzY0MCwyNjE4LDE2NzUsMjgxMywgIyA0MjI0CiA5MTksMjM1MiwyOTc1LDIzNTMsMTI3MCw0NzI3LDQxMTUsICA3Myw1NTU2LDU1NTcsIDY0Nyw1NTU4LDMyNTksMjg1NiwyMjU5LDE1NTAsICMgNDI0MAoxMzQ2LDMwMjQsNTU1OSwxMzMyLCA4ODMsMzUyNiw1NTYwLDU1NjEsNTU2Miw1NTYzLDMzMzQsMjc3NSw1NTY0LDEyMTIsIDgzMSwxMzQ3LCAjIDQyNTYKNDM3MCw0NzI4LDIzMzEsMzkwOSwxODY0LDMwNzMsIDcyMCwzOTEwLDQ3MjksNDczMCwzOTExLDU1NjUsNDM3MSw1NTY2LDU1NjcsNDczMSwgIyA0MjcyCjU1NjgsNTU2OSwxNzk5LDQ3MzIsMzc3NCwyNjE5LDQ3MzMsMzY0MSwxNjQ1LDIzNzYsNDczNCw1NTcwLDI5MzgsIDY2OSwyMjExLDI2NzUsICMgNDI4OAoyNDM0LDU1NzEsMjg5Myw1NTcyLDU1NzMsMTAyOCwzMjYwLDU1NzQsNDM3MiwyNDEzLDU1NzUsMjI2MCwxMzUzLDU1NzYsNTU3Nyw0NzM1LCAjIDQzMDQKMzE4MywgNTE4LDU1NzgsNDExNiw1NTc5LDQzNzMsMTk2MSw1NTgwLDIxNDMsNDM3NCw1NTgxLDU1ODIsMzAyNSwyMzU0LDIzNTUsMzkxMiwgIyA0MzIwCiA1MTYsMTgzNCwxNDU0LDQxMTcsMjcwOCw0Mzc1LDQ3MzYsMjIyOSwyNjIwLDE5NzIsMTEyOSwzNjQyLDU1ODMsMjc3Niw1NTg0LDI5NzYsICMgNDMzNgoxNDIyLCA1NzcsMTQ3MCwzMDI2LDE1MjQsMzQxMCw1NTg1LDU1ODYsIDQzMiw0Mzc2LDMwNzQsMzUyNyw1NTg3LDI1OTQsMTQ1NSwyNTE1LCAjIDQzNTIKMjIzMCwxOTczLDExNzUsNTU4OCwxMDIwLDI3NDEsNDExOCwzNTI4LDQ3MzcsNTU4OSwyNzQyLDU1OTAsMTc0MywxMzYxLDMwNzUsMzUyOSwgIyA0MzY4CjI2NDksNDExOSw0Mzc3LDQ3MzgsMjI5NSwgODk1LCA5MjQsNDM3OCwyMTcxLCAzMzEsMjI0NywzMDc2LCAxNjYsMTYyNywzMDc3LDEwOTgsICMgNDM4NAo1NTkxLDEyMzIsMjg5NCwyMjMxLDM0MTEsNDczOSwgNjU3LCA0MDMsMTE5NiwyMzc3LCA1NDIsMzc3NSwzNDEyLDE2MDAsNDM3OSwzNTMwLCAjIDQ0MDAKNTU5Miw0NzQwLDI3NzcsMzI2MSwgNTc2LCA1MzAsMTM2Miw0NzQxLDQ3NDIsMjU0MCwyNjc2LDM3NzYsNDEyMCw1NTkzLCA4NDIsMzkxMywgIyA0NDE2CjU1OTQsMjgxNCwyMDMyLDEwMTQsNDEyMSwgMjEzLDI3MDksMzQxMywgNjY1LCA2MjEsNDM4MCw1NTk1LDM3NzcsMjkzOSwyNDM1LDU1OTYsICMgNDQzMgoyNDM2LDMzMzUsMzY0MywzNDE0LDQ3NDMsNDM4MSwyNTQxLDQzODIsNDc0NCwzNjQ0LDE2ODIsNDM4MywzNTMxLDEzODAsNTU5NywgNzI0LCAjIDQ0NDgKMjI4MiwgNjAwLDE2NzAsNTU5OCwxMzM3LDEyMzMsNDc0NSwzMTI2LDIyNDgsNTU5OSwxNjIxLDQ3NDYsNTYwMCwgNjUxLDQzODQsNTYwMSwgIyA0NDY0CjE2MTIsNDM4NSwyNjIxLDU2MDIsMjg1Nyw1NjAzLDI3NDMsMjMxMiwzMDc4LDU2MDQsIDcxNiwyNDY0LDMwNzksIDE3NCwxMjU1LDI3MTAsICMgNDQ4MAo0MTIyLDM2NDUsIDU0OCwxMzIwLDEzOTgsIDcyOCw0MTIzLDE1NzQsNTYwNSwxODkxLDExOTcsMzA4MCw0MTI0LDU2MDYsMzA4MSwzMDgyLCAjIDQ0OTYKMzc3OCwzNjQ2LDM3NzksIDc0Nyw1NjA3LCA2MzUsNDM4Niw0NzQ3LDU2MDgsNTYwOSw1NjEwLDQzODcsNTYxMSw1NjEyLDQ3NDgsNTYxMywgIyA0NTEyCjM0MTUsNDc0OSwyNDM3LCA0NTEsNTYxNCwzNzgwLDI1NDIsMjA3Myw0Mzg4LDI3NDQsNDM4OSw0MTI1LDU2MTUsMTc2NCw0NzUwLDU2MTYsICMgNDUyOAo0MzkwLCAzNTAsNDc1MSwyMjgzLDIzOTUsMjQ5Myw1NjE3LDQzOTEsNDEyNiwyMjQ5LDE0MzQsNDEyNywgNDg4LDQ3NTIsIDQ1OCw0MzkyLCAjIDQ1NDQKNDEyOCwzNzgxLCA3NzEsMTMzMCwyMzk2LDM5MTQsMjU3NiwzMTg0LDIxNjAsMjQxNCwxNTUzLDI2NzcsMzE4NSw0MzkzLDU2MTgsMjQ5NCwgIyA0NTYwCjI4OTUsMjYyMiwxNzIwLDI3MTEsNDM5NCwzNDE2LDQ3NTMsNTYxOSwyNTQzLDQzOTUsNTYyMCwzMjYyLDQzOTYsMjc3OCw1NjIxLDIwMTYsICMgNDU3NgoyNzQ1LDU2MjIsMTE1NSwxMDE3LDM3ODIsMzkxNSw1NjIzLDMzMzYsMjMxMywgMjAxLDE4NjUsNDM5NywxNDMwLDU2MjQsNDEyOSw1NjI1LCAjIDQ1OTIKNTYyNiw1NjI3LDU2MjgsNTYyOSw0Mzk4LDE2MDQsNTYzMCwgNDE0LDE4NjYsIDM3MSwyNTk1LDQ3NTQsNDc1NSwzNTMyLDIwMTcsMzEyNywgIyA0NjA4CjQ3NTYsMTcwOCwgOTYwLDQzOTksIDg4NywgMzg5LDIxNzIsMTUzNiwxNjYzLDE3MjEsNTYzMSwyMjMyLDQxMzAsMjM1NiwyOTQwLDE1ODAsICMgNDYyNAo1NjMyLDU2MzMsMTc0NCw0NzU3LDI1NDQsNDc1OCw0NzU5LDU2MzQsNDc2MCw1NjM1LDIwNzQsNTYzNiw0NzYxLDM2NDcsMzQxNywyODk2LCAjIDQ2NDAKNDQwMCw1NjM3LDQ0MDEsMjY1MCwzNDE4LDI4MTUsIDY3MywyNzEyLDI0NjUsIDcwOSwzNTMzLDQxMzEsMzY0OCw0NDAyLDU2MzgsMTE0OCwgIyA0NjU2CiA1MDIsIDYzNCw1NjM5LDU2NDAsMTIwNCw0NzYyLDM2NDksMTU3NSw0NzYzLDI2MjMsMzc4Myw1NjQxLDM3ODQsMzEyOCwgOTQ4LDMyNjMsICMgNDY3MgogMTIxLDE3NDUsMzkxNiwxMTEwLDU2NDIsNDQwMywzMDgzLDI1MTYsMzAyNyw0MTMyLDM3ODUsMTE1MSwxNzcxLDM5MTcsMTQ4OCw0MTMzLCAjIDQ2ODgKMTk4Nyw1NjQzLDI0MzgsMzUzNCw1NjQ0LDU2NDUsMjA5NCw1NjQ2LDQ0MDQsMzkxOCwxMjEzLDE0MDcsMjgxNiwgNTMxLDI3NDYsMjU0NSwgIyA0NzA0CjMyNjQsMTAxMSwxNTM3LDQ3NjQsMjc3OSw0NDA1LDMxMjksMTA2MSw1NjQ3LDM3ODYsMzc4NywxODY3LDI4OTcsNTY0OCwyMDE4LCAxMjAsICMgNDcyMAo0NDA2LDQ0MDcsMjA2MywzNjUwLDMyNjUsMjMxNCwzOTE5LDI2NzgsMzQxOSwxOTU1LDQ3NjUsNDEzNCw1NjQ5LDM1MzUsMTA0NywyNzEzLCAjIDQ3MzYKMTI2Niw1NjUwLDEzNjgsNDc2NiwyODU4LCA2NDksMzQyMCwzOTIwLDI1NDYsMjc0NywxMTAyLDI4NTksMjY3OSw1NjUxLDU2NTIsMjAwMCwgIyA0NzUyCjU2NTMsMTExMSwzNjUxLDI5NzcsNTY1NCwyNDk1LDM5MjEsMzY1MiwyODE3LDE4NTUsMzQyMSwzNzg4LDU2NTUsNTY1NiwzNDIyLDI0MTUsICMgNDc2OAoyODk4LDMzMzcsMzI2NiwzNjUzLDU2NTcsMjU3Nyw1NjU4LDM2NTQsMjgxOCw0MTM1LDE0NjAsIDg1Niw1NjU5LDM2NTUsNTY2MCwyODk5LCAjIDQ3ODQKMjk3OCw1NjYxLDI5MDAsMzkyMiw1NjYyLDQ0MDgsIDYzMiwyNTE3LCA4NzUsMzkyMywxNjk3LDM5MjQsMjI5Niw1NjYzLDU2NjQsNDc2NywgIyA0ODAwCjMwMjgsMTIzOSwgNTgwLDQ3NjgsNDQwOSw1NjY1LCA5MTQsIDkzNiwyMDc1LDExOTAsNDEzNiwxMDM5LDIxMjQsNTY2Niw1NjY3LDU2NjgsICMgNDgxNgo1NjY5LDM0MjMsMTQ3Myw1NjcwLDEzNTQsNDQxMCwzOTI1LDQ3NjksMjE3MywzMDg0LDQxMzcsIDkxNSwzMzM4LDQ0MTEsNDQxMiwzMzM5LCAjIDQ4MzIKMTYwNSwxODM1LDU2NzEsMjc0OCwgMzk4LDM2NTYsNDQxMywzOTI2LDQxMzgsIDMyOCwxOTEzLDI4NjAsNDEzOSwzOTI3LDEzMzEsNDQxNCwgIyA0ODQ4CjMwMjksIDkzNyw0NDE1LDU2NzIsMzY1Nyw0MTQwLDQxNDEsMzQyNCwyMTYxLDQ3NzAsMzQyNSwgNTI0LCA3NDIsIDUzOCwzMDg1LDEwMTIsICMgNDg2NAo1NjczLDU2NzQsMzkyOCwyNDY2LDU2NzUsIDY1OCwxMTAzLCAyMjUsMzkyOSw1Njc2LDU2NzcsNDc3MSw1Njc4LDQ3NzIsNTY3OSwzMjY3LCAjIDQ4ODAKMTI0Myw1NjgwLDQxNDIsIDk2MywyMjUwLDQ3NzMsNTY4MSwyNzE0LDM2NTgsMzE4Niw1NjgyLDU2ODMsMjU5NiwyMzMyLDU2ODQsNDc3NCwgIyA0ODk2CjU2ODUsNTY4Niw1Njg3LDM1MzYsIDk1NywzNDI2LDI1NDcsMjAzMywxOTMxLDI5NDEsMjQ2NywgODcwLDIwMTksMzY1OSwxNzQ2LDI3ODAsICMgNDkxMgoyNzgxLDI0MzksMjQ2OCw1Njg4LDM5MzAsNTY4OSwzNzg5LDMxMzAsMzc5MCwzNTM3LDM0MjcsMzc5MSw1NjkwLDExNzksMzA4Niw1NjkxLCAjIDQ5MjgKMzE4NywyMzc4LDQ0MTYsMzc5MiwyNTQ4LDMxODgsMzEzMSwyNzQ5LDQxNDMsNTY5MiwzNDI4LDE1NTYsMjU0OSwyMjk3LCA5NzcsMjkwMSwgIyA0OTQ0CjIwMzQsNDE0NCwxMjA1LDM0MjksNTY5MywxNzY1LDM0MzAsMzE4OSwyMTI1LDEyNzEsIDcxNCwxNjg5LDQ3NzUsMzUzOCw1Njk0LDIzMzMsICMgNDk2MAozOTMxLCA1MzMsNDQxNywzNjYwLDIxODQsIDYxNyw1Njk1LDI0NjksMzM0MCwzNTM5LDIzMTUsNTY5Niw1Njk3LDMxOTAsNTY5OCw1Njk5LCAjIDQ5NzYKMzkzMiwxOTg4LCA2MTgsIDQyNywyNjUxLDM1NDAsMzQzMSw1NzAwLDU3MDEsMTI0NCwxNjkwLDU3MDIsMjgxOSw0NDE4LDQ3NzYsNTcwMywgIyA0OTkyCjM1NDEsNDc3Nyw1NzA0LDIyODQsMTU3NiwgNDczLDM2NjEsNDQxOSwzNDMyLCA5NzIsNTcwNSwzNjYyLDU3MDYsMzA4Nyw1NzA3LDU3MDgsICMgNTAwOAo0Nzc4LDQ3NzksNTcwOSwzNzkzLDQxNDUsNDE0Niw1NzEwLCAxNTMsNDc4MCwgMzU2LDU3MTEsMTg5MiwyOTAyLDQ0MjAsMjE0NCwgNDA4LCAjIDUwMjQKIDgwMywyMzU3LDU3MTIsMzkzMyw1NzEzLDQ0MjEsMTY0NiwyNTc4LDI1MTgsNDc4MSw0NzgyLDM5MzQsNTcxNCwzOTM1LDQ0MjIsNTcxNSwgIyA1MDQwCjI0MTYsMzQzMywgNzUyLDU3MTYsNTcxNywxOTYyLDMzNDEsMjk3OSw1NzE4LCA3NDYsMzAzMCwyNDcwLDQ3ODMsNDQyMywzNzk0LCA2OTgsICMgNTA1Ngo0Nzg0LDE4OTMsNDQyNCwzNjYzLDI1NTAsNDc4NSwzNjY0LDM5MzYsNTcxOSwzMTkxLDM0MzQsNTcyMCwxODI0LDEzMDIsNDE0NywyNzE1LCAjIDUwNzIKMzkzNywxOTc0LDQ0MjUsNTcyMSw0NDI2LDMxOTIsIDgyMywxMzAzLDEyODgsMTIzNiwyODYxLDM1NDIsNDE0OCwzNDM1LCA3NzQsMzkzOCwgIyA1MDg4CjU3MjIsMTU4MSw0Nzg2LDEzMDQsMjg2MiwzOTM5LDQ3ODcsNTcyMywyNDQwLDIxNjIsMTA4MywzMjY4LDQ0MjcsNDE0OSw0NDI4LCAzNDQsICMgNTEwNAoxMTczLCAyODgsMjMxNiwgNDU0LDE2ODMsNTcyNCw1NzI1LDE0NjEsNDc4OCw0MTUwLDI1OTcsNTcyNiw1NzI3LDQ3ODksIDk4NSwgODk0LCAjIDUxMjAKNTcyOCwzNDM2LDMxOTMsNTcyOSwxOTE0LDI5NDIsMzc5NSwxOTg5LDU3MzAsMjExMSwxOTc1LDU3MzEsNDE1MSw1NzMyLDI1NzksMTE5NCwgIyA1MTM2CiA0MjUsNTczMyw0NzkwLDMxOTQsMTI0NSwzNzk2LDQ0MjksNTczNCw1NzM1LDI4NjMsNTczNiwgNjM2LDQ3OTEsMTg1NiwzOTQwLCA3NjAsICMgNTE1MgoxODAwLDU3MzcsNDQzMCwyMjEyLDE1MDgsNDc5Miw0MTUyLDE4OTQsMTY4NCwyMjk4LDU3MzgsNTczOSw0NzkzLDQ0MzEsNDQzMiwyMjEzLCAjIDUxNjgKIDQ3OSw1NzQwLDU3NDEsIDgzMiw1NzQyLDQxNTMsMjQ5Niw1NzQzLDI5ODAsMjQ5NywzNzk3LCA5OTAsMzEzMiwgNjI3LDE4MTUsMjY1MiwgIyA1MTg0CjQ0MzMsMTU4Miw0NDM0LDIxMjYsMjExMiwzNTQzLDQ3OTQsNTc0NCwgNzk5LDQ0MzUsMzE5NSw1NzQ1LDQ3OTUsMjExMywxNzM3LDMwMzEsICMgNTIwMAoxMDE4LCA1NDMsIDc1NCw0NDM2LDMzNDIsMTY3Niw0Nzk2LDQ3OTcsNDE1NCw0Nzk4LDE0ODksNTc0NiwzNTQ0LDU3NDcsMjYyNCwyOTAzLCAjIDUyMTYKNDE1NSw1NzQ4LDU3NDksMjk4MSw1NzUwLDU3NTEsNTc1Miw1NzUzLDMxOTYsNDc5OSw0ODAwLDIxODUsMTcyMiw1NzU0LDMyNjksMzI3MCwgIyA1MjMyCjE4NDMsMzY2NSwxNzE1LCA0ODEsIDM2NSwxOTc2LDE4NTcsNTc1NSw1NzU2LDE5NjMsMjQ5OCw0ODAxLDU3NTcsMjEyNywzNjY2LDMyNzEsICMgNTI0OAogNDMzLDE4OTUsMjA2NCwyMDc2LDU3NTgsIDYwMiwyNzUwLDU3NTksNTc2MCw1NzYxLDU3NjIsNTc2MywzMDMyLDE2MjgsMzQzNyw1NzY0LCAjIDUyNjQKMzE5Nyw0ODAyLDQxNTYsMjkwNCw0ODAzLDI1MTksNTc2NSwyNTUxLDI3ODIsNTc2Niw1NzY3LDU3NjgsMzM0Myw0ODA0LDI5MDUsNTc2OSwgIyA1MjgwCjQ4MDUsNTc3MCwyODY0LDQ4MDYsNDgwNywxMjIxLDI5ODIsNDE1NywyNTIwLDU3NzEsNTc3Miw1NzczLDE4NjgsMTk5MCw1Nzc0LDU3NzUsICMgNTI5Ngo1Nzc2LDE4OTYsNTc3Nyw1Nzc4LDQ4MDgsMTg5Nyw0MTU4LCAzMTgsNTc3OSwyMDk1LDQxNTksNDQzNyw1NzgwLDU3ODEsIDQ4NSw1NzgyLCAjIDUzMTIKIDkzOCwzOTQxLCA1NTMsMjY4MCwgMTE2LDU3ODMsMzk0MiwzNjY3LDU3ODQsMzU0NSwyNjgxLDI3ODMsMzQzOCwzMzQ0LDI4MjAsNTc4NSwgIyA1MzI4CjM2NjgsMjk0Myw0MTYwLDE3NDcsMjk0NCwyOTgzLDU3ODYsNTc4NywgMjA3LDU3ODgsNDgwOSw1Nzg5LDQ4MTAsMjUyMSw1NzkwLDMwMzMsICMgNTM0NAogODkwLDM2NjksMzk0Myw1NzkxLDE4NzgsMzc5OCwzNDM5LDU3OTIsMjE4NiwyMzU4LDM0NDAsMTY1Miw1NzkzLDU3OTQsNTc5NSwgOTQxLCAjIDUzNjAKMjI5OSwgMjA4LDM1NDYsNDE2MSwyMDIwLCAzMzAsNDQzOCwzOTQ0LDI5MDYsMjQ5OSwzNzk5LDQ0MzksNDgxMSw1Nzk2LDU3OTcsNTc5OCwgIyA1Mzc2CikKClBLAwQUAAAAAAAAACEAy+dnZt0GAADdBgAAMQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2JpZzVwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLm1iY2hhcnNldHByb2JlciBpbXBvcnQgTXVsdGlCeXRlQ2hhclNldFByb2Jlcgpmcm9tIC5jb2RpbmdzdGF0ZW1hY2hpbmUgaW1wb3J0IENvZGluZ1N0YXRlTWFjaGluZQpmcm9tIC5jaGFyZGlzdHJpYnV0aW9uIGltcG9ydCBCaWc1RGlzdHJpYnV0aW9uQW5hbHlzaXMKZnJvbSAubWJjc3NtIGltcG9ydCBCSUc1X1NNX01PREVMCgoKY2xhc3MgQmlnNVByb2JlcihNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihCaWc1UHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb2Rpbmdfc20gPSBDb2RpbmdTdGF0ZU1hY2hpbmUoQklHNV9TTV9NT0RFTCkKICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplciA9IEJpZzVEaXN0cmlidXRpb25BbmFseXNpcygpCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiQmlnNSIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gIkNoaW5lc2UiClBLAwQUAAAAAAAAACEA4FkoPcMkAADDJAAANwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NoYXJkaXN0cmlidXRpb24ucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmV1Y3R3ZnJlcSBpbXBvcnQgKEVVQ1RXX0NIQVJfVE9fRlJFUV9PUkRFUiwgRVVDVFdfVEFCTEVfU0laRSwKICAgICAgICAgICAgICAgICAgICAgICAgRVVDVFdfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8pCmZyb20gLmV1Y2tyZnJlcSBpbXBvcnQgKEVVQ0tSX0NIQVJfVE9fRlJFUV9PUkRFUiwgRVVDS1JfVEFCTEVfU0laRSwKICAgICAgICAgICAgICAgICAgICAgICAgRVVDS1JfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8pCmZyb20gLmdiMjMxMmZyZXEgaW1wb3J0IChHQjIzMTJfQ0hBUl9UT19GUkVRX09SREVSLCBHQjIzMTJfVEFCTEVfU0laRSwKICAgICAgICAgICAgICAgICAgICAgICAgIEdCMjMxMl9UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTykKZnJvbSAuYmlnNWZyZXEgaW1wb3J0IChCSUc1X0NIQVJfVE9fRlJFUV9PUkRFUiwgQklHNV9UQUJMRV9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgIEJJRzVfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8pCmZyb20gLmppc2ZyZXEgaW1wb3J0IChKSVNfQ0hBUl9UT19GUkVRX09SREVSLCBKSVNfVEFCTEVfU0laRSwKICAgICAgICAgICAgICAgICAgICAgIEpJU19UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTykKCgpjbGFzcyBDaGFyRGlzdHJpYnV0aW9uQW5hbHlzaXMob2JqZWN0KToKICAgIEVOT1VHSF9EQVRBX1RIUkVTSE9MRCA9IDEwMjQKICAgIFNVUkVfWUVTID0gMC45OQogICAgU1VSRV9OTyA9IDAuMDEKICAgIE1JTklNVU1fREFUQV9USFJFU0hPTEQgPSAzCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICMgTWFwcGluZyB0YWJsZSB0byBnZXQgZnJlcXVlbmN5IG9yZGVyIGZyb20gY2hhciBvcmRlciAoZ2V0IGZyb20KICAgICAgICAjIEdldE9yZGVyKCkpCiAgICAgICAgc2VsZi5fY2hhcl90b19mcmVxX29yZGVyID0gTm9uZQogICAgICAgIHNlbGYuX3RhYmxlX3NpemUgPSBOb25lICAjIFNpemUgb2YgYWJvdmUgdGFibGUKICAgICAgICAjIFRoaXMgaXMgYSBjb25zdGFudCB2YWx1ZSB3aGljaCB2YXJpZXMgZnJvbSBsYW5ndWFnZSB0byBsYW5ndWFnZSwKICAgICAgICAjIHVzZWQgaW4gY2FsY3VsYXRpbmcgY29uZmlkZW5jZS4gIFNlZQogICAgICAgICMgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9wcm9qZWN0cy9pbnRsL1VuaXZlcnNhbENoYXJzZXREZXRlY3Rpb24uaHRtbAogICAgICAgICMgZm9yIGZ1cnRoZXIgZGV0YWlsLgogICAgICAgIHNlbGYudHlwaWNhbF9kaXN0cmlidXRpb25fcmF0aW8gPSBOb25lCiAgICAgICAgc2VsZi5fZG9uZSA9IE5vbmUKICAgICAgICBzZWxmLl90b3RhbF9jaGFycyA9IE5vbmUKICAgICAgICBzZWxmLl9mcmVxX2NoYXJzID0gTm9uZQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICAiIiJyZXNldCBhbmFseXNlciwgY2xlYXIgYW55IHN0YXRlIiIiCiAgICAgICAgIyBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIFRydWUsIGRldGVjdGlvbiBpcyBkb25lIGFuZCBjb25jbHVzaW9uIGhhcwogICAgICAgICMgYmVlbiBtYWRlCiAgICAgICAgc2VsZi5fZG9uZSA9IEZhbHNlCiAgICAgICAgc2VsZi5fdG90YWxfY2hhcnMgPSAwICAjIFRvdGFsIGNoYXJhY3RlcnMgZW5jb3VudGVyZWQKICAgICAgICAjIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3aG9zZSBmcmVxdWVuY3kgb3JkZXIgaXMgbGVzcyB0aGFuIDUxMgogICAgICAgIHNlbGYuX2ZyZXFfY2hhcnMgPSAwCgogICAgZGVmIGZlZWQoc2VsZiwgY2hhciwgY2hhcl9sZW4pOgogICAgICAgICIiImZlZWQgYSBjaGFyYWN0ZXIgd2l0aCBrbm93biBsZW5ndGgiIiIKICAgICAgICBpZiBjaGFyX2xlbiA9PSAyOgogICAgICAgICAgICAjIHdlIG9ubHkgY2FyZSBhYm91dCAyLWJ5dGVzIGNoYXJhY3RlciBpbiBvdXIgZGlzdHJpYnV0aW9uIGFuYWx5c2lzCiAgICAgICAgICAgIG9yZGVyID0gc2VsZi5nZXRfb3JkZXIoY2hhcikKICAgICAgICBlbHNlOgogICAgICAgICAgICBvcmRlciA9IC0xCiAgICAgICAgaWYgb3JkZXIgPj0gMDoKICAgICAgICAgICAgc2VsZi5fdG90YWxfY2hhcnMgKz0gMQogICAgICAgICAgICAjIG9yZGVyIGlzIHZhbGlkCiAgICAgICAgICAgIGlmIG9yZGVyIDwgc2VsZi5fdGFibGVfc2l6ZToKICAgICAgICAgICAgICAgIGlmIDUxMiA+IHNlbGYuX2NoYXJfdG9fZnJlcV9vcmRlcltvcmRlcl06CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZnJlcV9jaGFycyArPSAxCgogICAgZGVmIGdldF9jb25maWRlbmNlKHNlbGYpOgogICAgICAgICIiInJldHVybiBjb25maWRlbmNlIGJhc2VkIG9uIGV4aXN0aW5nIGRhdGEiIiIKICAgICAgICAjIGlmIHdlIGRpZG4ndCByZWNlaXZlIGFueSBjaGFyYWN0ZXIgaW4gb3VyIGNvbnNpZGVyYXRpb24gcmFuZ2UsCiAgICAgICAgIyByZXR1cm4gbmVnYXRpdmUgYW5zd2VyCiAgICAgICAgaWYgc2VsZi5fdG90YWxfY2hhcnMgPD0gMCBvciBzZWxmLl9mcmVxX2NoYXJzIDw9IHNlbGYuTUlOSU1VTV9EQVRBX1RIUkVTSE9MRDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuU1VSRV9OTwoKICAgICAgICBpZiBzZWxmLl90b3RhbF9jaGFycyAhPSBzZWxmLl9mcmVxX2NoYXJzOgogICAgICAgICAgICByID0gKHNlbGYuX2ZyZXFfY2hhcnMgLyAoKHNlbGYuX3RvdGFsX2NoYXJzIC0gc2VsZi5fZnJlcV9jaGFycykKICAgICAgICAgICAgICAgICAqIHNlbGYudHlwaWNhbF9kaXN0cmlidXRpb25fcmF0aW8pKQogICAgICAgICAgICBpZiByIDwgc2VsZi5TVVJFX1lFUzoKICAgICAgICAgICAgICAgIHJldHVybiByCgogICAgICAgICMgbm9ybWFsaXplIGNvbmZpZGVuY2UgKHdlIGRvbid0IHdhbnQgdG8gYmUgMTAwJSBzdXJlKQogICAgICAgIHJldHVybiBzZWxmLlNVUkVfWUVTCgogICAgZGVmIGdvdF9lbm91Z2hfZGF0YShzZWxmKToKICAgICAgICAjIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gcmVjZWl2ZSBhbGwgZGF0YSB0byBkcmF3IGNvbmNsdXNpb24uCiAgICAgICAgIyBGb3IgY2hhcnNldCBkZXRlY3Rpb24sIGNlcnRhaW4gYW1vdW50IG9mIGRhdGEgaXMgZW5vdWdoCiAgICAgICAgcmV0dXJuIHNlbGYuX3RvdGFsX2NoYXJzID4gc2VsZi5FTk9VR0hfREFUQV9USFJFU0hPTEQKCiAgICBkZWYgZ2V0X29yZGVyKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICAjIFdlIGRvIG5vdCBoYW5kbGUgY2hhcmFjdGVycyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgZW5jb2Rpbmcgc3RyaW5nLAogICAgICAgICMgYnV0IGNvbnZlcnQgdGhpcyBlbmNvZGluZyBzdHJpbmcgdG8gYSBudW1iZXIsIGhlcmUgY2FsbGVkIG9yZGVyLgogICAgICAgICMgVGhpcyBhbGxvd3MgbXVsdGlwbGUgZW5jb2RpbmdzIG9mIGEgbGFuZ3VhZ2UgdG8gc2hhcmUgb25lIGZyZXF1ZW5jeQogICAgICAgICMgdGFibGUuCiAgICAgICAgcmV0dXJuIC0xCgoKY2xhc3MgRVVDVFdEaXN0cmlidXRpb25BbmFseXNpcyhDaGFyRGlzdHJpYnV0aW9uQW5hbHlzaXMpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEVVQ1RXRGlzdHJpYnV0aW9uQW5hbHlzaXMsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLl9jaGFyX3RvX2ZyZXFfb3JkZXIgPSBFVUNUV19DSEFSX1RPX0ZSRVFfT1JERVIKICAgICAgICBzZWxmLl90YWJsZV9zaXplID0gRVVDVFdfVEFCTEVfU0laRQogICAgICAgIHNlbGYudHlwaWNhbF9kaXN0cmlidXRpb25fcmF0aW8gPSBFVUNUV19UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTwoKICAgIGRlZiBnZXRfb3JkZXIoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgICMgZm9yIGV1Yy1UVyBlbmNvZGluZywgd2UgYXJlIGludGVyZXN0ZWQKICAgICAgICAjICAgZmlyc3QgIGJ5dGUgcmFuZ2U6IDB4YzQgLS0gMHhmZQogICAgICAgICMgICBzZWNvbmQgYnl0ZSByYW5nZTogMHhhMSAtLSAweGZlCiAgICAgICAgIyBubyB2YWxpZGF0aW9uIG5lZWRlZCBoZXJlLiBTdGF0ZSBtYWNoaW5lIGhhcyBkb25lIHRoYXQKICAgICAgICBmaXJzdF9jaGFyID0gYnl0ZV9zdHJbMF0KICAgICAgICBpZiBmaXJzdF9jaGFyID49IDB4QzQ6CiAgICAgICAgICAgIHJldHVybiA5NCAqIChmaXJzdF9jaGFyIC0gMHhDNCkgKyBieXRlX3N0clsxXSAtIDB4QTEKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gLTEKCgpjbGFzcyBFVUNLUkRpc3RyaWJ1dGlvbkFuYWx5c2lzKENoYXJEaXN0cmlidXRpb25BbmFseXNpcyk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoRVVDS1JEaXN0cmlidXRpb25BbmFseXNpcywgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX2NoYXJfdG9fZnJlcV9vcmRlciA9IEVVQ0tSX0NIQVJfVE9fRlJFUV9PUkRFUgogICAgICAgIHNlbGYuX3RhYmxlX3NpemUgPSBFVUNLUl9UQUJMRV9TSVpFCiAgICAgICAgc2VsZi50eXBpY2FsX2Rpc3RyaWJ1dGlvbl9yYXRpbyA9IEVVQ0tSX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPCgogICAgZGVmIGdldF9vcmRlcihzZWxmLCBieXRlX3N0cik6CiAgICAgICAgIyBmb3IgZXVjLUtSIGVuY29kaW5nLCB3ZSBhcmUgaW50ZXJlc3RlZAogICAgICAgICMgICBmaXJzdCAgYnl0ZSByYW5nZTogMHhiMCAtLSAweGZlCiAgICAgICAgIyAgIHNlY29uZCBieXRlIHJhbmdlOiAweGExIC0tIDB4ZmUKICAgICAgICAjIG5vIHZhbGlkYXRpb24gbmVlZGVkIGhlcmUuIFN0YXRlIG1hY2hpbmUgaGFzIGRvbmUgdGhhdAogICAgICAgIGZpcnN0X2NoYXIgPSBieXRlX3N0clswXQogICAgICAgIGlmIGZpcnN0X2NoYXIgPj0gMHhCMDoKICAgICAgICAgICAgcmV0dXJuIDk0ICogKGZpcnN0X2NoYXIgLSAweEIwKSArIGJ5dGVfc3RyWzFdIC0gMHhBMQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAtMQoKCmNsYXNzIEdCMjMxMkRpc3RyaWJ1dGlvbkFuYWx5c2lzKENoYXJEaXN0cmlidXRpb25BbmFseXNpcyk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoR0IyMzEyRGlzdHJpYnV0aW9uQW5hbHlzaXMsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLl9jaGFyX3RvX2ZyZXFfb3JkZXIgPSBHQjIzMTJfQ0hBUl9UT19GUkVRX09SREVSCiAgICAgICAgc2VsZi5fdGFibGVfc2l6ZSA9IEdCMjMxMl9UQUJMRV9TSVpFCiAgICAgICAgc2VsZi50eXBpY2FsX2Rpc3RyaWJ1dGlvbl9yYXRpbyA9IEdCMjMxMl9UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTwoKICAgIGRlZiBnZXRfb3JkZXIoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgICMgZm9yIEdCMjMxMiBlbmNvZGluZywgd2UgYXJlIGludGVyZXN0ZWQKICAgICAgICAjICBmaXJzdCAgYnl0ZSByYW5nZTogMHhiMCAtLSAweGZlCiAgICAgICAgIyAgc2Vjb25kIGJ5dGUgcmFuZ2U6IDB4YTEgLS0gMHhmZQogICAgICAgICMgbm8gdmFsaWRhdGlvbiBuZWVkZWQgaGVyZS4gU3RhdGUgbWFjaGluZSBoYXMgZG9uZSB0aGF0CiAgICAgICAgZmlyc3RfY2hhciwgc2Vjb25kX2NoYXIgPSBieXRlX3N0clswXSwgYnl0ZV9zdHJbMV0KICAgICAgICBpZiAoZmlyc3RfY2hhciA+PSAweEIwKSBhbmQgKHNlY29uZF9jaGFyID49IDB4QTEpOgogICAgICAgICAgICByZXR1cm4gOTQgKiAoZmlyc3RfY2hhciAtIDB4QjApICsgc2Vjb25kX2NoYXIgLSAweEExCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIC0xCgoKY2xhc3MgQmlnNURpc3RyaWJ1dGlvbkFuYWx5c2lzKENoYXJEaXN0cmlidXRpb25BbmFseXNpcyk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoQmlnNURpc3RyaWJ1dGlvbkFuYWx5c2lzLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fY2hhcl90b19mcmVxX29yZGVyID0gQklHNV9DSEFSX1RPX0ZSRVFfT1JERVIKICAgICAgICBzZWxmLl90YWJsZV9zaXplID0gQklHNV9UQUJMRV9TSVpFCiAgICAgICAgc2VsZi50eXBpY2FsX2Rpc3RyaWJ1dGlvbl9yYXRpbyA9IEJJRzVfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8KCiAgICBkZWYgZ2V0X29yZGVyKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICAjIGZvciBiaWc1IGVuY29kaW5nLCB3ZSBhcmUgaW50ZXJlc3RlZAogICAgICAgICMgICBmaXJzdCAgYnl0ZSByYW5nZTogMHhhNCAtLSAweGZlCiAgICAgICAgIyAgIHNlY29uZCBieXRlIHJhbmdlOiAweDQwIC0tIDB4N2UgLCAweGExIC0tIDB4ZmUKICAgICAgICAjIG5vIHZhbGlkYXRpb24gbmVlZGVkIGhlcmUuIFN0YXRlIG1hY2hpbmUgaGFzIGRvbmUgdGhhdAogICAgICAgIGZpcnN0X2NoYXIsIHNlY29uZF9jaGFyID0gYnl0ZV9zdHJbMF0sIGJ5dGVfc3RyWzFdCiAgICAgICAgaWYgZmlyc3RfY2hhciA+PSAweEE0OgogICAgICAgICAgICBpZiBzZWNvbmRfY2hhciA+PSAweEExOgogICAgICAgICAgICAgICAgcmV0dXJuIDE1NyAqIChmaXJzdF9jaGFyIC0gMHhBNCkgKyBzZWNvbmRfY2hhciAtIDB4QTEgKyA2MwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIDE1NyAqIChmaXJzdF9jaGFyIC0gMHhBNCkgKyBzZWNvbmRfY2hhciAtIDB4NDAKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gLTEKCgpjbGFzcyBTSklTRGlzdHJpYnV0aW9uQW5hbHlzaXMoQ2hhckRpc3RyaWJ1dGlvbkFuYWx5c2lzKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihTSklTRGlzdHJpYnV0aW9uQW5hbHlzaXMsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLl9jaGFyX3RvX2ZyZXFfb3JkZXIgPSBKSVNfQ0hBUl9UT19GUkVRX09SREVSCiAgICAgICAgc2VsZi5fdGFibGVfc2l6ZSA9IEpJU19UQUJMRV9TSVpFCiAgICAgICAgc2VsZi50eXBpY2FsX2Rpc3RyaWJ1dGlvbl9yYXRpbyA9IEpJU19UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTwoKICAgIGRlZiBnZXRfb3JkZXIoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgICMgZm9yIHNqaXMgZW5jb2RpbmcsIHdlIGFyZSBpbnRlcmVzdGVkCiAgICAgICAgIyAgIGZpcnN0ICBieXRlIHJhbmdlOiAweDgxIC0tIDB4OWYgLCAweGUwIC0tIDB4ZmUKICAgICAgICAjICAgc2Vjb25kIGJ5dGUgcmFuZ2U6IDB4NDAgLS0gMHg3ZSwgIDB4ODEgLS0gb3hmZQogICAgICAgICMgbm8gdmFsaWRhdGlvbiBuZWVkZWQgaGVyZS4gU3RhdGUgbWFjaGluZSBoYXMgZG9uZSB0aGF0CiAgICAgICAgZmlyc3RfY2hhciwgc2Vjb25kX2NoYXIgPSBieXRlX3N0clswXSwgYnl0ZV9zdHJbMV0KICAgICAgICBpZiAoZmlyc3RfY2hhciA+PSAweDgxKSBhbmQgKGZpcnN0X2NoYXIgPD0gMHg5Rik6CiAgICAgICAgICAgIG9yZGVyID0gMTg4ICogKGZpcnN0X2NoYXIgLSAweDgxKQogICAgICAgIGVsaWYgKGZpcnN0X2NoYXIgPj0gMHhFMCkgYW5kIChmaXJzdF9jaGFyIDw9IDB4RUYpOgogICAgICAgICAgICBvcmRlciA9IDE4OCAqIChmaXJzdF9jaGFyIC0gMHhFMCArIDMxKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAtMQogICAgICAgIG9yZGVyID0gb3JkZXIgKyBzZWNvbmRfY2hhciAtIDB4NDAKICAgICAgICBpZiBzZWNvbmRfY2hhciA+IDB4N0Y6CiAgICAgICAgICAgIG9yZGVyID0gLTEKICAgICAgICByZXR1cm4gb3JkZXIKCgpjbGFzcyBFVUNKUERpc3RyaWJ1dGlvbkFuYWx5c2lzKENoYXJEaXN0cmlidXRpb25BbmFseXNpcyk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoRVVDSlBEaXN0cmlidXRpb25BbmFseXNpcywgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX2NoYXJfdG9fZnJlcV9vcmRlciA9IEpJU19DSEFSX1RPX0ZSRVFfT1JERVIKICAgICAgICBzZWxmLl90YWJsZV9zaXplID0gSklTX1RBQkxFX1NJWkUKICAgICAgICBzZWxmLnR5cGljYWxfZGlzdHJpYnV0aW9uX3JhdGlvID0gSklTX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPCgogICAgZGVmIGdldF9vcmRlcihzZWxmLCBieXRlX3N0cik6CiAgICAgICAgIyBmb3IgZXVjLUpQIGVuY29kaW5nLCB3ZSBhcmUgaW50ZXJlc3RlZAogICAgICAgICMgICBmaXJzdCAgYnl0ZSByYW5nZTogMHhhMCAtLSAweGZlCiAgICAgICAgIyAgIHNlY29uZCBieXRlIHJhbmdlOiAweGExIC0tIDB4ZmUKICAgICAgICAjIG5vIHZhbGlkYXRpb24gbmVlZGVkIGhlcmUuIFN0YXRlIG1hY2hpbmUgaGFzIGRvbmUgdGhhdAogICAgICAgIGNoYXIgPSBieXRlX3N0clswXQogICAgICAgIGlmIGNoYXIgPj0gMHhBMDoKICAgICAgICAgICAgcmV0dXJuIDk0ICogKGNoYXIgLSAweEExKSArIGJ5dGVfc3RyWzFdIC0gMHhhMQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAtMQpQSwMEFAAAAAAAAAAhAIlZJIjLDgAAyw4AADkAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jaGFyc2V0Z3JvdXBwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmVudW1zIGltcG9ydCBQcm9iaW5nU3RhdGUKZnJvbSAuY2hhcnNldHByb2JlciBpbXBvcnQgQ2hhclNldFByb2JlcgoKCmNsYXNzIENoYXJTZXRHcm91cFByb2JlcihDaGFyU2V0UHJvYmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYW5nX2ZpbHRlcj1Ob25lKToKICAgICAgICBzdXBlcihDaGFyU2V0R3JvdXBQcm9iZXIsIHNlbGYpLl9faW5pdF9fKGxhbmdfZmlsdGVyPWxhbmdfZmlsdGVyKQogICAgICAgIHNlbGYuX2FjdGl2ZV9udW0gPSAwCiAgICAgICAgc2VsZi5wcm9iZXJzID0gW10KICAgICAgICBzZWxmLl9iZXN0X2d1ZXNzX3Byb2JlciA9IE5vbmUKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc3VwZXIoQ2hhclNldEdyb3VwUHJvYmVyLCBzZWxmKS5yZXNldCgpCiAgICAgICAgc2VsZi5fYWN0aXZlX251bSA9IDAKICAgICAgICBmb3IgcHJvYmVyIGluIHNlbGYucHJvYmVyczoKICAgICAgICAgICAgaWYgcHJvYmVyOgogICAgICAgICAgICAgICAgcHJvYmVyLnJlc2V0KCkKICAgICAgICAgICAgICAgIHByb2Jlci5hY3RpdmUgPSBUcnVlCiAgICAgICAgICAgICAgICBzZWxmLl9hY3RpdmVfbnVtICs9IDEKICAgICAgICBzZWxmLl9iZXN0X2d1ZXNzX3Byb2JlciA9IE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyOgogICAgICAgICAgICBzZWxmLmdldF9jb25maWRlbmNlKCkKICAgICAgICAgICAgaWYgbm90IHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gc2VsZi5fYmVzdF9ndWVzc19wcm9iZXIuY2hhcnNldF9uYW1lCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyOgogICAgICAgICAgICBzZWxmLmdldF9jb25maWRlbmNlKCkKICAgICAgICAgICAgaWYgbm90IHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gc2VsZi5fYmVzdF9ndWVzc19wcm9iZXIubGFuZ3VhZ2UKCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0cik6CiAgICAgICAgZm9yIHByb2JlciBpbiBzZWxmLnByb2JlcnM6CiAgICAgICAgICAgIGlmIG5vdCBwcm9iZXI6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBub3QgcHJvYmVyLmFjdGl2ZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHN0YXRlID0gcHJvYmVyLmZlZWQoYnl0ZV9zdHIpCiAgICAgICAgICAgIGlmIG5vdCBzdGF0ZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIHN0YXRlID09IFByb2JpbmdTdGF0ZS5GT1VORF9JVDoKICAgICAgICAgICAgICAgIHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyID0gcHJvYmVyCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQogICAgICAgICAgICBlbGlmIHN0YXRlID09IFByb2JpbmdTdGF0ZS5OT1RfTUU6CiAgICAgICAgICAgICAgICBwcm9iZXIuYWN0aXZlID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuX2FjdGl2ZV9udW0gLT0gMQogICAgICAgICAgICAgICAgaWYgc2VsZi5fYWN0aXZlX251bSA8PSAwOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLk5PVF9NRQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnN0YXRlCiAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKCiAgICBkZWYgZ2V0X2NvbmZpZGVuY2Uoc2VsZik6CiAgICAgICAgc3RhdGUgPSBzZWxmLnN0YXRlCiAgICAgICAgaWYgc3RhdGUgPT0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUOgogICAgICAgICAgICByZXR1cm4gMC45OQogICAgICAgIGVsaWYgc3RhdGUgPT0gUHJvYmluZ1N0YXRlLk5PVF9NRToKICAgICAgICAgICAgcmV0dXJuIDAuMDEKICAgICAgICBiZXN0X2NvbmYgPSAwLjAKICAgICAgICBzZWxmLl9iZXN0X2d1ZXNzX3Byb2JlciA9IE5vbmUKICAgICAgICBmb3IgcHJvYmVyIGluIHNlbGYucHJvYmVyczoKICAgICAgICAgICAgaWYgbm90IHByb2JlcjoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG5vdCBwcm9iZXIuYWN0aXZlOgogICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJyVzIG5vdCBhY3RpdmUnLCBwcm9iZXIuY2hhcnNldF9uYW1lKQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgY29uZiA9IHByb2Jlci5nZXRfY29uZmlkZW5jZSgpCiAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCclcyAlcyBjb25maWRlbmNlID0gJXMnLCBwcm9iZXIuY2hhcnNldF9uYW1lLCBwcm9iZXIubGFuZ3VhZ2UsIGNvbmYpCiAgICAgICAgICAgIGlmIGJlc3RfY29uZiA8IGNvbmY6CiAgICAgICAgICAgICAgICBiZXN0X2NvbmYgPSBjb25mCiAgICAgICAgICAgICAgICBzZWxmLl9iZXN0X2d1ZXNzX3Byb2JlciA9IHByb2JlcgogICAgICAgIGlmIG5vdCBzZWxmLl9iZXN0X2d1ZXNzX3Byb2JlcjoKICAgICAgICAgICAgcmV0dXJuIDAuMAogICAgICAgIHJldHVybiBiZXN0X2NvbmYKUEsDBBQAAAAAAAAAIQDgl2Fa9hMAAPYTAAA0AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY2hhcnNldHByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgVW5pdmVyc2FsIGNoYXJzZXQgZGV0ZWN0b3IgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDEKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMgICBTaHkgU2hhbG9tIC0gb3JpZ2luYWwgQyBjb2RlCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmltcG9ydCBsb2dnaW5nCmltcG9ydCByZQoKZnJvbSAuZW51bXMgaW1wb3J0IFByb2JpbmdTdGF0ZQoKCmNsYXNzIENoYXJTZXRQcm9iZXIob2JqZWN0KToKCiAgICBTSE9SVENVVF9USFJFU0hPTEQgPSAwLjk1CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxhbmdfZmlsdGVyPU5vbmUpOgogICAgICAgIHNlbGYuX3N0YXRlID0gTm9uZQogICAgICAgIHNlbGYubGFuZ19maWx0ZXIgPSBsYW5nX2ZpbHRlcgogICAgICAgIHNlbGYubG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLkRFVEVDVElORwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBmZWVkKHNlbGYsIGJ1Zik6CiAgICAgICAgcGFzcwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHN0YXRlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9zdGF0ZQoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICByZXR1cm4gMC4wCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGZpbHRlcl9oaWdoX2J5dGVfb25seShidWYpOgogICAgICAgIGJ1ZiA9IHJlLnN1YihiJyhbXHgwMC1ceDdGXSkrJywgYicgJywgYnVmKQogICAgICAgIHJldHVybiBidWYKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZmlsdGVyX2ludGVybmF0aW9uYWxfd29yZHMoYnVmKToKICAgICAgICAiIiIKICAgICAgICBXZSBkZWZpbmUgdGhyZWUgdHlwZXMgb2YgYnl0ZXM6CiAgICAgICAgYWxwaGFiZXQ6IGVuZ2xpc2ggYWxwaGFiZXRzIFthLXpBLVpdCiAgICAgICAgaW50ZXJuYXRpb25hbDogaW50ZXJuYXRpb25hbCBjaGFyYWN0ZXJzIFtceDgwLVx4RkZdCiAgICAgICAgbWFya2VyOiBldmVyeXRoaW5nIGVsc2UgW15hLXpBLVpceDgwLVx4RkZdCgogICAgICAgIFRoZSBpbnB1dCBidWZmZXIgY2FuIGJlIHRob3VnaHQgdG8gY29udGFpbiBhIHNlcmllcyBvZiB3b3JkcyBkZWxpbWl0ZWQKICAgICAgICBieSBtYXJrZXJzLiBUaGlzIGZ1bmN0aW9uIHdvcmtzIHRvIGZpbHRlciBhbGwgd29yZHMgdGhhdCBjb250YWluIGF0CiAgICAgICAgbGVhc3Qgb25lIGludGVybmF0aW9uYWwgY2hhcmFjdGVyLiBBbGwgY29udGlndW91cyBzZXF1ZW5jZXMgb2YgbWFya2VycwogICAgICAgIGFyZSByZXBsYWNlZCBieSBhIHNpbmdsZSBzcGFjZSBhc2NpaSBjaGFyYWN0ZXIuCgogICAgICAgIFRoaXMgZmlsdGVyIGFwcGxpZXMgdG8gYWxsIHNjcmlwdHMgd2hpY2ggZG8gbm90IHVzZSBFbmdsaXNoIGNoYXJhY3RlcnMuCiAgICAgICAgIiIiCiAgICAgICAgZmlsdGVyZWQgPSBieXRlYXJyYXkoKQoKICAgICAgICAjIFRoaXMgcmVnZXggZXhwcmVzc2lvbiBmaWx0ZXJzIG91dCBvbmx5IHdvcmRzIHRoYXQgaGF2ZSBhdC1sZWFzdCBvbmUKICAgICAgICAjIGludGVybmF0aW9uYWwgY2hhcmFjdGVyLiBUaGUgd29yZCBtYXkgaW5jbHVkZSBvbmUgbWFya2VyIGNoYXJhY3RlciBhdAogICAgICAgICMgdGhlIGVuZC4KICAgICAgICB3b3JkcyA9IHJlLmZpbmRhbGwoYidbYS16QS1aXSpbXHg4MC1ceEZGXStbYS16QS1aXSpbXmEtekEtWlx4ODAtXHhGRl0/JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmKQoKICAgICAgICBmb3Igd29yZCBpbiB3b3JkczoKICAgICAgICAgICAgZmlsdGVyZWQuZXh0ZW5kKHdvcmRbOi0xXSkKCiAgICAgICAgICAgICMgSWYgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSB3b3JkIGlzIGEgbWFya2VyLCByZXBsYWNlIGl0IHdpdGggYQogICAgICAgICAgICAjIHNwYWNlIGFzIG1hcmtlcnMgc2hvdWxkbid0IGFmZmVjdCBvdXIgYW5hbHlzaXMgKHRoZXkgYXJlIHVzZWQKICAgICAgICAgICAgIyBzaW1pbGFybHkgYWNyb3NzIGFsbCBsYW5ndWFnZXMgYW5kIG1heSB0aHVzIGhhdmUgc2ltaWxhcgogICAgICAgICAgICAjIGZyZXF1ZW5jaWVzKS4KICAgICAgICAgICAgbGFzdF9jaGFyID0gd29yZFstMTpdCiAgICAgICAgICAgIGlmIG5vdCBsYXN0X2NoYXIuaXNhbHBoYSgpIGFuZCBsYXN0X2NoYXIgPCBiJ1x4ODAnOgogICAgICAgICAgICAgICAgbGFzdF9jaGFyID0gYicgJwogICAgICAgICAgICBmaWx0ZXJlZC5leHRlbmQobGFzdF9jaGFyKQoKICAgICAgICByZXR1cm4gZmlsdGVyZWQKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZmlsdGVyX3dpdGhfZW5nbGlzaF9sZXR0ZXJzKGJ1Zik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIGNvcHkgb2YgYGBidWZgYCB0aGF0IHJldGFpbnMgb25seSB0aGUgc2VxdWVuY2VzIG9mIEVuZ2xpc2gKICAgICAgICBhbHBoYWJldCBhbmQgaGlnaCBieXRlIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGJldHdlZW4gPD4gY2hhcmFjdGVycy4KICAgICAgICBBbHNvIHJldGFpbnMgRW5nbGlzaCBhbHBoYWJldCBhbmQgaGlnaCBieXRlIGNoYXJhY3RlcnMgaW1tZWRpYXRlbHkKICAgICAgICBiZWZvcmUgb2NjdXJyZW5jZXMgb2YgPi4KCiAgICAgICAgVGhpcyBmaWx0ZXIgY2FuIGJlIGFwcGxpZWQgdG8gYWxsIHNjcmlwdHMgd2hpY2ggY29udGFpbiBib3RoIEVuZ2xpc2gKICAgICAgICBjaGFyYWN0ZXJzIGFuZCBleHRlbmRlZCBBU0NJSSBjaGFyYWN0ZXJzLCBidXQgaXMgY3VycmVudGx5IG9ubHkgdXNlZCBieQogICAgICAgIGBgTGF0aW4xUHJvYmVyYGAuCiAgICAgICAgIiIiCiAgICAgICAgZmlsdGVyZWQgPSBieXRlYXJyYXkoKQogICAgICAgIGluX3RhZyA9IEZhbHNlCiAgICAgICAgcHJldiA9IDAKCiAgICAgICAgZm9yIGN1cnIgaW4gcmFuZ2UobGVuKGJ1ZikpOgogICAgICAgICAgICAjIFNsaWNlIGhlcmUgdG8gZ2V0IGJ5dGVzIGluc3RlYWQgb2YgYW4gaW50IHdpdGggUHl0aG9uIDMKICAgICAgICAgICAgYnVmX2NoYXIgPSBidWZbY3VycjpjdXJyICsgMV0KICAgICAgICAgICAgIyBDaGVjayBpZiB3ZSdyZSBjb21pbmcgb3V0IG9mIG9yIGVudGVyaW5nIGFuIEhUTUwgdGFnCiAgICAgICAgICAgIGlmIGJ1Zl9jaGFyID09IGInPic6CiAgICAgICAgICAgICAgICBpbl90YWcgPSBGYWxzZQogICAgICAgICAgICBlbGlmIGJ1Zl9jaGFyID09IGInPCc6CiAgICAgICAgICAgICAgICBpbl90YWcgPSBUcnVlCgogICAgICAgICAgICAjIElmIGN1cnJlbnQgY2hhcmFjdGVyIGlzIG5vdCBleHRlbmRlZC1BU0NJSSBhbmQgbm90IGFscGhhYmV0aWMuLi4KICAgICAgICAgICAgaWYgYnVmX2NoYXIgPCBiJ1x4ODAnIGFuZCBub3QgYnVmX2NoYXIuaXNhbHBoYSgpOgogICAgICAgICAgICAgICAgIyAuLi5hbmQgd2UncmUgbm90IGluIGEgdGFnCiAgICAgICAgICAgICAgICBpZiBjdXJyID4gcHJldiBhbmQgbm90IGluX3RhZzoKICAgICAgICAgICAgICAgICAgICAjIEtlZXAgZXZlcnl0aGluZyBhZnRlciBsYXN0IG5vbi1leHRlbmRlZC1BU0NJSSwKICAgICAgICAgICAgICAgICAgICAjIG5vbi1hbHBoYWJldGljIGNoYXJhY3RlcgogICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLmV4dGVuZChidWZbcHJldjpjdXJyXSkKICAgICAgICAgICAgICAgICAgICAjIE91dHB1dCBhIHNwYWNlIHRvIGRlbGltaXQgc3RyZXRjaCB3ZSBrZXB0CiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQuZXh0ZW5kKGInICcpCiAgICAgICAgICAgICAgICBwcmV2ID0gY3VyciArIDEKCiAgICAgICAgIyBJZiB3ZSdyZSBub3QgaW4gYSB0YWcuLi4KICAgICAgICBpZiBub3QgaW5fdGFnOgogICAgICAgICAgICAjIEtlZXAgZXZlcnl0aGluZyBhZnRlciBsYXN0IG5vbi1leHRlbmRlZC1BU0NJSSwgbm9uLWFscGhhYmV0aWMKICAgICAgICAgICAgIyBjaGFyYWN0ZXIKICAgICAgICAgICAgZmlsdGVyZWQuZXh0ZW5kKGJ1ZltwcmV2Ol0pCgogICAgICAgIHJldHVybiBmaWx0ZXJlZApQSwMEFAAAAAAAAAAhAJMG1zIBAAAAAQAAADMAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jbGkvX19pbml0X18ucHkKUEsDBBQAAAAAAAAAIQBf3a25sgoAALIKAAA1AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY2xpL2NoYXJkZXRlY3QucHkjIS91c3IvYmluL2VudiBweXRob24KIiIiClNjcmlwdCB3aGljaCB0YWtlcyBvbmUgb3IgbW9yZSBmaWxlIHBhdGhzIGFuZCByZXBvcnRzIG9uIHRoZWlyIGRldGVjdGVkCmVuY29kaW5ncwoKRXhhbXBsZTo6CgogICAgJSBjaGFyZGV0ZWN0IHNvbWVmaWxlIHNvbWVvdGhlcmZpbGUKICAgIHNvbWVmaWxlOiB3aW5kb3dzLTEyNTIgd2l0aCBjb25maWRlbmNlIDAuNQogICAgc29tZW90aGVyZmlsZTogYXNjaWkgd2l0aCBjb25maWRlbmNlIDEuMAoKSWYgbm8gcGF0aHMgYXJlIHByb3ZpZGVkLCBpdCB0YWtlcyBpdHMgaW5wdXQgZnJvbSBzdGRpbi4KCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIHByaW50X2Z1bmN0aW9uLCB1bmljb2RlX2xpdGVyYWxzCgppbXBvcnQgYXJncGFyc2UKaW1wb3J0IHN5cwoKZnJvbSBjaGFyZGV0IGltcG9ydCBfX3ZlcnNpb25fXwpmcm9tIGNoYXJkZXQuY29tcGF0IGltcG9ydCBQWTIKZnJvbSBjaGFyZGV0LnVuaXZlcnNhbGRldGVjdG9yIGltcG9ydCBVbml2ZXJzYWxEZXRlY3RvcgoKCmRlZiBkZXNjcmlwdGlvbl9vZihsaW5lcywgbmFtZT0nc3RkaW4nKToKICAgICIiIgogICAgUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHByb2JhYmxlIGVuY29kaW5nIG9mIGEgZmlsZSBvcgogICAgbGlzdCBvZiBzdHJpbmdzLgoKICAgIDpwYXJhbSBsaW5lczogVGhlIGxpbmVzIHRvIGdldCB0aGUgZW5jb2Rpbmcgb2YuCiAgICA6dHlwZSBsaW5lczogSXRlcmFibGUgb2YgYnl0ZXMKICAgIDpwYXJhbSBuYW1lOiBOYW1lIG9mIGZpbGUgb3IgY29sbGVjdGlvbiBvZiBsaW5lcwogICAgOnR5cGUgbmFtZTogc3RyCiAgICAiIiIKICAgIHUgPSBVbml2ZXJzYWxEZXRlY3RvcigpCiAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICBsaW5lID0gYnl0ZWFycmF5KGxpbmUpCiAgICAgICAgdS5mZWVkKGxpbmUpCiAgICAgICAgIyBzaG9ydGN1dCBvdXQgb2YgdGhlIGxvb3AgdG8gc2F2ZSByZWFkaW5nIGZ1cnRoZXIgLSBwYXJ0aWN1bGFybHkgdXNlZnVsIGlmIHdlIHJlYWQgYSBCT00uCiAgICAgICAgaWYgdS5kb25lOgogICAgICAgICAgICBicmVhawogICAgdS5jbG9zZSgpCiAgICByZXN1bHQgPSB1LnJlc3VsdAogICAgaWYgUFkyOgogICAgICAgIG5hbWUgPSBuYW1lLmRlY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCksICdpZ25vcmUnKQogICAgaWYgcmVzdWx0WydlbmNvZGluZyddOgogICAgICAgIHJldHVybiAnezB9OiB7MX0gd2l0aCBjb25maWRlbmNlIHsyfScuZm9ybWF0KG5hbWUsIHJlc3VsdFsnZW5jb2RpbmcnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ2NvbmZpZGVuY2UnXSkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuICd7MH06IG5vIHJlc3VsdCcuZm9ybWF0KG5hbWUpCgoKZGVmIG1haW4oYXJndj1Ob25lKToKICAgICIiIgogICAgSGFuZGxlcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFuZCBnZXRzIHRoaW5ncyBzdGFydGVkLgoKICAgIDpwYXJhbSBhcmd2OiBMaXN0IG9mIGFyZ3VtZW50cywgYXMgaWYgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kLWxpbmUuCiAgICAgICAgICAgICAgICAgSWYgTm9uZSwgYGBzeXMuYXJndlsxOl1gYCBpcyB1c2VkIGluc3RlYWQuCiAgICA6dHlwZSBhcmd2OiBsaXN0IG9mIHN0cgogICAgIiIiCiAgICAjIEdldCBjb21tYW5kIGxpbmUgYXJndW1lbnRzCiAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKICAgICAgICBkZXNjcmlwdGlvbj0iVGFrZXMgb25lIG9yIG1vcmUgZmlsZSBwYXRocyBhbmQgcmVwb3J0cyB0aGVpciBkZXRlY3RlZCBcCiAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5ncyIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdpbnB1dCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0ZpbGUgd2hvc2UgZW5jb2Rpbmcgd2Ugd291bGQgbGlrZSB0byBkZXRlcm1pbmUuIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IHN0ZGluKScsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3JiJyksIG5hcmdzPScqJywKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1bc3lzLnN0ZGluIGlmIFBZMiBlbHNlIHN5cy5zdGRpbi5idWZmZXJdKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJzaW9uJywgYWN0aW9uPSd2ZXJzaW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj0nJShwcm9nKXMgezB9Jy5mb3JtYXQoX192ZXJzaW9uX18pKQogICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3YpCgogICAgZm9yIGYgaW4gYXJncy5pbnB1dDoKICAgICAgICBpZiBmLmlzYXR0eSgpOgogICAgICAgICAgICBwcmludCgiWW91IGFyZSBydW5uaW5nIGNoYXJkZXRlY3QgaW50ZXJhY3RpdmVseS4gUHJlc3MgIiArCiAgICAgICAgICAgICAgICAgICJDVFJMLUQgdHdpY2UgYXQgdGhlIHN0YXJ0IG9mIGEgYmxhbmsgbGluZSB0byBzaWduYWwgdGhlICIgKwogICAgICAgICAgICAgICAgICAiZW5kIG9mIHlvdXIgaW5wdXQuIElmIHlvdSB3YW50IGhlbHAsIHJ1biBjaGFyZGV0ZWN0ICIgKwogICAgICAgICAgICAgICAgICAiLS1oZWxwXG4iLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgcHJpbnQoZGVzY3JpcHRpb25fb2YoZiwgZi5uYW1lKSkKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgbWFpbigpClBLAwQUAAAAAAAAACEAXPs3SAYOAAAGDgAAOQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NvZGluZ3N0YXRlbWFjaGluZS5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppbXBvcnQgbG9nZ2luZwoKZnJvbSAuZW51bXMgaW1wb3J0IE1hY2hpbmVTdGF0ZQoKCmNsYXNzIENvZGluZ1N0YXRlTWFjaGluZShvYmplY3QpOgogICAgIiIiCiAgICBBIHN0YXRlIG1hY2hpbmUgdG8gdmVyaWZ5IGEgYnl0ZSBzZXF1ZW5jZSBmb3IgYSBwYXJ0aWN1bGFyIGVuY29kaW5nLiBGb3IKICAgIGVhY2ggYnl0ZSB0aGUgZGV0ZWN0b3IgcmVjZWl2ZXMsIGl0IHdpbGwgZmVlZCB0aGF0IGJ5dGUgdG8gZXZlcnkgYWN0aXZlCiAgICBzdGF0ZSBtYWNoaW5lIGF2YWlsYWJsZSwgb25lIGJ5dGUgYXQgYSB0aW1lLiBUaGUgc3RhdGUgbWFjaGluZSBjaGFuZ2VzIGl0cwogICAgc3RhdGUgYmFzZWQgb24gaXRzIHByZXZpb3VzIHN0YXRlIGFuZCB0aGUgYnl0ZSBpdCByZWNlaXZlcy4gVGhlcmUgYXJlIDMKICAgIHN0YXRlcyBpbiBhIHN0YXRlIG1hY2hpbmUgdGhhdCBhcmUgb2YgaW50ZXJlc3QgdG8gYW4gYXV0by1kZXRlY3RvcjoKCiAgICBTVEFSVCBzdGF0ZTogVGhpcyBpcyB0aGUgc3RhdGUgdG8gc3RhcnQgd2l0aCwgb3IgYSBsZWdhbCBieXRlIHNlcXVlbmNlCiAgICAgICAgICAgICAgICAgKGkuZS4gYSB2YWxpZCBjb2RlIHBvaW50KSBmb3IgY2hhcmFjdGVyIGhhcyBiZWVuIGlkZW50aWZpZWQuCgogICAgTUUgc3RhdGU6ICBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBzdGF0ZSBtYWNoaW5lIGlkZW50aWZpZWQgYSBieXRlIHNlcXVlbmNlCiAgICAgICAgICAgICAgIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhlIGNoYXJzZXQgaXQgaXMgZGVzaWduZWQgZm9yIGFuZCB0aGF0CiAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIG90aGVyIHBvc3NpYmxlIGVuY29kaW5nIHdoaWNoIGNhbiBjb250YWluIHRoaXMgYnl0ZQogICAgICAgICAgICAgICBzZXF1ZW5jZS4gVGhpcyB3aWxsIHRvIGxlYWQgdG8gYW4gaW1tZWRpYXRlIHBvc2l0aXZlIGFuc3dlciBmb3IKICAgICAgICAgICAgICAgdGhlIGRldGVjdG9yLgoKICAgIEVSUk9SIHN0YXRlOiBUaGlzIGluZGljYXRlcyB0aGUgc3RhdGUgbWFjaGluZSBpZGVudGlmaWVkIGFuIGlsbGVnYWwgYnl0ZQogICAgICAgICAgICAgICAgIHNlcXVlbmNlIGZvciB0aGF0IGVuY29kaW5nLiBUaGlzIHdpbGwgbGVhZCB0byBhbiBpbW1lZGlhdGUKICAgICAgICAgICAgICAgICBuZWdhdGl2ZSBhbnN3ZXIgZm9yIHRoaXMgZW5jb2RpbmcuIERldGVjdG9yIHdpbGwgZXhjbHVkZSB0aGlzCiAgICAgICAgICAgICAgICAgZW5jb2RpbmcgZnJvbSBjb25zaWRlcmF0aW9uIGZyb20gaGVyZSBvbi4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNtKToKICAgICAgICBzZWxmLl9tb2RlbCA9IHNtCiAgICAgICAgc2VsZi5fY3Vycl9ieXRlX3BvcyA9IDAKICAgICAgICBzZWxmLl9jdXJyX2NoYXJfbGVuID0gMAogICAgICAgIHNlbGYuX2N1cnJfc3RhdGUgPSBOb25lCiAgICAgICAgc2VsZi5sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc2VsZi5fY3Vycl9zdGF0ZSA9IE1hY2hpbmVTdGF0ZS5TVEFSVAoKICAgIGRlZiBuZXh0X3N0YXRlKHNlbGYsIGMpOgogICAgICAgICMgZm9yIGVhY2ggYnl0ZSB3ZSBnZXQgaXRzIGNsYXNzCiAgICAgICAgIyBpZiBpdCBpcyBmaXJzdCBieXRlLCB3ZSBhbHNvIGdldCBieXRlIGxlbmd0aAogICAgICAgIGJ5dGVfY2xhc3MgPSBzZWxmLl9tb2RlbFsnY2xhc3NfdGFibGUnXVtjXQogICAgICAgIGlmIHNlbGYuX2N1cnJfc3RhdGUgPT0gTWFjaGluZVN0YXRlLlNUQVJUOgogICAgICAgICAgICBzZWxmLl9jdXJyX2J5dGVfcG9zID0gMAogICAgICAgICAgICBzZWxmLl9jdXJyX2NoYXJfbGVuID0gc2VsZi5fbW9kZWxbJ2NoYXJfbGVuX3RhYmxlJ11bYnl0ZV9jbGFzc10KICAgICAgICAjIGZyb20gYnl0ZSdzIGNsYXNzIGFuZCBzdGF0ZV90YWJsZSwgd2UgZ2V0IGl0cyBuZXh0IHN0YXRlCiAgICAgICAgY3Vycl9zdGF0ZSA9IChzZWxmLl9jdXJyX3N0YXRlICogc2VsZi5fbW9kZWxbJ2NsYXNzX2ZhY3RvciddCiAgICAgICAgICAgICAgICAgICAgICArIGJ5dGVfY2xhc3MpCiAgICAgICAgc2VsZi5fY3Vycl9zdGF0ZSA9IHNlbGYuX21vZGVsWydzdGF0ZV90YWJsZSddW2N1cnJfc3RhdGVdCiAgICAgICAgc2VsZi5fY3Vycl9ieXRlX3BvcyArPSAxCiAgICAgICAgcmV0dXJuIHNlbGYuX2N1cnJfc3RhdGUKCiAgICBkZWYgZ2V0X2N1cnJlbnRfY2hhcmxlbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fY3Vycl9jaGFyX2xlbgoKICAgIGRlZiBnZXRfY29kaW5nX3N0YXRlX21hY2hpbmUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX21vZGVsWyduYW1lJ10KCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fbW9kZWxbJ2xhbmd1YWdlJ10KUEsDBBQAAAAAAAAAIQB8huVlbgQAAG4EAAAtAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY29tcGF0LnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgQ29udHJpYnV0b3Iocyk6CiMgICBEYW4gQmxhbmNoYXJkCiMgICBJYW4gQ29yZGFzY28KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKaW1wb3J0IHN5cwoKCmlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMCk6CiAgICBQWTIgPSBUcnVlCiAgICBQWTMgPSBGYWxzZQogICAgYmFzZV9zdHIgPSAoc3RyLCB1bmljb2RlKQogICAgdGV4dF90eXBlID0gdW5pY29kZQplbHNlOgogICAgUFkyID0gRmFsc2UKICAgIFBZMyA9IFRydWUKICAgIGJhc2Vfc3RyID0gKGJ5dGVzLCBzdHIpCiAgICB0ZXh0X3R5cGUgPSBzdHIKUEsDBBQAAAAAAAAAIQC9QpoxPwcAAD8HAAAyAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY3A5NDlwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuY2hhcmRpc3RyaWJ1dGlvbiBpbXBvcnQgRVVDS1JEaXN0cmlidXRpb25BbmFseXNpcwpmcm9tIC5jb2RpbmdzdGF0ZW1hY2hpbmUgaW1wb3J0IENvZGluZ1N0YXRlTWFjaGluZQpmcm9tIC5tYmNoYXJzZXRwcm9iZXIgaW1wb3J0IE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIKZnJvbSAubWJjc3NtIGltcG9ydCBDUDk0OV9TTV9NT0RFTAoKCmNsYXNzIENQOTQ5UHJvYmVyKE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKENQOTQ5UHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb2Rpbmdfc20gPSBDb2RpbmdTdGF0ZU1hY2hpbmUoQ1A5NDlfU01fTU9ERUwpCiAgICAgICAgIyBOT1RFOiBDUDk0OSBpcyBhIHN1cGVyc2V0IG9mIEVVQy1LUiwgc28gdGhlIGRpc3RyaWJ1dGlvbiBzaG91bGQgYmUKICAgICAgICAjICAgICAgIG5vdCBkaWZmZXJlbnQuCiAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIgPSBFVUNLUkRpc3RyaWJ1dGlvbkFuYWx5c2lzKCkKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuICJDUDk0OSIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gIktvcmVhbiIKUEsDBBQAAAAAAAAAIQBEBKzJfQYAAH0GAAAsAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZW51bXMucHkiIiIKQWxsIG9mIHRoZSBFbnVtcyB0aGF0IGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIGNoYXJkZXQgcGFja2FnZS4KCjphdXRob3I6IERhbiBCbGFuY2hhcmQgKGRhbi5ibGFuY2hhcmRAZ21haWwuY29tKQoiIiIKCgpjbGFzcyBJbnB1dFN0YXRlKG9iamVjdCk6CiAgICAiIiIKICAgIFRoaXMgZW51bSByZXByZXNlbnRzIHRoZSBkaWZmZXJlbnQgc3RhdGVzIGEgdW5pdmVyc2FsIGRldGVjdG9yIGNhbiBiZSBpbi4KICAgICIiIgogICAgUFVSRV9BU0NJSSA9IDAKICAgIEVTQ19BU0NJSSA9IDEKICAgIEhJR0hfQllURSA9IDIKCgpjbGFzcyBMYW5ndWFnZUZpbHRlcihvYmplY3QpOgogICAgIiIiCiAgICBUaGlzIGVudW0gcmVwcmVzZW50cyB0aGUgZGlmZmVyZW50IGxhbmd1YWdlIGZpbHRlcnMgd2UgY2FuIGFwcGx5IHRvIGEKICAgIGBgVW5pdmVyc2FsRGV0ZWN0b3JgYC4KICAgICIiIgogICAgQ0hJTkVTRV9TSU1QTElGSUVEID0gMHgwMQogICAgQ0hJTkVTRV9UUkFESVRJT05BTCA9IDB4MDIKICAgIEpBUEFORVNFID0gMHgwNAogICAgS09SRUFOID0gMHgwOAogICAgTk9OX0NKSyA9IDB4MTAKICAgIEFMTCA9IDB4MUYKICAgIENISU5FU0UgPSBDSElORVNFX1NJTVBMSUZJRUQgfCBDSElORVNFX1RSQURJVElPTkFMCiAgICBDSksgPSBDSElORVNFIHwgSkFQQU5FU0UgfCBLT1JFQU4KCgpjbGFzcyBQcm9iaW5nU3RhdGUob2JqZWN0KToKICAgICIiIgogICAgVGhpcyBlbnVtIHJlcHJlc2VudHMgdGhlIGRpZmZlcmVudCBzdGF0ZXMgYSBwcm9iZXIgY2FuIGJlIGluLgogICAgIiIiCiAgICBERVRFQ1RJTkcgPSAwCiAgICBGT1VORF9JVCA9IDEKICAgIE5PVF9NRSA9IDIKCgpjbGFzcyBNYWNoaW5lU3RhdGUob2JqZWN0KToKICAgICIiIgogICAgVGhpcyBlbnVtIHJlcHJlc2VudHMgdGhlIGRpZmZlcmVudCBzdGF0ZXMgYSBzdGF0ZSBtYWNoaW5lIGNhbiBiZSBpbi4KICAgICIiIgogICAgU1RBUlQgPSAwCiAgICBFUlJPUiA9IDEKICAgIElUU19NRSA9IDIKCgpjbGFzcyBTZXF1ZW5jZUxpa2VsaWhvb2Qob2JqZWN0KToKICAgICIiIgogICAgVGhpcyBlbnVtIHJlcHJlc2VudHMgdGhlIGxpa2VsaWhvb2Qgb2YgYSBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSBwcmV2aW91cyBvbmUuCiAgICAiIiIKICAgIE5FR0FUSVZFID0gMAogICAgVU5MSUtFTFkgPSAxCiAgICBMSUtFTFkgPSAyCiAgICBQT1NJVElWRSA9IDMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfbnVtX2NhdGVnb3JpZXMoY2xzKToKICAgICAgICAiIiI6cmV0dXJuczogVGhlIG51bWJlciBvZiBsaWtlbGlob29kIGNhdGVnb3JpZXMgaW4gdGhlIGVudW0uIiIiCiAgICAgICAgcmV0dXJuIDQKCgpjbGFzcyBDaGFyYWN0ZXJDYXRlZ29yeShvYmplY3QpOgogICAgIiIiCiAgICBUaGlzIGVudW0gcmVwcmVzZW50cyB0aGUgZGlmZmVyZW50IGNhdGVnb3JpZXMgbGFuZ3VhZ2UgbW9kZWxzIGZvcgogICAgYGBTaW5nbGVCeXRlQ2hhcnNldFByb2JlcmBgIHB1dCBjaGFyYWN0ZXJzIGludG8uCgogICAgQW55dGhpbmcgbGVzcyB0aGFuIENPTlRST0wgaXMgY29uc2lkZXJlZCBhIGxldHRlci4KICAgICIiIgogICAgVU5ERUZJTkVEID0gMjU1CiAgICBMSU5FX0JSRUFLID0gMjU0CiAgICBTWU1CT0wgPSAyNTMKICAgIERJR0lUID0gMjUyCiAgICBDT05UUk9MID0gMjUxClBLAwQUAAAAAAAAACEABIgFPW4PAABuDwAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2VzY3Byb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5jaGFyc2V0cHJvYmVyIGltcG9ydCBDaGFyU2V0UHJvYmVyCmZyb20gLmNvZGluZ3N0YXRlbWFjaGluZSBpbXBvcnQgQ29kaW5nU3RhdGVNYWNoaW5lCmZyb20gLmVudW1zIGltcG9ydCBMYW5ndWFnZUZpbHRlciwgUHJvYmluZ1N0YXRlLCBNYWNoaW5lU3RhdGUKZnJvbSAuZXNjc20gaW1wb3J0IChIWl9TTV9NT0RFTCwgSVNPMjAyMkNOX1NNX01PREVMLCBJU08yMDIySlBfU01fTU9ERUwsCiAgICAgICAgICAgICAgICAgICAgSVNPMjAyMktSX1NNX01PREVMKQoKCmNsYXNzIEVzY0NoYXJTZXRQcm9iZXIoQ2hhclNldFByb2Jlcik6CiAgICAiIiIKICAgIFRoaXMgQ2hhclNldFByb2JlciB1c2VzIGEgImNvZGUgc2NoZW1lIiBhcHByb2FjaCBmb3IgZGV0ZWN0aW5nIGVuY29kaW5ncywKICAgIHdoZXJlYnkgZWFzaWx5IHJlY29nbml6YWJsZSBlc2NhcGUgb3Igc2hpZnQgc2VxdWVuY2VzIGFyZSByZWxpZWQgb24gdG8KICAgIGlkZW50aWZ5IHRoZXNlIGVuY29kaW5ncy4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYW5nX2ZpbHRlcj1Ob25lKToKICAgICAgICBzdXBlcihFc2NDaGFyU2V0UHJvYmVyLCBzZWxmKS5fX2luaXRfXyhsYW5nX2ZpbHRlcj1sYW5nX2ZpbHRlcikKICAgICAgICBzZWxmLmNvZGluZ19zbSA9IFtdCiAgICAgICAgaWYgc2VsZi5sYW5nX2ZpbHRlciAmIExhbmd1YWdlRmlsdGVyLkNISU5FU0VfU0lNUExJRklFRDoKICAgICAgICAgICAgc2VsZi5jb2Rpbmdfc20uYXBwZW5kKENvZGluZ1N0YXRlTWFjaGluZShIWl9TTV9NT0RFTCkpCiAgICAgICAgICAgIHNlbGYuY29kaW5nX3NtLmFwcGVuZChDb2RpbmdTdGF0ZU1hY2hpbmUoSVNPMjAyMkNOX1NNX01PREVMKSkKICAgICAgICBpZiBzZWxmLmxhbmdfZmlsdGVyICYgTGFuZ3VhZ2VGaWx0ZXIuSkFQQU5FU0U6CiAgICAgICAgICAgIHNlbGYuY29kaW5nX3NtLmFwcGVuZChDb2RpbmdTdGF0ZU1hY2hpbmUoSVNPMjAyMkpQX1NNX01PREVMKSkKICAgICAgICBpZiBzZWxmLmxhbmdfZmlsdGVyICYgTGFuZ3VhZ2VGaWx0ZXIuS09SRUFOOgogICAgICAgICAgICBzZWxmLmNvZGluZ19zbS5hcHBlbmQoQ29kaW5nU3RhdGVNYWNoaW5lKElTTzIwMjJLUl9TTV9NT0RFTCkpCiAgICAgICAgc2VsZi5hY3RpdmVfc21fY291bnQgPSBOb25lCiAgICAgICAgc2VsZi5fZGV0ZWN0ZWRfY2hhcnNldCA9IE5vbmUKICAgICAgICBzZWxmLl9kZXRlY3RlZF9sYW5ndWFnZSA9IE5vbmUKICAgICAgICBzZWxmLl9zdGF0ZSA9IE5vbmUKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc3VwZXIoRXNjQ2hhclNldFByb2Jlciwgc2VsZikucmVzZXQoKQogICAgICAgIGZvciBjb2Rpbmdfc20gaW4gc2VsZi5jb2Rpbmdfc206CiAgICAgICAgICAgIGlmIG5vdCBjb2Rpbmdfc206CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBjb2Rpbmdfc20uYWN0aXZlID0gVHJ1ZQogICAgICAgICAgICBjb2Rpbmdfc20ucmVzZXQoKQogICAgICAgIHNlbGYuYWN0aXZlX3NtX2NvdW50ID0gbGVuKHNlbGYuY29kaW5nX3NtKQogICAgICAgIHNlbGYuX2RldGVjdGVkX2NoYXJzZXQgPSBOb25lCiAgICAgICAgc2VsZi5fZGV0ZWN0ZWRfbGFuZ3VhZ2UgPSBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9kZXRlY3RlZF9jaGFyc2V0CgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2RldGVjdGVkX2xhbmd1YWdlCgogICAgZGVmIGdldF9jb25maWRlbmNlKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX2RldGVjdGVkX2NoYXJzZXQ6CiAgICAgICAgICAgIHJldHVybiAwLjk5CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIDAuMDAKCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0cik6CiAgICAgICAgZm9yIGMgaW4gYnl0ZV9zdHI6CiAgICAgICAgICAgIGZvciBjb2Rpbmdfc20gaW4gc2VsZi5jb2Rpbmdfc206CiAgICAgICAgICAgICAgICBpZiBub3QgY29kaW5nX3NtIG9yIG5vdCBjb2Rpbmdfc20uYWN0aXZlOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBjb2Rpbmdfc3RhdGUgPSBjb2Rpbmdfc20ubmV4dF9zdGF0ZShjKQogICAgICAgICAgICAgICAgaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5FUlJPUjoKICAgICAgICAgICAgICAgICAgICBjb2Rpbmdfc20uYWN0aXZlID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9zbV9jb3VudCAtPSAxCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5hY3RpdmVfc21fY291bnQgPD0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuTk9UX01FCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnN0YXRlCiAgICAgICAgICAgICAgICBlbGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuSVRTX01FOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGV0ZWN0ZWRfY2hhcnNldCA9IGNvZGluZ19zbS5nZXRfY29kaW5nX3N0YXRlX21hY2hpbmUoKQogICAgICAgICAgICAgICAgICAgIHNlbGYuX2RldGVjdGVkX2xhbmd1YWdlID0gY29kaW5nX3NtLmxhbmd1YWdlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKUEsDBBQAAAAAAAAAIQDBCmCiDikAAA4pAAAsAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXNjc20ucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuZW51bXMgaW1wb3J0IE1hY2hpbmVTdGF0ZQoKSFpfQ0xTID0gKAoxLDAsMCwwLDAsMCwwLDAsICAjIDAwIC0gMDcKMCwwLDAsMCwwLDAsMCwwLCAgIyAwOCAtIDBmCjAsMCwwLDAsMCwwLDAsMCwgICMgMTAgLSAxNwowLDAsMCwxLDAsMCwwLDAsICAjIDE4IC0gMWYKMCwwLDAsMCwwLDAsMCwwLCAgIyAyMCAtIDI3CjAsMCwwLDAsMCwwLDAsMCwgICMgMjggLSAyZgowLDAsMCwwLDAsMCwwLDAsICAjIDMwIC0gMzcKMCwwLDAsMCwwLDAsMCwwLCAgIyAzOCAtIDNmCjAsMCwwLDAsMCwwLDAsMCwgICMgNDAgLSA0NwowLDAsMCwwLDAsMCwwLDAsICAjIDQ4IC0gNGYKMCwwLDAsMCwwLDAsMCwwLCAgIyA1MCAtIDU3CjAsMCwwLDAsMCwwLDAsMCwgICMgNTggLSA1ZgowLDAsMCwwLDAsMCwwLDAsICAjIDYwIC0gNjcKMCwwLDAsMCwwLDAsMCwwLCAgIyA2OCAtIDZmCjAsMCwwLDAsMCwwLDAsMCwgICMgNzAgLSA3NwowLDAsMCw0LDAsNSwyLDAsICAjIDc4IC0gN2YKMSwxLDEsMSwxLDEsMSwxLCAgIyA4MCAtIDg3CjEsMSwxLDEsMSwxLDEsMSwgICMgODggLSA4ZgoxLDEsMSwxLDEsMSwxLDEsICAjIDkwIC0gOTcKMSwxLDEsMSwxLDEsMSwxLCAgIyA5OCAtIDlmCjEsMSwxLDEsMSwxLDEsMSwgICMgYTAgLSBhNwoxLDEsMSwxLDEsMSwxLDEsICAjIGE4IC0gYWYKMSwxLDEsMSwxLDEsMSwxLCAgIyBiMCAtIGI3CjEsMSwxLDEsMSwxLDEsMSwgICMgYjggLSBiZgoxLDEsMSwxLDEsMSwxLDEsICAjIGMwIC0gYzcKMSwxLDEsMSwxLDEsMSwxLCAgIyBjOCAtIGNmCjEsMSwxLDEsMSwxLDEsMSwgICMgZDAgLSBkNwoxLDEsMSwxLDEsMSwxLDEsICAjIGQ4IC0gZGYKMSwxLDEsMSwxLDEsMSwxLCAgIyBlMCAtIGU3CjEsMSwxLDEsMSwxLDEsMSwgICMgZTggLSBlZgoxLDEsMSwxLDEsMSwxLDEsICAjIGYwIC0gZjcKMSwxLDEsMSwxLDEsMSwxLCAgIyBmOCAtIGZmCikKCkhaX1NUID0gKApNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgMyxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMDAtMDcKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIyAwOC0wZgpNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCAgICAgNCxNYWNoaW5lU3RhdGUuRVJST1IsIyAxMC0xNwogICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA1LCAgICAgNSwgICAgIDQsTWFjaGluZVN0YXRlLkVSUk9SLCMgMTgtMWYKICAgICA0LE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDQsICAgICA0LCAgICAgNCxNYWNoaW5lU3RhdGUuRVJST1IsICAgICA0LE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDIwLTI3CiAgICAgNCxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCMgMjgtMmYKKQoKSFpfQ0hBUl9MRU5fVEFCTEUgPSAoMCwgMCwgMCwgMCwgMCwgMCkKCkhaX1NNX01PREVMID0geydjbGFzc190YWJsZSc6IEhaX0NMUywKICAgICAgICAgICAgICAgJ2NsYXNzX2ZhY3Rvcic6IDYsCiAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IEhaX1NULAogICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBIWl9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgJ25hbWUnOiAiSFotR0ItMjMxMiIsCiAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdDaGluZXNlJ30KCklTTzIwMjJDTl9DTFMgPSAoCjIsMCwwLDAsMCwwLDAsMCwgICMgMDAgLSAwNwowLDAsMCwwLDAsMCwwLDAsICAjIDA4IC0gMGYKMCwwLDAsMCwwLDAsMCwwLCAgIyAxMCAtIDE3CjAsMCwwLDEsMCwwLDAsMCwgICMgMTggLSAxZgowLDAsMCwwLDAsMCwwLDAsICAjIDIwIC0gMjcKMCwzLDAsMCwwLDAsMCwwLCAgIyAyOCAtIDJmCjAsMCwwLDAsMCwwLDAsMCwgICMgMzAgLSAzNwowLDAsMCwwLDAsMCwwLDAsICAjIDM4IC0gM2YKMCwwLDAsNCwwLDAsMCwwLCAgIyA0MCAtIDQ3CjAsMCwwLDAsMCwwLDAsMCwgICMgNDggLSA0ZgowLDAsMCwwLDAsMCwwLDAsICAjIDUwIC0gNTcKMCwwLDAsMCwwLDAsMCwwLCAgIyA1OCAtIDVmCjAsMCwwLDAsMCwwLDAsMCwgICMgNjAgLSA2NwowLDAsMCwwLDAsMCwwLDAsICAjIDY4IC0gNmYKMCwwLDAsMCwwLDAsMCwwLCAgIyA3MCAtIDc3CjAsMCwwLDAsMCwwLDAsMCwgICMgNzggLSA3ZgoyLDIsMiwyLDIsMiwyLDIsICAjIDgwIC0gODcKMiwyLDIsMiwyLDIsMiwyLCAgIyA4OCAtIDhmCjIsMiwyLDIsMiwyLDIsMiwgICMgOTAgLSA5NwoyLDIsMiwyLDIsMiwyLDIsICAjIDk4IC0gOWYKMiwyLDIsMiwyLDIsMiwyLCAgIyBhMCAtIGE3CjIsMiwyLDIsMiwyLDIsMiwgICMgYTggLSBhZgoyLDIsMiwyLDIsMiwyLDIsICAjIGIwIC0gYjcKMiwyLDIsMiwyLDIsMiwyLCAgIyBiOCAtIGJmCjIsMiwyLDIsMiwyLDIsMiwgICMgYzAgLSBjNwoyLDIsMiwyLDIsMiwyLDIsICAjIGM4IC0gY2YKMiwyLDIsMiwyLDIsMiwyLCAgIyBkMCAtIGQ3CjIsMiwyLDIsMiwyLDIsMiwgICMgZDggLSBkZgoyLDIsMiwyLDIsMiwyLDIsICAjIGUwIC0gZTcKMiwyLDIsMiwyLDIsMiwyLCAgIyBlOCAtIGVmCjIsMiwyLDIsMiwyLDIsMiwgICMgZjAgLSBmNwoyLDIsMiwyLDIsMiwyLDIsICAjIGY4IC0gZmYKKQoKSVNPMjAyMkNOX1NUID0gKApNYWNoaW5lU3RhdGUuU1RBUlQsICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCMgMDAtMDcKTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDA4LTBmCk1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIyAxMC0xNwpNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDQsTWFjaGluZVN0YXRlLkVSUk9SLCMgMTgtMWYKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIyAyMC0yNwogICAgIDUsICAgICA2LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMjgtMmYKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIyAzMC0zNwpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCwjIDM4LTNmCikKCklTTzIwMjJDTl9DSEFSX0xFTl9UQUJMRSA9ICgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKQoKSVNPMjAyMkNOX1NNX01PREVMID0geydjbGFzc190YWJsZSc6IElTTzIwMjJDTl9DTFMsCiAgICAgICAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogOSwKICAgICAgICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IElTTzIwMjJDTl9TVCwKICAgICAgICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IElTTzIwMjJDTl9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogIklTTy0yMDIyLUNOIiwKICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdDaGluZXNlJ30KCklTTzIwMjJKUF9DTFMgPSAoCjIsMCwwLDAsMCwwLDAsMCwgICMgMDAgLSAwNwowLDAsMCwwLDAsMCwyLDIsICAjIDA4IC0gMGYKMCwwLDAsMCwwLDAsMCwwLCAgIyAxMCAtIDE3CjAsMCwwLDEsMCwwLDAsMCwgICMgMTggLSAxZgowLDAsMCwwLDcsMCwwLDAsICAjIDIwIC0gMjcKMywwLDAsMCwwLDAsMCwwLCAgIyAyOCAtIDJmCjAsMCwwLDAsMCwwLDAsMCwgICMgMzAgLSAzNwowLDAsMCwwLDAsMCwwLDAsICAjIDM4IC0gM2YKNiwwLDQsMCw4LDAsMCwwLCAgIyA0MCAtIDQ3CjAsOSw1LDAsMCwwLDAsMCwgICMgNDggLSA0ZgowLDAsMCwwLDAsMCwwLDAsICAjIDUwIC0gNTcKMCwwLDAsMCwwLDAsMCwwLCAgIyA1OCAtIDVmCjAsMCwwLDAsMCwwLDAsMCwgICMgNjAgLSA2NwowLDAsMCwwLDAsMCwwLDAsICAjIDY4IC0gNmYKMCwwLDAsMCwwLDAsMCwwLCAgIyA3MCAtIDc3CjAsMCwwLDAsMCwwLDAsMCwgICMgNzggLSA3ZgoyLDIsMiwyLDIsMiwyLDIsICAjIDgwIC0gODcKMiwyLDIsMiwyLDIsMiwyLCAgIyA4OCAtIDhmCjIsMiwyLDIsMiwyLDIsMiwgICMgOTAgLSA5NwoyLDIsMiwyLDIsMiwyLDIsICAjIDk4IC0gOWYKMiwyLDIsMiwyLDIsMiwyLCAgIyBhMCAtIGE3CjIsMiwyLDIsMiwyLDIsMiwgICMgYTggLSBhZgoyLDIsMiwyLDIsMiwyLDIsICAjIGIwIC0gYjcKMiwyLDIsMiwyLDIsMiwyLCAgIyBiOCAtIGJmCjIsMiwyLDIsMiwyLDIsMiwgICMgYzAgLSBjNwoyLDIsMiwyLDIsMiwyLDIsICAjIGM4IC0gY2YKMiwyLDIsMiwyLDIsMiwyLCAgIyBkMCAtIGQ3CjIsMiwyLDIsMiwyLDIsMiwgICMgZDggLSBkZgoyLDIsMiwyLDIsMiwyLDIsICAjIGUwIC0gZTcKMiwyLDIsMiwyLDIsMiwyLCAgIyBlOCAtIGVmCjIsMiwyLDIsMiwyLDIsMiwgICMgZjAgLSBmNwoyLDIsMiwyLDIsMiwyLDIsICAjIGY4IC0gZmYKKQoKSVNPMjAyMkpQX1NUID0gKApNYWNoaW5lU3RhdGUuU1RBUlQsICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCMgMDAtMDcKTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDA4LTBmCk1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCMgMTAtMTcKTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDE4LTFmCk1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA0LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIyAyMC0yNwpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDYsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsIyAyOC0yZgpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIyAzMC0zNwpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDM4LTNmCk1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCMgNDAtNDcKKQoKSVNPMjAyMkpQX0NIQVJfTEVOX1RBQkxFID0gKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApCgpJU08yMDIySlBfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogSVNPMjAyMkpQX0NMUywKICAgICAgICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IElTTzIwMjJKUF9TVCwKICAgICAgICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IElTTzIwMjJKUF9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogIklTTy0yMDIyLUpQIiwKICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdKYXBhbmVzZSd9CgpJU08yMDIyS1JfQ0xTID0gKAoyLDAsMCwwLDAsMCwwLDAsICAjIDAwIC0gMDcKMCwwLDAsMCwwLDAsMCwwLCAgIyAwOCAtIDBmCjAsMCwwLDAsMCwwLDAsMCwgICMgMTAgLSAxNwowLDAsMCwxLDAsMCwwLDAsICAjIDE4IC0gMWYKMCwwLDAsMCwzLDAsMCwwLCAgIyAyMCAtIDI3CjAsNCwwLDAsMCwwLDAsMCwgICMgMjggLSAyZgowLDAsMCwwLDAsMCwwLDAsICAjIDMwIC0gMzcKMCwwLDAsMCwwLDAsMCwwLCAgIyAzOCAtIDNmCjAsMCwwLDUsMCwwLDAsMCwgICMgNDAgLSA0NwowLDAsMCwwLDAsMCwwLDAsICAjIDQ4IC0gNGYKMCwwLDAsMCwwLDAsMCwwLCAgIyA1MCAtIDU3CjAsMCwwLDAsMCwwLDAsMCwgICMgNTggLSA1ZgowLDAsMCwwLDAsMCwwLDAsICAjIDYwIC0gNjcKMCwwLDAsMCwwLDAsMCwwLCAgIyA2OCAtIDZmCjAsMCwwLDAsMCwwLDAsMCwgICMgNzAgLSA3NwowLDAsMCwwLDAsMCwwLDAsICAjIDc4IC0gN2YKMiwyLDIsMiwyLDIsMiwyLCAgIyA4MCAtIDg3CjIsMiwyLDIsMiwyLDIsMiwgICMgODggLSA4ZgoyLDIsMiwyLDIsMiwyLDIsICAjIDkwIC0gOTcKMiwyLDIsMiwyLDIsMiwyLCAgIyA5OCAtIDlmCjIsMiwyLDIsMiwyLDIsMiwgICMgYTAgLSBhNwoyLDIsMiwyLDIsMiwyLDIsICAjIGE4IC0gYWYKMiwyLDIsMiwyLDIsMiwyLCAgIyBiMCAtIGI3CjIsMiwyLDIsMiwyLDIsMiwgICMgYjggLSBiZgoyLDIsMiwyLDIsMiwyLDIsICAjIGMwIC0gYzcKMiwyLDIsMiwyLDIsMiwyLCAgIyBjOCAtIGNmCjIsMiwyLDIsMiwyLDIsMiwgICMgZDAgLSBkNwoyLDIsMiwyLDIsMiwyLDIsICAjIGQ4IC0gZGYKMiwyLDIsMiwyLDIsMiwyLCAgIyBlMCAtIGU3CjIsMiwyLDIsMiwyLDIsMiwgICMgZTggLSBlZgoyLDIsMiwyLDIsMiwyLDIsICAjIGYwIC0gZjcKMiwyLDIsMiwyLDIsMiwyLCAgIyBmOCAtIGZmCikKCklTTzIwMjJLUl9TVCA9ICgKTWFjaGluZVN0YXRlLlNUQVJULCAgICAgMyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDAwLTA3Ck1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCMgMDgtMGYKTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMTAtMTcKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDE4LTFmCk1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCMgMjAtMjcKKQoKSVNPMjAyMktSX0NIQVJfTEVOX1RBQkxFID0gKDAsIDAsIDAsIDAsIDAsIDApCgpJU08yMDIyS1JfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogSVNPMjAyMktSX0NMUywKICAgICAgICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA2LAogICAgICAgICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogSVNPMjAyMktSX1NULAogICAgICAgICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogSVNPMjAyMktSX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAiSVNPLTIwMjItS1IiLAogICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ0tvcmVhbid9CgoKUEsDBBQAAAAAAAAAIQAgN8TQpQ4AAKUOAAAyAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXVjanBwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuZW51bXMgaW1wb3J0IFByb2JpbmdTdGF0ZSwgTWFjaGluZVN0YXRlCmZyb20gLm1iY2hhcnNldHByb2JlciBpbXBvcnQgTXVsdGlCeXRlQ2hhclNldFByb2Jlcgpmcm9tIC5jb2RpbmdzdGF0ZW1hY2hpbmUgaW1wb3J0IENvZGluZ1N0YXRlTWFjaGluZQpmcm9tIC5jaGFyZGlzdHJpYnV0aW9uIGltcG9ydCBFVUNKUERpc3RyaWJ1dGlvbkFuYWx5c2lzCmZyb20gLmpwY250eCBpbXBvcnQgRVVDSlBDb250ZXh0QW5hbHlzaXMKZnJvbSAubWJjc3NtIGltcG9ydCBFVUNKUF9TTV9NT0RFTAoKCmNsYXNzIEVVQ0pQUHJvYmVyKE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEVVQ0pQUHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb2Rpbmdfc20gPSBDb2RpbmdTdGF0ZU1hY2hpbmUoRVVDSlBfU01fTU9ERUwpCiAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIgPSBFVUNKUERpc3RyaWJ1dGlvbkFuYWx5c2lzKCkKICAgICAgICBzZWxmLmNvbnRleHRfYW5hbHl6ZXIgPSBFVUNKUENvbnRleHRBbmFseXNpcygpCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHN1cGVyKEVVQ0pQUHJvYmVyLCBzZWxmKS5yZXNldCgpCiAgICAgICAgc2VsZi5jb250ZXh0X2FuYWx5emVyLnJlc2V0KCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuICJFVUMtSlAiCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgcmV0dXJuICJKYXBhbmVzZSIKCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0cik6CiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGJ5dGVfc3RyKSk6CiAgICAgICAgICAgICMgUFkzSzogYnl0ZV9zdHIgaXMgYSBieXRlIGFycmF5LCBzbyBieXRlX3N0cltpXSBpcyBhbiBpbnQsIG5vdCBhIGJ5dGUKICAgICAgICAgICAgY29kaW5nX3N0YXRlID0gc2VsZi5jb2Rpbmdfc20ubmV4dF9zdGF0ZShieXRlX3N0cltpXSkKICAgICAgICAgICAgaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5FUlJPUjoKICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCclcyAlcyBwcm9iZXIgaGl0IGVycm9yIGF0IGJ5dGUgJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGFyc2V0X25hbWUsIHNlbGYubGFuZ3VhZ2UsIGkpCiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5OT1RfTUUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5JVFNfTUU6CiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5GT1VORF9JVAogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLlNUQVJUOgogICAgICAgICAgICAgICAgY2hhcl9sZW4gPSBzZWxmLmNvZGluZ19zbS5nZXRfY3VycmVudF9jaGFybGVuKCkKICAgICAgICAgICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9sYXN0X2NoYXJbMV0gPSBieXRlX3N0clswXQogICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dF9hbmFseXplci5mZWVkKHNlbGYuX2xhc3RfY2hhciwgY2hhcl9sZW4pCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIuZmVlZChzZWxmLl9sYXN0X2NoYXIsIGNoYXJfbGVuKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHRfYW5hbHl6ZXIuZmVlZChieXRlX3N0cltpIC0gMTppICsgMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfbGVuKQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyLmZlZWQoYnl0ZV9zdHJbaSAtIDE6aSArIDFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfbGVuKQoKICAgICAgICBzZWxmLl9sYXN0X2NoYXJbMF0gPSBieXRlX3N0clstMV0KCiAgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSBQcm9iaW5nU3RhdGUuREVURUNUSU5HOgogICAgICAgICAgICBpZiAoc2VsZi5jb250ZXh0X2FuYWx5emVyLmdvdF9lbm91Z2hfZGF0YSgpIGFuZAogICAgICAgICAgICAgICAoc2VsZi5nZXRfY29uZmlkZW5jZSgpID4gc2VsZi5TSE9SVENVVF9USFJFU0hPTEQpKToKICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUCgogICAgICAgIHJldHVybiBzZWxmLnN0YXRlCgogICAgZGVmIGdldF9jb25maWRlbmNlKHNlbGYpOgogICAgICAgIGNvbnRleHRfY29uZiA9IHNlbGYuY29udGV4dF9hbmFseXplci5nZXRfY29uZmlkZW5jZSgpCiAgICAgICAgZGlzdHJpYl9jb25mID0gc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgIHJldHVybiBtYXgoY29udGV4dF9jb25mLCBkaXN0cmliX2NvbmYpClBLAwQUAAAAAAAAACEA9EEDeeo0AADqNAAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2V1Y2tyZnJlcS5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBTYW1wbGluZyBmcm9tIGFib3V0IDIwTSB0ZXh0IG1hdGVyaWFscyBpbmNsdWRlIGxpdGVyYXR1cmUgYW5kIGNvbXB1dGVyIHRlY2hub2xvZ3kKCiMgMTI4ICAtLT4gMC43OQojIDI1NiAgLS0+IDAuOTIKIyA1MTIgIC0tPiAwLjk4NgojIDEwMjQgLS0+IDAuOTk5NDQKIyAyMDQ4IC0tPiAwLjk5OTk5CiMKIyBJZGVhIERpc3RyaWJ1dGlvbiBSYXRpbyA9IDAuOTg2NTMgLyAoMS0wLjk4NjUzKSA9IDczLjI0CiMgUmFuZG9tIERpc3RyaWJ1dGlvbiBSYXRpb24gPSA1MTIgLyAoMjM1MC01MTIpID0gMC4yNzkuCiMKIyBUeXBpY2FsIERpc3RyaWJ1dGlvbiBSYXRpbwoKRVVDS1JfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8gPSA2LjAKCkVVQ0tSX1RBQkxFX1NJWkUgPSAyMzUyCgojIENoYXIgdG8gRnJlcU9yZGVyIHRhYmxlICwKRVVDS1JfQ0hBUl9UT19GUkVRX09SREVSID0gKAogIDEzLCAxMzAsIDEyMCwxMzk2LCA0ODEsMTcxOSwxNzIwLCAzMjgsIDYwOSwgMjEyLDE3MjEsIDcwNywgNDAwLCAyOTksMTcyMiwgIDg3LAoxMzk3LDE3MjMsIDEwNCwgNTM2LDExMTcsMTIwMywxNzI0LDEyNjcsIDY4NSwxMjY4LCA1MDgsMTcyNSwxNzI2LDE3MjcsMTcyOCwxMzk4LAoxMzk5LDE3MjksMTczMCwxNzMxLCAxNDEsIDYyMSwgMzI2LDEwNTcsIDM2OCwxNzMyLCAyNjcsIDQ4OCwgIDIwLDE3MzMsMTI2OSwxNzM0LAogOTQ1LDE0MDAsMTczNSwgIDQ3LCA5MDQsMTI3MCwxNzM2LDE3MzcsIDc3MywgMjQ4LDE3MzgsIDQwOSwgMzEzLCA3ODYsIDQyOSwxNzM5LAogMTE2LCA5ODcsIDgxMywxNDAxLCA2ODMsICA3NSwxMjA0LCAxNDUsMTc0MCwxNzQxLDE3NDIsMTc0MywgIDE2LCA4NDcsIDY2NywgNjIyLAogNzA4LDE3NDQsMTc0NSwxNzQ2LCA5NjYsIDc4NywgMzA0LCAxMjksMTc0NywgIDYwLCA4MjAsIDEyMywgNjc2LDE3NDgsMTc0OSwxNzUwLAoxNzUxLCA2MTcsMTc1MiwgNjI2LDE3NTMsMTc1NCwxNzU1LDE3NTYsIDY1MywxNzU3LDE3NTgsMTc1OSwxNzYwLDE3NjEsMTc2MiwgODU2LAogMzQ0LDE3NjMsMTc2NCwxNzY1LDE3NjYsICA4OSwgNDAxLCA0MTgsIDgwNiwgOTA1LCA4NDgsMTc2NywxNzY4LDE3NjksIDk0NiwxMjA1LAogNzA5LDE3NzAsMTExOCwxNzcxLCAyNDEsMTc3MiwxNzczLDE3NzQsMTI3MSwxNzc1LCA1NjksMTc3NiwgOTk5LDE3NzcsMTc3OCwxNzc5LAoxNzgwLCAzMzcsIDc1MSwxMDU4LCAgMjgsIDYyOCwgMjU0LDE3ODEsIDE3NywgOTA2LCAyNzAsIDM0OSwgODkxLDEwNzksMTc4MiwgIDE5LAoxNzgzLCAzNzksMTc4NCwgMzE1LDE3ODUsIDYyOSwgNzU0LDE0MDIsIDU1OSwxNzg2LCA2MzYsIDIwMywxMjA2LDE3ODcsIDcxMCwgNTY3LAoxNzg4LCA5MzUsIDgxNCwxNzg5LDE3OTAsMTIwNywgNzY2LCA1MjgsMTc5MSwxNzkyLDEyMDgsMTc5MywxNzk0LDE3OTUsMTc5NiwxNzk3LAoxNDAzLDE3OTgsMTc5OSwgNTMzLDEwNTksMTQwNCwxNDA1LDExNTYsMTQwNiwgOTM2LCA4ODQsMTA4MCwxODAwLCAzNTEsMTgwMSwxODAyLAoxODAzLDE4MDQsMTgwNSwgODAxLDE4MDYsMTgwNywxODA4LDExMTksMTgwOSwxMTU3LCA3MTQsIDQ3NCwxNDA3LDE4MTAsIDI5OCwgODk5LAogODg1LDE4MTEsMTEyMCwgODAyLDExNTgsMTgxMiwgODkyLDE4MTMsMTgxNCwxNDA4LCA2NTksMTgxNSwxODE2LDExMjEsMTgxNywxODE4LAoxODE5LDE4MjAsMTgyMSwxODIyLCAzMTksMTgyMywgNTk0LCA1NDUsMTgyNCwgODE1LCA5MzcsMTIwOSwxODI1LDE4MjYsIDU3MywxNDA5LAoxMDIyLDE4MjcsMTIxMCwxODI4LDE4MjksMTgzMCwxODMxLDE4MzIsMTgzMywgNTU2LCA3MjIsIDgwNywxMTIyLDEwNjAsMTgzNCwgNjk3LAoxODM1LCA5MDAsIDU1NywgNzE1LDE4MzYsMTQxMCwgNTQwLDE0MTEsIDc1MiwxMTU5LCAyOTQsIDU5NywxMjExLCA5NzYsIDgwMywgNzcwLAoxNDEyLDE4MzcsMTgzOCwgIDM5LCA3OTQsMTQxMywgMzU4LDE4MzksIDM3MSwgOTI1LDE4NDAsIDQ1MywgNjYxLCA3ODgsIDUzMSwgNzIzLAogNTQ0LDEwMjMsMTA4MSwgODY5LCAgOTEsMTg0MSwgMzkyLCA0MzAsIDc5MCwgNjAyLDE0MTQsIDY3NywxMDgyLCA0NTcsMTQxNSwxNDE2LAoxODQyLDE4NDMsIDQ3NSwgMzI3LDEwMjQsMTQxNywgNzk1LCAxMjEsMTg0NCwgNzMzLCA0MDMsMTQxOCwxODQ1LDE4NDYsMTg0NywgMzAwLAogMTE5LCA3MTEsMTIxMiwgNjI3LDE4NDgsMTI3MiwgMjA3LDE4NDksMTg1MCwgNzk2LDEyMTMsIDM4MiwxODUxLCA1MTksMTg1MiwxMDgzLAogODkzLDE4NTMsMTg1NCwxODU1LCAzNjcsIDgwOSwgNDg3LCA2NzEsMTg1NiwgNjYzLDE4NTcsMTg1OCwgOTU2LCA0NzEsIDMwNiwgODU3LAoxODU5LDE4NjAsMTE2MCwxMDg0LDE4NjEsMTg2MiwxODYzLDE4NjQsMTg2NSwxMDYxLDE4NjYsMTg2NywxODY4LDE4NjksMTg3MCwxODcxLAogMjgyLCAgOTYsIDU3NCwxODcyLCA1MDIsMTA4NSwxODczLDEyMTQsMTg3NCwgOTA3LDE4NzUsMTg3NiwgODI3LCA5NzcsMTQxOSwxNDIwLAoxNDIxLCAyNjgsMTg3NywxNDIyLDE4NzgsMTg3OSwxODgwLCAzMDgsMTg4MSwgICAyLCA1MzcsMTg4MiwxODgzLDEyMTUsMTg4NCwxODg1LAogMTI3LCA3OTEsMTg4NiwxMjczLDE0MjMsMTg4NywgIDM0LCAzMzYsIDQwNCwgNjQzLDE4ODgsIDU3MSwgNjU0LCA4OTQsIDg0MCwxODg5LAogICAwLCA4ODYsMTI3NCwgMTIyLCA1NzUsIDI2MCwgOTA4LCA5MzgsMTg5MCwxMjc1LCA0MTAsIDMxNiwxODkxLDE4OTIsIDEwMCwxODkzLAoxODk0LDExMjMsICA0OCwxMTYxLDExMjQsMTAyNSwxODk1LCA2MzMsIDkwMSwxMjc2LDE4OTYsMTg5NywgMTE1LCA4MTYsMTg5OCwgMzE3LAoxODk5LCA2OTQsMTkwMCwgOTA5LCA3MzQsMTQyNCwgNTcyLCA4NjYsMTQyNSwgNjkxLCAgODUsIDUyNCwxMDEwLCA1NDMsIDM5NCwgODQxLAoxOTAxLDE5MDIsMTkwMywxMDI2LDE5MDQsMTkwNSwxOTA2LDE5MDcsMTkwOCwxOTA5LCAgMzAsIDQ1MSwgNjUxLCA5ODgsIDMxMCwxOTEwLAoxOTExLDE0MjYsIDgxMCwxMjE2LCAgOTMsMTkxMiwxOTEzLDEyNzcsMTIxNywxOTE0LCA4NTgsIDc1OSwgIDQ1LCAgNTgsIDE4MSwgNjEwLAogMjY5LDE5MTUsMTkxNiwgMTMxLDEwNjIsIDU1MSwgNDQzLDEwMDAsIDgyMSwxNDI3LCA5NTcsIDg5NSwxMDg2LDE5MTcsMTkxOCwgMzc1LAoxOTE5LCAzNTksMTkyMCwgNjg3LDE5MjEsIDgyMiwxOTIyLCAyOTMsMTkyMywxOTI0LCAgNDAsIDY2MiwgMTE4LCA2OTIsICAyOSwgOTM5LAogODg3LCA2NDAsIDQ4MiwgMTc0LDE5MjUsICA2OSwxMTYyLCA3MjgsMTQyOCwgOTEwLDE5MjYsMTI3OCwxMjE4LDEyNzksIDM4NiwgODcwLAogMjE3LCA4NTQsMTE2MywgODIzLDE5MjcsMTkyOCwxOTI5LDE5MzAsIDgzNCwxOTMxLCAgNzgsMTkzMiwgODU5LDE5MzMsMTA2MywxOTM0LAoxOTM1LDE5MzYsMTkzNywgNDM4LDExNjQsIDIwOCwgNTk1LDE5MzgsMTkzOSwxOTQwLDE5NDEsMTIxOSwxMTI1LDE5NDIsIDI4MCwgODg4LAoxNDI5LDE0MzAsMTIyMCwxNDMxLDE5NDMsMTk0NCwxOTQ1LDE5NDYsMTk0NywxMjgwLCAxNTAsIDUxMCwxNDMyLDE5NDgsMTk0OSwxOTUwLAoxOTUxLDE5NTIsMTk1MywxOTU0LDEwMTEsMTA4NywxOTU1LDE0MzMsMTA0MywxOTU2LCA4ODEsMTk1NywgNjE0LCA5NTgsMTA2NCwxMDY1LAoxMjIxLDE5NTgsIDYzOCwxMDAxLCA4NjAsIDk2NywgODk2LDE0MzQsIDk4OSwgNDkyLCA1NTMsMTI4MSwxMTY1LDE5NTksMTI4MiwxMDAyLAoxMjgzLDEyMjIsMTk2MCwxOTYxLDE5NjIsMTk2MywgIDM2LCAzODMsIDIyOCwgNzUzLCAyNDcsIDQ1NCwxOTY0LCA4NzYsIDY3OCwxOTY1LAoxOTY2LDEyODQsIDEyNiwgNDY0LCA0OTAsIDgzNSwgMTM2LCA2NzIsIDUyOSwgOTQwLDEwODgsMTQzNSwgNDczLDE5NjcsMTk2OCwgNDY3LAogIDUwLCAzOTAsIDIyNywgNTg3LCAyNzksIDM3OCwgNTk4LCA3OTIsIDk2OCwgMjQwLCAxNTEsIDE2MCwgODQ5LCA4ODIsMTEyNiwxMjg1LAogNjM5LDEwNDQsIDEzMywgMTQwLCAyODgsIDM2MCwgODExLCA1NjMsMTAyNywgNTYxLCAxNDIsIDUyMywxOTY5LDE5NzAsMTk3MSwgICA3LAogMTAzLCAyOTYsIDQzOSwgNDA3LCA1MDYsIDYzNCwgOTkwLDE5NzIsMTk3MywxOTc0LDE5NzUsIDY0NSwxOTc2LDE5NzcsMTk3OCwxOTc5LAoxOTgwLDE5ODEsIDIzNiwxOTgyLDE0MzYsMTk4MywxOTg0LDEwODksIDE5MiwgODI4LCA2MTgsIDUxOCwxMTY2LCAzMzMsMTEyNywxOTg1LAogODE4LDEyMjMsMTk4NiwxOTg3LDE5ODgsMTk4OSwxOTkwLDE5OTEsMTk5MiwxOTkzLCAzNDIsMTEyOCwxMjg2LCA3NDYsIDg0MiwxOTk0LAoxOTk1LCA1NjAsIDIyMywxMjg3LCAgOTgsICAgOCwgMTg5LCA2NTAsIDk3OCwxMjg4LDE5OTYsMTQzNywxOTk3LCAgMTcsIDM0NSwgMjUwLAogNDIzLCAyNzcsIDIzNCwgNTEyLCAyMjYsICA5NywgMjg5LCAgNDIsIDE2NywxOTk4LCAyMDEsMTk5OSwyMDAwLCA4NDMsIDgzNiwgODI0LAogNTMyLCAzMzgsIDc4MywxMDkwLCAxODIsIDU3NiwgNDM2LDE0MzgsMTQzOSwgNTI3LCA1MDAsMjAwMSwgOTQ3LCA4ODksMjAwMiwyMDAzLAoyMDA0LDIwMDUsIDI2MiwgNjAwLCAzMTQsIDQ0NywyMDA2LCA1NDcsMjAwNywgNjkzLCA3MzgsMTEyOSwyMDA4LCAgNzEsMTQ0MCwgNzQ1LAogNjE5LCA2ODgsMjAwOSwgODI5LDIwMTAsMjAxMSwgMTQ3LDIwMTIsICAzMywgOTQ4LDIwMTMsMjAxNCwgIDc0LCAyMjQsMjAxNSwgIDYxLAogMTkxLCA5MTgsIDM5OSwgNjM3LDIwMTYsMTAyOCwxMTMwLCAyNTcsIDkwMiwyMDE3LDIwMTgsMjAxOSwyMDIwLDIwMjEsMjAyMiwyMDIzLAoyMDI0LDIwMjUsMjAyNiwgODM3LDIwMjcsMjAyOCwyMDI5LDIwMzAsIDE3OSwgODc0LCA1OTEsICA1MiwgNzI0LCAyNDYsMjAzMSwyMDMyLAoyMDMzLDIwMzQsMTE2NywgOTY5LDIwMzUsMTI4OSwgNjMwLCA2MDUsIDkxMSwxMDkxLDExNjgsMjAzNiwyMDM3LDIwMzgsMTQ0MSwgOTEyLAoyMDM5LCA2MjMsMjA0MCwyMDQxLCAyNTMsMTE2OSwxMjkwLDIwNDIsMTQ0MiwgMTQ2LCA2MjAsIDYxMSwgNTc3LCA0MzMsMjA0MywxMjI0LAogNzE5LDExNzAsIDk1OSwgNDQwLCA0MzcsIDUzNCwgIDg0LCAzODgsIDQ4MCwxMTMxLCAxNTksIDIyMCwgMTk4LCA2NzksMjA0NCwxMDEyLAogODE5LDEwNjYsMTQ0MywgMTEzLDEyMjUsIDE5NCwgMzE4LDEwMDMsMTAyOSwyMDQ1LDIwNDYsMjA0NywyMDQ4LDEwNjcsMjA0OSwyMDUwLAoyMDUxLDIwNTIsMjA1MywgIDU5LCA5MTMsIDExMiwyMDU0LCA2MzIsMjA1NSwgNDU1LCAxNDQsIDczOSwxMjkxLDIwNTYsIDI3MywgNjgxLAogNDk5LDIwNTcsIDQ0OCwyMDU4LDIwNTksIDc2MCwyMDYwLDIwNjEsIDk3MCwgMzg0LCAxNjksIDI0NSwxMTMyLDIwNjIsMjA2MywgNDE0LAoxNDQ0LDIwNjQsMjA2NSwgIDQxLCAyMzUsMjA2NiwgMTU3LCAyNTIsIDg3NywgNTY4LCA5MTksIDc4OSwgNTgwLDIwNjcsIDcyNSwyMDY4LAoyMDY5LDEyOTIsMjA3MCwyMDcxLDE0NDUsMjA3MiwxNDQ2LDIwNzMsMjA3NCwgIDU1LCA1ODgsICA2NiwxNDQ3LCAyNzEsMTA5MiwyMDc1LAoxMjI2LDIwNzYsIDk2MCwxMDEzLCAzNzIsMjA3NywyMDc4LDIwNzksMjA4MCwyMDgxLDEyOTMsMjA4MiwyMDgzLDIwODQsMjA4NSwgODUwLAoyMDg2LDIwODcsMjA4OCwyMDg5LDIwOTAsIDE4NiwyMDkxLDEwNjgsIDE4MCwyMDkyLDIwOTMsMjA5NCwgMTA5LDEyMjcsIDUyMiwgNjA2LAoyMDk1LCA4NjcsMTQ0OCwxMDkzLCA5OTEsMTE3MSwgOTI2LCAzNTMsMTEzMywyMDk2LCA1ODEsMjA5NywyMDk4LDIwOTksMTI5NCwxNDQ5LAoxNDUwLDIxMDAsIDU5NiwxMTcyLDEwMTQsMTIyOCwyMTAxLDE0NTEsMTI5NSwxMTczLDEyMjksMjEwMiwyMTAzLDEyOTYsMTEzNCwxNDUyLAogOTQ5LDExMzUsMjEwNCwyMTA1LDEwOTQsMTQ1MywxNDU0LDE0NTUsMjEwNiwxMDk1LDIxMDcsMjEwOCwyMTA5LDIxMTAsMjExMSwyMTEyLAoyMTEzLDIxMTQsMjExNSwyMTE2LDIxMTcsIDgwNCwyMTE4LDIxMTksMTIzMCwxMjMxLCA4MDUsMTQ1NiwgNDA1LDExMzYsMjEyMCwyMTIxLAoyMTIyLDIxMjMsMjEyNCwgNzIwLCA3MDEsMTI5NywgOTkyLDE0NTcsIDkyNywxMDA0LDIxMjUsMjEyNiwyMTI3LDIxMjgsMjEyOSwyMTMwLAogIDIyLCA0MTcsMjEzMSwgMzAzLDIxMzIsIDM4NSwyMTMzLCA5NzEsIDUyMCwgNTEzLDIxMzQsMTE3NCwgIDczLDEwOTYsIDIzMSwgMjc0LAogOTYyLDE0NTgsIDY3MywyMTM1LDE0NTksMjEzNiwgMTUyLDExMzcsMjEzNywyMTM4LDIxMzksMjE0MCwxMDA1LDExMzgsMTQ2MCwxMTM5LAoyMTQxLDIxNDIsMjE0MywyMTQ0LCAgMTEsIDM3NCwgODQ0LDIxNDUsIDE1NCwxMjMyLCAgNDYsMTQ2MSwyMTQ2LCA4MzgsIDgzMCwgNzIxLAoxMjMzLCAxMDYsMjE0NywgIDkwLCA0MjgsIDQ2MiwgNTc4LCA1NjYsMTE3NSwgMzUyLDIxNDgsMjE0OSwgNTM4LDEyMzQsIDEyNCwxMjk4LAoyMTUwLDE0NjIsIDc2MSwgNTY1LDIxNTEsIDY4NiwyMTUyLCA2NDksMjE1MywgIDcyLCAxNzMsMjE1NCwgNDYwLCA0MTUsMjE1NSwxNDYzLAoyMTU2LDEyMzUsIDMwNSwyMTU3LDIxNTgsMjE1OSwyMTYwLDIxNjEsMjE2MiwgNTc5LDIxNjMsMjE2NCwyMTY1LDIxNjYsMjE2NywgNzQ3LAoyMTY4LDIxNjksMjE3MCwyMTcxLDE0NjQsIDY2OSwyMTcyLDIxNzMsMjE3NCwyMTc1LDIxNzYsMTQ2NSwyMTc3LCAgMjMsIDUzMCwgMjg1LAoyMTc4LCAzMzUsIDcyOSwyMTc5LCAzOTcsMjE4MCwyMTgxLDIxODIsMTAzMCwyMTgzLDIxODQsIDY5OCwyMTg1LDIxODYsIDMyNSwyMTg3LAoyMTg4LCAzNjksMjE4OSwgNzk5LDEwOTcsMTAxNSwgMzQ4LDIxOTAsMTA2OSwgNjgwLDIxOTEsIDg1MSwxNDY2LDIxOTIsMjE5MywgIDEwLAoyMTk0LCA2MTMsIDQyNCwyMTk1LCA5NzksIDEwOCwgNDQ5LCA1ODksICAyNywgMTcyLCAgODEsMTAzMSwgIDgwLCA3NzQsIDI4MSwgMzUwLAoxMDMyLCA1MjUsIDMwMSwgNTgyLDExNzYsMjE5NiwgNjc0LDEwNDUsMjE5NywyMTk4LDE0NjcsIDczMCwgNzYyLDIxOTksMjIwMCwyMjAxLAoyMjAyLDE0NjgsMjIwMywgOTkzLDIyMDQsMjIwNSwgMjY2LDEwNzAsIDk2MywxMTQwLDIyMDYsMjIwNywyMjA4LCA2NjQsMTA5OCwgOTcyLAoyMjA5LDIyMTAsMjIxMSwxMTc3LDE0NjksMTQ3MCwgODcxLDIyMTIsMjIxMywyMjE0LDIyMTUsMjIxNiwxNDcxLDIyMTcsMjIxOCwyMjE5LAoyMjIwLDIyMjEsMjIyMiwyMjIzLDIyMjQsMjIyNSwyMjI2LDIyMjcsMTQ3MiwxMjM2LDIyMjgsMjIyOSwyMjMwLDIyMzEsMjIzMiwyMjMzLAoyMjM0LDIyMzUsMTI5OSwyMjM2LDIyMzcsIDIwMCwyMjM4LCA0NzcsIDM3MywyMjM5LDIyNDAsIDczMSwgODI1LCA3NzcsMjI0MSwyMjQyLAoyMjQzLCA1MjEsIDQ4NiwgNTQ4LDIyNDQsMjI0NSwyMjQ2LDE0NzMsMTMwMCwgIDUzLCA1NDksIDEzNywgODc1LCAgNzYsIDE1OCwyMjQ3LAoxMzAxLDE0NzQsIDQ2OSwgMzk2LDEwMTYsIDI3OCwgNzEyLDIyNDgsIDMyMSwgNDQyLCA1MDMsIDc2NywgNzQ0LCA5NDEsMTIzNywxMTc4LAoxNDc1LDIyNDksICA4MiwgMTc4LDExNDEsMTE3OSwgOTczLDIyNTAsMTMwMiwyMjUxLCAyOTcsMjI1MiwyMjUzLCA1NzAsMjI1NCwyMjU1LAoyMjU2LCAgMTgsIDQ1MCwgMjA2LDIyNTcsIDI5MCwgMjkyLDExNDIsMjI1OCwgNTExLCAxNjIsICA5OSwgMzQ2LCAxNjQsIDczNSwyMjU5LAoxNDc2LDE0NzcsICAgNCwgNTU0LCAzNDMsIDc5OCwxMDk5LDIyNjAsMTEwMCwyMjYxLCAgNDMsIDE3MSwxMzAzLCAxMzksIDIxNSwyMjYyLAoyMjYzLCA3MTcsIDc3NSwyMjY0LDEwMzMsIDMyMiwgMjE2LDIyNjUsIDgzMSwyMjY2LCAxNDksMjI2NywxMzA0LDIyNjgsMjI2OSwgNzAyLAoxMjM4LCAxMzUsIDg0NSwgMzQ3LCAzMDksMjI3MCwgNDg0LDIyNzEsIDg3OCwgNjU1LCAyMzgsMTAwNiwxNDc4LDIyNzIsICA2NywyMjczLAogMjk1LDIyNzQsMjI3NSwgNDYxLDIyNzYsIDQ3OCwgOTQyLCA0MTIsMjI3NywxMDM0LDIyNzgsMjI3OSwyMjgwLCAyNjUsMjI4MSwgNTQxLAoyMjgyLDIyODMsMjI4NCwyMjg1LDIyODYsICA3MCwgODUyLDEwNzEsMjI4NywyMjg4LDIyODksMjI5MCwgIDIxLCAgNTYsIDUwOSwgMTE3LAogNDMyLDIyOTEsMjI5MiwgMzMxLCA5ODAsIDU1MiwxMTAxLCAxNDgsIDI4NCwgMTA1LCAzOTMsMTE4MCwxMjM5LCA3NTUsMjI5MywgMTg3LAoyMjk0LDEwNDYsMTQ3OSwyMjk1LCAzNDAsMjI5NiwgIDYzLDEwNDcsIDIzMCwyMjk3LDIyOTgsMTMwNSwgNzYzLDEzMDYsIDEwMSwgODAwLAogODA4LCA0OTQsMjI5OSwyMzAwLDIzMDEsIDkwMywyMzAyLCAgMzcsMTA3MiwgIDE0LCAgIDUsMjMwMywgIDc5LCA2NzUsMjMwNCwgMzEyLAoyMzA1LDIzMDYsMjMwNywyMzA4LDIzMDksMTQ4MCwgICA2LDEzMDcsMjMxMCwyMzExLDIzMTIsICAgMSwgNDcwLCAgMzUsICAyNCwgMjI5LAoyMzEzLCA2OTUsIDIxMCwgIDg2LCA3NzgsICAxNSwgNzg0LCA1OTIsIDc3OSwgIDMyLCAgNzcsIDg1NSwgOTY0LDIzMTQsIDI1OSwyMzE1LAogNTAxLCAzODAsMjMxNiwyMzE3LCAgODMsIDk4MSwgMTUzLCA2ODksMTMwOCwxNDgxLDE0ODIsMTQ4MywyMzE4LDIzMTksIDcxNiwxNDg0LAoyMzIwLDIzMjEsMjMyMiwyMzIzLDIzMjQsMjMyNSwxNDg1LDIzMjYsMjMyNywgMTI4LCAgNTcsICA2OCwgMjYxLDEwNDgsIDIxMSwgMTcwLAoxMjQwLCAgMzEsMjMyOCwgIDUxLCA0MzUsIDc0MiwyMzI5LDIzMzAsMjMzMSwgNjM1LDIzMzIsIDI2NCwgNDU2LDIzMzMsMjMzNCwyMzM1LAogNDI1LDIzMzYsMTQ4NiwgMTQzLCA1MDcsIDI2MywgOTQzLDIzMzcsIDM2MywgOTIwLDE0ODcsIDI1NiwxNDg4LDExMDIsIDI0MywgNjAxLAoxNDg5LDIzMzgsMjMzOSwyMzQwLDIzNDEsMjM0MiwyMzQzLDIzNDQsIDg2MSwyMzQ1LDIzNDYsMjM0NywyMzQ4LDIzNDksMjM1MCwgMzk1LAoyMzUxLDE0OTAsMTQ5MSwgIDYyLCA1MzUsIDE2NiwgMjI1LDIzNTIsMjM1MywgNjY4LCA0MTksMTI0MSwgMTM4LCA2MDQsIDkyOCwyMzU0LAoxMTgxLDIzNTUsMTQ5MiwxNDkzLDIzNTYsMjM1NywyMzU4LDExNDMsMjM1OSwgNjk2LDIzNjAsIDM4NywgMzA3LDEzMDksIDY4MiwgNDc2LAoyMzYxLDIzNjIsIDMzMiwgIDEyLCAyMjIsIDE1NiwyMzYzLCAyMzIsMjM2NCwgNjQxLCAyNzYsIDY1NiwgNTE3LDE0OTQsMTQ5NSwxMDM1LAogNDE2LCA3MzYsMTQ5NiwyMzY1LDEwMTcsIDU4NiwyMzY2LDIzNjcsMjM2OCwxNDk3LDIzNjksIDI0MiwyMzcwLDIzNzEsMjM3MiwxNDk4LAoyMzczLCA5NjUsIDcxMywyMzc0LDIzNzUsMjM3NiwyMzc3LCA3NDAsIDk4MiwxNDk5LCA5NDQsMTUwMCwxMDA3LDIzNzgsMjM3OSwxMzEwLAoxNTAxLDIzODAsMjM4MSwyMzgyLCA3ODUsIDMyOSwyMzgzLDIzODQsMTUwMiwyMzg1LDIzODYsMjM4NywgOTMyLDIzODgsMTUwMywyMzg5LAoyMzkwLDIzOTEsMjM5MiwxMjQyLDIzOTMsMjM5NCwyMzk1LDIzOTYsMjM5NywgOTk0LCA5NTAsMjM5OCwyMzk5LDI0MDAsMjQwMSwxNTA0LAoxMzExLDI0MDIsMjQwMywyNDA0LDI0MDUsMTA0OSwgNzQ5LDI0MDYsMjQwNywgODUzLCA3MTgsMTE0NCwxMzEyLDI0MDgsMTE4MiwxNTA1LAoyNDA5LDI0MTAsIDI1NSwgNTE2LCA0NzksIDU2NCwgNTUwLCAyMTQsMTUwNiwxNTA3LDEzMTMsIDQxMywgMjM5LCA0NDQsIDMzOSwxMTQ1LAoxMDM2LDE1MDgsMTUwOSwxMzE0LDEwMzcsMTUxMCwxMzE1LDI0MTEsMTUxMSwyNDEyLDI0MTMsMjQxNCwgMTc2LCA3MDMsIDQ5NywgNjI0LAogNTkzLCA5MjEsIDMwMiwyNDE1LCAzNDEsIDE2NSwxMTAzLDE1MTIsMjQxNiwxNTEzLDI0MTcsMjQxOCwyNDE5LCAzNzYsMjQyMCwgNzAwLAoyNDIxLDI0MjIsMjQyMywgMjU4LCA3NjgsMTMxNiwyNDI0LDExODMsMjQyNSwgOTk1LCA2MDgsMjQyNiwyNDI3LDI0MjgsMjQyOSwgMjIxLAoyNDMwLDI0MzEsMjQzMiwyNDMzLDI0MzQsMjQzNSwyNDM2LDI0MzcsIDE5NSwgMzIzLCA3MjYsIDE4OCwgODk3LCA5ODMsMTMxNywgMzc3LAogNjQ0LDEwNTAsIDg3OSwyNDM4LCA0NTIsMjQzOSwyNDQwLDI0NDEsMjQ0MiwyNDQzLDI0NDQsIDkxNCwyNDQ1LDI0NDYsMjQ0NywyNDQ4LAogOTE1LCA0ODksMjQ0OSwxNTE0LDExODQsMjQ1MCwyNDUxLCA1MTUsICA2NCwgNDI3LCA0OTUsMjQ1MiwgNTgzLDI0NTMsIDQ4MywgNDg1LAoxMDM4LCA1NjIsIDIxMywxNTE1LCA3NDgsIDY2NiwyNDU0LDI0NTUsMjQ1NiwyNDU3LCAzMzQsMjQ1OCwgNzgwLCA5OTYsMTAwOCwgNzA1LAoxMjQzLDI0NTksMjQ2MCwyNDYxLDI0NjIsMjQ2MywgMTE0LDI0NjQsIDQ5MywxMTQ2LCAzNjYsIDE2MywxNTE2LCA5NjEsMTEwNCwyNDY1LAogMjkxLDI0NjYsMTMxOCwxMTA1LDI0NjcsMTUxNywgMzY1LDI0NjgsIDM1NSwgOTUxLDEyNDQsMjQ2OSwxMzE5LDI0NzAsIDYzMSwyNDcxLAoyNDcyLCAyMTgsMTMyMCwgMzY0LCAzMjAsIDc1NiwxNTE4LDE1MTksMTMyMSwxNTIwLDEzMjIsMjQ3MywyNDc0LDI0NzUsMjQ3NiwgOTk3LAoyNDc3LDI0NzgsMjQ3OSwyNDgwLCA2NjUsMTE4NSwyNDgxLCA5MTYsMTUyMSwyNDgyLDI0ODMsMjQ4NCwgNTg0LCA2ODQsMjQ4NSwyNDg2LAogNzk3LDI0ODcsMTA1MSwxMTg2LDI0ODgsMjQ4OSwyNDkwLDE1MjIsMjQ5MSwyNDkyLCAzNzAsMjQ5MywxMDM5LDExODcsICA2NSwyNDk0LAogNDM0LCAyMDUsIDQ2MywxMTg4LDI0OTUsIDEyNSwgODEyLCAzOTEsIDQwMiwgODI2LCA2OTksIDI4NiwgMzk4LCAxNTUsIDc4MSwgNzcxLAogNTg1LDI0OTYsIDU5MCwgNTA1LDEwNzMsMjQ5NywgNTk5LCAyNDQsIDIxOSwgOTE3LDEwMTgsIDk1MiwgNjQ2LDE1MjMsMjQ5OCwxMzIzLAoyNDk5LDI1MDAsICA0OSwgOTg0LCAzNTQsIDc0MSwyNTAxLCA2MjUsMjUwMiwxMzI0LDI1MDMsMTAxOSwgMTkwLCAzNTcsIDc1NywgNDkxLAogIDk1LCA3ODIsIDg2OCwyNTA0LDI1MDUsMjUwNiwyNTA3LDI1MDgsMjUwOSwgMTM0LDE1MjQsMTA3NCwgNDIyLDE1MjUsIDg5OCwyNTEwLAogMTYxLDI1MTEsMjUxMiwyNTEzLDI1MTQsIDc2OSwyNTE1LDE1MjYsMjUxNiwyNTE3LCA0MTEsMTMyNSwyNTE4LCA0NzIsMTUyNywyNTE5LAoyNTIwLDI1MjEsMjUyMiwyNTIzLDI1MjQsIDk4NSwyNTI1LDI1MjYsMjUyNywyNTI4LDI1MjksMjUzMCwgNzY0LDI1MzEsMTI0NSwyNTMyLAoyNTMzLCAgMjUsIDIwNCwgMzExLDI1MzQsIDQ5NiwyNTM1LDEwNTIsMjUzNiwyNTM3LDI1MzgsMjUzOSwyNTQwLDI1NDEsMjU0MiwgMTk5LAogNzA0LCA1MDQsIDQ2OCwgNzU4LCA2NTcsMTUyOCwgMTk2LCAgNDQsIDgzOSwxMjQ2LCAyNzIsIDc1MCwyNTQzLCA3NjUsIDg2MiwyNTQ0LAoyNTQ1LDEzMjYsMjU0NiwgMTMyLCA2MTUsIDkzMywyNTQ3LCA3MzIsMjU0OCwyNTQ5LDI1NTAsMTE4OSwxNTI5LDI1NTEsIDI4MywxMjQ3LAoxMDUzLCA2MDcsIDkyOSwyNTUyLDI1NTMsMjU1NCwgOTMwLCAxODMsIDg3MiwgNjE2LDEwNDAsMTE0NywyNTU1LDExNDgsMTAyMCwgNDQxLAogMjQ5LDEwNzUsMjU1NiwyNTU3LDI1NTgsIDQ2NiwgNzQzLDI1NTksMjU2MCwyNTYxLCAgOTIsIDUxNCwgNDI2LCA0MjAsIDUyNiwyNTYyLAoyNTYzLDI1NjQsMjU2NSwyNTY2LDI1NjcsMjU2OCwgMTg1LDI1NjksMjU3MCwyNTcxLDI1NzIsIDc3NiwxNTMwLCA2NTgsMjU3MywgMzYyLAoyNTc0LCAzNjEsIDkyMiwxMDc2LCA3OTMsMjU3NSwyNTc2LDI1NzcsMjU3OCwyNTc5LDI1ODAsMTUzMSwgMjUxLDI1ODEsMjU4MiwyNTgzLAoyNTg0LDE1MzIsICA1NCwgNjEyLCAyMzcsMTMyNywyNTg1LDI1ODYsIDI3NSwgNDA4LCA2NDcsIDExMSwyNTg3LDE1MzMsMTEwNiwgNDY1LAogICAzLCA0NTgsICAgOSwgIDM4LDI1ODgsIDEwNywgMTEwLCA4OTAsIDIwOSwgIDI2LCA3MzcsIDQ5OCwyNTg5LDE1MzQsMjU5MCwgNDMxLAogMjAyLCAgODgsMTUzNSwgMzU2LCAyODcsMTEwNywgNjYwLDExNDksMjU5MSwgMzgxLDE1MzYsIDk4NiwxMTUwLCA0NDUsMTI0OCwxMTUxLAogOTc0LDI1OTIsMjU5MywgODQ2LDI1OTQsIDQ0NiwgOTUzLCAxODQsMTI0OSwxMjUwLCA3MjcsMjU5NSwgOTIzLCAxOTMsIDg4MywyNTk2LAoyNTk3LDI1OTgsIDEwMiwgMzI0LCA1MzksIDgxNywyNTk5LCA0MjEsMTA0MSwyNjAwLCA4MzIsMjYwMSwgIDk0LCAxNzUsIDE5NywgNDA2LAoyNjAyLCA0NTksMjYwMywyNjA0LDI2MDUsMjYwNiwyNjA3LCAzMzAsIDU1NSwyNjA4LDI2MDksMjYxMCwgNzA2LDExMDgsIDM4OSwyNjExLAoyNjEyLDI2MTMsMjYxNCwgMjMzLDI2MTUsIDgzMywgNTU4LCA5MzEsIDk1NCwxMjUxLDI2MTYsMjYxNywxNTM3LCA1NDYsMjYxOCwyNjE5LAoxMDA5LDI2MjAsMjYyMSwyNjIyLDE1MzgsIDY5MCwxMzI4LDI2MjMsIDk1NSwyNjI0LDE1MzksMjYyNSwyNjI2LCA3NzIsMjYyNywyNjI4LAoyNjI5LDI2MzAsMjYzMSwgOTI0LCA2NDgsIDg2MywgNjAzLDI2MzIsMjYzMywgOTM0LDE1NDAsIDg2NCwgODY1LDI2MzQsIDY0MiwxMDQyLAogNjcwLDExOTAsMjYzNSwyNjM2LDI2MzcsMjYzOCwgMTY4LDI2MzksIDY1MiwgODczLCA1NDIsMTA1NCwxNTQxLDI2NDAsMjY0MSwyNjQyLCAgIyA1MTIsIDI1NgopCgpQSwMEFAAAAAAAAAAhACYFl/jUBgAA1AYAADIAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9ldWNrcnByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5tYmNoYXJzZXRwcm9iZXIgaW1wb3J0IE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIKZnJvbSAuY29kaW5nc3RhdGVtYWNoaW5lIGltcG9ydCBDb2RpbmdTdGF0ZU1hY2hpbmUKZnJvbSAuY2hhcmRpc3RyaWJ1dGlvbiBpbXBvcnQgRVVDS1JEaXN0cmlidXRpb25BbmFseXNpcwpmcm9tIC5tYmNzc20gaW1wb3J0IEVVQ0tSX1NNX01PREVMCgoKY2xhc3MgRVVDS1JQcm9iZXIoTXVsdGlCeXRlQ2hhclNldFByb2Jlcik6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoRVVDS1JQcm9iZXIsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvZGluZ19zbSA9IENvZGluZ1N0YXRlTWFjaGluZShFVUNLUl9TTV9NT0RFTCkKICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplciA9IEVVQ0tSRGlzdHJpYnV0aW9uQW5hbHlzaXMoKQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gIkVVQy1LUiIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gIktvcmVhbiIKUEsDBBQAAAAAAAAAIQDM20nVhXsAAIV7AAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXVjdHdmcmVxLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIEVVQ1RXIGZyZXF1ZW5jeSB0YWJsZQojIENvbnZlcnRlZCBmcm9tIGJpZzUgd29yawojIGJ5IFRhaXdhbidzIE1hbmRhcmluIFByb21vdGlvbiBDb3VuY2lsCiMgPGh0dHA6I3d3dy5lZHUudHc6ODEvbWFuZHIvPgoKIyAxMjggIC0tPiAwLjQyMjYxCiMgMjU2ICAtLT4gMC41Nzg1MQojIDUxMiAgLS0+IDAuNzQ4NTEKIyAxMDI0IC0tPiAwLjg5Mzg0CiMgMjA0OCAtLT4gMC45NzU4MwojCiMgSWRlYSBEaXN0cmlidXRpb24gUmF0aW8gPSAwLjc0ODUxLygxLTAuNzQ4NTEpID0yLjk4CiMgUmFuZG9tIERpc3RyaWJ1dGlvbiBSYXRpb24gPSA1MTIvKDU0MDEtNTEyKT0wLjEwNQojCiMgVHlwaWNhbCBEaXN0cmlidXRpb24gUmF0aW8gYWJvdXQgMjUlIG9mIElkZWFsIG9uZSwgc3RpbGwgbXVjaCBoaWdoZXIgdGhhbiBSRFIKCkVVQ1RXX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPID0gMC43NQoKIyBDaGFyIHRvIEZyZXFPcmRlciB0YWJsZSAsCkVVQ1RXX1RBQkxFX1NJWkUgPSA1Mzc2CgpFVUNUV19DSEFSX1RPX0ZSRVFfT1JERVIgPSAoCiAgIDEsMTgwMCwxNTA2LCAyNTUsMTQzMSwgMTk4LCAgIDksICA4MiwgICA2LDczMTAsIDE3NywgMjAyLDM2MTUsMTI1NiwyODA4LCAxMTAsICAjIDI3NDIKMzczNSwgIDMzLDMyNDEsIDI2MSwgIDc2LCAgNDQsMjExMywgIDE2LDI5MzEsMjE4NCwxMTc2LCA2NTksMzg2OCwgIDI2LDM0MDQsMjY0MywgICMgMjc1OAoxMTk4LDM4NjksMzMxMyw0MDYwLCA0MTAsMjIxMSwgMzAyLCA1OTAsIDM2MSwxOTYzLCAgIDgsIDIwNCwgIDU4LDQyOTYsNzMxMSwxOTMxLCAgIyAyNzc0CiAgNjMsNzMxMiw3MzEzLCAzMTcsMTYxNCwgIDc1LCAyMjIsIDE1OSw0MDYxLDI0MTIsMTQ4MCw3MzE0LDM1MDAsMzA2OCwgMjI0LDI4MDksICAjIDI3OTAKMzYxNiwgICAzLCAgMTAsMzg3MCwxNDcxLCAgMjksMjc3NCwxMTM1LDI4NTIsMTkzOSwgODczLCAxMzAsMzI0MiwxMTIzLCAzMTIsNzMxNSwgICMgMjgwNgo0Mjk3LDIwNTEsIDUwNywgMjUyLCA2ODIsNzMxNiwgMTQyLDE5MTQsIDEyNCwgMjA2LDI5MzIsICAzNCwzNTAxLDMxNzMsICA2NCwgNjA0LCAgIyAyODIyCjczMTcsMjQ5NCwxOTc2LDE5NzcsIDE1NSwxOTkwLCA2NDUsIDY0MSwxNjA2LDczMTgsMzQwNSwgMzM3LCAgNzIsIDQwNiw3MzE5LCAgODAsICAjIDI4MzgKIDYzMCwgMjM4LDMxNzQsMTUwOSwgMjYzLCA5MzksMTA5MiwyNjQ0LCA3NTYsMTQ0MCwxMDk0LDM0MDYsIDQ0OSwgIDY5LDI5NjksIDU5MSwgICMgMjg1NAogMTc5LDIwOTUsIDQ3MSwgMTE1LDIwMzQsMTg0MywgIDYwLCAgNTAsMjk3MCwgMTM0LCA4MDYsMTg2OCwgNzM0LDIwMzUsMzQwNywgMTgwLCAgIyAyODcwCiA5OTUsMTYwNywgMTU2LCA1MzcsMjg5MywgNjg4LDczMjAsIDMxOSwxMzA1LCA3NzksMjE0NCwgNTE0LDIzNzQsIDI5OCw0Mjk4LCAzNTksICAjIDI4ODYKMjQ5NSwgIDkwLDI3MDcsMTMzOCwgNjYzLCAgMTEsIDkwNiwxMDk5LDI1NDUsICAyMCwyNDM2LCAxODIsIDUzMiwxNzE2LDczMjEsIDczMiwgICMgMjkwMgoxMzc2LDQwNjIsMTMxMSwxNDIwLDMxNzUsICAyNSwyMzEyLDEwNTYsIDExMywgMzk5LCAzODIsMTk0OSwgMjQyLDM0MDgsMjQ2NywgNTI5LCAgIyAyOTE4CjMyNDMsIDQ3NSwxNDQ3LDM2MTcsNzMyMiwgMTE3LCAgMjEsIDY1NiwgODEwLDEyOTcsMjI5NSwyMzI5LDM1MDIsNzMyMywgMTI2LDQwNjMsICAjIDI5MzQKIDcwNiwgNDU2LCAxNTAsIDYxMyw0Mjk5LCAgNzEsMTExOCwyMDM2LDQwNjQsIDE0NSwzMDY5LCAgODUsIDgzNSwgNDg2LDIxMTQsMTI0NiwgICMgMjk1MAoxNDI2LCA0MjgsIDcyNywxMjg1LDEwMTUsIDgwMCwgMTA2LCA2MjMsIDMwMywxMjgxLDczMjQsMjEyNywyMzU0LCAzNDcsMzczNiwgMjIxLCAgIyAyOTY2CjM1MDMsMzExMCw3MzI1LDE5NTUsMTE1Myw0MDY1LCAgODMsIDI5NiwxMTk5LDMwNzAsIDE5MiwgNjI0LCAgOTMsNzMyNiwgODIyLDE4OTcsICAjIDI5ODIKMjgxMCwzMTExLCA3OTUsMjA2NCwgOTkxLDE1NTQsMTU0MiwxNTkyLCAgMjcsICA0MywyODUzLCA4NTksIDEzOSwxNDU2LCA4NjAsNDMwMCwgICMgMjk5OAogNDM3LCA3MTIsMzg3MSwgMTY0LDIzOTIsMzExMiwgNjk1LCAyMTEsMzAxNywyMDk2LCAxOTUsMzg3MiwxNjA4LDM1MDQsMzUwNSwzNjE4LCAgIyAzMDE0CjM4NzMsIDIzNCwgODExLDI5NzEsMjA5NywzODc0LDIyMjksMTQ0MSwzNTA2LDE2MTUsMjM3NSwgNjY4LDIwNzYsMTYzOCwgMzA1LCAyMjgsICAjIDMwMzAKMTY2NCw0MzAxLCA0NjcsIDQxNSw3MzI3LCAyNjIsMjA5OCwxNTkzLCAyMzksIDEwOCwgMzAwLCAyMDAsMTAzMywgNTEyLDEyNDcsMjA3NywgICMgMzA0Ngo3MzI4LDczMjksMjE3MywzMTc2LDM2MTksMjY3MywgNTkzLCA4NDUsMTA2MiwzMjQ0LCAgODgsMTcyMywyMDM3LDM4NzUsMTk1MCwgMjEyLCAgIyAzMDYyCiAyNjYsIDE1MiwgMTQ5LCA0NjgsMTg5OCw0MDY2LDQzMDIsICA3NywgMTg3LDczMzAsMzAxOCwgIDM3LCAgIDUsMjk3Miw3MzMxLDM4NzYsICAjIDMwNzgKNzMzMiw3MzMzLCAgMzksMjUxNyw0MzAzLDI4OTQsMzE3NywyMDc4LCAgNTUsIDE0OCwgIDc0LDQzMDQsIDU0NSwgNDgzLDE0NzQsMTAyOSwgICMgMzA5NAoxNjY1LCAyMTcsMTg2OSwxNTMxLDMxMTMsMTEwNCwyNjQ1LDQwNjcsICAyNCwgMTcyLDM1MDcsIDkwMCwzODc3LDM1MDgsMzUwOSw0MzA1LCAgIyAzMTEwCiAgMzIsMTQwOCwyODExLDEzMTIsIDMyOSwgNDg3LDIzNTUsMjI0NywyNzA4LCA3ODQsMjY3NCwgICA0LDMwMTksMzMxNCwxNDI3LDE3ODgsICAjIDMxMjYKIDE4OCwgMTA5LCA0OTksNzMzNCwzNjIwLDE3MTcsMTc4OSwgODg4LDEyMTcsMzAyMCw0MzA2LDczMzUsMzUxMCw3MzM2LDMzMTUsMTUyMCwgICMgMzE0MgozNjIxLDM4NzgsIDE5NiwxMDM0LCA3NzUsNzMzNyw3MzM4LCA5MjksMTgxNSwgMjQ5LCA0MzksICAzOCw3MzM5LDEwNjMsNzM0MCwgNzk0LCAgIyAzMTU4CjM4NzksMTQzNSwyMjk2LCAgNDYsIDE3OCwzMjQ1LDIwNjUsNzM0MSwyMzc2LDczNDIsIDIxNCwxNzA5LDQzMDcsIDgwNCwgIDM1LCA3MDcsICAjIDMxNzQKIDMyNCwzNjIyLDE2MDEsMjU0NiwgMTQwLCA0NTksNDA2OCw3MzQzLDczNDQsMTM2NSwgODM5LCAyNzIsIDk3OCwyMjU3LDI1NzIsMzQwOSwgICMgMzE5MAoyMTI4LDEzNjMsMzYyMywxNDIzLCA2OTcsIDEwMCwzMDcxLCAgNDgsICA3MCwxMjMxLCA0OTUsMzExNCwyMTkzLDczNDUsMTI5NCw3MzQ2LCAgIyAzMjA2CjIwNzksIDQ2MiwgNTg2LDEwNDIsMzI0NiwgODUzLCAyNTYsIDk4OCwgMTg1LDIzNzcsMzQxMCwxNjk4LCA0MzQsMTA4NCw3MzQ3LDM0MTEsICAjIDMyMjIKIDMxNCwyNjE1LDI3NzUsNDMwOCwyMzMwLDIzMzEsIDU2OSwyMjgwLCA2MzcsMTgxNiwyNTE4LCA3NTcsMTE2MiwxODc4LDE2MTYsMzQxMiwgICMgMzIzOAogMjg3LDE1NzcsMjExNSwgNzY4LDQzMDksMTY3MSwyODU0LDM1MTEsMjUxOSwxMzIxLDM3MzcsIDkwOSwyNDEzLDczNDgsNDA2OSwgOTMzLCAgIyAzMjU0CjM3MzgsNzM0OSwyMDUyLDIzNTYsMTIyMiw0MzEwLCA3NjUsMjQxNCwxMzIyLCA3ODYsNDMxMSw3MzUwLDE5MTksMTQ2MiwxNjc3LDI4OTUsICAjIDMyNzAKMTY5OSw3MzUxLDQzMTIsMTQyNCwyNDM3LDMxMTUsMzYyNCwyNTkwLDMzMTYsMTc3NCwxOTQwLDM0MTMsMzg4MCw0MDcwLCAzMDksMTM2OSwgICMgMzI4NgoxMTMwLDI4MTIsIDM2NCwyMjMwLDE2NTMsMTI5OSwzODgxLDM1MTIsMzg4MiwzODgzLDI2NDYsIDUyNSwxMDg1LDMwMjEsIDkwMiwyMDAwLCAgIyAzMzAyCjE0NzUsIDk2NCw0MzEzLCA0MjEsMTg0NCwxNDE1LDEwNTcsMjI4MSwgOTQwLDEzNjQsMzExNiwgMzc2LDQzMTQsNDMxNSwxMzgxLCAgIDcsICAjIDMzMTgKMjUyMCwgOTgzLDIzNzgsIDMzNiwxNzEwLDI2NzUsMTg0NSwgMzIxLDM0MTQsIDU1OSwxMTMxLDMwMjIsMjc0MiwxODA4LDExMzIsMTMxMywgICMgMzMzNAogMjY1LDE0ODEsMTg1Nyw3MzUyLCAzNTIsMTIwMywyODEzLDMyNDcsIDE2NywxMDg5LCA0MjAsMjgxNCwgNzc2LCA3OTIsMTcyNCwzNTEzLCAgIyAzMzUwCjQwNzEsMjQzOCwzMjQ4LDczNTMsNDA3Miw3MzU0LCA0NDYsIDIyOSwgMzMzLDI3NDMsIDkwMSwzNzM5LDEyMDAsMTU1Nyw0MzE2LDI2NDcsICAjIDMzNjYKMTkyMCwgMzk1LDI3NDQsMjY3NiwzNzQwLDQwNzMsMTgzNSwgMTI1LCA5MTYsMzE3OCwyNjE2LDQzMTcsNzM1NSw3MzU2LDM3NDEsNzM1NywgICMgMzM4Mgo3MzU4LDczNTksNDMxOCwzMTE3LDM2MjUsMTEzMywyNTQ3LDE3NTcsMzQxNSwxNTEwLDIzMTMsMTQwOSwzNTE0LDczNjAsMjE0NSwgNDM4LCAgIyAzMzk4CjI1OTEsMjg5NiwyMzc5LDMzMTcsMTA2OCwgOTU4LDMwMjMsIDQ2MSwgMzExLDI4NTUsMjY3Nyw0MDc0LDE5MTUsMzE3OSw0MDc1LDE5NzgsICAjIDM0MTQKIDM4MywgNzUwLDI3NDUsMjYxNyw0MDc2LCAyNzQsIDUzOSwgMzg1LDEyNzgsMTQ0Miw3MzYxLDExNTQsMTk2NCwgMzg0LCA1NjEsIDIxMCwgICMgMzQzMAogIDk4LDEyOTUsMjU0OCwzNTE1LDczNjIsMTcxMSwyNDE1LDE0ODIsMzQxNiwzODg0LDI4OTcsMTI1NywgMTI5LDczNjMsMzc0MiwgNjQyLCAgIyAzNDQ2CiA1MjMsMjc3NiwyNzc3LDI2NDgsNzM2NCwgMTQxLDIyMzEsMTMzMywgIDY4LCAxNzYsIDQ0MSwgODc2LCA5MDcsNDA3NywgNjAzLDI1OTIsICAjIDM0NjIKIDcxMCwgMTcxLDM0MTcsIDQwNCwgNTQ5LCAgMTgsMzExOCwyMzkzLDE0MTAsMzYyNiwxNjY2LDczNjUsMzUxNiw0MzE5LDI4OTgsNDMyMCwgICMgMzQ3OAo3MzY2LDI5NzMsIDM2OCw3MzY3LCAxNDYsIDM2NiwgIDk5LCA4NzEsMzYyNywxNTQzLCA3NDgsIDgwNywxNTg2LDExODUsICAyMiwyMjU4LCAgIyAzNDk0CiAzNzksMzc0MywzMTgwLDczNjgsMzE4MSwgNTA1LDE5NDEsMjYxOCwxOTkxLDEzODIsMjMxNCw3MzY5LCAzODAsMjM1NywgMjE4LCA3MDIsICAjIDM1MTAKMTgxNywxMjQ4LDM0MTgsMzAyNCwzNTE3LDMzMTgsMzI0OSw3MzcwLDI5NzQsMzYyOCwgOTMwLDMyNTAsMzc0NCw3MzcxLCAgNTksNzM3MiwgICMgMzUyNgogNTg1LCA2MDEsNDA3OCwgNDk3LDM0MTksMTExMiwxMzE0LDQzMjEsMTgwMSw3MzczLDEyMjMsMTQ3MiwyMTc0LDczNzQsIDc0OSwxODM2LCAgIyAzNTQyCiA2OTAsMTg5OSwzNzQ1LDE3NzIsMzg4NSwxNDc2LCA0MjksMTA0MywxNzkwLDIyMzIsMjExNiwgOTE3LDQwNzksIDQ0NywxMDg2LDE2MjksICAjIDM1NTgKNzM3NSwgNTU2LDczNzYsNzM3NywyMDIwLDE2NTQsIDg0NCwxMDkwLCAxMDUsIDU1MCwgOTY2LDE3NTgsMjgxNSwxMDA4LDE3ODIsIDY4NiwgICMgMzU3NAoxMDk1LDczNzgsMjI4MiwgNzkzLDE2MDIsNzM3OSwzNTE4LDI1OTMsNDMyMiw0MDgwLDI5MzMsMjI5Nyw0MzIzLDM3NDYsIDk4MCwyNDk2LCAgIyAzNTkwCiA1NDQsIDM1MywgNTI3LDQzMjQsIDkwOCwyNjc4LDI4OTksNzM4MCwgMzgxLDI2MTksMTk0MiwxMzQ4LDczODEsMTM0MSwxMjUyLCA1NjAsICAjIDM2MDYKMzA3Miw3MzgyLDM0MjAsMjg1Niw3MzgzLDIwNTMsIDk3MywgODg2LDIwODAsIDE0Myw0MzI1LDczODQsNzM4NSwgMTU3LDM4ODYsIDQ5NiwgICMgMzYyMgo0MDgxLCAgNTcsIDg0MCwgNTQwLDIwMzgsNDMyNiw0MzI3LDM0MjEsMjExNywxNDQ1LCA5NzAsMjI1OSwxNzQ4LDE5NjUsMjA4MSw0MDgyLCAgIyAzNjM4CjMxMTksMTIzNCwxNzc1LDMyNTEsMjgxNiwzNjI5LCA3NzMsMTIwNiwyMTI5LDEwNjYsMjAzOSwxMzI2LDM4ODcsMTczOCwxNzI1LDQwODMsICAjIDM2NTQKIDI3OSwzMTIwLCAgNTEsMTU0NCwyNTk0LCA0MjMsMTU3OCwyMTMwLDIwNjYsIDE3Myw0MzI4LDE4NzksNzM4Niw3Mzg3LDE1ODMsIDI2NCwgICMgMzY3MAogNjEwLDM2MzAsNDMyOSwyNDM5LCAyODAsIDE1NCw3Mzg4LDczODksNzM5MCwxNzM5LCAzMzgsMTI4MiwzMDczLCA2OTMsMjg1NywxNDExLCAgIyAzNjg2CjEwNzQsMzc0NywyNDQwLDczOTEsNDMzMCw3MzkyLDczOTMsMTI0MCwgOTUyLDIzOTQsNzM5NCwyOTAwLDE1MzgsMjY3OSwgNjg1LDE0ODMsICAjIDM3MDIKNDA4NCwyNDY4LDE0MzYsIDk1Myw0MDg1LDIwNTQsNDMzMSwgNjcxLDIzOTUsICA3OSw0MDg2LDI0NDEsMzI1MiwgNjA4LCA1NjcsMjY4MCwgICMgMzcxOAozNDIyLDQwODcsNDA4OCwxNjkxLCAzOTMsMTI2MSwxNzkxLDIzOTYsNzM5NSw0MzMyLDczOTYsNzM5Nyw3Mzk4LDczOTksMTM4MywxNjcyLCAgIyAzNzM0CjM3NDgsMzE4MiwxNDY0LCA1MjIsMTExOSwgNjYxLDExNTAsIDIxNiwgNjc1LDQzMzMsMzg4OCwxNDMyLDM1MTksIDYwOSw0MzM0LDI2ODEsICAjIDM3NTAKMjM5Nyw3NDAwLDc0MDEsNzQwMiw0MDg5LDMwMjUsICAgMCw3NDAzLDI0NjksIDMxNSwgMjMxLDI0NDIsIDMwMSwzMzE5LDQzMzUsMjM4MCwgICMgMzc2Ngo3NDA0LCAyMzMsNDA5MCwzNjMxLDE4MTgsNDMzNiw0MzM3LDc0MDUsICA5NiwxNzc2LDEzMTUsMjA4Miw3NDA2LCAyNTcsNzQwNywxODA5LCAgIyAzNzgyCjM2MzIsMjcwOSwxMTM5LDE4MTksNDA5MSwyMDIxLDExMjQsMjE2MywyNzc4LDE3NzcsMjY0OSw3NDA4LDMwNzQsIDM2MywxNjU1LDMxODMsICAjIDM3OTgKNzQwOSwyOTc1LDc0MTAsNzQxMSw3NDEyLDM4ODksMTU2NywzODkwLCA3MTgsIDEwMywzMTg0LCA4NDksMTQ0MywgMzQxLDMzMjAsMjkzNCwgICMgMzgxNAoxNDg0LDc0MTMsMTcxMiwgMTI3LCAgNjcsIDMzOSw0MDkyLDIzOTgsIDY3OSwxNDEyLCA4MjEsNzQxNCw3NDE1LCA4MzQsIDczOCwgMzUxLCAgIyAzODMwCjI5NzYsMjE0NiwgODQ2LCAyMzUsMTQ5NywxODgwLCA0MTgsMTk5MiwzNzQ5LDI3MTAsIDE4NiwxMTAwLDIxNDcsMjc0NiwzNTIwLDE1NDUsICAjIDM4NDYKMTM1NSwyOTM1LDI4NTgsMTM3NywgNTgzLDM4OTEsNDA5MywyNTczLDI5NzcsNzQxNiwxMjk4LDM2MzMsMTA3OCwyNTQ5LDM2MzQsMjM1OCwgICMgMzg2MgogIDc4LDM3NTAsMzc1MSwgMjY3LDEyODksMjA5OSwyMDAxLDE1OTQsNDA5NCwgMzQ4LCAzNjksMTI3NCwyMTk0LDIxNzUsMTgzNyw0MzM4LCAgIyAzODc4CjE4MjAsMjgxNywzNjM1LDI3NDcsMjI4MywyMDAyLDQzMzksMjkzNiwyNzQ4LCAxNDQsMzMyMSwgODgyLDQzNDAsMzg5MiwyNzQ5LDM0MjMsICAjIDM4OTQKNDM0MSwyOTAxLDc0MTcsNDA5NSwxNzI2LCAzMjAsNzQxOCwzODkzLDMwMjYsIDc4OCwyOTc4LDc0MTksMjgxOCwxNzczLDEzMjcsMjg1OSwgICMgMzkxMAozODk0LDI4MTksNzQyMCwxMzA2LDQzNDIsMjAwMywxNzAwLDM3NTIsMzUyMSwyMzU5LDI2NTAsIDc4NywyMDIyLCA1MDYsIDgyNCwzNjM2LCAgIyAzOTI2CiA1MzQsIDMyMyw0MzQzLDEwNDQsMzMyMiwyMDIzLDE5MDAsIDk0NiwzNDI0LDc0MjEsMTc3OCwxNTAwLDE2NzgsNzQyMiwxODgxLDQzNDQsICAjIDM5NDIKIDE2NSwgMjQzLDQzNDUsMzYzNywyNTIxLCAxMjMsIDY4Myw0MDk2LCA3NjQsNDM0NiwgIDM2LDM4OTUsMTc5MiwgNTg5LDI5MDIsIDgxNiwgICMgMzk1OAogNjI2LDE2NjcsMzAyNywyMjMzLDE2MzksMTU1NSwxNjIyLDM3NTMsMzg5Niw3NDIzLDM4OTcsMjg2MCwxMzcwLDEyMjgsMTkzMiwgODkxLCAgIyAzOTc0CjIwODMsMjkwMywgMzA0LDQwOTcsNzQyNCwgMjkyLDI5NzksMjcxMSwzNTIyLCA2OTEsMjEwMCw0MDk4LDExMTUsNDM0NywgMTE4LCA2NjIsICAjIDM5OTAKNzQyNSwgNjExLDExNTYsIDg1NCwyMzgxLDEzMTYsMjg2MSwgICAyLCAzODYsIDUxNSwyOTA0LDc0MjYsNzQyNywzMjUzLCA4NjgsMjIzNCwgICMgNDAwNgoxNDg2LCA4NTUsMjY1MSwgNzg1LDIyMTIsMzAyOCw3NDI4LDEwNDAsMzE4NSwzNTIzLDc0MjksMzEyMSwgNDQ4LDc0MzAsMTUyNSw3NDMxLCAgIyA0MDIyCjIxNjQsNDM0OCw3NDMyLDM3NTQsNzQzMyw0MDk5LDI4MjAsMzUyNCwzMTIyLCA1MDMsIDgxOCwzODk4LDMxMjMsMTU2OCwgODE0LCA2NzYsICAjIDQwMzgKMTQ0NCwgMzA2LDE3NDksNzQzNCwzNzU1LDE0MTYsMTAzMCwgMTk3LDE0MjgsIDgwNSwyODIxLDE1MDEsNDM0OSw3NDM1LDc0MzYsNzQzNywgICMgNDA1NAoxOTkzLDc0MzgsNDM1MCw3NDM5LDc0NDAsMjE5NSwgIDEzLDI3NzksMzYzOCwyOTgwLDMxMjQsMTIyOSwxOTE2LDc0NDEsMzc1NiwyMTMxLCAgIyA0MDcwCjc0NDIsNDEwMCw0MzUxLDIzOTksMzUyNSw3NDQzLDIyMTMsMTUxMSwxNzI3LDExMjAsNzQ0NCw3NDQ1LCA2NDYsMzc1NywyNDQzLCAzMDcsICAjIDQwODYKNzQ0Niw3NDQ3LDE1OTUsMzE4Niw3NDQ4LDc0NDksNzQ1MCwzNjM5LDExMTMsMTM1NiwzODk5LDE0NjUsMjUyMiwyNTIzLDc0NTEsIDUxOSwgICMgNDEwMgo3NDUyLCAxMjgsMjEzMiwgIDkyLDIyODQsMTk3OSw3NDUzLDM5MDAsMTUxMiwgMzQyLDMxMjUsMjE5Niw3NDU0LDI3ODAsMjIxNCwxOTgwLCAgIyA0MTE4CjMzMjMsNzQ1NSwgMjkwLDE2NTYsMTMxNywgNzg5LCA4MjcsMjM2MCw3NDU2LDM3NTgsNDM1MiwgNTYyLCA1ODEsMzkwMSw3NDU3LCA0MDEsICAjIDQxMzQKNDM1MywyMjQ4LCAgOTQsNDM1NCwxMzk5LDI3ODEsNzQ1OCwxNDYzLDIwMjQsNDM1NSwzMTg3LDE5NDMsNzQ1OSwgODI4LDExMDUsNDEwMSwgICMgNDE1MAoxMjYyLDEzOTQsNzQ2MCw0MTAyLCA2MDUsNDM1Niw3NDYxLDE3ODMsMjg2Miw3NDYyLDI4MjIsIDgxOSwyMTAxLCA1NzgsMjE5NywyOTM3LCAgIyA0MTY2Cjc0NjMsMTUwMiwgNDM2LDMyNTQsNDEwMywzMjU1LDI4MjMsMzkwMiwyOTA1LDM0MjUsMzQyNiw3NDY0LDI3MTIsMjMxNSw3NDY1LDc0NjYsICAjIDQxODIKMjMzMiwyMDY3LCAgMjMsNDM1NywgMTkzLCA4MjYsMzc1OSwyMTAyLCA2OTksMTYzMCw0MTA0LDMwNzUsIDM5MCwxNzkzLDEwNjQsMzUyNiwgICMgNDE5OAo3NDY3LDE1NzksMzA3NiwzMDc3LDE0MDAsNzQ2OCw0MTA1LDE4MzgsMTY0MCwyODYzLDc0NjksNDM1OCw0MzU5LCAxMzcsNDEwNiwgNTk4LCAgIyA0MjE0CjMwNzgsMTk2NiwgNzgwLCAxMDQsIDk3NCwyOTM4LDc0NzAsIDI3OCwgODk5LCAyNTMsIDQwMiwgNTcyLCA1MDQsIDQ5MywxMzM5LDc0NzEsICAjIDQyMzAKMzkwMywxMjc1LDQzNjAsMjU3NCwyNTUwLDc0NzIsMzY0MCwzMDI5LDMwNzksMjI0OSwgNTY1LDEzMzQsMjcxMywgODYzLCAgNDEsNzQ3MywgICMgNDI0Ngo3NDc0LDQzNjEsNzQ3NSwxNjU3LDIzMzMsICAxOSwgNDYzLDI3NTAsNDEwNywgNjA2LDc0NzYsMjk4MSwzMjU2LDEwODcsMjA4NCwxMzIzLCAgIyA0MjYyCjI2NTIsMjk4Miw3NDc3LDE2MzEsMTYyMywxNzUwLDQxMDgsMjY4Miw3NDc4LDI4NjQsIDc5MSwyNzE0LDI2NTMsMjMzNCwgMjMyLDI0MTYsICAjIDQyNzgKNzQ3OSwyOTgzLDE0OTgsNzQ4MCwyNjU0LDI2MjAsIDc1NSwxMzY2LDM2NDEsMzI1NywzMTI2LDIwMjUsMTYwOSwgMTE5LDE5MTcsMzQyNywgICMgNDI5NAogODYyLDEwMjYsNDEwOSw3NDgxLDM5MDQsMzc2MCw0MzYyLDM5MDUsNDM2MywyMjYwLDE5NTEsMjQ3MCw3NDgyLDExMjUsIDgxNyw0MTEwLCAgIyA0MzEwCjQxMTEsMzkwNiwxNTEzLDE3NjYsMjA0MCwxNDg3LDQxMTIsMzAzMCwzMjU4LDI4MjQsMzc2MSwzMTI3LDc0ODMsNzQ4NCwxNTA3LDc0ODUsICAjIDQzMjYKMjY4MywgNzMzLCAgNDAsMTYzMiwxMTA2LDI4NjUsIDM0NSw0MTEzLCA4NDEsMjUyNCwgMjMwLDQzNjQsMjk4NCwxODQ2LDMyNTksMzQyOCwgICMgNDM0Mgo3NDg2LDEyNjMsIDk4NiwzNDI5LDc0ODcsIDczNSwgODc5LCAyNTQsMTEzNywgODU3LCA2MjIsMTMwMCwxMTgwLDEzODgsMTU2MiwzOTA3LCAgIyA0MzU4CjM5MDgsMjkzOSwgOTY3LDI3NTEsMjY1NSwxMzQ5LCA1OTIsMjEzMywxNjkyLDMzMjQsMjk4NSwxOTk0LDQxMTQsMTY3OSwzOTA5LDE5MDEsICAjIDQzNzQKMjE4NSw3NDg4LCA3MzksMzY0MiwyNzE1LDEyOTYsMTI5MCw3NDg5LDQxMTUsMjE5OCwyMTk5LDE5MjEsMTU2MywyNTk1LDI1NTEsMTg3MCwgICMgNDM5MAoyNzUyLDI5ODYsNzQ5MCwgNDM1LDc0OTEsIDM0MywxMTA4LCA1OTYsICAxNywxNzUxLDQzNjUsMjIzNSwzNDMwLDM2NDMsNzQ5Miw0MzY2LCAgIyA0NDA2CiAyOTQsMzUyNywyOTQwLDE2OTMsIDQ3NywgOTc5LCAyODEsMjA0MSwzNTI4LCA2NDMsMjA0MiwzNjQ0LDI2MjEsMjc4MiwyMjYxLDEwMzEsICAjIDQ0MjIKMjMzNSwyMTM0LDIyOTgsMzUyOSw0MzY3LCAzNjcsMTI0OSwyNTUyLDc0OTMsMzUzMCw3NDk0LDQzNjgsMTI4MywzMzI1LDIwMDQsIDI0MCwgICMgNDQzOAoxNzYyLDMzMjYsNDM2OSw0MzcwLCA4MzYsMTA2OSwzMTI4LCA0NzQsNzQ5NSwyMTQ4LDI1MjUsIDI2OCwzNTMxLDc0OTYsMzE4OCwxNTIxLCAgIyA0NDU0CjEyODQsNzQ5NywxNjU4LDE1NDYsNDExNiw3NDk4LDM1MzIsMzUzMyw3NDk5LDQxMTcsMzMyNywyNjg0LDE2ODUsNDExOCwgOTYxLDE2NzMsICAjIDQ0NzAKMjYyMiwgMTkwLDIwMDUsMjIwMCwzNzYyLDQzNzEsNDM3Miw3NTAwLCA1NzAsMjQ5NywzNjQ1LDE0OTAsNzUwMSw0MzczLDI2MjMsMzI2MCwgICMgNDQ4NgoxOTU2LDQzNzQsIDU4NCwxNTE0LCAzOTYsMTA0NSwxOTQ0LDc1MDIsNDM3NSwxOTY3LDI0NDQsNzUwMyw3NTA0LDQzNzYsMzkxMCwgNjE5LCAgIyA0NTAyCjc1MDUsMzEyOSwzMjYxLCAyMTUsMjAwNiwyNzgzLDI1NTMsMzE4OSw0Mzc3LDMxOTAsNDM3OCwgNzYzLDQxMTksMzc2Myw0Mzc5LDc1MDYsICAjIDQ1MTgKNzUwNywxOTU3LDE3NjcsMjk0MSwzMzI4LDM2NDYsMTE3NCwgNDUyLDE0NzcsNDM4MCwzMzI5LDMxMzAsNzUwOCwyODI1LDEyNTMsMjM4MiwgICMgNDUzNAoyMTg2LDEwOTEsMjI4NSw0MTIwLCA0OTIsNzUwOSwgNjM4LDExNjksMTgyNCwyMTM1LDE3NTIsMzkxMSwgNjQ4LCA5MjYsMTAyMSwxMzI0LCAgIyA0NTUwCjQzODEsIDUyMCw0MzgyLCA5OTcsIDg0NywxMDA3LCA4OTIsNDM4MywzNzY0LDIyNjIsMTg3MSwzNjQ3LDc1MTAsMjQwMCwxNzg0LDQzODQsICAjIDQ1NjYKMTk1MiwyOTQyLDMwODAsMzE5MSwxNzI4LDQxMjEsMjA0MywzNjQ4LDQzODUsMjAwNywxNzAxLDMxMzEsMTU1MSwgIDMwLDIyNjMsNDEyMiwgICMgNDU4Mgo3NTExLDIwMjYsNDM4NiwzNTM0LDc1MTIsIDUwMSw3NTEzLDQxMjMsIDU5NCwzNDMxLDIxNjUsMTgyMSwzNTM1LDM0MzIsMzUzNiwzMTkyLCAgIyA0NTk4CiA4MjksMjgyNiw0MTI0LDc1MTQsMTY4MCwzMTMyLDEyMjUsNDEyNSw3NTE1LDMyNjIsNDM4Nyw0MTI2LDMxMzMsMjMzNiw3NTE2LDQzODgsICAjIDQ2MTQKNDEyNyw3NTE3LDM5MTIsMzkxMyw3NTE4LDE4NDcsMjM4MywyNTk2LDMzMzAsNzUxOSw0Mzg5LCAzNzQsMzkxNCwgNjUyLDQxMjgsNDEyOSwgICMgNDYzMAogMzc1LDExNDAsIDc5OCw3NTIwLDc1MjEsNzUyMiwyMzYxLDQzOTAsMjI2NCwgNTQ2LDE2NTksIDEzOCwzMDMxLDI0NDUsNDM5MSw3NTIzLCAgIyA0NjQ2CjIyNTAsIDYxMiwxODQ4LCA5MTAsIDc5NiwzNzY1LDE3NDAsMTM3MSwgODI1LDM3NjYsMzc2Nyw3NTI0LDI5MDYsMjU1NCw3NTI1LCA2OTIsICAjIDQ2NjIKIDQ0NCwzMDMyLDI2MjQsIDgwMSw0MzkyLDQxMzAsNzUyNiwxNDkxLCAyNDQsMTA1MywzMDMzLDQxMzEsNDEzMiwgMzQwLDc1MjcsMzkxNSwgICMgNDY3OAoxMDQxLDI5ODcsIDI5MywxMTY4LCAgODcsMTM1Nyw3NTI4LDE1MzksIDk1OSw3NTI5LDIyMzYsIDcyMSwgNjk0LDQxMzMsMzc2OCwgMjE5LCAgIyA0Njk0CjE0NzgsIDY0NCwxNDE3LDMzMzEsMjY1NiwxNDEzLDE0MDEsMTMzNSwxMzg5LDM5MTYsNzUzMCw3NTMxLDI5ODgsMjM2MiwzMTM0LDE4MjUsICAjIDQ3MTAKIDczMCwxNTE1LCAxODQsMjgyNywgIDY2LDQzOTMsNzUzMiwxNjYwLDI5NDMsIDI0NiwzMzMyLCAzNzgsMTQ1NywgMjI2LDM0MzMsIDk3NSwgICMgNDcyNgozOTE3LDI5NDQsMTI2NCwzNTM3LCA2NzQsIDY5Niw3NTMzLCAxNjMsNzUzNCwxMTQxLDI0MTcsMjE2NiwgNzEzLDM1MzgsMzMzMyw0Mzk0LCAgIyA0NzQyCjM5MTgsNzUzNSw3NTM2LDExODYsICAxNSw3NTM3LDEwNzksMTA3MCw3NTM4LDE1MjIsMzE5MywzNTM5LCAyNzYsMTA1MCwyNzE2LCA3NTgsICAjIDQ3NTgKMTEyNiwgNjUzLDI5NDUsMzI2Myw3NTM5LDIzMzcsIDg4OSwzNTQwLDM5MTksMzA4MSwyOTg5LCA5MDMsMTI1MCw0Mzk1LDM5MjAsMzQzNCwgICMgNDc3NAozNTQxLDEzNDIsMTY4MSwxNzE4LCA3NjYsMzI2NCwgMjg2LCAgODksMjk0NiwzNjQ5LDc1NDAsMTcxMyw3NTQxLDI1OTcsMzMzNCwyOTkwLCAgIyA0NzkwCjc1NDIsMjk0NywyMjE1LDMxOTQsMjg2Niw3NTQzLDQzOTYsMjQ5OCwyNTI2LCAxODEsIDM4NywxMDc1LDM5MjEsIDczMSwyMTg3LDMzMzUsICAjIDQ4MDYKNzU0NCwzMjY1LCAzMTAsIDMxMywzNDM1LDIyOTksIDc3MCw0MTM0LCAgNTQsMzAzNCwgMTg5LDQzOTcsMzA4MiwzNzY5LDM5MjIsNzU0NSwgICMgNDgyMgoxMjMwLDE2MTcsMTg0OSwgMzU1LDM1NDIsNDEzNSw0Mzk4LDMzMzYsIDExMSw0MTM2LDM2NTAsMTM1MCwzMTM1LDM0MzYsMzAzNSw0MTM3LCAgIyA0ODM4CjIxNDksMzI2NiwzNTQzLDc1NDYsMjc4NCwzOTIzLDM5MjQsMjk5MSwgNzIyLDIwMDgsNzU0NywxMDcxLCAyNDcsMTIwNywyMzM4LDI0NzEsICAjIDQ4NTQKMTM3OCw0Mzk5LDIwMDksIDg2NCwxNDM3LDEyMTQsNDQwMCwgMzczLDM3NzAsMTE0MiwyMjE2LCA2NjcsNDQwMSwgNDQyLDI3NTMsMjU1NSwgICMgNDg3MAozNzcxLDM5MjUsMTk2OCw0MTM4LDMyNjcsMTgzOSwgODM3LCAxNzAsMTEwNywgOTM0LDEzMzYsMTg4Miw3NTQ4LDc1NDksMjExOCw0MTM5LCAgIyA0ODg2CjI4MjgsIDc0MywxNTY5LDc1NTAsNDQwMiw0MTQwLCA1ODIsMjM4NCwxNDE4LDM0MzcsNzU1MSwxODAyLDc1NTIsIDM1NywxMzk1LDE3MjksICAjIDQ5MDIKMzY1MSwzMjY4LDI0MTgsMTU2NCwyMjM3LDc1NTMsMzA4MywzNzcyLDE2MzMsNDQwMywxMTE0LDIwODUsNDE0MSwxNTMyLDc1NTQsIDQ4MiwgICMgNDkxOAoyNDQ2LDQ0MDQsNzU1NSw3NTU2LDE0OTIsIDgzMywxNDY2LDc1NTcsMjcxNywzNTQ0LDE2NDEsMjgyOSw3NTU4LDE1MjYsMTI3MiwzNjUyLCAgIyA0OTM0CjQxNDIsMTY4NiwxNzk0LCA0MTYsMjU1NiwxOTAyLDE5NTMsMTgwMyw3NTU5LDM3NzMsMjc4NSwzNzc0LDExNTksMjMxNiw3NTYwLDI4NjcsICAjIDQ5NTAKNDQwNSwxNjEwLDE1ODQsMzAzNiwyNDE5LDI3NTQsIDQ0MywzMjY5LDExNjMsMzEzNiw3NTYxLDc1NjIsMzkyNiw3NTYzLDQxNDMsMjQ5OSwgICMgNDk2NgozMDM3LDQ0MDYsMzkyNywzMTM3LDIxMDMsMTY0NywzNTQ1LDIwMTAsMTg3Miw0MTQ0LDc1NjQsNDE0NSwgNDMxLDM0MzgsNzU2NSwgMjUwLCAgIyA0OTgyCiAgOTcsICA4MSw0MTQ2LDc1NjYsMTY0OCwxODUwLDE1NTgsIDE2MCwgODQ4LDc1NjcsIDg2NiwgNzQwLDE2OTQsNzU2OCwyMjAxLDI4MzAsICAjIDQ5OTgKMzE5NSw0MTQ3LDQ0MDcsMzY1MywxNjg3LCA5NTAsMjQ3MiwgNDI2LCA0NjksMzE5NiwzNjU0LDM2NTUsMzkyOCw3NTY5LDc1NzAsMTE4OCwgICMgNTAxNAogNDI0LDE5OTUsIDg2MSwzNTQ2LDQxNDgsMzc3NSwyMjAyLDI2ODUsIDE2OCwxMjM1LDM1NDcsNDE0OSw3NTcxLDIwODYsMTY3NCw0NDA4LCAgIyA1MDMwCjMzMzcsMzI3MCwgMjIwLDI1NTcsMTAwOSw3NTcyLDM3NzYsIDY3MCwyOTkyLCAzMzIsMTIwOCwgNzE3LDc1NzMsNzU3NCwzNTQ4LDI0NDcsICAjIDUwNDYKMzkyOSwzMzM4LDc1NzUsIDUxMyw3NTc2LDEyMDksMjg2OCwzMzM5LDMxMzgsNDQwOSwxMDgwLDc1NzcsNzU3OCw3NTc5LDc1ODAsMjUyNywgICMgNTA2MgozNjU2LDM1NDksIDgxNSwxNTg3LDM5MzAsMzkzMSw3NTgxLDM1NTAsMzQzOSwzNzc3LDEyNTQsNDQxMCwxMzI4LDMwMzgsMTM5MCwzOTMyLCAgIyA1MDc4CjE3NDEsMzkzMywzNzc4LDM5MzQsNzU4MiwgMjM2LDM3NzksMjQ0OCwzMjcxLDc1ODMsNzU4NCwzNjU3LDM3ODAsMTI3MywzNzgxLDQ0MTEsICAjIDUwOTQKNzU4NSwgMzA4LDc1ODYsNDQxMiwgMjQ1LDQ0MTMsMTg1MSwyNDczLDEzMDcsMjU3NSwgNDMwLCA3MTUsMjEzNiwyNDQ5LDc1ODcsIDI3MCwgICMgNTExMAogMTk5LDI4NjksMzkzNSw3NTg4LDM1NTEsMjcxOCwxNzUzLCA3NjEsMTc1NCwgNzI1LDE2NjEsMTg0MCw0NDE0LDM0NDAsMzY1OCw3NTg5LCAgIyA1MTI2Cjc1OTAsIDU4NywgIDE0LDMyNzIsIDIyNywyNTk4LCAzMjYsIDQ4MCwyMjY1LCA5NDMsMjc1NSwzNTUyLCAyOTEsIDY1MCwxODgzLDc1OTEsICAjIDUxNDIKMTcwMiwxMjI2LCAxMDIsMTU0NywgIDYyLDM0NDEsIDkwNCw0NDE1LDM0NDIsMTE2NCw0MTUwLDc1OTIsNzU5MywxMjI0LDE1NDgsMjc1NiwgICMgNTE1OAogMzkxLCA0OTgsMTQ5Myw3NTk0LDEzODYsMTQxOSw3NTk1LDIwNTUsMTE3Nyw0NDE2LCA4MTMsIDg4MCwxMDgxLDIzNjMsIDU2NiwxMTQ1LCAgIyA1MTc0CjQ0MTcsMjI4NiwxMDAxLDEwMzUsMjU1OCwyNTk5LDIyMzgsIDM5NCwxMjg2LDc1OTYsNzU5NywyMDY4LDc1OTgsICA4NiwxNDk0LDE3MzAsICAjIDUxOTAKMzkzNiwgNDkxLDE1ODgsIDc0NSwgODk3LDI5NDgsIDg0MywzMzQwLDM5MzcsMjc1NywyODcwLDMyNzMsMTc2OCwgOTk4LDIyMTcsMjA2OSwgICMgNTIwNgogMzk3LDE4MjYsMTE5NSwxOTY5LDM2NTksMjk5MywzMzQxLCAyODQsNzU5OSwzNzgyLDI1MDAsMjEzNywyMTE5LDE5MDMsNzYwMCwzOTM4LCAgIyA1MjIyCjIxNTAsMzkzOSw0MTUxLDEwMzYsMzQ0MywxOTA0LCAxMTQsMjU1OSw0MTUyLCAyMDksMTUyNyw3NjAxLDc2MDIsMjk0OSwyODMxLDI2MjUsICAjIDUyMzgKMjM4NSwyNzE5LDMxMzksIDgxMiwyNTYwLDc2MDMsMzI3NCw3NjA0LDE1NTksIDczNywxODg0LDM2NjAsMTIxMCwgODg1LCAgMjgsMjY4NiwgICMgNTI1NAozNTUzLDM3ODMsNzYwNSw0MTUzLDEwMDQsMTc3OSw0NDE4LDc2MDYsIDM0NiwxOTgxLDIyMTgsMjY4Nyw0NDE5LDM3ODQsMTc0MiwgNzk3LCAgIyA1MjcwCjE2NDIsMzk0MCwxOTMzLDEwNzIsMTM4NCwyMTUxLCA4OTYsMzk0MSwzMjc1LDM2NjEsMzE5NywyODcxLDM1NTQsNzYwNywyNTYxLDE5NTgsICAjIDUyODYKNDQyMCwyNDUwLDE3ODUsNzYwOCw3NjA5LDc2MTAsMzk0Miw0MTU0LDEwMDUsMTMwOCwzNjYyLDQxNTUsMjcyMCw0NDIxLDQ0MjIsMTUyOCwgICMgNTMwMgoyNjAwLCAxNjEsMTE3OCw0MTU2LDE5ODIsIDk4Nyw0NDIzLDExMDEsNDE1NywgNjMxLDM5NDMsMTE1NywzMTk4LDI0MjAsMTM0MywxMjQxLCAgIyA1MzE4CjEwMTYsMjIzOSwyNTYyLCAzNzIsIDg3NywyMzM5LDI1MDEsMTE2MCwgNTU1LDE5MzQsIDkxMSwzOTQ0LDc2MTEsIDQ2NiwxMTcwLCAxNjksICAjIDUzMzQKMTA1MSwyOTA3LDI2ODgsMzY2MywyNDc0LDI5OTQsMTE4MiwyMDExLDI1NjMsMTI1MSwyNjI2LDc2MTIsIDk5MiwyMzQwLDM0NDQsMTU0MCwgICMgNTM1MAoyNzIxLDEyMDEsMjA3MCwyNDAxLDE5OTYsMjQ3NSw3NjEzLDQ0MjQsIDUyOCwxOTIyLDIxODgsMTUwMywxODczLDE1NzAsMjM2NCwzMzQyLCAgIyA1MzY2CjMyNzYsNzYxNCwgNTU3LDEwNzMsNzYxNSwxODI3LDM0NDUsMjA4NywyMjY2LDMxNDAsMzAzOSwzMDg0LCA3NjcsMzA4NSwyNzg2LDQ0MjUsICAjIDUzODIKMTAwNiw0MTU4LDQ0MjYsMjM0MSwxMjY3LDIxNzYsMzY2NCwzMTk5LCA3NzgsMzk0NSwzMjAwLDI3MjIsMTU5NywyNjU3LDc2MTYsNDQyNywgICMgNTM5OAo3NjE3LDM0NDYsNzYxOCw3NjE5LDc2MjAsMzI3NywyNjg5LDE0MzMsMzI3OCwgMTMxLCAgOTUsMTUwNCwzOTQ2LCA3MjMsNDE1OSwzMTQxLCAgIyA1NDE0CjE4NDEsMzU1NSwyNzU4LDIxODksMzk0NywyMDI3LDIxMDQsMzY2NSw3NjIxLDI5OTUsMzk0OCwxMjE4LDc2MjIsMzM0MywzMjAxLDM5NDksICAjIDU0MzAKNDE2MCwyNTc2LCAyNDgsMTYzNCwzNzg1LCA5MTIsNzYyMywyODMyLDM2NjYsMzA0MCwzNzg2LCA2NTQsICA1Myw3NjI0LDI5OTYsNzYyNSwgICMgNTQ0NgoxNjg4LDQ0MjgsIDc3NywzNDQ3LDEwMzIsMzk1MCwxNDI1LDc2MjYsIDE5MSwgODIwLDIxMjAsMjgzMywgOTcxLDQ0MjksIDkzMSwzMjAyLCAgIyA1NDYyCiAxMzUsIDY2NCwgNzgzLDM3ODcsMTk5NywgNzcyLDI5MDgsMTkzNSwzOTUxLDM3ODgsNDQzMCwyOTA5LDMyMDMsIDI4MiwyNzIzLCA2NDAsICAjIDU0NzgKMTM3MiwzNDQ4LDExMjcsIDkyMiwgMzI1LDMzNDQsNzYyNyw3NjI4LCA3MTEsMjA0NCw3NjI5LDc2MzAsMzk1MiwyMjE5LDI3ODcsMTkzNiwgICMgNTQ5NAozOTUzLDMzNDUsMjIyMCwyMjUxLDM3ODksMjMwMCw3NjMxLDQ0MzEsMzc5MCwxMjU4LDMyNzksMzk1NCwzMjA0LDIxMzgsMjk1MCwzOTU1LCAgIyA1NTEwCjM5NTYsNzYzMiwyMjIxLCAyNTgsMzIwNSw0NDMyLCAxMDEsMTIyNyw3NjMzLDMyODAsMTc1NSw3NjM0LDEzOTEsMzI4MSw3NjM1LDI5MTAsICAjIDU1MjYKMjA1NiwgODkzLDc2MzYsNzYzNyw3NjM4LDE0MDIsNDE2MSwyMzQyLDc2MzksNzY0MCwzMjA2LDM1NTYsNzY0MSw3NjQyLCA4NzgsMTMyNSwgICMgNTU0MgoxNzgwLDI3ODgsNDQzMywgMjU5LDEzODUsMjU3NywgNzQ0LDExODMsMjI2Nyw0NDM0LDc2NDMsMzk1NywyNTAyLDc2NDQsIDY4NCwxMDI0LCAgIyA1NTU4CjQxNjIsNzY0NSwgNDcyLDM1NTcsMzQ0OSwxMTY1LDMyODIsMzk1OCwzOTU5LCAzMjIsMjE1MiwgODgxLCA0NTUsMTY5NSwxMTUyLDEzNDAsICAjIDU1NzQKIDY2MCwgNTU0LDIxNTMsNDQzNSwxMDU4LDQ0MzYsNDE2MywgODMwLDEwNjUsMzM0NiwzOTYwLDQ0MzcsMTkyMyw3NjQ2LDE3MDMsMTkxOCwgICMgNTU5MAo3NjQ3LCA5MzIsMjI2OCwgMTIyLDc2NDgsNDQzOCwgOTQ3LCA2NzcsNzY0OSwzNzkxLDI2MjcsIDI5NywxOTA1LDE5MjQsMjI2OSw0NDM5LCAgIyA1NjA2CjIzMTcsMzI4Myw3NjUwLDc2NTEsNDE2NCw3NjUyLDQxNjUsICA4NCw0MTY2LCAxMTIsIDk4OSw3NjUzLCA1NDcsMTA1OSwzOTYxLCA3MDEsICAjIDU2MjIKMzU1OCwxMDE5LDc2NTQsNDE2Nyw3NjU1LDM0NTAsIDk0MiwgNjM5LCA0NTcsMjMwMSwyNDUxLCA5OTMsMjk1MSwgNDA3LCA4NTEsIDQ5NCwgICMgNTYzOAo0NDQwLDMzNDcsIDkyNyw3NjU2LDEyMzcsNzY1NywyNDIxLDMzNDgsIDU3Myw0MTY4LCA2ODAsIDkyMSwyOTExLDEyNzksMTg3NCwgMjg1LCAgIyA1NjU0CiA3OTAsMTQ0OCwxOTgzLCA3MTksMjE2Nyw3NjU4LDc2NTksNDQ0MSwzOTYyLDM5NjMsMTY0OSw3NjYwLDE1NDEsIDU2Myw3NjYxLDEwNzcsICAjIDU2NzAKNzY2MiwzMzQ5LDMwNDEsMzQ1MSwgNTExLDI5OTcsMzk2NCwzOTY1LDM2NjcsMzk2NiwxMjY4LDI1NjQsMzM1MCwzMjA3LDQ0NDIsNDQ0MywgICMgNTY4Ngo3NjYzLCA1MzUsMTA0OCwxMjc2LDExODksMjkxMiwyMDI4LDMxNDIsMTQzOCwxMzczLDI4MzQsMjk1MiwxMTM0LDIwMTIsNzY2NCw0MTY5LCAgIyA1NzAyCjEyMzgsMjU3OCwzMDg2LDEyNTksNzY2NSwgNzAwLDc2NjYsMjk1MywzMTQzLDM2NjgsNDE3MCw3NjY3LDQxNzEsMTE0NiwxODc1LDE5MDYsICAjIDU3MTgKNDQ0NCwyNjAxLDM5NjcsIDc4MSwyNDIyLCAxMzIsMTU4OSwgMjAzLCAxNDcsIDI3MywyNzg5LDI0MDIsIDg5OCwxNzg2LDIxNTQsMzk2OCwgICMgNTczNAozOTY5LDc2NjgsMzc5MiwyNzkwLDc2NjksNzY3MCw0NDQ1LDQ0NDYsNzY3MSwzMjA4LDc2NzIsMTYzNSwzNzkzLCA5NjUsNzY3MywxODA0LCAgIyA1NzUwCjI2OTAsMTUxNiwzNTU5LDExMjEsMTA4MiwxMzI5LDMyODQsMzk3MCwxNDQ5LDM3OTQsICA2NSwxMTI4LDI4MzUsMjkxMywyNzU5LDE1OTAsICAjIDU3NjYKMzc5NSw3Njc0LDc2NzUsICAxMiwyNjU4LCAgNDUsIDk3NiwyNTc5LDMxNDQsNDQ0NywgNTE3LDI1MjgsMTAxMywxMDM3LDMyMDksNzY3NiwgICMgNTc4MgozNzk2LDI4MzYsNzY3NywzNzk3LDc2NzgsMzQ1Miw3Njc5LDI2MDIsIDYxNCwxOTk4LDIzMTgsMzc5OCwzMDg3LDI3MjQsMjYyOCw3NjgwLCAgIyA1Nzk4CjI1ODAsNDE3MiwgNTk5LDEyNjksNzY4MSwxODEwLDM2NjksNzY4MiwyNjkxLDMwODgsIDc1OSwxMDYwLCA0ODksMTgwNSwzMzUxLDMyODUsICAjIDU4MTQKMTM1OCw3NjgzLDc2ODQsMjM4NiwxMzg3LDEyMTUsMjYyOSwyMjUyLCA0OTAsNzY4NSw3Njg2LDQxNzMsMTc1OSwyMzg3LDIzNDMsNzY4NywgICMgNTgzMAo0NDQ4LDM3OTksMTkwNywzOTcxLDI2MzAsMTgwNiwzMjEwLDQ0NDksMzQ1MywzMjg2LDI3NjAsMjM0NCwgODc0LDc2ODgsNzY4OSwzNDU0LCAgIyA1ODQ2CjM2NzAsMTg1OCwgIDkxLDI5MTQsMzY3MSwzMDQyLDM4MDAsNDQ1MCw3NjkwLDMxNDUsMzk3MiwyNjU5LDc2OTEsMzQ1NSwxMjAyLDE0MDMsICAjIDU4NjIKMzgwMSwyOTU0LDI1MjksMTUxNywyNTAzLDQ0NTEsMzQ1NiwyNTA0LDc2OTIsNDQ1Miw3NjkzLDI2OTIsMTg4NSwxNDk1LDE3MzEsMzk3MywgICMgNTg3OAoyMzY1LDQ0NTMsNzY5NCwyMDI5LDc2OTUsNzY5NiwzOTc0LDI2OTMsMTIxNiwgMjM3LDI1ODEsNDE3NCwyMzE5LDM5NzUsMzgwMiw0NDU0LCAgIyA1ODk0CjQ0NTUsMjY5NCwzNTYwLDM0NTcsIDQ0NSw0NDU2LDc2OTcsNzY5OCw3Njk5LDc3MDAsMjc2MSwgIDYxLDM5NzYsMzY3MiwxODIyLDM5NzcsICAjIDU5MTAKNzcwMSwgNjg3LDIwNDUsIDkzNSwgOTI1LCA0MDUsMjY2MCwgNzAzLDEwOTYsMTg1OSwyNzI1LDQ0NTcsMzk3OCwxODc2LDEzNjcsMjY5NSwgICMgNTkyNgozMzUyLCA5MTgsMjEwNSwxNzgxLDI0NzYsIDMzNCwzMjg3LDE2MTEsMTA5Myw0NDU4LCA1NjQsMzE0NiwzNDU4LDM2NzMsMzM1MywgOTQ1LCAgIyA1OTQyCjI2MzEsMjA1Nyw0NDU5LDc3MDIsMTkyNSwgODcyLDQxNzUsNzcwMywzNDU5LDI2OTYsMzA4OSwgMzQ5LDQxNzYsMzY3NCwzOTc5LDQ0NjAsICAjIDU5NTgKMzgwMyw0MTc3LDM2NzUsMjE1NSwzOTgwLDQ0NjEsNDQ2Miw0MTc4LDQ0NjMsMjQwMywyMDQ2LCA3ODIsMzk4MSwgNDAwLCAyNTEsNDE3OSwgICMgNTk3NAoxNjI0LDc3MDQsNzcwNSwgMjc3LDM2NzYsIDI5OSwxMjY1LCA0NzYsMTE5MSwzODA0LDIxMjEsNDE4MCw0MTgxLDExMDksIDIwNSw3NzA2LCAgIyA1OTkwCjI1ODIsMTAwMCwyMTU2LDM1NjEsMTg2MCw3NzA3LDc3MDgsNzcwOSw0NDY0LDc3MTAsNDQ2NSwyNTY1LCAxMDcsMjQ3NywyMTU3LDM5ODIsICAjIDYwMDYKMzQ2MCwzMTQ3LDc3MTEsMTUzMywgNTQxLDEzMDEsIDE1OCwgNzUzLDQxODIsMjg3MiwzNTYyLDc3MTIsMTY5NiwgMzcwLDEwODgsNDE4MywgICMgNjAyMgo0NDY2LDM1NjMsIDU3OSwgMzI3LCA0NDAsIDE2MiwyMjQwLCAyNjksMTkzNywxMzc0LDM0NjEsIDk2OCwzMDQzLCAgNTYsMTM5NiwzMDkwLCAgIyA2MDM4CjIxMDYsMzI4OCwzMzU0LDc3MTMsMTkyNiwyMTU4LDQ0NjcsMjk5OCw3NzE0LDM1NjQsNzcxNSw3NzE2LDM2NzcsNDQ2OCwyNDc4LDc3MTcsICAjIDYwNTQKMjc5MSw3NzE4LDE2NTAsNDQ2OSw3NzE5LDI2MDMsNzcyMCw3NzIxLDM5ODMsMjY2MSwzMzU1LDExNDksMzM1NiwzOTg0LDM4MDUsMzk4NSwgICMgNjA3MAo3NzIyLDEwNzYsICA0OSw3NzIzLCA5NTEsMzIxMSwzMjg5LDMyOTAsIDQ1MCwyODM3LCA5MjAsNzcyNCwxODExLDI3OTIsMjM2Niw0MTg0LCAgIyA2MDg2CjE5MDgsMTEzOCwyMzY3LDM4MDYsMzQ2Miw3NzI1LDMyMTIsNDQ3MCwxOTA5LDExNDcsMTUxOCwyNDIzLDQ0NzEsMzgwNyw3NzI2LDQ0NzIsICAjIDYxMDIKMjM4OCwyNjA0LCAyNjAsMTc5NSwzMjEzLDc3MjcsNzcyOCwzODA4LDMyOTEsIDcwOCw3NzI5LDM1NjUsMTcwNCw3NzMwLDM1NjYsMTM1MSwgICMgNjExOAoxNjE4LDMzNTcsMjk5OSwxODg2LCA5NDQsNDE4NSwzMzU4LDQxODYsMzA0NCwzMzU5LDQxODcsNzczMSwzNjc4LCA0MjIsIDQxMywxNzE0LCAgIyA2MTM0CjMyOTIsIDUwMCwyMDU4LDIzNDUsNDE4OCwyNDc5LDc3MzIsMTM0NCwxOTEwLCA5NTQsNzczMywxNjY4LDc3MzQsNzczNSwzOTg2LDI0MDQsICAjIDYxNTAKNDE4OSwzNTY3LDM4MDksNDE5MCw3NzM2LDIzMDIsMTMxOCwyNTA1LDMwOTEsIDEzMywzMDkyLDI4NzMsNDQ3MywgNjI5LCAgMzEsMjgzOCwgICMgNjE2NgoyNjk3LDM4MTAsNDQ3NCwgODUwLCA5NDksNDQ3NSwzOTg3LDI5NTUsMTczMiwyMDg4LDQxOTEsMTQ5NiwxODUyLDc3MzcsMzk4OCwgNjIwLCAgIyA2MTgyCjMyMTQsIDk4MSwxMjQyLDM2NzksMzM2MCwxNjE5LDM2ODAsMTY0MywzMjkzLDIxMzksMjQ1MiwxOTcwLDE3MTksMzQ2MywyMTY4LDc3MzgsICAjIDYxOTgKMzIxNSw3NzM5LDc3NDAsMzM2MSwxODI4LDc3NDEsMTI3Nyw0NDc2LDE1NjUsMjA0Nyw3NzQyLDE2MzYsMzU2OCwzMDkzLDc3NDMsIDg2OSwgICMgNjIxNAoyODM5LCA2NTUsMzgxMSwzODEyLDMwOTQsMzk4OSwzMDAwLDM4MTMsMTMxMCwzNTY5LDQ0NzcsNzc0NCw3NzQ1LDc3NDYsMTczMywgNTU4LCAgIyA2MjMwCjQ0NzgsMzY4MSwgMzM1LDE1NDksMzA0NSwxNzU2LDQxOTIsMzY4MiwxOTQ1LDM0NjQsMTgyOSwxMjkxLDExOTIsIDQ3MCwyNzI2LDIxMDcsICAjIDYyNDYKMjc5MywgOTEzLDEwNTQsMzk5MCw3NzQ3LDEwMjcsNzc0OCwzMDQ2LDM5OTEsNDQ3OSwgOTgyLDI2NjIsMzM2MiwzMTQ4LDM0NjUsMzIxNiwgICMgNjI2MgozMjE3LDE5NDYsMjc5NCw3NzQ5LCA1NzEsNDQ4MCw3NzUwLDE4MzAsNzc1MSwzNTcwLDI1ODMsMTUyMywyNDI0LDc3NTIsMjA4OSwgOTg0LCAgIyA2Mjc4CjQ0ODEsMzY4MywxOTU5LDc3NTMsMzY4NCwgODUyLCA5MjMsMjc5NSwzNDY2LDM2ODUsIDk2OSwxNTE5LCA5OTksMjA0OCwyMzIwLDE3MDUsICAjIDYyOTQKNzc1NCwzMDk1LCA2MTUsMTY2MiwgMTUxLCA1OTcsMzk5MiwyNDA1LDIzMjEsMTA0OSwgMjc1LDQ0ODIsMzY4Niw0MTkzLCA1NjgsMzY4NywgICMgNjMxMAozNTcxLDI0ODAsNDE5NCwzNjg4LDc3NTUsMjQyNSwyMjcwLCA0MDksMzIxOCw3NzU2LDE1NjYsMjg3NCwzNDY3LDEwMDIsIDc2OSwyODQwLCAgIyA2MzI2CiAxOTQsMjA5MCwzMTQ5LDM2ODksMjIyMiwzMjk0LDQxOTUsIDYyOCwxNTA1LDc3NTcsNzc1OCwxNzYzLDIxNzcsMzAwMSwzOTkzLCA1MjEsICAjIDYzNDIKMTE2MSwyNTg0LDE3ODcsMjIwMywyNDA2LDQ0ODMsMzk5NCwxNjI1LDQxOTYsNDE5NywgNDEyLCAgNDIsMzA5NiwgNDY0LDc3NTksMjYzMiwgICMgNjM1OAo0NDg0LDMzNjMsMTc2MCwxNTcxLDI4NzUsMzQ2OCwyNTMwLDEyMTksMjIwNCwzODE0LDI2MzMsMjE0MCwyMzY4LDQ0ODUsNDQ4NiwzMjk1LCAgIyA2Mzc0CjE2NTEsMzM2NCwzNTcyLDc3NjAsNzc2MSwzNTczLDI0ODEsMzQ2OSw3NzYyLDM2OTAsNzc2Myw3NzY0LDIyNzEsMjA5MSwgNDYwLDc3NjUsICAjIDYzOTAKNDQ4Nyw3NzY2LDMwMDIsIDk2MiwgNTg4LDM1NzQsIDI4OSwzMjE5LDI2MzQsMTExNiwgIDUyLDc3NjcsMzA0NywxNzk2LDc3NjgsNzc2OSwgICMgNjQwNgo3NzcwLDE0NjcsNzc3MSwxNTk4LDExNDMsMzY5MSw0MTk4LDE5ODQsMTczNCwxMDY3LDQ0ODgsMTI4MCwzMzY1LCA0NjUsNDQ4OSwxNTcyLCAgIyA2NDIyCiA1MTAsNzc3MiwxOTI3LDIyNDEsMTgxMiwxNjQ0LDM1NzUsNzc3Myw0NDkwLDM2OTIsNzc3NCw3Nzc1LDI2NjMsMTU3MywxNTM0LDc3NzYsICAjIDY0MzgKNzc3Nyw0MTk5LCA1MzYsMTgwNywxNzYxLDM0NzAsMzgxNSwzMTUwLDI2MzUsNzc3OCw3Nzc5LDc3ODAsNDQ5MSwzNDcxLDI5MTUsMTkxMSwgICMgNjQ1NAoyNzk2LDc3ODEsMzI5NiwxMTIyLCAzNzcsMzIyMCw3NzgyLCAzNjAsNzc4Myw3Nzg0LDQyMDAsMTUyOSwgNTUxLDc3ODUsMjA1OSwzNjkzLCAgIyA2NDcwCjE3NjksMjQyNiw3Nzg2LDI5MTYsNDIwMSwzMjk3LDMwOTcsMjMyMiwyMTA4LDIwMzAsNDQ5MiwxNDA0LCAxMzYsMTQ2OCwxNDc5LCA2NzIsICAjIDY0ODYKMTE3MSwzMjIxLDIzMDMsIDI3MSwzMTUxLDc3ODcsMjc2Miw3Nzg4LDIwNDksIDY3OCwyNzI3LCA4NjUsMTk0Nyw0NDkzLDc3ODksMjAxMywgICMgNjUwMgozOTk1LDI5NTYsNzc5MCwyNzI4LDIyMjMsMTM5NywzMDQ4LDM2OTQsNDQ5NCw0NDk1LDE3MzUsMjkxNywzMzY2LDM1NzYsNzc5MSwzODE2LCAgIyA2NTE4CiA1MDksMjg0MSwyNDUzLDI4NzYsMzgxNyw3NzkyLDc3OTMsMzE1MiwzMTUzLDQ0OTYsNDIwMiwyNTMxLDQ0OTcsMjMwNCwxMTY2LDEwMTAsICAjIDY1MzQKIDU1MiwgNjgxLDE4ODcsNzc5NCw3Nzk1LDI5NTcsMjk1OCwzOTk2LDEyODcsMTU5NiwxODYxLDMxNTQsIDM1OCwgNDUzLCA3MzYsIDE3NSwgICMgNjU1MAogNDc4LDExMTcsIDkwNSwxMTY3LDEwOTcsNzc5NiwxODUzLDE1MzAsNzc5NywxNzA2LDc3OTgsMjE3OCwzNDcyLDIyODcsMzY5NSwzNDczLCAgIyA2NTY2CjM1NzcsNDIwMywyMDkyLDQyMDQsNzc5OSwzMzY3LDExOTMsMjQ4Miw0MjA1LDE0NTgsMjE5MCwyMjA1LDE4NjIsMTg4OCwxNDIxLDMyOTgsICAjIDY1ODIKMjkxOCwzMDQ5LDIxNzksMzQ3NCwgNTk1LDIxMjIsNzgwMCwzOTk3LDc4MDEsNzgwMiw0MjA2LDE3MDcsMjYzNiwgMjIzLDM2OTYsMTM1OSwgICMgNjU5OAogNzUxLDMwOTgsIDE4MywzNDc1LDc4MDMsMjc5NywzMDAzLCA0MTksMjM2OSwgNjMzLCA3MDQsMzgxOCwyMzg5LCAyNDEsNzgwNCw3ODA1LCAgIyA2NjE0Cjc4MDYsIDgzOCwzMDA0LDM2OTcsMjI3MiwyNzYzLDI0NTQsMzgxOSwxOTM4LDIwNTAsMzk5OCwxMzA5LDMwOTksMjI0MiwxMTgxLDc4MDcsICAjIDY2MzAKMTEzNiwyMjA2LDM4MjAsMjM3MCwxNDQ2LDQyMDcsMjMwNSw0NDk4LDc4MDgsNzgwOSw0MjA4LDEwNTUsMjYwNSwgNDg0LDM2OTgsNzgxMCwgICMgNjY0NgozOTk5LCA2MjUsNDIwOSwyMjczLDMzNjgsMTQ5OSw0MjEwLDQwMDAsNzgxMSw0MDAxLDQyMTEsMzIyMiwyMjc0LDIyNzUsMzQ3Niw3ODEyLCAgIyA2NjYyCjc4MTMsMjc2NCwgODA4LDI2MDYsMzY5OSwzMzY5LDQwMDIsNDIxMiwzMTAwLDI1MzIsIDUyNiwzMzcwLDM4MjEsNDIxMywgOTU1LDc4MTQsICAjIDY2NzgKMTYyMCw0MjE0LDI2MzcsMjQyNyw3ODE1LDE0MjksMzcwMCwxNjY5LDE4MzEsIDk5NCwgOTI4LDc4MTYsMzU3OCwxMjYwLDc4MTcsNzgxOCwgICMgNjY5NAo3ODE5LDE5NDgsMjI4OCwgNzQxLDI5MTksMTYyNiw0MjE1LDI3MjksMjQ1NSwgODY3LDExODQsIDM2MiwzMzcxLDEzOTIsNzgyMCw3ODIxLCAgIyA2NzEwCjQwMDMsNDIxNiwxNzcwLDE3MzYsMzIyMywyOTIwLDQ0OTksNDUwMCwxOTI4LDI2OTgsMTQ1OSwxMTU4LDc4MjIsMzA1MCwzMzcyLDI4NzcsICAjIDY3MjYKMTI5MiwxOTI5LDI1MDYsMjg0MiwzNzAxLDE5ODUsMTE4NywyMDcxLDIwMTQsMjYwNyw0MjE3LDc4MjMsMjU2NiwyNTA3LDIxNjksMzcwMiwgICMgNjc0MgoyNDgzLDMyOTksNzgyNCwzNzAzLDQ1MDEsNzgyNSw3ODI2LCA2NjYsMTAwMywzMDA1LDEwMjIsMzU3OSw0MjE4LDc4MjcsNDUwMiwxODEzLCAgIyA2NzU4CjIyNTMsIDU3NCwzODIyLDE2MDMsIDI5NSwxNTM1LCA3MDUsMzgyMyw0MjE5LCAyODMsIDg1OCwgNDE3LDc4MjgsNzgyOSwzMjI0LDQ1MDMsICAjIDY3NzQKNDUwNCwzMDUxLDEyMjAsMTg4OSwxMDQ2LDIyNzYsMjQ1Niw0MDA0LDEzOTMsMTU5OSwgNjg5LDI1NjcsIDM4OCw0MjIwLDc4MzAsMjQ4NCwgICMgNjc5MAogODAyLDc4MzEsMjc5OCwzODI0LDIwNjAsMTQwNSwyMjU0LDc4MzIsNDUwNSwzODI1LDIxMDksMTA1MiwxMzQ1LDMyMjUsMTU4NSw3ODMzLCAgIyA2ODA2CiA4MDksNzgzNCw3ODM1LDc4MzYsIDU3NSwyNzMwLDM0NzcsIDk1NiwxNTUyLDE0NjksMTE0NCwyMzIzLDc4MzcsMjMyNCwxNTYwLDI0NTcsICAjIDY4MjIKMzU4MCwzMjI2LDQwMDUsIDYxNiwyMjA3LDMxNTUsMjE4MCwyMjg5LDc4MzgsMTgzMiw3ODM5LDM0NzgsNDUwNiw3ODQwLDEzMTksMzcwNCwgICMgNjgzOAozNzA1LDEyMTEsMzU4MSwxMDIzLDMyMjcsMTI5MywyNzk5LDc4NDEsNzg0Miw3ODQzLDM4MjYsIDYwNywyMzA2LDM4MjcsIDc2MiwyODc4LCAgIyA2ODU0CjE0MzksNDIyMSwxMzYwLDc4NDQsMTQ4NSwzMDUyLDc4NDUsNDUwNywxMDM4LDQyMjIsMTQ1MCwyMDYxLDI2MzgsNDIyMywxMzc5LDQ1MDgsICAjIDY4NzAKMjU4NSw3ODQ2LDc4NDcsNDIyNCwxMzUyLDE0MTQsMjMyNSwyOTIxLDExNzIsNzg0OCw3ODQ5LDM4MjgsMzgyOSw3ODUwLDE3OTcsMTQ1MSwgICMgNjg4Ngo3ODUxLDc4NTIsNzg1Myw3ODU0LDI5MjIsNDAwNiw0MDA3LDI0ODUsMjM0NiwgNDExLDQwMDgsNDAwOSwzNTgyLDMzMDAsMzEwMSw0NTA5LCAgIyA2OTAyCjE1NjEsMjY2NCwxNDUyLDQwMTAsMTM3NSw3ODU1LDc4NTYsICA0NywyOTU5LCAzMTYsNzg1NywxNDA2LDE1OTEsMjkyMywzMTU2LDc4NTgsICAjIDY5MTgKMTAyNSwyMTQxLDMxMDIsMzE1NywgMzU0LDI3MzEsIDg4NCwyMjI0LDQyMjUsMjQwNywgNTA4LDM3MDYsIDcyNiwzNTgzLCA5OTYsMjQyOCwgICMgNjkzNAozNTg0LCA3MjksNzg1OSwgMzkyLDIxOTEsMTQ1Myw0MDExLDQ1MTAsMzcwNyw3ODYwLDc4NjEsMjQ1OCwzNTg1LDI2MDgsMTY3NSwyODAwLCAgIyA2OTUwCiA5MTksMjM0NywyOTYwLDIzNDgsMTI3MCw0NTExLDQwMTIsICA3Myw3ODYyLDc4NjMsIDY0Nyw3ODY0LDMyMjgsMjg0MywyMjU1LDE1NTAsICAjIDY5NjYKMTM0NiwzMDA2LDc4NjUsMTMzMiwgODgzLDM0NzksNzg2Niw3ODY3LDc4NjgsNzg2OSwzMzAxLDI3NjUsNzg3MCwxMjEyLCA4MzEsMTM0NywgICMgNjk4Mgo0MjI2LDQ1MTIsMjMyNiwzODMwLDE4NjMsMzA1MywgNzIwLDM4MzEsNDUxMyw0NTE0LDM4MzIsNzg3MSw0MjI3LDc4NzIsNzg3Myw0NTE1LCAgIyA2OTk4Cjc4NzQsNzg3NSwxNzk4LDQ1MTYsMzcwOCwyNjA5LDQ1MTcsMzU4NiwxNjQ1LDIzNzEsNzg3Niw3ODc3LDI5MjQsIDY2OSwyMjA4LDI2NjUsICAjIDcwMTQKMjQyOSw3ODc4LDI4NzksNzg3OSw3ODgwLDEwMjgsMzIyOSw3ODgxLDQyMjgsMjQwOCw3ODgyLDIyNTYsMTM1Myw3ODgzLDc4ODQsNDUxOCwgICMgNzAzMAozMTU4LCA1MTgsNzg4NSw0MDEzLDc4ODYsNDIyOSwxOTYwLDc4ODcsMjE0Miw0MjMwLDc4ODgsNzg4OSwzMDA3LDIzNDksMjM1MCwzODMzLCAgIyA3MDQ2CiA1MTYsMTgzMywxNDU0LDQwMTQsMjY5OSw0MjMxLDQ1MTksMjIyNSwyNjEwLDE5NzEsMTEyOSwzNTg3LDc4OTAsMjc2Niw3ODkxLDI5NjEsICAjIDcwNjIKMTQyMiwgNTc3LDE0NzAsMzAwOCwxNTI0LDMzNzMsNzg5Miw3ODkzLCA0MzIsNDIzMiwzMDU0LDM0ODAsNzg5NCwyNTg2LDE0NTUsMjUwOCwgICMgNzA3OAoyMjI2LDE5NzIsMTE3NSw3ODk1LDEwMjAsMjczMiw0MDE1LDM0ODEsNDUyMCw3ODk2LDI3MzMsNzg5NywxNzQzLDEzNjEsMzA1NSwzNDgyLCAgIyA3MDk0CjI2MzksNDAxNiw0MjMzLDQ1MjEsMjI5MCwgODk1LCA5MjQsNDIzNCwyMTcwLCAzMzEsMjI0MywzMDU2LCAxNjYsMTYyNywzMDU3LDEwOTgsICAjIDcxMTAKNzg5OCwxMjMyLDI4ODAsMjIyNywzMzc0LDQ1MjIsIDY1NywgNDAzLDExOTYsMjM3MiwgNTQyLDM3MDksMzM3NSwxNjAwLDQyMzUsMzQ4MywgICMgNzEyNgo3ODk5LDQ1MjMsMjc2NywzMjMwLCA1NzYsIDUzMCwxMzYyLDc5MDAsNDUyNCwyNTMzLDI2NjYsMzcxMCw0MDE3LDc5MDEsIDg0MiwzODM0LCAgIyA3MTQyCjc5MDIsMjgwMSwyMDMxLDEwMTQsNDAxOCwgMjEzLDI3MDAsMzM3NiwgNjY1LCA2MjEsNDIzNiw3OTAzLDM3MTEsMjkyNSwyNDMwLDc5MDQsICAjIDcxNTgKMjQzMSwzMzAyLDM1ODgsMzM3Nyw3OTA1LDQyMzcsMjUzNCw0MjM4LDQ1MjUsMzU4OSwxNjgyLDQyMzksMzQ4NCwxMzgwLDc5MDYsIDcyNCwgICMgNzE3NAoyMjc3LCA2MDAsMTY3MCw3OTA3LDEzMzcsMTIzMyw0NTI2LDMxMDMsMjI0NCw3OTA4LDE2MjEsNDUyNyw3OTA5LCA2NTEsNDI0MCw3OTEwLCAgIyA3MTkwCjE2MTIsNDI0MSwyNjExLDc5MTEsMjg0NCw3OTEyLDI3MzQsMjMwNywzMDU4LDc5MTMsIDcxNiwyNDU5LDMwNTksIDE3NCwxMjU1LDI3MDEsICAjIDcyMDYKNDAxOSwzNTkwLCA1NDgsMTMyMCwxMzk4LCA3MjgsNDAyMCwxNTc0LDc5MTQsMTg5MCwxMTk3LDMwNjAsNDAyMSw3OTE1LDMwNjEsMzA2MiwgICMgNzIyMgozNzEyLDM1OTEsMzcxMywgNzQ3LDc5MTYsIDYzNSw0MjQyLDQ1MjgsNzkxNyw3OTE4LDc5MTksNDI0Myw3OTIwLDc5MjEsNDUyOSw3OTIyLCAgIyA3MjM4CjMzNzgsNDUzMCwyNDMyLCA0NTEsNzkyMywzNzE0LDI1MzUsMjA3Miw0MjQ0LDI3MzUsNDI0NSw0MDIyLDc5MjQsMTc2NCw0NTMxLDc5MjUsICAjIDcyNTQKNDI0NiwgMzUwLDc5MjYsMjI3OCwyMzkwLDI0ODYsNzkyNyw0MjQ3LDQwMjMsMjI0NSwxNDM0LDQwMjQsIDQ4OCw0NTMyLCA0NTgsNDI0OCwgICMgNzI3MAo0MDI1LDM3MTUsIDc3MSwxMzMwLDIzOTEsMzgzNSwyNTY4LDMxNTksMjE1OSwyNDA5LDE1NTMsMjY2NywzMTYwLDQyNDksNzkyOCwyNDg3LCAgIyA3Mjg2CjI4ODEsMjYxMiwxNzIwLDI3MDIsNDI1MCwzMzc5LDQ1MzMsNzkyOSwyNTM2LDQyNTEsNzkzMCwzMjMxLDQyNTIsMjc2OCw3OTMxLDIwMTUsICAjIDczMDIKMjczNiw3OTMyLDExNTUsMTAxNywzNzE2LDM4MzYsNzkzMywzMzAzLDIzMDgsIDIwMSwxODY0LDQyNTMsMTQzMCw3OTM0LDQwMjYsNzkzNSwgICMgNzMxOAo3OTM2LDc5MzcsNzkzOCw3OTM5LDQyNTQsMTYwNCw3OTQwLCA0MTQsMTg2NSwgMzcxLDI1ODcsNDUzNCw0NTM1LDM0ODUsMjAxNiwzMTA0LCAgIyA3MzM0CjQ1MzYsMTcwOCwgOTYwLDQyNTUsIDg4NywgMzg5LDIxNzEsMTUzNiwxNjYzLDE3MjEsNzk0MSwyMjI4LDQwMjcsMjM1MSwyOTI2LDE1ODAsICAjIDczNTAKNzk0Miw3OTQzLDc5NDQsMTc0NCw3OTQ1LDI1MzcsNDUzNyw0NTM4LDc5NDYsNDUzOSw3OTQ3LDIwNzMsNzk0OCw3OTQ5LDM1OTIsMzM4MCwgICMgNzM2NgoyODgyLDQyNTYsNzk1MCw0MjU3LDI2NDAsMzM4MSwyODAyLCA2NzMsMjcwMywyNDYwLCA3MDksMzQ4Niw0MDI4LDM1OTMsNDI1OCw3OTUxLCAgIyA3MzgyCjExNDgsIDUwMiwgNjM0LDc5NTIsNzk1MywxMjA0LDQ1NDAsMzU5NCwxNTc1LDQ1NDEsMjYxMywzNzE3LDc5NTQsMzcxOCwzMTA1LCA5NDgsICAjIDczOTgKMzIzMiwgMTIxLDE3NDUsMzgzNywxMTEwLDc5NTUsNDI1OSwzMDYzLDI1MDksMzAwOSw0MDI5LDM3MTksMTE1MSwxNzcxLDM4MzgsMTQ4OCwgICMgNzQxNAo0MDMwLDE5ODYsNzk1NiwyNDMzLDM0ODcsNzk1Nyw3OTU4LDIwOTMsNzk1OSw0MjYwLDM4MzksMTIxMywxNDA3LDI4MDMsIDUzMSwyNzM3LCAgIyA3NDMwCjI1MzgsMzIzMywxMDExLDE1MzcsNzk2MCwyNzY5LDQyNjEsMzEwNiwxMDYxLDc5NjEsMzcyMCwzNzIxLDE4NjYsMjg4Myw3OTYyLDIwMTcsICAjIDc0NDYKIDEyMCw0MjYyLDQyNjMsMjA2MiwzNTk1LDMyMzQsMjMwOSwzODQwLDI2NjgsMzM4MiwxOTU0LDQ1NDIsNzk2Myw3OTY0LDM0ODgsMTA0NywgICMgNzQ2MgoyNzA0LDEyNjYsNzk2NSwxMzY4LDQ1NDMsMjg0NSwgNjQ5LDMzODMsMzg0MSwyNTM5LDI3MzgsMTEwMiwyODQ2LDI2NjksNzk2Niw3OTY3LCAgIyA3NDc4CjE5OTksNzk2OCwxMTExLDM1OTYsMjk2Miw3OTY5LDI0ODgsMzg0MiwzNTk3LDI4MDQsMTg1NCwzMzg0LDM3MjIsNzk3MCw3OTcxLDMzODUsICAjIDc0OTQKMjQxMCwyODg0LDMzMDQsMzIzNSwzNTk4LDc5NzIsMjU2OSw3OTczLDM1OTksMjgwNSw0MDMxLDE0NjAsIDg1Niw3OTc0LDM2MDAsNzk3NSwgICMgNzUxMAoyODg1LDI5NjMsNzk3NiwyODg2LDM4NDMsNzk3Nyw0MjY0LCA2MzIsMjUxMCwgODc1LDM4NDQsMTY5NywzODQ1LDIyOTEsNzk3OCw3OTc5LCAgIyA3NTI2CjQ1NDQsMzAxMCwxMjM5LCA1ODAsNDU0NSw0MjY1LDc5ODAsIDkxNCwgOTM2LDIwNzQsMTE5MCw0MDMyLDEwMzksMjEyMyw3OTgxLDc5ODIsICAjIDc1NDIKNzk4MywzMzg2LDE0NzMsNzk4NCwxMzU0LDQyNjYsMzg0Niw3OTg1LDIxNzIsMzA2NCw0MDMzLCA5MTUsMzMwNSw0MjY3LDQyNjgsMzMwNiwgICMgNzU1OAoxNjA1LDE4MzQsNzk4NiwyNzM5LCAzOTgsMzYwMSw0MjY5LDM4NDcsNDAzNCwgMzI4LDE5MTIsMjg0Nyw0MDM1LDM4NDgsMTMzMSw0MjcwLCAgIyA3NTc0CjMwMTEsIDkzNyw0MjcxLDc5ODcsMzYwMiw0MDM2LDQwMzcsMzM4NywyMTYwLDQ1NDYsMzM4OCwgNTI0LCA3NDIsIDUzOCwzMDY1LDEwMTIsICAjIDc1OTAKNzk4OCw3OTg5LDM4NDksMjQ2MSw3OTkwLCA2NTgsMTEwMywgMjI1LDM4NTAsNzk5MSw3OTkyLDQ1NDcsNzk5Myw0NTQ4LDc5OTQsMzIzNiwgICMgNzYwNgoxMjQzLDc5OTUsNDAzOCwgOTYzLDIyNDYsNDU0OSw3OTk2LDI3MDUsMzYwMywzMTYxLDc5OTcsNzk5OCwyNTg4LDIzMjcsNzk5OSw0NTUwLCAgIyA3NjIyCjgwMDAsODAwMSw4MDAyLDM0ODksMzMwNywgOTU3LDMzODksMjU0MCwyMDMyLDE5MzAsMjkyNywyNDYyLCA4NzAsMjAxOCwzNjA0LDE3NDYsICAjIDc2MzgKMjc3MCwyNzcxLDI0MzQsMjQ2Myw4MDAzLDM4NTEsODAwNCwzNzIzLDMxMDcsMzcyNCwzNDkwLDMzOTAsMzcyNSw4MDA1LDExNzksMzA2NiwgICMgNzY1NAo4MDA2LDMxNjIsMjM3Myw0MjcyLDM3MjYsMjU0MSwzMTYzLDMxMDgsMjc0MCw0MDM5LDgwMDcsMzM5MSwxNTU2LDI1NDIsMjI5MiwgOTc3LCAgIyA3NjcwCjI4ODcsMjAzMyw0MDQwLDEyMDUsMzM5Miw4MDA4LDE3NjUsMzM5MywzMTY0LDIxMjQsMTI3MSwxNjg5LCA3MTQsNDU1MSwzNDkxLDgwMDksICAjIDc2ODYKMjMyOCwzODUyLCA1MzMsNDI3MywzNjA1LDIxODEsIDYxNyw4MDEwLDI0NjQsMzMwOCwzNDkyLDIzMTAsODAxMSw4MDEyLDMxNjUsODAxMywgICMgNzcwMgo4MDE0LDM4NTMsMTk4NywgNjE4LCA0MjcsMjY0MSwzNDkzLDMzOTQsODAxNSw4MDE2LDEyNDQsMTY5MCw4MDE3LDI4MDYsNDI3NCw0NTUyLCAgIyA3NzE4CjgwMTgsMzQ5NCw4MDE5LDgwMjAsMjI3OSwxNTc2LCA0NzMsMzYwNiw0Mjc1LDMzOTUsIDk3Miw4MDIxLDM2MDcsODAyMiwzMDY3LDgwMjMsICAjIDc3MzQKODAyNCw0NTUzLDQ1NTQsODAyNSwzNzI3LDQwNDEsNDA0Miw4MDI2LCAxNTMsNDU1NSwgMzU2LDgwMjcsMTg5MSwyODg4LDQyNzYsMjE0MywgICMgNzc1MAogNDA4LCA4MDMsMjM1Miw4MDI4LDM4NTQsODAyOSw0Mjc3LDE2NDYsMjU3MCwyNTExLDQ1NTYsNDU1NywzODU1LDgwMzAsMzg1Niw0Mjc4LCAgIyA3NzY2CjgwMzEsMjQxMSwzMzk2LCA3NTIsODAzMiw4MDMzLDE5NjEsMjk2NCw4MDM0LCA3NDYsMzAxMiwyNDY1LDgwMzUsNDI3OSwzNzI4LCA2OTgsICAjIDc3ODIKNDU1OCwxODkyLDQyODAsMzYwOCwyNTQzLDQ1NTksMzYwOSwzODU3LDgwMzYsMzE2NiwzMzk3LDgwMzcsMTgyMywxMzAyLDQwNDMsMjcwNiwgICMgNzc5OAozODU4LDE5NzMsNDI4MSw4MDM4LDQyODIsMzE2NywgODIzLDEzMDMsMTI4OCwxMjM2LDI4NDgsMzQ5NSw0MDQ0LDMzOTgsIDc3NCwzODU5LCAgIyA3ODE0CjgwMzksMTU4MSw0NTYwLDEzMDQsMjg0OSwzODYwLDQ1NjEsODA0MCwyNDM1LDIxNjEsMTA4MywzMjM3LDQyODMsNDA0NSw0Mjg0LCAzNDQsICAjIDc4MzAKMTE3MywgMjg4LDIzMTEsIDQ1NCwxNjgzLDgwNDEsODA0MiwxNDYxLDQ1NjIsNDA0NiwyNTg5LDgwNDMsODA0NCw0NTYzLCA5ODUsIDg5NCwgICMgNzg0Ngo4MDQ1LDMzOTksMzE2OCw4MDQ2LDE5MTMsMjkyOCwzNzI5LDE5ODgsODA0NywyMTEwLDE5NzQsODA0OCw0MDQ3LDgwNDksMjU3MSwxMTk0LCAgIyA3ODYyCiA0MjUsODA1MCw0NTY0LDMxNjksMTI0NSwzNzMwLDQyODUsODA1MSw4MDUyLDI4NTAsODA1MywgNjM2LDQ1NjUsMTg1NSwzODYxLCA3NjAsICAjIDc4NzgKMTc5OSw4MDU0LDQyODYsMjIwOSwxNTA4LDQ1NjYsNDA0OCwxODkzLDE2ODQsMjI5Myw4MDU1LDgwNTYsODA1Nyw0Mjg3LDQyODgsMjIxMCwgICMgNzg5NAogNDc5LDgwNTgsODA1OSwgODMyLDgwNjAsNDA0OSwyNDg5LDgwNjEsMjk2NSwyNDkwLDM3MzEsIDk5MCwzMTA5LCA2MjcsMTgxNCwyNjQyLCAgIyA3OTEwCjQyODksMTU4Miw0MjkwLDIxMjUsMjExMSwzNDk2LDQ1NjcsODA2MiwgNzk5LDQyOTEsMzE3MCw4MDYzLDQ1NjgsMjExMiwxNzM3LDMwMTMsICAjIDc5MjYKMTAxOCwgNTQzLCA3NTQsNDI5MiwzMzA5LDE2NzYsNDU2OSw0NTcwLDQwNTAsODA2NCwxNDg5LDgwNjUsMzQ5Nyw4MDY2LDI2MTQsMjg4OSwgICMgNzk0Mgo0MDUxLDgwNjcsODA2OCwyOTY2LDgwNjksODA3MCw4MDcxLDgwNzIsMzE3MSw0NTcxLDQ1NzIsMjE4MiwxNzIyLDgwNzMsMzIzOCwzMjM5LCAgIyA3OTU4CjE4NDIsMzYxMCwxNzE1LCA0ODEsIDM2NSwxOTc1LDE4NTYsODA3NCw4MDc1LDE5NjIsMjQ5MSw0NTczLDgwNzYsMjEyNiwzNjExLDMyNDAsICAjIDc5NzQKIDQzMywxODk0LDIwNjMsMjA3NSw4MDc3LCA2MDIsMjc0MSw4MDc4LDgwNzksODA4MCw4MDgxLDgwODIsMzAxNCwxNjI4LDM0MDAsODA4MywgICMgNzk5MAozMTcyLDQ1NzQsNDA1MiwyODkwLDQ1NzUsMjUxMiw4MDg0LDI1NDQsMjc3Miw4MDg1LDgwODYsODA4NywzMzEwLDQ1NzYsMjg5MSw4MDg4LCAgIyA4MDA2CjQ1NzcsODA4OSwyODUxLDQ1NzgsNDU3OSwxMjIxLDI5NjcsNDA1MywyNTEzLDgwOTAsODA5MSw4MDkyLDE4NjcsMTk4OSw4MDkzLDgwOTQsICAjIDgwMjIKODA5NSwxODk1LDgwOTYsODA5Nyw0NTgwLDE4OTYsNDA1NCwgMzE4LDgwOTgsMjA5NCw0MDU1LDQyOTMsODA5OSw4MTAwLCA0ODUsODEwMSwgICMgODAzOAogOTM4LDM4NjIsIDU1MywyNjcwLCAxMTYsODEwMiwzODYzLDM2MTIsODEwMywzNDk4LDI2NzEsMjc3MywzNDAxLDMzMTEsMjgwNyw4MTA0LCAgIyA4MDU0CjM2MTMsMjkyOSw0MDU2LDE3NDcsMjkzMCwyOTY4LDgxMDUsODEwNiwgMjA3LDgxMDcsODEwOCwyNjcyLDQ1ODEsMjUxNCw4MTA5LDMwMTUsICAjIDgwNzAKIDg5MCwzNjE0LDM4NjQsODExMCwxODc3LDM3MzIsMzQwMiw4MTExLDIxODMsMjM1MywzNDAzLDE2NTIsODExMiw4MTEzLDgxMTQsIDk0MSwgICMgODA4NgoyMjk0LCAyMDgsMzQ5OSw0MDU3LDIwMTksIDMzMCw0Mjk0LDM4NjUsMjg5MiwyNDkyLDM3MzMsNDI5NSw4MTE1LDgxMTYsODExNyw4MTE4LCAgIyA4MTAyCikKClBLAwQUAAAAAAAAACEAoEGNGNMGAADTBgAAMgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2V1Y3R3cHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxsYS5vcmcgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLm1iY2hhcnNldHByb2JlciBpbXBvcnQgTXVsdGlCeXRlQ2hhclNldFByb2Jlcgpmcm9tIC5jb2RpbmdzdGF0ZW1hY2hpbmUgaW1wb3J0IENvZGluZ1N0YXRlTWFjaGluZQpmcm9tIC5jaGFyZGlzdHJpYnV0aW9uIGltcG9ydCBFVUNUV0Rpc3RyaWJ1dGlvbkFuYWx5c2lzCmZyb20gLm1iY3NzbSBpbXBvcnQgRVVDVFdfU01fTU9ERUwKCmNsYXNzIEVVQ1RXUHJvYmVyKE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEVVQ1RXUHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb2Rpbmdfc20gPSBDb2RpbmdTdGF0ZU1hY2hpbmUoRVVDVFdfU01fTU9ERUwpCiAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIgPSBFVUNUV0Rpc3RyaWJ1dGlvbkFuYWx5c2lzKCkKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuICJFVUMtVFciCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgcmV0dXJuICJUYWl3YW4iClBLAwQUAAAAAAAAACEAGUXS1+tQAADrUAAAMQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2diMjMxMmZyZXEucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgR0IyMzEyIG1vc3QgZnJlcXVlbnRseSB1c2VkIGNoYXJhY3RlciB0YWJsZQojCiMgQ2hhciB0byBGcmVxT3JkZXIgdGFibGUgLCBmcm9tIGh6Njc2MwoKIyA1MTIgIC0tPiAwLjc5ICAtLSAwLjc5CiMgMTAyNCAtLT4gMC45MiAgLS0gMC4xMwojIDIwNDggLS0+IDAuOTggIC0tIDAuMDYKIyA2NzY4IC0tPiAxLjAwICAtLSAwLjAyCiMKIyBJZGVhbCBEaXN0cmlidXRpb24gUmF0aW8gPSAwLjc5MTM1LygxLTAuNzkxMzUpID0gMy43OQojIFJhbmRvbSBEaXN0cmlidXRpb24gUmF0aW9uID0gNTEyIC8gKDM3NTUgLSA1MTIpID0gMC4xNTcKIwojIFR5cGljYWwgRGlzdHJpYnV0aW9uIFJhdGlvIGFib3V0IDI1JSBvZiBJZGVhbCBvbmUsIHN0aWxsIG11Y2ggaGlnaGVyIHRoYXQgUkRSCgpHQjIzMTJfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8gPSAwLjkKCkdCMjMxMl9UQUJMRV9TSVpFID0gMzc2MAoKR0IyMzEyX0NIQVJfVE9fRlJFUV9PUkRFUiA9ICgKMTY3MSwgNzQ5LDE0NDMsMjM2NCwzOTI0LDM4MDcsMjMzMCwzOTIxLDE3MDQsMzQ2MywyNjkxLDE1MTEsMTUxNSwgNTcyLDMxOTEsMjIwNSwKMjM2MSwgMjI0LDI1NTgsIDQ3OSwxNzExLCA5NjMsMzE2MiwgNDQwLDQwNjAsMTkwNSwyOTY2LDI5NDcsMzU4MCwyNjQ3LDM5NjEsMzg0MiwKMjIwNCwgODY5LDQyMDcsIDk3MCwyNjc4LDU2MjYsMjk0NCwyOTU2LDE0NzksNDA0OCwgNTE0LDM1OTUsIDU4OCwxMzQ2LDI4MjAsMzQwOSwKIDI0OSw0MDg4LDE3NDYsMTg3MywyMDQ3LDE3NzQsIDU4MSwxODEzLCAzNTgsMTE3NCwzNTkwLDEwMTQsMTU2MSw0ODQ0LDIyNDUsIDY3MCwKMTYzNiwzMTEyLCA4ODksMTI4NiwgOTUzLCA1NTYsMjMyNywzMDYwLDEyOTAsMzE0MSwgNjEzLCAxODUsMzQ3NywxMzY3LCA4NTAsMzgyMCwKMTcxNSwyNDI4LDI2NDIsMjMwMywyNzMyLDMwNDEsMjU2MiwyNjQ4LDM1NjYsMzk0NiwxMzQ5LCAzODgsMzA5OCwyMDkxLDEzNjAsMzU4NSwKIDE1MiwxNjg3LDE1MzksIDczOCwxNTU5LCAgNTksMTIzMiwyOTI1LDIyNjcsMTM4OCwxMjQ5LDE3NDEsMTY3OSwyOTYwLCAxNTEsMTU2NiwKMTEyNSwxMzUyLDQyNzEsIDkyNCw0Mjk2LCAzODUsMzE2Niw0NDU5LCAzMTAsMTI0NSwyODUwLCAgNzAsMzI4NSwyNzI5LDM1MzQsMzU3NSwKMjM5OCwzMjk4LDM0NjYsMTk2MCwyMjY1LCAyMTcsMzY0NywgODY0LDE5MDksMjA4NCw0NDAxLDI3NzMsMTAxMCwzMjY5LDUxNTIsIDg1MywKMzA1MSwzMTIxLDEyNDQsNDI1MSwxODk1LCAzNjQsMTQ5OSwxNTQwLDIzMTMsMTE4MCwzNjU1LDIyNjgsIDU2MiwgNzE1LDI0MTcsMzA2MSwKIDU0NCwgMzM2LDM3NjgsMjM4MCwxNzUyLDQwNzUsIDk1MCwgMjgwLDI0MjUsNDM4MiwgMTgzLDI3NTksMzI3MiwgMzMzLDQyOTcsMjE1NSwKMTY4OCwyMzU2LDE0NDQsMTAzOSw0NTQwLCA3MzYsMTE3NywzMzQ5LDI0NDMsMjM2OCwyMTQ0LDIyMjUsIDU2NSwgMTk2LDE0ODIsMzQwNiwKIDkyNywxMzM1LDQxNDcsIDY5MiwgODc4LDEzMTEsMTY1MywzOTExLDM2MjIsMTM3OCw0MjAwLDE4NDAsMjk2OSwzMTQ5LDIxMjYsMTgxNiwKMjUzNCwxNTQ2LDIzOTMsMjc2MCwgNzM3LDI0OTQsICAxMywgNDQ3LCAyNDUsMjc0NywgIDM4LDI3NjUsMjEyOSwyNTg5LDEwNzksIDYwNiwKIDM2MCwgNDcxLDM3NTUsMjg5MCwgNDA0LCA4NDgsIDY5OSwxNzg1LDEyMzYsIDM3MCwyMjIxLDEwMjMsMzc0NiwyMDc0LDIwMjYsMjAyMywKMjM4OCwxNTgxLDIxMTksIDgxMiwxMTQxLDMwOTEsMjUzNiwxNTE5LCA4MDQsMjA1MywgNDA2LDE1OTYsMTA5MCwgNzg0LCA1NDgsNDQxNCwKMTgwNiwyMjY0LDI5MzYsMTEwMCwgMzQzLDQxMTQsNTA5NiwgNjIyLDMzNTgsIDc0MywzNjY4LDE1MTAsMTYyNiw1MDIwLDM1NjcsMjUxMywKMzE5NSw0MTE1LDU2MjcsMjQ4OSwyOTkxLCAgMjQsMjA2NSwyNjk3LDEwODcsMjcxOSwgIDQ4LDE2MzQsIDMxNSwgIDY4LCA5ODUsMjA1MiwKIDE5OCwyMjM5LDEzNDcsMTEwNywxNDM5LCA1OTcsMjM2NiwyMTcyLCA4NzEsMzMwNywgOTE5LDI0ODcsMjc5MCwxODY3LCAyMzYsMjU3MCwKMTQxMywzNzk0LCA5MDYsMzM2NSwzMzgxLDE3MDEsMTk4MiwxODE4LDE1MjQsMjkyNCwxMjA1LCA2MTYsMjU4NiwyMDcyLDIwMDQsIDU3NSwKIDI1MywzMDk5LCAgMzIsMTM2NSwxMTgyLCAxOTcsMTcxNCwyNDU0LDEyMDEsIDU1NCwzMzg4LDMyMjQsMjc0OCwgNzU2LDI1ODcsIDI1MCwKMjU2NywxNTA3LDE1MTcsMzUyOSwxOTIyLDI3NjEsMjMzNywzNDE2LDE5NjEsMTY3NywyNDUyLDIyMzgsMzE1MywgNjE1LCA5MTEsMTUwNiwKMTQ3NCwyNDk1LDEyNjUsMTkwNiwyNzQ5LDM3NTYsMzI4MCwyMTYxLCA4OTgsMjcxNCwxNzU5LDM0NTAsMjI0MywyNDQ0LCA1NjMsICAyNiwKMzI4NiwyMjY2LDM3NjksMzM0NCwyNzA3LDM2NzcsIDYxMSwxNDAyLCA1MzEsMTAyOCwyODcxLDQ1NDgsMTM3NSwgMjYxLDI5NDgsIDgzNSwKMTE5MCw0MTM0LCAzNTMsIDg0MCwyNjg0LDE5MDAsMzA4MiwxNDM1LDIxMDksMTIwNywxNjc0LCAzMjksMTg3MiwyNzgxLDQwNTUsMjY4NiwKMjEwNCwgNjA4LDMzMTgsMjQyMywyOTU3LDI3NjgsMTEwOCwzNzM5LDM1MTIsMzI3MSwzOTg1LDIyMDMsMTc3MSwzNTIwLDE0MTgsMjA1NCwKMTY4MSwxMTUzLCAyMjUsMTYyNywyOTI5LCAxNjIsMjA1MCwyNTExLDM2ODcsMTk1NCwgMTI0LDE4NTksMjQzMSwxNjg0LDMwMzIsMjg5NCwKIDU4NSw0ODA1LDM5NjksMjg2OSwyNzA0LDIwODgsMjAzMiwyMDk1LDM2NTYsMjYzNSw0MzYyLDIyMDksIDI1NiwgNTE4LDIwNDIsMjEwNSwKMzc3NywzNjU3LCA2NDMsMjI5OCwxMTQ4LDE3NzksIDE5MCwgOTg5LDM1NDQsIDQxNCwgIDExLDIxMzUsMjA2MywyOTc5LDE0NzEsIDQwMywKMzY3OCwgMTI2LCA3NzAsMTU2MywgNjcxLDI0OTksMzIxNiwyODc3LCA2MDAsMTE3OSwgMzA3LDI4MDUsNDkzNywxMjY4LDEyOTcsMjY5NCwKIDI1Miw0MDMyLDE0NDgsMTQ5NCwxMzMxLDEzOTQsIDEyNywyMjU2LCAyMjIsMTY0NywxMDM1LDE0ODEsMzA1NiwxOTE1LDEwNDgsIDg3MywKMzY1MSwgMjEwLCAgMzMsMTYwOCwyNTE2LCAyMDAsMTUyMCwgNDE1LCAxMDIsICAgMCwzMzg5LDEyODcsIDgxNywgIDkxLDMyOTksMjk0MCwKIDgzNiwxODE0LCA1NDksMjE5NywxMzk2LDE2NjksMjk4NywzNTgyLDIyOTcsMjg0OCw0NTI4LDEwNzAsIDY4NywgIDIwLDE4MTksIDEyMSwKMTU1MiwxMzY0LDE0NjEsMTk2OCwyNjE3LDM1NDAsMjgyNCwyMDgzLCAxNzcsIDk0OCw0OTM4LDIyOTEsIDExMCw0NTQ5LDIwNjYsIDY0OCwKMzM1OSwxNzU1LDIxMTAsMjExNCw0NjQyLDQ4NDUsMTY5MywzOTM3LDMzMDgsMTI1NywxODY5LDIxMjMsIDIwOCwxODA0LDMxNTksMjk5MiwKMjUzMSwyNTQ5LDMzNjEsMjQxOCwxMzUwLDIzNDcsMjgwMCwyNTY4LDEyOTEsMjAzNiwyNjgwLCAgNzIsIDg0MiwxOTkwLCAyMTIsMTIzMywKMTE1NCwxNTg2LCAgNzUsMjAyNywzNDEwLDQ5MDAsMTgyMywxMzM3LDI3MTAsMjY3NiwgNzI4LDI4MTAsMTUyMiwzMDI2LDQ5OTUsIDE1NywKIDc1NSwxMDUwLDQwMjIsIDcxMCwgNzg1LDE5MzYsMjE5NCwyMDg1LDE0MDYsMjc3NywyNDAwLCAxNTAsMTI1MCw0MDQ5LDEyMDYsIDgwNywKMTkxMCwgNTM0LCA1MjksMzMwOSwxNzIxLDE2NjAsIDI3NCwgIDM5LDI4MjcsIDY2MSwyNjcwLDE1NzgsIDkyNSwzMjQ4LDM4MTUsMTA5NCwKNDI3OCw0OTAxLDQyNTIsICA0MSwxMTUwLDM3NDcsMjU3MiwyMjI3LDQ1MDEsMzY1OCw0OTAyLDM4MTMsMzM1NywzNjE3LDI4ODQsMjI1OCwKIDg4NywgNTM4LDQxODcsMzE5OSwxMjk0LDI0MzksMzA0MiwyMzI5LDIzNDMsMjQ5NywxMjU1LCAxMDcsIDU0MywxNTI3LCA1MjEsMzQ3OCwKMzU2OCwgMTk0LDUwNjIsICAxNSwgOTYxLDM4NzAsMTI0MSwxMTkyLDI2NjQsICA2Niw1MjE1LDMyNjAsMjExMSwxMjk1LDExMjcsMjE1MiwKMzgwNSw0MTM1LCA5MDEsMTE2NCwxOTc2LCAzOTgsMTI3OCwgNTMwLDE0NjAsIDc0OCwgOTA0LDEwNTQsMTk2NiwxNDI2LCAgNTMsMjkwOSwKIDUwOSwgNTIzLDIyNzksMTUzNCwgNTM2LDEwMTksIDIzOSwxNjg1LCA0NjAsMjM1MywgNjczLDEwNjUsMjQwMSwzNjAwLDQyOTgsMjI3MiwKMTI3MiwyMzYzLCAyODQsMTc1MywzNjc5LDQwNjQsMTY5NSwgIDgxLCA4MTUsMjY3NywyNzU3LDI3MzEsMTM4NiwgODU5LCA1MDAsNDIyMSwKMjE5MCwyNTY2LCA3NTcsMTAwNiwyNTE5LDIwNjgsMTE2NiwxNDU1LCAzMzcsMjY1NCwzMjAzLDE4NjMsMTY4MiwxOTE0LDMwMjUsMTI1MiwKMTQwOSwxMzY2LCA4NDcsIDcxNCwyODM0LDIwMzgsMzIwOSwgOTY0LDI5NzAsMTkwMSwgODg1LDI1NTMsMTA3OCwxNzU2LDMwNDksIDMwMSwKMTU3MiwzMzI2LCA2ODgsMjEzMCwxOTk2LDI0MjksMTgwNSwxNjQ4LDI5MzAsMzQyMSwyNzUwLDM2NTIsMzA4OCwgMjYyLDExNTgsMTI1NCwKIDM4OSwxNjQxLDE4MTIsIDUyNiwxNzE5LCA5MjMsMjA3MywxMDczLDE5MDIsIDQ2OCwgNDg5LDQ2MjUsMTE0MCwgODU3LDIzNzUsMzA3MCwKMzMxOSwyODYzLCAzODAsIDExNiwxMzI4LDI2OTMsMTE2MSwyMjQ0LCAyNzMsMTIxMiwxODg0LDI3NjksMzAxMSwxNzc1LDExNDIsIDQ2MSwKMzA2NiwxMjAwLDIxNDcsMjIxMiwgNzkwLCA3MDIsMjY5NSw0MjIyLDE2MDEsMTA1OCwgNDM0LDIzMzgsNTE1MywzNjQwLCAgNjcsMjM2MCwKNDA5OSwyNTAyLCA2MTgsMzQ3MiwxMzI5LCA0MTYsMTEzMiwgODMwLDI3ODIsMTgwNywyNjUzLDMyMTEsMzUxMCwxNjYyLCAxOTIsMjEyNCwKIDI5NiwzOTc5LDE3MzksMTYxMSwzNjg0LCAgMjMsIDExOCwgMzI0LCA0NDYsMTIzOSwxMjI1LCAyOTMsMjUyMCwzODE0LDM3OTUsMjUzNSwKMzExNiwgIDE3LDEwNzQsIDQ2NywyNjkyLDIyMDEsIDM4NywyOTIyLCAgNDUsMTMyNiwzMDU1LDE2NDUsMzY1OSwyODE3LCA5NTgsIDI0MywKMTkwMywyMzIwLDEzMzksMjgyNSwxNzg0LDMyODksIDM1NiwgNTc2LCA4NjUsMjMxNSwyMzgxLDMzNzcsMzkxNiwxMDg4LDMxMjIsMTcxMywKMTY1NSwgOTM1LCA2MjgsNDY4OSwxMDM0LDEzMjcsIDQ0MSwgODAwLCA3MjAsIDg5NCwxOTc5LDIxODMsMTUyOCw1Mjg5LDI3MDIsMTA3MSwKNDA0NiwzNTcyLDIzOTksMTU3MSwzMjgxLCAgNzksIDc2MSwxMTAzLCAzMjcsIDEzNCwgNzU4LDE4OTksMTM3MSwxNjE1LCA4NzksIDQ0MiwKIDIxNSwyNjA1LDI1NzksIDE3MywyMDQ4LDI0ODUsMTA1NywyOTc1LDMzMTcsMTA5NywyMjUzLDM4MDEsNDI2MywxNDAzLDE2NTAsMjk0NiwKIDgxNCw0OTY4LDM0ODcsMTU0OCwyNjQ0LDE1NjcsMTI4NSwgICAyLCAyOTUsMjYzNiwgIDk3LCA5NDYsMzU3NiwgODMyLCAxNDEsNDI1NywKMzI3MywgNzYwLDM4MjEsMzUyMSwzMTU2LDI2MDcsIDk0OSwxMDI0LDE3MzMsMTUxNiwxODAzLDE5MjAsMjEyNSwyMjgzLDI2NjUsMzE4MCwKMTUwMSwyMDY0LDM1NjAsMjE3MSwxNTkyLCA4MDMsMzUxOCwxNDE2LCA3MzIsMzg5Nyw0MjU4LDEzNjMsMTM2MiwyNDU4LCAxMTksMTQyNywKIDYwMiwxNTI1LDI2MDgsMTYwNSwxNjM5LDMxNzUsIDY5NCwzMDY0LCAgMTAsIDQ2NSwgIDc2LDIwMDAsNDg0Niw0MjA4LCA0NDQsMzc4MSwKMTYxOSwzMzUzLDIyMDYsMTI3MywzNzk2LCA3NDAsMjQ4MywgMzIwLDE3MjMsMjM3NywzNjYwLDI2MTksMTM1OSwxMTM3LDE3NjIsMTcyNCwKMjM0NSwyODQyLDE4NTAsMTg2MiwgOTEyLCA4MjEsMTg2NiwgNjEyLDI2MjUsMTczNSwyNTczLDMzNjksMTA5MywgODQ0LCAgODksIDkzNywKIDkzMCwxNDI0LDM1NjQsMjQxMywyOTcyLDEwMDQsMzA0NiwzMDE5LDIwMTEsIDcxMSwzMTcxLDE0NTIsNDE3OCwgNDI4LCA4MDEsMTk0MywKIDQzMiwgNDQ1LDI4MTEsIDIwNiw0MTM2LDE0NzIsIDczMCwgMzQ5LCAgNzMsIDM5NywyODAyLDI1NDcsIDk5OCwxNjM3LDExNjcsIDc4OSwKIDM5NiwzMjE3LCAxNTQsMTIxOCwgNzE2LDExMjAsMTc4MCwyODE5LDQ4MjYsMTkzMSwzMzM0LDM3NjIsMjEzOSwxMjE1LDI2MjcsIDU1MiwKMzY2NCwzNjI4LDMyMzIsMTQwNSwyMzgzLDMxMTEsMTM1NiwyNjUyLDM1NzcsMzMyMCwzMTAxLDE3MDMsIDY0MCwxMDQ1LDEzNzAsMTI0NiwKNDk5NiwgMzcxLDE1NzUsMjQzNiwxNjIxLDIyMTAsIDk4NCw0MDMzLDE3MzQsMjYzOCwgIDE2LDQ1MjksIDY2MywyNzU1LDMyNTUsMTQ1MSwKMzkxNywyMjU3LDEyNTMsMTk1NSwyMjM0LDEyNjMsMjk1MSwgMjE0LDEyMjksIDYxNywgNDg1LCAzNTksMTgzMSwxOTY5LCA0NzMsMjMxMCwKIDc1MCwyMDU4LCAxNjUsICA4MCwyODY0LDI0MTksIDM2MSw0MzQ0LDI0MTYsMjQ3OSwxMTM0LCA3OTYsMzcyNiwxMjY2LDI5NDMsIDg2MCwKMjcxNSwgOTM4LCAzOTAsMjczNCwxMzEzLDEzODQsIDI0OCwgMjAyLCA4NzcsMTA2NCwyODU0LCA1MjIsMzkwNywgMjc5LDE2MDIsIDI5NywKMjM1NywgMzk1LDM3NDAsIDEzNywyMDc1LCA5NDQsNDA4OSwyNTg0LDEyNjcsMzgwMiwgIDYyLDE1MzMsMjI4NSwgMTc4LCAxNzYsIDc4MCwKMjQ0MCwgMjAxLDM3MDcsIDU5MCwgNDc4LDE1NjAsNDM1NCwyMTE3LDEwNzUsICAzMCwgIDc0LDQ2NDMsNDAwNCwxNjM1LDE0NDEsMjc0NSwKIDc3NiwyNTk2LCAyMzgsMTA3NywxNjkyLDE5MTIsMjg0NCwgNjA1LCA0OTksMTc0MiwzOTQ3LCAyNDEsMzA1MywgOTgwLDE3NDksIDkzNiwKMjY0MCw0NTExLDI1ODIsIDUxNSwxNTQzLDIxNjIsNTMyMiwyODkyLDI5OTMsIDg5MCwyMTQ4LDE5MjQsIDY2NSwxODI3LDM1ODEsMTAzMiwKIDk2OCwzMTYzLCAzMzksMTA0NCwxODk2LCAyNzAsIDU4MywxNzkxLDE3MjAsNDM2NywxMTk0LDM0ODgsMzY2OSwgIDQzLDI1MjMsMTY1NywKIDE2MywyMTY3LCAyOTAsMTIwOSwxNjIyLDMzNzgsIDU1MCwgNjM0LDI1MDgsMjUxMCwgNjk1LDI2MzQsMjM4NCwyNTEyLDE0NzYsMTQxNCwKIDIyMCwxNDY5LDIzNDEsMjEzOCwyODUyLDMxODMsMjkwMCw0OTM5LDI4NjUsMzUwMiwxMjExLDM2ODAsIDg1NCwzMjI3LDEyOTksMjk3NiwKMzE3MiwgMTg2LDI5OTgsMTQ1OSwgNDQzLDEwNjcsMzI1MSwxNDk1LCAzMjEsMTkzMiwzMDU0LCA5MDksIDc1MywxNDEwLDE4MjgsIDQzNiwKMjQ0MSwxMTE5LDE1ODcsMzE2NCwyMTg2LDEyNTgsIDIyNywgMjMxLDE0MjUsMTg5MCwzMjAwLDM5NDIsIDI0NywgOTU5LCA3MjUsNTI1NCwKMjc0MSwgNTc3LDIxNTgsMjA3OSwgOTI5LCAxMjAsIDE3NCwgODM4LDI4MTMsIDU5MSwxMTE1LCA0MTcsMjAyNCwgIDQwLDMyNDAsMTUzNiwKMTAzNywgMjkxLDQxNTEsMjM1NCwgNjMyLDEyOTgsMjQwNiwyNTAwLDM1MzUsMTgyNSwxODQ2LDM0NTEsIDIwNSwxMTcxLCAzNDUsNDIzOCwKICAxOCwxMTYzLCA4MTEsIDY4NSwyMjA4LDEyMTcsIDQyNSwxMzEyLDE1MDgsMTE3NSw0MzA4LDI1NTIsMTAzMywgNTg3LDEzODEsMzA1OSwKMjk4NCwzNDgyLCAzNDAsMTMxNiw0MDIzLDM5NzIsIDc5MiwzMTc2LCA1MTksIDc3Nyw0NjkwLCA5MTgsIDkzMyw0MTMwLDI5ODEsMzc0MSwKICA5MCwzMzYwLDI5MTEsMjIwMCw1MTg0LDQ1NTAsIDYwOSwzMDc5LDIwMzAsIDI3MiwzMzc5LDI3MzYsIDM2MywzODgxLDExMzAsMTQ0NywKIDI4NiwgNzc5LCAzNTcsMTE2OSwzMzUwLDMxMzcsMTYzMCwxMjIwLDI2ODcsMjM5MSwgNzQ3LDEyNzcsMzY4OCwyNjE4LDI2ODIsMjYwMSwKMTE1NiwzMTk2LDUyOTAsNDAzNCwzMTAyLDE2ODksMzU5NiwzMTI4LCA4NzQsIDIxOSwyNzgzLCA3OTgsIDUwOCwxODQzLDI0NjEsIDI2OSwKMTY1OCwxNzc2LDEzOTIsMTkxMywyOTgzLDMyODcsMjg2NiwyMTU5LDIzNzIsIDgyOSw0MDc2LCAgNDYsNDI1MywyODczLDE4ODksMTg5NCwKIDkxNSwxODM0LDE2MzEsMjE4MSwyMzE4LCAyOTgsIDY2NCwyODE4LDM1NTUsMjczNSwgOTU0LDMyMjgsMzExNywgNTI3LDM1MTEsMjE3MywKIDY4MSwyNzEyLDMwMzMsMjI0NywyMzQ2LDM0NjcsMTY1MiwgMTU1LDIxNjQsMzM4MiwgMTEzLDE5OTQsIDQ1MCwgODk5LCA0OTQsIDk5NCwKMTIzNywyOTU4LDE4NzUsMjMzNiwxOTI2LDM3MjcsIDU0NSwxNTc3LDE1NTAsIDYzMywzNDczLCAyMDQsMTMwNSwzMDcyLDI0MTAsMTk1NiwKMjQ3MSwgNzA3LDIxMzQsIDg0MSwyMTk1LDIxOTYsMjY2MywzODQzLDEwMjYsNDk0MCwgOTkwLDMyNTIsNDk5NywgMzY4LDEwOTIsIDQzNywKMzIxMiwzMjU4LDE5MzMsMTgyOSwgNjc1LDI5NzcsMjg5MywgNDEyLCA5NDMsMzcyMyw0NjQ0LDMyOTQsMzI4MywyMjMwLDIzNzMsNTE1NCwKMjM4OSwyMjQxLDI2NjEsMjMyMywxNDA0LDI1MjQsIDU5MywgNzg3LCA2NzcsMzAwOCwxMjc1LDIwNTksIDQzOCwyNzA5LDI2MDksMjI0MCwKMjI2OSwyMjQ2LDE0NDYsICAzNiwxNTY4LDEzNzMsMzg5MiwxNTc0LDIzMDEsMTQ1NiwzOTYyLCA2OTMsMjI3Niw1MjE2LDIwMzUsMTE0MywKMjcyMCwxOTE5LDE3OTcsMTgxMSwyNzYzLDQxMzcsMjU5NywxODMwLDE2OTksMTQ4OCwxMTk4LDIwOTAsIDQyNCwxNjk0LCAzMTIsMzYzNCwKMzM5MCw0MTc5LDMzMzUsMjI1MiwxMjE0LCA1NjEsMTA1OSwzMjQzLDIyOTUsMjU2MSwgOTc1LDUxNTUsMjMyMSwyNzUxLDM3NzIsIDQ3MiwKMTUzNywzMjgyLDMzOTgsMTA0NywyMDc3LDIzNDgsMjg3OCwxMzIzLDMzNDAsMzA3NiwgNjkwLDI5MDYsICA1MSwgMzY5LCAxNzAsMzU0MSwKMTA2MCwyMTg3LDI2ODgsMzY3MCwyNTQxLDEwODMsMTY4MywgOTI4LDM5MTgsIDQ1OSwgMTA5LDQ0MjcsIDU5OSwzNzQ0LDQyODYsIDE0MywKMjEwMSwyNzMwLDI0OTAsICA4MiwxNTg4LDMwMzYsMjEyMSwgMjgxLDE4NjAsIDQ3Nyw0MDM1LDEyMzgsMjgxMiwzMDIwLDI3MTYsMzMxMiwKMTUzMCwyMTg4LDIwNTUsMTMxNywgODQzLCA2MzYsMTgwOCwxMTczLDM0OTUsIDY0OSwgMTgxLDEwMDIsIDE0NywzNjQxLDExNTksMjQxNCwKMzc1MCwyMjg5LDI3OTUsIDgxMywzMTIzLDI2MTAsMTEzNiw0MzY4LCAgIDUsMzM5MSw0NTQxLDIxNzQsIDQyMCwgNDI5LDE3MjgsIDc1NCwKMTIyOCwyMTE1LDIyMTksIDM0NywyMjIzLDI3MzMsIDczNSwxNTE4LDMwMDMsMjM1NSwzMTM0LDE3NjQsMzk0OCwzMzI5LDE4ODgsMjQyNCwKMTAwMSwxMjM0LDE5NzIsMzMyMSwzMzYzLDE2NzIsMTAyMSwxNDUwLDE1ODQsIDIyNiwgNzY1LCA2NTUsMjUyNiwzNDA0LDMyNDQsMjMwMiwKMzY2NSwgNzMxLCA1OTQsMjE4NCwgMzE5LDE1NzYsIDYyMSwgNjU4LDI2NTYsNDI5OSwyMDk5LDM4NjQsMTI3OSwyMDcxLDI1OTgsMjczOSwKIDc5NSwzMDg2LDM2OTksMzkwOCwxNzA3LDIzNTIsMjQwMiwxMzgyLDMxMzYsMjQ3NSwxNDY1LDQ4NDcsMzQ5NiwzODY1LDEwODUsMzAwNCwKMjU5MSwxMDg0LCAyMTMsMjI4NywxOTYzLDM1NjUsMjI1MCwgODIyLCA3OTMsNDU3NCwzMTg3LDE3NzIsMTc4OSwzMDUwLCA1OTUsMTQ4NCwKMTk1OSwyNzcwLDEwODAsMjY1MCwgNDU2LCA0MjIsMjk5NiwgOTQwLDMzMjIsNDMyOCw0MzQ1LDMwOTIsMjc0MiwgOTY1LDI3ODQsIDczOSwKNDEyNCwgOTUyLDEzNTgsMjQ5OCwyOTQ5LDI1NjUsIDMzMiwyNjk4LDIzNzgsIDY2MCwyMjYwLDI0NzMsNDE5NCwzODU2LDI5MTksIDUzNSwKMTI2MCwyNjUxLDEyMDgsMTQyOCwxMzAwLDE5NDksMTMwMywyOTQyLCA0MzMsMjQ1NSwyNDUwLDEyNTEsMTk0NiwgNjE0LDEyNjksIDY0MSwKMTMwNiwxODEwLDI3MzcsMzA3OCwyOTEyLCA1NjQsMjM2NSwxNDE5LDE0MTUsMTQ5Nyw0NDYwLDIzNjcsMjE4NSwxMzc5LDMwMDUsMTMwNywKMzIxOCwyMTc1LDE4OTcsMzA2MywgNjgyLDExNTcsNDA0MCw0MDA1LDE3MTIsMTE2MCwxOTQxLDEzOTksIDM5NCwgNDAyLDI5NTIsMTU3MywKMTE1MSwyOTg2LDI0MDQsIDg2MiwgMjk5LDIwMzMsMTQ4OSwzMDA2LCAzNDYsIDE3MSwyODg2LDM0MDEsMTcyNiwyOTMyLCAxNjgsMjUzMywKICA0NywyNTA3LDEwMzAsMzczNSwxMTQ1LDMzNzAsMTM5NSwxMzE4LDE1NzksMzYwOSw0NTYwLDI4NTcsNDExNiwxNDU3LDI1MjksMTk2NSwKIDUwNCwxMDM2LDI2OTAsMjk4OCwyNDA1LCA3NDUsNTg3MSwgODQ5LDIzOTcsMjA1NiwzMDgxLCA4NjMsMjM1OSwzODU3LDIwOTYsICA5OSwKMTM5NywxNzY5LDIzMDAsNDQyOCwxNjQzLDM0NTUsMTk3OCwxNzU3LDM3MTgsMTQ0MCwgIDM1LDQ4NzksMzc0MiwxMjk2LDQyMjgsMjI4MCwKIDE2MCw1MDYzLDE1OTksMjAxMywgMTY2LCA1MjAsMzQ3OSwxNjQ2LDMzNDUsMzAxMiwgNDkwLDE5MzcsMTU0NSwxMjY0LDIxODIsMjUwNSwKMTA5NiwxMTg4LDEzNjksMTQzNiwyNDIxLDE2NjcsMjc5MiwyNDYwLDEyNzAsMjEyMiwgNzI3LDMxNjcsMjE0MywgODA2LDE3MDYsMTAxMiwKMTgwMCwzMDM3LCA5NjAsMjIxOCwxODgyLCA4MDUsIDEzOSwyNDU2LDExMzksMTUyMSwgODUxLDEwNTIsMzA5MywzMDg5LCAzNDIsMjAzOSwKIDc0NCw1MDk3LDE0NjgsMTUwMiwxNTg1LDIwODcsIDIyMywgOTM5LCAzMjYsMjE0MCwyNTc3LCA4OTIsMjQ4MSwxNjIzLDQwNzcsIDk4MiwKMzcwOCwgMTM1LDIxMzEsICA4NywyNTAzLDMxMTQsMjMyNiwxMTA2LCA4NzYsMTYxNiwgNTQ3LDI5OTcsMjgzMSwyMDkzLDM0NDEsNDUzMCwKNDMxNCwgICA5LDMyNTYsNDIyOSw0MTQ4LCA2NTksMTQ2MiwxOTg2LDE3MTAsMjA0NiwyOTEzLDIyMzEsNDA5MCw0ODgwLDUyNTUsMzM5MiwKMzI3NCwxMzY4LDM2ODksNDY0NSwxNDc3LCA3MDUsMzM4NCwzNjM1LDEwNjgsMTUyOSwyOTQxLDE0NTgsMzc4MiwxNTA5LCAxMDAsMTY1NiwKMjU0OCwgNzE4LDIzMzksIDQwOCwxNTkwLDI3ODAsMzU0OCwxODM4LDQxMTcsMzcxOSwxMzQ1LDM1MzAsIDcxNywzNDQyLDI3NzgsMzIyMCwKMjg5OCwxODkyLDQ1OTAsMzYxNCwzMzcxLDIwNDMsMTk5OCwxMjI0LDM0ODMsIDg5MSwgNjM1LCA1ODQsMjU1OSwzMzU1LCA3MzMsMTc2NiwKMTcyOSwxMTcyLDM3ODksMTg5MSwyMzA3LCA3ODEsMjk4MiwyMjcxLDE5NTcsMTU4MCw1NzczLDI2MzMsMjAwNSw0MTk1LDMwOTcsMTUzNSwKMzIxMywxMTg5LDE5MzQsNTY5MywzMjYyLCA1ODYsMzExOCwxMzI0LDE1OTgsIDUxNywxNTY0LDIyMTcsMTg2OCwxODkzLDQ0NDUsMzcyOCwKMjcwMywzMTM5LDE1MjYsMTc4NywxOTkyLDM4ODIsMjg3NSwxNTQ5LDExOTksMTA1NiwyMjI0LDE5MDQsMjcxMSw1MDk4LDQyODcsIDMzOCwKMTk5MywzMTI5LDM0ODksMjY4OSwxODA5LDI4MTUsMTk5NywgOTU3LDE4NTUsMzg5OCwyNTUwLDMyNzUsMzA1NywxMTA1LDEzMTksIDYyNywKMTUwNSwxOTExLDE4ODMsMzUyNiwgNjk4LDM2MjksMzQ1NiwxODMzLDE0MzEsIDc0NiwgIDc3LDEyNjEsMjAxNywyMjk2LDE5NzcsMTg4NSwKIDEyNSwxMzM0LDE2MDAsIDUyNSwxNzk4LDExMDksMjIyMiwxNDcwLDE5NDUsIDU1OSwyMjM2LDExODYsMzQ0MywyNDc2LDE5MjksMTQxMSwKMjQxMSwzMTM1LDE3NzcsMzM3MiwyNjIxLDE4NDEsMTYxMywzMjI5LCA2NjgsMTQzMCwxODM5LDI2NDMsMjkxNiwgMTk1LDE5ODksMjY3MSwKMjM1OCwxMzg3LCA2MjksMzIwNSwyMjkzLDUyNTYsNDQzOSwgMTIzLDEzMTAsIDg4OCwxODc5LDQzMDAsMzAyMSwzNjA1LDEwMDMsMTE2MiwKMzE5MiwyOTEwLDIwMTAsIDE0MCwyMzk1LDI4NTksICA1NSwxMDgyLDIwMTIsMjkwMSwgNjYyLCA0MTksMjA4MSwxNDM4LCA2ODAsMjc3NCwKNDY1NCwzOTEyLDE2MjAsMTczMSwxNjI1LDUwMzUsNDA2NSwyMzI4LCA1MTIsMTM0NCwgODAyLDU0NDMsMjE2MywyMzExLDI1MzcsIDUyNCwKMzM5OSwgIDk4LDExNTUsMjEwMywxOTE4LDI2MDYsMzkyNSwyODE2LDEzOTMsMjQ2NSwxNTA0LDM3NzMsMjE3NywzOTYzLDE0NzgsNDM0NiwKIDE4MCwxMTEzLDQ2NTUsMzQ2MSwyMDI4LDE2OTgsIDgzMywyNjk2LDEyMzUsMTMyMiwxNTk0LDQ0MDgsMzYyMywzMDEzLDMyMjUsMjA0MCwKMzAyMiwgNTQxLDI4ODEsIDYwNywzNjMyLDIwMjksMTY2NSwxMjE5LCA2MzksMTM4NSwxNjg2LDEwOTksMjgwMywzMjMxLDE5MzgsMzE4OCwKMjg1OCwgNDI3LCA2NzYsMjc3MiwxMTY4LDIwMjUsIDQ1NCwzMjUzLDI0ODYsMzU1NiwgMjMwLDE5NTAsIDU4MCwgNzkxLDE5OTEsMTI4MCwKMTA4NiwxOTc0LDIwMzQsIDYzMCwgMjU3LDMzMzgsMjc4OCw0OTAzLDEwMTcsICA4Niw0NzkwLCA5NjYsMjc4OSwxOTk1LDE2OTYsMTEzMSwKIDI1OSwzMDk1LDQxODgsMTMwOCwgMTc5LDE0NjMsNTI1NywgMjg5LDQxMDcsMTI0OCwgIDQyLDM0MTMsMTcyNSwyMjg4LCA4OTYsMTk0NywKIDc3NCw0NDc0LDQyNTQsIDYwNCwzNDMwLDQyNjQsIDM5MiwyNTE0LDI1ODgsIDQ1MiwgMjM3LDE0MDgsMzAxOCwgOTg4LDQ1MzEsMTk3MCwKMzAzNCwzMzEwLCA1NDAsMjM3MCwxNTYyLDEyODgsMjk5MCwgNTAyLDQ3NjUsMTE0NywgICA0LDE4NTMsMjcwOCwgMjA3LCAyOTQsMjgxNCwKNDA3OCwyOTAyLDI1MDksIDY4NCwgIDM0LDMxMDUsMzUzMiwyNTUxLCA2NDQsIDcwOSwyODAxLDIzNDQsIDU3MywxNzI3LDM1NzMsMzU1NywKMjAyMSwxMDgxLDMxMDAsNDMxNSwyMTAwLDM2ODEsIDE5OSwyMjYzLDE4MzcsMjM4NSwgMTQ2LDM0ODQsMTE5NSwyNzc2LDM5NDksIDk5NywKMTkzOSwzOTczLDEwMDgsMTA5MSwxMjAyLDE5NjIsMTg0NywxMTQ5LDQyMDksNTQ0NCwxMDc2LCA0OTMsIDExNyw1NDAwLDI1MjEsIDk3MiwKMTQ5MCwyOTM0LDE3OTYsNDU0MiwyMzc0LDE1MTIsMjkzMywyNjU3LCA0MTMsMjg4OCwxMTM1LDI3NjIsMjMxNCwyMTU2LDEzNTUsMjM2OSwKIDc2NiwyMDA3LDI1MjcsMjE3MCwzMTI0LDI0OTEsMjU5MywyNjMyLDQ3NTcsMjQzNywgMjM0LDMxMjUsMzU5MSwxODk4LDE3NTAsMTM3NiwKMTk0MiwzNDY4LDMxMzgsIDU3MCwyMTI3LDIxNDUsMzI3Niw0MTMxLCA5NjIsIDEzMiwxNDQ1LDQxOTYsICAxOSwgOTQxLDM2MjQsMzQ4MCwKMzM2NiwxOTczLDEzNzQsNDQ2MSwzNDMxLDI2MjksIDI4MywyNDE1LDIyNzUsIDgwOCwyODg3LDM2MjAsMjExMiwyNTYzLDEzNTMsMzYxMCwKIDk1NSwxMDg5LDMxMDMsMTA1MywgIDk2LCAgODgsNDA5NywgODIzLDM4MDgsMTU4MywgMzk5LCAyOTIsNDA5MSwzMzEzLCA0MjEsMTEyOCwKIDY0Miw0MDA2LCA5MDMsMjUzOSwxODc3LDIwODIsIDU5NiwgIDI5LDQwNjYsMTc5MCwgNzIyLDIxNTcsIDEzMCwgOTk1LDE1NjksIDc2OSwKMTQ4NSwgNDY0LCA1MTMsMjIxMywgMjg4LDE5MjMsMTEwMSwyNDUzLDQzMTYsIDEzMywgNDg2LDI0NDUsICA1MCwgNjI1LCA0ODcsMjIwNywKICA1NywgNDIzLCA0ODEsMjk2MiwgMTU5LDM3MjksMTU1OCwgNDkxLCAzMDMsIDQ4MiwgNTAxLCAyNDAsMjgzNywgMTEyLDM2NDgsMjM5MiwKMTc4MywgMzYyLCAgIDgsMzQzMywzNDIyLCA2MTAsMjc5MywzMjc3LDEzOTAsMTI4NCwxNjU0LCAgMjEsMzgyMywgNzM0LCAzNjcsIDYyMywKIDE5MywgMjg3LCAzNzQsMTAwOSwxNDgzLCA4MTYsIDQ3NiwgMzEzLDIyNTUsMjM0MCwxMjYyLDIxNTAsMjg5OSwxMTQ2LDI1ODEsIDc4MiwKMjExNiwxNjU5LDIwMTgsMTg4MCwgMjU1LDM1ODYsMzMxNCwxMTEwLDI4NjcsMjEzNywyNTY0LCA5ODYsMjc2Nyw1MTg1LDIwMDYsIDY1MCwKIDE1OCwgOTI2LCA3NjIsIDg4MSwzMTU3LDI3MTcsMjM2MiwzNTg3LCAzMDYsMzY5MCwzMjQ1LDE1NDIsMzA3NywyNDI3LDE2OTEsMjQ3OCwKMjExOCwyOTg1LDM0OTAsMjQzOCwgNTM5LDIzMDUsIDk4MywgMTI5LDE3NTQsIDM1NSw0MjAxLDIzODYsIDgyNywyOTIzLCAxMDQsMTc3MywKMjgzOCwyNzcxLCA0MTEsMjkwNSwzOTE5LCAzNzYsIDc2NywgMTIyLDExMTQsIDgyOCwyNDIyLDE4MTcsMzUwNiwgMjY2LDM0NjAsMTAwNywKMTYwOSw0OTk4LCA5NDUsMjYxMiw0NDI5LDIyNzQsIDcyNiwxMjQ3LDE5NjQsMjkxNCwyMTk5LDIwNzAsNDAwMiw0MTA4LCA2NTcsMzMyMywKMTQyMiwgNTc5LCA0NTUsMjc2NCw0NzM3LDEyMjIsMjg5NSwxNjcwLCA4MjQsMTIyMywxNDg3LDI1MjUsIDU1OCwgODYxLDMwODAsIDU5OCwKMjY1OSwyNTE1LDE5NjcsIDc1MiwyNTgzLDIzNzYsMjIxNCw0MTgwLCA5NzcsIDcwNCwyNDY0LDQ5OTksMjYyMiw0MTA5LDEyMTAsMjk2MSwKIDgxOSwxNTQxLCAxNDIsMjI4NCwgIDQ0LCA0MTgsIDQ1NywxMTI2LDM3MzAsNDM0Nyw0NjI2LDE2NDQsMTg3NiwzNjcxLDE4NjQsIDMwMiwKMTA2Myw1Njk0LCA2MjQsIDcyMywxOTg0LDM3NDUsMTMxNCwxNjc2LDI0ODgsMTYxMCwxNDQ5LDM1NTgsMzU2OSwyMTY2LDIwOTgsIDQwOSwKMTAxMSwyMzI1LDM3MDQsMjMwNiwgODE4LDE3MzIsMTM4MywxODI0LDE4NDQsMzc1NywgOTk5LDI3MDUsMzQ5NywxMjE2LDE0MjMsMjY4MywKMjQyNiwyOTU0LDI1MDEsMjcyNiwyMjI5LDE0NzUsMjU1NCw1MDY0LDE5NzEsMTc5NCwxNjY2LDIwMTQsMTM0MywgNzgzLCA3MjQsIDE5MSwKMjQzNCwxMzU0LDIyMjAsNTA2NSwxNzYzLDI3NTIsMjQ3Miw0MTUyLCAxMzEsIDE3NSwyODg1LDM0MzQsICA5MiwxNDY2LDQ5MjAsMjYxNiwKMzg3MSwzODcyLDM4NjYsIDEyOCwxNTUxLDE2MzIsIDY2OSwxODU0LDM2ODIsNDY5MSw0MTI1LDEyMzAsIDE4OCwyOTczLDMyOTAsMTMwMiwKMTIxMywgNTYwLDMyNjYsIDkxNywgNzYzLDM5MDksMzI0OSwxNzYwLCA4NjgsMTk1OCwgNzY0LDE3ODIsMjA5NywgMTQ1LDIyNzcsMzc3NCwKNDQ2MiwgIDY0LDE0OTEsMzA2MiwgOTcxLDIxMzIsMzYwNiwyNDQyLCAyMjEsMTIyNiwxNjE3LCAyMTgsIDMyMywxMTg1LDMyMDcsMzE0NywKIDU3MSwgNjE5LDE0NzMsMTAwNSwxNzQ0LDIyODEsIDQ0OSwxODg3LDIzOTYsMzY4NSwgMjc1LCAzNzUsMzgxNiwxNzQzLDM4NDQsMzczMSwKIDg0NSwxOTgzLDIzNTAsNDIxMCwxMzc3LCA3NzMsIDk2NywzNDk5LDMwNTIsMzc0MywyNzI1LDQwMDcsMTY5NywxMDIyLDM5NDMsMTQ2NCwKMzI2NCwyODU1LDI3MjIsMTk1MiwxMDI5LDI4MzksMjQ2NywgIDg0LDQzODMsMjIxNSwgODIwLDEzOTEsMjAxNSwyNDQ4LDM2NzIsIDM3NywKMTk0OCwyMTY4LCA3OTcsMjU0NSwzNTM2LDI1NzgsMjY0NSwgIDk0LDI4NzQsMTY3OCwgNDA1LDEyNTksMzA3MSwgNzcxLCA1NDYsMTMxNSwKIDQ3MCwxMjQzLDMwODMsIDg5NSwyNDY4LCA5ODEsIDk2OSwyMDM3LCA4NDYsNDE4MSwgNjUzLDEyNzYsMjkyOCwgIDE0LDI1OTQsIDU1NywKMzAwNywyNDc0LCAxNTYsIDkwMiwxMzM4LDE3NDAsMjU3NCwgNTM3LDI1MTgsIDk3MywyMjgyLDIyMTYsMjQzMywxOTI4LCAxMzgsMjkwMywKMTI5MywyNjMxLDE2MTIsIDY0NiwzNDU3LCA4MzksMjkzNSwgMTExLCA0OTYsMjE5MSwyODQ3LCA1ODksMzE4NiwgMTQ5LDM5OTQsMjA2MCwKNDAzMSwyNjQxLDQwNjcsMzE0NSwxODcwLCAgMzcsMzU5NywyMTM2LDEwMjUsMjA1MSwzMDA5LDMzODMsMzU0OSwxMTIxLDEwMTYsMzI2MSwKMTMwMSwgMjUxLDI0NDYsMjU5OSwyMTUzLCA4NzIsMzI0NiwgNjM3LCAzMzQsMzcwNSwgODMxLCA4ODQsIDkyMSwzMDY1LDMxNDAsNDA5MiwKMjE5OCwxOTQ0LCAyNDYsMjk2NCwgMTA4LDIwNDUsMTE1MiwxOTIxLDIzMDgsMTAzMSwgMjAzLDMxNzMsNDE3MCwxOTA3LDM4OTAsIDgxMCwKMTQwMSwyMDAzLDE2OTAsIDUwNiwgNjQ3LDEyNDIsMjgyOCwxNzYxLDE2NDksMzIwOCwyMjQ5LDE1ODksMzcwOSwyOTMxLDUxNTYsMTcwOCwKIDQ5OCwgNjY2LDI2MTMsIDgzNCwzODE3LDEyMzEsIDE4NCwyODUxLDExMjQsIDg4MywzMTk3LDIyNjEsMzcxMCwxNzY1LDE1NTMsMjY1OCwKMTE3OCwyNjM5LDIzNTEsICA5MywxMTkzLCA5NDIsMjUzOCwyMTQxLDQ0MDIsIDIzNSwxODIxLCA4NzAsMTU5MSwyMTkyLDE3MDksMTg3MSwKMzM0MSwxNjE4LDQxMjYsMjU5NSwyMzM0LCA2MDMsIDY1MSwgIDY5LCA3MDEsIDI2OCwyNjYyLDM0MTEsMjU1NSwxMzgwLDE2MDYsIDUwMywKIDQ0OCwgMjU0LDIzNzEsMjY0NiwgNTc0LDExODcsMjMwOSwxNzcwLCAzMjIsMjIzNSwxMjkyLDE4MDEsIDMwNSwgNTY2LDExMzMsIDIyOSwKMjA2NywyMDU3LCA3MDYsIDE2NywgNDgzLDIwMDIsMjY3MiwzMjk1LDE4MjAsMzU2MSwzMDY3LCAzMTYsIDM3OCwyNzQ2LDM0NTIsMTExMiwKIDEzNiwxOTgxLCA1MDcsMTY1MSwyOTE3LDExMTcsIDI4NSw0NTkxLCAxODIsMjU4MCwzNTIyLDEzMDQsIDMzNSwzMzAzLDE4MzUsMjUwNCwKMTc5NSwxNzkyLDIyNDgsIDY3NCwxMDE4LDIxMDYsMjQ0OSwxODU3LDIyOTIsMjg0NSwgOTc2LDMwNDcsMTc4MSwyNjAwLDI3MjcsMTM4OSwKMTI4MSwgIDUyLDMxNTIsIDE1MywgMjY1LDM5NTAsIDY3MiwzNDg1LDM5NTEsNDQ2MywgNDMwLDExODMsIDM2NSwgMjc4LDIxNjksICAyNywKMTQwNywxMzM2LDIzMDQsIDIwOSwxMzQwLDE3MzAsMjIwMiwxODUyLDI0MDMsMjg4MywgOTc5LDE3MzcsMTA2MiwgNjMxLDI4MjksMjU0MiwKMzg3NiwyNTkyLCA4MjUsMjA4NiwyMjI2LDMwNDgsMzYyNSwgMzUyLDE0MTcsMzcyNCwgNTQyLCA5OTEsIDQzMSwxMzUxLDM5MzgsMTg2MSwKMjI5NCwgODI2LDEzNjEsMjkyNywzMTQyLDM1MDMsMTczOCwgNDYzLDI0NjIsMjcyMywgNTgyLDE5MTYsMTU5NSwyODA4LCA0MDAsMzg0NSwKMzg5MSwyODY4LDM2MjEsMjI1NCwgIDU4LDI0OTIsMTEyMywgOTEwLDIxNjAsMjYxNCwxMzcyLDE2MDMsMTE5NiwxMDcyLDMzODUsMTcwMCwKMzI2NywxOTgwLCA2OTYsIDQ4MCwyNDMwLCA5MjAsIDc5OSwxNTcwLDI5MjAsMTk1MSwyMDQxLDQwNDcsMjU0MCwxMzIxLDQyMjMsMjQ2OSwKMzU2MiwyMjI4LDEyNzEsMjYwMiwgNDAxLDI4MzMsMzM1MSwyNTc1LDUxNTcsIDkwNywyMzEyLDEyNTYsIDQxMCwgMjYzLDM1MDcsMTU4MiwKIDk5NiwgNjc4LDE4NDksMjMxNiwxNDgwLCA5MDgsMzU0NSwyMjM3LCA3MDMsMjMyMiwgNjY3LDE4MjYsMjg0OSwxNTMxLDI2MDQsMjk5OSwKMjQwNywzMTQ2LDIxNTEsMjYzMCwxNzg2LDM3MTEsIDQ2OSwzNTQyLCA0OTcsMzg5OSwyNDA5LCA4NTgsIDgzNyw0NDQ2LDMzOTMsMTI3NCwKIDc4NiwgNjIwLDE4NDUsMjAwMSwzMzExLCA0ODQsIDMwOCwzMzY3LDEyMDQsMTgxNSwzNjkxLDIzMzIsMTUzMiwyNTU3LDE4NDIsMjAyMCwKMjcyNCwxOTI3LDIzMzMsNDQ0MCwgNTY3LCAgMjIsMTY3MywyNzI4LDQ0NzUsMTk4NywxODU4LDExNDQsMTU5NywgMTAxLDE4MzIsMzYwMSwKICAxMiwgOTc0LDM3ODMsNDM5MSwgOTUxLDE0MTIsICAgMSwzNzIwLCA0NTMsNDYwOCw0MDQxLCA1MjgsMTA0MSwxMDI3LDMyMzAsMjYyOCwKMTEyOSwgODc1LDEwNTEsMzI5MSwxMjAzLDIyNjIsMTA2OSwyODYwLDI3OTksMjE0OSwyNjE1LDMyNzgsIDE0NCwxNzU4LDMwNDAsICAzMSwKIDQ3NSwxNjgwLCAzNjYsMjY4NSwzMTg0LCAzMTEsMTY0Miw0MDA4LDI0NjYsNTAzNiwxNTkzLDE0OTMsMjgwOSwgMjE2LDE0MjAsMTY2OCwKIDIzMywgMzA0LDIxMjgsMzI4NCwgMjMyLDE0MjksMTc2OCwxMDQwLDIwMDgsMzQwNywyNzQwLDI5NjcsMjU0MywgMjQyLDIxMzMsIDc3OCwKMTU2NSwyMDIyLDI2MjAsIDUwNSwyMTg5LDI3NTYsMTA5OCwyMjczLCAzNzIsMTYxNCwgNzA4LCA1NTMsMjg0NiwyMDk0LDIyNzgsIDE2OSwKMzYyNiwyODM1LDQxNjEsIDIyOCwyNjc0LDMxNjUsIDgwOSwxNDU0LDEzMDksIDQ2NiwxNzA1LDEwOTUsIDkwMCwzNDIzLCA4ODAsMjY2NywKMzc1MSw1MjU4LDIzMTcsMzEwOSwyNTcxLDQzMTcsMjc2NiwxNTAzLDEzNDIsIDg2Niw0NDQ3LDExMTgsICA2MywyMDc2LCAzMTQsMTg4MSwKMTM0OCwxMDYxLCAxNzIsIDk3OCwzNTE1LDE3NDcsIDUzMiwgNTExLDM5NzAsICAgNiwgNjAxLCA5MDUsMjY5OSwzMzAwLDE3NTEsIDI3NiwKMTQ2NywzNzI1LDI2NjgsICA2NSw0MjM5LDI1NDQsMjc3OSwyNTU2LDE2MDQsIDU3OCwyNDUxLDE4MDIsIDk5MiwyMzMxLDI2MjQsMTMyMCwKMzQ0NiwgNzEzLDE1MTMsMTAxMywgMTAzLDI3ODYsMjQ0NywxNjYxLCA4ODYsMTcwMiwgOTE2LCA2NTQsMzU3NCwyMDMxLDE1NTYsIDc1MSwKMjE3OCwyODIxLDIxNzksMTQ5OCwxNTM4LDIxNzYsIDI3MSwgOTE0LDIyNTEsMjA4MCwxMzI1LCA2MzgsMTk1MywyOTM3LDM4NzcsMjQzMiwKMjc1NCwgIDk1LDMyNjUsMTcxNiwgMjYwLDEyMjcsNDA4MywgNzc1LCAxMDYsMTM1NywzMjU0LCA0MjYsMTYwNywgNTU1LDI0ODAsIDc3MiwKMTk4NSwgMjQ0LDI1NDYsIDQ3NCwgNDk1LDEwNDYsMjYxMSwxODUxLDIwNjEsICA3MSwyMDg5LDE2NzUsMjU5MCwgNzQyLDM3NTgsMjg0MywKMzIyMiwxNDMzLCAyNjcsMjE4MCwyNTc2LDI4MjYsMjIzMywyMDkyLDM5MTMsMjQzNSwgOTU2LDE3NDUsMzA3NSwgODU2LDIxMTMsMTExNiwKIDQ1MSwgICAzLDE5ODgsMjg5NiwxMzk4LCA5OTMsMjQ2MywxODc4LDIwNDksMTM0MSwyNzE4LDI3MjEsMjg3MCwyMTA4LCA3MTIsMjkwNCwKNDM2MywyNzUzLDIzMjQsIDI3NywyODcyLDIzNDksMjY0OSwgMzg0LCA5ODcsIDQzNSwgNjkxLDMwMDAsIDkyMiwgMTY0LDM5MzksIDY1MiwKMTUwMCwxMTg0LDQxNTMsMjQ4MiwzMzczLDIxNjUsNDg0OCwyMzM1LDM3NzUsMzUwOCwzMTU0LDI4MDYsMjgzMCwxNTU0LDIxMDIsMTY2NCwKMjUzMCwxNDM0LDI0MDgsIDg5MywxNTQ3LDI2MjMsMzQ0NywyODMyLDIyNDIsMjUzMiwzMTY5LDI4NTYsMzIyMywyMDc4LCAgNDksMzc3MCwKMzQ2OSwgNDYyLCAzMTgsIDY1NiwyMjU5LDMyNTAsMzA2OSwgNjc5LDE2MjksMjc1OCwgMzQ0LDExMzgsMTEwNCwzMTIwLDE4MzYsMTI4MywKMzExNSwyMTU0LDE0MzcsNDQ0OCwgOTM0LCA3NTksMTk5OSwgNzk0LDI4NjIsMTAzOCwgNTMzLDI1NjAsMTcyMiwyMzQyLCA4NTUsMjYyNiwKMTE5NywxNjYzLDQ0NzYsMzEyNywgIDg1LDQyNDAsMjUyOCwgIDI1LDExMTEsMTE4MSwzNjczLCA0MDcsMzQ3MCw0NTYxLDI2NzksMjcxMywKIDc2OCwxOTI1LDI4NDEsMzk4NiwxNTQ0LDExNjUsIDkzMiwgMzczLDEyNDAsMjE0NiwxOTMwLDI2NzMsIDcyMSw0NzY2LCAzNTQsNDMzMywKIDM5MSwyOTYzLCAxODcsICA2MSwzMzY0LDE0NDIsMTEwMiwgMzMwLDE5NDAsMTc2NywgMzQxLDM4MDksNDExOCwgMzkzLDI0OTYsMjA2MiwKMjIxMSwgMTA1LCAzMzEsIDMwMCwgNDM5LCA5MTMsMTMzMiwgNjI2LCAzNzksMzMwNCwxNTU3LCAzMjgsIDY4OSwzOTUyLCAzMDksMTU1NSwKIDkzMSwgMzE3LDI1MTcsMzAyNywgMzI1LCA1NjksIDY4NiwyMTA3LDMwODQsICA2MCwxMDQyLDEzMzMsMjc5NCwgMjY0LDMxNzcsNDAxNCwKMTYyOCwgMjU4LDM3MTIsICAgNyw0NDY0LDExNzYsMTA0MywxNzc4LCA2ODMsIDExNCwxOTc1LCAgNzgsMTQ5MiwgMzgzLDE4ODYsIDUxMCwKIDM4NiwgNjQ1LDUyOTEsMjg5MSwyMDY5LDMzMDUsNDEzOCwzODY3LDI5MzksMjYwMywyNDkzLDE5MzUsMTA2NiwxODQ4LDM1ODgsMTAxNSwKMTI4MiwxMjg5LDQ2MDksIDY5NywxNDUzLDMwNDQsMjY2NiwzNjExLDE4NTYsMjQxMiwgIDU0LCA3MTksMTMzMCwgNTY4LDM3NzgsMjQ1OSwKMTc0OCwgNzg4LCA0OTIsIDU1MSwxMTkxLDEwMDAsIDQ4OCwzMzk0LDM3NjMsIDI4MiwxNzk5LCAzNDgsMjAxNiwxNTIzLDMxNTUsMjM5MCwKMTA0OSwgMzgyLDIwMTksMTc4OCwxMTcwLCA3MjksMjk2OCwzNTIzLCA4OTcsMzkyNiwyNzg1LDI5MzgsMzI5MiwgMzUwLDIzMTksMzIzOCwKMTcxOCwxNzE3LDI2NTUsMzQ1MywzMTQzLDQ0NjUsIDE2MSwyODg5LDI5ODAsMjAwOSwxNDIxLCAgNTYsMTkwOCwxNjQwLDIzODcsMjIzMiwKMTkxNywxODc0LDI0NzcsNDkyMSwgMTQ4LCAgODMsMzQzOCwgNTkyLDQyNDUsMjg4MiwxODIyLDEwNTUsIDc0MSwgMTE1LDE0OTYsMTYyNCwKIDM4MSwxNjM4LDQ1OTIsMTAyMCwgNTE2LDMyMTQsIDQ1OCwgOTQ3LDQ1NzUsMTQzMiwgMjExLDE1MTQsMjkyNiwxODY1LDIxNDIsIDE4OSwKIDg1MiwxMjIxLDE0MDAsMTQ4NiwgODgyLDIyOTksNDAzNiwgMzUxLCAgMjgsMTEyMiwgNzAwLDY0NzksNjQ4MCw2NDgxLDY0ODIsNjQ4MywgICNsYXN0IDUxMgopCgpQSwMEFAAAAAAAAAAhAH6r/o/aBgAA2gYAADMAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9nYjIzMTJwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAubWJjaGFyc2V0cHJvYmVyIGltcG9ydCBNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyCmZyb20gLmNvZGluZ3N0YXRlbWFjaGluZSBpbXBvcnQgQ29kaW5nU3RhdGVNYWNoaW5lCmZyb20gLmNoYXJkaXN0cmlidXRpb24gaW1wb3J0IEdCMjMxMkRpc3RyaWJ1dGlvbkFuYWx5c2lzCmZyb20gLm1iY3NzbSBpbXBvcnQgR0IyMzEyX1NNX01PREVMCgpjbGFzcyBHQjIzMTJQcm9iZXIoTXVsdGlCeXRlQ2hhclNldFByb2Jlcik6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoR0IyMzEyUHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb2Rpbmdfc20gPSBDb2RpbmdTdGF0ZU1hY2hpbmUoR0IyMzEyX1NNX01PREVMKQogICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyID0gR0IyMzEyRGlzdHJpYnV0aW9uQW5hbHlzaXMoKQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gIkdCMjMxMiIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gIkNoaW5lc2UiClBLAwQUAAAAAAAAACEADSnTsg42AAAONgAAMwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2hlYnJld3Byb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgVW5pdmVyc2FsIGNoYXJzZXQgZGV0ZWN0b3IgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojICAgICAgICAgIFNoeSBTaGFsb20KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDA1CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5jaGFyc2V0cHJvYmVyIGltcG9ydCBDaGFyU2V0UHJvYmVyCmZyb20gLmVudW1zIGltcG9ydCBQcm9iaW5nU3RhdGUKCiMgVGhpcyBwcm9iZXIgZG9lc24ndCBhY3R1YWxseSByZWNvZ25pemUgYSBsYW5ndWFnZSBvciBhIGNoYXJzZXQuCiMgSXQgaXMgYSBoZWxwZXIgcHJvYmVyIGZvciB0aGUgdXNlIG9mIHRoZSBIZWJyZXcgbW9kZWwgcHJvYmVycwoKIyMjIEdlbmVyYWwgaWRlYXMgb2YgdGhlIEhlYnJldyBjaGFyc2V0IHJlY29nbml0aW9uICMjIwojCiMgRm91ciBtYWluIGNoYXJzZXRzIGV4aXN0IGluIEhlYnJldzoKIyAiSVNPLTg4NTktOCIgLSBWaXN1YWwgSGVicmV3CiMgIndpbmRvd3MtMTI1NSIgLSBMb2dpY2FsIEhlYnJldwojICJJU08tODg1OS04LUkiIC0gTG9naWNhbCBIZWJyZXcKIyAieC1tYWMtaGVicmV3IiAtID8/IExvZ2ljYWwgSGVicmV3ID8/CiMKIyBCb3RoICJJU08iIGNoYXJzZXRzIHVzZSBhIGNvbXBsZXRlbHkgaWRlbnRpY2FsIHNldCBvZiBjb2RlIHBvaW50cywgd2hlcmVhcwojICJ3aW5kb3dzLTEyNTUiIGFuZCAieC1tYWMtaGVicmV3IiBhcmUgdHdvIGRpZmZlcmVudCBwcm9wZXIgc3VwZXJzZXRzIG9mCiMgdGhlc2UgY29kZSBwb2ludHMuIHdpbmRvd3MtMTI1NSBkZWZpbmVzIGFkZGl0aW9uYWwgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UKIyAweDgwLTB4OUYgYXMgc29tZSBtaXNjIHB1bmN0dWF0aW9uIG1hcmtzIGFzIHdlbGwgYXMgc29tZSBIZWJyZXctc3BlY2lmaWMKIyBkaWFjcml0aWNzIGFuZCBhZGRpdGlvbmFsICdZaWRkaXNoJyBsaWdhdHVyZSBsZXR0ZXJzIGluIHRoZSByYW5nZSAweGMwLTB4ZDYuCiMgeC1tYWMtaGVicmV3IGRlZmluZXMgc2ltaWxhciBhZGRpdGlvbmFsIGNvZGUgcG9pbnRzIGJ1dCB3aXRoIGEgZGlmZmVyZW50CiMgbWFwcGluZy4KIwojIEFzIGZhciBhcyBhbiBhdmVyYWdlIEhlYnJldyB0ZXh0IHdpdGggbm8gZGlhY3JpdGljcyBpcyBjb25jZXJuZWQsIGFsbCBmb3VyCiMgY2hhcnNldHMgYXJlIGlkZW50aWNhbCB3aXRoIHJlc3BlY3QgdG8gY29kZSBwb2ludHMuIE1lYW5pbmcgdGhhdCBmb3IgdGhlCiMgbWFpbiBIZWJyZXcgYWxwaGFiZXQsIGFsbCBmb3VyIG1hcCB0aGUgc2FtZSB2YWx1ZXMgdG8gYWxsIDI3IEhlYnJldyBsZXR0ZXJzCiMgKGluY2x1ZGluZyBmaW5hbCBsZXR0ZXJzKS4KIwojIFRoZSBkb21pbmFudCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlc2UgY2hhcnNldHMgaXMgdGhlaXIgZGlyZWN0aW9uYWxpdHkuCiMgIlZpc3VhbCIgZGlyZWN0aW9uYWxpdHkgbWVhbnMgdGhhdCB0aGUgdGV4dCBpcyBvcmRlcmVkIGFzIGlmIHRoZSByZW5kZXJlciBpcwojIG5vdCBhd2FyZSBvZiBhIEJJREkgcmVuZGVyaW5nIGFsZ29yaXRobS4gVGhlIHJlbmRlcmVyIHNlZXMgdGhlIHRleHQgYW5kCiMgZHJhd3MgaXQgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBUaGUgdGV4dCBpdHNlbGYgd2hlbiBvcmRlcmVkIG5hdHVyYWxseSBpcyByZWFkCiMgYmFja3dhcmRzLiBBIGJ1ZmZlciBvZiBWaXN1YWwgSGVicmV3IGdlbmVyYWxseSBsb29rcyBsaWtlIHNvOgojICJbbGFzdCB3b3JkIG9mIGZpcnN0IGxpbmUgc3BlbGxlZCBiYWNrd2FyZHNdIFt3aG9sZSBsaW5lIG9yZGVyZWQgYmFja3dhcmRzCiMgYW5kIHNwZWxsZWQgYmFja3dhcmRzXSBbZmlyc3Qgd29yZCBvZiBmaXJzdCBsaW5lIHNwZWxsZWQgYmFja3dhcmRzXQojIFtlbmQgb2YgbGluZV0gW2xhc3Qgd29yZCBvZiBzZWNvbmQgbGluZV0gLi4uIGV0YycgIgojIGFkZGluZyBwdW5jdHVhdGlvbiBtYXJrcywgbnVtYmVycyBhbmQgRW5nbGlzaCB0ZXh0IHRvIHZpc3VhbCB0ZXh0IGlzCiMgbmF0dXJhbGx5IGFsc28gInZpc3VhbCIgYW5kIGZyb20gbGVmdCB0byByaWdodC4KIwojICJMb2dpY2FsIiBkaXJlY3Rpb25hbGl0eSBtZWFucyB0aGUgdGV4dCBpcyBvcmRlcmVkICJuYXR1cmFsbHkiIGFjY29yZGluZyB0bwojIHRoZSBvcmRlciBpdCBpcyByZWFkLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHJlbmRlcmVyIHRvIGRpc3BsYXkKIyB0aGUgdGV4dCBmcm9tIHJpZ2h0IHRvIGxlZnQuIEEgQklESSBhbGdvcml0aG0gaXMgdXNlZCB0byBwbGFjZSBnZW5lcmFsCiMgcHVuY3R1YXRpb24gbWFya3MsIG51bWJlcnMgYW5kIEVuZ2xpc2ggdGV4dCBpbiB0aGUgdGV4dC4KIwojIFRleHRzIGluIHgtbWFjLWhlYnJldyBhcmUgYWxtb3N0IGltcG9zc2libGUgdG8gZmluZCBvbiB0aGUgSW50ZXJuZXQuIEZyb20KIyB3aGF0IGxpdHRsZSBldmlkZW5jZSBJIGNvdWxkIGZpbmQsIGl0IHNlZW1zIHRoYXQgaXRzIGdlbmVyYWwgZGlyZWN0aW9uYWxpdHkKIyBpcyBMb2dpY2FsLgojCiMgVG8gc3VtIHVwIGFsbCBvZiB0aGUgYWJvdmUsIHRoZSBIZWJyZXcgcHJvYmluZyBtZWNoYW5pc20ga25vd3MgYWJvdXQgdHdvCiMgY2hhcnNldHM6CiMgVmlzdWFsIEhlYnJldyAtICJJU08tODg1OS04IiAtIGJhY2t3YXJkcyB0ZXh0IC0gV29yZHMgYW5kIHNlbnRlbmNlcyBhcmUKIyAgICBiYWNrd2FyZHMgd2hpbGUgbGluZSBvcmRlciBpcyBuYXR1cmFsLiBGb3IgY2hhcnNldCByZWNvZ25pdGlvbiBwdXJwb3NlcwojICAgIHRoZSBsaW5lIG9yZGVyIGlzIHVuaW1wb3J0YW50IChJbiBmYWN0LCBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiwgZXZlbgojICAgIHdvcmQgb3JkZXIgaXMgdW5pbXBvcnRhbnQpLgojIExvZ2ljYWwgSGVicmV3IC0gIndpbmRvd3MtMTI1NSIgLSBub3JtYWwsIG5hdHVyYWxseSBvcmRlcmVkIHRleHQuCiMKIyAiSVNPLTg4NTktOC1JIiBpcyBhIHN1YnNldCBvZiB3aW5kb3dzLTEyNTUgYW5kIGRvZXNuJ3QgbmVlZCB0byBiZQojICAgIHNwZWNpZmljYWxseSBpZGVudGlmaWVkLgojICJ4LW1hYy1oZWJyZXciIGlzIGFsc28gaWRlbnRpZmllZCBhcyB3aW5kb3dzLTEyNTUuIEEgdGV4dCBpbiB4LW1hYy1oZWJyZXcKIyAgICB0aGF0IGNvbnRhaW4gc3BlY2lhbCBwdW5jdHVhdGlvbiBtYXJrcyBvciBkaWFjcml0aWNzIGlzIGRpc3BsYXllZCB3aXRoCiMgICAgc29tZSB1bmNvbnZlcnRlZCBjaGFyYWN0ZXJzIHNob3dpbmcgYXMgcXVlc3Rpb24gbWFya3MuIFRoaXMgcHJvYmxlbSBtaWdodAojICAgIGJlIGNvcnJlY3RlZCB1c2luZyBhbm90aGVyIG1vZGVsIHByb2JlciBmb3IgeC1tYWMtaGVicmV3LiBEdWUgdG8gdGhlIGZhY3QKIyAgICB0aGF0IHgtbWFjLWhlYnJldyB0ZXh0cyBhcmUgc28gcmFyZSwgd3JpdGluZyBhbm90aGVyIG1vZGVsIHByb2JlciBpc24ndAojICAgIHdvcnRoIHRoZSBlZmZvcnQgYW5kIHBlcmZvcm1hbmNlIGhpdC4KIwojIyMjIFRoZSBQcm9iZXIgIyMjIwojCiMgVGhlIHByb2JlciBpcyBkaXZpZGVkIGJldHdlZW4gdHdvIFNCQ2hhclNldFByb2JlcnMgYW5kIGEgSGVicmV3UHJvYmVyLAojIGFsbCBvZiB3aGljaCBhcmUgbWFuYWdlZCwgY3JlYXRlZCwgZmVkIGRhdGEsIGlucXVpcmVkIGFuZCBkZWxldGVkIGJ5IHRoZQojIFNCQ1NHcm91cFByb2Jlci4gVGhlIHR3byBTQkNoYXJTZXRQcm9iZXJzIGlkZW50aWZ5IHRoYXQgdGhlIHRleHQgaXMgaW4KIyBmYWN0IHNvbWUga2luZCBvZiBIZWJyZXcsIExvZ2ljYWwgb3IgVmlzdWFsLiBUaGUgZmluYWwgZGVjaXNpb24gYWJvdXQgd2hpY2gKIyBvbmUgaXMgaXQgaXMgbWFkZSBieSB0aGUgSGVicmV3UHJvYmVyIGJ5IGNvbWJpbmluZyBmaW5hbC1sZXR0ZXIgc2NvcmVzCiMgd2l0aCB0aGUgc2NvcmVzIG9mIHRoZSB0d28gU0JDaGFyU2V0UHJvYmVycyB0byBwcm9kdWNlIGEgZmluYWwgYW5zd2VyLgojCiMgVGhlIFNCQ1NHcm91cFByb2JlciBpcyByZXNwb25zaWJsZSBmb3Igc3RyaXBwaW5nIHRoZSBvcmlnaW5hbCB0ZXh0IG9mIEhUTUwKIyB0YWdzLCBFbmdsaXNoIGNoYXJhY3RlcnMsIG51bWJlcnMsIGxvdy1BU0NJSSBwdW5jdHVhdGlvbiBjaGFyYWN0ZXJzLCBzcGFjZXMKIyBhbmQgbmV3IGxpbmVzLiBJdCByZWR1Y2VzIGFueSBzZXF1ZW5jZSBvZiBzdWNoIGNoYXJhY3RlcnMgdG8gYSBzaW5nbGUgc3BhY2UuCiMgVGhlIGJ1ZmZlciBmZWQgdG8gZWFjaCBwcm9iZXIgaW4gdGhlIFNCQ1MgZ3JvdXAgcHJvYmVyIGlzIHB1cmUgdGV4dCBpbgojIGhpZ2gtQVNDSUkuCiMgVGhlIHR3byBTQkNoYXJTZXRQcm9iZXJzIChtb2RlbCBwcm9iZXJzKSBzaGFyZSB0aGUgc2FtZSBsYW5ndWFnZSBtb2RlbDoKIyBXaW4xMjU1TW9kZWwuCiMgVGhlIGZpcnN0IFNCQ2hhclNldFByb2JlciB1c2VzIHRoZSBtb2RlbCBub3JtYWxseSBhcyBhbnkgb3RoZXIKIyBTQkNoYXJTZXRQcm9iZXIgZG9lcywgdG8gcmVjb2duaXplIHdpbmRvd3MtMTI1NSwgdXBvbiB3aGljaCB0aGlzIG1vZGVsIHdhcwojIGJ1aWx0LiBUaGUgc2Vjb25kIFNCQ2hhclNldFByb2JlciBpcyB0b2xkIHRvIG1ha2UgdGhlIHBhaXItb2YtbGV0dGVyCiMgbG9va3VwIGluIHRoZSBsYW5ndWFnZSBtb2RlbCBiYWNrd2FyZHMuIFRoaXMgaW4gcHJhY3RpY2UgZXhhY3RseSBzaW11bGF0ZXMKIyBhIHZpc3VhbCBIZWJyZXcgbW9kZWwgdXNpbmcgdGhlIHdpbmRvd3MtMTI1NSBsb2dpY2FsIEhlYnJldyBtb2RlbC4KIwojIFRoZSBIZWJyZXdQcm9iZXIgaXMgbm90IHVzaW5nIGFueSBsYW5ndWFnZSBtb2RlbC4gQWxsIGl0IGRvZXMgaXMgbG9vayBmb3IKIyBmaW5hbC1sZXR0ZXIgZXZpZGVuY2Ugc3VnZ2VzdGluZyB0aGUgdGV4dCBpcyBlaXRoZXIgbG9naWNhbCBIZWJyZXcgb3IgdmlzdWFsCiMgSGVicmV3LiBEaXNqb2ludGVkIGZyb20gdGhlIG1vZGVsIHByb2JlcnMsIHRoZSByZXN1bHRzIG9mIHRoZSBIZWJyZXdQcm9iZXIKIyBhbG9uZSBhcmUgbWVhbmluZ2xlc3MuIEhlYnJld1Byb2JlciBhbHdheXMgcmV0dXJucyAwLjAwIGFzIGNvbmZpZGVuY2UKIyBzaW5jZSBpdCBuZXZlciBpZGVudGlmaWVzIGEgY2hhcnNldCBieSBpdHNlbGYuIEluc3RlYWQsIHRoZSBwb2ludGVyIHRvIHRoZQojIEhlYnJld1Byb2JlciBpcyBwYXNzZWQgdG8gdGhlIG1vZGVsIHByb2JlcnMgYXMgYSBoZWxwZXIgIk5hbWUgUHJvYmVyIi4KIyBXaGVuIHRoZSBHcm91cCBwcm9iZXIgcmVjZWl2ZXMgYSBwb3NpdGl2ZSBpZGVudGlmaWNhdGlvbiBmcm9tIGFueSBwcm9iZXIsCiMgaXQgYXNrcyBmb3IgdGhlIG5hbWUgb2YgdGhlIGNoYXJzZXQgaWRlbnRpZmllZC4gSWYgdGhlIHByb2JlciBxdWVyaWVkIGlzIGEKIyBIZWJyZXcgbW9kZWwgcHJvYmVyLCB0aGUgbW9kZWwgcHJvYmVyIGZvcndhcmRzIHRoZSBjYWxsIHRvIHRoZQojIEhlYnJld1Byb2JlciB0byBtYWtlIHRoZSBmaW5hbCBkZWNpc2lvbi4gSW4gdGhlIEhlYnJld1Byb2JlciwgdGhlCiMgZGVjaXNpb24gaXMgbWFkZSBhY2NvcmRpbmcgdG8gdGhlIGZpbmFsLWxldHRlcnMgc2NvcmVzIG1haW50YWluZWQgYW5kIEJvdGgKIyBtb2RlbCBwcm9iZXJzIHNjb3Jlcy4gVGhlIGFuc3dlciBpcyByZXR1cm5lZCBpbiB0aGUgZm9ybSBvZiB0aGUgbmFtZSBvZiB0aGUKIyBjaGFyc2V0IGlkZW50aWZpZWQsIGVpdGhlciAid2luZG93cy0xMjU1IiBvciAiSVNPLTg4NTktOCIuCgpjbGFzcyBIZWJyZXdQcm9iZXIoQ2hhclNldFByb2Jlcik6CiAgICAjIHdpbmRvd3MtMTI1NSAvIElTTy04ODU5LTggY29kZSBwb2ludHMgb2YgaW50ZXJlc3QKICAgIEZJTkFMX0tBRiA9IDB4ZWEKICAgIE5PUk1BTF9LQUYgPSAweGViCiAgICBGSU5BTF9NRU0gPSAweGVkCiAgICBOT1JNQUxfTUVNID0gMHhlZQogICAgRklOQUxfTlVOID0gMHhlZgogICAgTk9STUFMX05VTiA9IDB4ZjAKICAgIEZJTkFMX1BFID0gMHhmMwogICAgTk9STUFMX1BFID0gMHhmNAogICAgRklOQUxfVFNBREkgPSAweGY1CiAgICBOT1JNQUxfVFNBREkgPSAweGY2CgogICAgIyBNaW5pbXVtIFZpc3VhbCB2cyBMb2dpY2FsIGZpbmFsIGxldHRlciBzY29yZSBkaWZmZXJlbmNlLgogICAgIyBJZiB0aGUgZGlmZmVyZW5jZSBpcyBiZWxvdyB0aGlzLCBkb24ndCByZWx5IHNvbGVseSBvbiB0aGUgZmluYWwgbGV0dGVyIHNjb3JlCiAgICAjIGRpc3RhbmNlLgogICAgTUlOX0ZJTkFMX0NIQVJfRElTVEFOQ0UgPSA1CgogICAgIyBNaW5pbXVtIFZpc3VhbCB2cyBMb2dpY2FsIG1vZGVsIHNjb3JlIGRpZmZlcmVuY2UuCiAgICAjIElmIHRoZSBkaWZmZXJlbmNlIGlzIGJlbG93IHRoaXMsIGRvbid0IHJlbHkgYXQgYWxsIG9uIHRoZSBtb2RlbCBzY29yZQogICAgIyBkaXN0YW5jZS4KICAgIE1JTl9NT0RFTF9ESVNUQU5DRSA9IDAuMDEKCiAgICBWSVNVQUxfSEVCUkVXX05BTUUgPSAiSVNPLTg4NTktOCIKICAgIExPR0lDQUxfSEVCUkVXX05BTUUgPSAid2luZG93cy0xMjU1IgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihIZWJyZXdQcm9iZXIsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLl9maW5hbF9jaGFyX2xvZ2ljYWxfc2NvcmUgPSBOb25lCiAgICAgICAgc2VsZi5fZmluYWxfY2hhcl92aXN1YWxfc2NvcmUgPSBOb25lCiAgICAgICAgc2VsZi5fcHJldiA9IE5vbmUKICAgICAgICBzZWxmLl9iZWZvcmVfcHJldiA9IE5vbmUKICAgICAgICBzZWxmLl9sb2dpY2FsX3Byb2JlciA9IE5vbmUKICAgICAgICBzZWxmLl92aXN1YWxfcHJvYmVyID0gTm9uZQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLl9maW5hbF9jaGFyX2xvZ2ljYWxfc2NvcmUgPSAwCiAgICAgICAgc2VsZi5fZmluYWxfY2hhcl92aXN1YWxfc2NvcmUgPSAwCiAgICAgICAgIyBUaGUgdHdvIGxhc3QgY2hhcmFjdGVycyBzZWVuIGluIHRoZSBwcmV2aW91cyBidWZmZXIsCiAgICAgICAgIyBtUHJldiBhbmQgbUJlZm9yZVByZXYgYXJlIGluaXRpYWxpemVkIHRvIHNwYWNlIGluIG9yZGVyIHRvIHNpbXVsYXRlCiAgICAgICAgIyBhIHdvcmQgZGVsaW1pdGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEKICAgICAgICBzZWxmLl9wcmV2ID0gJyAnCiAgICAgICAgc2VsZi5fYmVmb3JlX3ByZXYgPSAnICcKICAgICAgICAjIFRoZXNlIHByb2JlcnMgYXJlIG93bmVkIGJ5IHRoZSBncm91cCBwcm9iZXIuCgogICAgZGVmIHNldF9tb2RlbF9wcm9iZXJzKHNlbGYsIGxvZ2ljYWxQcm9iZXIsIHZpc3VhbFByb2Jlcik6CiAgICAgICAgc2VsZi5fbG9naWNhbF9wcm9iZXIgPSBsb2dpY2FsUHJvYmVyCiAgICAgICAgc2VsZi5fdmlzdWFsX3Byb2JlciA9IHZpc3VhbFByb2JlcgoKICAgIGRlZiBpc19maW5hbChzZWxmLCBjKToKICAgICAgICByZXR1cm4gYyBpbiBbc2VsZi5GSU5BTF9LQUYsIHNlbGYuRklOQUxfTUVNLCBzZWxmLkZJTkFMX05VTiwKICAgICAgICAgICAgICAgICAgICAgc2VsZi5GSU5BTF9QRSwgc2VsZi5GSU5BTF9UU0FESV0KCiAgICBkZWYgaXNfbm9uX2ZpbmFsKHNlbGYsIGMpOgogICAgICAgICMgVGhlIG5vcm1hbCBUc2FkaSBpcyBub3QgYSBnb29kIE5vbi1GaW5hbCBsZXR0ZXIgZHVlIHRvIHdvcmRzIGxpa2UKICAgICAgICAjICdsZWNob3RldCcgKHRvIGNoYXQpIGNvbnRhaW5pbmcgYW4gYXBvc3Ryb3BoZSBhZnRlciB0aGUgdHNhZGkuIFRoaXMKICAgICAgICAjIGFwb3N0cm9waGUgaXMgY29udmVydGVkIHRvIGEgc3BhY2UgaW4gRmlsdGVyV2l0aG91dEVuZ2xpc2hMZXR0ZXJzCiAgICAgICAgIyBjYXVzaW5nIHRoZSBOb24tRmluYWwgdHNhZGkgdG8gYXBwZWFyIGF0IGFuIGVuZCBvZiBhIHdvcmQgZXZlbgogICAgICAgICMgdGhvdWdoIHRoaXMgaXMgbm90IHRoZSBjYXNlIGluIHRoZSBvcmlnaW5hbCB0ZXh0LgogICAgICAgICMgVGhlIGxldHRlcnMgUGUgYW5kIEthZiByYXJlbHkgZGlzcGxheSBhIHJlbGF0ZWQgYmVoYXZpb3Igb2Ygbm90IGJlaW5nCiAgICAgICAgIyBhIGdvb2QgTm9uLUZpbmFsIGxldHRlci4gV29yZHMgbGlrZSAnUG9wJywgJ1dpbmFtcCcgYW5kICdNdWJhcmFrJwogICAgICAgICMgZm9yIGV4YW1wbGUgbGVnYWxseSBlbmQgd2l0aCBhIE5vbi1GaW5hbCBQZSBvciBLYWYuIEhvd2V2ZXIsIHRoZQogICAgICAgICMgYmVuZWZpdCBvZiB0aGVzZSBsZXR0ZXJzIGFzIE5vbi1GaW5hbCBsZXR0ZXJzIG91dHdlaWdocyB0aGUgZGFtYWdlCiAgICAgICAgIyBzaW5jZSB0aGVzZSB3b3JkcyBhcmUgcXVpdGUgcmFyZS4KICAgICAgICByZXR1cm4gYyBpbiBbc2VsZi5OT1JNQUxfS0FGLCBzZWxmLk5PUk1BTF9NRU0sCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuTk9STUFMX05VTiwgc2VsZi5OT1JNQUxfUEVdCgogICAgZGVmIGZlZWQoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgICMgRmluYWwgbGV0dGVyIGFuYWx5c2lzIGZvciBsb2dpY2FsLXZpc3VhbCBkZWNpc2lvbi4KICAgICAgICAjIExvb2sgZm9yIGV2aWRlbmNlIHRoYXQgdGhlIHJlY2VpdmVkIGJ1ZmZlciBpcyBlaXRoZXIgbG9naWNhbCBIZWJyZXcKICAgICAgICAjIG9yIHZpc3VhbCBIZWJyZXcuCiAgICAgICAgIyBUaGUgZm9sbG93aW5nIGNhc2VzIGFyZSBjaGVja2VkOgogICAgICAgICMgMSkgQSB3b3JkIGxvbmdlciB0aGFuIDEgbGV0dGVyLCBlbmRpbmcgd2l0aCBhIGZpbmFsIGxldHRlci4gVGhpcyBpcwogICAgICAgICMgICAgYW4gaW5kaWNhdGlvbiB0aGF0IHRoZSB0ZXh0IGlzIGxhaWQgb3V0ICJuYXR1cmFsbHkiIHNpbmNlIHRoZQogICAgICAgICMgICAgZmluYWwgbGV0dGVyIHJlYWxseSBhcHBlYXJzIGF0IHRoZSBlbmQuICsxIGZvciBsb2dpY2FsIHNjb3JlLgogICAgICAgICMgMikgQSB3b3JkIGxvbmdlciB0aGFuIDEgbGV0dGVyLCBlbmRpbmcgd2l0aCBhIE5vbi1GaW5hbCBsZXR0ZXIuIEluCiAgICAgICAgIyAgICBub3JtYWwgSGVicmV3LCB3b3JkcyBlbmRpbmcgd2l0aCBLYWYsIE1lbSwgTnVuLCBQZSBvciBUc2FkaSwKICAgICAgICAjICAgIHNob3VsZCBub3QgZW5kIHdpdGggdGhlIE5vbi1GaW5hbCBmb3JtIG9mIHRoYXQgbGV0dGVyLiBFeGNlcHRpb25zCiAgICAgICAgIyAgICB0byB0aGlzIHJ1bGUgYXJlIG1lbnRpb25lZCBhYm92ZSBpbiBpc05vbkZpbmFsKCkuIFRoaXMgaXMgYW4KICAgICAgICAjICAgIGluZGljYXRpb24gdGhhdCB0aGUgdGV4dCBpcyBsYWlkIG91dCBiYWNrd2FyZHMuICsxIGZvciB2aXN1YWwKICAgICAgICAjICAgIHNjb3JlCiAgICAgICAgIyAzKSBBIHdvcmQgbG9uZ2VyIHRoYW4gMSBsZXR0ZXIsIHN0YXJ0aW5nIHdpdGggYSBmaW5hbCBsZXR0ZXIuIEZpbmFsCiAgICAgICAgIyAgICBsZXR0ZXJzIHNob3VsZCBub3QgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSB3b3JkLiBUaGlzIGlzIGFuCiAgICAgICAgIyAgICBpbmRpY2F0aW9uIHRoYXQgdGhlIHRleHQgaXMgbGFpZCBvdXQgYmFja3dhcmRzLiArMSBmb3IgdmlzdWFsCiAgICAgICAgIyAgICBzY29yZS4KICAgICAgICAjCiAgICAgICAgIyBUaGUgdmlzdWFsIHNjb3JlIGFuZCBsb2dpY2FsIHNjb3JlIGFyZSBhY2N1bXVsYXRlZCB0aHJvdWdob3V0IHRoZQogICAgICAgICMgdGV4dCBhbmQgYXJlIGZpbmFsbHkgY2hlY2tlZCBhZ2FpbnN0IGVhY2ggb3RoZXIgaW4gR2V0Q2hhclNldE5hbWUoKS4KICAgICAgICAjIE5vIGNoZWNraW5nIGZvciBmaW5hbCBsZXR0ZXJzIGluIHRoZSBtaWRkbGUgb2Ygd29yZHMgaXMgZG9uZSBzaW5jZQogICAgICAgICMgdGhhdCBjYXNlIGlzIG5vdCBhbiBpbmRpY2F0aW9uIGZvciBlaXRoZXIgTG9naWNhbCBvciBWaXN1YWwgdGV4dC4KICAgICAgICAjCiAgICAgICAgIyBXZSBhdXRvbWF0aWNhbGx5IGZpbHRlciBvdXQgYWxsIDctYml0IGNoYXJhY3RlcnMgKHJlcGxhY2UgdGhlbSB3aXRoCiAgICAgICAgIyBzcGFjZXMpIHNvIHRoZSB3b3JkIGJvdW5kYXJ5IGRldGVjdGlvbiB3b3JrcyBwcm9wZXJseS4gW01BUF0KCiAgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSBQcm9iaW5nU3RhdGUuTk9UX01FOgogICAgICAgICAgICAjIEJvdGggbW9kZWwgcHJvYmVycyBzYXkgaXQncyBub3QgdGhlbS4gTm8gcmVhc29uIHRvIGNvbnRpbnVlLgogICAgICAgICAgICByZXR1cm4gUHJvYmluZ1N0YXRlLk5PVF9NRQoKICAgICAgICBieXRlX3N0ciA9IHNlbGYuZmlsdGVyX2hpZ2hfYnl0ZV9vbmx5KGJ5dGVfc3RyKQoKICAgICAgICBmb3IgY3VyIGluIGJ5dGVfc3RyOgogICAgICAgICAgICBpZiBjdXIgPT0gJyAnOgogICAgICAgICAgICAgICAgIyBXZSBzdGFuZCBvbiBhIHNwYWNlIC0gYSB3b3JkIGp1c3QgZW5kZWQKICAgICAgICAgICAgICAgIGlmIHNlbGYuX2JlZm9yZV9wcmV2ICE9ICcgJzoKICAgICAgICAgICAgICAgICAgICAjIG5leHQtdG8tbGFzdCBjaGFyIHdhcyBub3QgYSBzcGFjZSBzbyBzZWxmLl9wcmV2IGlzIG5vdCBhCiAgICAgICAgICAgICAgICAgICAgIyAxIGxldHRlciB3b3JkCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5pc19maW5hbChzZWxmLl9wcmV2KToKICAgICAgICAgICAgICAgICAgICAgICAgIyBjYXNlICgxKSBbLTI6bm90IHNwYWNlXVstMTpmaW5hbCBsZXR0ZXJdW2N1cjpzcGFjZV0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmluYWxfY2hhcl9sb2dpY2FsX3Njb3JlICs9IDEKICAgICAgICAgICAgICAgICAgICBlbGlmIHNlbGYuaXNfbm9uX2ZpbmFsKHNlbGYuX3ByZXYpOgogICAgICAgICAgICAgICAgICAgICAgICAjIGNhc2UgKDIpIFstMjpub3Qgc3BhY2VdWy0xOk5vbi1GaW5hbCBsZXR0ZXJdWwogICAgICAgICAgICAgICAgICAgICAgICAjICBjdXI6c3BhY2VdCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbmFsX2NoYXJfdmlzdWFsX3Njb3JlICs9IDEKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgTm90IHN0YW5kaW5nIG9uIGEgc3BhY2UKICAgICAgICAgICAgICAgIGlmICgoc2VsZi5fYmVmb3JlX3ByZXYgPT0gJyAnKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuaXNfZmluYWwoc2VsZi5fcHJldikpIGFuZCAoY3VyICE9ICcgJykpOgogICAgICAgICAgICAgICAgICAgICMgY2FzZSAoMykgWy0yOnNwYWNlXVstMTpmaW5hbCBsZXR0ZXJdW2N1cjpub3Qgc3BhY2VdCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmluYWxfY2hhcl92aXN1YWxfc2NvcmUgKz0gMQogICAgICAgICAgICBzZWxmLl9iZWZvcmVfcHJldiA9IHNlbGYuX3ByZXYKICAgICAgICAgICAgc2VsZi5fcHJldiA9IGN1cgoKICAgICAgICAjIEZvcmV2ZXIgZGV0ZWN0aW5nLCB0aWxsIHRoZSBlbmQgb3IgdW50aWwgYm90aCBtb2RlbCBwcm9iZXJzIHJldHVybgogICAgICAgICMgUHJvYmluZ1N0YXRlLk5PVF9NRSAoaGFuZGxlZCBhYm92ZSkKICAgICAgICByZXR1cm4gUHJvYmluZ1N0YXRlLkRFVEVDVElORwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICAjIE1ha2UgdGhlIGRlY2lzaW9uOiBpcyBpdCBMb2dpY2FsIG9yIFZpc3VhbD8KICAgICAgICAjIElmIHRoZSBmaW5hbCBsZXR0ZXIgc2NvcmUgZGlzdGFuY2UgaXMgZG9taW5hbnQgZW5vdWdoLCByZWx5IG9uIGl0LgogICAgICAgIGZpbmFsc3ViID0gc2VsZi5fZmluYWxfY2hhcl9sb2dpY2FsX3Njb3JlIC0gc2VsZi5fZmluYWxfY2hhcl92aXN1YWxfc2NvcmUKICAgICAgICBpZiBmaW5hbHN1YiA+PSBzZWxmLk1JTl9GSU5BTF9DSEFSX0RJU1RBTkNFOgogICAgICAgICAgICByZXR1cm4gc2VsZi5MT0dJQ0FMX0hFQlJFV19OQU1FCiAgICAgICAgaWYgZmluYWxzdWIgPD0gLXNlbGYuTUlOX0ZJTkFMX0NIQVJfRElTVEFOQ0U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLlZJU1VBTF9IRUJSRVdfTkFNRQoKICAgICAgICAjIEl0J3Mgbm90IGRvbWluYW50IGVub3VnaCwgdHJ5IHRvIHJlbHkgb24gdGhlIG1vZGVsIHNjb3JlcyBpbnN0ZWFkLgogICAgICAgIG1vZGVsc3ViID0gKHNlbGYuX2xvZ2ljYWxfcHJvYmVyLmdldF9jb25maWRlbmNlKCkKICAgICAgICAgICAgICAgICAgICAtIHNlbGYuX3Zpc3VhbF9wcm9iZXIuZ2V0X2NvbmZpZGVuY2UoKSkKICAgICAgICBpZiBtb2RlbHN1YiA+IHNlbGYuTUlOX01PREVMX0RJU1RBTkNFOgogICAgICAgICAgICByZXR1cm4gc2VsZi5MT0dJQ0FMX0hFQlJFV19OQU1FCiAgICAgICAgaWYgbW9kZWxzdWIgPCAtc2VsZi5NSU5fTU9ERUxfRElTVEFOQ0U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLlZJU1VBTF9IRUJSRVdfTkFNRQoKICAgICAgICAjIFN0aWxsIG5vIGdvb2QsIGJhY2sgdG8gZmluYWwgbGV0dGVyIGRpc3RhbmNlLCBtYXliZSBpdCdsbCBzYXZlIHRoZQogICAgICAgICMgZGF5LgogICAgICAgIGlmIGZpbmFsc3ViIDwgMC4wOgogICAgICAgICAgICByZXR1cm4gc2VsZi5WSVNVQUxfSEVCUkVXX05BTUUKCiAgICAgICAgIyAoZmluYWxzdWIgPiAwIC0gTG9naWNhbCkgb3IgKGRvbid0IGtub3cgd2hhdCB0byBkbykgZGVmYXVsdCB0bwogICAgICAgICMgTG9naWNhbC4KICAgICAgICByZXR1cm4gc2VsZi5MT0dJQ0FMX0hFQlJFV19OQU1FCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgcmV0dXJuICdIZWJyZXcnCgogICAgQHByb3BlcnR5CiAgICBkZWYgc3RhdGUoc2VsZik6CiAgICAgICAgIyBSZW1haW4gYWN0aXZlIGFzIGxvbmcgYXMgYW55IG9mIHRoZSBtb2RlbCBwcm9iZXJzIGFyZSBhY3RpdmUuCiAgICAgICAgaWYgKHNlbGYuX2xvZ2ljYWxfcHJvYmVyLnN0YXRlID09IFByb2JpbmdTdGF0ZS5OT1RfTUUpIGFuZCBcCiAgICAgICAgICAgKHNlbGYuX3Zpc3VhbF9wcm9iZXIuc3RhdGUgPT0gUHJvYmluZ1N0YXRlLk5PVF9NRSk6CiAgICAgICAgICAgIHJldHVybiBQcm9iaW5nU3RhdGUuTk9UX01FCiAgICAgICAgcmV0dXJuIFByb2JpbmdTdGF0ZS5ERVRFQ1RJTkcKUEsDBBQAAAAAAAAAIQDCGjlhsWQAALFkAAAuAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvamlzZnJlcS5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBTYW1wbGluZyBmcm9tIGFib3V0IDIwTSB0ZXh0IG1hdGVyaWFscyBpbmNsdWRlIGxpdGVyYXR1cmUgYW5kIGNvbXB1dGVyIHRlY2hub2xvZ3kKIwojIEphcGFuZXNlIGZyZXF1ZW5jeSB0YWJsZSwgYXBwbGllZCB0byBib3RoIFMtSklTIGFuZCBFVUMtSlAKIyBUaGV5IGFyZSBzb3J0ZWQgaW4gb3JkZXIuCgojIDEyOCAgLS0+IDAuNzcwOTQKIyAyNTYgIC0tPiAwLjg1NzEwCiMgNTEyICAtLT4gMC45MjYzNQojIDEwMjQgLS0+IDAuOTcxMzAKIyAyMDQ4IC0tPiAwLjk5NDMxCiMKIyBJZGVhbCBEaXN0cmlidXRpb24gUmF0aW8gPSAwLjkyNjM1IC8gKDEtMC45MjYzNSkgPSAxMi41OAojIFJhbmRvbSBEaXN0cmlidXRpb24gUmF0aW9uID0gNTEyIC8gKDI5NjUrNjIrODMrODYtNTEyKSA9IDAuMTkxCiMKIyBUeXBpY2FsIERpc3RyaWJ1dGlvbiBSYXRpbywgMjUlIG9mIElEUgoKSklTX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPID0gMy4wCgojIENoYXIgdG8gRnJlcU9yZGVyIHRhYmxlICwKSklTX1RBQkxFX1NJWkUgPSA0MzY4CgpKSVNfQ0hBUl9UT19GUkVRX09SREVSID0gKAogIDQwLCAgIDEsICAgNiwgMTgyLCAxNTIsIDE4MCwgMjk1LDIxMjcsIDI4NSwgMzgxLDMyOTUsNDMwNCwzMDY4LDQ2MDYsMzE2NSwzNTEwLCAjICAgMTYKMzUxMSwxODIyLDI3ODUsNDYwNywxMTkzLDIyMjYsNTA3MCw0NjA4LCAxNzEsMjk5NiwxMjQ3LCAgMTgsIDE3OSw1MDcxLCA4NTYsMTY2MSwgIyAgIDMyCjEyNjIsNTA3MiwgNjE5LCAxMjcsMzQzMSwzNTEyLDMyMzAsMTg5OSwxNzAwLCAyMzIsIDIyOCwxMjk0LDEyOTgsIDI4NCwgMjgzLDIwNDEsICMgICA0OAoyMDQyLDEwNjEsMTA2MiwgIDQ4LCAgNDksICA0NCwgIDQ1LCA0MzMsIDQzNCwxMDQwLDEwNDEsIDk5NiwgNzg3LDI5OTcsMTI1NSw0MzA1LCAjICAgNjQKMjEwOCw0NjA5LDE2ODQsMTY0OCw1MDczLDUwNzQsNTA3NSw1MDc2LDUwNzcsNTA3OCwzNjg3LDUwNzksNDYxMCw1MDgwLDM5MjcsMzkyOCwgIyAgIDgwCjUwODEsMzI5NiwzNDMyLCAyOTAsMjI4NSwxNDcxLDIxODcsNTA4MiwyNTgwLDI4MjUsMTMwMywyMTQwLDE3MzksMTQ0NSwyNjkxLDMzNzUsICMgICA5NgoxNjkxLDMyOTcsNDMwNiw0MzA3LDQ2MTEsIDQ1MiwzMzc2LDExODIsMjcxMywzNjg4LDMwNjksNDMwOCw1MDgzLDUwODQsNTA4NSw1MDg2LCAjICAxMTIKNTA4Nyw1MDg4LDUwODksNTA5MCw1MDkxLDUwOTIsNTA5Myw1MDk0LDUwOTUsNTA5Niw1MDk3LDUwOTgsNTA5OSw1MTAwLDUxMDEsNTEwMiwgIyAgMTI4CjUxMDMsNTEwNCw1MTA1LDUxMDYsNTEwNyw1MTA4LDUxMDksNTExMCw1MTExLDUxMTIsNDA5Nyw1MTEzLDUxMTQsNTExNSw1MTE2LDUxMTcsICMgIDE0NAo1MTE4LDUxMTksNTEyMCw1MTIxLDUxMjIsNTEyMyw1MTI0LDUxMjUsNTEyNiw1MTI3LDUxMjgsNTEyOSw1MTMwLDUxMzEsNTEzMiw1MTMzLCAjICAxNjAKNTEzNCw1MTM1LDUxMzYsNTEzNyw1MTM4LDUxMzksNTE0MCw1MTQxLDUxNDIsNTE0Myw1MTQ0LDUxNDUsNTE0Niw1MTQ3LDUxNDgsNTE0OSwgIyAgMTc2CjUxNTAsNTE1MSw1MTUyLDQ2MTIsNTE1Myw1MTU0LDUxNTUsNTE1Niw1MTU3LDUxNTgsNTE1OSw1MTYwLDUxNjEsNTE2Miw1MTYzLDUxNjQsICMgIDE5Mgo1MTY1LDUxNjYsNTE2Nyw1MTY4LDUxNjksNTE3MCw1MTcxLDUxNzIsNTE3Myw1MTc0LDUxNzUsMTQ3MiwgNTk4LCA2MTgsIDgyMCwxMjA1LCAjICAyMDgKMTMwOSwxNDEyLDE4NTgsMTMwNywxNjkyLDUxNzYsNTE3Nyw1MTc4LDUxNzksNTE4MCw1MTgxLDUxODIsMTE0MiwxNDUyLDEyMzQsMTE3MiwgIyAgMjI0CjE4NzUsMjA0MywyMTQ5LDE3OTMsMTM4MiwyOTczLCA5MjUsMjQwNCwxMDY3LDEyNDEsIDk2MCwxMzc3LDI5MzUsMTQ5MSwgOTE5LDEyMTcsICMgIDI0MAoxODY1LDIwMzAsMTQwNiwxNDk5LDI3NDksNDA5OCw1MTgzLDUxODQsNTE4NSw1MTg2LDUxODcsNTE4OCwyNTYxLDQwOTksMzExNywxODA0LCAjICAyNTYKMjA0OSwzNjg5LDQzMDksMzUxMywxNjYzLDUxODksMzE2NiwzMTE4LDMyOTgsMTU4NywxNTYxLDM0MzMsNTE5MCwzMTE5LDE2MjUsMjk5OCwgIyAgMjcyCjMyOTksNDYxMywxNzY2LDM2OTAsMjc4Niw0NjE0LDUxOTEsNTE5Miw1MTkzLDUxOTQsMjE2MSwgIDI2LDMzNzcsICAgMiwzOTI5LCAgMjAsICMgIDI4OAozNjkxLCAgNDcsNDEwMCwgIDUwLCAgMTcsICAxNiwgIDM1LCAyNjgsICAyNywgMjQzLCAgNDIsIDE1NSwgIDI0LCAxNTQsICAyOSwgMTg0LCAjICAzMDQKICAgNCwgIDkxLCAgMTQsICA5MiwgIDUzLCAzOTYsICAzMywgMjg5LCAgIDksICAzNywgIDY0LCA2MjAsICAyMSwgIDM5LCAzMjEsICAgNSwgIyAgMzIwCiAgMTIsICAxMSwgIDUyLCAgMTMsICAgMywgMjA4LCAxMzgsICAgMCwgICA3LCAgNjAsIDUyNiwgMTQxLCAxNTEsMTA2OSwgMTgxLCAyNzUsICMgIDMzNgoxNTkxLCAgODMsIDEzMiwxNDc1LCAxMjYsIDMzMSwgODI5LCAgMTUsICA2OSwgMTYwLCAgNTksICAyMiwgMTU3LCAgNTUsMTA3OSwgMzEyLCAjICAzNTIKIDEwOSwgIDM4LCAgMjMsICAyNSwgIDEwLCAgMTksICA3OSw1MTk1LCAgNjEsIDM4MiwxMTI0LCAgIDgsICAzMCw1MTk2LDUxOTcsNTE5OCwgIyAgMzY4CjUxOTksNTIwMCw1MjAxLDUyMDIsNTIwMyw1MjA0LDUyMDUsNTIwNiwgIDg5LCAgNjIsICA3NCwgIDM0LDI0MTYsIDExMiwgMTM5LCAxOTYsICMgIDM4NAogMjcxLCAxNDksICA4NCwgNjA3LCAxMzEsIDc2NSwgIDQ2LCAgODgsIDE1MywgNjgzLCAgNzYsIDg3NCwgMTAxLCAyNTgsICA1NywgIDgwLCAjICA0MDAKICAzMiwgMzY0LCAxMjEsMTUwOCwgMTY5LDE1NDcsICA2OCwgMjM1LCAxNDUsMjk5OSwgIDQxLCAzNjAsMzAyNywgIDcwLCAgNjMsICAzMSwgIyAgNDE2CiAgNDMsIDI1OSwgMjYyLDEzODMsICA5OSwgNTMzLCAxOTQsICA2NiwgIDkzLCA4NDYsIDIxNywgMTkyLCAgNTYsIDEwNiwgIDU4LCA1NjUsICMgIDQzMgogMjgwLCAyNzIsIDMxMSwgMjU2LCAxNDYsICA4MiwgMzA4LCAgNzEsIDEwMCwgMTI4LCAyMTQsIDY1NSwgMTEwLCAyNjEsIDEwNCwxMTQwLCAjICA0NDgKICA1NCwgIDUxLCAgMzYsICA4NywgIDY3LDMwNzAsIDE4NSwyNjE4LDI5MzYsMjAyMCwgIDI4LDEwNjYsMjM5MCwyMDU5LDUyMDcsNTIwOCwgIyAgNDY0CjUyMDksNTIxMCw1MjExLDUyMTIsNTIxMyw1MjE0LDUyMTUsNTIxNiw0NjE1LDUyMTcsNTIxOCw1MjE5LDUyMjAsNTIyMSw1MjIyLDUyMjMsICMgIDQ4MAo1MjI0LDUyMjUsNTIyNiw1MjI3LDUyMjgsNTIyOSw1MjMwLDUyMzEsNTIzMiw1MjMzLDUyMzQsNTIzNSw1MjM2LDM1MTQsNTIzNyw1MjM4LCAjICA0OTYKNTIzOSw1MjQwLDUyNDEsNTI0Miw1MjQzLDUyNDQsMjI5NywyMDMxLDQ2MTYsNDMxMCwzNjkyLDUyNDUsMzA3MSw1MjQ2LDM1OTgsNTI0NywgIyAgNTEyCjQ2MTcsMzIzMSwzNTE1LDUyNDgsNDEwMSw0MzExLDQ2MTgsMzgwOCw0MzEyLDQxMDIsNTI0OSw0MTAzLDQxMDQsMzU5OSw1MjUwLDUyNTEsICMgIDUyOAo1MjUyLDUyNTMsNTI1NCw1MjU1LDUyNTYsNTI1Nyw1MjU4LDUyNTksNTI2MCw1MjYxLDUyNjIsNTI2Myw1MjY0LDUyNjUsNTI2Niw1MjY3LCAjICA1NDQKNTI2OCw1MjY5LDUyNzAsNTI3MSw1MjcyLDUyNzMsNTI3NCw1Mjc1LDUyNzYsNTI3Nyw1Mjc4LDUyNzksNTI4MCw1MjgxLDUyODIsNTI4MywgIyAgNTYwCjUyODQsNTI4NSw1Mjg2LDUyODcsNTI4OCw1Mjg5LDUyOTAsNTI5MSw1MjkyLDUyOTMsNTI5NCw1Mjk1LDUyOTYsNTI5Nyw1Mjk4LDUyOTksICMgIDU3Ngo1MzAwLDUzMDEsNTMwMiw1MzAzLDUzMDQsNTMwNSw1MzA2LDUzMDcsNTMwOCw1MzA5LDUzMTAsNTMxMSw1MzEyLDUzMTMsNTMxNCw1MzE1LCAjICA1OTIKNTMxNiw1MzE3LDUzMTgsNTMxOSw1MzIwLDUzMjEsNTMyMiw1MzIzLDUzMjQsNTMyNSw1MzI2LDUzMjcsNTMyOCw1MzI5LDUzMzAsNTMzMSwgIyAgNjA4CjUzMzIsNTMzMyw1MzM0LDUzMzUsNTMzNiw1MzM3LDUzMzgsNTMzOSw1MzQwLDUzNDEsNTM0Miw1MzQzLDUzNDQsNTM0NSw1MzQ2LDUzNDcsICMgIDYyNAo1MzQ4LDUzNDksNTM1MCw1MzUxLDUzNTIsNTM1Myw1MzU0LDUzNTUsNTM1Niw1MzU3LDUzNTgsNTM1OSw1MzYwLDUzNjEsNTM2Miw1MzYzLCAjICA2NDAKNTM2NCw1MzY1LDUzNjYsNTM2Nyw1MzY4LDUzNjksNTM3MCw1MzcxLDUzNzIsNTM3Myw1Mzc0LDUzNzUsNTM3Niw1Mzc3LDUzNzgsNTM3OSwgIyAgNjU2CjUzODAsNTM4MSwgMzYzLCA2NDIsMjc4NywyODc4LDI3ODgsMjc4OSwyMzE2LDMyMzIsMjMxNywzNDM0LDIwMTEsIDE2NSwxOTQyLDM5MzAsICMgIDY3MgozOTMxLDM5MzIsMzkzMyw1MzgyLDQ2MTksNTM4Myw0NjIwLDUzODQsNTM4NSw1Mzg2LDUzODcsNTM4OCw1Mzg5LDUzOTAsNTM5MSw1MzkyLCAjICA2ODgKNTM5Myw1Mzk0LDUzOTUsNTM5Niw1Mzk3LDUzOTgsNTM5OSw1NDAwLDU0MDEsNTQwMiw1NDAzLDU0MDQsNTQwNSw1NDA2LDU0MDcsNTQwOCwgIyAgNzA0CjU0MDksNTQxMCw1NDExLDU0MTIsNTQxMyw1NDE0LDU0MTUsNTQxNiw1NDE3LDU0MTgsNTQxOSw1NDIwLDU0MjEsNTQyMiw1NDIzLDU0MjQsICMgIDcyMAo1NDI1LDU0MjYsNTQyNyw1NDI4LDU0MjksNTQzMCw1NDMxLDU0MzIsNTQzMyw1NDM0LDU0MzUsNTQzNiw1NDM3LDU0MzgsNTQzOSw1NDQwLCAjICA3MzYKNTQ0MSw1NDQyLDU0NDMsNTQ0NCw1NDQ1LDU0NDYsNTQ0Nyw1NDQ4LDU0NDksNTQ1MCw1NDUxLDU0NTIsNTQ1Myw1NDU0LDU0NTUsNTQ1NiwgIyAgNzUyCjU0NTcsNTQ1OCw1NDU5LDU0NjAsNTQ2MSw1NDYyLDU0NjMsNTQ2NCw1NDY1LDU0NjYsNTQ2Nyw1NDY4LDU0NjksNTQ3MCw1NDcxLDU0NzIsICMgIDc2OAo1NDczLDU0NzQsNTQ3NSw1NDc2LDU0NzcsNTQ3OCw1NDc5LDU0ODAsNTQ4MSw1NDgyLDU0ODMsNTQ4NCw1NDg1LDU0ODYsNTQ4Nyw1NDg4LCAjICA3ODQKNTQ4OSw1NDkwLDU0OTEsNTQ5Miw1NDkzLDU0OTQsNTQ5NSw1NDk2LDU0OTcsNTQ5OCw1NDk5LDU1MDAsNTUwMSw1NTAyLDU1MDMsNTUwNCwgIyAgODAwCjU1MDUsNTUwNiw1NTA3LDU1MDgsNTUwOSw1NTEwLDU1MTEsNTUxMiw1NTEzLDU1MTQsNTUxNSw1NTE2LDU1MTcsNTUxOCw1NTE5LDU1MjAsICMgIDgxNgo1NTIxLDU1MjIsNTUyMyw1NTI0LDU1MjUsNTUyNiw1NTI3LDU1MjgsNTUyOSw1NTMwLDU1MzEsNTUzMiw1NTMzLDU1MzQsNTUzNSw1NTM2LCAjICA4MzIKNTUzNyw1NTM4LDU1MzksNTU0MCw1NTQxLDU1NDIsNTU0Myw1NTQ0LDU1NDUsNTU0Niw1NTQ3LDU1NDgsNTU0OSw1NTUwLDU1NTEsNTU1MiwgIyAgODQ4CjU1NTMsNTU1NCw1NTU1LDU1NTYsNTU1Nyw1NTU4LDU1NTksNTU2MCw1NTYxLDU1NjIsNTU2Myw1NTY0LDU1NjUsNTU2Niw1NTY3LDU1NjgsICMgIDg2NAo1NTY5LDU1NzAsNTU3MSw1NTcyLDU1NzMsNTU3NCw1NTc1LDU1NzYsNTU3Nyw1NTc4LDU1NzksNTU4MCw1NTgxLDU1ODIsNTU4Myw1NTg0LCAjICA4ODAKNTU4NSw1NTg2LDU1ODcsNTU4OCw1NTg5LDU1OTAsNTU5MSw1NTkyLDU1OTMsNTU5NCw1NTk1LDU1OTYsNTU5Nyw1NTk4LDU1OTksNTYwMCwgIyAgODk2CjU2MDEsNTYwMiw1NjAzLDU2MDQsNTYwNSw1NjA2LDU2MDcsNTYwOCw1NjA5LDU2MTAsNTYxMSw1NjEyLDU2MTMsNTYxNCw1NjE1LDU2MTYsICMgIDkxMgo1NjE3LDU2MTgsNTYxOSw1NjIwLDU2MjEsNTYyMiw1NjIzLDU2MjQsNTYyNSw1NjI2LDU2MjcsNTYyOCw1NjI5LDU2MzAsNTYzMSw1NjMyLCAjICA5MjgKNTYzMyw1NjM0LDU2MzUsNTYzNiw1NjM3LDU2MzgsNTYzOSw1NjQwLDU2NDEsNTY0Miw1NjQzLDU2NDQsNTY0NSw1NjQ2LDU2NDcsNTY0OCwgIyAgOTQ0CjU2NDksNTY1MCw1NjUxLDU2NTIsNTY1Myw1NjU0LDU2NTUsNTY1Niw1NjU3LDU2NTgsNTY1OSw1NjYwLDU2NjEsNTY2Miw1NjYzLDU2NjQsICMgIDk2MAo1NjY1LDU2NjYsNTY2Nyw1NjY4LDU2NjksNTY3MCw1NjcxLDU2NzIsNTY3Myw1Njc0LDU2NzUsNTY3Niw1Njc3LDU2NzgsNTY3OSw1NjgwLCAjICA5NzYKNTY4MSw1NjgyLDU2ODMsNTY4NCw1Njg1LDU2ODYsNTY4Nyw1Njg4LDU2ODksNTY5MCw1NjkxLDU2OTIsNTY5Myw1Njk0LDU2OTUsNTY5NiwgIyAgOTkyCjU2OTcsNTY5OCw1Njk5LDU3MDAsNTcwMSw1NzAyLDU3MDMsNTcwNCw1NzA1LDU3MDYsNTcwNyw1NzA4LDU3MDksNTcxMCw1NzExLDU3MTIsICMgMTAwOAo1NzEzLDU3MTQsNTcxNSw1NzE2LDU3MTcsNTcxOCw1NzE5LDU3MjAsNTcyMSw1NzIyLDU3MjMsNTcyNCw1NzI1LDU3MjYsNTcyNyw1NzI4LCAjIDEwMjQKNTcyOSw1NzMwLDU3MzEsNTczMiw1NzMzLDU3MzQsNTczNSw1NzM2LDU3MzcsNTczOCw1NzM5LDU3NDAsNTc0MSw1NzQyLDU3NDMsNTc0NCwgIyAxMDQwCjU3NDUsNTc0Niw1NzQ3LDU3NDgsNTc0OSw1NzUwLDU3NTEsNTc1Miw1NzUzLDU3NTQsNTc1NSw1NzU2LDU3NTcsNTc1OCw1NzU5LDU3NjAsICMgMTA1Ngo1NzYxLDU3NjIsNTc2Myw1NzY0LDU3NjUsNTc2Niw1NzY3LDU3NjgsNTc2OSw1NzcwLDU3NzEsNTc3Miw1NzczLDU3NzQsNTc3NSw1Nzc2LCAjIDEwNzIKNTc3Nyw1Nzc4LDU3NzksNTc4MCw1NzgxLDU3ODIsNTc4Myw1Nzg0LDU3ODUsNTc4Niw1Nzg3LDU3ODgsNTc4OSw1NzkwLDU3OTEsNTc5MiwgIyAxMDg4CjU3OTMsNTc5NCw1Nzk1LDU3OTYsNTc5Nyw1Nzk4LDU3OTksNTgwMCw1ODAxLDU4MDIsNTgwMyw1ODA0LDU4MDUsNTgwNiw1ODA3LDU4MDgsICMgMTEwNAo1ODA5LDU4MTAsNTgxMSw1ODEyLDU4MTMsNTgxNCw1ODE1LDU4MTYsNTgxNyw1ODE4LDU4MTksNTgyMCw1ODIxLDU4MjIsNTgyMyw1ODI0LCAjIDExMjAKNTgyNSw1ODI2LDU4MjcsNTgyOCw1ODI5LDU4MzAsNTgzMSw1ODMyLDU4MzMsNTgzNCw1ODM1LDU4MzYsNTgzNyw1ODM4LDU4MzksNTg0MCwgIyAxMTM2CjU4NDEsNTg0Miw1ODQzLDU4NDQsNTg0NSw1ODQ2LDU4NDcsNTg0OCw1ODQ5LDU4NTAsNTg1MSw1ODUyLDU4NTMsNTg1NCw1ODU1LDU4NTYsICMgMTE1Mgo1ODU3LDU4NTgsNTg1OSw1ODYwLDU4NjEsNTg2Miw1ODYzLDU4NjQsNTg2NSw1ODY2LDU4NjcsNTg2OCw1ODY5LDU4NzAsNTg3MSw1ODcyLCAjIDExNjgKNTg3Myw1ODc0LDU4NzUsNTg3Niw1ODc3LDU4NzgsNTg3OSw1ODgwLDU4ODEsNTg4Miw1ODgzLDU4ODQsNTg4NSw1ODg2LDU4ODcsNTg4OCwgIyAxMTg0CjU4ODksNTg5MCw1ODkxLDU4OTIsNTg5Myw1ODk0LDU4OTUsNTg5Niw1ODk3LDU4OTgsNTg5OSw1OTAwLDU5MDEsNTkwMiw1OTAzLDU5MDQsICMgMTIwMAo1OTA1LDU5MDYsNTkwNyw1OTA4LDU5MDksNTkxMCw1OTExLDU5MTIsNTkxMyw1OTE0LDU5MTUsNTkxNiw1OTE3LDU5MTgsNTkxOSw1OTIwLCAjIDEyMTYKNTkyMSw1OTIyLDU5MjMsNTkyNCw1OTI1LDU5MjYsNTkyNyw1OTI4LDU5MjksNTkzMCw1OTMxLDU5MzIsNTkzMyw1OTM0LDU5MzUsNTkzNiwgIyAxMjMyCjU5MzcsNTkzOCw1OTM5LDU5NDAsNTk0MSw1OTQyLDU5NDMsNTk0NCw1OTQ1LDU5NDYsNTk0Nyw1OTQ4LDU5NDksNTk1MCw1OTUxLDU5NTIsICMgMTI0OAo1OTUzLDU5NTQsNTk1NSw1OTU2LDU5NTcsNTk1OCw1OTU5LDU5NjAsNTk2MSw1OTYyLDU5NjMsNTk2NCw1OTY1LDU5NjYsNTk2Nyw1OTY4LCAjIDEyNjQKNTk2OSw1OTcwLDU5NzEsNTk3Miw1OTczLDU5NzQsNTk3NSw1OTc2LDU5NzcsNTk3OCw1OTc5LDU5ODAsNTk4MSw1OTgyLDU5ODMsNTk4NCwgIyAxMjgwCjU5ODUsNTk4Niw1OTg3LDU5ODgsNTk4OSw1OTkwLDU5OTEsNTk5Miw1OTkzLDU5OTQsNTk5NSw1OTk2LDU5OTcsNTk5OCw1OTk5LDYwMDAsICMgMTI5Ngo2MDAxLDYwMDIsNjAwMyw2MDA0LDYwMDUsNjAwNiw2MDA3LDYwMDgsNjAwOSw2MDEwLDYwMTEsNjAxMiw2MDEzLDYwMTQsNjAxNSw2MDE2LCAjIDEzMTIKNjAxNyw2MDE4LDYwMTksNjAyMCw2MDIxLDYwMjIsNjAyMyw2MDI0LDYwMjUsNjAyNiw2MDI3LDYwMjgsNjAyOSw2MDMwLDYwMzEsNjAzMiwgIyAxMzI4CjYwMzMsNjAzNCw2MDM1LDYwMzYsNjAzNyw2MDM4LDYwMzksNjA0MCw2MDQxLDYwNDIsNjA0Myw2MDQ0LDYwNDUsNjA0Niw2MDQ3LDYwNDgsICMgMTM0NAo2MDQ5LDYwNTAsNjA1MSw2MDUyLDYwNTMsNjA1NCw2MDU1LDYwNTYsNjA1Nyw2MDU4LDYwNTksNjA2MCw2MDYxLDYwNjIsNjA2Myw2MDY0LCAjIDEzNjAKNjA2NSw2MDY2LDYwNjcsNjA2OCw2MDY5LDYwNzAsNjA3MSw2MDcyLDYwNzMsNjA3NCw2MDc1LDYwNzYsNjA3Nyw2MDc4LDYwNzksNjA4MCwgIyAxMzc2CjYwODEsNjA4Miw2MDgzLDYwODQsNjA4NSw2MDg2LDYwODcsNjA4OCw2MDg5LDYwOTAsNjA5MSw2MDkyLDYwOTMsNjA5NCw2MDk1LDYwOTYsICMgMTM5Mgo2MDk3LDYwOTgsNjA5OSw2MTAwLDYxMDEsNjEwMiw2MTAzLDYxMDQsNjEwNSw2MTA2LDYxMDcsNjEwOCw2MTA5LDYxMTAsNjExMSw2MTEyLCAjIDE0MDgKNjExMyw2MTE0LDIwNDQsMjA2MCw0NjIxLCA5OTcsMTIzNSwgNDczLDExODYsNDYyMiwgOTIwLDMzNzgsNjExNSw2MTE2LCAzNzksMTEwOCwgIyAxNDI0CjQzMTMsMjY1NywyNzM1LDM5MzQsNjExNywzODA5LCA2MzYsMzIzMywgNTczLDEwMjYsMzY5MywzNDM1LDI5NzQsMzMwMCwyMjk4LDQxMDUsICMgMTQ0MAogODU0LDI5MzcsMjQ2MywgMzkzLDI1ODEsMjQxNywgNTM5LCA3NTIsMTI4MCwyNzUwLDI0ODAsIDE0MCwxMTYxLCA0NDAsIDcwOCwxNTY5LCAjIDE0NTYKIDY2NSwyNDk3LDE3NDYsMTI5MSwxNTIzLDMwMDAsIDE2NCwxNjAzLCA4NDcsMTMzMSwgNTM3LDE5OTcsIDQ4NiwgNTA4LDE2OTMsMjQxOCwgIyAxNDcyCjE5NzAsMjIyNywgODc4LDEyMjAsIDI5OSwxMDMwLCA5NjksIDY1MiwyNzUxLCA2MjQsMTEzNywzMzAxLDI2MTksICA2NSwzMzAyLDIwNDUsICMgMTQ4OAoxNzYxLDE4NTksMzEyMCwxOTMwLDM2OTQsMzUxNiwgNjYzLDE3NjcsIDg1MiwgODM1LDM2OTUsIDI2OSwgNzY3LDI4MjYsMjMzOSwxMzA1LCAjIDE1MDQKIDg5NiwxMTUwLCA3NzAsMTYxNiw2MTE4LCA1MDYsMTUwMiwyMDc1LDEwMTIsMjUxOSwgNzc1LDI1MjAsMjk3NSwyMzQwLDI5MzgsNDMxNCwgIyAxNTIwCjMwMjgsMjA4NiwxMjI0LDE5NDMsMjI4Niw2MTE5LDMwNzIsNDMxNSwyMjQwLDEyNzMsMTk4NywzOTM1LDE1NTcsIDE3NSwgNTk3LCA5ODUsICMgMTUzNgozNTE3LDI0MTksMjUyMSwxNDE2LDMwMjksIDU4NSwgOTM4LDE5MzEsMTAwNywxMDUyLDE5MzIsMTY4NSw2MTIwLDMzNzksNDMxNiw0NjIzLCAjIDE1NTIKIDgwNCwgNTk5LDMxMjEsMTMzMywyMTI4LDI1MzksMTE1OSwxNTU0LDIwMzIsMzgxMCwgNjg3LDIwMzMsMjkwNCwgOTUyLCA2NzUsMTQ2NywgIyAxNTY4CjM0MzYsNjEyMSwyMjQxLDEwOTYsMTc4NiwyNDQwLDE1NDMsMTkyNCwgOTgwLDE4MTMsMjIyOCwgNzgxLDI2OTIsMTg3OSwgNzI4LDE5MTgsICMgMTU4NAozNjk2LDQ2MjQsIDU0OCwxOTUwLDQ2MjUsMTgwOSwxMDg4LDEzNTYsMzMwMywyNTIyLDE5NDQsIDUwMiwgOTcyLCAzNzMsIDUxMywyODI3LCAjIDE2MDAKIDU4NiwyMzc3LDIzOTEsMTAwMywxOTc2LDE2MzEsNjEyMiwyNDY0LDEwODQsIDY0OCwxNzc2LDQ2MjYsMjE0MSwgMzI0LCA5NjIsMjAxMiwgIyAxNjE2CjIxNzcsMjA3NiwxMzg0LCA3NDIsMjE3OCwxNDQ4LDExNzMsMTgxMCwgMjIyLCAxMDIsIDMwMSwgNDQ1LCAxMjUsMjQyMCwgNjYyLDI0OTgsICMgMTYzMgogMjc3LCAyMDAsMTQ3NiwxMTY1LDEwNjgsIDIyNCwyNTYyLDEzNzgsMTQ0NiwgNDUwLDE4ODAsIDY1OSwgNzkxLCA1ODIsNDYyNywyOTM5LCAjIDE2NDgKMzkzNiwxNTE2LDEyNzQsIDU1NSwyMDk5LDM2OTcsMTAyMCwxMzg5LDE1MjYsMzM4MCwxNzYyLDE3MjMsMTc4NywyMjI5LCA0MTIsMjExNCwgIyAxNjY0CjE5MDAsMjM5MiwzNTE4LCA1MTIsMjU5NywgNDI3LDE5MjUsMjM0MSwzMTIyLDE2NTMsMTY4NiwyNDY1LDI0OTksIDY5NywgMzMwLCAyNzMsICMgMTY4MAogMzgwLDIxNjIsIDk1MSwgODMyLCA3ODAsIDk5MSwxMzAxLDMwNzMsIDk2NSwyMjcwLDM1MTksIDY2OCwyNTIzLDI2MzYsMTI4NiwgNTM1LCAjIDE2OTYKMTQwNywgNTE4LCA2NzEsIDk1NywyNjU4LDIzNzgsIDI2NywgNjExLDIxOTcsMzAzMCw2MTIzLCAyNDgsMjI5OSwgOTY3LDE3OTksMjM1NiwgIyAxNzEyCiA4NTAsMTQxOCwzNDM3LDE4NzYsMTI1NiwxNDgwLDI4MjgsMTcxOCw2MTI0LDYxMjUsMTc1NSwxNjY0LDI0MDUsNjEyNiw0NjI4LDI4NzksICMgMTcyOAoyODI5LCA0OTksMjE3OSwgNjc2LDQ2MjksIDU1NywyMzI5LDIyMTQsMjA5MCwgMzI1LDMyMzQsIDQ2NCwgODExLDMwMDEsIDk5MiwyMzQyLCAjIDE3NDQKMjQ4MSwxMjMyLDE0NjksIDMwMywyMjQyLCA0NjYsMTA3MCwyMTYzLCA2MDMsMTc3NywyMDkxLDQ2MzAsMjc1Miw0NjMxLDI3MTQsIDMyMiwgIyAxNzYwCjI2NTksMTk2NCwxNzY4LCA0ODEsMjE4OCwxNDYzLDIzMzAsMjg1NywzNjAwLDIwOTIsMzAzMSwyNDIxLDQ2MzIsMjMxOCwyMDcwLDE4NDksICMgMTc3NgoyNTk4LDQ2MzMsMTMwMiwyMjU0LDE2NjgsMTcwMSwyNDIyLDM4MTEsMjkwNSwzMDMyLDMxMjMsMjA0Niw0MTA2LDE3NjMsMTY5NCw0NjM0LCAjIDE3OTIKMTYwNCwgOTQzLDE3MjQsMTQ1NCwgOTE3LCA4NjgsMjIxNSwxMTY5LDI5NDAsIDU1MiwxMTQ1LDE4MDAsMTIyOCwxODIzLDE5NTUsIDMxNiwgIyAxODA4CjEwODAsMjUxMCwgMzYxLDE4MDcsMjgzMCw0MTA3LDI2NjAsMzM4MSwxMzQ2LDE0MjMsMTEzNCw0MTA4LDYxMjcsIDU0MSwxMjYzLDEyMjksICMgMTgyNAoxMTQ4LDI1NDAsIDU0NSwgNDY1LDE4MzMsMjg4MCwzNDM4LDE5MDEsMzA3NCwyNDgyLCA4MTYsMzkzNywgNzEzLDE3ODgsMjUwMCwgMTIyLCAjIDE4NDAKMTU3NSwgMTk1LDE0NTEsMjUwMSwxMTExLDYxMjgsIDg1OSwgMzc0LDEyMjUsMjI0MywyNDgzLDQzMTcsIDM5MCwxMDMzLDM0MzksMzA3NSwgIyAxODU2CjI1MjQsMTY4NywgMjY2LCA3OTMsMTQ0MCwyNTk5LCA5NDYsIDc3OSwgODAyLCA1MDcsIDg5NywxMDgxLCA1MjgsMjE4OSwxMjkyLCA3MTEsICMgMTg3MgoxODY2LDE3MjUsMTE2NywxNjQwLCA3NTMsIDM5OCwyNjYxLDEwNTMsIDI0NiwgMzQ4LDQzMTgsIDEzNywxMDI0LDM0NDAsMTYwMCwyMDc3LCAjIDE4ODgKMjEyOSwgODI1LDQzMTksIDY5OCwgMjM4LCA1MjEsIDE4NywyMzAwLDExNTcsMjQyMywxNjQxLDE2MDUsMTQ2NCwxNjEwLDEwOTcsMjU0MSwgIyAxOTA0CjEyNjAsMTQzNiwgNzU5LDIyNTUsMTgxNCwyMTUwLCA3MDUsMzIzNSwgNDA5LDI1NjMsMzMwNCwgNTYxLDMwMzMsMjAwNSwyNTY0LCA3MjYsICMgMTkyMAoxOTU2LDIzNDMsMzY5OCw0MTA5LCA5NDksMzgxMiwzODEzLDM1MjAsMTY2OSwgNjUzLDEzNzksMjUyNSwgODgxLDIxOTgsIDYzMiwyMjU2LCAjIDE5MzYKMTAyNywgNzc4LDEwNzQsIDczMywxOTU3LCA1MTQsMTQ4MSwyNDY2LCA1NTQsMjE4MCwgNzAyLDM5MzgsMTYwNiwxMDE3LDEzOTgsNjEyOSwgIyAxOTUyCjEzODAsMzUyMSwgOTIxLCA5OTMsMTMxMywgNTk0LCA0NDksMTQ4OSwxNjE3LDExNjYsIDc2OCwxNDI2LDEzNjAsIDQ5NSwxNzk0LDM2MDEsICMgMTk2OAoxMTc3LDM2MDIsMTE3MCw0MzIwLDIzNDQsIDQ3NiwgNDI1LDMxNjcsNDYzNSwzMTY4LDE0MjQsIDQwMSwyNjYyLDExNzEsMzM4MiwxOTk4LCAjIDE5ODQKMTA4OSw0MTEwLCA0NzcsMzE2OSwgNDc0LDYxMzAsMTkwOSwgNTk2LDI4MzEsMTg0MiwgNDk0LCA2OTMsMTA1MSwxMDI4LDEyMDcsMzA3NiwgIyAyMDAwCiA2MDYsMjExNSwgNzI3LDI3OTAsMTQ3MywxMTE1LCA3NDMsMzUyMiwgNjMwLCA4MDUsMTUzMiw0MzIxLDIwMjEsIDM2NiwxMDU3LCA4MzgsICMgMjAxNgogNjg0LDExMTQsMjE0Miw0MzIyLDIwNTAsMTQ5MiwxODkyLDE4MDgsMjI3MSwzODE0LDI0MjQsMTk3MSwxNDQ3LDEzNzMsMzMwNSwxMDkwLCAjIDIwMzIKMTUzNiwzOTM5LDM1MjMsMzMwNiwxNDU1LDIxOTksIDMzNiwgMzY5LDIzMzEsMTAzNSwgNTg0LDIzOTMsIDkwMiwgNzE4LDI2MDAsNjEzMSwgIyAyMDQ4CjI3NTMsIDQ2MywyMTUxLDExNDksMTYxMSwyNDY3LCA3MTUsMTMwOCwzMTI0LDEyNjgsIDM0MywxNDEzLDMyMzYsMTUxNywxMzQ3LDI2NjMsICMgMjA2NAoyMDkzLDM5NDAsMjAyMiwxMTMxLDE1NTMsMjEwMCwyOTQxLDE0MjcsMzQ0MSwyOTQyLDEzMjMsMjQ4NCw2MTMyLDE5ODAsIDg3MiwyMzY4LCAjIDIwODAKMjQ0MSwyOTQzLCAzMjAsMjM2OSwyMTE2LDEwODIsIDY3OSwxOTMzLDM5NDEsMjc5MSwzODE1LCA2MjUsMTE0MywyMDIzLCA0MjIsMjIwMCwgIyAyMDk2CjM4MTYsNjEzMywgNzMwLDE2OTUsIDM1NiwyMjU3LDE2MjYsMjMwMSwyODU4LDI2MzcsMTYyNywxNzc4LCA5MzcsIDg4MywyOTA2LDI2OTMsICMgMjExMgozMDAyLDE3NjksMTA4NiwgNDAwLDEwNjMsMTMyNSwzMzA3LDI3OTIsNDExMSwzMDc3LCA0NTYsMjM0NSwxMDQ2LCA3NDcsNjEzNCwxNTI0LCAjIDIxMjgKIDg4NCwxMDk0LDMzODMsMTQ3NCwyMTY0LDEwNTksIDk3NCwxNjg4LDIxODEsMjI1OCwxMDQ3LCAzNDUsMTY2NSwxMTg3LCAzNTgsIDg3NSwgIyAyMTQ0CjMxNzAsIDMwNSwgNjYwLDM1MjQsMjE5MCwxMzM0LDExMzUsMzE3MSwxNTQwLDE2NDksMjU0MiwxNTI3LCA5MjcsIDk2OCwyNzkzLCA4ODUsICMgMjE2MAoxOTcyLDE4NTAsIDQ4MiwgNTAwLDI2MzgsMTIxOCwxMTA5LDEwODUsMjU0MywxNjU0LDIwMzQsIDg3NiwgIDc4LDIyODcsMTQ4MiwxMjc3LCAjIDIxNzYKIDg2MSwxNjc1LDEwODMsMTc3OSwgNzI0LDI3NTQsIDQ1NCwgMzk3LDExMzIsMTYxMiwyMzMyLCA4OTMsIDY3MiwxMjM3LCAyNTcsMjI1OSwgIyAyMTkyCjIzNzAsIDEzNSwzMzg0LCAzMzcsMjI0NCwgNTQ3LCAzNTIsIDM0MCwgNzA5LDI0ODUsMTQwMCwgNzg4LDExMzgsMjUxMSwgNTQwLCA3NzIsICMgMjIwOAoxNjgyLDIyNjAsMjI3MiwyNTQ0LDIwMTMsMTg0MywxOTAyLDQ2MzYsMTk5OSwxNTYyLDIyODgsNDYzNywyMjAxLDE0MDMsMTUzMywgNDA3LCAjIDIyMjQKIDU3NiwzMzA4LDEyNTQsMjA3MSwgOTc4LDMzODUsIDE3MCwgMTM2LDEyMDEsMzEyNSwyNjY0LDMxNzIsMjM5NCwgMjEzLCA5MTIsIDg3MywgIyAyMjQwCjM2MDMsMTcxMywyMjAyLCA2OTksMzYwNCwzNjk5LCA4MTMsMzQ0MiwgNDkzLCA1MzEsMTA1NCwgNDY4LDI5MDcsMTQ4MywgMzA0LCAyODEsICMgMjI1Ngo0MTEyLDE3MjYsMTI1MiwyMDk0LCAzMzksMjMxOSwyMTMwLDI2MzksIDc1NiwxNTYzLDI5NDQsIDc0OCwgNTcxLDI5NzYsMTU4OCwyNDI1LCAjIDIyNzIKMjcxNSwxODUxLDE0NjAsMjQyNiwxNTI4LDEzOTIsMTk3MywzMjM3LCAyODgsMzMwOSwgNjg1LDMzODYsIDI5NiwgODkyLDI3MTYsMjIxNiwgIyAyMjg4CjE1NzAsMjI0NSwgNzIyLDE3NDcsMjIxNywgOTA1LDMyMzgsMTEwMyw2MTM1LDE4OTMsMTQ0MSwxOTY1LCAyNTEsMTgwNSwyMzcxLDM3MDAsICMgMjMwNAoyNjAxLDE5MTksMTA3OCwgIDc1LDIxODIsMTUwOSwxNTkyLDEyNzAsMjY0MCw0NjM4LDIxNTIsNjEzNiwzMzEwLDM4MTcsIDUyNCwgNzA2LCAjIDIzMjAKMTA3NSwgMjkyLDM4MTgsMTc1NiwyNjAyLCAzMTcsICA5OCwzMTczLDM2MDUsMzUyNSwxODQ0LDIyMTgsMzgxOSwyNTAyLCA4MTQsIDU2NywgIyAyMzM2CiAzODUsMjkwOCwxNTM0LDYxMzcsIDUzNCwxNjQyLDMyMzksIDc5Nyw2MTM4LDE2NzAsMTUyOSwgOTUzLDQzMjMsIDE4OCwxMDcxLCA1MzgsICMgMjM1MgogMTc4LCA3MjksMzI0MCwyMTA5LDEyMjYsMTM3NCwyMDAwLDIzNTcsMjk3NywgNzMxLDI0NjgsMTExNiwyMDE0LDIwNTEsNjEzOSwxMjYxLCAjIDIzNjgKMTU5MywgODAzLDI4NTksMjczNiwzNDQzLCA1NTYsIDY4MiwgODIzLDE1NDEsNjE0MCwxMzY5LDIyODksMTcwNiwyNzk0LCA4NDUsIDQ2MiwgIyAyMzg0CjI2MDMsMjY2NSwxMzYxLCAzODcsIDE2MiwyMzU4LDE3NDAsIDczOSwxNzcwLDE3MjAsMTMwNCwxNDAxLDMyNDEsMTA0OSwgNjI3LDE1NzEsICMgMjQwMAoyNDI3LDM1MjYsMTg3NywzOTQyLDE4NTIsMTUwMCwgNDMxLDE5MTAsMTUwMywgNjc3LCAyOTcsMjc5NSwgMjg2LDE0MzMsMTAzOCwxMTk4LCAjIDI0MTYKMjI5MCwxMTMzLDE1OTYsNDExMyw0NjM5LDI0NjksMTUxMCwxNDg0LDM5NDMsNjE0MSwyNDQyLCAxMDgsIDcxMiw0NjQwLDIzNzIsIDg2NiwgIyAyNDMyCjM3MDEsMjc1NSwzMjQyLDEzNDgsIDgzNCwxOTQ1LDE0MDgsMzUyNywyMzk1LDMyNDMsMTgxMSwgODI0LCA5OTQsMTE3OSwyMTEwLDE1NDgsICMgMjQ0OAoxNDUzLCA3OTAsMzAwMywgNjkwLDQzMjQsNDMyNSwyODMyLDI5MDksMzgyMCwxODYwLDM4MjEsIDIyNSwxNzQ4LCAzMTAsIDM0NiwxNzgwLCAjIDI0NjQKMjQ3MCwgODIxLDE5OTMsMjcxNywyNzk2LCA4MjgsIDg3NywzNTI4LDI4NjAsMjQ3MSwxNzAyLDIxNjUsMjkxMCwyNDg2LDE3ODksIDQ1MywgIyAyNDgwCiAzNTksMjI5MSwxNjc2LCAgNzMsMTE2NCwxNDYxLDExMjcsMzMxMSwgNDIxLCA2MDQsIDMxNCwxMDM3LCA1ODksIDExNiwyNDg3LCA3MzcsICMgMjQ5NgogODM3LDExODAsIDExMSwgMjQ0LCA3MzUsNjE0MiwyMjYxLDE4NjEsMTM2MiwgOTg2LCA1MjMsIDQxOCwgNTgxLDI2NjYsMzgyMiwgMTAzLCAjIDI1MTIKIDg1NSwgNTAzLDE0MTQsMTg2NywyNDg4LDEwOTEsIDY1NywxNTk3LCA5NzksIDYwNSwxMzE2LDQ2NDEsMTAyMSwyNDQzLDIwNzgsMjAwMSwgIyAyNTI4CjEyMDksICA5NiwgNTg3LDIxNjYsMTAzMiwgMjYwLDEwNzIsMjE1MywgMTczLCAgOTQsIDIyNiwzMjQ0LCA4MTksMjAwNiw0NjQyLDQxMTQsICMgMjU0NAoyMjAzLCAyMzEsMTc0NCwgNzgyLCAgOTcsMjY2NywgNzg2LDMzODcsIDg4NywgMzkxLCA0NDIsMjIxOSw0MzI2LDE0MjUsNjE0MywyNjk0LCAjIDI1NjAKIDYzMywxNTQ0LDEyMDIsIDQ4MywyMDE1LCA1OTIsMjA1MiwxOTU4LDI0NzIsMTY1NSwgNDE5LCAxMjksNDMyNywzNDQ0LDMzMTIsMTcxNCwgIyAyNTc2CjEyNTcsMzA3OCw0MzI4LDE1MTgsMTA5OCwgODY1LDEzMTAsMTAxOSwxODg1LDE1MTIsMTczNCwgNDY5LDI0NDQsIDE0OCwgNzczLCA0MzYsICMgMjU5MgoxODE1LDE4NjgsMTEyOCwxMDU1LDQzMjksMTI0NSwyNzU2LDM0NDUsMjE1NCwxOTM0LDEwMzksNDY0MywgNTc5LDEyMzgsIDkzMiwyMzIwLCAjIDI2MDgKIDM1MywgMjA1LCA4MDEsIDExNSwyNDI4LCA5NDQsMjMyMSwxODgxLCAzOTksMjU2NSwxMjExLCA2NzgsIDc2NiwzOTQ0LCAzMzUsMjEwMSwgIyAyNjI0CjE0NTksMTc4MSwxNDAyLDM5NDUsMjczNywyMTMxLDEwMTAsIDg0NCwgOTgxLDEzMjYsMTAxMywgNTUwLDE4MTYsMTU0NSwyNjIwLDEzMzUsICMgMjY0MAoxMDA4LCAzNzEsMjg4MSwgOTM2LDE0MTksMTYxMywzNTI5LDE0NTYsMTM5NSwyMjczLDE4MzQsMjYwNCwxMzE3LDI3MzgsMjUwMywgNDE2LCAjIDI2NTYKMTY0Myw0MzMwLCA4MDYsMTEyNiwgMjI5LCA1OTEsMzk0NiwxMzE0LDE5ODEsMTU3NiwxODM3LDE2NjYsIDM0NywxNzkwLCA5NzcsMzMxMywgIyAyNjcyCiA3NjQsMjg2MSwxODUzLCA2ODgsMjQyOSwxOTIwLDE0NjIsICA3NywgNTk1LCA0MTUsMjAwMiwzMDM0LCA3OTgsMTE5Miw0MTE1LDYxNDQsICMgMjY4OAoyOTc4LDQzMzEsMzAzNSwyNjk1LDI1ODIsMjA3MiwyNTY2LCA0MzAsMjQzMCwxNzI3LCA4NDIsMTM5NiwzOTQ3LDM3MDIsIDYxMywgMzc3LCAjIDI3MDQKIDI3OCwgMjM2LDE0MTcsMzM4OCwzMzE0LDMxNzQsIDc1NywxODY5LCAxMDcsMzUzMCw2MTQ1LDExOTQsIDYyMywyMjYyLCAyMDcsMTI1MywgIyAyNzIwCjIxNjcsMzQ0NiwzOTQ4LCA0OTIsMTExNywxOTM1LCA1MzYsMTgzOCwyNzU3LDEyNDYsNDMzMiwgNjk2LDIwOTUsMjQwNiwxMzkzLDE1NzIsICMgMjczNgozMTc1LDE3ODIsIDU4MywgMTkwLCAyNTMsMTM5MCwyMjMwLCA4MzAsMzEyNiwzMzg5LCA5MzQsMzI0NSwxNzAzLDE3NDksMjk3OSwxODcwLCAjIDI3NTIKMjU0NSwxNjU2LDIyMDQsIDg2OSwyMzQ2LDQxMTYsMzE3NiwxODE3LCA0OTYsMTc2NCw0NjQ0LCA5NDIsMTUwNCwgNDA0LDE5MDMsMTEyMiwgIyAyNzY4CjE1ODAsMzYwNiwyOTQ1LDEwMjIsIDUxNSwgMzcyLDE3MzUsIDk1NSwyNDMxLDMwMzYsNjE0NiwyNzk3LDExMTAsMjMwMiwyNzk4LCA2MTcsICMgMjc4NAo2MTQ3LCA0NDEsIDc2MiwxNzcxLDM0NDcsMzYwNywzNjA4LDE5MDQsIDg0MCwzMDM3LCAgODYsIDkzOSwxMzg1LCA1NzIsMTM3MCwyNDQ1LCAjIDI4MDAKMTMzNiwgMTE0LDM3MDMsIDg5OCwgMjk0LCAyMDMsMzMxNSwgNzAzLDE1ODMsMjI3NCwgNDI5LCA5NjEsNDMzMywxODU0LDE5NTEsMzM5MCwgIyAyODE2CjIzNzMsMzcwNCw0MzM0LDEzMTgsMTM4MSwgOTY2LDE5MTEsMjMyMiwxMDA2LDExNTUsIDMwOSwgOTg5LCA0NTgsMjcxOCwxNzk1LDEzNzIsICMgMjgzMgoxMjAzLCAyNTIsMTY4OSwxMzYzLDMxNzcsIDUxNywxOTM2LCAxNjgsMTQ5MCwgNTYyLCAxOTMsMzgyMywxMDQyLDQxMTcsMTgzNSwgNTUxLCAjIDI4NDgKIDQ3MCw0NjQ1LCAzOTUsIDQ4OSwzNDQ4LDE4NzEsMTQ2NSwyNTgzLDI2NDEsIDQxNywxNDkzLCAyNzksMTI5NSwgNTExLDEyMzYsMTExOSwgIyAyODY0CiAgNzIsMTIzMSwxOTgyLDE4MTIsMzAwNCwgODcxLDE1NjQsIDk4NCwzNDQ5LDE2NjcsMjY5NiwyMDk2LDQ2NDYsMjM0NywyODMzLDE2NzMsICMgMjg4MAozNjA5LCA2OTUsMzI0NiwyNjY4LCA4MDcsMTE4Myw0NjQ3LCA4OTAsIDM4OCwyMzMzLDE4MDEsMTQ1NywyOTExLDE3NjUsMTQ3NywxMDMxLCAjIDI4OTYKMzMxNiwzMzE3LDEyNzgsMzM5MSwyNzk5LDIyOTIsMjUyNiwgMTYzLDM0NTAsNDMzNSwyNjY5LDE0MDQsMTgwMiw2MTQ4LDIzMjMsMjQwNywgIyAyOTEyCjE1ODQsMTcyOCwxNDk0LDE4MjQsMTI2OSwgMjk4LCA5MDksMzMxOCwxMDM0LDE2MzIsIDM3NSwgNzc2LDE2ODMsMjA2MSwgMjkxLCAyMTAsICMgMjkyOAoxMTIzLCA4MDksMTI0OSwxMDAyLDI2NDIsMzAzOCwgMjA2LDEwMTEsMjEzMiwgMTQ0LCA5NzUsIDg4MiwxNTY1LCAzNDIsIDY2NywgNzU0LCAjIDI5NDQKMTQ0MiwyMTQzLDEyOTksMjMwMywyMDYyLCA0NDcsIDYyNiwyMjA1LDEyMjEsMjczOSwyOTEyLDExNDQsMTIxNCwyMjA2LDI1ODQsIDc2MCwgIyAyOTYwCjE3MTUsIDYxNCwgOTUwLDEyODEsMjY3MCwyNjIxLCA4MTAsIDU3NywxMjg3LDI1NDYsNDY0OCwgMjQyLDIxNjgsIDI1MCwyNjQzLCA2OTEsICMgMjk3NgogMTIzLDI2NDQsIDY0NywgMzEzLDEwMjksIDY4OSwxMzU3LDI5NDYsMTY1MCwgMjE2LCA3NzEsMTMzOSwxMzA2LCA4MDgsMjA2MywgNTQ5LCAjIDI5OTIKIDkxMywxMzcxLDI5MTMsMjkxNCw2MTQ5LDE0NjYsMTA5MiwxMTc0LDExOTYsMTMxMSwyNjA1LDIzOTYsMTc4MywxNzk2LDMwNzksIDQwNiwgIyAzMDA4CjI2NzEsMjExNywzOTQ5LDQ2NDksIDQ4NywxODI1LDIyMjAsNjE1MCwyOTE1LCA0NDgsMjM0OCwxMDczLDYxNTEsMjM5NywxNzA3LCAxMzAsICMgMzAyNAogOTAwLDE1OTgsIDMyOSwgMTc2LDE5NTksMjUyNywxNjIwLDYxNTIsMjI3NSw0MzM2LDMzMTksMTk4MywyMTkxLDM3MDUsMzYxMCwyMTU1LCAjIDMwNDAKMzcwNiwxOTEyLDE1MTMsMTYxNCw2MTUzLDE5ODgsIDY0NiwgMzkyLDIzMDQsMTU4OSwzMzIwLDMwMzksMTgyNiwxMjM5LDEzNTIsMTM0MCwgIyAzMDU2CjI5MTYsIDUwNSwyNTY3LDE3MDksMTQzNywyNDA4LDI1NDcsIDkwNiw2MTU0LDI2NzIsIDM4NCwxNDU4LDE1OTQsMTEwMCwxMzI5LCA3MTAsICMgMzA3MgogNDIzLDM1MzEsMjA2NCwyMjMxLDI2MjIsMTk4OSwyNjczLDEwODcsMTg4MiwgMzMzLCA4NDEsMzAwNSwxMjk2LDI4ODIsMjM3OSwgNTgwLCAjIDMwODgKMTkzNywxODI3LDEyOTMsMjU4NSwgNjAxLCA1NzQsIDI0OSwxNzcyLDQxMTgsMjA3OSwxMTIwLCA2NDUsIDkwMSwxMTc2LDE2OTAsIDc5NSwgIyAzMTA0CjIyMDcsIDQ3OCwxNDM0LCA1MTYsMTE5MCwxNTMwLCA3NjEsMjA4MCwgOTMwLDEyNjQsIDM1NSwgNDM1LDE1NTIsIDY0NCwxNzkxLCA5ODcsICMgMzEyMAogMjIwLDEzNjQsMTE2MywxMTIxLDE1MzgsIDMwNiwyMTY5LDEzMjcsMTIyMiwgNTQ2LDI2NDUsIDIxOCwgMjQxLCA2MTAsMTcwNCwzMzIxLCAjIDMxMzYKMTk4NCwxODM5LDE5NjYsMjUyOCwgNDUxLDYxNTUsMjU4NiwzNzA3LDI1NjgsIDkwNywzMTc4LCAyNTQsMjk0NywgMTg2LDE4NDUsNDY1MCwgIyAzMTUyCiA3NDUsIDQzMiwxNzU3LCA0MjgsMTYzMywgODg4LDIyNDYsMjIyMSwyNDg5LDM2MTEsMjExOCwxMjU4LDEyNjUsIDk1NiwzMTI3LDE3ODQsICMgMzE2OAo0MzM3LDI0OTAsIDMxOSwgNTEwLCAxMTksIDQ1NywzNjEyLCAyNzQsMjAzNSwyMDA3LDQ2NTEsMTQwOSwzMTI4LCA5NzAsMjc1OCwgNTkwLCAjIDMxODQKMjgwMCwgNjYxLDIyNDcsNDY1MiwyMDA4LDM5NTAsMTQyMCwxNTQ5LDMwODAsMzMyMiwzOTUxLDE2NTEsMTM3NSwyMTExLCA0ODUsMjQ5MSwgIyAzMjAwCjE0MjksMTE1Niw2MTU2LDI1NDgsMjE4MywxNDk1LCA4MzEsMTg0MCwyNTI5LDI0NDYsIDUwMSwxNjU3LCAzMDcsMTg5NCwzMjQ3LDEzNDEsICMgMzIxNgogNjY2LCA4OTksMjE1NiwxNTM5LDI1NDksMTU1OSwgODg2LCAzNDksMjIwOCwzMDgxLDIzMDUsMTczNiwzODI0LDIxNzAsMjc1OSwxMDE0LCAjIDMyMzIKMTkxMywxMzg2LCA1NDIsMTM5NywyOTQ4LCA0OTAsIDM2OCwgNzE2LCAzNjIsIDE1OSwgMjgyLDI1NjksMTEyOSwxNjU4LDEyODgsMTc1MCwgIyAzMjQ4CjI2NzQsIDI3NiwgNjQ5LDIwMTYsIDc1MSwxNDk2LCA2NTgsMTgxOCwxMjg0LDE4NjIsMjIwOSwyMDg3LDI1MTIsMzQ1MSwgNjIyLDI4MzQsICMgMzI2NAogMzc2LCAxMTcsMTA2MCwyMDUzLDEyMDgsMTcyMSwxMTAxLDE0NDMsIDI0NywxMjUwLDMxNzksMTc5MiwzOTUyLDI3NjAsMjM5OCwzOTUzLCAjIDMyODAKNjE1NywyMTQ0LDM3MDgsIDQ0NiwyNDMyLDExNTEsMjU3MCwzNDUyLDI0NDcsMjc2MSwyODM1LDEyMTAsMjQ0OCwzMDgyLCA0MjQsMjIyMiwgIyAzMjk2CjEyNTEsMjQ0OSwyMTE5LDI4MzYsIDUwNCwxNTgxLDQzMzgsIDYwMiwgODE3LCA4NTcsMzgyNSwyMzQ5LDIzMDYsIDM1NywzODI2LDE0NzAsICMgMzMxMgoxODgzLDI4ODMsIDI1NSwgOTU4LCA5MjksMjkxNywzMjQ4LCAzMDIsNDY1MywxMDUwLDEyNzEsMTc1MSwyMzA3LDE5NTIsMTQzMCwyNjk3LCAjIDMzMjgKMjcxOSwyMzU5LCAzNTQsMzE4MCwgNzc3LCAxNTgsMjAzNiw0MzM5LDE2NTksNDM0MCw0NjU0LDIzMDgsMjk0OSwyMjQ4LDExNDYsMjIzMiwgIyAzMzQ0CjM1MzIsMjcyMCwxNjk2LDI2MjMsMzgyNyw2MTU4LDMxMjksMTU1MCwyNjk4LDE0ODUsMTI5NywxNDI4LCA2MzcsIDkzMSwyNzIxLDIxNDUsICMgMzM2MAogOTE0LDI1NTAsMjU4NywgIDgxLDI0NTAsIDYxMiwgODI3LDI2NDYsMTI0Miw0NjU1LDExMTgsMjg4NCwgNDcyLDE4NTUsMzE4MSwzNTMzLCAjIDMzNzYKMzUzNCwgNTY5LDEzNTMsMjY5OSwxMjQ0LDE3NTgsMjU4OCw0MTE5LDIwMDksMjc2MiwyMTcxLDM3MDksMTMxMiwxNTMxLDYxNTksMTE1MiwgIyAzMzkyCjE5MzgsIDEzNCwxODMwLCA0NzEsMzcxMCwyMjc2LDExMTIsMTUzNSwzMzIzLDM0NTMsMzUzNSwgOTgyLDEzMzcsMjk1MCwgNDg4LCA4MjYsICMgMzQwOAogNjc0LDEwNTgsMTYyOCw0MTIwLDIwMTcsIDUyMiwyMzk5LCAyMTEsIDU2OCwxMzY3LDM0NTQsIDM1MCwgMjkzLDE4NzIsMTEzOSwzMjQ5LCAjIDM0MjQKMTM5OSwxOTQ2LDMwMDYsMTMwMCwyMzYwLDMzMjQsIDU4OCwgNzM2LDYxNjAsMjYwNiwgNzQ0LCA2NjksMzUzNiwzODI4LDYxNjEsMTM1OCwgIyAzNDQwCiAxOTksIDcyMywgODQ4LCA5MzMsIDg1MSwxOTM5LDE1MDUsMTUxNCwxMzM4LDE2MTgsMTgzMSw0NjU2LDE2MzQsMzYxMywgNDQzLDI3NDAsICMgMzQ1NgozODI5LCA3MTcsMTk0NywgNDkxLDE5MTQsNjE2MiwyNTUxLDE1NDIsNDEyMSwxMDI1LDYxNjMsMTA5OSwxMjIzLCAxOTgsMzA0MCwyNzIyLCAjIDM0NzIKIDM3MCwgNDEwLDE5MDUsMjU4OSwgOTk4LDEyNDgsMzE4MiwyMzgwLCA1MTksMTQ0OSw0MTIyLDE3MTAsIDk0NywgOTI4LDExNTMsNDM0MSwgIyAzNDg4CjIyNzcsIDM0NCwyNjI0LDE1MTEsIDYxNSwgMTA1LCAxNjEsMTIxMiwxMDc2LDE5NjAsMzEzMCwyMDU0LDE5MjYsMTE3NSwxOTA2LDI0NzMsICMgMzUwNAogNDE0LDE4NzMsMjgwMSw2MTY0LDIzMDksIDMxNSwxMzE5LDMzMjUsIDMxOCwyMDE4LDIxNDYsMjE1NywgOTYzLCA2MzEsIDIyMyw0MzQyLCAjIDM1MjAKNDM0MywyNjc1LCA0NzksMzcxMSwxMTk3LDI2MjUsMzcxMiwyNjc2LDIzNjEsNjE2NSw0MzQ0LDQxMjMsNjE2NiwyNDUxLDMxODMsMTg4NiwgIyAzNTM2CjIxODQsMTY3NCwxMzMwLDE3MTEsMTYzNSwxNTA2LCA3OTksIDIxOSwzMjUwLDMwODMsMzk1NCwxNjc3LDM3MTMsMzMyNiwyMDgxLDM2MTQsICMgMzU1MgoxNjUyLDIwNzMsNDY1NywxMTQ3LDMwNDEsMTc1MiwgNjQzLDE5NjEsIDE0NywxOTc0LDM5NTUsNjE2NywxNzE2LDIwMzcsIDkxOCwzMDA3LCAjIDM1NjgKMTk5NCwgMTIwLDE1MzcsIDExOCwgNjA5LDMxODQsNDM0NSwgNzQwLDM0NTUsMTIxOSwgMzMyLDE2MTUsMzgzMCw2MTY4LDE2MjEsMjk4MCwgIyAzNTg0CjE1ODIsIDc4MywgMjEyLCA1NTMsMjM1MCwzNzE0LDEzNDksMjQzMywyMDgyLDQxMjQsIDg4OSw2MTY5LDIzMTAsMTI3NSwxNDEwLCA5NzMsICMgMzYwMAogMTY2LDEzMjAsMzQ1NiwxNzk3LDEyMTUsMzE4NSwyODg1LDE4NDYsMjU5MCwyNzYzLDQ2NTgsIDYyOSwgODIyLDMwMDgsIDc2MywgOTQwLCAjIDM2MTYKMTk5MCwyODYyLCA0MzksMjQwOSwxNTY2LDEyNDAsMTYyMiwgOTI2LDEyODIsMTkwNywyNzY0LCA2NTQsMjIxMCwxNjA3LCAzMjcsMTEzMCwgIyAzNjMyCjM5NTYsMTY3OCwxNjIzLDYxNzAsMjQzNCwyMTkyLCA2ODYsIDYwOCwzODMxLDM3MTUsIDkwMywzOTU3LDMwNDIsNjE3MSwyNzQxLDE1MjIsICMgMzY0OAoxOTE1LDExMDUsMTU1NSwyNTUyLDEzNTksIDMyMywzMjUxLDQzNDYsMzQ1NywgNzM4LDEzNTQsMjU1MywyMzExLDIzMzQsMTgyOCwyMDAzLCAjIDM2NjQKMzgzMiwxNzUzLDIzNTEsMTIyNyw2MTcyLDE4ODcsNDEyNSwxNDc4LDYxNzMsMjQxMCwxODc0LDE3MTIsMTg0NywgNTIwLDEyMDQsMjYwNywgIyAzNjgwCiAyNjQsNDY1OSwgODM2LDI2NzcsMjEwMiwgNjAwLDQ2NjAsMzgzMywyMjc4LDMwODQsNjE3NCw0MzQ3LDM2MTUsMTM0MiwgNjQwLCA1MzIsICMgMzY5NgogNTQzLDI2MDgsMTg4OCwyNDAwLDI1OTEsMTAwOSw0MzQ4LDE0OTcsIDM0MSwxNzM3LDM2MTYsMjcyMywxMzk0LCA1MjksMzI1MiwxMzIxLCAjIDM3MTIKIDk4Myw0NjYxLDE1MTUsMjEyMCwgOTcxLDI1OTIsIDkyNCwgMjg3LDE2NjIsMzE4Niw0MzQ5LDI3MDAsNDM1MCwxNTE5LCA5MDgsMTk0OCwgIyAzNzI4CjI0NTIsIDE1NiwgNzk2LDE2MjksMTQ4NiwyMjIzLDIwNTUsIDY5NCw0MTI2LDEyNTksMTAzNiwzMzkyLDEyMTMsMjI0OSwyNzQyLDE4ODksICMgMzc0NAoxMjMwLDM5NTgsMTAxNSwgOTEwLCA0MDgsIDU1OSwzNjE3LDQ2NjIsIDc0NiwgNzI1LCA5MzUsNDY2MywzOTU5LDMwMDksMTI4OSwgNTYzLCAjIDM3NjAKIDg2Nyw0NjY0LDM5NjAsMTU2NywyOTgxLDIwMzgsMjYyNiwgOTg4LDIyNjMsMjM4MSw0MzUxLCAxNDMsMjM3NCwgNzA0LDE4OTUsNjE3NSwgIyAzNzc2CjExODgsMzcxNiwyMDg4LCA2NzMsMzA4NSwyMzYyLDQzNTIsIDQ4NCwxNjA4LDE5MjEsMjc2NSwyOTE4LCAyMTUsIDkwNCwzNjE4LDM1MzcsICMgMzc5MgogODk0LCA1MDksIDk3NiwzMDQzLDI3MDEsMzk2MSw0MzUzLDI4MzcsMjk4MiwgNDk4LDYxNzYsNjE3NywxMTAyLDM1MzgsMTMzMiwzMzkzLCAjIDM4MDgKMTQ4NywxNjM2LDE2MzcsIDIzMywgMjQ1LDM5NjIsIDM4MywgNjUwLCA5OTUsMzA0NCwgNDYwLDE1MjAsMTIwNiwyMzUyLCA3NDksMzMyNywgIyAzODI0CiA1MzAsIDcwMCwgMzg5LDE0MzgsMTU2MCwxNzczLDM5NjMsMjI2NCwgNzE5LDI5NTEsMjcyNCwzODM0LCA4NzAsMTgzMiwxNjQ0LDEwMDAsICMgMzg0MAogODM5LDI0NzQsMzcxNywgMTk3LDE2MzAsMzM5NCwgMzY1LDI4ODYsMzk2NCwxMjg1LDIxMzMsIDczNCwgOTIyLCA4MTgsMTEwNiwgNzMyLCAjIDM4NTYKIDQ4MCwyMDgzLDE3NzQsMzQ1OCwgOTIzLDIyNzksMTM1MCwgMjIxLDMwODYsICA4NSwyMjMzLDIyMzQsMzgzNSwxNTg1LDMwMTAsMjE0NywgIyAzODcyCjEzODcsMTcwNSwyMzgyLDE2MTksMjQ3NSwgMTMzLCAyMzksMjgwMiwxOTkxLDEwMTYsMjA4NCwyMzgzLCA0MTEsMjgzOCwxMTEzLCA2NTEsICMgMzg4OAoxOTg1LDExNjAsMzMyOCwgOTkwLDE4NjMsMzA4NywxMDQ4LDEyNzYsMjY0NywgMjY1LDI2MjcsMTU5OSwzMjUzLDIwNTYsIDE1MCwgNjM4LCAjIDM5MDQKMjAxOSwgNjU2LCA4NTMsIDMyNiwxNDc5LCA2ODAsMTQzOSw0MzU0LDEwMDEsMTc1OSwgNDEzLDM0NTksMzM5NSwyNDkyLDE0MzEsIDQ1OSwgIyAzOTIwCjQzNTUsMTEyNSwzMzI5LDIyNjUsMTk1MywxNDUwLDIwNjUsMjg2MywgODQ5LCAzNTEsMjY3OCwzMTMxLDMyNTQsMzI1NSwxMTA0LDE1NzcsICMgMzkzNgogMjI3LDEzNTEsMTY0NSwyNDUzLDIxOTMsMTQyMSwyODg3LCA4MTIsMjEyMSwgNjM0LCAgOTUsMjQzNSwgMjAxLDIzMTIsNDY2NSwxNjQ2LCAjIDM5NTIKMTY3MSwyNzQzLDE2MDEsMjU1NCwyNzAyLDI2NDgsMjI4MCwxMzE1LDEzNjYsMjA4OSwzMTMyLDE1NzMsMzcxOCwzOTY1LDE3MjksMTE4OSwgIyAzOTY4CiAzMjgsMjY3OSwxMDc3LDE5NDAsMTEzNiwgNTU4LDEyODMsIDk2NCwxMTk1LCA2MjEsMjA3NCwxMTk5LDE3NDMsMzQ2MCwzNjE5LDE4OTYsICMgMzk4NAoxOTE2LDE4OTAsMzgzNiwyOTUyLDExNTQsMjExMiwxMDY0LCA4NjIsIDM3OCwzMDExLDIwNjYsMjExMywyODAzLDE1NjgsMjgzOSw2MTc4LCAjIDQwMDAKMzA4OCwyOTE5LDE5NDEsMTY2MCwyMDA0LDE5OTIsMjE5NCwgMTQyLCA3MDcsMTU5MCwxNzA4LDE2MjQsMTkyMiwxMDIzLDE4MzYsMTIzMywgIyA0MDE2CjEwMDQsMjMxMywgNzg5LCA3NDEsMzYyMCw2MTc5LDE2MDksMjQxMSwxMjAwLDQxMjcsMzcxOSwzNzIwLDQ2NjYsMjA1NywzNzIxLCA1OTMsICMgNDAzMgoyODQwLCAzNjcsMjkyMCwxODc4LDYxODAsMzQ2MSwxNTIxLCA2MjgsMTE2OCwgNjkyLDIyMTEsMjY0OSwgMzAwLCA3MjAsMjA2NywyNTcxLCAjIDQwNDgKMjk1MywzMzk2LCA5NTksMjUwNCwzOTY2LDM1MzksMzQ2MiwxOTc3LCA3MDEsNjE4MSwgOTU0LDEwNDMsIDgwMCwgNjgxLCAxODMsMzcyMiwgIyA0MDY0CjE4MDMsMTczMCwzNTQwLDQxMjgsMjEwMywgODE1LDIzMTQsIDE3NCwgNDY3LCAyMzAsMjQ1NCwxMDkzLDIxMzQsIDc1NSwzNTQxLDMzOTcsICMgNDA4MAoxMTQxLDExNjIsNjE4MiwxNzM4LDIwMzksIDI3MCwzMjU2LDI1MTMsMTAwNSwxNjQ3LDIxODUsMzgzNywgODU4LDE2NzksMTg5NywxNzE5LCAjIDQwOTYKMjk1NCwyMzI0LDE4MDYsIDQwMiwgNjcwLCAxNjcsNDEyOSwxNDk4LDIxNTgsMjEwNCwgNzUwLDYxODMsIDkxNSwgMTg5LDE2ODAsMTU1MSwgIyA0MTEyCiA0NTUsNDM1NiwxNTAxLDI0NTUsIDQwNSwxMDk1LDI5NTUsIDMzOCwxNTg2LDEyNjYsMTgxOSwgNTcwLCA2NDEsMTMyNCwgMjM3LDE1NTYsICMgNDEyOAoyNjUwLDEzODgsMzcyMyw2MTg0LDEzNjgsMjM4NCwxMzQzLDE5NzgsMzA4OSwyNDM2LCA4NzksMzcyNCwgNzkyLDExOTEsIDc1OCwzMDEyLCAjIDQxNDQKMTQxMSwyMTM1LDEzMjIsNDM1NywgMjQwLDQ2NjcsMTg0OCwzNzI1LDE1NzQsNjE4NSwgNDIwLDMwNDUsMTU0NiwxMzkxLCA3MTQsNDM1OCwgIyA0MTYwCjE5NjcsIDk0MSwxODY0LCA4NjMsIDY2NCwgNDI2LCA1NjAsMTczMSwyNjgwLDE3ODUsMjg2NCwxOTQ5LDIzNjMsIDQwMywzMzMwLDE0MTUsICMgNDE3NgoxMjc5LDIxMzYsMTY5NywyMzM1LCAyMDQsIDcyMSwyMDk3LDM4MzgsICA5MCw2MTg2LDIwODUsMjUwNSwgMTkxLDM5NjcsIDEyNCwyMTQ4LCAjIDQxOTIKMTM3NiwxNzk4LDExNzgsMTEwNywxODk4LDE0MDUsIDg2MCw0MzU5LDEyNDMsMTI3MiwyMzc1LDI5ODMsMTU1OCwyNDU2LDE2MzgsIDExMywgIyA0MjA4CjM2MjEsIDU3OCwxOTIzLDI2MDksIDg4MCwgMzg2LDQxMzAsIDc4NCwyMTg2LDIyNjYsMTQyMiwyOTU2LDIxNzIsMTcyMiwgNDk3LCAyNjMsICMgNDIyNAoyNTE0LDEyNjcsMjQxMiwyNjEwLCAxNzcsMjcwMywzNTQyLCA3NzQsMTkyNywxMzQ0LCA2MTYsMTQzMiwxNTk1LDEwMTgsIDE3Miw0MzYwLCAjIDQyNDAKMjMyNSwgOTExLDQzNjEsIDQzOCwxNDY4LDM2MjIsIDc5NCwzOTY4LDIwMjQsMjE3MywxNjgxLDE4MjksMjk1NywgOTQ1LCA4OTUsMzA5MCwgIyA0MjU2CiA1NzUsMjIxMiwyNDc2LCA0NzUsMjQwMSwyNjgxLCA3ODUsMjc0NCwxNzQ1LDIyOTMsMjU1NSwxOTc1LDMxMzMsMjg2NSwgMzk0LDQ2NjgsICMgNDI3MgozODM5LCA2MzUsNDEzMSwgNjM5LCAyMDIsMTUwNywyMTk1LDI3NjYsMTM0NSwxNDM1LDI1NzIsMzcyNiwxOTA4LDExODQsMTE4MSwyNDU3LCAjIDQyODgKMzcyNywzMTM0LDQzNjIsIDg0MywyNjExLCA0MzcsIDkxNiw0NjY5LCAyMzQsIDc2OSwxODg0LDMwNDYsMzA0NywzNjIzLCA4MzMsNjE4NywgIyA0MzA0CjE2MzksMjI1MCwyNDAyLDEzNTUsMTE4NSwyMDEwLDIwNDcsIDk5OSwgNTI1LDE3MzIsMTI5MCwxNDg4LDI2MTIsIDk0OCwxNTc4LDM3MjgsICMgNDMyMAoyNDEzLDI0NzcsMTIxNiwyNzI1LDIxNTksIDMzNCwzODQwLDEzMjgsMzYyNCwyOTIxLDE1MjUsNDEzMiwgNTY0LDEwNTYsIDg5MSw0MzYzLCAjIDQzMzYKMTQ0NCwxNjk4LDIzODUsMjI1MSwzNzI5LDEzNjUsMjI4MSwyMjM1LDE3MTcsNjE4OCwgODY0LDM4NDEsMjUxNSwgNDQ0LCA1MjcsMjc2NywgIyA0MzUyCjI5MjIsMzYyNSwgNTQ0LCA0NjEsNjE4OSwgNTY2LCAyMDksMjQzNywzMzk4LDIwOTgsMTA2NSwyMDY4LDMzMzEsMzYyNiwzMjU3LDIxMzcsICMgNDM2OCAgI2xhc3QgNTEyCikKCgpQSwMEFAAAAAAAAAAhAAZ5JWq7TAAAu0wAAC0AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9qcGNudHgucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCgojIFRoaXMgaXMgaGlyYWdhbmEgMi1jaGFyIHNlcXVlbmNlIHRhYmxlLCB0aGUgbnVtYmVyIGluIGVhY2ggY2VsbCByZXByZXNlbnRzIGl0cyBmcmVxdWVuY3kgY2F0ZWdvcnkKanAyQ2hhckNvbnRleHQgPSAoCigwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEpLAooMiw0LDAsNCwwLDMsMCw0LDAsMyw0LDQsNCwyLDQsMywzLDQsMywyLDMsMyw0LDIsMywzLDMsMiw0LDEsNCwzLDMsMSw1LDQsMyw0LDMsNCwzLDUsMywwLDMsNSw0LDIsMCwzLDEsMCwzLDMsMCwzLDMsMCwxLDEsMCw0LDMsMCwzLDMsMCw0LDAsMiwwLDMsNSw1LDUsNSw0LDAsNCwxLDAsMyw0KSwKKDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiksCigwLDQsMCw1LDAsNSwwLDQsMCw0LDUsNCw0LDMsNSwzLDUsMSw1LDMsNCwzLDQsNCwzLDQsMywzLDQsMyw1LDQsNCwzLDUsNSwzLDUsNSw1LDMsNSw1LDMsNCw1LDUsMywxLDMsMiwwLDMsNCwwLDQsMiwwLDQsMiwxLDUsMywyLDMsNSwwLDQsMCwyLDAsNSw0LDQsNSw0LDUsMCw0LDAsMCw0LDQpLAooMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKSwKKDAsMywwLDQsMCwzLDAsMywwLDQsNSw0LDMsMywzLDMsNCwzLDUsNCw0LDMsNSw0LDQsMyw0LDMsNCw0LDQsNCw1LDMsNCw0LDMsNCw1LDUsNCw1LDUsMSw0LDUsNCwzLDAsMywzLDEsMywzLDAsNCw0LDAsMywzLDEsNSwzLDMsMyw1LDAsNCwwLDMsMCw0LDQsMyw0LDMsMywwLDQsMSwxLDMsNCksCigwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDApLAooMCw0LDAsMywwLDMsMCw0LDAsMyw0LDQsMywyLDIsMSwyLDEsMywxLDMsMywzLDMsMyw0LDMsMSwzLDMsNSwzLDMsMCw0LDMsMCw1LDQsMywzLDUsNCw0LDMsNCw0LDUsMCwxLDIsMCwxLDIsMCwyLDIsMCwxLDAsMCw1LDIsMiwxLDQsMCwzLDAsMSwwLDQsNCwzLDUsNCwzLDAsMiwxLDAsNCwzKSwKKDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCksCigwLDMsMCw1LDAsNCwwLDIsMSw0LDQsMiw0LDEsNCwyLDQsMiw0LDMsMywzLDQsMywzLDMsMywxLDQsMiwzLDMsMywxLDQsNCwxLDEsMSw0LDMsMywyLDAsMiw0LDMsMiwwLDMsMywwLDMsMSwxLDAsMCwwLDMsMywwLDQsMiwyLDMsNCwwLDQsMCwzLDAsNCw0LDUsMyw0LDQsMCwzLDAsMCwxLDQpLAooMSw0LDAsNCwwLDQsMCw0LDAsMyw1LDQsNCwzLDQsMyw1LDQsMywzLDQsMyw1LDQsNCw0LDQsMyw0LDIsNCwzLDMsMSw1LDQsMywyLDQsNSw0LDUsNSw0LDQsNSw0LDQsMCwzLDIsMiwzLDMsMCw0LDMsMSwzLDIsMSw0LDMsMyw0LDUsMCwzLDAsMiwwLDQsNSw1LDQsNSw0LDAsNCwwLDAsNSw0KSwKKDAsNSwwLDUsMCw0LDAsMywwLDQsNCwzLDQsMywzLDMsNCwwLDQsNCw0LDMsNCwzLDQsMywzLDEsNCwyLDQsMyw0LDAsNSw0LDEsNCw1LDQsNCw1LDMsMiw0LDMsNCwzLDIsNCwxLDMsMywzLDIsMywyLDAsNCwzLDMsNCwzLDMsMyw0LDAsNCwwLDMsMCw0LDUsNCw0LDQsMywwLDQsMSwwLDEsMyksCigwLDMsMSw0LDAsMywwLDIsMCwzLDQsNCwzLDEsNCwyLDMsMyw0LDMsNCwzLDQsMyw0LDQsMywyLDMsMSw1LDQsNCwxLDQsNCwzLDUsNCw0LDMsNSw1LDQsMyw0LDQsMywxLDIsMywxLDIsMiwwLDMsMiwwLDMsMSwwLDUsMywzLDMsNCwzLDMsMywzLDQsNCw0LDQsNSw0LDIsMCwzLDMsMiw0LDMpLAooMCwyLDAsMywwLDEsMCwxLDAsMCwzLDIsMCwwLDIsMCwxLDAsMiwxLDMsMywzLDEsMiwzLDEsMCwxLDAsNCwyLDEsMSwzLDMsMCw0LDMsMywxLDQsMywzLDAsMywzLDIsMCwwLDAsMCwxLDAsMCwyLDAsMCwwLDAsMCw0LDEsMCwyLDMsMiwyLDIsMSwzLDMsMyw0LDQsMywyLDAsMywxLDAsMywzKSwKKDAsNCwwLDQsMCwzLDAsMywwLDQsNCw0LDMsMywzLDMsMywzLDQsMyw0LDIsNCwzLDQsMywzLDIsNCwzLDQsNSw0LDEsNCw1LDMsNSw0LDUsMyw1LDQsMCwzLDUsNSwzLDEsMywzLDIsMiwzLDAsMyw0LDEsMywzLDIsNCwzLDMsMyw0LDAsNCwwLDMsMCw0LDUsNCw0LDUsMywwLDQsMSwwLDMsNCksCigwLDIsMCwzLDAsMywwLDAsMCwyLDIsMiwxLDAsMSwwLDAsMCwzLDAsMywwLDMsMCwxLDMsMSwwLDMsMSwzLDMsMywxLDMsMywzLDAsMSwzLDEsMyw0LDAsMCwzLDEsMSwwLDMsMiwwLDAsMCwwLDEsMywwLDEsMCwwLDMsMywyLDAsMywwLDAsMCwwLDAsMyw0LDMsNCwzLDMsMCwzLDAsMCwyLDMpLAooMiwzLDAsMywwLDIsMCwxLDAsMywzLDQsMywxLDMsMSwxLDEsMywxLDQsMyw0LDMsMywzLDAsMCwzLDEsNSw0LDMsMSw0LDMsMiw1LDUsNCw0LDQsNCwzLDMsNCw0LDQsMCwyLDEsMSwzLDIsMCwxLDIsMCwwLDEsMCw0LDEsMywzLDMsMCwzLDAsMSwwLDQsNCw0LDUsNSwzLDAsMiwwLDAsNCw0KSwKKDAsMiwwLDEsMCwzLDEsMywwLDIsMywzLDMsMCwzLDEsMCwwLDMsMCwzLDIsMywxLDMsMiwxLDEsMCwwLDQsMiwxLDAsMiwzLDEsNCwzLDIsMCw0LDQsMywxLDMsMSwzLDAsMSwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsNCwxLDEsMSwyLDAsMywwLDAsMCwzLDQsMiw0LDMsMiwwLDEsMCwwLDMsMyksCigwLDEsMCw0LDAsNSwwLDQsMCwyLDQsNCwyLDMsMywyLDMsMyw1LDMsMywzLDQsMyw0LDIsMywwLDQsMywzLDMsNCwxLDQsMywyLDEsNSw1LDMsNCw1LDEsMyw1LDQsMiwwLDMsMywwLDEsMywwLDQsMiwwLDEsMywxLDQsMywzLDMsMywwLDMsMCwxLDAsMyw0LDQsNCw1LDUsMCwzLDAsMSw0LDUpLAooMCwyLDAsMywwLDMsMCwwLDAsMiwzLDEsMywwLDQsMCwxLDEsMywwLDMsNCwzLDIsMywxLDAsMywzLDIsMywxLDMsMCwyLDMsMCwyLDEsNCwxLDIsMiwwLDAsMywzLDAsMCwyLDAsMCwwLDEsMCwwLDAsMCwyLDIsMCwzLDIsMSwzLDMsMCwyLDAsMiwwLDAsMywzLDEsMiw0LDAsMywwLDIsMiwzKSwKKDIsNCwwLDUsMCw0LDAsNCwwLDIsNCw0LDQsMyw0LDMsMywzLDEsMiw0LDMsNCwzLDQsNCw1LDAsMywzLDMsMywyLDAsNCwzLDEsNCwzLDQsMSw0LDQsMywzLDQsNCwzLDEsMiwzLDAsNCwyLDAsNCwxLDAsMywzLDAsNCwzLDMsMyw0LDAsNCwwLDIsMCwzLDUsMyw0LDUsMiwwLDMsMCwwLDQsNSksCigwLDMsMCw0LDAsMSwwLDEsMCwxLDMsMiwyLDEsMywwLDMsMCwyLDAsMiwwLDMsMCwyLDAsMCwwLDEsMCwxLDEsMCwwLDMsMSwwLDAsMCw0LDAsMywxLDAsMiwxLDMsMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDQsMiwyLDMsMSwwLDMsMCwwLDAsMSw0LDQsNCwzLDAsMCw0LDAsMCwxLDQpLAooMSw0LDEsNSwwLDMsMCwzLDAsNCw1LDQsNCwzLDUsMywzLDQsNCwzLDQsMSwzLDMsMywzLDIsMSw0LDEsNSw0LDMsMSw0LDQsMyw1LDQsNCwzLDUsNCwzLDMsNCw0LDQsMCwzLDMsMSwyLDMsMCwzLDEsMCwzLDMsMCw1LDQsNCw0LDQsNCw0LDMsMyw1LDQsNCwzLDMsNSw0LDAsMywyLDAsNCw0KSwKKDAsMiwwLDMsMCwxLDAsMCwwLDEsMywzLDMsMiw0LDEsMywwLDMsMSwzLDAsMiwyLDEsMSwwLDAsMiwwLDQsMywxLDAsNCwzLDAsNCw0LDQsMSw0LDMsMSwxLDMsMywxLDAsMiwwLDAsMSwzLDAsMCwwLDAsMiwwLDAsNCwzLDIsNCwzLDUsNCwzLDMsMyw0LDMsMyw0LDMsMywwLDIsMSwwLDMsMyksCigwLDIsMCw0LDAsMywwLDIsMCwyLDUsNSwzLDQsNCw0LDQsMSw0LDMsMywwLDQsMyw0LDMsMSwzLDMsMiw0LDMsMCwzLDQsMywwLDMsNCw0LDIsNCw0LDAsNCw1LDMsMywyLDIsMSwxLDEsMiwwLDEsNSwwLDMsMywyLDQsMywzLDMsNCwwLDMsMCwyLDAsNCw0LDMsNSw1LDAsMCwzLDAsMiwzLDMpLAooMCwzLDAsNCwwLDMsMCwxLDAsMyw0LDMsMywxLDMsMywzLDAsMywxLDMsMCw0LDMsMywxLDEsMCwzLDAsMywzLDAsMCw0LDQsMCwxLDUsNCwzLDMsNSwwLDMsMyw0LDMsMCwyLDAsMSwxLDEsMCwxLDMsMCwxLDIsMSwzLDMsMiwzLDMsMCwzLDAsMSwwLDEsMywzLDQsNCwxLDAsMSwyLDIsMSwzKSwKKDAsMSwwLDQsMCw0LDAsMywwLDEsMywzLDMsMiwzLDEsMSwwLDMsMCwzLDMsNCwzLDIsNCwyLDAsMSwwLDQsMywyLDAsNCwzLDAsNSwzLDMsMiw0LDQsNCwzLDMsMyw0LDAsMSwzLDAsMCwxLDAsMCwxLDAsMCwwLDAsNCwyLDMsMywzLDAsMywwLDAsMCw0LDQsNCw1LDMsMiwwLDMsMywwLDMsNSksCigwLDIsMCwzLDAsMCwwLDMsMCwxLDMsMCwyLDAsMCwwLDEsMCwzLDEsMSwzLDMsMCwwLDMsMCwwLDMsMCwyLDMsMSwwLDMsMSwwLDMsMywyLDAsNCwyLDIsMCwyLDAsMCwwLDQsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMSwyLDAsMSwwLDEsMCwwLDAsMSwzLDEsMiwwLDAsMCwxLDAsMCwxLDQpLAooMCwzLDAsMywwLDUsMCwxLDAsMiw0LDMsMSwzLDMsMiwxLDEsNSwyLDEsMCw1LDEsMiwwLDAsMCwzLDMsMiwyLDMsMiw0LDMsMCwwLDMsMywxLDMsMywwLDIsNSwzLDQsMCwzLDMsMCwxLDIsMCwyLDIsMCwzLDIsMCwyLDIsMywzLDMsMCwyLDAsMSwwLDMsNCw0LDIsNSw0LDAsMywwLDAsMyw1KSwKKDAsMywwLDMsMCwzLDAsMSwwLDMsMywzLDMsMCwzLDAsMiwwLDIsMSwxLDAsMiwwLDEsMCwwLDAsMiwxLDAsMCwxLDAsMywyLDAsMCwzLDMsMSwyLDMsMSwwLDMsMywwLDAsMSwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMiwzLDEsMiwzLDAsMywwLDEsMCwzLDIsMSwwLDQsMywwLDEsMSwwLDMsMyksCigwLDQsMCw1LDAsMywwLDMsMCw0LDUsNSw0LDMsNSwzLDQsMyw1LDMsMywyLDUsMyw0LDQsNCwzLDQsMyw0LDUsNSwzLDQsNCwzLDQsNCw1LDQsNCw0LDMsNCw1LDUsNCwyLDMsNCwyLDMsNCwwLDMsMywxLDQsMywyLDQsMywzLDUsNSwwLDMsMCwzLDAsNSw1LDUsNSw0LDQsMCw0LDAsMSw0LDQpLAooMCw0LDAsNCwwLDMsMCwzLDAsMyw1LDQsNCwyLDMsMiw1LDEsMywyLDUsMSw0LDIsMywyLDMsMyw0LDMsMywzLDMsMiw1LDQsMSwzLDMsNSwzLDQsNCwwLDQsNCwzLDEsMSwzLDEsMCwyLDMsMCwyLDMsMCwzLDAsMCw0LDMsMSwzLDQsMCwzLDAsMiwwLDQsNCw0LDMsNCw1LDAsNCwwLDAsMyw0KSwKKDAsMywwLDMsMCwzLDEsMiwwLDMsNCw0LDMsMywzLDAsMiwyLDQsMywzLDEsMywzLDMsMSwxLDAsMywxLDQsMywyLDMsNCw0LDIsNCw0LDQsMyw0LDQsMywyLDQsNCwzLDEsMywzLDEsMywzLDAsNCwxLDAsMiwyLDEsNCwzLDIsMywzLDUsNCwzLDMsNSw0LDQsMywzLDAsNCwwLDMsMiwyLDQsNCksCigwLDIsMCwxLDAsMCwwLDAsMCwxLDIsMSwzLDAsMCwwLDAsMCwyLDAsMSwyLDEsMCwwLDEsMCwwLDAsMCwzLDAsMCwxLDAsMSwxLDMsMSwwLDAsMCwxLDEsMCwxLDEsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDEsMSwyLDIsMCwzLDQsMCwwLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwxLDEpLAooMCwxLDAsMCwwLDEsMCwwLDAsMCw0LDAsNCwxLDQsMCwzLDAsNCwwLDMsMCw0LDAsMywwLDMsMCw0LDEsNSwxLDQsMCwwLDMsMCw1LDAsNSwyLDAsMSwwLDAsMCwyLDEsNCwwLDEsMywwLDAsMywwLDAsMywxLDEsNCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwKSwKKDEsNCwwLDUsMCwzLDAsMiwwLDMsNSw0LDQsMyw0LDMsNSwzLDQsMywzLDAsNCwzLDMsMywzLDMsMywyLDQsNCwzLDEsMyw0LDQsNSw0LDQsMyw0LDQsMSwzLDUsNCwzLDMsMywxLDIsMiwzLDMsMSwzLDEsMywzLDMsNSwzLDMsNCw1LDAsMywwLDMsMCwzLDQsMyw0LDQsMywwLDMsMCwyLDQsMyksCigwLDEsMCw0LDAsMCwwLDAsMCwxLDQsMCw0LDEsNCwyLDQsMCwzLDAsMSwwLDEsMCwwLDAsMCwwLDIsMCwzLDEsMSwxLDAsMywwLDAsMCwxLDIsMSwwLDAsMSwxLDEsMSwwLDEsMCwwLDAsMSwwLDAsMywwLDAsMCwwLDMsMiwwLDIsMiwwLDEsMCwwLDAsMiwzLDIsMywzLDAsMCwwLDAsMiwxLDApLAooMCw1LDEsNSwwLDMsMCwzLDAsNSw0LDQsNSwxLDUsMywzLDAsNCwzLDQsMyw1LDMsNCwzLDMsMiw0LDMsNCwzLDMsMCwzLDMsMSw0LDQsMyw0LDQsNCwzLDQsNSw1LDMsMiwzLDEsMSwzLDMsMSwzLDEsMSwzLDMsMiw0LDUsMywzLDUsMCw0LDAsMywwLDQsNCwzLDUsMywzLDAsMyw0LDAsNCwzKSwKKDAsNSwwLDUsMCwzLDAsMiwwLDQsNCwzLDUsMiw0LDMsMywzLDQsNCw0LDMsNSwzLDUsMywzLDEsNCwwLDQsMywzLDAsMywzLDAsNCw0LDQsNCw1LDQsMywzLDUsNSwzLDIsMywxLDIsMywyLDAsMSwwLDAsMywyLDIsNCw0LDMsMSw1LDAsNCwwLDMsMCw0LDMsMSwzLDIsMSwwLDMsMywwLDMsMyksCigwLDQsMCw1LDAsNSwwLDQsMCw0LDUsNSw1LDMsNCwzLDMsMiw1LDQsNCwzLDUsMyw1LDMsNCwwLDQsMyw0LDQsMywyLDQsNCwzLDQsNSw0LDQsNSw1LDAsMyw1LDUsNCwxLDMsMywyLDMsMywxLDMsMSwwLDQsMywxLDQsNCwzLDQsNSwwLDQsMCwyLDAsNCwzLDQsNCwzLDMsMCw0LDAsMCw1LDUpLAooMCw0LDAsNCwwLDUsMCwxLDEsMywzLDQsNCwzLDQsMSwzLDAsNSwxLDMsMCwzLDEsMywxLDEsMCwzLDAsMywzLDQsMCw0LDMsMCw0LDQsNCwzLDQsNCwwLDMsNSw0LDEsMCwzLDAsMCwyLDMsMCwzLDEsMCwzLDEsMCwzLDIsMSwzLDUsMCwzLDAsMSwwLDMsMiwzLDMsNCw0LDAsMiwyLDAsNCw0KSwKKDIsNCwwLDUsMCw0LDAsMywwLDQsNSw1LDQsMyw1LDMsNSwzLDUsMyw1LDIsNSwzLDQsMywzLDQsMyw0LDUsMywyLDEsNSw0LDMsMiwzLDQsNSwzLDQsMSwyLDUsNCwzLDAsMywzLDAsMywyLDAsMiwzLDAsNCwxLDAsMyw0LDMsMyw1LDAsMywwLDEsMCw0LDUsNSw1LDQsMywwLDQsMiwwLDMsNSksCigwLDUsMCw0LDAsNCwwLDIsMCw1LDQsMyw0LDMsNCwzLDMsMyw0LDMsNCwyLDUsMyw1LDMsNCwxLDQsMyw0LDQsNCwwLDMsNSwwLDQsNCw0LDQsNSwzLDEsMyw0LDUsMywzLDMsMywzLDMsMywwLDIsMiwwLDMsMywyLDQsMywzLDMsNSwzLDQsMSwzLDMsNSwzLDIsMCwwLDAsMCw0LDMsMSwzLDMpLAooMCwxLDAsMywwLDMsMCwxLDAsMSwzLDMsMywyLDMsMywzLDAsMywwLDAsMCwzLDEsMywwLDAsMCwyLDIsMiwzLDAsMCwzLDIsMCwxLDIsNCwxLDMsMywwLDAsMywzLDMsMCwxLDAsMCwyLDEsMCwwLDMsMCwzLDEsMCwzLDAsMCwxLDMsMCwyLDAsMSwwLDMsMywxLDMsMywwLDAsMSwxLDAsMywzKSwKKDAsMiwwLDMsMCwyLDEsNCwwLDIsMiwzLDEsMSwzLDEsMSwwLDIsMCwzLDEsMiwzLDEsMywwLDAsMSwwLDQsMywyLDMsMywzLDEsNCwyLDMsMywzLDMsMSwwLDMsMSw0LDAsMSwxLDAsMSwyLDAsMSwxLDAsMSwxLDAsMywxLDMsMiwyLDAsMSwwLDAsMCwyLDMsMywzLDEsMCwwLDAsMCwwLDIsMyksCigwLDUsMCw0LDAsNSwwLDIsMCw0LDUsNSwzLDMsNCwzLDMsMSw1LDQsNCwyLDQsNCw0LDMsNCwyLDQsMyw1LDUsNCwzLDMsNCwzLDMsNSw1LDQsNSw1LDEsMyw0LDUsMywxLDQsMywxLDMsMywwLDMsMywxLDQsMywxLDQsNSwzLDMsNSwwLDQsMCwzLDAsNSwzLDMsMSw0LDMsMCw0LDAsMSw1LDMpLAooMCw1LDAsNSwwLDQsMCwyLDAsNCw0LDMsNCwzLDMsMywzLDMsNSw0LDQsNCw0LDQsNCw1LDMsMyw1LDIsNCw0LDQsMyw0LDQsMywzLDQsNCw1LDUsMywzLDQsMyw0LDMsMyw0LDMsMywzLDMsMSwyLDIsMSw0LDMsMyw1LDQsNCwzLDQsMCw0LDAsMywwLDQsNCw0LDQsNCwxLDAsNCwyLDAsMiw0KSwKKDAsNCwwLDQsMCwzLDAsMSwwLDMsNSwyLDMsMCwzLDAsMiwxLDQsMiwzLDMsNCwxLDQsMywzLDIsNCwxLDMsMywzLDAsMywzLDAsMCwzLDMsMyw1LDMsMywzLDMsMywyLDAsMiwwLDAsMiwwLDAsMiwwLDAsMSwwLDAsMywxLDIsMiwzLDAsMywwLDIsMCw0LDQsMywzLDQsMSwwLDMsMCwwLDIsNCksCigwLDAsMCw0LDAsMCwwLDAsMCwwLDEsMCwxLDAsMiwwLDAsMCwwLDAsMSwwLDIsMCwxLDAsMCwwLDAsMCwzLDEsMywwLDMsMiwwLDAsMCwxLDAsMywyLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDQsMCwyLDAsMCwwLDAsMCwwLDIpLAooMCwyLDEsMywwLDIsMCwyLDAsMywzLDMsMywxLDMsMSwzLDMsMywzLDMsMyw0LDIsMiwxLDIsMSw0LDAsNCwzLDEsMywzLDMsMiw0LDMsNSw0LDMsMywzLDMsMywzLDMsMCwxLDMsMCwyLDAsMCwxLDAsMCwxLDAsMCw0LDIsMCwyLDMsMCwzLDMsMCwzLDMsNCwyLDMsMSw0LDAsMSwyLDAsMiwzKSwKKDAsMywwLDMsMCwxLDAsMywwLDIsMywzLDMsMCwzLDEsMiwwLDMsMywyLDMsMywyLDMsMiwzLDEsMywwLDQsMywyLDAsMywzLDEsNCwzLDMsMiwzLDQsMywxLDMsMywxLDEsMCwxLDEsMCwxLDAsMSwwLDEsMCwwLDAsNCwxLDEsMCwzLDAsMywxLDAsMiwzLDMsMywzLDMsMSwwLDAsMiwwLDMsMyksCigwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwyLDAsMywwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwzLDAsMywwLDMsMSwwLDEsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDIsMCwyLDMsMCwwLDAsMCwwLDAsMCwwLDMpLAooMCwyLDAsMywxLDMsMCwzLDAsMiwzLDMsMywxLDMsMSwzLDEsMywxLDMsMywzLDEsMywwLDIsMywxLDEsNCwzLDMsMiwzLDMsMSwyLDIsNCwxLDMsMywwLDEsNCwyLDMsMCwxLDMsMCwzLDAsMCwxLDMsMCwyLDAsMCwzLDMsMiwxLDMsMCwzLDAsMiwwLDMsNCw0LDQsMywxLDAsMywwLDAsMywzKSwKKDAsMiwwLDEsMCwyLDAsMCwwLDEsMywyLDIsMSwzLDAsMSwxLDMsMCwzLDIsMywxLDIsMCwyLDAsMSwxLDMsMywzLDAsMywzLDEsMSwyLDMsMiwzLDMsMSwyLDMsMiwwLDAsMSwwLDAsMCwwLDAsMCwzLDAsMSwwLDAsMiwxLDIsMSwzLDAsMywwLDAsMCwzLDQsNCw0LDMsMiwwLDIsMCwwLDIsNCksCigwLDAsMCwxLDAsMSwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDIsMiwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwxLDMsMSwwLDAsMCwwLDAsMCwwLDMpLAooMCwzLDAsMywwLDIsMCwzLDAsMywzLDMsMiwzLDIsMiwyLDAsMywxLDMsMywzLDIsMywzLDAsMCwzLDAsMywyLDIsMCwyLDMsMSw0LDMsNCwzLDMsMiwzLDEsNSw0LDQsMCwzLDEsMiwxLDMsMCwzLDEsMSwyLDAsMiwzLDEsMywxLDMsMCwzLDAsMSwwLDMsMyw0LDQsMiwxLDAsMiwxLDAsMiw0KSwKKDAsMSwwLDMsMCwxLDAsMiwwLDEsNCwyLDUsMSw0LDAsMiwwLDIsMSwzLDEsNCwwLDIsMSwwLDAsMiwxLDQsMSwxLDAsMywzLDAsNSwxLDMsMiwzLDMsMSwwLDMsMiwzLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsNCwwLDEsMCwzLDAsMiwwLDEsMCwzLDMsMyw0LDMsMywwLDAsMCwwLDIsMyksCigwLDAsMCwxLDAsMCwwLDAsMCwwLDIsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDEsMCwwLDEsMCwwLDAsMCwwLDMpLAooMCwxLDAsMywwLDQsMCwzLDAsMiw0LDMsMSwwLDMsMiwyLDEsMywxLDIsMiwzLDEsMSwxLDIsMSwzLDAsMSwyLDAsMSwzLDIsMSwzLDAsNSw1LDEsMCwwLDEsMywyLDEsMCwzLDAsMCwxLDAsMCwwLDAsMCwzLDQsMCwxLDEsMSwzLDIsMCwyLDAsMSwwLDIsMywzLDEsMiwzLDAsMSwwLDEsMCw0KSwKKDAsMCwwLDEsMCwzLDAsMywwLDIsMiwxLDAsMCw0LDAsMywwLDMsMSwzLDAsMywwLDMsMCwxLDAsMywwLDMsMSwzLDAsMywzLDAsMCwxLDIsMSwxLDEsMCwxLDIsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMiwyLDEsMiwwLDAsMiwwLDAsMCwwLDIsMywzLDMsMywwLDAsMCwwLDEsNCksCigwLDAsMCwzLDAsMywwLDAsMCwwLDMsMSwxLDAsMywwLDEsMCwyLDAsMSwwLDAsMCwwLDAsMCwwLDEsMCwzLDAsMiwwLDIsMywwLDAsMiwyLDMsMSwyLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDIsMCwwLDAsMCwyLDMpLAooMiw0LDAsNSwwLDUsMCw0LDAsMyw0LDMsMywzLDQsMywzLDMsNCwzLDQsNCw1LDQsNSw1LDUsMiwzLDAsNSw1LDQsMSw1LDQsMywxLDUsNCwzLDQsNCwzLDMsNCwzLDMsMCwzLDIsMCwyLDMsMCwzLDAsMCwzLDMsMCw1LDMsMiwzLDMsMCwzLDAsMywwLDMsNCw1LDQsNSwzLDAsNCwzLDAsMyw0KSwKKDAsMywwLDMsMCwzLDAsMywwLDMsMyw0LDMsMiwzLDIsMywwLDQsMywzLDMsMywzLDMsMywzLDAsMywyLDQsMywzLDEsMyw0LDMsNCw0LDQsMyw0LDQsMywyLDQsNCwxLDAsMiwwLDAsMSwxLDAsMiwwLDAsMywxLDAsNSwzLDIsMSwzLDAsMywwLDEsMiw0LDMsMiw0LDMsMywwLDMsMiwwLDQsNCksCigwLDMsMCwzLDAsMSwwLDAsMCwxLDQsMywzLDIsMywxLDMsMSw0LDIsMywyLDQsMiwzLDQsMywwLDIsMiwzLDMsMywwLDMsMywzLDAsMyw0LDEsMywzLDAsMyw0LDMsMywwLDEsMSwwLDEsMCwwLDAsNCwwLDMsMCwwLDMsMSwyLDEsMywwLDQsMCwxLDAsNCwzLDMsNCwzLDMsMCwyLDAsMCwzLDMpLAooMCwzLDAsNCwwLDEsMCwzLDAsMyw0LDMsMywwLDMsMywzLDEsMywxLDMsMyw0LDMsMywzLDAsMCwzLDEsNSwzLDMsMSwzLDMsMiw1LDQsMywzLDQsNSwzLDIsNSwzLDQsMCwxLDAsMCwwLDAsMCwyLDAsMCwxLDEsMCw0LDIsMiwxLDMsMCwzLDAsMiwwLDQsNCwzLDUsMywyLDAsMSwxLDAsMyw0KSwKKDAsNSwwLDQsMCw1LDAsMiwwLDQsNCwzLDMsMiwzLDMsMywxLDQsMyw0LDEsNSwzLDQsMyw0LDAsNCwyLDQsMyw0LDEsNSw0LDAsNCw0LDQsNCw1LDQsMSwzLDUsNCwyLDEsNCwxLDEsMywyLDAsMywxLDAsMywyLDEsNCwzLDMsMyw0LDAsNCwwLDMsMCw0LDQsNCwzLDMsMywwLDQsMiwwLDMsNCksCigxLDQsMCw0LDAsMywwLDEsMCwzLDMsMywxLDEsMywzLDIsMiwzLDMsMSwwLDMsMiwyLDEsMiwwLDMsMSwyLDEsMiwwLDMsMiwwLDIsMiwzLDMsNCwzLDAsMywzLDEsMiwwLDEsMSwzLDEsMiwwLDAsMywwLDEsMSwwLDMsMiwyLDMsMywwLDMsMCwwLDAsMiwzLDMsNCwzLDMsMCwxLDAsMCwxLDQpLAooMCw0LDAsNCwwLDQsMCwwLDAsMyw0LDQsMywxLDQsMiwzLDIsMywzLDMsMSw0LDMsNCwwLDMsMCw0LDIsMywzLDIsMiw1LDQsMiwxLDMsNCwzLDQsMywxLDMsMyw0LDIsMCwyLDEsMCwzLDMsMCwwLDIsMCwzLDEsMCw0LDQsMyw0LDMsMCw0LDAsMSwwLDIsNCw0LDQsNCw0LDAsMywyLDAsMywzKSwKKDAsMCwwLDEsMCw0LDAsMCwwLDAsMCwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDAsMywyLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMiksCigwLDIsMCwzLDAsNCwwLDQsMCwxLDMsMywzLDAsNCwwLDIsMSwyLDEsMSwxLDIsMCwzLDEsMSwwLDEsMCwzLDEsMCwwLDMsMywyLDAsMSwxLDAsMCwwLDAsMCwxLDAsMiwwLDIsMiwwLDMsMSwwLDAsMSwwLDEsMSwwLDEsMiwwLDMsMCwwLDAsMCwxLDAsMCwzLDMsNCwzLDEsMCwxLDAsMywwLDIpLAooMCwwLDAsMywwLDUsMCwwLDAsMCwxLDAsMiwwLDMsMSwwLDEsMywwLDAsMCwyLDAsMCwwLDEsMCwwLDAsMSwxLDAsMCw0LDAsMCwwLDIsMywwLDEsNCwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwzLDAsMCwwLDAsMCwzKSwKKDAsMiwwLDUsMCw1LDAsMSwwLDIsNCwzLDMsMiw1LDEsMywyLDMsMywzLDAsNCwxLDIsMCwzLDAsNCwwLDIsMiwxLDEsNSwzLDAsMCwxLDQsMiwzLDIsMCwzLDMsMywyLDAsMiw0LDEsMSwyLDAsMSwxLDAsMywxLDAsMSwzLDEsMiwzLDAsMiwwLDAsMCwxLDMsNSw0LDQsNCwwLDMsMCwwLDEsMyksCigwLDQsMCw1LDAsNCwwLDQsMCw0LDUsNCwzLDMsNCwzLDMsMyw0LDMsNCw0LDUsMyw0LDUsNCwyLDQsMiwzLDQsMywxLDQsNCwxLDMsNSw0LDQsNSw1LDQsNCw1LDUsNSwyLDMsMywxLDQsMywxLDMsMywwLDMsMywxLDQsMyw0LDQsNCwwLDMsMCw0LDAsMywzLDQsNCw1LDAsMCw0LDMsMCw0LDUpLAooMCw0LDAsNCwwLDMsMCwzLDAsMyw0LDQsNCwzLDMsMiw0LDMsNCwzLDQsMyw1LDMsNCwzLDIsMSw0LDIsNCw0LDMsMSwzLDQsMiw0LDUsNSwzLDQsNSw0LDEsNSw0LDMsMCwzLDIsMiwzLDIsMSwzLDEsMCwzLDMsMyw1LDMsMywzLDUsNCw0LDIsMywzLDQsMywzLDMsMiwxLDAsMywyLDEsNCwzKSwKKDAsNCwwLDUsMCw0LDAsMywwLDMsNSw1LDMsMiw0LDMsNCwwLDUsNCw0LDEsNCw0LDQsMywzLDMsNCwzLDUsNSwyLDMsMyw0LDEsMiw1LDUsMyw1LDUsMiwzLDUsNSw0LDAsMywyLDAsMywzLDEsMSw1LDEsNCwxLDAsNCwzLDIsMyw1LDAsNCwwLDMsMCw1LDQsMyw0LDMsMCwwLDQsMSwwLDQsNCksCigxLDMsMCw0LDAsMiwwLDIsMCwyLDUsNSwzLDMsMywzLDMsMCw0LDIsMyw0LDQsNCwzLDQsMCwwLDMsNCw1LDQsMywzLDMsMywyLDUsNSw0LDUsNSw1LDQsMyw1LDUsNSwxLDMsMSwwLDEsMCwwLDMsMiwwLDQsMiwwLDUsMiwzLDIsNCwxLDMsMCwzLDAsNCw1LDQsNSw0LDMsMCw0LDIsMCw1LDQpLAooMCwzLDAsNCwwLDUsMCwzLDAsMyw0LDQsMywyLDMsMiwzLDMsMywzLDMsMiw0LDMsMywyLDIsMCwzLDMsMywzLDMsMSwzLDMsMywwLDQsNCwzLDQsNCwxLDEsNCw0LDIsMCwzLDEsMCwxLDEsMCw0LDEsMCwyLDMsMSwzLDMsMSwzLDQsMCwzLDAsMSwwLDMsMSwzLDAsMCwxLDAsMiwwLDAsNCw0KSwKKDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCksCigwLDMsMCwzLDAsMiwwLDMsMCwxLDUsNCwzLDMsMywxLDQsMiwxLDIsMyw0LDQsMiw0LDQsNSwwLDMsMSw0LDMsNCwwLDQsMywzLDMsMiwzLDIsNSwzLDQsMywyLDIsMywwLDAsMywwLDIsMSwwLDEsMiwwLDAsMCwwLDIsMSwxLDMsMSwwLDIsMCw0LDAsMyw0LDQsNCw1LDIsMCwyLDAsMCwxLDMpLAooMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMSwxLDAsMCwxLDEsMCwwLDAsNCwyLDEsMSwwLDEsMCwzLDIsMCwwLDMsMSwxLDEsMiwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMSwwLDAsMCwyLDAsMCwwLDEsNCwwLDQsMiwxLDAsMCwwLDAsMCwxKSwKKDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDMsMSwwLDAsMCwyLDAsMiwxLDAsMCwxLDIsMSwwLDEsMSwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwzLDEsMCwwLDAsMCwwLDEsMCwwLDIsMSwwLDAsMCwwLDAsMCwwLDAsMiksCigwLDQsMCw0LDAsNCwwLDMsMCw0LDQsMyw0LDIsNCwzLDIsMCw0LDQsNCwzLDUsMyw1LDMsMywyLDQsMiw0LDMsNCwzLDEsNCwwLDIsMyw0LDQsNCwzLDMsMyw0LDQsNCwzLDQsMSwzLDQsMywyLDEsMiwxLDMsMywzLDQsNCwzLDMsNSwwLDQsMCwzLDAsNCwzLDMsMywyLDEsMCwzLDAsMCwzLDMpLAooMCw0LDAsMywwLDMsMCwzLDAsMyw1LDUsMywzLDMsMyw0LDMsNCwzLDMsMyw0LDQsNCwzLDMsMywzLDQsMyw1LDMsMywxLDMsMiw0LDUsNSw1LDUsNCwzLDQsNSw1LDMsMiwyLDMsMywzLDMsMiwzLDMsMSwyLDMsMiw0LDMsMywzLDQsMCw0LDAsMiwwLDQsMywyLDIsMSwyLDAsMywwLDAsNCwxKSwKKQoKY2xhc3MgSmFwYW5lc2VDb250ZXh0QW5hbHlzaXMob2JqZWN0KToKICAgIE5VTV9PRl9DQVRFR09SWSA9IDYKICAgIERPTlRfS05PVyA9IC0xCiAgICBFTk9VR0hfUkVMX1RIUkVTSE9MRCA9IDEwMAogICAgTUFYX1JFTF9USFJFU0hPTEQgPSAxMDAwCiAgICBNSU5JTVVNX0RBVEFfVEhSRVNIT0xEID0gNAoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl90b3RhbF9yZWwgPSBOb25lCiAgICAgICAgc2VsZi5fcmVsX3NhbXBsZSA9IE5vbmUKICAgICAgICBzZWxmLl9uZWVkX3RvX3NraXBfY2hhcl9udW0gPSBOb25lCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyX29yZGVyID0gTm9uZQogICAgICAgIHNlbGYuX2RvbmUgPSBOb25lCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHNlbGYuX3RvdGFsX3JlbCA9IDAgICMgdG90YWwgc2VxdWVuY2UgcmVjZWl2ZWQKICAgICAgICAjIGNhdGVnb3J5IGNvdW50ZXJzLCBlYWNoIGludGVnZXIgY291bnRzIHNlcXVlbmNlIGluIGl0cyBjYXRlZ29yeQogICAgICAgIHNlbGYuX3JlbF9zYW1wbGUgPSBbMF0gKiBzZWxmLk5VTV9PRl9DQVRFR09SWQogICAgICAgICMgaWYgbGFzdCBieXRlIGluIGN1cnJlbnQgYnVmZmVyIGlzIG5vdCB0aGUgbGFzdCBieXRlIG9mIGEgY2hhcmFjdGVyLAogICAgICAgICMgd2UgbmVlZCB0byBrbm93IGhvdyBtYW55IGJ5dGVzIHRvIHNraXAgaW4gbmV4dCBidWZmZXIKICAgICAgICBzZWxmLl9uZWVkX3RvX3NraXBfY2hhcl9udW0gPSAwCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyX29yZGVyID0gLTEgICMgVGhlIG9yZGVyIG9mIHByZXZpb3VzIGNoYXIKICAgICAgICAjIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gVHJ1ZSwgZGV0ZWN0aW9uIGlzIGRvbmUgYW5kIGNvbmNsdXNpb24gaGFzCiAgICAgICAgIyBiZWVuIG1hZGUKICAgICAgICBzZWxmLl9kb25lID0gRmFsc2UKCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0ciwgbnVtX2J5dGVzKToKICAgICAgICBpZiBzZWxmLl9kb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBUaGUgYnVmZmVyIHdlIGdvdCBpcyBieXRlIG9yaWVudGVkLCBhbmQgYSBjaGFyYWN0ZXIgbWF5IHNwYW4gaW4gbW9yZSB0aGFuIG9uZQogICAgICAgICMgYnVmZmVycy4gSW4gY2FzZSB0aGUgbGFzdCBvbmUgb3IgdHdvIGJ5dGUgaW4gbGFzdCBidWZmZXIgaXMgbm90CiAgICAgICAgIyBjb21wbGV0ZSwgd2UgcmVjb3JkIGhvdyBtYW55IGJ5dGUgbmVlZGVkIHRvIGNvbXBsZXRlIHRoYXQgY2hhcmFjdGVyCiAgICAgICAgIyBhbmQgc2tpcCB0aGVzZSBieXRlcyBoZXJlLiAgV2UgY2FuIGNob29zZSB0byByZWNvcmQgdGhvc2UgYnl0ZXMgYXMKICAgICAgICAjIHdlbGwgYW5kIGFuYWx5c2UgdGhlIGNoYXJhY3RlciBvbmNlIGl0IGlzIGNvbXBsZXRlLCBidXQgc2luY2UgYQogICAgICAgICMgY2hhcmFjdGVyIHdpbGwgbm90IG1ha2UgbXVjaCBkaWZmZXJlbmNlLCBieSBzaW1wbHkgc2tpcHBpbmcKICAgICAgICAjIHRoaXMgY2hhcmFjdGVyIHdpbGwgc2ltcGx5IG91ciBsb2dpYyBhbmQgaW1wcm92ZSBwZXJmb3JtYW5jZS4KICAgICAgICBpID0gc2VsZi5fbmVlZF90b19za2lwX2NoYXJfbnVtCiAgICAgICAgd2hpbGUgaSA8IG51bV9ieXRlczoKICAgICAgICAgICAgb3JkZXIsIGNoYXJfbGVuID0gc2VsZi5nZXRfb3JkZXIoYnl0ZV9zdHJbaTppICsgMl0pCiAgICAgICAgICAgIGkgKz0gY2hhcl9sZW4KICAgICAgICAgICAgaWYgaSA+IG51bV9ieXRlczoKICAgICAgICAgICAgICAgIHNlbGYuX25lZWRfdG9fc2tpcF9jaGFyX251bSA9IGkgLSBudW1fYnl0ZXMKICAgICAgICAgICAgICAgIHNlbGYuX2xhc3RfY2hhcl9vcmRlciA9IC0xCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiAob3JkZXIgIT0gLTEpIGFuZCAoc2VsZi5fbGFzdF9jaGFyX29yZGVyICE9IC0xKToKICAgICAgICAgICAgICAgICAgICBzZWxmLl90b3RhbF9yZWwgKz0gMQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX3RvdGFsX3JlbCA+IHNlbGYuTUFYX1JFTF9USFJFU0hPTEQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RvbmUgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVsX3NhbXBsZVtqcDJDaGFyQ29udGV4dFtzZWxmLl9sYXN0X2NoYXJfb3JkZXJdW29yZGVyXV0gKz0gMQogICAgICAgICAgICAgICAgc2VsZi5fbGFzdF9jaGFyX29yZGVyID0gb3JkZXIKCiAgICBkZWYgZ290X2Vub3VnaF9kYXRhKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl90b3RhbF9yZWwgPiBzZWxmLkVOT1VHSF9SRUxfVEhSRVNIT0xECgogICAgZGVmIGdldF9jb25maWRlbmNlKHNlbGYpOgogICAgICAgICMgVGhpcyBpcyBqdXN0IG9uZSB3YXkgdG8gY2FsY3VsYXRlIGNvbmZpZGVuY2UuIEl0IHdvcmtzIHdlbGwgZm9yIG1lLgogICAgICAgIGlmIHNlbGYuX3RvdGFsX3JlbCA+IHNlbGYuTUlOSU1VTV9EQVRBX1RIUkVTSE9MRDoKICAgICAgICAgICAgcmV0dXJuIChzZWxmLl90b3RhbF9yZWwgLSBzZWxmLl9yZWxfc2FtcGxlWzBdKSAvIHNlbGYuX3RvdGFsX3JlbAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLkRPTlRfS05PVwoKICAgIGRlZiBnZXRfb3JkZXIoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgIHJldHVybiAtMSwgMQoKY2xhc3MgU0pJU0NvbnRleHRBbmFseXNpcyhKYXBhbmVzZUNvbnRleHRBbmFseXNpcyk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU0pJU0NvbnRleHRBbmFseXNpcywgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX2NoYXJzZXRfbmFtZSA9ICJTSElGVF9KSVMiCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9jaGFyc2V0X25hbWUKCiAgICBkZWYgZ2V0X29yZGVyKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICBpZiBub3QgYnl0ZV9zdHI6CiAgICAgICAgICAgIHJldHVybiAtMSwgMQogICAgICAgICMgZmluZCBvdXQgY3VycmVudCBjaGFyJ3MgYnl0ZSBsZW5ndGgKICAgICAgICBmaXJzdF9jaGFyID0gYnl0ZV9zdHJbMF0KICAgICAgICBpZiAoMHg4MSA8PSBmaXJzdF9jaGFyIDw9IDB4OUYpIG9yICgweEUwIDw9IGZpcnN0X2NoYXIgPD0gMHhGQyk6CiAgICAgICAgICAgIGNoYXJfbGVuID0gMgogICAgICAgICAgICBpZiAoZmlyc3RfY2hhciA9PSAweDg3KSBvciAoMHhGQSA8PSBmaXJzdF9jaGFyIDw9IDB4RkMpOgogICAgICAgICAgICAgICAgc2VsZi5fY2hhcnNldF9uYW1lID0gIkNQOTMyIgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNoYXJfbGVuID0gMQoKICAgICAgICAjIHJldHVybiBpdHMgb3JkZXIgaWYgaXQgaXMgaGlyYWdhbmEKICAgICAgICBpZiBsZW4oYnl0ZV9zdHIpID4gMToKICAgICAgICAgICAgc2Vjb25kX2NoYXIgPSBieXRlX3N0clsxXQogICAgICAgICAgICBpZiAoZmlyc3RfY2hhciA9PSAyMDIpIGFuZCAoMHg5RiA8PSBzZWNvbmRfY2hhciA8PSAweEYxKToKICAgICAgICAgICAgICAgIHJldHVybiBzZWNvbmRfY2hhciAtIDB4OUYsIGNoYXJfbGVuCgogICAgICAgIHJldHVybiAtMSwgY2hhcl9sZW4KCmNsYXNzIEVVQ0pQQ29udGV4dEFuYWx5c2lzKEphcGFuZXNlQ29udGV4dEFuYWx5c2lzKToKICAgIGRlZiBnZXRfb3JkZXIoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgIGlmIG5vdCBieXRlX3N0cjoKICAgICAgICAgICAgcmV0dXJuIC0xLCAxCiAgICAgICAgIyBmaW5kIG91dCBjdXJyZW50IGNoYXIncyBieXRlIGxlbmd0aAogICAgICAgIGZpcnN0X2NoYXIgPSBieXRlX3N0clswXQogICAgICAgIGlmIChmaXJzdF9jaGFyID09IDB4OEUpIG9yICgweEExIDw9IGZpcnN0X2NoYXIgPD0gMHhGRSk6CiAgICAgICAgICAgIGNoYXJfbGVuID0gMgogICAgICAgIGVsaWYgZmlyc3RfY2hhciA9PSAweDhGOgogICAgICAgICAgICBjaGFyX2xlbiA9IDMKICAgICAgICBlbHNlOgogICAgICAgICAgICBjaGFyX2xlbiA9IDEKCiAgICAgICAgIyByZXR1cm4gaXRzIG9yZGVyIGlmIGl0IGlzIGhpcmFnYW5hCiAgICAgICAgaWYgbGVuKGJ5dGVfc3RyKSA+IDE6CiAgICAgICAgICAgIHNlY29uZF9jaGFyID0gYnl0ZV9zdHJbMV0KICAgICAgICAgICAgaWYgKGZpcnN0X2NoYXIgPT0gMHhBNCkgYW5kICgweEExIDw9IHNlY29uZF9jaGFyIDw9IDB4RjMpOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlY29uZF9jaGFyIC0gMHhBMSwgY2hhcl9sZW4KCiAgICAgICAgcmV0dXJuIC0xLCBjaGFyX2xlbgoKClBLAwQUAAAAAAAAACEA8GjJyicyAAAnMgAAOQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdidWxnYXJpYW5tb2RlbC5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyAyNTU6IENvbnRyb2wgY2hhcmFjdGVycyB0aGF0IHVzdWFsbHkgZG9lcyBub3QgZXhpc3QgaW4gYW55IHRleHQKIyAyNTQ6IENhcnJpYWdlL1JldHVybgojIDI1Mzogc3ltYm9sIChwdW5jdHVhdGlvbikgdGhhdCBkb2VzIG5vdCBiZWxvbmcgdG8gd29yZAojIDI1MjogMCAtIDkKCiMgQ2hhcmFjdGVyIE1hcHBpbmcgVGFibGU6CiMgdGhpcyB0YWJsZSBpcyBtb2RpZmllZCBiYXNlIG9uIHdpbjEyNTFCdWxnYXJpYW5DaGFyVG9PcmRlck1hcCwgc28KIyBvbmx5IG51bWJlciA8NjQgaXMgc3VyZSB2YWxpZAoKTGF0aW41X0J1bGdhcmlhbkNoYXJUb09yZGVyTWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywgNzcsIDkwLCA5OSwxMDAsIDcyLDEwOSwxMDcsMTAxLCA3OSwxODUsIDgxLDEwMiwgNzYsIDk0LCA4MiwgICMgNDAKMTEwLDE4NiwxMDgsIDkxLCA3NCwxMTksIDg0LCA5NiwxMTEsMTg3LDExNSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA1MAoyNTMsIDY1LCA2OSwgNzAsIDY2LCA2MywgNjgsMTEyLDEwMywgOTIsMTk0LDEwNCwgOTUsIDg2LCA4NywgNzEsICAjIDYwCjExNiwxOTUsIDg1LCA5MywgOTcsMTEzLDE5NiwxOTcsMTk4LDE5OSwyMDAsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNzAKMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LDIwNywyMDgsMjA5LCAgIyA4MAoyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsMjIzLDIyNCwyMjUsICAjIDkwCiA4MSwyMjYsMjI3LDIyOCwyMjksMjMwLDEwNSwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwgNDUsMjM3LDIzOCwgICMgYTAKIDMxLCAzMiwgMzUsIDQzLCAzNywgNDQsIDU1LCA0NywgNDAsIDU5LCAzMywgNDYsIDM4LCAzNiwgNDEsIDMwLCAgIyBiMAogMzksIDI4LCAzNCwgNTEsIDQ4LCA0OSwgNTMsIDUwLCA1NCwgNTcsIDYxLDIzOSwgNjcsMjQwLCA2MCwgNTYsICAjIGMwCiAgMSwgMTgsICA5LCAyMCwgMTEsICAzLCAyMywgMTUsICAyLCAyNiwgMTIsIDEwLCAxNCwgIDYsICA0LCAxMywgICMgZDAKICA3LCAgOCwgIDUsIDE5LCAyOSwgMjUsIDIyLCAyMSwgMjcsIDI0LCAxNywgNzUsIDUyLDI0MSwgNDIsIDE2LCAgIyBlMAogNjIsMjQyLDI0MywyNDQsIDU4LDI0NSwgOTgsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsIDkxLDI1MiwyNTMsICAjIGYwCikKCndpbjEyNTFCdWxnYXJpYW5DaGFyVG9PcmRlck1hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsIDc3LCA5MCwgOTksMTAwLCA3MiwxMDksMTA3LDEwMSwgNzksMTg1LCA4MSwxMDIsIDc2LCA5NCwgODIsICAjIDQwCjExMCwxODYsMTA4LCA5MSwgNzQsMTE5LCA4NCwgOTYsMTExLDE4NywxMTUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNTAKMjUzLCA2NSwgNjksIDcwLCA2NiwgNjMsIDY4LDExMiwxMDMsIDkyLDE5NCwxMDQsIDk1LCA4NiwgODcsIDcxLCAgIyA2MAoxMTYsMTk1LCA4NSwgOTMsIDk3LDExMywxOTYsMTk3LDE5OCwxOTksMjAwLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDcwCjIwNiwyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMTIwLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwgICMgODAKMjIxLCA3OCwgNjQsIDgzLDEyMSwgOTgsMTE3LDEwNSwyMjIsMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LCAgIyA5MAogODgsMjMwLDIzMSwyMzIsMjMzLDEyMiwgODksMTA2LDIzNCwyMzUsMjM2LDIzNywyMzgsIDQ1LDIzOSwyNDAsICAjIGEwCiA3MywgODAsMTE4LDExNCwyNDEsMjQyLDI0MywyNDQsMjQ1LCA2MiwgNTgsMjQ2LDI0NywyNDgsMjQ5LDI1MCwgICMgYjAKIDMxLCAzMiwgMzUsIDQzLCAzNywgNDQsIDU1LCA0NywgNDAsIDU5LCAzMywgNDYsIDM4LCAzNiwgNDEsIDMwLCAgIyBjMAogMzksIDI4LCAzNCwgNTEsIDQ4LCA0OSwgNTMsIDUwLCA1NCwgNTcsIDYxLDI1MSwgNjcsMjUyLCA2MCwgNTYsICAjIGQwCiAgMSwgMTgsICA5LCAyMCwgMTEsICAzLCAyMywgMTUsICAyLCAyNiwgMTIsIDEwLCAxNCwgIDYsICA0LCAxMywgICMgZTAKICA3LCAgOCwgIDUsIDE5LCAyOSwgMjUsIDIyLCAyMSwgMjcsIDI0LCAxNywgNzUsIDUyLDI1MywgNDIsIDE2LCAgIyBmMAopCgojIE1vZGVsIFRhYmxlOgojIHRvdGFsIHNlcXVlbmNlczogMTAwJQojIGZpcnN0IDUxMiBzZXF1ZW5jZXM6IDk2LjkzOTIlCiMgZmlyc3QgMTAyNCBzZXF1ZW5jZXM6My4wNjE4JQojIHJlc3QgIHNlcXVlbmNlczogICAgIDAuMjk5MiUKIyBuZWdhdGl2ZSBzZXF1ZW5jZXM6ICAwLjAwMjAlCkJ1bGdhcmlhbkxhbmdNb2RlbCA9ICgKMCwzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDMsMywzLDMsMywzLDIsMywzLDMsMywzLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMCwzLDMsMywyLDIsMywyLDIsMSwyLDIsCjMsMSwzLDMsMiwzLDMsMywzLDMsMywzLDMsMywzLDMsMywwLDMsMywzLDMsMywzLDMsMywzLDMsMCwzLDAsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDIsMywzLDMsMywzLDMsMywzLDAsMywxLDAsCjAsMSwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywyLDIsMiwzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDEsMywyLDMsMywzLDMsMywzLDMsMywwLDMsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMiwzLDMsMiwzLDMsMywzLDMsMywzLDMsMywzLDMsMywxLDMsMiwzLDMsMywzLDMsMywzLDMsMCwzLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDIsMiwxLDMsMywzLDMsMiwyLDIsMSwxLDIsMCwxLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDMsMywyLDMsMiwyLDMsMywxLDEsMiwzLDMsMiwzLDMsMywzLDIsMSwyLDAsMiwwLDMsMCwwLAowLDAsMCwwLDAsMCwwLDEsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywzLDMsMSwzLDMsMywzLDMsMiwzLDIsMywzLDMsMywzLDIsMywzLDEsMywwLDMsMCwyLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMywzLDMsMSwzLDMsMiwzLDMsMywxLDMsMywyLDMsMiwyLDIsMCwwLDIsMCwyLDAsMiwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDMsMywzLDMsMCwzLDMsMywyLDIsMywzLDMsMSwyLDIsMywyLDEsMSwyLDAsMiwwLDAsMCwwLAoxLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDEsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywzLDMsMiwzLDMsMSwyLDMsMiwyLDIsMywzLDMsMywzLDIsMiwzLDEsMiwwLDIsMSwyLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwxLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMSwzLDMsMywzLDMsMiwzLDMsMywyLDMsMywyLDMsMiwyLDIsMywxLDIsMCwxLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDMsMywzLDMsMywzLDEsMSwxLDIsMiwxLDMsMSwzLDIsMiwzLDAsMCwxLDAsMSwwLDEsMCwwLAowLDAsMCwxLDAsMCwwLDAsMSwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywyLDIsMywyLDIsMywxLDIsMSwxLDEsMiwzLDEsMywxLDIsMiwwLDEsMSwxLDEsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMSwzLDIsMiwzLDMsMSwyLDMsMSwxLDMsMywzLDMsMSwyLDIsMSwxLDEsMCwyLDAsMiwwLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMSwyLDIsMywzLDMsMiwyLDEsMSwyLDAsMiwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMCwxLDIsMSwzLDMsMiwzLDMsMywzLDMsMiwzLDIsMSwwLDMsMSwyLDEsMiwxLDIsMywyLDEsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDEsMSwyLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDAsMCwzLDEsMywzLDIsMywzLDIsMiwyLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwzLDMsMywzLDAsMywzLDMsMywzLDIsMSwxLDIsMSwzLDMsMCwzLDEsMSwxLDEsMywyLDAsMSwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywyLDIsMiwzLDMsMywzLDMsMywzLDMsMywzLDMsMSwxLDMsMSwzLDMsMiwzLDIsMiwyLDMsMCwyLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMiwzLDMsMiwyLDMsMiwxLDEsMSwxLDEsMywxLDMsMSwxLDAsMCwwLDEsMCwwLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDIsMywyLDAsMywyLDAsMywwLDIsMCwwLDIsMSwzLDEsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMiwxLDEsMSwxLDIsMSwxLDIsMSwxLDEsMiwyLDEsMiwxLDEsMSwwLDEsMSwwLDEsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDIsMSwzLDEsMSwyLDEsMywyLDEsMSwwLDEsMiwzLDIsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwzLDMsMywzLDIsMiwxLDAsMSwwLDAsMSwwLDAsMCwyLDEsMCwzLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDIsMywyLDMsMywxLDMsMiwxLDEsMSwyLDEsMSwyLDEsMywwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDEsMSwyLDIsMywzLDIsMywyLDIsMiwzLDEsMiwyLDEsMSwyLDEsMSwyLDIsMCwxLDEsMCwxLDAsMiwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywyLDEsMywxLDAsMiwyLDEsMywyLDEsMCwwLDIsMCwyLDAsMSwwLDAsMCwwLDAsMCwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywzLDEsMiwwLDIsMywxLDIsMywyLDAsMSwzLDEsMiwxLDEsMSwwLDAsMSwwLDAsMiwyLDIsMywKMiwyLDIsMiwxLDIsMSwxLDIsMiwxLDEsMiwwLDEsMSwxLDAsMCwxLDEsMCwwLDEsMSwwLDAsMCwxLDEsMCwxLAozLDMsMywzLDMsMiwxLDIsMiwxLDIsMCwyLDAsMSwwLDEsMiwxLDIsMSwxLDAsMCwwLDEsMCwxLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDIsMywzLDEsMSwzLDEsMCwzLDIsMSwwLDAsMCwxLDIsMCwyLDAsMSwwLDAsMCwxLDAsMSwyLDEsMiwyLAoxLDEsMSwxLDEsMSwxLDIsMiwyLDEsMSwxLDEsMSwxLDEsMCwxLDIsMSwxLDEsMCwwLDAsMCwwLDEsMSwwLDAsCjMsMSwwLDEsMCwyLDMsMiwyLDIsMywyLDIsMiwyLDIsMSwwLDIsMSwyLDEsMSwxLDAsMSwyLDEsMiwyLDIsMSwKMSwxLDIsMiwyLDIsMSwyLDEsMSwwLDEsMiwxLDIsMiwyLDEsMSwxLDAsMSwxLDEsMSwyLDAsMSwwLDAsMCwwLAoyLDMsMiwzLDMsMCwwLDIsMSwwLDIsMSwwLDAsMCwwLDIsMywwLDIsMCwwLDAsMCwwLDEsMCwwLDIsMCwxLDIsCjIsMSwyLDEsMiwyLDEsMSwxLDIsMSwxLDEsMCwxLDIsMiwxLDEsMSwxLDEsMCwxLDEsMSwwLDAsMSwyLDAsMCwKMywzLDIsMiwzLDAsMiwzLDEsMSwyLDAsMCwwLDEsMCwwLDIsMCwyLDAsMCwwLDEsMCwxLDAsMSwyLDAsMiwyLAoxLDEsMSwxLDIsMSwwLDEsMiwyLDIsMSwxLDEsMSwxLDEsMSwwLDEsMSwxLDAsMCwwLDAsMCwwLDEsMSwwLDAsCjIsMywyLDMsMywwLDAsMywwLDEsMSwwLDEsMCwwLDAsMiwyLDEsMiwwLDAsMCwwLDAsMCwwLDAsMiwwLDEsMiwKMiwyLDEsMSwxLDEsMSwyLDIsMiwxLDAsMiwwLDEsMCwxLDAsMCwxLDAsMSwwLDAsMSwwLDAsMCwwLDEsMCwwLAozLDMsMywzLDIsMiwyLDIsMiwwLDIsMSwxLDEsMSwyLDEsMiwxLDEsMCwyLDAsMSwwLDEsMCwwLDIsMCwxLDIsCjEsMSwxLDEsMSwxLDEsMiwyLDEsMSwwLDIsMCwxLDAsMiwwLDAsMSwxLDEsMCwwLDIsMCwwLDAsMSwxLDAsMCwKMiwzLDMsMywzLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwxLDEsMCwwLDAsMCwwLDAsMSwyLDAsMSwyLAoyLDIsMiwxLDEsMiwxLDEsMiwyLDIsMSwyLDAsMSwxLDEsMSwxLDEsMCwxLDEsMSwxLDAsMCwxLDEsMSwwLDAsCjIsMywzLDMsMywwLDIsMiwwLDIsMSwwLDAsMCwxLDEsMSwyLDAsMiwwLDAsMCwzLDAsMCwwLDAsMiwwLDIsMiwKMSwxLDEsMiwxLDIsMSwxLDIsMiwyLDEsMiwwLDEsMSwxLDAsMSwxLDEsMSwwLDIsMSwwLDAsMCwxLDEsMCwwLAoyLDMsMywzLDMsMCwyLDEsMCwwLDIsMCwwLDAsMCwwLDEsMiwwLDIsMCwwLDAsMCwwLDAsMCwwLDIsMCwxLDIsCjEsMSwxLDIsMSwxLDEsMSwyLDIsMiwwLDEsMCwxLDEsMSwwLDAsMSwxLDEsMCwwLDEsMCwwLDAsMCwxLDAsMCwKMywzLDIsMiwzLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwxLDEsMCwzLDAsMCwwLDAsMCwwLDAsMCwxLDAsMiwyLAoxLDEsMSwxLDEsMiwxLDEsMiwyLDEsMiwyLDEsMCwxLDEsMSwxLDEsMCwxLDAsMCwxLDAsMCwwLDEsMSwwLDAsCjMsMSwwLDEsMCwyLDIsMiwyLDMsMiwxLDEsMSwyLDMsMCwwLDEsMCwyLDEsMSwwLDEsMSwxLDEsMiwxLDEsMSwKMSwyLDIsMSwyLDEsMiwyLDEsMSwwLDEsMiwxLDIsMiwxLDEsMSwwLDAsMSwxLDEsMiwxLDAsMSwwLDAsMCwwLAoyLDEsMCwxLDAsMywxLDIsMiwyLDIsMSwyLDIsMSwxLDEsMCwyLDEsMiwyLDEsMSwyLDEsMSwwLDIsMSwxLDEsCjEsMiwyLDIsMiwyLDIsMiwxLDIsMCwxLDEsMCwyLDEsMSwxLDEsMSwwLDAsMSwxLDEsMSwwLDEsMCwwLDAsMCwKMiwxLDEsMSwxLDIsMiwyLDIsMSwyLDIsMiwxLDIsMiwxLDEsMiwxLDIsMywyLDIsMSwxLDEsMSwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMiwyLDMsMiwwLDEsMiwwLDEsMiwxLDEsMCwxLDAsMSwyLDEsMiwwLDAsMCwxLDEsMCwwLDAsMSwwLDAsMiwKMSwxLDAsMCwxLDEsMCwxLDEsMSwxLDAsMiwwLDEsMSwxLDAsMCwxLDEsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLAoyLDAsMCwwLDAsMSwyLDIsMiwyLDIsMiwyLDEsMiwxLDEsMSwxLDEsMSwxLDAsMSwxLDEsMSwxLDIsMSwxLDEsCjEsMiwyLDIsMiwxLDEsMiwxLDIsMSwxLDEsMCwyLDEsMiwxLDEsMSwwLDIsMSwxLDEsMSwwLDEsMCwwLDAsMCwKMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLAoxLDEsMCwxLDAsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMiwyLDMsMiwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMiwKMSwxLDEsMSwxLDEsMCwwLDIsMiwyLDIsMiwwLDEsMSwwLDEsMSwxLDEsMSwwLDAsMSwwLDAsMCwxLDEsMCwxLAoyLDMsMSwyLDEsMCwxLDEsMCwyLDIsMiwwLDAsMSwwLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDEsMCwxLDIsCjEsMSwxLDEsMiwxLDEsMSwxLDEsMSwxLDEsMCwxLDEsMCwxLDAsMSwwLDEsMCwwLDEsMCwwLDAsMCwxLDAsMCwKMiwyLDIsMiwyLDAsMCwyLDAsMCwyLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwyLDAsMiwyLAoxLDEsMSwxLDEsMCwwLDEsMiwxLDEsMCwxLDAsMSwwLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMiwyLDIsMiwwLDAsMiwwLDEsMSwwLDAsMCwxLDAsMCwyLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwKMCwwLDAsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDEsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDIsMiwzLDIsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLDIsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDIsCjEsMSwwLDAsMSwwLDAsMCwxLDEsMCwwLDEsMCwxLDEsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwxLDIsMiwyLDEsMiwxLDIsMiwxLDEsMiwxLDEsMSwwLDEsMSwxLDEsMiwwLDEsMCwxLDEsMSwxLDAsMSwxLAoxLDEsMiwxLDEsMSwxLDEsMSwwLDAsMSwyLDEsMSwxLDEsMSwxLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDEsMywxLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMiwyLDEsMCwwLDEsMCwyLDAsMCwwLDAsMCwxLDEsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDEsCjAsMiwwLDEsMCwwLDEsMSwyLDAsMSwwLDEsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwyLDIsMiwyLDAsMSwxLDAsMiwxLDAsMSwxLDEsMCwwLDEsMCwyLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLAowLDEsMCwwLDEsMCwwLDAsMSwxLDAsMCwxLDAsMCwxLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMiwyLDIsMiwwLDAsMSwwLDAsMCwxLDAsMSwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMCwxLDAsMSwxLDEsMCwwLDEsMSwxLDAsMSwwLDAsMCwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDAsMSwwLDAsMSwyLDEsMSwxLDEsMSwxLDIsMiwxLDAsMCwxLDAsMSwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsCjEsMSwyLDEsMSwxLDEsMCwwLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDEsMiwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAowLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwxLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCjAsMSwxLDAsMSwxLDEsMCwwLDEsMCwwLDEsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMSwwLDEsMCwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMSwwLDIsMCwwLDIsMCwxLDAsMCwxLDAsMCwxLAoxLDEsMCwwLDEsMSwwLDEsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwKMSwxLDEsMSwxLDEsMSwyLDAsMCwwLDAsMCwwLDIsMSwwLDEsMSwwLDAsMSwxLDEsMCwxLDAsMCwwLDAsMCwwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwwLDEsMSwwLDEsMSwxLDEsMSwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCikKCkxhdGluNUJ1bGdhcmlhbk1vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IExhdGluNV9CdWxnYXJpYW5DaGFyVG9PcmRlck1hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBCdWxnYXJpYW5MYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk2OTM5MiwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAiSVNPLTg4NTktNSIsCiAgJ2xhbmd1YWdlJzogJ0J1bGdhaXJhbicsCn0KCldpbjEyNTFCdWxnYXJpYW5Nb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiB3aW4xMjUxQnVsZ2FyaWFuQ2hhclRvT3JkZXJNYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogQnVsZ2FyaWFuTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45NjkzOTIsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBGYWxzZSwKICAnY2hhcnNldF9uYW1lJzogIndpbmRvd3MtMTI1MSIsCiAgJ2xhbmd1YWdlJzogJ0J1bGdhcmlhbicsCn0KUEsDBBQAAAAAAAAAIQDI8VabHEYAABxGAAA4AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2N5cmlsbGljbW9kZWwucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgS09JOC1SIGxhbmd1YWdlIG1vZGVsCiMgQ2hhcmFjdGVyIE1hcHBpbmcgVGFibGU6CktPSThSX2NoYXJfdG9fb3JkZXJfbWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLCA3NCwxNTMsIDc1LDE1NCwgICMgNDAKMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA1MAoyNTMsIDcxLDE3MiwgNjYsMTczLCA2NSwxNzQsIDc2LDE3NSwgNjQsMTc2LDE3NywgNzcsIDcyLDE3OCwgNjksICAjIDYwCiA2NywxNzksIDc4LCA3MywxODAsMTgxLCA3OSwxODIsMTgzLDE4NCwxODUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNzAKMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LCAgIyA4MAoyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsICAjIDkwCjIyMywyMjQsMjI1LCA2OCwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywgICMgYTAKMjM4LDIzOSwyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsMjUzLCAgIyBiMAogMjcsICAzLCAyMSwgMjgsIDEzLCAgMiwgMzksIDE5LCAyNiwgIDQsIDIzLCAxMSwgIDgsIDEyLCAgNSwgIDEsICAjIGMwCiAxNSwgMTYsICA5LCAgNywgIDYsIDE0LCAyNCwgMTAsIDE3LCAxOCwgMjAsIDI1LCAzMCwgMjksIDIyLCA1NCwgICMgZDAKIDU5LCAzNywgNDQsIDU4LCA0MSwgNDgsIDUzLCA0NiwgNTUsIDQyLCA2MCwgMzYsIDQ5LCAzOCwgMzEsIDM0LCAgIyBlMAogMzUsIDQzLCA0NSwgMzIsIDQwLCA1MiwgNTYsIDMzLCA2MSwgNjIsIDUxLCA1NywgNDcsIDYzLCA1MCwgNzAsICAjIGYwCikKCndpbjEyNTFfY2hhcl90b19vcmRlcl9tYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsIDc0LDE1MywgNzUsMTU0LCAgIyA0MAoxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNzEsMTcyLCA2NiwxNzMsIDY1LDE3NCwgNzYsMTc1LCA2NCwxNzYsMTc3LCA3NywgNzIsMTc4LCA2OSwgICMgNjAKIDY3LDE3OSwgNzgsIDczLDE4MCwxODEsIDc5LDE4MiwxODMsMTg0LDE4NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAoxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsCjIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwKMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LAoyMzksMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LCA2OCwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTMsCiAzNywgNDQsIDMzLCA0NiwgNDEsIDQ4LCA1NiwgNTEsIDQyLCA2MCwgMzYsIDQ5LCAzOCwgMzEsIDM0LCAzNSwKIDQ1LCAzMiwgNDAsIDUyLCA1MywgNTUsIDU4LCA1MCwgNTcsIDYzLCA3MCwgNjIsIDYxLCA0NywgNTksIDQzLAogIDMsIDIxLCAxMCwgMTksIDEzLCAgMiwgMjQsIDIwLCAgNCwgMjMsIDExLCAgOCwgMTIsICA1LCAgMSwgMTUsCiAgOSwgIDcsICA2LCAxNCwgMzksIDI2LCAyOCwgMjIsIDI1LCAyOSwgNTQsIDE4LCAxNywgMzAsIDI3LCAxNiwKKQoKbGF0aW41X2NoYXJfdG9fb3JkZXJfbWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLCA3NCwxNTMsIDc1LDE1NCwgICMgNDAKMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA1MAoyNTMsIDcxLDE3MiwgNjYsMTczLCA2NSwxNzQsIDc2LDE3NSwgNjQsMTc2LDE3NywgNzcsIDcyLDE3OCwgNjksICAjIDYwCiA2NywxNzksIDc4LCA3MywxODAsMTgxLCA3OSwxODIsMTgzLDE4NCwxODUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNzAKMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LAoyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsCjIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwKIDM3LCA0NCwgMzMsIDQ2LCA0MSwgNDgsIDU2LCA1MSwgNDIsIDYwLCAzNiwgNDksIDM4LCAzMSwgMzQsIDM1LAogNDUsIDMyLCA0MCwgNTIsIDUzLCA1NSwgNTgsIDUwLCA1NywgNjMsIDcwLCA2MiwgNjEsIDQ3LCA1OSwgNDMsCiAgMywgMjEsIDEwLCAxOSwgMTMsICAyLCAyNCwgMjAsICA0LCAyMywgMTEsICA4LCAxMiwgIDUsICAxLCAxNSwKICA5LCAgNywgIDYsIDE0LCAzOSwgMjYsIDI4LCAyMiwgMjUsIDI5LCA1NCwgMTgsIDE3LCAzMCwgMjcsIDE2LAoyMzksIDY4LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTUsCikKCm1hY0N5cmlsbGljX2NoYXJfdG9fb3JkZXJfbWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLCA3NCwxNTMsIDc1LDE1NCwgICMgNDAKMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA1MAoyNTMsIDcxLDE3MiwgNjYsMTczLCA2NSwxNzQsIDc2LDE3NSwgNjQsMTc2LDE3NywgNzcsIDcyLDE3OCwgNjksICAjIDYwCiA2NywxNzksIDc4LCA3MywxODAsMTgxLCA3OSwxODIsMTgzLDE4NCwxODUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNzAKIDM3LCA0NCwgMzMsIDQ2LCA0MSwgNDgsIDU2LCA1MSwgNDIsIDYwLCAzNiwgNDksIDM4LCAzMSwgMzQsIDM1LAogNDUsIDMyLCA0MCwgNTIsIDUzLCA1NSwgNTgsIDUwLCA1NywgNjMsIDcwLCA2MiwgNjEsIDQ3LCA1OSwgNDMsCjE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwKMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLAoyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsCjIzOSwyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsIDY4LCAxNiwKICAzLCAyMSwgMTAsIDE5LCAxMywgIDIsIDI0LCAyMCwgIDQsIDIzLCAxMSwgIDgsIDEyLCAgNSwgIDEsIDE1LAogIDksICA3LCAgNiwgMTQsIDM5LCAyNiwgMjgsIDIyLCAyNSwgMjksIDU0LCAxOCwgMTcsIDMwLCAyNywyNTUsCikKCklCTTg1NV9jaGFyX3RvX29yZGVyX21hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwgNzQsMTUzLCA3NSwxNTQsICAjIDQwCjE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNTAKMjUzLCA3MSwxNzIsIDY2LDE3MywgNjUsMTc0LCA3NiwxNzUsIDY0LDE3NiwxNzcsIDc3LCA3MiwxNzgsIDY5LCAgIyA2MAogNjcsMTc5LCA3OCwgNzMsMTgwLDE4MSwgNzksMTgyLDE4MywxODQsMTg1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDcwCjE5MSwxOTIsMTkzLDE5NCwgNjgsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwKMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsIDI3LCA1OSwgNTQsIDcwLAogIDMsIDM3LCAyMSwgNDQsIDI4LCA1OCwgMTMsIDQxLCAgMiwgNDgsIDM5LCA1MywgMTksIDQ2LDIxOCwyMTksCjIyMCwyMjEsMjIyLDIyMywyMjQsIDI2LCA1NSwgIDQsIDQyLDIyNSwyMjYsMjI3LDIyOCwgMjMsIDYwLDIyOSwKMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsIDExLCAzNiwyMzYsMjM3LDIzOCwyMzksMjQwLDI0MSwyNDIsMjQzLAogIDgsIDQ5LCAxMiwgMzgsICA1LCAzMSwgIDEsIDM0LCAxNSwyNDQsMjQ1LDI0NiwyNDcsIDM1LCAxNiwyNDgsCiA0MywgIDksIDQ1LCAgNywgMzIsICA2LCA0MCwgMTQsIDUyLCAyNCwgNTYsIDEwLCAzMywgMTcsIDYxLDI0OSwKMjUwLCAxOCwgNjIsIDIwLCA1MSwgMjUsIDU3LCAzMCwgNDcsIDI5LCA2MywgMjIsIDUwLDI1MSwyNTIsMjU1LAopCgpJQk04NjZfY2hhcl90b19vcmRlcl9tYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsIDc0LDE1MywgNzUsMTU0LCAgIyA0MAoxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNzEsMTcyLCA2NiwxNzMsIDY1LDE3NCwgNzYsMTc1LCA2NCwxNzYsMTc3LCA3NywgNzIsMTc4LCA2OSwgICMgNjAKIDY3LDE3OSwgNzgsIDczLDE4MCwxODEsIDc5LDE4MiwxODMsMTg0LDE4NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAogMzcsIDQ0LCAzMywgNDYsIDQxLCA0OCwgNTYsIDUxLCA0MiwgNjAsIDM2LCA0OSwgMzgsIDMxLCAzNCwgMzUsCiA0NSwgMzIsIDQwLCA1MiwgNTMsIDU1LCA1OCwgNTAsIDU3LCA2MywgNzAsIDYyLCA2MSwgNDcsIDU5LCA0MywKICAzLCAyMSwgMTAsIDE5LCAxMywgIDIsIDI0LCAyMCwgIDQsIDIzLCAxMSwgIDgsIDEyLCAgNSwgIDEsIDE1LAoxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsCjIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwKMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LAogIDksICA3LCAgNiwgMTQsIDM5LCAyNiwgMjgsIDIyLCAyNSwgMjksIDU0LCAxOCwgMTcsIDMwLCAyNywgMTYsCjIzOSwgNjgsMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1NSwKKQoKIyBNb2RlbCBUYWJsZToKIyB0b3RhbCBzZXF1ZW5jZXM6IDEwMCUKIyBmaXJzdCA1MTIgc2VxdWVuY2VzOiA5Ny42NjAxJQojIGZpcnN0IDEwMjQgc2VxdWVuY2VzOiAyLjMzODklCiMgcmVzdCAgc2VxdWVuY2VzOiAgICAgIDAuMTIzNyUKIyBuZWdhdGl2ZSBzZXF1ZW5jZXM6ICAgMC4wMDA5JQpSdXNzaWFuTGFuZ01vZGVsID0gKAowLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMSwxLDMsMywzLDMsMSwzLDMsMywyLDMsMiwzLDMsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMCwzLDIsMiwyLDIsMiwwLDAsMiwKMywzLDMsMiwzLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDAsMCwzLDMsMywzLDMsMywzLDMsMywyLDMsMiwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDIsMiwzLDMsMywzLDMsMywzLDMsMywyLDMsMywwLDAsMywzLDMsMywzLDMsMywzLDIsMywzLDEsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDIsMywyLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMCwwLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDEsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDAsMCwzLDMsMywzLDMsMywzLDMsMywzLDMsMiwxLAowLDAsMCwwLDAsMSwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywyLDIsMiwzLDEsMywzLDEsMywzLDMsMywyLDIsMywwLDIsMiwyLDMsMywyLDEsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywyLDMsMywzLDMsMywyLDIsMywyLDMsMywzLDIsMSwyLDIsMCwxLDIsMiwyLDIsMiwyLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDIsMiwzLDAsMiwyLDMsMywyLDEsMiwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDIsMywzLDEsMiwzLDIsMiwzLDIsMywzLDMsMywyLDIsMywwLDMsMiwyLDMsMSwxLDEsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMiwyLDMsMywzLDMsMywyLDMsMywzLDMsMiwyLDIsMCwzLDMsMywyLDIsMiwyLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywyLDMsMiwzLDMsMywzLDMsMywyLDMsMiwyLDAsMSwzLDIsMSwyLDIsMSwwLAowLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywyLDEsMSwzLDAsMSwxLDEsMSwyLDEsMSwwLDIsMiwyLDEsMiwwLDEsMCwKMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywyLDMsMywyLDIsMiwyLDEsMywyLDMsMiwzLDIsMSwyLDIsMCwxLDEsMiwxLDIsMSwyLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwyLDMsMiwzLDMsMywyLDIsMiwyLDAsMiwyLDIsMiwzLDEsMSwwLAowLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMiwzLDIsMiwzLDMsMywzLDMsMywzLDMsMywxLDMsMiwwLDAsMywzLDMsMywyLDMsMywzLDMsMiwzLDIsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMywzLDMsMywyLDIsMywzLDAsMiwxLDAsMywyLDMsMiwzLDAsMCwxLDIsMCwwLDEsMCwxLDIsMSwxLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDMsMCwyLDMsMywzLDMsMiwzLDMsMywzLDEsMiwyLDAsMCwyLDMsMiwyLDIsMywyLDMsMiwyLDMsMCwwLAowLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMiwzLDAsMiwzLDIsMywwLDEsMiwzLDMsMiwwLDIsMywwLDAsMiwzLDIsMiwwLDEsMywxLDMsMiwyLDEsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDEsMywwLDIsMywzLDMsMywzLDMsMywzLDIsMSwzLDIsMCwwLDIsMiwzLDMsMywyLDMsMywwLDIsMiwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMiwyLDMsMywyLDIsMiwzLDMsMCwwLDEsMSwxLDEsMSwyLDAsMCwxLDEsMSwxLDAsMSwwLAowLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDIsMiwzLDMsMywzLDMsMywzLDAsMywyLDMsMywyLDMsMiwwLDIsMSwwLDEsMSwwLDEsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywyLDMsMywzLDIsMiwyLDIsMywxLDMsMiwzLDEsMSwyLDEsMCwyLDIsMiwyLDEsMywxLDAsCjAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDMsMywzLDMsMywxLDIsMiwxLDMsMSwwLDMsMCwwLDMsMCwwLDAsMSwxLDAsMSwyLDEsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMiwyLDEsMSwzLDMsMywyLDIsMSwyLDIsMywxLDEsMiwwLDAsMiwyLDEsMywwLDAsMiwxLDEsMiwxLDEsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDIsMywzLDMsMywxLDIsMiwyLDEsMiwxLDMsMywxLDEsMiwxLDIsMSwyLDIsMCwyLDAsMCwxLDEsMCwxLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwzLDMsMywzLDMsMiwxLDMsMiwyLDMsMiwwLDMsMiwwLDMsMCwxLDAsMSwxLDAsMCwxLDEsMSwxLDAsMSwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywyLDMsMywzLDIsMiwyLDMsMywxLDIsMSwyLDEsMCwxLDAsMSwxLDAsMSwwLDAsMiwxLDEsMSwwLDEsMCwKMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAozLDEsMSwyLDEsMiwzLDMsMiwyLDEsMiwyLDMsMCwyLDEsMCwwLDIsMiwzLDIsMSwyLDIsMiwyLDIsMywxLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDEsMSwwLDEsMSwyLDIsMSwxLDMsMCwwLDEsMywxLDEsMSwwLDAsMCwxLDAsMSwxLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMSwzLDMsMywyLDAsMCwwLDIsMSwwLDEsMCwyLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDAsMSwwLDAsMiwzLDIsMiwyLDEsMiwyLDIsMSwyLDEsMCwwLDEsMSwxLDAsMiwwLDEsMSwxLDAsMCwxLDEsCjEsMCwwLDAsMCwwLDEsMiwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwzLDMsMywzLDAsMCwwLDAsMSwwLDAsMCwwLDMsMCwxLDIsMSwwLDAsMCwwLDAsMCwwLDEsMSwwLDAsMSwxLAoxLDAsMSwwLDEsMiwwLDAsMSwxLDIsMSwwLDEsMSwxLDEsMCwxLDEsMSwxLDAsMSwwLDAsMSwwLDAsMSwxLDAsCjIsMiwzLDIsMiwyLDMsMSwyLDIsMiwyLDIsMiwyLDIsMSwxLDEsMSwxLDEsMSwwLDEsMCwxLDEsMSwwLDIsMSwKMSwxLDEsMSwxLDEsMSwxLDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDEsMCwxLDEsMCwxLDEsMSwwLDEsMSwwLAozLDMsMywyLDIsMiwyLDMsMiwyLDEsMSwyLDIsMiwyLDEsMSwzLDEsMiwxLDIsMCwwLDEsMSwwLDEsMCwyLDEsCjEsMSwxLDEsMSwyLDEsMCwxLDEsMSwxLDAsMSwwLDAsMSwxLDAsMCwxLDAsMSwwLDAsMSwwLDAsMCwxLDEsMCwKMiwwLDAsMSwwLDMsMiwyLDIsMiwxLDIsMSwyLDEsMiwwLDAsMCwyLDEsMiwyLDEsMSwyLDIsMCwxLDEsMCwyLAoxLDEsMSwxLDEsMCwxLDEsMSwyLDEsMSwxLDIsMSwwLDEsMiwxLDEsMSwxLDAsMSwxLDEsMCwwLDEsMCwwLDEsCjEsMywyLDIsMiwxLDEsMSwyLDMsMCwwLDAsMCwyLDAsMiwyLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDEsMSwKMSwwLDEsMSwwLDEsMCwxLDEsMCwxLDEsMCwyLDAsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLAoyLDMsMiwzLDIsMSwyLDIsMiwyLDEsMCwwLDAsMiwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwyLDEsCjEsMSwyLDEsMCwyLDAsMCwxLDAsMSwwLDAsMSwwLDAsMSwxLDAsMSwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwKMywwLDAsMSwwLDIsMiwyLDMsMiwyLDIsMiwyLDIsMiwwLDAsMCwyLDEsMiwxLDEsMSwyLDIsMCwwLDAsMSwyLAoxLDEsMSwxLDEsMCwxLDIsMSwxLDEsMSwxLDEsMSwwLDEsMSwxLDEsMSwxLDAsMSwxLDEsMSwxLDEsMCwwLDEsCjIsMywyLDMsMywyLDAsMSwxLDEsMCwwLDEsMCwyLDAsMSwxLDMsMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDIsMSwKMSwxLDEsMSwxLDEsMSwwLDEsMCwxLDEsMSwxLDAsMSwxLDEsMCwwLDEsMSwwLDEsMCwwLDAsMCwwLDAsMSwwLAoyLDMsMywzLDMsMSwyLDIsMiwyLDAsMSwxLDAsMiwxLDEsMSwyLDEsMCwxLDEsMCwwLDEsMCwxLDAsMCwyLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwzLDMsMywyLDAsMCwxLDEsMiwyLDEsMCwwLDIsMCwxLDEsMywwLDAsMSwwLDAsMCwwLDAsMSwwLDEsMiwxLAoxLDEsMiwwLDEsMSwxLDAsMSwwLDEsMSwwLDEsMCwxLDEsMSwxLDAsMSwwLDAsMCwwLDAsMCwxLDAsMSwxLDAsCjEsMywyLDMsMiwxLDAsMCwyLDIsMiwwLDEsMCwyLDAsMSwxLDEsMCwxLDAsMCwwLDMsMCwxLDEsMCwwLDIsMSwKMSwxLDEsMCwxLDEsMCwwLDAsMCwxLDEsMCwxLDAsMCwyLDEsMSwwLDEsMCwwLDAsMSwwLDEsMCwwLDEsMSwwLAozLDEsMiwxLDEsMiwyLDIsMiwyLDIsMSwyLDIsMSwxLDAsMCwwLDIsMiwyLDAsMCwwLDEsMiwxLDAsMSwwLDEsCjIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMiwxLDEsMSwwLDEsMCwxLDEsMCwxLDEsMSwwLDAsMSwKMywwLDAsMCwwLDIsMCwxLDEsMSwxLDEsMSwxLDAsMSwwLDAsMCwxLDEsMSwwLDEsMCwxLDEsMCwwLDEsMCwxLAoxLDEsMCwwLDEsMCwwLDAsMSwwLDEsMSwwLDAsMSwwLDEsMCwxLDAsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDEsCjEsMywzLDIsMiwwLDAsMCwyLDIsMCwwLDAsMSwyLDAsMSwxLDIsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDIsMSwKMCwxLDEsMCwwLDEsMSwwLDAsMCwxLDEsMCwxLDEsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAoyLDMsMiwzLDIsMCwwLDAsMCwxLDEsMCwwLDAsMiwwLDIsMCwyLDAsMCwwLDAsMCwxLDAsMCwxLDAsMCwxLDEsCjEsMSwyLDAsMSwyLDEsMCwxLDEsMiwxLDEsMSwxLDEsMiwxLDEsMCwxLDAsMCwxLDEsMSwxLDEsMCwxLDEsMCwKMSwzLDIsMiwyLDEsMCwwLDIsMiwxLDAsMSwyLDIsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMSwxLAowLDAsMSwxLDAsMSwxLDAsMCwxLDEsMCwxLDEsMCwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDEsMCwyLDMsMSwyLDIsMiwyLDIsMiwxLDEsMCwwLDAsMSwwLDEsMCwyLDEsMSwxLDAsMCwwLDAsMSwKMSwxLDAsMSwxLDAsMSwxLDEsMSwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAoyLDAsMiwwLDAsMSwwLDMsMiwxLDIsMSwyLDIsMCwxLDAsMCwwLDIsMSwwLDAsMiwxLDEsMSwxLDAsMiwwLDIsCjIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMiwxLDAsMSwxLDEsMSwwLDAsMCwxLDEsMSwxLDAsMSwwLDAsMSwKMSwyLDIsMiwyLDEsMCwwLDEsMCwwLDAsMCwwLDIsMCwxLDEsMSwxLDAsMCwwLDAsMSwwLDEsMiwwLDAsMiwwLAoxLDAsMSwxLDEsMiwxLDAsMSwwLDEsMSwwLDAsMSwwLDEsMSwxLDAsMSwwLDAsMCwxLDAsMCwxLDAsMSwxLDAsCjIsMSwyLDIsMiwwLDMsMCwxLDEsMCwwLDAsMCwyLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMCwwLDAsMSwxLDEsMCwwLDEsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLAoxLDIsMiwzLDIsMiwwLDAsMSwxLDIsMCwxLDIsMSwwLDEsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjAsMSwxLDAsMCwxLDEsMCwwLDEsMSwwLDAsMSwxLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwKMiwyLDEsMSwyLDEsMiwyLDIsMiwyLDEsMiwyLDAsMSwwLDAsMCwxLDIsMiwyLDEsMiwxLDEsMSwxLDEsMiwxLAoxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwxLDEsMSwwLDEsMSwxLDAsMCwwLDAsMSwxLDEsMCwxLDEsMCwwLDEsCjEsMiwyLDIsMiwwLDEsMCwyLDIsMCwwLDAsMCwyLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwKMCwwLDEsMCwwLDEsMCwwLDAsMCwxLDAsMSwxLDAsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwyLDIsMiwyLDAsMCwwLDIsMiwyLDAsMSwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwxLAowLDEsMSwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMiwyLDIsMiwwLDAsMCwwLDEsMCwwLDEsMSwyLDAsMCwwLDAsMSwwLDEsMCwwLDEsMCwwLDIsMCwwLDAsMSwKMCwwLDEsMCwwLDEsMCwwLDAsMSwxLDAsMCwwLDAsMCwxLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDIsMiwyLDEsMSwyLDAsMiwxLDEsMSwxLDAsMiwyLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDAsMCwxLDEsCjAsMCwxLDAsMSwxLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDIsMSwyLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLAowLDAsMSwwLDEsMSwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjEsMCwwLDAsMCwyLDAsMSwyLDEsMCwxLDEsMSwwLDEsMCwwLDAsMSwwLDEsMCwwLDEsMCwxLDAsMCwwLDAsMSwKMCwwLDAsMCwwLDEsMCwwLDEsMSwwLDAsMSwxLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAoyLDIsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjEsMCwwLDAsMSwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAoxLDEsMSwwLDEsMCwxLDAsMCwxLDEsMSwxLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLDAsCjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMSwxLDAsMSwxLDAsMSwwLDEsMCwwLDAsMCwxLDEsMCwxLDEsMCwwLDAsMCwwLDEsMCwxLDEsMCwxLDAsMCwwLAowLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwKKQoKS29pOHJNb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiBLT0k4Ul9jaGFyX3RvX29yZGVyX21hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBSdXNzaWFuTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45NzY2MDEsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBGYWxzZSwKICAnY2hhcnNldF9uYW1lJzogIktPSTgtUiIsCiAgJ2xhbmd1YWdlJzogJ1J1c3NpYW4nLAp9CgpXaW4xMjUxQ3lyaWxsaWNNb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiB3aW4xMjUxX2NoYXJfdG9fb3JkZXJfbWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IFJ1c3NpYW5MYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk3NjYwMSwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAid2luZG93cy0xMjUxIiwKICAnbGFuZ3VhZ2UnOiAnUnVzc2lhbicsCn0KCkxhdGluNUN5cmlsbGljTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogbGF0aW41X2NoYXJfdG9fb3JkZXJfbWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IFJ1c3NpYW5MYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk3NjYwMSwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAiSVNPLTg4NTktNSIsCiAgJ2xhbmd1YWdlJzogJ1J1c3NpYW4nLAp9CgpNYWNDeXJpbGxpY01vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IG1hY0N5cmlsbGljX2NoYXJfdG9fb3JkZXJfbWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IFJ1c3NpYW5MYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk3NjYwMSwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAiTWFjQ3lyaWxsaWMiLAogICdsYW5ndWFnZSc6ICdSdXNzaWFuJywKfQoKSWJtODY2TW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogSUJNODY2X2NoYXJfdG9fb3JkZXJfbWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IFJ1c3NpYW5MYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk3NjYwMSwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAiSUJNODY2IiwKICAnbGFuZ3VhZ2UnOiAnUnVzc2lhbicsCn0KCklibTg1NU1vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IElCTTg1NV9jaGFyX3RvX29yZGVyX21hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBSdXNzaWFuTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45NzY2MDEsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBGYWxzZSwKICAnY2hhcnNldF9uYW1lJzogIklCTTg1NSIsCiAgJ2xhbmd1YWdlJzogJ1J1c3NpYW4nLAp9ClBLAwQUAAAAAAAAACEA/ruvKZAxAACQMQAANQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdncmVla21vZGVsLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIDI1NTogQ29udHJvbCBjaGFyYWN0ZXJzIHRoYXQgdXN1YWxseSBkb2VzIG5vdCBleGlzdCBpbiBhbnkgdGV4dAojIDI1NDogQ2FycmlhZ2UvUmV0dXJuCiMgMjUzOiBzeW1ib2wgKHB1bmN0dWF0aW9uKSB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byB3b3JkCiMgMjUyOiAwIC0gOQoKIyBDaGFyYWN0ZXIgTWFwcGluZyBUYWJsZToKTGF0aW43X2NoYXJfdG9fb3JkZXJfbWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywgODIsMTAwLDEwNCwgOTQsIDk4LDEwMSwxMTYsMTAyLDExMSwxODcsMTE3LCA5MiwgODgsMTEzLCA4NSwgICMgNDAKIDc5LDExOCwxMDUsIDgzLCA2NywxMTQsMTE5LCA5NSwgOTksMTA5LDE4OCwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA1MAoyNTMsIDcyLCA3MCwgODAsIDgxLCA2MCwgOTYsIDkzLCA4OSwgNjgsMTIwLCA5NywgNzcsIDg2LCA2OSwgNTUsICAjIDYwCiA3OCwxMTUsIDY1LCA2NiwgNTgsIDc2LDEwNiwxMDMsIDg3LDEwNywxMTIsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNzAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyA4MAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDkwCjI1MywyMzMsIDkwLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgNzQsMjUzLDI1MywgICMgYTAKMjUzLDI1MywyNTMsMjUzLDI0NywyNDgsIDYxLCAzNiwgNDYsIDcxLCA3MywyNTMsIDU0LDI1MywxMDgsMTIzLCAgIyBiMAoxMTAsIDMxLCA1MSwgNDMsIDQxLCAzNCwgOTEsIDQwLCA1MiwgNDcsIDQ0LCA1MywgMzgsIDQ5LCA1OSwgMzksICAjIGMwCiAzNSwgNDgsMjUwLCAzNywgMzMsIDQ1LCA1NiwgNTAsIDg0LCA1NywxMjAsMTIxLCAxNywgMTgsIDIyLCAxNSwgICMgZDAKMTI0LCAgMSwgMjksIDIwLCAyMSwgIDMsIDMyLCAxMywgMjUsICA1LCAxMSwgMTYsIDEwLCAgNiwgMzAsICA0LCAgIyBlMAogIDksICA4LCAxNCwgIDcsICAyLCAxMiwgMjgsIDIzLCA0MiwgMjQsIDY0LCA3NSwgMTksIDI2LCAyNywyNTMsICAjIGYwCikKCndpbjEyNTNfY2hhcl90b19vcmRlcl9tYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLCA4MiwxMDAsMTA0LCA5NCwgOTgsMTAxLDExNiwxMDIsMTExLDE4NywxMTcsIDkyLCA4OCwxMTMsIDg1LCAgIyA0MAogNzksMTE4LDEwNSwgODMsIDY3LDExNCwxMTksIDk1LCA5OSwxMDksMTg4LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNzIsIDcwLCA4MCwgODEsIDYwLCA5NiwgOTMsIDg5LCA2OCwxMjAsIDk3LCA3NywgODYsIDY5LCA1NSwgICMgNjAKIDc4LDExNSwgNjUsIDY2LCA1OCwgNzYsMTA2LDEwMywgODcsMTA3LDExMiwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDgwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgOTAKMjUzLDIzMywgNjEsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCA3NCwyNTMsMjUzLCAgIyBhMAoyNTMsMjUzLDI1MywyNTMsMjQ3LDI1MywyNTMsIDM2LCA0NiwgNzEsIDczLDI1MywgNTQsMjUzLDEwOCwxMjMsICAjIGIwCjExMCwgMzEsIDUxLCA0MywgNDEsIDM0LCA5MSwgNDAsIDUyLCA0NywgNDQsIDUzLCAzOCwgNDksIDU5LCAzOSwgICMgYzAKIDM1LCA0OCwyNTAsIDM3LCAzMywgNDUsIDU2LCA1MCwgODQsIDU3LDEyMCwxMjEsIDE3LCAxOCwgMjIsIDE1LCAgIyBkMAoxMjQsICAxLCAyOSwgMjAsIDIxLCAgMywgMzIsIDEzLCAyNSwgIDUsIDExLCAxNiwgMTAsICA2LCAzMCwgIDQsICAjIGUwCiAgOSwgIDgsIDE0LCAgNywgIDIsIDEyLCAyOCwgMjMsIDQyLCAyNCwgNjQsIDc1LCAxOSwgMjYsIDI3LDI1MywgICMgZjAKKQoKIyBNb2RlbCBUYWJsZToKIyB0b3RhbCBzZXF1ZW5jZXM6IDEwMCUKIyBmaXJzdCA1MTIgc2VxdWVuY2VzOiA5OC4yODUxJQojIGZpcnN0IDEwMjQgc2VxdWVuY2VzOjEuNzAwMSUKIyByZXN0ICBzZXF1ZW5jZXM6ICAgICAwLjAzNTklCiMgbmVnYXRpdmUgc2VxdWVuY2VzOiAgMC4wMTQ4JQpHcmVla0xhbmdNb2RlbCA9ICgKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwzLDIsMiwzLDMsMywzLDMsMywzLDMsMSwzLDMsMywwLDIsMiwzLDMsMCwzLDAsMywyLDAsMywzLDMsMCwKMywwLDAsMCwyLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMywwLDMsMywwLDMsMiwzLDMsMCwzLDIsMywzLDMsMCwwLDMsMCwzLDAsMywzLDIsMCwwLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwKMCwyLDMsMiwyLDMsMywzLDMsMywzLDMsMywwLDMsMywzLDMsMCwyLDMsMywwLDMsMywzLDMsMiwzLDMsMywwLAoyLDAsMCwwLDIsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMiwzLDMsMiwzLDMsMywzLDMsMywzLDMsMywzLDMsMywwLDIsMSwzLDMsMywzLDIsMywzLDIsMywzLDIsMCwKMCwwLDAsMCwyLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMCwzLDMsMywzLDMsMywwLDMsMywwLDMsMywzLDMsMywzLDMsMywzLDMsMCwzLDIsMywzLDAsCjIsMCwxLDAsMiwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDMsMiwzLDAsMCwwLDAsMywzLDAsMywxLDMsMywzLDAsMywzLDAsMywzLDMsMywwLDAsMCwwLAoyLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywzLDAsMywwLDMsMywzLDMsMywwLDMsMiwyLDIsMywwLDIsMywzLDMsMywzLDIsMywzLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMywzLDIsMiwyLDMsMywzLDMsMCwzLDEsMywzLDMsMywyLDMsMywzLDMsMywzLDMsMiwyLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDMsMiwwLDMsMCwwLDAsMywzLDIsMywzLDMsMywzLDAsMCwzLDIsMywwLDIsMywwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywwLDMsMywzLDMsMCwwLDMsMywwLDIsMywwLDMsMCwzLDMsMywwLDAsMywwLDMsMCwyLDIsMywzLDAsMCwKMCwwLDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMywyLDAsMywyLDMsMywzLDMsMCwzLDMsMywzLDMsMCwzLDMsMiwzLDIsMywzLDIsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMiwzLDIsMywzLDMsMywzLDMsMCwyLDMsMiwzLDIsMiwyLDMsMiwzLDMsMiwzLDAsMiwyLDIsMywwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwzLDAsMCwwLDMsMywzLDIsMywzLDAsMCwzLDAsMywwLDAsMCwzLDIsMCwzLDAsMywwLDAsMiwwLDIsMCwKMCwwLDAsMCwyLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDAsMywzLDMsMywzLDMsMCwzLDMsMCwzLDAsMCwwLDMsMywwLDMsMywzLDAsMCwxLDIsMywwLAozLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywzLDIsMCwwLDMsMiwyLDMsMywwLDMsMywzLDMsMywyLDEsMywwLDMsMiwzLDMsMiwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMywzLDAsMiwzLDMsMywzLDMsMywwLDAsMywwLDMsMCwwLDAsMywzLDAsMywyLDMsMCwwLDMsMywzLDAsCjMsMCwwLDAsMiwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDAsMywzLDMsMywzLDMsMCwwLDMsMCwzLDAsMCwwLDMsMiwwLDMsMiwzLDAsMCwzLDIsMywwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwzLDEsMiwyLDMsMywzLDMsMywzLDAsMiwzLDAsMywwLDAsMCwzLDMsMCwzLDAsMiwwLDAsMiwzLDEsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMCwzLDMsMywzLDAsMywwLDMsMywyLDMsMCwzLDMsMywzLDMsMywwLDMsMywzLDAsMiwzLDAsMCwzLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDAsMywzLDMsMCwwLDMsMCwwLDAsMywzLDAsMywwLDIsMywzLDAsMCwzLDAsMywwLDMsMywwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwzLDAsMCwwLDMsMywzLDMsMywzLDAsMCwzLDAsMiwwLDAsMCwzLDMsMCwzLDAsMywwLDAsMiwwLDIsMCwKMCwwLDAsMCwxLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMywzLDAsMywwLDIsMCwzLDIsMCwzLDIsMywyLDMsMCwwLDMsMiwzLDIsMywzLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDMsMCwwLDIsMywzLDMsMywzLDAsMCwwLDMsMCwyLDEsMCwwLDMsMiwyLDIsMCwzLDAsMCwyLDIsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywwLDMsMywzLDIsMCwzLDAsMywwLDMsMywwLDIsMSwyLDMsMywwLDAsMywwLDMsMCwzLDMsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDIsMywzLDMsMCwzLDMsMywzLDMsMywwLDIsMywwLDMsMCwwLDAsMiwxLDAsMiwyLDMsMCwwLDIsMiwyLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDMsMCwwLDIsMywzLDMsMiwzLDAsMCwxLDMsMCwyLDAsMCwwLDAsMywwLDEsMCwyLDAsMCwxLDEsMSwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywzLDEsMCwzLDAsMCwwLDMsMiwwLDMsMiwzLDMsMywwLDAsMywwLDMsMiwyLDIsMSwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMCwzLDMsMywwLDAsMywwLDAsMCwwLDIsMCwyLDMsMywyLDIsMiwyLDMsMCwyLDAsMiwyLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDIsMCwwLDAsMCwwLDAsMiwzLDAsMiwwLDIsMywyLDAsMCwzLDAsMywwLDMsMSwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDMsMiwzLDMsMiwyLDMsMCwyLDAsMywwLDAsMCwyLDAsMCwwLDAsMSwyLDAsMiwwLDIsMCwKMCwyLDAsMiwwLDIsMiwwLDAsMSwwLDIsMiwyLDAsMiwyLDIsMCwyLDIsMiwwLDAsMiwwLDAsMSwwLDAsMCwwLAowLDIsMCwzLDMsMiwwLDAsMCwwLDAsMCwxLDMsMCwyLDAsMiwyLDIsMCwwLDIsMCwzLDAsMCwyLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDAsMiwzLDIsMCwyLDIsMCwyLDAsMiwyLDAsMiwwLDIsMiwyLDAsMCwwLDAsMCwwLDIsMywwLDAsMCwyLAowLDEsMiwwLDAsMCwwLDIsMiwwLDAsMCwyLDEsMCwyLDIsMCwwLDAsMCwwLDAsMSwwLDIsMCwwLDAsMCwwLDAsCjAsMCwyLDEsMCwyLDMsMiwyLDMsMiwzLDIsMCwwLDMsMywzLDAsMCwzLDIsMCwwLDAsMSwxLDAsMiwwLDIsMiwKMCwyLDAsMiwwLDIsMiwwLDAsMiwwLDIsMiwyLDAsMiwyLDIsMiwwLDAsMiwwLDAsMCwyLDAsMSwwLDAsMCwwLAowLDMsMCwzLDMsMiwyLDAsMywwLDAsMCwyLDIsMCwyLDIsMiwxLDIsMCwwLDEsMiwyLDAsMCwzLDAsMCwwLDIsCjAsMSwyLDAsMCwwLDEsMiwwLDAsMCwwLDAsMCwwLDIsMiwwLDEsMCwwLDIsMCwwLDAsMiwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMiwzLDMsMiwyLDAsMCwwLDIsMCwyLDMsMywwLDIsMCwwLDAsMCwwLDAsMiwyLDIsMCwyLDIsMCwyLDAsMiwKMCwyLDIsMCwwLDIsMiwyLDIsMSwwLDAsMiwyLDAsMiwwLDAsMiwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLAowLDIsMCwzLDIsMywwLDAsMCwzLDAsMCwyLDIsMCwyLDAsMiwyLDIsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDIsCjAsMCwyLDIsMCwwLDIsMiwyLDAsMCwwLDAsMCwwLDIsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDIsMCwwLDMsMiwwLDIsMiwyLDIsMiwwLDAsMCwyLDAsMCwwLDAsMiwwLDEsMCwwLDIsMCwxLDAsMCwwLAowLDIsMiwyLDAsMiwyLDAsMSwyLDAsMiwyLDIsMCwyLDIsMiwyLDEsMiwyLDAsMCwyLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwKMCwyLDAsMiwwLDIsMiwwLDAsMCwwLDEsMiwxLDAsMCwyLDIsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwzLDIsMywwLDAsMiwwLDAsMCwyLDIsMCwyLDAsMCwwLDEsMCwwLDIsMCwyLDAsMiwyLDAsMCwwLDAsCjAsMCwyLDAsMCwwLDAsMiwyLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwKMCwyLDIsMywyLDIsMCwwLDAsMCwwLDAsMSwzLDAsMiwwLDIsMiwwLDAsMCwxLDAsMiwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMiwwLDIsMCwzLDIsMCwyLDAsMCwwLDAsMCwwLDIsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMCwwLDIsMCwwLDAsMCwxLDEsMCwwLDIsMSwyLDAsMiwyLDAsMSwwLDAsMSwwLDAsMCwyLDAsMCwwLDAsMCwwLAowLDMsMCwyLDIsMiwwLDAsMiwwLDAsMCwyLDAsMCwwLDIsMywwLDIsMCwwLDAsMCwwLDAsMiwyLDAsMCwwLDIsCjAsMSwyLDAsMCwwLDEsMiwyLDEsMCwwLDAsMiwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDIsMSwyLDAsMiwyLDAsMiwwLDAsMiwwLDAsMCwwLDEsMiwxLDAsMiwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwyLDAsMCwwLDMsMSwyLDIsMCwyLDAsMCwwLDAsMiwwLDAsMCwyLDAsMCwzLDAsMCwwLDAsMiwyLDIsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDIsMSwwLDIsMCwxLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwxLDAsMCwwLDAsMCwwLDIsCjAsMiwyLDAsMCwyLDIsMiwyLDIsMCwxLDIsMCwwLDAsMiwyLDAsMSwwLDIsMCwwLDIsMiwwLDAsMCwwLDAsMCwKMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMywwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMiwwLDIsMCwwLDAsMCwyLAowLDEsMiwwLDAsMCwwLDIsMiwxLDAsMSwwLDEsMCwyLDIsMiwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsCjAsMiwwLDEsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDIsMiwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMiwKMCwyLDIsMCwwLDAsMCwyLDIsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwyLDAsMCwwLAowLDIsMiwyLDIsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDEsCjAsMCwyLDAsMCwwLDAsMSwyLDAsMCwwLDAsMCwwLDIsMiwxLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwKMCwyLDAsMiwyLDIsMCwwLDIsMCwwLDAsMCwwLDAsMCwyLDIsMiwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwyLAowLDAsMSwwLDAsMCwwLDIsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywwLDIsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMiwKMCwwLDIsMCwwLDAsMCwyLDIsMCwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDIsMCwyLDIsMSwwLDAsMCwwLDAsMCwyLDAsMCwyLDAsMiwyLDIsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDIsCjAsMCwyLDAsMCwyLDAsMiwyLDAsMCwwLDAsMiwwLDIsMCwwLDAsMCwwLDIsMCwwLDAsMiwwLDAsMCwwLDAsMCwKMCwwLDMsMCwwLDAsMiwyLDAsMiwyLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDIsMCwwLDAsMCwwLAowLDIsMiwyLDIsMiwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDEsCjAsMCwwLDAsMCwwLDAsMiwxLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwyLDIsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLAowLDIsMCwwLDAsMiwwLDAsMCwwLDAsMSwwLDAsMCwwLDIsMiwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDEsMCwyLDAsMCwwLAowLDIsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwxLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMiwwLDIsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwyLDEsMCwwLDAsMCwwLDAsMiwwLDAsMCwxLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCikKCkxhdGluN0dyZWVrTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogTGF0aW43X2NoYXJfdG9fb3JkZXJfbWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IEdyZWVrTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45ODI4NTEsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBGYWxzZSwKICAnY2hhcnNldF9uYW1lJzogIklTTy04ODU5LTciLAogICdsYW5ndWFnZSc6ICdHcmVlaycsCn0KCldpbjEyNTNHcmVla01vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IHdpbjEyNTNfY2hhcl90b19vcmRlcl9tYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogR3JlZWtMYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk4Mjg1MSwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAid2luZG93cy0xMjUzIiwKICAnbGFuZ3VhZ2UnOiAnR3JlZWsnLAp9ClBLAwQUAAAAAAAAACEAj2atGFEsAABRLAAANgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdoZWJyZXdtb2RlbC5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgVW5pdmVyc2FsIGNoYXJzZXQgZGV0ZWN0b3IgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojICAgICAgICAgIFNpbW9uIE1vbnRhZ3UKIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDA1CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojICAgU2h5IFNoYWxvbSAtIG9yaWdpbmFsIEMgY29kZQojICAgU2hvc2hhbm5haCBGb3JiZXMgLSBvcmlnaW5hbCBDIGNvZGUgKD8pCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgMjU1OiBDb250cm9sIGNoYXJhY3RlcnMgdGhhdCB1c3VhbGx5IGRvZXMgbm90IGV4aXN0IGluIGFueSB0ZXh0CiMgMjU0OiBDYXJyaWFnZS9SZXR1cm4KIyAyNTM6IHN5bWJvbCAocHVuY3R1YXRpb24pIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIHdvcmQKIyAyNTI6IDAgLSA5CgojIFdpbmRvd3MtMTI1NSBsYW5ndWFnZSBtb2RlbAojIENoYXJhY3RlciBNYXBwaW5nIFRhYmxlOgpXSU4xMjU1X0NIQVJfVE9fT1JERVJfTUFQID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywgNjksIDkxLCA3OSwgODAsIDkyLCA4OSwgOTcsIDkwLCA2OCwxMTEsMTEyLCA4MiwgNzMsIDk1LCA4NSwgICMgNDAKIDc4LDEyMSwgODYsIDcxLCA2NywxMDIsMTA3LCA4NCwxMTQsMTAzLDExNSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA1MAoyNTMsIDUwLCA3NCwgNjAsIDYxLCA0MiwgNzYsIDcwLCA2NCwgNTMsMTA1LCA5MywgNTYsIDY1LCA1NCwgNDksICAjIDYwCiA2NiwxMTAsIDUxLCA0MywgNDQsIDYzLCA4MSwgNzcsIDk4LCA3NSwxMDgsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNzAKMTI0LDIwMiwyMDMsMjA0LDIwNSwgNDAsIDU4LDIwNiwyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LAoyMTUsIDgzLCA1MiwgNDcsIDQ2LCA3MiwgMzIsIDk0LDIxNiwxMTMsMjE3LDEwOSwyMTgsMjE5LDIyMCwyMjEsCiAzNCwxMTYsMjIyLDExOCwxMDAsMjIzLDIyNCwxMTcsMTE5LDEwNCwxMjUsMjI1LDIyNiwgODcsIDk5LDIyNywKMTA2LDEyMiwxMjMsMjI4LCA1NSwyMjksMjMwLDEwMSwyMzEsMjMyLDEyMCwyMzMsIDQ4LCAzOSwgNTcsMjM0LAogMzAsIDU5LCA0MSwgODgsIDMzLCAzNywgMzYsIDMxLCAyOSwgMzUsMjM1LCA2MiwgMjgsMjM2LDEyNiwyMzcsCjIzOCwgMzgsIDQ1LDIzOSwyNDAsMjQxLDI0MiwyNDMsMTI3LDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwKICA5LCAgOCwgMjAsIDE2LCAgMywgIDIsIDI0LCAxNCwgMjIsICAxLCAyNSwgMTUsICA0LCAxMSwgIDYsIDIzLAogMTIsIDE5LCAxMywgMjYsIDE4LCAyNywgMjEsIDE3LCAgNywgMTAsICA1LDI1MSwyNTIsMTI4LCA5NiwyNTMsCikKCiMgTW9kZWwgVGFibGU6CiMgdG90YWwgc2VxdWVuY2VzOiAxMDAlCiMgZmlyc3QgNTEyIHNlcXVlbmNlczogOTguNDAwNCUKIyBmaXJzdCAxMDI0IHNlcXVlbmNlczogMS41OTgxJQojIHJlc3QgIHNlcXVlbmNlczogICAgICAwLjA4NyUKIyBuZWdhdGl2ZSBzZXF1ZW5jZXM6ICAgMC4wMDE1JQpIRUJSRVdfTEFOR19NT0RFTCA9ICgKMCwzLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywyLDEsMiwwLDEsMCwwLAozLDAsMywxLDAsMCwxLDMsMiwwLDEsMSwyLDAsMiwyLDIsMSwxLDEsMSwyLDEsMSwxLDIsMCwwLDIsMiwwLDEsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwKMSwyLDEsMiwxLDIsMCwwLDIsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwyLDIsCjEsMiwxLDMsMSwxLDAsMCwyLDAsMCwwLDEsMCwxLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywxLDAsMSwyLDIsMSwzLAoxLDIsMSwxLDIsMiwwLDAsMiwyLDAsMCwwLDAsMSwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsMSwxLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMywyLDIsMiwyLDMsMiwKMSwyLDEsMiwyLDIsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDIsMywyLDIsMywyLDIsMiwxLDIsMiwyLDIsCjEsMiwxLDEsMiwyLDAsMSwyLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDAsMiwyLDIsMiwyLAowLDIsMCwyLDIsMiwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMCwyLDIsMiwKMCwyLDEsMiwyLDIsMCwwLDIsMSwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMSwyLDMsMiwyLDIsCjEsMiwxLDIsMiwyLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMywyLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMSwwLDIsMCwyLAowLDIsMSwyLDIsMiwwLDAsMSwyLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDIsMywyLDIsMywyLDEsMiwxLDEsMSwKMCwxLDEsMSwxLDEsMywwLDEsMCwwLDAsMCwyLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwxLDAsMSwxLDAsMCwxLDAsMCwxLDAsMCwwLDAsCjAsMCwxLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDIsMiwyLDIsMiwyLAowLDIsMCwxLDIsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDIsMywzLDMsMiwxLDIsMywzLDIsMywzLDMsMywyLDMsMiwxLDIsMCwyLDEsMiwKMCwyLDAsMiwyLDIsMCwwLDEsMiwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDEsMiwyLDMsMywyLDMsMiwzLDIsMiwzLDEsMiwyLDAsMiwyLDIsCjAsMiwxLDIsMiwyLDAsMCwxLDIsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwxLDAsMCwwLDEsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDIsMywzLDIsMiwyLDMsMywzLDMsMSwzLDIsMiwyLAowLDIsMCwxLDIsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDIsMywzLDMsMiwzLDIsMiwyLDEsMiwyLDAsMiwyLDIsMiwKMCwyLDAsMiwyLDIsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMywxLDMsMiwzLDMsMiwzLDMsMiwyLDEsMiwyLDIsMiwyLDIsCjAsMiwxLDIsMSwyLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMiwzLDIsMywzLDIsMywzLDMsMywyLDMsMiwzLDMsMywzLDMsMiwyLDIsMiwyLDIsMiwxLAowLDIsMCwxLDIsMSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDIsMSwyLDMsMywzLDMsMywzLDMsMiwzLDIsMywyLDEsMiwzLDAsMiwxLDIsMiwKMCwyLDEsMSwyLDEsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMiwwLAozLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDMsMiwxLDMsMSwyLDIsMiwxLDIsMywzLDEsMiwxLDIsMiwyLDIsCjAsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywwLDIsMywzLDMsMSwzLDMsMywxLDIsMiwyLDIsMSwxLDIsMiwyLDIsMiwyLAowLDIsMCwxLDEsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDIsMywzLDMsMiwyLDMsMywzLDIsMSwyLDMsMiwzLDIsMiwyLDIsMSwyLDEsMSwxLDIsMiwKMCwyLDEsMSwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsCjEsMCwxLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDIsMywzLDIsMywxLDIsMiwyLDIsMywyLDMsMSwxLDIsMiwxLDIsMiwxLDEsMCwyLDIsMiwyLAowLDEsMCwxLDIsMiwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsCjMsMCwwLDEsMSwwLDEsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwyLDIsMCwKMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDAsMSwwLDEsMCwxLDEsMCwxLDEsMCwwLDAsMSwxLDAsMSwxLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDAsMCwxLDEsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsCjMsMiwyLDEsMiwyLDIsMiwyLDIsMiwxLDIsMiwxLDIsMiwxLDEsMSwxLDEsMSwxLDEsMiwxLDEsMCwzLDMsMywKMCwzLDAsMiwyLDIsMiwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAoyLDIsMiwzLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDEsMiwyLDEsMiwyLDIsMSwxLDEsMiwwLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDEsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDAsMiwyLDAsMCwwLDAsMCwwLAowLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMywxLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMSwyLDEsMCwyLDEsMCwKMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDEsMSwxLDEsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDEsMSwyLDIsMiwyLDIsMSwyLDIsMiwxLDEsMiwyLDIsMiwyLDIsMiwxLDIsMiwxLDAsMSwxLDEsMSwwLAowLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMiwxLDEsMSwxLDIsMSwxLDIsMSwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDEsMCwwLDAsMCwwLDAsMCwKMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDAsMCwwLDEsMSwwLDAsMSwxLDAsMCwwLDAsMCwwLDEsMCwwLAoyLDEsMSwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMSwyLDIsMiwyLDIsMSwyLDEsMiwxLDEsMSwxLDAsMCwwLDAsCjAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwyLDEsMiwyLDIsMiwyLDIsMiwyLDIsMiwxLDIsMSwyLDEsMSwyLDEsMSwxLDIsMSwyLDEsMiwwLDEsMCwxLAowLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywxLDIsMiwyLDEsMiwyLDIsMiwyLDIsMiwyLDEsMiwxLDEsMSwxLDEsMSwyLDEsMiwxLDEsMCwxLDAsMSwKMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDEsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwyLDIsCjAsMiwwLDEsMiwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMSwxLDEsMSwxLDEsMSwwLDEsMSwwLDEsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDIsMCwxLDEsMSwwLDEsMCwwLDAsMSwxLDAsMSwxLDAsMCwwLDAsMCwxLDEsMCwwLAowLDEsMSwxLDIsMSwyLDIsMiwwLDIsMCwyLDAsMSwxLDIsMSwxLDEsMSwyLDEsMCwxLDEsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMSwwLDAsMCwwLDAsMSwwLDEsMiwyLDAsMSwwLDAsMSwxLDIsMiwxLDIsMCwyLDAsMCwwLDEsMiwwLDEsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDIsMCwyLDEsMiwwLDIsMCwwLDEsMSwxLDEsMSwxLDAsMSwwLDAsMCwxLDAsMCwxLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwxLDAsMCwwLDAsMCwxLDAsMiwxLDEsMCwxLDAsMCwxLDEsMSwyLDIsMCwwLDEsMCwwLDAsMSwwLDAsMSwKMSwxLDIsMSwwLDEsMSwxLDAsMSwwLDEsMSwxLDEsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDIsMiwxLAowLDIsMCwxLDIsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMSwwLDAsMSwwLDEsMSwxLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDEsMSwxLDEsMSwxLDEsMSwyLDEsMCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwxLDEsMCwwLDAsMCwxLDEsMSwwLDEsMSwwLDEsMCwwLDAsMSwxLDAsMSwKMiwwLDEsMCwxLDAsMSwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDEsMSwwLDEsMCwwLDEsMSwyLDEsMSwyLDAsMSwwLDAsMCwxLDEsMCwxLAoxLDAsMCwxLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwxLDAsMSwxLDIsMCwxLDAsMCwwLDAsMiwxLDEsMiwwLDIsMCwwLDAsMSwxLDAsMSwKMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMSwwLDIsMSwxLDAsMSwwLDAsMiwyLDEsMiwxLDEsMCwxLDAsMCwwLDEsMSwwLDEsCjIsMCwxLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDIsMiwwLDAsMCwwLDAsMSwxLDAsMSwwLDAsMSwwLDAsMCwwLDEsMCwxLAoxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwyLDIsMCwwLDAsMCwyLDEsMSwxLDAsMiwxLDEsMCwwLDAsMiwxLDAsMSwKMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMSwwLDEsMSwyLDAsMSwwLDAsMSwxLDAsMiwxLDEsMCwxLDAsMCwwLDEsMSwwLDEsCjIsMiwxLDEsMSwwLDEsMSwwLDEsMSwwLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwxLDAsMiwxLDEsMCwxLDAsMCwxLDEsMCwxLDIsMSwwLDIsMCwwLDAsMSwxLDAsMSwKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLAowLDEsMCwwLDIsMCwyLDEsMSwwLDEsMCwxLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwxLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMSwwLDAsMSwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMSwwLDEsMSwyLDAsMSwwLDAsMSwxLDEsMCwxLDAsMCwxLDAsMCwwLDEsMCwwLDEsCjEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMCwwLDAsMCwwLDEsMCwxLDEsMCwwLDEsMCwwLDIsMSwxLDEsMSwxLDAsMSwwLDAsMCwwLDEsMCwxLAowLDEsMSwxLDIsMSwxLDEsMSwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwxLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMiwxLDAsMCwwLDAsMCwxLDEsMSwxLDEsMCwxLDAsMCwwLDEsMSwwLDAsCikKCldpbjEyNTVIZWJyZXdNb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiBXSU4xMjU1X0NIQVJfVE9fT1JERVJfTUFQLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IEhFQlJFV19MQU5HX01PREVMLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45ODQwMDQsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBGYWxzZSwKICAnY2hhcnNldF9uYW1lJzogIndpbmRvd3MtMTI1NSIsCiAgJ2xhbmd1YWdlJzogJ0hlYnJldycsCn0KUEsDBBQAAAAAAAAAIQDDwVWAMDEAADAxAAA5AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2h1bmdhcmlhbm1vZGVsLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIDI1NTogQ29udHJvbCBjaGFyYWN0ZXJzIHRoYXQgdXN1YWxseSBkb2VzIG5vdCBleGlzdCBpbiBhbnkgdGV4dAojIDI1NDogQ2FycmlhZ2UvUmV0dXJuCiMgMjUzOiBzeW1ib2wgKHB1bmN0dWF0aW9uKSB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byB3b3JkCiMgMjUyOiAwIC0gOQoKIyBDaGFyYWN0ZXIgTWFwcGluZyBUYWJsZToKTGF0aW4yX0h1bmdhcmlhbkNoYXJUb09yZGVyTWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywgMjgsIDQwLCA1NCwgNDUsIDMyLCA1MCwgNDksIDM4LCAzOSwgNTMsIDM2LCA0MSwgMzQsIDM1LCA0NywKIDQ2LCA3MSwgNDMsIDMzLCAzNywgNTcsIDQ4LCA2NCwgNjgsIDU1LCA1MiwyNTMsMjUzLDI1MywyNTMsMjUzLAoyNTMsICAyLCAxOCwgMjYsIDE3LCAgMSwgMjcsIDEyLCAyMCwgIDksIDIyLCAgNywgIDYsIDEzLCAgNCwgIDgsCiAyMywgNjcsIDEwLCAgNSwgIDMsIDIxLCAxOSwgNjUsIDYyLCAxNiwgMTEsMjUzLDI1MywyNTMsMjUzLDI1MywKMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzMsMTc0LAoxNzUsMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsCjE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywgNzUsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwKIDc5LDIwNiwyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLAoyMjEsIDUxLCA4MSwyMjIsIDc4LDIyMywyMjQsMjI1LDIyNiwgNDQsMjI3LDIyOCwyMjksIDYxLDIzMCwyMzEsCjIzMiwyMzMsMjM0LCA1OCwyMzUsIDY2LCA1OSwyMzYsMjM3LDIzOCwgNjAsIDY5LCA2MywyMzksMjQwLDI0MSwKIDgyLCAxNCwgNzQsMjQyLCA3MCwgODAsMjQzLCA3MiwyNDQsIDE1LCA4MywgNzcsIDg0LCAzMCwgNzYsIDg1LAoyNDUsMjQ2LDI0NywgMjUsIDczLCA0MiwgMjQsMjQ4LDI0OSwyNTAsIDMxLCA1NiwgMjksMjUxLDI1MiwyNTMsCikKCndpbjEyNTBIdW5nYXJpYW5DaGFyVG9PcmRlck1hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsIDI4LCA0MCwgNTQsIDQ1LCAzMiwgNTAsIDQ5LCAzOCwgMzksIDUzLCAzNiwgNDEsIDM0LCAzNSwgNDcsCiA0NiwgNzIsIDQzLCAzMywgMzcsIDU3LCA0OCwgNjQsIDY4LCA1NSwgNTIsMjUzLDI1MywyNTMsMjUzLDI1MywKMjUzLCAgMiwgMTgsIDI2LCAxNywgIDEsIDI3LCAxMiwgMjAsICA5LCAyMiwgIDcsICA2LCAxMywgIDQsICA4LAogMjMsIDY3LCAxMCwgIDUsICAzLCAyMSwgMTksIDY1LCA2MiwgMTYsIDExLDI1MywyNTMsMjUzLDI1MywyNTMsCjE2MSwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzEsMTcyLDE3MywxNzQsMTc1LDE3NiwKMTc3LDE3OCwxNzksMTgwLCA3OCwxODEsIDY5LDE4MiwxODMsMTg0LDE4NSwxODYsMTg3LDE4OCwxODksMTkwLAoxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsIDc2LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsCiA4MSwyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwKMjIxLCA1MSwgODMsMjIyLCA4MCwyMjMsMjI0LDIyNSwyMjYsIDQ0LDIyNywyMjgsMjI5LCA2MSwyMzAsMjMxLAoyMzIsMjMzLDIzNCwgNTgsMjM1LCA2NiwgNTksMjM2LDIzNywyMzgsIDYwLCA3MCwgNjMsMjM5LDI0MCwyNDEsCiA4NCwgMTQsIDc1LDI0MiwgNzEsIDgyLDI0MywgNzMsMjQ0LCAxNSwgODUsIDc5LCA4NiwgMzAsIDc3LCA4NywKMjQ1LDI0NiwyNDcsIDI1LCA3NCwgNDIsIDI0LDI0OCwyNDksMjUwLCAzMSwgNTYsIDI5LDI1MSwyNTIsMjUzLAopCgojIE1vZGVsIFRhYmxlOgojIHRvdGFsIHNlcXVlbmNlczogMTAwJQojIGZpcnN0IDUxMiBzZXF1ZW5jZXM6IDk0LjczNjglCiMgZmlyc3QgMTAyNCBzZXF1ZW5jZXM6NS4yNjIzJQojIHJlc3QgIHNlcXVlbmNlczogICAgIDAuODg5NCUKIyBuZWdhdGl2ZSBzZXF1ZW5jZXM6ICAwLjAwMDklCkh1bmdhcmlhbkxhbmdNb2RlbCA9ICgKMCwzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywxLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLAozLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDMsMywzLDMsMywzLDIsMiwzLDMsMSwxLDIsMiwyLDIsMiwxLDIsCjMsMiwyLDMsMywzLDMsMywyLDMsMywzLDMsMywzLDEsMiwzLDMsMywzLDIsMywzLDEsMSwzLDMsMCwxLDEsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLAozLDIsMSwzLDMsMywzLDMsMiwzLDMsMywzLDMsMSwxLDIsMywzLDMsMywzLDMsMywxLDEsMywyLDAsMSwxLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDEsMSwyLDMsMywzLDEsMywzLDMsMywzLDEsMywzLDIsMiwwLDMsMiwzLAowLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDIsMywzLDMsMiwzLDMsMiwzLDMsMywzLDMsMiwzLDMsMiwyLDMsMiwzLDIsMCwzLDIsMiwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywyLDMsMywzLDMsMywyLDMsMywzLDEsMiwzLDIsMiwzLDEsMiwzLDMsMiwyLDAsMywzLDMsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywyLDIsMywzLDMsMywzLDMsMiwzLDMsMywzLDIsMywzLDMsMywwLDIsMywyLAowLDAsMCwxLDEsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywxLDEsMSwzLDMsMiwxLDMsMiwyLDMsMiwxLDMsMiwyLDEsMCwzLDMsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAozLDIsMiwzLDMsMywzLDMsMSwyLDMsMywzLDMsMSwyLDEsMywzLDMsMywyLDIsMywxLDEsMywyLDAsMSwxLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDIsMiwzLDMsMywzLDMsMiwxLDMsMywzLDMsMywyLDIsMSwzLDMsMywwLDEsMSwyLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMywyLDMsMywyLDMsMywzLDIsMCwzLDIsMywKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywyLDMsMywzLDIsMywyLDMsMywzLDEsMywyLDIsMiwzLDEsMSwzLDMsMSwxLDAsMywzLDIsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywyLDMsMywzLDIsMywyLDMsMywzLDIsMywzLDMsMywzLDEsMiwzLDIsMiwwLDIsMiwyLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMywzLDIsMiwyLDMsMSwzLDMsMiwyLDEsMywzLDMsMSwxLDMsMSwyLDMsMiwzLDIsMiwyLDEsMCwyLDIsMiwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLAozLDEsMSwzLDMsMywzLDMsMSwyLDMsMywzLDMsMSwyLDEsMywzLDMsMiwyLDMsMiwxLDAsMywyLDAsMSwxLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywxLDEsMywzLDMsMywzLDEsMiwzLDMsMywzLDEsMSwwLDMsMywzLDMsMCwyLDMsMCwwLDIsMSwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDIsMiwzLDMsMiwyLDIsMiwzLDMsMCwxLDIsMywyLDMsMiwyLDMsMiwxLDIsMCwyLDIsMiwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywxLDIsMywzLDMsMiwxLDIsMywzLDIsMiwyLDMsMiwzLDMsMSwzLDMsMSwxLDAsMiwzLDIsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMywzLDMsMSwyLDIsMiwyLDMsMywzLDEsMSwxLDMsMywxLDEsMywxLDEsMywyLDEsMiwzLDEsMSwwLDIsMiwyLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMywzLDIsMSwyLDEsMSwzLDMsMSwxLDEsMSwzLDMsMSwxLDIsMiwxLDIsMSwxLDIsMiwxLDEsMCwyLDIsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAozLDMsMywxLDEsMiwxLDEsMywzLDEsMCwxLDEsMywzLDIsMCwxLDEsMiwzLDEsMCwyLDIsMSwwLDAsMSwzLDIsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMywyLDEsMywzLDMsMywzLDEsMiwzLDIsMywzLDIsMSwxLDMsMiwzLDIsMSwyLDIsMCwxLDIsMSwwLDAsMSwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMiwyLDIsMiwzLDEsMiwyLDEsMSwzLDMsMCwzLDIsMSwyLDMsMiwxLDMsMywxLDEsMCwyLDEsMywKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAozLDMsMywyLDIsMiwzLDIsMywzLDMsMiwxLDEsMywzLDEsMSwxLDIsMiwzLDIsMywyLDIsMiwxLDAsMiwyLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMywzLDMsMywzLDAsMCwzLDMsMiwzLDAsMCwwLDIsMywzLDEsMCwxLDIsMCwwLDEsMSwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMSwyLDMsMywzLDMsMywxLDIsMywzLDIsMiwxLDEsMCwzLDMsMiwyLDEsMiwyLDEsMCwyLDIsMCwxLDEsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMiwyLDEsMywxLDIsMywzLDIsMiwxLDEsMiwyLDEsMSwxLDEsMywyLDEsMSwxLDEsMiwxLDAsMSwyLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMiwzLDMsMSwxLDEsMSwxLDMsMywzLDAsMSwxLDMsMywxLDEsMSwxLDEsMiwyLDAsMywxLDEsMiwwLDIsMSwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMSwwLDEsMiwxLDIsMiwwLDEsMiwzLDEsMiwwLDAsMCwyLDEsMSwxLDEsMSwyLDAsMCwxLDEsMCwwLDAsMCwKMSwyLDEsMiwyLDIsMSwyLDEsMiwwLDIsMCwyLDIsMSwxLDIsMSwxLDIsMSwxLDEsMCwxLDAsMCwwLDEsMSwwLAoxLDEsMSwyLDMsMiwzLDMsMCwxLDIsMiwzLDEsMCwxLDAsMiwxLDIsMiwwLDEsMSwwLDAsMSwxLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMywzLDIsMiwxLDAsMCwzLDIsMywyLDAsMCwwLDEsMSwzLDAsMCwxLDEsMCwwLDIsMSwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMSwxLDIsMiwzLDMsMSwwLDEsMywyLDMsMSwxLDEsMCwxLDEsMSwxLDEsMywxLDAsMCwyLDIsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDEsMSwxLDIsMiwyLDEsMCwxLDIsMywzLDIsMCwwLDAsMiwxLDEsMSwyLDEsMSwxLDAsMSwxLDEsMCwwLDAsCjEsMiwyLDIsMiwyLDEsMSwxLDIsMCwyLDEsMSwxLDEsMSwyLDEsMSwxLDEsMSwxLDAsMSwxLDEsMCwwLDEsMSwKMywyLDIsMSwwLDAsMSwxLDIsMiwwLDMsMCwxLDIsMSwxLDAsMCwxLDEsMSwwLDEsMSwxLDEsMCwyLDEsMSwxLAoyLDIsMSwxLDEsMiwxLDIsMSwxLDEsMSwxLDEsMSwyLDEsMSwxLDIsMywxLDEsMSwxLDEsMSwxLDEsMSwwLDEsCjIsMywzLDAsMSwwLDAsMCwzLDMsMSwwLDAsMSwyLDIsMSwwLDAsMCwwLDIsMCwwLDEsMSwxLDAsMiwxLDEsMSwKMiwxLDEsMSwxLDEsMSwyLDEsMSwwLDEsMSwwLDEsMSwxLDAsMSwyLDEsMSwwLDEsMSwxLDEsMSwxLDEsMCwxLAoyLDMsMywwLDEsMCwwLDAsMiwyLDAsMCwwLDAsMSwyLDIsMCwwLDAsMCwxLDAsMCwxLDEsMCwwLDIsMCwxLDAsCjIsMSwxLDEsMSwyLDEsMSwxLDEsMSwxLDEsMiwxLDEsMSwxLDEsMSwxLDEsMSwyLDAsMSwxLDEsMSwxLDAsMSwKMywyLDIsMCwxLDAsMSwwLDIsMywyLDAsMCwxLDIsMiwxLDAsMCwxLDEsMSwwLDAsMiwxLDAsMSwyLDIsMSwxLAoyLDEsMSwxLDEsMSwxLDIsMSwxLDEsMSwxLDEsMCwyLDEsMCwxLDEsMCwxLDEsMSwwLDEsMSwyLDEsMSwwLDEsCjIsMiwyLDAsMCwxLDAsMCwyLDIsMSwxLDAsMCwyLDEsMSwwLDAsMCwxLDIsMCwwLDIsMSwwLDAsMiwxLDEsMSwKMiwxLDEsMSwxLDIsMSwyLDEsMSwxLDIsMiwxLDEsMiwxLDEsMSwyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLAoxLDIsMywwLDAsMCwxLDAsMywyLDEsMCwwLDEsMiwxLDEsMCwwLDAsMCwyLDEsMCwxLDEsMCwwLDIsMSwyLDEsCjEsMSwwLDAsMCwxLDAsMSwxLDEsMSwxLDIsMCwwLDEsMCwwLDAsMiwwLDAsMSwxLDEsMSwxLDEsMSwxLDAsMSwKMywwLDAsMiwxLDIsMiwxLDAsMCwyLDEsMiwyLDAsMCwwLDIsMSwxLDEsMCwxLDEsMCwwLDEsMSwyLDAsMCwwLAoxLDIsMSwyLDIsMSwxLDIsMSwyLDAsMSwxLDEsMSwxLDEsMSwxLDEsMiwxLDEsMCwwLDEsMSwxLDEsMCwwLDEsCjEsMywyLDAsMCwwLDEsMCwyLDIsMiwwLDAsMCwyLDIsMSwwLDAsMCwwLDMsMSwxLDEsMSwwLDAsMiwxLDEsMSwKMiwxLDAsMSwxLDEsMCwxLDEsMSwxLDEsMSwxLDAsMiwxLDAsMCwxLDAsMSwxLDAsMSwxLDEsMSwxLDEsMCwxLAoyLDMsMiwwLDAsMCwxLDAsMiwyLDAsMCwwLDAsMiwxLDEsMCwwLDAsMCwyLDEsMCwxLDEsMCwwLDIsMSwxLDAsCjIsMSwxLDEsMSwyLDEsMiwxLDIsMCwxLDEsMSwwLDIsMSwxLDEsMiwxLDEsMSwxLDAsMSwxLDEsMSwxLDAsMSwKMywxLDEsMiwyLDIsMywyLDEsMSwyLDIsMSwxLDAsMSwwLDIsMiwxLDEsMSwxLDEsMCwwLDEsMSwwLDEsMSwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMiwyLDAsMCwwLDAsMCwyLDIsMCwwLDAsMCwyLDIsMSwwLDAsMCwxLDEsMCwwLDEsMiwwLDAsMiwxLDEsMSwKMiwyLDEsMSwxLDIsMSwyLDEsMSwwLDEsMSwxLDEsMiwxLDEsMSwyLDEsMSwxLDEsMCwxLDIsMSwxLDEsMCwxLAoxLDAsMCwxLDIsMywyLDEsMCwwLDIsMCwxLDEsMCwwLDAsMSwxLDEsMSwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsCjEsMiwxLDIsMSwyLDEsMSwxLDIsMCwyLDEsMSwxLDAsMSwyLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMiwzLDIsMCwwLDAsMCwwLDEsMSwyLDEsMCwwLDEsMSwxLDAsMCwwLDAsMiwwLDAsMSwxLDAsMCwyLDEsMSwxLAoyLDEsMSwxLDEsMSwxLDIsMSwwLDEsMSwxLDEsMCwyLDEsMSwxLDEsMSwxLDAsMSwwLDEsMSwxLDEsMSwwLDEsCjEsMiwyLDAsMSwxLDEsMCwyLDIsMiwwLDAsMCwzLDIsMSwwLDAsMCwxLDEsMCwwLDEsMSwwLDEsMSwxLDAsMCwKMSwxLDAsMSwxLDEsMSwxLDEsMSwxLDIsMSwxLDEsMSwxLDEsMSwyLDEsMSwxLDAsMCwxLDEsMSwwLDEsMCwxLAoyLDEsMCwyLDEsMSwyLDIsMSwxLDIsMSwxLDEsMCwwLDAsMSwxLDAsMSwxLDEsMSwwLDAsMSwxLDEsMCwwLDAsCjEsMiwyLDIsMiwyLDEsMSwxLDIsMCwyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwxLDAsMCwwLDEsMCwKMSwyLDMsMCwwLDAsMSwwLDIsMiwwLDAsMCwwLDIsMiwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwyLDAsMSwwLAoyLDEsMSwxLDEsMSwwLDIsMCwwLDAsMSwyLDEsMSwxLDEsMCwxLDIsMCwxLDAsMSwwLDEsMSwxLDAsMSwwLDEsCjIsMiwyLDAsMCwwLDEsMCwyLDEsMiwwLDAsMCwxLDEsMiwwLDAsMCwwLDEsMCwwLDEsMSwwLDAsMiwxLDAsMSwKMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDIsMCwxLDEsMSwxLDEsMCwxLAoxLDIsMiwwLDAsMCwxLDAsMiwyLDIsMCwwLDAsMSwxLDAsMCwwLDAsMCwxLDEsMCwyLDAsMCwxLDEsMSwwLDEsCjEsMCwxLDEsMSwxLDEsMSwwLDEsMSwxLDEsMCwwLDEsMCwwLDEsMSwwLDEsMCwxLDEsMSwxLDEsMCwwLDAsMSwKMSwwLDAsMSwwLDEsMiwxLDAsMCwxLDEsMSwyLDAsMCwwLDEsMSwwLDEsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLAowLDIsMSwyLDEsMSwxLDEsMSwyLDAsMiwwLDEsMSwwLDEsMiwxLDAsMSwxLDEsMCwwLDAsMCwwLDAsMSwwLDAsCjIsMSwxLDAsMSwyLDAsMCwxLDEsMSwwLDAsMCwxLDEsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMiwxLDAsMSwKMiwyLDEsMSwxLDEsMSwyLDEsMSwwLDEsMSwxLDEsMiwxLDEsMSwyLDEsMSwwLDEsMCwxLDEsMSwxLDEsMCwxLAoxLDIsMiwwLDAsMCwwLDAsMSwxLDAsMCwwLDAsMiwxLDAsMCwwLDAsMCwyLDAsMCwyLDIsMCwwLDIsMCwwLDEsCjIsMSwxLDEsMSwxLDEsMSwwLDEsMSwwLDEsMSwwLDEsMCwwLDAsMSwxLDEsMSwwLDAsMSwxLDEsMSwwLDAsMSwKMSwxLDIsMCwwLDMsMSwwLDIsMSwxLDEsMCwwLDEsMSwxLDAsMCwwLDEsMSwwLDAsMCwxLDAsMCwxLDAsMSwwLAoxLDIsMSwwLDEsMSwxLDIsMSwxLDAsMSwxLDEsMSwxLDAsMCwwLDEsMSwxLDEsMSwwLDEsMCwwLDAsMSwwLDAsCjIsMSwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwxLDAsMCwwLDAsMiwwLDAsMCwKMiwxLDEsMSwxLDEsMSwxLDEsMSwwLDEsMSwxLDEsMSwxLDEsMSwxLDIsMSwxLDAsMCwxLDEsMSwxLDEsMCwxLAoyLDEsMSwxLDIsMSwxLDEsMCwxLDEsMiwxLDAsMCwwLDAsMSwxLDEsMSwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwxLDAsMSwxLDEsMSwxLDAsMCwxLDEsMiwxLDAsMCwwLDEsMSwwLDAsMCwxLDEsMCwwLDEsMCwxLDAsMCwwLAoxLDIsMSwxLDEsMSwxLDEsMSwxLDAsMSwwLDEsMSwxLDEsMSwxLDAsMSwxLDEsMCwwLDAsMCwwLDAsMSwwLDAsCjIsMCwwLDAsMSwxLDEsMSwwLDAsMSwxLDAsMCwwLDAsMCwxLDEsMSwyLDAsMCwxLDAsMCwxLDAsMSwwLDAsMCwKMCwxLDEsMSwxLDEsMSwxLDEsMiwwLDEsMSwxLDEsMCwxLDEsMSwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwxLDEsMSwxLDEsMCwwLDIsMSwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsCjAsMSwxLDEsMSwxLDEsMCwxLDEsMCwxLDAsMSwxLDAsMSwxLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMSwxLDEsMCwwLDAsMCwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAowLDEsMSwxLDEsMSwwLDAsMSwxLDAsMSwwLDEsMCwwLDEsMSwxLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDEsMCwwLDAsMCwwLDAsMSwxLDIsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwxLDEsMSwwLDEsMCwwLDEsMSwwLDEsMCwxLDEsMCwxLDEsMSwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDEsMSwxLDAsMCwxLDAsMCwxLDAsMSwwLDEsMSwxLDAsMCwxLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMSwxLDEsMSwwLDAsMCwxLDEsMSwwLDAsMCwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDEsMSwxLDEsMSwxLDAsMSwxLDAsMSwwLDEsMCwwLDEsMSwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsCikKCkxhdGluMkh1bmdhcmlhbk1vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IExhdGluMl9IdW5nYXJpYW5DaGFyVG9PcmRlck1hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBIdW5nYXJpYW5MYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk0NzM2OCwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IFRydWUsCiAgJ2NoYXJzZXRfbmFtZSc6ICJJU08tODg1OS0yIiwKICAnbGFuZ3VhZ2UnOiAnSHVuZ2FyaWFuJywKfQoKV2luMTI1MEh1bmdhcmlhbk1vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IHdpbjEyNTBIdW5nYXJpYW5DaGFyVG9PcmRlck1hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBIdW5nYXJpYW5MYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk0NzM2OCwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IFRydWUsCiAgJ2NoYXJzZXRfbmFtZSc6ICJ3aW5kb3dzLTEyNTAiLAogICdsYW5ndWFnZSc6ICdIdW5nYXJpYW4nLAp9ClBLAwQUAAAAAAAAACEAIg/SPxosAAAaLAAANAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmd0aGFpbW9kZWwucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgMjU1OiBDb250cm9sIGNoYXJhY3RlcnMgdGhhdCB1c3VhbGx5IGRvZXMgbm90IGV4aXN0IGluIGFueSB0ZXh0CiMgMjU0OiBDYXJyaWFnZS9SZXR1cm4KIyAyNTM6IHN5bWJvbCAocHVuY3R1YXRpb24pIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIHdvcmQKIyAyNTI6IDAgLSA5CgojIFRoZSBmb2xsb3dpbmcgcmVzdWx0IGZvciB0aGFpIHdhcyBjb2xsZWN0ZWQgZnJvbSBhIGxpbWl0ZWQgc2FtcGxlICgxTSkuCgojIENoYXJhY3RlciBNYXBwaW5nIFRhYmxlOgpUSVM2MjBDaGFyVG9PcmRlck1hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsMTgyLDEwNiwxMDcsMTAwLDE4MywxODQsMTg1LDEwMSwgOTQsMTg2LDE4NywxMDgsMTA5LDExMCwxMTEsICAjIDQwCjE4OCwxODksMTkwLCA4OSwgOTUsMTEyLDExMywxOTEsMTkyLDE5MywxOTQsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNTAKMjUzLCA2NCwgNzIsIDczLDExNCwgNzQsMTE1LDExNiwxMDIsIDgxLDIwMSwxMTcsIDkwLDEwMywgNzgsIDgyLCAgIyA2MAogOTYsMjAyLCA5MSwgNzksIDg0LDEwNCwxMDUsIDk3LCA5OCwgOTIsMjAzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDcwCjIwOSwyMTAsMjExLDIxMiwyMTMsIDg4LDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwxMTgsMjIxLDIyMiwKMjIzLDIyNCwgOTksIDg1LCA4MywyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LAoyMzYsICA1LCAzMCwyMzcsIDI0LDIzOCwgNzUsICA4LCAyNiwgNTIsIDM0LCA1MSwxMTksIDQ3LCA1OCwgNTcsCiA0OSwgNTMsIDU1LCA0MywgMjAsIDE5LCA0NCwgMTQsIDQ4LCAgMywgMTcsIDI1LCAzOSwgNjIsIDMxLCA1NCwKIDQ1LCAgOSwgMTYsICAyLCA2MSwgMTUsMjM5LCAxMiwgNDIsIDQ2LCAxOCwgMjEsIDc2LCAgNCwgNjYsIDYzLAogMjIsIDEwLCAgMSwgMzYsIDIzLCAxMywgNDAsIDI3LCAzMiwgMzUsIDg2LDI0MCwyNDEsMjQyLDI0MywyNDQsCiAxMSwgMjgsIDQxLCAyOSwgMzMsMjQ1LCA1MCwgMzcsICA2LCAgNywgNjcsIDc3LCAzOCwgOTMsMjQ2LDI0NywKIDY4LCA1NiwgNTksIDY1LCA2OSwgNjAsIDcwLCA4MCwgNzEsIDg3LDI0OCwyNDksMjUwLDI1MSwyNTIsMjUzLAopCgojIE1vZGVsIFRhYmxlOgojIHRvdGFsIHNlcXVlbmNlczogMTAwJQojIGZpcnN0IDUxMiBzZXF1ZW5jZXM6IDkyLjYzODYlCiMgZmlyc3QgMTAyNCBzZXF1ZW5jZXM6Ny4zMTc3JQojIHJlc3QgIHNlcXVlbmNlczogICAgIDEuMDIzMCUKIyBuZWdhdGl2ZSBzZXF1ZW5jZXM6ICAwLjA0MzYlClRoYWlMYW5nTW9kZWwgPSAoCjAsMSwzLDMsMywzLDAsMCwzLDMsMCwzLDMsMCwzLDMsMywzLDMsMywzLDMsMCwwLDMsMywzLDAsMywzLDMsMywKMCwzLDMsMCwwLDAsMSwzLDAsMywzLDIsMywzLDAsMSwyLDMsMywzLDMsMCwyLDAsMiwwLDAsMywyLDEsMiwyLAozLDAsMywzLDIsMywwLDAsMywzLDAsMywzLDAsMywzLDMsMywzLDMsMywzLDMsMCwzLDIsMywwLDIsMiwyLDMsCjAsMiwzLDAsMCwwLDAsMSwwLDEsMiwzLDEsMSwzLDIsMiwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsMSwKMywzLDMsMiwzLDMsMywzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMiwzLDMsMiwzLDIsMywzLDIsMiwyLAozLDEsMiwzLDAsMywzLDIsMiwxLDIsMywzLDEsMiwwLDEsMywwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDEsCjMsMywyLDIsMywzLDMsMywxLDIsMywzLDMsMywzLDIsMiwyLDIsMywzLDIsMiwzLDMsMiwyLDMsMiwzLDIsMiwKMywzLDEsMiwzLDEsMiwyLDMsMywxLDAsMiwxLDAsMCwzLDEsMiwxLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwxLAozLDMsMywzLDMsMywyLDIsMywzLDMsMywyLDMsMiwyLDMsMywyLDIsMywyLDIsMiwyLDEsMSwzLDEsMiwxLDEsCjMsMiwxLDAsMiwxLDAsMSwwLDEsMSwwLDEsMSwwLDAsMSwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMiwzLDIsMywzLDIsMiwzLDIsMywzLDIsMywxLDEsMiwzLDIsMiwyLDMsMiwyLDIsMiwyLDEsMiwxLAoyLDIsMSwxLDMsMywyLDEsMCwxLDIsMiwwLDEsMywwLDAsMCwxLDEsMCwwLDAsMCwwLDIsMywwLDAsMiwxLDEsCjMsMywyLDMsMywyLDAsMCwzLDMsMCwzLDMsMCwyLDIsMywxLDIsMiwxLDEsMSwwLDIsMiwyLDAsMiwyLDEsMSwKMCwyLDEsMCwyLDAsMCwyLDAsMSwwLDAsMSwwLDAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDMsMiwzLDMsMiwwLDAsMywzLDAsMiwzLDAsMiwxLDIsMiwyLDIsMSwyLDAsMCwyLDIsMiwwLDIsMiwxLDEsCjAsMiwxLDAsMiwwLDAsMiwwLDEsMSwwLDEsMCwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDIsMywyLDMsMiwwLDIsMiwxLDMsMiwxLDMsMiwxLDIsMywyLDIsMywwLDIsMywyLDIsMSwyLDIsMiwyLAoxLDIsMiwwLDAsMCwwLDIsMCwxLDIsMCwxLDEsMSwwLDEsMCwzLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMywyLDMsMywyLDMsMiwyLDIsMywyLDIsMywyLDIsMSwyLDMsMiwyLDMsMSwzLDIsMiwyLDMsMiwyLDIsMywKMywyLDEsMywwLDEsMSwxLDAsMiwxLDEsMSwxLDEsMCwxLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLAoxLDAsMCwzLDAsMywzLDMsMywzLDAsMCwzLDAsMiwyLDMsMywzLDMsMywwLDAsMCwxLDEsMywwLDAsMCwwLDIsCjAsMCwxLDAsMCwwLDAsMCwwLDAsMiwzLDAsMCwwLDMsMCwyLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwKMiwwLDMsMywzLDMsMCwwLDIsMywwLDAsMywwLDMsMywyLDMsMywzLDMsMywwLDAsMywzLDMsMCwwLDAsMywzLAowLDAsMywwLDAsMCwwLDIsMCwwLDIsMSwxLDMsMCwwLDEsMCwwLDIsMywwLDEsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMiwzLDMsMywzLDMsMywzLDEsMiwxLDMsMywyLDIsMSwyLDIsMiwzLDEsMSwyLDAsMiwxLDIsMSwKMiwyLDEsMCwwLDAsMSwxLDAsMSwwLDEsMSwwLDAsMCwwLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAozLDAsMiwxLDIsMywzLDMsMCwyLDAsMiwyLDAsMiwxLDMsMiwyLDEsMiwxLDAsMCwyLDIsMSwwLDIsMSwyLDIsCjAsMSwxLDAsMCwwLDAsMSwwLDEsMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywyLDEsMywzLDEsMSwzLDAsMiwzLDEsMSwzLDIsMSwxLDIsMCwyLDIsMywyLDEsMSwxLDEsMSwyLAozLDAsMCwxLDMsMSwyLDEsMiwwLDMsMCwwLDAsMSwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsCjMsMywxLDEsMywyLDMsMywzLDEsMywyLDEsMywyLDEsMywyLDIsMiwyLDEsMywzLDEsMiwxLDMsMSwyLDMsMCwKMiwxLDEsMywyLDIsMiwxLDIsMSwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLAozLDMsMiwzLDIsMywzLDIsMywyLDMsMiwzLDMsMiwxLDAsMywyLDIsMiwxLDIsMiwyLDEsMiwyLDEsMiwxLDEsCjIsMiwyLDMsMCwxLDMsMSwxLDEsMSwwLDEsMSwwLDIsMSwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywyLDMsMiwyLDEsMSwzLDIsMywyLDMsMiwwLDMsMiwyLDEsMiwwLDIsMiwyLDEsMiwyLDIsMiwxLAozLDIsMSwyLDIsMSwwLDIsMCwxLDAsMCwxLDEsMCwwLDAsMCwwLDEsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywyLDMsMSwyLDMsMywyLDIsMywwLDEsMSwyLDAsMywzLDIsMiwzLDAsMSwxLDMsMCwwLDAsMCwKMywxLDAsMywzLDAsMiwwLDIsMSwwLDAsMywyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywyLDMsMiwzLDMsMCwxLDMsMSwxLDIsMSwyLDEsMSwzLDEsMSwwLDIsMywxLDEsMSwxLDEsMSwxLDEsCjMsMSwxLDIsMiwyLDIsMSwxLDEsMCwwLDIsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywyLDIsMSwxLDIsMSwzLDMsMiwzLDIsMiwzLDIsMiwzLDEsMiwyLDEsMiwwLDMsMiwxLDIsMiwyLDIsMiwxLAozLDIsMSwyLDIsMiwxLDEsMSwxLDAsMCwxLDEsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywxLDMsMywwLDIsMSwwLDMsMiwwLDAsMywxLDAsMSwxLDAsMSwwLDAsMCwwLDAsMSwKMSwwLDAsMSwwLDMsMiwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDAsMiwyLDIsMywwLDAsMSwzLDAsMywyLDAsMywyLDIsMywzLDMsMywzLDEsMCwyLDIsMiwwLDIsMiwxLDIsCjAsMiwzLDAsMCwwLDAsMSwwLDEsMCwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywwLDIsMywxLDMsMywyLDMsMywwLDMsMywwLDMsMiwyLDMsMiwzLDMsMywwLDAsMiwyLDMsMCwxLDEsMSwzLAowLDAsMywwLDAsMCwyLDIsMCwxLDMsMCwxLDIsMiwyLDMsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMiwzLDMsMiwwLDMsMywyLDIsMywxLDMsMiwxLDMsMiwwLDEsMiwyLDAsMiwzLDIsMSwwLDMsMCwwLDAsMCwKMywwLDAsMiwzLDEsMywwLDAsMywwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDEsMywyLDIsMiwxLDIsMCwxLDMsMSwxLDMsMSwzLDAsMCwyLDEsMSwxLDEsMiwxLDEsMSwwLDIsMSwwLDEsCjEsMiwwLDAsMCwzLDEsMSwwLDAsMCwwLDEsMCwxLDAsMCwxLDAsMSwwLDAsMCwwLDAsMywxLDAsMCwwLDEsMCwKMywzLDMsMywyLDIsMiwyLDIsMSwzLDEsMSwxLDIsMCwxLDEsMiwxLDIsMSwzLDIsMCwwLDMsMSwxLDEsMSwxLAozLDEsMCwyLDMsMCwwLDAsMywwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDIsMywwLDMsMywwLDIsMCwwLDAsMCwwLDAsMCwzLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMiwzLDEsMywwLDAsMSwyLDAsMCwyLDAsMywzLDIsMywzLDMsMiwzLDAsMCwyLDIsMiwwLDAsMCwyLDIsCjAsMCwxLDAsMCwwLDAsMywwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMywwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDIsMywxLDMsMywwLDAsMSwwLDMsMCwwLDAsMCwwLAowLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywxLDIsMywxLDIsMywxLDAsMywwLDIsMiwxLDAsMiwxLDEsMiwwLDEsMCwwLDEsMSwxLDEsMCwxLDAsMCwKMSwwLDAsMCwwLDEsMSwwLDMsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDIsMSwwLDEsMSwxLDMsMSwyLDIsMiwyLDIsMiwxLDEsMSwxLDAsMywxLDAsMSwzLDEsMSwxLDEsCjEsMSwwLDIsMCwxLDMsMSwxLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMSwKMywwLDIsMiwxLDMsMywyLDMsMywwLDEsMSwwLDIsMiwxLDIsMSwzLDMsMSwwLDAsMywyLDAsMCwwLDAsMiwxLAowLDEsMCwwLDAsMCwxLDIsMCwxLDEsMywxLDEsMiwyLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsCjAsMCwzLDAsMCwxLDAsMCwwLDMsMCwwLDMsMCwzLDEsMCwxLDEsMSwzLDIsMCwwLDAsMywwLDAsMCwwLDIsMCwKMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMSwzLDIsMSwzLDMsMSwyLDIsMCwxLDIsMSwwLDEsMiwwLDAsMCwwLDAsMywwLDAsMCwzLDAsMCwwLDAsCjMsMCwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDEsMiwwLDMsMywzLDIsMiwwLDEsMSwwLDEsMywwLDAsMCwyLDIsMCwwLDAsMCwzLDEsMCwxLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMCwyLDMsMSwyLDAsMCwyLDEsMCwzLDEsMCwxLDIsMCwxLDEsMSwxLDMsMCwwLDMsMSwxLDAsMiwyLDEsMSwKMCwyLDAsMCwwLDAsMCwxLDAsMSwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDAsMCwzLDEsMiwwLDAsMiwyLDAsMSwyLDAsMSwwLDEsMywxLDIsMSwwLDAsMCwyLDAsMywwLDAsMCwxLDAsCjAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDEsMSwyLDIsMCwwLDAsMiwwLDIsMSwwLDEsMSwwLDEsMSwxLDIsMSwwLDAsMSwxLDEsMCwyLDEsMSwxLAowLDEsMSwwLDAsMCwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLDEsCjAsMCwwLDIsMCwxLDMsMSwxLDEsMSwwLDAsMCwwLDMsMiwwLDEsMCwwLDAsMSwyLDAsMCwwLDEsMCwwLDAsMCwKMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMywzLDMsMywxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDIsMywyLDIsMCwwLDAsMSwwLDAsMCwwLDIsMywyLDEsMiwyLDMsMCwwLDAsMiwzLDEsMCwwLDAsMSwxLAowLDAsMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDEsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywyLDIsMCwxLDAsMCwwLDAsMiwwLDIsMCwxLDAsMCwwLDEsMSwwLDAsMCwyLDEsMCwxLDAsMSwxLDAsMCwKMCwxLDAsMiwwLDAsMSwwLDMsMCwxLDAsMCwwLDIsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMSwwLDAsMSwwLDAsMCwwLDAsMSwxLDIsMCwwLDAsMCwxLDAsMCwxLDMsMSwwLDAsMCwwLDEsMSwwLDAsCjAsMSwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDEsMSwxLDEsMiwzLDAsMCwyLDEsMSwxLDEsMSwwLDIsMSwxLDAsMCwwLDIsMSwwLDEsMiwxLDEsMCwxLAoyLDEsMCwzLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMywxLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMSwKMCwwLDAsMiwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMiwwLDAsMCwwLDAsMCwxLDIsMSwwLDEsMSwwLDIsMCwwLDEsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDIsMCwwLDAsMSwzLDAsMSwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMSwyLDAsMCwwLDAsMCwKMywzLDAsMCwxLDEsMiwwLDAsMSwyLDEsMCwxLDEsMSwwLDEsMSwwLDAsMiwxLDEsMCwxLDAsMCwxLDEsMSwwLAowLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMiwyLDEsMCwwLDAsMCwxLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwKMiwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMCwwLDEsMSwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMSwwLDEsMiwwLDEsMiwwLDAsMSwxLDAsMiwwLDEsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsMCwKMSwwLDAsMSwwLDEsMSwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDEsMCwwLDAsMCwwLDAsMCwxLDEsMCwxLDEsMCwyLDEsMywwLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDMsCjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMCwxLDAsMSwwLDAsMiwwLDAsMiwwLDAsMSwxLDIsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDEsMSwwLDAsMCwKMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwxLDEsMCwwLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwxLDMsMCwwLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMSwwLDAsMCwwLAoxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMiwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDEsMSwwLDAsMiwxLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAopCgpUSVM2MjBUaGFpTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogVElTNjIwQ2hhclRvT3JkZXJNYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogVGhhaUxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTI2Mzg2LAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJUSVMtNjIwIiwKICAnbGFuZ3VhZ2UnOiAnVGhhaScsCn0KUEsDBBQAAAAAAAAAIQC1MsNkXisAAF4rAAA3AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ3R1cmtpc2htb2RlbC5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIyAgIMOWemfDvHIgQmFza8SxbiAtIFR1cmtpc2ggTGFuZ3VhZ2UgTW9kZWwKIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyAyNTU6IENvbnRyb2wgY2hhcmFjdGVycyB0aGF0IHVzdWFsbHkgZG9lcyBub3QgZXhpc3QgaW4gYW55IHRleHQKIyAyNTQ6IENhcnJpYWdlL1JldHVybgojIDI1Mzogc3ltYm9sIChwdW5jdHVhdGlvbikgdGhhdCBkb2VzIG5vdCBiZWxvbmcgdG8gd29yZAojIDI1MjogMCAtIDkKCiMgQ2hhcmFjdGVyIE1hcHBpbmcgVGFibGU6CkxhdGluNV9UdXJraXNoQ2hhclRvT3JkZXJNYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKMjU1LCAyMywgMzcsIDQ3LCAzOSwgMjksIDUyLCAzNiwgNDUsIDUzLCA2MCwgMTYsIDQ5LCAyMCwgNDYsIDQyLAogNDgsIDY5LCA0NCwgMzUsIDMxLCA1MSwgMzgsIDYyLCA2NSwgNDMsIDU2LDI1NSwyNTUsMjU1LDI1NSwyNTUsCjI1NSwgIDEsIDIxLCAyOCwgMTIsICAyLCAxOCwgMjcsIDI1LCAgMywgMjQsIDEwLCAgNSwgMTMsICA0LCAxNSwKIDI2LCA2NCwgIDcsICA4LCAgOSwgMTQsIDMyLCA1NywgNTgsIDExLCAyMiwyNTUsMjU1LDI1NSwyNTUsMjU1LAoxODAsMTc5LDE3OCwxNzcsMTc2LDE3NSwxNzQsMTczLDE3MiwxNzEsMTcwLDE2OSwxNjgsMTY3LDE2NiwxNjUsCjE2NCwxNjMsMTYyLDE2MSwxNjAsMTU5LDEwMSwxNTgsMTU3LDE1NiwxNTUsMTU0LDE1MywxNTIsMTUxLDEwNiwKMTUwLDE0OSwxNDgsMTQ3LDE0NiwxNDUsMTQ0LDEwMCwxNDMsMTQyLDE0MSwxNDAsMTM5LDEzOCwxMzcsMTM2LAogOTQsIDgwLCA5MywxMzUsMTA1LDEzNCwxMzMsIDYzLDEzMiwxMzEsMTMwLDEyOSwxMjgsMTI3LDEyNiwxMjUsCjEyNCwxMDQsIDczLCA5OSwgNzksIDg1LDEyMywgNTQsMTIyLCA5OCwgOTIsMTIxLDEyMCwgOTEsMTAzLDExOSwKIDY4LDExOCwxMTcsIDk3LDExNiwxMTUsIDUwLCA5MCwxMTQsMTEzLDExMiwxMTEsIDU1LCA0MSwgNDAsIDg2LAogODksIDcwLCA1OSwgNzgsIDcxLCA4MiwgODgsIDMzLCA3NywgNjYsIDg0LCA4MywxMTAsIDc1LCA2MSwgOTYsCiAzMCwgNjcsMTA5LCA3NCwgODcsMTAyLCAzNCwgOTUsIDgxLDEwOCwgNzYsIDcyLCAxNywgIDYsIDE5LDEwNywKKQoKVHVya2lzaExhbmdNb2RlbCA9ICgKMywyLDMsMywzLDEsMywzLDMsMywzLDMsMywzLDIsMSwxLDMsMywxLDMsMywwLDMsMywzLDMsMywwLDMsMSwzLAozLDIsMSwwLDAsMSwxLDAsMCwwLDEsMCwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwyLDIsMCwwLDEsMCwwLDEsCjMsMiwyLDMsMywwLDMsMywzLDMsMywzLDMsMiwzLDEsMCwzLDMsMSwzLDMsMCwzLDMsMywzLDMsMCwzLDAsMywKMywxLDEsMCwxLDAsMSwwLDAsMCwwLDAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMiwyLDAsMCwwLDEsMCwxLAozLDMsMiwzLDMsMCwzLDMsMywzLDMsMywzLDIsMywxLDEsMywzLDAsMywzLDEsMiwzLDMsMywzLDAsMywwLDMsCjMsMSwxLDAsMCwwLDEsMCwwLDAsMCwxLDEsMCwxLDIsMSwwLDAsMCwxLDAsMCwwLDAsMiwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDMsMiwzLDMsMywzLDMsMywzLDMsMSwzLDMsMiwwLDMsMiwxLDIsMiwxLDMsMywwLDAsMCwyLAoyLDIsMCwxLDAsMCwxLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMSwwLDEsMCwwLDEsCjMsMywzLDIsMywzLDEsMiwzLDMsMywzLDMsMywzLDEsMywyLDEsMCwzLDIsMCwxLDIsMywzLDIsMSwwLDAsMiwKMiwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwyLDAsMCwwLAoxLDAsMSwzLDMsMSwzLDMsMywzLDMsMywzLDEsMiwwLDAsMiwzLDAsMiwzLDAsMCwyLDIsMiwzLDAsMywwLDEsCjIsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMCwzLDMsMywwLDMsMiwwLDIsMywyLDMsMywxLDAsMCwyLAozLDIsMCwwLDEsMCwwLDAsMCwwLDAsMiwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDEsMSwwLDIsMCwwLDEsCjMsMywzLDIsMywzLDIsMywzLDMsMywyLDMsMywzLDAsMywzLDAsMCwyLDEsMCwwLDIsMywyLDIsMCwwLDAsMiwKMiwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwwLDAsMSwwLDEsMCwyLDAsMCwxLAozLDMsMywyLDMsMywzLDMsMywzLDMsMiwzLDMsMywwLDMsMiwwLDEsMywyLDEsMSwzLDIsMywyLDEsMCwwLDIsCjIsMiwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwKMywzLDMsMiwzLDMsMywzLDMsMywzLDIsMywzLDMsMCwzLDIsMiwwLDIsMywwLDAsMiwyLDIsMiwwLDAsMCwyLAozLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMiwwLDEsMCwwLDAsCjMsMywzLDMsMywzLDMsMiwyLDIsMiwzLDIsMywzLDAsMywzLDEsMSwyLDIsMCwwLDIsMiwzLDIsMCwwLDEsMywKMCwzLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwxLAozLDMsMywyLDMsMywzLDIsMSwyLDIsMywyLDMsMywwLDMsMiwwLDAsMSwxLDAsMSwxLDIsMSwyLDAsMCwwLDEsCjAsMywwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsMSwwLDAsMCwKMywzLDMsMiwzLDMsMiwzLDIsMiwyLDMsMywzLDMsMSwzLDEsMSwwLDMsMiwxLDEsMywzLDIsMywxLDAsMCwxLAoxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDIsMCwwLDEsCjMsMiwyLDMsMywwLDMsMywzLDMsMywzLDMsMiwyLDEsMCwzLDMsMSwzLDMsMCwxLDMsMywyLDMsMCwzLDAsMywKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLAoyLDIsMiwzLDMsMCwzLDMsMywzLDMsMywzLDMsMywwLDAsMywyLDAsMywzLDAsMywyLDMsMywzLDAsMywxLDMsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwyLDAsMSwwLDAsMCwwLDAsMCwwLDIsMiwwLDAsMSwwLDAsMSwKMywzLDMsMSwyLDMsMywxLDAsMCwxLDAsMCwzLDMsMiwzLDAsMCwyLDAsMCwyLDAsMiwwLDAsMCwyLDAsMiwwLAowLDMsMSwwLDEsMCwwLDAsMiwyLDEsMCwxLDEsMiwxLDIsMiwyLDAsMiwxLDEsMCwwLDAsMiwwLDAsMCwwLDAsCjEsMiwxLDMsMywwLDMsMywzLDMsMywyLDMsMCwwLDAsMCwyLDMsMCwyLDMsMSwwLDIsMywxLDMsMCwzLDAsMiwKMywwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywxLDMsMywyLDIsMywyLDIsMCwxLDIsMywwLDEsMiwxLDAsMSwwLDAsMCwxLDAsMiwyLDAsMCwwLDEsCjEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDAsMSwwLDAsMCwKMywzLDMsMSwzLDMsMSwxLDMsMywxLDEsMywzLDEsMCwyLDEsMiwwLDIsMSwwLDAsMSwxLDIsMSwwLDAsMCwyLAoyLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDEsMCwyLDEsMywwLDAsMiwwLDAsMywzLDAsMywwLDAsMSwwLDEsMiwwLDAsMSwxLDIsMiwwLDEsMCwKMCwxLDIsMSwxLDAsMSwwLDEsMSwxLDEsMSwwLDEsMSwxLDIsMiwxLDIsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLAozLDMsMywyLDMsMiwzLDMsMCwyLDIsMiwzLDMsMywwLDMsMCwwLDAsMiwyLDAsMSwyLDEsMSwxLDAsMCwwLDEsCjAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKMywzLDMsMywzLDMsMiwxLDIsMiwzLDMsMywzLDIsMCwyLDAsMCwwLDIsMiwwLDAsMiwxLDMsMywwLDAsMSwxLAoxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsCjEsMSwyLDMsMywwLDMsMywzLDMsMywzLDIsMiwwLDIsMCwyLDMsMiwzLDIsMiwyLDIsMiwyLDIsMSwzLDIsMywKMiwwLDIsMSwyLDIsMiwyLDEsMSwyLDIsMSwyLDIsMSwyLDAsMCwyLDEsMSwwLDIsMSwwLDAsMSwwLDAsMCwxLAoyLDMsMywxLDEsMSwwLDEsMSwxLDIsMywyLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsCjAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMiwyLDIsMywyLDMsMiwyLDEsMywzLDMsMCwyLDEsMiwwLDIsMSwwLDAsMSwxLDEsMSwxLDAsMCwxLAoyLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDAsMiwwLDEsMCwwLDAsCjMsMywzLDIsMywzLDMsMywzLDIsMywxLDIsMywzLDEsMiwwLDAsMCwwLDAsMCwwLDMsMiwxLDEsMCwwLDAsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLAozLDMsMywyLDIsMywzLDIsMSwxLDEsMSwxLDMsMywwLDMsMSwwLDAsMSwxLDAsMCwzLDEsMiwxLDAsMCwwLDAsCjAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwKMywzLDMsMiwyLDMsMiwyLDIsMywyLDEsMSwzLDMsMCwzLDAsMCwwLDAsMSwwLDAsMywxLDEsMiwwLDAsMCwxLAoxLDAsMCwxLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjEsMSwxLDMsMywwLDMsMywzLDMsMywyLDIsMiwxLDIsMCwyLDEsMiwyLDEsMSwwLDEsMiwyLDIsMiwyLDIsMiwKMCwwLDIsMSwyLDEsMiwxLDAsMSwxLDMsMSwyLDEsMSwyLDAsMCwyLDAsMSwwLDEsMCwxLDAsMCwwLDEsMCwxLAozLDMsMywxLDMsMywzLDAsMSwxLDAsMiwyLDMsMSwwLDMsMCwwLDAsMSwwLDAsMCwxLDAsMCwxLDAsMSwwLDAsCjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDIsMCwwLDIsMiwxLDAsMCwxLDAsMCwzLDMsMSwzLDAsMCwxLDEsMCwyLDAsMywwLDAsMCwyLDAsMSwxLAowLDEsMiwwLDEsMiwyLDAsMiwyLDIsMiwxLDAsMiwxLDEsMCwyLDAsMiwxLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDEsMywyLDMsMiwwLDIsMiwyLDEsMywyLDAsMiwxLDIsMCwxLDIsMCwwLDEsMCwyLDIsMCwwLDAsMiwKMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwxLDAsMCwwLAozLDMsMywwLDMsMywxLDEsMiwzLDEsMCwzLDIsMywwLDMsMCwwLDAsMSwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsCjEsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMywzLDAsMywzLDIsMywzLDIsMiwwLDAsMCwwLDEsMiwwLDEsMywwLDAsMCwzLDEsMSwwLDMsMCwyLAoyLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDEsMiwyLDEsMCwzLDEsMSwxLDEsMywzLDIsMywwLDAsMSwwLDEsMiwwLDIsMiwwLDIsMiwwLDIsMSwKMCwyLDIsMSwxLDEsMSwwLDIsMSwxLDAsMSwxLDEsMSwyLDEsMiwxLDIsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLAozLDMsMywwLDEsMSwzLDAsMCwxLDEsMCwwLDIsMiwwLDMsMCwwLDEsMSwwLDEsMCwwLDAsMCwwLDIsMCwwLDAsCjAsMywxLDAsMSwwLDEsMCwyLDAsMCwxLDAsMSwwLDEsMSwxLDIsMSwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMCwyLDAsMiwwLDEsMSwxLDAsMCwzLDMsMCwyLDAsMCwxLDAsMCwyLDEsMSwwLDEsMCwxLDAsMSwwLAowLDIsMCwxLDIsMCwyLDAsMiwxLDEsMCwxLDAsMiwxLDEsMCwyLDEsMSwwLDEsMCwwLDAsMSwxLDAsMCwwLDAsCjMsMiwzLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwyLDAsMSwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMiwwLDAsMCwKMCwwLDEsMSwwLDAsMSwwLDEsMCwwLDEsMCwwLDAsMiwxLDAsMSwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywwLDAsMiwzLDAsMCwxLDAsMSwwLDIsMywyLDMsMCwwLDEsMywwLDIsMSwwLDAsMCwwLDIsMCwxLDAsCjAsMiwxLDAsMCwxLDEsMCwyLDEsMCwwLDEsMCwwLDEsMSwwLDEsMSwyLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwKMywyLDIsMCwwLDEsMSwwLDAsMCwwLDAsMCwzLDEsMSwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwyLDAsMSwwLAowLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDMsMywwLDIsMywyLDIsMSwyLDIsMSwxLDIsMCwxLDMsMiwyLDIsMCwwLDIsMiwwLDAsMCwxLDIsMSwKMywwLDIsMSwxLDAsMSwxLDEsMCwxLDIsMiwyLDEsMSwyLDAsMCwwLDAsMSwwLDEsMSwwLDAsMCwwLDAsMCwwLAowLDEsMSwyLDMsMCwzLDMsMywyLDIsMiwyLDEsMCwxLDAsMSwwLDEsMiwyLDAsMCwyLDIsMSwzLDEsMSwyLDEsCjAsMCwxLDEsMiwwLDEsMSwwLDAsMSwyLDAsMiwxLDEsMiwwLDAsMSwwLDAsMCwxLDAsMSwwLDEsMCwwLDAsMCwKMywzLDIsMCwwLDMsMSwwLDAsMCwwLDAsMCwzLDIsMSwyLDAsMCwxLDAsMCwyLDAsMCwwLDAsMCwyLDAsMSwwLAowLDIsMSwxLDAsMCwxLDAsMSwyLDAsMCwxLDEsMCwwLDIsMSwxLDEsMSwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywyLDAsMCwxLDAsMCwwLDAsMSwwLDAsMywzLDIsMiwwLDAsMSwwLDAsMiwwLDEsMCwwLDAsMiwwLDEsMCwKMCwwLDEsMSwwLDAsMiwwLDIsMSwwLDAsMSwxLDIsMSwyLDAsMiwxLDIsMSwxLDEsMCwwLDEsMSwwLDAsMCwwLAozLDMsMiwwLDAsMiwyLDAsMCwwLDEsMSwwLDIsMiwxLDMsMSwwLDEsMCwxLDIsMCwwLDAsMCwwLDEsMCwxLDAsCjAsMSwxLDAsMCwwLDAsMCwxLDAsMCwxLDAsMCwwLDEsMSwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMiwwLDAsMCwxLDAsMCwxLDAsMCwyLDMsMSwyLDAsMCwxLDAsMCwyLDAsMCwwLDEsMCwyLDAsMiwwLAowLDEsMSwyLDIsMSwyLDAsMiwxLDEsMCwwLDEsMSwwLDEsMSwxLDEsMiwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDAsMiwxLDIsMSwwLDAsMSwxLDAsMywzLDEsMiwwLDAsMSwwLDAsMiwwLDIsMCwxLDEsMiwwLDAsMCwKMCwwLDEsMSwxLDEsMiwwLDEsMSwwLDEsMSwxLDEsMCwwLDAsMSwxLDEsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLAozLDMsMywwLDIsMiwzLDIsMCwwLDEsMCwwLDIsMywxLDAsMCwwLDAsMCwwLDIsMCwyLDAsMCwwLDIsMCwwLDAsCjAsMSwxLDAsMCwwLDEsMCwwLDEsMCwxLDEsMCwxLDAsMSwxLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywyLDMsMCwwLDAsMCwwLDAsMCwxLDAsMCwyLDIsMiwyLDAsMCwxLDAsMCwyLDAsMCwwLDAsMCwyLDAsMSwwLAowLDAsMiwxLDEsMCwxLDAsMiwxLDEsMCwwLDEsMSwyLDEsMCwyLDAsMiwwLDEsMCwwLDAsMiwwLDAsMCwwLDAsCjAsMCwwLDIsMiwwLDIsMSwxLDEsMSwyLDIsMCwwLDEsMCwxLDAsMCwxLDMsMCwwLDAsMCwxLDAsMCwyLDEsMCwKMCwwLDEsMCwxLDAsMCwwLDAsMCwyLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLAoyLDAsMCwyLDMsMCwyLDMsMSwyLDIsMCwyLDAsMCwyLDAsMiwxLDEsMSwyLDEsMCwwLDEsMiwxLDEsMiwxLDAsCjEsMCwyLDAsMSwwLDEsMSwwLDAsMiwyLDEsMiwxLDEsMiwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMCwyLDEsMiwwLDAsMCwxLDAsMCwzLDIsMCwxLDAsMCwxLDAsMCwyLDAsMCwwLDEsMiwxLDAsMSwwLAowLDAsMCwwLDEsMCwxLDAsMCwxLDAsMCwwLDAsMSwwLDEsMCwxLDEsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDIsMiwwLDIsMiwxLDEsMCwxLDEsMSwxLDEsMCwwLDEsMiwxLDEsMSwwLDEsMCwwLDAsMSwxLDEsMSwKMCwwLDIsMSwwLDEsMSwxLDAsMSwxLDIsMSwyLDEsMSwyLDAsMSwxLDIsMSwwLDIsMCwwLDAsMCwwLDAsMCwwLAozLDIsMiwwLDAsMiwwLDAsMCwwLDAsMCwwLDIsMiwwLDIsMCwwLDEsMCwwLDIsMCwwLDAsMCwwLDIsMCwwLDAsCjAsMiwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMywyLDAsMiwyLDAsMSwxLDAsMSwwLDAsMSwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLAoyLDAsMSwwLDEsMCwxLDEsMCwwLDEsMiwwLDEsMCwxLDEsMCwwLDEsMCwxLDAsMiwwLDAsMCwwLDAsMCwwLDAsCjIsMiwyLDAsMSwxLDAsMCwwLDEsMCwwLDAsMSwyLDAsMSwwLDAsMSwwLDAsMSwwLDAsMCwwLDEsMiwwLDEsMCwKMCwwLDEsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsMSwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMiwyLDEsMCwxLDEsMSwwLDAsMCwwLDEsMiwwLDAsMSwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwKMSwxLDIsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDEsCjAsMCwxLDIsMiwwLDIsMSwyLDEsMSwyLDIsMCwwLDAsMCwxLDAsMCwxLDEsMCwwLDIsMCwwLDAsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAoyLDIsMiwwLDAsMCwxLDAsMCwwLDAsMCwwLDIsMiwxLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMiwyLDAsMSwwLDEsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCikKCkxhdGluNVR1cmtpc2hNb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiBMYXRpbjVfVHVya2lzaENoYXJUb09yZGVyTWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IFR1cmtpc2hMYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjk3MDI5MCwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IFRydWUsCiAgJ2NoYXJzZXRfbmFtZSc6ICJJU08tODg1OS05IiwKICAnbGFuZ3VhZ2UnOiAnVHVya2lzaCcsCn0KUEsDBBQAAAAAAAAAIQDk7PCk+hQAAPoUAAAzAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGF0aW4xcHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBVbml2ZXJzYWwgY2hhcnNldCBkZXRlY3RvciBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwMQojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIyAgIFNoeSBTaGFsb20gLSBvcmlnaW5hbCBDIGNvZGUKIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuY2hhcnNldHByb2JlciBpbXBvcnQgQ2hhclNldFByb2Jlcgpmcm9tIC5lbnVtcyBpbXBvcnQgUHJvYmluZ1N0YXRlCgpGUkVRX0NBVF9OVU0gPSA0CgpVREYgPSAwICAjIHVuZGVmaW5lZApPVEggPSAxICAjIG90aGVyCkFTQyA9IDIgICMgYXNjaWkgY2FwaXRhbCBsZXR0ZXIKQVNTID0gMyAgIyBhc2NpaSBzbWFsbCBsZXR0ZXIKQUNWID0gNCAgIyBhY2NlbnQgY2FwaXRhbCB2b3dlbApBQ08gPSA1ICAjIGFjY2VudCBjYXBpdGFsIG90aGVyCkFTViA9IDYgICMgYWNjZW50IHNtYWxsIHZvd2VsCkFTTyA9IDcgICMgYWNjZW50IHNtYWxsIG90aGVyCkNMQVNTX05VTSA9IDggICMgdG90YWwgY2xhc3NlcwoKTGF0aW4xX0NoYXJUb0NsYXNzID0gKAogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyAwMCAtIDA3CiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDA4IC0gMEYKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgMTAgLSAxNwogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyAxOCAtIDFGCiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDIwIC0gMjcKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgMjggLSAyRgogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyAzMCAtIDM3CiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDM4IC0gM0YKICAgIE9USCwgQVNDLCBBU0MsIEFTQywgQVNDLCBBU0MsIEFTQywgQVNDLCAgICMgNDAgLSA0NwogICAgQVNDLCBBU0MsIEFTQywgQVNDLCBBU0MsIEFTQywgQVNDLCBBU0MsICAgIyA0OCAtIDRGCiAgICBBU0MsIEFTQywgQVNDLCBBU0MsIEFTQywgQVNDLCBBU0MsIEFTQywgICAjIDUwIC0gNTcKICAgIEFTQywgQVNDLCBBU0MsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgNTggLSA1RgogICAgT1RILCBBU1MsIEFTUywgQVNTLCBBU1MsIEFTUywgQVNTLCBBU1MsICAgIyA2MCAtIDY3CiAgICBBU1MsIEFTUywgQVNTLCBBU1MsIEFTUywgQVNTLCBBU1MsIEFTUywgICAjIDY4IC0gNkYKICAgIEFTUywgQVNTLCBBU1MsIEFTUywgQVNTLCBBU1MsIEFTUywgQVNTLCAgICMgNzAgLSA3NwogICAgQVNTLCBBU1MsIEFTUywgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyA3OCAtIDdGCiAgICBPVEgsIFVERiwgT1RILCBBU08sIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDgwIC0gODcKICAgIE9USCwgT1RILCBBQ08sIE9USCwgQUNPLCBVREYsIEFDTywgVURGLCAgICMgODggLSA4RgogICAgVURGLCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyA5MCAtIDk3CiAgICBPVEgsIE9USCwgQVNPLCBPVEgsIEFTTywgVURGLCBBU08sIEFDTywgICAjIDk4IC0gOUYKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgQTAgLSBBNwogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyBBOCAtIEFGCiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIEIwIC0gQjcKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgQjggLSBCRgogICAgQUNWLCBBQ1YsIEFDViwgQUNWLCBBQ1YsIEFDViwgQUNPLCBBQ08sICAgIyBDMCAtIEM3CiAgICBBQ1YsIEFDViwgQUNWLCBBQ1YsIEFDViwgQUNWLCBBQ1YsIEFDViwgICAjIEM4IC0gQ0YKICAgIEFDTywgQUNPLCBBQ1YsIEFDViwgQUNWLCBBQ1YsIEFDViwgT1RILCAgICMgRDAgLSBENwogICAgQUNWLCBBQ1YsIEFDViwgQUNWLCBBQ1YsIEFDTywgQUNPLCBBQ08sICAgIyBEOCAtIERGCiAgICBBU1YsIEFTViwgQVNWLCBBU1YsIEFTViwgQVNWLCBBU08sIEFTTywgICAjIEUwIC0gRTcKICAgIEFTViwgQVNWLCBBU1YsIEFTViwgQVNWLCBBU1YsIEFTViwgQVNWLCAgICMgRTggLSBFRgogICAgQVNPLCBBU08sIEFTViwgQVNWLCBBU1YsIEFTViwgQVNWLCBPVEgsICAgIyBGMCAtIEY3CiAgICBBU1YsIEFTViwgQVNWLCBBU1YsIEFTViwgQVNPLCBBU08sIEFTTywgICAjIEY4IC0gRkYKKQoKIyAwIDogaWxsZWdhbAojIDEgOiB2ZXJ5IHVubGlrZWx5CiMgMiA6IG5vcm1hbAojIDMgOiB2ZXJ5IGxpa2VseQpMYXRpbjFDbGFzc01vZGVsID0gKAojIFVERiBPVEggQVNDIEFTUyBBQ1YgQUNPIEFTViBBU08KICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgIyBVREYKICAgIDAsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgIyBPVEgKICAgIDAsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgIyBBU0MKICAgIDAsICAzLCAgMywgIDMsICAxLCAgMSwgIDMsICAzLCAgIyBBU1MKICAgIDAsICAzLCAgMywgIDMsICAxLCAgMiwgIDEsICAyLCAgIyBBQ1YKICAgIDAsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgIyBBQ08KICAgIDAsICAzLCAgMSwgIDMsICAxLCAgMSwgIDEsICAzLCAgIyBBU1YKICAgIDAsICAzLCAgMSwgIDMsICAxLCAgMSwgIDMsICAzLCAgIyBBU08KKQoKCmNsYXNzIExhdGluMVByb2JlcihDaGFyU2V0UHJvYmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihMYXRpbjFQcm9iZXIsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLl9sYXN0X2NoYXJfY2xhc3MgPSBOb25lCiAgICAgICAgc2VsZi5fZnJlcV9jb3VudGVyID0gTm9uZQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLl9sYXN0X2NoYXJfY2xhc3MgPSBPVEgKICAgICAgICBzZWxmLl9mcmVxX2NvdW50ZXIgPSBbMF0gKiBGUkVRX0NBVF9OVU0KICAgICAgICBDaGFyU2V0UHJvYmVyLnJlc2V0KHNlbGYpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiSVNPLTg4NTktMSIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByZXR1cm4gIiIKCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0cik6CiAgICAgICAgYnl0ZV9zdHIgPSBzZWxmLmZpbHRlcl93aXRoX2VuZ2xpc2hfbGV0dGVycyhieXRlX3N0cikKICAgICAgICBmb3IgYyBpbiBieXRlX3N0cjoKICAgICAgICAgICAgY2hhcl9jbGFzcyA9IExhdGluMV9DaGFyVG9DbGFzc1tjXQogICAgICAgICAgICBmcmVxID0gTGF0aW4xQ2xhc3NNb2RlbFsoc2VsZi5fbGFzdF9jaGFyX2NsYXNzICogQ0xBU1NfTlVNKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNoYXJfY2xhc3NdCiAgICAgICAgICAgIGlmIGZyZXEgPT0gMDoKICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLk5PVF9NRQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgc2VsZi5fZnJlcV9jb3VudGVyW2ZyZXFdICs9IDEKICAgICAgICAgICAgc2VsZi5fbGFzdF9jaGFyX2NsYXNzID0gY2hhcl9jbGFzcwoKICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICBpZiBzZWxmLnN0YXRlID09IFByb2JpbmdTdGF0ZS5OT1RfTUU6CiAgICAgICAgICAgIHJldHVybiAwLjAxCgogICAgICAgIHRvdGFsID0gc3VtKHNlbGYuX2ZyZXFfY291bnRlcikKICAgICAgICBpZiB0b3RhbCA8IDAuMDE6CiAgICAgICAgICAgIGNvbmZpZGVuY2UgPSAwLjAKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb25maWRlbmNlID0gKChzZWxmLl9mcmVxX2NvdW50ZXJbM10gLSBzZWxmLl9mcmVxX2NvdW50ZXJbMV0gKiAyMC4wKQogICAgICAgICAgICAgICAgICAgICAgICAgIC8gdG90YWwpCiAgICAgICAgaWYgY29uZmlkZW5jZSA8IDAuMDoKICAgICAgICAgICAgY29uZmlkZW5jZSA9IDAuMAogICAgICAgICMgbG93ZXIgdGhlIGNvbmZpZGVuY2Ugb2YgbGF0aW4xIHNvIHRoYXQgb3RoZXIgbW9yZSBhY2N1cmF0ZQogICAgICAgICMgZGV0ZWN0b3IgY2FuIHRha2UgcHJpb3JpdHkuCiAgICAgICAgY29uZmlkZW5jZSA9IGNvbmZpZGVuY2UgKiAwLjczCiAgICAgICAgcmV0dXJuIGNvbmZpZGVuY2UKUEsDBBQAAAAAAAAAIQA2dRhNVQ0AAFUNAAA2AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbWJjaGFyc2V0cHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBVbml2ZXJzYWwgY2hhcnNldCBkZXRlY3RvciBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwMQojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIyAgIFNoeSBTaGFsb20gLSBvcmlnaW5hbCBDIGNvZGUKIyAgIFByb29mcG9pbnQsIEluYy4KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuY2hhcnNldHByb2JlciBpbXBvcnQgQ2hhclNldFByb2Jlcgpmcm9tIC5lbnVtcyBpbXBvcnQgUHJvYmluZ1N0YXRlLCBNYWNoaW5lU3RhdGUKCgpjbGFzcyBNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyKENoYXJTZXRQcm9iZXIpOgogICAgIiIiCiAgICBNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFuZ19maWx0ZXI9Tm9uZSk6CiAgICAgICAgc3VwZXIoTXVsdGlCeXRlQ2hhclNldFByb2Jlciwgc2VsZikuX19pbml0X18obGFuZ19maWx0ZXI9bGFuZ19maWx0ZXIpCiAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIgPSBOb25lCiAgICAgICAgc2VsZi5jb2Rpbmdfc20gPSBOb25lCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyID0gWzAsIDBdCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHN1cGVyKE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIsIHNlbGYpLnJlc2V0KCkKICAgICAgICBpZiBzZWxmLmNvZGluZ19zbToKICAgICAgICAgICAgc2VsZi5jb2Rpbmdfc20ucmVzZXQoKQogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyOgogICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplci5yZXNldCgpCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyID0gWzAsIDBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsYW5ndWFnZShzZWxmKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGZlZWQoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihieXRlX3N0cikpOgogICAgICAgICAgICBjb2Rpbmdfc3RhdGUgPSBzZWxmLmNvZGluZ19zbS5uZXh0X3N0YXRlKGJ5dGVfc3RyW2ldKQogICAgICAgICAgICBpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLkVSUk9SOgogICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJyVzICVzIHByb2JlciBoaXQgZXJyb3IgYXQgYnl0ZSAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoYXJzZXRfbmFtZSwgc2VsZi5sYW5ndWFnZSwgaSkKICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLk5PVF9NRQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLklUU19NRToKICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuU1RBUlQ6CiAgICAgICAgICAgICAgICBjaGFyX2xlbiA9IHNlbGYuY29kaW5nX3NtLmdldF9jdXJyZW50X2NoYXJsZW4oKQogICAgICAgICAgICAgICAgaWYgaSA9PSAwOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2xhc3RfY2hhclsxXSA9IGJ5dGVfc3RyWzBdCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIuZmVlZChzZWxmLl9sYXN0X2NoYXIsIGNoYXJfbGVuKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplci5mZWVkKGJ5dGVfc3RyW2kgLSAxOmkgKyAxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfbGVuKQoKICAgICAgICBzZWxmLl9sYXN0X2NoYXJbMF0gPSBieXRlX3N0clstMV0KCiAgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSBQcm9iaW5nU3RhdGUuREVURUNUSU5HOgogICAgICAgICAgICBpZiAoc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIuZ290X2Vub3VnaF9kYXRhKCkgYW5kCiAgICAgICAgICAgICAgICAgICAgKHNlbGYuZ2V0X2NvbmZpZGVuY2UoKSA+IHNlbGYuU0hPUlRDVVRfVEhSRVNIT0xEKSk6CiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5GT1VORF9JVAoKICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIuZ2V0X2NvbmZpZGVuY2UoKQpQSwMEFAAAAAAAAAAhAK3TEajcBwAA3AcAADYAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9tYmNzZ3JvdXBwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIFVuaXZlcnNhbCBjaGFyc2V0IGRldGVjdG9yIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDAxCiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojICAgU2h5IFNoYWxvbSAtIG9yaWdpbmFsIEMgY29kZQojICAgUHJvb2Zwb2ludCwgSW5jLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5jaGFyc2V0Z3JvdXBwcm9iZXIgaW1wb3J0IENoYXJTZXRHcm91cFByb2Jlcgpmcm9tIC51dGY4cHJvYmVyIGltcG9ydCBVVEY4UHJvYmVyCmZyb20gLnNqaXNwcm9iZXIgaW1wb3J0IFNKSVNQcm9iZXIKZnJvbSAuZXVjanBwcm9iZXIgaW1wb3J0IEVVQ0pQUHJvYmVyCmZyb20gLmdiMjMxMnByb2JlciBpbXBvcnQgR0IyMzEyUHJvYmVyCmZyb20gLmV1Y2tycHJvYmVyIGltcG9ydCBFVUNLUlByb2Jlcgpmcm9tIC5jcDk0OXByb2JlciBpbXBvcnQgQ1A5NDlQcm9iZXIKZnJvbSAuYmlnNXByb2JlciBpbXBvcnQgQmlnNVByb2Jlcgpmcm9tIC5ldWN0d3Byb2JlciBpbXBvcnQgRVVDVFdQcm9iZXIKCgpjbGFzcyBNQkNTR3JvdXBQcm9iZXIoQ2hhclNldEdyb3VwUHJvYmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYW5nX2ZpbHRlcj1Ob25lKToKICAgICAgICBzdXBlcihNQkNTR3JvdXBQcm9iZXIsIHNlbGYpLl9faW5pdF9fKGxhbmdfZmlsdGVyPWxhbmdfZmlsdGVyKQogICAgICAgIHNlbGYucHJvYmVycyA9IFsKICAgICAgICAgICAgVVRGOFByb2JlcigpLAogICAgICAgICAgICBTSklTUHJvYmVyKCksCiAgICAgICAgICAgIEVVQ0pQUHJvYmVyKCksCiAgICAgICAgICAgIEdCMjMxMlByb2JlcigpLAogICAgICAgICAgICBFVUNLUlByb2JlcigpLAogICAgICAgICAgICBDUDk0OVByb2JlcigpLAogICAgICAgICAgICBCaWc1UHJvYmVyKCksCiAgICAgICAgICAgIEVVQ1RXUHJvYmVyKCkKICAgICAgICBdCiAgICAgICAgc2VsZi5yZXNldCgpClBLAwQUAAAAAAAAACEAafbhD4ljAACJYwAALQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L21iY3NzbS5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5lbnVtcyBpbXBvcnQgTWFjaGluZVN0YXRlCgojIEJJRzUKCkJJRzVfQ0xTID0gKAogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAwMCAtIDA3ICAgICNhbGxvdyAweDAwIGFzIGxlZ2FsIHZhbHVlCiAgICAxLDEsMSwxLDEsMSwwLDAsICAjIDA4IC0gMGYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMTAgLSAxNwogICAgMSwxLDEsMCwxLDEsMSwxLCAgIyAxOCAtIDFmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDIwIC0gMjcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMjggLSAyZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAzMCAtIDM3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDM4IC0gM2YKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNDAgLSA0NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA0OCAtIDRmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDUwIC0gNTcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNTggLSA1ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA2MCAtIDY3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDY4IC0gNmYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNzAgLSA3NwogICAgMiwyLDIsMiwyLDIsMiwxLCAgIyA3OCAtIDdmCiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDgwIC0gODcKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgODggLSA4ZgogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA5MCAtIDk3CiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDk4IC0gOWYKICAgIDQsMywzLDMsMywzLDMsMywgICMgYTAgLSBhNwogICAgMywzLDMsMywzLDMsMywzLCAgIyBhOCAtIGFmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIGIwIC0gYjcKICAgIDMsMywzLDMsMywzLDMsMywgICMgYjggLSBiZgogICAgMywzLDMsMywzLDMsMywzLCAgIyBjMCAtIGM3CiAgICAzLDMsMywzLDMsMywzLDMsICAjIGM4IC0gY2YKICAgIDMsMywzLDMsMywzLDMsMywgICMgZDAgLSBkNwogICAgMywzLDMsMywzLDMsMywzLCAgIyBkOCAtIGRmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIGUwIC0gZTcKICAgIDMsMywzLDMsMywzLDMsMywgICMgZTggLSBlZgogICAgMywzLDMsMywzLDMsMywzLCAgIyBmMCAtIGY3CiAgICAzLDMsMywzLDMsMywzLDAgICMgZjggLSBmZgopCgpCSUc1X1NUID0gKAogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMDAtMDcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMDgtMGYKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQjMTAtMTcKKQoKQklHNV9DSEFSX0xFTl9UQUJMRSA9ICgwLCAxLCAxLCAyLCAwKQoKQklHNV9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBCSUc1X0NMUywKICAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogNSwKICAgICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBCSUc1X1NULAogICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IEJJRzVfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQmlnNSd9CgojIENQOTQ5CgpDUDk0OV9DTFMgID0gKAogICAgMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwwLDAsICAjIDAwIC0gMGYKICAgIDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMCwxLDEsMSwxLCAgIyAxMCAtIDFmCiAgICAxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDEsMSwgICMgMjAgLSAyZgogICAgMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwxLDEsICAjIDMwIC0gM2YKICAgIDEsNCw0LDQsNCw0LDQsNCwgNCw0LDQsNCw0LDQsNCw0LCAgIyA0MCAtIDRmCiAgICA0LDQsNSw1LDUsNSw1LDUsIDUsNSw1LDEsMSwxLDEsMSwgICMgNTAgLSA1ZgogICAgMSw1LDUsNSw1LDUsNSw1LCA1LDUsNSw1LDUsNSw1LDUsICAjIDYwIC0gNmYKICAgIDUsNSw1LDUsNSw1LDUsNSwgNSw1LDUsMSwxLDEsMSwxLCAgIyA3MCAtIDdmCiAgICAwLDYsNiw2LDYsNiw2LDYsIDYsNiw2LDYsNiw2LDYsNiwgICMgODAgLSA4ZgogICAgNiw2LDYsNiw2LDYsNiw2LCA2LDYsNiw2LDYsNiw2LDYsICAjIDkwIC0gOWYKICAgIDYsNyw3LDcsNyw3LDcsNywgNyw3LDcsNyw3LDgsOCw4LCAgIyBhMCAtIGFmCiAgICA3LDcsNyw3LDcsNyw3LDcsIDcsNyw3LDcsNyw3LDcsNywgICMgYjAgLSBiZgogICAgNyw3LDcsNyw3LDcsOSwyLCAyLDMsMiwyLDIsMiwyLDIsICAjIGMwIC0gY2YKICAgIDIsMiwyLDIsMiwyLDIsMiwgMiwyLDIsMiwyLDIsMiwyLCAgIyBkMCAtIGRmCiAgICAyLDIsMiwyLDIsMiwyLDIsIDIsMiwyLDIsMiwyLDIsMiwgICMgZTAgLSBlZgogICAgMiwyLDIsMiwyLDIsMiwyLCAyLDIsMiwyLDIsMiwyLDAsICAjIGYwIC0gZmYKKQoKQ1A5NDlfU1QgPSAoCiNjbHM9ICAgIDAgICAgICAxICAgICAgMiAgICAgIDMgICAgICA0ICAgICAgNSAgICAgIDYgICAgICA3ICAgICAgOCAgICAgIDkgICMgcHJldmlvdXMgc3RhdGUgPQogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCwgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsICAgICA0LCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsICAgICA2LCAjIE1hY2hpbmVTdGF0ZS5TVEFSVAogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAjIE1hY2hpbmVTdGF0ZS5FUlJPUgogICAgTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwgIyBNYWNoaW5lU3RhdGUuSVRTX01FCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsICMgMwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCAjIDQKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwgIyA1CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsICMgNgopCgpDUDk0OV9DSEFSX0xFTl9UQUJMRSA9ICgwLCAxLCAyLCAwLCAxLCAxLCAyLCAyLCAwLCAyKQoKQ1A5NDlfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogQ1A5NDlfQ0xTLAogICAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogMTAsCiAgICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IENQOTQ5X1NULAogICAgICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBDUDk0OV9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQ1A5NDknfQoKIyBFVUMtSlAKCkVVQ0pQX0NMUyA9ICgKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgMDAgLSAwNwogICAgNCw0LDQsNCw0LDQsNSw1LCAgIyAwOCAtIDBmCiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDEwIC0gMTcKICAgIDQsNCw0LDUsNCw0LDQsNCwgICMgMTggLSAxZgogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyAyMCAtIDI3CiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDI4IC0gMmYKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgMzAgLSAzNwogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyAzOCAtIDNmCiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDQwIC0gNDcKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgNDggLSA0ZgogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA1MCAtIDU3CiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDU4IC0gNWYKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgNjAgLSA2NwogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA2OCAtIDZmCiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDcwIC0gNzcKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgNzggLSA3ZgogICAgNSw1LDUsNSw1LDUsNSw1LCAgIyA4MCAtIDg3CiAgICA1LDUsNSw1LDUsNSwxLDMsICAjIDg4IC0gOGYKICAgIDUsNSw1LDUsNSw1LDUsNSwgICMgOTAgLSA5NwogICAgNSw1LDUsNSw1LDUsNSw1LCAgIyA5OCAtIDlmCiAgICA1LDIsMiwyLDIsMiwyLDIsICAjIGEwIC0gYTcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYTggLSBhZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBiMCAtIGI3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGI4IC0gYmYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYzAgLSBjNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBjOCAtIGNmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGQwIC0gZDcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgZDggLSBkZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBlMCAtIGU3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGU4IC0gZWYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZjAgLSBmNwogICAgMCwwLDAsMCwwLDAsMCw1ICAjIGY4IC0gZmYKKQoKRVVDSlBfU1QgPSAoCiAgICAgICAgICAzLCAgICAgNCwgICAgIDMsICAgICA1LE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMDAtMDcKICAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjMDgtMGYKICAgICBNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzEwLTE3CiAgICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMTgtMWYKICAgICAgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJUIzIwLTI3CikKCkVVQ0pQX0NIQVJfTEVOX1RBQkxFID0gKDIsIDIsIDIsIDMsIDEsIDApCgpFVUNKUF9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBFVUNKUF9DTFMsCiAgICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA2LAogICAgICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBFVUNKUF9TVCwKICAgICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogRVVDSlBfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICAgICduYW1lJzogJ0VVQy1KUCd9CgojIEVVQy1LUgoKRVVDS1JfQ0xTICA9ICgKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMDAgLSAwNwogICAgMSwxLDEsMSwxLDEsMCwwLCAgIyAwOCAtIDBmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDEwIC0gMTcKICAgIDEsMSwxLDAsMSwxLDEsMSwgICMgMTggLSAxZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAyMCAtIDI3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDI4IC0gMmYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMzAgLSAzNwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAzOCAtIDNmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDQwIC0gNDcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNDggLSA0ZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA1MCAtIDU3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDU4IC0gNWYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNjAgLSA2NwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA2OCAtIDZmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDcwIC0gNzcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNzggLSA3ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA4MCAtIDg3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDg4IC0gOGYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgOTAgLSA5NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA5OCAtIDlmCiAgICAwLDIsMiwyLDIsMiwyLDIsICAjIGEwIC0gYTcKICAgIDIsMiwyLDIsMiwzLDMsMywgICMgYTggLSBhZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBiMCAtIGI3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGI4IC0gYmYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYzAgLSBjNwogICAgMiwzLDIsMiwyLDIsMiwyLCAgIyBjOCAtIGNmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGQwIC0gZDcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgZDggLSBkZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBlMCAtIGU3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGU4IC0gZWYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgZjAgLSBmNwogICAgMiwyLDIsMiwyLDIsMiwwICAgIyBmOCAtIGZmCikKCkVVQ0tSX1NUID0gKAogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCwgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMDAtMDcKICAgIE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJUICMwOC0wZgopCgpFVUNLUl9DSEFSX0xFTl9UQUJMRSA9ICgwLCAxLCAyLCAwKQoKRVVDS1JfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogRVVDS1JfQ0xTLAogICAgICAgICAgICAgICAgJ2NsYXNzX2ZhY3Rvcic6IDQsCiAgICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBFVUNLUl9TVCwKICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IEVVQ0tSX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgJ25hbWUnOiAnRVVDLUtSJ30KCiMgRVVDLVRXCgpFVUNUV19DTFMgPSAoCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDAwIC0gMDcKICAgIDIsMiwyLDIsMiwyLDAsMCwgICMgMDggLSAwZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyAxMCAtIDE3CiAgICAyLDIsMiwwLDIsMiwyLDIsICAjIDE4IC0gMWYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgMjAgLSAyNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyAyOCAtIDJmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDMwIC0gMzcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgMzggLSAzZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA0MCAtIDQ3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDQ4IC0gNGYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNTAgLSA1NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA1OCAtIDVmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDYwIC0gNjcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNjggLSA2ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA3MCAtIDc3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDc4IC0gN2YKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgODAgLSA4NwogICAgMCwwLDAsMCwwLDAsNiwwLCAgIyA4OCAtIDhmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDkwIC0gOTcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgOTggLSA5ZgogICAgMCwzLDQsNCw0LDQsNCw0LCAgIyBhMCAtIGE3CiAgICA1LDUsMSwxLDEsMSwxLDEsICAjIGE4IC0gYWYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgYjAgLSBiNwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyBiOCAtIGJmCiAgICAxLDEsMywxLDMsMywzLDMsICAjIGMwIC0gYzcKICAgIDMsMywzLDMsMywzLDMsMywgICMgYzggLSBjZgogICAgMywzLDMsMywzLDMsMywzLCAgIyBkMCAtIGQ3CiAgICAzLDMsMywzLDMsMywzLDMsICAjIGQ4IC0gZGYKICAgIDMsMywzLDMsMywzLDMsMywgICMgZTAgLSBlNwogICAgMywzLDMsMywzLDMsMywzLCAgIyBlOCAtIGVmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIGYwIC0gZjcKICAgIDMsMywzLDMsMywzLDMsMCAgICMgZjggLSBmZgopCgpFVUNUV19TVCA9ICgKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULCAgICAgMywgICAgIDMsICAgICAzLCAgICAgNCxNYWNoaW5lU3RhdGUuRVJST1IsIzAwLTA3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIzA4LTBmCiAgICBNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsIzEwLTE3CiAgICBNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMxOC0xZgogICAgICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwjMjAtMjcKICAgIE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQgIzI4LTJmCikKCkVVQ1RXX0NIQVJfTEVOX1RBQkxFID0gKDAsIDAsIDEsIDIsIDIsIDIsIDMpCgpFVUNUV19TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBFVUNUV19DTFMsCiAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogNywKICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IEVVQ1RXX1NULAogICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogRVVDVFdfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICAnbmFtZSc6ICd4LWV1Yy10dyd9CgojIEdCMjMxMgoKR0IyMzEyX0NMUyA9ICgKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMDAgLSAwNwogICAgMSwxLDEsMSwxLDEsMCwwLCAgIyAwOCAtIDBmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDEwIC0gMTcKICAgIDEsMSwxLDAsMSwxLDEsMSwgICMgMTggLSAxZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAyMCAtIDI3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDI4IC0gMmYKICAgIDMsMywzLDMsMywzLDMsMywgICMgMzAgLSAzNwogICAgMywzLDEsMSwxLDEsMSwxLCAgIyAzOCAtIDNmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDQwIC0gNDcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNDggLSA0ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA1MCAtIDU3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDU4IC0gNWYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNjAgLSA2NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA2OCAtIDZmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDcwIC0gNzcKICAgIDIsMiwyLDIsMiwyLDIsNCwgICMgNzggLSA3ZgogICAgNSw2LDYsNiw2LDYsNiw2LCAgIyA4MCAtIDg3CiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIDg4IC0gOGYKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgOTAgLSA5NwogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyA5OCAtIDlmCiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGEwIC0gYTcKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgYTggLSBhZgogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBiMCAtIGI3CiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGI4IC0gYmYKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgYzAgLSBjNwogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBjOCAtIGNmCiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGQwIC0gZDcKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgZDggLSBkZgogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBlMCAtIGU3CiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGU4IC0gZWYKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgZjAgLSBmNwogICAgNiw2LDYsNiw2LDYsNiwwICAgIyBmOCAtIGZmCikKCkdCMjMxMl9TVCA9ICgKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCAgICAgMyxNYWNoaW5lU3RhdGUuRVJST1IsIzAwLTA3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIzA4LTBmCiAgICBNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsIzEwLTE3CiAgICAgICAgIDQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMxOC0xZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsIzIwLTI3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJUICMyOC0yZgopCgojIFRvIGJlIGFjY3VyYXRlLCB0aGUgbGVuZ3RoIG9mIGNsYXNzIDYgY2FuIGJlIGVpdGhlciAyIG9yIDQuCiMgQnV0IGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZGlzY3JpbWluYXRlIGJldHdlZW4gdGhlIHR3byBzaW5jZQojIGl0IGlzIHVzZWQgZm9yIGZyZXF1ZW5jeSBhbmFseXNpcyBvbmx5LCBhbmQgd2UgYXJlIHZhbGlkYXRpbmcKIyBlYWNoIGNvZGUgcmFuZ2UgdGhlcmUgYXMgd2VsbC4gU28gaXQgaXMgc2FmZSB0byBzZXQgaXQgdG8gYmUKIyAyIGhlcmUuCkdCMjMxMl9DSEFSX0xFTl9UQUJMRSA9ICgwLCAxLCAxLCAxLCAxLCAxLCAyKQoKR0IyMzEyX1NNX01PREVMID0geydjbGFzc190YWJsZSc6IEdCMjMxMl9DTFMsCiAgICAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogNywKICAgICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IEdCMjMxMl9TVCwKICAgICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IEdCMjMxMl9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0dCMjMxMid9CgojIFNoaWZ0X0pJUwoKU0pJU19DTFMgPSAoCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDAwIC0gMDcKICAgIDEsMSwxLDEsMSwxLDAsMCwgICMgMDggLSAwZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAxMCAtIDE3CiAgICAxLDEsMSwwLDEsMSwxLDEsICAjIDE4IC0gMWYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMjAgLSAyNwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAyOCAtIDJmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDMwIC0gMzcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMzggLSAzZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA0MCAtIDQ3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDQ4IC0gNGYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNTAgLSA1NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA1OCAtIDVmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDYwIC0gNjcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNjggLSA2ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA3MCAtIDc3CiAgICAyLDIsMiwyLDIsMiwyLDEsICAjIDc4IC0gN2YKICAgIDMsMywzLDMsMywyLDIsMywgICMgODAgLSA4NwogICAgMywzLDMsMywzLDMsMywzLCAgIyA4OCAtIDhmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIDkwIC0gOTcKICAgIDMsMywzLDMsMywzLDMsMywgICMgOTggLSA5ZgogICAgIzB4YTAgaXMgaWxsZWdhbCBpbiBzamlzIGVuY29kaW5nLCBidXQgc29tZSBwYWdlcyBkb2VzCiAgICAjY29udGFpbiBzdWNoIGJ5dGUuIFdlIG5lZWQgdG8gYmUgbW9yZSBlcnJvciBmb3JnaXZlbi4KICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYTAgLSBhNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBhOCAtIGFmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGIwIC0gYjcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYjggLSBiZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBjMCAtIGM3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGM4IC0gY2YKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgZDAgLSBkNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBkOCAtIGRmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIGUwIC0gZTcKICAgIDMsMywzLDMsMyw0LDQsNCwgICMgZTggLSBlZgogICAgMywzLDMsMywzLDMsMywzLCAgIyBmMCAtIGY3CiAgICAzLDMsMywzLDMsMCwwLDApICAjIGY4IC0gZmYKCgpTSklTX1NUID0gKAogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMDAtMDcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCMwOC0wZgogICAgTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJUICMxMC0xNwopCgpTSklTX0NIQVJfTEVOX1RBQkxFID0gKDAsIDEsIDEsIDIsIDAsIDApCgpTSklTX1NNX01PREVMID0geydjbGFzc190YWJsZSc6IFNKSVNfQ0xTLAogICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogNiwKICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogU0pJU19TVCwKICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogU0pJU19DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgJ25hbWUnOiAnU2hpZnRfSklTJ30KCiMgVUNTMi1CRQoKVUNTMkJFX0NMUyA9ICgKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgMDAgLSAwNwogICAgMCwwLDEsMCwwLDIsMCwwLCAgIyAwOCAtIDBmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDEwIC0gMTcKICAgIDAsMCwwLDMsMCwwLDAsMCwgICMgMTggLSAxZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyAyMCAtIDI3CiAgICAwLDMsMywzLDMsMywwLDAsICAjIDI4IC0gMmYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgMzAgLSAzNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyAzOCAtIDNmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDQwIC0gNDcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNDggLSA0ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA1MCAtIDU3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDU4IC0gNWYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNjAgLSA2NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA2OCAtIDZmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDcwIC0gNzcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNzggLSA3ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA4MCAtIDg3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDg4IC0gOGYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgOTAgLSA5NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA5OCAtIDlmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGEwIC0gYTcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYTggLSBhZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBiMCAtIGI3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGI4IC0gYmYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYzAgLSBjNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBjOCAtIGNmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGQwIC0gZDcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZDggLSBkZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBlMCAtIGU3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGU4IC0gZWYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZjAgLSBmNwogICAgMCwwLDAsMCwwLDAsNCw1ICAgIyBmOCAtIGZmCikKClVDUzJCRV9TVCAgPSAoCiAgICAgICAgICA1LCAgICAgNywgICAgIDcsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNCwgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMDAtMDcKICAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjMDgtMGYKICAgICBNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsICAgICA2LCAgICAgNiwgICAgIDYsICAgICA2LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzEwLTE3CiAgICAgICAgICA2LCAgICAgNiwgICAgIDYsICAgICA2LCAgICAgNixNYWNoaW5lU3RhdGUuSVRTX01FLCAgICAgNiwgICAgIDYsIzE4LTFmCiAgICAgICAgICA2LCAgICAgNiwgICAgIDYsICAgICA2LCAgICAgNSwgICAgIDcsICAgICA3LE1hY2hpbmVTdGF0ZS5FUlJPUiwjMjAtMjcKICAgICAgICAgIDUsICAgICA4LCAgICAgNiwgICAgIDYsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNiwgICAgIDYsICAgICA2LCMyOC0yZgogICAgICAgICAgNiwgICAgIDYsICAgICA2LCAgICAgNixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQgIzMwLTM3CikKClVDUzJCRV9DSEFSX0xFTl9UQUJMRSA9ICgyLCAyLCAyLCAwLCAyLCAyKQoKVUNTMkJFX1NNX01PREVMID0geydjbGFzc190YWJsZSc6IFVDUzJCRV9DTFMsCiAgICAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogNiwKICAgICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IFVDUzJCRV9TVCwKICAgICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IFVDUzJCRV9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICAgICduYW1lJzogJ1VURi0xNkJFJ30KCiMgVUNTMi1MRQoKVUNTMkxFX0NMUyA9ICgKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgMDAgLSAwNwogICAgMCwwLDEsMCwwLDIsMCwwLCAgIyAwOCAtIDBmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDEwIC0gMTcKICAgIDAsMCwwLDMsMCwwLDAsMCwgICMgMTggLSAxZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyAyMCAtIDI3CiAgICAwLDMsMywzLDMsMywwLDAsICAjIDI4IC0gMmYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgMzAgLSAzNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyAzOCAtIDNmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDQwIC0gNDcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNDggLSA0ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA1MCAtIDU3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDU4IC0gNWYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNjAgLSA2NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA2OCAtIDZmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDcwIC0gNzcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNzggLSA3ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA4MCAtIDg3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDg4IC0gOGYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgOTAgLSA5NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA5OCAtIDlmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGEwIC0gYTcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYTggLSBhZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBiMCAtIGI3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGI4IC0gYmYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYzAgLSBjNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBjOCAtIGNmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGQwIC0gZDcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZDggLSBkZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBlMCAtIGU3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGU4IC0gZWYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZjAgLSBmNwogICAgMCwwLDAsMCwwLDAsNCw1ICAgIyBmOCAtIGZmCikKClVDUzJMRV9TVCA9ICgKICAgICAgICAgIDYsICAgICA2LCAgICAgNywgICAgIDYsICAgICA0LCAgICAgMyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMwMC0wNwogICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCMwOC0wZgogICAgIE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwgICAgIDUsICAgICA1LCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsIzEwLTE3CiAgICAgICAgICA1LCAgICAgNSwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsICAgICA2LCAgICAgNiwjMTgtMWYKICAgICAgICAgIDcsICAgICA2LCAgICAgOCwgICAgIDgsICAgICA1LCAgICAgNSwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLCMyMC0yNwogICAgICAgICAgNSwgICAgIDUsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNSwgICAgIDUsIzI4LTJmCiAgICAgICAgICA1LCAgICAgNSwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCAjMzAtMzcKKQoKVUNTMkxFX0NIQVJfTEVOX1RBQkxFID0gKDIsIDIsIDIsIDIsIDIsIDIpCgpVQ1MyTEVfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogVUNTMkxFX0NMUywKICAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogNiwKICAgICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBVQ1MyTEVfU1QsCiAgICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogVUNTMkxFX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgICduYW1lJzogJ1VURi0xNkxFJ30KCiMgVVRGLTgKClVURjhfQ0xTID0gKAogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAwMCAtIDA3ICAjYWxsb3cgMHgwMCBhcyBhIGxlZ2FsIHZhbHVlCiAgICAxLDEsMSwxLDEsMSwwLDAsICAjIDA4IC0gMGYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMTAgLSAxNwogICAgMSwxLDEsMCwxLDEsMSwxLCAgIyAxOCAtIDFmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDIwIC0gMjcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMjggLSAyZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAzMCAtIDM3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDM4IC0gM2YKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNDAgLSA0NwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA0OCAtIDRmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDUwIC0gNTcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNTggLSA1ZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA2MCAtIDY3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDY4IC0gNmYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNzAgLSA3NwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA3OCAtIDdmCiAgICAyLDIsMiwyLDMsMywzLDMsICAjIDgwIC0gODcKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgODggLSA4ZgogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA5MCAtIDk3CiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDk4IC0gOWYKICAgIDUsNSw1LDUsNSw1LDUsNSwgICMgYTAgLSBhNwogICAgNSw1LDUsNSw1LDUsNSw1LCAgIyBhOCAtIGFmCiAgICA1LDUsNSw1LDUsNSw1LDUsICAjIGIwIC0gYjcKICAgIDUsNSw1LDUsNSw1LDUsNSwgICMgYjggLSBiZgogICAgMCwwLDYsNiw2LDYsNiw2LCAgIyBjMCAtIGM3CiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGM4IC0gY2YKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgZDAgLSBkNwogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBkOCAtIGRmCiAgICA3LDgsOCw4LDgsOCw4LDgsICAjIGUwIC0gZTcKICAgIDgsOCw4LDgsOCw5LDgsOCwgICMgZTggLSBlZgogICAgMTAsMTEsMTEsMTEsMTEsMTEsMTEsMTEsICAjIGYwIC0gZjcKICAgIDEyLDEzLDEzLDEzLDE0LDE1LDAsMCAgICAjIGY4IC0gZmYKKQoKVVRGOF9TVCA9ICgKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgMTIsICAgMTAsIzAwLTA3CiAgICAgICAgIDksICAgICAxMSwgICAgIDgsICAgICA3LCAgICAgNiwgICAgIDUsICAgICA0LCAgICAzLCMwOC0wZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMTAtMTcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzE4LTFmCiAgICBNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIzIwLTI3CiAgICBNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIzI4LTJmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNSwgICAgIDUsICAgICA1LCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMzMC0zNwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMzgtM2YKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNSwgICAgIDUsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzQwLTQ3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM0OC00ZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDcsICAgICA3LCAgICAgNywgICAgIDcsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjNTAtNTcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzU4LTVmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA3LCAgICAgNyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM2MC02NwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjNjgtNmYKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA5LCAgICAgOSwgICAgIDksICAgICA5LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzcwLTc3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM3OC03ZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDksTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjODAtODcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzg4LThmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAxMiwgICAgMTIsICAgIDEyLCAgICAxMixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM5MC05NwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjOTgtOWYKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgIDEyLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsI2EwLWE3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCNhOC1hZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgMTIsICAgIDEyLCAgICAxMixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjYjAtYjcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsI2I4LWJmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCNjMC1jNwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiAjYzgtY2YKKQoKVVRGOF9DSEFSX0xFTl9UQUJMRSA9ICgwLCAxLCAwLCAwLCAwLCAwLCAyLCAzLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2KQoKVVRGOF9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBVVEY4X0NMUywKICAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogMTYsCiAgICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogVVRGOF9TVCwKICAgICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBVVEY4X0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgICduYW1lJzogJ1VURi04J30KUEsDBBQAAAAAAAAAIQAede8eGRYAABkWAAA2AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvc2JjaGFyc2V0cHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBVbml2ZXJzYWwgY2hhcnNldCBkZXRlY3RvciBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwMQojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIyAgIFNoeSBTaGFsb20gLSBvcmlnaW5hbCBDIGNvZGUKIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuY2hhcnNldHByb2JlciBpbXBvcnQgQ2hhclNldFByb2Jlcgpmcm9tIC5lbnVtcyBpbXBvcnQgQ2hhcmFjdGVyQ2F0ZWdvcnksIFByb2JpbmdTdGF0ZSwgU2VxdWVuY2VMaWtlbGlob29kCgoKY2xhc3MgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoQ2hhclNldFByb2Jlcik6CiAgICBTQU1QTEVfU0laRSA9IDY0CiAgICBTQl9FTk9VR0hfUkVMX1RIUkVTSE9MRCA9IDEwMjQgICMgIDAuMjUgKiBTQU1QTEVfU0laRV4yCiAgICBQT1NJVElWRV9TSE9SVENVVF9USFJFU0hPTEQgPSAwLjk1CiAgICBORUdBVElWRV9TSE9SVENVVF9USFJFU0hPTEQgPSAwLjA1CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZGVsLCByZXZlcnNlZD1GYWxzZSwgbmFtZV9wcm9iZXI9Tm9uZSk6CiAgICAgICAgc3VwZXIoU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLl9tb2RlbCA9IG1vZGVsCiAgICAgICAgIyBUUlVFIGlmIHdlIG5lZWQgdG8gcmV2ZXJzZSBldmVyeSBwYWlyIGluIHRoZSBtb2RlbCBsb29rdXAKICAgICAgICBzZWxmLl9yZXZlcnNlZCA9IHJldmVyc2VkCiAgICAgICAgIyBPcHRpb25hbCBhdXhpbGlhcnkgcHJvYmVyIGZvciBuYW1lIGRlY2lzaW9uCiAgICAgICAgc2VsZi5fbmFtZV9wcm9iZXIgPSBuYW1lX3Byb2JlcgogICAgICAgIHNlbGYuX2xhc3Rfb3JkZXIgPSBOb25lCiAgICAgICAgc2VsZi5fc2VxX2NvdW50ZXJzID0gTm9uZQogICAgICAgIHNlbGYuX3RvdGFsX3NlcXMgPSBOb25lCiAgICAgICAgc2VsZi5fdG90YWxfY2hhciA9IE5vbmUKICAgICAgICBzZWxmLl9mcmVxX2NoYXIgPSBOb25lCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHN1cGVyKFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyLCBzZWxmKS5yZXNldCgpCiAgICAgICAgIyBjaGFyIG9yZGVyIG9mIGxhc3QgY2hhcmFjdGVyCiAgICAgICAgc2VsZi5fbGFzdF9vcmRlciA9IDI1NQogICAgICAgIHNlbGYuX3NlcV9jb3VudGVycyA9IFswXSAqIFNlcXVlbmNlTGlrZWxpaG9vZC5nZXRfbnVtX2NhdGVnb3JpZXMoKQogICAgICAgIHNlbGYuX3RvdGFsX3NlcXMgPSAwCiAgICAgICAgc2VsZi5fdG90YWxfY2hhciA9IDAKICAgICAgICAjIGNoYXJhY3RlcnMgdGhhdCBmYWxsIGluIG91ciBzYW1wbGluZyByYW5nZQogICAgICAgIHNlbGYuX2ZyZXFfY2hhciA9IDAKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbmFtZV9wcm9iZXI6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9uYW1lX3Byb2Jlci5jaGFyc2V0X25hbWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fbW9kZWxbJ2NoYXJzZXRfbmFtZSddCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbmFtZV9wcm9iZXI6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9uYW1lX3Byb2Jlci5sYW5ndWFnZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9tb2RlbC5nZXQoJ2xhbmd1YWdlJykKCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0cik6CiAgICAgICAgaWYgbm90IHNlbGYuX21vZGVsWydrZWVwX2VuZ2xpc2hfbGV0dGVyJ106CiAgICAgICAgICAgIGJ5dGVfc3RyID0gc2VsZi5maWx0ZXJfaW50ZXJuYXRpb25hbF93b3JkcyhieXRlX3N0cikKICAgICAgICBpZiBub3QgYnl0ZV9zdHI6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnN0YXRlCiAgICAgICAgY2hhcl90b19vcmRlcl9tYXAgPSBzZWxmLl9tb2RlbFsnY2hhcl90b19vcmRlcl9tYXAnXQogICAgICAgIGZvciBpLCBjIGluIGVudW1lcmF0ZShieXRlX3N0cik6CiAgICAgICAgICAgICMgWFhYOiBPcmRlciBpcyBpbiByYW5nZSAxLTY0LCBzbyBvbmUgd291bGQgdGhpbmsgd2Ugd2FudCAwLTYzIGhlcmUsCiAgICAgICAgICAgICMgICAgICBidXQgdGhhdCBsZWFkcyB0byAyNyBtb3JlIHRlc3QgZmFpbHVyZXMgdGhhbiBiZWZvcmUuCiAgICAgICAgICAgIG9yZGVyID0gY2hhcl90b19vcmRlcl9tYXBbY10KICAgICAgICAgICAgIyBYWFg6IFRoaXMgd2FzIFNZTUJPTF9DQVRfT1JERVIgYmVmb3JlLCB3aXRoIGEgdmFsdWUgb2YgMjUwLCBidXQKICAgICAgICAgICAgIyAgICAgIENoYXJhY3RlckNhdGVnb3J5LlNZTUJPTCBpcyBhY3R1YWxseSAyNTMsIHNvIHdlIHVzZSBDT05UUk9MCiAgICAgICAgICAgICMgICAgICB0byBtYWtlIGl0IGNsb3NlciB0byB0aGUgb3JpZ2luYWwgaW50ZW50LiBUaGUgb25seSBkaWZmZXJlbmNlCiAgICAgICAgICAgICMgICAgICBpcyB3aGV0aGVyIG9yIG5vdCB3ZSBjb3VudCBkaWdpdHMgYW5kIGNvbnRyb2wgY2hhcmFjdGVycyBmb3IKICAgICAgICAgICAgIyAgICAgIF90b3RhbF9jaGFyIHB1cnBvc2VzLgogICAgICAgICAgICBpZiBvcmRlciA8IENoYXJhY3RlckNhdGVnb3J5LkNPTlRST0w6CiAgICAgICAgICAgICAgICBzZWxmLl90b3RhbF9jaGFyICs9IDEKICAgICAgICAgICAgaWYgb3JkZXIgPCBzZWxmLlNBTVBMRV9TSVpFOgogICAgICAgICAgICAgICAgc2VsZi5fZnJlcV9jaGFyICs9IDEKICAgICAgICAgICAgICAgIGlmIHNlbGYuX2xhc3Rfb3JkZXIgPCBzZWxmLlNBTVBMRV9TSVpFOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX3RvdGFsX3NlcXMgKz0gMQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9yZXZlcnNlZDoKICAgICAgICAgICAgICAgICAgICAgICAgaSA9IChzZWxmLl9sYXN0X29yZGVyICogc2VsZi5TQU1QTEVfU0laRSkgKyBvcmRlcgogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IHNlbGYuX21vZGVsWydwcmVjZWRlbmNlX21hdHJpeCddW2ldCiAgICAgICAgICAgICAgICAgICAgZWxzZTogICMgcmV2ZXJzZSB0aGUgb3JkZXIgb2YgdGhlIGxldHRlcnMgaW4gdGhlIGxvb2t1cAogICAgICAgICAgICAgICAgICAgICAgICBpID0gKG9yZGVyICogc2VsZi5TQU1QTEVfU0laRSkgKyBzZWxmLl9sYXN0X29yZGVyCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gc2VsZi5fbW9kZWxbJ3ByZWNlZGVuY2VfbWF0cml4J11baV0KICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZXFfY291bnRlcnNbbW9kZWxdICs9IDEKICAgICAgICAgICAgc2VsZi5fbGFzdF9vcmRlciA9IG9yZGVyCgogICAgICAgIGNoYXJzZXRfbmFtZSA9IHNlbGYuX21vZGVsWydjaGFyc2V0X25hbWUnXQogICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gUHJvYmluZ1N0YXRlLkRFVEVDVElORzoKICAgICAgICAgICAgaWYgc2VsZi5fdG90YWxfc2VxcyA+IHNlbGYuU0JfRU5PVUdIX1JFTF9USFJFU0hPTEQ6CiAgICAgICAgICAgICAgICBjb25maWRlbmNlID0gc2VsZi5nZXRfY29uZmlkZW5jZSgpCiAgICAgICAgICAgICAgICBpZiBjb25maWRlbmNlID4gc2VsZi5QT1NJVElWRV9TSE9SVENVVF9USFJFU0hPTEQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJyVzIGNvbmZpZGVuY2UgPSAlcywgd2UgaGF2ZSBhIHdpbm5lcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldF9uYW1lLCBjb25maWRlbmNlKQogICAgICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUCiAgICAgICAgICAgICAgICBlbGlmIGNvbmZpZGVuY2UgPCBzZWxmLk5FR0FUSVZFX1NIT1JUQ1VUX1RIUkVTSE9MRDoKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnJXMgY29uZmlkZW5jZSA9ICVzLCBiZWxvdyBuZWdhdGl2ZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Nob3J0Y3V0IHRocmVzaGhvbGQgJXMnLCBjaGFyc2V0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlkZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk5FR0FUSVZFX1NIT1JUQ1VUX1RIUkVTSE9MRCkKICAgICAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5OT1RfTUUKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKCiAgICBkZWYgZ2V0X2NvbmZpZGVuY2Uoc2VsZik6CiAgICAgICAgciA9IDAuMDEKICAgICAgICBpZiBzZWxmLl90b3RhbF9zZXFzID4gMDoKICAgICAgICAgICAgciA9ICgoMS4wICogc2VsZi5fc2VxX2NvdW50ZXJzW1NlcXVlbmNlTGlrZWxpaG9vZC5QT1NJVElWRV0pIC8KICAgICAgICAgICAgICAgICBzZWxmLl90b3RhbF9zZXFzIC8gc2VsZi5fbW9kZWxbJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nXSkKICAgICAgICAgICAgciA9IHIgKiBzZWxmLl9mcmVxX2NoYXIgLyBzZWxmLl90b3RhbF9jaGFyCiAgICAgICAgICAgIGlmIHIgPj0gMS4wOgogICAgICAgICAgICAgICAgciA9IDAuOTkKICAgICAgICByZXR1cm4gcgpQSwMEFAAAAAAAAAAhAIr+T6DaDQAA2g0AADYAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9zYmNzZ3JvdXBwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIFVuaXZlcnNhbCBjaGFyc2V0IGRldGVjdG9yIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDAxCiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojICAgU2h5IFNoYWxvbSAtIG9yaWdpbmFsIEMgY29kZQojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5jaGFyc2V0Z3JvdXBwcm9iZXIgaW1wb3J0IENoYXJTZXRHcm91cFByb2Jlcgpmcm9tIC5zYmNoYXJzZXRwcm9iZXIgaW1wb3J0IFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyCmZyb20gLmxhbmdjeXJpbGxpY21vZGVsIGltcG9ydCAoV2luMTI1MUN5cmlsbGljTW9kZWwsIEtvaThyTW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF0aW41Q3lyaWxsaWNNb2RlbCwgTWFjQ3lyaWxsaWNNb2RlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJYm04NjZNb2RlbCwgSWJtODU1TW9kZWwpCmZyb20gLmxhbmdncmVla21vZGVsIGltcG9ydCBMYXRpbjdHcmVla01vZGVsLCBXaW4xMjUzR3JlZWtNb2RlbApmcm9tIC5sYW5nYnVsZ2FyaWFubW9kZWwgaW1wb3J0IExhdGluNUJ1bGdhcmlhbk1vZGVsLCBXaW4xMjUxQnVsZ2FyaWFuTW9kZWwKIyBmcm9tIC5sYW5naHVuZ2FyaWFubW9kZWwgaW1wb3J0IExhdGluMkh1bmdhcmlhbk1vZGVsLCBXaW4xMjUwSHVuZ2FyaWFuTW9kZWwKZnJvbSAubGFuZ3RoYWltb2RlbCBpbXBvcnQgVElTNjIwVGhhaU1vZGVsCmZyb20gLmxhbmdoZWJyZXdtb2RlbCBpbXBvcnQgV2luMTI1NUhlYnJld01vZGVsCmZyb20gLmhlYnJld3Byb2JlciBpbXBvcnQgSGVicmV3UHJvYmVyCmZyb20gLmxhbmd0dXJraXNobW9kZWwgaW1wb3J0IExhdGluNVR1cmtpc2hNb2RlbAoKCmNsYXNzIFNCQ1NHcm91cFByb2JlcihDaGFyU2V0R3JvdXBQcm9iZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKFNCQ1NHcm91cFByb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYucHJvYmVycyA9IFsKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoV2luMTI1MUN5cmlsbGljTW9kZWwpLAogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihLb2k4ck1vZGVsKSwKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoTGF0aW41Q3lyaWxsaWNNb2RlbCksCiAgICAgICAgICAgIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKE1hY0N5cmlsbGljTW9kZWwpLAogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihJYm04NjZNb2RlbCksCiAgICAgICAgICAgIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKElibTg1NU1vZGVsKSwKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoTGF0aW43R3JlZWtNb2RlbCksCiAgICAgICAgICAgIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKFdpbjEyNTNHcmVla01vZGVsKSwKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoTGF0aW41QnVsZ2FyaWFuTW9kZWwpLAogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihXaW4xMjUxQnVsZ2FyaWFuTW9kZWwpLAogICAgICAgICAgICAjIFRPRE86IFJlc3RvcmUgSHVuZ2FyaWFuIGVuY29kaW5ncyAoaXNvLTg4NTktMiBhbmQgd2luZG93cy0xMjUwKQogICAgICAgICAgICAjICAgICAgIGFmdGVyIHdlIHJldHJhaW4gbW9kZWwuCiAgICAgICAgICAgICMgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoTGF0aW4ySHVuZ2FyaWFuTW9kZWwpLAogICAgICAgICAgICAjIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKFdpbjEyNTBIdW5nYXJpYW5Nb2RlbCksCiAgICAgICAgICAgIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKFRJUzYyMFRoYWlNb2RlbCksCiAgICAgICAgICAgIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKExhdGluNVR1cmtpc2hNb2RlbCksCiAgICAgICAgXQogICAgICAgIGhlYnJld19wcm9iZXIgPSBIZWJyZXdQcm9iZXIoKQogICAgICAgIGxvZ2ljYWxfaGVicmV3X3Byb2JlciA9IFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKFdpbjEyNTVIZWJyZXdNb2RlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWxzZSwgaGVicmV3X3Byb2JlcikKICAgICAgICB2aXN1YWxfaGVicmV3X3Byb2JlciA9IFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKFdpbjEyNTVIZWJyZXdNb2RlbCwgVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYnJld19wcm9iZXIpCiAgICAgICAgaGVicmV3X3Byb2Jlci5zZXRfbW9kZWxfcHJvYmVycyhsb2dpY2FsX2hlYnJld19wcm9iZXIsIHZpc3VhbF9oZWJyZXdfcHJvYmVyKQogICAgICAgIHNlbGYucHJvYmVycy5leHRlbmQoW2hlYnJld19wcm9iZXIsIGxvZ2ljYWxfaGVicmV3X3Byb2JlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXN1YWxfaGVicmV3X3Byb2Jlcl0pCgogICAgICAgIHNlbGYucmVzZXQoKQpQSwMEFAAAAAAAAAAhANaRZzK+DgAAvg4AADEAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9zamlzcHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxsYS5vcmcgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLm1iY2hhcnNldHByb2JlciBpbXBvcnQgTXVsdGlCeXRlQ2hhclNldFByb2Jlcgpmcm9tIC5jb2RpbmdzdGF0ZW1hY2hpbmUgaW1wb3J0IENvZGluZ1N0YXRlTWFjaGluZQpmcm9tIC5jaGFyZGlzdHJpYnV0aW9uIGltcG9ydCBTSklTRGlzdHJpYnV0aW9uQW5hbHlzaXMKZnJvbSAuanBjbnR4IGltcG9ydCBTSklTQ29udGV4dEFuYWx5c2lzCmZyb20gLm1iY3NzbSBpbXBvcnQgU0pJU19TTV9NT0RFTApmcm9tIC5lbnVtcyBpbXBvcnQgUHJvYmluZ1N0YXRlLCBNYWNoaW5lU3RhdGUKCgpjbGFzcyBTSklTUHJvYmVyKE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKFNKSVNQcm9iZXIsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvZGluZ19zbSA9IENvZGluZ1N0YXRlTWFjaGluZShTSklTX1NNX01PREVMKQogICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyID0gU0pJU0Rpc3RyaWJ1dGlvbkFuYWx5c2lzKCkKICAgICAgICBzZWxmLmNvbnRleHRfYW5hbHl6ZXIgPSBTSklTQ29udGV4dEFuYWx5c2lzKCkKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc3VwZXIoU0pJU1Byb2Jlciwgc2VsZikucmVzZXQoKQogICAgICAgIHNlbGYuY29udGV4dF9hbmFseXplci5yZXNldCgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmNvbnRleHRfYW5hbHl6ZXIuY2hhcnNldF9uYW1lCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgcmV0dXJuICJKYXBhbmVzZSIKCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0cik6CiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGJ5dGVfc3RyKSk6CiAgICAgICAgICAgIGNvZGluZ19zdGF0ZSA9IHNlbGYuY29kaW5nX3NtLm5leHRfc3RhdGUoYnl0ZV9zdHJbaV0pCiAgICAgICAgICAgIGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuRVJST1I6CiAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnJXMgJXMgcHJvYmVyIGhpdCBlcnJvciBhdCBieXRlICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hhcnNldF9uYW1lLCBzZWxmLmxhbmd1YWdlLCBpKQogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuTk9UX01FCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuSVRTX01FOgogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5TVEFSVDoKICAgICAgICAgICAgICAgIGNoYXJfbGVuID0gc2VsZi5jb2Rpbmdfc20uZ2V0X2N1cnJlbnRfY2hhcmxlbigpCiAgICAgICAgICAgICAgICBpZiBpID09IDA6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbGFzdF9jaGFyWzFdID0gYnl0ZV9zdHJbMF0KICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHRfYW5hbHl6ZXIuZmVlZChzZWxmLl9sYXN0X2NoYXJbMiAtIGNoYXJfbGVuOl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9sZW4pCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIuZmVlZChzZWxmLl9sYXN0X2NoYXIsIGNoYXJfbGVuKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHRfYW5hbHl6ZXIuZmVlZChieXRlX3N0cltpICsgMSAtIGNoYXJfbGVuOmkgKyAzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBjaGFyX2xlbl0sIGNoYXJfbGVuKQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyLmZlZWQoYnl0ZV9zdHJbaSAtIDE6aSArIDFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9sZW4pCgogICAgICAgIHNlbGYuX2xhc3RfY2hhclswXSA9IGJ5dGVfc3RyWy0xXQoKICAgICAgICBpZiBzZWxmLnN0YXRlID09IFByb2JpbmdTdGF0ZS5ERVRFQ1RJTkc6CiAgICAgICAgICAgIGlmIChzZWxmLmNvbnRleHRfYW5hbHl6ZXIuZ290X2Vub3VnaF9kYXRhKCkgYW5kCiAgICAgICAgICAgICAgIChzZWxmLmdldF9jb25maWRlbmNlKCkgPiBzZWxmLlNIT1JUQ1VUX1RIUkVTSE9MRCkpOgogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKCiAgICBkZWYgZ2V0X2NvbmZpZGVuY2Uoc2VsZik6CiAgICAgICAgY29udGV4dF9jb25mID0gc2VsZi5jb250ZXh0X2FuYWx5emVyLmdldF9jb25maWRlbmNlKCkKICAgICAgICBkaXN0cmliX2NvbmYgPSBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplci5nZXRfY29uZmlkZW5jZSgpCiAgICAgICAgcmV0dXJuIG1heChjb250ZXh0X2NvbmYsIGRpc3RyaWJfY29uZikKUEsDBBQAAAAAAAAAIQB1gEc9xTAAAMUwAAA4AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvdW5pdmVyc2FsZGV0ZWN0b3IucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIFVuaXZlcnNhbCBjaGFyc2V0IGRldGVjdG9yIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDAxCiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojICAgU2h5IFNoYWxvbSAtIG9yaWdpbmFsIEMgY29kZQojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiIiIgpNb2R1bGUgY29udGFpbmluZyB0aGUgVW5pdmVyc2FsRGV0ZWN0b3IgZGV0ZWN0b3IgY2xhc3MsIHdoaWNoIGlzIHRoZSBwcmltYXJ5CmNsYXNzIGEgdXNlciBvZiBgYGNoYXJkZXRgYCBzaG91bGQgdXNlLgoKOmF1dGhvcjogTWFyayBQaWxncmltIChpbml0aWFsIHBvcnQgdG8gUHl0aG9uKQo6YXV0aG9yOiBTaHkgU2hhbG9tIChvcmlnaW5hbCBDIGNvZGUpCjphdXRob3I6IERhbiBCbGFuY2hhcmQgKG1ham9yIHJlZmFjdG9yaW5nIGZvciAzLjApCjphdXRob3I6IElhbiBDb3JkYXNjbwoiIiIKCgppbXBvcnQgY29kZWNzCmltcG9ydCBsb2dnaW5nCmltcG9ydCByZQoKZnJvbSAuY2hhcnNldGdyb3VwcHJvYmVyIGltcG9ydCBDaGFyU2V0R3JvdXBQcm9iZXIKZnJvbSAuZW51bXMgaW1wb3J0IElucHV0U3RhdGUsIExhbmd1YWdlRmlsdGVyLCBQcm9iaW5nU3RhdGUKZnJvbSAuZXNjcHJvYmVyIGltcG9ydCBFc2NDaGFyU2V0UHJvYmVyCmZyb20gLmxhdGluMXByb2JlciBpbXBvcnQgTGF0aW4xUHJvYmVyCmZyb20gLm1iY3Nncm91cHByb2JlciBpbXBvcnQgTUJDU0dyb3VwUHJvYmVyCmZyb20gLnNiY3Nncm91cHByb2JlciBpbXBvcnQgU0JDU0dyb3VwUHJvYmVyCgoKY2xhc3MgVW5pdmVyc2FsRGV0ZWN0b3Iob2JqZWN0KToKICAgICIiIgogICAgVGhlIGBgVW5pdmVyc2FsRGV0ZWN0b3JgYCBjbGFzcyB1bmRlcmxpZXMgdGhlIGBgY2hhcmRldC5kZXRlY3RgYCBmdW5jdGlvbgogICAgYW5kIGNvb3JkaW5hdGVzIGFsbCBvZiB0aGUgZGlmZmVyZW50IGNoYXJzZXQgcHJvYmVycy4KCiAgICBUbyBnZXQgYSBgYGRpY3RgYCBjb250YWluaW5nIGFuIGVuY29kaW5nIGFuZCBpdHMgY29uZmlkZW5jZSwgeW91IGNhbiBzaW1wbHkKICAgIHJ1bjoKCiAgICAuLiBjb2RlOjoKCiAgICAgICAgICAgIHUgPSBVbml2ZXJzYWxEZXRlY3RvcigpCiAgICAgICAgICAgIHUuZmVlZChzb21lX2J5dGVzKQogICAgICAgICAgICB1LmNsb3NlKCkKICAgICAgICAgICAgZGV0ZWN0ZWQgPSB1LnJlc3VsdAoKICAgICIiIgoKICAgIE1JTklNVU1fVEhSRVNIT0xEID0gMC4yMAogICAgSElHSF9CWVRFX0RFVEVDVE9SID0gcmUuY29tcGlsZShiJ1tceDgwLVx4RkZdJykKICAgIEVTQ19ERVRFQ1RPUiA9IHJlLmNvbXBpbGUoYicoXDAzM3x+eyknKQogICAgV0lOX0JZVEVfREVURUNUT1IgPSByZS5jb21waWxlKGInW1x4ODAtXHg5Rl0nKQogICAgSVNPX1dJTl9NQVAgPSB7J2lzby04ODU5LTEnOiAnV2luZG93cy0xMjUyJywKICAgICAgICAgICAgICAgICAgICdpc28tODg1OS0yJzogJ1dpbmRvd3MtMTI1MCcsCiAgICAgICAgICAgICAgICAgICAnaXNvLTg4NTktNSc6ICdXaW5kb3dzLTEyNTEnLAogICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTYnOiAnV2luZG93cy0xMjU2JywKICAgICAgICAgICAgICAgICAgICdpc28tODg1OS03JzogJ1dpbmRvd3MtMTI1MycsCiAgICAgICAgICAgICAgICAgICAnaXNvLTg4NTktOCc6ICdXaW5kb3dzLTEyNTUnLAogICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTknOiAnV2luZG93cy0xMjU0JywKICAgICAgICAgICAgICAgICAgICdpc28tODg1OS0xMyc6ICdXaW5kb3dzLTEyNTcnfQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYW5nX2ZpbHRlcj1MYW5ndWFnZUZpbHRlci5BTEwpOgogICAgICAgIHNlbGYuX2VzY19jaGFyc2V0X3Byb2JlciA9IE5vbmUKICAgICAgICBzZWxmLl9jaGFyc2V0X3Byb2JlcnMgPSBbXQogICAgICAgIHNlbGYucmVzdWx0ID0gTm9uZQogICAgICAgIHNlbGYuZG9uZSA9IE5vbmUKICAgICAgICBzZWxmLl9nb3RfZGF0YSA9IE5vbmUKICAgICAgICBzZWxmLl9pbnB1dF9zdGF0ZSA9IE5vbmUKICAgICAgICBzZWxmLl9sYXN0X2NoYXIgPSBOb25lCiAgICAgICAgc2VsZi5sYW5nX2ZpbHRlciA9IGxhbmdfZmlsdGVyCiAgICAgICAgc2VsZi5sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKICAgICAgICBzZWxmLl9oYXNfd2luX2J5dGVzID0gTm9uZQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXNldCB0aGUgVW5pdmVyc2FsRGV0ZWN0b3IgYW5kIGFsbCBvZiBpdHMgcHJvYmVycyBiYWNrIHRvIHRoZWlyCiAgICAgICAgaW5pdGlhbCBzdGF0ZXMuICBUaGlzIGlzIGNhbGxlZCBieSBgYF9faW5pdF9fYGAsIHNvIHlvdSBvbmx5IG5lZWQgdG8KICAgICAgICBjYWxsIHRoaXMgZGlyZWN0bHkgaW4gYmV0d2VlbiBhbmFseXNlcyBvZiBkaWZmZXJlbnQgZG9jdW1lbnRzLgogICAgICAgICIiIgogICAgICAgIHNlbGYucmVzdWx0ID0geydlbmNvZGluZyc6IE5vbmUsICdjb25maWRlbmNlJzogMC4wLCAnbGFuZ3VhZ2UnOiBOb25lfQogICAgICAgIHNlbGYuZG9uZSA9IEZhbHNlCiAgICAgICAgc2VsZi5fZ290X2RhdGEgPSBGYWxzZQogICAgICAgIHNlbGYuX2hhc193aW5fYnl0ZXMgPSBGYWxzZQogICAgICAgIHNlbGYuX2lucHV0X3N0YXRlID0gSW5wdXRTdGF0ZS5QVVJFX0FTQ0lJCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyID0gYicnCiAgICAgICAgaWYgc2VsZi5fZXNjX2NoYXJzZXRfcHJvYmVyOgogICAgICAgICAgICBzZWxmLl9lc2NfY2hhcnNldF9wcm9iZXIucmVzZXQoKQogICAgICAgIGZvciBwcm9iZXIgaW4gc2VsZi5fY2hhcnNldF9wcm9iZXJzOgogICAgICAgICAgICBwcm9iZXIucmVzZXQoKQoKICAgIGRlZiBmZWVkKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICAiIiIKICAgICAgICBUYWtlcyBhIGNodW5rIG9mIGEgZG9jdW1lbnQgYW5kIGZlZWRzIGl0IHRocm91Z2ggYWxsIG9mIHRoZSByZWxldmFudAogICAgICAgIGNoYXJzZXQgcHJvYmVycy4KCiAgICAgICAgQWZ0ZXIgY2FsbGluZyBgYGZlZWRgYCwgeW91IGNhbiBjaGVjayB0aGUgdmFsdWUgb2YgdGhlIGBgZG9uZWBgCiAgICAgICAgYXR0cmlidXRlIHRvIHNlZSBpZiB5b3UgbmVlZCB0byBjb250aW51ZSBmZWVkaW5nIHRoZQogICAgICAgIGBgVW5pdmVyc2FsRGV0ZWN0b3JgYCBtb3JlIGRhdGEsIG9yIGlmIGl0IGhhcyBtYWRlIGEgcHJlZGljdGlvbgogICAgICAgIChpbiB0aGUgYGByZXN1bHRgYCBhdHRyaWJ1dGUpLgoKICAgICAgICAuLiBub3RlOjoKICAgICAgICAgICBZb3Ugc2hvdWxkIGFsd2F5cyBjYWxsIGBgY2xvc2VgYCB3aGVuIHlvdSdyZSBkb25lIGZlZWRpbmcgaW4geW91cgogICAgICAgICAgIGRvY3VtZW50IGlmIGBgZG9uZWBgIGlzIG5vdCBhbHJlYWR5IGBgVHJ1ZWBgLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuZG9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIG5vdCBsZW4oYnl0ZV9zdHIpOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYnl0ZV9zdHIsIGJ5dGVhcnJheSk6CiAgICAgICAgICAgIGJ5dGVfc3RyID0gYnl0ZWFycmF5KGJ5dGVfc3RyKQoKICAgICAgICAjIEZpcnN0IGNoZWNrIGZvciBrbm93biBCT01zLCBzaW5jZSB0aGVzZSBhcmUgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0CiAgICAgICAgaWYgbm90IHNlbGYuX2dvdF9kYXRhOgogICAgICAgICAgICAjIElmIHRoZSBkYXRhIHN0YXJ0cyB3aXRoIEJPTSwgd2Uga25vdyBpdCBpcyBVVEYKICAgICAgICAgICAgaWYgYnl0ZV9zdHIuc3RhcnRzd2l0aChjb2RlY3MuQk9NX1VURjgpOgogICAgICAgICAgICAgICAgIyBFRiBCQiBCRiAgVVRGLTggd2l0aCBCT00KICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ID0geydlbmNvZGluZyc6ICJVVEYtOC1TSUciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZGVuY2UnOiAxLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnJ30KICAgICAgICAgICAgZWxpZiBieXRlX3N0ci5zdGFydHN3aXRoKChjb2RlY3MuQk9NX1VURjMyX0xFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5CT01fVVRGMzJfQkUpKToKICAgICAgICAgICAgICAgICMgRkYgRkUgMDAgMDAgIFVURi0zMiwgbGl0dGxlLWVuZGlhbiBCT00KICAgICAgICAgICAgICAgICMgMDAgMDAgRkUgRkYgIFVURi0zMiwgYmlnLWVuZGlhbiBCT00KICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ID0geydlbmNvZGluZyc6ICJVVEYtMzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZGVuY2UnOiAxLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnJ30KICAgICAgICAgICAgZWxpZiBieXRlX3N0ci5zdGFydHN3aXRoKGInXHhGRVx4RkZceDAwXHgwMCcpOgogICAgICAgICAgICAgICAgIyBGRSBGRiAwMCAwMCAgVUNTLTQsIHVudXN1YWwgb2N0ZXQgb3JkZXIgQk9NICgzNDEyKQogICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSB7J2VuY29kaW5nJzogIlgtSVNPLTEwNjQ2LVVDUy00LTM0MTIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZGVuY2UnOiAxLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnJ30KICAgICAgICAgICAgZWxpZiBieXRlX3N0ci5zdGFydHN3aXRoKGInXHgwMFx4MDBceEZGXHhGRScpOgogICAgICAgICAgICAgICAgIyAwMCAwMCBGRiBGRSAgVUNTLTQsIHVudXN1YWwgb2N0ZXQgb3JkZXIgQk9NICgyMTQzKQogICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSB7J2VuY29kaW5nJzogIlgtSVNPLTEwNjQ2LVVDUy00LTIxNDMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZGVuY2UnOiAxLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnJ30KICAgICAgICAgICAgZWxpZiBieXRlX3N0ci5zdGFydHN3aXRoKChjb2RlY3MuQk9NX0xFLCBjb2RlY3MuQk9NX0JFKSk6CiAgICAgICAgICAgICAgICAjIEZGIEZFICBVVEYtMTYsIGxpdHRsZSBlbmRpYW4gQk9NCiAgICAgICAgICAgICAgICAjIEZFIEZGICBVVEYtMTYsIGJpZyBlbmRpYW4gQk9NCiAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IHsnZW5jb2RpbmcnOiAiVVRGLTE2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWRlbmNlJzogMS4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJyd9CgogICAgICAgICAgICBzZWxmLl9nb3RfZGF0YSA9IFRydWUKICAgICAgICAgICAgaWYgc2VsZi5yZXN1bHRbJ2VuY29kaW5nJ10gaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLmRvbmUgPSBUcnVlCiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBJZiBub25lIG9mIHRob3NlIG1hdGNoZWQgYW5kIHdlJ3ZlIG9ubHkgc2VlIEFTQ0lJIHNvIGZhciwgY2hlY2sKICAgICAgICAjIGZvciBoaWdoIGJ5dGVzIGFuZCBlc2NhcGUgc2VxdWVuY2VzCiAgICAgICAgaWYgc2VsZi5faW5wdXRfc3RhdGUgPT0gSW5wdXRTdGF0ZS5QVVJFX0FTQ0lJOgogICAgICAgICAgICBpZiBzZWxmLkhJR0hfQllURV9ERVRFQ1RPUi5zZWFyY2goYnl0ZV9zdHIpOgogICAgICAgICAgICAgICAgc2VsZi5faW5wdXRfc3RhdGUgPSBJbnB1dFN0YXRlLkhJR0hfQllURQogICAgICAgICAgICBlbGlmIHNlbGYuX2lucHV0X3N0YXRlID09IElucHV0U3RhdGUuUFVSRV9BU0NJSSBhbmQgXAogICAgICAgICAgICAgICAgICAgIHNlbGYuRVNDX0RFVEVDVE9SLnNlYXJjaChzZWxmLl9sYXN0X2NoYXIgKyBieXRlX3N0cik6CiAgICAgICAgICAgICAgICBzZWxmLl9pbnB1dF9zdGF0ZSA9IElucHV0U3RhdGUuRVNDX0FTQ0lJCgogICAgICAgIHNlbGYuX2xhc3RfY2hhciA9IGJ5dGVfc3RyWy0xOl0KCiAgICAgICAgIyBJZiB3ZSd2ZSBzZWVuIGVzY2FwZSBzZXF1ZW5jZXMsIHVzZSB0aGUgRXNjQ2hhclNldFByb2Jlciwgd2hpY2gKICAgICAgICAjIHVzZXMgYSBzaW1wbGUgc3RhdGUgbWFjaGluZSB0byBjaGVjayBmb3Iga25vd24gZXNjYXBlIHNlcXVlbmNlcyBpbgogICAgICAgICMgSFogYW5kIElTTy0yMDIyIGVuY29kaW5ncywgc2luY2UgdGhvc2UgYXJlIHRoZSBvbmx5IGVuY29kaW5ncyB0aGF0CiAgICAgICAgIyB1c2Ugc3VjaCBzZXF1ZW5jZXMuCiAgICAgICAgaWYgc2VsZi5faW5wdXRfc3RhdGUgPT0gSW5wdXRTdGF0ZS5FU0NfQVNDSUk6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9lc2NfY2hhcnNldF9wcm9iZXI6CiAgICAgICAgICAgICAgICBzZWxmLl9lc2NfY2hhcnNldF9wcm9iZXIgPSBFc2NDaGFyU2V0UHJvYmVyKHNlbGYubGFuZ19maWx0ZXIpCiAgICAgICAgICAgIGlmIHNlbGYuX2VzY19jaGFyc2V0X3Byb2Jlci5mZWVkKGJ5dGVfc3RyKSA9PSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQ6CiAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IHsnZW5jb2RpbmcnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXNjX2NoYXJzZXRfcHJvYmVyLmNoYXJzZXRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWRlbmNlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2VzY19jaGFyc2V0X3Byb2Jlci5nZXRfY29uZmlkZW5jZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2VzY19jaGFyc2V0X3Byb2Jlci5sYW5ndWFnZX0KICAgICAgICAgICAgICAgIHNlbGYuZG9uZSA9IFRydWUKICAgICAgICAjIElmIHdlJ3ZlIHNlZW4gaGlnaCBieXRlcyAoaS5lLiwgdGhvc2Ugd2l0aCB2YWx1ZXMgZ3JlYXRlciB0aGFuIDEyNyksCiAgICAgICAgIyB3ZSBuZWVkIHRvIGRvIG1vcmUgY29tcGxpY2F0ZWQgY2hlY2tzIHVzaW5nIGFsbCBvdXIgbXVsdGktYnl0ZSBhbmQKICAgICAgICAjIHNpbmdsZS1ieXRlIHByb2JlcnMgdGhhdCBhcmUgbGVmdC4gIFRoZSBzaW5nbGUtYnl0ZSBwcm9iZXJzCiAgICAgICAgIyB1c2UgY2hhcmFjdGVyIGJpZ3JhbSBkaXN0cmlidXRpb25zIHRvIGRldGVybWluZSB0aGUgZW5jb2RpbmcsIHdoZXJlYXMKICAgICAgICAjIHRoZSBtdWx0aS1ieXRlIHByb2JlcnMgdXNlIGEgY29tYmluYXRpb24gb2YgY2hhcmFjdGVyIHVuaWdyYW0gYW5kCiAgICAgICAgIyBiaWdyYW0gZGlzdHJpYnV0aW9ucy4KICAgICAgICBlbGlmIHNlbGYuX2lucHV0X3N0YXRlID09IElucHV0U3RhdGUuSElHSF9CWVRFOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5fY2hhcnNldF9wcm9iZXJzOgogICAgICAgICAgICAgICAgc2VsZi5fY2hhcnNldF9wcm9iZXJzID0gW01CQ1NHcm91cFByb2JlcihzZWxmLmxhbmdfZmlsdGVyKV0KICAgICAgICAgICAgICAgICMgSWYgd2UncmUgY2hlY2tpbmcgbm9uLUNKSyBlbmNvZGluZ3MsIHVzZSBzaW5nbGUtYnl0ZSBwcm9iZXIKICAgICAgICAgICAgICAgIGlmIHNlbGYubGFuZ19maWx0ZXIgJiBMYW5ndWFnZUZpbHRlci5OT05fQ0pLOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2NoYXJzZXRfcHJvYmVycy5hcHBlbmQoU0JDU0dyb3VwUHJvYmVyKCkpCiAgICAgICAgICAgICAgICBzZWxmLl9jaGFyc2V0X3Byb2JlcnMuYXBwZW5kKExhdGluMVByb2JlcigpKQogICAgICAgICAgICBmb3IgcHJvYmVyIGluIHNlbGYuX2NoYXJzZXRfcHJvYmVyczoKICAgICAgICAgICAgICAgIGlmIHByb2Jlci5mZWVkKGJ5dGVfc3RyKSA9PSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSB7J2VuY29kaW5nJzogcHJvYmVyLmNoYXJzZXRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uZmlkZW5jZSc6IHByb2Jlci5nZXRfY29uZmlkZW5jZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6IHByb2Jlci5sYW5ndWFnZX0KICAgICAgICAgICAgICAgICAgICBzZWxmLmRvbmUgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgc2VsZi5XSU5fQllURV9ERVRFQ1RPUi5zZWFyY2goYnl0ZV9zdHIpOgogICAgICAgICAgICAgICAgc2VsZi5faGFzX3dpbl9ieXRlcyA9IFRydWUKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU3RvcCBhbmFseXppbmcgdGhlIGN1cnJlbnQgZG9jdW1lbnQgYW5kIGNvbWUgdXAgd2l0aCBhIGZpbmFsCiAgICAgICAgcHJlZGljdGlvbi4KCiAgICAgICAgOnJldHVybnM6ICBUaGUgYGByZXN1bHRgYCBhdHRyaWJ1dGUsIGEgYGBkaWN0YGAgd2l0aCB0aGUga2V5cwogICAgICAgICAgICAgICAgICAgYGVuY29kaW5nYCwgYGNvbmZpZGVuY2VgLCBhbmQgYGxhbmd1YWdlYC4KICAgICAgICAiIiIKICAgICAgICAjIERvbid0IGJvdGhlciB3aXRoIGNoZWNrcyBpZiB3ZSdyZSBhbHJlYWR5IGRvbmUKICAgICAgICBpZiBzZWxmLmRvbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlc3VsdAogICAgICAgIHNlbGYuZG9uZSA9IFRydWUKCiAgICAgICAgaWYgbm90IHNlbGYuX2dvdF9kYXRhOgogICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1Zygnbm8gZGF0YSByZWNlaXZlZCEnKQoKICAgICAgICAjIERlZmF1bHQgdG8gQVNDSUkgaWYgaXQgaXMgYWxsIHdlJ3ZlIHNlZW4gc28gZmFyCiAgICAgICAgZWxpZiBzZWxmLl9pbnB1dF9zdGF0ZSA9PSBJbnB1dFN0YXRlLlBVUkVfQVNDSUk6CiAgICAgICAgICAgIHNlbGYucmVzdWx0ID0geydlbmNvZGluZyc6ICdhc2NpaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWRlbmNlJzogMS4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnJ30KCiAgICAgICAgIyBJZiB3ZSBoYXZlIHNlZW4gbm9uLUFTQ0lJLCByZXR1cm4gdGhlIGJlc3QgdGhhdCBtZXQgTUlOSU1VTV9USFJFU0hPTEQKICAgICAgICBlbGlmIHNlbGYuX2lucHV0X3N0YXRlID09IElucHV0U3RhdGUuSElHSF9CWVRFOgogICAgICAgICAgICBwcm9iZXJfY29uZmlkZW5jZSA9IE5vbmUKICAgICAgICAgICAgbWF4X3Byb2Jlcl9jb25maWRlbmNlID0gMC4wCiAgICAgICAgICAgIG1heF9wcm9iZXIgPSBOb25lCiAgICAgICAgICAgIGZvciBwcm9iZXIgaW4gc2VsZi5fY2hhcnNldF9wcm9iZXJzOgogICAgICAgICAgICAgICAgaWYgbm90IHByb2JlcjoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgcHJvYmVyX2NvbmZpZGVuY2UgPSBwcm9iZXIuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgICAgICAgICAgaWYgcHJvYmVyX2NvbmZpZGVuY2UgPiBtYXhfcHJvYmVyX2NvbmZpZGVuY2U6CiAgICAgICAgICAgICAgICAgICAgbWF4X3Byb2Jlcl9jb25maWRlbmNlID0gcHJvYmVyX2NvbmZpZGVuY2UKICAgICAgICAgICAgICAgICAgICBtYXhfcHJvYmVyID0gcHJvYmVyCiAgICAgICAgICAgIGlmIG1heF9wcm9iZXIgYW5kIChtYXhfcHJvYmVyX2NvbmZpZGVuY2UgPiBzZWxmLk1JTklNVU1fVEhSRVNIT0xEKToKICAgICAgICAgICAgICAgIGNoYXJzZXRfbmFtZSA9IG1heF9wcm9iZXIuY2hhcnNldF9uYW1lCiAgICAgICAgICAgICAgICBsb3dlcl9jaGFyc2V0X25hbWUgPSBtYXhfcHJvYmVyLmNoYXJzZXRfbmFtZS5sb3dlcigpCiAgICAgICAgICAgICAgICBjb25maWRlbmNlID0gbWF4X3Byb2Jlci5nZXRfY29uZmlkZW5jZSgpCiAgICAgICAgICAgICAgICAjIFVzZSBXaW5kb3dzIGVuY29kaW5nIG5hbWUgaW5zdGVhZCBvZiBJU08tODg1OSBpZiB3ZSBzYXcgYW55CiAgICAgICAgICAgICAgICAjIGV4dHJhIFdpbmRvd3Mtc3BlY2lmaWMgYnl0ZXMKICAgICAgICAgICAgICAgIGlmIGxvd2VyX2NoYXJzZXRfbmFtZS5zdGFydHN3aXRoKCdpc28tODg1OScpOgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2hhc193aW5fYnl0ZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXRfbmFtZSA9IHNlbGYuSVNPX1dJTl9NQVAuZ2V0KGxvd2VyX2NoYXJzZXRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldF9uYW1lKQogICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSB7J2VuY29kaW5nJzogY2hhcnNldF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZGVuY2UnOiBjb25maWRlbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogbWF4X3Byb2Jlci5sYW5ndWFnZX0KCiAgICAgICAgIyBMb2cgYWxsIHByb2JlciBjb25maWRlbmNlcyBpZiBub25lIG1ldCBNSU5JTVVNX1RIUkVTSE9MRAogICAgICAgIGlmIHNlbGYubG9nZ2VyLmdldEVmZmVjdGl2ZUxldmVsKCkgPT0gbG9nZ2luZy5ERUJVRzoKICAgICAgICAgICAgaWYgc2VsZi5yZXN1bHRbJ2VuY29kaW5nJ10gaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCdubyBwcm9iZXJzIGhpdCBtaW5pbXVtIHRocmVzaG9sZCcpCiAgICAgICAgICAgICAgICBmb3IgZ3JvdXBfcHJvYmVyIGluIHNlbGYuX2NoYXJzZXRfcHJvYmVyczoKICAgICAgICAgICAgICAgICAgICBpZiBub3QgZ3JvdXBfcHJvYmVyOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZ3JvdXBfcHJvYmVyLCBDaGFyU2V0R3JvdXBQcm9iZXIpOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgcHJvYmVyIGluIGdyb3VwX3Byb2Jlci5wcm9iZXJzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJyVzICVzIGNvbmZpZGVuY2UgPSAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZXIuY2hhcnNldF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVyLmxhbmd1YWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVyLmdldF9jb25maWRlbmNlKCkpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJyVzICVzIGNvbmZpZGVuY2UgPSAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Jlci5jaGFyc2V0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Jlci5sYW5ndWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVyLmdldF9jb25maWRlbmNlKCkpCiAgICAgICAgcmV0dXJuIHNlbGYucmVzdWx0ClBLAwQUAAAAAAAAACEA9b+8Pc4KAADOCgAAMQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L3V0Zjhwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuY2hhcnNldHByb2JlciBpbXBvcnQgQ2hhclNldFByb2Jlcgpmcm9tIC5lbnVtcyBpbXBvcnQgUHJvYmluZ1N0YXRlLCBNYWNoaW5lU3RhdGUKZnJvbSAuY29kaW5nc3RhdGVtYWNoaW5lIGltcG9ydCBDb2RpbmdTdGF0ZU1hY2hpbmUKZnJvbSAubWJjc3NtIGltcG9ydCBVVEY4X1NNX01PREVMCgoKCmNsYXNzIFVURjhQcm9iZXIoQ2hhclNldFByb2Jlcik6CiAgICBPTkVfQ0hBUl9QUk9CID0gMC41CgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKFVURjhQcm9iZXIsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvZGluZ19zbSA9IENvZGluZ1N0YXRlTWFjaGluZShVVEY4X1NNX01PREVMKQogICAgICAgIHNlbGYuX251bV9tYl9jaGFycyA9IE5vbmUKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc3VwZXIoVVRGOFByb2Jlciwgc2VsZikucmVzZXQoKQogICAgICAgIHNlbGYuY29kaW5nX3NtLnJlc2V0KCkKICAgICAgICBzZWxmLl9udW1fbWJfY2hhcnMgPSAwCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAidXRmLTgiCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgcmV0dXJuICIiCgogICAgZGVmIGZlZWQoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgIGZvciBjIGluIGJ5dGVfc3RyOgogICAgICAgICAgICBjb2Rpbmdfc3RhdGUgPSBzZWxmLmNvZGluZ19zbS5uZXh0X3N0YXRlKGMpCiAgICAgICAgICAgIGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuRVJST1I6CiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5OT1RfTUUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5JVFNfTUU6CiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5GT1VORF9JVAogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLlNUQVJUOgogICAgICAgICAgICAgICAgaWYgc2VsZi5jb2Rpbmdfc20uZ2V0X2N1cnJlbnRfY2hhcmxlbigpID49IDI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbnVtX21iX2NoYXJzICs9IDEKCiAgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSBQcm9iaW5nU3RhdGUuREVURUNUSU5HOgogICAgICAgICAgICBpZiBzZWxmLmdldF9jb25maWRlbmNlKCkgPiBzZWxmLlNIT1JUQ1VUX1RIUkVTSE9MRDoKICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUCgogICAgICAgIHJldHVybiBzZWxmLnN0YXRlCgogICAgZGVmIGdldF9jb25maWRlbmNlKHNlbGYpOgogICAgICAgIHVubGlrZSA9IDAuOTkKICAgICAgICBpZiBzZWxmLl9udW1fbWJfY2hhcnMgPCA2OgogICAgICAgICAgICB1bmxpa2UgKj0gc2VsZi5PTkVfQ0hBUl9QUk9CICoqIHNlbGYuX251bV9tYl9jaGFycwogICAgICAgICAgICByZXR1cm4gMS4wIC0gdW5saWtlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHVubGlrZQpQSwMEFAAAAAAAAAAhAEfHkNfyAAAA8gAAAC4AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC92ZXJzaW9uLnB5IiIiClRoaXMgbW9kdWxlIGV4aXN0cyBvbmx5IHRvIHNpbXBsaWZ5IHJldHJpZXZpbmcgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGNoYXJkZXQKZnJvbSB3aXRoaW4gc2V0dXAucHkgYW5kIGZyb20gY2hhcmRldCBzdWJwYWNrYWdlcy4KCjphdXRob3I6IERhbiBCbGFuY2hhcmQgKGRhbi5ibGFuY2hhcmRAZ21haWwuY29tKQoiIiIKCl9fdmVyc2lvbl9fID0gIjMuMC40IgpWRVJTSU9OID0gX192ZXJzaW9uX18uc3BsaXQoJy4nKQpQSwMEFAAAAAAAAAAhAFjUaTnwAAAA8AAAADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvX19pbml0X18ucHkjIENvcHlyaWdodCBKb25hdGhhbiBIYXJ0bGV5IDIwMTMuIEJTRCAzLUNsYXVzZSBsaWNlbnNlLCBzZWUgTElDRU5TRSBmaWxlLgpmcm9tIC5pbml0aWFsaXNlIGltcG9ydCBpbml0LCBkZWluaXQsIHJlaW5pdCwgY29sb3JhbWFfdGV4dApmcm9tIC5hbnNpIGltcG9ydCBGb3JlLCBCYWNrLCBTdHlsZSwgQ3Vyc29yCmZyb20gLmFuc2l0b3dpbjMyIGltcG9ydCBBbnNpVG9XaW4zMgoKX192ZXJzaW9uX18gPSAnMC4zLjcnCgpQSwMEFAAAAAAAAAAhAD4Vp1/cCQAA3AkAACwAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvYW5zaS5weSMgQ29weXJpZ2h0IEpvbmF0aGFuIEhhcnRsZXkgMjAxMy4gQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsIHNlZSBMSUNFTlNFIGZpbGUuCicnJwpUaGlzIG1vZHVsZSBnZW5lcmF0ZXMgQU5TSSBjaGFyYWN0ZXIgY29kZXMgdG8gcHJpbnRpbmcgY29sb3JzIHRvIHRlcm1pbmFscy4KU2VlOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUKJycnCgpDU0kgPSAnXDAzM1snCk9TQyA9ICdcMDMzXScKQkVMID0gJ1wwMDcnCgoKZGVmIGNvZGVfdG9fY2hhcnMoY29kZSk6CiAgICByZXR1cm4gQ1NJICsgc3RyKGNvZGUpICsgJ20nCgpkZWYgc2V0X3RpdGxlKHRpdGxlKToKICAgIHJldHVybiBPU0MgKyAnMjsnICsgdGl0bGUgKyBCRUwKCmRlZiBjbGVhcl9zY3JlZW4obW9kZT0yKToKICAgIHJldHVybiBDU0kgKyBzdHIobW9kZSkgKyAnSicKCmRlZiBjbGVhcl9saW5lKG1vZGU9Mik6CiAgICByZXR1cm4gQ1NJICsgc3RyKG1vZGUpICsgJ0snCgoKY2xhc3MgQW5zaUNvZGVzKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIyB0aGUgc3ViY2xhc3NlcyBkZWNsYXJlIGNsYXNzIGF0dHJpYnV0ZXMgd2hpY2ggYXJlIG51bWJlcnMuCiAgICAgICAgIyBVcG9uIGluc3RhbnRpYXRpb24gd2UgZGVmaW5lIGluc3RhbmNlIGF0dHJpYnV0ZXMsIHdoaWNoIGFyZSB0aGUgc2FtZQogICAgICAgICMgYXMgdGhlIGNsYXNzIGF0dHJpYnV0ZXMgYnV0IHdyYXBwZWQgd2l0aCB0aGUgQU5TSSBlc2NhcGUgc2VxdWVuY2UKICAgICAgICBmb3IgbmFtZSBpbiBkaXIoc2VsZik6CiAgICAgICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJ18nKToKICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihzZWxmLCBuYW1lKQogICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBjb2RlX3RvX2NoYXJzKHZhbHVlKSkKCgpjbGFzcyBBbnNpQ3Vyc29yKG9iamVjdCk6CiAgICBkZWYgVVAoc2VsZiwgbj0xKToKICAgICAgICByZXR1cm4gQ1NJICsgc3RyKG4pICsgJ0EnCiAgICBkZWYgRE9XTihzZWxmLCBuPTEpOgogICAgICAgIHJldHVybiBDU0kgKyBzdHIobikgKyAnQicKICAgIGRlZiBGT1JXQVJEKHNlbGYsIG49MSk6CiAgICAgICAgcmV0dXJuIENTSSArIHN0cihuKSArICdDJwogICAgZGVmIEJBQ0soc2VsZiwgbj0xKToKICAgICAgICByZXR1cm4gQ1NJICsgc3RyKG4pICsgJ0QnCiAgICBkZWYgUE9TKHNlbGYsIHg9MSwgeT0xKToKICAgICAgICByZXR1cm4gQ1NJICsgc3RyKHkpICsgJzsnICsgc3RyKHgpICsgJ0gnCgoKY2xhc3MgQW5zaUZvcmUoQW5zaUNvZGVzKToKICAgIEJMQUNLICAgICAgICAgICA9IDMwCiAgICBSRUQgICAgICAgICAgICAgPSAzMQogICAgR1JFRU4gICAgICAgICAgID0gMzIKICAgIFlFTExPVyAgICAgICAgICA9IDMzCiAgICBCTFVFICAgICAgICAgICAgPSAzNAogICAgTUFHRU5UQSAgICAgICAgID0gMzUKICAgIENZQU4gICAgICAgICAgICA9IDM2CiAgICBXSElURSAgICAgICAgICAgPSAzNwogICAgUkVTRVQgICAgICAgICAgID0gMzkKCiAgICAjIFRoZXNlIGFyZSBmYWlybHkgd2VsbCBzdXBwb3J0ZWQsIGJ1dCBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQuCiAgICBMSUdIVEJMQUNLX0VYICAgPSA5MAogICAgTElHSFRSRURfRVggICAgID0gOTEKICAgIExJR0hUR1JFRU5fRVggICA9IDkyCiAgICBMSUdIVFlFTExPV19FWCAgPSA5MwogICAgTElHSFRCTFVFX0VYICAgID0gOTQKICAgIExJR0hUTUFHRU5UQV9FWCA9IDk1CiAgICBMSUdIVENZQU5fRVggICAgPSA5NgogICAgTElHSFRXSElURV9FWCAgID0gOTcKCgpjbGFzcyBBbnNpQmFjayhBbnNpQ29kZXMpOgogICAgQkxBQ0sgICAgICAgICAgID0gNDAKICAgIFJFRCAgICAgICAgICAgICA9IDQxCiAgICBHUkVFTiAgICAgICAgICAgPSA0MgogICAgWUVMTE9XICAgICAgICAgID0gNDMKICAgIEJMVUUgICAgICAgICAgICA9IDQ0CiAgICBNQUdFTlRBICAgICAgICAgPSA0NQogICAgQ1lBTiAgICAgICAgICAgID0gNDYKICAgIFdISVRFICAgICAgICAgICA9IDQ3CiAgICBSRVNFVCAgICAgICAgICAgPSA0OQoKICAgICMgVGhlc2UgYXJlIGZhaXJseSB3ZWxsIHN1cHBvcnRlZCwgYnV0IG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZC4KICAgIExJR0hUQkxBQ0tfRVggICA9IDEwMAogICAgTElHSFRSRURfRVggICAgID0gMTAxCiAgICBMSUdIVEdSRUVOX0VYICAgPSAxMDIKICAgIExJR0hUWUVMTE9XX0VYICA9IDEwMwogICAgTElHSFRCTFVFX0VYICAgID0gMTA0CiAgICBMSUdIVE1BR0VOVEFfRVggPSAxMDUKICAgIExJR0hUQ1lBTl9FWCAgICA9IDEwNgogICAgTElHSFRXSElURV9FWCAgID0gMTA3CgoKY2xhc3MgQW5zaVN0eWxlKEFuc2lDb2Rlcyk6CiAgICBCUklHSFQgICAgPSAxCiAgICBESU0gICAgICAgPSAyCiAgICBOT1JNQUwgICAgPSAyMgogICAgUkVTRVRfQUxMID0gMAoKRm9yZSAgID0gQW5zaUZvcmUoKQpCYWNrICAgPSBBbnNpQmFjaygpClN0eWxlICA9IEFuc2lTdHlsZSgpCkN1cnNvciA9IEFuc2lDdXJzb3IoKQpQSwMEFAAAAAAAAAAhAMdjwNnEJQAAxCUAADMAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvYW5zaXRvd2luMzIucHkjIENvcHlyaWdodCBKb25hdGhhbiBIYXJ0bGV5IDIwMTMuIEJTRCAzLUNsYXVzZSBsaWNlbnNlLCBzZWUgTElDRU5TRSBmaWxlLgppbXBvcnQgcmUKaW1wb3J0IHN5cwppbXBvcnQgb3MKCmZyb20gLmFuc2kgaW1wb3J0IEFuc2lGb3JlLCBBbnNpQmFjaywgQW5zaVN0eWxlLCBTdHlsZQpmcm9tIC53aW50ZXJtIGltcG9ydCBXaW5UZXJtLCBXaW5Db2xvciwgV2luU3R5bGUKZnJvbSAud2luMzIgaW1wb3J0IHdpbmRsbCwgd2luYXBpX3Rlc3QKCgp3aW50ZXJtID0gTm9uZQppZiB3aW5kbGwgaXMgbm90IE5vbmU6CiAgICB3aW50ZXJtID0gV2luVGVybSgpCgoKZGVmIGlzX3N0cmVhbV9jbG9zZWQoc3RyZWFtKToKICAgIHJldHVybiBub3QgaGFzYXR0cihzdHJlYW0sICdjbG9zZWQnKSBvciBzdHJlYW0uY2xvc2VkCgoKZGVmIGlzX2FfdHR5KHN0cmVhbSk6CiAgICByZXR1cm4gaGFzYXR0cihzdHJlYW0sICdpc2F0dHknKSBhbmQgc3RyZWFtLmlzYXR0eSgpCgoKY2xhc3MgU3RyZWFtV3JhcHBlcihvYmplY3QpOgogICAgJycnCiAgICBXcmFwcyBhIHN0cmVhbSAoc3VjaCBhcyBzdGRvdXQpLCBhY3RpbmcgYXMgYSB0cmFuc3BhcmVudCBwcm94eSBmb3IgYWxsCiAgICBhdHRyaWJ1dGUgYWNjZXNzIGFwYXJ0IGZyb20gbWV0aG9kICd3cml0ZSgpJywgd2hpY2ggaXMgZGVsZWdhdGVkIHRvIG91cgogICAgQ29udmVydGVyIGluc3RhbmNlLgogICAgJycnCiAgICBkZWYgX19pbml0X18oc2VsZiwgd3JhcHBlZCwgY29udmVydGVyKToKICAgICAgICAjIGRvdWJsZS11bmRlcnNjb3JlIGV2ZXJ5dGhpbmcgdG8gcHJldmVudCBjbGFzaGVzIHdpdGggbmFtZXMgb2YKICAgICAgICAjIGF0dHJpYnV0ZXMgb24gdGhlIHdyYXBwZWQgc3RyZWFtIG9iamVjdC4KICAgICAgICBzZWxmLl9fd3JhcHBlZCA9IHdyYXBwZWQKICAgICAgICBzZWxmLl9fY29udmVydG9yID0gY29udmVydGVyCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX193cmFwcGVkLCBuYW1lKQoKICAgIGRlZiB3cml0ZShzZWxmLCB0ZXh0KToKICAgICAgICBzZWxmLl9fY29udmVydG9yLndyaXRlKHRleHQpCgoKY2xhc3MgQW5zaVRvV2luMzIob2JqZWN0KToKICAgICcnJwogICAgSW1wbGVtZW50cyBhICd3cml0ZSgpJyBtZXRob2Qgd2hpY2gsIG9uIFdpbmRvd3MsIHdpbGwgc3RyaXAgQU5TSSBjaGFyYWN0ZXIKICAgIHNlcXVlbmNlcyBmcm9tIHRoZSB0ZXh0LCBhbmQgaWYgb3V0cHV0dGluZyB0byBhIHR0eSwgd2lsbCBjb252ZXJ0IHRoZW0gaW50bwogICAgd2luMzIgZnVuY3Rpb24gY2FsbHMuCiAgICAnJycKICAgIEFOU0lfQ1NJX1JFID0gcmUuY29tcGlsZSgnXDAwMT9cMDMzXFsoKD86XGR8OykqKShbYS16QS1aXSlcMDAyPycpICAgICAjIENvbnRyb2wgU2VxdWVuY2UgSW50cm9kdWNlcgogICAgQU5TSV9PU0NfUkUgPSByZS5jb21waWxlKCdcMDAxP1wwMzNcXSgoPzoufDspKj8pKFx4MDcpXDAwMj8nKSAgICAgICAgICMgT3BlcmF0aW5nIFN5c3RlbSBDb21tYW5kCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdyYXBwZWQsIGNvbnZlcnQ9Tm9uZSwgc3RyaXA9Tm9uZSwgYXV0b3Jlc2V0PUZhbHNlKToKICAgICAgICAjIFRoZSB3cmFwcGVkIHN0cmVhbSAobm9ybWFsbHkgc3lzLnN0ZG91dCBvciBzeXMuc3RkZXJyKQogICAgICAgIHNlbGYud3JhcHBlZCA9IHdyYXBwZWQKCiAgICAgICAgIyBzaG91bGQgd2UgcmVzZXQgY29sb3JzIHRvIGRlZmF1bHRzIGFmdGVyIGV2ZXJ5IC53cml0ZSgpCiAgICAgICAgc2VsZi5hdXRvcmVzZXQgPSBhdXRvcmVzZXQKCiAgICAgICAgIyBjcmVhdGUgdGhlIHByb3h5IHdyYXBwaW5nIG91ciBvdXRwdXQgc3RyZWFtCiAgICAgICAgc2VsZi5zdHJlYW0gPSBTdHJlYW1XcmFwcGVyKHdyYXBwZWQsIHNlbGYpCgogICAgICAgIG9uX3dpbmRvd3MgPSBvcy5uYW1lID09ICdudCcKICAgICAgICAjIFdlIHRlc3QgaWYgdGhlIFdpbkFQSSB3b3JrcywgYmVjYXVzZSBldmVuIGlmIHdlIGFyZSBvbiBXaW5kb3dzCiAgICAgICAgIyB3ZSBtYXkgYmUgdXNpbmcgYSB0ZXJtaW5hbCB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgV2luQVBJCiAgICAgICAgIyAoZS5nLiBDeWd3aW4gVGVybWluYWwpLiBJbiB0aGlzIGNhc2UgaXQncyB1cCB0byB0aGUgdGVybWluYWwKICAgICAgICAjIHRvIHN1cHBvcnQgdGhlIEFOU0kgY29kZXMuCiAgICAgICAgY29udmVyc2lvbl9zdXBwb3J0ZWQgPSBvbl93aW5kb3dzIGFuZCB3aW5hcGlfdGVzdCgpCgogICAgICAgICMgc2hvdWxkIHdlIHN0cmlwIEFOU0kgc2VxdWVuY2VzIGZyb20gb3VyIG91dHB1dD8KICAgICAgICBpZiBzdHJpcCBpcyBOb25lOgogICAgICAgICAgICBzdHJpcCA9IGNvbnZlcnNpb25fc3VwcG9ydGVkIG9yIChub3QgaXNfc3RyZWFtX2Nsb3NlZCh3cmFwcGVkKSBhbmQgbm90IGlzX2FfdHR5KHdyYXBwZWQpKQogICAgICAgIHNlbGYuc3RyaXAgPSBzdHJpcAoKICAgICAgICAjIHNob3VsZCB3ZSBzaG91bGQgY29udmVydCBBTlNJIHNlcXVlbmNlcyBpbnRvIHdpbjMyIGNhbGxzPwogICAgICAgIGlmIGNvbnZlcnQgaXMgTm9uZToKICAgICAgICAgICAgY29udmVydCA9IGNvbnZlcnNpb25fc3VwcG9ydGVkIGFuZCBub3QgaXNfc3RyZWFtX2Nsb3NlZCh3cmFwcGVkKSBhbmQgaXNfYV90dHkod3JhcHBlZCkKICAgICAgICBzZWxmLmNvbnZlcnQgPSBjb252ZXJ0CgogICAgICAgICMgZGljdCBvZiBhbnNpIGNvZGVzIHRvIHdpbjMyIGZ1bmN0aW9ucyBhbmQgcGFyYW1ldGVycwogICAgICAgIHNlbGYud2luMzJfY2FsbHMgPSBzZWxmLmdldF93aW4zMl9jYWxscygpCgogICAgICAgICMgYXJlIHdlIHdyYXBwaW5nIHN0ZGVycj8KICAgICAgICBzZWxmLm9uX3N0ZGVyciA9IHNlbGYud3JhcHBlZCBpcyBzeXMuc3RkZXJyCgogICAgZGVmIHNob3VsZF93cmFwKHNlbGYpOgogICAgICAgICcnJwogICAgICAgIFRydWUgaWYgdGhpcyBjbGFzcyBpcyBhY3R1YWxseSBuZWVkZWQuIElmIGZhbHNlLCB0aGVuIHRoZSBvdXRwdXQKICAgICAgICBzdHJlYW0gd2lsbCBub3QgYmUgYWZmZWN0ZWQsIG5vciB3aWxsIHdpbjMyIGNhbGxzIGJlIGlzc3VlZCwgc28KICAgICAgICB3cmFwcGluZyBzdGRvdXQgaXMgbm90IGFjdHVhbGx5IHJlcXVpcmVkLiBUaGlzIHdpbGwgZ2VuZXJhbGx5IGJlCiAgICAgICAgRmFsc2Ugb24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zLCB1bmxlc3Mgb3B0aW9uYWwgZnVuY3Rpb25hbGl0eSBsaWtlCiAgICAgICAgYXV0b3Jlc2V0IGhhcyBiZWVuIHJlcXVlc3RlZCB1c2luZyBrd2FyZ3MgdG8gaW5pdCgpCiAgICAgICAgJycnCiAgICAgICAgcmV0dXJuIHNlbGYuY29udmVydCBvciBzZWxmLnN0cmlwIG9yIHNlbGYuYXV0b3Jlc2V0CgogICAgZGVmIGdldF93aW4zMl9jYWxscyhzZWxmKToKICAgICAgICBpZiBzZWxmLmNvbnZlcnQgYW5kIHdpbnRlcm06CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBBbnNpU3R5bGUuUkVTRVRfQUxMOiAod2ludGVybS5yZXNldF9hbGwsICksCiAgICAgICAgICAgICAgICBBbnNpU3R5bGUuQlJJR0hUOiAod2ludGVybS5zdHlsZSwgV2luU3R5bGUuQlJJR0hUKSwKICAgICAgICAgICAgICAgIEFuc2lTdHlsZS5ESU06ICh3aW50ZXJtLnN0eWxlLCBXaW5TdHlsZS5OT1JNQUwpLAogICAgICAgICAgICAgICAgQW5zaVN0eWxlLk5PUk1BTDogKHdpbnRlcm0uc3R5bGUsIFdpblN0eWxlLk5PUk1BTCksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5CTEFDSzogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuQkxBQ0spLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuUkVEOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5SRUQpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuR1JFRU46ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLkdSRUVOKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLllFTExPVzogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuWUVMTE9XKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkJMVUU6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLkJMVUUpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuTUFHRU5UQTogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuTUFHRU5UQSksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5DWUFOOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5DWUFOKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLldISVRFOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5HUkVZKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLlJFU0VUOiAod2ludGVybS5mb3JlLCApLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuTElHSFRCTEFDS19FWDogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuQkxBQ0ssIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuTElHSFRSRURfRVg6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLlJFRCwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5MSUdIVEdSRUVOX0VYOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5HUkVFTiwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5MSUdIVFlFTExPV19FWDogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuWUVMTE9XLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkxJR0hUQkxVRV9FWDogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuQkxVRSwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5MSUdIVE1BR0VOVEFfRVg6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLk1BR0VOVEEsIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuTElHSFRDWUFOX0VYOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5DWUFOLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkxJR0hUV0hJVEVfRVg6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLkdSRVksIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suQkxBQ0s6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLkJMQUNLKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLlJFRDogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuUkVEKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLkdSRUVOOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5HUkVFTiksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5ZRUxMT1c6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLllFTExPVyksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5CTFVFOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5CTFVFKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLk1BR0VOVEE6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLk1BR0VOVEEpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suQ1lBTjogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuQ1lBTiksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5XSElURTogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuR1JFWSksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5SRVNFVDogKHdpbnRlcm0uYmFjaywgKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLkxJR0hUQkxBQ0tfRVg6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLkJMQUNLLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLkxJR0hUUkVEX0VYOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5SRUQsIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suTElHSFRHUkVFTl9FWDogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuR1JFRU4sIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suTElHSFRZRUxMT1dfRVg6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLllFTExPVywgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5MSUdIVEJMVUVfRVg6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLkJMVUUsIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suTElHSFRNQUdFTlRBX0VYOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5NQUdFTlRBLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLkxJR0hUQ1lBTl9FWDogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuQ1lBTiwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5MSUdIVFdISVRFX0VYOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5HUkVZLCBUcnVlKSwKICAgICAgICAgICAgfQogICAgICAgIHJldHVybiBkaWN0KCkKCiAgICBkZWYgd3JpdGUoc2VsZiwgdGV4dCk6CiAgICAgICAgaWYgc2VsZi5zdHJpcCBvciBzZWxmLmNvbnZlcnQ6CiAgICAgICAgICAgIHNlbGYud3JpdGVfYW5kX2NvbnZlcnQodGV4dCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLndyYXBwZWQud3JpdGUodGV4dCkKICAgICAgICAgICAgc2VsZi53cmFwcGVkLmZsdXNoKCkKICAgICAgICBpZiBzZWxmLmF1dG9yZXNldDoKICAgICAgICAgICAgc2VsZi5yZXNldF9hbGwoKQoKCiAgICBkZWYgcmVzZXRfYWxsKHNlbGYpOgogICAgICAgIGlmIHNlbGYuY29udmVydDoKICAgICAgICAgICAgc2VsZi5jYWxsX3dpbjMyKCdtJywgKDAsKSkKICAgICAgICBlbGlmIG5vdCBzZWxmLnN0cmlwIGFuZCBub3QgaXNfc3RyZWFtX2Nsb3NlZChzZWxmLndyYXBwZWQpOgogICAgICAgICAgICBzZWxmLndyYXBwZWQud3JpdGUoU3R5bGUuUkVTRVRfQUxMKQoKCiAgICBkZWYgd3JpdGVfYW5kX2NvbnZlcnQoc2VsZiwgdGV4dCk6CiAgICAgICAgJycnCiAgICAgICAgV3JpdGUgdGhlIGdpdmVuIHRleHQgdG8gb3VyIHdyYXBwZWQgc3RyZWFtLCBzdHJpcHBpbmcgYW55IEFOU0kKICAgICAgICBzZXF1ZW5jZXMgZnJvbSB0aGUgdGV4dCwgYW5kIG9wdGlvbmFsbHkgY29udmVydGluZyB0aGVtIGludG8gd2luMzIKICAgICAgICBjYWxscy4KICAgICAgICAnJycKICAgICAgICBjdXJzb3IgPSAwCiAgICAgICAgdGV4dCA9IHNlbGYuY29udmVydF9vc2ModGV4dCkKICAgICAgICBmb3IgbWF0Y2ggaW4gc2VsZi5BTlNJX0NTSV9SRS5maW5kaXRlcih0ZXh0KToKICAgICAgICAgICAgc3RhcnQsIGVuZCA9IG1hdGNoLnNwYW4oKQogICAgICAgICAgICBzZWxmLndyaXRlX3BsYWluX3RleHQodGV4dCwgY3Vyc29yLCBzdGFydCkKICAgICAgICAgICAgc2VsZi5jb252ZXJ0X2Fuc2koKm1hdGNoLmdyb3VwcygpKQogICAgICAgICAgICBjdXJzb3IgPSBlbmQKICAgICAgICBzZWxmLndyaXRlX3BsYWluX3RleHQodGV4dCwgY3Vyc29yLCBsZW4odGV4dCkpCgoKICAgIGRlZiB3cml0ZV9wbGFpbl90ZXh0KHNlbGYsIHRleHQsIHN0YXJ0LCBlbmQpOgogICAgICAgIGlmIHN0YXJ0IDwgZW5kOgogICAgICAgICAgICBzZWxmLndyYXBwZWQud3JpdGUodGV4dFtzdGFydDplbmRdKQogICAgICAgICAgICBzZWxmLndyYXBwZWQuZmx1c2goKQoKCiAgICBkZWYgY29udmVydF9hbnNpKHNlbGYsIHBhcmFtc3RyaW5nLCBjb21tYW5kKToKICAgICAgICBpZiBzZWxmLmNvbnZlcnQ6CiAgICAgICAgICAgIHBhcmFtcyA9IHNlbGYuZXh0cmFjdF9wYXJhbXMoY29tbWFuZCwgcGFyYW1zdHJpbmcpCiAgICAgICAgICAgIHNlbGYuY2FsbF93aW4zMihjb21tYW5kLCBwYXJhbXMpCgoKICAgIGRlZiBleHRyYWN0X3BhcmFtcyhzZWxmLCBjb21tYW5kLCBwYXJhbXN0cmluZyk6CiAgICAgICAgaWYgY29tbWFuZCBpbiAnSGYnOgogICAgICAgICAgICBwYXJhbXMgPSB0dXBsZShpbnQocCkgaWYgbGVuKHApICE9IDAgZWxzZSAxIGZvciBwIGluIHBhcmFtc3RyaW5nLnNwbGl0KCc7JykpCiAgICAgICAgICAgIHdoaWxlIGxlbihwYXJhbXMpIDwgMjoKICAgICAgICAgICAgICAgICMgZGVmYXVsdHM6CiAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgKyAoMSwpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGFyYW1zID0gdHVwbGUoaW50KHApIGZvciBwIGluIHBhcmFtc3RyaW5nLnNwbGl0KCc7JykgaWYgbGVuKHApICE9IDApCiAgICAgICAgICAgIGlmIGxlbihwYXJhbXMpID09IDA6CiAgICAgICAgICAgICAgICAjIGRlZmF1bHRzOgogICAgICAgICAgICAgICAgaWYgY29tbWFuZCBpbiAnSkttJzoKICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSAoMCwpCiAgICAgICAgICAgICAgICBlbGlmIGNvbW1hbmQgaW4gJ0FCQ0QnOgogICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9ICgxLCkKCiAgICAgICAgcmV0dXJuIHBhcmFtcwoKCiAgICBkZWYgY2FsbF93aW4zMihzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgogICAgICAgIGlmIGNvbW1hbmQgPT0gJ20nOgogICAgICAgICAgICBmb3IgcGFyYW0gaW4gcGFyYW1zOgogICAgICAgICAgICAgICAgaWYgcGFyYW0gaW4gc2VsZi53aW4zMl9jYWxsczoKICAgICAgICAgICAgICAgICAgICBmdW5jX2FyZ3MgPSBzZWxmLndpbjMyX2NhbGxzW3BhcmFtXQogICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBmdW5jX2FyZ3NbMF0KICAgICAgICAgICAgICAgICAgICBhcmdzID0gZnVuY19hcmdzWzE6XQogICAgICAgICAgICAgICAgICAgIGt3YXJncyA9IGRpY3Qob25fc3RkZXJyPXNlbGYub25fc3RkZXJyKQogICAgICAgICAgICAgICAgICAgIGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGVsaWYgY29tbWFuZCBpbiAnSic6CiAgICAgICAgICAgIHdpbnRlcm0uZXJhc2Vfc2NyZWVuKHBhcmFtc1swXSwgb25fc3RkZXJyPXNlbGYub25fc3RkZXJyKQogICAgICAgIGVsaWYgY29tbWFuZCBpbiAnSyc6CiAgICAgICAgICAgIHdpbnRlcm0uZXJhc2VfbGluZShwYXJhbXNbMF0sIG9uX3N0ZGVycj1zZWxmLm9uX3N0ZGVycikKICAgICAgICBlbGlmIGNvbW1hbmQgaW4gJ0hmJzogICAgICMgY3Vyc29yIHBvc2l0aW9uIC0gYWJzb2x1dGUKICAgICAgICAgICAgd2ludGVybS5zZXRfY3Vyc29yX3Bvc2l0aW9uKHBhcmFtcywgb25fc3RkZXJyPXNlbGYub25fc3RkZXJyKQogICAgICAgIGVsaWYgY29tbWFuZCBpbiAnQUJDRCc6ICAgIyBjdXJzb3IgcG9zaXRpb24gLSByZWxhdGl2ZQogICAgICAgICAgICBuID0gcGFyYW1zWzBdCiAgICAgICAgICAgICMgQSAtIHVwLCBCIC0gZG93biwgQyAtIGZvcndhcmQsIEQgLSBiYWNrCiAgICAgICAgICAgIHgsIHkgPSB7J0EnOiAoMCwgLW4pLCAnQic6ICgwLCBuKSwgJ0MnOiAobiwgMCksICdEJzogKC1uLCAwKX1bY29tbWFuZF0KICAgICAgICAgICAgd2ludGVybS5jdXJzb3JfYWRqdXN0KHgsIHksIG9uX3N0ZGVycj1zZWxmLm9uX3N0ZGVycikKCgogICAgZGVmIGNvbnZlcnRfb3NjKHNlbGYsIHRleHQpOgogICAgICAgIGZvciBtYXRjaCBpbiBzZWxmLkFOU0lfT1NDX1JFLmZpbmRpdGVyKHRleHQpOgogICAgICAgICAgICBzdGFydCwgZW5kID0gbWF0Y2guc3BhbigpCiAgICAgICAgICAgIHRleHQgPSB0ZXh0WzpzdGFydF0gKyB0ZXh0W2VuZDpdCiAgICAgICAgICAgIHBhcmFtc3RyaW5nLCBjb21tYW5kID0gbWF0Y2guZ3JvdXBzKCkKICAgICAgICAgICAgaWYgY29tbWFuZCBpbiAnXHgwNyc6ICAgICAgICMgXHgwNyA9IEJFTAogICAgICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zdHJpbmcuc3BsaXQoIjsiKQogICAgICAgICAgICAgICAgIyAwIC0gY2hhbmdlIHRpdGxlIGFuZCBpY29uICh3ZSB3aWxsIG9ubHkgY2hhbmdlIHRpdGxlKQogICAgICAgICAgICAgICAgIyAxIC0gY2hhbmdlIGljb24gKHdlIGRvbid0IHN1cHBvcnQgdGhpcykKICAgICAgICAgICAgICAgICMgMiAtIGNoYW5nZSB0aXRsZQogICAgICAgICAgICAgICAgaWYgcGFyYW1zWzBdIGluICcwMic6CiAgICAgICAgICAgICAgICAgICAgd2ludGVybS5zZXRfdGl0bGUocGFyYW1zWzFdKQogICAgICAgIHJldHVybiB0ZXh0ClBLAwQUAAAAAAAAACEAfdbYL30HAAB9BwAAMgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jb2xvcmFtYS9pbml0aWFsaXNlLnB5IyBDb3B5cmlnaHQgSm9uYXRoYW4gSGFydGxleSAyMDEzLiBCU0QgMy1DbGF1c2UgbGljZW5zZSwgc2VlIExJQ0VOU0UgZmlsZS4KaW1wb3J0IGF0ZXhpdAppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgc3lzCgpmcm9tIC5hbnNpdG93aW4zMiBpbXBvcnQgQW5zaVRvV2luMzIKCgpvcmlnX3N0ZG91dCA9IE5vbmUKb3JpZ19zdGRlcnIgPSBOb25lCgp3cmFwcGVkX3N0ZG91dCA9IE5vbmUKd3JhcHBlZF9zdGRlcnIgPSBOb25lCgphdGV4aXRfZG9uZSA9IEZhbHNlCgoKZGVmIHJlc2V0X2FsbCgpOgogICAgaWYgQW5zaVRvV2luMzIgaXMgbm90IE5vbmU6ICAgICMgSXNzdWUgIzc0OiBvYmplY3RzIG1pZ2h0IGJlY29tZSBOb25lIGF0IGV4aXQKICAgICAgICBBbnNpVG9XaW4zMihvcmlnX3N0ZG91dCkucmVzZXRfYWxsKCkKCgpkZWYgaW5pdChhdXRvcmVzZXQ9RmFsc2UsIGNvbnZlcnQ9Tm9uZSwgc3RyaXA9Tm9uZSwgd3JhcD1UcnVlKToKCiAgICBpZiBub3Qgd3JhcCBhbmQgYW55KFthdXRvcmVzZXQsIGNvbnZlcnQsIHN0cmlwXSk6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignd3JhcD1GYWxzZSBjb25mbGljdHMgd2l0aCBhbnkgb3RoZXIgYXJnPVRydWUnKQoKICAgIGdsb2JhbCB3cmFwcGVkX3N0ZG91dCwgd3JhcHBlZF9zdGRlcnIKICAgIGdsb2JhbCBvcmlnX3N0ZG91dCwgb3JpZ19zdGRlcnIKCiAgICBvcmlnX3N0ZG91dCA9IHN5cy5zdGRvdXQKICAgIG9yaWdfc3RkZXJyID0gc3lzLnN0ZGVycgoKICAgIGlmIHN5cy5zdGRvdXQgaXMgTm9uZToKICAgICAgICB3cmFwcGVkX3N0ZG91dCA9IE5vbmUKICAgIGVsc2U6CiAgICAgICAgc3lzLnN0ZG91dCA9IHdyYXBwZWRfc3Rkb3V0ID0gXAogICAgICAgICAgICB3cmFwX3N0cmVhbShvcmlnX3N0ZG91dCwgY29udmVydCwgc3RyaXAsIGF1dG9yZXNldCwgd3JhcCkKICAgIGlmIHN5cy5zdGRlcnIgaXMgTm9uZToKICAgICAgICB3cmFwcGVkX3N0ZGVyciA9IE5vbmUKICAgIGVsc2U6CiAgICAgICAgc3lzLnN0ZGVyciA9IHdyYXBwZWRfc3RkZXJyID0gXAogICAgICAgICAgICB3cmFwX3N0cmVhbShvcmlnX3N0ZGVyciwgY29udmVydCwgc3RyaXAsIGF1dG9yZXNldCwgd3JhcCkKCiAgICBnbG9iYWwgYXRleGl0X2RvbmUKICAgIGlmIG5vdCBhdGV4aXRfZG9uZToKICAgICAgICBhdGV4aXQucmVnaXN0ZXIocmVzZXRfYWxsKQogICAgICAgIGF0ZXhpdF9kb25lID0gVHJ1ZQoKCmRlZiBkZWluaXQoKToKICAgIGlmIG9yaWdfc3Rkb3V0IGlzIG5vdCBOb25lOgogICAgICAgIHN5cy5zdGRvdXQgPSBvcmlnX3N0ZG91dAogICAgaWYgb3JpZ19zdGRlcnIgaXMgbm90IE5vbmU6CiAgICAgICAgc3lzLnN0ZGVyciA9IG9yaWdfc3RkZXJyCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIGNvbG9yYW1hX3RleHQoKmFyZ3MsICoqa3dhcmdzKToKICAgIGluaXQoKmFyZ3MsICoqa3dhcmdzKQogICAgdHJ5OgogICAgICAgIHlpZWxkCiAgICBmaW5hbGx5OgogICAgICAgIGRlaW5pdCgpCgoKZGVmIHJlaW5pdCgpOgogICAgaWYgd3JhcHBlZF9zdGRvdXQgaXMgbm90IE5vbmU6CiAgICAgICAgc3lzLnN0ZG91dCA9IHdyYXBwZWRfc3Rkb3V0CiAgICBpZiB3cmFwcGVkX3N0ZGVyciBpcyBub3QgTm9uZToKICAgICAgICBzeXMuc3RkZXJyID0gd3JhcHBlZF9zdGRlcnIKCgpkZWYgd3JhcF9zdHJlYW0oc3RyZWFtLCBjb252ZXJ0LCBzdHJpcCwgYXV0b3Jlc2V0LCB3cmFwKToKICAgIGlmIHdyYXA6CiAgICAgICAgd3JhcHBlciA9IEFuc2lUb1dpbjMyKHN0cmVhbSwKICAgICAgICAgICAgY29udmVydD1jb252ZXJ0LCBzdHJpcD1zdHJpcCwgYXV0b3Jlc2V0PWF1dG9yZXNldCkKICAgICAgICBpZiB3cmFwcGVyLnNob3VsZF93cmFwKCk6CiAgICAgICAgICAgIHN0cmVhbSA9IHdyYXBwZXIuc3RyZWFtCiAgICByZXR1cm4gc3RyZWFtCgoKUEsDBBQAAAAAAAAAIQANbaI99RQAAPUUAAAtAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL3dpbjMyLnB5IyBDb3B5cmlnaHQgSm9uYXRoYW4gSGFydGxleSAyMDEzLiBCU0QgMy1DbGF1c2UgbGljZW5zZSwgc2VlIExJQ0VOU0UgZmlsZS4KCiMgZnJvbSB3aW5iYXNlLmgKU1RET1VUID0gLTExClNUREVSUiA9IC0xMgoKdHJ5OgogICAgaW1wb3J0IGN0eXBlcwogICAgZnJvbSBjdHlwZXMgaW1wb3J0IExpYnJhcnlMb2FkZXIKICAgIHdpbmRsbCA9IExpYnJhcnlMb2FkZXIoY3R5cGVzLldpbkRMTCkKICAgIGZyb20gY3R5cGVzIGltcG9ydCB3aW50eXBlcwpleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBJbXBvcnRFcnJvcik6CiAgICB3aW5kbGwgPSBOb25lCiAgICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZSA9IGxhbWJkYSAqXzogTm9uZQogICAgd2luYXBpX3Rlc3QgPSBsYW1iZGEgKl86IE5vbmUKZWxzZToKICAgIGZyb20gY3R5cGVzIGltcG9ydCBieXJlZiwgU3RydWN0dXJlLCBjX2NoYXIsIFBPSU5URVIKCiAgICBDT09SRCA9IHdpbnR5cGVzLl9DT09SRAoKICAgIGNsYXNzIENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPKFN0cnVjdHVyZSk6CiAgICAgICAgIiIic3RydWN0IGluIHdpbmNvbi5oLiIiIgogICAgICAgIF9maWVsZHNfID0gWwogICAgICAgICAgICAoImR3U2l6ZSIsIENPT1JEKSwKICAgICAgICAgICAgKCJkd0N1cnNvclBvc2l0aW9uIiwgQ09PUkQpLAogICAgICAgICAgICAoIndBdHRyaWJ1dGVzIiwgd2ludHlwZXMuV09SRCksCiAgICAgICAgICAgICgic3JXaW5kb3ciLCB3aW50eXBlcy5TTUFMTF9SRUNUKSwKICAgICAgICAgICAgKCJkd01heGltdW1XaW5kb3dTaXplIiwgQ09PUkQpLAogICAgICAgIF0KICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuICcoJWQsJWQsJWQsJWQsJWQsJWQsJWQsJWQsJWQsJWQsJWQpJyAlICgKICAgICAgICAgICAgICAgIHNlbGYuZHdTaXplLlksIHNlbGYuZHdTaXplLlgKICAgICAgICAgICAgICAgICwgc2VsZi5kd0N1cnNvclBvc2l0aW9uLlksIHNlbGYuZHdDdXJzb3JQb3NpdGlvbi5YCiAgICAgICAgICAgICAgICAsIHNlbGYud0F0dHJpYnV0ZXMKICAgICAgICAgICAgICAgICwgc2VsZi5zcldpbmRvdy5Ub3AsIHNlbGYuc3JXaW5kb3cuTGVmdCwgc2VsZi5zcldpbmRvdy5Cb3R0b20sIHNlbGYuc3JXaW5kb3cuUmlnaHQKICAgICAgICAgICAgICAgICwgc2VsZi5kd01heGltdW1XaW5kb3dTaXplLlksIHNlbGYuZHdNYXhpbXVtV2luZG93U2l6ZS5YCiAgICAgICAgICAgICkKCiAgICBfR2V0U3RkSGFuZGxlID0gd2luZGxsLmtlcm5lbDMyLkdldFN0ZEhhbmRsZQogICAgX0dldFN0ZEhhbmRsZS5hcmd0eXBlcyA9IFsKICAgICAgICB3aW50eXBlcy5EV09SRCwKICAgIF0KICAgIF9HZXRTdGRIYW5kbGUucmVzdHlwZSA9IHdpbnR5cGVzLkhBTkRMRQoKICAgIF9HZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyA9IHdpbmRsbC5rZXJuZWwzMi5HZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbwogICAgX0dldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvLmFyZ3R5cGVzID0gWwogICAgICAgIHdpbnR5cGVzLkhBTkRMRSwKICAgICAgICBQT0lOVEVSKENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPKSwKICAgIF0KICAgIF9HZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mby5yZXN0eXBlID0gd2ludHlwZXMuQk9PTAoKICAgIF9TZXRDb25zb2xlVGV4dEF0dHJpYnV0ZSA9IHdpbmRsbC5rZXJuZWwzMi5TZXRDb25zb2xlVGV4dEF0dHJpYnV0ZQogICAgX1NldENvbnNvbGVUZXh0QXR0cmlidXRlLmFyZ3R5cGVzID0gWwogICAgICAgIHdpbnR5cGVzLkhBTkRMRSwKICAgICAgICB3aW50eXBlcy5XT1JELAogICAgXQogICAgX1NldENvbnNvbGVUZXh0QXR0cmlidXRlLnJlc3R5cGUgPSB3aW50eXBlcy5CT09MCgogICAgX1NldENvbnNvbGVDdXJzb3JQb3NpdGlvbiA9IHdpbmRsbC5rZXJuZWwzMi5TZXRDb25zb2xlQ3Vyc29yUG9zaXRpb24KICAgIF9TZXRDb25zb2xlQ3Vyc29yUG9zaXRpb24uYXJndHlwZXMgPSBbCiAgICAgICAgd2ludHlwZXMuSEFORExFLAogICAgICAgIENPT1JELAogICAgXQogICAgX1NldENvbnNvbGVDdXJzb3JQb3NpdGlvbi5yZXN0eXBlID0gd2ludHlwZXMuQk9PTAoKICAgIF9GaWxsQ29uc29sZU91dHB1dENoYXJhY3RlckEgPSB3aW5kbGwua2VybmVsMzIuRmlsbENvbnNvbGVPdXRwdXRDaGFyYWN0ZXJBCiAgICBfRmlsbENvbnNvbGVPdXRwdXRDaGFyYWN0ZXJBLmFyZ3R5cGVzID0gWwogICAgICAgIHdpbnR5cGVzLkhBTkRMRSwKICAgICAgICBjX2NoYXIsCiAgICAgICAgd2ludHlwZXMuRFdPUkQsCiAgICAgICAgQ09PUkQsCiAgICAgICAgUE9JTlRFUih3aW50eXBlcy5EV09SRCksCiAgICBdCiAgICBfRmlsbENvbnNvbGVPdXRwdXRDaGFyYWN0ZXJBLnJlc3R5cGUgPSB3aW50eXBlcy5CT09MCgogICAgX0ZpbGxDb25zb2xlT3V0cHV0QXR0cmlidXRlID0gd2luZGxsLmtlcm5lbDMyLkZpbGxDb25zb2xlT3V0cHV0QXR0cmlidXRlCiAgICBfRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUuYXJndHlwZXMgPSBbCiAgICAgICAgd2ludHlwZXMuSEFORExFLAogICAgICAgIHdpbnR5cGVzLldPUkQsCiAgICAgICAgd2ludHlwZXMuRFdPUkQsCiAgICAgICAgQ09PUkQsCiAgICAgICAgUE9JTlRFUih3aW50eXBlcy5EV09SRCksCiAgICBdCiAgICBfRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUucmVzdHlwZSA9IHdpbnR5cGVzLkJPT0wKCiAgICBfU2V0Q29uc29sZVRpdGxlVyA9IHdpbmRsbC5rZXJuZWwzMi5TZXRDb25zb2xlVGl0bGVBCiAgICBfU2V0Q29uc29sZVRpdGxlVy5hcmd0eXBlcyA9IFsKICAgICAgICB3aW50eXBlcy5MUENTVFIKICAgIF0KICAgIF9TZXRDb25zb2xlVGl0bGVXLnJlc3R5cGUgPSB3aW50eXBlcy5CT09MCgogICAgaGFuZGxlcyA9IHsKICAgICAgICBTVERPVVQ6IF9HZXRTdGRIYW5kbGUoU1RET1VUKSwKICAgICAgICBTVERFUlI6IF9HZXRTdGRIYW5kbGUoU1RERVJSKSwKICAgIH0KCiAgICBkZWYgd2luYXBpX3Rlc3QoKToKICAgICAgICBoYW5kbGUgPSBoYW5kbGVzW1NURE9VVF0KICAgICAgICBjc2JpID0gQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8oKQogICAgICAgIHN1Y2Nlc3MgPSBfR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oCiAgICAgICAgICAgIGhhbmRsZSwgYnlyZWYoY3NiaSkpCiAgICAgICAgcmV0dXJuIGJvb2woc3VjY2VzcykKCiAgICBkZWYgR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oc3RyZWFtX2lkPVNURE9VVCk6CiAgICAgICAgaGFuZGxlID0gaGFuZGxlc1tzdHJlYW1faWRdCiAgICAgICAgY3NiaSA9IENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPKCkKICAgICAgICBzdWNjZXNzID0gX0dldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKAogICAgICAgICAgICBoYW5kbGUsIGJ5cmVmKGNzYmkpKQogICAgICAgIHJldHVybiBjc2JpCgogICAgZGVmIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKHN0cmVhbV9pZCwgYXR0cnMpOgogICAgICAgIGhhbmRsZSA9IGhhbmRsZXNbc3RyZWFtX2lkXQogICAgICAgIHJldHVybiBfU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoaGFuZGxlLCBhdHRycykKCiAgICBkZWYgU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uKHN0cmVhbV9pZCwgcG9zaXRpb24sIGFkanVzdD1UcnVlKToKICAgICAgICBwb3NpdGlvbiA9IENPT1JEKCpwb3NpdGlvbikKICAgICAgICAjIElmIHRoZSBwb3NpdGlvbiBpcyBvdXQgb2YgcmFuZ2UsIGRvIG5vdGhpbmcuCiAgICAgICAgaWYgcG9zaXRpb24uWSA8PSAwIG9yIHBvc2l0aW9uLlggPD0gMDoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIyBBZGp1c3QgZm9yIFdpbmRvd3MnIFNldENvbnNvbGVDdXJzb3JQb3NpdGlvbjoKICAgICAgICAjICAgIDEuIGJlaW5nIDAtYmFzZWQsIHdoaWxlIEFOU0kgaXMgMS1iYXNlZC4KICAgICAgICAjICAgIDIuIGV4cGVjdGluZyAoeCx5KSwgd2hpbGUgQU5TSSB1c2VzICh5LHgpLgogICAgICAgIGFkanVzdGVkX3Bvc2l0aW9uID0gQ09PUkQocG9zaXRpb24uWSAtIDEsIHBvc2l0aW9uLlggLSAxKQogICAgICAgIGlmIGFkanVzdDoKICAgICAgICAgICAgIyBBZGp1c3QgZm9yIHZpZXdwb3J0J3Mgc2Nyb2xsIHBvc2l0aW9uCiAgICAgICAgICAgIHNyID0gR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oU1RET1VUKS5zcldpbmRvdwogICAgICAgICAgICBhZGp1c3RlZF9wb3NpdGlvbi5ZICs9IHNyLlRvcAogICAgICAgICAgICBhZGp1c3RlZF9wb3NpdGlvbi5YICs9IHNyLkxlZnQKICAgICAgICAjIFJlc3VtZSBub3JtYWwgcHJvY2Vzc2luZwogICAgICAgIGhhbmRsZSA9IGhhbmRsZXNbc3RyZWFtX2lkXQogICAgICAgIHJldHVybiBfU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uKGhhbmRsZSwgYWRqdXN0ZWRfcG9zaXRpb24pCgogICAgZGVmIEZpbGxDb25zb2xlT3V0cHV0Q2hhcmFjdGVyKHN0cmVhbV9pZCwgY2hhciwgbGVuZ3RoLCBzdGFydCk6CiAgICAgICAgaGFuZGxlID0gaGFuZGxlc1tzdHJlYW1faWRdCiAgICAgICAgY2hhciA9IGNfY2hhcihjaGFyLmVuY29kZSgpKQogICAgICAgIGxlbmd0aCA9IHdpbnR5cGVzLkRXT1JEKGxlbmd0aCkKICAgICAgICBudW1fd3JpdHRlbiA9IHdpbnR5cGVzLkRXT1JEKDApCiAgICAgICAgIyBOb3RlIHRoYXQgdGhpcyBpcyBoYXJkLWNvZGVkIGZvciBBTlNJICh2cyB3aWRlKSBieXRlcy4KICAgICAgICBzdWNjZXNzID0gX0ZpbGxDb25zb2xlT3V0cHV0Q2hhcmFjdGVyQSgKICAgICAgICAgICAgaGFuZGxlLCBjaGFyLCBsZW5ndGgsIHN0YXJ0LCBieXJlZihudW1fd3JpdHRlbikpCiAgICAgICAgcmV0dXJuIG51bV93cml0dGVuLnZhbHVlCgogICAgZGVmIEZpbGxDb25zb2xlT3V0cHV0QXR0cmlidXRlKHN0cmVhbV9pZCwgYXR0ciwgbGVuZ3RoLCBzdGFydCk6CiAgICAgICAgJycnIEZpbGxDb25zb2xlT3V0cHV0QXR0cmlidXRlKCBoQ29uc29sZSwgY3NiaS53QXR0cmlidXRlcywgZHdDb25TaXplLCBjb29yZFNjcmVlbiwgJmNDaGFyc1dyaXR0ZW4gKScnJwogICAgICAgIGhhbmRsZSA9IGhhbmRsZXNbc3RyZWFtX2lkXQogICAgICAgIGF0dHJpYnV0ZSA9IHdpbnR5cGVzLldPUkQoYXR0cikKICAgICAgICBsZW5ndGggPSB3aW50eXBlcy5EV09SRChsZW5ndGgpCiAgICAgICAgbnVtX3dyaXR0ZW4gPSB3aW50eXBlcy5EV09SRCgwKQogICAgICAgICMgTm90ZSB0aGF0IHRoaXMgaXMgaGFyZC1jb2RlZCBmb3IgQU5TSSAodnMgd2lkZSkgYnl0ZXMuCiAgICAgICAgcmV0dXJuIF9GaWxsQ29uc29sZU91dHB1dEF0dHJpYnV0ZSgKICAgICAgICAgICAgaGFuZGxlLCBhdHRyaWJ1dGUsIGxlbmd0aCwgc3RhcnQsIGJ5cmVmKG51bV93cml0dGVuKSkKCiAgICBkZWYgU2V0Q29uc29sZVRpdGxlKHRpdGxlKToKICAgICAgICByZXR1cm4gX1NldENvbnNvbGVUaXRsZVcodGl0bGUpClBLAwQUAAAAAAAAACEAd3tnIZIYAACSGAAALwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jb2xvcmFtYS93aW50ZXJtLnB5IyBDb3B5cmlnaHQgSm9uYXRoYW4gSGFydGxleSAyMDEzLiBCU0QgMy1DbGF1c2UgbGljZW5zZSwgc2VlIExJQ0VOU0UgZmlsZS4KZnJvbSAuIGltcG9ydCB3aW4zMgoKCiMgZnJvbSB3aW5jb24uaApjbGFzcyBXaW5Db2xvcihvYmplY3QpOgogICAgQkxBQ0sgICA9IDAKICAgIEJMVUUgICAgPSAxCiAgICBHUkVFTiAgID0gMgogICAgQ1lBTiAgICA9IDMKICAgIFJFRCAgICAgPSA0CiAgICBNQUdFTlRBID0gNQogICAgWUVMTE9XICA9IDYKICAgIEdSRVkgICAgPSA3CgojIGZyb20gd2luY29uLmgKY2xhc3MgV2luU3R5bGUob2JqZWN0KToKICAgIE5PUk1BTCAgICAgICAgICAgICAgPSAweDAwICMgZGltIHRleHQsIGRpbSBiYWNrZ3JvdW5kCiAgICBCUklHSFQgICAgICAgICAgICAgID0gMHgwOCAjIGJyaWdodCB0ZXh0LCBkaW0gYmFja2dyb3VuZAogICAgQlJJR0hUX0JBQ0tHUk9VTkQgICA9IDB4ODAgIyBkaW0gdGV4dCwgYnJpZ2h0IGJhY2tncm91bmQKCmNsYXNzIFdpblRlcm0ob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5fZGVmYXVsdCA9IHdpbjMyLkdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKHdpbjMyLlNURE9VVCkud0F0dHJpYnV0ZXMKICAgICAgICBzZWxmLnNldF9hdHRycyhzZWxmLl9kZWZhdWx0KQogICAgICAgIHNlbGYuX2RlZmF1bHRfZm9yZSA9IHNlbGYuX2ZvcmUKICAgICAgICBzZWxmLl9kZWZhdWx0X2JhY2sgPSBzZWxmLl9iYWNrCiAgICAgICAgc2VsZi5fZGVmYXVsdF9zdHlsZSA9IHNlbGYuX3N0eWxlCiAgICAgICAgIyBJbiBvcmRlciB0byBlbXVsYXRlIExJR0hUX0VYIGluIHdpbmRvd3MsIHdlIGJvcnJvdyB0aGUgQlJJR0hUIHN0eWxlLgogICAgICAgICMgU28gdGhhdCBMSUdIVF9FWCBjb2xvcnMgYW5kIEJSSUdIVCBzdHlsZSBkbyBub3QgY2xvYmJlciBlYWNoIG90aGVyLAogICAgICAgICMgd2UgdHJhY2sgdGhlbSBzZXBhcmF0ZWx5LCBzaW5jZSBMSUdIVF9FWCBpcyBvdmVyd3JpdHRlbiBieSBGb3JlL0JhY2sKICAgICAgICAjIGFuZCBCUklHSFQgaXMgb3ZlcndyaXR0ZW4gYnkgU3R5bGUgY29kZXMuCiAgICAgICAgc2VsZi5fbGlnaHQgPSAwCgogICAgZGVmIGdldF9hdHRycyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fZm9yZSArIHNlbGYuX2JhY2sgKiAxNiArIChzZWxmLl9zdHlsZSB8IHNlbGYuX2xpZ2h0KQoKICAgIGRlZiBzZXRfYXR0cnMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX2ZvcmUgPSB2YWx1ZSAmIDcKICAgICAgICBzZWxmLl9iYWNrID0gKHZhbHVlID4+IDQpICYgNwogICAgICAgIHNlbGYuX3N0eWxlID0gdmFsdWUgJiAoV2luU3R5bGUuQlJJR0hUIHwgV2luU3R5bGUuQlJJR0hUX0JBQ0tHUk9VTkQpCgogICAgZGVmIHJlc2V0X2FsbChzZWxmLCBvbl9zdGRlcnI9Tm9uZSk6CiAgICAgICAgc2VsZi5zZXRfYXR0cnMoc2VsZi5fZGVmYXVsdCkKICAgICAgICBzZWxmLnNldF9jb25zb2xlKGF0dHJzPXNlbGYuX2RlZmF1bHQpCgogICAgZGVmIGZvcmUoc2VsZiwgZm9yZT1Ob25lLCBsaWdodD1GYWxzZSwgb25fc3RkZXJyPUZhbHNlKToKICAgICAgICBpZiBmb3JlIGlzIE5vbmU6CiAgICAgICAgICAgIGZvcmUgPSBzZWxmLl9kZWZhdWx0X2ZvcmUKICAgICAgICBzZWxmLl9mb3JlID0gZm9yZQogICAgICAgICMgRW11bGF0ZSBMSUdIVF9FWCB3aXRoIEJSSUdIVCBTdHlsZQogICAgICAgIGlmIGxpZ2h0OgogICAgICAgICAgICBzZWxmLl9saWdodCB8PSBXaW5TdHlsZS5CUklHSFQKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9saWdodCAmPSB+V2luU3R5bGUuQlJJR0hUCiAgICAgICAgc2VsZi5zZXRfY29uc29sZShvbl9zdGRlcnI9b25fc3RkZXJyKQoKICAgIGRlZiBiYWNrKHNlbGYsIGJhY2s9Tm9uZSwgbGlnaHQ9RmFsc2UsIG9uX3N0ZGVycj1GYWxzZSk6CiAgICAgICAgaWYgYmFjayBpcyBOb25lOgogICAgICAgICAgICBiYWNrID0gc2VsZi5fZGVmYXVsdF9iYWNrCiAgICAgICAgc2VsZi5fYmFjayA9IGJhY2sKICAgICAgICAjIEVtdWxhdGUgTElHSFRfRVggd2l0aCBCUklHSFRfQkFDS0dST1VORCBTdHlsZQogICAgICAgIGlmIGxpZ2h0OgogICAgICAgICAgICBzZWxmLl9saWdodCB8PSBXaW5TdHlsZS5CUklHSFRfQkFDS0dST1VORAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX2xpZ2h0ICY9IH5XaW5TdHlsZS5CUklHSFRfQkFDS0dST1VORAogICAgICAgIHNlbGYuc2V0X2NvbnNvbGUob25fc3RkZXJyPW9uX3N0ZGVycikKCiAgICBkZWYgc3R5bGUoc2VsZiwgc3R5bGU9Tm9uZSwgb25fc3RkZXJyPUZhbHNlKToKICAgICAgICBpZiBzdHlsZSBpcyBOb25lOgogICAgICAgICAgICBzdHlsZSA9IHNlbGYuX2RlZmF1bHRfc3R5bGUKICAgICAgICBzZWxmLl9zdHlsZSA9IHN0eWxlCiAgICAgICAgc2VsZi5zZXRfY29uc29sZShvbl9zdGRlcnI9b25fc3RkZXJyKQoKICAgIGRlZiBzZXRfY29uc29sZShzZWxmLCBhdHRycz1Ob25lLCBvbl9zdGRlcnI9RmFsc2UpOgogICAgICAgIGlmIGF0dHJzIGlzIE5vbmU6CiAgICAgICAgICAgIGF0dHJzID0gc2VsZi5nZXRfYXR0cnMoKQogICAgICAgIGhhbmRsZSA9IHdpbjMyLlNURE9VVAogICAgICAgIGlmIG9uX3N0ZGVycjoKICAgICAgICAgICAgaGFuZGxlID0gd2luMzIuU1RERVJSCiAgICAgICAgd2luMzIuU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoaGFuZGxlLCBhdHRycykKCiAgICBkZWYgZ2V0X3Bvc2l0aW9uKHNlbGYsIGhhbmRsZSk6CiAgICAgICAgcG9zaXRpb24gPSB3aW4zMi5HZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhoYW5kbGUpLmR3Q3Vyc29yUG9zaXRpb24KICAgICAgICAjIEJlY2F1c2UgV2luZG93cyBjb29yZGluYXRlcyBhcmUgMC1iYXNlZCwKICAgICAgICAjIGFuZCB3aW4zMi5TZXRDb25zb2xlQ3Vyc29yUG9zaXRpb24gZXhwZWN0cyAxLWJhc2VkLgogICAgICAgIHBvc2l0aW9uLlggKz0gMQogICAgICAgIHBvc2l0aW9uLlkgKz0gMQogICAgICAgIHJldHVybiBwb3NpdGlvbgoKICAgIGRlZiBzZXRfY3Vyc29yX3Bvc2l0aW9uKHNlbGYsIHBvc2l0aW9uPU5vbmUsIG9uX3N0ZGVycj1GYWxzZSk6CiAgICAgICAgaWYgcG9zaXRpb24gaXMgTm9uZToKICAgICAgICAgICAgIyBJJ20gbm90IGN1cnJlbnRseSB0cmFja2luZyB0aGUgcG9zaXRpb24sIHNvIHRoZXJlIGlzIG5vIGRlZmF1bHQuCiAgICAgICAgICAgICMgcG9zaXRpb24gPSBzZWxmLmdldF9wb3NpdGlvbigpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGhhbmRsZSA9IHdpbjMyLlNURE9VVAogICAgICAgIGlmIG9uX3N0ZGVycjoKICAgICAgICAgICAgaGFuZGxlID0gd2luMzIuU1RERVJSCiAgICAgICAgd2luMzIuU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uKGhhbmRsZSwgcG9zaXRpb24pCgogICAgZGVmIGN1cnNvcl9hZGp1c3Qoc2VsZiwgeCwgeSwgb25fc3RkZXJyPUZhbHNlKToKICAgICAgICBoYW5kbGUgPSB3aW4zMi5TVERPVVQKICAgICAgICBpZiBvbl9zdGRlcnI6CiAgICAgICAgICAgIGhhbmRsZSA9IHdpbjMyLlNUREVSUgogICAgICAgIHBvc2l0aW9uID0gc2VsZi5nZXRfcG9zaXRpb24oaGFuZGxlKQogICAgICAgIGFkanVzdGVkX3Bvc2l0aW9uID0gKHBvc2l0aW9uLlkgKyB5LCBwb3NpdGlvbi5YICsgeCkKICAgICAgICB3aW4zMi5TZXRDb25zb2xlQ3Vyc29yUG9zaXRpb24oaGFuZGxlLCBhZGp1c3RlZF9wb3NpdGlvbiwgYWRqdXN0PUZhbHNlKQoKICAgIGRlZiBlcmFzZV9zY3JlZW4oc2VsZiwgbW9kZT0wLCBvbl9zdGRlcnI9RmFsc2UpOgogICAgICAgICMgMCBzaG91bGQgY2xlYXIgZnJvbSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIHNjcmVlbi4KICAgICAgICAjIDEgc2hvdWxkIGNsZWFyIGZyb20gdGhlIGN1cnNvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzY3JlZW4uCiAgICAgICAgIyAyIHNob3VsZCBjbGVhciB0aGUgZW50aXJlIHNjcmVlbiwgYW5kIG1vdmUgY3Vyc29yIHRvICgxLDEpCiAgICAgICAgaGFuZGxlID0gd2luMzIuU1RET1VUCiAgICAgICAgaWYgb25fc3RkZXJyOgogICAgICAgICAgICBoYW5kbGUgPSB3aW4zMi5TVERFUlIKICAgICAgICBjc2JpID0gd2luMzIuR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oaGFuZGxlKQogICAgICAgICMgZ2V0IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVyIGNlbGxzIGluIHRoZSBjdXJyZW50IGJ1ZmZlcgogICAgICAgIGNlbGxzX2luX3NjcmVlbiA9IGNzYmkuZHdTaXplLlggKiBjc2JpLmR3U2l6ZS5ZCiAgICAgICAgIyBnZXQgbnVtYmVyIG9mIGNoYXJhY3RlciBjZWxscyBiZWZvcmUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24KICAgICAgICBjZWxsc19iZWZvcmVfY3Vyc29yID0gY3NiaS5kd1NpemUuWCAqIGNzYmkuZHdDdXJzb3JQb3NpdGlvbi5ZICsgY3NiaS5kd0N1cnNvclBvc2l0aW9uLlgKICAgICAgICBpZiBtb2RlID09IDA6CiAgICAgICAgICAgIGZyb21fY29vcmQgPSBjc2JpLmR3Q3Vyc29yUG9zaXRpb24KICAgICAgICAgICAgY2VsbHNfdG9fZXJhc2UgPSBjZWxsc19pbl9zY3JlZW4gLSBjZWxsc19iZWZvcmVfY3Vyc29yCiAgICAgICAgaWYgbW9kZSA9PSAxOgogICAgICAgICAgICBmcm9tX2Nvb3JkID0gd2luMzIuQ09PUkQoMCwgMCkKICAgICAgICAgICAgY2VsbHNfdG9fZXJhc2UgPSBjZWxsc19iZWZvcmVfY3Vyc29yCiAgICAgICAgZWxpZiBtb2RlID09IDI6CiAgICAgICAgICAgIGZyb21fY29vcmQgPSB3aW4zMi5DT09SRCgwLCAwKQogICAgICAgICAgICBjZWxsc190b19lcmFzZSA9IGNlbGxzX2luX3NjcmVlbgogICAgICAgICMgZmlsbCB0aGUgZW50aXJlIHNjcmVlbiB3aXRoIGJsYW5rcwogICAgICAgIHdpbjMyLkZpbGxDb25zb2xlT3V0cHV0Q2hhcmFjdGVyKGhhbmRsZSwgJyAnLCBjZWxsc190b19lcmFzZSwgZnJvbV9jb29yZCkKICAgICAgICAjIG5vdyBzZXQgdGhlIGJ1ZmZlcidzIGF0dHJpYnV0ZXMgYWNjb3JkaW5nbHkKICAgICAgICB3aW4zMi5GaWxsQ29uc29sZU91dHB1dEF0dHJpYnV0ZShoYW5kbGUsIHNlbGYuZ2V0X2F0dHJzKCksIGNlbGxzX3RvX2VyYXNlLCBmcm9tX2Nvb3JkKQogICAgICAgIGlmIG1vZGUgPT0gMjoKICAgICAgICAgICAgIyBwdXQgdGhlIGN1cnNvciB3aGVyZSBuZWVkZWQKICAgICAgICAgICAgd2luMzIuU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uKGhhbmRsZSwgKDEsIDEpKQoKICAgIGRlZiBlcmFzZV9saW5lKHNlbGYsIG1vZGU9MCwgb25fc3RkZXJyPUZhbHNlKToKICAgICAgICAjIDAgc2hvdWxkIGNsZWFyIGZyb20gdGhlIGN1cnNvciB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLgogICAgICAgICMgMSBzaG91bGQgY2xlYXIgZnJvbSB0aGUgY3Vyc29yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUuCiAgICAgICAgIyAyIHNob3VsZCBjbGVhciB0aGUgZW50aXJlIGxpbmUuCiAgICAgICAgaGFuZGxlID0gd2luMzIuU1RET1VUCiAgICAgICAgaWYgb25fc3RkZXJyOgogICAgICAgICAgICBoYW5kbGUgPSB3aW4zMi5TVERFUlIKICAgICAgICBjc2JpID0gd2luMzIuR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oaGFuZGxlKQogICAgICAgIGlmIG1vZGUgPT0gMDoKICAgICAgICAgICAgZnJvbV9jb29yZCA9IGNzYmkuZHdDdXJzb3JQb3NpdGlvbgogICAgICAgICAgICBjZWxsc190b19lcmFzZSA9IGNzYmkuZHdTaXplLlggLSBjc2JpLmR3Q3Vyc29yUG9zaXRpb24uWAogICAgICAgIGlmIG1vZGUgPT0gMToKICAgICAgICAgICAgZnJvbV9jb29yZCA9IHdpbjMyLkNPT1JEKDAsIGNzYmkuZHdDdXJzb3JQb3NpdGlvbi5ZKQogICAgICAgICAgICBjZWxsc190b19lcmFzZSA9IGNzYmkuZHdDdXJzb3JQb3NpdGlvbi5YCiAgICAgICAgZWxpZiBtb2RlID09IDI6CiAgICAgICAgICAgIGZyb21fY29vcmQgPSB3aW4zMi5DT09SRCgwLCBjc2JpLmR3Q3Vyc29yUG9zaXRpb24uWSkKICAgICAgICAgICAgY2VsbHNfdG9fZXJhc2UgPSBjc2JpLmR3U2l6ZS5YCiAgICAgICAgIyBmaWxsIHRoZSBlbnRpcmUgc2NyZWVuIHdpdGggYmxhbmtzCiAgICAgICAgd2luMzIuRmlsbENvbnNvbGVPdXRwdXRDaGFyYWN0ZXIoaGFuZGxlLCAnICcsIGNlbGxzX3RvX2VyYXNlLCBmcm9tX2Nvb3JkKQogICAgICAgICMgbm93IHNldCB0aGUgYnVmZmVyJ3MgYXR0cmlidXRlcyBhY2NvcmRpbmdseQogICAgICAgIHdpbjMyLkZpbGxDb25zb2xlT3V0cHV0QXR0cmlidXRlKGhhbmRsZSwgc2VsZi5nZXRfYXR0cnMoKSwgY2VsbHNfdG9fZXJhc2UsIGZyb21fY29vcmQpCgogICAgZGVmIHNldF90aXRsZShzZWxmLCB0aXRsZSk6CiAgICAgICAgd2luMzIuU2V0Q29uc29sZVRpdGxlKHRpdGxlKQpQSwMEFAAAAAAAAAAhACacUZdFAgAARQIAAC8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fX2luaXRfXy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNiBWaW5heSBTYWppcC4KIyBMaWNlbnNlZCB0byB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgYSBjb250cmlidXRvciBhZ3JlZW1lbnQuCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCmltcG9ydCBsb2dnaW5nCgpfX3ZlcnNpb25fXyA9ICcwLjIuNCcKCmNsYXNzIERpc3RsaWJFeGNlcHRpb24oRXhjZXB0aW9uKToKICAgIHBhc3MKCnRyeToKICAgIGZyb20gbG9nZ2luZyBpbXBvcnQgTnVsbEhhbmRsZXIKZXhjZXB0IEltcG9ydEVycm9yOiAjIHByYWdtYTogbm8gY292ZXIKICAgIGNsYXNzIE51bGxIYW5kbGVyKGxvZ2dpbmcuSGFuZGxlcik6CiAgICAgICAgZGVmIGhhbmRsZShzZWxmLCByZWNvcmQpOiBwYXNzCiAgICAgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKTogcGFzcwogICAgICAgIGRlZiBjcmVhdGVMb2NrKHNlbGYpOiBzZWxmLmxvY2sgPSBOb25lCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKbG9nZ2VyLmFkZEhhbmRsZXIoTnVsbEhhbmRsZXIoKSkKUEsDBBQAAAAAAAAAIQAj72f8EgEAABIBAAA5AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L19faW5pdF9fLnB5IiIiTW9kdWxlcyBjb3BpZWQgZnJvbSBQeXRob24gMyBzdGFuZGFyZCBsaWJyYXJpZXMsIGZvciBpbnRlcm5hbCB1c2Ugb25seS4KCkluZGl2aWR1YWwgY2xhc3NlcyBhbmQgZnVuY3Rpb25zIGFyZSBmb3VuZCBpbiBkMi5fYmFja3BvcnQubWlzYy4gIEludGVuZGVkCnVzYWdlIGlzIHRvIGFsd2F5cyBpbXBvcnQgdGhpbmdzIG1pc3NpbmcgZnJvbSAzLjEgZnJvbSB0aGF0IG1vZHVsZTogdGhlCmJ1aWx0LWluL3N0ZGxpYiBvYmplY3RzIHdpbGwgYmUgdXNlZCBpZiBmb3VuZC4KIiIiClBLAwQUAAAAAAAAACEAr4ovZcsDAADLAwAANQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9taXNjLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMiBUaGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCiIiIkJhY2twb3J0cyBmb3IgaW5kaXZpZHVhbCBjbGFzc2VzIGFuZCBmdW5jdGlvbnMuIiIiCgppbXBvcnQgb3MKaW1wb3J0IHN5cwoKX19hbGxfXyA9IFsnY2FjaGVfZnJvbV9zb3VyY2UnLCAnY2FsbGFibGUnLCAnZnNlbmNvZGUnXQoKCnRyeToKICAgIGZyb20gaW1wIGltcG9ydCBjYWNoZV9mcm9tX3NvdXJjZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBkZWYgY2FjaGVfZnJvbV9zb3VyY2UocHlfZmlsZSwgZGVidWc9X19kZWJ1Z19fKToKICAgICAgICBleHQgPSBkZWJ1ZyBhbmQgJ2MnIG9yICdvJwogICAgICAgIHJldHVybiBweV9maWxlICsgZXh0CgoKdHJ5OgogICAgY2FsbGFibGUgPSBjYWxsYWJsZQpleGNlcHQgTmFtZUVycm9yOgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgQ2FsbGFibGUKCiAgICBkZWYgY2FsbGFibGUob2JqKToKICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvYmosIENhbGxhYmxlKQoKCnRyeToKICAgIGZzZW5jb2RlID0gb3MuZnNlbmNvZGUKZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgZGVmIGZzZW5jb2RlKGZpbGVuYW1lKToKICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCBieXRlcyk6CiAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgc3RyKToKICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lLmVuY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJleHBlY3QgYnl0ZXMgb3Igc3RyLCBub3QgJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUoZmlsZW5hbWUpLl9fbmFtZV9fKQpQSwMEFAAAAAAAAAAhAOJiPdAvZAAAL2QAADcAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvc2h1dGlsLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMiBUaGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCiIiIlV0aWxpdHkgZnVuY3Rpb25zIGZvciBjb3B5aW5nIGFuZCBhcmNoaXZpbmcgZmlsZXMgYW5kIGRpcmVjdG9yeSB0cmVlcy4KClhYWCBUaGUgZnVuY3Rpb25zIGhlcmUgZG9uJ3QgY29weSB0aGUgcmVzb3VyY2UgZm9yayBvciBvdGhlciBtZXRhZGF0YSBvbiBNYWMuCgoiIiIKCmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBzdGF0CmZyb20gb3MucGF0aCBpbXBvcnQgYWJzcGF0aAppbXBvcnQgZm5tYXRjaAppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IGVycm5vCmZyb20gLiBpbXBvcnQgdGFyZmlsZQoKdHJ5OgogICAgaW1wb3J0IGJ6MgogICAgX0JaMl9TVVBQT1JURUQgPSBUcnVlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIF9CWjJfU1VQUE9SVEVEID0gRmFsc2UKCnRyeToKICAgIGZyb20gcHdkIGltcG9ydCBnZXRwd25hbQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBnZXRwd25hbSA9IE5vbmUKCnRyeToKICAgIGZyb20gZ3JwIGltcG9ydCBnZXRncm5hbQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBnZXRncm5hbSA9IE5vbmUKCl9fYWxsX18gPSBbImNvcHlmaWxlb2JqIiwgImNvcHlmaWxlIiwgImNvcHltb2RlIiwgImNvcHlzdGF0IiwgImNvcHkiLCAiY29weTIiLAogICAgICAgICAgICJjb3B5dHJlZSIsICJtb3ZlIiwgInJtdHJlZSIsICJFcnJvciIsICJTcGVjaWFsRmlsZUVycm9yIiwKICAgICAgICAgICAiRXhlY0Vycm9yIiwgIm1ha2VfYXJjaGl2ZSIsICJnZXRfYXJjaGl2ZV9mb3JtYXRzIiwKICAgICAgICAgICAicmVnaXN0ZXJfYXJjaGl2ZV9mb3JtYXQiLCAidW5yZWdpc3Rlcl9hcmNoaXZlX2Zvcm1hdCIsCiAgICAgICAgICAgImdldF91bnBhY2tfZm9ybWF0cyIsICJyZWdpc3Rlcl91bnBhY2tfZm9ybWF0IiwKICAgICAgICAgICAidW5yZWdpc3Rlcl91bnBhY2tfZm9ybWF0IiwgInVucGFja19hcmNoaXZlIiwgImlnbm9yZV9wYXR0ZXJucyJdCgpjbGFzcyBFcnJvcihFbnZpcm9ubWVudEVycm9yKToKICAgIHBhc3MKCmNsYXNzIFNwZWNpYWxGaWxlRXJyb3IoRW52aXJvbm1lbnRFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiB0cnlpbmcgdG8gZG8gYSBraW5kIG9mIG9wZXJhdGlvbiAoZS5nLiBjb3B5aW5nKSB3aGljaCBpcwogICAgbm90IHN1cHBvcnRlZCBvbiBhIHNwZWNpYWwgZmlsZSAoZS5nLiBhIG5hbWVkIHBpcGUpIiIiCgpjbGFzcyBFeGVjRXJyb3IoRW52aXJvbm1lbnRFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiBhIGNvbW1hbmQgY291bGQgbm90IGJlIGV4ZWN1dGVkIiIiCgpjbGFzcyBSZWFkRXJyb3IoRW52aXJvbm1lbnRFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiBhbiBhcmNoaXZlIGNhbm5vdCBiZSByZWFkIiIiCgpjbGFzcyBSZWdpc3RyeUVycm9yKEV4Y2VwdGlvbik6CiAgICAiIiJSYWlzZWQgd2hlbiBhIHJlZ2lzdHJ5IG9wZXJhdGlvbiB3aXRoIHRoZSBhcmNoaXZpbmcKICAgIGFuZCB1bnBhY2tpbmcgcmVnaXN0cmllcyBmYWlscyIiIgoKCnRyeToKICAgIFdpbmRvd3NFcnJvcgpleGNlcHQgTmFtZUVycm9yOgogICAgV2luZG93c0Vycm9yID0gTm9uZQoKZGVmIGNvcHlmaWxlb2JqKGZzcmMsIGZkc3QsIGxlbmd0aD0xNioxMDI0KToKICAgICIiImNvcHkgZGF0YSBmcm9tIGZpbGUtbGlrZSBvYmplY3QgZnNyYyB0byBmaWxlLWxpa2Ugb2JqZWN0IGZkc3QiIiIKICAgIHdoaWxlIDE6CiAgICAgICAgYnVmID0gZnNyYy5yZWFkKGxlbmd0aCkKICAgICAgICBpZiBub3QgYnVmOgogICAgICAgICAgICBicmVhawogICAgICAgIGZkc3Qud3JpdGUoYnVmKQoKZGVmIF9zYW1lZmlsZShzcmMsIGRzdCk6CiAgICAjIE1hY2ludG9zaCwgVW5peC4KICAgIGlmIGhhc2F0dHIob3MucGF0aCwgJ3NhbWVmaWxlJyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gb3MucGF0aC5zYW1lZmlsZShzcmMsIGRzdCkKICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgIyBBbGwgb3RoZXIgcGxhdGZvcm1zOiBjaGVjayBmb3Igc2FtZSBwYXRobmFtZS4KICAgIHJldHVybiAob3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLmFic3BhdGgoc3JjKSkgPT0KICAgICAgICAgICAgb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLmFic3BhdGgoZHN0KSkpCgpkZWYgY29weWZpbGUoc3JjLCBkc3QpOgogICAgIiIiQ29weSBkYXRhIGZyb20gc3JjIHRvIGRzdCIiIgogICAgaWYgX3NhbWVmaWxlKHNyYywgZHN0KToKICAgICAgICByYWlzZSBFcnJvcigiYCVzYCBhbmQgYCVzYCBhcmUgdGhlIHNhbWUgZmlsZSIgJSAoc3JjLCBkc3QpKQoKICAgIGZvciBmbiBpbiBbc3JjLCBkc3RdOgogICAgICAgIHRyeToKICAgICAgICAgICAgc3QgPSBvcy5zdGF0KGZuKQogICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAjIEZpbGUgbW9zdCBsaWtlbHkgZG9lcyBub3QgZXhpc3QKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgWFhYIFdoYXQgYWJvdXQgb3RoZXIgc3BlY2lhbCBmaWxlcz8gKHNvY2tldHMsIGRldmljZXMuLi4pCiAgICAgICAgICAgIGlmIHN0YXQuU19JU0ZJRk8oc3Quc3RfbW9kZSk6CiAgICAgICAgICAgICAgICByYWlzZSBTcGVjaWFsRmlsZUVycm9yKCJgJXNgIGlzIGEgbmFtZWQgcGlwZSIgJSBmbikKCiAgICB3aXRoIG9wZW4oc3JjLCAncmInKSBhcyBmc3JjOgogICAgICAgIHdpdGggb3Blbihkc3QsICd3YicpIGFzIGZkc3Q6CiAgICAgICAgICAgIGNvcHlmaWxlb2JqKGZzcmMsIGZkc3QpCgpkZWYgY29weW1vZGUoc3JjLCBkc3QpOgogICAgIiIiQ29weSBtb2RlIGJpdHMgZnJvbSBzcmMgdG8gZHN0IiIiCiAgICBpZiBoYXNhdHRyKG9zLCAnY2htb2QnKToKICAgICAgICBzdCA9IG9zLnN0YXQoc3JjKQogICAgICAgIG1vZGUgPSBzdGF0LlNfSU1PREUoc3Quc3RfbW9kZSkKICAgICAgICBvcy5jaG1vZChkc3QsIG1vZGUpCgpkZWYgY29weXN0YXQoc3JjLCBkc3QpOgogICAgIiIiQ29weSBhbGwgc3RhdCBpbmZvIChtb2RlIGJpdHMsIGF0aW1lLCBtdGltZSwgZmxhZ3MpIGZyb20gc3JjIHRvIGRzdCIiIgogICAgc3QgPSBvcy5zdGF0KHNyYykKICAgIG1vZGUgPSBzdGF0LlNfSU1PREUoc3Quc3RfbW9kZSkKICAgIGlmIGhhc2F0dHIob3MsICd1dGltZScpOgogICAgICAgIG9zLnV0aW1lKGRzdCwgKHN0LnN0X2F0aW1lLCBzdC5zdF9tdGltZSkpCiAgICBpZiBoYXNhdHRyKG9zLCAnY2htb2QnKToKICAgICAgICBvcy5jaG1vZChkc3QsIG1vZGUpCiAgICBpZiBoYXNhdHRyKG9zLCAnY2hmbGFncycpIGFuZCBoYXNhdHRyKHN0LCAnc3RfZmxhZ3MnKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9zLmNoZmxhZ3MoZHN0LCBzdC5zdF9mbGFncykKICAgICAgICBleGNlcHQgT1NFcnJvciBhcyB3aHk6CiAgICAgICAgICAgIGlmIChub3QgaGFzYXR0cihlcnJubywgJ0VPUE5PVFNVUFAnKSBvcgogICAgICAgICAgICAgICAgd2h5LmVycm5vICE9IGVycm5vLkVPUE5PVFNVUFApOgogICAgICAgICAgICAgICAgcmFpc2UKCmRlZiBjb3B5KHNyYywgZHN0KToKICAgICIiIkNvcHkgZGF0YSBhbmQgbW9kZSBiaXRzICgiY3Agc3JjIGRzdCIpLgoKICAgIFRoZSBkZXN0aW5hdGlvbiBtYXkgYmUgYSBkaXJlY3RvcnkuCgogICAgIiIiCiAgICBpZiBvcy5wYXRoLmlzZGlyKGRzdCk6CiAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKGRzdCwgb3MucGF0aC5iYXNlbmFtZShzcmMpKQogICAgY29weWZpbGUoc3JjLCBkc3QpCiAgICBjb3B5bW9kZShzcmMsIGRzdCkKCmRlZiBjb3B5MihzcmMsIGRzdCk6CiAgICAiIiJDb3B5IGRhdGEgYW5kIGFsbCBzdGF0IGluZm8gKCJjcCAtcCBzcmMgZHN0IikuCgogICAgVGhlIGRlc3RpbmF0aW9uIG1heSBiZSBhIGRpcmVjdG9yeS4KCiAgICAiIiIKICAgIGlmIG9zLnBhdGguaXNkaXIoZHN0KToKICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oZHN0LCBvcy5wYXRoLmJhc2VuYW1lKHNyYykpCiAgICBjb3B5ZmlsZShzcmMsIGRzdCkKICAgIGNvcHlzdGF0KHNyYywgZHN0KQoKZGVmIGlnbm9yZV9wYXR0ZXJucygqcGF0dGVybnMpOgogICAgIiIiRnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBhcyBjb3B5dHJlZSgpIGlnbm9yZSBwYXJhbWV0ZXIuCgogICAgUGF0dGVybnMgaXMgYSBzZXF1ZW5jZSBvZiBnbG9iLXN0eWxlIHBhdHRlcm5zCiAgICB0aGF0IGFyZSB1c2VkIHRvIGV4Y2x1ZGUgZmlsZXMiIiIKICAgIGRlZiBfaWdub3JlX3BhdHRlcm5zKHBhdGgsIG5hbWVzKToKICAgICAgICBpZ25vcmVkX25hbWVzID0gW10KICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgaWdub3JlZF9uYW1lcy5leHRlbmQoZm5tYXRjaC5maWx0ZXIobmFtZXMsIHBhdHRlcm4pKQogICAgICAgIHJldHVybiBzZXQoaWdub3JlZF9uYW1lcykKICAgIHJldHVybiBfaWdub3JlX3BhdHRlcm5zCgpkZWYgY29weXRyZWUoc3JjLCBkc3QsIHN5bWxpbmtzPUZhbHNlLCBpZ25vcmU9Tm9uZSwgY29weV9mdW5jdGlvbj1jb3B5MiwKICAgICAgICAgICAgIGlnbm9yZV9kYW5nbGluZ19zeW1saW5rcz1GYWxzZSk6CiAgICAiIiJSZWN1cnNpdmVseSBjb3B5IGEgZGlyZWN0b3J5IHRyZWUuCgogICAgVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBtdXN0IG5vdCBhbHJlYWR5IGV4aXN0LgogICAgSWYgZXhjZXB0aW9uKHMpIG9jY3VyLCBhbiBFcnJvciBpcyByYWlzZWQgd2l0aCBhIGxpc3Qgb2YgcmVhc29ucy4KCiAgICBJZiB0aGUgb3B0aW9uYWwgc3ltbGlua3MgZmxhZyBpcyB0cnVlLCBzeW1ib2xpYyBsaW5rcyBpbiB0aGUKICAgIHNvdXJjZSB0cmVlIHJlc3VsdCBpbiBzeW1ib2xpYyBsaW5rcyBpbiB0aGUgZGVzdGluYXRpb24gdHJlZTsgaWYKICAgIGl0IGlzIGZhbHNlLCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGVzIHBvaW50ZWQgdG8gYnkgc3ltYm9saWMKICAgIGxpbmtzIGFyZSBjb3BpZWQuIElmIHRoZSBmaWxlIHBvaW50ZWQgYnkgdGhlIHN5bWxpbmsgZG9lc24ndAogICAgZXhpc3QsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIGFkZGVkIGluIHRoZSBsaXN0IG9mIGVycm9ycyByYWlzZWQgaW4KICAgIGFuIEVycm9yIGV4Y2VwdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBjb3B5IHByb2Nlc3MuCgogICAgWW91IGNhbiBzZXQgdGhlIG9wdGlvbmFsIGlnbm9yZV9kYW5nbGluZ19zeW1saW5rcyBmbGFnIHRvIHRydWUgaWYgeW91CiAgICB3YW50IHRvIHNpbGVuY2UgdGhpcyBleGNlcHRpb24uIE5vdGljZSB0aGF0IHRoaXMgaGFzIG5vIGVmZmVjdCBvbgogICAgcGxhdGZvcm1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCBvcy5zeW1saW5rLgoKICAgIFRoZSBvcHRpb25hbCBpZ25vcmUgYXJndW1lbnQgaXMgYSBjYWxsYWJsZS4gSWYgZ2l2ZW4sIGl0CiAgICBpcyBjYWxsZWQgd2l0aCB0aGUgYHNyY2AgcGFyYW1ldGVyLCB3aGljaCBpcyB0aGUgZGlyZWN0b3J5CiAgICBiZWluZyB2aXNpdGVkIGJ5IGNvcHl0cmVlKCksIGFuZCBgbmFtZXNgIHdoaWNoIGlzIHRoZSBsaXN0IG9mCiAgICBgc3JjYCBjb250ZW50cywgYXMgcmV0dXJuZWQgYnkgb3MubGlzdGRpcigpOgoKICAgICAgICBjYWxsYWJsZShzcmMsIG5hbWVzKSAtPiBpZ25vcmVkX25hbWVzCgogICAgU2luY2UgY29weXRyZWUoKSBpcyBjYWxsZWQgcmVjdXJzaXZlbHksIHRoZSBjYWxsYWJsZSB3aWxsIGJlCiAgICBjYWxsZWQgb25jZSBmb3IgZWFjaCBkaXJlY3RvcnkgdGhhdCBpcyBjb3BpZWQuIEl0IHJldHVybnMgYQogICAgbGlzdCBvZiBuYW1lcyByZWxhdGl2ZSB0byB0aGUgYHNyY2AgZGlyZWN0b3J5IHRoYXQgc2hvdWxkCiAgICBub3QgYmUgY29waWVkLgoKICAgIFRoZSBvcHRpb25hbCBjb3B5X2Z1bmN0aW9uIGFyZ3VtZW50IGlzIGEgY2FsbGFibGUgdGhhdCB3aWxsIGJlIHVzZWQKICAgIHRvIGNvcHkgZWFjaCBmaWxlLiBJdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBzb3VyY2UgcGF0aCBhbmQgdGhlCiAgICBkZXN0aW5hdGlvbiBwYXRoIGFzIGFyZ3VtZW50cy4gQnkgZGVmYXVsdCwgY29weTIoKSBpcyB1c2VkLCBidXQgYW55CiAgICBmdW5jdGlvbiB0aGF0IHN1cHBvcnRzIHRoZSBzYW1lIHNpZ25hdHVyZSAobGlrZSBjb3B5KCkpIGNhbiBiZSB1c2VkLgoKICAgICIiIgogICAgbmFtZXMgPSBvcy5saXN0ZGlyKHNyYykKICAgIGlmIGlnbm9yZSBpcyBub3QgTm9uZToKICAgICAgICBpZ25vcmVkX25hbWVzID0gaWdub3JlKHNyYywgbmFtZXMpCiAgICBlbHNlOgogICAgICAgIGlnbm9yZWRfbmFtZXMgPSBzZXQoKQoKICAgIG9zLm1ha2VkaXJzKGRzdCkKICAgIGVycm9ycyA9IFtdCiAgICBmb3IgbmFtZSBpbiBuYW1lczoKICAgICAgICBpZiBuYW1lIGluIGlnbm9yZWRfbmFtZXM6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgc3JjbmFtZSA9IG9zLnBhdGguam9pbihzcmMsIG5hbWUpCiAgICAgICAgZHN0bmFtZSA9IG9zLnBhdGguam9pbihkc3QsIG5hbWUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhzcmNuYW1lKToKICAgICAgICAgICAgICAgIGxpbmt0byA9IG9zLnJlYWRsaW5rKHNyY25hbWUpCiAgICAgICAgICAgICAgICBpZiBzeW1saW5rczoKICAgICAgICAgICAgICAgICAgICBvcy5zeW1saW5rKGxpbmt0bywgZHN0bmFtZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBpZ25vcmUgZGFuZ2xpbmcgc3ltbGluayBpZiB0aGUgZmxhZyBpcyBvbgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhsaW5rdG8pIGFuZCBpZ25vcmVfZGFuZ2xpbmdfc3ltbGlua3M6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2UgbGV0IHRoZSBjb3B5IG9jY3Vycy4gY29weTIgd2lsbCByYWlzZSBhbiBlcnJvcgogICAgICAgICAgICAgICAgICAgIGNvcHlfZnVuY3Rpb24oc3JjbmFtZSwgZHN0bmFtZSkKICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKHNyY25hbWUpOgogICAgICAgICAgICAgICAgY29weXRyZWUoc3JjbmFtZSwgZHN0bmFtZSwgc3ltbGlua3MsIGlnbm9yZSwgY29weV9mdW5jdGlvbikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgV2lsbCByYWlzZSBhIFNwZWNpYWxGaWxlRXJyb3IgZm9yIHVuc3VwcG9ydGVkIGZpbGUgdHlwZXMKICAgICAgICAgICAgICAgIGNvcHlfZnVuY3Rpb24oc3JjbmFtZSwgZHN0bmFtZSkKICAgICAgICAjIGNhdGNoIHRoZSBFcnJvciBmcm9tIHRoZSByZWN1cnNpdmUgY29weXRyZWUgc28gdGhhdCB3ZSBjYW4KICAgICAgICAjIGNvbnRpbnVlIHdpdGggb3RoZXIgZmlsZXMKICAgICAgICBleGNlcHQgRXJyb3IgYXMgZXJyOgogICAgICAgICAgICBlcnJvcnMuZXh0ZW5kKGVyci5hcmdzWzBdKQogICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIHdoeToKICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgoc3JjbmFtZSwgZHN0bmFtZSwgc3RyKHdoeSkpKQogICAgdHJ5OgogICAgICAgIGNvcHlzdGF0KHNyYywgZHN0KQogICAgZXhjZXB0IE9TRXJyb3IgYXMgd2h5OgogICAgICAgIGlmIFdpbmRvd3NFcnJvciBpcyBub3QgTm9uZSBhbmQgaXNpbnN0YW5jZSh3aHksIFdpbmRvd3NFcnJvcik6CiAgICAgICAgICAgICMgQ29weWluZyBmaWxlIGFjY2VzcyB0aW1lcyBtYXkgZmFpbCBvbiBXaW5kb3dzCiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICBlcnJvcnMuZXh0ZW5kKChzcmMsIGRzdCwgc3RyKHdoeSkpKQogICAgaWYgZXJyb3JzOgogICAgICAgIHJhaXNlIEVycm9yKGVycm9ycykKCmRlZiBybXRyZWUocGF0aCwgaWdub3JlX2Vycm9ycz1GYWxzZSwgb25lcnJvcj1Ob25lKToKICAgICIiIlJlY3Vyc2l2ZWx5IGRlbGV0ZSBhIGRpcmVjdG9yeSB0cmVlLgoKICAgIElmIGlnbm9yZV9lcnJvcnMgaXMgc2V0LCBlcnJvcnMgYXJlIGlnbm9yZWQ7IG90aGVyd2lzZSwgaWYgb25lcnJvcgogICAgaXMgc2V0LCBpdCBpcyBjYWxsZWQgdG8gaGFuZGxlIHRoZSBlcnJvciB3aXRoIGFyZ3VtZW50cyAoZnVuYywKICAgIHBhdGgsIGV4Y19pbmZvKSB3aGVyZSBmdW5jIGlzIG9zLmxpc3RkaXIsIG9zLnJlbW92ZSwgb3Igb3Mucm1kaXI7CiAgICBwYXRoIGlzIHRoZSBhcmd1bWVudCB0byB0aGF0IGZ1bmN0aW9uIHRoYXQgY2F1c2VkIGl0IHRvIGZhaWw7IGFuZAogICAgZXhjX2luZm8gaXMgYSB0dXBsZSByZXR1cm5lZCBieSBzeXMuZXhjX2luZm8oKS4gIElmIGlnbm9yZV9lcnJvcnMKICAgIGlzIGZhbHNlIGFuZCBvbmVycm9yIGlzIE5vbmUsIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQuCgogICAgIiIiCiAgICBpZiBpZ25vcmVfZXJyb3JzOgogICAgICAgIGRlZiBvbmVycm9yKCphcmdzKToKICAgICAgICAgICAgcGFzcwogICAgZWxpZiBvbmVycm9yIGlzIE5vbmU6CiAgICAgICAgZGVmIG9uZXJyb3IoKmFyZ3MpOgogICAgICAgICAgICByYWlzZQogICAgdHJ5OgogICAgICAgIGlmIG9zLnBhdGguaXNsaW5rKHBhdGgpOgogICAgICAgICAgICAjIHN5bWxpbmtzIHRvIGRpcmVjdG9yaWVzIGFyZSBmb3JiaWRkZW4sIHNlZSBidWcgIzE2NjkKICAgICAgICAgICAgcmFpc2UgT1NFcnJvcigiQ2Fubm90IGNhbGwgcm10cmVlIG9uIGEgc3ltYm9saWMgbGluayIpCiAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICBvbmVycm9yKG9zLnBhdGguaXNsaW5rLCBwYXRoLCBzeXMuZXhjX2luZm8oKSkKICAgICAgICAjIGNhbid0IGNvbnRpbnVlIGV2ZW4gaWYgb25lcnJvciBob29rIHJldHVybnMKICAgICAgICByZXR1cm4KICAgIG5hbWVzID0gW10KICAgIHRyeToKICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIocGF0aCkKICAgIGV4Y2VwdCBvcy5lcnJvcjoKICAgICAgICBvbmVycm9yKG9zLmxpc3RkaXIsIHBhdGgsIHN5cy5leGNfaW5mbygpKQogICAgZm9yIG5hbWUgaW4gbmFtZXM6CiAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4ocGF0aCwgbmFtZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIG1vZGUgPSBvcy5sc3RhdChmdWxsbmFtZSkuc3RfbW9kZQogICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKICAgICAgICAgICAgbW9kZSA9IDAKICAgICAgICBpZiBzdGF0LlNfSVNESVIobW9kZSk6CiAgICAgICAgICAgIHJtdHJlZShmdWxsbmFtZSwgaWdub3JlX2Vycm9ycywgb25lcnJvcikKICAgICAgICBlbHNlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZnVsbG5hbWUpCiAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKICAgICAgICAgICAgICAgIG9uZXJyb3Iob3MucmVtb3ZlLCBmdWxsbmFtZSwgc3lzLmV4Y19pbmZvKCkpCiAgICB0cnk6CiAgICAgICAgb3Mucm1kaXIocGF0aCkKICAgIGV4Y2VwdCBvcy5lcnJvcjoKICAgICAgICBvbmVycm9yKG9zLnJtZGlyLCBwYXRoLCBzeXMuZXhjX2luZm8oKSkKCgpkZWYgX2Jhc2VuYW1lKHBhdGgpOgogICAgIyBBIGJhc2VuYW1lKCkgdmFyaWFudCB3aGljaCBmaXJzdCBzdHJpcHMgdGhlIHRyYWlsaW5nIHNsYXNoLCBpZiBwcmVzZW50LgogICAgIyBUaHVzIHdlIGFsd2F5cyBnZXQgdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoZSBwYXRoLCBldmVuIGZvciBkaXJlY3Rvcmllcy4KICAgIHJldHVybiBvcy5wYXRoLmJhc2VuYW1lKHBhdGgucnN0cmlwKG9zLnBhdGguc2VwKSkKCmRlZiBtb3ZlKHNyYywgZHN0KToKICAgICIiIlJlY3Vyc2l2ZWx5IG1vdmUgYSBmaWxlIG9yIGRpcmVjdG9yeSB0byBhbm90aGVyIGxvY2F0aW9uLiBUaGlzIGlzCiAgICBzaW1pbGFyIHRvIHRoZSBVbml4ICJtdiIgY29tbWFuZC4KCiAgICBJZiB0aGUgZGVzdGluYXRpb24gaXMgYSBkaXJlY3Rvcnkgb3IgYSBzeW1saW5rIHRvIGEgZGlyZWN0b3J5LCB0aGUgc291cmNlCiAgICBpcyBtb3ZlZCBpbnNpZGUgdGhlIGRpcmVjdG9yeS4gVGhlIGRlc3RpbmF0aW9uIHBhdGggbXVzdCBub3QgYWxyZWFkeQogICAgZXhpc3QuCgogICAgSWYgdGhlIGRlc3RpbmF0aW9uIGFscmVhZHkgZXhpc3RzIGJ1dCBpcyBub3QgYSBkaXJlY3RvcnksIGl0IG1heSBiZQogICAgb3ZlcndyaXR0ZW4gZGVwZW5kaW5nIG9uIG9zLnJlbmFtZSgpIHNlbWFudGljcy4KCiAgICBJZiB0aGUgZGVzdGluYXRpb24gaXMgb24gb3VyIGN1cnJlbnQgZmlsZXN5c3RlbSwgdGhlbiByZW5hbWUoKSBpcyB1c2VkLgogICAgT3RoZXJ3aXNlLCBzcmMgaXMgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbiBhbmQgdGhlbiByZW1vdmVkLgogICAgQSBsb3QgbW9yZSBjb3VsZCBiZSBkb25lIGhlcmUuLi4gIEEgbG9vayBhdCBhIG12LmMgc2hvd3MgYSBsb3Qgb2YKICAgIHRoZSBpc3N1ZXMgdGhpcyBpbXBsZW1lbnRhdGlvbiBnbG9zc2VzIG92ZXIuCgogICAgIiIiCiAgICByZWFsX2RzdCA9IGRzdAogICAgaWYgb3MucGF0aC5pc2Rpcihkc3QpOgogICAgICAgIGlmIF9zYW1lZmlsZShzcmMsIGRzdCk6CiAgICAgICAgICAgICMgV2UgbWlnaHQgYmUgb24gYSBjYXNlIGluc2Vuc2l0aXZlIGZpbGVzeXN0ZW0sCiAgICAgICAgICAgICMgcGVyZm9ybSB0aGUgcmVuYW1lIGFueXdheS4KICAgICAgICAgICAgb3MucmVuYW1lKHNyYywgZHN0KQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgcmVhbF9kc3QgPSBvcy5wYXRoLmpvaW4oZHN0LCBfYmFzZW5hbWUoc3JjKSkKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhyZWFsX2RzdCk6CiAgICAgICAgICAgIHJhaXNlIEVycm9yKCJEZXN0aW5hdGlvbiBwYXRoICclcycgYWxyZWFkeSBleGlzdHMiICUgcmVhbF9kc3QpCiAgICB0cnk6CiAgICAgICAgb3MucmVuYW1lKHNyYywgcmVhbF9kc3QpCiAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHNyYyk6CiAgICAgICAgICAgIGlmIF9kZXN0aW5zcmMoc3JjLCBkc3QpOgogICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IoIkNhbm5vdCBtb3ZlIGEgZGlyZWN0b3J5ICclcycgaW50byBpdHNlbGYgJyVzJy4iICUgKHNyYywgZHN0KSkKICAgICAgICAgICAgY29weXRyZWUoc3JjLCByZWFsX2RzdCwgc3ltbGlua3M9VHJ1ZSkKICAgICAgICAgICAgcm10cmVlKHNyYykKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb3B5MihzcmMsIHJlYWxfZHN0KQogICAgICAgICAgICBvcy51bmxpbmsoc3JjKQoKZGVmIF9kZXN0aW5zcmMoc3JjLCBkc3QpOgogICAgc3JjID0gYWJzcGF0aChzcmMpCiAgICBkc3QgPSBhYnNwYXRoKGRzdCkKICAgIGlmIG5vdCBzcmMuZW5kc3dpdGgob3MucGF0aC5zZXApOgogICAgICAgIHNyYyArPSBvcy5wYXRoLnNlcAogICAgaWYgbm90IGRzdC5lbmRzd2l0aChvcy5wYXRoLnNlcCk6CiAgICAgICAgZHN0ICs9IG9zLnBhdGguc2VwCiAgICByZXR1cm4gZHN0LnN0YXJ0c3dpdGgoc3JjKQoKZGVmIF9nZXRfZ2lkKG5hbWUpOgogICAgIiIiUmV0dXJucyBhIGdpZCwgZ2l2ZW4gYSBncm91cCBuYW1lLiIiIgogICAgaWYgZ2V0Z3JuYW0gaXMgTm9uZSBvciBuYW1lIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHRyeToKICAgICAgICByZXN1bHQgPSBnZXRncm5hbShuYW1lKQogICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgIHJlc3VsdCA9IE5vbmUKICAgIGlmIHJlc3VsdCBpcyBub3QgTm9uZToKICAgICAgICByZXR1cm4gcmVzdWx0WzJdCiAgICByZXR1cm4gTm9uZQoKZGVmIF9nZXRfdWlkKG5hbWUpOgogICAgIiIiUmV0dXJucyBhbiB1aWQsIGdpdmVuIGEgdXNlciBuYW1lLiIiIgogICAgaWYgZ2V0cHduYW0gaXMgTm9uZSBvciBuYW1lIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHRyeToKICAgICAgICByZXN1bHQgPSBnZXRwd25hbShuYW1lKQogICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgIHJlc3VsdCA9IE5vbmUKICAgIGlmIHJlc3VsdCBpcyBub3QgTm9uZToKICAgICAgICByZXR1cm4gcmVzdWx0WzJdCiAgICByZXR1cm4gTm9uZQoKZGVmIF9tYWtlX3RhcmJhbGwoYmFzZV9uYW1lLCBiYXNlX2RpciwgY29tcHJlc3M9Imd6aXAiLCB2ZXJib3NlPTAsIGRyeV9ydW49MCwKICAgICAgICAgICAgICAgICAgb3duZXI9Tm9uZSwgZ3JvdXA9Tm9uZSwgbG9nZ2VyPU5vbmUpOgogICAgIiIiQ3JlYXRlIGEgKHBvc3NpYmx5IGNvbXByZXNzZWQpIHRhciBmaWxlIGZyb20gYWxsIHRoZSBmaWxlcyB1bmRlcgogICAgJ2Jhc2VfZGlyJy4KCiAgICAnY29tcHJlc3MnIG11c3QgYmUgImd6aXAiICh0aGUgZGVmYXVsdCksICJiemlwMiIsIG9yIE5vbmUuCgogICAgJ293bmVyJyBhbmQgJ2dyb3VwJyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYW4gb3duZXIgYW5kIGEgZ3JvdXAgZm9yIHRoZQogICAgYXJjaGl2ZSB0aGF0IGlzIGJlaW5nIGJ1aWx0LiBJZiBub3QgcHJvdmlkZWQsIHRoZSBjdXJyZW50IG93bmVyIGFuZCBncm91cAogICAgd2lsbCBiZSB1c2VkLgoKICAgIFRoZSBvdXRwdXQgdGFyIGZpbGUgd2lsbCBiZSBuYW1lZCAnYmFzZV9uYW1lJyArICAiLnRhciIsIHBvc3NpYmx5IHBsdXMKICAgIHRoZSBhcHByb3ByaWF0ZSBjb21wcmVzc2lvbiBleHRlbnNpb24gKCIuZ3oiLCBvciAiLmJ6MiIpLgoKICAgIFJldHVybnMgdGhlIG91dHB1dCBmaWxlbmFtZS4KICAgICIiIgogICAgdGFyX2NvbXByZXNzaW9uID0geydnemlwJzogJ2d6JywgTm9uZTogJyd9CiAgICBjb21wcmVzc19leHQgPSB7J2d6aXAnOiAnLmd6J30KCiAgICBpZiBfQloyX1NVUFBPUlRFRDoKICAgICAgICB0YXJfY29tcHJlc3Npb25bJ2J6aXAyJ10gPSAnYnoyJwogICAgICAgIGNvbXByZXNzX2V4dFsnYnppcDInXSA9ICcuYnoyJwoKICAgICMgZmxhZ3MgZm9yIGNvbXByZXNzaW9uIHByb2dyYW0sIGVhY2ggZWxlbWVudCBvZiBsaXN0IHdpbGwgYmUgYW4gYXJndW1lbnQKICAgIGlmIGNvbXByZXNzIGlzIG5vdCBOb25lIGFuZCBjb21wcmVzcyBub3QgaW4gY29tcHJlc3NfZXh0OgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImJhZCB2YWx1ZSBmb3IgJ2NvbXByZXNzJywgb3IgY29tcHJlc3Npb24gZm9ybWF0IG5vdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAic3VwcG9ydGVkIDogezB9Ii5mb3JtYXQoY29tcHJlc3MpKQoKICAgIGFyY2hpdmVfbmFtZSA9IGJhc2VfbmFtZSArICcudGFyJyArIGNvbXByZXNzX2V4dC5nZXQoY29tcHJlc3MsICcnKQogICAgYXJjaGl2ZV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoYXJjaGl2ZV9uYW1lKQoKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhhcmNoaXZlX2Rpcik6CiAgICAgICAgaWYgbG9nZ2VyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBsb2dnZXIuaW5mbygiY3JlYXRpbmcgJXMiLCBhcmNoaXZlX2RpcikKICAgICAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICAgICAgb3MubWFrZWRpcnMoYXJjaGl2ZV9kaXIpCgogICAgIyBjcmVhdGluZyB0aGUgdGFyYmFsbAogICAgaWYgbG9nZ2VyIGlzIG5vdCBOb25lOgogICAgICAgIGxvZ2dlci5pbmZvKCdDcmVhdGluZyB0YXIgYXJjaGl2ZScpCgogICAgdWlkID0gX2dldF91aWQob3duZXIpCiAgICBnaWQgPSBfZ2V0X2dpZChncm91cCkKCiAgICBkZWYgX3NldF91aWRfZ2lkKHRhcmluZm8pOgogICAgICAgIGlmIGdpZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdGFyaW5mby5naWQgPSBnaWQKICAgICAgICAgICAgdGFyaW5mby5nbmFtZSA9IGdyb3VwCiAgICAgICAgaWYgdWlkIGlzIG5vdCBOb25lOgogICAgICAgICAgICB0YXJpbmZvLnVpZCA9IHVpZAogICAgICAgICAgICB0YXJpbmZvLnVuYW1lID0gb3duZXIKICAgICAgICByZXR1cm4gdGFyaW5mbwoKICAgIGlmIG5vdCBkcnlfcnVuOgogICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihhcmNoaXZlX25hbWUsICd3fCVzJyAlIHRhcl9jb21wcmVzc2lvbltjb21wcmVzc10pCiAgICAgICAgdHJ5OgogICAgICAgICAgICB0YXIuYWRkKGJhc2VfZGlyLCBmaWx0ZXI9X3NldF91aWRfZ2lkKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHRhci5jbG9zZSgpCgogICAgcmV0dXJuIGFyY2hpdmVfbmFtZQoKZGVmIF9jYWxsX2V4dGVybmFsX3ppcChiYXNlX2RpciwgemlwX2ZpbGVuYW1lLCB2ZXJib3NlPUZhbHNlLCBkcnlfcnVuPUZhbHNlKToKICAgICMgWFhYIHNlZSBpZiB3ZSB3YW50IHRvIGtlZXAgYW4gZXh0ZXJuYWwgY2FsbCBoZXJlCiAgICBpZiB2ZXJib3NlOgogICAgICAgIHppcG9wdGlvbnMgPSAiLXIiCiAgICBlbHNlOgogICAgICAgIHppcG9wdGlvbnMgPSAiLXJxIgogICAgZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFeGVjRXJyb3IKICAgIGZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3bgogICAgdHJ5OgogICAgICAgIHNwYXduKFsiemlwIiwgemlwb3B0aW9ucywgemlwX2ZpbGVuYW1lLCBiYXNlX2Rpcl0sIGRyeV9ydW49ZHJ5X3J1bikKICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3I6CiAgICAgICAgIyBYWFggcmVhbGx5IHNob3VsZCBkaXN0aW5ndWlzaCBiZXR3ZWVuICJjb3VsZG4ndCBmaW5kCiAgICAgICAgIyBleHRlcm5hbCAnemlwJyBjb21tYW5kIiBhbmQgInppcCBmYWlsZWQiLgogICAgICAgIHJhaXNlIEV4ZWNFcnJvcigidW5hYmxlIHRvIGNyZWF0ZSB6aXAgZmlsZSAnJXMnOiAiCiAgICAgICAgICAgICJjb3VsZCBuZWl0aGVyIGltcG9ydCB0aGUgJ3ppcGZpbGUnIG1vZHVsZSBub3IgIgogICAgICAgICAgICAiZmluZCBhIHN0YW5kYWxvbmUgemlwIHV0aWxpdHkiKSAlIHppcF9maWxlbmFtZQoKZGVmIF9tYWtlX3ppcGZpbGUoYmFzZV9uYW1lLCBiYXNlX2RpciwgdmVyYm9zZT0wLCBkcnlfcnVuPTAsIGxvZ2dlcj1Ob25lKToKICAgICIiIkNyZWF0ZSBhIHppcCBmaWxlIGZyb20gYWxsIHRoZSBmaWxlcyB1bmRlciAnYmFzZV9kaXInLgoKICAgIFRoZSBvdXRwdXQgemlwIGZpbGUgd2lsbCBiZSBuYW1lZCAnYmFzZV9uYW1lJyArICIuemlwIi4gIFVzZXMgZWl0aGVyIHRoZQogICAgInppcGZpbGUiIFB5dGhvbiBtb2R1bGUgKGlmIGF2YWlsYWJsZSkgb3IgdGhlIEluZm9aSVAgInppcCIgdXRpbGl0eQogICAgKGlmIGluc3RhbGxlZCBhbmQgZm91bmQgb24gdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGgpLiAgSWYgbmVpdGhlciB0b29sIGlzCiAgICBhdmFpbGFibGUsIHJhaXNlcyBFeGVjRXJyb3IuICBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgemlwCiAgICBmaWxlLgogICAgIiIiCiAgICB6aXBfZmlsZW5hbWUgPSBiYXNlX25hbWUgKyAiLnppcCIKICAgIGFyY2hpdmVfZGlyID0gb3MucGF0aC5kaXJuYW1lKGJhc2VfbmFtZSkKCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoYXJjaGl2ZV9kaXIpOgogICAgICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oImNyZWF0aW5nICVzIiwgYXJjaGl2ZV9kaXIpCiAgICAgICAgaWYgbm90IGRyeV9ydW46CiAgICAgICAgICAgIG9zLm1ha2VkaXJzKGFyY2hpdmVfZGlyKQoKICAgICMgSWYgemlwZmlsZSBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSwgdHJ5IHNwYXduaW5nIGFuIGV4dGVybmFsICd6aXAnCiAgICAjIGNvbW1hbmQuCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHppcGZpbGUKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICB6aXBmaWxlID0gTm9uZQoKICAgIGlmIHppcGZpbGUgaXMgTm9uZToKICAgICAgICBfY2FsbF9leHRlcm5hbF96aXAoYmFzZV9kaXIsIHppcF9maWxlbmFtZSwgdmVyYm9zZSwgZHJ5X3J1bikKICAgIGVsc2U6CiAgICAgICAgaWYgbG9nZ2VyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBsb2dnZXIuaW5mbygiY3JlYXRpbmcgJyVzJyBhbmQgYWRkaW5nICclcycgdG8gaXQiLAogICAgICAgICAgICAgICAgICAgICAgICB6aXBfZmlsZW5hbWUsIGJhc2VfZGlyKQoKICAgICAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICAgICAgemlwID0gemlwZmlsZS5aaXBGaWxlKHppcF9maWxlbmFtZSwgInciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb249emlwZmlsZS5aSVBfREVGTEFURUQpCgogICAgICAgICAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKGJhc2VfZGlyKToKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oZGlycGF0aCwgbmFtZSkpCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHppcC53cml0ZShwYXRoLCBwYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBsb2dnZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiYWRkaW5nICclcyciLCBwYXRoKQogICAgICAgICAgICB6aXAuY2xvc2UoKQoKICAgIHJldHVybiB6aXBfZmlsZW5hbWUKCl9BUkNISVZFX0ZPUk1BVFMgPSB7CiAgICAnZ3p0YXInOiAoX21ha2VfdGFyYmFsbCwgWygnY29tcHJlc3MnLCAnZ3ppcCcpXSwgImd6aXAnZWQgdGFyLWZpbGUiKSwKICAgICdienRhcic6IChfbWFrZV90YXJiYWxsLCBbKCdjb21wcmVzcycsICdiemlwMicpXSwgImJ6aXAyJ2VkIHRhci1maWxlIiksCiAgICAndGFyJzogICAoX21ha2VfdGFyYmFsbCwgWygnY29tcHJlc3MnLCBOb25lKV0sICJ1bmNvbXByZXNzZWQgdGFyIGZpbGUiKSwKICAgICd6aXAnOiAgIChfbWFrZV96aXBmaWxlLCBbXSwgIlpJUCBmaWxlIiksCiAgICB9CgppZiBfQloyX1NVUFBPUlRFRDoKICAgIF9BUkNISVZFX0ZPUk1BVFNbJ2J6dGFyJ10gPSAoX21ha2VfdGFyYmFsbCwgWygnY29tcHJlc3MnLCAnYnppcDInKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ6aXAyJ2VkIHRhci1maWxlIikKCmRlZiBnZXRfYXJjaGl2ZV9mb3JtYXRzKCk6CiAgICAiIiJSZXR1cm5zIGEgbGlzdCBvZiBzdXBwb3J0ZWQgZm9ybWF0cyBmb3IgYXJjaGl2aW5nIGFuZCB1bmFyY2hpdmluZy4KCiAgICBFYWNoIGVsZW1lbnQgb2YgdGhlIHJldHVybmVkIHNlcXVlbmNlIGlzIGEgdHVwbGUgKG5hbWUsIGRlc2NyaXB0aW9uKQogICAgIiIiCiAgICBmb3JtYXRzID0gWyhuYW1lLCByZWdpc3RyeVsyXSkgZm9yIG5hbWUsIHJlZ2lzdHJ5IGluCiAgICAgICAgICAgICAgIF9BUkNISVZFX0ZPUk1BVFMuaXRlbXMoKV0KICAgIGZvcm1hdHMuc29ydCgpCiAgICByZXR1cm4gZm9ybWF0cwoKZGVmIHJlZ2lzdGVyX2FyY2hpdmVfZm9ybWF0KG5hbWUsIGZ1bmN0aW9uLCBleHRyYV9hcmdzPU5vbmUsIGRlc2NyaXB0aW9uPScnKToKICAgICIiIlJlZ2lzdGVycyBhbiBhcmNoaXZlIGZvcm1hdC4KCiAgICBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmb3JtYXQuIGZ1bmN0aW9uIGlzIHRoZSBjYWxsYWJsZSB0aGF0IHdpbGwgYmUKICAgIHVzZWQgdG8gY3JlYXRlIGFyY2hpdmVzLiBJZiBwcm92aWRlZCwgZXh0cmFfYXJncyBpcyBhIHNlcXVlbmNlIG9mCiAgICAobmFtZSwgdmFsdWUpIHR1cGxlcyB0aGF0IHdpbGwgYmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byB0aGUgY2FsbGFibGUuCiAgICBkZXNjcmlwdGlvbiBjYW4gYmUgcHJvdmlkZWQgdG8gZGVzY3JpYmUgdGhlIGZvcm1hdCwgYW5kIHdpbGwgYmUgcmV0dXJuZWQKICAgIGJ5IHRoZSBnZXRfYXJjaGl2ZV9mb3JtYXRzKCkgZnVuY3Rpb24uCiAgICAiIiIKICAgIGlmIGV4dHJhX2FyZ3MgaXMgTm9uZToKICAgICAgICBleHRyYV9hcmdzID0gW10KICAgIGlmIG5vdCBpc2luc3RhbmNlKGZ1bmN0aW9uLCBjb2xsZWN0aW9ucy5DYWxsYWJsZSk6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdUaGUgJXMgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZScgJSBmdW5jdGlvbikKICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4dHJhX2FyZ3MsICh0dXBsZSwgbGlzdCkpOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcignZXh0cmFfYXJncyBuZWVkcyB0byBiZSBhIHNlcXVlbmNlJykKICAgIGZvciBlbGVtZW50IGluIGV4dHJhX2FyZ3M6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZWxlbWVudCwgKHR1cGxlLCBsaXN0KSkgb3IgbGVuKGVsZW1lbnQpICE9MjoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdleHRyYV9hcmdzIGVsZW1lbnRzIGFyZSA6IChhcmdfbmFtZSwgdmFsdWUpJykKCiAgICBfQVJDSElWRV9GT1JNQVRTW25hbWVdID0gKGZ1bmN0aW9uLCBleHRyYV9hcmdzLCBkZXNjcmlwdGlvbikKCmRlZiB1bnJlZ2lzdGVyX2FyY2hpdmVfZm9ybWF0KG5hbWUpOgogICAgZGVsIF9BUkNISVZFX0ZPUk1BVFNbbmFtZV0KCmRlZiBtYWtlX2FyY2hpdmUoYmFzZV9uYW1lLCBmb3JtYXQsIHJvb3RfZGlyPU5vbmUsIGJhc2VfZGlyPU5vbmUsIHZlcmJvc2U9MCwKICAgICAgICAgICAgICAgICBkcnlfcnVuPTAsIG93bmVyPU5vbmUsIGdyb3VwPU5vbmUsIGxvZ2dlcj1Ob25lKToKICAgICIiIkNyZWF0ZSBhbiBhcmNoaXZlIGZpbGUgKGVnLiB6aXAgb3IgdGFyKS4KCiAgICAnYmFzZV9uYW1lJyBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjcmVhdGUsIG1pbnVzIGFueSBmb3JtYXQtc3BlY2lmaWMKICAgIGV4dGVuc2lvbjsgJ2Zvcm1hdCcgaXMgdGhlIGFyY2hpdmUgZm9ybWF0OiBvbmUgb2YgInppcCIsICJ0YXIiLCAiYnp0YXIiCiAgICBvciAiZ3p0YXIiLgoKICAgICdyb290X2RpcicgaXMgYSBkaXJlY3RvcnkgdGhhdCB3aWxsIGJlIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUKICAgIGFyY2hpdmU7IGllLiB3ZSB0eXBpY2FsbHkgY2hkaXIgaW50byAncm9vdF9kaXInIGJlZm9yZSBjcmVhdGluZyB0aGUKICAgIGFyY2hpdmUuICAnYmFzZV9kaXInIGlzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgd2Ugc3RhcnQgYXJjaGl2aW5nIGZyb207CiAgICBpZS4gJ2Jhc2VfZGlyJyB3aWxsIGJlIHRoZSBjb21tb24gcHJlZml4IG9mIGFsbCBmaWxlcyBhbmQKICAgIGRpcmVjdG9yaWVzIGluIHRoZSBhcmNoaXZlLiAgJ3Jvb3RfZGlyJyBhbmQgJ2Jhc2VfZGlyJyBib3RoIGRlZmF1bHQKICAgIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGFyY2hpdmUgZmlsZS4KCiAgICAnb3duZXInIGFuZCAnZ3JvdXAnIGFyZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0YXIgYXJjaGl2ZS4gQnkgZGVmYXVsdCwKICAgIHVzZXMgdGhlIGN1cnJlbnQgb3duZXIgYW5kIGdyb3VwLgogICAgIiIiCiAgICBzYXZlX2N3ZCA9IG9zLmdldGN3ZCgpCiAgICBpZiByb290X2RpciBpcyBub3QgTm9uZToKICAgICAgICBpZiBsb2dnZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiY2hhbmdpbmcgaW50byAnJXMnIiwgcm9vdF9kaXIpCiAgICAgICAgYmFzZV9uYW1lID0gb3MucGF0aC5hYnNwYXRoKGJhc2VfbmFtZSkKICAgICAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICAgICAgb3MuY2hkaXIocm9vdF9kaXIpCgogICAgaWYgYmFzZV9kaXIgaXMgTm9uZToKICAgICAgICBiYXNlX2RpciA9IG9zLmN1cmRpcgoKICAgIGt3YXJncyA9IHsnZHJ5X3J1bic6IGRyeV9ydW4sICdsb2dnZXInOiBsb2dnZXJ9CgogICAgdHJ5OgogICAgICAgIGZvcm1hdF9pbmZvID0gX0FSQ0hJVkVfRk9STUFUU1tmb3JtYXRdCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5rbm93biBhcmNoaXZlIGZvcm1hdCAnJXMnIiAlIGZvcm1hdCkKCiAgICBmdW5jID0gZm9ybWF0X2luZm9bMF0KICAgIGZvciBhcmcsIHZhbCBpbiBmb3JtYXRfaW5mb1sxXToKICAgICAgICBrd2FyZ3NbYXJnXSA9IHZhbAoKICAgIGlmIGZvcm1hdCAhPSAnemlwJzoKICAgICAgICBrd2FyZ3NbJ293bmVyJ10gPSBvd25lcgogICAgICAgIGt3YXJnc1snZ3JvdXAnXSA9IGdyb3VwCgogICAgdHJ5OgogICAgICAgIGZpbGVuYW1lID0gZnVuYyhiYXNlX25hbWUsIGJhc2VfZGlyLCAqKmt3YXJncykKICAgIGZpbmFsbHk6CiAgICAgICAgaWYgcm9vdF9kaXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiY2hhbmdpbmcgYmFjayB0byAnJXMnIiwgc2F2ZV9jd2QpCiAgICAgICAgICAgIG9zLmNoZGlyKHNhdmVfY3dkKQoKICAgIHJldHVybiBmaWxlbmFtZQoKCmRlZiBnZXRfdW5wYWNrX2Zvcm1hdHMoKToKICAgICIiIlJldHVybnMgYSBsaXN0IG9mIHN1cHBvcnRlZCBmb3JtYXRzIGZvciB1bnBhY2tpbmcuCgogICAgRWFjaCBlbGVtZW50IG9mIHRoZSByZXR1cm5lZCBzZXF1ZW5jZSBpcyBhIHR1cGxlCiAgICAobmFtZSwgZXh0ZW5zaW9ucywgZGVzY3JpcHRpb24pCiAgICAiIiIKICAgIGZvcm1hdHMgPSBbKG5hbWUsIGluZm9bMF0sIGluZm9bM10pIGZvciBuYW1lLCBpbmZvIGluCiAgICAgICAgICAgICAgIF9VTlBBQ0tfRk9STUFUUy5pdGVtcygpXQogICAgZm9ybWF0cy5zb3J0KCkKICAgIHJldHVybiBmb3JtYXRzCgpkZWYgX2NoZWNrX3VucGFja19vcHRpb25zKGV4dGVuc2lvbnMsIGZ1bmN0aW9uLCBleHRyYV9hcmdzKToKICAgICIiIkNoZWNrcyB3aGF0IGdldHMgcmVnaXN0ZXJlZCBhcyBhbiB1bnBhY2tlci4iIiIKICAgICMgZmlyc3QgbWFrZSBzdXJlIG5vIG90aGVyIHVucGFja2VyIGlzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgZXh0ZW5zaW9uCiAgICBleGlzdGluZ19leHRlbnNpb25zID0ge30KICAgIGZvciBuYW1lLCBpbmZvIGluIF9VTlBBQ0tfRk9STUFUUy5pdGVtcygpOgogICAgICAgIGZvciBleHQgaW4gaW5mb1swXToKICAgICAgICAgICAgZXhpc3RpbmdfZXh0ZW5zaW9uc1tleHRdID0gbmFtZQoKICAgIGZvciBleHRlbnNpb24gaW4gZXh0ZW5zaW9uczoKICAgICAgICBpZiBleHRlbnNpb24gaW4gZXhpc3RpbmdfZXh0ZW5zaW9uczoKICAgICAgICAgICAgbXNnID0gJyVzIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgIiVzIicKICAgICAgICAgICAgcmFpc2UgUmVnaXN0cnlFcnJvcihtc2cgJSAoZXh0ZW5zaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ19leHRlbnNpb25zW2V4dGVuc2lvbl0pKQoKICAgIGlmIG5vdCBpc2luc3RhbmNlKGZ1bmN0aW9uLCBjb2xsZWN0aW9ucy5DYWxsYWJsZSk6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdUaGUgcmVnaXN0ZXJlZCBmdW5jdGlvbiBtdXN0IGJlIGEgY2FsbGFibGUnKQoKCmRlZiByZWdpc3Rlcl91bnBhY2tfZm9ybWF0KG5hbWUsIGV4dGVuc2lvbnMsIGZ1bmN0aW9uLCBleHRyYV9hcmdzPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPScnKToKICAgICIiIlJlZ2lzdGVycyBhbiB1bnBhY2sgZm9ybWF0LgoKICAgIGBuYW1lYCBpcyB0aGUgbmFtZSBvZiB0aGUgZm9ybWF0LiBgZXh0ZW5zaW9uc2AgaXMgYSBsaXN0IG9mIGV4dGVuc2lvbnMKICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZvcm1hdC4KCiAgICBgZnVuY3Rpb25gIGlzIHRoZSBjYWxsYWJsZSB0aGF0IHdpbGwgYmUKICAgIHVzZWQgdG8gdW5wYWNrIGFyY2hpdmVzLiBUaGUgY2FsbGFibGUgd2lsbCByZWNlaXZlIGFyY2hpdmVzIHRvIHVucGFjay4KICAgIElmIGl0J3MgdW5hYmxlIHRvIGhhbmRsZSBhbiBhcmNoaXZlLCBpdCBuZWVkcyB0byByYWlzZSBhIFJlYWRFcnJvcgogICAgZXhjZXB0aW9uLgoKICAgIElmIHByb3ZpZGVkLCBgZXh0cmFfYXJnc2AgaXMgYSBzZXF1ZW5jZSBvZgogICAgKG5hbWUsIHZhbHVlKSB0dXBsZXMgdGhhdCB3aWxsIGJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gdGhlIGNhbGxhYmxlLgogICAgZGVzY3JpcHRpb24gY2FuIGJlIHByb3ZpZGVkIHRvIGRlc2NyaWJlIHRoZSBmb3JtYXQsIGFuZCB3aWxsIGJlIHJldHVybmVkCiAgICBieSB0aGUgZ2V0X3VucGFja19mb3JtYXRzKCkgZnVuY3Rpb24uCiAgICAiIiIKICAgIGlmIGV4dHJhX2FyZ3MgaXMgTm9uZToKICAgICAgICBleHRyYV9hcmdzID0gW10KICAgIF9jaGVja191bnBhY2tfb3B0aW9ucyhleHRlbnNpb25zLCBmdW5jdGlvbiwgZXh0cmFfYXJncykKICAgIF9VTlBBQ0tfRk9STUFUU1tuYW1lXSA9IGV4dGVuc2lvbnMsIGZ1bmN0aW9uLCBleHRyYV9hcmdzLCBkZXNjcmlwdGlvbgoKZGVmIHVucmVnaXN0ZXJfdW5wYWNrX2Zvcm1hdChuYW1lKToKICAgICIiIlJlbW92ZXMgdGhlIHBhY2sgZm9ybWF0IGZyb20gdGhlIHJlZ2lzdHJ5LiIiIgogICAgZGVsIF9VTlBBQ0tfRk9STUFUU1tuYW1lXQoKZGVmIF9lbnN1cmVfZGlyZWN0b3J5KHBhdGgpOgogICAgIiIiRW5zdXJlIHRoYXQgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgYHBhdGhgIGV4aXN0cyIiIgogICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZGlybmFtZSk6CiAgICAgICAgb3MubWFrZWRpcnMoZGlybmFtZSkKCmRlZiBfdW5wYWNrX3ppcGZpbGUoZmlsZW5hbWUsIGV4dHJhY3RfZGlyKToKICAgICIiIlVucGFjayB6aXAgYGZpbGVuYW1lYCB0byBgZXh0cmFjdF9kaXJgCiAgICAiIiIKICAgIHRyeToKICAgICAgICBpbXBvcnQgemlwZmlsZQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHJhaXNlIFJlYWRFcnJvcignemxpYiBub3Qgc3VwcG9ydGVkLCBjYW5ub3QgdW5wYWNrIHRoaXMgYXJjaGl2ZS4nKQoKICAgIGlmIG5vdCB6aXBmaWxlLmlzX3ppcGZpbGUoZmlsZW5hbWUpOgogICAgICAgIHJhaXNlIFJlYWRFcnJvcigiJXMgaXMgbm90IGEgemlwIGZpbGUiICUgZmlsZW5hbWUpCgogICAgemlwID0gemlwZmlsZS5aaXBGaWxlKGZpbGVuYW1lKQogICAgdHJ5OgogICAgICAgIGZvciBpbmZvIGluIHppcC5pbmZvbGlzdCgpOgogICAgICAgICAgICBuYW1lID0gaW5mby5maWxlbmFtZQoKICAgICAgICAgICAgIyBkb24ndCBleHRyYWN0IGFic29sdXRlIHBhdGhzIG9yIG9uZXMgd2l0aCAuLiBpbiB0aGVtCiAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnLycpIG9yICcuLicgaW4gbmFtZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oZXh0cmFjdF9kaXIsICpuYW1lLnNwbGl0KCcvJykpCiAgICAgICAgICAgIGlmIG5vdCB0YXJnZXQ6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgX2Vuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQogICAgICAgICAgICBpZiBub3QgbmFtZS5lbmRzd2l0aCgnLycpOgogICAgICAgICAgICAgICAgIyBmaWxlCiAgICAgICAgICAgICAgICBkYXRhID0gemlwLnJlYWQoaW5mby5maWxlbmFtZSkKICAgICAgICAgICAgICAgIGYgPSBvcGVuKHRhcmdldCwgJ3diJykKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBmLndyaXRlKGRhdGEpCiAgICAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgICAgICAgIGRlbCBkYXRhCiAgICBmaW5hbGx5OgogICAgICAgIHppcC5jbG9zZSgpCgpkZWYgX3VucGFja190YXJmaWxlKGZpbGVuYW1lLCBleHRyYWN0X2Rpcik6CiAgICAiIiJVbnBhY2sgdGFyL3Rhci5nei90YXIuYnoyIGBmaWxlbmFtZWAgdG8gYGV4dHJhY3RfZGlyYAogICAgIiIiCiAgICB0cnk6CiAgICAgICAgdGFyb2JqID0gdGFyZmlsZS5vcGVuKGZpbGVuYW1lKQogICAgZXhjZXB0IHRhcmZpbGUuVGFyRXJyb3I6CiAgICAgICAgcmFpc2UgUmVhZEVycm9yKAogICAgICAgICAgICAiJXMgaXMgbm90IGEgY29tcHJlc3NlZCBvciB1bmNvbXByZXNzZWQgdGFyIGZpbGUiICUgZmlsZW5hbWUpCiAgICB0cnk6CiAgICAgICAgdGFyb2JqLmV4dHJhY3RhbGwoZXh0cmFjdF9kaXIpCiAgICBmaW5hbGx5OgogICAgICAgIHRhcm9iai5jbG9zZSgpCgpfVU5QQUNLX0ZPUk1BVFMgPSB7CiAgICAnZ3p0YXInOiAoWycudGFyLmd6JywgJy50Z3onXSwgX3VucGFja190YXJmaWxlLCBbXSwgImd6aXAnZWQgdGFyLWZpbGUiKSwKICAgICd0YXInOiAgIChbJy50YXInXSwgX3VucGFja190YXJmaWxlLCBbXSwgInVuY29tcHJlc3NlZCB0YXIgZmlsZSIpLAogICAgJ3ppcCc6ICAgKFsnLnppcCddLCBfdW5wYWNrX3ppcGZpbGUsIFtdLCAiWklQIGZpbGUiKQogICAgfQoKaWYgX0JaMl9TVVBQT1JURUQ6CiAgICBfVU5QQUNLX0ZPUk1BVFNbJ2J6dGFyJ10gPSAoWycuYnoyJ10sIF91bnBhY2tfdGFyZmlsZSwgW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ6aXAyJ2VkIHRhci1maWxlIikKCmRlZiBfZmluZF91bnBhY2tfZm9ybWF0KGZpbGVuYW1lKToKICAgIGZvciBuYW1lLCBpbmZvIGluIF9VTlBBQ0tfRk9STUFUUy5pdGVtcygpOgogICAgICAgIGZvciBleHRlbnNpb24gaW4gaW5mb1swXToKICAgICAgICAgICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoZXh0ZW5zaW9uKToKICAgICAgICAgICAgICAgIHJldHVybiBuYW1lCiAgICByZXR1cm4gTm9uZQoKZGVmIHVucGFja19hcmNoaXZlKGZpbGVuYW1lLCBleHRyYWN0X2Rpcj1Ob25lLCBmb3JtYXQ9Tm9uZSk6CiAgICAiIiJVbnBhY2sgYW4gYXJjaGl2ZS4KCiAgICBgZmlsZW5hbWVgIGlzIHRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlLgoKICAgIGBleHRyYWN0X2RpcmAgaXMgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBkaXJlY3RvcnksIHdoZXJlIHRoZSBhcmNoaXZlCiAgICBpcyB1bnBhY2tlZC4gSWYgbm90IHByb3ZpZGVkLCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpcyB1c2VkLgoKICAgIGBmb3JtYXRgIGlzIHRoZSBhcmNoaXZlIGZvcm1hdDogb25lIG9mICJ6aXAiLCAidGFyIiwgb3IgImd6dGFyIi4gT3IgYW55CiAgICBvdGhlciByZWdpc3RlcmVkIGZvcm1hdC4gSWYgbm90IHByb3ZpZGVkLCB1bnBhY2tfYXJjaGl2ZSB3aWxsIHVzZSB0aGUKICAgIGZpbGVuYW1lIGV4dGVuc2lvbiBhbmQgc2VlIGlmIGFuIHVucGFja2VyIHdhcyByZWdpc3RlcmVkIGZvciB0aGF0CiAgICBleHRlbnNpb24uCgogICAgSW4gY2FzZSBub25lIGlzIGZvdW5kLCBhIFZhbHVlRXJyb3IgaXMgcmFpc2VkLgogICAgIiIiCiAgICBpZiBleHRyYWN0X2RpciBpcyBOb25lOgogICAgICAgIGV4dHJhY3RfZGlyID0gb3MuZ2V0Y3dkKCkKCiAgICBpZiBmb3JtYXQgaXMgbm90IE5vbmU6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmb3JtYXRfaW5mbyA9IF9VTlBBQ0tfRk9STUFUU1tmb3JtYXRdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbmtub3duIHVucGFjayBmb3JtYXQgJ3swfSciLmZvcm1hdChmb3JtYXQpKQoKICAgICAgICBmdW5jID0gZm9ybWF0X2luZm9bMV0KICAgICAgICBmdW5jKGZpbGVuYW1lLCBleHRyYWN0X2RpciwgKipkaWN0KGZvcm1hdF9pbmZvWzJdKSkKICAgIGVsc2U6CiAgICAgICAgIyB3ZSBuZWVkIHRvIGxvb2sgYXQgdGhlIHJlZ2lzdGVyZWQgdW5wYWNrZXJzIHN1cHBvcnRlZCBleHRlbnNpb25zCiAgICAgICAgZm9ybWF0ID0gX2ZpbmRfdW5wYWNrX2Zvcm1hdChmaWxlbmFtZSkKICAgICAgICBpZiBmb3JtYXQgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJVbmtub3duIGFyY2hpdmUgZm9ybWF0ICd7MH0nIi5mb3JtYXQoZmlsZW5hbWUpKQoKICAgICAgICBmdW5jID0gX1VOUEFDS19GT1JNQVRTW2Zvcm1hdF1bMV0KICAgICAgICBrd2FyZ3MgPSBkaWN0KF9VTlBBQ0tfRk9STUFUU1tmb3JtYXRdWzJdKQogICAgICAgIGZ1bmMoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCAqKmt3YXJncykKUEsDBBQAAAAAAAAAIQBvFgCtOQoAADkKAAA7AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L3N5c2NvbmZpZy5jZmdbcG9zaXhfcHJlZml4XQojIENvbmZpZ3VyYXRpb24gZGlyZWN0b3JpZXMuICBTb21lIG9mIHRoZXNlIGNvbWUgc3RyYWlnaHQgb3V0IG9mIHRoZQojIGNvbmZpZ3VyZSBzY3JpcHQuICBUaGV5IGFyZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBvdGhlciB2YXJpYWJsZXMsIG5vdCB0bwojIGJlIHVzZWQgZGlyZWN0bHkgaW4gW3Jlc291cmNlX2xvY2F0aW9uc10uCmNvbmZkaXIgPSAvZXRjCmRhdGFkaXIgPSAvdXNyL3NoYXJlCmxpYmRpciA9IC91c3IvbGliCnN0YXRlZGlyID0gL3ZhcgojIFVzZXIgcmVzb3VyY2UgZGlyZWN0b3J5CmxvY2FsID0gfi8ubG9jYWwve2Rpc3RyaWJ1dGlvbi5uYW1lfQoKc3RkbGliID0ge2Jhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0KcGxhdHN0ZGxpYiA9IHtwbGF0YmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fQpwdXJlbGliID0ge2Jhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0vc2l0ZS1wYWNrYWdlcwpwbGF0bGliID0ge3BsYXRiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9L3NpdGUtcGFja2FnZXMKaW5jbHVkZSA9IHtiYXNlfS9pbmNsdWRlL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fXthYmlmbGFnc30KcGxhdGluY2x1ZGUgPSB7cGxhdGJhc2V9L2luY2x1ZGUvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9e2FiaWZsYWdzfQpkYXRhID0ge2Jhc2V9CgpbcG9zaXhfaG9tZV0Kc3RkbGliID0ge2Jhc2V9L2xpYi9weXRob24KcGxhdHN0ZGxpYiA9IHtiYXNlfS9saWIvcHl0aG9uCnB1cmVsaWIgPSB7YmFzZX0vbGliL3B5dGhvbgpwbGF0bGliID0ge2Jhc2V9L2xpYi9weXRob24KaW5jbHVkZSA9IHtiYXNlfS9pbmNsdWRlL3B5dGhvbgpwbGF0aW5jbHVkZSA9IHtiYXNlfS9pbmNsdWRlL3B5dGhvbgpzY3JpcHRzID0ge2Jhc2V9L2JpbgpkYXRhID0ge2Jhc2V9CgpbbnRdCnN0ZGxpYiA9IHtiYXNlfS9MaWIKcGxhdHN0ZGxpYiA9IHtiYXNlfS9MaWIKcHVyZWxpYiA9IHtiYXNlfS9MaWIvc2l0ZS1wYWNrYWdlcwpwbGF0bGliID0ge2Jhc2V9L0xpYi9zaXRlLXBhY2thZ2VzCmluY2x1ZGUgPSB7YmFzZX0vSW5jbHVkZQpwbGF0aW5jbHVkZSA9IHtiYXNlfS9JbmNsdWRlCnNjcmlwdHMgPSB7YmFzZX0vU2NyaXB0cwpkYXRhID0ge2Jhc2V9Cgpbb3MyXQpzdGRsaWIgPSB7YmFzZX0vTGliCnBsYXRzdGRsaWIgPSB7YmFzZX0vTGliCnB1cmVsaWIgPSB7YmFzZX0vTGliL3NpdGUtcGFja2FnZXMKcGxhdGxpYiA9IHtiYXNlfS9MaWIvc2l0ZS1wYWNrYWdlcwppbmNsdWRlID0ge2Jhc2V9L0luY2x1ZGUKcGxhdGluY2x1ZGUgPSB7YmFzZX0vSW5jbHVkZQpzY3JpcHRzID0ge2Jhc2V9L1NjcmlwdHMKZGF0YSA9IHtiYXNlfQoKW29zMl9ob21lXQpzdGRsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0KcGxhdHN0ZGxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fQpwdXJlbGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9L3NpdGUtcGFja2FnZXMKcGxhdGxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fS9zaXRlLXBhY2thZ2VzCmluY2x1ZGUgPSB7dXNlcmJhc2V9L2luY2x1ZGUvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9CnNjcmlwdHMgPSB7dXNlcmJhc2V9L2JpbgpkYXRhID0ge3VzZXJiYXNlfQoKW250X3VzZXJdCnN0ZGxpYiA9IHt1c2VyYmFzZX0vUHl0aG9ue3B5X3ZlcnNpb25fbm9kb3R9CnBsYXRzdGRsaWIgPSB7dXNlcmJhc2V9L1B5dGhvbntweV92ZXJzaW9uX25vZG90fQpwdXJlbGliID0ge3VzZXJiYXNlfS9QeXRob257cHlfdmVyc2lvbl9ub2RvdH0vc2l0ZS1wYWNrYWdlcwpwbGF0bGliID0ge3VzZXJiYXNlfS9QeXRob257cHlfdmVyc2lvbl9ub2RvdH0vc2l0ZS1wYWNrYWdlcwppbmNsdWRlID0ge3VzZXJiYXNlfS9QeXRob257cHlfdmVyc2lvbl9ub2RvdH0vSW5jbHVkZQpzY3JpcHRzID0ge3VzZXJiYXNlfS9TY3JpcHRzCmRhdGEgPSB7dXNlcmJhc2V9CgpbcG9zaXhfdXNlcl0Kc3RkbGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9CnBsYXRzdGRsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0KcHVyZWxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fS9zaXRlLXBhY2thZ2VzCnBsYXRsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0vc2l0ZS1wYWNrYWdlcwppbmNsdWRlID0ge3VzZXJiYXNlfS9pbmNsdWRlL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fQpzY3JpcHRzID0ge3VzZXJiYXNlfS9iaW4KZGF0YSA9IHt1c2VyYmFzZX0KCltvc3hfZnJhbWV3b3JrX3VzZXJdCnN0ZGxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbgpwbGF0c3RkbGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9uCnB1cmVsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob24vc2l0ZS1wYWNrYWdlcwpwbGF0bGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9uL3NpdGUtcGFja2FnZXMKaW5jbHVkZSA9IHt1c2VyYmFzZX0vaW5jbHVkZQpzY3JpcHRzID0ge3VzZXJiYXNlfS9iaW4KZGF0YSA9IHt1c2VyYmFzZX0KUEsDBBQAAAAAAAAAIQA2D1LWS2kAAEtpAAA6AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L3N5c2NvbmZpZy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwoiIiJBY2Nlc3MgdG8gUHl0aG9uJ3MgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4iIiIKCmltcG9ydCBjb2RlY3MKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgc3lzCmZyb20gb3MucGF0aCBpbXBvcnQgcGFyZGlyLCByZWFscGF0aAp0cnk6CiAgICBpbXBvcnQgY29uZmlncGFyc2VyCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydCBDb25maWdQYXJzZXIgYXMgY29uZmlncGFyc2VyCgoKX19hbGxfXyA9IFsKICAgICdnZXRfY29uZmlnX2hfZmlsZW5hbWUnLAogICAgJ2dldF9jb25maWdfdmFyJywKICAgICdnZXRfY29uZmlnX3ZhcnMnLAogICAgJ2dldF9tYWtlZmlsZV9maWxlbmFtZScsCiAgICAnZ2V0X3BhdGgnLAogICAgJ2dldF9wYXRoX25hbWVzJywKICAgICdnZXRfcGF0aHMnLAogICAgJ2dldF9wbGF0Zm9ybScsCiAgICAnZ2V0X3B5dGhvbl92ZXJzaW9uJywKICAgICdnZXRfc2NoZW1lX25hbWVzJywKICAgICdwYXJzZV9jb25maWdfaCcsCl0KCgpkZWYgX3NhZmVfcmVhbHBhdGgocGF0aCk6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIHJlYWxwYXRoKHBhdGgpCiAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICByZXR1cm4gcGF0aAoKCmlmIHN5cy5leGVjdXRhYmxlOgogICAgX1BST0pFQ1RfQkFTRSA9IG9zLnBhdGguZGlybmFtZShfc2FmZV9yZWFscGF0aChzeXMuZXhlY3V0YWJsZSkpCmVsc2U6CiAgICAjIHN5cy5leGVjdXRhYmxlIGNhbiBiZSBlbXB0eSBpZiBhcmd2WzBdIGhhcyBiZWVuIGNoYW5nZWQgYW5kIFB5dGhvbiBpcwogICAgIyB1bmFibGUgdG8gcmV0cmlldmUgdGhlIHJlYWwgcHJvZ3JhbSBuYW1lCiAgICBfUFJPSkVDVF9CQVNFID0gX3NhZmVfcmVhbHBhdGgob3MuZ2V0Y3dkKCkpCgppZiBvcy5uYW1lID09ICJudCIgYW5kICJwY2J1aWxkIiBpbiBfUFJPSkVDVF9CQVNFWy04Ol0ubG93ZXIoKToKICAgIF9QUk9KRUNUX0JBU0UgPSBfc2FmZV9yZWFscGF0aChvcy5wYXRoLmpvaW4oX1BST0pFQ1RfQkFTRSwgcGFyZGlyKSkKIyBQQy9WUzcuMQppZiBvcy5uYW1lID09ICJudCIgYW5kICJcXHBjXFx2IiBpbiBfUFJPSkVDVF9CQVNFWy0xMDpdLmxvd2VyKCk6CiAgICBfUFJPSkVDVF9CQVNFID0gX3NhZmVfcmVhbHBhdGgob3MucGF0aC5qb2luKF9QUk9KRUNUX0JBU0UsIHBhcmRpciwgcGFyZGlyKSkKIyBQQy9BTUQ2NAppZiBvcy5uYW1lID09ICJudCIgYW5kICJcXHBjYnVpbGRcXGFtZDY0IiBpbiBfUFJPSkVDVF9CQVNFWy0xNDpdLmxvd2VyKCk6CiAgICBfUFJPSkVDVF9CQVNFID0gX3NhZmVfcmVhbHBhdGgob3MucGF0aC5qb2luKF9QUk9KRUNUX0JBU0UsIHBhcmRpciwgcGFyZGlyKSkKCgpkZWYgaXNfcHl0aG9uX2J1aWxkKCk6CiAgICBmb3IgZm4gaW4gKCJTZXR1cC5kaXN0IiwgIlNldHVwLmxvY2FsIik6CiAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKF9QUk9KRUNUX0JBU0UsICJNb2R1bGVzIiwgZm4pKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQoKX1BZVEhPTl9CVUlMRCA9IGlzX3B5dGhvbl9idWlsZCgpCgpfY2ZnX3JlYWQgPSBGYWxzZQoKZGVmIF9lbnN1cmVfY2ZnX3JlYWQoKToKICAgIGdsb2JhbCBfY2ZnX3JlYWQKICAgIGlmIG5vdCBfY2ZnX3JlYWQ6CiAgICAgICAgZnJvbSAuLnJlc291cmNlcyBpbXBvcnQgZmluZGVyCiAgICAgICAgYmFja3BvcnRfcGFja2FnZSA9IF9fbmFtZV9fLnJzcGxpdCgnLicsIDEpWzBdCiAgICAgICAgX2ZpbmRlciA9IGZpbmRlcihiYWNrcG9ydF9wYWNrYWdlKQogICAgICAgIF9jZmdmaWxlID0gX2ZpbmRlci5maW5kKCdzeXNjb25maWcuY2ZnJykKICAgICAgICBhc3NlcnQgX2NmZ2ZpbGUsICdzeXNjb25maWcuY2ZnIGV4aXN0cycKICAgICAgICB3aXRoIF9jZmdmaWxlLmFzX3N0cmVhbSgpIGFzIHM6CiAgICAgICAgICAgIF9TQ0hFTUVTLnJlYWRmcChzKQogICAgICAgIGlmIF9QWVRIT05fQlVJTEQ6CiAgICAgICAgICAgIGZvciBzY2hlbWUgaW4gKCdwb3NpeF9wcmVmaXgnLCAncG9zaXhfaG9tZScpOgogICAgICAgICAgICAgICAgX1NDSEVNRVMuc2V0KHNjaGVtZSwgJ2luY2x1ZGUnLCAne3NyY2Rpcn0vSW5jbHVkZScpCiAgICAgICAgICAgICAgICBfU0NIRU1FUy5zZXQoc2NoZW1lLCAncGxhdGluY2x1ZGUnLCAne3Byb2plY3RiYXNlfS8uJykKCiAgICAgICAgX2NmZ19yZWFkID0gVHJ1ZQoKCl9TQ0hFTUVTID0gY29uZmlncGFyc2VyLlJhd0NvbmZpZ1BhcnNlcigpCl9WQVJfUkVQTCA9IHJlLmNvbXBpbGUocidceyhbXntdKj8pXH0nKQoKZGVmIF9leHBhbmRfZ2xvYmFscyhjb25maWcpOgogICAgX2Vuc3VyZV9jZmdfcmVhZCgpCiAgICBpZiBjb25maWcuaGFzX3NlY3Rpb24oJ2dsb2JhbHMnKToKICAgICAgICBnbG9iYWxzID0gY29uZmlnLml0ZW1zKCdnbG9iYWxzJykKICAgIGVsc2U6CiAgICAgICAgZ2xvYmFscyA9IHR1cGxlKCkKCiAgICBzZWN0aW9ucyA9IGNvbmZpZy5zZWN0aW9ucygpCiAgICBmb3Igc2VjdGlvbiBpbiBzZWN0aW9uczoKICAgICAgICBpZiBzZWN0aW9uID09ICdnbG9iYWxzJzoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBmb3Igb3B0aW9uLCB2YWx1ZSBpbiBnbG9iYWxzOgogICAgICAgICAgICBpZiBjb25maWcuaGFzX29wdGlvbihzZWN0aW9uLCBvcHRpb24pOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgY29uZmlnLnNldChzZWN0aW9uLCBvcHRpb24sIHZhbHVlKQogICAgY29uZmlnLnJlbW92ZV9zZWN0aW9uKCdnbG9iYWxzJykKCiAgICAjIG5vdyBleHBhbmRpbmcgbG9jYWwgdmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIGNmZyBmaWxlCiAgICAjCiAgICBmb3Igc2VjdGlvbiBpbiBjb25maWcuc2VjdGlvbnMoKToKICAgICAgICB2YXJpYWJsZXMgPSBkaWN0KGNvbmZpZy5pdGVtcyhzZWN0aW9uKSkKCiAgICAgICAgZGVmIF9yZXBsYWNlcihtYXRjaG9iaik6CiAgICAgICAgICAgIG5hbWUgPSBtYXRjaG9iai5ncm91cCgxKQogICAgICAgICAgICBpZiBuYW1lIGluIHZhcmlhYmxlczoKICAgICAgICAgICAgICAgIHJldHVybiB2YXJpYWJsZXNbbmFtZV0KICAgICAgICAgICAgcmV0dXJuIG1hdGNob2JqLmdyb3VwKDApCgogICAgICAgIGZvciBvcHRpb24sIHZhbHVlIGluIGNvbmZpZy5pdGVtcyhzZWN0aW9uKToKICAgICAgICAgICAgY29uZmlnLnNldChzZWN0aW9uLCBvcHRpb24sIF9WQVJfUkVQTC5zdWIoX3JlcGxhY2VyLCB2YWx1ZSkpCgojX2V4cGFuZF9nbG9iYWxzKF9TQ0hFTUVTKQoKICMgRklYTUUgZG9uJ3QgcmVseSBvbiBzeXMudmVyc2lvbiBoZXJlLCBpdHMgZm9ybWF0IGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbAogIyBvZiBDUHl0aG9uLCB1c2Ugc3lzLnZlcnNpb25faW5mbyBvciBzeXMuaGV4dmVyc2lvbgpfUFlfVkVSU0lPTiA9IHN5cy52ZXJzaW9uLnNwbGl0KClbMF0KX1BZX1ZFUlNJT05fU0hPUlQgPSBzeXMudmVyc2lvbls6M10KX1BZX1ZFUlNJT05fU0hPUlRfTk9fRE9UID0gX1BZX1ZFUlNJT05bMF0gKyBfUFlfVkVSU0lPTlsyXQpfUFJFRklYID0gb3MucGF0aC5ub3JtcGF0aChzeXMucHJlZml4KQpfRVhFQ19QUkVGSVggPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5leGVjX3ByZWZpeCkKX0NPTkZJR19WQVJTID0gTm9uZQpfVVNFUl9CQVNFID0gTm9uZQoKCmRlZiBfc3Vic3RfdmFycyhwYXRoLCBsb2NhbF92YXJzKToKICAgICIiIkluIHRoZSBzdHJpbmcgYHBhdGhgLCByZXBsYWNlIHRva2VucyBsaWtlIHtzb21lLnRoaW5nfSB3aXRoIHRoZQogICAgY29ycmVzcG9uZGluZyB2YWx1ZSBmcm9tIHRoZSBtYXAgYGxvY2FsX3ZhcnNgLgoKICAgIElmIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgdmFsdWUsIGxlYXZlIHRoZSB0b2tlbiB1bmNoYW5nZWQuCiAgICAiIiIKICAgIGRlZiBfcmVwbGFjZXIobWF0Y2hvYmopOgogICAgICAgIG5hbWUgPSBtYXRjaG9iai5ncm91cCgxKQogICAgICAgIGlmIG5hbWUgaW4gbG9jYWxfdmFyczoKICAgICAgICAgICAgcmV0dXJuIGxvY2FsX3ZhcnNbbmFtZV0KICAgICAgICBlbGlmIG5hbWUgaW4gb3MuZW52aXJvbjoKICAgICAgICAgICAgcmV0dXJuIG9zLmVudmlyb25bbmFtZV0KICAgICAgICByZXR1cm4gbWF0Y2hvYmouZ3JvdXAoMCkKICAgIHJldHVybiBfVkFSX1JFUEwuc3ViKF9yZXBsYWNlciwgcGF0aCkKCgpkZWYgX2V4dGVuZF9kaWN0KHRhcmdldF9kaWN0LCBvdGhlcl9kaWN0KToKICAgIHRhcmdldF9rZXlzID0gdGFyZ2V0X2RpY3Qua2V5cygpCiAgICBmb3Iga2V5LCB2YWx1ZSBpbiBvdGhlcl9kaWN0Lml0ZW1zKCk6CiAgICAgICAgaWYga2V5IGluIHRhcmdldF9rZXlzOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIHRhcmdldF9kaWN0W2tleV0gPSB2YWx1ZQoKCmRlZiBfZXhwYW5kX3ZhcnMoc2NoZW1lLCB2YXJzKToKICAgIHJlcyA9IHt9CiAgICBpZiB2YXJzIGlzIE5vbmU6CiAgICAgICAgdmFycyA9IHt9CiAgICBfZXh0ZW5kX2RpY3QodmFycywgZ2V0X2NvbmZpZ192YXJzKCkpCgogICAgZm9yIGtleSwgdmFsdWUgaW4gX1NDSEVNRVMuaXRlbXMoc2NoZW1lKToKICAgICAgICBpZiBvcy5uYW1lIGluICgncG9zaXgnLCAnbnQnKToKICAgICAgICAgICAgdmFsdWUgPSBvcy5wYXRoLmV4cGFuZHVzZXIodmFsdWUpCiAgICAgICAgcmVzW2tleV0gPSBvcy5wYXRoLm5vcm1wYXRoKF9zdWJzdF92YXJzKHZhbHVlLCB2YXJzKSkKICAgIHJldHVybiByZXMKCgpkZWYgZm9ybWF0X3ZhbHVlKHZhbHVlLCB2YXJzKToKICAgIGRlZiBfcmVwbGFjZXIobWF0Y2hvYmopOgogICAgICAgIG5hbWUgPSBtYXRjaG9iai5ncm91cCgxKQogICAgICAgIGlmIG5hbWUgaW4gdmFyczoKICAgICAgICAgICAgcmV0dXJuIHZhcnNbbmFtZV0KICAgICAgICByZXR1cm4gbWF0Y2hvYmouZ3JvdXAoMCkKICAgIHJldHVybiBfVkFSX1JFUEwuc3ViKF9yZXBsYWNlciwgdmFsdWUpCgoKZGVmIF9nZXRfZGVmYXVsdF9zY2hlbWUoKToKICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKICAgICAgICAjIHRoZSBkZWZhdWx0IHNjaGVtZSBmb3IgcG9zaXggaXMgcG9zaXhfcHJlZml4CiAgICAgICAgcmV0dXJuICdwb3NpeF9wcmVmaXgnCiAgICByZXR1cm4gb3MubmFtZQoKCmRlZiBfZ2V0dXNlcmJhc2UoKToKICAgIGVudl9iYXNlID0gb3MuZW52aXJvbi5nZXQoIlBZVEhPTlVTRVJCQVNFIiwgTm9uZSkKCiAgICBkZWYgam9pbnVzZXIoKmFyZ3MpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmV4cGFuZHVzZXIob3MucGF0aC5qb2luKCphcmdzKSkKCiAgICAjIHdoYXQgYWJvdXQgJ29zMmVteCcsICdyaXNjb3MnID8KICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKICAgICAgICBiYXNlID0gb3MuZW52aXJvbi5nZXQoIkFQUERBVEEiKSBvciAifiIKICAgICAgICBpZiBlbnZfYmFzZToKICAgICAgICAgICAgcmV0dXJuIGVudl9iYXNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGpvaW51c2VyKGJhc2UsICJQeXRob24iKQoKICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgICAgICBmcmFtZXdvcmsgPSBnZXRfY29uZmlnX3ZhcigiUFlUSE9ORlJBTUVXT1JLIikKICAgICAgICBpZiBmcmFtZXdvcms6CiAgICAgICAgICAgIGlmIGVudl9iYXNlOgogICAgICAgICAgICAgICAgcmV0dXJuIGVudl9iYXNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gam9pbnVzZXIoIn4iLCAiTGlicmFyeSIsIGZyYW1ld29yaywgIiVkLiVkIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25faW5mb1s6Ml0pCgogICAgaWYgZW52X2Jhc2U6CiAgICAgICAgcmV0dXJuIGVudl9iYXNlCiAgICBlbHNlOgogICAgICAgIHJldHVybiBqb2ludXNlcigifiIsICIubG9jYWwiKQoKCmRlZiBfcGFyc2VfbWFrZWZpbGUoZmlsZW5hbWUsIHZhcnM9Tm9uZSk6CiAgICAiIiJQYXJzZSBhIE1ha2VmaWxlLXN0eWxlIGZpbGUuCgogICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbmFtZS92YWx1ZSBwYWlycyBpcyByZXR1cm5lZC4gIElmIGFuCiAgICBvcHRpb25hbCBkaWN0aW9uYXJ5IGlzIHBhc3NlZCBpbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpdCBpcwogICAgdXNlZCBpbnN0ZWFkIG9mIGEgbmV3IGRpY3Rpb25hcnkuCiAgICAiIiIKICAgICMgUmVnZXhlcyBuZWVkZWQgZm9yIHBhcnNpbmcgTWFrZWZpbGUgKGFuZCBzaW1pbGFyIHN5bnRheGVzLAogICAgIyBsaWtlIG9sZC1zdHlsZSBTZXR1cCBmaWxlcykuCiAgICBfdmFyaWFibGVfcnggPSByZS5jb21waWxlKCIoW2EtekEtWl1bYS16QS1aMC05X10rKVxzKj1ccyooLiopIikKICAgIF9maW5kdmFyMV9yeCA9IHJlLmNvbXBpbGUociJcJFwoKFtBLVphLXpdW0EtWmEtejAtOV9dKilcKSIpCiAgICBfZmluZHZhcjJfcnggPSByZS5jb21waWxlKHIiXCR7KFtBLVphLXpdW0EtWmEtejAtOV9dKil9IikKCiAgICBpZiB2YXJzIGlzIE5vbmU6CiAgICAgICAgdmFycyA9IHt9CiAgICBkb25lID0ge30KICAgIG5vdGRvbmUgPSB7fQoKICAgIHdpdGggY29kZWNzLm9wZW4oZmlsZW5hbWUsIGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0ic3Vycm9nYXRlZXNjYXBlIikgYXMgZjoKICAgICAgICBsaW5lcyA9IGYucmVhZGxpbmVzKCkKCiAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJyMnKSBvciBsaW5lLnN0cmlwKCkgPT0gJyc6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgbSA9IF92YXJpYWJsZV9yeC5tYXRjaChsaW5lKQogICAgICAgIGlmIG06CiAgICAgICAgICAgIG4sIHYgPSBtLmdyb3VwKDEsIDIpCiAgICAgICAgICAgIHYgPSB2LnN0cmlwKCkKICAgICAgICAgICAgIyBgJCQnIGlzIGEgbGl0ZXJhbCBgJCcgaW4gbWFrZQogICAgICAgICAgICB0bXB2ID0gdi5yZXBsYWNlKCckJCcsICcnKQoKICAgICAgICAgICAgaWYgIiQiIGluIHRtcHY6CiAgICAgICAgICAgICAgICBub3Rkb25lW25dID0gdgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHYgPSBpbnQodikKICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICMgaW5zZXJ0IGxpdGVyYWwgYCQnCiAgICAgICAgICAgICAgICAgICAgZG9uZVtuXSA9IHYucmVwbGFjZSgnJCQnLCAnJCcpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGRvbmVbbl0gPSB2CgogICAgIyBkbyB2YXJpYWJsZSBpbnRlcnBvbGF0aW9uIGhlcmUKICAgIHZhcmlhYmxlcyA9IGxpc3Qobm90ZG9uZS5rZXlzKCkpCgogICAgIyBWYXJpYWJsZXMgd2l0aCBhICdQWV8nIHByZWZpeCBpbiB0aGUgbWFrZWZpbGUuIFRoZXNlIG5lZWQgdG8KICAgICMgYmUgbWFkZSBhdmFpbGFibGUgd2l0aG91dCB0aGF0IHByZWZpeCB0aHJvdWdoIHN5c2NvbmZpZy4KICAgICMgU3BlY2lhbCBjYXJlIGlzIG5lZWRlZCB0byBlbnN1cmUgdGhhdCB2YXJpYWJsZSBleHBhbnNpb24gd29ya3MsIGV2ZW4KICAgICMgaWYgdGhlIGV4cGFuc2lvbiB1c2VzIHRoZSBuYW1lIHdpdGhvdXQgYSBwcmVmaXguCiAgICByZW5hbWVkX3ZhcmlhYmxlcyA9ICgnQ0ZMQUdTJywgJ0xERkxBR1MnLCAnQ1BQRkxBR1MnKQoKICAgIHdoaWxlIGxlbih2YXJpYWJsZXMpID4gMDoKICAgICAgICBmb3IgbmFtZSBpbiB0dXBsZSh2YXJpYWJsZXMpOgogICAgICAgICAgICB2YWx1ZSA9IG5vdGRvbmVbbmFtZV0KICAgICAgICAgICAgbSA9IF9maW5kdmFyMV9yeC5zZWFyY2godmFsdWUpIG9yIF9maW5kdmFyMl9yeC5zZWFyY2godmFsdWUpCiAgICAgICAgICAgIGlmIG0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBuID0gbS5ncm91cCgxKQogICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlCiAgICAgICAgICAgICAgICBpZiBuIGluIGRvbmU6CiAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHN0cihkb25lW25dKQogICAgICAgICAgICAgICAgZWxpZiBuIGluIG5vdGRvbmU6CiAgICAgICAgICAgICAgICAgICAgIyBnZXQgaXQgb24gYSBzdWJzZXF1ZW50IHJvdW5kCiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBGYWxzZQogICAgICAgICAgICAgICAgZWxpZiBuIGluIG9zLmVudmlyb246CiAgICAgICAgICAgICAgICAgICAgIyBkbyBpdCBsaWtlIG1ha2U6IGZhbGwgYmFjayB0byBlbnZpcm9ubWVudAogICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBvcy5lbnZpcm9uW25dCgogICAgICAgICAgICAgICAgZWxpZiBuIGluIHJlbmFtZWRfdmFyaWFibGVzOgogICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c3dpdGgoJ1BZXycpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lWzM6XSBpbiByZW5hbWVkX3ZhcmlhYmxlcyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSAiIgoKICAgICAgICAgICAgICAgICAgICBlbGlmICdQWV8nICsgbiBpbiBub3Rkb25lOgogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IEZhbHNlCgogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBzdHIoZG9uZVsnUFlfJyArIG5dKQoKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZG9uZVtuXSA9IGl0ZW0gPSAiIgoKICAgICAgICAgICAgICAgIGlmIGZvdW5kOgogICAgICAgICAgICAgICAgICAgIGFmdGVyID0gdmFsdWVbbS5lbmQoKTpdCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVs6bS5zdGFydCgpXSArIGl0ZW0gKyBhZnRlcgogICAgICAgICAgICAgICAgICAgIGlmICIkIiBpbiBhZnRlcjoKICAgICAgICAgICAgICAgICAgICAgICAgbm90ZG9uZVtuYW1lXSA9IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBpbnQodmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZVtuYW1lXSA9IHZhbHVlLnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVbbmFtZV0gPSB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMucmVtb3ZlKG5hbWUpCgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHN3aXRoKCdQWV8nKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVbMzpdIGluIHJlbmFtZWRfdmFyaWFibGVzKToKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVszOl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIGRvbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZVtuYW1lXSA9IHZhbHVlCgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBib2d1cyB2YXJpYWJsZSByZWZlcmVuY2UgKGUuZy4gInByZWZpeD0kL29wdC9weXRob24iKTsKICAgICAgICAgICAgICAgICMganVzdCBkcm9wIGl0IHNpbmNlIHdlIGNhbid0IGRlYWwKICAgICAgICAgICAgICAgIGRvbmVbbmFtZV0gPSB2YWx1ZQogICAgICAgICAgICAgICAgdmFyaWFibGVzLnJlbW92ZShuYW1lKQoKICAgICMgc3RyaXAgc3B1cmlvdXMgc3BhY2VzCiAgICBmb3IgaywgdiBpbiBkb25lLml0ZW1zKCk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSh2LCBzdHIpOgogICAgICAgICAgICBkb25lW2tdID0gdi5zdHJpcCgpCgogICAgIyBzYXZlIHRoZSByZXN1bHRzIGluIHRoZSBnbG9iYWwgZGljdGlvbmFyeQogICAgdmFycy51cGRhdGUoZG9uZSkKICAgIHJldHVybiB2YXJzCgoKZGVmIGdldF9tYWtlZmlsZV9maWxlbmFtZSgpOgogICAgIiIiUmV0dXJuIHRoZSBwYXRoIG9mIHRoZSBNYWtlZmlsZS4iIiIKICAgIGlmIF9QWVRIT05fQlVJTEQ6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihfUFJPSkVDVF9CQVNFLCAiTWFrZWZpbGUiKQogICAgaWYgaGFzYXR0cihzeXMsICdhYmlmbGFncycpOgogICAgICAgIGNvbmZpZ19kaXJfbmFtZSA9ICdjb25maWctJXMlcycgJSAoX1BZX1ZFUlNJT05fU0hPUlQsIHN5cy5hYmlmbGFncykKICAgIGVsc2U6CiAgICAgICAgY29uZmlnX2Rpcl9uYW1lID0gJ2NvbmZpZycKICAgIHJldHVybiBvcy5wYXRoLmpvaW4oZ2V0X3BhdGgoJ3N0ZGxpYicpLCBjb25maWdfZGlyX25hbWUsICdNYWtlZmlsZScpCgoKZGVmIF9pbml0X3Bvc2l4KHZhcnMpOgogICAgIiIiSW5pdGlhbGl6ZSB0aGUgbW9kdWxlIGFzIGFwcHJvcHJpYXRlIGZvciBQT1NJWCBzeXN0ZW1zLiIiIgogICAgIyBsb2FkIHRoZSBpbnN0YWxsZWQgTWFrZWZpbGU6CiAgICBtYWtlZmlsZSA9IGdldF9tYWtlZmlsZV9maWxlbmFtZSgpCiAgICB0cnk6CiAgICAgICAgX3BhcnNlX21ha2VmaWxlKG1ha2VmaWxlLCB2YXJzKQogICAgZXhjZXB0IElPRXJyb3IgYXMgZToKICAgICAgICBtc2cgPSAiaW52YWxpZCBQeXRob24gaW5zdGFsbGF0aW9uOiB1bmFibGUgdG8gb3BlbiAlcyIgJSBtYWtlZmlsZQogICAgICAgIGlmIGhhc2F0dHIoZSwgInN0cmVycm9yIik6CiAgICAgICAgICAgIG1zZyA9IG1zZyArICIgKCVzKSIgJSBlLnN0cmVycm9yCiAgICAgICAgcmFpc2UgSU9FcnJvcihtc2cpCiAgICAjIGxvYWQgdGhlIGluc3RhbGxlZCBweWNvbmZpZy5oOgogICAgY29uZmlnX2ggPSBnZXRfY29uZmlnX2hfZmlsZW5hbWUoKQogICAgdHJ5OgogICAgICAgIHdpdGggb3Blbihjb25maWdfaCkgYXMgZjoKICAgICAgICAgICAgcGFyc2VfY29uZmlnX2goZiwgdmFycykKICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CiAgICAgICAgbXNnID0gImludmFsaWQgUHl0aG9uIGluc3RhbGxhdGlvbjogdW5hYmxlIHRvIG9wZW4gJXMiICUgY29uZmlnX2gKICAgICAgICBpZiBoYXNhdHRyKGUsICJzdHJlcnJvciIpOgogICAgICAgICAgICBtc2cgPSBtc2cgKyAiICglcykiICUgZS5zdHJlcnJvcgogICAgICAgIHJhaXNlIElPRXJyb3IobXNnKQogICAgIyBPbiBBSVgsIHRoZXJlIGFyZSB3cm9uZyBwYXRocyB0byB0aGUgbGlua2VyIHNjcmlwdHMgaW4gdGhlIE1ha2VmaWxlCiAgICAjIC0tIHRoZXNlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgUHl0aG9uIHNvdXJjZSwgYnV0IHdoZW4gaW5zdGFsbGVkCiAgICAjIHRoZSBzY3JpcHRzIGFyZSBpbiBhbm90aGVyIGRpcmVjdG9yeS4KICAgIGlmIF9QWVRIT05fQlVJTEQ6CiAgICAgICAgdmFyc1snTERTSEFSRUQnXSA9IHZhcnNbJ0JMRFNIQVJFRCddCgoKZGVmIF9pbml0X25vbl9wb3NpeCh2YXJzKToKICAgICIiIkluaXRpYWxpemUgdGhlIG1vZHVsZSBhcyBhcHByb3ByaWF0ZSBmb3IgTlQiIiIKICAgICMgc2V0IGJhc2ljIGluc3RhbGwgZGlyZWN0b3JpZXMKICAgIHZhcnNbJ0xJQkRFU1QnXSA9IGdldF9wYXRoKCdzdGRsaWInKQogICAgdmFyc1snQklOTElCREVTVCddID0gZ2V0X3BhdGgoJ3BsYXRzdGRsaWInKQogICAgdmFyc1snSU5DTFVERVBZJ10gPSBnZXRfcGF0aCgnaW5jbHVkZScpCiAgICB2YXJzWydTTyddID0gJy5weWQnCiAgICB2YXJzWydFWEUnXSA9ICcuZXhlJwogICAgdmFyc1snVkVSU0lPTiddID0gX1BZX1ZFUlNJT05fU0hPUlRfTk9fRE9UCiAgICB2YXJzWydCSU5ESVInXSA9IG9zLnBhdGguZGlybmFtZShfc2FmZV9yZWFscGF0aChzeXMuZXhlY3V0YWJsZSkpCgojCiMgcHVibGljIEFQSXMKIwoKCmRlZiBwYXJzZV9jb25maWdfaChmcCwgdmFycz1Ob25lKToKICAgICIiIlBhcnNlIGEgY29uZmlnLmgtc3R5bGUgZmlsZS4KCiAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBuYW1lL3ZhbHVlIHBhaXJzIGlzIHJldHVybmVkLiAgSWYgYW4KICAgIG9wdGlvbmFsIGRpY3Rpb25hcnkgaXMgcGFzc2VkIGluIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQsIGl0IGlzCiAgICB1c2VkIGluc3RlYWQgb2YgYSBuZXcgZGljdGlvbmFyeS4KICAgICIiIgogICAgaWYgdmFycyBpcyBOb25lOgogICAgICAgIHZhcnMgPSB7fQogICAgZGVmaW5lX3J4ID0gcmUuY29tcGlsZSgiI2RlZmluZSAoW0EtWl1bQS1aYS16MC05X10rKSAoLiopXG4iKQogICAgdW5kZWZfcnggPSByZS5jb21waWxlKCIvWypdICN1bmRlZiAoW0EtWl1bQS1aYS16MC05X10rKSBbKl0vXG4iKQoKICAgIHdoaWxlIFRydWU6CiAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKICAgICAgICBpZiBub3QgbGluZToKICAgICAgICAgICAgYnJlYWsKICAgICAgICBtID0gZGVmaW5lX3J4Lm1hdGNoKGxpbmUpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgbiwgdiA9IG0uZ3JvdXAoMSwgMikKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdiA9IGludCh2KQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgdmFyc1tuXSA9IHYKICAgICAgICBlbHNlOgogICAgICAgICAgICBtID0gdW5kZWZfcngubWF0Y2gobGluZSkKICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgIHZhcnNbbS5ncm91cCgxKV0gPSAwCiAgICByZXR1cm4gdmFycwoKCmRlZiBnZXRfY29uZmlnX2hfZmlsZW5hbWUoKToKICAgICIiIlJldHVybiB0aGUgcGF0aCBvZiBweWNvbmZpZy5oLiIiIgogICAgaWYgX1BZVEhPTl9CVUlMRDoKICAgICAgICBpZiBvcy5uYW1lID09ICJudCI6CiAgICAgICAgICAgIGluY19kaXIgPSBvcy5wYXRoLmpvaW4oX1BST0pFQ1RfQkFTRSwgIlBDIikKICAgICAgICBlbHNlOgogICAgICAgICAgICBpbmNfZGlyID0gX1BST0pFQ1RfQkFTRQogICAgZWxzZToKICAgICAgICBpbmNfZGlyID0gZ2V0X3BhdGgoJ3BsYXRpbmNsdWRlJykKICAgIHJldHVybiBvcy5wYXRoLmpvaW4oaW5jX2RpciwgJ3B5Y29uZmlnLmgnKQoKCmRlZiBnZXRfc2NoZW1lX25hbWVzKCk6CiAgICAiIiJSZXR1cm4gYSB0dXBsZSBjb250YWluaW5nIHRoZSBzY2hlbWVzIG5hbWVzLiIiIgogICAgcmV0dXJuIHR1cGxlKHNvcnRlZChfU0NIRU1FUy5zZWN0aW9ucygpKSkKCgpkZWYgZ2V0X3BhdGhfbmFtZXMoKToKICAgICIiIlJldHVybiBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhdGhzIG5hbWVzLiIiIgogICAgIyB4eHggc2VlIGlmIHdlIHdhbnQgYSBzdGF0aWMgbGlzdAogICAgcmV0dXJuIF9TQ0hFTUVTLm9wdGlvbnMoJ3Bvc2l4X3ByZWZpeCcpCgoKZGVmIGdldF9wYXRocyhzY2hlbWU9X2dldF9kZWZhdWx0X3NjaGVtZSgpLCB2YXJzPU5vbmUsIGV4cGFuZD1UcnVlKToKICAgICIiIlJldHVybiBhIG1hcHBpbmcgY29udGFpbmluZyBhbiBpbnN0YWxsIHNjaGVtZS4KCiAgICBgYHNjaGVtZWBgIGlzIHRoZSBpbnN0YWxsIHNjaGVtZSBuYW1lLiBJZiBub3QgcHJvdmlkZWQsIGl0IHdpbGwKICAgIHJldHVybiB0aGUgZGVmYXVsdCBzY2hlbWUgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLgogICAgIiIiCiAgICBfZW5zdXJlX2NmZ19yZWFkKCkKICAgIGlmIGV4cGFuZDoKICAgICAgICByZXR1cm4gX2V4cGFuZF92YXJzKHNjaGVtZSwgdmFycykKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIGRpY3QoX1NDSEVNRVMuaXRlbXMoc2NoZW1lKSkKCgpkZWYgZ2V0X3BhdGgobmFtZSwgc2NoZW1lPV9nZXRfZGVmYXVsdF9zY2hlbWUoKSwgdmFycz1Ob25lLCBleHBhbmQ9VHJ1ZSk6CiAgICAiIiJSZXR1cm4gYSBwYXRoIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjaGVtZS4KCiAgICBgYHNjaGVtZWBgIGlzIHRoZSBpbnN0YWxsIHNjaGVtZSBuYW1lLgogICAgIiIiCiAgICByZXR1cm4gZ2V0X3BhdGhzKHNjaGVtZSwgdmFycywgZXhwYW5kKVtuYW1lXQoKCmRlZiBnZXRfY29uZmlnX3ZhcnMoKmFyZ3MpOgogICAgIiIiV2l0aCBubyBhcmd1bWVudHMsIHJldHVybiBhIGRpY3Rpb25hcnkgb2YgYWxsIGNvbmZpZ3VyYXRpb24KICAgIHZhcmlhYmxlcyByZWxldmFudCBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uCgogICAgT24gVW5peCwgdGhpcyBtZWFucyBldmVyeSB2YXJpYWJsZSBkZWZpbmVkIGluIFB5dGhvbidzIGluc3RhbGxlZCBNYWtlZmlsZTsKICAgIE9uIFdpbmRvd3MgYW5kIE1hYyBPUyBpdCdzIGEgbXVjaCBzbWFsbGVyIHNldC4KCiAgICBXaXRoIGFyZ3VtZW50cywgcmV0dXJuIGEgbGlzdCBvZiB2YWx1ZXMgdGhhdCByZXN1bHQgZnJvbSBsb29raW5nIHVwCiAgICBlYWNoIGFyZ3VtZW50IGluIHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGRpY3Rpb25hcnkuCiAgICAiIiIKICAgIGdsb2JhbCBfQ09ORklHX1ZBUlMKICAgIGlmIF9DT05GSUdfVkFSUyBpcyBOb25lOgogICAgICAgIF9DT05GSUdfVkFSUyA9IHt9CiAgICAgICAgIyBOb3JtYWxpemVkIHZlcnNpb25zIG9mIHByZWZpeCBhbmQgZXhlY19wcmVmaXggYXJlIGhhbmR5IHRvIGhhdmU7CiAgICAgICAgIyBpbiBmYWN0LCB0aGVzZSBhcmUgdGhlIHN0YW5kYXJkIHZlcnNpb25zIHVzZWQgbW9zdCBwbGFjZXMgaW4gdGhlCiAgICAgICAgIyBkaXN0dXRpbHMyIG1vZHVsZS4KICAgICAgICBfQ09ORklHX1ZBUlNbJ3ByZWZpeCddID0gX1BSRUZJWAogICAgICAgIF9DT05GSUdfVkFSU1snZXhlY19wcmVmaXgnXSA9IF9FWEVDX1BSRUZJWAogICAgICAgIF9DT05GSUdfVkFSU1sncHlfdmVyc2lvbiddID0gX1BZX1ZFUlNJT04KICAgICAgICBfQ09ORklHX1ZBUlNbJ3B5X3ZlcnNpb25fc2hvcnQnXSA9IF9QWV9WRVJTSU9OX1NIT1JUCiAgICAgICAgX0NPTkZJR19WQVJTWydweV92ZXJzaW9uX25vZG90J10gPSBfUFlfVkVSU0lPTlswXSArIF9QWV9WRVJTSU9OWzJdCiAgICAgICAgX0NPTkZJR19WQVJTWydiYXNlJ10gPSBfUFJFRklYCiAgICAgICAgX0NPTkZJR19WQVJTWydwbGF0YmFzZSddID0gX0VYRUNfUFJFRklYCiAgICAgICAgX0NPTkZJR19WQVJTWydwcm9qZWN0YmFzZSddID0gX1BST0pFQ1RfQkFTRQogICAgICAgIHRyeToKICAgICAgICAgICAgX0NPTkZJR19WQVJTWydhYmlmbGFncyddID0gc3lzLmFiaWZsYWdzCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAjIHN5cy5hYmlmbGFncyBtYXkgbm90IGJlIGRlZmluZWQgb24gYWxsIHBsYXRmb3Jtcy4KICAgICAgICAgICAgX0NPTkZJR19WQVJTWydhYmlmbGFncyddID0gJycKCiAgICAgICAgaWYgb3MubmFtZSBpbiAoJ250JywgJ29zMicpOgogICAgICAgICAgICBfaW5pdF9ub25fcG9zaXgoX0NPTkZJR19WQVJTKQogICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKICAgICAgICAgICAgX2luaXRfcG9zaXgoX0NPTkZJR19WQVJTKQogICAgICAgICMgU2V0dGluZyAndXNlcmJhc2UnIGlzIGRvbmUgYmVsb3cgdGhlIGNhbGwgdG8gdGhlCiAgICAgICAgIyBpbml0IGZ1bmN0aW9uIHRvIGVuYWJsZSB1c2luZyAnZ2V0X2NvbmZpZ192YXInIGluCiAgICAgICAgIyB0aGUgaW5pdC1mdW5jdGlvbi4KICAgICAgICBpZiBzeXMudmVyc2lvbiA+PSAnMi42JzoKICAgICAgICAgICAgX0NPTkZJR19WQVJTWyd1c2VyYmFzZSddID0gX2dldHVzZXJiYXNlKCkKCiAgICAgICAgaWYgJ3NyY2Rpcicgbm90IGluIF9DT05GSUdfVkFSUzoKICAgICAgICAgICAgX0NPTkZJR19WQVJTWydzcmNkaXInXSA9IF9QUk9KRUNUX0JBU0UKICAgICAgICBlbHNlOgogICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ3NyY2RpciddID0gX3NhZmVfcmVhbHBhdGgoX0NPTkZJR19WQVJTWydzcmNkaXInXSkKCiAgICAgICAgIyBDb252ZXJ0IHNyY2RpciBpbnRvIGFuIGFic29sdXRlIHBhdGggaWYgaXQgYXBwZWFycyBuZWNlc3NhcnkuCiAgICAgICAgIyBOb3JtYWxseSBpdCBpcyByZWxhdGl2ZSB0byB0aGUgYnVpbGQgZGlyZWN0b3J5LiAgSG93ZXZlciwgZHVyaW5nCiAgICAgICAgIyB0ZXN0aW5nLCBmb3IgZXhhbXBsZSwgd2UgbWlnaHQgYmUgcnVubmluZyBhIG5vbi1pbnN0YWxsZWQgcHl0aG9uCiAgICAgICAgIyBmcm9tIGEgZGlmZmVyZW50IGRpcmVjdG9yeS4KICAgICAgICBpZiBfUFlUSE9OX0JVSUxEIGFuZCBvcy5uYW1lID09ICJwb3NpeCI6CiAgICAgICAgICAgIGJhc2UgPSBfUFJPSkVDVF9CQVNFCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGN3ZCA9IG9zLmdldGN3ZCgpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgY3dkID0gTm9uZQogICAgICAgICAgICBpZiAobm90IG9zLnBhdGguaXNhYnMoX0NPTkZJR19WQVJTWydzcmNkaXInXSkgYW5kCiAgICAgICAgICAgICAgICBiYXNlICE9IGN3ZCk6CiAgICAgICAgICAgICAgICAjIHNyY2RpciBpcyByZWxhdGl2ZSBhbmQgd2UgYXJlIG5vdCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKICAgICAgICAgICAgICAgICMgYXMgdGhlIGV4ZWN1dGFibGUuIEFzc3VtZSBleGVjdXRhYmxlIGlzIGluIHRoZSBidWlsZAogICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkgYW5kIG1ha2Ugc3JjZGlyIGFic29sdXRlLgogICAgICAgICAgICAgICAgc3JjZGlyID0gb3MucGF0aC5qb2luKGJhc2UsIF9DT05GSUdfVkFSU1snc3JjZGlyJ10pCiAgICAgICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ3NyY2RpciddID0gb3MucGF0aC5ub3JtcGF0aChzcmNkaXIpCgogICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICAgICAga2VybmVsX3ZlcnNpb24gPSBvcy51bmFtZSgpWzJdICAjIEtlcm5lbCB2ZXJzaW9uICg4LjQuMykKICAgICAgICAgICAgbWFqb3JfdmVyc2lvbiA9IGludChrZXJuZWxfdmVyc2lvbi5zcGxpdCgnLicpWzBdKQoKICAgICAgICAgICAgaWYgbWFqb3JfdmVyc2lvbiA8IDg6CiAgICAgICAgICAgICAgICAjIE9uIG1hY09TIGJlZm9yZSAxMC40LCBjaGVjayBpZiAtYXJjaCBhbmQgLWlzeXNyb290CiAgICAgICAgICAgICAgICAjIGFyZSBpbiBDRkxBR1Mgb3IgTERGTEFHUyBhbmQgcmVtb3ZlIHRoZW0gaWYgdGhleSBhcmUuCiAgICAgICAgICAgICAgICAjIFRoaXMgaXMgbmVlZGVkIHdoZW4gYnVpbGRpbmcgZXh0ZW5zaW9ucyBvbiBhIDEwLjMgc3lzdGVtCiAgICAgICAgICAgICAgICAjIHVzaW5nIGEgdW5pdmVyc2FsIGJ1aWxkIG9mIHB5dGhvbi4KICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gKCdMREZMQUdTJywgJ0JBU0VDRkxBR1MnLAogICAgICAgICAgICAgICAgICAgICAgICAjIGEgbnVtYmVyIG9mIGRlcml2ZWQgdmFyaWFibGVzLiBUaGVzZSBuZWVkIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgICAgICMgcGF0Y2hlZCB1cCBhcyB3ZWxsLgogICAgICAgICAgICAgICAgICAgICAgICAnQ0ZMQUdTJywgJ1BZX0NGTEFHUycsICdCTERTSEFSRUQnKToKICAgICAgICAgICAgICAgICAgICBmbGFncyA9IF9DT05GSUdfVkFSU1trZXldCiAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1hcmNoXHMrXHcrXHMnLCAnICcsIGZsYWdzKQogICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKCctaXN5c3Jvb3QgW14gXHRdKicsICcgJywgZmxhZ3MpCiAgICAgICAgICAgICAgICAgICAgX0NPTkZJR19WQVJTW2tleV0gPSBmbGFncwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBBbGxvdyB0aGUgdXNlciB0byBvdmVycmlkZSB0aGUgYXJjaGl0ZWN0dXJlIGZsYWdzIHVzaW5nCiAgICAgICAgICAgICAgICAjIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLgogICAgICAgICAgICAgICAgIyBOT1RFOiBUaGlzIG5hbWUgd2FzIGludHJvZHVjZWQgYnkgQXBwbGUgaW4gT1NYIDEwLjUgYW5kCiAgICAgICAgICAgICAgICAjIGlzIHVzZWQgYnkgc2V2ZXJhbCBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGRpc3RyaWJ1dGVkIHdpdGgKICAgICAgICAgICAgICAgICMgdGhhdCBPUyByZWxlYXNlLgogICAgICAgICAgICAgICAgaWYgJ0FSQ0hGTEFHUycgaW4gb3MuZW52aXJvbjoKICAgICAgICAgICAgICAgICAgICBhcmNoID0gb3MuZW52aXJvblsnQVJDSEZMQUdTJ10KICAgICAgICAgICAgICAgICAgICBmb3Iga2V5IGluICgnTERGTEFHUycsICdCQVNFQ0ZMQUdTJywKICAgICAgICAgICAgICAgICAgICAgICAgIyBhIG51bWJlciBvZiBkZXJpdmVkIHZhcmlhYmxlcy4gVGhlc2UgbmVlZCB0byBiZQogICAgICAgICAgICAgICAgICAgICAgICAjIHBhdGNoZWQgdXAgYXMgd2VsbC4KICAgICAgICAgICAgICAgICAgICAgICAgJ0NGTEFHUycsICdQWV9DRkxBR1MnLCAnQkxEU0hBUkVEJyk6CgogICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IF9DT05GSUdfVkFSU1trZXldCiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKCctYXJjaFxzK1x3K1xzJywgJyAnLCBmbGFncykKICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBmbGFncyArICcgJyArIGFyY2gKICAgICAgICAgICAgICAgICAgICAgICAgX0NPTkZJR19WQVJTW2tleV0gPSBmbGFncwoKICAgICAgICAgICAgICAgICMgSWYgd2UncmUgb24gT1NYIDEwLjUgb3IgbGF0ZXIgYW5kIHRoZSB1c2VyIHRyaWVzIHRvCiAgICAgICAgICAgICAgICAjIGNvbXBpbGVzIGFuIGV4dGVuc2lvbiB1c2luZyBhbiBTREsgdGhhdCBpcyBub3QgcHJlc2VudAogICAgICAgICAgICAgICAgIyBvbiB0aGUgY3VycmVudCBtYWNoaW5lIGl0IGlzIGJldHRlciB0byBub3QgdXNlIGFuIFNESwogICAgICAgICAgICAgICAgIyB0aGFuIHRvIGZhaWwuCiAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICAjIFRoZSBtYWpvciB1c2VjYXNlIGZvciB0aGlzIGlzIHVzZXJzIHVzaW5nIGEgUHl0aG9uLm9yZwogICAgICAgICAgICAgICAgIyBiaW5hcnkgaW5zdGFsbGVyICBvbiBPU1ggMTAuNjogdGhhdCBpbnN0YWxsZXIgdXNlcwogICAgICAgICAgICAgICAgIyB0aGUgMTAuNHUgU0RLLCBidXQgdGhhdCBTREsgaXMgbm90IGluc3RhbGxlZCBieSBkZWZhdWx0CiAgICAgICAgICAgICAgICAjIHdoZW4geW91IGluc3RhbGwgWGNvZGUuCiAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICBDRkxBR1MgPSBfQ09ORklHX1ZBUlMuZ2V0KCdDRkxBR1MnLCAnJykKICAgICAgICAgICAgICAgIG0gPSByZS5zZWFyY2goJy1pc3lzcm9vdFxzKyhcUyspJywgQ0ZMQUdTKQogICAgICAgICAgICAgICAgaWYgbSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBzZGsgPSBtLmdyb3VwKDEpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNkayk6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gKCdMREZMQUdTJywgJ0JBU0VDRkxBR1MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYSBudW1iZXIgb2YgZGVyaXZlZCB2YXJpYWJsZXMuIFRoZXNlIG5lZWQgdG8gYmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBhdGNoZWQgdXAgYXMgd2VsbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDRkxBR1MnLCAnUFlfQ0ZMQUdTJywgJ0JMRFNIQVJFRCcpOgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gX0NPTkZJR19WQVJTW2tleV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKCctaXN5c3Jvb3RccytcUysoXHN8JCknLCAnICcsIGZsYWdzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NPTkZJR19WQVJTW2tleV0gPSBmbGFncwoKICAgIGlmIGFyZ3M6CiAgICAgICAgdmFscyA9IFtdCiAgICAgICAgZm9yIG5hbWUgaW4gYXJnczoKICAgICAgICAgICAgdmFscy5hcHBlbmQoX0NPTkZJR19WQVJTLmdldChuYW1lKSkKICAgICAgICByZXR1cm4gdmFscwogICAgZWxzZToKICAgICAgICByZXR1cm4gX0NPTkZJR19WQVJTCgoKZGVmIGdldF9jb25maWdfdmFyKG5hbWUpOgogICAgIiIiUmV0dXJuIHRoZSB2YWx1ZSBvZiBhIHNpbmdsZSB2YXJpYWJsZSB1c2luZyB0aGUgZGljdGlvbmFyeSByZXR1cm5lZCBieQogICAgJ2dldF9jb25maWdfdmFycygpJy4KCiAgICBFcXVpdmFsZW50IHRvIGdldF9jb25maWdfdmFycygpLmdldChuYW1lKQogICAgIiIiCiAgICByZXR1cm4gZ2V0X2NvbmZpZ192YXJzKCkuZ2V0KG5hbWUpCgoKZGVmIGdldF9wbGF0Zm9ybSgpOgogICAgIiIiUmV0dXJuIGEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUgY3VycmVudCBwbGF0Zm9ybS4KCiAgICBUaGlzIGlzIHVzZWQgbWFpbmx5IHRvIGRpc3Rpbmd1aXNoIHBsYXRmb3JtLXNwZWNpZmljIGJ1aWxkIGRpcmVjdG9yaWVzIGFuZAogICAgcGxhdGZvcm0tc3BlY2lmaWMgYnVpbHQgZGlzdHJpYnV0aW9ucy4gIFR5cGljYWxseSBpbmNsdWRlcyB0aGUgT1MgbmFtZQogICAgYW5kIHZlcnNpb24gYW5kIHRoZSBhcmNoaXRlY3R1cmUgKGFzIHN1cHBsaWVkIGJ5ICdvcy51bmFtZSgpJyksCiAgICBhbHRob3VnaCB0aGUgZXhhY3QgaW5mb3JtYXRpb24gaW5jbHVkZWQgZGVwZW5kcyBvbiB0aGUgT1M7IGVnLiBmb3IgSVJJWAogICAgdGhlIGFyY2hpdGVjdHVyZSBpc24ndCBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IChJUklYIG9ubHkgcnVucyBvbiBTR0kKICAgIGhhcmR3YXJlKSwgYnV0IGZvciBMaW51eCB0aGUga2VybmVsIHZlcnNpb24gaXNuJ3QgcGFydGljdWxhcmx5CiAgICBpbXBvcnRhbnQuCgogICAgRXhhbXBsZXMgb2YgcmV0dXJuZWQgdmFsdWVzOgogICAgICAgbGludXgtaTU4NgogICAgICAgbGludXgtYWxwaGEgKD8pCiAgICAgICBzb2xhcmlzLTIuNi1zdW40dQogICAgICAgaXJpeC01LjMKICAgICAgIGlyaXg2NC02LjIKCiAgICBXaW5kb3dzIHdpbGwgcmV0dXJuIG9uZSBvZjoKICAgICAgIHdpbi1hbWQ2NCAoNjRiaXQgV2luZG93cyBvbiBBTUQ2NCAoYWthIHg4Nl82NCwgSW50ZWw2NCwgRU02NFQsIGV0YykKICAgICAgIHdpbi1pYTY0ICg2NGJpdCBXaW5kb3dzIG9uIEl0YW5pdW0pCiAgICAgICB3aW4zMiAoYWxsIG90aGVycyAtIHNwZWNpZmljYWxseSwgc3lzLnBsYXRmb3JtIGlzIHJldHVybmVkKQoKICAgIEZvciBvdGhlciBub24tUE9TSVggcGxhdGZvcm1zLCBjdXJyZW50bHkganVzdCByZXR1cm5zICdzeXMucGxhdGZvcm0nLgogICAgIiIiCiAgICBpZiBvcy5uYW1lID09ICdudCc6CiAgICAgICAgIyBzbmlmZiBzeXMudmVyc2lvbiBmb3IgYXJjaGl0ZWN0dXJlLgogICAgICAgIHByZWZpeCA9ICIgYml0ICgiCiAgICAgICAgaSA9IHN5cy52ZXJzaW9uLmZpbmQocHJlZml4KQogICAgICAgIGlmIGkgPT0gLTE6CiAgICAgICAgICAgIHJldHVybiBzeXMucGxhdGZvcm0KICAgICAgICBqID0gc3lzLnZlcnNpb24uZmluZCgiKSIsIGkpCiAgICAgICAgbG9vayA9IHN5cy52ZXJzaW9uW2krbGVuKHByZWZpeCk6al0ubG93ZXIoKQogICAgICAgIGlmIGxvb2sgPT0gJ2FtZDY0JzoKICAgICAgICAgICAgcmV0dXJuICd3aW4tYW1kNjQnCiAgICAgICAgaWYgbG9vayA9PSAnaXRhbml1bSc6CiAgICAgICAgICAgIHJldHVybiAnd2luLWlhNjQnCiAgICAgICAgcmV0dXJuIHN5cy5wbGF0Zm9ybQoKICAgIGlmIG9zLm5hbWUgIT0gInBvc2l4IiBvciBub3QgaGFzYXR0cihvcywgJ3VuYW1lJyk6CiAgICAgICAgIyBYWFggd2hhdCBhYm91dCB0aGUgYXJjaGl0ZWN0dXJlPyBOVCBpcyBJbnRlbCBvciBBbHBoYSwKICAgICAgICAjIE1hYyBPUyBpcyBNNjhrIG9yIFBQQywgZXRjLgogICAgICAgIHJldHVybiBzeXMucGxhdGZvcm0KCiAgICAjIFRyeSB0byBkaXN0aW5ndWlzaCB2YXJpb3VzIGZsYXZvdXJzIG9mIFVuaXgKICAgIG9zbmFtZSwgaG9zdCwgcmVsZWFzZSwgdmVyc2lvbiwgbWFjaGluZSA9IG9zLnVuYW1lKCkKCiAgICAjIENvbnZlcnQgdGhlIE9TIG5hbWUgdG8gbG93ZXJjYXNlLCByZW1vdmUgJy8nIGNoYXJhY3RlcnMKICAgICMgKHRvIGFjY29tbW9kYXRlIEJTRC9PUyksIGFuZCB0cmFuc2xhdGUgc3BhY2VzIChmb3IgIlBvd2VyIE1hY2ludG9zaCIpCiAgICBvc25hbWUgPSBvc25hbWUubG93ZXIoKS5yZXBsYWNlKCcvJywgJycpCiAgICBtYWNoaW5lID0gbWFjaGluZS5yZXBsYWNlKCcgJywgJ18nKQogICAgbWFjaGluZSA9IG1hY2hpbmUucmVwbGFjZSgnLycsICctJykKCiAgICBpZiBvc25hbWVbOjVdID09ICJsaW51eCI6CiAgICAgICAgIyBBdCBsZWFzdCBvbiBMaW51eC9JbnRlbCwgJ21hY2hpbmUnIGlzIHRoZSBwcm9jZXNzb3IgLS0KICAgICAgICAjIGkzODYsIGV0Yy4KICAgICAgICAjIFhYWCB3aGF0IGFib3V0IEFscGhhLCBTUEFSQywgZXRjPwogICAgICAgIHJldHVybiAgIiVzLSVzIiAlIChvc25hbWUsIG1hY2hpbmUpCiAgICBlbGlmIG9zbmFtZVs6NV0gPT0gInN1bm9zIjoKICAgICAgICBpZiByZWxlYXNlWzBdID49ICI1IjogICAgICAgICAgICMgU3VuT1MgNSA9PSBTb2xhcmlzIDIKICAgICAgICAgICAgb3NuYW1lID0gInNvbGFyaXMiCiAgICAgICAgICAgIHJlbGVhc2UgPSAiJWQuJXMiICUgKGludChyZWxlYXNlWzBdKSAtIDMsIHJlbGVhc2VbMjpdKQogICAgICAgICMgZmFsbCB0aHJvdWdoIHRvIHN0YW5kYXJkIG9zbmFtZS1yZWxlYXNlLW1hY2hpbmUgcmVwcmVzZW50YXRpb24KICAgIGVsaWYgb3NuYW1lWzo0XSA9PSAiaXJpeCI6ICAgICAgICAgICAgICAjIGNvdWxkIGJlICJpcml4NjQiIQogICAgICAgIHJldHVybiAiJXMtJXMiICUgKG9zbmFtZSwgcmVsZWFzZSkKICAgIGVsaWYgb3NuYW1lWzozXSA9PSAiYWl4IjoKICAgICAgICByZXR1cm4gIiVzLSVzLiVzIiAlIChvc25hbWUsIHZlcnNpb24sIHJlbGVhc2UpCiAgICBlbGlmIG9zbmFtZVs6Nl0gPT0gImN5Z3dpbiI6CiAgICAgICAgb3NuYW1lID0gImN5Z3dpbiIKICAgICAgICByZWxfcmUgPSByZS5jb21waWxlKHInW1xkLl0rJykKICAgICAgICBtID0gcmVsX3JlLm1hdGNoKHJlbGVhc2UpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgcmVsZWFzZSA9IG0uZ3JvdXAoKQogICAgZWxpZiBvc25hbWVbOjZdID09ICJkYXJ3aW4iOgogICAgICAgICMKICAgICAgICAjIEZvciBvdXIgcHVycG9zZXMsIHdlJ2xsIGFzc3VtZSB0aGF0IHRoZSBzeXN0ZW0gdmVyc2lvbiBmcm9tCiAgICAgICAgIyBkaXN0dXRpbHMnIHBlcnNwZWN0aXZlIGlzIHdoYXQgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUIGlzIHNldAogICAgICAgICMgdG8uIFRoaXMgbWFrZXMgdGhlIGNvbXBhdGliaWxpdHkgc3RvcnkgYSBiaXQgbW9yZSBzYW5lIGJlY2F1c2UgdGhlCiAgICAgICAgIyBtYWNoaW5lIGlzIGdvaW5nIHRvIGNvbXBpbGUgYW5kIGxpbmsgYXMgaWYgaXQgd2VyZQogICAgICAgICMgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULgogICAgICAgIGNmZ3ZhcnMgPSBnZXRfY29uZmlnX3ZhcnMoKQogICAgICAgIG1hY3ZlciA9IGNmZ3ZhcnMuZ2V0KCdNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQnKQoKICAgICAgICBpZiBUcnVlOgogICAgICAgICAgICAjIEFsd2F5cyBjYWxjdWxhdGUgdGhlIHJlbGVhc2Ugb2YgdGhlIHJ1bm5pbmcgbWFjaGluZSwKICAgICAgICAgICAgIyBuZWVkZWQgdG8gZGV0ZXJtaW5lIGlmIHdlIGNhbiBidWlsZCBmYXQgYmluYXJpZXMgb3Igbm90LgoKICAgICAgICAgICAgbWFjcmVsZWFzZSA9IG1hY3ZlcgogICAgICAgICAgICAjIEdldCB0aGUgc3lzdGVtIHZlcnNpb24uIFJlYWRpbmcgdGhpcyBwbGlzdCBpcyBhIGRvY3VtZW50ZWQKICAgICAgICAgICAgIyB3YXkgdG8gZ2V0IHRoZSBzeXN0ZW0gdmVyc2lvbiAoc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvcgogICAgICAgICAgICAjIHRoZSBHZXN0YWx0IE1hbmFnZXIpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGYgPSBvcGVuKCcvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL1N5c3RlbVZlcnNpb24ucGxpc3QnKQogICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICAgICAgICAgICMgV2UncmUgb24gYSBwbGFpbiBkYXJ3aW4gYm94LCBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQKICAgICAgICAgICAgICAgICMgYmVoYXZpb3VyLgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIG0gPSByZS5zZWFyY2gocic8a2V5PlByb2R1Y3RVc2VyVmlzaWJsZVZlcnNpb248L2tleT5ccyonCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJzxzdHJpbmc+KC4qPyk8L3N0cmluZz4nLCBmLnJlYWQoKSkKICAgICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICAgICBpZiBtIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIG1hY3JlbGVhc2UgPSAnLicuam9pbihtLmdyb3VwKDEpLnNwbGl0KCcuJylbOjJdKQogICAgICAgICAgICAgICAgIyBlbHNlOiBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3VyCgogICAgICAgIGlmIG5vdCBtYWN2ZXI6CiAgICAgICAgICAgIG1hY3ZlciA9IG1hY3JlbGVhc2UKCiAgICAgICAgaWYgbWFjdmVyOgogICAgICAgICAgICByZWxlYXNlID0gbWFjdmVyCiAgICAgICAgICAgIG9zbmFtZSA9ICJtYWNvc3giCgogICAgICAgICAgICBpZiAoKG1hY3JlbGVhc2UgKyAnLicpID49ICcxMC40LicgYW5kCiAgICAgICAgICAgICAgICAnLWFyY2gnIGluIGdldF9jb25maWdfdmFycygpLmdldCgnQ0ZMQUdTJywgJycpLnN0cmlwKCkpOgogICAgICAgICAgICAgICAgIyBUaGUgdW5pdmVyc2FsIGJ1aWxkIHdpbGwgYnVpbGQgZmF0IGJpbmFyaWVzLCBidXQgbm90IG9uCiAgICAgICAgICAgICAgICAjIHN5c3RlbXMgYmVmb3JlIDEwLjQKICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICMgVHJ5IHRvIGRldGVjdCA0LXdheSB1bml2ZXJzYWwgYnVpbGRzLCB0aG9zZSBoYXZlIG1hY2hpbmUtdHlwZQogICAgICAgICAgICAgICAgIyAndW5pdmVyc2FsJyBpbnN0ZWFkIG9mICdmYXQnLgoKICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAnZmF0JwogICAgICAgICAgICAgICAgY2ZsYWdzID0gZ2V0X2NvbmZpZ192YXJzKCkuZ2V0KCdDRkxBR1MnKQoKICAgICAgICAgICAgICAgIGFyY2hzID0gcmUuZmluZGFsbCgnLWFyY2hccysoXFMrKScsIGNmbGFncykKICAgICAgICAgICAgICAgIGFyY2hzID0gdHVwbGUoc29ydGVkKHNldChhcmNocykpKQoKICAgICAgICAgICAgICAgIGlmIGxlbihhcmNocykgPT0gMToKICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gYXJjaHNbMF0KICAgICAgICAgICAgICAgIGVsaWYgYXJjaHMgPT0gKCdpMzg2JywgJ3BwYycpOgogICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAnZmF0JwogICAgICAgICAgICAgICAgZWxpZiBhcmNocyA9PSAoJ2kzODYnLCAneDg2XzY0Jyk6CiAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9ICdpbnRlbCcKICAgICAgICAgICAgICAgIGVsaWYgYXJjaHMgPT0gKCdpMzg2JywgJ3BwYycsICd4ODZfNjQnKToKICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ2ZhdDMnCiAgICAgICAgICAgICAgICBlbGlmIGFyY2hzID09ICgncHBjNjQnLCAneDg2XzY0Jyk6CiAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9ICdmYXQ2NCcKICAgICAgICAgICAgICAgIGVsaWYgYXJjaHMgPT0gKCdpMzg2JywgJ3BwYycsICdwcGM2NCcsICd4ODZfNjQnKToKICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ3VuaXZlcnNhbCcKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAiRG9uJ3Qga25vdyBtYWNoaW5lIHZhbHVlIGZvciBhcmNocz0lciIgJSAoYXJjaHMsKSkKCiAgICAgICAgICAgIGVsaWYgbWFjaGluZSA9PSAnaTM4Nic6CiAgICAgICAgICAgICAgICAjIE9uIE9TWCB0aGUgbWFjaGluZSB0eXBlIHJldHVybmVkIGJ5IHVuYW1lIGlzIGFsd2F5cyB0aGUKICAgICAgICAgICAgICAgICMgMzItYml0IHZhcmlhbnQsIGV2ZW4gaWYgdGhlIGV4ZWN1dGFibGUgYXJjaGl0ZWN0dXJlIGlzCiAgICAgICAgICAgICAgICAjIHRoZSA2NC1iaXQgdmFyaWFudAogICAgICAgICAgICAgICAgaWYgc3lzLm1heHNpemUgPj0gMioqMzI6CiAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9ICd4ODZfNjQnCgogICAgICAgICAgICBlbGlmIG1hY2hpbmUgaW4gKCdQb3dlclBDJywgJ1Bvd2VyX01hY2ludG9zaCcpOgogICAgICAgICAgICAgICAgIyBQaWNrIGEgc2FuZSBuYW1lIGZvciB0aGUgUFBDIGFyY2hpdGVjdHVyZS4KICAgICAgICAgICAgICAgICMgU2VlICdpMzg2JyBjYXNlCiAgICAgICAgICAgICAgICBpZiBzeXMubWF4c2l6ZSA+PSAyKiozMjoKICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ3BwYzY0JwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ3BwYycKCiAgICByZXR1cm4gIiVzLSVzLSVzIiAlIChvc25hbWUsIHJlbGVhc2UsIG1hY2hpbmUpCgoKZGVmIGdldF9weXRob25fdmVyc2lvbigpOgogICAgcmV0dXJuIF9QWV9WRVJTSU9OX1NIT1JUCgoKZGVmIF9wcmludF9kaWN0KHRpdGxlLCBkYXRhKToKICAgIGZvciBpbmRleCwgKGtleSwgdmFsdWUpIGluIGVudW1lcmF0ZShzb3J0ZWQoZGF0YS5pdGVtcygpKSk6CiAgICAgICAgaWYgaW5kZXggPT0gMDoKICAgICAgICAgICAgcHJpbnQoJyVzOiAnICUgKHRpdGxlKSkKICAgICAgICBwcmludCgnXHQlcyA9ICIlcyInICUgKGtleSwgdmFsdWUpKQoKCmRlZiBfbWFpbigpOgogICAgIiIiRGlzcGxheSBhbGwgaW5mb3JtYXRpb24gc3lzY29uZmlnIGRldGFpbnMuIiIiCiAgICBwcmludCgnUGxhdGZvcm06ICIlcyInICUgZ2V0X3BsYXRmb3JtKCkpCiAgICBwcmludCgnUHl0aG9uIHZlcnNpb246ICIlcyInICUgZ2V0X3B5dGhvbl92ZXJzaW9uKCkpCiAgICBwcmludCgnQ3VycmVudCBpbnN0YWxsYXRpb24gc2NoZW1lOiAiJXMiJyAlIF9nZXRfZGVmYXVsdF9zY2hlbWUoKSkKICAgIHByaW50KCkKICAgIF9wcmludF9kaWN0KCdQYXRocycsIGdldF9wYXRocygpKQogICAgcHJpbnQoKQogICAgX3ByaW50X2RpY3QoJ1ZhcmlhYmxlcycsIGdldF9jb25maWdfdmFycygpKQoKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBfbWFpbigpClBLAwQUAAAAAAAAACEAREIfQ9RpAQDUaQEAOAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC90YXJmaWxlLnB5Iy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyB0YXJmaWxlLnB5CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ29weXJpZ2h0IChDKSAyMDAyIExhcnMgR3VzdGFlYmVsIDxsYXJzQGd1c3RhZWJlbC5kZT4KIyBBbGwgcmlnaHRzIHJlc2VydmVkLgojCiMgUGVybWlzc2lvbiAgaXMgIGhlcmVieSBncmFudGVkLCAgZnJlZSAgb2YgY2hhcmdlLCAgdG8gIGFueSBwZXJzb24KIyBvYnRhaW5pbmcgYSAgY29weSBvZiAgdGhpcyBzb2Z0d2FyZSAgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgojIGZpbGVzICAodGhlICAiU29mdHdhcmUiKSwgIHRvICAgZGVhbCAgaW4gIHRoZSAgU29mdHdhcmUgICB3aXRob3V0CiMgcmVzdHJpY3Rpb24sICBpbmNsdWRpbmcgIHdpdGhvdXQgbGltaXRhdGlvbiAgdGhlICByaWdodHMgdG8gIHVzZSwKIyBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAojIGNvcGllcyAgb2YgIHRoZSAgU29mdHdhcmUsICBhbmQgdG8gIHBlcm1pdCAgcGVyc29ucyAgdG8gIHdob20gdGhlCiMgU29mdHdhcmUgIGlzICBmdXJuaXNoZWQgIHRvICBkbyAgc28sICBzdWJqZWN0ICB0byAgdGhlICBmb2xsb3dpbmcKIyBjb25kaXRpb25zOgojCiMgVGhlIGFib3ZlIGNvcHlyaWdodCAgbm90aWNlIGFuZCB0aGlzICBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCAgYmUKIyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KIwojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgIEtJTkQsCiMgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgIEJVVCBOT1QgTElNSVRFRCBUTyAgVEhFIFdBUlJBTlRJRVMKIyBPRiAgTUVSQ0hBTlRBQklMSVRZLCAgRklUTkVTUyAgIEZPUiAgQSAgUEFSVElDVUxBUiAgIFBVUlBPU0UgIEFORAojIE5PTklORlJJTkdFTUVOVC4gIElOICBOTyAgRVZFTlQgU0hBTEwgIFRIRSAgQVVUSE9SUyAgT1IgQ09QWVJJR0hUCiMgSE9MREVSUyAgQkUgTElBQkxFICBGT1IgQU5ZICBDTEFJTSwgREFNQUdFUyAgT1IgT1RIRVIgIExJQUJJTElUWSwKIyBXSEVUSEVSICBJTiBBTiAgQUNUSU9OIE9GICBDT05UUkFDVCwgVE9SVCAgT1IgT1RIRVJXSVNFLCAgQVJJU0lORwojIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKIyBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiMKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoKIiIiUmVhZCBmcm9tIGFuZCB3cml0ZSB0byB0YXIgZm9ybWF0IGFyY2hpdmVzLgoiIiIKCl9fdmVyc2lvbl9fID0gIiRSZXZpc2lvbiQiCgp2ZXJzaW9uICAgICA9ICIwLjkuMCIKX19hdXRob3JfXyAgPSAiTGFycyBHdXN0XHUwMGU0YmVsIChsYXJzQGd1c3RhZWJlbC5kZSkiCl9fZGF0ZV9fICAgID0gIiREYXRlOiAyMDExLTAyLTI1IDE3OjQyOjAxICswMjAwIChGcmksIDI1IEZlYiAyMDExKSAkIgpfX2N2c2lkX18gICA9ICIkSWQ6IHRhcmZpbGUucHkgODg1ODYgMjAxMS0wMi0yNSAxNTo0MjowMVogbWFyYy1hbmRyZS5sZW1idXJnICQiCl9fY3JlZGl0c19fID0gIkd1c3Rhdm8gTmllbWV5ZXIsIE5pZWxzIEd1c3RcdTAwZTRiZWwsIFJpY2hhcmQgVG93bnNlbmQuIgoKIy0tLS0tLS0tLQojIEltcG9ydHMKIy0tLS0tLS0tLQppbXBvcnQgc3lzCmltcG9ydCBvcwppbXBvcnQgc3RhdAppbXBvcnQgZXJybm8KaW1wb3J0IHRpbWUKaW1wb3J0IHN0cnVjdAppbXBvcnQgY29weQppbXBvcnQgcmUKCnRyeToKICAgIGltcG9ydCBncnAsIHB3ZApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBncnAgPSBwd2QgPSBOb25lCgojIG9zLnN5bWxpbmsgb24gV2luZG93cyBwcmlvciB0byA2LjAgcmFpc2VzIE5vdEltcGxlbWVudGVkRXJyb3IKc3ltbGlua19leGNlcHRpb24gPSAoQXR0cmlidXRlRXJyb3IsIE5vdEltcGxlbWVudGVkRXJyb3IpCnRyeToKICAgICMgV2luZG93c0Vycm9yICgxMzE0KSB3aWxsIGJlIHJhaXNlZCBpZiB0aGUgY2FsbGVyIGRvZXMgbm90IGhvbGQgdGhlCiAgICAjIFNlQ3JlYXRlU3ltYm9saWNMaW5rUHJpdmlsZWdlIHByaXZpbGVnZQogICAgc3ltbGlua19leGNlcHRpb24gKz0gKFdpbmRvd3NFcnJvciwpCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBwYXNzCgojIGZyb20gdGFyZmlsZSBpbXBvcnQgKgpfX2FsbF9fID0gWyJUYXJGaWxlIiwgIlRhckluZm8iLCAiaXNfdGFyZmlsZSIsICJUYXJFcnJvciJdCgppZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKICAgIGltcG9ydCBfX2J1aWx0aW5fXyBhcyBidWlsdGlucwplbHNlOgogICAgaW1wb3J0IGJ1aWx0aW5zCgpfb3BlbiA9IGJ1aWx0aW5zLm9wZW4gICAjIFNpbmNlICdvcGVuJyBpcyBUYXJGaWxlLm9wZW4KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyB0YXIgY29uc3RhbnRzCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KTlVMID0gYiJcMCIgICAgICAgICAgICAgICAgICAgICAjIHRoZSBudWxsIGNoYXJhY3RlcgpCTE9DS1NJWkUgPSA1MTIgICAgICAgICAgICAgICAgICMgbGVuZ3RoIG9mIHByb2Nlc3NpbmcgYmxvY2tzClJFQ09SRFNJWkUgPSBCTE9DS1NJWkUgKiAyMCAgICAgIyBsZW5ndGggb2YgcmVjb3JkcwpHTlVfTUFHSUMgPSBiInVzdGFyICBcMCIgICAgICAgICMgbWFnaWMgZ251IHRhciBzdHJpbmcKUE9TSVhfTUFHSUMgPSBiInVzdGFyXHgwMDAwIiAgICAjIG1hZ2ljIHBvc2l4IHRhciBzdHJpbmcKCkxFTkdUSF9OQU1FID0gMTAwICAgICAgICAgICAgICAgIyBtYXhpbXVtIGxlbmd0aCBvZiBhIGZpbGVuYW1lCkxFTkdUSF9MSU5LID0gMTAwICAgICAgICAgICAgICAgIyBtYXhpbXVtIGxlbmd0aCBvZiBhIGxpbmtuYW1lCkxFTkdUSF9QUkVGSVggPSAxNTUgICAgICAgICAgICAgIyBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgcHJlZml4IGZpZWxkCgpSRUdUWVBFID0gYiIwIiAgICAgICAgICAgICAgICAgICMgcmVndWxhciBmaWxlCkFSRUdUWVBFID0gYiJcMCIgICAgICAgICAgICAgICAgIyByZWd1bGFyIGZpbGUKTE5LVFlQRSA9IGIiMSIgICAgICAgICAgICAgICAgICAjIGxpbmsgKGluc2lkZSB0YXJmaWxlKQpTWU1UWVBFID0gYiIyIiAgICAgICAgICAgICAgICAgICMgc3ltYm9saWMgbGluawpDSFJUWVBFID0gYiIzIiAgICAgICAgICAgICAgICAgICMgY2hhcmFjdGVyIHNwZWNpYWwgZGV2aWNlCkJMS1RZUEUgPSBiIjQiICAgICAgICAgICAgICAgICAgIyBibG9jayBzcGVjaWFsIGRldmljZQpESVJUWVBFID0gYiI1IiAgICAgICAgICAgICAgICAgICMgZGlyZWN0b3J5CkZJRk9UWVBFID0gYiI2IiAgICAgICAgICAgICAgICAgIyBmaWZvIHNwZWNpYWwgZGV2aWNlCkNPTlRUWVBFID0gYiI3IiAgICAgICAgICAgICAgICAgIyBjb250aWd1b3VzIGZpbGUKCkdOVVRZUEVfTE9OR05BTUUgPSBiIkwiICAgICAgICAgIyBHTlUgdGFyIGxvbmduYW1lCkdOVVRZUEVfTE9OR0xJTksgPSBiIksiICAgICAgICAgIyBHTlUgdGFyIGxvbmdsaW5rCkdOVVRZUEVfU1BBUlNFID0gYiJTIiAgICAgICAgICAgIyBHTlUgdGFyIHNwYXJzZSBmaWxlCgpYSERUWVBFID0gYiJ4IiAgICAgICAgICAgICAgICAgICMgUE9TSVguMS0yMDAxIGV4dGVuZGVkIGhlYWRlcgpYR0xUWVBFID0gYiJnIiAgICAgICAgICAgICAgICAgICMgUE9TSVguMS0yMDAxIGdsb2JhbCBoZWFkZXIKU09MQVJJU19YSERUWVBFID0gYiJYIiAgICAgICAgICAjIFNvbGFyaXMgZXh0ZW5kZWQgaGVhZGVyCgpVU1RBUl9GT1JNQVQgPSAwICAgICAgICAgICAgICAgICMgUE9TSVguMS0xOTg4ICh1c3RhcikgZm9ybWF0CkdOVV9GT1JNQVQgPSAxICAgICAgICAgICAgICAgICAgIyBHTlUgdGFyIGZvcm1hdApQQVhfRk9STUFUID0gMiAgICAgICAgICAgICAgICAgICMgUE9TSVguMS0yMDAxIChwYXgpIGZvcm1hdApERUZBVUxUX0ZPUk1BVCA9IEdOVV9GT1JNQVQKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyB0YXJmaWxlIGNvbnN0YW50cwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRmlsZSB0eXBlcyB0aGF0IHRhcmZpbGUgc3VwcG9ydHM6ClNVUFBPUlRFRF9UWVBFUyA9IChSRUdUWVBFLCBBUkVHVFlQRSwgTE5LVFlQRSwKICAgICAgICAgICAgICAgICAgIFNZTVRZUEUsIERJUlRZUEUsIEZJRk9UWVBFLAogICAgICAgICAgICAgICAgICAgQ09OVFRZUEUsIENIUlRZUEUsIEJMS1RZUEUsCiAgICAgICAgICAgICAgICAgICBHTlVUWVBFX0xPTkdOQU1FLCBHTlVUWVBFX0xPTkdMSU5LLAogICAgICAgICAgICAgICAgICAgR05VVFlQRV9TUEFSU0UpCgojIEZpbGUgdHlwZXMgdGhhdCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSByZWd1bGFyIGZpbGUuClJFR1VMQVJfVFlQRVMgPSAoUkVHVFlQRSwgQVJFR1RZUEUsCiAgICAgICAgICAgICAgICAgQ09OVFRZUEUsIEdOVVRZUEVfU1BBUlNFKQoKIyBGaWxlIHR5cGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIEdOVSB0YXIgZm9ybWF0LgpHTlVfVFlQRVMgPSAoR05VVFlQRV9MT05HTkFNRSwgR05VVFlQRV9MT05HTElOSywKICAgICAgICAgICAgIEdOVVRZUEVfU1BBUlNFKQoKIyBGaWVsZHMgZnJvbSBhIHBheCBoZWFkZXIgdGhhdCBvdmVycmlkZSBhIFRhckluZm8gYXR0cmlidXRlLgpQQVhfRklFTERTID0gKCJwYXRoIiwgImxpbmtwYXRoIiwgInNpemUiLCAibXRpbWUiLAogICAgICAgICAgICAgICJ1aWQiLCAiZ2lkIiwgInVuYW1lIiwgImduYW1lIikKCiMgRmllbGRzIGZyb20gYSBwYXggaGVhZGVyIHRoYXQgYXJlIGFmZmVjdGVkIGJ5IGhkcmNoYXJzZXQuClBBWF9OQU1FX0ZJRUxEUyA9IHNldCgoInBhdGgiLCAibGlua3BhdGgiLCAidW5hbWUiLCAiZ25hbWUiKSkKCiMgRmllbGRzIGluIGEgcGF4IGhlYWRlciB0aGF0IGFyZSBudW1iZXJzLCBhbGwgb3RoZXIgZmllbGRzCiMgYXJlIHRyZWF0ZWQgYXMgc3RyaW5ncy4KUEFYX05VTUJFUl9GSUVMRFMgPSB7CiAgICAiYXRpbWUiOiBmbG9hdCwKICAgICJjdGltZSI6IGZsb2F0LAogICAgIm10aW1lIjogZmxvYXQsCiAgICAidWlkIjogaW50LAogICAgImdpZCI6IGludCwKICAgICJzaXplIjogaW50Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBCaXRzIHVzZWQgaW4gdGhlIG1vZGUgZmllbGQsIHZhbHVlcyBpbiBvY3RhbC4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpTX0lGTE5LID0gMG8xMjAwMDAgICAgICAgICMgc3ltYm9saWMgbGluawpTX0lGUkVHID0gMG8xMDAwMDAgICAgICAgICMgcmVndWxhciBmaWxlClNfSUZCTEsgPSAwbzA2MDAwMCAgICAgICAgIyBibG9jayBkZXZpY2UKU19JRkRJUiA9IDBvMDQwMDAwICAgICAgICAjIGRpcmVjdG9yeQpTX0lGQ0hSID0gMG8wMjAwMDAgICAgICAgICMgY2hhcmFjdGVyIGRldmljZQpTX0lGSUZPID0gMG8wMTAwMDAgICAgICAgICMgZmlmbwoKVFNVSUQgICA9IDBvNDAwMCAgICAgICAgICAjIHNldCBVSUQgb24gZXhlY3V0aW9uClRTR0lEICAgPSAwbzIwMDAgICAgICAgICAgIyBzZXQgR0lEIG9uIGV4ZWN1dGlvbgpUU1ZUWCAgID0gMG8xMDAwICAgICAgICAgICMgcmVzZXJ2ZWQKClRVUkVBRCAgPSAwbzQwMCAgICAgICAgICAgIyByZWFkIGJ5IG93bmVyClRVV1JJVEUgPSAwbzIwMCAgICAgICAgICAgIyB3cml0ZSBieSBvd25lcgpUVUVYRUMgID0gMG8xMDAgICAgICAgICAgICMgZXhlY3V0ZS9zZWFyY2ggYnkgb3duZXIKVEdSRUFEICA9IDBvMDQwICAgICAgICAgICAjIHJlYWQgYnkgZ3JvdXAKVEdXUklURSA9IDBvMDIwICAgICAgICAgICAjIHdyaXRlIGJ5IGdyb3VwClRHRVhFQyAgPSAwbzAxMCAgICAgICAgICAgIyBleGVjdXRlL3NlYXJjaCBieSBncm91cApUT1JFQUQgID0gMG8wMDQgICAgICAgICAgICMgcmVhZCBieSBvdGhlcgpUT1dSSVRFID0gMG8wMDIgICAgICAgICAgICMgd3JpdGUgYnkgb3RoZXIKVE9FWEVDICA9IDBvMDAxICAgICAgICAgICAjIGV4ZWN1dGUvc2VhcmNoIGJ5IG90aGVyCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgaW5pdGlhbGl6YXRpb24KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppZiBvcy5uYW1lIGluICgibnQiLCAiY2UiKToKICAgIEVOQ09ESU5HID0gInV0Zi04IgplbHNlOgogICAgRU5DT0RJTkcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBTb21lIHVzZWZ1bCBmdW5jdGlvbnMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZGVmIHN0bihzLCBsZW5ndGgsIGVuY29kaW5nLCBlcnJvcnMpOgogICAgIiIiQ29udmVydCBhIHN0cmluZyB0byBhIG51bGwtdGVybWluYXRlZCBieXRlcyBvYmplY3QuCiAgICAiIiIKICAgIHMgPSBzLmVuY29kZShlbmNvZGluZywgZXJyb3JzKQogICAgcmV0dXJuIHNbOmxlbmd0aF0gKyAobGVuZ3RoIC0gbGVuKHMpKSAqIE5VTAoKZGVmIG50cyhzLCBlbmNvZGluZywgZXJyb3JzKToKICAgICIiIkNvbnZlcnQgYSBudWxsLXRlcm1pbmF0ZWQgYnl0ZXMgb2JqZWN0IHRvIGEgc3RyaW5nLgogICAgIiIiCiAgICBwID0gcy5maW5kKGIiXDAiKQogICAgaWYgcCAhPSAtMToKICAgICAgICBzID0gc1s6cF0KICAgIHJldHVybiBzLmRlY29kZShlbmNvZGluZywgZXJyb3JzKQoKZGVmIG50aShzKToKICAgICIiIkNvbnZlcnQgYSBudW1iZXIgZmllbGQgdG8gYSBweXRob24gbnVtYmVyLgogICAgIiIiCiAgICAjIFRoZXJlIGFyZSB0d28gcG9zc2libGUgZW5jb2RpbmdzIGZvciBhIG51bWJlciBmaWVsZCwgc2VlCiAgICAjIGl0bigpIGJlbG93LgogICAgaWYgc1swXSAhPSBjaHIoMG8yMDApOgogICAgICAgIHRyeToKICAgICAgICAgICAgbiA9IGludChudHMocywgImFzY2lpIiwgInN0cmljdCIpIG9yICIwIiwgOCkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmFpc2UgSW52YWxpZEhlYWRlckVycm9yKCJpbnZhbGlkIGhlYWRlciIpCiAgICBlbHNlOgogICAgICAgIG4gPSAwCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHMpIC0gMSk6CiAgICAgICAgICAgIG4gPDw9IDgKICAgICAgICAgICAgbiArPSBvcmQoc1tpICsgMV0pCiAgICByZXR1cm4gbgoKZGVmIGl0bihuLCBkaWdpdHM9OCwgZm9ybWF0PURFRkFVTFRfRk9STUFUKToKICAgICIiIkNvbnZlcnQgYSBweXRob24gbnVtYmVyIHRvIGEgbnVtYmVyIGZpZWxkLgogICAgIiIiCiAgICAjIFBPU0lYIDEwMDMuMS0xOTg4IHJlcXVpcmVzIG51bWJlcnMgdG8gYmUgZW5jb2RlZCBhcyBhIHN0cmluZyBvZgogICAgIyBvY3RhbCBkaWdpdHMgZm9sbG93ZWQgYnkgYSBudWxsLWJ5dGUsIHRoaXMgYWxsb3dzIHZhbHVlcyB1cCB0bwogICAgIyAoOCoqKGRpZ2l0cy0xKSktMS4gR05VIHRhciBhbGxvd3Mgc3RvcmluZyBudW1iZXJzIGdyZWF0ZXIgdGhhbgogICAgIyB0aGF0IGlmIG5lY2Vzc2FyeS4gQSBsZWFkaW5nIDBvMjAwIGJ5dGUgaW5kaWNhdGVzIHRoaXMgcGFydGljdWxhcgogICAgIyBlbmNvZGluZywgdGhlIGZvbGxvd2luZyBkaWdpdHMtMSBieXRlcyBhcmUgYSBiaWctZW5kaWFuCiAgICAjIHJlcHJlc2VudGF0aW9uLiBUaGlzIGFsbG93cyB2YWx1ZXMgdXAgdG8gKDI1NioqKGRpZ2l0cy0xKSktMS4KICAgIGlmIDAgPD0gbiA8IDggKiogKGRpZ2l0cyAtIDEpOgogICAgICAgIHMgPSAoIiUwKm8iICUgKGRpZ2l0cyAtIDEsIG4pKS5lbmNvZGUoImFzY2lpIikgKyBOVUwKICAgIGVsc2U6CiAgICAgICAgaWYgZm9ybWF0ICE9IEdOVV9GT1JNQVQgb3IgbiA+PSAyNTYgKiogKGRpZ2l0cyAtIDEpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvdmVyZmxvdyBpbiBudW1iZXIgZmllbGQiKQoKICAgICAgICBpZiBuIDwgMDoKICAgICAgICAgICAgIyBYWFggV2UgbWltaWMgR05VIHRhcidzIGJlaGF2aW91ciB3aXRoIG5lZ2F0aXZlIG51bWJlcnMsCiAgICAgICAgICAgICMgdGhpcyBjb3VsZCByYWlzZSBPdmVyZmxvd0Vycm9yLgogICAgICAgICAgICBuID0gc3RydWN0LnVucGFjaygiTCIsIHN0cnVjdC5wYWNrKCJsIiwgbikpWzBdCgogICAgICAgIHMgPSBieXRlYXJyYXkoKQogICAgICAgIGZvciBpIGluIHJhbmdlKGRpZ2l0cyAtIDEpOgogICAgICAgICAgICBzLmluc2VydCgwLCBuICYgMG8zNzcpCiAgICAgICAgICAgIG4gPj49IDgKICAgICAgICBzLmluc2VydCgwLCAwbzIwMCkKICAgIHJldHVybiBzCgpkZWYgY2FsY19jaGtzdW1zKGJ1Zik6CiAgICAiIiJDYWxjdWxhdGUgdGhlIGNoZWNrc3VtIGZvciBhIG1lbWJlcidzIGhlYWRlciBieSBzdW1taW5nIHVwIGFsbAogICAgICAgY2hhcmFjdGVycyBleGNlcHQgZm9yIHRoZSBjaGtzdW0gZmllbGQgd2hpY2ggaXMgdHJlYXRlZCBhcyBpZgogICAgICAgaXQgd2FzIGZpbGxlZCB3aXRoIHNwYWNlcy4gQWNjb3JkaW5nIHRvIHRoZSBHTlUgdGFyIHNvdXJjZXMsCiAgICAgICBzb21lIHRhcnMgKFN1biBhbmQgTmVYVCkgY2FsY3VsYXRlIGNoa3N1bSB3aXRoIHNpZ25lZCBjaGFyLAogICAgICAgd2hpY2ggd2lsbCBiZSBkaWZmZXJlbnQgaWYgdGhlcmUgYXJlIGNoYXJzIGluIHRoZSBidWZmZXIgd2l0aAogICAgICAgdGhlIGhpZ2ggYml0IHNldC4gU28gd2UgY2FsY3VsYXRlIHR3byBjaGVja3N1bXMsIHVuc2lnbmVkIGFuZAogICAgICAgc2lnbmVkLgogICAgIiIiCiAgICB1bnNpZ25lZF9jaGtzdW0gPSAyNTYgKyBzdW0oc3RydWN0LnVucGFjaygiMTQ4QiIsIGJ1Zls6MTQ4XSkgKyBzdHJ1Y3QudW5wYWNrKCIzNTZCIiwgYnVmWzE1Njo1MTJdKSkKICAgIHNpZ25lZF9jaGtzdW0gPSAyNTYgKyBzdW0oc3RydWN0LnVucGFjaygiMTQ4YiIsIGJ1Zls6MTQ4XSkgKyBzdHJ1Y3QudW5wYWNrKCIzNTZiIiwgYnVmWzE1Njo1MTJdKSkKICAgIHJldHVybiB1bnNpZ25lZF9jaGtzdW0sIHNpZ25lZF9jaGtzdW0KCmRlZiBjb3B5ZmlsZW9iaihzcmMsIGRzdCwgbGVuZ3RoPU5vbmUpOgogICAgIiIiQ29weSBsZW5ndGggYnl0ZXMgZnJvbSBmaWxlb2JqIHNyYyB0byBmaWxlb2JqIGRzdC4KICAgICAgIElmIGxlbmd0aCBpcyBOb25lLCBjb3B5IHRoZSBlbnRpcmUgY29udGVudC4KICAgICIiIgogICAgaWYgbGVuZ3RoID09IDA6CiAgICAgICAgcmV0dXJuCiAgICBpZiBsZW5ndGggaXMgTm9uZToKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBidWYgPSBzcmMucmVhZCgxNioxMDI0KQogICAgICAgICAgICBpZiBub3QgYnVmOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZHN0LndyaXRlKGJ1ZikKICAgICAgICByZXR1cm4KCiAgICBCVUZTSVpFID0gMTYgKiAxMDI0CiAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChsZW5ndGgsIEJVRlNJWkUpCiAgICBmb3IgYiBpbiByYW5nZShibG9ja3MpOgogICAgICAgIGJ1ZiA9IHNyYy5yZWFkKEJVRlNJWkUpCiAgICAgICAgaWYgbGVuKGJ1ZikgPCBCVUZTSVpFOgogICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJlbmQgb2YgZmlsZSByZWFjaGVkIikKICAgICAgICBkc3Qud3JpdGUoYnVmKQoKICAgIGlmIHJlbWFpbmRlciAhPSAwOgogICAgICAgIGJ1ZiA9IHNyYy5yZWFkKHJlbWFpbmRlcikKICAgICAgICBpZiBsZW4oYnVmKSA8IHJlbWFpbmRlcjoKICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiZW5kIG9mIGZpbGUgcmVhY2hlZCIpCiAgICAgICAgZHN0LndyaXRlKGJ1ZikKICAgIHJldHVybgoKZmlsZW1vZGVfdGFibGUgPSAoCiAgICAoKFNfSUZMTkssICAgICAgImwiKSwKICAgICAoU19JRlJFRywgICAgICAiLSIpLAogICAgIChTX0lGQkxLLCAgICAgICJiIiksCiAgICAgKFNfSUZESVIsICAgICAgImQiKSwKICAgICAoU19JRkNIUiwgICAgICAiYyIpLAogICAgIChTX0lGSUZPLCAgICAgICJwIikpLAoKICAgICgoVFVSRUFELCAgICAgICAiciIpLCksCiAgICAoKFRVV1JJVEUsICAgICAgInciKSwpLAogICAgKChUVUVYRUN8VFNVSUQsICJzIiksCiAgICAgKFRTVUlELCAgICAgICAgIlMiKSwKICAgICAoVFVFWEVDLCAgICAgICAieCIpKSwKCiAgICAoKFRHUkVBRCwgICAgICAgInIiKSwpLAogICAgKChUR1dSSVRFLCAgICAgICJ3IiksKSwKICAgICgoVEdFWEVDfFRTR0lELCAicyIpLAogICAgIChUU0dJRCwgICAgICAgICJTIiksCiAgICAgKFRHRVhFQywgICAgICAgIngiKSksCgogICAgKChUT1JFQUQsICAgICAgICJyIiksKSwKICAgICgoVE9XUklURSwgICAgICAidyIpLCksCiAgICAoKFRPRVhFQ3xUU1ZUWCwgInQiKSwKICAgICAoVFNWVFgsICAgICAgICAiVCIpLAogICAgIChUT0VYRUMsICAgICAgICJ4IikpCikKCmRlZiBmaWxlbW9kZShtb2RlKToKICAgICIiIkNvbnZlcnQgYSBmaWxlJ3MgbW9kZSB0byBhIHN0cmluZyBvZiB0aGUgZm9ybQogICAgICAgLXJ3eHJ3eHJ3eC4KICAgICAgIFVzZWQgYnkgVGFyRmlsZS5saXN0KCkKICAgICIiIgogICAgcGVybSA9IFtdCiAgICBmb3IgdGFibGUgaW4gZmlsZW1vZGVfdGFibGU6CiAgICAgICAgZm9yIGJpdCwgY2hhciBpbiB0YWJsZToKICAgICAgICAgICAgaWYgbW9kZSAmIGJpdCA9PSBiaXQ6CiAgICAgICAgICAgICAgICBwZXJtLmFwcGVuZChjaGFyKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICBwZXJtLmFwcGVuZCgiLSIpCiAgICByZXR1cm4gIiIuam9pbihwZXJtKQoKY2xhc3MgVGFyRXJyb3IoRXhjZXB0aW9uKToKICAgICIiIkJhc2UgZXhjZXB0aW9uLiIiIgogICAgcGFzcwpjbGFzcyBFeHRyYWN0RXJyb3IoVGFyRXJyb3IpOgogICAgIiIiR2VuZXJhbCBleGNlcHRpb24gZm9yIGV4dHJhY3QgZXJyb3JzLiIiIgogICAgcGFzcwpjbGFzcyBSZWFkRXJyb3IoVGFyRXJyb3IpOgogICAgIiIiRXhjZXB0aW9uIGZvciB1bnJlYWRhYmxlIHRhciBhcmNoaXZlcy4iIiIKICAgIHBhc3MKY2xhc3MgQ29tcHJlc3Npb25FcnJvcihUYXJFcnJvcik6CiAgICAiIiJFeGNlcHRpb24gZm9yIHVuYXZhaWxhYmxlIGNvbXByZXNzaW9uIG1ldGhvZHMuIiIiCiAgICBwYXNzCmNsYXNzIFN0cmVhbUVycm9yKFRhckVycm9yKToKICAgICIiIkV4Y2VwdGlvbiBmb3IgdW5zdXBwb3J0ZWQgb3BlcmF0aW9ucyBvbiBzdHJlYW0tbGlrZSBUYXJGaWxlcy4iIiIKICAgIHBhc3MKY2xhc3MgSGVhZGVyRXJyb3IoVGFyRXJyb3IpOgogICAgIiIiQmFzZSBleGNlcHRpb24gZm9yIGhlYWRlciBlcnJvcnMuIiIiCiAgICBwYXNzCmNsYXNzIEVtcHR5SGVhZGVyRXJyb3IoSGVhZGVyRXJyb3IpOgogICAgIiIiRXhjZXB0aW9uIGZvciBlbXB0eSBoZWFkZXJzLiIiIgogICAgcGFzcwpjbGFzcyBUcnVuY2F0ZWRIZWFkZXJFcnJvcihIZWFkZXJFcnJvcik6CiAgICAiIiJFeGNlcHRpb24gZm9yIHRydW5jYXRlZCBoZWFkZXJzLiIiIgogICAgcGFzcwpjbGFzcyBFT0ZIZWFkZXJFcnJvcihIZWFkZXJFcnJvcik6CiAgICAiIiJFeGNlcHRpb24gZm9yIGVuZCBvZiBmaWxlIGhlYWRlcnMuIiIiCiAgICBwYXNzCmNsYXNzIEludmFsaWRIZWFkZXJFcnJvcihIZWFkZXJFcnJvcik6CiAgICAiIiJFeGNlcHRpb24gZm9yIGludmFsaWQgaGVhZGVycy4iIiIKICAgIHBhc3MKY2xhc3MgU3Vic2VxdWVudEhlYWRlckVycm9yKEhlYWRlckVycm9yKToKICAgICIiIkV4Y2VwdGlvbiBmb3IgbWlzc2luZyBhbmQgaW52YWxpZCBleHRlbmRlZCBoZWFkZXJzLiIiIgogICAgcGFzcwoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGludGVybmFsIHN0cmVhbSBpbnRlcmZhY2UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpjbGFzcyBfTG93TGV2ZWxGaWxlKG9iamVjdCk6CiAgICAiIiJMb3ctbGV2ZWwgZmlsZSBvYmplY3QuIFN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcuCiAgICAgICBJdCBpcyB1c2VkIGluc3RlYWQgb2YgYSByZWd1bGFyIGZpbGUgb2JqZWN0IGZvciBzdHJlYW1pbmcKICAgICAgIGFjY2Vzcy4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2RlKToKICAgICAgICBtb2RlID0gewogICAgICAgICAgICAiciI6IG9zLk9fUkRPTkxZLAogICAgICAgICAgICAidyI6IG9zLk9fV1JPTkxZIHwgb3MuT19DUkVBVCB8IG9zLk9fVFJVTkMsCiAgICAgICAgfVttb2RlXQogICAgICAgIGlmIGhhc2F0dHIob3MsICJPX0JJTkFSWSIpOgogICAgICAgICAgICBtb2RlIHw9IG9zLk9fQklOQVJZCiAgICAgICAgc2VsZi5mZCA9IG9zLm9wZW4obmFtZSwgbW9kZSwgMG82NjYpCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgIG9zLmNsb3NlKHNlbGYuZmQpCgogICAgZGVmIHJlYWQoc2VsZiwgc2l6ZSk6CiAgICAgICAgcmV0dXJuIG9zLnJlYWQoc2VsZi5mZCwgc2l6ZSkKCiAgICBkZWYgd3JpdGUoc2VsZiwgcyk6CiAgICAgICAgb3Mud3JpdGUoc2VsZi5mZCwgcykKCmNsYXNzIF9TdHJlYW0ob2JqZWN0KToKICAgICIiIkNsYXNzIHRoYXQgc2VydmVzIGFzIGFuIGFkYXB0ZXIgYmV0d2VlbiBUYXJGaWxlIGFuZAogICAgICAgYSBzdHJlYW0tbGlrZSBvYmplY3QuICBUaGUgc3RyZWFtLWxpa2Ugb2JqZWN0IG9ubHkKICAgICAgIG5lZWRzIHRvIGhhdmUgYSByZWFkKCkgb3Igd3JpdGUoKSBtZXRob2QgYW5kIGlzIGFjY2Vzc2VkCiAgICAgICBibG9ja3dpc2UuICBVc2Ugb2YgZ3ppcCBvciBiemlwMiBjb21wcmVzc2lvbiBpcyBwb3NzaWJsZS4KICAgICAgIEEgc3RyZWFtLWxpa2Ugb2JqZWN0IGNvdWxkIGJlIGZvciBleGFtcGxlOiBzeXMuc3RkaW4sCiAgICAgICBzeXMuc3Rkb3V0LCBhIHNvY2tldCwgYSB0YXBlIGRldmljZSBldGMuCgogICAgICAgX1N0cmVhbSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgaW50ZXJuYWxseS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2RlLCBjb21wdHlwZSwgZmlsZW9iaiwgYnVmc2l6ZSk6CiAgICAgICAgIiIiQ29uc3RydWN0IGEgX1N0cmVhbSBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fZXh0ZmlsZW9iaiA9IFRydWUKICAgICAgICBpZiBmaWxlb2JqIGlzIE5vbmU6CiAgICAgICAgICAgIGZpbGVvYmogPSBfTG93TGV2ZWxGaWxlKG5hbWUsIG1vZGUpCiAgICAgICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBGYWxzZQoKICAgICAgICBpZiBjb21wdHlwZSA9PSAnKic6CiAgICAgICAgICAgICMgRW5hYmxlIHRyYW5zcGFyZW50IGNvbXByZXNzaW9uIGRldGVjdGlvbiBmb3IgdGhlCiAgICAgICAgICAgICMgc3RyZWFtIGludGVyZmFjZQogICAgICAgICAgICBmaWxlb2JqID0gX1N0cmVhbVByb3h5KGZpbGVvYmopCiAgICAgICAgICAgIGNvbXB0eXBlID0gZmlsZW9iai5nZXRjb21wdHlwZSgpCgogICAgICAgIHNlbGYubmFtZSAgICAgPSBuYW1lIG9yICIiCiAgICAgICAgc2VsZi5tb2RlICAgICA9IG1vZGUKICAgICAgICBzZWxmLmNvbXB0eXBlID0gY29tcHR5cGUKICAgICAgICBzZWxmLmZpbGVvYmogID0gZmlsZW9iagogICAgICAgIHNlbGYuYnVmc2l6ZSAgPSBidWZzaXplCiAgICAgICAgc2VsZi5idWYgICAgICA9IGIiIgogICAgICAgIHNlbGYucG9zICAgICAgPSAwCiAgICAgICAgc2VsZi5jbG9zZWQgICA9IEZhbHNlCgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgY29tcHR5cGUgPT0gImd6IjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBpbXBvcnQgemxpYgogICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IoInpsaWIgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUiKQogICAgICAgICAgICAgICAgc2VsZi56bGliID0gemxpYgogICAgICAgICAgICAgICAgc2VsZi5jcmMgPSB6bGliLmNyYzMyKGIiIikKICAgICAgICAgICAgICAgIGlmIG1vZGUgPT0gInIiOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2luaXRfcmVhZF9neigpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2luaXRfd3JpdGVfZ3ooKQoKICAgICAgICAgICAgaWYgY29tcHR5cGUgPT0gImJ6MiI6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGJ6MgogICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IoImJ6MiBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSIpCiAgICAgICAgICAgICAgICBpZiBtb2RlID09ICJyIjoKICAgICAgICAgICAgICAgICAgICBzZWxmLmRidWYgPSBiIiIKICAgICAgICAgICAgICAgICAgICBzZWxmLmNtcCA9IGJ6Mi5CWjJEZWNvbXByZXNzb3IoKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNtcCA9IGJ6Mi5CWjJDb21wcmVzc29yKCkKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9leHRmaWxlb2JqOgogICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCiAgICAgICAgICAgIHJhaXNlCgogICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAiY2xvc2VkIikgYW5kIG5vdCBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgc2VsZi5jbG9zZSgpCgogICAgZGVmIF9pbml0X3dyaXRlX2d6KHNlbGYpOgogICAgICAgICIiIkluaXRpYWxpemUgZm9yIHdyaXRpbmcgd2l0aCBnemlwIGNvbXByZXNzaW9uLgogICAgICAgICIiIgogICAgICAgIHNlbGYuY21wID0gc2VsZi56bGliLmNvbXByZXNzb2JqKDksIHNlbGYuemxpYi5ERUZMQVRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc2VsZi56bGliLk1BWF9XQklUUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnpsaWIuREVGX01FTV9MRVZFTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKQogICAgICAgIHRpbWVzdGFtcCA9IHN0cnVjdC5wYWNrKCI8TCIsIGludCh0aW1lLnRpbWUoKSkpCiAgICAgICAgc2VsZi5fX3dyaXRlKGIiXDAzN1wyMTNcMDEwXDAxMCIgKyB0aW1lc3RhbXAgKyBiIlwwMDJcMzc3IikKICAgICAgICBpZiBzZWxmLm5hbWUuZW5kc3dpdGgoIi5neiIpOgogICAgICAgICAgICBzZWxmLm5hbWUgPSBzZWxmLm5hbWVbOi0zXQogICAgICAgICMgUkZDMTk1MiBzYXlzIHdlIG11c3QgdXNlIElTTy04ODU5LTEgZm9yIHRoZSBGTkFNRSBmaWVsZC4KICAgICAgICBzZWxmLl9fd3JpdGUoc2VsZi5uYW1lLmVuY29kZSgiaXNvLTg4NTktMSIsICJyZXBsYWNlIikgKyBOVUwpCgogICAgZGVmIHdyaXRlKHNlbGYsIHMpOgogICAgICAgICIiIldyaXRlIHN0cmluZyBzIHRvIHRoZSBzdHJlYW0uCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jb21wdHlwZSA9PSAiZ3oiOgogICAgICAgICAgICBzZWxmLmNyYyA9IHNlbGYuemxpYi5jcmMzMihzLCBzZWxmLmNyYykKICAgICAgICBzZWxmLnBvcyArPSBsZW4ocykKICAgICAgICBpZiBzZWxmLmNvbXB0eXBlICE9ICJ0YXIiOgogICAgICAgICAgICBzID0gc2VsZi5jbXAuY29tcHJlc3MocykKICAgICAgICBzZWxmLl9fd3JpdGUocykKCiAgICBkZWYgX193cml0ZShzZWxmLCBzKToKICAgICAgICAiIiJXcml0ZSBzdHJpbmcgcyB0byB0aGUgc3RyZWFtIGlmIGEgd2hvbGUgbmV3IGJsb2NrCiAgICAgICAgICAgaXMgcmVhZHkgdG8gYmUgd3JpdHRlbi4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmJ1ZiArPSBzCiAgICAgICAgd2hpbGUgbGVuKHNlbGYuYnVmKSA+IHNlbGYuYnVmc2l6ZToKICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHNlbGYuYnVmWzpzZWxmLmJ1ZnNpemVdKQogICAgICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuYnVmW3NlbGYuYnVmc2l6ZTpdCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIkNsb3NlIHRoZSBfU3RyZWFtIG9iamVjdC4gTm8gb3BlcmF0aW9uIHNob3VsZCBiZQogICAgICAgICAgIGRvbmUgb24gaXQgYWZ0ZXJ3YXJkcy4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIHNlbGYubW9kZSA9PSAidyIgYW5kIHNlbGYuY29tcHR5cGUgIT0gInRhciI6CiAgICAgICAgICAgIHNlbGYuYnVmICs9IHNlbGYuY21wLmZsdXNoKCkKCiAgICAgICAgaWYgc2VsZi5tb2RlID09ICJ3IiBhbmQgc2VsZi5idWY6CiAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzZWxmLmJ1ZikKICAgICAgICAgICAgc2VsZi5idWYgPSBiIiIKICAgICAgICAgICAgaWYgc2VsZi5jb21wdHlwZSA9PSAiZ3oiOgogICAgICAgICAgICAgICAgIyBUaGUgbmF0aXZlIHpsaWIgY3JjIGlzIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLCBidXQKICAgICAgICAgICAgICAgICMgdGhlIFB5dGhvbiB3cmFwcGVyIGltcGxpY2l0bHkgY2FzdHMgdGhhdCB0byBhIHNpZ25lZCBDCiAgICAgICAgICAgICAgICAjIGxvbmcuICBTbywgb24gYSAzMi1iaXQgYm94IHNlbGYuY3JjIG1heSAibG9vayBuZWdhdGl2ZSIsCiAgICAgICAgICAgICAgICAjIHdoaWxlIHRoZSBzYW1lIGNyYyBvbiBhIDY0LWJpdCBib3ggbWF5ICJsb29rIHBvc2l0aXZlIi4KICAgICAgICAgICAgICAgICMgVG8gYXZvaWQgaXJrc29tZSB3YXJuaW5ncyBmcm9tIHRoZSBgc3RydWN0YCBtb2R1bGUsIGZvcmNlCiAgICAgICAgICAgICAgICAjIGl0IHRvIGxvb2sgcG9zaXRpdmUgb24gYWxsIGJveGVzLgogICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHN0cnVjdC5wYWNrKCI8TCIsIHNlbGYuY3JjICYgMHhmZmZmZmZmZikpCiAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoc3RydWN0LnBhY2soIjxMIiwgc2VsZi5wb3MgJiAweGZmZmZGRkZGKSkKCiAgICAgICAgaWYgbm90IHNlbGYuX2V4dGZpbGVvYmo6CiAgICAgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCgogICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQoKICAgIGRlZiBfaW5pdF9yZWFkX2d6KHNlbGYpOgogICAgICAgICIiIkluaXRpYWxpemUgZm9yIHJlYWRpbmcgYSBnemlwIGNvbXByZXNzZWQgZmlsZW9iai4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmNtcCA9IHNlbGYuemxpYi5kZWNvbXByZXNzb2JqKC1zZWxmLnpsaWIuTUFYX1dCSVRTKQogICAgICAgIHNlbGYuZGJ1ZiA9IGIiIgoKICAgICAgICAjIHRha2VuIGZyb20gZ3ppcC5HemlwRmlsZSB3aXRoIHNvbWUgYWx0ZXJhdGlvbnMKICAgICAgICBpZiBzZWxmLl9fcmVhZCgyKSAhPSBiIlwwMzdcMjEzIjoKICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJub3QgYSBnemlwIGZpbGUiKQogICAgICAgIGlmIHNlbGYuX19yZWFkKDEpICE9IGIiXDAxMCI6CiAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IoInVuc3VwcG9ydGVkIGNvbXByZXNzaW9uIG1ldGhvZCIpCgogICAgICAgIGZsYWcgPSBvcmQoc2VsZi5fX3JlYWQoMSkpCiAgICAgICAgc2VsZi5fX3JlYWQoNikKCiAgICAgICAgaWYgZmxhZyAmIDQ6CiAgICAgICAgICAgIHhsZW4gPSBvcmQoc2VsZi5fX3JlYWQoMSkpICsgMjU2ICogb3JkKHNlbGYuX19yZWFkKDEpKQogICAgICAgICAgICBzZWxmLnJlYWQoeGxlbikKICAgICAgICBpZiBmbGFnICYgODoKICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIHMgPSBzZWxmLl9fcmVhZCgxKQogICAgICAgICAgICAgICAgaWYgbm90IHMgb3IgcyA9PSBOVUw6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBmbGFnICYgMTY6CiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBzID0gc2VsZi5fX3JlYWQoMSkKICAgICAgICAgICAgICAgIGlmIG5vdCBzIG9yIHMgPT0gTlVMOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgZmxhZyAmIDI6CiAgICAgICAgICAgIHNlbGYuX19yZWFkKDIpCgogICAgZGVmIHRlbGwoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBzdHJlYW0ncyBmaWxlIHBvaW50ZXIgcG9zaXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYucG9zCgogICAgZGVmIHNlZWsoc2VsZiwgcG9zPTApOgogICAgICAgICIiIlNldCB0aGUgc3RyZWFtJ3MgZmlsZSBwb2ludGVyIHRvIHBvcy4gTmVnYXRpdmUgc2Vla2luZwogICAgICAgICAgIGlzIGZvcmJpZGRlbi4KICAgICAgICAiIiIKICAgICAgICBpZiBwb3MgLSBzZWxmLnBvcyA+PSAwOgogICAgICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChwb3MgLSBzZWxmLnBvcywgc2VsZi5idWZzaXplKQogICAgICAgICAgICBmb3IgaSBpbiByYW5nZShibG9ja3MpOgogICAgICAgICAgICAgICAgc2VsZi5yZWFkKHNlbGYuYnVmc2l6ZSkKICAgICAgICAgICAgc2VsZi5yZWFkKHJlbWFpbmRlcikKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBTdHJlYW1FcnJvcigic2Vla2luZyBiYWNrd2FyZHMgaXMgbm90IGFsbG93ZWQiKQogICAgICAgIHJldHVybiBzZWxmLnBvcwoKICAgIGRlZiByZWFkKHNlbGYsIHNpemU9Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBuZXh0IHNpemUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS4KICAgICAgICAgICBJZiBzaXplIGlzIG5vdCBkZWZpbmVkLCByZXR1cm4gYWxsIGJ5dGVzIG9mIHRoZSBzdHJlYW0KICAgICAgICAgICB1cCB0byBFT0YuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgogICAgICAgICAgICB0ID0gW10KICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIGJ1ZiA9IHNlbGYuX3JlYWQoc2VsZi5idWZzaXplKQogICAgICAgICAgICAgICAgaWYgbm90IGJ1ZjoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgdC5hcHBlbmQoYnVmKQogICAgICAgICAgICBidWYgPSAiIi5qb2luKHQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYnVmID0gc2VsZi5fcmVhZChzaXplKQogICAgICAgIHNlbGYucG9zICs9IGxlbihidWYpCiAgICAgICAgcmV0dXJuIGJ1ZgoKICAgIGRlZiBfcmVhZChzZWxmLCBzaXplKToKICAgICAgICAiIiJSZXR1cm4gc2l6ZSBieXRlcyBmcm9tIHRoZSBzdHJlYW0uCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jb21wdHlwZSA9PSAidGFyIjoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19yZWFkKHNpemUpCgogICAgICAgIGMgPSBsZW4oc2VsZi5kYnVmKQogICAgICAgIHdoaWxlIGMgPCBzaXplOgogICAgICAgICAgICBidWYgPSBzZWxmLl9fcmVhZChzZWxmLmJ1ZnNpemUpCiAgICAgICAgICAgIGlmIG5vdCBidWY6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBidWYgPSBzZWxmLmNtcC5kZWNvbXByZXNzKGJ1ZikKICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoImludmFsaWQgY29tcHJlc3NlZCBkYXRhIikKICAgICAgICAgICAgc2VsZi5kYnVmICs9IGJ1ZgogICAgICAgICAgICBjICs9IGxlbihidWYpCiAgICAgICAgYnVmID0gc2VsZi5kYnVmWzpzaXplXQogICAgICAgIHNlbGYuZGJ1ZiA9IHNlbGYuZGJ1ZltzaXplOl0KICAgICAgICByZXR1cm4gYnVmCgogICAgZGVmIF9fcmVhZChzZWxmLCBzaXplKToKICAgICAgICAiIiJSZXR1cm4gc2l6ZSBieXRlcyBmcm9tIHN0cmVhbS4gSWYgaW50ZXJuYWwgYnVmZmVyIGlzIGVtcHR5LAogICAgICAgICAgIHJlYWQgYW5vdGhlciBibG9jayBmcm9tIHRoZSBzdHJlYW0uCiAgICAgICAgIiIiCiAgICAgICAgYyA9IGxlbihzZWxmLmJ1ZikKICAgICAgICB3aGlsZSBjIDwgc2l6ZToKICAgICAgICAgICAgYnVmID0gc2VsZi5maWxlb2JqLnJlYWQoc2VsZi5idWZzaXplKQogICAgICAgICAgICBpZiBub3QgYnVmOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgc2VsZi5idWYgKz0gYnVmCiAgICAgICAgICAgIGMgKz0gbGVuKGJ1ZikKICAgICAgICBidWYgPSBzZWxmLmJ1Zls6c2l6ZV0KICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuYnVmW3NpemU6XQogICAgICAgIHJldHVybiBidWYKIyBjbGFzcyBfU3RyZWFtCgpjbGFzcyBfU3RyZWFtUHJveHkob2JqZWN0KToKICAgICIiIlNtYWxsIHByb3h5IGNsYXNzIHRoYXQgZW5hYmxlcyB0cmFuc3BhcmVudCBjb21wcmVzc2lvbgogICAgICAgZGV0ZWN0aW9uIGZvciB0aGUgU3RyZWFtIGludGVyZmFjZSAobW9kZSAncnwqJykuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW9iaik6CiAgICAgICAgc2VsZi5maWxlb2JqID0gZmlsZW9iagogICAgICAgIHNlbGYuYnVmID0gc2VsZi5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQoKICAgIGRlZiByZWFkKHNlbGYsIHNpemUpOgogICAgICAgIHNlbGYucmVhZCA9IHNlbGYuZmlsZW9iai5yZWFkCiAgICAgICAgcmV0dXJuIHNlbGYuYnVmCgogICAgZGVmIGdldGNvbXB0eXBlKHNlbGYpOgogICAgICAgIGlmIHNlbGYuYnVmLnN0YXJ0c3dpdGgoYiJcMDM3XDIxM1wwMTAiKToKICAgICAgICAgICAgcmV0dXJuICJneiIKICAgICAgICBpZiBzZWxmLmJ1Zi5zdGFydHN3aXRoKGIiQlpoOTEiKToKICAgICAgICAgICAgcmV0dXJuICJiejIiCiAgICAgICAgcmV0dXJuICJ0YXIiCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCiMgY2xhc3MgU3RyZWFtUHJveHkKCmNsYXNzIF9CWjJQcm94eShvYmplY3QpOgogICAgIiIiU21hbGwgcHJveHkgY2xhc3MgdGhhdCBlbmFibGVzIGV4dGVybmFsIGZpbGUgb2JqZWN0CiAgICAgICBzdXBwb3J0IGZvciAicjpiejIiIGFuZCAidzpiejIiIG1vZGVzLiBUaGlzIGlzIGFjdHVhbGx5CiAgICAgICBhIHdvcmthcm91bmQgZm9yIGEgbGltaXRhdGlvbiBpbiBiejIgbW9kdWxlJ3MgQloyRmlsZQogICAgICAgY2xhc3Mgd2hpY2ggKHVubGlrZSBnemlwLkd6aXBGaWxlKSBoYXMgbm8gc3VwcG9ydCBmb3IKICAgICAgIGEgZmlsZSBvYmplY3QgYXJndW1lbnQuCiAgICAiIiIKCiAgICBibG9ja3NpemUgPSAxNiAqIDEwMjQKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW9iaiwgbW9kZSk6CiAgICAgICAgc2VsZi5maWxlb2JqID0gZmlsZW9iagogICAgICAgIHNlbGYubW9kZSA9IG1vZGUKICAgICAgICBzZWxmLm5hbWUgPSBnZXRhdHRyKHNlbGYuZmlsZW9iaiwgIm5hbWUiLCBOb25lKQogICAgICAgIHNlbGYuaW5pdCgpCgogICAgZGVmIGluaXQoc2VsZik6CiAgICAgICAgaW1wb3J0IGJ6MgogICAgICAgIHNlbGYucG9zID0gMAogICAgICAgIGlmIHNlbGYubW9kZSA9PSAiciI6CiAgICAgICAgICAgIHNlbGYuYnoyb2JqID0gYnoyLkJaMkRlY29tcHJlc3NvcigpCiAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKDApCiAgICAgICAgICAgIHNlbGYuYnVmID0gYiIiCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5iejJvYmogPSBiejIuQloyQ29tcHJlc3NvcigpCgogICAgZGVmIHJlYWQoc2VsZiwgc2l6ZSk6CiAgICAgICAgeCA9IGxlbihzZWxmLmJ1ZikKICAgICAgICB3aGlsZSB4IDwgc2l6ZToKICAgICAgICAgICAgcmF3ID0gc2VsZi5maWxlb2JqLnJlYWQoc2VsZi5ibG9ja3NpemUpCiAgICAgICAgICAgIGlmIG5vdCByYXc6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBkYXRhID0gc2VsZi5iejJvYmouZGVjb21wcmVzcyhyYXcpCiAgICAgICAgICAgIHNlbGYuYnVmICs9IGRhdGEKICAgICAgICAgICAgeCArPSBsZW4oZGF0YSkKCiAgICAgICAgYnVmID0gc2VsZi5idWZbOnNpemVdCiAgICAgICAgc2VsZi5idWYgPSBzZWxmLmJ1ZltzaXplOl0KICAgICAgICBzZWxmLnBvcyArPSBsZW4oYnVmKQogICAgICAgIHJldHVybiBidWYKCiAgICBkZWYgc2VlayhzZWxmLCBwb3MpOgogICAgICAgIGlmIHBvcyA8IHNlbGYucG9zOgogICAgICAgICAgICBzZWxmLmluaXQoKQogICAgICAgIHNlbGYucmVhZChwb3MgLSBzZWxmLnBvcykKCiAgICBkZWYgdGVsbChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5wb3MKCiAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CiAgICAgICAgc2VsZi5wb3MgKz0gbGVuKGRhdGEpCiAgICAgICAgcmF3ID0gc2VsZi5iejJvYmouY29tcHJlc3MoZGF0YSkKICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUocmF3KQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICBpZiBzZWxmLm1vZGUgPT0gInciOgogICAgICAgICAgICByYXcgPSBzZWxmLmJ6Mm9iai5mbHVzaCgpCiAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShyYXcpCiMgY2xhc3MgX0JaMlByb3h5CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRXh0cmFjdGlvbiBmaWxlIG9iamVjdAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmNsYXNzIF9GaWxlSW5GaWxlKG9iamVjdCk6CiAgICAiIiJBIHRoaW4gd3JhcHBlciBhcm91bmQgYW4gZXhpc3RpbmcgZmlsZSBvYmplY3QgdGhhdAogICAgICAgcHJvdmlkZXMgYSBwYXJ0IG9mIGl0cyBkYXRhIGFzIGFuIGluZGl2aWR1YWwgZmlsZQogICAgICAgb2JqZWN0LgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVvYmosIG9mZnNldCwgc2l6ZSwgYmxvY2tpbmZvPU5vbmUpOgogICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKICAgICAgICBzZWxmLm9mZnNldCA9IG9mZnNldAogICAgICAgIHNlbGYuc2l6ZSA9IHNpemUKICAgICAgICBzZWxmLnBvc2l0aW9uID0gMAoKICAgICAgICBpZiBibG9ja2luZm8gaXMgTm9uZToKICAgICAgICAgICAgYmxvY2tpbmZvID0gWygwLCBzaXplKV0KCiAgICAgICAgIyBDb25zdHJ1Y3QgYSBtYXAgd2l0aCBkYXRhIGFuZCB6ZXJvIGJsb2Nrcy4KICAgICAgICBzZWxmLm1hcF9pbmRleCA9IDAKICAgICAgICBzZWxmLm1hcCA9IFtdCiAgICAgICAgbGFzdHBvcyA9IDAKICAgICAgICByZWFscG9zID0gc2VsZi5vZmZzZXQKICAgICAgICBmb3Igb2Zmc2V0LCBzaXplIGluIGJsb2NraW5mbzoKICAgICAgICAgICAgaWYgb2Zmc2V0ID4gbGFzdHBvczoKICAgICAgICAgICAgICAgIHNlbGYubWFwLmFwcGVuZCgoRmFsc2UsIGxhc3Rwb3MsIG9mZnNldCwgTm9uZSkpCiAgICAgICAgICAgIHNlbGYubWFwLmFwcGVuZCgoVHJ1ZSwgb2Zmc2V0LCBvZmZzZXQgKyBzaXplLCByZWFscG9zKSkKICAgICAgICAgICAgcmVhbHBvcyArPSBzaXplCiAgICAgICAgICAgIGxhc3Rwb3MgPSBvZmZzZXQgKyBzaXplCiAgICAgICAgaWYgbGFzdHBvcyA8IHNlbGYuc2l6ZToKICAgICAgICAgICAgc2VsZi5tYXAuYXBwZW5kKChGYWxzZSwgbGFzdHBvcywgc2VsZi5zaXplLCBOb25lKSkKCiAgICBkZWYgc2Vla2FibGUoc2VsZik6CiAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZi5maWxlb2JqLCAic2Vla2FibGUiKToKICAgICAgICAgICAgIyBYWFggZ3ppcC5HemlwRmlsZSBhbmQgYnoyLkJaMkZpbGUKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gc2VsZi5maWxlb2JqLnNlZWthYmxlKCkKCiAgICBkZWYgdGVsbChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbi4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5wb3NpdGlvbgoKICAgIGRlZiBzZWVrKHNlbGYsIHBvc2l0aW9uKToKICAgICAgICAiIiJTZWVrIHRvIGEgcG9zaXRpb24gaW4gdGhlIGZpbGUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5wb3NpdGlvbiA9IHBvc2l0aW9uCgogICAgZGVmIHJlYWQoc2VsZiwgc2l6ZT1Ob25lKToKICAgICAgICAiIiJSZWFkIGRhdGEgZnJvbSB0aGUgZmlsZS4KICAgICAgICAiIiIKICAgICAgICBpZiBzaXplIGlzIE5vbmU6CiAgICAgICAgICAgIHNpemUgPSBzZWxmLnNpemUgLSBzZWxmLnBvc2l0aW9uCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2l6ZSA9IG1pbihzaXplLCBzZWxmLnNpemUgLSBzZWxmLnBvc2l0aW9uKQoKICAgICAgICBidWYgPSBiIiIKICAgICAgICB3aGlsZSBzaXplID4gMDoKICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIGRhdGEsIHN0YXJ0LCBzdG9wLCBvZmZzZXQgPSBzZWxmLm1hcFtzZWxmLm1hcF9pbmRleF0KICAgICAgICAgICAgICAgIGlmIHN0YXJ0IDw9IHNlbGYucG9zaXRpb24gPCBzdG9wOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYubWFwX2luZGV4ICs9IDEKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLm1hcF9pbmRleCA9PSBsZW4oc2VsZi5tYXApOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1hcF9pbmRleCA9IDAKICAgICAgICAgICAgbGVuZ3RoID0gbWluKHNpemUsIHN0b3AgLSBzZWxmLnBvc2l0aW9uKQogICAgICAgICAgICBpZiBkYXRhOgogICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsob2Zmc2V0ICsgKHNlbGYucG9zaXRpb24gLSBzdGFydCkpCiAgICAgICAgICAgICAgICBidWYgKz0gc2VsZi5maWxlb2JqLnJlYWQobGVuZ3RoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYnVmICs9IE5VTCAqIGxlbmd0aAogICAgICAgICAgICBzaXplIC09IGxlbmd0aAogICAgICAgICAgICBzZWxmLnBvc2l0aW9uICs9IGxlbmd0aAogICAgICAgIHJldHVybiBidWYKI2NsYXNzIF9GaWxlSW5GaWxlCgoKY2xhc3MgRXhGaWxlT2JqZWN0KG9iamVjdCk6CiAgICAiIiJGaWxlLWxpa2Ugb2JqZWN0IGZvciByZWFkaW5nIGFuIGFyY2hpdmUgbWVtYmVyLgogICAgICAgSXMgcmV0dXJuZWQgYnkgVGFyRmlsZS5leHRyYWN0ZmlsZSgpLgogICAgIiIiCiAgICBibG9ja3NpemUgPSAxMDI0CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhcmZpbGUsIHRhcmluZm8pOgogICAgICAgIHNlbGYuZmlsZW9iaiA9IF9GaWxlSW5GaWxlKHRhcmZpbGUuZmlsZW9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLm9mZnNldF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmluZm8uc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLnNwYXJzZSkKICAgICAgICBzZWxmLm5hbWUgPSB0YXJpbmZvLm5hbWUKICAgICAgICBzZWxmLm1vZGUgPSAiciIKICAgICAgICBzZWxmLmNsb3NlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5zaXplID0gdGFyaW5mby5zaXplCgogICAgICAgIHNlbGYucG9zaXRpb24gPSAwCiAgICAgICAgc2VsZi5idWZmZXIgPSBiIiIKCiAgICBkZWYgcmVhZGFibGUoc2VsZik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgd3JpdGFibGUoc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIHNlZWthYmxlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmZpbGVvYmouc2Vla2FibGUoKQoKICAgIGRlZiByZWFkKHNlbGYsIHNpemU9Tm9uZSk6CiAgICAgICAgIiIiUmVhZCBhdCBtb3N0IHNpemUgYnl0ZXMgZnJvbSB0aGUgZmlsZS4gSWYgc2l6ZSBpcyBub3QKICAgICAgICAgICBwcmVzZW50IG9yIE5vbmUsIHJlYWQgYWxsIGRhdGEgdW50aWwgRU9GIGlzIHJlYWNoZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKQoKICAgICAgICBidWYgPSBiIiIKICAgICAgICBpZiBzZWxmLmJ1ZmZlcjoKICAgICAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgogICAgICAgICAgICAgICAgYnVmID0gc2VsZi5idWZmZXIKICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gYiIiCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBidWYgPSBzZWxmLmJ1ZmZlcls6c2l6ZV0KICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gc2VsZi5idWZmZXJbc2l6ZTpdCgogICAgICAgIGlmIHNpemUgaXMgTm9uZToKICAgICAgICAgICAgYnVmICs9IHNlbGYuZmlsZW9iai5yZWFkKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBidWYgKz0gc2VsZi5maWxlb2JqLnJlYWQoc2l6ZSAtIGxlbihidWYpKQoKICAgICAgICBzZWxmLnBvc2l0aW9uICs9IGxlbihidWYpCiAgICAgICAgcmV0dXJuIGJ1ZgoKICAgICMgWFhYIFRleHRJT1dyYXBwZXIgdXNlcyB0aGUgcmVhZDEoKSBtZXRob2QuCiAgICByZWFkMSA9IHJlYWQKCiAgICBkZWYgcmVhZGxpbmUoc2VsZiwgc2l6ZT0tMSk6CiAgICAgICAgIiIiUmVhZCBvbmUgZW50aXJlIGxpbmUgZnJvbSB0aGUgZmlsZS4gSWYgc2l6ZSBpcyBwcmVzZW50CiAgICAgICAgICAgYW5kIG5vbi1uZWdhdGl2ZSwgcmV0dXJuIGEgc3RyaW5nIHdpdGggYXQgbW9zdCB0aGF0CiAgICAgICAgICAgc2l6ZSwgd2hpY2ggbWF5IGJlIGFuIGluY29tcGxldGUgbGluZS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpCgogICAgICAgIHBvcyA9IHNlbGYuYnVmZmVyLmZpbmQoYiJcbiIpICsgMQogICAgICAgIGlmIHBvcyA9PSAwOgogICAgICAgICAgICAjIG5vIG5ld2xpbmUgZm91bmQuCiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBidWYgPSBzZWxmLmZpbGVvYmoucmVhZChzZWxmLmJsb2Nrc2l6ZSkKICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyICs9IGJ1ZgogICAgICAgICAgICAgICAgaWYgbm90IGJ1ZiBvciBiIlxuIiBpbiBidWY6CiAgICAgICAgICAgICAgICAgICAgcG9zID0gc2VsZi5idWZmZXIuZmluZChiIlxuIikgKyAxCiAgICAgICAgICAgICAgICAgICAgaWYgcG9zID09IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gbmV3bGluZSBmb3VuZC4KICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gbGVuKHNlbGYuYnVmZmVyKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGlmIHNpemUgIT0gLTE6CiAgICAgICAgICAgIHBvcyA9IG1pbihzaXplLCBwb3MpCgogICAgICAgIGJ1ZiA9IHNlbGYuYnVmZmVyWzpwb3NdCiAgICAgICAgc2VsZi5idWZmZXIgPSBzZWxmLmJ1ZmZlcltwb3M6XQogICAgICAgIHNlbGYucG9zaXRpb24gKz0gbGVuKGJ1ZikKICAgICAgICByZXR1cm4gYnVmCgogICAgZGVmIHJlYWRsaW5lcyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IHdpdGggYWxsIHJlbWFpbmluZyBsaW5lcy4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKCkKICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGluZSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHRlbGwoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKQoKICAgICAgICByZXR1cm4gc2VsZi5wb3NpdGlvbgoKICAgIGRlZiBzZWVrKHNlbGYsIHBvcywgd2hlbmNlPW9zLlNFRUtfU0VUKToKICAgICAgICAiIiJTZWVrIHRvIGEgcG9zaXRpb24gaW4gdGhlIGZpbGUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKQoKICAgICAgICBpZiB3aGVuY2UgPT0gb3MuU0VFS19TRVQ6CiAgICAgICAgICAgIHNlbGYucG9zaXRpb24gPSBtaW4obWF4KHBvcywgMCksIHNlbGYuc2l6ZSkKICAgICAgICBlbGlmIHdoZW5jZSA9PSBvcy5TRUVLX0NVUjoKICAgICAgICAgICAgaWYgcG9zIDwgMDoKICAgICAgICAgICAgICAgIHNlbGYucG9zaXRpb24gPSBtYXgoc2VsZi5wb3NpdGlvbiArIHBvcywgMCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucG9zaXRpb24gPSBtaW4oc2VsZi5wb3NpdGlvbiArIHBvcywgc2VsZi5zaXplKQogICAgICAgIGVsaWYgd2hlbmNlID09IG9zLlNFRUtfRU5EOgogICAgICAgICAgICBzZWxmLnBvc2l0aW9uID0gbWF4KG1pbihzZWxmLnNpemUgKyBwb3MsIHNlbGYuc2l6ZSksIDApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBhcmd1bWVudCIpCgogICAgICAgIHNlbGYuYnVmZmVyID0gYiIiCiAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoc2VsZi5wb3NpdGlvbikKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIiIiQ2xvc2UgdGhlIGZpbGUgb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiJHZXQgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZmlsZSdzIGxpbmVzLgogICAgICAgICIiIgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKCkKICAgICAgICAgICAgaWYgbm90IGxpbmU6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICB5aWVsZCBsaW5lCiNjbGFzcyBFeEZpbGVPYmplY3QKCiMtLS0tLS0tLS0tLS0tLS0tLS0KIyBFeHBvcnRlZCBDbGFzc2VzCiMtLS0tLS0tLS0tLS0tLS0tLS0KY2xhc3MgVGFySW5mbyhvYmplY3QpOgogICAgIiIiSW5mb3JtYXRpb25hbCBjbGFzcyB3aGljaCBob2xkcyB0aGUgZGV0YWlscyBhYm91dCBhbgogICAgICAgYXJjaGl2ZSBtZW1iZXIgZ2l2ZW4gYnkgYSB0YXIgaGVhZGVyIGJsb2NrLgogICAgICAgVGFySW5mbyBvYmplY3RzIGFyZSByZXR1cm5lZCBieSBUYXJGaWxlLmdldG1lbWJlcigpLAogICAgICAgVGFyRmlsZS5nZXRtZW1iZXJzKCkgYW5kIFRhckZpbGUuZ2V0dGFyaW5mbygpIGFuZCBhcmUKICAgICAgIHVzdWFsbHkgY3JlYXRlZCBpbnRlcm5hbGx5LgogICAgIiIiCgogICAgX19zbG90c19fID0gKCJuYW1lIiwgIm1vZGUiLCAidWlkIiwgImdpZCIsICJzaXplIiwgIm10aW1lIiwKICAgICAgICAgICAgICAgICAiY2hrc3VtIiwgInR5cGUiLCAibGlua25hbWUiLCAidW5hbWUiLCAiZ25hbWUiLAogICAgICAgICAgICAgICAgICJkZXZtYWpvciIsICJkZXZtaW5vciIsCiAgICAgICAgICAgICAgICAgIm9mZnNldCIsICJvZmZzZXRfZGF0YSIsICJwYXhfaGVhZGVycyIsICJzcGFyc2UiLAogICAgICAgICAgICAgICAgICJ0YXJmaWxlIiwgIl9zcGFyc2Vfc3RydWN0cyIsICJfbGlua190YXJnZXQiKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPSIiKToKICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUYXJJbmZvIG9iamVjdC4gbmFtZSBpcyB0aGUgb3B0aW9uYWwgbmFtZQogICAgICAgICAgIG9mIHRoZSBtZW1iZXIuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5uYW1lID0gbmFtZSAgICAgICAgIyBtZW1iZXIgbmFtZQogICAgICAgIHNlbGYubW9kZSA9IDBvNjQ0ICAgICAgICMgZmlsZSBwZXJtaXNzaW9ucwogICAgICAgIHNlbGYudWlkID0gMCAgICAgICAgICAgICMgdXNlciBpZAogICAgICAgIHNlbGYuZ2lkID0gMCAgICAgICAgICAgICMgZ3JvdXAgaWQKICAgICAgICBzZWxmLnNpemUgPSAwICAgICAgICAgICAjIGZpbGUgc2l6ZQogICAgICAgIHNlbGYubXRpbWUgPSAwICAgICAgICAgICMgbW9kaWZpY2F0aW9uIHRpbWUKICAgICAgICBzZWxmLmNoa3N1bSA9IDAgICAgICAgICAjIGhlYWRlciBjaGVja3N1bQogICAgICAgIHNlbGYudHlwZSA9IFJFR1RZUEUgICAgICMgbWVtYmVyIHR5cGUKICAgICAgICBzZWxmLmxpbmtuYW1lID0gIiIgICAgICAjIGxpbmsgbmFtZQogICAgICAgIHNlbGYudW5hbWUgPSAiIiAgICAgICAgICMgdXNlciBuYW1lCiAgICAgICAgc2VsZi5nbmFtZSA9ICIiICAgICAgICAgIyBncm91cCBuYW1lCiAgICAgICAgc2VsZi5kZXZtYWpvciA9IDAgICAgICAgIyBkZXZpY2UgbWFqb3IgbnVtYmVyCiAgICAgICAgc2VsZi5kZXZtaW5vciA9IDAgICAgICAgIyBkZXZpY2UgbWlub3IgbnVtYmVyCgogICAgICAgIHNlbGYub2Zmc2V0ID0gMCAgICAgICAgICMgdGhlIHRhciBoZWFkZXIgc3RhcnRzIGhlcmUKICAgICAgICBzZWxmLm9mZnNldF9kYXRhID0gMCAgICAjIHRoZSBmaWxlJ3MgZGF0YSBzdGFydHMgaGVyZQoKICAgICAgICBzZWxmLnNwYXJzZSA9IE5vbmUgICAgICAjIHNwYXJzZSBtZW1iZXIgaW5mb3JtYXRpb24KICAgICAgICBzZWxmLnBheF9oZWFkZXJzID0ge30gICAjIHBheCBoZWFkZXIgaW5mb3JtYXRpb24KCiAgICAjIEluIHBheCBoZWFkZXJzIHRoZSAibmFtZSIgYW5kICJsaW5rbmFtZSIgZmllbGQgYXJlIGNhbGxlZAogICAgIyAicGF0aCIgYW5kICJsaW5rcGF0aCIuCiAgICBkZWYgX2dldHBhdGgoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYubmFtZQogICAgZGVmIF9zZXRwYXRoKHNlbGYsIG5hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgIHBhdGggPSBwcm9wZXJ0eShfZ2V0cGF0aCwgX3NldHBhdGgpCgogICAgZGVmIF9nZXRsaW5rcGF0aChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5saW5rbmFtZQogICAgZGVmIF9zZXRsaW5rcGF0aChzZWxmLCBsaW5rbmFtZSk6CiAgICAgICAgc2VsZi5saW5rbmFtZSA9IGxpbmtuYW1lCiAgICBsaW5rcGF0aCA9IHByb3BlcnR5KF9nZXRsaW5rcGF0aCwgX3NldGxpbmtwYXRoKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjwlcyAlciBhdCAlI3g+IiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyxzZWxmLm5hbWUsaWQoc2VsZikpCgogICAgZGVmIGdldF9pbmZvKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgVGFySW5mbydzIGF0dHJpYnV0ZXMgYXMgYSBkaWN0aW9uYXJ5LgogICAgICAgICIiIgogICAgICAgIGluZm8gPSB7CiAgICAgICAgICAgICJuYW1lIjogICAgIHNlbGYubmFtZSwKICAgICAgICAgICAgIm1vZGUiOiAgICAgc2VsZi5tb2RlICYgMG83Nzc3LAogICAgICAgICAgICAidWlkIjogICAgICBzZWxmLnVpZCwKICAgICAgICAgICAgImdpZCI6ICAgICAgc2VsZi5naWQsCiAgICAgICAgICAgICJzaXplIjogICAgIHNlbGYuc2l6ZSwKICAgICAgICAgICAgIm10aW1lIjogICAgc2VsZi5tdGltZSwKICAgICAgICAgICAgImNoa3N1bSI6ICAgc2VsZi5jaGtzdW0sCiAgICAgICAgICAgICJ0eXBlIjogICAgIHNlbGYudHlwZSwKICAgICAgICAgICAgImxpbmtuYW1lIjogc2VsZi5saW5rbmFtZSwKICAgICAgICAgICAgInVuYW1lIjogICAgc2VsZi51bmFtZSwKICAgICAgICAgICAgImduYW1lIjogICAgc2VsZi5nbmFtZSwKICAgICAgICAgICAgImRldm1ham9yIjogc2VsZi5kZXZtYWpvciwKICAgICAgICAgICAgImRldm1pbm9yIjogc2VsZi5kZXZtaW5vcgogICAgICAgIH0KCiAgICAgICAgaWYgaW5mb1sidHlwZSJdID09IERJUlRZUEUgYW5kIG5vdCBpbmZvWyJuYW1lIl0uZW5kc3dpdGgoIi8iKToKICAgICAgICAgICAgaW5mb1sibmFtZSJdICs9ICIvIgoKICAgICAgICByZXR1cm4gaW5mbwoKICAgIGRlZiB0b2J1ZihzZWxmLCBmb3JtYXQ9REVGQVVMVF9GT1JNQVQsIGVuY29kaW5nPUVOQ09ESU5HLCBlcnJvcnM9InN1cnJvZ2F0ZWVzY2FwZSIpOgogICAgICAgICIiIlJldHVybiBhIHRhciBoZWFkZXIgYXMgYSBzdHJpbmcgb2YgNTEyIGJ5dGUgYmxvY2tzLgogICAgICAgICIiIgogICAgICAgIGluZm8gPSBzZWxmLmdldF9pbmZvKCkKCiAgICAgICAgaWYgZm9ybWF0ID09IFVTVEFSX0ZPUk1BVDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlX3VzdGFyX2hlYWRlcihpbmZvLCBlbmNvZGluZywgZXJyb3JzKQogICAgICAgIGVsaWYgZm9ybWF0ID09IEdOVV9GT1JNQVQ6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZV9nbnVfaGVhZGVyKGluZm8sIGVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgZWxpZiBmb3JtYXQgPT0gUEFYX0ZPUk1BVDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlX3BheF9oZWFkZXIoaW5mbywgZW5jb2RpbmcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW52YWxpZCBmb3JtYXQiKQoKICAgIGRlZiBjcmVhdGVfdXN0YXJfaGVhZGVyKHNlbGYsIGluZm8sIGVuY29kaW5nLCBlcnJvcnMpOgogICAgICAgICIiIlJldHVybiB0aGUgb2JqZWN0IGFzIGEgdXN0YXIgaGVhZGVyIGJsb2NrLgogICAgICAgICIiIgogICAgICAgIGluZm9bIm1hZ2ljIl0gPSBQT1NJWF9NQUdJQwoKICAgICAgICBpZiBsZW4oaW5mb1sibGlua25hbWUiXSkgPiBMRU5HVEhfTElOSzoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibGlua25hbWUgaXMgdG9vIGxvbmciKQoKICAgICAgICBpZiBsZW4oaW5mb1sibmFtZSJdKSA+IExFTkdUSF9OQU1FOgogICAgICAgICAgICBpbmZvWyJwcmVmaXgiXSwgaW5mb1sibmFtZSJdID0gc2VsZi5fcG9zaXhfc3BsaXRfbmFtZShpbmZvWyJuYW1lIl0pCgogICAgICAgIHJldHVybiBzZWxmLl9jcmVhdGVfaGVhZGVyKGluZm8sIFVTVEFSX0ZPUk1BVCwgZW5jb2RpbmcsIGVycm9ycykKCiAgICBkZWYgY3JlYXRlX2dudV9oZWFkZXIoc2VsZiwgaW5mbywgZW5jb2RpbmcsIGVycm9ycyk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBvYmplY3QgYXMgYSBHTlUgaGVhZGVyIGJsb2NrIHNlcXVlbmNlLgogICAgICAgICIiIgogICAgICAgIGluZm9bIm1hZ2ljIl0gPSBHTlVfTUFHSUMKCiAgICAgICAgYnVmID0gYiIiCiAgICAgICAgaWYgbGVuKGluZm9bImxpbmtuYW1lIl0pID4gTEVOR1RIX0xJTks6CiAgICAgICAgICAgIGJ1ZiArPSBzZWxmLl9jcmVhdGVfZ251X2xvbmdfaGVhZGVyKGluZm9bImxpbmtuYW1lIl0sIEdOVVRZUEVfTE9OR0xJTkssIGVuY29kaW5nLCBlcnJvcnMpCgogICAgICAgIGlmIGxlbihpbmZvWyJuYW1lIl0pID4gTEVOR1RIX05BTUU6CiAgICAgICAgICAgIGJ1ZiArPSBzZWxmLl9jcmVhdGVfZ251X2xvbmdfaGVhZGVyKGluZm9bIm5hbWUiXSwgR05VVFlQRV9MT05HTkFNRSwgZW5jb2RpbmcsIGVycm9ycykKCiAgICAgICAgcmV0dXJuIGJ1ZiArIHNlbGYuX2NyZWF0ZV9oZWFkZXIoaW5mbywgR05VX0ZPUk1BVCwgZW5jb2RpbmcsIGVycm9ycykKCiAgICBkZWYgY3JlYXRlX3BheF9oZWFkZXIoc2VsZiwgaW5mbywgZW5jb2RpbmcpOgogICAgICAgICIiIlJldHVybiB0aGUgb2JqZWN0IGFzIGEgdXN0YXIgaGVhZGVyIGJsb2NrLiBJZiBpdCBjYW5ub3QgYmUKICAgICAgICAgICByZXByZXNlbnRlZCB0aGlzIHdheSwgcHJlcGVuZCBhIHBheCBleHRlbmRlZCBoZWFkZXIgc2VxdWVuY2UKICAgICAgICAgICB3aXRoIHN1cHBsZW1lbnQgaW5mb3JtYXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgaW5mb1sibWFnaWMiXSA9IFBPU0lYX01BR0lDCiAgICAgICAgcGF4X2hlYWRlcnMgPSBzZWxmLnBheF9oZWFkZXJzLmNvcHkoKQoKICAgICAgICAjIFRlc3Qgc3RyaW5nIGZpZWxkcyBmb3IgdmFsdWVzIHRoYXQgZXhjZWVkIHRoZSBmaWVsZCBsZW5ndGggb3IgY2Fubm90CiAgICAgICAgIyBiZSByZXByZXNlbnRlZCBpbiBBU0NJSSBlbmNvZGluZy4KICAgICAgICBmb3IgbmFtZSwgaG5hbWUsIGxlbmd0aCBpbiAoCiAgICAgICAgICAgICAgICAoIm5hbWUiLCAicGF0aCIsIExFTkdUSF9OQU1FKSwgKCJsaW5rbmFtZSIsICJsaW5rcGF0aCIsIExFTkdUSF9MSU5LKSwKICAgICAgICAgICAgICAgICgidW5hbWUiLCAidW5hbWUiLCAzMiksICgiZ25hbWUiLCAiZ25hbWUiLCAzMikpOgoKICAgICAgICAgICAgaWYgaG5hbWUgaW4gcGF4X2hlYWRlcnM6CiAgICAgICAgICAgICAgICAjIFRoZSBwYXggaGVhZGVyIGhhcyBwcmlvcml0eS4KICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIFRyeSB0byBlbmNvZGUgdGhlIHN0cmluZyBhcyBBU0NJSS4KICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaW5mb1tuYW1lXS5lbmNvZGUoImFzY2lpIiwgInN0cmljdCIpCiAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgICAgICAgICBwYXhfaGVhZGVyc1tobmFtZV0gPSBpbmZvW25hbWVdCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgaWYgbGVuKGluZm9bbmFtZV0pID4gbGVuZ3RoOgogICAgICAgICAgICAgICAgcGF4X2hlYWRlcnNbaG5hbWVdID0gaW5mb1tuYW1lXQoKICAgICAgICAjIFRlc3QgbnVtYmVyIGZpZWxkcyBmb3IgdmFsdWVzIHRoYXQgZXhjZWVkIHRoZSBmaWVsZCBsaW1pdCBvciB2YWx1ZXMKICAgICAgICAjIHRoYXQgbGlrZSB0byBiZSBzdG9yZWQgYXMgZmxvYXQuCiAgICAgICAgZm9yIG5hbWUsIGRpZ2l0cyBpbiAoKCJ1aWQiLCA4KSwgKCJnaWQiLCA4KSwgKCJzaXplIiwgMTIpLCAoIm10aW1lIiwgMTIpKToKICAgICAgICAgICAgaWYgbmFtZSBpbiBwYXhfaGVhZGVyczoKICAgICAgICAgICAgICAgICMgVGhlIHBheCBoZWFkZXIgaGFzIHByaW9yaXR5LiBBdm9pZCBvdmVyZmxvdy4KICAgICAgICAgICAgICAgIGluZm9bbmFtZV0gPSAwCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgdmFsID0gaW5mb1tuYW1lXQogICAgICAgICAgICBpZiBub3QgMCA8PSB2YWwgPCA4ICoqIChkaWdpdHMgLSAxKSBvciBpc2luc3RhbmNlKHZhbCwgZmxvYXQpOgogICAgICAgICAgICAgICAgcGF4X2hlYWRlcnNbbmFtZV0gPSBzdHIodmFsKQogICAgICAgICAgICAgICAgaW5mb1tuYW1lXSA9IDAKCiAgICAgICAgIyBDcmVhdGUgYSBwYXggZXh0ZW5kZWQgaGVhZGVyIGlmIG5lY2Vzc2FyeS4KICAgICAgICBpZiBwYXhfaGVhZGVyczoKICAgICAgICAgICAgYnVmID0gc2VsZi5fY3JlYXRlX3BheF9nZW5lcmljX2hlYWRlcihwYXhfaGVhZGVycywgWEhEVFlQRSwgZW5jb2RpbmcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYnVmID0gYiIiCgogICAgICAgIHJldHVybiBidWYgKyBzZWxmLl9jcmVhdGVfaGVhZGVyKGluZm8sIFVTVEFSX0ZPUk1BVCwgImFzY2lpIiwgInJlcGxhY2UiKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGNyZWF0ZV9wYXhfZ2xvYmFsX2hlYWRlcihjbHMsIHBheF9oZWFkZXJzKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG9iamVjdCBhcyBhIHBheCBnbG9iYWwgaGVhZGVyIGJsb2NrIHNlcXVlbmNlLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBjbHMuX2NyZWF0ZV9wYXhfZ2VuZXJpY19oZWFkZXIocGF4X2hlYWRlcnMsIFhHTFRZUEUsICJ1dGY4IikKCiAgICBkZWYgX3Bvc2l4X3NwbGl0X25hbWUoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiU3BsaXQgYSBuYW1lIGxvbmdlciB0aGFuIDEwMCBjaGFycyBpbnRvIGEgcHJlZml4CiAgICAgICAgICAgYW5kIGEgbmFtZSBwYXJ0LgogICAgICAgICIiIgogICAgICAgIHByZWZpeCA9IG5hbWVbOkxFTkdUSF9QUkVGSVggKyAxXQogICAgICAgIHdoaWxlIHByZWZpeCBhbmQgcHJlZml4Wy0xXSAhPSAiLyI6CiAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeFs6LTFdCgogICAgICAgIG5hbWUgPSBuYW1lW2xlbihwcmVmaXgpOl0KICAgICAgICBwcmVmaXggPSBwcmVmaXhbOi0xXQoKICAgICAgICBpZiBub3QgcHJlZml4IG9yIGxlbihuYW1lKSA+IExFTkdUSF9OQU1FOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJuYW1lIGlzIHRvbyBsb25nIikKICAgICAgICByZXR1cm4gcHJlZml4LCBuYW1lCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9jcmVhdGVfaGVhZGVyKGluZm8sIGZvcm1hdCwgZW5jb2RpbmcsIGVycm9ycyk6CiAgICAgICAgIiIiUmV0dXJuIGEgaGVhZGVyIGJsb2NrLiBpbmZvIGlzIGEgZGljdGlvbmFyeSB3aXRoIGZpbGUKICAgICAgICAgICBpbmZvcm1hdGlvbiwgZm9ybWF0IG11c3QgYmUgb25lIG9mIHRoZSAqX0ZPUk1BVCBjb25zdGFudHMuCiAgICAgICAgIiIiCiAgICAgICAgcGFydHMgPSBbCiAgICAgICAgICAgIHN0bihpbmZvLmdldCgibmFtZSIsICIiKSwgMTAwLCBlbmNvZGluZywgZXJyb3JzKSwKICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJtb2RlIiwgMCkgJiAwbzc3NzcsIDgsIGZvcm1hdCksCiAgICAgICAgICAgIGl0bihpbmZvLmdldCgidWlkIiwgMCksIDgsIGZvcm1hdCksCiAgICAgICAgICAgIGl0bihpbmZvLmdldCgiZ2lkIiwgMCksIDgsIGZvcm1hdCksCiAgICAgICAgICAgIGl0bihpbmZvLmdldCgic2l6ZSIsIDApLCAxMiwgZm9ybWF0KSwKICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJtdGltZSIsIDApLCAxMiwgZm9ybWF0KSwKICAgICAgICAgICAgYiIgICAgICAgICIsICMgY2hlY2tzdW0gZmllbGQKICAgICAgICAgICAgaW5mby5nZXQoInR5cGUiLCBSRUdUWVBFKSwKICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJsaW5rbmFtZSIsICIiKSwgMTAwLCBlbmNvZGluZywgZXJyb3JzKSwKICAgICAgICAgICAgaW5mby5nZXQoIm1hZ2ljIiwgUE9TSVhfTUFHSUMpLAogICAgICAgICAgICBzdG4oaW5mby5nZXQoInVuYW1lIiwgIiIpLCAzMiwgZW5jb2RpbmcsIGVycm9ycyksCiAgICAgICAgICAgIHN0bihpbmZvLmdldCgiZ25hbWUiLCAiIiksIDMyLCBlbmNvZGluZywgZXJyb3JzKSwKICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJkZXZtYWpvciIsIDApLCA4LCBmb3JtYXQpLAogICAgICAgICAgICBpdG4oaW5mby5nZXQoImRldm1pbm9yIiwgMCksIDgsIGZvcm1hdCksCiAgICAgICAgICAgIHN0bihpbmZvLmdldCgicHJlZml4IiwgIiIpLCAxNTUsIGVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgXQoKICAgICAgICBidWYgPSBzdHJ1Y3QucGFjaygiJWRzIiAlIEJMT0NLU0laRSwgYiIiLmpvaW4ocGFydHMpKQogICAgICAgIGNoa3N1bSA9IGNhbGNfY2hrc3VtcyhidWZbLUJMT0NLU0laRTpdKVswXQogICAgICAgIGJ1ZiA9IGJ1Zls6LTM2NF0gKyAoIiUwNm9cMCIgJSBjaGtzdW0pLmVuY29kZSgiYXNjaWkiKSArIGJ1ZlstMzU3Ol0KICAgICAgICByZXR1cm4gYnVmCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9jcmVhdGVfcGF5bG9hZChwYXlsb2FkKToKICAgICAgICAiIiJSZXR1cm4gdGhlIHN0cmluZyBwYXlsb2FkIGZpbGxlZCB3aXRoIHplcm8gYnl0ZXMKICAgICAgICAgICB1cCB0byB0aGUgbmV4dCA1MTIgYnl0ZSBib3JkZXIuCiAgICAgICAgIiIiCiAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2QobGVuKHBheWxvYWQpLCBCTE9DS1NJWkUpCiAgICAgICAgaWYgcmVtYWluZGVyID4gMDoKICAgICAgICAgICAgcGF5bG9hZCArPSAoQkxPQ0tTSVpFIC0gcmVtYWluZGVyKSAqIE5VTAogICAgICAgIHJldHVybiBwYXlsb2FkCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2NyZWF0ZV9nbnVfbG9uZ19oZWFkZXIoY2xzLCBuYW1lLCB0eXBlLCBlbmNvZGluZywgZXJyb3JzKToKICAgICAgICAiIiJSZXR1cm4gYSBHTlVUWVBFX0xPTkdOQU1FIG9yIEdOVVRZUEVfTE9OR0xJTksgc2VxdWVuY2UKICAgICAgICAgICBmb3IgbmFtZS4KICAgICAgICAiIiIKICAgICAgICBuYW1lID0gbmFtZS5lbmNvZGUoZW5jb2RpbmcsIGVycm9ycykgKyBOVUwKCiAgICAgICAgaW5mbyA9IHt9CiAgICAgICAgaW5mb1sibmFtZSJdID0gIi4vLi9ATG9uZ0xpbmsiCiAgICAgICAgaW5mb1sidHlwZSJdID0gdHlwZQogICAgICAgIGluZm9bInNpemUiXSA9IGxlbihuYW1lKQogICAgICAgIGluZm9bIm1hZ2ljIl0gPSBHTlVfTUFHSUMKCiAgICAgICAgIyBjcmVhdGUgZXh0ZW5kZWQgaGVhZGVyICsgbmFtZSBibG9ja3MuCiAgICAgICAgcmV0dXJuIGNscy5fY3JlYXRlX2hlYWRlcihpbmZvLCBVU1RBUl9GT1JNQVQsIGVuY29kaW5nLCBlcnJvcnMpICsgXAogICAgICAgICAgICAgICAgY2xzLl9jcmVhdGVfcGF5bG9hZChuYW1lKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9jcmVhdGVfcGF4X2dlbmVyaWNfaGVhZGVyKGNscywgcGF4X2hlYWRlcnMsIHR5cGUsIGVuY29kaW5nKToKICAgICAgICAiIiJSZXR1cm4gYSBQT1NJWC4xLTIwMDggZXh0ZW5kZWQgb3IgZ2xvYmFsIGhlYWRlciBzZXF1ZW5jZQogICAgICAgICAgIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIGtleXdvcmQsIHZhbHVlIHBhaXJzLiBUaGUgdmFsdWVzCiAgICAgICAgICAgbXVzdCBiZSBzdHJpbmdzLgogICAgICAgICIiIgogICAgICAgICMgQ2hlY2sgaWYgb25lIG9mIHRoZSBmaWVsZHMgY29udGFpbnMgc3Vycm9nYXRlIGNoYXJhY3RlcnMgYW5kIHRoZXJlYnkKICAgICAgICAjIGZvcmNlcyBoZHJjaGFyc2V0PUJJTkFSWSwgc2VlIF9wcm9jX3BheCgpIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICAgIGJpbmFyeSA9IEZhbHNlCiAgICAgICAgZm9yIGtleXdvcmQsIHZhbHVlIGluIHBheF9oZWFkZXJzLml0ZW1zKCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHZhbHVlLmVuY29kZSgidXRmOCIsICJzdHJpY3QiKQogICAgICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgICAgICAgICAgYmluYXJ5ID0gVHJ1ZQogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgcmVjb3JkcyA9IGIiIgogICAgICAgIGlmIGJpbmFyeToKICAgICAgICAgICAgIyBQdXQgdGhlIGhkcmNoYXJzZXQgZmllbGQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaGVhZGVyLgogICAgICAgICAgICByZWNvcmRzICs9IGIiMjEgaGRyY2hhcnNldD1CSU5BUllcbiIKCiAgICAgICAgZm9yIGtleXdvcmQsIHZhbHVlIGluIHBheF9oZWFkZXJzLml0ZW1zKCk6CiAgICAgICAgICAgIGtleXdvcmQgPSBrZXl3b3JkLmVuY29kZSgidXRmOCIpCiAgICAgICAgICAgIGlmIGJpbmFyeToKICAgICAgICAgICAgICAgICMgVHJ5IHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGJ5dGUgcmVwcmVzZW50YXRpb24gb2YgYHZhbHVlJy4KICAgICAgICAgICAgICAgICMgTmVlZGxlc3MgdG8gc2F5LCB0aGF0IHRoZSBlbmNvZGluZyBtdXN0IG1hdGNoIHRoZSBzdHJpbmcuCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmVuY29kZShlbmNvZGluZywgInN1cnJvZ2F0ZWVzY2FwZSIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmVuY29kZSgidXRmOCIpCgogICAgICAgICAgICBsID0gbGVuKGtleXdvcmQpICsgbGVuKHZhbHVlKSArIDMgICAjICcgJyArICc9JyArICdcbicKICAgICAgICAgICAgbiA9IHAgPSAwCiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBuID0gbCArIGxlbihzdHIocCkpCiAgICAgICAgICAgICAgICBpZiBuID09IHA6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIHAgPSBuCiAgICAgICAgICAgIHJlY29yZHMgKz0gYnl0ZXMoc3RyKHApLCAiYXNjaWkiKSArIGIiICIgKyBrZXl3b3JkICsgYiI9IiArIHZhbHVlICsgYiJcbiIKCiAgICAgICAgIyBXZSB1c2UgYSBoYXJkY29kZWQgIi4vLi9AUGF4SGVhZGVyIiBuYW1lIGxpa2Ugc3RhciBkb2VzCiAgICAgICAgIyBpbnN0ZWFkIG9mIHRoZSBvbmUgdGhhdCBQT1NJWCByZWNvbW1lbmRzLgogICAgICAgIGluZm8gPSB7fQogICAgICAgIGluZm9bIm5hbWUiXSA9ICIuLy4vQFBheEhlYWRlciIKICAgICAgICBpbmZvWyJ0eXBlIl0gPSB0eXBlCiAgICAgICAgaW5mb1sic2l6ZSJdID0gbGVuKHJlY29yZHMpCiAgICAgICAgaW5mb1sibWFnaWMiXSA9IFBPU0lYX01BR0lDCgogICAgICAgICMgQ3JlYXRlIHBheCBoZWFkZXIgKyByZWNvcmQgYmxvY2tzLgogICAgICAgIHJldHVybiBjbHMuX2NyZWF0ZV9oZWFkZXIoaW5mbywgVVNUQVJfRk9STUFULCAiYXNjaWkiLCAicmVwbGFjZSIpICsgXAogICAgICAgICAgICAgICAgY2xzLl9jcmVhdGVfcGF5bG9hZChyZWNvcmRzKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21idWYoY2xzLCBidWYsIGVuY29kaW5nLCBlcnJvcnMpOgogICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckluZm8gb2JqZWN0IGZyb20gYSA1MTIgYnl0ZSBieXRlcyBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbGVuKGJ1ZikgPT0gMDoKICAgICAgICAgICAgcmFpc2UgRW1wdHlIZWFkZXJFcnJvcigiZW1wdHkgaGVhZGVyIikKICAgICAgICBpZiBsZW4oYnVmKSAhPSBCTE9DS1NJWkU6CiAgICAgICAgICAgIHJhaXNlIFRydW5jYXRlZEhlYWRlckVycm9yKCJ0cnVuY2F0ZWQgaGVhZGVyIikKICAgICAgICBpZiBidWYuY291bnQoTlVMKSA9PSBCTE9DS1NJWkU6CiAgICAgICAgICAgIHJhaXNlIEVPRkhlYWRlckVycm9yKCJlbmQgb2YgZmlsZSBoZWFkZXIiKQoKICAgICAgICBjaGtzdW0gPSBudGkoYnVmWzE0ODoxNTZdKQogICAgICAgIGlmIGNoa3N1bSBub3QgaW4gY2FsY19jaGtzdW1zKGJ1Zik6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRIZWFkZXJFcnJvcigiYmFkIGNoZWNrc3VtIikKCiAgICAgICAgb2JqID0gY2xzKCkKICAgICAgICBvYmoubmFtZSA9IG50cyhidWZbMDoxMDBdLCBlbmNvZGluZywgZXJyb3JzKQogICAgICAgIG9iai5tb2RlID0gbnRpKGJ1ZlsxMDA6MTA4XSkKICAgICAgICBvYmoudWlkID0gbnRpKGJ1ZlsxMDg6MTE2XSkKICAgICAgICBvYmouZ2lkID0gbnRpKGJ1ZlsxMTY6MTI0XSkKICAgICAgICBvYmouc2l6ZSA9IG50aShidWZbMTI0OjEzNl0pCiAgICAgICAgb2JqLm10aW1lID0gbnRpKGJ1ZlsxMzY6MTQ4XSkKICAgICAgICBvYmouY2hrc3VtID0gY2hrc3VtCiAgICAgICAgb2JqLnR5cGUgPSBidWZbMTU2OjE1N10KICAgICAgICBvYmoubGlua25hbWUgPSBudHMoYnVmWzE1NzoyNTddLCBlbmNvZGluZywgZXJyb3JzKQogICAgICAgIG9iai51bmFtZSA9IG50cyhidWZbMjY1OjI5N10sIGVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgb2JqLmduYW1lID0gbnRzKGJ1ZlsyOTc6MzI5XSwgZW5jb2RpbmcsIGVycm9ycykKICAgICAgICBvYmouZGV2bWFqb3IgPSBudGkoYnVmWzMyOTozMzddKQogICAgICAgIG9iai5kZXZtaW5vciA9IG50aShidWZbMzM3OjM0NV0pCiAgICAgICAgcHJlZml4ID0gbnRzKGJ1ZlszNDU6NTAwXSwgZW5jb2RpbmcsIGVycm9ycykKCiAgICAgICAgIyBPbGQgVjcgdGFyIGZvcm1hdCByZXByZXNlbnRzIGEgZGlyZWN0b3J5IGFzIGEgcmVndWxhcgogICAgICAgICMgZmlsZSB3aXRoIGEgdHJhaWxpbmcgc2xhc2guCiAgICAgICAgaWYgb2JqLnR5cGUgPT0gQVJFR1RZUEUgYW5kIG9iai5uYW1lLmVuZHN3aXRoKCIvIik6CiAgICAgICAgICAgIG9iai50eXBlID0gRElSVFlQRQoKICAgICAgICAjIFRoZSBvbGQgR05VIHNwYXJzZSBmb3JtYXQgb2NjdXBpZXMgc29tZSBvZiB0aGUgdW51c2VkCiAgICAgICAgIyBzcGFjZSBpbiB0aGUgYnVmZmVyIGZvciB1cCB0byA0IHNwYXJzZSBzdHJ1Y3R1cmVzLgogICAgICAgICMgU2F2ZSB0aGUgdGhlbSBmb3IgbGF0ZXIgcHJvY2Vzc2luZyBpbiBfcHJvY19zcGFyc2UoKS4KICAgICAgICBpZiBvYmoudHlwZSA9PSBHTlVUWVBFX1NQQVJTRToKICAgICAgICAgICAgcG9zID0gMzg2CiAgICAgICAgICAgIHN0cnVjdHMgPSBbXQogICAgICAgICAgICBmb3IgaSBpbiByYW5nZSg0KToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBudGkoYnVmW3Bvczpwb3MgKyAxMl0pCiAgICAgICAgICAgICAgICAgICAgbnVtYnl0ZXMgPSBudGkoYnVmW3BvcyArIDEyOnBvcyArIDI0XSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBzdHJ1Y3RzLmFwcGVuZCgob2Zmc2V0LCBudW1ieXRlcykpCiAgICAgICAgICAgICAgICBwb3MgKz0gMjQKICAgICAgICAgICAgaXNleHRlbmRlZCA9IGJvb2woYnVmWzQ4Ml0pCiAgICAgICAgICAgIG9yaWdzaXplID0gbnRpKGJ1Zls0ODM6NDk1XSkKICAgICAgICAgICAgb2JqLl9zcGFyc2Vfc3RydWN0cyA9IChzdHJ1Y3RzLCBpc2V4dGVuZGVkLCBvcmlnc2l6ZSkKCiAgICAgICAgIyBSZW1vdmUgcmVkdW5kYW50IHNsYXNoZXMgZnJvbSBkaXJlY3Rvcmllcy4KICAgICAgICBpZiBvYmouaXNkaXIoKToKICAgICAgICAgICAgb2JqLm5hbWUgPSBvYmoubmFtZS5yc3RyaXAoIi8iKQoKICAgICAgICAjIFJlY29uc3RydWN0IGEgdXN0YXIgbG9uZ25hbWUuCiAgICAgICAgaWYgcHJlZml4IGFuZCBvYmoudHlwZSBub3QgaW4gR05VX1RZUEVTOgogICAgICAgICAgICBvYmoubmFtZSA9IHByZWZpeCArICIvIiArIG9iai5uYW1lCiAgICAgICAgcmV0dXJuIG9iagoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb210YXJmaWxlKGNscywgdGFyZmlsZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBuZXh0IFRhckluZm8gb2JqZWN0IGZyb20gVGFyRmlsZSBvYmplY3QKICAgICAgICAgICB0YXJmaWxlLgogICAgICAgICIiIgogICAgICAgIGJ1ZiA9IHRhcmZpbGUuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKICAgICAgICBvYmogPSBjbHMuZnJvbWJ1ZihidWYsIHRhcmZpbGUuZW5jb2RpbmcsIHRhcmZpbGUuZXJyb3JzKQogICAgICAgIG9iai5vZmZzZXQgPSB0YXJmaWxlLmZpbGVvYmoudGVsbCgpIC0gQkxPQ0tTSVpFCiAgICAgICAgcmV0dXJuIG9iai5fcHJvY19tZW1iZXIodGFyZmlsZSkKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgVGhlIGZvbGxvd2luZyBhcmUgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGEKICAgICMgbWVtYmVyLiBUaGUgZW50cnkgcG9pbnQgaXMgX3Byb2NfbWVtYmVyKCkgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gaW4gYQogICAgIyBzdWJjbGFzcyB0byBhZGQgY3VzdG9tIF9wcm9jXyooKSBtZXRob2RzLiBBIF9wcm9jXyooKSBtZXRob2QgTVVTVAogICAgIyBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZwogICAgIyBvcGVyYXRpb25zOgogICAgIyAxLiBTZXQgc2VsZi5vZmZzZXRfZGF0YSB0byB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGRhdGEgYmxvY2tzIGJlZ2luLAogICAgIyAgICBpZiB0aGVyZSBpcyBkYXRhIHRoYXQgZm9sbG93cy4KICAgICMgMi4gU2V0IHRhcmZpbGUub2Zmc2V0IHRvIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgbmV4dCBtZW1iZXIncyBoZWFkZXIgd2lsbAogICAgIyAgICBiZWdpbi4KICAgICMgMy4gUmV0dXJuIHNlbGYgb3IgYW5vdGhlciB2YWxpZCBUYXJJbmZvIG9iamVjdC4KICAgIGRlZiBfcHJvY19tZW1iZXIoc2VsZiwgdGFyZmlsZSk6CiAgICAgICAgIiIiQ2hvb3NlIHRoZSByaWdodCBwcm9jZXNzaW5nIG1ldGhvZCBkZXBlbmRpbmcgb24KICAgICAgICAgICB0aGUgdHlwZSBhbmQgY2FsbCBpdC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnR5cGUgaW4gKEdOVVRZUEVfTE9OR05BTUUsIEdOVVRZUEVfTE9OR0xJTkspOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJvY19nbnVsb25nKHRhcmZpbGUpCiAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gR05VVFlQRV9TUEFSU0U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcm9jX3NwYXJzZSh0YXJmaWxlKQogICAgICAgIGVsaWYgc2VsZi50eXBlIGluIChYSERUWVBFLCBYR0xUWVBFLCBTT0xBUklTX1hIRFRZUEUpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJvY19wYXgodGFyZmlsZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJvY19idWlsdGluKHRhcmZpbGUpCgogICAgZGVmIF9wcm9jX2J1aWx0aW4oc2VsZiwgdGFyZmlsZSk6CiAgICAgICAgIiIiUHJvY2VzcyBhIGJ1aWx0aW4gdHlwZSBvciBhbiB1bmtub3duIHR5cGUgd2hpY2gKICAgICAgICAgICB3aWxsIGJlIHRyZWF0ZWQgYXMgYSByZWd1bGFyIGZpbGUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5vZmZzZXRfZGF0YSA9IHRhcmZpbGUuZmlsZW9iai50ZWxsKCkKICAgICAgICBvZmZzZXQgPSBzZWxmLm9mZnNldF9kYXRhCiAgICAgICAgaWYgc2VsZi5pc3JlZygpIG9yIHNlbGYudHlwZSBub3QgaW4gU1VQUE9SVEVEX1RZUEVTOgogICAgICAgICAgICAjIFNraXAgdGhlIGZvbGxvd2luZyBkYXRhIGJsb2Nrcy4KICAgICAgICAgICAgb2Zmc2V0ICs9IHNlbGYuX2Jsb2NrKHNlbGYuc2l6ZSkKICAgICAgICB0YXJmaWxlLm9mZnNldCA9IG9mZnNldAoKICAgICAgICAjIFBhdGNoIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoIHNhdmVkIGdsb2JhbAogICAgICAgICMgaGVhZGVyIGluZm9ybWF0aW9uLgogICAgICAgIHNlbGYuX2FwcGx5X3BheF9pbmZvKHRhcmZpbGUucGF4X2hlYWRlcnMsIHRhcmZpbGUuZW5jb2RpbmcsIHRhcmZpbGUuZXJyb3JzKQoKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfcHJvY19nbnVsb25nKHNlbGYsIHRhcmZpbGUpOgogICAgICAgICIiIlByb2Nlc3MgdGhlIGJsb2NrcyB0aGF0IGhvbGQgYSBHTlUgbG9uZ25hbWUKICAgICAgICAgICBvciBsb25nbGluayBtZW1iZXIuCiAgICAgICAgIiIiCiAgICAgICAgYnVmID0gdGFyZmlsZS5maWxlb2JqLnJlYWQoc2VsZi5fYmxvY2soc2VsZi5zaXplKSkKCiAgICAgICAgIyBGZXRjaCB0aGUgbmV4dCBoZWFkZXIgYW5kIHByb2Nlc3MgaXQuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBuZXh0ID0gc2VsZi5mcm9tdGFyZmlsZSh0YXJmaWxlKQogICAgICAgIGV4Y2VwdCBIZWFkZXJFcnJvcjoKICAgICAgICAgICAgcmFpc2UgU3Vic2VxdWVudEhlYWRlckVycm9yKCJtaXNzaW5nIG9yIGJhZCBzdWJzZXF1ZW50IGhlYWRlciIpCgogICAgICAgICMgUGF0Y2ggdGhlIFRhckluZm8gb2JqZWN0IGZyb20gdGhlIG5leHQgaGVhZGVyIHdpdGgKICAgICAgICAjIHRoZSBsb25nbmFtZSBpbmZvcm1hdGlvbi4KICAgICAgICBuZXh0Lm9mZnNldCA9IHNlbGYub2Zmc2V0CiAgICAgICAgaWYgc2VsZi50eXBlID09IEdOVVRZUEVfTE9OR05BTUU6CiAgICAgICAgICAgIG5leHQubmFtZSA9IG50cyhidWYsIHRhcmZpbGUuZW5jb2RpbmcsIHRhcmZpbGUuZXJyb3JzKQogICAgICAgIGVsaWYgc2VsZi50eXBlID09IEdOVVRZUEVfTE9OR0xJTks6CiAgICAgICAgICAgIG5leHQubGlua25hbWUgPSBudHMoYnVmLCB0YXJmaWxlLmVuY29kaW5nLCB0YXJmaWxlLmVycm9ycykKCiAgICAgICAgcmV0dXJuIG5leHQKCiAgICBkZWYgX3Byb2Nfc3BhcnNlKHNlbGYsIHRhcmZpbGUpOgogICAgICAgICIiIlByb2Nlc3MgYSBHTlUgc3BhcnNlIGhlYWRlciBwbHVzIGV4dHJhIGhlYWRlcnMuCiAgICAgICAgIiIiCiAgICAgICAgIyBXZSBhbHJlYWR5IGNvbGxlY3RlZCBzb21lIHNwYXJzZSBzdHJ1Y3R1cmVzIGluIGZyb21idWYoKS4KICAgICAgICBzdHJ1Y3RzLCBpc2V4dGVuZGVkLCBvcmlnc2l6ZSA9IHNlbGYuX3NwYXJzZV9zdHJ1Y3RzCiAgICAgICAgZGVsIHNlbGYuX3NwYXJzZV9zdHJ1Y3RzCgogICAgICAgICMgQ29sbGVjdCBzcGFyc2Ugc3RydWN0dXJlcyBmcm9tIGV4dGVuZGVkIGhlYWRlciBibG9ja3MuCiAgICAgICAgd2hpbGUgaXNleHRlbmRlZDoKICAgICAgICAgICAgYnVmID0gdGFyZmlsZS5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQogICAgICAgICAgICBwb3MgPSAwCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDIxKToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBudGkoYnVmW3Bvczpwb3MgKyAxMl0pCiAgICAgICAgICAgICAgICAgICAgbnVtYnl0ZXMgPSBudGkoYnVmW3BvcyArIDEyOnBvcyArIDI0XSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBpZiBvZmZzZXQgYW5kIG51bWJ5dGVzOgogICAgICAgICAgICAgICAgICAgIHN0cnVjdHMuYXBwZW5kKChvZmZzZXQsIG51bWJ5dGVzKSkKICAgICAgICAgICAgICAgIHBvcyArPSAyNAogICAgICAgICAgICBpc2V4dGVuZGVkID0gYm9vbChidWZbNTA0XSkKICAgICAgICBzZWxmLnNwYXJzZSA9IHN0cnVjdHMKCiAgICAgICAgc2VsZi5vZmZzZXRfZGF0YSA9IHRhcmZpbGUuZmlsZW9iai50ZWxsKCkKICAgICAgICB0YXJmaWxlLm9mZnNldCA9IHNlbGYub2Zmc2V0X2RhdGEgKyBzZWxmLl9ibG9jayhzZWxmLnNpemUpCiAgICAgICAgc2VsZi5zaXplID0gb3JpZ3NpemUKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfcHJvY19wYXgoc2VsZiwgdGFyZmlsZSk6CiAgICAgICAgIiIiUHJvY2VzcyBhbiBleHRlbmRlZCBvciBnbG9iYWwgaGVhZGVyIGFzIGRlc2NyaWJlZCBpbgogICAgICAgICAgIFBPU0lYLjEtMjAwOC4KICAgICAgICAiIiIKICAgICAgICAjIFJlYWQgdGhlIGhlYWRlciBpbmZvcm1hdGlvbi4KICAgICAgICBidWYgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChzZWxmLl9ibG9jayhzZWxmLnNpemUpKQoKICAgICAgICAjIEEgcGF4IGhlYWRlciBzdG9yZXMgc3VwcGxlbWVudGFsIGluZm9ybWF0aW9uIGZvciBlaXRoZXIKICAgICAgICAjIHRoZSBmb2xsb3dpbmcgZmlsZSAoZXh0ZW5kZWQpIG9yIGFsbCBmb2xsb3dpbmcgZmlsZXMKICAgICAgICAjIChnbG9iYWwpLgogICAgICAgIGlmIHNlbGYudHlwZSA9PSBYR0xUWVBFOgogICAgICAgICAgICBwYXhfaGVhZGVycyA9IHRhcmZpbGUucGF4X2hlYWRlcnMKICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXhfaGVhZGVycyA9IHRhcmZpbGUucGF4X2hlYWRlcnMuY29weSgpCgogICAgICAgICMgQ2hlY2sgaWYgdGhlIHBheCBoZWFkZXIgY29udGFpbnMgYSBoZHJjaGFyc2V0IGZpZWxkLiBUaGlzIHRlbGxzIHVzCiAgICAgICAgIyB0aGUgZW5jb2Rpbmcgb2YgdGhlIHBhdGgsIGxpbmtwYXRoLCB1bmFtZSBhbmQgZ25hbWUgZmllbGRzLiBOb3JtYWxseSwKICAgICAgICAjIHRoZXNlIGZpZWxkcyBhcmUgVVRGLTggZW5jb2RlZCBidXQgc2luY2UgUE9TSVguMS0yMDA4IHRhcgogICAgICAgICMgaW1wbGVtZW50YXRpb25zIGFyZSBhbGxvd2VkIHRvIHN0b3JlIHRoZW0gYXMgcmF3IGJpbmFyeSBzdHJpbmdzIGlmCiAgICAgICAgIyB0aGUgdHJhbnNsYXRpb24gdG8gVVRGLTggZmFpbHMuCiAgICAgICAgbWF0Y2ggPSByZS5zZWFyY2goYnIiXGQrIGhkcmNoYXJzZXQ9KFteXG5dKylcbiIsIGJ1ZikKICAgICAgICBpZiBtYXRjaCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGF4X2hlYWRlcnNbImhkcmNoYXJzZXQiXSA9IG1hdGNoLmdyb3VwKDEpLmRlY29kZSgidXRmOCIpCgogICAgICAgICMgRm9yIHRoZSB0aW1lIGJlaW5nLCB3ZSBkb24ndCBjYXJlIGFib3V0IGFueXRoaW5nIG90aGVyIHRoYW4gIkJJTkFSWSIuCiAgICAgICAgIyBUaGUgb25seSBvdGhlciB2YWx1ZSB0aGF0IGlzIGN1cnJlbnRseSBhbGxvd2VkIGJ5IHRoZSBzdGFuZGFyZCBpcwogICAgICAgICMgIklTTy1JUiAxMDY0NiAyMDAwIFVURi04IiBpbiBvdGhlciB3b3JkcyBVVEYtOC4KICAgICAgICBoZHJjaGFyc2V0ID0gcGF4X2hlYWRlcnMuZ2V0KCJoZHJjaGFyc2V0IikKICAgICAgICBpZiBoZHJjaGFyc2V0ID09ICJCSU5BUlkiOgogICAgICAgICAgICBlbmNvZGluZyA9IHRhcmZpbGUuZW5jb2RpbmcKICAgICAgICBlbHNlOgogICAgICAgICAgICBlbmNvZGluZyA9ICJ1dGY4IgoKICAgICAgICAjIFBhcnNlIHBheCBoZWFkZXIgaW5mb3JtYXRpb24uIEEgcmVjb3JkIGxvb2tzIGxpa2UgdGhhdDoKICAgICAgICAjICIlZCAlcz0lc1xuIiAlIChsZW5ndGgsIGtleXdvcmQsIHZhbHVlKS4gbGVuZ3RoIGlzIHRoZSBzaXplCiAgICAgICAgIyBvZiB0aGUgY29tcGxldGUgcmVjb3JkIGluY2x1ZGluZyB0aGUgbGVuZ3RoIGZpZWxkIGl0c2VsZiBhbmQKICAgICAgICAjIHRoZSBuZXdsaW5lLiBrZXl3b3JkIGFuZCB2YWx1ZSBhcmUgYm90aCBVVEYtOCBlbmNvZGVkIHN0cmluZ3MuCiAgICAgICAgcmVnZXggPSByZS5jb21waWxlKGJyIihcZCspIChbXj1dKyk9IikKICAgICAgICBwb3MgPSAwCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgbWF0Y2ggPSByZWdleC5tYXRjaChidWYsIHBvcykKICAgICAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgICAgIGxlbmd0aCwga2V5d29yZCA9IG1hdGNoLmdyb3VwcygpCiAgICAgICAgICAgIGxlbmd0aCA9IGludChsZW5ndGgpCiAgICAgICAgICAgIHZhbHVlID0gYnVmW21hdGNoLmVuZCgyKSArIDE6bWF0Y2guc3RhcnQoMSkgKyBsZW5ndGggLSAxXQoKICAgICAgICAgICAgIyBOb3JtYWxseSwgd2UgY291bGQganVzdCB1c2UgInV0ZjgiIGFzIHRoZSBlbmNvZGluZyBhbmQgInN0cmljdCIKICAgICAgICAgICAgIyBhcyB0aGUgZXJyb3IgaGFuZGxlciwgYnV0IHdlIGJldHRlciBub3QgdGFrZSB0aGUgcmlzay4gRm9yCiAgICAgICAgICAgICMgZXhhbXBsZSwgR05VIHRhciA8PSAxLjIzIGlzIGtub3duIHRvIHN0b3JlIGZpbGVuYW1lcyBpdCBjYW5ub3QKICAgICAgICAgICAgIyB0cmFuc2xhdGUgdG8gVVRGLTggYXMgcmF3IHN0cmluZ3MgKHVuZm9ydHVuYXRlbHkgd2l0aG91dCBhCiAgICAgICAgICAgICMgaGRyY2hhcnNldD1CSU5BUlkgaGVhZGVyKS4KICAgICAgICAgICAgIyBXZSBmaXJzdCB0cnkgdGhlIHN0cmljdCBzdGFuZGFyZCBlbmNvZGluZywgYW5kIGlmIHRoYXQgZmFpbHMgd2UKICAgICAgICAgICAgIyBmYWxsIGJhY2sgb24gdGhlIHVzZXIncyBlbmNvZGluZyBhbmQgZXJyb3IgaGFuZGxlci4KICAgICAgICAgICAga2V5d29yZCA9IHNlbGYuX2RlY29kZV9wYXhfZmllbGQoa2V5d29yZCwgInV0ZjgiLCAidXRmOCIsCiAgICAgICAgICAgICAgICAgICAgdGFyZmlsZS5lcnJvcnMpCiAgICAgICAgICAgIGlmIGtleXdvcmQgaW4gUEFYX05BTUVfRklFTERTOgogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9kZWNvZGVfcGF4X2ZpZWxkKHZhbHVlLCBlbmNvZGluZywgdGFyZmlsZS5lbmNvZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZmlsZS5lcnJvcnMpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX2RlY29kZV9wYXhfZmllbGQodmFsdWUsICJ1dGY4IiwgInV0ZjgiLAogICAgICAgICAgICAgICAgICAgICAgICB0YXJmaWxlLmVycm9ycykKCiAgICAgICAgICAgIHBheF9oZWFkZXJzW2tleXdvcmRdID0gdmFsdWUKICAgICAgICAgICAgcG9zICs9IGxlbmd0aAoKICAgICAgICAjIEZldGNoIHRoZSBuZXh0IGhlYWRlci4KICAgICAgICB0cnk6CiAgICAgICAgICAgIG5leHQgPSBzZWxmLmZyb210YXJmaWxlKHRhcmZpbGUpCiAgICAgICAgZXhjZXB0IEhlYWRlckVycm9yOgogICAgICAgICAgICByYWlzZSBTdWJzZXF1ZW50SGVhZGVyRXJyb3IoIm1pc3Npbmcgb3IgYmFkIHN1YnNlcXVlbnQgaGVhZGVyIikKCiAgICAgICAgIyBQcm9jZXNzIEdOVSBzcGFyc2UgaW5mb3JtYXRpb24uCiAgICAgICAgaWYgIkdOVS5zcGFyc2UubWFwIiBpbiBwYXhfaGVhZGVyczoKICAgICAgICAgICAgIyBHTlUgZXh0ZW5kZWQgc3BhcnNlIGZvcm1hdCB2ZXJzaW9uIDAuMS4KICAgICAgICAgICAgc2VsZi5fcHJvY19nbnVzcGFyc2VfMDEobmV4dCwgcGF4X2hlYWRlcnMpCgogICAgICAgIGVsaWYgIkdOVS5zcGFyc2Uuc2l6ZSIgaW4gcGF4X2hlYWRlcnM6CiAgICAgICAgICAgICMgR05VIGV4dGVuZGVkIHNwYXJzZSBmb3JtYXQgdmVyc2lvbiAwLjAuCiAgICAgICAgICAgIHNlbGYuX3Byb2NfZ251c3BhcnNlXzAwKG5leHQsIHBheF9oZWFkZXJzLCBidWYpCgogICAgICAgIGVsaWYgcGF4X2hlYWRlcnMuZ2V0KCJHTlUuc3BhcnNlLm1ham9yIikgPT0gIjEiIGFuZCBwYXhfaGVhZGVycy5nZXQoIkdOVS5zcGFyc2UubWlub3IiKSA9PSAiMCI6CiAgICAgICAgICAgICMgR05VIGV4dGVuZGVkIHNwYXJzZSBmb3JtYXQgdmVyc2lvbiAxLjAuCiAgICAgICAgICAgIHNlbGYuX3Byb2NfZ251c3BhcnNlXzEwKG5leHQsIHBheF9oZWFkZXJzLCB0YXJmaWxlKQoKICAgICAgICBpZiBzZWxmLnR5cGUgaW4gKFhIRFRZUEUsIFNPTEFSSVNfWEhEVFlQRSk6CiAgICAgICAgICAgICMgUGF0Y2ggdGhlIFRhckluZm8gb2JqZWN0IHdpdGggdGhlIGV4dGVuZGVkIGhlYWRlciBpbmZvLgogICAgICAgICAgICBuZXh0Ll9hcHBseV9wYXhfaW5mbyhwYXhfaGVhZGVycywgdGFyZmlsZS5lbmNvZGluZywgdGFyZmlsZS5lcnJvcnMpCiAgICAgICAgICAgIG5leHQub2Zmc2V0ID0gc2VsZi5vZmZzZXQKCiAgICAgICAgICAgIGlmICJzaXplIiBpbiBwYXhfaGVhZGVyczoKICAgICAgICAgICAgICAgICMgSWYgdGhlIGV4dGVuZGVkIGhlYWRlciByZXBsYWNlcyB0aGUgc2l6ZSBmaWVsZCwKICAgICAgICAgICAgICAgICMgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgb2Zmc2V0IHdoZXJlIHRoZSBuZXh0CiAgICAgICAgICAgICAgICAjIGhlYWRlciBzdGFydHMuCiAgICAgICAgICAgICAgICBvZmZzZXQgPSBuZXh0Lm9mZnNldF9kYXRhCiAgICAgICAgICAgICAgICBpZiBuZXh0LmlzcmVnKCkgb3IgbmV4dC50eXBlIG5vdCBpbiBTVVBQT1JURURfVFlQRVM6CiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IG5leHQuX2Jsb2NrKG5leHQuc2l6ZSkKICAgICAgICAgICAgICAgIHRhcmZpbGUub2Zmc2V0ID0gb2Zmc2V0CgogICAgICAgIHJldHVybiBuZXh0CgogICAgZGVmIF9wcm9jX2dudXNwYXJzZV8wMChzZWxmLCBuZXh0LCBwYXhfaGVhZGVycywgYnVmKToKICAgICAgICAiIiJQcm9jZXNzIGEgR05VIHRhciBleHRlbmRlZCBzcGFyc2UgaGVhZGVyLCB2ZXJzaW9uIDAuMC4KICAgICAgICAiIiIKICAgICAgICBvZmZzZXRzID0gW10KICAgICAgICBmb3IgbWF0Y2ggaW4gcmUuZmluZGl0ZXIoYnIiXGQrIEdOVS5zcGFyc2Uub2Zmc2V0PShcZCspXG4iLCBidWYpOgogICAgICAgICAgICBvZmZzZXRzLmFwcGVuZChpbnQobWF0Y2guZ3JvdXAoMSkpKQogICAgICAgIG51bWJ5dGVzID0gW10KICAgICAgICBmb3IgbWF0Y2ggaW4gcmUuZmluZGl0ZXIoYnIiXGQrIEdOVS5zcGFyc2UubnVtYnl0ZXM9KFxkKylcbiIsIGJ1Zik6CiAgICAgICAgICAgIG51bWJ5dGVzLmFwcGVuZChpbnQobWF0Y2guZ3JvdXAoMSkpKQogICAgICAgIG5leHQuc3BhcnNlID0gbGlzdCh6aXAob2Zmc2V0cywgbnVtYnl0ZXMpKQoKICAgIGRlZiBfcHJvY19nbnVzcGFyc2VfMDEoc2VsZiwgbmV4dCwgcGF4X2hlYWRlcnMpOgogICAgICAgICIiIlByb2Nlc3MgYSBHTlUgdGFyIGV4dGVuZGVkIHNwYXJzZSBoZWFkZXIsIHZlcnNpb24gMC4xLgogICAgICAgICIiIgogICAgICAgIHNwYXJzZSA9IFtpbnQoeCkgZm9yIHggaW4gcGF4X2hlYWRlcnNbIkdOVS5zcGFyc2UubWFwIl0uc3BsaXQoIiwiKV0KICAgICAgICBuZXh0LnNwYXJzZSA9IGxpc3QoemlwKHNwYXJzZVs6OjJdLCBzcGFyc2VbMTo6Ml0pKQoKICAgIGRlZiBfcHJvY19nbnVzcGFyc2VfMTAoc2VsZiwgbmV4dCwgcGF4X2hlYWRlcnMsIHRhcmZpbGUpOgogICAgICAgICIiIlByb2Nlc3MgYSBHTlUgdGFyIGV4dGVuZGVkIHNwYXJzZSBoZWFkZXIsIHZlcnNpb24gMS4wLgogICAgICAgICIiIgogICAgICAgIGZpZWxkcyA9IE5vbmUKICAgICAgICBzcGFyc2UgPSBbXQogICAgICAgIGJ1ZiA9IHRhcmZpbGUuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKICAgICAgICBmaWVsZHMsIGJ1ZiA9IGJ1Zi5zcGxpdChiIlxuIiwgMSkKICAgICAgICBmaWVsZHMgPSBpbnQoZmllbGRzKQogICAgICAgIHdoaWxlIGxlbihzcGFyc2UpIDwgZmllbGRzICogMjoKICAgICAgICAgICAgaWYgYiJcbiIgbm90IGluIGJ1ZjoKICAgICAgICAgICAgICAgIGJ1ZiArPSB0YXJmaWxlLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCiAgICAgICAgICAgIG51bWJlciwgYnVmID0gYnVmLnNwbGl0KGIiXG4iLCAxKQogICAgICAgICAgICBzcGFyc2UuYXBwZW5kKGludChudW1iZXIpKQogICAgICAgIG5leHQub2Zmc2V0X2RhdGEgPSB0YXJmaWxlLmZpbGVvYmoudGVsbCgpCiAgICAgICAgbmV4dC5zcGFyc2UgPSBsaXN0KHppcChzcGFyc2VbOjoyXSwgc3BhcnNlWzE6OjJdKSkKCiAgICBkZWYgX2FwcGx5X3BheF9pbmZvKHNlbGYsIHBheF9oZWFkZXJzLCBlbmNvZGluZywgZXJyb3JzKToKICAgICAgICAiIiJSZXBsYWNlIGZpZWxkcyB3aXRoIHN1cHBsZW1lbnRhbCBpbmZvcm1hdGlvbiBmcm9tIGEgcHJldmlvdXMKICAgICAgICAgICBwYXggZXh0ZW5kZWQgb3IgZ2xvYmFsIGhlYWRlci4KICAgICAgICAiIiIKICAgICAgICBmb3Iga2V5d29yZCwgdmFsdWUgaW4gcGF4X2hlYWRlcnMuaXRlbXMoKToKICAgICAgICAgICAgaWYga2V5d29yZCA9PSAiR05VLnNwYXJzZS5uYW1lIjoKICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgInBhdGgiLCB2YWx1ZSkKICAgICAgICAgICAgZWxpZiBrZXl3b3JkID09ICJHTlUuc3BhcnNlLnNpemUiOgogICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCAic2l6ZSIsIGludCh2YWx1ZSkpCiAgICAgICAgICAgIGVsaWYga2V5d29yZCA9PSAiR05VLnNwYXJzZS5yZWFsc2l6ZSI6CiAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsICJzaXplIiwgaW50KHZhbHVlKSkKICAgICAgICAgICAgZWxpZiBrZXl3b3JkIGluIFBBWF9GSUVMRFM6CiAgICAgICAgICAgICAgICBpZiBrZXl3b3JkIGluIFBBWF9OVU1CRVJfRklFTERTOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBQQVhfTlVNQkVSX0ZJRUxEU1trZXl3b3JkXSh2YWx1ZSkKICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAwCiAgICAgICAgICAgICAgICBpZiBrZXl3b3JkID09ICJwYXRoIjoKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJzdHJpcCgiLyIpCiAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGtleXdvcmQsIHZhbHVlKQoKICAgICAgICBzZWxmLnBheF9oZWFkZXJzID0gcGF4X2hlYWRlcnMuY29weSgpCgogICAgZGVmIF9kZWNvZGVfcGF4X2ZpZWxkKHNlbGYsIHZhbHVlLCBlbmNvZGluZywgZmFsbGJhY2tfZW5jb2RpbmcsIGZhbGxiYWNrX2Vycm9ycyk6CiAgICAgICAgIiIiRGVjb2RlIGEgc2luZ2xlIGZpZWxkIGZyb20gYSBwYXggcmVjb3JkLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmRlY29kZShlbmNvZGluZywgInN0cmljdCIpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmRlY29kZShmYWxsYmFja19lbmNvZGluZywgZmFsbGJhY2tfZXJyb3JzKQoKICAgIGRlZiBfYmxvY2soc2VsZiwgY291bnQpOgogICAgICAgICIiIlJvdW5kIHVwIGEgYnl0ZSBjb3VudCBieSBCTE9DS1NJWkUgYW5kIHJldHVybiBpdCwKICAgICAgICAgICBlLmcuIF9ibG9jayg4MzQpID0+IDEwMjQuCiAgICAgICAgIiIiCiAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2QoY291bnQsIEJMT0NLU0laRSkKICAgICAgICBpZiByZW1haW5kZXI6CiAgICAgICAgICAgIGJsb2NrcyArPSAxCiAgICAgICAgcmV0dXJuIGJsb2NrcyAqIEJMT0NLU0laRQoKICAgIGRlZiBpc3JlZyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50eXBlIGluIFJFR1VMQVJfVFlQRVMKICAgIGRlZiBpc2ZpbGUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuaXNyZWcoKQogICAgZGVmIGlzZGlyKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnR5cGUgPT0gRElSVFlQRQogICAgZGVmIGlzc3ltKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnR5cGUgPT0gU1lNVFlQRQogICAgZGVmIGlzbG5rKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnR5cGUgPT0gTE5LVFlQRQogICAgZGVmIGlzY2hyKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnR5cGUgPT0gQ0hSVFlQRQogICAgZGVmIGlzYmxrKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnR5cGUgPT0gQkxLVFlQRQogICAgZGVmIGlzZmlmbyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IEZJRk9UWVBFCiAgICBkZWYgaXNzcGFyc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuc3BhcnNlIGlzIG5vdCBOb25lCiAgICBkZWYgaXNkZXYoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudHlwZSBpbiAoQ0hSVFlQRSwgQkxLVFlQRSwgRklGT1RZUEUpCiMgY2xhc3MgVGFySW5mbwoKY2xhc3MgVGFyRmlsZShvYmplY3QpOgogICAgIiIiVGhlIFRhckZpbGUgQ2xhc3MgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHRhciBhcmNoaXZlcy4KICAgICIiIgoKICAgIGRlYnVnID0gMCAgICAgICAgICAgICAgICAgICAjIE1heSBiZSBzZXQgZnJvbSAwIChubyBtc2dzKSB0byAzIChhbGwgbXNncykKCiAgICBkZXJlZmVyZW5jZSA9IEZhbHNlICAgICAgICAgIyBJZiB0cnVlLCBhZGQgY29udGVudCBvZiBsaW5rZWQgZmlsZSB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRhciBmaWxlLCBlbHNlIHRoZSBsaW5rLgoKICAgIGlnbm9yZV96ZXJvcyA9IEZhbHNlICAgICAgICAjIElmIHRydWUsIHNraXBzIGVtcHR5IG9yIGludmFsaWQgYmxvY2tzIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29udGludWVzIHByb2Nlc3NpbmcuCgogICAgZXJyb3JsZXZlbCA9IDEgICAgICAgICAgICAgICMgSWYgMCwgZmF0YWwgZXJyb3JzIG9ubHkgYXBwZWFyIGluIGRlYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtZXNzYWdlcyAoaWYgZGVidWcgPj0gMCkuIElmID4gMCwgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmUgcGFzc2VkIHRvIHRoZSBjYWxsZXIgYXMgZXhjZXB0aW9ucy4KCiAgICBmb3JtYXQgPSBERUZBVUxUX0ZPUk1BVCAgICAgIyBUaGUgZm9ybWF0IHRvIHVzZSB3aGVuIGNyZWF0aW5nIGFuIGFyY2hpdmUuCgogICAgZW5jb2RpbmcgPSBFTkNPRElORyAgICAgICAgICMgRW5jb2RpbmcgZm9yIDgtYml0IGNoYXJhY3RlciBzdHJpbmdzLgoKICAgIGVycm9ycyA9IE5vbmUgICAgICAgICAgICAgICAjIEVycm9yIGhhbmRsZXIgZm9yIHVuaWNvZGUgY29udmVyc2lvbi4KCiAgICB0YXJpbmZvID0gVGFySW5mbyAgICAgICAgICAgIyBUaGUgZGVmYXVsdCBUYXJJbmZvIGNsYXNzIHRvIHVzZS4KCiAgICBmaWxlb2JqZWN0ID0gRXhGaWxlT2JqZWN0ICAgIyBUaGUgZGVmYXVsdCBFeEZpbGVPYmplY3QgY2xhc3MgdG8gdXNlLgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPU5vbmUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGZvcm1hdD1Ob25lLAogICAgICAgICAgICB0YXJpbmZvPU5vbmUsIGRlcmVmZXJlbmNlPU5vbmUsIGlnbm9yZV96ZXJvcz1Ob25lLCBlbmNvZGluZz1Ob25lLAogICAgICAgICAgICBlcnJvcnM9InN1cnJvZ2F0ZWVzY2FwZSIsIHBheF9oZWFkZXJzPU5vbmUsIGRlYnVnPU5vbmUsIGVycm9ybGV2ZWw9Tm9uZSk6CiAgICAgICAgIiIiT3BlbiBhbiAodW5jb21wcmVzc2VkKSB0YXIgYXJjaGl2ZSBgbmFtZScuIGBtb2RlJyBpcyBlaXRoZXIgJ3InIHRvCiAgICAgICAgICAgcmVhZCBmcm9tIGFuIGV4aXN0aW5nIGFyY2hpdmUsICdhJyB0byBhcHBlbmQgZGF0YSB0byBhbiBleGlzdGluZwogICAgICAgICAgIGZpbGUgb3IgJ3cnIHRvIGNyZWF0ZSBhIG5ldyBmaWxlIG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5nIG9uZS4gYG1vZGUnCiAgICAgICAgICAgZGVmYXVsdHMgdG8gJ3InLgogICAgICAgICAgIElmIGBmaWxlb2JqJyBpcyBnaXZlbiwgaXQgaXMgdXNlZCBmb3IgcmVhZGluZyBvciB3cml0aW5nIGRhdGEuIElmIGl0CiAgICAgICAgICAgY2FuIGJlIGRldGVybWluZWQsIGBtb2RlJyBpcyBvdmVycmlkZGVuIGJ5IGBmaWxlb2JqJ3MgbW9kZS4KICAgICAgICAgICBgZmlsZW9iaicgaXMgbm90IGNsb3NlZCwgd2hlbiBUYXJGaWxlIGlzIGNsb3NlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBsZW4obW9kZSkgPiAxIG9yIG1vZGUgbm90IGluICJyYXciOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InLCAnYScgb3IgJ3cnIikKICAgICAgICBzZWxmLm1vZGUgPSBtb2RlCiAgICAgICAgc2VsZi5fbW9kZSA9IHsiciI6ICJyYiIsICJhIjogInIrYiIsICJ3IjogIndiIn1bbW9kZV0KCiAgICAgICAgaWYgbm90IGZpbGVvYmo6CiAgICAgICAgICAgIGlmIHNlbGYubW9kZSA9PSAiYSIgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhuYW1lKToKICAgICAgICAgICAgICAgICMgQ3JlYXRlIG5vbmV4aXN0ZW50IGZpbGVzIGluIGFwcGVuZCBtb2RlLgogICAgICAgICAgICAgICAgc2VsZi5tb2RlID0gInciCiAgICAgICAgICAgICAgICBzZWxmLl9tb2RlID0gIndiIgogICAgICAgICAgICBmaWxlb2JqID0gYmx0bl9vcGVuKG5hbWUsIHNlbGYuX21vZGUpCiAgICAgICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG5hbWUgaXMgTm9uZSBhbmQgaGFzYXR0cihmaWxlb2JqLCAibmFtZSIpOgogICAgICAgICAgICAgICAgbmFtZSA9IGZpbGVvYmoubmFtZQogICAgICAgICAgICBpZiBoYXNhdHRyKGZpbGVvYmosICJtb2RlIik6CiAgICAgICAgICAgICAgICBzZWxmLl9tb2RlID0gZmlsZW9iai5tb2RlCiAgICAgICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBUcnVlCiAgICAgICAgc2VsZi5uYW1lID0gb3MucGF0aC5hYnNwYXRoKG5hbWUpIGlmIG5hbWUgZWxzZSBOb25lCiAgICAgICAgc2VsZi5maWxlb2JqID0gZmlsZW9iagoKICAgICAgICAjIEluaXQgYXR0cmlidXRlcy4KICAgICAgICBpZiBmb3JtYXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZm9ybWF0ID0gZm9ybWF0CiAgICAgICAgaWYgdGFyaW5mbyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi50YXJpbmZvID0gdGFyaW5mbwogICAgICAgIGlmIGRlcmVmZXJlbmNlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmRlcmVmZXJlbmNlID0gZGVyZWZlcmVuY2UKICAgICAgICBpZiBpZ25vcmVfemVyb3MgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuaWdub3JlX3plcm9zID0gaWdub3JlX3plcm9zCiAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZwogICAgICAgIHNlbGYuZXJyb3JzID0gZXJyb3JzCgogICAgICAgIGlmIHBheF9oZWFkZXJzIGlzIG5vdCBOb25lIGFuZCBzZWxmLmZvcm1hdCA9PSBQQVhfRk9STUFUOgogICAgICAgICAgICBzZWxmLnBheF9oZWFkZXJzID0gcGF4X2hlYWRlcnMKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnBheF9oZWFkZXJzID0ge30KCiAgICAgICAgaWYgZGVidWcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZGVidWcgPSBkZWJ1ZwogICAgICAgIGlmIGVycm9ybGV2ZWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZXJyb3JsZXZlbCA9IGVycm9ybGV2ZWwKCiAgICAgICAgIyBJbml0IGRhdGFzdHJ1Y3R1cmVzLgogICAgICAgIHNlbGYuY2xvc2VkID0gRmFsc2UKICAgICAgICBzZWxmLm1lbWJlcnMgPSBbXSAgICAgICAjIGxpc3Qgb2YgbWVtYmVycyBhcyBUYXJJbmZvIG9iamVjdHMKICAgICAgICBzZWxmLl9sb2FkZWQgPSBGYWxzZSAgICAjIGZsYWcgaWYgYWxsIG1lbWJlcnMgaGF2ZSBiZWVuIHJlYWQKICAgICAgICBzZWxmLm9mZnNldCA9IHNlbGYuZmlsZW9iai50ZWxsKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGFyY2hpdmUgZmlsZQogICAgICAgIHNlbGYuaW5vZGVzID0ge30gICAgICAgICMgZGljdGlvbmFyeSBjYWNoaW5nIHRoZSBpbm9kZXMgb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFyY2hpdmUgbWVtYmVycyBhbHJlYWR5IGFkZGVkCgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgc2VsZi5tb2RlID09ICJyIjoKICAgICAgICAgICAgICAgIHNlbGYuZmlyc3RtZW1iZXIgPSBOb25lCiAgICAgICAgICAgICAgICBzZWxmLmZpcnN0bWVtYmVyID0gc2VsZi5uZXh0KCkKCiAgICAgICAgICAgIGlmIHNlbGYubW9kZSA9PSAiYSI6CiAgICAgICAgICAgICAgICAjIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZSwKICAgICAgICAgICAgICAgICMgYmVmb3JlIHRoZSBmaXJzdCBlbXB0eSBibG9jay4KICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoc2VsZi5vZmZzZXQpCiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJpbmZvLmZyb210YXJmaWxlKHNlbGYpCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWVtYmVycy5hcHBlbmQodGFyaW5mbykKICAgICAgICAgICAgICAgICAgICBleGNlcHQgRU9GSGVhZGVyRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYub2Zmc2V0KQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBIZWFkZXJFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3Ioc3RyKGUpKQoKICAgICAgICAgICAgaWYgc2VsZi5tb2RlIGluICJhdyI6CiAgICAgICAgICAgICAgICBzZWxmLl9sb2FkZWQgPSBUcnVlCgogICAgICAgICAgICAgICAgaWYgc2VsZi5wYXhfaGVhZGVyczoKICAgICAgICAgICAgICAgICAgICBidWYgPSBzZWxmLnRhcmluZm8uY3JlYXRlX3BheF9nbG9iYWxfaGVhZGVyKHNlbGYucGF4X2hlYWRlcnMuY29weSgpKQogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShidWYpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gbGVuKGJ1ZikKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9leHRmaWxlb2JqOgogICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCiAgICAgICAgICAgIHJhaXNlCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIEJlbG93IGFyZSB0aGUgY2xhc3NtZXRob2RzIHdoaWNoIGFjdCBhcyBhbHRlcm5hdGUgY29uc3RydWN0b3JzIHRvIHRoZQogICAgIyBUYXJGaWxlIGNsYXNzLiBUaGUgb3BlbigpIG1ldGhvZCBpcyB0aGUgb25seSBvbmUgdGhhdCBpcyBuZWVkZWQgZm9yCiAgICAjIHB1YmxpYyB1c2U7IGl0IGlzIHRoZSAic3VwZXIiLWNvbnN0cnVjdG9yIGFuZCBpcyBhYmxlIHRvIHNlbGVjdCBhbgogICAgIyBhZGVxdWF0ZSAic3ViIi1jb25zdHJ1Y3RvciBmb3IgYSBwYXJ0aWN1bGFyIGNvbXByZXNzaW9uIHVzaW5nIHRoZSBtYXBwaW5nCiAgICAjIGZyb20gT1BFTl9NRVRILgogICAgIwogICAgIyBUaGlzIGNvbmNlcHQgYWxsb3dzIG9uZSB0byBzdWJjbGFzcyBUYXJGaWxlIHdpdGhvdXQgbG9zaW5nIHRoZSBjb21mb3J0IG9mCiAgICAjIHRoZSBzdXBlci1jb25zdHJ1Y3Rvci4gQSBzdWItY29uc3RydWN0b3IgaXMgcmVnaXN0ZXJlZCBhbmQgbWFkZSBhdmFpbGFibGUKICAgICMgYnkgYWRkaW5nIGl0IHRvIHRoZSBtYXBwaW5nIGluIE9QRU5fTUVUSC4KCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBvcGVuKGNscywgbmFtZT1Ob25lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lLCBidWZzaXplPVJFQ09SRFNJWkUsICoqa3dhcmdzKToKICAgICAgICAiIiJPcGVuIGEgdGFyIGFyY2hpdmUgZm9yIHJlYWRpbmcsIHdyaXRpbmcgb3IgYXBwZW5kaW5nLiBSZXR1cm4KICAgICAgICAgICBhbiBhcHByb3ByaWF0ZSBUYXJGaWxlIGNsYXNzLgoKICAgICAgICAgICBtb2RlOgogICAgICAgICAgICdyJyBvciAncjoqJyBvcGVuIGZvciByZWFkaW5nIHdpdGggdHJhbnNwYXJlbnQgY29tcHJlc3Npb24KICAgICAgICAgICAncjonICAgICAgICAgb3BlbiBmb3IgcmVhZGluZyBleGNsdXNpdmVseSB1bmNvbXByZXNzZWQKICAgICAgICAgICAncjpneicgICAgICAgb3BlbiBmb3IgcmVhZGluZyB3aXRoIGd6aXAgY29tcHJlc3Npb24KICAgICAgICAgICAncjpiejInICAgICAgb3BlbiBmb3IgcmVhZGluZyB3aXRoIGJ6aXAyIGNvbXByZXNzaW9uCiAgICAgICAgICAgJ2EnIG9yICdhOicgIG9wZW4gZm9yIGFwcGVuZGluZywgY3JlYXRpbmcgdGhlIGZpbGUgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgJ3cnIG9yICd3OicgIG9wZW4gZm9yIHdyaXRpbmcgd2l0aG91dCBjb21wcmVzc2lvbgogICAgICAgICAgICd3Omd6JyAgICAgICBvcGVuIGZvciB3cml0aW5nIHdpdGggZ3ppcCBjb21wcmVzc2lvbgogICAgICAgICAgICd3OmJ6MicgICAgICBvcGVuIGZvciB3cml0aW5nIHdpdGggYnppcDIgY29tcHJlc3Npb24KCiAgICAgICAgICAgJ3J8KicgICAgICAgIG9wZW4gYSBzdHJlYW0gb2YgdGFyIGJsb2NrcyB3aXRoIHRyYW5zcGFyZW50IGNvbXByZXNzaW9uCiAgICAgICAgICAgJ3J8JyAgICAgICAgIG9wZW4gYW4gdW5jb21wcmVzc2VkIHN0cmVhbSBvZiB0YXIgYmxvY2tzIGZvciByZWFkaW5nCiAgICAgICAgICAgJ3J8Z3onICAgICAgIG9wZW4gYSBnemlwIGNvbXByZXNzZWQgc3RyZWFtIG9mIHRhciBibG9ja3MKICAgICAgICAgICAncnxiejInICAgICAgb3BlbiBhIGJ6aXAyIGNvbXByZXNzZWQgc3RyZWFtIG9mIHRhciBibG9ja3MKICAgICAgICAgICAnd3wnICAgICAgICAgb3BlbiBhbiB1bmNvbXByZXNzZWQgc3RyZWFtIGZvciB3cml0aW5nCiAgICAgICAgICAgJ3d8Z3onICAgICAgIG9wZW4gYSBnemlwIGNvbXByZXNzZWQgc3RyZWFtIGZvciB3cml0aW5nCiAgICAgICAgICAgJ3d8YnoyJyAgICAgIG9wZW4gYSBiemlwMiBjb21wcmVzc2VkIHN0cmVhbSBmb3Igd3JpdGluZwogICAgICAgICIiIgoKICAgICAgICBpZiBub3QgbmFtZSBhbmQgbm90IGZpbGVvYmo6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5vdGhpbmcgdG8gb3BlbiIpCgogICAgICAgIGlmIG1vZGUgaW4gKCJyIiwgInI6KiIpOgogICAgICAgICAgICAjIEZpbmQgb3V0IHdoaWNoICpvcGVuKCkgaXMgYXBwcm9wcmlhdGUgZm9yIG9wZW5pbmcgdGhlIGZpbGUuCiAgICAgICAgICAgIGZvciBjb21wdHlwZSBpbiBjbHMuT1BFTl9NRVRIOgogICAgICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIoY2xzLCBjbHMuT1BFTl9NRVRIW2NvbXB0eXBlXSkKICAgICAgICAgICAgICAgIGlmIGZpbGVvYmogaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgc2F2ZWRfcG9zID0gZmlsZW9iai50ZWxsKCkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuYyhuYW1lLCAiciIsIGZpbGVvYmosICoqa3dhcmdzKQogICAgICAgICAgICAgICAgZXhjZXB0IChSZWFkRXJyb3IsIENvbXByZXNzaW9uRXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW9iai5zZWVrKHNhdmVkX3BvcykKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoImZpbGUgY291bGQgbm90IGJlIG9wZW5lZCBzdWNjZXNzZnVsbHkiKQoKICAgICAgICBlbGlmICI6IiBpbiBtb2RlOgogICAgICAgICAgICBmaWxlbW9kZSwgY29tcHR5cGUgPSBtb2RlLnNwbGl0KCI6IiwgMSkKICAgICAgICAgICAgZmlsZW1vZGUgPSBmaWxlbW9kZSBvciAiciIKICAgICAgICAgICAgY29tcHR5cGUgPSBjb21wdHlwZSBvciAidGFyIgoKICAgICAgICAgICAgIyBTZWxlY3QgdGhlICpvcGVuKCkgZnVuY3Rpb24gYWNjb3JkaW5nIHRvCiAgICAgICAgICAgICMgZ2l2ZW4gY29tcHJlc3Npb24uCiAgICAgICAgICAgIGlmIGNvbXB0eXBlIGluIGNscy5PUEVOX01FVEg6CiAgICAgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihjbHMsIGNscy5PUEVOX01FVEhbY29tcHR5cGVdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvcigidW5rbm93biBjb21wcmVzc2lvbiB0eXBlICVyIiAlIGNvbXB0eXBlKQogICAgICAgICAgICByZXR1cm4gZnVuYyhuYW1lLCBmaWxlbW9kZSwgZmlsZW9iaiwgKiprd2FyZ3MpCgogICAgICAgIGVsaWYgInwiIGluIG1vZGU6CiAgICAgICAgICAgIGZpbGVtb2RlLCBjb21wdHlwZSA9IG1vZGUuc3BsaXQoInwiLCAxKQogICAgICAgICAgICBmaWxlbW9kZSA9IGZpbGVtb2RlIG9yICJyIgogICAgICAgICAgICBjb21wdHlwZSA9IGNvbXB0eXBlIG9yICJ0YXIiCgogICAgICAgICAgICBpZiBmaWxlbW9kZSBub3QgaW4gInJ3IjoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicgb3IgJ3cnIikKCiAgICAgICAgICAgIHN0cmVhbSA9IF9TdHJlYW0obmFtZSwgZmlsZW1vZGUsIGNvbXB0eXBlLCBmaWxlb2JqLCBidWZzaXplKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0ID0gY2xzKG5hbWUsIGZpbGVtb2RlLCBzdHJlYW0sICoqa3dhcmdzKQogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKQogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgdC5fZXh0ZmlsZW9iaiA9IEZhbHNlCiAgICAgICAgICAgIHJldHVybiB0CgogICAgICAgIGVsaWYgbW9kZSBpbiAiYXciOgogICAgICAgICAgICByZXR1cm4gY2xzLnRhcm9wZW4obmFtZSwgbW9kZSwgZmlsZW9iaiwgKiprd2FyZ3MpCgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVuZGlzY2VybmlibGUgbW9kZSIpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgdGFyb3BlbihjbHMsIG5hbWUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsICoqa3dhcmdzKToKICAgICAgICAiIiJPcGVuIHVuY29tcHJlc3NlZCB0YXIgYXJjaGl2ZSBuYW1lIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicmF3IjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJywgJ2EnIG9yICd3JyIpCiAgICAgICAgcmV0dXJuIGNscyhuYW1lLCBtb2RlLCBmaWxlb2JqLCAqKmt3YXJncykKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnem9wZW4oY2xzLCBuYW1lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lLCBjb21wcmVzc2xldmVsPTksICoqa3dhcmdzKToKICAgICAgICAiIiJPcGVuIGd6aXAgY29tcHJlc3NlZCB0YXIgYXJjaGl2ZSBuYW1lIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCiAgICAgICAgICAgQXBwZW5kaW5nIGlzIG5vdCBhbGxvd2VkLgogICAgICAgICIiIgogICAgICAgIGlmIGxlbihtb2RlKSA+IDEgb3IgbW9kZSBub3QgaW4gInJ3IjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJyBvciAndyciKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGltcG9ydCBnemlwCiAgICAgICAgICAgIGd6aXAuR3ppcEZpbGUKICAgICAgICBleGNlcHQgKEltcG9ydEVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CiAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IoImd6aXAgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUiKQoKICAgICAgICBleHRmaWxlb2JqID0gZmlsZW9iaiBpcyBub3QgTm9uZQogICAgICAgIHRyeToKICAgICAgICAgICAgZmlsZW9iaiA9IGd6aXAuR3ppcEZpbGUobmFtZSwgbW9kZSArICJiIiwgY29tcHJlc3NsZXZlbCwgZmlsZW9iaikKICAgICAgICAgICAgdCA9IGNscy50YXJvcGVuKG5hbWUsIG1vZGUsIGZpbGVvYmosICoqa3dhcmdzKQogICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICBpZiBub3QgZXh0ZmlsZW9iaiBhbmQgZmlsZW9iaiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICBpZiBmaWxlb2JqIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoIm5vdCBhIGd6aXAgZmlsZSIpCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBpZiBub3QgZXh0ZmlsZW9iaiBhbmQgZmlsZW9iaiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICByYWlzZQogICAgICAgIHQuX2V4dGZpbGVvYmogPSBleHRmaWxlb2JqCiAgICAgICAgcmV0dXJuIHQKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBiejJvcGVuKGNscywgbmFtZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgY29tcHJlc3NsZXZlbD05LCAqKmt3YXJncyk6CiAgICAgICAgIiIiT3BlbiBiemlwMiBjb21wcmVzc2VkIHRhciBhcmNoaXZlIG5hbWUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KICAgICAgICAgICBBcHBlbmRpbmcgaXMgbm90IGFsbG93ZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicnciOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InIG9yICd3Jy4iKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGltcG9ydCBiejIKICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IoImJ6MiBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSIpCgogICAgICAgIGlmIGZpbGVvYmogaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZpbGVvYmogPSBfQloyUHJveHkoZmlsZW9iaiwgbW9kZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmaWxlb2JqID0gYnoyLkJaMkZpbGUobmFtZSwgbW9kZSwgY29tcHJlc3NsZXZlbD1jb21wcmVzc2xldmVsKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHQgPSBjbHMudGFyb3BlbihuYW1lLCBtb2RlLCBmaWxlb2JqLCAqKmt3YXJncykKICAgICAgICBleGNlcHQgKElPRXJyb3IsIEVPRkVycm9yKToKICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigibm90IGEgYnppcDIgZmlsZSIpCiAgICAgICAgdC5fZXh0ZmlsZW9iaiA9IEZhbHNlCiAgICAgICAgcmV0dXJuIHQKCiAgICAjIEFsbCAqb3BlbigpIG1ldGhvZHMgYXJlIHJlZ2lzdGVyZWQgaGVyZS4KICAgIE9QRU5fTUVUSCA9IHsKICAgICAgICAidGFyIjogInRhcm9wZW4iLCAgICMgdW5jb21wcmVzc2VkIHRhcgogICAgICAgICJneiI6ICAiZ3pvcGVuIiwgICAgIyBnemlwIGNvbXByZXNzZWQgdGFyCiAgICAgICAgImJ6MiI6ICJiejJvcGVuIiAgICAjIGJ6aXAyIGNvbXByZXNzZWQgdGFyCiAgICB9CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIFRoZSBwdWJsaWMgbWV0aG9kcyB3aGljaCBUYXJGaWxlIHByb3ZpZGVzOgoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAiIiJDbG9zZSB0aGUgVGFyRmlsZS4gSW4gd3JpdGUtbW9kZSwgdHdvIGZpbmlzaGluZyB6ZXJvIGJsb2NrcyBhcmUKICAgICAgICAgICBhcHBlbmRlZCB0byB0aGUgYXJjaGl2ZS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIHNlbGYubW9kZSBpbiAiYXciOgogICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoTlVMICogKEJMT0NLU0laRSAqIDIpKQogICAgICAgICAgICBzZWxmLm9mZnNldCArPSAoQkxPQ0tTSVpFICogMikKICAgICAgICAgICAgIyBmaWxsIHVwIHRoZSBlbmQgd2l0aCB6ZXJvLWJsb2NrcwogICAgICAgICAgICAjIChsaWtlIG9wdGlvbiAtYjIwIGZvciB0YXIgZG9lcykKICAgICAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2Qoc2VsZi5vZmZzZXQsIFJFQ09SRFNJWkUpCiAgICAgICAgICAgIGlmIHJlbWFpbmRlciA+IDA6CiAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoTlVMICogKFJFQ09SRFNJWkUgLSByZW1haW5kZXIpKQoKICAgICAgICBpZiBub3Qgc2VsZi5fZXh0ZmlsZW9iajoKICAgICAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKCiAgICBkZWYgZ2V0bWVtYmVyKHNlbGYsIG5hbWUpOgogICAgICAgICIiIlJldHVybiBhIFRhckluZm8gb2JqZWN0IGZvciBtZW1iZXIgYG5hbWUnLiBJZiBgbmFtZScgY2FuIG5vdCBiZQogICAgICAgICAgIGZvdW5kIGluIHRoZSBhcmNoaXZlLCBLZXlFcnJvciBpcyByYWlzZWQuIElmIGEgbWVtYmVyIG9jY3VycyBtb3JlCiAgICAgICAgICAgdGhhbiBvbmNlIGluIHRoZSBhcmNoaXZlLCBpdHMgbGFzdCBvY2N1cnJlbmNlIGlzIGFzc3VtZWQgdG8gYmUgdGhlCiAgICAgICAgICAgbW9zdCB1cC10by1kYXRlIHZlcnNpb24uCiAgICAgICAgIiIiCiAgICAgICAgdGFyaW5mbyA9IHNlbGYuX2dldG1lbWJlcihuYW1lKQogICAgICAgIGlmIHRhcmluZm8gaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoImZpbGVuYW1lICVyIG5vdCBmb3VuZCIgJSBuYW1lKQogICAgICAgIHJldHVybiB0YXJpbmZvCgogICAgZGVmIGdldG1lbWJlcnMoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlIGFzIGEgbGlzdCBvZiBUYXJJbmZvIG9iamVjdHMuIFRoZQogICAgICAgICAgIGxpc3QgaGFzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBtZW1iZXJzIGluIHRoZSBhcmNoaXZlLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NoZWNrKCkKICAgICAgICBpZiBub3Qgc2VsZi5fbG9hZGVkOiAgICAjIGlmIHdlIHdhbnQgdG8gb2J0YWluIGEgbGlzdCBvZgogICAgICAgICAgICBzZWxmLl9sb2FkKCkgICAgICAgICMgYWxsIG1lbWJlcnMsIHdlIGZpcnN0IGhhdmUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNjYW4gdGhlIHdob2xlIGFyY2hpdmUuCiAgICAgICAgcmV0dXJuIHNlbGYubWVtYmVycwoKICAgIGRlZiBnZXRuYW1lcyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUgYXMgYSBsaXN0IG9mIHRoZWlyIG5hbWVzLiBJdCBoYXMKICAgICAgICAgICB0aGUgc2FtZSBvcmRlciBhcyB0aGUgbGlzdCByZXR1cm5lZCBieSBnZXRtZW1iZXJzKCkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFt0YXJpbmZvLm5hbWUgZm9yIHRhcmluZm8gaW4gc2VsZi5nZXRtZW1iZXJzKCldCgogICAgZGVmIGdldHRhcmluZm8oc2VsZiwgbmFtZT1Ob25lLCBhcmNuYW1lPU5vbmUsIGZpbGVvYmo9Tm9uZSk6CiAgICAgICAgIiIiQ3JlYXRlIGEgVGFySW5mbyBvYmplY3QgZm9yIGVpdGhlciB0aGUgZmlsZSBgbmFtZScgb3IgdGhlIGZpbGUKICAgICAgICAgICBvYmplY3QgYGZpbGVvYmonICh1c2luZyBvcy5mc3RhdCBvbiBpdHMgZmlsZSBkZXNjcmlwdG9yKS4gWW91IGNhbgogICAgICAgICAgIG1vZGlmeSBzb21lIG9mIHRoZSBUYXJJbmZvJ3MgYXR0cmlidXRlcyBiZWZvcmUgeW91IGFkZCBpdCB1c2luZwogICAgICAgICAgIGFkZGZpbGUoKS4gSWYgZ2l2ZW4sIGBhcmNuYW1lJyBzcGVjaWZpZXMgYW4gYWx0ZXJuYXRpdmUgbmFtZSBmb3IgdGhlCiAgICAgICAgICAgZmlsZSBpbiB0aGUgYXJjaGl2ZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jaGVjaygiYXciKQoKICAgICAgICAjIFdoZW4gZmlsZW9iaiBpcyBnaXZlbiwgcmVwbGFjZSBuYW1lIGJ5CiAgICAgICAgIyBmaWxlb2JqJ3MgcmVhbCBuYW1lLgogICAgICAgIGlmIGZpbGVvYmogaXMgbm90IE5vbmU6CiAgICAgICAgICAgIG5hbWUgPSBmaWxlb2JqLm5hbWUKCiAgICAgICAgIyBCdWlsZGluZyB0aGUgbmFtZSBvZiB0aGUgbWVtYmVyIGluIHRoZSBhcmNoaXZlLgogICAgICAgICMgQmFja3dhcmQgc2xhc2hlcyBhcmUgY29udmVydGVkIHRvIGZvcndhcmQgc2xhc2hlcywKICAgICAgICAjIEFic29sdXRlIHBhdGhzIGFyZSB0dXJuZWQgdG8gcmVsYXRpdmUgcGF0aHMuCiAgICAgICAgaWYgYXJjbmFtZSBpcyBOb25lOgogICAgICAgICAgICBhcmNuYW1lID0gbmFtZQogICAgICAgIGRydiwgYXJjbmFtZSA9IG9zLnBhdGguc3BsaXRkcml2ZShhcmNuYW1lKQogICAgICAgIGFyY25hbWUgPSBhcmNuYW1lLnJlcGxhY2Uob3Muc2VwLCAiLyIpCiAgICAgICAgYXJjbmFtZSA9IGFyY25hbWUubHN0cmlwKCIvIikKCiAgICAgICAgIyBOb3csIGZpbGwgdGhlIFRhckluZm8gb2JqZWN0IHdpdGgKICAgICAgICAjIGluZm9ybWF0aW9uIHNwZWNpZmljIGZvciB0aGUgZmlsZS4KICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJpbmZvKCkKICAgICAgICB0YXJpbmZvLnRhcmZpbGUgPSBzZWxmCgogICAgICAgICMgVXNlIG9zLnN0YXQgb3Igb3MubHN0YXQsIGRlcGVuZGluZyBvbiBwbGF0Zm9ybQogICAgICAgICMgYW5kIGlmIHN5bWxpbmtzIHNoYWxsIGJlIHJlc29sdmVkLgogICAgICAgIGlmIGZpbGVvYmogaXMgTm9uZToKICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgImxzdGF0IikgYW5kIG5vdCBzZWxmLmRlcmVmZXJlbmNlOgogICAgICAgICAgICAgICAgc3RhdHJlcyA9IG9zLmxzdGF0KG5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzdGF0cmVzID0gb3Muc3RhdChuYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN0YXRyZXMgPSBvcy5mc3RhdChmaWxlb2JqLmZpbGVubygpKQogICAgICAgIGxpbmtuYW1lID0gIiIKCiAgICAgICAgc3RtZCA9IHN0YXRyZXMuc3RfbW9kZQogICAgICAgIGlmIHN0YXQuU19JU1JFRyhzdG1kKToKICAgICAgICAgICAgaW5vZGUgPSAoc3RhdHJlcy5zdF9pbm8sIHN0YXRyZXMuc3RfZGV2KQogICAgICAgICAgICBpZiBub3Qgc2VsZi5kZXJlZmVyZW5jZSBhbmQgc3RhdHJlcy5zdF9ubGluayA+IDEgYW5kIFwKICAgICAgICAgICAgICAgICAgICBpbm9kZSBpbiBzZWxmLmlub2RlcyBhbmQgYXJjbmFtZSAhPSBzZWxmLmlub2Rlc1tpbm9kZV06CiAgICAgICAgICAgICAgICAjIElzIGl0IGEgaGFyZGxpbmsgdG8gYW4gYWxyZWFkeQogICAgICAgICAgICAgICAgIyBhcmNoaXZlZCBmaWxlPwogICAgICAgICAgICAgICAgdHlwZSA9IExOS1RZUEUKICAgICAgICAgICAgICAgIGxpbmtuYW1lID0gc2VsZi5pbm9kZXNbaW5vZGVdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIFRoZSBpbm9kZSBpcyBhZGRlZCBvbmx5IGlmIGl0cyB2YWxpZC4KICAgICAgICAgICAgICAgICMgRm9yIHdpbjMyIGl0IGlzIGFsd2F5cyAwLgogICAgICAgICAgICAgICAgdHlwZSA9IFJFR1RZUEUKICAgICAgICAgICAgICAgIGlmIGlub2RlWzBdOgogICAgICAgICAgICAgICAgICAgIHNlbGYuaW5vZGVzW2lub2RlXSA9IGFyY25hbWUKICAgICAgICBlbGlmIHN0YXQuU19JU0RJUihzdG1kKToKICAgICAgICAgICAgdHlwZSA9IERJUlRZUEUKICAgICAgICBlbGlmIHN0YXQuU19JU0ZJRk8oc3RtZCk6CiAgICAgICAgICAgIHR5cGUgPSBGSUZPVFlQRQogICAgICAgIGVsaWYgc3RhdC5TX0lTTE5LKHN0bWQpOgogICAgICAgICAgICB0eXBlID0gU1lNVFlQRQogICAgICAgICAgICBsaW5rbmFtZSA9IG9zLnJlYWRsaW5rKG5hbWUpCiAgICAgICAgZWxpZiBzdGF0LlNfSVNDSFIoc3RtZCk6CiAgICAgICAgICAgIHR5cGUgPSBDSFJUWVBFCiAgICAgICAgZWxpZiBzdGF0LlNfSVNCTEsoc3RtZCk6CiAgICAgICAgICAgIHR5cGUgPSBCTEtUWVBFCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgIyBGaWxsIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoIGFsbAogICAgICAgICMgaW5mb3JtYXRpb24gd2UgY2FuIGdldC4KICAgICAgICB0YXJpbmZvLm5hbWUgPSBhcmNuYW1lCiAgICAgICAgdGFyaW5mby5tb2RlID0gc3RtZAogICAgICAgIHRhcmluZm8udWlkID0gc3RhdHJlcy5zdF91aWQKICAgICAgICB0YXJpbmZvLmdpZCA9IHN0YXRyZXMuc3RfZ2lkCiAgICAgICAgaWYgdHlwZSA9PSBSRUdUWVBFOgogICAgICAgICAgICB0YXJpbmZvLnNpemUgPSBzdGF0cmVzLnN0X3NpemUKICAgICAgICBlbHNlOgogICAgICAgICAgICB0YXJpbmZvLnNpemUgPSAwCiAgICAgICAgdGFyaW5mby5tdGltZSA9IHN0YXRyZXMuc3RfbXRpbWUKICAgICAgICB0YXJpbmZvLnR5cGUgPSB0eXBlCiAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9IGxpbmtuYW1lCiAgICAgICAgaWYgcHdkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0YXJpbmZvLnVuYW1lID0gcHdkLmdldHB3dWlkKHRhcmluZm8udWlkKVswXQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgaWYgZ3JwOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0YXJpbmZvLmduYW1lID0gZ3JwLmdldGdyZ2lkKHRhcmluZm8uZ2lkKVswXQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgIGlmIHR5cGUgaW4gKENIUlRZUEUsIEJMS1RZUEUpOgogICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAibWFqb3IiKSBhbmQgaGFzYXR0cihvcywgIm1pbm9yIik6CiAgICAgICAgICAgICAgICB0YXJpbmZvLmRldm1ham9yID0gb3MubWFqb3Ioc3RhdHJlcy5zdF9yZGV2KQogICAgICAgICAgICAgICAgdGFyaW5mby5kZXZtaW5vciA9IG9zLm1pbm9yKHN0YXRyZXMuc3RfcmRldikKICAgICAgICByZXR1cm4gdGFyaW5mbwoKICAgIGRlZiBsaXN0KHNlbGYsIHZlcmJvc2U9VHJ1ZSk6CiAgICAgICAgIiIiUHJpbnQgYSB0YWJsZSBvZiBjb250ZW50cyB0byBzeXMuc3Rkb3V0LiBJZiBgdmVyYm9zZScgaXMgRmFsc2UsIG9ubHkKICAgICAgICAgICB0aGUgbmFtZXMgb2YgdGhlIG1lbWJlcnMgYXJlIHByaW50ZWQuIElmIGl0IGlzIFRydWUsIGFuIGBscyAtbCctbGlrZQogICAgICAgICAgIG91dHB1dCBpcyBwcm9kdWNlZC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jaGVjaygpCgogICAgICAgIGZvciB0YXJpbmZvIGluIHNlbGY6CiAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICBwcmludChmaWxlbW9kZSh0YXJpbmZvLm1vZGUpLCBlbmQ9JyAnKQogICAgICAgICAgICAgICAgcHJpbnQoIiVzLyVzIiAlICh0YXJpbmZvLnVuYW1lIG9yIHRhcmluZm8udWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLmduYW1lIG9yIHRhcmluZm8uZ2lkKSwgZW5kPScgJykKICAgICAgICAgICAgICAgIGlmIHRhcmluZm8uaXNjaHIoKSBvciB0YXJpbmZvLmlzYmxrKCk6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoIiUxMHMiICUgKCIlZCwlZCIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlICh0YXJpbmZvLmRldm1ham9yLCB0YXJpbmZvLmRldm1pbm9yKSksIGVuZD0nICcpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHByaW50KCIlMTBkIiAlIHRhcmluZm8uc2l6ZSwgZW5kPScgJykKICAgICAgICAgICAgICAgIHByaW50KCIlZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQiIFwKICAgICAgICAgICAgICAgICAgICAgICUgdGltZS5sb2NhbHRpbWUodGFyaW5mby5tdGltZSlbOjZdLCBlbmQ9JyAnKQoKICAgICAgICAgICAgcHJpbnQodGFyaW5mby5uYW1lICsgKCIvIiBpZiB0YXJpbmZvLmlzZGlyKCkgZWxzZSAiIiksIGVuZD0nICcpCgogICAgICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgICAgaWYgdGFyaW5mby5pc3N5bSgpOgogICAgICAgICAgICAgICAgICAgIHByaW50KCItPiIsIHRhcmluZm8ubGlua25hbWUsIGVuZD0nICcpCiAgICAgICAgICAgICAgICBpZiB0YXJpbmZvLmlzbG5rKCk6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoImxpbmsgdG8iLCB0YXJpbmZvLmxpbmtuYW1lLCBlbmQ9JyAnKQogICAgICAgICAgICBwcmludCgpCgogICAgZGVmIGFkZChzZWxmLCBuYW1lLCBhcmNuYW1lPU5vbmUsIHJlY3Vyc2l2ZT1UcnVlLCBleGNsdWRlPU5vbmUsIGZpbHRlcj1Ob25lKToKICAgICAgICAiIiJBZGQgdGhlIGZpbGUgYG5hbWUnIHRvIHRoZSBhcmNoaXZlLiBgbmFtZScgbWF5IGJlIGFueSB0eXBlIG9mIGZpbGUKICAgICAgICAgICAoZGlyZWN0b3J5LCBmaWZvLCBzeW1ib2xpYyBsaW5rLCBldGMuKS4gSWYgZ2l2ZW4sIGBhcmNuYW1lJwogICAgICAgICAgIHNwZWNpZmllcyBhbiBhbHRlcm5hdGl2ZSBuYW1lIGZvciB0aGUgZmlsZSBpbiB0aGUgYXJjaGl2ZS4KICAgICAgICAgICBEaXJlY3RvcmllcyBhcmUgYWRkZWQgcmVjdXJzaXZlbHkgYnkgZGVmYXVsdC4gVGhpcyBjYW4gYmUgYXZvaWRlZCBieQogICAgICAgICAgIHNldHRpbmcgYHJlY3Vyc2l2ZScgdG8gRmFsc2UuIGBleGNsdWRlJyBpcyBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkCiAgICAgICAgICAgcmV0dXJuIFRydWUgZm9yIGVhY2ggZmlsZW5hbWUgdG8gYmUgZXhjbHVkZWQuIGBmaWx0ZXInIGlzIGEgZnVuY3Rpb24KICAgICAgICAgICB0aGF0IGV4cGVjdHMgYSBUYXJJbmZvIG9iamVjdCBhcmd1bWVudCBhbmQgcmV0dXJucyB0aGUgY2hhbmdlZAogICAgICAgICAgIFRhckluZm8gb2JqZWN0LCBpZiBpdCByZXR1cm5zIE5vbmUgdGhlIFRhckluZm8gb2JqZWN0IHdpbGwgYmUKICAgICAgICAgICBleGNsdWRlZCBmcm9tIHRoZSBhcmNoaXZlLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NoZWNrKCJhdyIpCgogICAgICAgIGlmIGFyY25hbWUgaXMgTm9uZToKICAgICAgICAgICAgYXJjbmFtZSA9IG5hbWUKCiAgICAgICAgIyBFeGNsdWRlIHBhdGhuYW1lcy4KICAgICAgICBpZiBleGNsdWRlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKICAgICAgICAgICAgd2FybmluZ3Mud2FybigidXNlIHRoZSBmaWx0ZXIgYXJndW1lbnQgaW5zdGVhZCIsCiAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQogICAgICAgICAgICBpZiBleGNsdWRlKG5hbWUpOgogICAgICAgICAgICAgICAgc2VsZi5fZGJnKDIsICJ0YXJmaWxlOiBFeGNsdWRlZCAlciIgJSBuYW1lKQogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgU2tpcCBpZiBzb21lYm9keSB0cmllcyB0byBhcmNoaXZlIHRoZSBhcmNoaXZlLi4uCiAgICAgICAgaWYgc2VsZi5uYW1lIGlzIG5vdCBOb25lIGFuZCBvcy5wYXRoLmFic3BhdGgobmFtZSkgPT0gc2VsZi5uYW1lOgogICAgICAgICAgICBzZWxmLl9kYmcoMiwgInRhcmZpbGU6IFNraXBwZWQgJXIiICUgbmFtZSkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuX2RiZygxLCBuYW1lKQoKICAgICAgICAjIENyZWF0ZSBhIFRhckluZm8gb2JqZWN0IGZyb20gdGhlIGZpbGUuCiAgICAgICAgdGFyaW5mbyA9IHNlbGYuZ2V0dGFyaW5mbyhuYW1lLCBhcmNuYW1lKQoKICAgICAgICBpZiB0YXJpbmZvIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogVW5zdXBwb3J0ZWQgdHlwZSAlciIgJSBuYW1lKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBDaGFuZ2Ugb3IgZXhjbHVkZSB0aGUgVGFySW5mbyBvYmplY3QuCiAgICAgICAgaWYgZmlsdGVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICB0YXJpbmZvID0gZmlsdGVyKHRhcmluZm8pCiAgICAgICAgICAgIGlmIHRhcmluZm8gaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2RiZygyLCAidGFyZmlsZTogRXhjbHVkZWQgJXIiICUgbmFtZSkKICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIEFwcGVuZCB0aGUgdGFyIGhlYWRlciBhbmQgZGF0YSB0byB0aGUgYXJjaGl2ZS4KICAgICAgICBpZiB0YXJpbmZvLmlzcmVnKCk6CiAgICAgICAgICAgIGYgPSBibHRuX29wZW4obmFtZSwgInJiIikKICAgICAgICAgICAgc2VsZi5hZGRmaWxlKHRhcmluZm8sIGYpCiAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgICAgICBlbGlmIHRhcmluZm8uaXNkaXIoKToKICAgICAgICAgICAgc2VsZi5hZGRmaWxlKHRhcmluZm8pCiAgICAgICAgICAgIGlmIHJlY3Vyc2l2ZToKICAgICAgICAgICAgICAgIGZvciBmIGluIG9zLmxpc3RkaXIobmFtZSk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGQob3MucGF0aC5qb2luKG5hbWUsIGYpLCBvcy5wYXRoLmpvaW4oYXJjbmFtZSwgZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNpdmUsIGV4Y2x1ZGUsIGZpbHRlcj1maWx0ZXIpCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuYWRkZmlsZSh0YXJpbmZvKQoKICAgIGRlZiBhZGRmaWxlKHNlbGYsIHRhcmluZm8sIGZpbGVvYmo9Tm9uZSk6CiAgICAgICAgIiIiQWRkIHRoZSBUYXJJbmZvIG9iamVjdCBgdGFyaW5mbycgdG8gdGhlIGFyY2hpdmUuIElmIGBmaWxlb2JqJyBpcwogICAgICAgICAgIGdpdmVuLCB0YXJpbmZvLnNpemUgYnl0ZXMgYXJlIHJlYWQgZnJvbSBpdCBhbmQgYWRkZWQgdG8gdGhlIGFyY2hpdmUuCiAgICAgICAgICAgWW91IGNhbiBjcmVhdGUgVGFySW5mbyBvYmplY3RzIHVzaW5nIGdldHRhcmluZm8oKS4KICAgICAgICAgICBPbiBXaW5kb3dzIHBsYXRmb3JtcywgYGZpbGVvYmonIHNob3VsZCBhbHdheXMgYmUgb3BlbmVkIHdpdGggbW9kZQogICAgICAgICAgICdyYicgdG8gYXZvaWQgaXJyaXRhdGlvbiBhYm91dCB0aGUgZmlsZSBzaXplLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NoZWNrKCJhdyIpCgogICAgICAgIHRhcmluZm8gPSBjb3B5LmNvcHkodGFyaW5mbykKCiAgICAgICAgYnVmID0gdGFyaW5mby50b2J1ZihzZWxmLmZvcm1hdCwgc2VsZi5lbmNvZGluZywgc2VsZi5lcnJvcnMpCiAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKGJ1ZikKICAgICAgICBzZWxmLm9mZnNldCArPSBsZW4oYnVmKQoKICAgICAgICAjIElmIHRoZXJlJ3MgZGF0YSB0byBmb2xsb3csIGFwcGVuZCBpdC4KICAgICAgICBpZiBmaWxlb2JqIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjb3B5ZmlsZW9iaihmaWxlb2JqLCBzZWxmLmZpbGVvYmosIHRhcmluZm8uc2l6ZSkKICAgICAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2QodGFyaW5mby5zaXplLCBCTE9DS1NJWkUpCiAgICAgICAgICAgIGlmIHJlbWFpbmRlciA+IDA6CiAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoTlVMICogKEJMT0NLU0laRSAtIHJlbWFpbmRlcikpCiAgICAgICAgICAgICAgICBibG9ja3MgKz0gMQogICAgICAgICAgICBzZWxmLm9mZnNldCArPSBibG9ja3MgKiBCTE9DS1NJWkUKCiAgICAgICAgc2VsZi5tZW1iZXJzLmFwcGVuZCh0YXJpbmZvKQoKICAgIGRlZiBleHRyYWN0YWxsKHNlbGYsIHBhdGg9Ii4iLCBtZW1iZXJzPU5vbmUpOgogICAgICAgICIiIkV4dHJhY3QgYWxsIG1lbWJlcnMgZnJvbSB0aGUgYXJjaGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nCiAgICAgICAgICAgZGlyZWN0b3J5IGFuZCBzZXQgb3duZXIsIG1vZGlmaWNhdGlvbiB0aW1lIGFuZCBwZXJtaXNzaW9ucyBvbgogICAgICAgICAgIGRpcmVjdG9yaWVzIGFmdGVyd2FyZHMuIGBwYXRoJyBzcGVjaWZpZXMgYSBkaWZmZXJlbnQgZGlyZWN0b3J5CiAgICAgICAgICAgdG8gZXh0cmFjdCB0by4gYG1lbWJlcnMnIGlzIG9wdGlvbmFsIGFuZCBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZQogICAgICAgICAgIGxpc3QgcmV0dXJuZWQgYnkgZ2V0bWVtYmVycygpLgogICAgICAgICIiIgogICAgICAgIGRpcmVjdG9yaWVzID0gW10KCiAgICAgICAgaWYgbWVtYmVycyBpcyBOb25lOgogICAgICAgICAgICBtZW1iZXJzID0gc2VsZgoKICAgICAgICBmb3IgdGFyaW5mbyBpbiBtZW1iZXJzOgogICAgICAgICAgICBpZiB0YXJpbmZvLmlzZGlyKCk6CiAgICAgICAgICAgICAgICAjIEV4dHJhY3QgZGlyZWN0b3JpZXMgd2l0aCBhIHNhZmUgbW9kZS4KICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzLmFwcGVuZCh0YXJpbmZvKQogICAgICAgICAgICAgICAgdGFyaW5mbyA9IGNvcHkuY29weSh0YXJpbmZvKQogICAgICAgICAgICAgICAgdGFyaW5mby5tb2RlID0gMG83MDAKICAgICAgICAgICAgIyBEbyBub3Qgc2V0X2F0dHJzIGRpcmVjdG9yaWVzLCBhcyB3ZSB3aWxsIGRvIHRoYXQgZnVydGhlciBkb3duCiAgICAgICAgICAgIHNlbGYuZXh0cmFjdCh0YXJpbmZvLCBwYXRoLCBzZXRfYXR0cnM9bm90IHRhcmluZm8uaXNkaXIoKSkKCiAgICAgICAgIyBSZXZlcnNlIHNvcnQgZGlyZWN0b3JpZXMuCiAgICAgICAgZGlyZWN0b3JpZXMuc29ydChrZXk9bGFtYmRhIGE6IGEubmFtZSkKICAgICAgICBkaXJlY3Rvcmllcy5yZXZlcnNlKCkKCiAgICAgICAgIyBTZXQgY29ycmVjdCBvd25lciwgbXRpbWUgYW5kIGZpbGVtb2RlIG9uIGRpcmVjdG9yaWVzLgogICAgICAgIGZvciB0YXJpbmZvIGluIGRpcmVjdG9yaWVzOgogICAgICAgICAgICBkaXJwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHRhcmluZm8ubmFtZSkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5jaG93bih0YXJpbmZvLCBkaXJwYXRoKQogICAgICAgICAgICAgICAgc2VsZi51dGltZSh0YXJpbmZvLCBkaXJwYXRoKQogICAgICAgICAgICAgICAgc2VsZi5jaG1vZCh0YXJpbmZvLCBkaXJwYXRoKQogICAgICAgICAgICBleGNlcHQgRXh0cmFjdEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmVycm9ybGV2ZWwgPiAxOgogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogJXMiICUgZSkKCiAgICBkZWYgZXh0cmFjdChzZWxmLCBtZW1iZXIsIHBhdGg9IiIsIHNldF9hdHRycz1UcnVlKToKICAgICAgICAiIiJFeHRyYWN0IGEgbWVtYmVyIGZyb20gdGhlIGFyY2hpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksCiAgICAgICAgICAgdXNpbmcgaXRzIGZ1bGwgbmFtZS4gSXRzIGZpbGUgaW5mb3JtYXRpb24gaXMgZXh0cmFjdGVkIGFzIGFjY3VyYXRlbHkKICAgICAgICAgICBhcyBwb3NzaWJsZS4gYG1lbWJlcicgbWF5IGJlIGEgZmlsZW5hbWUgb3IgYSBUYXJJbmZvIG9iamVjdC4gWW91IGNhbgogICAgICAgICAgIHNwZWNpZnkgYSBkaWZmZXJlbnQgZGlyZWN0b3J5IHVzaW5nIGBwYXRoJy4gRmlsZSBhdHRyaWJ1dGVzIChvd25lciwKICAgICAgICAgICBtdGltZSwgbW9kZSkgYXJlIHNldCB1bmxlc3MgYHNldF9hdHRycycgaXMgRmFsc2UuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fY2hlY2soInIiKQoKICAgICAgICBpZiBpc2luc3RhbmNlKG1lbWJlciwgc3RyKToKICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYuZ2V0bWVtYmVyKG1lbWJlcikKICAgICAgICBlbHNlOgogICAgICAgICAgICB0YXJpbmZvID0gbWVtYmVyCgogICAgICAgICMgUHJlcGFyZSB0aGUgbGluayB0YXJnZXQgZm9yIG1ha2VsaW5rKCkuCiAgICAgICAgaWYgdGFyaW5mby5pc2xuaygpOgogICAgICAgICAgICB0YXJpbmZvLl9saW5rX3RhcmdldCA9IG9zLnBhdGguam9pbihwYXRoLCB0YXJpbmZvLmxpbmtuYW1lKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX2V4dHJhY3RfbWVtYmVyKHRhcmluZm8sIG9zLnBhdGguam9pbihwYXRoLCB0YXJpbmZvLm5hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfYXR0cnM9c2V0X2F0dHJzKQogICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmIHNlbGYuZXJyb3JsZXZlbCA+IDA6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgZS5maWxlbmFtZSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogJXMiICUgZS5zdHJlcnJvcikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDEsICJ0YXJmaWxlOiAlcyAlciIgJSAoZS5zdHJlcnJvciwgZS5maWxlbmFtZSkpCiAgICAgICAgZXhjZXB0IEV4dHJhY3RFcnJvciBhcyBlOgogICAgICAgICAgICBpZiBzZWxmLmVycm9ybGV2ZWwgPiAxOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogJXMiICUgZSkKCiAgICBkZWYgZXh0cmFjdGZpbGUoc2VsZiwgbWVtYmVyKToKICAgICAgICAiIiJFeHRyYWN0IGEgbWVtYmVyIGZyb20gdGhlIGFyY2hpdmUgYXMgYSBmaWxlIG9iamVjdC4gYG1lbWJlcicgbWF5IGJlCiAgICAgICAgICAgYSBmaWxlbmFtZSBvciBhIFRhckluZm8gb2JqZWN0LiBJZiBgbWVtYmVyJyBpcyBhIHJlZ3VsYXIgZmlsZSwgYQogICAgICAgICAgIGZpbGUtbGlrZSBvYmplY3QgaXMgcmV0dXJuZWQuIElmIGBtZW1iZXInIGlzIGEgbGluaywgYSBmaWxlLWxpa2UKICAgICAgICAgICBvYmplY3QgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgbGluaydzIHRhcmdldC4gSWYgYG1lbWJlcicgaXMgbm9uZSBvZgogICAgICAgICAgIHRoZSBhYm92ZSwgTm9uZSBpcyByZXR1cm5lZC4KICAgICAgICAgICBUaGUgZmlsZS1saWtlIG9iamVjdCBpcyByZWFkLW9ubHkgYW5kIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcKICAgICAgICAgICBtZXRob2RzOiByZWFkKCksIHJlYWRsaW5lKCksIHJlYWRsaW5lcygpLCBzZWVrKCkgYW5kIHRlbGwoKQogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NoZWNrKCJyIikKCiAgICAgICAgaWYgaXNpbnN0YW5jZShtZW1iZXIsIHN0cik6CiAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLmdldG1lbWJlcihtZW1iZXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdGFyaW5mbyA9IG1lbWJlcgoKICAgICAgICBpZiB0YXJpbmZvLmlzcmVnKCk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbGVvYmplY3Qoc2VsZiwgdGFyaW5mbykKCiAgICAgICAgZWxpZiB0YXJpbmZvLnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKICAgICAgICAgICAgIyBJZiBhIG1lbWJlcidzIHR5cGUgaXMgdW5rbm93biwgaXQgaXMgdHJlYXRlZCBhcyBhCiAgICAgICAgICAgICMgcmVndWxhciBmaWxlLgogICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlb2JqZWN0KHNlbGYsIHRhcmluZm8pCgogICAgICAgIGVsaWYgdGFyaW5mby5pc2xuaygpIG9yIHRhcmluZm8uaXNzeW0oKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmZpbGVvYmosIF9TdHJlYW0pOgogICAgICAgICAgICAgICAgIyBBIHNtYWxsIGJ1dCB1Z2x5IHdvcmthcm91bmQgZm9yIHRoZSBjYXNlIHRoYXQgc29tZW9uZSB0cmllcwogICAgICAgICAgICAgICAgIyB0byBleHRyYWN0IGEgKHN5bSlsaW5rIGFzIGEgZmlsZS1vYmplY3QgZnJvbSBhIG5vbi1zZWVrYWJsZQogICAgICAgICAgICAgICAgIyBzdHJlYW0gb2YgdGFyIGJsb2Nrcy4KICAgICAgICAgICAgICAgIHJhaXNlIFN0cmVhbUVycm9yKCJjYW5ub3QgZXh0cmFjdCAoc3ltKWxpbmsgYXMgZmlsZSBvYmplY3QiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBBIChzeW0pbGluaydzIGZpbGUgb2JqZWN0IGlzIGl0cyB0YXJnZXQncyBmaWxlIG9iamVjdC4KICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmV4dHJhY3RmaWxlKHNlbGYuX2ZpbmRfbGlua190YXJnZXQodGFyaW5mbykpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBJZiB0aGVyZSdzIG5vIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZW1iZXIgKGRpcmVjdG9yeSwgY2hyZGV2LAogICAgICAgICAgICAjIGJsa2RldiwgZXRjLiksIHJldHVybiBOb25lIGluc3RlYWQgb2YgYSBmaWxlIG9iamVjdC4KICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgX2V4dHJhY3RfbWVtYmVyKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgsIHNldF9hdHRycz1UcnVlKToKICAgICAgICAiIiJFeHRyYWN0IHRoZSBUYXJJbmZvIG9iamVjdCB0YXJpbmZvIHRvIGEgcGh5c2ljYWwKICAgICAgICAgICBmaWxlIGNhbGxlZCB0YXJnZXRwYXRoLgogICAgICAgICIiIgogICAgICAgICMgRmV0Y2ggdGhlIFRhckluZm8gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gbmFtZQogICAgICAgICMgYW5kIGJ1aWxkIHRoZSBkZXN0aW5hdGlvbiBwYXRobmFtZSwgcmVwbGFjaW5nCiAgICAgICAgIyBmb3J3YXJkIHNsYXNoZXMgdG8gcGxhdGZvcm0gc3BlY2lmaWMgc2VwYXJhdG9ycy4KICAgICAgICB0YXJnZXRwYXRoID0gdGFyZ2V0cGF0aC5yc3RyaXAoIi8iKQogICAgICAgIHRhcmdldHBhdGggPSB0YXJnZXRwYXRoLnJlcGxhY2UoIi8iLCBvcy5zZXApCgogICAgICAgICMgQ3JlYXRlIGFsbCB1cHBlciBkaXJlY3Rvcmllcy4KICAgICAgICB1cHBlcmRpcnMgPSBvcy5wYXRoLmRpcm5hbWUodGFyZ2V0cGF0aCkKICAgICAgICBpZiB1cHBlcmRpcnMgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyh1cHBlcmRpcnMpOgogICAgICAgICAgICAjIENyZWF0ZSBkaXJlY3RvcmllcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgYXJjaGl2ZSB3aXRoCiAgICAgICAgICAgICMgZGVmYXVsdCBwZXJtaXNzaW9ucy4KICAgICAgICAgICAgb3MubWFrZWRpcnModXBwZXJkaXJzKQoKICAgICAgICBpZiB0YXJpbmZvLmlzbG5rKCkgb3IgdGFyaW5mby5pc3N5bSgpOgogICAgICAgICAgICBzZWxmLl9kYmcoMSwgIiVzIC0+ICVzIiAlICh0YXJpbmZvLm5hbWUsIHRhcmluZm8ubGlua25hbWUpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX2RiZygxLCB0YXJpbmZvLm5hbWUpCgogICAgICAgIGlmIHRhcmluZm8uaXNyZWcoKToKICAgICAgICAgICAgc2VsZi5tYWtlZmlsZSh0YXJpbmZvLCB0YXJnZXRwYXRoKQogICAgICAgIGVsaWYgdGFyaW5mby5pc2RpcigpOgogICAgICAgICAgICBzZWxmLm1ha2VkaXIodGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICBlbGlmIHRhcmluZm8uaXNmaWZvKCk6CiAgICAgICAgICAgIHNlbGYubWFrZWZpZm8odGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICBlbGlmIHRhcmluZm8uaXNjaHIoKSBvciB0YXJpbmZvLmlzYmxrKCk6CiAgICAgICAgICAgIHNlbGYubWFrZWRldih0YXJpbmZvLCB0YXJnZXRwYXRoKQogICAgICAgIGVsaWYgdGFyaW5mby5pc2xuaygpIG9yIHRhcmluZm8uaXNzeW0oKToKICAgICAgICAgICAgc2VsZi5tYWtlbGluayh0YXJpbmZvLCB0YXJnZXRwYXRoKQogICAgICAgIGVsaWYgdGFyaW5mby50eXBlIG5vdCBpbiBTVVBQT1JURURfVFlQRVM6CiAgICAgICAgICAgIHNlbGYubWFrZXVua25vd24odGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1ha2VmaWxlKHRhcmluZm8sIHRhcmdldHBhdGgpCgogICAgICAgIGlmIHNldF9hdHRyczoKICAgICAgICAgICAgc2VsZi5jaG93bih0YXJpbmZvLCB0YXJnZXRwYXRoKQogICAgICAgICAgICBpZiBub3QgdGFyaW5mby5pc3N5bSgpOgogICAgICAgICAgICAgICAgc2VsZi5jaG1vZCh0YXJpbmZvLCB0YXJnZXRwYXRoKQogICAgICAgICAgICAgICAgc2VsZi51dGltZSh0YXJpbmZvLCB0YXJnZXRwYXRoKQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBCZWxvdyBhcmUgdGhlIGRpZmZlcmVudCBmaWxlIG1ldGhvZHMuIFRoZXkgYXJlIGNhbGxlZCB2aWEKICAgICMgX2V4dHJhY3RfbWVtYmVyKCkgd2hlbiBleHRyYWN0KCkgaXMgY2FsbGVkLiBUaGV5IGNhbiBiZSByZXBsYWNlZCBpbiBhCiAgICAjIHN1YmNsYXNzIHRvIGltcGxlbWVudCBvdGhlciBmdW5jdGlvbmFsaXR5LgoKICAgIGRlZiBtYWtlZGlyKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIk1ha2UgYSBkaXJlY3RvcnkgY2FsbGVkIHRhcmdldHBhdGguCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFVzZSBhIHNhZmUgbW9kZSBmb3IgdGhlIGRpcmVjdG9yeSwgdGhlIHJlYWwgbW9kZSBpcyBzZXQKICAgICAgICAgICAgIyBsYXRlciBpbiBfZXh0cmFjdF9tZW1iZXIoKS4KICAgICAgICAgICAgb3MubWtkaXIodGFyZ2V0cGF0aCwgMG83MDApCiAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IgYXMgZToKICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FRVhJU1Q6CiAgICAgICAgICAgICAgICByYWlzZQoKICAgIGRlZiBtYWtlZmlsZShzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAiIiJNYWtlIGEgZmlsZSBjYWxsZWQgdGFyZ2V0cGF0aC4KICAgICAgICAiIiIKICAgICAgICBzb3VyY2UgPSBzZWxmLmZpbGVvYmoKICAgICAgICBzb3VyY2Uuc2Vlayh0YXJpbmZvLm9mZnNldF9kYXRhKQogICAgICAgIHRhcmdldCA9IGJsdG5fb3Blbih0YXJnZXRwYXRoLCAid2IiKQogICAgICAgIGlmIHRhcmluZm8uc3BhcnNlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmb3Igb2Zmc2V0LCBzaXplIGluIHRhcmluZm8uc3BhcnNlOgogICAgICAgICAgICAgICAgdGFyZ2V0LnNlZWsob2Zmc2V0KQogICAgICAgICAgICAgICAgY29weWZpbGVvYmooc291cmNlLCB0YXJnZXQsIHNpemUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29weWZpbGVvYmooc291cmNlLCB0YXJnZXQsIHRhcmluZm8uc2l6ZSkKICAgICAgICB0YXJnZXQuc2Vlayh0YXJpbmZvLnNpemUpCiAgICAgICAgdGFyZ2V0LnRydW5jYXRlKCkKICAgICAgICB0YXJnZXQuY2xvc2UoKQoKICAgIGRlZiBtYWtldW5rbm93bihzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAiIiJNYWtlIGEgZmlsZSBmcm9tIGEgVGFySW5mbyBvYmplY3Qgd2l0aCBhbiB1bmtub3duIHR5cGUKICAgICAgICAgICBhdCB0YXJnZXRwYXRoLgogICAgICAgICIiIgogICAgICAgIHNlbGYubWFrZWZpbGUodGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6IFVua25vd24gZmlsZSB0eXBlICVyLCAiIFwKICAgICAgICAgICAgICAgICAgICAgImV4dHJhY3RlZCBhcyByZWd1bGFyIGZpbGUuIiAlIHRhcmluZm8udHlwZSkKCiAgICBkZWYgbWFrZWZpZm8oc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgIiIiTWFrZSBhIGZpZm8gY2FsbGVkIHRhcmdldHBhdGguCiAgICAgICAgIiIiCiAgICAgICAgaWYgaGFzYXR0cihvcywgIm1rZmlmbyIpOgogICAgICAgICAgICBvcy5ta2ZpZm8odGFyZ2V0cGF0aCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IoImZpZm8gbm90IHN1cHBvcnRlZCBieSBzeXN0ZW0iKQoKICAgIGRlZiBtYWtlZGV2KHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIk1ha2UgYSBjaGFyYWN0ZXIgb3IgYmxvY2sgZGV2aWNlIGNhbGxlZCB0YXJnZXRwYXRoLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAibWtub2QiKSBvciBub3QgaGFzYXR0cihvcywgIm1ha2VkZXYiKToKICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yKCJzcGVjaWFsIGRldmljZXMgbm90IHN1cHBvcnRlZCBieSBzeXN0ZW0iKQoKICAgICAgICBtb2RlID0gdGFyaW5mby5tb2RlCiAgICAgICAgaWYgdGFyaW5mby5pc2JsaygpOgogICAgICAgICAgICBtb2RlIHw9IHN0YXQuU19JRkJMSwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1vZGUgfD0gc3RhdC5TX0lGQ0hSCgogICAgICAgIG9zLm1rbm9kKHRhcmdldHBhdGgsIG1vZGUsCiAgICAgICAgICAgICAgICAgb3MubWFrZWRldih0YXJpbmZvLmRldm1ham9yLCB0YXJpbmZvLmRldm1pbm9yKSkKCiAgICBkZWYgbWFrZWxpbmsoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgIiIiTWFrZSBhIChzeW1ib2xpYykgbGluayBjYWxsZWQgdGFyZ2V0cGF0aC4gSWYgaXQgY2Fubm90IGJlIGNyZWF0ZWQKICAgICAgICAgIChwbGF0Zm9ybSBsaW1pdGF0aW9uKSwgd2UgdHJ5IHRvIG1ha2UgYSBjb3B5IG9mIHRoZSByZWZlcmVuY2VkIGZpbGUKICAgICAgICAgIGluc3RlYWQgb2YgYSBsaW5rLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBGb3Igc3lzdGVtcyB0aGF0IHN1cHBvcnQgc3ltYm9saWMgYW5kIGhhcmQgbGlua3MuCiAgICAgICAgICAgIGlmIHRhcmluZm8uaXNzeW0oKToKICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsodGFyaW5mby5saW5rbmFtZSwgdGFyZ2V0cGF0aCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgU2VlIGV4dHJhY3QoKS4KICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRhcmluZm8uX2xpbmtfdGFyZ2V0KToKICAgICAgICAgICAgICAgICAgICBvcy5saW5rKHRhcmluZm8uX2xpbmtfdGFyZ2V0LCB0YXJnZXRwYXRoKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9leHRyYWN0X21lbWJlcihzZWxmLl9maW5kX2xpbmtfdGFyZ2V0KHRhcmluZm8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHBhdGgpCiAgICAgICAgZXhjZXB0IHN5bWxpbmtfZXhjZXB0aW9uOgogICAgICAgICAgICBpZiB0YXJpbmZvLmlzc3ltKCk6CiAgICAgICAgICAgICAgICBsaW5rcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUodGFyaW5mby5uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmluZm8ubGlua25hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsaW5rcGF0aCA9IHRhcmluZm8ubGlua25hbWUKICAgICAgICBlbHNlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLl9leHRyYWN0X21lbWJlcihzZWxmLl9maW5kX2xpbmtfdGFyZ2V0KHRhcmluZm8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cGF0aCkKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yKCJ1bmFibGUgdG8gcmVzb2x2ZSBsaW5rIGluc2lkZSBhcmNoaXZlIikKCiAgICBkZWYgY2hvd24oc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgIiIiU2V0IG93bmVyIG9mIHRhcmdldHBhdGggYWNjb3JkaW5nIHRvIHRhcmluZm8uCiAgICAgICAgIiIiCiAgICAgICAgaWYgcHdkIGFuZCBoYXNhdHRyKG9zLCAiZ2V0ZXVpZCIpIGFuZCBvcy5nZXRldWlkKCkgPT0gMDoKICAgICAgICAgICAgIyBXZSBoYXZlIHRvIGJlIHJvb3QgdG8gZG8gc28uCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGcgPSBncnAuZ2V0Z3JuYW0odGFyaW5mby5nbmFtZSlbMl0KICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgZyA9IHRhcmluZm8uZ2lkCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHUgPSBwd2QuZ2V0cHduYW0odGFyaW5mby51bmFtZSlbMl0KICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgdSA9IHRhcmluZm8udWlkCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlmIHRhcmluZm8uaXNzeW0oKSBhbmQgaGFzYXR0cihvcywgImxjaG93biIpOgogICAgICAgICAgICAgICAgICAgIG9zLmxjaG93bih0YXJnZXRwYXRoLCB1LCBnKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gIm9zMmVteCI6CiAgICAgICAgICAgICAgICAgICAgICAgIG9zLmNob3duKHRhcmdldHBhdGgsIHUsIGcpCiAgICAgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IoImNvdWxkIG5vdCBjaGFuZ2Ugb3duZXIiKQoKICAgIGRlZiBjaG1vZChzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAiIiJTZXQgZmlsZSBwZXJtaXNzaW9ucyBvZiB0YXJnZXRwYXRoIGFjY29yZGluZyB0byB0YXJpbmZvLgogICAgICAgICIiIgogICAgICAgIGlmIGhhc2F0dHIob3MsICdjaG1vZCcpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvcy5jaG1vZCh0YXJnZXRwYXRoLCB0YXJpbmZvLm1vZGUpCiAgICAgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IoImNvdWxkIG5vdCBjaGFuZ2UgbW9kZSIpCgogICAgZGVmIHV0aW1lKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIlNldCBtb2RpZmljYXRpb24gdGltZSBvZiB0YXJnZXRwYXRoIGFjY29yZGluZyB0byB0YXJpbmZvLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAndXRpbWUnKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcy51dGltZSh0YXJnZXRwYXRoLCAodGFyaW5mby5tdGltZSwgdGFyaW5mby5tdGltZSkpCiAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IgYXMgZToKICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yKCJjb3VsZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiB0aW1lIikKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGRlZiBuZXh0KHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgbmV4dCBtZW1iZXIgb2YgdGhlIGFyY2hpdmUgYXMgYSBUYXJJbmZvIG9iamVjdCwgd2hlbgogICAgICAgICAgIFRhckZpbGUgaXMgb3BlbmVkIGZvciByZWFkaW5nLiBSZXR1cm4gTm9uZSBpZiB0aGVyZSBpcyBubyBtb3JlCiAgICAgICAgICAgYXZhaWxhYmxlLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NoZWNrKCJyYSIpCiAgICAgICAgaWYgc2VsZi5maXJzdG1lbWJlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgbSA9IHNlbGYuZmlyc3RtZW1iZXIKICAgICAgICAgICAgc2VsZi5maXJzdG1lbWJlciA9IE5vbmUKICAgICAgICAgICAgcmV0dXJuIG0KCiAgICAgICAgIyBSZWFkIHRoZSBuZXh0IGJsb2NrLgogICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYub2Zmc2V0KQogICAgICAgIHRhcmluZm8gPSBOb25lCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyaW5mby5mcm9tdGFyZmlsZShzZWxmKQogICAgICAgICAgICBleGNlcHQgRU9GSGVhZGVyRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIGlmIHNlbGYuaWdub3JlX3plcm9zOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygyLCAiMHglWDogJXMiICUgKHNlbGYub2Zmc2V0LCBlKSkKICAgICAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBCTE9DS1NJWkUKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBleGNlcHQgSW52YWxpZEhlYWRlckVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmlnbm9yZV96ZXJvczoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgIjB4JVg6ICVzIiAlIChzZWxmLm9mZnNldCwgZSkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5vZmZzZXQgPT0gMDoKICAgICAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3Ioc3RyKGUpKQogICAgICAgICAgICBleGNlcHQgRW1wdHlIZWFkZXJFcnJvcjoKICAgICAgICAgICAgICAgIGlmIHNlbGYub2Zmc2V0ID09IDA6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJlbXB0eSBmaWxlIikKICAgICAgICAgICAgZXhjZXB0IFRydW5jYXRlZEhlYWRlckVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICBpZiBzZWxmLm9mZnNldCA9PSAwOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcihzdHIoZSkpCiAgICAgICAgICAgIGV4Y2VwdCBTdWJzZXF1ZW50SGVhZGVyRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcihzdHIoZSkpCiAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGlmIHRhcmluZm8gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYubWVtYmVycy5hcHBlbmQodGFyaW5mbykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9sb2FkZWQgPSBUcnVlCgogICAgICAgIHJldHVybiB0YXJpbmZvCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIExpdHRsZSBoZWxwZXIgbWV0aG9kczoKCiAgICBkZWYgX2dldG1lbWJlcihzZWxmLCBuYW1lLCB0YXJpbmZvPU5vbmUsIG5vcm1hbGl6ZT1GYWxzZSk6CiAgICAgICAgIiIiRmluZCBhbiBhcmNoaXZlIG1lbWJlciBieSBuYW1lIGZyb20gYm90dG9tIHRvIHRvcC4KICAgICAgICAgICBJZiB0YXJpbmZvIGlzIGdpdmVuLCBpdCBpcyB1c2VkIGFzIHRoZSBzdGFydGluZyBwb2ludC4KICAgICAgICAiIiIKICAgICAgICAjIEVuc3VyZSB0aGF0IGFsbCBtZW1iZXJzIGhhdmUgYmVlbiBsb2FkZWQuCiAgICAgICAgbWVtYmVycyA9IHNlbGYuZ2V0bWVtYmVycygpCgogICAgICAgICMgTGltaXQgdGhlIG1lbWJlciBzZWFyY2ggbGlzdCB1cCB0byB0YXJpbmZvLgogICAgICAgIGlmIHRhcmluZm8gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIG1lbWJlcnMgPSBtZW1iZXJzWzptZW1iZXJzLmluZGV4KHRhcmluZm8pXQoKICAgICAgICBpZiBub3JtYWxpemU6CiAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLm5vcm1wYXRoKG5hbWUpCgogICAgICAgIGZvciBtZW1iZXIgaW4gcmV2ZXJzZWQobWVtYmVycyk6CiAgICAgICAgICAgIGlmIG5vcm1hbGl6ZToKICAgICAgICAgICAgICAgIG1lbWJlcl9uYW1lID0gb3MucGF0aC5ub3JtcGF0aChtZW1iZXIubmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG1lbWJlcl9uYW1lID0gbWVtYmVyLm5hbWUKCiAgICAgICAgICAgIGlmIG5hbWUgPT0gbWVtYmVyX25hbWU6CiAgICAgICAgICAgICAgICByZXR1cm4gbWVtYmVyCgogICAgZGVmIF9sb2FkKHNlbGYpOgogICAgICAgICIiIlJlYWQgdGhyb3VnaCB0aGUgZW50aXJlIGFyY2hpdmUgZmlsZSBhbmQgbG9vayBmb3IgcmVhZGFibGUKICAgICAgICAgICBtZW1iZXJzLgogICAgICAgICIiIgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLm5leHQoKQogICAgICAgICAgICBpZiB0YXJpbmZvIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHNlbGYuX2xvYWRlZCA9IFRydWUKCiAgICBkZWYgX2NoZWNrKHNlbGYsIG1vZGU9Tm9uZSk6CiAgICAgICAgIiIiQ2hlY2sgaWYgVGFyRmlsZSBpcyBzdGlsbCBvcGVuLCBhbmQgaWYgdGhlIG9wZXJhdGlvbidzIG1vZGUKICAgICAgICAgICBjb3JyZXNwb25kcyB0byBUYXJGaWxlJ3MgbW9kZS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiJXMgaXMgY2xvc2VkIiAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fKQogICAgICAgIGlmIG1vZGUgaXMgbm90IE5vbmUgYW5kIHNlbGYubW9kZSBub3QgaW4gbW9kZToKICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiYmFkIG9wZXJhdGlvbiBmb3IgbW9kZSAlciIgJSBzZWxmLm1vZGUpCgogICAgZGVmIF9maW5kX2xpbmtfdGFyZ2V0KHNlbGYsIHRhcmluZm8pOgogICAgICAgICIiIkZpbmQgdGhlIHRhcmdldCBtZW1iZXIgb2YgYSBzeW1saW5rIG9yIGhhcmRsaW5rIG1lbWJlciBpbiB0aGUKICAgICAgICAgICBhcmNoaXZlLgogICAgICAgICIiIgogICAgICAgIGlmIHRhcmluZm8uaXNzeW0oKToKICAgICAgICAgICAgIyBBbHdheXMgc2VhcmNoIHRoZSBlbnRpcmUgYXJjaGl2ZS4KICAgICAgICAgICAgbGlua25hbWUgPSBvcy5wYXRoLmRpcm5hbWUodGFyaW5mby5uYW1lKSArICIvIiArIHRhcmluZm8ubGlua25hbWUKICAgICAgICAgICAgbGltaXQgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBTZWFyY2ggdGhlIGFyY2hpdmUgYmVmb3JlIHRoZSBsaW5rLCBiZWNhdXNlIGEgaGFyZCBsaW5rIGlzCiAgICAgICAgICAgICMganVzdCBhIHJlZmVyZW5jZSB0byBhbiBhbHJlYWR5IGFyY2hpdmVkIGZpbGUuCiAgICAgICAgICAgIGxpbmtuYW1lID0gdGFyaW5mby5saW5rbmFtZQogICAgICAgICAgICBsaW1pdCA9IHRhcmluZm8KCiAgICAgICAgbWVtYmVyID0gc2VsZi5fZ2V0bWVtYmVyKGxpbmtuYW1lLCB0YXJpbmZvPWxpbWl0LCBub3JtYWxpemU9VHJ1ZSkKICAgICAgICBpZiBtZW1iZXIgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoImxpbmtuYW1lICVyIG5vdCBmb3VuZCIgJSBsaW5rbmFtZSkKICAgICAgICByZXR1cm4gbWVtYmVyCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIlByb3ZpZGUgYW4gaXRlcmF0b3Igb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuX2xvYWRlZDoKICAgICAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5tZW1iZXJzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBUYXJJdGVyKHNlbGYpCgogICAgZGVmIF9kYmcoc2VsZiwgbGV2ZWwsIG1zZyk6CiAgICAgICAgIiIiV3JpdGUgZGVidWdnaW5nIG91dHB1dCB0byBzeXMuc3RkZXJyLgogICAgICAgICIiIgogICAgICAgIGlmIGxldmVsIDw9IHNlbGYuZGVidWc6CiAgICAgICAgICAgIHByaW50KG1zZywgZmlsZT1zeXMuc3RkZXJyKQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgc2VsZi5fY2hlY2soKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsIHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOgogICAgICAgIGlmIHR5cGUgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBBbiBleGNlcHRpb24gb2NjdXJyZWQuIFdlIG11c3Qgbm90IGNhbGwgY2xvc2UoKSBiZWNhdXNlCiAgICAgICAgICAgICMgaXQgd291bGQgdHJ5IHRvIHdyaXRlIGVuZC1vZi1hcmNoaXZlIGJsb2NrcyBhbmQgcGFkZGluZy4KICAgICAgICAgICAgaWYgbm90IHNlbGYuX2V4dGZpbGVvYmo6CiAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKIyBjbGFzcyBUYXJGaWxlCgpjbGFzcyBUYXJJdGVyKG9iamVjdCk6CiAgICAiIiJJdGVyYXRvciBDbGFzcy4KCiAgICAgICBmb3IgdGFyaW5mbyBpbiBUYXJGaWxlKC4uLik6CiAgICAgICAgICAgc3VpdGUuLi4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJmaWxlKToKICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUYXJJdGVyIG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnRhcmZpbGUgPSB0YXJmaWxlCiAgICAgICAgc2VsZi5pbmRleCA9IDAKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gaXRlcmF0b3Igb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fbmV4dF9fKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgbmV4dCBpdGVtIHVzaW5nIFRhckZpbGUncyBuZXh0KCkgbWV0aG9kLgogICAgICAgICAgIFdoZW4gYWxsIG1lbWJlcnMgaGF2ZSBiZWVuIHJlYWQsIHNldCBUYXJGaWxlIGFzIF9sb2FkZWQuCiAgICAgICAgIiIiCiAgICAgICAgIyBGaXggZm9yIFNGICMxMTAwNDI5OiBVbmRlciByYXJlIGNpcmN1bXN0YW5jZXMgaXQgY2FuCiAgICAgICAgIyBoYXBwZW4gdGhhdCBnZXRtZW1iZXJzKCkgaXMgY2FsbGVkIGR1cmluZyBpdGVyYXRpb24sCiAgICAgICAgIyB3aGljaCB3aWxsIGNhdXNlIFRhckl0ZXIgdG8gc3RvcCBwcmVtYXR1cmVseS4KICAgICAgICBpZiBub3Qgc2VsZi50YXJmaWxlLl9sb2FkZWQ6CiAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmZpbGUubmV4dCgpCiAgICAgICAgICAgIGlmIG5vdCB0YXJpbmZvOgogICAgICAgICAgICAgICAgc2VsZi50YXJmaWxlLl9sb2FkZWQgPSBUcnVlCiAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyZmlsZS5tZW1iZXJzW3NlbGYuaW5kZXhdCiAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgogICAgICAgIHNlbGYuaW5kZXggKz0gMQogICAgICAgIHJldHVybiB0YXJpbmZvCgogICAgbmV4dCA9IF9fbmV4dF9fICMgZm9yIFB5dGhvbiAyLngKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLQojIGV4cG9ydGVkIGZ1bmN0aW9ucwojLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGVmIGlzX3RhcmZpbGUobmFtZSk6CiAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBuYW1lIHBvaW50cyB0byBhIHRhciBhcmNoaXZlIHRoYXQgd2UKICAgICAgIGFyZSBhYmxlIHRvIGhhbmRsZSwgZWxzZSByZXR1cm4gRmFsc2UuCiAgICAiIiIKICAgIHRyeToKICAgICAgICB0ID0gb3BlbihuYW1lKQogICAgICAgIHQuY2xvc2UoKQogICAgICAgIHJldHVybiBUcnVlCiAgICBleGNlcHQgVGFyRXJyb3I6CiAgICAgICAgcmV0dXJuIEZhbHNlCgpibHRuX29wZW4gPSBvcGVuCm9wZW4gPSBUYXJGaWxlLm9wZW4KUEsDBBQAAAAAAAAAIQBfCXNgYZ8AAGGfAAAtAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvY29tcGF0LnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMy0yMDE2IFZpbmF5IFNhamlwLgojIExpY2Vuc2VkIHRvIHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciBhIGNvbnRyaWJ1dG9yIGFncmVlbWVudC4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHN5cwoKdHJ5OgogICAgaW1wb3J0IHNzbApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBzc2wgPSBOb25lCgppZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KICAgIHN0cmluZ190eXBlcyA9IGJhc2VzdHJpbmcsCiAgICB0ZXh0X3R5cGUgPSB1bmljb2RlCiAgICBmcm9tIHR5cGVzIGltcG9ydCBGaWxlVHlwZSBhcyBmaWxlX3R5cGUKICAgIGltcG9ydCBfX2J1aWx0aW5fXyBhcyBidWlsdGlucwogICAgaW1wb3J0IENvbmZpZ1BhcnNlciBhcyBjb25maWdwYXJzZXIKICAgIGZyb20gLl9iYWNrcG9ydCBpbXBvcnQgc2h1dGlsCiAgICBmcm9tIHVybHBhcnNlIGltcG9ydCB1cmxwYXJzZSwgdXJsdW5wYXJzZSwgdXJsam9pbiwgdXJsc3BsaXQsIHVybHVuc3BsaXQKICAgIGZyb20gdXJsbGliIGltcG9ydCAodXJscmV0cmlldmUsIHF1b3RlIGFzIF9xdW90ZSwgdW5xdW90ZSwgdXJsMnBhdGhuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZTJ1cmwsIENvbnRlbnRUb29TaG9ydEVycm9yLCBzcGxpdHR5cGUpCgogICAgZGVmIHF1b3RlKHMpOgogICAgICAgIGlmIGlzaW5zdGFuY2UocywgdW5pY29kZSk6CiAgICAgICAgICAgIHMgPSBzLmVuY29kZSgndXRmLTgnKQogICAgICAgIHJldHVybiBfcXVvdGUocykKCiAgICBpbXBvcnQgdXJsbGliMgogICAgZnJvbSB1cmxsaWIyIGltcG9ydCAoUmVxdWVzdCwgdXJsb3BlbiwgVVJMRXJyb3IsIEhUVFBFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNpY0F1dGhIYW5kbGVyLCBIVFRQUGFzc3dvcmRNZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQSGFuZGxlciwgSFRUUFJlZGlyZWN0SGFuZGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkX29wZW5lcikKICAgIGlmIHNzbDoKICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IEhUVFBTSGFuZGxlcgogICAgaW1wb3J0IGh0dHBsaWIKICAgIGltcG9ydCB4bWxycGNsaWIKICAgIGltcG9ydCBRdWV1ZSBhcyBxdWV1ZQogICAgZnJvbSBIVE1MUGFyc2VyIGltcG9ydCBIVE1MUGFyc2VyCiAgICBpbXBvcnQgaHRtbGVudGl0eWRlZnMKICAgIHJhd19pbnB1dCA9IHJhd19pbnB1dAogICAgZnJvbSBpdGVydG9vbHMgaW1wb3J0IGlmaWx0ZXIgYXMgZmlsdGVyCiAgICBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaWZpbHRlcmZhbHNlIGFzIGZpbHRlcmZhbHNlCgogICAgX3VzZXJwcm9nID0gTm9uZQogICAgZGVmIHNwbGl0dXNlcihob3N0KToKICAgICAgICAiIiJzcGxpdHVzZXIoJ3VzZXJbOnBhc3N3ZF1AaG9zdFs6cG9ydF0nKSAtLT4gJ3VzZXJbOnBhc3N3ZF0nLCAnaG9zdFs6cG9ydF0nLiIiIgogICAgICAgIGdsb2JhbCBfdXNlcnByb2cKICAgICAgICBpZiBfdXNlcnByb2cgaXMgTm9uZToKICAgICAgICAgICAgaW1wb3J0IHJlCiAgICAgICAgICAgIF91c2VycHJvZyA9IHJlLmNvbXBpbGUoJ14oLiopQCguKikkJykKCiAgICAgICAgbWF0Y2ggPSBfdXNlcnByb2cubWF0Y2goaG9zdCkKICAgICAgICBpZiBtYXRjaDogcmV0dXJuIG1hdGNoLmdyb3VwKDEsIDIpCiAgICAgICAgcmV0dXJuIE5vbmUsIGhvc3QKCmVsc2U6ICAjIHByYWdtYTogbm8gY292ZXIKICAgIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCiAgICBzdHJpbmdfdHlwZXMgPSBzdHIsCiAgICB0ZXh0X3R5cGUgPSBzdHIKICAgIGZyb20gaW8gaW1wb3J0IFRleHRJT1dyYXBwZXIgYXMgZmlsZV90eXBlCiAgICBpbXBvcnQgYnVpbHRpbnMKICAgIGltcG9ydCBjb25maWdwYXJzZXIKICAgIGltcG9ydCBzaHV0aWwKICAgIGZyb20gdXJsbGliLnBhcnNlIGltcG9ydCAodXJscGFyc2UsIHVybHVucGFyc2UsIHVybGpvaW4sIHNwbGl0dXNlciwgcXVvdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucXVvdGUsIHVybHNwbGl0LCB1cmx1bnNwbGl0LCBzcGxpdHR5cGUpCiAgICBmcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCAodXJsb3BlbiwgdXJscmV0cmlldmUsIFJlcXVlc3QsIHVybDJwYXRobmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZTJ1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2ljQXV0aEhhbmRsZXIsIEhUVFBQYXNzd29yZE1nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQSGFuZGxlciwgSFRUUFJlZGlyZWN0SGFuZGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZF9vcGVuZXIpCiAgICBpZiBzc2w6CiAgICAgICAgZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgSFRUUFNIYW5kbGVyCiAgICBmcm9tIHVybGxpYi5lcnJvciBpbXBvcnQgSFRUUEVycm9yLCBVUkxFcnJvciwgQ29udGVudFRvb1Nob3J0RXJyb3IKICAgIGltcG9ydCBodHRwLmNsaWVudCBhcyBodHRwbGliCiAgICBpbXBvcnQgdXJsbGliLnJlcXVlc3QgYXMgdXJsbGliMgogICAgaW1wb3J0IHhtbHJwYy5jbGllbnQgYXMgeG1scnBjbGliCiAgICBpbXBvcnQgcXVldWUKICAgIGZyb20gaHRtbC5wYXJzZXIgaW1wb3J0IEhUTUxQYXJzZXIKICAgIGltcG9ydCBodG1sLmVudGl0aWVzIGFzIGh0bWxlbnRpdHlkZWZzCiAgICByYXdfaW5wdXQgPSBpbnB1dAogICAgZnJvbSBpdGVydG9vbHMgaW1wb3J0IGZpbHRlcmZhbHNlCiAgICBmaWx0ZXIgPSBmaWx0ZXIKCnRyeToKICAgIGZyb20gc3NsIGltcG9ydCBtYXRjaF9ob3N0bmFtZSwgQ2VydGlmaWNhdGVFcnJvcgpleGNlcHQgSW1wb3J0RXJyb3I6ICMgcHJhZ21hOiBubyBjb3ZlcgogICAgY2xhc3MgQ2VydGlmaWNhdGVFcnJvcihWYWx1ZUVycm9yKToKICAgICAgICBwYXNzCgoKICAgIGRlZiBfZG5zbmFtZV9tYXRjaChkbiwgaG9zdG5hbWUsIG1heF93aWxkY2FyZHM9MSk6CiAgICAgICAgIiIiTWF0Y2hpbmcgYWNjb3JkaW5nIHRvIFJGQyA2MTI1LCBzZWN0aW9uIDYuNC4zCgogICAgICAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYxMjUjc2VjdGlvbi02LjQuMwogICAgICAgICIiIgogICAgICAgIHBhdHMgPSBbXQogICAgICAgIGlmIG5vdCBkbjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHBhcnRzID0gZG4uc3BsaXQoJy4nKQogICAgICAgIGxlZnRtb3N0LCByZW1haW5kZXIgPSBwYXJ0c1swXSwgcGFydHNbMTpdCgogICAgICAgIHdpbGRjYXJkcyA9IGxlZnRtb3N0LmNvdW50KCcqJykKICAgICAgICBpZiB3aWxkY2FyZHMgPiBtYXhfd2lsZGNhcmRzOgogICAgICAgICAgICAjIElzc3VlICMxNzk4MDogYXZvaWQgZGVuaWFscyBvZiBzZXJ2aWNlIGJ5IHJlZnVzaW5nIG1vcmUKICAgICAgICAgICAgIyB0aGFuIG9uZSB3aWxkY2FyZCBwZXIgZnJhZ21lbnQuICBBIHN1cnZleSBvZiBlc3RhYmxpc2hlZAogICAgICAgICAgICAjIHBvbGljeSBhbW9uZyBTU0wgaW1wbGVtZW50YXRpb25zIHNob3dlZCBpdCB0byBiZSBhCiAgICAgICAgICAgICMgcmVhc29uYWJsZSBjaG9pY2UuCiAgICAgICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoCiAgICAgICAgICAgICAgICAidG9vIG1hbnkgd2lsZGNhcmRzIGluIGNlcnRpZmljYXRlIEROUyBuYW1lOiAiICsgcmVwcihkbikpCgogICAgICAgICMgc3BlZWQgdXAgY29tbW9uIGNhc2Ugdy9vIHdpbGRjYXJkcwogICAgICAgIGlmIG5vdCB3aWxkY2FyZHM6CiAgICAgICAgICAgIHJldHVybiBkbi5sb3dlcigpID09IGhvc3RuYW1lLmxvd2VyKCkKCiAgICAgICAgIyBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMywgc3ViaXRlbSAxLgogICAgICAgICMgVGhlIGNsaWVudCBTSE9VTEQgTk9UIGF0dGVtcHQgdG8gbWF0Y2ggYSBwcmVzZW50ZWQgaWRlbnRpZmllciBpbiB3aGljaAogICAgICAgICMgdGhlIHdpbGRjYXJkIGNoYXJhY3RlciBjb21wcmlzZXMgYSBsYWJlbCBvdGhlciB0aGFuIHRoZSBsZWZ0LW1vc3QgbGFiZWwuCiAgICAgICAgaWYgbGVmdG1vc3QgPT0gJyonOgogICAgICAgICAgICAjIFdoZW4gJyonIGlzIGEgZnJhZ21lbnQgYnkgaXRzZWxmLCBpdCBtYXRjaGVzIGEgbm9uLWVtcHR5IGRvdGxlc3MKICAgICAgICAgICAgIyBmcmFnbWVudC4KICAgICAgICAgICAgcGF0cy5hcHBlbmQoJ1teLl0rJykKICAgICAgICBlbGlmIGxlZnRtb3N0LnN0YXJ0c3dpdGgoJ3huLS0nKSBvciBob3N0bmFtZS5zdGFydHN3aXRoKCd4bi0tJyk6CiAgICAgICAgICAgICMgUkZDIDYxMjUsIHNlY3Rpb24gNi40LjMsIHN1Yml0ZW0gMy4KICAgICAgICAgICAgIyBUaGUgY2xpZW50IFNIT1VMRCBOT1QgYXR0ZW1wdCB0byBtYXRjaCBhIHByZXNlbnRlZCBpZGVudGlmaWVyCiAgICAgICAgICAgICMgd2hlcmUgdGhlIHdpbGRjYXJkIGNoYXJhY3RlciBpcyBlbWJlZGRlZCB3aXRoaW4gYW4gQS1sYWJlbCBvcgogICAgICAgICAgICAjIFUtbGFiZWwgb2YgYW4gaW50ZXJuYXRpb25hbGl6ZWQgZG9tYWluIG5hbWUuCiAgICAgICAgICAgIHBhdHMuYXBwZW5kKHJlLmVzY2FwZShsZWZ0bW9zdCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBPdGhlcndpc2UsICcqJyBtYXRjaGVzIGFueSBkb3RsZXNzIHN0cmluZywgZS5nLiB3d3cqCiAgICAgICAgICAgIHBhdHMuYXBwZW5kKHJlLmVzY2FwZShsZWZ0bW9zdCkucmVwbGFjZShyJ1wqJywgJ1teLl0qJykpCgogICAgICAgICMgYWRkIHRoZSByZW1haW5pbmcgZnJhZ21lbnRzLCBpZ25vcmUgYW55IHdpbGRjYXJkcwogICAgICAgIGZvciBmcmFnIGluIHJlbWFpbmRlcjoKICAgICAgICAgICAgcGF0cy5hcHBlbmQocmUuZXNjYXBlKGZyYWcpKQoKICAgICAgICBwYXQgPSByZS5jb21waWxlKHInXEEnICsgcidcLicuam9pbihwYXRzKSArIHInXFonLCByZS5JR05PUkVDQVNFKQogICAgICAgIHJldHVybiBwYXQubWF0Y2goaG9zdG5hbWUpCgoKICAgIGRlZiBtYXRjaF9ob3N0bmFtZShjZXJ0LCBob3N0bmFtZSk6CiAgICAgICAgIiIiVmVyaWZ5IHRoYXQgKmNlcnQqIChpbiBkZWNvZGVkIGZvcm1hdCBhcyByZXR1cm5lZCBieQogICAgICAgIFNTTFNvY2tldC5nZXRwZWVyY2VydCgpKSBtYXRjaGVzIHRoZSAqaG9zdG5hbWUqLiAgUkZDIDI4MTggYW5kIFJGQyA2MTI1CiAgICAgICAgcnVsZXMgYXJlIGZvbGxvd2VkLCBidXQgSVAgYWRkcmVzc2VzIGFyZSBub3QgYWNjZXB0ZWQgZm9yICpob3N0bmFtZSouCgogICAgICAgIENlcnRpZmljYXRlRXJyb3IgaXMgcmFpc2VkIG9uIGZhaWx1cmUuIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbgogICAgICAgIHJldHVybnMgbm90aGluZy4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgY2VydDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZW1wdHkgb3Igbm8gY2VydGlmaWNhdGUsIG1hdGNoX2hvc3RuYW1lIG5lZWRzIGEgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTU0wgc29ja2V0IG9yIFNTTCBjb250ZXh0IHdpdGggZWl0aGVyICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0VSVF9PUFRJT05BTCBvciBDRVJUX1JFUVVJUkVEIikKICAgICAgICBkbnNuYW1lcyA9IFtdCiAgICAgICAgc2FuID0gY2VydC5nZXQoJ3N1YmplY3RBbHROYW1lJywgKCkpCiAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2FuOgogICAgICAgICAgICBpZiBrZXkgPT0gJ0ROUyc6CiAgICAgICAgICAgICAgICBpZiBfZG5zbmFtZV9tYXRjaCh2YWx1ZSwgaG9zdG5hbWUpOgogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgZG5zbmFtZXMuYXBwZW5kKHZhbHVlKQogICAgICAgIGlmIG5vdCBkbnNuYW1lczoKICAgICAgICAgICAgIyBUaGUgc3ViamVjdCBpcyBvbmx5IGNoZWNrZWQgd2hlbiB0aGVyZSBpcyBubyBkTlNOYW1lIGVudHJ5CiAgICAgICAgICAgICMgaW4gc3ViamVjdEFsdE5hbWUKICAgICAgICAgICAgZm9yIHN1YiBpbiBjZXJ0LmdldCgnc3ViamVjdCcsICgpKToKICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHN1YjoKICAgICAgICAgICAgICAgICAgICAjIFhYWCBhY2NvcmRpbmcgdG8gUkZDIDI4MTgsIHRoZSBtb3N0IHNwZWNpZmljIENvbW1vbiBOYW1lCiAgICAgICAgICAgICAgICAgICAgIyBtdXN0IGJlIHVzZWQuCiAgICAgICAgICAgICAgICAgICAgaWYga2V5ID09ICdjb21tb25OYW1lJzoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgX2Ruc25hbWVfbWF0Y2godmFsdWUsIGhvc3RuYW1lKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgICAgICAgICBkbnNuYW1lcy5hcHBlbmQodmFsdWUpCiAgICAgICAgaWYgbGVuKGRuc25hbWVzKSA+IDE6CiAgICAgICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoImhvc3RuYW1lICVyICIKICAgICAgICAgICAgICAgICJkb2Vzbid0IG1hdGNoIGVpdGhlciBvZiAlcyIKICAgICAgICAgICAgICAgICUgKGhvc3RuYW1lLCAnLCAnLmpvaW4obWFwKHJlcHIsIGRuc25hbWVzKSkpKQogICAgICAgIGVsaWYgbGVuKGRuc25hbWVzKSA9PSAxOgogICAgICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKCJob3N0bmFtZSAlciAiCiAgICAgICAgICAgICAgICAiZG9lc24ndCBtYXRjaCAlciIKICAgICAgICAgICAgICAgICUgKGhvc3RuYW1lLCBkbnNuYW1lc1swXSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigibm8gYXBwcm9wcmlhdGUgY29tbW9uTmFtZSBvciAiCiAgICAgICAgICAgICAgICAic3ViamVjdEFsdE5hbWUgZmllbGRzIHdlcmUgZm91bmQiKQoKCnRyeToKICAgIGZyb20gdHlwZXMgaW1wb3J0IFNpbXBsZU5hbWVzcGFjZSBhcyBDb250YWluZXIKZXhjZXB0IEltcG9ydEVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBjbGFzcyBDb250YWluZXIob2JqZWN0KToKICAgICAgICAiIiIKICAgICAgICBBIGdlbmVyaWMgY29udGFpbmVyIGZvciB3aGVuIG11bHRpcGxlIHZhbHVlcyBuZWVkIHRvIGJlIHJldHVybmVkCiAgICAgICAgIiIiCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3dhcmdzKToKICAgICAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUoa3dhcmdzKQoKCnRyeToKICAgIGZyb20gc2h1dGlsIGltcG9ydCB3aGljaApleGNlcHQgSW1wb3J0RXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICMgSW1wbGVtZW50YXRpb24gZnJvbSBQeXRob24gMy4zCiAgICBkZWYgd2hpY2goY21kLCBtb2RlPW9zLkZfT0sgfCBvcy5YX09LLCBwYXRoPU5vbmUpOgogICAgICAgICIiIkdpdmVuIGEgY29tbWFuZCwgbW9kZSwgYW5kIGEgUEFUSCBzdHJpbmcsIHJldHVybiB0aGUgcGF0aCB3aGljaAogICAgICAgIGNvbmZvcm1zIHRvIHRoZSBnaXZlbiBtb2RlIG9uIHRoZSBQQVRILCBvciBOb25lIGlmIHRoZXJlIGlzIG5vIHN1Y2gKICAgICAgICBmaWxlLgoKICAgICAgICBgbW9kZWAgZGVmYXVsdHMgdG8gb3MuRl9PSyB8IG9zLlhfT0suIGBwYXRoYCBkZWZhdWx0cyB0byB0aGUgcmVzdWx0CiAgICAgICAgb2Ygb3MuZW52aXJvbi5nZXQoIlBBVEgiKSwgb3IgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBhIGN1c3RvbSBzZWFyY2gKICAgICAgICBwYXRoLgoKICAgICAgICAiIiIKICAgICAgICAjIENoZWNrIHRoYXQgYSBnaXZlbiBmaWxlIGNhbiBiZSBhY2Nlc3NlZCB3aXRoIHRoZSBjb3JyZWN0IG1vZGUuCiAgICAgICAgIyBBZGRpdGlvbmFsbHkgY2hlY2sgdGhhdCBgZmlsZWAgaXMgbm90IGEgZGlyZWN0b3J5LCBhcyBvbiBXaW5kb3dzCiAgICAgICAgIyBkaXJlY3RvcmllcyBwYXNzIHRoZSBvcy5hY2Nlc3MgY2hlY2suCiAgICAgICAgZGVmIF9hY2Nlc3NfY2hlY2soZm4sIG1vZGUpOgogICAgICAgICAgICByZXR1cm4gKG9zLnBhdGguZXhpc3RzKGZuKSBhbmQgb3MuYWNjZXNzKGZuLCBtb2RlKQogICAgICAgICAgICAgICAgICAgIGFuZCBub3Qgb3MucGF0aC5pc2RpcihmbikpCgogICAgICAgICMgSWYgd2UncmUgZ2l2ZW4gYSBwYXRoIHdpdGggYSBkaXJlY3RvcnkgcGFydCwgbG9vayBpdCB1cCBkaXJlY3RseSByYXRoZXIKICAgICAgICAjIHRoYW4gcmVmZXJyaW5nIHRvIFBBVEggZGlyZWN0b3JpZXMuIFRoaXMgaW5jbHVkZXMgY2hlY2tpbmcgcmVsYXRpdmUgdG8gdGhlCiAgICAgICAgIyBjdXJyZW50IGRpcmVjdG9yeSwgZS5nLiAuL3NjcmlwdAogICAgICAgIGlmIG9zLnBhdGguZGlybmFtZShjbWQpOgogICAgICAgICAgICBpZiBfYWNjZXNzX2NoZWNrKGNtZCwgbW9kZSk6CiAgICAgICAgICAgICAgICByZXR1cm4gY21kCiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIGlmIHBhdGggaXMgTm9uZToKICAgICAgICAgICAgcGF0aCA9IG9zLmVudmlyb24uZ2V0KCJQQVRIIiwgb3MuZGVmcGF0aCkKICAgICAgICBpZiBub3QgcGF0aDoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBwYXRoID0gcGF0aC5zcGxpdChvcy5wYXRoc2VwKQoKICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKICAgICAgICAgICAgIyBUaGUgY3VycmVudCBkaXJlY3RvcnkgdGFrZXMgcHJlY2VkZW5jZSBvbiBXaW5kb3dzLgogICAgICAgICAgICBpZiBub3Qgb3MuY3VyZGlyIGluIHBhdGg6CiAgICAgICAgICAgICAgICBwYXRoLmluc2VydCgwLCBvcy5jdXJkaXIpCgogICAgICAgICAgICAjIFBBVEhFWFQgaXMgbmVjZXNzYXJ5IHRvIGNoZWNrIG9uIFdpbmRvd3MuCiAgICAgICAgICAgIHBhdGhleHQgPSBvcy5lbnZpcm9uLmdldCgiUEFUSEVYVCIsICIiKS5zcGxpdChvcy5wYXRoc2VwKQogICAgICAgICAgICAjIFNlZSBpZiB0aGUgZ2l2ZW4gZmlsZSBtYXRjaGVzIGFueSBvZiB0aGUgZXhwZWN0ZWQgcGF0aCBleHRlbnNpb25zLgogICAgICAgICAgICAjIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBzaG9ydCBjaXJjdWl0IHdoZW4gZ2l2ZW4gInB5dGhvbi5leGUiLgogICAgICAgICAgICAjIElmIGl0IGRvZXMgbWF0Y2gsIG9ubHkgdGVzdCB0aGF0IG9uZSwgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gdHJ5CiAgICAgICAgICAgICMgb3RoZXJzLgogICAgICAgICAgICBpZiBhbnkoY21kLmxvd2VyKCkuZW5kc3dpdGgoZXh0Lmxvd2VyKCkpIGZvciBleHQgaW4gcGF0aGV4dCk6CiAgICAgICAgICAgICAgICBmaWxlcyA9IFtjbWRdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmaWxlcyA9IFtjbWQgKyBleHQgZm9yIGV4dCBpbiBwYXRoZXh0XQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgT24gb3RoZXIgcGxhdGZvcm1zIHlvdSBkb24ndCBoYXZlIHRoaW5ncyBsaWtlIFBBVEhFWFQgdG8gdGVsbCB5b3UKICAgICAgICAgICAgIyB3aGF0IGZpbGUgc3VmZml4ZXMgYXJlIGV4ZWN1dGFibGUsIHNvIGp1c3QgcGFzcyBvbiBjbWQgYXMtaXMuCiAgICAgICAgICAgIGZpbGVzID0gW2NtZF0KCiAgICAgICAgc2VlbiA9IHNldCgpCiAgICAgICAgZm9yIGRpciBpbiBwYXRoOgogICAgICAgICAgICBub3JtZGlyID0gb3MucGF0aC5ub3JtY2FzZShkaXIpCiAgICAgICAgICAgIGlmIG5vdCBub3JtZGlyIGluIHNlZW46CiAgICAgICAgICAgICAgICBzZWVuLmFkZChub3JtZGlyKQogICAgICAgICAgICAgICAgZm9yIHRoZWZpbGUgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG9zLnBhdGguam9pbihkaXIsIHRoZWZpbGUpCiAgICAgICAgICAgICAgICAgICAgaWYgX2FjY2Vzc19jaGVjayhuYW1lLCBtb2RlKToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUKICAgICAgICByZXR1cm4gTm9uZQoKCiMgWmlwRmlsZSBpcyBhIGNvbnRleHQgbWFuYWdlciBpbiAyLjcsIGJ1dCBub3QgaW4gMi42Cgpmcm9tIHppcGZpbGUgaW1wb3J0IFppcEZpbGUgYXMgQmFzZVppcEZpbGUKCmlmIGhhc2F0dHIoQmFzZVppcEZpbGUsICdfX2VudGVyX18nKTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgWmlwRmlsZSA9IEJhc2VaaXBGaWxlCmVsc2U6CiAgICBmcm9tIHppcGZpbGUgaW1wb3J0IFppcEV4dEZpbGUgYXMgQmFzZVppcEV4dEZpbGUKCiAgICBjbGFzcyBaaXBFeHRGaWxlKEJhc2VaaXBFeHRGaWxlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgYmFzZSk6CiAgICAgICAgICAgIHNlbGYuX19kaWN0X18udXBkYXRlKGJhc2UuX19kaWN0X18pCgogICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmCgogICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqZXhjX2luZm8pOgogICAgICAgICAgICBzZWxmLmNsb3NlKCkKICAgICAgICAgICAgIyByZXR1cm4gTm9uZSwgc28gaWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkLCBpdCB3aWxsIHByb3BhZ2F0ZQoKICAgIGNsYXNzIFppcEZpbGUoQmFzZVppcEZpbGUpOgogICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmCgogICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqZXhjX2luZm8pOgogICAgICAgICAgICBzZWxmLmNsb3NlKCkKICAgICAgICAgICAgIyByZXR1cm4gTm9uZSwgc28gaWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkLCBpdCB3aWxsIHByb3BhZ2F0ZQoKICAgICAgICBkZWYgb3BlbihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICBiYXNlID0gQmFzZVppcEZpbGUub3BlbihzZWxmLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIHJldHVybiBaaXBFeHRGaWxlKGJhc2UpCgp0cnk6CiAgICBmcm9tIHBsYXRmb3JtIGltcG9ydCBweXRob25faW1wbGVtZW50YXRpb24KZXhjZXB0IEltcG9ydEVycm9yOiAjIHByYWdtYTogbm8gY292ZXIKICAgIGRlZiBweXRob25faW1wbGVtZW50YXRpb24oKToKICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbi4iIiIKICAgICAgICBpZiAnUHlQeScgaW4gc3lzLnZlcnNpb246CiAgICAgICAgICAgIHJldHVybiAnUHlQeScKICAgICAgICBpZiBvcy5uYW1lID09ICdqYXZhJzoKICAgICAgICAgICAgcmV0dXJuICdKeXRob24nCiAgICAgICAgaWYgc3lzLnZlcnNpb24uc3RhcnRzd2l0aCgnSXJvblB5dGhvbicpOgogICAgICAgICAgICByZXR1cm4gJ0lyb25QeXRob24nCiAgICAgICAgcmV0dXJuICdDUHl0aG9uJwoKdHJ5OgogICAgaW1wb3J0IHN5c2NvbmZpZwpleGNlcHQgSW1wb3J0RXJyb3I6ICMgcHJhZ21hOiBubyBjb3ZlcgogICAgZnJvbSAuX2JhY2twb3J0IGltcG9ydCBzeXNjb25maWcKCnRyeToKICAgIGNhbGxhYmxlID0gY2FsbGFibGUKZXhjZXB0IE5hbWVFcnJvcjogICAjIHByYWdtYTogbm8gY292ZXIKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IENhbGxhYmxlCgogICAgZGVmIGNhbGxhYmxlKG9iaik6CiAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob2JqLCBDYWxsYWJsZSkKCgp0cnk6CiAgICBmc2VuY29kZSA9IG9zLmZzZW5jb2RlCiAgICBmc2RlY29kZSA9IG9zLmZzZGVjb2RlCmV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgX2ZzZW5jb2RpbmcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkKICAgIGlmIF9mc2VuY29kaW5nID09ICdtYmNzJzoKICAgICAgICBfZnNlcnJvcnMgPSAnc3RyaWN0JwogICAgZWxzZToKICAgICAgICBfZnNlcnJvcnMgPSAnc3Vycm9nYXRlZXNjYXBlJwoKICAgIGRlZiBmc2VuY29kZShmaWxlbmFtZSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgYnl0ZXMpOgogICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZmlsZW5hbWUsIHRleHRfdHlwZSk6CiAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZS5lbmNvZGUoX2ZzZW5jb2RpbmcsIF9mc2Vycm9ycykKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImV4cGVjdCBieXRlcyBvciBzdHIsIG5vdCAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShmaWxlbmFtZSkuX19uYW1lX18pCgogICAgZGVmIGZzZGVjb2RlKGZpbGVuYW1lKToKICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZmlsZW5hbWUsIGJ5dGVzKToKICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lLmRlY29kZShfZnNlbmNvZGluZywgX2ZzZXJyb3JzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZXhwZWN0IGJ5dGVzIG9yIHN0ciwgbm90ICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKGZpbGVuYW1lKS5fX25hbWVfXykKCnRyeToKICAgIGZyb20gdG9rZW5pemUgaW1wb3J0IGRldGVjdF9lbmNvZGluZwpleGNlcHQgSW1wb3J0RXJyb3I6ICMgcHJhZ21hOiBubyBjb3ZlcgogICAgZnJvbSBjb2RlY3MgaW1wb3J0IEJPTV9VVEY4LCBsb29rdXAKICAgIGltcG9ydCByZQoKICAgIGNvb2tpZV9yZSA9IHJlLmNvbXBpbGUoImNvZGluZ1s6PV1ccyooWy1cdy5dKykiKQoKICAgIGRlZiBfZ2V0X25vcm1hbF9uYW1lKG9yaWdfZW5jKToKICAgICAgICAiIiJJbWl0YXRlcyBnZXRfbm9ybWFsX25hbWUgaW4gdG9rZW5pemVyLmMuIiIiCiAgICAgICAgIyBPbmx5IGNhcmUgYWJvdXQgdGhlIGZpcnN0IDEyIGNoYXJhY3RlcnMuCiAgICAgICAgZW5jID0gb3JpZ19lbmNbOjEyXS5sb3dlcigpLnJlcGxhY2UoIl8iLCAiLSIpCiAgICAgICAgaWYgZW5jID09ICJ1dGYtOCIgb3IgZW5jLnN0YXJ0c3dpdGgoInV0Zi04LSIpOgogICAgICAgICAgICByZXR1cm4gInV0Zi04IgogICAgICAgIGlmIGVuYyBpbiAoImxhdGluLTEiLCAiaXNvLTg4NTktMSIsICJpc28tbGF0aW4tMSIpIG9yIFwKICAgICAgICAgICBlbmMuc3RhcnRzd2l0aCgoImxhdGluLTEtIiwgImlzby04ODU5LTEtIiwgImlzby1sYXRpbi0xLSIpKToKICAgICAgICAgICAgcmV0dXJuICJpc28tODg1OS0xIgogICAgICAgIHJldHVybiBvcmlnX2VuYwoKICAgIGRlZiBkZXRlY3RfZW5jb2RpbmcocmVhZGxpbmUpOgogICAgICAgICIiIgogICAgICAgIFRoZSBkZXRlY3RfZW5jb2RpbmcoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGRldGVjdCB0aGUgZW5jb2RpbmcgdGhhdCBzaG91bGQKICAgICAgICBiZSB1c2VkIHRvIGRlY29kZSBhIFB5dGhvbiBzb3VyY2UgZmlsZS4gIEl0IHJlcXVpcmVzIG9uZSBhcmd1bWVudCwgcmVhZGxpbmUsCiAgICAgICAgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSB0b2tlbml6ZSgpIGdlbmVyYXRvci4KCiAgICAgICAgSXQgd2lsbCBjYWxsIHJlYWRsaW5lIGEgbWF4aW11bSBvZiB0d2ljZSwgYW5kIHJldHVybiB0aGUgZW5jb2RpbmcgdXNlZAogICAgICAgIChhcyBhIHN0cmluZykgYW5kIGEgbGlzdCBvZiBhbnkgbGluZXMgKGxlZnQgYXMgYnl0ZXMpIGl0IGhhcyByZWFkIGluLgoKICAgICAgICBJdCBkZXRlY3RzIHRoZSBlbmNvZGluZyBmcm9tIHRoZSBwcmVzZW5jZSBvZiBhIHV0Zi04IGJvbSBvciBhbiBlbmNvZGluZwogICAgICAgIGNvb2tpZSBhcyBzcGVjaWZpZWQgaW4gcGVwLTAyNjMuICBJZiBib3RoIGEgYm9tIGFuZCBhIGNvb2tpZSBhcmUgcHJlc2VudCwKICAgICAgICBidXQgZGlzYWdyZWUsIGEgU3ludGF4RXJyb3Igd2lsbCBiZSByYWlzZWQuICBJZiB0aGUgZW5jb2RpbmcgY29va2llIGlzIGFuCiAgICAgICAgaW52YWxpZCBjaGFyc2V0LCByYWlzZSBhIFN5bnRheEVycm9yLiAgTm90ZSB0aGF0IGlmIGEgdXRmLTggYm9tIGlzIGZvdW5kLAogICAgICAgICd1dGYtOC1zaWcnIGlzIHJldHVybmVkLgoKICAgICAgICBJZiBubyBlbmNvZGluZyBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIGRlZmF1bHQgb2YgJ3V0Zi04JyB3aWxsIGJlIHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgZmlsZW5hbWUgPSByZWFkbGluZS5fX3NlbGZfXy5uYW1lCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBmaWxlbmFtZSA9IE5vbmUKICAgICAgICBib21fZm91bmQgPSBGYWxzZQogICAgICAgIGVuY29kaW5nID0gTm9uZQogICAgICAgIGRlZmF1bHQgPSAndXRmLTgnCiAgICAgICAgZGVmIHJlYWRfb3Jfc3RvcCgpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGxpbmUoKQogICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKICAgICAgICAgICAgICAgIHJldHVybiBiJycKCiAgICAgICAgZGVmIGZpbmRfY29va2llKGxpbmUpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAjIERlY29kZSBhcyBVVEYtOC4gRWl0aGVyIHRoZSBsaW5lIGlzIGFuIGVuY29kaW5nIGRlY2xhcmF0aW9uLAogICAgICAgICAgICAgICAgIyBpbiB3aGljaCBjYXNlIGl0IHNob3VsZCBiZSBwdXJlIEFTQ0lJLCBvciBpdCBtdXN0IGJlIFVURi04CiAgICAgICAgICAgICAgICAjIHBlciBkZWZhdWx0IGVuY29kaW5nLgogICAgICAgICAgICAgICAgbGluZV9zdHJpbmcgPSBsaW5lLmRlY29kZSgndXRmLTgnKQogICAgICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICAgICAgbXNnID0gImludmFsaWQgb3IgbWlzc2luZyBlbmNvZGluZyBkZWNsYXJhdGlvbiIKICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIG1zZyA9ICd7fSBmb3IgeyFyfScuZm9ybWF0KG1zZywgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcihtc2cpCgogICAgICAgICAgICBtYXRjaGVzID0gY29va2llX3JlLmZpbmRhbGwobGluZV9zdHJpbmcpCiAgICAgICAgICAgIGlmIG5vdCBtYXRjaGVzOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgZW5jb2RpbmcgPSBfZ2V0X25vcm1hbF9uYW1lKG1hdGNoZXNbMF0pCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGNvZGVjID0gbG9va3VwKGVuY29kaW5nKQogICAgICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6CiAgICAgICAgICAgICAgICAjIFRoaXMgYmVoYXZpb3VyIG1pbWljcyB0aGUgUHl0aG9uIGludGVycHJldGVyCiAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIG1zZyA9ICJ1bmtub3duIGVuY29kaW5nOiAiICsgZW5jb2RpbmcKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbXNnID0gInVua25vd24gZW5jb2RpbmcgZm9yIHshcn06IHt9Ii5mb3JtYXQoZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZykKICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKG1zZykKCiAgICAgICAgICAgIGlmIGJvbV9mb3VuZDoKICAgICAgICAgICAgICAgIGlmIGNvZGVjLm5hbWUgIT0gJ3V0Zi04JzoKICAgICAgICAgICAgICAgICAgICAjIFRoaXMgYmVoYXZpb3VyIG1pbWljcyB0aGUgUHl0aG9uIGludGVycHJldGVyCiAgICAgICAgICAgICAgICAgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gJ2VuY29kaW5nIHByb2JsZW06IHV0Zi04JwogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9ICdlbmNvZGluZyBwcm9ibGVtIGZvciB7IXJ9OiB1dGYtOCcuZm9ybWF0KGZpbGVuYW1lKQogICAgICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKG1zZykKICAgICAgICAgICAgICAgIGVuY29kaW5nICs9ICctc2lnJwogICAgICAgICAgICByZXR1cm4gZW5jb2RpbmcKCiAgICAgICAgZmlyc3QgPSByZWFkX29yX3N0b3AoKQogICAgICAgIGlmIGZpcnN0LnN0YXJ0c3dpdGgoQk9NX1VURjgpOgogICAgICAgICAgICBib21fZm91bmQgPSBUcnVlCiAgICAgICAgICAgIGZpcnN0ID0gZmlyc3RbMzpdCiAgICAgICAgICAgIGRlZmF1bHQgPSAndXRmLTgtc2lnJwogICAgICAgIGlmIG5vdCBmaXJzdDoKICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQsIFtdCgogICAgICAgIGVuY29kaW5nID0gZmluZF9jb29raWUoZmlyc3QpCiAgICAgICAgaWYgZW5jb2Rpbmc6CiAgICAgICAgICAgIHJldHVybiBlbmNvZGluZywgW2ZpcnN0XQoKICAgICAgICBzZWNvbmQgPSByZWFkX29yX3N0b3AoKQogICAgICAgIGlmIG5vdCBzZWNvbmQ6CiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0LCBbZmlyc3RdCgogICAgICAgIGVuY29kaW5nID0gZmluZF9jb29raWUoc2Vjb25kKQogICAgICAgIGlmIGVuY29kaW5nOgogICAgICAgICAgICByZXR1cm4gZW5jb2RpbmcsIFtmaXJzdCwgc2Vjb25kXQoKICAgICAgICByZXR1cm4gZGVmYXVsdCwgW2ZpcnN0LCBzZWNvbmRdCgojIEZvciBjb252ZXJ0aW5nICYgPC0+ICZhbXA7IGV0Yy4KdHJ5OgogICAgZnJvbSBodG1sIGltcG9ydCBlc2NhcGUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBjZ2kgaW1wb3J0IGVzY2FwZQppZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA8ICgzLCA0KToKICAgIHVuZXNjYXBlID0gSFRNTFBhcnNlcigpLnVuZXNjYXBlCmVsc2U6CiAgICBmcm9tIGh0bWwgaW1wb3J0IHVuZXNjYXBlCgp0cnk6CiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBDaGFpbk1hcApleGNlcHQgSW1wb3J0RXJyb3I6ICMgcHJhZ21hOiBubyBjb3ZlcgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgTXV0YWJsZU1hcHBpbmcKCiAgICB0cnk6CiAgICAgICAgZnJvbSByZXBybGliIGltcG9ydCByZWN1cnNpdmVfcmVwciBhcyBfcmVjdXJzaXZlX3JlcHIKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBkZWYgX3JlY3Vyc2l2ZV9yZXByKGZpbGx2YWx1ZT0nLi4uJyk6CiAgICAgICAgICAgICcnJwogICAgICAgICAgICBEZWNvcmF0b3IgdG8gbWFrZSBhIHJlcHIgZnVuY3Rpb24gcmV0dXJuIGZpbGx2YWx1ZSBmb3IgYSByZWN1cnNpdmUKICAgICAgICAgICAgY2FsbAogICAgICAgICAgICAnJycKCiAgICAgICAgICAgIGRlZiBkZWNvcmF0aW5nX2Z1bmN0aW9uKHVzZXJfZnVuY3Rpb24pOgogICAgICAgICAgICAgICAgcmVwcl9ydW5uaW5nID0gc2V0KCkKCiAgICAgICAgICAgICAgICBkZWYgd3JhcHBlcihzZWxmKToKICAgICAgICAgICAgICAgICAgICBrZXkgPSBpZChzZWxmKSwgZ2V0X2lkZW50KCkKICAgICAgICAgICAgICAgICAgICBpZiBrZXkgaW4gcmVwcl9ydW5uaW5nOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsbHZhbHVlCiAgICAgICAgICAgICAgICAgICAgcmVwcl9ydW5uaW5nLmFkZChrZXkpCiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB1c2VyX2Z1bmN0aW9uKHNlbGYpCiAgICAgICAgICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICAgICAgICAgcmVwcl9ydW5uaW5nLmRpc2NhcmQoa2V5KQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICAgICAgICAgICAgICAjIENhbid0IHVzZSBmdW5jdG9vbHMud3JhcHMoKSBoZXJlIGJlY2F1c2Ugb2YgYm9vdHN0cmFwIGlzc3VlcwogICAgICAgICAgICAgICAgd3JhcHBlci5fX21vZHVsZV9fID0gZ2V0YXR0cih1c2VyX2Z1bmN0aW9uLCAnX19tb2R1bGVfXycpCiAgICAgICAgICAgICAgICB3cmFwcGVyLl9fZG9jX18gPSBnZXRhdHRyKHVzZXJfZnVuY3Rpb24sICdfX2RvY19fJykKICAgICAgICAgICAgICAgIHdyYXBwZXIuX19uYW1lX18gPSBnZXRhdHRyKHVzZXJfZnVuY3Rpb24sICdfX25hbWVfXycpCiAgICAgICAgICAgICAgICB3cmFwcGVyLl9fYW5ub3RhdGlvbnNfXyA9IGdldGF0dHIodXNlcl9mdW5jdGlvbiwgJ19fYW5ub3RhdGlvbnNfXycsIHt9KQogICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXIKCiAgICAgICAgICAgIHJldHVybiBkZWNvcmF0aW5nX2Z1bmN0aW9uCgogICAgY2xhc3MgQ2hhaW5NYXAoTXV0YWJsZU1hcHBpbmcpOgogICAgICAgICcnJyBBIENoYWluTWFwIGdyb3VwcyBtdWx0aXBsZSBkaWN0cyAob3Igb3RoZXIgbWFwcGluZ3MpIHRvZ2V0aGVyCiAgICAgICAgdG8gY3JlYXRlIGEgc2luZ2xlLCB1cGRhdGVhYmxlIHZpZXcuCgogICAgICAgIFRoZSB1bmRlcmx5aW5nIG1hcHBpbmdzIGFyZSBzdG9yZWQgaW4gYSBsaXN0LiAgVGhhdCBsaXN0IGlzIHB1YmxpYyBhbmQgY2FuCiAgICAgICAgYWNjZXNzZWQgb3IgdXBkYXRlZCB1c2luZyB0aGUgKm1hcHMqIGF0dHJpYnV0ZS4gIFRoZXJlIGlzIG5vIG90aGVyIHN0YXRlLgoKICAgICAgICBMb29rdXBzIHNlYXJjaCB0aGUgdW5kZXJseWluZyBtYXBwaW5ncyBzdWNjZXNzaXZlbHkgdW50aWwgYSBrZXkgaXMgZm91bmQuCiAgICAgICAgSW4gY29udHJhc3QsIHdyaXRlcywgdXBkYXRlcywgYW5kIGRlbGV0aW9ucyBvbmx5IG9wZXJhdGUgb24gdGhlIGZpcnN0CiAgICAgICAgbWFwcGluZy4KCiAgICAgICAgJycnCgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqbWFwcyk6CiAgICAgICAgICAgICcnJ0luaXRpYWxpemUgYSBDaGFpbk1hcCBieSBzZXR0aW5nICptYXBzKiB0byB0aGUgZ2l2ZW4gbWFwcGluZ3MuCiAgICAgICAgICAgIElmIG5vIG1hcHBpbmdzIGFyZSBwcm92aWRlZCwgYSBzaW5nbGUgZW1wdHkgZGljdGlvbmFyeSBpcyB1c2VkLgoKICAgICAgICAgICAgJycnCiAgICAgICAgICAgIHNlbGYubWFwcyA9IGxpc3QobWFwcykgb3IgW3t9XSAgICAgICAgICAjIGFsd2F5cyBhdCBsZWFzdCBvbmUgbWFwCgogICAgICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcihrZXkpCgogICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgICAgICBmb3IgbWFwcGluZyBpbiBzZWxmLm1hcHM6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcHBpbmdba2V5XSAgICAgICAgICAgICAjIGNhbid0IHVzZSAna2V5IGluIG1hcHBpbmcnIHdpdGggZGVmYXVsdGRpY3QKICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fbWlzc2luZ19fKGtleSkgICAgICAgICAgICAjIHN1cHBvcnQgc3ViY2xhc3NlcyB0aGF0IGRlZmluZSBfX21pc3NpbmdfXwoKICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKICAgICAgICAgICAgcmV0dXJuIHNlbGZba2V5XSBpZiBrZXkgaW4gc2VsZiBlbHNlIGRlZmF1bHQKCiAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBsZW4oc2V0KCkudW5pb24oKnNlbGYubWFwcykpICAgICAjIHJldXNlcyBzdG9yZWQgaGFzaCB2YWx1ZXMgaWYgcG9zc2libGUKCiAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gaXRlcihzZXQoKS51bmlvbigqc2VsZi5tYXBzKSkKCiAgICAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOgogICAgICAgICAgICByZXR1cm4gYW55KGtleSBpbiBtIGZvciBtIGluIHNlbGYubWFwcykKCiAgICAgICAgZGVmIF9fYm9vbF9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gYW55KHNlbGYubWFwcykKCiAgICAgICAgQF9yZWN1cnNpdmVfcmVwcigpCiAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gJ3swLl9fY2xhc3NfXy5fX25hbWVfX30oezF9KScuZm9ybWF0KAogICAgICAgICAgICAgICAgc2VsZiwgJywgJy5qb2luKG1hcChyZXByLCBzZWxmLm1hcHMpKSkKCiAgICAgICAgQGNsYXNzbWV0aG9kCiAgICAgICAgZGVmIGZyb21rZXlzKGNscywgaXRlcmFibGUsICphcmdzKToKICAgICAgICAgICAgJ0NyZWF0ZSBhIENoYWluTWFwIHdpdGggYSBzaW5nbGUgZGljdCBjcmVhdGVkIGZyb20gdGhlIGl0ZXJhYmxlLicKICAgICAgICAgICAgcmV0dXJuIGNscyhkaWN0LmZyb21rZXlzKGl0ZXJhYmxlLCAqYXJncykpCgogICAgICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgICAgICAnTmV3IENoYWluTWFwIG9yIHN1YmNsYXNzIHdpdGggYSBuZXcgY29weSBvZiBtYXBzWzBdIGFuZCByZWZzIHRvIG1hcHNbMTpdJwogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5tYXBzWzBdLmNvcHkoKSwgKnNlbGYubWFwc1sxOl0pCgogICAgICAgIF9fY29weV9fID0gY29weQoKICAgICAgICBkZWYgbmV3X2NoaWxkKHNlbGYpOiAgICAgICAgICAgICAgICAgICAgICAgICMgbGlrZSBEamFuZ28ncyBDb250ZXh0LnB1c2goKQogICAgICAgICAgICAnTmV3IENoYWluTWFwIHdpdGggYSBuZXcgZGljdCBmb2xsb3dlZCBieSBhbGwgcHJldmlvdXMgbWFwcy4nCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyh7fSwgKnNlbGYubWFwcykKCiAgICAgICAgQHByb3BlcnR5CiAgICAgICAgZGVmIHBhcmVudHMoc2VsZik6ICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxpa2UgRGphbmdvJ3MgQ29udGV4dC5wb3AoKQogICAgICAgICAgICAnTmV3IENoYWluTWFwIGZyb20gbWFwc1sxOl0uJwogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oKnNlbGYubWFwc1sxOl0pCgogICAgICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICAgICAgc2VsZi5tYXBzWzBdW2tleV0gPSB2YWx1ZQoKICAgICAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZGVsIHNlbGYubWFwc1swXVtrZXldCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdLZXkgbm90IGZvdW5kIGluIHRoZSBmaXJzdCBtYXBwaW5nOiB7IXJ9Jy5mb3JtYXQoa2V5KSkKCiAgICAgICAgZGVmIHBvcGl0ZW0oc2VsZik6CiAgICAgICAgICAgICdSZW1vdmUgYW5kIHJldHVybiBhbiBpdGVtIHBhaXIgZnJvbSBtYXBzWzBdLiBSYWlzZSBLZXlFcnJvciBpcyBtYXBzWzBdIGlzIGVtcHR5LicKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubWFwc1swXS5wb3BpdGVtKCkKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ05vIGtleXMgZm91bmQgaW4gdGhlIGZpcnN0IG1hcHBpbmcuJykKCiAgICAgICAgZGVmIHBvcChzZWxmLCBrZXksICphcmdzKToKICAgICAgICAgICAgJ1JlbW92ZSAqa2V5KiBmcm9tIG1hcHNbMF0gYW5kIHJldHVybiBpdHMgdmFsdWUuIFJhaXNlIEtleUVycm9yIGlmICprZXkqIG5vdCBpbiBtYXBzWzBdLicKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubWFwc1swXS5wb3Aoa2V5LCAqYXJncykKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ0tleSBub3QgZm91bmQgaW4gdGhlIGZpcnN0IG1hcHBpbmc6IHshcn0nLmZvcm1hdChrZXkpKQoKICAgICAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgICAgICdDbGVhciBtYXBzWzBdLCBsZWF2aW5nIG1hcHNbMTpdIGludGFjdC4nCiAgICAgICAgICAgIHNlbGYubWFwc1swXS5jbGVhcigpCgp0cnk6CiAgICBmcm9tIGltcCBpbXBvcnQgY2FjaGVfZnJvbV9zb3VyY2UKZXhjZXB0IEltcG9ydEVycm9yOiAjIHByYWdtYTogbm8gY292ZXIKICAgIGRlZiBjYWNoZV9mcm9tX3NvdXJjZShwYXRoLCBkZWJ1Z19vdmVycmlkZT1Ob25lKToKICAgICAgICBhc3NlcnQgcGF0aC5lbmRzd2l0aCgnLnB5JykKICAgICAgICBpZiBkZWJ1Z19vdmVycmlkZSBpcyBOb25lOgogICAgICAgICAgICBkZWJ1Z19vdmVycmlkZSA9IF9fZGVidWdfXwogICAgICAgIGlmIGRlYnVnX292ZXJyaWRlOgogICAgICAgICAgICBzdWZmaXggPSAnYycKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdWZmaXggPSAnbycKICAgICAgICByZXR1cm4gcGF0aCArIHN1ZmZpeAoKdHJ5OgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKZXhjZXB0IEltcG9ydEVycm9yOiAjIHByYWdtYTogbm8gY292ZXIKIyMge3t7IGh0dHA6Ly9jb2RlLmFjdGl2ZXN0YXRlLmNvbS9yZWNpcGVzLzU3NjY5My8gKHI5KQojIEJhY2twb3J0IG9mIE9yZGVyZWREaWN0KCkgY2xhc3MgdGhhdCBydW5zIG9uIFB5dGhvbiAyLjQsIDIuNSwgMi42LCAyLjcgYW5kIHB5cHkuCiMgUGFzc2VzIFB5dGhvbjIuNydzIHRlc3Qgc3VpdGUgYW5kIGluY29ycG9yYXRlcyBhbGwgdGhlIGxhdGVzdCB1cGRhdGVzLgogICAgdHJ5OgogICAgICAgIGZyb20gdGhyZWFkIGltcG9ydCBnZXRfaWRlbnQgYXMgX2dldF9pZGVudAogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIGZyb20gZHVtbXlfdGhyZWFkIGltcG9ydCBnZXRfaWRlbnQgYXMgX2dldF9pZGVudAoKICAgIHRyeToKICAgICAgICBmcm9tIF9hYmNvbGwgaW1wb3J0IEtleXNWaWV3LCBWYWx1ZXNWaWV3LCBJdGVtc1ZpZXcKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBwYXNzCgoKICAgIGNsYXNzIE9yZGVyZWREaWN0KGRpY3QpOgogICAgICAgICdEaWN0aW9uYXJ5IHRoYXQgcmVtZW1iZXJzIGluc2VydGlvbiBvcmRlcicKICAgICAgICAjIEFuIGluaGVyaXRlZCBkaWN0IG1hcHMga2V5cyB0byB2YWx1ZXMuCiAgICAgICAgIyBUaGUgaW5oZXJpdGVkIGRpY3QgcHJvdmlkZXMgX19nZXRpdGVtX18sIF9fbGVuX18sIF9fY29udGFpbnNfXywgYW5kIGdldC4KICAgICAgICAjIFRoZSByZW1haW5pbmcgbWV0aG9kcyBhcmUgb3JkZXItYXdhcmUuCiAgICAgICAgIyBCaWctTyBydW5uaW5nIHRpbWVzIGZvciBhbGwgbWV0aG9kcyBhcmUgdGhlIHNhbWUgYXMgZm9yIHJlZ3VsYXIgZGljdGlvbmFyaWVzLgoKICAgICAgICAjIFRoZSBpbnRlcm5hbCBzZWxmLl9fbWFwIGRpY3Rpb25hcnkgbWFwcyBrZXlzIHRvIGxpbmtzIGluIGEgZG91Ymx5IGxpbmtlZCBsaXN0LgogICAgICAgICMgVGhlIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdCBzdGFydHMgYW5kIGVuZHMgd2l0aCBhIHNlbnRpbmVsIGVsZW1lbnQuCiAgICAgICAgIyBUaGUgc2VudGluZWwgZWxlbWVudCBuZXZlciBnZXRzIGRlbGV0ZWQgKHRoaXMgc2ltcGxpZmllcyB0aGUgYWxnb3JpdGhtKS4KICAgICAgICAjIEVhY2ggbGluayBpcyBzdG9yZWQgYXMgYSBsaXN0IG9mIGxlbmd0aCB0aHJlZTogIFtQUkVWLCBORVhULCBLRVldLgoKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dkcyk6CiAgICAgICAgICAgICcnJ0luaXRpYWxpemUgYW4gb3JkZXJlZCBkaWN0aW9uYXJ5LiAgU2lnbmF0dXJlIGlzIHRoZSBzYW1lIGFzIGZvcgogICAgICAgICAgICByZWd1bGFyIGRpY3Rpb25hcmllcywgYnV0IGtleXdvcmQgYXJndW1lbnRzIGFyZSBub3QgcmVjb21tZW5kZWQKICAgICAgICAgICAgYmVjYXVzZSB0aGVpciBpbnNlcnRpb24gb3JkZXIgaXMgYXJiaXRyYXJ5LgoKICAgICAgICAgICAgJycnCiAgICAgICAgICAgIGlmIGxlbihhcmdzKSA+IDE6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2V4cGVjdGVkIGF0IG1vc3QgMSBhcmd1bWVudHMsIGdvdCAlZCcgJSBsZW4oYXJncykpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYuX19yb290CiAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgICAgIHNlbGYuX19yb290ID0gcm9vdCA9IFtdICAgICAgICAgICAgICAgICAgICAgIyBzZW50aW5lbCBub2RlCiAgICAgICAgICAgICAgICByb290WzpdID0gW3Jvb3QsIHJvb3QsIE5vbmVdCiAgICAgICAgICAgICAgICBzZWxmLl9fbWFwID0ge30KICAgICAgICAgICAgc2VsZi5fX3VwZGF0ZSgqYXJncywgKiprd2RzKQoKICAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSwgZGljdF9zZXRpdGVtPWRpY3QuX19zZXRpdGVtX18pOgogICAgICAgICAgICAnb2QuX19zZXRpdGVtX18oaSwgeSkgPD09PiBvZFtpXT15JwogICAgICAgICAgICAjIFNldHRpbmcgYSBuZXcgaXRlbSBjcmVhdGVzIGEgbmV3IGxpbmsgd2hpY2ggZ29lcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5rZWQKICAgICAgICAgICAgIyBsaXN0LCBhbmQgdGhlIGluaGVyaXRlZCBkaWN0aW9uYXJ5IGlzIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IGtleS92YWx1ZSBwYWlyLgogICAgICAgICAgICBpZiBrZXkgbm90IGluIHNlbGY6CiAgICAgICAgICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKICAgICAgICAgICAgICAgIGxhc3QgPSByb290WzBdCiAgICAgICAgICAgICAgICBsYXN0WzFdID0gcm9vdFswXSA9IHNlbGYuX19tYXBba2V5XSA9IFtsYXN0LCByb290LCBrZXldCiAgICAgICAgICAgIGRpY3Rfc2V0aXRlbShzZWxmLCBrZXksIHZhbHVlKQoKICAgICAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5LCBkaWN0X2RlbGl0ZW09ZGljdC5fX2RlbGl0ZW1fXyk6CiAgICAgICAgICAgICdvZC5fX2RlbGl0ZW1fXyh5KSA8PT0+IGRlbCBvZFt5XScKICAgICAgICAgICAgIyBEZWxldGluZyBhbiBleGlzdGluZyBpdGVtIHVzZXMgc2VsZi5fX21hcCB0byBmaW5kIHRoZSBsaW5rIHdoaWNoIGlzCiAgICAgICAgICAgICMgdGhlbiByZW1vdmVkIGJ5IHVwZGF0aW5nIHRoZSBsaW5rcyBpbiB0aGUgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciBub2Rlcy4KICAgICAgICAgICAgZGljdF9kZWxpdGVtKHNlbGYsIGtleSkKICAgICAgICAgICAgbGlua19wcmV2LCBsaW5rX25leHQsIGtleSA9IHNlbGYuX19tYXAucG9wKGtleSkKICAgICAgICAgICAgbGlua19wcmV2WzFdID0gbGlua19uZXh0CiAgICAgICAgICAgIGxpbmtfbmV4dFswXSA9IGxpbmtfcHJldgoKICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgICAgICdvZC5fX2l0ZXJfXygpIDw9PT4gaXRlcihvZCknCiAgICAgICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAogICAgICAgICAgICBjdXJyID0gcm9vdFsxXQogICAgICAgICAgICB3aGlsZSBjdXJyIGlzIG5vdCByb290OgogICAgICAgICAgICAgICAgeWllbGQgY3VyclsyXQogICAgICAgICAgICAgICAgY3VyciA9IGN1cnJbMV0KCiAgICAgICAgZGVmIF9fcmV2ZXJzZWRfXyhzZWxmKToKICAgICAgICAgICAgJ29kLl9fcmV2ZXJzZWRfXygpIDw9PT4gcmV2ZXJzZWQob2QpJwogICAgICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKICAgICAgICAgICAgY3VyciA9IHJvb3RbMF0KICAgICAgICAgICAgd2hpbGUgY3VyciBpcyBub3Qgcm9vdDoKICAgICAgICAgICAgICAgIHlpZWxkIGN1cnJbMl0KICAgICAgICAgICAgICAgIGN1cnIgPSBjdXJyWzBdCgogICAgICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICAgICAgJ29kLmNsZWFyKCkgLT4gTm9uZS4gIFJlbW92ZSBhbGwgaXRlbXMgZnJvbSBvZC4nCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGZvciBub2RlIGluIHNlbGYuX19tYXAuaXRlcnZhbHVlcygpOgogICAgICAgICAgICAgICAgICAgIGRlbCBub2RlWzpdCiAgICAgICAgICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKICAgICAgICAgICAgICAgIHJvb3RbOl0gPSBbcm9vdCwgcm9vdCwgTm9uZV0KICAgICAgICAgICAgICAgIHNlbGYuX19tYXAuY2xlYXIoKQogICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIGRpY3QuY2xlYXIoc2VsZikKCiAgICAgICAgZGVmIHBvcGl0ZW0oc2VsZiwgbGFzdD1UcnVlKToKICAgICAgICAgICAgJycnb2QucG9waXRlbSgpIC0+IChrLCB2KSwgcmV0dXJuIGFuZCByZW1vdmUgYSAoa2V5LCB2YWx1ZSkgcGFpci4KICAgICAgICAgICAgUGFpcnMgYXJlIHJldHVybmVkIGluIExJRk8gb3JkZXIgaWYgbGFzdCBpcyB0cnVlIG9yIEZJRk8gb3JkZXIgaWYgZmFsc2UuCgogICAgICAgICAgICAnJycKICAgICAgICAgICAgaWYgbm90IHNlbGY6CiAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcignZGljdGlvbmFyeSBpcyBlbXB0eScpCiAgICAgICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAogICAgICAgICAgICBpZiBsYXN0OgogICAgICAgICAgICAgICAgbGluayA9IHJvb3RbMF0KICAgICAgICAgICAgICAgIGxpbmtfcHJldiA9IGxpbmtbMF0KICAgICAgICAgICAgICAgIGxpbmtfcHJldlsxXSA9IHJvb3QKICAgICAgICAgICAgICAgIHJvb3RbMF0gPSBsaW5rX3ByZXYKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxpbmsgPSByb290WzFdCiAgICAgICAgICAgICAgICBsaW5rX25leHQgPSBsaW5rWzFdCiAgICAgICAgICAgICAgICByb290WzFdID0gbGlua19uZXh0CiAgICAgICAgICAgICAgICBsaW5rX25leHRbMF0gPSByb290CiAgICAgICAgICAgIGtleSA9IGxpbmtbMl0KICAgICAgICAgICAgZGVsIHNlbGYuX19tYXBba2V5XQogICAgICAgICAgICB2YWx1ZSA9IGRpY3QucG9wKHNlbGYsIGtleSkKICAgICAgICAgICAgcmV0dXJuIGtleSwgdmFsdWUKCiAgICAgICAgIyAtLSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgZG8gbm90IGRlcGVuZCBvbiB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIC0tCgogICAgICAgIGRlZiBrZXlzKHNlbGYpOgogICAgICAgICAgICAnb2Qua2V5cygpIC0+IGxpc3Qgb2Yga2V5cyBpbiBvZCcKICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZikKCiAgICAgICAgZGVmIHZhbHVlcyhzZWxmKToKICAgICAgICAgICAgJ29kLnZhbHVlcygpIC0+IGxpc3Qgb2YgdmFsdWVzIGluIG9kJwogICAgICAgICAgICByZXR1cm4gW3NlbGZba2V5XSBmb3Iga2V5IGluIHNlbGZdCgogICAgICAgIGRlZiBpdGVtcyhzZWxmKToKICAgICAgICAgICAgJ29kLml0ZW1zKCkgLT4gbGlzdCBvZiAoa2V5LCB2YWx1ZSkgcGFpcnMgaW4gb2QnCiAgICAgICAgICAgIHJldHVybiBbKGtleSwgc2VsZltrZXldKSBmb3Iga2V5IGluIHNlbGZdCgogICAgICAgIGRlZiBpdGVya2V5cyhzZWxmKToKICAgICAgICAgICAgJ29kLml0ZXJrZXlzKCkgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBpbiBvZCcKICAgICAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZikKCiAgICAgICAgZGVmIGl0ZXJ2YWx1ZXMoc2VsZik6CiAgICAgICAgICAgICdvZC5pdGVydmFsdWVzIC0+IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBpbiBvZCcKICAgICAgICAgICAgZm9yIGsgaW4gc2VsZjoKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGZba10KCiAgICAgICAgZGVmIGl0ZXJpdGVtcyhzZWxmKToKICAgICAgICAgICAgJ29kLml0ZXJpdGVtcyAtPiBhbiBpdGVyYXRvciBvdmVyIHRoZSAoa2V5LCB2YWx1ZSkgaXRlbXMgaW4gb2QnCiAgICAgICAgICAgIGZvciBrIGluIHNlbGY6CiAgICAgICAgICAgICAgICB5aWVsZCAoaywgc2VsZltrXSkKCiAgICAgICAgZGVmIHVwZGF0ZSgqYXJncywgKiprd2RzKToKICAgICAgICAgICAgJycnb2QudXBkYXRlKEUsICoqRikgLT4gTm9uZS4gIFVwZGF0ZSBvZCBmcm9tIGRpY3QvaXRlcmFibGUgRSBhbmQgRi4KCiAgICAgICAgICAgIElmIEUgaXMgYSBkaWN0IGluc3RhbmNlLCBkb2VzOiAgICAgICAgICAgZm9yIGsgaW4gRTogb2Rba10gPSBFW2tdCiAgICAgICAgICAgIElmIEUgaGFzIGEgLmtleXMoKSBtZXRob2QsIGRvZXM6ICAgICAgICAgZm9yIGsgaW4gRS5rZXlzKCk6IG9kW2tdID0gRVtrXQogICAgICAgICAgICBPciBpZiBFIGlzIGFuIGl0ZXJhYmxlIG9mIGl0ZW1zLCBkb2VzOiAgIGZvciBrLCB2IGluIEU6IG9kW2tdID0gdgogICAgICAgICAgICBJbiBlaXRoZXIgY2FzZSwgdGhpcyBpcyBmb2xsb3dlZCBieTogICAgIGZvciBrLCB2IGluIEYuaXRlbXMoKTogb2Rba10gPSB2CgogICAgICAgICAgICAnJycKICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID4gMjoKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigndXBkYXRlKCkgdGFrZXMgYXQgbW9zdCAyIHBvc2l0aW9uYWwgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcmd1bWVudHMgKCVkIGdpdmVuKScgJSAobGVuKGFyZ3MpLCkpCiAgICAgICAgICAgIGVsaWYgbm90IGFyZ3M6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ3VwZGF0ZSgpIHRha2VzIGF0IGxlYXN0IDEgYXJndW1lbnQgKDAgZ2l2ZW4pJykKICAgICAgICAgICAgc2VsZiA9IGFyZ3NbMF0KICAgICAgICAgICAgIyBNYWtlIHByb2dyZXNzaXZlbHkgd2Vha2VyIGFzc3VtcHRpb25zIGFib3V0ICJvdGhlciIKICAgICAgICAgICAgb3RoZXIgPSAoKQogICAgICAgICAgICBpZiBsZW4oYXJncykgPT0gMjoKICAgICAgICAgICAgICAgIG90aGVyID0gYXJnc1sxXQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkaWN0KToKICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gb3RoZXI6CiAgICAgICAgICAgICAgICAgICAgc2VsZltrZXldID0gb3RoZXJba2V5XQogICAgICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsICdrZXlzJyk6CiAgICAgICAgICAgICAgICBmb3Iga2V5IGluIG90aGVyLmtleXMoKToKICAgICAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSBvdGhlcltrZXldCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBvdGhlcjoKICAgICAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSB2YWx1ZQogICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBrd2RzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSB2YWx1ZQoKICAgICAgICBfX3VwZGF0ZSA9IHVwZGF0ZSAgIyBsZXQgc3ViY2xhc3NlcyBvdmVycmlkZSB1cGRhdGUgd2l0aG91dCBicmVha2luZyBfX2luaXRfXwoKICAgICAgICBfX21hcmtlciA9IG9iamVjdCgpCgogICAgICAgIGRlZiBwb3Aoc2VsZiwga2V5LCBkZWZhdWx0PV9fbWFya2VyKToKICAgICAgICAgICAgJycnb2QucG9wKGtbLGRdKSAtPiB2LCByZW1vdmUgc3BlY2lmaWVkIGtleSBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLgogICAgICAgICAgICBJZiBrZXkgaXMgbm90IGZvdW5kLCBkIGlzIHJldHVybmVkIGlmIGdpdmVuLCBvdGhlcndpc2UgS2V5RXJyb3IgaXMgcmFpc2VkLgoKICAgICAgICAgICAgJycnCiAgICAgICAgICAgIGlmIGtleSBpbiBzZWxmOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltrZXldCiAgICAgICAgICAgICAgICBkZWwgc2VsZltrZXldCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CiAgICAgICAgICAgIGlmIGRlZmF1bHQgaXMgc2VsZi5fX21hcmtlcjoKICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKGtleSkKICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKCiAgICAgICAgZGVmIHNldGRlZmF1bHQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgogICAgICAgICAgICAnb2Quc2V0ZGVmYXVsdChrWyxkXSkgLT4gb2QuZ2V0KGssZCksIGFsc28gc2V0IG9kW2tdPWQgaWYgayBub3QgaW4gb2QnCiAgICAgICAgICAgIGlmIGtleSBpbiBzZWxmOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGZba2V5XQogICAgICAgICAgICBzZWxmW2tleV0gPSBkZWZhdWx0CiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CgogICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmLCBfcmVwcl9ydW5uaW5nPU5vbmUpOgogICAgICAgICAgICAnb2QuX19yZXByX18oKSA8PT0+IHJlcHIob2QpJwogICAgICAgICAgICBpZiBub3QgX3JlcHJfcnVubmluZzogX3JlcHJfcnVubmluZyA9IHt9CiAgICAgICAgICAgIGNhbGxfa2V5ID0gaWQoc2VsZiksIF9nZXRfaWRlbnQoKQogICAgICAgICAgICBpZiBjYWxsX2tleSBpbiBfcmVwcl9ydW5uaW5nOgogICAgICAgICAgICAgICAgcmV0dXJuICcuLi4nCiAgICAgICAgICAgIF9yZXByX3J1bm5pbmdbY2FsbF9rZXldID0gMQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyVzKCknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCkKICAgICAgICAgICAgICAgIHJldHVybiAnJXMoJXIpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5pdGVtcygpKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgZGVsIF9yZXByX3J1bm5pbmdbY2FsbF9rZXldCgogICAgICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgogICAgICAgICAgICAnUmV0dXJuIHN0YXRlIGluZm9ybWF0aW9uIGZvciBwaWNrbGluZycKICAgICAgICAgICAgaXRlbXMgPSBbW2ssIHNlbGZba11dIGZvciBrIGluIHNlbGZdCiAgICAgICAgICAgIGluc3RfZGljdCA9IHZhcnMoc2VsZikuY29weSgpCiAgICAgICAgICAgIGZvciBrIGluIHZhcnMoT3JkZXJlZERpY3QoKSk6CiAgICAgICAgICAgICAgICBpbnN0X2RpY3QucG9wKGssIE5vbmUpCiAgICAgICAgICAgIGlmIGluc3RfZGljdDoKICAgICAgICAgICAgICAgIHJldHVybiAoc2VsZi5fX2NsYXNzX18sIChpdGVtcywpLCBpbnN0X2RpY3QpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXywgKGl0ZW1zLCkKCiAgICAgICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgICAgICdvZC5jb3B5KCkgLT4gYSBzaGFsbG93IGNvcHkgb2Ygb2QnCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmKQoKICAgICAgICBAY2xhc3NtZXRob2QKICAgICAgICBkZWYgZnJvbWtleXMoY2xzLCBpdGVyYWJsZSwgdmFsdWU9Tm9uZSk6CiAgICAgICAgICAgICcnJ09ELmZyb21rZXlzKFNbLCB2XSkgLT4gTmV3IG9yZGVyZWQgZGljdGlvbmFyeSB3aXRoIGtleXMgZnJvbSBTCiAgICAgICAgICAgIGFuZCB2YWx1ZXMgZXF1YWwgdG8gdiAod2hpY2ggZGVmYXVsdHMgdG8gTm9uZSkuCgogICAgICAgICAgICAnJycKICAgICAgICAgICAgZCA9IGNscygpCiAgICAgICAgICAgIGZvciBrZXkgaW4gaXRlcmFibGU6CiAgICAgICAgICAgICAgICBkW2tleV0gPSB2YWx1ZQogICAgICAgICAgICByZXR1cm4gZAoKICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAgICAgJycnb2QuX19lcV9fKHkpIDw9PT4gb2Q9PXkuICBDb21wYXJpc29uIHRvIGFub3RoZXIgT0QgaXMgb3JkZXItc2Vuc2l0aXZlCiAgICAgICAgICAgIHdoaWxlIGNvbXBhcmlzb24gdG8gYSByZWd1bGFyIG1hcHBpbmcgaXMgb3JkZXItaW5zZW5zaXRpdmUuCgogICAgICAgICAgICAnJycKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgT3JkZXJlZERpY3QpOgogICAgICAgICAgICAgICAgcmV0dXJuIGxlbihzZWxmKT09bGVuKG90aGVyKSBhbmQgc2VsZi5pdGVtcygpID09IG90aGVyLml0ZW1zKCkKICAgICAgICAgICAgcmV0dXJuIGRpY3QuX19lcV9fKHNlbGYsIG90aGVyKQoKICAgICAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCgogICAgICAgICMgLS0gdGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBvbmx5IHVzZWQgaW4gUHl0aG9uIDIuNyAtLQoKICAgICAgICBkZWYgdmlld2tleXMoc2VsZik6CiAgICAgICAgICAgICJvZC52aWV3a2V5cygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gb2QncyBrZXlzIgogICAgICAgICAgICByZXR1cm4gS2V5c1ZpZXcoc2VsZikKCiAgICAgICAgZGVmIHZpZXd2YWx1ZXMoc2VsZik6CiAgICAgICAgICAgICJvZC52aWV3dmFsdWVzKCkgLT4gYW4gb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gb2QncyB2YWx1ZXMiCiAgICAgICAgICAgIHJldHVybiBWYWx1ZXNWaWV3KHNlbGYpCgogICAgICAgIGRlZiB2aWV3aXRlbXMoc2VsZik6CiAgICAgICAgICAgICJvZC52aWV3aXRlbXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIG9kJ3MgaXRlbXMiCiAgICAgICAgICAgIHJldHVybiBJdGVtc1ZpZXcoc2VsZikKCnRyeToKICAgIGZyb20gbG9nZ2luZy5jb25maWcgaW1wb3J0IEJhc2VDb25maWd1cmF0b3IsIHZhbGlkX2lkZW50CmV4Y2VwdCBJbXBvcnRFcnJvcjogIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBJREVOVElGSUVSID0gcmUuY29tcGlsZSgnXlthLXpfXVthLXowLTlfXSokJywgcmUuSSkKCgogICAgZGVmIHZhbGlkX2lkZW50KHMpOgogICAgICAgIG0gPSBJREVOVElGSUVSLm1hdGNoKHMpCiAgICAgICAgaWYgbm90IG06CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ05vdCBhIHZhbGlkIFB5dGhvbiBpZGVudGlmaWVyOiAlcicgJSBzKQogICAgICAgIHJldHVybiBUcnVlCgoKICAgICMgVGhlIENvbnZlcnRpbmdYWFggY2xhc3NlcyBhcmUgd3JhcHBlcnMgYXJvdW5kIHN0YW5kYXJkIFB5dGhvbiBjb250YWluZXJzLAogICAgIyBhbmQgdGhleSBzZXJ2ZSB0byBjb252ZXJ0IGFueSBzdWl0YWJsZSB2YWx1ZXMgaW4gdGhlIGNvbnRhaW5lci4gVGhlCiAgICAjIGNvbnZlcnNpb24gY29udmVydHMgYmFzZSBkaWN0cywgbGlzdHMgYW5kIHR1cGxlcyB0byB0aGVpciB3cmFwcGVkCiAgICAjIGVxdWl2YWxlbnRzLCB3aGVyZWFzIHN0cmluZ3Mgd2hpY2ggbWF0Y2ggYSBjb252ZXJzaW9uIGZvcm1hdCBhcmUgY29udmVydGVkCiAgICAjIGFwcHJvcHJpYXRlbHkuCiAgICAjCiAgICAjIEVhY2ggd3JhcHBlciBzaG91bGQgaGF2ZSBhIGNvbmZpZ3VyYXRvciBhdHRyaWJ1dGUgaG9sZGluZyB0aGUgYWN0dWFsCiAgICAjIGNvbmZpZ3VyYXRvciB0byB1c2UgZm9yIGNvbnZlcnNpb24uCgogICAgY2xhc3MgQ29udmVydGluZ0RpY3QoZGljdCk6CiAgICAgICAgIiIiQSBjb252ZXJ0aW5nIGRpY3Rpb25hcnkgd3JhcHBlci4iIiIKCiAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgICAgIHZhbHVlID0gZGljdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgICAgICNJZiB0aGUgY29udmVydGVkIHZhbHVlIGlzIGRpZmZlcmVudCwgc2F2ZSBmb3IgbmV4dCB0aW1lCiAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSByZXN1bHQKICAgICAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgICAgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgogICAgICAgICAgICB2YWx1ZSA9IGRpY3QuZ2V0KHNlbGYsIGtleSwgZGVmYXVsdCkKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICAgICAgI0lmIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaXMgZGlmZmVyZW50LCBzYXZlIGZvciBuZXh0IHRpbWUKICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IHJlc3VsdAogICAgICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKICAgICAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgcG9wKHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKICAgICAgICB2YWx1ZSA9IGRpY3QucG9wKHNlbGYsIGtleSwgZGVmYXVsdCkKICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQogICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CiAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgogICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBjbGFzcyBDb252ZXJ0aW5nTGlzdChsaXN0KToKICAgICAgICAiIiJBIGNvbnZlcnRpbmcgbGlzdCB3cmFwcGVyLiIiIgogICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgICAgICB2YWx1ZSA9IGxpc3QuX19nZXRpdGVtX18oc2VsZiwga2V5KQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQogICAgICAgICAgICAjSWYgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBkaWZmZXJlbnQsIHNhdmUgZm9yIG5leHQgdGltZQogICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgogICAgICAgICAgICAgICAgc2VsZltrZXldID0gcmVzdWx0CiAgICAgICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICAgICBkZWYgcG9wKHNlbGYsIGlkeD0tMSk6CiAgICAgICAgICAgIHZhbHVlID0gbGlzdC5wb3Aoc2VsZiwgaWR4KQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQogICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgogICAgICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGNsYXNzIENvbnZlcnRpbmdUdXBsZSh0dXBsZSk6CiAgICAgICAgIiIiQSBjb252ZXJ0aW5nIHR1cGxlIHdyYXBwZXIuIiIiCiAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgICAgIHZhbHVlID0gdHVwbGUuX19nZXRpdGVtX18oc2VsZiwga2V5KQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQogICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgogICAgICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKICAgICAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICBjbGFzcyBCYXNlQ29uZmlndXJhdG9yKG9iamVjdCk6CiAgICAgICAgIiIiCiAgICAgICAgVGhlIGNvbmZpZ3VyYXRvciBiYXNlIGNsYXNzIHdoaWNoIGRlZmluZXMgc29tZSB1c2VmdWwgZGVmYXVsdHMuCiAgICAgICAgIiIiCgogICAgICAgIENPTlZFUlRfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideKD9QPHByZWZpeD5bYS16XSspOi8vKD9QPHN1ZmZpeD4uKikkJykKCiAgICAgICAgV09SRF9QQVRURVJOID0gcmUuY29tcGlsZShyJ15ccyooXHcrKVxzKicpCiAgICAgICAgRE9UX1BBVFRFUk4gPSByZS5jb21waWxlKHInXlwuXHMqKFx3KylccyonKQogICAgICAgIElOREVYX1BBVFRFUk4gPSByZS5jb21waWxlKHInXlxbXHMqKFx3KylccypcXVxzKicpCiAgICAgICAgRElHSVRfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideXGQrJCcpCgogICAgICAgIHZhbHVlX2NvbnZlcnRlcnMgPSB7CiAgICAgICAgICAgICdleHQnIDogJ2V4dF9jb252ZXJ0JywKICAgICAgICAgICAgJ2NmZycgOiAnY2ZnX2NvbnZlcnQnLAogICAgICAgIH0KCiAgICAgICAgIyBXZSBtaWdodCB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBvbmUsIGUuZy4gaW1wb3J0bGliCiAgICAgICAgaW1wb3J0ZXIgPSBzdGF0aWNtZXRob2QoX19pbXBvcnRfXykKCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZyk6CiAgICAgICAgICAgIHNlbGYuY29uZmlnID0gQ29udmVydGluZ0RpY3QoY29uZmlnKQogICAgICAgICAgICBzZWxmLmNvbmZpZy5jb25maWd1cmF0b3IgPSBzZWxmCgogICAgICAgIGRlZiByZXNvbHZlKHNlbGYsIHMpOgogICAgICAgICAgICAiIiIKICAgICAgICAgICAgUmVzb2x2ZSBzdHJpbmdzIHRvIG9iamVjdHMgdXNpbmcgc3RhbmRhcmQgaW1wb3J0IGFuZCBhdHRyaWJ1dGUKICAgICAgICAgICAgc3ludGF4LgogICAgICAgICAgICAiIiIKICAgICAgICAgICAgbmFtZSA9IHMuc3BsaXQoJy4nKQogICAgICAgICAgICB1c2VkID0gbmFtZS5wb3AoMCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZm91bmQgPSBzZWxmLmltcG9ydGVyKHVzZWQpCiAgICAgICAgICAgICAgICBmb3IgZnJhZyBpbiBuYW1lOgogICAgICAgICAgICAgICAgICAgIHVzZWQgKz0gJy4nICsgZnJhZwogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBnZXRhdHRyKGZvdW5kLCBmcmFnKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbXBvcnRlcih1c2VkKQogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGdldGF0dHIoZm91bmQsIGZyYWcpCiAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgZSwgdGIgPSBzeXMuZXhjX2luZm8oKVsxOl0KICAgICAgICAgICAgICAgIHYgPSBWYWx1ZUVycm9yKCdDYW5ub3QgcmVzb2x2ZSAlcjogJXMnICUgKHMsIGUpKQogICAgICAgICAgICAgICAgdi5fX2NhdXNlX18sIHYuX190cmFjZWJhY2tfXyA9IGUsIHRiCiAgICAgICAgICAgICAgICByYWlzZSB2CgogICAgICAgIGRlZiBleHRfY29udmVydChzZWxmLCB2YWx1ZSk6CiAgICAgICAgICAgICIiIkRlZmF1bHQgY29udmVydGVyIGZvciB0aGUgZXh0Oi8vIHByb3RvY29sLiIiIgogICAgICAgICAgICByZXR1cm4gc2VsZi5yZXNvbHZlKHZhbHVlKQoKICAgICAgICBkZWYgY2ZnX2NvbnZlcnQoc2VsZiwgdmFsdWUpOgogICAgICAgICAgICAiIiJEZWZhdWx0IGNvbnZlcnRlciBmb3IgdGhlIGNmZzovLyBwcm90b2NvbC4iIiIKICAgICAgICAgICAgcmVzdCA9IHZhbHVlCiAgICAgICAgICAgIG0gPSBzZWxmLldPUkRfUEFUVEVSTi5tYXRjaChyZXN0KQogICAgICAgICAgICBpZiBtIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbmFibGUgdG8gY29udmVydCAlciIgJSB2YWx1ZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJlc3QgPSByZXN0W20uZW5kKCk6XQogICAgICAgICAgICAgICAgZCA9IHNlbGYuY29uZmlnW20uZ3JvdXBzKClbMF1dCiAgICAgICAgICAgICAgICAjcHJpbnQgZCwgcmVzdAogICAgICAgICAgICAgICAgd2hpbGUgcmVzdDoKICAgICAgICAgICAgICAgICAgICBtID0gc2VsZi5ET1RfUEFUVEVSTi5tYXRjaChyZXN0KQogICAgICAgICAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkW20uZ3JvdXBzKClbMF1dCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbSA9IHNlbGYuSU5ERVhfUEFUVEVSTi5tYXRjaChyZXN0KQogICAgICAgICAgICAgICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gbS5ncm91cHMoKVswXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuRElHSVRfUEFUVEVSTi5tYXRjaChpZHgpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkW2lkeF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gaW50KGlkeCkgIyB0cnkgYXMgbnVtYmVyIGZpcnN0IChtb3N0IGxpa2VseSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGRbbl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZFtpZHhdCiAgICAgICAgICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdCA9IHJlc3RbbS5lbmQoKTpdCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbnZlcnQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclciBhdCAlcicgJSAodmFsdWUsIHJlc3QpKQogICAgICAgICAgICAjcmVzdCBzaG91bGQgYmUgZW1wdHkKICAgICAgICAgICAgcmV0dXJuIGQKCiAgICAgICAgZGVmIGNvbnZlcnQoc2VsZiwgdmFsdWUpOgogICAgICAgICAgICAiIiIKICAgICAgICAgICAgQ29udmVydCB2YWx1ZXMgdG8gYW4gYXBwcm9wcmlhdGUgdHlwZS4gZGljdHMsIGxpc3RzIGFuZCB0dXBsZXMgYXJlCiAgICAgICAgICAgIHJlcGxhY2VkIGJ5IHRoZWlyIGNvbnZlcnRpbmcgYWx0ZXJuYXRpdmVzLiBTdHJpbmdzIGFyZSBjaGVja2VkIHRvCiAgICAgICAgICAgIHNlZSBpZiB0aGV5IGhhdmUgYSBjb252ZXJzaW9uIGZvcm1hdCBhbmQgYXJlIGNvbnZlcnRlZCBpZiB0aGV5IGRvLgogICAgICAgICAgICAiIiIKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIENvbnZlcnRpbmdEaWN0KSBhbmQgaXNpbnN0YW5jZSh2YWx1ZSwgZGljdCk6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IENvbnZlcnRpbmdEaWN0KHZhbHVlKQogICAgICAgICAgICAgICAgdmFsdWUuY29uZmlndXJhdG9yID0gc2VsZgogICAgICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBDb252ZXJ0aW5nTGlzdCkgYW5kIGlzaW5zdGFuY2UodmFsdWUsIGxpc3QpOgogICAgICAgICAgICAgICAgdmFsdWUgPSBDb252ZXJ0aW5nTGlzdCh2YWx1ZSkKICAgICAgICAgICAgICAgIHZhbHVlLmNvbmZpZ3VyYXRvciA9IHNlbGYKICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgQ29udmVydGluZ1R1cGxlKSBhbmRcCiAgICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKICAgICAgICAgICAgICAgIHZhbHVlID0gQ29udmVydGluZ1R1cGxlKHZhbHVlKQogICAgICAgICAgICAgICAgdmFsdWUuY29uZmlndXJhdG9yID0gc2VsZgogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICBtID0gc2VsZi5DT05WRVJUX1BBVFRFUk4ubWF0Y2godmFsdWUpCiAgICAgICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgICAgIGQgPSBtLmdyb3VwZGljdCgpCiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZFsncHJlZml4J10KICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIgPSBzZWxmLnZhbHVlX2NvbnZlcnRlcnMuZ2V0KHByZWZpeCwgTm9uZSkKICAgICAgICAgICAgICAgICAgICBpZiBjb252ZXJ0ZXI6CiAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IGRbJ3N1ZmZpeCddCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlciA9IGdldGF0dHIoc2VsZiwgY29udmVydGVyKQogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvbnZlcnRlcihzdWZmaXgpCiAgICAgICAgICAgIHJldHVybiB2YWx1ZQoKICAgICAgICBkZWYgY29uZmlndXJlX2N1c3RvbShzZWxmLCBjb25maWcpOgogICAgICAgICAgICAiIiJDb25maWd1cmUgYW4gb2JqZWN0IHdpdGggYSB1c2VyLXN1cHBsaWVkIGZhY3RvcnkuIiIiCiAgICAgICAgICAgIGMgPSBjb25maWcucG9wKCcoKScpCiAgICAgICAgICAgIGlmIG5vdCBjYWxsYWJsZShjKToKICAgICAgICAgICAgICAgIGMgPSBzZWxmLnJlc29sdmUoYykKICAgICAgICAgICAgcHJvcHMgPSBjb25maWcucG9wKCcuJywgTm9uZSkKICAgICAgICAgICAgIyBDaGVjayBmb3IgdmFsaWQgaWRlbnRpZmllcnMKICAgICAgICAgICAga3dhcmdzID0gZGljdChbKGssIGNvbmZpZ1trXSkgZm9yIGsgaW4gY29uZmlnIGlmIHZhbGlkX2lkZW50KGspXSkKICAgICAgICAgICAgcmVzdWx0ID0gYygqKmt3YXJncykKICAgICAgICAgICAgaWYgcHJvcHM6CiAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gcHJvcHMuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHJlc3VsdCwgbmFtZSwgdmFsdWUpCiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICAgICAgZGVmIGFzX3R1cGxlKHNlbGYsIHZhbHVlKToKICAgICAgICAgICAgIiIiVXRpbGl0eSBmdW5jdGlvbiB3aGljaCBjb252ZXJ0cyBsaXN0cyB0byB0dXBsZXMuIiIiCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGxpc3QpOgogICAgICAgICAgICAgICAgdmFsdWUgPSB0dXBsZSh2YWx1ZSkKICAgICAgICAgICAgcmV0dXJuIHZhbHVlClBLAwQUAAAAAAAAACEAOgrDvAjCAAAIwgAALwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL2RhdGFiYXNlLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMi0yMDE2IFRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKIiIiUEVQIDM3NiBpbXBsZW1lbnRhdGlvbi4iIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IGJhc2U2NAppbXBvcnQgY29kZWNzCmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBoYXNobGliCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgcG9zaXhwYXRoCmltcG9ydCBzeXMKaW1wb3J0IHppcGltcG9ydAoKZnJvbSAuIGltcG9ydCBEaXN0bGliRXhjZXB0aW9uLCByZXNvdXJjZXMKZnJvbSAuY29tcGF0IGltcG9ydCBTdHJpbmdJTwpmcm9tIC52ZXJzaW9uIGltcG9ydCBnZXRfc2NoZW1lLCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcgpmcm9tIC5tZXRhZGF0YSBpbXBvcnQgTWV0YWRhdGEsIE1FVEFEQVRBX0ZJTEVOQU1FLCBXSEVFTF9NRVRBREFUQV9GSUxFTkFNRQpmcm9tIC51dGlsIGltcG9ydCAocGFyc2VfcmVxdWlyZW1lbnQsIGNhY2hlZF9wcm9wZXJ0eSwgcGFyc2VfbmFtZV9hbmRfdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgIHJlYWRfZXhwb3J0cywgd3JpdGVfZXhwb3J0cywgQ1NWUmVhZGVyLCBDU1ZXcml0ZXIpCgoKX19hbGxfXyA9IFsnRGlzdHJpYnV0aW9uJywgJ0Jhc2VJbnN0YWxsZWREaXN0cmlidXRpb24nLAogICAgICAgICAgICdJbnN0YWxsZWREaXN0cmlidXRpb24nLCAnRWdnSW5mb0Rpc3RyaWJ1dGlvbicsCiAgICAgICAgICAgJ0Rpc3RyaWJ1dGlvblBhdGgnXQoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKRVhQT1JUU19GSUxFTkFNRSA9ICdweWRpc3QtZXhwb3J0cy5qc29uJwpDT01NQU5EU19GSUxFTkFNRSA9ICdweWRpc3QtY29tbWFuZHMuanNvbicKCkRJU1RfRklMRVMgPSAoJ0lOU1RBTExFUicsIE1FVEFEQVRBX0ZJTEVOQU1FLCAnUkVDT1JEJywgJ1JFUVVFU1RFRCcsCiAgICAgICAgICAgICAgJ1JFU09VUkNFUycsIEVYUE9SVFNfRklMRU5BTUUsICdTSEFSRUQnKQoKRElTVElORk9fRVhUID0gJy5kaXN0LWluZm8nCgoKY2xhc3MgX0NhY2hlKG9iamVjdCk6CiAgICAiIiIKICAgIEEgc2ltcGxlIGNhY2hlIG1hcHBpbmcgbmFtZXMgYW5kIC5kaXN0LWluZm8gcGF0aHMgdG8gZGlzdHJpYnV0aW9ucwogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4gVGhlcmUgaXMgbm9ybWFsbHkgb25lIGZvciBlYWNoIERpc3RyaWJ1dGlvblBhdGguCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5uYW1lID0ge30KICAgICAgICBzZWxmLnBhdGggPSB7fQogICAgICAgIHNlbGYuZ2VuZXJhdGVkID0gRmFsc2UKCiAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ2xlYXIgdGhlIGNhY2hlLCBzZXR0aW5nIGl0IHRvIGl0cyBpbml0aWFsIHN0YXRlLgogICAgICAgICIiIgogICAgICAgIHNlbGYubmFtZS5jbGVhcigpCiAgICAgICAgc2VsZi5wYXRoLmNsZWFyKCkKICAgICAgICBzZWxmLmdlbmVyYXRlZCA9IEZhbHNlCgogICAgZGVmIGFkZChzZWxmLCBkaXN0KToKICAgICAgICAiIiIKICAgICAgICBBZGQgYSBkaXN0cmlidXRpb24gdG8gdGhlIGNhY2hlLgogICAgICAgIDpwYXJhbSBkaXN0OiBUaGUgZGlzdHJpYnV0aW9uIHRvIGFkZC4KICAgICAgICAiIiIKICAgICAgICBpZiBkaXN0LnBhdGggbm90IGluIHNlbGYucGF0aDoKICAgICAgICAgICAgc2VsZi5wYXRoW2Rpc3QucGF0aF0gPSBkaXN0CiAgICAgICAgICAgIHNlbGYubmFtZS5zZXRkZWZhdWx0KGRpc3Qua2V5LCBbXSkuYXBwZW5kKGRpc3QpCgoKY2xhc3MgRGlzdHJpYnV0aW9uUGF0aChvYmplY3QpOgogICAgIiIiCiAgICBSZXByZXNlbnRzIGEgc2V0IG9mIGRpc3RyaWJ1dGlvbnMgaW5zdGFsbGVkIG9uIGEgcGF0aCAodHlwaWNhbGx5IHN5cy5wYXRoKS4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGg9Tm9uZSwgaW5jbHVkZV9lZ2c9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIENyZWF0ZSBhbiBpbnN0YW5jZSBmcm9tIGEgcGF0aCwgb3B0aW9uYWxseSBpbmNsdWRpbmcgbGVnYWN5IChkaXN0dXRpbHMvCiAgICAgICAgc2V0dXB0b29scy9kaXN0cmlidXRlKSBkaXN0cmlidXRpb25zLgogICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aCB0byB1c2UsIGFzIGEgbGlzdCBvZiBkaXJlY3Rvcmllcy4gSWYgbm90IHNwZWNpZmllZCwKICAgICAgICAgICAgICAgICAgICAgc3lzLnBhdGggaXMgdXNlZC4KICAgICAgICA6cGFyYW0gaW5jbHVkZV9lZ2c6IElmIFRydWUsIHRoaXMgaW5zdGFuY2Ugd2lsbCBsb29rIGZvciBhbmQgcmV0dXJuIGxlZ2FjeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9ucyBhcyB3ZWxsIGFzIHRob3NlIGJhc2VkIG9uIFBFUCAzNzYuCiAgICAgICAgIiIiCiAgICAgICAgaWYgcGF0aCBpcyBOb25lOgogICAgICAgICAgICBwYXRoID0gc3lzLnBhdGgKICAgICAgICBzZWxmLnBhdGggPSBwYXRoCiAgICAgICAgc2VsZi5faW5jbHVkZV9kaXN0ID0gVHJ1ZQogICAgICAgIHNlbGYuX2luY2x1ZGVfZWdnID0gaW5jbHVkZV9lZ2cKCiAgICAgICAgc2VsZi5fY2FjaGUgPSBfQ2FjaGUoKQogICAgICAgIHNlbGYuX2NhY2hlX2VnZyA9IF9DYWNoZSgpCiAgICAgICAgc2VsZi5fY2FjaGVfZW5hYmxlZCA9IFRydWUKICAgICAgICBzZWxmLl9zY2hlbWUgPSBnZXRfc2NoZW1lKCdkZWZhdWx0JykKCiAgICBkZWYgX2dldF9jYWNoZV9lbmFibGVkKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9jYWNoZV9lbmFibGVkCgogICAgZGVmIF9zZXRfY2FjaGVfZW5hYmxlZChzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fY2FjaGVfZW5hYmxlZCA9IHZhbHVlCgogICAgY2FjaGVfZW5hYmxlZCA9IHByb3BlcnR5KF9nZXRfY2FjaGVfZW5hYmxlZCwgX3NldF9jYWNoZV9lbmFibGVkKQoKICAgIGRlZiBjbGVhcl9jYWNoZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDbGVhcnMgdGhlIGludGVybmFsIGNhY2hlLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NhY2hlLmNsZWFyKCkKICAgICAgICBzZWxmLl9jYWNoZV9lZ2cuY2xlYXIoKQoKCiAgICBkZWYgX3lpZWxkX2Rpc3RyaWJ1dGlvbnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgWWllbGQgLmRpc3QtaW5mbyBhbmQvb3IgLmVnZygtaW5mbykgZGlzdHJpYnV0aW9ucy4KICAgICAgICAiIiIKICAgICAgICAjIFdlIG5lZWQgdG8gY2hlY2sgaWYgd2UndmUgc2VlbiBzb21lIHJlc291cmNlcyBhbHJlYWR5LCBiZWNhdXNlIG9uCiAgICAgICAgIyBzb21lIExpbnV4IHN5c3RlbXMgKGUuZy4gc29tZSBEZWJpYW4vVWJ1bnR1IHZhcmlhbnRzKSB0aGVyZSBhcmUKICAgICAgICAjIHN5bWxpbmtzIHdoaWNoIGFsaWFzIG90aGVyIGZpbGVzIGluIHRoZSBlbnZpcm9ubWVudC4KICAgICAgICBzZWVuID0gc2V0KCkKICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLnBhdGg6CiAgICAgICAgICAgIGZpbmRlciA9IHJlc291cmNlcy5maW5kZXJfZm9yX3BhdGgocGF0aCkKICAgICAgICAgICAgaWYgZmluZGVyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICByID0gZmluZGVyLmZpbmQoJycpCiAgICAgICAgICAgIGlmIG5vdCByIG9yIG5vdCByLmlzX2NvbnRhaW5lcjoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHJzZXQgPSBzb3J0ZWQoci5yZXNvdXJjZXMpCiAgICAgICAgICAgIGZvciBlbnRyeSBpbiByc2V0OgogICAgICAgICAgICAgICAgciA9IGZpbmRlci5maW5kKGVudHJ5KQogICAgICAgICAgICAgICAgaWYgbm90IHIgb3Igci5wYXRoIGluIHNlZW46CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIHNlbGYuX2luY2x1ZGVfZGlzdCBhbmQgZW50cnkuZW5kc3dpdGgoRElTVElORk9fRVhUKToKICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZV9maWxlbmFtZXMgPSBbTUVUQURBVEFfRklMRU5BTUUsIFdIRUVMX01FVEFEQVRBX0ZJTEVOQU1FXQogICAgICAgICAgICAgICAgICAgIGZvciBtZXRhZGF0YV9maWxlbmFtZSBpbiBwb3NzaWJsZV9maWxlbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhX3BhdGggPSBwb3NpeHBhdGguam9pbihlbnRyeSwgbWV0YWRhdGFfZmlsZW5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIHB5ZGlzdCA9IGZpbmRlci5maW5kKG1ldGFkYXRhX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHB5ZGlzdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICAgICAgd2l0aCBjb250ZXh0bGliLmNsb3NpbmcocHlkaXN0LmFzX3N0cmVhbSgpKSBhcyBzdHJlYW06CiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEoZmlsZW9iaj1zdHJlYW0sIHNjaGVtZT0nbGVnYWN5JykKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kICVzJywgci5wYXRoKQogICAgICAgICAgICAgICAgICAgIHNlZW4uYWRkKHIucGF0aCkKICAgICAgICAgICAgICAgICAgICB5aWVsZCBuZXdfZGlzdF9jbGFzcyhyLnBhdGgsIG1ldGFkYXRhPW1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1zZWxmKQogICAgICAgICAgICAgICAgZWxpZiBzZWxmLl9pbmNsdWRlX2VnZyBhbmQgZW50cnkuZW5kc3dpdGgoKCcuZWdnLWluZm8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5lZ2cnKSk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCAlcycsIHIucGF0aCkKICAgICAgICAgICAgICAgICAgICBzZWVuLmFkZChyLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgeWllbGQgb2xkX2Rpc3RfY2xhc3Moci5wYXRoLCBzZWxmKQoKICAgIGRlZiBfZ2VuZXJhdGVfY2FjaGUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2NhbiB0aGUgcGF0aCBmb3IgZGlzdHJpYnV0aW9ucyBhbmQgcG9wdWxhdGUgdGhlIGNhY2hlIHdpdGgKICAgICAgICB0aG9zZSB0aGF0IGFyZSBmb3VuZC4KICAgICAgICAiIiIKICAgICAgICBnZW5fZGlzdCA9IG5vdCBzZWxmLl9jYWNoZS5nZW5lcmF0ZWQKICAgICAgICBnZW5fZWdnID0gc2VsZi5faW5jbHVkZV9lZ2cgYW5kIG5vdCBzZWxmLl9jYWNoZV9lZ2cuZ2VuZXJhdGVkCiAgICAgICAgaWYgZ2VuX2Rpc3Qgb3IgZ2VuX2VnZzoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gc2VsZi5feWllbGRfZGlzdHJpYnV0aW9ucygpOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkaXN0LCBJbnN0YWxsZWREaXN0cmlidXRpb24pOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2NhY2hlLmFkZChkaXN0KQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jYWNoZV9lZ2cuYWRkKGRpc3QpCgogICAgICAgICAgICBpZiBnZW5fZGlzdDoKICAgICAgICAgICAgICAgIHNlbGYuX2NhY2hlLmdlbmVyYXRlZCA9IFRydWUKICAgICAgICAgICAgaWYgZ2VuX2VnZzoKICAgICAgICAgICAgICAgIHNlbGYuX2NhY2hlX2VnZy5nZW5lcmF0ZWQgPSBUcnVlCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZGlzdGluZm9fZGlybmFtZShjbHMsIG5hbWUsIHZlcnNpb24pOgogICAgICAgICIiIgogICAgICAgIFRoZSAqbmFtZSogYW5kICp2ZXJzaW9uKiBwYXJhbWV0ZXJzIGFyZSBjb252ZXJ0ZWQgaW50byB0aGVpcgogICAgICAgIGZpbGVuYW1lLWVzY2FwZWQgZm9ybSwgaS5lLiBhbnkgYGAnLSdgYCBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZAogICAgICAgIHdpdGggYGAnXydgYCBvdGhlciB0aGFuIHRoZSBvbmUgaW4gYGAnZGlzdC1pbmZvJ2BgIGFuZCB0aGUgb25lCiAgICAgICAgc2VwYXJhdGluZyB0aGUgbmFtZSBmcm9tIHRoZSB2ZXJzaW9uIG51bWJlci4KCiAgICAgICAgOnBhcmFtZXRlciBuYW1lOiBpcyBjb252ZXJ0ZWQgdG8gYSBzdGFuZGFyZCBkaXN0cmlidXRpb24gbmFtZSBieSByZXBsYWNpbmcKICAgICAgICAgICAgICAgICAgICAgICAgIGFueSBydW5zIG9mIG5vbi0gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgd2l0aCBhIHNpbmdsZQogICAgICAgICAgICAgICAgICAgICAgICAgYGAnLSdgYC4KICAgICAgICA6dHlwZSBuYW1lOiBzdHJpbmcKICAgICAgICA6cGFyYW1ldGVyIHZlcnNpb246IGlzIGNvbnZlcnRlZCB0byBhIHN0YW5kYXJkIHZlcnNpb24gc3RyaW5nLiBTcGFjZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlY29tZSBkb3RzLCBhbmQgYWxsIG90aGVyIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4Y2VwdCBkb3RzKSBiZWNvbWUgZGFzaGVzLCB3aXRoIHJ1bnMgb2YgbXVsdGlwbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hlcyBjb25kZW5zZWQgdG8gYSBzaW5nbGUgZGFzaC4KICAgICAgICA6dHlwZSB2ZXJzaW9uOiBzdHJpbmcKICAgICAgICA6cmV0dXJuczogZGlyZWN0b3J5IG5hbWUKICAgICAgICA6cnR5cGU6IHN0cmluZyIiIgogICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJy0nLCAnXycpCiAgICAgICAgcmV0dXJuICctJy5qb2luKFtuYW1lLCB2ZXJzaW9uXSkgKyBESVNUSU5GT19FWFQKCiAgICBkZWYgZ2V0X2Rpc3RyaWJ1dGlvbnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUHJvdmlkZXMgYW4gaXRlcmF0b3IgdGhhdCBsb29rcyBmb3IgZGlzdHJpYnV0aW9ucyBhbmQgcmV0dXJucwogICAgICAgIDpjbGFzczpgSW5zdGFsbGVkRGlzdHJpYnV0aW9uYCBvcgogICAgICAgIDpjbGFzczpgRWdnSW5mb0Rpc3RyaWJ1dGlvbmAgaW5zdGFuY2VzIGZvciBlYWNoIG9uZSBvZiB0aGVtLgoKICAgICAgICA6cnR5cGU6IGl0ZXJhdG9yIG9mIDpjbGFzczpgSW5zdGFsbGVkRGlzdHJpYnV0aW9uYCBhbmQKICAgICAgICAgICAgICAgIDpjbGFzczpgRWdnSW5mb0Rpc3RyaWJ1dGlvbmAgaW5zdGFuY2VzCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuX2NhY2hlX2VuYWJsZWQ6CiAgICAgICAgICAgIGZvciBkaXN0IGluIHNlbGYuX3lpZWxkX2Rpc3RyaWJ1dGlvbnMoKToKICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9nZW5lcmF0ZV9jYWNoZSgpCgogICAgICAgICAgICBmb3IgZGlzdCBpbiBzZWxmLl9jYWNoZS5wYXRoLnZhbHVlcygpOgogICAgICAgICAgICAgICAgeWllbGQgZGlzdAoKICAgICAgICAgICAgaWYgc2VsZi5faW5jbHVkZV9lZ2c6CiAgICAgICAgICAgICAgICBmb3IgZGlzdCBpbiBzZWxmLl9jYWNoZV9lZ2cucGF0aC52YWx1ZXMoKToKICAgICAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CgogICAgZGVmIGdldF9kaXN0cmlidXRpb24oc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgTG9va3MgZm9yIGEgbmFtZWQgZGlzdHJpYnV0aW9uIG9uIHRoZSBwYXRoLgoKICAgICAgICBUaGlzIGZ1bmN0aW9uIG9ubHkgcmV0dXJucyB0aGUgZmlyc3QgcmVzdWx0IGZvdW5kLCBhcyBubyBtb3JlIHRoYW4gb25lCiAgICAgICAgdmFsdWUgaXMgZXhwZWN0ZWQuIElmIG5vdGhpbmcgaXMgZm91bmQsIGBgTm9uZWBgIGlzIHJldHVybmVkLgoKICAgICAgICA6cnR5cGU6IDpjbGFzczpgSW5zdGFsbGVkRGlzdHJpYnV0aW9uYCwgOmNsYXNzOmBFZ2dJbmZvRGlzdHJpYnV0aW9uYAogICAgICAgICAgICAgICAgb3IgYGBOb25lYGAKICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBOb25lCiAgICAgICAgbmFtZSA9IG5hbWUubG93ZXIoKQogICAgICAgIGlmIG5vdCBzZWxmLl9jYWNoZV9lbmFibGVkOgogICAgICAgICAgICBmb3IgZGlzdCBpbiBzZWxmLl95aWVsZF9kaXN0cmlidXRpb25zKCk6CiAgICAgICAgICAgICAgICBpZiBkaXN0LmtleSA9PSBuYW1lOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRpc3QKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX2dlbmVyYXRlX2NhY2hlKCkKCiAgICAgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5fY2FjaGUubmFtZToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2NhY2hlLm5hbWVbbmFtZV1bMF0KICAgICAgICAgICAgZWxpZiBzZWxmLl9pbmNsdWRlX2VnZyBhbmQgbmFtZSBpbiBzZWxmLl9jYWNoZV9lZ2cubmFtZToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2NhY2hlX2VnZy5uYW1lW25hbWVdWzBdCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBwcm92aWRlc19kaXN0cmlidXRpb24oc2VsZiwgbmFtZSwgdmVyc2lvbj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBJdGVyYXRlcyBvdmVyIGFsbCBkaXN0cmlidXRpb25zIHRvIGZpbmQgd2hpY2ggZGlzdHJpYnV0aW9ucyBwcm92aWRlICpuYW1lKi4KICAgICAgICBJZiBhICp2ZXJzaW9uKiBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgcmVzdWx0cy4KCiAgICAgICAgVGhpcyBmdW5jdGlvbiBvbmx5IHJldHVybnMgdGhlIGZpcnN0IHJlc3VsdCBmb3VuZCwgc2luY2Ugbm8gbW9yZSB0aGFuCiAgICAgICAgb25lIHZhbHVlcyBhcmUgZXhwZWN0ZWQuIElmIHRoZSBkaXJlY3RvcnkgaXMgbm90IGZvdW5kLCByZXR1cm5zIGBgTm9uZWBgLgoKICAgICAgICA6cGFyYW1ldGVyIHZlcnNpb246IGEgdmVyc2lvbiBzcGVjaWZpZXIgdGhhdCBpbmRpY2F0ZXMgdGhlIHZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkLCBjb25mb3JtaW5nIHRvIHRoZSBmb3JtYXQgaW4gYGBQRVAtMzQ1YGAKCiAgICAgICAgOnR5cGUgbmFtZTogc3RyaW5nCiAgICAgICAgOnR5cGUgdmVyc2lvbjogc3RyaW5nCiAgICAgICAgIiIiCiAgICAgICAgbWF0Y2hlciA9IE5vbmUKICAgICAgICBpZiBub3QgdmVyc2lvbiBpcyBOb25lOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBtYXRjaGVyID0gc2VsZi5fc2NoZW1lLm1hdGNoZXIoJyVzICglcyknICUgKG5hbWUsIHZlcnNpb24pKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ2ludmFsaWQgbmFtZSBvciB2ZXJzaW9uOiAlciwgJXInICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZSwgdmVyc2lvbikpCgogICAgICAgIGZvciBkaXN0IGluIHNlbGYuZ2V0X2Rpc3RyaWJ1dGlvbnMoKToKICAgICAgICAgICAgcHJvdmlkZWQgPSBkaXN0LnByb3ZpZGVzCgogICAgICAgICAgICBmb3IgcCBpbiBwcm92aWRlZDoKICAgICAgICAgICAgICAgIHBfbmFtZSwgcF92ZXIgPSBwYXJzZV9uYW1lX2FuZF92ZXJzaW9uKHApCiAgICAgICAgICAgICAgICBpZiBtYXRjaGVyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgaWYgcF9uYW1lID09IG5hbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgcF9uYW1lID09IG5hbWUgYW5kIG1hdGNoZXIubWF0Y2gocF92ZXIpOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgZGVmIGdldF9maWxlX3BhdGgoc2VsZiwgbmFtZSwgcmVsYXRpdmVfcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBwYXRoIHRvIGEgcmVzb3VyY2UgZmlsZS4KICAgICAgICAiIiIKICAgICAgICBkaXN0ID0gc2VsZi5nZXRfZGlzdHJpYnV0aW9uKG5hbWUpCiAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBMb29rdXBFcnJvcignbm8gZGlzdHJpYnV0aW9uIG5hbWVkICVyIGZvdW5kJyAlIG5hbWUpCiAgICAgICAgcmV0dXJuIGRpc3QuZ2V0X3Jlc291cmNlX3BhdGgocmVsYXRpdmVfcGF0aCkKCiAgICBkZWYgZ2V0X2V4cG9ydGVkX2VudHJpZXMoc2VsZiwgY2F0ZWdvcnksIG5hbWU9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGFsbCBvZiB0aGUgZXhwb3J0ZWQgZW50cmllcyBpbiBhIHBhcnRpY3VsYXIgY2F0ZWdvcnkuCgogICAgICAgIDpwYXJhbSBjYXRlZ29yeTogVGhlIGNhdGVnb3J5IHRvIHNlYXJjaCBmb3IgZW50cmllcy4KICAgICAgICA6cGFyYW0gbmFtZTogSWYgc3BlY2lmaWVkLCBvbmx5IGVudHJpZXMgd2l0aCB0aGF0IG5hbWUgYXJlIHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIGZvciBkaXN0IGluIHNlbGYuZ2V0X2Rpc3RyaWJ1dGlvbnMoKToKICAgICAgICAgICAgciA9IGRpc3QuZXhwb3J0cwogICAgICAgICAgICBpZiBjYXRlZ29yeSBpbiByOgogICAgICAgICAgICAgICAgZCA9IHJbY2F0ZWdvcnldCiAgICAgICAgICAgICAgICBpZiBuYW1lIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgaW4gZDoKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZFtuYW1lXQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBmb3IgdiBpbiBkLnZhbHVlcygpOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB2CgoKY2xhc3MgRGlzdHJpYnV0aW9uKG9iamVjdCk6CiAgICAiIiIKICAgIEEgYmFzZSBjbGFzcyBmb3IgZGlzdHJpYnV0aW9ucywgd2hldGhlciBpbnN0YWxsZWQgb3IgZnJvbSBpbmRleGVzLgogICAgRWl0aGVyIHdheSwgaXQgbXVzdCBoYXZlIHNvbWUgbWV0YWRhdGEsIHNvIHRoYXQncyBhbGwgdGhhdCdzIG5lZWRlZAogICAgZm9yIGNvbnN0cnVjdGlvbi4KICAgICIiIgoKICAgIGJ1aWxkX3RpbWVfZGVwZW5kZW5jeSA9IEZhbHNlCiAgICAiIiIKICAgIFNldCB0byBUcnVlIGlmIGl0J3Mga25vd24gdG8gYmUgb25seSBhIGJ1aWxkLXRpbWUgZGVwZW5kZW5jeSAoaS5lLgogICAgbm90IG5lZWRlZCBhZnRlciBpbnN0YWxsYXRpb24pLgogICAgIiIiCgogICAgcmVxdWVzdGVkID0gRmFsc2UKICAgICIiIkEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBgYFJFUVVFU1RFRGBgIG1ldGFkYXRhIGZpbGUgaXMKICAgIHByZXNlbnQgKGluIG90aGVyIHdvcmRzLCB3aGV0aGVyIHRoZSBwYWNrYWdlIHdhcyBpbnN0YWxsZWQgYnkgdXNlcgogICAgcmVxdWVzdCBvciBpdCB3YXMgaW5zdGFsbGVkIGFzIGEgZGVwZW5kZW5jeSkuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGFkYXRhKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLgogICAgICAgIDpwYXJhbSBtZXRhZGF0YTogVGhlIGluc3RhbmNlIG9mIDpjbGFzczpgTWV0YWRhdGFgIGRlc2NyaWJpbmcgdGhpcwogICAgICAgIGRpc3RyaWJ1dGlvbi4KICAgICAgICAiIiIKICAgICAgICBzZWxmLm1ldGFkYXRhID0gbWV0YWRhdGEKICAgICAgICBzZWxmLm5hbWUgPSBtZXRhZGF0YS5uYW1lCiAgICAgICAgc2VsZi5rZXkgPSBzZWxmLm5hbWUubG93ZXIoKSAgICAjIGZvciBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb25zCiAgICAgICAgc2VsZi52ZXJzaW9uID0gbWV0YWRhdGEudmVyc2lvbgogICAgICAgIHNlbGYubG9jYXRvciA9IE5vbmUKICAgICAgICBzZWxmLmRpZ2VzdCA9IE5vbmUKICAgICAgICBzZWxmLmV4dHJhcyA9IE5vbmUgICAgICAjIGFkZGl0aW9uYWwgZmVhdHVyZXMgcmVxdWVzdGVkCiAgICAgICAgc2VsZi5jb250ZXh0ID0gTm9uZSAgICAgIyBlbnZpcm9ubWVudCBtYXJrZXIgb3ZlcnJpZGVzCiAgICAgICAgc2VsZi5kb3dubG9hZF91cmxzID0gc2V0KCkKICAgICAgICBzZWxmLmRpZ2VzdHMgPSB7fQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNvdXJjZV91cmwoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGhlIHNvdXJjZSBhcmNoaXZlIGRvd25sb2FkIFVSTCBmb3IgdGhpcyBkaXN0cmlidXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYubWV0YWRhdGEuc291cmNlX3VybAoKICAgIGRvd25sb2FkX3VybCA9IHNvdXJjZV91cmwgICAjIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBuYW1lX2FuZF92ZXJzaW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEEgdXRpbGl0eSBwcm9wZXJ0eSB3aGljaCBkaXNwbGF5cyB0aGUgbmFtZSBhbmQgdmVyc2lvbiBpbiBwYXJlbnRoZXNlcy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gJyVzICglcyknICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByb3ZpZGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEEgc2V0IG9mIGRpc3RyaWJ1dGlvbiBuYW1lcyBhbmQgdmVyc2lvbnMgcHJvdmlkZWQgYnkgdGhpcyBkaXN0cmlidXRpb24uCiAgICAgICAgOnJldHVybjogQSBzZXQgb2YgIm5hbWUgKHZlcnNpb24pIiBzdHJpbmdzLgogICAgICAgICIiIgogICAgICAgIHBsaXN0ID0gc2VsZi5tZXRhZGF0YS5wcm92aWRlcwogICAgICAgIHMgPSAnJXMgKCVzKScgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCiAgICAgICAgaWYgcyBub3QgaW4gcGxpc3Q6CiAgICAgICAgICAgIHBsaXN0LmFwcGVuZChzKQogICAgICAgIHJldHVybiBwbGlzdAoKICAgIGRlZiBfZ2V0X3JlcXVpcmVtZW50cyhzZWxmLCByZXFfYXR0cik6CiAgICAgICAgbWQgPSBzZWxmLm1ldGFkYXRhCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdHZXR0aW5nIHJlcXVpcmVtZW50cyBmcm9tIG1ldGFkYXRhICVyJywgbWQudG9kaWN0KCkpCiAgICAgICAgcmVxdHMgPSBnZXRhdHRyKG1kLCByZXFfYXR0cikKICAgICAgICByZXR1cm4gc2V0KG1kLmdldF9yZXF1aXJlbWVudHMocmVxdHMsIGV4dHJhcz1zZWxmLmV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PXNlbGYuY29udGV4dCkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcnVuX3JlcXVpcmVzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9nZXRfcmVxdWlyZW1lbnRzKCdydW5fcmVxdWlyZXMnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG1ldGFfcmVxdWlyZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9yZXF1aXJlbWVudHMoJ21ldGFfcmVxdWlyZXMnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGJ1aWxkX3JlcXVpcmVzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9nZXRfcmVxdWlyZW1lbnRzKCdidWlsZF9yZXF1aXJlcycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdGVzdF9yZXF1aXJlcyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X3JlcXVpcmVtZW50cygndGVzdF9yZXF1aXJlcycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZGV2X3JlcXVpcmVzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9nZXRfcmVxdWlyZW1lbnRzKCdkZXZfcmVxdWlyZXMnKQoKICAgIGRlZiBtYXRjaGVzX3JlcXVpcmVtZW50KHNlbGYsIHJlcSk6CiAgICAgICAgIiIiCiAgICAgICAgU2F5IGlmIHRoaXMgaW5zdGFuY2UgbWF0Y2hlcyAoZnVsZmlsbHMpIGEgcmVxdWlyZW1lbnQuCiAgICAgICAgOnBhcmFtIHJlcTogVGhlIHJlcXVpcmVtZW50IHRvIG1hdGNoLgogICAgICAgIDpydHlwZSByZXE6IHN0cgogICAgICAgIDpyZXR1cm46IFRydWUgaWYgaXQgbWF0Y2hlcywgZWxzZSBGYWxzZS4KICAgICAgICAiIiIKICAgICAgICAjIFJlcXVpcmVtZW50IG1heSBjb250YWluIGV4dHJhcyAtIHBhcnNlIHRvIGxvc2UgdGhvc2UKICAgICAgICAjIGZyb20gd2hhdCdzIHBhc3NlZCB0byB0aGUgbWF0Y2hlcgogICAgICAgIHIgPSBwYXJzZV9yZXF1aXJlbWVudChyZXEpCiAgICAgICAgc2NoZW1lID0gZ2V0X3NjaGVtZShzZWxmLm1ldGFkYXRhLnNjaGVtZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIG1hdGNoZXIgPSBzY2hlbWUubWF0Y2hlcihyLnJlcXVpcmVtZW50KQogICAgICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjoKICAgICAgICAgICAgIyBYWFggY29tcGF0LW1vZGUgaWYgY2Fubm90IHJlYWQgdGhlIHZlcnNpb24KICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ2NvdWxkIG5vdCByZWFkIHZlcnNpb24gJXIgLSB1c2luZyBuYW1lIG9ubHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXEpCiAgICAgICAgICAgIG5hbWUgPSByZXEuc3BsaXQoKVswXQogICAgICAgICAgICBtYXRjaGVyID0gc2NoZW1lLm1hdGNoZXIobmFtZSkKCiAgICAgICAgbmFtZSA9IG1hdGNoZXIua2V5ICAgIyBjYXNlLWluc2Vuc2l0aXZlCgogICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgZm9yIHAgaW4gc2VsZi5wcm92aWRlczoKICAgICAgICAgICAgcF9uYW1lLCBwX3ZlciA9IHBhcnNlX25hbWVfYW5kX3ZlcnNpb24ocCkKICAgICAgICAgICAgaWYgcF9uYW1lICE9IG5hbWU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBtYXRjaGVyLm1hdGNoKHBfdmVyKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZXhjZXB0IFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGluc3RhbmNlLAogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuc291cmNlX3VybDoKICAgICAgICAgICAgc3VmZml4ID0gJyBbJXNdJyAlIHNlbGYuc291cmNlX3VybAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN1ZmZpeCA9ICcnCiAgICAgICAgcmV0dXJuICc8RGlzdHJpYnV0aW9uICVzICglcyklcz4nICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uLCBzdWZmaXgpCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgU2VlIGlmIHRoaXMgZGlzdHJpYnV0aW9uIGlzIHRoZSBzYW1lIGFzIGFub3RoZXIuCiAgICAgICAgOnBhcmFtIG90aGVyOiBUaGUgZGlzdHJpYnV0aW9uIHRvIGNvbXBhcmUgd2l0aC4gVG8gYmUgZXF1YWwgdG8gb25lCiAgICAgICAgICAgICAgICAgICAgICBhbm90aGVyLiBkaXN0cmlidXRpb25zIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlLCBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiBhbmQgc291cmNlX3VybC4KICAgICAgICA6cmV0dXJuOiBUcnVlIGlmIGl0IGlzIHRoZSBzYW1lLCBlbHNlIEZhbHNlLgogICAgICAgICIiIgogICAgICAgIGlmIHR5cGUob3RoZXIpIGlzIG5vdCB0eXBlKHNlbGYpOgogICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IChzZWxmLm5hbWUgPT0gb3RoZXIubmFtZSBhbmQKICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmVyc2lvbiA9PSBvdGhlci52ZXJzaW9uIGFuZAogICAgICAgICAgICAgICAgICAgICAgc2VsZi5zb3VyY2VfdXJsID09IG90aGVyLnNvdXJjZV91cmwpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDb21wdXRlIGhhc2ggaW4gYSB3YXkgd2hpY2ggbWF0Y2hlcyB0aGUgZXF1YWxpdHkgdGVzdC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaGFzaChzZWxmLm5hbWUpICsgaGFzaChzZWxmLnZlcnNpb24pICsgaGFzaChzZWxmLnNvdXJjZV91cmwpCgoKY2xhc3MgQmFzZUluc3RhbGxlZERpc3RyaWJ1dGlvbihEaXN0cmlidXRpb24pOgogICAgIiIiCiAgICBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBpbnN0YWxsZWQgZGlzdHJpYnV0aW9ucyAod2hldGhlciBQRVAgMzc2IG9yCiAgICBsZWdhY3kpLgogICAgIiIiCgogICAgaGFzaGVyID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRhZGF0YSwgcGF0aCwgZW52PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCiAgICAgICAgOnBhcmFtIG1ldGFkYXRhOiBBbiBpbnN0YW5jZSBvZiA6Y2xhc3M6YE1ldGFkYXRhYCB3aGljaCBkZXNjcmliZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24uIFRoaXMgd2lsbCBub3JtYWxseSBoYXZlIGJlZW4gaW5pdGlhbGlzZWQKICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gYSBtZXRhZGF0YSBmaWxlIGluIHRoZSBgYHBhdGhgYC4KICAgICAgICA6cGFyYW0gcGF0aDogICAgIFRoZSBwYXRoIG9mIHRoZSBgYC5kaXN0LWluZm9gYCBvciBgYC5lZ2ctaW5mb2BgCiAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgZm9yIHRoZSBkaXN0cmlidXRpb24uCiAgICAgICAgOnBhcmFtIGVudjogICAgICBUaGlzIGlzIG5vcm1hbGx5IHRoZSA6Y2xhc3M6YERpc3RyaWJ1dGlvblBhdGhgCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSB3aGVyZSB0aGlzIGRpc3RyaWJ1dGlvbiB3YXMgZm91bmQuCiAgICAgICAgIiIiCiAgICAgICAgc3VwZXIoQmFzZUluc3RhbGxlZERpc3RyaWJ1dGlvbiwgc2VsZikuX19pbml0X18obWV0YWRhdGEpCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAgICAgIHNlbGYuZGlzdF9wYXRoID0gZW52CgogICAgZGVmIGdldF9oYXNoKHNlbGYsIGRhdGEsIGhhc2hlcj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIGhhc2ggb2Ygc29tZSBkYXRhLCB1c2luZyBhIHBhcnRpY3VsYXIgaGFzaCBhbGdvcml0aG0sIGlmCiAgICAgICAgc3BlY2lmaWVkLgoKICAgICAgICA6cGFyYW0gZGF0YTogVGhlIGRhdGEgdG8gYmUgaGFzaGVkLgogICAgICAgIDp0eXBlIGRhdGE6IGJ5dGVzCiAgICAgICAgOnBhcmFtIGhhc2hlcjogVGhlIG5hbWUgb2YgYSBoYXNoIGltcGxlbWVudGF0aW9uLCBzdXBwb3J0ZWQgYnkgaGFzaGxpYiwKICAgICAgICAgICAgICAgICAgICAgICBvciBgYE5vbmVgYC4gRXhhbXBsZXMgb2YgdmFsaWQgdmFsdWVzIGFyZSBgYCdzaGExJ2BgLAogICAgICAgICAgICAgICAgICAgICAgIGBgJ3NoYTIyNCdgYCwgYGAnc2hhMzg0J2BgLCAnYGBzaGEyNTYnYGAsIGBgJ21kNSdgYCBhbmQKICAgICAgICAgICAgICAgICAgICAgICBgYCdzaGE1MTInYGAuIElmIG5vIGhhc2hlciBpcyBzcGVjaWZpZWQsIHRoZSBgYGhhc2hlcmBgCiAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlIG9mIHRoZSA6Y2xhc3M6YEluc3RhbGxlZERpc3RyaWJ1dGlvbmAgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAgICBpcyB1c2VkLiBJZiB0aGUgaGFzaGVyIGlzIGRldGVybWluZWQgdG8gYmUgYGBOb25lYGAsIE1ENQogICAgICAgICAgICAgICAgICAgICAgIGlzIHVzZWQgYXMgdGhlIGhhc2hpbmcgYWxnb3JpdGhtLgogICAgICAgIDpyZXR1cm5zOiBUaGUgaGFzaCBvZiB0aGUgZGF0YS4gSWYgYSBoYXNoZXIgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLAogICAgICAgICAgICAgICAgICB0aGUgcmV0dXJuZWQgaGFzaCB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhlIHNwZWNpZmllZCBoYXNoZXIKICAgICAgICAgICAgICAgICAgZm9sbG93ZWQgYnkgJz0nLgogICAgICAgIDpydHlwZTogc3RyCiAgICAgICAgIiIiCiAgICAgICAgaWYgaGFzaGVyIGlzIE5vbmU6CiAgICAgICAgICAgIGhhc2hlciA9IHNlbGYuaGFzaGVyCiAgICAgICAgaWYgaGFzaGVyIGlzIE5vbmU6CiAgICAgICAgICAgIGhhc2hlciA9IGhhc2hsaWIubWQ1CiAgICAgICAgICAgIHByZWZpeCA9ICcnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaGFzaGVyID0gZ2V0YXR0cihoYXNobGliLCBoYXNoZXIpCiAgICAgICAgICAgIHByZWZpeCA9ICclcz0nICUgc2VsZi5oYXNoZXIKICAgICAgICBkaWdlc3QgPSBoYXNoZXIoZGF0YSkuZGlnZXN0KCkKICAgICAgICBkaWdlc3QgPSBiYXNlNjQudXJsc2FmZV9iNjRlbmNvZGUoZGlnZXN0KS5yc3RyaXAoYic9JykuZGVjb2RlKCdhc2NpaScpCiAgICAgICAgcmV0dXJuICclcyVzJyAlIChwcmVmaXgsIGRpZ2VzdCkKCgpjbGFzcyBJbnN0YWxsZWREaXN0cmlidXRpb24oQmFzZUluc3RhbGxlZERpc3RyaWJ1dGlvbik6CiAgICAiIiIKICAgIENyZWF0ZWQgd2l0aCB0aGUgKnBhdGgqIG9mIHRoZSBgYC5kaXN0LWluZm9gYCBkaXJlY3RvcnkgcHJvdmlkZWQgdG8gdGhlCiAgICBjb25zdHJ1Y3Rvci4gSXQgcmVhZHMgdGhlIG1ldGFkYXRhIGNvbnRhaW5lZCBpbiBgYHB5ZGlzdC5qc29uYGAgd2hlbiBpdCBpcwogICAgaW5zdGFudGlhdGVkLiwgb3IgdXNlcyBhIHBhc3NlZCBpbiBNZXRhZGF0YSBpbnN0YW5jZSAodXNlZnVsIGZvciB3aGVuCiAgICBkcnktcnVuIG1vZGUgaXMgYmVpbmcgdXNlZCkuCiAgICAiIiIKCiAgICBoYXNoZXIgPSAnc2hhMjU2JwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBtZXRhZGF0YT1Ob25lLCBlbnY9Tm9uZSk6CiAgICAgICAgc2VsZi5maW5kZXIgPSBmaW5kZXIgPSByZXNvdXJjZXMuZmluZGVyX2Zvcl9wYXRoKHBhdGgpCiAgICAgICAgaWYgZmluZGVyIGlzIE5vbmU6CiAgICAgICAgICAgIGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UgKCkKICAgICAgICBpZiBlbnYgYW5kIGVudi5fY2FjaGVfZW5hYmxlZCBhbmQgcGF0aCBpbiBlbnYuX2NhY2hlLnBhdGg6CiAgICAgICAgICAgIG1ldGFkYXRhID0gZW52Ll9jYWNoZS5wYXRoW3BhdGhdLm1ldGFkYXRhCiAgICAgICAgZWxpZiBtZXRhZGF0YSBpcyBOb25lOgogICAgICAgICAgICByID0gZmluZGVyLmZpbmQoTUVUQURBVEFfRklMRU5BTUUpCiAgICAgICAgICAgICMgVGVtcG9yYXJ5IC0gZm9yIFdoZWVsIDAuMjMgc3VwcG9ydAogICAgICAgICAgICBpZiByIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByID0gZmluZGVyLmZpbmQoV0hFRUxfTUVUQURBVEFfRklMRU5BTUUpCiAgICAgICAgICAgICMgVGVtcG9yYXJ5IC0gZm9yIGxlZ2FjeSBzdXBwb3J0CiAgICAgICAgICAgIGlmIHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIHIgPSBmaW5kZXIuZmluZCgnTUVUQURBVEEnKQogICAgICAgICAgICBpZiByIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdubyAlcyBmb3VuZCBpbiAlcycgJSAoTUVUQURBVEFfRklMRU5BTUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCkpCiAgICAgICAgICAgIHdpdGggY29udGV4dGxpYi5jbG9zaW5nKHIuYXNfc3RyZWFtKCkpIGFzIHN0cmVhbToKICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEoZmlsZW9iaj1zdHJlYW0sIHNjaGVtZT0nbGVnYWN5JykKCiAgICAgICAgc3VwZXIoSW5zdGFsbGVkRGlzdHJpYnV0aW9uLCBzZWxmKS5fX2luaXRfXyhtZXRhZGF0YSwgcGF0aCwgZW52KQoKICAgICAgICBpZiBlbnYgYW5kIGVudi5fY2FjaGVfZW5hYmxlZDoKICAgICAgICAgICAgZW52Ll9jYWNoZS5hZGQoc2VsZikKCiAgICAgICAgdHJ5OgogICAgICAgICAgICByID0gZmluZGVyLmZpbmQoJ1JFUVVFU1RFRCcpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlICgpCiAgICAgICAgc2VsZi5yZXF1ZXN0ZWQgPSByIGlzIG5vdCBOb25lCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnPEluc3RhbGxlZERpc3RyaWJ1dGlvbiAlciAlcyBhdCAlcj4nICUgKAogICAgICAgICAgICBzZWxmLm5hbWUsIHNlbGYudmVyc2lvbiwgc2VsZi5wYXRoKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiJXMgJXMiICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKQoKICAgIGRlZiBfZ2V0X3JlY29yZHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IHRoZSBsaXN0IG9mIGluc3RhbGxlZCBmaWxlcyBmb3IgdGhlIGRpc3RyaWJ1dGlvbgogICAgICAgIDpyZXR1cm46IEEgbGlzdCBvZiB0dXBsZXMgb2YgcGF0aCwgaGFzaCBhbmQgc2l6ZS4gTm90ZSB0aGF0IGhhc2ggYW5kCiAgICAgICAgICAgICAgICAgc2l6ZSBtaWdodCBiZSBgYE5vbmVgYCBmb3Igc29tZSBlbnRyaWVzLiBUaGUgcGF0aCBpcyBleGFjdGx5CiAgICAgICAgICAgICAgICAgYXMgc3RvcmVkIGluIHRoZSBmaWxlICh3aGljaCBpcyBhcyBpbiBQRVAgMzc2KS4KICAgICAgICAiIiIKICAgICAgICByZXN1bHRzID0gW10KICAgICAgICByID0gc2VsZi5nZXRfZGlzdGluZm9fcmVzb3VyY2UoJ1JFQ09SRCcpCiAgICAgICAgd2l0aCBjb250ZXh0bGliLmNsb3Npbmcoci5hc19zdHJlYW0oKSkgYXMgc3RyZWFtOgogICAgICAgICAgICB3aXRoIENTVlJlYWRlcihzdHJlYW09c3RyZWFtKSBhcyByZWNvcmRfcmVhZGVyOgogICAgICAgICAgICAgICAgIyBCYXNlIGxvY2F0aW9uIGlzIHBhcmVudCBkaXIgb2YgLmRpc3QtaW5mbyBkaXIKICAgICAgICAgICAgICAgICNiYXNlX2xvY2F0aW9uID0gb3MucGF0aC5kaXJuYW1lKHNlbGYucGF0aCkKICAgICAgICAgICAgICAgICNiYXNlX2xvY2F0aW9uID0gb3MucGF0aC5hYnNwYXRoKGJhc2VfbG9jYXRpb24pCiAgICAgICAgICAgICAgICBmb3Igcm93IGluIHJlY29yZF9yZWFkZXI6CiAgICAgICAgICAgICAgICAgICAgbWlzc2luZyA9IFtOb25lIGZvciBpIGluIHJhbmdlKGxlbihyb3cpLCAzKV0KICAgICAgICAgICAgICAgICAgICBwYXRoLCBjaGVja3N1bSwgc2l6ZSA9IHJvdyArIG1pc3NpbmcKICAgICAgICAgICAgICAgICAgICAjaWYgbm90IG9zLnBhdGguaXNhYnMocGF0aCk6CiAgICAgICAgICAgICAgICAgICAgIyAgICBwYXRoID0gcGF0aC5yZXBsYWNlKCcvJywgb3Muc2VwKQogICAgICAgICAgICAgICAgICAgICMgICAgcGF0aCA9IG9zLnBhdGguam9pbihiYXNlX2xvY2F0aW9uLCBwYXRoKQogICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKChwYXRoLCBjaGVja3N1bSwgc2l6ZSkpCiAgICAgICAgcmV0dXJuIHJlc3VsdHMKCiAgICBAY2FjaGVkX3Byb3BlcnR5CiAgICBkZWYgZXhwb3J0cyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIGluZm9ybWF0aW9uIGV4cG9ydGVkIGJ5IHRoaXMgZGlzdHJpYnV0aW9uLgogICAgICAgIDpyZXR1cm46IEEgZGljdGlvbmFyeSBvZiBleHBvcnRzLCBtYXBwaW5nIGFuIGV4cG9ydCBjYXRlZ29yeSB0byBhIGRpY3QKICAgICAgICAgICAgICAgICBvZiA6Y2xhc3M6YEV4cG9ydEVudHJ5YCBpbnN0YW5jZXMgZGVzY3JpYmluZyB0aGUgaW5kaXZpZHVhbAogICAgICAgICAgICAgICAgIGV4cG9ydCBlbnRyaWVzLCBhbmQga2V5ZWQgYnkgbmFtZS4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSB7fQogICAgICAgIHIgPSBzZWxmLmdldF9kaXN0aW5mb19yZXNvdXJjZShFWFBPUlRTX0ZJTEVOQU1FKQogICAgICAgIGlmIHI6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYucmVhZF9leHBvcnRzKCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHJlYWRfZXhwb3J0cyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZWFkIGV4cG9ydHMgZGF0YSBmcm9tIGEgZmlsZSBpbiAuaW5pIGZvcm1hdC4KCiAgICAgICAgOnJldHVybjogQSBkaWN0aW9uYXJ5IG9mIGV4cG9ydHMsIG1hcHBpbmcgYW4gZXhwb3J0IGNhdGVnb3J5IHRvIGEgbGlzdAogICAgICAgICAgICAgICAgIG9mIDpjbGFzczpgRXhwb3J0RW50cnlgIGluc3RhbmNlcyBkZXNjcmliaW5nIHRoZSBpbmRpdmlkdWFsCiAgICAgICAgICAgICAgICAgZXhwb3J0IGVudHJpZXMuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0ge30KICAgICAgICByID0gc2VsZi5nZXRfZGlzdGluZm9fcmVzb3VyY2UoRVhQT1JUU19GSUxFTkFNRSkKICAgICAgICBpZiByOgogICAgICAgICAgICB3aXRoIGNvbnRleHRsaWIuY2xvc2luZyhyLmFzX3N0cmVhbSgpKSBhcyBzdHJlYW06CiAgICAgICAgICAgICAgICByZXN1bHQgPSByZWFkX2V4cG9ydHMoc3RyZWFtKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgd3JpdGVfZXhwb3J0cyhzZWxmLCBleHBvcnRzKToKICAgICAgICAiIiIKICAgICAgICBXcml0ZSBhIGRpY3Rpb25hcnkgb2YgZXhwb3J0cyB0byBhIGZpbGUgaW4gLmluaSBmb3JtYXQuCiAgICAgICAgOnBhcmFtIGV4cG9ydHM6IEEgZGljdGlvbmFyeSBvZiBleHBvcnRzLCBtYXBwaW5nIGFuIGV4cG9ydCBjYXRlZ29yeSB0bwogICAgICAgICAgICAgICAgICAgICAgICBhIGxpc3Qgb2YgOmNsYXNzOmBFeHBvcnRFbnRyeWAgaW5zdGFuY2VzIGRlc2NyaWJpbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGl2aWR1YWwgZXhwb3J0IGVudHJpZXMuCiAgICAgICAgIiIiCiAgICAgICAgcmYgPSBzZWxmLmdldF9kaXN0aW5mb19maWxlKEVYUE9SVFNfRklMRU5BTUUpCiAgICAgICAgd2l0aCBvcGVuKHJmLCAndycpIGFzIGY6CiAgICAgICAgICAgIHdyaXRlX2V4cG9ydHMoZXhwb3J0cywgZikKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3BhdGgoc2VsZiwgcmVsYXRpdmVfcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgTk9URTogVGhpcyBBUEkgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLgoKICAgICAgICBSZXR1cm4gdGhlIGFic29sdXRlIHBhdGggdG8gYSByZXNvdXJjZSBmaWxlIHdpdGggdGhlIGdpdmVuIHJlbGF0aXZlCiAgICAgICAgcGF0aC4KCiAgICAgICAgOnBhcmFtIHJlbGF0aXZlX3BhdGg6IFRoZSBwYXRoLCByZWxhdGl2ZSB0byAuZGlzdC1pbmZvLCBvZiB0aGUgcmVzb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgaW50ZXJlc3QuCiAgICAgICAgOnJldHVybjogVGhlIGFic29sdXRlIHBhdGggd2hlcmUgdGhlIHJlc291cmNlIGlzIHRvIGJlIGZvdW5kLgogICAgICAgICIiIgogICAgICAgIHIgPSBzZWxmLmdldF9kaXN0aW5mb19yZXNvdXJjZSgnUkVTT1VSQ0VTJykKICAgICAgICB3aXRoIGNvbnRleHRsaWIuY2xvc2luZyhyLmFzX3N0cmVhbSgpKSBhcyBzdHJlYW06CiAgICAgICAgICAgIHdpdGggQ1NWUmVhZGVyKHN0cmVhbT1zdHJlYW0pIGFzIHJlc291cmNlc19yZWFkZXI6CiAgICAgICAgICAgICAgICBmb3IgcmVsYXRpdmUsIGRlc3RpbmF0aW9uIGluIHJlc291cmNlc19yZWFkZXI6CiAgICAgICAgICAgICAgICAgICAgaWYgcmVsYXRpdmUgPT0gcmVsYXRpdmVfcGF0aDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uCiAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ25vIHJlc291cmNlIGZpbGUgd2l0aCByZWxhdGl2ZSBwYXRoICVyICcKICAgICAgICAgICAgICAgICAgICAgICAnaXMgaW5zdGFsbGVkJyAlIHJlbGF0aXZlX3BhdGgpCgogICAgZGVmIGxpc3RfaW5zdGFsbGVkX2ZpbGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEl0ZXJhdGVzIG92ZXIgdGhlIGBgUkVDT1JEYGAgZW50cmllcyBhbmQgcmV0dXJucyBhIHR1cGxlCiAgICAgICAgYGAocGF0aCwgaGFzaCwgc2l6ZSlgYCBmb3IgZWFjaCBsaW5lLgoKICAgICAgICA6cmV0dXJuczogaXRlcmF0b3Igb2YgKHBhdGgsIGhhc2gsIHNpemUpCiAgICAgICAgIiIiCiAgICAgICAgZm9yIHJlc3VsdCBpbiBzZWxmLl9nZXRfcmVjb3JkcygpOgogICAgICAgICAgICB5aWVsZCByZXN1bHQKCiAgICBkZWYgd3JpdGVfaW5zdGFsbGVkX2ZpbGVzKHNlbGYsIHBhdGhzLCBwcmVmaXgsIGRyeV9ydW49RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFdyaXRlcyB0aGUgYGBSRUNPUkRgYCBmaWxlLCB1c2luZyB0aGUgYGBwYXRoc2BgIGl0ZXJhYmxlIHBhc3NlZCBpbi4gQW55CiAgICAgICAgZXhpc3RpbmcgYGBSRUNPUkRgYCBmaWxlIGlzIHNpbGVudGx5IG92ZXJ3cml0dGVuLgoKICAgICAgICBwcmVmaXggaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiB0byB3cml0ZSBhYnNvbHV0ZSBwYXRocy4KICAgICAgICAiIiIKICAgICAgICBwcmVmaXggPSBvcy5wYXRoLmpvaW4ocHJlZml4LCAnJykKICAgICAgICBiYXNlID0gb3MucGF0aC5kaXJuYW1lKHNlbGYucGF0aCkKICAgICAgICBiYXNlX3VuZGVyX3ByZWZpeCA9IGJhc2Uuc3RhcnRzd2l0aChwcmVmaXgpCiAgICAgICAgYmFzZSA9IG9zLnBhdGguam9pbihiYXNlLCAnJykKICAgICAgICByZWNvcmRfcGF0aCA9IHNlbGYuZ2V0X2Rpc3RpbmZvX2ZpbGUoJ1JFQ09SRCcpCiAgICAgICAgbG9nZ2VyLmluZm8oJ2NyZWF0aW5nICVzJywgcmVjb3JkX3BhdGgpCiAgICAgICAgaWYgZHJ5X3J1bjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICB3aXRoIENTVldyaXRlcihyZWNvcmRfcGF0aCkgYXMgd3JpdGVyOgogICAgICAgICAgICBmb3IgcGF0aCBpbiBwYXRoczoKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCkgb3IgcGF0aC5lbmRzd2l0aCgoJy5weWMnLCAnLnB5bycpKToKICAgICAgICAgICAgICAgICAgICAjIGRvIG5vdCBwdXQgc2l6ZSBhbmQgaGFzaCwgYXMgaW4gUEVQLTM3NgogICAgICAgICAgICAgICAgICAgIGhhc2hfdmFsdWUgPSBzaXplID0gJycKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9ICclZCcgJSBvcy5wYXRoLmdldHNpemUocGF0aCkKICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgZnA6CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfdmFsdWUgPSBzZWxmLmdldF9oYXNoKGZwLnJlYWQoKSkKICAgICAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aChiYXNlKSBvciAoYmFzZV91bmRlcl9wcmVmaXggYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguc3RhcnRzd2l0aChwcmVmaXgpKToKICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5yZWxwYXRoKHBhdGgsIGJhc2UpCiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coKHBhdGgsIGhhc2hfdmFsdWUsIHNpemUpKQoKICAgICAgICAgICAgIyBhZGQgdGhlIFJFQ09SRCBmaWxlIGl0c2VsZgogICAgICAgICAgICBpZiByZWNvcmRfcGF0aC5zdGFydHN3aXRoKGJhc2UpOgogICAgICAgICAgICAgICAgcmVjb3JkX3BhdGggPSBvcy5wYXRoLnJlbHBhdGgocmVjb3JkX3BhdGgsIGJhc2UpCiAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdygocmVjb3JkX3BhdGgsICcnLCAnJykpCiAgICAgICAgcmV0dXJuIHJlY29yZF9wYXRoCgogICAgZGVmIGNoZWNrX2luc3RhbGxlZF9maWxlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDaGVja3MgdGhhdCB0aGUgaGFzaGVzIGFuZCBzaXplcyBvZiB0aGUgZmlsZXMgaW4gYGBSRUNPUkRgYCBhcmUKICAgICAgICBtYXRjaGVkIGJ5IHRoZSBmaWxlcyB0aGVtc2VsdmVzLiBSZXR1cm5zIGEgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mCiAgICAgICAgbWlzbWF0Y2hlcy4gRWFjaCBlbnRyeSBpbiB0aGUgbWlzbWF0Y2ggbGlzdCB3aWxsIGJlIGEgdHVwbGUgY29uc2lzdGluZwogICAgICAgIG9mIHRoZSBwYXRoLCAnZXhpc3RzJywgJ3NpemUnIG9yICdoYXNoJyBhY2NvcmRpbmcgdG8gd2hhdCBkaWRuJ3QgbWF0Y2gKICAgICAgICAoZXhpc3RlbmNlIGlzIGNoZWNrZWQgZmlyc3QsIHRoZW4gc2l6ZSwgdGhlbiBoYXNoKSwgdGhlIGV4cGVjdGVkCiAgICAgICAgdmFsdWUgYW5kIHRoZSBhY3R1YWwgdmFsdWUuCiAgICAgICAgIiIiCiAgICAgICAgbWlzbWF0Y2hlcyA9IFtdCiAgICAgICAgYmFzZSA9IG9zLnBhdGguZGlybmFtZShzZWxmLnBhdGgpCiAgICAgICAgcmVjb3JkX3BhdGggPSBzZWxmLmdldF9kaXN0aW5mb19maWxlKCdSRUNPUkQnKQogICAgICAgIGZvciBwYXRoLCBoYXNoX3ZhbHVlLCBzaXplIGluIHNlbGYubGlzdF9pbnN0YWxsZWRfZmlsZXMoKToKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNhYnMocGF0aCk6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGJhc2UsIHBhdGgpCiAgICAgICAgICAgIGlmIHBhdGggPT0gcmVjb3JkX3BhdGg6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CiAgICAgICAgICAgICAgICBtaXNtYXRjaGVzLmFwcGVuZCgocGF0aCwgJ2V4aXN0cycsIFRydWUsIEZhbHNlKSkKICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKICAgICAgICAgICAgICAgIGFjdHVhbF9zaXplID0gc3RyKG9zLnBhdGguZ2V0c2l6ZShwYXRoKSkKICAgICAgICAgICAgICAgIGlmIHNpemUgYW5kIGFjdHVhbF9zaXplICE9IHNpemU6CiAgICAgICAgICAgICAgICAgICAgbWlzbWF0Y2hlcy5hcHBlbmQoKHBhdGgsICdzaXplJywgc2l6ZSwgYWN0dWFsX3NpemUpKQogICAgICAgICAgICAgICAgZWxpZiBoYXNoX3ZhbHVlOgogICAgICAgICAgICAgICAgICAgIGlmICc9JyBpbiBoYXNoX3ZhbHVlOgogICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXIgPSBoYXNoX3ZhbHVlLnNwbGl0KCc9JywgMSlbMF0KICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXIgPSBOb25lCgogICAgICAgICAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBmOgogICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxfaGFzaCA9IHNlbGYuZ2V0X2hhc2goZi5yZWFkKCksIGhhc2hlcikKICAgICAgICAgICAgICAgICAgICAgICAgaWYgYWN0dWFsX2hhc2ggIT0gaGFzaF92YWx1ZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc21hdGNoZXMuYXBwZW5kKChwYXRoLCAnaGFzaCcsIGhhc2hfdmFsdWUsIGFjdHVhbF9oYXNoKSkKICAgICAgICByZXR1cm4gbWlzbWF0Y2hlcwoKICAgIEBjYWNoZWRfcHJvcGVydHkKICAgIGRlZiBzaGFyZWRfbG9jYXRpb25zKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEEgZGljdGlvbmFyeSBvZiBzaGFyZWQgbG9jYXRpb25zIHdob3NlIGtleXMgYXJlIGluIHRoZSBzZXQgJ3ByZWZpeCcsCiAgICAgICAgJ3B1cmVsaWInLCAncGxhdGxpYicsICdzY3JpcHRzJywgJ2hlYWRlcnMnLCAnZGF0YScgYW5kICduYW1lc3BhY2UnLgogICAgICAgIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGlzIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoYXQgY2F0ZWdvcnkgZm9yCiAgICAgICAgdGhpcyBkaXN0cmlidXRpb24sIGFuZCB0YWtlcyBpbnRvIGFjY291bnQgYW55IHBhdGhzIHNlbGVjdGVkIGJ5IHRoZQogICAgICAgIHVzZXIgYXQgaW5zdGFsbGF0aW9uIHRpbWUgKGUuZy4gdmlhIGNvbW1hbmQtbGluZSBhcmd1bWVudHMpLiBJbiB0aGUKICAgICAgICBjYXNlIG9mIHRoZSAnbmFtZXNwYWNlJyBrZXksIHRoaXMgd291bGQgYmUgYSBsaXN0IG9mIGFic29sdXRlIHBhdGhzCiAgICAgICAgZm9yIHRoZSByb290cyBvZiBuYW1lc3BhY2UgcGFja2FnZXMgaW4gdGhpcyBkaXN0cmlidXRpb24uCgogICAgICAgIFRoZSBmaXJzdCB0aW1lIHRoaXMgcHJvcGVydHkgaXMgYWNjZXNzZWQsIHRoZSByZWxldmFudCBpbmZvcm1hdGlvbiBpcwogICAgICAgIHJlYWQgZnJvbSB0aGUgU0hBUkVEIGZpbGUgaW4gdGhlIC5kaXN0LWluZm8gZGlyZWN0b3J5LgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IHt9CiAgICAgICAgc2hhcmVkX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCAnU0hBUkVEJykKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShzaGFyZWRfcGF0aCk6CiAgICAgICAgICAgIHdpdGggY29kZWNzLm9wZW4oc2hhcmVkX3BhdGgsICdyJywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKICAgICAgICAgICAgICAgIGxpbmVzID0gZi5yZWFkKCkuc3BsaXRsaW5lcygpCiAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgICAgICAgICAga2V5LCB2YWx1ZSA9IGxpbmUuc3BsaXQoJz0nLCAxKQogICAgICAgICAgICAgICAgaWYga2V5ID09ICduYW1lc3BhY2UnOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRkZWZhdWx0KGtleSwgW10pLmFwcGVuZCh2YWx1ZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgd3JpdGVfc2hhcmVkX2xvY2F0aW9ucyhzZWxmLCBwYXRocywgZHJ5X3J1bj1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgV3JpdGUgc2hhcmVkIGxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIHRoZSBTSEFSRUQgZmlsZSBpbiAuZGlzdC1pbmZvLgogICAgICAgIDpwYXJhbSBwYXRoczogQSBkaWN0aW9uYXJ5IGFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKICAgICAgICA6bWV0aDpgc2hhcmVkX2xvY2F0aW9uc2AuCiAgICAgICAgOnBhcmFtIGRyeV9ydW46IElmIFRydWUsIHRoZSBhY3Rpb24gaXMgbG9nZ2VkIGJ1dCBubyBmaWxlIGlzIGFjdHVhbGx5CiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4uCiAgICAgICAgOnJldHVybjogVGhlIHBhdGggb2YgdGhlIGZpbGUgd3JpdHRlbiB0by4KICAgICAgICAiIiIKICAgICAgICBzaGFyZWRfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhdGgsICdTSEFSRUQnKQogICAgICAgIGxvZ2dlci5pbmZvKCdjcmVhdGluZyAlcycsIHNoYXJlZF9wYXRoKQogICAgICAgIGlmIGRyeV9ydW46CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgbGluZXMgPSBbXQogICAgICAgIGZvciBrZXkgaW4gKCdwcmVmaXgnLCAnbGliJywgJ2hlYWRlcnMnLCAnc2NyaXB0cycsICdkYXRhJyk6CiAgICAgICAgICAgIHBhdGggPSBwYXRoc1trZXldCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aHNba2V5XSk6CiAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoJyVzPSVzJyAlIChrZXksICBwYXRoKSkKICAgICAgICBmb3IgbnMgaW4gcGF0aHMuZ2V0KCduYW1lc3BhY2UnLCAoKSk6CiAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgnbmFtZXNwYWNlPSVzJyAlIG5zKQoKICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHNoYXJlZF9wYXRoLCAndycsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGY6CiAgICAgICAgICAgIGYud3JpdGUoJ1xuJy5qb2luKGxpbmVzKSkKICAgICAgICByZXR1cm4gc2hhcmVkX3BhdGgKCiAgICBkZWYgZ2V0X2Rpc3RpbmZvX3Jlc291cmNlKHNlbGYsIHBhdGgpOgogICAgICAgIGlmIHBhdGggbm90IGluIERJU1RfRklMRVM6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ2ludmFsaWQgcGF0aCBmb3IgYSBkaXN0LWluZm8gZmlsZTogJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclciBhdCAlcicgJSAocGF0aCwgc2VsZi5wYXRoKSkKICAgICAgICBmaW5kZXIgPSByZXNvdXJjZXMuZmluZGVyX2Zvcl9wYXRoKHNlbGYucGF0aCkKICAgICAgICBpZiBmaW5kZXIgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignVW5hYmxlIHRvIGdldCBhIGZpbmRlciBmb3IgJXMnICUgc2VsZi5wYXRoKQogICAgICAgIHJldHVybiBmaW5kZXIuZmluZChwYXRoKQoKICAgIGRlZiBnZXRfZGlzdGluZm9fZmlsZShzZWxmLCBwYXRoKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgcGF0aCBsb2NhdGVkIHVuZGVyIHRoZSBgYC5kaXN0LWluZm9gYCBkaXJlY3RvcnkuIFJldHVybnMgYQogICAgICAgIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGguCgogICAgICAgIDpwYXJhbWV0ZXIgcGF0aDogYSBgYCcvJ2BgLXNlcGFyYXRlZCBwYXRoIHJlbGF0aXZlIHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgYGAuZGlzdC1pbmZvYGAgZGlyZWN0b3J5IG9yIGFuIGFic29sdXRlIHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICBJZiAqcGF0aCogaXMgYW4gYWJzb2x1dGUgcGF0aCBhbmQgZG9lc24ndCBzdGFydAogICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgYGAuZGlzdC1pbmZvYGAgZGlyZWN0b3J5IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICBhIDpjbGFzczpgRGlzdGxpYkV4Y2VwdGlvbmAgaXMgcmFpc2VkCiAgICAgICAgOnR5cGUgcGF0aDogc3RyCiAgICAgICAgOnJ0eXBlOiBzdHIKICAgICAgICAiIiIKICAgICAgICAjIENoZWNrIGlmIGl0IGlzIGFuIGFic29sdXRlIHBhdGggICMgWFhYIHVzZSByZWxwYXRoLCBhZGQgdGVzdHMKICAgICAgICBpZiBwYXRoLmZpbmQob3Muc2VwKSA+PSAwOgogICAgICAgICAgICAjIGl0J3MgYW4gYWJzb2x1dGUgcGF0aD8KICAgICAgICAgICAgZGlzdGluZm9fZGlybmFtZSwgcGF0aCA9IHBhdGguc3BsaXQob3Muc2VwKVstMjpdCiAgICAgICAgICAgIGlmIGRpc3RpbmZvX2Rpcm5hbWUgIT0gc2VsZi5wYXRoLnNwbGl0KG9zLnNlcClbLTFdOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAnZGlzdC1pbmZvIGZpbGUgJXIgZG9lcyBub3QgYmVsb25nIHRvIHRoZSAlciAlcyAnCiAgICAgICAgICAgICAgICAgICAgJ2Rpc3RyaWJ1dGlvbicgJSAocGF0aCwgc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pKQoKICAgICAgICAjIFRoZSBmaWxlIG11c3QgYmUgcmVsYXRpdmUKICAgICAgICBpZiBwYXRoIG5vdCBpbiBESVNUX0ZJTEVTOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdpbnZhbGlkIHBhdGggZm9yIGEgZGlzdC1pbmZvIGZpbGU6ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXIgYXQgJXInICUgKHBhdGgsIHNlbGYucGF0aCkpCgogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCBwYXRoKQoKICAgIGRlZiBsaXN0X2Rpc3RpbmZvX2ZpbGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEl0ZXJhdGVzIG92ZXIgdGhlIGBgUkVDT1JEYGAgZW50cmllcyBhbmQgcmV0dXJucyBwYXRocyBmb3IgZWFjaCBsaW5lIGlmCiAgICAgICAgdGhlIHBhdGggaXMgcG9pbnRpbmcgdG8gYSBmaWxlIGxvY2F0ZWQgaW4gdGhlIGBgLmRpc3QtaW5mb2BgIGRpcmVjdG9yeQogICAgICAgIG9yIG9uZSBvZiBpdHMgc3ViZGlyZWN0b3JpZXMuCgogICAgICAgIDpyZXR1cm5zOiBpdGVyYXRvciBvZiBwYXRocwogICAgICAgICIiIgogICAgICAgIGJhc2UgPSBvcy5wYXRoLmRpcm5hbWUoc2VsZi5wYXRoKQogICAgICAgIGZvciBwYXRoLCBjaGVja3N1bSwgc2l6ZSBpbiBzZWxmLl9nZXRfcmVjb3JkcygpOgogICAgICAgICAgICAjIFhYWCBhZGQgc2VwYXJhdG9yIG9yIHVzZSByZWFsIHJlbHBhdGggYWxnbwogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2FicyhwYXRoKToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oYmFzZSwgcGF0aCkKICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKHNlbGYucGF0aCk6CiAgICAgICAgICAgICAgICB5aWVsZCBwYXRoCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIChpc2luc3RhbmNlKG90aGVyLCBJbnN0YWxsZWREaXN0cmlidXRpb24pIGFuZAogICAgICAgICAgICAgICAgc2VsZi5wYXRoID09IG90aGVyLnBhdGgpCgogICAgIyBTZWUgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9yZWZlcmVuY2UvZGF0YW1vZGVsI29iamVjdC5fX2hhc2hfXwogICAgX19oYXNoX18gPSBvYmplY3QuX19oYXNoX18KCgpjbGFzcyBFZ2dJbmZvRGlzdHJpYnV0aW9uKEJhc2VJbnN0YWxsZWREaXN0cmlidXRpb24pOgogICAgIiIiQ3JlYXRlZCB3aXRoIHRoZSAqcGF0aCogb2YgdGhlIGBgLmVnZy1pbmZvYGAgZGlyZWN0b3J5IG9yIGZpbGUgcHJvdmlkZWQKICAgIHRvIHRoZSBjb25zdHJ1Y3Rvci4gSXQgcmVhZHMgdGhlIG1ldGFkYXRhIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSBpdHNlbGYsIG9yCiAgICBpZiB0aGUgZ2l2ZW4gcGF0aCBoYXBwZW5zIHRvIGJlIGEgZGlyZWN0b3J5LCB0aGUgbWV0YWRhdGEgaXMgcmVhZCBmcm9tIHRoZQogICAgZmlsZSBgYFBLRy1JTkZPYGAgdW5kZXIgdGhhdCBkaXJlY3RvcnkuIiIiCgogICAgcmVxdWVzdGVkID0gVHJ1ZSAgICAjIGFzIHdlIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcsIGFzc3VtZSBpdCB3YXMKICAgIHNoYXJlZF9sb2NhdGlvbnMgPSB7fQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBlbnY9Tm9uZSk6CiAgICAgICAgZGVmIHNldF9uYW1lX2FuZF92ZXJzaW9uKHMsIG4sIHYpOgogICAgICAgICAgICBzLm5hbWUgPSBuCiAgICAgICAgICAgIHMua2V5ID0gbi5sb3dlcigpICAgIyBmb3IgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29ucwogICAgICAgICAgICBzLnZlcnNpb24gPSB2CgogICAgICAgIHNlbGYucGF0aCA9IHBhdGgKICAgICAgICBzZWxmLmRpc3RfcGF0aCA9IGVudgogICAgICAgIGlmIGVudiBhbmQgZW52Ll9jYWNoZV9lbmFibGVkIGFuZCBwYXRoIGluIGVudi5fY2FjaGVfZWdnLnBhdGg6CiAgICAgICAgICAgIG1ldGFkYXRhID0gZW52Ll9jYWNoZV9lZ2cucGF0aFtwYXRoXS5tZXRhZGF0YQogICAgICAgICAgICBzZXRfbmFtZV9hbmRfdmVyc2lvbihzZWxmLCBtZXRhZGF0YS5uYW1lLCBtZXRhZGF0YS52ZXJzaW9uKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1ldGFkYXRhID0gc2VsZi5fZ2V0X21ldGFkYXRhKHBhdGgpCgogICAgICAgICAgICAjIE5lZWQgdG8gYmUgc2V0IGJlZm9yZSBjYWNoaW5nCiAgICAgICAgICAgIHNldF9uYW1lX2FuZF92ZXJzaW9uKHNlbGYsIG1ldGFkYXRhLm5hbWUsIG1ldGFkYXRhLnZlcnNpb24pCgogICAgICAgICAgICBpZiBlbnYgYW5kIGVudi5fY2FjaGVfZW5hYmxlZDoKICAgICAgICAgICAgICAgIGVudi5fY2FjaGVfZWdnLmFkZChzZWxmKQogICAgICAgIHN1cGVyKEVnZ0luZm9EaXN0cmlidXRpb24sIHNlbGYpLl9faW5pdF9fKG1ldGFkYXRhLCBwYXRoLCBlbnYpCgogICAgZGVmIF9nZXRfbWV0YWRhdGEoc2VsZiwgcGF0aCk6CiAgICAgICAgcmVxdWlyZXMgPSBOb25lCgogICAgICAgIGRlZiBwYXJzZV9yZXF1aXJlc19kYXRhKGRhdGEpOgogICAgICAgICAgICAiIiJDcmVhdGUgYSBsaXN0IG9mIGRlcGVuZGVuY2llcyBmcm9tIGEgcmVxdWlyZXMudHh0IGZpbGUuCgogICAgICAgICAgICAqZGF0YSo6IHRoZSBjb250ZW50cyBvZiBhIHNldHVwdG9vbHMtcHJvZHVjZWQgcmVxdWlyZXMudHh0IGZpbGUuCiAgICAgICAgICAgICIiIgogICAgICAgICAgICByZXFzID0gW10KICAgICAgICAgICAgbGluZXMgPSBkYXRhLnNwbGl0bGluZXMoKQogICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnWycpOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdVbmV4cGVjdGVkIGxpbmU6IHF1aXR0aW5nIHJlcXVpcmVtZW50IHNjYW46ICVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICByID0gcGFyc2VfcmVxdWlyZW1lbnQobGluZSkKICAgICAgICAgICAgICAgIGlmIG5vdCByOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdOb3QgcmVjb2duaXNlZCBhcyBhIHJlcXVpcmVtZW50OiAlcicsIGxpbmUpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIHIuZXh0cmFzOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdleHRyYSByZXF1aXJlbWVudHMgaW4gcmVxdWlyZXMudHh0IGFyZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vdCBzdXBwb3J0ZWQnKQogICAgICAgICAgICAgICAgaWYgbm90IHIuY29uc3RyYWludHM6CiAgICAgICAgICAgICAgICAgICAgcmVxcy5hcHBlbmQoci5uYW1lKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjb25zID0gJywgJy5qb2luKCclcyVzJyAlIGMgZm9yIGMgaW4gci5jb25zdHJhaW50cykKICAgICAgICAgICAgICAgICAgICByZXFzLmFwcGVuZCgnJXMgKCVzKScgJSAoci5uYW1lLCBjb25zKSkKICAgICAgICAgICAgcmV0dXJuIHJlcXMKCiAgICAgICAgZGVmIHBhcnNlX3JlcXVpcmVzX3BhdGgocmVxX3BhdGgpOgogICAgICAgICAgICAiIiJDcmVhdGUgYSBsaXN0IG9mIGRlcGVuZGVuY2llcyBmcm9tIGEgcmVxdWlyZXMudHh0IGZpbGUuCgogICAgICAgICAgICAqcmVxX3BhdGgqOiB0aGUgcGF0aCB0byBhIHNldHVwdG9vbHMtcHJvZHVjZWQgcmVxdWlyZXMudHh0IGZpbGUuCiAgICAgICAgICAgICIiIgoKICAgICAgICAgICAgcmVxcyA9IFtdCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHdpdGggY29kZWNzLm9wZW4ocmVxX3BhdGgsICdyJywgJ3V0Zi04JykgYXMgZnA6CiAgICAgICAgICAgICAgICAgICAgcmVxcyA9IHBhcnNlX3JlcXVpcmVzX2RhdGEoZnAucmVhZCgpKQogICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgcmV0dXJuIHJlcXMKCiAgICAgICAgaWYgcGF0aC5lbmRzd2l0aCgnLmVnZycpOgogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgICAgICAgICAgbWV0YV9wYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICdFR0ctSU5GTycsICdQS0ctSU5GTycpCiAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IE1ldGFkYXRhKHBhdGg9bWV0YV9wYXRoLCBzY2hlbWU9J2xlZ2FjeScpCiAgICAgICAgICAgICAgICByZXFfcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAnRUdHLUlORk8nLCAncmVxdWlyZXMudHh0JykKICAgICAgICAgICAgICAgIHJlcXVpcmVzID0gcGFyc2VfcmVxdWlyZXNfcGF0aChyZXFfcGF0aCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgRklYTUUgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHppcGZpbGUgaXMgbm90IGF2YWlsYWJsZQogICAgICAgICAgICAgICAgemlwZiA9IHppcGltcG9ydC56aXBpbXBvcnRlcihwYXRoKQogICAgICAgICAgICAgICAgZmlsZW9iaiA9IFN0cmluZ0lPKAogICAgICAgICAgICAgICAgICAgIHppcGYuZ2V0X2RhdGEoJ0VHRy1JTkZPL1BLRy1JTkZPJykuZGVjb2RlKCd1dGY4JykpCiAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IE1ldGFkYXRhKGZpbGVvYmo9ZmlsZW9iaiwgc2NoZW1lPSdsZWdhY3knKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGRhdGEgPSB6aXBmLmdldF9kYXRhKCdFR0ctSU5GTy9yZXF1aXJlcy50eHQnKQogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzID0gcGFyc2VfcmVxdWlyZXNfZGF0YShkYXRhLmRlY29kZSgndXRmLTgnKSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzID0gTm9uZQogICAgICAgIGVsaWYgcGF0aC5lbmRzd2l0aCgnLmVnZy1pbmZvJyk6CiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgICAgICAgICByZXFfcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAncmVxdWlyZXMudHh0JykKICAgICAgICAgICAgICAgIHJlcXVpcmVzID0gcGFyc2VfcmVxdWlyZXNfcGF0aChyZXFfcGF0aCkKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgJ1BLRy1JTkZPJykKICAgICAgICAgICAgbWV0YWRhdGEgPSBNZXRhZGF0YShwYXRoPXBhdGgsIHNjaGVtZT0nbGVnYWN5JykKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdwYXRoIG11c3QgZW5kIHdpdGggLmVnZy1pbmZvIG9yIC5lZ2csICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ290ICVyJyAlIHBhdGgpCgogICAgICAgIGlmIHJlcXVpcmVzOgogICAgICAgICAgICBtZXRhZGF0YS5hZGRfcmVxdWlyZW1lbnRzKHJlcXVpcmVzKQogICAgICAgIHJldHVybiBtZXRhZGF0YQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJzxFZ2dJbmZvRGlzdHJpYnV0aW9uICVyICVzIGF0ICVyPicgJSAoCiAgICAgICAgICAgIHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uLCBzZWxmLnBhdGgpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICIlcyAlcyIgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCgogICAgZGVmIGNoZWNrX2luc3RhbGxlZF9maWxlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDaGVja3MgdGhhdCB0aGUgaGFzaGVzIGFuZCBzaXplcyBvZiB0aGUgZmlsZXMgaW4gYGBSRUNPUkRgYCBhcmUKICAgICAgICBtYXRjaGVkIGJ5IHRoZSBmaWxlcyB0aGVtc2VsdmVzLiBSZXR1cm5zIGEgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mCiAgICAgICAgbWlzbWF0Y2hlcy4gRWFjaCBlbnRyeSBpbiB0aGUgbWlzbWF0Y2ggbGlzdCB3aWxsIGJlIGEgdHVwbGUgY29uc2lzdGluZwogICAgICAgIG9mIHRoZSBwYXRoLCAnZXhpc3RzJywgJ3NpemUnIG9yICdoYXNoJyBhY2NvcmRpbmcgdG8gd2hhdCBkaWRuJ3QgbWF0Y2gKICAgICAgICAoZXhpc3RlbmNlIGlzIGNoZWNrZWQgZmlyc3QsIHRoZW4gc2l6ZSwgdGhlbiBoYXNoKSwgdGhlIGV4cGVjdGVkCiAgICAgICAgdmFsdWUgYW5kIHRoZSBhY3R1YWwgdmFsdWUuCiAgICAgICAgIiIiCiAgICAgICAgbWlzbWF0Y2hlcyA9IFtdCiAgICAgICAgcmVjb3JkX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCAnaW5zdGFsbGVkLWZpbGVzLnR4dCcpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmVjb3JkX3BhdGgpOgogICAgICAgICAgICBmb3IgcGF0aCwgXywgXyBpbiBzZWxmLmxpc3RfaW5zdGFsbGVkX2ZpbGVzKCk6CiAgICAgICAgICAgICAgICBpZiBwYXRoID09IHJlY29yZF9wYXRoOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CiAgICAgICAgICAgICAgICAgICAgbWlzbWF0Y2hlcy5hcHBlbmQoKHBhdGgsICdleGlzdHMnLCBUcnVlLCBGYWxzZSkpCiAgICAgICAgcmV0dXJuIG1pc21hdGNoZXMKCiAgICBkZWYgbGlzdF9pbnN0YWxsZWRfZmlsZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgSXRlcmF0ZXMgb3ZlciB0aGUgYGBpbnN0YWxsZWQtZmlsZXMudHh0YGAgZW50cmllcyBhbmQgcmV0dXJucyBhIHR1cGxlCiAgICAgICAgYGAocGF0aCwgaGFzaCwgc2l6ZSlgYCBmb3IgZWFjaCBsaW5lLgoKICAgICAgICA6cmV0dXJuczogYSBsaXN0IG9mIChwYXRoLCBoYXNoLCBzaXplKQogICAgICAgICIiIgoKICAgICAgICBkZWYgX21kNShwYXRoKToKICAgICAgICAgICAgZiA9IG9wZW4ocGF0aCwgJ3JiJykKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY29udGVudCA9IGYucmVhZCgpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgcmV0dXJuIGhhc2hsaWIubWQ1KGNvbnRlbnQpLmhleGRpZ2VzdCgpCgogICAgICAgIGRlZiBfc2l6ZShwYXRoKToKICAgICAgICAgICAgcmV0dXJuIG9zLnN0YXQocGF0aCkuc3Rfc2l6ZQoKICAgICAgICByZWNvcmRfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhdGgsICdpbnN0YWxsZWQtZmlsZXMudHh0JykKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJlY29yZF9wYXRoKToKICAgICAgICAgICAgd2l0aCBjb2RlY3Mub3BlbihyZWNvcmRfcGF0aCwgJ3InLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBmOgogICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgcCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKHNlbGYucGF0aCwgbGluZSkpCiAgICAgICAgICAgICAgICAgICAgIyAiLi8iIGlzIHByZXNlbnQgYXMgYSBtYXJrZXIgYmV0d2VlbiBpbnN0YWxsZWQgZmlsZXMKICAgICAgICAgICAgICAgICAgICAjIGFuZCBpbnN0YWxsYXRpb24gbWV0YWRhdGEgZmlsZXMKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdOb24tZXhpc3RlbnQgZmlsZTogJXMnLCBwKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBwLmVuZHN3aXRoKCgnLnB5YycsICcucHlvJykpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgI290aGVyd2lzZSBmYWxsIHRocm91Z2ggYW5kIGZhaWwKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihwKToKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgocCwgX21kNShwKSwgX3NpemUocCkpKQogICAgICAgICAgICByZXN1bHQuYXBwZW5kKChyZWNvcmRfcGF0aCwgTm9uZSwgTm9uZSkpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBsaXN0X2Rpc3RpbmZvX2ZpbGVzKHNlbGYsIGFic29sdXRlPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBJdGVyYXRlcyBvdmVyIHRoZSBgYGluc3RhbGxlZC1maWxlcy50eHRgYCBlbnRyaWVzIGFuZCByZXR1cm5zIHBhdGhzIGZvcgogICAgICAgIGVhY2ggbGluZSBpZiB0aGUgcGF0aCBpcyBwb2ludGluZyB0byBhIGZpbGUgbG9jYXRlZCBpbiB0aGUKICAgICAgICBgYC5lZ2ctaW5mb2BgIGRpcmVjdG9yeSBvciBvbmUgb2YgaXRzIHN1YmRpcmVjdG9yaWVzLgoKICAgICAgICA6cGFyYW1ldGVyIGFic29sdXRlOiBJZiAqYWJzb2x1dGUqIGlzIGBgVHJ1ZWBgLCBlYWNoIHJldHVybmVkIHBhdGggaXMKICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZCBpbnRvIGEgbG9jYWwgYWJzb2x1dGUgcGF0aC4gT3RoZXJ3aXNlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgIHJhdyB2YWx1ZSBmcm9tIGBgaW5zdGFsbGVkLWZpbGVzLnR4dGBgIGlzIHJldHVybmVkLgogICAgICAgIDp0eXBlIGFic29sdXRlOiBib29sZWFuCiAgICAgICAgOnJldHVybnM6IGl0ZXJhdG9yIG9mIHBhdGhzCiAgICAgICAgIiIiCiAgICAgICAgcmVjb3JkX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCAnaW5zdGFsbGVkLWZpbGVzLnR4dCcpCiAgICAgICAgc2tpcCA9IFRydWUKICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHJlY29yZF9wYXRoLCAncicsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGY6CiAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CiAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgICAgICBpZiBsaW5lID09ICcuLyc6CiAgICAgICAgICAgICAgICAgICAgc2tpcCA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIG5vdCBza2lwOgogICAgICAgICAgICAgICAgICAgIHAgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihzZWxmLnBhdGgsIGxpbmUpKQogICAgICAgICAgICAgICAgICAgIGlmIHAuc3RhcnRzd2l0aChzZWxmLnBhdGgpOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBhYnNvbHV0ZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHAKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gKGlzaW5zdGFuY2Uob3RoZXIsIEVnZ0luZm9EaXN0cmlidXRpb24pIGFuZAogICAgICAgICAgICAgICAgc2VsZi5wYXRoID09IG90aGVyLnBhdGgpCgogICAgIyBTZWUgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9yZWZlcmVuY2UvZGF0YW1vZGVsI29iamVjdC5fX2hhc2hfXwogICAgX19oYXNoX18gPSBvYmplY3QuX19oYXNoX18KCm5ld19kaXN0X2NsYXNzID0gSW5zdGFsbGVkRGlzdHJpYnV0aW9uCm9sZF9kaXN0X2NsYXNzID0gRWdnSW5mb0Rpc3RyaWJ1dGlvbgoKCmNsYXNzIERlcGVuZGVuY3lHcmFwaChvYmplY3QpOgogICAgIiIiCiAgICBSZXByZXNlbnRzIGEgZGVwZW5kZW5jeSBncmFwaCBiZXR3ZWVuIGRpc3RyaWJ1dGlvbnMuCgogICAgVGhlIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwcyBhcmUgc3RvcmVkIGluIGFuIGBgYWRqYWNlbmN5X2xpc3RgYCB0aGF0IG1hcHMKICAgIGRpc3RyaWJ1dGlvbnMgdG8gYSBsaXN0IG9mIGBgKG90aGVyLCBsYWJlbClgYCB0dXBsZXMgd2hlcmUgIGBgb3RoZXJgYAogICAgaXMgYSBkaXN0cmlidXRpb24gYW5kIHRoZSBlZGdlIGlzIGxhYmVsZWQgd2l0aCBgYGxhYmVsYGAgKGkuZS4gdGhlIHZlcnNpb24KICAgIHNwZWNpZmllciwgaWYgc3VjaCB3YXMgcHJvdmlkZWQpLiBBbHNvLCBmb3IgbW9yZSBlZmZpY2llbnQgdHJhdmVyc2FsLCBmb3IKICAgIGV2ZXJ5IGRpc3RyaWJ1dGlvbiBgYHhgYCwgYSBsaXN0IG9mIHByZWRlY2Vzc29ycyBpcyBrZXB0IGluCiAgICBgYHJldmVyc2VfbGlzdFt4XWBgLiBBbiBlZGdlIGZyb20gZGlzdHJpYnV0aW9uIGBgYWBgIHRvCiAgICBkaXN0cmlidXRpb24gYGBiYGAgbWVhbnMgdGhhdCBgYGFgYCBkZXBlbmRzIG9uIGBgYmBgLiBJZiBhbnkgbWlzc2luZwogICAgZGVwZW5kZW5jaWVzIGFyZSBmb3VuZCwgdGhleSBhcmUgc3RvcmVkIGluIGBgbWlzc2luZ2BgLCB3aGljaCBpcyBhCiAgICBkaWN0aW9uYXJ5IHRoYXQgbWFwcyBkaXN0cmlidXRpb25zIHRvIGEgbGlzdCBvZiByZXF1aXJlbWVudHMgdGhhdCB3ZXJlIG5vdAogICAgcHJvdmlkZWQgYnkgYW55IG90aGVyIGRpc3RyaWJ1dGlvbnMuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5hZGphY2VuY3lfbGlzdCA9IHt9CiAgICAgICAgc2VsZi5yZXZlcnNlX2xpc3QgPSB7fQogICAgICAgIHNlbGYubWlzc2luZyA9IHt9CgogICAgZGVmIGFkZF9kaXN0cmlidXRpb24oc2VsZiwgZGlzdHJpYnV0aW9uKToKICAgICAgICAiIiJBZGQgdGhlICpkaXN0cmlidXRpb24qIHRvIHRoZSBncmFwaC4KCiAgICAgICAgOnR5cGUgZGlzdHJpYnV0aW9uOiA6Y2xhc3M6YGRpc3R1dGlsczIuZGF0YWJhc2UuSW5zdGFsbGVkRGlzdHJpYnV0aW9uYAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgOmNsYXNzOmBkaXN0dXRpbHMyLmRhdGFiYXNlLkVnZ0luZm9EaXN0cmlidXRpb25gCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5hZGphY2VuY3lfbGlzdFtkaXN0cmlidXRpb25dID0gW10KICAgICAgICBzZWxmLnJldmVyc2VfbGlzdFtkaXN0cmlidXRpb25dID0gW10KICAgICAgICAjc2VsZi5taXNzaW5nW2Rpc3RyaWJ1dGlvbl0gPSBbXQoKICAgIGRlZiBhZGRfZWRnZShzZWxmLCB4LCB5LCBsYWJlbD1Ob25lKToKICAgICAgICAiIiJBZGQgYW4gZWRnZSBmcm9tIGRpc3RyaWJ1dGlvbiAqeCogdG8gZGlzdHJpYnV0aW9uICp5KiB3aXRoIHRoZSBnaXZlbgogICAgICAgICpsYWJlbCouCgogICAgICAgIDp0eXBlIHg6IDpjbGFzczpgZGlzdHV0aWxzMi5kYXRhYmFzZS5JbnN0YWxsZWREaXN0cmlidXRpb25gIG9yCiAgICAgICAgICAgICAgICAgOmNsYXNzOmBkaXN0dXRpbHMyLmRhdGFiYXNlLkVnZ0luZm9EaXN0cmlidXRpb25gCiAgICAgICAgOnR5cGUgeTogOmNsYXNzOmBkaXN0dXRpbHMyLmRhdGFiYXNlLkluc3RhbGxlZERpc3RyaWJ1dGlvbmAgb3IKICAgICAgICAgICAgICAgICA6Y2xhc3M6YGRpc3R1dGlsczIuZGF0YWJhc2UuRWdnSW5mb0Rpc3RyaWJ1dGlvbmAKICAgICAgICA6dHlwZSBsYWJlbDogYGBzdHJgYCBvciBgYE5vbmVgYAogICAgICAgICIiIgogICAgICAgIHNlbGYuYWRqYWNlbmN5X2xpc3RbeF0uYXBwZW5kKCh5LCBsYWJlbCkpCiAgICAgICAgIyBtdWx0aXBsZSBlZGdlcyBhcmUgYWxsb3dlZCwgc28gYmUgY2FyZWZ1bAogICAgICAgIGlmIHggbm90IGluIHNlbGYucmV2ZXJzZV9saXN0W3ldOgogICAgICAgICAgICBzZWxmLnJldmVyc2VfbGlzdFt5XS5hcHBlbmQoeCkKCiAgICBkZWYgYWRkX21pc3Npbmcoc2VsZiwgZGlzdHJpYnV0aW9uLCByZXF1aXJlbWVudCk6CiAgICAgICAgIiIiCiAgICAgICAgQWRkIGEgbWlzc2luZyAqcmVxdWlyZW1lbnQqIGZvciB0aGUgZ2l2ZW4gKmRpc3RyaWJ1dGlvbiouCgogICAgICAgIDp0eXBlIGRpc3RyaWJ1dGlvbjogOmNsYXNzOmBkaXN0dXRpbHMyLmRhdGFiYXNlLkluc3RhbGxlZERpc3RyaWJ1dGlvbmAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIDpjbGFzczpgZGlzdHV0aWxzMi5kYXRhYmFzZS5FZ2dJbmZvRGlzdHJpYnV0aW9uYAogICAgICAgIDp0eXBlIHJlcXVpcmVtZW50OiBgYHN0cmBgCiAgICAgICAgIiIiCiAgICAgICAgbG9nZ2VyLmRlYnVnKCclcyBtaXNzaW5nICVyJywgZGlzdHJpYnV0aW9uLCByZXF1aXJlbWVudCkKICAgICAgICBzZWxmLm1pc3Npbmcuc2V0ZGVmYXVsdChkaXN0cmlidXRpb24sIFtdKS5hcHBlbmQocmVxdWlyZW1lbnQpCgogICAgZGVmIF9yZXByX2Rpc3Qoc2VsZiwgZGlzdCk6CiAgICAgICAgcmV0dXJuICclcyAlcycgJSAoZGlzdC5uYW1lLCBkaXN0LnZlcnNpb24pCgogICAgZGVmIHJlcHJfbm9kZShzZWxmLCBkaXN0LCBsZXZlbD0xKToKICAgICAgICAiIiJQcmludHMgb25seSBhIHN1YmdyYXBoIiIiCiAgICAgICAgb3V0cHV0ID0gW3NlbGYuX3JlcHJfZGlzdChkaXN0KV0KICAgICAgICBmb3Igb3RoZXIsIGxhYmVsIGluIHNlbGYuYWRqYWNlbmN5X2xpc3RbZGlzdF06CiAgICAgICAgICAgIGRpc3QgPSBzZWxmLl9yZXByX2Rpc3Qob3RoZXIpCiAgICAgICAgICAgIGlmIGxhYmVsIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgZGlzdCA9ICclcyBbJXNdJyAlIChkaXN0LCBsYWJlbCkKICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgnICAgICcgKiBsZXZlbCArIHN0cihkaXN0KSkKICAgICAgICAgICAgc3Vib3V0cHV0ID0gc2VsZi5yZXByX25vZGUob3RoZXIsIGxldmVsICsgMSkKICAgICAgICAgICAgc3VicyA9IHN1Ym91dHB1dC5zcGxpdCgnXG4nKQogICAgICAgICAgICBvdXRwdXQuZXh0ZW5kKHN1YnNbMTpdKQogICAgICAgIHJldHVybiAnXG4nLmpvaW4ob3V0cHV0KQoKICAgIGRlZiB0b19kb3Qoc2VsZiwgZiwgc2tpcF9kaXNjb25uZWN0ZWQ9VHJ1ZSk6CiAgICAgICAgIiIiV3JpdGVzIGEgRE9UIG91dHB1dCBmb3IgdGhlIGdyYXBoIHRvIHRoZSBwcm92aWRlZCBmaWxlICpmKi4KCiAgICAgICAgSWYgKnNraXBfZGlzY29ubmVjdGVkKiBpcyBzZXQgdG8gYGBUcnVlYGAsIHRoZW4gYWxsIGRpc3RyaWJ1dGlvbnMKICAgICAgICB0aGF0IGFyZSBub3QgZGVwZW5kZW50IG9uIGFueSBvdGhlciBkaXN0cmlidXRpb24gYXJlIHNraXBwZWQuCgogICAgICAgIDp0eXBlIGY6IGhhcyB0byBzdXBwb3J0IGBgZmlsZWBgLWxpa2Ugb3BlcmF0aW9ucwogICAgICAgIDp0eXBlIHNraXBfZGlzY29ubmVjdGVkOiBgYGJvb2xgYAogICAgICAgICIiIgogICAgICAgIGRpc2Nvbm5lY3RlZCA9IFtdCgogICAgICAgIGYud3JpdGUoImRpZ3JhcGggZGVwZW5kZW5jaWVzIHtcbiIpCiAgICAgICAgZm9yIGRpc3QsIGFkanMgaW4gc2VsZi5hZGphY2VuY3lfbGlzdC5pdGVtcygpOgogICAgICAgICAgICBpZiBsZW4oYWRqcykgPT0gMCBhbmQgbm90IHNraXBfZGlzY29ubmVjdGVkOgogICAgICAgICAgICAgICAgZGlzY29ubmVjdGVkLmFwcGVuZChkaXN0KQogICAgICAgICAgICBmb3Igb3RoZXIsIGxhYmVsIGluIGFkanM6CiAgICAgICAgICAgICAgICBpZiBub3QgbGFiZWwgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCciJXMiIC0+ICIlcyIgW2xhYmVsPSIlcyJdXG4nICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXN0Lm5hbWUsIG90aGVyLm5hbWUsIGxhYmVsKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgnIiVzIiAtPiAiJXMiXG4nICUgKGRpc3QubmFtZSwgb3RoZXIubmFtZSkpCiAgICAgICAgaWYgbm90IHNraXBfZGlzY29ubmVjdGVkIGFuZCBsZW4oZGlzY29ubmVjdGVkKSA+IDA6CiAgICAgICAgICAgIGYud3JpdGUoJ3N1YmdyYXBoIGRpc2Nvbm5lY3RlZCB7XG4nKQogICAgICAgICAgICBmLndyaXRlKCdsYWJlbCA9ICJEaXNjb25uZWN0ZWQiXG4nKQogICAgICAgICAgICBmLndyaXRlKCdiZ2NvbG9yID0gcmVkXG4nKQoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzY29ubmVjdGVkOgogICAgICAgICAgICAgICAgZi53cml0ZSgnIiVzIicgJSBkaXN0Lm5hbWUpCiAgICAgICAgICAgICAgICBmLndyaXRlKCdcbicpCiAgICAgICAgICAgIGYud3JpdGUoJ31cbicpCiAgICAgICAgZi53cml0ZSgnfVxuJykKCiAgICBkZWYgdG9wb2xvZ2ljYWxfc29ydChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBQZXJmb3JtIGEgdG9wb2xvZ2ljYWwgc29ydCBvZiB0aGUgZ3JhcGguCiAgICAgICAgOnJldHVybjogQSB0dXBsZSwgdGhlIGZpcnN0IGVsZW1lbnQgb2Ygd2hpY2ggaXMgYSB0b3BvbG9naWNhbGx5IHNvcnRlZAogICAgICAgICAgICAgICAgIGxpc3Qgb2YgZGlzdHJpYnV0aW9ucywgYW5kIHRoZSBzZWNvbmQgZWxlbWVudCBvZiB3aGljaCBpcyBhCiAgICAgICAgICAgICAgICAgbGlzdCBvZiBkaXN0cmlidXRpb25zIHRoYXQgY2Fubm90IGJlIHNvcnRlZCBiZWNhdXNlIHRoZXkgaGF2ZQogICAgICAgICAgICAgICAgIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBhbmQgc28gZm9ybSBhIGN5Y2xlLgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgIyBNYWtlIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBhZGphY2VuY3kgbGlzdAogICAgICAgIGFsaXN0ID0ge30KICAgICAgICBmb3IgaywgdiBpbiBzZWxmLmFkamFjZW5jeV9saXN0Lml0ZW1zKCk6CiAgICAgICAgICAgIGFsaXN0W2tdID0gdls6XQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICMgU2VlIHdoYXQgd2UgY2FuIHJlbW92ZSBpbiB0aGlzIHJ1bgogICAgICAgICAgICB0b19yZW1vdmUgPSBbXQogICAgICAgICAgICBmb3IgaywgdiBpbiBsaXN0KGFsaXN0Lml0ZW1zKCkpWzpdOgogICAgICAgICAgICAgICAgaWYgbm90IHY6CiAgICAgICAgICAgICAgICAgICAgdG9fcmVtb3ZlLmFwcGVuZChrKQogICAgICAgICAgICAgICAgICAgIGRlbCBhbGlzdFtrXQogICAgICAgICAgICBpZiBub3QgdG9fcmVtb3ZlOgogICAgICAgICAgICAgICAgIyBXaGF0J3MgbGVmdCBpbiBhbGlzdCAoaWYgYW55dGhpbmcpIGlzIGEgY3ljbGUuCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAjIFJlbW92ZSBmcm9tIHRoZSBhZGphY2VuY3kgbGlzdCBvZiBvdGhlcnMKICAgICAgICAgICAgZm9yIGssIHYgaW4gYWxpc3QuaXRlbXMoKToKICAgICAgICAgICAgICAgIGFsaXN0W2tdID0gWyhkLCByKSBmb3IgZCwgciBpbiB2IGlmIGQgbm90IGluIHRvX3JlbW92ZV0KICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdNb3ZpbmcgdG8gcmVzdWx0OiAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICBbJyVzICglcyknICUgKGQubmFtZSwgZC52ZXJzaW9uKSBmb3IgZCBpbiB0b19yZW1vdmVdKQogICAgICAgICAgICByZXN1bHQuZXh0ZW5kKHRvX3JlbW92ZSkKICAgICAgICByZXR1cm4gcmVzdWx0LCBsaXN0KGFsaXN0LmtleXMoKSkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIiIiUmVwcmVzZW50YXRpb24gb2YgdGhlIGdyYXBoIiIiCiAgICAgICAgb3V0cHV0ID0gW10KICAgICAgICBmb3IgZGlzdCwgYWRqcyBpbiBzZWxmLmFkamFjZW5jeV9saXN0Lml0ZW1zKCk6CiAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoc2VsZi5yZXByX25vZGUoZGlzdCkpCiAgICAgICAgcmV0dXJuICdcbicuam9pbihvdXRwdXQpCgoKZGVmIG1ha2VfZ3JhcGgoZGlzdHMsIHNjaGVtZT0nZGVmYXVsdCcpOgogICAgIiIiTWFrZXMgYSBkZXBlbmRlbmN5IGdyYXBoIGZyb20gdGhlIGdpdmVuIGRpc3RyaWJ1dGlvbnMuCgogICAgOnBhcmFtZXRlciBkaXN0czogYSBsaXN0IG9mIGRpc3RyaWJ1dGlvbnMKICAgIDp0eXBlIGRpc3RzOiBsaXN0IG9mIDpjbGFzczpgZGlzdHV0aWxzMi5kYXRhYmFzZS5JbnN0YWxsZWREaXN0cmlidXRpb25gIGFuZAogICAgICAgICAgICAgICAgIDpjbGFzczpgZGlzdHV0aWxzMi5kYXRhYmFzZS5FZ2dJbmZvRGlzdHJpYnV0aW9uYCBpbnN0YW5jZXMKICAgIDpydHlwZTogYSA6Y2xhc3M6YERlcGVuZGVuY3lHcmFwaGAgaW5zdGFuY2UKICAgICIiIgogICAgc2NoZW1lID0gZ2V0X3NjaGVtZShzY2hlbWUpCiAgICBncmFwaCA9IERlcGVuZGVuY3lHcmFwaCgpCiAgICBwcm92aWRlZCA9IHt9ICAjIG1hcHMgbmFtZXMgdG8gbGlzdHMgb2YgKHZlcnNpb24sIGRpc3QpIHR1cGxlcwoKICAgICMgZmlyc3QsIGJ1aWxkIHRoZSBncmFwaCBhbmQgZmluZCBvdXQgd2hhdCdzIHByb3ZpZGVkCiAgICBmb3IgZGlzdCBpbiBkaXN0czoKICAgICAgICBncmFwaC5hZGRfZGlzdHJpYnV0aW9uKGRpc3QpCgogICAgICAgIGZvciBwIGluIGRpc3QucHJvdmlkZXM6CiAgICAgICAgICAgIG5hbWUsIHZlcnNpb24gPSBwYXJzZV9uYW1lX2FuZF92ZXJzaW9uKHApCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQWRkIHRvIHByb3ZpZGVkOiAlcywgJXMsICVzJywgbmFtZSwgdmVyc2lvbiwgZGlzdCkKICAgICAgICAgICAgcHJvdmlkZWQuc2V0ZGVmYXVsdChuYW1lLCBbXSkuYXBwZW5kKCh2ZXJzaW9uLCBkaXN0KSkKCiAgICAjIG5vdyBtYWtlIHRoZSBlZGdlcwogICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgcmVxdWlyZXMgPSAoZGlzdC5ydW5fcmVxdWlyZXMgfCBkaXN0Lm1ldGFfcmVxdWlyZXMgfAogICAgICAgICAgICAgICAgICAgIGRpc3QuYnVpbGRfcmVxdWlyZXMgfCBkaXN0LmRldl9yZXF1aXJlcykKICAgICAgICBmb3IgcmVxIGluIHJlcXVpcmVzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBtYXRjaGVyID0gc2NoZW1lLm1hdGNoZXIocmVxKQogICAgICAgICAgICBleGNlcHQgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3I6CiAgICAgICAgICAgICAgICAjIFhYWCBjb21wYXQtbW9kZSBpZiBjYW5ub3QgcmVhZCB0aGUgdmVyc2lvbgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ2NvdWxkIG5vdCByZWFkIHZlcnNpb24gJXIgLSB1c2luZyBuYW1lIG9ubHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxKQogICAgICAgICAgICAgICAgbmFtZSA9IHJlcS5zcGxpdCgpWzBdCiAgICAgICAgICAgICAgICBtYXRjaGVyID0gc2NoZW1lLm1hdGNoZXIobmFtZSkKCiAgICAgICAgICAgIG5hbWUgPSBtYXRjaGVyLmtleSAgICMgY2FzZS1pbnNlbnNpdGl2ZQoKICAgICAgICAgICAgbWF0Y2hlZCA9IEZhbHNlCiAgICAgICAgICAgIGlmIG5hbWUgaW4gcHJvdmlkZWQ6CiAgICAgICAgICAgICAgICBmb3IgdmVyc2lvbiwgcHJvdmlkZXIgaW4gcHJvdmlkZWRbbmFtZV06CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoZXIubWF0Y2godmVyc2lvbikKICAgICAgICAgICAgICAgICAgICBleGNlcHQgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gRmFsc2UKCiAgICAgICAgICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoLmFkZF9lZGdlKGRpc3QsIHByb3ZpZGVyLCByZXEpCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIG5vdCBtYXRjaGVkOgogICAgICAgICAgICAgICAgZ3JhcGguYWRkX21pc3NpbmcoZGlzdCwgcmVxKQogICAgcmV0dXJuIGdyYXBoCgoKZGVmIGdldF9kZXBlbmRlbnRfZGlzdHMoZGlzdHMsIGRpc3QpOgogICAgIiIiUmVjdXJzaXZlbHkgZ2VuZXJhdGUgYSBsaXN0IG9mIGRpc3RyaWJ1dGlvbnMgZnJvbSAqZGlzdHMqIHRoYXQgYXJlCiAgICBkZXBlbmRlbnQgb24gKmRpc3QqLgoKICAgIDpwYXJhbSBkaXN0czogYSBsaXN0IG9mIGRpc3RyaWJ1dGlvbnMKICAgIDpwYXJhbSBkaXN0OiBhIGRpc3RyaWJ1dGlvbiwgbWVtYmVyIG9mICpkaXN0cyogZm9yIHdoaWNoIHdlIGFyZSBpbnRlcmVzdGVkCiAgICAiIiIKICAgIGlmIGRpc3Qgbm90IGluIGRpc3RzOgogICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ2dpdmVuIGRpc3RyaWJ1dGlvbiAlciBpcyBub3QgYSBtZW1iZXIgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29mIHRoZSBsaXN0JyAlIGRpc3QubmFtZSkKICAgIGdyYXBoID0gbWFrZV9ncmFwaChkaXN0cykKCiAgICBkZXAgPSBbZGlzdF0gICMgZGVwZW5kZW50IGRpc3RyaWJ1dGlvbnMKICAgIHRvZG8gPSBncmFwaC5yZXZlcnNlX2xpc3RbZGlzdF0gICMgbGlzdCBvZiBub2RlcyB3ZSBzaG91bGQgaW5zcGVjdAoKICAgIHdoaWxlIHRvZG86CiAgICAgICAgZCA9IHRvZG8ucG9wKCkKICAgICAgICBkZXAuYXBwZW5kKGQpCiAgICAgICAgZm9yIHN1Y2MgaW4gZ3JhcGgucmV2ZXJzZV9saXN0W2RdOgogICAgICAgICAgICBpZiBzdWNjIG5vdCBpbiBkZXA6CiAgICAgICAgICAgICAgICB0b2RvLmFwcGVuZChzdWNjKQoKICAgIGRlcC5wb3AoMCkgICMgcmVtb3ZlIGRpc3QgZnJvbSBkZXAsIHdhcyB0aGVyZSB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzCiAgICByZXR1cm4gZGVwCgoKZGVmIGdldF9yZXF1aXJlZF9kaXN0cyhkaXN0cywgZGlzdCk6CiAgICAiIiJSZWN1cnNpdmVseSBnZW5lcmF0ZSBhIGxpc3Qgb2YgZGlzdHJpYnV0aW9ucyBmcm9tICpkaXN0cyogdGhhdCBhcmUKICAgIHJlcXVpcmVkIGJ5ICpkaXN0Ki4KCiAgICA6cGFyYW0gZGlzdHM6IGEgbGlzdCBvZiBkaXN0cmlidXRpb25zCiAgICA6cGFyYW0gZGlzdDogYSBkaXN0cmlidXRpb24sIG1lbWJlciBvZiAqZGlzdHMqIGZvciB3aGljaCB3ZSBhcmUgaW50ZXJlc3RlZAogICAgIiIiCiAgICBpZiBkaXN0IG5vdCBpbiBkaXN0czoKICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdnaXZlbiBkaXN0cmlidXRpb24gJXIgaXMgbm90IGEgbWVtYmVyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvZiB0aGUgbGlzdCcgJSBkaXN0Lm5hbWUpCiAgICBncmFwaCA9IG1ha2VfZ3JhcGgoZGlzdHMpCgogICAgcmVxID0gW10gICMgcmVxdWlyZWQgZGlzdHJpYnV0aW9ucwogICAgdG9kbyA9IGdyYXBoLmFkamFjZW5jeV9saXN0W2Rpc3RdICAjIGxpc3Qgb2Ygbm9kZXMgd2Ugc2hvdWxkIGluc3BlY3QKCiAgICB3aGlsZSB0b2RvOgogICAgICAgIGQgPSB0b2RvLnBvcCgpWzBdCiAgICAgICAgcmVxLmFwcGVuZChkKQogICAgICAgIGZvciBwcmVkIGluIGdyYXBoLmFkamFjZW5jeV9saXN0W2RdOgogICAgICAgICAgICBpZiBwcmVkIG5vdCBpbiByZXE6CiAgICAgICAgICAgICAgICB0b2RvLmFwcGVuZChwcmVkKQoKICAgIHJldHVybiByZXEKCgpkZWYgbWFrZV9kaXN0KG5hbWUsIHZlcnNpb24sICoqa3dhcmdzKToKICAgICIiIgogICAgQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIG1ha2luZyBhIGRpc3QgZ2l2ZW4ganVzdCBhIG5hbWUgYW5kIHZlcnNpb24uCiAgICAiIiIKICAgIHN1bW1hcnkgPSBrd2FyZ3MucG9wKCdzdW1tYXJ5JywgJ1BsYWNlaG9sZGVyIGZvciBzdW1tYXJ5JykKICAgIG1kID0gTWV0YWRhdGEoKiprd2FyZ3MpCiAgICBtZC5uYW1lID0gbmFtZQogICAgbWQudmVyc2lvbiA9IHZlcnNpb24KICAgIG1kLnN1bW1hcnkgPSBzdW1tYXJ5IG9yICdQbGFjZWhvbGRlciBmb3Igc3VtbWFyeScKICAgIHJldHVybiBEaXN0cmlidXRpb24obWQpClBLAwQUAAAAAAAAACEAgzjiLV1SAABdUgAALAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL2luZGV4LnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMyBWaW5heSBTYWppcC4KIyBMaWNlbnNlZCB0byB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgYSBjb250cmlidXRvciBhZ3JlZW1lbnQuCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCmltcG9ydCBoYXNobGliCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgc2h1dGlsCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCB0ZW1wZmlsZQp0cnk6CiAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgVGhyZWFkCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gZHVtbXlfdGhyZWFkaW5nIGltcG9ydCBUaHJlYWQKCmZyb20gLiBpbXBvcnQgRGlzdGxpYkV4Y2VwdGlvbgpmcm9tIC5jb21wYXQgaW1wb3J0IChIVFRQQmFzaWNBdXRoSGFuZGxlciwgUmVxdWVzdCwgSFRUUFBhc3N3b3JkTWdyLAogICAgICAgICAgICAgICAgICAgICB1cmxwYXJzZSwgYnVpbGRfb3BlbmVyLCBzdHJpbmdfdHlwZXMpCmZyb20gLnV0aWwgaW1wb3J0IGNhY2hlZF9wcm9wZXJ0eSwgemlwX2RpciwgU2VydmVyUHJveHkKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKREVGQVVMVF9JTkRFWCA9ICdodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpJwpERUZBVUxUX1JFQUxNID0gJ3B5cGknCgpjbGFzcyBQYWNrYWdlSW5kZXgob2JqZWN0KToKICAgICIiIgogICAgVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcGFja2FnZSBpbmRleCBjb21wYXRpYmxlIHdpdGggUHlQSSwgdGhlIFB5dGhvbgogICAgUGFja2FnZSBJbmRleC4KICAgICIiIgoKICAgIGJvdW5kYXJ5ID0gYictLS0tLS0tLS0tVGhJc19Jc190SGVfZGlzdGxpYl9pbmRleF9ib3VOZGFSWV8kJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmw9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KCiAgICAgICAgOnBhcmFtIHVybDogVGhlIFVSTCBvZiB0aGUgaW5kZXguIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBVUkwgZm9yIFB5UEkgaXMKICAgICAgICAgICAgICAgICAgICB1c2VkLgogICAgICAgICIiIgogICAgICAgIHNlbGYudXJsID0gdXJsIG9yIERFRkFVTFRfSU5ERVgKICAgICAgICBzZWxmLnJlYWRfY29uZmlndXJhdGlvbigpCiAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWcgPSB1cmxwYXJzZShzZWxmLnVybCkKICAgICAgICBpZiBwYXJhbXMgb3IgcXVlcnkgb3IgZnJhZyBvciBzY2hlbWUgbm90IGluICgnaHR0cCcsICdodHRwcycpOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdpbnZhbGlkIHJlcG9zaXRvcnk6ICVzJyAlIHNlbGYudXJsKQogICAgICAgIHNlbGYucGFzc3dvcmRfaGFuZGxlciA9IE5vbmUKICAgICAgICBzZWxmLnNzbF92ZXJpZmllciA9IE5vbmUKICAgICAgICBzZWxmLmdwZyA9IE5vbmUKICAgICAgICBzZWxmLmdwZ19ob21lID0gTm9uZQogICAgICAgIHNlbGYucnBjX3Byb3h5ID0gTm9uZQogICAgICAgIHdpdGggb3Blbihvcy5kZXZudWxsLCAndycpIGFzIHNpbms6CiAgICAgICAgICAgICMgVXNlIGdwZyBieSBkZWZhdWx0IHJhdGhlciB0aGFuIGdwZzIsIGFzIGdwZzIgaW5zaXN0cyBvbgogICAgICAgICAgICAjIHByb21wdGluZyBmb3IgcGFzc3dvcmRzCiAgICAgICAgICAgIGZvciBzIGluICgnZ3BnJywgJ2dwZzInKToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICByYyA9IHN1YnByb2Nlc3MuY2hlY2tfY2FsbChbcywgJy0tdmVyc2lvbiddLCBzdGRvdXQ9c2luaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c2luaykKICAgICAgICAgICAgICAgICAgICBpZiByYyA9PSAwOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdwZyA9IHMKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgX2dldF9weXBpcmNfY29tbWFuZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIGRpc3R1dGlscyBjb21tYW5kIGZvciBpbnRlcmFjdGluZyB3aXRoIFB5UEkgY29uZmlndXJhdGlvbnMuCiAgICAgICAgOnJldHVybjogdGhlIGNvbW1hbmQuCiAgICAgICAgIiIiCiAgICAgICAgZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRGlzdHJpYnV0aW9uCiAgICAgICAgZnJvbSBkaXN0dXRpbHMuY29uZmlnIGltcG9ydCBQeVBJUkNDb21tYW5kCiAgICAgICAgZCA9IERpc3RyaWJ1dGlvbigpCiAgICAgICAgcmV0dXJuIFB5UElSQ0NvbW1hbmQoZCkKCiAgICBkZWYgcmVhZF9jb25maWd1cmF0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlYWQgdGhlIFB5UEkgYWNjZXNzIGNvbmZpZ3VyYXRpb24gYXMgc3VwcG9ydGVkIGJ5IGRpc3R1dGlscywgZ2V0dGluZwogICAgICAgIFB5UEkgdG8gZG8gdGhlIGFjdHVhbCB3b3JrLiBUaGlzIHBvcHVsYXRlcyBgYHVzZXJuYW1lYGAsIGBgcGFzc3dvcmRgYCwKICAgICAgICBgYHJlYWxtYGAgYW5kIGBgdXJsYGAgYXR0cmlidXRlcyBmcm9tIHRoZSBjb25maWd1cmF0aW9uLgogICAgICAgICIiIgogICAgICAgICMgZ2V0IGRpc3R1dGlscyB0byBkbyB0aGUgd29yawogICAgICAgIGMgPSBzZWxmLl9nZXRfcHlwaXJjX2NvbW1hbmQoKQogICAgICAgIGMucmVwb3NpdG9yeSA9IHNlbGYudXJsCiAgICAgICAgY2ZnID0gYy5fcmVhZF9weXBpcmMoKQogICAgICAgIHNlbGYudXNlcm5hbWUgPSBjZmcuZ2V0KCd1c2VybmFtZScpCiAgICAgICAgc2VsZi5wYXNzd29yZCA9IGNmZy5nZXQoJ3Bhc3N3b3JkJykKICAgICAgICBzZWxmLnJlYWxtID0gY2ZnLmdldCgncmVhbG0nLCAncHlwaScpCiAgICAgICAgc2VsZi51cmwgPSBjZmcuZ2V0KCdyZXBvc2l0b3J5Jywgc2VsZi51cmwpCgogICAgZGVmIHNhdmVfY29uZmlndXJhdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBTYXZlIHRoZSBQeVBJIGFjY2VzcyBjb25maWd1cmF0aW9uLiBZb3UgbXVzdCBoYXZlIHNldCBgYHVzZXJuYW1lYGAgYW5kCiAgICAgICAgYGBwYXNzd29yZGBgIGF0dHJpYnV0ZXMgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QuCgogICAgICAgIEFnYWluLCBkaXN0dXRpbHMgaXMgdXNlZCB0byBkbyB0aGUgYWN0dWFsIHdvcmsuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jaGVja19jcmVkZW50aWFscygpCiAgICAgICAgIyBnZXQgZGlzdHV0aWxzIHRvIGRvIHRoZSB3b3JrCiAgICAgICAgYyA9IHNlbGYuX2dldF9weXBpcmNfY29tbWFuZCgpCiAgICAgICAgYy5fc3RvcmVfcHlwaXJjKHNlbGYudXNlcm5hbWUsIHNlbGYucGFzc3dvcmQpCgogICAgZGVmIGNoZWNrX2NyZWRlbnRpYWxzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENoZWNrIHRoYXQgYGB1c2VybmFtZWBgIGFuZCBgYHBhc3N3b3JkYGAgaGF2ZSBiZWVuIHNldCwgYW5kIHJhaXNlIGFuCiAgICAgICAgZXhjZXB0aW9uIGlmIG5vdC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnVzZXJuYW1lIGlzIE5vbmUgb3Igc2VsZi5wYXNzd29yZCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCd1c2VybmFtZSBhbmQgcGFzc3dvcmQgbXVzdCBiZSBzZXQnKQogICAgICAgIHBtID0gSFRUUFBhc3N3b3JkTWdyKCkKICAgICAgICBfLCBuZXRsb2MsIF8sIF8sIF8sIF8gPSB1cmxwYXJzZShzZWxmLnVybCkKICAgICAgICBwbS5hZGRfcGFzc3dvcmQoc2VsZi5yZWFsbSwgbmV0bG9jLCBzZWxmLnVzZXJuYW1lLCBzZWxmLnBhc3N3b3JkKQogICAgICAgIHNlbGYucGFzc3dvcmRfaGFuZGxlciA9IEhUVFBCYXNpY0F1dGhIYW5kbGVyKHBtKQoKICAgIGRlZiByZWdpc3RlcihzZWxmLCBtZXRhZGF0YSk6CiAgICAgICAgIiIiCiAgICAgICAgUmVnaXN0ZXIgYSBkaXN0cmlidXRpb24gb24gUHlQSSwgdXNpbmcgdGhlIHByb3ZpZGVkIG1ldGFkYXRhLgoKICAgICAgICA6cGFyYW0gbWV0YWRhdGE6IEEgOmNsYXNzOmBNZXRhZGF0YWAgaW5zdGFuY2UgZGVmaW5pbmcgYXQgbGVhc3QgYSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBkaXN0cmlidXRpb24gdG8gYmUKICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQuCiAgICAgICAgOnJldHVybjogVGhlIEhUVFAgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSBQeVBJIHVwb24gc3VibWlzc2lvbiBvZiB0aGUKICAgICAgICAgICAgICAgIHJlcXVlc3QuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jaGVja19jcmVkZW50aWFscygpCiAgICAgICAgbWV0YWRhdGEudmFsaWRhdGUoKQogICAgICAgIGQgPSBtZXRhZGF0YS50b2RpY3QoKQogICAgICAgIGRbJzphY3Rpb24nXSA9ICd2ZXJpZnknCiAgICAgICAgcmVxdWVzdCA9IHNlbGYuZW5jb2RlX3JlcXVlc3QoZC5pdGVtcygpLCBbXSkKICAgICAgICByZXNwb25zZSA9IHNlbGYuc2VuZF9yZXF1ZXN0KHJlcXVlc3QpCiAgICAgICAgZFsnOmFjdGlvbiddID0gJ3N1Ym1pdCcKICAgICAgICByZXF1ZXN0ID0gc2VsZi5lbmNvZGVfcmVxdWVzdChkLml0ZW1zKCksIFtdKQogICAgICAgIHJldHVybiBzZWxmLnNlbmRfcmVxdWVzdChyZXF1ZXN0KQoKICAgIGRlZiBfcmVhZGVyKHNlbGYsIG5hbWUsIHN0cmVhbSwgb3V0YnVmKToKICAgICAgICAiIiIKICAgICAgICBUaHJlYWQgcnVubmVyIGZvciByZWFkaW5nIGxpbmVzIG9mIGZyb20gYSBzdWJwcm9jZXNzIGludG8gYSBidWZmZXIuCgogICAgICAgIDpwYXJhbSBuYW1lOiBUaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBzdHJlYW0gKHVzZWQgZm9yIGxvZ2dpbmcgb25seSkuCiAgICAgICAgOnBhcmFtIHN0cmVhbTogVGhlIHN0cmVhbSB0byByZWFkIGZyb20uIFRoaXMgd2lsbCB0eXBpY2FsbHkgYSBwaXBlCiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkIHRvIHRoZSBvdXRwdXQgc3RyZWFtIG9mIGEgc3VicHJvY2Vzcy4KICAgICAgICA6cGFyYW0gb3V0YnVmOiBUaGUgbGlzdCB0byBhcHBlbmQgdGhlIHJlYWQgbGluZXMgdG8uCiAgICAgICAgIiIiCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgcyA9IHN0cmVhbS5yZWFkbGluZSgpCiAgICAgICAgICAgIGlmIG5vdCBzOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgcyA9IHMuZGVjb2RlKCd1dGYtOCcpLnJzdHJpcCgpCiAgICAgICAgICAgIG91dGJ1Zi5hcHBlbmQocykKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCclczogJXMnICUgKG5hbWUsIHMpKQogICAgICAgIHN0cmVhbS5jbG9zZSgpCgogICAgZGVmIGdldF9zaWduX2NvbW1hbmQoc2VsZiwgZmlsZW5hbWUsIHNpZ25lciwgc2lnbl9wYXNzd29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGtleXN0b3JlPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIHN1aXRhYmxlIGNvbW1hbmQgZm9yIHNpZ25pbmcgYSBmaWxlLgoKICAgICAgICA6cGFyYW0gZmlsZW5hbWU6IFRoZSBwYXRobmFtZSB0byB0aGUgZmlsZSB0byBiZSBzaWduZWQuCiAgICAgICAgOnBhcmFtIHNpZ25lcjogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHNpZ25lciBvZiB0aGUgZmlsZS4KICAgICAgICA6cGFyYW0gc2lnbl9wYXNzd29yZDogVGhlIHBhc3NwaHJhc2UgZm9yIHRoZSBzaWduZXIncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGtleSB1c2VkIGZvciBzaWduaW5nLgogICAgICAgIDpwYXJhbSBrZXlzdG9yZTogVGhlIHBhdGggdG8gYSBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgdGhlIGtleXMKICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gdmVyaWZpY2F0aW9uLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlJ3MgYGBncGdfaG9tZWBgIGF0dHJpYnV0ZSBpcyB1c2VkIGluc3RlYWQuCiAgICAgICAgOnJldHVybjogVGhlIHNpZ25pbmcgY29tbWFuZCBhcyBhIGxpc3Qgc3VpdGFibGUgdG8gYmUKICAgICAgICAgICAgICAgICBwYXNzZWQgdG8gOmNsYXNzOmBzdWJwcm9jZXNzLlBvcGVuYC4KICAgICAgICAiIiIKICAgICAgICBjbWQgPSBbc2VsZi5ncGcsICctLXN0YXR1cy1mZCcsICcyJywgJy0tbm8tdHR5J10KICAgICAgICBpZiBrZXlzdG9yZSBpcyBOb25lOgogICAgICAgICAgICBrZXlzdG9yZSA9IHNlbGYuZ3BnX2hvbWUKICAgICAgICBpZiBrZXlzdG9yZToKICAgICAgICAgICAgY21kLmV4dGVuZChbJy0taG9tZWRpcicsIGtleXN0b3JlXSkKICAgICAgICBpZiBzaWduX3Bhc3N3b3JkIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjbWQuZXh0ZW5kKFsnLS1iYXRjaCcsICctLXBhc3NwaHJhc2UtZmQnLCAnMCddKQogICAgICAgIHRkID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICAgICAgc2YgPSBvcy5wYXRoLmpvaW4odGQsIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpICsgJy5hc2MnKQogICAgICAgIGNtZC5leHRlbmQoWyctLWRldGFjaC1zaWduJywgJy0tYXJtb3InLCAnLS1sb2NhbC11c2VyJywKICAgICAgICAgICAgICAgICAgICBzaWduZXIsICctLW91dHB1dCcsIHNmLCBmaWxlbmFtZV0pCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdpbnZva2luZzogJXMnLCAnICcuam9pbihjbWQpKQogICAgICAgIHJldHVybiBjbWQsIHNmCgogICAgZGVmIHJ1bl9jb21tYW5kKHNlbGYsIGNtZCwgaW5wdXRfZGF0YT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBSdW4gYSBjb21tYW5kIGluIGEgY2hpbGQgcHJvY2VzcyAsIHBhc3NpbmcgaXQgYW55IGlucHV0IGRhdGEgc3BlY2lmaWVkLgoKICAgICAgICA6cGFyYW0gY21kOiBUaGUgY29tbWFuZCB0byBydW4uCiAgICAgICAgOnBhcmFtIGlucHV0X2RhdGE6IElmIHNwZWNpZmllZCwgdGhpcyBtdXN0IGJlIGEgYnl0ZSBzdHJpbmcgY29udGFpbmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHRvIGJlIHNlbnQgdG8gdGhlIGNoaWxkIHByb2Nlc3MuCiAgICAgICAgOnJldHVybjogQSB0dXBsZSBjb25zaXN0aW5nIG9mIHRoZSBzdWJwcm9jZXNzJyBleGl0IGNvZGUsIGEgbGlzdCBvZgogICAgICAgICAgICAgICAgIGxpbmVzIHJlYWQgZnJvbSB0aGUgc3VicHJvY2VzcycgYGBzdGRvdXRgYCwgYW5kIGEgbGlzdCBvZgogICAgICAgICAgICAgICAgIGxpbmVzIHJlYWQgZnJvbSB0aGUgc3VicHJvY2VzcycgYGBzdGRlcnJgYC4KICAgICAgICAiIiIKICAgICAgICBrd2FyZ3MgPSB7CiAgICAgICAgICAgICdzdGRvdXQnOiBzdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICdzdGRlcnInOiBzdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgfQogICAgICAgIGlmIGlucHV0X2RhdGEgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGt3YXJnc1snc3RkaW4nXSA9IHN1YnByb2Nlc3MuUElQRQogICAgICAgIHN0ZG91dCA9IFtdCiAgICAgICAgc3RkZXJyID0gW10KICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWQsICoqa3dhcmdzKQogICAgICAgICMgV2UgZG9uJ3QgdXNlIGNvbW11bmljYXRlKCkgaGVyZSBiZWNhdXNlIHdlIG1heSBuZWVkIHRvCiAgICAgICAgIyBnZXQgY2xldmVyIHdpdGggaW50ZXJhY3Rpbmcgd2l0aCB0aGUgY29tbWFuZAogICAgICAgIHQxID0gVGhyZWFkKHRhcmdldD1zZWxmLl9yZWFkZXIsIGFyZ3M9KCdzdGRvdXQnLCBwLnN0ZG91dCwgc3Rkb3V0KSkKICAgICAgICB0MS5zdGFydCgpCiAgICAgICAgdDIgPSBUaHJlYWQodGFyZ2V0PXNlbGYuX3JlYWRlciwgYXJncz0oJ3N0ZGVycicsIHAuc3RkZXJyLCBzdGRlcnIpKQogICAgICAgIHQyLnN0YXJ0KCkKICAgICAgICBpZiBpbnB1dF9kYXRhIGlzIG5vdCBOb25lOgogICAgICAgICAgICBwLnN0ZGluLndyaXRlKGlucHV0X2RhdGEpCiAgICAgICAgICAgIHAuc3RkaW4uY2xvc2UoKQoKICAgICAgICBwLndhaXQoKQogICAgICAgIHQxLmpvaW4oKQogICAgICAgIHQyLmpvaW4oKQogICAgICAgIHJldHVybiBwLnJldHVybmNvZGUsIHN0ZG91dCwgc3RkZXJyCgogICAgZGVmIHNpZ25fZmlsZShzZWxmLCBmaWxlbmFtZSwgc2lnbmVyLCBzaWduX3Bhc3N3b3JkLCBrZXlzdG9yZT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBTaWduIGEgZmlsZS4KCiAgICAgICAgOnBhcmFtIGZpbGVuYW1lOiBUaGUgcGF0aG5hbWUgdG8gdGhlIGZpbGUgdG8gYmUgc2lnbmVkLgogICAgICAgIDpwYXJhbSBzaWduZXI6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBzaWduZXIgb2YgdGhlIGZpbGUuCiAgICAgICAgOnBhcmFtIHNpZ25fcGFzc3dvcmQ6IFRoZSBwYXNzcGhyYXNlIGZvciB0aGUgc2lnbmVyJ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBrZXkgdXNlZCBmb3Igc2lnbmluZy4KICAgICAgICA6cGFyYW0ga2V5c3RvcmU6IFRoZSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHRoZSBrZXlzCiAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHNpZ25pbmcuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBpbnN0YW5jZSdzCiAgICAgICAgICAgICAgICAgICAgICAgICBgYGdwZ19ob21lYGAgYXR0cmlidXRlIGlzIHVzZWQgaW5zdGVhZC4KICAgICAgICA6cmV0dXJuOiBUaGUgYWJzb2x1dGUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgd2hlcmUgdGhlIHNpZ25hdHVyZSBpcwogICAgICAgICAgICAgICAgIHN0b3JlZC4KICAgICAgICAiIiIKICAgICAgICBjbWQsIHNpZ19maWxlID0gc2VsZi5nZXRfc2lnbl9jb21tYW5kKGZpbGVuYW1lLCBzaWduZXIsIHNpZ25fcGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzdG9yZSkKICAgICAgICByYywgc3Rkb3V0LCBzdGRlcnIgPSBzZWxmLnJ1bl9jb21tYW5kKGNtZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25fcGFzc3dvcmQuZW5jb2RlKCd1dGYtOCcpKQogICAgICAgIGlmIHJjICE9IDA6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ3NpZ24gY29tbWFuZCBmYWlsZWQgd2l0aCBlcnJvciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvZGUgJXMnICUgcmMpCiAgICAgICAgcmV0dXJuIHNpZ19maWxlCgogICAgZGVmIHVwbG9hZF9maWxlKHNlbGYsIG1ldGFkYXRhLCBmaWxlbmFtZSwgc2lnbmVyPU5vbmUsIHNpZ25fcGFzc3dvcmQ9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBmaWxldHlwZT0nc2Rpc3QnLCBweXZlcnNpb249J3NvdXJjZScsIGtleXN0b3JlPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFVwbG9hZCBhIHJlbGVhc2UgZmlsZSB0byB0aGUgaW5kZXguCgogICAgICAgIDpwYXJhbSBtZXRhZGF0YTogQSA6Y2xhc3M6YE1ldGFkYXRhYCBpbnN0YW5jZSBkZWZpbmluZyBhdCBsZWFzdCBhIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIGZpbGUgdG8gYmUgdXBsb2FkZWQuCiAgICAgICAgOnBhcmFtIGZpbGVuYW1lOiBUaGUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgdXBsb2FkZWQuCiAgICAgICAgOnBhcmFtIHNpZ25lcjogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHNpZ25lciBvZiB0aGUgZmlsZS4KICAgICAgICA6cGFyYW0gc2lnbl9wYXNzd29yZDogVGhlIHBhc3NwaHJhc2UgZm9yIHRoZSBzaWduZXIncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGtleSB1c2VkIGZvciBzaWduaW5nLgogICAgICAgIDpwYXJhbSBmaWxldHlwZTogVGhlIHR5cGUgb2YgdGhlIGZpbGUgYmVpbmcgdXBsb2FkZWQuIFRoaXMgaXMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3R1dGlscyBjb21tYW5kIHdoaWNoIHByb2R1Y2VkIHRoYXQgZmlsZSwgZS5nLgogICAgICAgICAgICAgICAgICAgICAgICBgYHNkaXN0YGAgb3IgYGBiZGlzdF93aGVlbGBgLgogICAgICAgIDpwYXJhbSBweXZlcnNpb246IFRoZSB2ZXJzaW9uIG9mIFB5dGhvbiB3aGljaCB0aGUgcmVsZWFzZSByZWxhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8uIEZvciBjb2RlIGNvbXBhdGlibGUgd2l0aCBhbnkgUHl0aG9uLCB0aGlzIHdvdWxkCiAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYGBzb3VyY2VgYCwgb3RoZXJ3aXNlIGl0IHdvdWxkIGJlIGUuZy4gYGAzLjJgYC4KICAgICAgICA6cGFyYW0ga2V5c3RvcmU6IFRoZSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHRoZSBrZXlzCiAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHNpZ25pbmcuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBpbnN0YW5jZSdzCiAgICAgICAgICAgICAgICAgICAgICAgICBgYGdwZ19ob21lYGAgYXR0cmlidXRlIGlzIHVzZWQgaW5zdGVhZC4KICAgICAgICA6cmV0dXJuOiBUaGUgSFRUUCByZXNwb25zZSByZWNlaXZlZCBmcm9tIFB5UEkgdXBvbiBzdWJtaXNzaW9uIG9mIHRoZQogICAgICAgICAgICAgICAgcmVxdWVzdC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmNoZWNrX2NyZWRlbnRpYWxzKCkKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdub3QgZm91bmQ6ICVzJyAlIGZpbGVuYW1lKQogICAgICAgIG1ldGFkYXRhLnZhbGlkYXRlKCkKICAgICAgICBkID0gbWV0YWRhdGEudG9kaWN0KCkKICAgICAgICBzaWdfZmlsZSA9IE5vbmUKICAgICAgICBpZiBzaWduZXI6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmdwZzoKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdubyBzaWduaW5nIHByb2dyYW0gYXZhaWxhYmxlIC0gbm90IHNpZ25lZCcpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzaWdfZmlsZSA9IHNlbGYuc2lnbl9maWxlKGZpbGVuYW1lLCBzaWduZXIsIHNpZ25fcGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXN0b3JlKQogICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgZmlsZV9kYXRhID0gZi5yZWFkKCkKICAgICAgICBtZDVfZGlnZXN0ID0gaGFzaGxpYi5tZDUoZmlsZV9kYXRhKS5oZXhkaWdlc3QoKQogICAgICAgIHNoYTI1Nl9kaWdlc3QgPSBoYXNobGliLnNoYTI1NihmaWxlX2RhdGEpLmhleGRpZ2VzdCgpCiAgICAgICAgZC51cGRhdGUoewogICAgICAgICAgICAnOmFjdGlvbic6ICdmaWxlX3VwbG9hZCcsCiAgICAgICAgICAgICdwcm90b2NvbF92ZXJzaW9uJzogJzEnLAogICAgICAgICAgICAnZmlsZXR5cGUnOiBmaWxldHlwZSwKICAgICAgICAgICAgJ3B5dmVyc2lvbic6IHB5dmVyc2lvbiwKICAgICAgICAgICAgJ21kNV9kaWdlc3QnOiBtZDVfZGlnZXN0LAogICAgICAgICAgICAnc2hhMjU2X2RpZ2VzdCc6IHNoYTI1Nl9kaWdlc3QsCiAgICAgICAgfSkKICAgICAgICBmaWxlcyA9IFsoJ2NvbnRlbnQnLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSwgZmlsZV9kYXRhKV0KICAgICAgICBpZiBzaWdfZmlsZToKICAgICAgICAgICAgd2l0aCBvcGVuKHNpZ19maWxlLCAncmInKSBhcyBmOgogICAgICAgICAgICAgICAgc2lnX2RhdGEgPSBmLnJlYWQoKQogICAgICAgICAgICBmaWxlcy5hcHBlbmQoKCdncGdfc2lnbmF0dXJlJywgb3MucGF0aC5iYXNlbmFtZShzaWdfZmlsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICBzaWdfZGF0YSkpCiAgICAgICAgICAgIHNodXRpbC5ybXRyZWUob3MucGF0aC5kaXJuYW1lKHNpZ19maWxlKSkKICAgICAgICByZXF1ZXN0ID0gc2VsZi5lbmNvZGVfcmVxdWVzdChkLml0ZW1zKCksIGZpbGVzKQogICAgICAgIHJldHVybiBzZWxmLnNlbmRfcmVxdWVzdChyZXF1ZXN0KQoKICAgIGRlZiB1cGxvYWRfZG9jdW1lbnRhdGlvbihzZWxmLCBtZXRhZGF0YSwgZG9jX2Rpcik6CiAgICAgICAgIiIiCiAgICAgICAgVXBsb2FkIGRvY3VtZW50YXRpb24gdG8gdGhlIGluZGV4LgoKICAgICAgICA6cGFyYW0gbWV0YWRhdGE6IEEgOmNsYXNzOmBNZXRhZGF0YWAgaW5zdGFuY2UgZGVmaW5pbmcgYXQgbGVhc3QgYSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBkb2N1bWVudGF0aW9uIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWRlZC4KICAgICAgICA6cGFyYW0gZG9jX2RpcjogVGhlIHBhdGhuYW1lIG9mIHRoZSBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb24uIFRoaXMgc2hvdWxkIGJlIHRoZSBkaXJlY3RvcnkgdGhhdAogICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyB0aGUgYGBpbmRleC5odG1sYGAgZm9yIHRoZSBkb2N1bWVudGF0aW9uLgogICAgICAgIDpyZXR1cm46IFRoZSBIVFRQIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gUHlQSSB1cG9uIHN1Ym1pc3Npb24gb2YgdGhlCiAgICAgICAgICAgICAgICByZXF1ZXN0LgogICAgICAgICIiIgogICAgICAgIHNlbGYuY2hlY2tfY3JlZGVudGlhbHMoKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRvY19kaXIpOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdub3QgYSBkaXJlY3Rvcnk6ICVyJyAlIGRvY19kaXIpCiAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4oZG9jX2RpciwgJ2luZGV4Lmh0bWwnKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmbik6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ25vdCBmb3VuZDogJXInICUgZm4pCiAgICAgICAgbWV0YWRhdGEudmFsaWRhdGUoKQogICAgICAgIG5hbWUsIHZlcnNpb24gPSBtZXRhZGF0YS5uYW1lLCBtZXRhZGF0YS52ZXJzaW9uCiAgICAgICAgemlwX2RhdGEgPSB6aXBfZGlyKGRvY19kaXIpLmdldHZhbHVlKCkKICAgICAgICBmaWVsZHMgPSBbKCc6YWN0aW9uJywgJ2RvY191cGxvYWQnKSwKICAgICAgICAgICAgICAgICAgKCduYW1lJywgbmFtZSksICgndmVyc2lvbicsIHZlcnNpb24pXQogICAgICAgIGZpbGVzID0gWygnY29udGVudCcsIG5hbWUsIHppcF9kYXRhKV0KICAgICAgICByZXF1ZXN0ID0gc2VsZi5lbmNvZGVfcmVxdWVzdChmaWVsZHMsIGZpbGVzKQogICAgICAgIHJldHVybiBzZWxmLnNlbmRfcmVxdWVzdChyZXF1ZXN0KQoKICAgIGRlZiBnZXRfdmVyaWZ5X2NvbW1hbmQoc2VsZiwgc2lnbmF0dXJlX2ZpbGVuYW1lLCBkYXRhX2ZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzdG9yZT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBzdWl0YWJsZSBjb21tYW5kIGZvciB2ZXJpZnlpbmcgYSBmaWxlLgoKICAgICAgICA6cGFyYW0gc2lnbmF0dXJlX2ZpbGVuYW1lOiBUaGUgcGF0aG5hbWUgdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUuCiAgICAgICAgOnBhcmFtIGRhdGFfZmlsZW5hbWU6IFRoZSBwYXRobmFtZSB0byB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgZGF0YS4KICAgICAgICA6cGFyYW0ga2V5c3RvcmU6IFRoZSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHRoZSBrZXlzCiAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHZlcmlmaWNhdGlvbi4gSWYgbm90IHNwZWNpZmllZCwgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSdzIGBgZ3BnX2hvbWVgYCBhdHRyaWJ1dGUgaXMgdXNlZCBpbnN0ZWFkLgogICAgICAgIDpyZXR1cm46IFRoZSB2ZXJpZnlpbmcgY29tbWFuZCBhcyBhIGxpc3Qgc3VpdGFibGUgdG8gYmUKICAgICAgICAgICAgICAgICBwYXNzZWQgdG8gOmNsYXNzOmBzdWJwcm9jZXNzLlBvcGVuYC4KICAgICAgICAiIiIKICAgICAgICBjbWQgPSBbc2VsZi5ncGcsICctLXN0YXR1cy1mZCcsICcyJywgJy0tbm8tdHR5J10KICAgICAgICBpZiBrZXlzdG9yZSBpcyBOb25lOgogICAgICAgICAgICBrZXlzdG9yZSA9IHNlbGYuZ3BnX2hvbWUKICAgICAgICBpZiBrZXlzdG9yZToKICAgICAgICAgICAgY21kLmV4dGVuZChbJy0taG9tZWRpcicsIGtleXN0b3JlXSkKICAgICAgICBjbWQuZXh0ZW5kKFsnLS12ZXJpZnknLCBzaWduYXR1cmVfZmlsZW5hbWUsIGRhdGFfZmlsZW5hbWVdKQogICAgICAgIGxvZ2dlci5kZWJ1ZygnaW52b2tpbmc6ICVzJywgJyAnLmpvaW4oY21kKSkKICAgICAgICByZXR1cm4gY21kCgogICAgZGVmIHZlcmlmeV9zaWduYXR1cmUoc2VsZiwgc2lnbmF0dXJlX2ZpbGVuYW1lLCBkYXRhX2ZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAga2V5c3RvcmU9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgVmVyaWZ5IGEgc2lnbmF0dXJlIGZvciBhIGZpbGUuCgogICAgICAgIDpwYXJhbSBzaWduYXR1cmVfZmlsZW5hbWU6IFRoZSBwYXRobmFtZSB0byB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZS4KICAgICAgICA6cGFyYW0gZGF0YV9maWxlbmFtZTogVGhlIHBhdGhuYW1lIHRvIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBkYXRhLgogICAgICAgIDpwYXJhbSBrZXlzdG9yZTogVGhlIHBhdGggdG8gYSBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgdGhlIGtleXMKICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gdmVyaWZpY2F0aW9uLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlJ3MgYGBncGdfaG9tZWBgIGF0dHJpYnV0ZSBpcyB1c2VkIGluc3RlYWQuCiAgICAgICAgOnJldHVybjogVHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIHdhcyB2ZXJpZmllZCwgZWxzZSBGYWxzZS4KICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5ncGc6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ3ZlcmlmaWNhdGlvbiB1bmF2YWlsYWJsZSBiZWNhdXNlIGdwZyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuYXZhaWxhYmxlJykKICAgICAgICBjbWQgPSBzZWxmLmdldF92ZXJpZnlfY29tbWFuZChzaWduYXR1cmVfZmlsZW5hbWUsIGRhdGFfZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c3RvcmUpCiAgICAgICAgcmMsIHN0ZG91dCwgc3RkZXJyID0gc2VsZi5ydW5fY29tbWFuZChjbWQpCiAgICAgICAgaWYgcmMgbm90IGluICgwLCAxKToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigndmVyaWZ5IGNvbW1hbmQgZmFpbGVkIHdpdGggZXJyb3IgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb2RlICVzJyAlIHJjKQogICAgICAgIHJldHVybiByYyA9PSAwCgogICAgZGVmIGRvd25sb2FkX2ZpbGUoc2VsZiwgdXJsLCBkZXN0ZmlsZSwgZGlnZXN0PU5vbmUsIHJlcG9ydGhvb2s9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgZG93bmxvYWRpbmcgYSBmaWxlIGZyb20gYW4gVVJMLgogICAgICAgIE5vcm1hbGx5LCB0aGlzIHdpbGwgYmUgYSBmaWxlIGZyb20gdGhlIGluZGV4LCB0aG91Z2ggY3VycmVudGx5CiAgICAgICAgbm8gY2hlY2sgaXMgbWFkZSBmb3IgdGhpcyAoaS5lLiBhIGZpbGUgY2FuIGJlIGRvd25sb2FkZWQgZnJvbQogICAgICAgIGFueXdoZXJlKS4KCiAgICAgICAgVGhlIG1ldGhvZCBpcyBqdXN0IGxpa2UgdGhlIDpmdW5jOmB1cmxyZXRyaWV2ZWAgZnVuY3Rpb24gaW4gdGhlCiAgICAgICAgc3RhbmRhcmQgbGlicmFyeSwgZXhjZXB0IHRoYXQgaXQgYWxsb3dzIGRpZ2VzdCBjb21wdXRhdGlvbiB0byBiZQogICAgICAgIGRvbmUgZHVyaW5nIGRvd25sb2FkIGFuZCBjaGVja2luZyB0aGF0IHRoZSBkb3dubG9hZGVkIGRhdGEKICAgICAgICBtYXRjaGVkIGFueSBleHBlY3RlZCB2YWx1ZS4KCiAgICAgICAgOnBhcmFtIHVybDogVGhlIFVSTCBvZiB0aGUgZmlsZSB0byBiZSBkb3dubG9hZGVkIChhc3N1bWVkIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIHZpYSBhbiBIVFRQIEdFVCByZXF1ZXN0KS4KICAgICAgICA6cGFyYW0gZGVzdGZpbGU6IFRoZSBwYXRobmFtZSB3aGVyZSB0aGUgZG93bmxvYWRlZCBmaWxlIGlzIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZC4KICAgICAgICA6cGFyYW0gZGlnZXN0OiBJZiBzcGVjaWZpZWQsIHRoaXMgbXVzdCBiZSBhIChoYXNoZXIsIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgIHR1cGxlLCB3aGVyZSBoYXNoZXIgaXMgdGhlIGFsZ29yaXRobSB1c2VkIChlLmcuCiAgICAgICAgICAgICAgICAgICAgICAgYGAnbWQ1J2BgKSBhbmQgYGB2YWx1ZWBgIGlzIHRoZSBleHBlY3RlZCB2YWx1ZS4KICAgICAgICA6cGFyYW0gcmVwb3J0aG9vazogVGhlIHNhbWUgYXMgZm9yIDpmdW5jOmB1cmxyZXRyaWV2ZWAgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkIGxpYnJhcnkuCiAgICAgICAgIiIiCiAgICAgICAgaWYgZGlnZXN0IGlzIE5vbmU6CiAgICAgICAgICAgIGRpZ2VzdGVyID0gTm9uZQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ05vIGRpZ2VzdCBzcGVjaWZpZWQnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGlnZXN0LCAobGlzdCwgdHVwbGUpKToKICAgICAgICAgICAgICAgIGhhc2hlciwgZGlnZXN0ID0gZGlnZXN0CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBoYXNoZXIgPSAnbWQ1JwogICAgICAgICAgICBkaWdlc3RlciA9IGdldGF0dHIoaGFzaGxpYiwgaGFzaGVyKSgpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRGlnZXN0IHNwZWNpZmllZDogJXMnICUgZGlnZXN0KQogICAgICAgICMgVGhlIGZvbGxvd2luZyBjb2RlIGlzIGVxdWl2YWxlbnQgdG8gdXJscmV0cmlldmUuCiAgICAgICAgIyBXZSBuZWVkIHRvIGRvIGl0IHRoaXMgd2F5IHNvIHRoYXQgd2UgY2FuIGNvbXB1dGUgdGhlCiAgICAgICAgIyBkaWdlc3Qgb2YgdGhlIGZpbGUgYXMgd2UgZ28uCiAgICAgICAgd2l0aCBvcGVuKGRlc3RmaWxlLCAnd2InKSBhcyBkZnA6CiAgICAgICAgICAgICMgYWRkaW5mb3VybCBpcyBub3QgYSBjb250ZXh0IG1hbmFnZXIgb24gMi54CiAgICAgICAgICAgICMgc28gd2UgaGF2ZSB0byB1c2UgdHJ5L2ZpbmFsbHkKICAgICAgICAgICAgc2ZwID0gc2VsZi5zZW5kX3JlcXVlc3QoUmVxdWVzdCh1cmwpKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBoZWFkZXJzID0gc2ZwLmluZm8oKQogICAgICAgICAgICAgICAgYmxvY2tzaXplID0gODE5MgogICAgICAgICAgICAgICAgc2l6ZSA9IC0xCiAgICAgICAgICAgICAgICByZWFkID0gMAogICAgICAgICAgICAgICAgYmxvY2tudW0gPSAwCiAgICAgICAgICAgICAgICBpZiAiY29udGVudC1sZW5ndGgiIGluIGhlYWRlcnM6CiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGludChoZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdKQogICAgICAgICAgICAgICAgaWYgcmVwb3J0aG9vazoKICAgICAgICAgICAgICAgICAgICByZXBvcnRob29rKGJsb2NrbnVtLCBibG9ja3NpemUsIHNpemUpCiAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgICAgIGJsb2NrID0gc2ZwLnJlYWQoYmxvY2tzaXplKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBibG9jazoKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICByZWFkICs9IGxlbihibG9jaykKICAgICAgICAgICAgICAgICAgICBkZnAud3JpdGUoYmxvY2spCiAgICAgICAgICAgICAgICAgICAgaWYgZGlnZXN0ZXI6CiAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2VzdGVyLnVwZGF0ZShibG9jaykKICAgICAgICAgICAgICAgICAgICBibG9ja251bSArPSAxCiAgICAgICAgICAgICAgICAgICAgaWYgcmVwb3J0aG9vazoKICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0aG9vayhibG9ja251bSwgYmxvY2tzaXplLCBzaXplKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgc2ZwLmNsb3NlKCkKCiAgICAgICAgIyBjaGVjayB0aGF0IHdlIGdvdCB0aGUgd2hvbGUgZmlsZSwgaWYgd2UgY2FuCiAgICAgICAgaWYgc2l6ZSA+PSAwIGFuZCByZWFkIDwgc2l6ZToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICdyZXRyaWV2YWwgaW5jb21wbGV0ZTogZ290IG9ubHkgJWQgb3V0IG9mICVkIGJ5dGVzJwogICAgICAgICAgICAgICAgJSAocmVhZCwgc2l6ZSkpCiAgICAgICAgIyBpZiB3ZSBoYXZlIGEgZGlnZXN0LCBpdCBtdXN0IG1hdGNoLgogICAgICAgIGlmIGRpZ2VzdGVyOgogICAgICAgICAgICBhY3R1YWwgPSBkaWdlc3Rlci5oZXhkaWdlc3QoKQogICAgICAgICAgICBpZiBkaWdlc3QgIT0gYWN0dWFsOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignJXMgZGlnZXN0IG1pc21hdGNoIGZvciAlczogZXhwZWN0ZWQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMsIGdvdCAlcycgJSAoaGFzaGVyLCBkZXN0ZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2VzdCwgYWN0dWFsKSkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdEaWdlc3QgdmVyaWZpZWQ6ICVzJywgZGlnZXN0KQoKICAgIGRlZiBzZW5kX3JlcXVlc3Qoc2VsZiwgcmVxKToKICAgICAgICAiIiIKICAgICAgICBTZW5kIGEgc3RhbmRhcmQgbGlicmFyeSA6Y2xhc3M6YFJlcXVlc3RgIHRvIFB5UEkgYW5kIHJldHVybiBpdHMKICAgICAgICByZXNwb25zZS4KCiAgICAgICAgOnBhcmFtIHJlcTogVGhlIHJlcXVlc3QgdG8gc2VuZC4KICAgICAgICA6cmV0dXJuOiBUaGUgSFRUUCByZXNwb25zZSBmcm9tIFB5UEkgKGEgc3RhbmRhcmQgbGlicmFyeSBIVFRQUmVzcG9uc2UpLgogICAgICAgICIiIgogICAgICAgIGhhbmRsZXJzID0gW10KICAgICAgICBpZiBzZWxmLnBhc3N3b3JkX2hhbmRsZXI6CiAgICAgICAgICAgIGhhbmRsZXJzLmFwcGVuZChzZWxmLnBhc3N3b3JkX2hhbmRsZXIpCiAgICAgICAgaWYgc2VsZi5zc2xfdmVyaWZpZXI6CiAgICAgICAgICAgIGhhbmRsZXJzLmFwcGVuZChzZWxmLnNzbF92ZXJpZmllcikKICAgICAgICBvcGVuZXIgPSBidWlsZF9vcGVuZXIoKmhhbmRsZXJzKQogICAgICAgIHJldHVybiBvcGVuZXIub3BlbihyZXEpCgogICAgZGVmIGVuY29kZV9yZXF1ZXN0KHNlbGYsIGZpZWxkcywgZmlsZXMpOgogICAgICAgICIiIgogICAgICAgIEVuY29kZSBmaWVsZHMgYW5kIGZpbGVzIGZvciBwb3N0aW5nIHRvIGFuIEhUVFAgc2VydmVyLgoKICAgICAgICA6cGFyYW0gZmllbGRzOiBUaGUgZmllbGRzIHRvIHNlbmQgYXMgYSBsaXN0IG9mIChmaWVsZG5hbWUsIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgIHR1cGxlcy4KICAgICAgICA6cGFyYW0gZmlsZXM6IFRoZSBmaWxlcyB0byBzZW5kIGFzIGEgbGlzdCBvZiAoZmllbGRuYW1lLCBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgIGZpbGVfYnl0ZXMpIHR1cGxlLgogICAgICAgICIiIgogICAgICAgICMgQWRhcHRlZCBmcm9tIHBhY2thZ2luZywgd2hpY2ggaW4gdHVybiB3YXMgYWRhcHRlZCBmcm9tCiAgICAgICAgIyBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy8xNDYzMDYKCiAgICAgICAgcGFydHMgPSBbXQogICAgICAgIGJvdW5kYXJ5ID0gc2VsZi5ib3VuZGFyeQogICAgICAgIGZvciBrLCB2YWx1ZXMgaW4gZmllbGRzOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZXMsIChsaXN0LCB0dXBsZSkpOgogICAgICAgICAgICAgICAgdmFsdWVzID0gW3ZhbHVlc10KCiAgICAgICAgICAgIGZvciB2IGluIHZhbHVlczoKICAgICAgICAgICAgICAgIHBhcnRzLmV4dGVuZCgoCiAgICAgICAgICAgICAgICAgICAgYictLScgKyBib3VuZGFyeSwKICAgICAgICAgICAgICAgICAgICAoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iJXMiJyAlCiAgICAgICAgICAgICAgICAgICAgIGspLmVuY29kZSgndXRmLTgnKSwKICAgICAgICAgICAgICAgICAgICBiJycsCiAgICAgICAgICAgICAgICAgICAgdi5lbmNvZGUoJ3V0Zi04JykpKQogICAgICAgIGZvciBrZXksIGZpbGVuYW1lLCB2YWx1ZSBpbiBmaWxlczoKICAgICAgICAgICAgcGFydHMuZXh0ZW5kKCgKICAgICAgICAgICAgICAgIGInLS0nICsgYm91bmRhcnksCiAgICAgICAgICAgICAgICAoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iJXMiOyBmaWxlbmFtZT0iJXMiJyAlCiAgICAgICAgICAgICAgICAgKGtleSwgZmlsZW5hbWUpKS5lbmNvZGUoJ3V0Zi04JyksCiAgICAgICAgICAgICAgICBiJycsCiAgICAgICAgICAgICAgICB2YWx1ZSkpCgogICAgICAgIHBhcnRzLmV4dGVuZCgoYictLScgKyBib3VuZGFyeSArIGInLS0nLCBiJycpKQoKICAgICAgICBib2R5ID0gYidcclxuJy5qb2luKHBhcnRzKQogICAgICAgIGN0ID0gYidtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0nICsgYm91bmRhcnkKICAgICAgICBoZWFkZXJzID0gewogICAgICAgICAgICAnQ29udGVudC10eXBlJzogY3QsCiAgICAgICAgICAgICdDb250ZW50LWxlbmd0aCc6IHN0cihsZW4oYm9keSkpCiAgICAgICAgfQogICAgICAgIHJldHVybiBSZXF1ZXN0KHNlbGYudXJsLCBib2R5LCBoZWFkZXJzKQoKICAgIGRlZiBzZWFyY2goc2VsZiwgdGVybXMsIG9wZXJhdG9yPU5vbmUpOgogICAgICAgIGlmIGlzaW5zdGFuY2UodGVybXMsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHRlcm1zID0geyduYW1lJzogdGVybXN9CiAgICAgICAgaWYgc2VsZi5ycGNfcHJveHkgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5ycGNfcHJveHkgPSBTZXJ2ZXJQcm94eShzZWxmLnVybCwgdGltZW91dD0zLjApCiAgICAgICAgcmV0dXJuIHNlbGYucnBjX3Byb3h5LnNlYXJjaCh0ZXJtcywgb3BlcmF0b3Igb3IgJ2FuZCcpClBLAwQUAAAAAAAAACEA0cV4r0XHAABFxwAALwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL2xvY2F0b3JzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMi0yMDE1IFZpbmF5IFNhamlwLgojIExpY2Vuc2VkIHRvIHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciBhIGNvbnRyaWJ1dG9yIGFncmVlbWVudC4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKCmltcG9ydCBnemlwCmZyb20gaW8gaW1wb3J0IEJ5dGVzSU8KaW1wb3J0IGpzb24KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBwb3NpeHBhdGgKaW1wb3J0IHJlCnRyeToKICAgIGltcG9ydCB0aHJlYWRpbmcKZXhjZXB0IEltcG9ydEVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBpbXBvcnQgZHVtbXlfdGhyZWFkaW5nIGFzIHRocmVhZGluZwppbXBvcnQgemxpYgoKZnJvbSAuIGltcG9ydCBEaXN0bGliRXhjZXB0aW9uCmZyb20gLmNvbXBhdCBpbXBvcnQgKHVybGpvaW4sIHVybHBhcnNlLCB1cmx1bnBhcnNlLCB1cmwycGF0aG5hbWUsIHBhdGhuYW1lMnVybCwKICAgICAgICAgICAgICAgICAgICAgcXVldWUsIHF1b3RlLCB1bmVzY2FwZSwgc3RyaW5nX3R5cGVzLCBidWlsZF9vcGVuZXIsCiAgICAgICAgICAgICAgICAgICAgIEhUVFBSZWRpcmVjdEhhbmRsZXIgYXMgQmFzZVJlZGlyZWN0SGFuZGxlciwgdGV4dF90eXBlLAogICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0LCBIVFRQRXJyb3IsIFVSTEVycm9yKQpmcm9tIC5kYXRhYmFzZSBpbXBvcnQgRGlzdHJpYnV0aW9uLCBEaXN0cmlidXRpb25QYXRoLCBtYWtlX2Rpc3QKZnJvbSAubWV0YWRhdGEgaW1wb3J0IE1ldGFkYXRhCmZyb20gLnV0aWwgaW1wb3J0IChjYWNoZWRfcHJvcGVydHksIHBhcnNlX2NyZWRlbnRpYWxzLCBlbnN1cmVfc2xhc2gsCiAgICAgICAgICAgICAgICAgICBzcGxpdF9maWxlbmFtZSwgZ2V0X3Byb2plY3RfZGF0YSwgcGFyc2VfcmVxdWlyZW1lbnQsCiAgICAgICAgICAgICAgICAgICBwYXJzZV9uYW1lX2FuZF92ZXJzaW9uLCBTZXJ2ZXJQcm94eSwgbm9ybWFsaXplX25hbWUpCmZyb20gLnZlcnNpb24gaW1wb3J0IGdldF9zY2hlbWUsIFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yCmZyb20gLndoZWVsIGltcG9ydCBXaGVlbCwgaXNfY29tcGF0aWJsZQoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgpIQVNIRVJfSEFTSCA9IHJlLmNvbXBpbGUoJ14oXHcrKT0oW2EtZjAtOV0rKScpCkNIQVJTRVQgPSByZS5jb21waWxlKHInO1xzKmNoYXJzZXRccyo9XHMqKC4qKVxzKiQnLCByZS5JKQpIVE1MX0NPTlRFTlRfVFlQRSA9IHJlLmNvbXBpbGUoJ3RleHQvaHRtbHxhcHBsaWNhdGlvbi94KGh0KT9tbCcpCkRFRkFVTFRfSU5ERVggPSAnaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaScKCmRlZiBnZXRfYWxsX2Rpc3RyaWJ1dGlvbl9uYW1lcyh1cmw9Tm9uZSk6CiAgICAiIiIKICAgIFJldHVybiBhbGwgZGlzdHJpYnV0aW9uIG5hbWVzIGtub3duIGJ5IGFuIGluZGV4LgogICAgOnBhcmFtIHVybDogVGhlIFVSTCBvZiB0aGUgaW5kZXguCiAgICA6cmV0dXJuOiBBIGxpc3Qgb2YgYWxsIGtub3duIGRpc3RyaWJ1dGlvbiBuYW1lcy4KICAgICIiIgogICAgaWYgdXJsIGlzIE5vbmU6CiAgICAgICAgdXJsID0gREVGQVVMVF9JTkRFWAogICAgY2xpZW50ID0gU2VydmVyUHJveHkodXJsLCB0aW1lb3V0PTMuMCkKICAgIHJldHVybiBjbGllbnQubGlzdF9wYWNrYWdlcygpCgpjbGFzcyBSZWRpcmVjdEhhbmRsZXIoQmFzZVJlZGlyZWN0SGFuZGxlcik6CiAgICAiIiIKICAgIEEgY2xhc3MgdG8gd29yayBhcm91bmQgYSBidWcgaW4gc29tZSBQeXRob24gMy4yLnggcmVsZWFzZXMuCiAgICAiIiIKICAgICMgVGhlcmUncyBhIGJ1ZyBpbiB0aGUgYmFzZSB2ZXJzaW9uIGZvciBzb21lIDMuMi54CiAgICAjIChlLmcuIDMuMi4yIG9uIFVidW50dSBPbmVpcmljKS4gSWYgYSBMb2NhdGlvbiBoZWFkZXIKICAgICMgcmV0dXJucyBlLmcuIC9hYmMsIGl0IGJhaWxzIGJlY2F1c2UgaXQgc2F5cyB0aGUgc2NoZW1lICcnCiAgICAjIGlzIGJvZ3VzLCB3aGVuIGFjdHVhbGx5IGl0IHNob3VsZCB1c2UgdGhlIHJlcXVlc3QncwogICAgIyBVUkwgZm9yIHRoZSBzY2hlbWUuIFNlZSBQeXRob24gaXNzdWUgIzEzNjk2LgogICAgZGVmIGh0dHBfZXJyb3JfMzAyKHNlbGYsIHJlcSwgZnAsIGNvZGUsIG1zZywgaGVhZGVycyk6CiAgICAgICAgIyBTb21lIHNlcnZlcnMgKGluY29ycmVjdGx5KSByZXR1cm4gbXVsdGlwbGUgTG9jYXRpb24gaGVhZGVycwogICAgICAgICMgKHNvIHByb2JhYmx5IHNhbWUgZ29lcyBmb3IgVVJJKS4gIFVzZSBmaXJzdCBoZWFkZXIuCiAgICAgICAgbmV3dXJsID0gTm9uZQogICAgICAgIGZvciBrZXkgaW4gKCdsb2NhdGlvbicsICd1cmknKToKICAgICAgICAgICAgaWYga2V5IGluIGhlYWRlcnM6CiAgICAgICAgICAgICAgICBuZXd1cmwgPSBoZWFkZXJzW2tleV0KICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgbmV3dXJsIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHVybHBhcnRzID0gdXJscGFyc2UobmV3dXJsKQogICAgICAgIGlmIHVybHBhcnRzLnNjaGVtZSA9PSAnJzoKICAgICAgICAgICAgbmV3dXJsID0gdXJsam9pbihyZXEuZ2V0X2Z1bGxfdXJsKCksIG5ld3VybCkKICAgICAgICAgICAgaWYgaGFzYXR0cihoZWFkZXJzLCAncmVwbGFjZV9oZWFkZXInKToKICAgICAgICAgICAgICAgIGhlYWRlcnMucmVwbGFjZV9oZWFkZXIoa2V5LCBuZXd1cmwpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBoZWFkZXJzW2tleV0gPSBuZXd1cmwKICAgICAgICByZXR1cm4gQmFzZVJlZGlyZWN0SGFuZGxlci5odHRwX2Vycm9yXzMwMihzZWxmLCByZXEsIGZwLCBjb2RlLCBtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycykKCiAgICBodHRwX2Vycm9yXzMwMSA9IGh0dHBfZXJyb3JfMzAzID0gaHR0cF9lcnJvcl8zMDcgPSBodHRwX2Vycm9yXzMwMgoKY2xhc3MgTG9jYXRvcihvYmplY3QpOgogICAgIiIiCiAgICBBIGJhc2UgY2xhc3MgZm9yIGxvY2F0b3JzIC0gdGhpbmdzIHRoYXQgbG9jYXRlIGRpc3RyaWJ1dGlvbnMuCiAgICAiIiIKICAgIHNvdXJjZV9leHRlbnNpb25zID0gKCcudGFyLmd6JywgJy50YXIuYnoyJywgJy50YXInLCAnLnppcCcsICcudGd6JywgJy50YnonKQogICAgYmluYXJ5X2V4dGVuc2lvbnMgPSAoJy5lZ2cnLCAnLmV4ZScsICcud2hsJykKICAgIGV4Y2x1ZGVkX2V4dGVuc2lvbnMgPSAoJy5wZGYnLCkKCiAgICAjIEEgbGlzdCBvZiB0YWdzIGluZGljYXRpbmcgd2hpY2ggd2hlZWxzIHlvdSB3YW50IHRvIG1hdGNoLiBUaGUgZGVmYXVsdAogICAgIyB2YWx1ZSBvZiBOb25lIG1hdGNoZXMgYWdhaW5zdCB0aGUgdGFncyBjb21wYXRpYmxlIHdpdGggdGhlIHJ1bm5pbmcKICAgICMgUHl0aG9uLiBJZiB5b3Ugd2FudCB0byBtYXRjaCBvdGhlciB2YWx1ZXMsIHNldCB3aGVlbF90YWdzIG9uIGEgbG9jYXRvcgogICAgIyBpbnN0YW5jZSB0byBhIGxpc3Qgb2YgdHVwbGVzIChweXZlciwgYWJpLCBhcmNoKSB3aGljaCB5b3Ugd2FudCB0byBtYXRjaC4KICAgIHdoZWVsX3RhZ3MgPSBOb25lCgogICAgZG93bmxvYWRhYmxlX2V4dGVuc2lvbnMgPSBzb3VyY2VfZXh0ZW5zaW9ucyArICgnLndobCcsKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzY2hlbWU9J2RlZmF1bHQnKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLgogICAgICAgIDpwYXJhbSBzY2hlbWU6IEJlY2F1c2UgbG9jYXRvcnMgbG9vayBmb3IgbW9zdCByZWNlbnQgdmVyc2lvbnMsIHRoZXkKICAgICAgICAgICAgICAgICAgICAgICBuZWVkIHRvIGtub3cgdGhlIHZlcnNpb24gc2NoZW1lIHRvIHVzZS4gVGhpcyBzcGVjaWZpZXMKICAgICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBQRVAtcmVjb21tZW5kZWQgc2NoZW1lIC0gdXNlIGBgJ2xlZ2FjeSdgYAogICAgICAgICAgICAgICAgICAgICAgIGlmIHlvdSBuZWVkIHRvIHN1cHBvcnQgZXhpc3RpbmcgZGlzdHJpYnV0aW9ucyBvbiBQeVBJLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NhY2hlID0ge30KICAgICAgICBzZWxmLnNjaGVtZSA9IHNjaGVtZQogICAgICAgICMgQmVjYXVzZSBvZiBidWdzIGluIHNvbWUgb2YgdGhlIGhhbmRsZXJzIG9uIHNvbWUgb2YgdGhlIHBsYXRmb3JtcywKICAgICAgICAjIHdlIHVzZSBvdXIgb3duIG9wZW5lciByYXRoZXIgdGhhbiBqdXN0IHVzaW5nIHVybG9wZW4uCiAgICAgICAgc2VsZi5vcGVuZXIgPSBidWlsZF9vcGVuZXIoUmVkaXJlY3RIYW5kbGVyKCkpCiAgICAgICAgIyBJZiBnZXRfcHJvamVjdCgpIGlzIGNhbGxlZCBmcm9tIGxvY2F0ZSgpLCB0aGUgbWF0Y2hlciBpbnN0YW5jZQogICAgICAgICMgaXMgc2V0IGZyb20gdGhlIHJlcXVpcmVtZW50IHBhc3NlZCB0byBsb2NhdGUoKS4gU2VlIGlzc3VlICMxOCBmb3IKICAgICAgICAjIHdoeSB0aGlzIGNhbiBiZSB1c2VmdWwgdG8ga25vdy4KICAgICAgICBzZWxmLm1hdGNoZXIgPSBOb25lCiAgICAgICAgc2VsZi5lcnJvcnMgPSBxdWV1ZS5RdWV1ZSgpCgogICAgZGVmIGdldF9lcnJvcnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGFueSBlcnJvcnMgd2hpY2ggaGF2ZSBvY2N1cnJlZC4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgIHdoaWxlIG5vdCBzZWxmLmVycm9ycy5lbXB0eSgpOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGUgPSBzZWxmLmVycm9ycy5nZXQoRmFsc2UpCiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGUpCiAgICAgICAgICAgIGV4Y2VwdCBzZWxmLmVycm9ycy5FbXB0eToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHNlbGYuZXJyb3JzLnRhc2tfZG9uZSgpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBjbGVhcl9lcnJvcnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ2xlYXIgYW55IGVycm9ycyB3aGljaCBtYXkgaGF2ZSBiZWVuIGxvZ2dlZC4KICAgICAgICAiIiIKICAgICAgICAjIEp1c3QgZ2V0IHRoZSBlcnJvcnMgYW5kIHRocm93IHRoZW0gYXdheQogICAgICAgIHNlbGYuZ2V0X2Vycm9ycygpCgogICAgZGVmIGNsZWFyX2NhY2hlKHNlbGYpOgogICAgICAgIHNlbGYuX2NhY2hlLmNsZWFyKCkKCiAgICBkZWYgX2dldF9zY2hlbWUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3NjaGVtZQoKICAgIGRlZiBfc2V0X3NjaGVtZShzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fc2NoZW1lID0gdmFsdWUKCiAgICBzY2hlbWUgPSBwcm9wZXJ0eShfZ2V0X3NjaGVtZSwgX3NldF9zY2hlbWUpCgogICAgZGVmIF9nZXRfcHJvamVjdChzZWxmLCBuYW1lKToKICAgICAgICAiIiIKICAgICAgICBGb3IgYSBnaXZlbiBwcm9qZWN0LCBnZXQgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgYXZhaWxhYmxlIHZlcnNpb25zIHRvIERpc3RyaWJ1dGlvbgogICAgICAgIGluc3RhbmNlcy4KCiAgICAgICAgVGhpcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3Nlcy4KCiAgICAgICAgSWYgY2FsbGVkIGZyb20gYSBsb2NhdGUoKSByZXF1ZXN0LCBzZWxmLm1hdGNoZXIgd2lsbCBiZSBzZXQgdG8gYQogICAgICAgIG1hdGNoZXIgZm9yIHRoZSByZXF1aXJlbWVudCB0byBzYXRpc2Z5LCBvdGhlcndpc2UgaXQgd2lsbCBiZSBOb25lLgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ1BsZWFzZSBpbXBsZW1lbnQgaW4gdGhlIHN1YmNsYXNzJykKCiAgICBkZWYgZ2V0X2Rpc3RyaWJ1dGlvbl9uYW1lcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYWxsIHRoZSBkaXN0cmlidXRpb24gbmFtZXMga25vd24gdG8gdGhpcyBsb2NhdG9yLgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ1BsZWFzZSBpbXBsZW1lbnQgaW4gdGhlIHN1YmNsYXNzJykKCiAgICBkZWYgZ2V0X3Byb2plY3Qoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgRm9yIGEgZ2l2ZW4gcHJvamVjdCwgZ2V0IGEgZGljdGlvbmFyeSBtYXBwaW5nIGF2YWlsYWJsZSB2ZXJzaW9ucyB0byBEaXN0cmlidXRpb24KICAgICAgICBpbnN0YW5jZXMuCgogICAgICAgIFRoaXMgY2FsbHMgX2dldF9wcm9qZWN0IHRvIGRvIGFsbCB0aGUgd29yaywgYW5kIGp1c3QgaW1wbGVtZW50cyBhIGNhY2hpbmcgbGF5ZXIgb24gdG9wLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuX2NhY2hlIGlzIE5vbmU6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2dldF9wcm9qZWN0KG5hbWUpCiAgICAgICAgZWxpZiBuYW1lIGluIHNlbGYuX2NhY2hlOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9jYWNoZVtuYW1lXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY2xlYXJfZXJyb3JzKCkKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fZ2V0X3Byb2plY3QobmFtZSkKICAgICAgICAgICAgc2VsZi5fY2FjaGVbbmFtZV0gPSByZXN1bHQKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHNjb3JlX3VybChzZWxmLCB1cmwpOgogICAgICAgICIiIgogICAgICAgIEdpdmUgYW4gdXJsIGEgc2NvcmUgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY2hvb3NlIHByZWZlcnJlZCBVUkxzCiAgICAgICAgZm9yIGEgZ2l2ZW4gcHJvamVjdCByZWxlYXNlLgogICAgICAgICIiIgogICAgICAgIHQgPSB1cmxwYXJzZSh1cmwpCiAgICAgICAgYmFzZW5hbWUgPSBwb3NpeHBhdGguYmFzZW5hbWUodC5wYXRoKQogICAgICAgIGNvbXBhdGlibGUgPSBUcnVlCiAgICAgICAgaXNfd2hlZWwgPSBiYXNlbmFtZS5lbmRzd2l0aCgnLndobCcpCiAgICAgICAgaWYgaXNfd2hlZWw6CiAgICAgICAgICAgIGNvbXBhdGlibGUgPSBpc19jb21wYXRpYmxlKFdoZWVsKGJhc2VuYW1lKSwgc2VsZi53aGVlbF90YWdzKQogICAgICAgIHJldHVybiAodC5zY2hlbWUgIT0gJ2h0dHBzJywgJ3B5cGkucHl0aG9uLm9yZycgaW4gdC5uZXRsb2MsCiAgICAgICAgICAgICAgICBpc193aGVlbCwgY29tcGF0aWJsZSwgYmFzZW5hbWUpCgogICAgZGVmIHByZWZlcl91cmwoc2VsZiwgdXJsMSwgdXJsMik6CiAgICAgICAgIiIiCiAgICAgICAgQ2hvb3NlIG9uZSBvZiB0d28gVVJMcyB3aGVyZSBib3RoIGFyZSBjYW5kaWRhdGVzIGZvciBkaXN0cmlidXRpb24KICAgICAgICBhcmNoaXZlcyBmb3IgdGhlIHNhbWUgdmVyc2lvbiBvZiBhIGRpc3RyaWJ1dGlvbiAoZm9yIGV4YW1wbGUsCiAgICAgICAgLnRhci5neiB2cy4gemlwKS4KCiAgICAgICAgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZmF2b3VycyBodHRwczovLyBVUkxzIG92ZXIgaHR0cDovLywgYXJjaGl2ZXMKICAgICAgICBmcm9tIFB5UEkgb3ZlciB0aG9zZSBmcm9tIG90aGVyIGxvY2F0aW9ucywgd2hlZWwgY29tcGF0aWJpbGl0eSAoaWYgYQogICAgICAgIHdoZWVsKSBhbmQgdGhlbiB0aGUgYXJjaGl2ZSBuYW1lLgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IHVybDIKICAgICAgICBpZiB1cmwxOgogICAgICAgICAgICBzMSA9IHNlbGYuc2NvcmVfdXJsKHVybDEpCiAgICAgICAgICAgIHMyID0gc2VsZi5zY29yZV91cmwodXJsMikKICAgICAgICAgICAgaWYgczEgPiBzMjoKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHVybDEKICAgICAgICAgICAgaWYgcmVzdWx0ICE9IHVybDI6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ05vdCByZXBsYWNpbmcgJXIgd2l0aCAlcicsIHVybDEsIHVybDIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlcGxhY2luZyAlciB3aXRoICVyJywgdXJsMSwgdXJsMikKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHNwbGl0X2ZpbGVuYW1lKHNlbGYsIGZpbGVuYW1lLCBwcm9qZWN0X25hbWUpOgogICAgICAgICIiIgogICAgICAgIEF0dGVtcHQgdG8gc3BsaXQgYSBmaWxlbmFtZSBpbiBwcm9qZWN0IG5hbWUsIHZlcnNpb24gYW5kIFB5dGhvbiB2ZXJzaW9uLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzcGxpdF9maWxlbmFtZShmaWxlbmFtZSwgcHJvamVjdF9uYW1lKQoKICAgIGRlZiBjb252ZXJ0X3VybF90b19kb3dubG9hZF9pbmZvKHNlbGYsIHVybCwgcHJvamVjdF9uYW1lKToKICAgICAgICAiIiIKICAgICAgICBTZWUgaWYgYSBVUkwgaXMgYSBjYW5kaWRhdGUgZm9yIGEgZG93bmxvYWQgVVJMIGZvciBhIHByb2plY3QgKHRoZSBVUkwKICAgICAgICBoYXMgdHlwaWNhbGx5IGJlZW4gc2NyYXBlZCBmcm9tIGFuIEhUTUwgcGFnZSkuCgogICAgICAgIElmIGl0IGlzLCBhIGRpY3Rpb25hcnkgaXMgcmV0dXJuZWQgd2l0aCBrZXlzICJuYW1lIiwgInZlcnNpb24iLAogICAgICAgICJmaWxlbmFtZSIgYW5kICJ1cmwiOyBvdGhlcndpc2UsIE5vbmUgaXMgcmV0dXJuZWQuCiAgICAgICAgIiIiCiAgICAgICAgZGVmIHNhbWVfcHJvamVjdChuYW1lMSwgbmFtZTIpOgogICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplX25hbWUobmFtZTEpID09IG5vcm1hbGl6ZV9uYW1lKG5hbWUyKQoKICAgICAgICByZXN1bHQgPSBOb25lCiAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWcgPSB1cmxwYXJzZSh1cmwpCiAgICAgICAgaWYgZnJhZy5sb3dlcigpLnN0YXJ0c3dpdGgoJ2VnZz0nKToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCclczogdmVyc2lvbiBoaW50IGluIGZyYWdtZW50OiAlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0X25hbWUsIGZyYWcpCiAgICAgICAgbSA9IEhBU0hFUl9IQVNILm1hdGNoKGZyYWcpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgYWxnbywgZGlnZXN0ID0gbS5ncm91cHMoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFsZ28sIGRpZ2VzdCA9IE5vbmUsIE5vbmUKICAgICAgICBvcmlncGF0aCA9IHBhdGgKICAgICAgICBpZiBwYXRoIGFuZCBwYXRoWy0xXSA9PSAnLyc6CiAgICAgICAgICAgIHBhdGggPSBwYXRoWzotMV0KICAgICAgICBpZiBwYXRoLmVuZHN3aXRoKCcud2hsJyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHdoZWVsID0gV2hlZWwocGF0aCkKICAgICAgICAgICAgICAgIGlmIGlzX2NvbXBhdGlibGUod2hlZWwsIHNlbGYud2hlZWxfdGFncyk6CiAgICAgICAgICAgICAgICAgICAgaWYgcHJvamVjdF9uYW1lIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IHNhbWVfcHJvamVjdCh3aGVlbC5uYW1lLCBwcm9qZWN0X25hbWUpCiAgICAgICAgICAgICAgICAgICAgaWYgaW5jbHVkZToKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiB3aGVlbC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nOiB3aGVlbC52ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbGVuYW1lJzogd2hlZWwuZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXJsJzogdXJsdW5wYXJzZSgoc2NoZW1lLCBuZXRsb2MsIG9yaWdwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgcXVlcnksICcnKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHl0aG9uLXZlcnNpb24nOiAnLCAnLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWycuJy5qb2luKGxpc3QodlsyOl0pKSBmb3IgdiBpbiB3aGVlbC5weXZlcl0pLAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ2ludmFsaWQgcGF0aCBmb3Igd2hlZWw6ICVzJywgcGF0aCkKICAgICAgICBlbGlmIHBhdGguZW5kc3dpdGgoc2VsZi5kb3dubG9hZGFibGVfZXh0ZW5zaW9ucyk6CiAgICAgICAgICAgIHBhdGggPSBmaWxlbmFtZSA9IHBvc2l4cGF0aC5iYXNlbmFtZShwYXRoKQogICAgICAgICAgICBmb3IgZXh0IGluIHNlbGYuZG93bmxvYWRhYmxlX2V4dGVuc2lvbnM6CiAgICAgICAgICAgICAgICBpZiBwYXRoLmVuZHN3aXRoKGV4dCk6CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGhbOi1sZW4oZXh0KV0KICAgICAgICAgICAgICAgICAgICB0ID0gc2VsZi5zcGxpdF9maWxlbmFtZShwYXRoLCBwcm9qZWN0X25hbWUpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnTm8gbWF0Y2ggZm9yIHByb2plY3QvdmVyc2lvbjogJXMnLCBwYXRoKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHZlcnNpb24sIHB5dmVyID0gdAogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgcHJvamVjdF9uYW1lIG9yIHNhbWVfcHJvamVjdChwcm9qZWN0X25hbWUsIG5hbWUpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyc2lvbic6IHZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbGVuYW1lJzogZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VybCc6IHVybHVucGFyc2UoKHNjaGVtZSwgbmV0bG9jLCBvcmlncGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBxdWVyeSwgJycpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ3BhY2thZ2V0eXBlJzogJ3NkaXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHB5dmVyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFsncHl0aG9uLXZlcnNpb24nXSA9IHB5dmVyCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiByZXN1bHQgYW5kIGFsZ286CiAgICAgICAgICAgIHJlc3VsdFsnJXNfZGlnZXN0JyAlIGFsZ29dID0gZGlnZXN0CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfZ2V0X2RpZ2VzdChzZWxmLCBpbmZvKToKICAgICAgICAiIiIKICAgICAgICBHZXQgYSBkaWdlc3QgZnJvbSBhIGRpY3Rpb25hcnkgYnkgbG9va2luZyBhdCBrZXlzIG9mIHRoZSBmb3JtCiAgICAgICAgJ2FsZ29fZGlnZXN0Jy4KCiAgICAgICAgUmV0dXJucyBhIDItdHVwbGUgKGFsZ28sIGRpZ2VzdCkgaWYgZm91bmQsIGVsc2UgTm9uZS4gQ3VycmVudGx5CiAgICAgICAgbG9va3Mgb25seSBmb3IgU0hBMjU2LCB0aGVuIE1ENS4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBOb25lCiAgICAgICAgZm9yIGFsZ28gaW4gKCdzaGEyNTYnLCAnbWQ1Jyk6CiAgICAgICAgICAgIGtleSA9ICclc19kaWdlc3QnICUgYWxnbwogICAgICAgICAgICBpZiBrZXkgaW4gaW5mbzoKICAgICAgICAgICAgICAgIHJlc3VsdCA9IChhbGdvLCBpbmZvW2tleV0pCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX3VwZGF0ZV92ZXJzaW9uX2RhdGEoc2VsZiwgcmVzdWx0LCBpbmZvKToKICAgICAgICAiIiIKICAgICAgICBVcGRhdGUgYSByZXN1bHQgZGljdGlvbmFyeSAodGhlIGZpbmFsIHJlc3VsdCBmcm9tIF9nZXRfcHJvamVjdCkgd2l0aCBhCiAgICAgICAgZGljdGlvbmFyeSBmb3IgYSBzcGVjaWZpYyB2ZXJzaW9uLCB3aGljaCB0eXBpY2FsbHkgaG9sZHMgaW5mb3JtYXRpb24KICAgICAgICBnbGVhbmVkIGZyb20gYSBmaWxlbmFtZSBvciBVUkwgZm9yIGFuIGFyY2hpdmUgZm9yIHRoZSBkaXN0cmlidXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgbmFtZSA9IGluZm8ucG9wKCduYW1lJykKICAgICAgICB2ZXJzaW9uID0gaW5mby5wb3AoJ3ZlcnNpb24nKQogICAgICAgIGlmIHZlcnNpb24gaW4gcmVzdWx0OgogICAgICAgICAgICBkaXN0ID0gcmVzdWx0W3ZlcnNpb25dCiAgICAgICAgICAgIG1kID0gZGlzdC5tZXRhZGF0YQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRpc3QgPSBtYWtlX2Rpc3QobmFtZSwgdmVyc2lvbiwgc2NoZW1lPXNlbGYuc2NoZW1lKQogICAgICAgICAgICBtZCA9IGRpc3QubWV0YWRhdGEKICAgICAgICBkaXN0LmRpZ2VzdCA9IGRpZ2VzdCA9IHNlbGYuX2dldF9kaWdlc3QoaW5mbykKICAgICAgICB1cmwgPSBpbmZvWyd1cmwnXQogICAgICAgIHJlc3VsdFsnZGlnZXN0cyddW3VybF0gPSBkaWdlc3QKICAgICAgICBpZiBtZC5zb3VyY2VfdXJsICE9IGluZm9bJ3VybCddOgogICAgICAgICAgICBtZC5zb3VyY2VfdXJsID0gc2VsZi5wcmVmZXJfdXJsKG1kLnNvdXJjZV91cmwsIHVybCkKICAgICAgICAgICAgcmVzdWx0Wyd1cmxzJ10uc2V0ZGVmYXVsdCh2ZXJzaW9uLCBzZXQoKSkuYWRkKHVybCkKICAgICAgICBkaXN0LmxvY2F0b3IgPSBzZWxmCiAgICAgICAgcmVzdWx0W3ZlcnNpb25dID0gZGlzdAoKICAgIGRlZiBsb2NhdGUoc2VsZiwgcmVxdWlyZW1lbnQsIHByZXJlbGVhc2VzPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBGaW5kIHRoZSBtb3N0IHJlY2VudCBkaXN0cmlidXRpb24gd2hpY2ggbWF0Y2hlcyB0aGUgZ2l2ZW4KICAgICAgICByZXF1aXJlbWVudC4KCiAgICAgICAgOnBhcmFtIHJlcXVpcmVtZW50OiBBIHJlcXVpcmVtZW50IG9mIHRoZSBmb3JtICdmb28gKDEuMCknIG9yIHBlcmhhcHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb28gKD49IDEuMCwgPCAyLjAsICE9IDEuMyknCiAgICAgICAgOnBhcmFtIHByZXJlbGVhc2VzOiBJZiBgYFRydWVgYCwgYWxsb3cgcHJlLXJlbGVhc2UgdmVyc2lvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGxvY2F0ZWQuIE90aGVyd2lzZSwgcHJlLXJlbGVhc2UgdmVyc2lvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBub3QgcmV0dXJuZWQuCiAgICAgICAgOnJldHVybjogQSA6Y2xhc3M6YERpc3RyaWJ1dGlvbmAgaW5zdGFuY2UsIG9yIGBgTm9uZWBgIGlmIG5vIHN1Y2gKICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24gY291bGQgYmUgbG9jYXRlZC4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBOb25lCiAgICAgICAgciA9IHBhcnNlX3JlcXVpcmVtZW50KHJlcXVpcmVtZW50KQogICAgICAgIGlmIHIgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignTm90IGEgdmFsaWQgcmVxdWlyZW1lbnQ6ICVyJyAlIHJlcXVpcmVtZW50KQogICAgICAgIHNjaGVtZSA9IGdldF9zY2hlbWUoc2VsZi5zY2hlbWUpCiAgICAgICAgc2VsZi5tYXRjaGVyID0gbWF0Y2hlciA9IHNjaGVtZS5tYXRjaGVyKHIucmVxdWlyZW1lbnQpCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdtYXRjaGVyOiAlcyAoJXMpJywgbWF0Y2hlciwgdHlwZShtYXRjaGVyKS5fX25hbWVfXykKICAgICAgICB2ZXJzaW9ucyA9IHNlbGYuZ2V0X3Byb2plY3Qoci5uYW1lKQogICAgICAgIGlmIGxlbih2ZXJzaW9ucykgPiAyOiAgICMgdXJscyBhbmQgZGlnZXN0cyBrZXlzIGFyZSBwcmVzZW50CiAgICAgICAgICAgICMgc29tZXRpbWVzLCB2ZXJzaW9ucyBhcmUgaW52YWxpZAogICAgICAgICAgICBzbGlzdCA9IFtdCiAgICAgICAgICAgIHZjbHMgPSBtYXRjaGVyLnZlcnNpb25fY2xhc3MKICAgICAgICAgICAgZm9yIGsgaW4gdmVyc2lvbnM6CiAgICAgICAgICAgICAgICBpZiBrIGluICgndXJscycsICdkaWdlc3RzJyk6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBpZiBub3QgbWF0Y2hlci5tYXRjaChrKToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCclcyBkaWQgbm90IG1hdGNoICVyJywgbWF0Y2hlciwgaykKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBwcmVyZWxlYXNlcyBvciBub3QgdmNscyhrKS5pc19wcmVyZWxlYXNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpc3QuYXBwZW5kKGspCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ3NraXBwaW5nIHByZS1yZWxlYXNlICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyc2lvbiAlcyBvZiAlcycsIGssIG1hdGNoZXIubmFtZSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnZXJyb3IgbWF0Y2hpbmcgJXMgd2l0aCAlcicsIG1hdGNoZXIsIGspCiAgICAgICAgICAgICAgICAgICAgcGFzcyAjIHNsaXN0LmFwcGVuZChrKQogICAgICAgICAgICBpZiBsZW4oc2xpc3QpID4gMToKICAgICAgICAgICAgICAgIHNsaXN0ID0gc29ydGVkKHNsaXN0LCBrZXk9c2NoZW1lLmtleSkKICAgICAgICAgICAgaWYgc2xpc3Q6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ3NvcnRlZCBsaXN0OiAlcycsIHNsaXN0KQogICAgICAgICAgICAgICAgdmVyc2lvbiA9IHNsaXN0Wy0xXQogICAgICAgICAgICAgICAgcmVzdWx0ID0gdmVyc2lvbnNbdmVyc2lvbl0KICAgICAgICBpZiByZXN1bHQ6CiAgICAgICAgICAgIGlmIHIuZXh0cmFzOgogICAgICAgICAgICAgICAgcmVzdWx0LmV4dHJhcyA9IHIuZXh0cmFzCiAgICAgICAgICAgIHJlc3VsdC5kb3dubG9hZF91cmxzID0gdmVyc2lvbnMuZ2V0KCd1cmxzJywge30pLmdldCh2ZXJzaW9uLCBzZXQoKSkKICAgICAgICAgICAgZCA9IHt9CiAgICAgICAgICAgIHNkID0gdmVyc2lvbnMuZ2V0KCdkaWdlc3RzJywge30pCiAgICAgICAgICAgIGZvciB1cmwgaW4gcmVzdWx0LmRvd25sb2FkX3VybHM6CiAgICAgICAgICAgICAgICBpZiB1cmwgaW4gc2Q6CiAgICAgICAgICAgICAgICAgICAgZFt1cmxdID0gc2RbdXJsXQogICAgICAgICAgICByZXN1bHQuZGlnZXN0cyA9IGQKICAgICAgICBzZWxmLm1hdGNoZXIgPSBOb25lCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIFB5UElSUENMb2NhdG9yKExvY2F0b3IpOgogICAgIiIiCiAgICBUaGlzIGxvY2F0b3IgdXNlcyBYTUwtUlBDIHRvIGxvY2F0ZSBkaXN0cmlidXRpb25zLiBJdCB0aGVyZWZvcmUKICAgIGNhbm5vdCBiZSB1c2VkIHdpdGggc2ltcGxlIG1pcnJvcnMgKHRoYXQgb25seSBtaXJyb3IgZmlsZSBjb250ZW50KS4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybCwgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCgogICAgICAgIDpwYXJhbSB1cmw6IFRoZSBVUkwgdG8gdXNlIGZvciBYTUwtUlBDLgogICAgICAgIDpwYXJhbSBrd2FyZ3M6IFBhc3NlZCB0byB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3Rvci4KICAgICAgICAiIiIKICAgICAgICBzdXBlcihQeVBJUlBDTG9jYXRvciwgc2VsZikuX19pbml0X18oKiprd2FyZ3MpCiAgICAgICAgc2VsZi5iYXNlX3VybCA9IHVybAogICAgICAgIHNlbGYuY2xpZW50ID0gU2VydmVyUHJveHkodXJsLCB0aW1lb3V0PTMuMCkKCiAgICBkZWYgZ2V0X2Rpc3RyaWJ1dGlvbl9uYW1lcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYWxsIHRoZSBkaXN0cmlidXRpb24gbmFtZXMga25vd24gdG8gdGhpcyBsb2NhdG9yLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZXQoc2VsZi5jbGllbnQubGlzdF9wYWNrYWdlcygpKQoKICAgIGRlZiBfZ2V0X3Byb2plY3Qoc2VsZiwgbmFtZSk6CiAgICAgICAgcmVzdWx0ID0geyd1cmxzJzoge30sICdkaWdlc3RzJzoge319CiAgICAgICAgdmVyc2lvbnMgPSBzZWxmLmNsaWVudC5wYWNrYWdlX3JlbGVhc2VzKG5hbWUsIFRydWUpCiAgICAgICAgZm9yIHYgaW4gdmVyc2lvbnM6CiAgICAgICAgICAgIHVybHMgPSBzZWxmLmNsaWVudC5yZWxlYXNlX3VybHMobmFtZSwgdikKICAgICAgICAgICAgZGF0YSA9IHNlbGYuY2xpZW50LnJlbGVhc2VfZGF0YShuYW1lLCB2KQogICAgICAgICAgICBtZXRhZGF0YSA9IE1ldGFkYXRhKHNjaGVtZT1zZWxmLnNjaGVtZSkKICAgICAgICAgICAgbWV0YWRhdGEubmFtZSA9IGRhdGFbJ25hbWUnXQogICAgICAgICAgICBtZXRhZGF0YS52ZXJzaW9uID0gZGF0YVsndmVyc2lvbiddCiAgICAgICAgICAgIG1ldGFkYXRhLmxpY2Vuc2UgPSBkYXRhLmdldCgnbGljZW5zZScpCiAgICAgICAgICAgIG1ldGFkYXRhLmtleXdvcmRzID0gZGF0YS5nZXQoJ2tleXdvcmRzJywgW10pCiAgICAgICAgICAgIG1ldGFkYXRhLnN1bW1hcnkgPSBkYXRhLmdldCgnc3VtbWFyeScpCiAgICAgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24obWV0YWRhdGEpCiAgICAgICAgICAgIGlmIHVybHM6CiAgICAgICAgICAgICAgICBpbmZvID0gdXJsc1swXQogICAgICAgICAgICAgICAgbWV0YWRhdGEuc291cmNlX3VybCA9IGluZm9bJ3VybCddCiAgICAgICAgICAgICAgICBkaXN0LmRpZ2VzdCA9IHNlbGYuX2dldF9kaWdlc3QoaW5mbykKICAgICAgICAgICAgICAgIGRpc3QubG9jYXRvciA9IHNlbGYKICAgICAgICAgICAgICAgIHJlc3VsdFt2XSA9IGRpc3QKICAgICAgICAgICAgICAgIGZvciBpbmZvIGluIHVybHM6CiAgICAgICAgICAgICAgICAgICAgdXJsID0gaW5mb1sndXJsJ10KICAgICAgICAgICAgICAgICAgICBkaWdlc3QgPSBzZWxmLl9nZXRfZGlnZXN0KGluZm8pCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0Wyd1cmxzJ10uc2V0ZGVmYXVsdCh2LCBzZXQoKSkuYWRkKHVybCkKICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ2RpZ2VzdHMnXVt1cmxdID0gZGlnZXN0CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKY2xhc3MgUHlQSUpTT05Mb2NhdG9yKExvY2F0b3IpOgogICAgIiIiCiAgICBUaGlzIGxvY2F0b3IgdXNlcyBQeVBJJ3MgSlNPTiBpbnRlcmZhY2UuIEl0J3MgdmVyeSBsaW1pdGVkIGluIGZ1bmN0aW9uYWxpdHkKICAgIGFuZCBwcm9iYWJseSBub3Qgd29ydGggdXNpbmcuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwsICoqa3dhcmdzKToKICAgICAgICBzdXBlcihQeVBJSlNPTkxvY2F0b3IsIHNlbGYpLl9faW5pdF9fKCoqa3dhcmdzKQogICAgICAgIHNlbGYuYmFzZV91cmwgPSBlbnN1cmVfc2xhc2godXJsKQoKICAgIGRlZiBnZXRfZGlzdHJpYnV0aW9uX25hbWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhbGwgdGhlIGRpc3RyaWJ1dGlvbiBuYW1lcyBrbm93biB0byB0aGlzIGxvY2F0b3IuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignTm90IGF2YWlsYWJsZSBmcm9tIHRoaXMgbG9jYXRvcicpCgogICAgZGVmIF9nZXRfcHJvamVjdChzZWxmLCBuYW1lKToKICAgICAgICByZXN1bHQgPSB7J3VybHMnOiB7fSwgJ2RpZ2VzdHMnOiB7fX0KICAgICAgICB1cmwgPSB1cmxqb2luKHNlbGYuYmFzZV91cmwsICclcy9qc29uJyAlIHF1b3RlKG5hbWUpKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmVzcCA9IHNlbGYub3BlbmVyLm9wZW4odXJsKQogICAgICAgICAgICBkYXRhID0gcmVzcC5yZWFkKCkuZGVjb2RlKCkgIyBmb3Igbm93CiAgICAgICAgICAgIGQgPSBqc29uLmxvYWRzKGRhdGEpCiAgICAgICAgICAgIG1kID0gTWV0YWRhdGEoc2NoZW1lPXNlbGYuc2NoZW1lKQogICAgICAgICAgICBkYXRhID0gZFsnaW5mbyddCiAgICAgICAgICAgIG1kLm5hbWUgPSBkYXRhWyduYW1lJ10KICAgICAgICAgICAgbWQudmVyc2lvbiA9IGRhdGFbJ3ZlcnNpb24nXQogICAgICAgICAgICBtZC5saWNlbnNlID0gZGF0YS5nZXQoJ2xpY2Vuc2UnKQogICAgICAgICAgICBtZC5rZXl3b3JkcyA9IGRhdGEuZ2V0KCdrZXl3b3JkcycsIFtdKQogICAgICAgICAgICBtZC5zdW1tYXJ5ID0gZGF0YS5nZXQoJ3N1bW1hcnknKQogICAgICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKG1kKQogICAgICAgICAgICBkaXN0LmxvY2F0b3IgPSBzZWxmCiAgICAgICAgICAgIHVybHMgPSBkWyd1cmxzJ10KICAgICAgICAgICAgcmVzdWx0W21kLnZlcnNpb25dID0gZGlzdAogICAgICAgICAgICBmb3IgaW5mbyBpbiBkWyd1cmxzJ106CiAgICAgICAgICAgICAgICB1cmwgPSBpbmZvWyd1cmwnXQogICAgICAgICAgICAgICAgZGlzdC5kb3dubG9hZF91cmxzLmFkZCh1cmwpCiAgICAgICAgICAgICAgICBkaXN0LmRpZ2VzdHNbdXJsXSA9IHNlbGYuX2dldF9kaWdlc3QoaW5mbykKICAgICAgICAgICAgICAgIHJlc3VsdFsndXJscyddLnNldGRlZmF1bHQobWQudmVyc2lvbiwgc2V0KCkpLmFkZCh1cmwpCiAgICAgICAgICAgICAgICByZXN1bHRbJ2RpZ2VzdHMnXVt1cmxdID0gc2VsZi5fZ2V0X2RpZ2VzdChpbmZvKQogICAgICAgICAgICAjIE5vdyBnZXQgb3RoZXIgcmVsZWFzZXMKICAgICAgICAgICAgZm9yIHZlcnNpb24sIGluZm9zIGluIGRbJ3JlbGVhc2VzJ10uaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmIHZlcnNpb24gPT0gbWQudmVyc2lvbjoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAgICAjIGFscmVhZHkgZG9uZQogICAgICAgICAgICAgICAgb21kID0gTWV0YWRhdGEoc2NoZW1lPXNlbGYuc2NoZW1lKQogICAgICAgICAgICAgICAgb21kLm5hbWUgPSBtZC5uYW1lCiAgICAgICAgICAgICAgICBvbWQudmVyc2lvbiA9IHZlcnNpb24KICAgICAgICAgICAgICAgIG9kaXN0ID0gRGlzdHJpYnV0aW9uKG9tZCkKICAgICAgICAgICAgICAgIG9kaXN0LmxvY2F0b3IgPSBzZWxmCiAgICAgICAgICAgICAgICByZXN1bHRbdmVyc2lvbl0gPSBvZGlzdAogICAgICAgICAgICAgICAgZm9yIGluZm8gaW4gaW5mb3M6CiAgICAgICAgICAgICAgICAgICAgdXJsID0gaW5mb1sndXJsJ10KICAgICAgICAgICAgICAgICAgICBvZGlzdC5kb3dubG9hZF91cmxzLmFkZCh1cmwpCiAgICAgICAgICAgICAgICAgICAgb2Rpc3QuZGlnZXN0c1t1cmxdID0gc2VsZi5fZ2V0X2RpZ2VzdChpbmZvKQogICAgICAgICAgICAgICAgICAgIHJlc3VsdFsndXJscyddLnNldGRlZmF1bHQodmVyc2lvbiwgc2V0KCkpLmFkZCh1cmwpCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0WydkaWdlc3RzJ11bdXJsXSA9IHNlbGYuX2dldF9kaWdlc3QoaW5mbykKIyAgICAgICAgICAgIGZvciBpbmZvIGluIHVybHM6CiMgICAgICAgICAgICAgICAgbWQuc291cmNlX3VybCA9IGluZm9bJ3VybCddCiMgICAgICAgICAgICAgICAgZGlzdC5kaWdlc3QgPSBzZWxmLl9nZXRfZGlnZXN0KGluZm8pCiMgICAgICAgICAgICAgICAgZGlzdC5sb2NhdG9yID0gc2VsZgojICAgICAgICAgICAgICAgIGZvciBpbmZvIGluIHVybHM6CiMgICAgICAgICAgICAgICAgICAgIHVybCA9IGluZm9bJ3VybCddCiMgICAgICAgICAgICAgICAgICAgIHJlc3VsdFsndXJscyddLnNldGRlZmF1bHQobWQudmVyc2lvbiwgc2V0KCkpLmFkZCh1cmwpCiMgICAgICAgICAgICAgICAgICAgIHJlc3VsdFsnZGlnZXN0cyddW3VybF0gPSBzZWxmLl9nZXRfZGlnZXN0KGluZm8pCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBzZWxmLmVycm9ycy5wdXQodGV4dF90eXBlKGUpKQogICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCdKU09OIGZldGNoIGZhaWxlZDogJXMnLCBlKQogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBQYWdlKG9iamVjdCk6CiAgICAiIiIKICAgIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNjcmFwZWQgSFRNTCBwYWdlLgogICAgIiIiCiAgICAjIFRoZSBmb2xsb3dpbmcgc2xpZ2h0bHkgaGFpcnktbG9va2luZyByZWdleCBqdXN0IGxvb2tzIGZvciB0aGUgY29udGVudHMgb2YKICAgICMgYW4gYW5jaG9yIGxpbmssIHdoaWNoIGhhcyBhbiBhdHRyaWJ1dGUgImhyZWYiIGVpdGhlciBpbW1lZGlhdGVseSBwcmVjZWRlZAogICAgIyBvciBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhICJyZWwiIGF0dHJpYnV0ZS4gVGhlIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlCiAgICAjIGRlY2xhcmVkIHdpdGggZG91YmxlIHF1b3Rlcywgc2luZ2xlIHF1b3RlcyBvciBubyBxdW90ZXMgLSB3aGljaCBsZWFkcyB0bwogICAgIyB0aGUgbGVuZ3RoIG9mIHRoZSBleHByZXNzaW9uLgogICAgX2hyZWYgPSByZS5jb21waWxlKCIiIgoocmVsXHMqPVxzKig/OiIoP1A8cmVsMT5bXiJdKikifCcoP1A8cmVsMj5bXiddKiknfCg/UDxyZWwzPltePlxzXG5dKikpXHMrKT8KaHJlZlxzKj1ccyooPzoiKD9QPHVybDE+W14iXSopInwnKD9QPHVybDI+W14nXSopJ3woP1A8dXJsMz5bXj5cc1xuXSopKQooXHMrcmVsXHMqPVxzKig/OiIoP1A8cmVsND5bXiJdKikifCcoP1A8cmVsNT5bXiddKiknfCg/UDxyZWw2PltePlxzXG5dKikpKT8KIiIiLCByZS5JIHwgcmUuUyB8IHJlLlgpCiAgICBfYmFzZSA9IHJlLmNvbXBpbGUociIiIjxiYXNlXHMraHJlZlxzKj1ccypbJyJdPyhbXiciPl0rKSIiIiwgcmUuSSB8IHJlLlMpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEsIHVybCk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZSB3aXRoIHRoZSBVbmljb2RlIHBhZ2UgY29udGVudHMgYW5kIHRoZSBVUkwgdGhleQogICAgICAgIGNhbWUgZnJvbS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmRhdGEgPSBkYXRhCiAgICAgICAgc2VsZi5iYXNlX3VybCA9IHNlbGYudXJsID0gdXJsCiAgICAgICAgbSA9IHNlbGYuX2Jhc2Uuc2VhcmNoKHNlbGYuZGF0YSkKICAgICAgICBpZiBtOgogICAgICAgICAgICBzZWxmLmJhc2VfdXJsID0gbS5ncm91cCgxKQoKICAgIF9jbGVhbl9yZSA9IHJlLmNvbXBpbGUocidbXmEtejAtOSQmKywvOjs9P0AuIyVfXFx8LV0nLCByZS5JKQoKICAgIEBjYWNoZWRfcHJvcGVydHkKICAgIGRlZiBsaW5rcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIFVSTHMgb2YgYWxsIHRoZSBsaW5rcyBvbiBhIHBhZ2UgdG9nZXRoZXIgd2l0aCBpbmZvcm1hdGlvbgogICAgICAgIGFib3V0IHRoZWlyICJyZWwiIGF0dHJpYnV0ZSwgZm9yIGRldGVybWluaW5nIHdoaWNoIG9uZXMgdG8gdHJlYXQgYXMKICAgICAgICBkb3dubG9hZHMgYW5kIHdoaWNoIG9uZXMgdG8gcXVldWUgZm9yIGZ1cnRoZXIgc2NyYXBpbmcuCiAgICAgICAgIiIiCiAgICAgICAgZGVmIGNsZWFuKHVybCk6CiAgICAgICAgICAgICJUaWR5IHVwIGFuIFVSTC4iCiAgICAgICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnID0gdXJscGFyc2UodXJsKQogICAgICAgICAgICByZXR1cm4gdXJsdW5wYXJzZSgoc2NoZW1lLCBuZXRsb2MsIHF1b3RlKHBhdGgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBxdWVyeSwgZnJhZykpCgogICAgICAgIHJlc3VsdCA9IHNldCgpCiAgICAgICAgZm9yIG1hdGNoIGluIHNlbGYuX2hyZWYuZmluZGl0ZXIoc2VsZi5kYXRhKToKICAgICAgICAgICAgZCA9IG1hdGNoLmdyb3VwZGljdCgnJykKICAgICAgICAgICAgcmVsID0gKGRbJ3JlbDEnXSBvciBkWydyZWwyJ10gb3IgZFsncmVsMyddIG9yCiAgICAgICAgICAgICAgICAgICBkWydyZWw0J10gb3IgZFsncmVsNSddIG9yIGRbJ3JlbDYnXSkKICAgICAgICAgICAgdXJsID0gZFsndXJsMSddIG9yIGRbJ3VybDInXSBvciBkWyd1cmwzJ10KICAgICAgICAgICAgdXJsID0gdXJsam9pbihzZWxmLmJhc2VfdXJsLCB1cmwpCiAgICAgICAgICAgIHVybCA9IHVuZXNjYXBlKHVybCkKICAgICAgICAgICAgdXJsID0gc2VsZi5fY2xlYW5fcmUuc3ViKGxhbWJkYSBtOiAnJSUlMngnICUgb3JkKG0uZ3JvdXAoMCkpLCB1cmwpCiAgICAgICAgICAgIHJlc3VsdC5hZGQoKHVybCwgcmVsKSkKICAgICAgICAjIFdlIHNvcnQgdGhlIHJlc3VsdCwgaG9waW5nIHRvIGJyaW5nIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9ucwogICAgICAgICMgdG8gdGhlIGZyb250CiAgICAgICAgcmVzdWx0ID0gc29ydGVkKHJlc3VsdCwga2V5PWxhbWJkYSB0OiB0WzBdLCByZXZlcnNlPVRydWUpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIFNpbXBsZVNjcmFwaW5nTG9jYXRvcihMb2NhdG9yKToKICAgICIiIgogICAgQSBsb2NhdG9yIHdoaWNoIHNjcmFwZXMgSFRNTCBwYWdlcyB0byBsb2NhdGUgZG93bmxvYWRzIGZvciBhIGRpc3RyaWJ1dGlvbi4KICAgIFRoaXMgcnVucyBtdWx0aXBsZSB0aHJlYWRzIHRvIGRvIHRoZSBJL087IHBlcmZvcm1hbmNlIGlzIGF0IGxlYXN0IGFzIGdvb2QKICAgIGFzIHBpcCdzIFBhY2thZ2VGaW5kZXIsIHdoaWNoIHdvcmtzIGluIGFuIGFuYWxvZ291cyBmYXNoaW9uLgogICAgIiIiCgogICAgIyBUaGVzZSBhcmUgdXNlZCB0byBkZWFsIHdpdGggdmFyaW91cyBDb250ZW50LUVuY29kaW5nIHNjaGVtZXMuCiAgICBkZWNvZGVycyA9IHsKICAgICAgICAnZGVmbGF0ZSc6IHpsaWIuZGVjb21wcmVzcywKICAgICAgICAnZ3ppcCc6IGxhbWJkYSBiOiBnemlwLkd6aXBGaWxlKGZpbGVvYmo9Qnl0ZXNJTyhkKSkucmVhZCgpLAogICAgICAgICdub25lJzogbGFtYmRhIGI6IGIsCiAgICB9CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybCwgdGltZW91dD1Ob25lLCBudW1fd29ya2Vycz0xMCwgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCiAgICAgICAgOnBhcmFtIHVybDogVGhlIHJvb3QgVVJMIHRvIHVzZSBmb3Igc2NyYXBpbmcuCiAgICAgICAgOnBhcmFtIHRpbWVvdXQ6IFRoZSB0aW1lb3V0LCBpbiBzZWNvbmRzLCB0byBiZSBhcHBsaWVkIHRvIHJlcXVlc3RzLgogICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGRlZmF1bHRzIHRvIGBgTm9uZWBgIChubyB0aW1lb3V0IHNwZWNpZmllZCkuCiAgICAgICAgOnBhcmFtIG51bV93b3JrZXJzOiBUaGUgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIHlvdSB3YW50IHRvIGRvIEkvTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZGVmYXVsdHMgdG8gMTAuCiAgICAgICAgOnBhcmFtIGt3YXJnczogUGFzc2VkIHRvIHRoZSBzdXBlcmNsYXNzLgogICAgICAgICIiIgogICAgICAgIHN1cGVyKFNpbXBsZVNjcmFwaW5nTG9jYXRvciwgc2VsZikuX19pbml0X18oKiprd2FyZ3MpCiAgICAgICAgc2VsZi5iYXNlX3VybCA9IGVuc3VyZV9zbGFzaCh1cmwpCiAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAogICAgICAgIHNlbGYuX3BhZ2VfY2FjaGUgPSB7fQogICAgICAgIHNlbGYuX3NlZW4gPSBzZXQoKQogICAgICAgIHNlbGYuX3RvX2ZldGNoID0gcXVldWUuUXVldWUoKQogICAgICAgIHNlbGYuX2JhZF9ob3N0cyA9IHNldCgpCiAgICAgICAgc2VsZi5za2lwX2V4dGVybmFscyA9IEZhbHNlCiAgICAgICAgc2VsZi5udW1fd29ya2VycyA9IG51bV93b3JrZXJzCiAgICAgICAgc2VsZi5fbG9jayA9IHRocmVhZGluZy5STG9jaygpCiAgICAgICAgIyBTZWUgaXNzdWUgIzQ1OiB3ZSBuZWVkIHRvIGJlIHJlc2lsaWVudCB3aGVuIHRoZSBsb2NhdG9yIGlzIHVzZWQKICAgICAgICAjIGluIGEgdGhyZWFkLCBlLmcuIHdpdGggY29uY3VycmVudC5mdXR1cmVzLiBXZSBjYW4ndCB1c2Ugc2VsZi5fbG9jawogICAgICAgICMgYXMgaXQgaXMgZm9yIGNvb3JkaW5hdGluZyBvdXIgaW50ZXJuYWwgdGhyZWFkcyAtIHRoZSBvbmVzIGNyZWF0ZWQKICAgICAgICAjIGluIF9wcmVwYXJlX3RocmVhZHMuCiAgICAgICAgc2VsZi5fZ3Bsb2NrID0gdGhyZWFkaW5nLlJMb2NrKCkKCiAgICBkZWYgX3ByZXBhcmVfdGhyZWFkcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUaHJlYWRzIGFyZSBjcmVhdGVkIG9ubHkgd2hlbiBnZXRfcHJvamVjdCBpcyBjYWxsZWQsIGFuZCB0ZXJtaW5hdGUKICAgICAgICBiZWZvcmUgaXQgcmV0dXJucy4gVGhleSBhcmUgdGhlcmUgcHJpbWFyaWx5IHRvIHBhcmFsbGVsaXNlIEkvTyAoaS5lLgogICAgICAgIGZldGNoaW5nIHdlYiBwYWdlcykuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fdGhyZWFkcyA9IFtdCiAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi5udW1fd29ya2Vycyk6CiAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLl9mZXRjaCkKICAgICAgICAgICAgdC5zZXREYWVtb24oVHJ1ZSkKICAgICAgICAgICAgdC5zdGFydCgpCiAgICAgICAgICAgIHNlbGYuX3RocmVhZHMuYXBwZW5kKHQpCgogICAgZGVmIF93YWl0X3RocmVhZHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVsbCBhbGwgdGhlIHRocmVhZHMgdG8gdGVybWluYXRlIChieSBzZW5kaW5nIGEgc2VudGluZWwgdmFsdWUpIGFuZAogICAgICAgIHdhaXQgZm9yIHRoZW0gdG8gZG8gc28uCiAgICAgICAgIiIiCiAgICAgICAgIyBOb3RlIHRoYXQgeW91IG5lZWQgdHdvIGxvb3BzLCBzaW5jZSB5b3UgY2FuJ3Qgc2F5IHdoaWNoCiAgICAgICAgIyB0aHJlYWQgd2lsbCBnZXQgZWFjaCBzZW50aW5lbAogICAgICAgIGZvciB0IGluIHNlbGYuX3RocmVhZHM6CiAgICAgICAgICAgIHNlbGYuX3RvX2ZldGNoLnB1dChOb25lKSAgICAjIHNlbnRpbmVsCiAgICAgICAgZm9yIHQgaW4gc2VsZi5fdGhyZWFkczoKICAgICAgICAgICAgdC5qb2luKCkKICAgICAgICBzZWxmLl90aHJlYWRzID0gW10KCiAgICBkZWYgX2dldF9wcm9qZWN0KHNlbGYsIG5hbWUpOgogICAgICAgIHJlc3VsdCA9IHsndXJscyc6IHt9LCAnZGlnZXN0cyc6IHt9fQogICAgICAgIHdpdGggc2VsZi5fZ3Bsb2NrOgogICAgICAgICAgICBzZWxmLnJlc3VsdCA9IHJlc3VsdAogICAgICAgICAgICBzZWxmLnByb2plY3RfbmFtZSA9IG5hbWUKICAgICAgICAgICAgdXJsID0gdXJsam9pbihzZWxmLmJhc2VfdXJsLCAnJXMvJyAlIHF1b3RlKG5hbWUpKQogICAgICAgICAgICBzZWxmLl9zZWVuLmNsZWFyKCkKICAgICAgICAgICAgc2VsZi5fcGFnZV9jYWNoZS5jbGVhcigpCiAgICAgICAgICAgIHNlbGYuX3ByZXBhcmVfdGhyZWFkcygpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUXVldWVpbmcgJXMnLCB1cmwpCiAgICAgICAgICAgICAgICBzZWxmLl90b19mZXRjaC5wdXQodXJsKQogICAgICAgICAgICAgICAgc2VsZi5fdG9fZmV0Y2guam9pbigpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBzZWxmLl93YWl0X3RocmVhZHMoKQogICAgICAgICAgICBkZWwgc2VsZi5yZXN1bHQKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgcGxhdGZvcm1fZGVwZW5kZW50ID0gcmUuY29tcGlsZShyJ1xiKGxpbnV4LShpXGQ4Nnx4ODZfNjR8YXJtXHcrKXwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInd2luKDMyfC1hbWQ2NCl8bWFjb3N4LT9cZCspXGInLCByZS5JKQoKICAgIGRlZiBfaXNfcGxhdGZvcm1fZGVwZW5kZW50KHNlbGYsIHVybCk6CiAgICAgICAgIiIiCiAgICAgICAgRG9lcyBhbiBVUkwgcmVmZXIgdG8gYSBwbGF0Zm9ybS1zcGVjaWZpYyBkb3dubG9hZD8KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5wbGF0Zm9ybV9kZXBlbmRlbnQuc2VhcmNoKHVybCkKCiAgICBkZWYgX3Byb2Nlc3NfZG93bmxvYWQoc2VsZiwgdXJsKToKICAgICAgICAiIiIKICAgICAgICBTZWUgaWYgYW4gVVJMIGlzIGEgc3VpdGFibGUgZG93bmxvYWQgZm9yIGEgcHJvamVjdC4KCiAgICAgICAgSWYgaXQgaXMsIHJlZ2lzdGVyIGluZm9ybWF0aW9uIGluIHRoZSByZXN1bHQgZGljdGlvbmFyeSAoZm9yCiAgICAgICAgX2dldF9wcm9qZWN0KSBhYm91dCB0aGUgc3BlY2lmaWMgdmVyc2lvbiBpdCdzIGZvci4KCiAgICAgICAgTm90ZSB0aGF0IHRoZSByZXR1cm4gdmFsdWUgaXNuJ3QgYWN0dWFsbHkgdXNlZCBvdGhlciB0aGFuIGFzIGEgYm9vbGVhbgogICAgICAgIHZhbHVlLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuX2lzX3BsYXRmb3JtX2RlcGVuZGVudCh1cmwpOgogICAgICAgICAgICBpbmZvID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGluZm8gPSBzZWxmLmNvbnZlcnRfdXJsX3RvX2Rvd25sb2FkX2luZm8odXJsLCBzZWxmLnByb2plY3RfbmFtZSkKICAgICAgICBsb2dnZXIuZGVidWcoJ3Byb2Nlc3NfZG93bmxvYWQ6ICVzIC0+ICVzJywgdXJsLCBpbmZvKQogICAgICAgIGlmIGluZm86CiAgICAgICAgICAgIHdpdGggc2VsZi5fbG9jazogICAgIyBuZWVkZWQgYmVjYXVzZSBzZWxmLnJlc3VsdCBpcyBzaGFyZWQKICAgICAgICAgICAgICAgIHNlbGYuX3VwZGF0ZV92ZXJzaW9uX2RhdGEoc2VsZi5yZXN1bHQsIGluZm8pCiAgICAgICAgcmV0dXJuIGluZm8KCiAgICBkZWYgX3Nob3VsZF9xdWV1ZShzZWxmLCBsaW5rLCByZWZlcnJlciwgcmVsKToKICAgICAgICAiIiIKICAgICAgICBEZXRlcm1pbmUgd2hldGhlciBhIGxpbmsgVVJMIGZyb20gYSByZWZlcnJpbmcgcGFnZSBhbmQgd2l0aCBhCiAgICAgICAgcGFydGljdWxhciAicmVsIiBhdHRyaWJ1dGUgc2hvdWxkIGJlIHF1ZXVlZCBmb3Igc2NyYXBpbmcuCiAgICAgICAgIiIiCiAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIF8sIF8sIF8gPSB1cmxwYXJzZShsaW5rKQogICAgICAgIGlmIHBhdGguZW5kc3dpdGgoc2VsZi5zb3VyY2VfZXh0ZW5zaW9ucyArIHNlbGYuYmluYXJ5X2V4dGVuc2lvbnMgKwogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5leGNsdWRlZF9leHRlbnNpb25zKToKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBlbGlmIHNlbGYuc2tpcF9leHRlcm5hbHMgYW5kIG5vdCBsaW5rLnN0YXJ0c3dpdGgoc2VsZi5iYXNlX3VybCk6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgZWxpZiBub3QgcmVmZXJyZXIuc3RhcnRzd2l0aChzZWxmLmJhc2VfdXJsKToKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBlbGlmIHJlbCBub3QgaW4gKCdob21lcGFnZScsICdkb3dubG9hZCcpOgogICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGVsaWYgc2NoZW1lIG5vdCBpbiAoJ2h0dHAnLCAnaHR0cHMnLCAnZnRwJyk6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgZWxpZiBzZWxmLl9pc19wbGF0Zm9ybV9kZXBlbmRlbnQobGluayk6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaG9zdCA9IG5ldGxvYy5zcGxpdCgnOicsIDEpWzBdCiAgICAgICAgICAgIGlmIGhvc3QubG93ZXIoKSA9PSAnbG9jYWxob3N0JzoKICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBUcnVlCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdzaG91bGRfcXVldWU6ICVzICglcykgZnJvbSAlcyAtPiAlcycsIGxpbmssIHJlbCwKICAgICAgICAgICAgICAgICAgICAgcmVmZXJyZXIsIHJlc3VsdCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9mZXRjaChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBHZXQgYSBVUkwgdG8gZmV0Y2ggZnJvbSB0aGUgd29yayBxdWV1ZSwgZ2V0IHRoZSBIVE1MIHBhZ2UsIGV4YW1pbmUgaXRzCiAgICAgICAgbGlua3MgZm9yIGRvd25sb2FkIGNhbmRpZGF0ZXMgYW5kIGNhbmRpZGF0ZXMgZm9yIGZ1cnRoZXIgc2NyYXBpbmcuCgogICAgICAgIFRoaXMgaXMgYSBoYW5keSBtZXRob2QgdG8gcnVuIGluIGEgdGhyZWFkLgogICAgICAgICIiIgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHVybCA9IHNlbGYuX3RvX2ZldGNoLmdldCgpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlmIHVybDoKICAgICAgICAgICAgICAgICAgICBwYWdlID0gc2VsZi5nZXRfcGFnZSh1cmwpCiAgICAgICAgICAgICAgICAgICAgaWYgcGFnZSBpcyBOb25lOiAgICAjIGUuZy4gYWZ0ZXIgYW4gZXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBmb3IgbGluaywgcmVsIGluIHBhZ2UubGlua3M6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmsgbm90IGluIHNlbGYuX3NlZW46CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZWVuLmFkZChsaW5rKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vdCBzZWxmLl9wcm9jZXNzX2Rvd25sb2FkKGxpbmspIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Nob3VsZF9xdWV1ZShsaW5rLCB1cmwsIHJlbCkpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUXVldWVpbmcgJXMgZnJvbSAlcycsIGxpbmssIHVybCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90b19mZXRjaC5wdXQobGluaykKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICBzZWxmLmVycm9ycy5wdXQodGV4dF90eXBlKGUpKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgIyBhbHdheXMgZG8gdGhpcywgdG8gYXZvaWQgaGFuZ3MgOi0pCiAgICAgICAgICAgICAgICBzZWxmLl90b19mZXRjaC50YXNrX2RvbmUoKQogICAgICAgICAgICBpZiBub3QgdXJsOgogICAgICAgICAgICAgICAgI2xvZ2dlci5kZWJ1ZygnU2VudGluZWwgc2VlbiwgcXVpdHRpbmcuJykKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgZGVmIGdldF9wYWdlKHNlbGYsIHVybCk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IHRoZSBIVE1MIGZvciBhbiBVUkwsIHBvc3NpYmx5IGZyb20gYW4gaW4tbWVtb3J5IGNhY2hlLgoKICAgICAgICBYWFggVE9ETyBOb3RlOiB0aGlzIGNhY2hlIGlzIG5ldmVyIGFjdHVhbGx5IGNsZWFyZWQuIEl0J3MgYXNzdW1lZCB0aGF0CiAgICAgICAgdGhlIGRhdGEgd29uJ3QgZ2V0IHN0YWxlIG92ZXIgdGhlIGxpZmV0aW1lIG9mIGEgbG9jYXRvciBpbnN0YW5jZSAobm90CiAgICAgICAgbmVjZXNzYXJpbHkgdHJ1ZSBmb3IgdGhlIGRlZmF1bHRfbG9jYXRvcikuCiAgICAgICAgIiIiCiAgICAgICAgIyBodHRwOi8vcGVhay50ZWxlY29tbXVuaXR5LmNvbS9EZXZDZW50ZXIvRWFzeUluc3RhbGwjcGFja2FnZS1pbmRleC1hcGkKICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgXywgXywgXyA9IHVybHBhcnNlKHVybCkKICAgICAgICBpZiBzY2hlbWUgPT0gJ2ZpbGUnIGFuZCBvcy5wYXRoLmlzZGlyKHVybDJwYXRobmFtZShwYXRoKSk6CiAgICAgICAgICAgIHVybCA9IHVybGpvaW4oZW5zdXJlX3NsYXNoKHVybCksICdpbmRleC5odG1sJykKCiAgICAgICAgaWYgdXJsIGluIHNlbGYuX3BhZ2VfY2FjaGU6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX3BhZ2VfY2FjaGVbdXJsXQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JldHVybmluZyAlcyBmcm9tIGNhY2hlOiAlcycsIHVybCwgcmVzdWx0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGhvc3QgPSBuZXRsb2Muc3BsaXQoJzonLCAxKVswXQogICAgICAgICAgICByZXN1bHQgPSBOb25lCiAgICAgICAgICAgIGlmIGhvc3QgaW4gc2VsZi5fYmFkX2hvc3RzOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTa2lwcGluZyAlcyBkdWUgdG8gYmFkIGhvc3QgJXMnLCB1cmwsIGhvc3QpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXEgPSBSZXF1ZXN0KHVybCwgaGVhZGVycz17J0FjY2VwdC1lbmNvZGluZyc6ICdpZGVudGl0eSd9KQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRmV0Y2hpbmcgJXMnLCB1cmwpCiAgICAgICAgICAgICAgICAgICAgcmVzcCA9IHNlbGYub3BlbmVyLm9wZW4ocmVxLCB0aW1lb3V0PXNlbGYudGltZW91dCkKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZldGNoZWQgJXMnLCB1cmwpCiAgICAgICAgICAgICAgICAgICAgaGVhZGVycyA9IHJlc3AuaW5mbygpCiAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlID0gaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScsICcnKQogICAgICAgICAgICAgICAgICAgIGlmIEhUTUxfQ09OVEVOVF9UWVBFLm1hdGNoKGNvbnRlbnRfdHlwZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3VybCA9IHJlc3AuZ2V0dXJsKCkKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlc3AucmVhZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gaGVhZGVycy5nZXQoJ0NvbnRlbnQtRW5jb2RpbmcnKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBlbmNvZGluZzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIgPSBzZWxmLmRlY29kZXJzW2VuY29kaW5nXSAgICMgZmFpbCBpZiBub3QgZm91bmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZWNvZGVyKGRhdGEpCiAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gJ3V0Zi04JwogICAgICAgICAgICAgICAgICAgICAgICBtID0gQ0hBUlNFVC5zZWFyY2goY29udGVudF90eXBlKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBtLmdyb3VwKDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmRlY29kZShlbmNvZGluZykKICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZGVjb2RlKCdsYXRpbi0xJykgICAgIyBmYWxsYmFjawogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBQYWdlKGRhdGEsIGZpbmFsX3VybCkKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFnZV9jYWNoZVtmaW5hbF91cmxdID0gcmVzdWx0CiAgICAgICAgICAgICAgICBleGNlcHQgSFRUUEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgaWYgZS5jb2RlICE9IDQwNDoKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbignRmV0Y2ggZmFpbGVkOiAlczogJXMnLCB1cmwsIGUpCiAgICAgICAgICAgICAgICBleGNlcHQgVVJMRXJyb3IgYXMgZTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oJ0ZldGNoIGZhaWxlZDogJXM6ICVzJywgdXJsLCBlKQogICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5fbG9jazoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fYmFkX2hvc3RzLmFkZChob3N0KQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbignRmV0Y2ggZmFpbGVkOiAlczogJXMnLCB1cmwsIGUpCiAgICAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhZ2VfY2FjaGVbdXJsXSA9IHJlc3VsdCAgICMgZXZlbiBpZiBOb25lIChmYWlsdXJlKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBfZGlzdG5hbWVfcmUgPSByZS5jb21waWxlKCc8YSBocmVmPVtePl0qPihbXjxdKyk8JykKCiAgICBkZWYgZ2V0X2Rpc3RyaWJ1dGlvbl9uYW1lcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYWxsIHRoZSBkaXN0cmlidXRpb24gbmFtZXMga25vd24gdG8gdGhpcyBsb2NhdG9yLgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IHNldCgpCiAgICAgICAgcGFnZSA9IHNlbGYuZ2V0X3BhZ2Uoc2VsZi5iYXNlX3VybCkKICAgICAgICBpZiBub3QgcGFnZToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignVW5hYmxlIHRvIGdldCAlcycgJSBzZWxmLmJhc2VfdXJsKQogICAgICAgIGZvciBtYXRjaCBpbiBzZWxmLl9kaXN0bmFtZV9yZS5maW5kaXRlcihwYWdlLmRhdGEpOgogICAgICAgICAgICByZXN1bHQuYWRkKG1hdGNoLmdyb3VwKDEpKQogICAgICAgIHJldHVybiByZXN1bHQKCmNsYXNzIERpcmVjdG9yeUxvY2F0b3IoTG9jYXRvcik6CiAgICAiIiIKICAgIFRoaXMgY2xhc3MgbG9jYXRlcyBkaXN0cmlidXRpb25zIGluIGEgZGlyZWN0b3J5IHRyZWUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCiAgICAgICAgOnBhcmFtIHBhdGg6IFRoZSByb290IG9mIHRoZSBkaXJlY3RvcnkgdHJlZSB0byBzZWFyY2guCiAgICAgICAgOnBhcmFtIGt3YXJnczogUGFzc2VkIHRvIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBmb3I6CiAgICAgICAgICAgICAgICAgICAgICAgKiByZWN1cnNpdmUgLSBpZiBUcnVlICh0aGUgZGVmYXVsdCksIHN1YmRpcmVjdG9yaWVzIGFyZQogICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZWQgaW50by4gSWYgRmFsc2UsIG9ubHkgdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkKICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHNlYXJjaGVkLAogICAgICAgICIiIgogICAgICAgIHNlbGYucmVjdXJzaXZlID0ga3dhcmdzLnBvcCgncmVjdXJzaXZlJywgVHJ1ZSkKICAgICAgICBzdXBlcihEaXJlY3RvcnlMb2NhdG9yLCBzZWxmKS5fX2luaXRfXygqKmt3YXJncykKICAgICAgICBwYXRoID0gb3MucGF0aC5hYnNwYXRoKHBhdGgpCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIocGF0aCk6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignTm90IGEgZGlyZWN0b3J5OiAlcicgJSBwYXRoKQogICAgICAgIHNlbGYuYmFzZV9kaXIgPSBwYXRoCgogICAgZGVmIHNob3VsZF9pbmNsdWRlKHNlbGYsIGZpbGVuYW1lLCBwYXJlbnQpOgogICAgICAgICIiIgogICAgICAgIFNob3VsZCBhIGZpbGVuYW1lIGJlIGNvbnNpZGVyZWQgYXMgYSBjYW5kaWRhdGUgZm9yIGEgZGlzdHJpYnV0aW9uCiAgICAgICAgYXJjaGl2ZT8gQXMgd2VsbCBhcyB0aGUgZmlsZW5hbWUsIHRoZSBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgaXQKICAgICAgICBpcyBwcm92aWRlZCwgdGhvdWdoIG5vdCB1c2VkIGJ5IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBmaWxlbmFtZS5lbmRzd2l0aChzZWxmLmRvd25sb2FkYWJsZV9leHRlbnNpb25zKQoKICAgIGRlZiBfZ2V0X3Byb2plY3Qoc2VsZiwgbmFtZSk6CiAgICAgICAgcmVzdWx0ID0geyd1cmxzJzoge30sICdkaWdlc3RzJzoge319CiAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoc2VsZi5iYXNlX2Rpcik6CiAgICAgICAgICAgIGZvciBmbiBpbiBmaWxlczoKICAgICAgICAgICAgICAgIGlmIHNlbGYuc2hvdWxkX2luY2x1ZGUoZm4sIHJvb3QpOgogICAgICAgICAgICAgICAgICAgIGZuID0gb3MucGF0aC5qb2luKHJvb3QsIGZuKQogICAgICAgICAgICAgICAgICAgIHVybCA9IHVybHVucGFyc2UoKCdmaWxlJywgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUydXJsKG9zLnBhdGguYWJzcGF0aChmbikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLCAnJywgJycpKQogICAgICAgICAgICAgICAgICAgIGluZm8gPSBzZWxmLmNvbnZlcnRfdXJsX3RvX2Rvd25sb2FkX2luZm8odXJsLCBuYW1lKQogICAgICAgICAgICAgICAgICAgIGlmIGluZm86CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3VwZGF0ZV92ZXJzaW9uX2RhdGEocmVzdWx0LCBpbmZvKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5yZWN1cnNpdmU6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZ2V0X2Rpc3RyaWJ1dGlvbl9uYW1lcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYWxsIHRoZSBkaXN0cmlidXRpb24gbmFtZXMga25vd24gdG8gdGhpcyBsb2NhdG9yLgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IHNldCgpCiAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoc2VsZi5iYXNlX2Rpcik6CiAgICAgICAgICAgIGZvciBmbiBpbiBmaWxlczoKICAgICAgICAgICAgICAgIGlmIHNlbGYuc2hvdWxkX2luY2x1ZGUoZm4sIHJvb3QpOgogICAgICAgICAgICAgICAgICAgIGZuID0gb3MucGF0aC5qb2luKHJvb3QsIGZuKQogICAgICAgICAgICAgICAgICAgIHVybCA9IHVybHVucGFyc2UoKCdmaWxlJywgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUydXJsKG9zLnBhdGguYWJzcGF0aChmbikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLCAnJywgJycpKQogICAgICAgICAgICAgICAgICAgIGluZm8gPSBzZWxmLmNvbnZlcnRfdXJsX3RvX2Rvd25sb2FkX2luZm8odXJsLCBOb25lKQogICAgICAgICAgICAgICAgICAgIGlmIGluZm86CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoaW5mb1snbmFtZSddKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5yZWN1cnNpdmU6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiByZXN1bHQKCmNsYXNzIEpTT05Mb2NhdG9yKExvY2F0b3IpOgogICAgIiIiCiAgICBUaGlzIGxvY2F0b3IgdXNlcyBzcGVjaWFsIGV4dGVuZGVkIG1ldGFkYXRhIChub3QgYXZhaWxhYmxlIG9uIFB5UEkpIGFuZCBpcwogICAgdGhlIGJhc2lzIG9mIHBlcmZvcm1hbnQgZGVwZW5kZW5jeSByZXNvbHV0aW9uIGluIGRpc3RsaWIuIE90aGVyIGxvY2F0b3JzCiAgICByZXF1aXJlIGFyY2hpdmUgZG93bmxvYWRzIGJlZm9yZSBkZXBlbmRlbmNpZXMgY2FuIGJlIGRldGVybWluZWQhIEFzIHlvdQogICAgbWlnaHQgaW1hZ2luZSwgdGhhdCBjYW4gYmUgc2xvdy4KICAgICIiIgogICAgZGVmIGdldF9kaXN0cmlidXRpb25fbmFtZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGFsbCB0aGUgZGlzdHJpYnV0aW9uIG5hbWVzIGtub3duIHRvIHRoaXMgbG9jYXRvci4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdOb3QgYXZhaWxhYmxlIGZyb20gdGhpcyBsb2NhdG9yJykKCiAgICBkZWYgX2dldF9wcm9qZWN0KHNlbGYsIG5hbWUpOgogICAgICAgIHJlc3VsdCA9IHsndXJscyc6IHt9LCAnZGlnZXN0cyc6IHt9fQogICAgICAgIGRhdGEgPSBnZXRfcHJvamVjdF9kYXRhKG5hbWUpCiAgICAgICAgaWYgZGF0YToKICAgICAgICAgICAgZm9yIGluZm8gaW4gZGF0YS5nZXQoJ2ZpbGVzJywgW10pOgogICAgICAgICAgICAgICAgaWYgaW5mb1sncHR5cGUnXSAhPSAnc2Rpc3QnIG9yIGluZm9bJ3B5dmVyc2lvbiddICE9ICdzb3VyY2UnOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAjIFdlIGRvbid0IHN0b3JlIHN1bW1hcnkgaW4gcHJvamVjdCBtZXRhZGF0YSBhcyBpdCBtYWtlcwogICAgICAgICAgICAgICAgIyB0aGUgZGF0YSBiaWdnZXIgZm9yIG5vIGJlbmVmaXQgZHVyaW5nIGRlcGVuZGVuY3kKICAgICAgICAgICAgICAgICMgcmVzb2x1dGlvbgogICAgICAgICAgICAgICAgZGlzdCA9IG1ha2VfZGlzdChkYXRhWyduYW1lJ10sIGluZm9bJ3ZlcnNpb24nXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeT1kYXRhLmdldCgnc3VtbWFyeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BsYWNlaG9sZGVyIGZvciBzdW1tYXJ5JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtZT1zZWxmLnNjaGVtZSkKICAgICAgICAgICAgICAgIG1kID0gZGlzdC5tZXRhZGF0YQogICAgICAgICAgICAgICAgbWQuc291cmNlX3VybCA9IGluZm9bJ3VybCddCiAgICAgICAgICAgICAgICAjIFRPRE8gU0hBMjU2IGRpZ2VzdAogICAgICAgICAgICAgICAgaWYgJ2RpZ2VzdCcgaW4gaW5mbyBhbmQgaW5mb1snZGlnZXN0J106CiAgICAgICAgICAgICAgICAgICAgZGlzdC5kaWdlc3QgPSAoJ21kNScsIGluZm9bJ2RpZ2VzdCddKQogICAgICAgICAgICAgICAgbWQuZGVwZW5kZW5jaWVzID0gaW5mby5nZXQoJ3JlcXVpcmVtZW50cycsIHt9KQogICAgICAgICAgICAgICAgZGlzdC5leHBvcnRzID0gaW5mby5nZXQoJ2V4cG9ydHMnLCB7fSkKICAgICAgICAgICAgICAgIHJlc3VsdFtkaXN0LnZlcnNpb25dID0gZGlzdAogICAgICAgICAgICAgICAgcmVzdWx0Wyd1cmxzJ10uc2V0ZGVmYXVsdChkaXN0LnZlcnNpb24sIHNldCgpKS5hZGQoaW5mb1sndXJsJ10pCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKY2xhc3MgRGlzdFBhdGhMb2NhdG9yKExvY2F0b3IpOgogICAgIiIiCiAgICBUaGlzIGxvY2F0b3IgZmluZHMgaW5zdGFsbGVkIGRpc3RyaWJ1dGlvbnMgaW4gYSBwYXRoLiBJdCBjYW4gYmUgdXNlZnVsIGZvcgogICAgYWRkaW5nIHRvIGFuIDpjbGFzczpgQWdncmVnYXRpbmdMb2NhdG9yYC4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpc3RwYXRoLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KCiAgICAgICAgOnBhcmFtIGRpc3RwYXRoOiBBIDpjbGFzczpgRGlzdHJpYnV0aW9uUGF0aGAgaW5zdGFuY2UgdG8gc2VhcmNoLgogICAgICAgICIiIgogICAgICAgIHN1cGVyKERpc3RQYXRoTG9jYXRvciwgc2VsZikuX19pbml0X18oKiprd2FyZ3MpCiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZGlzdHBhdGgsIERpc3RyaWJ1dGlvblBhdGgpCiAgICAgICAgc2VsZi5kaXN0cGF0aCA9IGRpc3RwYXRoCgogICAgZGVmIF9nZXRfcHJvamVjdChzZWxmLCBuYW1lKToKICAgICAgICBkaXN0ID0gc2VsZi5kaXN0cGF0aC5nZXRfZGlzdHJpYnV0aW9uKG5hbWUpCiAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICByZXN1bHQgPSB7J3VybHMnOiB7fSwgJ2RpZ2VzdHMnOiB7fX0KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSB7CiAgICAgICAgICAgICAgICBkaXN0LnZlcnNpb246IGRpc3QsCiAgICAgICAgICAgICAgICAndXJscyc6IHtkaXN0LnZlcnNpb246IHNldChbZGlzdC5zb3VyY2VfdXJsXSl9LAogICAgICAgICAgICAgICAgJ2RpZ2VzdHMnOiB7ZGlzdC52ZXJzaW9uOiBzZXQoW05vbmVdKX0KICAgICAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBBZ2dyZWdhdGluZ0xvY2F0b3IoTG9jYXRvcik6CiAgICAiIiIKICAgIFRoaXMgY2xhc3MgYWxsb3dzIHlvdSB0byBjaGFpbiBhbmQvb3IgbWVyZ2UgYSBsaXN0IG9mIGxvY2F0b3JzLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmxvY2F0b3JzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KCiAgICAgICAgOnBhcmFtIGxvY2F0b3JzOiBUaGUgbGlzdCBvZiBsb2NhdG9ycyB0byBzZWFyY2guCiAgICAgICAgOnBhcmFtIGt3YXJnczogUGFzc2VkIHRvIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBmb3I6CiAgICAgICAgICAgICAgICAgICAgICAgKiBtZXJnZSAtIGlmIEZhbHNlICh0aGUgZGVmYXVsdCksIHRoZSBmaXJzdCBzdWNjZXNzZnVsCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2ggZnJvbSBhbnkgb2YgdGhlIGxvY2F0b3JzIGlzIHJldHVybmVkLiBJZiBUcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3VsdHMgZnJvbSBhbGwgbG9jYXRvcnMgYXJlIG1lcmdlZCAodGhpcyBjYW4gYmUKICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3cpLgogICAgICAgICIiIgogICAgICAgIHNlbGYubWVyZ2UgPSBrd2FyZ3MucG9wKCdtZXJnZScsIEZhbHNlKQogICAgICAgIHNlbGYubG9jYXRvcnMgPSBsb2NhdG9ycwogICAgICAgIHN1cGVyKEFnZ3JlZ2F0aW5nTG9jYXRvciwgc2VsZikuX19pbml0X18oKiprd2FyZ3MpCgogICAgZGVmIGNsZWFyX2NhY2hlKHNlbGYpOgogICAgICAgIHN1cGVyKEFnZ3JlZ2F0aW5nTG9jYXRvciwgc2VsZikuY2xlYXJfY2FjaGUoKQogICAgICAgIGZvciBsb2NhdG9yIGluIHNlbGYubG9jYXRvcnM6CiAgICAgICAgICAgIGxvY2F0b3IuY2xlYXJfY2FjaGUoKQoKICAgIGRlZiBfc2V0X3NjaGVtZShzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fc2NoZW1lID0gdmFsdWUKICAgICAgICBmb3IgbG9jYXRvciBpbiBzZWxmLmxvY2F0b3JzOgogICAgICAgICAgICBsb2NhdG9yLnNjaGVtZSA9IHZhbHVlCgogICAgc2NoZW1lID0gcHJvcGVydHkoTG9jYXRvci5zY2hlbWUuZmdldCwgX3NldF9zY2hlbWUpCgogICAgZGVmIF9nZXRfcHJvamVjdChzZWxmLCBuYW1lKToKICAgICAgICByZXN1bHQgPSB7fQogICAgICAgIGZvciBsb2NhdG9yIGluIHNlbGYubG9jYXRvcnM6CiAgICAgICAgICAgIGQgPSBsb2NhdG9yLmdldF9wcm9qZWN0KG5hbWUpCiAgICAgICAgICAgIGlmIGQ6CiAgICAgICAgICAgICAgICBpZiBzZWxmLm1lcmdlOgogICAgICAgICAgICAgICAgICAgIGZpbGVzID0gcmVzdWx0LmdldCgndXJscycsIHt9KQogICAgICAgICAgICAgICAgICAgIGRpZ2VzdHMgPSByZXN1bHQuZ2V0KCdkaWdlc3RzJywge30pCiAgICAgICAgICAgICAgICAgICAgIyBuZXh0IGxpbmUgY291bGQgb3ZlcndyaXRlIHJlc3VsdFsndXJscyddLCByZXN1bHRbJ2RpZ2VzdHMnXQogICAgICAgICAgICAgICAgICAgIHJlc3VsdC51cGRhdGUoZCkKICAgICAgICAgICAgICAgICAgICBkZiA9IHJlc3VsdC5nZXQoJ3VybHMnKQogICAgICAgICAgICAgICAgICAgIGlmIGZpbGVzIGFuZCBkZjoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gZmlsZXMuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGsgaW4gZGY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZba10gfD0gdgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZltrXSA9IHYKICAgICAgICAgICAgICAgICAgICBkZCA9IHJlc3VsdC5nZXQoJ2RpZ2VzdHMnKQogICAgICAgICAgICAgICAgICAgIGlmIGRpZ2VzdHMgYW5kIGRkOgogICAgICAgICAgICAgICAgICAgICAgICBkZC51cGRhdGUoZGlnZXN0cykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBTZWUgaXNzdWUgIzE4LiBJZiBhbnkgZGlzdHMgYXJlIGZvdW5kIGFuZCB3ZSdyZSBsb29raW5nCiAgICAgICAgICAgICAgICAgICAgIyBmb3Igc3BlY2lmaWMgY29uc3RyYWludHMsIHdlIG9ubHkgcmV0dXJuIHNvbWV0aGluZyBpZgogICAgICAgICAgICAgICAgICAgICMgYSBtYXRjaCBpcyBmb3VuZC4gRm9yIGV4YW1wbGUsIGlmIGEgRGlyZWN0b3J5TG9jYXRvcgogICAgICAgICAgICAgICAgICAgICMgcmV0dXJucyBqdXN0IGZvbyAoMS4wKSB3aGlsZSB3ZSdyZSBsb29raW5nIGZvcgogICAgICAgICAgICAgICAgICAgICMgZm9vICg+PSAyLjApLCB3ZSdsbCBwcmV0ZW5kIHRoZXJlIHdhcyBub3RoaW5nIHRoZXJlIHNvCiAgICAgICAgICAgICAgICAgICAgIyB0aGF0IHN1YnNlcXVlbnQgbG9jYXRvcnMgY2FuIGJlIHF1ZXJpZWQuIE90aGVyd2lzZSB3ZQogICAgICAgICAgICAgICAgICAgICMgd291bGQganVzdCByZXR1cm4gZm9vICgxLjApIHdoaWNoIHdvdWxkIHRoZW4gbGVhZCB0byBhCiAgICAgICAgICAgICAgICAgICAgIyBmYWlsdXJlIHRvIGZpbmQgZm9vICg+PSAyLjApLCBiZWNhdXNlIG90aGVyIGxvY2F0b3JzCiAgICAgICAgICAgICAgICAgICAgIyB3ZXJlbid0IHNlYXJjaGVkLiBOb3RlIHRoYXQgdGhpcyBvbmx5IG1hdHRlcnMgd2hlbgogICAgICAgICAgICAgICAgICAgICMgbWVyZ2U9RmFsc2UuCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5tYXRjaGVyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGsgaW4gZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYubWF0Y2hlci5tYXRjaChrKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGlmIGZvdW5kOgogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBnZXRfZGlzdHJpYnV0aW9uX25hbWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhbGwgdGhlIGRpc3RyaWJ1dGlvbiBuYW1lcyBrbm93biB0byB0aGlzIGxvY2F0b3IuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gc2V0KCkKICAgICAgICBmb3IgbG9jYXRvciBpbiBzZWxmLmxvY2F0b3JzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXN1bHQgfD0gbG9jYXRvci5nZXRfZGlzdHJpYnV0aW9uX25hbWVzKCkKICAgICAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCiMgV2UgdXNlIGEgbGVnYWN5IHNjaGVtZSBzaW1wbHkgYmVjYXVzZSBtb3N0IG9mIHRoZSBkaXN0cyBvbiBQeVBJIHVzZSBsZWdhY3kKIyB2ZXJzaW9ucyB3aGljaCBkb24ndCBjb25mb3JtIHRvIFBFUCA0MjYgLyBQRVAgNDQwLgpkZWZhdWx0X2xvY2F0b3IgPSBBZ2dyZWdhdGluZ0xvY2F0b3IoCiAgICAgICAgICAgICAgICAgICAgSlNPTkxvY2F0b3IoKSwKICAgICAgICAgICAgICAgICAgICBTaW1wbGVTY3JhcGluZ0xvY2F0b3IoJ2h0dHBzOi8vcHlwaS5weXRob24ub3JnL3NpbXBsZS8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PTMuMCksCiAgICAgICAgICAgICAgICAgICAgc2NoZW1lPSdsZWdhY3knKQoKbG9jYXRlID0gZGVmYXVsdF9sb2NhdG9yLmxvY2F0ZQoKTkFNRV9WRVJTSU9OX1JFID0gcmUuY29tcGlsZShyJyg/UDxuYW1lPltcdy1dKylccyonCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidcKFxzKig9PVxzKik/KD9QPHZlcj5bXildKylcKSQnKQoKY2xhc3MgRGVwZW5kZW5jeUZpbmRlcihvYmplY3QpOgogICAgIiIiCiAgICBMb2NhdGUgZGVwZW5kZW5jaWVzIGZvciBkaXN0cmlidXRpb25zLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvY2F0b3I9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZSwgdXNpbmcgdGhlIHNwZWNpZmllZCBsb2NhdG9yCiAgICAgICAgdG8gbG9jYXRlIGRpc3RyaWJ1dGlvbnMuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5sb2NhdG9yID0gbG9jYXRvciBvciBkZWZhdWx0X2xvY2F0b3IKICAgICAgICBzZWxmLnNjaGVtZSA9IGdldF9zY2hlbWUoc2VsZi5sb2NhdG9yLnNjaGVtZSkKCiAgICBkZWYgYWRkX2Rpc3RyaWJ1dGlvbihzZWxmLCBkaXN0KToKICAgICAgICAiIiIKICAgICAgICBBZGQgYSBkaXN0cmlidXRpb24gdG8gdGhlIGZpbmRlci4gVGhpcyB3aWxsIHVwZGF0ZSBpbnRlcm5hbCBpbmZvcm1hdGlvbgogICAgICAgIGFib3V0IHdobyBwcm92aWRlcyB3aGF0LgogICAgICAgIDpwYXJhbSBkaXN0OiBUaGUgZGlzdHJpYnV0aW9uIHRvIGFkZC4KICAgICAgICAiIiIKICAgICAgICBsb2dnZXIuZGVidWcoJ2FkZGluZyBkaXN0cmlidXRpb24gJXMnLCBkaXN0KQogICAgICAgIG5hbWUgPSBkaXN0LmtleQogICAgICAgIHNlbGYuZGlzdHNfYnlfbmFtZVtuYW1lXSA9IGRpc3QKICAgICAgICBzZWxmLmRpc3RzWyhuYW1lLCBkaXN0LnZlcnNpb24pXSA9IGRpc3QKICAgICAgICBmb3IgcCBpbiBkaXN0LnByb3ZpZGVzOgogICAgICAgICAgICBuYW1lLCB2ZXJzaW9uID0gcGFyc2VfbmFtZV9hbmRfdmVyc2lvbihwKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0FkZCB0byBwcm92aWRlZDogJXMsICVzLCAlcycsIG5hbWUsIHZlcnNpb24sIGRpc3QpCiAgICAgICAgICAgIHNlbGYucHJvdmlkZWQuc2V0ZGVmYXVsdChuYW1lLCBzZXQoKSkuYWRkKCh2ZXJzaW9uLCBkaXN0KSkKCiAgICBkZWYgcmVtb3ZlX2Rpc3RyaWJ1dGlvbihzZWxmLCBkaXN0KToKICAgICAgICAiIiIKICAgICAgICBSZW1vdmUgYSBkaXN0cmlidXRpb24gZnJvbSB0aGUgZmluZGVyLiBUaGlzIHdpbGwgdXBkYXRlIGludGVybmFsCiAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgd2hvIHByb3ZpZGVzIHdoYXQuCiAgICAgICAgOnBhcmFtIGRpc3Q6IFRoZSBkaXN0cmlidXRpb24gdG8gcmVtb3ZlLgogICAgICAgICIiIgogICAgICAgIGxvZ2dlci5kZWJ1ZygncmVtb3ZpbmcgZGlzdHJpYnV0aW9uICVzJywgZGlzdCkKICAgICAgICBuYW1lID0gZGlzdC5rZXkKICAgICAgICBkZWwgc2VsZi5kaXN0c19ieV9uYW1lW25hbWVdCiAgICAgICAgZGVsIHNlbGYuZGlzdHNbKG5hbWUsIGRpc3QudmVyc2lvbildCiAgICAgICAgZm9yIHAgaW4gZGlzdC5wcm92aWRlczoKICAgICAgICAgICAgbmFtZSwgdmVyc2lvbiA9IHBhcnNlX25hbWVfYW5kX3ZlcnNpb24ocCkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZW1vdmUgZnJvbSBwcm92aWRlZDogJXMsICVzLCAlcycsIG5hbWUsIHZlcnNpb24sIGRpc3QpCiAgICAgICAgICAgIHMgPSBzZWxmLnByb3ZpZGVkW25hbWVdCiAgICAgICAgICAgIHMucmVtb3ZlKCh2ZXJzaW9uLCBkaXN0KSkKICAgICAgICAgICAgaWYgbm90IHM6CiAgICAgICAgICAgICAgICBkZWwgc2VsZi5wcm92aWRlZFtuYW1lXQoKICAgIGRlZiBnZXRfbWF0Y2hlcihzZWxmLCByZXF0KToKICAgICAgICAiIiIKICAgICAgICBHZXQgYSB2ZXJzaW9uIG1hdGNoZXIgZm9yIGEgcmVxdWlyZW1lbnQuCiAgICAgICAgOnBhcmFtIHJlcXQ6IFRoZSByZXF1aXJlbWVudAogICAgICAgIDp0eXBlIHJlcXQ6IHN0cgogICAgICAgIDpyZXR1cm46IEEgdmVyc2lvbiBtYXRjaGVyIChhbiBpbnN0YW5jZSBvZgogICAgICAgICAgICAgICAgIDpjbGFzczpgZGlzdGxpYi52ZXJzaW9uLk1hdGNoZXJgKS4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIG1hdGNoZXIgPSBzZWxmLnNjaGVtZS5tYXRjaGVyKHJlcXQpCiAgICAgICAgZXhjZXB0IFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICMgWFhYIGNvbXBhdC1tb2RlIGlmIGNhbm5vdCByZWFkIHRoZSB2ZXJzaW9uCiAgICAgICAgICAgIG5hbWUgPSByZXF0LnNwbGl0KClbMF0KICAgICAgICAgICAgbWF0Y2hlciA9IHNlbGYuc2NoZW1lLm1hdGNoZXIobmFtZSkKICAgICAgICByZXR1cm4gbWF0Y2hlcgoKICAgIGRlZiBmaW5kX3Byb3ZpZGVycyhzZWxmLCByZXF0KToKICAgICAgICAiIiIKICAgICAgICBGaW5kIHRoZSBkaXN0cmlidXRpb25zIHdoaWNoIGNhbiBmdWxmaWxsIGEgcmVxdWlyZW1lbnQuCgogICAgICAgIDpwYXJhbSByZXF0OiBUaGUgcmVxdWlyZW1lbnQuCiAgICAgICAgIDp0eXBlIHJlcXQ6IHN0cgogICAgICAgIDpyZXR1cm46IEEgc2V0IG9mIGRpc3RyaWJ1dGlvbiB3aGljaCBjYW4gZnVsZmlsbCB0aGUgcmVxdWlyZW1lbnQuCiAgICAgICAgIiIiCiAgICAgICAgbWF0Y2hlciA9IHNlbGYuZ2V0X21hdGNoZXIocmVxdCkKICAgICAgICBuYW1lID0gbWF0Y2hlci5rZXkgICAjIGNhc2UtaW5zZW5zaXRpdmUKICAgICAgICByZXN1bHQgPSBzZXQoKQogICAgICAgIHByb3ZpZGVkID0gc2VsZi5wcm92aWRlZAogICAgICAgIGlmIG5hbWUgaW4gcHJvdmlkZWQ6CiAgICAgICAgICAgIGZvciB2ZXJzaW9uLCBwcm92aWRlciBpbiBwcm92aWRlZFtuYW1lXToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoZXIubWF0Y2godmVyc2lvbikKICAgICAgICAgICAgICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjoKICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IEZhbHNlCgogICAgICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChwcm92aWRlcikKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgdHJ5X3RvX3JlcGxhY2Uoc2VsZiwgcHJvdmlkZXIsIG90aGVyLCBwcm9ibGVtcyk6CiAgICAgICAgIiIiCiAgICAgICAgQXR0ZW1wdCB0byByZXBsYWNlIG9uZSBwcm92aWRlciB3aXRoIGFub3RoZXIuIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQKICAgICAgICB3aGVuIHJlc29sdmluZyBkZXBlbmRlbmNpZXMgZnJvbSBtdWx0aXBsZSBzb3VyY2VzLCBlLmcuIEEgcmVxdWlyZXMKICAgICAgICAoQiA+PSAxLjApIHdoaWxlIEMgcmVxdWlyZXMgKEIgPj0gMS4xKS4KCiAgICAgICAgRm9yIHN1Y2Nlc3NmdWwgcmVwbGFjZW1lbnQsIGBgcHJvdmlkZXJgYCBtdXN0IG1lZXQgYWxsIHRoZSByZXF1aXJlbWVudHMKICAgICAgICB3aGljaCBgYG90aGVyYGAgZnVsZmlsbHMuCgogICAgICAgIDpwYXJhbSBwcm92aWRlcjogVGhlIHByb3ZpZGVyIHdlIGFyZSB0cnlpbmcgdG8gcmVwbGFjZSB3aXRoLgogICAgICAgIDpwYXJhbSBvdGhlcjogVGhlIHByb3ZpZGVyIHdlJ3JlIHRyeWluZyB0byByZXBsYWNlLgogICAgICAgIDpwYXJhbSBwcm9ibGVtczogSWYgRmFsc2UgaXMgcmV0dXJuZWQsIHRoaXMgd2lsbCBjb250YWluIHdoYXQKICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JsZW1zIHByZXZlbnRlZCByZXBsYWNlbWVudC4gVGhpcyBpcyBjdXJyZW50bHkKICAgICAgICAgICAgICAgICAgICAgICAgIGEgdHVwbGUgb2YgdGhlIGxpdGVyYWwgc3RyaW5nICdjYW50cmVwbGFjZScsCiAgICAgICAgICAgICAgICAgICAgICAgICBgYHByb3ZpZGVyYGAsIGBgb3RoZXJgYCAgYW5kIHRoZSBzZXQgb2YgcmVxdWlyZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGBgcHJvdmlkZXJgYCBjb3VsZG4ndCBmdWxmaWxsLgogICAgICAgIDpyZXR1cm46IFRydWUgaWYgd2UgY2FuIHJlcGxhY2UgYGBvdGhlcmBgIHdpdGggYGBwcm92aWRlcmBgLCBlbHNlCiAgICAgICAgICAgICAgICAgRmFsc2UuCiAgICAgICAgIiIiCiAgICAgICAgcmxpc3QgPSBzZWxmLnJlcXRzW290aGVyXQogICAgICAgIHVubWF0Y2hlZCA9IHNldCgpCiAgICAgICAgZm9yIHMgaW4gcmxpc3Q6CiAgICAgICAgICAgIG1hdGNoZXIgPSBzZWxmLmdldF9tYXRjaGVyKHMpCiAgICAgICAgICAgIGlmIG5vdCBtYXRjaGVyLm1hdGNoKHByb3ZpZGVyLnZlcnNpb24pOgogICAgICAgICAgICAgICAgdW5tYXRjaGVkLmFkZChzKQogICAgICAgIGlmIHVubWF0Y2hlZDoKICAgICAgICAgICAgIyBjYW4ndCByZXBsYWNlIG90aGVyIHdpdGggcHJvdmlkZXIKICAgICAgICAgICAgcHJvYmxlbXMuYWRkKCgnY2FudHJlcGxhY2UnLCBwcm92aWRlciwgb3RoZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KHVubWF0Y2hlZCkpKQogICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgY2FuIHJlcGxhY2Ugb3RoZXIgd2l0aCBwcm92aWRlcgogICAgICAgICAgICBzZWxmLnJlbW92ZV9kaXN0cmlidXRpb24ob3RoZXIpCiAgICAgICAgICAgIGRlbCBzZWxmLnJlcXRzW290aGVyXQogICAgICAgICAgICBmb3IgcyBpbiBybGlzdDoKICAgICAgICAgICAgICAgIHNlbGYucmVxdHMuc2V0ZGVmYXVsdChwcm92aWRlciwgc2V0KCkpLmFkZChzKQogICAgICAgICAgICBzZWxmLmFkZF9kaXN0cmlidXRpb24ocHJvdmlkZXIpCiAgICAgICAgICAgIHJlc3VsdCA9IFRydWUKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGZpbmQoc2VsZiwgcmVxdWlyZW1lbnQsIG1ldGFfZXh0cmFzPU5vbmUsIHByZXJlbGVhc2VzPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBGaW5kIGEgZGlzdHJpYnV0aW9uIGFuZCBhbGwgZGlzdHJpYnV0aW9ucyBpdCBkZXBlbmRzIG9uLgoKICAgICAgICA6cGFyYW0gcmVxdWlyZW1lbnQ6IFRoZSByZXF1aXJlbWVudCBzcGVjaWZ5aW5nIHRoZSBkaXN0cmlidXRpb24gdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmQsIG9yIGEgRGlzdHJpYnV0aW9uIGluc3RhbmNlLgogICAgICAgIDpwYXJhbSBtZXRhX2V4dHJhczogQSBsaXN0IG9mIG1ldGEgZXh0cmFzIHN1Y2ggYXMgOnRlc3Q6LCA6YnVpbGQ6IGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gb24uCiAgICAgICAgOnBhcmFtIHByZXJlbGVhc2VzOiBJZiBgYFRydWVgYCwgYWxsb3cgcHJlLXJlbGVhc2UgdmVyc2lvbnMgdG8gYmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIC0gb3RoZXJ3aXNlLCBkb24ndCByZXR1cm4gcHJlcmVsZWFzZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGVzcyB0aGV5J3JlIGFsbCB0aGF0J3MgYXZhaWxhYmxlLgoKICAgICAgICBSZXR1cm4gYSBzZXQgb2YgOmNsYXNzOmBEaXN0cmlidXRpb25gIGluc3RhbmNlcyBhbmQgYSBzZXQgb2YKICAgICAgICBwcm9ibGVtcy4KCiAgICAgICAgVGhlIGRpc3RyaWJ1dGlvbnMgcmV0dXJuZWQgc2hvdWxkIGJlIHN1Y2ggdGhhdCB0aGV5IGhhdmUgdGhlCiAgICAgICAgOmF0dHI6YHJlcXVpcmVkYCBhdHRyaWJ1dGUgc2V0IHRvIGBgVHJ1ZWBgIGlmIHRoZXkgd2VyZQogICAgICAgIGZyb20gdGhlIGBgcmVxdWlyZW1lbnRgYCBwYXNzZWQgdG8gYGBmaW5kKClgYCwgYW5kIHRoZXkgaGF2ZSB0aGUKICAgICAgICA6YXR0cjpgYnVpbGRfdGltZV9kZXBlbmRlbmN5YCBhdHRyaWJ1dGUgc2V0IHRvIGBgVHJ1ZWBgIHVubGVzcyB0aGV5CiAgICAgICAgYXJlIHBvc3QtaW5zdGFsbGF0aW9uIGRlcGVuZGVuY2llcyBvZiB0aGUgYGByZXF1aXJlbWVudGBgLgoKICAgICAgICBUaGUgcHJvYmxlbXMgc2hvdWxkIGJlIGEgdHVwbGUgY29uc2lzdGluZyBvZiB0aGUgc3RyaW5nCiAgICAgICAgYGAndW5zYXRpc2ZpZWQnYGAgYW5kIHRoZSByZXF1aXJlbWVudCB3aGljaCBjb3VsZG4ndCBiZSBzYXRpc2ZpZWQKICAgICAgICBieSBhbnkgZGlzdHJpYnV0aW9uIGtub3duIHRvIHRoZSBsb2NhdG9yLgogICAgICAgICIiIgoKICAgICAgICBzZWxmLnByb3ZpZGVkID0ge30KICAgICAgICBzZWxmLmRpc3RzID0ge30KICAgICAgICBzZWxmLmRpc3RzX2J5X25hbWUgPSB7fQogICAgICAgIHNlbGYucmVxdHMgPSB7fQoKICAgICAgICBtZXRhX2V4dHJhcyA9IHNldChtZXRhX2V4dHJhcyBvciBbXSkKICAgICAgICBpZiAnOio6JyBpbiBtZXRhX2V4dHJhczoKICAgICAgICAgICAgbWV0YV9leHRyYXMucmVtb3ZlKCc6KjonKQogICAgICAgICAgICAjIDptZXRhOiBhbmQgOnJ1bjogYXJlIGltcGxpY2l0bHkgaW5jbHVkZWQKICAgICAgICAgICAgbWV0YV9leHRyYXMgfD0gc2V0KFsnOnRlc3Q6JywgJzpidWlsZDonLCAnOmRldjonXSkKCiAgICAgICAgaWYgaXNpbnN0YW5jZShyZXF1aXJlbWVudCwgRGlzdHJpYnV0aW9uKToKICAgICAgICAgICAgZGlzdCA9IG9kaXN0ID0gcmVxdWlyZW1lbnQKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdwYXNzZWQgJXMgYXMgcmVxdWlyZW1lbnQnLCBvZGlzdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBkaXN0ID0gb2Rpc3QgPSBzZWxmLmxvY2F0b3IubG9jYXRlKHJlcXVpcmVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXJlbGVhc2VzPXByZXJlbGVhc2VzKQogICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdVbmFibGUgdG8gbG9jYXRlICVyJyAlIHJlcXVpcmVtZW50KQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ2xvY2F0ZWQgJXMnLCBvZGlzdCkKICAgICAgICBkaXN0LnJlcXVlc3RlZCA9IFRydWUKICAgICAgICBwcm9ibGVtcyA9IHNldCgpCiAgICAgICAgdG9kbyA9IHNldChbZGlzdF0pCiAgICAgICAgaW5zdGFsbF9kaXN0cyA9IHNldChbb2Rpc3RdKQogICAgICAgIHdoaWxlIHRvZG86CiAgICAgICAgICAgIGRpc3QgPSB0b2RvLnBvcCgpCiAgICAgICAgICAgIG5hbWUgPSBkaXN0LmtleSAgICAgIyBjYXNlLWluc2Vuc2l0aXZlCiAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYuZGlzdHNfYnlfbmFtZToKICAgICAgICAgICAgICAgIHNlbGYuYWRkX2Rpc3RyaWJ1dGlvbihkaXN0KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgI2ltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQogICAgICAgICAgICAgICAgb3RoZXIgPSBzZWxmLmRpc3RzX2J5X25hbWVbbmFtZV0KICAgICAgICAgICAgICAgIGlmIG90aGVyICE9IGRpc3Q6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cnlfdG9fcmVwbGFjZShkaXN0LCBvdGhlciwgcHJvYmxlbXMpCgogICAgICAgICAgICBpcmVxdHMgPSBkaXN0LnJ1bl9yZXF1aXJlcyB8IGRpc3QubWV0YV9yZXF1aXJlcwogICAgICAgICAgICBzcmVxdHMgPSBkaXN0LmJ1aWxkX3JlcXVpcmVzCiAgICAgICAgICAgIGVyZXF0cyA9IHNldCgpCiAgICAgICAgICAgIGlmIGRpc3QgaW4gaW5zdGFsbF9kaXN0czoKICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gKCd0ZXN0JywgJ2J1aWxkJywgJ2RldicpOgogICAgICAgICAgICAgICAgICAgIGUgPSAnOiVzOicgJSBrZXkKICAgICAgICAgICAgICAgICAgICBpZiBlIGluIG1ldGFfZXh0cmFzOgogICAgICAgICAgICAgICAgICAgICAgICBlcmVxdHMgfD0gZ2V0YXR0cihkaXN0LCAnJXNfcmVxdWlyZXMnICUga2V5KQogICAgICAgICAgICBhbGxfcmVxdHMgPSBpcmVxdHMgfCBzcmVxdHMgfCBlcmVxdHMKICAgICAgICAgICAgZm9yIHIgaW4gYWxsX3JlcXRzOgogICAgICAgICAgICAgICAgcHJvdmlkZXJzID0gc2VsZi5maW5kX3Byb3ZpZGVycyhyKQogICAgICAgICAgICAgICAgaWYgbm90IHByb3ZpZGVyczoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ05vIHByb3ZpZGVycyBmb3VuZCBmb3IgJXInLCByKQogICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gc2VsZi5sb2NhdG9yLmxvY2F0ZShyLCBwcmVyZWxlYXNlcz1wcmVyZWxlYXNlcykKICAgICAgICAgICAgICAgICAgICAjIElmIG5vIHByb3ZpZGVyIGlzIGZvdW5kIGFuZCB3ZSBkaWRuJ3QgY29uc2lkZXIKICAgICAgICAgICAgICAgICAgICAjIHByZXJlbGVhc2VzLCBjb25zaWRlciB0aGVtIG5vdy4KICAgICAgICAgICAgICAgICAgICBpZiBwcm92aWRlciBpcyBOb25lIGFuZCBub3QgcHJlcmVsZWFzZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gc2VsZi5sb2NhdG9yLmxvY2F0ZShyLCBwcmVyZWxlYXNlcz1UcnVlKQogICAgICAgICAgICAgICAgICAgIGlmIHByb3ZpZGVyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQ2Fubm90IHNhdGlzZnkgJXInLCByKQogICAgICAgICAgICAgICAgICAgICAgICBwcm9ibGVtcy5hZGQoKCd1bnNhdGlzZmllZCcsIHIpKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG4sIHYgPSBwcm92aWRlci5rZXksIHByb3ZpZGVyLnZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4sIHYpIG5vdCBpbiBzZWxmLmRpc3RzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9kby5hZGQocHJvdmlkZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVycy5hZGQocHJvdmlkZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHIgaW4gaXJlcXRzIGFuZCBkaXN0IGluIGluc3RhbGxfZGlzdHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsX2Rpc3RzLmFkZChwcm92aWRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQWRkaW5nICVzIHRvIGluc3RhbGxfZGlzdHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLm5hbWVfYW5kX3ZlcnNpb24pCiAgICAgICAgICAgICAgICBmb3IgcCBpbiBwcm92aWRlcnM6CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHAua2V5CiAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5kaXN0c19ieV9uYW1lOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcXRzLnNldGRlZmF1bHQocCwgc2V0KCkpLmFkZChyKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyID0gc2VsZi5kaXN0c19ieV9uYW1lW25hbWVdCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG90aGVyICE9IHA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNlZSBpZiBvdGhlciBjYW4gYmUgcmVwbGFjZWQgYnkgcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cnlfdG9fcmVwbGFjZShwLCBvdGhlciwgcHJvYmxlbXMpCgogICAgICAgIGRpc3RzID0gc2V0KHNlbGYuZGlzdHMudmFsdWVzKCkpCiAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgICAgIGRpc3QuYnVpbGRfdGltZV9kZXBlbmRlbmN5ID0gZGlzdCBub3QgaW4gaW5zdGFsbF9kaXN0cwogICAgICAgICAgICBpZiBkaXN0LmJ1aWxkX3RpbWVfZGVwZW5kZW5jeToKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnJXMgaXMgYSBidWlsZC10aW1lIGRlcGVuZGVuY3kgb25seS4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QubmFtZV9hbmRfdmVyc2lvbikKICAgICAgICBsb2dnZXIuZGVidWcoJ2ZpbmQgZG9uZSBmb3IgJXMnLCBvZGlzdCkKICAgICAgICByZXR1cm4gZGlzdHMsIHByb2JsZW1zClBLAwQUAAAAAAAAACEAhpe1m9o5AADaOQAALwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL21hbmlmZXN0LnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwoiIiIKQ2xhc3MgcmVwcmVzZW50aW5nIHRoZSBsaXN0IG9mIGZpbGVzIGluIGEgZGlzdHJpYnV0aW9uLgoKRXF1aXZhbGVudCB0byBkaXN0dXRpbHMuZmlsZWxpc3QsIGJ1dCBmaXhlcyBzb21lIHByb2JsZW1zLgoiIiIKaW1wb3J0IGZubWF0Y2gKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgc3lzCgpmcm9tIC4gaW1wb3J0IERpc3RsaWJFeGNlcHRpb24KZnJvbSAuY29tcGF0IGltcG9ydCBmc2RlY29kZQpmcm9tIC51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKCgpfX2FsbF9fID0gWydNYW5pZmVzdCddCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCiMgYSBcIGZvbGxvd2VkIGJ5IHNvbWUgc3BhY2VzICsgRU9MCl9DT0xMQVBTRV9QQVRURVJOID0gcmUuY29tcGlsZSgnXFxcdypcbicsIHJlLk0pCl9DT01NRU5URURfTElORSA9IHJlLmNvbXBpbGUoJyMuKj8oPz1cbil8XG4oPz0kKScsIHJlLk0gfCByZS5TKQoKIwojIER1ZSB0byB0aGUgZGlmZmVyZW50IHJlc3VsdHMgcmV0dXJuZWQgYnkgZm5tYXRjaC50cmFuc2xhdGUsIHdlIG5lZWQKIyB0byBkbyBzbGlnaHRseSBkaWZmZXJlbnQgcHJvY2Vzc2luZyBmb3IgUHl0aG9uIDIuNyBhbmQgMy4yIC4uLiB0aGlzIG5lZWRlZAojIHRvIGJlIGJyb3VnaHQgaW4gZm9yIFB5dGhvbiAzLjYgb253YXJkcy4KIwpfUFlUSE9OX1ZFUlNJT04gPSBzeXMudmVyc2lvbl9pbmZvWzoyXQoKY2xhc3MgTWFuaWZlc3Qob2JqZWN0KToKICAgICIiIkEgbGlzdCBvZiBmaWxlcyBidWlsdCBieSBvbiBleHBsb3JpbmcgdGhlIGZpbGVzeXN0ZW0gYW5kIGZpbHRlcmVkIGJ5CiAgICBhcHBseWluZyB2YXJpb3VzIHBhdHRlcm5zIHRvIHdoYXQgd2UgZmluZCB0aGVyZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiYXNlPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCgogICAgICAgIDpwYXJhbSBiYXNlOiBUaGUgYmFzZSBkaXJlY3RvcnkgdG8gZXhwbG9yZSB1bmRlci4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmJhc2UgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5ub3JtcGF0aChiYXNlIG9yIG9zLmdldGN3ZCgpKSkKICAgICAgICBzZWxmLnByZWZpeCA9IHNlbGYuYmFzZSArIG9zLnNlcAogICAgICAgIHNlbGYuYWxsZmlsZXMgPSBOb25lCiAgICAgICAgc2VsZi5maWxlcyA9IHNldCgpCgogICAgIwogICAgIyBQdWJsaWMgQVBJCiAgICAjCgogICAgZGVmIGZpbmRhbGwoc2VsZik6CiAgICAgICAgIiIiRmluZCBhbGwgZmlsZXMgdW5kZXIgdGhlIGJhc2UgYW5kIHNldCBgYGFsbGZpbGVzYGAgdG8gdGhlIGFic29sdXRlCiAgICAgICAgcGF0aG5hbWVzIG9mIGZpbGVzIGZvdW5kLgogICAgICAgICIiIgogICAgICAgIGZyb20gc3RhdCBpbXBvcnQgU19JU1JFRywgU19JU0RJUiwgU19JU0xOSwoKICAgICAgICBzZWxmLmFsbGZpbGVzID0gYWxsZmlsZXMgPSBbXQogICAgICAgIHJvb3QgPSBzZWxmLmJhc2UKICAgICAgICBzdGFjayA9IFtyb290XQogICAgICAgIHBvcCA9IHN0YWNrLnBvcAogICAgICAgIHB1c2ggPSBzdGFjay5hcHBlbmQKCiAgICAgICAgd2hpbGUgc3RhY2s6CiAgICAgICAgICAgIHJvb3QgPSBwb3AoKQogICAgICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIocm9vdCkKCiAgICAgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgogICAgICAgICAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkKCiAgICAgICAgICAgICAgICAjIEF2b2lkIGV4Y2VzcyBzdGF0IGNhbGxzIC0tIGp1c3Qgb25lIHdpbGwgZG8sIHRoYW5rIHlvdSEKICAgICAgICAgICAgICAgIHN0YXQgPSBvcy5zdGF0KGZ1bGxuYW1lKQogICAgICAgICAgICAgICAgbW9kZSA9IHN0YXQuc3RfbW9kZQogICAgICAgICAgICAgICAgaWYgU19JU1JFRyhtb2RlKToKICAgICAgICAgICAgICAgICAgICBhbGxmaWxlcy5hcHBlbmQoZnNkZWNvZGUoZnVsbG5hbWUpKQogICAgICAgICAgICAgICAgZWxpZiBTX0lTRElSKG1vZGUpIGFuZCBub3QgU19JU0xOSyhtb2RlKToKICAgICAgICAgICAgICAgICAgICBwdXNoKGZ1bGxuYW1lKQoKICAgIGRlZiBhZGQoc2VsZiwgaXRlbSk6CiAgICAgICAgIiIiCiAgICAgICAgQWRkIGEgZmlsZSB0byB0aGUgbWFuaWZlc3QuCgogICAgICAgIDpwYXJhbSBpdGVtOiBUaGUgcGF0aG5hbWUgdG8gYWRkLiBUaGlzIGNhbiBiZSByZWxhdGl2ZSB0byB0aGUgYmFzZS4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgaXRlbS5zdGFydHN3aXRoKHNlbGYucHJlZml4KToKICAgICAgICAgICAgaXRlbSA9IG9zLnBhdGguam9pbihzZWxmLmJhc2UsIGl0ZW0pCiAgICAgICAgc2VsZi5maWxlcy5hZGQob3MucGF0aC5ub3JtcGF0aChpdGVtKSkKCiAgICBkZWYgYWRkX21hbnkoc2VsZiwgaXRlbXMpOgogICAgICAgICIiIgogICAgICAgIEFkZCBhIGxpc3Qgb2YgZmlsZXMgdG8gdGhlIG1hbmlmZXN0LgoKICAgICAgICA6cGFyYW0gaXRlbXM6IFRoZSBwYXRobmFtZXMgdG8gYWRkLiBUaGVzZSBjYW4gYmUgcmVsYXRpdmUgdG8gdGhlIGJhc2UuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CiAgICAgICAgICAgIHNlbGYuYWRkKGl0ZW0pCgogICAgZGVmIHNvcnRlZChzZWxmLCB3YW50ZGlycz1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHNvcnRlZCBmaWxlcyBpbiBkaXJlY3Rvcnkgb3JkZXIKICAgICAgICAiIiIKCiAgICAgICAgZGVmIGFkZF9kaXIoZGlycywgZCk6CiAgICAgICAgICAgIGRpcnMuYWRkKGQpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnYWRkX2RpciBhZGRlZCAlcycsIGQpCiAgICAgICAgICAgIGlmIGQgIT0gc2VsZi5iYXNlOgogICAgICAgICAgICAgICAgcGFyZW50LCBfID0gb3MucGF0aC5zcGxpdChkKQogICAgICAgICAgICAgICAgYXNzZXJ0IHBhcmVudCBub3QgaW4gKCcnLCAnLycpCiAgICAgICAgICAgICAgICBhZGRfZGlyKGRpcnMsIHBhcmVudCkKCiAgICAgICAgcmVzdWx0ID0gc2V0KHNlbGYuZmlsZXMpICAgICMgbWFrZSBhIGNvcHkhCiAgICAgICAgaWYgd2FudGRpcnM6CiAgICAgICAgICAgIGRpcnMgPSBzZXQoKQogICAgICAgICAgICBmb3IgZiBpbiByZXN1bHQ6CiAgICAgICAgICAgICAgICBhZGRfZGlyKGRpcnMsIG9zLnBhdGguZGlybmFtZShmKSkKICAgICAgICAgICAgcmVzdWx0IHw9IGRpcnMKICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbigqcGF0aF90dXBsZSkgZm9yIHBhdGhfdHVwbGUgaW4KICAgICAgICAgICAgICAgIHNvcnRlZChvcy5wYXRoLnNwbGl0KHBhdGgpIGZvciBwYXRoIGluIHJlc3VsdCldCgogICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgICIiIkNsZWFyIGFsbCBjb2xsZWN0ZWQgZmlsZXMuIiIiCiAgICAgICAgc2VsZi5maWxlcyA9IHNldCgpCiAgICAgICAgc2VsZi5hbGxmaWxlcyA9IFtdCgogICAgZGVmIHByb2Nlc3NfZGlyZWN0aXZlKHNlbGYsIGRpcmVjdGl2ZSk6CiAgICAgICAgIiIiCiAgICAgICAgUHJvY2VzcyBhIGRpcmVjdGl2ZSB3aGljaCBlaXRoZXIgYWRkcyBzb21lIGZpbGVzIGZyb20gYGBhbGxmaWxlc2BgIHRvCiAgICAgICAgYGBmaWxlc2BgLCBvciByZW1vdmVzIHNvbWUgZmlsZXMgZnJvbSBgYGZpbGVzYGAuCgogICAgICAgIDpwYXJhbSBkaXJlY3RpdmU6IFRoZSBkaXJlY3RpdmUgdG8gcHJvY2Vzcy4gVGhpcyBzaG91bGQgYmUgaW4gYSBmb3JtYXQKICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJsZSB3aXRoIGRpc3R1dGlscyBgYE1BTklGRVNULmluYGAgZmlsZXM6CgogICAgICAgICAgICAgICAgICAgICBodHRwOi8vZG9jcy5weXRob24ub3JnL2Rpc3R1dGlscy9zb3VyY2VkaXN0Lmh0bWwjY29tbWFuZHMKICAgICAgICAiIiIKICAgICAgICAjIFBhcnNlIHRoZSBsaW5lOiBzcGxpdCBpdCB1cCwgbWFrZSBzdXJlIHRoZSByaWdodCBudW1iZXIgb2Ygd29yZHMKICAgICAgICAjIGlzIHRoZXJlLCBhbmQgcmV0dXJuIHRoZSByZWxldmFudCB3b3Jkcy4gICdhY3Rpb24nIGlzIGFsd2F5cwogICAgICAgICMgZGVmaW5lZDogaXQncyB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgbGluZS4gIFdoaWNoIG9mIHRoZSBvdGhlcgogICAgICAgICMgdGhyZWUgYXJlIGRlZmluZWQgZGVwZW5kcyBvbiB0aGUgYWN0aW9uOyBpdCdsbCBiZSBlaXRoZXIKICAgICAgICAjIHBhdHRlcm5zLCAoZGlyIGFuZCBwYXR0ZXJucyksIG9yIChkaXJwYXR0ZXJuKS4KICAgICAgICBhY3Rpb24sIHBhdHRlcm5zLCB0aGVkaXIsIGRpcnBhdHRlcm4gPSBzZWxmLl9wYXJzZV9kaXJlY3RpdmUoZGlyZWN0aXZlKQoKICAgICAgICAjIE9LLCBub3cgd2Uga25vdyB0aGF0IHRoZSBhY3Rpb24gaXMgdmFsaWQgYW5kIHdlIGhhdmUgdGhlCiAgICAgICAgIyByaWdodCBudW1iZXIgb2Ygd29yZHMgb24gdGhlIGxpbmUgZm9yIHRoYXQgYWN0aW9uIC0tIHNvIHdlCiAgICAgICAgIyBjYW4gcHJvY2VlZCB3aXRoIG1pbmltYWwgZXJyb3ItY2hlY2tpbmcuCiAgICAgICAgaWYgYWN0aW9uID09ICdpbmNsdWRlJzoKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5faW5jbHVkZV9wYXR0ZXJuKHBhdHRlcm4sIGFuY2hvcj1UcnVlKToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnbm8gZmlsZXMgZm91bmQgbWF0Y2hpbmcgJXInLCBwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAnZXhjbHVkZSc6CiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgZm91bmQgPSBzZWxmLl9leGNsdWRlX3BhdHRlcm4ocGF0dGVybiwgYW5jaG9yPVRydWUpCiAgICAgICAgICAgICAgICAjaWYgbm90IGZvdW5kOgogICAgICAgICAgICAgICAgIyAgICBsb2dnZXIud2FybmluZygnbm8gcHJldmlvdXNseS1pbmNsdWRlZCBmaWxlcyAnCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICdmb3VuZCBtYXRjaGluZyAlcicsIHBhdHRlcm4pCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdnbG9iYWwtaW5jbHVkZSc6CiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX2luY2x1ZGVfcGF0dGVybihwYXR0ZXJuLCBhbmNob3I9RmFsc2UpOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdubyBmaWxlcyBmb3VuZCBtYXRjaGluZyAlciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FueXdoZXJlIGluIGRpc3RyaWJ1dGlvbicsIHBhdHRlcm4pCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdnbG9iYWwtZXhjbHVkZSc6CiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgZm91bmQgPSBzZWxmLl9leGNsdWRlX3BhdHRlcm4ocGF0dGVybiwgYW5jaG9yPUZhbHNlKQogICAgICAgICAgICAgICAgI2lmIG5vdCBmb3VuZDoKICAgICAgICAgICAgICAgICMgICAgbG9nZ2VyLndhcm5pbmcoJ25vIHByZXZpb3VzbHktaW5jbHVkZWQgZmlsZXMgJwogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAnbWF0Y2hpbmcgJXIgZm91bmQgYW55d2hlcmUgaW4gJwogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAnZGlzdHJpYnV0aW9uJywgcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ3JlY3Vyc2l2ZS1pbmNsdWRlJzoKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5faW5jbHVkZV9wYXR0ZXJuKHBhdHRlcm4sIHByZWZpeD10aGVkaXIpOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdubyBmaWxlcyBmb3VuZCBtYXRjaGluZyAlciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVyIGRpcmVjdG9yeSAlcicsIHBhdHRlcm4sIHRoZWRpcikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ3JlY3Vyc2l2ZS1leGNsdWRlJzoKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBmb3VuZCA9IHNlbGYuX2V4Y2x1ZGVfcGF0dGVybihwYXR0ZXJuLCBwcmVmaXg9dGhlZGlyKQogICAgICAgICAgICAgICAgI2lmIG5vdCBmb3VuZDoKICAgICAgICAgICAgICAgICMgICAgbG9nZ2VyLndhcm5pbmcoJ25vIHByZXZpb3VzbHktaW5jbHVkZWQgZmlsZXMgJwogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAnbWF0Y2hpbmcgJXIgZm91bmQgdW5kZXIgZGlyZWN0b3J5ICVyJywKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgcGF0dGVybiwgdGhlZGlyKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAnZ3JhZnQnOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5faW5jbHVkZV9wYXR0ZXJuKE5vbmUsIHByZWZpeD1kaXJwYXR0ZXJuKToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdubyBkaXJlY3RvcmllcyBmb3VuZCBtYXRjaGluZyAlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAncHJ1bmUnOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5fZXhjbHVkZV9wYXR0ZXJuKE5vbmUsIHByZWZpeD1kaXJwYXR0ZXJuKToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdubyBwcmV2aW91c2x5LWluY2x1ZGVkIGRpcmVjdG9yaWVzIGZvdW5kICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXRjaGluZyAlcicsIGRpcnBhdHRlcm4pCiAgICAgICAgZWxzZTogICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIGFzIGl0IHNob3VsZCBiZSBjYXVnaHQgaW4KICAgICAgICAgICAgIyBfcGFyc2VfdGVtcGxhdGVfbGluZQogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgJ2ludmFsaWQgYWN0aW9uICVyJyAlIGFjdGlvbikKCiAgICAjCiAgICAjIFByaXZhdGUgQVBJCiAgICAjCgogICAgZGVmIF9wYXJzZV9kaXJlY3RpdmUoc2VsZiwgZGlyZWN0aXZlKToKICAgICAgICAiIiIKICAgICAgICBWYWxpZGF0ZSBhIGRpcmVjdGl2ZS4KICAgICAgICA6cGFyYW0gZGlyZWN0aXZlOiBUaGUgZGlyZWN0aXZlIHRvIHZhbGlkYXRlLgogICAgICAgIDpyZXR1cm46IEEgdHVwbGUgb2YgYWN0aW9uLCBwYXR0ZXJucywgdGhlZGlyLCBkaXJfcGF0dGVybnMKICAgICAgICAiIiIKICAgICAgICB3b3JkcyA9IGRpcmVjdGl2ZS5zcGxpdCgpCiAgICAgICAgaWYgbGVuKHdvcmRzKSA9PSAxIGFuZCB3b3Jkc1swXSBub3QgaW4gKCdpbmNsdWRlJywgJ2V4Y2x1ZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2xvYmFsLWluY2x1ZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2xvYmFsLWV4Y2x1ZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVjdXJzaXZlLWluY2x1ZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVjdXJzaXZlLWV4Y2x1ZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ3JhZnQnLCAncHJ1bmUnKToKICAgICAgICAgICAgIyBubyBhY3Rpb24gZ2l2ZW4sIGxldCdzIHVzZSB0aGUgZGVmYXVsdCAnaW5jbHVkZScKICAgICAgICAgICAgd29yZHMuaW5zZXJ0KDAsICdpbmNsdWRlJykKCiAgICAgICAgYWN0aW9uID0gd29yZHNbMF0KICAgICAgICBwYXR0ZXJucyA9IHRoZWRpciA9IGRpcl9wYXR0ZXJuID0gTm9uZQoKICAgICAgICBpZiBhY3Rpb24gaW4gKCdpbmNsdWRlJywgJ2V4Y2x1ZGUnLAogICAgICAgICAgICAgICAgICAgICAgJ2dsb2JhbC1pbmNsdWRlJywgJ2dsb2JhbC1leGNsdWRlJyk6CiAgICAgICAgICAgIGlmIGxlbih3b3JkcykgPCAyOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAnJXIgZXhwZWN0cyA8cGF0dGVybjE+IDxwYXR0ZXJuMj4gLi4uJyAlIGFjdGlvbikKCiAgICAgICAgICAgIHBhdHRlcm5zID0gW2NvbnZlcnRfcGF0aCh3b3JkKSBmb3Igd29yZCBpbiB3b3Jkc1sxOl1dCgogICAgICAgIGVsaWYgYWN0aW9uIGluICgncmVjdXJzaXZlLWluY2x1ZGUnLCAncmVjdXJzaXZlLWV4Y2x1ZGUnKToKICAgICAgICAgICAgaWYgbGVuKHdvcmRzKSA8IDM6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICclciBleHBlY3RzIDxkaXI+IDxwYXR0ZXJuMT4gPHBhdHRlcm4yPiAuLi4nICUgYWN0aW9uKQoKICAgICAgICAgICAgdGhlZGlyID0gY29udmVydF9wYXRoKHdvcmRzWzFdKQogICAgICAgICAgICBwYXR0ZXJucyA9IFtjb252ZXJ0X3BhdGgod29yZCkgZm9yIHdvcmQgaW4gd29yZHNbMjpdXQoKICAgICAgICBlbGlmIGFjdGlvbiBpbiAoJ2dyYWZ0JywgJ3BydW5lJyk6CiAgICAgICAgICAgIGlmIGxlbih3b3JkcykgIT0gMjoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgJyVyIGV4cGVjdHMgYSBzaW5nbGUgPGRpcl9wYXR0ZXJuPicgJSBhY3Rpb24pCgogICAgICAgICAgICBkaXJfcGF0dGVybiA9IGNvbnZlcnRfcGF0aCh3b3Jkc1sxXSkKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigndW5rbm93biBhY3Rpb24gJXInICUgYWN0aW9uKQoKICAgICAgICByZXR1cm4gYWN0aW9uLCBwYXR0ZXJucywgdGhlZGlyLCBkaXJfcGF0dGVybgoKICAgIGRlZiBfaW5jbHVkZV9wYXR0ZXJuKHNlbGYsIHBhdHRlcm4sIGFuY2hvcj1UcnVlLCBwcmVmaXg9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JlZ2V4PUZhbHNlKToKICAgICAgICAiIiJTZWxlY3Qgc3RyaW5ncyAocHJlc3VtYWJseSBmaWxlbmFtZXMpIGZyb20gJ3NlbGYuZmlsZXMnIHRoYXQKICAgICAgICBtYXRjaCAncGF0dGVybicsIGEgVW5peC1zdHlsZSB3aWxkY2FyZCAoZ2xvYikgcGF0dGVybi4KCiAgICAgICAgUGF0dGVybnMgYXJlIG5vdCBxdWl0ZSB0aGUgc2FtZSBhcyBpbXBsZW1lbnRlZCBieSB0aGUgJ2ZubWF0Y2gnCiAgICAgICAgbW9kdWxlOiAnKicgYW5kICc/JyAgbWF0Y2ggbm9uLXNwZWNpYWwgY2hhcmFjdGVycywgd2hlcmUgInNwZWNpYWwiCiAgICAgICAgaXMgcGxhdGZvcm0tZGVwZW5kZW50OiBzbGFzaCBvbiBVbml4OyBjb2xvbiwgc2xhc2gsIGFuZCBiYWNrc2xhc2ggb24KICAgICAgICBET1MvV2luZG93czsgYW5kIGNvbG9uIG9uIE1hYyBPUy4KCiAgICAgICAgSWYgJ2FuY2hvcicgaXMgdHJ1ZSAodGhlIGRlZmF1bHQpLCB0aGVuIHRoZSBwYXR0ZXJuIG1hdGNoIGlzIG1vcmUKICAgICAgICBzdHJpbmdlbnQ6ICIqLnB5IiB3aWxsIG1hdGNoICJmb28ucHkiIGJ1dCBub3QgImZvby9iYXIucHkiLiAgSWYKICAgICAgICAnYW5jaG9yJyBpcyBmYWxzZSwgYm90aCBvZiB0aGVzZSB3aWxsIG1hdGNoLgoKICAgICAgICBJZiAncHJlZml4JyBpcyBzdXBwbGllZCwgdGhlbiBvbmx5IGZpbGVuYW1lcyBzdGFydGluZyB3aXRoICdwcmVmaXgnCiAgICAgICAgKGl0c2VsZiBhIHBhdHRlcm4pIGFuZCBlbmRpbmcgd2l0aCAncGF0dGVybicsIHdpdGggYW55dGhpbmcgaW4gYmV0d2VlbgogICAgICAgIHRoZW0sIHdpbGwgbWF0Y2guICAnYW5jaG9yJyBpcyBpZ25vcmVkIGluIHRoaXMgY2FzZS4KCiAgICAgICAgSWYgJ2lzX3JlZ2V4JyBpcyB0cnVlLCAnYW5jaG9yJyBhbmQgJ3ByZWZpeCcgYXJlIGlnbm9yZWQsIGFuZAogICAgICAgICdwYXR0ZXJuJyBpcyBhc3N1bWVkIHRvIGJlIGVpdGhlciBhIHN0cmluZyBjb250YWluaW5nIGEgcmVnZXggb3IgYQogICAgICAgIHJlZ2V4IG9iamVjdCAtLSBubyB0cmFuc2xhdGlvbiBpcyBkb25lLCB0aGUgcmVnZXggaXMganVzdCBjb21waWxlZAogICAgICAgIGFuZCB1c2VkIGFzLWlzLgoKICAgICAgICBTZWxlY3RlZCBzdHJpbmdzIHdpbGwgYmUgYWRkZWQgdG8gc2VsZi5maWxlcy4KCiAgICAgICAgUmV0dXJuIFRydWUgaWYgZmlsZXMgYXJlIGZvdW5kLgogICAgICAgICIiIgogICAgICAgICMgWFhYIGRvY3N0cmluZyBseWluZyBhYm91dCB3aGF0IHRoZSBzcGVjaWFsIGNoYXJzIGFyZT8KICAgICAgICBmb3VuZCA9IEZhbHNlCiAgICAgICAgcGF0dGVybl9yZSA9IHNlbGYuX3RyYW5zbGF0ZV9wYXR0ZXJuKHBhdHRlcm4sIGFuY2hvciwgcHJlZml4LCBpc19yZWdleCkKCiAgICAgICAgIyBkZWxheWVkIGxvYWRpbmcgb2YgYWxsZmlsZXMgbGlzdAogICAgICAgIGlmIHNlbGYuYWxsZmlsZXMgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5maW5kYWxsKCkKCiAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5hbGxmaWxlczoKICAgICAgICAgICAgaWYgcGF0dGVybl9yZS5zZWFyY2gobmFtZSk6CiAgICAgICAgICAgICAgICBzZWxmLmZpbGVzLmFkZChuYW1lKQogICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlCiAgICAgICAgcmV0dXJuIGZvdW5kCgogICAgZGVmIF9leGNsdWRlX3BhdHRlcm4oc2VsZiwgcGF0dGVybiwgYW5jaG9yPVRydWUsIHByZWZpeD1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVnZXg9RmFsc2UpOgogICAgICAgICIiIlJlbW92ZSBzdHJpbmdzIChwcmVzdW1hYmx5IGZpbGVuYW1lcykgZnJvbSAnZmlsZXMnIHRoYXQgbWF0Y2gKICAgICAgICAncGF0dGVybicuCgogICAgICAgIE90aGVyIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lIGFzIGZvciAnaW5jbHVkZV9wYXR0ZXJuKCknLCBhYm92ZS4KICAgICAgICBUaGUgbGlzdCAnc2VsZi5maWxlcycgaXMgbW9kaWZpZWQgaW4gcGxhY2UuIFJldHVybiBUcnVlIGlmIGZpbGVzIGFyZQogICAgICAgIGZvdW5kLgoKICAgICAgICBUaGlzIEFQSSBpcyBwdWJsaWMgdG8gYWxsb3cgZS5nLiBleGNsdXNpb24gb2YgU0NNIHN1YmRpcnMsIGUuZy4gd2hlbgogICAgICAgIHBhY2thZ2luZyBzb3VyY2UgZGlzdHJpYnV0aW9ucwogICAgICAgICIiIgogICAgICAgIGZvdW5kID0gRmFsc2UKICAgICAgICBwYXR0ZXJuX3JlID0gc2VsZi5fdHJhbnNsYXRlX3BhdHRlcm4ocGF0dGVybiwgYW5jaG9yLCBwcmVmaXgsIGlzX3JlZ2V4KQogICAgICAgIGZvciBmIGluIGxpc3Qoc2VsZi5maWxlcyk6CiAgICAgICAgICAgIGlmIHBhdHRlcm5fcmUuc2VhcmNoKGYpOgogICAgICAgICAgICAgICAgc2VsZi5maWxlcy5yZW1vdmUoZikKICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQogICAgICAgIHJldHVybiBmb3VuZAoKICAgIGRlZiBfdHJhbnNsYXRlX3BhdHRlcm4oc2VsZiwgcGF0dGVybiwgYW5jaG9yPVRydWUsIHByZWZpeD1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZWdleD1GYWxzZSk6CiAgICAgICAgIiIiVHJhbnNsYXRlIGEgc2hlbGwtbGlrZSB3aWxkY2FyZCBwYXR0ZXJuIHRvIGEgY29tcGlsZWQgcmVndWxhcgogICAgICAgIGV4cHJlc3Npb24uCgogICAgICAgIFJldHVybiB0aGUgY29tcGlsZWQgcmVnZXguICBJZiAnaXNfcmVnZXgnIHRydWUsCiAgICAgICAgdGhlbiAncGF0dGVybicgaXMgZGlyZWN0bHkgY29tcGlsZWQgdG8gYSByZWdleCAoaWYgaXQncyBhIHN0cmluZykKICAgICAgICBvciBqdXN0IHJldHVybmVkIGFzLWlzIChhc3N1bWVzIGl0J3MgYSByZWdleCBvYmplY3QpLgogICAgICAgICIiIgogICAgICAgIGlmIGlzX3JlZ2V4OgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBhdHRlcm4sIHN0cik6CiAgICAgICAgICAgICAgICByZXR1cm4gcmUuY29tcGlsZShwYXR0ZXJuKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm4KCiAgICAgICAgaWYgX1BZVEhPTl9WRVJTSU9OID4gKDMsIDIpOgogICAgICAgICAgICAjIGRpdGNoIHN0YXJ0IGFuZCBlbmQgY2hhcmFjdGVycwogICAgICAgICAgICBzdGFydCwgXywgZW5kID0gc2VsZi5fZ2xvYl90b19yZSgnXycpLnBhcnRpdGlvbignXycpCgogICAgICAgIGlmIHBhdHRlcm46CiAgICAgICAgICAgIHBhdHRlcm5fcmUgPSBzZWxmLl9nbG9iX3RvX3JlKHBhdHRlcm4pCiAgICAgICAgICAgIGlmIF9QWVRIT05fVkVSU0lPTiA+ICgzLCAyKToKICAgICAgICAgICAgICAgIGFzc2VydCBwYXR0ZXJuX3JlLnN0YXJ0c3dpdGgoc3RhcnQpIGFuZCBwYXR0ZXJuX3JlLmVuZHN3aXRoKGVuZCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXR0ZXJuX3JlID0gJycKCiAgICAgICAgYmFzZSA9IHJlLmVzY2FwZShvcy5wYXRoLmpvaW4oc2VsZi5iYXNlLCAnJykpCiAgICAgICAgaWYgcHJlZml4IGlzIG5vdCBOb25lOgogICAgICAgICAgICAjIGRpdGNoIGVuZCBvZiBwYXR0ZXJuIGNoYXJhY3RlcgogICAgICAgICAgICBpZiBfUFlUSE9OX1ZFUlNJT04gPD0gKDMsIDIpOgogICAgICAgICAgICAgICAgZW1wdHlfcGF0dGVybiA9IHNlbGYuX2dsb2JfdG9fcmUoJycpCiAgICAgICAgICAgICAgICBwcmVmaXhfcmUgPSBzZWxmLl9nbG9iX3RvX3JlKHByZWZpeClbOi1sZW4oZW1wdHlfcGF0dGVybildCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmVmaXhfcmUgPSBzZWxmLl9nbG9iX3RvX3JlKHByZWZpeCkKICAgICAgICAgICAgICAgIGFzc2VydCBwcmVmaXhfcmUuc3RhcnRzd2l0aChzdGFydCkgYW5kIHByZWZpeF9yZS5lbmRzd2l0aChlbmQpCiAgICAgICAgICAgICAgICBwcmVmaXhfcmUgPSBwcmVmaXhfcmVbbGVuKHN0YXJ0KTogbGVuKHByZWZpeF9yZSkgLSBsZW4oZW5kKV0KICAgICAgICAgICAgc2VwID0gb3Muc2VwCiAgICAgICAgICAgIGlmIG9zLnNlcCA9PSAnXFwnOgogICAgICAgICAgICAgICAgc2VwID0gcidcXCcKICAgICAgICAgICAgaWYgX1BZVEhPTl9WRVJTSU9OIDw9ICgzLCAyKToKICAgICAgICAgICAgICAgIHBhdHRlcm5fcmUgPSAnXicgKyBiYXNlICsgc2VwLmpvaW4oKHByZWZpeF9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuKicgKyBwYXR0ZXJuX3JlKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdHRlcm5fcmUgPSBwYXR0ZXJuX3JlW2xlbihzdGFydCk6IGxlbihwYXR0ZXJuX3JlKSAtIGxlbihlbmQpXQogICAgICAgICAgICAgICAgcGF0dGVybl9yZSA9IHInJXMlcyVzJXMuKiVzJXMnICUgKHN0YXJ0LCBiYXNlLCBwcmVmaXhfcmUsIHNlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuX3JlLCBlbmQpCiAgICAgICAgZWxzZTogICMgbm8gcHJlZml4IC0tIHJlc3BlY3QgYW5jaG9yIGZsYWcKICAgICAgICAgICAgaWYgYW5jaG9yOgogICAgICAgICAgICAgICAgaWYgX1BZVEhPTl9WRVJTSU9OIDw9ICgzLCAyKToKICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuX3JlID0gJ14nICsgYmFzZSArIHBhdHRlcm5fcmUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcGF0dGVybl9yZSA9IHInJXMlcyVzJyAlIChzdGFydCwgYmFzZSwgcGF0dGVybl9yZVtsZW4oc3RhcnQpOl0pCgogICAgICAgIHJldHVybiByZS5jb21waWxlKHBhdHRlcm5fcmUpCgogICAgZGVmIF9nbG9iX3RvX3JlKHNlbGYsIHBhdHRlcm4pOgogICAgICAgICIiIlRyYW5zbGF0ZSBhIHNoZWxsLWxpa2UgZ2xvYiBwYXR0ZXJuIHRvIGEgcmVndWxhciBleHByZXNzaW9uLgoKICAgICAgICBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcmVnZXguICBEaWZmZXJzIGZyb20KICAgICAgICAnZm5tYXRjaC50cmFuc2xhdGUoKScgaW4gdGhhdCAnKicgZG9lcyBub3QgbWF0Y2ggInNwZWNpYWwgY2hhcmFjdGVycyIKICAgICAgICAod2hpY2ggYXJlIHBsYXRmb3JtLXNwZWNpZmljKS4KICAgICAgICAiIiIKICAgICAgICBwYXR0ZXJuX3JlID0gZm5tYXRjaC50cmFuc2xhdGUocGF0dGVybikKCiAgICAgICAgIyAnPycgYW5kICcqJyBpbiB0aGUgZ2xvYiBwYXR0ZXJuIGJlY29tZSAnLicgYW5kICcuKicgaW4gdGhlIFJFLCB3aGljaAogICAgICAgICMgSU1ITyBpcyB3cm9uZyAtLSAnPycgYW5kICcqJyBhcmVuJ3Qgc3VwcG9zZWQgdG8gbWF0Y2ggc2xhc2ggaW4gVW5peCwKICAgICAgICAjIGFuZCBieSBleHRlbnNpb24gdGhleSBzaG91bGRuJ3QgbWF0Y2ggc3VjaCAic3BlY2lhbCBjaGFyYWN0ZXJzIiB1bmRlcgogICAgICAgICMgYW55IE9TLiAgU28gY2hhbmdlIGFsbCBub24tZXNjYXBlZCBkb3RzIGluIHRoZSBSRSB0byBtYXRjaCBhbnkKICAgICAgICAjIGNoYXJhY3RlciBleGNlcHQgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyAoY3VycmVudGx5OiBqdXN0IG9zLnNlcCkuCiAgICAgICAgc2VwID0gb3Muc2VwCiAgICAgICAgaWYgb3Muc2VwID09ICdcXCc6CiAgICAgICAgICAgICMgd2UncmUgdXNpbmcgYSByZWdleCB0byBtYW5pcHVsYXRlIGEgcmVnZXgsIHNvIHdlIG5lZWQKICAgICAgICAgICAgIyB0byBlc2NhcGUgdGhlIGJhY2tzbGFzaCB0d2ljZQogICAgICAgICAgICBzZXAgPSByJ1xcXFwnCiAgICAgICAgZXNjYXBlZCA9IHInXDFbXiVzXScgJSBzZXAKICAgICAgICBwYXR0ZXJuX3JlID0gcmUuc3ViKHInKCg/PCFcXCkoXFxcXCkqKVwuJywgZXNjYXBlZCwgcGF0dGVybl9yZSkKICAgICAgICByZXR1cm4gcGF0dGVybl9yZQpQSwMEFAAAAAAAAAAhAD0RrgKKGAAAihgAAC4AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9tYXJrZXJzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIFZpbmF5IFNhamlwLgojIExpY2Vuc2VkIHRvIHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciBhIGNvbnRyaWJ1dG9yIGFncmVlbWVudC4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKIiIiUGFyc2VyIGZvciB0aGUgZW52aXJvbm1lbnQgbWFya2VycyBtaWNyby1sYW5ndWFnZSBkZWZpbmVkIGluIFBFUCAzNDUuIiIiCgppbXBvcnQgYXN0CmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBwbGF0Zm9ybQoKZnJvbSAuY29tcGF0IGltcG9ydCBweXRob25faW1wbGVtZW50YXRpb24sIHN0cmluZ190eXBlcwpmcm9tIC51dGlsIGltcG9ydCBpbl92ZW52CgpfX2FsbF9fID0gWydpbnRlcnByZXQnXQoKCmNsYXNzIEV2YWx1YXRvcihvYmplY3QpOgogICAgIiIiCiAgICBBIGxpbWl0ZWQgZXZhbHVhdG9yIGZvciBQeXRob24gZXhwcmVzc2lvbnMuCiAgICAiIiIKCiAgICBvcGVyYXRvcnMgPSB7CiAgICAgICAgJ2VxJzogbGFtYmRhIHgsIHk6IHggPT0geSwKICAgICAgICAnZ3QnOiBsYW1iZGEgeCwgeTogeCA+IHksCiAgICAgICAgJ2d0ZSc6IGxhbWJkYSB4LCB5OiB4ID49IHksCiAgICAgICAgJ2luJzogbGFtYmRhIHgsIHk6IHggaW4geSwKICAgICAgICAnbHQnOiBsYW1iZGEgeCwgeTogeCA8IHksCiAgICAgICAgJ2x0ZSc6IGxhbWJkYSB4LCB5OiB4IDw9IHksCiAgICAgICAgJ25vdCc6IGxhbWJkYSB4OiBub3QgeCwKICAgICAgICAnbm90ZXEnOiBsYW1iZGEgeCwgeTogeCAhPSB5LAogICAgICAgICdub3Rpbic6IGxhbWJkYSB4LCB5OiB4IG5vdCBpbiB5LAogICAgfQoKICAgIGFsbG93ZWRfdmFsdWVzID0gewogICAgICAgICdzeXNfcGxhdGZvcm0nOiBzeXMucGxhdGZvcm0sCiAgICAgICAgJ3B5dGhvbl92ZXJzaW9uJzogJyVzLiVzJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdLAogICAgICAgICMgcGFyc2luZyBzeXMucGxhdGZvcm0gaXMgbm90IHJlbGlhYmxlLCBidXQgdGhlcmUgaXMgbm8gb3RoZXIKICAgICAgICAjIHdheSB0byBnZXQgZS5nLiAyLjcuMissIGFuZCB0aGUgUEVQIGlzIGRlZmluZWQgd2l0aCBzeXMudmVyc2lvbgogICAgICAgICdweXRob25fZnVsbF92ZXJzaW9uJzogc3lzLnZlcnNpb24uc3BsaXQoJyAnLCAxKVswXSwKICAgICAgICAnb3NfbmFtZSc6IG9zLm5hbWUsCiAgICAgICAgJ3BsYXRmb3JtX2luX3ZlbnYnOiBzdHIoaW5fdmVudigpKSwKICAgICAgICAncGxhdGZvcm1fcmVsZWFzZSc6IHBsYXRmb3JtLnJlbGVhc2UoKSwKICAgICAgICAncGxhdGZvcm1fdmVyc2lvbic6IHBsYXRmb3JtLnZlcnNpb24oKSwKICAgICAgICAncGxhdGZvcm1fbWFjaGluZSc6IHBsYXRmb3JtLm1hY2hpbmUoKSwKICAgICAgICAncGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uJzogcHl0aG9uX2ltcGxlbWVudGF0aW9uKCksCiAgICB9CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbnRleHQ9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KCiAgICAgICAgOnBhcmFtIGNvbnRleHQ6IElmIHNwZWNpZmllZCwgbmFtZXMgYXJlIGxvb2tlZCB1cCBpbiB0aGlzIG1hcHBpbmcuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jb250ZXh0ID0gY29udGV4dCBvciB7fQogICAgICAgIHNlbGYuc291cmNlID0gTm9uZQoKICAgIGRlZiBnZXRfZnJhZ21lbnQoc2VsZiwgb2Zmc2V0KToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIHBhcnQgb2YgdGhlIHNvdXJjZSB3aGljaCBpcyBjYXVzaW5nIGEgcHJvYmxlbS4KICAgICAgICAiIiIKICAgICAgICBmcmFnbWVudF9sZW4gPSAxMAogICAgICAgIHMgPSAnJXInICUgKHNlbGYuc291cmNlW29mZnNldDpvZmZzZXQgKyBmcmFnbWVudF9sZW5dKQogICAgICAgIGlmIG9mZnNldCArIGZyYWdtZW50X2xlbiA8IGxlbihzZWxmLnNvdXJjZSk6CiAgICAgICAgICAgIHMgKz0gJy4uLicKICAgICAgICByZXR1cm4gcwoKICAgIGRlZiBnZXRfaGFuZGxlcihzZWxmLCBub2RlX3R5cGUpOgogICAgICAgICIiIgogICAgICAgIEdldCBhIGhhbmRsZXIgZm9yIHRoZSBzcGVjaWZpZWQgQVNUIG5vZGUgdHlwZS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCAnZG9fJXMnICUgbm9kZV90eXBlLCBOb25lKQoKICAgIGRlZiBldmFsdWF0ZShzZWxmLCBub2RlLCBmaWxlbmFtZT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBFdmFsdWF0ZSBhIHNvdXJjZSBzdHJpbmcgb3Igbm9kZSwgdXNpbmcgYGBmaWxlbmFtZWBgIHdoZW4KICAgICAgICBkaXNwbGF5aW5nIGVycm9ycy4KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHNlbGYuc291cmNlID0gbm9kZQogICAgICAgICAgICBrd2FyZ3MgPSB7J21vZGUnOiAnZXZhbCd9CiAgICAgICAgICAgIGlmIGZpbGVuYW1lOgogICAgICAgICAgICAgICAga3dhcmdzWydmaWxlbmFtZSddID0gZmlsZW5hbWUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbm9kZSA9IGFzdC5wYXJzZShub2RlLCAqKmt3YXJncykKICAgICAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICBzID0gc2VsZi5nZXRfZnJhZ21lbnQoZS5vZmZzZXQpCiAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcignc3ludGF4IGVycm9yICVzJyAlIHMpCiAgICAgICAgbm9kZV90eXBlID0gbm9kZS5fX2NsYXNzX18uX19uYW1lX18ubG93ZXIoKQogICAgICAgIGhhbmRsZXIgPSBzZWxmLmdldF9oYW5kbGVyKG5vZGVfdHlwZSkKICAgICAgICBpZiBoYW5kbGVyIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIHNlbGYuc291cmNlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzID0gJyhzb3VyY2Ugbm90IGF2YWlsYWJsZSknCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzID0gc2VsZi5nZXRfZnJhZ21lbnQobm9kZS5jb2xfb2Zmc2V0KQogICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigiZG9uJ3Qga25vdyBob3cgdG8gZXZhbHVhdGUgJXIgJXMiICUgKAogICAgICAgICAgICAgICAgbm9kZV90eXBlLCBzKSkKICAgICAgICByZXR1cm4gaGFuZGxlcihub2RlKQoKICAgIGRlZiBnZXRfYXR0cl9rZXkoc2VsZiwgbm9kZSk6CiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uobm9kZSwgYXN0LkF0dHJpYnV0ZSksICdhdHRyaWJ1dGUgbm9kZSBleHBlY3RlZCcKICAgICAgICByZXR1cm4gJyVzLiVzJyAlIChub2RlLnZhbHVlLmlkLCBub2RlLmF0dHIpCgogICAgZGVmIGRvX2F0dHJpYnV0ZShzZWxmLCBub2RlKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLnZhbHVlLCBhc3QuTmFtZSk6CiAgICAgICAgICAgIHZhbGlkID0gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICBrZXkgPSBzZWxmLmdldF9hdHRyX2tleShub2RlKQogICAgICAgICAgICB2YWxpZCA9IGtleSBpbiBzZWxmLmNvbnRleHQgb3Iga2V5IGluIHNlbGYuYWxsb3dlZF92YWx1ZXMKICAgICAgICBpZiBub3QgdmFsaWQ6CiAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCdpbnZhbGlkIGV4cHJlc3Npb246ICVzJyAlIGtleSkKICAgICAgICBpZiBrZXkgaW4gc2VsZi5jb250ZXh0OgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbnRleHRba2V5XQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuYWxsb3dlZF92YWx1ZXNba2V5XQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZG9fYm9vbG9wKHNlbGYsIG5vZGUpOgogICAgICAgIHJlc3VsdCA9IHNlbGYuZXZhbHVhdGUobm9kZS52YWx1ZXNbMF0pCiAgICAgICAgaXNfb3IgPSBub2RlLm9wLl9fY2xhc3NfXyBpcyBhc3QuT3IKICAgICAgICBpc19hbmQgPSBub2RlLm9wLl9fY2xhc3NfXyBpcyBhc3QuQW5kCiAgICAgICAgYXNzZXJ0IGlzX29yIG9yIGlzX2FuZAogICAgICAgIGlmIChpc19hbmQgYW5kIHJlc3VsdCkgb3IgKGlzX29yIGFuZCBub3QgcmVzdWx0KToKICAgICAgICAgICAgZm9yIG4gaW4gbm9kZS52YWx1ZXNbMTpdOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5ldmFsdWF0ZShuKQogICAgICAgICAgICAgICAgaWYgKGlzX29yIGFuZCByZXN1bHQpIG9yIChpc19hbmQgYW5kIG5vdCByZXN1bHQpOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBkb19jb21wYXJlKHNlbGYsIG5vZGUpOgogICAgICAgIGRlZiBzYW5pdHlfY2hlY2sobGhzbm9kZSwgcmhzbm9kZSk6CiAgICAgICAgICAgIHZhbGlkID0gVHJ1ZQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGxoc25vZGUsIGFzdC5TdHIpIGFuZCBpc2luc3RhbmNlKHJoc25vZGUsIGFzdC5TdHIpOgogICAgICAgICAgICAgICAgdmFsaWQgPSBGYWxzZQogICAgICAgICAgICAjZWxpZiAoaXNpbnN0YW5jZShsaHNub2RlLCBhc3QuQXR0cmlidXRlKQogICAgICAgICAgICAjICAgICAgYW5kIGlzaW5zdGFuY2Uocmhzbm9kZSwgYXN0LkF0dHJpYnV0ZSkpOgogICAgICAgICAgICAjICAgIGtsaHMgPSBzZWxmLmdldF9hdHRyX2tleShsaHNub2RlKQogICAgICAgICAgICAjICAgIGtyaHMgPSBzZWxmLmdldF9hdHRyX2tleShyaHNub2RlKQogICAgICAgICAgICAjICAgIHZhbGlkID0ga2xocyAhPSBrcmhzCiAgICAgICAgICAgIGlmIG5vdCB2YWxpZDoKICAgICAgICAgICAgICAgIHMgPSBzZWxmLmdldF9mcmFnbWVudChub2RlLmNvbF9vZmZzZXQpCiAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcignSW52YWxpZCBjb21wYXJpc29uOiAlcycgJSBzKQoKICAgICAgICBsaHNub2RlID0gbm9kZS5sZWZ0CiAgICAgICAgbGhzID0gc2VsZi5ldmFsdWF0ZShsaHNub2RlKQogICAgICAgIHJlc3VsdCA9IFRydWUKICAgICAgICBmb3Igb3AsIHJoc25vZGUgaW4gemlwKG5vZGUub3BzLCBub2RlLmNvbXBhcmF0b3JzKToKICAgICAgICAgICAgc2FuaXR5X2NoZWNrKGxoc25vZGUsIHJoc25vZGUpCiAgICAgICAgICAgIG9wID0gb3AuX19jbGFzc19fLl9fbmFtZV9fLmxvd2VyKCkKICAgICAgICAgICAgaWYgb3Agbm90IGluIHNlbGYub3BlcmF0b3JzOgogICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoJ3Vuc3VwcG9ydGVkIG9wZXJhdGlvbjogJXInICUgb3ApCiAgICAgICAgICAgIHJocyA9IHNlbGYuZXZhbHVhdGUocmhzbm9kZSkKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5vcGVyYXRvcnNbb3BdKGxocywgcmhzKQogICAgICAgICAgICBpZiBub3QgcmVzdWx0OgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgbGhzID0gcmhzCiAgICAgICAgICAgIGxoc25vZGUgPSByaHNub2RlCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBkb19leHByZXNzaW9uKHNlbGYsIG5vZGUpOgogICAgICAgIHJldHVybiBzZWxmLmV2YWx1YXRlKG5vZGUuYm9keSkKCiAgICBkZWYgZG9fbmFtZShzZWxmLCBub2RlKToKICAgICAgICB2YWxpZCA9IEZhbHNlCiAgICAgICAgaWYgbm9kZS5pZCBpbiBzZWxmLmNvbnRleHQ6CiAgICAgICAgICAgIHZhbGlkID0gVHJ1ZQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbnRleHRbbm9kZS5pZF0KICAgICAgICBlbGlmIG5vZGUuaWQgaW4gc2VsZi5hbGxvd2VkX3ZhbHVlczoKICAgICAgICAgICAgdmFsaWQgPSBUcnVlCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuYWxsb3dlZF92YWx1ZXNbbm9kZS5pZF0KICAgICAgICBpZiBub3QgdmFsaWQ6CiAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCdpbnZhbGlkIGV4cHJlc3Npb246ICVzJyAlIG5vZGUuaWQpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBkb19zdHIoc2VsZiwgbm9kZSk6CiAgICAgICAgcmV0dXJuIG5vZGUucwoKCmRlZiBpbnRlcnByZXQobWFya2VyLCBleGVjdXRpb25fY29udGV4dD1Ob25lKToKICAgICIiIgogICAgSW50ZXJwcmV0IGEgbWFya2VyIGFuZCByZXR1cm4gYSByZXN1bHQgZGVwZW5kaW5nIG9uIGVudmlyb25tZW50LgoKICAgIDpwYXJhbSBtYXJrZXI6IFRoZSBtYXJrZXIgdG8gaW50ZXJwcmV0LgogICAgOnR5cGUgbWFya2VyOiBzdHIKICAgIDpwYXJhbSBleGVjdXRpb25fY29udGV4dDogVGhlIGNvbnRleHQgdXNlZCBmb3IgbmFtZSBsb29rdXAuCiAgICA6dHlwZSBleGVjdXRpb25fY29udGV4dDogbWFwcGluZwogICAgIiIiCiAgICByZXR1cm4gRXZhbHVhdG9yKGV4ZWN1dGlvbl9jb250ZXh0KS5ldmFsdWF0ZShtYXJrZXIuc3RyaXAoKSkKUEsDBBQAAAAAAAAAIQANpmzxsZcAALGXAAAvAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvbWV0YWRhdGEucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKIiIiSW1wbGVtZW50YXRpb24gb2YgdGhlIE1ldGFkYXRhIGZvciBQeXRob24gcGFja2FnZXMgUEVQcy4KClN1cHBvcnRzIGFsbCBtZXRhZGF0YSBmb3JtYXRzICgxLjAsIDEuMSwgMS4yLCBhbmQgMi4wIGV4cGVyaW1lbnRhbCkuCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCBjb2RlY3MKZnJvbSBlbWFpbCBpbXBvcnQgbWVzc2FnZV9mcm9tX2ZpbGUKaW1wb3J0IGpzb24KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHJlCgoKZnJvbSAuIGltcG9ydCBEaXN0bGliRXhjZXB0aW9uLCBfX3ZlcnNpb25fXwpmcm9tIC5jb21wYXQgaW1wb3J0IFN0cmluZ0lPLCBzdHJpbmdfdHlwZXMsIHRleHRfdHlwZQpmcm9tIC5tYXJrZXJzIGltcG9ydCBpbnRlcnByZXQKZnJvbSAudXRpbCBpbXBvcnQgZXh0cmFjdF9ieV9rZXksIGdldF9leHRyYXMKZnJvbSAudmVyc2lvbiBpbXBvcnQgZ2V0X3NjaGVtZSwgUEVQNDQwX1ZFUlNJT05fUkUKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIE1ldGFkYXRhTWlzc2luZ0Vycm9yKERpc3RsaWJFeGNlcHRpb24pOgogICAgIiIiQSByZXF1aXJlZCBtZXRhZGF0YSBpcyBtaXNzaW5nIiIiCgoKY2xhc3MgTWV0YWRhdGFDb25mbGljdEVycm9yKERpc3RsaWJFeGNlcHRpb24pOgogICAgIiIiQXR0ZW1wdCB0byByZWFkIG9yIHdyaXRlIG1ldGFkYXRhIGZpZWxkcyB0aGF0IGFyZSBjb25mbGljdHVhbC4iIiIKCgpjbGFzcyBNZXRhZGF0YVVucmVjb2duaXplZFZlcnNpb25FcnJvcihEaXN0bGliRXhjZXB0aW9uKToKICAgICIiIlVua25vd24gbWV0YWRhdGEgdmVyc2lvbiBudW1iZXIuIiIiCgoKY2xhc3MgTWV0YWRhdGFJbnZhbGlkRXJyb3IoRGlzdGxpYkV4Y2VwdGlvbik6CiAgICAiIiJBIG1ldGFkYXRhIHZhbHVlIGlzIGludmFsaWQiIiIKCiMgcHVibGljIEFQSSBvZiB0aGlzIG1vZHVsZQpfX2FsbF9fID0gWydNZXRhZGF0YScsICdQS0dfSU5GT19FTkNPRElORycsICdQS0dfSU5GT19QUkVGRVJSRURfVkVSU0lPTiddCgojIEVuY29kaW5nIHVzZWQgZm9yIHRoZSBQS0ctSU5GTyBmaWxlcwpQS0dfSU5GT19FTkNPRElORyA9ICd1dGYtOCcKCiMgcHJlZmVycmVkIHZlcnNpb24uIEhvcGVmdWxseSB3aWxsIGJlIGNoYW5nZWQKIyB0byAxLjIgb25jZSBQRVAgMzQ1IGlzIHN1cHBvcnRlZCBldmVyeXdoZXJlClBLR19JTkZPX1BSRUZFUlJFRF9WRVJTSU9OID0gJzEuMScKCl9MSU5FX1BSRUZJWF8xXzIgPSByZS5jb21waWxlKCdcbiAgICAgICBcfCcpCl9MSU5FX1BSRUZJWF9QUkVfMV8yID0gcmUuY29tcGlsZSgnXG4gICAgICAgICcpCl8yNDFfRklFTERTID0gKCdNZXRhZGF0YS1WZXJzaW9uJywgJ05hbWUnLCAnVmVyc2lvbicsICdQbGF0Zm9ybScsCiAgICAgICAgICAgICAgICdTdW1tYXJ5JywgJ0Rlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgJ0tleXdvcmRzJywgJ0hvbWUtcGFnZScsICdBdXRob3InLCAnQXV0aG9yLWVtYWlsJywKICAgICAgICAgICAgICAgJ0xpY2Vuc2UnKQoKXzMxNF9GSUVMRFMgPSAoJ01ldGFkYXRhLVZlcnNpb24nLCAnTmFtZScsICdWZXJzaW9uJywgJ1BsYXRmb3JtJywKICAgICAgICAgICAgICAgJ1N1cHBvcnRlZC1QbGF0Zm9ybScsICdTdW1tYXJ5JywgJ0Rlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgJ0tleXdvcmRzJywgJ0hvbWUtcGFnZScsICdBdXRob3InLCAnQXV0aG9yLWVtYWlsJywKICAgICAgICAgICAgICAgJ0xpY2Vuc2UnLCAnQ2xhc3NpZmllcicsICdEb3dubG9hZC1VUkwnLCAnT2Jzb2xldGVzJywKICAgICAgICAgICAgICAgJ1Byb3ZpZGVzJywgJ1JlcXVpcmVzJykKCl8zMTRfTUFSS0VSUyA9ICgnT2Jzb2xldGVzJywgJ1Byb3ZpZGVzJywgJ1JlcXVpcmVzJywgJ0NsYXNzaWZpZXInLAogICAgICAgICAgICAgICAgJ0Rvd25sb2FkLVVSTCcpCgpfMzQ1X0ZJRUxEUyA9ICgnTWV0YWRhdGEtVmVyc2lvbicsICdOYW1lJywgJ1ZlcnNpb24nLCAnUGxhdGZvcm0nLAogICAgICAgICAgICAgICAnU3VwcG9ydGVkLVBsYXRmb3JtJywgJ1N1bW1hcnknLCAnRGVzY3JpcHRpb24nLAogICAgICAgICAgICAgICAnS2V5d29yZHMnLCAnSG9tZS1wYWdlJywgJ0F1dGhvcicsICdBdXRob3ItZW1haWwnLAogICAgICAgICAgICAgICAnTWFpbnRhaW5lcicsICdNYWludGFpbmVyLWVtYWlsJywgJ0xpY2Vuc2UnLAogICAgICAgICAgICAgICAnQ2xhc3NpZmllcicsICdEb3dubG9hZC1VUkwnLCAnT2Jzb2xldGVzLURpc3QnLAogICAgICAgICAgICAgICAnUHJvamVjdC1VUkwnLCAnUHJvdmlkZXMtRGlzdCcsICdSZXF1aXJlcy1EaXN0JywKICAgICAgICAgICAgICAgJ1JlcXVpcmVzLVB5dGhvbicsICdSZXF1aXJlcy1FeHRlcm5hbCcpCgpfMzQ1X01BUktFUlMgPSAoJ1Byb3ZpZGVzLURpc3QnLCAnUmVxdWlyZXMtRGlzdCcsICdSZXF1aXJlcy1QeXRob24nLAogICAgICAgICAgICAgICAgJ09ic29sZXRlcy1EaXN0JywgJ1JlcXVpcmVzLUV4dGVybmFsJywgJ01haW50YWluZXInLAogICAgICAgICAgICAgICAgJ01haW50YWluZXItZW1haWwnLCAnUHJvamVjdC1VUkwnKQoKXzQyNl9GSUVMRFMgPSAoJ01ldGFkYXRhLVZlcnNpb24nLCAnTmFtZScsICdWZXJzaW9uJywgJ1BsYXRmb3JtJywKICAgICAgICAgICAgICAgJ1N1cHBvcnRlZC1QbGF0Zm9ybScsICdTdW1tYXJ5JywgJ0Rlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgJ0tleXdvcmRzJywgJ0hvbWUtcGFnZScsICdBdXRob3InLCAnQXV0aG9yLWVtYWlsJywKICAgICAgICAgICAgICAgJ01haW50YWluZXInLCAnTWFpbnRhaW5lci1lbWFpbCcsICdMaWNlbnNlJywKICAgICAgICAgICAgICAgJ0NsYXNzaWZpZXInLCAnRG93bmxvYWQtVVJMJywgJ09ic29sZXRlcy1EaXN0JywKICAgICAgICAgICAgICAgJ1Byb2plY3QtVVJMJywgJ1Byb3ZpZGVzLURpc3QnLCAnUmVxdWlyZXMtRGlzdCcsCiAgICAgICAgICAgICAgICdSZXF1aXJlcy1QeXRob24nLCAnUmVxdWlyZXMtRXh0ZXJuYWwnLCAnUHJpdmF0ZS1WZXJzaW9uJywKICAgICAgICAgICAgICAgJ09ic29sZXRlZC1CeScsICdTZXR1cC1SZXF1aXJlcy1EaXN0JywgJ0V4dGVuc2lvbicsCiAgICAgICAgICAgICAgICdQcm92aWRlcy1FeHRyYScpCgpfNDI2X01BUktFUlMgPSAoJ1ByaXZhdGUtVmVyc2lvbicsICdQcm92aWRlcy1FeHRyYScsICdPYnNvbGV0ZWQtQnknLAogICAgICAgICAgICAgICAgJ1NldHVwLVJlcXVpcmVzLURpc3QnLCAnRXh0ZW5zaW9uJykKCl9BTExfRklFTERTID0gc2V0KCkKX0FMTF9GSUVMRFMudXBkYXRlKF8yNDFfRklFTERTKQpfQUxMX0ZJRUxEUy51cGRhdGUoXzMxNF9GSUVMRFMpCl9BTExfRklFTERTLnVwZGF0ZShfMzQ1X0ZJRUxEUykKX0FMTF9GSUVMRFMudXBkYXRlKF80MjZfRklFTERTKQoKRVhUUkFfUkUgPSByZS5jb21waWxlKHInJydleHRyYVxzKj09XHMqKCIoW14iXSspInwnKFteJ10rKScpJycnKQoKCmRlZiBfdmVyc2lvbjJmaWVsZGxpc3QodmVyc2lvbik6CiAgICBpZiB2ZXJzaW9uID09ICcxLjAnOgogICAgICAgIHJldHVybiBfMjQxX0ZJRUxEUwogICAgZWxpZiB2ZXJzaW9uID09ICcxLjEnOgogICAgICAgIHJldHVybiBfMzE0X0ZJRUxEUwogICAgZWxpZiB2ZXJzaW9uID09ICcxLjInOgogICAgICAgIHJldHVybiBfMzQ1X0ZJRUxEUwogICAgZWxpZiB2ZXJzaW9uID09ICcyLjAnOgogICAgICAgIHJldHVybiBfNDI2X0ZJRUxEUwogICAgcmFpc2UgTWV0YWRhdGFVbnJlY29nbml6ZWRWZXJzaW9uRXJyb3IodmVyc2lvbikKCgpkZWYgX2Jlc3RfdmVyc2lvbihmaWVsZHMpOgogICAgIiIiRGV0ZWN0IHRoZSBiZXN0IHZlcnNpb24gZGVwZW5kaW5nIG9uIHRoZSBmaWVsZHMgdXNlZC4iIiIKICAgIGRlZiBfaGFzX21hcmtlcihrZXlzLCBtYXJrZXJzKToKICAgICAgICBmb3IgbWFya2VyIGluIG1hcmtlcnM6CiAgICAgICAgICAgIGlmIG1hcmtlciBpbiBrZXlzOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBrZXlzID0gW10KICAgIGZvciBrZXksIHZhbHVlIGluIGZpZWxkcy5pdGVtcygpOgogICAgICAgIGlmIHZhbHVlIGluIChbXSwgJ1VOS05PV04nLCBOb25lKToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBrZXlzLmFwcGVuZChrZXkpCgogICAgcG9zc2libGVfdmVyc2lvbnMgPSBbJzEuMCcsICcxLjEnLCAnMS4yJywgJzIuMCddCgogICAgIyBmaXJzdCBsZXQncyB0cnkgdG8gc2VlIGlmIGEgZmllbGQgaXMgbm90IHBhcnQgb2Ygb25lIG9mIHRoZSB2ZXJzaW9uCiAgICBmb3Iga2V5IGluIGtleXM6CiAgICAgICAgaWYga2V5IG5vdCBpbiBfMjQxX0ZJRUxEUyBhbmQgJzEuMCcgaW4gcG9zc2libGVfdmVyc2lvbnM6CiAgICAgICAgICAgIHBvc3NpYmxlX3ZlcnNpb25zLnJlbW92ZSgnMS4wJykKICAgICAgICBpZiBrZXkgbm90IGluIF8zMTRfRklFTERTIGFuZCAnMS4xJyBpbiBwb3NzaWJsZV92ZXJzaW9uczoKICAgICAgICAgICAgcG9zc2libGVfdmVyc2lvbnMucmVtb3ZlKCcxLjEnKQogICAgICAgIGlmIGtleSBub3QgaW4gXzM0NV9GSUVMRFMgYW5kICcxLjInIGluIHBvc3NpYmxlX3ZlcnNpb25zOgogICAgICAgICAgICBwb3NzaWJsZV92ZXJzaW9ucy5yZW1vdmUoJzEuMicpCiAgICAgICAgaWYga2V5IG5vdCBpbiBfNDI2X0ZJRUxEUyBhbmQgJzIuMCcgaW4gcG9zc2libGVfdmVyc2lvbnM6CiAgICAgICAgICAgIHBvc3NpYmxlX3ZlcnNpb25zLnJlbW92ZSgnMi4wJykKCiAgICAjIHBvc3NpYmxlX3ZlcnNpb24gY29udGFpbnMgcXVhbGlmaWVkIHZlcnNpb25zCiAgICBpZiBsZW4ocG9zc2libGVfdmVyc2lvbnMpID09IDE6CiAgICAgICAgcmV0dXJuIHBvc3NpYmxlX3ZlcnNpb25zWzBdICAgIyBmb3VuZCAhCiAgICBlbGlmIGxlbihwb3NzaWJsZV92ZXJzaW9ucykgPT0gMDoKICAgICAgICByYWlzZSBNZXRhZGF0YUNvbmZsaWN0RXJyb3IoJ1Vua25vd24gbWV0YWRhdGEgc2V0JykKCiAgICAjIGxldCdzIHNlZSBpZiBvbmUgdW5pcXVlIG1hcmtlciBpcyBmb3VuZAogICAgaXNfMV8xID0gJzEuMScgaW4gcG9zc2libGVfdmVyc2lvbnMgYW5kIF9oYXNfbWFya2VyKGtleXMsIF8zMTRfTUFSS0VSUykKICAgIGlzXzFfMiA9ICcxLjInIGluIHBvc3NpYmxlX3ZlcnNpb25zIGFuZCBfaGFzX21hcmtlcihrZXlzLCBfMzQ1X01BUktFUlMpCiAgICBpc18yXzAgPSAnMi4wJyBpbiBwb3NzaWJsZV92ZXJzaW9ucyBhbmQgX2hhc19tYXJrZXIoa2V5cywgXzQyNl9NQVJLRVJTKQogICAgaWYgaW50KGlzXzFfMSkgKyBpbnQoaXNfMV8yKSArIGludChpc18yXzApID4gMToKICAgICAgICByYWlzZSBNZXRhZGF0YUNvbmZsaWN0RXJyb3IoJ1lvdSB1c2VkIGluY29tcGF0aWJsZSAxLjEvMS4yLzIuMCBmaWVsZHMnKQoKICAgICMgd2UgaGF2ZSB0aGUgY2hvaWNlLCAxLjAsIG9yIDEuMiwgb3IgMi4wCiAgICAjICAgLSAxLjAgaGFzIGEgYnJva2VuIFN1bW1hcnkgZmllbGQgYnV0IHdvcmtzIHdpdGggYWxsIHRvb2xzCiAgICAjICAgLSAxLjEgaXMgdG8gYXZvaWQKICAgICMgICAtIDEuMiBmaXhlcyBTdW1tYXJ5IGJ1dCBoYXMgbGl0dGxlIGFkb3B0aW9uCiAgICAjICAgLSAyLjAgYWRkcyBtb3JlIGZlYXR1cmVzIGFuZCBpcyB2ZXJ5IG5ldwogICAgaWYgbm90IGlzXzFfMSBhbmQgbm90IGlzXzFfMiBhbmQgbm90IGlzXzJfMDoKICAgICAgICAjIHdlIGNvdWxkbid0IGZpbmQgYW55IHNwZWNpZmljIG1hcmtlcgogICAgICAgIGlmIFBLR19JTkZPX1BSRUZFUlJFRF9WRVJTSU9OIGluIHBvc3NpYmxlX3ZlcnNpb25zOgogICAgICAgICAgICByZXR1cm4gUEtHX0lORk9fUFJFRkVSUkVEX1ZFUlNJT04KICAgIGlmIGlzXzFfMToKICAgICAgICByZXR1cm4gJzEuMScKICAgIGlmIGlzXzFfMjoKICAgICAgICByZXR1cm4gJzEuMicKCiAgICByZXR1cm4gJzIuMCcKCl9BVFRSMkZJRUxEID0gewogICAgJ21ldGFkYXRhX3ZlcnNpb24nOiAnTWV0YWRhdGEtVmVyc2lvbicsCiAgICAnbmFtZSc6ICdOYW1lJywKICAgICd2ZXJzaW9uJzogJ1ZlcnNpb24nLAogICAgJ3BsYXRmb3JtJzogJ1BsYXRmb3JtJywKICAgICdzdXBwb3J0ZWRfcGxhdGZvcm0nOiAnU3VwcG9ydGVkLVBsYXRmb3JtJywKICAgICdzdW1tYXJ5JzogJ1N1bW1hcnknLAogICAgJ2Rlc2NyaXB0aW9uJzogJ0Rlc2NyaXB0aW9uJywKICAgICdrZXl3b3Jkcyc6ICdLZXl3b3JkcycsCiAgICAnaG9tZV9wYWdlJzogJ0hvbWUtcGFnZScsCiAgICAnYXV0aG9yJzogJ0F1dGhvcicsCiAgICAnYXV0aG9yX2VtYWlsJzogJ0F1dGhvci1lbWFpbCcsCiAgICAnbWFpbnRhaW5lcic6ICdNYWludGFpbmVyJywKICAgICdtYWludGFpbmVyX2VtYWlsJzogJ01haW50YWluZXItZW1haWwnLAogICAgJ2xpY2Vuc2UnOiAnTGljZW5zZScsCiAgICAnY2xhc3NpZmllcic6ICdDbGFzc2lmaWVyJywKICAgICdkb3dubG9hZF91cmwnOiAnRG93bmxvYWQtVVJMJywKICAgICdvYnNvbGV0ZXNfZGlzdCc6ICdPYnNvbGV0ZXMtRGlzdCcsCiAgICAncHJvdmlkZXNfZGlzdCc6ICdQcm92aWRlcy1EaXN0JywKICAgICdyZXF1aXJlc19kaXN0JzogJ1JlcXVpcmVzLURpc3QnLAogICAgJ3NldHVwX3JlcXVpcmVzX2Rpc3QnOiAnU2V0dXAtUmVxdWlyZXMtRGlzdCcsCiAgICAncmVxdWlyZXNfcHl0aG9uJzogJ1JlcXVpcmVzLVB5dGhvbicsCiAgICAncmVxdWlyZXNfZXh0ZXJuYWwnOiAnUmVxdWlyZXMtRXh0ZXJuYWwnLAogICAgJ3JlcXVpcmVzJzogJ1JlcXVpcmVzJywKICAgICdwcm92aWRlcyc6ICdQcm92aWRlcycsCiAgICAnb2Jzb2xldGVzJzogJ09ic29sZXRlcycsCiAgICAncHJvamVjdF91cmwnOiAnUHJvamVjdC1VUkwnLAogICAgJ3ByaXZhdGVfdmVyc2lvbic6ICdQcml2YXRlLVZlcnNpb24nLAogICAgJ29ic29sZXRlZF9ieSc6ICdPYnNvbGV0ZWQtQnknLAogICAgJ2V4dGVuc2lvbic6ICdFeHRlbnNpb24nLAogICAgJ3Byb3ZpZGVzX2V4dHJhJzogJ1Byb3ZpZGVzLUV4dHJhJywKfQoKX1BSRURJQ0FURV9GSUVMRFMgPSAoJ1JlcXVpcmVzLURpc3QnLCAnT2Jzb2xldGVzLURpc3QnLCAnUHJvdmlkZXMtRGlzdCcpCl9WRVJTSU9OU19GSUVMRFMgPSAoJ1JlcXVpcmVzLVB5dGhvbicsKQpfVkVSU0lPTl9GSUVMRFMgPSAoJ1ZlcnNpb24nLCkKX0xJU1RGSUVMRFMgPSAoJ1BsYXRmb3JtJywgJ0NsYXNzaWZpZXInLCAnT2Jzb2xldGVzJywKICAgICAgICAgICAgICAgJ1JlcXVpcmVzJywgJ1Byb3ZpZGVzJywgJ09ic29sZXRlcy1EaXN0JywKICAgICAgICAgICAgICAgJ1Byb3ZpZGVzLURpc3QnLCAnUmVxdWlyZXMtRGlzdCcsICdSZXF1aXJlcy1FeHRlcm5hbCcsCiAgICAgICAgICAgICAgICdQcm9qZWN0LVVSTCcsICdTdXBwb3J0ZWQtUGxhdGZvcm0nLCAnU2V0dXAtUmVxdWlyZXMtRGlzdCcsCiAgICAgICAgICAgICAgICdQcm92aWRlcy1FeHRyYScsICdFeHRlbnNpb24nKQpfTElTVFRVUExFRklFTERTID0gKCdQcm9qZWN0LVVSTCcsKQoKX0VMRU1FTlRTRklFTEQgPSAoJ0tleXdvcmRzJywpCgpfVU5JQ09ERUZJRUxEUyA9ICgnQXV0aG9yJywgJ01haW50YWluZXInLCAnU3VtbWFyeScsICdEZXNjcmlwdGlvbicpCgpfTUlTU0lORyA9IG9iamVjdCgpCgpfRklMRVNBRkUgPSByZS5jb21waWxlKCdbXkEtWmEtejAtOS5dKycpCgoKZGVmIF9nZXRfbmFtZV9hbmRfdmVyc2lvbihuYW1lLCB2ZXJzaW9uLCBmb3JfZmlsZW5hbWU9RmFsc2UpOgogICAgIiIiUmV0dXJuIHRoZSBkaXN0cmlidXRpb24gbmFtZSB3aXRoIHZlcnNpb24uCgogICAgSWYgZm9yX2ZpbGVuYW1lIGlzIHRydWUsIHJldHVybiBhIGZpbGVuYW1lLWVzY2FwZWQgZm9ybS4iIiIKICAgIGlmIGZvcl9maWxlbmFtZToKICAgICAgICAjIEZvciBib3RoIG5hbWUgYW5kIHZlcnNpb24gYW55IHJ1bnMgb2Ygbm9uLWFscGhhbnVtZXJpYyBvciAnLicKICAgICAgICAjIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgJy0nLiAgQWRkaXRpb25hbGx5IGFueQogICAgICAgICMgc3BhY2VzIGluIHRoZSB2ZXJzaW9uIHN0cmluZyBiZWNvbWUgJy4nCiAgICAgICAgbmFtZSA9IF9GSUxFU0FGRS5zdWIoJy0nLCBuYW1lKQogICAgICAgIHZlcnNpb24gPSBfRklMRVNBRkUuc3ViKCctJywgdmVyc2lvbi5yZXBsYWNlKCcgJywgJy4nKSkKICAgIHJldHVybiAnJXMtJXMnICUgKG5hbWUsIHZlcnNpb24pCgoKY2xhc3MgTGVnYWN5TWV0YWRhdGEob2JqZWN0KToKICAgICIiIlRoZSBsZWdhY3kgbWV0YWRhdGEgb2YgYSByZWxlYXNlLgoKICAgIFN1cHBvcnRzIHZlcnNpb25zIDEuMCwgMS4xIGFuZCAxLjIgKGF1dG8tZGV0ZWN0ZWQpLiBZb3UgY2FuCiAgICBpbnN0YW50aWF0ZSB0aGUgY2xhc3Mgd2l0aCBvbmUgb2YgdGhlc2UgYXJndW1lbnRzIChvciBub25lKToKICAgIC0gKnBhdGgqLCB0aGUgcGF0aCB0byBhIG1ldGFkYXRhIGZpbGUKICAgIC0gKmZpbGVvYmoqIGdpdmUgYSBmaWxlLWxpa2Ugb2JqZWN0IHdpdGggbWV0YWRhdGEgYXMgY29udGVudAogICAgLSAqbWFwcGluZyogaXMgYSBkaWN0LWxpa2Ugb2JqZWN0CiAgICAtICpzY2hlbWUqIGlzIGEgdmVyc2lvbiBzY2hlbWUgbmFtZQogICAgIiIiCiAgICAjIFRPRE8gZG9jdW1lbnQgdGhlIG1hcHBpbmcgQVBJIGFuZCBVTktOT1dOIGRlZmF1bHQga2V5CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGg9Tm9uZSwgZmlsZW9iaj1Ob25lLCBtYXBwaW5nPU5vbmUsCiAgICAgICAgICAgICAgICAgc2NoZW1lPSdkZWZhdWx0Jyk6CiAgICAgICAgaWYgW3BhdGgsIGZpbGVvYmosIG1hcHBpbmddLmNvdW50KE5vbmUpIDwgMjoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdwYXRoLCBmaWxlb2JqIGFuZCBtYXBwaW5nIGFyZSBleGNsdXNpdmUnKQogICAgICAgIHNlbGYuX2ZpZWxkcyA9IHt9CiAgICAgICAgc2VsZi5yZXF1aXJlc19maWxlcyA9IFtdCiAgICAgICAgc2VsZi5fZGVwZW5kZW5jaWVzID0gTm9uZQogICAgICAgIHNlbGYuc2NoZW1lID0gc2NoZW1lCiAgICAgICAgaWYgcGF0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5yZWFkKHBhdGgpCiAgICAgICAgZWxpZiBmaWxlb2JqIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnJlYWRfZmlsZShmaWxlb2JqKQogICAgICAgIGVsaWYgbWFwcGluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi51cGRhdGUobWFwcGluZykKICAgICAgICAgICAgc2VsZi5zZXRfbWV0YWRhdGFfdmVyc2lvbigpCgogICAgZGVmIHNldF9tZXRhZGF0YV92ZXJzaW9uKHNlbGYpOgogICAgICAgIHNlbGYuX2ZpZWxkc1snTWV0YWRhdGEtVmVyc2lvbiddID0gX2Jlc3RfdmVyc2lvbihzZWxmLl9maWVsZHMpCgogICAgZGVmIF93cml0ZV9maWVsZChzZWxmLCBmaWxlb2JqLCBuYW1lLCB2YWx1ZSk6CiAgICAgICAgZmlsZW9iai53cml0ZSgnJXM6ICVzXG4nICUgKG5hbWUsIHZhbHVlKSkKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0KG5hbWUpCgogICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIG5hbWUsIHZhbHVlKToKICAgICAgICByZXR1cm4gc2VsZi5zZXQobmFtZSwgdmFsdWUpCgogICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIG5hbWUpOgogICAgICAgIGZpZWxkX25hbWUgPSBzZWxmLl9jb252ZXJ0X25hbWUobmFtZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlbCBzZWxmLl9maWVsZHNbZmllbGRfbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKG5hbWUpCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gKG5hbWUgaW4gc2VsZi5fZmllbGRzIG9yCiAgICAgICAgICAgICAgICBzZWxmLl9jb252ZXJ0X25hbWUobmFtZSkgaW4gc2VsZi5fZmllbGRzKQoKICAgIGRlZiBfY29udmVydF9uYW1lKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIG5hbWUgaW4gX0FMTF9GSUVMRFM6CiAgICAgICAgICAgIHJldHVybiBuYW1lCiAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnLScsICdfJykubG93ZXIoKQogICAgICAgIHJldHVybiBfQVRUUjJGSUVMRC5nZXQobmFtZSwgbmFtZSkKCiAgICBkZWYgX2RlZmF1bHRfdmFsdWUoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgbmFtZSBpbiBfTElTVEZJRUxEUyBvciBuYW1lIGluIF9FTEVNRU5UU0ZJRUxEOgogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICByZXR1cm4gJ1VOS05PV04nCgogICAgZGVmIF9yZW1vdmVfbGluZV9wcmVmaXgoc2VsZiwgdmFsdWUpOgogICAgICAgIGlmIHNlbGYubWV0YWRhdGFfdmVyc2lvbiBpbiAoJzEuMCcsICcxLjEnKToKICAgICAgICAgICAgcmV0dXJuIF9MSU5FX1BSRUZJWF9QUkVfMV8yLnN1YignXG4nLCB2YWx1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gX0xJTkVfUFJFRklYXzFfMi5zdWIoJ1xuJywgdmFsdWUpCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIG5hbWUgaW4gX0FUVFIyRklFTEQ6CiAgICAgICAgICAgIHJldHVybiBzZWxmW25hbWVdCiAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IobmFtZSkKCiAgICAjCiAgICAjIFB1YmxpYyBBUEkKICAgICMKCiMgICAgZGVwZW5kZW5jaWVzID0gcHJvcGVydHkoX2dldF9kZXBlbmRlbmNpZXMsIF9zZXRfZGVwZW5kZW5jaWVzKQoKICAgIGRlZiBnZXRfZnVsbG5hbWUoc2VsZiwgZmlsZXNhZmU9RmFsc2UpOgogICAgICAgICIiIlJldHVybiB0aGUgZGlzdHJpYnV0aW9uIG5hbWUgd2l0aCB2ZXJzaW9uLgoKICAgICAgICBJZiBmaWxlc2FmZSBpcyB0cnVlLCByZXR1cm4gYSBmaWxlbmFtZS1lc2NhcGVkIGZvcm0uIiIiCiAgICAgICAgcmV0dXJuIF9nZXRfbmFtZV9hbmRfdmVyc2lvbihzZWxmWydOYW1lJ10sIHNlbGZbJ1ZlcnNpb24nXSwgZmlsZXNhZmUpCgogICAgZGVmIGlzX2ZpZWxkKHNlbGYsIG5hbWUpOgogICAgICAgICIiInJldHVybiBUcnVlIGlmIG5hbWUgaXMgYSB2YWxpZCBtZXRhZGF0YSBrZXkiIiIKICAgICAgICBuYW1lID0gc2VsZi5fY29udmVydF9uYW1lKG5hbWUpCiAgICAgICAgcmV0dXJuIG5hbWUgaW4gX0FMTF9GSUVMRFMKCiAgICBkZWYgaXNfbXVsdGlfZmllbGQoc2VsZiwgbmFtZSk6CiAgICAgICAgbmFtZSA9IHNlbGYuX2NvbnZlcnRfbmFtZShuYW1lKQogICAgICAgIHJldHVybiBuYW1lIGluIF9MSVNURklFTERTCgogICAgZGVmIHJlYWQoc2VsZiwgZmlsZXBhdGgpOgogICAgICAgICIiIlJlYWQgdGhlIG1ldGFkYXRhIHZhbHVlcyBmcm9tIGEgZmlsZSBwYXRoLiIiIgogICAgICAgIGZwID0gY29kZWNzLm9wZW4oZmlsZXBhdGgsICdyJywgZW5jb2Rpbmc9J3V0Zi04JykKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYucmVhZF9maWxlKGZwKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGZwLmNsb3NlKCkKCiAgICBkZWYgcmVhZF9maWxlKHNlbGYsIGZpbGVvYik6CiAgICAgICAgIiIiUmVhZCB0aGUgbWV0YWRhdGEgdmFsdWVzIGZyb20gYSBmaWxlIG9iamVjdC4iIiIKICAgICAgICBtc2cgPSBtZXNzYWdlX2Zyb21fZmlsZShmaWxlb2IpCiAgICAgICAgc2VsZi5fZmllbGRzWydNZXRhZGF0YS1WZXJzaW9uJ10gPSBtc2dbJ21ldGFkYXRhLXZlcnNpb24nXQoKICAgICAgICAjIFdoZW4gcmVhZGluZywgZ2V0IGFsbCB0aGUgZmllbGRzIHdlIGNhbgogICAgICAgIGZvciBmaWVsZCBpbiBfQUxMX0ZJRUxEUzoKICAgICAgICAgICAgaWYgZmllbGQgbm90IGluIG1zZzoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGZpZWxkIGluIF9MSVNURklFTERTOgogICAgICAgICAgICAgICAgIyB3ZSBjYW4gaGF2ZSBtdWx0aXBsZSBsaW5lcwogICAgICAgICAgICAgICAgdmFsdWVzID0gbXNnLmdldF9hbGwoZmllbGQpCiAgICAgICAgICAgICAgICBpZiBmaWVsZCBpbiBfTElTVFRVUExFRklFTERTIGFuZCB2YWx1ZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gW3R1cGxlKHZhbHVlLnNwbGl0KCcsJykpIGZvciB2YWx1ZSBpbiB2YWx1ZXNdCiAgICAgICAgICAgICAgICBzZWxmLnNldChmaWVsZCwgdmFsdWVzKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBzaW5nbGUgbGluZQogICAgICAgICAgICAgICAgdmFsdWUgPSBtc2dbZmllbGRdCiAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZSBhbmQgdmFsdWUgIT0gJ1VOS05PV04nOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0KGZpZWxkLCB2YWx1ZSkKICAgICAgICBzZWxmLnNldF9tZXRhZGF0YV92ZXJzaW9uKCkKCiAgICBkZWYgd3JpdGUoc2VsZiwgZmlsZXBhdGgsIHNraXBfdW5rbm93bj1GYWxzZSk6CiAgICAgICAgIiIiV3JpdGUgdGhlIG1ldGFkYXRhIGZpZWxkcyB0byBmaWxlcGF0aC4iIiIKICAgICAgICBmcCA9IGNvZGVjcy5vcGVuKGZpbGVwYXRoLCAndycsIGVuY29kaW5nPSd1dGYtOCcpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZnAsIHNraXBfdW5rbm93bikKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmcC5jbG9zZSgpCgogICAgZGVmIHdyaXRlX2ZpbGUoc2VsZiwgZmlsZW9iamVjdCwgc2tpcF91bmtub3duPUZhbHNlKToKICAgICAgICAiIiJXcml0ZSB0aGUgUEtHLUlORk8gZm9ybWF0IGRhdGEgdG8gYSBmaWxlIG9iamVjdC4iIiIKICAgICAgICBzZWxmLnNldF9tZXRhZGF0YV92ZXJzaW9uKCkKCiAgICAgICAgZm9yIGZpZWxkIGluIF92ZXJzaW9uMmZpZWxkbGlzdChzZWxmWydNZXRhZGF0YS1WZXJzaW9uJ10pOgogICAgICAgICAgICB2YWx1ZXMgPSBzZWxmLmdldChmaWVsZCkKICAgICAgICAgICAgaWYgc2tpcF91bmtub3duIGFuZCB2YWx1ZXMgaW4gKCdVTktOT1dOJywgW10sIFsnVU5LTk9XTiddKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGZpZWxkIGluIF9FTEVNRU5UU0ZJRUxEOgogICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVfZmllbGQoZmlsZW9iamVjdCwgZmllbGQsICcsJy5qb2luKHZhbHVlcykpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBmaWVsZCBub3QgaW4gX0xJU1RGSUVMRFM6CiAgICAgICAgICAgICAgICBpZiBmaWVsZCA9PSAnRGVzY3JpcHRpb24nOgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYubWV0YWRhdGFfdmVyc2lvbiBpbiAoJzEuMCcsICcxLjEnKToKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLnJlcGxhY2UoJ1xuJywgJ1xuICAgICAgICAnKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5yZXBsYWNlKCdcbicsICdcbiAgICAgICB8JykKICAgICAgICAgICAgICAgIHZhbHVlcyA9IFt2YWx1ZXNdCgogICAgICAgICAgICBpZiBmaWVsZCBpbiBfTElTVFRVUExFRklFTERTOgogICAgICAgICAgICAgICAgdmFsdWVzID0gWycsJy5qb2luKHZhbHVlKSBmb3IgdmFsdWUgaW4gdmFsdWVzXQoKICAgICAgICAgICAgZm9yIHZhbHVlIGluIHZhbHVlczoKICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlX2ZpZWxkKGZpbGVvYmplY3QsIGZpZWxkLCB2YWx1ZSkKCiAgICBkZWYgdXBkYXRlKHNlbGYsIG90aGVyPU5vbmUsICoqa3dhcmdzKToKICAgICAgICAiIiJTZXQgbWV0YWRhdGEgdmFsdWVzIGZyb20gdGhlIGdpdmVuIGl0ZXJhYmxlIGBvdGhlcmAgYW5kIGt3YXJncy4KCiAgICAgICAgQmVoYXZpb3IgaXMgbGlrZSBgZGljdC51cGRhdGVgOiBJZiBgb3RoZXJgIGhhcyBhIGBga2V5c2BgIG1ldGhvZCwKICAgICAgICB0aGV5IGFyZSBsb29wZWQgb3ZlciBhbmQgYGBzZWxmW2tleV1gYCBpcyBhc3NpZ25lZCBgYG90aGVyW2tleV1gYC4KICAgICAgICBFbHNlLCBgYG90aGVyYGAgaXMgYW4gaXRlcmFibGUgb2YgYGAoa2V5LCB2YWx1ZSlgYCBpdGVyYWJsZXMuCgogICAgICAgIEtleXMgdGhhdCBkb24ndCBtYXRjaCBhIG1ldGFkYXRhIGZpZWxkIG9yIHRoYXQgaGF2ZSBhbiBlbXB0eSB2YWx1ZSBhcmUKICAgICAgICBkcm9wcGVkLgogICAgICAgICIiIgogICAgICAgIGRlZiBfc2V0KGtleSwgdmFsdWUpOgogICAgICAgICAgICBpZiBrZXkgaW4gX0FUVFIyRklFTEQgYW5kIHZhbHVlOgogICAgICAgICAgICAgICAgc2VsZi5zZXQoc2VsZi5fY29udmVydF9uYW1lKGtleSksIHZhbHVlKQoKICAgICAgICBpZiBub3Qgb3RoZXI6CiAgICAgICAgICAgICMgb3RoZXIgaXMgTm9uZSBvciBlbXB0eSBjb250YWluZXIKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgJ2tleXMnKToKICAgICAgICAgICAgZm9yIGsgaW4gb3RoZXIua2V5cygpOgogICAgICAgICAgICAgICAgX3NldChrLCBvdGhlcltrXSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmb3IgaywgdiBpbiBvdGhlcjoKICAgICAgICAgICAgICAgIF9zZXQoaywgdikKCiAgICAgICAgaWYga3dhcmdzOgogICAgICAgICAgICBmb3IgaywgdiBpbiBrd2FyZ3MuaXRlbXMoKToKICAgICAgICAgICAgICAgIF9zZXQoaywgdikKCiAgICBkZWYgc2V0KHNlbGYsIG5hbWUsIHZhbHVlKToKICAgICAgICAiIiJDb250cm9sIHRoZW4gc2V0IGEgbWV0YWRhdGEgZmllbGQuIiIiCiAgICAgICAgbmFtZSA9IHNlbGYuX2NvbnZlcnRfbmFtZShuYW1lKQoKICAgICAgICBpZiAoKG5hbWUgaW4gX0VMRU1FTlRTRklFTEQgb3IgbmFtZSA9PSAnUGxhdGZvcm0nKSBhbmQKICAgICAgICAgICAgbm90IGlzaW5zdGFuY2UodmFsdWUsIChsaXN0LCB0dXBsZSkpKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgICAgIHZhbHVlID0gW3Yuc3RyaXAoKSBmb3IgdiBpbiB2YWx1ZS5zcGxpdCgnLCcpXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmFsdWUgPSBbXQogICAgICAgIGVsaWYgKG5hbWUgaW4gX0xJU1RGSUVMRFMgYW5kCiAgICAgICAgICAgICAgbm90IGlzaW5zdGFuY2UodmFsdWUsIChsaXN0LCB0dXBsZSkpKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgICAgIHZhbHVlID0gW3ZhbHVlXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmFsdWUgPSBbXQoKICAgICAgICBpZiBsb2dnZXIuaXNFbmFibGVkRm9yKGxvZ2dpbmcuV0FSTklORyk6CiAgICAgICAgICAgIHByb2plY3RfbmFtZSA9IHNlbGZbJ05hbWUnXQoKICAgICAgICAgICAgc2NoZW1lID0gZ2V0X3NjaGVtZShzZWxmLnNjaGVtZSkKICAgICAgICAgICAgaWYgbmFtZSBpbiBfUFJFRElDQVRFX0ZJRUxEUyBhbmQgdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBmb3IgdiBpbiB2YWx1ZToKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHRoYXQgdGhlIHZhbHVlcyBhcmUgdmFsaWQKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2NoZW1lLmlzX3ZhbGlkX21hdGNoZXIodi5zcGxpdCgnOycpWzBdKToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJzogJyVzJyBpcyBub3QgdmFsaWQgKGZpZWxkICclcycpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3RfbmFtZSwgdiwgbmFtZSkKICAgICAgICAgICAgIyBGSVhNRSB0aGlzIHJlamVjdHMgVU5LTk9XTiwgaXMgdGhhdCByaWdodD8KICAgICAgICAgICAgZWxpZiBuYW1lIGluIF9WRVJTSU9OU19GSUVMRFMgYW5kIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgaWYgbm90IHNjaGVtZS5pc192YWxpZF9jb25zdHJhaW50X2xpc3QodmFsdWUpOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCInJXMnOiAnJXMnIGlzIG5vdCBhIHZhbGlkIHZlcnNpb24gKGZpZWxkICclcycpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0X25hbWUsIHZhbHVlLCBuYW1lKQogICAgICAgICAgICBlbGlmIG5hbWUgaW4gX1ZFUlNJT05fRklFTERTIGFuZCB2YWx1ZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGlmIG5vdCBzY2hlbWUuaXNfdmFsaWRfdmVyc2lvbih2YWx1ZSk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIiclcyc6ICclcycgaXMgbm90IGEgdmFsaWQgdmVyc2lvbiAoZmllbGQgJyVzJykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3RfbmFtZSwgdmFsdWUsIG5hbWUpCgogICAgICAgIGlmIG5hbWUgaW4gX1VOSUNPREVGSUVMRFM6CiAgICAgICAgICAgIGlmIG5hbWUgPT0gJ0Rlc2NyaXB0aW9uJzoKICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fcmVtb3ZlX2xpbmVfcHJlZml4KHZhbHVlKQoKICAgICAgICBzZWxmLl9maWVsZHNbbmFtZV0gPSB2YWx1ZQoKICAgIGRlZiBnZXQoc2VsZiwgbmFtZSwgZGVmYXVsdD1fTUlTU0lORyk6CiAgICAgICAgIiIiR2V0IGEgbWV0YWRhdGEgZmllbGQuIiIiCiAgICAgICAgbmFtZSA9IHNlbGYuX2NvbnZlcnRfbmFtZShuYW1lKQogICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYuX2ZpZWxkczoKICAgICAgICAgICAgaWYgZGVmYXVsdCBpcyBfTUlTU0lORzoKICAgICAgICAgICAgICAgIGRlZmF1bHQgPSBzZWxmLl9kZWZhdWx0X3ZhbHVlKG5hbWUpCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CiAgICAgICAgaWYgbmFtZSBpbiBfVU5JQ09ERUZJRUxEUzoKICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9maWVsZHNbbmFtZV0KICAgICAgICAgICAgcmV0dXJuIHZhbHVlCiAgICAgICAgZWxpZiBuYW1lIGluIF9MSVNURklFTERTOgogICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX2ZpZWxkc1tuYW1lXQogICAgICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgICAgIHJlcyA9IFtdCiAgICAgICAgICAgIGZvciB2YWwgaW4gdmFsdWU6CiAgICAgICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBfTElTVFRVUExFRklFTERTOgogICAgICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQodmFsKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIFRoYXQncyBmb3IgUHJvamVjdC1VUkwKICAgICAgICAgICAgICAgICAgICByZXMuYXBwZW5kKCh2YWxbMF0sIHZhbFsxXSkpCiAgICAgICAgICAgIHJldHVybiByZXMKCiAgICAgICAgZWxpZiBuYW1lIGluIF9FTEVNRU5UU0ZJRUxEOgogICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX2ZpZWxkc1tuYW1lXQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcsJykKICAgICAgICByZXR1cm4gc2VsZi5fZmllbGRzW25hbWVdCgogICAgZGVmIGNoZWNrKHNlbGYsIHN0cmljdD1GYWxzZSk6CiAgICAgICAgIiIiQ2hlY2sgaWYgdGhlIG1ldGFkYXRhIGlzIGNvbXBsaWFudC4gSWYgc3RyaWN0IGlzIFRydWUgdGhlbiByYWlzZSBpZgogICAgICAgIG5vIE5hbWUgb3IgVmVyc2lvbiBhcmUgcHJvdmlkZWQiIiIKICAgICAgICBzZWxmLnNldF9tZXRhZGF0YV92ZXJzaW9uKCkKCiAgICAgICAgIyBYWFggc2hvdWxkIGNoZWNrIHRoZSB2ZXJzaW9ucyAoaWYgdGhlIGZpbGUgd2FzIGxvYWRlZCkKICAgICAgICBtaXNzaW5nLCB3YXJuaW5ncyA9IFtdLCBbXQoKICAgICAgICBmb3IgYXR0ciBpbiAoJ05hbWUnLCAnVmVyc2lvbicpOiAgIyByZXF1aXJlZCBieSBQRVAgMzQ1CiAgICAgICAgICAgIGlmIGF0dHIgbm90IGluIHNlbGY6CiAgICAgICAgICAgICAgICBtaXNzaW5nLmFwcGVuZChhdHRyKQoKICAgICAgICBpZiBzdHJpY3QgYW5kIG1pc3NpbmcgIT0gW106CiAgICAgICAgICAgIG1zZyA9ICdtaXNzaW5nIHJlcXVpcmVkIG1ldGFkYXRhOiAlcycgJSAnLCAnLmpvaW4obWlzc2luZykKICAgICAgICAgICAgcmFpc2UgTWV0YWRhdGFNaXNzaW5nRXJyb3IobXNnKQoKICAgICAgICBmb3IgYXR0ciBpbiAoJ0hvbWUtcGFnZScsICdBdXRob3InKToKICAgICAgICAgICAgaWYgYXR0ciBub3QgaW4gc2VsZjoKICAgICAgICAgICAgICAgIG1pc3NpbmcuYXBwZW5kKGF0dHIpCgogICAgICAgICMgY2hlY2tpbmcgbWV0YWRhdGEgMS4yIChYWFggbmVlZHMgdG8gY2hlY2sgMS4xLCAxLjApCiAgICAgICAgaWYgc2VsZlsnTWV0YWRhdGEtVmVyc2lvbiddICE9ICcxLjInOgogICAgICAgICAgICByZXR1cm4gbWlzc2luZywgd2FybmluZ3MKCiAgICAgICAgc2NoZW1lID0gZ2V0X3NjaGVtZShzZWxmLnNjaGVtZSkKCiAgICAgICAgZGVmIGFyZV92YWxpZF9jb25zdHJhaW50cyh2YWx1ZSk6CiAgICAgICAgICAgIGZvciB2IGluIHZhbHVlOgogICAgICAgICAgICAgICAgaWYgbm90IHNjaGVtZS5pc192YWxpZF9tYXRjaGVyKHYuc3BsaXQoJzsnKVswXSk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGZvciBmaWVsZHMsIGNvbnRyb2xsZXIgaW4gKChfUFJFRElDQVRFX0ZJRUxEUywgYXJlX3ZhbGlkX2NvbnN0cmFpbnRzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX1ZFUlNJT05TX0ZJRUxEUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1lLmlzX3ZhbGlkX2NvbnN0cmFpbnRfbGlzdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9WRVJTSU9OX0ZJRUxEUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1lLmlzX3ZhbGlkX3ZlcnNpb24pKToKICAgICAgICAgICAgZm9yIGZpZWxkIGluIGZpZWxkczoKICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5nZXQoZmllbGQsIE5vbmUpCiAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZSBhbmQgbm90IGNvbnRyb2xsZXIodmFsdWUpOgogICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLmFwcGVuZCgiV3JvbmcgdmFsdWUgZm9yICclcyc6ICVzIiAlIChmaWVsZCwgdmFsdWUpKQoKICAgICAgICByZXR1cm4gbWlzc2luZywgd2FybmluZ3MKCiAgICBkZWYgdG9kaWN0KHNlbGYsIHNraXBfbWlzc2luZz1GYWxzZSk6CiAgICAgICAgIiIiUmV0dXJuIGZpZWxkcyBhcyBhIGRpY3QuCgogICAgICAgIEZpZWxkIG5hbWVzIHdpbGwgYmUgY29udmVydGVkIHRvIHVzZSB0aGUgdW5kZXJzY29yZS1sb3dlcmNhc2Ugc3R5bGUKICAgICAgICBpbnN0ZWFkIG9mIGh5cGhlbi1taXhlZCBjYXNlIChpLmUuIGhvbWVfcGFnZSBpbnN0ZWFkIG9mIEhvbWUtcGFnZSkuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5zZXRfbWV0YWRhdGFfdmVyc2lvbigpCgogICAgICAgIG1hcHBpbmdfMV8wID0gKAogICAgICAgICAgICAoJ21ldGFkYXRhX3ZlcnNpb24nLCAnTWV0YWRhdGEtVmVyc2lvbicpLAogICAgICAgICAgICAoJ25hbWUnLCAnTmFtZScpLAogICAgICAgICAgICAoJ3ZlcnNpb24nLCAnVmVyc2lvbicpLAogICAgICAgICAgICAoJ3N1bW1hcnknLCAnU3VtbWFyeScpLAogICAgICAgICAgICAoJ2hvbWVfcGFnZScsICdIb21lLXBhZ2UnKSwKICAgICAgICAgICAgKCdhdXRob3InLCAnQXV0aG9yJyksCiAgICAgICAgICAgICgnYXV0aG9yX2VtYWlsJywgJ0F1dGhvci1lbWFpbCcpLAogICAgICAgICAgICAoJ2xpY2Vuc2UnLCAnTGljZW5zZScpLAogICAgICAgICAgICAoJ2Rlc2NyaXB0aW9uJywgJ0Rlc2NyaXB0aW9uJyksCiAgICAgICAgICAgICgna2V5d29yZHMnLCAnS2V5d29yZHMnKSwKICAgICAgICAgICAgKCdwbGF0Zm9ybScsICdQbGF0Zm9ybScpLAogICAgICAgICAgICAoJ2NsYXNzaWZpZXJzJywgJ0NsYXNzaWZpZXInKSwKICAgICAgICAgICAgKCdkb3dubG9hZF91cmwnLCAnRG93bmxvYWQtVVJMJyksCiAgICAgICAgKQoKICAgICAgICBkYXRhID0ge30KICAgICAgICBmb3Iga2V5LCBmaWVsZF9uYW1lIGluIG1hcHBpbmdfMV8wOgogICAgICAgICAgICBpZiBub3Qgc2tpcF9taXNzaW5nIG9yIGZpZWxkX25hbWUgaW4gc2VsZi5fZmllbGRzOgogICAgICAgICAgICAgICAgZGF0YVtrZXldID0gc2VsZltmaWVsZF9uYW1lXQoKICAgICAgICBpZiBzZWxmWydNZXRhZGF0YS1WZXJzaW9uJ10gPT0gJzEuMic6CiAgICAgICAgICAgIG1hcHBpbmdfMV8yID0gKAogICAgICAgICAgICAgICAgKCdyZXF1aXJlc19kaXN0JywgJ1JlcXVpcmVzLURpc3QnKSwKICAgICAgICAgICAgICAgICgncmVxdWlyZXNfcHl0aG9uJywgJ1JlcXVpcmVzLVB5dGhvbicpLAogICAgICAgICAgICAgICAgKCdyZXF1aXJlc19leHRlcm5hbCcsICdSZXF1aXJlcy1FeHRlcm5hbCcpLAogICAgICAgICAgICAgICAgKCdwcm92aWRlc19kaXN0JywgJ1Byb3ZpZGVzLURpc3QnKSwKICAgICAgICAgICAgICAgICgnb2Jzb2xldGVzX2Rpc3QnLCAnT2Jzb2xldGVzLURpc3QnKSwKICAgICAgICAgICAgICAgICgncHJvamVjdF91cmwnLCAnUHJvamVjdC1VUkwnKSwKICAgICAgICAgICAgICAgICgnbWFpbnRhaW5lcicsICdNYWludGFpbmVyJyksCiAgICAgICAgICAgICAgICAoJ21haW50YWluZXJfZW1haWwnLCAnTWFpbnRhaW5lci1lbWFpbCcpLAogICAgICAgICAgICApCiAgICAgICAgICAgIGZvciBrZXksIGZpZWxkX25hbWUgaW4gbWFwcGluZ18xXzI6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2tpcF9taXNzaW5nIG9yIGZpZWxkX25hbWUgaW4gc2VsZi5fZmllbGRzOgogICAgICAgICAgICAgICAgICAgIGlmIGtleSAhPSAncHJvamVjdF91cmwnOgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSBzZWxmW2ZpZWxkX25hbWVdCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldID0gWycsJy5qb2luKHUpIGZvciB1IGluIHNlbGZbZmllbGRfbmFtZV1dCgogICAgICAgIGVsaWYgc2VsZlsnTWV0YWRhdGEtVmVyc2lvbiddID09ICcxLjEnOgogICAgICAgICAgICBtYXBwaW5nXzFfMSA9ICgKICAgICAgICAgICAgICAgICgncHJvdmlkZXMnLCAnUHJvdmlkZXMnKSwKICAgICAgICAgICAgICAgICgncmVxdWlyZXMnLCAnUmVxdWlyZXMnKSwKICAgICAgICAgICAgICAgICgnb2Jzb2xldGVzJywgJ09ic29sZXRlcycpLAogICAgICAgICAgICApCiAgICAgICAgICAgIGZvciBrZXksIGZpZWxkX25hbWUgaW4gbWFwcGluZ18xXzE6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2tpcF9taXNzaW5nIG9yIGZpZWxkX25hbWUgaW4gc2VsZi5fZmllbGRzOgogICAgICAgICAgICAgICAgICAgIGRhdGFba2V5XSA9IHNlbGZbZmllbGRfbmFtZV0KCiAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBkZWYgYWRkX3JlcXVpcmVtZW50cyhzZWxmLCByZXF1aXJlbWVudHMpOgogICAgICAgIGlmIHNlbGZbJ01ldGFkYXRhLVZlcnNpb24nXSA9PSAnMS4xJzoKICAgICAgICAgICAgIyB3ZSBjYW4ndCBoYXZlIDEuMSBtZXRhZGF0YSAqYW5kKiBTZXR1cHRvb2xzIHJlcXVpcmVzCiAgICAgICAgICAgIGZvciBmaWVsZCBpbiAoJ09ic29sZXRlcycsICdSZXF1aXJlcycsICdQcm92aWRlcycpOgogICAgICAgICAgICAgICAgaWYgZmllbGQgaW4gc2VsZjoKICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZltmaWVsZF0KICAgICAgICBzZWxmWydSZXF1aXJlcy1EaXN0J10gKz0gcmVxdWlyZW1lbnRzCgogICAgIyBNYXBwaW5nIEFQSQogICAgIyBUT0RPIGNvdWxkIGFkZCBpdGVyKiB2YXJpYW50cwoKICAgIGRlZiBrZXlzKHNlbGYpOgogICAgICAgIHJldHVybiBsaXN0KF92ZXJzaW9uMmZpZWxkbGlzdChzZWxmWydNZXRhZGF0YS1WZXJzaW9uJ10pKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBmb3Iga2V5IGluIHNlbGYua2V5cygpOgogICAgICAgICAgICB5aWVsZCBrZXkKCiAgICBkZWYgdmFsdWVzKHNlbGYpOgogICAgICAgIHJldHVybiBbc2VsZltrZXldIGZvciBrZXkgaW4gc2VsZi5rZXlzKCldCgogICAgZGVmIGl0ZW1zKHNlbGYpOgogICAgICAgIHJldHVybiBbKGtleSwgc2VsZltrZXldKSBmb3Iga2V5IGluIHNlbGYua2V5cygpXQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJzwlcyAlcyAlcz4nICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZlcnNpb24pCgoKTUVUQURBVEFfRklMRU5BTUUgPSAncHlkaXN0Lmpzb24nCldIRUVMX01FVEFEQVRBX0ZJTEVOQU1FID0gJ21ldGFkYXRhLmpzb24nCgoKY2xhc3MgTWV0YWRhdGEob2JqZWN0KToKICAgICIiIgogICAgVGhlIG1ldGFkYXRhIG9mIGEgcmVsZWFzZS4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIDIuMCAoSlNPTikKICAgIG1ldGFkYXRhIHdoZXJlIHBvc3NpYmxlLiBJZiBub3QgcG9zc2libGUsIGl0IHdyYXBzIGEgTGVnYWN5TWV0YWRhdGEKICAgIGluc3RhbmNlIHdoaWNoIGhhbmRsZXMgdGhlIGtleS12YWx1ZSBtZXRhZGF0YSBmb3JtYXQuCiAgICAiIiIKCiAgICBNRVRBREFUQV9WRVJTSU9OX01BVENIRVIgPSByZS5jb21waWxlKCdeXGQrKFwuXGQrKSokJykKCiAgICBOQU1FX01BVENIRVIgPSByZS5jb21waWxlKCdeWzAtOUEtWl0oWzAtOUEtWl8uLV0qWzAtOUEtWl0pPyQnLCByZS5JKQoKICAgIFZFUlNJT05fTUFUQ0hFUiA9IFBFUDQ0MF9WRVJTSU9OX1JFCgogICAgU1VNTUFSWV9NQVRDSEVSID0gcmUuY29tcGlsZSgnLnsxLDIwNDd9JykKCiAgICBNRVRBREFUQV9WRVJTSU9OID0gJzIuMCcKCiAgICBHRU5FUkFUT1IgPSAnZGlzdGxpYiAoJXMpJyAlIF9fdmVyc2lvbl9fCgogICAgTUFOREFUT1JZX0tFWVMgPSB7CiAgICAgICAgJ25hbWUnOiAoKSwKICAgICAgICAndmVyc2lvbic6ICgpLAogICAgICAgICdzdW1tYXJ5JzogKCdsZWdhY3knLCksCiAgICB9CgogICAgSU5ERVhfS0VZUyA9ICgnbmFtZSB2ZXJzaW9uIGxpY2Vuc2Ugc3VtbWFyeSBkZXNjcmlwdGlvbiBhdXRob3IgJwogICAgICAgICAgICAgICAgICAnYXV0aG9yX2VtYWlsIGtleXdvcmRzIHBsYXRmb3JtIGhvbWVfcGFnZSBjbGFzc2lmaWVycyAnCiAgICAgICAgICAgICAgICAgICdkb3dubG9hZF91cmwnKQoKICAgIERFUEVOREVOQ1lfS0VZUyA9ICgnZXh0cmFzIHJ1bl9yZXF1aXJlcyB0ZXN0X3JlcXVpcmVzIGJ1aWxkX3JlcXVpcmVzICcKICAgICAgICAgICAgICAgICAgICAgICAnZGV2X3JlcXVpcmVzIHByb3ZpZGVzIG1ldGFfcmVxdWlyZXMgb2Jzb2xldGVkX2J5ICcKICAgICAgICAgICAgICAgICAgICAgICAnc3VwcG9ydHNfZW52aXJvbm1lbnRzJykKCiAgICBTWU5UQVhfVkFMSURBVE9SUyA9IHsKICAgICAgICAnbWV0YWRhdGFfdmVyc2lvbic6IChNRVRBREFUQV9WRVJTSU9OX01BVENIRVIsICgpKSwKICAgICAgICAnbmFtZSc6IChOQU1FX01BVENIRVIsICgnbGVnYWN5JywpKSwKICAgICAgICAndmVyc2lvbic6IChWRVJTSU9OX01BVENIRVIsICgnbGVnYWN5JywpKSwKICAgICAgICAnc3VtbWFyeSc6IChTVU1NQVJZX01BVENIRVIsICgnbGVnYWN5JywpKSwKICAgIH0KCiAgICBfX3Nsb3RzX18gPSAoJ19sZWdhY3knLCAnX2RhdGEnLCAnc2NoZW1lJykKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aD1Ob25lLCBmaWxlb2JqPU5vbmUsIG1hcHBpbmc9Tm9uZSwKICAgICAgICAgICAgICAgICBzY2hlbWU9J2RlZmF1bHQnKToKICAgICAgICBpZiBbcGF0aCwgZmlsZW9iaiwgbWFwcGluZ10uY291bnQoTm9uZSkgPCAyOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ3BhdGgsIGZpbGVvYmogYW5kIG1hcHBpbmcgYXJlIGV4Y2x1c2l2ZScpCiAgICAgICAgc2VsZi5fbGVnYWN5ID0gTm9uZQogICAgICAgIHNlbGYuX2RhdGEgPSBOb25lCiAgICAgICAgc2VsZi5zY2hlbWUgPSBzY2hlbWUKICAgICAgICAjaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCiAgICAgICAgaWYgbWFwcGluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5fdmFsaWRhdGVfbWFwcGluZyhtYXBwaW5nLCBzY2hlbWUpCiAgICAgICAgICAgICAgICBzZWxmLl9kYXRhID0gbWFwcGluZwogICAgICAgICAgICBleGNlcHQgTWV0YWRhdGFVbnJlY29nbml6ZWRWZXJzaW9uRXJyb3I6CiAgICAgICAgICAgICAgICBzZWxmLl9sZWdhY3kgPSBMZWdhY3lNZXRhZGF0YShtYXBwaW5nPW1hcHBpbmcsIHNjaGVtZT1zY2hlbWUpCiAgICAgICAgICAgICAgICBzZWxmLnZhbGlkYXRlKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBkYXRhID0gTm9uZQogICAgICAgICAgICBpZiBwYXRoOgogICAgICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCiAgICAgICAgICAgIGVsaWYgZmlsZW9iajoKICAgICAgICAgICAgICAgIGRhdGEgPSBmaWxlb2JqLnJlYWQoKQogICAgICAgICAgICBpZiBkYXRhIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAjIEluaXRpYWxpc2VkIHdpdGggbm8gYXJncyAtIHRvIGJlIGFkZGVkCiAgICAgICAgICAgICAgICBzZWxmLl9kYXRhID0gewogICAgICAgICAgICAgICAgICAgICdtZXRhZGF0YV92ZXJzaW9uJzogc2VsZi5NRVRBREFUQV9WRVJTSU9OLAogICAgICAgICAgICAgICAgICAgICdnZW5lcmF0b3InOiBzZWxmLkdFTkVSQVRPUiwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRhdGEsIHRleHRfdHlwZSk6CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGF0YSA9IGpzb24ubG9hZHMoZGF0YSkKICAgICAgICAgICAgICAgICAgICBzZWxmLl92YWxpZGF0ZV9tYXBwaW5nKHNlbGYuX2RhdGEsIHNjaGVtZSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICMgTm90ZTogTWV0YWRhdGFVbnJlY29nbml6ZWRWZXJzaW9uRXJyb3IgZG9lcyBub3QKICAgICAgICAgICAgICAgICAgICAjIGluaGVyaXQgZnJvbSBWYWx1ZUVycm9yIChpdCdzIGEgRGlzdGxpYkV4Y2VwdGlvbiwKICAgICAgICAgICAgICAgICAgICAjIHdoaWNoIHNob3VsZCBub3QgaW5oZXJpdCBmcm9tIFZhbHVlRXJyb3IpLgogICAgICAgICAgICAgICAgICAgICMgVGhlIFZhbHVlRXJyb3IgY29tZXMgZnJvbSB0aGUganNvbi5sb2FkIC0gaWYgdGhhdAogICAgICAgICAgICAgICAgICAgICMgc3VjY2VlZHMgYW5kIHdlIGdldCBhIHZhbGlkYXRpb24gZXJyb3IsIHdlIHdhbnQKICAgICAgICAgICAgICAgICAgICAjIHRoYXQgdG8gcHJvcGFnYXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbGVnYWN5ID0gTGVnYWN5TWV0YWRhdGEoZmlsZW9iaj1TdHJpbmdJTyhkYXRhKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWU9c2NoZW1lKQogICAgICAgICAgICAgICAgICAgIHNlbGYudmFsaWRhdGUoKQoKICAgIGNvbW1vbl9rZXlzID0gc2V0KCgnbmFtZScsICd2ZXJzaW9uJywgJ2xpY2Vuc2UnLCAna2V5d29yZHMnLCAnc3VtbWFyeScpKQoKICAgIG5vbmVfbGlzdCA9IChOb25lLCBsaXN0KQogICAgbm9uZV9kaWN0ID0gKE5vbmUsIGRpY3QpCgogICAgbWFwcGVkX2tleXMgPSB7CiAgICAgICAgJ3J1bl9yZXF1aXJlcyc6ICgnUmVxdWlyZXMtRGlzdCcsIGxpc3QpLAogICAgICAgICdidWlsZF9yZXF1aXJlcyc6ICgnU2V0dXAtUmVxdWlyZXMtRGlzdCcsIGxpc3QpLAogICAgICAgICdkZXZfcmVxdWlyZXMnOiBub25lX2xpc3QsCiAgICAgICAgJ3Rlc3RfcmVxdWlyZXMnOiBub25lX2xpc3QsCiAgICAgICAgJ21ldGFfcmVxdWlyZXMnOiBub25lX2xpc3QsCiAgICAgICAgJ2V4dHJhcyc6ICgnUHJvdmlkZXMtRXh0cmEnLCBsaXN0KSwKICAgICAgICAnbW9kdWxlcyc6IG5vbmVfbGlzdCwKICAgICAgICAnbmFtZXNwYWNlcyc6IG5vbmVfbGlzdCwKICAgICAgICAnZXhwb3J0cyc6IG5vbmVfZGljdCwKICAgICAgICAnY29tbWFuZHMnOiBub25lX2RpY3QsCiAgICAgICAgJ2NsYXNzaWZpZXJzJzogKCdDbGFzc2lmaWVyJywgbGlzdCksCiAgICAgICAgJ3NvdXJjZV91cmwnOiAoJ0Rvd25sb2FkLVVSTCcsIE5vbmUpLAogICAgICAgICdtZXRhZGF0YV92ZXJzaW9uJzogKCdNZXRhZGF0YS1WZXJzaW9uJywgTm9uZSksCiAgICB9CgogICAgZGVsIG5vbmVfbGlzdCwgbm9uZV9kaWN0CgogICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oc2VsZiwga2V5KToKICAgICAgICBjb21tb24gPSBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCAnY29tbW9uX2tleXMnKQogICAgICAgIG1hcHBlZCA9IG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsICdtYXBwZWRfa2V5cycpCiAgICAgICAgaWYga2V5IGluIG1hcHBlZDoKICAgICAgICAgICAgbGssIG1ha2VyID0gbWFwcGVkW2tleV0KICAgICAgICAgICAgaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICAgICAgaWYgbGsgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBOb25lIGlmIG1ha2VyIGlzIE5vbmUgZWxzZSBtYWtlcigpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2xlZ2FjeS5nZXQobGspCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IE5vbmUgaWYgbWFrZXIgaXMgTm9uZSBlbHNlIG1ha2VyKCkKICAgICAgICAgICAgICAgIGlmIGtleSBub3QgaW4gKCdjb21tYW5kcycsICdleHBvcnRzJywgJ21vZHVsZXMnLCAnbmFtZXNwYWNlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2xhc3NpZmllcnMnKToKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9kYXRhLmdldChrZXksIHZhbHVlKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIHNwZWNpYWwgY2FzZXMgZm9yIFBFUCA0NTkKICAgICAgICAgICAgICAgICAgICBzZW50aW5lbCA9IG9iamVjdCgpCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VudGluZWwKICAgICAgICAgICAgICAgICAgICBkID0gc2VsZi5fZGF0YS5nZXQoJ2V4dGVuc2lvbnMnKQogICAgICAgICAgICAgICAgICAgIGlmIGQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGtleSA9PSAnY29tbWFuZHMnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZC5nZXQoJ3B5dGhvbi5jb21tYW5kcycsIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGtleSA9PSAnY2xhc3NpZmllcnMnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGQuZ2V0KCdweXRob24uZGV0YWlscycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGQuZ2V0KGtleSwgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZC5nZXQoJ3B5dGhvbi5leHBvcnRzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBzZWxmLl9kYXRhLmdldCgncHl0aG9uLmV4cG9ydHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkLmdldChrZXksIHZhbHVlKQogICAgICAgICAgICAgICAgICAgIGlmIHJlc3VsdCBpcyBzZW50aW5lbDoKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUKICAgICAgICBlbGlmIGtleSBub3QgaW4gY29tbW9uOgogICAgICAgICAgICByZXN1bHQgPSBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBrZXkpCiAgICAgICAgZWxpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2xlZ2FjeS5nZXQoa2V5KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2RhdGEuZ2V0KGtleSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF92YWxpZGF0ZV92YWx1ZShzZWxmLCBrZXksIHZhbHVlLCBzY2hlbWU9Tm9uZSk6CiAgICAgICAgaWYga2V5IGluIHNlbGYuU1lOVEFYX1ZBTElEQVRPUlM6CiAgICAgICAgICAgIHBhdHRlcm4sIGV4Y2x1c2lvbnMgPSBzZWxmLlNZTlRBWF9WQUxJREFUT1JTW2tleV0KICAgICAgICAgICAgaWYgKHNjaGVtZSBvciBzZWxmLnNjaGVtZSkgbm90IGluIGV4Y2x1c2lvbnM6CiAgICAgICAgICAgICAgICBtID0gcGF0dGVybi5tYXRjaCh2YWx1ZSkKICAgICAgICAgICAgICAgIGlmIG5vdCBtOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIE1ldGFkYXRhSW52YWxpZEVycm9yKCInJXMnIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlICclcycgcHJvcGVydHkiICUgKHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSkpCgogICAgZGVmIF9fc2V0YXR0cl9fKHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ZhbGlkYXRlX3ZhbHVlKGtleSwgdmFsdWUpCiAgICAgICAgY29tbW9uID0gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgJ2NvbW1vbl9rZXlzJykKICAgICAgICBtYXBwZWQgPSBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCAnbWFwcGVkX2tleXMnKQogICAgICAgIGlmIGtleSBpbiBtYXBwZWQ6CiAgICAgICAgICAgIGxrLCBfID0gbWFwcGVkW2tleV0KICAgICAgICAgICAgaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICAgICAgaWYgbGsgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgICAgICAgICAgICBzZWxmLl9sZWdhY3lbbGtdID0gdmFsdWUKICAgICAgICAgICAgZWxpZiBrZXkgbm90IGluICgnY29tbWFuZHMnLCAnZXhwb3J0cycsICdtb2R1bGVzJywgJ25hbWVzcGFjZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjbGFzc2lmaWVycycpOgogICAgICAgICAgICAgICAgc2VsZi5fZGF0YVtrZXldID0gdmFsdWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgc3BlY2lhbCBjYXNlcyBmb3IgUEVQIDQ1OQogICAgICAgICAgICAgICAgZCA9IHNlbGYuX2RhdGEuc2V0ZGVmYXVsdCgnZXh0ZW5zaW9ucycsIHt9KQogICAgICAgICAgICAgICAgaWYga2V5ID09ICdjb21tYW5kcyc6CiAgICAgICAgICAgICAgICAgICAgZFsncHl0aG9uLmNvbW1hbmRzJ10gPSB2YWx1ZQogICAgICAgICAgICAgICAgZWxpZiBrZXkgPT0gJ2NsYXNzaWZpZXJzJzoKICAgICAgICAgICAgICAgICAgICBkID0gZC5zZXRkZWZhdWx0KCdweXRob24uZGV0YWlscycsIHt9KQogICAgICAgICAgICAgICAgICAgIGRba2V5XSA9IHZhbHVlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGQgPSBkLnNldGRlZmF1bHQoJ3B5dGhvbi5leHBvcnRzJywge30pCiAgICAgICAgICAgICAgICAgICAgZFtrZXldID0gdmFsdWUKICAgICAgICBlbGlmIGtleSBub3QgaW4gY29tbW9uOgogICAgICAgICAgICBvYmplY3QuX19zZXRhdHRyX18oc2VsZiwga2V5LCB2YWx1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBrZXkgPT0gJ2tleXdvcmRzJzoKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWU6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3BsaXQoKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gW10KICAgICAgICAgICAgaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICAgICAgc2VsZi5fbGVnYWN5W2tleV0gPSB2YWx1ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5fZGF0YVtrZXldID0gdmFsdWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBuYW1lX2FuZF92ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBfZ2V0X25hbWVfYW5kX3ZlcnNpb24oc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24sIFRydWUpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJvdmlkZXMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9sZWdhY3lbJ1Byb3ZpZGVzLURpc3QnXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2RhdGEuc2V0ZGVmYXVsdCgncHJvdmlkZXMnLCBbXSkKICAgICAgICBzID0gJyVzICglcyknICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKQogICAgICAgIGlmIHMgbm90IGluIHJlc3VsdDoKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBAcHJvdmlkZXMuc2V0dGVyCiAgICBkZWYgcHJvdmlkZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgc2VsZi5fbGVnYWN5WydQcm92aWRlcy1EaXN0J10gPSB2YWx1ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX2RhdGFbJ3Byb3ZpZGVzJ10gPSB2YWx1ZQoKICAgIGRlZiBnZXRfcmVxdWlyZW1lbnRzKHNlbGYsIHJlcXRzLCBleHRyYXM9Tm9uZSwgZW52PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEJhc2UgbWV0aG9kIHRvIGdldCBkZXBlbmRlbmNpZXMsIGdpdmVuIGEgc2V0IG9mIGV4dHJhcwogICAgICAgIHRvIHNhdGlzZnkgYW5kIGFuIG9wdGlvbmFsIGVudmlyb25tZW50IGNvbnRleHQuCiAgICAgICAgOnBhcmFtIHJlcXRzOiBBIGxpc3Qgb2Ygc29tZXRpbWVzLXdhbnRlZCBkZXBlbmRlbmNpZXMsCiAgICAgICAgICAgICAgICAgICAgICBwZXJoYXBzIGRlcGVuZGVudCBvbiBleHRyYXMgYW5kIGVudmlyb25tZW50LgogICAgICAgIDpwYXJhbSBleHRyYXM6IEEgbGlzdCBvZiBvcHRpb25hbCBjb21wb25lbnRzIGJlaW5nIHJlcXVlc3RlZC4KICAgICAgICA6cGFyYW0gZW52OiBBbiBvcHRpb25hbCBlbnZpcm9ubWVudCBmb3IgbWFya2VyIGV2YWx1YXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICByZXN1bHQgPSByZXF0cwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgICAgIGV4dHJhcyA9IGdldF9leHRyYXMoZXh0cmFzIG9yIFtdLCBzZWxmLmV4dHJhcykKICAgICAgICAgICAgZm9yIGQgaW4gcmVxdHM6CiAgICAgICAgICAgICAgICBpZiAnZXh0cmEnIG5vdCBpbiBkIGFuZCAnZW52aXJvbm1lbnQnIG5vdCBpbiBkOgogICAgICAgICAgICAgICAgICAgICMgdW5jb25kaXRpb25hbAogICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBUcnVlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmICdleHRyYScgbm90IGluIGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICMgTm90IGV4dHJhLWRlcGVuZGVudCAtIG9ubHkgZW52aXJvbm1lbnQtZGVwZW5kZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IGQuZ2V0KCdleHRyYScpIGluIGV4dHJhcwogICAgICAgICAgICAgICAgICAgIGlmIGluY2x1ZGU6CiAgICAgICAgICAgICAgICAgICAgICAgICMgTm90IGV4Y2x1ZGVkIGJlY2F1c2Ugb2YgZXh0cmFzLCBjaGVjayBlbnZpcm9ubWVudAogICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIgPSBkLmdldCgnZW52aXJvbm1lbnQnKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBtYXJrZXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gaW50ZXJwcmV0KG1hcmtlciwgZW52KQogICAgICAgICAgICAgICAgaWYgaW5jbHVkZToKICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXh0ZW5kKGRbJ3JlcXVpcmVzJ10pCiAgICAgICAgICAgIGZvciBrZXkgaW4gKCdidWlsZCcsICdkZXYnLCAndGVzdCcpOgogICAgICAgICAgICAgICAgZSA9ICc6JXM6JyAlIGtleQogICAgICAgICAgICAgICAgaWYgZSBpbiBleHRyYXM6CiAgICAgICAgICAgICAgICAgICAgZXh0cmFzLnJlbW92ZShlKQogICAgICAgICAgICAgICAgICAgICMgQSByZWN1cnNpdmUgY2FsbCwgYnV0IGl0IHNob3VsZCB0ZXJtaW5hdGUgc2luY2UgJ3Rlc3QnCiAgICAgICAgICAgICAgICAgICAgIyBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGV4dHJhcwogICAgICAgICAgICAgICAgICAgIHJlcXRzID0gc2VsZi5fZGF0YS5nZXQoJyVzX3JlcXVpcmVzJyAlIGtleSwgW10pCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV4dGVuZChzZWxmLmdldF9yZXF1aXJlbWVudHMocmVxdHMsIGV4dHJhcz1leHRyYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PWVudikpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRpY3Rpb25hcnkoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZnJvbV9sZWdhY3koKQogICAgICAgIHJldHVybiBzZWxmLl9kYXRhCgogICAgQHByb3BlcnR5CiAgICBkZWYgZGVwZW5kZW5jaWVzKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBleHRyYWN0X2J5X2tleShzZWxmLl9kYXRhLCBzZWxmLkRFUEVOREVOQ1lfS0VZUykKCiAgICBAZGVwZW5kZW5jaWVzLnNldHRlcgogICAgZGVmIGRlcGVuZGVuY2llcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fZGF0YS51cGRhdGUodmFsdWUpCgogICAgZGVmIF92YWxpZGF0ZV9tYXBwaW5nKHNlbGYsIG1hcHBpbmcsIHNjaGVtZSk6CiAgICAgICAgaWYgbWFwcGluZy5nZXQoJ21ldGFkYXRhX3ZlcnNpb24nKSAhPSBzZWxmLk1FVEFEQVRBX1ZFUlNJT046CiAgICAgICAgICAgIHJhaXNlIE1ldGFkYXRhVW5yZWNvZ25pemVkVmVyc2lvbkVycm9yKCkKICAgICAgICBtaXNzaW5nID0gW10KICAgICAgICBmb3Iga2V5LCBleGNsdXNpb25zIGluIHNlbGYuTUFOREFUT1JZX0tFWVMuaXRlbXMoKToKICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBtYXBwaW5nOgogICAgICAgICAgICAgICAgaWYgc2NoZW1lIG5vdCBpbiBleGNsdXNpb25zOgogICAgICAgICAgICAgICAgICAgIG1pc3NpbmcuYXBwZW5kKGtleSkKICAgICAgICBpZiBtaXNzaW5nOgogICAgICAgICAgICBtc2cgPSAnTWlzc2luZyBtZXRhZGF0YSBpdGVtczogJXMnICUgJywgJy5qb2luKG1pc3NpbmcpCiAgICAgICAgICAgIHJhaXNlIE1ldGFkYXRhTWlzc2luZ0Vycm9yKG1zZykKICAgICAgICBmb3IgaywgdiBpbiBtYXBwaW5nLml0ZW1zKCk6CiAgICAgICAgICAgIHNlbGYuX3ZhbGlkYXRlX3ZhbHVlKGssIHYsIHNjaGVtZSkKCiAgICBkZWYgdmFsaWRhdGUoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICBtaXNzaW5nLCB3YXJuaW5ncyA9IHNlbGYuX2xlZ2FjeS5jaGVjayhUcnVlKQogICAgICAgICAgICBpZiBtaXNzaW5nIG9yIHdhcm5pbmdzOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ01ldGFkYXRhOiBtaXNzaW5nOiAlcywgd2FybmluZ3M6ICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmcsIHdhcm5pbmdzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX3ZhbGlkYXRlX21hcHBpbmcoc2VsZi5fZGF0YSwgc2VsZi5zY2hlbWUpCgogICAgZGVmIHRvZGljdChzZWxmKToKICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9sZWdhY3kudG9kaWN0KFRydWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gZXh0cmFjdF9ieV9rZXkoc2VsZi5fZGF0YSwgc2VsZi5JTkRFWF9LRVlTKQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9mcm9tX2xlZ2FjeShzZWxmKToKICAgICAgICBhc3NlcnQgc2VsZi5fbGVnYWN5IGFuZCBub3Qgc2VsZi5fZGF0YQogICAgICAgIHJlc3VsdCA9IHsKICAgICAgICAgICAgJ21ldGFkYXRhX3ZlcnNpb24nOiBzZWxmLk1FVEFEQVRBX1ZFUlNJT04sCiAgICAgICAgICAgICdnZW5lcmF0b3InOiBzZWxmLkdFTkVSQVRPUiwKICAgICAgICB9CiAgICAgICAgbG1kID0gc2VsZi5fbGVnYWN5LnRvZGljdChUcnVlKSAgICAgIyBza2lwIG1pc3Npbmcgb25lcwogICAgICAgIGZvciBrIGluICgnbmFtZScsICd2ZXJzaW9uJywgJ2xpY2Vuc2UnLCAnc3VtbWFyeScsICdkZXNjcmlwdGlvbicsCiAgICAgICAgICAgICAgICAgICdjbGFzc2lmaWVyJyk6CiAgICAgICAgICAgIGlmIGsgaW4gbG1kOgogICAgICAgICAgICAgICAgaWYgayA9PSAnY2xhc3NpZmllcic6CiAgICAgICAgICAgICAgICAgICAgbmsgPSAnY2xhc3NpZmllcnMnCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5rID0gawogICAgICAgICAgICAgICAgcmVzdWx0W25rXSA9IGxtZFtrXQogICAgICAgIGt3ID0gbG1kLmdldCgnS2V5d29yZHMnLCBbXSkKICAgICAgICBpZiBrdyA9PSBbJyddOgogICAgICAgICAgICBrdyA9IFtdCiAgICAgICAgcmVzdWx0WydrZXl3b3JkcyddID0ga3cKICAgICAgICBrZXlzID0gKCgncmVxdWlyZXNfZGlzdCcsICdydW5fcmVxdWlyZXMnKSwKICAgICAgICAgICAgICAgICgnc2V0dXBfcmVxdWlyZXNfZGlzdCcsICdidWlsZF9yZXF1aXJlcycpKQogICAgICAgIGZvciBvaywgbmsgaW4ga2V5czoKICAgICAgICAgICAgaWYgb2sgaW4gbG1kIGFuZCBsbWRbb2tdOgogICAgICAgICAgICAgICAgcmVzdWx0W25rXSA9IFt7J3JlcXVpcmVzJzogbG1kW29rXX1dCiAgICAgICAgcmVzdWx0Wydwcm92aWRlcyddID0gc2VsZi5wcm92aWRlcwogICAgICAgIGF1dGhvciA9IHt9CiAgICAgICAgbWFpbnRhaW5lciA9IHt9CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIExFR0FDWV9NQVBQSU5HID0gewogICAgICAgICduYW1lJzogJ05hbWUnLAogICAgICAgICd2ZXJzaW9uJzogJ1ZlcnNpb24nLAogICAgICAgICdsaWNlbnNlJzogJ0xpY2Vuc2UnLAogICAgICAgICdzdW1tYXJ5JzogJ1N1bW1hcnknLAogICAgICAgICdkZXNjcmlwdGlvbic6ICdEZXNjcmlwdGlvbicsCiAgICAgICAgJ2NsYXNzaWZpZXJzJzogJ0NsYXNzaWZpZXInLAogICAgfQoKICAgIGRlZiBfdG9fbGVnYWN5KHNlbGYpOgogICAgICAgIGRlZiBwcm9jZXNzX2VudHJpZXMoZW50cmllcyk6CiAgICAgICAgICAgIHJlcXRzID0gc2V0KCkKICAgICAgICAgICAgZm9yIGUgaW4gZW50cmllczoKICAgICAgICAgICAgICAgIGV4dHJhID0gZS5nZXQoJ2V4dHJhJykKICAgICAgICAgICAgICAgIGVudiA9IGUuZ2V0KCdlbnZpcm9ubWVudCcpCiAgICAgICAgICAgICAgICBybGlzdCA9IGVbJ3JlcXVpcmVzJ10KICAgICAgICAgICAgICAgIGZvciByIGluIHJsaXN0OgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBlbnYgYW5kIG5vdCBleHRyYToKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdHMuYWRkKHIpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gJycKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXh0cmE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIgPSAnZXh0cmEgPT0gIiVzIicgJSBleHRyYQogICAgICAgICAgICAgICAgICAgICAgICBpZiBlbnY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBtYXJrZXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gJyglcykgYW5kICVzJyAlIChlbnYsIG1hcmtlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gZW52CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXRzLmFkZCgnOycuam9pbigociwgbWFya2VyKSkpCiAgICAgICAgICAgIHJldHVybiByZXF0cwoKICAgICAgICBhc3NlcnQgc2VsZi5fZGF0YSBhbmQgbm90IHNlbGYuX2xlZ2FjeQogICAgICAgIHJlc3VsdCA9IExlZ2FjeU1ldGFkYXRhKCkKICAgICAgICBubWQgPSBzZWxmLl9kYXRhCiAgICAgICAgZm9yIG5rLCBvayBpbiBzZWxmLkxFR0FDWV9NQVBQSU5HLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIG5rIGluIG5tZDoKICAgICAgICAgICAgICAgIHJlc3VsdFtva10gPSBubWRbbmtdCiAgICAgICAgcjEgPSBwcm9jZXNzX2VudHJpZXMoc2VsZi5ydW5fcmVxdWlyZXMgKyBzZWxmLm1ldGFfcmVxdWlyZXMpCiAgICAgICAgcjIgPSBwcm9jZXNzX2VudHJpZXMoc2VsZi5idWlsZF9yZXF1aXJlcyArIHNlbGYuZGV2X3JlcXVpcmVzKQogICAgICAgIGlmIHNlbGYuZXh0cmFzOgogICAgICAgICAgICByZXN1bHRbJ1Byb3ZpZGVzLUV4dHJhJ10gPSBzb3J0ZWQoc2VsZi5leHRyYXMpCiAgICAgICAgcmVzdWx0WydSZXF1aXJlcy1EaXN0J10gPSBzb3J0ZWQocjEpCiAgICAgICAgcmVzdWx0WydTZXR1cC1SZXF1aXJlcy1EaXN0J10gPSBzb3J0ZWQocjIpCiAgICAgICAgIyBUT0RPOiBvdGhlciBmaWVsZHMgc3VjaCBhcyBjb250YWN0cwogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgd3JpdGUoc2VsZiwgcGF0aD1Ob25lLCBmaWxlb2JqPU5vbmUsIGxlZ2FjeT1GYWxzZSwgc2tpcF91bmtub3duPVRydWUpOgogICAgICAgIGlmIFtwYXRoLCBmaWxlb2JqXS5jb3VudChOb25lKSAhPSAxOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdFeGFjdGx5IG9uZSBvZiBwYXRoIGFuZCBmaWxlb2JqIGlzIG5lZWRlZCcpCiAgICAgICAgc2VsZi52YWxpZGF0ZSgpCiAgICAgICAgaWYgbGVnYWN5OgogICAgICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgICAgICBsZWdhY3lfbWQgPSBzZWxmLl9sZWdhY3kKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxlZ2FjeV9tZCA9IHNlbGYuX3RvX2xlZ2FjeSgpCiAgICAgICAgICAgIGlmIHBhdGg6CiAgICAgICAgICAgICAgICBsZWdhY3lfbWQud3JpdGUocGF0aCwgc2tpcF91bmtub3duPXNraXBfdW5rbm93bikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxlZ2FjeV9tZC53cml0ZV9maWxlKGZpbGVvYmosIHNraXBfdW5rbm93bj1za2lwX3Vua25vd24pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICAgICAgZCA9IHNlbGYuX2Zyb21fbGVnYWN5KCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGQgPSBzZWxmLl9kYXRhCiAgICAgICAgICAgIGlmIGZpbGVvYmo6CiAgICAgICAgICAgICAgICBqc29uLmR1bXAoZCwgZmlsZW9iaiwgZW5zdXJlX2FzY2lpPVRydWUsIGluZGVudD0yLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRfa2V5cz1UcnVlKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgd2l0aCBjb2RlY3Mub3BlbihwYXRoLCAndycsICd1dGYtOCcpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAganNvbi5kdW1wKGQsIGYsIGVuc3VyZV9hc2NpaT1UcnVlLCBpbmRlbnQ9MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydF9rZXlzPVRydWUpCgogICAgZGVmIGFkZF9yZXF1aXJlbWVudHMoc2VsZiwgcmVxdWlyZW1lbnRzKToKICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgIHNlbGYuX2xlZ2FjeS5hZGRfcmVxdWlyZW1lbnRzKHJlcXVpcmVtZW50cykKICAgICAgICBlbHNlOgogICAgICAgICAgICBydW5fcmVxdWlyZXMgPSBzZWxmLl9kYXRhLnNldGRlZmF1bHQoJ3J1bl9yZXF1aXJlcycsIFtdKQogICAgICAgICAgICBhbHdheXMgPSBOb25lCiAgICAgICAgICAgIGZvciBlbnRyeSBpbiBydW5fcmVxdWlyZXM6CiAgICAgICAgICAgICAgICBpZiAnZW52aXJvbm1lbnQnIG5vdCBpbiBlbnRyeSBhbmQgJ2V4dHJhJyBub3QgaW4gZW50cnk6CiAgICAgICAgICAgICAgICAgICAgYWx3YXlzID0gZW50cnkKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBhbHdheXMgaXMgTm9uZToKICAgICAgICAgICAgICAgIGFsd2F5cyA9IHsgJ3JlcXVpcmVzJzogcmVxdWlyZW1lbnRzIH0KICAgICAgICAgICAgICAgIHJ1bl9yZXF1aXJlcy5pbnNlcnQoMCwgYWx3YXlzKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcnNldCA9IHNldChhbHdheXNbJ3JlcXVpcmVzJ10pIHwgc2V0KHJlcXVpcmVtZW50cykKICAgICAgICAgICAgICAgIGFsd2F5c1sncmVxdWlyZXMnXSA9IHNvcnRlZChyc2V0KQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICBuYW1lID0gc2VsZi5uYW1lIG9yICcobm8gbmFtZSknCiAgICAgICAgdmVyc2lvbiA9IHNlbGYudmVyc2lvbiBvciAnbm8gdmVyc2lvbicKICAgICAgICByZXR1cm4gJzwlcyAlcyAlcyAoJXMpPicgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWV0YWRhdGFfdmVyc2lvbiwgbmFtZSwgdmVyc2lvbikKUEsDBBQAAAAAAAAAIQDIt0WYDioAAA4qAAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvcmVzb3VyY2VzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMy0yMDE2IFZpbmF5IFNhamlwLgojIExpY2Vuc2VkIHRvIHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciBhIGNvbnRyaWJ1dG9yIGFncmVlbWVudC4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCgppbXBvcnQgYmlzZWN0CmltcG9ydCBpbwppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHBrZ3V0aWwKaW1wb3J0IHNodXRpbAppbXBvcnQgc3lzCmltcG9ydCB0eXBlcwppbXBvcnQgemlwaW1wb3J0Cgpmcm9tIC4gaW1wb3J0IERpc3RsaWJFeGNlcHRpb24KZnJvbSAudXRpbCBpbXBvcnQgY2FjaGVkX3Byb3BlcnR5LCBnZXRfY2FjaGVfYmFzZSwgcGF0aF90b19jYWNoZV9kaXIsIENhY2hlCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjYWNoZSA9IE5vbmUgICAgIyBjcmVhdGVkIHdoZW4gbmVlZGVkCgoKY2xhc3MgUmVzb3VyY2VDYWNoZShDYWNoZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgYmFzZT1Ob25lKToKICAgICAgICBpZiBiYXNlIGlzIE5vbmU6CiAgICAgICAgICAgICMgVXNlIG5hdGl2ZSBzdHJpbmcgdG8gYXZvaWQgaXNzdWVzIG9uIDIueDogc2VlIFB5dGhvbiAjMjAxNDAuCiAgICAgICAgICAgIGJhc2UgPSBvcy5wYXRoLmpvaW4oZ2V0X2NhY2hlX2Jhc2UoKSwgc3RyKCdyZXNvdXJjZS1jYWNoZScpKQogICAgICAgIHN1cGVyKFJlc291cmNlQ2FjaGUsIHNlbGYpLl9faW5pdF9fKGJhc2UpCgogICAgZGVmIGlzX3N0YWxlKHNlbGYsIHJlc291cmNlLCBwYXRoKToKICAgICAgICAiIiIKICAgICAgICBJcyB0aGUgY2FjaGUgc3RhbGUgZm9yIHRoZSBnaXZlbiByZXNvdXJjZT8KCiAgICAgICAgOnBhcmFtIHJlc291cmNlOiBUaGUgOmNsYXNzOmBSZXNvdXJjZWAgYmVpbmcgY2FjaGVkLgogICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aCBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIGNhY2hlLgogICAgICAgIDpyZXR1cm46IFRydWUgaWYgdGhlIGNhY2hlIGlzIHN0YWxlLgogICAgICAgICIiIgogICAgICAgICMgQ2FjaGUgaW52YWxpZGF0aW9uIGlzIGEgaGFyZCBwcm9ibGVtIDotKQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGdldChzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IGEgcmVzb3VyY2UgaW50byB0aGUgY2FjaGUsCgogICAgICAgIDpwYXJhbSByZXNvdXJjZTogQSA6Y2xhc3M6YFJlc291cmNlYCBpbnN0YW5jZS4KICAgICAgICA6cmV0dXJuOiBUaGUgcGF0aG5hbWUgb2YgdGhlIHJlc291cmNlIGluIHRoZSBjYWNoZS4KICAgICAgICAiIiIKICAgICAgICBwcmVmaXgsIHBhdGggPSByZXNvdXJjZS5maW5kZXIuZ2V0X2NhY2hlX2luZm8ocmVzb3VyY2UpCiAgICAgICAgaWYgcHJlZml4IGlzIE5vbmU6CiAgICAgICAgICAgIHJlc3VsdCA9IHBhdGgKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSBvcy5wYXRoLmpvaW4oc2VsZi5iYXNlLCBzZWxmLnByZWZpeF90b19kaXIocHJlZml4KSwgcGF0aCkKICAgICAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShyZXN1bHQpCiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgogICAgICAgICAgICAgICAgb3MubWFrZWRpcnMoZGlybmFtZSkKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHJlc3VsdCk6CiAgICAgICAgICAgICAgICBzdGFsZSA9IFRydWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHN0YWxlID0gc2VsZi5pc19zdGFsZShyZXNvdXJjZSwgcGF0aCkKICAgICAgICAgICAgaWYgc3RhbGU6CiAgICAgICAgICAgICAgICAjIHdyaXRlIHRoZSBieXRlcyBvZiB0aGUgcmVzb3VyY2UgdG8gdGhlIGNhY2hlIGxvY2F0aW9uCiAgICAgICAgICAgICAgICB3aXRoIG9wZW4ocmVzdWx0LCAnd2InKSBhcyBmOgogICAgICAgICAgICAgICAgICAgIGYud3JpdGUocmVzb3VyY2UuYnl0ZXMpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIFJlc291cmNlQmFzZShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbmRlciwgbmFtZSk6CiAgICAgICAgc2VsZi5maW5kZXIgPSBmaW5kZXIKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCgoKY2xhc3MgUmVzb3VyY2UoUmVzb3VyY2VCYXNlKToKICAgICIiIgogICAgQSBjbGFzcyByZXByZXNlbnRpbmcgYW4gaW4tcGFja2FnZSByZXNvdXJjZSwgc3VjaCBhcyBhIGRhdGEgZmlsZS4gVGhpcyBpcwogICAgbm90IG5vcm1hbGx5IGluc3RhbnRpYXRlZCBieSB1c2VyIGNvZGUsIGJ1dCByYXRoZXIgYnkgYQogICAgOmNsYXNzOmBSZXNvdXJjZUZpbmRlcmAgd2hpY2ggbWFuYWdlcyB0aGUgcmVzb3VyY2UuCiAgICAiIiIKICAgIGlzX2NvbnRhaW5lciA9IEZhbHNlICAgICAgICAjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CgogICAgZGVmIGFzX3N0cmVhbShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIHJlc291cmNlIGFzIGEgc3RyZWFtLgoKICAgICAgICBUaGlzIGlzIG5vdCBhIHByb3BlcnR5IHRvIG1ha2UgaXQgb2J2aW91cyB0aGF0IGl0IHJldHVybnMgYSBuZXcgc3RyZWFtCiAgICAgICAgZWFjaCB0aW1lLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLmZpbmRlci5nZXRfc3RyZWFtKHNlbGYpCgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIGZpbGVfcGF0aChzZWxmKToKICAgICAgICBnbG9iYWwgY2FjaGUKICAgICAgICBpZiBjYWNoZSBpcyBOb25lOgogICAgICAgICAgICBjYWNoZSA9IFJlc291cmNlQ2FjaGUoKQogICAgICAgIHJldHVybiBjYWNoZS5nZXQoc2VsZikKCiAgICBAY2FjaGVkX3Byb3BlcnR5CiAgICBkZWYgYnl0ZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZmluZGVyLmdldF9ieXRlcyhzZWxmKQoKICAgIEBjYWNoZWRfcHJvcGVydHkKICAgIGRlZiBzaXplKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmZpbmRlci5nZXRfc2l6ZShzZWxmKQoKCmNsYXNzIFJlc291cmNlQ29udGFpbmVyKFJlc291cmNlQmFzZSk6CiAgICBpc19jb250YWluZXIgPSBUcnVlICAgICAjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIHJlc291cmNlcyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5maW5kZXIuZ2V0X3Jlc291cmNlcyhzZWxmKQoKCmNsYXNzIFJlc291cmNlRmluZGVyKG9iamVjdCk6CiAgICAiIiIKICAgIFJlc291cmNlIGZpbmRlciBmb3IgZmlsZSBzeXN0ZW0gcmVzb3VyY2VzLgogICAgIiIiCgogICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKICAgICAgICBza2lwcGVkX2V4dGVuc2lvbnMgPSAoJy5weWMnLCAnLnB5bycsICcuY2xhc3MnKQogICAgZWxzZToKICAgICAgICBza2lwcGVkX2V4dGVuc2lvbnMgPSAoJy5weWMnLCAnLnB5bycpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgc2VsZi5tb2R1bGUgPSBtb2R1bGUKICAgICAgICBzZWxmLmxvYWRlciA9IGdldGF0dHIobW9kdWxlLCAnX19sb2FkZXJfXycsIE5vbmUpCiAgICAgICAgc2VsZi5iYXNlID0gb3MucGF0aC5kaXJuYW1lKGdldGF0dHIobW9kdWxlLCAnX19maWxlX18nLCAnJykpCgogICAgZGVmIF9hZGp1c3RfcGF0aChzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MucGF0aC5yZWFscGF0aChwYXRoKQoKICAgIGRlZiBfbWFrZV9wYXRoKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgICMgSXNzdWUgIzUwOiBuZWVkIHRvIHByZXNlcnZlIHR5cGUgb2YgcGF0aCBvbiBQeXRob24gMi54CiAgICAgICAgIyBsaWtlIG9zLnBhdGguX2dldF9zZXAKICAgICAgICBpZiBpc2luc3RhbmNlKHJlc291cmNlX25hbWUsIGJ5dGVzKTogICAgIyBzaG91bGQgb25seSBoYXBwZW4gb24gMi54CiAgICAgICAgICAgIHNlcCA9IGInLycKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZXAgPSAnLycKICAgICAgICBwYXJ0cyA9IHJlc291cmNlX25hbWUuc3BsaXQoc2VwKQogICAgICAgIHBhcnRzLmluc2VydCgwLCBzZWxmLmJhc2UpCiAgICAgICAgcmVzdWx0ID0gb3MucGF0aC5qb2luKCpwYXJ0cykKICAgICAgICByZXR1cm4gc2VsZi5fYWRqdXN0X3BhdGgocmVzdWx0KQoKICAgIGRlZiBfZmluZChzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMocGF0aCkKCiAgICBkZWYgZ2V0X2NhY2hlX2luZm8oc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIHJldHVybiBOb25lLCByZXNvdXJjZS5wYXRoCgogICAgZGVmIGZpbmQoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcGF0aCA9IHNlbGYuX21ha2VfcGF0aChyZXNvdXJjZV9uYW1lKQogICAgICAgIGlmIG5vdCBzZWxmLl9maW5kKHBhdGgpOgogICAgICAgICAgICByZXN1bHQgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgc2VsZi5faXNfZGlyZWN0b3J5KHBhdGgpOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gUmVzb3VyY2VDb250YWluZXIoc2VsZiwgcmVzb3VyY2VfbmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJlc291cmNlKHNlbGYsIHJlc291cmNlX25hbWUpCiAgICAgICAgICAgIHJlc3VsdC5wYXRoID0gcGF0aAogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZ2V0X3N0cmVhbShzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgcmV0dXJuIG9wZW4ocmVzb3VyY2UucGF0aCwgJ3JiJykKCiAgICBkZWYgZ2V0X2J5dGVzKHNlbGYsIHJlc291cmNlKToKICAgICAgICB3aXRoIG9wZW4ocmVzb3VyY2UucGF0aCwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgcmV0dXJuIGYucmVhZCgpCgogICAgZGVmIGdldF9zaXplKHNlbGYsIHJlc291cmNlKToKICAgICAgICByZXR1cm4gb3MucGF0aC5nZXRzaXplKHJlc291cmNlLnBhdGgpCgogICAgZGVmIGdldF9yZXNvdXJjZXMoc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIGRlZiBhbGxvd2VkKGYpOgogICAgICAgICAgICByZXR1cm4gKGYgIT0gJ19fcHljYWNoZV9fJyBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgZi5lbmRzd2l0aChzZWxmLnNraXBwZWRfZXh0ZW5zaW9ucykpCiAgICAgICAgcmV0dXJuIHNldChbZiBmb3IgZiBpbiBvcy5saXN0ZGlyKHJlc291cmNlLnBhdGgpIGlmIGFsbG93ZWQoZildKQoKICAgIGRlZiBpc19jb250YWluZXIoc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIHJldHVybiBzZWxmLl9pc19kaXJlY3RvcnkocmVzb3VyY2UucGF0aCkKCiAgICBfaXNfZGlyZWN0b3J5ID0gc3RhdGljbWV0aG9kKG9zLnBhdGguaXNkaXIpCgogICAgZGVmIGl0ZXJhdG9yKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJlc291cmNlID0gc2VsZi5maW5kKHJlc291cmNlX25hbWUpCiAgICAgICAgaWYgcmVzb3VyY2UgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHRvZG8gPSBbcmVzb3VyY2VdCiAgICAgICAgICAgIHdoaWxlIHRvZG86CiAgICAgICAgICAgICAgICByZXNvdXJjZSA9IHRvZG8ucG9wKDApCiAgICAgICAgICAgICAgICB5aWVsZCByZXNvdXJjZQogICAgICAgICAgICAgICAgaWYgcmVzb3VyY2UuaXNfY29udGFpbmVyOgogICAgICAgICAgICAgICAgICAgIHJuYW1lID0gcmVzb3VyY2UubmFtZQogICAgICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHJlc291cmNlLnJlc291cmNlczoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJuYW1lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X25hbWUgPSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfbmFtZSA9ICcvJy5qb2luKFtybmFtZSwgbmFtZV0pCiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gc2VsZi5maW5kKG5ld19uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBjaGlsZC5pc19jb250YWluZXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2RvLmFwcGVuZChjaGlsZCkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGNoaWxkCgoKY2xhc3MgWmlwUmVzb3VyY2VGaW5kZXIoUmVzb3VyY2VGaW5kZXIpOgogICAgIiIiCiAgICBSZXNvdXJjZSBmaW5kZXIgZm9yIHJlc291cmNlcyBpbiAuemlwIGZpbGVzLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKICAgICAgICBzdXBlcihaaXBSZXNvdXJjZUZpbmRlciwgc2VsZikuX19pbml0X18obW9kdWxlKQogICAgICAgIGFyY2hpdmUgPSBzZWxmLmxvYWRlci5hcmNoaXZlCiAgICAgICAgc2VsZi5wcmVmaXhfbGVuID0gMSArIGxlbihhcmNoaXZlKQogICAgICAgICMgUHlQeSBkb2Vzbid0IGhhdmUgYSBfZmlsZXMgYXR0ciBvbiB6aXBpbXBvcnRlciwgYW5kIHlvdSBjYW4ndCBzZXQgb25lCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLmxvYWRlciwgJ19maWxlcycpOgogICAgICAgICAgICBzZWxmLl9maWxlcyA9IHNlbGYubG9hZGVyLl9maWxlcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX2ZpbGVzID0gemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlW2FyY2hpdmVdCiAgICAgICAgc2VsZi5pbmRleCA9IHNvcnRlZChzZWxmLl9maWxlcykKCiAgICBkZWYgX2FkanVzdF9wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBwYXRoCgogICAgZGVmIF9maW5kKHNlbGYsIHBhdGgpOgogICAgICAgIHBhdGggPSBwYXRoW3NlbGYucHJlZml4X2xlbjpdCiAgICAgICAgaWYgcGF0aCBpbiBzZWxmLl9maWxlczoKICAgICAgICAgICAgcmVzdWx0ID0gVHJ1ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHBhdGggYW5kIHBhdGhbLTFdICE9IG9zLnNlcDoKICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoICsgb3Muc2VwCiAgICAgICAgICAgIGkgPSBiaXNlY3QuYmlzZWN0KHNlbGYuaW5kZXgsIHBhdGgpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuaW5kZXhbaV0uc3RhcnRzd2l0aChwYXRoKQogICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgaWYgbm90IHJlc3VsdDoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdfZmluZCBmYWlsZWQ6ICVyICVyJywgcGF0aCwgc2VsZi5sb2FkZXIucHJlZml4KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnX2ZpbmQgd29ya2VkOiAlciAlcicsIHBhdGgsIHNlbGYubG9hZGVyLnByZWZpeCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGdldF9jYWNoZV9pbmZvKHNlbGYsIHJlc291cmNlKToKICAgICAgICBwcmVmaXggPSBzZWxmLmxvYWRlci5hcmNoaXZlCiAgICAgICAgcGF0aCA9IHJlc291cmNlLnBhdGhbMSArIGxlbihwcmVmaXgpOl0KICAgICAgICByZXR1cm4gcHJlZml4LCBwYXRoCgogICAgZGVmIGdldF9ieXRlcyhzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgcmV0dXJuIHNlbGYubG9hZGVyLmdldF9kYXRhKHJlc291cmNlLnBhdGgpCgogICAgZGVmIGdldF9zdHJlYW0oc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIHJldHVybiBpby5CeXRlc0lPKHNlbGYuZ2V0X2J5dGVzKHJlc291cmNlKSkKCiAgICBkZWYgZ2V0X3NpemUoc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIHBhdGggPSByZXNvdXJjZS5wYXRoW3NlbGYucHJlZml4X2xlbjpdCiAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVzW3BhdGhdWzNdCgogICAgZGVmIGdldF9yZXNvdXJjZXMoc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIHBhdGggPSByZXNvdXJjZS5wYXRoW3NlbGYucHJlZml4X2xlbjpdCiAgICAgICAgaWYgcGF0aCBhbmQgcGF0aFstMV0gIT0gb3Muc2VwOgogICAgICAgICAgICBwYXRoICs9IG9zLnNlcAogICAgICAgIHBsZW4gPSBsZW4ocGF0aCkKICAgICAgICByZXN1bHQgPSBzZXQoKQogICAgICAgIGkgPSBiaXNlY3QuYmlzZWN0KHNlbGYuaW5kZXgsIHBhdGgpCiAgICAgICAgd2hpbGUgaSA8IGxlbihzZWxmLmluZGV4KToKICAgICAgICAgICAgaWYgbm90IHNlbGYuaW5kZXhbaV0uc3RhcnRzd2l0aChwYXRoKToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHMgPSBzZWxmLmluZGV4W2ldW3BsZW46XQogICAgICAgICAgICByZXN1bHQuYWRkKHMuc3BsaXQob3Muc2VwLCAxKVswXSkgICAjIG9ubHkgaW1tZWRpYXRlIGNoaWxkcmVuCiAgICAgICAgICAgIGkgKz0gMQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX2lzX2RpcmVjdG9yeShzZWxmLCBwYXRoKToKICAgICAgICBwYXRoID0gcGF0aFtzZWxmLnByZWZpeF9sZW46XQogICAgICAgIGlmIHBhdGggYW5kIHBhdGhbLTFdICE9IG9zLnNlcDoKICAgICAgICAgICAgcGF0aCArPSBvcy5zZXAKICAgICAgICBpID0gYmlzZWN0LmJpc2VjdChzZWxmLmluZGV4LCBwYXRoKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5pbmRleFtpXS5zdGFydHN3aXRoKHBhdGgpCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKX2ZpbmRlcl9yZWdpc3RyeSA9IHsKICAgIHR5cGUoTm9uZSk6IFJlc291cmNlRmluZGVyLAogICAgemlwaW1wb3J0LnppcGltcG9ydGVyOiBaaXBSZXNvdXJjZUZpbmRlcgp9Cgp0cnk6CiAgICAjIEluIFB5dGhvbiAzLjYsIF9mcm96ZW5faW1wb3J0bGliIC0+IF9mcm96ZW5faW1wb3J0bGliX2V4dGVybmFsCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IF9mcm96ZW5faW1wb3J0bGliX2V4dGVybmFsIGFzIF9maQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIGltcG9ydCBfZnJvemVuX2ltcG9ydGxpYiBhcyBfZmkKICAgIF9maW5kZXJfcmVnaXN0cnlbX2ZpLlNvdXJjZUZpbGVMb2FkZXJdID0gUmVzb3VyY2VGaW5kZXIKICAgIF9maW5kZXJfcmVnaXN0cnlbX2ZpLkZpbGVGaW5kZXJdID0gUmVzb3VyY2VGaW5kZXIKICAgIGRlbCBfZmkKZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgogICAgcGFzcwoKCmRlZiByZWdpc3Rlcl9maW5kZXIobG9hZGVyLCBmaW5kZXJfbWFrZXIpOgogICAgX2ZpbmRlcl9yZWdpc3RyeVt0eXBlKGxvYWRlcildID0gZmluZGVyX21ha2VyCgpfZmluZGVyX2NhY2hlID0ge30KCgpkZWYgZmluZGVyKHBhY2thZ2UpOgogICAgIiIiCiAgICBSZXR1cm4gYSByZXNvdXJjZSBmaW5kZXIgZm9yIGEgcGFja2FnZS4KICAgIDpwYXJhbSBwYWNrYWdlOiBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZS4KICAgIDpyZXR1cm46IEEgOmNsYXNzOmBSZXNvdXJjZUZpbmRlcmAgaW5zdGFuY2UgZm9yIHRoZSBwYWNrYWdlLgogICAgIiIiCiAgICBpZiBwYWNrYWdlIGluIF9maW5kZXJfY2FjaGU6CiAgICAgICAgcmVzdWx0ID0gX2ZpbmRlcl9jYWNoZVtwYWNrYWdlXQogICAgZWxzZToKICAgICAgICBpZiBwYWNrYWdlIG5vdCBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgX19pbXBvcnRfXyhwYWNrYWdlKQogICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW3BhY2thZ2VdCiAgICAgICAgcGF0aCA9IGdldGF0dHIobW9kdWxlLCAnX19wYXRoX18nLCBOb25lKQogICAgICAgIGlmIHBhdGggaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignWW91IGNhbm5vdCBnZXQgYSBmaW5kZXIgZm9yIGEgbW9kdWxlLCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29ubHkgZm9yIGEgcGFja2FnZScpCiAgICAgICAgbG9hZGVyID0gZ2V0YXR0cihtb2R1bGUsICdfX2xvYWRlcl9fJywgTm9uZSkKICAgICAgICBmaW5kZXJfbWFrZXIgPSBfZmluZGVyX3JlZ2lzdHJ5LmdldCh0eXBlKGxvYWRlcikpCiAgICAgICAgaWYgZmluZGVyX21ha2VyIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ1VuYWJsZSB0byBsb2NhdGUgZmluZGVyIGZvciAlcicgJSBwYWNrYWdlKQogICAgICAgIHJlc3VsdCA9IGZpbmRlcl9tYWtlcihtb2R1bGUpCiAgICAgICAgX2ZpbmRlcl9jYWNoZVtwYWNrYWdlXSA9IHJlc3VsdAogICAgcmV0dXJuIHJlc3VsdAoKCl9kdW1teV9tb2R1bGUgPSB0eXBlcy5Nb2R1bGVUeXBlKHN0cignX19kdW1teV9fJykpCgoKZGVmIGZpbmRlcl9mb3JfcGF0aChwYXRoKToKICAgICIiIgogICAgUmV0dXJuIGEgcmVzb3VyY2UgZmluZGVyIGZvciBhIHBhdGgsIHdoaWNoIHNob3VsZCByZXByZXNlbnQgYSBjb250YWluZXIuCgogICAgOnBhcmFtIHBhdGg6IFRoZSBwYXRoLgogICAgOnJldHVybjogQSA6Y2xhc3M6YFJlc291cmNlRmluZGVyYCBpbnN0YW5jZSBmb3IgdGhlIHBhdGguCiAgICAiIiIKICAgIHJlc3VsdCA9IE5vbmUKICAgICMgY2FsbHMgYW55IHBhdGggaG9va3MsIGdldHMgaW1wb3J0ZXIgaW50byBjYWNoZQogICAgcGtndXRpbC5nZXRfaW1wb3J0ZXIocGF0aCkKICAgIGxvYWRlciA9IHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLmdldChwYXRoKQogICAgZmluZGVyID0gX2ZpbmRlcl9yZWdpc3RyeS5nZXQodHlwZShsb2FkZXIpKQogICAgaWYgZmluZGVyOgogICAgICAgIG1vZHVsZSA9IF9kdW1teV9tb2R1bGUKICAgICAgICBtb2R1bGUuX19maWxlX18gPSBvcy5wYXRoLmpvaW4ocGF0aCwgJycpCiAgICAgICAgbW9kdWxlLl9fbG9hZGVyX18gPSBsb2FkZXIKICAgICAgICByZXN1bHQgPSBmaW5kZXIobW9kdWxlKQogICAgcmV0dXJuIHJlc3VsdApQSwMEFAAAAAAAAAAhALr/69t4OwAAeDsAAC4AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9zY3JpcHRzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMy0yMDE1IFZpbmF5IFNhamlwLgojIExpY2Vuc2VkIHRvIHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciBhIGNvbnRyaWJ1dG9yIGFncmVlbWVudC4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzdHJ1Y3QKaW1wb3J0IHN5cwoKZnJvbSAuY29tcGF0IGltcG9ydCBzeXNjb25maWcsIGRldGVjdF9lbmNvZGluZywgWmlwRmlsZQpmcm9tIC5yZXNvdXJjZXMgaW1wb3J0IGZpbmRlcgpmcm9tIC51dGlsIGltcG9ydCAoRmlsZU9wZXJhdG9yLCBnZXRfZXhwb3J0X2VudHJ5LCBjb252ZXJ0X3BhdGgsCiAgICAgICAgICAgICAgICAgICBnZXRfZXhlY3V0YWJsZSwgaW5fdmVudikKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKX0RFRkFVTFRfTUFOSUZFU1QgPSAnJycKPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pgo8YXNzZW1ibHkgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIiBtYW5pZmVzdFZlcnNpb249IjEuMCI+CiA8YXNzZW1ibHlJZGVudGl0eSB2ZXJzaW9uPSIxLjAuMC4wIgogcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPSJYODYiCiBuYW1lPSIlcyIKIHR5cGU9IndpbjMyIi8+CgogPCEtLSBJZGVudGlmeSB0aGUgYXBwbGljYXRpb24gc2VjdXJpdHkgcmVxdWlyZW1lbnRzLiAtLT4KIDx0cnVzdEluZm8geG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYzIj4KIDxzZWN1cml0eT4KIDxyZXF1ZXN0ZWRQcml2aWxlZ2VzPgogPHJlcXVlc3RlZEV4ZWN1dGlvbkxldmVsIGxldmVsPSJhc0ludm9rZXIiIHVpQWNjZXNzPSJmYWxzZSIvPgogPC9yZXF1ZXN0ZWRQcml2aWxlZ2VzPgogPC9zZWN1cml0eT4KIDwvdHJ1c3RJbmZvPgo8L2Fzc2VtYmx5PicnJy5zdHJpcCgpCgojIGNoZWNrIGlmIFB5dGhvbiBpcyBjYWxsZWQgb24gdGhlIGZpcnN0IGxpbmUgd2l0aCB0aGlzIGV4cHJlc3Npb24KRklSU1RfTElORV9SRSA9IHJlLmNvbXBpbGUoYideIyEuKnB5dGhvbnc/WzAtOS5dKihbIFx0XS4qKT8kJykKU0NSSVBUX1RFTVBMQVRFID0gJycnIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIGltcG9ydCBzeXMsIHJlCgogICAgZGVmIF9yZXNvbHZlKG1vZHVsZSwgZnVuYyk6CiAgICAgICAgX19pbXBvcnRfXyhtb2R1bGUpCiAgICAgICAgbW9kID0gc3lzLm1vZHVsZXNbbW9kdWxlXQogICAgICAgIHBhcnRzID0gZnVuYy5zcGxpdCgnLicpCiAgICAgICAgcmVzdWx0ID0gZ2V0YXR0cihtb2QsIHBhcnRzLnBvcCgwKSkKICAgICAgICBmb3IgcCBpbiBwYXJ0czoKICAgICAgICAgICAgcmVzdWx0ID0gZ2V0YXR0cihyZXN1bHQsIHApCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIHRyeToKICAgICAgICBzeXMuYXJndlswXSA9IHJlLnN1YihyJygtc2NyaXB0XC5weXc/fFwuZXhlKT8kJywgJycsIHN5cy5hcmd2WzBdKQoKICAgICAgICBmdW5jID0gX3Jlc29sdmUoJyUobW9kdWxlKXMnLCAnJShmdW5jKXMnKQogICAgICAgIHJjID0gZnVuYygpICMgTm9uZSBpbnRlcnByZXRlZCBhcyAwCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6ICAjIG9ubHkgc3VwcG9ydGluZyBQeXRob24gPj0gMi42CiAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnJSVzXFxuJyAlJSBlKQogICAgICAgIHJjID0gMQogICAgc3lzLmV4aXQocmMpCicnJwoKCmRlZiBfZW5xdW90ZV9leGVjdXRhYmxlKGV4ZWN1dGFibGUpOgogICAgaWYgJyAnIGluIGV4ZWN1dGFibGU6CiAgICAgICAgIyBtYWtlIHN1cmUgd2UgcXVvdGUgb25seSB0aGUgZXhlY3V0YWJsZSBpbiBjYXNlIG9mIGVudgogICAgICAgICMgZm9yIGV4YW1wbGUgL3Vzci9iaW4vZW52ICIvZGlyIHdpdGggc3BhY2VzL2Jpbi9qeXRob24iCiAgICAgICAgIyBpbnN0ZWFkIG9mICIvdXNyL2Jpbi9lbnYgL2RpciB3aXRoIHNwYWNlcy9iaW4vanl0aG9uIgogICAgICAgICMgb3RoZXJ3aXNlIHdob2xlCiAgICAgICAgaWYgZXhlY3V0YWJsZS5zdGFydHN3aXRoKCcvdXNyL2Jpbi9lbnYgJyk6CiAgICAgICAgICAgIGVudiwgX2V4ZWN1dGFibGUgPSBleGVjdXRhYmxlLnNwbGl0KCcgJywgMSkKICAgICAgICAgICAgaWYgJyAnIGluIF9leGVjdXRhYmxlIGFuZCBub3QgX2V4ZWN1dGFibGUuc3RhcnRzd2l0aCgnIicpOgogICAgICAgICAgICAgICAgZXhlY3V0YWJsZSA9ICclcyAiJXMiJyAlIChlbnYsIF9leGVjdXRhYmxlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG5vdCBleGVjdXRhYmxlLnN0YXJ0c3dpdGgoJyInKToKICAgICAgICAgICAgICAgIGV4ZWN1dGFibGUgPSAnIiVzIicgJSBleGVjdXRhYmxlCiAgICByZXR1cm4gZXhlY3V0YWJsZQoKCmNsYXNzIFNjcmlwdE1ha2VyKG9iamVjdCk6CiAgICAiIiIKICAgIEEgY2xhc3MgdG8gY29weSBvciBjcmVhdGUgc2NyaXB0cyBmcm9tIHNvdXJjZSBzY3JpcHRzIG9yIGNhbGxhYmxlCiAgICBzcGVjaWZpY2F0aW9ucy4KICAgICIiIgogICAgc2NyaXB0X3RlbXBsYXRlID0gU0NSSVBUX1RFTVBMQVRFCgogICAgZXhlY3V0YWJsZSA9IE5vbmUgICMgZm9yIHNoZWJhbmdzCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvdXJjZV9kaXIsIHRhcmdldF9kaXIsIGFkZF9sYXVuY2hlcnM9VHJ1ZSwKICAgICAgICAgICAgICAgICBkcnlfcnVuPUZhbHNlLCBmaWxlb3A9Tm9uZSk6CiAgICAgICAgc2VsZi5zb3VyY2VfZGlyID0gc291cmNlX2RpcgogICAgICAgIHNlbGYudGFyZ2V0X2RpciA9IHRhcmdldF9kaXIKICAgICAgICBzZWxmLmFkZF9sYXVuY2hlcnMgPSBhZGRfbGF1bmNoZXJzCiAgICAgICAgc2VsZi5mb3JjZSA9IEZhbHNlCiAgICAgICAgc2VsZi5jbG9iYmVyID0gRmFsc2UKICAgICAgICAjIEl0IG9ubHkgbWFrZXMgc2Vuc2UgdG8gc2V0IG1vZGUgYml0cyBvbiBQT1NJWC4KICAgICAgICBzZWxmLnNldF9tb2RlID0gKG9zLm5hbWUgPT0gJ3Bvc2l4Jykgb3IgKG9zLm5hbWUgPT0gJ2phdmEnIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuX25hbWUgPT0gJ3Bvc2l4JykKICAgICAgICBzZWxmLnZhcmlhbnRzID0gc2V0KCgnJywgJ1guWScpKQogICAgICAgIHNlbGYuX2ZpbGVvcCA9IGZpbGVvcCBvciBGaWxlT3BlcmF0b3IoZHJ5X3J1bikKCiAgICAgICAgc2VsZi5faXNfbnQgPSBvcy5uYW1lID09ICdudCcgb3IgKAogICAgICAgICAgICBvcy5uYW1lID09ICdqYXZhJyBhbmQgb3MuX25hbWUgPT0gJ250JykKCiAgICBkZWYgX2dldF9hbHRlcm5hdGVfZXhlY3V0YWJsZShzZWxmLCBleGVjdXRhYmxlLCBvcHRpb25zKToKICAgICAgICBpZiBvcHRpb25zLmdldCgnZ3VpJywgRmFsc2UpIGFuZCBzZWxmLl9pc19udDogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICBkbiwgZm4gPSBvcy5wYXRoLnNwbGl0KGV4ZWN1dGFibGUpCiAgICAgICAgICAgIGZuID0gZm4ucmVwbGFjZSgncHl0aG9uJywgJ3B5dGhvbncnKQogICAgICAgICAgICBleGVjdXRhYmxlID0gb3MucGF0aC5qb2luKGRuLCBmbikKICAgICAgICByZXR1cm4gZXhlY3V0YWJsZQoKICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICBkZWYgX2lzX3NoZWxsKHNlbGYsIGV4ZWN1dGFibGUpOgogICAgICAgICAgICAiIiIKICAgICAgICAgICAgRGV0ZXJtaW5lIGlmIHRoZSBzcGVjaWZpZWQgZXhlY3V0YWJsZSBpcyBhIHNjcmlwdAogICAgICAgICAgICAoY29udGFpbnMgYSAjISBsaW5lKQogICAgICAgICAgICAiIiIKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd2l0aCBvcGVuKGV4ZWN1dGFibGUpIGFzIGZwOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBmcC5yZWFkKDIpID09ICcjIScKICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdGYWlsZWQgdG8gb3BlbiAlcycsIGV4ZWN1dGFibGUpCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgZGVmIF9maXhfanl0aG9uX2V4ZWN1dGFibGUoc2VsZiwgZXhlY3V0YWJsZSk6CiAgICAgICAgICAgIGlmIHNlbGYuX2lzX3NoZWxsKGV4ZWN1dGFibGUpOgogICAgICAgICAgICAgICAgIyBXb3JrYXJvdW5kIGZvciBKeXRob24gaXMgbm90IG5lZWRlZCBvbiBMaW51eCBzeXN0ZW1zLgogICAgICAgICAgICAgICAgaW1wb3J0IGphdmEKCiAgICAgICAgICAgICAgICBpZiBqYXZhLmxhbmcuU3lzdGVtLmdldFByb3BlcnR5KCdvcy5uYW1lJykgPT0gJ0xpbnV4JzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0YWJsZQogICAgICAgICAgICBlbGlmIGV4ZWN1dGFibGUubG93ZXIoKS5lbmRzd2l0aCgnanl0aG9uLmV4ZScpOgogICAgICAgICAgICAgICAgIyBVc2Ugd3JhcHBlciBleGUgZm9yIEp5dGhvbiBvbiBXaW5kb3dzCiAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0YWJsZQogICAgICAgICAgICByZXR1cm4gJy91c3IvYmluL2VudiAlcycgJSBleGVjdXRhYmxlCgogICAgZGVmIF9nZXRfc2hlYmFuZyhzZWxmLCBlbmNvZGluZywgcG9zdF9pbnRlcnA9YicnLCBvcHRpb25zPU5vbmUpOgogICAgICAgIGVucXVvdGUgPSBUcnVlCiAgICAgICAgaWYgc2VsZi5leGVjdXRhYmxlOgogICAgICAgICAgICBleGVjdXRhYmxlID0gc2VsZi5leGVjdXRhYmxlCiAgICAgICAgICAgIGVucXVvdGUgPSBGYWxzZSAgICAgIyBhc3N1bWUgdGhpcyB3aWxsIGJlIHRha2VuIGNhcmUgb2YKICAgICAgICBlbGlmIG5vdCBzeXNjb25maWcuaXNfcHl0aG9uX2J1aWxkKCk6CiAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBnZXRfZXhlY3V0YWJsZSgpCiAgICAgICAgZWxpZiBpbl92ZW52KCk6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgZXhlY3V0YWJsZSA9IG9zLnBhdGguam9pbihzeXNjb25maWcuZ2V0X3BhdGgoJ3NjcmlwdHMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdweXRob24lcycgJSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0VYRScpKQogICAgICAgIGVsc2U6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgZXhlY3V0YWJsZSA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignQklORElSJyksCiAgICAgICAgICAgICAgICdweXRob24lcyVzJyAlIChzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1ZFUlNJT04nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignRVhFJykpKQogICAgICAgIGlmIG9wdGlvbnM6CiAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBzZWxmLl9nZXRfYWx0ZXJuYXRlX2V4ZWN1dGFibGUoZXhlY3V0YWJsZSwgb3B0aW9ucykKCiAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICBleGVjdXRhYmxlID0gc2VsZi5fZml4X2p5dGhvbl9leGVjdXRhYmxlKGV4ZWN1dGFibGUpCiAgICAgICAgIyBOb3JtYWxpc2UgY2FzZSBmb3IgV2luZG93cwogICAgICAgIGV4ZWN1dGFibGUgPSBvcy5wYXRoLm5vcm1jYXNlKGV4ZWN1dGFibGUpCiAgICAgICAgIyBJZiB0aGUgdXNlciBkaWRuJ3Qgc3BlY2lmeSBhbiBleGVjdXRhYmxlLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvCiAgICAgICAgIyBjYXRlciBmb3IgZXhlY3V0YWJsZSBwYXRocyB3aXRoIHNwYWNlcyAobm90IHVuY29tbW9uIG9uIFdpbmRvd3MpCiAgICAgICAgaWYgZW5xdW90ZToKICAgICAgICAgICAgZXhlY3V0YWJsZSA9IF9lbnF1b3RlX2V4ZWN1dGFibGUoZXhlY3V0YWJsZSkKICAgICAgICAjIElzc3VlICM1MTogZG9uJ3QgdXNlIGZzZW5jb2RlLCBzaW5jZSB3ZSBsYXRlciB0cnkgdG8KICAgICAgICAjIGNoZWNrIHRoYXQgdGhlIHNoZWJhbmcgaXMgZGVjb2RhYmxlIHVzaW5nIHV0Zi04LgogICAgICAgIGV4ZWN1dGFibGUgPSBleGVjdXRhYmxlLmVuY29kZSgndXRmLTgnKQogICAgICAgICMgaW4gY2FzZSBvZiBJcm9uUHl0aG9uLCBwbGF5IHNhZmUgYW5kIGVuYWJsZSBmcmFtZXMgc3VwcG9ydAogICAgICAgIGlmIChzeXMucGxhdGZvcm0gPT0gJ2NsaScgYW5kICctWDpGcmFtZXMnIG5vdCBpbiBwb3N0X2ludGVycAogICAgICAgICAgICBhbmQgJy1YOkZ1bGxGcmFtZXMnIG5vdCBpbiBwb3N0X2ludGVycCk6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgcG9zdF9pbnRlcnAgKz0gYicgLVg6RnJhbWVzJwogICAgICAgIHNoZWJhbmcgPSBiJyMhJyArIGV4ZWN1dGFibGUgKyBwb3N0X2ludGVycCArIGInXG4nCiAgICAgICAgIyBQeXRob24gcGFyc2VyIHN0YXJ0cyB0byByZWFkIGEgc2NyaXB0IHVzaW5nIFVURi04IHVudGlsCiAgICAgICAgIyBpdCBnZXRzIGEgI2NvZGluZzp4eHggY29va2llLiBUaGUgc2hlYmFuZyBoYXMgdG8gYmUgdGhlCiAgICAgICAgIyBmaXJzdCBsaW5lIG9mIGEgZmlsZSwgdGhlICNjb2Rpbmc6eHh4IGNvb2tpZSBjYW5ub3QgYmUKICAgICAgICAjIHdyaXR0ZW4gYmVmb3JlLiBTbyB0aGUgc2hlYmFuZyBoYXMgdG8gYmUgZGVjb2RhYmxlIGZyb20KICAgICAgICAjIFVURi04LgogICAgICAgIHRyeToKICAgICAgICAgICAgc2hlYmFuZy5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAnVGhlIHNoZWJhbmcgKCVyKSBpcyBub3QgZGVjb2RhYmxlIGZyb20gdXRmLTgnICUgc2hlYmFuZykKICAgICAgICAjIElmIHRoZSBzY3JpcHQgaXMgZW5jb2RlZCB0byBhIGN1c3RvbSBlbmNvZGluZyAodXNlIGEKICAgICAgICAjICNjb2Rpbmc6eHh4IGNvb2tpZSksIHRoZSBzaGViYW5nIGhhcyB0byBiZSBkZWNvZGFibGUgZnJvbQogICAgICAgICMgdGhlIHNjcmlwdCBlbmNvZGluZyB0b28uCiAgICAgICAgaWYgZW5jb2RpbmcgIT0gJ3V0Zi04JzoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2hlYmFuZy5kZWNvZGUoZW5jb2RpbmcpCiAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ1RoZSBzaGViYW5nICglcikgaXMgbm90IGRlY29kYWJsZSAnCiAgICAgICAgICAgICAgICAgICAgJ2Zyb20gdGhlIHNjcmlwdCBlbmNvZGluZyAoJXIpJyAlIChzaGViYW5nLCBlbmNvZGluZykpCiAgICAgICAgcmV0dXJuIHNoZWJhbmcKCiAgICBkZWYgX2dldF9zY3JpcHRfdGV4dChzZWxmLCBlbnRyeSk6CiAgICAgICAgcmV0dXJuIHNlbGYuc2NyaXB0X3RlbXBsYXRlICUgZGljdChtb2R1bGU9ZW50cnkucHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYz1lbnRyeS5zdWZmaXgpCgogICAgbWFuaWZlc3QgPSBfREVGQVVMVF9NQU5JRkVTVAoKICAgIGRlZiBnZXRfbWFuaWZlc3Qoc2VsZiwgZXhlbmFtZSk6CiAgICAgICAgYmFzZSA9IG9zLnBhdGguYmFzZW5hbWUoZXhlbmFtZSkKICAgICAgICByZXR1cm4gc2VsZi5tYW5pZmVzdCAlIGJhc2UKCiAgICBkZWYgX3dyaXRlX3NjcmlwdChzZWxmLCBuYW1lcywgc2hlYmFuZywgc2NyaXB0X2J5dGVzLCBmaWxlbmFtZXMsIGV4dCk6CiAgICAgICAgdXNlX2xhdW5jaGVyID0gc2VsZi5hZGRfbGF1bmNoZXJzIGFuZCBzZWxmLl9pc19udAogICAgICAgIGxpbmVzZXAgPSBvcy5saW5lc2VwLmVuY29kZSgndXRmLTgnKQogICAgICAgIGlmIG5vdCB1c2VfbGF1bmNoZXI6CiAgICAgICAgICAgIHNjcmlwdF9ieXRlcyA9IHNoZWJhbmcgKyBsaW5lc2VwICsgc2NyaXB0X2J5dGVzCiAgICAgICAgZWxzZTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICBpZiBleHQgPT0gJ3B5JzoKICAgICAgICAgICAgICAgIGxhdW5jaGVyID0gc2VsZi5fZ2V0X2xhdW5jaGVyKCd0JykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxhdW5jaGVyID0gc2VsZi5fZ2V0X2xhdW5jaGVyKCd3JykKICAgICAgICAgICAgc3RyZWFtID0gQnl0ZXNJTygpCiAgICAgICAgICAgIHdpdGggWmlwRmlsZShzdHJlYW0sICd3JykgYXMgemY6CiAgICAgICAgICAgICAgICB6Zi53cml0ZXN0cignX19tYWluX18ucHknLCBzY3JpcHRfYnl0ZXMpCiAgICAgICAgICAgIHppcF9kYXRhID0gc3RyZWFtLmdldHZhbHVlKCkKICAgICAgICAgICAgc2NyaXB0X2J5dGVzID0gbGF1bmNoZXIgKyBzaGViYW5nICsgbGluZXNlcCArIHppcF9kYXRhCiAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CiAgICAgICAgICAgIG91dG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi50YXJnZXRfZGlyLCBuYW1lKQogICAgICAgICAgICBpZiB1c2VfbGF1bmNoZXI6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgIG4sIGUgPSBvcy5wYXRoLnNwbGl0ZXh0KG91dG5hbWUpCiAgICAgICAgICAgICAgICBpZiBlLnN0YXJ0c3dpdGgoJy5weScpOgogICAgICAgICAgICAgICAgICAgIG91dG5hbWUgPSBuCiAgICAgICAgICAgICAgICBvdXRuYW1lID0gJyVzLmV4ZScgJSBvdXRuYW1lCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmlsZW9wLndyaXRlX2JpbmFyeV9maWxlKG91dG5hbWUsIHNjcmlwdF9ieXRlcykKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgIyBGYWlsZWQgd3JpdGluZyBhbiBleGVjdXRhYmxlIC0gaXQgbWlnaHQgYmUgaW4gdXNlLgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdGYWlsZWQgdG8gd3JpdGUgZXhlY3V0YWJsZSAtIHRyeWluZyB0byAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSAuZGVsZXRlbWUgbG9naWMnKQogICAgICAgICAgICAgICAgICAgIGRmbmFtZSA9ICclcy5kZWxldGVtZScgJSBvdXRuYW1lCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZGZuYW1lKToKICAgICAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGRmbmFtZSkgICAgICAgIyBOb3QgYWxsb3dlZCB0byBmYWlsIGhlcmUKICAgICAgICAgICAgICAgICAgICBvcy5yZW5hbWUob3V0bmFtZSwgZGZuYW1lKSAgIyBub3IgaGVyZQogICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVvcC53cml0ZV9iaW5hcnlfZmlsZShvdXRuYW1lLCBzY3JpcHRfYnl0ZXMpCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdBYmxlIHRvIHJlcGxhY2UgZXhlY3V0YWJsZSB1c2luZyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuZGVsZXRlbWUgbG9naWMnKQogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGRmbmFtZSkKICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICBwYXNzICAgICMgc3RpbGwgaW4gdXNlIC0gaWdub3JlIGVycm9yCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBzZWxmLl9pc19udCBhbmQgbm90IG91dG5hbWUuZW5kc3dpdGgoJy4nICsgZXh0KTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgICAgIG91dG5hbWUgPSAnJXMuJXMnICUgKG91dG5hbWUsIGV4dCkKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG91dG5hbWUpIGFuZCBub3Qgc2VsZi5jbG9iYmVyOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdTa2lwcGluZyBleGlzdGluZyBmaWxlICVzJywgb3V0bmFtZSkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgc2VsZi5fZmlsZW9wLndyaXRlX2JpbmFyeV9maWxlKG91dG5hbWUsIHNjcmlwdF9ieXRlcykKICAgICAgICAgICAgICAgIGlmIHNlbGYuc2V0X21vZGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmlsZW9wLnNldF9leGVjdXRhYmxlX21vZGUoW291dG5hbWVdKQogICAgICAgICAgICBmaWxlbmFtZXMuYXBwZW5kKG91dG5hbWUpCgogICAgZGVmIF9tYWtlX3NjcmlwdChzZWxmLCBlbnRyeSwgZmlsZW5hbWVzLCBvcHRpb25zPU5vbmUpOgogICAgICAgIHBvc3RfaW50ZXJwID0gYicnCiAgICAgICAgaWYgb3B0aW9uczoKICAgICAgICAgICAgYXJncyA9IG9wdGlvbnMuZ2V0KCdpbnRlcnByZXRlcl9hcmdzJywgW10pCiAgICAgICAgICAgIGlmIGFyZ3M6CiAgICAgICAgICAgICAgICBhcmdzID0gJyAlcycgJSAnICcuam9pbihhcmdzKQogICAgICAgICAgICAgICAgcG9zdF9pbnRlcnAgPSBhcmdzLmVuY29kZSgndXRmLTgnKQogICAgICAgIHNoZWJhbmcgPSBzZWxmLl9nZXRfc2hlYmFuZygndXRmLTgnLCBwb3N0X2ludGVycCwgb3B0aW9ucz1vcHRpb25zKQogICAgICAgIHNjcmlwdCA9IHNlbGYuX2dldF9zY3JpcHRfdGV4dChlbnRyeSkuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgbmFtZSA9IGVudHJ5Lm5hbWUKICAgICAgICBzY3JpcHRuYW1lcyA9IHNldCgpCiAgICAgICAgaWYgJycgaW4gc2VsZi52YXJpYW50czoKICAgICAgICAgICAgc2NyaXB0bmFtZXMuYWRkKG5hbWUpCiAgICAgICAgaWYgJ1gnIGluIHNlbGYudmFyaWFudHM6CiAgICAgICAgICAgIHNjcmlwdG5hbWVzLmFkZCgnJXMlcycgJSAobmFtZSwgc3lzLnZlcnNpb25bMF0pKQogICAgICAgIGlmICdYLlknIGluIHNlbGYudmFyaWFudHM6CiAgICAgICAgICAgIHNjcmlwdG5hbWVzLmFkZCgnJXMtJXMnICUgKG5hbWUsIHN5cy52ZXJzaW9uWzozXSkpCiAgICAgICAgaWYgb3B0aW9ucyBhbmQgb3B0aW9ucy5nZXQoJ2d1aScsIEZhbHNlKToKICAgICAgICAgICAgZXh0ID0gJ3B5dycKICAgICAgICBlbHNlOgogICAgICAgICAgICBleHQgPSAncHknCiAgICAgICAgc2VsZi5fd3JpdGVfc2NyaXB0KHNjcmlwdG5hbWVzLCBzaGViYW5nLCBzY3JpcHQsIGZpbGVuYW1lcywgZXh0KQoKICAgIGRlZiBfY29weV9zY3JpcHQoc2VsZiwgc2NyaXB0LCBmaWxlbmFtZXMpOgogICAgICAgIGFkanVzdCA9IEZhbHNlCiAgICAgICAgc2NyaXB0ID0gb3MucGF0aC5qb2luKHNlbGYuc291cmNlX2RpciwgY29udmVydF9wYXRoKHNjcmlwdCkpCiAgICAgICAgb3V0bmFtZSA9IG9zLnBhdGguam9pbihzZWxmLnRhcmdldF9kaXIsIG9zLnBhdGguYmFzZW5hbWUoc2NyaXB0KSkKICAgICAgICBpZiBub3Qgc2VsZi5mb3JjZSBhbmQgbm90IHNlbGYuX2ZpbGVvcC5uZXdlcihzY3JpcHQsIG91dG5hbWUpOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ25vdCBjb3B5aW5nICVzICh1cC10by1kYXRlKScsIHNjcmlwdCkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgQWx3YXlzIG9wZW4gdGhlIGZpbGUsIGJ1dCBpZ25vcmUgZmFpbHVyZXMgaW4gZHJ5LXJ1biBtb2RlIC0tCiAgICAgICAgIyB0aGF0IHdheSwgd2UnbGwgZ2V0IGFjY3VyYXRlIGZlZWRiYWNrIGlmIHdlIGNhbiByZWFkIHRoZQogICAgICAgICMgc2NyaXB0LgogICAgICAgIHRyeToKICAgICAgICAgICAgZiA9IG9wZW4oc2NyaXB0LCAncmInKQogICAgICAgIGV4Y2VwdCBJT0Vycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBmID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZpcnN0X2xpbmUgPSBmLnJlYWRsaW5lKCkKICAgICAgICAgICAgaWYgbm90IGZpcnN0X2xpbmU6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCclczogJXMgaXMgYW4gZW1wdHkgZmlsZSAoc2tpcHBpbmcpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X2NvbW1hbmRfbmFtZSgpLCAgc2NyaXB0KQogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICBtYXRjaCA9IEZJUlNUX0xJTkVfUkUubWF0Y2goZmlyc3RfbGluZS5yZXBsYWNlKGInXHJcbicsIGInXG4nKSkKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICBhZGp1c3QgPSBUcnVlCiAgICAgICAgICAgICAgICBwb3N0X2ludGVycCA9IG1hdGNoLmdyb3VwKDEpIG9yIGInJwoKICAgICAgICBpZiBub3QgYWRqdXN0OgogICAgICAgICAgICBpZiBmOgogICAgICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgIHNlbGYuX2ZpbGVvcC5jb3B5X2ZpbGUoc2NyaXB0LCBvdXRuYW1lKQogICAgICAgICAgICBpZiBzZWxmLnNldF9tb2RlOgogICAgICAgICAgICAgICAgc2VsZi5fZmlsZW9wLnNldF9leGVjdXRhYmxlX21vZGUoW291dG5hbWVdKQogICAgICAgICAgICBmaWxlbmFtZXMuYXBwZW5kKG91dG5hbWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ2NvcHlpbmcgYW5kIGFkanVzdGluZyAlcyAtPiAlcycsIHNjcmlwdCwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50YXJnZXRfZGlyKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5fZmlsZW9wLmRyeV9ydW46CiAgICAgICAgICAgICAgICBlbmNvZGluZywgbGluZXMgPSBkZXRlY3RfZW5jb2RpbmcoZi5yZWFkbGluZSkKICAgICAgICAgICAgICAgIGYuc2VlaygwKQogICAgICAgICAgICAgICAgc2hlYmFuZyA9IHNlbGYuX2dldF9zaGViYW5nKGVuY29kaW5nLCBwb3N0X2ludGVycCkKICAgICAgICAgICAgICAgIGlmIGIncHl0aG9udycgaW4gZmlyc3RfbGluZTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgICAgIGV4dCA9ICdweXcnCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGV4dCA9ICdweScKICAgICAgICAgICAgICAgIG4gPSBvcy5wYXRoLmJhc2VuYW1lKG91dG5hbWUpCiAgICAgICAgICAgICAgICBzZWxmLl93cml0ZV9zY3JpcHQoW25dLCBzaGViYW5nLCBmLnJlYWQoKSwgZmlsZW5hbWVzLCBleHQpCiAgICAgICAgICAgIGlmIGY6CiAgICAgICAgICAgICAgICBmLmNsb3NlKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkcnlfcnVuKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9maWxlb3AuZHJ5X3J1bgoKICAgIEBkcnlfcnVuLnNldHRlcgogICAgZGVmIGRyeV9ydW4oc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX2ZpbGVvcC5kcnlfcnVuID0gdmFsdWUKCiAgICBpZiBvcy5uYW1lID09ICdudCcgb3IgKG9zLm5hbWUgPT0gJ2phdmEnIGFuZCBvcy5fbmFtZSA9PSAnbnQnKTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICMgRXhlY3V0YWJsZSBsYXVuY2hlciBzdXBwb3J0LgogICAgICAgICMgTGF1bmNoZXJzIGFyZSBmcm9tIGh0dHBzOi8vYml0YnVja2V0Lm9yZy92aW5heS5zYWppcC9zaW1wbGVfbGF1bmNoZXIvCgogICAgICAgIGRlZiBfZ2V0X2xhdW5jaGVyKHNlbGYsIGtpbmQpOgogICAgICAgICAgICBpZiBzdHJ1Y3QuY2FsY3NpemUoJ1AnKSA9PSA4OiAgICMgNjQtYml0CiAgICAgICAgICAgICAgICBiaXRzID0gJzY0JwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYml0cyA9ICczMicKICAgICAgICAgICAgbmFtZSA9ICclcyVzLmV4ZScgJSAoa2luZCwgYml0cykKICAgICAgICAgICAgIyBJc3N1ZSAzMTogZG9uJ3QgaGFyZGNvZGUgYW4gYWJzb2x1dGUgcGFja2FnZSBuYW1lLCBidXQKICAgICAgICAgICAgIyBkZXRlcm1pbmUgaXQgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcGFja2FnZQogICAgICAgICAgICBkaXN0bGliX3BhY2thZ2UgPSBfX25hbWVfXy5yc3BsaXQoJy4nLCAxKVswXQogICAgICAgICAgICByZXN1bHQgPSBmaW5kZXIoZGlzdGxpYl9wYWNrYWdlKS5maW5kKG5hbWUpLmJ5dGVzCiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICAjIFB1YmxpYyBBUEkgZm9sbG93cwoKICAgIGRlZiBtYWtlKHNlbGYsIHNwZWNpZmljYXRpb24sIG9wdGlvbnM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgTWFrZSBhIHNjcmlwdC4KCiAgICAgICAgOnBhcmFtIHNwZWNpZmljYXRpb246IFRoZSBzcGVjaWZpY2F0aW9uLCB3aGljaCBpcyBlaXRoZXIgYSB2YWxpZCBleHBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgc3BlY2lmaWNhdGlvbiAodG8gbWFrZSBhIHNjcmlwdCBmcm9tIGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGUpIG9yIGEgZmlsZW5hbWUgKHRvIG1ha2UgYSBzY3JpcHQgYnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weWluZyBmcm9tIGEgc291cmNlIGxvY2F0aW9uKS4KICAgICAgICA6cGFyYW0gb3B0aW9uczogQSBkaWN0aW9uYXJ5IG9mIG9wdGlvbnMgY29udHJvbGxpbmcgc2NyaXB0IGdlbmVyYXRpb24uCiAgICAgICAgOnJldHVybjogQSBsaXN0IG9mIGFsbCBhYnNvbHV0ZSBwYXRobmFtZXMgd3JpdHRlbiB0by4KICAgICAgICAiIiIKICAgICAgICBmaWxlbmFtZXMgPSBbXQogICAgICAgIGVudHJ5ID0gZ2V0X2V4cG9ydF9lbnRyeShzcGVjaWZpY2F0aW9uKQogICAgICAgIGlmIGVudHJ5IGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuX2NvcHlfc2NyaXB0KHNwZWNpZmljYXRpb24sIGZpbGVuYW1lcykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9tYWtlX3NjcmlwdChlbnRyeSwgZmlsZW5hbWVzLCBvcHRpb25zPW9wdGlvbnMpCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lcwoKICAgIGRlZiBtYWtlX211bHRpcGxlKHNlbGYsIHNwZWNpZmljYXRpb25zLCBvcHRpb25zPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFRha2UgYSBsaXN0IG9mIHNwZWNpZmljYXRpb25zIGFuZCBtYWtlIHNjcmlwdHMgZnJvbSB0aGVtLAogICAgICAgIDpwYXJhbSBzcGVjaWZpY2F0aW9uczogQSBsaXN0IG9mIHNwZWNpZmljYXRpb25zLgogICAgICAgIDpyZXR1cm46IEEgbGlzdCBvZiBhbGwgYWJzb2x1dGUgcGF0aG5hbWVzIHdyaXR0ZW4gdG8sCiAgICAgICAgIiIiCiAgICAgICAgZmlsZW5hbWVzID0gW10KICAgICAgICBmb3Igc3BlY2lmaWNhdGlvbiBpbiBzcGVjaWZpY2F0aW9uczoKICAgICAgICAgICAgZmlsZW5hbWVzLmV4dGVuZChzZWxmLm1ha2Uoc3BlY2lmaWNhdGlvbiwgb3B0aW9ucykpCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lcwpQSwMEFAAAAAAAAAAhAPWYkAwAXAEAAFwBACsAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi90MzIuZXhlTVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAAAMi+EYSOqPS0jqj0tI6o9L26QXS0nqj0tTdyRLVuqPS1N3EUtH6o9LU3clSzjqj0tBkhxLTeqPS0jqjksQ6o9LU3chS0nqj0tTdxVLSeqPS1N3EktJ6o9LUmljaEjqj0sAAAAAAAAAAFBFAABMAQUAaOdSVwAAAAAAAAAA4AACAQsBCgAAugAAAJ4AAAAAAADwJQAAABAAAADQAAAAAEAAABAAAAACAAAFAAEAAAAAAAUAAQAAAAAAAKABAAAEAACqeQEAAwBAgQAAEAAAEAAAAAAQAAAQAAAAAAAAEAAAAAAAAAAAAAAAsPIAADwAAAAAMAEApFAAAAAAAAAAAAAAAAAAAAAAAAAAkAEA1AgAAIDRAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO4AAEAAAAAAAAAAAAAAAADQAABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALnRleHQAAACKuAAAABAAAAC6AAAABAAAAAAAAAAAAAAAAAAAIAAAYC5yZGF0YQAABCoAAADQAAAALAAAAL4AAAAAAAAAAAAAAAAAAEAAAEAuZGF0YQAAAMQuAAAAAAEAABAAAADqAAAAAAAAAAAAAAAAAABAAADALnJzcmMAAACkUAAAADABAABSAAAA+gAAAAAAAAAAAAAAAAAAQAAAQC5yZWxvYwAAIg4AAACQAQAAEAAAAEwBAAAAAAAAAAAAAAAAAEAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFWL7IHsBAQAAKGEAkEAM8WJRfyDfQgAdUWNRRBQ/3UMjYX8+///aP8DAABoAAQAAFDosi4AAIPEFI2F/Pv//1BoIOpAAOjnCQAAg8BAUOjSDgAAg8QMagH/FQDQQACLTfwzzeiABwAAycNVi+yLTQhXM/+NRvxQD74FwA5BAFBR6GsLAACDxAyFwHQbucAOQQCLCTsIdQKL+I1IAYtFCCvBjUQw/OvPi8dfXcNVi+yD7CxXaEDqQACNRfwz/2hgG0EAUIl9/Il98OjnBwAAM8k7xw+UwWhI6kAAUegg////agJX/3X86B4SAAD/dfzoJxEAAJmJRegF/P7//4PEJIlV7IlF+DvHfQOJffhTVlf/dfj/dfzo7xEAAP91/LsEAQAAU2oB/3UI6NsNAAD/dQiL8Ogz////g8QgO8d0HYvwagVZjX3U86WLfQgrxwNF+JmL8IlV7OmBAAAAvgAAEARW6DcIAACJRfSLRegFAADw+1mJRfg7x30DiX34V/91+P91/OiBEQAA/3X8VmoB/3X06HINAAD/dfSL8OjK/v//i/AzwDv3D5XAaGTqQACJdexQ6En+//+LRewrRfRqBQNF+Fn/dfSZjX3U86WL8IlV7OhNBwAAi30Ig8QsK3XkK3XgK/N5AjP2agBW/3X86BYRAAD/dfxTagFX6AkNAACL8DPAO8YbwPfYaIjqQABQ6Oz9//+DxCSNRD7/XlvrDmaLELmk6kAAZjsRdAdIO8dz7usDiUXw/3X86LQRAACLRfBZX8nDVYvsVovw/xUQ0EAAgyYAagJqAWoAVlD/dQhQ/xVA0EAAi/CF9nUM/xU40EAAg/gGdQFGi8ZeXcNVi+yDfQgAdRKhaB1BAIXAdAlqAFD/FRjQQAAzwEBdw1WL7IPk+IHs3AAAAKGEAkEAM8SJhCTYAAAAi0UIU1ZXM/9XV4lEJBz/FTDQQACL2I1EJBBQanCNRCR4UGoJU/8VKNBAAIXAdAyDfCQQcHUFM8BA6wIzwGis6kAAUOgB/f//gYwkiAAAAAAwAABZWWpwjUQkdFBqCVP/FQjQQABozOpAAFDo2fz//2pEXlaNRCQ0V1DoGjgAAIPEFIl0JCiLNTTQQABq9v/WUI1EJGTo9P7//8cEJOzqQABQ6KL8//9ZWWr1/9ZQjUQkaOjX/v//xwQkCOtAAFDohfz//1lZavT/1lCNRCRs6Lr+///HBCQk60AAUOho/P//WVlqAWh9EkAAx0QkXAABAAD/FTzQQACNRCQYUI1EJCxQV1dXagFXV/90JDRX/xUM0EAA/3QkFGhA60AAUOgm/P//i0QkLIPEDP90JBijaB1BAFP/FRzQQAD/dCQc/xVE0EAAav//dCQc/xUU0EAAjUQkEFD/dCQc/xUg0EAAaGTrQABQ6N/7//9ZWf90JBD/FQDQQADMVYvsUVNWV4s9ONFAALuI60AAU/91COsljUYIiUX8D7cAZoXAdB+D+CJ0GmoIUOjQCwAAWVmFwHUMU/91/P/Xi/CF9nXTM8CF9g+VwGiU60AAUOh7+///i30IWVmDxghmgz8iagJbdR8zwGaDPiJo2OtAAA+UwFDoVvv//zPAWWaJBgPzWQP7M8Bmgz4iaCDsQAAPlcBQ6Df7//8PtwZZWWaFwHQlaghQ6FYLAABZWYXAdBczwGaJBusOaghQ6EELAABZWYXAdAoD8w+3BmaFwHXoi0UMiTCLx19eW8nDVYvsgewkAwAAoYQCQQAzxYlF/FNWV/8VBNBAAGaDOCJ0BGog6wVqIoPABFlRUOi9AwAAWVmFwHUMx4Xg/P//qOpAAOskjXAC6xFqCFDo0woAAFlZhcB0C4PGAg+3BmaFwHXnibXg/P//uwQBAABTvmAbQQBWagD/FSTQQABmgz1gG0EAInQIibXo/P//6w3Hhej8//9iG0EAg+gCi5Xo/P//M8lmiQxCjYXw/P//UMYFwA5BAFDo5fr//4v4M8CF/w+VwMcEJGzsQABQ6CP6//9ZjYcEAQAAM/ZZi887+HMVihGA+g10DID6CnQHQTvIcu/rAovxM8CF9g+VwGiE7EAAUOjs+f//WVlTjYX0/f//UMYGACv3VldqCGjp/QAA/xUs0EAAi/AzwDPbO/MPlcBosOxAAFDouPn//zPAZomEdfT9//9ZWY219P3//2Y5nfT9//90GQ+3BmoIUOjDCQAAWVmFwHQIg8YCZjkedeczwGaDPiNo3OxAAA+UwFDocPn//1lZagJf6w5qCFDokgkAAFlZhcB0CgP3D7cGZjvDdegzwGaDPiFoDO1AAA+UwFDoPfn//1lZ6w5qCFDoYgkAAFlZhcB0CgP3D7cGZjvDdeiNhez8//9QVomd7Pz//+g8/f//iYXk/P//M8A5neT8//9oQO1AAA+VwFDo8vj//zPAOZ3s/P//aGztQAAPlcBQ6Nz4//+LheT8//+DxBiNSAJmixADx2Y703X2K8HR+Ivwi4Xs/P//jUgCZosQA8dmO9N19ivB0fiJhdz8//+Lhej8//+NSAJmixADx2Y703X2K8HR+IvIi4Xg/P//jVACZosYA8dmhdt19ivC0fgDyAON3Pz//1eNdDEIVui9AQAAi/gzwIX/D5XAaKjtQABQ6Ez4////teD8////tej8////tez8////teT8//9o3O1AAFZWV+jEBAAAg8QwV+i7+v//zOkk/f//Ow2EAkEAdQLzw+kDDgAAagxo0O5AAOgdFQAAM/+JfeQzwItdCDvfD5XAO8d1FOitFAAAxwAWAAAA6FAUAAAzwOt7M8CLdQw79w+VwDvHdN4zwGY5Pg+VwDvHdNLocBEAAIlFCDvHdQ3ocxQAAMcAGAAAAOvJiX38Zjk7dSDoXhQAAMcAFgAAAGr+jUXwUGiEAkEA6JAWAACDxAzroVD/dRBWU+hwDgAAg8QQiUXkx0X8/v///+gJAAAAi0Xk6LsUAADD/3UI6MgCAABZw4v/VYvsVot1CIX2dRPoARQAAGoWXokw6KUTAACLxuskaIAAAAD/dRD/dQzoEv///4PEDIkGhcB0BDPA6wfo0RMAAIsAXl3Di/9Vi+yLRQhmi1UM6whmO8p0EoPAAg+3CGaFyXXwZjkQdAIzwF3Di/9Vi+yDfQgAdC3/dQhqAP81GBJBAP8VSNBAAIXAdRhW6H8TAACL8P8VONBAAFDoLxMAAFmJBl5dw4v/VYvsUYNl/ABWjUX8UP91DP91COgJFwAAi/CDxAyF9nUYOUX8dBPoPhMAAIXAdAroNRMAAItN/IkIi8ZeycOL/1WL7FOLXQiD++B3b1ZXgz0YEkEAAHUY6AccAABqHuhRGgAAaP8AAADoYRcAAFlZhdt0BIvD6wMzwEBQagD/NRgSQQD/FUzQQACL+IX/dSZqDF45BXwYQQB0DVPoCxwAAFmFwHWp6wfovRIAAIkw6LYSAACJMIvHX17rFFPo6hsAAFnoohIAAMcADAAAADPAW13DuAAAQQDDocAuQQBWahRehcB1B7gAAgAA6wY7xn0Hi8ajwC5BAGoEUOheHgAAWVmjpB5BAIXAdR5qBFaJNcAuQQDoRR4AAFlZo6QeQQCFwHUFahpYXsMz0rkAAEEA6wWhpB5BAIkMAoPBIIPCBIH5gAJBAHzqav5eM9K5EABBAFeLwsH4BYsEhYAdQQCL+oPnH8HnBosEB4P4/3QIO8Z0BIXAdQKJMYPBIEKB+XAAQQB8zl8zwF7D6I8gAACAPUQSQQAAdAXoWx4AAP81pB5BAOgd/v//WcOL/1WL7FaLdQi4AABBADvwciKB/mACQQB3GovOK8jB+QWDwRBR6M0hAACBTgwAgAAAWesKg8YgVv8VUNBAAF5dw4v/VYvsi0UIg/gUfRaDwBBQ6KAhAACLRQyBSAwAgAAAWV3Di0UMg8AgUP8VUNBAAF3Di/9Vi+yLRQi5AABBADvBch89YAJBAHcYgWAM/3///yvBwfgFg8AQUOh+IAAAWV3Dg8AgUP8VVNBAAF3Di/9Vi+yLTQiLRQyD+RR9E4FgDP9///+DwRBR6E8gAABZXcODwCBQ/xVU0EAAXcPMzMzMzMzMzMzMi0QkDFOFwHRSi1QkCDPbilwkDPfCAwAAAHQWigqDwgEyy3Ryg+gBdDL3wgMAAAB16oPoBHISV4v7weMIA9+L+8HjEAPf6xtfg8AEdA6KCoPCATLLdECD6AF18lvDg+gEcuWLCjPLv//+/n4D+YPx/zPPg8IEgeEAAQGBdOCLSvwyy3QjMut0GcHpEDLLdAwy63QC68hfjUL/W8ONQv5fW8ONQv1fW8ONQvxfW8OL/1WL7I1FGFBqAP91FP91EP91DP91COgwJQAAg8QYXcOL/1WL7IPsEItNCFOLXQxWV4t9EIlN+Ild/IX/dBqDfRQAdBSFyXUX6N0PAADHABYAAADogA8AADPAX15bycOLdRiF9nQMg8j/M9L39zlFFHYhg/v/dAxTagBR6DIuAACDxAyF9nTBg8j/M9L39zlFFHe1D699FPdGDAwBAACJffCL33QIi0YYiUX06wfHRfQAEAAAhf8PhNoAAAD3RgwMAQAAdESLRgSFwHQ9D4jyAAAAi/s72HICi/g7ffwPh7sAAABX/zb/dfz/dfjoPy0AACl+BAE+AX34K9+DxBApffyLffDphQAAADtd9HJcg330AHQfuf///38z0jvZdgmLwfd19IvB6weLw/d19IvDK8LrC7j///9/O9h3AovDO0X8d1tQ/3X4Vui9LAAAWVDowCsAAIPEDIXAdHuD+P90ZAFF+CvYKUX86yRW6MskAABZg/j/dFKDffwAdCKLTfj/RfiIAYtGGEv/TfyJRfSF2w+FJv///4tFFOm8/v//g30M/3QQ/3UMagD/dQjoAS0AAIPEDOhxDgAAxwAiAAAA6Y/+//+DTgwgi8crwzPS93UQ6YT+//+DTgwQ6+xqDGjw7kAA6JoOAAAz9ol15Dl1EHQvOXUUdCo5dRh1LYN9DP90D/91DFb/dQjopCwAAIPEDOgUDgAAxwAWAAAA6LcNAAAzwOifDgAAw/91GOg5/P//WYl1/P91GP91FP91EP91DP91COjX/f//g8QUiUXkx0X8/v///+gFAAAAi0Xk68P/dRjodfz//1nDi/9Vi+z/dRT/dRD/dQxq//91COha////g8QUXcNqDGgQ70AA6O8NAAAz24ld5DPAi30IO/sPlcA7w3UY6H8NAADHABYAAADoIg0AAIPI/+nFAAAAM8A5XQwPlcA7w3TciX0IV+iX+///WYld/PZHDEB1b1foJysAAFmD+P90G4P4/nQWi9DB+gWLyIPhH8HhBgMMlYAdQQDrBbkABEEA9kEkf3Upg/j/dBmD+P50FIvIwfkFg+AfweAGAwSNgB1BAOsFuAAEQQD2QCSAdBTo7QwAAMcAFgAAAOiQDAAAg03k/zld5HUjV+jVKwAAi/CNRRBQU/91DFfoyCwAAIlF5FdW6FcsAACDxBzHRfz+////6AkAAACLReToPw0AAMP/dQjoTPv//1nDi/9Vi+xRuP//AABmOUUIdQQzwMnDuAABAABmOUUIcxAPt0UIiw1sBkEAD7cEQesdjUX8UGoBjUUIUGoB/xVY0EAAhcB1AyFF/A+3RfwPt00MI8HJw4v/VYvsg+wMU1eLfQgz2zv7dRjoKgwAAMcAFgAAAOjNCwAAg8j/6WUBAABWV+jwKQAAi/BZiXX4OV8EfQOJXwRqAVNW6Hs4AACDxAyJRfw7ww+M+wAAAItXDPfCCAEAAHUIK0cE6SUBAACLB4tPCIvYK9mJXfT2wgN0PIvWwfoFixSVgB1BAIPmH8HmBvZEMgSAdBaL0TvQcxCL8IA6CnUBQ0I71nL1iV30g338AHUbi8Pp2AAAAITSeO/oggsAAMcAFgAAAOmHAAAA9kcMAQ+EtAAAAItXBIXSdQghVfTppQAAAItd+It1+CvBA8LB+wWD5h+NHJ2AHUEAiUUIiwPB5gb2RDAEgHR5agJqAP91+OiuNwAAg8QMO0X8dSCLRwiLTQgDyOsJgDgKdQP/RQhAO8Fy8/dHDAAgAADrQGoA/3X8/3X46Hk3AACDxAyFwHkFg8j/6zi4AAIAADlFCHcQi08M9sEIdAj3wQAEAAB0A4tHGIlFCIsD9kQwBAR0A/9FCItFCClF/ItF9ANF/F5fW8nDagxoMO9AAOj6CgAAM8A5RQgPlcCFwHUV6JEKAADHABYAAADoNAoAAIPI/+so/3UI6Ln4//9Zg2X8AP91COgq/v//WYlF5MdF/P7////oCQAAAItF5OjxCgAAw/91COj++P//WcOL/1WL7FaLdQiLRgyog3UQ6DQKAADHABYAAACDyP/rZ4Pg74N9EAGJRgx1Dlbo1f3//wFFDINlEABZVugzFwAAi0YMWYTAeQiD4PyJRgzrFqgBdBKoCHQOqQAEAAB1B8dGGAACAAD/dRD/dQxW6LcnAABZUOhSNgAAM8mDxAyD+P8PlcGNQf9eXcNqDGhQ70AA6AsKAAAzwDlFCA+VwIXAdRXoogkAAMcAFgAAAOhFCQAAg8j/6z+LdRCF9nQKg/4BdAWD/gJ12v91COi59///WYNl/ABW/3UM/3UI6B////+DxAyJReTHRfz+////6AkAAACLReTo6wkAAMP/dQjo+Pf//1nDi/9Vi+xWi3UIV4PP/4X2dRToLQkAAMcAFgAAAOjQCAAAC8frRPZGDIN0OFboPBYAAFaL+OjANwAAVujkJgAAUOjwNgAAg8QQhcB5BYPP/+sSi0YchcB0C1DoQPX//4NmHABZg2YMAIvHX15dw2oMaHDvQADoIgkAAINN5P8zwIt1CIX2D5XAhcB1FeizCAAAxwAWAAAA6FYIAACDyP/rDfZGDEB0DYNmDACLReToLgkAAMNW6Mr2//9Zg2X8AFboPP///1mJReTHRfz+////6AUAAADr1It1CFboF/f//1nDi/9Vi+yDPewOQQACdAXoSREAAP91COiSDwAAaP8AAADoogwAAFlZXcNqFGiQ70AA6IUIAAAz9jk1oB5BAHULVlZqAVb/FWDQQAC4TVoAAGY5BQAAQAB0BYl15Os2oTwAQACBuAAAQABQRQAAdeq5CwEAAGY5iBgAQAB13IO4dABAAA520zPJObDoAEAAD5XBiU3k6GQLAACFwHUIahzoXf///1noRz8AAIXAdQhqEOhM////WejxOwAAiXX86AoRAACFwHkIahvonA4AAFn/FVzQQACjnB5BAOg2OwAAo+QOQQDocToAAIXAeQhqCOh2DgAAWejqNwAAhcB5CGoJ6GUOAABZagHoPAwAAFk7xnQHUOhSDgAAWaEsEkEAozASQQBQ/zUkEkEA/zUgEkEA6Eny//+DxAyJReA5deR1BlDo2g0AAOgBDgAA6y6LReyLCIsJiU3cUFHoPDYAAFlZw4tl6ItF3IlF4IN95AB1BlDowA0AAOjgDQAAx0X8/v///4tF4Oh2BwAAw+jcPwAA6ZX+//+L/1WL7IHsKAMAAKP4D0EAiQ30D0EAiRXwD0EAiR3sD0EAiTXoD0EAiT3kD0EAZowVEBBBAGaMDQQQQQBmjB3gD0EAZowF3A9BAGaMJdgPQQBmjC3UD0EAnI8FCBBBAItFAKP8D0EAi0UEowAQQQCNRQijDBBBAIuF4Pz//8cFSA9BAAEAAQChABBBAKP8DkEAxwXwDkEACQQAwMcF9A5BAAEAAAChhAJBAImF2Pz//6GIAkEAiYXc/P///xVw0EAAo0APQQBqAeilPwAAWWoA/xVs0EAAaJzRQAD/FWjQQACDPUAPQQAAdQhqAeiBPwAAWWgJBADA/xUQ0EAAUP8VZNBAAMnDi/9Vi+yD7BCh+BpBADPSU1aLdQyJRfyJVfSJVfiJVfDrA4PGAmaDPiB09w+3BoP4YXQwg/hydCOD+Hd0F+iGBQAAxwAWAAAA6CkFAAAzwOlhAgAAuwEDAADrDTPbg038AesJuwkBAACDTfwCg8YCD7cGM8lBV2Y7wg+E1gEAAI15f7oAQAAAhckPhBwBAAAPt8CD+FMPj5MAAAB0f4PoIA+E9gAAAIPoC3RSSHRDg+gYdC2D6Ap0IYPoBA+FoQEAADlF+A+FzAAAAMdF+AEAAACDyxDpwwAAAAvf6bwAAAD2w0APha0AAACDy0DpqwAAAMdF8AEAAADpmQAAAPbDAg+FkAAAAItF/IPj/oPg/IPLAgvHiUX86YAAAACDffgAdXTHRfgBAAAAg8sg626D6FR0WoPoDnRFSHQwg+gLdBWD6AYPhRkBAAD3wwDAAAB1RQva60eDffQAdTuBZfz/v///x0X0AQAAAOsxg330AHUlCVX8x0X0AQAAAOsf98MAwAAAdRGBywCAAADrD7gAEAAAhdh0BDPJ6wIL2IPGAg+3BmaFwA+F3P7//4N98AAPhKAAAABqIF/rA4PGAmY5PnT4agNWaKTRQADoQUcAAIPEDIXAD4WIAAAAg8YG6wODxgJmOT50+GaDPj11dYPGAmY5PnT4agVorNFAAFbocEYAAIPEDIXAdQuDxgqBywAABADrQWoIaLjRQABW6FFGAACDxAyFwHULg8YQgcsAAAIA6yJqB2jM0UAAVugyRgAAg8QMhcB1G4PGDoHLAAABAOsDg8YCZoM+IHT3M/9mOT50EuhhAwAAxwAWAAAA6AQDAADrHGiAAQAA/3UQjUUMU/91CFDo5EQAAIPEFIXAdAQzwOsgi0UU/wXgDkEAi038iUgMi00MiXgEiTiJeAiJeByJSBBfXlvJw2oQaLDvQADoWwMAADPbM/+JfeRqAegsEwAAWYld/DP2iXXgOzXALkEAD43KAAAAoaQeQQCNBLA5GHRbiwCLQAyog3VIqQCAAAB1QY1G/YP4EHcSjUYQUOgoEgAAWYXAD4SUAAAAoaQeQQD/NLBW6B3x//9ZWaGkHkEAiwSw9kAMg3QMUFbodPH//1lZRuuRi/iJfeTrY2o46CEOAABZiw2kHkEAiQSxO8N0TmigDwAAoaQeQQCLBLCDwCBQ/xV00EAAhcChpB5BAHUT/zSw6Jfu//9ZoaQeQQCJHLDrG4sEsIPAIFD/FVDQQAChpB5BAIs8sIl95IlfDDv7dBaBZwwAgAAAiV8EiV8IiR+JXxyDTxD/x0X8/v///+gLAAAAi8fohgIAAMOLfeRqAeg8EQAAWcOL/1WL7ItFCKMUEkEAXcOL/1WL7IHsKAMAAKGEAkEAM8WJRfxTi10IV4P7/3QHU+hMOwAAWYOl4Pz//wBqTI2F5Pz//2oAUOgYIAAAjYXg/P//iYXY/P//jYUw/f//g8QMiYXc/P//iYXg/f//iY3c/f//iZXY/f//iZ3U/f//ibXQ/f//ib3M/f//ZoyV+P3//2aMjez9//9mjJ3I/f//ZoyFxP3//2aMpcD9//9mjK28/f//nI+F8P3//4tFBI1NBImN9P3//8eFMP3//wEAAQCJhej9//+LSfyJjeT9//+LTQyJjeD8//+LTRCJjeT8//+Jhez8////FXDQQABqAIv4/xVs0EAAjYXY/P//UP8VaNBAAIXAdRCF/3UMg/v/dAdT6Fc6AABZi038XzPNW+jG6///ycOL/1ZqAb4XBADAVmoC6MX+//+DxAxW/xUQ0EAAUP8VZNBAAF7Di/9Vi+z/NRQSQQD/FXzQQACFwHQDXf/g/3UY/3UU/3UQ/3UM/3UI6K/////MM8BQUFBQUOjH////g8QUw4v/VYvsi0UIM8k7BM2QAkEAdBNBg/ktcvGNSO2D+RF3DmoNWF3DiwTNlAJBAF3DBUT///9qDlk7yBvAI8GDwAhdw+jHNQAAhcB1Brj4A0EAw4PACMPotDUAAIXAdQa4/ANBAMODwAzDi/9Vi+xW6OL///+LTQhRiQjogv///1mL8Oi8////iTBeXcPMzMzMzMzMzMzMzMzMzMxogC1AAGT/NQAAAACLRCQQiWwkEI1sJBAr4FNWV6GEAkEAMUX8M8VQiWXo/3X4i0X8x0X8/v///4lF+I1F8GSjAAAAAMOLTfBkiQ0AAAAAWV9fXluL5V1Rw8zMzMzMzMyL/1WL7IPsGFOLXQxWi3MIMzWEAkEAV4sGxkX/AMdF9AEAAACNexCD+P50DYtOBAPPMww46C/q//+LTgyLRggDzzMMOOgf6v//i0UI9kAEZg+FGQEAAItNEI1V6IlT/ItbDIlF6IlN7IP7/nRfjUkAjQRbi0yGFI1EhhCJRfCLAIlF+IXJdBSL1+j0AQAAxkX/AYXAeEB/R4tF+IvYg/j+dc6Aff8AdCSLBoP4/nQNi04EA88zDDjorOn//4tODItWCAPPMww66Jzp//+LRfRfXluL5V3Dx0X0AAAAAOvJi00IgTljc23gdSmDPZgeQQAAdCBomB5BAOhjQgAAg8QEhcB0D4tVCGoBUv8VmB5BAIPECItNDItVCOiUAQAAi0UMOVgMdBJohAJBAFeL04vI6JYBAACLRQyLTfiJSAyLBoP4/nQNi04EA88zDDjoFun//4tODItWCAPPMww66Abp//+LRfCLSAiL1+gqAQAAuv7///85UwwPhE////9ohAJBAFeLy+hBAQAA6Rn////MU1ZXi1QkEItEJBSLTCQYVVJQUVFooC9AAGT/NQAAAAChhAJBADPEiUQkCGSJJQAAAACLRCQwi1gIi0wkLDMZi3AMg/7+dDuLVCQ0g/r+dAQ78nYujTR2jVyzEIsLiUgMg3sEAHXMaAEBAACLQwjoMkMAALkBAAAAi0MI6ERDAADrsGSPBQAAAACDxBhfXlvDi0wkBPdBBAYAAAC4AQAAAHQzi0QkCItICDPI6Cjo//9Vi2gY/3AM/3AQ/3AU6D7///+DxAxdi0QkCItUJBCJArgDAAAAw1WLTCQIiyn/cRz/cRj/cSjoFf///4PEDF3CBABVVldTi+ozwDPbM9Iz9jP//9FbX15dw4vqi/GLwWoB6I9CAAAzwDPbM8kz0jP//+ZVi+xTVldqAFJoRjBAAFHoPpgAAF9eW13DVYtsJAhSUf90JBTotf7//4PEDF3CCABqAGgAEAAAagD/FYTQQAAzyYXAD5XBoxgSQQCLwcOL/1WL7ItNCIXJdBtq4DPSWPfxO0UMcw/oK/z//8cADAAAADPAXcMPr00MVovxhfZ1AUYzwIP+4HcTVmoI/zUYEkEA/xVM0EAAhcB1MoM9fBhBAAB0HFboLgUAAFmFwHXSi0UQhcB0BscADAAAADPA6w2LTRCFyXQGxwEMAAAAXl3Di/9Vi+xo7NFAAP8VjNBAAIXAdBVo3NFAAFD/FYjQQACFwHQF/3UI/9Bdw4v/VYvs/3UI6Mj///9Z/3UI/xUA0EAAzGoI6LMLAABZw2oI6NEKAABZw4v/Vuj+LwAAi/BW6JQEAABW6H/5//9W6MJDAABW6K1DAABW6KJBAABW6ItBAACDxBhew4v/VYvsVot1CDPA6w+FwHUQiw6FyXQC/9GDxgQ7dQxy7F5dw4v/VYvsgz2QHkEAAHQZaJAeQQDoGj8AAFmFwHQK/3UI/xWQHkEAWeikRAAAaGDRQABoSNFAAOih////WVmFwHVUVldoN2FAAOhsRAAAuEDRQAC+RNFAAFmL+DvGcw+LB4XAdAL/0IPHBDv+cvGDPZQeQQAAX150G2iUHkEA6LA+AABZhcB0DGoAagJqAP8VlB5BADPAXcNqIGjQ70AA6M/6//9qCOinCgAAWYNl/AAzwEA5BUwSQQAPhNgAAACjSBJBAIpFEKJEEkEAg30MAA+FoAAAAP81iB5BAIs1fNBAAP/Wi9iJXdCF23Ro/zWEHkEA/9aL+Il91Ild3Il92IPvBIl91Dv7ckvooS4AADkHdO07+3I+/zf/1ovY6I4uAACJB//T/zWIHkEA/9aL2P81hB5BAP/WOV3cdQU5Rdh0Dold3Ild0IlF2Iv4iX3Ui13Q66vHReRk0UAAgX3kcNFAAHMRi0XkiwCFwHQC/9CDReQE6+bHReB00UAAgX3geNFAAHMRi0XgiwCFwHQC/9CDReAE6+bHRfz+////6CAAAACDfRAAdSnHBUwSQQABAAAAagjovwgAAFn/dQjovf3//4N9EAB0CGoI6KkIAABZw+jh+f//w4v/VYvsagBqAP91COiv/v//g8QMXcOL/1WL7GoAagH/dQjomf7//4PEDF3DagFqAGoA6In+//+DxAzDagFqAWoA6Hr+//+DxAzDi/9Vi+zo6QEAAP91COgyAAAAWWj/AAAA6K/////Mi/9Vi+wzwItNCDsMxYjaQAB0CkCD+BZy7jPAXcOLBMWM2kAAXcOL/1WL7IHs/AEAAKGEAkEAM8WJRfxTVot1CFdW6Ln///+L+DPbWYm9BP7//zv7D4RsAQAAagPoGUYAAFmD+AEPhAcBAABqA+gIRgAAWYXAdQ2DPYACQQABD4TuAAAAgf78AAAAD4Q2AQAAaMTbQABoFAMAAL9QEkEAV+hyRQAAg8QMhcAPhbgAAABoBAEAAL6CEkEAVlNmo4oUQQD/FSTQQAC7+wIAAIXAdR9olNtAAFNW6DpFAACDxAyFwHQMM8BQUFBQUOhH9///VugGRQAAQFmD+Dx2Klbo+UQAAI0ERQwSQQCLyCvOagPR+WiM20AAK9lTUOgPRAAAg8QUhcB1vWiE20AAvhQDAABWV+iCQwAAg8QMhcB1pf+1BP7//1ZX6G5DAACDxAyFwHWRaBAgAQBoONtAAFfo60EAAIPEDOteU1NTU1Ppef///2r0/xU00EAAi/A783RGg/7/dEEzwIoMR4iMBQj+//9mORxHdAhAPfQBAABy6FONhQT+//9QjYUI/v//UIhd++gNQQAAWVCNhQj+//9QVv8VkNBAAItN/F9eM81b6Cji///Jw2oD6J5EAABZg/gBdBVqA+iRRAAAWYXAdR+DPYACQQABdRZo/AAAAOgl/v//aP8AAADoG/7//1lZw4v/VYvsi0UIo3gYQQBdw4v/VYvs/zV4GEEA/xV80EAAhcB0D/91CP/QWYXAdAUzwEBdwzPAXcOL/1WL7IPsTFaNRbRQ/xWc0EAAakBqIF5W6GwCAABZWTPJO8F1CIPI/+kPAgAAjZAACAAAo4AdQQCJNXQdQQA7wnM2g8AFg0j7/2bHQP8AColIA2bHQB8ACsZAIQqJSDOISC+LNYAdQQCDwECNUPuBxgAIAAA71nLNU1dmOU3mD4QOAQAAi0XoO8EPhAMBAACLGIPABIlF/APDvgAIAACJRfg73nwCi945HXQdQQB9a7+EHUEAakBqIOjMAQAAWVmFwHRRgwV0HUEAII2IAAgAAIkHO8FzMYPABYNI+/+DYAMAgGAfgINgMwBmx0D/AApmx0AgCgrGQC8Aiw+DwEADzo1Q+zvRctKDxwQ5HXQdQQB8ousGix10HUEAM/+F235yi0X4iwCD+P90XIP4/nRXi038ign2wQF0TfbBCHULUP8VmNBAAIXAdD2L94PmH4vHwfgFweYGAzSFgB1BAItF+IsAiQaLRfyKAIhGBGigDwAAjUYMUP8VdNBAAIXAD4S8AAAA/0YIg0X4BEf/Rfw7+3yOM9uL88HmBgM1gB1BAIsGg/j/dAuD+P50BoBOBIDrccZGBIGF23UFavZY6wqNQ//32BvAg8D1UP8VNNBAAIv4g///dEKF/3Q+V/8VmNBAAIXAdDMl/wAAAIk+g/gCdQaATgRA6wmD+AN1BIBOBAhooA8AAI1GDFD/FXTQQACFwHQs/0YI6wqATgRAxwb+////Q4P7Aw+MaP////81dB1BAP8VlNBAADPAX1teycODyP/r9ov/VYvsVlcz9v91COgV4f//i/hZhf91JzkFgBhBAHYfVv8VpNBAAI2G6AMAADsFgBhBAHYDg8j/i/CD+P91yovHX15dw4v/VYvsVlcz9moA/3UM/3UI6K73//+L+IPEDIX/dSc5BYAYQQB2H1b/FaTQQACNhugDAAA7BYAYQQB2A4PI/4vwg/j/dcOLx19eXcOL/1WL7FZXM/b/dQz/dQjoikEAAIv4WVmF/3UsOUUMdCc5BYAYQQB2H1b/FaTQQACNhugDAAA7BYAYQQB2A4PI/4vwg/j/dcGLx19eXcNqEGjw70AA6L7z//8z24ld5GoB6JEDAABZiV38agNfiX3gOz3ALkEAfVSL96GkHkEAORywdEWLBLD2QAyDdA9Q6Ffq//9Zg/j/dAP/ReSD/xR8KKGkHkEAiwSwg8AgUP8VoNBAAKGkHkEA/zSw6Fvf//9ZoaQeQQCJHLBH66HHRfz+////6AkAAACLReToffP//8NqAeg2AgAAWcOL/1WL7FNWi3UIi0YMi8iA4QMz24D5AnVAqQgBAAB0OYtGCFeLPiv4hf9+LFdQVuiCEAAAWVDoI0gAAIPEDDvHdQ+LRgyEwHkPg+D9iUYM6weDTgwgg8v/X4tGCINmBACJBl6Lw1tdw4v/VYvsVot1CIX2dQlW6DUAAABZ6y9W6Hz///9ZhcB0BYPI/+sf90YMAEAAAHQUVugZEAAAUOiPSAAAWffYWRvA6wIzwF5dw2oUaBDwQADocvL//zP/iX3kiX3cagHoQgIAAFmJffwz9ol14Ds1wC5BAA+NgwAAAKGkHkEAjQSwOTh0XosA9kAMg3RWUFboXOD//1lZM9JCiVX8oaQeQQCLBLCLSAz2wYN0LzlVCHURUOhK////WYP4/3Qe/0Xk6xk5fQh1FPbBAnQPUOgv////WYP4/3UDCUXciX386AgAAABG64Qz/4t14KGkHkEA/zSwVuhl4P//WVnDx0X8/v///+gSAAAAg30IAYtF5HQDi0Xc6PPx///DagHorAAAAFnDagHoH////1nDi/9WVzP2v4gYQQCDPPVEBEEAAXUdjQT1QARBAIk4aKAPAAD/MIPHGP8VdNBAAIXAdAxGg/4kfNMzwEBfXsODJPVABEEAADPA6/GL/1OLHaDQQABWvkAEQQBXiz6F/3QTg34EAXQNV//TV+gv3f//gyYAWYPGCIH+YAVBAHzcvkAEQQBfiwaFwHQJg34EAXUDUP/Tg8YIgf5gBUEAfOZeW8OL/1WL7ItFCP80xUAEQQD/FVTQQABdw2oMaDjwQADo1/D//zP/R4l95DPbOR0YEkEAdRjoZPn//2oe6K73//9o/wAAAOi+9P//WVmLdQiNNPVABEEAOR50BIvH621qGOjt+///WYv4O/t1D+gy8P//xwAMAAAAM8DrUGoK6FgAAABZiV38OR51K2igDwAAV/8VdNBAAIXAdRdX6F7c//9Z6P3v///HAAwAAACJXeTrC4k+6wdX6EPc//9Zx0X8/v///+gJAAAAi0Xk6HDw///DagroKf///1nDi/9Vi+yLRQhWjTTFQARBAIM+AHUTUOgj////WYXAdQhqEeip9v//Wf82/xVQ0EAAXl3Di/9Vi+yD7CBTVzPbagczwFmNfeSJXeDzqzldFHUY6HPv///HABYAAADoFu///4PI/+mQAAAAi30QVot1DDv7dBk783UV6Ezv///HABYAAADo7+7//4PI/+truP///3+JReQ7+HcDiX3k/3UcjUXg/3UYx0XsQgAAAP91FIl16FCJdeD/VQiDxBCJRRQ783Q1O8N8Iv9N5HgHi0XgiBjrEY1F4FBT6CwBAABZWYP4/3QFi0UU6w8zwDld5IhcPv8PncCD6AJeX1vJw4v/VYvsg30UAHUV6Lzu///HABYAAADoX+7//4PI/13DU4tdEFaLdQhXhdt1EIX2dRA5dQx1EjPA6aoAAACF9nQHi30Mhf91EOh/7v//xwAWAAAA6YcAAADob+7///91HP91GP91FDv7diqLOENTVmhfhEAA6L3+//+DxBiD+P51R+hG7v//gzgidVnoPO7//4k461CLGFdWaF+EQADolP7//4PEGMZEPv8Ag/j+dRmDfRD/dRfoEu7//4M4InUl6Aju//+JGOschcB5G8YGAIP4/nUQ6PPt///HACIAAADolu3//4PI/19eW13Di/9Vi+z/dRhqAP91FP91EP91DP91COj5/v//g8QYXcOL/1WL7FFWi3UMVuiQCwAAiUUMi0YMWaiCdRfooO3//8cACQAAAINODCCDyP/pLwEAAKhAdA3ohe3//8cAIgAAAOvjUzPbqAF0FoleBKgQD4SHAAAAi04Ig+D+iQ6JRgyLRgyD4O+DyAKJRgyJXgSJXfypDAEAAHUs6Kva//+DwCA78HQM6J/a//+DwEA78HUN/3UM6KpSAABZhcB1B1boVlIAAFn3RgwIAQAAVw+EgAAAAItGCIs+jUgBiQ6LThgr+EmJTgQ7+34dV1D/dQzodEIAAIPEDIlF/OtNg8ggiUYMg8j/63mLTQyD+f90G4P5/nQWi8GD4B+L0cH6BcHgBgMElYAdQQDrBbgABEEA9kAEIHQUagJTU1Ho8VAAACPCg8QQg/j/dCWLRgiKTQiICOsWM/9HV41FCFD/dQzoBUIAAIPEDIlF/Dl9/HQJg04MIIPI/+sIi0UIJf8AAABfW17Jw4v/VYvsi0UIVovxxkYMAIXAdWPoiSIAAIlGCItIbIkOi0hoiU4Eiw47DSgOQQB0EosN4AtBAIVIcHUH6JlbAACJBotGBDsF6ApBAHQWi0YIiw3gC0EAhUhwdQjo+FMAAIlGBItGCPZAcAJ1FINIcALGRgwB6wqLCIkOi0AEiUYEi8ZeXcIEAIv/VYvsg+wgU1cz22oHM8BZjX3kiV3g86s5XRR1GOiy6///xwAWAAAA6FXr//+DyP/pvAAAAIt9EFaLdQw7+3QcO/N1GOiL6///xwAWAAAA6C7r//+DyP/plAAAAMdF7EIAAACJdeiJdeCB/////z92CcdF5P///3/rBo0EP4lF5P91HI1F4P91GP91FFD/VQiDxBCJRRQ783RWO8N8Qv9N5HgKi0XgiBj/ReDrEY1F4FBT6F39//9ZWYP4/3Qi/03keAeLReCIGOsRjUXgUFPoQP3//1lZg/j/dAWLRRTrEDPAOV3kZolEfv4PncCD6AJeX1vJw4v/VYvsg30UAHUV6M/q///HABYAAADocur//4PI/13DU4tdEFaLdQhXhdt1EIX2dRA5dQx1EjPA6a4AAACF9nQHi30Mhf91EOiS6v//xwAWAAAA6YsAAADogur///91HP91GP91FDv7diqLOENTVmgLoUAA6JH+//+DxBiD+P51SehZ6v//gzgidV3oT+r//4k461SLGFdWaAuhQADoaP7//zPJg8QYZolMfv6D+P51GYN9EP91F+gj6v//gzgidSfoGer//4kY6x6FwHkdM8lmiQ6D+P51EOgC6v//xwAiAAAA6KXp//+DyP9fXltdw4v/VYvsVot1CIX2dRXo3en//8cAFgAAAOiA6f//6foAAACLRgyogw+E7wAAAKhAD4XnAAAAqAJ0C4PIIIlGDOnYAAAAg8gBiUYMqQwBAAB1CVbo0k4AAFnrBYtGCIkG/3YY/3YIVuhkBwAAWVDoZwYAAIPEDIlGBIXAD4SLAAAAg/j/D4SCAAAA9kYMgnVRVug6BwAAWYP4/3QwVuguBwAAWYP4/nQkV1boIQcAAMH4BVaNPIWAHUEA6BEHAACD4B9ZweAGAwdZX+sFuAAEQQCKQAQkgjyCdQeBTgwAIAAAgX4YAAIAAHUVi0YMqAh0DqkABAAAdQfHRhgAEAAAiw7/TgQPtgFBiQ7rFPfYG8CD4BCDwBAJRgyDZgQAg8j/Xl3Di/9Vi+yD7ByLVRBWi3UIav5YiUXsiVXkO/B1G+i/6P//gyAA6KTo///HAAkAAACDyP/pfQUAAFMz2zvzfAg7NXQdQQByH+iV6P//iRjoe+j//8cACQAAAOge6P//g8j/6U4FAACLxsH4BVeD5h+NPIWAHUEAiwfB5gaKTDAE9sEBdRToWOj//4kY6D7o///HAAkAAADraIH6////f3dOiV30O9MPhAYFAAD2wQIPhf0EAAA5XQx0NYpEMCQCwND4iEX+D77ASGoEWXQZSHUOi8L30KgBdBaD4v6JVRCLXQyJXfDreovC99CoAXUZ6O7n//+JGOjU5///xwAWAAAA6Hfn///rNovC0eiJTRA7wXIDiUUQ/3UQ6GDz//+L2FmJXfCF23Ue6KLn///HAAwAAADoquf//8cACAAAAIPI/+luBAAAagFqAGoA/3UI6EZLAACLD4lEDiiDxBCJVA4siw8DzvZBBEiLw3R6ikkFgPkKdHKDfRAAdGz/TRCAff4AiAuLD41DAcdF9AEAAADGRA4FCnRQiw+KTA4lgPkKdEWDfRAAdD+ICIsPQP9NEIB9/gHHRfQCAAAAxkQOJQp1JYsPikwOJoD5CnQag30QAHQUiAiLD0D/TRDHRfQDAAAAxkQOJgpqAI1N6FH/dRBQiwf/NAb/FajQQACFwA+EeAMAAItN6IXJD4htAwAAO00QD4dkAwAAiwcBTfSNRAYE9gCAD4TkAQAAgH3+Ag+EFAIAAIXJdAqAOwp1BYAIBOsDgCD7i13wi0X0A8OJXRCJRfQ72A+D0QAAAItNEIoBPBoPhK8AAAA8DXQMiANDQYlNEOmRAAAAi0X0SDvIcxiNQQGAOAp1C4PBAolNEMYDCut1iUUQ623/RRBqAI1F6FBqAY1F/1CLB/80Bv8VqNBAAIXAdQr/FTjQQACFwHVFg33oAHQ/iwf2RAYESHQUgH3/CnS5xgMNiweKTf+ITAYF6yU7XfB1BoB9/wp0oGoBav9q//91COieSQAAg8QQgH3/CnQExgMNQ4tF9DlFEA+CRv///+sViweNRAYE9gBAdQWACALrBYoBiANDi8MrRfCAff4BiUX0D4XQAAAAhcAPhMgAAABLiguEyXgGQ+mGAAAAM8BAD7bJ6w+D+AR/Eztd8HIOSw+2C0CAuWAFQQAAdOiKEw+2yg++iWAFQQCFyXUN6Efl///HACoAAADrekE7yHUEA9jrQIsP9kQxBEh0JUOIVDEFg/gCfAmKE4sPiFQOJUOD+AN1CYoTiw+IVA4mQyvY6xL32JlqAVJQ/3UI6MRIAACDxBCLReQrXfDR6FD/dQxT/3XwagBo6f0AAP8VLNBAAIlF9IXAdTT/FTjQQABQ6Ozk//9Zg03s/4tF8DtFDHQHUOgO0f//WYtF7IP4/g+FiwEAAItF9OmDAQAAi0X0ixczyTvDD5XBA8CJRfSJTBYw68aFyXQLZoM7CnUFgAgE6wOAIPuLXfCLRfQDw4ldEIlF9DvYD4MBAQAAi0UQD7cIg/kaD4TZAAAAg/kNdBFmiQuDwwKDwAKJRRDptQAAAItN9IPB/jvBcx6NSAJmgzkKdQ2DwASJRRBqCumOAAAAiU0Q6YQAAACDRRACagCNRehQagKNRfhQiwf/NAb/FajQQACFwHUK/xU40EAAhcB1W4N96AB0VYsH9kQGBEh0KGaDffgKdLJqDVhmiQOLB4pN+IhMBgWLB4pN+YhMBiWLB8ZEBiYK6yo7XfB1B2aDffgKdIVqAWr/av7/dQjoY0cAAIPEEGaDffgKdAlqDVhmiQODwwKLRfQ5RRAPghr////rGYsPjXQOBPYGQHUFgA4C6wlmiwBmiQODwwIrXfCJXfTpkv7///8VONBAAGoFXjvGdRfoQeP//8cACQAAAOhJ4///iTDpav7//4P4bQ+FWv7//4Nl7ADpXP7//zPAX1teycNqEGhY8EAA6GLj//+LXQiD+/51G+gQ4///gyAA6PXi///HAAkAAACDyP/ptgAAAIXbeAg7HXQdQQByGujp4v//gyAA6M7i///HAAkAAADoceL//+vSi8PB+AWNPIWAHUEAi/OD5h/B5gaLBw++RDAEg+ABdMa4////fztFEBvAQHUV6KLi//+DIADoh+L//8cAFgAAAOu3U+jsYwAAWYNl/ACLB/ZEMAQBdBT/dRD/dQxT6JL5//+DxAyJReTrF+hS4v//xwAJAAAA6Fri//+DIACDTeT/x0X8/v///+gMAAAAi0Xk6Mni///Di10IU+g0ZAAAWcOL/1WL7ItFCIXAdRXoD+L//8cAFgAAAOiy4f//g8j/XcOLQBBdw4v/VYvsVot1FIX2dQQzwOthg30IAHUT6N7h//9qFl6JMOiC4f//i8brSIN9EAB0Fjl1DHIRVv91EP91COiRZQAAg8QM68f/dQxqAP91COgvAAAAg8QMg30QAHS7OXUMcw7olOH//2oiWYkIi/HrsmoWWF5dw8zMzMzMzMzMzMzMzMyLVCQMi0wkBIXSdGkzwIpEJAiEwHUWgfqAAAAAcg6DPWwdQQAAdAXphWgAAFeL+YP6BHIx99mD4QN0DCvRiAeDxwGD6QF19ovIweAIA8GLyMHgEAPBi8qD4gPB6QJ0BvOrhdJ0CogHg8cBg+oBdfaLRCQIX8OLRCQEw4v/VYvsVot1CFboz/7//1DobEYAAFlZhcB0fOhHzv//g8AgO/B1BDPA6w/oN87//4PAQDvwdWAzwED/BeAOQQD3RgwMAQAAdU5TV408hdgZQQCDPwC7ABAAAHUgU+hL7P//WYkHhcB1E41GFGoCiUYIiQZYiUYYiUYE6w2LP4l+CIk+iV4YiV4EgU4MAhEAADPAX0Bb6wIzwF5dw4v/VYvsg30IAHQnVot1DPdGDAAQAAB0GVbobu3//4FmDP/u//+DZhgAgyYAg2YIAFleXcP2QQxAdAaDeQgAdCT/SQR4C4sRiAL/AQ+2wOsMD77AUVDoSPL//1lZg/j/dQMJBsP/BsOL/1WL7IHsgAIAAKGEAkEAM8WJRfxTi10MVot1CDPAV4t9FP91EI2NpP3//4m10P3//4m95P3//4mFtP3//4mF8P3//4mFyP3//4mF6P3//4mFzP3//4mFvP3//4mFxP3//+g48///6I/f//+JhZT9//+F9nUr6IDf///HABYAAADoI9///4C9sP3//wB0CouFrP3//4NgcP2DyP/pNwsAAPZGDEB1XlboLv3//1m6AARBAIP4/3Qbg/j+dBaLyIPhH4vwwf4FweEGAwy1gB1BAOsCi8r2QSR/dZuD+P90GYP4/nQUi8iD4B/B+QXB4AYDBI2AHUEA6wKLwvZAJIAPhXH///8zyTvZD4Rn////ihOJjdz9//+Jjdj9//+Jjbj9//+Ile/9//+E0g+EjgoAAEMz9omdwP3//zm13P3//w+MeQoAAI1C4DxYdw8PvsIPvoDw20AAg+AP6wIzwA++hMEQ3EAAagfB+ARZiYWM/f//O8EPhyAKAAD/JIW1WEAAg43o/f///4m1iP3//4m1vP3//4m1yP3//4m1zP3//4m18P3//4m1xP3//+npCQAAD77Cg+ggdEqD6AN0NoPoCHQlSEh0FYPoAw+FygkAAION8P3//wjpvgkAAION8P3//wTpsgkAAION8P3//wHppgkAAIGN8P3//4AAAADplwkAAION8P3//wLpiwkAAID6KnUsg8cEib3k/f//i3/8ib3I/f//O/4PjWwJAACDjfD9//8E953I/f//6VoJAACLhcj9//9rwAoPvsqNRAjQiYXI/f//6T8JAACJtej9///pNAkAAID6KnUmg8cEib3k/f//i3/8ib3o/f//O/4PjRUJAACDjej9////6QkJAACLhej9//9rwAoPvsqNRAjQiYXo/f//6e4IAACA+kl0VYD6aHREgPpsdBiA+ncPhdYIAACBjfD9//8ACAAA6ccIAACAO2x1FkOBjfD9//8AEAAAiZ3A/f//6awIAACDjfD9//8Q6aAIAACDjfD9//8g6ZQIAACKAzw2dR6AewE0dRiDwwKBjfD9//8AgAAAiZ3A/f//6XAIAAA8M3UegHsBMnUYg8MCgaXw/f///3///4mdwP3//+lOCAAAPGQPhEYIAAA8aQ+EPggAADxvD4Q2CAAAPHUPhC4IAAA8eA+EJggAADxYD4QeCAAAibWM/f//IbXE/f//jYWk/f//UA+2wlDoJk8AAFmFwIqF7/3//1l0IouN0P3//4213P3//+gY/P//igNDiZ3A/f//hMAPhLD8//+LjdD9//+Ntdz9///o9vv//+m+BwAAD77Cg/hkD4+2AQAAD4RYAgAAg/hTD4+6AAAAdEyD6EF0EEhIdCRISHQISEgPhasFAACAwiDHhYj9//8BAAAAiJXv/f//6VYCAAD3hfD9//8wCAAAD4WeAAAAgY3w/f//AAgAAOmPAAAA94Xw/f//MAgAAHUKgY3w/f//AAgAAIuN6P3//4P5/3UFuf///3+DxwT3hfD9//8QCAAAib3k/f//i3/8ib3g/f//D4T+BAAAhf91C6FkBkEAiYXg/f//i4Xg/f//x4XE/f//AQAAAOnMBAAAg+hYD4QiAwAASEh0fyvBD4S2AQAASEgPhesEAACLveT9//+DxwT3hfD9//8QCAAAib3k/f//dDAPt0f8UGgAAgAAjYX0/f//UI2F2P3//1DoTWQAAIPEEIXAdB/Hhbz9//8BAAAA6xOKR/yIhfT9///Hhdj9//8BAAAAjYX0/f//iYXg/f//6XwEAACLB4PHBIm95P3//4XAdDuLSASFyXQ094Xw/f//AAgAAA+/AImN4P3//3QUmSvC0fjHhcT9//8BAAAA6TcEAAAhtcT9///pLAQAAKFgBkEAiYXg/f//UOhLJAAAWekVBAAAg/hwD489AgAAD4QlAgAAg/hlD4wDBAAAg/hnD463AAAAg/hpdHyD+G50LoP4bw+F5wMAAPaF8P3//4CLveT9///Hhdj9//8IAAAAdGyBjfD9//8AAgAA62CDheT9//8Ei4Xk/f//i3D86GxLAACFwA+EYvr///aF8P3//yB0DGaLhdz9//9miQbrCIuF3P3//4kGx4W8/f//AQAAAOk+BQAAi73k/f//g43w/f//QMeF2P3//woAAACLjfD9///3wQCAAAAPhOABAACLB4tXBIPHCOkMAgAAi73k/f//g43w/f//QI2d9P3//7gAAgAAiZ3g/f//iYWg/f//ObXo/f//fQzHhej9//8GAAAA62p1EYD6Z3Vjx4Xo/f//AQAAAOtXOYXo/f//fgaJhej9//+Bvej9//+jAAAAfj2Ltej9//+Bxl0BAABW6L3k//+Kle/9//9ZiYW4/f//hcB0EImF4P3//4m1oP3//4vY6wrHhej9//+jAAAAiweLNXzQQACDxwiJhYD9//+LR/yJhYT9//+NhaT9//9Q/7WI/f//D77C/7Xo/f//ib3k/f//UP+1oP3//42FgP3//1NQ/zWoBkEA/9b/0Iu98P3//4PEHIHngAAAAHQdg73o/f//AHUUjYWk/f//UFP/NbQGQQD/1v/QWVmAve/9//9ndRiF/3UUjYWk/f//UFP/NbAGQQD/1v/QWVmAOy11EYGN8P3//wABAABDiZ3g/f//U+nB/f//x4Xo/f//CAAAAImNtP3//+sqg+hzD4Ru/P//SEgPhFj+//+D6AMPhbsBAACLveT9///HhbT9//8nAAAA9oXw/f//gMeF2P3//xAAAAAPhDL+//+KhbT9//8EUcaF1P3//zCIhdX9///Hhcz9//8CAAAA6Q7+///3wQAQAAAPhRT+//+DxwT2wSB0GIm95P3///bBQHQGD79H/OsED7dH/JnrE4tH/PbBQHQDmesCM9KJveT9///2wUB0GoXSfxZ8BIXAcxD32BPW99qBjfD9//8AAQAA94Xw/f//AJAAAIv6i9h1AjP/ObXo/f//fQzHhej9//8BAAAA6xqDpfD9///3uAACAAA5hej9//9+BomF6P3//4vDC8d1BiG1zP3//41184uF6P3///+N6P3//4XAfwaLwwvHdC2Lhdj9//+ZUlBXU+j3SQAAg8EwiZ2g/f//i9iL+oP5OX4GA420/f//iA5O672NRfMrxkb3hfD9//8AAgAAiYXY/f//ibXg/f//dGKFwHQHi86AOTB0V/+N4P3//4uN4P3//8YBMEDrP0lmOTB0B4PAAoXJdfMrheD9///R+Osohf91C6FgBkEAiYXg/f//i4Xg/f//6wdJgDgAdAVAhcl19SuF4P3//4mF2P3//4O9vP3//wAPhbgBAACLjfD9///2wUB0NffBAAEAAHQJxoXU/f//Lesa9sEBdAnGhdT9//8r6wz2wQJ0EcaF1P3//yDHhcz9//8BAAAAi4XI/f//K4XY/f//K4XM/f//iYWg/f//9sEMdSWL+Osdi43Q/f//jbXc/f//sCBP6JL1//+Dvdz9////dASF/3/f/7XM/f//i72U/f//i53Q/f//jYXU/f//UI2F3P3//+jELAAA9oXw/f//CFlZdC72hfD9//8EdSWLvaD9///rGY213P3//4vLsDBP6DX1//+Dvdz9////dASF/3/jg73E/f//AIuF2P3//3R1hcB+cYu14P3//4mFmP3//w+3Bv+NmP3//1BqBo1F9FCNhZD9//9Qg8YC6HBeAACDxBCFwHU2OYWQ/f//dC7/tZD9//+LvZT9//+LndD9//+NRfRQjYXc/f//6B0sAACDvZj9//8AWVl1pusjg43c/f///+sai72U/f//UP+14P3//42F3P3//+jvKwAAWVmDvdz9//8AfDL2hfD9//8EdCmLvaD9///rHYuN0P3//4213P3//7AgT+hc9P//g73c/f///3QEhf9/34O9uP3//wB0E/+1uP3//+jEwP//g6W4/f//AFmLncD9//+KA4iF7/3//4TAdBOLjYz9//+LveT9//+K0Oly9f//gL2w/f//AHQKi4Ws/f//g2Bw/YuF3P3//4tN/F9eM81b6Da////Jw5BPUEAATk5AAH5OQADcTkAAKE9AADNPQAB5T0AAqVBAAIv/VYvsVot1CFbo7lQAAFmD+P91EOjZ0///xwAJAAAAg8j/601X/3UQagD/dQxQ/xWs0EAAi/iD//91CP8VONBAAOsCM8CFwHQMUOjJ0///WYPI/+sbi8bB+AWLBIWAHUEAg+YfweYGjUQwBIAg/YvHX15dw2oQaHjwQADoytP//4tdCIP7/nUb6HjT//+DIADoXdP//8cACQAAAIPI/+mUAAAAhdt4CDsddB1BAHIa6FHT//+DIADoNtP//8cACQAAAOjZ0v//69KLw8H4BY08hYAdQQCL84PmH8HmBosHD75EMASD4AF0xlPodlQAAFmDZfwAiwf2RDAE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WYXAdDqLjTTl//8rywNNEDPAQDvID4alAQAAagKNhUTl//9TUOhPIgAAg8QMg/j/D4SSBAAAQ/+FQOX//+sbagFTjYVE5f//UOgrIgAAg8QMg/j/D4RuBAAAM8BQUGoFjU30UWoBjY1E5f//UVD/tSDl//9D/4VA5f///xW40EAAi/CF9g+EPQQAAGoAjYUs5f//UFaNRfRQi4Uk5f//iwD/NAf/FZDQQACFwA+ECgQAAIuFQOX//4uNMOX//wPBiYU45f//ObUs5f//D4z2AwAAg70c5f//AA+EzQAAAGoAjYUs5f//UGoBjUX0UIuFJOX//4sAxkX0Df80B/8VkNBAAIXAD4SxAwAAg70s5f//AQ+MsAMAAP+FMOX///+FOOX//+mDAAAAPAF0BDwCdSEPtzMzyYP+Cg+UwYPDAoOFQOX//wKJtUTl//+JjRzl//88AXQEPAJ1Uv+1ROX//+h3PAAAWWY7hUTl//8PhUkDAACDhTjl//8Cg70c5f//AHQpag1YUImFROX//+hKPAAAWWY7hUTl//8PhRwDAAD/hTjl////hTDl//+LRRA5hUDl//8Pgvn9///pCAMAAIsOihP/hTjl//+IVA80iw6JRA846e8CAAAzyYsD9kQ4BIAPhKECAACAvT/l//8AiY1E5f//D4WoAAAAi5005f//OU0QD4b9AgAAi8sz9iuNNOX//42FSOX//ztNEHMmihNDQYmdIOX//4D6CnUL/4Uw5f//xgANQEaIEEBGgf7/EwAActWL8I2FSOX//yvwagCNhSjl//9QVo2FSOX//1CLhSTl//+LAP80B/8VkNBAAIXAD4RDAgAAi4Uo5f//AYU45f//O8YPjDsCAACLwyuFNOX//ztFEA+CbP///+klAgAAgL0/5f//Ag+FzQAAAIudNOX//zlNEA+GSAIAAIOlQOX//wCLyyuNNOX//2oCjYVI5f//XjtNEHNDD7cTA94DzomdIOX//4P6CnUaAbUw5f//ag1bZokYi50g5f//A8YBtUDl//8BtUDl//9miRADxoG9QOX///4TAAByuIvwjYVI5f//K/BqAI2FKOX//1BWjYVI5f//UIuFJOX//4sA/zQH/xWQ0EAAhcAPhGkBAACLhSjl//8BhTjl//87xg+MYQEAAIvDK4U05f//O0UQD4JH////6UsBAACLhTTl//+JhSzl//85TRAPhnUBAACLjSzl//+DpUDl//8AK4005f//agKNhUj5//9eO00QczuLlSzl//8PtxIBtSzl//8DzoP6CnUOag1bZokYA8YBtUDl//8BtUDl//9miRADxoG9QOX//6gGAABywDP2VlZoVQ0AAI2N8Ov//1GNjUj5//8rwZkrwtH4UIvBUFZo6f0AAP8VuNBAAIvYO94PhJcAAABqAI2FKOX//1CLwyvGUI2ENfDr//9Qi4Uk5f//iwD/NAf/FZDQQACFwHQMA7Uo5f//O95/y+sM/xU40EAAiYVE5f//O95/XIuFLOX//yuFNOX//4mFOOX//ztFEA+CC////+s/UY2NKOX//1H/dRD/tTTl////NDj/FZDQQACFwHQVi4Uo5f//g6VE5f//AImFOOX//+sM/xU40EAAiYVE5f//g7045f//AHVsg71E5f//AHQtagVeObVE5f//dRTo5qr//8cACQAAAOjuqv//iTDrP/+1ROX//+jyqv//Wesxi4Uk5f//iwD2RAcEQHQPi4U05f//gDgadQQzwOsk6Kaq///HABwAAADorqr//4MgAIPI/+sMi4U45f//K4Uw5f//W4tN/F8zzV7ompX//8nDahBoqPFAAOjEqv//i10Ig/v+dRvocqr//4MgAOhXqv//xwAJAAAAg8j/6ZQAAACF23gIOx10HUEAchroS6r//4MgAOgwqv//xwAJAAAA6NOp///r0ovDwfgFjTyFgB1BAIvzg+YfweYGiwcPvkQwBIPgAXTGU+hwKwAAWYNl/ACLB/ZEMAQBdBT/dRD/dQxT6G74//+DxAyJReTrF+jWqf//xwAJAAAA6N6p//+DIACDTeT/x0X8/v///+gMAAAAi0Xk6E2q///Di10IU+i4KwAAWcNqEGjI8UAA6PCp//+LXQiD+/51E+iLqf//xwAJAAAAg8j/6aEAAACF23gIOx10HUEAchLobKn//8cACQAAAOgPqf//69qLw8H4BY08hYAdQQCL84PmH8HmBosHD75EBgSD4AF0zlPorCoAAFmDZfwAiwf2RAYEAXQxU+gvKgAAWVD/FQTRQACFwHUL/xU40EAAiUXk6wSDZeQAg33kAHQZ6BKp//+LTeSJCOj1qP//xwAJAAAAg03k/8dF/P7////oDAAAAItF5Oh0qf//w4tdCFPo3yoAAFnDi/9Vi+xR9kMMQFaL8IsHiUX8dA2DewgAdQeLRQwBBus+gycAg30MAH4wi0UIigD/TQyLy+hkyP///0UIgz7/dQ6DPyp1D4vLsD/oTsj//4N9DAB/1YM/AHUFi0X8iQdeycOL/1WL7IHsgAIAAKGEAkEAM8WJRfxTi10MVot1CDPAV4t9FP91EI2NrP3//4m10P3//4m95P3//4mFqP3//4mF8P3//4mFyP3//4mF6P3//4mFzP3//4mFpP3//4mFxP3//+imu///6P2n//+JhZz9//+F9nUr6O6n///HABYAAADokaf//4C9uP3//wB0CouFtP3//4NgcP2DyP/pYQsAAPZGDEB1XlbonMX//1m6AARBAIP4/3Qbg/j+dBaLyIPhH4vwwf4FweEGAwy1gB1BAOsCi8r2QSR/dZuD+P90GYP4/nQUi8iD4B/B+QXB4AYDBI2AHUEA6wKLwvZAJIAPhXH///8z9jveD4Rn////ihOJtdz9//+Jtdj9//+Jtbz9//+JtaD9//+Ile/9//+E0g+EsgoAAEOJncD9//85tdz9//8PjIkKAACNQuA8WHcPD77CD7aAwOVAAIPgD+sCM8CLjbz9//9rwAkPtoQI4OVAAGoIwegEXomFvP3//zvGD4Tv/v//agdZO8EPhyAKAAD/JIVzkEAAM8CDjej9////iYWM/f//iYWk/f//iYXI/f//iYXM/f//iYXw/f//iYXE/f//6ecJAAAPvsKD6CB0SIPoA3Q0K8Z0JEhIdBSD6AMPhckJAAAJtfD9///pvgkAAION8P3//wTpsgkAAION8P3//wHppgkAAIGN8P3//4AAAADplwkAAION8P3//wLpiwkAAID6KnUsg8cEib3k/f//i3/8ib3I/f//hf8PiWwJAACDjfD9//8E953I/f//6VoJAACLhcj9//9rwAoPvsqNRAjQiYXI/f//6T8JAACDpej9//8A6TMJAACA+ip1JoPHBIm95P3//4t//Im96P3//4X/D4kUCQAAg43o/f///+kICQAAi4Xo/f//a8AKD77KjUQI0ImF6P3//+ntCAAAgPpJdFWA+mh0RID6bHQYgPp3D4XVCAAAgY3w/f//AAgAAOnGCAAAgDtsdRZDgY3w/f//ABAAAImdwP3//+mrCAAAg43w/f//EOmfCAAAg43w/f//IOmTCAAAigM8NnUegHsBNHUYg8MCgY3w/f//AIAAAImdwP3//+lvCAAAPDN1HoB7ATJ1GIPDAoGl8P3///9///+JncD9///pTQgAADxkD4RFCAAAPGkPhD0IAAA8bw+ENQgAADx1D4QtCAAAPHgPhCUIAAA8WA+EHQgAAIOlvP3//wCDpcT9//8AjYWs/f//UA+2wlDoeRcAAFmFwIqF7/3//1l0IouN0P3//4213P3//+hrxP//igNDiZ3A/f//hMAPhJX8//+LjdD9//+Ntdz9///oScT//+m7BwAAD77Cg/hkD4+3AQAAD4RVAgAAg/hTD4+6AAAAdEyD6EF0EEhIdCRISHQISEgPhagFAACAwiDHhYz9//8BAAAAiJXv/f//6VMCAAD3hfD9//8wCAAAD4WeAAAAgY3w/f//AAgAAOmPAAAA94Xw/f//MAgAAHUKgY3w/f//AAgAAIuN6P3//4P5/3UFuf///3+DxwT3hfD9//8QCAAAib3k/f//i3/8ib3g/f//D4T7BAAAhf91C6FkBkEAiYXg/f//i4Xg/f//x4XE/f//AQAAAOnJBAAAg+hYD4QcAwAASEh0fyvBD4SzAQAASEgPhegEAACLveT9//+DxwT3hfD9//8QCAAAib3k/f//dDAPt0f8UGgAAgAAjYX0/f//UI2F2P3//1DooCwAAIPEEIXAdB/HhaT9//8BAAAA6xOKR/yIhfT9///Hhdj9//8BAAAAjYX0/f//iYXg/f//6XkEAACLB4PHBIm95P3//4XAdDyLSASFyXQ194Xw/f//AAgAAA+/AImN4P3//3QUmSvC0fjHhcT9//8BAAAA6TQEAACDpcT9//8A6SgEAAChYAZBAImF4P3//1Donez//1npEQQAAIP4cA+PNgIAAA+EIgIAAIP4ZQ+M/wMAAIP4Zw+OswAAAIP4aXR4g/hudCqD+G8PheMDAAD2hfD9//+Ai73k/f//ibXY/f//dGyBjfD9//8AAgAA62CDheT9//8Ei4Xk/f//i3D86MITAACFwA+ESvr///aF8P3//yB0DGaLhdz9//9miQbrCIuF3P3//4kGx4Wk/f//AQAAAOk+BQAAi73k/f//g43w/f//QMeF2P3//woAAACLjfD9///3wQCAAAAPhN0BAAAD/otH+ItX/OkJAgAAi73k/f//g43w/f//QIO96P3//wCNnfT9//+4AAIAAImd4P3//4mFmP3//30Mx4Xo/f//BgAAAOtqdRGA+md1Y8eF6P3//wEAAADrVzmF6P3//34GiYXo/f//gb3o/f//owAAAH49i7Xo/f//gcZdAQAAVugSrf//ipXv/f//WYmFoP3//4XAdBCJheD9//+JtZj9//+L2OsKx4Xo/f//owAAAIsHizV80EAAg8cIiYWA/f//i0f8iYWE/f//jYWs/f//UP+1jP3//w++wv+16P3//4m95P3//1D/tZj9//+NhYD9//9TUP81qAZBAP/W/9CLvfD9//+DxByB54AAAAB0HYO96P3//wB1FI2FrP3//1BT/zW0BkEA/9b/0FlZgL3v/f//Z3UYhf91FI2FrP3//1BT/zWwBkEA/9b/0FlZgDstdRGBjfD9//8AAQAAQ4md4P3//1PpxP3//4m16P3//4mNqP3//+sqg+hzD4R0/P//SEgPhFv+//+D6AMPhb4BAACLveT9///Hhaj9//8nAAAA9oXw/f//gMeF2P3//xAAAAAPhDX+//+Khaj9//8EUcaF1P3//zCIhdX9///Hhcz9//8CAAAA6RH+///3wQAQAAAPhRf+//+DxwT2wSB0GIm95P3///bBQHQGD79H/OsED7dH/JnrE4tH/PbBQHQDmesCM9KJveT9///2wUB0G4XSfxd8BIXAcxH32IPSAPfagY3w/f//AAEAAPeF8P3//wCQAACL+ovYdQIz/4O96P3//wB9DMeF6P3//wEAAADrGoOl8P3///e4AAIAADmF6P3//34GiYXo/f//i8MLx3UGIYXM/f//jXXzi4Xo/f///43o/f//hcB/BovDC8d0LYuF2P3//5lSUFdT6E4SAACDwTCJnZj9//+L2Iv6g/k5fgYDjaj9//+IDk7rvY1F8yvGRveF8P3//wACAACJhdj9//+JteD9//90Y4XAdAeLzoA5MHRY/43g/f//i43g/f//xgEwQOtASWaDOAB0B4PAAoXJdfIrheD9///R+Osohf91C6FgBkEAiYXg/f//i4Xg/f//6wdJgDgAdAVAhcl19SuF4P3//4mF2P3//4O9pP3//wAPhbgBAACLjfD9///2wUB0NffBAAEAAHQJxoXU/f//Lesa9sEBdAnGhdT9//8r6wz2wQJ0EcaF1P3//yDHhcz9//8BAAAAi4XI/f//K4XY/f//K4XM/f//iYWY/f//9sEMdSWL+Osdi43Q/f//jbXc/f//sCBP6Oi9//+Dvdz9////dASF/3/f/7XM/f//i72c/f//i53Q/f//jYXU/f//UI2F3P3//+ga9f//9oXw/f//CFlZdC72hfD9//8EdSWLvZj9///rGY213P3//4vLsDBP6Iu9//+Dvdz9////dASF/3/jg73E/f//AIuF2P3//3R1hcB+cYu14P3//4mFkP3//w+3Bv+NkP3//1BqBo1F9FCNhYj9//9Qg8YC6MYmAACDxBCFwHU2OYWI/f//dC7/tYj9//+LvZz9//+LndD9//+NRfRQjYXc/f//6HP0//+DvZD9//8AWVl1pusjg43c/f///+sai72c/f//UP+14P3//42F3P3//+hF9P//WVmDvdz9//8AfDL2hfD9//8EdCmLvZj9///rHYuN0P3//4213P3//7AgT+iyvP//g73c/f///3QEhf9/34O9oP3//wB0E/+1oP3//+gaif//g6Wg/f//AFmLncD9//+KA4iF7/3//4TAdA+LveT9//8z9orQ6WT1//+Dvbz9//8AdA2Dvbz9//8HD4WN9P//gL24/f//AHQKi4W0/f//g2Bw/YuF3P3//4tN/F9eM81b6HqH///Jw41JAPuHQAD4hUAAKoZAAIaGQADShkAA3oZAACSHQABWiEAAi/9Vi+xRUYtFDFaLdQiJRfiLRRBXVolF/OghHQAAg8//WTvHdRHoCpz//8cACQAAAIvHi9frSv91FI1N/FH/dfhQ/xWs0EAAiUX4O8d1E/8VONBAAIXAdAlQ6Pyb//9Z68+LxsH4BYsEhYAdQQCD5h/B5gaNRDAEgCD9i0X4i1X8X17Jw2oUaOjxQADo/Jv//4PL/4ld3Ild4ItFCIP4/nUc6KGb//+DIADohpv//8cACQAAAIvDi9PpoQAAAIXAeAg7BXQdQQByGuh5m///gyAA6F6b///HAAkAAADoAZv//+vRi8jB+QWNPI2AHUEAi/CD5h/B5gaLDw++TDEEg+EBdMZQ6J4cAABZg2X8AIsH9kQwBAF0HP91FP91EP91DP91COjX/v//g8QQiUXciVXg6xno/Jr//8cACQAAAOgEm///gyAAiV3ciV3gx0X8/v///+gMAAAAi0Xci1Xg6G6b///D/3UI6NocAABZw4v/VYvs/wXgDkEAaAAQAADoYKb//1mLTQiJQQiFwHQNg0kMCMdBGAAQAADrEYNJDASNQRSJQQjHQRgCAAAAi0EIg2EEAIkBXcOL/1WL7ItFCIP4/nUP6Gua///HAAkAAAAzwF3DhcB4CDsFdB1BAHIS6FCa///HAAkAAADo85n//+vei8iD4B/B+QWLDI2AHUEAweAGD75EAQSD4EBdwy2kAwAAdCKD6AR0F4PoDXQMSHQDM8DDuAQEAADDuBIEAADDuAQIAADDuBEEAADDi/9WV4vwaAEBAAAz/41GHFdQ6Gm4//8zwA+3yIvBiX4EiX4IiX4MweEQC8GNfhCrq6u5wAZBAIPEDI1GHCvOvwEBAACKFAGIEEBPdfeNhh0BAAC+AAEAAIoUCIgQQE51919ew4v/VYvsgewcBQAAoYQCQQAzxYlF/FNXjYXo+v//UP92BP8VCNFAAL8AAQAAhcAPhPwAAAAzwIiEBfz+//9AO8dy9IqF7vr//8aF/P7//yCEwHQwjZ3v+v//D7bID7YDO8h3FivBQFCNlA38/v//aiBS6Ka3//+DxAyKQwGDwwKEwHXWagD/dgyNhfz6////dgRQV42F/P7//1BqAWoA6IgqAAAz21P/dgSNhfz9//9XUFeNhfz+//9QV/92DFPoOykAAIPERFP/dgSNhfz8//9XUFeNhfz+//9QaAACAAD/dgxT6BYpAACDxCQzwA+3jEX8+v//9sEBdA6ATAYdEIqMBfz9///rEfbBAnQVgEwGHSCKjAX8/P//iIwGHQEAAOsHiJwGHQEAAEA7x3K/61KNhh0BAADHheT6//+f////M8kpheT6//+LleT6//+NhA4dAQAAA9CNWiCD+xl3CoBMDh0QjVEg6w2D+hl3DIBMDh0gjVHgiBDrA8YAAEE7z3LGi038XzPNW+gmg///ycNqDGgI8kAA6FCY///oOM7//4v4oeALQQCFR3B0HYN/bAB0F4t3aIX2dQhqIOjanv//WYvG6GiY///Dag3o+qf//1mDZfwAi3doiXXkOzXoCkEAdDaF9nQaVv8V3NBAAIXAdQ+B/sAGQQB0B1bo7oP//1mh6ApBAIlHaIs16ApBAIl15Fb/FdDQQADHRfz+////6AUAAADrjot15GoN6MCm//9Zw4v/VYvsg+wQUzPbU41N8Ojwqv//iR0wG0EAg/7+dR7HBTAbQQABAAAA/xUQ0UAAOF38dEWLTfiDYXD96zyD/v11EscFMBtBAAEAAAD/FQzRQADr24P+/HUSi0Xwi0AExwUwG0EAAQAAAOvEOF38dAeLRfiDYHD9i8ZbycOL/1WL7IPsIKGEAkEAM8WJRfxTi10MVot1CFfoZP///4v4M/aJfQg7/nUOi8Pouvz//zPA6aEBAACJdeQzwDm48ApBAA+EkQAAAP9F5IPAMD3wAAAAcueB/+j9AAAPhHQBAACB/+n9AAAPhGgBAAAPt8dQ/xUU0UAAhcAPhFYBAACNRehQV/8VCNFAAIXAD4Q3AQAAaAEBAACNQxxWUOjJtP//M9JCg8QMiXsEiXMMOVXoD4b8AAAAgH3uAA+E0wAAAI1174oOhMkPhMYAAAAPtkb/D7bJ6akAAABoAQEAAI1DHFZQ6IK0//+LTeSDxAxryTCJdeCNsQALQQCJdeTrK4pGAYTAdCkPtj4PtsDrEotF4IqA7ApBAAhEOx0PtkYBRzv4duqLfQiDxgKAPgB10It15P9F4IPGCIN94ASJdeRy6YvHiXsEx0MIAQAAAOhp+///agaJQwyNQxCNifQKQQBaZosxZokwg8ECg8ACSnXxi/Po1/v//+m0/v//gEwDHQRAO8F29oPGAoB+/wAPhTD///+NQx65/gAAAIAICEBJdfmLQwToEfv//4lDDIlTCOsDiXMIM8APt8iLwcHhEAvBjXsQq6ur66c5NTAbQQAPhVT+//+DyP+LTfxfXjPNW+gdgP//ycNqFGgo8kAA6EeV//+DTeD/6CvL//+L+Il93OjY/P//i19oi3UI6HH9//+JRQg7QwQPhFcBAABoIAIAAOhqoP//WYvYhdsPhEYBAAC5iAAAAIt3aIv786WDIwBT/3UI6LT9//9ZWYlF4IXAD4X8AAAAi3Xc/3Zo/xXc0EAAhcB1EYtGaD3ABkEAdAdQ6MaA//9ZiV5oU4s90NBAAP/X9kZwAg+F6gAAAPYF4AtBAAEPhd0AAABqDeh3pP//WYNl/ACLQwSjQBtBAItDCKNEG0EAi0MMo0gbQQAzwIlF5IP4BX0QZotMQxBmiQxFNBtBAEDr6DPAiUXkPQEBAAB9DYpMGByIiOAIQQBA6+kzwIlF5D0AAQAAfRCKjBgdAQAAiIjoCUEAQOvm/zXoCkEA/xXc0EAAhcB1E6HoCkEAPcAGQQB0B1DoDYD//1mJHegKQQBT/9fHRfz+////6AIAAADrMGoN6PGi//9Zw+slg/j/dSCB+8AGQQB0B1Po13///1nodpP//8cAFgAAAOsEg2XgAItF4Oj/k///w4M9jB5BAAB1Emr96Fb+//9ZxwWMHkEAAQAAADPAw4v/VYvsU1aLNdDQQABXi30IV//Wi4ewAAAAhcB0A1D/1ouHuAAAAIXAdANQ/9aLh7QAAACFwHQDUP/Wi4fAAAAAhcB0A1D/1o1fUMdFCAYAAACBe/jkC0EAdAmLA4XAdANQ/9aDe/wAdAqLQwSFwHQDUP/Wg8MQ/00IddaLh9QAAAAFtAAAAFD/1l9eW13Di/9Vi+xXi30Ihf8PhIMAAABTVos13NBAAFf/1ouHsAAAAIXAdANQ/9aLh7gAAACFwHQDUP/Wi4e0AAAAhcB0A1D/1ouHwAAAAIXAdANQ/9aNX1DHRQgGAAAAgXv45AtBAHQJiwOFwHQDUP/Wg3v8AHQKi0MEhcB0A1D/1oPDEP9NCHXWi4fUAAAABbQAAABQ/9ZeW4vHX13Di/9Vi+xTVot1CIuGvAAAADPbVzvDdG89SA5BAHRoi4awAAAAO8N0XjkYdVqLhrgAAAA7w3QXORh1E1DoNn7///+2vAAAAOiHJwAAWVmLhrQAAAA7w3QXORh1E1DoFX7///+2vAAAAOj9JgAAWVn/trAAAADo/X3///+2vAAAAOjyff//WVmLhsAAAAA7w3REORh1QIuGxAAAAC3+AAAAUOjRff//i4bMAAAAv4AAAAArx1Dovn3//4uG0AAAACvHUOiwff///7bAAAAA6KV9//+DxBCLhtQAAAA96AtBAHQbOZi0AAAAdRNQ6AMjAAD/ttQAAADofH3//1lZjX5Qx0UIBgAAAIF/+OQLQQB0EYsHO8N0CzkYdQdQ6Fd9//9ZOV/8dBKLRwQ7w3QLORh1B1DoQH3//1mDxxD/TQh1x1boMX3//1lfXltdw4v/VYvsV4t9DIX/dDuLRQiFwHQ0VoswO/d0KFeJOOhq/f//WYX2dBtW6O79//+DPgBZdQ+B/lANQQB0B1boc/7//1mLx17rAjPAX13DagxoSPJAAOjPkP//6LfG//+L8KHgC0EAhUZwdCKDfmwAdBzooMb//4twbIX2dQhqIOhUl///WYvG6OKQ///DagzodKD//1mDZfwA/zUoDkEAg8ZsVuhZ////WVmJReTHRfz+////6AIAAADrvmoM6G2f//9Zi3Xkw4v/VYvsg+wQoYQCQQAzxYlF/FNWi3UM9kYMQFcPhTYBAABW6MKt//9ZuwAEQQCD+P90Llbosa3//1mD+P50Ilbopa3//8H4BVaNPIWAHUEA6JWt//+D4B9ZweAGAwdZ6wKLw4pAJCR/PAIPhOgAAABW6HSt//9Zg/j/dC5W6Git//9Zg/j+dCJW6Fyt///B+AVWjTyFgB1BAOhMrf//g+AfWcHgBgMHWesCi8OKQCQkfzwBD4SfAAAAVugrrf//WYP4/3QuVugfrf//WYP4/nQiVugTrf//wfgFVo08hYAdQQDoA63//4PgH1nB4AYDB1nrAovD9kAEgHRd/3UIjUX0agVQjUXwUOhVGAAAg8QQhcB0B7j//wAA610z/zl98H4w/04EeBKLBopMPfSICIsOD7YBQYkO6w4PvkQ99FZQ6AWh//9ZWYP4/3TIRzt98HzQZotFCOsgg0YE/ngNiw6LRQhmiQGDBgLrDQ+3RQhWUOhJJQAAWVmLTfxfXjPNW+ilef//ycOhhAJBAIPIATPJOQVMG0EAD5TBi8HDi/9Vi+yD7BBTVot1DDPbO/N0FTldEHQQOB51EotFCDvDdAUzyWaJCDPAXlvJw/91FI1N8OjYof//i0XwOVgUdR6LRQg7w3QGD7YOZokIOF38dAeLRfiDYHD9M8BA68uNRfBQD7YGUOjEAAAAWVmFwHR9i0Xwi4isAAAAg/kBfiU5TRB8IDPSOV0ID5XCUv91CFFWagn/cAT/FSzQQACFwItF8HUQi00QO4isAAAAciA4XgF0G4uArAAAADhd/A+EZv///4tN+INhcP3pWv///+iYjf//xwAqAAAAOF38dAeLRfiDYHD9g8j/6Tv///8zwDldCA+VwFD/dQiLRfBqAVZqCf9wBP8VLNBAAIXAD4U6////67qL/1WL7GoA/3UQ/3UM/3UI6NX+//+DxBBdw4v/VYvsg+wQ/3UMjU3w6M6g//8PtkUIi03wi4nIAAAAD7cEQSUAgAAAgH38AHQHi034g2Fw/cnDi/9Vi+xqAP91COi5////WVldw8zMzMzMzMzMzMxWi0QkFAvAdSiLTCQQi0QkDDPS9/GL2ItEJAj38Yvwi8P3ZCQQi8iLxvdkJBAD0etHi8iLXCQQi1QkDItEJAjR6dHb0erR2AvJdfT384vw92QkFIvIi0QkEPfmA9FyDjtUJAx3CHIPO0QkCHYJTitEJBAbVCQUM9srRCQIG1QkDPfa99iD2gCLyovTi9mLyIvGXsIQAIv/VYvs9kAMQHQGg3gIAHQaUP91COgv/P//WVm5//8AAGY7wXUFgw7/XcP/Bl3Di/9Vi+xR9kMMQFaL8IsHiUX8dA2DewgAdQeLRQwBButDgycAg30MAH41i0UID7cA/00MUIvD6Jb///+DRQgCgz7/WXUPgz8qdRBqP4vD6H7///9Zg30MAH/Qgz8AdQWLRfyJB17Jw4v/VYvsgex4BAAAoYQCQQAzxYlF/FOLXRRWi3UIM8BX/3UQi30MjY20+///ibXU+///iZ3k+///iYWs+///iYX4+///iYXY+///iYX0+///iYXc+///iYWw+///iYXQ+///6Pqe///oUYv//4mFnPv//4X2dSvoQov//8cAFgAAAOjliv//gL3A+///AHQKi4W8+///g2Bw/YPI/+ntCgAAM/Y7/nTPD7cXibXo+///ibXs+///ibXE+///ibWo+///iZXg+///ZjvWD4SkCgAAagJZA/mJvaD7//85tej7//8PjHgKAACNQuBmg/hYdw8Pt8IPtoDA5UAAg+AP6wIzwIu1xPv//2vACQ+2hDDg5UAAagjB6AReiYXE+///O8YPhE////+D+AcPhw0KAAD/JIWrrEAAM8CDjfT7////iYWY+///iYWw+///iYXY+///iYXc+///iYX4+///iYXQ+///6eAJAAAPt8KD6CB0SIPoA3Q0K8Z0JCvBdBSD6AMPhbYJAAAJtfj7///ptwkAAION+Pv//wTpqwkAAION+Pv//wHpnwkAAIGN+Pv//4AAAADpkAkAAAmN+Pv//+mFCQAAZoP6KnUriwODwwSJneT7//+Jhdj7//+FwA+JZgkAAION+Pv//wT3ndj7///pVAkAAIuF2Pv//2vACg+3yo1ECNCJhdj7///pOQkAAIOl9Pv//wDpLQkAAGaD+ip1JYsDg8MEiZ3k+///iYX0+///hcAPiQ4JAACDjfT7////6QIJAACLhfT7//9rwAoPt8qNRAjQiYX0+///6ecIAAAPt8KD+El0UYP4aHRAg/hsdBiD+HcPhcwIAACBjfj7//8ACAAA6b0IAABmgz9sdRED+YGN+Pv//wAQAADppggAAION+Pv//xDpmggAAION+Pv//yDpjggAAA+3B4P4NnUZZoN/AjR1EoPHBIGN+Pv//wCAAADpbQgAAIP4M3UZZoN/AjJ1EoPHBIGl+Pv///9////pTwgAAIP4ZA+ERggAAIP4aQ+EPQgAAIP4bw+ENAgAAIP4dQ+EKwgAAIP4eA+EIggAAIP4WA+EGQgAAIOlxPv//wCLhdT7//9SjbXo+///x4XQ+///AQAAAOgX/P//WenwBwAAD7fCg/hkD48xAgAAD4S/AgAAg/hTD48cAQAAdH+D6EF0ECvBdForwXQIK8EPheEFAACDwiDHhZj7//8BAAAAiZXg+///i430+///g434+///QI29/Pv//7gAAgAAib3w+///iYXs+///hckPiY4CAADHhfT7//8GAAAA6d4CAAD3hfj7//8wCAAAD4XJAAAAg434+///IOm9AAAA94X4+///MAgAAHUHg434+///IIu99Pv//4P//3UFv////3+DwwT2hfj7//8giZ3k+///i1v8iZ3w+///D4T5BAAAhdt1C6FgBkEAiYXw+///g6Xs+///AIu18Pv//4X/D44RBQAAigaEwA+EBwUAAI2NtPv//w+2wFFQ6Av6//9ZWYXAdAFGRv+F7Pv//zm97Pv//3zQ6dwEAACD6FgPhN8CAAArwQ+ElQAAAIPoBw+E9P7//yvBD4W6BAAAD7cDg8MEM/ZG9oX4+///IIm10Pv//4md5Pv//4mFpPv//3RCiIXI+///jYW0+///UIuFtPv//8aFyfv//wD/sKwAAACNhcj7//9QjYX8+///UOhH+P//g8QQhcB5D4m1sPv//+sHZomF/Pv//42F/Pv//4mF8Pv//4m17Pv//+k2BAAAiwODwwSJneT7//+FwHQ6i0gEhcl0M/eF+Pv//wAIAAAPvwCJjfD7//90EpkrwseF0Pv//wEAAADp8QMAAIOl0Pv//wDp5wMAAKFgBkEAiYXw+///UOgV0P//WenQAwAAg/hwD4/lAQAAD4TNAQAAg/hlD4y+AwAAg/hnD47n/f//g/hpdG6D+G50JIP4bw+FogMAAPaF+Pv//4CJteD7//90YoGN+Pv//wACAADrVoPDBImd5Pv//4tb/OhE9///hcAPhHj6///2hfj7//8gdAxmi4Xo+///ZokD6wiLhej7//+JA8eFsPv//wEAAADp9wQAAION+Pv//0DHheD7//8KAAAA94X4+///AIAAAA+EmQEAAAPei0P4i1P86dUBAAB1EmaD+md1V8eF9Pv//wEAAADrSzvIfgiJhfT7//+LyIH5owAAAH43jbFdAQAAVujgkP//i5Xg+///WYmFqPv//4XAdBCJhfD7//+Jtez7//+L+OsKx4X0+///owAAAIsDizV80EAAg8MIiYWQ+///i0P8iYWU+///jYW0+///UP+1mPv//w++wv+19Pv//4md5Pv//1D/tez7//+NhZD7//9XUP81qAZBAP/W/9CLnfj7//+DxByB44AAAAB0HYO99Pv//wB1FI2FtPv//1BX/zW0BkEA/9b/0FlZZoO94Pv//2d1GIXbdRSNhbT7//9QV/81sAZBAP/W/9BZWYA/LXURgY34+///AAEAAEeJvfD7//9X6Rn+//+JtfT7///Hhaz7//8HAAAA6ySD6HMPhHv8//8rwQ+EnP7//4PoAw+FzgEAAMeFrPv//ycAAAD2hfj7//+Ax4Xg+///EAAAAA+EfP7//2owWGaJhcz7//+Lhaz7//+DwFFmiYXO+///iY3c+///6Vf+///3hfj7//8AEAAAD4VX/v//g8ME9oX4+///IHQc9oX4+///QImd5Pv//3QGD79D/OsED7dD/JnrF/aF+Pv//0CLQ/x0A5nrAjPSiZ3k+///9oX4+///QHQbhdJ/F3wEhcBzEffYg9IA99qBjfj7//8AAQAA94X4+///AJAAAIv6i9h1AjP/g730+///AH0Mx4X0+///AQAAAOsag6X4+///97gAAgAAOYX0+///fgaJhfT7//+LwwvHdQYhhdz7//+Ntfv9//+LhfT7////jfT7//+FwH8Gi8MLx3Qti4Xg+///mVJQV1PoBfb//4PBMImdjPv//4vYi/qD+Tl+BgONrPv//4gOTuu9jYX7/f//K8ZG94X4+///AAIAAImF7Pv//4m18Pv//3RehcB0B4vGgDgwdFP/jfD7//+LhfD7////hez7///GADDrPIXbdQuhZAZBAImF8Pv//4uF8Pv//8eF0Pv//wEAAADrCU9mgzgAdAYDwYX/dfMrhfD7///R+ImF7Pv//4O9sPv//wAPhagBAACLhfj7//+oQHQrqQABAAB0BGot6w6oAXQEaivrBqgCdBRqIFlmiY3M+///x4Xc+///AQAAAIu92Pv//yu97Pv//yu93Pv//4m94Pv//6gMdSTrHouF1Pv//2ogjbXo+///T+iK9f//g73o+////1l0BIX/f97/tdz7//+LvZz7//+LndT7//+Nhcz7//9QjYXo+///6If1///2hfj7//8IWVl0L/aF+Pv//wR1Jou94Pv//+saajCNtej7//+Lw0/oLPX//4O96Pv///9ZdASF/3/ig73Q+///AHVri53s+///hdt+YYu98Pv//42FtPv//1CLhbT7////sKwAAACNhaT7//9XUEvoyvL//4PEEImFjPv//4XAfiT/taT7//+LhdT7//+Ntej7///owPT//wO9jPv//1mF23+w6y6Djej7////6yX/tez7//+LvZz7////tfD7//+LndT7//+Nhej7///otvT//1lZg73o+///AHwz9oX4+///BHQqi73g+///6x6LhdT7//9qII216Pv//0/oV/T//4O96Pv///9ZdASF/3/eg72o+///AHQT/7Wo+///6ONs//+Dpaj7//8AWYu9oPv//4ud5Pv//w+3BzP2iYXg+///ZjvGdAeL0Olx9f//ObXE+///dA2DvcT7//8HD4UB9f//gL3A+///AHQKi4W8+///g2Bw/YuF6Pv//4tN/F9eM81b6EJr///Jw41JAEKkQABCokAAdKJAAM+iQAAbo0AAJ6NAAG2jQABkpEAAi/9Vi+yLRQhWV4XAeFk7BXQdQQBzUYvIwfkFi/CD5h+NPI2AHUEAiw/B5gaDPA7/dTWDPYACQQABU4tdDHUeg+gAdBBIdAhIdRNTavTrCFNq9esDU2r2/xUY0UAAiweJHAYzwFvrFuiRf///xwAJAAAA6Jl///+DIACDyP9fXl3Di/9Vi+yLTQhTM9tWVzvLfFs7DXQdQQBzU4vBwfgFi/GD5h+NPIWAHUEAiwfB5gb2RDAEAXQ2gzww/3Qwgz2AAkEAAXUdK8t0EEl0CEl1E1Nq9OsIU2r16wNTavb/FRjRQACLB4MMBv8zwOsV6At////HAAkAAADoE3///4kYg8j/X15bXcOL/1WL7ItFCIP4/nUY6Pd+//+DIADo3H7//8cACQAAAIPI/13DhcB4CDsFdB1BAHIa6NN+//+DIADouH7//8cACQAAAOhbfv//69WLyMH5BYsMjYAdQQCD4B/B4Ab2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/3UQ/3UM/9aJRfg7ww+EwQAAALkABAAAhU0QdCmLRSA7ww+ErAAAADlF+A+PowAAAFD/dRxX/3X0/3UQ/3UM/9bpjgAAAIt9+Dv7fkJq4DPSWPf3g/gCcjaNRD8IO8F3FuiqCgAAi/w7+3RoxwfMzAAAg8cI6xpQ6OBc//9ZO8N0CccA3d0AAIPACIv46wIz/zv7dD//dfhX/3Xw/3X0/3UQ/3UM/9aFwHQiU1M5XSB1BFNT6wb/dSD/dRz/dfhXU/91JP8VuNBAAIlF+FfoZf3//1n/dfToXP3//4tF+FmNZeRfXluLTfwzzei4Wv//ycOL/1WL7IPsEP91CI1N8Ogng////3UojUXw/3Uk/3Ug/3Uc/3UY/3UU/3UQ/3UMUOjl/f//g8QkgH38AHQHi034g2Fw/cnDi/9Vi+xRUaGEAkEAM8WJRfxTM9tWV4ld+DldHHULi0UIiwCLQASJRRyLNSzQQAAzwDldIFNT/3UUD5XA/3UQjQTFAQAAAFD/dRz/1ov4O/t1BDPA639+PIH/8P//f3c0jUQ/CD0ABAAAdxPoaAkAAIvEO8N0HMcAzMwAAOsRUOihW///WTvDdAnHAN3dAACDwAiL2IXbdLqNBD9QagBT6DSN//+DxAxXU/91FP91EGoB/3Uc/9aFwHQR/3UYUFP/dQz/FVjQQACJRfhT6C/8//+LRfhZjWXsX15bi038M83oi1n//8nDi/9Vi+yD7BD/dQiNTfDo+oH///91JI1F8P91HP91GP91FP91EP91DFDo6/7//4PEHIB9/AB0B4tN+INhcP3Jw4v/VYvsVot1CIX2D4RjAwAA/3YE6Gta////dgjoY1r///92DOhbWv///3YQ6FNa////dhToS1r///92GOhDWv///zboPFr///92IOg0Wv///3Yk6Cxa////dijoJFr///92LOgcWv///3Yw6BRa////djToDFr///92HOgEWv///3Y46PxZ////djzo9Fn//4PEQP92QOjpWf///3ZE6OFZ////dkjo2Vn///92TOjRWf///3ZQ6MlZ////dlTowVn///92WOi5Wf///3Zc6LFZ////dmDoqVn///92ZOihWf///3Zo6JlZ////dmzokVn///92cOiJWf///3Z06IFZ////dnjoeVn///92fOhxWf//g8RA/7aAAAAA6GNZ////toQAAADoWFn///+2iAAAAOhNWf///7aMAAAA6EJZ////tpAAAADoN1n///+2lAAAAOgsWf///7aYAAAA6CFZ////tpwAAADoFln///+2oAAAAOgLWf///7akAAAA6ABZ////tqgAAADo9Vj///+2vAAAAOjqWP///7bAAAAA6N9Y////tsQAAADo1Fj///+2yAAAAOjJWP///7bMAAAA6L5Y//+DxED/ttAAAADosFj///+2uAAAAOilWP///7bYAAAA6JpY////ttwAAADoj1j///+24AAAAOiEWP///7bkAAAA6HlY////tugAAADoblj///+27AAAAOhjWP///7bUAAAA6FhY////tvAAAADoTVj///+29AAAAOhCWP///7b4AAAA6DdY////tvwAAADoLFj///+2AAEAAOghWP///7YEAQAA6BZY////tggBAADoC1j//4PEQP+2DAEAAOj9V////7YQAQAA6PJX////thQBAADo51f///+2GAEAAOjcV////7YcAQAA6NFX////tiABAADoxlf///+2JAEAAOi7V////7YoAQAA6LBX////tiwBAADopVf///+2MAEAAOiaV////7Y0AQAA6I9X////tjgBAADohFf///+2PAEAAOh5V////7ZAAQAA6G5X////tkQBAADoY1f///+2SAEAAOhYV///g8RA/7ZMAQAA6EpX////tlABAADoP1f///+2VAEAAOg0V////7ZYAQAA6ClX////tlwBAADoHlf///+2YAEAAOgTV///g8QYXl3Di/9Vi+xWi3UIhfZ0WYsGOwVIDkEAdAdQ6PBW//9Zi0YEOwVMDkEAdAdQ6N5W//9Zi0YIOwVQDkEAdAdQ6MxW//9Zi0YwOwV4DkEAdAdQ6LpW//9Zi3Y0OzV8DkEAdAdW6KhW//9ZXl3Di/9Vi+xWi3UIhfYPhOoAAACLRgw7BVQOQQB0B1Doglb//1mLRhA7BVgOQQB0B1DocFb//1mLRhQ7BVwOQQB0B1DoXlb//1mLRhg7BWAOQQB0B1DoTFb//1mLRhw7BWQOQQB0B1DoOlb//1mLRiA7BWgOQQB0B1DoKFb//1mLRiQ7BWwOQQB0B1DoFlb//1mLRjg7BYAOQQB0B1DoBFb//1mLRjw7BYQOQQB0B1Do8lX//1mLRkA7BYgOQQB0B1Do4FX//1mLRkQ7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bgBnACAAYQBuACAATQBTAEkATAAtAGMAbwBtAHAAaQBsAGUAZAAgACgALwBjAGwAcgApACAAZgB1AG4AYwB0AGkAbwBuACAAZgByAG8AbQAgAGEAIABuAGEAdABpAHYAZQAgAGMAbwBuAHMAdAByAHUAYwB0AG8AcgAgAG8AcgAgAGYAcgBvAG0AIABEAGwAbABNAGEAaQBuAC4ADQAKAAAAAABSADYAMAAzADIADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABsAG8AYwBhAGwAZQAgAGkAbgBmAG8AcgBtAGEAdABpAG8AbgANAAoAAAAAAFIANgAwADMAMQANAAoALQAgAEEAdAB0AGUAbQBwAHQAIAB0AG8AIABpAG4AaQB0AGkAYQBsAGkAegBlACAAdABoAGUAIABDAFIAVAAgAG0AbwByAGUAIAB0AGgAYQBuACAAbwBuAGMAZQAuAAoAVABoAGkAcwAgAGkAbgBkAGkAYwBhAHQAZQBzACAAYQAgAGIAdQBnACAAaQBuACAAeQBvAHUAcgAgAGEAcABwAGwAaQBjAGEAdABpAG8AbgAuAA0ACgAAAAAAUgA2ADAAMwAwAA0ACgAtACAAQwBSAFQAIABuAG8AdAAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAZAANAAoAAAAAAFIANgAwADIAOAANAAoALQAgAHUAbgBhAGIAbABlACAAdABvACAAaQBuAGkAdABpAGEAbABpAHoAZQAgAGgAZQBhAHAADQAKAAAAAAAAAAAAUgA2ADAAMgA3AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAbABvAHcAaQBvACAAaQBuAGkAdABpAGEAbABpAHoAYQB0AGkAbwBuAA0ACgAAAAAAAAAAAFIANgAwADIANgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAHMAdABkAGkAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGEAdABpAG8AbgANAAoAAAAAAAAAAABSADYAMAAyADUADQAKAC0AIABwAHUAcgBlACAAdgBpAHIAdAB1AGEAbAAgAGYAdQBuAGMAdABpAG8AbgAgAGMAYQBsAGwADQAKAAAAAAAAAFIANgAwADIANAANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAF8AbwBuAGUAeABpAHQALwBhAHQAZQB4AGkAdAAgAHQAYQBiAGwAZQANAAoAAAAAAAAAAABSADYAMAAxADkADQAKAC0AIAB1AG4AYQBiAGwAZQAgAHQAbwAgAG8AcABlAG4AIABjAG8AbgBzAG8AbABlACAAZABlAHYAaQBjAGUADQAKAAAAAAAAAAAAUgA2ADAAMQA4AA0ACgAtACAAdQBuAGUAeABwAGUAYwB0AGUAZAAgAGgAZQBhAHAAIABlAHIAcgBvAHIADQAKAAAAAAAAAAAAUgA2ADAAMQA3AA0ACgAtACAAdQBuAGUAeABwAGUAYwB0AGUAZAAgAG0AdQBsAHQAaQB0AGgAcgBlAGEAZAAgAGwAbwBjAGsAIABlAHIAcgBvAHIADQAKAAAAAAAAAAAAUgA2ADAAMQA2AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAdABoAHIAZQBhAGQAIABkAGEAdABhAA0ACgAAAFIANgAwADEAMAANAAoALQAgAGEAYgBvAHIAdAAoACkAIABoAGEAcwAgAGIAZQBlAG4AIABjAGEAbABsAGUAZAANAAoAAAAAAFIANgAwADAAOQANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGUAbgB2AGkAcgBvAG4AbQBlAG4AdAANAAoAAABSADYAMAAwADgADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABhAHIAZwB1AG0AZQBuAHQAcwANAAoAAAAAAAAAUgA2ADAAMAAyAA0ACgAtACAAZgBsAG8AYQB0AGkAbgBnACAAcABvAGkAbgB0ACAAcwB1AHAAcABvAHIAdAAgAG4AbwB0ACAAbABvAGEAZABlAGQADQAKAAAAAAAAAAAAAgAAACjaQAAIAAAA0NlAAAkAAAB42UAACgAAADDZQAAQAAAA2NhAABEAAAB42EAAEgAAADDYQAATAAAA2NdAABgAAABo10AAGQAAABjXQAAaAAAA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dWFyeQAAAABKYW51YXJ5AERlYwBOb3YAT2N0AFNlcABBdWcASnVsAEp1bgBNYXkAQXByAE1hcgBGZWIASmFuAFNhdHVyZGF5AAAAAEZyaWRheQAAVGh1cnNkYXkAAAAAV2VkbmVzZGF5AAAAVHVlc2RheQBNb25kYXkAAFN1bmRheQAAU2F0AEZyaQBUaHUAV2VkAFR1ZQBNb24AU3VuAAAAAAABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/AEMATwBOAE8AVQBUACQAAABGYXRhbCBlcnJvciBpbiBsYXVuY2hlcjogJXMKAAAAAHIAYgAAAAAARmFpbGVkIHRvIG9wZW4gZXhlY3V0YWJsZQAAAFVuYWJsZSB0byBmaW5kIGFuIGFwcGVuZGVkIGFyY2hpdmUuAFVuYWJsZSB0byByZWFkIGZyb20gZmlsZQAAAAAjIQAAAAAAAEpvYiBpbmZvcm1hdGlvbiBxdWVyeWluZyBmYWlsZWQASm9iIGluZm9ybWF0aW9uIHNldHRpbmcgZmFpbGVkAABzdGRpbiBkdXBsaWNhdGlvbiBmYWlsZWQAAAAAc3Rkb3V0IGR1cGxpY2F0aW9uIGZhaWxlZAAAAHN0ZGVyciBkdXBsaWNhdGlvbiBmYWlsZWQAAABVbmFibGUgdG8gY3JlYXRlIHByb2Nlc3MgdXNpbmcgJyVzJwBGYWlsZWQgdG8gZ2V0IGV4aXQgY29kZSBvZiBwcm9jZXNzAAAuAGUAeABlAAAAAABFeHBlY3RlZCB0byBmaW5kIGEgY29tbWFuZCBlbmRpbmcgaW4gJy5leGUnIGluIHNoZWJhbmcgbGluZS4AAAAAAAAAAEV4cGVjdGVkIHRlcm1pbmF0aW5nIGRvdWJsZS1xdW90ZSBmb3IgZXhlY3V0YWJsZSBpbiBzaGViYW5nIGxpbmUuAAAAAAAAAFRlcm1pbmF0aW5nIHF1b3RlIHdpdGhvdXQgc3RhcnRpbmcgcXVvdGUgZm9yIGV4ZWN1dGFibGUgaW4gc2hlYmFuZyBsaW5lLgAAAABGYWlsZWQgdG8gZmluZCBzaGViYW5nAABFeHBlY3RlZCB0byBmaW5kIHRlcm1pbmF0b3IgaW4gc2hlYmFuZyBsaW5lAEV4cGVjdGVkIHRvIGRlY29kZSBzaGViYW5nIGxpbmUgdXNpbmcgVVRGLTgARXhwZWN0ZWQgdG8gZmluZCAnIycgYXQgc3RhcnQgb2Ygc2hlYmFuZyBsaW5lAAAARXhwZWN0ZWQgdG8gZmluZCAnIScgZm9sbG93aW5nICcjJyBpbiBzaGViYW5nIGxpbmUAAEV4cGVjdGVkIHRvIGZpbmQgZXhlY3V0YWJsZSBpbiBzaGViYW5nIGxpbmUARXhwZWN0ZWQgdG8gZmluZCBhcmd1bWVudHMgKGV2ZW4gaWYgZW1wdHkpIGluIHNoZWJhbmcgbGluZQAARXhwZWN0ZWQgdG8gYmUgYWJsZSB0byBhbGxvY2F0ZSBjb21tYW5kIGxpbmUgbWVtb3J5ACIAJQBzACIAIAAlAHMAIAAiACUAcwAiACAAJQBzAAAAAAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQCQQCw7kAAAwAAAFJTRFPFtgDS1wbcTZJK5hqudrimAgAAAEM6XFVzZXJzXFZpbmF5XFByb2plY3RzXHNpbXBsZV9sYXVuY2hlclxSZWxlYXNlXENMSVNpbXBsZUxhdW5jaGVyLnBkYgAAAAAAAAAAAAAAgC0AAKAvAADAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAACrGEAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAP4eQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAJyBAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAB1IkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAHsjQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAWyRAAAAAAAD+////AAAAAMz///8AAAAA/v///7IlQADGJUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAOAqQAAAAAAA/v///wAAAADA////AAAAAP7///8AAAAAcDNAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADpOUAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAHM7QAAAAAAAAAAAAD87QAD+////AAAAANT///8AAAAA/v///wAAAAD2PEAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAJ1KQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAE1pAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABzW0AAAAAAAP7///8AAAAA2P///wAAAAD+////AAAAAHxiQAD+////AAAAAItiQAD+////AAAAANj///8AAAAA/v///wAAAAA+ZEAA/v///wAAAABKZEAA/v///wAAAADM////AAAAAP7///8AAAAAOm5AAAAAAAD+////AAAAANj///8AAAAA/v///2txQAB+cUAAAAAAAP7///8AAAAA2P///wAAAAD+////93JAAPtyQAAAAAAA/v///wAAAADA////AAAAAP7///8AAAAA5HRAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAABhdkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAABmDQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAA8oNAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAD4kUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAFyVQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAALplAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAACynEAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAMyuQAAAAAAA/v///wAAAADI////AAAAAP7///8AAAAAkbBAAAAAAAAAAAAAza9AAOzyAAAAAAAAAAAAAKT1AAAA0AAAJPQAAAAAAAAAAAAAvvUAADjRAAAAAAAAAAAAAAAAAAAAAAAAAAAAACz0AAA69AAATPQAAGb0AAB49AAAjPQAAKL0AAC+9AAA2vQAAPD0AAAG9QAAIvUAADj1AABM9QAAXPUAAGz1AACE9QAAlvUAAMr1AADW9QAA4vUAAPr1AAAS9gAAJPYAADb2AABM9gAAYPYAAHz2AACa9gAArvYAANb2AADm9gAA9vYAAAL3AAAQ9wAAIvcAADb3AABC9wAAVPcAAGL3AAB09wAAjPcAAJT3AACg9wAAsvcAAMj3AADi9wAA+PcAABL4AAAe+AAALPgAADr4AABE+AAAXPgAAGz4AACC+AAAmvgAALT4AADE+AAA2vgAAPT4AAAC+QAAEvkAACD5AAAw+QAAQvkAAFb5AABi+QAAbPkAAHj5AACK+QAAmvkAALb5AADG+QAA2PkAAOT5AAD0+QAAAAAAALL1AAAAAAAAGQFFeGl0UHJvY2VzcwCHAUdldENvbW1hbmRMaW5lVwBxBFNldEluZm9ybWF0aW9uSm9iT2JqZWN0AKgAQ3JlYXRlUHJvY2Vzc1cAAMABR2V0Q3VycmVudFByb2Nlc3MA+QRXYWl0Rm9yU2luZ2xlT2JqZWN0AGcBR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50AAAWAEFzc2lnblByb2Nlc3NUb0pvYk9iamVjdAAA3wFHZXRFeGl0Q29kZVByb2Nlc3MAABQCR2V0TW9kdWxlRmlsZU5hbWVXAAClA1F1ZXJ5SW5mb3JtYXRpb25Kb2JPYmplY3QAZwNNdWx0aUJ5dGVUb1dpZGVDaGFyAJUAQ3JlYXRlSm9iT2JqZWN0QQAAZAJHZXRTdGRIYW5kbGUAAAICR2V0TGFzdEVycm9yAAAtBFNldENvbnNvbGVDdHJsSGFuZGxlcgDoAER1cGxpY2F0ZUhhbmRsZQBSAENsb3NlSGFuZGxlAEtFUk5FTDMyLmRsbAAARQFTdHJTdHJJVwAAU0hMV0FQSS5kbGwAzwJIZWFwRnJlZQAAywJIZWFwQWxsb2MA7gBFbnRlckNyaXRpY2FsU2VjdGlvbgAAOQNMZWF2ZUNyaXRpY2FsU2VjdGlvbgAAaQJHZXRTdHJpbmdUeXBlVwAAhgFHZXRDb21tYW5kTGluZUEA0wJIZWFwU2V0SW5mb3JtYXRpb24AAMAEVGVybWluYXRlUHJvY2VzcwAA0wRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAAKUEU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAADSXNEZWJ1Z2dlclByZXNlbnQA4wJJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50AOoARW5jb2RlUG9pbnRlcgDKAERlY29kZVBvaW50ZXIAGARSdGxVbndpbmQAzQJIZWFwQ3JlYXRlAABFAkdldFByb2NBZGRyZXNzAAAYAkdldE1vZHVsZUhhbmRsZVcAACUFV3JpdGVGaWxlAG8EU2V0SGFuZGxlQ291bnQAAPMBR2V0RmlsZVR5cGUAYwJHZXRTdGFydHVwSW5mb1cA0QBEZWxldGVDcml0aWNhbFNlY3Rpb24AsgRTbGVlcADAA1JlYWRGaWxlAABmBFNldEZpbGVQb2ludGVyAAATAkdldE1vZHVsZUZpbGVOYW1lQQAAYQFGcmVlRW52aXJvbm1lbnRTdHJpbmdzVwARBVdpZGVDaGFyVG9NdWx0aUJ5dGUA2gFHZXRFbnZpcm9ubWVudFN0cmluZ3NXAADFBFRsc0FsbG9jAADHBFRsc0dldFZhbHVlAMgEVGxzU2V0VmFsdWUAxgRUbHNGcmVlAO8CSW50ZXJsb2NrZWRJbmNyZW1lbnQAAHMEU2V0TGFzdEVycm9yAADFAUdldEN1cnJlbnRUaHJlYWRJZAAA6wJJbnRlcmxvY2tlZERlY3JlbWVudAAApwNRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgCTAkdldFRpY2tDb3VudAAAwQFHZXRDdXJyZW50UHJvY2Vzc0lkAHkCR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAjwBDcmVhdGVGaWxlVwA/A0xvYWRMaWJyYXJ5VwAA0gJIZWFwUmVBbGxvYwCaAUdldENvbnNvbGVDUAAArAFHZXRDb25zb2xlTW9kZQAAVwFGbHVzaEZpbGVCdWZmZXJzAAByAUdldENQSW5mbwBoAUdldEFDUAAANwJHZXRPRU1DUAAACgNJc1ZhbGlkQ29kZVBhZ2UAhwRTZXRTdGRIYW5kbGUAAAQDSXNQcm9jZXNzb3JGZWF0dXJlUHJlc2VudABTBFNldEVuZE9mRmlsZQAASgJHZXRQcm9jZXNzSGVhcAAA1AJIZWFwU2l6ZQAAJAVXcml0ZUNvbnNvbGVXAC0DTENNYXBTdHJpbmdXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwB5BAAAAAADAHkEAAQEAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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6Ojo/+jo6P/n5+f/5eXl//7+/v9X3v//R9j//0PV//8/0v//O87//zbL//8yyP//btf///b8//9m0f//ML7///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ9/f3/8fHx4wzMzMi09PThO7u7v/ExMT/7u7u/+3t7f/t7e3/7e3t/+fn5//V1dX/6enp/+vr6//r6+v/6+vr/+rq6v/q6ur/0NDQ/9jY2P/a2tr/19fX/87Ozv/S0tL/s7Oz//////9P3v//S9v//0fY//9C1P//PtH//zrO//81yv//cNj///b8//9p0///JLz///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ+Pj4/yEhITQAAAAXODg4Ju/v7//v7+//7u7u/+7u7v/u7u7/7e3t/9PT0//IyMj/6Ojo/+zs7P/R0dH/y8vL/+vr6//r6+v/z8/P/9vb2/+/v7//ycnJ/7+/v//Jycn/ysrK//////9T4f//Tt7//0ra//9G1///QtT//z3Q//85zf//Ncr//zDF//8swv//KL////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ+Pj4/8HBwZElJSU1x8fHjvDw8P/Hx8f/7+/v/+/v7//u7u7/7u7u/+7u7v/e3t7/7e3t/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/0NDQ/97e3v/g4OD/7+/v//r6+v////////////////9W5P//UuH//07d//9J2v//Rdf//7Dt//////////////////////////////////////////////////H///+aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ+fn5//Hx8f/x8fH/8fHx//Hx8f/w8PD/8PDw//Dw8P/v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/7+/v/0bmd/6V8Sv+acT//lm9A//////9a5v//VeP//1Hg//9N3f//Sdn//0TW//9A0///PM///zfM//8zyf//L8T//yvB//8mvv//Irr//y28//+O3P///v//zAAAAAAAAAAAAAAAAAAAAAAAAAAZ+fn5/8nJyYw0NDQi1tbWhPHx8f/IyMj/8fHx//Dw8P/w8PD/8PDw/+np6f/X19f/7+/v/+7u7v/u7u7/7u7u/+7u7v/t7e3/0tLS/+vr6//fzLT/p3c8/6N1Pf+ecz7/mnE///////9d6f//Web//1Xj//9Q3///TNz//0jZ//9D1f//P9L//zvP//83y///Msj//y7E//8qwP//Jb3//yG6//8fuP//quX//////4EAAAAAAAAAAAAAAAAAAAAZ+fn5/yIiIjQAAAAXODg4JvLy8v/y8vL/8fHx//Hx8f/x8fH/8PDw/+fn5//Nzc3/7+/v/+/v7//T09P/zc3N/+7u7v/u7u7/0tLS//z8/P/Al2T/q3k8/6Z3Pf+idT3/nXM+//////9h7P//XOn//1jl//9U4v//UN///0vb//9H2P//Q9X//z7R//86zv//Nsv//zHH//8tw///KcD//yW8//8guf//T8j//////84AAAAAAAAAAAAAAAAAAAAZ+fn5/8PDw5ElJSU1ysrKjvPz8//Kysr/8vLy//Ly8v/y8vL/8fHx//Dw8P/f39//8PDw//Dw8P/w8PD/7+/v/+/v7//v7+//0tLS//7+/v+1gUH/rns7/6p5PP+ldz3/oXQ+//////9z7///YOv//1zo//9X5f//U+H//0/e//9K2///Rtf//0LU//8+0f//Oc3//zXK//8xx///LML//yi///8kvP//KLv///////cAAAAAAAAAAAAAAAAAAAAZ+vr6//X19f/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//y8vL/8vLy//Ly8v/x8fH/8fHx//Hx8f/w8PD/8PDw//Dw8P/w8PD/7+/v//////+3fzn/snw6/656O/+peDz/pXY9//Xw6v/X+v//c+///1/r//9b5///V+T//1Lh//9O3f//Str//0XX//9B0///PdD//zjN//80yf//MMX//yzC//8nv///I7v///////8AAAAAAAAAAAAAAAAAAAAZ+vr6/8zMzIw1NTUi2dnZhPT09P/Ly8v/9PT0/+fn5//z8/P/5ubm//Pz8//y8vL/5+fn/9zc3P/k5OT/5OTk/+bm5v/j4+P/1NTU//////+6gDn/tn45/7F8Ov+tejv/qHg8/7yZb//07+n/////////////////////////////////////////////////6fr//23b//84zP//M8n//y/F//8rwf//J77///////8AAAAAAAAAAAAAAAAAAAAZ+/v7/yIiIjQAAAAXOjo6JvX19f/19fX/9fX1/9fX1//z8/P/1NTU//Ly8v/z8/P/5ubm/9HR0f/Pz8//zMzM/9DQ0P/Ozs7/1dXV//////++gjj/uYA5/7V+Ov+wfDv/rHo7/6d3PP+jdT3/nnM+/5pxP/+Vb0D/kW1B/4xrQv+IaUP/g2dD/39kRP+LdVr/3tfQ/+n6//87z///N8z//zPI//8uxP//KsH///////8AAAAAAAAAAAAAAAAAAAAZ+/v7/8fHx5ElJSU1zMzMjvX19f/MzMz/9fX1/9XV1f/y8vL/ysrK/+bm5v/09PT/5+fn/+Dg4P/l5eX/5OTk/+Tk5P/q6ur/1NTU//7+/v/DiD7/vYI4/7iAOf+0fTr/sHs7/6t5PP+ndzz/onU9/55zPv+ZcT//lW9A/5BtQf+MakL/h2hD/4NmRP9+ZEX/i3Va//////8/0v//Os7//zbL//8yyP//NcX///////cAAAAAAAAAAAAAAAAAAAAZ/Pz8//j4+P/39/f/9/f3/6ioqP+rq6v/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/8vLy//39/f/QnmH/wYM3/7yBOP+4fzn/s306/697O/+qeTz/pnc9/6F1Pv+dcj7/mHA//5RuQP+PbEH/i2pC/4ZoQ/+CZkT/fWRF//////9C1P//PtH//zrO//81yv//XtP//////84AAAAAAAAAAAAAAAAAAAAZ/Pz8/8/Pz4w1NTUi3NzchPj4+P+Ghob/rKys//f39//29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9PT0//T09P/09PT/8/Pz//j4+P/o0bP/woQ3/8CDN/+7gTj/t385/7J9Ov+uezv/qXg8/6V2Pf+gdD7/nHI//5dwQP+TbkD/jmxB/4pqQv+FZ0P/gWVE//////9G1///QdT//z3Q//85zf//s+v//////4EAAAAAAAAAAAAAAAAAAAAZ/Pz8/yIiIjQAAAAXOzs7Jvj4+P/19fX/iIiI/6ysrP/39/f/9/f3//b29v/29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9PT0//T09P/9/fz/4cGa/8WMQ/+/gzj/u4A5/7Z+Of+yfDr/rXo7/6h4PP+kdj3/oHQ+/5tyP/+XcED/km1B/45rQf+JaUL/hWdD//////9J2v//Rdb//0zW//+d5////v//ywAAAAAAAAAAAAAAAAAAAAAAAAAZ/f39/8nJyZFRUVFKbm5uyvf39//Ozs7/zMzM/35+fv+srKz/+Pj4//f39//39/f/9/f3//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/19fX/+/v7//7+/v///////////////////////////////////////////9fErv+acT//lm9A/5FtQf+Na0L/iGlD//////////////////////H///+aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ/f39//Pz8/9ISEj/IiIi/6mpqf/6+vr/7Ozs/4mJif92dnb/rKys//j4+P/4+Pj/9/f3//f39//39/f/9vb2//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/09PT/9PT0//////+5gDn/tH46/7B7O/+reTz/p3c8/6J1Pf+ecz7/mXE//5VvQP+QbUH/jGtC//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ/v7+/5CQkME6Ojr/Jycn/19fX/+lpaX/+fn5/3Nzc/90dHT/jIyM/6ioqP/d3d3/5eXl/+np6f/4+Pj/9/f3//f39//39/f/9vb2//X19f/c3Nz/5ubm/+vr6//e3t7/2tra//////+8gTj/z6Z1//z69//Ho3b/qnk8/6Z3Pf+idT3/nXM+/5lwP/+UbkD/kGxB//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvLy8Dzg4OFQAAAAZ/v7+/y0tLTZmZmZuZGRk6yUlJf8iIiL/oqKi/09PT/9TU1P/jY2N/5aWlv+UlJT/2tra/8LCwv/29vb/+Pj4/9HR0f/X19f/9/f3//f39//Y2Nj/3Nzc/9TU1P/Ozs7/y8vL//7+/v/Ei0T/0qd1//z69v/KpHb/rns7/6p5PP+ldj3/oXQ+/5xyP/+YcD//mnhN//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PIlNTU2B/f39/8zMzJEmJiY1tbW1rDs7O/88PDz/eHh4/1FRUf87Ozv/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/793d/wAB//+P3d34AAAP/A/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAA3d34AAAAAABd3fgAAAAAAB3d+AAAAAAAHd34AAAAAAAd3fgAAAAAAB3d+AAAAAAAHd34AAAAAAAd3fgAAAAAAB3d+AAAAAAAHd34AAAAAAAd3fgAAAAAAF3d+AAAAAAA3d34AAAAAA/d3fgAAAAAD93d4AAAAAAP3d3wAAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAf3d34AAAAAD/d3fgAAAAAf93d+AAAAAD/3d34AAAAAf/d3fgAAAAD/93d+AAAAAf/3d34AAAAD//d3fgAAAAf/93d+AAAAD//3d34AAAAf//d3coAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAcAAAAHAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+B////yf////b////////////////////2////yP///4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAGCEhITBcXFxKZWVlUTY2NkQ1NTVBAAAAMAAAACQAAAAVAAAACgAAAAIAAAAA////gd34//924v//SNb//zzP//82y///MMX//zLD//9czv//1vL//////4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAHAUFBTeBgYFx6enp+Obm5v/h4eH11tbW6dvb2+zc3NzatLS0onZ2dmomJiZEAAAAMQAAACL+/v7vZ+T//0zc//9G1///QNP//zvO//81yv//1PP//8/x//8/xP//////7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3AwMCj5ubm+Ojo6P/n5+f/5eXl/+bm5v/m5ub/5OTk/+Tk5P/e3t7/4uLi/uLi4vPY2NjT0NDQuv////9W5P//UeD//0vb//9F1///P9L//znN///V9P//0PL//yi/////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/Pz8/+CgoJhlJSUVujo6P/CwsL/ysrK/8/Pz//Nzc3/3Nzc/9HR0f/Jycn/xcXF/8rKyv/Jycn//////1vo//9V4///UN///0ra//9E1v//PtH//zjN//8yyP//LcP///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf9PT0/3V1dW57e3tq6urq/87Ozv/S0tL/3Nzc/9XV1f/n5+f/3t7e/+Li4v/9/f3/////////////////YOv//1rn//9U4v//T97//7Tw////////////////////////////////////////////7////4EAAAAAAAAAAAAAAB/09PT/7Ozs/+vr6//r6+v/6urq/+rq6v/p6en/6enp/+jo6P/w8PD/7eXa/6eDVv+Vb0D/jmxB//////9i7f//X+r//1nm//9T4v//Td3//0fY//9C1P//PM///zbL//8wxf//K8H//yW8//88wf//1fL//////4EAAAAAAAAAH/X19f+EhIRhl5eXVuzs7P/s7Oz/6+vr/+bm5v/Dw8P/6urq//r6+v+7mW3/oHQ+/5pxP/+TbkD//////2Lt//9i7f//Xur//1jl//9S4f//TNz//0bY//9B0///O8///zXK//8vxf//KcD//yS8//9Zy///////yAAAAAAAAAAf9vb2/3d3d259fX1q7e3t/+3t7f/s7Oz/6+vr/9bW1v/r6+v//v7+/65+Q/+ldj3/nnM+/5hwP///////Yu3//2Lt//9h7P//Xen//1fk//9R4P//S9v//0XX//9A0v//Os7//zTJ//8uxP//KL///yu9///////2AAAAAAAAAB/39/f/8PDw/+/v7//v7+//7u7u/+7u7v/t7e3/7e3t/+zs7P//////sHs7/6l4PP+jdj3/nXM+//Tv6v+B8f//Yu3//2Lt//9h7P//W+j//1bj//9Q3///Str//0TW//8/0f//Oc3//zPI//8tw///J77///////8AAAAAAAAAH/f39/+GhoZhmZmZVvDw8P/v7+//7+/v/+3t7f/Jycn/7e3t//////+1fjr/rns7/6h4PP+idT3/tpdw//Tv6f//////////////////////////////////////6vr//3Lf//890f//N8z//zLI//8swv///////wAAAAAAAAAf+Pj4/3l5eW5/f39q8fHx//Hx8f/w8PD/7+/v/93d3f/u7u7//////7mAOf+zfTr/rXo7/6d3PP+hdT7/m3I//5VvQP+PbEH/iWlC/4NmRP99ZEX/fGNF/3xjRf+Wgmn/6vr//0LU//880P//Nsv//zHH////////AAAAAAAAAB/4+Pj/8/Pz//Pz8//y8vL/8vLy//Hx8f/x8fH/8PDw//Dw8P/+/v7/wYc//7h/Of+yfTr/rHo7/6Z3Pf+gdD7/mnE//5RuQP+Oa0H/iGlD/4JmRP99Y0X/fGNF/31kRv//////R9j//0HT//87z///Pcz///////YAAAAAAAAAH/n5+f+JiYlhnJycVvT09P/h4eH/4+Pj/+7u7v/y8vL/3d3d//Ly8v/So2n/vYI4/7d/Of+xfDr/q3k8/6V2Pf+fcz7/mXE//5NuQP+Na0L/h2hD/4BlRP98Y0X/fGNF//////9M3P//Rtf//0DT//9t2///////yAAAAAAAAAAf+vr6/3p6em6BgYFq9fX1/9zc3P/g4OD/2tra//Pz8//e3t7/8fHx//To2f/Kk1D/vIE4/7Z+Of+wezv/qnk8/6R2Pf+ecz7/mHA//5JtQf+LakL/hWdD/39lRP98Y0X//////1Df//9K2///XNv//9z3//////+BAAAAAAAAAB/7+/v/9/f3//b29v/X19f/9vb2//X19f/19fX/9PT0//T09P/z8/P/+fn5//7+/v//////////////////////////////////////08Kv/5BtQf+KakL/hGdD/35kRf/////////////////////v////gQAAAAAAAAAAAAAAH/v7+/+Li4thnp6eVqmpqf+1tbX/19fX//Ly8v/IyMj/1NTU/9vb2//09PT/3t7e/+rq6v/y8vL//////7R9Ov+uejv/qHg8/6J1Pf+bcj//lW9A/49sQf+JaUL/g2ZE//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/Pz8/3x8fG6Hh4dt9/f3/4+Pj//Dw8P/6Ojo/+Tk5P/n5+f/7u7u//X19f/w8PD/8vLy//T09P//////uYA5/+7i1P/t4tb/p3c9/6B0Pv+acT//lG5A/45sQf+IaUP/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AAAAAAAAAAAAAAAAAAAAAPwfgD/gAQAfgAAAH4AAAB+AAAAfgAAAAYAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAGAAAAfgAAAH4AAAB8AAAAfAAAAP4AAAD+AAAA/gAAAf4AAAH+AAAD/gAAB/4AAA/+AAAf/gAAP/4AAH/+AAD//KAAAABAAAAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKurqx8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACdnZ1Dn5+ftKKiovakpKTupaWlkqampg4AAAAAAAAAAAAAAACsrKzvq6urb6qqqg4AAAAApaWlBKOjo0mgoKC+ra2t/+Xl5f/9/f3///////v7+//x8fHWAAAAAAAAAAAAAAAAr6+v/8HBwf+urq77qqqq4KioqPSzs7P/zc3N//b29v+u8f//U9v//z3Q//8/y///m+L//////7cAAAAAAAAAALOzs//c3Nz/8/Pz/+Tk5P/n5+f/6enp/+jo6P/+/v7/X+n//1Hg//9G1///0vT//zTH///////2AAAAAAAAAAC2trb/zc3N/+Li4v/t7e3/7e3t//n5+f/+/v7//////2Ht//9a5///t/L///////////////////////X///+2ubm5/93d3f/29vb/8PDw//r6+v/QvKT/kW9F//////9j7f//Yez//1jl//9N3f//QtT//zfM//8ww///meD//729vf/Ozs7/5OTk//Ly8v/+/v7/qX5J/5lxP//z7+r/m/T//2Pt//9g6///VuP//0vb//9A0v//Ncr//zjF///AwMD/xsbG/+3t7f/19fX//////616O/+idT3/s5Vx//Pv6v/////////////////r+///duL//z7R//8zyP//s7Oz/62trf+kpKT/7+/v//////+7hkX/q3k8/6B0Pv+UbkD/iWlC/35kRf99ZEb/rJyJ/+v7//9H2P//SNL//6+vr/9ZWVn/dXV1/7Gxsf/29vb/4MSh/7aAPf+peDz/nnM+/5JtQf+HaEP/fWRF/31lR///////U9///6js//+bm5v/f39//zQ0NP98fHz/3Nzc//39/f/+/v7/////////////////0MGw/4VnQ/99Y0X///////////X///+1vb29/6Ghof+oqKj/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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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i+lNi/BEi/qF9nUGSIsBi3AE911wi86JfCQoG9JIiXwkIIPiCP/C/xWUEgAATGPghcB1BzPA6coAAAB+Z0i48P///////39MO+B3WEuNTCQQSIH5AAQAAHcxSI1BD0g7wXcKSLjw////////D0iD4PDoo/v//0gr4EiNXCQwSIXbdLHHA8zMAADrE+jxTP//SIvYSIXAdA/HAN3dAABIg8MQ6wNIi99Ihdt0iE2LxDPSSIvLTQPA6H16//9Fi81Ni8a6AQAAAIvORIlkJChIiVwkIP8V6BEAAIXAdBVMi01gRIvASIvTQYvP/xUpEgAAi/hIjUvwgTnd3QAAdQXo+kv//4vHSItNAEgzzeh4Sv//SItdQEiLdUhIi31QSI1lEEFfQV5BXUFcXcPMzEiJXCQISIl0JBBXSIPsYIvySIvRSI1MJEBBi9lJi/joKHn//0SLnCSoAAAAi4QkmAAAAEiNTCRARIlcJDCJRCQoSIuEJJAAAABEi8tMi8eL1kiJRCQg6EX+//+AfCRYAHQMSItMJFCDocgAAAD9SItcJHBIi3QkeEiDxGBfw8zMSIXJD4TkAwAAU0iD7CBIi9lIi0kI6DZL//9Ii0sQ6C1L//9Ii0sY6CRL//9Ii0sg6BtL//9Ii0so6BJL//9Ii0sw6AlL//9IiwvoAUv//0iLS0Do+Er//0iLS0jo70r//0iLS1Do5kr//0iLS1jo3Ur//0iLS2Do1Er//0iLS2joy0r//0iLSzjowkr//0iLS3DouUr//0iLS3josEr//0iLi4AAAADopEr//0iLi4gAAADomEr//0iLi5AAAADojEr//0iLi5gAAADogEr//0iLi6AAAADodEr//0iLi6gAAADoaEr//0iLi7AAAADoXEr//0iLi7gAAADoUEr//0iLi8AAAADoREr//0iLi8gAAADoOEr//0iLi9AAAADoLEr//0iLi9gAAADoIEr//0iLi+AAAADoFEr//0iLi+gAAADoCEr//0iLi/AAAADo/En//0iLi/gAAADo8En//0iLiwABAADo5En//0iLiwgBAADo2En//0iLixABAADozEn//0iLixgBAADowEn//0iLiyABAADotEn//0iLiygBAADoqEn//0iLizABAADonEn//0iLizgBAADokEn//0iLi0ABAADohEn//0iLi0gBAADoeEn//0iLi1ABAADobEn//0iLi3ABAADoYEn//0iLi3gBAADoVEn//0iLi4ABAADoSEn//0iLi4gBAADoPEn//0iLi5ABAADoMEn//0iLi5gBAADoJEn//0iLi2gBAADoGEn//0iLi6gBAADoDEn//0iLi7ABAADoAEn//0iLi7gBAADo9Ej//0iLi8ABAADo6Ej//0iLi8gBAADo3Ej//0iLi9ABAADo0Ej//0iLi6ABAADoxEj//0iLi9gBAADouEj//0iLi+ABAADorEj//0iLi+gBAADooEj//0iLi/ABAADolEj//0iLi/gBAADoiEj//0iLiwACAADofEj//0iLiwgCAADocEj//0iLixACAADoZEj//0iLixgCAADoWEj//0iLiyACAADoTEj//0iLiygCAADoQEj//0iLizACAADoNEj//0iLizgCAADoKEj//0iLi0ACAADoHEj//0iLi0gCAADoEEj//0iLi1ACAADoBEj//0iLi1gCAADo+Ef//0iLi2ACAADo7Ef//0iLi2gCAADo4Ef//0iLi3ACAADo1Ef//0iLi3gCAADoyEf//0iLi4ACAADovEf//0iLi4gCAADosEf//0iLi5ACAADopEf//0iLi5gCAADomEf//0iLi6ACAADojEf//0iLi6gCAADogEf//0iLi7ACAADodEf//0iLi7gCAADoaEf//0iDxCBbw8zMSIXJdGZTSIPsIEiL2UiLCUg7DbVfAAB0BehCR///SItLCEg7DatfAAB0BegwR///SItLEEg7DaFfAAB0BegeR///SItLWEg7DddfAAB0BegMR///SItLYEg7Dc1fAAB0Bej6Rv//SIPEIFvDSIXJD4QAAQAAU0iD7CBIi9lIi0kYSDsNXF8AAHQF6NFG//9Ii0sgSDsNUl8AAHQF6L9G//9Ii0soSDsNSF8AAHQF6K1G//9Ii0swSDsNPl8AAHQF6JtG//9Ii0s4SDsNNF8AAHQF6IlG//9Ii0tASDsNKl8AAHQF6HdG//9Ii0tISDsNIF8AAHQF6GVG//9Ii0toSDsNLl8AAHQF6FNG//9Ii0twSDsNJF8AAHQF6EFG//9Ii0t4SDsNGl8AAHQF6C9G//9Ii4uAAAAASDsNDV8AAHQF6BpG//9Ii4uIAAAASDsNAF8AAHQF6AVG//9Ii4uQAAAASDsN814AAHQF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AGkAbgBpAHQAaQBhAGwAaQB6AGEAdABpAG8AbgAKAFQAaABpAHMAIABpAG4AZABpAGMAYQB0AGUAcwAgAGEAIABiAHUAZwAgAGkAbgAgAHkAbwB1AHIAIABhAHAAcABsAGkAYwBhAHQAaQBvAG4ALgAgAEkAdAAgAGkAcwAgAG0AbwBzAHQAIABsAGkAawBlAGwAeQAgAHQAaABlACAAcgBlAHMAdQBsAHQAIABvAGYAIABjAGEAbABsAGkAbgBnACAAYQBuACAATQBTAEkATAAtAGMAbwBtAHAAaQBsAGUAZAAgACgALwBjAGwAcgApACAAZgB1AG4AYwB0AGkAbwBuACAAZgByAG8AbQAgAGEAIABuAGEAdABpAHYAZQAgAGMAbwBuAHMAdAByAHUAYwB0AG8AcgAgAG8AcgAgAGYAcgBvAG0AIABEAGwAbABNAGEAaQBuAC4ADQAKAAAAAABSADYAMAAzADIADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABsAG8AYwBhAGwAZQAgAGkAbgBmAG8AcgBtAGEAdABpAG8AbgANAAoAAAAAAAAAAAAAAAAAUgA2ADAAMwAxAA0ACgAtACAAQQB0AHQAZQBtAHAAdAAgAHQAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAIAB0AGgAZQAgAEMAUgBUACAAbQBvAHIAZQAgAHQAaABhAG4AIABvAG4AYwBlAC4ACgBUAGgAaQBzACAAaQBuAGQAaQBjAGEAdABlAHMAIABhACAAYgB1AGcAIABpAG4AIAB5AG8AdQByACAAYQBwAHAAbABpAGMAYQB0AGkAbwBuAC4ADQAKAAAAAABSADYAMAAzADAADQAKAC0AIABDAFIAVAAgAG4AbwB0ACAAaQBuAGkAdABpAGEAbABpAHoAZQBkAA0ACgAAAAAAAAAAAAAAAABSADYAMAAyADgADQAKAC0AIAB1AG4AYQBiAGwAZQAgAHQAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAIABoAGUAYQBwAA0ACgAAAAAAAAAAAFIANgAwADIANwANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGwAbwB3AGkAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGEAdABpAG8AbgANAAoAAAAAAAAAAABSADYAMAAyADYADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABzAHQAZABpAG8AIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ADQAKAAAAAAAAAAAAUgA2ADAAMgA1AA0ACgAtACAAcAB1AHIAZQAgAHYAaQByAHQAdQBhAGwAIABmAHUAbgBjAHQAaQBvAG4AIABjAGEAbABsAA0ACgAAAAAAAABSADYAMAAyADQADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABfAG8AbgBlAHgAaQB0AC8AYQB0AGUAeABpAHQAIAB0AGEAYgBsAGUADQAKAAAAAAAAAAAAUgA2ADAAMQA5AA0ACgAtACAAdQBuAGEAYgBsAGUAIAB0AG8AIABvAHAAZQBuACAAYwBvAG4AcwBvAGwAZQAgAGQAZQB2AGkAYwBlAA0ACgAAAAAAAAAAAAAAAAAAAAAAUgA2ADAAMQA4AA0ACgAtACAAdQBuAGUAeABwAGUAYwB0AGUAZAAgAGgAZQBhAHAAIABlAHIAcgBvAHIADQAKAAAAAAAAAAAAAAAAAAAAAABSADYAMAAxADcADQAKAC0AIAB1AG4AZQB4AHAAZQBjAHQAZQBkACAAbQB1AGwAdABpAHQAaAByAGUAYQBkACAAbABvAGMAawAgAGUAcgByAG8AcgANAAoAAAAAAAAAAABSADYAMAAxADYADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIAB0AGgAcgBlAGEAZAAgAGQAYQB0AGEADQAKAAAAAAAAAAAAAABSADYAMAAxADAADQAKAC0AIABhAGIAbwByAHQAKAApACAAaABhAHMAIABiAGUAZQBuACAAYwBhAGwAbABlAGQADQAKAAAAAAAAAAAAAAAAAFIANgAwADAAOQANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGUAbgB2AGkAcgBvAG4AbQBlAG4AdAANAAoAAAAAAAAAAAAAAFIANgAwADAAOAANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGEAcgBnAHUAbQBlAG4AdABzAA0ACgAAAAAAAAAAAAAAAAAAAFIANgAwADAAMgANAAoALQAgAGYAbABvAGEAdABpAG4AZwAgAHAAbwBpAG4AdAAgAHMAdQBwAHAAbwByAHQAIABuAG8AdAAgAGwAbwBhAGQAZQBkAA0ACgAAAAAAAAAAAAIAAAAAAAAAAOwAQAEAAAAIAAAAAAAAAKDrAEABAAAACQAAAAAAAABA6wBAAQAAAAoAAAAAAAAA8OoAQAEAAAAQAAAAAAAAAJDqAEABAAAAEQAAAAAAAAAw6gBAAQAAABIAAAAAAAAA4OkAQAEAAAATAAAAAAAAAIDpAEABAAAAGAAAAAAAAAAQ6QBAAQAAABkAAAAAAAAAwOgAQAEAAAAaAAAAAAAAAFDoAEABAAAAGwAAAAAAAADg5wBAAQAAABwAAAAAAAAAkOcAQAEAAAAeAAAAAAAAAEjnAEABAAAAHwAAAAAAAACA5gBAAQAAACAAAAAAAAAAEOYAQAEAAAAhAAAAAAAAACDkAEABAAAAeAAAAAAAAAAA5ABAAQAAAHkAAAAAAAAA4OMAQAEAAAB6AAAAAAAAAMDjAEABAAAA/AAAAAAAAAC44wBAAQAAAP8AAAAAAAAAmOMAQAEAAABNAGkAYwByAG8AcwBvAGYAdAAgAFYAaQBzAHUAYQBsACAAQwArACsAIABSAHUAbgB0AGkAbQBlACAATABpAGIAcgBhAHIAeQAAAAAACgAKAAAAAAAAAAAALgAuAC4AAAA8AHAAcgBvAGcAcgBhAG0AIABuAGEAbQBlACAAdQBuAGsAbgBvAHcAbgA+AAAAAABSAHUAbgB0AGkAbQBlACAARQByAHIAbwByACEACgAKAFAAcgBvAGcAcgBhAG0AOgAgAAAAAAAAACgAbgB1AGwAbAApAAAAAAAobnVsbCkAAAYAAAYAAQAAEAADBgAGAhAERUVFBQUFBQU1MABQAAAAACggOFBYBwgANzAwV1AHAAAgIAgAAAAACGBoYGBgYAAAeHB4eHh4CAcIAAAHAAgICAAACAAIAAcIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAaAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEBgQGBAYEBgQGBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEQABAAEAAQ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dXRhYmxlAAAAAAAAAFVuYWJsZSB0byBmaW5kIGFuIGFwcGVuZGVkIGFyY2hpdmUuAAAAAABVbmFibGUgdG8gcmVhZCBmcm9tIGZpbGUAAAAAIyEAAAAAAAAAAAAASm9iIGluZm9ybWF0aW9uIHF1ZXJ5aW5nIGZhaWxlZABKb2IgaW5mb3JtYXRpb24gc2V0dGluZyBmYWlsZWQAAHN0ZGluIGR1cGxpY2F0aW9uIGZhaWxlZAAAAAAAAAAAc3Rkb3V0IGR1cGxpY2F0aW9uIGZhaWxlZAAAAAAAAABzdGRlcnIgZHVwbGljYXRpb24gZmFpbGVkAAAAAAAAAFVuYWJsZSB0byBjcmVhdGUgcHJvY2VzcyB1c2luZyAnJXMnAAAAAABGYWlsZWQgdG8gZ2V0IGV4aXQgY29kZSBvZiBwcm9jZXNzAAAAAAAALgBlAHgAZQAAAAAAAAAAAEV4cGVjdGVkIHRvIGZpbmQgYSBjb21tYW5kIGVuZGluZyBpbiAnLmV4ZScgaW4gc2hlYmFuZyBsaW5lLgAAAAAAAAAAAAAAAEV4cGVjdGVkIHRlcm1pbmF0aW5nIGRvdWJsZS1xdW90ZSBmb3IgZXhlY3V0YWJsZSBpbiBzaGViYW5nIGxpbmUuAAAAAAAAAAAAAAAAAAAAVGVybWluYXRpbmcgcXVvdGUgd2l0aG91dCBzdGFydGluZyBxdW90ZSBmb3IgZXhlY3V0YWJsZSBpbiBzaGViYW5nIGxpbmUuAAAAAAAAAABGYWlsZWQgdG8gZmluZCBzaGViYW5nAABFeHBlY3RlZCB0byBmaW5kIHRlcm1pbmF0b3IgaW4gc2hlYmFuZyBsaW5lAAAAAABFeHBlY3RlZCB0byBkZWNvZGUgc2hlYmFuZyBsaW5lIHVzaW5nIFVURi04AAAAAABFeHBlY3RlZCB0byBmaW5kICcjJyBhdCBzdGFydCBvZiBzaGViYW5nIGxpbmUAAABFeHBlY3RlZCB0byBmaW5kICchJyBmb2xsb3dpbmcgJyMnIGluIHNoZWJhbmcgbGluZQAAAAAAAEV4cGVjdGVkIHRvIGZpbmQgZXhlY3V0YWJsZSBpbiBzaGViYW5nIGxpbmUAAAAAAEV4cGVjdGVkIHRvIGZpbmQgYXJndW1lbnRzIChldmVuIGlmIGVtcHR5KSBpbiBz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AM4UAQAAAAAAAAAAAAAAAACGEAEAAAAAAAAAAAAAAAAAHwFFeGl0UHJvY2VzcwCNAUdldENvbW1hbmRMaW5lVwB+BFNldEluZm9ybWF0aW9uSm9iT2JqZWN0AKgAQ3JlYXRlUHJvY2Vzc1cAAMYBR2V0Q3VycmVudFByb2Nlc3MACAVXYWl0Rm9yU2luZ2xlT2JqZWN0AG0BR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50AAAWAEFzc2lnblByb2Nlc3NUb0pvYk9iamVjdAAA5gFHZXRFeGl0Q29kZVByb2Nlc3MAABoCR2V0TW9kdWxlRmlsZU5hbWVXAACnA1F1ZXJ5SW5mb3JtYXRpb25Kb2JPYmplY3QAaQNNdWx0aUJ5dGVUb1dpZGVDaGFyAJUAQ3JlYXRlSm9iT2JqZWN0QQAAawJHZXRTdGRIYW5kbGUAAAgCR2V0TGFzdEVycm9yAAA7BFNldENvbnNvbGVDdHJsSGFuZGxlcgDsAER1cGxpY2F0ZUhhbmRsZQBSAENsb3NlSGFuZGxlAEtFUk5FTDMyLmRsbAAARQFTdHJTdHJJVwAAU0hMV0FQSS5kbGwA1wJIZWFwRnJlZQAA0wJIZWFwQWxsb2MA8gBFbnRlckNyaXRpY2FsU2VjdGlvbgAAOwNMZWF2ZUNyaXRpY2FsU2VjdGlvbgAAcAJHZXRTdHJpbmdUeXBlVwAAjAFHZXRDb21tYW5kTGluZUEAzgRUZXJtaW5hdGVQcm9jZXNzAADiBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAswRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAAgNJc0RlYnVnZ2VyUHJlc2VudAAmBFJ0bFZpcnR1YWxVbndpbmQAAB8EUnRsTG9va3VwRnVuY3Rpb25FbnRyeQAAGARSdGxDYXB0dXJlQ29udGV4dAAlBFJ0bFVud2luZEV4AOsCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudADuAEVuY29kZVBvaW50ZXIAywBEZWNvZGVQb2ludGVyANsCSGVhcFNldEluZm9ybWF0aW9uAACqAkdldFZlcnNpb24AANUCSGVhcENyZWF0ZQAATAJHZXRQcm9jQWRkcmVzcwAAHgJHZXRNb2R1bGVIYW5kbGVXAAA0BVdyaXRlRmlsZQB8BFNldEhhbmRsZUNvdW50AAD6AUdldEZpbGVUeXBlAGoCR2V0U3RhcnR1cEluZm9XANIARGVsZXRlQ3JpdGljYWxTZWN0aW9uAMAEU2xlZXAAwwNSZWFkRmlsZQAAdARTZXRGaWxlUG9pbnRlcgAAGQJHZXRNb2R1bGVGaWxlTmFtZUEAAGcBRnJlZUVudmlyb25tZW50U3RyaW5nc1cAIAVXaWRlQ2hhclRvTXVsdGlCeXRlAOEBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAAWgFGbHNHZXRWYWx1ZQBbAUZsc1NldFZhbHVlAFkBRmxzRnJlZQCABFNldExhc3RFcnJvcgAAywFHZXRDdXJyZW50VGhyZWFkSWQAAFgBRmxzQWxsb2MAAKkDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAmgJHZXRUaWNrQ291bnQAAMcBR2V0Q3VycmVudFByb2Nlc3NJZACAAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAI8AQ3JlYXRlRmlsZVcAQQNMb2FkTGlicmFyeVcAANoCSGVhcFJlQWxsb2MAoAFHZXRDb25zb2xlQ1AAALIBR2V0Q29uc29sZU1vZGUAAF0BRmx1c2hGaWxlQnVmZmVycwAAeAFHZXRDUEluZm8AbgFHZXRBQ1AAAD4CR2V0T0VNQ1AAAAwDSXNWYWxpZENvZGVQYWdlAJQEU2V0U3RkSGFuZGxlAABhBFNldEVuZE9mRmlsZQAAUQJHZXRQcm9jZXNzSGVhcAAA3AJIZWFwU2l6ZQAAMwVXcml0ZUNvbnNvbGVXAC8DTENNYXBTdHJpbmdXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBIAUABAAAAAAAAAAAAAACASAFAAQAAAAEBAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAMqLfLZkrAADNXSDSZtT//wAAAAAAAAAAAQAAABYAAAACAAAAAgAAAAMAAAACAAAABAAAABgAAAAFAAAADQAAAAYAAAAJAAAABwAAAAwAAAAIAAAADAAAAAkAAAAMAAAACgAAAAcAAAALAAAACAAAAAwAAAAWAAAADQAAABYAAAAPAAAAAgAAABAAAAANAAAAEQAAABIAAAASAAAAAgAAACEAAAANAAAANQAAAAIAAABBAAAADQAAAEMAAAACAAAAUAAAABEAAABSAAAADQAAAFMAAAANAAAAVwAAABYAAABZAAAACwAAAGwAAAANAAAAbQAAACAAAABwAAAAHAAAAHIAAAAJAAAABgAAABYAAACAAAAACgAAAIEAAAAKAAAAggAAAAkAAACDAAAAFgAAAIQAAAANAAAAkQAAACkAAACeAAAADQAAAKEAAAACAAAApAAAAAsAAACnAAAADQAAALcAAAARAAAAzgAAAAIAAADXAAAACwAAABgHAAAMAAAADAAAAAgAAAD//////////4AKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgIDAwMDAwMDAwAAAAAAAAAAmO4AQAEAAACI7gBAAQAAAADwAEABAAAAAvIAQAEAAAD/////AAAAAAAAAAAAAAAALMkAQAEAAAAsyQBAAQAAACzJAEABAAAALMkAQAEAAAAsyQBAAQAAACzJAEABAAAALMkAQAEAAAAsyQBAAQAAACzJAEABAAAALMkAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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/yK6//+O3P///Pz8nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn29vb/7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/7Ozs/+vr6//r6+v/6+vr/+rq6v/q6ur/6urq/+np6f/p6en/6enp/+jo6P/o6Oj/6Ojo/+fn5//l5eX//v7+/1fe//9H2P//Q9X//z/S//87zv//Nsv//zLI//9u1///9vz//2bR//8wvv//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn39/f/x8fHjDMzMyLT09OE7u7u/8TExP/u7u7/7e3t/+3t7f/t7e3/5+fn/9XV1f/p6en/6+vr/+vr6//r6+v/6urq/+rq6v/Q0ND/2NjY/9ra2v/X19f/zs7O/9LS0v+zs7P//////0/e//9L2///R9j//0LU//8+0f//Os7//zXK//9w2P//9vz//2nT//8kvP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn4+Pj/ISEhNAAAABc4ODgm7+/v/+/v7//u7u7/7u7u/+7u7v/t7e3/09PT/8jIyP/o6Oj/7Ozs/9HR0f/Ly8v/6+vr/+vr6//Pz8//29vb/7+/v//Jycn/v7+//8nJyf/Kysr//////1Ph//9O3v//Str//0bX//9C1P//PdD//znN//81yv//MMX//yzC//8ov////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn4+Pj/wcHBkSUlJTXHx8eO8PDw/8fHx//v7+//7+/v/+7u7v/u7u7/7u7u/97e3v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/Q0ND/3t7e/+Dg4P/v7+//+vr6/////////////////1bk//9S4f//Tt3//0na//9F1///sO3/////////////////////////////////////////////////8f///5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn5+fn/8fHx//Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/+7u7v/u7u7/7u7u/+3t7f/t7e3/7e3t/+zs7P/s7Oz/7Ozs//v7+//RuZ3/pXxK/5pxP/+Wb0D//////1rm//9V4///UeD//03d//9J2f//RNb//0DT//88z///N8z//zPJ//8vxP//K8H//ya+//8iuv//Lbz//47c///+///MAAAAAAAAAAAAAAAAAAAAAAAAABn5+fn/ycnJjDQ0NCLW1taE8fHx/8jIyP/x8fH/8PDw//Dw8P/w8PD/6enp/9fX1//v7+//7u7u/+7u7v/u7u7/7u7u/+3t7f/S0tL/6+vr/9/MtP+ndzz/o3U9/55zPv+acT///////13p//9Z5v//VeP//1Df//9M3P//SNn//0PV//8/0v//O8///zfL//8yyP//LsT//yrA//8lvf//Ibr//x+4//+q5f//////gQAAAAAAAAAAAAAAAAAAABn5+fn/IiIiNAAAABc4ODgm8vLy//Ly8v/x8fH/8fHx//Hx8f/w8PD/5+fn/83Nzf/v7+//7+/v/9PT0//Nzc3/7u7u/+7u7v/S0tL//Pz8/8CXZP+reTz/pnc9/6J1Pf+dcz7//////2Hs//9c6f//WOX//1Ti//9Q3///S9v//0fY//9D1f//PtH//zrO//82y///Mcf//y3D//8pwP//Jbz//yC5//9PyP//////zgAAAAAAAAAAAAAAAAAAABn5+fn/w8PDkSUlJTXKysqO8/Pz/8rKyv/y8vL/8vLy//Ly8v/x8fH/8PDw/9/f3//w8PD/8PDw//Dw8P/v7+//7+/v/+/v7//S0tL//v7+/7WBQf+uezv/qnk8/6V3Pf+hdD7//////3Pv//9g6///XOj//1fl//9T4f//T97//0rb//9G1///QtT//z7R//85zf//Ncr//zHH//8swv//KL///yS8//8ou///////9wAAAAAAAAAAAAAAAAAAABn6+vr/9fX1//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Ly8v/y8vL/8vLy//Hx8f/x8fH/8fHx//Dw8P/w8PD/8PDw//Dw8P/v7+///////7d/Of+yfDr/rno7/6l4PP+ldj3/9fDq/9f6//9z7///X+v//1vn//9X5P//UuH//07d//9K2v//Rdf//0HT//890P//OM3//zTJ//8wxf//LML//ye///8ju////////wAAAAAAAAAAAAAAAAAAABn6+vr/zMzMjDU1NSLZ2dmE9PT0/8vLy//09PT/5+fn//Pz8//m5ub/8/Pz//Ly8v/n5+f/3Nzc/+Tk5P/k5OT/5ubm/+Pj4//U1NT//////7qAOf+2fjn/sXw6/616O/+oeDz/vJlv//Tv6f/////////////////////////////////////////////////p+v//bdv//zjM//8zyf//L8X//yvB//8nvv///////wAAAAAAAAAAAAAAAAAAABn7+/v/IiIiNAAAABc6Ojom9fX1//X19f/19fX/19fX//Pz8//U1NT/8vLy//Pz8//m5ub/0dHR/8/Pz//MzMz/0NDQ/87Ozv/V1dX//////76COP+5gDn/tX46/7B8O/+sejv/p3c8/6N1Pf+ecz7/mnE//5VvQP+RbUH/jGtC/4hpQ/+DZ0P/f2RE/4t1Wv/e19D/6fr//zvP//83zP//M8j//y7E//8qwf///////wAAAAAAAAAAAAAAAAAAABn7+/v/x8fHkSUlJTXMzMyO9fX1/8zMzP/19fX/1dXV//Ly8v/Kysr/5ubm//T09P/n5+f/4ODg/+Xl5f/k5OT/5OTk/+rq6v/U1NT//v7+/8OIPv+9gjj/uIA5/7R9Ov+wezv/q3k8/6d3PP+idT3/nnM+/5lxP/+Vb0D/kG1B/4xqQv+HaEP/g2ZE/35kRf+LdVr//////z/S//86zv//Nsv//zLI//81xf//////9wAAAAAAAAAAAAAAAAAAABn8/Pz/+Pj4//f39//39/f/qKio/6urq//29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//y8vL//f39/9CeYf/Bgzf/vIE4/7h/Of+zfTr/r3s7/6p5PP+mdz3/oXU+/51yPv+YcD//lG5A/49sQf+LakL/hmhD/4JmRP99ZEX//////0LU//8+0f//Os7//zXK//9e0///////zgAAAAAAAAAAAAAAAAAAABn8/Pz/z8/PjDU1NSLc3NyE+Pj4/4aGhv+srKz/9/f3//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/09PT/9PT0//T09P/z8/P/+Pj4/+jRs//ChDf/wIM3/7uBOP+3fzn/sn06/657O/+peDz/pXY9/6B0Pv+ccj//l3BA/5NuQP+ObEH/impC/4VnQ/+BZUT//////0bX//9B1P//PdD//znN//+z6///////gQAAAAAAAAAAAAAAAAAAABn8/Pz/IiIiNAAAABc7Ozsm+Pj4//X19f+IiIj/rKys//f39//39/f/9vb2//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/09PT/9PT0//39/P/hwZr/xYxD/7+DOP+7gDn/tn45/7J8Ov+tejv/qHg8/6R2Pf+gdD7/m3I//5dwQP+SbUH/jmtB/4lpQv+FZ0P//////0na//9F1v//TNb//53n///+///LAAAAAAAAAAAAAAAAAAAAAAAAABn9/f3/ycnJkVFRUUpubm7K9/f3/87Ozv/MzMz/fn5+/6ysrP/4+Pj/9/f3//f39//39/f/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//X19f/7+/v//v7+////////////////////////////////////////////18Su/5pxP/+Wb0D/kW1B/41rQv+IaUP/////////////////////8f///5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn9/f3/8/Pz/0hISP8iIiL/qamp//r6+v/s7Oz/iYmJ/3Z2dv+srKz/+Pj4//j4+P/39/f/9/f3//f39//29vb/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//T09P/09PT//////7mAOf+0fjr/sHs7/6t5PP+ndzz/onU9/55zPv+ZcT//lW9A/5BtQf+Ma0L//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn+/v7/kJCQwTo6Ov8nJyf/X19f/6Wlpf/5+fn/c3Nz/3R0dP+MjIz/qKio/93d3f/l5eX/6enp//j4+P/39/f/9/f3//f39//29vb/9fX1/9zc3P/m5ub/6+vr/97e3v/a2tr//////7yBOP/PpnX//Pr3/8ejdv+qeTz/pnc9/6J1Pf+dcz7/mXA//5RuQP+QbEH//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8vLwPODg4VAAAABn+/v7/LS0tNmZmZm5kZGTrJSUl/yIiIv+ioqL/T09P/1NTU/+NjY3/lpaW/5SUlP/a2tr/wsLC//b29v/4+Pj/0dHR/9fX1//39/f/9/f3/9jY2P/c3Nz/1NTU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/zXK///U8///z/H//z/E///////uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHcDAwKPm5ub46Ojo/+fn5//l5eX/5ubm/+bm5v/k5OT/5OTk/97e3v/i4uL+4uLi89jY2NPQ0NC6/////1bk//9R4P//S9v//0XX//8/0v//Oc3//9X0///Q8v//KL////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8/Pz/4KCgmGUlJRW6Ojo/8LCwv/Kysr/z8/P/83Nzf/c3Nz/0dHR/8nJyf/FxcX/ysrK/8nJyf//////W+j//1Xj//9Q3///Str//0TW//8+0f//OM3//zLI//8tw////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/09PT/dXV1bnt7e2rq6ur/zs7O/9LS0v/c3Nz/1dXV/+fn5//e3t7/4uLi//39/f////////////////9g6///Wuf//1Ti//9P3v//tPD////////////////////////////////////////////v////gQAAAAAAAAAAAAAAH/T09P/s7Oz/6+vr/+vr6//q6ur/6urq/+np6f/p6en/6Ojo//Dw8P/t5dr/p4NW/5VvQP+ObEH//////2Lt//9f6v//Web//1Pi//9N3f//R9j//0LU//88z///Nsv//zDF//8rwf//Jbz//zzB///V8v//////gQAAAAAAAAAf9fX1/4SEhGGXl5dW7Ozs/+zs7P/r6+v/5ubm/8PDw//q6ur/+vr6/7uZbf+gdD7/mnE//5NuQP//////Yu3//2Lt//9e6v//WOX//1Lh//9M3P//Rtj//0HT//87z///Ncr//y/F//8pwP//JLz//1nL///////IAAAAAAAAAB/29vb/d3d3bn19fWrt7e3/7e3t/+zs7P/r6+v/1tbW/+vr6//+/v7/rn5D/6V2Pf+ecz7/mHA///////9i7f//Yu3//2Hs//9d6f//V+T//1Hg//9L2///Rdf//0DS//86zv//NMn//y7E//8ov///K73///////YAAAAAAAAAH/f39//w8PD/7+/v/+/v7//u7u7/7u7u/+3t7f/t7e3/7Ozs//////+wezv/qXg8/6N2Pf+dcz7/9O/q/4Hx//9i7f//Yu3//2Hs//9b6P//VuP//1Df//9K2v//RNb//z/R//85zf//M8j//y3D//8nvv///////wAAAAAAAAAf9/f3/4aGhmGZmZlW8PDw/+/v7//v7+//7e3t/8nJyf/t7e3//////7V+Ov+uezv/qHg8/6J1Pf+2l3D/9O/p///////////////////////////////////////q+v//ct///z3R//83zP//Msj//yzC////////AAAAAAAAAB/4+Pj/eXl5bn9/f2rx8fH/8fHx//Dw8P/v7+//3d3d/+7u7v//////uYA5/7N9Ov+tejv/p3c8/6F1Pv+bcj//lW9A/49sQf+JaUL/g2ZE/31kRf98Y0X/fGNF/5aCaf/q+v//QtT//zzQ//82y///Mcf///////8AAAAAAAAAH/j4+P/z8/P/8/Pz//Ly8v/y8vL/8fHx//Hx8f/w8PD/8PDw//7+/v/Bhz//uH85/7J9Ov+sejv/pnc9/6B0Pv+acT//lG5A/45rQf+IaUP/gmZE/31jRf98Y0X/fWRG//////9H2P//QdP//zvP//89zP//////9gAAAAAAAAAf+fn5/4mJiWGcnJxW9PT0/+Hh4f/j4+P/7u7u//Ly8v/d3d3/8vLy/9Kjaf+9gjj/t385/7F8Ov+reTz/pXY9/59zPv+ZcT//k25A/41rQv+HaEP/gGVE/3xjRf98Y0X//////0zc//9G1///QNP//23b///////IAAAAAAAAAB/6+vr/enp6boGBgWr19fX/3Nzc/+Dg4P/a2tr/8/Pz/97e3v/x8fH/9OjZ/8qTUP+8gTj/tn45/7B7O/+qeTz/pHY9/55zPv+YcD//km1B/4tqQv+FZ0P/f2VE/3xjRf//////UN///0rb//9c2///3Pf//////4EAAAAAAAAAH/v7+//39/f/9vb2/9fX1//29vb/9fX1//X19f/09PT/9PT0//Pz8//5+fn//v7+///////////////////////////////////////Twq//kG1B/4pqQv+EZ0P/fmRF/////////////////////+////+BAAAAAAAAAAAAAAAf+/v7/4uLi2Genp5Wqamp/7W1tf/X19f/8vLy/8jIyP/U1NT/29vb//T09P/e3t7/6urq//Ly8v//////tH06/656O/+oeDz/onU9/5tyP/+Vb0D/j2xB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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAOAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/B+AP+ABAB+AAAAfgAAAH4AAAB+AAAABgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAYAAAB+AAAAfgAAAHwAAAB8AAAA/gAAAP4AAAD+AAAB/gAAAf4AAAP+AAAH/gAAD/4AAB/+AAA//gAAf/4AAP/8oAAAAEAAAACAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq6urHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ2dnUOfn5+0oqKi9qSkpO6lpaWSpqamDgAAAAAAAAAAAAAAAKysrO+rq6tvqqqqDgAAAAClpaUEo6OjSaCgoL6tra3/5eXl//39/f//////+/v7//Hx8dYAAAAAAAAAAAAAAACvr6//wcHB/66urvuqqqrgqKio9LOzs//Nzc3/9vb2/67x//9T2///PdD//z/L//+b4v//////twAAAAAAAAAAs7Oz/9zc3P/z8/P/5OTk/+fn5//p6en/6Ojo//7+/v9f6f//UeD//0bX///S9P//NMf///////YAAAAAAAAAALa2tv/Nzc3/4uLi/+3t7f/t7e3/+fn5//7+/v//////Ye3//1rn//+38v//////////////////////9f///7a5ubn/3d3d//b29v/w8PD/+vr6/9C8pP+Rb0X//////2Pt//9h7P//WOX//03d//9C1P//N8z//zDD//+Z4P//vb29/87Ozv/k5OT/8vLy//7+/v+pfkn/mXE///Pv6v+b9P//Y+3//2Dr//9W4///S9v//0DS//81yv//OMX//8DAwP/Gxsb/7e3t//X19f//////rXo7/6J1Pf+zlXH/8+/q/////////////////+v7//924v//PtH//zPI//+zs7P/ra2t/6SkpP/v7+///////7uGRf+reTz/oHQ+/5RuQP+JaUL/fmRF/31kRv+snIn/6/v//0fY//9I0v//r6+v/1lZWf91dXX/sbGx//b29v/gxKH/toA9/6l4PP+ecz7/km1B/4doQ/99ZEX/fWVH//////9T3///qOz//5ubm/9/f3//NDQ0/3x8fP/c3Nz//f39//7+/v/////////////////QwbD/hWdD/31jRf//////////9f///7W9vb3/oaGh/6ioqP9NTU3/lpaW//7+/v/9/f3//////7F+Pv/q4NP/mXE//45rQf+FaUf/////9AAAAAAAAAAAwcHB/8/Pz//l5eX/ubm5/1JSUv/AwMD/+Pj4//r6+v/ewqL/soJH/6N1Pf+deEv/yrqn/////7UAAAAAAAAAAL6+vv/e3t7/9/f3//n5+f+7u7v/nJyc/+3t7f/h4eH//v7+//39/f///////v7+/+zs7P8AAAAAAAAAAAAAAAC7u7v/zs7O/+Tk5P/29vb/+Pj4//f39//f39//+vr6//z8/P/IyMj/+fn5/8zMzP+/v79/AAAAAAAAAAAAAAAAt7e3/7m5uf+7u7v/vb29/7+/v//BwcH/w8PD/8XFxf/IyMj/ycnJ/8fHx//ExMR/AAAAAAAAAAAAAAAAAAAAAH4HrEEQB6xBAAOsQQADrEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAAOsQQADrEEAB6xBAAesQQAPrEEAAAEABwAgIBAAAQAEAOgCAAABABAQEAABAAQAKAEAAAIAICAAAAEACACoCAAAAwAQEAAAAQAIAGgFAAAEADAwAAABACAAqCUAAAUAICAAAAEAIACoEAAABgAQEAAAAQAgAGgEAAAHADxhc3NlbWJseSB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjEiIG1hbmlmZXN0VmVyc2lvbj0iMS4wIj4NCiAgPHRydXN0SW5mbyB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjMiPg0KICAgIDxzZWN1cml0eT4NCiAgICAgIDxyZXF1ZXN0ZWRQcml2aWxlZ2VzPg0KICAgICAgICA8cmVxdWVzdGVkRXhlY3V0aW9uTGV2ZWwgbGV2ZWw9ImFzSW52b2tlciIgdWlBY2Nlc3M9ImZhbHNlIj48L3JlcXVlc3RlZEV4ZWN1dGlvbkxldmVsPg0KICAgICAgPC9yZXF1ZXN0ZWRQcml2aWxlZ2VzPg0KICAgIDwvc2VjdXJpdHk+DQogIDwvdHJ1c3RJbmZvPg0KPC9hc3NlbWJseT5QQVBBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRADgAABEAAAAoKKoorCiuKLQotiiIKMoo2iseKyIrJisqKy4rMis2KzorPisCK0YrSitOK1IrVitaK14rYitmK2orbitACABAIAAAAAAoBCg8Kj4qACpCKkgqSipMKk4qUCpSKlQqVipYKloqaCtsK64rsCuyK7Qrtiu4K7orvCu+K4ArwivEK8YryCvKK8wrzivQK9Ir1CvWK9gr2ivcK94r4CviK+Qr5ivoK+or7CvuK/Ar8iv0K/Yr+Cv6K/wr/ivAAAAMAEAoAAAAACgGKAgoCigMKA4oECgSKBQoFigYKBooHCgeKCAoIigkKCYoKCgqKCwoLigwKDIoNCg2KDgoOig8KD4oAChCKEQoRihIKEooTChOKFAoUihUKFYoWChaKHYofihGKI4oliimKKworiiwKLIotCi4KL4ogCjCKMQoxijIKMoozCjOKNAo0ijWKNgo2ijcKN4o4CjiKOQowAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQSwMEFAAAAAAAAAAhADfYASX/zgAA/84AACsAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi91dGlsLnB5IwojIENvcHlyaWdodCAoQykgMjAxMi0yMDE2IFRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKaW1wb3J0IGNvZGVjcwpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgY3N2CmZyb20gZ2xvYiBpbXBvcnQgaWdsb2IgYXMgc3RkX2lnbG9iCmltcG9ydCBpbwppbXBvcnQganNvbgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHB5X2NvbXBpbGUKaW1wb3J0IHJlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHNvY2tldAp0cnk6CiAgICBpbXBvcnQgc3NsCmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgc3NsID0gTm9uZQppbXBvcnQgc3VicHJvY2VzcwppbXBvcnQgc3lzCmltcG9ydCB0YXJmaWxlCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgdGV4dHdyYXAKCnRyeToKICAgIGltcG9ydCB0aHJlYWRpbmcKZXhjZXB0IEltcG9ydEVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBpbXBvcnQgZHVtbXlfdGhyZWFkaW5nIGFzIHRocmVhZGluZwppbXBvcnQgdGltZQoKZnJvbSAuIGltcG9ydCBEaXN0bGliRXhjZXB0aW9uCmZyb20gLmNvbXBhdCBpbXBvcnQgKHN0cmluZ190eXBlcywgdGV4dF90eXBlLCBzaHV0aWwsIHJhd19pbnB1dCwgU3RyaW5nSU8sCiAgICAgICAgICAgICAgICAgICAgIGNhY2hlX2Zyb21fc291cmNlLCB1cmxvcGVuLCB1cmxqb2luLCBodHRwbGliLCB4bWxycGNsaWIsCiAgICAgICAgICAgICAgICAgICAgIHNwbGl0dHlwZSwgSFRUUEhhbmRsZXIsIEJhc2VDb25maWd1cmF0b3IsIHZhbGlkX2lkZW50LAogICAgICAgICAgICAgICAgICAgICBDb250YWluZXIsIGNvbmZpZ3BhcnNlciwgVVJMRXJyb3IsIFppcEZpbGUsIGZzZGVjb2RlLAogICAgICAgICAgICAgICAgICAgICB1bnF1b3RlKQoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgojCiMgUmVxdWlyZW1lbnQgcGFyc2luZyBjb2RlIGZvciBuYW1lICsgb3B0aW9uYWwgY29uc3RyYWludHMgKyBvcHRpb25hbCBleHRyYXMKIwojIGUuZy4gJ2ZvbyA+PSAxLjIsIDwgMi4wIFtiYXIsIGJhel0nCiMKIyBUaGUgcmVnZXggY2FuIHNlZW0gYSBiaXQgaGFpcnksIHNvIHdlIGJ1aWxkIGl0IHVwIG91dCBvZiBzbWFsbGVyIHBpZWNlcwojIHdoaWNoIGFyZSBtYW5hZ2VhYmxlLgojCgpDT01NQSA9IHInXHMqLFxzKicKQ09NTUFfUkUgPSByZS5jb21waWxlKENPTU1BKQoKSURFTlQgPSByJyhcd3xbLi1dKSsnCkVYVFJBX0lERU5UID0gcicoXCp8OihcKnxcdyspOnwnICsgSURFTlQgKyAnKScKVkVSU1BFQyA9IElERU5UICsgcidcKj8nCgpSRUxPUCA9ICcoWzw+PSF+XT0pfFs8Pl0nCgojCiMgVGhlIGZpcnN0IHJlbG9wIGlzIG9wdGlvbmFsIC0gaWYgYWJzZW50LCB3aWxsIGJlIHRha2VuIGFzICd+PScKIwpCQVJFX0NPTlNUUkFJTlRTID0gKCcoJyArIFJFTE9QICsgcicpP1xzKignICsgVkVSU1BFQyArICcpKCcgKyBDT01NQSArICcoJyArCiAgICAgICAgICAgICAgICAgICAgUkVMT1AgKyByJylccyooJyArIFZFUlNQRUMgKyAnKSkqJykKCkRJUkVDVF9SRUYgPSAnKGZyb21ccysoP1A8ZGlyZWY+LiopKScKCiMKIyBFaXRoZXIgdGhlIGJhcmUgY29uc3RyYWludHMgb3IgdGhlIGJhcmUgY29uc3RyYWludHMgaW4gcGFyZW50aGVzZXMKIwpDT05TVFJBSU5UUyA9IChyJ1woXHMqKD9QPGMxPicgKyBCQVJFX0NPTlNUUkFJTlRTICsgJ3wnICsgRElSRUNUX1JFRiArCiAgICAgICAgICAgICAgIHInKVxzKlwpfCg/UDxjMj4nICsgQkFSRV9DT05TVFJBSU5UUyArICdccyopJykKCkVYVFJBX0xJU1QgPSBFWFRSQV9JREVOVCArICcoJyArIENPTU1BICsgRVhUUkFfSURFTlQgKyAnKSonCkVYVFJBUyA9IHInXFtccyooP1A8ZXg+JyArIEVYVFJBX0xJU1QgKyByJyk/XHMqXF0nClJFUVVJUkVNRU5UID0gKCcoP1A8ZG4+JyAgKyBJREVOVCArIHInKVxzKignICsgRVhUUkFTICsgcidccyopPyhccyonICsKICAgICAgICAgICAgICAgQ09OU1RSQUlOVFMgKyAnKT8kJykKUkVRVUlSRU1FTlRfUkUgPSByZS5jb21waWxlKFJFUVVJUkVNRU5UKQoKIwojIFVzZWQgdG8gc2NhbiB0aHJvdWdoIHRoZSBjb25zdHJhaW50cwojClJFTE9QX0lERU5UID0gJyg/UDxvcD4nICsgUkVMT1AgKyByJylccyooP1A8dm4+JyArIFZFUlNQRUMgKyAnKScKUkVMT1BfSURFTlRfUkUgPSByZS5jb21waWxlKFJFTE9QX0lERU5UKQoKZGVmIHBhcnNlX3JlcXVpcmVtZW50KHMpOgoKICAgIGRlZiBnZXRfY29uc3RyYWludChtKToKICAgICAgICBkID0gbS5ncm91cGRpY3QoKQogICAgICAgIHJldHVybiBkWydvcCddLCBkWyd2biddCgogICAgcmVzdWx0ID0gTm9uZQogICAgbSA9IFJFUVVJUkVNRU5UX1JFLm1hdGNoKHMpCiAgICBpZiBtOgogICAgICAgIGQgPSBtLmdyb3VwZGljdCgpCiAgICAgICAgbmFtZSA9IGRbJ2RuJ10KICAgICAgICBjb25zID0gZFsnYzEnXSBvciBkWydjMiddCiAgICAgICAgaWYgbm90IGRbJ2RpcmVmJ106CiAgICAgICAgICAgIHVybCA9IE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIGRpcmVjdCByZWZlcmVuY2UKICAgICAgICAgICAgY29ucyA9IE5vbmUKICAgICAgICAgICAgdXJsID0gZFsnZGlyZWYnXS5zdHJpcCgpCiAgICAgICAgaWYgbm90IGNvbnM6CiAgICAgICAgICAgIGNvbnMgPSBOb25lCiAgICAgICAgICAgIGNvbnN0ciA9ICcnCiAgICAgICAgICAgIHJzID0gZFsnZG4nXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGNvbnNbMF0gbm90IGluICc8PiE9JzoKICAgICAgICAgICAgICAgIGNvbnMgPSAnfj0nICsgY29ucwogICAgICAgICAgICBpdGVyYXRvciA9IFJFTE9QX0lERU5UX1JFLmZpbmRpdGVyKGNvbnMpCiAgICAgICAgICAgIGNvbnMgPSBbZ2V0X2NvbnN0cmFpbnQobSkgZm9yIG0gaW4gaXRlcmF0b3JdCiAgICAgICAgICAgIHJzID0gJyVzICglcyknICUgKG5hbWUsICcsICcuam9pbihbJyVzICVzJyAlIGNvbiBmb3IgY29uIGluIGNvbnNdKSkKICAgICAgICBpZiBub3QgZFsnZXgnXToKICAgICAgICAgICAgZXh0cmFzID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGV4dHJhcyA9IENPTU1BX1JFLnNwbGl0KGRbJ2V4J10pCiAgICAgICAgcmVzdWx0ID0gQ29udGFpbmVyKG5hbWU9bmFtZSwgY29uc3RyYWludHM9Y29ucywgZXh0cmFzPWV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQ9cnMsIHNvdXJjZT1zLCB1cmw9dXJsKQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBnZXRfcmVzb3VyY2VzX2Rlc3RzKHJlc291cmNlc19yb290LCBydWxlcyk6CiAgICAiIiJGaW5kIGRlc3RpbmF0aW9ucyBmb3IgcmVzb3VyY2VzIGZpbGVzIiIiCgogICAgZGVmIGdldF9yZWxfcGF0aChiYXNlLCBwYXRoKToKICAgICAgICAjIG5vcm1hbGl6ZXMgYW5kIHJldHVybnMgYSBsc3RyaXBwZWQtLy1zZXBhcmF0ZWQgcGF0aAogICAgICAgIGJhc2UgPSBiYXNlLnJlcGxhY2Uob3MucGF0aC5zZXAsICcvJykKICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKG9zLnBhdGguc2VwLCAnLycpCiAgICAgICAgYXNzZXJ0IHBhdGguc3RhcnRzd2l0aChiYXNlKQogICAgICAgIHJldHVybiBwYXRoW2xlbihiYXNlKTpdLmxzdHJpcCgnLycpCgoKICAgIGRlc3RpbmF0aW9ucyA9IHt9CiAgICBmb3IgYmFzZSwgc3VmZml4LCBkZXN0IGluIHJ1bGVzOgogICAgICAgIHByZWZpeCA9IG9zLnBhdGguam9pbihyZXNvdXJjZXNfcm9vdCwgYmFzZSkKICAgICAgICBmb3IgYWJzX2Jhc2UgaW4gaWdsb2IocHJlZml4KToKICAgICAgICAgICAgYWJzX2dsb2IgPSBvcy5wYXRoLmpvaW4oYWJzX2Jhc2UsIHN1ZmZpeCkKICAgICAgICAgICAgZm9yIGFic19wYXRoIGluIGlnbG9iKGFic19nbG9iKToKICAgICAgICAgICAgICAgIHJlc291cmNlX2ZpbGUgPSBnZXRfcmVsX3BhdGgocmVzb3VyY2VzX3Jvb3QsIGFic19wYXRoKQogICAgICAgICAgICAgICAgaWYgZGVzdCBpcyBOb25lOiAgIyByZW1vdmUgdGhlIGVudHJ5IGlmIGl0IHdhcyBoZXJlCiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25zLnBvcChyZXNvdXJjZV9maWxlLCBOb25lKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZWxfcGF0aCA9IGdldF9yZWxfcGF0aChhYnNfYmFzZSwgYWJzX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgcmVsX2Rlc3QgPSBkZXN0LnJlcGxhY2Uob3MucGF0aC5zZXAsICcvJykucnN0cmlwKCcvJykKICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbnNbcmVzb3VyY2VfZmlsZV0gPSByZWxfZGVzdCArICcvJyArIHJlbF9wYXRoCiAgICByZXR1cm4gZGVzdGluYXRpb25zCgoKZGVmIGluX3ZlbnYoKToKICAgIGlmIGhhc2F0dHIoc3lzLCAncmVhbF9wcmVmaXgnKToKICAgICAgICAjIHZpcnR1YWxlbnYgdmVudnMKICAgICAgICByZXN1bHQgPSBUcnVlCiAgICBlbHNlOgogICAgICAgICMgUEVQIDQwNSB2ZW52cwogICAgICAgIHJlc3VsdCA9IHN5cy5wcmVmaXggIT0gZ2V0YXR0cihzeXMsICdiYXNlX3ByZWZpeCcsIHN5cy5wcmVmaXgpCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIGdldF9leGVjdXRhYmxlKCk6CiMgVGhlIF9fUFlWRU5WX0xBVU5DSEVSX18gZGFuY2UgaXMgYXBwYXJlbnRseSBubyBsb25nZXIgbmVlZGVkLCBhcwojIGNoYW5nZXMgdG8gdGhlIHN0dWIgbGF1bmNoZXIgbWVhbiB0aGF0IHN5cy5leGVjdXRhYmxlIGFsd2F5cyBwb2ludHMKIyB0byB0aGUgc3R1YiBvbiBtYWNPUwojICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgKCdfX1BZVkVOVl9MQVVOQ0hFUl9fJwojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG9zLmVudmlyb24pOgojICAgICAgICByZXN1bHQgPSAgb3MuZW52aXJvblsnX19QWVZFTlZfTEFVTkNIRVJfXyddCiMgICAgZWxzZToKIyAgICAgICAgcmVzdWx0ID0gc3lzLmV4ZWN1dGFibGUKIyAgICByZXR1cm4gcmVzdWx0CiAgICByZXN1bHQgPSBvcy5wYXRoLm5vcm1jYXNlKHN5cy5leGVjdXRhYmxlKQogICAgaWYgbm90IGlzaW5zdGFuY2UocmVzdWx0LCB0ZXh0X3R5cGUpOgogICAgICAgIHJlc3VsdCA9IGZzZGVjb2RlKHJlc3VsdCkKICAgIHJldHVybiByZXN1bHQKCgpkZWYgcHJvY2VlZChwcm9tcHQsIGFsbG93ZWRfY2hhcnMsIGVycm9yX3Byb21wdD1Ob25lLCBkZWZhdWx0PU5vbmUpOgogICAgcCA9IHByb21wdAogICAgd2hpbGUgVHJ1ZToKICAgICAgICBzID0gcmF3X2lucHV0KHApCiAgICAgICAgcCA9IHByb21wdAogICAgICAgIGlmIG5vdCBzIGFuZCBkZWZhdWx0OgogICAgICAgICAgICBzID0gZGVmYXVsdAogICAgICAgIGlmIHM6CiAgICAgICAgICAgIGMgPSBzWzBdLmxvd2VyKCkKICAgICAgICAgICAgaWYgYyBpbiBhbGxvd2VkX2NoYXJzOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgZXJyb3JfcHJvbXB0OgogICAgICAgICAgICAgICAgcCA9ICclYzogJXNcbiVzJyAlIChjLCBlcnJvcl9wcm9tcHQsIHByb21wdCkKICAgIHJldHVybiBjCgoKZGVmIGV4dHJhY3RfYnlfa2V5KGQsIGtleXMpOgogICAgaWYgaXNpbnN0YW5jZShrZXlzLCBzdHJpbmdfdHlwZXMpOgogICAgICAgIGtleXMgPSBrZXlzLnNwbGl0KCkKICAgIHJlc3VsdCA9IHt9CiAgICBmb3Iga2V5IGluIGtleXM6CiAgICAgICAgaWYga2V5IGluIGQ6CiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gZFtrZXldCiAgICByZXR1cm4gcmVzdWx0CgpkZWYgcmVhZF9leHBvcnRzKHN0cmVhbSk6CiAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDM6CiAgICAgICAgIyBuZWVkcyB0byBiZSBhIHRleHQgc3RyZWFtCiAgICAgICAgc3RyZWFtID0gY29kZWNzLmdldHJlYWRlcigndXRmLTgnKShzdHJlYW0pCiAgICAjIFRyeSB0byBsb2FkIGFzIEpTT04sIGZhbGxpbmcgYmFjayBvbiBsZWdhY3kgZm9ybWF0CiAgICBkYXRhID0gc3RyZWFtLnJlYWQoKQogICAgc3RyZWFtID0gU3RyaW5nSU8oZGF0YSkKICAgIHRyeToKICAgICAgICBqZGF0YSA9IGpzb24ubG9hZChzdHJlYW0pCiAgICAgICAgcmVzdWx0ID0gamRhdGFbJ2V4dGVuc2lvbnMnXVsncHl0aG9uLmV4cG9ydHMnXVsnZXhwb3J0cyddCiAgICAgICAgZm9yIGdyb3VwLCBlbnRyaWVzIGluIHJlc3VsdC5pdGVtcygpOgogICAgICAgICAgICBmb3IgaywgdiBpbiBlbnRyaWVzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBzID0gJyVzID0gJXMnICUgKGssIHYpCiAgICAgICAgICAgICAgICBlbnRyeSA9IGdldF9leHBvcnRfZW50cnkocykKICAgICAgICAgICAgICAgIGFzc2VydCBlbnRyeSBpcyBub3QgTm9uZQogICAgICAgICAgICAgICAgZW50cmllc1trXSA9IGVudHJ5CiAgICAgICAgcmV0dXJuIHJlc3VsdAogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBzdHJlYW0uc2VlaygwLCAwKQoKICAgIGRlZiByZWFkX3N0cmVhbShjcCwgc3RyZWFtKToKICAgICAgICBpZiBoYXNhdHRyKGNwLCAncmVhZF9maWxlJyk6CiAgICAgICAgICAgIGNwLnJlYWRfZmlsZShzdHJlYW0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY3AucmVhZGZwKHN0cmVhbSkKCiAgICBjcCA9IGNvbmZpZ3BhcnNlci5Db25maWdQYXJzZXIoKQogICAgdHJ5OgogICAgICAgIHJlYWRfc3RyZWFtKGNwLCBzdHJlYW0pCiAgICBleGNlcHQgY29uZmlncGFyc2VyLk1pc3NpbmdTZWN0aW9uSGVhZGVyRXJyb3I6CiAgICAgICAgc3RyZWFtLmNsb3NlKCkKICAgICAgICBkYXRhID0gdGV4dHdyYXAuZGVkZW50KGRhdGEpCiAgICAgICAgc3RyZWFtID0gU3RyaW5nSU8oZGF0YSkKICAgICAgICByZWFkX3N0cmVhbShjcCwgc3RyZWFtKQoKICAgIHJlc3VsdCA9IHt9CiAgICBmb3Iga2V5IGluIGNwLnNlY3Rpb25zKCk6CiAgICAgICAgcmVzdWx0W2tleV0gPSBlbnRyaWVzID0ge30KICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gY3AuaXRlbXMoa2V5KToKICAgICAgICAgICAgcyA9ICclcyA9ICVzJyAlIChuYW1lLCB2YWx1ZSkKICAgICAgICAgICAgZW50cnkgPSBnZXRfZXhwb3J0X2VudHJ5KHMpCiAgICAgICAgICAgIGFzc2VydCBlbnRyeSBpcyBub3QgTm9uZQogICAgICAgICAgICAjZW50cnkuZGlzdCA9IHNlbGYKICAgICAgICAgICAgZW50cmllc1tuYW1lXSA9IGVudHJ5CiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIHdyaXRlX2V4cG9ydHMoZXhwb3J0cywgc3RyZWFtKToKICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMzoKICAgICAgICAjIG5lZWRzIHRvIGJlIGEgdGV4dCBzdHJlYW0KICAgICAgICBzdHJlYW0gPSBjb2RlY3MuZ2V0d3JpdGVyKCd1dGYtOCcpKHN0cmVhbSkKICAgIGNwID0gY29uZmlncGFyc2VyLkNvbmZpZ1BhcnNlcigpCiAgICBmb3IgaywgdiBpbiBleHBvcnRzLml0ZW1zKCk6CiAgICAgICAgIyBUT0RPIGNoZWNrIGssIHYgZm9yIHZhbGlkIHZhbHVlcwogICAgICAgIGNwLmFkZF9zZWN0aW9uKGspCiAgICAgICAgZm9yIGVudHJ5IGluIHYudmFsdWVzKCk6CiAgICAgICAgICAgIGlmIGVudHJ5LnN1ZmZpeCBpcyBOb25lOgogICAgICAgICAgICAgICAgcyA9IGVudHJ5LnByZWZpeAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcyA9ICclczolcycgJSAoZW50cnkucHJlZml4LCBlbnRyeS5zdWZmaXgpCiAgICAgICAgICAgIGlmIGVudHJ5LmZsYWdzOgogICAgICAgICAgICAgICAgcyA9ICclcyBbJXNdJyAlIChzLCAnLCAnLmpvaW4oZW50cnkuZmxhZ3MpKQogICAgICAgICAgICBjcC5zZXQoaywgZW50cnkubmFtZSwgcykKICAgIGNwLndyaXRlKHN0cmVhbSkKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgdGVtcGRpcigpOgogICAgdGQgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIHRyeToKICAgICAgICB5aWVsZCB0ZAogICAgZmluYWxseToKICAgICAgICBzaHV0aWwucm10cmVlKHRkKQoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIGNoZGlyKGQpOgogICAgY3dkID0gb3MuZ2V0Y3dkKCkKICAgIHRyeToKICAgICAgICBvcy5jaGRpcihkKQogICAgICAgIHlpZWxkCiAgICBmaW5hbGx5OgogICAgICAgIG9zLmNoZGlyKGN3ZCkKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc29ja2V0X3RpbWVvdXQoc2Vjb25kcz0xNSk6CiAgICBjdG8gPSBzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKQogICAgdHJ5OgogICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChzZWNvbmRzKQogICAgICAgIHlpZWxkCiAgICBmaW5hbGx5OgogICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChjdG8pCgoKY2xhc3MgY2FjaGVkX3Byb3BlcnR5KG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZnVuYyk6CiAgICAgICAgc2VsZi5mdW5jID0gZnVuYwogICAgICAgICNmb3IgYXR0ciBpbiAoJ19fbmFtZV9fJywgJ19fbW9kdWxlX18nLCAnX19kb2NfXycpOgogICAgICAgICMgICAgc2V0YXR0cihzZWxmLCBhdHRyLCBnZXRhdHRyKGZ1bmMsIGF0dHIsIE5vbmUpKQoKICAgIGRlZiBfX2dldF9fKHNlbGYsIG9iaiwgY2xzPU5vbmUpOgogICAgICAgIGlmIG9iaiBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIHZhbHVlID0gc2VsZi5mdW5jKG9iaikKICAgICAgICBvYmplY3QuX19zZXRhdHRyX18ob2JqLCBzZWxmLmZ1bmMuX19uYW1lX18sIHZhbHVlKQogICAgICAgICNvYmouX19kaWN0X19bc2VsZi5mdW5jLl9fbmFtZV9fXSA9IHZhbHVlID0gc2VsZi5mdW5jKG9iaikKICAgICAgICByZXR1cm4gdmFsdWUKCmRlZiBjb252ZXJ0X3BhdGgocGF0aG5hbWUpOgogICAgIiIiUmV0dXJuICdwYXRobmFtZScgYXMgYSBuYW1lIHRoYXQgd2lsbCB3b3JrIG9uIHRoZSBuYXRpdmUgZmlsZXN5c3RlbS4KCiAgICBUaGUgcGF0aCBpcyBzcGxpdCBvbiAnLycgYW5kIHB1dCBiYWNrIHRvZ2V0aGVyIGFnYWluIHVzaW5nIHRoZSBjdXJyZW50CiAgICBkaXJlY3Rvcnkgc2VwYXJhdG9yLiAgTmVlZGVkIGJlY2F1c2UgZmlsZW5hbWVzIGluIHRoZSBzZXR1cCBzY3JpcHQgYXJlCiAgICBhbHdheXMgc3VwcGxpZWQgaW4gVW5peCBzdHlsZSwgYW5kIGhhdmUgdG8gYmUgY29udmVydGVkIHRvIHRoZSBsb2NhbAogICAgY29udmVudGlvbiBiZWZvcmUgd2UgY2FuIGFjdHVhbGx5IHVzZSB0aGVtIGluIHRoZSBmaWxlc3lzdGVtLiAgUmFpc2VzCiAgICBWYWx1ZUVycm9yIG9uIG5vbi1Vbml4LWlzaCBzeXN0ZW1zIGlmICdwYXRobmFtZScgZWl0aGVyIHN0YXJ0cyBvcgogICAgZW5kcyB3aXRoIGEgc2xhc2guCiAgICAiIiIKICAgIGlmIG9zLnNlcCA9PSAnLyc6CiAgICAgICAgcmV0dXJuIHBhdGhuYW1lCiAgICBpZiBub3QgcGF0aG5hbWU6CiAgICAgICAgcmV0dXJuIHBhdGhuYW1lCiAgICBpZiBwYXRobmFtZVswXSA9PSAnLyc6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicGF0aCAnJXMnIGNhbm5vdCBiZSBhYnNvbHV0ZSIgJSBwYXRobmFtZSkKICAgIGlmIHBhdGhuYW1lWy0xXSA9PSAnLyc6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicGF0aCAnJXMnIGNhbm5vdCBlbmQgd2l0aCAnLyciICUgcGF0aG5hbWUpCgogICAgcGF0aHMgPSBwYXRobmFtZS5zcGxpdCgnLycpCiAgICB3aGlsZSBvcy5jdXJkaXIgaW4gcGF0aHM6CiAgICAgICAgcGF0aHMucmVtb3ZlKG9zLmN1cmRpcikKICAgIGlmIG5vdCBwYXRoczoKICAgICAgICByZXR1cm4gb3MuY3VyZGlyCiAgICByZXR1cm4gb3MucGF0aC5qb2luKCpwYXRocykKCgpjbGFzcyBGaWxlT3BlcmF0b3Iob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkcnlfcnVuPUZhbHNlKToKICAgICAgICBzZWxmLmRyeV9ydW4gPSBkcnlfcnVuCiAgICAgICAgc2VsZi5lbnN1cmVkID0gc2V0KCkKICAgICAgICBzZWxmLl9pbml0X3JlY29yZCgpCgogICAgZGVmIF9pbml0X3JlY29yZChzZWxmKToKICAgICAgICBzZWxmLnJlY29yZCA9IEZhbHNlCiAgICAgICAgc2VsZi5maWxlc193cml0dGVuID0gc2V0KCkKICAgICAgICBzZWxmLmRpcnNfY3JlYXRlZCA9IHNldCgpCgogICAgZGVmIHJlY29yZF9hc193cml0dGVuKHNlbGYsIHBhdGgpOgogICAgICAgIGlmIHNlbGYucmVjb3JkOgogICAgICAgICAgICBzZWxmLmZpbGVzX3dyaXR0ZW4uYWRkKHBhdGgpCgogICAgZGVmIG5ld2VyKHNlbGYsIHNvdXJjZSwgdGFyZ2V0KToKICAgICAgICAiIiJUZWxsIGlmIHRoZSB0YXJnZXQgaXMgbmV3ZXIgdGhhbiB0aGUgc291cmNlLgoKICAgICAgICBSZXR1cm5zIHRydWUgaWYgJ3NvdXJjZScgZXhpc3RzIGFuZCBpcyBtb3JlIHJlY2VudGx5IG1vZGlmaWVkIHRoYW4KICAgICAgICAndGFyZ2V0Jywgb3IgaWYgJ3NvdXJjZScgZXhpc3RzIGFuZCAndGFyZ2V0JyBkb2Vzbid0LgoKICAgICAgICBSZXR1cm5zIGZhbHNlIGlmIGJvdGggZXhpc3QgYW5kICd0YXJnZXQnIGlzIHRoZSBzYW1lIGFnZSBvciB5b3VuZ2VyCiAgICAgICAgdGhhbiAnc291cmNlJy4gUmFpc2UgUGFja2FnaW5nRmlsZUVycm9yIGlmICdzb3VyY2UnIGRvZXMgbm90IGV4aXN0LgoKICAgICAgICBOb3RlIHRoYXQgdGhpcyB0ZXN0IGlzIG5vdCB2ZXJ5IGFjY3VyYXRlOiBmaWxlcyBjcmVhdGVkIGluIHRoZSBzYW1lCiAgICAgICAgc2Vjb25kIHdpbGwgaGF2ZSB0aGUgc2FtZSAiYWdlIi4KICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc291cmNlKToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigiZmlsZSAnJXInIGRvZXMgbm90IGV4aXN0IiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5hYnNwYXRoKHNvdXJjZSkpCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHRhcmdldCk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIHJldHVybiBvcy5zdGF0KHNvdXJjZSkuc3RfbXRpbWUgPiBvcy5zdGF0KHRhcmdldCkuc3RfbXRpbWUKCiAgICBkZWYgY29weV9maWxlKHNlbGYsIGluZmlsZSwgb3V0ZmlsZSwgY2hlY2s9VHJ1ZSk6CiAgICAgICAgIiIiQ29weSBhIGZpbGUgcmVzcGVjdGluZyBkcnktcnVuIGFuZCBmb3JjZSBmbGFncy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmVuc3VyZV9kaXIob3MucGF0aC5kaXJuYW1lKG91dGZpbGUpKQogICAgICAgIGxvZ2dlci5pbmZvKCdDb3B5aW5nICVzIHRvICVzJywgaW5maWxlLCBvdXRmaWxlKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIG1zZyA9IE5vbmUKICAgICAgICAgICAgaWYgY2hlY2s6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhvdXRmaWxlKToKICAgICAgICAgICAgICAgICAgICBtc2cgPSAnJXMgaXMgYSBzeW1saW5rJyAlIG91dGZpbGUKICAgICAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMob3V0ZmlsZSkgYW5kIG5vdCBvcy5wYXRoLmlzZmlsZShvdXRmaWxlKToKICAgICAgICAgICAgICAgICAgICBtc2cgPSAnJXMgaXMgYSBub24tcmVndWxhciBmaWxlJyAlIG91dGZpbGUKICAgICAgICAgICAgaWYgbXNnOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2cgKyAnIHdoaWNoIHdvdWxkIGJlIG92ZXJ3cml0dGVuJykKICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlKGluZmlsZSwgb3V0ZmlsZSkKICAgICAgICBzZWxmLnJlY29yZF9hc193cml0dGVuKG91dGZpbGUpCgogICAgZGVmIGNvcHlfc3RyZWFtKHNlbGYsIGluc3RyZWFtLCBvdXRmaWxlLCBlbmNvZGluZz1Ob25lKToKICAgICAgICBhc3NlcnQgbm90IG9zLnBhdGguaXNkaXIob3V0ZmlsZSkKICAgICAgICBzZWxmLmVuc3VyZV9kaXIob3MucGF0aC5kaXJuYW1lKG91dGZpbGUpKQogICAgICAgIGxvZ2dlci5pbmZvKCdDb3B5aW5nIHN0cmVhbSAlcyB0byAlcycsIGluc3RyZWFtLCBvdXRmaWxlKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBvdXRzdHJlYW0gPSBvcGVuKG91dGZpbGUsICd3YicpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBvdXRzdHJlYW0gPSBjb2RlY3Mub3BlbihvdXRmaWxlLCAndycsIGVuY29kaW5nPWVuY29kaW5nKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzaHV0aWwuY29weWZpbGVvYmooaW5zdHJlYW0sIG91dHN0cmVhbSkKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIG91dHN0cmVhbS5jbG9zZSgpCiAgICAgICAgc2VsZi5yZWNvcmRfYXNfd3JpdHRlbihvdXRmaWxlKQoKICAgIGRlZiB3cml0ZV9iaW5hcnlfZmlsZShzZWxmLCBwYXRoLCBkYXRhKToKICAgICAgICBzZWxmLmVuc3VyZV9kaXIob3MucGF0aC5kaXJuYW1lKHBhdGgpKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAnd2InKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZShkYXRhKQogICAgICAgIHNlbGYucmVjb3JkX2FzX3dyaXR0ZW4ocGF0aCkKCiAgICBkZWYgd3JpdGVfdGV4dF9maWxlKHNlbGYsIHBhdGgsIGRhdGEsIGVuY29kaW5nKToKICAgICAgICBzZWxmLmVuc3VyZV9kaXIob3MucGF0aC5kaXJuYW1lKHBhdGgpKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAnd2InKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZShkYXRhLmVuY29kZShlbmNvZGluZykpCiAgICAgICAgc2VsZi5yZWNvcmRfYXNfd3JpdHRlbihwYXRoKQoKICAgIGRlZiBzZXRfbW9kZShzZWxmLCBiaXRzLCBtYXNrLCBmaWxlcyk6CiAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnIG9yIChvcy5uYW1lID09ICdqYXZhJyBhbmQgb3MuX25hbWUgPT0gJ3Bvc2l4Jyk6CiAgICAgICAgICAgICMgU2V0IHRoZSBleGVjdXRhYmxlIGJpdHMgKG93bmVyLCBncm91cCwgYW5kIHdvcmxkKSBvbgogICAgICAgICAgICAjIGFsbCB0aGUgZmlsZXMgc3BlY2lmaWVkLgogICAgICAgICAgICBmb3IgZiBpbiBmaWxlczoKICAgICAgICAgICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiY2hhbmdpbmcgbW9kZSBvZiAlcyIsIGYpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG1vZGUgPSAob3Muc3RhdChmKS5zdF9tb2RlIHwgYml0cykgJiBtYXNrCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImNoYW5naW5nIG1vZGUgb2YgJXMgdG8gJW8iLCBmLCBtb2RlKQogICAgICAgICAgICAgICAgICAgIG9zLmNobW9kKGYsIG1vZGUpCgogICAgc2V0X2V4ZWN1dGFibGVfbW9kZSA9IGxhbWJkYSBzLCBmOiBzLnNldF9tb2RlKDBvNTU1LCAwbzc3NzcsIGYpCgogICAgZGVmIGVuc3VyZV9kaXIoc2VsZiwgcGF0aCk6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguYWJzcGF0aChwYXRoKQogICAgICAgIGlmIHBhdGggbm90IGluIHNlbGYuZW5zdXJlZCBhbmQgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpOgogICAgICAgICAgICBzZWxmLmVuc3VyZWQuYWRkKHBhdGgpCiAgICAgICAgICAgIGQsIGYgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCiAgICAgICAgICAgIHNlbGYuZW5zdXJlX2RpcihkKQogICAgICAgICAgICBsb2dnZXIuaW5mbygnQ3JlYXRpbmcgJXMnICUgcGF0aCkKICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIG9zLm1rZGlyKHBhdGgpCiAgICAgICAgICAgIGlmIHNlbGYucmVjb3JkOgogICAgICAgICAgICAgICAgc2VsZi5kaXJzX2NyZWF0ZWQuYWRkKHBhdGgpCgogICAgZGVmIGJ5dGVfY29tcGlsZShzZWxmLCBwYXRoLCBvcHRpbWl6ZT1GYWxzZSwgZm9yY2U9RmFsc2UsIHByZWZpeD1Ob25lKToKICAgICAgICBkcGF0aCA9IGNhY2hlX2Zyb21fc291cmNlKHBhdGgsIG5vdCBvcHRpbWl6ZSkKICAgICAgICBsb2dnZXIuaW5mbygnQnl0ZS1jb21waWxpbmcgJXMgdG8gJXMnLCBwYXRoLCBkcGF0aCkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBpZiBmb3JjZSBvciBzZWxmLm5ld2VyKHBhdGgsIGRwYXRoKToKICAgICAgICAgICAgICAgIGlmIG5vdCBwcmVmaXg6CiAgICAgICAgICAgICAgICAgICAgZGlhZ3BhdGggPSBOb25lCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGFzc2VydCBwYXRoLnN0YXJ0c3dpdGgocHJlZml4KQogICAgICAgICAgICAgICAgICAgIGRpYWdwYXRoID0gcGF0aFtsZW4ocHJlZml4KTpdCiAgICAgICAgICAgIHB5X2NvbXBpbGUuY29tcGlsZShwYXRoLCBkcGF0aCwgZGlhZ3BhdGgsIFRydWUpICAgICAjIHJhaXNlIGVycm9yCiAgICAgICAgc2VsZi5yZWNvcmRfYXNfd3JpdHRlbihkcGF0aCkKICAgICAgICByZXR1cm4gZHBhdGgKCiAgICBkZWYgZW5zdXJlX3JlbW92ZWQoc2VsZiwgcGF0aCk6CiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCkgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhwYXRoKToKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVtb3ZpbmcgZGlyZWN0b3J5IHRyZWUgYXQgJXMnLCBwYXRoKQogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKHBhdGgpCiAgICAgICAgICAgICAgICBpZiBzZWxmLnJlY29yZDoKICAgICAgICAgICAgICAgICAgICBpZiBwYXRoIGluIHNlbGYuZGlyc19jcmVhdGVkOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpcnNfY3JlYXRlZC5yZW1vdmUocGF0aCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNsaW5rKHBhdGgpOgogICAgICAgICAgICAgICAgICAgIHMgPSAnbGluaycKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcyA9ICdmaWxlJwogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZW1vdmluZyAlcyAlcycsIHMsIHBhdGgpCiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShwYXRoKQogICAgICAgICAgICAgICAgaWYgc2VsZi5yZWNvcmQ6CiAgICAgICAgICAgICAgICAgICAgaWYgcGF0aCBpbiBzZWxmLmZpbGVzX3dyaXR0ZW46CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZXNfd3JpdHRlbi5yZW1vdmUocGF0aCkKCiAgICBkZWYgaXNfd3JpdGFibGUoc2VsZiwgcGF0aCk6CiAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICB3aGlsZSBub3QgcmVzdWx0OgogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9zLmFjY2VzcyhwYXRoLCBvcy5XX09LKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgcGFyZW50ID0gb3MucGF0aC5kaXJuYW1lKHBhdGgpCiAgICAgICAgICAgIGlmIHBhcmVudCA9PSBwYXRoOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgcGF0aCA9IHBhcmVudAogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgY29tbWl0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENvbW1pdCByZWNvcmRlZCBjaGFuZ2VzLCB0dXJuIG9mZiByZWNvcmRpbmcsIHJldHVybgogICAgICAgIGNoYW5nZXMuCiAgICAgICAgIiIiCiAgICAgICAgYXNzZXJ0IHNlbGYucmVjb3JkCiAgICAgICAgcmVzdWx0ID0gc2VsZi5maWxlc193cml0dGVuLCBzZWxmLmRpcnNfY3JlYXRlZAogICAgICAgIHNlbGYuX2luaXRfcmVjb3JkKCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHJvbGxiYWNrKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGZvciBmIGluIGxpc3Qoc2VsZi5maWxlc193cml0dGVuKToKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGYpOgogICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShmKQogICAgICAgICAgICAjIGRpcnMgc2hvdWxkIGFsbCBiZSBlbXB0eSBub3csIGV4Y2VwdCBwZXJoYXBzIGZvcgogICAgICAgICAgICAjIF9fcHljYWNoZV9fIHN1YmRpcnMKICAgICAgICAgICAgIyByZXZlcnNlIHNvIHRoYXQgc3ViZGlycyBhcHBlYXIgYmVmb3JlIHRoZWlyIHBhcmVudHMKICAgICAgICAgICAgZGlycyA9IHNvcnRlZChzZWxmLmRpcnNfY3JlYXRlZCwgcmV2ZXJzZT1UcnVlKQogICAgICAgICAgICBmb3IgZCBpbiBkaXJzOgogICAgICAgICAgICAgICAgZmxpc3QgPSBvcy5saXN0ZGlyKGQpCiAgICAgICAgICAgICAgICBpZiBmbGlzdDoKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmxpc3QgPT0gWydfX3B5Y2FjaGVfXyddCiAgICAgICAgICAgICAgICAgICAgc2QgPSBvcy5wYXRoLmpvaW4oZCwgZmxpc3RbMF0pCiAgICAgICAgICAgICAgICAgICAgb3Mucm1kaXIoc2QpCiAgICAgICAgICAgICAgICBvcy5ybWRpcihkKSAgICAgIyBzaG91bGQgZmFpbCBpZiBub24tZW1wdHkKICAgICAgICBzZWxmLl9pbml0X3JlY29yZCgpCgpkZWYgcmVzb2x2ZShtb2R1bGVfbmFtZSwgZG90dGVkX3BhdGgpOgogICAgaWYgbW9kdWxlX25hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgbW9kID0gc3lzLm1vZHVsZXNbbW9kdWxlX25hbWVdCiAgICBlbHNlOgogICAgICAgIG1vZCA9IF9faW1wb3J0X18obW9kdWxlX25hbWUpCiAgICBpZiBkb3R0ZWRfcGF0aCBpcyBOb25lOgogICAgICAgIHJlc3VsdCA9IG1vZAogICAgZWxzZToKICAgICAgICBwYXJ0cyA9IGRvdHRlZF9wYXRoLnNwbGl0KCcuJykKICAgICAgICByZXN1bHQgPSBnZXRhdHRyKG1vZCwgcGFydHMucG9wKDApKQogICAgICAgIGZvciBwIGluIHBhcnRzOgogICAgICAgICAgICByZXN1bHQgPSBnZXRhdHRyKHJlc3VsdCwgcCkKICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBFeHBvcnRFbnRyeShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCwgc3VmZml4LCBmbGFncyk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgIHNlbGYucHJlZml4ID0gcHJlZml4CiAgICAgICAgc2VsZi5zdWZmaXggPSBzdWZmaXgKICAgICAgICBzZWxmLmZsYWdzID0gZmxhZ3MKCiAgICBAY2FjaGVkX3Byb3BlcnR5CiAgICBkZWYgdmFsdWUoc2VsZik6CiAgICAgICAgcmV0dXJuIHJlc29sdmUoc2VsZi5wcmVmaXgsIHNlbGYuc3VmZml4KQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgIHJldHVybiAnPEV4cG9ydEVudHJ5ICVzID0gJXM6JXMgJXM+JyAlIChzZWxmLm5hbWUsIHNlbGYucHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN1ZmZpeCwgc2VsZi5mbGFncykKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgRXhwb3J0RW50cnkpOgogICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IChzZWxmLm5hbWUgPT0gb3RoZXIubmFtZSBhbmQKICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHJlZml4ID09IG90aGVyLnByZWZpeCBhbmQKICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3VmZml4ID09IG90aGVyLnN1ZmZpeCBhbmQKICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmxhZ3MgPT0gb3RoZXIuZmxhZ3MpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIF9faGFzaF9fID0gb2JqZWN0Ll9faGFzaF9fCgoKRU5UUllfUkUgPSByZS5jb21waWxlKHInJycoP1A8bmFtZT4oXHd8Wy0uK10pKykKICAgICAgICAgICAgICAgICAgICAgIFxzKj1ccyooP1A8Y2FsbGFibGU+KFx3KykoWzpcLl1cdyspKikKICAgICAgICAgICAgICAgICAgICAgIFxzKihcW1xzKig/UDxmbGFncz5cdysoPVx3Kyk/KCxccypcdysoPVx3Kyk/KSopXHMqXF0pPwogICAgICAgICAgICAgICAgICAgICAgJycnLCByZS5WRVJCT1NFKQoKZGVmIGdldF9leHBvcnRfZW50cnkoc3BlY2lmaWNhdGlvbik6CiAgICBtID0gRU5UUllfUkUuc2VhcmNoKHNwZWNpZmljYXRpb24pCiAgICBpZiBub3QgbToKICAgICAgICByZXN1bHQgPSBOb25lCiAgICAgICAgaWYgJ1snIGluIHNwZWNpZmljYXRpb24gb3IgJ10nIGluIHNwZWNpZmljYXRpb246CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oIkludmFsaWQgc3BlY2lmaWNhdGlvbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcyciICUgc3BlY2lmaWNhdGlvbikKICAgIGVsc2U6CiAgICAgICAgZCA9IG0uZ3JvdXBkaWN0KCkKICAgICAgICBuYW1lID0gZFsnbmFtZSddCiAgICAgICAgcGF0aCA9IGRbJ2NhbGxhYmxlJ10KICAgICAgICBjb2xvbnMgPSBwYXRoLmNvdW50KCc6JykKICAgICAgICBpZiBjb2xvbnMgPT0gMDoKICAgICAgICAgICAgcHJlZml4LCBzdWZmaXggPSBwYXRoLCBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgY29sb25zICE9IDE6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCJJbnZhbGlkIHNwZWNpZmljYXRpb24gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyIgJSBzcGVjaWZpY2F0aW9uKQogICAgICAgICAgICBwcmVmaXgsIHN1ZmZpeCA9IHBhdGguc3BsaXQoJzonKQogICAgICAgIGZsYWdzID0gZFsnZmxhZ3MnXQogICAgICAgIGlmIGZsYWdzIGlzIE5vbmU6CiAgICAgICAgICAgIGlmICdbJyBpbiBzcGVjaWZpY2F0aW9uIG9yICddJyBpbiBzcGVjaWZpY2F0aW9uOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigiSW52YWxpZCBzcGVjaWZpY2F0aW9uICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcyciICUgc3BlY2lmaWNhdGlvbikKICAgICAgICAgICAgZmxhZ3MgPSBbXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZsYWdzID0gW2Yuc3RyaXAoKSBmb3IgZiBpbiBmbGFncy5zcGxpdCgnLCcpXQogICAgICAgIHJlc3VsdCA9IEV4cG9ydEVudHJ5KG5hbWUsIHByZWZpeCwgc3VmZml4LCBmbGFncykKICAgIHJldHVybiByZXN1bHQKCgpkZWYgZ2V0X2NhY2hlX2Jhc2Uoc3VmZml4PU5vbmUpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIGRlZmF1bHQgYmFzZSBsb2NhdGlvbiBmb3IgZGlzdGxpYiBjYWNoZXMuIElmIHRoZSBkaXJlY3RvcnkgZG9lcwogICAgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkLiBVc2UgdGhlIHN1ZmZpeCBwcm92aWRlZCBmb3IgdGhlIGJhc2UgZGlyZWN0b3J5LAogICAgYW5kIGRlZmF1bHQgdG8gJy5kaXN0bGliJyBpZiBpdCBpc24ndCBwcm92aWRlZC4KCiAgICBPbiBXaW5kb3dzLCBpZiBMT0NBTEFQUERBVEEgaXMgZGVmaW5lZCBpbiB0aGUgZW52aXJvbm1lbnQsIHRoZW4gaXQgaXMKICAgIGFzc3VtZWQgdG8gYmUgYSBkaXJlY3RvcnksIGFuZCB3aWxsIGJlIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSByZXN1bHQuCiAgICBPbiBQT1NJWCwgYW5kIG9uIFdpbmRvd3MgaWYgTE9DQUxBUFBEQVRBIGlzIG5vdCBkZWZpbmVkLCB0aGUgdXNlcidzIGhvbWUKICAgIGRpcmVjdG9yeSAtIHVzaW5nIG9zLmV4cGFuZHVzZXIoJ34nKSAtIHdpbGwgYmUgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YKICAgIHRoZSByZXN1bHQuCgogICAgVGhlIHJlc3VsdCBpcyBqdXN0IHRoZSBkaXJlY3RvcnkgJy5kaXN0bGliJyBpbiB0aGUgcGFyZW50IGRpcmVjdG9yeSBhcwogICAgZGV0ZXJtaW5lZCBhYm92ZSwgb3Igd2l0aCB0aGUgbmFtZSBzcGVjaWZpZWQgd2l0aCBgYHN1ZmZpeGBgLgogICAgIiIiCiAgICBpZiBzdWZmaXggaXMgTm9uZToKICAgICAgICBzdWZmaXggPSAnLmRpc3RsaWInCiAgICBpZiBvcy5uYW1lID09ICdudCcgYW5kICdMT0NBTEFQUERBVEEnIGluIG9zLmVudmlyb246CiAgICAgICAgcmVzdWx0ID0gb3MucGF0aC5leHBhbmR2YXJzKCckbG9jYWxhcHBkYXRhJykKICAgIGVsc2U6CiAgICAgICAgIyBBc3N1bWUgcG9zaXgsIG9yIG9sZCBXaW5kb3dzCiAgICAgICAgcmVzdWx0ID0gb3MucGF0aC5leHBhbmR1c2VyKCd+JykKICAgICMgd2UgdXNlICdpc2RpcicgaW5zdGVhZCBvZiAnZXhpc3RzJywgYmVjYXVzZSB3ZSB3YW50IHRvCiAgICAjIGZhaWwgaWYgdGhlcmUncyBhIGZpbGUgd2l0aCB0aGF0IG5hbWUKICAgIGlmIG9zLnBhdGguaXNkaXIocmVzdWx0KToKICAgICAgICB1c2FibGUgPSBvcy5hY2Nlc3MocmVzdWx0LCBvcy5XX09LKQogICAgICAgIGlmIG5vdCB1c2FibGU6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdEaXJlY3RvcnkgZXhpc3RzIGJ1dCBpcyBub3Qgd3JpdGFibGU6ICVzJywgcmVzdWx0KQogICAgZWxzZToKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9zLm1ha2VkaXJzKHJlc3VsdCkKICAgICAgICAgICAgdXNhYmxlID0gVHJ1ZQogICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygnVW5hYmxlIHRvIGNyZWF0ZSAlcycsIHJlc3VsdCwgZXhjX2luZm89VHJ1ZSkKICAgICAgICAgICAgdXNhYmxlID0gRmFsc2UKICAgIGlmIG5vdCB1c2FibGU6CiAgICAgICAgcmVzdWx0ID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0RlZmF1bHQgbG9jYXRpb24gdW51c2FibGUsIHVzaW5nICVzJywgcmVzdWx0KQogICAgcmV0dXJuIG9zLnBhdGguam9pbihyZXN1bHQsIHN1ZmZpeCkKCgpkZWYgcGF0aF90b19jYWNoZV9kaXIocGF0aCk6CiAgICAiIiIKICAgIENvbnZlcnQgYW4gYWJzb2x1dGUgcGF0aCB0byBhIGRpcmVjdG9yeSBuYW1lIGZvciB1c2UgaW4gYSBjYWNoZS4KCiAgICBUaGUgYWxnb3JpdGhtIHVzZWQgaXM6CgogICAgIy4gT24gV2luZG93cywgYW55IGBgJzonYGAgaW4gdGhlIGRyaXZlIGlzIHJlcGxhY2VkIHdpdGggYGAnLS0tJ2BgLgogICAgIy4gQW55IG9jY3VycmVuY2Ugb2YgYGBvcy5zZXBgYCBpcyByZXBsYWNlZCB3aXRoIGBgJy0tJ2BgLgogICAgIy4gYGAnLmNhY2hlJ2BgIGlzIGFwcGVuZGVkLgogICAgIiIiCiAgICBkLCBwID0gb3MucGF0aC5zcGxpdGRyaXZlKG9zLnBhdGguYWJzcGF0aChwYXRoKSkKICAgIGlmIGQ6CiAgICAgICAgZCA9IGQucmVwbGFjZSgnOicsICctLS0nKQogICAgcCA9IHAucmVwbGFjZShvcy5zZXAsICctLScpCiAgICByZXR1cm4gZCArIHAgKyAnLmNhY2hlJwoKCmRlZiBlbnN1cmVfc2xhc2gocyk6CiAgICBpZiBub3Qgcy5lbmRzd2l0aCgnLycpOgogICAgICAgIHJldHVybiBzICsgJy8nCiAgICByZXR1cm4gcwoKCmRlZiBwYXJzZV9jcmVkZW50aWFscyhuZXRsb2MpOgogICAgdXNlcm5hbWUgPSBwYXNzd29yZCA9IE5vbmUKICAgIGlmICdAJyBpbiBuZXRsb2M6CiAgICAgICAgcHJlZml4LCBuZXRsb2MgPSBuZXRsb2Muc3BsaXQoJ0AnLCAxKQogICAgICAgIGlmICc6JyBub3QgaW4gcHJlZml4OgogICAgICAgICAgICB1c2VybmFtZSA9IHByZWZpeAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCA9IHByZWZpeC5zcGxpdCgnOicsIDEpCiAgICByZXR1cm4gdXNlcm5hbWUsIHBhc3N3b3JkLCBuZXRsb2MKCgpkZWYgZ2V0X3Byb2Nlc3NfdW1hc2soKToKICAgIHJlc3VsdCA9IG9zLnVtYXNrKDBvMjIpCiAgICBvcy51bWFzayhyZXN1bHQpCiAgICByZXR1cm4gcmVzdWx0CgpkZWYgaXNfc3RyaW5nX3NlcXVlbmNlKHNlcSk6CiAgICByZXN1bHQgPSBUcnVlCiAgICBpID0gTm9uZQogICAgZm9yIGksIHMgaW4gZW51bWVyYXRlKHNlcSk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uocywgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICAgICAgYnJlYWsKICAgIGFzc2VydCBpIGlzIG5vdCBOb25lCiAgICByZXR1cm4gcmVzdWx0CgpQUk9KRUNUX05BTUVfQU5EX1ZFUlNJT04gPSByZS5jb21waWxlKCcoW2EtejAtOV9dKyhbLi1dW2Etel9dW2EtejAtOV9dKikqKS0nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhbYS16MC05Xy4rLV0rKScsIHJlLkkpClBZVEhPTl9WRVJTSU9OID0gcmUuY29tcGlsZShyJy1weShcZFwuP1xkPyknKQoKCmRlZiBzcGxpdF9maWxlbmFtZShmaWxlbmFtZSwgcHJvamVjdF9uYW1lPU5vbmUpOgogICAgIiIiCiAgICBFeHRyYWN0IG5hbWUsIHZlcnNpb24sIHB5dGhvbiB2ZXJzaW9uIGZyb20gYSBmaWxlbmFtZSAobm8gZXh0ZW5zaW9uKQoKICAgIFJldHVybiBuYW1lLCB2ZXJzaW9uLCBweXZlciBvciBOb25lCiAgICAiIiIKICAgIHJlc3VsdCA9IE5vbmUKICAgIHB5dmVyID0gTm9uZQogICAgZmlsZW5hbWUgPSB1bnF1b3RlKGZpbGVuYW1lKS5yZXBsYWNlKCcgJywgJy0nKQogICAgbSA9IFBZVEhPTl9WRVJTSU9OLnNlYXJjaChmaWxlbmFtZSkKICAgIGlmIG06CiAgICAgICAgcHl2ZXIgPSBtLmdyb3VwKDEpCiAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZVs6bS5zdGFydCgpXQogICAgaWYgcHJvamVjdF9uYW1lIGFuZCBsZW4oZmlsZW5hbWUpID4gbGVuKHByb2plY3RfbmFtZSkgKyAxOgogICAgICAgIG0gPSByZS5tYXRjaChyZS5lc2NhcGUocHJvamVjdF9uYW1lKSArIHInXGInLCBmaWxlbmFtZSkKICAgICAgICBpZiBtOgogICAgICAgICAgICBuID0gbS5lbmQoKQogICAgICAgICAgICByZXN1bHQgPSBmaWxlbmFtZVs6bl0sIGZpbGVuYW1lW24gKyAxOl0sIHB5dmVyCiAgICBpZiByZXN1bHQgaXMgTm9uZToKICAgICAgICBtID0gUFJPSkVDVF9OQU1FX0FORF9WRVJTSU9OLm1hdGNoKGZpbGVuYW1lKQogICAgICAgIGlmIG06CiAgICAgICAgICAgIHJlc3VsdCA9IG0uZ3JvdXAoMSksIG0uZ3JvdXAoMyksIHB5dmVyCiAgICByZXR1cm4gcmVzdWx0CgojIEFsbG93IHNwYWNlcyBpbiBuYW1lIGJlY2F1c2Ugb2YgbGVnYWN5IGRpc3RzIGxpa2UgIlR3aXN0ZWQgQ29yZSIKTkFNRV9WRVJTSU9OX1JFID0gcmUuY29tcGlsZShyJyg/UDxuYW1lPltcdyAuLV0rKVxzKicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1woXHMqKD9QPHZlcj5bXlxzKV0rKVwpJCcpCgpkZWYgcGFyc2VfbmFtZV9hbmRfdmVyc2lvbihwKToKICAgICIiIgogICAgQSB1dGlsaXR5IG1ldGhvZCB1c2VkIHRvIGdldCBuYW1lIGFuZCB2ZXJzaW9uIGZyb20gYSBzdHJpbmcuCgogICAgRnJvbSBlLmcuIGEgUHJvdmlkZXMtRGlzdCB2YWx1ZS4KCiAgICA6cGFyYW0gcDogQSB2YWx1ZSBpbiBhIGZvcm0gJ2ZvbyAoMS4wKScKICAgIDpyZXR1cm46IFRoZSBuYW1lIGFuZCB2ZXJzaW9uIGFzIGEgdHVwbGUuCiAgICAiIiIKICAgIG0gPSBOQU1FX1ZFUlNJT05fUkUubWF0Y2gocCkKICAgIGlmIG5vdCBtOgogICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ0lsbC1mb3JtZWQgbmFtZS92ZXJzaW9uIHN0cmluZzogXCclc1wnJyAlIHApCiAgICBkID0gbS5ncm91cGRpY3QoKQogICAgcmV0dXJuIGRbJ25hbWUnXS5zdHJpcCgpLmxvd2VyKCksIGRbJ3ZlciddCgpkZWYgZ2V0X2V4dHJhcyhyZXF1ZXN0ZWQsIGF2YWlsYWJsZSk6CiAgICByZXN1bHQgPSBzZXQoKQogICAgcmVxdWVzdGVkID0gc2V0KHJlcXVlc3RlZCBvciBbXSkKICAgIGF2YWlsYWJsZSA9IHNldChhdmFpbGFibGUgb3IgW10pCiAgICBpZiAnKicgaW4gcmVxdWVzdGVkOgogICAgICAgIHJlcXVlc3RlZC5yZW1vdmUoJyonKQogICAgICAgIHJlc3VsdCB8PSBhdmFpbGFibGUKICAgIGZvciByIGluIHJlcXVlc3RlZDoKICAgICAgICBpZiByID09ICctJzoKICAgICAgICAgICAgcmVzdWx0LmFkZChyKQogICAgICAgIGVsaWYgci5zdGFydHN3aXRoKCctJyk6CiAgICAgICAgICAgIHVud2FudGVkID0gclsxOl0KICAgICAgICAgICAgaWYgdW53YW50ZWQgbm90IGluIGF2YWlsYWJsZToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCd1bmRlY2xhcmVkIGV4dHJhOiAlcycgJSB1bndhbnRlZCkKICAgICAgICAgICAgaWYgdW53YW50ZWQgaW4gcmVzdWx0OgogICAgICAgICAgICAgICAgcmVzdWx0LnJlbW92ZSh1bndhbnRlZCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiByIG5vdCBpbiBhdmFpbGFibGU6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygndW5kZWNsYXJlZCBleHRyYTogJXMnICUgcikKICAgICAgICAgICAgcmVzdWx0LmFkZChyKQogICAgcmV0dXJuIHJlc3VsdAojCiMgRXh0ZW5kZWQgbWV0YWRhdGEgZnVuY3Rpb25hbGl0eQojCgpkZWYgX2dldF9leHRlcm5hbF9kYXRhKHVybCk6CiAgICByZXN1bHQgPSB7fQogICAgdHJ5OgogICAgICAgICMgdXJsb3BlbiBtaWdodCBmYWlsIGlmIGl0IHJ1bnMgaW50byByZWRpcmVjdGlvbnMsCiAgICAgICAgIyBiZWNhdXNlIG9mIFB5dGhvbiBpc3N1ZSAjMTM2OTYuIEZpeGVkIGluIGxvY2F0b3JzCiAgICAgICAgIyB1c2luZyBhIGN1c3RvbSByZWRpcmVjdCBoYW5kbGVyLgogICAgICAgIHJlc3AgPSB1cmxvcGVuKHVybCkKICAgICAgICBoZWFkZXJzID0gcmVzcC5pbmZvKCkKICAgICAgICBjdCA9IGhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKQogICAgICAgIGlmIG5vdCBjdC5zdGFydHN3aXRoKCdhcHBsaWNhdGlvbi9qc29uJyk6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnVW5leHBlY3RlZCByZXNwb25zZSBmb3IgSlNPTiByZXF1ZXN0OiAlcycsIGN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlYWRlciA9IGNvZGVjcy5nZXRyZWFkZXIoJ3V0Zi04JykocmVzcCkKICAgICAgICAgICAgI2RhdGEgPSByZWFkZXIucmVhZCgpLmRlY29kZSgndXRmLTgnKQogICAgICAgICAgICAjcmVzdWx0ID0ganNvbi5sb2FkcyhkYXRhKQogICAgICAgICAgICByZXN1bHQgPSBqc29uLmxvYWQocmVhZGVyKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGxvZ2dlci5leGNlcHRpb24oJ0ZhaWxlZCB0byBnZXQgZXh0ZXJuYWwgZGF0YSBmb3IgJXM6ICVzJywgdXJsLCBlKQogICAgcmV0dXJuIHJlc3VsdAoKX2V4dGVybmFsX2RhdGFfYmFzZV91cmwgPSAnaHR0cHM6Ly93d3cucmVkLWRvdmUuY29tL3B5cGkvcHJvamVjdHMvJwoKZGVmIGdldF9wcm9qZWN0X2RhdGEobmFtZSk6CiAgICB1cmwgPSAnJXMvJXMvcHJvamVjdC5qc29uJyAlIChuYW1lWzBdLnVwcGVyKCksIG5hbWUpCiAgICB1cmwgPSB1cmxqb2luKF9leHRlcm5hbF9kYXRhX2Jhc2VfdXJsLCB1cmwpCiAgICByZXN1bHQgPSBfZ2V0X2V4dGVybmFsX2RhdGEodXJsKQogICAgcmV0dXJuIHJlc3VsdAoKZGVmIGdldF9wYWNrYWdlX2RhdGEobmFtZSwgdmVyc2lvbik6CiAgICB1cmwgPSAnJXMvJXMvcGFja2FnZS0lcy5qc29uJyAlIChuYW1lWzBdLnVwcGVyKCksIG5hbWUsIHZlcnNpb24pCiAgICB1cmwgPSB1cmxqb2luKF9leHRlcm5hbF9kYXRhX2Jhc2VfdXJsLCB1cmwpCiAgICByZXR1cm4gX2dldF9leHRlcm5hbF9kYXRhKHVybCkKCgpjbGFzcyBDYWNoZShvYmplY3QpOgogICAgIiIiCiAgICBBIGNsYXNzIGltcGxlbWVudGluZyBhIGNhY2hlIGZvciByZXNvdXJjZXMgdGhhdCBuZWVkIHRvIGxpdmUgaW4gdGhlIGZpbGUgc3lzdGVtCiAgICBlLmcuIHNoYXJlZCBsaWJyYXJpZXMuIFRoaXMgY2xhc3Mgd2FzIG1vdmVkIGZyb20gcmVzb3VyY2VzIHRvIGhlcmUgYmVjYXVzZSBpdAogICAgY291bGQgYmUgdXNlZCBieSBvdGhlciBtb2R1bGVzLCBlLmcuIHRoZSB3aGVlbCBtb2R1bGUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYmFzZSk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KCiAgICAgICAgOnBhcmFtIGJhc2U6IFRoZSBiYXNlIGRpcmVjdG9yeSB3aGVyZSB0aGUgY2FjaGUgc2hvdWxkIGJlIGxvY2F0ZWQuCiAgICAgICAgIiIiCiAgICAgICAgIyB3ZSB1c2UgJ2lzZGlyJyBpbnN0ZWFkIG9mICdleGlzdHMnLCBiZWNhdXNlIHdlIHdhbnQgdG8KICAgICAgICAjIGZhaWwgaWYgdGhlcmUncyBhIGZpbGUgd2l0aCB0aGF0IG5hbWUKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihiYXNlKTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICBvcy5tYWtlZGlycyhiYXNlKQogICAgICAgIGlmIChvcy5zdGF0KGJhc2UpLnN0X21vZGUgJiAwbzc3KSAhPSAwOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygnRGlyZWN0b3J5IFwnJXNcJyBpcyBub3QgcHJpdmF0ZScsIGJhc2UpCiAgICAgICAgc2VsZi5iYXNlID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGgubm9ybXBhdGgoYmFzZSkpCgogICAgZGVmIHByZWZpeF90b19kaXIoc2VsZiwgcHJlZml4KToKICAgICAgICAiIiIKICAgICAgICBDb252ZXJ0cyBhIHJlc291cmNlIHByZWZpeCB0byBhIGRpcmVjdG9yeSBuYW1lIGluIHRoZSBjYWNoZS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gcGF0aF90b19jYWNoZV9kaXIocHJlZml4KQoKICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDbGVhciB0aGUgY2FjaGUuCiAgICAgICAgIiIiCiAgICAgICAgbm90X3JlbW92ZWQgPSBbXQogICAgICAgIGZvciBmbiBpbiBvcy5saXN0ZGlyKHNlbGYuYmFzZSk6CiAgICAgICAgICAgIGZuID0gb3MucGF0aC5qb2luKHNlbGYuYmFzZSwgZm4pCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNsaW5rKGZuKSBvciBvcy5wYXRoLmlzZmlsZShmbik6CiAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGZuKQogICAgICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKGZuKToKICAgICAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKGZuKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgbm90X3JlbW92ZWQuYXBwZW5kKGZuKQogICAgICAgIHJldHVybiBub3RfcmVtb3ZlZAoKCmNsYXNzIEV2ZW50TWl4aW4ob2JqZWN0KToKICAgICIiIgogICAgQSB2ZXJ5IHNpbXBsZSBwdWJsaXNoL3N1YnNjcmliZSBzeXN0ZW0uCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9zdWJzY3JpYmVycyA9IHt9CgogICAgZGVmIGFkZChzZWxmLCBldmVudCwgc3Vic2NyaWJlciwgYXBwZW5kPVRydWUpOgogICAgICAgICIiIgogICAgICAgIEFkZCBhIHN1YnNjcmliZXIgZm9yIGFuIGV2ZW50LgoKICAgICAgICA6cGFyYW0gZXZlbnQ6IFRoZSBuYW1lIG9mIGFuIGV2ZW50LgogICAgICAgIDpwYXJhbSBzdWJzY3JpYmVyOiBUaGUgc3Vic2NyaWJlciB0byBiZSBhZGRlZCAoYW5kIGNhbGxlZCB3aGVuIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCBpcyBwdWJsaXNoZWQpLgogICAgICAgIDpwYXJhbSBhcHBlbmQ6IFdoZXRoZXIgdG8gYXBwZW5kIG9yIHByZXBlbmQgdGhlIHN1YnNjcmliZXIgdG8gYW4KICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZyBzdWJzY3JpYmVyIGxpc3QgZm9yIHRoZSBldmVudC4KICAgICAgICAiIiIKICAgICAgICBzdWJzID0gc2VsZi5fc3Vic2NyaWJlcnMKICAgICAgICBpZiBldmVudCBub3QgaW4gc3ViczoKICAgICAgICAgICAgc3Vic1tldmVudF0gPSBkZXF1ZShbc3Vic2NyaWJlcl0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3EgPSBzdWJzW2V2ZW50XQogICAgICAgICAgICBpZiBhcHBlbmQ6CiAgICAgICAgICAgICAgICBzcS5hcHBlbmQoc3Vic2NyaWJlcikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNxLmFwcGVuZGxlZnQoc3Vic2NyaWJlcikKCiAgICBkZWYgcmVtb3ZlKHNlbGYsIGV2ZW50LCBzdWJzY3JpYmVyKToKICAgICAgICAiIiIKICAgICAgICBSZW1vdmUgYSBzdWJzY3JpYmVyIGZvciBhbiBldmVudC4KCiAgICAgICAgOnBhcmFtIGV2ZW50OiBUaGUgbmFtZSBvZiBhbiBldmVudC4KICAgICAgICA6cGFyYW0gc3Vic2NyaWJlcjogVGhlIHN1YnNjcmliZXIgdG8gYmUgcmVtb3ZlZC4KICAgICAgICAiIiIKICAgICAgICBzdWJzID0gc2VsZi5fc3Vic2NyaWJlcnMKICAgICAgICBpZiBldmVudCBub3QgaW4gc3ViczoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTm8gc3Vic2NyaWJlcnM6ICVyJyAlIGV2ZW50KQogICAgICAgIHN1YnNbZXZlbnRdLnJlbW92ZShzdWJzY3JpYmVyKQoKICAgIGRlZiBnZXRfc3Vic2NyaWJlcnMoc2VsZiwgZXZlbnQpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhbiBpdGVyYXRvciBmb3IgdGhlIHN1YnNjcmliZXJzIGZvciBhbiBldmVudC4KICAgICAgICA6cGFyYW0gZXZlbnQ6IFRoZSBldmVudCB0byByZXR1cm4gc3Vic2NyaWJlcnMgZm9yLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBpdGVyKHNlbGYuX3N1YnNjcmliZXJzLmdldChldmVudCwgKCkpKQoKICAgIGRlZiBwdWJsaXNoKHNlbGYsIGV2ZW50LCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIFB1Ymxpc2ggYSBldmVudCBhbmQgcmV0dXJuIGEgbGlzdCBvZiB2YWx1ZXMgcmV0dXJuZWQgYnkgaXRzCiAgICAgICAgc3Vic2NyaWJlcnMuCgogICAgICAgIDpwYXJhbSBldmVudDogVGhlIGV2ZW50IHRvIHB1Ymxpc2guCiAgICAgICAgOnBhcmFtIGFyZ3M6IFRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBldmVudCdzCiAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXJzLgogICAgICAgIDpwYXJhbSBrd2FyZ3M6IFRoZSBrZXl3b3JkIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBldmVudCdzCiAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcnMuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICBmb3Igc3Vic2NyaWJlciBpbiBzZWxmLmdldF9zdWJzY3JpYmVycyhldmVudCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHZhbHVlID0gc3Vic2NyaWJlcihldmVudCwgKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbignRXhjZXB0aW9uIGR1cmluZyBldmVudCBwdWJsaWNhdGlvbicpCiAgICAgICAgICAgICAgICB2YWx1ZSA9IE5vbmUKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh2YWx1ZSkKICAgICAgICBsb2dnZXIuZGVidWcoJ3B1Ymxpc2ggJXM6IGFyZ3MgPSAlcywga3dhcmdzID0gJXMsIHJlc3VsdCA9ICVzJywKICAgICAgICAgICAgICAgICAgICAgZXZlbnQsIGFyZ3MsIGt3YXJncywgcmVzdWx0KQogICAgICAgIHJldHVybiByZXN1bHQKCiMKIyBTaW1wbGUgc2VxdWVuY2luZwojCmNsYXNzIFNlcXVlbmNlcihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuX3ByZWRzID0ge30KICAgICAgICBzZWxmLl9zdWNjcyA9IHt9CiAgICAgICAgc2VsZi5fbm9kZXMgPSBzZXQoKSAgICAgIyBub2RlcyB3aXRoIG5vIHByZWRzL3N1Y2NzCgogICAgZGVmIGFkZF9ub2RlKHNlbGYsIG5vZGUpOgogICAgICAgIHNlbGYuX25vZGVzLmFkZChub2RlKQoKICAgIGRlZiByZW1vdmVfbm9kZShzZWxmLCBub2RlLCBlZGdlcz1GYWxzZSk6CiAgICAgICAgaWYgbm9kZSBpbiBzZWxmLl9ub2RlczoKICAgICAgICAgICAgc2VsZi5fbm9kZXMucmVtb3ZlKG5vZGUpCiAgICAgICAgaWYgZWRnZXM6CiAgICAgICAgICAgIGZvciBwIGluIHNldChzZWxmLl9wcmVkcy5nZXQobm9kZSwgKCkpKToKICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlKHAsIG5vZGUpCiAgICAgICAgICAgIGZvciBzIGluIHNldChzZWxmLl9zdWNjcy5nZXQobm9kZSwgKCkpKToKICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlKG5vZGUsIHMpCiAgICAgICAgICAgICMgUmVtb3ZlIGVtcHRpZXMKICAgICAgICAgICAgZm9yIGssIHYgaW4gbGlzdChzZWxmLl9wcmVkcy5pdGVtcygpKToKICAgICAgICAgICAgICAgIGlmIG5vdCB2OgogICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9wcmVkc1trXQogICAgICAgICAgICBmb3IgaywgdiBpbiBsaXN0KHNlbGYuX3N1Y2NzLml0ZW1zKCkpOgogICAgICAgICAgICAgICAgaWYgbm90IHY6CiAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYuX3N1Y2NzW2tdCgogICAgZGVmIGFkZChzZWxmLCBwcmVkLCBzdWNjKToKICAgICAgICBhc3NlcnQgcHJlZCAhPSBzdWNjCiAgICAgICAgc2VsZi5fcHJlZHMuc2V0ZGVmYXVsdChzdWNjLCBzZXQoKSkuYWRkKHByZWQpCiAgICAgICAgc2VsZi5fc3VjY3Muc2V0ZGVmYXVsdChwcmVkLCBzZXQoKSkuYWRkKHN1Y2MpCgogICAgZGVmIHJlbW92ZShzZWxmLCBwcmVkLCBzdWNjKToKICAgICAgICBhc3NlcnQgcHJlZCAhPSBzdWNjCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwcmVkcyA9IHNlbGYuX3ByZWRzW3N1Y2NdCiAgICAgICAgICAgIHN1Y2NzID0gc2VsZi5fc3VjY3NbcHJlZF0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignJXIgbm90IGEgc3VjY2Vzc29yIG9mIGFueXRoaW5nJyAlIHN1Y2MpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwcmVkcy5yZW1vdmUocHJlZCkKICAgICAgICAgICAgc3VjY3MucmVtb3ZlKHN1Y2MpCiAgICAgICAgZXhjZXB0IEtleUVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJyVyIG5vdCBhIHN1Y2Nlc3NvciBvZiAlcicgJSAoc3VjYywgcHJlZCkpCgogICAgZGVmIGlzX3N0ZXAoc2VsZiwgc3RlcCk6CiAgICAgICAgcmV0dXJuIChzdGVwIGluIHNlbGYuX3ByZWRzIG9yIHN0ZXAgaW4gc2VsZi5fc3VjY3Mgb3IKICAgICAgICAgICAgICAgIHN0ZXAgaW4gc2VsZi5fbm9kZXMpCgogICAgZGVmIGdldF9zdGVwcyhzZWxmLCBmaW5hbCk6CiAgICAgICAgaWYgbm90IHNlbGYuaXNfc3RlcChmaW5hbCk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1Vua25vd246ICVyJyAlIGZpbmFsKQogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgdG9kbyA9IFtdCiAgICAgICAgc2VlbiA9IHNldCgpCiAgICAgICAgdG9kby5hcHBlbmQoZmluYWwpCiAgICAgICAgd2hpbGUgdG9kbzoKICAgICAgICAgICAgc3RlcCA9IHRvZG8ucG9wKDApCiAgICAgICAgICAgIGlmIHN0ZXAgaW4gc2VlbjoKICAgICAgICAgICAgICAgICMgaWYgYSBzdGVwIHdhcyBhbHJlYWR5IHNlZW4sCiAgICAgICAgICAgICAgICAjIG1vdmUgaXQgdG8gdGhlIGVuZCAoc28gaXQgd2lsbCBhcHBlYXIgZWFybGllcgogICAgICAgICAgICAgICAgIyB3aGVuIHJldmVyc2VkIG9uIHJldHVybikgLi4uIGJ1dCBub3QgZm9yIHRoZQogICAgICAgICAgICAgICAgIyBmaW5hbCBzdGVwLCBhcyB0aGF0IHdvdWxkIGJlIGNvbmZ1c2luZyBmb3IKICAgICAgICAgICAgICAgICMgdXNlcnMKICAgICAgICAgICAgICAgIGlmIHN0ZXAgIT0gZmluYWw6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlbW92ZShzdGVwKQogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc3RlcCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlZW4uYWRkKHN0ZXApCiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHN0ZXApCiAgICAgICAgICAgICAgICBwcmVkcyA9IHNlbGYuX3ByZWRzLmdldChzdGVwLCAoKSkKICAgICAgICAgICAgICAgIHRvZG8uZXh0ZW5kKHByZWRzKQogICAgICAgIHJldHVybiByZXZlcnNlZChyZXN1bHQpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc3Ryb25nX2Nvbm5lY3Rpb25zKHNlbGYpOgogICAgICAgICNodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RhcmphbiUyN3Nfc3Ryb25nbHlfY29ubmVjdGVkX2NvbXBvbmVudHNfYWxnb3JpdGhtCiAgICAgICAgaW5kZXhfY291bnRlciA9IFswXQogICAgICAgIHN0YWNrID0gW10KICAgICAgICBsb3dsaW5rcyA9IHt9CiAgICAgICAgaW5kZXggPSB7fQogICAgICAgIHJlc3VsdCA9IFtdCgogICAgICAgIGdyYXBoID0gc2VsZi5fc3VjY3MKCiAgICAgICAgZGVmIHN0cm9uZ2Nvbm5lY3Qobm9kZSk6CiAgICAgICAgICAgICMgc2V0IHRoZSBkZXB0aCBpbmRleCBmb3IgdGhpcyBub2RlIHRvIHRoZSBzbWFsbGVzdCB1bnVzZWQgaW5kZXgKICAgICAgICAgICAgaW5kZXhbbm9kZV0gPSBpbmRleF9jb3VudGVyWzBdCiAgICAgICAgICAgIGxvd2xpbmtzW25vZGVdID0gaW5kZXhfY291bnRlclswXQogICAgICAgICAgICBpbmRleF9jb3VudGVyWzBdICs9IDEKICAgICAgICAgICAgc3RhY2suYXBwZW5kKG5vZGUpCgogICAgICAgICAgICAjIENvbnNpZGVyIHN1Y2Nlc3NvcnMKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc3VjY2Vzc29ycyA9IGdyYXBoW25vZGVdCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBzdWNjZXNzb3JzID0gW10KICAgICAgICAgICAgZm9yIHN1Y2Nlc3NvciBpbiBzdWNjZXNzb3JzOgogICAgICAgICAgICAgICAgaWYgc3VjY2Vzc29yIG5vdCBpbiBsb3dsaW5rczoKICAgICAgICAgICAgICAgICAgICAjIFN1Y2Nlc3NvciBoYXMgbm90IHlldCBiZWVuIHZpc2l0ZWQKICAgICAgICAgICAgICAgICAgICBzdHJvbmdjb25uZWN0KHN1Y2Nlc3NvcikKICAgICAgICAgICAgICAgICAgICBsb3dsaW5rc1tub2RlXSA9IG1pbihsb3dsaW5rc1tub2RlXSxsb3dsaW5rc1tzdWNjZXNzb3JdKQogICAgICAgICAgICAgICAgZWxpZiBzdWNjZXNzb3IgaW4gc3RhY2s6CiAgICAgICAgICAgICAgICAgICAgIyB0aGUgc3VjY2Vzc29yIGlzIGluIHRoZSBzdGFjayBhbmQgaGVuY2UgaW4gdGhlIGN1cnJlbnQKICAgICAgICAgICAgICAgICAgICAjIHN0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnQgKFNDQykKICAgICAgICAgICAgICAgICAgICBsb3dsaW5rc1tub2RlXSA9IG1pbihsb3dsaW5rc1tub2RlXSxpbmRleFtzdWNjZXNzb3JdKQoKICAgICAgICAgICAgIyBJZiBgbm9kZWAgaXMgYSByb290IG5vZGUsIHBvcCB0aGUgc3RhY2sgYW5kIGdlbmVyYXRlIGFuIFNDQwogICAgICAgICAgICBpZiBsb3dsaW5rc1tub2RlXSA9PSBpbmRleFtub2RlXToKICAgICAgICAgICAgICAgIGNvbm5lY3RlZF9jb21wb25lbnQgPSBbXQoKICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc29yID0gc3RhY2sucG9wKCkKICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWRfY29tcG9uZW50LmFwcGVuZChzdWNjZXNzb3IpCiAgICAgICAgICAgICAgICAgICAgaWYgc3VjY2Vzc29yID09IG5vZGU6IGJyZWFrCiAgICAgICAgICAgICAgICBjb21wb25lbnQgPSB0dXBsZShjb25uZWN0ZWRfY29tcG9uZW50KQogICAgICAgICAgICAgICAgIyBzdG9yaW5nIHRoZSByZXN1bHQKICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoY29tcG9uZW50KQoKICAgICAgICBmb3Igbm9kZSBpbiBncmFwaDoKICAgICAgICAgICAgaWYgbm9kZSBub3QgaW4gbG93bGlua3M6CiAgICAgICAgICAgICAgICBzdHJvbmdjb25uZWN0KG5vZGUpCgogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkb3Qoc2VsZik6CiAgICAgICAgcmVzdWx0ID0gWydkaWdyYXBoIEcgeyddCiAgICAgICAgZm9yIHN1Y2MgaW4gc2VsZi5fcHJlZHM6CiAgICAgICAgICAgIHByZWRzID0gc2VsZi5fcHJlZHNbc3VjY10KICAgICAgICAgICAgZm9yIHByZWQgaW4gcHJlZHM6CiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgICVzIC0+ICVzOycgJSAocHJlZCwgc3VjYykpCiAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi5fbm9kZXM6CiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJyAgJXM7JyAlIG5vZGUpCiAgICAgICAgcmVzdWx0LmFwcGVuZCgnfScpCiAgICAgICAgcmV0dXJuICdcbicuam9pbihyZXN1bHQpCgojCiMgVW5hcmNoaXZpbmcgZnVuY3Rpb25hbGl0eSBmb3IgemlwLCB0YXIsIHRneiwgdGJ6LCB3aGwKIwoKQVJDSElWRV9FWFRFTlNJT05TID0gKCcudGFyLmd6JywgJy50YXIuYnoyJywgJy50YXInLCAnLnppcCcsCiAgICAgICAgICAgICAgICAgICAgICAnLnRneicsICcudGJ6JywgJy53aGwnKQoKZGVmIHVuYXJjaGl2ZShhcmNoaXZlX2ZpbGVuYW1lLCBkZXN0X2RpciwgZm9ybWF0PU5vbmUsIGNoZWNrPVRydWUpOgoKICAgIGRlZiBjaGVja19wYXRoKHBhdGgpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBhdGgsIHRleHRfdHlwZSk6CiAgICAgICAgICAgIHBhdGggPSBwYXRoLmRlY29kZSgndXRmLTgnKQogICAgICAgIHAgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKGRlc3RfZGlyLCBwYXRoKSkKICAgICAgICBpZiBub3QgcC5zdGFydHN3aXRoKGRlc3RfZGlyKSBvciBwW3BsZW5dICE9IG9zLnNlcDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigncGF0aCBvdXRzaWRlIGRlc3RpbmF0aW9uOiAlcicgJSBwKQoKICAgIGRlc3RfZGlyID0gb3MucGF0aC5hYnNwYXRoKGRlc3RfZGlyKQogICAgcGxlbiA9IGxlbihkZXN0X2RpcikKICAgIGFyY2hpdmUgPSBOb25lCiAgICBpZiBmb3JtYXQgaXMgTm9uZToKICAgICAgICBpZiBhcmNoaXZlX2ZpbGVuYW1lLmVuZHN3aXRoKCgnLnppcCcsICcud2hsJykpOgogICAgICAgICAgICBmb3JtYXQgPSAnemlwJwogICAgICAgIGVsaWYgYXJjaGl2ZV9maWxlbmFtZS5lbmRzd2l0aCgoJy50YXIuZ3onLCAnLnRneicpKToKICAgICAgICAgICAgZm9ybWF0ID0gJ3RneicKICAgICAgICAgICAgbW9kZSA9ICdyOmd6JwogICAgICAgIGVsaWYgYXJjaGl2ZV9maWxlbmFtZS5lbmRzd2l0aCgoJy50YXIuYnoyJywgJy50YnonKSk6CiAgICAgICAgICAgIGZvcm1hdCA9ICd0YnonCiAgICAgICAgICAgIG1vZGUgPSAncjpiejInCiAgICAgICAgZWxpZiBhcmNoaXZlX2ZpbGVuYW1lLmVuZHN3aXRoKCcudGFyJyk6CiAgICAgICAgICAgIGZvcm1hdCA9ICd0YXInCiAgICAgICAgICAgIG1vZGUgPSAncicKICAgICAgICBlbHNlOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1Vua25vd24gZm9ybWF0IGZvciAlcicgJSBhcmNoaXZlX2ZpbGVuYW1lKQogICAgdHJ5OgogICAgICAgIGlmIGZvcm1hdCA9PSAnemlwJzoKICAgICAgICAgICAgYXJjaGl2ZSA9IFppcEZpbGUoYXJjaGl2ZV9maWxlbmFtZSwgJ3InKQogICAgICAgICAgICBpZiBjaGVjazoKICAgICAgICAgICAgICAgIG5hbWVzID0gYXJjaGl2ZS5uYW1lbGlzdCgpCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKICAgICAgICAgICAgICAgICAgICBjaGVja19wYXRoKG5hbWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXJjaGl2ZSA9IHRhcmZpbGUub3BlbihhcmNoaXZlX2ZpbGVuYW1lLCBtb2RlKQogICAgICAgICAgICBpZiBjaGVjazoKICAgICAgICAgICAgICAgIG5hbWVzID0gYXJjaGl2ZS5nZXRuYW1lcygpCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKICAgICAgICAgICAgICAgICAgICBjaGVja19wYXRoKG5hbWUpCiAgICAgICAgaWYgZm9ybWF0ICE9ICd6aXAnIGFuZCBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKICAgICAgICAgICAgIyBTZWUgUHl0aG9uIGlzc3VlIDE3MTUzLiBJZiB0aGUgZGVzdCBwYXRoIGNvbnRhaW5zIFVuaWNvZGUsCiAgICAgICAgICAgICMgdGFyZmlsZSBleHRyYWN0aW9uIGZhaWxzIG9uIFB5dGhvbiAyLnggaWYgYSBtZW1iZXIgcGF0aCBuYW1lCiAgICAgICAgICAgICMgY29udGFpbnMgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgLSBpdCBsZWFkcyB0byBhbiBpbXBsaWNpdAogICAgICAgICAgICAjIGJ5dGVzIC0+IHVuaWNvZGUgY29udmVyc2lvbiB1c2luZyBBU0NJSSB0byBkZWNvZGUuCiAgICAgICAgICAgIGZvciB0YXJpbmZvIGluIGFyY2hpdmUuZ2V0bWVtYmVycygpOgogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodGFyaW5mby5uYW1lLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICAgICAgICAgIHRhcmluZm8ubmFtZSA9IHRhcmluZm8ubmFtZS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBhcmNoaXZlLmV4dHJhY3RhbGwoZGVzdF9kaXIpCgogICAgZmluYWxseToKICAgICAgICBpZiBhcmNoaXZlOgogICAgICAgICAgICBhcmNoaXZlLmNsb3NlKCkKCgpkZWYgemlwX2RpcihkaXJlY3RvcnkpOgogICAgIiIiemlwIGEgZGlyZWN0b3J5IHRyZWUgaW50byBhIEJ5dGVzSU8gb2JqZWN0IiIiCiAgICByZXN1bHQgPSBpby5CeXRlc0lPKCkKICAgIGRsZW4gPSBsZW4oZGlyZWN0b3J5KQogICAgd2l0aCBaaXBGaWxlKHJlc3VsdCwgInciKSBhcyB6ZjoKICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhkaXJlY3RvcnkpOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKICAgICAgICAgICAgICAgIGZ1bGwgPSBvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkKICAgICAgICAgICAgICAgIHJlbCA9IHJvb3RbZGxlbjpdCiAgICAgICAgICAgICAgICBkZXN0ID0gb3MucGF0aC5qb2luKHJlbCwgbmFtZSkKICAgICAgICAgICAgICAgIHpmLndyaXRlKGZ1bGwsIGRlc3QpCiAgICByZXR1cm4gcmVzdWx0CgojCiMgU2ltcGxlIHByb2dyZXNzIGJhcgojCgpVTklUUyA9ICgnJywgJ0snLCAnTScsICdHJywnVCcsJ1AnKQoKCmNsYXNzIFByb2dyZXNzKG9iamVjdCk6CiAgICB1bmtub3duID0gJ1VOS05PV04nCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1pbnZhbD0wLCBtYXh2YWw9MTAwKToKICAgICAgICBhc3NlcnQgbWF4dmFsIGlzIE5vbmUgb3IgbWF4dmFsID49IG1pbnZhbAogICAgICAgIHNlbGYubWluID0gc2VsZi5jdXIgPSBtaW52YWwKICAgICAgICBzZWxmLm1heCA9IG1heHZhbAogICAgICAgIHNlbGYuc3RhcnRlZCA9IE5vbmUKICAgICAgICBzZWxmLmVsYXBzZWQgPSAwCiAgICAgICAgc2VsZi5kb25lID0gRmFsc2UKCiAgICBkZWYgdXBkYXRlKHNlbGYsIGN1cnZhbCk6CiAgICAgICAgYXNzZXJ0IHNlbGYubWluIDw9IGN1cnZhbAogICAgICAgIGFzc2VydCBzZWxmLm1heCBpcyBOb25lIG9yIGN1cnZhbCA8PSBzZWxmLm1heAogICAgICAgIHNlbGYuY3VyID0gY3VydmFsCiAgICAgICAgbm93ID0gdGltZS50aW1lKCkKICAgICAgICBpZiBzZWxmLnN0YXJ0ZWQgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zdGFydGVkID0gbm93CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5lbGFwc2VkID0gbm93IC0gc2VsZi5zdGFydGVkCgogICAgZGVmIGluY3JlbWVudChzZWxmLCBpbmNyKToKICAgICAgICBhc3NlcnQgaW5jciA+PSAwCiAgICAgICAgc2VsZi51cGRhdGUoc2VsZi5jdXIgKyBpbmNyKQoKICAgIGRlZiBzdGFydChzZWxmKToKICAgICAgICBzZWxmLnVwZGF0ZShzZWxmLm1pbikKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzdG9wKHNlbGYpOgogICAgICAgIGlmIHNlbGYubWF4IGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnVwZGF0ZShzZWxmLm1heCkKICAgICAgICBzZWxmLmRvbmUgPSBUcnVlCgogICAgQHByb3BlcnR5CiAgICBkZWYgbWF4aW11bShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi51bmtub3duIGlmIHNlbGYubWF4IGlzIE5vbmUgZWxzZSBzZWxmLm1heAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBlcmNlbnRhZ2Uoc2VsZik6CiAgICAgICAgaWYgc2VsZi5kb25lOgogICAgICAgICAgICByZXN1bHQgPSAnMTAwICUnCiAgICAgICAgZWxpZiBzZWxmLm1heCBpcyBOb25lOgogICAgICAgICAgICByZXN1bHQgPSAnID8/ICUnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdiA9IDEwMC4wICogKHNlbGYuY3VyIC0gc2VsZi5taW4pIC8gKHNlbGYubWF4IC0gc2VsZi5taW4pCiAgICAgICAgICAgIHJlc3VsdCA9ICclM2QgJSUnICUgdgogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZm9ybWF0X2R1cmF0aW9uKHNlbGYsIGR1cmF0aW9uKToKICAgICAgICBpZiAoZHVyYXRpb24gPD0gMCkgYW5kIHNlbGYubWF4IGlzIE5vbmUgb3Igc2VsZi5jdXIgPT0gc2VsZi5taW46CiAgICAgICAgICAgIHJlc3VsdCA9ICc/Pzo/Pzo/PycKICAgICAgICAjZWxpZiBkdXJhdGlvbiA8IDE6CiAgICAgICAgIyAgICByZXN1bHQgPSAnLS06LS06LS0nCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gdGltZS5zdHJmdGltZSgnJUg6JU06JVMnLCB0aW1lLmdtdGltZShkdXJhdGlvbikpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEVUQShzZWxmKToKICAgICAgICBpZiBzZWxmLmRvbmU6CiAgICAgICAgICAgIHByZWZpeCA9ICdEb25lJwogICAgICAgICAgICB0ID0gc2VsZi5lbGFwc2VkCiAgICAgICAgICAgICNpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmVmaXggPSAnRVRBICcKICAgICAgICAgICAgaWYgc2VsZi5tYXggaXMgTm9uZToKICAgICAgICAgICAgICAgIHQgPSAtMQogICAgICAgICAgICBlbGlmIHNlbGYuZWxhcHNlZCA9PSAwIG9yIChzZWxmLmN1ciA9PSBzZWxmLm1pbik6CiAgICAgICAgICAgICAgICB0ID0gMAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgI2ltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQogICAgICAgICAgICAgICAgdCA9IGZsb2F0KHNlbGYubWF4IC0gc2VsZi5taW4pCiAgICAgICAgICAgICAgICB0IC89IHNlbGYuY3VyIC0gc2VsZi5taW4KICAgICAgICAgICAgICAgIHQgPSAodCAtIDEpICogc2VsZi5lbGFwc2VkCiAgICAgICAgcmV0dXJuICclczogJXMnICUgKHByZWZpeCwgc2VsZi5mb3JtYXRfZHVyYXRpb24odCkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc3BlZWQoc2VsZik6CiAgICAgICAgaWYgc2VsZi5lbGFwc2VkID09IDA6CiAgICAgICAgICAgIHJlc3VsdCA9IDAuMAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IChzZWxmLmN1ciAtIHNlbGYubWluKSAvIHNlbGYuZWxhcHNlZAogICAgICAgIGZvciB1bml0IGluIFVOSVRTOgogICAgICAgICAgICBpZiByZXN1bHQgPCAxMDAwOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgcmVzdWx0IC89IDEwMDAuMAogICAgICAgIHJldHVybiAnJWQgJXNCL3MnICUgKHJlc3VsdCwgdW5pdCkKCiMKIyBHbG9iIGZ1bmN0aW9uYWxpdHkKIwoKUklDSF9HTE9CID0gcmUuY29tcGlsZShyJ1x7KFtefV0qKVx9JykKX0NIRUNLX1JFQ1VSU0lWRV9HTE9CID0gcmUuY29tcGlsZShyJ1teL1xcLHtdXCpcKnxcKlwqW14vXFwsfV0nKQpfQ0hFQ0tfTUlTTUFUQ0hfU0VUID0gcmUuY29tcGlsZShyJ15bXntdKlx9fFx7W159XSokJykKCgpkZWYgaWdsb2IocGF0aF9nbG9iKToKICAgICIiIkV4dGVuZGVkIGdsb2JiaW5nIGZ1bmN0aW9uIHRoYXQgc3VwcG9ydHMgKiogYW5kIHtvcHQxLG9wdDIsb3B0M30uIiIiCiAgICBpZiBfQ0hFQ0tfUkVDVVJTSVZFX0dMT0Iuc2VhcmNoKHBhdGhfZ2xvYik6CiAgICAgICAgbXNnID0gIiIiaW52YWxpZCBnbG9iICVyOiByZWN1cnNpdmUgZ2xvYiAiKioiIG11c3QgYmUgdXNlZCBhbG9uZSIiIgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnICUgcGF0aF9nbG9iKQogICAgaWYgX0NIRUNLX01JU01BVENIX1NFVC5zZWFyY2gocGF0aF9nbG9iKToKICAgICAgICBtc2cgPSAiIiJpbnZhbGlkIGdsb2IgJXI6IG1pc21hdGNoaW5nIHNldCBtYXJrZXIgJ3snIG9yICd9JyIiIgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnICUgcGF0aF9nbG9iKQogICAgcmV0dXJuIF9pZ2xvYihwYXRoX2dsb2IpCgoKZGVmIF9pZ2xvYihwYXRoX2dsb2IpOgogICAgcmljaF9wYXRoX2dsb2IgPSBSSUNIX0dMT0Iuc3BsaXQocGF0aF9nbG9iLCAxKQogICAgaWYgbGVuKHJpY2hfcGF0aF9nbG9iKSA+IDE6CiAgICAgICAgYXNzZXJ0IGxlbihyaWNoX3BhdGhfZ2xvYikgPT0gMywgcmljaF9wYXRoX2dsb2IKICAgICAgICBwcmVmaXgsIHNldCwgc3VmZml4ID0gcmljaF9wYXRoX2dsb2IKICAgICAgICBmb3IgaXRlbSBpbiBzZXQuc3BsaXQoJywnKToKICAgICAgICAgICAgZm9yIHBhdGggaW4gX2lnbG9iKCcnLmpvaW4oKHByZWZpeCwgaXRlbSwgc3VmZml4KSkpOgogICAgICAgICAgICAgICAgeWllbGQgcGF0aAogICAgZWxzZToKICAgICAgICBpZiAnKionIG5vdCBpbiBwYXRoX2dsb2I6CiAgICAgICAgICAgIGZvciBpdGVtIGluIHN0ZF9pZ2xvYihwYXRoX2dsb2IpOgogICAgICAgICAgICAgICAgeWllbGQgaXRlbQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByZWZpeCwgcmFkaWNhbCA9IHBhdGhfZ2xvYi5zcGxpdCgnKionLCAxKQogICAgICAgICAgICBpZiBwcmVmaXggPT0gJyc6CiAgICAgICAgICAgICAgICBwcmVmaXggPSAnLicKICAgICAgICAgICAgaWYgcmFkaWNhbCA9PSAnJzoKICAgICAgICAgICAgICAgIHJhZGljYWwgPSAnKicKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgd2Ugc3VwcG9ydCBib3RoCiAgICAgICAgICAgICAgICByYWRpY2FsID0gcmFkaWNhbC5sc3RyaXAoJy8nKQogICAgICAgICAgICAgICAgcmFkaWNhbCA9IHJhZGljYWwubHN0cmlwKCdcXCcpCiAgICAgICAgICAgIGZvciBwYXRoLCBkaXIsIGZpbGVzIGluIG9zLndhbGsocHJlZml4KToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKHBhdGgpCiAgICAgICAgICAgICAgICBmb3IgZm4gaW4gX2lnbG9iKG9zLnBhdGguam9pbihwYXRoLCByYWRpY2FsKSk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgZm4KCmlmIHNzbDoKICAgIGZyb20gLmNvbXBhdCBpbXBvcnQgKEhUVFBTSGFuZGxlciBhcyBCYXNlSFRUUFNIYW5kbGVyLCBtYXRjaF9ob3N0bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlRXJyb3IpCgoKIwojIEhUVFBTQ29ubmVjdGlvbiB3aGljaCB2ZXJpZmllcyBjZXJ0aWZpY2F0ZXMvbWF0Y2hlcyBkb21haW5zCiMKCiAgICBjbGFzcyBIVFRQU0Nvbm5lY3Rpb24oaHR0cGxpYi5IVFRQU0Nvbm5lY3Rpb24pOgogICAgICAgIGNhX2NlcnRzID0gTm9uZSAjIHNldCB0aGlzIHRvIHRoZSBwYXRoIHRvIHRoZSBjZXJ0cyBmaWxlICgucGVtKQogICAgICAgIGNoZWNrX2RvbWFpbiA9IFRydWUgIyBvbmx5IHVzZWQgaWYgY2FfY2VydHMgaXMgbm90IE5vbmUKCiAgICAgICAgIyBub2luc3BlY3Rpb24gUHlQcm9wZXJ0eUFjY2VzcwogICAgICAgIGRlZiBjb25uZWN0KHNlbGYpOgogICAgICAgICAgICBzb2NrID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChzZWxmLmhvc3QsIHNlbGYucG9ydCksIHNlbGYudGltZW91dCkKICAgICAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCAnX3R1bm5lbF9ob3N0JywgRmFsc2UpOgogICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gc29jawogICAgICAgICAgICAgICAgc2VsZi5fdHVubmVsKCkKCiAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNzbCwgJ1NTTENvbnRleHQnKToKICAgICAgICAgICAgICAgICMgRm9yIDIueAogICAgICAgICAgICAgICAgaWYgc2VsZi5jYV9jZXJ0czoKICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXMgPSBzc2wuQ0VSVF9SRVFVSVJFRAogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXMgPSBzc2wuQ0VSVF9OT05FCiAgICAgICAgICAgICAgICBzZWxmLnNvY2sgPSBzc2wud3JhcF9zb2NrZXQoc29jaywgc2VsZi5rZXlfZmlsZSwgc2VsZi5jZXJ0X2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPWNlcnRfcmVxcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfU1NMdjIzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPXNlbGYuY2FfY2VydHMpCiAgICAgICAgICAgIGVsc2U6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgIGNvbnRleHQgPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQogICAgICAgICAgICAgICAgY29udGV4dC5vcHRpb25zIHw9IHNzbC5PUF9OT19TU0x2MgogICAgICAgICAgICAgICAgaWYgc2VsZi5jZXJ0X2ZpbGU6CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5sb2FkX2NlcnRfY2hhaW4oc2VsZi5jZXJ0X2ZpbGUsIHNlbGYua2V5X2ZpbGUpCiAgICAgICAgICAgICAgICBrd2FyZ3MgPSB7fQogICAgICAgICAgICAgICAgaWYgc2VsZi5jYV9jZXJ0czoKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYWZpbGU9c2VsZi5jYV9jZXJ0cykKICAgICAgICAgICAgICAgICAgICBpZiBnZXRhdHRyKHNzbCwgJ0hBU19TTkknLCBGYWxzZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGt3YXJnc1snc2VydmVyX2hvc3RuYW1lJ10gPSBzZWxmLmhvc3QKICAgICAgICAgICAgICAgIHNlbGYuc29jayA9IGNvbnRleHQud3JhcF9zb2NrZXQoc29jaywgKiprd2FyZ3MpCiAgICAgICAgICAgIGlmIHNlbGYuY2FfY2VydHMgYW5kIHNlbGYuY2hlY2tfZG9tYWluOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIG1hdGNoX2hvc3RuYW1lKHNlbGYuc29jay5nZXRwZWVyY2VydCgpLCBzZWxmLmhvc3QpCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdIb3N0IHZlcmlmaWVkOiAlcycsIHNlbGYuaG9zdCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBDZXJ0aWZpY2F0ZUVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2NrLnNodXRkb3duKHNvY2tldC5TSFVUX1JEV1IpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkKICAgICAgICAgICAgICAgICAgICByYWlzZQoKICAgIGNsYXNzIEhUVFBTSGFuZGxlcihCYXNlSFRUUFNIYW5kbGVyKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgY2FfY2VydHMsIGNoZWNrX2RvbWFpbj1UcnVlKToKICAgICAgICAgICAgQmFzZUhUVFBTSGFuZGxlci5fX2luaXRfXyhzZWxmKQogICAgICAgICAgICBzZWxmLmNhX2NlcnRzID0gY2FfY2VydHMKICAgICAgICAgICAgc2VsZi5jaGVja19kb21haW4gPSBjaGVja19kb21haW4KCiAgICAgICAgZGVmIF9jb25uX21ha2VyKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgICIiIgogICAgICAgICAgICBUaGlzIGlzIGNhbGxlZCB0byBjcmVhdGUgYSBjb25uZWN0aW9uIGluc3RhbmNlLiBOb3JtYWxseSB5b3UnZAogICAgICAgICAgICBwYXNzIGEgY29ubmVjdGlvbiBjbGFzcyB0byBkb19vcGVuLCBidXQgaXQgZG9lc24ndCBhY3R1YWxseSBjaGVjayBmb3IKICAgICAgICAgICAgYSBjbGFzcywgYW5kIGp1c3QgZXhwZWN0cyBhIGNhbGxhYmxlLiBBcyBsb25nIGFzIHdlIGJlaGF2ZSBqdXN0IGFzIGEKICAgICAgICAgICAgY29uc3RydWN0b3Igd291bGQgaGF2ZSwgd2Ugc2hvdWxkIGJlIE9LLiBJZiBpdCBldmVyIGNoYW5nZXMgc28gdGhhdAogICAgICAgICAgICB3ZSAqbXVzdCogcGFzcyBhIGNsYXNzLCB3ZSdsbCBjcmVhdGUgYW4gVW5zYWZlSFRUUFNDb25uZWN0aW9uIGNsYXNzCiAgICAgICAgICAgIHdoaWNoIGp1c3Qgc2V0cyBjaGVja19kb21haW4gdG8gRmFsc2UgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24sIGFuZAogICAgICAgICAgICBjaG9vc2Ugd2hpY2ggb25lIHRvIHBhc3MgdG8gZG9fb3Blbi4KICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIHJlc3VsdCA9IEhUVFBTQ29ubmVjdGlvbigqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIGlmIHNlbGYuY2FfY2VydHM6CiAgICAgICAgICAgICAgICByZXN1bHQuY2FfY2VydHMgPSBzZWxmLmNhX2NlcnRzCiAgICAgICAgICAgICAgICByZXN1bHQuY2hlY2tfZG9tYWluID0gc2VsZi5jaGVja19kb21haW4KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICAgICBkZWYgaHR0cHNfb3BlbihzZWxmLCByZXEpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kb19vcGVuKHNlbGYuX2Nvbm5fbWFrZXIsIHJlcSkKICAgICAgICAgICAgZXhjZXB0IFVSTEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICBpZiAnY2VydGlmaWNhdGUgdmVyaWZ5IGZhaWxlZCcgaW4gc3RyKGUucmVhc29uKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKCdVbmFibGUgdG8gdmVyaWZ5IHNlcnZlciBjZXJ0aWZpY2F0ZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yICVzJyAlIHJlcS5ob3N0KQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByYWlzZQoKICAgICMKICAgICMgVG8gcHJldmVudCBhZ2FpbnN0IG1peGluZyBIVFRQIHRyYWZmaWMgd2l0aCBIVFRQUyAoZXhhbXBsZXM6IEEgTWFuLUluLVRoZS0KICAgICMgTWlkZGxlIHByb3h5IHVzaW5nIEhUVFAgbGlzdGVucyBvbiBwb3J0IDQ0Mywgb3IgYW4gaW5kZXggbWlzdGFrZW5seSBzZXJ2ZXMKICAgICMgSFRNTCBjb250YWluaW5nIGEgaHR0cDovL3h5eiBsaW5rIHdoZW4gaXQgc2hvdWxkIGJlIGh0dHBzOi8veHl6KSwKICAgICMgeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBoYW5kbGVyIGNsYXNzLCB3aGljaCBkb2VzIG5vdCBhbGxvdyBIVFRQIHRyYWZmaWMuCiAgICAjCiAgICAjIEl0IHdvcmtzIGJ5IGluaGVyaXRpbmcgZnJvbSBIVFRQSGFuZGxlciAtIHNvIGJ1aWxkX29wZW5lciB3b24ndCBhZGQgYQogICAgIyBoYW5kbGVyIGZvciBIVFRQIGl0c2VsZi4KICAgICMKICAgIGNsYXNzIEhUVFBTT25seUhhbmRsZXIoSFRUUFNIYW5kbGVyLCBIVFRQSGFuZGxlcik6CiAgICAgICAgZGVmIGh0dHBfb3BlbihzZWxmLCByZXEpOgogICAgICAgICAgICByYWlzZSBVUkxFcnJvcignVW5leHBlY3RlZCBIVFRQIHJlcXVlc3Qgb24gd2hhdCBzaG91bGQgYmUgYSBzZWN1cmUgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAnY29ubmVjdGlvbjogJXMnICUgcmVxKQoKIwojIFhNTC1SUEMgd2l0aCB0aW1lb3V0cwojCgpfdmVyX2luZm8gPSBzeXMudmVyc2lvbl9pbmZvWzoyXQoKaWYgX3Zlcl9pbmZvID09ICgyLCA2KToKICAgIGNsYXNzIEhUVFAoaHR0cGxpYi5IVFRQKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nJywgcG9ydD1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgICAgIGlmIHBvcnQgPT0gMDogICAjIDAgbWVhbnMgdXNlIHBvcnQgMCwgbm90IHRoZSBkZWZhdWx0IHBvcnQKICAgICAgICAgICAgICAgIHBvcnQgPSBOb25lCiAgICAgICAgICAgIHNlbGYuX3NldHVwKHNlbGYuX2Nvbm5lY3Rpb25fY2xhc3MoaG9zdCwgcG9ydCwgKiprd2FyZ3MpKQoKCiAgICBpZiBzc2w6CiAgICAgICAgY2xhc3MgSFRUUFMoaHR0cGxpYi5IVFRQUyk6CiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PScnLCBwb3J0PU5vbmUsICoqa3dhcmdzKToKICAgICAgICAgICAgICAgIGlmIHBvcnQgPT0gMDogICAjIDAgbWVhbnMgdXNlIHBvcnQgMCwgbm90IHRoZSBkZWZhdWx0IHBvcnQKICAgICAgICAgICAgICAgICAgICBwb3J0ID0gTm9uZQogICAgICAgICAgICAgICAgc2VsZi5fc2V0dXAoc2VsZi5fY29ubmVjdGlvbl9jbGFzcyhob3N0LCBwb3J0LCAqKmt3YXJncykpCgoKY2xhc3MgVHJhbnNwb3J0KHhtbHJwY2xpYi5UcmFuc3BvcnQpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRpbWVvdXQsIHVzZV9kYXRldGltZT0wKToKICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CiAgICAgICAgeG1scnBjbGliLlRyYW5zcG9ydC5fX2luaXRfXyhzZWxmLCB1c2VfZGF0ZXRpbWUpCgogICAgZGVmIG1ha2VfY29ubmVjdGlvbihzZWxmLCBob3N0KToKICAgICAgICBoLCBlaCwgeDUwOSA9IHNlbGYuZ2V0X2hvc3RfaW5mbyhob3N0KQogICAgICAgIGlmIF92ZXJfaW5mbyA9PSAoMiwgNik6CiAgICAgICAgICAgIHJlc3VsdCA9IEhUVFAoaCwgdGltZW91dD1zZWxmLnRpbWVvdXQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgbm90IHNlbGYuX2Nvbm5lY3Rpb24gb3IgaG9zdCAhPSBzZWxmLl9jb25uZWN0aW9uWzBdOgogICAgICAgICAgICAgICAgc2VsZi5fZXh0cmFfaGVhZGVycyA9IGVoCiAgICAgICAgICAgICAgICBzZWxmLl9jb25uZWN0aW9uID0gaG9zdCwgaHR0cGxpYi5IVFRQQ29ubmVjdGlvbihoKQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9jb25uZWN0aW9uWzFdCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKaWYgc3NsOgogICAgY2xhc3MgU2FmZVRyYW5zcG9ydCh4bWxycGNsaWIuU2FmZVRyYW5zcG9ydCk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRpbWVvdXQsIHVzZV9kYXRldGltZT0wKToKICAgICAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAogICAgICAgICAgICB4bWxycGNsaWIuU2FmZVRyYW5zcG9ydC5fX2luaXRfXyhzZWxmLCB1c2VfZGF0ZXRpbWUpCgogICAgICAgIGRlZiBtYWtlX2Nvbm5lY3Rpb24oc2VsZiwgaG9zdCk6CiAgICAgICAgICAgIGgsIGVoLCBrd2FyZ3MgPSBzZWxmLmdldF9ob3N0X2luZm8oaG9zdCkKICAgICAgICAgICAgaWYgbm90IGt3YXJnczoKICAgICAgICAgICAgICAgIGt3YXJncyA9IHt9CiAgICAgICAgICAgIGt3YXJnc1sndGltZW91dCddID0gc2VsZi50aW1lb3V0CiAgICAgICAgICAgIGlmIF92ZXJfaW5mbyA9PSAoMiwgNik6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBIVFRQUyhob3N0LCBOb25lLCAqKmt3YXJncykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9jb25uZWN0aW9uIG9yIGhvc3QgIT0gc2VsZi5fY29ubmVjdGlvblswXToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9leHRyYV9oZWFkZXJzID0gZWgKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb25uZWN0aW9uID0gaG9zdCwgaHR0cGxpYi5IVFRQU0Nvbm5lY3Rpb24oaCwgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiprd2FyZ3MpCiAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9jb25uZWN0aW9uWzFdCiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBTZXJ2ZXJQcm94eSh4bWxycGNsaWIuU2VydmVyUHJveHkpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVyaSwgKiprd2FyZ3MpOgogICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQgPSBrd2FyZ3MucG9wKCd0aW1lb3V0JywgTm9uZSkKICAgICAgICAjIFRoZSBhYm92ZSBjbGFzc2VzIG9ubHkgY29tZSBpbnRvIHBsYXkgaWYgYSB0aW1lb3V0CiAgICAgICAgIyBpcyBzcGVjaWZpZWQKICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgogICAgICAgICAgICBzY2hlbWUsIF8gPSBzcGxpdHR5cGUodXJpKQogICAgICAgICAgICB1c2VfZGF0ZXRpbWUgPSBrd2FyZ3MuZ2V0KCd1c2VfZGF0ZXRpbWUnLCAwKQogICAgICAgICAgICBpZiBzY2hlbWUgPT0gJ2h0dHBzJzoKICAgICAgICAgICAgICAgIHRjbHMgPSBTYWZlVHJhbnNwb3J0CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB0Y2xzID0gVHJhbnNwb3J0CiAgICAgICAgICAgIGt3YXJnc1sndHJhbnNwb3J0J10gPSB0ID0gdGNscyh0aW1lb3V0LCB1c2VfZGF0ZXRpbWU9dXNlX2RhdGV0aW1lKQogICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IHQKICAgICAgICB4bWxycGNsaWIuU2VydmVyUHJveHkuX19pbml0X18oc2VsZiwgdXJpLCAqKmt3YXJncykKCiMKIyBDU1YgZnVuY3Rpb25hbGl0eS4gVGhpcyBpcyBwcm92aWRlZCBiZWNhdXNlIG9uIDIueCwgdGhlIGNzdiBtb2R1bGUgY2FuJ3QKIyBoYW5kbGUgVW5pY29kZS4gSG93ZXZlciwgd2UgbmVlZCB0byBkZWFsIHdpdGggVW5pY29kZSBpbiBlLmcuIFJFQ09SRCBmaWxlcy4KIwoKZGVmIF9jc3Zfb3BlbihmbiwgbW9kZSwgKiprd2FyZ3MpOgogICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CiAgICAgICAgbW9kZSArPSAnYicKICAgIGVsc2U6CiAgICAgICAga3dhcmdzWyduZXdsaW5lJ10gPSAnJwogICAgcmV0dXJuIG9wZW4oZm4sIG1vZGUsICoqa3dhcmdzKQoKCmNsYXNzIENTVkJhc2Uob2JqZWN0KToKICAgIGRlZmF1bHRzID0gewogICAgICAgICdkZWxpbWl0ZXInOiBzdHIoJywnKSwgICAgICAjIFRoZSBzdHJzIGFyZSB1c2VkIGJlY2F1c2Ugd2UgbmVlZCBuYXRpdmUKICAgICAgICAncXVvdGVjaGFyJzogc3RyKCciJyksICAgICAgIyBzdHIgaW4gdGhlIGNzdiBBUEkgKDIueCB3b24ndCB0YWtlCiAgICAgICAgJ2xpbmV0ZXJtaW5hdG9yJzogc3RyKCdcbicpICMgVW5pY29kZSkKICAgIH0KCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsICpleGNfaW5mbyk6CiAgICAgICAgc2VsZi5zdHJlYW0uY2xvc2UoKQoKCmNsYXNzIENTVlJlYWRlcihDU1ZCYXNlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3YXJncyk6CiAgICAgICAgaWYgJ3N0cmVhbScgaW4ga3dhcmdzOgogICAgICAgICAgICBzdHJlYW0gPSBrd2FyZ3NbJ3N0cmVhbSddCiAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMzoKICAgICAgICAgICAgICAgICMgbmVlZHMgdG8gYmUgYSB0ZXh0IHN0cmVhbQogICAgICAgICAgICAgICAgc3RyZWFtID0gY29kZWNzLmdldHJlYWRlcigndXRmLTgnKShzdHJlYW0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gc3RyZWFtCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBfY3N2X29wZW4oa3dhcmdzWydwYXRoJ10sICdyJykKICAgICAgICBzZWxmLnJlYWRlciA9IGNzdi5yZWFkZXIoc2VsZi5zdHJlYW0sICoqc2VsZi5kZWZhdWx0cykKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICByZXN1bHQgPSBuZXh0KHNlbGYucmVhZGVyKQogICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgogICAgICAgICAgICBmb3IgaSwgaXRlbSBpbiBlbnVtZXJhdGUocmVzdWx0KToKICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGl0ZW0sIHRleHRfdHlwZSk6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gaXRlbS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgX19uZXh0X18gPSBuZXh0CgpjbGFzcyBDU1ZXcml0ZXIoQ1NWQmFzZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZm4sICoqa3dhcmdzKToKICAgICAgICBzZWxmLnN0cmVhbSA9IF9jc3Zfb3BlbihmbiwgJ3cnKQogICAgICAgIHNlbGYud3JpdGVyID0gY3N2LndyaXRlcihzZWxmLnN0cmVhbSwgKipzZWxmLmRlZmF1bHRzKQoKICAgIGRlZiB3cml0ZXJvdyhzZWxmLCByb3cpOgogICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgogICAgICAgICAgICByID0gW10KICAgICAgICAgICAgZm9yIGl0ZW0gaW4gcm93OgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBpdGVtLmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgci5hcHBlbmQoaXRlbSkKICAgICAgICAgICAgcm93ID0gcgogICAgICAgIHNlbGYud3JpdGVyLndyaXRlcm93KHJvdykKCiMKIyAgIENvbmZpZ3VyYXRvciBmdW5jdGlvbmFsaXR5CiMKCmNsYXNzIENvbmZpZ3VyYXRvcihCYXNlQ29uZmlndXJhdG9yKToKCiAgICB2YWx1ZV9jb252ZXJ0ZXJzID0gZGljdChCYXNlQ29uZmlndXJhdG9yLnZhbHVlX2NvbnZlcnRlcnMpCiAgICB2YWx1ZV9jb252ZXJ0ZXJzWydpbmMnXSA9ICdpbmNfY29udmVydCcKCiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnLCBiYXNlPU5vbmUpOgogICAgICAgIHN1cGVyKENvbmZpZ3VyYXRvciwgc2VsZikuX19pbml0X18oY29uZmlnKQogICAgICAgIHNlbGYuYmFzZSA9IGJhc2Ugb3Igb3MuZ2V0Y3dkKCkKCiAgICBkZWYgY29uZmlndXJlX2N1c3RvbShzZWxmLCBjb25maWcpOgogICAgICAgIGRlZiBjb252ZXJ0KG8pOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG8sIChsaXN0LCB0dXBsZSkpOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gdHlwZShvKShbY29udmVydChpKSBmb3IgaSBpbiBvXSkKICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG8sIGRpY3QpOgogICAgICAgICAgICAgICAgaWYgJygpJyBpbiBvOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJlX2N1c3RvbShvKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7fQogICAgICAgICAgICAgICAgICAgIGZvciBrIGluIG86CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrXSA9IGNvbnZlcnQob1trXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29udmVydChvKQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgICAgIGMgPSBjb25maWcucG9wKCcoKScpCiAgICAgICAgaWYgbm90IGNhbGxhYmxlKGMpOgogICAgICAgICAgICBjID0gc2VsZi5yZXNvbHZlKGMpCiAgICAgICAgcHJvcHMgPSBjb25maWcucG9wKCcuJywgTm9uZSkKICAgICAgICAjIENoZWNrIGZvciB2YWxpZCBpZGVudGlmaWVycwogICAgICAgIGFyZ3MgPSBjb25maWcucG9wKCdbXScsICgpKQogICAgICAgIGlmIGFyZ3M6CiAgICAgICAgICAgIGFyZ3MgPSB0dXBsZShbY29udmVydChvKSBmb3IgbyBpbiBhcmdzXSkKICAgICAgICBpdGVtcyA9IFsoaywgY29udmVydChjb25maWdba10pKSBmb3IgayBpbiBjb25maWcgaWYgdmFsaWRfaWRlbnQoayldCiAgICAgICAga3dhcmdzID0gZGljdChpdGVtcykKICAgICAgICByZXN1bHQgPSBjKCphcmdzLCAqKmt3YXJncykKICAgICAgICBpZiBwcm9wczoKICAgICAgICAgICAgZm9yIG4sIHYgaW4gcHJvcHMuaXRlbXMoKToKICAgICAgICAgICAgICAgIHNldGF0dHIocmVzdWx0LCBuLCBjb252ZXJ0KHYpKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ1trZXldCiAgICAgICAgaWYgaXNpbnN0YW5jZShyZXN1bHQsIGRpY3QpIGFuZCAnKCknIGluIHJlc3VsdDoKICAgICAgICAgICAgc2VsZi5jb25maWdba2V5XSA9IHJlc3VsdCA9IHNlbGYuY29uZmlndXJlX2N1c3RvbShyZXN1bHQpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBpbmNfY29udmVydChzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiRGVmYXVsdCBjb252ZXJ0ZXIgZm9yIHRoZSBpbmM6Ly8gcHJvdG9jb2wuIiIiCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNhYnModmFsdWUpOgogICAgICAgICAgICB2YWx1ZSA9IG9zLnBhdGguam9pbihzZWxmLmJhc2UsIHZhbHVlKQogICAgICAgIHdpdGggY29kZWNzLm9wZW4odmFsdWUsICdyJywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKICAgICAgICAgICAgcmVzdWx0ID0ganNvbi5sb2FkKGYpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKIwojIE1peGluIGZvciBydW5uaW5nIHN1YnByb2Nlc3NlcyBhbmQgY2FwdHVyaW5nIHRoZWlyIG91dHB1dAojCgpjbGFzcyBTdWJwcm9jZXNzTWl4aW4ob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJib3NlPUZhbHNlLCBwcm9ncmVzcz1Ob25lKToKICAgICAgICBzZWxmLnZlcmJvc2UgPSB2ZXJib3NlCiAgICAgICAgc2VsZi5wcm9ncmVzcyA9IHByb2dyZXNzCgogICAgZGVmIHJlYWRlcihzZWxmLCBzdHJlYW0sIGNvbnRleHQpOgogICAgICAgICIiIgogICAgICAgIFJlYWQgbGluZXMgZnJvbSBhIHN1YnByb2Nlc3MnIG91dHB1dCBzdHJlYW0gYW5kIGVpdGhlciBwYXNzIHRvIGEgcHJvZ3Jlc3MKICAgICAgICBjYWxsYWJsZSAoaWYgc3BlY2lmaWVkKSBvciB3cml0ZSBwcm9ncmVzcyBpbmZvcm1hdGlvbiB0byBzeXMuc3RkZXJyLgogICAgICAgICIiIgogICAgICAgIHByb2dyZXNzID0gc2VsZi5wcm9ncmVzcwogICAgICAgIHZlcmJvc2UgPSBzZWxmLnZlcmJvc2UKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBzID0gc3RyZWFtLnJlYWRsaW5lKCkKICAgICAgICAgICAgaWYgbm90IHM6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBwcm9ncmVzcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHByb2dyZXNzKHMsIGNvbnRleHQpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBub3QgdmVyYm9zZToKICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCcuJykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShzLmRlY29kZSgndXRmLTgnKSkKICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQogICAgICAgIHN0cmVhbS5jbG9zZSgpCgogICAgZGVmIHJ1bl9jb21tYW5kKHNlbGYsIGNtZCwgKiprd2FyZ3MpOgogICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLCAqKmt3YXJncykKICAgICAgICB0MSA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYucmVhZGVyLCBhcmdzPShwLnN0ZG91dCwgJ3N0ZG91dCcpKQogICAgICAgIHQxLnN0YXJ0KCkKICAgICAgICB0MiA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYucmVhZGVyLCBhcmdzPShwLnN0ZGVyciwgJ3N0ZGVycicpKQogICAgICAgIHQyLnN0YXJ0KCkKICAgICAgICBwLndhaXQoKQogICAgICAgIHQxLmpvaW4oKQogICAgICAgIHQyLmpvaW4oKQogICAgICAgIGlmIHNlbGYucHJvZ3Jlc3MgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYucHJvZ3Jlc3MoJ2RvbmUuJywgJ21haW4nKQogICAgICAgIGVsaWYgc2VsZi52ZXJib3NlOgogICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdkb25lLlxuJykKICAgICAgICByZXR1cm4gcAoKCmRlZiBub3JtYWxpemVfbmFtZShuYW1lKToKICAgICIiIk5vcm1hbGl6ZSBhIHB5dGhvbiBwYWNrYWdlIG5hbWUgYSBsYSBQRVAgNTAzIiIiCiAgICAjIGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA1MDMvI25vcm1hbGl6ZWQtbmFtZXMKICAgIHJldHVybiByZS5zdWIoJ1stXy5dKycsICctJywgbmFtZSkubG93ZXIoKQpQSwMEFAAAAAAAAAAhAKD9BVafXAAAn1wAAC4AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi92ZXJzaW9uLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMi0yMDE2IFRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKIiIiCkltcGxlbWVudGF0aW9uIG9mIGEgZmxleGlibGUgdmVyc2lvbmluZyBzY2hlbWUgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIFBFUC00NDAsCnNldHVwdG9vbHMtY29tcGF0aWJsZSBhbmQgc2VtYW50aWMgdmVyc2lvbmluZy4KIiIiCgppbXBvcnQgbG9nZ2luZwppbXBvcnQgcmUKCmZyb20gLmNvbXBhdCBpbXBvcnQgc3RyaW5nX3R5cGVzCgpfX2FsbF9fID0gWydOb3JtYWxpemVkVmVyc2lvbicsICdOb3JtYWxpemVkTWF0Y2hlcicsCiAgICAgICAgICAgJ0xlZ2FjeVZlcnNpb24nLCAnTGVnYWN5TWF0Y2hlcicsCiAgICAgICAgICAgJ1NlbWFudGljVmVyc2lvbicsICdTZW1hbnRpY01hdGNoZXInLAogICAgICAgICAgICdVbnN1cHBvcnRlZFZlcnNpb25FcnJvcicsICdnZXRfc2NoZW1lJ10KCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yKFZhbHVlRXJyb3IpOgogICAgIiIiVGhpcyBpcyBhbiB1bnN1cHBvcnRlZCB2ZXJzaW9uLiIiIgogICAgcGFzcwoKCmNsYXNzIFZlcnNpb24ob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzKToKICAgICAgICBzZWxmLl9zdHJpbmcgPSBzID0gcy5zdHJpcCgpCiAgICAgICAgc2VsZi5fcGFydHMgPSBwYXJ0cyA9IHNlbGYucGFyc2UocykKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShwYXJ0cywgdHVwbGUpCiAgICAgICAgYXNzZXJ0IGxlbihwYXJ0cykgPiAwCgogICAgZGVmIHBhcnNlKHNlbGYsIHMpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ3BsZWFzZSBpbXBsZW1lbnQgaW4gYSBzdWJjbGFzcycpCgogICAgZGVmIF9jaGVja19jb21wYXRpYmxlKHNlbGYsIG90aGVyKToKICAgICAgICBpZiB0eXBlKHNlbGYpICE9IHR5cGUob3RoZXIpOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2Nhbm5vdCBjb21wYXJlICVyIGFuZCAlcicgJSAoc2VsZiwgb3RoZXIpKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHNlbGYuX2NoZWNrX2NvbXBhdGlibGUob3RoZXIpCiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnRzID09IG90aGVyLl9wYXJ0cwoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3Qgc2VsZi5fX2VxX18ob3RoZXIpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgc2VsZi5fY2hlY2tfY29tcGF0aWJsZShvdGhlcikKICAgICAgICByZXR1cm4gc2VsZi5fcGFydHMgPCBvdGhlci5fcGFydHMKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IChzZWxmLl9fbHRfXyhvdGhlcikgb3Igc2VsZi5fX2VxX18ob3RoZXIpKQoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9fbHRfXyhvdGhlcikgb3Igc2VsZi5fX2VxX18ob3RoZXIpCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19ndF9fKG90aGVyKSBvciBzZWxmLl9fZXFfXyhvdGhlcikKCiAgICAjIFNlZSBodHRwOi8vZG9jcy5weXRob24ub3JnL3JlZmVyZW5jZS9kYXRhbW9kZWwjb2JqZWN0Ll9faGFzaF9fCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fcGFydHMpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiJXMoJyVzJykiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLl9zdHJpbmcpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3N0cmluZwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByZXJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignUGxlYXNlIGltcGxlbWVudCBpbiBzdWJjbGFzc2VzLicpCgoKY2xhc3MgTWF0Y2hlcihvYmplY3QpOgogICAgdmVyc2lvbl9jbGFzcyA9IE5vbmUKCiAgICBkaXN0X3JlID0gcmUuY29tcGlsZShyIl4oXHdbXHNcdycuLV0qKShcKCguKilcKSk/IikKICAgIGNvbXBfcmUgPSByZS5jb21waWxlKHInXig8PXw+PXw8fD58IT18PXsyLDN9fH49KT9ccyooW15ccyxdKykkJykKICAgIG51bV9yZSA9IHJlLmNvbXBpbGUocideXGQrKFwuXGQrKSokJykKCiAgICAjIHZhbHVlIGlzIGVpdGhlciBhIGNhbGxhYmxlIG9yIHRoZSBuYW1lIG9mIGEgbWV0aG9kCiAgICBfb3BlcmF0b3JzID0gewogICAgICAgICc8JzogbGFtYmRhIHYsIGMsIHA6IHYgPCBjLAogICAgICAgICc+JzogbGFtYmRhIHYsIGMsIHA6IHYgPiBjLAogICAgICAgICc8PSc6IGxhbWJkYSB2LCBjLCBwOiB2ID09IGMgb3IgdiA8IGMsCiAgICAgICAgJz49JzogbGFtYmRhIHYsIGMsIHA6IHYgPT0gYyBvciB2ID4gYywKICAgICAgICAnPT0nOiBsYW1iZGEgdiwgYywgcDogdiA9PSBjLAogICAgICAgICc9PT0nOiBsYW1iZGEgdiwgYywgcDogdiA9PSBjLAogICAgICAgICMgYnkgZGVmYXVsdCwgY29tcGF0aWJsZSA9PiA+PS4KICAgICAgICAnfj0nOiBsYW1iZGEgdiwgYywgcDogdiA9PSBjIG9yIHYgPiBjLAogICAgICAgICchPSc6IGxhbWJkYSB2LCBjLCBwOiB2ICE9IGMsCiAgICB9CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHMpOgogICAgICAgIGlmIHNlbGYudmVyc2lvbl9jbGFzcyBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdQbGVhc2Ugc3BlY2lmeSBhIHZlcnNpb24gY2xhc3MnKQogICAgICAgIHNlbGYuX3N0cmluZyA9IHMgPSBzLnN0cmlwKCkKICAgICAgICBtID0gc2VsZi5kaXN0X3JlLm1hdGNoKHMpCiAgICAgICAgaWYgbm90IG06CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ05vdCB2YWxpZDogJXInICUgcykKICAgICAgICBncm91cHMgPSBtLmdyb3VwcygnJykKICAgICAgICBzZWxmLm5hbWUgPSBncm91cHNbMF0uc3RyaXAoKQogICAgICAgIHNlbGYua2V5ID0gc2VsZi5uYW1lLmxvd2VyKCkgICAgIyBmb3IgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29ucwogICAgICAgIGNsaXN0ID0gW10KICAgICAgICBpZiBncm91cHNbMl06CiAgICAgICAgICAgIGNvbnN0cmFpbnRzID0gW2Muc3RyaXAoKSBmb3IgYyBpbiBncm91cHNbMl0uc3BsaXQoJywnKV0KICAgICAgICAgICAgZm9yIGMgaW4gY29uc3RyYWludHM6CiAgICAgICAgICAgICAgICBtID0gc2VsZi5jb21wX3JlLm1hdGNoKGMpCiAgICAgICAgICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdJbnZhbGlkICVyIGluICVyJyAlIChjLCBzKSkKICAgICAgICAgICAgICAgIGdyb3VwcyA9IG0uZ3JvdXBzKCkKICAgICAgICAgICAgICAgIG9wID0gZ3JvdXBzWzBdIG9yICd+PScKICAgICAgICAgICAgICAgIHMgPSBncm91cHNbMV0KICAgICAgICAgICAgICAgIGlmIHMuZW5kc3dpdGgoJy4qJyk6CiAgICAgICAgICAgICAgICAgICAgaWYgb3Agbm90IGluICgnPT0nLCAnIT0nKToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignXCcuKlwnIG5vdCBhbGxvd2VkIGZvciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyIGNvbnN0cmFpbnRzJyAlIG9wKQogICAgICAgICAgICAgICAgICAgICMgQ291bGQgYmUgYSBwYXJ0aWFsIHZlcnNpb24gKGUuZy4gZm9yICcyLionKSB3aGljaAogICAgICAgICAgICAgICAgICAgICMgd29uJ3QgcGFyc2UgYXMgYSB2ZXJzaW9uLCBzbyBrZWVwIGl0IGFzIGEgc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgdm4sIHByZWZpeCA9IHNbOi0yXSwgVHJ1ZQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLm51bV9yZS5tYXRjaCh2bik6CiAgICAgICAgICAgICAgICAgICAgICAgICMgSnVzdCB0byBjaGVjayB0aGF0IHZuIGlzIGEgdmFsaWQgdmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZlcnNpb25fY2xhc3Modm4pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgU2hvdWxkIHBhcnNlIGFzIGEgdmVyc2lvbiwgc28gd2UgY2FuIGNyZWF0ZSBhbgogICAgICAgICAgICAgICAgICAgICMgaW5zdGFuY2UgZm9yIHRoZSBjb21wYXJpc29uCiAgICAgICAgICAgICAgICAgICAgdm4sIHByZWZpeCA9IHNlbGYudmVyc2lvbl9jbGFzcyhzKSwgRmFsc2UKICAgICAgICAgICAgICAgIGNsaXN0LmFwcGVuZCgob3AsIHZuLCBwcmVmaXgpKQogICAgICAgIHNlbGYuX3BhcnRzID0gdHVwbGUoY2xpc3QpCgogICAgZGVmIG1hdGNoKHNlbGYsIHZlcnNpb24pOgogICAgICAgICIiIgogICAgICAgIENoZWNrIGlmIHRoZSBwcm92aWRlZCB2ZXJzaW9uIG1hdGNoZXMgdGhlIGNvbnN0cmFpbnRzLgoKICAgICAgICA6cGFyYW0gdmVyc2lvbjogVGhlIHZlcnNpb24gdG8gbWF0Y2ggYWdhaW5zdCB0aGlzIGluc3RhbmNlLgogICAgICAgIDp0eXBlIHZlcnNpb246IFN0cmluZyBvciA6Y2xhc3M6YFZlcnNpb25gIGluc3RhbmNlLgogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UodmVyc2lvbiwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgdmVyc2lvbiA9IHNlbGYudmVyc2lvbl9jbGFzcyh2ZXJzaW9uKQogICAgICAgIGZvciBvcGVyYXRvciwgY29uc3RyYWludCwgcHJlZml4IGluIHNlbGYuX3BhcnRzOgogICAgICAgICAgICBmID0gc2VsZi5fb3BlcmF0b3JzLmdldChvcGVyYXRvcikKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAgICAgZiA9IGdldGF0dHIoc2VsZiwgZikKICAgICAgICAgICAgaWYgbm90IGY6CiAgICAgICAgICAgICAgICBtc2cgPSAoJyVyIG5vdCBpbXBsZW1lbnRlZCAnCiAgICAgICAgICAgICAgICAgICAgICAgJ2ZvciAlcycgJSAob3BlcmF0b3IsIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fKSkKICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IobXNnKQogICAgICAgICAgICBpZiBub3QgZih2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBleGFjdF92ZXJzaW9uKHNlbGYpOgogICAgICAgIHJlc3VsdCA9IE5vbmUKICAgICAgICBpZiBsZW4oc2VsZi5fcGFydHMpID09IDEgYW5kIHNlbGYuX3BhcnRzWzBdWzBdIGluICgnPT0nLCAnPT09Jyk6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX3BhcnRzWzBdWzFdCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfY2hlY2tfY29tcGF0aWJsZShzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgdHlwZShzZWxmKSAhPSB0eXBlKG90aGVyKSBvciBzZWxmLm5hbWUgIT0gb3RoZXIubmFtZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdjYW5ub3QgY29tcGFyZSAlcyBhbmQgJXMnICUgKHNlbGYsIG90aGVyKSkKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBzZWxmLl9jaGVja19jb21wYXRpYmxlKG90aGVyKQogICAgICAgIHJldHVybiBzZWxmLmtleSA9PSBvdGhlci5rZXkgYW5kIHNlbGYuX3BhcnRzID09IG90aGVyLl9wYXJ0cwoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3Qgc2VsZi5fX2VxX18ob3RoZXIpCgogICAgIyBTZWUgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9yZWZlcmVuY2UvZGF0YW1vZGVsI29iamVjdC5fX2hhc2hfXwogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYua2V5KSArIGhhc2goc2VsZi5fcGFydHMpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiJXMoJXIpIiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5fc3RyaW5nKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9zdHJpbmcKCgpQRVA0NDBfVkVSU0lPTl9SRSA9IHJlLmNvbXBpbGUocidedj8oXGQrISk/KFxkKyhcLlxkKykqKSgoYXxifGN8cmMpKFxkKykpPycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInKFwuKHBvc3QpKFxkKykpPyhcLihkZXYpKFxkKykpPycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInKFwrKFthLXpBLVpcZF0rKFwuW2EtekEtWlxkXSspPykpPyQnKQoKCmRlZiBfcGVwXzQ0MF9rZXkocyk6CiAgICBzID0gcy5zdHJpcCgpCiAgICBtID0gUEVQNDQwX1ZFUlNJT05fUkUubWF0Y2gocykKICAgIGlmIG5vdCBtOgogICAgICAgIHJhaXNlIFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yKCdOb3QgYSB2YWxpZCB2ZXJzaW9uOiAlcycgJSBzKQogICAgZ3JvdXBzID0gbS5ncm91cHMoKQogICAgbnVtcyA9IHR1cGxlKGludCh2KSBmb3IgdiBpbiBncm91cHNbMV0uc3BsaXQoJy4nKSkKICAgIHdoaWxlIGxlbihudW1zKSA+IDEgYW5kIG51bXNbLTFdID09IDA6CiAgICAgICAgbnVtcyA9IG51bXNbOi0xXQoKICAgIGlmIG5vdCBncm91cHNbMF06CiAgICAgICAgZXBvY2ggPSAwCiAgICBlbHNlOgogICAgICAgIGVwb2NoID0gaW50KGdyb3Vwc1swXSkKICAgIHByZSA9IGdyb3Vwc1s0OjZdCiAgICBwb3N0ID0gZ3JvdXBzWzc6OV0KICAgIGRldiA9IGdyb3Vwc1sxMDoxMl0KICAgIGxvY2FsID0gZ3JvdXBzWzEzXQogICAgaWYgcHJlID09IChOb25lLCBOb25lKToKICAgICAgICBwcmUgPSAoKQogICAgZWxzZToKICAgICAgICBwcmUgPSBwcmVbMF0sIGludChwcmVbMV0pCiAgICBpZiBwb3N0ID09IChOb25lLCBOb25lKToKICAgICAgICBwb3N0ID0gKCkKICAgIGVsc2U6CiAgICAgICAgcG9zdCA9IHBvc3RbMF0sIGludChwb3N0WzFdKQogICAgaWYgZGV2ID09IChOb25lLCBOb25lKToKICAgICAgICBkZXYgPSAoKQogICAgZWxzZToKICAgICAgICBkZXYgPSBkZXZbMF0sIGludChkZXZbMV0pCiAgICBpZiBsb2NhbCBpcyBOb25lOgogICAgICAgIGxvY2FsID0gKCkKICAgIGVsc2U6CiAgICAgICAgcGFydHMgPSBbXQogICAgICAgIGZvciBwYXJ0IGluIGxvY2FsLnNwbGl0KCcuJyk6CiAgICAgICAgICAgICMgdG8gZW5zdXJlIHRoYXQgbnVtZXJpYyBjb21wYXJlcyBhcyA+IGxleGljb2dyYXBoaWMsIGF2b2lkCiAgICAgICAgICAgICMgY29tcGFyaW5nIHRoZW0gZGlyZWN0bHksIGJ1dCBlbmNvZGUgYSB0dXBsZSB3aGljaCBlbnN1cmVzCiAgICAgICAgICAgICMgY29ycmVjdCBzb3J0aW5nCiAgICAgICAgICAgIGlmIHBhcnQuaXNkaWdpdCgpOgogICAgICAgICAgICAgICAgcGFydCA9ICgxLCBpbnQocGFydCkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXJ0ID0gKDAsIHBhcnQpCiAgICAgICAgICAgIHBhcnRzLmFwcGVuZChwYXJ0KQogICAgICAgIGxvY2FsID0gdHVwbGUocGFydHMpCiAgICBpZiBub3QgcHJlOgogICAgICAgICMgZWl0aGVyIGJlZm9yZSBwcmUtcmVsZWFzZSwgb3IgZmluYWwgcmVsZWFzZSBhbmQgYWZ0ZXIKICAgICAgICBpZiBub3QgcG9zdCBhbmQgZGV2OgogICAgICAgICAgICAjIGJlZm9yZSBwcmUtcmVsZWFzZQogICAgICAgICAgICBwcmUgPSAoJ2EnLCAtMSkgICAgICMgdG8gc29ydCBiZWZvcmUgYTAKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmUgPSAoJ3onLCkgICAgICAgICMgdG8gc29ydCBhZnRlciBhbGwgcHJlLXJlbGVhc2VzCiAgICAjIG5vdyBsb29rIGF0IHRoZSBzdGF0ZSBvZiBwb3N0IGFuZCBkZXYuCiAgICBpZiBub3QgcG9zdDoKICAgICAgICBwb3N0ID0gKCdfJywpICAgIyBzb3J0IGJlZm9yZSAnYScKICAgIGlmIG5vdCBkZXY6CiAgICAgICAgZGV2ID0gKCdmaW5hbCcsKQoKICAgICNwcmludCgnJXMgLT4gJXMnICUgKHMsIG0uZ3JvdXBzKCkpKQogICAgcmV0dXJuIGVwb2NoLCBudW1zLCBwcmUsIHBvc3QsIGRldiwgbG9jYWwKCgpfbm9ybWFsaXplZF9rZXkgPSBfcGVwXzQ0MF9rZXkKCgpjbGFzcyBOb3JtYWxpemVkVmVyc2lvbihWZXJzaW9uKToKICAgICIiIkEgcmF0aW9uYWwgdmVyc2lvbi4KCiAgICBHb29kOgogICAgICAgIDEuMiAgICAgICAgICMgZXF1aXZhbGVudCB0byAiMS4yLjAiCiAgICAgICAgMS4yLjAKICAgICAgICAxLjJhMQogICAgICAgIDEuMi4zYTIKICAgICAgICAxLjIuM2IxCiAgICAgICAgMS4yLjNjMQogICAgICAgIDEuMi4zLjQKICAgICAgICBUT0RPOiBmaWxsIHRoaXMgb3V0CgogICAgQmFkOgogICAgICAgIDEgICAgICAgICAgICMgbWluaW11bSB0d28gbnVtYmVycwogICAgICAgIDEuMmEgICAgICAgICMgcmVsZWFzZSBsZXZlbCBtdXN0IGhhdmUgYSByZWxlYXNlIHNlcmlhbAogICAgICAgIDEuMi4zYgogICAgIiIiCiAgICBkZWYgcGFyc2Uoc2VsZiwgcyk6CiAgICAgICAgcmVzdWx0ID0gX25vcm1hbGl6ZWRfa2V5KHMpCiAgICAgICAgIyBfbm9ybWFsaXplZF9rZXkgbG9zZXMgdHJhaWxpbmcgemVyb2VzIGluIHRoZSByZWxlYXNlCiAgICAgICAgIyBjbGF1c2UsIHNpbmNlIHRoYXQncyBuZWVkZWQgdG8gZW5zdXJlIHRoYXQgWC5ZID09IFguWS4wID09IFguWS4wLjAKICAgICAgICAjIEhvd2V2ZXIsIFBFUCA0NDAgcHJlZml4IG1hdGNoaW5nIG5lZWRzIGl0OiBmb3IgZXhhbXBsZSwKICAgICAgICAjICh+PSAxLjQuNS4wKSBtYXRjaGVzIGRpZmZlcmVudGx5IHRvICh+PSAxLjQuNS4wLjApLgogICAgICAgIG0gPSBQRVA0NDBfVkVSU0lPTl9SRS5tYXRjaChzKSAgICAgICMgbXVzdCBzdWNjZWVkCiAgICAgICAgZ3JvdXBzID0gbS5ncm91cHMoKQogICAgICAgIHNlbGYuX3JlbGVhc2VfY2xhdXNlID0gdHVwbGUoaW50KHYpIGZvciB2IGluIGdyb3Vwc1sxXS5zcGxpdCgnLicpKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBQUkVSRUxfVEFHUyA9IHNldChbJ2EnLCAnYicsICdjJywgJ3JjJywgJ2RldiddKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByZXJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIGFueSh0WzBdIGluIHNlbGYuUFJFUkVMX1RBR1MgZm9yIHQgaW4gc2VsZi5fcGFydHMgaWYgdCkKCgpkZWYgX21hdGNoX3ByZWZpeCh4LCB5KToKICAgIHggPSBzdHIoeCkKICAgIHkgPSBzdHIoeSkKICAgIGlmIHggPT0geToKICAgICAgICByZXR1cm4gVHJ1ZQogICAgaWYgbm90IHguc3RhcnRzd2l0aCh5KToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIG4gPSBsZW4oeSkKICAgIHJldHVybiB4W25dID09ICcuJwoKCmNsYXNzIE5vcm1hbGl6ZWRNYXRjaGVyKE1hdGNoZXIpOgogICAgdmVyc2lvbl9jbGFzcyA9IE5vcm1hbGl6ZWRWZXJzaW9uCgogICAgIyB2YWx1ZSBpcyBlaXRoZXIgYSBjYWxsYWJsZSBvciB0aGUgbmFtZSBvZiBhIG1ldGhvZAogICAgX29wZXJhdG9ycyA9IHsKICAgICAgICAnfj0nOiAnX21hdGNoX2NvbXBhdGlibGUnLAogICAgICAgICc8JzogJ19tYXRjaF9sdCcsCiAgICAgICAgJz4nOiAnX21hdGNoX2d0JywKICAgICAgICAnPD0nOiAnX21hdGNoX2xlJywKICAgICAgICAnPj0nOiAnX21hdGNoX2dlJywKICAgICAgICAnPT0nOiAnX21hdGNoX2VxJywKICAgICAgICAnPT09JzogJ19tYXRjaF9hcmJpdHJhcnknLAogICAgICAgICchPSc6ICdfbWF0Y2hfbmUnLAogICAgfQoKICAgIGRlZiBfYWRqdXN0X2xvY2FsKHNlbGYsIHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgaWYgcHJlZml4OgogICAgICAgICAgICBzdHJpcF9sb2NhbCA9ICcrJyBub3QgaW4gY29uc3RyYWludCBhbmQgdmVyc2lvbi5fcGFydHNbLTFdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBib3RoIGNvbnN0cmFpbnQgYW5kIHZlcnNpb24gYXJlCiAgICAgICAgICAgICMgTm9ybWFsaXplZFZlcnNpb24gaW5zdGFuY2VzLgogICAgICAgICAgICAjIElmIGNvbnN0cmFpbnQgZG9lcyBub3QgaGF2ZSBhIGxvY2FsIGNvbXBvbmVudCwKICAgICAgICAgICAgIyBlbnN1cmUgdGhlIHZlcnNpb24gZG9lc24ndCwgZWl0aGVyLgogICAgICAgICAgICBzdHJpcF9sb2NhbCA9IG5vdCBjb25zdHJhaW50Ll9wYXJ0c1stMV0gYW5kIHZlcnNpb24uX3BhcnRzWy0xXQogICAgICAgIGlmIHN0cmlwX2xvY2FsOgogICAgICAgICAgICBzID0gdmVyc2lvbi5fc3RyaW5nLnNwbGl0KCcrJywgMSlbMF0KICAgICAgICAgICAgdmVyc2lvbiA9IHNlbGYudmVyc2lvbl9jbGFzcyhzKQogICAgICAgIHJldHVybiB2ZXJzaW9uLCBjb25zdHJhaW50CgogICAgZGVmIF9tYXRjaF9sdChzZWxmLCB2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpOgogICAgICAgIHZlcnNpb24sIGNvbnN0cmFpbnQgPSBzZWxmLl9hZGp1c3RfbG9jYWwodmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KQogICAgICAgIGlmIHZlcnNpb24gPj0gY29uc3RyYWludDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmVsZWFzZV9jbGF1c2UgPSBjb25zdHJhaW50Ll9yZWxlYXNlX2NsYXVzZQogICAgICAgIHBmeCA9ICcuJy5qb2luKFtzdHIoaSkgZm9yIGkgaW4gcmVsZWFzZV9jbGF1c2VdKQogICAgICAgIHJldHVybiBub3QgX21hdGNoX3ByZWZpeCh2ZXJzaW9uLCBwZngpCgogICAgZGVmIF9tYXRjaF9ndChzZWxmLCB2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpOgogICAgICAgIHZlcnNpb24sIGNvbnN0cmFpbnQgPSBzZWxmLl9hZGp1c3RfbG9jYWwodmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KQogICAgICAgIGlmIHZlcnNpb24gPD0gY29uc3RyYWludDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmVsZWFzZV9jbGF1c2UgPSBjb25zdHJhaW50Ll9yZWxlYXNlX2NsYXVzZQogICAgICAgIHBmeCA9ICcuJy5qb2luKFtzdHIoaSkgZm9yIGkgaW4gcmVsZWFzZV9jbGF1c2VdKQogICAgICAgIHJldHVybiBub3QgX21hdGNoX3ByZWZpeCh2ZXJzaW9uLCBwZngpCgogICAgZGVmIF9tYXRjaF9sZShzZWxmLCB2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpOgogICAgICAgIHZlcnNpb24sIGNvbnN0cmFpbnQgPSBzZWxmLl9hZGp1c3RfbG9jYWwodmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KQogICAgICAgIHJldHVybiB2ZXJzaW9uIDw9IGNvbnN0cmFpbnQKCiAgICBkZWYgX21hdGNoX2dlKHNlbGYsIHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgdmVyc2lvbiwgY29uc3RyYWludCA9IHNlbGYuX2FkanVzdF9sb2NhbCh2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpCiAgICAgICAgcmV0dXJuIHZlcnNpb24gPj0gY29uc3RyYWludAoKICAgIGRlZiBfbWF0Y2hfZXEoc2VsZiwgdmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KToKICAgICAgICB2ZXJzaW9uLCBjb25zdHJhaW50ID0gc2VsZi5fYWRqdXN0X2xvY2FsKHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCkKICAgICAgICBpZiBub3QgcHJlZml4OgogICAgICAgICAgICByZXN1bHQgPSAodmVyc2lvbiA9PSBjb25zdHJhaW50KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IF9tYXRjaF9wcmVmaXgodmVyc2lvbiwgY29uc3RyYWludCkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9tYXRjaF9hcmJpdHJhcnkoc2VsZiwgdmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KToKICAgICAgICByZXR1cm4gc3RyKHZlcnNpb24pID09IHN0cihjb25zdHJhaW50KQoKICAgIGRlZiBfbWF0Y2hfbmUoc2VsZiwgdmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KToKICAgICAgICB2ZXJzaW9uLCBjb25zdHJhaW50ID0gc2VsZi5fYWRqdXN0X2xvY2FsKHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCkKICAgICAgICBpZiBub3QgcHJlZml4OgogICAgICAgICAgICByZXN1bHQgPSAodmVyc2lvbiAhPSBjb25zdHJhaW50KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IG5vdCBfbWF0Y2hfcHJlZml4KHZlcnNpb24sIGNvbnN0cmFpbnQpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfbWF0Y2hfY29tcGF0aWJsZShzZWxmLCB2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpOgogICAgICAgIHZlcnNpb24sIGNvbnN0cmFpbnQgPSBzZWxmLl9hZGp1c3RfbG9jYWwodmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KQogICAgICAgIGlmIHZlcnNpb24gPT0gY29uc3RyYWludDoKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBpZiB2ZXJzaW9uIDwgY29uc3RyYWludDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiMgICAgICAgIGlmIG5vdCBwcmVmaXg6CiMgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJlbGVhc2VfY2xhdXNlID0gY29uc3RyYWludC5fcmVsZWFzZV9jbGF1c2UKICAgICAgICBpZiBsZW4ocmVsZWFzZV9jbGF1c2UpID4gMToKICAgICAgICAgICAgcmVsZWFzZV9jbGF1c2UgPSByZWxlYXNlX2NsYXVzZVs6LTFdCiAgICAgICAgcGZ4ID0gJy4nLmpvaW4oW3N0cihpKSBmb3IgaSBpbiByZWxlYXNlX2NsYXVzZV0pCiAgICAgICAgcmV0dXJuIF9tYXRjaF9wcmVmaXgodmVyc2lvbiwgcGZ4KQoKX1JFUExBQ0VNRU5UUyA9ICgKICAgIChyZS5jb21waWxlKCdbListXSQnKSwgJycpLCAgICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nIHB1bmN0cwogICAgKHJlLmNvbXBpbGUocideWy5dKFxkKScpLCByJzAuXDEnKSwgICAgICAgICAgICAgIyAuTiAtPiAwLk4gYXQgc3RhcnQKICAgIChyZS5jb21waWxlKCdeWy4tXScpLCAnJyksICAgICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGxlYWRpbmcgcHVuY3RzCiAgICAocmUuY29tcGlsZShyJ15cKCguKilcKSQnKSwgcidcMScpLCAgICAgICAgICAgICAjIHJlbW92ZSBwYXJlbnRoZXNlcwogICAgKHJlLmNvbXBpbGUocidedihlcnNpb24pP1xzKihcZCspJyksIHInXDInKSwgICAgIyByZW1vdmUgbGVhZGluZyB2KGVyc2lvbikKICAgIChyZS5jb21waWxlKHInXnIoZXYpP1xzKihcZCspJyksIHInXDInKSwgICAgICAgICMgcmVtb3ZlIGxlYWRpbmcgdihlcnNpb24pCiAgICAocmUuY29tcGlsZSgnWy5dezIsfScpLCAnLicpLCAgICAgICAgICAgICAgICAgICAjIG11bHRpcGxlIHJ1bnMgb2YgJy4nCiAgICAocmUuY29tcGlsZShyJ1xiKGFsZmF8YXBoYSlcYicpLCAnYWxwaGEnKSwgICAgICAjIG1pc3NwZWx0IGFscGhhCiAgICAocmUuY29tcGlsZShyJ1xiKHByZS1hbHBoYXxwcmVhbHBoYSlcYicpLAogICAgICAgICAgICAgICAgJ3ByZS5hbHBoYScpLCAgICAgICAgICAgICAgICAgICAgICAgIyBzdGFuZGFyZGlzZQogICAgKHJlLmNvbXBpbGUocidcKGJldGFcKSQnKSwgJ2JldGEnKSwgICAgICAgICAgICAgIyByZW1vdmUgcGFyZW50aGVzZXMKKQoKX1NVRkZJWF9SRVBMQUNFTUVOVFMgPSAoCiAgICAocmUuY29tcGlsZSgnXls6fi5fKy1dKycpLCAnJyksICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGxlYWRpbmcgcHVuY3RzCiAgICAocmUuY29tcGlsZSgnWywqIikoW1xdXScpLCAnJyksICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIHVud2FudGVkIGNoYXJzCiAgICAocmUuY29tcGlsZSgnW346K18gLV0nKSwgJy4nKSwgICAgICAgICAgICAgICAgICAgICMgcmVwbGFjZSBpbGxlZ2FsIGNoYXJzCiAgICAocmUuY29tcGlsZSgnWy5dezIsfScpLCAnLicpLCAgICAgICAgICAgICAgICAgICAjIG11bHRpcGxlIHJ1bnMgb2YgJy4nCiAgICAocmUuY29tcGlsZShyJ1wuJCcpLCAnJyksICAgICAgICAgICAgICAgICAgICAgICAjIHRyYWlsaW5nICcuJwopCgpfTlVNRVJJQ19QUkVGSVggPSByZS5jb21waWxlKHInKFxkKyhcLlxkKykqKScpCgoKZGVmIF9zdWdnZXN0X3NlbWFudGljX3ZlcnNpb24ocyk6CiAgICAiIiIKICAgIFRyeSB0byBzdWdnZXN0IGEgc2VtYW50aWMgZm9ybSBmb3IgYSB2ZXJzaW9uIGZvciB3aGljaAogICAgX3N1Z2dlc3Rfbm9ybWFsaXplZF92ZXJzaW9uIGNvdWxkbid0IGNvbWUgdXAgd2l0aCBhbnl0aGluZy4KICAgICIiIgogICAgcmVzdWx0ID0gcy5zdHJpcCgpLmxvd2VyKCkKICAgIGZvciBwYXQsIHJlcGwgaW4gX1JFUExBQ0VNRU5UUzoKICAgICAgICByZXN1bHQgPSBwYXQuc3ViKHJlcGwsIHJlc3VsdCkKICAgIGlmIG5vdCByZXN1bHQ6CiAgICAgICAgcmVzdWx0ID0gJzAuMC4wJwoKICAgICMgTm93IGxvb2sgZm9yIG51bWVyaWMgcHJlZml4LCBhbmQgc2VwYXJhdGUgaXQgb3V0IGZyb20KICAgICMgdGhlIHJlc3QuCiAgICAjaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCiAgICBtID0gX05VTUVSSUNfUFJFRklYLm1hdGNoKHJlc3VsdCkKICAgIGlmIG5vdCBtOgogICAgICAgIHByZWZpeCA9ICcwLjAuMCcKICAgICAgICBzdWZmaXggPSByZXN1bHQKICAgIGVsc2U6CiAgICAgICAgcHJlZml4ID0gbS5ncm91cHMoKVswXS5zcGxpdCgnLicpCiAgICAgICAgcHJlZml4ID0gW2ludChpKSBmb3IgaSBpbiBwcmVmaXhdCiAgICAgICAgd2hpbGUgbGVuKHByZWZpeCkgPCAzOgogICAgICAgICAgICBwcmVmaXguYXBwZW5kKDApCiAgICAgICAgaWYgbGVuKHByZWZpeCkgPT0gMzoKICAgICAgICAgICAgc3VmZml4ID0gcmVzdWx0W20uZW5kKCk6XQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN1ZmZpeCA9ICcuJy5qb2luKFtzdHIoaSkgZm9yIGkgaW4gcHJlZml4WzM6XV0pICsgcmVzdWx0W20uZW5kKCk6XQogICAgICAgICAgICBwcmVmaXggPSBwcmVmaXhbOjNdCiAgICAgICAgcHJlZml4ID0gJy4nLmpvaW4oW3N0cihpKSBmb3IgaSBpbiBwcmVmaXhdKQogICAgICAgIHN1ZmZpeCA9IHN1ZmZpeC5zdHJpcCgpCiAgICBpZiBzdWZmaXg6CiAgICAgICAgI2ltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQogICAgICAgICMgbWFzc2FnZSB0aGUgc3VmZml4LgogICAgICAgIGZvciBwYXQsIHJlcGwgaW4gX1NVRkZJWF9SRVBMQUNFTUVOVFM6CiAgICAgICAgICAgIHN1ZmZpeCA9IHBhdC5zdWIocmVwbCwgc3VmZml4KQoKICAgIGlmIG5vdCBzdWZmaXg6CiAgICAgICAgcmVzdWx0ID0gcHJlZml4CiAgICBlbHNlOgogICAgICAgIHNlcCA9ICctJyBpZiAnZGV2JyBpbiBzdWZmaXggZWxzZSAnKycKICAgICAgICByZXN1bHQgPSBwcmVmaXggKyBzZXAgKyBzdWZmaXgKICAgIGlmIG5vdCBpc19zZW12ZXIocmVzdWx0KToKICAgICAgICByZXN1bHQgPSBOb25lCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIF9zdWdnZXN0X25vcm1hbGl6ZWRfdmVyc2lvbihzKToKICAgICIiIlN1Z2dlc3QgYSBub3JtYWxpemVkIHZlcnNpb24gY2xvc2UgdG8gdGhlIGdpdmVuIHZlcnNpb24gc3RyaW5nLgoKICAgIElmIHlvdSBoYXZlIGEgdmVyc2lvbiBzdHJpbmcgdGhhdCBpc24ndCByYXRpb25hbCAoaS5lLiBOb3JtYWxpemVkVmVyc2lvbgogICAgZG9lc24ndCBsaWtlIGl0KSB0aGVuIHlvdSBtaWdodCBiZSBhYmxlIHRvIGdldCBhbiBlcXVpdmFsZW50IChvciBjbG9zZSkKICAgIHJhdGlvbmFsIHZlcnNpb24gZnJvbSB0aGlzIGZ1bmN0aW9uLgoKICAgIFRoaXMgZG9lcyBhIG51bWJlciBvZiBzaW1wbGUgbm9ybWFsaXphdGlvbnMgdG8gdGhlIGdpdmVuIHN0cmluZywgYmFzZWQKICAgIG9uIG9ic2VydmF0aW9uIG9mIHZlcnNpb25zIGN1cnJlbnRseSBpbiB1c2Ugb24gUHlQSS4gR2l2ZW4gYSBkdW1wIG9mCiAgICB0aG9zZSB2ZXJzaW9uIGR1cmluZyBQeUNvbiAyMDA5LCA0Mjg3IG9mIHRoZW06CiAgICAtIDIzMTIgKDUzLjkzJSkgbWF0Y2ggTm9ybWFsaXplZFZlcnNpb24gd2l0aG91dCBjaGFuZ2UKICAgICAgd2l0aCB0aGUgYXV0b21hdGljIHN1Z2dlc3Rpb24KICAgIC0gMzQ3NCAoODEuMDQlKSBtYXRjaCB3aGVuIHVzaW5nIHRoaXMgc3VnZ2VzdGlvbiBtZXRob2QKCiAgICBAcGFyYW0gcyB7c3RyfSBBbiBpcnJhdGlvbmFsIHZlcnNpb24gc3RyaW5nLgogICAgQHJldHVybnMgQSByYXRpb25hbCB2ZXJzaW9uIHN0cmluZywgb3IgTm9uZSwgaWYgY291bGRuJ3QgZGV0ZXJtaW5lIG9uZS4KICAgICIiIgogICAgdHJ5OgogICAgICAgIF9ub3JtYWxpemVkX2tleShzKQogICAgICAgIHJldHVybiBzICAgIyBhbHJlYWR5IHJhdGlvbmFsCiAgICBleGNlcHQgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3I6CiAgICAgICAgcGFzcwoKICAgIHJzID0gcy5sb3dlcigpCgogICAgIyBwYXJ0IG9mIHRoaXMgY291bGQgdXNlIG1ha2V0cmFucwogICAgZm9yIG9yaWcsIHJlcGwgaW4gKCgnLWFscGhhJywgJ2EnKSwgKCctYmV0YScsICdiJyksICgnYWxwaGEnLCAnYScpLAogICAgICAgICAgICAgICAgICAgICAgICgnYmV0YScsICdiJyksICgncmMnLCAnYycpLCAoJy1maW5hbCcsICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAoJy1wcmUnLCAnYycpLAogICAgICAgICAgICAgICAgICAgICAgICgnLXJlbGVhc2UnLCAnJyksICgnLnJlbGVhc2UnLCAnJyksICgnLXN0YWJsZScsICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAoJysnLCAnLicpLCAoJ18nLCAnLicpLCAoJyAnLCAnJyksICgnLmZpbmFsJywgJycpLAogICAgICAgICAgICAgICAgICAgICAgICgnZmluYWwnLCAnJykpOgogICAgICAgIHJzID0gcnMucmVwbGFjZShvcmlnLCByZXBsKQoKICAgICMgaWYgc29tZXRoaW5nIGVuZHMgd2l0aCBkZXYgb3IgcHJlLCB3ZSBhZGQgYSAwCiAgICBycyA9IHJlLnN1YihyInByZSQiLCByInByZTAiLCBycykKICAgIHJzID0gcmUuc3ViKHIiZGV2JCIsIHIiZGV2MCIsIHJzKQoKICAgICMgaWYgd2UgaGF2ZSBzb21ldGhpbmcgbGlrZSAiYi0yIiBvciAiYS4yIiBhdCB0aGUgZW5kIG9mIHRoZQogICAgIyB2ZXJzaW9uLCB0aGF0IGlzIHByb2JhYmx5IGJldGEsIGFscGhhLCBldGMKICAgICMgbGV0J3MgcmVtb3ZlIHRoZSBkYXNoIG9yIGRvdAogICAgcnMgPSByZS5zdWIociIoW2FiY118cmMpW1wtXC5dKFxkKykkIiwgciJcMVwyIiwgcnMpCgogICAgIyAxLjAtZGV2LXIzNzEgLT4gMS4wLmRldjM3MQogICAgIyAwLjEtZGV2LXI3OSAtPiAwLjEuZGV2NzkKICAgIHJzID0gcmUuc3ViKHIiW1wtXC5dKGRldilbXC1cLl0/cj8oXGQrKSQiLCByIi5cMVwyIiwgcnMpCgogICAgIyBDbGVhbjogMi4wLmEuMywgMi4wLmIxLCAwLjkuMH5jMQogICAgcnMgPSByZS5zdWIociJbLn5dPyhbYWJjXSlcLj8iLCByIlwxIiwgcnMpCgogICAgIyBDbGVhbjogdjAuMywgdjEuMAogICAgaWYgcnMuc3RhcnRzd2l0aCgndicpOgogICAgICAgIHJzID0gcnNbMTpdCgogICAgIyBDbGVhbiBsZWFkaW5nICcwJ3Mgb24gbnVtYmVycy4KICAgICNUT0RPOiB1bmludGVuZGVkIHNpZGUtZWZmZWN0IG9uLCBlLmcuLCAiMjAwMy4wNS4wOSIKICAgICMgUHlQSSBzdGF0czogNzcgKH4yJSkgYmV0dGVyCiAgICBycyA9IHJlLnN1YihyIlxiMCsoXGQrKSg/IVxkKSIsIHIiXDEiLCBycykKCiAgICAjIENsZWFuIGEvYi9jIHdpdGggbm8gdmVyc2lvbi4gRS5nLiAiMS4wYSIgLT4gIjEuMGEwIi4gU2V0dXB0b29scyBpbmZlcnMKICAgICMgemVyby4KICAgICMgUHlQSSBzdGF0czogMjQ1ICg3LjU2JSkgYmV0dGVyCiAgICBycyA9IHJlLnN1YihyIihcZCtbYWJjXSkkIiwgciJcZzwxPjAiLCBycykKCiAgICAjIHRoZSAnZGV2LXJOTk4nIHRhZyBpcyBhIGRldiB0YWcKICAgIHJzID0gcmUuc3ViKHIiXC4/KGRldi1yfGRldlwucilcLj8oXGQrKSQiLCByIi5kZXZcMiIsIHJzKQoKICAgICMgY2xlYW4gdGhlIC0gd2hlbiB1c2VkIGFzIGEgcHJlIGRlbGltaXRlcgogICAgcnMgPSByZS5zdWIociItKGF8YnxjKShcZCspJCIsIHIiXDFcMiIsIHJzKQoKICAgICMgYSB0ZXJtaW5hbCAiZGV2IiBvciAiZGV2ZWwiIGNhbiBiZSBjaGFuZ2VkIGludG8gIi5kZXYwIgogICAgcnMgPSByZS5zdWIociJbXC5cLV0oZGV2fGRldmVsKSQiLCByIi5kZXYwIiwgcnMpCgogICAgIyBhIHRlcm1pbmFsICJkZXYiIGNhbiBiZSBjaGFuZ2VkIGludG8gIi5kZXYwIgogICAgcnMgPSByZS5zdWIociIoPyFbXC5cLV0pZGV2JCIsIHIiLmRldjAiLCBycykKCiAgICAjIGEgdGVybWluYWwgImZpbmFsIiBvciAic3RhYmxlIiBjYW4gYmUgcmVtb3ZlZAogICAgcnMgPSByZS5zdWIociIoZmluYWx8c3RhYmxlKSQiLCAiIiwgcnMpCgogICAgIyBUaGUgJ3InIGFuZCB0aGUgJy0nIHRhZ3MgYXJlIHBvc3QgcmVsZWFzZSB0YWdzCiAgICAjICAgMC40YTEucjEwICAgICAgIC0+ICAwLjRhMS5wb3N0MTAKICAgICMgICAwLjkuMzMtMTcyMjIgICAgLT4gIDAuOS4zMy5wb3N0MTcyMjIKICAgICMgICAwLjkuMzMtcjE3MjIyICAgLT4gIDAuOS4zMy5wb3N0MTcyMjIKICAgIHJzID0gcmUuc3ViKHIiXC4/KHJ8LXwtcilcLj8oXGQrKSQiLCByIi5wb3N0XDIiLCBycykKCiAgICAjIENsZWFuICdyJyBpbnN0ZWFkIG9mICdkZXYnIHVzYWdlOgogICAgIyAgIDAuOS4zMytyMTcyMjIgICAtPiAgMC45LjMzLmRldjE3MjIyCiAgICAjICAgMS4wZGV2MTIzICAgICAgIC0+ICAxLjAuZGV2MTIzCiAgICAjICAgMS4wLmdpdDEyMyAgICAgIC0+ICAxLjAuZGV2MTIzCiAgICAjICAgMS4wLmJ6cjEyMyAgICAgIC0+ICAxLjAuZGV2MTIzCiAgICAjICAgMC4xYTBkZXYuMTIzICAgIC0+ICAwLjFhMC5kZXYxMjMKICAgICMgUHlQSSBzdGF0czogIH4xNTAgKH40JSkgYmV0dGVyCiAgICBycyA9IHJlLnN1YihyIlwuPyhkZXZ8Z2l0fGJ6cilcLj8oXGQrKSQiLCByIi5kZXZcMiIsIHJzKQoKICAgICMgQ2xlYW4gJy5wcmUnIChub3JtYWxpemVkIGZyb20gJy1wcmUnIGFib3ZlKSBpbnN0ZWFkIG9mICdjJyB1c2FnZToKICAgICMgICAwLjIucHJlMSAgICAgICAgLT4gIDAuMmMxCiAgICAjICAgMC4yLWMxICAgICAgICAgLT4gIDAuMmMxCiAgICAjICAgMS4wcHJldmlldzEyMyAgIC0+ICAxLjBjMTIzCiAgICAjIFB5UEkgc3RhdHM6IH4yMSAoMC42MiUpIGJldHRlcgogICAgcnMgPSByZS5zdWIociJcLj8ocHJlfHByZXZpZXd8LWMpKFxkKykkIiwgciJjXGc8Mj4iLCBycykKCiAgICAjIFRjbC9UayB1c2VzICJweCIgZm9yIHRoZWlyIHBvc3QgcmVsZWFzZSBtYXJrZXJzCiAgICBycyA9IHJlLnN1YihyInAoXGQrKSQiLCByIi5wb3N0XDEiLCBycykKCiAgICB0cnk6CiAgICAgICAgX25vcm1hbGl6ZWRfa2V5KHJzKQogICAgZXhjZXB0IFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yOgogICAgICAgIHJzID0gTm9uZQogICAgcmV0dXJuIHJzCgojCiMgICBMZWdhY3kgdmVyc2lvbiBwcm9jZXNzaW5nIChkaXN0cmlidXRlLWNvbXBhdGlibGUpCiMKCl9WRVJTSU9OX1BBUlQgPSByZS5jb21waWxlKHInKFthLXpdK3xcZCt8W1wuLV0pJywgcmUuSSkKX1ZFUlNJT05fUkVQTEFDRSA9IHsKICAgICdwcmUnOiAnYycsCiAgICAncHJldmlldyc6ICdjJywKICAgICctJzogJ2ZpbmFsLScsCiAgICAncmMnOiAnYycsCiAgICAnZGV2JzogJ0AnLAogICAgJyc6IE5vbmUsCiAgICAnLic6IE5vbmUsCn0KCgpkZWYgX2xlZ2FjeV9rZXkocyk6CiAgICBkZWYgZ2V0X3BhcnRzKHMpOgogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgZm9yIHAgaW4gX1ZFUlNJT05fUEFSVC5zcGxpdChzLmxvd2VyKCkpOgogICAgICAgICAgICBwID0gX1ZFUlNJT05fUkVQTEFDRS5nZXQocCwgcCkKICAgICAgICAgICAgaWYgcDoKICAgICAgICAgICAgICAgIGlmICcwJyA8PSBwWzoxXSA8PSAnOSc6CiAgICAgICAgICAgICAgICAgICAgcCA9IHAuemZpbGwoOCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcCA9ICcqJyArIHAKICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocCkKICAgICAgICByZXN1bHQuYXBwZW5kKCcqZmluYWwnKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICByZXN1bHQgPSBbXQogICAgZm9yIHAgaW4gZ2V0X3BhcnRzKHMpOgogICAgICAgIGlmIHAuc3RhcnRzd2l0aCgnKicpOgogICAgICAgICAgICBpZiBwIDwgJypmaW5hbCc6CiAgICAgICAgICAgICAgICB3aGlsZSByZXN1bHQgYW5kIHJlc3VsdFstMV0gPT0gJypmaW5hbC0nOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wb3AoKQogICAgICAgICAgICB3aGlsZSByZXN1bHQgYW5kIHJlc3VsdFstMV0gPT0gJzAwMDAwMDAwJzoKICAgICAgICAgICAgICAgIHJlc3VsdC5wb3AoKQogICAgICAgIHJlc3VsdC5hcHBlbmQocCkKICAgIHJldHVybiB0dXBsZShyZXN1bHQpCgoKY2xhc3MgTGVnYWN5VmVyc2lvbihWZXJzaW9uKToKICAgIGRlZiBwYXJzZShzZWxmLCBzKToKICAgICAgICByZXR1cm4gX2xlZ2FjeV9rZXkocykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wcmVyZWxlYXNlKHNlbGYpOgogICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgZm9yIHggaW4gc2VsZi5fcGFydHM6CiAgICAgICAgICAgIGlmIChpc2luc3RhbmNlKHgsIHN0cmluZ190eXBlcykgYW5kIHguc3RhcnRzd2l0aCgnKicpIGFuZAogICAgICAgICAgICAgICAgeCA8ICcqZmluYWwnKToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRydWUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIExlZ2FjeU1hdGNoZXIoTWF0Y2hlcik6CiAgICB2ZXJzaW9uX2NsYXNzID0gTGVnYWN5VmVyc2lvbgoKICAgIF9vcGVyYXRvcnMgPSBkaWN0KE1hdGNoZXIuX29wZXJhdG9ycykKICAgIF9vcGVyYXRvcnNbJ349J10gPSAnX21hdGNoX2NvbXBhdGlibGUnCgogICAgbnVtZXJpY19yZSA9IHJlLmNvbXBpbGUoJ14oXGQrKFwuXGQrKSopJykKCiAgICBkZWYgX21hdGNoX2NvbXBhdGlibGUoc2VsZiwgdmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KToKICAgICAgICBpZiB2ZXJzaW9uIDwgY29uc3RyYWludDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgbSA9IHNlbGYubnVtZXJpY19yZS5tYXRjaChzdHIoY29uc3RyYWludCkpCiAgICAgICAgaWYgbm90IG06CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdDYW5ub3QgY29tcHV0ZSBjb21wYXRpYmxlIG1hdGNoIGZvciB2ZXJzaW9uICVzICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBhbmQgY29uc3RyYWludCAlcycsIHZlcnNpb24sIGNvbnN0cmFpbnQpCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcyA9IG0uZ3JvdXBzKClbMF0KICAgICAgICBpZiAnLicgaW4gczoKICAgICAgICAgICAgcyA9IHMucnNwbGl0KCcuJywgMSlbMF0KICAgICAgICByZXR1cm4gX21hdGNoX3ByZWZpeCh2ZXJzaW9uLCBzKQoKIwojICAgU2VtYW50aWMgdmVyc2lvbmluZwojCgpfU0VNVkVSX1JFID0gcmUuY29tcGlsZShyJ14oXGQrKVwuKFxkKylcLihcZCspJwogICAgICAgICAgICAgICAgICAgICAgICByJygtW2EtejAtOV0rKFwuW2EtejAtOS1dKykqKT8nCiAgICAgICAgICAgICAgICAgICAgICAgIHInKFwrW2EtejAtOV0rKFwuW2EtejAtOS1dKykqKT8kJywgcmUuSSkKCgpkZWYgaXNfc2VtdmVyKHMpOgogICAgcmV0dXJuIF9TRU1WRVJfUkUubWF0Y2gocykKCgpkZWYgX3NlbWFudGljX2tleShzKToKICAgIGRlZiBtYWtlX3R1cGxlKHMsIGFic2VudCk6CiAgICAgICAgaWYgcyBpcyBOb25lOgogICAgICAgICAgICByZXN1bHQgPSAoYWJzZW50LCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXJ0cyA9IHNbMTpdLnNwbGl0KCcuJykKICAgICAgICAgICAgIyBXZSBjYW4ndCBjb21wYXJlIGludHMgYW5kIHN0cmluZ3Mgb24gUHl0aG9uIDMsIHNvIGZ1ZGdlIGl0CiAgICAgICAgICAgICMgYnkgemVyby1maWxsaW5nIG51bWVyaWMgdmFsdWVzIHNvIHNpbXVsYXRlIGEgbnVtZXJpYyBjb21wYXJpc29uCiAgICAgICAgICAgIHJlc3VsdCA9IHR1cGxlKFtwLnpmaWxsKDgpIGlmIHAuaXNkaWdpdCgpIGVsc2UgcCBmb3IgcCBpbiBwYXJ0c10pCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIG0gPSBpc19zZW12ZXIocykKICAgIGlmIG5vdCBtOgogICAgICAgIHJhaXNlIFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yKHMpCiAgICBncm91cHMgPSBtLmdyb3VwcygpCiAgICBtYWpvciwgbWlub3IsIHBhdGNoID0gW2ludChpKSBmb3IgaSBpbiBncm91cHNbOjNdXQogICAgIyBjaG9vc2UgdGhlICd8JyBhbmQgJyonIHNvIHRoYXQgdmVyc2lvbnMgc29ydCBjb3JyZWN0bHkKICAgIHByZSwgYnVpbGQgPSBtYWtlX3R1cGxlKGdyb3Vwc1szXSwgJ3wnKSwgbWFrZV90dXBsZShncm91cHNbNV0sICcqJykKICAgIHJldHVybiAobWFqb3IsIG1pbm9yLCBwYXRjaCksIHByZSwgYnVpbGQKCgpjbGFzcyBTZW1hbnRpY1ZlcnNpb24oVmVyc2lvbik6CiAgICBkZWYgcGFyc2Uoc2VsZiwgcyk6CiAgICAgICAgcmV0dXJuIF9zZW1hbnRpY19rZXkocykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wcmVyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9wYXJ0c1sxXVswXSAhPSAnfCcKCgpjbGFzcyBTZW1hbnRpY01hdGNoZXIoTWF0Y2hlcik6CiAgICB2ZXJzaW9uX2NsYXNzID0gU2VtYW50aWNWZXJzaW9uCgoKY2xhc3MgVmVyc2lvblNjaGVtZShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSwgbWF0Y2hlciwgc3VnZ2VzdGVyPU5vbmUpOgogICAgICAgIHNlbGYua2V5ID0ga2V5CiAgICAgICAgc2VsZi5tYXRjaGVyID0gbWF0Y2hlcgogICAgICAgIHNlbGYuc3VnZ2VzdGVyID0gc3VnZ2VzdGVyCgogICAgZGVmIGlzX3ZhbGlkX3ZlcnNpb24oc2VsZiwgcyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLm1hdGNoZXIudmVyc2lvbl9jbGFzcyhzKQogICAgICAgICAgICByZXN1bHQgPSBUcnVlCiAgICAgICAgZXhjZXB0IFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yOgogICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgaXNfdmFsaWRfbWF0Y2hlcihzZWxmLCBzKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYubWF0Y2hlcihzKQogICAgICAgICAgICByZXN1bHQgPSBUcnVlCiAgICAgICAgZXhjZXB0IFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yOgogICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgaXNfdmFsaWRfY29uc3RyYWludF9saXN0KHNlbGYsIHMpOgogICAgICAgICIiIgogICAgICAgIFVzZWQgZm9yIHByb2Nlc3Npbmcgc29tZSBtZXRhZGF0YSBmaWVsZHMKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5pc192YWxpZF9tYXRjaGVyKCdkdW1teV9uYW1lICglcyknICUgcykKCiAgICBkZWYgc3VnZ2VzdChzZWxmLCBzKToKICAgICAgICBpZiBzZWxmLnN1Z2dlc3RlciBpcyBOb25lOgogICAgICAgICAgICByZXN1bHQgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5zdWdnZXN0ZXIocykKICAgICAgICByZXR1cm4gcmVzdWx0CgpfU0NIRU1FUyA9IHsKICAgICdub3JtYWxpemVkJzogVmVyc2lvblNjaGVtZShfbm9ybWFsaXplZF9rZXksIE5vcm1hbGl6ZWRNYXRjaGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zdWdnZXN0X25vcm1hbGl6ZWRfdmVyc2lvbiksCiAgICAnbGVnYWN5JzogVmVyc2lvblNjaGVtZShfbGVnYWN5X2tleSwgTGVnYWN5TWF0Y2hlciwgbGFtYmRhIHNlbGYsIHM6IHMpLAogICAgJ3NlbWFudGljJzogVmVyc2lvblNjaGVtZShfc2VtYW50aWNfa2V5LCBTZW1hbnRpY01hdGNoZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zdWdnZXN0X3NlbWFudGljX3ZlcnNpb24pLAp9CgpfU0NIRU1FU1snZGVmYXVsdCddID0gX1NDSEVNRVNbJ25vcm1hbGl6ZWQnXQoKCmRlZiBnZXRfc2NoZW1lKG5hbWUpOgogICAgaWYgbmFtZSBub3QgaW4gX1NDSEVNRVM6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndW5rbm93biBzY2hlbWUgbmFtZTogJXInICUgbmFtZSkKICAgIHJldHVybiBfU0NIRU1FU1tuYW1lXQpQSwMEFAAAAAAAAAAhANh9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ABYAAADoXbL//4C9uP3//wB0CouFtP3//4NgcP2DyP/pYQsAAPZGDEB1Xlbo+NH//1m6WPZAAIP4/3Qbg/j+dBaLyIPhH4vwwf4FweEGAwy1oA1BAOsCi8r2QSR/dZuD+P90GYP4/nQUi8iD4B/B+QXB4AYDBI2gDUEA6wKLwvZAJIAPhXH///8z9jveD4Rn////ihOJtdz9//+Jtdj9//+Jtbz9//+JtaD9//+Ile/9//+E0g+EsgoAAEOJncD9//85tdz9//8PjIkKAACNQuA8WHcPD77CD7aAINlAAIPgD+sCM8CLjbz9//9rwAkPtoQIQNlAAGoIwegEXomFvP3//zvGD4Tv/v//agdZO8EPhyAKAAD/JIXfh0AAM8CDjej9////iYWM/f//iYWk/f//iYXI/f//iYXM/f//iYXw/f//iYXE/f//6ecJAAAPvsKD6CB0SIPoA3Q0K8Z0JEhIdBSD6AMPhckJAAAJtfD9///pvgkAAION8P3//wTpsgkAAION8P3//wHppgkAAIGN8P3//4AAAADplwkAAION8P3//wLpiwkAAID6KnUsg8cEib3k/f//i3/8ib3I/f//hf8PiWwJAACDjfD9//8E953I/f//6VoJAACLhcj9//9rwAoPvsqNRAjQiYXI/f//6T8JAACDpej9//8A6TMJAACA+ip1JoPHBIm95P3//4t//Im96P3//4X/D4kUCQAAg43o/f///+kICQAAi4Xo/f//a8AKD77KjUQI0ImF6P3//+ntCAAAgPpJdFWA+mh0RID6bHQYgPp3D4XVCAAAgY3w/f//AAgAAOnGCAAAgDtsdRZDgY3w/f//ABAAAImdwP3//+mrCAAAg43w/f//EOmfCAAAg43w/f//IOmTCAAAigM8NnUegHsBNHUYg8MCgY3w/f//AIAAAImdwP3//+lvCAAAPDN1HoB7ATJ1GIPDAoGl8P3///9///+JncD9///pTQgAADxkD4RFCAAAPGkPhD0IAAA8bw+ENQgAADx1D4QtCAAAPHgPhCUIAAA8WA+EHQgAAIOlvP3//wCDpcT9//8AjYWs/f//UA+2wlDoLRUAAFmFwIqF7/3//1l0IouN0P3//4213P3//+ib+///igNDiZ3A/f//hMAPhJX8//+LjdD9//+Ntdz9///oefv//+m7BwAAD77Cg/hkD4+3AQAAD4RVAgAAg/hTD4+6AAAAdEyD6EF0EEhIdCRISHQISEgPhagFAACAwiDHhYz9//8BAAAAiJXv/f//6VMCAAD3hfD9//8wCAAAD4WeAAAAgY3w/f//AAgAAOmPAAAA94Xw/f//MAgAAHUKgY3w/f//AAgAAIuN6P3//4P5/3UFuf///3+DxwT3hfD9//8QCAAAib3k/f//i3/8ib3g/f//D4T7BAAAhf91C6E0/kAAiYXg/f//i4Xg/f//x4XE/f//AQAAAOnJBAAAg+hYD4QcAwAASEh0fyvBD4SzAQAASEgPhegEAACLveT9//+DxwT3hfD9//8QCAAAib3k/f//dDAPt0f8UGgAAgAAjYX0/f//UI2F2P3//1Do5zUAAIPEEIXAdB/HhaT9//8BAAAA6xOKR/yIhfT9///Hhdj9//8BAAAAjYX0/f//iYXg/f//6XkEAACLB4PHBIm95P3//4XAdDyLSASFyXQ194Xw/f//AAgAAA+/AImN4P3//3QUmSvC0fjHhcT9//8BAAAA6TQEAACDpcT9//8A6SgEAAChMP5AAImF4P3//1DowfX//1npEQQAAIP4cA+PNgIAAA+EIgIAAIP4ZQ+M/wMAAIP4Zw+OswAAAIP4aXR4g/hudCqD+G8PheMDAAD2hfD9//+Ai73k/f//ibXY/f//dGyBjfD9//8AAgAA62CDheT9//8Ei4Xk/f//i3D86HYRAACFwA+ESvr///aF8P3//yB0DGaLhdz9//9miQbrCIuF3P3//4kGx4Wk/f//AQAAAOk+BQAAi73k/f//g43w/f//QMeF2P3//woAAACLjfD9///3wQCAAAAPhN0BAAAD/otH+ItX/OkJAgAAi73k/f//g43w/f//QIO96P3//wCNnfT9//+4AAIAAImd4P3//4mFmP3//30Mx4Xo/f//BgAAAOtqdRGA+md1Y8eF6P3//wEAAADrVzmF6P3//34GiYXo/f//gb3o/f//owAAAH49i7Xo/f//gcZdAQAAVujP2f//ipXv/f//WYmFoP3//4XAdBCJheD9//+JtZj9//+L2OsKx4Xo/f//owAAAIsHizVYwEAAg8cIiYWA/f//i0f8iYWE/f//jYWs/f//UP+1jP3//w++wv+16P3//4m95P3//1D/tZj9//+NhYD9//9TUP81QPVAAP/W/9CLvfD9//+DxByB54AAAAB0HYO96P3//wB1FI2FrP3//1BT/zVM9UAA/9b/0FlZgL3v/f//Z3UYhf91FI2FrP3//1BT/zVI9UAA/9b/0FlZgDstdRGBjfD9//8AAQAAQ4md4P3//1PpxP3//4m16P3//4mNqP3//+sqg+hzD4R0/P//SEgPhFv+//+D6AMPhb4BAACLveT9///Hhaj9//8nAAAA9oXw/f//gMeF2P3//xAAAAAPhDX+//+Khaj9//8EUcaF1P3//zCIhdX9///Hhcz9//8CAAAA6RH+///3wQAQAAAPhRf+//+DxwT2wSB0GIm95P3///bBQHQGD79H/OsED7dH/JnrE4tH/PbBQHQDmesCM9KJveT9///2wUB0G4XSfxd8BIXAcxH32IPSAPfagY3w/f//AAEAAPeF8P3//wCQAACL+ovYdQIz/4O96P3//wB9DMeF6P3//wEAAADrGoOl8P3///e4AAIAADmF6P3//34GiYXo/f//i8MLx3UGIYXM/f//jXXzi4Xo/f///43o/f//hcB/BovDC8d0LYuF2P3//5lSUFdT6AIQAACDwTCJnZj9//+L2Iv6g/k5fgYDjaj9//+IDk7rvY1F8yvGRveF8P3//wACAACJhdj9//+JteD9//90Y4XAdAeLzoA5MHRY/43g/f//i43g/f//xgEwQOtASWaDOAB0B4PAAoXJdfIrheD9///R+Osohf91C6Ew/kAAiYXg/f//i4Xg/f//6wdJgDgAdAVAhcl19SuF4P3//4mF2P3//4O9pP3//wAPhbgBAACLjfD9///2wUB0NffBAAEAAHQJxoXU/f//Lesa9sEBdAnGhdT9//8r6wz2wQJ0EcaF1P3//yDHhcz9//8BAAAAi4XI/f//K4XY/f//K4XM/f//iYWY/f//9sEMdSWL+Osdi43Q/f//jbXc/f//sCBP6Bj1//+Dvdz9////dASF/3/f/7XM/f//i72c/f//i53Q/f//jYXU/f//UI2F3P3//+ga9f//9oXw/f//CFlZdC72hfD9//8EdSWLvZj9///rGY213P3//4vLsDBP6Lv0//+Dvdz9////dASF/3/jg73E/f//AIuF2P3//3R1hcB+cYu14P3//4mFkP3//w+3Bv+NkP3//1BqBo1F9FCNhYj9//9Qg8YC6A0wAACDxBCFwHU2OYWI/f//dC7/tYj9//+LvZz9//+LndD9//+NRfRQjYXc/f//6HP0//+DvZD9//8AWVl1pusjg43c/f///+sai72c/f//UP+14P3//42F3P3//+hF9P//WVmDvdz9//8AfDL2hfD9//8EdCmLvZj9///rHYuN0P3//4213P3//7AgT+ji8///g73c/f///3QEhf9/34O9oP3//wB0E/+1oP3//+jilP//g6Wg/f//AFmLncD9//+KA4iF7/3//4TAdA+LveT9//8z9orQ6WT1//+Dvbz9//8AdA2Dvbz9//8HD4WN9P//gL24/f//AHQKi4W0/f//g2Bw/YuF3P3//4tN/F9eM81b6FeQ///Jw41JAGd/QABkfUAAln1AAPJ9QAA+fkAASn5AAJB+QADCf0AAi/9Vi+xRUYtFDFaLdQiJRfiLRRBXVolF/OjVGgAAg8//WTvHdRHo1qb//8cACQAAAIvHi9frSv91FI1N/FH/dfhQ/xXUwEAAiUX4O8d1E/8VPMBAAIXAdAlQ6Mim//9Z68+LxsH4BYsEhaANQQCD5h/B5gaNRDAEgCD9i0X4i1X8X17Jw2oUaAjiQADowKb//4PL/4ld3Ild4ItFCIP4/nUc6G2m//+DIADoUqb//8cACQAAAIvDi9PpoQAAAIXAeAg7BYANQQByGuhFpv//gyAA6Cqm///HAAkAAADozaX//+vRi8jB+QWNPI2gDUEAi/CD5h/B5gaLDw++TDEEg+EBdMZQ6FIaAABZg2X8AIsH9kQwBAF0HP91FP91EP91DP91COjX/v//g8QQiUXciVXg6xnoyKX//8cACQAAAOjQpf//gyAAiV3ciV3gx0X8/v///+gMAAAAi0Xci1Xg6DKm///D/3UI6I4aAABZw4v/VYvsuOQaAADowy0AAKEE8EAAM8WJRfyLRQxWi3UIVzP/iYU05f//ib045f//ib0w5f//OX0QdQczwOmuBgAAO8d1H+hbpf//iTjoQaX//8cAFgAAAOjkpP//g8j/6YsGAACLxsH4BYv+U40chaANQQCLA4PnH8HnBopMOCQCydD5iZ0k5f//iI0/5f//gPkCdAWA+QF1J4tNEPfR9sEBdR3o/aT//4MgAOjipP//xwAWAAAA6IWk///pHQYAAPZEOAQgdA9qAmoAagBW6L79//+DxBBW6D4HAABZhcAPhJkCAACLA/ZEBwSAD4SMAgAA6C6u//+LQGwzyTlIFI2FIOX//w+UwVCLA/80B4vx/xUYwUAAM8k7wQ+EYAIAADvxdAw4jT/l//8PhFACAAD/FRTBQACLnTTl//+JhSDl//8zwImFLOX//zlFEA+GIwUAAImFQOX//4qFP+X//4TAD4VnAQAAiguLtSTl//8zwID5Cg+UwImFHOX//4sGA8eDeDgAdBWKUDSIVfSITfWDYDgAagKNRfRQ60sPvsFQ6NAJAABZhcB0OouNNOX//yvLA00QM8BAO8gPhqUBAABqAo2FROX//1NQ6FQJAACDxAyD+P8PhJIEAABD/4VA5f//6xtqAVONhUTl//9Q6DAJAACDxAyD+P8PhG4EAAAzwFBQagWNTfRRagGNjUTl//9RUP+1IOX//0P/hUDl////FeDAQACL8IX2D4Q9BAAAagCNhSzl//9QVo1F9FCLhSTl//+LAP80B/8VwMBAAIXAD4QKBAAAi4VA5f//i40w5f//A8GJhTjl//85tSzl//8PjPYDAACDvRzl//8AD4TNAAAAagCNhSzl//9QagGNRfRQi4Uk5f//iwDGRfQN/zQH/xXAwEAAhcAPhLEDAACDvSzl//8BD4ywAwAA/4Uw5f///4U45f//6YMAAAA8AXQEPAJ1IQ+3MzPJg/4KD5TBg8MCg4VA5f//Aom1ROX//4mNHOX//zwBdAQ8AnVS/7VE5f//6HgqAABZZjuFROX//w+FSQMAAIOFOOX//wKDvRzl//8AdClqDVhQiYVE5f//6EsqAABZZjuFROX//w+FHAMAAP+FOOX///+FMOX//4tFEDmFQOX//w+C+f3//+kIAwAAiw6KE/+FOOX//4hUDzSLDolEDzjp7wIAADPJiwP2RDgEgA+EoQIAAIC9P+X//wCJjUTl//8PhagAAACLnTTl//85TRAPhv0CAACLyzP2K4005f//jYVI5f//O00QcyaKE0NBiZ0g5f//gPoKdQv/hTDl///GAA1ARogQQEaB/v8TAABy1YvwjYVI5f//K/BqAI2FKOX//1BWjYVI5f//UIuFJOX//4sA/zQH/xXAwEAAhcAPhEMCAACLhSjl//8BhTjl//87xg+MOwIAAIvDK4U05f//O0UQD4Js////6SUCAACAvT/l//8CD4XNAAAAi5005f//OU0QD4ZIAgAAg6VA5f//AIvLK4005f//agKNhUjl//9eO00Qc0MPtxMD3gPOiZ0g5f//g/oKdRoBtTDl//9qDVtmiRiLnSDl//8DxgG1QOX//wG1QOX//2aJEAPGgb1A5f///hMAAHK4i/CNhUjl//8r8GoAjYUo5f//UFaNhUjl//9Qi4Uk5f//iwD/NAf/FcDAQACFwA+EaQEAAIuFKOX//wGFOOX//zvGD4xhAQAAi8MrhTTl//87RRAPgkf////pSwEAAIuFNOX//4mFLOX//zlNEA+GdQEAAIuNLOX//4OlQOX//wArjTTl//9qAo2FSPn//147TRBzO4uVLOX//w+3EgG1LOX//wPOg/oKdQ5qDVtmiRgDxgG1QOX//wG1QOX//2aJEAPGgb1A5f//qAYAAHLAM/ZWVmhVDQAAjY3w6///UY2NSPn//yvBmSvC0fhQi8FQVmjp/QAA/xXgwEAAi9g73g+ElwAAAGoAjYUo5f//UIvDK8ZQjYQ18Ov//1CLhSTl//+LAP80B/8VwMBAAIXAdAwDtSjl//873n/L6wz/FTzAQACJhUTl//873n9ci4Us5f//K4U05f//iYU45f//O0UQD4IL////6z9RjY0o5f//Uf91EP+1NOX///80OP8VwMBAAIXAdBWLhSjl//+DpUTl//8AiYU45f//6wz/FTzAQACJhUTl//+DvTjl//8AdWyDvUTl//8AdC1qBV45tUTl//91FOgDn///xwAJAAAA6Auf//+JMOs//7VE5f//6A+f//9Z6zGLhSTl//+LAPZEBwRAdA+LhTTl//+AOBp1BDPA6yTow57//8cAHAAAAOjLnv//gyAAg8j/6wyLhTjl//8rhTDl//9bi038XzPNXujIh///ycNqEGgo4kAA6Nme//+LXQiD+/51G+iPnv//gyAA6HSe///HAAkAAACDyP/plAAAAIXbeAg7HYANQQByGuhonv//gyAA6E2e///HAAkAAADo8J3//+vSi8PB+AWNPIWgDUEAi/OD5h/B5gaLBw++RDAEg+ABdMZT6HUSAABZg2X8AIsH9kQwBAF0FP91EP91DFPobvj//4PEDIlF5OsX6POd///HAAkAAADo+53//4MgAINN5P/HRfz+////6AwAAACLReToYp7//8OLXQhT6L0SAABZw4v/VYvs/wVEAkEAaAAQAADoTMv//1mLTQiJQQiFwHQNg0kMCMdBGAAQAADrEYNJDASNQRSJQQjHQRgCAAAAi0EIg2EEAIkBXcOL/1WL7ItFCIP4/nUP6Gad///HAAkAAAAzwF3DhcB4CDsFgA1BAHIS6Eud///HAAkAAADo7pz//+vei8iD4B/B+QWLDI2gDUEAweAGD75EAQSD4EBdw4v/VYvsg+wQoQTwQAAzxYlF/FNWi3UM9kYMQFcPhTYBAABW6Gq8//9Zu1j2QACD+P90LlboWbz//1mD+P50IlboTbz//8H4BVaNPIWgDUEA6D28//+D4B9ZweAGAwdZ6wKLw4pAJCR/PAIPhOgAAABW6By8//9Zg/j/dC5W6BC8//9Zg/j+dCJW6AS8///B+AVWjTyFoA1BAOj0u///g+AfWcHgBgMHWesCi8OKQCQkfzwBD4SfAAAAVujTu///WYP4/3QuVujHu///WYP4/nQiVui7u///wfgFVo08haANQQDoq7v//4PgH1nB4AYDB1nrAovD9kAEgHRd/3UIjUX0agVQjUXwUOjoIwAAg8QQhcB0B7j//wAA610z/zl98H4w/04EeBKLBopMPfSICIsOD7YBQYkO6w4PvkQ99FZQ6K2v//9ZWYP4/3TIRzt98HzQZotFCOsgg0YE/ngNiw6LRQhmiQGDBgLrDQ+3RQhWUOgXJAAAWVmLTfxfXjPNW+jOhP//ycOhBPBAAIPIATPJOQVIC0EAD5TBi8HDi/9Vi+yD7BBTVot1DDPbO/N0FTldEHQQOB51EotFCDvDdAUzyWaJCDPAXlvJw/91FI1N8OiAsP//i0XwOVgUdR6LRQg7w3QGD7YOZokIOF38dAeLRfiDYHD9M8BA68uNRfBQD7YGUOjEAAAAWVmFwHR9i0Xwi4isAAAAg/kBfiU5TRB8IDPSOV0ID5XCUv91CFFWagn/cAT/FTDAQACFwItF8HUQi00QO4isAAAAciA4XgF0G4uArAAAADhd/A+EZv///4tN+INhcP3pWv///+iwmv//xwAqAAAAOF38dAeLRfiDYHD9g8j/6Tv///8zwDldCA+VwFD/dQiLRfBqAVZqCf9wBP8VMMBAAIXAD4U6////67qL/1WL7GoA/3UQ/3UM/3UI6NX+//+DxBBdw4v/VYvsg+wQ/3UMjU3w6Hav//8PtkUIi03wi4nIAAAAD7cEQSUAgAAAgH38AHQHi034g2Fw/cnDi/9Vi+xqAP91COi5////WVldw8zMzMzMzMzMzMxWi0QkFAvAdSiLTCQQi0QkDDPS9/GL2ItEJAj38Yvwi8P3ZCQQi8iLxvdkJBAD0etHi8iLXCQQi1QkDItEJAjR6dHb0erR2AvJdfT384vw92QkFIvIi0QkEPfmA9FyDjtUJAx3CHIPO0QkCHYJTitEJBAbVCQUM9srRCQIG1QkDPfa99iD2gCLyovTi9mLyIvGXsIQAIv/VYvs9kAMQHQGg3gIAHQaUP91COgv/P//WVm5//8AAGY7wXUFgw7/XcP/Bl3Di/9Vi+xR9kMMQFaL8IsHiUX8dA2DewgAdQeLRQwBButDgycAg30MAH41i0UID7cA/00MUIvD6Jb///+DRQgCgz7/WXUPgz8qdRBqP4vD6H7///9Zg30MAH/Qgz8AdQWLRfyJB17Jw4v/VYvsgex4BAAAoQTwQAAzxYlF/FOLXRRWi3UIM8BX/3UQi30MjY20+///ibXU+///iZ3k+///iYWs+///iYX4+///iYXY+///iYX0+///iYXc+///iYWw+///iYXQ+///6KKt///oaZj//4mFnPv//4X2dSvoWpj//8cAFgAAAOj9l///gL3A+///AHQKi4W8+///g2Bw/YPI/+ntCgAAM/Y7/nTPD7cXibXo+///ibXs+///ibXE+///ibWo+///iZXg+///ZjvWD4SkCgAAagJZA/mJvaD7//85tej7//8PjHgKAACNQuBmg/hYdw8Pt8IPtoAg2UAAg+AP6wIzwIu1xPv//2vACQ+2hDBA2UAAagjB6AReiYXE+///O8YPhE////+D+AcPhw0KAAD/JIXLoUAAM8CDjfT7////iYWY+///iYWw+///iYXY+///iYXc+///iYX4+///iYXQ+///6eAJAAAPt8KD6CB0SIPoA3Q0K8Z0JCvBdBSD6AMPhbYJAAAJtfj7///ptwkAAION+Pv//wTpqwkAAION+Pv//wHpnwkAAIGN+Pv//4AAAADpkAkAAAmN+Pv//+mFCQAAZoP6KnUriwODwwSJneT7//+Jhdj7//+FwA+JZgkAAION+Pv//wT3ndj7///pVAkAAIuF2Pv//2vACg+3yo1ECNCJhdj7///pOQkAAIOl9Pv//wDpLQkAAGaD+ip1JYsDg8MEiZ3k+///iYX0+///hcAPiQ4JAACDjfT7////6QIJAACLhfT7//9rwAoPt8qNRAjQiYX0+///6ecIAAAPt8KD+El0UYP4aHRAg/hsdBiD+HcPhcwIAACBjfj7//8ACAAA6b0IAABmgz9sdRED+YGN+Pv//wAQAADppggAAION+Pv//xDpmggAAION+Pv//yDpjggAAA+3B4P4NnUZZoN/AjR1EoPHBIGN+Pv//wCAAADpbQgAAIP4M3UZZoN/AjJ1EoPHBIGl+Pv///9////pTwgAAIP4ZA+ERggAAIP4aQ+EPQgAAIP4bw+ENAgAAIP4dQ+EKwgAAIP4eA+EIggAAIP4WA+EGQgAAIOlxPv//wCLhdT7//9SjbXo+///x4XQ+///AQAAAOgX/P//WenwBwAAD7fCg/hkD48xAgAAD4S/AgAAg/hTD48cAQAAdH+D6EF0ECvBdForwXQIK8EPheEFAACDwiDHhZj7//8BAAAAiZXg+///i430+///g434+///QI29/Pv//7gAAgAAib3w+///iYXs+///hckPiY4CAADHhfT7//8GAAAA6d4CAAD3hfj7//8wCAAAD4XJAAAAg434+///IOm9AAAA94X4+///MAgAAHUHg434+///IIu99Pv//4P//3UFv////3+DwwT2hfj7//8giZ3k+///i1v8iZ3w+///D4T5BAAAhdt1C6Ew/kAAiYXw+///g6Xs+///AIu18Pv//4X/D44RBQAAigaEwA+EBwUAAI2NtPv//w+2wFFQ6Av6//9ZWYXAdAFGRv+F7Pv//zm97Pv//3zQ6dwEAACD6FgPhN8CAAArwQ+ElQAAAIPoBw+E9P7//yvBD4W6BAAAD7cDg8MEM/ZG9oX4+///IIm10Pv//4md5Pv//4mFpPv//3RCiIXI+///jYW0+///UIuFtPv//8aFyfv//wD/sKwAAACNhcj7//9QjYX8+///UOhH+P//g8QQhcB5D4m1sPv//+sHZomF/Pv//42F/Pv//4mF8Pv//4m17Pv//+k2BAAAiwODwwSJneT7//+FwHQ6i0gEhcl0M/eF+Pv//wAIAAAPvwCJjfD7//90EpkrwseF0Pv//wEAAADp8QMAAIOl0Pv//wDp5wMAAKEw/kAAiYXw+///UOiF2///WenQAwAAg/hwD4/lAQAAD4TNAQAAg/hlD4y+AwAAg/hnD47n/f//g/hpdG6D+G50JIP4bw+FogMAAPaF+Pv//4CJteD7//90YoGN+Pv//wACAADrVoPDBImd5Pv//4tb/OhE9///hcAPhHj6///2hfj7//8gdAxmi4Xo+///ZokD6wiLhej7//+JA8eFsPv//wEAAADp9wQAAION+Pv//0DHheD7//8KAAAA94X4+///AIAAAA+EmQEAAAPei0P4i1P86dUBAAB1EmaD+md1V8eF9Pv//wEAAADrSzvIfgiJhfT7//+LyIH5owAAAH43jbFdAQAAVujpv///i5Xg+///WYmFqPv//4XAdBCJhfD7//+Jtez7//+L+OsKx4X0+///owAAAIsDizVYwEAAg8MIiYWQ+///i0P8iYWU+///jYW0+///UP+1mPv//w++wv+19Pv//4md5Pv//1D/tez7//+NhZD7//9XUP81QPVAAP/W/9CLnfj7//+DxByB44AAAAB0HYO99Pv//wB1FI2FtPv//1BX/zVM9UAA/9b/0FlZZoO94Pv//2d1GIXbdRSNhbT7//9QV/81SPVAAP/W/9BZWYA/LXURgY34+///AAEAAEeJvfD7//9X6Rn+//+JtfT7///Hhaz7//8HAAAA6ySD6HMPhHv8//8rwQ+EnP7//4PoAw+FzgEAAMeFrPv//ycAAAD2hfj7//+Ax4Xg+///EAAAAA+EfP7//2owWGaJhcz7//+Lhaz7//+DwFFmiYXO+///iY3c+///6Vf+///3hfj7//8AEAAAD4VX/v//g8ME9oX4+///IHQc9oX4+///QImd5Pv//3QGD79D/OsED7dD/JnrF/aF+Pv//0CLQ/x0A5nrAjPSiZ3k+///9oX4+///QHQbhdJ/F3wEhcBzEffYg9IA99qBjfj7//8AAQAA94X4+///AJAAAIv6i9h1AjP/g730+///AH0Mx4X0+///AQAAAOsag6X4+///97gAAgAAOYX0+///fgaJhfT7//+LwwvHdQYhhdz7//+Ntfv9//+LhfT7////jfT7//+FwH8Gi8MLx3Qti4Xg+///mVJQV1PoBfb//4PBMImdjPv//4vYi/qD+Tl+BgONrPv//4gOTuu9jYX7/f//K8ZG94X4+///AAIAAImF7Pv//4m18Pv//3RehcB0B4vGgDgwdFP/jfD7//+LhfD7////hez7///GADDrPIXbdQuhNP5AAImF8Pv//4uF8Pv//8eF0Pv//wEAAADrCU9mgzgAdAYDwYX/dfMrhfD7///R+ImF7Pv//4O9sPv//wAPhagBAACLhfj7//+oQHQrqQABAAB0BGot6w6oAXQEaivrBqgCdBRqIFlmiY3M+///x4Xc+///AQAAAIu92Pv//yu97Pv//yu93Pv//4m94Pv//6gMdSTrHouF1Pv//2ogjbXo+///T+iK9f//g73o+////1l0BIX/f97/tdz7//+LvZz7//+LndT7//+Nhcz7//9QjYXo+///6If1///2hfj7//8IWVl0L/aF+Pv//wR1Jou94Pv//+saajCNtej7//+Lw0/oLPX//4O96Pv///9ZdASF/3/ig73Q+///AHVri53s+///hdt+YYu98Pv//42FtPv//1CLhbT7////sKwAAACNhaT7//9XUEvoyvL//4PEEImFjPv//4XAfiT/taT7//+LhdT7//+Ntej7///owPT//wO9jPv//1mF23+w6y6Djej7////6yX/tez7//+LvZz7////tfD7//+LndT7//+Nhej7///otvT//1lZg73o+///AHwz9oX4+///BHQqi73g+///6x6LhdT7//9qII216Pv//0/oV/T//4O96Pv///9ZdASF/3/eg72o+///AHQT/7Wo+///6Pd6//+Dpaj7//8AWYu9oPv//4ud5Pv//w+3BzP2iYXg+///ZjvGdAeL0Olx9f//ObXE+///dA2DvcT7//8HD4UB9f//gL3A+///AHQKi4W8+///g2Bw/YuF6Pv//4tN/F9eM81b6Gt2///Jw41JAGKZQABil0AAlJdAAO+XQAA7mEAAR5hAAI2YQACEmUAAi/9Vi+yLRQhWV4XAeFk7BYANQQBzUYvIwfkFi/CD5h+NPI2gDUEAiw/B5gaDPA7/dTWDPQDwQAABU4tdDHUeg+gAdBBIdAhIdRNTavTrCFNq9esDU2r2/xUcwUAAiweJHAYzwFvrFuipjP//xwAJAAAA6LGM//+DIACDyP9fXl3Di/9Vi+yLTQhTM9tWVzvLfFs7DYANQQBzU4vBwfgFi/GD5h+NPIWgDUEAiwfB5gb2RDAEAXQ2gzww/3Qwgz0A8EAAAXUdK8t0EEl0CEl1E1Nq9OsIU2r16wNTavb/FRzBQACLB4MMBv8zwOsV6COM///HAAkAAADoK4z//4kYg8j/X15bXcOL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FOjSbv///3YY6Mpu////NujDbv///3Yg6Ltu////diTos27///92KOirbv///3Ys6KNu////djDom27///92NOiTbv///3Yc6Itu////djjog27///92POh7bv//g8RA/3ZA6HBu////dkToaG7///92SOhgbv///3ZM6Fhu////dlDoUG7///92VOhIbv///3ZY6EBu////dlzoOG7///92YOgwbv///3Zk6Chu////dmjoIG7///92bOgYbv///3Zw6BBu////dnToCG7///92eOgAbv///3Z86Pht//+DxED/toAAAADo6m3///+2hAAAAOjfbf///7aIAAAA6NRt////towAAADoyW3///+2kAAAAOi+bf///7aUAAAA6LNt////tpgAAADoqG3///+2nAAAAOidbf///7agAAAA6JJt////tqQAAADoh23///+2qAAAAOh8bf///7a8AAAA6HFt////tsAAAADoZm3///+2xAAAAOhbbf///7bIAAAA6FBt////tswAAADoRW3//4PEQP+20AAAAOg3bf///7a4AAAA6Cxt////ttgAAADoIW3///+23AAAAOgWbf///7bgAAAA6Att////tuQAAADoAG3///+26AAAAOj1bP///7bsAAAA6Ops////ttQAAADo32z///+28AAAAOjUbP///7b0AAAA6Mls////tvgAAADovmz///+2/AAAAOizbP///7YAAQAA6Khs////tgQBAADonWz///+2CAEAAOiSbP//g8RA/7YMAQAA6IRs////thABAADoeWz///+2FAEAAOhubP///7YYAQAA6GNs////thwBAADoWGz///+2IAEAAOhNbP///7YkAQAA6EJs////tigBAADoN2z///+2LAEAAOgsbP///7YwAQAA6CFs////tjQBAADoFmz///+2OAEAAOgLbP///7Y8AQAA6ABs////tkABAADo9Wv///+2RAEAAOjqa////7ZIAQAA6N9r//+DxED/tkwBAADo0Wv///+2UAEAAOjGa////7ZUAQAA6Ltr////tlgBAADosGv///+2XAEAAOila////7ZgAQAA6Jpr//+DxBheXcOL/1WL7FaLdQiF9nRZiwY7BVj+QAB0B1Dod2v//1mLRgQ7BVz+QAB0B1DoZWv//1mLRgg7BWD+QAB0B1DoU2v/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AEkATAAgAGMAbwBkAGUAIABmAHIAbwBtACAAdABoAGkAcwAgAGEAcwBzAGUAbQBiAGwAeQAgAGQAdQByAGkAbgBnACAAbgBhAHQAaQB2AGUAIABjAG8AZABlACAAaQBuAGkAdABpAGEAbABpAHoAYQB0AGkAbwBuAAoAVABoAGkAcwAgAGkAbgBkAGkAYwBhAHQAZQBzACAAYQAgAGIAdQBnACAAaQBuACAAeQBvAHUAcgAgAGEAcABwAGwAaQBjAGEAdABpAG8AbgAuACAASQB0ACAAaQBzACAAbQBvAHMAdAAgAGwAaQBrAGUAbAB5ACAAdABoAGUAIAByAGUAcwB1AGwAdAAgAG8AZgAgAGMAYQBsAGwAaQBuAGcAIABhAG4AIABNAFMASQBMAC0AYwBvAG0AcABpAGwAZQBkACAAKAAvAGMAbAByACkAIABmAHUAbgBjAHQAaQBvAG4AIABmAHIAbwBtACAAYQAgAG4AYQB0AGkAdgBlACAAYwBvAG4AcwB0AHIAdQBjAHQAbwByACAAbwByACAAZgByAG8AbQAgAEQAbABsAE0AYQBpAG4ALgANAAoAAAAAAFIANgAwADMAMgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGwAbwBjAGEAbABlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuAA0ACgAAAAAAUgA2ADAAMwAxAA0ACgAtACAAQQB0AHQAZQBtAHAAdAAgAHQAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAIAB0AGgAZQAgAEMAUgBUACAAbQBvAHIAZQAgAHQAaABhAG4AIABvAG4AYwBlAC4ACgBUAGgAaQBzACAAaQBuAGQAaQBjAGEAdABlAHMAIABhACAAYgB1AGcAIABpAG4AIAB5AG8AdQByACAAYQBwAHAAbABpAGMAYQB0AGkAbwBuAC4ADQAKAAAAAABSADYAMAAzADAADQAKAC0AIABDAFIAVAAgAG4AbwB0ACAAaQBuAGkAdABpAGEAbABpAHoAZQBkAA0ACgAAAAAAUgA2ADAAMgA4AA0ACgAtACAAdQBuAGEAYgBsAGUAIAB0AG8AIABpAG4AaQB0AGkAYQBsAGkAegBlACAAaABlAGEAcAANAAoAAAAAAAAAAABSADYAMAAyADcADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABsAG8AdwBpAG8AIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ADQAKAAAAAAAAAAAAUgA2ADAAMgA2AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAcwB0AGQAaQBvACAAaQBuAGkAdABpAGEAbABpAHoAYQB0AGkAbwBuAA0ACgAAAAAAAAAAAFIANgAwADIANQANAAoALQAgAHAAdQByAGUAIAB2AGkAcgB0AHUAYQBsACAAZgB1AG4AYwB0AGkAbwBuACAAYwBhAGwAbAANAAoAAAAAAAAAUgA2ADAAMgA0AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAXwBvAG4AZQB4AGkAdAAvAGEAdABlAHgAaQB0ACAAdABhAGIAbABlAA0ACgAAAAAAAAAAAFIANgAwADEAOQANAAoALQAgAHUAbgBhAGIAbABlACAAdABvACAAbwBwAGUAbgAgAGMAbwBuAHMAbwBsAGUAIABkAGUAdgBpAGMAZQANAAoAAAAAAAAAAABSADYAMAAxADgADQAKAC0AIAB1AG4AZQB4AHAAZQBjAHQAZQBkACAAaABlAGEAcAAgAGUAcgByAG8AcgANAAoAAAAAAAAAAABSADYAMAAxADcADQAKAC0AIAB1AG4AZQB4AHAAZQBjAHQAZQBkACAAbQB1AGwAdABpAHQAaAByAGUAYQBkACAAbABvAGMAawAgAGUAcgByAG8AcgANAAoAAAAAAAAAAABSADYAMAAxADYADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIAB0AGgAcgBlAGEAZAAgAGQAYQB0AGEADQAKAAAAUgA2ADAAMQAwAA0ACgAtACAAYQBiAG8AcgB0ACgAKQAgAGgAYQBzACAAYgBlAGUAbgAgAGMAYQBsAGwAZQBkAA0ACgAAAAAAUgA2ADAAMAA5AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AA0ACgAAAFIANgAwADAAOAANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGEAcgBnAHUAbQBlAG4AdABzAA0ACgAAAAAAAABSADYAMAAwADIADQAKAC0AIABmAGwAbwBhAHQAaQBuAGcAIABwAG8AaQBuAHQAIABzAHUAcABwAG8AcgB0ACAAbgBvAHQAIABsAG8AYQBkAGUAZAANAAoAAAAAAAAAAAACAAAAgMpAAAgAAAAoykAACQAAANDJQAAKAAAAiMlAABAAAAAwyUAAEQAAANDIQAASAAAAiMhAABMAAAAwyEAAGAAAAMDHQAAZAAAAcMdAABoAAAAAx0AAGwAAAJDGQAAcAAAAQMZAAB4AAAAAxkAAHwAAADjFQAAgAAAA0MRAACEAAADgwkAAeAAAALzCQAB5AAAAoMJAAHoAAACEwkAA/AAAAHzCQAD/AAAAXMJAAE0AaQBjAHIAbwBzAG8AZgB0ACAAVgBpAHMAdQBhAGwAIABDACsAKwAgAFIAdQBuAHQAaQBtAGUAIABMAGkAYgByAGEAcgB5AAAAAAAKAAoAAAAAAC4ALgAuAAAAPABwAHIAbwBnAHIAYQBtACAAbgBhAG0AZQAgAHUAbgBrAG4AbwB3AG4APgAAAAAAUgB1AG4AdABpAG0AZQAgAEUAcgByAG8AcgAhAAoACgBQAHIAbwBnAHIAYQBtADoAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAaAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEBgQGBAYEBgQGBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEQABAAEAAQABAAEACCAYIBggGCAYIBggECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBEAAQABAAEAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAUABQAEAAQABAAEAAQABQAEAAQABAAEAAQABAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARAAAQEBAQEBAQEBAQEBAQECAQIBAgECAQIBAgECAQIBAgEC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AC4AZQB4AGUAAAAAAEV4cGVjdGVkIHRvIGZpbmQgYSBjb21tYW5kIGVuZGluZyBpbiAnLmV4ZScgaW4gc2hlYmFuZyBsaW5lLgAAAAAAAAAARXhwZWN0ZWQgdGVybWluYXRpbmcgZG91YmxlLXF1b3RlIGZvciBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZS4AAAAAAAAAVGVybWluYXRpbmcgcXVvdGUgd2l0aG91dCBzdGFydGluZyBxdW90ZSBmb3IgZXhlY3V0YWJsZSBpbiBzaGViYW5nIGxpbmUuAAAAAEZhaWxlZCB0byBmaW5kIHNoZWJhbmcAAEV4cGVjdGVkIHRvIGZpbmQgdGVybWluYXRvciBpbiBzaGViYW5nIGxpbmUARXhwZWN0ZWQgdG8gZGVjb2RlIHNoZWJhbmcgbGluZSB1c2luZyBVVEYtOABFeHBlY3RlZCB0byBmaW5kICcjJyBhdCBzdGFydCBvZiBzaGViYW5nIGxpbmUAAABFeHBlY3RlZCB0byBmaW5kICchJyBmb2xsb3dpbmcgJyMnIGluIHNoZWJhbmcgbGluZQAARXhwZWN0ZWQgdG8gZmluZCBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZQBFeHBlY3RlZCB0byBmaW5kIGFyZ3VtZW50cyAoZXZlbiBpZiBlbXB0eSkgaW4gc2hlYmFuZyBsaW5lAABFeHBlY3RlZCB0byBiZSBhYmxlIHRvIGFsbG9jYXRlIGNvbW1hbmQgbGluZSBtZW1vcnkAIgAlAHMAIgAgACUAcwAgACIAJQBzACIAIAAlAHMAAAAAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPBAANDeQAADAAAAUlNEU6ctt0pARdpMkzSjehel4eICAAAAQzpcVXNlcnNcVmluYXlcUHJvamVjdHNcc2ltcGxlX2xhdW5jaGVyXFJlbGVhc2VcR1VJU2ltcGxlTGF1bmNoZXIucGRiAAAAsC8AANAxAAAQaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAD0GEAAAAAAAP7///8AAAAAwP///wAAAAD+////AAAAANobQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAgSBAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADsIkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAPIjQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA0iRAAAAAAAD+////AAAAAIj///8AAAAA/v///zUmQABJJkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAABgtQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAAzRAAAAAAAD+////AAAAANj///8AAAAA/v///180QABjNEAAAAAAAP7///8AAAAAwP///wAAAAD+////AAAAAEw2QAAAAAAA/v///wAAAADY////AAAAAP7///8AAAAAAjhAAP7///8AAAAAEThAAP7///8AAAAA2P///wAAAAD+////AAAAAMQ5QAD+////AAAAANA5QAD+////AAAAANT///8AAAAA/v///wAAAAB0PEAAAAAAAP7///8AAAAA2P///wAAAAD+////Gz5AAC4+QAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAZU5AAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAANU0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAJlUQAAAAAAAAAAAAGVUQAD+////AAAAAND///8AAAAA/v///wAAAAAAVkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAABJeQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAA4WVAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAAOcEAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAANVyQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAp3ZAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAABkiUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAADSRQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA7KNAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAACxpUAAAAAAAAAAAADtpEAA/v///wAAAADQ////AAAAAP7///8AAAAAUqdAAOjiAAAAAAAAAAAAANjlAAAAwAAAKOQAAAAAAAAAAAAA8uUAAEDBAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDkAAA+5AAAUOQAAGrkAAB45AAAiuQAAJ7kAAC05AAA0OQAAOzkAAAC5QAAGOUAADTlAABK5QAAXuUAAG7lAAB+5QAAkOUAAKDlAAC45QAAyuUAAP7lAAAS5gAAIuYAAC7mAAA65gAATOYAAF7mAAB05gAAhuYAAJrmAAC25gAA1OYAAOjmAAAA5wAAGOcAAEDnAABQ5wAAXOcAAHTnAACE5wAAkOcAAJ7nAACs5wAAtucAAM7nAADe5wAA9OcAAAzoAAAY6AAAJugAADLoAABE6AAAUugAAGToAAB66AAAlOgAAKroAADE6AAA3ugAAO7oAAAE6QAAHukAACbpAAA06QAAQOkAAErpAABW6QAAaOkAAHTpAACE6QAAlukAAKbpAADC6QAA1ukAAOTpAAD06QAABuoAABbqAAAAAAAA5uUAAAAAAAAZAUV4aXRQcm9jZXNzAIcBR2V0Q29tbWFuZExpbmVXAHEEU2V0SW5mb3JtYXRpb25Kb2JPYmplY3QAYgFGcmVlTGlicmFyeQCoAENyZWF0ZVByb2Nlc3NXAADAAUdldEN1cnJlbnRQcm9jZXNzAPkEV2FpdEZvclNpbmdsZU9iamVjdABnAUdlbmVyYXRlQ29uc29sZUN0cmxFdmVudAAAFgBBc3NpZ25Qcm9jZXNzVG9Kb2JPYmplY3QAAN8BR2V0RXhpdENvZGVQcm9jZXNzAAAUAkdldE1vZHVsZUZpbGVOYW1lVwAApQNRdWVyeUluZm9ybWF0aW9uSm9iT2JqZWN0AGcDTXVsdGlCeXRlVG9XaWRlQ2hhcgCVAENyZWF0ZUpvYk9iamVjdEEAAGQCR2V0U3RkSGFuZGxlAAACAkdldExhc3RFcnJvcgAARQJHZXRQcm9jQWRkcmVzcwAAPANMb2FkTGlicmFyeUEAAC0EU2V0Q29uc29sZUN0cmxIYW5kbGVyAOgARHVwbGljYXRlSGFuZGxlAFIAQ2xvc2VIYW5kbGUAS0VSTkVMMzIuZGxsAABFAVN0clN0cklXAABTSExXQVBJLmRsbAAYAkdldE1vZHVsZUhhbmRsZVcAAMoARGVjb2RlUG9pbnRlcgDPAkhlYXBGcmVlAADLAkhlYXBBbGxvYwBpAkdldFN0cmluZ1R5cGVXAACGAUdldENvbW1hbmRMaW5lQQDTAkhlYXBTZXRJbmZvcm1hdGlvbgAAYwJHZXRTdGFydHVwSW5mb1cAwARUZXJtaW5hdGVQcm9jZXNzAADTBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAApQRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAAANJc0RlYnVnZ2VyUHJlc2VudADuAEVudGVyQ3JpdGljYWxTZWN0aW9uAAA5A0xlYXZlQ3JpdGljYWxTZWN0aW9uAADjAkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQA6gBFbmNvZGVQb2ludGVyABgEUnRsVW53aW5kANEARGVsZXRlQ3JpdGljYWxTZWN0aW9uAD8DTG9hZExpYnJhcnlXAADFBFRsc0FsbG9jAADHBFRsc0dldFZhbHVlAMgEVGxzU2V0VmFsdWUAxgRUbHNGcmVlAO8CSW50ZXJsb2NrZWRJbmNyZW1lbnQAAHMEU2V0TGFzdEVycm9yAADFAUdldEN1cnJlbnRUaHJlYWRJZAAA6wJJbnRlcmxvY2tlZERlY3JlbWVudAAAJQVXcml0ZUZpbGUAzQJIZWFwQ3JlYXRlAADAA1JlYWRGaWxlAABvBFNldEhhbmRsZUNvdW50AADzAUdldEZpbGVUeXBlAGYEU2V0RmlsZVBvaW50ZXIAABMCR2V0TW9kdWxlRmlsZU5hbWVBAABhAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXABEFV2lkZUNoYXJUb011bHRpQnl0ZQDaAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKcDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAkwJHZXRUaWNrQ291bnQAAMEBR2V0Q3VycmVudFByb2Nlc3NJZAB5AkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lALIEU2xlZXAAjwBDcmVhdGVGaWxlVwByAUdldENQSW5mbwBoAUdldEFDUAAANwJHZXRPRU1DUAAACgNJc1ZhbGlkQ29kZVBhZ2UA1AJIZWFwU2l6ZQAAmgFHZXRDb25zb2xlQ1AAAKwBR2V0Q29uc29sZU1vZGUAAIcEU2V0U3RkSGFuZGxlAAAEA0lzUHJvY2Vzc29yRmVhdHVyZVByZXNlbnQAVwFGbHVzaEZpbGVCdWZmZXJzAADSAkhlYXBSZUFsbG9jAFMEU2V0RW5kT2ZGaWxlAABKAkdldFByb2Nlc3NIZWFwAAAtA0xDTWFwU3RyaW5nVwAAJAVXcml0ZUNvbnNvbGVXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAABO5kC7sRm/RAAAAADADkEAAAAAAMAOQQABAQAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABYAAAACAAAAAgAAAAMAAAACAAAABAAAABgAAAAFAAAADQAAAAYAAAAJAAAABwAAAAwAAAAIAAAADAAAAAkAAAAMAAAACgAAAAcAAAALAAAACAAAAAwAAAAWAAAADQAAABYAAAAPAAAAAgAAABAAAAANAAAAEQAAABIAAAASAAAAAgAAACEAAAANAAAANQAAAAIAAABBAAAADQAAAEMAAAACAAAAUAAAABEAAABSAAAADQAAAFMAAAANAAAAVwAAABYAAABZAAAACwAAAGwAAAANAAAAbQAAACAAAABwAAAAHAAAAHIAAAAJAAAABgAAABYAAACAAAAACgAAAIEAAAAKAAAAggAAAAkAAACDAAAAFgAAAIQAAAANAAAAkQAAACkAAACeAAAADQAAAKEAAAACAAAApAAAAAsAAACnAAAADQAAALcAAAARAAAAzgAAAAIAAADXAAAACwAAABgHAAAMAAAADAAAAAgAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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/+Pj4//Y2Nj/5+fn/8vLy//19fX/ouz//0TW//9A0v//O8///zfM//8zyP//L8T//yrB//8mvf//Irr//47c///8/PycAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfb29v/u7u7/7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/s7Oz/6+vr/+vr6//r6+v/6urq/+rq6v/q6ur/6enp/+np6f/p6en/6Ojo/+jo6P/o6Oj/5+fn/+Xl5f/+/v7/V97//0fY//9D1f//P9L//zvO//82y///Msj//27X///2/P//ZtH//zC+///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGff39//Hx8eMMzMzItPT04Tu7u7/xMTE/+7u7v/t7e3/7e3t/+3t7f/n5+f/1dXV/+np6f/r6+v/6+vr/+vr6//q6ur/6urq/9DQ0P/Y2Nj/2tra/9fX1//Ozs7/0tLS/7Ozs///////T97//0vb//9H2P//QtT//z7R//86zv//Ncr//3DY///2/P//adP//yS8////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfj4+P8hISE0AAAAFzg4OCbv7+//7+/v/+7u7v/u7u7/7u7u/+3t7f/T09P/yMjI/+jo6P/s7Oz/0dHR/8vLy//r6+v/6+vr/8/Pz//b29v/v7+//8nJyf+/v7//ycnJ/8rKyv//////U+H//07e//9K2v//Rtf//0LU//890P//Oc3//zXK//8wxf//LML//yi/////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfj4+P/BwcGRJSUlNcfHx47w8PD/x8fH/+/v7//v7+//7u7u/+7u7v/u7u7/3t7e/+3t7f/t7e3/7e3t/+zs7P/s7Oz/7Ozs/9DQ0P/e3t7/4ODg/+/v7//6+vr/////////////////VuT//1Lh//9O3f//Sdr//0XX//+w7f/////////////////////////////////////////////////x////mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfn5+f/x8fH/8fHx//Hx8f/x8fH/8PDw//Dw8P/w8PD/7+/v/+/v7//v7+//7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/+/v7/9G5nf+lfEr/mnE//5ZvQP//////Wub//1Xj//9R4P//Td3//0nZ//9E1v//QNP//zzP//83zP//M8n//y/E//8rwf//Jr7//yK6//8tvP//jtz///7//8wAAAAAAAAAAAAAAAAAAAAAAAAAGfn5+f/JycmMNDQ0ItbW1oTx8fH/yMjI//Hx8f/w8PD/8PDw//Dw8P/p6en/19fX/+/v7//u7u7/7u7u/+7u7v/u7u7/7e3t/9LS0v/r6+v/38y0/6d3PP+jdT3/nnM+/5pxP///////Xen//1nm//9V4///UN///0zc//9I2f//Q9X//z/S//87z///N8v//zLI//8uxP//KsD//yW9//8huv//H7j//6rl//////+BAAAAAAAAAAAAAAAAAAAAGfn5+f8iIiI0AAAAFzg4OCby8vL/8vLy//Hx8f/x8fH/8fHx//Dw8P/n5+f/zc3N/+/v7//v7+//09PT/83Nzf/u7u7/7u7u/9LS0v/8/Pz/wJdk/6t5PP+mdz3/onU9/51zPv//////Yez//1zp//9Y5f//VOL//1Df//9L2///R9j//0PV//8+0f//Os7//zbL//8xx///LcP//ynA//8lvP//ILn//0/I///////OAAAAAAAAAAAAAAAAAAAAGfn5+f/Dw8ORJSUlNcrKyo7z8/P/ysrK//Ly8v/y8vL/8vLy//Hx8f/w8PD/39/f//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/9LS0v/+/v7/tYFB/657O/+qeTz/pXc9/6F0Pv//////c+///2Dr//9c6P//V+X//1Ph//9P3v//Stv//0bX//9C1P//PtH//znN//81yv//Mcf//yzC//8ov///JLz//yi7///////3AAAAAAAAAAAAAAAAAAAAGfr6+v/19fX/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/8vLy//Ly8v/y8vL/8fHx//Hx8f/x8fH/8PDw//Dw8P/w8PD/8PDw/+/v7///////t385/7J8Ov+uejv/qXg8/6V2Pf/18Or/1/r//3Pv//9f6///W+f//1fk//9S4f//Tt3//0ra//9F1///QdP//z3Q//84zf//NMn//zDF//8swv//J7///yO7////////AAAAAAAAAAAAAAAAAAAAGfr6+v/MzMyMNTU1ItnZ2YT09PT/y8vL//T09P/n5+f/8/Pz/+bm5v/z8/P/8vLy/+fn5//c3Nz/5OTk/+Tk5P/m5ub/4+Pj/9TU1P//////uoA5/7Z+Of+xfDr/rXo7/6h4PP+8mW//9O/p/////////////////////////////////////////////////+n6//9t2///OMz//zPJ//8vxf//K8H//ye+////////AAAAAAAAAAAAAAAAAAAAGfv7+/8iIiI0AAAAFzo6Oib19fX/9fX1//X19f/X19f/8/Pz/9TU1P/y8vL/8/Pz/+bm5v/R0dH/z8/P/8zMzP/Q0ND/zs7O/9XV1f//////voI4/7mAOf+1fjr/sHw7/6x6O/+ndzz/o3U9/55zPv+acT//lW9A/5FtQf+Ma0L/iGlD/4NnQ/9/ZET/i3Va/97X0P/p+v//O8///zfM//8zyP//LsT//yrB////////AAAAAAAAAAAAAAAAAAAAGfv7+//Hx8eRJSUlNczMzI719fX/zMzM//X19f/V1dX/8vLy/8rKyv/m5ub/9PT0/+fn5//g4OD/5eXl/+Tk5P/k5OT/6urq/9TU1P/+/v7/w4g+/72COP+4gDn/tH06/7B7O/+reTz/p3c8/6J1Pf+ecz7/mXE//5VvQP+QbUH/jGpC/4doQ/+DZkT/fmRF/4t1Wv//////P9L//zrO//82y///Msj//zXF///////3AAAAAAAAAAAAAAAAAAAAGfz8/P/4+Pj/9/f3//f39/+oqKj/q6ur//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Ly8v/9/f3/0J5h/8GDN/+8gTj/uH85/7N9Ov+vezv/qnk8/6Z3Pf+hdT7/nXI+/5hwP/+UbkD/j2xB/4tqQv+GaEP/gmZE/31kRf//////QtT//z7R//86zv//Ncr//17T///////OAAAAAAAAAAAAAAAAAAAAGfz8/P/Pz8+MNTU1Itzc3IT4+Pj/hoaG/6ysrP/39/f/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//T09P/09PT/9PT0//Pz8//4+Pj/6NGz/8KEN//Agzf/u4E4/7d/Of+yfTr/rns7/6l4PP+ldj3/oHQ+/5xyP/+XcED/k25A/45sQf+KakL/hWdD/4FlRP//////Rtf//0HU//890P//Oc3//7Pr//////+BAAAAAAAAAAAAAAAAAAAAGfz8/P8iIiI0AAAAFzs7Oyb4+Pj/9fX1/4iIiP+srKz/9/f3//f39//29vb/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//T09P/09PT//f38/+HBmv/FjEP/v4M4/7uAOf+2fjn/snw6/616O/+oeDz/pHY9/6B0Pv+bcj//l3BA/5JtQf+Oa0H/iWlC/4VnQ///////Sdr//0XW//9M1v//nef///7//8sAAAAAAAAAAAAAAAAAAAAAAAAAGf39/f/JycmRUVFRSm5ubsr39/f/zs7O/8zMzP9+fn7/rKys//j4+P/39/f/9/f3//f39//29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9fX1//v7+//+/v7////////////////////////////////////////////XxK7/mnE//5ZvQP+RbUH/jWtC/4hpQ//////////////////////x////mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGf39/f/z8/P/SEhI/yIiIv+pqan/+vr6/+zs7P+JiYn/dnZ2/6ysrP/4+Pj/+Pj4//f39//39/f/9/f3//b29v/29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9PT0//T09P//////uYA5/7R+Ov+wezv/q3k8/6d3PP+idT3/nnM+/5lxP/+Vb0D/kG1B/4xrQv//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGf7+/v+QkJDBOjo6/ycnJ/9fX1//paWl//n5+f9zc3P/dHR0/4yMjP+oqKj/3d3d/+Xl5f/p6en/+Pj4//f39//39/f/9/f3//b29v/19fX/3Nzc/+bm5v/r6+v/3t7e/9ra2v//////vIE4/8+mdf/8+vf/x6N2/6p5PP+mdz3/onU9/51zPv+ZcD//lG5A/5BsQf//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALy8vA84ODhUAAAAGf7+/v8tLS02ZmZmbmRkZOslJSX/IiIi/6Kiov9PT0//U1NT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9dbW1unb29vs3Nzc2rS0tKJ2dnZqJiYmRAAAADEAAAAi/v7+72fk//9M3P//Rtf//0DT//87zv//Ncr//9Tz///P8f//P8T//////+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwMDAo+bm5vjo6Oj/5+fn/+Xl5f/m5ub/5ubm/+Tk5P/k5OT/3t7e/+Li4v7i4uLz2NjY09DQ0Lr/////VuT//1Hg//9L2///Rdf//z/S//85zf//1fT//9Dy//8ov////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/z8/P/goKCYZSUlFbo6Oj/wsLC/8rKyv/Pz8//zc3N/9zc3P/R0dH/ycnJ/8XFxf/Kysr/ycnJ//////9b6P//VeP//1Df//9K2v//RNb//z7R//84zf//Msj//y3D////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/T09P91dXVue3t7aurq6v/Ozs7/0tLS/9zc3P/V1dX/5+fn/97e3v/i4uL//f39/////////////////2Dr//9a5///VOL//0/e//+08P///////////////////////////////////////////+////+BAAAAAAAAAAAAAAAf9PT0/+zs7P/r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/o6Oj/8PDw/+3l2v+ng1b/lW9A/45sQf//////Yu3//1/q//9Z5v//U+L//03d//9H2P//QtT//zzP//82y///MMX//yvB//8lvP//PMH//9Xy//////+BAAAAAAAAAB/19fX/hISEYZeXl1bs7Oz/7Ozs/+vr6//m5ub/w8PD/+rq6v/6+vr/u5lt/6B0Pv+acT//k25A//////9i7f//Yu3//17q//9Y5f//UuH//0zc//9G2P//QdP//zvP//81yv//L8X//ynA//8kvP//Wcv//////8gAAAAAAAAAH/b29v93d3dufX19au3t7f/t7e3/7Ozs/+vr6//W1tb/6+vr//7+/v+ufkP/pXY9/55zPv+YcD///////2Lt//9i7f//Yez//13p//9X5P//UeD//0vb//9F1///QNL//zrO//80yf//LsT//yi///8rvf//////9gAAAAAAAAAf9/f3//Dw8P/v7+//7+/v/+7u7v/u7u7/7e3t/+3t7f/s7Oz//////7B7O/+peDz/o3Y9/51zPv/07+r/gfH//2Lt//9i7f//Yez//1vo//9W4///UN///0ra//9E1v//P9H//znN//8zyP//LcP//ye+////////AAAAAAAAAB/39/f/hoaGYZmZmVbw8PD/7+/v/+/v7//t7e3/ycnJ/+3t7f//////tX46/657O/+oeDz/onU9/7aXcP/07+n//////////////////////////////////////+r6//9y3///PdH//zfM//8yyP//LML///////8AAAAAAAAAH/j4+P95eXluf39/avHx8f/x8fH/8PDw/+/v7//d3d3/7u7u//////+5gDn/s306/616O/+ndzz/oXU+/5tyP/+Vb0D/j2xB/4lpQv+DZkT/fWRF/3xjRf98Y0X/loJp/+r6//9C1P//PND//zbL//8xx////////wAAAAAAAAAf+Pj4//Pz8//z8/P/8vLy//Ly8v/x8fH/8fHx//Dw8P/w8PD//v7+/8GHP/+4fzn/sn06/6x6O/+mdz3/oHQ+/5pxP/+UbkD/jmtB/4hpQ/+CZkT/fWNF/3xjRf99ZEb//////0fY//9B0///O8///z3M///////2AAAAAAAAAB/5+fn/iYmJYZycnFb09PT/4eHh/+Pj4//u7u7/8vLy/93d3f/y8vL/0qNp/72COP+3fzn/sXw6/6t5PP+ldj3/n3M+/5lxP/+TbkD/jWtC/4doQ/+AZUT/fGNF/3xjRf//////TNz//0bX//9A0///bdv//////8gAAAAAAAAAH/r6+v96enpugYGBavX19f/c3Nz/4ODg/9ra2v/z8/P/3t7e//Hx8f/06Nn/ypNQ/7yBOP+2fjn/sHs7/6p5PP+kdj3/nnM+/5hwP/+SbUH/i2pC/4VnQ/9/ZUT/fGNF//////9Q3///Stv//1zb///c9///////gQAAAAAAAAAf+/v7//f39//29vb/19fX//b29v/19fX/9fX1//T09P/09PT/8/Pz//n5+f/+/v7//////////////////////////////////////9PCr/+QbUH/impC/4RnQ/9+ZEX/////////////////////7////4EAAAAAAAAAAAAAAB/7+/v/i4uLYZ6enlapqan/tbW1/9fX1//y8vL/yMjI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//f39//y8vL/5eXl/7CwsP/X19fty8vLiQAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAA4AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8H4A/4AEAH4AAAB+AAAAfgAAAH4AAAAGAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAABgAAAH4AAAB+AAAAfAAAAHwAAAD+AAAA/gAAAP4AAAH+AAAB/gAAA/4AAAf+AAAP/gAAH/4AAD/+AAB//gAA//ygAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACrq6sfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnZ2dQ5+fn7SioqL2pKSk7qWlpZKmpqYOAAAAAAAAAAAAAAAArKys76urq2+qqqoOAAAAAKWlpQSjo6NJoKCgvq2trf/l5eX//f39///////7+/v/8fHx1gAAAAAAAAAAAAAAAK+vr//BwcH/rq6u+6qqquCoqKj0s7Oz/83Nzf/29vb/rvH//1Pb//890P//P8v//5vi//////+3AAAAAAAAAACzs7P/3Nzc//Pz8//k5OT/5+fn/+np6f/o6Oj//v7+/1/p//9R4P//Rtf//9L0//80x///////9gAAAAAAAAAAtra2/83Nzf/i4uL/7e3t/+3t7f/5+fn//v7+//////9h7f//Wuf//7fy///////////////////////1////trm5uf/d3d3/9vb2//Dw8P/6+vr/0Lyk/5FvRf//////Y+3//2Hs//9Y5f//Td3//0LU//83zP//MMP//5ng//+9vb3/zs7O/+Tk5P/y8vL//v7+/6l+Sf+ZcT//8+/q/5v0//9j7f//YOv//1bj//9L2///QNL//zXK//84xf//wMDA/8bGxv/t7e3/9fX1//////+tejv/onU9/7OVcf/z7+r/////////////////6/v//3bi//8+0f//M8j//7Ozs/+tra3/pKSk/+/v7///////u4ZF/6t5PP+gdD7/lG5A/4lpQv9+ZEX/fWRG/6ycif/r+///R9j//0jS//+vr6//WVlZ/3V1df+xsbH/9vb2/+DEof+2gD3/qXg8/55zPv+SbUH/h2hD/31kRf99ZUf//////1Pf//+o7P//m5ub/39/f/80NDT/fHx8/9zc3P/9/f3//v7+/////////////////9DBsP+FZ0P/fWNF///////////1////tb29vf+hoaH/qKio/01NTf+Wlpb//v7+//39/f//////sX4+/+rg0/+ZcT//jmtB/4VpR//////0AAAAAAAAAADBwcH/z8/P/+Xl5f+5ubn/UlJS/8DAwP/4+Pj/+vr6/97Cov+ygkf/o3U9/514S//Kuqf/////tQAAAAAAAAAAvr6+/97e3v/39/f/+fn5/7u7u/+cnJz/7e3t/+Hh4f/+/v7//f39///////+/v7/7Ozs/wAAAAAAAAAAAAAAALu7u//Ozs7/5OTk//b29v/4+Pj/9/f3/9/f3//6+vr//Pz8/8jIyP/5+fn/zMzM/7+/v38AAAAAAAAAAAAAAAC3t7f/ubm5/7u7u/+9vb3/v7+//8HBwf/Dw8P/xcXF/8jIyP/Jycn/x8fH/8TExH8AAAAAAAAAAAAAAAAAAAAAfgesQRAHrEEAA6xBAAOsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAA6xBAAOsQQAHrEEAB6xBAA+sQQAAAQAHACAgEAABAAQA6AIAAAEAEBAQAAEABAAoAQAAAgAgIAAAAQAIAKgIAAADABAQAAABAAgAaAUAAAQAMDAAAAEAIACoJQAABQAgIAAAAQAgAKgQAAAGABAQAAABACAAaAQAAAcAPGFzc2VtYmx5IHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MSIgbWFuaWZlc3RWZXJzaW9uPSIxLjAiPg0KICA8dHJ1c3RJbmZvIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MyI+DQogICAgPHNlY3VyaXR5Pg0KICAgICAgPHJlcXVlc3RlZFByaXZpbGVnZXM+DQogICAgICAgIDxyZXF1ZXN0ZWRFeGVjdXRpb25MZXZlbCBsZXZlbD0iYXNJbnZva2VyIiB1aUFjY2Vzcz0iZmFsc2UiPjwvcmVxdWVzdGVkRXhlY3V0aW9uTGV2ZWw+DQogICAgICA8L3JlcXVlc3RlZFByaXZpbGVnZXM+DQogICAgPC9zZWN1cml0eT4NCiAgPC90cnVzdEluZm8+DQo8L2Fzc2VtYmx5PlBBUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFEABAAAOAAAAAFMAswEjAfMCYwKzBAMFAwYzCiMMIw1TD8MAYxHjHyMVIyazKVMqoytjLPMtwy8jIPMyYzPTNgM2UzhzOcM7kz1jPlM/MzDzQYNC40NTQ/NEs0WjRfNHE0fzSENMM05TQENV41bDWTNcQ1zTXUNek1BTYbNlI2djaGNss2/jZJN1838jcVODM4QzjAOHI5eDmBOYg5qjkfOic6OjpFOko6XDpmOms6hzqROqc6sjrMOtc63zrvOvU6Bjs/O0k7bzt2O5A7lzvCO2k8bzyBPOM8Ej0YPSc9AAAAIAAA5AAAAAAwzjDmMIAx9DGUMoMzbDTkNAk1GDUgNS01OTVFNUs1XTVlNXA1tzW8NcY1FzaJNo82lTabNqE2pzauNrU2vDbDNso20TbYNuA26DbwNvw2BTcKNxA3GjcjNy43Ojc/N083VDdaN2A3djd9N4Q3ijekN7M3wDfMN9w34zfyN/43CzgvOEE4TzhkOG44lDjHONY43zgDOTI5QTn+OjA7TztuO9E79DsWPCE8VzxnPJE8ojyvPLY8xjzYPN08LT0/PR8+KT42PnQ+ez6I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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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xCBdw8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgDwEAAAAAAC4PAQAAAAAAQA8BAAAAAABaDwEAAAAAAGgPAQAAAAAAeg8BAAAAAACODwEAAAAAAKQPAQAAAAAAwA8BAAAAAADcDwEAAAAAAPIPAQAAAAAACBABAAAAAAAkEAEAAAAAADoQAQAAAAAAThABAAAAAABeEAEAAAAAAG4QAQAAAAAAgBABAAAAAACQEAEAAAAAAKgQAQAAAAAAuhABAAAAAADuEAEAAAAAAAIRAQAAAAAAEhEBAAAAAAAeEQEAAAAAACoRAQAAAAAAPBEBAAAAAABOEQEAAAAAAGARAQAAAAAAdBEBAAAAAACQEQEAAAAAAK4RAQAAAAAAwhEBAAAAAADWEQEAAAAAAPARAQAAAAAABBIBAAAAAAASEgEAAAAAACoSAQAAAAAAQhIBAAAAAABqEgEAAAAAAHoSAQAAAAAAkhIBAAAAAACiEgEAAAAAALASAQAAAAAAvhIBAAAAAADIEgEAAAAAANgSAQAAAAAA7hIBAAAAAAD6EgEAAAAAAAYTAQAAAAAAHBMBAAAAAAAqEwEAAAAAADgTAQAAAAAARBMBAAAAAABWEwEAAAAAAGQTAQAAAAAAdhMBAAAAAACMEwEAAAAAAKYTAQAAAAAAvBMBAAAAAADWEwEAAAAAAPATAQAAAAAAABQBAAAAAAAWFAEAAAAAADAUAQAAAAAAOBQBAAAAAABGFAEAAAAAAFIUAQAAAAAAXBQBAAAAAABoFAEAAAAAAHoUAQAAAAAAhhQBAAAAAACWFAEAAAAAAKgUAQAAAAAAuBQBAAAAAADMFAEAAAAAANoUAQAAAAAA6hQBAAAAAAD8FAEAAAAAAAwVAQAAAAAAAAAAAAAAAADWEAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwCwAQAEAAAD0PgBAAQAAAFCEAEABAAAA1F8AQAEAAAAAAAAAAAAAAAAAAAAAAAAAVM0AQAEAAACgLQBAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMvnUlcAAAAAAgAAAGIAAAB4AQEAeOcAAAAAAABDb3JFeGl0UHJvY2VzcwAAbQBzAGMAbwByAGUAZQAuAGQAbABsAAAAMDQBQAEAAADQNAFAAQAAAGMAYwBzAAAAVQBUAEYALQA4AAAAAAAAAFUAVABGAC0AMQA2AEwARQAAAAAAAAAAAFUATgBJAEMATwBEAEUAAAByAHUAbgB0AGkAbQBlACAAZQByAHIAbwByACAAAAAAAA0ACgAAAAAAVABMAE8AUwBTACAAZQByAHIAbwByAA0ACgAAAAAAAABTAEkATgBHACAAZQByAHIAbwByAA0ACgAAAAAAAAAAAEQATwBNAEEASQBOACAAZQByAHIAbwByAA0ACgAAAAAAUgA2ADAAMwAzAA0ACgAtACAAQQB0AHQAZQBtAHAAdAAgAHQAbwAgAHUAcwBlACAATQBTAEkATAAgAGMAbwBkAGUAIABmAHIAbwBtACAAdABoAGkAcwAgAGEAcwBzAGUAbQBiAGwAeQAgAGQAdQByAGkAbgBnACAAbgBhAHQAaQB2AGUAIABjAG8AZABlACAAaQBuAGkAdABpAGEAbABpAHoAYQB0AGkAbwBuAAoAVABoAGkAcwAgAGkAbgBkAGkAYwBhAHQAZQBzACAAYQAgAGIAdQBnACAAaQBuACAAeQBvAHUAcgAgAGEAcABwAGwAaQBjAGEAdABpAG8AbgAuACAASQB0ACAAaQBzACAAbQBvAHMAdAAgAGwAaQBrAGUAbAB5ACAAdABoAGUAIAByAGUAcwB1AGwAdAAgAG8AZgAgAGMAYQBsAGwAaQBuAGcAIABhAG4AIABNAFMASQBMAC0AYwBvAG0AcABpAGwAZQBkACAAKAAvAGMAbAByACkAIABmAHUAbgBjAHQAaQBvAG4AIABmAHIAbwBtACAAYQAgAG4AYQB0AGkAdgBlACAAYwBvAG4AcwB0AHIAdQBjAHQAbwByACAAbwByACAAZgByAG8AbQAgAEQAbABsAE0AYQBpAG4ALgANAAoAAAAAAFIANgAwADMAMgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGwAbwBjAGEAbABlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuAA0ACgAAAAAAAAAAAAAAAABSADYAMAAzADEADQAKAC0AIABBAHQAdABlAG0AcAB0ACAAdABvACAAaQBuAGkAdABpAGEAbABpAHoAZQAgAHQAaABlACAAQwBSAFQAIABtAG8AcgBlACAAdABoAGEAbgAgAG8AbgBjAGUALgAKAFQAaABpAHMAIABpAG4AZABpAGMAYQB0AGUAcwAgAGEAIABiAHUAZwAgAGkAbgAgAHkAbwB1AHIAIABhAHAAcABsAGkAYwBhAHQAaQBvAG4ALgANAAoAAAAAAFIANgAwADMAMAANAAoALQAgAEMAUgBUACAAbgBvAHQAIABpAG4AaQB0AGkAYQBsAGkAegBlAGQADQAKAAAAAAAAAAAAAAAAAFIANgAwADIAOAANAAoALQAgAHUAbgBhAGIAbABlACAAdABvACAAaQBuAGkAdABpAGEAbABpAHoAZQAgAGgAZQBhAHAADQAKAAAAAAAAAAAAUgA2ADAAMgA3AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAbABvAHcAaQBvACAAaQBuAGkAdABpAGEAbABpAHoAYQB0AGkAbwBuAA0ACgAAAAAAAAAAAFIANgAwADIANgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAHMAdABkAGkAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGEAdABpAG8AbgANAAoAAAAAAAAAAABSADYAMAAyADUADQAKAC0AIABwAHUAcgBlACAAdgBpAHIAdAB1AGEAbAAgAGYAdQBuAGMAdABpAG8AbgAgAGMAYQBsAGwADQAKAAAAAAAAAFIANgAwADIANAANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAF8AbwBuAGUAeABpAHQALwBhAHQAZQB4AGkAdAAgAHQAYQBiAGwAZQANAAoAAAAAAAAAAABSADYAMAAxADkADQAKAC0AIAB1AG4AYQBiAGwAZQAgAHQAbwAgAG8AcABlAG4AIABjAG8AbgBzAG8AbABlACAAZABlAHYAaQBjAGUADQAKAAAAAAAAAAAAAAAAAAAAAABSADYAMAAxADgADQAKAC0AIAB1AG4AZQB4AHAAZQBjAHQAZQBkACAAaABlAGEAcAAgAGUAcgByAG8AcgANAAoAAAAAAAAAAAAAAAAAAAAAAFIANgAwADEANwANAAoALQAgAHUAbgBlAHgAcABlAGMAdABlAGQAIABtAHUAbAB0AGkAdABoAHIAZQBhAGQAIABsAG8AYwBrACAAZQByAHIAbwByAA0ACgAAAAAAAAAAAFIANgAwADEANgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAHQAaAByAGUAYQBkACAAZABhAHQAYQANAAoAAAAAAAAAAAAAAFIANgAwADEAMAANAAoALQAgAGEAYgBvAHIAdAAoACkAIABoAGEAcwAgAGIAZQBlAG4AIABjAGEAbABsAGUAZAANAAoAAAAAAAAAAAAAAAAAUgA2ADAAMAA5AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AA0ACgAAAAAAAAAAAAAAUgA2ADAAMAA4AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAYQByAGcAdQBtAGUAbgB0AHMADQAKAAAAAAAAAAAAAAAAAAAAUgA2ADAAMAAyAA0ACgAtACAAZgBsAG8AYQB0AGkAbgBnACAAcABvAGkAbgB0ACAAcwB1AHAAcABvAHIAdAAgAG4AbwB0ACAAbABvAGEAZABlAGQADQAKAAAAAAAAAAAAAgAAAAAAAAAQ7ABAAQAAAAgAAAAAAAAAsOsAQAEAAAAJAAAAAAAAAFDrAEABAAAACgAAAAAAAAAA6wBAAQAAABAAAAAAAAAAoOoAQAEAAAARAAAAAAAAAEDqAEABAAAAEgAAAAAAAADw6QBAAQAAABMAAAAAAAAAkOkAQAEAAAAYAAAAAAAAACDpAEABAAAAGQAAAAAAAADQ6ABAAQAAABoAAAAAAAAAYOgAQAEAAAAbAAAAAAAAAPDnAEABAAAAHAAAAAAAAACg5wBAAQAAAB4AAAAAAAAAWOcAQAEAAAAfAAAAAAAAAJDmAEABAAAAIAAAAAAAAAAg5gBAAQAAACEAAAAAAAAAMOQAQAEAAAB4AAAAAAAAABDkAEABAAAAeQAAAAAAAADw4wBAAQAAAHoAAAAAAAAA0OMAQAEAAAD8AAAAAAAAAMjjAEABAAAA/wAAAAAAAACo4wBAAQAAAE0AaQBjAHIAbwBzAG8AZgB0ACAAVgBpAHMAdQBhAGwAIABDACsAKwAgAFIAdQBuAHQAaQBtAGUAIABMAGkAYgByAGEAcgB5AAAAAAAKAAoAAAAAAAAAAAAuAC4ALgAAADwAcAByAG8AZwByAGEAbQAgAG4AYQBtAGUAIAB1AG4AawBuAG8AdwBuAD4AAAAAAFIAdQBuAHQAaQBtAGUAIABFAHIAcgBvAHIAIQAKAAoAUAByAG8AZwByAGEAbQA6ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAKAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEAgQCBAIEAgQCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAQABAAEAAQABAAEACCAIIAggCCAIIAggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEAAQABAAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgAGgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAYEBgQGBAYEBgQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBEAAQABAAEAAQABAAggGCAYIBggGCAYIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECARAAEAAQABAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAFAAUABAAEAAQABAAEAAUABAAEAAQABAAEAAQAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEQAAEBAQEBAQEBAQEBAQEBAgECAQIBAgECAQIBAgECAQIB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bmcgZmFpbGVkAEpvYiBpbmZvcm1hdGlvbiBzZXR0aW5nIGZhaWxlZAAAc3RkaW4gZHVwbGljYXRpb24gZmFpbGVkAAAAAAAAAABzdGRvdXQgZHVwbGljYXRpb24gZmFpbGVkAAAAAAAAAHN0ZGVyciBkdXBsaWNhdGlvbiBmYWlsZWQAAAAAAAAAVW5hYmxlIHRvIGNyZWF0ZSBwcm9jZXNzIHVzaW5nICclcycAAAAAAEZhaWxlZCB0byBnZXQgZXhpdCBjb2RlIG9mIHByb2Nlc3MAAAAAAAAuAGUAeABlAAAAAAAAAAAARXhwZWN0ZWQgdG8gZmluZCBhIGNvbW1hbmQgZW5kaW5nIGluICcuZXhlJyBpbiBzaGViYW5nIGxpbmUuAAAAAAAAAAAAAAAARXhwZWN0ZWQgdGVybWluYXRpbmcgZG91YmxlLXF1b3RlIGZvciBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZS4AAAAAAAAAAAAAAAAAAABUZXJtaW5hdGluZyBxdW90ZSB3aXRob3V0IHN0YXJ0aW5nIHF1b3RlIGZvciBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZS4AAAAAAAAAAEZhaWxlZCB0byBmaW5kIHNoZWJhbmcAAEV4cGVjdGVkIHRvIGZpbmQgdGVybWluYXRvciBpbiBzaGViYW5nIGxpbmUAAAAAAEV4cGVjdGVkIHRvIGRlY29kZSBzaGViYW5nIGxpbmUgdXNpbmcgVVRGLTgAAAAAAEV4cGVjdGVkIHRvIGZpbmQgJyMnIGF0IHN0YXJ0IG9mIHNoZWJhbmcgbGluZQAAAEV4cGVjdGVkIHRvIGZpbmQgJyEnIGZvbGxvd2luZyAnIycgaW4gc2hlYmFuZyBsaW5lAAAAAAAARXhwZWN0ZWQgdG8gZmluZCBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZQAAAAAARXhwZWN0ZWQgdG8gZmluZCBhcmd1bWVudHMgKGV2ZW4gaWYgZW1wdHkpIGluIHNoZWJhbmcgbGluZQAAAAAAAEV4cGVjdGVkIHRvIGJlIGFibGUgdG8gYWxsb2NhdGUgY29tbWFuZCBsaW5lIG1lbW9yeQAAAAAAIgAlAHMAIgAgACUAcwAgACIAJQBzACIAIAAlAHMAAABSU0RTqpfJ5m++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aXRGb3JTaW5nbGVPYmplY3QAbQFHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQAABYAQXNzaWduUHJvY2Vzc1RvSm9iT2JqZWN0AADmAUdldEV4aXRDb2RlUHJvY2VzcwAAGgJHZXRNb2R1bGVGaWxlTmFtZVcAAKcDUXVlcnlJbmZvcm1hdGlvbkpvYk9iamVjdABpA011bHRpQnl0ZVRvV2lkZUNoYXIAlQBDcmVhdGVKb2JPYmplY3RBAABrAkdldFN0ZEhhbmRsZQAACAJHZXRMYXN0RXJyb3IAAEwCR2V0UHJvY0FkZHJlc3MAAD4DTG9hZExpYnJhcnlBAAA7BFNldENvbnNvbGVDdHJsSGFuZGxlcgDsAER1cGxpY2F0ZUhhbmRsZQBSAENsb3NlSGFuZGxlAEtFUk5FTDMyLmRsbAAARQFTdHJTdHJJVwAAU0hMV0FQSS5kbGwAHgJHZXRNb2R1bGVIYW5kbGVXAADLAERlY29kZVBvaW50ZXIA1wJIZWFwRnJlZQAA0wJIZWFwQWxsb2MAcAJHZXRTdHJpbmdUeXBlVwAAjAFHZXRDb21tYW5kTGluZUEAagJHZXRTdGFydHVwSW5mb1cAzgRUZXJtaW5hdGVQcm9jZXNzAADiBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAswRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAAgNJc0RlYnVnZ2VyUHJlc2VudAAmBFJ0bFZpcnR1YWxVbndpbmQAAB8EUnRsTG9va3VwRnVuY3Rpb25FbnRyeQAAGARSdGxDYXB0dXJlQ29udGV4dAAlBFJ0bFVud2luZEV4APIARW50ZXJDcml0aWNhbFNlY3Rpb24AADsDTGVhdmVDcml0aWNhbFNlY3Rpb24AAOsCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudADuAEVuY29kZVBvaW50ZXIA0gBEZWxldGVDcml0aWNhbFNlY3Rpb24AQQNMb2FkTGlicmFyeVcAAFoBRmxzR2V0VmFsdWUAWwFGbHNTZXRWYWx1ZQBZAUZsc0ZyZWUAgARTZXRMYXN0RXJyb3IAAMsBR2V0Q3VycmVudFRocmVhZElkAABYAUZsc0FsbG9jAAA0BVdyaXRlRmlsZQDbAkhlYXBTZXRJbmZvcm1hdGlvbgAAqgJHZXRWZXJzaW9uAADVAkhlYXBDcmVhdGUAAMMDUmVhZEZpbGUAAHwEU2V0SGFuZGxlQ291bnQAAPoBR2V0RmlsZVR5cGUAdARTZXRGaWxlUG9pbnRlcgAAGQJHZXRNb2R1bGVGaWxlTmFtZUEAAGcBRnJlZUVudmlyb25tZW50U3RyaW5nc1cAIAVXaWRlQ2hhclRvTXVsdGlCeXRlAOEBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAAqQNRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgCaAkdldFRpY2tDb3VudAAAxwFHZXRDdXJyZW50UHJvY2Vzc0lkAIACR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAwARTbGVlcACPAENyZWF0ZUZpbGVXAHgBR2V0Q1BJbmZvAG4BR2V0QUNQAAA+AkdldE9FTUNQAAAMA0lzVmFsaWRDb2RlUGFnZQDcAkhlYXBTaXplAACgAUdldENvbnNvbGVDUAAAsgFHZXRDb25zb2xlTW9kZQAAlARTZXRTdGRIYW5kbGUAAF0BRmx1c2hGaWxlQnVmZmVycwAA2gJIZWFwUmVBbGxvYwBhBFNldEVuZE9mRmlsZQAAUQJHZXRQcm9jZXNzSGVhcAAALwNMQ01hcFN0cmluZ1cAADMFV3JpdGVDb25zb2xlVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAADKi3y2ZKwAAzV0g0mbU//8AAAAAAAAAAEBIAUABAAAAAAAAAAAAAABASAFAAQAAAAEBAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAWAAAAAgAAAAIAAAADAAAAAgAAAAQAAAAYAAAABQAAAA0AAAAGAAAACQAAAAcAAAAMAAAACAAAAAwAAAAJAAAADAAAAAoAAAAHAAAACwAAAAgAAAAMAAAAFgAAAA0AAAAWAAAADwAAAAIAAAAQAAAADQAAABEAAAASAAAAEgAAAAIAAAAhAAAADQAAADUAAAACAAAAQQAAAA0AAABDAAAAAgAAAFAAAAARAAAAUgAAAA0AAABTAAAADQAAAFcAAAAWAAAAWQAAAAsAAABsAAAADQAAAG0AAAAgAAAAcAAAABwAAAByAAAACQAAAAYAAAAWAAAAgAAAAAoAAACBAAAACgAAAIIAAAAJAAAAgwAAABYAAACEAAAADQAAAJEAAAApAAAAngAAAA0AAAChAAAAAgAAAKQAAAALAAAApwAAAA0AAAC3AAAAEQAAAM4AAAACAAAA1wAAAAsAAAAYBwAADAAAAAwAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAALSEAEABAAAAtIQAQAEAAAC0hABAAQAAALSEAEABAAAAtIQAQAEAAAC0hABAAQAAALSEAEABAAAAtIQAQAEAAAC0hABAAQAAALSEAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAwMDAwMDAwMAAAAAAAAAAKDvAEABAAAAovEAQAEAAAD//////////4AKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAABDAAAAAAAAAAAAAAAAAAAAMPsAQAEAAAAs+wBAAQAAACj7AEABAAAAJPsAQAEAAAAg+wBAAQAAABz7AEABAAAAGPsAQAEAAAAQ+wBAAQAAAAj7AEABAAAAAPsAQAEAAADw+gBAAQAAAOD6AEABAAAA1PoAQAEAAADI+gBAAQAAAMT6AEABAAAAwPoAQAEAAAC8+gBAAQAAALj6AEABAAAAtPoAQAEAAACw+gBAAQAAAKz6AEABAAAAqPoAQAEAAACk+gBAAQAAAKD6AEABAAAAnPoAQAEAAACY+gBAAQAAAJD6AEABAAAAgPoAQAEAAAB0+gBAAQAAAGz6AEABAAAAtPoAQAEAAABk+gBAAQAAAFz6AEABAAAAVPoAQAEAAABI+gBAAQAAAED6AEABAAAAMPoAQAEAAAAg+gBAAQAAABj6AEABAAAAFPoAQAEAAAAI+gBAAQAAAPD5AEABAAAA4PkAQAEAAAAJBAAAAQAAAAAAAAAAAAAA2PkAQAEAAADQ+QBAAQAAAMj5AEABAAAAwPkAQAEAAAC4+QBAAQAAALD5AEABAAAAqPkAQAEAAACY+QBAAQAAAIj5AEABAAAAePkAQAEAAABg+QBAAQAAAEj5AEABAAAAOPkAQAEAAAAg+QBAAQAAABj5AEABAAAAEPkAQAEAAAAI+QBAAQAAAAD5AEABAAAA+PgAQAEAAADw+ABAAQAAAOj4AEABAAAA4PgAQAEAAADY+ABAAQAAAND4AEABAAAAyPgAQAEAAADA+ABAAQAAALD4AEABAAAAmPgAQAEAAACI+ABAAQAAAHj4AEABAAAA+PgAQAEAAABo+ABAAQAAAFj4AEABAAAASPgAQAEAAAAw+ABAAQAAACD4AEABAAAACPgAQAEAAADw9wBAAQAAAOT3AEABAAAA3PcAQAEAAADI9wBAAQAAAKD3AEABAAAAiPcAQAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGApAUABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYCkBQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgKQFAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGApAUABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYCkBQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAUABAAAAAAAAAAAAAAAAAAAAAAAAAKDvAEABAAAAMPQAQAEAAACw9QBAAQAAAHApAUABAAAAMCwBQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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7P/s7Oz/7Ozs/9DQ0P/e3t7/4ODg/+/v7//6+vr/////////////////VuT//1Lh//9O3f//Sdr//0XX//+w7f/////////////////////////////////////////////////x////mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfn5+f/x8fH/8fHx//Hx8f/x8fH/8PDw//Dw8P/w8PD/7+/v/+/v7//v7+//7u7u/+7u7v/u7u7/7e3t/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/+/v7/9G5nf+lfEr/mnE//5ZvQP//////Wub//1Xj//9R4P//Td3//0nZ//9E1v//QNP//zzP//83zP//M8n//y/E//8rwf//Jr7//yK6//8tvP//jtz///7//8wAAAAAAAAAAAAAAAAAAAAAAAAAGfn5+f/JycmMNDQ0ItbW1oTx8fH/yMjI//Hx8f/w8PD/8PDw//Dw8P/p6en/19fX/+/v7//u7u7/7u7u/+7u7v/u7u7/7e3t/9LS0v/r6+v/38y0/6d3PP+jdT3/nnM+/5pxP///////Xen//1nm//9V4///UN///0zc//9I2f//Q9X//z/S//87z///N8v//zLI//8uxP//KsD//yW9//8huv//H7j//6rl//////+BAAAAAAAAAAAAAAAAAAAAGfn5+f8iIiI0AAAAFzg4OCby8vL/8vLy//Hx8f/x8fH/8fHx//Dw8P/n5+f/zc3N/+/v7//v7+//09PT/83Nzf/u7u7/7u7u/9LS0v/8/Pz/wJdk/6t5PP+mdz3/onU9/51zPv//////Yez//1zp//9Y5f//VOL//1Df//9L2///R9j//0PV//8+0f//Os7//zbL//8xx///LcP//ynA//8lvP//ILn//0/I///////OAAAAAAAAAAAAAAAAAAAAGfn5+f/Dw8ORJSUlNcrKyo7z8/P/ysrK//Ly8v/y8vL/8vLy//Hx8f/w8PD/39/f//Dw8P/w8PD/8PDw/+/v7//v7+//7+/v/9LS0v/+/v7/tYFB/657O/+qeTz/pXc9/6F0Pv//////c+///2Dr//9c6P//V+X//1Ph//9P3v//Stv//0bX//9C1P//PtH//znN//81yv//Mcf//yzC//8ov///JLz//yi7///////3AAAAAAAAAAAAAAAAAAAAGfr6+v/19fX/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/8vLy//Ly8v/y8vL/8fHx//Hx8f/x8fH/8PDw//Dw8P/w8PD/8PDw/+/v7///////t385/7J8Ov+uejv/qXg8/6V2Pf/18Or/1/r//3Pv//9f6///W+f//1fk//9S4f//Tt3//0ra//9F1///QdP//z3Q//84zf//NMn//zDF//8swv//J7///yO7////////AAAAAAAAAAAAAAAAAAAAGfr6+v/MzMyMNTU1ItnZ2YT09PT/y8vL//T09P/n5+f/8/Pz/+bm5v/z8/P/8vLy/+fn5//c3Nz/5OTk/+Tk5P/m5ub/4+Pj/9TU1P//////uoA5/7Z+Of+xfDr/rXo7/6h4PP+8mW//9O/p/////////////////////////////////////////////////+n6//9t2///OMz//zPJ//8vxf//K8H//ye+////////AAAAAAAAAAAAAAAAAAAAGfv7+/8iIiI0AAAAFzo6Oib19fX/9fX1//X19f/X19f/8/Pz/9TU1P/y8vL/8/Pz/+bm5v/R0dH/z8/P/8zMzP/Q0ND/zs7O/9XV1f//////voI4/7mAOf+1fjr/sHw7/6x6O/+ndzz/o3U9/55zPv+acT//lW9A/5FtQf+Ma0L/iGlD/4NnQ/9/ZET/i3Va/97X0P/p+v//O8///zfM//8zyP//LsT//yrB////////AAAAAAAAAAAAAAAAAAAAGfv7+//Hx8eRJSUlNczMzI719fX/zMzM//X19f/V1dX/8vLy/8rKyv/m5ub/9PT0/+fn5//g4OD/5eXl/+Tk5P/k5OT/6urq/9TU1P/+/v7/w4g+/72COP+4gDn/tH06/7B7O/+reTz/p3c8/6J1Pf+ecz7/mXE//5VvQP+QbUH/jGpC/4doQ/+DZkT/fmRF/4t1Wv//////P9L//zrO//82y///Msj//zXF///////3AAAAAAAAAAAAAAAAAAAAGfz8/P/4+Pj/9/f3//f39/+oqKj/q6ur//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/09PT/9PT0//Pz8//z8/P/8/Pz//Ly8v/9/f3/0J5h/8GDN/+8gTj/uH85/7N9Ov+vezv/qnk8/6Z3Pf+hdT7/nXI+/5hwP/+UbkD/j2xB/4tqQv+GaEP/gmZE/31kRf//////QtT//z7R//86zv//Ncr//17T///////OAAAAAAAAAAAAAAAAAAAAGfz8/P/Pz8+MNTU1Itzc3IT4+Pj/hoaG/6ysrP/39/f/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//T09P/09PT/9PT0//Pz8//4+Pj/6NGz/8KEN//Agzf/u4E4/7d/Of+yfTr/rns7/6l4PP+ldj3/oHQ+/5xyP/+XcED/k25A/45sQf+KakL/hWdD/4FlRP//////Rtf//0HU//890P//Oc3//7Pr//////+BAAAAAAAAAAAAAAAAAAAAGfz8/P8iIiI0AAAAFzs7Oyb4+Pj/9fX1/4iIiP+srKz/9/f3//f39//29vb/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//T09P/09PT//f38/+HBmv/FjEP/v4M4/7uAOf+2fjn/snw6/616O/+oeDz/pHY9/6B0Pv+bcj//l3BA/5JtQf+Oa0H/iWlC/4VnQ///////Sdr//0XW//9M1v//nef///7//8sAAAAAAAAAAAAAAAAAAAAAAAAAGf39/f/JycmRUVFRSm5ubsr39/f/zs7O/8zMzP9+fn7/rKys//j4+P/39/f/9/f3//f39//29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9fX1//v7+//+/v7////////////////////////////////////////////XxK7/mnE//5ZvQP+RbUH/jWtC/4hpQ//////////////////////x////mgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGf39/f/z8/P/SEhI/yIiIv+pqan/+vr6/+zs7P+JiYn/dnZ2/6ysrP/4+Pj/+Pj4//f39//39/f/9/f3//b29v/29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9PT0//T09P//////uYA5/7R+Ov+wezv/q3k8/6d3PP+idT3/nnM+/5lxP/+Vb0D/kG1B/4xrQv//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGf7+/v+QkJDBOjo6/ycnJ/9fX1//paWl//n5+f9zc3P/dHR0/4yMjP+oqKj/3d3d/+Xl5f/p6en/+Pj4//f39//39/f/9/f3//b2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AAAAAAAAAAAABwAAABghISEwXFxcSmVlZVE2NjZENTU1QQAAADAAAAAkAAAAFQAAAAoAAAACAAAAAP///4Hd+P//duL//0jW//88z///Nsv//zDF//8yw///XM7//9by//////+BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABwFBQU3gYGBcenp6fjm5ub/4eHh9dbW1unb29vs3Nzc2rS0tKJ2dnZqJiYmRAAAADEAAAAi/v7+72fk//9M3P//Rtf//0DT//87zv//Ncr//9Tz///P8f//P8T//////+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwMDAo+bm5vjo6Oj/5+fn/+Xl5f/m5ub/5ubm/+Tk5P/k5OT/3t7e/+Li4v7i4uLz2NjY09DQ0Lr/////VuT//1Hg//9L2///Rdf//z/S//85zf//1fT//9Dy//8ov////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/z8/P/goKCYZSUlFbo6Oj/wsLC/8rKyv/Pz8//zc3N/9zc3P/R0dH/ycnJ/8XFxf/Kysr/ycnJ//////9b6P//VeP//1Df//9K2v//RNb//z7R//84zf//Msj//y3D////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/T09P91dXVue3t7aurq6v/Ozs7/0tLS/9zc3P/V1dX/5+fn/97e3v/i4uL//f39/////////////////2Dr//9a5///VOL//0/e//+08P///////////////////////////////////////////+////+BAAAAAAAAAAAAAAAf9PT0/+zs7P/r6+v/6+vr/+rq6v/q6ur/6enp/+np6f/o6Oj/8PDw/+3l2v+ng1b/lW9A/45sQf//////Yu3//1/q//9Z5v//U+L//03d//9H2P//QtT//zzP//82y///MMX//yvB//8lvP//PMH//9Xy//////+BAAAAAAAAAB/19fX/hISEYZeXl1bs7Oz/7Ozs/+vr6//m5ub/w8PD/+rq6v/6+vr/u5lt/6B0Pv+acT//k25A//////9i7f//Yu3//17q//9Y5f//UuH//0zc//9G2P//QdP//zvP//81yv//L8X//ynA//8kvP//Wcv//////8gAAAAAAAAAH/b29v93d3dufX19au3t7f/t7e3/7Ozs/+vr6//W1tb/6+vr//7+/v+ufkP/pXY9/55zPv+YcD///////2Lt//9i7f//Yez//13p//9X5P//UeD//0vb//9F1///QNL//zrO//80yf//LsT//yi///8rvf//////9gAAAAAAAAAf9/f3//Dw8P/v7+//7+/v/+7u7v/u7u7/7e3t/+3t7f/s7Oz//////7B7O/+peDz/o3Y9/51zPv/07+r/gfH//2Lt//9i7f//Yez//1vo//9W4///UN///0ra//9E1v//P9H//znN//8zyP//LcP//ye+////////AAAAAAAAAB/39/f/hoaGYZmZmVbw8PD/7+/v/+/v7//t7e3/ycnJ/+3t7f//////tX46/657O/+oeDz/onU9/7aXcP/07+n//////////////////////////////////////+r6//9y3///PdH//zfM//8yyP//LML///////8AAAAAAAAAH/j4+P95eXluf39/avHx8f/x8fH/8PDw/+/v7//d3d3/7u7u//////+5gDn/s306/616O/+ndzz/oXU+/5tyP/+Vb0D/j2xB/4lpQv+DZkT/fWRF/3xjRf98Y0X/loJp/+r6//9C1P//PND//zbL//8xx////////wAAAAAAAAAf+Pj4//Pz8//z8/P/8vLy//Ly8v/x8fH/8fHx//Dw8P/w8PD//v7+/8GHP/+4fzn/sn06/6x6O/+mdz3/oHQ+/5pxP/+UbkD/jmtB/4hpQ/+CZkT/fWNF/3xjRf99ZEb//////0fY//9B0///O8///z3M///////2AAAAAAAAAB/5+fn/iYmJYZycnFb09PT/4eHh/+Pj4//u7u7/8vLy/93d3f/y8vL/0qNp/72COP+3fzn/sXw6/6t5PP+ldj3/n3M+/5lxP/+TbkD/jWtC/4doQ/+AZUT/fGNF/3xjRf//////TNz//0bX//9A0///bdv//////8gAAAAAAAAAH/r6+v96enpugYGBavX19f/c3Nz/4ODg/9ra2v/z8/P/3t7e//Hx8f/06Nn/ypNQ/7yBOP+2fjn/sHs7/6p5PP+kdj3/nnM+/5hwP/+SbUH/i2pC/4VnQ/9/ZUT/fGNF//////9Q3///Stv//1zb///c9///////gQAAAAAAAAAf+/v7//f39//29vb/19fX//b29v/19fX/9fX1//T09P/09PT/8/Pz//n5+f/+/v7//////////////////////////////////////9PCr/+QbUH/impC/4RnQ/9+ZEX/////////////////////7////4EAAAAAAAAAAAAAAB/7+/v/i4uLYZ6enlapqan/tbW1/9fX1//y8vL/yMjI/9TU1P/b29v/9PT0/97e3v/q6ur/8vLy//////+0fTr/rno7/6h4PP+idT3/m3I//5VvQP+PbEH/iWlC/4NmRP//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/z8/P98fHxuh4eHbff39/+Pj4//w8PD/+jo6P/k5OT/5+fn/+7u7v/19fX/8PDw//Ly8v/09PT//////7mAOf/u4tT/7eLW/6d3Pf+gdD7/mnE//5RuQP+ObEH/iGlD//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/f39/6SkpP9KSkr/+fn5/8bGxv9/f3//1tbW//j4+P/39/f/9/f3//b29v/29vb/9fX1//X19f/+/v7/xZFQ//Dk1P/v49b/q3k8/6V2Pf+fdD7/mXE//5NuQP+bfln/////7gAAAAAAAAAAAAAAAAAAAAAAAAAA1tbWAgAAAB/9/f3/VlZW4T8/P/93d3f/q6ur/2lpaf+Kior/wMDA//n5+f/v7+//3d3d//f39//w8PD/19fX/+Tk5P/z6Nr/zqFr/7mDQf+wfDv/qnk8/6R2Pf+ieUb/spVw/+vk3P////+BAAAAAAAAAAAAAAAAAAAAAAAAAAA+Pj4zQEBAef7+/v9+fn5vYmJixzAwMP9ra2v/QEBA/46Ojv+2trb/+vr6//j4+P/09PT/+Pj4//Ly8v/i4uL/3t7e//b29v/9/f3///////////////////////7+/v/y8vLS+/v7gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtLS1VnJyc/9DQ0P/V1dX/gICA/zw8PP8mJib/W1tb/+/v7//7+/v/+vr6//r6+v/6+vr/+fn5//j4+P/4+Pj/9/f3//f39//29vb/9PT0/+zs7P/j4+P/2NjY/wAAADYAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/Q0ND/dXV16nNz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//83zP//MMP//5ng//+9vb3/zs7O/+Tk5P/y8vL//v7+/6l+Sf+ZcT//8+/q/5v0//9j7f//YOv//1bj//9L2///QNL//zXK//84xf//wMDA/8bGxv/t7e3/9fX1//////+tejv/onU9/7OVcf/z7+r/////////////////6/v//3bi//8+0f//M8j//7Ozs/+tra3/pKSk/+/v7///////u4ZF/6t5PP+gdD7/lG5A/4lpQv9+ZEX/fWRG/6ycif/r+///R9j//0jS//+vr6//WVlZ/3V1df+xsbH/9vb2/+DEof+2gD3/qXg8/55zPv+SbUH/h2hD/31kRf99ZUf//////1Pf//+o7P//m5ub/39/f/80NDT/fHx8/9zc3P/9/f3//v7+/////////////////9DBsP+FZ0P/fWNF///////////1////tb29vf+hoaH/qKio/01NTf+Wlpb//v7+//39/f//////sX4+/+rg0/+ZcT//jmtB/4VpR//////0AAAAAAAAAADBwcH/z8/P/+Xl5f+5ubn/UlJS/8DAwP/4+Pj/+vr6/97Cov+ygkf/o3U9/514S//Kuqf/////tQAAAAAAAAAAvr6+/97e3v/39/f/+fn5/7u7u/+cnJz/7e3t/+Hh4f/+/v7//f39///////+/v7/7Ozs/wAAAAAAAAAAAAAAALu7u//Ozs7/5OTk//b29v/4+Pj/9/f3/9/f3//6+vr//Pz8/8jIyP/5+fn/zMzM/7+/v38AAAAAAAAAAAAAAAC3t7f/ubm5/7u7u/+9vb3/v7+//8HBwf/Dw8P/xcXF/8jIyP/Jycn/x8fH/8TExH8AAAAAAAAAAAAAAAAAAAAAfgesQRAHrEEAA6xBAAOsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAA6xBAAOsQQAHrEEAB6xBAA+sQQAAAQAHACAgEAABAAQA6AIAAAEAEBAQAAEABAAoAQAAAgAgIAAAAQAIAKgIAAADABAQAAABAAgAaAUAAAQAMDAAAAEAIACoJQAABQAgIAAAAQAgAKgQAAAGABAQAAABACAAaAQAAAcAPGFzc2VtYmx5IHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MSIgbWFuaWZlc3RWZXJzaW9uPSIxLjAiPg0KICA8dHJ1c3RJbmZvIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MyI+DQogICAgPHNlY3VyaXR5Pg0KICAgICAgPHJlcXVlc3RlZFByaXZpbGVnZXM+DQogICAgICAgIDxyZXF1ZXN0ZWRFeGVjdXRpb25MZXZlbCBsZXZlbD0iYXNJbnZva2VyIiB1aUFjY2Vzcz0iZmFsc2UiPjwvcmVxdWVzdGVkRXhlY3V0aW9uTGV2ZWw+DQogICAgICA8L3JlcXVlc3RlZFByaXZpbGVnZXM+DQogICAgPC9zZWN1cml0eT4NCiAgPC90cnVzdEluZm8+DQo8L2Fzc2VtYmx5PlBBUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFEAOAAAEQAAACworiiwKLIouCi6KJYo2CjeKyIrJisqKy4rMis2KzorPisCK0YrSitOK1IrVitaK14rYitmK2orbityK0AIAEA6AAAACCgMKCgp6insKe4p8CnyKfQp9in4Kfop/Co+KhwqXipgKmIqZCpmKmgqaipsKm4qcCpyKnQqdip4KnoqfCp+KkAqgiqEKoYqiCqKKowqjiqQKpIqlCqWKpgqmiqcKp4qoCqiKqQqpiqoKqoqrCquKrAqtiq4KroqvCq+KoAqwirEKsYqyCrKKswqzirQKtIq1CrWKtgq2ircKt4q4CriKuQq5iroKuoq7CruKvAq8ir0KvYq+Cr6Kvwq/irAKwIrBCsGKwgrCismKy4rNis+KwYrVitcK14rYCtiK2QrQAAADABADgAAADQodCi2KLooviiAKMIoxCjGKMgoyijMKM4o0CjSKNYo2CjaKNwo3ijgKOIo5CjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBLAwQUAAAAAAAAACEAX9SgqcuYAADLmAAALAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL3doZWVsLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMy0yMDE2IFZpbmF5IFNhamlwLgojIExpY2Vuc2VkIHRvIHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciBhIGNvbnRyaWJ1dG9yIGFncmVlbWVudC4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCgppbXBvcnQgYmFzZTY0CmltcG9ydCBjb2RlY3MKaW1wb3J0IGRhdGV0aW1lCmltcG9ydCBkaXN0dXRpbHMudXRpbApmcm9tIGVtYWlsIGltcG9ydCBtZXNzYWdlX2Zyb21fZmlsZQppbXBvcnQgaGFzaGxpYgppbXBvcnQgaW1wCmltcG9ydCBqc29uCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgcG9zaXhwYXRoCmltcG9ydCByZQppbXBvcnQgc2h1dGlsCmltcG9ydCBzeXMKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCB6aXBmaWxlCgpmcm9tIC4gaW1wb3J0IF9fdmVyc2lvbl9fLCBEaXN0bGliRXhjZXB0aW9uCmZyb20gLmNvbXBhdCBpbXBvcnQgc3lzY29uZmlnLCBaaXBGaWxlLCBmc2RlY29kZSwgdGV4dF90eXBlLCBmaWx0ZXIKZnJvbSAuZGF0YWJhc2UgaW1wb3J0IEluc3RhbGxlZERpc3RyaWJ1dGlvbgpmcm9tIC5tZXRhZGF0YSBpbXBvcnQgTWV0YWRhdGEsIE1FVEFEQVRBX0ZJTEVOQU1FCmZyb20gLnV0aWwgaW1wb3J0IChGaWxlT3BlcmF0b3IsIGNvbnZlcnRfcGF0aCwgQ1NWUmVhZGVyLCBDU1ZXcml0ZXIsIENhY2hlLAogICAgICAgICAgICAgICAgICAgY2FjaGVkX3Byb3BlcnR5LCBnZXRfY2FjaGVfYmFzZSwgcmVhZF9leHBvcnRzLCB0ZW1wZGlyKQpmcm9tIC52ZXJzaW9uIGltcG9ydCBOb3JtYWxpemVkVmVyc2lvbiwgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3IKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKY2FjaGUgPSBOb25lICAgICMgY3JlYXRlZCB3aGVuIG5lZWRlZAoKaWYgaGFzYXR0cihzeXMsICdweXB5X3ZlcnNpb25faW5mbycpOgogICAgSU1QX1BSRUZJWCA9ICdwcCcKZWxpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgSU1QX1BSRUZJWCA9ICdqeScKZWxpZiBzeXMucGxhdGZvcm0gPT0gJ2NsaSc6CiAgICBJTVBfUFJFRklYID0gJ2lwJwplbHNlOgogICAgSU1QX1BSRUZJWCA9ICdjcCcKClZFUl9TVUZGSVggPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ3B5X3ZlcnNpb25fbm9kb3QnKQppZiBub3QgVkVSX1NVRkZJWDogICAjIHByYWdtYTogbm8gY292ZXIKICAgIFZFUl9TVUZGSVggPSAnJXMlcycgJSBzeXMudmVyc2lvbl9pbmZvWzoyXQpQWVZFUiA9ICdweScgKyBWRVJfU1VGRklYCklNUFZFUiA9IElNUF9QUkVGSVggKyBWRVJfU1VGRklYCgpBUkNIID0gZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkucmVwbGFjZSgnLScsICdfJykucmVwbGFjZSgnLicsICdfJykKCkFCSSA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignU09BQkknKQppZiBBQkkgYW5kIEFCSS5zdGFydHN3aXRoKCdjcHl0aG9uLScpOgogICAgQUJJID0gQUJJLnJlcGxhY2UoJ2NweXRob24tJywgJ2NwJykKZWxzZToKICAgIGRlZiBfZGVyaXZlX2FiaSgpOgogICAgICAgIHBhcnRzID0gWydjcCcsIFZFUl9TVUZGSVhdCiAgICAgICAgaWYgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdQeV9ERUJVRycpOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoJ2QnKQogICAgICAgIGlmIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignV0lUSF9QWU1BTExPQycpOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoJ20nKQogICAgICAgIGlmIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignUHlfVU5JQ09ERV9TSVpFJykgPT0gNDoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCd1JykKICAgICAgICByZXR1cm4gJycuam9pbihwYXJ0cykKICAgIEFCSSA9IF9kZXJpdmVfYWJpKCkKICAgIGRlbCBfZGVyaXZlX2FiaQoKRklMRU5BTUVfUkUgPSByZS5jb21waWxlKHInJycKKD9QPG5tPlteLV0rKQotKD9QPHZuPlxkK1teLV0qKQooLSg/UDxibj5cZCtbXi1dKikpPwotKD9QPHB5Plx3K1xkKyhcLlx3K1xkKykqKQotKD9QPGJpPlx3KykKLSg/UDxhcj5cdysoXC5cdyspKikKXC53aGwkCicnJywgcmUuSUdOT1JFQ0FTRSB8IHJlLlZFUkJPU0UpCgpOQU1FX1ZFUlNJT05fUkUgPSByZS5jb21waWxlKHInJycKKD9QPG5tPlteLV0rKQotKD9QPHZuPlxkK1teLV0qKQooLSg/UDxibj5cZCtbXi1dKikpPyQKJycnLCByZS5JR05PUkVDQVNFIHwgcmUuVkVSQk9TRSkKClNIRUJBTkdfUkUgPSByZS5jb21waWxlKGJyJ1xzKiMhW15cclxuXSonKQpTSEVCQU5HX0RFVEFJTF9SRSA9IHJlLmNvbXBpbGUoYnInXihccyojISgiW14iXSsifFxTKykpXHMrKC4qKSQnKQpTSEVCQU5HX1BZVEhPTiA9IGInIyFweXRob24nClNIRUJBTkdfUFlUSE9OVyA9IGInIyFweXRob253JwoKaWYgb3Muc2VwID09ICcvJzoKICAgIHRvX3Bvc2l4ID0gbGFtYmRhIG86IG8KZWxzZToKICAgIHRvX3Bvc2l4ID0gbGFtYmRhIG86IG8ucmVwbGFjZShvcy5zZXAsICcvJykKCgpjbGFzcyBNb3VudGVyKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5pbXB1cmVfd2hlZWxzID0ge30KICAgICAgICBzZWxmLmxpYnMgPSB7fQoKICAgIGRlZiBhZGQoc2VsZiwgcGF0aG5hbWUsIGV4dGVuc2lvbnMpOgogICAgICAgIHNlbGYuaW1wdXJlX3doZWVsc1twYXRobmFtZV0gPSBleHRlbnNpb25zCiAgICAgICAgc2VsZi5saWJzLnVwZGF0ZShleHRlbnNpb25zKQoKICAgIGRlZiByZW1vdmUoc2VsZiwgcGF0aG5hbWUpOgogICAgICAgIGV4dGVuc2lvbnMgPSBzZWxmLmltcHVyZV93aGVlbHMucG9wKHBhdGhuYW1lKQogICAgICAgIGZvciBrLCB2IGluIGV4dGVuc2lvbnM6CiAgICAgICAgICAgIGlmIGsgaW4gc2VsZi5saWJzOgogICAgICAgICAgICAgICAgZGVsIHNlbGYubGlic1trXQoKICAgIGRlZiBmaW5kX21vZHVsZShzZWxmLCBmdWxsbmFtZSwgcGF0aD1Ob25lKToKICAgICAgICBpZiBmdWxsbmFtZSBpbiBzZWxmLmxpYnM6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSBOb25lCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgaWYgZnVsbG5hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgIHJlc3VsdCA9IHN5cy5tb2R1bGVzW2Z1bGxuYW1lXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGZ1bGxuYW1lIG5vdCBpbiBzZWxmLmxpYnM6CiAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigndW5hYmxlIHRvIGZpbmQgZXh0ZW5zaW9uIGZvciAlcycgJSBmdWxsbmFtZSkKICAgICAgICAgICAgcmVzdWx0ID0gaW1wLmxvYWRfZHluYW1pYyhmdWxsbmFtZSwgc2VsZi5saWJzW2Z1bGxuYW1lXSkKICAgICAgICAgICAgcmVzdWx0Ll9fbG9hZGVyX18gPSBzZWxmCiAgICAgICAgICAgIHBhcnRzID0gZnVsbG5hbWUucnNwbGl0KCcuJywgMSkKICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSA+IDE6CiAgICAgICAgICAgICAgICByZXN1bHQuX19wYWNrYWdlX18gPSBwYXJ0c1swXQogICAgICAgIHJldHVybiByZXN1bHQKCl9ob29rID0gTW91bnRlcigpCgoKY2xhc3MgV2hlZWwob2JqZWN0KToKICAgICIiIgogICAgQ2xhc3MgdG8gYnVpbGQgYW5kIGluc3RhbGwgZnJvbSBXaGVlbCBmaWxlcyAoUEVQIDQyNykuCiAgICAiIiIKCiAgICB3aGVlbF92ZXJzaW9uID0gKDEsIDEpCiAgICBoYXNoX2tpbmQgPSAnc2hhMjU2JwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZT1Ob25lLCBzaWduPUZhbHNlLCB2ZXJpZnk9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UgdXNpbmcgYSAodmFsaWQpIGZpbGVuYW1lLgogICAgICAgICIiIgogICAgICAgIHNlbGYuc2lnbiA9IHNpZ24KICAgICAgICBzZWxmLnNob3VsZF92ZXJpZnkgPSB2ZXJpZnkKICAgICAgICBzZWxmLmJ1aWxkdmVyID0gJycKICAgICAgICBzZWxmLnB5dmVyID0gW1BZVkVSXQogICAgICAgIHNlbGYuYWJpID0gWydub25lJ10KICAgICAgICBzZWxmLmFyY2ggPSBbJ2FueSddCiAgICAgICAgc2VsZi5kaXJuYW1lID0gb3MuZ2V0Y3dkKCkKICAgICAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgogICAgICAgICAgICBzZWxmLm5hbWUgPSAnZHVtbXknCiAgICAgICAgICAgIHNlbGYudmVyc2lvbiA9ICcwLjEnCiAgICAgICAgICAgIHNlbGYuX2ZpbGVuYW1lID0gc2VsZi5maWxlbmFtZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG0gPSBOQU1FX1ZFUlNJT05fUkUubWF0Y2goZmlsZW5hbWUpCiAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICBpbmZvID0gbS5ncm91cGRpY3QoJycpCiAgICAgICAgICAgICAgICBzZWxmLm5hbWUgPSBpbmZvWydubSddCiAgICAgICAgICAgICAgICAjIFJlaW5zdGF0ZSB0aGUgbG9jYWwgdmVyc2lvbiBzZXBhcmF0b3IKICAgICAgICAgICAgICAgIHNlbGYudmVyc2lvbiA9IGluZm9bJ3ZuJ10ucmVwbGFjZSgnXycsICctJykKICAgICAgICAgICAgICAgIHNlbGYuYnVpbGR2ZXIgPSBpbmZvWydibiddCiAgICAgICAgICAgICAgICBzZWxmLl9maWxlbmFtZSA9IHNlbGYuZmlsZW5hbWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGRpcm5hbWUsIGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChmaWxlbmFtZSkKICAgICAgICAgICAgICAgIG0gPSBGSUxFTkFNRV9SRS5tYXRjaChmaWxlbmFtZSkKICAgICAgICAgICAgICAgIGlmIG5vdCBtOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ0ludmFsaWQgbmFtZSBvciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmlsZW5hbWU6ICVyJyAlIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgaWYgZGlybmFtZToKICAgICAgICAgICAgICAgICAgICBzZWxmLmRpcm5hbWUgPSBvcy5wYXRoLmFic3BhdGgoZGlybmFtZSkKICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVuYW1lID0gZmlsZW5hbWUKICAgICAgICAgICAgICAgIGluZm8gPSBtLmdyb3VwZGljdCgnJykKICAgICAgICAgICAgICAgIHNlbGYubmFtZSA9IGluZm9bJ25tJ10KICAgICAgICAgICAgICAgIHNlbGYudmVyc2lvbiA9IGluZm9bJ3ZuJ10KICAgICAgICAgICAgICAgIHNlbGYuYnVpbGR2ZXIgPSBpbmZvWydibiddCiAgICAgICAgICAgICAgICBzZWxmLnB5dmVyID0gaW5mb1sncHknXS5zcGxpdCgnLicpCiAgICAgICAgICAgICAgICBzZWxmLmFiaSA9IGluZm9bJ2JpJ10uc3BsaXQoJy4nKQogICAgICAgICAgICAgICAgc2VsZi5hcmNoID0gaW5mb1snYXInXS5zcGxpdCgnLicpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZmlsZW5hbWUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQnVpbGQgYW5kIHJldHVybiBhIGZpbGVuYW1lIGZyb20gdGhlIHZhcmlvdXMgY29tcG9uZW50cy4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmJ1aWxkdmVyOgogICAgICAgICAgICBidWlsZHZlciA9ICctJyArIHNlbGYuYnVpbGR2ZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICBidWlsZHZlciA9ICcnCiAgICAgICAgcHl2ZXIgPSAnLicuam9pbihzZWxmLnB5dmVyKQogICAgICAgIGFiaSA9ICcuJy5qb2luKHNlbGYuYWJpKQogICAgICAgIGFyY2ggPSAnLicuam9pbihzZWxmLmFyY2gpCiAgICAgICAgIyByZXBsYWNlIC0gd2l0aCBfIGFzIGEgbG9jYWwgdmVyc2lvbiBzZXBhcmF0b3IKICAgICAgICB2ZXJzaW9uID0gc2VsZi52ZXJzaW9uLnJlcGxhY2UoJy0nLCAnXycpCiAgICAgICAgcmV0dXJuICclcy0lcyVzLSVzLSVzLSVzLndobCcgJSAoc2VsZi5uYW1lLCB2ZXJzaW9uLCBidWlsZHZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweXZlciwgYWJpLCBhcmNoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGV4aXN0cyhzZWxmKToKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgc2VsZi5maWxlbmFtZSkKICAgICAgICByZXR1cm4gb3MucGF0aC5pc2ZpbGUocGF0aCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB0YWdzKHNlbGYpOgogICAgICAgIGZvciBweXZlciBpbiBzZWxmLnB5dmVyOgogICAgICAgICAgICBmb3IgYWJpIGluIHNlbGYuYWJpOgogICAgICAgICAgICAgICAgZm9yIGFyY2ggaW4gc2VsZi5hcmNoOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHB5dmVyLCBhYmksIGFyY2gKCiAgICBAY2FjaGVkX3Byb3BlcnR5CiAgICBkZWYgbWV0YWRhdGEoc2VsZik6CiAgICAgICAgcGF0aG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBzZWxmLmZpbGVuYW1lKQogICAgICAgIG5hbWVfdmVyID0gJyVzLSVzJyAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikKICAgICAgICBpbmZvX2RpciA9ICclcy5kaXN0LWluZm8nICUgbmFtZV92ZXIKICAgICAgICB3cmFwcGVyID0gY29kZWNzLmdldHJlYWRlcigndXRmLTgnKQogICAgICAgIHdpdGggWmlwRmlsZShwYXRobmFtZSwgJ3InKSBhcyB6ZjoKICAgICAgICAgICAgd2hlZWxfbWV0YWRhdGEgPSBzZWxmLmdldF93aGVlbF9tZXRhZGF0YSh6ZikKICAgICAgICAgICAgd3YgPSB3aGVlbF9tZXRhZGF0YVsnV2hlZWwtVmVyc2lvbiddLnNwbGl0KCcuJywgMSkKICAgICAgICAgICAgZmlsZV92ZXJzaW9uID0gdHVwbGUoW2ludChpKSBmb3IgaSBpbiB3dl0pCiAgICAgICAgICAgIGlmIGZpbGVfdmVyc2lvbiA8ICgxLCAxKToKICAgICAgICAgICAgICAgIGZuID0gJ01FVEFEQVRBJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZm4gPSBNRVRBREFUQV9GSUxFTkFNRQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBtZXRhZGF0YV9maWxlbmFtZSA9IHBvc2l4cGF0aC5qb2luKGluZm9fZGlyLCBmbikKICAgICAgICAgICAgICAgIHdpdGggemYub3BlbihtZXRhZGF0YV9maWxlbmFtZSkgYXMgYmY6CiAgICAgICAgICAgICAgICAgICAgd2YgPSB3cmFwcGVyKGJmKQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IE1ldGFkYXRhKGZpbGVvYmo9d2YpCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0ludmFsaWQgd2hlZWwsIGJlY2F1c2UgJXMgaXMgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWlzc2luZycgJSBmbikKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGdldF93aGVlbF9tZXRhZGF0YShzZWxmLCB6Zik6CiAgICAgICAgbmFtZV92ZXIgPSAnJXMtJXMnICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKQogICAgICAgIGluZm9fZGlyID0gJyVzLmRpc3QtaW5mbycgJSBuYW1lX3ZlcgogICAgICAgIG1ldGFkYXRhX2ZpbGVuYW1lID0gcG9zaXhwYXRoLmpvaW4oaW5mb19kaXIsICdXSEVFTCcpCiAgICAgICAgd2l0aCB6Zi5vcGVuKG1ldGFkYXRhX2ZpbGVuYW1lKSBhcyBiZjoKICAgICAgICAgICAgd2YgPSBjb2RlY3MuZ2V0cmVhZGVyKCd1dGYtOCcpKGJmKQogICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZV9mcm9tX2ZpbGUod2YpCiAgICAgICAgcmV0dXJuIGRpY3QobWVzc2FnZSkKCiAgICBAY2FjaGVkX3Byb3BlcnR5CiAgICBkZWYgaW5mbyhzZWxmKToKICAgICAgICBwYXRobmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmRpcm5hbWUsIHNlbGYuZmlsZW5hbWUpCiAgICAgICAgd2l0aCBaaXBGaWxlKHBhdGhuYW1lLCAncicpIGFzIHpmOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmdldF93aGVlbF9tZXRhZGF0YSh6ZikKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHByb2Nlc3Nfc2hlYmFuZyhzZWxmLCBkYXRhKToKICAgICAgICBtID0gU0hFQkFOR19SRS5tYXRjaChkYXRhKQogICAgICAgIGlmIG06CiAgICAgICAgICAgIGVuZCA9IG0uZW5kKCkKICAgICAgICAgICAgc2hlYmFuZywgZGF0YV9hZnRlcl9zaGViYW5nID0gZGF0YVs6ZW5kXSwgZGF0YVtlbmQ6XQogICAgICAgICAgICAjIFByZXNlcnZlIGFueSBhcmd1bWVudHMgYWZ0ZXIgdGhlIGludGVycHJldGVyCiAgICAgICAgICAgIGlmIGIncHl0aG9udycgaW4gc2hlYmFuZy5sb3dlcigpOgogICAgICAgICAgICAgICAgc2hlYmFuZ19weXRob24gPSBTSEVCQU5HX1BZVEhPTlcKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNoZWJhbmdfcHl0aG9uID0gU0hFQkFOR19QWVRIT04KICAgICAgICAgICAgbSA9IFNIRUJBTkdfREVUQUlMX1JFLm1hdGNoKHNoZWJhbmcpCiAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICBhcmdzID0gYicgJyArIG0uZ3JvdXBzKClbLTFdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhcmdzID0gYicnCiAgICAgICAgICAgIHNoZWJhbmcgPSBzaGViYW5nX3B5dGhvbiArIGFyZ3MKICAgICAgICAgICAgZGF0YSA9IHNoZWJhbmcgKyBkYXRhX2FmdGVyX3NoZWJhbmcKICAgICAgICBlbHNlOgogICAgICAgICAgICBjciA9IGRhdGEuZmluZChiJ1xyJykKICAgICAgICAgICAgbGYgPSBkYXRhLmZpbmQoYidcbicpCiAgICAgICAgICAgIGlmIGNyIDwgMCBvciBjciA+IGxmOgogICAgICAgICAgICAgICAgdGVybSA9IGInXG4nCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBkYXRhW2NyOmNyICsgMl0gPT0gYidcclxuJzoKICAgICAgICAgICAgICAgICAgICB0ZXJtID0gYidcclxuJwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB0ZXJtID0gYidccicKICAgICAgICAgICAgZGF0YSA9IFNIRUJBTkdfUFlUSE9OICsgdGVybSArIGRhdGEKICAgICAgICByZXR1cm4gZGF0YQoKICAgIGRlZiBnZXRfaGFzaChzZWxmLCBkYXRhLCBoYXNoX2tpbmQ9Tm9uZSk6CiAgICAgICAgaWYgaGFzaF9raW5kIGlzIE5vbmU6CiAgICAgICAgICAgIGhhc2hfa2luZCA9IHNlbGYuaGFzaF9raW5kCiAgICAgICAgdHJ5OgogICAgICAgICAgICBoYXNoZXIgPSBnZXRhdHRyKGhhc2hsaWIsIGhhc2hfa2luZCkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ1Vuc3VwcG9ydGVkIGhhc2ggYWxnb3JpdGhtOiAlcicgJSBoYXNoX2tpbmQpCiAgICAgICAgcmVzdWx0ID0gaGFzaGVyKGRhdGEpLmRpZ2VzdCgpCiAgICAgICAgcmVzdWx0ID0gYmFzZTY0LnVybHNhZmVfYjY0ZW5jb2RlKHJlc3VsdCkucnN0cmlwKGInPScpLmRlY29kZSgnYXNjaWknKQogICAgICAgIHJldHVybiBoYXNoX2tpbmQsIHJlc3VsdAoKICAgIGRlZiB3cml0ZV9yZWNvcmQoc2VsZiwgcmVjb3JkcywgcmVjb3JkX3BhdGgsIGJhc2UpOgogICAgICAgIHJlY29yZHMgPSBsaXN0KHJlY29yZHMpICMgbWFrZSBhIGNvcHkgZm9yIHNvcnRpbmcKICAgICAgICBwID0gdG9fcG9zaXgob3MucGF0aC5yZWxwYXRoKHJlY29yZF9wYXRoLCBiYXNlKSkKICAgICAgICByZWNvcmRzLmFwcGVuZCgocCwgJycsICcnKSkKICAgICAgICByZWNvcmRzLnNvcnQoKQogICAgICAgIHdpdGggQ1NWV3JpdGVyKHJlY29yZF9wYXRoKSBhcyB3cml0ZXI6CiAgICAgICAgICAgIGZvciByb3cgaW4gcmVjb3JkczoKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhyb3cpCgogICAgZGVmIHdyaXRlX3JlY29yZHMoc2VsZiwgaW5mbywgbGliZGlyLCBhcmNoaXZlX3BhdGhzKToKICAgICAgICByZWNvcmRzID0gW10KICAgICAgICBkaXN0aW5mbywgaW5mb19kaXIgPSBpbmZvCiAgICAgICAgaGFzaGVyID0gZ2V0YXR0cihoYXNobGliLCBzZWxmLmhhc2hfa2luZCkKICAgICAgICBmb3IgYXAsIHAgaW4gYXJjaGl2ZV9wYXRoczoKICAgICAgICAgICAgd2l0aCBvcGVuKHAsICdyYicpIGFzIGY6CiAgICAgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKICAgICAgICAgICAgZGlnZXN0ID0gJyVzPSVzJyAlIHNlbGYuZ2V0X2hhc2goZGF0YSkKICAgICAgICAgICAgc2l6ZSA9IG9zLnBhdGguZ2V0c2l6ZShwKQogICAgICAgICAgICByZWNvcmRzLmFwcGVuZCgoYXAsIGRpZ2VzdCwgc2l6ZSkpCgogICAgICAgIHAgPSBvcy5wYXRoLmpvaW4oZGlzdGluZm8sICdSRUNPUkQnKQogICAgICAgIHNlbGYud3JpdGVfcmVjb3JkKHJlY29yZHMsIHAsIGxpYmRpcikKICAgICAgICBhcCA9IHRvX3Bvc2l4KG9zLnBhdGguam9pbihpbmZvX2RpciwgJ1JFQ09SRCcpKQogICAgICAgIGFyY2hpdmVfcGF0aHMuYXBwZW5kKChhcCwgcCkpCgogICAgZGVmIGJ1aWxkX3ppcChzZWxmLCBwYXRobmFtZSwgYXJjaGl2ZV9wYXRocyk6CiAgICAgICAgd2l0aCBaaXBGaWxlKHBhdGhuYW1lLCAndycsIHppcGZpbGUuWklQX0RFRkxBVEVEKSBhcyB6ZjoKICAgICAgICAgICAgZm9yIGFwLCBwIGluIGFyY2hpdmVfcGF0aHM6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1dyb3RlICVzIHRvICVzIGluIHdoZWVsJywgcCwgYXApCiAgICAgICAgICAgICAgICB6Zi53cml0ZShwLCBhcCkKCiAgICBkZWYgYnVpbGQoc2VsZiwgcGF0aHMsIHRhZ3M9Tm9uZSwgd2hlZWxfdmVyc2lvbj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBCdWlsZCBhIHdoZWVsIGZyb20gZmlsZXMgaW4gc3BlY2lmaWVkIHBhdGhzLCBhbmQgdXNlIGFueSBzcGVjaWZpZWQgdGFncwogICAgICAgIHdoZW4gZGV0ZXJtaW5pbmcgdGhlIG5hbWUgb2YgdGhlIHdoZWVsLgogICAgICAgICIiIgogICAgICAgIGlmIHRhZ3MgaXMgTm9uZToKICAgICAgICAgICAgdGFncyA9IHt9CgogICAgICAgIGxpYmtleSA9IGxpc3QoZmlsdGVyKGxhbWJkYSBvOiBvIGluIHBhdGhzLCAoJ3B1cmVsaWInLCAncGxhdGxpYicpKSlbMF0KICAgICAgICBpZiBsaWJrZXkgPT0gJ3BsYXRsaWInOgogICAgICAgICAgICBpc19wdXJlID0gJ2ZhbHNlJwogICAgICAgICAgICBkZWZhdWx0X3B5dmVyID0gW0lNUFZFUl0KICAgICAgICAgICAgZGVmYXVsdF9hYmkgPSBbQUJJXQogICAgICAgICAgICBkZWZhdWx0X2FyY2ggPSBbQVJDSF0KICAgICAgICBlbHNlOgogICAgICAgICAgICBpc19wdXJlID0gJ3RydWUnCiAgICAgICAgICAgIGRlZmF1bHRfcHl2ZXIgPSBbUFlWRVJdCiAgICAgICAgICAgIGRlZmF1bHRfYWJpID0gWydub25lJ10KICAgICAgICAgICAgZGVmYXVsdF9hcmNoID0gWydhbnknXQoKICAgICAgICBzZWxmLnB5dmVyID0gdGFncy5nZXQoJ3B5dmVyJywgZGVmYXVsdF9weXZlcikKICAgICAgICBzZWxmLmFiaSA9IHRhZ3MuZ2V0KCdhYmknLCBkZWZhdWx0X2FiaSkKICAgICAgICBzZWxmLmFyY2ggPSB0YWdzLmdldCgnYXJjaCcsIGRlZmF1bHRfYXJjaCkKCiAgICAgICAgbGliZGlyID0gcGF0aHNbbGlia2V5XQoKICAgICAgICBuYW1lX3ZlciA9ICclcy0lcycgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCiAgICAgICAgZGF0YV9kaXIgPSAnJXMuZGF0YScgJSBuYW1lX3ZlcgogICAgICAgIGluZm9fZGlyID0gJyVzLmRpc3QtaW5mbycgJSBuYW1lX3ZlcgoKICAgICAgICBhcmNoaXZlX3BhdGhzID0gW10KCiAgICAgICAgIyBGaXJzdCwgc3R1ZmYgd2hpY2ggaXMgbm90IGluIHNpdGUtcGFja2FnZXMKICAgICAgICBmb3Iga2V5IGluICgnZGF0YScsICdoZWFkZXJzJywgJ3NjcmlwdHMnKToKICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBwYXRoczoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHBhdGggPSBwYXRoc1trZXldCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoKToKICAgICAgICAgICAgICAgICAgICBmb3IgZm4gaW4gZmlsZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBmc2RlY29kZShvcy5wYXRoLmpvaW4ocm9vdCwgZm4pKQogICAgICAgICAgICAgICAgICAgICAgICBycCA9IG9zLnBhdGgucmVscGF0aChwLCBwYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHRvX3Bvc2l4KG9zLnBhdGguam9pbihkYXRhX2Rpciwga2V5LCBycCkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hpdmVfcGF0aHMuYXBwZW5kKChhcCwgcCkpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGtleSA9PSAnc2NyaXB0cycgYW5kIG5vdCBwLmVuZHN3aXRoKCcuZXhlJyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4ocCwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLnByb2Nlc3Nfc2hlYmFuZyhkYXRhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHAsICd3YicpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi53cml0ZShkYXRhKQoKICAgICAgICAjIE5vdywgc3R1ZmYgd2hpY2ggaXMgaW4gc2l0ZS1wYWNrYWdlcywgb3RoZXIgdGhhbiB0aGUKICAgICAgICAjIGRpc3RpbmZvIHN0dWZmLgogICAgICAgIHBhdGggPSBsaWJkaXIKICAgICAgICBkaXN0aW5mbyA9IE5vbmUKICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoKToKICAgICAgICAgICAgaWYgcm9vdCA9PSBwYXRoOgogICAgICAgICAgICAgICAgIyBBdCB0aGUgdG9wIGxldmVsIG9ubHksIHNhdmUgZGlzdGluZm8gZm9yIGxhdGVyCiAgICAgICAgICAgICAgICAjIGFuZCBza2lwIGl0IGZvciBub3cKICAgICAgICAgICAgICAgIGZvciBpLCBkbiBpbiBlbnVtZXJhdGUoZGlycyk6CiAgICAgICAgICAgICAgICAgICAgZG4gPSBmc2RlY29kZShkbikKICAgICAgICAgICAgICAgICAgICBpZiBkbi5lbmRzd2l0aCgnLmRpc3QtaW5mbycpOgogICAgICAgICAgICAgICAgICAgICAgICBkaXN0aW5mbyA9IG9zLnBhdGguam9pbihyb290LCBkbikKICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGRpcnNbaV0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGFzc2VydCBkaXN0aW5mbywgJy5kaXN0LWluZm8gZGlyZWN0b3J5IGV4cGVjdGVkLCBub3QgZm91bmQnCgogICAgICAgICAgICBmb3IgZm4gaW4gZmlsZXM6CiAgICAgICAgICAgICAgICAjIGNvbW1lbnQgb3V0IG5leHQgc3VpdGUgdG8gbGVhdmUgLnB5YyBmaWxlcyBpbgogICAgICAgICAgICAgICAgaWYgZnNkZWNvZGUoZm4pLmVuZHN3aXRoKCgnLnB5YycsICcucHlvJykpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBwID0gb3MucGF0aC5qb2luKHJvb3QsIGZuKQogICAgICAgICAgICAgICAgcnAgPSB0b19wb3NpeChvcy5wYXRoLnJlbHBhdGgocCwgcGF0aCkpCiAgICAgICAgICAgICAgICBhcmNoaXZlX3BhdGhzLmFwcGVuZCgocnAsIHApKQoKICAgICAgICAjIE5vdyBkaXN0aW5mby4gQXNzdW1lZCB0byBiZSBmbGF0LCBpLmUuIG9zLmxpc3RkaXIgaXMgZW5vdWdoLgogICAgICAgIGZpbGVzID0gb3MubGlzdGRpcihkaXN0aW5mbykKICAgICAgICBmb3IgZm4gaW4gZmlsZXM6CiAgICAgICAgICAgIGlmIGZuIG5vdCBpbiAoJ1JFQ09SRCcsICdJTlNUQUxMRVInLCAnU0hBUkVEJywgJ1dIRUVMJyk6CiAgICAgICAgICAgICAgICBwID0gZnNkZWNvZGUob3MucGF0aC5qb2luKGRpc3RpbmZvLCBmbikpCiAgICAgICAgICAgICAgICBhcCA9IHRvX3Bvc2l4KG9zLnBhdGguam9pbihpbmZvX2RpciwgZm4pKQogICAgICAgICAgICAgICAgYXJjaGl2ZV9wYXRocy5hcHBlbmQoKGFwLCBwKSkKCiAgICAgICAgd2hlZWxfbWV0YWRhdGEgPSBbCiAgICAgICAgICAgICdXaGVlbC1WZXJzaW9uOiAlZC4lZCcgJSAod2hlZWxfdmVyc2lvbiBvciBzZWxmLndoZWVsX3ZlcnNpb24pLAogICAgICAgICAgICAnR2VuZXJhdG9yOiBkaXN0bGliICVzJyAlIF9fdmVyc2lvbl9fLAogICAgICAgICAgICAnUm9vdC1Jcy1QdXJlbGliOiAlcycgJSBpc19wdXJlLAogICAgICAgIF0KICAgICAgICBmb3IgcHl2ZXIsIGFiaSwgYXJjaCBpbiBzZWxmLnRhZ3M6CiAgICAgICAgICAgIHdoZWVsX21ldGFkYXRhLmFwcGVuZCgnVGFnOiAlcy0lcy0lcycgJSAocHl2ZXIsIGFiaSwgYXJjaCkpCiAgICAgICAgcCA9IG9zLnBhdGguam9pbihkaXN0aW5mbywgJ1dIRUVMJykKICAgICAgICB3aXRoIG9wZW4ocCwgJ3cnKSBhcyBmOgogICAgICAgICAgICBmLndyaXRlKCdcbicuam9pbih3aGVlbF9tZXRhZGF0YSkpCiAgICAgICAgYXAgPSB0b19wb3NpeChvcy5wYXRoLmpvaW4oaW5mb19kaXIsICdXSEVFTCcpKQogICAgICAgIGFyY2hpdmVfcGF0aHMuYXBwZW5kKChhcCwgcCkpCgogICAgICAgICMgTm93LCBhdCBsYXN0LCBSRUNPUkQuCiAgICAgICAgIyBQYXRocyBpbiBoZXJlIGFyZSBhcmNoaXZlIHBhdGhzIC0gbm90aGluZyBlbHNlIG1ha2VzIHNlbnNlLgogICAgICAgIHNlbGYud3JpdGVfcmVjb3JkcygoZGlzdGluZm8sIGluZm9fZGlyKSwgbGliZGlyLCBhcmNoaXZlX3BhdGhzKQogICAgICAgICMgTm93LCByZWFkeSB0byBidWlsZCB0aGUgemlwIGZpbGUKICAgICAgICBwYXRobmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmRpcm5hbWUsIHNlbGYuZmlsZW5hbWUpCiAgICAgICAgc2VsZi5idWlsZF96aXAocGF0aG5hbWUsIGFyY2hpdmVfcGF0aHMpCiAgICAgICAgcmV0dXJuIHBhdGhuYW1lCgogICAgZGVmIGluc3RhbGwoc2VsZiwgcGF0aHMsIG1ha2VyLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgSW5zdGFsbCBhIHdoZWVsIHRvIHRoZSBzcGVjaWZpZWQgcGF0aHMuIElmIGt3YXJnIGBgd2FybmVyYGAgaXMKICAgICAgICBzcGVjaWZpZWQsIGl0IHNob3VsZCBiZSBhIGNhbGxhYmxlLCB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aXRoIHR3bwogICAgICAgIHR1cGxlcyBpbmRpY2F0aW5nIHRoZSB3aGVlbCB2ZXJzaW9uIG9mIHRoaXMgc29mdHdhcmUgYW5kIHRoZSB3aGVlbAogICAgICAgIHZlcnNpb24gaW4gdGhlIGZpbGUsIGlmIHRoZXJlIGlzIGEgZGlzY3JlcGFuY3kgaW4gdGhlIHZlcnNpb25zLgogICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gaXNzdWUgYW55IHdhcm5pbmdzIHRvIHJhaXNlIGFueSBleGNlcHRpb25zLgogICAgICAgIElmIGt3YXJnIGBgbGliX29ubHlgYCBpcyBUcnVlLCBvbmx5IHRoZSBwdXJlbGliL3BsYXRsaWIgZmlsZXMgYXJlCiAgICAgICAgaW5zdGFsbGVkLCBhbmQgdGhlIGhlYWRlcnMsIHNjcmlwdHMsIGRhdGEgYW5kIGRpc3QtaW5mbyBtZXRhZGF0YSBhcmUKICAgICAgICBub3Qgd3JpdHRlbi4KCiAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIDpjbGFzczpgSW5zdGFsbGVkRGlzdHJpYnV0aW9uYCBpbnN0YW5jZSB1bmxlc3MKICAgICAgICBgYG9wdGlvbnMubGliX29ubHlgYCBpcyBUcnVlLCBpbiB3aGljaCBjYXNlIHRoZSByZXR1cm4gdmFsdWUgaXMgYGBOb25lYGAuCiAgICAgICAgIiIiCgogICAgICAgIGRyeV9ydW4gPSBtYWtlci5kcnlfcnVuCiAgICAgICAgd2FybmVyID0ga3dhcmdzLmdldCgnd2FybmVyJykKICAgICAgICBsaWJfb25seSA9IGt3YXJncy5nZXQoJ2xpYl9vbmx5JywgRmFsc2UpCgogICAgICAgIHBhdGhuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgc2VsZi5maWxlbmFtZSkKICAgICAgICBuYW1lX3ZlciA9ICclcy0lcycgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCiAgICAgICAgZGF0YV9kaXIgPSAnJXMuZGF0YScgJSBuYW1lX3ZlcgogICAgICAgIGluZm9fZGlyID0gJyVzLmRpc3QtaW5mbycgJSBuYW1lX3ZlcgoKICAgICAgICBtZXRhZGF0YV9uYW1lID0gcG9zaXhwYXRoLmpvaW4oaW5mb19kaXIsIE1FVEFEQVRBX0ZJTEVOQU1FKQogICAgICAgIHdoZWVsX21ldGFkYXRhX25hbWUgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgJ1dIRUVMJykKICAgICAgICByZWNvcmRfbmFtZSA9IHBvc2l4cGF0aC5qb2luKGluZm9fZGlyLCAnUkVDT1JEJykKCiAgICAgICAgd3JhcHBlciA9IGNvZGVjcy5nZXRyZWFkZXIoJ3V0Zi04JykKCiAgICAgICAgd2l0aCBaaXBGaWxlKHBhdGhuYW1lLCAncicpIGFzIHpmOgogICAgICAgICAgICB3aXRoIHpmLm9wZW4od2hlZWxfbWV0YWRhdGFfbmFtZSkgYXMgYndmOgogICAgICAgICAgICAgICAgd2YgPSB3cmFwcGVyKGJ3ZikKICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlX2Zyb21fZmlsZSh3ZikKICAgICAgICAgICAgd3YgPSBtZXNzYWdlWydXaGVlbC1WZXJzaW9uJ10uc3BsaXQoJy4nLCAxKQogICAgICAgICAgICBmaWxlX3ZlcnNpb24gPSB0dXBsZShbaW50KGkpIGZvciBpIGluIHd2XSkKICAgICAgICAgICAgaWYgKGZpbGVfdmVyc2lvbiAhPSBzZWxmLndoZWVsX3ZlcnNpb24pIGFuZCB3YXJuZXI6CiAgICAgICAgICAgICAgICB3YXJuZXIoc2VsZi53aGVlbF92ZXJzaW9uLCBmaWxlX3ZlcnNpb24pCgogICAgICAgICAgICBpZiBtZXNzYWdlWydSb290LUlzLVB1cmVsaWInXSA9PSAndHJ1ZSc6CiAgICAgICAgICAgICAgICBsaWJkaXIgPSBwYXRoc1sncHVyZWxpYiddCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsaWJkaXIgPSBwYXRoc1sncGxhdGxpYiddCgogICAgICAgICAgICByZWNvcmRzID0ge30KICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKHJlY29yZF9uYW1lKSBhcyBiZjoKICAgICAgICAgICAgICAgIHdpdGggQ1NWUmVhZGVyKHN0cmVhbT1iZikgYXMgcmVhZGVyOgogICAgICAgICAgICAgICAgICAgIGZvciByb3cgaW4gcmVhZGVyOgogICAgICAgICAgICAgICAgICAgICAgICBwID0gcm93WzBdCiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHNbcF0gPSByb3cKCiAgICAgICAgICAgIGRhdGFfcGZ4ID0gcG9zaXhwYXRoLmpvaW4oZGF0YV9kaXIsICcnKQogICAgICAgICAgICBpbmZvX3BmeCA9IHBvc2l4cGF0aC5qb2luKGluZm9fZGlyLCAnJykKICAgICAgICAgICAgc2NyaXB0X3BmeCA9IHBvc2l4cGF0aC5qb2luKGRhdGFfZGlyLCAnc2NyaXB0cycsICcnKQoKICAgICAgICAgICAgIyBtYWtlIGEgbmV3IGluc3RhbmNlIHJhdGhlciB0aGFuIGEgY29weSBvZiBtYWtlcidzLAogICAgICAgICAgICAjIGFzIHdlIG11dGF0ZSBpdAogICAgICAgICAgICBmaWxlb3AgPSBGaWxlT3BlcmF0b3IoZHJ5X3J1bj1kcnlfcnVuKQogICAgICAgICAgICBmaWxlb3AucmVjb3JkID0gVHJ1ZSAgICAjIHNvIHdlIGNhbiByb2xsYmFjayBpZiBuZWVkZWQKCiAgICAgICAgICAgIGJjID0gbm90IHN5cy5kb250X3dyaXRlX2J5dGVjb2RlICAgICMgRG91YmxlIG5lZ2F0aXZlcy4gTG92ZWx5IQoKICAgICAgICAgICAgb3V0ZmlsZXMgPSBbXSAgICMgZm9yIFJFQ09SRCB3cml0aW5nCgogICAgICAgICAgICAjIGZvciBzY3JpcHQgY29weWluZy9zaGViYW5nIHByb2Nlc3NpbmcKICAgICAgICAgICAgd29ya2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgICAgICAgICAjIHNldCB0YXJnZXQgZGlyIGxhdGVyCiAgICAgICAgICAgICMgd2UgZGVmYXVsdCBhZGRfbGF1bmNoZXJzIHRvIEZhbHNlLCBhcyB0aGUKICAgICAgICAgICAgIyBQeXRob24gTGF1bmNoZXIgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZAogICAgICAgICAgICBtYWtlci5zb3VyY2VfZGlyID0gd29ya2RpcgogICAgICAgICAgICBtYWtlci50YXJnZXRfZGlyID0gTm9uZQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmb3IgemluZm8gaW4gemYuaW5mb2xpc3QoKToKICAgICAgICAgICAgICAgICAgICBhcmNuYW1lID0gemluZm8uZmlsZW5hbWUKICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyY25hbWUsIHRleHRfdHlwZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHVfYXJjbmFtZSA9IGFyY25hbWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICB1X2FyY25hbWUgPSBhcmNuYW1lLmRlY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgICAgICMgVGhlIHNpZ25hdHVyZSBmaWxlIHdvbid0IGJlIGluIFJFQ09SRCwKICAgICAgICAgICAgICAgICAgICAjIGFuZCB3ZSAgZG9uJ3QgY3VycmVudGx5IGRvbid0IGRvIGFueXRoaW5nIHdpdGggaXQKICAgICAgICAgICAgICAgICAgICBpZiB1X2FyY25hbWUuZW5kc3dpdGgoJy9SRUNPUkQuandzJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgcm93ID0gcmVjb3Jkc1t1X2FyY25hbWVdCiAgICAgICAgICAgICAgICAgICAgaWYgcm93WzJdIGFuZCBzdHIoemluZm8uZmlsZV9zaXplKSAhPSByb3dbMl06CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ3NpemUgbWlzbWF0Y2ggZm9yICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMnICUgdV9hcmNuYW1lKQogICAgICAgICAgICAgICAgICAgIGlmIHJvd1sxXToKICAgICAgICAgICAgICAgICAgICAgICAga2luZCwgdmFsdWUgPSByb3dbMV0uc3BsaXQoJz0nLCAxKQogICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHpmLm9wZW4oYXJjbmFtZSkgYXMgYmY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYmYucmVhZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIF8sIGRpZ2VzdCA9IHNlbGYuZ2V0X2hhc2goZGF0YSwga2luZCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGlnZXN0ICE9IHZhbHVlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignZGlnZXN0IG1pc21hdGNoIGZvciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcycgJSBhcmNuYW1lKQoKICAgICAgICAgICAgICAgICAgICBpZiBsaWJfb25seSBhbmQgdV9hcmNuYW1lLnN0YXJ0c3dpdGgoKGluZm9fcGZ4LCBkYXRhX3BmeCkpOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ2xpYl9vbmx5OiBza2lwcGluZyAlcycsIHVfYXJjbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBpc19zY3JpcHQgPSAodV9hcmNuYW1lLnN0YXJ0c3dpdGgoc2NyaXB0X3BmeCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCB1X2FyY25hbWUuZW5kc3dpdGgoJy5leGUnKSkKCiAgICAgICAgICAgICAgICAgICAgaWYgdV9hcmNuYW1lLnN0YXJ0c3dpdGgoZGF0YV9wZngpOgogICAgICAgICAgICAgICAgICAgICAgICBfLCB3aGVyZSwgcnAgPSB1X2FyY25hbWUuc3BsaXQoJy8nLCAyKQogICAgICAgICAgICAgICAgICAgICAgICBvdXRmaWxlID0gb3MucGF0aC5qb2luKHBhdGhzW3doZXJlXSwgY29udmVydF9wYXRoKHJwKSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAjIG1lYW50IGZvciBzaXRlLXBhY2thZ2VzLgogICAgICAgICAgICAgICAgICAgICAgICBpZiB1X2FyY25hbWUgaW4gKHdoZWVsX21ldGFkYXRhX25hbWUsIHJlY29yZF9uYW1lKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGUgPSBvcy5wYXRoLmpvaW4obGliZGlyLCBjb252ZXJ0X3BhdGgodV9hcmNuYW1lKSkKICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNfc2NyaXB0OgogICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHpmLm9wZW4oYXJjbmFtZSkgYXMgYmY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlb3AuY29weV9zdHJlYW0oYmYsIG91dGZpbGUpCiAgICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGVzLmFwcGVuZChvdXRmaWxlKQogICAgICAgICAgICAgICAgICAgICAgICAjIERvdWJsZSBjaGVjayB0aGUgZGlnZXN0IG9mIHRoZSB3cml0dGVuIGZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGRyeV9ydW4gYW5kIHJvd1sxXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggb3BlbihvdXRmaWxlLCAncmInKSBhcyBiZjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYmYucmVhZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXywgbmV3ZGlnZXN0ID0gc2VsZi5nZXRfaGFzaChkYXRhLCBraW5kKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5ld2RpZ2VzdCAhPSBkaWdlc3Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ2RpZ2VzdCBtaXNtYXRjaCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29uIHdyaXRlIGZvciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzJyAlIG91dGZpbGUpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJjIGFuZCBvdXRmaWxlLmVuZHN3aXRoKCcucHknKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweWMgPSBmaWxlb3AuYnl0ZV9jb21waWxlKG91dGZpbGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZXMuYXBwZW5kKHB5YykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBEb24ndCBnaXZlIHVwIGlmIGJ5dGUtY29tcGlsYXRpb24gZmFpbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBidXQgbG9nIGl0IGFuZCBwZXJoYXBzIHdhcm4gdGhlIHVzZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnQnl0ZS1jb21waWxhdGlvbiBmYWlsZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y19pbmZvPVRydWUpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgZm4gPSBvcy5wYXRoLmJhc2VuYW1lKGNvbnZlcnRfcGF0aChhcmNuYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgd29ya25hbWUgPSBvcy5wYXRoLmpvaW4od29ya2RpciwgZm4pCiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggemYub3BlbihhcmNuYW1lKSBhcyBiZjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVvcC5jb3B5X3N0cmVhbShiZiwgd29ya25hbWUpCgogICAgICAgICAgICAgICAgICAgICAgICBkbiwgZm4gPSBvcy5wYXRoLnNwbGl0KG91dGZpbGUpCiAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VyLnRhcmdldF9kaXIgPSBkbgogICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZXMgPSBtYWtlci5tYWtlKGZuKQogICAgICAgICAgICAgICAgICAgICAgICBmaWxlb3Auc2V0X2V4ZWN1dGFibGVfbW9kZShmaWxlbmFtZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGVzLmV4dGVuZChmaWxlbmFtZXMpCgogICAgICAgICAgICAgICAgaWYgbGliX29ubHk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdsaWJfb25seTogcmV0dXJuaW5nIE5vbmUnKQogICAgICAgICAgICAgICAgICAgIGRpc3QgPSBOb25lCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgR2VuZXJhdGUgc2NyaXB0cwoKICAgICAgICAgICAgICAgICAgICAjIFRyeSB0byBnZXQgcHlkaXN0Lmpzb24gc28gd2UgY2FuIHNlZSBpZiB0aGVyZSBhcmUKICAgICAgICAgICAgICAgICAgICAjIGFueSBjb21tYW5kcyB0byBnZW5lcmF0ZS4gSWYgdGhpcyBmYWlscyAoZS5nLiBiZWNhdXNlCiAgICAgICAgICAgICAgICAgICAgIyBvZiBhIGxlZ2FjeSB3aGVlbCksIGxvZyBhIHdhcm5pbmcgYnV0IGRvbid0IGdpdmUgdXAuCiAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgZmlsZV92ZXJzaW9uID0gc2VsZi5pbmZvWydXaGVlbC1WZXJzaW9uJ10KICAgICAgICAgICAgICAgICAgICBpZiBmaWxlX3ZlcnNpb24gPT0gJzEuMCc6CiAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlIGxlZ2FjeSBpbmZvCiAgICAgICAgICAgICAgICAgICAgICAgIGVwID0gcG9zaXhwYXRoLmpvaW4oaW5mb19kaXIsICdlbnRyeV9wb2ludHMudHh0JykKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKGVwKSBhcyBid2Y6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBkYXRhID0gcmVhZF9leHBvcnRzKGJ3ZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzID0ge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gKCdjb25zb2xlJywgJ2d1aScpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSAnJXNfc2NyaXB0cycgJSBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBrIGluIGVwZGF0YToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHNbJ3dyYXBfJXMnICUga2V5XSA9IGQgPSB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdiBpbiBlcGRhdGFba10udmFsdWVzKCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gJyVzOiVzJyAlICh2LnByZWZpeCwgdi5zdWZmaXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB2LmZsYWdzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgKz0gJyAlcycgJSB2LmZsYWdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkW3YubmFtZV0gPSBzCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnVW5hYmxlIHRvIHJlYWQgbGVnYWN5IHNjcmlwdCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWV0YWRhdGEsIHNvIGNhbm5vdCBnZW5lcmF0ZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0cycpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKG1ldGFkYXRhX25hbWUpIGFzIGJ3ZjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZiA9IHdyYXBwZXIoYndmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzID0ganNvbi5sb2FkKHdmKS5nZXQoJ2V4dGVuc2lvbnMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvbW1hbmRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcyA9IGNvbW1hbmRzLmdldCgncHl0aG9uLmNvbW1hbmRzJykKICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdVbmFibGUgdG8gcmVhZCBKU09OIG1ldGFkYXRhLCBzbyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2Fubm90IGdlbmVyYXRlIHNjcmlwdHMnKQogICAgICAgICAgICAgICAgICAgIGlmIGNvbW1hbmRzOgogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlX3NjcmlwdHMgPSBjb21tYW5kcy5nZXQoJ3dyYXBfY29uc29sZScsIHt9KQogICAgICAgICAgICAgICAgICAgICAgICBndWlfc2NyaXB0cyA9IGNvbW1hbmRzLmdldCgnd3JhcF9ndWknLCB7fSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29uc29sZV9zY3JpcHRzIG9yIGd1aV9zY3JpcHRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0X2RpciA9IHBhdGhzLmdldCgnc2NyaXB0cycsICcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoc2NyaXB0X2Rpcik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVmFsaWQgc2NyaXB0IHBhdGggbm90ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcGVjaWZpZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZXIudGFyZ2V0X2RpciA9IHNjcmlwdF9kaXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIGNvbnNvbGVfc2NyaXB0cy5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdCA9ICclcyA9ICVzJyAlIChrLCB2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lcyA9IG1ha2VyLm1ha2Uoc2NyaXB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVvcC5zZXRfZXhlY3V0YWJsZV9tb2RlKGZpbGVuYW1lcykKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBndWlfc2NyaXB0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0geydndWknOiBUcnVlIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBndWlfc2NyaXB0cy5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQgPSAnJXMgPSAlcycgJSAoaywgdikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVzID0gbWFrZXIubWFrZShzY3JpcHQsIG9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVvcC5zZXRfZXhlY3V0YWJsZV9tb2RlKGZpbGVuYW1lcykKCiAgICAgICAgICAgICAgICAgICAgcCA9IG9zLnBhdGguam9pbihsaWJkaXIsIGluZm9fZGlyKQogICAgICAgICAgICAgICAgICAgIGRpc3QgPSBJbnN0YWxsZWREaXN0cmlidXRpb24ocCkKCiAgICAgICAgICAgICAgICAgICAgIyBXcml0ZSBTSEFSRUQKICAgICAgICAgICAgICAgICAgICBwYXRocyA9IGRpY3QocGF0aHMpICAgICAjIGRvbid0IGNoYW5nZSBwYXNzZWQgaW4gZGljdAogICAgICAgICAgICAgICAgICAgIGRlbCBwYXRoc1sncHVyZWxpYiddCiAgICAgICAgICAgICAgICAgICAgZGVsIHBhdGhzWydwbGF0bGliJ10KICAgICAgICAgICAgICAgICAgICBwYXRoc1snbGliJ10gPSBsaWJkaXIKICAgICAgICAgICAgICAgICAgICBwID0gZGlzdC53cml0ZV9zaGFyZWRfbG9jYXRpb25zKHBhdGhzLCBkcnlfcnVuKQogICAgICAgICAgICAgICAgICAgIGlmIHA6CiAgICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGVzLmFwcGVuZChwKQoKICAgICAgICAgICAgICAgICAgICAjIFdyaXRlIFJFQ09SRAogICAgICAgICAgICAgICAgICAgIGRpc3Qud3JpdGVfaW5zdGFsbGVkX2ZpbGVzKG91dGZpbGVzLCBwYXRoc1sncHJlZml4J10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ5X3J1bikKICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oJ2luc3RhbGxhdGlvbiBmYWlsZWQuJykKICAgICAgICAgICAgICAgIGZpbGVvcC5yb2xsYmFjaygpCiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh3b3JrZGlyKQoKICAgIGRlZiBfZ2V0X2R5bGliX2NhY2hlKHNlbGYpOgogICAgICAgIGdsb2JhbCBjYWNoZQogICAgICAgIGlmIGNhY2hlIGlzIE5vbmU6CiAgICAgICAgICAgICMgVXNlIG5hdGl2ZSBzdHJpbmcgdG8gYXZvaWQgaXNzdWVzIG9uIDIueDogc2VlIFB5dGhvbiAjMjAxNDAuCiAgICAgICAgICAgIGJhc2UgPSBvcy5wYXRoLmpvaW4oZ2V0X2NhY2hlX2Jhc2UoKSwgc3RyKCdkeWxpYi1jYWNoZScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy52ZXJzaW9uWzozXSkKICAgICAgICAgICAgY2FjaGUgPSBDYWNoZShiYXNlKQogICAgICAgIHJldHVybiBjYWNoZQoKICAgIGRlZiBfZ2V0X2V4dGVuc2lvbnMoc2VsZik6CiAgICAgICAgcGF0aG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBzZWxmLmZpbGVuYW1lKQogICAgICAgIG5hbWVfdmVyID0gJyVzLSVzJyAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikKICAgICAgICBpbmZvX2RpciA9ICclcy5kaXN0LWluZm8nICUgbmFtZV92ZXIKICAgICAgICBhcmNuYW1lID0gcG9zaXhwYXRoLmpvaW4oaW5mb19kaXIsICdFWFRFTlNJT05TJykKICAgICAgICB3cmFwcGVyID0gY29kZWNzLmdldHJlYWRlcigndXRmLTgnKQogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgd2l0aCBaaXBGaWxlKHBhdGhuYW1lLCAncicpIGFzIHpmOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB3aXRoIHpmLm9wZW4oYXJjbmFtZSkgYXMgYmY6CiAgICAgICAgICAgICAgICAgICAgd2YgPSB3cmFwcGVyKGJmKQogICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMgPSBqc29uLmxvYWQod2YpCiAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSBzZWxmLl9nZXRfZHlsaWJfY2FjaGUoKQogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGNhY2hlLnByZWZpeF90b19kaXIocGF0aG5hbWUpCiAgICAgICAgICAgICAgICAgICAgY2FjaGVfYmFzZSA9IG9zLnBhdGguam9pbihjYWNoZS5iYXNlLCBwcmVmaXgpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoY2FjaGVfYmFzZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKGNhY2hlX2Jhc2UpCiAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUsIHJlbHBhdGggaW4gZXh0ZW5zaW9ucy5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gb3MucGF0aC5qb2luKGNhY2hlX2Jhc2UsIGNvbnZlcnRfcGF0aChyZWxwYXRoKSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGRlc3QpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdCA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfdGltZSA9IG9zLnN0YXQoZGVzdCkuc3RfbXRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfdGltZSA9IGRhdGV0aW1lLmRhdGV0aW1lLmZyb210aW1lc3RhbXAoZmlsZV90aW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IHpmLmdldGluZm8ocmVscGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZWVsX3RpbWUgPSBkYXRldGltZS5kYXRldGltZSgqaW5mby5kYXRlX3RpbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0ID0gd2hlZWxfdGltZSA+IGZpbGVfdGltZQogICAgICAgICAgICAgICAgICAgICAgICBpZiBleHRyYWN0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgemYuZXh0cmFjdChyZWxwYXRoLCBjYWNoZV9iYXNlKQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKChuYW1lLCBkZXN0KSkKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgaXNfY29tcGF0aWJsZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBEZXRlcm1pbmUgaWYgYSB3aGVlbCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJ1bm5pbmcgc3lzdGVtLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBpc19jb21wYXRpYmxlKHNlbGYpCgogICAgZGVmIGlzX21vdW50YWJsZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBEZXRlcm1pbmUgaWYgYSB3aGVlbCBpcyBhc3NlcnRlZCBhcyBtb3VudGFibGUgYnkgaXRzIG1ldGFkYXRhLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBUcnVlICMgZm9yIG5vdyAtIG1ldGFkYXRhIGRldGFpbHMgVEJECgogICAgZGVmIG1vdW50KHNlbGYsIGFwcGVuZD1GYWxzZSk6CiAgICAgICAgcGF0aG5hbWUgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgc2VsZi5maWxlbmFtZSkpCiAgICAgICAgaWYgbm90IHNlbGYuaXNfY29tcGF0aWJsZSgpOgogICAgICAgICAgICBtc2cgPSAnV2hlZWwgJXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzIFB5dGhvbi4nICUgcGF0aG5hbWUKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbihtc2cpCiAgICAgICAgaWYgbm90IHNlbGYuaXNfbW91bnRhYmxlKCk6CiAgICAgICAgICAgIG1zZyA9ICdXaGVlbCAlcyBpcyBtYXJrZWQgYXMgbm90IG1vdW50YWJsZS4nICUgcGF0aG5hbWUKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbihtc2cpCiAgICAgICAgaWYgcGF0aG5hbWUgaW4gc3lzLnBhdGg6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnJXMgYWxyZWFkeSBpbiBwYXRoJywgcGF0aG5hbWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgYXBwZW5kOgogICAgICAgICAgICAgICAgc3lzLnBhdGguYXBwZW5kKHBhdGhuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHBhdGhuYW1lKQogICAgICAgICAgICBleHRlbnNpb25zID0gc2VsZi5fZ2V0X2V4dGVuc2lvbnMoKQogICAgICAgICAgICBpZiBleHRlbnNpb25zOgogICAgICAgICAgICAgICAgaWYgX2hvb2sgbm90IGluIHN5cy5tZXRhX3BhdGg6CiAgICAgICAgICAgICAgICAgICAgc3lzLm1ldGFfcGF0aC5hcHBlbmQoX2hvb2spCiAgICAgICAgICAgICAgICBfaG9vay5hZGQocGF0aG5hbWUsIGV4dGVuc2lvbnMpCgogICAgZGVmIHVubW91bnQoc2VsZik6CiAgICAgICAgcGF0aG5hbWUgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgc2VsZi5maWxlbmFtZSkpCiAgICAgICAgaWYgcGF0aG5hbWUgbm90IGluIHN5cy5wYXRoOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJyVzIG5vdCBpbiBwYXRoJywgcGF0aG5hbWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3lzLnBhdGgucmVtb3ZlKHBhdGhuYW1lKQogICAgICAgICAgICBpZiBwYXRobmFtZSBpbiBfaG9vay5pbXB1cmVfd2hlZWxzOgogICAgICAgICAgICAgICAgX2hvb2sucmVtb3ZlKHBhdGhuYW1lKQogICAgICAgICAgICBpZiBub3QgX2hvb2suaW1wdXJlX3doZWVsczoKICAgICAgICAgICAgICAgIGlmIF9ob29rIGluIHN5cy5tZXRhX3BhdGg6CiAgICAgICAgICAgICAgICAgICAgc3lzLm1ldGFfcGF0aC5yZW1vdmUoX2hvb2spCgogICAgZGVmIHZlcmlmeShzZWxmKToKICAgICAgICBwYXRobmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmRpcm5hbWUsIHNlbGYuZmlsZW5hbWUpCiAgICAgICAgbmFtZV92ZXIgPSAnJXMtJXMnICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKQogICAgICAgIGRhdGFfZGlyID0gJyVzLmRhdGEnICUgbmFtZV92ZXIKICAgICAgICBpbmZvX2RpciA9ICclcy5kaXN0LWluZm8nICUgbmFtZV92ZXIKCiAgICAgICAgbWV0YWRhdGFfbmFtZSA9IHBvc2l4cGF0aC5qb2luKGluZm9fZGlyLCBNRVRBREFUQV9GSUxFTkFNRSkKICAgICAgICB3aGVlbF9tZXRhZGF0YV9uYW1lID0gcG9zaXhwYXRoLmpvaW4oaW5mb19kaXIsICdXSEVFTCcpCiAgICAgICAgcmVjb3JkX25hbWUgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgJ1JFQ09SRCcpCgogICAgICAgIHdyYXBwZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCd1dGYtOCcpCgogICAgICAgIHdpdGggWmlwRmlsZShwYXRobmFtZSwgJ3InKSBhcyB6ZjoKICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKHdoZWVsX21ldGFkYXRhX25hbWUpIGFzIGJ3ZjoKICAgICAgICAgICAgICAgIHdmID0gd3JhcHBlcihid2YpCiAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZV9mcm9tX2ZpbGUod2YpCiAgICAgICAgICAgIHd2ID0gbWVzc2FnZVsnV2hlZWwtVmVyc2lvbiddLnNwbGl0KCcuJywgMSkKICAgICAgICAgICAgZmlsZV92ZXJzaW9uID0gdHVwbGUoW2ludChpKSBmb3IgaSBpbiB3dl0pCiAgICAgICAgICAgICMgVE9ETyB2ZXJzaW9uIHZlcmlmaWNhdGlvbgoKICAgICAgICAgICAgcmVjb3JkcyA9IHt9CiAgICAgICAgICAgIHdpdGggemYub3BlbihyZWNvcmRfbmFtZSkgYXMgYmY6CiAgICAgICAgICAgICAgICB3aXRoIENTVlJlYWRlcihzdHJlYW09YmYpIGFzIHJlYWRlcjoKICAgICAgICAgICAgICAgICAgICBmb3Igcm93IGluIHJlYWRlcjoKICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHJvd1swXQogICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzW3BdID0gcm93CgogICAgICAgICAgICBmb3IgemluZm8gaW4gemYuaW5mb2xpc3QoKToKICAgICAgICAgICAgICAgIGFyY25hbWUgPSB6aW5mby5maWxlbmFtZQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmNuYW1lLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICAgICAgICAgIHVfYXJjbmFtZSA9IGFyY25hbWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgdV9hcmNuYW1lID0gYXJjbmFtZS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIGlmICcuLicgaW4gdV9hcmNuYW1lOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ2ludmFsaWQgZW50cnkgaW4gJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3doZWVsOiAlcicgJSB1X2FyY25hbWUpCgogICAgICAgICAgICAgICAgIyBUaGUgc2lnbmF0dXJlIGZpbGUgd29uJ3QgYmUgaW4gUkVDT1JELAogICAgICAgICAgICAgICAgIyBhbmQgd2UgIGRvbid0IGN1cnJlbnRseSBkb24ndCBkbyBhbnl0aGluZyB3aXRoIGl0CiAgICAgICAgICAgICAgICBpZiB1X2FyY25hbWUuZW5kc3dpdGgoJy9SRUNPUkQuandzJyk6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHJvdyA9IHJlY29yZHNbdV9hcmNuYW1lXQogICAgICAgICAgICAgICAgaWYgcm93WzJdIGFuZCBzdHIoemluZm8uZmlsZV9zaXplKSAhPSByb3dbMl06CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignc2l6ZSBtaXNtYXRjaCBmb3IgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzJyAlIHVfYXJjbmFtZSkKICAgICAgICAgICAgICAgIGlmIHJvd1sxXToKICAgICAgICAgICAgICAgICAgICBraW5kLCB2YWx1ZSA9IHJvd1sxXS5zcGxpdCgnPScsIDEpCiAgICAgICAgICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKGFyY25hbWUpIGFzIGJmOgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYmYucmVhZCgpCiAgICAgICAgICAgICAgICAgICAgXywgZGlnZXN0ID0gc2VsZi5nZXRfaGFzaChkYXRhLCBraW5kKQogICAgICAgICAgICAgICAgICAgIGlmIGRpZ2VzdCAhPSB2YWx1ZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignZGlnZXN0IG1pc21hdGNoIGZvciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzJyAlIGFyY25hbWUpCgogICAgZGVmIHVwZGF0ZShzZWxmLCBtb2RpZmllciwgZGVzdF9kaXI9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIFVwZGF0ZSB0aGUgY29udGVudHMgb2YgYSB3aGVlbCBpbiBhIGdlbmVyaWMgd2F5LiBUaGUgbW9kaWZpZXIgc2hvdWxkCiAgICAgICAgYmUgYSBjYWxsYWJsZSB3aGljaCBleHBlY3RzIGEgZGljdGlvbmFyeSBhcmd1bWVudDogaXRzIGtleXMgYXJlCiAgICAgICAgYXJjaGl2ZS1lbnRyeSBwYXRocywgYW5kIGl0cyB2YWx1ZXMgYXJlIGFic29sdXRlIGZpbGVzeXN0ZW0gcGF0aHMKICAgICAgICB3aGVyZSB0aGUgY29udGVudHMgdGhlIGNvcnJlc3BvbmRpbmcgYXJjaGl2ZSBlbnRyaWVzIGNhbiBiZSBmb3VuZC4gVGhlCiAgICAgICAgbW9kaWZpZXIgaXMgZnJlZSB0byBjaGFuZ2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlcyBwb2ludGVkIHRvLCBhZGQKICAgICAgICBuZXcgZW50cmllcyBhbmQgcmVtb3ZlIGVudHJpZXMsIGJlZm9yZSByZXR1cm5pbmcuIFRoaXMgbWV0aG9kIHdpbGwKICAgICAgICBleHRyYWN0IHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIHdoZWVsIHRvIGEgdGVtcG9yYXJ5IGxvY2F0aW9uLCBjYWxsCiAgICAgICAgdGhlIG1vZGlmaWVyLCBhbmQgdGhlbiB1c2UgdGhlIHBhc3NlZCAoYW5kIHBvc3NpYmx5IHVwZGF0ZWQpCiAgICAgICAgZGljdGlvbmFyeSB0byB3cml0ZSBhIG5ldyB3aGVlbC4gSWYgYGBkZXN0X2RpcmBgIGlzIHNwZWNpZmllZCwgdGhlIG5ldwogICAgICAgIHdoZWVsIGlzIHdyaXR0ZW4gdGhlcmUgLS0gb3RoZXJ3aXNlLCB0aGUgb3JpZ2luYWwgd2hlZWwgaXMgb3ZlcndyaXR0ZW4uCgogICAgICAgIFRoZSBtb2RpZmllciBzaG91bGQgcmV0dXJuIFRydWUgaWYgaXQgdXBkYXRlZCB0aGUgd2hlZWwsIGVsc2UgRmFsc2UuCiAgICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZSB0aGUgbW9kaWZpZXIgcmV0dXJucy4KICAgICAgICAiIiIKCiAgICAgICAgZGVmIGdldF92ZXJzaW9uKHBhdGhfbWFwLCBpbmZvX2Rpcik6CiAgICAgICAgICAgIHZlcnNpb24gPSBwYXRoID0gTm9uZQogICAgICAgICAgICBrZXkgPSAnJXMvJXMnICUgKGluZm9fZGlyLCBNRVRBREFUQV9GSUxFTkFNRSkKICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBwYXRoX21hcDoKICAgICAgICAgICAgICAgIGtleSA9ICclcy9QS0ctSU5GTycgJSBpbmZvX2RpcgogICAgICAgICAgICBpZiBrZXkgaW4gcGF0aF9tYXA6CiAgICAgICAgICAgICAgICBwYXRoID0gcGF0aF9tYXBba2V5XQogICAgICAgICAgICAgICAgdmVyc2lvbiA9IE1ldGFkYXRhKHBhdGg9cGF0aCkudmVyc2lvbgogICAgICAgICAgICByZXR1cm4gdmVyc2lvbiwgcGF0aAoKICAgICAgICBkZWYgdXBkYXRlX3ZlcnNpb24odmVyc2lvbiwgcGF0aCk6CiAgICAgICAgICAgIHVwZGF0ZWQgPSBOb25lCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHYgPSBOb3JtYWxpemVkVmVyc2lvbih2ZXJzaW9uKQogICAgICAgICAgICAgICAgaSA9IHZlcnNpb24uZmluZCgnLScpCiAgICAgICAgICAgICAgICBpZiBpIDwgMDoKICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gJyVzKzEnICUgdmVyc2lvbgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IFtpbnQocykgZm9yIHMgaW4gdmVyc2lvbltpICsgMTpdLnNwbGl0KCcuJyldCiAgICAgICAgICAgICAgICAgICAgcGFydHNbLTFdICs9IDEKICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gJyVzKyVzJyAlICh2ZXJzaW9uWzppXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLicuam9pbihzdHIoaSkgZm9yIGkgaW4gcGFydHMpKQogICAgICAgICAgICBleGNlcHQgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3I6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0Nhbm5vdCB1cGRhdGUgbm9uLWNvbXBsaWFudCAoUEVQLTQ0MCkgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9uICVyJywgdmVyc2lvbikKICAgICAgICAgICAgaWYgdXBkYXRlZDoKICAgICAgICAgICAgICAgIG1kID0gTWV0YWRhdGEocGF0aD1wYXRoKQogICAgICAgICAgICAgICAgbWQudmVyc2lvbiA9IHVwZGF0ZWQKICAgICAgICAgICAgICAgIGxlZ2FjeSA9IG5vdCBwYXRoLmVuZHN3aXRoKE1FVEFEQVRBX0ZJTEVOQU1FKQogICAgICAgICAgICAgICAgbWQud3JpdGUocGF0aD1wYXRoLCBsZWdhY3k9bGVnYWN5KQogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdWZXJzaW9uIHVwZGF0ZWQgZnJvbSAlciB0byAlcicsIHZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCkKCiAgICAgICAgcGF0aG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBzZWxmLmZpbGVuYW1lKQogICAgICAgIG5hbWVfdmVyID0gJyVzLSVzJyAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikKICAgICAgICBpbmZvX2RpciA9ICclcy5kaXN0LWluZm8nICUgbmFtZV92ZXIKICAgICAgICByZWNvcmRfbmFtZSA9IHBvc2l4cGF0aC5qb2luKGluZm9fZGlyLCAnUkVDT1JEJykKICAgICAgICB3aXRoIHRlbXBkaXIoKSBhcyB3b3JrZGlyOgogICAgICAgICAgICB3aXRoIFppcEZpbGUocGF0aG5hbWUsICdyJykgYXMgemY6CiAgICAgICAgICAgICAgICBwYXRoX21hcCA9IHt9CiAgICAgICAgICAgICAgICBmb3IgemluZm8gaW4gemYuaW5mb2xpc3QoKToKICAgICAgICAgICAgICAgICAgICBhcmNuYW1lID0gemluZm8uZmlsZW5hbWUKICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyY25hbWUsIHRleHRfdHlwZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHVfYXJjbmFtZSA9IGFyY25hbWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICB1X2FyY25hbWUgPSBhcmNuYW1lLmRlY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgICAgIGlmIHVfYXJjbmFtZSA9PSByZWNvcmRfbmFtZToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBpZiAnLi4nIGluIHVfYXJjbmFtZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignaW52YWxpZCBlbnRyeSBpbiAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3doZWVsOiAlcicgJSB1X2FyY25hbWUpCiAgICAgICAgICAgICAgICAgICAgemYuZXh0cmFjdCh6aW5mbywgd29ya2RpcikKICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHdvcmtkaXIsIGNvbnZlcnRfcGF0aCh1X2FyY25hbWUpKQogICAgICAgICAgICAgICAgICAgIHBhdGhfbWFwW3VfYXJjbmFtZV0gPSBwYXRoCgogICAgICAgICAgICAjIFJlbWVtYmVyIHRoZSB2ZXJzaW9uLgogICAgICAgICAgICBvcmlnaW5hbF92ZXJzaW9uLCBfID0gZ2V0X3ZlcnNpb24ocGF0aF9tYXAsIGluZm9fZGlyKQogICAgICAgICAgICAjIEZpbGVzIGV4dHJhY3RlZC4gQ2FsbCB0aGUgbW9kaWZpZXIuCiAgICAgICAgICAgIG1vZGlmaWVkID0gbW9kaWZpZXIocGF0aF9tYXAsICoqa3dhcmdzKQogICAgICAgICAgICBpZiBtb2RpZmllZDoKICAgICAgICAgICAgICAgICMgU29tZXRoaW5nIGNoYW5nZWQgLSBuZWVkIHRvIGJ1aWxkIGEgbmV3IHdoZWVsLgogICAgICAgICAgICAgICAgY3VycmVudF92ZXJzaW9uLCBwYXRoID0gZ2V0X3ZlcnNpb24ocGF0aF9tYXAsIGluZm9fZGlyKQogICAgICAgICAgICAgICAgaWYgY3VycmVudF92ZXJzaW9uIGFuZCAoY3VycmVudF92ZXJzaW9uID09IG9yaWdpbmFsX3ZlcnNpb24pOgogICAgICAgICAgICAgICAgICAgICMgQWRkIG9yIHVwZGF0ZSBsb2NhbCB2ZXJzaW9uIHRvIHNpZ25pZnkgY2hhbmdlcy4KICAgICAgICAgICAgICAgICAgICB1cGRhdGVfdmVyc2lvbihjdXJyZW50X3ZlcnNpb24sIHBhdGgpCiAgICAgICAgICAgICAgICAjIERlY2lkZSB3aGVyZSB0aGUgbmV3IHdoZWVsIGdvZXMuCiAgICAgICAgICAgICAgICBpZiBkZXN0X2RpciBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIGZkLCBuZXdwYXRoID0gdGVtcGZpbGUubWtzdGVtcChzdWZmaXg9Jy53aGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9J3doZWVsLXVwZGF0ZS0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXI9d29ya2RpcikKICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShmZCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZGVzdF9kaXIpOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdOb3QgYSBkaXJlY3Rvcnk6ICVyJyAlIGRlc3RfZGlyKQogICAgICAgICAgICAgICAgICAgIG5ld3BhdGggPSBvcy5wYXRoLmpvaW4oZGVzdF9kaXIsIHNlbGYuZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBhcmNoaXZlX3BhdGhzID0gbGlzdChwYXRoX21hcC5pdGVtcygpKQogICAgICAgICAgICAgICAgZGlzdGluZm8gPSBvcy5wYXRoLmpvaW4od29ya2RpciwgaW5mb19kaXIpCiAgICAgICAgICAgICAgICBpbmZvID0gZGlzdGluZm8sIGluZm9fZGlyCiAgICAgICAgICAgICAgICBzZWxmLndyaXRlX3JlY29yZHMoaW5mbywgd29ya2RpciwgYXJjaGl2ZV9wYXRocykKICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRfemlwKG5ld3BhdGgsIGFyY2hpdmVfcGF0aHMpCiAgICAgICAgICAgICAgICBpZiBkZXN0X2RpciBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZShuZXdwYXRoLCBwYXRobmFtZSkKICAgICAgICByZXR1cm4gbW9kaWZpZWQKCmRlZiBjb21wYXRpYmxlX3RhZ3MoKToKICAgICIiIgogICAgUmV0dXJuIChweXZlciwgYWJpLCBhcmNoKSB0dXBsZXMgY29tcGF0aWJsZSB3aXRoIHRoaXMgUHl0aG9uLgogICAgIiIiCiAgICB2ZXJzaW9ucyA9IFtWRVJfU1VGRklYXQogICAgbWFqb3IgPSBWRVJfU1VGRklYWzBdCiAgICBmb3IgbWlub3IgaW4gcmFuZ2Uoc3lzLnZlcnNpb25faW5mb1sxXSAtIDEsIC0gMSwgLTEpOgogICAgICAgIHZlcnNpb25zLmFwcGVuZCgnJy5qb2luKFttYWpvciwgc3RyKG1pbm9yKV0pKQoKICAgIGFiaXMgPSBbXQogICAgZm9yIHN1ZmZpeCwgXywgXyBpbiBpbXAuZ2V0X3N1ZmZpeGVzKCk6CiAgICAgICAgaWYgc3VmZml4LnN0YXJ0c3dpdGgoJy5hYmknKToKICAgICAgICAgICAgYWJpcy5hcHBlbmQoc3VmZml4LnNwbGl0KCcuJywgMilbMV0pCiAgICBhYmlzLnNvcnQoKQogICAgaWYgQUJJICE9ICdub25lJzoKICAgICAgICBhYmlzLmluc2VydCgwLCBBQkkpCiAgICBhYmlzLmFwcGVuZCgnbm9uZScpCiAgICByZXN1bHQgPSBbXQoKICAgIGFyY2hlcyA9IFtBUkNIXQogICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgogICAgICAgIG0gPSByZS5tYXRjaCgnKFx3KylfKFxkKylfKFxkKylfKFx3KykkJywgQVJDSCkKICAgICAgICBpZiBtOgogICAgICAgICAgICBuYW1lLCBtYWpvciwgbWlub3IsIGFyY2ggPSBtLmdyb3VwcygpCiAgICAgICAgICAgIG1pbm9yID0gaW50KG1pbm9yKQogICAgICAgICAgICBtYXRjaGVzID0gW2FyY2hdCiAgICAgICAgICAgIGlmIGFyY2ggaW4gKCdpMzg2JywgJ3BwYycpOgogICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoJ2ZhdCcpCiAgICAgICAgICAgIGlmIGFyY2ggaW4gKCdpMzg2JywgJ3BwYycsICd4ODZfNjQnKToKICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKCdmYXQzJykKICAgICAgICAgICAgaWYgYXJjaCBpbiAoJ3BwYzY0JywgJ3g4Nl82NCcpOgogICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoJ2ZhdDY0JykKICAgICAgICAgICAgaWYgYXJjaCBpbiAoJ2kzODYnLCAneDg2XzY0Jyk6CiAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCgnaW50ZWwnKQogICAgICAgICAgICBpZiBhcmNoIGluICgnaTM4NicsICd4ODZfNjQnLCAnaW50ZWwnLCAncHBjJywgJ3BwYzY0Jyk6CiAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCgndW5pdmVyc2FsJykKICAgICAgICAgICAgd2hpbGUgbWlub3IgPj0gMDoKICAgICAgICAgICAgICAgIGZvciBtYXRjaCBpbiBtYXRjaGVzOgogICAgICAgICAgICAgICAgICAgIHMgPSAnJXNfJXNfJXNfJXMnICUgKG5hbWUsIG1ham9yLCBtaW5vciwgbWF0Y2gpCiAgICAgICAgICAgICAgICAgICAgaWYgcyAhPSBBUkNIOiAgICMgYWxyZWFkeSB0aGVyZQogICAgICAgICAgICAgICAgICAgICAgICBhcmNoZXMuYXBwZW5kKHMpCiAgICAgICAgICAgICAgICBtaW5vciAtPSAxCgogICAgIyBNb3N0IHNwZWNpZmljIC0gb3VyIFB5dGhvbiB2ZXJzaW9uLCBBQkkgYW5kIGFyY2gKICAgIGZvciBhYmkgaW4gYWJpczoKICAgICAgICBmb3IgYXJjaCBpbiBhcmNoZXM6CiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKCcnLmpvaW4oKElNUF9QUkVGSVgsIHZlcnNpb25zWzBdKSksIGFiaSwgYXJjaCkpCgogICAgIyB3aGVyZSBubyBBQkkgLyBhcmNoIGRlcGVuZGVuY3ksIGJ1dCBJTVBfUFJFRklYIGRlcGVuZGVuY3kKICAgIGZvciBpLCB2ZXJzaW9uIGluIGVudW1lcmF0ZSh2ZXJzaW9ucyk6CiAgICAgICAgcmVzdWx0LmFwcGVuZCgoJycuam9pbigoSU1QX1BSRUZJWCwgdmVyc2lvbikpLCAnbm9uZScsICdhbnknKSkKICAgICAgICBpZiBpID09IDA6CiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKCcnLmpvaW4oKElNUF9QUkVGSVgsIHZlcnNpb25bMF0pKSwgJ25vbmUnLCAnYW55JykpCgogICAgIyBubyBJTVBfUFJFRklYLCBBQkkgb3IgYXJjaCBkZXBlbmRlbmN5CiAgICBmb3IgaSwgdmVyc2lvbiBpbiBlbnVtZXJhdGUodmVyc2lvbnMpOgogICAgICAgIHJlc3VsdC5hcHBlbmQoKCcnLmpvaW4oKCdweScsIHZlcnNpb24pKSwgJ25vbmUnLCAnYW55JykpCiAgICAgICAgaWYgaSA9PSAwOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKCgnJy5qb2luKCgncHknLCB2ZXJzaW9uWzBdKSksICdub25lJywgJ2FueScpKQogICAgcmV0dXJuIHNldChyZXN1bHQpCgoKQ09NUEFUSUJMRV9UQUdTID0gY29tcGF0aWJsZV90YWdzKCkKCmRlbCBjb21wYXRpYmxlX3RhZ3MKCgpkZWYgaXNfY29tcGF0aWJsZSh3aGVlbCwgdGFncz1Ob25lKToKICAgIGlmIG5vdCBpc2luc3RhbmNlKHdoZWVsLCBXaGVlbCk6CiAgICAgICAgd2hlZWwgPSBXaGVlbCh3aGVlbCkgICAgIyBhc3N1bWUgaXQncyBhIGZpbGVuYW1lCiAgICByZXN1bHQgPSBGYWxzZQogICAgaWYgdGFncyBpcyBOb25lOgogICAgICAgIHRhZ3MgPSBDT01QQVRJQkxFX1RBR1MKICAgIGZvciB2ZXIsIGFiaSwgYXJjaCBpbiB0YWdzOgogICAgICAgIGlmIHZlciBpbiB3aGVlbC5weXZlciBhbmQgYWJpIGluIHdoZWVsLmFiaSBhbmQgYXJjaCBpbiB3aGVlbC5hcmNoOgogICAgICAgICAgICByZXN1bHQgPSBUcnVlCiAgICAgICAgICAgIGJyZWFrCiAgICByZXR1cm4gcmVzdWx0ClBLAwQUAAAAAAAAACEAkcHArs2VAADNlQAAJQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0cm8ucHkjIENvcHlyaWdodCAyMDE1LDIwMTYgTmlyIENvaGVuCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIwojIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAojIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgojIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiIiIgpUaGUgYGBkaXN0cm9gYCBwYWNrYWdlIChgYGRpc3Ryb2BgIHN0YW5kcyBmb3IgTGludXggRGlzdHJpYnV0aW9uKSBwcm92aWRlcwppbmZvcm1hdGlvbiBhYm91dCB0aGUgTGludXggZGlzdHJpYnV0aW9uIGl0IHJ1bnMgb24sIHN1Y2ggYXMgYSByZWxpYWJsZQptYWNoaW5lLXJlYWRhYmxlIGRpc3RybyBJRCwgb3IgdmVyc2lvbiBpbmZvcm1hdGlvbi4KCkl0IGlzIGEgcmVuZXdlZCBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBmb3IgUHl0aG9uJ3Mgb3JpZ2luYWwKOnB5OmZ1bmM6YHBsYXRmb3JtLmxpbnV4X2Rpc3RyaWJ1dGlvbmAgZnVuY3Rpb24sIGJ1dCBpdCBwcm92aWRlcyBtdWNoIG1vcmUKZnVuY3Rpb25hbGl0eS4gQW4gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gYmVjYW1lIG5lY2Vzc2FyeSBiZWNhdXNlIFB5dGhvbgozLjUgZGVwcmVjYXRlZCB0aGlzIGZ1bmN0aW9uLCBhbmQgUHl0aG9uIDMuNyBpcyBleHBlY3RlZCB0byByZW1vdmUgaXQKYWx0b2dldGhlci4gSXRzIHByZWRlY2Vzc29yIGZ1bmN0aW9uIDpweTpmdW5jOmBwbGF0Zm9ybS5kaXN0YCB3YXMgYWxyZWFkeQpkZXByZWNhdGVkIHNpbmNlIFB5dGhvbiAyLjYgYW5kIGlzIGFsc28gZXhwZWN0ZWQgdG8gYmUgcmVtb3ZlZCBpbiBQeXRob24gMy43LgpTdGlsbCwgdGhlcmUgYXJlIG1hbnkgY2FzZXMgaW4gd2hpY2ggYWNjZXNzIHRvIExpbnV4IGRpc3RyaWJ1dGlvbiBpbmZvcm1hdGlvbgppcyBuZWVkZWQuIFNlZSBgUHl0aG9uIGlzc3VlIDEzMjIgPGh0dHBzOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTMyMj5gXyBmb3IKbW9yZSBpbmZvcm1hdGlvbi4KIiIiCgppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzeXMKaW1wb3J0IGpzb24KaW1wb3J0IHNobGV4CmltcG9ydCBsb2dnaW5nCmltcG9ydCBzdWJwcm9jZXNzCgoKaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdsaW51eCcpOgogICAgcmFpc2UgSW1wb3J0RXJyb3IoJ1Vuc3VwcG9ydGVkIHBsYXRmb3JtOiB7MH0nLmZvcm1hdChzeXMucGxhdGZvcm0pKQoKX1VOSVhDT05GRElSID0gJy9ldGMnCl9PU19SRUxFQVNFX0JBU0VOQU1FID0gJ29zLXJlbGVhc2UnCgojOiBUcmFuc2xhdGlvbiB0YWJsZSBmb3Igbm9ybWFsaXppbmcgdGhlICJJRCIgYXR0cmlidXRlIGRlZmluZWQgaW4gb3MtcmVsZWFzZQojOiBmaWxlcywgZm9yIHVzZSBieSB0aGUgOmZ1bmM6YGRpc3Ryby5pZGAgbWV0aG9kLgojOgojOiAqIEtleTogVmFsdWUgYXMgZGVmaW5lZCBpbiB0aGUgb3MtcmVsZWFzZSBmaWxlLCB0cmFuc2xhdGVkIHRvIGxvd2VyIGNhc2UsCiM6ICAgd2l0aCBibGFua3MgdHJhbnNsYXRlZCB0byB1bmRlcnNjb3Jlcy4KIzoKIzogKiBWYWx1ZTogTm9ybWFsaXplZCB2YWx1ZS4KTk9STUFMSVpFRF9PU19JRCA9IHt9CgojOiBUcmFuc2xhdGlvbiB0YWJsZSBmb3Igbm9ybWFsaXppbmcgdGhlICJEaXN0cmlidXRvciBJRCIgYXR0cmlidXRlIHJldHVybmVkIGJ5CiM6IHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kLCBmb3IgdXNlIGJ5IHRoZSA6ZnVuYzpgZGlzdHJvLmlkYCBtZXRob2QuCiM6CiM6ICogS2V5OiBWYWx1ZSBhcyByZXR1cm5lZCBieSB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCwgdHJhbnNsYXRlZCB0byBsb3dlcgojOiAgIGNhc2UsIHdpdGggYmxhbmtzIHRyYW5zbGF0ZWQgdG8gdW5kZXJzY29yZXMuCiM6CiM6ICogVmFsdWU6IE5vcm1hbGl6ZWQgdmFsdWUuCk5PUk1BTElaRURfTFNCX0lEID0gewogICAgJ2VudGVycHJpc2VlbnRlcnByaXNlJzogJ29yYWNsZScsICAjIE9yYWNsZSBFbnRlcnByaXNlIExpbnV4CiAgICAncmVkaGF0ZW50ZXJwcmlzZXdvcmtzdGF0aW9uJzogJ3JoZWwnLCAgIyBSSEVMIDYuNwp9CgojOiBUcmFuc2xhdGlvbiB0YWJsZSBmb3Igbm9ybWFsaXppbmcgdGhlIGRpc3RybyBJRCBkZXJpdmVkIGZyb20gdGhlIGZpbGUgbmFtZQojOiBvZiBkaXN0cm8gcmVsZWFzZSBmaWxlcywgZm9yIHVzZSBieSB0aGUgOmZ1bmM6YGRpc3Ryby5pZGAgbWV0aG9kLgojOgojOiAqIEtleTogVmFsdWUgYXMgZGVyaXZlZCBmcm9tIHRoZSBmaWxlIG5hbWUgb2YgYSBkaXN0cm8gcmVsZWFzZSBmaWxlLAojOiAgIHRyYW5zbGF0ZWQgdG8gbG93ZXIgY2FzZSwgd2l0aCBibGFua3MgdHJhbnNsYXRlZCB0byB1bmRlcnNjb3Jlcy4KIzoKIzogKiBWYWx1ZTogTm9ybWFsaXplZCB2YWx1ZS4KTk9STUFMSVpFRF9ESVNUUk9fSUQgPSB7CiAgICAncmVkaGF0JzogJ3JoZWwnLCAgIyBSSEVMIDYueCwgNy54Cn0KCiMgUGF0dGVybiBmb3IgY29udGVudCBvZiBkaXN0cm8gcmVsZWFzZSBmaWxlIChyZXZlcnNlZCkKX0RJU1RST19SRUxFQVNFX0NPTlRFTlRfUkVWRVJTRURfUEFUVEVSTiA9IHJlLmNvbXBpbGUoCiAgICByJyg/OlteKV0qXCkoLiopXCgpPyAqKD86U1RMICk/KFtcZC4rXC1hLXpdKlxkKSAqKD86ZXNhZWxlciAqKT8oLispJykKCiMgUGF0dGVybiBmb3IgYmFzZSBmaWxlIG5hbWUgb2YgZGlzdHJvIHJlbGVhc2UgZmlsZQpfRElTVFJPX1JFTEVBU0VfQkFTRU5BTUVfUEFUVEVSTiA9IHJlLmNvbXBpbGUoCiAgICByJyhcdyspWy1fXShyZWxlYXNlfHZlcnNpb24pJCcpCgojIEJhc2UgZmlsZSBuYW1lcyB0byBiZSBpZ25vcmVkIHdoZW4gc2VhcmNoaW5nIGZvciBkaXN0cm8gcmVsZWFzZSBmaWxlCl9ESVNUUk9fUkVMRUFTRV9JR05PUkVfQkFTRU5BTUVTID0gKAogICAgJ2RlYmlhbl92ZXJzaW9uJywKICAgICdsc2ItcmVsZWFzZScsCiAgICAnb2VtLXJlbGVhc2UnLAogICAgX09TX1JFTEVBU0VfQkFTRU5BTUUsCiAgICAnc3lzdGVtLXJlbGVhc2UnCikKCgpkZWYgbGludXhfZGlzdHJpYnV0aW9uKGZ1bGxfZGlzdHJpYnV0aW9uX25hbWU9VHJ1ZSk6CiAgICAiIiIKICAgIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24gYXMgYSB0dXBsZQogICAgYGAoaWRfbmFtZSwgdmVyc2lvbiwgY29kZW5hbWUpYGAgd2l0aCBpdGVtcyBhcyBmb2xsb3dzOgoKICAgICogYGBpZF9uYW1lYGA6ICBJZiAqZnVsbF9kaXN0cmlidXRpb25fbmFtZSogaXMgZmFsc2UsIHRoZSByZXN1bHQgb2YKICAgICAgOmZ1bmM6YGRpc3Ryby5pZGAuIE90aGVyd2lzZSwgdGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLm5hbWVgLgoKICAgICogYGB2ZXJzaW9uYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAuCgogICAgKiBgYGNvZGVuYW1lYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8uY29kZW5hbWVgLgoKICAgIFRoZSBpbnRlcmZhY2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9yaWdpbmFsCiAgICA6cHk6ZnVuYzpgcGxhdGZvcm0ubGludXhfZGlzdHJpYnV0aW9uYCBmdW5jdGlvbiwgc3VwcG9ydGluZyBhIHN1YnNldCBvZgogICAgaXRzIHBhcmFtZXRlcnMuCgogICAgVGhlIGRhdGEgaXQgcmV0dXJucyBtYXkgbm90IGV4YWN0bHkgYmUgdGhlIHNhbWUsIGJlY2F1c2UgaXQgdXNlcyBtb3JlIGRhdGEKICAgIHNvdXJjZXMgdGhhbiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24sIGFuZCB0aGF0IG1heSBsZWFkIHRvIGRpZmZlcmVudCBkYXRhIGlmCiAgICB0aGUgTGludXggZGlzdHJpYnV0aW9uIGlzIG5vdCBjb25zaXN0ZW50IGFjcm9zcyBtdWx0aXBsZSBkYXRhIHNvdXJjZXMgaXQKICAgIHByb3ZpZGVzICh0aGVyZSBhcmUgaW5kZWVkIHN1Y2ggZGlzdHJpYnV0aW9ucyAuLi4pLgoKICAgIEFub3RoZXIgcmVhc29uIGZvciBkaWZmZXJlbmNlcyBpcyB0aGUgZmFjdCB0aGF0IHRoZSA6ZnVuYzpgZGlzdHJvLmlkYAogICAgbWV0aG9kIG5vcm1hbGl6ZXMgdGhlIGRpc3RybyBJRCBzdHJpbmcgdG8gYSByZWxpYWJsZSBtYWNoaW5lLXJlYWRhYmxlIHZhbHVlCiAgICBmb3IgYSBudW1iZXIgb2YgcG9wdWxhciBMaW51eCBkaXN0cmlidXRpb25zLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5saW51eF9kaXN0cmlidXRpb24oZnVsbF9kaXN0cmlidXRpb25fbmFtZSkKCgpkZWYgaWQoKToKICAgICIiIgogICAgUmV0dXJuIHRoZSBkaXN0cm8gSUQgb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLCBhcyBhCiAgICBtYWNoaW5lLXJlYWRhYmxlIHN0cmluZy4KCiAgICBGb3IgYSBudW1iZXIgb2YgTGludXggZGlzdHJpYnV0aW9ucywgdGhlIHJldHVybmVkIGRpc3RybyBJRCB2YWx1ZSBpcwogICAgKnJlbGlhYmxlKiwgaW4gdGhlIHNlbnNlIHRoYXQgaXQgaXMgZG9jdW1lbnRlZCBhbmQgdGhhdCBpdCBkb2VzIG5vdCBjaGFuZ2UKICAgIGFjcm9zcyByZWxlYXNlcyBvZiB0aGUgZGlzdHJpYnV0aW9uLgoKICAgIFRoaXMgcGFja2FnZSBtYWludGFpbnMgdGhlIGZvbGxvd2luZyByZWxpYWJsZSBkaXN0cm8gSUQgdmFsdWVzOgoKICAgID09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgRGlzdHJvIElEICAgICAgIERpc3RyaWJ1dGlvbgogICAgPT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAidWJ1bnR1IiAgICAgICAgVWJ1bnR1CiAgICAiZGViaWFuIiAgICAgICAgRGViaWFuCiAgICAicmhlbCIgICAgICAgICAgUmVkSGF0IEVudGVycHJpc2UgTGludXgKICAgICJjZW50b3MiICAgICAgICBDZW50T1MKICAgICJmZWRvcmEiICAgICAgICBGZWRvcmEKICAgICJzbGVzIiAgICAgICAgICBTVVNFIExpbnV4IEVudGVycHJpc2UgU2VydmVyCiAgICAib3BlbnN1c2UiICAgICAgb3BlblNVU0UKICAgICJhbWF6b24iICAgICAgICBBbWF6b24gTGludXgKICAgICJhcmNoIiAgICAgICAgICBBcmNoIExpbnV4CiAgICAiY2xvdWRsaW51eCIgICAgQ2xvdWRMaW51eCBPUwogICAgImV4aGVyYm8iICAgICAgIEV4aGVyYm8gTGludXgKICAgICJnZW50b28iICAgICAgICBHZW5Ub28gTGludXgKICAgICJpYm1fcG93ZXJrdm0iICBJQk0gUG93ZXJLVk0KICAgICJrdm1pYm0iICAgICAgICBLVk0gZm9yIElCTSB6IFN5c3RlbXMKICAgICJsaW51eG1pbnQiICAgICBMaW51eCBNaW50CiAgICAibWFnZWlhIiAgICAgICAgTWFnZWlhCiAgICAibWFuZHJpdmEiICAgICAgTWFuZHJpdmEgTGludXgKICAgICJwYXJhbGxlbHMiICAgICBQYXJhbGxlbHMKICAgICJwaWRvcmEiICAgICAgICBQaWRvcmEKICAgICJyYXNwYmlhbiIgICAgICBSYXNwYmlhbgogICAgIm9yYWNsZSIgICAgICAgIE9yYWNsZSBMaW51eCAoYW5kIE9yYWNsZSBFbnRlcnByaXNlIExpbnV4KQogICAgInNjaWVudGlmaWMiICAgIFNjaWVudGlmaWMgTGludXgKICAgICJzbGFja3dhcmUiICAgICBTbGFja3dhcmUKICAgICJ4ZW5zZXJ2ZXIiICAgICBYZW5TZXJ2ZXIKICAgID09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIElmIHlvdSBoYXZlIGEgbmVlZCB0byBnZXQgZGlzdHJvcyBmb3IgcmVsaWFibGUgSURzIGFkZGVkIGludG8gdGhpcyBzZXQsCiAgICBvciBpZiB5b3UgZmluZCB0aGF0IHRoZSA6ZnVuYzpgZGlzdHJvLmlkYCBmdW5jdGlvbiByZXR1cm5zIGEgZGlmZmVyZW50CiAgICBkaXN0cm8gSUQgZm9yIG9uZSBvZiB0aGUgbGlzdGVkIGRpc3Ryb3MsIHBsZWFzZSBjcmVhdGUgYW4gaXNzdWUgaW4gdGhlCiAgICBgZGlzdHJvIGlzc3VlIHRyYWNrZXJgXy4KCiAgICAqKkxvb2t1cCBoaWVyYXJjaHkgYW5kIHRyYW5zZm9ybWF0aW9uczoqKgoKICAgIEZpcnN0LCB0aGUgSUQgaXMgb2J0YWluZWQgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZXMsIGluIHRoZSBzcGVjaWZpZWQKICAgIG9yZGVyLiBUaGUgZmlyc3QgYXZhaWxhYmxlIGFuZCBub24tZW1wdHkgdmFsdWUgaXMgdXNlZDoKCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIklEIiBhdHRyaWJ1dGUgb2YgdGhlIG9zLXJlbGVhc2UgZmlsZSwKCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIkRpc3RyaWJ1dG9yIElEIiBhdHRyaWJ1dGUgcmV0dXJuZWQgYnkgdGhlIGxzYl9yZWxlYXNlCiAgICAgIGNvbW1hbmQsCgogICAgKiB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZmlsZSBuYW1lIG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLAoKICAgIFRoZSBzbyBkZXRlcm1pbmVkIElEIHZhbHVlIHRoZW4gcGFzc2VzIHRoZSBmb2xsb3dpbmcgdHJhbnNmb3JtYXRpb25zLAogICAgYmVmb3JlIGl0IGlzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kOgoKICAgICogaXQgaXMgdHJhbnNsYXRlZCB0byBsb3dlciBjYXNlLAoKICAgICogYmxhbmtzICh3aGljaCBzaG91bGQgbm90IGJlIHRoZXJlIGFueXdheSkgYXJlIHRyYW5zbGF0ZWQgdG8gdW5kZXJzY29yZXMsCgogICAgKiBhIG5vcm1hbGl6YXRpb24gb2YgdGhlIElEIGlzIHBlcmZvcm1lZCwgYmFzZWQgdXBvbgogICAgICBgbm9ybWFsaXphdGlvbiB0YWJsZXNgXy4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBub3JtYWxpemF0aW9uIGlzIHRvIGVuc3VyZQogICAgICB0aGF0IHRoZSBJRCBpcyBhcyByZWxpYWJsZSBhcyBwb3NzaWJsZSwgZXZlbiBhY3Jvc3MgaW5jb21wYXRpYmxlIGNoYW5nZXMKICAgICAgaW4gdGhlIExpbnV4IGRpc3RyaWJ1dGlvbnMuIEEgY29tbW9uIHJlYXNvbiBmb3IgYW4gaW5jb21wYXRpYmxlIGNoYW5nZSBpcwogICAgICB0aGUgYWRkaXRpb24gb2YgYW4gb3MtcmVsZWFzZSBmaWxlLCBvciB0aGUgYWRkaXRpb24gb2YgdGhlIGxzYl9yZWxlYXNlCiAgICAgIGNvbW1hbmQsIHdpdGggSUQgdmFsdWVzIHRoYXQgZGlmZmVyIGZyb20gd2hhdCB3YXMgcHJldmlvdXNseSBkZXRlcm1pbmVkCiAgICAgIGZyb20gdGhlIGRpc3RybyByZWxlYXNlIGZpbGUgbmFtZS4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8uaWQoKQoKCmRlZiBuYW1lKHByZXR0eT1GYWxzZSk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24sIGFzIGEgaHVtYW4tcmVhZGFibGUKICAgIHN0cmluZy4KCiAgICBJZiAqcHJldHR5KiBpcyBmYWxzZSwgdGhlIG5hbWUgaXMgcmV0dXJuZWQgd2l0aG91dCB2ZXJzaW9uIG9yIGNvZGVuYW1lLgogICAgKGUuZy4gIkNlbnRPUyBMaW51eCIpCgogICAgSWYgKnByZXR0eSogaXMgdHJ1ZSwgdGhlIHZlcnNpb24gYW5kIGNvZGVuYW1lIGFyZSBhcHBlbmRlZC4KICAgIChlLmcuICJDZW50T1MgTGludXggNy4xLjE1MDMgKENvcmUpIikKCiAgICAqKkxvb2t1cCBoaWVyYXJjaHk6KioKCiAgICBUaGUgbmFtZSBpcyBvYnRhaW5lZCBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlcywgaW4gdGhlIHNwZWNpZmllZCBvcmRlci4KICAgIFRoZSBmaXJzdCBhdmFpbGFibGUgYW5kIG5vbi1lbXB0eSB2YWx1ZSBpcyB1c2VkOgoKICAgICogSWYgKnByZXR0eSogaXMgZmFsc2U6CgogICAgICAtIHRoZSB2YWx1ZSBvZiB0aGUgIk5BTUUiIGF0dHJpYnV0ZSBvZiB0aGUgb3MtcmVsZWFzZSBmaWxlLAoKICAgICAgLSB0aGUgdmFsdWUgb2YgdGhlICJEaXN0cmlidXRvciBJRCIgYXR0cmlidXRlIHJldHVybmVkIGJ5IHRoZSBsc2JfcmVsZWFzZQogICAgICAgIGNvbW1hbmQsCgogICAgICAtIHRoZSB2YWx1ZSBvZiB0aGUgIjxuYW1lPiIgZmllbGQgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGUuCgogICAgKiBJZiAqcHJldHR5KiBpcyB0cnVlOgoKICAgICAgLSB0aGUgdmFsdWUgb2YgdGhlICJQUkVUVFlfTkFNRSIgYXR0cmlidXRlIG9mIHRoZSBvcy1yZWxlYXNlIGZpbGUsCgogICAgICAtIHRoZSB2YWx1ZSBvZiB0aGUgIkRlc2NyaXB0aW9uIiBhdHRyaWJ1dGUgcmV0dXJuZWQgYnkgdGhlIGxzYl9yZWxlYXNlCiAgICAgICAgY29tbWFuZCwKCiAgICAgIC0gdGhlIHZhbHVlIG9mIHRoZSAiPG5hbWU+IiBmaWVsZCBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSwgYXBwZW5kZWQKICAgICAgICB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgcHJldHR5IHZlcnNpb24gKCI8dmVyc2lvbl9pZD4iIGFuZCAiPGNvZGVuYW1lPiIKICAgICAgICBmaWVsZHMpIG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLCBpZiBhdmFpbGFibGUuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLm5hbWUocHJldHR5KQoKCmRlZiB2ZXJzaW9uKHByZXR0eT1GYWxzZSwgYmVzdD1GYWxzZSk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24sIGFzIGEgaHVtYW4tcmVhZGFibGUKICAgIHN0cmluZy4KCiAgICBJZiAqcHJldHR5KiBpcyBmYWxzZSwgdGhlIHZlcnNpb24gaXMgcmV0dXJuZWQgd2l0aG91dCBjb2RlbmFtZSAoZS5nLgogICAgIjcuMCIpLgoKICAgIElmICpwcmV0dHkqIGlzIHRydWUsIHRoZSBjb2RlbmFtZSBpbiBwYXJlbnRoZXNpcyBpcyBhcHBlbmRlZCwgaWYgdGhlCiAgICBjb2RlbmFtZSBpcyBub24tZW1wdHkgKGUuZy4gIjcuMCAoTWFpcG8pIikuCgogICAgU29tZSBkaXN0cmlidXRpb25zIHByb3ZpZGUgdmVyc2lvbiBudW1iZXJzIHdpdGggZGlmZmVyZW50IHByZWNpc2lvbnMgaW4KICAgIHRoZSBkaWZmZXJlbnQgc291cmNlcyBvZiBkaXN0cmlidXRpb24gaW5mb3JtYXRpb24uIEV4YW1pbmluZyB0aGUgZGlmZmVyZW50CiAgICBzb3VyY2VzIGluIGEgZml4ZWQgcHJpb3JpdHkgb3JkZXIgZG9lcyBub3QgYWx3YXlzIHlpZWxkIHRoZSBtb3N0IHByZWNpc2UKICAgIHZlcnNpb24gKGUuZy4gZm9yIERlYmlhbiA4LjIsIG9yIENlbnRPUyA3LjEpLgoKICAgIFRoZSAqYmVzdCogcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGFwcHJvYWNoIGZvciB0aGUgcmV0dXJuZWQKICAgIHZlcnNpb246CgogICAgSWYgKmJlc3QqIGlzIGZhbHNlLCB0aGUgZmlyc3Qgbm9uLWVtcHR5IHZlcnNpb24gbnVtYmVyIGluIHByaW9yaXR5IG9yZGVyIG9mCiAgICB0aGUgZXhhbWluZWQgc291cmNlcyBpcyByZXR1cm5lZC4KCiAgICBJZiAqYmVzdCogaXMgdHJ1ZSwgdGhlIG1vc3QgcHJlY2lzZSB2ZXJzaW9uIG51bWJlciBvdXQgb2YgYWxsIGV4YW1pbmVkCiAgICBzb3VyY2VzIGlzIHJldHVybmVkLgoKICAgICoqTG9va3VwIGhpZXJhcmNoeToqKgoKICAgIEluIGFsbCBjYXNlcywgdGhlIHZlcnNpb24gbnVtYmVyIGlzIG9idGFpbmVkIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2VzLgogICAgSWYgKmJlc3QqIGlzIGZhbHNlLCB0aGlzIG9yZGVyIHJlcHJlc2VudHMgdGhlIHByaW9yaXR5IG9yZGVyOgoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiVkVSU0lPTl9JRCIgYXR0cmlidXRlIG9mIHRoZSBvcy1yZWxlYXNlIGZpbGUsCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIlJlbGVhc2UiIGF0dHJpYnV0ZSByZXR1cm5lZCBieSB0aGUgbHNiX3JlbGVhc2UKICAgICAgY29tbWFuZCwKICAgICogdGhlIHZlcnNpb24gbnVtYmVyIHBhcnNlZCBmcm9tIHRoZSAiPHZlcnNpb25faWQ+IiBmaWVsZCBvZiB0aGUgZmlyc3QgbGluZQogICAgICBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSwKICAgICogdGhlIHZlcnNpb24gbnVtYmVyIHBhcnNlZCBmcm9tIHRoZSAiUFJFVFRZX05BTUUiIGF0dHJpYnV0ZSBvZiB0aGUKICAgICAgb3MtcmVsZWFzZSBmaWxlLCBpZiBpdCBmb2xsb3dzIHRoZSBmb3JtYXQgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGVzLgogICAgKiB0aGUgdmVyc2lvbiBudW1iZXIgcGFyc2VkIGZyb20gdGhlICJEZXNjcmlwdGlvbiIgYXR0cmlidXRlIHJldHVybmVkIGJ5CiAgICAgIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kLCBpZiBpdCBmb2xsb3dzIHRoZSBmb3JtYXQgb2YgdGhlIGRpc3RybyByZWxlYXNlCiAgICAgIGZpbGVzLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby52ZXJzaW9uKHByZXR0eSwgYmVzdCkKCgpkZWYgdmVyc2lvbl9wYXJ0cyhiZXN0PUZhbHNlKToKICAgICIiIgogICAgUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbiBhcyBhIHR1cGxlCiAgICBgYChtYWpvciwgbWlub3IsIGJ1aWxkX251bWJlcilgYCB3aXRoIGl0ZW1zIGFzIGZvbGxvd3M6CgogICAgKiBgYG1ham9yYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8ubWFqb3JfdmVyc2lvbmAuCgogICAgKiBgYG1pbm9yYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8ubWlub3JfdmVyc2lvbmAuCgogICAgKiBgYGJ1aWxkX251bWJlcmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLmJ1aWxkX251bWJlcmAuCgogICAgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlICpiZXN0KiBwYXJhbWV0ZXIsIHNlZSB0aGUgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uYAogICAgbWV0aG9kLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby52ZXJzaW9uX3BhcnRzKGJlc3QpCgoKZGVmIG1ham9yX3ZlcnNpb24oYmVzdD1GYWxzZSk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgbWFqb3IgdmVyc2lvbiBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24sIGFzIGEgc3RyaW5nLAogICAgaWYgcHJvdmlkZWQuCiAgICBPdGhlcndpc2UsIHRoZSBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuIFRoZSBtYWpvciB2ZXJzaW9uIGlzIHRoZSBmaXJzdAogICAgcGFydCBvZiB0aGUgZG90LXNlcGFyYXRlZCB2ZXJzaW9uIHN0cmluZy4KCiAgICBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgKmJlc3QqIHBhcmFtZXRlciwgc2VlIHRoZSA6ZnVuYzpgZGlzdHJvLnZlcnNpb25gCiAgICBtZXRob2QuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLm1ham9yX3ZlcnNpb24oYmVzdCkKCgpkZWYgbWlub3JfdmVyc2lvbihiZXN0PUZhbHNlKToKICAgICIiIgogICAgUmV0dXJuIHRoZSBtaW5vciB2ZXJzaW9uIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbiwgYXMgYSBzdHJpbmcsCiAgICBpZiBwcm92aWRlZC4KICAgIE90aGVyd2lzZSwgdGhlIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4gVGhlIG1pbm9yIHZlcnNpb24gaXMgdGhlIHNlY29uZAogICAgcGFydCBvZiB0aGUgZG90LXNlcGFyYXRlZCB2ZXJzaW9uIHN0cmluZy4KCiAgICBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgKmJlc3QqIHBhcmFtZXRlciwgc2VlIHRoZSA6ZnVuYzpgZGlzdHJvLnZlcnNpb25gCiAgICBtZXRob2QuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLm1pbm9yX3ZlcnNpb24oYmVzdCkKCgpkZWYgYnVpbGRfbnVtYmVyKGJlc3Q9RmFsc2UpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIGJ1aWxkIG51bWJlciBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24sIGFzIGEgc3RyaW5nLAogICAgaWYgcHJvdmlkZWQuCiAgICBPdGhlcndpc2UsIHRoZSBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuIFRoZSBidWlsZCBudW1iZXIgaXMgdGhlIHRoaXJkIHBhcnQKICAgIG9mIHRoZSBkb3Qtc2VwYXJhdGVkIHZlcnNpb24gc3RyaW5nLgoKICAgIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSAqYmVzdCogcGFyYW1ldGVyLCBzZWUgdGhlIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAKICAgIG1ldGhvZC4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8uYnVpbGRfbnVtYmVyKGJlc3QpCgoKZGVmIGxpa2UoKToKICAgICIiIgogICAgUmV0dXJuIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgZGlzdHJvIElEcyBvZiBkaXN0cmlidXRpb25zIHRoYXQgYXJlCiAgICBjbG9zZWx5IHJlbGF0ZWQgdG8gdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uIGluIHJlZ2FyZHMgdG8gcGFja2FnaW5nCiAgICBhbmQgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlcywgZm9yIGV4YW1wbGUgZGlzdHJpYnV0aW9ucyB0aGUgY3VycmVudAogICAgZGlzdHJpYnV0aW9uIGlzIGEgZGVyaXZhdGl2ZSBmcm9tLgoKICAgICoqTG9va3VwIGhpZXJhcmNoeToqKgoKICAgIFRoaXMgaW5mb3JtYXRpb24gaXRlbSBpcyBvbmx5IHByb3ZpZGVkIGJ5IHRoZSBvcy1yZWxlYXNlIGZpbGUuCiAgICBGb3IgZGV0YWlscywgc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgIklEX0xJS0UiIGF0dHJpYnV0ZSBpbiB0aGUKICAgIGBvcy1yZWxlYXNlIG1hbiBwYWdlCiAgICA8aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvc3lzdGVtZC9tYW4vb3MtcmVsZWFzZS5odG1sPmBfLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5saWtlKCkKCgpkZWYgY29kZW5hbWUoKToKICAgICIiIgogICAgUmV0dXJuIHRoZSBjb2RlbmFtZSBmb3IgdGhlIHJlbGVhc2Ugb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLAogICAgYXMgYSBzdHJpbmcuCgogICAgSWYgdGhlIGRpc3RyaWJ1dGlvbiBkb2VzIG5vdCBoYXZlIGEgY29kZW5hbWUsIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KCiAgICBOb3RlIHRoYXQgdGhlIHJldHVybmVkIGNvZGVuYW1lIGlzIG5vdCBhbHdheXMgcmVhbGx5IGEgY29kZW5hbWUuIEZvcgogICAgZXhhbXBsZSwgb3BlblNVU0UgcmV0dXJucyAieDg2XzY0Ii4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYW5kbGUgc3VjaAogICAgY2FzZXMgaW4gYW55IHNwZWNpYWwgd2F5IGFuZCBqdXN0IHJldHVybnMgdGhlIHN0cmluZyBpdCBmaW5kcywgaWYgYW55LgoKICAgICoqTG9va3VwIGhpZXJhcmNoeToqKgoKICAgICogdGhlIGNvZGVuYW1lIHdpdGhpbiB0aGUgIlZFUlNJT04iIGF0dHJpYnV0ZSBvZiB0aGUgb3MtcmVsZWFzZSBmaWxlLCBpZgogICAgICBwcm92aWRlZCwKCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIkNvZGVuYW1lIiBhdHRyaWJ1dGUgcmV0dXJuZWQgYnkgdGhlIGxzYl9yZWxlYXNlCiAgICAgIGNvbW1hbmQsCgogICAgKiB0aGUgdmFsdWUgb2YgdGhlICI8Y29kZW5hbWU+IiBmaWVsZCBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZS4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8uY29kZW5hbWUoKQoKCmRlZiBpbmZvKHByZXR0eT1GYWxzZSwgYmVzdD1GYWxzZSk6CiAgICAiIiIKICAgIFJldHVybiBjZXJ0YWluIG1hY2hpbmUtcmVhZGFibGUgaW5mb3JtYXRpb24gaXRlbXMgYWJvdXQgdGhlIGN1cnJlbnQgTGludXgKICAgIGRpc3RyaWJ1dGlvbiBpbiBhIGRpY3Rpb25hcnksIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKCiAgICAuLiBzb3VyY2Vjb2RlOjogcHl0aG9uCgogICAgICAgIHsKICAgICAgICAgICAgJ2lkJzogJ3JoZWwnLAogICAgICAgICAgICAndmVyc2lvbic6ICc3LjAnLAogICAgICAgICAgICAndmVyc2lvbl9wYXJ0cyc6IHsKICAgICAgICAgICAgICAgICdtYWpvcic6ICc3JywKICAgICAgICAgICAgICAgICdtaW5vcic6ICcwJywKICAgICAgICAgICAgICAgICdidWlsZF9udW1iZXInOiAnJwogICAgICAgICAgICB9LAogICAgICAgICAgICAnbGlrZSc6ICdmZWRvcmEnLAogICAgICAgICAgICAnY29kZW5hbWUnOiAnTWFpcG8nCiAgICAgICAgfQoKICAgIFRoZSBkaWN0aW9uYXJ5IHN0cnVjdHVyZSBhbmQga2V5cyBhcmUgYWx3YXlzIHRoZSBzYW1lLCByZWdhcmRsZXNzIG9mIHdoaWNoCiAgICBpbmZvcm1hdGlvbiBpdGVtcyBhcmUgYXZhaWxhYmxlIGluIHRoZSB1bmRlcmx5aW5nIGRhdGEgc291cmNlcy4gVGhlIHZhbHVlcwogICAgZm9yIHRoZSB2YXJpb3VzIGtleXMgYXJlIGFzIGZvbGxvd3M6CgogICAgKiBgYGlkYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8uaWRgLgoKICAgICogYGB2ZXJzaW9uYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAuCgogICAgKiBgYHZlcnNpb25fcGFydHMgLT4gbWFqb3JgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5tYWpvcl92ZXJzaW9uYC4KCiAgICAqIGBgdmVyc2lvbl9wYXJ0cyAtPiBtaW5vcmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLm1pbm9yX3ZlcnNpb25gLgoKICAgICogYGB2ZXJzaW9uX3BhcnRzIC0+IGJ1aWxkX251bWJlcmBgOiAgVGhlIHJlc3VsdCBvZgogICAgICA6ZnVuYzpgZGlzdHJvLmJ1aWxkX251bWJlcmAuCgogICAgKiBgYGxpa2VgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5saWtlYC4KCiAgICAqIGBgY29kZW5hbWVgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5jb2RlbmFtZWAuCgogICAgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlICpwcmV0dHkqIGFuZCAqYmVzdCogcGFyYW1ldGVycywgc2VlIHRoZQogICAgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uYCBtZXRob2QuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLmluZm8ocHJldHR5LCBiZXN0KQoKCmRlZiBvc19yZWxlYXNlX2luZm8oKToKICAgICIiIgogICAgUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBmb3IgdGhlIGluZm9ybWF0aW9uIGl0ZW1zCiAgICBmcm9tIHRoZSBvcy1yZWxlYXNlIGZpbGUgZGF0YSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLgoKICAgIFNlZSBgb3MtcmVsZWFzZSBmaWxlYF8gZm9yIGRldGFpbHMgYWJvdXQgdGhlc2UgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLm9zX3JlbGVhc2VfaW5mbygpCgoKZGVmIGxzYl9yZWxlYXNlX2luZm8oKToKICAgICIiIgogICAgUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBmb3IgdGhlIGluZm9ybWF0aW9uIGl0ZW1zCiAgICBmcm9tIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kIGRhdGEgc291cmNlIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICBTZWUgYGxzYl9yZWxlYXNlIGNvbW1hbmQgb3V0cHV0YF8gZm9yIGRldGFpbHMgYWJvdXQgdGhlc2UgaW5mb3JtYXRpb24KICAgIGl0ZW1zLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5sc2JfcmVsZWFzZV9pbmZvKCkKCgpkZWYgZGlzdHJvX3JlbGVhc2VfaW5mbygpOgogICAgIiIiCiAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24gaXRlbXMKICAgIGZyb20gdGhlIGRpc3RybyByZWxlYXNlIGZpbGUgZGF0YSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLgoKICAgIFNlZSBgZGlzdHJvIHJlbGVhc2UgZmlsZWBfIGZvciBkZXRhaWxzIGFib3V0IHRoZXNlIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5kaXN0cm9fcmVsZWFzZV9pbmZvKCkKCgpkZWYgb3NfcmVsZWFzZV9hdHRyKGF0dHJpYnV0ZSk6CiAgICAiIiIKICAgIFJldHVybiBhIHNpbmdsZSBuYW1lZCBpbmZvcm1hdGlvbiBpdGVtIGZyb20gdGhlIG9zLXJlbGVhc2UgZmlsZSBkYXRhIHNvdXJjZQogICAgb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLgoKICAgIFBhcmFtZXRlcnM6CgogICAgKiBgYGF0dHJpYnV0ZWBgIChzdHJpbmcpOiBLZXkgb2YgdGhlIGluZm9ybWF0aW9uIGl0ZW0uCgogICAgUmV0dXJuczoKCiAgICAqIChzdHJpbmcpOiBWYWx1ZSBvZiB0aGUgaW5mb3JtYXRpb24gaXRlbSwgaWYgdGhlIGl0ZW0gZXhpc3RzLgogICAgICBUaGUgZW1wdHkgc3RyaW5nLCBpZiB0aGUgaXRlbSBkb2VzIG5vdCBleGlzdC4KCiAgICBTZWUgYG9zLXJlbGVhc2UgZmlsZWBfIGZvciBkZXRhaWxzIGFib3V0IHRoZXNlIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5vc19yZWxlYXNlX2F0dHIoYXR0cmlidXRlKQoKCmRlZiBsc2JfcmVsZWFzZV9hdHRyKGF0dHJpYnV0ZSk6CiAgICAiIiIKICAgIFJldHVybiBhIHNpbmdsZSBuYW1lZCBpbmZvcm1hdGlvbiBpdGVtIGZyb20gdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgb3V0cHV0CiAgICBkYXRhIHNvdXJjZSBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24uCgogICAgUGFyYW1ldGVyczoKCiAgICAqIGBgYXR0cmlidXRlYGAgKHN0cmluZyk6IEtleSBvZiB0aGUgaW5mb3JtYXRpb24gaXRlbS4KCiAgICBSZXR1cm5zOgoKICAgICogKHN0cmluZyk6IFZhbHVlIG9mIHRoZSBpbmZvcm1hdGlvbiBpdGVtLCBpZiB0aGUgaXRlbSBleGlzdHMuCiAgICAgIFRoZSBlbXB0eSBzdHJpbmcsIGlmIHRoZSBpdGVtIGRvZXMgbm90IGV4aXN0LgoKICAgIFNlZSBgbHNiX3JlbGVhc2UgY29tbWFuZCBvdXRwdXRgXyBmb3IgZGV0YWlscyBhYm91dCB0aGVzZSBpbmZvcm1hdGlvbgogICAgaXRlbXMuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLmxzYl9yZWxlYXNlX2F0dHIoYXR0cmlidXRlKQoKCmRlZiBkaXN0cm9fcmVsZWFzZV9hdHRyKGF0dHJpYnV0ZSk6CiAgICAiIiIKICAgIFJldHVybiBhIHNpbmdsZSBuYW1lZCBpbmZvcm1hdGlvbiBpdGVtIGZyb20gdGhlIGRpc3RybyByZWxlYXNlIGZpbGUKICAgIGRhdGEgc291cmNlIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICBQYXJhbWV0ZXJzOgoKICAgICogYGBhdHRyaWJ1dGVgYCAoc3RyaW5nKTogS2V5IG9mIHRoZSBpbmZvcm1hdGlvbiBpdGVtLgoKICAgIFJldHVybnM6CgogICAgKiAoc3RyaW5nKTogVmFsdWUgb2YgdGhlIGluZm9ybWF0aW9uIGl0ZW0sIGlmIHRoZSBpdGVtIGV4aXN0cy4KICAgICAgVGhlIGVtcHR5IHN0cmluZywgaWYgdGhlIGl0ZW0gZG9lcyBub3QgZXhpc3QuCgogICAgU2VlIGBkaXN0cm8gcmVsZWFzZSBmaWxlYF8gZm9yIGRldGFpbHMgYWJvdXQgdGhlc2UgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLmRpc3Ryb19yZWxlYXNlX2F0dHIoYXR0cmlidXRlKQoKCmNsYXNzIExpbnV4RGlzdHJpYnV0aW9uKG9iamVjdCk6CiAgICAiIiIKICAgIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGEgTGludXggZGlzdHJpYnV0aW9uLgoKICAgIFRoaXMgcGFja2FnZSBjcmVhdGVzIGEgcHJpdmF0ZSBtb2R1bGUtZ2xvYmFsIGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aAogICAgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBhcmd1bWVudHMsIHRoYXQgaXMgdXNlZCBieSB0aGUKICAgIGBjb25zb2xpZGF0ZWQgYWNjZXNzb3IgZnVuY3Rpb25zYF8gYW5kIGBzaW5nbGUgc291cmNlIGFjY2Vzc29yIGZ1bmN0aW9uc2BfLgogICAgQnkgdXNpbmcgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBhcmd1bWVudHMsIHRoYXQgbW9kdWxlLWdsb2JhbCBpbnN0YW5jZQogICAgcmV0dXJucyBkYXRhIGFib3V0IHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbiAoaS5lLiB0aGUgZGlzdHJvIHRoaXMKICAgIHBhY2thZ2UgcnVucyBvbikuCgogICAgTm9ybWFsbHksIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY3JlYXRlIGFkZGl0aW9uYWwgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCiAgICBIb3dldmVyLCBpbiBzaXR1YXRpb25zIHdoZXJlIGNvbnRyb2wgaXMgbmVlZGVkIG92ZXIgdGhlIGV4YWN0IGRhdGEgc291cmNlcwogICAgdGhhdCBhcmUgdXNlZCwgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgY2FuIGJlIGNyZWF0ZWQgd2l0aCBhIHNwZWNpZmljCiAgICBkaXN0cm8gcmVsZWFzZSBmaWxlLCBvciBhIHNwZWNpZmljIG9zLXJlbGVhc2UgZmlsZSwgb3Igd2l0aG91dCBpbnZva2luZyB0aGUKICAgIGxzYl9yZWxlYXNlIGNvbW1hbmQuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwKICAgICAgICAgICAgICAgICBpbmNsdWRlX2xzYj1UcnVlLAogICAgICAgICAgICAgICAgIG9zX3JlbGVhc2VfZmlsZT0nJywKICAgICAgICAgICAgICAgICBkaXN0cm9fcmVsZWFzZV9maWxlPScnKToKICAgICAgICAiIiIKICAgICAgICBUaGUgaW5pdGlhbGl6YXRpb24gbWV0aG9kIG9mIHRoaXMgY2xhc3MgZ2F0aGVycyBpbmZvcm1hdGlvbiBmcm9tIHRoZQogICAgICAgIGF2YWlsYWJsZSBkYXRhIHNvdXJjZXMsIGFuZCBzdG9yZXMgdGhhdCBpbiBwcml2YXRlIGluc3RhbmNlIGF0dHJpYnV0ZXMuCiAgICAgICAgU3Vic2VxdWVudCBhY2Nlc3MgdG8gdGhlIGluZm9ybWF0aW9uIGl0ZW1zIHVzZXMgdGhlc2UgcHJpdmF0ZSBpbnN0YW5jZQogICAgICAgIGF0dHJpYnV0ZXMsIHNvIHRoYXQgdGhlIGRhdGEgc291cmNlcyBhcmUgcmVhZCBvbmx5IG9uY2UuCgogICAgICAgIFBhcmFtZXRlcnM6CgogICAgICAgICogYGBpbmNsdWRlX2xzYmBgIChib29sKTogQ29udHJvbHMgd2hldGhlciB0aGUKICAgICAgICAgIGBsc2JfcmVsZWFzZSBjb21tYW5kIG91dHB1dGBfIGlzIGluY2x1ZGVkIGFzIGEgZGF0YSBzb3VyY2UuCgogICAgICAgICAgSWYgdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgcHJvZ3JhbSBleGVjdXRpb24KICAgICAgICAgIHBhdGgsIHRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgd2lsbCBiZSBlbXB0eS4KCiAgICAgICAgKiBgYG9zX3JlbGVhc2VfZmlsZWBgIChzdHJpbmcpOiBUaGUgcGF0aCBuYW1lIG9mIHRoZQogICAgICAgICAgYG9zLXJlbGVhc2UgZmlsZWBfIHRoYXQgaXMgdG8gYmUgdXNlZCBhcyBhIGRhdGEgc291cmNlLgoKICAgICAgICAgIEFuIGVtcHR5IHN0cmluZyAodGhlIGRlZmF1bHQpIHdpbGwgY2F1c2UgdGhlIGRlZmF1bHQgcGF0aCBuYW1lIHRvCiAgICAgICAgICBiZSB1c2VkIChzZWUgYG9zLXJlbGVhc2UgZmlsZWBfIGZvciBkZXRhaWxzKS4KCiAgICAgICAgICBJZiB0aGUgc3BlY2lmaWVkIG9yIGRlZmF1bHRlZCBvcy1yZWxlYXNlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZQogICAgICAgICAgZGF0YSBzb3VyY2UgZm9yIHRoZSBvcy1yZWxlYXNlIGZpbGUgd2lsbCBiZSBlbXB0eS4KCiAgICAgICAgKiBgYGRpc3Ryb19yZWxlYXNlX2ZpbGVgYCAoc3RyaW5nKTogVGhlIHBhdGggbmFtZSBvZiB0aGUKICAgICAgICAgIGBkaXN0cm8gcmVsZWFzZSBmaWxlYF8gdGhhdCBpcyB0byBiZSB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuCgogICAgICAgICAgQW4gZW1wdHkgc3RyaW5nICh0aGUgZGVmYXVsdCkgd2lsbCBjYXVzZSBhIGRlZmF1bHQgc2VhcmNoIGFsZ29yaXRobQogICAgICAgICAgdG8gYmUgdXNlZCAoc2VlIGBkaXN0cm8gcmVsZWFzZSBmaWxlYF8gZm9yIGRldGFpbHMpLgoKICAgICAgICAgIElmIHRoZSBzcGVjaWZpZWQgZGlzdHJvIHJlbGVhc2UgZmlsZSBkb2VzIG5vdCBleGlzdCwgb3IgaWYgbm8gZGVmYXVsdAogICAgICAgICAgZGlzdHJvIHJlbGVhc2UgZmlsZSBjYW4gYmUgZm91bmQsIHRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlIGRpc3RybwogICAgICAgICAgcmVsZWFzZSBmaWxlIHdpbGwgYmUgZW1wdHkuCgogICAgICAgIFB1YmxpYyBpbnN0YW5jZSBhdHRyaWJ1dGVzOgoKICAgICAgICAqIGBgb3NfcmVsZWFzZV9maWxlYGAgKHN0cmluZyk6IFRoZSBwYXRoIG5hbWUgb2YgdGhlCiAgICAgICAgICBgb3MtcmVsZWFzZSBmaWxlYF8gdGhhdCBpcyBhY3R1YWxseSB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuIFRoZQogICAgICAgICAgZW1wdHkgc3RyaW5nIGlmIG5vIGRpc3RybyByZWxlYXNlIGZpbGUgaXMgdXNlZCBhcyBhIGRhdGEgc291cmNlLgoKICAgICAgICAqIGBgZGlzdHJvX3JlbGVhc2VfZmlsZWBgIChzdHJpbmcpOiBUaGUgcGF0aCBuYW1lIG9mIHRoZQogICAgICAgICAgYGRpc3RybyByZWxlYXNlIGZpbGVgXyB0aGF0IGlzIGFjdHVhbGx5IHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4gVGhlCiAgICAgICAgICBlbXB0eSBzdHJpbmcgaWYgbm8gZGlzdHJvIHJlbGVhc2UgZmlsZSBpcyB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuCgogICAgICAgIFJhaXNlczoKCiAgICAgICAgKiA6cHk6ZXhjOmBJT0Vycm9yYDogU29tZSBJL08gaXNzdWUgd2l0aCBhbiBvcy1yZWxlYXNlIGZpbGUgb3IgZGlzdHJvCiAgICAgICAgICByZWxlYXNlIGZpbGUuCgogICAgICAgICogOnB5OmV4Yzpgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3JgOiBUaGUgbHNiX3JlbGVhc2UgY29tbWFuZCBoYWQKICAgICAgICAgIHNvbWUgaXNzdWUgKG90aGVyIHRoYW4gbm90IGJlaW5nIGF2YWlsYWJsZSBpbiB0aGUgcHJvZ3JhbSBleGVjdXRpb24KICAgICAgICAgIHBhdGgpLgoKICAgICAgICAqIDpweTpleGM6YFVuaWNvZGVFcnJvcmA6IEEgZGF0YSBzb3VyY2UgaGFzIHVuZXhwZWN0ZWQgY2hhcmFjdGVycyBvcgogICAgICAgICAgdXNlcyBhbiB1bmV4cGVjdGVkIGVuY29kaW5nLgogICAgICAgICIiIgogICAgICAgIHNlbGYub3NfcmVsZWFzZV9maWxlID0gb3NfcmVsZWFzZV9maWxlIG9yIFwKICAgICAgICAgICAgb3MucGF0aC5qb2luKF9VTklYQ09ORkRJUiwgX09TX1JFTEVBU0VfQkFTRU5BTUUpCiAgICAgICAgc2VsZi5kaXN0cm9fcmVsZWFzZV9maWxlID0gZGlzdHJvX3JlbGVhc2VfZmlsZSBvciAnJyAgIyB1cGRhdGVkIGxhdGVyCiAgICAgICAgc2VsZi5fb3NfcmVsZWFzZV9pbmZvID0gc2VsZi5fZ2V0X29zX3JlbGVhc2VfaW5mbygpCiAgICAgICAgc2VsZi5fbHNiX3JlbGVhc2VfaW5mbyA9IHNlbGYuX2dldF9sc2JfcmVsZWFzZV9pbmZvKCkgXAogICAgICAgICAgICBpZiBpbmNsdWRlX2xzYiBlbHNlIHt9CiAgICAgICAgc2VsZi5fZGlzdHJvX3JlbGVhc2VfaW5mbyA9IHNlbGYuX2dldF9kaXN0cm9fcmVsZWFzZV9pbmZvKCkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHJlcHIgb2YgYWxsIGluZm8KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gXAogICAgICAgICAgICAiTGludXhEaXN0cmlidXRpb24oIiBcCiAgICAgICAgICAgICJvc19yZWxlYXNlX2ZpbGU9ezAhcn0sICIgXAogICAgICAgICAgICAiZGlzdHJvX3JlbGVhc2VfZmlsZT17MSFyfSwgIiBcCiAgICAgICAgICAgICJfb3NfcmVsZWFzZV9pbmZvPXsyIXJ9LCAiIFwKICAgICAgICAgICAgIl9sc2JfcmVsZWFzZV9pbmZvPXszIXJ9LCAiIFwKICAgICAgICAgICAgIl9kaXN0cm9fcmVsZWFzZV9pbmZvPXs0IXJ9KSIuZm9ybWF0KAogICAgICAgICAgICAgICAgc2VsZi5vc19yZWxlYXNlX2ZpbGUsCiAgICAgICAgICAgICAgICBzZWxmLmRpc3Ryb19yZWxlYXNlX2ZpbGUsCiAgICAgICAgICAgICAgICBzZWxmLl9vc19yZWxlYXNlX2luZm8sCiAgICAgICAgICAgICAgICBzZWxmLl9sc2JfcmVsZWFzZV9pbmZvLAogICAgICAgICAgICAgICAgc2VsZi5fZGlzdHJvX3JlbGVhc2VfaW5mbykKCiAgICBkZWYgbGludXhfZGlzdHJpYnV0aW9uKHNlbGYsIGZ1bGxfZGlzdHJpYnV0aW9uX25hbWU9VHJ1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBMaW51eCBkaXN0cmlidXRpb24gdGhhdCBpcyBjb21wYXRpYmxlCiAgICAgICAgd2l0aCBQeXRob24ncyA6ZnVuYzpgcGxhdGZvcm0ubGludXhfZGlzdHJpYnV0aW9uYCwgc3VwcG9ydGluZyBhIHN1YnNldAogICAgICAgIG9mIGl0cyBwYXJhbWV0ZXJzLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8ubGludXhfZGlzdHJpYnV0aW9uYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBzZWxmLm5hbWUoKSBpZiBmdWxsX2Rpc3RyaWJ1dGlvbl9uYW1lIGVsc2Ugc2VsZi5pZCgpLAogICAgICAgICAgICBzZWxmLnZlcnNpb24oKSwKICAgICAgICAgICAgc2VsZi5jb2RlbmFtZSgpCiAgICAgICAgKQoKICAgIGRlZiBpZChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIGRpc3RybyBJRCBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLCBhcyBhIHN0cmluZy4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmlkYC4KICAgICAgICAiIiIKICAgICAgICBkZWYgbm9ybWFsaXplKGRpc3Ryb19pZCwgdGFibGUpOgogICAgICAgICAgICBkaXN0cm9faWQgPSBkaXN0cm9faWQubG93ZXIoKS5yZXBsYWNlKCcgJywgJ18nKQogICAgICAgICAgICByZXR1cm4gdGFibGUuZ2V0KGRpc3Ryb19pZCwgZGlzdHJvX2lkKQoKICAgICAgICBkaXN0cm9faWQgPSBzZWxmLm9zX3JlbGVhc2VfYXR0cignaWQnKQogICAgICAgIGlmIGRpc3Ryb19pZDoKICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShkaXN0cm9faWQsIE5PUk1BTElaRURfT1NfSUQpCgogICAgICAgIGRpc3Ryb19pZCA9IHNlbGYubHNiX3JlbGVhc2VfYXR0cignZGlzdHJpYnV0b3JfaWQnKQogICAgICAgIGlmIGRpc3Ryb19pZDoKICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShkaXN0cm9faWQsIE5PUk1BTElaRURfTFNCX0lEKQoKICAgICAgICBkaXN0cm9faWQgPSBzZWxmLmRpc3Ryb19yZWxlYXNlX2F0dHIoJ2lkJykKICAgICAgICBpZiBkaXN0cm9faWQ6CiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemUoZGlzdHJvX2lkLCBOT1JNQUxJWkVEX0RJU1RST19JRCkKCiAgICAgICAgcmV0dXJuICcnCgogICAgZGVmIG5hbWUoc2VsZiwgcHJldHR5PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbiwgYXMgYSBzdHJpbmcuCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5uYW1lYC4KICAgICAgICAiIiIKICAgICAgICBuYW1lID0gc2VsZi5vc19yZWxlYXNlX2F0dHIoJ25hbWUnKSBcCiAgICAgICAgICAgIG9yIHNlbGYubHNiX3JlbGVhc2VfYXR0cignZGlzdHJpYnV0b3JfaWQnKSBcCiAgICAgICAgICAgIG9yIHNlbGYuZGlzdHJvX3JlbGVhc2VfYXR0cignbmFtZScpCiAgICAgICAgaWYgcHJldHR5OgogICAgICAgICAgICBuYW1lID0gc2VsZi5vc19yZWxlYXNlX2F0dHIoJ3ByZXR0eV9uYW1lJykgXAogICAgICAgICAgICAgICAgb3Igc2VsZi5sc2JfcmVsZWFzZV9hdHRyKCdkZXNjcmlwdGlvbicpCiAgICAgICAgICAgIGlmIG5vdCBuYW1lOgogICAgICAgICAgICAgICAgbmFtZSA9IHNlbGYuZGlzdHJvX3JlbGVhc2VfYXR0cignbmFtZScpCiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gc2VsZi52ZXJzaW9uKHByZXR0eT1UcnVlKQogICAgICAgICAgICAgICAgaWYgdmVyc2lvbjoKICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZSArICcgJyArIHZlcnNpb24KICAgICAgICByZXR1cm4gbmFtZSBvciAnJwoKICAgIGRlZiB2ZXJzaW9uKHNlbGYsIHByZXR0eT1GYWxzZSwgYmVzdD1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBMaW51eCBkaXN0cmlidXRpb24sIGFzIGEgc3RyaW5nLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAuCiAgICAgICAgIiIiCiAgICAgICAgdmVyc2lvbnMgPSBbCiAgICAgICAgICAgIHNlbGYub3NfcmVsZWFzZV9hdHRyKCd2ZXJzaW9uX2lkJyksCiAgICAgICAgICAgIHNlbGYubHNiX3JlbGVhc2VfYXR0cigncmVsZWFzZScpLAogICAgICAgICAgICBzZWxmLmRpc3Ryb19yZWxlYXNlX2F0dHIoJ3ZlcnNpb25faWQnKSwKICAgICAgICAgICAgc2VsZi5fcGFyc2VfZGlzdHJvX3JlbGVhc2VfY29udGVudCgKICAgICAgICAgICAgICAgIHNlbGYub3NfcmVsZWFzZV9hdHRyKCdwcmV0dHlfbmFtZScpKS5nZXQoJ3ZlcnNpb25faWQnLCAnJyksCiAgICAgICAgICAgIHNlbGYuX3BhcnNlX2Rpc3Ryb19yZWxlYXNlX2NvbnRlbnQoCiAgICAgICAgICAgICAgICBzZWxmLmxzYl9yZWxlYXNlX2F0dHIoJ2Rlc2NyaXB0aW9uJykpLmdldCgndmVyc2lvbl9pZCcsICcnKQogICAgICAgIF0KICAgICAgICB2ZXJzaW9uID0gJycKICAgICAgICBpZiBiZXN0OgogICAgICAgICAgICAjIFRoaXMgYWxnb3JpdGhtIHVzZXMgdGhlIGxhc3QgdmVyc2lvbiBpbiBwcmlvcml0eSBvcmRlciB0aGF0IGhhcwogICAgICAgICAgICAjIHRoZSBiZXN0IHByZWNpc2lvbi4gSWYgdGhlIHZlcnNpb25zIGFyZSBub3QgaW4gY29uZmxpY3QsIHRoYXQKICAgICAgICAgICAgIyBkb2VzIG5vdCBtYXR0ZXI7IG90aGVyd2lzZSwgdXNpbmcgdGhlIGxhc3Qgb25lIGluc3RlYWQgb2YgdGhlCiAgICAgICAgICAgICMgZmlyc3Qgb25lIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYSBzdXJwcmlzZS4KICAgICAgICAgICAgZm9yIHYgaW4gdmVyc2lvbnM6CiAgICAgICAgICAgICAgICBpZiB2LmNvdW50KCIuIikgPiB2ZXJzaW9uLmNvdW50KCIuIikgb3IgdmVyc2lvbiA9PSAnJzoKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZvciB2IGluIHZlcnNpb25zOgogICAgICAgICAgICAgICAgaWYgdiAhPSAnJzoKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgcHJldHR5IGFuZCB2ZXJzaW9uIGFuZCBzZWxmLmNvZGVuYW1lKCk6CiAgICAgICAgICAgIHZlcnNpb24gPSB1J3swfSAoezF9KScuZm9ybWF0KHZlcnNpb24sIHNlbGYuY29kZW5hbWUoKSkKICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgIGRlZiB2ZXJzaW9uX3BhcnRzKHNlbGYsIGJlc3Q9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLCBhcyBhIHR1cGxlIG9mIHZlcnNpb24KICAgICAgICBudW1iZXJzLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8udmVyc2lvbl9wYXJ0c2AuCiAgICAgICAgIiIiCiAgICAgICAgdmVyc2lvbl9zdHIgPSBzZWxmLnZlcnNpb24oYmVzdD1iZXN0KQogICAgICAgIGlmIHZlcnNpb25fc3RyOgogICAgICAgICAgICB2ZXJzaW9uX3JlZ2V4ID0gcmUuY29tcGlsZShyJyhcZCspXC4/KFxkKyk/XC4/KFxkKyk/JykKICAgICAgICAgICAgbWF0Y2hlcyA9IHZlcnNpb25fcmVnZXgubWF0Y2godmVyc2lvbl9zdHIpCiAgICAgICAgICAgIGlmIG1hdGNoZXM6CiAgICAgICAgICAgICAgICBtYWpvciwgbWlub3IsIGJ1aWxkX251bWJlciA9IG1hdGNoZXMuZ3JvdXBzKCkKICAgICAgICAgICAgICAgIHJldHVybiBtYWpvciwgbWlub3Igb3IgJycsIGJ1aWxkX251bWJlciBvciAnJwogICAgICAgIHJldHVybiAnJywgJycsICcnCgogICAgZGVmIG1ham9yX3ZlcnNpb24oc2VsZiwgYmVzdD1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBtYWpvciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgY3VycmVudCBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5tYWpvcl92ZXJzaW9uYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi52ZXJzaW9uX3BhcnRzKGJlc3QpWzBdCgogICAgZGVmIG1pbm9yX3ZlcnNpb24oc2VsZiwgYmVzdD1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBtaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8ubWlub3JfdmVyc2lvbmAuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYudmVyc2lvbl9wYXJ0cyhiZXN0KVsxXQoKICAgIGRlZiBidWlsZF9udW1iZXIoc2VsZiwgYmVzdD1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBidWlsZCBudW1iZXIgb2YgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmJ1aWxkX251bWJlcmAuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYudmVyc2lvbl9wYXJ0cyhiZXN0KVsyXQoKICAgIGRlZiBsaWtlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgSURzIG9mIGRpc3RyaWJ1dGlvbnMgdGhhdCBhcmUgbGlrZSB0aGUgTGludXggZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8ubGlrZWAuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYub3NfcmVsZWFzZV9hdHRyKCdpZF9saWtlJykgb3IgJycKCiAgICBkZWYgY29kZW5hbWUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBjb2RlbmFtZSBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8uY29kZW5hbWVgLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLm9zX3JlbGVhc2VfYXR0cignY29kZW5hbWUnKSBcCiAgICAgICAgICAgIG9yIHNlbGYubHNiX3JlbGVhc2VfYXR0cignY29kZW5hbWUnKSBcCiAgICAgICAgICAgIG9yIHNlbGYuZGlzdHJvX3JlbGVhc2VfYXR0cignY29kZW5hbWUnKSBcCiAgICAgICAgICAgIG9yICcnCgogICAgZGVmIGluZm8oc2VsZiwgcHJldHR5PUZhbHNlLCBiZXN0PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gY2VydGFpbiBtYWNoaW5lLXJlYWRhYmxlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBMaW51eAogICAgICAgIGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmluZm9gLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBkaWN0KAogICAgICAgICAgICBpZD1zZWxmLmlkKCksCiAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uKHByZXR0eSwgYmVzdCksCiAgICAgICAgICAgIHZlcnNpb25fcGFydHM9ZGljdCgKICAgICAgICAgICAgICAgIG1ham9yPXNlbGYubWFqb3JfdmVyc2lvbihiZXN0KSwKICAgICAgICAgICAgICAgIG1pbm9yPXNlbGYubWlub3JfdmVyc2lvbihiZXN0KSwKICAgICAgICAgICAgICAgIGJ1aWxkX251bWJlcj1zZWxmLmJ1aWxkX251bWJlcihiZXN0KQogICAgICAgICAgICApLAogICAgICAgICAgICBsaWtlPXNlbGYubGlrZSgpLAogICAgICAgICAgICBjb2RlbmFtZT1zZWxmLmNvZGVuYW1lKCksCiAgICAgICAgKQoKICAgIGRlZiBvc19yZWxlYXNlX2luZm8oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBmb3IgdGhlIGluZm9ybWF0aW9uCiAgICAgICAgaXRlbXMgZnJvbSB0aGUgb3MtcmVsZWFzZSBmaWxlIGRhdGEgc291cmNlIG9mIHRoZSBMaW51eCBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5vc19yZWxlYXNlX2luZm9gLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9vc19yZWxlYXNlX2luZm8KCiAgICBkZWYgbHNiX3JlbGVhc2VfaW5mbyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24KICAgICAgICBpdGVtcyBmcm9tIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kIGRhdGEgc291cmNlIG9mIHRoZSBMaW51eAogICAgICAgIGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmxzYl9yZWxlYXNlX2luZm9gLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9sc2JfcmVsZWFzZV9pbmZvCgogICAgZGVmIGRpc3Ryb19yZWxlYXNlX2luZm8oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBmb3IgdGhlIGluZm9ybWF0aW9uCiAgICAgICAgaXRlbXMgZnJvbSB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSBkYXRhIHNvdXJjZSBvZiB0aGUgTGludXgKICAgICAgICBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5kaXN0cm9fcmVsZWFzZV9pbmZvYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fZGlzdHJvX3JlbGVhc2VfaW5mbwoKICAgIGRlZiBvc19yZWxlYXNlX2F0dHIoc2VsZiwgYXR0cmlidXRlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBzaW5nbGUgbmFtZWQgaW5mb3JtYXRpb24gaXRlbSBmcm9tIHRoZSBvcy1yZWxlYXNlIGZpbGUgZGF0YQogICAgICAgIHNvdXJjZSBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8ub3NfcmVsZWFzZV9hdHRyYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fb3NfcmVsZWFzZV9pbmZvLmdldChhdHRyaWJ1dGUsICcnKQoKICAgIGRlZiBsc2JfcmVsZWFzZV9hdHRyKHNlbGYsIGF0dHJpYnV0ZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgc2luZ2xlIG5hbWVkIGluZm9ybWF0aW9uIGl0ZW0gZnJvbSB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZAogICAgICAgIG91dHB1dCBkYXRhIHNvdXJjZSBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8ubHNiX3JlbGVhc2VfYXR0cmAuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2xzYl9yZWxlYXNlX2luZm8uZ2V0KGF0dHJpYnV0ZSwgJycpCgogICAgZGVmIGRpc3Ryb19yZWxlYXNlX2F0dHIoc2VsZiwgYXR0cmlidXRlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBzaW5nbGUgbmFtZWQgaW5mb3JtYXRpb24gaXRlbSBmcm9tIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlCiAgICAgICAgZGF0YSBzb3VyY2Ugb2YgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmRpc3Ryb19yZWxlYXNlX2F0dHJgLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9kaXN0cm9fcmVsZWFzZV9pbmZvLmdldChhdHRyaWJ1dGUsICcnKQoKICAgIGRlZiBfZ2V0X29zX3JlbGVhc2VfaW5mbyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIGluZm9ybWF0aW9uIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBvcy1yZWxlYXNlIGZpbGUuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICAgICAiIiIKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShzZWxmLm9zX3JlbGVhc2VfZmlsZSk6CiAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLm9zX3JlbGVhc2VfZmlsZSkgYXMgcmVsZWFzZV9maWxlOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlX29zX3JlbGVhc2VfY29udGVudChyZWxlYXNlX2ZpbGUpCiAgICAgICAgcmV0dXJuIHt9CgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9wYXJzZV9vc19yZWxlYXNlX2NvbnRlbnQobGluZXMpOgogICAgICAgICIiIgogICAgICAgIFBhcnNlIHRoZSBsaW5lcyBvZiBhbiBvcy1yZWxlYXNlIGZpbGUuCgogICAgICAgIFBhcmFtZXRlcnM6CgogICAgICAgICogbGluZXM6IEl0ZXJhYmxlIHRocm91Z2ggdGhlIGxpbmVzIGluIHRoZSBvcy1yZWxlYXNlIGZpbGUuCiAgICAgICAgICAgICAgICAgRWFjaCBsaW5lIG11c3QgYmUgYSB1bmljb2RlIHN0cmluZyBvciBhIFVURi04IGVuY29kZWQgYnl0ZQogICAgICAgICAgICAgICAgIHN0cmluZy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWxsIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgICAgICIiIgogICAgICAgIHByb3BzID0ge30KICAgICAgICBsZXhlciA9IHNobGV4LnNobGV4KGxpbmVzLCBwb3NpeD1UcnVlKQogICAgICAgIGxleGVyLndoaXRlc3BhY2Vfc3BsaXQgPSBUcnVlCgogICAgICAgICMgVGhlIHNobGV4IG1vZHVsZSBkZWZpbmVzIGl0cyBgd29yZGNoYXJzYCB2YXJpYWJsZSB1c2luZyBsaXRlcmFscywKICAgICAgICAjIG1ha2luZyBpdCBkZXBlbmRlbnQgb24gdGhlIGVuY29kaW5nIG9mIHRoZSBQeXRob24gc291cmNlIGZpbGUuCiAgICAgICAgIyBJbiBQeXRob24gMi42IGFuZCAyLjcsIHRoZSBzaGxleCBzb3VyY2UgZmlsZSBpcyBlbmNvZGVkIGluCiAgICAgICAgIyAnaXNvLTg4NTktMScsIGFuZCB0aGUgYHdvcmRjaGFyc2AgdmFyaWFibGUgaXMgZGVmaW5lZCBhcyBhIGJ5dGUKICAgICAgICAjIHN0cmluZy4gVGhpcyBjYXVzZXMgYSBVbmljb2RlRGVjb2RlRXJyb3IgdG8gYmUgcmFpc2VkIHdoZW4gdGhlCiAgICAgICAgIyBwYXJzZWQgY29udGVudCBpcyBhIHVuaWNvZGUgb2JqZWN0LiBUaGUgZm9sbG93aW5nIGZpeCByZXNvbHZlcyB0aGF0CiAgICAgICAgIyAoLi4uIGJ1dCBpdCBzaG91bGQgYmUgZml4ZWQgaW4gc2hsZXguLi4pOgogICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgaXNpbnN0YW5jZShsZXhlci53b3JkY2hhcnMsIGJ5dGVzKToKICAgICAgICAgICAgbGV4ZXIud29yZGNoYXJzID0gbGV4ZXIud29yZGNoYXJzLmRlY29kZSgnaXNvLTg4NTktMScpCgogICAgICAgIHRva2VucyA9IGxpc3QobGV4ZXIpCiAgICAgICAgZm9yIHRva2VuIGluIHRva2VuczoKICAgICAgICAgICAgIyBBdCB0aGlzIHBvaW50LCBhbGwgc2hlbGwtbGlrZSBwYXJzaW5nIGhhcyBiZWVuIGRvbmUgKGkuZS4KICAgICAgICAgICAgIyBjb21tZW50cyBwcm9jZXNzZWQsIHF1b3RlcyBhbmQgYmFja3NsYXNoIGVzY2FwZSBzZXF1ZW5jZXMKICAgICAgICAgICAgIyBwcm9jZXNzZWQsIG11bHRpLWxpbmUgdmFsdWVzIGFzc2VtYmxlZCwgdHJhaWxpbmcgbmV3bGluZXMKICAgICAgICAgICAgIyBzdHJpcHBlZCwgZXRjLiksIHNvIHRoZSB0b2tlbnMgYXJlIG5vdyBlaXRoZXI6CiAgICAgICAgICAgICMgKiB2YXJpYWJsZSBhc3NpZ25tZW50czogdmFyPXZhbHVlCiAgICAgICAgICAgICMgKiBjb21tYW5kcyBvciB0aGVpciBhcmd1bWVudHMgKG5vdCBhbGxvd2VkIGluIG9zLXJlbGVhc2UpCiAgICAgICAgICAgIGlmICc9JyBpbiB0b2tlbjoKICAgICAgICAgICAgICAgIGssIHYgPSB0b2tlbi5zcGxpdCgnPScsIDEpCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHYsIGJ5dGVzKToKICAgICAgICAgICAgICAgICAgICB2ID0gdi5kZWNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIHByb3BzW2subG93ZXIoKV0gPSB2CiAgICAgICAgICAgICAgICBpZiBrID09ICdWRVJTSU9OJzoKICAgICAgICAgICAgICAgICAgICAjIHRoaXMgaGFuZGxlcyBjYXNlcyBpbiB3aGljaCB0aGUgY29kZW5hbWUgaXMgaW4KICAgICAgICAgICAgICAgICAgICAjIHRoZSBgKENPREVOQU1FKWAgKHJoZWwsIGNlbnRvcywgZmVkb3JhKSBmb3JtYXQKICAgICAgICAgICAgICAgICAgICAjIG9yIGluIHRoZSBgLCBDT0RFTkFNRWAgZm9ybWF0IChVYnVudHUpLgogICAgICAgICAgICAgICAgICAgIGNvZGVuYW1lID0gcmUuc2VhcmNoKHInKFwoXEQrXCkpfCwoXHMrKT9cRCsnLCB2KQogICAgICAgICAgICAgICAgICAgIGlmIGNvZGVuYW1lOgogICAgICAgICAgICAgICAgICAgICAgICBjb2RlbmFtZSA9IGNvZGVuYW1lLmdyb3VwKCkKICAgICAgICAgICAgICAgICAgICAgICAgY29kZW5hbWUgPSBjb2RlbmFtZS5zdHJpcCgnKCknKQogICAgICAgICAgICAgICAgICAgICAgICBjb2RlbmFtZSA9IGNvZGVuYW1lLnN0cmlwKCcsJykKICAgICAgICAgICAgICAgICAgICAgICAgY29kZW5hbWUgPSBjb2RlbmFtZS5zdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgICAgICMgY29kZW5hbWUgYXBwZWFycyB3aXRoaW4gcGFyYW50aGVzZS4KICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHNbJ2NvZGVuYW1lJ10gPSBjb2RlbmFtZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzWydjb2RlbmFtZSddID0gJycKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgSWdub3JlIGFueSB0b2tlbnMgdGhhdCBhcmUgbm90IHZhcmlhYmxlIGFzc2lnbm1lbnRzCiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIHByb3BzCgogICAgZGVmIF9nZXRfbHNiX3JlbGVhc2VfaW5mbyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIGluZm9ybWF0aW9uIGl0ZW1zIGZyb20gdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgb3V0cHV0LgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAgICAgIiIiCiAgICAgICAgY21kID0gJ2xzYl9yZWxlYXNlIC1hJwogICAgICAgIHByb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKAogICAgICAgICAgICBjbWQsCiAgICAgICAgICAgIHNoZWxsPVRydWUsCiAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCiAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwcm9jZXNzLmNvbW11bmljYXRlKCkKICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHN0ZG91dC5kZWNvZGUoJ3V0Zi04JyksIHN0ZGVyci5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBjb2RlID0gcHJvY2Vzcy5yZXR1cm5jb2RlCiAgICAgICAgaWYgY29kZSA9PSAwOgogICAgICAgICAgICBjb250ZW50ID0gc3Rkb3V0LnNwbGl0bGluZXMoKQogICAgICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VfbHNiX3JlbGVhc2VfY29udGVudChjb250ZW50KQogICAgICAgIGVsaWYgY29kZSA9PSAxMjc6ICAjIENvbW1hbmQgbm90IGZvdW5kCiAgICAgICAgICAgIHJldHVybiB7fQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID49ICgzLCA1KToKICAgICAgICAgICAgICAgIHJhaXNlIHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yKGNvZGUsIGNtZCwgc3Rkb3V0LCBzdGRlcnIpCiAgICAgICAgICAgIGVsaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPj0gKDIsIDcpOgogICAgICAgICAgICAgICAgcmFpc2Ugc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IoY29kZSwgY21kLCBzdGRvdXQpCiAgICAgICAgICAgIGVsaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPT0gKDIsIDYpOgogICAgICAgICAgICAgICAgcmFpc2Ugc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IoY29kZSwgY21kKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfcGFyc2VfbHNiX3JlbGVhc2VfY29udGVudChsaW5lcyk6CiAgICAgICAgIiIiCiAgICAgICAgUGFyc2UgdGhlIG91dHB1dCBvZiB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZC4KCiAgICAgICAgUGFyYW1ldGVyczoKCiAgICAgICAgKiBsaW5lczogSXRlcmFibGUgdGhyb3VnaCB0aGUgbGluZXMgb2YgdGhlIGxzYl9yZWxlYXNlIG91dHB1dC4KICAgICAgICAgICAgICAgICBFYWNoIGxpbmUgbXVzdCBiZSBhIHVuaWNvZGUgc3RyaW5nIG9yIGEgVVRGLTggZW5jb2RlZCBieXRlCiAgICAgICAgICAgICAgICAgc3RyaW5nLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAgICAgIiIiCiAgICAgICAgcHJvcHMgPSB7fQogICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgICAgICBsaW5lID0gbGluZS5kZWNvZGUoJ3V0Zi04JykgaWYgaXNpbnN0YW5jZShsaW5lLCBieXRlcykgZWxzZSBsaW5lCiAgICAgICAgICAgIGt2ID0gbGluZS5zdHJpcCgnXG4nKS5zcGxpdCgnOicsIDEpCiAgICAgICAgICAgIGlmIGxlbihrdikgIT0gMjoKICAgICAgICAgICAgICAgICMgSWdub3JlIGxpbmVzIHdpdGhvdXQgY29sb24uCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBrLCB2ID0ga3YKICAgICAgICAgICAgcHJvcHMudXBkYXRlKHtrLnJlcGxhY2UoJyAnLCAnXycpLmxvd2VyKCk6IHYuc3RyaXAoKX0pCiAgICAgICAgcmV0dXJuIHByb3BzCgogICAgZGVmIF9nZXRfZGlzdHJvX3JlbGVhc2VfaW5mbyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBHZXQgdGhlIGluZm9ybWF0aW9uIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBkaXN0cm8gcmVsZWFzZSBmaWxlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5kaXN0cm9fcmVsZWFzZV9maWxlOgogICAgICAgICAgICAjIElmIGl0IHdhcyBzcGVjaWZpZWQsIHdlIHVzZSBpdCBhbmQgcGFyc2Ugd2hhdCB3ZSBjYW4sIGV2ZW4gaWYKICAgICAgICAgICAgIyBpdHMgZmlsZSBuYW1lIG9yIGNvbnRlbnQgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHBhdHRlcm4uCiAgICAgICAgICAgIGRpc3Ryb19pbmZvID0gc2VsZi5fcGFyc2VfZGlzdHJvX3JlbGVhc2VfZmlsZSgKICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJvX3JlbGVhc2VfZmlsZSkKICAgICAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHNlbGYuZGlzdHJvX3JlbGVhc2VfZmlsZSkKICAgICAgICAgICAgIyBUaGUgZmlsZSBuYW1lIHBhdHRlcm4gZm9yIHVzZXItc3BlY2lmaWVkIGRpc3RybyByZWxlYXNlIGZpbGVzCiAgICAgICAgICAgICMgaXMgc29tZXdoYXQgbW9yZSB0b2xlcmFudCAoY29tcGFyZWQgdG8gd2hlbiBzZWFyY2hpbmcgZm9yIHRoZQogICAgICAgICAgICAjIGZpbGUpLCBiZWNhdXNlIHdlIHdhbnQgdG8gdXNlIHdoYXQgd2FzIHNwZWNpZmllZCBhcyBiZXN0IGFzCiAgICAgICAgICAgICMgcG9zc2libGUuCiAgICAgICAgICAgIG1hdGNoID0gX0RJU1RST19SRUxFQVNFX0JBU0VOQU1FX1BBVFRFUk4ubWF0Y2goYmFzZW5hbWUpCiAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgZGlzdHJvX2luZm9bJ2lkJ10gPSBtYXRjaC5ncm91cCgxKQogICAgICAgICAgICByZXR1cm4gZGlzdHJvX2luZm8KICAgICAgICBlbHNlOgogICAgICAgICAgICBiYXNlbmFtZXMgPSBvcy5saXN0ZGlyKF9VTklYQ09ORkRJUikKICAgICAgICAgICAgIyBXZSBzb3J0IGZvciByZXBlYXRhYmlsaXR5IGluIGNhc2VzIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZQogICAgICAgICAgICAjIGRpc3RybyBzcGVjaWZpYyBmaWxlczsgZS5nLiBDZW50T1MsIE9yYWNsZSwgRW50ZXJwcmlzZSBhbGwKICAgICAgICAgICAgIyBjb250YWluaW5nIGByZWRoYXQtcmVsZWFzZWAgb24gdG9wIG9mIHRoZWlyIG93bi4KICAgICAgICAgICAgYmFzZW5hbWVzLnNvcnQoKQogICAgICAgICAgICBmb3IgYmFzZW5hbWUgaW4gYmFzZW5hbWVzOgogICAgICAgICAgICAgICAgaWYgYmFzZW5hbWUgaW4gX0RJU1RST19SRUxFQVNFX0lHTk9SRV9CQVNFTkFNRVM6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIG1hdGNoID0gX0RJU1RST19SRUxFQVNFX0JBU0VOQU1FX1BBVFRFUk4ubWF0Y2goYmFzZW5hbWUpCiAgICAgICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgICAgICBmaWxlcGF0aCA9IG9zLnBhdGguam9pbihfVU5JWENPTkZESVIsIGJhc2VuYW1lKQogICAgICAgICAgICAgICAgICAgIGRpc3Ryb19pbmZvID0gc2VsZi5fcGFyc2VfZGlzdHJvX3JlbGVhc2VfZmlsZShmaWxlcGF0aCkKICAgICAgICAgICAgICAgICAgICBpZiAnbmFtZScgaW4gZGlzdHJvX2luZm86CiAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG5hbWUgaXMgYWx3YXlzIHByZXNlbnQgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3Ryb19yZWxlYXNlX2ZpbGUgPSBmaWxlcGF0aAogICAgICAgICAgICAgICAgICAgICAgICBkaXN0cm9faW5mb1snaWQnXSA9IG1hdGNoLmdyb3VwKDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXN0cm9faW5mbwogICAgICAgICAgICByZXR1cm4ge30KCiAgICBkZWYgX3BhcnNlX2Rpc3Ryb19yZWxlYXNlX2ZpbGUoc2VsZiwgZmlsZXBhdGgpOgogICAgICAgICIiIgogICAgICAgIFBhcnNlIGEgZGlzdHJvIHJlbGVhc2UgZmlsZS4KCiAgICAgICAgUGFyYW1ldGVyczoKCiAgICAgICAgKiBmaWxlcGF0aDogUGF0aCBuYW1lIG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZmlsZXBhdGgpOgogICAgICAgICAgICB3aXRoIG9wZW4oZmlsZXBhdGgpIGFzIGZwOgogICAgICAgICAgICAgICAgIyBPbmx5IHBhcnNlIHRoZSBmaXJzdCBsaW5lLiBGb3IgaW5zdGFuY2UsIG9uIFNMRVMgdGhlcmUKICAgICAgICAgICAgICAgICMgYXJlIG11bHRpcGxlIGxpbmVzLiBXZSBkb24ndCB3YW50IHRoZW0uLi4KICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9wYXJzZV9kaXN0cm9fcmVsZWFzZV9jb250ZW50KGZwLnJlYWRsaW5lKCkpCiAgICAgICAgcmV0dXJuIHt9CgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9wYXJzZV9kaXN0cm9fcmVsZWFzZV9jb250ZW50KGxpbmUpOgogICAgICAgICIiIgogICAgICAgIFBhcnNlIGEgbGluZSBmcm9tIGEgZGlzdHJvIHJlbGVhc2UgZmlsZS4KCiAgICAgICAgUGFyYW1ldGVyczoKICAgICAgICAqIGxpbmU6IExpbmUgZnJvbSB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZS4gTXVzdCBiZSBhIHVuaWNvZGUgc3RyaW5nCiAgICAgICAgICAgICAgICBvciBhIFVURi04IGVuY29kZWQgYnl0ZSBzdHJpbmcuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKGxpbmUsIGJ5dGVzKToKICAgICAgICAgICAgbGluZSA9IGxpbmUuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgbWF0Y2hlcyA9IF9ESVNUUk9fUkVMRUFTRV9DT05URU5UX1JFVkVSU0VEX1BBVFRFUk4ubWF0Y2goCiAgICAgICAgICAgIGxpbmUuc3RyaXAoKVs6Oi0xXSkKICAgICAgICBkaXN0cm9faW5mbyA9IHt9CiAgICAgICAgaWYgbWF0Y2hlczoKICAgICAgICAgICAgIyByZWdleHAgZW5zdXJlcyBub24tTm9uZQogICAgICAgICAgICBkaXN0cm9faW5mb1snbmFtZSddID0gbWF0Y2hlcy5ncm91cCgzKVs6Oi0xXQogICAgICAgICAgICBpZiBtYXRjaGVzLmdyb3VwKDIpOgogICAgICAgICAgICAgICAgZGlzdHJvX2luZm9bJ3ZlcnNpb25faWQnXSA9IG1hdGNoZXMuZ3JvdXAoMilbOjotMV0KICAgICAgICAgICAgaWYgbWF0Y2hlcy5ncm91cCgxKToKICAgICAgICAgICAgICAgIGRpc3Ryb19pbmZvWydjb2RlbmFtZSddID0gbWF0Y2hlcy5ncm91cCgxKVs6Oi0xXQogICAgICAgIGVsaWYgbGluZToKICAgICAgICAgICAgZGlzdHJvX2luZm9bJ25hbWUnXSA9IGxpbmUuc3RyaXAoKQogICAgICAgIHJldHVybiBkaXN0cm9faW5mbwoKCl9kaXN0cm8gPSBMaW51eERpc3RyaWJ1dGlvbigpCgoKZGVmIG1haW4oKToKICAgIGltcG9ydCBhcmdwYXJzZQoKICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQogICAgbG9nZ2VyLnNldExldmVsKGxvZ2dpbmcuREVCVUcpCiAgICBsb2dnZXIuYWRkSGFuZGxlcihsb2dnaW5nLlN0cmVhbUhhbmRsZXIoc3lzLnN0ZG91dCkpCgogICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249IkxpbnV4IGRpc3RybyBpbmZvIHRvb2wiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICAnLS1qc29uJywKICAgICAgICAnLWonLAogICAgICAgIGhlbHA9Ik91dHB1dCBpbiBtYWNoaW5lIHJlYWRhYmxlIGZvcm1hdCIsCiAgICAgICAgYWN0aW9uPSJzdG9yZV90cnVlIikKICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCgogICAgaWYgYXJncy5qc29uOgogICAgICAgIGxvZ2dlci5pbmZvKGpzb24uZHVtcHMoaW5mbygpLCBpbmRlbnQ9NCwgc29ydF9rZXlzPVRydWUpKQogICAgZWxzZToKICAgICAgICBsb2dnZXIuaW5mbygnTmFtZTogJXMnLCBuYW1lKHByZXR0eT1UcnVlKSkKICAgICAgICBkaXN0cmlidXRpb25fdmVyc2lvbiA9IHZlcnNpb24ocHJldHR5PVRydWUpCiAgICAgICAgaWYgZGlzdHJpYnV0aW9uX3ZlcnNpb246CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdWZXJzaW9uOiAlcycsIGRpc3RyaWJ1dGlvbl92ZXJzaW9uKQogICAgICAgIGRpc3RyaWJ1dGlvbl9jb2RlbmFtZSA9IGNvZGVuYW1lKCkKICAgICAgICBpZiBkaXN0cmlidXRpb25fY29kZW5hbWU6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdDb2RlbmFtZTogJXMnLCBkaXN0cmlidXRpb25fY29kZW5hbWUpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIG1haW4oKQpQSwMEFAAAAAAAAAAhAKKbmZwMAwAADAMAADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX19pbml0X18ucHkiIiIKSFRNTCBwYXJzaW5nIGxpYnJhcnkgYmFzZWQgb24gdGhlIFdIQVRXRyAiSFRNTDUiCnNwZWNpZmljYXRpb24uIFRoZSBwYXJzZXIgaXMgZGVzaWduZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGV4aXN0aW5nCkhUTUwgZm91bmQgaW4gdGhlIHdpbGQgYW5kIGltcGxlbWVudHMgd2VsbC1kZWZpbmVkIGVycm9yIHJlY292ZXJ5IHRoYXQKaXMgbGFyZ2VseSBjb21wYXRpYmxlIHdpdGggbW9kZXJuIGRlc2t0b3Agd2ViIGJyb3dzZXJzLgoKRXhhbXBsZSB1c2FnZToKCmltcG9ydCBodG1sNWxpYgpmID0gb3BlbigibXlfZG9jdW1lbnQuaHRtbCIpCnRyZWUgPSBodG1sNWxpYi5wYXJzZShmKQoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSAuaHRtbDVwYXJzZXIgaW1wb3J0IEhUTUxQYXJzZXIsIHBhcnNlLCBwYXJzZUZyYWdtZW50CmZyb20gLnRyZWVidWlsZGVycyBpbXBvcnQgZ2V0VHJlZUJ1aWxkZXIKZnJvbSAudHJlZXdhbGtlcnMgaW1wb3J0IGdldFRyZWVXYWxrZXIKZnJvbSAuc2VyaWFsaXplciBpbXBvcnQgc2VyaWFsaXplCgpfX2FsbF9fID0gWyJIVE1MUGFyc2VyIiwgInBhcnNlIiwgInBhcnNlRnJhZ21lbnQiLCAiZ2V0VHJlZUJ1aWxkZXIiLAogICAgICAgICAgICJnZXRUcmVlV2Fsa2VyIiwgInNlcmlhbGl6ZSJdCgojIHRoaXMgaGFzIHRvIGJlIGF0IHRoZSB0b3AgbGV2ZWwsIHNlZSBob3cgc2V0dXAucHkgcGFyc2VzIHRoaXMKX192ZXJzaW9uX18gPSAiMS4wYjEwIgpQSwMEFAAAAAAAAAAhANV4DuJBQQAAQUEAADEAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX2loYXRleG1sLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgppbXBvcnQgcmUKaW1wb3J0IHdhcm5pbmdzCgpmcm9tIC5jb25zdGFudHMgaW1wb3J0IERhdGFMb3NzV2FybmluZwoKYmFzZUNoYXIgPSAiIiIKWyN4MDA0MS0jeDAwNUFdIHwgWyN4MDA2MS0jeDAwN0FdIHwgWyN4MDBDMC0jeDAwRDZdIHwgWyN4MDBEOC0jeDAwRjZdIHwKWyN4MDBGOC0jeDAwRkZdIHwgWyN4MDEwMC0jeDAxMzFdIHwgWyN4MDEzNC0jeDAxM0VdIHwgWyN4MDE0MS0jeDAxNDhdIHwKWyN4MDE0QS0jeDAxN0VdIHwgWyN4MDE4MC0jeDAxQzNdIHwgWyN4MDFDRC0jeDAxRjBdIHwgWyN4MDFGNC0jeDAxRjVdIHwKWyN4MDFGQS0jeDAyMTddIHwgWyN4MDI1MC0jeDAyQThdIHwgWyN4MDJCQi0jeDAyQzFdIHwgI3gwMzg2IHwKWyN4MDM4OC0jeDAzOEFdIHwgI3gwMzhDIHwgWyN4MDM4RS0jeDAzQTFdIHwgWyN4MDNBMy0jeDAzQ0VdIHwKWyN4MDNEMC0jeDAzRDZdIHwgI3gwM0RBIHwgI3gwM0RDIHwgI3gwM0RFIHwgI3gwM0UwIHwgWyN4MDNFMi0jeDAzRjNdIHwKWyN4MDQwMS0jeDA0MENdIHwgWyN4MDQwRS0jeDA0NEZdIHwgWyN4MDQ1MS0jeDA0NUNdIHwgWyN4MDQ1RS0jeDA0ODFdIHwKWyN4MDQ5MC0jeDA0QzRdIHwgWyN4MDRDNy0jeDA0QzhdIHwgWyN4MDRDQi0jeDA0Q0NdIHwgWyN4MDREMC0jeDA0RUJdIHwKWyN4MDRFRS0jeDA0RjVdIHwgWyN4MDRGOC0jeDA0RjldIHwgWyN4MDUzMS0jeDA1NTZdIHwgI3gwNTU5IHwKWyN4MDU2MS0jeDA1ODZdIHwgWyN4MDVEMC0jeDA1RUFdIHwgWyN4MDVGMC0jeDA1RjJdIHwgWyN4MDYyMS0jeDA2M0FdIHwKWyN4MDY0MS0jeDA2NEFdIHwgWyN4MDY3MS0jeDA2QjddIHwgWyN4MDZCQS0jeDA2QkVdIHwgWyN4MDZDMC0jeDA2Q0VdIHwKWyN4MDZEMC0jeDA2RDNdIHwgI3gwNkQ1IHwgWyN4MDZFNS0jeDA2RTZdIHwgWyN4MDkwNS0jeDA5MzldIHwgI3gwOTNEIHwKWyN4MDk1OC0jeDA5NjFdIHwgWyN4MDk4NS0jeDA5OENdIHwgWyN4MDk4Ri0jeDA5OTBdIHwgWyN4MDk5My0jeDA5QThdIHwKWyN4MDlBQS0jeDA5QjBdIHwgI3gwOUIyIHwgWyN4MDlCNi0jeDA5QjldIHwgWyN4MDlEQy0jeDA5RERdIHwKWyN4MDlERi0jeDA5RTFdIHwgWyN4MDlGMC0jeDA5RjFdIHwgWyN4MEEwNS0jeDBBMEFdIHwgWyN4MEEwRi0jeDBBMTBdIHwKWyN4MEExMy0jeDBBMjhdIHwgWyN4MEEyQS0jeDBBMzBdIHwgWyN4MEEzMi0jeDBBMzNdIHwgWyN4MEEzNS0jeDBBMzZdIHwKWyN4MEEzOC0jeDBBMzldIHwgWyN4MEE1OS0jeDBBNUNdIHwgI3gwQTVFIHwgWyN4MEE3Mi0jeDBBNzRdIHwKWyN4MEE4NS0jeDBBOEJdIHwgI3gwQThEIHwgWyN4MEE4Ri0jeDBBOTFdIHwgWyN4MEE5My0jeDBBQThdIHwKWyN4MEFBQS0jeDBBQjBdIHwgWyN4MEFCMi0jeDBBQjNdIHwgWyN4MEFCNS0jeDBBQjldIHwgI3gwQUJEIHwgI3gwQUUwIHwKWyN4MEIwNS0jeDBCMENdIHwgWyN4MEIwRi0jeDBCMTBdIHwgWyN4MEIxMy0jeDBCMjhdIHwgWyN4MEIyQS0jeDBCMzBdIHwKWyN4MEIzMi0jeDBCMzNdIHwgWyN4MEIzNi0jeDBCMzldIHwgI3gwQjNEIHwgWyN4MEI1Qy0jeDBCNURdIHwKWyN4MEI1Ri0jeDBCNjFdIHwgWyN4MEI4NS0jeDBCOEFdIHwgWyN4MEI4RS0jeDBCOTBdIHwgWyN4MEI5Mi0jeDBCOTVdIHwKWyN4MEI5OS0jeDBCOUFdIHwgI3gwQjlDIHwgWyN4MEI5RS0jeDBCOUZdIHwgWyN4MEJBMy0jeDBCQTRdIHwKWyN4MEJBOC0jeDBCQUFdIHwgWyN4MEJBRS0jeDBCQjVdIHwgWyN4MEJCNy0jeDBCQjldIHwgWyN4MEMwNS0jeDBDMENdIHwKWyN4MEMwRS0jeDBDMTBdIHwgWyN4MEMxMi0jeDBDMjhdIHwgWyN4MEMyQS0jeDBDMzNdIHwgWyN4MEMzNS0jeDBDMzldIHwKWyN4MEM2MC0jeDBDNjFdIHwgWyN4MEM4NS0jeDBDOENdIHwgWyN4MEM4RS0jeDBDOTBdIHwgWyN4MEM5Mi0jeDBDQThdIHwKWyN4MENBQS0jeDBDQjNdIHwgWyN4MENCNS0jeDBDQjldIHwgI3gwQ0RFIHwgWyN4MENFMC0jeDBDRTFdIHwKWyN4MEQwNS0jeDBEMENdIHwgWyN4MEQwRS0jeDBEMTBdIHwgWyN4MEQxMi0jeDBEMjhdIHwgWyN4MEQyQS0jeDBEMzldIHwKWyN4MEQ2MC0jeDBENjFdIHwgWyN4MEUwMS0jeDBFMkVdIHwgI3gwRTMwIHwgWyN4MEUzMi0jeDBFMzNdIHwKWyN4MEU0MC0jeDBFNDVdIHwgWyN4MEU4MS0jeDBFODJdIHwgI3gwRTg0IHwgWyN4MEU4Ny0jeDBFODhdIHwgI3gwRThBIHwKI3gwRThEIHwgWyN4MEU5NC0jeDBFOTddIHwgWyN4MEU5OS0jeDBFOUZdIHwgWyN4MEVBMS0jeDBFQTNdIHwgI3gwRUE1IHwKI3gwRUE3IHwgWyN4MEVBQS0jeDBFQUJdIHwgWyN4MEVBRC0jeDBFQUVdIHwgI3gwRUIwIHwgWyN4MEVCMi0jeDBFQjNdIHwKI3gwRUJEIHwgWyN4MEVDMC0jeDBFQzRdIHwgWyN4MEY0MC0jeDBGNDddIHwgWyN4MEY0OS0jeDBGNjldIHwKWyN4MTBBMC0jeDEwQzVdIHwgWyN4MTBEMC0jeDEwRjZdIHwgI3gxMTAwIHwgWyN4MTEwMi0jeDExMDNdIHwKWyN4MTEwNS0jeDExMDddIHwgI3gxMTA5IHwgWyN4MTEwQi0jeDExMENdIHwgWyN4MTEwRS0jeDExMTJdIHwgI3gxMTNDIHwKI3gxMTNFIHwgI3gxMTQwIHwgI3gxMTRDIHwgI3gxMTRFIHwgI3gxMTUwIHwgWyN4MTE1NC0jeDExNTVdIHwgI3gxMTU5IHwKWyN4MTE1Ri0jeDExNjFdIHwgI3gxMTYzIHwgI3gxMTY1IHwgI3gxMTY3IHwgI3gxMTY5IHwgWyN4MTE2RC0jeDExNkVdIHwKWyN4MTE3Mi0jeDExNzNdIHwgI3gxMTc1IHwgI3gxMTlFIHwgI3gxMUE4IHwgI3gxMUFCIHwgWyN4MTFBRS0jeDExQUZdIHwKWyN4MTFCNy0jeDExQjhdIHwgI3gxMUJBIHwgWyN4MTFCQy0jeDExQzJdIHwgI3gxMUVCIHwgI3gxMUYwIHwgI3gxMUY5IHwKWyN4MUUwMC0jeDFFOUJdIHwgWyN4MUVBMC0jeDFFRjldIHwgWyN4MUYwMC0jeDFGMTVdIHwgWyN4MUYxOC0jeDFGMURdIHwKWyN4MUYyMC0jeDFGNDVdIHwgWyN4MUY0OC0jeDFGNERdIHwgWyN4MUY1MC0jeDFGNTddIHwgI3gxRjU5IHwgI3gxRjVCIHwKI3gxRjVEIHwgWyN4MUY1Ri0jeDFGN0RdIHwgWyN4MUY4MC0jeDFGQjRdIHwgWyN4MUZCNi0jeDFGQkNdIHwgI3gxRkJFIHwKWyN4MUZDMi0jeDFGQzRdIHwgWyN4MUZDNi0jeDFGQ0NdIHwgWyN4MUZEMC0jeDFGRDNdIHwgWyN4MUZENi0jeDFGREJdIHwKWyN4MUZFMC0jeDFGRUNdIHwgWyN4MUZGMi0jeDFGRjRdIHwgWyN4MUZGNi0jeDFGRkNdIHwgI3gyMTI2IHwKWyN4MjEyQS0jeDIxMkJdIHwgI3gyMTJFIHwgWyN4MjE4MC0jeDIxODJdIHwgWyN4MzA0MS0jeDMwOTRdIHwKWyN4MzBBMS0jeDMwRkFdIHwgWyN4MzEwNS0jeDMxMkNdIHwgWyN4QUMwMC0jeEQ3QTNdIiIiCgppZGVvZ3JhcGhpYyA9ICIiIlsjeDRFMDAtI3g5RkE1XSB8ICN4MzAwNyB8IFsjeDMwMjEtI3gzMDI5XSIiIgoKY29tYmluaW5nQ2hhcmFjdGVyID0gIiIiClsjeDAzMDAtI3gwMzQ1XSB8IFsjeDAzNjAtI3gwMzYxXSB8IFsjeDA0ODMtI3gwNDg2XSB8IFsjeDA1OTEtI3gwNUExXSB8ClsjeDA1QTMtI3gwNUI5XSB8IFsjeDA1QkItI3gwNUJEXSB8ICN4MDVCRiB8IFsjeDA1QzEtI3gwNUMyXSB8ICN4MDVDNCB8ClsjeDA2NEItI3gwNjUyXSB8ICN4MDY3MCB8IFsjeDA2RDYtI3gwNkRDXSB8IFsjeDA2REQtI3gwNkRGXSB8ClsjeDA2RTAtI3gwNkU0XSB8IFsjeDA2RTctI3gwNkU4XSB8IFsjeDA2RUEtI3gwNkVEXSB8IFsjeDA5MDEtI3gwOTAzXSB8CiN4MDkzQyB8IFsjeDA5M0UtI3gwOTRDXSB8ICN4MDk0RCB8IFsjeDA5NTEtI3gwOTU0XSB8IFsjeDA5NjItI3gwOTYzXSB8ClsjeDA5ODEtI3gwOTgzXSB8ICN4MDlCQyB8ICN4MDlCRSB8ICN4MDlCRiB8IFsjeDA5QzAtI3gwOUM0XSB8ClsjeDA5QzctI3gwOUM4XSB8IFsjeDA5Q0ItI3gwOUNEXSB8ICN4MDlENyB8IFsjeDA5RTItI3gwOUUzXSB8ICN4MEEwMiB8CiN4MEEzQyB8ICN4MEEzRSB8ICN4MEEzRiB8IFsjeDBBNDAtI3gwQTQyXSB8IFsjeDBBNDctI3gwQTQ4XSB8ClsjeDBBNEItI3gwQTREXSB8IFsjeDBBNzAtI3gwQTcxXSB8IFsjeDBBODEtI3gwQTgzXSB8ICN4MEFCQyB8ClsjeDBBQkUtI3gwQUM1XSB8IFsjeDBBQzctI3gwQUM5XSB8IFsjeDBBQ0ItI3gwQUNEXSB8IFsjeDBCMDEtI3gwQjAzXSB8CiN4MEIzQyB8IFsjeDBCM0UtI3gwQjQzXSB8IFsjeDBCNDctI3gwQjQ4XSB8IFsjeDBCNEItI3gwQjREXSB8ClsjeDBCNTYtI3gwQjU3XSB8IFsjeDBCODItI3gwQjgzXSB8IFsjeDBCQkUtI3gwQkMyXSB8IFsjeDBCQzYtI3gwQkM4XSB8ClsjeDBCQ0EtI3gwQkNEXSB8ICN4MEJENyB8IFsjeDBDMDEtI3gwQzAzXSB8IFsjeDBDM0UtI3gwQzQ0XSB8ClsjeDBDNDYtI3gwQzQ4XSB8IFsjeDBDNEEtI3gwQzREXSB8IFsjeDBDNTUtI3gwQzU2XSB8IFsjeDBDODItI3gwQzgzXSB8ClsjeDBDQkUtI3gwQ0M0XSB8IFsjeDBDQzYtI3gwQ0M4XSB8IFsjeDBDQ0EtI3gwQ0NEXSB8IFsjeDBDRDUtI3gwQ0Q2XSB8ClsjeDBEMDItI3gwRDAzXSB8IFsjeDBEM0UtI3gwRDQzXSB8IFsjeDBENDYtI3gwRDQ4XSB8IFsjeDBENEEtI3gwRDREXSB8CiN4MEQ1NyB8ICN4MEUzMSB8IFsjeDBFMzQtI3gwRTNBXSB8IFsjeDBFNDctI3gwRTRFXSB8ICN4MEVCMSB8ClsjeDBFQjQtI3gwRUI5XSB8IFsjeDBFQkItI3gwRUJDXSB8IFsjeDBFQzgtI3gwRUNEXSB8IFsjeDBGMTgtI3gwRjE5XSB8CiN4MEYzNSB8ICN4MEYzNyB8ICN4MEYzOSB8ICN4MEYzRSB8ICN4MEYzRiB8IFsjeDBGNzEtI3gwRjg0XSB8ClsjeDBGODYtI3gwRjhCXSB8IFsjeDBGOTAtI3gwRjk1XSB8ICN4MEY5NyB8IFsjeDBGOTktI3gwRkFEXSB8ClsjeDBGQjEtI3gwRkI3XSB8ICN4MEZCOSB8IFsjeDIwRDAtI3gyMERDXSB8ICN4MjBFMSB8IFsjeDMwMkEtI3gzMDJGXSB8CiN4MzA5OSB8ICN4MzA5QSIiIgoKZGlnaXQgPSAiIiIKWyN4MDAzMC0jeDAwMzldIHwgWyN4MDY2MC0jeDA2NjldIHwgWyN4MDZGMC0jeDA2RjldIHwgWyN4MDk2Ni0jeDA5NkZdIHwKWyN4MDlFNi0jeDA5RUZdIHwgWyN4MEE2Ni0jeDBBNkZdIHwgWyN4MEFFNi0jeDBBRUZdIHwgWyN4MEI2Ni0jeDBCNkZdIHwKWyN4MEJFNy0jeDBCRUZdIHwgWyN4MEM2Ni0jeDBDNkZdIHwgWyN4MENFNi0jeDBDRUZdIHwgWyN4MEQ2Ni0jeDBENkZdIHwKWyN4MEU1MC0jeDBFNTldIHwgWyN4MEVEMC0jeDBFRDldIHwgWyN4MEYyMC0jeDBGMjldIiIiCgpleHRlbmRlciA9ICIiIgojeDAwQjcgfCAjeDAyRDAgfCAjeDAyRDEgfCAjeDAzODcgfCAjeDA2NDAgfCAjeDBFNDYgfCAjeDBFQzYgfCAjeDMwMDUgfAojWyN4MzAzMS0jeDMwMzVdIHwgWyN4MzA5RC0jeDMwOUVdIHwgWyN4MzBGQy0jeDMwRkVdIiIiCgpsZXR0ZXIgPSAiIHwgIi5qb2luKFtiYXNlQ2hhciwgaWRlb2dyYXBoaWNdKQoKIyBXaXRob3V0IHRoZQpuYW1lID0gIiB8ICIuam9pbihbbGV0dGVyLCBkaWdpdCwgIi4iLCAiLSIsICJfIiwgY29tYmluaW5nQ2hhcmFjdGVyLAogICAgICAgICAgICAgICAgICAgZXh0ZW5kZXJdKQpuYW1lRmlyc3QgPSAiIHwgIi5qb2luKFtsZXR0ZXIsICJfIl0pCgpyZUNoYXIgPSByZS5jb21waWxlKHIiI3goW1xkfEEtRl17NCw0fSkiKQpyZUNoYXJSYW5nZSA9IHJlLmNvbXBpbGUociJcWyN4KFtcZHxBLUZdezQsNH0pLSN4KFtcZHxBLUZdezQsNH0pXF0iKQoKCmRlZiBjaGFyU3RyaW5nVG9MaXN0KGNoYXJzKToKICAgIGNoYXJSYW5nZXMgPSBbaXRlbS5zdHJpcCgpIGZvciBpdGVtIGluIGNoYXJzLnNwbGl0KCIgfCAiKV0KICAgIHJ2ID0gW10KICAgIGZvciBpdGVtIGluIGNoYXJSYW5nZXM6CiAgICAgICAgZm91bmRNYXRjaCA9IEZhbHNlCiAgICAgICAgZm9yIHJlZ2V4cCBpbiAocmVDaGFyLCByZUNoYXJSYW5nZSk6CiAgICAgICAgICAgIG1hdGNoID0gcmVnZXhwLm1hdGNoKGl0ZW0pCiAgICAgICAgICAgIGlmIG1hdGNoIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKFtoZXhUb0ludChpdGVtKSBmb3IgaXRlbSBpbiBtYXRjaC5ncm91cHMoKV0pCiAgICAgICAgICAgICAgICBpZiBsZW4ocnZbLTFdKSA9PSAxOgogICAgICAgICAgICAgICAgICAgIHJ2Wy0xXSA9IHJ2Wy0xXSAqIDIKICAgICAgICAgICAgICAgIGZvdW5kTWF0Y2ggPSBUcnVlCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIG5vdCBmb3VuZE1hdGNoOgogICAgICAgICAgICBhc3NlcnQgbGVuKGl0ZW0pID09IDEKCiAgICAgICAgICAgIHJ2LmFwcGVuZChbb3JkKGl0ZW0pXSAqIDIpCiAgICBydiA9IG5vcm1hbGlzZUNoYXJMaXN0KHJ2KQogICAgcmV0dXJuIHJ2CgoKZGVmIG5vcm1hbGlzZUNoYXJMaXN0KGNoYXJMaXN0KToKICAgIGNoYXJMaXN0ID0gc29ydGVkKGNoYXJMaXN0KQogICAgZm9yIGl0ZW0gaW4gY2hhckxpc3Q6CiAgICAgICAgYXNzZXJ0IGl0ZW1bMV0gPj0gaXRlbVswXQogICAgcnYgPSBbXQogICAgaSA9IDAKICAgIHdoaWxlIGkgPCBsZW4oY2hhckxpc3QpOgogICAgICAgIGogPSAxCiAgICAgICAgcnYuYXBwZW5kKGNoYXJMaXN0W2ldKQogICAgICAgIHdoaWxlIGkgKyBqIDwgbGVuKGNoYXJMaXN0KSBhbmQgY2hhckxpc3RbaSArIGpdWzBdIDw9IHJ2Wy0xXVsxXSArIDE6CiAgICAgICAgICAgIHJ2Wy0xXVsxXSA9IGNoYXJMaXN0W2kgKyBqXVsxXQogICAgICAgICAgICBqICs9IDEKICAgICAgICBpICs9IGoKICAgIHJldHVybiBydgoKIyBXZSBkb24ndCByZWFsbHkgc3VwcG9ydCBjaGFyYWN0ZXJzIGFib3ZlIHRoZSBCTVAgOigKbWF4X3VuaWNvZGUgPSBpbnQoIkZGRkYiLCAxNikKCgpkZWYgbWlzc2luZ1JhbmdlcyhjaGFyTGlzdCk6CiAgICBydiA9IFtdCiAgICBpZiBjaGFyTGlzdFswXSAhPSAwOgogICAgICAgIHJ2LmFwcGVuZChbMCwgY2hhckxpc3RbMF1bMF0gLSAxXSkKICAgIGZvciBpLCBpdGVtIGluIGVudW1lcmF0ZShjaGFyTGlzdFs6LTFdKToKICAgICAgICBydi5hcHBlbmQoW2l0ZW1bMV0gKyAxLCBjaGFyTGlzdFtpICsgMV1bMF0gLSAxXSkKICAgIGlmIGNoYXJMaXN0Wy0xXVsxXSAhPSBtYXhfdW5pY29kZToKICAgICAgICBydi5hcHBlbmQoW2NoYXJMaXN0Wy0xXVsxXSArIDEsIG1heF91bmljb2RlXSkKICAgIHJldHVybiBydgoKCmRlZiBsaXN0VG9SZWdleHBTdHIoY2hhckxpc3QpOgogICAgcnYgPSBbXQogICAgZm9yIGl0ZW0gaW4gY2hhckxpc3Q6CiAgICAgICAgaWYgaXRlbVswXSA9PSBpdGVtWzFdOgogICAgICAgICAgICBydi5hcHBlbmQoZXNjYXBlUmVnZXhwKGNocihpdGVtWzBdKSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcnYuYXBwZW5kKGVzY2FwZVJlZ2V4cChjaHIoaXRlbVswXSkpICsgIi0iICsKICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZVJlZ2V4cChjaHIoaXRlbVsxXSkpKQogICAgcmV0dXJuICJbJXNdIiAlICIiLmpvaW4ocnYpCgoKZGVmIGhleFRvSW50KGhleF9zdHIpOgogICAgcmV0dXJuIGludChoZXhfc3RyLCAxNikKCgpkZWYgZXNjYXBlUmVnZXhwKHN0cmluZyk6CiAgICBzcGVjaWFsQ2hhcmFjdGVycyA9ICgiLiIsICJeIiwgIiQiLCAiKiIsICIrIiwgIj8iLCAieyIsICJ9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICJbIiwgIl0iLCAifCIsICIoIiwgIikiLCAiLSIpCiAgICBmb3IgY2hhciBpbiBzcGVjaWFsQ2hhcmFjdGVyczoKICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShjaGFyLCAiXFwiICsgY2hhcikKCiAgICByZXR1cm4gc3RyaW5nCgojIG91dHB1dCBmcm9tIHRoZSBhYm92ZQpub25YbWxOYW1lQk1QUmVnZXhwID0gcmUuY29tcGlsZSgnW1x4MDAtLC86LUBcXFstXFxeYFxcey1ceGI2XHhiOC1ceGJmXHhkN1x4ZjdcdTAxMzItXHUwMTMzXHUwMTNmLVx1MDE0MFx1MDE0OVx1MDE3Zlx1MDFjNC1cdTAxY2NcdTAxZjEtXHUwMWYzXHUwMWY2LVx1MDFmOVx1MDIxOC1cdTAyNGZcdTAyYTktXHUwMmJhXHUwMmMyLVx1MDJjZlx1MDJkMi1cdTAyZmZcdTAzNDYtXHUwMzVmXHUwMzYyLVx1MDM4NVx1MDM4Ylx1MDM4ZFx1MDNhMlx1MDNjZlx1MDNkNy1cdTAzZDlcdTAzZGJcdTAzZGRcdTAzZGZcdTAzZTFcdTAzZjQtXHUwNDAwXHUwNDBkXHUwNDUwXHUwNDVkXHUwNDgyXHUwNDg3LVx1MDQ4Zlx1MDRjNS1cdTA0YzZcdTA0YzktXHUwNGNhXHUwNGNkLVx1MDRjZlx1MDRlYy1cdTA0ZWRcdTA0ZjYtXHUwNGY3XHUwNGZhLVx1MDUzMFx1MDU1Ny1cdTA1NThcdTA1NWEtXHUwNTYwXHUwNTg3LVx1MDU5MFx1MDVhMlx1MDViYVx1MDViZVx1MDVjMFx1MDVjM1x1MDVjNS1cdTA1Y2ZcdTA1ZWItXHUwNWVmXHUwNWYzLVx1MDYyMFx1MDYzYi1cdTA2M2ZcdTA2NTMtXHUwNjVmXHUwNjZhLVx1MDY2Zlx1MDZiOC1cdTA2YjlcdTA2YmZcdTA2Y2ZcdTA2ZDRcdTA2ZTlcdTA2ZWUtXHUwNmVmXHUwNmZhLVx1MDkwMFx1MDkwNFx1MDkzYS1cdTA5M2JcdTA5NGUtXHUwOTUwXHUwOTU1LVx1MDk1N1x1MDk2NC1cdTA5NjVcdTA5NzAtXHUwOTgwXHUwOTg0XHUwOThkLVx1MDk4ZVx1MDk5MS1cdTA5OTJcdTA5YTlcdTA5YjFcdTA5YjMtXHUwOWI1XHUwOWJhLVx1MDliYlx1MDliZFx1MDljNS1cdTA5YzZcdTA5YzktXHUwOWNhXHUwOWNlLVx1MDlkNlx1MDlkOC1cdTA5ZGJcdTA5ZGVcdTA5ZTQtXHUwOWU1XHUwOWYyLVx1MGEwMVx1MGEwMy1cdTBhMDRcdTBhMGItXHUwYTBlXHUwYTExLVx1MGExMlx1MGEyOVx1MGEzMVx1MGEzNFx1MGEzN1x1MGEzYS1cdTBhM2JcdTBhM2RcdTBhNDMtXHUwYTQ2XHUwYTQ5LVx1MGE0YVx1MGE0ZS1cdTBhNThcdTBhNWRcdTBhNWYtXHUwYTY1XHUwYTc1LVx1MGE4MFx1MGE4NFx1MGE4Y1x1MGE4ZVx1MGE5Mlx1MGFhOVx1MGFiMVx1MGFiNFx1MGFiYS1cdTBhYmJcdTBhYzZcdTBhY2FcdTBhY2UtXHUwYWRmXHUwYWUxLVx1MGFlNVx1MGFmMC1cdTBiMDBcdTBiMDRcdTBiMGQtXHUwYjBlXHUwYjExLVx1MGIxMlx1MGIyOVx1MGIzMVx1MGIzNC1cdTBiMzVcdTBiM2EtXHUwYjNiXHUwYjQ0LVx1MGI0Nlx1MGI0OS1cdTBiNGFcdTBiNGUtXHUwYjU1XHUwYjU4LVx1MGI1Ylx1MGI1ZVx1MGI2Mi1cdTBiNjVcdTBiNzAtXHUwYjgxXHUwYjg0XHUwYjhiLVx1MGI4ZFx1MGI5MVx1MGI5Ni1cdTBiOThcdTBiOWJcdTBiOWRcdTBiYTAtXHUwYmEyXHUwYmE1LVx1MGJhN1x1MGJhYi1cdTBiYWRcdTBiYjZcdTBiYmEtXHUwYmJkXHUwYmMzLVx1MGJjNVx1MGJjOVx1MGJjZS1cdTBiZDZcdTBiZDgtXHUwYmU2XHUwYmYwLVx1MGMwMFx1MGMwNFx1MGMwZFx1MGMxMVx1MGMyOVx1MGMzNFx1MGMzYS1cdTBjM2RcdTBjNDVcdTBjNDlcdTBjNGUtXHUwYzU0XHUwYzU3LVx1MGM1Zlx1MGM2Mi1cdTBjNjVcdTBjNzAtXHUwYzgxXHUwYzg0XHUwYzhkXHUwYzkxXHUwY2E5XHUwY2I0XHUwY2JhLVx1MGNiZFx1MGNjNVx1MGNjOVx1MGNjZS1cdTBjZDRcdTBjZDctXHUwY2RkXHUwY2RmXHUwY2UyLVx1MGNlNVx1MGNmMC1cdTBkMDFcdTBkMDRcdTBkMGRcdTBkMTFcdTBkMjlcdTBkM2EtXHUwZDNkXHUwZDQ0LVx1MGQ0NVx1MGQ0OVx1MGQ0ZS1cdTBkNTZcdTBkNTgtXHUwZDVmXHUwZDYyLVx1MGQ2NVx1MGQ3MC1cdTBlMDBcdTBlMmZcdTBlM2ItXHUwZTNmXHUwZTRmXHUwZTVhLVx1MGU4MFx1MGU4M1x1MGU4NS1cdTBlODZcdTBlODlcdTBlOGItXHUwZThjXHUwZThlLVx1MGU5M1x1MGU5OFx1MGVhMFx1MGVhNFx1MGVhNlx1MGVhOC1cdTBlYTlcdTBlYWNcdTBlYWZcdTBlYmFcdTBlYmUtXHUwZWJmXHUwZWM1XHUwZWM3XHUwZWNlLVx1MGVjZlx1MGVkYS1cdTBmMTdcdTBmMWEtXHUwZjFmXHUwZjJhLVx1MGYzNFx1MGYzNlx1MGYzOFx1MGYzYS1cdTBmM2RcdTBmNDhcdTBmNmEtXHUwZjcwXHUwZjg1XHUwZjhjLVx1MGY4Zlx1MGY5Nlx1MGY5OFx1MGZhZS1cdTBmYjBcdTBmYjhcdTBmYmEtXHUxMDlmXHUxMGM2LVx1MTBjZlx1MTBmNy1cdTEwZmZcdTExMDFcdTExMDRcdTExMDhcdTExMGFcdTExMGRcdTExMTMtXHUxMTNiXHUxMTNkXHUxMTNmXHUxMTQxLVx1MTE0Ylx1MTE0ZFx1MTE0Zlx1MTE1MS1cdTExNTNcdTExNTYtXHUxMTU4XHUxMTVhLVx1MTE1ZVx1MTE2Mlx1MTE2NFx1MTE2Nlx1MTE2OFx1MTE2YS1cdTExNmNcdTExNmYtXHUxMTcxXHUxMTc0XHUxMTc2LVx1MTE5ZFx1MTE5Zi1cdTExYTdcdTExYTktXHUxMWFhXHUxMWFjLVx1MTFhZFx1MTFiMC1cdTExYjZcdTExYjlcdTExYmJcdTExYzMtXHUxMWVhXHUxMWVjLVx1MTFlZlx1MTFmMS1cdTExZjhcdTExZmEtXHUxZGZmXHUxZTljLVx1MWU5Zlx1MWVmYS1cdTFlZmZcdTFmMTYtXHUxZjE3XHUxZjFlLVx1MWYxZlx1MWY0Ni1cdTFmNDdcdTFmNGUtXHUxZjRmXHUxZjU4XHUxZjVhXHUxZjVjXHUxZjVlXHUxZjdlLVx1MWY3Zlx1MWZiNVx1MWZiZFx1MWZiZi1cdTFmYzFcdTFmYzVcdTFmY2QtXHUxZmNmXHUxZmQ0LVx1MWZkNVx1MWZkYy1cdTFmZGZcdTFmZWQtXHUxZmYxXHUxZmY1XHUxZmZkLVx1MjBjZlx1MjBkZC1cdTIwZTBcdTIwZTItXHUyMTI1XHUyMTI3LVx1MjEyOVx1MjEyYy1cdTIxMmRcdTIxMmYtXHUyMTdmXHUyMTgzLVx1MzAwNFx1MzAwNlx1MzAwOC1cdTMwMjBcdTMwMzBcdTMwMzYtXHUzMDQwXHUzMDk1LVx1MzA5OFx1MzA5Yi1cdTMwOWNcdTMwOWYtXHUzMGEwXHUzMGZiXHUzMGZmLVx1MzEwNFx1MzEyZC1cdTRkZmZcdTlmYTYtXHVhYmZmXHVkN2E0LVx1ZmZmZl0nKSAgIyBub3FhCgpub25YbWxOYW1lRmlyc3RCTVBSZWdleHAgPSByZS5jb21waWxlKCdbXHgwMC1AXFxbLVxcXmBcXHstXHhiZlx4ZDdceGY3XHUwMTMyLVx1MDEzM1x1MDEzZi1cdTAxNDBcdTAxNDlcdTAxN2ZcdTAxYzQtXHUwMWNjXHUwMWYxLVx1MDFmM1x1MDFmNi1cdTAxZjlcdTAyMTgtXHUwMjRmXHUwMmE5LVx1MDJiYVx1MDJjMi1cdTAzODVcdTAzODdcdTAzOGJcdTAzOGRcdTAzYTJcdTAzY2ZcdTAzZDctXHUwM2Q5XHUwM2RiXHUwM2RkXHUwM2RmXHUwM2UxXHUwM2Y0LVx1MDQwMFx1MDQwZFx1MDQ1MFx1MDQ1ZFx1MDQ4Mi1cdTA0OGZcdTA0YzUtXHUwNGM2XHUwNGM5LVx1MDRjYVx1MDRjZC1cdTA0Y2ZcdTA0ZWMtXHUwNGVkXHUwNGY2LVx1MDRmN1x1MDRmYS1cdTA1MzBcdTA1NTctXHUwNTU4XHUwNTVhLVx1MDU2MFx1MDU4Ny1cdTA1Y2ZcdTA1ZWItXHUwNWVmXHUwNWYzLVx1MDYyMFx1MDYzYi1cdTA2NDBcdTA2NGItXHUwNjcwXHUwNmI4LVx1MDZiOVx1MDZiZlx1MDZjZlx1MDZkNFx1MDZkNi1cdTA2ZTRcdTA2ZTctXHUwOTA0XHUwOTNhLVx1MDkzY1x1MDkzZS1cdTA5NTdcdTA5NjItXHUwOTg0XHUwOThkLVx1MDk4ZVx1MDk5MS1cdTA5OTJcdTA5YTlcdTA5YjFcdTA5YjMtXHUwOWI1XHUwOWJhLVx1MDlkYlx1MDlkZVx1MDllMi1cdTA5ZWZcdTA5ZjItXHUwYTA0XHUwYTBiLVx1MGEwZVx1MGExMS1cdTBhMTJcdTBhMjlcdTBhMzFcdTBhMzRcdTBhMzdcdTBhM2EtXHUwYTU4XHUwYTVkXHUwYTVmLVx1MGE3MVx1MGE3NS1cdTBhODRcdTBhOGNcdTBhOGVcdTBhOTJcdTBhYTlcdTBhYjFcdTBhYjRcdTBhYmEtXHUwYWJjXHUwYWJlLVx1MGFkZlx1MGFlMS1cdTBiMDRcdTBiMGQtXHUwYjBlXHUwYjExLVx1MGIxMlx1MGIyOVx1MGIzMVx1MGIzNC1cdTBiMzVcdTBiM2EtXHUwYjNjXHUwYjNlLVx1MGI1Ylx1MGI1ZVx1MGI2Mi1cdTBiODRcdTBiOGItXHUwYjhkXHUwYjkxXHUwYjk2LVx1MGI5OFx1MGI5Ylx1MGI5ZFx1MGJhMC1cdTBiYTJcdTBiYTUtXHUwYmE3XHUwYmFiLVx1MGJhZFx1MGJiNlx1MGJiYS1cdTBjMDRcdTBjMGRcdTBjMTFcdTBjMjlcdTBjMzRcdTBjM2EtXHUwYzVmXHUwYzYyLVx1MGM4NFx1MGM4ZFx1MGM5MVx1MGNhOVx1MGNiNFx1MGNiYS1cdTBjZGRcdTBjZGZcdTBjZTItXHUwZDA0XHUwZDBkXHUwZDExXHUwZDI5XHUwZDNhLVx1MGQ1Zlx1MGQ2Mi1cdTBlMDBcdTBlMmZcdTBlMzFcdTBlMzQtXHUwZTNmXHUwZTQ2LVx1MGU4MFx1MGU4M1x1MGU4NS1cdTBlODZcdTBlODlcdTBlOGItXHUwZThjXHUwZThlLVx1MGU5M1x1MGU5OFx1MGVhMFx1MGVhNFx1MGVhNlx1MGVhOC1cdTBlYTlcdTBlYWNcdTBlYWZcdTBlYjFcdTBlYjQtXHUwZWJjXHUwZWJlLVx1MGViZlx1MGVjNS1cdTBmM2ZcdTBmNDhcdTBmNmEtXHUxMDlmXHUxMGM2LVx1MTBjZlx1MTBmNy1cdTEwZmZcdTExMDFcdTExMDRcdTExMDhcdTExMGFcdTExMGRcdTExMTMtXHUxMTNiXHUxMTNkXHUxMTNmXHUxMTQxLVx1MTE0Ylx1MTE0ZFx1MTE0Zlx1MTE1MS1cdTExNTNcdTExNTYtXHUxMTU4XHUxMTVhLVx1MTE1ZVx1MTE2Mlx1MTE2NFx1MTE2Nlx1MTE2OFx1MTE2YS1cdTExNmNcdTExNmYtXHUxMTcxXHUxMTc0XHUxMTc2LVx1MTE5ZFx1MTE5Zi1cdTExYTdcdTExYTktXHUxMWFhXHUxMWFjLVx1MTFhZFx1MTFiMC1cdTExYjZcdTExYjlcdTExYmJcdTExYzMtXHUxMWVhXHUxMWVjLVx1MTFlZlx1MTFmMS1cdTExZjhcdTExZmEtXHUxZGZmXHUxZTljLVx1MWU5Zlx1MWVmYS1cdTFlZmZcdTFmMTYtXHUxZjE3XHUxZjFlLVx1MWYxZlx1MWY0Ni1cdTFmNDdcdTFmNGUtXHUxZjRmXHUxZjU4XHUxZjVhXHUxZjVjXHUxZjVlXHUxZjdlLVx1MWY3Zlx1MWZiNVx1MWZiZFx1MWZiZi1cdTFmYzFcdTFmYzVcdTFmY2QtXHUxZmNmXHUxZmQ0LVx1MWZkNVx1MWZkYy1cdTFmZGZcdTFmZWQtXHUxZmYxXHUxZmY1XHUxZmZkLVx1MjEyNVx1MjEyNy1cdTIxMjlcdTIxMmMtXHUyMTJkXHUyMTJmLVx1MjE3Zlx1MjE4My1cdTMwMDZcdTMwMDgtXHUzMDIwXHUzMDJhLVx1MzA0MFx1MzA5NS1cdTMwYTBcdTMwZmItXHUzMTA0XHUzMTJkLVx1NGRmZlx1OWZhNi1cdWFiZmZcdWQ3YTQtXHVmZmZmXScpICAjIG5vcWEKCiMgU2ltcGxlciB0aGluZ3MKbm9uUHViaWRDaGFyUmVnZXhwID0gcmUuY29tcGlsZSgiW15ceDIwXHgwRFx4MEFhLXpBLVowLTlcLVwnKCkrLC4vOj0/OyEqI0AkXyVdIikKCgpjbGFzcyBJbmZvc2V0RmlsdGVyKG9iamVjdCk6CiAgICByZXBsYWNlbWVudFJlZ2V4cCA9IHJlLmNvbXBpbGUociJVW1xkQS1GXXs1LDV9IikKCiAgICBkZWYgX19pbml0X18oc2VsZiwKICAgICAgICAgICAgICAgICBkcm9wWG1sbnNMb2NhbE5hbWU9RmFsc2UsCiAgICAgICAgICAgICAgICAgZHJvcFhtbG5zQXR0ck5zPUZhbHNlLAogICAgICAgICAgICAgICAgIHByZXZlbnREb3VibGVEYXNoQ29tbWVudHM9RmFsc2UsCiAgICAgICAgICAgICAgICAgcHJldmVudERhc2hBdENvbW1lbnRFbmQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgcmVwbGFjZUZvcm1GZWVkQ2hhcmFjdGVycz1UcnVlLAogICAgICAgICAgICAgICAgIHByZXZlbnRTaW5nbGVRdW90ZVB1YmlkPUZhbHNlKToKCiAgICAgICAgc2VsZi5kcm9wWG1sbnNMb2NhbE5hbWUgPSBkcm9wWG1sbnNMb2NhbE5hbWUKICAgICAgICBzZWxmLmRyb3BYbWxuc0F0dHJOcyA9IGRyb3BYbWxuc0F0dHJOcwoKICAgICAgICBzZWxmLnByZXZlbnREb3VibGVEYXNoQ29tbWVudHMgPSBwcmV2ZW50RG91YmxlRGFzaENvbW1lbnRzCiAgICAgICAgc2VsZi5wcmV2ZW50RGFzaEF0Q29tbWVudEVuZCA9IHByZXZlbnREYXNoQXRDb21tZW50RW5kCgogICAgICAgIHNlbGYucmVwbGFjZUZvcm1GZWVkQ2hhcmFjdGVycyA9IHJlcGxhY2VGb3JtRmVlZENoYXJhY3RlcnMKCiAgICAgICAgc2VsZi5wcmV2ZW50U2luZ2xlUXVvdGVQdWJpZCA9IHByZXZlbnRTaW5nbGVRdW90ZVB1YmlkCgogICAgICAgIHNlbGYucmVwbGFjZUNhY2hlID0ge30KCiAgICBkZWYgY29lcmNlQXR0cmlidXRlKHNlbGYsIG5hbWUsIG5hbWVzcGFjZT1Ob25lKToKICAgICAgICBpZiBzZWxmLmRyb3BYbWxuc0xvY2FsTmFtZSBhbmQgbmFtZS5zdGFydHN3aXRoKCJ4bWxuczoiKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQXR0cmlidXRlcyBjYW5ub3QgYmVnaW4gd2l0aCB4bWxucyIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBlbGlmIChzZWxmLmRyb3BYbWxuc0F0dHJOcyBhbmQKICAgICAgICAgICAgICBuYW1lc3BhY2UgPT0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIik6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkF0dHJpYnV0ZXMgY2Fubm90IGJlIGluIHRoZSB4bWwgbmFtZXNwYWNlIiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnRvWG1sTmFtZShuYW1lKQoKICAgIGRlZiBjb2VyY2VFbGVtZW50KHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLnRvWG1sTmFtZShuYW1lKQoKICAgIGRlZiBjb2VyY2VDb21tZW50KHNlbGYsIGRhdGEpOgogICAgICAgIGlmIHNlbGYucHJldmVudERvdWJsZURhc2hDb21tZW50czoKICAgICAgICAgICAgd2hpbGUgIi0tIiBpbiBkYXRhOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ29tbWVudHMgY2Fubm90IGNvbnRhaW4gYWRqYWNlbnQgZGFzaGVzIiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgiLS0iLCAiLSAtIikKICAgICAgICAgICAgaWYgZGF0YS5lbmRzd2l0aCgiLSIpOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ29tbWVudHMgY2Fubm90IGVuZCBpbiBhIGRhc2giLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgICAgICAgICBkYXRhICs9ICIgIgogICAgICAgIHJldHVybiBkYXRhCgogICAgZGVmIGNvZXJjZUNoYXJhY3RlcnMoc2VsZiwgZGF0YSk6CiAgICAgICAgaWYgc2VsZi5yZXBsYWNlRm9ybUZlZWRDaGFyYWN0ZXJzOgogICAgICAgICAgICBmb3IgXyBpbiByYW5nZShkYXRhLmNvdW50KCJceDBDIikpOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiVGV4dCBjYW5ub3QgY29udGFpbiBVKzAwMEMiLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoIlx4MEMiLCAiICIpCiAgICAgICAgIyBPdGhlciBub24teG1sIGNoYXJhY3RlcnMKICAgICAgICByZXR1cm4gZGF0YQoKICAgIGRlZiBjb2VyY2VQdWJpZChzZWxmLCBkYXRhKToKICAgICAgICBkYXRhT3V0cHV0ID0gZGF0YQogICAgICAgIGZvciBjaGFyIGluIG5vblB1YmlkQ2hhclJlZ2V4cC5maW5kYWxsKGRhdGEpOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDb2VyY2luZyBub24tWE1MIHB1YmlkIiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgICAgICByZXBsYWNlbWVudCA9IHNlbGYuZ2V0UmVwbGFjZW1lbnRDaGFyYWN0ZXIoY2hhcikKICAgICAgICAgICAgZGF0YU91dHB1dCA9IGRhdGFPdXRwdXQucmVwbGFjZShjaGFyLCByZXBsYWNlbWVudCkKICAgICAgICBpZiBzZWxmLnByZXZlbnRTaW5nbGVRdW90ZVB1YmlkIGFuZCBkYXRhT3V0cHV0LmZpbmQoIiciKSA+PSAwOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJQdWJpZCBjYW5ub3QgY29udGFpbiBzaW5nbGUgcXVvdGUiLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgICAgIGRhdGFPdXRwdXQgPSBkYXRhT3V0cHV0LnJlcGxhY2UoIiciLCBzZWxmLmdldFJlcGxhY2VtZW50Q2hhcmFjdGVyKCInIikpCiAgICAgICAgcmV0dXJuIGRhdGFPdXRwdXQKCiAgICBkZWYgdG9YbWxOYW1lKHNlbGYsIG5hbWUpOgogICAgICAgIG5hbWVGaXJzdCA9IG5hbWVbMF0KICAgICAgICBuYW1lUmVzdCA9IG5hbWVbMTpdCiAgICAgICAgbSA9IG5vblhtbE5hbWVGaXJzdEJNUFJlZ2V4cC5tYXRjaChuYW1lRmlyc3QpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ29lcmNpbmcgbm9uLVhNTCBuYW1lIiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgICAgICBuYW1lRmlyc3RPdXRwdXQgPSBzZWxmLmdldFJlcGxhY2VtZW50Q2hhcmFjdGVyKG5hbWVGaXJzdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBuYW1lRmlyc3RPdXRwdXQgPSBuYW1lRmlyc3QKCiAgICAgICAgbmFtZVJlc3RPdXRwdXQgPSBuYW1lUmVzdAogICAgICAgIHJlcGxhY2VDaGFycyA9IHNldChub25YbWxOYW1lQk1QUmVnZXhwLmZpbmRhbGwobmFtZVJlc3QpKQogICAgICAgIGZvciBjaGFyIGluIHJlcGxhY2VDaGFyczoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ29lcmNpbmcgbm9uLVhNTCBuYW1lIiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgICAgICByZXBsYWNlbWVudCA9IHNlbGYuZ2V0UmVwbGFjZW1lbnRDaGFyYWN0ZXIoY2hhcikKICAgICAgICAgICAgbmFtZVJlc3RPdXRwdXQgPSBuYW1lUmVzdE91dHB1dC5yZXBsYWNlKGNoYXIsIHJlcGxhY2VtZW50KQogICAgICAgIHJldHVybiBuYW1lRmlyc3RPdXRwdXQgKyBuYW1lUmVzdE91dHB1dAoKICAgIGRlZiBnZXRSZXBsYWNlbWVudENoYXJhY3RlcihzZWxmLCBjaGFyKToKICAgICAgICBpZiBjaGFyIGluIHNlbGYucmVwbGFjZUNhY2hlOgogICAgICAgICAgICByZXBsYWNlbWVudCA9IHNlbGYucmVwbGFjZUNhY2hlW2NoYXJdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSBzZWxmLmVzY2FwZUNoYXIoY2hhcikKICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQKCiAgICBkZWYgZnJvbVhtbE5hbWUoc2VsZiwgbmFtZSk6CiAgICAgICAgZm9yIGl0ZW0gaW4gc2V0KHNlbGYucmVwbGFjZW1lbnRSZWdleHAuZmluZGFsbChuYW1lKSk6CiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoaXRlbSwgc2VsZi51bmVzY2FwZUNoYXIoaXRlbSkpCiAgICAgICAgcmV0dXJuIG5hbWUKCiAgICBkZWYgZXNjYXBlQ2hhcihzZWxmLCBjaGFyKToKICAgICAgICByZXBsYWNlbWVudCA9ICJVJTA1WCIgJSBvcmQoY2hhcikKICAgICAgICBzZWxmLnJlcGxhY2VDYWNoZVtjaGFyXSA9IHJlcGxhY2VtZW50CiAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50CgogICAgZGVmIHVuZXNjYXBlQ2hhcihzZWxmLCBjaGFyY29kZSk6CiAgICAgICAgcmV0dXJuIGNocihpbnQoY2hhcmNvZGVbMTpdLCAxNikpClBLAwQUAAAAAAAAACEAHgxtNRR/AAAUfwAANAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9faW5wdXRzdHJlYW0ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB0ZXh0X3R5cGUsIGJpbmFyeV90eXBlCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCBodHRwX2NsaWVudCwgdXJsbGliCgppbXBvcnQgY29kZWNzCmltcG9ydCByZQoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgd2ViZW5jb2RpbmdzCgpmcm9tIC5jb25zdGFudHMgaW1wb3J0IEVPRiwgc3BhY2VDaGFyYWN0ZXJzLCBhc2NpaUxldHRlcnMsIGFzY2lpVXBwZXJjYXNlCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgUmVwYXJzZUV4Y2VwdGlvbgpmcm9tIC4gaW1wb3J0IF91dGlscwoKZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KCnRyeToKICAgIGZyb20gaW8gaW1wb3J0IEJ5dGVzSU8KZXhjZXB0IEltcG9ydEVycm9yOgogICAgQnl0ZXNJTyA9IFN0cmluZ0lPCgojIE5vbi11bmljb2RlIHZlcnNpb25zIG9mIGNvbnN0YW50cyBmb3IgdXNlIGluIHRoZSBwcmUtcGFyc2VyCnNwYWNlQ2hhcmFjdGVyc0J5dGVzID0gZnJvemVuc2V0KFtpdGVtLmVuY29kZSgiYXNjaWkiKSBmb3IgaXRlbSBpbiBzcGFjZUNoYXJhY3RlcnNdKQphc2NpaUxldHRlcnNCeXRlcyA9IGZyb3plbnNldChbaXRlbS5lbmNvZGUoImFzY2lpIikgZm9yIGl0ZW0gaW4gYXNjaWlMZXR0ZXJzXSkKYXNjaWlVcHBlcmNhc2VCeXRlcyA9IGZyb3plbnNldChbaXRlbS5lbmNvZGUoImFzY2lpIikgZm9yIGl0ZW0gaW4gYXNjaWlVcHBlcmNhc2VdKQpzcGFjZXNBbmdsZUJyYWNrZXRzID0gc3BhY2VDaGFyYWN0ZXJzQnl0ZXMgfCBmcm96ZW5zZXQoW2IiPiIsIGIiPCJdKQoKCmludmFsaWRfdW5pY29kZV9ub19zdXJyb2dhdGUgPSAiW1x1MDAwMS1cdTAwMDhcdTAwMEJcdTAwMEUtXHUwMDFGXHUwMDdGLVx1MDA5Rlx1RkREMC1cdUZERUZcdUZGRkVcdUZGRkZcVTAwMDFGRkZFXFUwMDAxRkZGRlxVMDAwMkZGRkVcVTAwMDJGRkZGXFUwMDAzRkZGRVxVMDAwM0ZGRkZcVTAwMDRGRkZFXFUwMDA0RkZGRlxVMDAwNUZGRkVcVTAwMDVGRkZGXFUwMDA2RkZGRVxVMDAwNkZGRkZcVTAwMDdGRkZFXFUwMDA3RkZGRlxVMDAwOEZGRkVcVTAwMDhGRkZGXFUwMDA5RkZGRVxVMDAwOUZGRkZcVTAwMEFGRkZFXFUwMDBBRkZGRlxVMDAwQkZGRkVcVTAwMEJGRkZGXFUwMDBDRkZGRVxVMDAwQ0ZGRkZcVTAwMERGRkZFXFUwMDBERkZGRlxVMDAwRUZGRkVcVTAwMEVGRkZGXFUwMDBGRkZGRVxVMDAwRkZGRkZcVTAwMTBGRkZFXFUwMDEwRkZGRl0iICAjIG5vcWEKCmlmIF91dGlscy5zdXBwb3J0c19sb25lX3N1cnJvZ2F0ZXM6CiAgICAjIFVzZSBvbmUgZXh0cmEgc3RlcCBvZiBpbmRpcmVjdGlvbiBhbmQgY3JlYXRlIHN1cnJvZ2F0ZXMgd2l0aAogICAgIyBldmFsLiBOb3QgdXNpbmcgdGhpcyBpbmRpcmVjdGlvbiB3b3VsZCBpbnRyb2R1Y2UgYW4gaWxsZWdhbAogICAgIyB1bmljb2RlIGxpdGVyYWwgb24gcGxhdGZvcm1zIG5vdCBzdXBwb3J0aW5nIHN1Y2ggbG9uZQogICAgIyBzdXJyb2dhdGVzLgogICAgYXNzZXJ0IGludmFsaWRfdW5pY29kZV9ub19zdXJyb2dhdGVbLTFdID09ICJdIiBhbmQgaW52YWxpZF91bmljb2RlX25vX3N1cnJvZ2F0ZS5jb3VudCgiXSIpID09IDEKICAgIGludmFsaWRfdW5pY29kZV9yZSA9IHJlLmNvbXBpbGUoaW52YWxpZF91bmljb2RlX25vX3N1cnJvZ2F0ZVs6LTFdICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbCgnIlxcdUQ4MDAtXFx1REZGRiInKSArICAjIHB5bGludDpkaXNhYmxlPWV2YWwtdXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSIpCmVsc2U6CiAgICBpbnZhbGlkX3VuaWNvZGVfcmUgPSByZS5jb21waWxlKGludmFsaWRfdW5pY29kZV9ub19zdXJyb2dhdGUpCgpub25fYm1wX2ludmFsaWRfY29kZXBvaW50cyA9IHNldChbMHgxRkZGRSwgMHgxRkZGRiwgMHgyRkZGRSwgMHgyRkZGRiwgMHgzRkZGRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0ZGRkYsIDB4NEZGRkUsIDB4NEZGRkYsIDB4NUZGRkUsIDB4NUZGRkYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZGRkZFLCAweDZGRkZGLCAweDdGRkZFLCAweDdGRkZGLCAweDhGRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RkZGRiwgMHg5RkZGRSwgMHg5RkZGRiwgMHhBRkZGRSwgMHhBRkZGRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkZGRkUsIDB4QkZGRkYsIDB4Q0ZGRkUsIDB4Q0ZGRkYsIDB4REZGRkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERGRkZGLCAweEVGRkZFLCAweEVGRkZGLCAweEZGRkZFLCAweEZGRkZGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMEZGRkUsIDB4MTBGRkZGXSkKCmFzY2lpX3B1bmN0dWF0aW9uX3JlID0gcmUuY29tcGlsZSgiW1x1MDAwOS1cdTAwMERcdTAwMjAtXHUwMDJGXHUwMDNBLVx1MDA0MFx1MDA1Qi1cdTAwNjBcdTAwN0ItXHUwMDdFXSIpCgojIENhY2hlIGZvciBjaGFyc1VudGlsKCkKY2hhcnNVbnRpbFJlZ0V4ID0ge30KCgpjbGFzcyBCdWZmZXJlZFN0cmVhbShvYmplY3QpOgogICAgIiIiQnVmZmVyaW5nIGZvciBzdHJlYW1zIHRoYXQgZG8gbm90IGhhdmUgYnVmZmVyaW5nIG9mIHRoZWlyIG93bgoKICAgIFRoZSBidWZmZXIgaXMgaW1wbGVtZW50ZWQgYXMgYSBsaXN0IG9mIGNodW5rcyBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0CiAgICBqb2luaW5nIG1hbnkgc3RyaW5ncyB3aWxsIGJlIHNsb3cgc2luY2UgaXQgaXMgTyhuKioyKQogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSk6CiAgICAgICAgc2VsZi5zdHJlYW0gPSBzdHJlYW0KICAgICAgICBzZWxmLmJ1ZmZlciA9IFtdCiAgICAgICAgc2VsZi5wb3NpdGlvbiA9IFstMSwgMF0gICMgY2h1bmsgbnVtYmVyLCBvZmZzZXQKCiAgICBkZWYgdGVsbChzZWxmKToKICAgICAgICBwb3MgPSAwCiAgICAgICAgZm9yIGNodW5rIGluIHNlbGYuYnVmZmVyWzpzZWxmLnBvc2l0aW9uWzBdXToKICAgICAgICAgICAgcG9zICs9IGxlbihjaHVuaykKICAgICAgICBwb3MgKz0gc2VsZi5wb3NpdGlvblsxXQogICAgICAgIHJldHVybiBwb3MKCiAgICBkZWYgc2VlayhzZWxmLCBwb3MpOgogICAgICAgIGFzc2VydCBwb3MgPD0gc2VsZi5fYnVmZmVyZWRCeXRlcygpCiAgICAgICAgb2Zmc2V0ID0gcG9zCiAgICAgICAgaSA9IDAKICAgICAgICB3aGlsZSBsZW4oc2VsZi5idWZmZXJbaV0pIDwgb2Zmc2V0OgogICAgICAgICAgICBvZmZzZXQgLT0gbGVuKHNlbGYuYnVmZmVyW2ldKQogICAgICAgICAgICBpICs9IDEKICAgICAgICBzZWxmLnBvc2l0aW9uID0gW2ksIG9mZnNldF0KCiAgICBkZWYgcmVhZChzZWxmLCBieXRlcyk6CiAgICAgICAgaWYgbm90IHNlbGYuYnVmZmVyOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVhZFN0cmVhbShieXRlcykKICAgICAgICBlbGlmIChzZWxmLnBvc2l0aW9uWzBdID09IGxlbihzZWxmLmJ1ZmZlcikgYW5kCiAgICAgICAgICAgICAgc2VsZi5wb3NpdGlvblsxXSA9PSBsZW4oc2VsZi5idWZmZXJbLTFdKSk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZWFkU3RyZWFtKGJ5dGVzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZWFkRnJvbUJ1ZmZlcihieXRlcykKCiAgICBkZWYgX2J1ZmZlcmVkQnl0ZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHN1bShbbGVuKGl0ZW0pIGZvciBpdGVtIGluIHNlbGYuYnVmZmVyXSkKCiAgICBkZWYgX3JlYWRTdHJlYW0oc2VsZiwgYnl0ZXMpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5yZWFkKGJ5dGVzKQogICAgICAgIHNlbGYuYnVmZmVyLmFwcGVuZChkYXRhKQogICAgICAgIHNlbGYucG9zaXRpb25bMF0gKz0gMQogICAgICAgIHNlbGYucG9zaXRpb25bMV0gPSBsZW4oZGF0YSkKICAgICAgICByZXR1cm4gZGF0YQoKICAgIGRlZiBfcmVhZEZyb21CdWZmZXIoc2VsZiwgYnl0ZXMpOgogICAgICAgIHJlbWFpbmluZ0J5dGVzID0gYnl0ZXMKICAgICAgICBydiA9IFtdCiAgICAgICAgYnVmZmVySW5kZXggPSBzZWxmLnBvc2l0aW9uWzBdCiAgICAgICAgYnVmZmVyT2Zmc2V0ID0gc2VsZi5wb3NpdGlvblsxXQogICAgICAgIHdoaWxlIGJ1ZmZlckluZGV4IDwgbGVuKHNlbGYuYnVmZmVyKSBhbmQgcmVtYWluaW5nQnl0ZXMgIT0gMDoKICAgICAgICAgICAgYXNzZXJ0IHJlbWFpbmluZ0J5dGVzID4gMAogICAgICAgICAgICBidWZmZXJlZERhdGEgPSBzZWxmLmJ1ZmZlcltidWZmZXJJbmRleF0KCiAgICAgICAgICAgIGlmIHJlbWFpbmluZ0J5dGVzIDw9IGxlbihidWZmZXJlZERhdGEpIC0gYnVmZmVyT2Zmc2V0OgogICAgICAgICAgICAgICAgYnl0ZXNUb1JlYWQgPSByZW1haW5pbmdCeXRlcwogICAgICAgICAgICAgICAgc2VsZi5wb3NpdGlvbiA9IFtidWZmZXJJbmRleCwgYnVmZmVyT2Zmc2V0ICsgYnl0ZXNUb1JlYWRdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBieXRlc1RvUmVhZCA9IGxlbihidWZmZXJlZERhdGEpIC0gYnVmZmVyT2Zmc2V0CiAgICAgICAgICAgICAgICBzZWxmLnBvc2l0aW9uID0gW2J1ZmZlckluZGV4LCBsZW4oYnVmZmVyZWREYXRhKV0KICAgICAgICAgICAgICAgIGJ1ZmZlckluZGV4ICs9IDEKICAgICAgICAgICAgcnYuYXBwZW5kKGJ1ZmZlcmVkRGF0YVtidWZmZXJPZmZzZXQ6YnVmZmVyT2Zmc2V0ICsgYnl0ZXNUb1JlYWRdKQogICAgICAgICAgICByZW1haW5pbmdCeXRlcyAtPSBieXRlc1RvUmVhZAoKICAgICAgICAgICAgYnVmZmVyT2Zmc2V0ID0gMAoKICAgICAgICBpZiByZW1haW5pbmdCeXRlczoKICAgICAgICAgICAgcnYuYXBwZW5kKHNlbGYuX3JlYWRTdHJlYW0ocmVtYWluaW5nQnl0ZXMpKQoKICAgICAgICByZXR1cm4gYiIiLmpvaW4ocnYpCgoKZGVmIEhUTUxJbnB1dFN0cmVhbShzb3VyY2UsICoqa3dhcmdzKToKICAgICMgV29yayBhcm91bmQgUHl0aG9uIGJ1ZyAjMjAwMDc6IHJlYWQoMCkgY2xvc2VzIHRoZSBjb25uZWN0aW9uLgogICAgIyBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjAwMDcKICAgIGlmIChpc2luc3RhbmNlKHNvdXJjZSwgaHR0cF9jbGllbnQuSFRUUFJlc3BvbnNlKSBvcgogICAgICAgICMgQWxzbyBjaGVjayBmb3IgYWRkaW5mb3VybCB3cmFwcGluZyBIVFRQUmVzcG9uc2UKICAgICAgICAoaXNpbnN0YW5jZShzb3VyY2UsIHVybGxpYi5yZXNwb25zZS5hZGRiYXNlKSBhbmQKICAgICAgICAgaXNpbnN0YW5jZShzb3VyY2UuZnAsIGh0dHBfY2xpZW50LkhUVFBSZXNwb25zZSkpKToKICAgICAgICBpc1VuaWNvZGUgPSBGYWxzZQogICAgZWxpZiBoYXNhdHRyKHNvdXJjZSwgInJlYWQiKToKICAgICAgICBpc1VuaWNvZGUgPSBpc2luc3RhbmNlKHNvdXJjZS5yZWFkKDApLCB0ZXh0X3R5cGUpCiAgICBlbHNlOgogICAgICAgIGlzVW5pY29kZSA9IGlzaW5zdGFuY2Uoc291cmNlLCB0ZXh0X3R5cGUpCgogICAgaWYgaXNVbmljb2RlOgogICAgICAgIGVuY29kaW5ncyA9IFt4IGZvciB4IGluIGt3YXJncyBpZiB4LmVuZHN3aXRoKCJfZW5jb2RpbmciKV0KICAgICAgICBpZiBlbmNvZGluZ3M6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2Fubm90IHNldCBhbiBlbmNvZGluZyB3aXRoIGEgdW5pY29kZSBpbnB1dCwgc2V0ICVyIiAlIGVuY29kaW5ncykKCiAgICAgICAgcmV0dXJuIEhUTUxVbmljb2RlSW5wdXRTdHJlYW0oc291cmNlLCAqKmt3YXJncykKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIEhUTUxCaW5hcnlJbnB1dFN0cmVhbShzb3VyY2UsICoqa3dhcmdzKQoKCmNsYXNzIEhUTUxVbmljb2RlSW5wdXRTdHJlYW0ob2JqZWN0KToKICAgICIiIlByb3ZpZGVzIGEgdW5pY29kZSBzdHJlYW0gb2YgY2hhcmFjdGVycyB0byB0aGUgSFRNTFRva2VuaXplci4KCiAgICBUaGlzIGNsYXNzIHRha2VzIGNhcmUgb2YgY2hhcmFjdGVyIGVuY29kaW5nIGFuZCByZW1vdmluZyBvciByZXBsYWNpbmcKICAgIGluY29ycmVjdCBieXRlLXNlcXVlbmNlcyBhbmQgYWxzbyBwcm92aWRlcyBjb2x1bW4gYW5kIGxpbmUgdHJhY2tpbmcuCgogICAgIiIiCgogICAgX2RlZmF1bHRDaHVua1NpemUgPSAxMDI0MAoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2UpOgogICAgICAgICIiIkluaXRpYWxpc2VzIHRoZSBIVE1MSW5wdXRTdHJlYW0uCgogICAgICAgIEhUTUxJbnB1dFN0cmVhbShzb3VyY2UsIFtlbmNvZGluZ10pIC0+IE5vcm1hbGl6ZWQgc3RyZWFtIGZyb20gc291cmNlCiAgICAgICAgZm9yIHVzZSBieSBodG1sNWxpYi4KCiAgICAgICAgc291cmNlIGNhbiBiZSBlaXRoZXIgYSBmaWxlLW9iamVjdCwgbG9jYWwgZmlsZW5hbWUgb3IgYSBzdHJpbmcuCgogICAgICAgIFRoZSBvcHRpb25hbCBlbmNvZGluZyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHN0cmluZyB0aGF0IGluZGljYXRlcwogICAgICAgIHRoZSBlbmNvZGluZy4gIElmIHNwZWNpZmllZCwgdGhhdCBlbmNvZGluZyB3aWxsIGJlIHVzZWQsCiAgICAgICAgcmVnYXJkbGVzcyBvZiBhbnkgQk9NIG9yIGxhdGVyIGRlY2xhcmF0aW9uIChzdWNoIGFzIGluIGEgbWV0YQogICAgICAgIGVsZW1lbnQpCgogICAgICAgICIiIgoKICAgICAgICBpZiBub3QgX3V0aWxzLnN1cHBvcnRzX2xvbmVfc3Vycm9nYXRlczoKICAgICAgICAgICAgIyBTdWNoIHBsYXRmb3JtcyB3aWxsIGhhdmUgYWxyZWFkeSBjaGVja2VkIGZvciBzdWNoCiAgICAgICAgICAgICMgc3Vycm9nYXRlIGVycm9ycywgc28gbm8gbmVlZCB0byBkbyB0aGlzIGNoZWNraW5nLgogICAgICAgICAgICBzZWxmLnJlcG9ydENoYXJhY3RlckVycm9ycyA9IE5vbmUKICAgICAgICBlbGlmIGxlbigiXFUwMDEwRkZGRiIpID09IDE6CiAgICAgICAgICAgIHNlbGYucmVwb3J0Q2hhcmFjdGVyRXJyb3JzID0gc2VsZi5jaGFyYWN0ZXJFcnJvcnNVQ1M0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5yZXBvcnRDaGFyYWN0ZXJFcnJvcnMgPSBzZWxmLmNoYXJhY3RlckVycm9yc1VDUzIKCiAgICAgICAgIyBMaXN0IG9mIHdoZXJlIG5ldyBsaW5lcyBvY2N1cgogICAgICAgIHNlbGYubmV3TGluZXMgPSBbMF0KCiAgICAgICAgc2VsZi5jaGFyRW5jb2RpbmcgPSAobG9va3VwRW5jb2RpbmcoInV0Zi04IiksICJjZXJ0YWluIikKICAgICAgICBzZWxmLmRhdGFTdHJlYW0gPSBzZWxmLm9wZW5TdHJlYW0oc291cmNlKQoKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc2VsZi5jaHVuayA9ICIiCiAgICAgICAgc2VsZi5jaHVua1NpemUgPSAwCiAgICAgICAgc2VsZi5jaHVua09mZnNldCA9IDAKICAgICAgICBzZWxmLmVycm9ycyA9IFtdCgogICAgICAgICMgbnVtYmVyIG9mIChjb21wbGV0ZSkgbGluZXMgaW4gcHJldmlvdXMgY2h1bmtzCiAgICAgICAgc2VsZi5wcmV2TnVtTGluZXMgPSAwCiAgICAgICAgIyBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgbGFzdCBsaW5lIG9mIHRoZSBwcmV2aW91cyBjaHVuawogICAgICAgIHNlbGYucHJldk51bUNvbHMgPSAwCgogICAgICAgICMgRGVhbCB3aXRoIENSIExGIGFuZCBzdXJyb2dhdGVzIHNwbGl0IG92ZXIgY2h1bmsgYm91bmRhcmllcwogICAgICAgIHNlbGYuX2J1ZmZlcmVkQ2hhcmFjdGVyID0gTm9uZQoKICAgIGRlZiBvcGVuU3RyZWFtKHNlbGYsIHNvdXJjZSk6CiAgICAgICAgIiIiUHJvZHVjZXMgYSBmaWxlIG9iamVjdCBmcm9tIHNvdXJjZS4KCiAgICAgICAgc291cmNlIGNhbiBiZSBlaXRoZXIgYSBmaWxlIG9iamVjdCwgbG9jYWwgZmlsZW5hbWUgb3IgYSBzdHJpbmcuCgogICAgICAgICIiIgogICAgICAgICMgQWxyZWFkeSBhIGZpbGUgb2JqZWN0CiAgICAgICAgaWYgaGFzYXR0cihzb3VyY2UsICdyZWFkJyk6CiAgICAgICAgICAgIHN0cmVhbSA9IHNvdXJjZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN0cmVhbSA9IFN0cmluZ0lPKHNvdXJjZSkKCiAgICAgICAgcmV0dXJuIHN0cmVhbQoKICAgIGRlZiBfcG9zaXRpb24oc2VsZiwgb2Zmc2V0KToKICAgICAgICBjaHVuayA9IHNlbGYuY2h1bmsKICAgICAgICBuTGluZXMgPSBjaHVuay5jb3VudCgnXG4nLCAwLCBvZmZzZXQpCiAgICAgICAgcG9zaXRpb25MaW5lID0gc2VsZi5wcmV2TnVtTGluZXMgKyBuTGluZXMKICAgICAgICBsYXN0TGluZVBvcyA9IGNodW5rLnJmaW5kKCdcbicsIDAsIG9mZnNldCkKICAgICAgICBpZiBsYXN0TGluZVBvcyA9PSAtMToKICAgICAgICAgICAgcG9zaXRpb25Db2x1bW4gPSBzZWxmLnByZXZOdW1Db2xzICsgb2Zmc2V0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcG9zaXRpb25Db2x1bW4gPSBvZmZzZXQgLSAobGFzdExpbmVQb3MgKyAxKQogICAgICAgIHJldHVybiAocG9zaXRpb25MaW5lLCBwb3NpdGlvbkNvbHVtbikKCiAgICBkZWYgcG9zaXRpb24oc2VsZik6CiAgICAgICAgIiIiUmV0dXJucyAobGluZSwgY29sKSBvZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtLiIiIgogICAgICAgIGxpbmUsIGNvbCA9IHNlbGYuX3Bvc2l0aW9uKHNlbGYuY2h1bmtPZmZzZXQpCiAgICAgICAgcmV0dXJuIChsaW5lICsgMSwgY29sKQoKICAgIGRlZiBjaGFyKHNlbGYpOgogICAgICAgICIiIiBSZWFkIG9uZSBjaGFyYWN0ZXIgZnJvbSB0aGUgc3RyZWFtIG9yIHF1ZXVlIGlmIGF2YWlsYWJsZS4gUmV0dXJuCiAgICAgICAgICAgIEVPRiB3aGVuIEVPRiBpcyByZWFjaGVkLgogICAgICAgICIiIgogICAgICAgICMgUmVhZCBhIG5ldyBjaHVuayBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gaWYgbmVjZXNzYXJ5CiAgICAgICAgaWYgc2VsZi5jaHVua09mZnNldCA+PSBzZWxmLmNodW5rU2l6ZToKICAgICAgICAgICAgaWYgbm90IHNlbGYucmVhZENodW5rKCk6CiAgICAgICAgICAgICAgICByZXR1cm4gRU9GCgogICAgICAgIGNodW5rT2Zmc2V0ID0gc2VsZi5jaHVua09mZnNldAogICAgICAgIGNoYXIgPSBzZWxmLmNodW5rW2NodW5rT2Zmc2V0XQogICAgICAgIHNlbGYuY2h1bmtPZmZzZXQgPSBjaHVua09mZnNldCArIDEKCiAgICAgICAgcmV0dXJuIGNoYXIKCiAgICBkZWYgcmVhZENodW5rKHNlbGYsIGNodW5rU2l6ZT1Ob25lKToKICAgICAgICBpZiBjaHVua1NpemUgaXMgTm9uZToKICAgICAgICAgICAgY2h1bmtTaXplID0gc2VsZi5fZGVmYXVsdENodW5rU2l6ZQoKICAgICAgICBzZWxmLnByZXZOdW1MaW5lcywgc2VsZi5wcmV2TnVtQ29scyA9IHNlbGYuX3Bvc2l0aW9uKHNlbGYuY2h1bmtTaXplKQoKICAgICAgICBzZWxmLmNodW5rID0gIiIKICAgICAgICBzZWxmLmNodW5rU2l6ZSA9IDAKICAgICAgICBzZWxmLmNodW5rT2Zmc2V0ID0gMAoKICAgICAgICBkYXRhID0gc2VsZi5kYXRhU3RyZWFtLnJlYWQoY2h1bmtTaXplKQoKICAgICAgICAjIERlYWwgd2l0aCBDUiBMRiBhbmQgc3Vycm9nYXRlcyBicm9rZW4gYWNyb3NzIGNodW5rcwogICAgICAgIGlmIHNlbGYuX2J1ZmZlcmVkQ2hhcmFjdGVyOgogICAgICAgICAgICBkYXRhID0gc2VsZi5fYnVmZmVyZWRDaGFyYWN0ZXIgKyBkYXRhCiAgICAgICAgICAgIHNlbGYuX2J1ZmZlcmVkQ2hhcmFjdGVyID0gTm9uZQogICAgICAgIGVsaWYgbm90IGRhdGE6CiAgICAgICAgICAgICMgV2UgaGF2ZSBubyBtb3JlIGRhdGEsIGJ5ZS1ieWUgc3RyZWFtCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBpZiBsZW4oZGF0YSkgPiAxOgogICAgICAgICAgICBsYXN0diA9IG9yZChkYXRhWy0xXSkKICAgICAgICAgICAgaWYgbGFzdHYgPT0gMHgwRCBvciAweEQ4MDAgPD0gbGFzdHYgPD0gMHhEQkZGOgogICAgICAgICAgICAgICAgc2VsZi5fYnVmZmVyZWRDaGFyYWN0ZXIgPSBkYXRhWy0xXQogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFbOi0xXQoKICAgICAgICBpZiBzZWxmLnJlcG9ydENoYXJhY3RlckVycm9yczoKICAgICAgICAgICAgc2VsZi5yZXBvcnRDaGFyYWN0ZXJFcnJvcnMoZGF0YSkKCiAgICAgICAgIyBSZXBsYWNlIGludmFsaWQgY2hhcmFjdGVycwogICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoIlxyXG4iLCAiXG4iKQogICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoIlxyIiwgIlxuIikKCiAgICAgICAgc2VsZi5jaHVuayA9IGRhdGEKICAgICAgICBzZWxmLmNodW5rU2l6ZSA9IGxlbihkYXRhKQoKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjaGFyYWN0ZXJFcnJvcnNVQ1M0KHNlbGYsIGRhdGEpOgogICAgICAgIGZvciBfIGluIHJhbmdlKGxlbihpbnZhbGlkX3VuaWNvZGVfcmUuZmluZGFsbChkYXRhKSkpOgogICAgICAgICAgICBzZWxmLmVycm9ycy5hcHBlbmQoImludmFsaWQtY29kZXBvaW50IikKCiAgICBkZWYgY2hhcmFjdGVyRXJyb3JzVUNTMihzZWxmLCBkYXRhKToKICAgICAgICAjIFNvbWVvbmUgcGlja2VkIHRoZSB3cm9uZyBjb21waWxlIG9wdGlvbgogICAgICAgICMgWW91IGxvc2UKICAgICAgICBza2lwID0gRmFsc2UKICAgICAgICBmb3IgbWF0Y2ggaW4gaW52YWxpZF91bmljb2RlX3JlLmZpbmRpdGVyKGRhdGEpOgogICAgICAgICAgICBpZiBza2lwOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgY29kZXBvaW50ID0gb3JkKG1hdGNoLmdyb3VwKCkpCiAgICAgICAgICAgIHBvcyA9IG1hdGNoLnN0YXJ0KCkKICAgICAgICAgICAgIyBQcmV0dHkgc3VyZSB0aGVyZSBzaG91bGQgYmUgZW5kaWFubmVzcyBpc3N1ZXMgaGVyZQogICAgICAgICAgICBpZiBfdXRpbHMuaXNTdXJyb2dhdGVQYWlyKGRhdGFbcG9zOnBvcyArIDJdKToKICAgICAgICAgICAgICAgICMgV2UgaGF2ZSBhIHN1cnJvZ2F0ZSBwYWlyIQogICAgICAgICAgICAgICAgY2hhcl92YWwgPSBfdXRpbHMuc3Vycm9nYXRlUGFpclRvQ29kZXBvaW50KGRhdGFbcG9zOnBvcyArIDJdKQogICAgICAgICAgICAgICAgaWYgY2hhcl92YWwgaW4gbm9uX2JtcF9pbnZhbGlkX2NvZGVwb2ludHM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcnMuYXBwZW5kKCJpbnZhbGlkLWNvZGVwb2ludCIpCiAgICAgICAgICAgICAgICBza2lwID0gVHJ1ZQogICAgICAgICAgICBlbGlmIChjb2RlcG9pbnQgPj0gMHhEODAwIGFuZCBjb2RlcG9pbnQgPD0gMHhERkZGIGFuZAogICAgICAgICAgICAgICAgICBwb3MgPT0gbGVuKGRhdGEpIC0gMSk6CiAgICAgICAgICAgICAgICBzZWxmLmVycm9ycy5hcHBlbmQoImludmFsaWQtY29kZXBvaW50IikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNraXAgPSBGYWxzZQogICAgICAgICAgICAgICAgc2VsZi5lcnJvcnMuYXBwZW5kKCJpbnZhbGlkLWNvZGVwb2ludCIpCgogICAgZGVmIGNoYXJzVW50aWwoc2VsZiwgY2hhcmFjdGVycywgb3Bwb3NpdGU9RmFsc2UpOgogICAgICAgICIiIiBSZXR1cm5zIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RyZWFtIHVwIHRvIGJ1dCBub3QKICAgICAgICBpbmNsdWRpbmcgYW55IGNoYXJhY3RlciBpbiAnY2hhcmFjdGVycycgb3IgRU9GLiAnY2hhcmFjdGVycycgbXVzdCBiZQogICAgICAgIGEgY29udGFpbmVyIHRoYXQgc3VwcG9ydHMgdGhlICdpbicgbWV0aG9kIGFuZCBpdGVyYXRpb24gb3ZlciBpdHMKICAgICAgICBjaGFyYWN0ZXJzLgogICAgICAgICIiIgoKICAgICAgICAjIFVzZSBhIGNhY2hlIG9mIHJlZ2V4cHMgdG8gZmluZCB0aGUgcmVxdWlyZWQgY2hhcmFjdGVycwogICAgICAgIHRyeToKICAgICAgICAgICAgY2hhcnMgPSBjaGFyc1VudGlsUmVnRXhbKGNoYXJhY3RlcnMsIG9wcG9zaXRlKV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKICAgICAgICAgICAgICAgIGZvciBjIGluIGNoYXJhY3RlcnM6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KG9yZChjKSA8IDEyOCkKICAgICAgICAgICAgcmVnZXggPSAiIi5qb2luKFsiXFx4JTAyeCIgJSBvcmQoYykgZm9yIGMgaW4gY2hhcmFjdGVyc10pCiAgICAgICAgICAgIGlmIG5vdCBvcHBvc2l0ZToKICAgICAgICAgICAgICAgIHJlZ2V4ID0gIl4lcyIgJSByZWdleAogICAgICAgICAgICBjaGFycyA9IGNoYXJzVW50aWxSZWdFeFsoY2hhcmFjdGVycywgb3Bwb3NpdGUpXSA9IHJlLmNvbXBpbGUoIlslc10rIiAlIHJlZ2V4KQoKICAgICAgICBydiA9IFtdCgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICMgRmluZCB0aGUgbG9uZ2VzdCBtYXRjaGluZyBwcmVmaXgKICAgICAgICAgICAgbSA9IGNoYXJzLm1hdGNoKHNlbGYuY2h1bmssIHNlbGYuY2h1bmtPZmZzZXQpCiAgICAgICAgICAgIGlmIG0gaXMgTm9uZToKICAgICAgICAgICAgICAgICMgSWYgbm90aGluZyBtYXRjaGVkLCBhbmQgaXQgd2Fzbid0IGJlY2F1c2Ugd2UgcmFuIG91dCBvZiBjaHVuaywKICAgICAgICAgICAgICAgICMgdGhlbiBzdG9wCiAgICAgICAgICAgICAgICBpZiBzZWxmLmNodW5rT2Zmc2V0ICE9IHNlbGYuY2h1bmtTaXplOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBlbmQgPSBtLmVuZCgpCiAgICAgICAgICAgICAgICAjIElmIG5vdCB0aGUgd2hvbGUgY2h1bmsgbWF0Y2hlZCwgcmV0dXJuIGV2ZXJ5dGhpbmcKICAgICAgICAgICAgICAgICMgdXAgdG8gdGhlIHBhcnQgdGhhdCBkaWRuJ3QgbWF0Y2gKICAgICAgICAgICAgICAgIGlmIGVuZCAhPSBzZWxmLmNodW5rU2l6ZToKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoc2VsZi5jaHVua1tzZWxmLmNodW5rT2Zmc2V0OmVuZF0pCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jaHVua09mZnNldCA9IGVuZAogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICMgSWYgdGhlIHdob2xlIHJlbWFpbmRlciBvZiB0aGUgY2h1bmsgbWF0Y2hlZCwKICAgICAgICAgICAgIyB1c2UgaXQgYWxsIGFuZCByZWFkIHRoZSBuZXh0IGNodW5rCiAgICAgICAgICAgIHJ2LmFwcGVuZChzZWxmLmNodW5rW3NlbGYuY2h1bmtPZmZzZXQ6XSkKICAgICAgICAgICAgaWYgbm90IHNlbGYucmVhZENodW5rKCk6CiAgICAgICAgICAgICAgICAjIFJlYWNoZWQgRU9GCiAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICByID0gIiIuam9pbihydikKICAgICAgICByZXR1cm4gcgoKICAgIGRlZiB1bmdldChzZWxmLCBjaGFyKToKICAgICAgICAjIE9ubHkgb25lIGNoYXJhY3RlciBpcyBhbGxvd2VkIHRvIGJlIHVuZ290dGVuIGF0IG9uY2UgLSBpdCBtdXN0CiAgICAgICAgIyBiZSBjb25zdW1lZCBhZ2FpbiBiZWZvcmUgYW55IGZ1cnRoZXIgY2FsbCB0byB1bmdldAogICAgICAgIGlmIGNoYXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIHNlbGYuY2h1bmtPZmZzZXQgPT0gMDoKICAgICAgICAgICAgICAgICMgdW5nZXQgaXMgY2FsbGVkIHF1aXRlIHJhcmVseSwgc28gaXQncyBhIGdvb2QgaWRlYSB0byBkbwogICAgICAgICAgICAgICAgIyBtb3JlIHdvcmsgaGVyZSBpZiBpdCBzYXZlcyBhIGJpdCBvZiB3b3JrIGluIHRoZSBmcmVxdWVudGx5CiAgICAgICAgICAgICAgICAjIGNhbGxlZCBjaGFyIGFuZCBjaGFyc1VudGlsLgogICAgICAgICAgICAgICAgIyBTbywganVzdCBwcmVwZW5kIHRoZSB1bmdvdHRlbiBjaGFyYWN0ZXIgb250byB0aGUgY3VycmVudAogICAgICAgICAgICAgICAgIyBjaHVuazoKICAgICAgICAgICAgICAgIHNlbGYuY2h1bmsgPSBjaGFyICsgc2VsZi5jaHVuawogICAgICAgICAgICAgICAgc2VsZi5jaHVua1NpemUgKz0gMQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5jaHVua09mZnNldCAtPSAxCiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5jaHVua1tzZWxmLmNodW5rT2Zmc2V0XSA9PSBjaGFyCgoKY2xhc3MgSFRNTEJpbmFyeUlucHV0U3RyZWFtKEhUTUxVbmljb2RlSW5wdXRTdHJlYW0pOgogICAgIiIiUHJvdmlkZXMgYSB1bmljb2RlIHN0cmVhbSBvZiBjaGFyYWN0ZXJzIHRvIHRoZSBIVE1MVG9rZW5pemVyLgoKICAgIFRoaXMgY2xhc3MgdGFrZXMgY2FyZSBvZiBjaGFyYWN0ZXIgZW5jb2RpbmcgYW5kIHJlbW92aW5nIG9yIHJlcGxhY2luZwogICAgaW5jb3JyZWN0IGJ5dGUtc2VxdWVuY2VzIGFuZCBhbHNvIHByb3ZpZGVzIGNvbHVtbiBhbmQgbGluZSB0cmFja2luZy4KCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc291cmNlLCBvdmVycmlkZV9lbmNvZGluZz1Ob25lLCB0cmFuc3BvcnRfZW5jb2Rpbmc9Tm9uZSwKICAgICAgICAgICAgICAgICBzYW1lX29yaWdpbl9wYXJlbnRfZW5jb2Rpbmc9Tm9uZSwgbGlrZWx5X2VuY29kaW5nPU5vbmUsCiAgICAgICAgICAgICAgICAgZGVmYXVsdF9lbmNvZGluZz0id2luZG93cy0xMjUyIiwgdXNlQ2hhcmRldD1UcnVlKToKICAgICAgICAiIiJJbml0aWFsaXNlcyB0aGUgSFRNTElucHV0U3RyZWFtLgoKICAgICAgICBIVE1MSW5wdXRTdHJlYW0oc291cmNlLCBbZW5jb2RpbmddKSAtPiBOb3JtYWxpemVkIHN0cmVhbSBmcm9tIHNvdXJjZQogICAgICAgIGZvciB1c2UgYnkgaHRtbDVsaWIuCgogICAgICAgIHNvdXJjZSBjYW4gYmUgZWl0aGVyIGEgZmlsZS1vYmplY3QsIGxvY2FsIGZpbGVuYW1lIG9yIGEgc3RyaW5nLgoKICAgICAgICBUaGUgb3B0aW9uYWwgZW5jb2RpbmcgcGFyYW1ldGVyIG11c3QgYmUgYSBzdHJpbmcgdGhhdCBpbmRpY2F0ZXMKICAgICAgICB0aGUgZW5jb2RpbmcuICBJZiBzcGVjaWZpZWQsIHRoYXQgZW5jb2Rpbmcgd2lsbCBiZSB1c2VkLAogICAgICAgIHJlZ2FyZGxlc3Mgb2YgYW55IEJPTSBvciBsYXRlciBkZWNsYXJhdGlvbiAoc3VjaCBhcyBpbiBhIG1ldGEKICAgICAgICBlbGVtZW50KQoKICAgICAgICAiIiIKICAgICAgICAjIFJhdyBTdHJlYW0gLSBmb3IgdW5pY29kZSBvYmplY3RzIHRoaXMgd2lsbCBlbmNvZGUgdG8gdXRmLTggYW5kIHNldAogICAgICAgICMgICAgICAgICAgICAgIHNlbGYuY2hhckVuY29kaW5nIGFzIGFwcHJvcHJpYXRlCiAgICAgICAgc2VsZi5yYXdTdHJlYW0gPSBzZWxmLm9wZW5TdHJlYW0oc291cmNlKQoKICAgICAgICBIVE1MVW5pY29kZUlucHV0U3RyZWFtLl9faW5pdF9fKHNlbGYsIHNlbGYucmF3U3RyZWFtKQoKICAgICAgICAjIEVuY29kaW5nIEluZm9ybWF0aW9uCiAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gdXNlIHdoZW4gbG9va2luZyBmb3IgYSBtZXRhIGVsZW1lbnQgd2l0aAogICAgICAgICMgZW5jb2RpbmcgaW5mb3JtYXRpb24KICAgICAgICBzZWxmLm51bUJ5dGVzTWV0YSA9IDEwMjQKICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byB1c2Ugd2hlbiB1c2luZyBkZXRlY3RpbmcgZW5jb2RpbmcgdXNpbmcgY2hhcmRldAogICAgICAgIHNlbGYubnVtQnl0ZXNDaGFyZGV0ID0gMTAwCiAgICAgICAgIyBUaGluZ3MgZnJvbSBhcmdzCiAgICAgICAgc2VsZi5vdmVycmlkZV9lbmNvZGluZyA9IG92ZXJyaWRlX2VuY29kaW5nCiAgICAgICAgc2VsZi50cmFuc3BvcnRfZW5jb2RpbmcgPSB0cmFuc3BvcnRfZW5jb2RpbmcKICAgICAgICBzZWxmLnNhbWVfb3JpZ2luX3BhcmVudF9lbmNvZGluZyA9IHNhbWVfb3JpZ2luX3BhcmVudF9lbmNvZGluZwogICAgICAgIHNlbGYubGlrZWx5X2VuY29kaW5nID0gbGlrZWx5X2VuY29kaW5nCiAgICAgICAgc2VsZi5kZWZhdWx0X2VuY29kaW5nID0gZGVmYXVsdF9lbmNvZGluZwoKICAgICAgICAjIERldGVybWluZSBlbmNvZGluZwogICAgICAgIHNlbGYuY2hhckVuY29kaW5nID0gc2VsZi5kZXRlcm1pbmVFbmNvZGluZyh1c2VDaGFyZGV0KQogICAgICAgIGFzc2VydCBzZWxmLmNoYXJFbmNvZGluZ1swXSBpcyBub3QgTm9uZQoKICAgICAgICAjIENhbGwgc3VwZXJjbGFzcwogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLmRhdGFTdHJlYW0gPSBzZWxmLmNoYXJFbmNvZGluZ1swXS5jb2RlY19pbmZvLnN0cmVhbXJlYWRlcihzZWxmLnJhd1N0cmVhbSwgJ3JlcGxhY2UnKQogICAgICAgIEhUTUxVbmljb2RlSW5wdXRTdHJlYW0ucmVzZXQoc2VsZikKCiAgICBkZWYgb3BlblN0cmVhbShzZWxmLCBzb3VyY2UpOgogICAgICAgICIiIlByb2R1Y2VzIGEgZmlsZSBvYmplY3QgZnJvbSBzb3VyY2UuCgogICAgICAgIHNvdXJjZSBjYW4gYmUgZWl0aGVyIGEgZmlsZSBvYmplY3QsIGxvY2FsIGZpbGVuYW1lIG9yIGEgc3RyaW5nLgoKICAgICAgICAiIiIKICAgICAgICAjIEFscmVhZHkgYSBmaWxlIG9iamVjdAogICAgICAgIGlmIGhhc2F0dHIoc291cmNlLCAncmVhZCcpOgogICAgICAgICAgICBzdHJlYW0gPSBzb3VyY2UKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdHJlYW0gPSBCeXRlc0lPKHNvdXJjZSkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdHJlYW0uc2VlayhzdHJlYW0udGVsbCgpKQogICAgICAgIGV4Y2VwdDogICMgcHlsaW50OmRpc2FibGU9YmFyZS1leGNlcHQKICAgICAgICAgICAgc3RyZWFtID0gQnVmZmVyZWRTdHJlYW0oc3RyZWFtKQoKICAgICAgICByZXR1cm4gc3RyZWFtCgogICAgZGVmIGRldGVybWluZUVuY29kaW5nKHNlbGYsIGNoYXJkZXQ9VHJ1ZSk6CiAgICAgICAgIyBCT01zIHRha2UgcHJlY2VkZW5jZSBvdmVyIGV2ZXJ5dGhpbmcKICAgICAgICAjIFRoaXMgd2lsbCBhbHNvIHJlYWQgcGFzdCB0aGUgQk9NIGlmIHByZXNlbnQKICAgICAgICBjaGFyRW5jb2RpbmcgPSBzZWxmLmRldGVjdEJPTSgpLCAiY2VydGFpbiIKICAgICAgICBpZiBjaGFyRW5jb2RpbmdbMF0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBjaGFyRW5jb2RpbmcKCiAgICAgICAgIyBJZiB3ZSd2ZSBiZWVuIG92ZXJyaWRlbiwgd2UndmUgYmVlbiBvdmVycmlkZW4KICAgICAgICBjaGFyRW5jb2RpbmcgPSBsb29rdXBFbmNvZGluZyhzZWxmLm92ZXJyaWRlX2VuY29kaW5nKSwgImNlcnRhaW4iCiAgICAgICAgaWYgY2hhckVuY29kaW5nWzBdIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gY2hhckVuY29kaW5nCgogICAgICAgICMgTm93IGNoZWNrIHRoZSB0cmFuc3BvcnQgbGF5ZXIKICAgICAgICBjaGFyRW5jb2RpbmcgPSBsb29rdXBFbmNvZGluZyhzZWxmLnRyYW5zcG9ydF9lbmNvZGluZyksICJjZXJ0YWluIgogICAgICAgIGlmIGNoYXJFbmNvZGluZ1swXSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGNoYXJFbmNvZGluZwoKICAgICAgICAjIExvb2sgZm9yIG1ldGEgZWxlbWVudHMgd2l0aCBlbmNvZGluZyBpbmZvcm1hdGlvbgogICAgICAgIGNoYXJFbmNvZGluZyA9IHNlbGYuZGV0ZWN0RW5jb2RpbmdNZXRhKCksICJ0ZW50YXRpdmUiCiAgICAgICAgaWYgY2hhckVuY29kaW5nWzBdIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gY2hhckVuY29kaW5nCgogICAgICAgICMgUGFyZW50IGRvY3VtZW50IGVuY29kaW5nCiAgICAgICAgY2hhckVuY29kaW5nID0gbG9va3VwRW5jb2Rpbmcoc2VsZi5zYW1lX29yaWdpbl9wYXJlbnRfZW5jb2RpbmcpLCAidGVudGF0aXZlIgogICAgICAgIGlmIGNoYXJFbmNvZGluZ1swXSBpcyBub3QgTm9uZSBhbmQgbm90IGNoYXJFbmNvZGluZ1swXS5uYW1lLnN0YXJ0c3dpdGgoInV0Zi0xNiIpOgogICAgICAgICAgICByZXR1cm4gY2hhckVuY29kaW5nCgogICAgICAgICMgImxpa2VseSIgZW5jb2RpbmcKICAgICAgICBjaGFyRW5jb2RpbmcgPSBsb29rdXBFbmNvZGluZyhzZWxmLmxpa2VseV9lbmNvZGluZyksICJ0ZW50YXRpdmUiCiAgICAgICAgaWYgY2hhckVuY29kaW5nWzBdIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gY2hhckVuY29kaW5nCgogICAgICAgICMgR3Vlc3Mgd2l0aCBjaGFyZGV0LCBpZiBhdmFpbGFibGUKICAgICAgICBpZiBjaGFyZGV0OgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmcm9tIGNoYXJkZXQudW5pdmVyc2FsZGV0ZWN0b3IgaW1wb3J0IFVuaXZlcnNhbERldGVjdG9yCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJ1ZmZlcnMgPSBbXQogICAgICAgICAgICAgICAgZGV0ZWN0b3IgPSBVbml2ZXJzYWxEZXRlY3RvcigpCiAgICAgICAgICAgICAgICB3aGlsZSBub3QgZGV0ZWN0b3IuZG9uZToKICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBzZWxmLnJhd1N0cmVhbS5yZWFkKHNlbGYubnVtQnl0ZXNDaGFyZGV0KQogICAgICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGJ1ZmZlciwgYnl0ZXMpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGJ1ZmZlcjoKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBidWZmZXJzLmFwcGVuZChidWZmZXIpCiAgICAgICAgICAgICAgICAgICAgZGV0ZWN0b3IuZmVlZChidWZmZXIpCiAgICAgICAgICAgICAgICBkZXRlY3Rvci5jbG9zZSgpCiAgICAgICAgICAgICAgICBlbmNvZGluZyA9IGxvb2t1cEVuY29kaW5nKGRldGVjdG9yLnJlc3VsdFsnZW5jb2RpbmcnXSkKICAgICAgICAgICAgICAgIHNlbGYucmF3U3RyZWFtLnNlZWsoMCkKICAgICAgICAgICAgICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGluZywgInRlbnRhdGl2ZSIKCiAgICAgICAgIyBUcnkgdGhlIGRlZmF1bHQgZW5jb2RpbmcKICAgICAgICBjaGFyRW5jb2RpbmcgPSBsb29rdXBFbmNvZGluZyhzZWxmLmRlZmF1bHRfZW5jb2RpbmcpLCAidGVudGF0aXZlIgogICAgICAgIGlmIGNoYXJFbmNvZGluZ1swXSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGNoYXJFbmNvZGluZwoKICAgICAgICAjIEZhbGxiYWNrIHRvIGh0bWw1bGliJ3MgZGVmYXVsdCBpZiBldmVuIHRoYXQgaGFzbid0IHdvcmtlZAogICAgICAgIHJldHVybiBsb29rdXBFbmNvZGluZygid2luZG93cy0xMjUyIiksICJ0ZW50YXRpdmUiCgogICAgZGVmIGNoYW5nZUVuY29kaW5nKHNlbGYsIG5ld0VuY29kaW5nKToKICAgICAgICBhc3NlcnQgc2VsZi5jaGFyRW5jb2RpbmdbMV0gIT0gImNlcnRhaW4iCiAgICAgICAgbmV3RW5jb2RpbmcgPSBsb29rdXBFbmNvZGluZyhuZXdFbmNvZGluZykKICAgICAgICBpZiBuZXdFbmNvZGluZyBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBuZXdFbmNvZGluZy5uYW1lIGluICgidXRmLTE2YmUiLCAidXRmLTE2bGUiKToKICAgICAgICAgICAgbmV3RW5jb2RpbmcgPSBsb29rdXBFbmNvZGluZygidXRmLTgiKQogICAgICAgICAgICBhc3NlcnQgbmV3RW5jb2RpbmcgaXMgbm90IE5vbmUKICAgICAgICBlbGlmIG5ld0VuY29kaW5nID09IHNlbGYuY2hhckVuY29kaW5nWzBdOgogICAgICAgICAgICBzZWxmLmNoYXJFbmNvZGluZyA9IChzZWxmLmNoYXJFbmNvZGluZ1swXSwgImNlcnRhaW4iKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYucmF3U3RyZWFtLnNlZWsoMCkKICAgICAgICAgICAgc2VsZi5jaGFyRW5jb2RpbmcgPSAobmV3RW5jb2RpbmcsICJjZXJ0YWluIikKICAgICAgICAgICAgc2VsZi5yZXNldCgpCiAgICAgICAgICAgIHJhaXNlIFJlcGFyc2VFeGNlcHRpb24oIkVuY29kaW5nIGNoYW5nZWQgZnJvbSAlcyB0byAlcyIgJSAoc2VsZi5jaGFyRW5jb2RpbmdbMF0sIG5ld0VuY29kaW5nKSkKCiAgICBkZWYgZGV0ZWN0Qk9NKHNlbGYpOgogICAgICAgICIiIkF0dGVtcHRzIHRvIGRldGVjdCBhdCBCT00gYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdHJlYW0uIElmCiAgICAgICAgYW4gZW5jb2RpbmcgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgQk9NIHJldHVybiB0aGUgbmFtZSBvZiB0aGUKICAgICAgICBlbmNvZGluZyBvdGhlcndpc2UgcmV0dXJuIE5vbmUiIiIKICAgICAgICBib21EaWN0ID0gewogICAgICAgICAgICBjb2RlY3MuQk9NX1VURjg6ICd1dGYtOCcsCiAgICAgICAgICAgIGNvZGVjcy5CT01fVVRGMTZfTEU6ICd1dGYtMTZsZScsIGNvZGVjcy5CT01fVVRGMTZfQkU6ICd1dGYtMTZiZScsCiAgICAgICAgICAgIGNvZGVjcy5CT01fVVRGMzJfTEU6ICd1dGYtMzJsZScsIGNvZGVjcy5CT01fVVRGMzJfQkU6ICd1dGYtMzJiZScKICAgICAgICB9CgogICAgICAgICMgR28gdG8gYmVnaW5uaW5nIG9mIGZpbGUgYW5kIHJlYWQgaW4gNCBieXRlcwogICAgICAgIHN0cmluZyA9IHNlbGYucmF3U3RyZWFtLnJlYWQoNCkKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShzdHJpbmcsIGJ5dGVzKQoKICAgICAgICAjIFRyeSBkZXRlY3RpbmcgdGhlIEJPTSB1c2luZyBieXRlcyBmcm9tIHRoZSBzdHJpbmcKICAgICAgICBlbmNvZGluZyA9IGJvbURpY3QuZ2V0KHN0cmluZ1s6M10pICAgICAgICAgIyBVVEYtOAogICAgICAgIHNlZWsgPSAzCiAgICAgICAgaWYgbm90IGVuY29kaW5nOgogICAgICAgICAgICAjIE5lZWQgdG8gZGV0ZWN0IFVURi0zMiBiZWZvcmUgVVRGLTE2CiAgICAgICAgICAgIGVuY29kaW5nID0gYm9tRGljdC5nZXQoc3RyaW5nKSAgICAgICAgICMgVVRGLTMyCiAgICAgICAgICAgIHNlZWsgPSA0CiAgICAgICAgICAgIGlmIG5vdCBlbmNvZGluZzoKICAgICAgICAgICAgICAgIGVuY29kaW5nID0gYm9tRGljdC5nZXQoc3RyaW5nWzoyXSkgICMgVVRGLTE2CiAgICAgICAgICAgICAgICBzZWVrID0gMgoKICAgICAgICAjIFNldCB0aGUgcmVhZCBwb3NpdGlvbiBwYXN0IHRoZSBCT00gaWYgb25lIHdhcyBmb3VuZCwgb3RoZXJ3aXNlCiAgICAgICAgIyBzZXQgaXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdHJlYW0KICAgICAgICBpZiBlbmNvZGluZzoKICAgICAgICAgICAgc2VsZi5yYXdTdHJlYW0uc2VlayhzZWVrKQogICAgICAgICAgICByZXR1cm4gbG9va3VwRW5jb2RpbmcoZW5jb2RpbmcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5yYXdTdHJlYW0uc2VlaygwKQogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBkZXRlY3RFbmNvZGluZ01ldGEoc2VsZik6CiAgICAgICAgIiIiUmVwb3J0IHRoZSBlbmNvZGluZyBkZWNsYXJlZCBieSB0aGUgbWV0YSBlbGVtZW50CiAgICAgICAgIiIiCiAgICAgICAgYnVmZmVyID0gc2VsZi5yYXdTdHJlYW0ucmVhZChzZWxmLm51bUJ5dGVzTWV0YSkKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShidWZmZXIsIGJ5dGVzKQogICAgICAgIHBhcnNlciA9IEVuY29kaW5nUGFyc2VyKGJ1ZmZlcikKICAgICAgICBzZWxmLnJhd1N0cmVhbS5zZWVrKDApCiAgICAgICAgZW5jb2RpbmcgPSBwYXJzZXIuZ2V0RW5jb2RpbmcoKQoKICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZSBhbmQgZW5jb2RpbmcubmFtZSBpbiAoInV0Zi0xNmJlIiwgInV0Zi0xNmxlIik6CiAgICAgICAgICAgIGVuY29kaW5nID0gbG9va3VwRW5jb2RpbmcoInV0Zi04IikKCiAgICAgICAgcmV0dXJuIGVuY29kaW5nCgoKY2xhc3MgRW5jb2RpbmdCeXRlcyhieXRlcyk6CiAgICAiIiJTdHJpbmctbGlrZSBvYmplY3Qgd2l0aCBhbiBhc3NvY2lhdGVkIHBvc2l0aW9uIGFuZCB2YXJpb3VzIGV4dHJhIG1ldGhvZHMKICAgIElmIHRoZSBwb3NpdGlvbiBpcyBldmVyIGdyZWF0ZXIgdGhhbiB0aGUgc3RyaW5nIGxlbmd0aCB0aGVuIGFuIGV4Y2VwdGlvbiBpcwogICAgcmFpc2VkIiIiCiAgICBkZWYgX19uZXdfXyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodmFsdWUsIGJ5dGVzKQogICAgICAgIHJldHVybiBieXRlcy5fX25ld19fKHNlbGYsIHZhbHVlLmxvd2VyKCkpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKICAgICAgICAjIHB5bGludDpkaXNhYmxlPXVudXNlZC1hcmd1bWVudAogICAgICAgIHNlbGYuX3Bvc2l0aW9uID0gLTEKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19uZXh0X18oc2VsZik6CiAgICAgICAgcCA9IHNlbGYuX3Bvc2l0aW9uID0gc2VsZi5fcG9zaXRpb24gKyAxCiAgICAgICAgaWYgcCA+PSBsZW4oc2VsZik6CiAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KICAgICAgICBlbGlmIHAgPCAwOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IKICAgICAgICByZXR1cm4gc2VsZltwOnAgKyAxXQoKICAgIGRlZiBuZXh0KHNlbGYpOgogICAgICAgICMgUHkyIGNvbXBhdAogICAgICAgIHJldHVybiBzZWxmLl9fbmV4dF9fKCkKCiAgICBkZWYgcHJldmlvdXMoc2VsZik6CiAgICAgICAgcCA9IHNlbGYuX3Bvc2l0aW9uCiAgICAgICAgaWYgcCA+PSBsZW4oc2VsZik6CiAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KICAgICAgICBlbGlmIHAgPCAwOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IKICAgICAgICBzZWxmLl9wb3NpdGlvbiA9IHAgPSBwIC0gMQogICAgICAgIHJldHVybiBzZWxmW3A6cCArIDFdCgogICAgZGVmIHNldFBvc2l0aW9uKHNlbGYsIHBvc2l0aW9uKToKICAgICAgICBpZiBzZWxmLl9wb3NpdGlvbiA+PSBsZW4oc2VsZik6CiAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KICAgICAgICBzZWxmLl9wb3NpdGlvbiA9IHBvc2l0aW9uCgogICAgZGVmIGdldFBvc2l0aW9uKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX3Bvc2l0aW9uID49IGxlbihzZWxmKToKICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgogICAgICAgIGlmIHNlbGYuX3Bvc2l0aW9uID49IDA6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wb3NpdGlvbgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgcG9zaXRpb24gPSBwcm9wZXJ0eShnZXRQb3NpdGlvbiwgc2V0UG9zaXRpb24pCgogICAgZGVmIGdldEN1cnJlbnRCeXRlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmW3NlbGYucG9zaXRpb246c2VsZi5wb3NpdGlvbiArIDFdCgogICAgY3VycmVudEJ5dGUgPSBwcm9wZXJ0eShnZXRDdXJyZW50Qnl0ZSkKCiAgICBkZWYgc2tpcChzZWxmLCBjaGFycz1zcGFjZUNoYXJhY3RlcnNCeXRlcyk6CiAgICAgICAgIiIiU2tpcCBwYXN0IGEgbGlzdCBvZiBjaGFyYWN0ZXJzIiIiCiAgICAgICAgcCA9IHNlbGYucG9zaXRpb24gICAgICAgICAgICAgICAjIHVzZSBwcm9wZXJ0eSBmb3IgdGhlIGVycm9yLWNoZWNraW5nCiAgICAgICAgd2hpbGUgcCA8IGxlbihzZWxmKToKICAgICAgICAgICAgYyA9IHNlbGZbcDpwICsgMV0KICAgICAgICAgICAgaWYgYyBub3QgaW4gY2hhcnM6CiAgICAgICAgICAgICAgICBzZWxmLl9wb3NpdGlvbiA9IHAKICAgICAgICAgICAgICAgIHJldHVybiBjCiAgICAgICAgICAgIHAgKz0gMQogICAgICAgIHNlbGYuX3Bvc2l0aW9uID0gcAogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIHNraXBVbnRpbChzZWxmLCBjaGFycyk6CiAgICAgICAgcCA9IHNlbGYucG9zaXRpb24KICAgICAgICB3aGlsZSBwIDwgbGVuKHNlbGYpOgogICAgICAgICAgICBjID0gc2VsZltwOnAgKyAxXQogICAgICAgICAgICBpZiBjIGluIGNoYXJzOgogICAgICAgICAgICAgICAgc2VsZi5fcG9zaXRpb24gPSBwCiAgICAgICAgICAgICAgICByZXR1cm4gYwogICAgICAgICAgICBwICs9IDEKICAgICAgICBzZWxmLl9wb3NpdGlvbiA9IHAKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBtYXRjaEJ5dGVzKHNlbGYsIGJ5dGVzKToKICAgICAgICAiIiJMb29rIGZvciBhIHNlcXVlbmNlIG9mIGJ5dGVzIGF0IHRoZSBzdGFydCBvZiBhIHN0cmluZy4gSWYgdGhlIGJ5dGVzCiAgICAgICAgYXJlIGZvdW5kIHJldHVybiBUcnVlIGFuZCBhZHZhbmNlIHRoZSBwb3NpdGlvbiB0byB0aGUgYnl0ZSBhZnRlciB0aGUKICAgICAgICBtYXRjaC4gT3RoZXJ3aXNlIHJldHVybiBGYWxzZSBhbmQgbGVhdmUgdGhlIHBvc2l0aW9uIGFsb25lIiIiCiAgICAgICAgcCA9IHNlbGYucG9zaXRpb24KICAgICAgICBkYXRhID0gc2VsZltwOnAgKyBsZW4oYnl0ZXMpXQogICAgICAgIHJ2ID0gZGF0YS5zdGFydHN3aXRoKGJ5dGVzKQogICAgICAgIGlmIHJ2OgogICAgICAgICAgICBzZWxmLnBvc2l0aW9uICs9IGxlbihieXRlcykKICAgICAgICByZXR1cm4gcnYKCiAgICBkZWYganVtcFRvKHNlbGYsIGJ5dGVzKToKICAgICAgICAiIiJMb29rIGZvciB0aGUgbmV4dCBzZXF1ZW5jZSBvZiBieXRlcyBtYXRjaGluZyBhIGdpdmVuIHNlcXVlbmNlLiBJZgogICAgICAgIGEgbWF0Y2ggaXMgZm91bmQgYWR2YW5jZSB0aGUgcG9zaXRpb24gdG8gdGhlIGxhc3QgYnl0ZSBvZiB0aGUgbWF0Y2giIiIKICAgICAgICBuZXdQb3NpdGlvbiA9IHNlbGZbc2VsZi5wb3NpdGlvbjpdLmZpbmQoYnl0ZXMpCiAgICAgICAgaWYgbmV3UG9zaXRpb24gPiAtMToKICAgICAgICAgICAgIyBYWFg6IFRoaXMgaXMgdWdseSwgYnV0IEkgY2FuJ3Qgc2VlIGEgbmljZXIgd2F5IHRvIGZpeCB0aGlzLgogICAgICAgICAgICBpZiBzZWxmLl9wb3NpdGlvbiA9PSAtMToKICAgICAgICAgICAgICAgIHNlbGYuX3Bvc2l0aW9uID0gMAogICAgICAgICAgICBzZWxmLl9wb3NpdGlvbiArPSAobmV3UG9zaXRpb24gKyBsZW4oYnl0ZXMpIC0gMSkKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCgoKY2xhc3MgRW5jb2RpbmdQYXJzZXIob2JqZWN0KToKICAgICIiIk1pbmkgcGFyc2VyIGZvciBkZXRlY3RpbmcgY2hhcmFjdGVyIGVuY29kaW5nIGZyb20gbWV0YSBlbGVtZW50cyIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKICAgICAgICAiIiJzdHJpbmcgLSB0aGUgZGF0YSB0byB3b3JrIG9uIGZvciBlbmNvZGluZyBkZXRlY3Rpb24iIiIKICAgICAgICBzZWxmLmRhdGEgPSBFbmNvZGluZ0J5dGVzKGRhdGEpCiAgICAgICAgc2VsZi5lbmNvZGluZyA9IE5vbmUKCiAgICBkZWYgZ2V0RW5jb2Rpbmcoc2VsZik6CiAgICAgICAgbWV0aG9kRGlzcGF0Y2ggPSAoCiAgICAgICAgICAgIChiIjwhLS0iLCBzZWxmLmhhbmRsZUNvbW1lbnQpLAogICAgICAgICAgICAoYiI8bWV0YSIsIHNlbGYuaGFuZGxlTWV0YSksCiAgICAgICAgICAgIChiIjwvIiwgc2VsZi5oYW5kbGVQb3NzaWJsZUVuZFRhZyksCiAgICAgICAgICAgIChiIjwhIiwgc2VsZi5oYW5kbGVPdGhlciksCiAgICAgICAgICAgIChiIjw/Iiwgc2VsZi5oYW5kbGVPdGhlciksCiAgICAgICAgICAgIChiIjwiLCBzZWxmLmhhbmRsZVBvc3NpYmxlU3RhcnRUYWcpKQogICAgICAgIGZvciBfIGluIHNlbGYuZGF0YToKICAgICAgICAgICAga2VlcFBhcnNpbmcgPSBUcnVlCiAgICAgICAgICAgIGZvciBrZXksIG1ldGhvZCBpbiBtZXRob2REaXNwYXRjaDoKICAgICAgICAgICAgICAgIGlmIHNlbGYuZGF0YS5tYXRjaEJ5dGVzKGtleSk6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBrZWVwUGFyc2luZyA9IG1ldGhvZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CiAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBQYXJzaW5nID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgbm90IGtlZXBQYXJzaW5nOgogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgcmV0dXJuIHNlbGYuZW5jb2RpbmcKCiAgICBkZWYgaGFuZGxlQ29tbWVudChzZWxmKToKICAgICAgICAiIiJTa2lwIG92ZXIgY29tbWVudHMiIiIKICAgICAgICByZXR1cm4gc2VsZi5kYXRhLmp1bXBUbyhiIi0tPiIpCgogICAgZGVmIGhhbmRsZU1ldGEoc2VsZik6CiAgICAgICAgaWYgc2VsZi5kYXRhLmN1cnJlbnRCeXRlIG5vdCBpbiBzcGFjZUNoYXJhY3RlcnNCeXRlczoKICAgICAgICAgICAgIyBpZiB3ZSBoYXZlIDxtZXRhIG5vdCBmb2xsb3dlZCBieSBhIHNwYWNlIHNvIGp1c3Qga2VlcCBnb2luZwogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICMgV2UgaGF2ZSBhIHZhbGlkIG1ldGEgZWxlbWVudCB3ZSB3YW50IHRvIHNlYXJjaCBmb3IgYXR0cmlidXRlcwogICAgICAgIGhhc1ByYWdtYSA9IEZhbHNlCiAgICAgICAgcGVuZGluZ0VuY29kaW5nID0gTm9uZQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICMgVHJ5IHRvIGZpbmQgdGhlIG5leHQgYXR0cmlidXRlIGFmdGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uCiAgICAgICAgICAgIGF0dHIgPSBzZWxmLmdldEF0dHJpYnV0ZSgpCiAgICAgICAgICAgIGlmIGF0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBhdHRyWzBdID09IGIiaHR0cC1lcXVpdiI6CiAgICAgICAgICAgICAgICAgICAgaGFzUHJhZ21hID0gYXR0clsxXSA9PSBiImNvbnRlbnQtdHlwZSIKICAgICAgICAgICAgICAgICAgICBpZiBoYXNQcmFnbWEgYW5kIHBlbmRpbmdFbmNvZGluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZyA9IHBlbmRpbmdFbmNvZGluZwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgICAgIGVsaWYgYXR0clswXSA9PSBiImNoYXJzZXQiOgogICAgICAgICAgICAgICAgICAgIHRlbnRhdGl2ZUVuY29kaW5nID0gYXR0clsxXQogICAgICAgICAgICAgICAgICAgIGNvZGVjID0gbG9va3VwRW5jb2RpbmcodGVudGF0aXZlRW5jb2RpbmcpCiAgICAgICAgICAgICAgICAgICAgaWYgY29kZWMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBjb2RlYwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgICAgIGVsaWYgYXR0clswXSA9PSBiImNvbnRlbnQiOgogICAgICAgICAgICAgICAgICAgIGNvbnRlbnRQYXJzZXIgPSBDb250ZW50QXR0clBhcnNlcihFbmNvZGluZ0J5dGVzKGF0dHJbMV0pKQogICAgICAgICAgICAgICAgICAgIHRlbnRhdGl2ZUVuY29kaW5nID0gY29udGVudFBhcnNlci5wYXJzZSgpCiAgICAgICAgICAgICAgICAgICAgaWYgdGVudGF0aXZlRW5jb2RpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjID0gbG9va3VwRW5jb2RpbmcodGVudGF0aXZlRW5jb2RpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvZGVjIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzUHJhZ21hOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBjb2RlYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nRW5jb2RpbmcgPSBjb2RlYwoKICAgIGRlZiBoYW5kbGVQb3NzaWJsZVN0YXJ0VGFnKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmhhbmRsZVBvc3NpYmxlVGFnKEZhbHNlKQoKICAgIGRlZiBoYW5kbGVQb3NzaWJsZUVuZFRhZyhzZWxmKToKICAgICAgICBuZXh0KHNlbGYuZGF0YSkKICAgICAgICByZXR1cm4gc2VsZi5oYW5kbGVQb3NzaWJsZVRhZyhUcnVlKQoKICAgIGRlZiBoYW5kbGVQb3NzaWJsZVRhZyhzZWxmLCBlbmRUYWcpOgogICAgICAgIGRhdGEgPSBzZWxmLmRhdGEKICAgICAgICBpZiBkYXRhLmN1cnJlbnRCeXRlIG5vdCBpbiBhc2NpaUxldHRlcnNCeXRlczoKICAgICAgICAgICAgIyBJZiB0aGUgbmV4dCBieXRlIGlzIG5vdCBhbiBhc2NpaSBsZXR0ZXIgZWl0aGVyIGlnbm9yZSB0aGlzCiAgICAgICAgICAgICMgZnJhZ21lbnQgKHBvc3NpYmxlIHN0YXJ0IHRhZyBjYXNlKSBvciB0cmVhdCBpdCBhY2NvcmRpbmcgdG8KICAgICAgICAgICAgIyBoYW5kbGVPdGhlcgogICAgICAgICAgICBpZiBlbmRUYWc6CiAgICAgICAgICAgICAgICBkYXRhLnByZXZpb3VzKCkKICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlT3RoZXIoKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBjID0gZGF0YS5za2lwVW50aWwoc3BhY2VzQW5nbGVCcmFja2V0cykKICAgICAgICBpZiBjID09IGIiPCI6CiAgICAgICAgICAgICMgcmV0dXJuIHRvIHRoZSBmaXJzdCBzdGVwIGluIHRoZSBvdmVyYWxsICJ0d28gc3RlcCIgYWxnb3JpdGhtCiAgICAgICAgICAgICMgcmVwcm9jZXNzaW5nIHRoZSA8IGJ5dGUKICAgICAgICAgICAgZGF0YS5wcmV2aW91cygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBSZWFkIGFsbCBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGF0dHIgPSBzZWxmLmdldEF0dHJpYnV0ZSgpCiAgICAgICAgICAgIHdoaWxlIGF0dHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBhdHRyID0gc2VsZi5nZXRBdHRyaWJ1dGUoKQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGhhbmRsZU90aGVyKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmRhdGEuanVtcFRvKGIiPiIpCgogICAgZGVmIGdldEF0dHJpYnV0ZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBuYW1lLHZhbHVlIHBhaXIgZm9yIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtLAogICAgICAgIGlmIG9uZSBpcyBmb3VuZCwgb3IgTm9uZSIiIgogICAgICAgIGRhdGEgPSBzZWxmLmRhdGEKICAgICAgICAjIFN0ZXAgMSAoc2tpcCBjaGFycykKICAgICAgICBjID0gZGF0YS5za2lwKHNwYWNlQ2hhcmFjdGVyc0J5dGVzIHwgZnJvemVuc2V0KFtiIi8iXSkpCiAgICAgICAgYXNzZXJ0IGMgaXMgTm9uZSBvciBsZW4oYykgPT0gMQogICAgICAgICMgU3RlcCAyCiAgICAgICAgaWYgYyBpbiAoYiI+IiwgTm9uZSk6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgIyBTdGVwIDMKICAgICAgICBhdHRyTmFtZSA9IFtdCiAgICAgICAgYXR0clZhbHVlID0gW10KICAgICAgICAjIFN0ZXAgNCBhdHRyaWJ1dGUgbmFtZQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGlmIGMgPT0gYiI9IiBhbmQgYXR0ck5hbWU6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGMgaW4gc3BhY2VDaGFyYWN0ZXJzQnl0ZXM6CiAgICAgICAgICAgICAgICAjIFN0ZXAgNiEKICAgICAgICAgICAgICAgIGMgPSBkYXRhLnNraXAoKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBjIGluIChiIi8iLCBiIj4iKToKICAgICAgICAgICAgICAgIHJldHVybiBiIiIuam9pbihhdHRyTmFtZSksIGIiIgogICAgICAgICAgICBlbGlmIGMgaW4gYXNjaWlVcHBlcmNhc2VCeXRlczoKICAgICAgICAgICAgICAgIGF0dHJOYW1lLmFwcGVuZChjLmxvd2VyKCkpCiAgICAgICAgICAgIGVsaWYgYyBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGF0dHJOYW1lLmFwcGVuZChjKQogICAgICAgICAgICAjIFN0ZXAgNQogICAgICAgICAgICBjID0gbmV4dChkYXRhKQogICAgICAgICMgU3RlcCA3CiAgICAgICAgaWYgYyAhPSBiIj0iOgogICAgICAgICAgICBkYXRhLnByZXZpb3VzKCkKICAgICAgICAgICAgcmV0dXJuIGIiIi5qb2luKGF0dHJOYW1lKSwgYiIiCiAgICAgICAgIyBTdGVwIDgKICAgICAgICBuZXh0KGRhdGEpCiAgICAgICAgIyBTdGVwIDkKICAgICAgICBjID0gZGF0YS5za2lwKCkKICAgICAgICAjIFN0ZXAgMTAKICAgICAgICBpZiBjIGluIChiIiciLCBiJyInKToKICAgICAgICAgICAgIyAxMC4xCiAgICAgICAgICAgIHF1b3RlQ2hhciA9IGMKICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICMgMTAuMgogICAgICAgICAgICAgICAgYyA9IG5leHQoZGF0YSkKICAgICAgICAgICAgICAgICMgMTAuMwogICAgICAgICAgICAgICAgaWYgYyA9PSBxdW90ZUNoYXI6CiAgICAgICAgICAgICAgICAgICAgbmV4dChkYXRhKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBiIiIuam9pbihhdHRyTmFtZSksIGIiIi5qb2luKGF0dHJWYWx1ZSkKICAgICAgICAgICAgICAgICMgMTAuNAogICAgICAgICAgICAgICAgZWxpZiBjIGluIGFzY2lpVXBwZXJjYXNlQnl0ZXM6CiAgICAgICAgICAgICAgICAgICAgYXR0clZhbHVlLmFwcGVuZChjLmxvd2VyKCkpCiAgICAgICAgICAgICAgICAjIDEwLjUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgYXR0clZhbHVlLmFwcGVuZChjKQogICAgICAgIGVsaWYgYyA9PSBiIj4iOgogICAgICAgICAgICByZXR1cm4gYiIiLmpvaW4oYXR0ck5hbWUpLCBiIiIKICAgICAgICBlbGlmIGMgaW4gYXNjaWlVcHBlcmNhc2VCeXRlczoKICAgICAgICAgICAgYXR0clZhbHVlLmFwcGVuZChjLmxvd2VyKCkpCiAgICAgICAgZWxpZiBjIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXR0clZhbHVlLmFwcGVuZChjKQogICAgICAgICMgU3RlcCAxMQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGMgPSBuZXh0KGRhdGEpCiAgICAgICAgICAgIGlmIGMgaW4gc3BhY2VzQW5nbGVCcmFja2V0czoKICAgICAgICAgICAgICAgIHJldHVybiBiIiIuam9pbihhdHRyTmFtZSksIGIiIi5qb2luKGF0dHJWYWx1ZSkKICAgICAgICAgICAgZWxpZiBjIGluIGFzY2lpVXBwZXJjYXNlQnl0ZXM6CiAgICAgICAgICAgICAgICBhdHRyVmFsdWUuYXBwZW5kKGMubG93ZXIoKSkKICAgICAgICAgICAgZWxpZiBjIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXR0clZhbHVlLmFwcGVuZChjKQoKCmNsYXNzIENvbnRlbnRBdHRyUGFyc2VyKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZGF0YSwgYnl0ZXMpCiAgICAgICAgc2VsZi5kYXRhID0gZGF0YQoKICAgIGRlZiBwYXJzZShzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgQ2hlY2sgaWYgdGhlIGF0dHIgbmFtZSBpcyBjaGFyc2V0CiAgICAgICAgICAgICMgb3RoZXJ3aXNlIHJldHVybgogICAgICAgICAgICBzZWxmLmRhdGEuanVtcFRvKGIiY2hhcnNldCIpCiAgICAgICAgICAgIHNlbGYuZGF0YS5wb3NpdGlvbiArPSAxCiAgICAgICAgICAgIHNlbGYuZGF0YS5za2lwKCkKICAgICAgICAgICAgaWYgbm90IHNlbGYuZGF0YS5jdXJyZW50Qnl0ZSA9PSBiIj0iOgogICAgICAgICAgICAgICAgIyBJZiB0aGVyZSBpcyBubyA9IHNpZ24ga2VlcCBsb29raW5nIGZvciBhdHRycwogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgc2VsZi5kYXRhLnBvc2l0aW9uICs9IDEKICAgICAgICAgICAgc2VsZi5kYXRhLnNraXAoKQogICAgICAgICAgICAjIExvb2sgZm9yIGFuIGVuY29kaW5nIGJldHdlZW4gbWF0Y2hpbmcgcXVvdGUgbWFya3MKICAgICAgICAgICAgaWYgc2VsZi5kYXRhLmN1cnJlbnRCeXRlIGluIChiJyInLCBiIiciKToKICAgICAgICAgICAgICAgIHF1b3RlTWFyayA9IHNlbGYuZGF0YS5jdXJyZW50Qnl0ZQogICAgICAgICAgICAgICAgc2VsZi5kYXRhLnBvc2l0aW9uICs9IDEKICAgICAgICAgICAgICAgIG9sZFBvc2l0aW9uID0gc2VsZi5kYXRhLnBvc2l0aW9uCiAgICAgICAgICAgICAgICBpZiBzZWxmLmRhdGEuanVtcFRvKHF1b3RlTWFyayk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtvbGRQb3NpdGlvbjpzZWxmLmRhdGEucG9zaXRpb25dCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIFVucXVvdGVkIHZhbHVlCiAgICAgICAgICAgICAgICBvbGRQb3NpdGlvbiA9IHNlbGYuZGF0YS5wb3NpdGlvbgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5za2lwVW50aWwoc3BhY2VDaGFyYWN0ZXJzQnl0ZXMpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtvbGRQb3NpdGlvbjpzZWxmLmRhdGEucG9zaXRpb25dCiAgICAgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKICAgICAgICAgICAgICAgICAgICAjIFJldHVybiB0aGUgd2hvbGUgcmVtYWluaW5nIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtvbGRQb3NpdGlvbjpdCiAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CiAgICAgICAgICAgIHJldHVybiBOb25lCgoKZGVmIGxvb2t1cEVuY29kaW5nKGVuY29kaW5nKToKICAgICIiIlJldHVybiB0aGUgcHl0aG9uIGNvZGVjIG5hbWUgY29ycmVzcG9uZGluZyB0byBhbiBlbmNvZGluZyBvciBOb25lIGlmIHRoZQogICAgc3RyaW5nIGRvZXNuJ3QgY29ycmVzcG9uZCB0byBhIHZhbGlkIGVuY29kaW5nLiIiIgogICAgaWYgaXNpbnN0YW5jZShlbmNvZGluZywgYmluYXJ5X3R5cGUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZy5kZWNvZGUoImFzY2lpIikKICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHdlYmVuY29kaW5ncy5sb29rdXAoZW5jb2RpbmcpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgZWxzZToKICAgICAgICByZXR1cm4gTm9uZQpQSwMEFAAAAAAAAAAhAMRGahYkKwEAJCsBADIAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX3Rva2VuaXplci5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHVuaWNociBhcyBjaHIKCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCgpmcm9tIC5jb25zdGFudHMgaW1wb3J0IHNwYWNlQ2hhcmFjdGVycwpmcm9tIC5jb25zdGFudHMgaW1wb3J0IGVudGl0aWVzCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgYXNjaWlMZXR0ZXJzLCBhc2NpaVVwcGVyMkxvd2VyCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgZGlnaXRzLCBoZXhEaWdpdHMsIEVPRgpmcm9tIC5jb25zdGFudHMgaW1wb3J0IHRva2VuVHlwZXMsIHRhZ1Rva2VuVHlwZXMKZnJvbSAuY29uc3RhbnRzIGltcG9ydCByZXBsYWNlbWVudENoYXJhY3RlcnMKCmZyb20gLl9pbnB1dHN0cmVhbSBpbXBvcnQgSFRNTElucHV0U3RyZWFtCgpmcm9tIC5fdHJpZSBpbXBvcnQgVHJpZQoKZW50aXRpZXNUcmllID0gVHJpZShlbnRpdGllcykKCgpjbGFzcyBIVE1MVG9rZW5pemVyKG9iamVjdCk6CiAgICAiIiIgVGhpcyBjbGFzcyB0YWtlcyBjYXJlIG9mIHRva2VuaXppbmcgSFRNTC4KCiAgICAqIHNlbGYuY3VycmVudFRva2VuCiAgICAgIEhvbGRzIHRoZSB0b2tlbiB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuCgogICAgKiBzZWxmLnN0YXRlCiAgICAgIEhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBtZXRob2QgdG8gYmUgaW52b2tlZC4uLiBYWFgKCiAgICAqIHNlbGYuc3RyZWFtCiAgICAgIFBvaW50cyB0byBIVE1MSW5wdXRTdHJlYW0gb2JqZWN0LgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgcGFyc2VyPU5vbmUsICoqa3dhcmdzKToKCiAgICAgICAgc2VsZi5zdHJlYW0gPSBIVE1MSW5wdXRTdHJlYW0oc3RyZWFtLCAqKmt3YXJncykKICAgICAgICBzZWxmLnBhcnNlciA9IHBhcnNlcgoKICAgICAgICAjIFNldHVwIHRoZSBpbml0aWFsIHRva2VuaXplciBzdGF0ZQogICAgICAgIHNlbGYuZXNjYXBlRmxhZyA9IEZhbHNlCiAgICAgICAgc2VsZi5sYXN0Rm91ckNoYXJzID0gW10KICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBzZWxmLmVzY2FwZSA9IEZhbHNlCgogICAgICAgICMgVGhlIGN1cnJlbnQgdG9rZW4gYmVpbmcgY3JlYXRlZAogICAgICAgIHNlbGYuY3VycmVudFRva2VuID0gTm9uZQogICAgICAgIHN1cGVyKEhUTUxUb2tlbml6ZXIsIHNlbGYpLl9faW5pdF9fKCkKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiIFRoaXMgaXMgd2hlcmUgdGhlIG1hZ2ljIGhhcHBlbnMuCgogICAgICAgIFdlIGRvIG91ciB1c3VhbGx5IHByb2Nlc3NpbmcgdGhyb3VnaCB0aGUgc3RhdGVzIGFuZCB3aGVuIHdlIGhhdmUgYSB0b2tlbgogICAgICAgIHRvIHJldHVybiB3ZSB5aWVsZCB0aGUgdG9rZW4gd2hpY2ggcGF1c2VzIHByb2Nlc3NpbmcgdW50aWwgdGhlIG5leHQgdG9rZW4KICAgICAgICBpcyByZXF1ZXN0ZWQuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi50b2tlblF1ZXVlID0gZGVxdWUoW10pCiAgICAgICAgIyBTdGFydCBwcm9jZXNzaW5nLiBXaGVuIEVPRiBpcyByZWFjaGVkIHNlbGYuc3RhdGUgd2lsbCByZXR1cm4gRmFsc2UKICAgICAgICAjIGluc3RlYWQgb2YgVHJ1ZSBhbmQgdGhlIGxvb3Agd2lsbCB0ZXJtaW5hdGUuCiAgICAgICAgd2hpbGUgc2VsZi5zdGF0ZSgpOgogICAgICAgICAgICB3aGlsZSBzZWxmLnN0cmVhbS5lcnJvcnM6CiAgICAgICAgICAgICAgICB5aWVsZCB7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjogc2VsZi5zdHJlYW0uZXJyb3JzLnBvcCgwKX0KICAgICAgICAgICAgd2hpbGUgc2VsZi50b2tlblF1ZXVlOgogICAgICAgICAgICAgICAgeWllbGQgc2VsZi50b2tlblF1ZXVlLnBvcGxlZnQoKQoKICAgIGRlZiBjb25zdW1lTnVtYmVyRW50aXR5KHNlbGYsIGlzSGV4KToKICAgICAgICAiIiJUaGlzIGZ1bmN0aW9uIHJldHVybnMgZWl0aGVyIFUrRkZGRCBvciB0aGUgY2hhcmFjdGVyIGJhc2VkIG9uIHRoZQogICAgICAgIGRlY2ltYWwgb3IgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24uIEl0IGFsc28gZGlzY2FyZHMgIjsiIGlmIHByZXNlbnQuCiAgICAgICAgSWYgbm90IHByZXNlbnQgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl19KSBpcyBpbnZva2VkLgogICAgICAgICIiIgoKICAgICAgICBhbGxvd2VkID0gZGlnaXRzCiAgICAgICAgcmFkaXggPSAxMAogICAgICAgIGlmIGlzSGV4OgogICAgICAgICAgICBhbGxvd2VkID0gaGV4RGlnaXRzCiAgICAgICAgICAgIHJhZGl4ID0gMTYKCiAgICAgICAgY2hhclN0YWNrID0gW10KCiAgICAgICAgIyBDb25zdW1lIGFsbCB0aGUgY2hhcmFjdGVycyB0aGF0IGFyZSBpbiByYW5nZSB3aGlsZSBtYWtpbmcgc3VyZSB3ZQogICAgICAgICMgZG9uJ3QgaGl0IGFuIEVPRi4KICAgICAgICBjID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgd2hpbGUgYyBpbiBhbGxvd2VkIGFuZCBjIGlzIG5vdCBFT0Y6CiAgICAgICAgICAgIGNoYXJTdGFjay5hcHBlbmQoYykKICAgICAgICAgICAgYyA9IHNlbGYuc3RyZWFtLmNoYXIoKQoKICAgICAgICAjIENvbnZlcnQgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIGNvbnN1bWVkIHRvIGFuIGludC4KICAgICAgICBjaGFyQXNJbnQgPSBpbnQoIiIuam9pbihjaGFyU3RhY2spLCByYWRpeCkKCiAgICAgICAgIyBDZXJ0YWluIGNoYXJhY3RlcnMgZ2V0IHJlcGxhY2VkIHdpdGggb3RoZXJzCiAgICAgICAgaWYgY2hhckFzSW50IGluIHJlcGxhY2VtZW50Q2hhcmFjdGVyczoKICAgICAgICAgICAgY2hhciA9IHJlcGxhY2VtZW50Q2hhcmFjdGVyc1tjaGFyQXNJbnRdCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsLWNvZGVwb2ludC1mb3ItbnVtZXJpYy1lbnRpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YXZhcnMiOiB7ImNoYXJBc0ludCI6IGNoYXJBc0ludH19KQogICAgICAgIGVsaWYgKCgweEQ4MDAgPD0gY2hhckFzSW50IDw9IDB4REZGRikgb3IKICAgICAgICAgICAgICAoY2hhckFzSW50ID4gMHgxMEZGRkYpKToKICAgICAgICAgICAgY2hhciA9ICJcdUZGRkQiCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsLWNvZGVwb2ludC1mb3ItbnVtZXJpYy1lbnRpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YXZhcnMiOiB7ImNoYXJBc0ludCI6IGNoYXJBc0ludH19KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgU2hvdWxkIHNwZWVkIHVwIHRoaXMgY2hlY2sgc29tZWhvdyAoZS5nLiBtb3ZlIHRoZSBzZXQgdG8gYSBjb25zdGFudCkKICAgICAgICAgICAgaWYgKCgweDAwMDEgPD0gY2hhckFzSW50IDw9IDB4MDAwOCkgb3IKICAgICAgICAgICAgICAgICgweDAwMEUgPD0gY2hhckFzSW50IDw9IDB4MDAxRikgb3IKICAgICAgICAgICAgICAgICgweDAwN0YgPD0gY2hhckFzSW50IDw9IDB4MDA5Rikgb3IKICAgICAgICAgICAgICAgICgweEZERDAgPD0gY2hhckFzSW50IDw9IDB4RkRFRikgb3IKICAgICAgICAgICAgICAgIGNoYXJBc0ludCBpbiBmcm96ZW5zZXQoWzB4MDAwQiwgMHhGRkZFLCAweEZGRkYsIDB4MUZGRkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFGRkZGLCAweDJGRkZFLCAweDJGRkZGLCAweDNGRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzRkZGRiwgMHg0RkZGRSwgMHg0RkZGRiwgMHg1RkZGRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NUZGRkYsIDB4NkZGRkUsIDB4NkZGRkYsIDB4N0ZGRkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGRkZGLCAweDhGRkZFLCAweDhGRkZGLCAweDlGRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5RkZGRiwgMHhBRkZGRSwgMHhBRkZGRiwgMHhCRkZGRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkZGRkYsIDB4Q0ZGRkUsIDB4Q0ZGRkYsIDB4REZGRkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERGRkZGLCAweEVGRkZFLCAweEVGRkZGLCAweEZGRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRiwgMHgxMEZGRkUsIDB4MTBGRkZGXSkpOgogICAgICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbC1jb2RlcG9pbnQtZm9yLW51bWVyaWMtZW50aXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhdmFycyI6IHsiY2hhckFzSW50IjogY2hhckFzSW50fX0pCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICMgVHJ5L2V4Y2VwdCBuZWVkZWQgYXMgVUNTLTIgUHl0aG9uIGJ1aWxkcycgdW5pY2hhciBvbmx5IHdvcmtzCiAgICAgICAgICAgICAgICAjIHdpdGhpbiB0aGUgQk1QLgogICAgICAgICAgICAgICAgY2hhciA9IGNocihjaGFyQXNJbnQpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgdiA9IGNoYXJBc0ludCAtIDB4MTAwMDAKICAgICAgICAgICAgICAgIGNoYXIgPSBjaHIoMHhEODAwIHwgKHYgPj4gMTApKSArIGNocigweERDMDAgfCAodiAmIDB4M0ZGKSkKCiAgICAgICAgIyBEaXNjYXJkIHRoZSA7IGlmIHByZXNlbnQuIE90aGVyd2lzZSwgcHV0IGl0IGJhY2sgb24gdGhlIHF1ZXVlIGFuZAogICAgICAgICMgaW52b2tlIHBhcnNlRXJyb3Igb24gcGFyc2VyLgogICAgICAgIGlmIGMgIT0gIjsiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYy1lbnRpdHktd2l0aG91dC1zZW1pY29sb24ifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoYykKCiAgICAgICAgcmV0dXJuIGNoYXIKCiAgICBkZWYgY29uc3VtZUVudGl0eShzZWxmLCBhbGxvd2VkQ2hhcj1Ob25lLCBmcm9tQXR0cmlidXRlPUZhbHNlKToKICAgICAgICAjIEluaXRpYWxpc2UgdG8gdGhlIGRlZmF1bHQgb3V0cHV0IGZvciB3aGVuIG5vIGVudGl0eSBpcyBtYXRjaGVkCiAgICAgICAgb3V0cHV0ID0gIiYiCgogICAgICAgIGNoYXJTdGFjayA9IFtzZWxmLnN0cmVhbS5jaGFyKCldCiAgICAgICAgaWYgKGNoYXJTdGFja1swXSBpbiBzcGFjZUNoYXJhY3RlcnMgb3IgY2hhclN0YWNrWzBdIGluIChFT0YsICI8IiwgIiYiKSBvcgogICAgICAgICAgICAgICAgKGFsbG93ZWRDaGFyIGlzIG5vdCBOb25lIGFuZCBhbGxvd2VkQ2hhciA9PSBjaGFyU3RhY2tbMF0pKToKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoY2hhclN0YWNrWzBdKQoKICAgICAgICBlbGlmIGNoYXJTdGFja1swXSA9PSAiIyI6CiAgICAgICAgICAgICMgUmVhZCB0aGUgbmV4dCBjaGFyYWN0ZXIgdG8gc2VlIGlmIGl0J3MgaGV4IG9yIGRlY2ltYWwKICAgICAgICAgICAgaGV4ID0gRmFsc2UKICAgICAgICAgICAgY2hhclN0YWNrLmFwcGVuZChzZWxmLnN0cmVhbS5jaGFyKCkpCiAgICAgICAgICAgIGlmIGNoYXJTdGFja1stMV0gaW4gKCJ4IiwgIlgiKToKICAgICAgICAgICAgICAgIGhleCA9IFRydWUKICAgICAgICAgICAgICAgIGNoYXJTdGFjay5hcHBlbmQoc2VsZi5zdHJlYW0uY2hhcigpKQoKICAgICAgICAgICAgIyBjaGFyU3RhY2tbLTFdIHNob3VsZCBiZSB0aGUgZmlyc3QgZGlnaXQKICAgICAgICAgICAgaWYgKGhleCBhbmQgY2hhclN0YWNrWy0xXSBpbiBoZXhEaWdpdHMpIFwKICAgICAgICAgICAgICAgICAgICBvciAobm90IGhleCBhbmQgY2hhclN0YWNrWy0xXSBpbiBkaWdpdHMpOgogICAgICAgICAgICAgICAgIyBBdCBsZWFzdCBvbmUgZGlnaXQgZm91bmQsIHNvIGNvbnN1bWUgdGhlIHdob2xlIG51bWJlcgogICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoY2hhclN0YWNrWy0xXSkKICAgICAgICAgICAgICAgIG91dHB1dCA9IHNlbGYuY29uc3VtZU51bWJlckVudGl0eShoZXgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIE5vIGRpZ2l0cyBmb3VuZAogICAgICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJleHBlY3RlZC1udW1lcmljLWVudGl0eSJ9KQogICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoY2hhclN0YWNrLnBvcCgpKQogICAgICAgICAgICAgICAgb3V0cHV0ID0gIiYiICsgIiIuam9pbihjaGFyU3RhY2spCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgQXQgdGhpcyBwb2ludCBpbiB0aGUgcHJvY2VzcyBtaWdodCBoYXZlIG5hbWVkIGVudGl0eS4gRW50aXRpZXMKICAgICAgICAgICAgIyBhcmUgc3RvcmVkIGluIHRoZSBnbG9iYWwgdmFyaWFibGUgImVudGl0aWVzIi4KICAgICAgICAgICAgIwogICAgICAgICAgICAjIENvbnN1bWUgY2hhcmFjdGVycyBhbmQgY29tcGFyZSB0byB0aGVzZSB0byBhIHN1YnN0cmluZyBvZiB0aGUKICAgICAgICAgICAgIyBlbnRpdHkgbmFtZXMgaW4gdGhlIGxpc3QgdW50aWwgdGhlIHN1YnN0cmluZyBubyBsb25nZXIgbWF0Y2hlcy4KICAgICAgICAgICAgd2hpbGUgKGNoYXJTdGFja1stMV0gaXMgbm90IEVPRik6CiAgICAgICAgICAgICAgICBpZiBub3QgZW50aXRpZXNUcmllLmhhc19rZXlzX3dpdGhfcHJlZml4KCIiLmpvaW4oY2hhclN0YWNrKSk6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGNoYXJTdGFjay5hcHBlbmQoc2VsZi5zdHJlYW0uY2hhcigpKQoKICAgICAgICAgICAgIyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYSBzdHJpbmcgdGhhdCBzdGFydHMgd2l0aCBzb21lIGNoYXJhY3RlcnMKICAgICAgICAgICAgIyB0aGF0IG1heSBtYXRjaCBhbiBlbnRpdHkKICAgICAgICAgICAgIyBUcnkgdG8gZmluZCB0aGUgbG9uZ2VzdCBlbnRpdHkgdGhlIHN0cmluZyB3aWxsIG1hdGNoIHRvIHRha2UgY2FyZQogICAgICAgICAgICAjIG9mICZub3RpIGZvciBpbnN0YW5jZS4KICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZW50aXR5TmFtZSA9IGVudGl0aWVzVHJpZS5sb25nZXN0X3ByZWZpeCgiIi5qb2luKGNoYXJTdGFja1s6LTFdKSkKICAgICAgICAgICAgICAgIGVudGl0eUxlbmd0aCA9IGxlbihlbnRpdHlOYW1lKQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICBlbnRpdHlOYW1lID0gTm9uZQoKICAgICAgICAgICAgaWYgZW50aXR5TmFtZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGlmIGVudGl0eU5hbWVbLTFdICE9ICI7IjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lZC1lbnRpdHktd2l0aG91dC1zZW1pY29sb24ifSkKICAgICAgICAgICAgICAgIGlmIChlbnRpdHlOYW1lWy0xXSAhPSAiOyIgYW5kIGZyb21BdHRyaWJ1dGUgYW5kCiAgICAgICAgICAgICAgICAgICAgKGNoYXJTdGFja1tlbnRpdHlMZW5ndGhdIGluIGFzY2lpTGV0dGVycyBvcgogICAgICAgICAgICAgICAgICAgICBjaGFyU3RhY2tbZW50aXR5TGVuZ3RoXSBpbiBkaWdpdHMgb3IKICAgICAgICAgICAgICAgICAgICAgY2hhclN0YWNrW2VudGl0eUxlbmd0aF0gPT0gIj0iKSk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoY2hhclN0YWNrLnBvcCgpKQogICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICImIiArICIiLmpvaW4oY2hhclN0YWNrKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBlbnRpdGllc1tlbnRpdHlOYW1lXQogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGNoYXJTdGFjay5wb3AoKSkKICAgICAgICAgICAgICAgICAgICBvdXRwdXQgKz0gIiIuam9pbihjaGFyU3RhY2tbZW50aXR5TGVuZ3RoOl0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLW5hbWVkLWVudGl0eSJ9KQogICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoY2hhclN0YWNrLnBvcCgpKQogICAgICAgICAgICAgICAgb3V0cHV0ID0gIiYiICsgIiIuam9pbihjaGFyU3RhY2spCgogICAgICAgIGlmIGZyb21BdHRyaWJ1dGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzFdICs9IG91dHB1dAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG91dHB1dCBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgICAgICB0b2tlblR5cGUgPSAiU3BhY2VDaGFyYWN0ZXJzIgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdG9rZW5UeXBlID0gIkNoYXJhY3RlcnMiCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1t0b2tlblR5cGVdLCAiZGF0YSI6IG91dHB1dH0pCgogICAgZGVmIHByb2Nlc3NFbnRpdHlJbkF0dHJpYnV0ZShzZWxmLCBhbGxvd2VkQ2hhcik6CiAgICAgICAgIiIiVGhpcyBtZXRob2QgcmVwbGFjZXMgdGhlIG5lZWQgZm9yICJlbnRpdHlJbkF0dHJpYnV0ZVZhbHVlU3RhdGUiLgogICAgICAgICIiIgogICAgICAgIHNlbGYuY29uc3VtZUVudGl0eShhbGxvd2VkQ2hhcj1hbGxvd2VkQ2hhciwgZnJvbUF0dHJpYnV0ZT1UcnVlKQoKICAgIGRlZiBlbWl0Q3VycmVudFRva2VuKHNlbGYpOgogICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGEgZ2VuZXJpYyBoYW5kbGVyIGZvciBlbWl0dGluZyB0aGUgdGFncy4gSXQgYWxzbyBzZXRzCiAgICAgICAgdGhlIHN0YXRlIHRvICJkYXRhIiBiZWNhdXNlIHRoYXQncyB3aGF0J3MgbmVlZGVkIGFmdGVyIGEgdG9rZW4gaGFzIGJlZW4KICAgICAgICBlbWl0dGVkLgogICAgICAgICIiIgogICAgICAgIHRva2VuID0gc2VsZi5jdXJyZW50VG9rZW4KICAgICAgICAjIEFkZCB0b2tlbiB0byB0aGUgcXVldWUgdG8gYmUgeWllbGRlZAogICAgICAgIGlmICh0b2tlblsidHlwZSJdIGluIHRhZ1Rva2VuVHlwZXMpOgogICAgICAgICAgICB0b2tlblsibmFtZSJdID0gdG9rZW5bIm5hbWUiXS50cmFuc2xhdGUoYXNjaWlVcHBlcjJMb3dlcikKICAgICAgICAgICAgaWYgdG9rZW5bInR5cGUiXSA9PSB0b2tlblR5cGVzWyJFbmRUYWciXToKICAgICAgICAgICAgICAgIGlmIHRva2VuWyJkYXRhIl06CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiYXR0cmlidXRlcy1pbi1lbmQtdGFnIn0pCiAgICAgICAgICAgICAgICBpZiB0b2tlblsic2VsZkNsb3NpbmciXToKICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJzZWxmLWNsb3NpbmctZmxhZy1vbi1lbmQtdGFnIn0pCiAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh0b2tlbikKICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKCiAgICAjIEJlbG93IGFyZSB0aGUgdmFyaW91cyB0b2tlbml6ZXIgc3RhdGVzIHdvcmtlZCBvdXQuCiAgICBkZWYgZGF0YVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICImIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZW50aXR5RGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI8IjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYudGFnT3BlblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIlx1MDAwMCJ9KQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgICMgVG9rZW5pemF0aW9uIGVuZHMuCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgICMgRGlyZWN0bHkgYWZ0ZXIgZW1pdHRpbmcgYSB0b2tlbiB5b3Ugc3dpdGNoIGJhY2sgdG8gdGhlICJkYXRhCiAgICAgICAgICAgICMgc3RhdGUiLiBBdCB0aGF0IHBvaW50IHNwYWNlQ2hhcmFjdGVycyBhcmUgaW1wb3J0YW50IHNvIHRoZXkgYXJlCiAgICAgICAgICAgICMgZW1pdHRlZCBzZXBhcmF0ZWx5LgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlNwYWNlQ2hhcmFjdGVycyJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKyBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKHNwYWNlQ2hhcmFjdGVycywgVHJ1ZSl9KQogICAgICAgICAgICAjIE5vIG5lZWQgdG8gdXBkYXRlIGxhc3RGb3VyQ2hhcnMgaGVyZSwgc2luY2UgdGhlIGZpcnN0IHNwYWNlIHdpbGwKICAgICAgICAgICAgIyBoYXZlIGFscmVhZHkgYmVlbiBhcHBlbmRlZCB0byBsYXN0Rm91ckNoYXJzIGFuZCB3aWxsIGhhdmUgYnJva2VuCiAgICAgICAgICAgICMgYW55IDwhLS0gb3IgLS0+IHNlcXVlbmNlcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNoYXJzID0gc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgoIiYiLCAiPCIsICJcdTAwMDAiKSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArIGNoYXJzfSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBlbnRpdHlEYXRhU3RhdGUoc2VsZik6CiAgICAgICAgc2VsZi5jb25zdW1lRW50aXR5KCkKICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiByY2RhdGFTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiJiI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNoYXJhY3RlclJlZmVyZW5jZUluUmNkYXRhCiAgICAgICAgZWxpZiBkYXRhID09ICI8IjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmNkYXRhTGVzc1RoYW5TaWduU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gRU9GOgogICAgICAgICAgICAjIFRva2VuaXphdGlvbiBlbmRzLgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHVGRkZEIn0pCiAgICAgICAgZWxpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgIyBEaXJlY3RseSBhZnRlciBlbWl0dGluZyBhIHRva2VuIHlvdSBzd2l0Y2ggYmFjayB0byB0aGUgImRhdGEKICAgICAgICAgICAgIyBzdGF0ZSIuIEF0IHRoYXQgcG9pbnQgc3BhY2VDaGFyYWN0ZXJzIGFyZSBpbXBvcnRhbnQgc28gdGhleSBhcmUKICAgICAgICAgICAgIyBlbWl0dGVkIHNlcGFyYXRlbHkuCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siU3BhY2VDaGFyYWN0ZXJzIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArIHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoc3BhY2VDaGFyYWN0ZXJzLCBUcnVlKX0pCiAgICAgICAgICAgICMgTm8gbmVlZCB0byB1cGRhdGUgbGFzdEZvdXJDaGFycyBoZXJlLCBzaW5jZSB0aGUgZmlyc3Qgc3BhY2Ugd2lsbAogICAgICAgICAgICAjIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGVuZGVkIHRvIGxhc3RGb3VyQ2hhcnMgYW5kIHdpbGwgaGF2ZSBicm9rZW4KICAgICAgICAgICAgIyBhbnkgPCEtLSBvciAtLT4gc2VxdWVuY2VzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY2hhcnMgPSBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCgiJiIsICI8IiwgIlx1MDAwMCIpKQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICsgY2hhcnN9KQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNoYXJhY3RlclJlZmVyZW5jZUluUmNkYXRhKHNlbGYpOgogICAgICAgIHNlbGYuY29uc3VtZUVudGl0eSgpCiAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmNkYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiByYXd0ZXh0U3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIjwiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yYXd0ZXh0TGVzc1RoYW5TaWduU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHVGRkZEIn0pCiAgICAgICAgZWxpZiBkYXRhID09IEVPRjoKICAgICAgICAgICAgIyBUb2tlbml6YXRpb24gZW5kcy4KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY2hhcnMgPSBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCgiPCIsICJcdTAwMDAiKSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArIGNoYXJzfSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIjwiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhTGVzc1RoYW5TaWduU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHVGRkZEIn0pCiAgICAgICAgZWxpZiBkYXRhID09IEVPRjoKICAgICAgICAgICAgIyBUb2tlbml6YXRpb24gZW5kcy4KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY2hhcnMgPSBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCgiPCIsICJcdTAwMDAiKSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArIGNoYXJzfSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBwbGFpbnRleHRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSBFT0Y6CiAgICAgICAgICAgICMgVG9rZW5pemF0aW9uIGVuZHMuCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJcdUZGRkQifSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICsgc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgiXHUwMDAwIil9KQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHRhZ09wZW5TdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiISI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLm1hcmt1cERlY2xhcmF0aW9uT3BlblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY2xvc2VUYWdPcGVuU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIlN0YXJ0VGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogZGF0YSwgImRhdGEiOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGZDbG9zaW5nIjogRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi50YWdOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICAjIFhYWCBJbiB0aGVvcnkgaXQgY291bGQgYmUgc29tZXRoaW5nIGJlc2lkZXMgYSB0YWcgbmFtZS4gQnV0CiAgICAgICAgICAgICMgZG8gd2UgcmVhbGx5IGNhcmU/CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC10YWctbmFtZS1idXQtZ290LXJpZ2h0LWJyYWNrZXQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjw+In0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPyI6CiAgICAgICAgICAgICMgWFhYIEluIHRoZW9yeSBpdCBjb3VsZCBiZSBzb21ldGhpbmcgYmVzaWRlcyBhIHRhZyBuYW1lLiBCdXQKICAgICAgICAgICAgIyBkbyB3ZSByZWFsbHkgY2FyZT8KICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLXRhZy1uYW1lLWJ1dC1nb3QtcXVlc3Rpb24tbWFyayJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5ib2d1c0NvbW1lbnRTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgWFhYCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC10YWctbmFtZSJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPCJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjbG9zZVRhZ09wZW5TdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sICJuYW1lIjogZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnRhZ05hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1jbG9zaW5nLXRhZy1idXQtZ290LXJpZ2h0LWJyYWNrZXQifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLWNsb3NpbmctdGFnLWJ1dC1nb3QtZW9mIn0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8LyJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFhYWCBkYXRhIGNhbiBiZSBfJ18uLi4KICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLWNsb3NpbmctdGFnLWJ1dC1nb3QtY2hhciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhdmFycyI6IHsiZGF0YSI6IGRhdGF9fSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYm9ndXNDb21tZW50U3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiB0YWdOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVBdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tdGFnLW5hbWUifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2VsZkNsb3NpbmdTdGFydFRhZ1N0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXSArPSAiXHVGRkZEIgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0gKz0gZGF0YQogICAgICAgICAgICAjIChEb24ndCB1c2UgY2hhcnNVbnRpbCBoZXJlLCBiZWNhdXNlIHRhZyBuYW1lcyBhcmUKICAgICAgICAgICAgIyB2ZXJ5IHNob3J0IGFuZCBpdCdzIGZhc3RlciB0byBub3QgZG8gYW55dGhpbmcgZmFuY3kpCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmNkYXRhTGVzc1RoYW5TaWduU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi8iOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJjZGF0YUVuZFRhZ09wZW5TdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8In0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJjZGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmNkYXRhRW5kVGFnT3BlblN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgKz0gZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yY2RhdGFFbmRUYWdOYW1lU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPC8ifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmNkYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiByY2RhdGFFbmRUYWdOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgYXBwcm9wcmlhdGUgPSBzZWxmLmN1cnJlbnRUb2tlbiBhbmQgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXS5sb3dlcigpID09IHNlbGYudGVtcG9yYXJ5QnVmZmVyLmxvd2VyKCkKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnMgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICIvIiBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zZWxmQ2xvc2luZ1N0YXJ0VGFnU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyICs9IGRhdGEKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiPC8iICsgc2VsZi50ZW1wb3JhcnlCdWZmZXJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yY2RhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHJhd3RleHRMZXNzVGhhblNpZ25TdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLyI6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmF3dGV4dEVuZFRhZ09wZW5TdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8In0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJhd3RleHRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHJhd3RleHRFbmRUYWdPcGVuU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciArPSBkYXRhCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJhd3RleHRFbmRUYWdOYW1lU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPC8ifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmF3dGV4dFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmF3dGV4dEVuZFRhZ05hbWVTdGF0ZShzZWxmKToKICAgICAgICBhcHByb3ByaWF0ZSA9IHNlbGYuY3VycmVudFRva2VuIGFuZCBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdLmxvd2VyKCkgPT0gc2VsZi50ZW1wb3JhcnlCdWZmZXIubG93ZXIoKQogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVycyBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVBdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIi8iIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNlbGZDbG9zaW5nU3RhcnRUYWdTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiIgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5lbWl0Q3VycmVudFRva2VuKCkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgKz0gZGF0YQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICI8LyIgKyBzZWxmLnRlbXBvcmFyeUJ1ZmZlcn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJhd3RleHRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFMZXNzVGhhblNpZ25TdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLyI6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVuZFRhZ09wZW5TdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiISI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8ISJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlU3RhcnRTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8In0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFFbmRUYWdPcGVuU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciArPSBkYXRhCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFbmRUYWdOYW1lU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPC8ifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YUVuZFRhZ05hbWVTdGF0ZShzZWxmKToKICAgICAgICBhcHByb3ByaWF0ZSA9IHNlbGYuY3VycmVudFRva2VuIGFuZCBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdLmxvd2VyKCkgPT0gc2VsZi50ZW1wb3JhcnlCdWZmZXIubG93ZXIoKQogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVycyBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVBdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIi8iIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNlbGZDbG9zaW5nU3RhcnRUYWdTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiIgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5lbWl0Q3VycmVudFRva2VuKCkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgKz0gZGF0YQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICI8LyIgKyBzZWxmLnRlbXBvcmFyeUJ1ZmZlcn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFFc2NhcGVTdGFydFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIi0ifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZVN0YXJ0RGFzaFN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YUVzY2FwZVN0YXJ0RGFzaFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIi0ifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWREYXNoRGFzaFN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YUVzY2FwZWRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICItIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkRGFzaFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI8IjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRMZXNzVGhhblNpZ25TdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJcdUZGRkQifSkKICAgICAgICBlbGlmIGRhdGEgPT0gRU9GOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBjaGFycyA9IHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoKCI8IiwgIi0iLCAiXHUwMDAwIikpCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKyBjaGFyc30pCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YUVzY2FwZWREYXNoU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiLSJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZERhc2hEYXNoU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIjwiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZExlc3NUaGFuU2lnblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIlx1RkZGRCJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09IEVPRjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogZGF0YX0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRXNjYXBlZERhc2hEYXNoU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiLSJ9KQogICAgICAgIGVsaWYgZGF0YSA9PSAiPCI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkTGVzc1RoYW5TaWduU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPiJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHVGRkZEIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gRU9GOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBkYXRhfSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFFc2NhcGVkTGVzc1RoYW5TaWduU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi8iOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkRW5kVGFnT3BlblN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwiICsgZGF0YX0pCiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyID0gZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlU3RhcnRTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8In0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRXNjYXBlZEVuZFRhZ09wZW5TdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyID0gZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZEVuZFRhZ05hbWVTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8LyJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YUVzY2FwZWRFbmRUYWdOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgYXBwcm9wcmlhdGUgPSBzZWxmLmN1cnJlbnRUb2tlbiBhbmQgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXS5sb3dlcigpID09IHNlbGYudGVtcG9yYXJ5QnVmZmVyLmxvd2VyKCkKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnMgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICIvIiBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zZWxmQ2xvc2luZ1N0YXJ0VGFnU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyICs9IGRhdGEKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiPC8iICsgc2VsZi50ZW1wb3JhcnlCdWZmZXJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YURvdWJsZUVzY2FwZVN0YXJ0U3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gKHNwYWNlQ2hhcmFjdGVycyB8IGZyb3plbnNldCgoIi8iLCAiPiIpKSk6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6IGRhdGF9KQogICAgICAgICAgICBpZiBzZWxmLnRlbXBvcmFyeUJ1ZmZlci5sb3dlcigpID09ICJzY3JpcHQiOgogICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRTdGF0ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6IGRhdGF9KQogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciArPSBkYXRhCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFEb3VibGVFc2NhcGVkU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiLSJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlZERhc2hTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8In0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkTGVzc1RoYW5TaWduU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHVGRkZEIn0pCiAgICAgICAgZWxpZiBkYXRhID09IEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1zY3JpcHQtaW4tc2NyaXB0In0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6IGRhdGF9KQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFEb3VibGVFc2NhcGVkRGFzaFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIi0ifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWREYXNoRGFzaFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI8IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRMZXNzVGhhblNpZ25TdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJcdUZGRkQifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tc2NyaXB0LWluLXNjcmlwdCJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBkYXRhfSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFEb3VibGVFc2NhcGVkRGFzaERhc2hTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICItIn0pCiAgICAgICAgZWxpZiBkYXRhID09ICI8IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRMZXNzVGhhblNpZ25TdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI+In0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJcdUZGRkQifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tc2NyaXB0LWluLXNjcmlwdCJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBkYXRhfSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFEb3VibGVFc2NhcGVkTGVzc1RoYW5TaWduU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi8iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiLyJ9KQogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVFbmRTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRG91YmxlRXNjYXBlRW5kU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gKHNwYWNlQ2hhcmFjdGVycyB8IGZyb3plbnNldCgoIi8iLCAiPiIpKSk6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6IGRhdGF9KQogICAgICAgICAgICBpZiBzZWxmLnRlbXBvcmFyeUJ1ZmZlci5sb3dlcigpID09ICJzY3JpcHQiOgogICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRTdGF0ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6IGRhdGF9KQogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciArPSBkYXRhCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGJlZm9yZUF0dHJpYnV0ZU5hbWVTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoc3BhY2VDaGFyYWN0ZXJzLCBUcnVlKQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0uYXBwZW5kKFtkYXRhLCAiIl0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgZWxpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2VsZkNsb3NpbmdTdGFydFRhZ1N0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluICgiJyIsICciJywgIj0iLCAiPCIpOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZC1jaGFyYWN0ZXItaW4tYXR0cmlidXRlLW5hbWUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXS5hcHBlbmQoW2RhdGEsICIiXSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXS5hcHBlbmQoWyJcdUZGRkQiLCAiIl0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1hdHRyaWJ1dGUtbmFtZS1idXQtZ290LWVvZiJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdLmFwcGVuZChbZGF0YSwgIiJdKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhdHRyaWJ1dGVOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGxlYXZpbmdUaGlzU3RhdGUgPSBUcnVlCiAgICAgICAgZW1pdFRva2VuID0gRmFsc2UKICAgICAgICBpZiBkYXRhID09ICI9IjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlVmFsdWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzBdICs9IGRhdGEgK1wKICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoYXNjaWlMZXR0ZXJzLCBUcnVlKQogICAgICAgICAgICBsZWF2aW5nVGhpc1N0YXRlID0gRmFsc2UKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICAjIFhYWCBJZiB3ZSBlbWl0IGhlcmUgdGhlIGF0dHJpYnV0ZXMgYXJlIGNvbnZlcnRlZCB0byBhIGRpY3QKICAgICAgICAgICAgIyB3aXRob3V0IGJlaW5nIGNoZWNrZWQgYW5kIHdoZW4gdGhlIGNvZGUgYmVsb3cgcnVucyB3ZSBlcnJvcgogICAgICAgICAgICAjIGJlY2F1c2UgZGF0YSBpcyBhIGRpY3Qgbm90IGEgbGlzdAogICAgICAgICAgICBlbWl0VG9rZW4gPSBUcnVlCiAgICAgICAgZWxpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYWZ0ZXJBdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIi8iOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zZWxmQ2xvc2luZ1N0YXJ0VGFnU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVswXSArPSAiXHVGRkZEIgogICAgICAgICAgICBsZWF2aW5nVGhpc1N0YXRlID0gRmFsc2UKICAgICAgICBlbGlmIGRhdGEgaW4gKCInIiwgJyInLCAiPCIpOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZC1jaGFyYWN0ZXItaW4tYXR0cmlidXRlLW5hbWUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMF0gKz0gZGF0YQogICAgICAgICAgICBsZWF2aW5nVGhpc1N0YXRlID0gRmFsc2UKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiZW9mLWluLWF0dHJpYnV0ZS1uYW1lIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzBdICs9IGRhdGEKICAgICAgICAgICAgbGVhdmluZ1RoaXNTdGF0ZSA9IEZhbHNlCgogICAgICAgIGlmIGxlYXZpbmdUaGlzU3RhdGU6CiAgICAgICAgICAgICMgQXR0cmlidXRlcyBhcmUgbm90IGRyb3BwZWQgYXQgdGhpcyBzdGFnZS4gVGhhdCBoYXBwZW5zIHdoZW4gdGhlCiAgICAgICAgICAgICMgc3RhcnQgdGFnIHRva2VuIGlzIGVtaXR0ZWQgc28gdmFsdWVzIGNhbiBzdGlsbCBiZSBzYWZlbHkgYXBwZW5kZWQKICAgICAgICAgICAgIyB0byBhdHRyaWJ1dGVzLCBidXQgd2UgZG8gd2FudCB0byByZXBvcnQgdGhlIHBhcnNlIGVycm9yIGluIHRpbWUuCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzBdID0gKAogICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMF0udHJhbnNsYXRlKGFzY2lpVXBwZXIyTG93ZXIpKQogICAgICAgICAgICBmb3IgbmFtZSwgXyBpbiBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWzotMV06CiAgICAgICAgICAgICAgICBpZiBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVswXSA9PSBuYW1lOgogICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImR1cGxpY2F0ZS1hdHRyaWJ1dGUifSkKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAjIFhYWCBGaXggZm9yIGFib3ZlIFhYWAogICAgICAgICAgICBpZiBlbWl0VG9rZW46CiAgICAgICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGFmdGVyQXR0cmlidXRlTmFtZVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5zdHJlYW0uY2hhcnNVbnRpbChzcGFjZUNoYXJhY3RlcnMsIFRydWUpCiAgICAgICAgZWxpZiBkYXRhID09ICI9IjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlVmFsdWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgZWxpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXS5hcHBlbmQoW2RhdGEsICIiXSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2VsZkNsb3NpbmdTdGFydFRhZ1N0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXS5hcHBlbmQoWyJcdUZGRkQiLCAiIl0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiAoIiciLCAnIicsICI8Iik6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkLWNoYXJhY3Rlci1hZnRlci1hdHRyaWJ1dGUtbmFtZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdLmFwcGVuZChbZGF0YSwgIiJdKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtZW5kLW9mLXRhZy1idXQtZ290LWVvZiJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdLmFwcGVuZChbZGF0YSwgIiJdKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBiZWZvcmVBdHRyaWJ1dGVWYWx1ZVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5zdHJlYW0uY2hhcnNVbnRpbChzcGFjZUNoYXJhY3RlcnMsIFRydWUpCiAgICAgICAgZWxpZiBkYXRhID09ICJcIiI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZVZhbHVlRG91YmxlUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIiYiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVWYWx1ZVVuUXVvdGVkU3RhdGUKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICBlbGlmIGRhdGEgPT0gIiciOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVWYWx1ZVNpbmdsZVF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLWF0dHJpYnV0ZS12YWx1ZS1idXQtZ290LXJpZ2h0LWJyYWNrZXQifSkKICAgICAgICAgICAgc2VsZi5lbWl0Q3VycmVudFRva2VuKCkKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSAiXHVGRkZEIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVWYWx1ZVVuUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gKCI9IiwgIjwiLCAiYCIpOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXF1YWxzLWluLXVucXVvdGVkLWF0dHJpYnV0ZS12YWx1ZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSBkYXRhCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZVZhbHVlVW5RdW90ZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1hdHRyaWJ1dGUtdmFsdWUtYnV0LWdvdC1lb2YifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMV0gKz0gZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVWYWx1ZVVuUXVvdGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhdHRyaWJ1dGVWYWx1ZURvdWJsZVF1b3RlZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICJcIiI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmFmdGVyQXR0cmlidXRlVmFsdWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiJiI6CiAgICAgICAgICAgIHNlbGYucHJvY2Vzc0VudGl0eUluQXR0cmlidXRlKCciJykKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSAiXHVGRkZEIgogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tYXR0cmlidXRlLXZhbHVlLWRvdWJsZS1xdW90ZSJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSBkYXRhICtcCiAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCgiXCIiLCAiJiIsICJcdTAwMDAiKSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhdHRyaWJ1dGVWYWx1ZVNpbmdsZVF1b3RlZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICInIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYWZ0ZXJBdHRyaWJ1dGVWYWx1ZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICImIjoKICAgICAgICAgICAgc2VsZi5wcm9jZXNzRW50aXR5SW5BdHRyaWJ1dGUoIiciKQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzFdICs9ICJcdUZGRkQiCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1hdHRyaWJ1dGUtdmFsdWUtc2luZ2xlLXF1b3RlIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzFdICs9IGRhdGEgK1wKICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoKCInIiwgIiYiLCAiXHUwMDAwIikpCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYXR0cmlidXRlVmFsdWVVblF1b3RlZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICImIjoKICAgICAgICAgICAgc2VsZi5wcm9jZXNzRW50aXR5SW5BdHRyaWJ1dGUoIj4iKQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgZWxpZiBkYXRhIGluICgnIicsICInIiwgIj0iLCAiPCIsICJgIik6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXJhY3Rlci1pbi11bnF1b3RlZC1hdHRyaWJ1dGUtdmFsdWUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMV0gKz0gZGF0YQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzFdICs9ICJcdUZGRkQiCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1hdHRyaWJ1dGUtdmFsdWUtbm8tcXVvdGVzIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzFdICs9IGRhdGEgKyBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKAogICAgICAgICAgICAgICAgZnJvemVuc2V0KCgiJiIsICI+IiwgJyInLCAiJyIsICI9IiwgIjwiLCAiYCIsICJcdTAwMDAiKSkgfCBzcGFjZUNoYXJhY3RlcnMpCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYWZ0ZXJBdHRyaWJ1dGVWYWx1ZVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi5lbWl0Q3VycmVudFRva2VuKCkKICAgICAgICBlbGlmIGRhdGEgPT0gIi8iOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zZWxmQ2xvc2luZ1N0YXJ0VGFnU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1FT0YtYWZ0ZXItYXR0cmlidXRlLXZhbHVlIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXJhY3Rlci1hZnRlci1hdHRyaWJ1dGUtdmFsdWUifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2VsZkNsb3NpbmdTdGFydFRhZ1N0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInNlbGZDbG9zaW5nIl0gPSBUcnVlCiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtRU9GLWFmdGVyLXNvbGlkdXMtaW4tdGFnIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXJhY3Rlci1hZnRlci1zb2xpZHVzLWluLXRhZyJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVBdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBib2d1c0NvbW1lbnRTdGF0ZShzZWxmKToKICAgICAgICAjIE1ha2UgYSBuZXcgY29tbWVudCB0b2tlbiBhbmQgZ2l2ZSBpdCBhcyB2YWx1ZSBhbGwgdGhlIGNoYXJhY3RlcnMKICAgICAgICAjIHVudGlsIHRoZSBmaXJzdCA+IG9yIEVPRiAoY2hhcnNVbnRpbCBjaGVja3MgZm9yIEVPRiBhdXRvbWF0aWNhbGx5KQogICAgICAgICMgYW5kIGVtaXQgaXQuCiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoIj4iKQogICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoIlx1MDAwMCIsICJcdUZGRkQiKQogICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoCiAgICAgICAgICAgIHsidHlwZSI6IHRva2VuVHlwZXNbIkNvbW1lbnQiXSwgImRhdGEiOiBkYXRhfSkKCiAgICAgICAgIyBFYXQgdGhlIGNoYXJhY3RlciBkaXJlY3RseSBhZnRlciB0aGUgYm9ndXMgY29tbWVudCB3aGljaCBpcyBlaXRoZXIgYQogICAgICAgICMgIj4iIG9yIGFuIEVPRi4KICAgICAgICBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBtYXJrdXBEZWNsYXJhdGlvbk9wZW5TdGF0ZShzZWxmKToKICAgICAgICBjaGFyU3RhY2sgPSBbc2VsZi5zdHJlYW0uY2hhcigpXQogICAgICAgIGlmIGNoYXJTdGFja1stMV0gPT0gIi0iOgogICAgICAgICAgICBjaGFyU3RhY2suYXBwZW5kKHNlbGYuc3RyZWFtLmNoYXIoKSkKICAgICAgICAgICAgaWYgY2hhclN0YWNrWy0xXSA9PSAiLSI6CiAgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkNvbW1lbnQiXSwgImRhdGEiOiAiIn0KICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRTdGFydFN0YXRlCiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGVsaWYgY2hhclN0YWNrWy0xXSBpbiAoJ2QnLCAnRCcpOgogICAgICAgICAgICBtYXRjaGVkID0gVHJ1ZQogICAgICAgICAgICBmb3IgZXhwZWN0ZWQgaW4gKCgnbycsICdPJyksICgnYycsICdDJyksICgndCcsICdUJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCd5JywgJ1knKSwgKCdwJywgJ1AnKSwgKCdlJywgJ0UnKSk6CiAgICAgICAgICAgICAgICBjaGFyU3RhY2suYXBwZW5kKHNlbGYuc3RyZWFtLmNoYXIoKSkKICAgICAgICAgICAgICAgIGlmIGNoYXJTdGFja1stMV0gbm90IGluIGV4cGVjdGVkOgogICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIG1hdGNoZWQ6CiAgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkRvY3R5cGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHVibGljSWQiOiBOb25lLCAic3lzdGVtSWQiOiBOb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcnJlY3QiOiBUcnVlfQogICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZVN0YXRlCiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGVsaWYgKGNoYXJTdGFja1stMV0gPT0gIlsiIGFuZAogICAgICAgICAgICAgIHNlbGYucGFyc2VyIGlzIG5vdCBOb25lIGFuZAogICAgICAgICAgICAgIHNlbGYucGFyc2VyLnRyZWUub3BlbkVsZW1lbnRzIGFuZAogICAgICAgICAgICAgIHNlbGYucGFyc2VyLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lc3BhY2UgIT0gc2VsZi5wYXJzZXIudHJlZS5kZWZhdWx0TmFtZXNwYWNlKToKICAgICAgICAgICAgbWF0Y2hlZCA9IFRydWUKICAgICAgICAgICAgZm9yIGV4cGVjdGVkIGluIFsiQyIsICJEIiwgIkEiLCAiVCIsICJBIiwgIlsiXToKICAgICAgICAgICAgICAgIGNoYXJTdGFjay5hcHBlbmQoc2VsZi5zdHJlYW0uY2hhcigpKQogICAgICAgICAgICAgICAgaWYgY2hhclN0YWNrWy0xXSAhPSBleHBlY3RlZDoKICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBtYXRjaGVkOgogICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY2RhdGFTZWN0aW9uU3RhdGUKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLWRhc2hlcy1vci1kb2N0eXBlIn0pCgogICAgICAgIHdoaWxlIGNoYXJTdGFjazoKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoY2hhclN0YWNrLnBvcCgpKQogICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJvZ3VzQ29tbWVudFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY29tbWVudFN0YXJ0U3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50U3RhcnREYXNoU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9ICJcdUZGRkQiCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluY29ycmVjdC1jb21tZW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tY29tbWVudCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9IGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY29tbWVudFN0YXJ0RGFzaFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudEVuZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiLVx1RkZGRCIKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jb3JyZWN0LWNvbW1lbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1jb21tZW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gIi0iICsgZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50U3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjb21tZW50U3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50RW5kRGFzaFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiXHVGRkZEIgogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJlb2YtaW4tY29tbWVudCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9IGRhdGEgKyBcCiAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCgiLSIsICJcdTAwMDAiKSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjb21tZW50RW5kRGFzaFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudEVuZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiLVx1RkZGRCIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudFN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1jb21tZW50LWVuZC1kYXNoIn0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gIi0iICsgZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50U3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjb21tZW50RW5kU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9ICItLVx1RkZGRCIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICIhIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtYmFuZy1hZnRlci1kb3VibGUtZGFzaC1pbi1jb21tZW50In0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRFbmRCYW5nU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1kYXNoLWFmdGVyLWRvdWJsZS1kYXNoLWluLWNvbW1lbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSBkYXRhCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1jb21tZW50LWRvdWJsZS1kYXNoIn0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgWFhYCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tY29tbWVudCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9ICItLSIgKyBkYXRhCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNvbW1lbnRFbmRCYW5nU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9ICItLSEiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRFbmREYXNoU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9ICItLSFcdUZGRkQiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tY29tbWVudC1lbmQtYmFuZy1zdGF0ZSJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9ICItLSEiICsgZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50U3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBkb2N0eXBlU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVEb2N0eXBlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLWRvY3R5cGUtbmFtZS1idXQtZ290LWVvZiJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZWQtc3BhY2UtYWZ0ZXItZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVEb2N0eXBlTmFtZVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYmVmb3JlRG9jdHlwZU5hbWVTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtZG9jdHlwZS1uYW1lLWJ1dC1nb3QtcmlnaHQtYnJhY2tldCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXSA9ICJcdUZGRkQiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRvY3R5cGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtZG9jdHlwZS1uYW1lLWJ1dC1nb3QtZW9mIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdID0gZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlTmFtZVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgZG9jdHlwZU5hbWVTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0gPSBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdLnRyYW5zbGF0ZShhc2NpaVVwcGVyMkxvd2VyKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hZnRlckRvY3R5cGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdID0gc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXS50cmFuc2xhdGUoYXNjaWlVcHBlcjJMb3dlcikKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXSArPSAiXHVGRkZEIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlLW5hbWUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0gPSBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdLnRyYW5zbGF0ZShhc2NpaVVwcGVyMkxvd2VyKQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdICs9IGRhdGEKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhZnRlckRvY3R5cGVOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBkYXRhIGluICgicCIsICJQIik6CiAgICAgICAgICAgICAgICBtYXRjaGVkID0gVHJ1ZQogICAgICAgICAgICAgICAgZm9yIGV4cGVjdGVkIGluICgoInUiLCAiVSIpLCAoImIiLCAiQiIpLCAoImwiLCAiTCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImkiLCAiSSIpLCAoImMiLCAiQyIpKToKICAgICAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgICAgICAgICAgICAgaWYgZGF0YSBub3QgaW4gZXhwZWN0ZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgaWYgbWF0Y2hlZDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hZnRlckRvY3R5cGVQdWJsaWNLZXl3b3JkU3RhdGUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICBlbGlmIGRhdGEgaW4gKCJzIiwgIlMiKToKICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBmb3IgZXhwZWN0ZWQgaW4gKCgieSIsICJZIiksICgicyIsICJTIiksICgidCIsICJUIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZSIsICJFIiksICgibSIsICJNIikpOgogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICAgICAgICAgICAgICBpZiBkYXRhIG5vdCBpbiBleHBlY3RlZDoKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBpZiBtYXRjaGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmFmdGVyRG9jdHlwZVN5c3RlbUtleXdvcmRTdGF0ZQogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgICAgICAjIEFsbCB0aGUgY2hhcmFjdGVycyByZWFkIGJlZm9yZSB0aGUgY3VycmVudCAnZGF0YScgd2lsbCBiZQogICAgICAgICAgICAjIFthLXpBLVpdLCBzbyB0aGV5J3JlIGdhcmJhZ2UgaW4gdGhlIGJvZ3VzIGRvY3R5cGUgYW5kIGNhbiBiZQogICAgICAgICAgICAjIGRpc2NhcmRlZDsgb25seSB0aGUgbGF0ZXN0IGNoYXJhY3RlciBtaWdodCBiZSAnPicgb3IgRU9GCiAgICAgICAgICAgICMgYW5kIG5lZWRzIHRvIGJlIHVuZ2V0dGVkCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1zcGFjZS1vci1yaWdodC1icmFja2V0LWluLWRvY3R5cGUiLCAiZGF0YXZhcnMiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImRhdGEiOiBkYXRhfX0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5ib2d1c0RvY3R5cGVTdGF0ZQoKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhZnRlckRvY3R5cGVQdWJsaWNLZXl3b3JkU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVEb2N0eXBlUHVibGljSWRlbnRpZmllclN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluICgiJyIsICciJyk6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVEb2N0eXBlUHVibGljSWRlbnRpZmllclN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVEb2N0eXBlUHVibGljSWRlbnRpZmllclN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYmVmb3JlRG9jdHlwZVB1YmxpY0lkZW50aWZpZXJTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbGlmIGRhdGEgPT0gIlwiIjoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInB1YmxpY0lkIl0gPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlUHVibGljSWRlbnRpZmllckRvdWJsZVF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICInIjoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInB1YmxpY0lkIl0gPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlUHVibGljSWRlbnRpZmllclNpbmdsZVF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtZW5kLW9mLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhci1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5ib2d1c0RvY3R5cGVTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGRvY3R5cGVQdWJsaWNJZGVudGlmaWVyRG91YmxlUXVvdGVkU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIlwiIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYWZ0ZXJEb2N0eXBlUHVibGljSWRlbnRpZmllclN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInB1YmxpY0lkIl0gKz0gIlx1RkZGRCIKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1lbmQtb2YtZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsicHVibGljSWQiXSArPSBkYXRhCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgZG9jdHlwZVB1YmxpY0lkZW50aWZpZXJTaW5nbGVRdW90ZWRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiJyI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmFmdGVyRG9jdHlwZVB1YmxpY0lkZW50aWZpZXJTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJwdWJsaWNJZCJdICs9ICJcdUZGRkQiCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtZW5kLW9mLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInB1YmxpY0lkIl0gKz0gZGF0YQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGFmdGVyRG9jdHlwZVB1YmxpY0lkZW50aWZpZXJTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJldHdlZW5Eb2N0eXBlUHVibGljQW5kU3lzdGVtSWRlbnRpZmllcnNTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAnIic6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsic3lzdGVtSWQiXSA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyRG91YmxlUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIiciOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInN5c3RlbUlkIl0gPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlU3lzdGVtSWRlbnRpZmllclNpbmdsZVF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJvZ3VzRG9jdHlwZVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYmV0d2VlbkRvY3R5cGVQdWJsaWNBbmRTeXN0ZW1JZGVudGlmaWVyc1N0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAnIic6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJzeXN0ZW1JZCJdID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZVN5c3RlbUlkZW50aWZpZXJEb3VibGVRdW90ZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiJyI6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJzeXN0ZW1JZCJdID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTaW5nbGVRdW90ZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhci1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5ib2d1c0RvY3R5cGVTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGFmdGVyRG9jdHlwZVN5c3RlbUtleXdvcmRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZURvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gKCInIiwgJyInKToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhci1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZURvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZURvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBiZWZvcmVEb2N0eXBlU3lzdGVtSWRlbnRpZmllclN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsaWYgZGF0YSA9PSAiXCIiOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsic3lzdGVtSWQiXSA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyRG91YmxlUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIiciOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsic3lzdGVtSWQiXSA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU2luZ2xlUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhci1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5ib2d1c0RvY3R5cGVTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyRG91YmxlUXVvdGVkU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIlwiIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYWZ0ZXJEb2N0eXBlU3lzdGVtSWRlbnRpZmllclN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInN5c3RlbUlkIl0gKz0gIlx1RkZGRCIKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1lbmQtb2YtZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsic3lzdGVtSWQiXSArPSBkYXRhCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgZG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTaW5nbGVRdW90ZWRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiJyI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmFmdGVyRG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJzeXN0ZW1JZCJdICs9ICJcdUZGRkQiCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtZW5kLW9mLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInN5c3RlbUlkIl0gKz0gZGF0YQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGFmdGVyRG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5ib2d1c0RvY3R5cGVTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGJvZ3VzRG9jdHlwZVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgIyBYWFggRU1JVAogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY2RhdGFTZWN0aW9uU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IFtdCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgZGF0YS5hcHBlbmQoc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgiXSIpKQogICAgICAgICAgICBkYXRhLmFwcGVuZChzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCI+IikpCiAgICAgICAgICAgIGNoYXIgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICAgICAgaWYgY2hhciA9PSBFT0Y6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXNzZXJ0IGNoYXIgPT0gIj4iCiAgICAgICAgICAgICAgICBpZiBkYXRhWy0xXVstMjpdID09ICJdXSI6CiAgICAgICAgICAgICAgICAgICAgZGF0YVstMV0gPSBkYXRhWy0xXVs6LTJdCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZGF0YS5hcHBlbmQoY2hhcikKCiAgICAgICAgZGF0YSA9ICIiLmpvaW4oZGF0YSkgICMgcHlsaW50OmRpc2FibGU9cmVkZWZpbmVkLXZhcmlhYmxlLXR5cGUKICAgICAgICAjIERlYWwgd2l0aCBudWxsIGhlcmUgcmF0aGVyIHRoYW4gaW4gdGhlIHBhcnNlcgogICAgICAgIG51bGxDb3VudCA9IGRhdGEuY291bnQoIlx1MDAwMCIpCiAgICAgICAgaWYgbnVsbENvdW50ID4gMDoKICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UobnVsbENvdW50KToKICAgICAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgiXHUwMDAwIiwgIlx1RkZGRCIpCiAgICAgICAgaWYgZGF0YToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogZGF0YX0pCiAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKUEsDBBQAAAAAAAAAIQDv068PIQEAACEBAAA2AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL190cmllL19faW5pdF9fLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIC5weSBpbXBvcnQgVHJpZSBhcyBQeVRyaWUKClRyaWUgPSBQeVRyaWUKCiMgcHlsaW50OmRpc2FibGU9d3JvbmctaW1wb3J0LXBvc2l0aW9uCnRyeToKICAgIGZyb20gLmRhdHJpZSBpbXBvcnQgVHJpZSBhcyBEQVRyaWUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgcGFzcwplbHNlOgogICAgVHJpZSA9IERBVHJpZQojIHB5bGludDplbmFibGU9d3JvbmctaW1wb3J0LXBvc2l0aW9uClBLAwQUAAAAAAAAACEAzJU+ltMDAADTAwAAMwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9fYmFzZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgTWFwcGluZwoKCmNsYXNzIFRyaWUoTWFwcGluZyk6CiAgICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0cmllcyIiIgoKICAgIGRlZiBrZXlzKHNlbGYsIHByZWZpeD1Ob25lKToKICAgICAgICAjIHB5bGludDpkaXNhYmxlPWFyZ3VtZW50cy1kaWZmZXIKICAgICAgICBrZXlzID0gc3VwZXIoVHJpZSwgc2VsZikua2V5cygpCgogICAgICAgIGlmIHByZWZpeCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gc2V0KGtleXMpCgogICAgICAgICMgUHl0aG9uIDIuNjogbm8gc2V0IGNvbXByZWhlbnNpb25zCiAgICAgICAgcmV0dXJuIHNldChbeCBmb3IgeCBpbiBrZXlzIGlmIHguc3RhcnRzd2l0aChwcmVmaXgpXSkKCiAgICBkZWYgaGFzX2tleXNfd2l0aF9wcmVmaXgoc2VsZiwgcHJlZml4KToKICAgICAgICBmb3Iga2V5IGluIHNlbGYua2V5cygpOgogICAgICAgICAgICBpZiBrZXkuc3RhcnRzd2l0aChwcmVmaXgpOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIGxvbmdlc3RfcHJlZml4KHNlbGYsIHByZWZpeCk6CiAgICAgICAgaWYgcHJlZml4IGluIHNlbGY6CiAgICAgICAgICAgIHJldHVybiBwcmVmaXgKCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKHByZWZpeCkgKyAxKToKICAgICAgICAgICAgaWYgcHJlZml4WzotaV0gaW4gc2VsZjoKICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXhbOi1pXQoKICAgICAgICByYWlzZSBLZXlFcnJvcihwcmVmaXgpCgogICAgZGVmIGxvbmdlc3RfcHJlZml4X2l0ZW0oc2VsZiwgcHJlZml4KToKICAgICAgICBscHJlZml4ID0gc2VsZi5sb25nZXN0X3ByZWZpeChwcmVmaXgpCiAgICAgICAgcmV0dXJuIChscHJlZml4LCBzZWxmW2xwcmVmaXhdKQpQSwMEFAAAAAAAAAAhACRVnamaBAAAmgQAADQAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvZGF0cmllLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIGRhdHJpZSBpbXBvcnQgVHJpZSBhcyBEQVRyaWUKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHRleHRfdHlwZQoKZnJvbSAuX2Jhc2UgaW1wb3J0IFRyaWUgYXMgQUJDVHJpZQoKCmNsYXNzIFRyaWUoQUJDVHJpZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CiAgICAgICAgY2hhcnMgPSBzZXQoKQogICAgICAgIGZvciBrZXkgaW4gZGF0YS5rZXlzKCk6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGtleSwgdGV4dF90eXBlKToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQWxsIGtleXMgbXVzdCBiZSBzdHJpbmdzIikKICAgICAgICAgICAgZm9yIGNoYXIgaW4ga2V5OgogICAgICAgICAgICAgICAgY2hhcnMuYWRkKGNoYXIpCgogICAgICAgIHNlbGYuX2RhdGEgPSBEQVRyaWUoIiIuam9pbihjaGFycykpCiAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZGF0YS5pdGVtcygpOgogICAgICAgICAgICBzZWxmLl9kYXRhW2tleV0gPSB2YWx1ZQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX2RhdGEKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2RhdGEpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiBzZWxmLl9kYXRhW2tleV0KCiAgICBkZWYga2V5cyhzZWxmLCBwcmVmaXg9Tm9uZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGEua2V5cyhwcmVmaXgpCgogICAgZGVmIGhhc19rZXlzX3dpdGhfcHJlZml4KHNlbGYsIHByZWZpeCk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGEuaGFzX2tleXNfd2l0aF9wcmVmaXgocHJlZml4KQoKICAgIGRlZiBsb25nZXN0X3ByZWZpeChzZWxmLCBwcmVmaXgpOgogICAgICAgIHJldHVybiBzZWxmLl9kYXRhLmxvbmdlc3RfcHJlZml4KHByZWZpeCkKCiAgICBkZWYgbG9uZ2VzdF9wcmVmaXhfaXRlbShzZWxmLCBwcmVmaXgpOgogICAgICAgIHJldHVybiBzZWxmLl9kYXRhLmxvbmdlc3RfcHJlZml4X2l0ZW0ocHJlZml4KQpQSwMEFAAAAAAAAAAhAEtPbs7vBgAA7wYAADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvcHkucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHRleHRfdHlwZQoKZnJvbSBiaXNlY3QgaW1wb3J0IGJpc2VjdF9sZWZ0Cgpmcm9tIC5fYmFzZSBpbXBvcnQgVHJpZSBhcyBBQkNUcmllCgoKY2xhc3MgVHJpZShBQkNUcmllKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKICAgICAgICBpZiBub3QgYWxsKGlzaW5zdGFuY2UoeCwgdGV4dF90eXBlKSBmb3IgeCBpbiBkYXRhLmtleXMoKSk6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQWxsIGtleXMgbXVzdCBiZSBzdHJpbmdzIikKCiAgICAgICAgc2VsZi5fZGF0YSA9IGRhdGEKICAgICAgICBzZWxmLl9rZXlzID0gc29ydGVkKGRhdGEua2V5cygpKQogICAgICAgIHNlbGYuX2NhY2hlc3RyID0gIiIKICAgICAgICBzZWxmLl9jYWNoZXBvaW50cyA9ICgwLCBsZW4oZGF0YSkpCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiBrZXkgaW4gc2VsZi5fZGF0YQoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgIHJldHVybiBsZW4oc2VsZi5fZGF0YSkKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fZGF0YSkKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4gc2VsZi5fZGF0YVtrZXldCgogICAgZGVmIGtleXMoc2VsZiwgcHJlZml4PU5vbmUpOgogICAgICAgIGlmIHByZWZpeCBpcyBOb25lIG9yIHByZWZpeCA9PSAiIiBvciBub3Qgc2VsZi5fa2V5czoKICAgICAgICAgICAgcmV0dXJuIHNldChzZWxmLl9rZXlzKQoKICAgICAgICBpZiBwcmVmaXguc3RhcnRzd2l0aChzZWxmLl9jYWNoZXN0cik6CiAgICAgICAgICAgIGxvLCBoaSA9IHNlbGYuX2NhY2hlcG9pbnRzCiAgICAgICAgICAgIHN0YXJ0ID0gaSA9IGJpc2VjdF9sZWZ0KHNlbGYuX2tleXMsIHByZWZpeCwgbG8sIGhpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN0YXJ0ID0gaSA9IGJpc2VjdF9sZWZ0KHNlbGYuX2tleXMsIHByZWZpeCkKCiAgICAgICAga2V5cyA9IHNldCgpCiAgICAgICAgaWYgc3RhcnQgPT0gbGVuKHNlbGYuX2tleXMpOgogICAgICAgICAgICByZXR1cm4ga2V5cwoKICAgICAgICB3aGlsZSBzZWxmLl9rZXlzW2ldLnN0YXJ0c3dpdGgocHJlZml4KToKICAgICAgICAgICAga2V5cy5hZGQoc2VsZi5fa2V5c1tpXSkKICAgICAgICAgICAgaSArPSAxCgogICAgICAgIHNlbGYuX2NhY2hlc3RyID0gcHJlZml4CiAgICAgICAgc2VsZi5fY2FjaGVwb2ludHMgPSAoc3RhcnQsIGkpCgogICAgICAgIHJldHVybiBrZXlzCgogICAgZGVmIGhhc19rZXlzX3dpdGhfcHJlZml4KHNlbGYsIHByZWZpeCk6CiAgICAgICAgaWYgcHJlZml4IGluIHNlbGYuX2RhdGE6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGlmIHByZWZpeC5zdGFydHN3aXRoKHNlbGYuX2NhY2hlc3RyKToKICAgICAgICAgICAgbG8sIGhpID0gc2VsZi5fY2FjaGVwb2ludHMKICAgICAgICAgICAgaSA9IGJpc2VjdF9sZWZ0KHNlbGYuX2tleXMsIHByZWZpeCwgbG8sIGhpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGkgPSBiaXNlY3RfbGVmdChzZWxmLl9rZXlzLCBwcmVmaXgpCgogICAgICAgIGlmIGkgPT0gbGVuKHNlbGYuX2tleXMpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcmV0dXJuIHNlbGYuX2tleXNbaV0uc3RhcnRzd2l0aChwcmVmaXgpClBLAwQUAAAAAAAAACEAJuOuWAAQAAAAEAAALgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdXRpbHMucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCBzeXMKZnJvbSB0eXBlcyBpbXBvcnQgTW9kdWxlVHlwZQoKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHRleHRfdHlwZQoKdHJ5OgogICAgaW1wb3J0IHhtbC5ldHJlZS5jRWxlbWVudFRyZWUgYXMgZGVmYXVsdF9ldHJlZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIGFzIGRlZmF1bHRfZXRyZWUKCgpfX2FsbF9fID0gWyJkZWZhdWx0X2V0cmVlIiwgIk1ldGhvZERpc3BhdGNoZXIiLCAiaXNTdXJyb2dhdGVQYWlyIiwKICAgICAgICAgICAic3Vycm9nYXRlUGFpclRvQ29kZXBvaW50IiwgIm1vZHVsZUZhY3RvcnlGYWN0b3J5IiwKICAgICAgICAgICAic3VwcG9ydHNfbG9uZV9zdXJyb2dhdGVzIiwgIlBZMjciXQoKClBZMjcgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIgYW5kIHN5cy52ZXJzaW9uX2luZm9bMV0gPj0gNwoKIyBQbGF0Zm9ybXMgbm90IHN1cHBvcnRpbmcgbG9uZSBzdXJyb2dhdGVzIChcdUQ4MDAtXHVERkZGKSBzaG91bGQgYmUKIyBjYXVnaHQgYnkgdGhlIGJlbG93IHRlc3QuIEluIGdlbmVyYWwgdGhpcyB3b3VsZCBiZSBhbnkgcGxhdGZvcm0KIyB1c2luZyBVVEYtMTYgYXMgaXRzIGVuY29kaW5nIG9mIHVuaWNvZGUgc3RyaW5ncywgc3VjaCBhcwojIEp5dGhvbi4gVGhpcyBpcyBiZWNhdXNlIFVURi0xNiBpdHNlbGYgaXMgYmFzZWQgb24gdGhlIHVzZSBvZiBzdWNoCiMgc3Vycm9nYXRlcywgYW5kIHRoZXJlIGlzIG5vIG1lY2hhbmlzbSB0byBmdXJ0aGVyIGVzY2FwZSBzdWNoCiMgZXNjYXBlcy4KdHJ5OgogICAgX3ggPSBldmFsKCciXFx1RDgwMCInKSAgIyBweWxpbnQ6ZGlzYWJsZT1ldmFsLXVzZWQKICAgIGlmIG5vdCBpc2luc3RhbmNlKF94LCB0ZXh0X3R5cGUpOgogICAgICAgICMgV2UgbmVlZCB0aGlzIHdpdGggdSIiIGJlY2F1c2Ugb2YgaHR0cDovL2J1Z3Muanl0aG9uLm9yZy9pc3N1ZTIwMzkKICAgICAgICBfeCA9IGV2YWwoJ3UiXFx1RDgwMCInKSAgIyBweWxpbnQ6ZGlzYWJsZT1ldmFsLXVzZWQKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShfeCwgdGV4dF90eXBlKQpleGNlcHQ6ICAjIHB5bGludDpkaXNhYmxlPWJhcmUtZXhjZXB0CiAgICBzdXBwb3J0c19sb25lX3N1cnJvZ2F0ZXMgPSBGYWxzZQplbHNlOgogICAgc3VwcG9ydHNfbG9uZV9zdXJyb2dhdGVzID0gVHJ1ZQoKCmNsYXNzIE1ldGhvZERpc3BhdGNoZXIoZGljdCk6CiAgICAiIiJEaWN0IHdpdGggMiBzcGVjaWFsIHByb3BlcnRpZXM6CgogICAgT24gaW5pdGlhdGlvbiwga2V5cyB0aGF0IGFyZSBsaXN0cywgc2V0cyBvciB0dXBsZXMgYXJlIGNvbnZlcnRlZCB0bwogICAgbXVsdGlwbGUga2V5cyBzbyBhY2Nlc3NpbmcgYW55IG9uZSBvZiB0aGUgaXRlbXMgaW4gdGhlIG9yaWdpbmFsCiAgICBsaXN0LWxpa2Ugb2JqZWN0IHJldHVybnMgdGhlIG1hdGNoaW5nIHZhbHVlCgogICAgbWQgPSBNZXRob2REaXNwYXRjaGVyKHsoImZvbyIsICJiYXIiKToiYmF6In0pCiAgICBtZFsiZm9vIl0gPT0gImJheiIKCiAgICBBIGRlZmF1bHQgdmFsdWUgd2hpY2ggY2FuIGJlIHNldCB0aHJvdWdoIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpdGVtcz0oKSk6CiAgICAgICAgIyBVc2luZyBfZGljdEVudHJpZXMgaW5zdGVhZCBvZiBkaXJlY3RseSBhc3NpZ25pbmcgdG8gc2VsZiBpcyBhYm91dAogICAgICAgICMgdHdpY2UgYXMgZmFzdC4gUGxlYXNlIGRvIGNhcmVmdWwgcGVyZm9ybWFuY2UgdGVzdGluZyBiZWZvcmUgY2hhbmdpbmcKICAgICAgICAjIGFueXRoaW5nIGhlcmUuCiAgICAgICAgX2RpY3RFbnRyaWVzID0gW10KICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gaXRlbXM6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSwgKGxpc3QsIHR1cGxlLCBmcm96ZW5zZXQsIHNldCkpOgogICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gbmFtZToKICAgICAgICAgICAgICAgICAgICBfZGljdEVudHJpZXMuYXBwZW5kKChpdGVtLCB2YWx1ZSkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBfZGljdEVudHJpZXMuYXBwZW5kKChuYW1lLCB2YWx1ZSkpCiAgICAgICAgZGljdC5fX2luaXRfXyhzZWxmLCBfZGljdEVudHJpZXMpCiAgICAgICAgYXNzZXJ0IGxlbihzZWxmKSA9PSBsZW4oX2RpY3RFbnRyaWVzKQogICAgICAgIHNlbGYuZGVmYXVsdCA9IE5vbmUKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4gZGljdC5nZXQoc2VsZiwga2V5LCBzZWxmLmRlZmF1bHQpCgoKIyBTb21lIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCB3ZWlyZG5lc3MgYXJvdW5kIFVDUzIgdnMgVUNTNAojIHB5dGhvbiBidWlsZHMKCmRlZiBpc1N1cnJvZ2F0ZVBhaXIoZGF0YSk6CiAgICByZXR1cm4gKGxlbihkYXRhKSA9PSAyIGFuZAogICAgICAgICAgICBvcmQoZGF0YVswXSkgPj0gMHhEODAwIGFuZCBvcmQoZGF0YVswXSkgPD0gMHhEQkZGIGFuZAogICAgICAgICAgICBvcmQoZGF0YVsxXSkgPj0gMHhEQzAwIGFuZCBvcmQoZGF0YVsxXSkgPD0gMHhERkZGKQoKCmRlZiBzdXJyb2dhdGVQYWlyVG9Db2RlcG9pbnQoZGF0YSk6CiAgICBjaGFyX3ZhbCA9ICgweDEwMDAwICsgKG9yZChkYXRhWzBdKSAtIDB4RDgwMCkgKiAweDQwMCArCiAgICAgICAgICAgICAgICAob3JkKGRhdGFbMV0pIC0gMHhEQzAwKSkKICAgIHJldHVybiBjaGFyX3ZhbAoKIyBNb2R1bGUgRmFjdG9yeSBGYWN0b3J5IChubywgdGhpcyBpc24ndCBKYXZhLCBJIGtub3cpCiMgSGVyZSB0byBzdG9wIHRoaXMgYmVpbmcgZHVwbGljYXRlZCBhbGwgb3ZlciB0aGUgcGxhY2UuCgoKZGVmIG1vZHVsZUZhY3RvcnlGYWN0b3J5KGZhY3RvcnkpOgogICAgbW9kdWxlQ2FjaGUgPSB7fQoKICAgIGRlZiBtb2R1bGVGYWN0b3J5KGJhc2VNb2R1bGUsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShNb2R1bGVUeXBlLl9fbmFtZV9fLCB0eXBlKCIiKSk6CiAgICAgICAgICAgIG5hbWUgPSAiXyVzX2ZhY3RvcnkiICUgYmFzZU1vZHVsZS5fX25hbWVfXwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5hbWUgPSBiIl8lc19mYWN0b3J5IiAlIGJhc2VNb2R1bGUuX19uYW1lX18KCiAgICAgICAga3dhcmdzX3R1cGxlID0gdHVwbGUoa3dhcmdzLml0ZW1zKCkpCgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIG1vZHVsZUNhY2hlW25hbWVdW2FyZ3NdW2t3YXJnc190dXBsZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIG1vZCA9IE1vZHVsZVR5cGUobmFtZSkKICAgICAgICAgICAgb2JqcyA9IGZhY3RvcnkoYmFzZU1vZHVsZSwgKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICBtb2QuX19kaWN0X18udXBkYXRlKG9ianMpCiAgICAgICAgICAgIGlmICJuYW1lIiBub3QgaW4gbW9kdWxlQ2FjaGU6CiAgICAgICAgICAgICAgICBtb2R1bGVDYWNoZVtuYW1lXSA9IHt9CiAgICAgICAgICAgIGlmICJhcmdzIiBub3QgaW4gbW9kdWxlQ2FjaGVbbmFtZV06CiAgICAgICAgICAgICAgICBtb2R1bGVDYWNoZVtuYW1lXVthcmdzXSA9IHt9CiAgICAgICAgICAgIGlmICJrd2FyZ3MiIG5vdCBpbiBtb2R1bGVDYWNoZVtuYW1lXVthcmdzXToKICAgICAgICAgICAgICAgIG1vZHVsZUNhY2hlW25hbWVdW2FyZ3NdW2t3YXJnc190dXBsZV0gPSB7fQogICAgICAgICAgICBtb2R1bGVDYWNoZVtuYW1lXVthcmdzXVtrd2FyZ3NfdHVwbGVdID0gbW9kCiAgICAgICAgICAgIHJldHVybiBtb2QKCiAgICByZXR1cm4gbW9kdWxlRmFjdG9yeQoKCmRlZiBtZW1vaXplKGZ1bmMpOgogICAgY2FjaGUgPSB7fQoKICAgIGRlZiB3cmFwcGVkKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAga2V5ID0gKHR1cGxlKGFyZ3MpLCB0dXBsZShrd2FyZ3MuaXRlbXMoKSkpCiAgICAgICAgaWYga2V5IG5vdCBpbiBjYWNoZToKICAgICAgICAgICAgY2FjaGVba2V5XSA9IGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHJldHVybiBjYWNoZVtrZXldCgogICAgcmV0dXJuIHdyYXBwZWQKUEsDBBQAAAAAAAAAIQDIpH3+u0UBALtFAQAxAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2NvbnN0YW50cy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IHN0cmluZwoKRU9GID0gTm9uZQoKRSA9IHsKICAgICJudWxsLWNoYXJhY3RlciI6CiAgICAgICAgIk51bGwgY2hhcmFjdGVyIGluIGlucHV0IHN0cmVhbSwgcmVwbGFjZWQgd2l0aCBVK0ZGRkQuIiwKICAgICJpbnZhbGlkLWNvZGVwb2ludCI6CiAgICAgICAgIkludmFsaWQgY29kZXBvaW50IGluIHN0cmVhbS4iLAogICAgImluY29ycmVjdGx5LXBsYWNlZC1zb2xpZHVzIjoKICAgICAgICAiU29saWR1cyAoLykgaW5jb3JyZWN0bHkgcGxhY2VkIGluIHRhZy4iLAogICAgImluY29ycmVjdC1jci1uZXdsaW5lLWVudGl0eSI6CiAgICAgICAgIkluY29ycmVjdCBDUiBuZXdsaW5lIGVudGl0eSwgcmVwbGFjZWQgd2l0aCBMRi4iLAogICAgImlsbGVnYWwtd2luZG93cy0xMjUyLWVudGl0eSI6CiAgICAgICAgIkVudGl0eSB1c2VkIHdpdGggaWxsZWdhbCBudW1iZXIgKHdpbmRvd3MtMTI1MiByZWZlcmVuY2UpLiIsCiAgICAiY2FudC1jb252ZXJ0LW51bWVyaWMtZW50aXR5IjoKICAgICAgICAiTnVtZXJpYyBlbnRpdHkgY291bGRuJ3QgYmUgY29udmVydGVkIHRvIGNoYXJhY3RlciAiCiAgICAgICAgIihjb2RlcG9pbnQgVSslKGNoYXJBc0ludCkwOHgpLiIsCiAgICAiaWxsZWdhbC1jb2RlcG9pbnQtZm9yLW51bWVyaWMtZW50aXR5IjoKICAgICAgICAiTnVtZXJpYyBlbnRpdHkgcmVwcmVzZW50cyBhbiBpbGxlZ2FsIGNvZGVwb2ludDogIgogICAgICAgICJVKyUoY2hhckFzSW50KTA4eC4iLAogICAgIm51bWVyaWMtZW50aXR5LXdpdGhvdXQtc2VtaWNvbG9uIjoKICAgICAgICAiTnVtZXJpYyBlbnRpdHkgZGlkbid0IGVuZCB3aXRoICc7Jy4iLAogICAgImV4cGVjdGVkLW51bWVyaWMtZW50aXR5LWJ1dC1nb3QtZW9mIjoKICAgICAgICAiTnVtZXJpYyBlbnRpdHkgZXhwZWN0ZWQuIEdvdCBlbmQgb2YgZmlsZSBpbnN0ZWFkLiIsCiAgICAiZXhwZWN0ZWQtbnVtZXJpYy1lbnRpdHkiOgogICAgICAgICJOdW1lcmljIGVudGl0eSBleHBlY3RlZCBidXQgbm9uZSBmb3VuZC4iLAogICAgIm5hbWVkLWVudGl0eS13aXRob3V0LXNlbWljb2xvbiI6CiAgICAgICAgIk5hbWVkIGVudGl0eSBkaWRuJ3QgZW5kIHdpdGggJzsnLiIsCiAgICAiZXhwZWN0ZWQtbmFtZWQtZW50aXR5IjoKICAgICAgICAiTmFtZWQgZW50aXR5IGV4cGVjdGVkLiBHb3Qgbm9uZS4iLAogICAgImF0dHJpYnV0ZXMtaW4tZW5kLXRhZyI6CiAgICAgICAgIkVuZCB0YWcgY29udGFpbnMgdW5leHBlY3RlZCBhdHRyaWJ1dGVzLiIsCiAgICAnc2VsZi1jbG9zaW5nLWZsYWctb24tZW5kLXRhZyc6CiAgICAgICAgIkVuZCB0YWcgY29udGFpbnMgdW5leHBlY3RlZCBzZWxmLWNsb3NpbmcgZmxhZy4iLAogICAgImV4cGVjdGVkLXRhZy1uYW1lLWJ1dC1nb3QtcmlnaHQtYnJhY2tldCI6CiAgICAgICAgIkV4cGVjdGVkIHRhZyBuYW1lLiBHb3QgJz4nIGluc3RlYWQuIiwKICAgICJleHBlY3RlZC10YWctbmFtZS1idXQtZ290LXF1ZXN0aW9uLW1hcmsiOgogICAgICAgICJFeHBlY3RlZCB0YWcgbmFtZS4gR290ICc/JyBpbnN0ZWFkLiAoSFRNTCBkb2Vzbid0ICIKICAgICAgICAic3VwcG9ydCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucy4pIiwKICAgICJleHBlY3RlZC10YWctbmFtZSI6CiAgICAgICAgIkV4cGVjdGVkIHRhZyBuYW1lLiBHb3Qgc29tZXRoaW5nIGVsc2UgaW5zdGVhZCIsCiAgICAiZXhwZWN0ZWQtY2xvc2luZy10YWctYnV0LWdvdC1yaWdodC1icmFja2V0IjoKICAgICAgICAiRXhwZWN0ZWQgY2xvc2luZyB0YWcuIEdvdCAnPicgaW5zdGVhZC4gSWdub3JpbmcgJzwvPicuIiwKICAgICJleHBlY3RlZC1jbG9zaW5nLXRhZy1idXQtZ290LWVvZiI6CiAgICAgICAgIkV4cGVjdGVkIGNsb3NpbmcgdGFnLiBVbmV4cGVjdGVkIGVuZCBvZiBmaWxlLiIsCiAgICAiZXhwZWN0ZWQtY2xvc2luZy10YWctYnV0LWdvdC1jaGFyIjoKICAgICAgICAiRXhwZWN0ZWQgY2xvc2luZyB0YWcuIFVuZXhwZWN0ZWQgY2hhcmFjdGVyICclKGRhdGEpcycgZm91bmQuIiwKICAgICJlb2YtaW4tdGFnLW5hbWUiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIHRoZSB0YWcgbmFtZS4iLAogICAgImV4cGVjdGVkLWF0dHJpYnV0ZS1uYW1lLWJ1dC1nb3QtZW9mIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gRXhwZWN0ZWQgYXR0cmlidXRlIG5hbWUgaW5zdGVhZC4iLAogICAgImVvZi1pbi1hdHRyaWJ1dGUtbmFtZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gYXR0cmlidXRlIG5hbWUuIiwKICAgICJpbnZhbGlkLWNoYXJhY3Rlci1pbi1hdHRyaWJ1dGUtbmFtZSI6CiAgICAgICAgIkludmFsaWQgY2hhcmFjdGVyIGluIGF0dHJpYnV0ZSBuYW1lIiwKICAgICJkdXBsaWNhdGUtYXR0cmlidXRlIjoKICAgICAgICAiRHJvcHBlZCBkdXBsaWNhdGUgYXR0cmlidXRlIG9uIHRhZy4iLAogICAgImV4cGVjdGVkLWVuZC1vZi10YWctbmFtZS1idXQtZ290LWVvZiI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkID0gb3IgZW5kIG9mIHRhZy4iLAogICAgImV4cGVjdGVkLWF0dHJpYnV0ZS12YWx1ZS1idXQtZ290LWVvZiI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkIGF0dHJpYnV0ZSB2YWx1ZS4iLAogICAgImV4cGVjdGVkLWF0dHJpYnV0ZS12YWx1ZS1idXQtZ290LXJpZ2h0LWJyYWNrZXQiOgogICAgICAgICJFeHBlY3RlZCBhdHRyaWJ1dGUgdmFsdWUuIEdvdCAnPicgaW5zdGVhZC4iLAogICAgJ2VxdWFscy1pbi11bnF1b3RlZC1hdHRyaWJ1dGUtdmFsdWUnOgogICAgICAgICJVbmV4cGVjdGVkID0gaW4gdW5xdW90ZWQgYXR0cmlidXRlIiwKICAgICd1bmV4cGVjdGVkLWNoYXJhY3Rlci1pbi11bnF1b3RlZC1hdHRyaWJ1dGUtdmFsdWUnOgogICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlciBpbiB1bnF1b3RlZCBhdHRyaWJ1dGUiLAogICAgImludmFsaWQtY2hhcmFjdGVyLWFmdGVyLWF0dHJpYnV0ZS1uYW1lIjoKICAgICAgICAiVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgYXR0cmlidXRlIG5hbWUuIiwKICAgICJ1bmV4cGVjdGVkLWNoYXJhY3Rlci1hZnRlci1hdHRyaWJ1dGUtdmFsdWUiOgogICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciBhdHRyaWJ1dGUgdmFsdWUuIiwKICAgICJlb2YtaW4tYXR0cmlidXRlLXZhbHVlLWRvdWJsZS1xdW90ZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gYXR0cmlidXRlIHZhbHVlIChcIikuIiwKICAgICJlb2YtaW4tYXR0cmlidXRlLXZhbHVlLXNpbmdsZS1xdW90ZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gYXR0cmlidXRlIHZhbHVlICgnKS4iLAogICAgImVvZi1pbi1hdHRyaWJ1dGUtdmFsdWUtbm8tcXVvdGVzIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBhdHRyaWJ1dGUgdmFsdWUuIiwKICAgICJ1bmV4cGVjdGVkLUVPRi1hZnRlci1zb2xpZHVzLWluLXRhZyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gdGFnLiBFeHBlY3RlZCA+IiwKICAgICJ1bmV4cGVjdGVkLWNoYXJhY3Rlci1hZnRlci1zb2xpZHVzLWluLXRhZyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIC8gaW4gdGFnLiBFeHBlY3RlZCA+IiwKICAgICJleHBlY3RlZC1kYXNoZXMtb3ItZG9jdHlwZSI6CiAgICAgICAgIkV4cGVjdGVkICctLScgb3IgJ0RPQ1RZUEUnLiBOb3QgZm91bmQuIiwKICAgICJ1bmV4cGVjdGVkLWJhbmctYWZ0ZXItZG91YmxlLWRhc2gtaW4tY29tbWVudCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgISBhZnRlciAtLSBpbiBjb21tZW50IiwKICAgICJ1bmV4cGVjdGVkLXNwYWNlLWFmdGVyLWRvdWJsZS1kYXNoLWluLWNvbW1lbnQiOgogICAgICAgICJVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIC0tIGluIGNvbW1lbnQiLAogICAgImluY29ycmVjdC1jb21tZW50IjoKICAgICAgICAiSW5jb3JyZWN0IGNvbW1lbnQuIiwKICAgICJlb2YtaW4tY29tbWVudCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gY29tbWVudC4iLAogICAgImVvZi1pbi1jb21tZW50LWVuZC1kYXNoIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBjb21tZW50ICgtKSIsCiAgICAidW5leHBlY3RlZC1kYXNoLWFmdGVyLWRvdWJsZS1kYXNoLWluLWNvbW1lbnQiOgogICAgICAgICJVbmV4cGVjdGVkICctJyBhZnRlciAnLS0nIGZvdW5kIGluIGNvbW1lbnQuIiwKICAgICJlb2YtaW4tY29tbWVudC1kb3VibGUtZGFzaCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gY29tbWVudCAoLS0pLiIsCiAgICAiZW9mLWluLWNvbW1lbnQtZW5kLXNwYWNlLXN0YXRlIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBjb21tZW50LiIsCiAgICAiZW9mLWluLWNvbW1lbnQtZW5kLWJhbmctc3RhdGUiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGNvbW1lbnQuIiwKICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tY29tbWVudCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyIGluIGNvbW1lbnQgZm91bmQuIiwKICAgICJuZWVkLXNwYWNlLWFmdGVyLWRvY3R5cGUiOgogICAgICAgICJObyBzcGFjZSBhZnRlciBsaXRlcmFsIHN0cmluZyAnRE9DVFlQRScuIiwKICAgICJleHBlY3RlZC1kb2N0eXBlLW5hbWUtYnV0LWdvdC1yaWdodC1icmFja2V0IjoKICAgICAgICAiVW5leHBlY3RlZCA+IGNoYXJhY3Rlci4gRXhwZWN0ZWQgRE9DVFlQRSBuYW1lLiIsCiAgICAiZXhwZWN0ZWQtZG9jdHlwZS1uYW1lLWJ1dC1nb3QtZW9mIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gRXhwZWN0ZWQgRE9DVFlQRSBuYW1lLiIsCiAgICAiZW9mLWluLWRvY3R5cGUtbmFtZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gRE9DVFlQRSBuYW1lLiIsCiAgICAiZW9mLWluLWRvY3R5cGUiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIERPQ1RZUEUuIiwKICAgICJleHBlY3RlZC1zcGFjZS1vci1yaWdodC1icmFja2V0LWluLWRvY3R5cGUiOgogICAgICAgICJFeHBlY3RlZCBzcGFjZSBvciAnPicuIEdvdCAnJShkYXRhKXMnIiwKICAgICJ1bmV4cGVjdGVkLWVuZC1vZi1kb2N0eXBlIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgRE9DVFlQRS4iLAogICAgInVuZXhwZWN0ZWQtY2hhci1pbi1kb2N0eXBlIjoKICAgICAgICAiVW5leHBlY3RlZCBjaGFyYWN0ZXIgaW4gRE9DVFlQRS4iLAogICAgImVvZi1pbi1pbm5lcmh0bWwiOgogICAgICAgICJYWFggaW5uZXJIVE1MIEVPRiIsCiAgICAidW5leHBlY3RlZC1kb2N0eXBlIjoKICAgICAgICAiVW5leHBlY3RlZCBET0NUWVBFLiBJZ25vcmVkLiIsCiAgICAibm9uLWh0bWwtcm9vdCI6CiAgICAgICAgImh0bWwgbmVlZHMgdG8gYmUgdGhlIGZpcnN0IHN0YXJ0IHRhZy4iLAogICAgImV4cGVjdGVkLWRvY3R5cGUtYnV0LWdvdC1lb2YiOgogICAgICAgICJVbmV4cGVjdGVkIEVuZCBvZiBmaWxlLiBFeHBlY3RlZCBET0NUWVBFLiIsCiAgICAidW5rbm93bi1kb2N0eXBlIjoKICAgICAgICAiRXJyb25lb3VzIERPQ1RZUEUuIiwKICAgICJleHBlY3RlZC1kb2N0eXBlLWJ1dC1nb3QtY2hhcnMiOgogICAgICAgICJVbmV4cGVjdGVkIG5vbi1zcGFjZSBjaGFyYWN0ZXJzLiBFeHBlY3RlZCBET0NUWVBFLiIsCiAgICAiZXhwZWN0ZWQtZG9jdHlwZS1idXQtZ290LXN0YXJ0LXRhZyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnICglKG5hbWUpcykuIEV4cGVjdGVkIERPQ1RZUEUuIiwKICAgICJleHBlY3RlZC1kb2N0eXBlLWJ1dC1nb3QtZW5kLXRhZyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShuYW1lKXMpLiBFeHBlY3RlZCBET0NUWVBFLiIsCiAgICAiZW5kLXRhZy1hZnRlci1pbXBsaWVkLXJvb3QiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUobmFtZSlzKSBhZnRlciB0aGUgKGltcGxpZWQpIHJvb3QgZWxlbWVudC4iLAogICAgImV4cGVjdGVkLW5hbWVkLWNsb3NpbmctdGFnLWJ1dC1nb3QtZW9mIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gRXhwZWN0ZWQgZW5kIHRhZyAoJShuYW1lKXMpLiIsCiAgICAidHdvLWhlYWRzLWFyZS1ub3QtYmV0dGVyLXRoYW4tb25lIjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgaGVhZCBpbiBleGlzdGluZyBoZWFkLiBJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1lbmQtdGFnIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG5hbWUpcykuIElnbm9yZWQuIiwKICAgICJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1vdXQtb2YtbXktaGVhZCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnICglKG5hbWUpcykgdGhhdCBjYW4gYmUgaW4gaGVhZC4gTW92ZWQuIiwKICAgICJ1bmV4cGVjdGVkLXN0YXJ0LXRhZyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnICglKG5hbWUpcykuIiwKICAgICJtaXNzaW5nLWVuZC10YWciOgogICAgICAgICJNaXNzaW5nIGVuZCB0YWcgKCUobmFtZSlzKS4iLAogICAgIm1pc3NpbmctZW5kLXRhZ3MiOgogICAgICAgICJNaXNzaW5nIGVuZCB0YWdzICglKG5hbWUpcykuIiwKICAgICJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbXBsaWVzLWVuZC10YWciOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyAoJShzdGFydE5hbWUpcykgIgogICAgICAgICJpbXBsaWVzIGVuZCB0YWcgKCUoZW5kTmFtZSlzKS4iLAogICAgInVuZXhwZWN0ZWQtc3RhcnQtdGFnLXRyZWF0ZWQtYXMiOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyAoJShvcmlnaW5hbE5hbWUpcykuIFRyZWF0ZWQgYXMgJShuZXdOYW1lKXMuIiwKICAgICJkZXByZWNhdGVkLXRhZyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnICUobmFtZSlzLiBEb24ndCB1c2UgaXQhIiwKICAgICJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pZ25vcmVkIjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgJShuYW1lKXMuIElnbm9yZWQuIiwKICAgICJleHBlY3RlZC1vbmUtZW5kLXRhZy1idXQtZ290LWFub3RoZXIiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUoZ290TmFtZSlzKS4gIgogICAgICAgICJNaXNzaW5nIGVuZCB0YWcgKCUoZXhwZWN0ZWROYW1lKXMpLiIsCiAgICAiZW5kLXRhZy10b28tZWFybHkiOgogICAgICAgICJFbmQgdGFnICglKG5hbWUpcykgc2VlbiB0b28gZWFybHkuIEV4cGVjdGVkIG90aGVyIGVuZCB0YWcuIiwKICAgICJlbmQtdGFnLXRvby1lYXJseS1uYW1lZCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShnb3ROYW1lKXMpLiBFeHBlY3RlZCBlbmQgdGFnICglKGV4cGVjdGVkTmFtZSlzKS4iLAogICAgImVuZC10YWctdG9vLWVhcmx5LWlnbm9yZWQiOgogICAgICAgICJFbmQgdGFnICglKG5hbWUpcykgc2VlbiB0b28gZWFybHkuIElnbm9yZWQuIiwKICAgICJhZG9wdGlvbi1hZ2VuY3ktMS4xIjoKICAgICAgICAiRW5kIHRhZyAoJShuYW1lKXMpIHZpb2xhdGVzIHN0ZXAgMSwgIgogICAgICAgICJwYXJhZ3JhcGggMSBvZiB0aGUgYWRvcHRpb24gYWdlbmN5IGFsZ29yaXRobS4iLAogICAgImFkb3B0aW9uLWFnZW5jeS0xLjIiOgogICAgICAgICJFbmQgdGFnICglKG5hbWUpcykgdmlvbGF0ZXMgc3RlcCAxLCAiCiAgICAgICAgInBhcmFncmFwaCAyIG9mIHRoZSBhZG9wdGlvbiBhZ2VuY3kgYWxnb3JpdGhtLiIsCiAgICAiYWRvcHRpb24tYWdlbmN5LTEuMyI6CiAgICAgICAgIkVuZCB0YWcgKCUobmFtZSlzKSB2aW9sYXRlcyBzdGVwIDEsICIKICAgICAgICAicGFyYWdyYXBoIDMgb2YgdGhlIGFkb3B0aW9uIGFnZW5jeSBhbGdvcml0aG0uIiwKICAgICJhZG9wdGlvbi1hZ2VuY3ktNC40IjoKICAgICAgICAiRW5kIHRhZyAoJShuYW1lKXMpIHZpb2xhdGVzIHN0ZXAgNCwgIgogICAgICAgICJwYXJhZ3JhcGggNCBvZiB0aGUgYWRvcHRpb24gYWdlbmN5IGFsZ29yaXRobS4iLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZy10cmVhdGVkLWFzIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG9yaWdpbmFsTmFtZSlzKS4gVHJlYXRlZCBhcyAlKG5ld05hbWUpcy4iLAogICAgIm5vLWVuZC10YWciOgogICAgICAgICJUaGlzIGVsZW1lbnQgKCUobmFtZSlzKSBoYXMgbm8gZW5kIHRhZy4iLAogICAgInVuZXhwZWN0ZWQtaW1wbGllZC1lbmQtdGFnLWluLXRhYmxlIjoKICAgICAgICAiVW5leHBlY3RlZCBpbXBsaWVkIGVuZCB0YWcgKCUobmFtZSlzKSBpbiB0aGUgdGFibGUgcGhhc2UuIiwKICAgICJ1bmV4cGVjdGVkLWltcGxpZWQtZW5kLXRhZy1pbi10YWJsZS1ib2R5IjoKICAgICAgICAiVW5leHBlY3RlZCBpbXBsaWVkIGVuZCB0YWcgKCUobmFtZSlzKSBpbiB0aGUgdGFibGUgYm9keSBwaGFzZS4iLAogICAgInVuZXhwZWN0ZWQtY2hhci1pbXBsaWVzLXRhYmxlLXZvb2RvbyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgbm9uLXNwYWNlIGNoYXJhY3RlcnMgaW4gIgogICAgICAgICJ0YWJsZSBjb250ZXh0IGNhdXNlZCB2b29kb28gbW9kZS4iLAogICAgInVuZXhwZWN0ZWQtaGlkZGVuLWlucHV0LWluLXRhYmxlIjoKICAgICAgICAiVW5leHBlY3RlZCBpbnB1dCB3aXRoIHR5cGUgaGlkZGVuIGluIHRhYmxlIGNvbnRleHQuIiwKICAgICJ1bmV4cGVjdGVkLWZvcm0taW4tdGFibGUiOgogICAgICAgICJVbmV4cGVjdGVkIGZvcm0gaW4gdGFibGUgY29udGV4dC4iLAogICAgInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWltcGxpZXMtdGFibGUtdm9vZG9vIjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgKCUobmFtZSlzKSBpbiAiCiAgICAgICAgInRhYmxlIGNvbnRleHQgY2F1c2VkIHZvb2RvbyBtb2RlLiIsCiAgICAidW5leHBlY3RlZC1lbmQtdGFnLWltcGxpZXMtdGFibGUtdm9vZG9vIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG5hbWUpcykgaW4gIgogICAgICAgICJ0YWJsZSBjb250ZXh0IGNhdXNlZCB2b29kb28gbW9kZS4iLAogICAgInVuZXhwZWN0ZWQtY2VsbC1pbi10YWJsZS1ib2R5IjoKICAgICAgICAiVW5leHBlY3RlZCB0YWJsZSBjZWxsIHN0YXJ0IHRhZyAoJShuYW1lKXMpICIKICAgICAgICAiaW4gdGhlIHRhYmxlIGJvZHkgcGhhc2UuIiwKICAgICJ1bmV4cGVjdGVkLWNlbGwtZW5kLXRhZyI6CiAgICAgICAgIkdvdCB0YWJsZSBjZWxsIGVuZCB0YWcgKCUobmFtZSlzKSAiCiAgICAgICAgIndoaWxlIHJlcXVpcmVkIGVuZCB0YWdzIGFyZSBtaXNzaW5nLiIsCiAgICAidW5leHBlY3RlZC1lbmQtdGFnLWluLXRhYmxlLWJvZHkiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUobmFtZSlzKSBpbiB0aGUgdGFibGUgYm9keSBwaGFzZS4gSWdub3JlZC4iLAogICAgInVuZXhwZWN0ZWQtaW1wbGllZC1lbmQtdGFnLWluLXRhYmxlLXJvdyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgaW1wbGllZCBlbmQgdGFnICglKG5hbWUpcykgaW4gdGhlIHRhYmxlIHJvdyBwaGFzZS4iLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi10YWJsZS1yb3ciOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUobmFtZSlzKSBpbiB0aGUgdGFibGUgcm93IHBoYXNlLiBJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1zZWxlY3QtaW4tc2VsZWN0IjoKICAgICAgICAiVW5leHBlY3RlZCBzZWxlY3Qgc3RhcnQgdGFnIGluIHRoZSBzZWxlY3QgcGhhc2UgIgogICAgICAgICJ0cmVhdGVkIGFzIHNlbGVjdCBlbmQgdGFnLiIsCiAgICAidW5leHBlY3RlZC1pbnB1dC1pbi1zZWxlY3QiOgogICAgICAgICJVbmV4cGVjdGVkIGlucHV0IHN0YXJ0IHRhZyBpbiB0aGUgc2VsZWN0IHBoYXNlLiIsCiAgICAidW5leHBlY3RlZC1zdGFydC10YWctaW4tc2VsZWN0IjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgdG9rZW4gKCUobmFtZSlzIGluIHRoZSBzZWxlY3QgcGhhc2UuICIKICAgICAgICAiSWdub3JlZC4iLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi1zZWxlY3QiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUobmFtZSlzKSBpbiB0aGUgc2VsZWN0IHBoYXNlLiBJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC10YWJsZS1lbGVtZW50LXN0YXJ0LXRhZy1pbi1zZWxlY3QtaW4tdGFibGUiOgogICAgICAgICJVbmV4cGVjdGVkIHRhYmxlIGVsZW1lbnQgc3RhcnQgdGFnICglKG5hbWUpcykgaW4gdGhlIHNlbGVjdCBpbiB0YWJsZSBwaGFzZS4iLAogICAgInVuZXhwZWN0ZWQtdGFibGUtZWxlbWVudC1lbmQtdGFnLWluLXNlbGVjdC1pbi10YWJsZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgdGFibGUgZWxlbWVudCBlbmQgdGFnICglKG5hbWUpcykgaW4gdGhlIHNlbGVjdCBpbiB0YWJsZSBwaGFzZS4iLAogICAgInVuZXhwZWN0ZWQtY2hhci1hZnRlci1ib2R5IjoKICAgICAgICAiVW5leHBlY3RlZCBub24tc3BhY2UgY2hhcmFjdGVycyBpbiB0aGUgYWZ0ZXIgYm9keSBwaGFzZS4iLAogICAgInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWFmdGVyLWJvZHkiOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyB0b2tlbiAoJShuYW1lKXMpIgogICAgICAgICIgaW4gdGhlIGFmdGVyIGJvZHkgcGhhc2UuIiwKICAgICJ1bmV4cGVjdGVkLWVuZC10YWctYWZ0ZXItYm9keSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyB0b2tlbiAoJShuYW1lKXMpIgogICAgICAgICIgaW4gdGhlIGFmdGVyIGJvZHkgcGhhc2UuIiwKICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZnJhbWVzZXQiOgogICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlcnMgaW4gdGhlIGZyYW1lc2V0IHBoYXNlLiBDaGFyYWN0ZXJzIGlnbm9yZWQuIiwKICAgICJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbi1mcmFtZXNldCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnIHRva2VuICglKG5hbWUpcykiCiAgICAgICAgIiBpbiB0aGUgZnJhbWVzZXQgcGhhc2UuIElnbm9yZWQuIiwKICAgICJ1bmV4cGVjdGVkLWZyYW1lc2V0LWluLWZyYW1lc2V0LWlubmVyaHRtbCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyB0b2tlbiAoZnJhbWVzZXQpICIKICAgICAgICAiaW4gdGhlIGZyYW1lc2V0IHBoYXNlIChpbm5lckhUTUwpLiIsCiAgICAidW5leHBlY3RlZC1lbmQtdGFnLWluLWZyYW1lc2V0IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnIHRva2VuICglKG5hbWUpcykiCiAgICAgICAgIiBpbiB0aGUgZnJhbWVzZXQgcGhhc2UuIElnbm9yZWQuIiwKICAgICJ1bmV4cGVjdGVkLWNoYXItYWZ0ZXItZnJhbWVzZXQiOgogICAgICAgICJVbmV4cGVjdGVkIG5vbi1zcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSAiCiAgICAgICAgImFmdGVyIGZyYW1lc2V0IHBoYXNlLiBJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1zdGFydC10YWctYWZ0ZXItZnJhbWVzZXQiOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyAoJShuYW1lKXMpIgogICAgICAgICIgaW4gdGhlIGFmdGVyIGZyYW1lc2V0IHBoYXNlLiBJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1lbmQtdGFnLWFmdGVyLWZyYW1lc2V0IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG5hbWUpcykiCiAgICAgICAgIiBpbiB0aGUgYWZ0ZXIgZnJhbWVzZXQgcGhhc2UuIElnbm9yZWQuIiwKICAgICJ1bmV4cGVjdGVkLWVuZC10YWctYWZ0ZXItYm9keS1pbm5lcmh0bWwiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgYWZ0ZXIgYm9keShpbm5lckh0bWwpIiwKICAgICJleHBlY3RlZC1lb2YtYnV0LWdvdC1jaGFyIjoKICAgICAgICAiVW5leHBlY3RlZCBub24tc3BhY2UgY2hhcmFjdGVycy4gRXhwZWN0ZWQgZW5kIG9mIGZpbGUuIiwKICAgICJleHBlY3RlZC1lb2YtYnV0LWdvdC1zdGFydC10YWciOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyAoJShuYW1lKXMpIgogICAgICAgICIuIEV4cGVjdGVkIGVuZCBvZiBmaWxlLiIsCiAgICAiZXhwZWN0ZWQtZW9mLWJ1dC1nb3QtZW5kLXRhZyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShuYW1lKXMpIgogICAgICAgICIuIEV4cGVjdGVkIGVuZCBvZiBmaWxlLiIsCiAgICAiZW9mLWluLXRhYmxlIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gRXhwZWN0ZWQgdGFibGUgY29udGVudC4iLAogICAgImVvZi1pbi1zZWxlY3QiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlLiBFeHBlY3RlZCBzZWxlY3QgY29udGVudC4iLAogICAgImVvZi1pbi1mcmFtZXNldCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkIGZyYW1lc2V0IGNvbnRlbnQuIiwKICAgICJlb2YtaW4tc2NyaXB0LWluLXNjcmlwdCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkIHNjcmlwdCBjb250ZW50LiIsCiAgICAiZW9mLWluLWZvcmVpZ24tbGFuZHMiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlLiBFeHBlY3RlZCBmb3JlaWduIGNvbnRlbnQiLAogICAgIm5vbi12b2lkLWVsZW1lbnQtd2l0aC10cmFpbGluZy1zb2xpZHVzIjoKICAgICAgICAiVHJhaWxpbmcgc29saWR1cyBub3QgYWxsb3dlZCBvbiBlbGVtZW50ICUobmFtZSlzIiwKICAgICJ1bmV4cGVjdGVkLWh0bWwtZWxlbWVudC1pbi1mb3JlaWduLWNvbnRlbnQiOgogICAgICAgICJFbGVtZW50ICUobmFtZSlzIG5vdCBhbGxvd2VkIGluIGEgbm9uLWh0bWwgY29udGV4dCIsCiAgICAidW5leHBlY3RlZC1lbmQtdGFnLWJlZm9yZS1odG1sIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG5hbWUpcykgYmVmb3JlIGh0bWwuIiwKICAgICJ1bmV4cGVjdGVkLWluaGVhZC1ub3NjcmlwdC10YWciOgogICAgICAgICJFbGVtZW50ICUobmFtZSlzIG5vdCBhbGxvd2VkIGluIGEgaW5oZWFkLW5vc2NyaXB0IGNvbnRleHQiLAogICAgImVvZi1pbi1oZWFkLW5vc2NyaXB0IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gRXhwZWN0ZWQgaW5oZWFkLW5vc2NyaXB0IGNvbnRlbnQiLAogICAgImNoYXItaW4taGVhZC1ub3NjcmlwdCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgbm9uLXNwYWNlIGNoYXJhY3Rlci4gRXhwZWN0ZWQgaW5oZWFkLW5vc2NyaXB0IGNvbnRlbnQiLAogICAgIlhYWC11bmRlZmluZWQtZXJyb3IiOgogICAgICAgICJVbmRlZmluZWQgZXJyb3IgKHRoaXMgc3Vja3MgYW5kIHNob3VsZCBiZSBmaXhlZCkiLAp9CgpuYW1lc3BhY2VzID0gewogICAgImh0bWwiOiAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsCiAgICAibWF0aG1sIjogImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiLAogICAgInN2ZyI6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsCiAgICAieGxpbmsiOiAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsCiAgICAieG1sIjogImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsCiAgICAieG1sbnMiOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iCn0KCnNjb3BpbmdFbGVtZW50cyA9IGZyb3plbnNldChbCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYXBwbGV0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiY2FwdGlvbiIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImh0bWwiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJtYXJxdWVlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAib2JqZWN0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGFibGUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0ZCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRoIiksCiAgICAobmFtZXNwYWNlc1sibWF0aG1sIl0sICJtaSIpLAogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAibW8iKSwKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgIm1uIiksCiAgICAobmFtZXNwYWNlc1sibWF0aG1sIl0sICJtcyIpLAogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAibXRleHQiKSwKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgImFubm90YXRpb24teG1sIiksCiAgICAobmFtZXNwYWNlc1sic3ZnIl0sICJmb3JlaWduT2JqZWN0IiksCiAgICAobmFtZXNwYWNlc1sic3ZnIl0sICJkZXNjIiksCiAgICAobmFtZXNwYWNlc1sic3ZnIl0sICJ0aXRsZSIpLApdKQoKZm9ybWF0dGluZ0VsZW1lbnRzID0gZnJvemVuc2V0KFsKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJhIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYiIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImJpZyIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImNvZGUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJlbSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImZvbnQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJpIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibm9iciIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInMiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJzbWFsbCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInN0cmlrZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInN0cm9uZyIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInR0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidSIpCl0pCgpzcGVjaWFsRWxlbWVudHMgPSBmcm96ZW5zZXQoWwogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImFkZHJlc3MiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJhcHBsZXQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJhcmVhIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYXJ0aWNsZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImFzaWRlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYmFzZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImJhc2Vmb250IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYmdzb3VuZCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImJsb2NrcXVvdGUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJib2R5IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYnIiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJidXR0b24iKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJjYXB0aW9uIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiY2VudGVyIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiY29sIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiY29sZ3JvdXAiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJjb21tYW5kIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZGQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJkZXRhaWxzIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZGlyIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZGl2IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZGwiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJkdCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImVtYmVkIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZmllbGRzZXQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJmaWd1cmUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJmb290ZXIiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJmb3JtIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZnJhbWUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJmcmFtZXNldCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImgxIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaDIiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJoMyIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImg0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaDUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJoNiIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImhlYWQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJoZWFkZXIiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJociIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImh0bWwiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJpZnJhbWUiKSwKICAgICMgTm90ZSB0aGF0IGltYWdlIGlzIGNvbW1lbnRlZCBvdXQgaW4gdGhlIHNwZWMgYXMgInRoaXMgaXNuJ3QgYW4KICAgICMgZWxlbWVudCB0aGF0IGNhbiBlbmQgdXAgb24gdGhlIHN0YWNrLCBzbyBpdCBkb2Vzbid0IG1hdHRlciwiCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaW1hZ2UiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJpbWciKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJpbnB1dCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImlzaW5kZXgiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJsaSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImxpbmsiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJsaXN0aW5nIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibWFycXVlZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm1lbnUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJtZXRhIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibmF2IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibm9lbWJlZCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm5vZnJhbWVzIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibm9zY3JpcHQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJvYmplY3QiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJvbCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInAiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJwYXJhbSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInBsYWludGV4dCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInByZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInNjcmlwdCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInNlY3Rpb24iKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJzZWxlY3QiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJzdHlsZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRhYmxlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGJvZHkiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0ZCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRleHRhcmVhIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGZvb3QiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0aCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRoZWFkIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGl0bGUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0ciIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInVsIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAid2JyIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAieG1wIiksCiAgICAobmFtZXNwYWNlc1sic3ZnIl0sICJmb3JlaWduT2JqZWN0IikKXSkKCmh0bWxJbnRlZ3JhdGlvblBvaW50RWxlbWVudHMgPSBmcm96ZW5zZXQoWwogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAiYW5ub3RhaW9uLXhtbCIpLAogICAgKG5hbWVzcGFjZXNbInN2ZyJdLCAiZm9yZWlnbk9iamVjdCIpLAogICAgKG5hbWVzcGFjZXNbInN2ZyJdLCAiZGVzYyIpLAogICAgKG5hbWVzcGFjZXNbInN2ZyJdLCAidGl0bGUiKQpdKQoKbWF0aG1sVGV4dEludGVncmF0aW9uUG9pbnRFbGVtZW50cyA9IGZyb3plbnNldChbCiAgICAobmFtZXNwYWNlc1sibWF0aG1sIl0sICJtaSIpLAogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAibW8iKSwKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgIm1uIiksCiAgICAobmFtZXNwYWNlc1sibWF0aG1sIl0sICJtcyIpLAogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAibXRleHQiKQpdKQoKYWRqdXN0U1ZHQXR0cmlidXRlcyA9IHsKICAgICJhdHRyaWJ1dGVuYW1lIjogImF0dHJpYnV0ZU5hbWUiLAogICAgImF0dHJpYnV0ZXR5cGUiOiAiYXR0cmlidXRlVHlwZSIsCiAgICAiYmFzZWZyZXF1ZW5jeSI6ICJiYXNlRnJlcXVlbmN5IiwKICAgICJiYXNlcHJvZmlsZSI6ICJiYXNlUHJvZmlsZSIsCiAgICAiY2FsY21vZGUiOiAiY2FsY01vZGUiLAogICAgImNsaXBwYXRodW5pdHMiOiAiY2xpcFBhdGhVbml0cyIsCiAgICAiY29udGVudHNjcmlwdHR5cGUiOiAiY29udGVudFNjcmlwdFR5cGUiLAogICAgImNvbnRlbnRzdHlsZXR5cGUiOiAiY29udGVudFN0eWxlVHlwZSIsCiAgICAiZGlmZnVzZWNvbnN0YW50IjogImRpZmZ1c2VDb25zdGFudCIsCiAgICAiZWRnZW1vZGUiOiAiZWRnZU1vZGUiLAogICAgImV4dGVybmFscmVzb3VyY2VzcmVxdWlyZWQiOiAiZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCIsCiAgICAiZmlsdGVycmVzIjogImZpbHRlclJlcyIsCiAgICAiZmlsdGVydW5pdHMiOiAiZmlsdGVyVW5pdHMiLAogICAgImdseXBocmVmIjogImdseXBoUmVmIiwKICAgICJncmFkaWVudHRyYW5zZm9ybSI6ICJncmFkaWVudFRyYW5zZm9ybSIsCiAgICAiZ3JhZGllbnR1bml0cyI6ICJncmFkaWVudFVuaXRzIiwKICAgICJrZXJuZWxtYXRyaXgiOiAia2VybmVsTWF0cml4IiwKICAgICJrZXJuZWx1bml0bGVuZ3RoIjogImtlcm5lbFVuaXRMZW5ndGgiLAogICAgImtleXBvaW50cyI6ICJrZXlQb2ludHMiLAogICAgImtleXNwbGluZXMiOiAia2V5U3BsaW5lcyIsCiAgICAia2V5dGltZXMiOiAia2V5VGltZXMiLAogICAgImxlbmd0aGFkanVzdCI6ICJsZW5ndGhBZGp1c3QiLAogICAgImxpbWl0aW5nY29uZWFuZ2xlIjogImxpbWl0aW5nQ29uZUFuZ2xlIiwKICAgICJtYXJrZXJoZWlnaHQiOiAibWFya2VySGVpZ2h0IiwKICAgICJtYXJrZXJ1bml0cyI6ICJtYXJrZXJVbml0cyIsCiAgICAibWFya2Vyd2lkdGgiOiAibWFya2VyV2lkdGgiLAogICAgIm1hc2tjb250ZW50dW5pdHMiOiAibWFza0NvbnRlbnRVbml0cyIsCiAgICAibWFza3VuaXRzIjogIm1hc2tVbml0cyIsCiAgICAibnVtb2N0YXZlcyI6ICJudW1PY3RhdmVzIiwKICAgICJwYXRobGVuZ3RoIjogInBhdGhMZW5ndGgiLAogICAgInBhdHRlcm5jb250ZW50dW5pdHMiOiAicGF0dGVybkNvbnRlbnRVbml0cyIsCiAgICAicGF0dGVybnRyYW5zZm9ybSI6ICJwYXR0ZXJuVHJhbnNmb3JtIiwKICAgICJwYXR0ZXJudW5pdHMiOiAicGF0dGVyblVuaXRzIiwKICAgICJwb2ludHNhdHgiOiAicG9pbnRzQXRYIiwKICAgICJwb2ludHNhdHkiOiAicG9pbnRzQXRZIiwKICAgICJwb2ludHNhdHoiOiAicG9pbnRzQXRaIiwKICAgICJwcmVzZXJ2ZWFscGhhIjogInByZXNlcnZlQWxwaGEiLAogICAgInByZXNlcnZlYXNwZWN0cmF0aW8iOiAicHJlc2VydmVBc3BlY3RSYXRpbyIsCiAgICAicHJpbWl0aXZldW5pdHMiOiAicHJpbWl0aXZlVW5pdHMiLAogICAgInJlZngiOiAicmVmWCIsCiAgICAicmVmeSI6ICJyZWZZIiwKICAgICJyZXBlYXRjb3VudCI6ICJyZXBlYXRDb3VudCIsCiAgICAicmVwZWF0ZHVyIjogInJlcGVhdER1ciIsCiAgICAicmVxdWlyZWRleHRlbnNpb25zIjogInJlcXVpcmVkRXh0ZW5zaW9ucyIsCiAgICAicmVxdWlyZWRmZWF0dXJlcyI6ICJyZXF1aXJlZEZlYXR1cmVzIiwKICAgICJzcGVjdWxhcmNvbnN0YW50IjogInNwZWN1bGFyQ29uc3RhbnQiLAogICAgInNwZWN1bGFyZXhwb25lbnQiOiAic3BlY3VsYXJFeHBvbmVudCIsCiAgICAic3ByZWFkbWV0aG9kIjogInNwcmVhZE1ldGhvZCIsCiAgICAic3RhcnRvZmZzZXQiOiAic3RhcnRPZmZzZXQiLAogICAgInN0ZGRldmlhdGlvbiI6ICJzdGREZXZpYXRpb24iLAogICAgInN0aXRjaHRpbGVzIjogInN0aXRjaFRpbGVzIiwKICAgICJzdXJmYWNlc2NhbGUiOiAic3VyZmFjZVNjYWxlIiwKICAgICJzeXN0ZW1sYW5ndWFnZSI6ICJzeXN0ZW1MYW5ndWFnZSIsCiAgICAidGFibGV2YWx1ZXMiOiAidGFibGVWYWx1ZXMiLAogICAgInRhcmdldHgiOiAidGFyZ2V0WCIsCiAgICAidGFyZ2V0eSI6ICJ0YXJnZXRZIiwKICAgICJ0ZXh0bGVuZ3RoIjogInRleHRMZW5ndGgiLAogICAgInZpZXdib3giOiAidmlld0JveCIsCiAgICAidmlld3RhcmdldCI6ICJ2aWV3VGFyZ2V0IiwKICAgICJ4Y2hhbm5lbHNlbGVjdG9yIjogInhDaGFubmVsU2VsZWN0b3IiLAogICAgInljaGFubmVsc2VsZWN0b3IiOiAieUNoYW5uZWxTZWxlY3RvciIsCiAgICAiem9vbWFuZHBhbiI6ICJ6b29tQW5kUGFuIgp9CgphZGp1c3RNYXRoTUxBdHRyaWJ1dGVzID0geyJkZWZpbml0aW9udXJsIjogImRlZmluaXRpb25VUkwifQoKYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXMgPSB7CiAgICAieGxpbms6YWN0dWF0ZSI6ICgieGxpbmsiLCAiYWN0dWF0ZSIsIG5hbWVzcGFjZXNbInhsaW5rIl0pLAogICAgInhsaW5rOmFyY3JvbGUiOiAoInhsaW5rIiwgImFyY3JvbGUiLCBuYW1lc3BhY2VzWyJ4bGluayJdKSwKICAgICJ4bGluazpocmVmIjogKCJ4bGluayIsICJocmVmIiwgbmFtZXNwYWNlc1sieGxpbmsiXSksCiAgICAieGxpbms6cm9sZSI6ICgieGxpbmsiLCAicm9sZSIsIG5hbWVzcGFjZXNbInhsaW5rIl0pLAogICAgInhsaW5rOnNob3ciOiAoInhsaW5rIiwgInNob3ciLCBuYW1lc3BhY2VzWyJ4bGluayJdKSwKICAgICJ4bGluazp0aXRsZSI6ICgieGxpbmsiLCAidGl0bGUiLCBuYW1lc3BhY2VzWyJ4bGluayJdKSwKICAgICJ4bGluazp0eXBlIjogKCJ4bGluayIsICJ0eXBlIiwgbmFtZXNwYWNlc1sieGxpbmsiXSksCiAgICAieG1sOmJhc2UiOiAoInhtbCIsICJiYXNlIiwgbmFtZXNwYWNlc1sieG1sIl0pLAogICAgInhtbDpsYW5nIjogKCJ4bWwiLCAibGFuZyIsIG5hbWVzcGFjZXNbInhtbCJdKSwKICAgICJ4bWw6c3BhY2UiOiAoInhtbCIsICJzcGFjZSIsIG5hbWVzcGFjZXNbInhtbCJdKSwKICAgICJ4bWxucyI6IChOb25lLCAieG1sbnMiLCBuYW1lc3BhY2VzWyJ4bWxucyJdKSwKICAgICJ4bWxuczp4bGluayI6ICgieG1sbnMiLCAieGxpbmsiLCBuYW1lc3BhY2VzWyJ4bWxucyJdKQp9Cgp1bmFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzID0gZGljdChbKChucywgbG9jYWwpLCBxbmFtZSkgZm9yIHFuYW1lLCAocHJlZml4LCBsb2NhbCwgbnMpIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RGb3JlaWduQXR0cmlidXRlcy5pdGVtcygpXSkKCnNwYWNlQ2hhcmFjdGVycyA9IGZyb3plbnNldChbCiAgICAiXHQiLAogICAgIlxuIiwKICAgICJcdTAwMEMiLAogICAgIiAiLAogICAgIlxyIgpdKQoKdGFibGVJbnNlcnRNb2RlRWxlbWVudHMgPSBmcm96ZW5zZXQoWwogICAgInRhYmxlIiwKICAgICJ0Ym9keSIsCiAgICAidGZvb3QiLAogICAgInRoZWFkIiwKICAgICJ0ciIKXSkKCmFzY2lpTG93ZXJjYXNlID0gZnJvemVuc2V0KHN0cmluZy5hc2NpaV9sb3dlcmNhc2UpCmFzY2lpVXBwZXJjYXNlID0gZnJvemVuc2V0KHN0cmluZy5hc2NpaV91cHBlcmNhc2UpCmFzY2lpTGV0dGVycyA9IGZyb3plbnNldChzdHJpbmcuYXNjaWlfbGV0dGVycykKZGlnaXRzID0gZnJvemVuc2V0KHN0cmluZy5kaWdpdHMpCmhleERpZ2l0cyA9IGZyb3plbnNldChzdHJpbmcuaGV4ZGlnaXRzKQoKYXNjaWlVcHBlcjJMb3dlciA9IGRpY3QoWyhvcmQoYyksIG9yZChjLmxvd2VyKCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGMgaW4gc3RyaW5nLmFzY2lpX3VwcGVyY2FzZV0pCgojIEhlYWRpbmcgZWxlbWVudHMgbmVlZCB0byBiZSBvcmRlcmVkCmhlYWRpbmdFbGVtZW50cyA9ICgKICAgICJoMSIsCiAgICAiaDIiLAogICAgImgzIiwKICAgICJoNCIsCiAgICAiaDUiLAogICAgImg2IgopCgp2b2lkRWxlbWVudHMgPSBmcm96ZW5zZXQoWwogICAgImJhc2UiLAogICAgImNvbW1hbmQiLAogICAgImV2ZW50LXNvdXJjZSIsCiAgICAibGluayIsCiAgICAibWV0YSIsCiAgICAiaHIiLAogICAgImJyIiwKICAgICJpbWciLAogICAgImVtYmVkIiwKICAgICJwYXJhbSIsCiAgICAiYXJlYSIsCiAgICAiY29sIiwKICAgICJpbnB1dCIsCiAgICAic291cmNlIiwKICAgICJ0cmFjayIKXSkKCmNkYXRhRWxlbWVudHMgPSBmcm96ZW5zZXQoWyd0aXRsZScsICd0ZXh0YXJlYSddKQoKcmNkYXRhRWxlbWVudHMgPSBmcm96ZW5zZXQoWwogICAgJ3N0eWxlJywKICAgICdzY3JpcHQnLAogICAgJ3htcCcsCiAgICAnaWZyYW1lJywKICAgICdub2VtYmVkJywKICAgICdub2ZyYW1lcycsCiAgICAnbm9zY3JpcHQnCl0pCgpib29sZWFuQXR0cmlidXRlcyA9IHsKICAgICIiOiBmcm96ZW5zZXQoWyJpcnJlbGV2YW50Il0pLAogICAgInN0eWxlIjogZnJvemVuc2V0KFsic2NvcGVkIl0pLAogICAgImltZyI6IGZyb3plbnNldChbImlzbWFwIl0pLAogICAgImF1ZGlvIjogZnJvemVuc2V0KFsiYXV0b3BsYXkiLCAiY29udHJvbHMiXSksCiAgICAidmlkZW8iOiBmcm96ZW5zZXQoWyJhdXRvcGxheSIsICJjb250cm9scyJdKSwKICAgICJzY3JpcHQiOiBmcm96ZW5zZXQoWyJkZWZlciIsICJhc3luYyJdKSwKICAgICJkZXRhaWxzIjogZnJvemVuc2V0KFsib3BlbiJdKSwKICAgICJkYXRhZ3JpZCI6IGZyb3plbnNldChbIm11bHRpcGxlIiwgImRpc2FibGVkIl0pLAogICAgImNvbW1hbmQiOiBmcm96ZW5zZXQoWyJoaWRkZW4iLCAiZGlzYWJsZWQiLCAiY2hlY2tlZCIsICJkZWZhdWx0Il0pLAogICAgImhyIjogZnJvemVuc2V0KFsibm9zaGFkZSJdKSwKICAgICJtZW51IjogZnJvemVuc2V0KFsiYXV0b3N1Ym1pdCJdKSwKICAgICJmaWVsZHNldCI6IGZyb3plbnNldChbImRpc2FibGVkIiwgInJlYWRvbmx5Il0pLAogICAgIm9wdGlvbiI6IGZyb3plbnNldChbImRpc2FibGVkIiwgInJlYWRvbmx5IiwgInNlbGVjdGVkIl0pLAogICAgIm9wdGdyb3VwIjogZnJvemVuc2V0KFsiZGlzYWJsZWQiLCAicmVhZG9ubHkiXSksCiAgICAiYnV0dG9uIjogZnJvemVuc2V0KFsiZGlzYWJsZWQiLCAiYXV0b2ZvY3VzIl0pLAogICAgImlucHV0IjogZnJvemVuc2V0KFsiZGlzYWJsZWQiLCAicmVhZG9ubHkiLCAicmVxdWlyZWQiLCAiYXV0b2ZvY3VzIiwgImNoZWNrZWQiLCAiaXNtYXAiXSksCiAgICAic2VsZWN0IjogZnJvemVuc2V0KFsiZGlzYWJsZWQiLCAicmVhZG9ubHkiLCAiYXV0b2ZvY3VzIiwgIm11bHRpcGxlIl0pLAogICAgIm91dHB1dCI6IGZyb3plbnNldChbImRpc2FibGVkIiwgInJlYWRvbmx5Il0pLAp9CgojIGVudGl0aWVzV2luZG93czEyNTIgaGFzIHRvIGJlIF9vcmRlcmVkXyBhbmQgbmVlZHMgdG8gaGF2ZSBhbiBpbmRleC4gSXQKIyB0aGVyZWZvcmUgY2FuJ3QgYmUgYSBmcm96ZW5zZXQuCmVudGl0aWVzV2luZG93czEyNTIgPSAoCiAgICA4MzY0LCAgICMgMHg4MCAgMHgyMEFDICBFVVJPIFNJR04KICAgIDY1NTMzLCAgIyAweDgxICAgICAgICAgIFVOREVGSU5FRAogICAgODIxOCwgICAjIDB4ODIgIDB4MjAxQSAgU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLCiAgICA0MDIsICAgICMgMHg4MyAgMHgwMTkyICBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKICAgIDgyMjIsICAgIyAweDg0ICAweDIwMUUgIERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSwogICAgODIzMCwgICAjIDB4ODUgIDB4MjAyNiAgSE9SSVpPTlRBTCBFTExJUFNJUwogICAgODIyNCwgICAjIDB4ODYgIDB4MjAyMCAgREFHR0VSCiAgICA4MjI1LCAgICMgMHg4NyAgMHgyMDIxICBET1VCTEUgREFHR0VSCiAgICA3MTAsICAgICMgMHg4OCAgMHgwMkM2ICBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlQKICAgIDgyNDAsICAgIyAweDg5ICAweDIwMzAgIFBFUiBNSUxMRSBTSUdOCiAgICAzNTIsICAgICMgMHg4QSAgMHgwMTYwICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KICAgIDgyNDksICAgIyAweDhCICAweDIwMzkgIFNJTkdMRSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCiAgICAzMzgsICAgICMgMHg4QyAgMHgwMTUyICBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FCiAgICA2NTUzMywgICMgMHg4RCAgICAgICAgICBVTkRFRklORUQKICAgIDM4MSwgICAgIyAweDhFICAweDAxN0QgIExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgogICAgNjU1MzMsICAjIDB4OEYgICAgICAgICAgVU5ERUZJTkVECiAgICA2NTUzMywgICMgMHg5MCAgICAgICAgICBVTkRFRklORUQKICAgIDgyMTYsICAgIyAweDkxICAweDIwMTggIExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCiAgICA4MjE3LCAgICMgMHg5MiAgMHgyMDE5ICBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKICAgIDgyMjAsICAgIyAweDkzICAweDIwMUMgIExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCiAgICA4MjIxLCAgICMgMHg5NCAgMHgyMDFEICBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKICAgIDgyMjYsICAgIyAweDk1ICAweDIwMjIgIEJVTExFVAogICAgODIxMSwgICAjIDB4OTYgIDB4MjAxMyAgRU4gREFTSAogICAgODIxMiwgICAjIDB4OTcgIDB4MjAxNCAgRU0gREFTSAogICAgNzMyLCAgICAjIDB4OTggIDB4MDJEQyAgU01BTEwgVElMREUKICAgIDg0ODIsICAgIyAweDk5ICAweDIxMjIgIFRSQURFIE1BUksgU0lHTgogICAgMzUzLCAgICAjIDB4OUEgIDB4MDE2MSAgTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDQVJPTgogICAgODI1MCwgICAjIDB4OUIgIDB4MjAzQSAgU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCiAgICAzMzksICAgICMgMHg5QyAgMHgwMTUzICBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRQogICAgNjU1MzMsICAjIDB4OUQgICAgICAgICAgVU5ERUZJTkVECiAgICAzODIsICAgICMgMHg5RSAgMHgwMTdFICBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OCiAgICAzNzYgICAgICMgMHg5RiAgMHgwMTc4ICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCikKCnhtbEVudGl0aWVzID0gZnJvemVuc2V0KFsnbHQ7JywgJ2d0OycsICdhbXA7JywgJ2Fwb3M7JywgJ3F1b3Q7J10pCgplbnRpdGllcyA9IHsKICAgICJBRWxpZyI6ICJceGM2IiwKICAgICJBRWxpZzsiOiAiXHhjNiIsCiAgICAiQU1QIjogIiYiLAogICAgIkFNUDsiOiAiJiIsCiAgICAiQWFjdXRlIjogIlx4YzEiLAogICAgIkFhY3V0ZTsiOiAiXHhjMSIsCiAgICAiQWJyZXZlOyI6ICJcdTAxMDIiLAogICAgIkFjaXJjIjogIlx4YzIiLAogICAgIkFjaXJjOyI6ICJceGMyIiwKICAgICJBY3k7IjogIlx1MDQxMCIsCiAgICAiQWZyOyI6ICJcVTAwMDFkNTA0IiwKICAgICJBZ3JhdmUiOiAiXHhjMCIsCiAgICAiQWdyYXZlOyI6ICJceGMwIiwKICAgICJBbHBoYTsiOiAiXHUwMzkxIiwKICAgICJBbWFjcjsiOiAiXHUwMTAwIiwKICAgICJBbmQ7IjogIlx1MmE1MyIsCiAgICAiQW9nb247IjogIlx1MDEwNCIsCiAgICAiQW9wZjsiOiAiXFUwMDAxZDUzOCIsCiAgICAiQXBwbHlGdW5jdGlvbjsiOiAiXHUyMDYxIiwKICAgICJBcmluZyI6ICJceGM1IiwKICAgICJBcmluZzsiOiAiXHhjNSIsCiAgICAiQXNjcjsiOiAiXFUwMDAxZDQ5YyIsCiAgICAiQXNzaWduOyI6ICJcdTIyNTQiLAogICAgIkF0aWxkZSI6ICJceGMzIiwKICAgICJBdGlsZGU7IjogIlx4YzMiLAogICAgIkF1bWwiOiAiXHhjNCIsCiAgICAiQXVtbDsiOiAiXHhjNCIsCiAgICAiQmFja3NsYXNoOyI6ICJcdTIyMTYiLAogICAgIkJhcnY7IjogIlx1MmFlNyIsCiAgICAiQmFyd2VkOyI6ICJcdTIzMDYiLAogICAgIkJjeTsiOiAiXHUwNDExIiwKICAgICJCZWNhdXNlOyI6ICJcdTIyMzUiLAogICAgIkJlcm5vdWxsaXM7IjogIlx1MjEyYyIsCiAgICAiQmV0YTsiOiAiXHUwMzkyIiwKICAgICJCZnI7IjogIlxVMDAwMWQ1MDUiLAogICAgIkJvcGY7IjogIlxVMDAwMWQ1MzkiLAogICAgIkJyZXZlOyI6ICJcdTAyZDgiLAogICAgIkJzY3I7IjogIlx1MjEyYyIsCiAgICAiQnVtcGVxOyI6ICJcdTIyNGUiLAogICAgIkNIY3k7IjogIlx1MDQyNyIsCiAgICAiQ09QWSI6ICJceGE5IiwKICAgICJDT1BZOyI6ICJceGE5IiwKICAgICJDYWN1dGU7IjogIlx1MDEwNiIsCiAgICAiQ2FwOyI6ICJcdTIyZDIiLAogICAgIkNhcGl0YWxEaWZmZXJlbnRpYWxEOyI6ICJcdTIxNDUiLAogICAgIkNheWxleXM7IjogIlx1MjEyZCIsCiAgICAiQ2Nhcm9uOyI6ICJcdTAxMGMiLAogICAgIkNjZWRpbCI6ICJceGM3IiwKICAgICJDY2VkaWw7IjogIlx4YzciLAogICAgIkNjaXJjOyI6ICJcdTAxMDgiLAogICAgIkNjb25pbnQ7IjogIlx1MjIzMCIsCiAgICAiQ2RvdDsiOiAiXHUwMTBhIiwKICAgICJDZWRpbGxhOyI6ICJceGI4IiwKICAgICJDZW50ZXJEb3Q7IjogIlx4YjciLAogICAgIkNmcjsiOiAiXHUyMTJkIiwKICAgICJDaGk7IjogIlx1MDNhNyIsCiAgICAiQ2lyY2xlRG90OyI6ICJcdTIyOTkiLAogICAgIkNpcmNsZU1pbnVzOyI6ICJcdTIyOTYiLAogICAgIkNpcmNsZVBsdXM7IjogIlx1MjI5NSIsCiAgICAiQ2lyY2xlVGltZXM7IjogIlx1MjI5NyIsCiAgICAiQ2xvY2t3aXNlQ29udG91ckludGVncmFsOyI6ICJcdTIyMzIiLAogICAgIkNsb3NlQ3VybHlEb3VibGVRdW90ZTsiOiAiXHUyMDFkIiwKICAgICJDbG9zZUN1cmx5UXVvdGU7IjogIlx1MjAxOSIsCiAgICAiQ29sb247IjogIlx1MjIzNyIsCiAgICAiQ29sb25lOyI6ICJcdTJhNzQiLAogICAgIkNvbmdydWVudDsiOiAiXHUyMjYxIiwKICAgICJDb25pbnQ7IjogIlx1MjIyZiIsCiAgICAiQ29udG91ckludGVncmFsOyI6ICJcdTIyMmUiLAogICAgIkNvcGY7IjogIlx1MjEwMiIsCiAgICAiQ29wcm9kdWN0OyI6ICJcdTIyMTAiLAogICAgIkNvdW50ZXJDbG9ja3dpc2VDb250b3VySW50ZWdyYWw7IjogIlx1MjIzMyIsCiAgICAiQ3Jvc3M7IjogIlx1MmEyZiIsCiAgICAiQ3NjcjsiOiAiXFUwMDAxZDQ5ZSIsCiAgICAiQ3VwOyI6ICJcdTIyZDMiLAogICAgIkN1cENhcDsiOiAiXHUyMjRkIiwKICAgICJERDsiOiAiXHUyMTQ1IiwKICAgICJERG90cmFoZDsiOiAiXHUyOTExIiwKICAgICJESmN5OyI6ICJcdTA0MDIiLAogICAgIkRTY3k7IjogIlx1MDQwNSIsCiAgICAiRFpjeTsiOiAiXHUwNDBmIiwKICAgICJEYWdnZXI7IjogIlx1MjAyMSIsCiAgICAiRGFycjsiOiAiXHUyMWExIiwKICAgICJEYXNodjsiOiAiXHUyYWU0IiwKICAgICJEY2Fyb247IjogIlx1MDEwZSIsCiAgICAiRGN5OyI6ICJcdTA0MTQiLAogICAgIkRlbDsiOiAiXHUyMjA3IiwKICAgICJEZWx0YTsiOiAiXHUwMzk0IiwKICAgICJEZnI7IjogIlxVMDAwMWQ1MDciLAogICAgIkRpYWNyaXRpY2FsQWN1dGU7IjogIlx4YjQiLAogICAgIkRpYWNyaXRpY2FsRG90OyI6ICJcdTAyZDkiLAogICAgIkRpYWNyaXRpY2FsRG91YmxlQWN1dGU7IjogIlx1MDJkZCIsCiAgICAiRGlhY3JpdGljYWxHcmF2ZTsiOiAiYCIsCiAgICAiRGlhY3JpdGljYWxUaWxkZTsiOiAiXHUwMmRjIiwKICAgICJEaWFtb25kOyI6ICJcdTIyYzQiLAogICAgIkRpZmZlcmVudGlhbEQ7IjogIlx1MjE0NiIsCiAgICAiRG9wZjsiOiAiXFUwMDAxZDUzYiIsCiAgICAiRG90OyI6ICJceGE4IiwKICAgICJEb3REb3Q7IjogIlx1MjBkYyIsCiAgICAiRG90RXF1YWw7IjogIlx1MjI1MCIsCiAgICAiRG91YmxlQ29udG91ckludGVncmFsOyI6ICJcdTIyMmYiLAogICAgIkRvdWJsZURvdDsiOiAiXHhhOCIsCiAgICAiRG91YmxlRG93bkFycm93OyI6ICJcdTIxZDMiLAogICAgIkRvdWJsZUxlZnRBcnJvdzsiOiAiXHUyMWQwIiwKICAgICJEb3VibGVMZWZ0UmlnaHRBcnJvdzsiOiAiXHUyMWQ0IiwKICAgICJEb3VibGVMZWZ0VGVlOyI6ICJcdTJhZTQiLAogICAgIkRvdWJsZUxvbmdMZWZ0QXJyb3c7IjogIlx1MjdmOCIsCiAgICAiRG91YmxlTG9uZ0xlZnRSaWdodEFycm93OyI6ICJcdTI3ZmEiLAogICAgIkRvdWJsZUxvbmdSaWdodEFycm93OyI6ICJcdTI3ZjkiLAogICAgIkRvdWJsZVJpZ2h0QXJyb3c7IjogIlx1MjFkMiIsCiAgICAiRG91YmxlUmlnaHRUZWU7IjogIlx1MjJhOCIsCiAgICAiRG91YmxlVXBBcnJvdzsiOiAiXHUyMWQxIiwKICAgICJEb3VibGVVcERvd25BcnJvdzsiOiAiXHUyMWQ1IiwKICAgICJEb3VibGVWZXJ0aWNhbEJhcjsiOiAiXHUyMjI1IiwKICAgICJEb3duQXJyb3c7IjogIlx1MjE5MyIsCiAgICAiRG93bkFycm93QmFyOyI6ICJcdTI5MTMiLAogICAgIkRvd25BcnJvd1VwQXJyb3c7IjogIlx1MjFmNSIsCiAgICAiRG93bkJyZXZlOyI6ICJcdTAzMTEiLAogICAgIkRvd25MZWZ0UmlnaHRWZWN0b3I7IjogIlx1Mjk1MCIsCiAgICAiRG93bkxlZnRUZWVWZWN0b3I7IjogIlx1Mjk1ZSIsCiAgICAiRG93bkxlZnRWZWN0b3I7IjogIlx1MjFiZCIsCiAgICAiRG93bkxlZnRWZWN0b3JCYXI7IjogIlx1Mjk1NiIsCiAgICAiRG93blJpZ2h0VGVlVmVjdG9yOyI6ICJcdTI5NWYiLAogICAgIkRvd25SaWdodFZlY3RvcjsiOiAiXHUyMWMxIiwKICAgICJEb3duUmlnaHRWZWN0b3JCYXI7IjogIlx1Mjk1NyIsCiAgICAiRG93blRlZTsiOiAiXHUyMmE0IiwKICAgICJEb3duVGVlQXJyb3c7IjogIlx1MjFhNyIsCiAgICAiRG93bmFycm93OyI6ICJcdTIxZDMiLAogICAgIkRzY3I7IjogIlxVMDAwMWQ0OWYiLAogICAgIkRzdHJvazsiOiAiXHUwMTEwIiwKICAgICJFTkc7IjogIlx1MDE0YSIsCiAgICAiRVRIIjogIlx4ZDAiLAogICAgIkVUSDsiOiAiXHhkMCIsCiAgICAiRWFjdXRlIjogIlx4YzkiLAogICAgIkVhY3V0ZTsiOiAiXHhjOSIsCiAgICAiRWNhcm9uOyI6ICJcdTAxMWEiLAogICAgIkVjaXJjIjogIlx4Y2EiLAogICAgIkVjaXJjOyI6ICJceGNhIiwKICAgICJFY3k7IjogIlx1MDQyZCIsCiAgICAiRWRvdDsiOiAiXHUwMTE2IiwKICAgICJFZnI7IjogIlxVMDAwMWQ1MDgiLAogICAgIkVncmF2ZSI6ICJceGM4IiwKICAgICJFZ3JhdmU7IjogIlx4YzgiLAogICAgIkVsZW1lbnQ7IjogIlx1MjIwOCIsCiAgICAiRW1hY3I7IjogIlx1MDExMiIsCiAgICAiRW1wdHlTbWFsbFNxdWFyZTsiOiAiXHUyNWZiIiwKICAgICJFbXB0eVZlcnlTbWFsbFNxdWFyZTsiOiAiXHUyNWFiIiwKICAgICJFb2dvbjsiOiAiXHUwMTE4IiwKICAgICJFb3BmOyI6ICJcVTAwMDFkNTNjIiwKICAgICJFcHNpbG9uOyI6ICJcdTAzOTUiLAogICAgIkVxdWFsOyI6ICJcdTJhNzUiLAogICAgIkVxdWFsVGlsZGU7IjogIlx1MjI0MiIsCiAgICAiRXF1aWxpYnJpdW07IjogIlx1MjFjYyIsCiAgICAiRXNjcjsiOiAiXHUyMTMwIiwKICAgICJFc2ltOyI6ICJcdTJhNzMiLAogICAgIkV0YTsiOiAiXHUwMzk3IiwKICAgICJFdW1sIjogIlx4Y2IiLAogICAgIkV1bWw7IjogIlx4Y2IiLAogICAgIkV4aXN0czsiOiAiXHUyMjAzIiwKICAgICJFeHBvbmVudGlhbEU7IjogIlx1MjE0NyIsCiAgICAiRmN5OyI6ICJcdTA0MjQiLAogICAgIkZmcjsiOiAiXFUwMDAxZDUwOSIsCiAgICAiRmlsbGVkU21hbGxTcXVhcmU7IjogIlx1MjVmYyIsCiAgICAiRmlsbGVkVmVyeVNtYWxsU3F1YXJlOyI6ICJcdTI1YWEiLAogICAgIkZvcGY7IjogIlxVMDAwMWQ1M2QiLAogICAgIkZvckFsbDsiOiAiXHUyMjAwIiwKICAgICJGb3VyaWVydHJmOyI6ICJcdTIxMzEiLAogICAgIkZzY3I7IjogIlx1MjEzMSIsCiAgICAiR0pjeTsiOiAiXHUwNDAzIiwKICAgICJHVCI6ICI+IiwKICAgICJHVDsiOiAiPiIsCiAgICAiR2FtbWE7IjogIlx1MDM5MyIsCiAgICAiR2FtbWFkOyI6ICJcdTAzZGMiLAogICAgIkdicmV2ZTsiOiAiXHUwMTFlIiwKICAgICJHY2VkaWw7IjogIlx1MDEyMiIsCiAgICAiR2NpcmM7IjogIlx1MDExYyIsCiAgICAiR2N5OyI6ICJcdTA0MTMiLAogICAgIkdkb3Q7IjogIlx1MDEyMCIsCiAgICAiR2ZyOyI6ICJcVTAwMDFkNTBhIiwKICAgICJHZzsiOiAiXHUyMmQ5IiwKICAgICJHb3BmOyI6ICJcVTAwMDFkNTNlIiwKICAgICJHcmVhdGVyRXF1YWw7IjogIlx1MjI2NSIsCiAgICAiR3JlYXRlckVxdWFsTGVzczsiOiAiXHUyMmRiIiwKICAgICJHcmVhdGVyRnVsbEVxdWFsOyI6ICJcdTIyNjciLAogICAgIkdyZWF0ZXJHcmVhdGVyOyI6ICJcdTJhYTIiLAogICAgIkdyZWF0ZXJMZXNzOyI6ICJcdTIyNzciLAogICAgIkdyZWF0ZXJTbGFudEVxdWFsOyI6ICJcdTJhN2UiLAogICAgIkdyZWF0ZXJUaWxkZTsiOiAiXHUyMjczIiwKICAgICJHc2NyOyI6ICJcVTAwMDFkNGEyIiwKICAgICJHdDsiOiAiXHUyMjZiIiwKICAgICJIQVJEY3k7IjogIlx1MDQyYSIsCiAgICAiSGFjZWs7IjogIlx1MDJjNyIsCiAgICAiSGF0OyI6ICJeIiwKICAgICJIY2lyYzsiOiAiXHUwMTI0IiwKICAgICJIZnI7IjogIlx1MjEwYyIsCiAgICAiSGlsYmVydFNwYWNlOyI6ICJcdTIxMGIiLAogICAgIkhvcGY7IjogIlx1MjEwZCIsCiAgICAiSG9yaXpvbnRhbExpbmU7IjogIlx1MjUwMCIsCiAgICAiSHNjcjsiOiAiXHUyMTBiIiwKICAgICJIc3Ryb2s7IjogIlx1MDEyNiIsCiAgICAiSHVtcERvd25IdW1wOyI6ICJcdTIyNGUiLAogICAgIkh1bXBFcXVhbDsiOiAiXHUyMjRmIiwKICAgICJJRWN5OyI6ICJcdTA0MTUiLAogICAgIklKbGlnOyI6ICJcdTAxMzIiLAogICAgIklPY3k7IjogIlx1MDQwMSIsCiAgICAiSWFjdXRlIjogIlx4Y2QiLAogICAgIklhY3V0ZTsiOiAiXHhjZCIsCiAgICAiSWNpcmMiOiAiXHhjZSIsCiAgICAiSWNpcmM7IjogIlx4Y2UiLAogICAgIkljeTsiOiAiXHUwNDE4IiwKICAgICJJZG90OyI6ICJcdTAxMzAiLAogICAgIklmcjsiOiAiXHUyMTExIiwKICAgICJJZ3JhdmUiOiAiXHhjYyIsCiAgICAiSWdyYXZlOyI6ICJceGNjIiwKICAgICJJbTsiOiAiXHUyMTExIiwKICAgICJJbWFjcjsiOiAiXHUwMTJhIiwKICAgICJJbWFnaW5hcnlJOyI6ICJcdTIxNDgiLAogICAgIkltcGxpZXM7IjogIlx1MjFkMiIsCiAgICAiSW50OyI6ICJcdTIyMmMiLAogICAgIkludGVncmFsOyI6ICJcdTIyMmIiLAogICAgIkludGVyc2VjdGlvbjsiOiAiXHUyMmMyIiwKICAgICJJbnZpc2libGVDb21tYTsiOiAiXHUyMDYzIiwKICAgICJJbnZpc2libGVUaW1lczsiOiAiXHUyMDYyIiwKICAgICJJb2dvbjsiOiAiXHUwMTJlIiwKICAgICJJb3BmOyI6ICJcVTAwMDFkNTQwIiwKICAgICJJb3RhOyI6ICJcdTAzOTkiLAogICAgIklzY3I7IjogIlx1MjExMCIsCiAgICAiSXRpbGRlOyI6ICJcdTAxMjgiLAogICAgIkl1a2N5OyI6ICJcdTA0MDYiLAogICAgIkl1bWwiOiAiXHhjZiIsCiAgICAiSXVtbDsiOiAiXHhjZiIsCiAgICAiSmNpcmM7IjogIlx1MDEzNCIsCiAgICAiSmN5OyI6ICJcdTA0MTkiLAogICAgIkpmcjsiOiAiXFUwMDAxZDUwZCIsCiAgICAiSm9wZjsiOiAiXFUwMDAxZDU0MSIsCiAgICAiSnNjcjsiOiAiXFUwMDAxZDRhNSIsCiAgICAiSnNlcmN5OyI6ICJcdTA0MDgiLAogICAgIkp1a2N5OyI6ICJcdTA0MDQiLAogICAgIktIY3k7IjogIlx1MDQyNSIsCiAgICAiS0pjeTsiOiAiXHUwNDBjIiwKICAgICJLYXBwYTsiOiAiXHUwMzlhIiwKICAgICJLY2VkaWw7IjogIlx1MDEzNiIsCiAgICAiS2N5OyI6ICJcdTA0MWEiLAogICAgIktmcjsiOiAiXFUwMDAxZDUwZSIsCiAgICAiS29wZjsiOiAiXFUwMDAxZDU0MiIsCiAgICAiS3NjcjsiOiAiXFUwMDAxZDRhNiIsCiAgICAiTEpjeTsiOiAiXHUwNDA5IiwKICAgICJMVCI6ICI8IiwKICAgICJMVDsiOiAiPCIsCiAgICAiTGFjdXRlOyI6ICJcdTAxMzkiLAogICAgIkxhbWJkYTsiOiAiXHUwMzliIiwKICAgICJMYW5nOyI6ICJcdTI3ZWEiLAogICAgIkxhcGxhY2V0cmY7IjogIlx1MjExMiIsCiAgICAiTGFycjsiOiAiXHUyMTllIiwKICAgICJMY2Fyb247IjogIlx1MDEzZCIsCiAgICAiTGNlZGlsOyI6ICJcdTAxM2IiLAogICAgIkxjeTsiOiAiXHUwNDFiIiwKICAgICJMZWZ0QW5nbGVCcmFja2V0OyI6ICJcdTI3ZTgiLAogICAgIkxlZnRBcnJvdzsiOiAiXHUyMTkwIiwKICAgICJMZWZ0QXJyb3dCYXI7IjogIlx1MjFlNCIsCiAgICAiTGVmdEFycm93UmlnaHRBcnJvdzsiOiAiXHUyMWM2IiwKICAgICJMZWZ0Q2VpbGluZzsiOiAiXHUyMzA4IiwKICAgICJMZWZ0RG91YmxlQnJhY2tldDsiOiAiXHUyN2U2IiwKICAgICJMZWZ0RG93blRlZVZlY3RvcjsiOiAiXHUyOTYxIiwKICAgICJMZWZ0RG93blZlY3RvcjsiOiAiXHUyMWMzIiwKICAgICJMZWZ0RG93blZlY3RvckJhcjsiOiAiXHUyOTU5IiwKICAgICJMZWZ0Rmxvb3I7IjogIlx1MjMwYSIsCiAgICAiTGVmdFJpZ2h0QXJyb3c7IjogIlx1MjE5NCIsCiAgICAiTGVmdFJpZ2h0VmVjdG9yOyI6ICJcdTI5NGUiLAogICAgIkxlZnRUZWU7IjogIlx1MjJhMyIsCiAgICAiTGVmdFRlZUFycm93OyI6ICJcdTIxYTQiLAogICAgIkxlZnRUZWVWZWN0b3I7IjogIlx1Mjk1YSIsCiAgICAiTGVmdFRyaWFuZ2xlOyI6ICJcdTIyYjIiLAogICAgIkxlZnRUcmlhbmdsZUJhcjsiOiAiXHUyOWNmIiwKICAgICJMZWZ0VHJpYW5nbGVFcXVhbDsiOiAiXHUyMmI0IiwKICAgICJMZWZ0VXBEb3duVmVjdG9yOyI6ICJcdTI5NTEiLAogICAgIkxlZnRVcFRlZVZlY3RvcjsiOiAiXHUyOTYwIiwKICAgICJMZWZ0VXBWZWN0b3I7IjogIlx1MjFiZiIsCiAgICAiTGVmdFVwVmVjdG9yQmFyOyI6ICJcdTI5NTgiLAogICAgIkxlZnRWZWN0b3I7IjogIlx1MjFiYyIsCiAgICAiTGVmdFZlY3RvckJhcjsiOiAiXHUyOTUyIiwKICAgICJMZWZ0YXJyb3c7IjogIlx1MjFkMCIsCiAgICAiTGVmdHJpZ2h0YXJyb3c7IjogIlx1MjFkNCIsCiAgICAiTGVzc0VxdWFsR3JlYXRlcjsiOiAiXHUyMmRhIiwKICAgICJMZXNzRnVsbEVxdWFsOyI6ICJcdTIyNjYiLAogICAgIkxlc3NHcmVhdGVyOyI6ICJcdTIyNzYiLAogICAgIkxlc3NMZXNzOyI6ICJcdTJhYTEiLAogICAgIkxlc3NTbGFudEVxdWFsOyI6ICJcdTJhN2QiLAogICAgIkxlc3NUaWxkZTsiOiAiXHUyMjcyIiwKICAgICJMZnI7IjogIlxVMDAwMWQ1MGYiLAogICAgIkxsOyI6ICJcdTIyZDgiLAogICAgIkxsZWZ0YXJyb3c7IjogIlx1MjFkYSIsCiAgICAiTG1pZG90OyI6ICJcdTAxM2YiLAogICAgIkxvbmdMZWZ0QXJyb3c7IjogIlx1MjdmNSIsCiAgICAiTG9uZ0xlZnRSaWdodEFycm93OyI6ICJcdTI3ZjciLAogICAgIkxvbmdSaWdodEFycm93OyI6ICJcdTI3ZjYiLAogICAgIkxvbmdsZWZ0YXJyb3c7IjogIlx1MjdmOCIsCiAgICAiTG9uZ2xlZnRyaWdodGFycm93OyI6ICJcdTI3ZmEiLAogICAgIkxvbmdyaWdodGFycm93OyI6ICJcdTI3ZjkiLAogICAgIkxvcGY7IjogIlxVMDAwMWQ1NDMiLAogICAgIkxvd2VyTGVmdEFycm93OyI6ICJcdTIxOTkiLAogICAgIkxvd2VyUmlnaHRBcnJvdzsiOiAiXHUyMTk4IiwKICAgICJMc2NyOyI6ICJcdTIxMTIiLAogICAgIkxzaDsiOiAiXHUyMWIwIiwKICAgICJMc3Ryb2s7IjogIlx1MDE0MSIsCiAgICAiTHQ7IjogIlx1MjI2YSIsCiAgICAiTWFwOyI6ICJcdTI5MDUiLAogICAgIk1jeTsiOiAiXHUwNDFjIiwKICAgICJNZWRpdW1TcGFjZTsiOiAiXHUyMDVmIiwKICAgICJNZWxsaW50cmY7IjogIlx1MjEzMyIsCiAgICAiTWZyOyI6ICJcVTAwMDFkNTEwIiwKICAgICJNaW51c1BsdXM7IjogIlx1MjIxMyIsCiAgICAiTW9wZjsiOiAiXFUwMDAxZDU0NCIsCiAgICAiTXNjcjsiOiAiXHUyMTMzIiwKICAgICJNdTsiOiAiXHUwMzljIiwKICAgICJOSmN5OyI6ICJcdTA0MGEiLAogICAgIk5hY3V0ZTsiOiAiXHUwMTQzIiwKICAgICJOY2Fyb247IjogIlx1MDE0NyIsCiAgICAiTmNlZGlsOyI6ICJcdTAxNDUiLAogICAgIk5jeTsiOiAiXHUwNDFkIiwKICAgICJOZWdhdGl2ZU1lZGl1bVNwYWNlOyI6ICJcdTIwMGIiLAogICAgIk5lZ2F0aXZlVGhpY2tTcGFjZTsiOiAiXHUyMDBiIiwKICAgICJOZWdhdGl2ZVRoaW5TcGFjZTsiOiAiXHUyMDBiIiwKICAgICJOZWdhdGl2ZVZlcnlUaGluU3BhY2U7IjogIlx1MjAwYiIsCiAgICAiTmVzdGVkR3JlYXRlckdyZWF0ZXI7IjogIlx1MjI2YiIsCiAgICAiTmVzdGVkTGVzc0xlc3M7IjogIlx1MjI2YSIsCiAgICAiTmV3TGluZTsiOiAiXG4iLAogICAgIk5mcjsiOiAiXFUwMDAxZDUxMSIsCiAgICAiTm9CcmVhazsiOiAiXHUyMDYwIiwKICAgICJOb25CcmVha2luZ1NwYWNlOyI6ICJceGEwIiwKICAgICJOb3BmOyI6ICJcdTIxMTUiLAogICAgIk5vdDsiOiAiXHUyYWVjIiwKICAgICJOb3RDb25ncnVlbnQ7IjogIlx1MjI2MiIsCiAgICAiTm90Q3VwQ2FwOyI6ICJcdTIyNmQiLAogICAgIk5vdERvdWJsZVZlcnRpY2FsQmFyOyI6ICJcdTIyMjYiLAogICAgIk5vdEVsZW1lbnQ7IjogIlx1MjIwOSIsCiAgICAiTm90RXF1YWw7IjogIlx1MjI2MCIsCiAgICAiTm90RXF1YWxUaWxkZTsiOiAiXHUyMjQyXHUwMzM4IiwKICAgICJOb3RFeGlzdHM7IjogIlx1MjIwNCIsCiAgICAiTm90R3JlYXRlcjsiOiAiXHUyMjZmIiwKICAgICJOb3RHcmVhdGVyRXF1YWw7IjogIlx1MjI3MSIsCiAgICAiTm90R3JlYXRlckZ1bGxFcXVhbDsiOiAiXHUyMjY3XHUwMzM4IiwKICAgICJOb3RHcmVhdGVyR3JlYXRlcjsiOiAiXHUyMjZiXHUwMzM4IiwKICAgICJOb3RHcmVhdGVyTGVzczsiOiAiXHUyMjc5IiwKICAgICJOb3RHcmVhdGVyU2xhbnRFcXVhbDsiOiAiXHUyYTdlXHUwMzM4IiwKICAgICJOb3RHcmVhdGVyVGlsZGU7IjogIlx1MjI3NSIsCiAgICAiTm90SHVtcERvd25IdW1wOyI6ICJcdTIyNGVcdTAzMzgiLAogICAgIk5vdEh1bXBFcXVhbDsiOiAiXHUyMjRmXHUwMzM4IiwKICAgICJOb3RMZWZ0VHJpYW5nbGU7IjogIlx1MjJlYSIsCiAgICAiTm90TGVmdFRyaWFuZ2xlQmFyOyI6ICJcdTI5Y2ZcdTAzMzgiLAogICAgIk5vdExlZnRUcmlhbmdsZUVxdWFsOyI6ICJcdTIyZWMiLAogICAgIk5vdExlc3M7IjogIlx1MjI2ZSIsCiAgICAiTm90TGVzc0VxdWFsOyI6ICJcdTIyNzAiLAogICAgIk5vdExlc3NHcmVhdGVyOyI6ICJcdTIyNzgiLAogICAgIk5vdExlc3NMZXNzOyI6ICJcdTIyNmFcdTAzMzgiLAogICAgIk5vdExlc3NTbGFudEVxdWFsOyI6ICJcdTJhN2RcdTAzMzgiLAogICAgIk5vdExlc3NUaWxkZTsiOiAiXHUyMjc0IiwKICAgICJOb3ROZXN0ZWRHcmVhdGVyR3JlYXRlcjsiOiAiXHUyYWEyXHUwMzM4IiwKICAgICJOb3ROZXN0ZWRMZXNzTGVzczsiOiAiXHUyYWExXHUwMzM4IiwKICAgICJOb3RQcmVjZWRlczsiOiAiXHUyMjgwIiwKICAgICJOb3RQcmVjZWRlc0VxdWFsOyI6ICJcdTJhYWZcdTAzMzgiLAogICAgIk5vdFByZWNlZGVzU2xhbnRFcXVhbDsiOiAiXHUyMmUwIiwKICAgICJOb3RSZXZlcnNlRWxlbWVudDsiOiAiXHUyMjBjIiwKICAgICJOb3RSaWdodFRyaWFuZ2xlOyI6ICJcdTIyZWIiLAogICAgIk5vdFJpZ2h0VHJpYW5nbGVCYXI7IjogIlx1MjlkMFx1MDMzOCIsCiAgICAiTm90UmlnaHRUcmlhbmdsZUVxdWFsOyI6ICJcdTIyZWQiLAogICAgIk5vdFNxdWFyZVN1YnNldDsiOiAiXHUyMjhmXHUwMzM4IiwKICAgICJOb3RTcXVhcmVTdWJzZXRFcXVhbDsiOiAiXHUyMmUyIiwKICAgICJOb3RTcXVhcmVTdXBlcnNldDsiOiAiXHUyMjkwXHUwMzM4IiwKICAgICJOb3RTcXVhcmVTdXBlcnNldEVxdWFsOyI6ICJcdTIyZTMiLAogICAgIk5vdFN1YnNldDsiOiAiXHUyMjgyXHUyMGQyIiwKICAgICJOb3RTdWJzZXRFcXVhbDsiOiAiXHUyMjg4IiwKICAgICJOb3RTdWNjZWVkczsiOiAiXHUyMjgxIiwKICAgICJOb3RTdWNjZWVkc0VxdWFsOyI6ICJcdTJhYjBcdTAzMzgiLAogICAgIk5vdFN1Y2NlZWRzU2xhbnRFcXVhbDsiOiAiXHUyMmUxIiwKICAgICJOb3RTdWNjZWVkc1RpbGRlOyI6ICJcdTIyN2ZcdTAzMzgiLAogICAgIk5vdFN1cGVyc2V0OyI6ICJcdTIyODNcdTIwZDIiLAogICAgIk5vdFN1cGVyc2V0RXF1YWw7IjogIlx1MjI4OSIsCiAgICAiTm90VGlsZGU7IjogIlx1MjI0MSIsCiAgICAiTm90VGlsZGVFcXVhbDsiOiAiXHUyMjQ0IiwKICAgICJOb3RUaWxkZUZ1bGxFcXVhbDsiOiAiXHUyMjQ3IiwKICAgICJOb3RUaWxkZVRpbGRlOyI6ICJcdTIyNDkiLAogICAgIk5vdFZlcnRpY2FsQmFyOyI6ICJcdTIyMjQiLAogICAgIk5zY3I7IjogIlxVMDAwMWQ0YTkiLAogICAgIk50aWxkZSI6ICJceGQxIiwKICAgICJOdGlsZGU7IjogIlx4ZDEiLAogICAgIk51OyI6ICJcdTAzOWQiLAogICAgIk9FbGlnOyI6ICJcdTAxNTIiLAogICAgIk9hY3V0ZSI6ICJceGQzIiwKICAgICJPYWN1dGU7IjogIlx4ZDMiLAogICAgIk9jaXJjIjogIlx4ZDQiLAogICAgIk9jaXJjOyI6ICJceGQ0IiwKICAgICJPY3k7IjogIlx1MDQxZSIsCiAgICAiT2RibGFjOyI6ICJcdTAxNTAiLAogICAgIk9mcjsiOiAiXFUwMDAxZDUxMiIsCiAgICAiT2dyYXZlIjogIlx4ZDIiLAogICAgIk9ncmF2ZTsiOiAiXHhkMiIsCiAgICAiT21hY3I7IjogIlx1MDE0YyIsCiAgICAiT21lZ2E7IjogIlx1MDNhOSIsCiAgICAiT21pY3JvbjsiOiAiXHUwMzlmIiwKICAgICJPb3BmOyI6ICJcVTAwMDFkNTQ2IiwKICAgICJPcGVuQ3VybHlEb3VibGVRdW90ZTsiOiAiXHUyMDFjIiwKICAgICJPcGVuQ3VybHlRdW90ZTsiOiAiXHUyMDE4IiwKICAgICJPcjsiOiAiXHUyYTU0IiwKICAgICJPc2NyOyI6ICJcVTAwMDFkNGFhIiwKICAgICJPc2xhc2giOiAiXHhkOCIsCiAgICAiT3NsYXNoOyI6ICJceGQ4IiwKICAgICJPdGlsZGUiOiAiXHhkNSIsCiAgICAiT3RpbGRlOyI6ICJceGQ1IiwKICAgICJPdGltZXM7IjogIlx1MmEzNyIsCiAgICAiT3VtbCI6ICJceGQ2IiwKICAgICJPdW1sOyI6ICJceGQ2IiwKICAgICJPdmVyQmFyOyI6ICJcdTIwM2UiLAogICAgIk92ZXJCcmFjZTsiOiAiXHUyM2RlIiwKICAgICJPdmVyQnJhY2tldDsiOiAiXHUyM2I0IiwKICAgICJPdmVyUGFyZW50aGVzaXM7IjogIlx1MjNkYyIsCiAgICAiUGFydGlhbEQ7IjogIlx1MjIwMiIsCiAgICAiUGN5OyI6ICJcdTA0MWYiLAogICAgIlBmcjsiOiAiXFUwMDAxZDUxMyIsCiAgICAiUGhpOyI6ICJcdTAzYTYiLAogICAgIlBpOyI6ICJcdTAzYTAiLAogICAgIlBsdXNNaW51czsiOiAiXHhiMSIsCiAgICAiUG9pbmNhcmVwbGFuZTsiOiAiXHUyMTBjIiwKICAgICJQb3BmOyI6ICJcdTIxMTkiLAogICAgIlByOyI6ICJcdTJhYmIiLAogICAgIlByZWNlZGVzOyI6ICJcdTIyN2EiLAogICAgIlByZWNlZGVzRXF1YWw7IjogIlx1MmFhZiIsCiAgICAiUHJlY2VkZXNTbGFudEVxdWFsOyI6ICJcdTIyN2MiLAogICAgIlByZWNlZGVzVGlsZGU7IjogIlx1MjI3ZSIsCiAgICAiUHJpbWU7IjogIlx1MjAzMyIsCiAgICAiUHJvZHVjdDsiOiAiXHUyMjBmIiwKICAgICJQcm9wb3J0aW9uOyI6ICJcdTIyMzciLAogICAgIlByb3BvcnRpb25hbDsiOiAiXHUyMjFkIiwKICAgICJQc2NyOyI6ICJcVTAwMDFkNGFiIiwKICAgICJQc2k7IjogIlx1MDNhOCIsCiAgICAiUVVPVCI6ICJcIiIsCiAgICAiUVVPVDsiOiAiXCIiLAogICAgIlFmcjsiOiAiXFUwMDAxZDUxNCIsCiAgICAiUW9wZjsiOiAiXHUyMTFhIiwKICAgICJRc2NyOyI6ICJcVTAwMDFkNGFjIiwKICAgICJSQmFycjsiOiAiXHUyOTEwIiwKICAgICJSRUciOiAiXHhhZSIsCiAgICAiUkVHOyI6ICJceGFlIiwKICAgICJSYWN1dGU7IjogIlx1MDE1NCIsCiAgICAiUmFuZzsiOiAiXHUyN2ViIiwKICAgICJSYXJyOyI6ICJcdTIxYTAiLAogICAgIlJhcnJ0bDsiOiAiXHUyOTE2IiwKICAgICJSY2Fyb247IjogIlx1MDE1OCIsCiAgICAiUmNlZGlsOyI6ICJcdTAxNTYiLAogICAgIlJjeTsiOiAiXHUwNDIwIiwKICAgICJSZTsiOiAiXHUyMTFjIiwKICAgICJSZXZlcnNlRWxlbWVudDsiOiAiXHUyMjBiIiwKICAgICJSZXZlcnNlRXF1aWxpYnJpdW07IjogIlx1MjFjYiIsCiAgICAiUmV2ZXJzZVVwRXF1aWxpYnJpdW07IjogIlx1Mjk2ZiIsCiAgICAiUmZyOyI6ICJcdTIxMWMiLAogICAgIlJobzsiOiAiXHUwM2ExIiwKICAgICJSaWdodEFuZ2xlQnJhY2tldDsiOiAiXHUyN2U5IiwKICAgICJSaWdodEFycm93OyI6ICJcdTIxOTIiLAogICAgIlJpZ2h0QXJyb3dCYXI7IjogIlx1MjFlNSIsCiAgICAiUmlnaHRBcnJvd0xlZnRBcnJvdzsiOiAiXHUyMWM0IiwKICAgICJSaWdodENlaWxpbmc7IjogIlx1MjMwOSIsCiAgICAiUmlnaHREb3VibGVCcmFja2V0OyI6ICJcdTI3ZTciLAogICAgIlJpZ2h0RG93blRlZVZlY3RvcjsiOiAiXHUyOTVkIiwKICAgICJSaWdodERvd25WZWN0b3I7IjogIlx1MjFjMiIsCiAgICAiUmlnaHREb3duVmVjdG9yQmFyOyI6ICJcdTI5NTUiLAogICAgIlJpZ2h0Rmxvb3I7IjogIlx1MjMwYiIsCiAgICAiUmlnaHRUZWU7IjogIlx1MjJhMiIsCiAgICAiUmlnaHRUZWVBcnJvdzsiOiAiXHUyMWE2IiwKICAgICJSaWdodFRlZVZlY3RvcjsiOiAiXHUyOTViIiwKICAgICJSaWdodFRyaWFuZ2xlOyI6ICJcdTIyYjMiLAogICAgIlJpZ2h0VHJpYW5nbGVCYXI7IjogIlx1MjlkMCIsCiAgICAiUmlnaHRUcmlhbmdsZUVxdWFsOyI6ICJcdTIyYjUiLAogICAgIlJpZ2h0VXBEb3duVmVjdG9yOyI6ICJcdTI5NGYiLAogICAgIlJpZ2h0VXBUZWVWZWN0b3I7IjogIlx1Mjk1YyIsCiAgICAiUmlnaHRVcFZlY3RvcjsiOiAiXHUyMWJlIiwKICAgICJSaWdodFVwVmVjdG9yQmFyOyI6ICJcdTI5NTQiLAogICAgIlJpZ2h0VmVjdG9yOyI6ICJcdTIxYzAiLAogICAgIlJpZ2h0VmVjdG9yQmFyOyI6ICJcdTI5NTMiLAogICAgIlJpZ2h0YXJyb3c7IjogIlx1MjFkMiIsCiAgICAiUm9wZjsiOiAiXHUyMTFkIiwKICAgICJSb3VuZEltcGxpZXM7IjogIlx1Mjk3MCIsCiAgICAiUnJpZ2h0YXJyb3c7IjogIlx1MjFkYiIsCiAgICAiUnNjcjsiOiAiXHUyMTFiIiwKICAgICJSc2g7IjogIlx1MjFiMSIsCiAgICAiUnVsZURlbGF5ZWQ7IjogIlx1MjlmNCIsCiAgICAiU0hDSGN5OyI6ICJcdTA0MjkiLAogICAgIlNIY3k7IjogIlx1MDQyOCIsCiAgICAiU09GVGN5OyI6ICJcdTA0MmMiLAogICAgIlNhY3V0ZTsiOiAiXHUwMTVhIiwKICAgICJTYzsiOiAiXHUyYWJjIiwKICAgICJTY2Fyb247IjogIlx1MDE2MCIsCiAgICAiU2NlZGlsOyI6ICJcdTAxNWUiLAogICAgIlNjaXJjOyI6ICJcdTAxNWMiLAogICAgIlNjeTsiOiAiXHUwNDIxIiwKICAgICJTZnI7IjogIlxVMDAwMWQ1MTYiLAogICAgIlNob3J0RG93bkFycm93OyI6ICJcdTIxOTMiLAogICAgIlNob3J0TGVmdEFycm93OyI6ICJcdTIxOTAiLAogICAgIlNob3J0UmlnaHRBcnJvdzsiOiAiXHUyMTkyIiwKICAgICJTaG9ydFVwQXJyb3c7IjogIlx1MjE5MSIsCiAgICAiU2lnbWE7IjogIlx1MDNhMyIsCiAgICAiU21hbGxDaXJjbGU7IjogIlx1MjIxOCIsCiAgICAiU29wZjsiOiAiXFUwMDAxZDU0YSIsCiAgICAiU3FydDsiOiAiXHUyMjFhIiwKICAgICJTcXVhcmU7IjogIlx1MjVhMSIsCiAgICAiU3F1YXJlSW50ZXJzZWN0aW9uOyI6ICJcdTIyOTMiLAogICAgIlNxdWFyZVN1YnNldDsiOiAiXHUyMjhmIiwKICAgICJTcXVhcmVTdWJzZXRFcXVhbDsiOiAiXHUyMjkxIiwKICAgICJTcXVhcmVTdXBlcnNldDsiOiAiXHUyMjkwIiwKICAgICJTcXVhcmVTdXBlcnNldEVxdWFsOyI6ICJcdTIyOTIiLAogICAgIlNxdWFyZVVuaW9uOyI6ICJcdTIyOTQiLAogICAgIlNzY3I7IjogIlxVMDAwMWQ0YWUiLAogICAgIlN0YXI7IjogIlx1MjJjNiIsCiAgICAiU3ViOyI6ICJcdTIyZDAiLAogICAgIlN1YnNldDsiOiAiXHUyMmQwIiwKICAgICJTdWJzZXRFcXVhbDsiOiAiXHUyMjg2IiwKICAgICJTdWNjZWVkczsiOiAiXHUyMjdiIiwKICAgICJTdWNjZWVkc0VxdWFsOyI6ICJcdTJhYjAiLAogICAgIlN1Y2NlZWRzU2xhbnRFcXVhbDsiOiAiXHUyMjdkIiwKICAgICJTdWNjZWVkc1RpbGRlOyI6ICJcdTIyN2YiLAogICAgIlN1Y2hUaGF0OyI6ICJcdTIyMGIiLAogICAgIlN1bTsiOiAiXHUyMjExIiwKICAgICJTdXA7IjogIlx1MjJkMSIsCiAgICAiU3VwZXJzZXQ7IjogIlx1MjI4MyIsCiAgICAiU3VwZXJzZXRFcXVhbDsiOiAiXHUyMjg3IiwKICAgICJTdXBzZXQ7IjogIlx1MjJkMSIsCiAgICAiVEhPUk4iOiAiXHhkZSIsCiAgICAiVEhPUk47IjogIlx4ZGUiLAogICAgIlRSQURFOyI6ICJcdTIxMjIiLAogICAgIlRTSGN5OyI6ICJcdTA0MGIiLAogICAgIlRTY3k7IjogIlx1MDQyNiIsCiAgICAiVGFiOyI6ICJcdCIsCiAgICAiVGF1OyI6ICJcdTAzYTQiLAogICAgIlRjYXJvbjsiOiAiXHUwMTY0IiwKICAgICJUY2VkaWw7IjogIlx1MDE2MiIsCiAgICAiVGN5OyI6ICJcdTA0MjIiLAogICAgIlRmcjsiOiAiXFUwMDAxZDUxNyIsCiAgICAiVGhlcmVmb3JlOyI6ICJcdTIyMzQiLAogICAgIlRoZXRhOyI6ICJcdTAzOTgiLAogICAgIlRoaWNrU3BhY2U7IjogIlx1MjA1Zlx1MjAwYSIsCiAgICAiVGhpblNwYWNlOyI6ICJcdTIwMDkiLAogICAgIlRpbGRlOyI6ICJcdTIyM2MiLAogICAgIlRpbGRlRXF1YWw7IjogIlx1MjI0MyIsCiAgICAiVGlsZGVGdWxsRXF1YWw7IjogIlx1MjI0NSIsCiAgICAiVGlsZGVUaWxkZTsiOiAiXHUyMjQ4IiwKICAgICJUb3BmOyI6ICJcVTAwMDFkNTRiIiwKICAgICJUcmlwbGVEb3Q7IjogIlx1MjBkYiIsCiAgICAiVHNjcjsiOiAiXFUwMDAxZDRhZiIsCiAgICAiVHN0cm9rOyI6ICJcdTAxNjYiLAogICAgIlVhY3V0ZSI6ICJceGRhIiwKICAgICJVYWN1dGU7IjogIlx4ZGEiLAogICAgIlVhcnI7IjogIlx1MjE5ZiIsCiAgICAiVWFycm9jaXI7IjogIlx1Mjk0OSIsCiAgICAiVWJyY3k7IjogIlx1MDQwZSIsCiAgICAiVWJyZXZlOyI6ICJcdTAxNmMiLAogICAgIlVjaXJjIjogIlx4ZGIiLAogICAgIlVjaXJjOyI6ICJceGRiIiwKICAgICJVY3k7IjogIlx1MDQyMyIsCiAgICAiVWRibGFjOyI6ICJcdTAxNzAiLAogICAgIlVmcjsiOiAiXFUwMDAxZDUxOCIsCiAgICAiVWdyYXZlIjogIlx4ZDkiLAogICAgIlVncmF2ZTsiOiAiXHhkOSIsCiAgICAiVW1hY3I7IjogIlx1MDE2YSIsCiAgICAiVW5kZXJCYXI7IjogIl8iLAogICAgIlVuZGVyQnJhY2U7IjogIlx1MjNkZiIsCiAgICAiVW5kZXJCcmFja2V0OyI6ICJcdTIzYjUiLAogICAgIlVuZGVyUGFyZW50aGVzaXM7IjogIlx1MjNkZCIsCiAgICAiVW5pb247IjogIlx1MjJjMyIsCiAgICAiVW5pb25QbHVzOyI6ICJcdTIyOGUiLAogICAgIlVvZ29uOyI6ICJcdTAxNzIiLAogICAgIlVvcGY7IjogIlxVMDAwMWQ1NGMiLAogICAgIlVwQXJyb3c7IjogIlx1MjE5MSIsCiAgICAiVXBBcnJvd0JhcjsiOiAiXHUyOTEyIiwKICAgICJVcEFycm93RG93bkFycm93OyI6ICJcdTIxYzUiLAogICAgIlVwRG93bkFycm93OyI6ICJcdTIxOTUiLAogICAgIlVwRXF1aWxpYnJpdW07IjogIlx1Mjk2ZSIsCiAgICAiVXBUZWU7IjogIlx1MjJhNSIsCiAgICAiVXBUZWVBcnJvdzsiOiAiXHUyMWE1IiwKICAgICJVcGFycm93OyI6ICJcdTIxZDEiLAogICAgIlVwZG93bmFycm93OyI6ICJcdTIxZDUiLAogICAgIlVwcGVyTGVmdEFycm93OyI6ICJcdTIxOTYiLAogICAgIlVwcGVyUmlnaHRBcnJvdzsiOiAiXHUyMTk3IiwKICAgICJVcHNpOyI6ICJcdTAzZDIiLAogICAgIlVwc2lsb247IjogIlx1MDNhNSIsCiAgICAiVXJpbmc7IjogIlx1MDE2ZSIsCiAgICAiVXNjcjsiOiAiXFUwMDAxZDRiMCIsCiAgICAiVXRpbGRlOyI6ICJcdTAxNjgiLAogICAgIlV1bWwiOiAiXHhkYyIsCiAgICAiVXVtbDsiOiAiXHhkYyIsCiAgICAiVkRhc2g7IjogIlx1MjJhYiIsCiAgICAiVmJhcjsiOiAiXHUyYWViIiwKICAgICJWY3k7IjogIlx1MDQxMiIsCiAgICAiVmRhc2g7IjogIlx1MjJhOSIsCiAgICAiVmRhc2hsOyI6ICJcdTJhZTYiLAogICAgIlZlZTsiOiAiXHUyMmMxIiwKICAgICJWZXJiYXI7IjogIlx1MjAxNiIsCiAgICAiVmVydDsiOiAiXHUyMDE2IiwKICAgICJWZXJ0aWNhbEJhcjsiOiAiXHUyMjIzIiwKICAgICJWZXJ0aWNhbExpbmU7IjogInwiLAogICAgIlZlcnRpY2FsU2VwYXJhdG9yOyI6ICJcdTI3NTgiLAogICAgIlZlcnRpY2FsVGlsZGU7IjogIlx1MjI0MCIsCiAgICAiVmVyeVRoaW5TcGFjZTsiOiAiXHUyMDBhIiwKICAgICJWZnI7IjogIlxVMDAwMWQ1MTkiLAogICAgIlZvcGY7IjogIlxVMDAwMWQ1NGQiLAogICAgIlZzY3I7IjogIlxVMDAwMWQ0YjEiLAogICAgIlZ2ZGFzaDsiOiAiXHUyMmFhIiwKICAgICJXY2lyYzsiOiAiXHUwMTc0IiwKICAgICJXZWRnZTsiOiAiXHUyMmMwIiwKICAgICJXZnI7IjogIlxVMDAwMWQ1MWEiLAogICAgIldvcGY7IjogIlxVMDAwMWQ1NGUiLAogICAgIldzY3I7IjogIlxVMDAwMWQ0YjIiLAogICAgIlhmcjsiOiAiXFUwMDAxZDUxYiIsCiAgICAiWGk7IjogIlx1MDM5ZSIsCiAgICAiWG9wZjsiOiAiXFUwMDAxZDU0ZiIsCiAgICAiWHNjcjsiOiAiXFUwMDAxZDRiMyIsCiAgICAiWUFjeTsiOiAiXHUwNDJmIiwKICAgICJZSWN5OyI6ICJcdTA0MDciLAogICAgIllVY3k7IjogIlx1MDQyZSIsCiAgICAiWWFjdXRlIjogIlx4ZGQiLAogICAgIllhY3V0ZTsiOiAiXHhkZCIsCiAgICAiWWNpcmM7IjogIlx1MDE3NiIsCiAgICAiWWN5OyI6ICJcdTA0MmIiLAogICAgIllmcjsiOiAiXFUwMDAxZDUxYyIsCiAgICAiWW9wZjsiOiAiXFUwMDAxZDU1MCIsCiAgICAiWXNjcjsiOiAiXFUwMDAxZDRiNCIsCiAgICAiWXVtbDsiOiAiXHUwMTc4IiwKICAgICJaSGN5OyI6ICJcdTA0MTYiLAogICAgIlphY3V0ZTsiOiAiXHUwMTc5IiwKICAgICJaY2Fyb247IjogIlx1MDE3ZCIsCiAgICAiWmN5OyI6ICJcdTA0MTciLAogICAgIlpkb3Q7IjogIlx1MDE3YiIsCiAgICAiWmVyb1dpZHRoU3BhY2U7IjogIlx1MjAwYiIsCiAgICAiWmV0YTsiOiAiXHUwMzk2IiwKICAgICJaZnI7IjogIlx1MjEyOCIsCiAgICAiWm9wZjsiOiAiXHUyMTI0IiwKICAgICJac2NyOyI6ICJcVTAwMDFkNGI1IiwKICAgICJhYWN1dGUiOiAiXHhlMSIsCiAgICAiYWFjdXRlOyI6ICJceGUxIiwKICAgICJhYnJldmU7IjogIlx1MDEwMyIsCiAgICAiYWM7IjogIlx1MjIzZSIsCiAgICAiYWNFOyI6ICJcdTIyM2VcdTAzMzMiLAogICAgImFjZDsiOiAiXHUyMjNmIiwKICAgICJhY2lyYyI6ICJceGUyIiwKICAgICJhY2lyYzsiOiAiXHhlMiIsCiAgICAiYWN1dGUiOiAiXHhiNCIsCiAgICAiYWN1dGU7IjogIlx4YjQiLAogICAgImFjeTsiOiAiXHUwNDMwIiwKICAgICJhZWxpZyI6ICJceGU2IiwKICAgICJhZWxpZzsiOiAiXHhlNiIsCiAgICAiYWY7IjogIlx1MjA2MSIsCiAgICAiYWZyOyI6ICJcVTAwMDFkNTFlIiwKICAgICJhZ3JhdmUiOiAiXHhlMCIsCiAgICAiYWdyYXZlOyI6ICJceGUwIiwKICAgICJhbGVmc3ltOyI6ICJcdTIxMzUiLAogICAgImFsZXBoOyI6ICJcdTIxMzUiLAogICAgImFscGhhOyI6ICJcdTAzYjEiLAogICAgImFtYWNyOyI6ICJcdTAxMDEiLAogICAgImFtYWxnOyI6ICJcdTJhM2YiLAogICAgImFtcCI6ICImIiwKICAgICJhbXA7IjogIiYiLAogICAgImFuZDsiOiAiXHUyMjI3IiwKICAgICJhbmRhbmQ7IjogIlx1MmE1NSIsCiAgICAiYW5kZDsiOiAiXHUyYTVjIiwKICAgICJhbmRzbG9wZTsiOiAiXHUyYTU4IiwKICAgICJhbmR2OyI6ICJcdTJhNWEiLAogICAgImFuZzsiOiAiXHUyMjIwIiwKICAgICJhbmdlOyI6ICJcdTI5YTQiLAogICAgImFuZ2xlOyI6ICJcdTIyMjAiLAogICAgImFuZ21zZDsiOiAiXHUyMjIxIiwKICAgICJhbmdtc2RhYTsiOiAiXHUyOWE4IiwKICAgICJhbmdtc2RhYjsiOiAiXHUyOWE5IiwKICAgICJhbmdtc2RhYzsiOiAiXHUyOWFhIiwKICAgICJhbmdtc2RhZDsiOiAiXHUyOWFiIiwKICAgICJhbmdtc2RhZTsiOiAiXHUyOWFjIiwKICAgICJhbmdtc2RhZjsiOiAiXHUyOWFkIiwKICAgICJhbmdtc2RhZzsiOiAiXHUyOWFlIiwKICAgICJhbmdtc2RhaDsiOiAiXHUyOWFmIiwKICAgICJhbmdydDsiOiAiXHUyMjFmIiwKICAgICJhbmdydHZiOyI6ICJcdTIyYmUiLAogICAgImFuZ3J0dmJkOyI6ICJcdTI5OWQiLAogICAgImFuZ3NwaDsiOiAiXHUyMjIyIiwKICAgICJhbmdzdDsiOiAiXHhjNSIsCiAgICAiYW5nemFycjsiOiAiXHUyMzdjIiwKICAgICJhb2dvbjsiOiAiXHUwMTA1IiwKICAgICJhb3BmOyI6ICJcVTAwMDFkNTUyIiwKICAgICJhcDsiOiAiXHUyMjQ4IiwKICAgICJhcEU7IjogIlx1MmE3MCIsCiAgICAiYXBhY2lyOyI6ICJcdTJhNmYiLAogICAgImFwZTsiOiAiXHUyMjRhIiwKICAgICJhcGlkOyI6ICJcdTIyNGIiLAogICAgImFwb3M7IjogIiciLAogICAgImFwcHJveDsiOiAiXHUyMjQ4IiwKICAgICJhcHByb3hlcTsiOiAiXHUyMjRhIiwKICAgICJhcmluZyI6ICJceGU1IiwKICAgICJhcmluZzsiOiAiXHhlNSIsCiAgICAiYXNjcjsiOiAiXFUwMDAxZDRiNiIsCiAgICAiYXN0OyI6ICIqIiwKICAgICJhc3ltcDsiOiAiXHUyMjQ4IiwKICAgICJhc3ltcGVxOyI6ICJcdTIyNGQiLAogICAgImF0aWxkZSI6ICJceGUzIiwKICAgICJhdGlsZGU7IjogIlx4ZTMiLAogICAgImF1bWwiOiAiXHhlNCIsCiAgICAiYXVtbDsiOiAiXHhlNCIsCiAgICAiYXdjb25pbnQ7IjogIlx1MjIzMyIsCiAgICAiYXdpbnQ7IjogIlx1MmExMSIsCiAgICAiYk5vdDsiOiAiXHUyYWVkIiwKICAgICJiYWNrY29uZzsiOiAiXHUyMjRjIiwKICAgICJiYWNrZXBzaWxvbjsiOiAiXHUwM2Y2IiwKICAgICJiYWNrcHJpbWU7IjogIlx1MjAzNSIsCiAgICAiYmFja3NpbTsiOiAiXHUyMjNkIiwKICAgICJiYWNrc2ltZXE7IjogIlx1MjJjZCIsCiAgICAiYmFydmVlOyI6ICJcdTIyYmQiLAogICAgImJhcndlZDsiOiAiXHUyMzA1IiwKICAgICJiYXJ3ZWRnZTsiOiAiXHUyMzA1IiwKICAgICJiYnJrOyI6ICJcdTIzYjUiLAogICAgImJicmt0YnJrOyI6ICJcdTIzYjYiLAogICAgImJjb25nOyI6ICJcdTIyNGMiLAogICAgImJjeTsiOiAiXHUwNDMxIiwKICAgICJiZHF1bzsiOiAiXHUyMDFlIiwKICAgICJiZWNhdXM7IjogIlx1MjIzNSIsCiAgICAiYmVjYXVzZTsiOiAiXHUyMjM1IiwKICAgICJiZW1wdHl2OyI6ICJcdTI5YjAiLAogICAgImJlcHNpOyI6ICJcdTAzZjYiLAogICAgImJlcm5vdTsiOiAiXHUyMTJjIiwKICAgICJiZXRhOyI6ICJcdTAzYjIiLAogICAgImJldGg7IjogIlx1MjEzNiIsCiAgICAiYmV0d2VlbjsiOiAiXHUyMjZjIiwKICAgICJiZnI7IjogIlxVMDAwMWQ1MWYiLAogICAgImJpZ2NhcDsiOiAiXHUyMmMyIiwKICAgICJiaWdjaXJjOyI6ICJcdTI1ZWYiLAogICAgImJpZ2N1cDsiOiAiXHUyMmMzIiwKICAgICJiaWdvZG90OyI6ICJcdTJhMDAiLAogICAgImJpZ29wbHVzOyI6ICJcdTJhMDEiLAogICAgImJpZ290aW1lczsiOiAiXHUyYTAyIiwKICAgICJiaWdzcWN1cDsiOiAiXHUyYTA2IiwKICAgICJiaWdzdGFyOyI6ICJcdTI2MDUiLAogICAgImJpZ3RyaWFuZ2xlZG93bjsiOiAiXHUyNWJkIiwKICAgICJiaWd0cmlhbmdsZXVwOyI6ICJcdTI1YjMiLAogICAgImJpZ3VwbHVzOyI6ICJcdTJhMDQiLAogICAgImJpZ3ZlZTsiOiAiXHUyMmMxIiwKICAgICJiaWd3ZWRnZTsiOiAiXHUyMmMwIiwKICAgICJia2Fyb3c7IjogIlx1MjkwZCIsCiAgICAiYmxhY2tsb3plbmdlOyI6ICJcdTI5ZWIiLAogICAgImJsYWNrc3F1YXJlOyI6ICJcdTI1YWEiLAogICAgImJsYWNrdHJpYW5nbGU7IjogIlx1MjViNCIsCiAgICAiYmxhY2t0cmlhbmdsZWRvd247IjogIlx1MjViZSIsCiAgICAiYmxhY2t0cmlhbmdsZWxlZnQ7IjogIlx1MjVjMiIsCiAgICAiYmxhY2t0cmlhbmdsZXJpZ2h0OyI6ICJcdTI1YjgiLAogICAgImJsYW5rOyI6ICJcdTI0MjMiLAogICAgImJsazEyOyI6ICJcdTI1OTIiLAogICAgImJsazE0OyI6ICJcdTI1OTEiLAogICAgImJsazM0OyI6ICJcdTI1OTMiLAogICAgImJsb2NrOyI6ICJcdTI1ODgiLAogICAgImJuZTsiOiAiPVx1MjBlNSIsCiAgICAiYm5lcXVpdjsiOiAiXHUyMjYxXHUyMGU1IiwKICAgICJibm90OyI6ICJcdTIzMTAiLAogICAgImJvcGY7IjogIlxVMDAwMWQ1NTMiLAogICAgImJvdDsiOiAiXHUyMmE1IiwKICAgICJib3R0b207IjogIlx1MjJhNSIsCiAgICAiYm93dGllOyI6ICJcdTIyYzgiLAogICAgImJveERMOyI6ICJcdTI1NTciLAogICAgImJveERSOyI6ICJcdTI1NTQiLAogICAgImJveERsOyI6ICJcdTI1NTYiLAogICAgImJveERyOyI6ICJcdTI1NTMiLAogICAgImJveEg7IjogIlx1MjU1MCIsCiAgICAiYm94SEQ7IjogIlx1MjU2NiIsCiAgICAiYm94SFU7IjogIlx1MjU2OSIsCiAgICAiYm94SGQ7IjogIlx1MjU2NCIsCiAgICAiYm94SHU7IjogIlx1MjU2NyIsCiAgICAiYm94VUw7IjogIlx1MjU1ZCIsCiAgICAiYm94VVI7IjogIlx1MjU1YSIsCiAgICAiYm94VWw7IjogIlx1MjU1YyIsCiAgICAiYm94VXI7IjogIlx1MjU1OSIsCiAgICAiYm94VjsiOiAiXHUyNTUxIiwKICAgICJib3hWSDsiOiAiXHUyNTZjIiwKICAgICJib3hWTDsiOiAiXHUyNTYzIiwKICAgICJib3hWUjsiOiAiXHUyNTYwIiwKICAgICJib3hWaDsiOiAiXHUyNTZiIiwKICAgICJib3hWbDsiOiAiXHUyNTYyIiwKICAgICJib3hWcjsiOiAiXHUyNTVmIiwKICAgICJib3hib3g7IjogIlx1MjljOSIsCiAgICAiYm94ZEw7IjogIlx1MjU1NSIsCiAgICAiYm94ZFI7IjogIlx1MjU1MiIsCiAgICAiYm94ZGw7IjogIlx1MjUxMCIsCiAgICAiYm94ZHI7IjogIlx1MjUwYyIsCiAgICAiYm94aDsiOiAiXHUyNTAwIiwKICAgICJib3hoRDsiOiAiXHUyNTY1IiwKICAgICJib3hoVTsiOiAiXHUyNTY4IiwKICAgICJib3hoZDsiOiAiXHUyNTJjIiwKICAgICJib3hodTsiOiAiXHUyNTM0IiwKICAgICJib3htaW51czsiOiAiXHUyMjlmIiwKICAgICJib3hwbHVzOyI6ICJcdTIyOWUiLAogICAgImJveHRpbWVzOyI6ICJcdTIyYTAiLAogICAgImJveHVMOyI6ICJcdTI1NWIiLAogICAgImJveHVSOyI6ICJcdTI1NTgiLAogICAgImJveHVsOyI6ICJcdTI1MTgiLAogICAgImJveHVyOyI6ICJcdTI1MTQiLAogICAgImJveHY7IjogIlx1MjUwMiIsCiAgICAiYm94dkg7IjogIlx1MjU2YSIsCiAgICAiYm94dkw7IjogIlx1MjU2MSIsCiAgICAiYm94dlI7IjogIlx1MjU1ZSIsCiAgICAiYm94dmg7IjogIlx1MjUzYyIsCiAgICAiYm94dmw7IjogIlx1MjUyNCIsCiAgICAiYm94dnI7IjogIlx1MjUxYyIsCiAgICAiYnByaW1lOyI6ICJcdTIwMzUiLAogICAgImJyZXZlOyI6ICJcdTAyZDgiLAogICAgImJydmJhciI6ICJceGE2IiwKICAgICJicnZiYXI7IjogIlx4YTYiLAogICAgImJzY3I7IjogIlxVMDAwMWQ0YjciLAogICAgImJzZW1pOyI6ICJcdTIwNGYiLAogICAgImJzaW07IjogIlx1MjIzZCIsCiAgICAiYnNpbWU7IjogIlx1MjJjZCIsCiAgICAiYnNvbDsiOiAiXFwiLAogICAgImJzb2xiOyI6ICJcdTI5YzUiLAogICAgImJzb2xoc3ViOyI6ICJcdTI3YzgiLAogICAgImJ1bGw7IjogIlx1MjAyMiIsCiAgICAiYnVsbGV0OyI6ICJcdTIwMjIiLAogICAgImJ1bXA7IjogIlx1MjI0ZSIsCiAgICAiYnVtcEU7IjogIlx1MmFhZSIsCiAgICAiYnVtcGU7IjogIlx1MjI0ZiIsCiAgICAiYnVtcGVxOyI6ICJcdTIyNGYiLAogICAgImNhY3V0ZTsiOiAiXHUwMTA3IiwKICAgICJjYXA7IjogIlx1MjIyOSIsCiAgICAiY2FwYW5kOyI6ICJcdTJhNDQiLAogICAgImNhcGJyY3VwOyI6ICJcdTJhNDkiLAogICAgImNhcGNhcDsiOiAiXHUyYTRiIiwKICAgICJjYXBjdXA7IjogIlx1MmE0NyIsCiAgICAiY2FwZG90OyI6ICJcdTJhNDAiLAogICAgImNhcHM7IjogIlx1MjIyOVx1ZmUwMCIsCiAgICAiY2FyZXQ7IjogIlx1MjA0MSIsCiAgICAiY2Fyb247IjogIlx1MDJjNyIsCiAgICAiY2NhcHM7IjogIlx1MmE0ZCIsCiAgICAiY2Nhcm9uOyI6ICJcdTAxMGQiLAogICAgImNjZWRpbCI6ICJceGU3IiwKICAgICJjY2VkaWw7IjogIlx4ZTciLAogICAgImNjaXJjOyI6ICJcdTAxMDkiLAogICAgImNjdXBzOyI6ICJcdTJhNGMiLAogICAgImNjdXBzc207IjogIlx1MmE1MCIsCiAgICAiY2RvdDsiOiAiXHUwMTBiIiwKICAgICJjZWRpbCI6ICJceGI4IiwKICAgICJjZWRpbDsiOiAiXHhiOCIsCiAgICAiY2VtcHR5djsiOiAiXHUyOWIyIiwKICAgICJjZW50IjogIlx4YTIiLAogICAgImNlbnQ7IjogIlx4YTIiLAogICAgImNlbnRlcmRvdDsiOiAiXHhiNyIsCiAgICAiY2ZyOyI6ICJcVTAwMDFkNTIwIiwKICAgICJjaGN5OyI6ICJcdTA0NDciLAogICAgImNoZWNrOyI6ICJcdTI3MTMiLAogICAgImNoZWNrbWFyazsiOiAiXHUyNzEzIiwKICAgICJjaGk7IjogIlx1MDNjNyIsCiAgICAiY2lyOyI6ICJcdTI1Y2IiLAogICAgImNpckU7IjogIlx1MjljMyIsCiAgICAiY2lyYzsiOiAiXHUwMmM2IiwKICAgICJjaXJjZXE7IjogIlx1MjI1NyIsCiAgICAiY2lyY2xlYXJyb3dsZWZ0OyI6ICJcdTIxYmEiLAogICAgImNpcmNsZWFycm93cmlnaHQ7IjogIlx1MjFiYiIsCiAgICAiY2lyY2xlZFI7IjogIlx4YWUiLAogICAgImNpcmNsZWRTOyI6ICJcdTI0YzgiLAogICAgImNpcmNsZWRhc3Q7IjogIlx1MjI5YiIsCiAgICAiY2lyY2xlZGNpcmM7IjogIlx1MjI5YSIsCiAgICAiY2lyY2xlZGRhc2g7IjogIlx1MjI5ZCIsCiAgICAiY2lyZTsiOiAiXHUyMjU3IiwKICAgICJjaXJmbmludDsiOiAiXHUyYTEwIiwKICAgICJjaXJtaWQ7IjogIlx1MmFlZiIsCiAgICAiY2lyc2NpcjsiOiAiXHUyOWMyIiwKICAgICJjbHViczsiOiAiXHUyNjYzIiwKICAgICJjbHVic3VpdDsiOiAiXHUyNjYzIiwKICAgICJjb2xvbjsiOiAiOiIsCiAgICAiY29sb25lOyI6ICJcdTIyNTQiLAogICAgImNvbG9uZXE7IjogIlx1MjI1NCIsCiAgICAiY29tbWE7IjogIiwiLAogICAgImNvbW1hdDsiOiAiQCIsCiAgICAiY29tcDsiOiAiXHUyMjAxIiwKICAgICJjb21wZm47IjogIlx1MjIxOCIsCiAgICAiY29tcGxlbWVudDsiOiAiXHUyMjAxIiwKICAgICJjb21wbGV4ZXM7IjogIlx1MjEwMiIsCiAgICAiY29uZzsiOiAiXHUyMjQ1IiwKICAgICJjb25nZG90OyI6ICJcdTJhNmQiLAogICAgImNvbmludDsiOiAiXHUyMjJlIiwKICAgICJjb3BmOyI6ICJcVTAwMDFkNTU0IiwKICAgICJjb3Byb2Q7IjogIlx1MjIxMCIsCiAgICAiY29weSI6ICJceGE5IiwKICAgICJjb3B5OyI6ICJceGE5IiwKICAgICJjb3B5c3I7IjogIlx1MjExNyIsCiAgICAiY3JhcnI7IjogIlx1MjFiNSIsCiAgICAiY3Jvc3M7IjogIlx1MjcxNyIsCiAgICAiY3NjcjsiOiAiXFUwMDAxZDRiOCIsCiAgICAiY3N1YjsiOiAiXHUyYWNmIiwKICAgICJjc3ViZTsiOiAiXHUyYWQxIiwKICAgICJjc3VwOyI6ICJcdTJhZDAiLAogICAgImNzdXBlOyI6ICJcdTJhZDIiLAogICAgImN0ZG90OyI6ICJcdTIyZWYiLAogICAgImN1ZGFycmw7IjogIlx1MjkzOCIsCiAgICAiY3VkYXJycjsiOiAiXHUyOTM1IiwKICAgICJjdWVwcjsiOiAiXHUyMmRlIiwKICAgICJjdWVzYzsiOiAiXHUyMmRmIiwKICAgICJjdWxhcnI7IjogIlx1MjFiNiIsCiAgICAiY3VsYXJycDsiOiAiXHUyOTNkIiwKICAgICJjdXA7IjogIlx1MjIyYSIsCiAgICAiY3VwYnJjYXA7IjogIlx1MmE0OCIsCiAgICAiY3VwY2FwOyI6ICJcdTJhNDYiLAogICAgImN1cGN1cDsiOiAiXHUyYTRhIiwKICAgICJjdXBkb3Q7IjogIlx1MjI4ZCIsCiAgICAiY3Vwb3I7IjogIlx1MmE0NSIsCiAgICAiY3VwczsiOiAiXHUyMjJhXHVmZTAwIiwKICAgICJjdXJhcnI7IjogIlx1MjFiNyIsCiAgICAiY3VyYXJybTsiOiAiXHUyOTNjIiwKICAgICJjdXJseWVxcHJlYzsiOiAiXHUyMmRlIiwKICAgICJjdXJseWVxc3VjYzsiOiAiXHUyMmRmIiwKICAgICJjdXJseXZlZTsiOiAiXHUyMmNlIiwKICAgICJjdXJseXdlZGdlOyI6ICJcdTIyY2YiLAogICAgImN1cnJlbiI6ICJceGE0IiwKICAgICJjdXJyZW47IjogIlx4YTQiLAogICAgImN1cnZlYXJyb3dsZWZ0OyI6ICJcdTIxYjYiLAogICAgImN1cnZlYXJyb3dyaWdodDsiOiAiXHUyMWI3IiwKICAgICJjdXZlZTsiOiAiXHUyMmNlIiwKICAgICJjdXdlZDsiOiAiXHUyMmNmIiwKICAgICJjd2NvbmludDsiOiAiXHUyMjMyIiwKICAgICJjd2ludDsiOiAiXHUyMjMxIiwKICAgICJjeWxjdHk7IjogIlx1MjMyZCIsCiAgICAiZEFycjsiOiAiXHUyMWQzIiwKICAgICJkSGFyOyI6ICJcdTI5NjUiLAogICAgImRhZ2dlcjsiOiAiXHUyMDIwIiwKICAgICJkYWxldGg7IjogIlx1MjEzOCIsCiAgICAiZGFycjsiOiAiXHUyMTkzIiwKICAgICJkYXNoOyI6ICJcdTIwMTAiLAogICAgImRhc2h2OyI6ICJcdTIyYTMiLAogICAgImRia2Fyb3c7IjogIlx1MjkwZiIsCiAgICAiZGJsYWM7IjogIlx1MDJkZCIsCiAgICAiZGNhcm9uOyI6ICJcdTAxMGYiLAogICAgImRjeTsiOiAiXHUwNDM0IiwKICAgICJkZDsiOiAiXHUyMTQ2IiwKICAgICJkZGFnZ2VyOyI6ICJcdTIwMjEiLAogICAgImRkYXJyOyI6ICJcdTIxY2EiLAogICAgImRkb3RzZXE7IjogIlx1MmE3NyIsCiAgICAiZGVnIjogIlx4YjAiLAogICAgImRlZzsiOiAiXHhiMCIsCiAgICAiZGVsdGE7IjogIlx1MDNiNCIsCiAgICAiZGVtcHR5djsiOiAiXHUyOWIxIiwKICAgICJkZmlzaHQ7IjogIlx1Mjk3ZiIsCiAgICAiZGZyOyI6ICJcVTAwMDFkNTIxIiwKICAgICJkaGFybDsiOiAiXHUyMWMzIiwKICAgICJkaGFycjsiOiAiXHUyMWMyIiwKICAgICJkaWFtOyI6ICJcdTIyYzQiLAogICAgImRpYW1vbmQ7IjogIlx1MjJjNCIsCiAgICAiZGlhbW9uZHN1aXQ7IjogIlx1MjY2NiIsCiAgICAiZGlhbXM7IjogIlx1MjY2NiIsCiAgICAiZGllOyI6ICJceGE4IiwKICAgICJkaWdhbW1hOyI6ICJcdTAzZGQiLAogICAgImRpc2luOyI6ICJcdTIyZjIiLAogICAgImRpdjsiOiAiXHhmNyIsCiAgICAiZGl2aWRlIjogIlx4ZjciLAogICAgImRpdmlkZTsiOiAiXHhmNyIsCiAgICAiZGl2aWRlb250aW1lczsiOiAiXHUyMmM3IiwKICAgICJkaXZvbng7IjogIlx1MjJjNyIsCiAgICAiZGpjeTsiOiAiXHUwNDUyIiwKICAgICJkbGNvcm47IjogIlx1MjMxZSIsCiAgICAiZGxjcm9wOyI6ICJcdTIzMGQiLAogICAgImRvbGxhcjsiOiAiJCIsCiAgICAiZG9wZjsiOiAiXFUwMDAxZDU1NSIsCiAgICAiZG90OyI6ICJcdTAyZDkiLAogICAgImRvdGVxOyI6ICJcdTIyNTAiLAogICAgImRvdGVxZG90OyI6ICJcdTIyNTEiLAogICAgImRvdG1pbnVzOyI6ICJcdTIyMzgiLAogICAgImRvdHBsdXM7IjogIlx1MjIxNCIsCiAgICAiZG90c3F1YXJlOyI6ICJcdTIyYTEiLAogICAgImRvdWJsZWJhcndlZGdlOyI6ICJcdTIzMDYiLAogICAgImRvd25hcnJvdzsiOiAiXHUyMTkzIiwKICAgICJkb3duZG93bmFycm93czsiOiAiXHUyMWNhIiwKICAgICJkb3duaGFycG9vbmxlZnQ7IjogIlx1MjFjMyIsCiAgICAiZG93bmhhcnBvb25yaWdodDsiOiAiXHUyMWMyIiwKICAgICJkcmJrYXJvdzsiOiAiXHUyOTEwIiwKICAgICJkcmNvcm47IjogIlx1MjMxZiIsCiAgICAiZHJjcm9wOyI6ICJcdTIzMGMiLAogICAgImRzY3I7IjogIlxVMDAwMWQ0YjkiLAogICAgImRzY3k7IjogIlx1MDQ1NSIsCiAgICAiZHNvbDsiOiAiXHUyOWY2IiwKICAgICJkc3Ryb2s7IjogIlx1MDExMSIsCiAgICAiZHRkb3Q7IjogIlx1MjJmMSIsCiAgICAiZHRyaTsiOiAiXHUyNWJmIiwKICAgICJkdHJpZjsiOiAiXHUyNWJlIiwKICAgICJkdWFycjsiOiAiXHUyMWY1IiwKICAgICJkdWhhcjsiOiAiXHUyOTZmIiwKICAgICJkd2FuZ2xlOyI6ICJcdTI5YTYiLAogICAgImR6Y3k7IjogIlx1MDQ1ZiIsCiAgICAiZHppZ3JhcnI7IjogIlx1MjdmZiIsCiAgICAiZUREb3Q7IjogIlx1MmE3NyIsCiAgICAiZURvdDsiOiAiXHUyMjUxIiwKICAgICJlYWN1dGUiOiAiXHhlOSIsCiAgICAiZWFjdXRlOyI6ICJceGU5IiwKICAgICJlYXN0ZXI7IjogIlx1MmE2ZSIsCiAgICAiZWNhcm9uOyI6ICJcdTAxMWIiLAogICAgImVjaXI7IjogIlx1MjI1NiIsCiAgICAiZWNpcmMiOiAiXHhlYSIsCiAgICAiZWNpcmM7IjogIlx4ZWEiLAogICAgImVjb2xvbjsiOiAiXHUyMjU1IiwKICAgICJlY3k7IjogIlx1MDQ0ZCIsCiAgICAiZWRvdDsiOiAiXHUwMTE3IiwKICAgICJlZTsiOiAiXHUyMTQ3IiwKICAgICJlZkRvdDsiOiAiXHUyMjUyIiwKICAgICJlZnI7IjogIlxVMDAwMWQ1MjIiLAogICAgImVnOyI6ICJcdTJhOWEiLAogICAgImVncmF2ZSI6ICJceGU4IiwKICAgICJlZ3JhdmU7IjogIlx4ZTgiLAogICAgImVnczsiOiAiXHUyYTk2IiwKICAgICJlZ3Nkb3Q7IjogIlx1MmE5OCIsCiAgICAiZWw7IjogIlx1MmE5OSIsCiAgICAiZWxpbnRlcnM7IjogIlx1MjNlNyIsCiAgICAiZWxsOyI6ICJcdTIxMTMiLAogICAgImVsczsiOiAiXHUyYTk1IiwKICAgICJlbHNkb3Q7IjogIlx1MmE5NyIsCiAgICAiZW1hY3I7IjogIlx1MDExMyIsCiAgICAiZW1wdHk7IjogIlx1MjIwNSIsCiAgICAiZW1wdHlzZXQ7IjogIlx1MjIwNSIsCiAgICAiZW1wdHl2OyI6ICJcdTIyMDUiLAogICAgImVtc3AxMzsiOiAiXHUyMDA0IiwKICAgICJlbXNwMTQ7IjogIlx1MjAwNSIsCiAgICAiZW1zcDsiOiAiXHUyMDAzIiwKICAgICJlbmc7IjogIlx1MDE0YiIsCiAgICAiZW5zcDsiOiAiXHUyMDAyIiwKICAgICJlb2dvbjsiOiAiXHUwMTE5IiwKICAgICJlb3BmOyI6ICJcVTAwMDFkNTU2IiwKICAgICJlcGFyOyI6ICJcdTIyZDUiLAogICAgImVwYXJzbDsiOiAiXHUyOWUzIiwKICAgICJlcGx1czsiOiAiXHUyYTcxIiwKICAgICJlcHNpOyI6ICJcdTAzYjUiLAogICAgImVwc2lsb247IjogIlx1MDNiNSIsCiAgICAiZXBzaXY7IjogIlx1MDNmNSIsCiAgICAiZXFjaXJjOyI6ICJcdTIyNTYiLAogICAgImVxY29sb247IjogIlx1MjI1NSIsCiAgICAiZXFzaW07IjogIlx1MjI0MiIsCiAgICAiZXFzbGFudGd0cjsiOiAiXHUyYTk2IiwKICAgICJlcXNsYW50bGVzczsiOiAiXHUyYTk1IiwKICAgICJlcXVhbHM7IjogIj0iLAogICAgImVxdWVzdDsiOiAiXHUyMjVmIiwKICAgICJlcXVpdjsiOiAiXHUyMjYxIiwKICAgICJlcXVpdkREOyI6ICJcdTJhNzgiLAogICAgImVxdnBhcnNsOyI6ICJcdTI5ZTUiLAogICAgImVyRG90OyI6ICJcdTIyNTMiLAogICAgImVyYXJyOyI6ICJcdTI5NzEiLAogICAgImVzY3I7IjogIlx1MjEyZiIsCiAgICAiZXNkb3Q7IjogIlx1MjI1MCIsCiAgICAiZXNpbTsiOiAiXHUyMjQyIiwKICAgICJldGE7IjogIlx1MDNiNyIsCiAgICAiZXRoIjogIlx4ZjAiLAogICAgImV0aDsiOiAiXHhmMCIsCiAgICAiZXVtbCI6ICJceGViIiwKICAgICJldW1sOyI6ICJceGViIiwKICAgICJldXJvOyI6ICJcdTIwYWMiLAogICAgImV4Y2w7IjogIiEiLAogICAgImV4aXN0OyI6ICJcdTIyMDMiLAogICAgImV4cGVjdGF0aW9uOyI6ICJcdTIxMzAiLAogICAgImV4cG9uZW50aWFsZTsiOiAiXHUyMTQ3IiwKICAgICJmYWxsaW5nZG90c2VxOyI6ICJcdTIyNTIiLAogICAgImZjeTsiOiAiXHUwNDQ0IiwKICAgICJmZW1hbGU7IjogIlx1MjY0MCIsCiAgICAiZmZpbGlnOyI6ICJcdWZiMDMiLAogICAgImZmbGlnOyI6ICJcdWZiMDAiLAogICAgImZmbGxpZzsiOiAiXHVmYjA0IiwKICAgICJmZnI7IjogIlxVMDAwMWQ1MjMiLAogICAgImZpbGlnOyI6ICJcdWZiMDEiLAogICAgImZqbGlnOyI6ICJmaiIsCiAgICAiZmxhdDsiOiAiXHUyNjZkIiwKICAgICJmbGxpZzsiOiAiXHVmYjAyIiwKICAgICJmbHRuczsiOiAiXHUyNWIxIiwKICAgICJmbm9mOyI6ICJcdTAxOTIiLAogICAgImZvcGY7IjogIlxVMDAwMWQ1NTciLAogICAgImZvcmFsbDsiOiAiXHUyMjAwIiwKICAgICJmb3JrOyI6ICJcdTIyZDQiLAogICAgImZvcmt2OyI6ICJcdTJhZDkiLAogICAgImZwYXJ0aW50OyI6ICJcdTJhMGQiLAogICAgImZyYWMxMiI6ICJceGJkIiwKICAgICJmcmFjMTI7IjogIlx4YmQiLAogICAgImZyYWMxMzsiOiAiXHUyMTUzIiwKICAgICJmcmFjMTQiOiAiXHhiYyIsCiAgICAiZnJhYzE0OyI6ICJceGJjIiwKICAgICJmcmFjMTU7IjogIlx1MjE1NSIsCiAgICAiZnJhYzE2OyI6ICJcdTIxNTkiLAogICAgImZyYWMxODsiOiAiXHUyMTViIiwKICAgICJmcmFjMjM7IjogIlx1MjE1NCIsCiAgICAiZnJhYzI1OyI6ICJcdTIxNTYiLAogICAgImZyYWMzNCI6ICJceGJlIiwKICAgICJmcmFjMzQ7IjogIlx4YmUiLAogICAgImZyYWMzNTsiOiAiXHUyMTU3IiwKICAgICJmcmFjMzg7IjogIlx1MjE1YyIsCiAgICAiZnJhYzQ1OyI6ICJcdTIxNTgiLAogICAgImZyYWM1NjsiOiAiXHUyMTVhIiwKICAgICJmcmFjNTg7IjogIlx1MjE1ZCIsCiAgICAiZnJhYzc4OyI6ICJcdTIxNWUiLAogICAgImZyYXNsOyI6ICJcdTIwNDQiLAogICAgImZyb3duOyI6ICJcdTIzMjIiLAogICAgImZzY3I7IjogIlxVMDAwMWQ0YmIiLAogICAgImdFOyI6ICJcdTIyNjciLAogICAgImdFbDsiOiAiXHUyYThjIiwKICAgICJnYWN1dGU7IjogIlx1MDFmNSIsCiAgICAiZ2FtbWE7IjogIlx1MDNiMyIsCiAgICAiZ2FtbWFkOyI6ICJcdTAzZGQiLAogICAgImdhcDsiOiAiXHUyYTg2IiwKICAgICJnYnJldmU7IjogIlx1MDExZiIsCiAgICAiZ2NpcmM7IjogIlx1MDExZCIsCiAgICAiZ2N5OyI6ICJcdTA0MzMiLAogICAgImdkb3Q7IjogIlx1MDEyMSIsCiAgICAiZ2U7IjogIlx1MjI2NSIsCiAgICAiZ2VsOyI6ICJcdTIyZGIiLAogICAgImdlcTsiOiAiXHUyMjY1IiwKICAgICJnZXFxOyI6ICJcdTIyNjciLAogICAgImdlcXNsYW50OyI6ICJcdTJhN2UiLAogICAgImdlczsiOiAiXHUyYTdlIiwKICAgICJnZXNjYzsiOiAiXHUyYWE5IiwKICAgICJnZXNkb3Q7IjogIlx1MmE4MCIsCiAgICAiZ2VzZG90bzsiOiAiXHUyYTgyIiwKICAgICJnZXNkb3RvbDsiOiAiXHUyYTg0IiwKICAgICJnZXNsOyI6ICJcdTIyZGJcdWZlMDAiLAogICAgImdlc2xlczsiOiAiXHUyYTk0IiwKICAgICJnZnI7IjogIlxVMDAwMWQ1MjQiLAogICAgImdnOyI6ICJcdTIyNmIiLAogICAgImdnZzsiOiAiXHUyMmQ5IiwKICAgICJnaW1lbDsiOiAiXHUyMTM3IiwKICAgICJnamN5OyI6ICJcdTA0NTMiLAogICAgImdsOyI6ICJcdTIyNzciLAogICAgImdsRTsiOiAiXHUyYTkyIiwKICAgICJnbGE7IjogIlx1MmFhNSIsCiAgICAiZ2xqOyI6ICJcdTJhYTQiLAogICAgImduRTsiOiAiXHUyMjY5IiwKICAgICJnbmFwOyI6ICJcdTJhOGEiLAogICAgImduYXBwcm94OyI6ICJcdTJhOGEiLAogICAgImduZTsiOiAiXHUyYTg4IiwKICAgICJnbmVxOyI6ICJcdTJhODgiLAogICAgImduZXFxOyI6ICJcdTIyNjkiLAogICAgImduc2ltOyI6ICJcdTIyZTciLAogICAgImdvcGY7IjogIlxVMDAwMWQ1NTgiLAogICAgImdyYXZlOyI6ICJgIiwKICAgICJnc2NyOyI6ICJcdTIxMGEiLAogICAgImdzaW07IjogIlx1MjI3MyIsCiAgICAiZ3NpbWU7IjogIlx1MmE4ZSIsCiAgICAiZ3NpbWw7IjogIlx1MmE5MCIsCiAgICAiZ3QiOiAiPiIsCiAgICAiZ3Q7IjogIj4iLAogICAgImd0Y2M7IjogIlx1MmFhNyIsCiAgICAiZ3RjaXI7IjogIlx1MmE3YSIsCiAgICAiZ3Rkb3Q7IjogIlx1MjJkNyIsCiAgICAiZ3RsUGFyOyI6ICJcdTI5OTUiLAogICAgImd0cXVlc3Q7IjogIlx1MmE3YyIsCiAgICAiZ3RyYXBwcm94OyI6ICJcdTJhODYiLAogICAgImd0cmFycjsiOiAiXHUyOTc4IiwKICAgICJndHJkb3Q7IjogIlx1MjJkNyIsCiAgICAiZ3RyZXFsZXNzOyI6ICJcdTIyZGIiLAogICAgImd0cmVxcWxlc3M7IjogIlx1MmE4YyIsCiAgICAiZ3RybGVzczsiOiAiXHUyMjc3IiwKICAgICJndHJzaW07IjogIlx1MjI3MyIsCiAgICAiZ3ZlcnRuZXFxOyI6ICJcdTIyNjlcdWZlMDAiLAogICAgImd2bkU7IjogIlx1MjI2OVx1ZmUwMCIsCiAgICAiaEFycjsiOiAiXHUyMWQ0IiwKICAgICJoYWlyc3A7IjogIlx1MjAwYSIsCiAgICAiaGFsZjsiOiAiXHhiZCIsCiAgICAiaGFtaWx0OyI6ICJcdTIxMGIiLAogICAgImhhcmRjeTsiOiAiXHUwNDRhIiwKICAgICJoYXJyOyI6ICJcdTIxOTQiLAogICAgImhhcnJjaXI7IjogIlx1Mjk0OCIsCiAgICAiaGFycnc7IjogIlx1MjFhZCIsCiAgICAiaGJhcjsiOiAiXHUyMTBmIiwKICAgICJoY2lyYzsiOiAiXHUwMTI1IiwKICAgICJoZWFydHM7IjogIlx1MjY2NSIsCiAgICAiaGVhcnRzdWl0OyI6ICJcdTI2NjUiLAogICAgImhlbGxpcDsiOiAiXHUyMDI2IiwKICAgICJoZXJjb247IjogIlx1MjJiOSIsCiAgICAiaGZyOyI6ICJcVTAwMDFkNTI1IiwKICAgICJoa3NlYXJvdzsiOiAiXHUyOTI1IiwKICAgICJoa3N3YXJvdzsiOiAiXHUyOTI2IiwKICAgICJob2FycjsiOiAiXHUyMWZmIiwKICAgICJob210aHQ7IjogIlx1MjIzYiIsCiAgICAiaG9va2xlZnRhcnJvdzsiOiAiXHUyMWE5IiwKICAgICJob29rcmlnaHRhcnJvdzsiOiAiXHUyMWFhIiwKICAgICJob3BmOyI6ICJcVTAwMDFkNTU5IiwKICAgICJob3JiYXI7IjogIlx1MjAxNSIsCiAgICAiaHNjcjsiOiAiXFUwMDAxZDRiZCIsCiAgICAiaHNsYXNoOyI6ICJcdTIxMGYiLAogICAgImhzdHJvazsiOiAiXHUwMTI3IiwKICAgICJoeWJ1bGw7IjogIlx1MjA0MyIsCiAgICAiaHlwaGVuOyI6ICJcdTIwMTAiLAogICAgImlhY3V0ZSI6ICJceGVkIiwKICAgICJpYWN1dGU7IjogIlx4ZWQiLAogICAgImljOyI6ICJcdTIwNjMiLAogICAgImljaXJjIjogIlx4ZWUiLAogICAgImljaXJjOyI6ICJceGVlIiwKICAgICJpY3k7IjogIlx1MDQzOCIsCiAgICAiaWVjeTsiOiAiXHUwNDM1IiwKICAgICJpZXhjbCI6ICJceGExIiwKICAgICJpZXhjbDsiOiAiXHhhMSIsCiAgICAiaWZmOyI6ICJcdTIxZDQiLAogICAgImlmcjsiOiAiXFUwMDAxZDUyNiIsCiAgICAiaWdyYXZlIjogIlx4ZWMiLAogICAgImlncmF2ZTsiOiAiXHhlYyIsCiAgICAiaWk7IjogIlx1MjE0OCIsCiAgICAiaWlpaW50OyI6ICJcdTJhMGMiLAogICAgImlpaW50OyI6ICJcdTIyMmQiLAogICAgImlpbmZpbjsiOiAiXHUyOWRjIiwKICAgICJpaW90YTsiOiAiXHUyMTI5IiwKICAgICJpamxpZzsiOiAiXHUwMTMzIiwKICAgICJpbWFjcjsiOiAiXHUwMTJiIiwKICAgICJpbWFnZTsiOiAiXHUyMTExIiwKICAgICJpbWFnbGluZTsiOiAiXHUyMTEwIiwKICAgICJpbWFncGFydDsiOiAiXHUyMTExIiwKICAgICJpbWF0aDsiOiAiXHUwMTMxIiwKICAgICJpbW9mOyI6ICJcdTIyYjciLAogICAgImltcGVkOyI6ICJcdTAxYjUiLAogICAgImluOyI6ICJcdTIyMDgiLAogICAgImluY2FyZTsiOiAiXHUyMTA1IiwKICAgICJpbmZpbjsiOiAiXHUyMjFlIiwKICAgICJpbmZpbnRpZTsiOiAiXHUyOWRkIiwKICAgICJpbm9kb3Q7IjogIlx1MDEzMSIsCiAgICAiaW50OyI6ICJcdTIyMmIiLAogICAgImludGNhbDsiOiAiXHUyMmJhIiwKICAgICJpbnRlZ2VyczsiOiAiXHUyMTI0IiwKICAgICJpbnRlcmNhbDsiOiAiXHUyMmJhIiwKICAgICJpbnRsYXJoazsiOiAiXHUyYTE3IiwKICAgICJpbnRwcm9kOyI6ICJcdTJhM2MiLAogICAgImlvY3k7IjogIlx1MDQ1MSIsCiAgICAiaW9nb247IjogIlx1MDEyZiIsCiAgICAiaW9wZjsiOiAiXFUwMDAxZDU1YSIsCiAgICAiaW90YTsiOiAiXHUwM2I5IiwKICAgICJpcHJvZDsiOiAiXHUyYTNjIiwKICAgICJpcXVlc3QiOiAiXHhiZiIsCiAgICAiaXF1ZXN0OyI6ICJceGJmIiwKICAgICJpc2NyOyI6ICJcVTAwMDFkNGJlIiwKICAgICJpc2luOyI6ICJcdTIyMDgiLAogICAgImlzaW5FOyI6ICJcdTIyZjkiLAogICAgImlzaW5kb3Q7IjogIlx1MjJmNSIsCiAgICAiaXNpbnM7IjogIlx1MjJmNCIsCiAgICAiaXNpbnN2OyI6ICJcdTIyZjMiLAogICAgImlzaW52OyI6ICJcdTIyMDgiLAogICAgIml0OyI6ICJcdTIwNjIiLAogICAgIml0aWxkZTsiOiAiXHUwMTI5IiwKICAgICJpdWtjeTsiOiAiXHUwNDU2IiwKICAgICJpdW1sIjogIlx4ZWYiLAogICAgIml1bWw7IjogIlx4ZWYiLAogICAgImpjaXJjOyI6ICJcdTAxMzUiLAogICAgImpjeTsiOiAiXHUwNDM5IiwKICAgICJqZnI7IjogIlxVMDAwMWQ1MjciLAogICAgImptYXRoOyI6ICJcdTAyMzciLAogICAgImpvcGY7IjogIlxVMDAwMWQ1NWIiLAogICAgImpzY3I7IjogIlxVMDAwMWQ0YmYiLAogICAgImpzZXJjeTsiOiAiXHUwNDU4IiwKICAgICJqdWtjeTsiOiAiXHUwNDU0IiwKICAgICJrYXBwYTsiOiAiXHUwM2JhIiwKICAgICJrYXBwYXY7IjogIlx1MDNmMCIsCiAgICAia2NlZGlsOyI6ICJcdTAxMzciLAogICAgImtjeTsiOiAiXHUwNDNhIiwKICAgICJrZnI7IjogIlxVMDAwMWQ1MjgiLAogICAgImtncmVlbjsiOiAiXHUwMTM4IiwKICAgICJraGN5OyI6ICJcdTA0NDUiLAogICAgImtqY3k7IjogIlx1MDQ1YyIsCiAgICAia29wZjsiOiAiXFUwMDAxZDU1YyIsCiAgICAia3NjcjsiOiAiXFUwMDAxZDRjMCIsCiAgICAibEFhcnI7IjogIlx1MjFkYSIsCiAgICAibEFycjsiOiAiXHUyMWQwIiwKICAgICJsQXRhaWw7IjogIlx1MjkxYiIsCiAgICAibEJhcnI7IjogIlx1MjkwZSIsCiAgICAibEU7IjogIlx1MjI2NiIsCiAgICAibEVnOyI6ICJcdTJhOGIiLAogICAgImxIYXI7IjogIlx1Mjk2MiIsCiAgICAibGFjdXRlOyI6ICJcdTAxM2EiLAogICAgImxhZW1wdHl2OyI6ICJcdTI5YjQiLAogICAgImxhZ3JhbjsiOiAiXHUyMTEyIiwKICAgICJsYW1iZGE7IjogIlx1MDNiYiIsCiAgICAibGFuZzsiOiAiXHUyN2U4IiwKICAgICJsYW5nZDsiOiAiXHUyOTkxIiwKICAgICJsYW5nbGU7IjogIlx1MjdlOCIsCiAgICAibGFwOyI6ICJcdTJhODUiLAogICAgImxhcXVvIjogIlx4YWIiLAogICAgImxhcXVvOyI6ICJceGFiIiwKICAgICJsYXJyOyI6ICJcdTIxOTAiLAogICAgImxhcnJiOyI6ICJcdTIxZTQiLAogICAgImxhcnJiZnM7IjogIlx1MjkxZiIsCiAgICAibGFycmZzOyI6ICJcdTI5MWQiLAogICAgImxhcnJoazsiOiAiXHUyMWE5IiwKICAgICJsYXJybHA7IjogIlx1MjFhYiIsCiAgICAibGFycnBsOyI6ICJcdTI5MzkiLAogICAgImxhcnJzaW07IjogIlx1Mjk3MyIsCiAgICAibGFycnRsOyI6ICJcdTIxYTIiLAogICAgImxhdDsiOiAiXHUyYWFiIiwKICAgICJsYXRhaWw7IjogIlx1MjkxOSIsCiAgICAibGF0ZTsiOiAiXHUyYWFkIiwKICAgICJsYXRlczsiOiAiXHUyYWFkXHVmZTAwIiwKICAgICJsYmFycjsiOiAiXHUyOTBjIiwKICAgICJsYmJyazsiOiAiXHUyNzcyIiwKICAgICJsYnJhY2U7IjogInsiLAogICAgImxicmFjazsiOiAiWyIsCiAgICAibGJya2U7IjogIlx1Mjk4YiIsCiAgICAibGJya3NsZDsiOiAiXHUyOThmIiwKICAgICJsYnJrc2x1OyI6ICJcdTI5OGQiLAogICAgImxjYXJvbjsiOiAiXHUwMTNlIiwKICAgICJsY2VkaWw7IjogIlx1MDEzYyIsCiAgICAibGNlaWw7IjogIlx1MjMwOCIsCiAgICAibGN1YjsiOiAieyIsCiAgICAibGN5OyI6ICJcdTA0M2IiLAogICAgImxkY2E7IjogIlx1MjkzNiIsCiAgICAibGRxdW87IjogIlx1MjAxYyIsCiAgICAibGRxdW9yOyI6ICJcdTIwMWUiLAogICAgImxkcmRoYXI7IjogIlx1Mjk2NyIsCiAgICAibGRydXNoYXI7IjogIlx1Mjk0YiIsCiAgICAibGRzaDsiOiAiXHUyMWIyIiwKICAgICJsZTsiOiAiXHUyMjY0IiwKICAgICJsZWZ0YXJyb3c7IjogIlx1MjE5MCIsCiAgICAibGVmdGFycm93dGFpbDsiOiAiXHUyMWEyIiwKICAgICJsZWZ0aGFycG9vbmRvd247IjogIlx1MjFiZCIsCiAgICAibGVmdGhhcnBvb251cDsiOiAiXHUyMWJjIiwKICAgICJsZWZ0bGVmdGFycm93czsiOiAiXHUyMWM3IiwKICAgICJsZWZ0cmlnaHRhcnJvdzsiOiAiXHUyMTk0IiwKICAgICJsZWZ0cmlnaHRhcnJvd3M7IjogIlx1MjFjNiIsCiAgICAibGVmdHJpZ2h0aGFycG9vbnM7IjogIlx1MjFjYiIsCiAgICAibGVmdHJpZ2h0c3F1aWdhcnJvdzsiOiAiXHUyMWFkIiwKICAgICJsZWZ0dGhyZWV0aW1lczsiOiAiXHUyMmNiIiwKICAgICJsZWc7IjogIlx1MjJkYSIsCiAgICAibGVxOyI6ICJcdTIyNjQiLAogICAgImxlcXE7IjogIlx1MjI2NiIsCiAgICAibGVxc2xhbnQ7IjogIlx1MmE3ZCIsCiAgICAibGVzOyI6ICJcdTJhN2QiLAogICAgImxlc2NjOyI6ICJcdTJhYTgiLAogICAgImxlc2RvdDsiOiAiXHUyYTdmIiwKICAgICJsZXNkb3RvOyI6ICJcdTJhODEiLAogICAgImxlc2RvdG9yOyI6ICJcdTJhODMiLAogICAgImxlc2c7IjogIlx1MjJkYVx1ZmUwMCIsCiAgICAibGVzZ2VzOyI6ICJcdTJhOTMiLAogICAgImxlc3NhcHByb3g7IjogIlx1MmE4NSIsCiAgICAibGVzc2RvdDsiOiAiXHUyMmQ2IiwKICAgICJsZXNzZXFndHI7IjogIlx1MjJkYSIsCiAgICAibGVzc2VxcWd0cjsiOiAiXHUyYThiIiwKICAgICJsZXNzZ3RyOyI6ICJcdTIyNzYiLAogICAgImxlc3NzaW07IjogIlx1MjI3MiIsCiAgICAibGZpc2h0OyI6ICJcdTI5N2MiLAogICAgImxmbG9vcjsiOiAiXHUyMzBhIiwKICAgICJsZnI7IjogIlxVMDAwMWQ1MjkiLAogICAgImxnOyI6ICJcdTIyNzYiLAogICAgImxnRTsiOiAiXHUyYTkxIiwKICAgICJsaGFyZDsiOiAiXHUyMWJkIiwKICAgICJsaGFydTsiOiAiXHUyMWJjIiwKICAgICJsaGFydWw7IjogIlx1Mjk2YSIsCiAgICAibGhibGs7IjogIlx1MjU4NCIsCiAgICAibGpjeTsiOiAiXHUwNDU5IiwKICAgICJsbDsiOiAiXHUyMjZhIiwKICAgICJsbGFycjsiOiAiXHUyMWM3IiwKICAgICJsbGNvcm5lcjsiOiAiXHUyMzFlIiwKICAgICJsbGhhcmQ7IjogIlx1Mjk2YiIsCiAgICAibGx0cmk7IjogIlx1MjVmYSIsCiAgICAibG1pZG90OyI6ICJcdTAxNDAiLAogICAgImxtb3VzdDsiOiAiXHUyM2IwIiwKICAgICJsbW91c3RhY2hlOyI6ICJcdTIzYjAiLAogICAgImxuRTsiOiAiXHUyMjY4IiwKICAgICJsbmFwOyI6ICJcdTJhODkiLAogICAgImxuYXBwcm94OyI6ICJcdTJhODkiLAogICAgImxuZTsiOiAiXHUyYTg3IiwKICAgICJsbmVxOyI6ICJcdTJhODciLAogICAgImxuZXFxOyI6ICJcdTIyNjgiLAogICAgImxuc2ltOyI6ICJcdTIyZTYiLAogICAgImxvYW5nOyI6ICJcdTI3ZWMiLAogICAgImxvYXJyOyI6ICJcdTIxZmQiLAogICAgImxvYnJrOyI6ICJcdTI3ZTYiLAogICAgImxvbmdsZWZ0YXJyb3c7IjogIlx1MjdmNSIsCiAgICAibG9uZ2xlZnRyaWdodGFycm93OyI6ICJcdTI3ZjciLAogICAgImxvbmdtYXBzdG87IjogIlx1MjdmYyIsCiAgICAibG9uZ3JpZ2h0YXJyb3c7IjogIlx1MjdmNiIsCiAgICAibG9vcGFycm93bGVmdDsiOiAiXHUyMWFiIiwKICAgICJsb29wYXJyb3dyaWdodDsiOiAiXHUyMWFjIiwKICAgICJsb3BhcjsiOiAiXHUyOTg1IiwKICAgICJsb3BmOyI6ICJcVTAwMDFkNTVkIiwKICAgICJsb3BsdXM7IjogIlx1MmEyZCIsCiAgICAibG90aW1lczsiOiAiXHUyYTM0IiwKICAgICJsb3dhc3Q7IjogIlx1MjIxNyIsCiAgICAibG93YmFyOyI6ICJfIiwKICAgICJsb3o7IjogIlx1MjVjYSIsCiAgICAibG96ZW5nZTsiOiAiXHUyNWNhIiwKICAgICJsb3pmOyI6ICJcdTI5ZWIiLAogICAgImxwYXI7IjogIigiLAogICAgImxwYXJsdDsiOiAiXHUyOTkzIiwKICAgICJscmFycjsiOiAiXHUyMWM2IiwKICAgICJscmNvcm5lcjsiOiAiXHUyMzFmIiwKICAgICJscmhhcjsiOiAiXHUyMWNiIiwKICAgICJscmhhcmQ7IjogIlx1Mjk2ZCIsCiAgICAibHJtOyI6ICJcdTIwMGUiLAogICAgImxydHJpOyI6ICJcdTIyYmYiLAogICAgImxzYXF1bzsiOiAiXHUyMDM5IiwKICAgICJsc2NyOyI6ICJcVTAwMDFkNGMxIiwKICAgICJsc2g7IjogIlx1MjFiMCIsCiAgICAibHNpbTsiOiAiXHUyMjcyIiwKICAgICJsc2ltZTsiOiAiXHUyYThkIiwKICAgICJsc2ltZzsiOiAiXHUyYThmIiwKICAgICJsc3FiOyI6ICJbIiwKICAgICJsc3F1bzsiOiAiXHUyMDE4IiwKICAgICJsc3F1b3I7IjogIlx1MjAxYSIsCiAgICAibHN0cm9rOyI6ICJcdTAxNDIiLAogICAgImx0IjogIjwiLAogICAgImx0OyI6ICI8IiwKICAgICJsdGNjOyI6ICJcdTJhYTYiLAogICAgImx0Y2lyOyI6ICJcdTJhNzkiLAogICAgImx0ZG90OyI6ICJcdTIyZDYiLAogICAgImx0aHJlZTsiOiAiXHUyMmNiIiwKICAgICJsdGltZXM7IjogIlx1MjJjOSIsCiAgICAibHRsYXJyOyI6ICJcdTI5NzYiLAogICAgImx0cXVlc3Q7IjogIlx1MmE3YiIsCiAgICAibHRyUGFyOyI6ICJcdTI5OTYiLAogICAgImx0cmk7IjogIlx1MjVjMyIsCiAgICAibHRyaWU7IjogIlx1MjJiNCIsCiAgICAibHRyaWY7IjogIlx1MjVjMiIsCiAgICAibHVyZHNoYXI7IjogIlx1Mjk0YSIsCiAgICAibHVydWhhcjsiOiAiXHUyOTY2IiwKICAgICJsdmVydG5lcXE7IjogIlx1MjI2OFx1ZmUwMCIsCiAgICAibHZuRTsiOiAiXHUyMjY4XHVmZTAwIiwKICAgICJtRERvdDsiOiAiXHUyMjNhIiwKICAgICJtYWNyIjogIlx4YWYiLAogICAgIm1hY3I7IjogIlx4YWYiLAogICAgIm1hbGU7IjogIlx1MjY0MiIsCiAgICAibWFsdDsiOiAiXHUyNzIwIiwKICAgICJtYWx0ZXNlOyI6ICJcdTI3MjAiLAogICAgIm1hcDsiOiAiXHUyMWE2IiwKICAgICJtYXBzdG87IjogIlx1MjFhNiIsCiAgICAibWFwc3RvZG93bjsiOiAiXHUyMWE3IiwKICAgICJtYXBzdG9sZWZ0OyI6ICJcdTIxYTQiLAogICAgIm1hcHN0b3VwOyI6ICJcdTIxYTUiLAogICAgIm1hcmtlcjsiOiAiXHUyNWFlIiwKICAgICJtY29tbWE7IjogIlx1MmEyOSIsCiAgICAibWN5OyI6ICJcdTA0M2MiLAogICAgIm1kYXNoOyI6ICJcdTIwMTQiLAogICAgIm1lYXN1cmVkYW5nbGU7IjogIlx1MjIyMSIsCiAgICAibWZyOyI6ICJcVTAwMDFkNTJhIiwKICAgICJtaG87IjogIlx1MjEyNyIsCiAgICAibWljcm8iOiAiXHhiNSIsCiAgICAibWljcm87IjogIlx4YjUiLAogICAgIm1pZDsiOiAiXHUyMjIzIiwKICAgICJtaWRhc3Q7IjogIioiLAogICAgIm1pZGNpcjsiOiAiXHUyYWYwIiwKICAgICJtaWRkb3QiOiAiXHhiNyIsCiAgICAibWlkZG90OyI6ICJceGI3IiwKICAgICJtaW51czsiOiAiXHUyMjEyIiwKICAgICJtaW51c2I7IjogIlx1MjI5ZiIsCiAgICAibWludXNkOyI6ICJcdTIyMzgiLAogICAgIm1pbnVzZHU7IjogIlx1MmEyYSIsCiAgICAibWxjcDsiOiAiXHUyYWRiIiwKICAgICJtbGRyOyI6ICJcdTIwMjYiLAogICAgIm1ucGx1czsiOiAiXHUyMjEzIiwKICAgICJtb2RlbHM7IjogIlx1MjJhNyIsCiAgICAibW9wZjsiOiAiXFUwMDAxZDU1ZSIsCiAgICAibXA7IjogIlx1MjIxMyIsCiAgICAibXNjcjsiOiAiXFUwMDAxZDRjMiIsCiAgICAibXN0cG9zOyI6ICJcdTIyM2UiLAogICAgIm11OyI6ICJcdTAzYmMiLAogICAgIm11bHRpbWFwOyI6ICJcdTIyYjgiLAogICAgIm11bWFwOyI6ICJcdTIyYjgiLAogICAgIm5HZzsiOiAiXHUyMmQ5XHUwMzM4IiwKICAgICJuR3Q7IjogIlx1MjI2Ylx1MjBkMiIsCiAgICAibkd0djsiOiAiXHUyMjZiXHUwMzM4IiwKICAgICJuTGVmdGFycm93OyI6ICJcdTIxY2QiLAogICAgIm5MZWZ0cmlnaHRhcnJvdzsiOiAiXHUyMWNlIiwKICAgICJuTGw7IjogIlx1MjJkOFx1MDMzOCIsCiAgICAibkx0OyI6ICJcdTIyNmFcdTIwZDIiLAogICAgIm5MdHY7IjogIlx1MjI2YVx1MDMzOCIsCiAgICAiblJpZ2h0YXJyb3c7IjogIlx1MjFjZiIsCiAgICAiblZEYXNoOyI6ICJcdTIyYWYiLAogICAgIm5WZGFzaDsiOiAiXHUyMmFlIiwKICAgICJuYWJsYTsiOiAiXHUyMjA3IiwKICAgICJuYWN1dGU7IjogIlx1MDE0NCIsCiAgICAibmFuZzsiOiAiXHUyMjIwXHUyMGQyIiwKICAgICJuYXA7IjogIlx1MjI0OSIsCiAgICAibmFwRTsiOiAiXHUyYTcwXHUwMzM4IiwKICAgICJuYXBpZDsiOiAiXHUyMjRiXHUwMzM4IiwKICAgICJuYXBvczsiOiAiXHUwMTQ5IiwKICAgICJuYXBwcm94OyI6ICJcdTIyNDkiLAogICAgIm5hdHVyOyI6ICJcdTI2NmUiLAogICAgIm5hdHVyYWw7IjogIlx1MjY2ZSIsCiAgICAibmF0dXJhbHM7IjogIlx1MjExNSIsCiAgICAibmJzcCI6ICJceGEwIiwKICAgICJuYnNwOyI6ICJceGEwIiwKICAgICJuYnVtcDsiOiAiXHUyMjRlXHUwMzM4IiwKICAgICJuYnVtcGU7IjogIlx1MjI0Zlx1MDMzOCIsCiAgICAibmNhcDsiOiAiXHUyYTQzIiwKICAgICJuY2Fyb247IjogIlx1MDE0OCIsCiAgICAibmNlZGlsOyI6ICJcdTAxNDYiLAogICAgIm5jb25nOyI6ICJcdTIyNDciLAogICAgIm5jb25nZG90OyI6ICJcdTJhNmRcdTAzMzgiLAogICAgIm5jdXA7IjogIlx1MmE0MiIsCiAgICAibmN5OyI6ICJcdTA0M2QiLAogICAgIm5kYXNoOyI6ICJcdTIwMTMiLAogICAgIm5lOyI6ICJcdTIyNjAiLAogICAgIm5lQXJyOyI6ICJcdTIxZDciLAogICAgIm5lYXJoazsiOiAiXHUyOTI0IiwKICAgICJuZWFycjsiOiAiXHUyMTk3IiwKICAgICJuZWFycm93OyI6ICJcdTIxOTciLAogICAgIm5lZG90OyI6ICJcdTIyNTBcdTAzMzgiLAogICAgIm5lcXVpdjsiOiAiXHUyMjYyIiwKICAgICJuZXNlYXI7IjogIlx1MjkyOCIsCiAgICAibmVzaW07IjogIlx1MjI0Mlx1MDMzOCIsCiAgICAibmV4aXN0OyI6ICJcdTIyMDQiLAogICAgIm5leGlzdHM7IjogIlx1MjIwNCIsCiAgICAibmZyOyI6ICJcVTAwMDFkNTJiIiwKICAgICJuZ0U7IjogIlx1MjI2N1x1MDMzOCIsCiAgICAibmdlOyI6ICJcdTIyNzEiLAogICAgIm5nZXE7IjogIlx1MjI3MSIsCiAgICAibmdlcXE7IjogIlx1MjI2N1x1MDMzOCIsCiAgICAibmdlcXNsYW50OyI6ICJcdTJhN2VcdTAzMzgiLAogICAgIm5nZXM7IjogIlx1MmE3ZVx1MDMzOCIsCiAgICAibmdzaW07IjogIlx1MjI3NSIsCiAgICAibmd0OyI6ICJcdTIyNmYiLAogICAgIm5ndHI7IjogIlx1MjI2ZiIsCiAgICAibmhBcnI7IjogIlx1MjFjZSIsCiAgICAibmhhcnI7IjogIlx1MjFhZSIsCiAgICAibmhwYXI7IjogIlx1MmFmMiIsCiAgICAibmk7IjogIlx1MjIwYiIsCiAgICAibmlzOyI6ICJcdTIyZmMiLAogICAgIm5pc2Q7IjogIlx1MjJmYSIsCiAgICAibml2OyI6ICJcdTIyMGIiLAogICAgIm5qY3k7IjogIlx1MDQ1YSIsCiAgICAibmxBcnI7IjogIlx1MjFjZCIsCiAgICAibmxFOyI6ICJcdTIyNjZcdTAzMzgiLAogICAgIm5sYXJyOyI6ICJcdTIxOWEiLAogICAgIm5sZHI7IjogIlx1MjAyNSIsCiAgICAibmxlOyI6ICJcdTIyNzAiLAogICAgIm5sZWZ0YXJyb3c7IjogIlx1MjE5YSIsCiAgICAibmxlZnRyaWdodGFycm93OyI6ICJcdTIxYWUiLAogICAgIm5sZXE7IjogIlx1MjI3MCIsCiAgICAibmxlcXE7IjogIlx1MjI2Nlx1MDMzOCIsCiAgICAibmxlcXNsYW50OyI6ICJcdTJhN2RcdTAzMzgiLAogICAgIm5sZXM7IjogIlx1MmE3ZFx1MDMzOCIsCiAgICAibmxlc3M7IjogIlx1MjI2ZSIsCiAgICAibmxzaW07IjogIlx1MjI3NCIsCiAgICAibmx0OyI6ICJcdTIyNmUiLAogICAgIm5sdHJpOyI6ICJcdTIyZWEiLAogICAgIm5sdHJpZTsiOiAiXHUyMmVjIiwKICAgICJubWlkOyI6ICJcdTIyMjQiLAogICAgIm5vcGY7IjogIlxVMDAwMWQ1NWYiLAogICAgIm5vdCI6ICJceGFjIiwKICAgICJub3Q7IjogIlx4YWMiLAogICAgIm5vdGluOyI6ICJcdTIyMDkiLAogICAgIm5vdGluRTsiOiAiXHUyMmY5XHUwMzM4IiwKICAgICJub3RpbmRvdDsiOiAiXHUyMmY1XHUwMzM4IiwKICAgICJub3RpbnZhOyI6ICJcdTIyMDkiLAogICAgIm5vdGludmI7IjogIlx1MjJmNyIsCiAgICAibm90aW52YzsiOiAiXHUyMmY2IiwKICAgICJub3RuaTsiOiAiXHUyMjBjIiwKICAgICJub3RuaXZhOyI6ICJcdTIyMGMiLAogICAgIm5vdG5pdmI7IjogIlx1MjJmZSIsCiAgICAibm90bml2YzsiOiAiXHUyMmZkIiwKICAgICJucGFyOyI6ICJcdTIyMjYiLAogICAgIm5wYXJhbGxlbDsiOiAiXHUyMjI2IiwKICAgICJucGFyc2w7IjogIlx1MmFmZFx1MjBlNSIsCiAgICAibnBhcnQ7IjogIlx1MjIwMlx1MDMzOCIsCiAgICAibnBvbGludDsiOiAiXHUyYTE0IiwKICAgICJucHI7IjogIlx1MjI4MCIsCiAgICAibnByY3VlOyI6ICJcdTIyZTAiLAogICAgIm5wcmU7IjogIlx1MmFhZlx1MDMzOCIsCiAgICAibnByZWM7IjogIlx1MjI4MCIsCiAgICAibnByZWNlcTsiOiAiXHUyYWFmXHUwMzM4IiwKICAgICJuckFycjsiOiAiXHUyMWNmIiwKICAgICJucmFycjsiOiAiXHUyMTliIiwKICAgICJucmFycmM7IjogIlx1MjkzM1x1MDMzOCIsCiAgICAibnJhcnJ3OyI6ICJcdTIxOWRcdTAzMzgiLAogICAgIm5yaWdodGFycm93OyI6ICJcdTIxOWIiLAogICAgIm5ydHJpOyI6ICJcdTIyZWIiLAogICAgIm5ydHJpZTsiOiAiXHUyMmVkIiwKICAgICJuc2M7IjogIlx1MjI4MSIsCiAgICAibnNjY3VlOyI6ICJcdTIyZTEiLAogICAgIm5zY2U7IjogIlx1MmFiMFx1MDMzOCIsCiAgICAibnNjcjsiOiAiXFUwMDAxZDRjMyIsCiAgICAibnNob3J0bWlkOyI6ICJcdTIyMjQiLAogICAgIm5zaG9ydHBhcmFsbGVsOyI6ICJcdTIyMjYiLAogICAgIm5zaW07IjogIlx1MjI0MSIsCiAgICAibnNpbWU7IjogIlx1MjI0NCIsCiAgICAibnNpbWVxOyI6ICJcdTIyNDQiLAogICAgIm5zbWlkOyI6ICJcdTIyMjQiLAogICAgIm5zcGFyOyI6ICJcdTIyMjYiLAogICAgIm5zcXN1YmU7IjogIlx1MjJlMiIsCiAgICAibnNxc3VwZTsiOiAiXHUyMmUzIiwKICAgICJuc3ViOyI6ICJcdTIyODQiLAogICAgIm5zdWJFOyI6ICJcdTJhYzVcdTAzMzgiLAogICAgIm5zdWJlOyI6ICJcdTIyODgiLAogICAgIm5zdWJzZXQ7IjogIlx1MjI4Mlx1MjBkMiIsCiAgICAibnN1YnNldGVxOyI6ICJcdTIyODgiLAogICAgIm5zdWJzZXRlcXE7IjogIlx1MmFjNVx1MDMzOCIsCiAgICAibnN1Y2M7IjogIlx1MjI4MSIsCiAgICAibnN1Y2NlcTsiOiAiXHUyYWIwXHUwMzM4IiwKICAgICJuc3VwOyI6ICJcdTIyODUiLAogICAgIm5zdXBFOyI6ICJcdTJhYzZcdTAzMzgiLAogICAgIm5zdXBlOyI6ICJcdTIyODkiLAogICAgIm5zdXBzZXQ7IjogIlx1MjI4M1x1MjBkMiIsCiAgICAibnN1cHNldGVxOyI6ICJcdTIyODkiLAogICAgIm5zdXBzZXRlcXE7IjogIlx1MmFjNlx1MDMzOCIsCiAgICAibnRnbDsiOiAiXHUyMjc5IiwKICAgICJudGlsZGUiOiAiXHhmMSIsCiAgICAibnRpbGRlOyI6ICJceGYxIiwKICAgICJudGxnOyI6ICJcdTIyNzgiLAogICAgIm50cmlhbmdsZWxlZnQ7IjogIlx1MjJlYSIsCiAgICAibnRyaWFuZ2xlbGVmdGVxOyI6ICJcdTIyZWMiLAogICAgIm50cmlhbmdsZXJpZ2h0OyI6ICJcdTIyZWIiLAogICAgIm50cmlhbmdsZXJpZ2h0ZXE7IjogIlx1MjJlZCIsCiAgICAibnU7IjogIlx1MDNiZCIsCiAgICAibnVtOyI6ICIjIiwKICAgICJudW1lcm87IjogIlx1MjExNiIsCiAgICAibnVtc3A7IjogIlx1MjAwNyIsCiAgICAibnZEYXNoOyI6ICJcdTIyYWQiLAogICAgIm52SGFycjsiOiAiXHUyOTA0IiwKICAgICJudmFwOyI6ICJcdTIyNGRcdTIwZDIiLAogICAgIm52ZGFzaDsiOiAiXHUyMmFjIiwKICAgICJudmdlOyI6ICJcdTIyNjVcdTIwZDIiLAogICAgIm52Z3Q7IjogIj5cdTIwZDIiLAogICAgIm52aW5maW47IjogIlx1MjlkZSIsCiAgICAibnZsQXJyOyI6ICJcdTI5MDIiLAogICAgIm52bGU7IjogIlx1MjI2NFx1MjBkMiIsCiAgICAibnZsdDsiOiAiPFx1MjBkMiIsCiAgICAibnZsdHJpZTsiOiAiXHUyMmI0XHUyMGQyIiwKICAgICJudnJBcnI7IjogIlx1MjkwMyIsCiAgICAibnZydHJpZTsiOiAiXHUyMmI1XHUyMGQyIiwKICAgICJudnNpbTsiOiAiXHUyMjNjXHUyMGQyIiwKICAgICJud0FycjsiOiAiXHUyMWQ2IiwKICAgICJud2FyaGs7IjogIlx1MjkyMyIsCiAgICAibndhcnI7IjogIlx1MjE5NiIsCiAgICAibndhcnJvdzsiOiAiXHUyMTk2IiwKICAgICJud25lYXI7IjogIlx1MjkyNyIsCiAgICAib1M7IjogIlx1MjRjOCIsCiAgICAib2FjdXRlIjogIlx4ZjMiLAogICAgIm9hY3V0ZTsiOiAiXHhmMyIsCiAgICAib2FzdDsiOiAiXHUyMjliIiwKICAgICJvY2lyOyI6ICJcdTIyOWEiLAogICAgIm9jaXJjIjogIlx4ZjQiLAogICAgIm9jaXJjOyI6ICJceGY0IiwKICAgICJvY3k7IjogIlx1MDQzZSIsCiAgICAib2Rhc2g7IjogIlx1MjI5ZCIsCiAgICAib2RibGFjOyI6ICJcdTAxNTEiLAogICAgIm9kaXY7IjogIlx1MmEzOCIsCiAgICAib2RvdDsiOiAiXHUyMjk5IiwKICAgICJvZHNvbGQ7IjogIlx1MjliYyIsCiAgICAib2VsaWc7IjogIlx1MDE1MyIsCiAgICAib2ZjaXI7IjogIlx1MjliZiIsCiAgICAib2ZyOyI6ICJcVTAwMDFkNTJjIiwKICAgICJvZ29uOyI6ICJcdTAyZGIiLAogICAgIm9ncmF2ZSI6ICJceGYyIiwKICAgICJvZ3JhdmU7IjogIlx4ZjIiLAogICAgIm9ndDsiOiAiXHUyOWMxIiwKICAgICJvaGJhcjsiOiAiXHUyOWI1IiwKICAgICJvaG07IjogIlx1MDNhOSIsCiAgICAib2ludDsiOiAiXHUyMjJlIiwKICAgICJvbGFycjsiOiAiXHUyMWJhIiwKICAgICJvbGNpcjsiOiAiXHUyOWJlIiwKICAgICJvbGNyb3NzOyI6ICJcdTI5YmIiLAogICAgIm9saW5lOyI6ICJcdTIwM2UiLAogICAgIm9sdDsiOiAiXHUyOWMwIiwKICAgICJvbWFjcjsiOiAiXHUwMTRkIiwKICAgICJvbWVnYTsiOiAiXHUwM2M5IiwKICAgICJvbWljcm9uOyI6ICJcdTAzYmYiLAogICAgIm9taWQ7IjogIlx1MjliNiIsCiAgICAib21pbnVzOyI6ICJcdTIyOTYiLAogICAgIm9vcGY7IjogIlxVMDAwMWQ1NjAiLAogICAgIm9wYXI7IjogIlx1MjliNyIsCiAgICAib3BlcnA7IjogIlx1MjliOSIsCiAgICAib3BsdXM7IjogIlx1MjI5NSIsCiAgICAib3I7IjogIlx1MjIyOCIsCiAgICAib3JhcnI7IjogIlx1MjFiYiIsCiAgICAib3JkOyI6ICJcdTJhNWQiLAogICAgIm9yZGVyOyI6ICJcdTIxMzQiLAogICAgIm9yZGVyb2Y7IjogIlx1MjEzNCIsCiAgICAib3JkZiI6ICJceGFhIiwKICAgICJvcmRmOyI6ICJceGFhIiwKICAgICJvcmRtIjogIlx4YmEiLAogICAgIm9yZG07IjogIlx4YmEiLAogICAgIm9yaWdvZjsiOiAiXHUyMmI2IiwKICAgICJvcm9yOyI6ICJcdTJhNTYiLAogICAgIm9yc2xvcGU7IjogIlx1MmE1NyIsCiAgICAib3J2OyI6ICJcdTJhNWIiLAogICAgIm9zY3I7IjogIlx1MjEzNCIsCiAgICAib3NsYXNoIjogIlx4ZjgiLAogICAgIm9zbGFzaDsiOiAiXHhmOCIsCiAgICAib3NvbDsiOiAiXHUyMjk4IiwKICAgICJvdGlsZGUiOiAiXHhmNSIsCiAgICAib3RpbGRlOyI6ICJceGY1IiwKICAgICJvdGltZXM7IjogIlx1MjI5NyIsCiAgICAib3RpbWVzYXM7IjogIlx1MmEzNiIsCiAgICAib3VtbCI6ICJceGY2IiwKICAgICJvdW1sOyI6ICJceGY2IiwKICAgICJvdmJhcjsiOiAiXHUyMzNkIiwKICAgICJwYXI7IjogIlx1MjIyNSIsCiAgICAicGFyYSI6ICJceGI2IiwKICAgICJwYXJhOyI6ICJceGI2IiwKICAgICJwYXJhbGxlbDsiOiAiXHUyMjI1IiwKICAgICJwYXJzaW07IjogIlx1MmFmMyIsCiAgICAicGFyc2w7IjogIlx1MmFmZCIsCiAgICAicGFydDsiOiAiXHUyMjAyIiwKICAgICJwY3k7IjogIlx1MDQzZiIsCiAgICAicGVyY250OyI6ICIlIiwKICAgICJwZXJpb2Q7IjogIi4iLAogICAgInBlcm1pbDsiOiAiXHUyMDMwIiwKICAgICJwZXJwOyI6ICJcdTIyYTUiLAogICAgInBlcnRlbms7IjogIlx1MjAzMSIsCiAgICAicGZyOyI6ICJcVTAwMDFkNTJkIiwKICAgICJwaGk7IjogIlx1MDNjNiIsCiAgICAicGhpdjsiOiAiXHUwM2Q1IiwKICAgICJwaG1tYXQ7IjogIlx1MjEzMyIsCiAgICAicGhvbmU7IjogIlx1MjYwZSIsCiAgICAicGk7IjogIlx1MDNjMCIsCiAgICAicGl0Y2hmb3JrOyI6ICJcdTIyZDQiLAogICAgInBpdjsiOiAiXHUwM2Q2IiwKICAgICJwbGFuY2s7IjogIlx1MjEwZiIsCiAgICAicGxhbmNraDsiOiAiXHUyMTBlIiwKICAgICJwbGFua3Y7IjogIlx1MjEwZiIsCiAgICAicGx1czsiOiAiKyIsCiAgICAicGx1c2FjaXI7IjogIlx1MmEyMyIsCiAgICAicGx1c2I7IjogIlx1MjI5ZSIsCiAgICAicGx1c2NpcjsiOiAiXHUyYTIyIiwKICAgICJwbHVzZG87IjogIlx1MjIxNCIsCiAgICAicGx1c2R1OyI6ICJcdTJhMjUiLAogICAgInBsdXNlOyI6ICJcdTJhNzIiLAogICAgInBsdXNtbiI6ICJceGIxIiwKICAgICJwbHVzbW47IjogIlx4YjEiLAogICAgInBsdXNzaW07IjogIlx1MmEyNiIsCiAgICAicGx1c3R3bzsiOiAiXHUyYTI3IiwKICAgICJwbTsiOiAiXHhiMSIsCiAgICAicG9pbnRpbnQ7IjogIlx1MmExNSIsCiAgICAicG9wZjsiOiAiXFUwMDAxZDU2MSIsCiAgICAicG91bmQiOiAiXHhhMyIsCiAgICAicG91bmQ7IjogIlx4YTMiLAogICAgInByOyI6ICJcdTIyN2EiLAogICAgInByRTsiOiAiXHUyYWIzIiwKICAgICJwcmFwOyI6ICJcdTJhYjciLAogICAgInByY3VlOyI6ICJcdTIyN2MiLAogICAgInByZTsiOiAiXHUyYWFmIiwKICAgICJwcmVjOyI6ICJcdTIyN2EiLAogICAgInByZWNhcHByb3g7IjogIlx1MmFiNyIsCiAgICAicHJlY2N1cmx5ZXE7IjogIlx1MjI3YyIsCiAgICAicHJlY2VxOyI6ICJcdTJhYWYiLAogICAgInByZWNuYXBwcm94OyI6ICJcdTJhYjkiLAogICAgInByZWNuZXFxOyI6ICJcdTJhYjUiLAogICAgInByZWNuc2ltOyI6ICJcdTIyZTgiLAogICAgInByZWNzaW07IjogIlx1MjI3ZSIsCiAgICAicHJpbWU7IjogIlx1MjAzMiIsCiAgICAicHJpbWVzOyI6ICJcdTIxMTkiLAogICAgInBybkU7IjogIlx1MmFiNSIsCiAgICAicHJuYXA7IjogIlx1MmFiOSIsCiAgICAicHJuc2ltOyI6ICJcdTIyZTgiLAogICAgInByb2Q7IjogIlx1MjIwZiIsCiAgICAicHJvZmFsYXI7IjogIlx1MjMyZSIsCiAgICAicHJvZmxpbmU7IjogIlx1MjMxMiIsCiAgICAicHJvZnN1cmY7IjogIlx1MjMxMyIsCiAgICAicHJvcDsiOiAiXHUyMjFkIiwKICAgICJwcm9wdG87IjogIlx1MjIxZCIsCiAgICAicHJzaW07IjogIlx1MjI3ZSIsCiAgICAicHJ1cmVsOyI6ICJcdTIyYjAiLAogICAgInBzY3I7IjogIlxVMDAwMWQ0YzUiLAogICAgInBzaTsiOiAiXHUwM2M4IiwKICAgICJwdW5jc3A7IjogIlx1MjAwOCIsCiAgICAicWZyOyI6ICJcVTAwMDFkNTJlIiwKICAgICJxaW50OyI6ICJcdTJhMGMiLAogICAgInFvcGY7IjogIlxVMDAwMWQ1NjIiLAogICAgInFwcmltZTsiOiAiXHUyMDU3IiwKICAgICJxc2NyOyI6ICJcVTAwMDFkNGM2IiwKICAgICJxdWF0ZXJuaW9uczsiOiAiXHUyMTBkIiwKICAgICJxdWF0aW50OyI6ICJcdTJhMTYiLAogICAgInF1ZXN0OyI6ICI/IiwKICAgICJxdWVzdGVxOyI6ICJcdTIyNWYiLAogICAgInF1b3QiOiAiXCIiLAogICAgInF1b3Q7IjogIlwiIiwKICAgICJyQWFycjsiOiAiXHUyMWRiIiwKICAgICJyQXJyOyI6ICJcdTIxZDIiLAogICAgInJBdGFpbDsiOiAiXHUyOTFjIiwKICAgICJyQmFycjsiOiAiXHUyOTBmIiwKICAgICJySGFyOyI6ICJcdTI5NjQiLAogICAgInJhY2U7IjogIlx1MjIzZFx1MDMzMSIsCiAgICAicmFjdXRlOyI6ICJcdTAxNTUiLAogICAgInJhZGljOyI6ICJcdTIyMWEiLAogICAgInJhZW1wdHl2OyI6ICJcdTI5YjMiLAogICAgInJhbmc7IjogIlx1MjdlOSIsCiAgICAicmFuZ2Q7IjogIlx1Mjk5MiIsCiAgICAicmFuZ2U7IjogIlx1MjlhNSIsCiAgICAicmFuZ2xlOyI6ICJcdTI3ZTkiLAogICAgInJhcXVvIjogIlx4YmIiLAogICAgInJhcXVvOyI6ICJceGJiIiwKICAgICJyYXJyOyI6ICJcdTIxOTIiLAogICAgInJhcnJhcDsiOiAiXHUyOTc1IiwKICAgICJyYXJyYjsiOiAiXHUyMWU1IiwKICAgICJyYXJyYmZzOyI6ICJcdTI5MjAiLAogICAgInJhcnJjOyI6ICJcdTI5MzMiLAogICAgInJhcnJmczsiOiAiXHUyOTFlIiwKICAgICJyYXJyaGs7IjogIlx1MjFhYSIsCiAgICAicmFycmxwOyI6ICJcdTIxYWMiLAogICAgInJhcnJwbDsiOiAiXHUyOTQ1IiwKICAgICJyYXJyc2ltOyI6ICJcdTI5NzQiLAogICAgInJhcnJ0bDsiOiAiXHUyMWEzIiwKICAgICJyYXJydzsiOiAiXHUyMTlkIiwKICAgICJyYXRhaWw7IjogIlx1MjkxYSIsCiAgICAicmF0aW87IjogIlx1MjIzNiIsCiAgICAicmF0aW9uYWxzOyI6ICJcdTIxMWEiLAogICAgInJiYXJyOyI6ICJcdTI5MGQiLAogICAgInJiYnJrOyI6ICJcdTI3NzMiLAogICAgInJicmFjZTsiOiAifSIsCiAgICAicmJyYWNrOyI6ICJdIiwKICAgICJyYnJrZTsiOiAiXHUyOThjIiwKICAgICJyYnJrc2xkOyI6ICJcdTI5OGUiLAogICAgInJicmtzbHU7IjogIlx1Mjk5MCIsCiAgICAicmNhcm9uOyI6ICJcdTAxNTkiLAogICAgInJjZWRpbDsiOiAiXHUwMTU3IiwKICAgICJyY2VpbDsiOiAiXHUyMzA5IiwKICAgICJyY3ViOyI6ICJ9IiwKICAgICJyY3k7IjogIlx1MDQ0MCIsCiAgICAicmRjYTsiOiAiXHUyOTM3IiwKICAgICJyZGxkaGFyOyI6ICJcdTI5NjkiLAogICAgInJkcXVvOyI6ICJcdTIwMWQiLAogICAgInJkcXVvcjsiOiAiXHUyMDFkIiwKICAgICJyZHNoOyI6ICJcdTIxYjMiLAogICAgInJlYWw7IjogIlx1MjExYyIsCiAgICAicmVhbGluZTsiOiAiXHUyMTFiIiwKICAgICJyZWFscGFydDsiOiAiXHUyMTFjIiwKICAgICJyZWFsczsiOiAiXHUyMTFkIiwKICAgICJyZWN0OyI6ICJcdTI1YWQiLAogICAgInJlZyI6ICJceGFlIiwKICAgICJyZWc7IjogIlx4YWUiLAogICAgInJmaXNodDsiOiAiXHUyOTdkIiwKICAgICJyZmxvb3I7IjogIlx1MjMwYiIsCiAgICAicmZyOyI6ICJcVTAwMDFkNTJmIiwKICAgICJyaGFyZDsiOiAiXHUyMWMxIiwKICAgICJyaGFydTsiOiAiXHUyMWMwIiwKICAgICJyaGFydWw7IjogIlx1Mjk2YyIsCiAgICAicmhvOyI6ICJcdTAzYzEiLAogICAgInJob3Y7IjogIlx1MDNmMSIsCiAgICAicmlnaHRhcnJvdzsiOiAiXHUyMTkyIiwKICAgICJyaWdodGFycm93dGFpbDsiOiAiXHUyMWEzIiwKICAgICJyaWdodGhhcnBvb25kb3duOyI6ICJcdTIxYzEiLAogICAgInJpZ2h0aGFycG9vbnVwOyI6ICJcdTIxYzAiLAogICAgInJpZ2h0bGVmdGFycm93czsiOiAiXHUyMWM0IiwKICAgICJyaWdodGxlZnRoYXJwb29uczsiOiAiXHUyMWNjIiwKICAgICJyaWdodHJpZ2h0YXJyb3dzOyI6ICJcdTIxYzkiLAogICAgInJpZ2h0c3F1aWdhcnJvdzsiOiAiXHUyMTlkIiwKICAgICJyaWdodHRocmVldGltZXM7IjogIlx1MjJjYyIsCiAgICAicmluZzsiOiAiXHUwMmRhIiwKICAgICJyaXNpbmdkb3RzZXE7IjogIlx1MjI1MyIsCiAgICAicmxhcnI7IjogIlx1MjFjNCIsCiAgICAicmxoYXI7IjogIlx1MjFjYyIsCiAgICAicmxtOyI6ICJcdTIwMGYiLAogICAgInJtb3VzdDsiOiAiXHUyM2IxIiwKICAgICJybW91c3RhY2hlOyI6ICJcdTIzYjEiLAogICAgInJubWlkOyI6ICJcdTJhZWUiLAogICAgInJvYW5nOyI6ICJcdTI3ZWQiLAogICAgInJvYXJyOyI6ICJcdTIxZmUiLAogICAgInJvYnJrOyI6ICJcdTI3ZTciLAogICAgInJvcGFyOyI6ICJcdTI5ODYiLAogICAgInJvcGY7IjogIlxVMDAwMWQ1NjMiLAogICAgInJvcGx1czsiOiAiXHUyYTJlIiwKICAgICJyb3RpbWVzOyI6ICJcdTJhMzUiLAogICAgInJwYXI7IjogIikiLAogICAgInJwYXJndDsiOiAiXHUyOTk0IiwKICAgICJycHBvbGludDsiOiAiXHUyYTEyIiwKICAgICJycmFycjsiOiAiXHUyMWM5IiwKICAgICJyc2FxdW87IjogIlx1MjAzYSIsCiAgICAicnNjcjsiOiAiXFUwMDAxZDRjNyIsCiAgICAicnNoOyI6ICJcdTIxYjEiLAogICAgInJzcWI7IjogIl0iLAogICAgInJzcXVvOyI6ICJcdTIwMTkiLAogICAgInJzcXVvcjsiOiAiXHUyMDE5IiwKICAgICJydGhyZWU7IjogIlx1MjJjYyIsCiAgICAicnRpbWVzOyI6ICJcdTIyY2EiLAogICAgInJ0cmk7IjogIlx1MjViOSIsCiAgICAicnRyaWU7IjogIlx1MjJiNSIsCiAgICAicnRyaWY7IjogIlx1MjViOCIsCiAgICAicnRyaWx0cmk7IjogIlx1MjljZSIsCiAgICAicnVsdWhhcjsiOiAiXHUyOTY4IiwKICAgICJyeDsiOiAiXHUyMTFlIiwKICAgICJzYWN1dGU7IjogIlx1MDE1YiIsCiAgICAic2JxdW87IjogIlx1MjAxYSIsCiAgICAic2M7IjogIlx1MjI3YiIsCiAgICAic2NFOyI6ICJcdTJhYjQiLAogICAgInNjYXA7IjogIlx1MmFiOCIsCiAgICAic2Nhcm9uOyI6ICJcdTAxNjEiLAogICAgInNjY3VlOyI6ICJcdTIyN2QiLAogICAgInNjZTsiOiAiXHUyYWIwIiwKICAgICJzY2VkaWw7IjogIlx1MDE1ZiIsCiAgICAic2NpcmM7IjogIlx1MDE1ZCIsCiAgICAic2NuRTsiOiAiXHUyYWI2IiwKICAgICJzY25hcDsiOiAiXHUyYWJhIiwKICAgICJzY25zaW07IjogIlx1MjJlOSIsCiAgICAic2Nwb2xpbnQ7IjogIlx1MmExMyIsCiAgICAic2NzaW07IjogIlx1MjI3ZiIsCiAgICAic2N5OyI6ICJcdTA0NDEiLAogICAgInNkb3Q7IjogIlx1MjJjNSIsCiAgICAic2RvdGI7IjogIlx1MjJhMSIsCiAgICAic2RvdGU7IjogIlx1MmE2NiIsCiAgICAic2VBcnI7IjogIlx1MjFkOCIsCiAgICAic2VhcmhrOyI6ICJcdTI5MjUiLAogICAgInNlYXJyOyI6ICJcdTIxOTgiLAogICAgInNlYXJyb3c7IjogIlx1MjE5OCIsCiAgICAic2VjdCI6ICJceGE3IiwKICAgICJzZWN0OyI6ICJceGE3IiwKICAgICJzZW1pOyI6ICI7IiwKICAgICJzZXN3YXI7IjogIlx1MjkyOSIsCiAgICAic2V0bWludXM7IjogIlx1MjIxNiIsCiAgICAic2V0bW47IjogIlx1MjIxNiIsCiAgICAic2V4dDsiOiAiXHUyNzM2IiwKICAgICJzZnI7IjogIlxVMDAwMWQ1MzAiLAogICAgInNmcm93bjsiOiAiXHUyMzIyIiwKICAgICJzaGFycDsiOiAiXHUyNjZmIiwKICAgICJzaGNoY3k7IjogIlx1MDQ0OSIsCiAgICAic2hjeTsiOiAiXHUwNDQ4IiwKICAgICJzaG9ydG1pZDsiOiAiXHUyMjIzIiwKICAgICJzaG9ydHBhcmFsbGVsOyI6ICJcdTIyMjUiLAogICAgInNoeSI6ICJceGFkIiwKICAgICJzaHk7IjogIlx4YWQiLAogICAgInNpZ21hOyI6ICJcdTAzYzMiLAogICAgInNpZ21hZjsiOiAiXHUwM2MyIiwKICAgICJzaWdtYXY7IjogIlx1MDNjMiIsCiAgICAic2ltOyI6ICJcdTIyM2MiLAogICAgInNpbWRvdDsiOiAiXHUyYTZhIiwKICAgICJzaW1lOyI6ICJcdTIyNDMiLAogICAgInNpbWVxOyI6ICJcdTIyNDMiLAogICAgInNpbWc7IjogIlx1MmE5ZSIsCiAgICAic2ltZ0U7IjogIlx1MmFhMCIsCiAgICAic2ltbDsiOiAiXHUyYTlkIiwKICAgICJzaW1sRTsiOiAiXHUyYTlmIiwKICAgICJzaW1uZTsiOiAiXHUyMjQ2IiwKICAgICJzaW1wbHVzOyI6ICJcdTJhMjQiLAogICAgInNpbXJhcnI7IjogIlx1Mjk3MiIsCiAgICAic2xhcnI7IjogIlx1MjE5MCIsCiAgICAic21hbGxzZXRtaW51czsiOiAiXHUyMjE2IiwKICAgICJzbWFzaHA7IjogIlx1MmEzMyIsCiAgICAic21lcGFyc2w7IjogIlx1MjllNCIsCiAgICAic21pZDsiOiAiXHUyMjIzIiwKICAgICJzbWlsZTsiOiAiXHUyMzIzIiwKICAgICJzbXQ7IjogIlx1MmFhYSIsCiAgICAic210ZTsiOiAiXHUyYWFjIiwKICAgICJzbXRlczsiOiAiXHUyYWFjXHVmZTAwIiwKICAgICJzb2Z0Y3k7IjogIlx1MDQ0YyIsCiAgICAic29sOyI6ICIvIiwKICAgICJzb2xiOyI6ICJcdTI5YzQiLAogICAgInNvbGJhcjsiOiAiXHUyMzNmIiwKICAgICJzb3BmOyI6ICJcVTAwMDFkNTY0IiwKICAgICJzcGFkZXM7IjogIlx1MjY2MCIsCiAgICAic3BhZGVzdWl0OyI6ICJcdTI2NjAiLAogICAgInNwYXI7IjogIlx1MjIyNSIsCiAgICAic3FjYXA7IjogIlx1MjI5MyIsCiAgICAic3FjYXBzOyI6ICJcdTIyOTNcdWZlMDAiLAogICAgInNxY3VwOyI6ICJcdTIyOTQiLAogICAgInNxY3VwczsiOiAiXHUyMjk0XHVmZTAwIiwKICAgICJzcXN1YjsiOiAiXHUyMjhmIiwKICAgICJzcXN1YmU7IjogIlx1MjI5MSIsCiAgICAic3FzdWJzZXQ7IjogIlx1MjI4ZiIsCiAgICAic3FzdWJzZXRlcTsiOiAiXHUyMjkxIiwKICAgICJzcXN1cDsiOiAiXHUyMjkwIiwKICAgICJzcXN1cGU7IjogIlx1MjI5MiIsCiAgICAic3FzdXBzZXQ7IjogIlx1MjI5MCIsCiAgICAic3FzdXBzZXRlcTsiOiAiXHUyMjkyIiwKICAgICJzcXU7IjogIlx1MjVhMSIsCiAgICAic3F1YXJlOyI6ICJcdTI1YTEiLAogICAgInNxdWFyZjsiOiAiXHUyNWFhIiwKICAgICJzcXVmOyI6ICJcdTI1YWEiLAogICAgInNyYXJyOyI6ICJcdTIxOTIiLAogICAgInNzY3I7IjogIlxVMDAwMWQ0YzgiLAogICAgInNzZXRtbjsiOiAiXHUyMjE2IiwKICAgICJzc21pbGU7IjogIlx1MjMyMyIsCiAgICAic3N0YXJmOyI6ICJcdTIyYzYiLAogICAgInN0YXI7IjogIlx1MjYwNiIsCiAgICAic3RhcmY7IjogIlx1MjYwNSIsCiAgICAic3RyYWlnaHRlcHNpbG9uOyI6ICJcdTAzZjUiLAogICAgInN0cmFpZ2h0cGhpOyI6ICJcdTAzZDUiLAogICAgInN0cm5zOyI6ICJceGFmIiwKICAgICJzdWI7IjogIlx1MjI4MiIsCiAgICAic3ViRTsiOiAiXHUyYWM1IiwKICAgICJzdWJkb3Q7IjogIlx1MmFiZCIsCiAgICAic3ViZTsiOiAiXHUyMjg2IiwKICAgICJzdWJlZG90OyI6ICJcdTJhYzMiLAogICAgInN1Ym11bHQ7IjogIlx1MmFjMSIsCiAgICAic3VibkU7IjogIlx1MmFjYiIsCiAgICAic3VibmU7IjogIlx1MjI4YSIsCiAgICAic3VicGx1czsiOiAiXHUyYWJmIiwKICAgICJzdWJyYXJyOyI6ICJcdTI5NzkiLAogICAgInN1YnNldDsiOiAiXHUyMjgyIiwKICAgICJzdWJzZXRlcTsiOiAiXHUyMjg2IiwKICAgICJzdWJzZXRlcXE7IjogIlx1MmFjNSIsCiAgICAic3Vic2V0bmVxOyI6ICJcdTIyOGEiLAogICAgInN1YnNldG5lcXE7IjogIlx1MmFjYiIsCiAgICAic3Vic2ltOyI6ICJcdTJhYzciLAogICAgInN1YnN1YjsiOiAiXHUyYWQ1IiwKICAgICJzdWJzdXA7IjogIlx1MmFkMyIsCiAgICAic3VjYzsiOiAiXHUyMjdiIiwKICAgICJzdWNjYXBwcm94OyI6ICJcdTJhYjgiLAogICAgInN1Y2NjdXJseWVxOyI6ICJcdTIyN2QiLAogICAgInN1Y2NlcTsiOiAiXHUyYWIwIiwKICAgICJzdWNjbmFwcHJveDsiOiAiXHUyYWJhIiwKICAgICJzdWNjbmVxcTsiOiAiXHUyYWI2IiwKICAgICJzdWNjbnNpbTsiOiAiXHUyMmU5IiwKICAgICJzdWNjc2ltOyI6ICJcdTIyN2YiLAogICAgInN1bTsiOiAiXHUyMjExIiwKICAgICJzdW5nOyI6ICJcdTI2NmEiLAogICAgInN1cDEiOiAiXHhiOSIsCiAgICAic3VwMTsiOiAiXHhiOSIsCiAgICAic3VwMiI6ICJceGIyIiwKICAgICJzdXAyOyI6ICJceGIyIiwKICAgICJzdXAzIjogIlx4YjMiLAogICAgInN1cDM7IjogIlx4YjMiLAogICAgInN1cDsiOiAiXHUyMjgzIiwKICAgICJzdXBFOyI6ICJcdTJhYzYiLAogICAgInN1cGRvdDsiOiAiXHUyYWJlIiwKICAgICJzdXBkc3ViOyI6ICJcdTJhZDgiLAogICAgInN1cGU7IjogIlx1MjI4NyIsCiAgICAic3VwZWRvdDsiOiAiXHUyYWM0IiwKICAgICJzdXBoc29sOyI6ICJcdTI3YzkiLAogICAgInN1cGhzdWI7IjogIlx1MmFkNyIsCiAgICAic3VwbGFycjsiOiAiXHUyOTdiIiwKICAgICJzdXBtdWx0OyI6ICJcdTJhYzIiLAogICAgInN1cG5FOyI6ICJcdTJhY2MiLAogICAgInN1cG5lOyI6ICJcdTIyOGIiLAogICAgInN1cHBsdXM7IjogIlx1MmFjMCIsCiAgICAic3Vwc2V0OyI6ICJcdTIyODMiLAogICAgInN1cHNldGVxOyI6ICJcdTIyODciLAogICAgInN1cHNldGVxcTsiOiAiXHUyYWM2IiwKICAgICJzdXBzZXRuZXE7IjogIlx1MjI4YiIsCiAgICAic3Vwc2V0bmVxcTsiOiAiXHUyYWNjIiwKICAgICJzdXBzaW07IjogIlx1MmFjOCIsCiAgICAic3Vwc3ViOyI6ICJcdTJhZDQiLAogICAgInN1cHN1cDsiOiAiXHUyYWQ2IiwKICAgICJzd0FycjsiOiAiXHUyMWQ5IiwKICAgICJzd2FyaGs7IjogIlx1MjkyNiIsCiAgICAic3dhcnI7IjogIlx1MjE5OSIsCiAgICAic3dhcnJvdzsiOiAiXHUyMTk5IiwKICAgICJzd253YXI7IjogIlx1MjkyYSIsCiAgICAic3psaWciOiAiXHhkZiIsCiAgICAic3psaWc7IjogIlx4ZGYiLAogICAgInRhcmdldDsiOiAiXHUyMzE2IiwKICAgICJ0YXU7IjogIlx1MDNjNCIsCiAgICAidGJyazsiOiAiXHUyM2I0IiwKICAgICJ0Y2Fyb247IjogIlx1MDE2NSIsCiAgICAidGNlZGlsOyI6ICJcdTAxNjMiLAogICAgInRjeTsiOiAiXHUwNDQyIiwKICAgICJ0ZG90OyI6ICJcdTIwZGIiLAogICAgInRlbHJlYzsiOiAiXHUyMzE1IiwKICAgICJ0ZnI7IjogIlxVMDAwMWQ1MzEiLAogICAgInRoZXJlNDsiOiAiXHUyMjM0IiwKICAgICJ0aGVyZWZvcmU7IjogIlx1MjIzNCIsCiAgICAidGhldGE7IjogIlx1MDNiOCIsCiAgICAidGhldGFzeW07IjogIlx1MDNkMSIsCiAgICAidGhldGF2OyI6ICJcdTAzZDEiLAogICAgInRoaWNrYXBwcm94OyI6ICJcdTIyNDgiLAogICAgInRoaWNrc2ltOyI6ICJcdTIyM2MiLAogICAgInRoaW5zcDsiOiAiXHUyMDA5IiwKICAgICJ0aGthcDsiOiAiXHUyMjQ4IiwKICAgICJ0aGtzaW07IjogIlx1MjIzYyIsCiAgICAidGhvcm4iOiAiXHhmZSIsCiAgICAidGhvcm47IjogIlx4ZmUiLAogICAgInRpbGRlOyI6ICJcdTAyZGMiLAogICAgInRpbWVzIjogIlx4ZDciLAogICAgInRpbWVzOyI6ICJceGQ3IiwKICAgICJ0aW1lc2I7IjogIlx1MjJhMCIsCiAgICAidGltZXNiYXI7IjogIlx1MmEzMSIsCiAgICAidGltZXNkOyI6ICJcdTJhMzAiLAogICAgInRpbnQ7IjogIlx1MjIyZCIsCiAgICAidG9lYTsiOiAiXHUyOTI4IiwKICAgICJ0b3A7IjogIlx1MjJhNCIsCiAgICAidG9wYm90OyI6ICJcdTIzMzYiLAogICAgInRvcGNpcjsiOiAiXHUyYWYxIiwKICAgICJ0b3BmOyI6ICJcVTAwMDFkNTY1IiwKICAgICJ0b3Bmb3JrOyI6ICJcdTJhZGEiLAogICAgInRvc2E7IjogIlx1MjkyOSIsCiAgICAidHByaW1lOyI6ICJcdTIwMzQiLAogICAgInRyYWRlOyI6ICJcdTIxMjIiLAogICAgInRyaWFuZ2xlOyI6ICJcdTI1YjUiLAogICAgInRyaWFuZ2xlZG93bjsiOiAiXHUyNWJmIiwKICAgICJ0cmlhbmdsZWxlZnQ7IjogIlx1MjVjMyIsCiAgICAidHJpYW5nbGVsZWZ0ZXE7IjogIlx1MjJiNCIsCiAgICAidHJpYW5nbGVxOyI6ICJcdTIyNWMiLAogICAgInRyaWFuZ2xlcmlnaHQ7IjogIlx1MjViOSIsCiAgICAidHJpYW5nbGVyaWdodGVxOyI6ICJcdTIyYjUiLAogICAgInRyaWRvdDsiOiAiXHUyNWVjIiwKICAgICJ0cmllOyI6ICJcdTIyNWMiLAogICAgInRyaW1pbnVzOyI6ICJcdTJhM2EiLAogICAgInRyaXBsdXM7IjogIlx1MmEzOSIsCiAgICAidHJpc2I7IjogIlx1MjljZCIsCiAgICAidHJpdGltZTsiOiAiXHUyYTNiIiwKICAgICJ0cnBleml1bTsiOiAiXHUyM2UyIiwKICAgICJ0c2NyOyI6ICJcVTAwMDFkNGM5IiwKICAgICJ0c2N5OyI6ICJcdTA0NDYiLAogICAgInRzaGN5OyI6ICJcdTA0NWIiLAogICAgInRzdHJvazsiOiAiXHUwMTY3IiwKICAgICJ0d2l4dDsiOiAiXHUyMjZjIiwKICAgICJ0d29oZWFkbGVmdGFycm93OyI6ICJcdTIxOWUiLAogICAgInR3b2hlYWRyaWdodGFycm93OyI6ICJcdTIxYTAiLAogICAgInVBcnI7IjogIlx1MjFkMSIsCiAgICAidUhhcjsiOiAiXHUyOTYzIiwKICAgICJ1YWN1dGUiOiAiXHhmYSIsCiAgICAidWFjdXRlOyI6ICJceGZhIiwKICAgICJ1YXJyOyI6ICJcdTIxOTEiLAogICAgInVicmN5OyI6ICJcdTA0NWUiLAogICAgInVicmV2ZTsiOiAiXHUwMTZkIiwKICAgICJ1Y2lyYyI6ICJceGZiIiwKICAgICJ1Y2lyYzsiOiAiXHhmYiIsCiAgICAidWN5OyI6ICJcdTA0NDMiLAogICAgInVkYXJyOyI6ICJcdTIxYzUiLAogICAgInVkYmxhYzsiOiAiXHUwMTcxIiwKICAgICJ1ZGhhcjsiOiAiXHUyOTZlIiwKICAgICJ1ZmlzaHQ7IjogIlx1Mjk3ZSIsCiAgICAidWZyOyI6ICJcVTAwMDFkNTMyIiwKICAgICJ1Z3JhdmUiOiAiXHhmOSIsCiAgICAidWdyYXZlOyI6ICJceGY5IiwKICAgICJ1aGFybDsiOiAiXHUyMWJmIiwKICAgICJ1aGFycjsiOiAiXHUyMWJlIiwKICAgICJ1aGJsazsiOiAiXHUyNTgwIiwKICAgICJ1bGNvcm47IjogIlx1MjMxYyIsCiAgICAidWxjb3JuZXI7IjogIlx1MjMxYyIsCiAgICAidWxjcm9wOyI6ICJcdTIzMGYiLAogICAgInVsdHJpOyI6ICJcdTI1ZjgiLAogICAgInVtYWNyOyI6ICJcdTAxNmIiLAogICAgInVtbCI6ICJceGE4IiwKICAgICJ1bWw7IjogIlx4YTgiLAogICAgInVvZ29uOyI6ICJcdTAxNzMiLAogICAgInVvcGY7IjogIlxVMDAwMWQ1NjYiLAogICAgInVwYXJyb3c7IjogIlx1MjE5MSIsCiAgICAidXBkb3duYXJyb3c7IjogIlx1MjE5NSIsCiAgICAidXBoYXJwb29ubGVmdDsiOiAiXHUyMWJmIiwKICAgICJ1cGhhcnBvb25yaWdodDsiOiAiXHUyMWJlIiwKICAgICJ1cGx1czsiOiAiXHUyMjhlIiwKICAgICJ1cHNpOyI6ICJcdTAzYzUiLAogICAgInVwc2loOyI6ICJcdTAzZDIiLAogICAgInVwc2lsb247IjogIlx1MDNjNSIsCiAgICAidXB1cGFycm93czsiOiAiXHUyMWM4IiwKICAgICJ1cmNvcm47IjogIlx1MjMxZCIsCiAgICAidXJjb3JuZXI7IjogIlx1MjMxZCIsCiAgICAidXJjcm9wOyI6ICJcdTIzMGUiLAogICAgInVyaW5nOyI6ICJcdTAxNmYiLAogICAgInVydHJpOyI6ICJcdTI1ZjkiLAogICAgInVzY3I7IjogIlxVMDAwMWQ0Y2EiLAogICAgInV0ZG90OyI6ICJcdTIyZjAiLAogICAgInV0aWxkZTsiOiAiXHUwMTY5IiwKICAgICJ1dHJpOyI6ICJcdTI1YjUiLAogICAgInV0cmlmOyI6ICJcdTI1YjQiLAogICAgInV1YXJyOyI6ICJcdTIxYzgiLAogICAgInV1bWwiOiAiXHhmYyIsCiAgICAidXVtbDsiOiAiXHhmYyIsCiAgICAidXdhbmdsZTsiOiAiXHUyOWE3IiwKICAgICJ2QXJyOyI6ICJcdTIxZDUiLAogICAgInZCYXI7IjogIlx1MmFlOCIsCiAgICAidkJhcnY7IjogIlx1MmFlOSIsCiAgICAidkRhc2g7IjogIlx1MjJhOCIsCiAgICAidmFuZ3J0OyI6ICJcdTI5OWMiLAogICAgInZhcmVwc2lsb247IjogIlx1MDNmNSIsCiAgICAidmFya2FwcGE7IjogIlx1MDNmMCIsCiAgICAidmFybm90aGluZzsiOiAiXHUyMjA1IiwKICAgICJ2YXJwaGk7IjogIlx1MDNkNSIsCiAgICAidmFycGk7IjogIlx1MDNkNiIsCiAgICAidmFycHJvcHRvOyI6ICJcdTIyMWQiLAogICAgInZhcnI7IjogIlx1MjE5NSIsCiAgICAidmFycmhvOyI6ICJcdTAzZjEiLAogICAgInZhcnNpZ21hOyI6ICJcdTAzYzIiLAogICAgInZhcnN1YnNldG5lcTsiOiAiXHUyMjhhXHVmZTAwIiwKICAgICJ2YXJzdWJzZXRuZXFxOyI6ICJcdTJhY2JcdWZlMDAiLAogICAgInZhcnN1cHNldG5lcTsiOiAiXHUyMjhiXHVmZTAwIiwKICAgICJ2YXJzdXBzZXRuZXFxOyI6ICJcdTJhY2NcdWZlMDAiLAogICAgInZhcnRoZXRhOyI6ICJcdTAzZDEiLAogICAgInZhcnRyaWFuZ2xlbGVmdDsiOiAiXHUyMmIyIiwKICAgICJ2YXJ0cmlhbmdsZXJpZ2h0OyI6ICJcdTIyYjMiLAogICAgInZjeTsiOiAiXHUwNDMyIiwKICAgICJ2ZGFzaDsiOiAiXHUyMmEyIiwKICAgICJ2ZWU7IjogIlx1MjIyOCIsCiAgICAidmVlYmFyOyI6ICJcdTIyYmIiLAogICAgInZlZWVxOyI6ICJcdTIyNWEiLAogICAgInZlbGxpcDsiOiAiXHUyMmVlIiwKICAgICJ2ZXJiYXI7IjogInwiLAogICAgInZlcnQ7IjogInwiLAogICAgInZmcjsiOiAiXFUwMDAxZDUzMyIsCiAgICAidmx0cmk7IjogIlx1MjJiMiIsCiAgICAidm5zdWI7IjogIlx1MjI4Mlx1MjBkMiIsCiAgICAidm5zdXA7IjogIlx1MjI4M1x1MjBkMiIsCiAgICAidm9wZjsiOiAiXFUwMDAxZDU2NyIsCiAgICAidnByb3A7IjogIlx1MjIxZCIsCiAgICAidnJ0cmk7IjogIlx1MjJiMyIsCiAgICAidnNjcjsiOiAiXFUwMDAxZDRjYiIsCiAgICAidnN1Ym5FOyI6ICJcdTJhY2JcdWZlMDAiLAogICAgInZzdWJuZTsiOiAiXHUyMjhhXHVmZTAwIiwKICAgICJ2c3VwbkU7IjogIlx1MmFjY1x1ZmUwMCIsCiAgICAidnN1cG5lOyI6ICJcdTIyOGJcdWZlMDAiLAogICAgInZ6aWd6YWc7IjogIlx1Mjk5YSIsCiAgICAid2NpcmM7IjogIlx1MDE3NSIsCiAgICAid2VkYmFyOyI6ICJcdTJhNWYiLAogICAgIndlZGdlOyI6ICJcdTIyMjciLAogICAgIndlZGdlcTsiOiAiXHUyMjU5IiwKICAgICJ3ZWllcnA7IjogIlx1MjExOCIsCiAgICAid2ZyOyI6ICJcVTAwMDFkNTM0IiwKICAgICJ3b3BmOyI6ICJcVTAwMDFkNTY4IiwKICAgICJ3cDsiOiAiXHUyMTE4IiwKICAgICJ3cjsiOiAiXHUyMjQwIiwKICAgICJ3cmVhdGg7IjogIlx1MjI0MCIsCiAgICAid3NjcjsiOiAiXFUwMDAxZDRjYyIsCiAgICAieGNhcDsiOiAiXHUyMmMyIiwKICAgICJ4Y2lyYzsiOiAiXHUyNWVmIiwKICAgICJ4Y3VwOyI6ICJcdTIyYzMiLAogICAgInhkdHJpOyI6ICJcdTI1YmQiLAogICAgInhmcjsiOiAiXFUwMDAxZDUzNSIsCiAgICAieGhBcnI7IjogIlx1MjdmYSIsCiAgICAieGhhcnI7IjogIlx1MjdmNyIsCiAgICAieGk7IjogIlx1MDNiZSIsCiAgICAieGxBcnI7IjogIlx1MjdmOCIsCiAgICAieGxhcnI7IjogIlx1MjdmNSIsCiAgICAieG1hcDsiOiAiXHUyN2ZjIiwKICAgICJ4bmlzOyI6ICJcdTIyZmIiLAogICAgInhvZG90OyI6ICJcdTJhMDAiLAogICAgInhvcGY7IjogIlxVMDAwMWQ1NjkiLAogICAgInhvcGx1czsiOiAiXHUyYTAxIiwKICAgICJ4b3RpbWU7IjogIlx1MmEwMiIsCiAgICAieHJBcnI7IjogIlx1MjdmOSIsCiAgICAieHJhcnI7IjogIlx1MjdmNiIsCiAgICAieHNjcjsiOiAiXFUwMDAxZDRjZCIsCiAgICAieHNxY3VwOyI6ICJcdTJhMDYiLAogICAgInh1cGx1czsiOiAiXHUyYTA0IiwKICAgICJ4dXRyaTsiOiAiXHUyNWIzIiwKICAgICJ4dmVlOyI6ICJcdTIyYzEiLAogICAgInh3ZWRnZTsiOiAiXHUyMmMwIiwKICAgICJ5YWN1dGUiOiAiXHhmZCIsCiAgICAieWFjdXRlOyI6ICJceGZkIiwKICAgICJ5YWN5OyI6ICJcdTA0NGYiLAogICAgInljaXJjOyI6ICJcdTAxNzciLAogICAgInljeTsiOiAiXHUwNDRiIiwKICAgICJ5ZW4iOiAiXHhhNSIsCiAgICAieWVuOyI6ICJceGE1IiwKICAgICJ5ZnI7IjogIlxVMDAwMWQ1MzYiLAogICAgInlpY3k7IjogIlx1MDQ1NyIsCiAgICAieW9wZjsiOiAiXFUwMDAxZDU2YSIsCiAgICAieXNjcjsiOiAiXFUwMDAxZDRjZSIsCiAgICAieXVjeTsiOiAiXHUwNDRlIiwKICAgICJ5dW1sIjogIlx4ZmYiLAogICAgInl1bWw7IjogIlx4ZmYiLAogICAgInphY3V0ZTsiOiAiXHUwMTdhIiwKICAgICJ6Y2Fyb247IjogIlx1MDE3ZSIsCiAgICAiemN5OyI6ICJcdTA0MzciLAogICAgInpkb3Q7IjogIlx1MDE3YyIsCiAgICAiemVldHJmOyI6ICJcdTIxMjgiLAogICAgInpldGE7IjogIlx1MDNiNiIsCiAgICAiemZyOyI6ICJcVTAwMDFkNTM3IiwKICAgICJ6aGN5OyI6ICJcdTA0MzYiLAogICAgInppZ3JhcnI7IjogIlx1MjFkZCIsCiAgICAiem9wZjsiOiAiXFUwMDAxZDU2YiIsCiAgICAienNjcjsiOiAiXFUwMDAxZDRjZiIsCiAgICAiendqOyI6ICJcdTIwMGQiLAogICAgInp3bmo7IjogIlx1MjAwYyIsCn0KCnJlcGxhY2VtZW50Q2hhcmFjdGVycyA9IHsKICAgIDB4MDogIlx1RkZGRCIsCiAgICAweDBkOiAiXHUwMDBEIiwKICAgIDB4ODA6ICJcdTIwQUMiLAogICAgMHg4MTogIlx1MDA4MSIsCiAgICAweDgyOiAiXHUyMDFBIiwKICAgIDB4ODM6ICJcdTAxOTIiLAogICAgMHg4NDogIlx1MjAxRSIsCiAgICAweDg1OiAiXHUyMDI2IiwKICAgIDB4ODY6ICJcdTIwMjAiLAogICAgMHg4NzogIlx1MjAyMSIsCiAgICAweDg4OiAiXHUwMkM2IiwKICAgIDB4ODk6ICJcdTIwMzAiLAogICAgMHg4QTogIlx1MDE2MCIsCiAgICAweDhCOiAiXHUyMDM5IiwKICAgIDB4OEM6ICJcdTAxNTIiLAogICAgMHg4RDogIlx1MDA4RCIsCiAgICAweDhFOiAiXHUwMTdEIiwKICAgIDB4OEY6ICJcdTAwOEYiLAogICAgMHg5MDogIlx1MDA5MCIsCiAgICAweDkxOiAiXHUyMDE4IiwKICAgIDB4OTI6ICJcdTIwMTkiLAogICAgMHg5MzogIlx1MjAxQyIsCiAgICAweDk0OiAiXHUyMDFEIiwKICAgIDB4OTU6ICJcdTIwMjIiLAogICAgMHg5NjogIlx1MjAxMyIsCiAgICAweDk3OiAiXHUyMDE0IiwKICAgIDB4OTg6ICJcdTAyREMiLAogICAgMHg5OTogIlx1MjEyMiIsCiAgICAweDlBOiAiXHUwMTYxIiwKICAgIDB4OUI6ICJcdTIwM0EiLAogICAgMHg5QzogIlx1MDE1MyIsCiAgICAweDlEOiAiXHUwMDlEIiwKICAgIDB4OUU6ICJcdTAxN0UiLAogICAgMHg5RjogIlx1MDE3OCIsCn0KCnRva2VuVHlwZXMgPSB7CiAgICAiRG9jdHlwZSI6IDAsCiAgICAiQ2hhcmFjdGVycyI6IDEsCiAgICAiU3BhY2VDaGFyYWN0ZXJzIjogMiwKICAgICJTdGFydFRhZyI6IDMsCiAgICAiRW5kVGFnIjogNCwKICAgICJFbXB0eVRhZyI6IDUsCiAgICAiQ29tbWVudCI6IDYsCiAgICAiUGFyc2VFcnJvciI6IDcKfQoKdGFnVG9rZW5UeXBlcyA9IGZyb3plbnNldChbdG9rZW5UeXBlc1siU3RhcnRUYWciXSwgdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuVHlwZXNbIkVtcHR5VGFnIl1dKQoKCnByZWZpeGVzID0gZGljdChbKHYsIGspIGZvciBrLCB2IGluIG5hbWVzcGFjZXMuaXRlbXMoKV0pCnByZWZpeGVzWyJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIl0gPSAibWF0aCIKCgpjbGFzcyBEYXRhTG9zc1dhcm5pbmcoVXNlcldhcm5pbmcpOgogICAgcGFzcwoKCmNsYXNzIFJlcGFyc2VFeGNlcHRpb24oRXhjZXB0aW9uKToKICAgIHBhc3MKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAA4AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAG7QfIBtAgAAbQIAAEYAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9hbHBoYWJldGljYWxhdHRyaWJ1dGVzLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIC4gaW1wb3J0IGJhc2UKCnRyeToKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gb3JkZXJlZGRpY3QgaW1wb3J0IE9yZGVyZWREaWN0CgoKY2xhc3MgRmlsdGVyKGJhc2UuRmlsdGVyKToKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBmb3IgdG9rZW4gaW4gYmFzZS5GaWx0ZXIuX19pdGVyX18oc2VsZik6CiAgICAgICAgICAgIGlmIHRva2VuWyJ0eXBlIl0gaW4gKCJTdGFydFRhZyIsICJFbXB0eVRhZyIpOgogICAgICAgICAgICAgICAgYXR0cnMgPSBPcmRlcmVkRGljdCgpCiAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gc29ydGVkKHRva2VuWyJkYXRhIl0uaXRlbXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PWxhbWJkYSB4OiB4WzBdKToKICAgICAgICAgICAgICAgICAgICBhdHRyc1tuYW1lXSA9IHZhbHVlCiAgICAgICAgICAgICAgICB0b2tlblsiZGF0YSJdID0gYXR0cnMKICAgICAgICAgICAgeWllbGQgdG9rZW4KUEsDBBQAAAAAAAAAIQAigPvEHgEAAB4BAAA0AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvYmFzZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKCmNsYXNzIEZpbHRlcihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvdXJjZSk6CiAgICAgICAgc2VsZi5zb3VyY2UgPSBzb3VyY2UKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5zb3VyY2UpCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuc291cmNlLCBuYW1lKQpQSwMEFAAAAAAAAAAhACHAPIy2CgAAtgoAAEMAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9pbmplY3RfbWV0YV9jaGFyc2V0LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIC4gaW1wb3J0IGJhc2UKCgpjbGFzcyBGaWx0ZXIoYmFzZS5GaWx0ZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvdXJjZSwgZW5jb2RpbmcpOgogICAgICAgIGJhc2UuRmlsdGVyLl9faW5pdF9fKHNlbGYsIHNvdXJjZSkKICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgc3RhdGUgPSAicHJlX2hlYWQiCiAgICAgICAgbWV0YV9mb3VuZCA9IChzZWxmLmVuY29kaW5nIGlzIE5vbmUpCiAgICAgICAgcGVuZGluZyA9IFtdCgogICAgICAgIGZvciB0b2tlbiBpbiBiYXNlLkZpbHRlci5fX2l0ZXJfXyhzZWxmKToKICAgICAgICAgICAgdHlwZSA9IHRva2VuWyJ0eXBlIl0KICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3RhcnRUYWciOgogICAgICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWUiXS5sb3dlcigpID09ICJoZWFkIjoKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9ICJpbl9oZWFkIgoKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJFbXB0eVRhZyI6CiAgICAgICAgICAgICAgICBpZiB0b2tlblsibmFtZSJdLmxvd2VyKCkgPT0gIm1ldGEiOgogICAgICAgICAgICAgICAgICAgICMgcmVwbGFjZSBjaGFyc2V0IHdpdGggYWN0dWFsIGVuY29kaW5nCiAgICAgICAgICAgICAgICAgICAgaGFzX2h0dHBfZXF1aXZfY29udGVudF90eXBlID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICBmb3IgKG5hbWVzcGFjZSwgbmFtZSksIHZhbHVlIGluIHRva2VuWyJkYXRhIl0uaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmFtZXNwYWNlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBuYW1lLmxvd2VyKCkgPT0gJ2NoYXJzZXQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bImRhdGEiXVsobmFtZXNwYWNlLCBuYW1lKV0gPSBzZWxmLmVuY29kaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhX2ZvdW5kID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBuYW1lID09ICdodHRwLWVxdWl2JyBhbmQgdmFsdWUubG93ZXIoKSA9PSAnY29udGVudC10eXBlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19odHRwX2VxdWl2X2NvbnRlbnRfdHlwZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBoYXNfaHR0cF9lcXVpdl9jb250ZW50X3R5cGUgYW5kIChOb25lLCAiY29udGVudCIpIGluIHRva2VuWyJkYXRhIl06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsiZGF0YSJdWyhOb25lLCAiY29udGVudCIpXSA9ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9JXMnICUgc2VsZi5lbmNvZGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YV9mb3VuZCA9IFRydWUKCiAgICAgICAgICAgICAgICBlbGlmIHRva2VuWyJuYW1lIl0ubG93ZXIoKSA9PSAiaGVhZCIgYW5kIG5vdCBtZXRhX2ZvdW5kOgogICAgICAgICAgICAgICAgICAgICMgaW5zZXJ0IG1ldGEgaW50byBlbXB0eSBoZWFkCiAgICAgICAgICAgICAgICAgICAgeWllbGQgeyJ0eXBlIjogIlN0YXJ0VGFnIiwgIm5hbWUiOiAiaGVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogdG9rZW5bImRhdGEiXX0KICAgICAgICAgICAgICAgICAgICB5aWVsZCB7InR5cGUiOiAiRW1wdHlUYWciLCAibmFtZSI6ICJtZXRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiB7KE5vbmUsICJjaGFyc2V0Iik6IHNlbGYuZW5jb2Rpbmd9fQogICAgICAgICAgICAgICAgICAgIHlpZWxkIHsidHlwZSI6ICJFbmRUYWciLCAibmFtZSI6ICJoZWFkIn0KICAgICAgICAgICAgICAgICAgICBtZXRhX2ZvdW5kID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkVuZFRhZyI6CiAgICAgICAgICAgICAgICBpZiB0b2tlblsibmFtZSJdLmxvd2VyKCkgPT0gImhlYWQiIGFuZCBwZW5kaW5nOgogICAgICAgICAgICAgICAgICAgICMgaW5zZXJ0IG1ldGEgaW50byBoZWFkIChpZiBuZWNlc3NhcnkpIGFuZCBmbHVzaCBwZW5kaW5nIHF1ZXVlCiAgICAgICAgICAgICAgICAgICAgeWllbGQgcGVuZGluZy5wb3AoMCkKICAgICAgICAgICAgICAgICAgICBpZiBub3QgbWV0YV9mb3VuZDoKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgeyJ0eXBlIjogIkVtcHR5VGFnIiwgIm5hbWUiOiAibWV0YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHsoTm9uZSwgImNoYXJzZXQiKTogc2VsZi5lbmNvZGluZ319CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgcGVuZGluZzoKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgcGVuZGluZy5wb3AoMCkKICAgICAgICAgICAgICAgICAgICBtZXRhX2ZvdW5kID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gInBvc3RfaGVhZCIKCiAgICAgICAgICAgIGlmIHN0YXRlID09ICJpbl9oZWFkIjoKICAgICAgICAgICAgICAgIHBlbmRpbmcuYXBwZW5kKHRva2VuKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgeWllbGQgdG9rZW4KUEsDBBQAAAAAAAAAIQB969K1JQ0AACUNAAA0AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvbGludC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHRleHRfdHlwZQoKZnJvbSAuIGltcG9ydCBiYXNlCmZyb20gLi5jb25zdGFudHMgaW1wb3J0IG5hbWVzcGFjZXMsIHZvaWRFbGVtZW50cwoKZnJvbSAuLmNvbnN0YW50cyBpbXBvcnQgc3BhY2VDaGFyYWN0ZXJzCnNwYWNlQ2hhcmFjdGVycyA9ICIiLmpvaW4oc3BhY2VDaGFyYWN0ZXJzKQoKCmNsYXNzIEZpbHRlcihiYXNlLkZpbHRlcik6CiAgICBkZWYgX19pbml0X18oc2VsZiwgc291cmNlLCByZXF1aXJlX21hdGNoaW5nX3RhZ3M9VHJ1ZSk6CiAgICAgICAgc3VwZXIoRmlsdGVyLCBzZWxmKS5fX2luaXRfXyhzb3VyY2UpCiAgICAgICAgc2VsZi5yZXF1aXJlX21hdGNoaW5nX3RhZ3MgPSByZXF1aXJlX21hdGNoaW5nX3RhZ3MKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgb3Blbl9lbGVtZW50cyA9IFtdCiAgICAgICAgZm9yIHRva2VuIGluIGJhc2UuRmlsdGVyLl9faXRlcl9fKHNlbGYpOgogICAgICAgICAgICB0eXBlID0gdG9rZW5bInR5cGUiXQogICAgICAgICAgICBpZiB0eXBlIGluICgiU3RhcnRUYWciLCAiRW1wdHlUYWciKToKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHRva2VuWyJuYW1lc3BhY2UiXQogICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICAgICAgICAgIGFzc2VydCBuYW1lc3BhY2UgaXMgTm9uZSBvciBpc2luc3RhbmNlKG5hbWVzcGFjZSwgdGV4dF90eXBlKQogICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWVzcGFjZSAhPSAiIgogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobmFtZSwgdGV4dF90eXBlKQogICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWUgIT0gIiIKICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRva2VuWyJkYXRhIl0sIGRpY3QpCiAgICAgICAgICAgICAgICBpZiAobm90IG5hbWVzcGFjZSBvciBuYW1lc3BhY2UgPT0gbmFtZXNwYWNlc1siaHRtbCJdKSBhbmQgbmFtZSBpbiB2b2lkRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHR5cGUgPT0gIkVtcHR5VGFnIgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgdHlwZSA9PSAiU3RhcnRUYWciCiAgICAgICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyIgYW5kIHNlbGYucmVxdWlyZV9tYXRjaGluZ190YWdzOgogICAgICAgICAgICAgICAgICAgIG9wZW5fZWxlbWVudHMuYXBwZW5kKChuYW1lc3BhY2UsIG5hbWUpKQogICAgICAgICAgICAgICAgZm9yIChuYW1lc3BhY2UsIG5hbWUpLCB2YWx1ZSBpbiB0b2tlblsiZGF0YSJdLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWVzcGFjZSBpcyBOb25lIG9yIGlzaW5zdGFuY2UobmFtZXNwYWNlLCB0ZXh0X3R5cGUpCiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWVzcGFjZSAhPSAiIgogICAgICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG5hbWUsIHRleHRfdHlwZSkKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbmFtZSAhPSAiIgogICAgICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHZhbHVlLCB0ZXh0X3R5cGUpCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkVuZFRhZyI6CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSB0b2tlblsibmFtZXNwYWNlIl0KICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgICAgICAgICBhc3NlcnQgbmFtZXNwYWNlIGlzIE5vbmUgb3IgaXNpbnN0YW5jZShuYW1lc3BhY2UsIHRleHRfdHlwZSkKICAgICAgICAgICAgICAgIGFzc2VydCBuYW1lc3BhY2UgIT0gIiIKICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG5hbWUsIHRleHRfdHlwZSkKICAgICAgICAgICAgICAgIGFzc2VydCBuYW1lICE9ICIiCiAgICAgICAgICAgICAgICBpZiAobm90IG5hbWVzcGFjZSBvciBuYW1lc3BhY2UgPT0gbmFtZXNwYWNlc1siaHRtbCJdKSBhbmQgbmFtZSBpbiB2b2lkRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IEZhbHNlLCAiVm9pZCBlbGVtZW50IHJlcG9ydGVkIGFzIEVuZFRhZyB0b2tlbjogJSh0YWcpcyIgJSB7InRhZyI6IG5hbWV9CiAgICAgICAgICAgICAgICBlbGlmIHNlbGYucmVxdWlyZV9tYXRjaGluZ190YWdzOgogICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gb3Blbl9lbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgICAgIGFzc2VydCBzdGFydCA9PSAobmFtZXNwYWNlLCBuYW1lKQoKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJDb21tZW50IjoKICAgICAgICAgICAgICAgIGRhdGEgPSB0b2tlblsiZGF0YSJdCiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkYXRhLCB0ZXh0X3R5cGUpCgogICAgICAgICAgICBlbGlmIHR5cGUgaW4gKCJDaGFyYWN0ZXJzIiwgIlNwYWNlQ2hhcmFjdGVycyIpOgogICAgICAgICAgICAgICAgZGF0YSA9IHRva2VuWyJkYXRhIl0KICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGRhdGEsIHRleHRfdHlwZSkKICAgICAgICAgICAgICAgIGFzc2VydCBkYXRhICE9ICIiCiAgICAgICAgICAgICAgICBpZiB0eXBlID09ICJTcGFjZUNoYXJhY3RlcnMiOgogICAgICAgICAgICAgICAgICAgIGFzc2VydCBkYXRhLnN0cmlwKHNwYWNlQ2hhcmFjdGVycykgPT0gIiIKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiRG9jdHlwZSI6CiAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWUgaXMgTm9uZSBvciBpc2luc3RhbmNlKG5hbWUsIHRleHRfdHlwZSkKICAgICAgICAgICAgICAgIGFzc2VydCB0b2tlblsicHVibGljSWQiXSBpcyBOb25lIG9yIGlzaW5zdGFuY2UobmFtZSwgdGV4dF90eXBlKQogICAgICAgICAgICAgICAgYXNzZXJ0IHRva2VuWyJzeXN0ZW1JZCJdIGlzIE5vbmUgb3IgaXNpbnN0YW5jZShuYW1lLCB0ZXh0X3R5cGUpCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkVudGl0eSI6CiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0b2tlblsibmFtZSJdLCB0ZXh0X3R5cGUpCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIlNlcmlhbGl6ZXJFcnJvciI6CiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0b2tlblsiZGF0YSJdLCB0ZXh0X3R5cGUpCgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXNzZXJ0IEZhbHNlLCAiVW5rbm93biB0b2tlbiB0eXBlOiAlKHR5cGUpcyIgJSB7InR5cGUiOiB0eXBlfQoKICAgICAgICAgICAgeWllbGQgdG9rZW4KUEsDBBQAAAAAAAAAIQAh7Z0kJikAACYpAAA8AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvb3B0aW9uYWx0YWdzLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIC4gaW1wb3J0IGJhc2UKCgpjbGFzcyBGaWx0ZXIoYmFzZS5GaWx0ZXIpOgogICAgZGVmIHNsaWRlcihzZWxmKToKICAgICAgICBwcmV2aW91czEgPSBwcmV2aW91czIgPSBOb25lCiAgICAgICAgZm9yIHRva2VuIGluIHNlbGYuc291cmNlOgogICAgICAgICAgICBpZiBwcmV2aW91czEgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICB5aWVsZCBwcmV2aW91czIsIHByZXZpb3VzMSwgdG9rZW4KICAgICAgICAgICAgcHJldmlvdXMyID0gcHJldmlvdXMxCiAgICAgICAgICAgIHByZXZpb3VzMSA9IHRva2VuCiAgICAgICAgaWYgcHJldmlvdXMxIGlzIG5vdCBOb25lOgogICAgICAgICAgICB5aWVsZCBwcmV2aW91czIsIHByZXZpb3VzMSwgTm9uZQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBmb3IgcHJldmlvdXMsIHRva2VuLCBuZXh0IGluIHNlbGYuc2xpZGVyKCk6CiAgICAgICAgICAgIHR5cGUgPSB0b2tlblsidHlwZSJdCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgIGlmICh0b2tlblsiZGF0YSJdIG9yCiAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBzZWxmLmlzX29wdGlvbmFsX3N0YXJ0KHRva2VuWyJuYW1lIl0sIHByZXZpb3VzLCBuZXh0KSk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgdG9rZW4KICAgICAgICAgICAgZWxpZiB0eXBlID09ICJFbmRUYWciOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfb3B0aW9uYWxfZW5kKHRva2VuWyJuYW1lIl0sIG5leHQpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbgoKICAgIGRlZiBpc19vcHRpb25hbF9zdGFydChzZWxmLCB0YWduYW1lLCBwcmV2aW91cywgbmV4dCk6CiAgICAgICAgdHlwZSA9IG5leHQgYW5kIG5leHRbInR5cGUiXSBvciBOb25lCiAgICAgICAgaWYgdGFnbmFtZSBpbiAnaHRtbCc6CiAgICAgICAgICAgICMgQW4gaHRtbCBlbGVtZW50J3Mgc3RhcnQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBmaXJzdCB0aGluZwogICAgICAgICAgICAjIGluc2lkZSB0aGUgaHRtbCBlbGVtZW50IGlzIG5vdCBhIHNwYWNlIGNoYXJhY3RlciBvciBhIGNvbW1lbnQuCiAgICAgICAgICAgIHJldHVybiB0eXBlIG5vdCBpbiAoIkNvbW1lbnQiLCAiU3BhY2VDaGFyYWN0ZXJzIikKICAgICAgICBlbGlmIHRhZ25hbWUgPT0gJ2hlYWQnOgogICAgICAgICAgICAjIEEgaGVhZCBlbGVtZW50J3Mgc3RhcnQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBmaXJzdCB0aGluZwogICAgICAgICAgICAjIGluc2lkZSB0aGUgaGVhZCBlbGVtZW50IGlzIGFuIGVsZW1lbnQuCiAgICAgICAgICAgICMgWFhYOiB3ZSBhbHNvIG9taXQgdGhlIHN0YXJ0IHRhZyBpZiB0aGUgaGVhZCBlbGVtZW50IGlzIGVtcHR5CiAgICAgICAgICAgIGlmIHR5cGUgaW4gKCJTdGFydFRhZyIsICJFbXB0eVRhZyIpOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJFbmRUYWciOgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSA9PSAiaGVhZCIKICAgICAgICBlbGlmIHRhZ25hbWUgPT0gJ2JvZHknOgogICAgICAgICAgICAjIEEgYm9keSBlbGVtZW50J3Mgc3RhcnQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBmaXJzdCB0aGluZwogICAgICAgICAgICAjIGluc2lkZSB0aGUgYm9keSBlbGVtZW50IGlzIG5vdCBhIHNwYWNlIGNoYXJhY3RlciBvciBhIGNvbW1lbnQsCiAgICAgICAgICAgICMgZXhjZXB0IGlmIHRoZSBmaXJzdCB0aGluZyBpbnNpZGUgdGhlIGJvZHkgZWxlbWVudCBpcyBhIHNjcmlwdAogICAgICAgICAgICAjIG9yIHN0eWxlIGVsZW1lbnQgYW5kIHRoZSBub2RlIGltbWVkaWF0ZWx5IHByZWNlZGluZyB0aGUgYm9keQogICAgICAgICAgICAjIGVsZW1lbnQgaXMgYSBoZWFkIGVsZW1lbnQgd2hvc2UgZW5kIHRhZyBoYXMgYmVlbiBvbWl0dGVkLgogICAgICAgICAgICBpZiB0eXBlIGluICgiQ29tbWVudCIsICJTcGFjZUNoYXJhY3RlcnMiKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgICMgWFhYOiB3ZSBkbyBub3QgbG9vayBhdCB0aGUgcHJlY2VkaW5nIGV2ZW50LCBzbyB3ZSBuZXZlciBvbWl0CiAgICAgICAgICAgICAgICAjIHRoZSBib2R5IGVsZW1lbnQncyBzdGFydCB0YWcgaWYgaXQncyBmb2xsb3dlZCBieSBhIHNjcmlwdCBvcgogICAgICAgICAgICAgICAgIyBhIHN0eWxlIGVsZW1lbnQuCiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdIG5vdCBpbiAoJ3NjcmlwdCcsICdzdHlsZScpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGVsaWYgdGFnbmFtZSA9PSAnY29sZ3JvdXAnOgogICAgICAgICAgICAjIEEgY29sZ3JvdXAgZWxlbWVudCdzIHN0YXJ0IHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgZmlyc3QgdGhpbmcKICAgICAgICAgICAgIyBpbnNpZGUgdGhlIGNvbGdyb3VwIGVsZW1lbnQgaXMgYSBjb2wgZWxlbWVudCwgYW5kIGlmIHRoZSBlbGVtZW50CiAgICAgICAgICAgICMgaXMgbm90IGltbWVkaWF0ZWx5IHByZWNlZGVkIGJ5IGFub3RoZXIgY29sZ3JvdXAgZWxlbWVudCB3aG9zZQogICAgICAgICAgICAjIGVuZCB0YWcgaGFzIGJlZW4gb21pdHRlZC4KICAgICAgICAgICAgaWYgdHlwZSBpbiAoIlN0YXJ0VGFnIiwgIkVtcHR5VGFnIik6CiAgICAgICAgICAgICAgICAjIFhYWDogd2UgZG8gbm90IGxvb2sgYXQgdGhlIHByZWNlZGluZyBldmVudCwgc28gaW5zdGVhZCB3ZSBuZXZlcgogICAgICAgICAgICAgICAgIyBvbWl0IHRoZSBjb2xncm91cCBlbGVtZW50J3MgZW5kIHRhZyB3aGVuIGl0IGlzIGltbWVkaWF0ZWx5CiAgICAgICAgICAgICAgICAjIGZvbGxvd2VkIGJ5IGFub3RoZXIgY29sZ3JvdXAgZWxlbWVudC4gU2VlIGlzX29wdGlvbmFsX2VuZC4KICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gPT0gImNvbCIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsaWYgdGFnbmFtZSA9PSAndGJvZHknOgogICAgICAgICAgICAjIEEgdGJvZHkgZWxlbWVudCdzIHN0YXJ0IHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgZmlyc3QgdGhpbmcKICAgICAgICAgICAgIyBpbnNpZGUgdGhlIHRib2R5IGVsZW1lbnQgaXMgYSB0ciBlbGVtZW50LCBhbmQgaWYgdGhlIGVsZW1lbnQgaXMKICAgICAgICAgICAgIyBub3QgaW1tZWRpYXRlbHkgcHJlY2VkZWQgYnkgYSB0Ym9keSwgdGhlYWQsIG9yIHRmb290IGVsZW1lbnQKICAgICAgICAgICAgIyB3aG9zZSBlbmQgdGFnIGhhcyBiZWVuIG9taXR0ZWQuCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgICMgb21pdCB0aGUgdGhlYWQgYW5kIHRmb290IGVsZW1lbnRzJyBlbmQgdGFnIHdoZW4gdGhleSBhcmUKICAgICAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSB0Ym9keSBlbGVtZW50LiBTZWUgaXNfb3B0aW9uYWxfZW5kLgogICAgICAgICAgICAgICAgaWYgcHJldmlvdXMgYW5kIHByZXZpb3VzWyd0eXBlJ10gPT0gJ0VuZFRhZycgYW5kIFwKICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNbJ25hbWUnXSBpbiAoJ3Rib2R5JywgJ3RoZWFkJywgJ3Rmb290Jyk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdID09ICd0cicKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBpc19vcHRpb25hbF9lbmQoc2VsZiwgdGFnbmFtZSwgbmV4dCk6CiAgICAgICAgdHlwZSA9IG5leHQgYW5kIG5leHRbInR5cGUiXSBvciBOb25lCiAgICAgICAgaWYgdGFnbmFtZSBpbiAoJ2h0bWwnLCAnaGVhZCcsICdib2R5Jyk6CiAgICAgICAgICAgICMgQW4gaHRtbCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgaHRtbCBlbGVtZW50CiAgICAgICAgICAgICMgaXMgbm90IGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgc3BhY2UgY2hhcmFjdGVyIG9yIGEgY29tbWVudC4KICAgICAgICAgICAgcmV0dXJuIHR5cGUgbm90IGluICgiQ29tbWVudCIsICJTcGFjZUNoYXJhY3RlcnMiKQogICAgICAgIGVsaWYgdGFnbmFtZSBpbiAoJ2xpJywgJ29wdGdyb3VwJywgJ3RyJyk6CiAgICAgICAgICAgICMgQSBsaSBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgbGkgZWxlbWVudCBpcwogICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFub3RoZXIgbGkgZWxlbWVudCBvciBpZiB0aGVyZSBpcwogICAgICAgICAgICAjIG5vIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgICMgQW4gb3B0Z3JvdXAgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIG9wdGdyb3VwCiAgICAgICAgICAgICMgZWxlbWVudCBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhbm90aGVyIG9wdGdyb3VwIGVsZW1lbnQsCiAgICAgICAgICAgICMgb3IgaWYgdGhlcmUgaXMgbm8gbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgICAgIyBBIHRyIGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSB0ciBlbGVtZW50IGlzCiAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW5vdGhlciB0ciBlbGVtZW50LCBvciBpZiB0aGVyZSBpcwogICAgICAgICAgICAjIG5vIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gPT0gdGFnbmFtZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gIkVuZFRhZyIgb3IgdHlwZSBpcyBOb25lCiAgICAgICAgZWxpZiB0YWduYW1lIGluICgnZHQnLCAnZGQnKToKICAgICAgICAgICAgIyBBIGR0IGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBkdCBlbGVtZW50IGlzCiAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW5vdGhlciBkdCBlbGVtZW50IG9yIGEgZGQgZWxlbWVudC4KICAgICAgICAgICAgIyBBIGRkIGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBkZCBlbGVtZW50IGlzCiAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW5vdGhlciBkZCBlbGVtZW50IG9yIGEgZHQgZWxlbWVudCwKICAgICAgICAgICAgIyBvciBpZiB0aGVyZSBpcyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdIGluICgnZHQnLCAnZGQnKQogICAgICAgICAgICBlbGlmIHRhZ25hbWUgPT0gJ2RkJzoKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlID09ICJFbmRUYWciIG9yIHR5cGUgaXMgTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZWxpZiB0YWduYW1lID09ICdwJzoKICAgICAgICAgICAgIyBBIHAgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIHAgZWxlbWVudCBpcwogICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFuIGFkZHJlc3MsIGFydGljbGUsIGFzaWRlLAogICAgICAgICAgICAjIGJsb2NrcXVvdGUsIGRhdGFncmlkLCBkaWFsb2csIGRpciwgZGl2LCBkbCwgZmllbGRzZXQsCiAgICAgICAgICAgICMgZm9vdGVyLCBmb3JtLCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LCBoZWFkZXIsIGhyLCBtZW51LAogICAgICAgICAgICAjIG5hdiwgb2wsIHAsIHByZSwgc2VjdGlvbiwgdGFibGUsIG9yIHVsLCBlbGVtZW50LCBvciBpZgogICAgICAgICAgICAjIHRoZXJlIGlzIG5vIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgIGlmIHR5cGUgaW4gKCJTdGFydFRhZyIsICJFbXB0eVRhZyIpOgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSBpbiAoJ2FkZHJlc3MnLCAnYXJ0aWNsZScsICdhc2lkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmxvY2txdW90ZScsICdkYXRhZ3JpZCcsICdkaWFsb2cnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RpcicsICdkaXYnLCAnZGwnLCAnZmllbGRzZXQnLCAnZm9vdGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb3JtJywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZWFkZXInLCAnaHInLCAnbWVudScsICduYXYnLCAnb2wnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnLCAncHJlJywgJ3NlY3Rpb24nLCAndGFibGUnLCAndWwnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gIkVuZFRhZyIgb3IgdHlwZSBpcyBOb25lCiAgICAgICAgZWxpZiB0YWduYW1lID09ICdvcHRpb24nOgogICAgICAgICAgICAjIEFuIG9wdGlvbiBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgb3B0aW9uCiAgICAgICAgICAgICMgZWxlbWVudCBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhbm90aGVyIG9wdGlvbiBlbGVtZW50LAogICAgICAgICAgICAjIG9yIGlmIGl0IGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFuIDxjb2RlPm9wdGdyb3VwPC9jb2RlPgogICAgICAgICAgICAjIGVsZW1lbnQsIG9yIGlmIHRoZXJlIGlzIG5vIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50CiAgICAgICAgICAgICMgZWxlbWVudC4KICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3RhcnRUYWciOgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSBpbiAoJ29wdGlvbicsICdvcHRncm91cCcpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSAiRW5kVGFnIiBvciB0eXBlIGlzIE5vbmUKICAgICAgICBlbGlmIHRhZ25hbWUgaW4gKCdydCcsICdycCcpOgogICAgICAgICAgICAjIEFuIHJ0IGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBydCBlbGVtZW50IGlzCiAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW4gcnQgb3IgcnAgZWxlbWVudCwgb3IgaWYgdGhlcmUgaXMKICAgICAgICAgICAgIyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICAjIEFuIHJwIGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBycCBlbGVtZW50IGlzCiAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW4gcnQgb3IgcnAgZWxlbWVudCwgb3IgaWYgdGhlcmUgaXMKICAgICAgICAgICAgIyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdIGluICgncnQnLCAncnAnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gIkVuZFRhZyIgb3IgdHlwZSBpcyBOb25lCiAgICAgICAgZWxpZiB0YWduYW1lID09ICdjb2xncm91cCc6CiAgICAgICAgICAgICMgQSBjb2xncm91cCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgY29sZ3JvdXAKICAgICAgICAgICAgIyBlbGVtZW50IGlzIG5vdCBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHNwYWNlIGNoYXJhY3RlciBvcgogICAgICAgICAgICAjIGEgY29tbWVudC4KICAgICAgICAgICAgaWYgdHlwZSBpbiAoIkNvbW1lbnQiLCAiU3BhY2VDaGFyYWN0ZXJzIik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICAjIFhYWDogd2UgYWxzbyBsb29rIGZvciBhbiBpbW1lZGlhdGVseSBmb2xsb3dpbmcgY29sZ3JvdXAKICAgICAgICAgICAgICAgICMgZWxlbWVudC4gU2VlIGlzX29wdGlvbmFsX3N0YXJ0LgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSAhPSAnY29sZ3JvdXAnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGVsaWYgdGFnbmFtZSBpbiAoJ3RoZWFkJywgJ3Rib2R5Jyk6CiAgICAgICAgICAgICMgQSB0aGVhZCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgdGhlYWQgZWxlbWVudAogICAgICAgICAgICAjIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgdGJvZHkgb3IgdGZvb3QgZWxlbWVudC4KICAgICAgICAgICAgIyBBIHRib2R5IGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSB0Ym9keSBlbGVtZW50CiAgICAgICAgICAgICMgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSB0Ym9keSBvciB0Zm9vdCBlbGVtZW50LCBvciBpZgogICAgICAgICAgICAjIHRoZXJlIGlzIG5vIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgICMgQSB0Zm9vdCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgdGZvb3QgZWxlbWVudAogICAgICAgICAgICAjIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgdGJvZHkgZWxlbWVudCwgb3IgaWYgdGhlcmUgaXMgbm8KICAgICAgICAgICAgIyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICAjIFhYWDogd2UgbmV2ZXIgb21pdCB0aGUgZW5kIHRhZyB3aGVuIHRoZSBmb2xsb3dpbmcgZWxlbWVudCBpcwogICAgICAgICAgICAjIGEgdGJvZHkuIFNlZSBpc19vcHRpb25hbF9zdGFydC4KICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3RhcnRUYWciOgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSBpbiBbJ3Rib2R5JywgJ3Rmb290J10KICAgICAgICAgICAgZWxpZiB0YWduYW1lID09ICd0Ym9keSc6CiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSAiRW5kVGFnIiBvciB0eXBlIGlzIE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsaWYgdGFnbmFtZSA9PSAndGZvb3QnOgogICAgICAgICAgICAjIEEgdGZvb3QgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIHRmb290IGVsZW1lbnQKICAgICAgICAgICAgIyBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHRib2R5IGVsZW1lbnQsIG9yIGlmIHRoZXJlIGlzIG5vCiAgICAgICAgICAgICMgbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgICAgIyBYWFg6IHdlIG5ldmVyIG9taXQgdGhlIGVuZCB0YWcgd2hlbiB0aGUgZm9sbG93aW5nIGVsZW1lbnQgaXMKICAgICAgICAgICAgIyBhIHRib2R5LiBTZWUgaXNfb3B0aW9uYWxfc3RhcnQuCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gPT0gJ3Rib2R5JwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gIkVuZFRhZyIgb3IgdHlwZSBpcyBOb25lCiAgICAgICAgZWxpZiB0YWduYW1lIGluICgndGQnLCAndGgnKToKICAgICAgICAgICAgIyBBIHRkIGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSB0ZCBlbGVtZW50IGlzCiAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSB0ZCBvciB0aCBlbGVtZW50LCBvciBpZiB0aGVyZSBpcwogICAgICAgICAgICAjIG5vIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgICMgQSB0aCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgdGggZWxlbWVudCBpcwogICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgdGQgb3IgdGggZWxlbWVudCwgb3IgaWYgdGhlcmUgaXMKICAgICAgICAgICAgIyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdIGluICgndGQnLCAndGgnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gIkVuZFRhZyIgb3IgdHlwZSBpcyBOb25lCiAgICAgICAgcmV0dXJuIEZhbHNlClBLAwQUAAAAAAAAACEAmh5UmBhiAAAYYgAAOQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL3Nhbml0aXplci5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IHJlCmZyb20geG1sLnNheC5zYXh1dGlscyBpbXBvcnQgZXNjYXBlLCB1bmVzY2FwZQoKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMgaW1wb3J0IHVybGxpYl9wYXJzZSBhcyB1cmxwYXJzZQoKZnJvbSAuIGltcG9ydCBiYXNlCmZyb20gLi5jb25zdGFudHMgaW1wb3J0IG5hbWVzcGFjZXMsIHByZWZpeGVzCgpfX2FsbF9fID0gWyJGaWx0ZXIiXQoKCmFsbG93ZWRfZWxlbWVudHMgPSBmcm96ZW5zZXQoKAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2EnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdhYmJyJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYWNyb255bScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2FkZHJlc3MnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdhcmVhJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYXJ0aWNsZScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2FzaWRlJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYXVkaW8nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdiJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYmlnJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYmxvY2txdW90ZScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2JyJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYnV0dG9uJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnY2FudmFzJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnY2FwdGlvbicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2NlbnRlcicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2NpdGUnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdjb2RlJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnY29sJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnY29sZ3JvdXAnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdjb21tYW5kJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZGF0YWdyaWQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkYXRhbGlzdCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2RkJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZGVsJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZGV0YWlscycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2RmbicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2RpYWxvZycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2RpcicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2RpdicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2RsJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZHQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdlbScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2V2ZW50LXNvdXJjZScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2ZpZWxkc2V0JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZmlnY2FwdGlvbicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2ZpZ3VyZScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2Zvb3RlcicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2ZvbnQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdmb3JtJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnaGVhZGVyJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnaDEnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdoMicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2gzJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnaDQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdoNScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2g2JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnaHInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdpJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnaW1nJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnaW5wdXQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdpbnMnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdrZXlnZW4nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdrYmQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdsYWJlbCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2xlZ2VuZCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2xpJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnbScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ21hcCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ21lbnUnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdtZXRlcicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ211bHRpY29sJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnbmF2JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnbmV4dGlkJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnb2wnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdvdXRwdXQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdvcHRncm91cCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ29wdGlvbicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3AnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdwcmUnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdwcm9ncmVzcycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3EnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc2FtcCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3NlY3Rpb24nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzZWxlY3QnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzbWFsbCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3NvdW5kJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc291cmNlJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc3BhY2VyJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc3BhbicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3N0cmlrZScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3N0cm9uZycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3N1YicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3N1cCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3RhYmxlJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndGJvZHknKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd0ZCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3RleHRhcmVhJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndGltZScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3Rmb290JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndGgnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd0aGVhZCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3RyJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndHQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd1JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndWwnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd2YXInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd2aWRlbycpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbWFjdGlvbicpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbWF0aCcpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbWVycm9yJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtZnJhYycpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbWknKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21tdWx0aXNjcmlwdHMnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21uJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtbycpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbW92ZXInKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21wYWRkZWQnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21waGFudG9tJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtcHJlc2NyaXB0cycpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXJvb3QnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21yb3cnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21zcGFjZScpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXNxcnQnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21zdHlsZScpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXN1YicpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXN1YnN1cCcpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXN1cCcpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXRhYmxlJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtdGQnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ210ZXh0JyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtdHInKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ211bmRlcicpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXVuZGVyb3ZlcicpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbm9uZScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnYScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnYW5pbWF0ZScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnYW5pbWF0ZUNvbG9yJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdhbmltYXRlTW90aW9uJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdhbmltYXRlVHJhbnNmb3JtJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdjbGlwUGF0aCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnY2lyY2xlJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdkZWZzJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdkZXNjJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdlbGxpcHNlJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdmb250LWZhY2UnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2ZvbnQtZmFjZS1uYW1lJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdmb250LWZhY2Utc3JjJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdnJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdnbHlwaCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnaGtlcm4nKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2xpbmVhckdyYWRpZW50JyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdsaW5lJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdtYXJrZXInKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ21ldGFkYXRhJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdtaXNzaW5nLWdseXBoJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdtcGF0aCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAncGF0aCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAncG9seWdvbicpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAncG9seWxpbmUnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3JhZGlhbEdyYWRpZW50JyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdyZWN0JyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdzZXQnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3N0b3AnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3N2ZycpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnc3dpdGNoJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICd0ZXh0JyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICd0aXRsZScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAndHNwYW4nKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3VzZScpLAopKQoKYWxsb3dlZF9hdHRyaWJ1dGVzID0gZnJvemVuc2V0KCgKICAgICMgSFRNTCBhdHRyaWJ1dGVzCiAgICAoTm9uZSwgJ2FiYnInKSwKICAgIChOb25lLCAnYWNjZXB0JyksCiAgICAoTm9uZSwgJ2FjY2VwdC1jaGFyc2V0JyksCiAgICAoTm9uZSwgJ2FjY2Vzc2tleScpLAogICAgKE5vbmUsICdhY3Rpb24nKSwKICAgIChOb25lLCAnYWxpZ24nKSwKICAgIChOb25lLCAnYWx0JyksCiAgICAoTm9uZSwgJ2F1dG9jb21wbGV0ZScpLAogICAgKE5vbmUsICdhdXRvZm9jdXMnKSwKICAgIChOb25lLCAnYXhpcycpLAogICAgKE5vbmUsICdiYWNrZ3JvdW5kJyksCiAgICAoTm9uZSwgJ2JhbGFuY2UnKSwKICAgIChOb25lLCAnYmdjb2xvcicpLAogICAgKE5vbmUsICdiZ3Byb3BlcnRpZXMnKSwKICAgIChOb25lLCAnYm9yZGVyJyksCiAgICAoTm9uZSwgJ2JvcmRlcmNvbG9yJyksCiAgICAoTm9uZSwgJ2JvcmRlcmNvbG9yZGFyaycpLAogICAgKE5vbmUsICdib3JkZXJjb2xvcmxpZ2h0JyksCiAgICAoTm9uZSwgJ2JvdHRvbXBhZGRpbmcnKSwKICAgIChOb25lLCAnY2VsbHBhZGRpbmcnKSwKICAgIChOb25lLCAnY2VsbHNwYWNpbmcnKSwKICAgIChOb25lLCAnY2gnKSwKICAgIChOb25lLCAnY2hhbGxlbmdlJyksCiAgICAoTm9uZSwgJ2NoYXInKSwKICAgIChOb25lLCAnY2hhcm9mZicpLAogICAgKE5vbmUsICdjaG9mZicpLAogICAgKE5vbmUsICdjaGFyc2V0JyksCiAgICAoTm9uZSwgJ2NoZWNrZWQnKSwKICAgIChOb25lLCAnY2l0ZScpLAogICAgKE5vbmUsICdjbGFzcycpLAogICAgKE5vbmUsICdjbGVhcicpLAogICAgKE5vbmUsICdjb2xvcicpLAogICAgKE5vbmUsICdjb2xzJyksCiAgICAoTm9uZSwgJ2NvbHNwYW4nKSwKICAgIChOb25lLCAnY29tcGFjdCcpLAogICAgKE5vbmUsICdjb250ZW50ZWRpdGFibGUnKSwKICAgIChOb25lLCAnY29udHJvbHMnKSwKICAgIChOb25lLCAnY29vcmRzJyksCiAgICAoTm9uZSwgJ2RhdGEnKSwKICAgIChOb25lLCAnZGF0YWZsZCcpLAogICAgKE5vbmUsICdkYXRhcGFnZXNpemUnKSwKICAgIChOb25lLCAnZGF0YXNyYycpLAogICAgKE5vbmUsICdkYXRldGltZScpLAogICAgKE5vbmUsICdkZWZhdWx0JyksCiAgICAoTm9uZSwgJ2RlbGF5JyksCiAgICAoTm9uZSwgJ2RpcicpLAogICAgKE5vbmUsICdkaXNhYmxlZCcpLAogICAgKE5vbmUsICdkcmFnZ2FibGUnKSwKICAgIChOb25lLCAnZHluc3JjJyksCiAgICAoTm9uZSwgJ2VuY3R5cGUnKSwKICAgIChOb25lLCAnZW5kJyksCiAgICAoTm9uZSwgJ2ZhY2UnKSwKICAgIChOb25lLCAnZm9yJyksCiAgICAoTm9uZSwgJ2Zvcm0nKSwKICAgIChOb25lLCAnZnJhbWUnKSwKICAgIChOb25lLCAnZ2FsbGVyeWltZycpLAogICAgKE5vbmUsICdndXR0ZXInKSwKICAgIChOb25lLCAnaGVhZGVycycpLAogICAgKE5vbmUsICdoZWlnaHQnKSwKICAgIChOb25lLCAnaGlkZWZvY3VzJyksCiAgICAoTm9uZSwgJ2hpZGRlbicpLAogICAgKE5vbmUsICdoaWdoJyksCiAgICAoTm9uZSwgJ2hyZWYnKSwKICAgIChOb25lLCAnaHJlZmxhbmcnKSwKICAgIChOb25lLCAnaHNwYWNlJyksCiAgICAoTm9uZSwgJ2ljb24nKSwKICAgIChOb25lLCAnaWQnKSwKICAgIChOb25lLCAnaW5wdXRtb2RlJyksCiAgICAoTm9uZSwgJ2lzbWFwJyksCiAgICAoTm9uZSwgJ2tleXR5cGUnKSwKICAgIChOb25lLCAnbGFiZWwnKSwKICAgIChOb25lLCAnbGVmdHNwYWNpbmcnKSwKICAgIChOb25lLCAnbGFuZycpLAogICAgKE5vbmUsICdsaXN0JyksCiAgICAoTm9uZSwgJ2xvbmdkZXNjJyksCiAgICAoTm9uZSwgJ2xvb3AnKSwKICAgIChOb25lLCAnbG9vcGNvdW50JyksCiAgICAoTm9uZSwgJ2xvb3BlbmQnKSwKICAgIChOb25lLCAnbG9vcHN0YXJ0JyksCiAgICAoTm9uZSwgJ2xvdycpLAogICAgKE5vbmUsICdsb3dzcmMnKSwKICAgIChOb25lLCAnbWF4JyksCiAgICAoTm9uZSwgJ21heGxlbmd0aCcpLAogICAgKE5vbmUsICdtZWRpYScpLAogICAgKE5vbmUsICdtZXRob2QnKSwKICAgIChOb25lLCAnbWluJyksCiAgICAoTm9uZSwgJ211bHRpcGxlJyksCiAgICAoTm9uZSwgJ25hbWUnKSwKICAgIChOb25lLCAnbm9ocmVmJyksCiAgICAoTm9uZSwgJ25vc2hhZGUnKSwKICAgIChOb25lLCAnbm93cmFwJyksCiAgICAoTm9uZSwgJ29wZW4nKSwKICAgIChOb25lLCAnb3B0aW11bScpLAogICAgKE5vbmUsICdwYXR0ZXJuJyksCiAgICAoTm9uZSwgJ3BpbmcnKSwKICAgIChOb25lLCAncG9pbnQtc2l6ZScpLAogICAgKE5vbmUsICdwb3N0ZXInKSwKICAgIChOb25lLCAncHFnJyksCiAgICAoTm9uZSwgJ3ByZWxvYWQnKSwKICAgIChOb25lLCAncHJvbXB0JyksCiAgICAoTm9uZSwgJ3JhZGlvZ3JvdXAnKSwKICAgIChOb25lLCAncmVhZG9ubHknKSwKICAgIChOb25lLCAncmVsJyksCiAgICAoTm9uZSwgJ3JlcGVhdC1tYXgnKSwKICAgIChOb25lLCAncmVwZWF0LW1pbicpLAogICAgKE5vbmUsICdyZXBsYWNlJyksCiAgICAoTm9uZSwgJ3JlcXVpcmVkJyksCiAgICAoTm9uZSwgJ3JldicpLAogICAgKE5vbmUsICdyaWdodHNwYWNpbmcnKSwKICAgIChOb25lLCAncm93cycpLAogICAgKE5vbmUsICdyb3dzcGFuJyksCiAgICAoTm9uZSwgJ3J1bGVzJyksCiAgICAoTm9uZSwgJ3Njb3BlJyksCiAgICAoTm9uZSwgJ3NlbGVjdGVkJyksCiAgICAoTm9uZSwgJ3NoYXBlJyksCiAgICAoTm9uZSwgJ3NpemUnKSwKICAgIChOb25lLCAnc3BhbicpLAogICAgKE5vbmUsICdzcmMnKSwKICAgIChOb25lLCAnc3RhcnQnKSwKICAgIChOb25lLCAnc3RlcCcpLAogICAgKE5vbmUsICdzdHlsZScpLAogICAgKE5vbmUsICdzdW1tYXJ5JyksCiAgICAoTm9uZSwgJ3N1cHByZXNzJyksCiAgICAoTm9uZSwgJ3RhYmluZGV4JyksCiAgICAoTm9uZSwgJ3RhcmdldCcpLAogICAgKE5vbmUsICd0ZW1wbGF0ZScpLAogICAgKE5vbmUsICd0aXRsZScpLAogICAgKE5vbmUsICd0b3BwYWRkaW5nJyksCiAgICAoTm9uZSwgJ3R5cGUnKSwKICAgIChOb25lLCAndW5zZWxlY3RhYmxlJyksCiAgICAoTm9uZSwgJ3VzZW1hcCcpLAogICAgKE5vbmUsICd1cm4nKSwKICAgIChOb25lLCAndmFsaWduJyksCiAgICAoTm9uZSwgJ3ZhbHVlJyksCiAgICAoTm9uZSwgJ3ZhcmlhYmxlJyksCiAgICAoTm9uZSwgJ3ZvbHVtZScpLAogICAgKE5vbmUsICd2c3BhY2UnKSwKICAgIChOb25lLCAndnJtbCcpLAogICAgKE5vbmUsICd3aWR0aCcpLAogICAgKE5vbmUsICd3cmFwJyksCiAgICAobmFtZXNwYWNlc1sneG1sJ10sICdsYW5nJyksCiAgICAjIE1hdGhNTCBhdHRyaWJ1dGVzCiAgICAoTm9uZSwgJ2FjdGlvbnR5cGUnKSwKICAgIChOb25lLCAnYWxpZ24nKSwKICAgIChOb25lLCAnY29sdW1uYWxpZ24nKSwKICAgIChOb25lLCAnY29sdW1uYWxpZ24nKSwKICAgIChOb25lLCAnY29sdW1uYWxpZ24nKSwKICAgIChOb25lLCAnY29sdW1ubGluZXMnKSwKICAgIChOb25lLCAnY29sdW1uc3BhY2luZycpLAogICAgKE5vbmUsICdjb2x1bW5zcGFuJyksCiAgICAoTm9uZSwgJ2RlcHRoJyksCiAgICAoTm9uZSwgJ2Rpc3BsYXknKSwKICAgIChOb25lLCAnZGlzcGxheXN0eWxlJyksCiAgICAoTm9uZSwgJ2VxdWFsY29sdW1ucycpLAogICAgKE5vbmUsICdlcXVhbHJvd3MnKSwKICAgIChOb25lLCAnZmVuY2UnKSwKICAgIChOb25lLCAnZm9udHN0eWxlJyksCiAgICAoTm9uZSwgJ2ZvbnR3ZWlnaHQnKSwKICAgIChOb25lLCAnZnJhbWUnKSwKICAgIChOb25lLCAnaGVpZ2h0JyksCiAgICAoTm9uZSwgJ2xpbmV0aGlja25lc3MnKSwKICAgIChOb25lLCAnbHNwYWNlJyksCiAgICAoTm9uZSwgJ21hdGhiYWNrZ3JvdW5kJyksCiAgICAoTm9uZSwgJ21hdGhjb2xvcicpLAogICAgKE5vbmUsICdtYXRodmFyaWFudCcpLAogICAgKE5vbmUsICdtYXRodmFyaWFudCcpLAogICAgKE5vbmUsICdtYXhzaXplJyksCiAgICAoTm9uZSwgJ21pbnNpemUnKSwKICAgIChOb25lLCAnb3RoZXInKSwKICAgIChOb25lLCAncm93YWxpZ24nKSwKICAgIChOb25lLCAncm93YWxpZ24nKSwKICAgIChOb25lLCAncm93YWxpZ24nKSwKICAgIChOb25lLCAncm93bGluZXMnKSwKICAgIChOb25lLCAncm93c3BhY2luZycpLAogICAgKE5vbmUsICdyb3dzcGFuJyksCiAgICAoTm9uZSwgJ3JzcGFjZScpLAogICAgKE5vbmUsICdzY3JpcHRsZXZlbCcpLAogICAgKE5vbmUsICdzZWxlY3Rpb24nKSwKICAgIChOb25lLCAnc2VwYXJhdG9yJyksCiAgICAoTm9uZSwgJ3N0cmV0Y2h5JyksCiAgICAoTm9uZSwgJ3dpZHRoJyksCiAgICAoTm9uZSwgJ3dpZHRoJyksCiAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ2hyZWYnKSwKICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAnc2hvdycpLAogICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICd0eXBlJyksCiAgICAjIFNWRyBhdHRyaWJ1dGVzCiAgICAoTm9uZSwgJ2FjY2VudC1oZWlnaHQnKSwKICAgIChOb25lLCAnYWNjdW11bGF0ZScpLAogICAgKE5vbmUsICdhZGRpdGl2ZScpLAogICAgKE5vbmUsICdhbHBoYWJldGljJyksCiAgICAoTm9uZSwgJ2FyYWJpYy1mb3JtJyksCiAgICAoTm9uZSwgJ2FzY2VudCcpLAogICAgKE5vbmUsICdhdHRyaWJ1dGVOYW1lJyksCiAgICAoTm9uZSwgJ2F0dHJpYnV0ZVR5cGUnKSwKICAgIChOb25lLCAnYmFzZVByb2ZpbGUnKSwKICAgIChOb25lLCAnYmJveCcpLAogICAgKE5vbmUsICdiZWdpbicpLAogICAgKE5vbmUsICdieScpLAogICAgKE5vbmUsICdjYWxjTW9kZScpLAogICAgKE5vbmUsICdjYXAtaGVpZ2h0JyksCiAgICAoTm9uZSwgJ2NsYXNzJyksCiAgICAoTm9uZSwgJ2NsaXAtcGF0aCcpLAogICAgKE5vbmUsICdjb2xvcicpLAogICAgKE5vbmUsICdjb2xvci1yZW5kZXJpbmcnKSwKICAgIChOb25lLCAnY29udGVudCcpLAogICAgKE5vbmUsICdjeCcpLAogICAgKE5vbmUsICdjeScpLAogICAgKE5vbmUsICdkJyksCiAgICAoTm9uZSwgJ2R4JyksCiAgICAoTm9uZSwgJ2R5JyksCiAgICAoTm9uZSwgJ2Rlc2NlbnQnKSwKICAgIChOb25lLCAnZGlzcGxheScpLAogICAgKE5vbmUsICdkdXInKSwKICAgIChOb25lLCAnZW5kJyksCiAgICAoTm9uZSwgJ2ZpbGwnKSwKICAgIChOb25lLCAnZmlsbC1vcGFjaXR5JyksCiAgICAoTm9uZSwgJ2ZpbGwtcnVsZScpLAogICAgKE5vbmUsICdmb250LWZhbWlseScpLAogICAgKE5vbmUsICdmb250LXNpemUnKSwKICAgIChOb25lLCAnZm9udC1zdHJldGNoJyksCiAgICAoTm9uZSwgJ2ZvbnQtc3R5bGUnKSwKICAgIChOb25lLCAnZm9udC12YXJpYW50JyksCiAgICAoTm9uZSwgJ2ZvbnQtd2VpZ2h0JyksCiAgICAoTm9uZSwgJ2Zyb20nKSwKICAgIChOb25lLCAnZngnKSwKICAgIChOb25lLCAnZnknKSwKICAgIChOb25lLCAnZzEnKSwKICAgIChOb25lLCAnZzInKSwKICAgIChOb25lLCAnZ2x5cGgtbmFtZScpLAogICAgKE5vbmUsICdncmFkaWVudFVuaXRzJyksCiAgICAoTm9uZSwgJ2hhbmdpbmcnKSwKICAgIChOb25lLCAnaGVpZ2h0JyksCiAgICAoTm9uZSwgJ2hvcml6LWFkdi14JyksCiAgICAoTm9uZSwgJ2hvcml6LW9yaWdpbi14JyksCiAgICAoTm9uZSwgJ2lkJyksCiAgICAoTm9uZSwgJ2lkZW9ncmFwaGljJyksCiAgICAoTm9uZSwgJ2snKSwKICAgIChOb25lLCAna2V5UG9pbnRzJyksCiAgICAoTm9uZSwgJ2tleVNwbGluZXMnKSwKICAgIChOb25lLCAna2V5VGltZXMnKSwKICAgIChOb25lLCAnbGFuZycpLAogICAgKE5vbmUsICdtYXJrZXItZW5kJyksCiAgICAoTm9uZSwgJ21hcmtlci1taWQnKSwKICAgIChOb25lLCAnbWFya2VyLXN0YXJ0JyksCiAgICAoTm9uZSwgJ21hcmtlckhlaWdodCcpLAogICAgKE5vbmUsICdtYXJrZXJVbml0cycpLAogICAgKE5vbmUsICdtYXJrZXJXaWR0aCcpLAogICAgKE5vbmUsICdtYXRoZW1hdGljYWwnKSwKICAgIChOb25lLCAnbWF4JyksCiAgICAoTm9uZSwgJ21pbicpLAogICAgKE5vbmUsICduYW1lJyksCiAgICAoTm9uZSwgJ29mZnNldCcpLAogICAgKE5vbmUsICdvcGFjaXR5JyksCiAgICAoTm9uZSwgJ29yaWVudCcpLAogICAgKE5vbmUsICdvcmlnaW4nKSwKICAgIChOb25lLCAnb3ZlcmxpbmUtcG9zaXRpb24nKSwKICAgIChOb25lLCAnb3ZlcmxpbmUtdGhpY2tuZXNzJyksCiAgICAoTm9uZSwgJ3Bhbm9zZS0xJyksCiAgICAoTm9uZSwgJ3BhdGgnKSwKICAgIChOb25lLCAncGF0aExlbmd0aCcpLAogICAgKE5vbmUsICdwb2ludHMnKSwKICAgIChOb25lLCAncHJlc2VydmVBc3BlY3RSYXRpbycpLAogICAgKE5vbmUsICdyJyksCiAgICAoTm9uZSwgJ3JlZlgnKSwKICAgIChOb25lLCAncmVmWScpLAogICAgKE5vbmUsICdyZXBlYXRDb3VudCcpLAogICAgKE5vbmUsICdyZXBlYXREdXInKSwKICAgIChOb25lLCAncmVxdWlyZWRFeHRlbnNpb25zJyksCiAgICAoTm9uZSwgJ3JlcXVpcmVkRmVhdHVyZXMnKSwKICAgIChOb25lLCAncmVzdGFydCcpLAogICAgKE5vbmUsICdyb3RhdGUnKSwKICAgIChOb25lLCAncngnKSwKICAgIChOb25lLCAncnknKSwKICAgIChOb25lLCAnc2xvcGUnKSwKICAgIChOb25lLCAnc3RlbWgnKSwKICAgIChOb25lLCAnc3RlbXYnKSwKICAgIChOb25lLCAnc3RvcC1jb2xvcicpLAogICAgKE5vbmUsICdzdG9wLW9wYWNpdHknKSwKICAgIChOb25lLCAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbicpLAogICAgKE5vbmUsICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcycpLAogICAgKE5vbmUsICdzdHJva2UnKSwKICAgIChOb25lLCAnc3Ryb2tlLWRhc2hhcnJheScpLAogICAgKE5vbmUsICdzdHJva2UtZGFzaG9mZnNldCcpLAogICAgKE5vbmUsICdzdHJva2UtbGluZWNhcCcpLAogICAgKE5vbmUsICdzdHJva2UtbGluZWpvaW4nKSwKICAgIChOb25lLCAnc3Ryb2tlLW1pdGVybGltaXQnKSwKICAgIChOb25lLCAnc3Ryb2tlLW9wYWNpdHknKSwKICAgIChOb25lLCAnc3Ryb2tlLXdpZHRoJyksCiAgICAoTm9uZSwgJ3N5c3RlbUxhbmd1YWdlJyksCiAgICAoTm9uZSwgJ3RhcmdldCcpLAogICAgKE5vbmUsICd0ZXh0LWFuY2hvcicpLAogICAgKE5vbmUsICd0bycpLAogICAgKE5vbmUsICd0cmFuc2Zvcm0nKSwKICAgIChOb25lLCAndHlwZScpLAogICAgKE5vbmUsICd1MScpLAogICAgKE5vbmUsICd1MicpLAogICAgKE5vbmUsICd1bmRlcmxpbmUtcG9zaXRpb24nKSwKICAgIChOb25lLCAndW5kZXJsaW5lLXRoaWNrbmVzcycpLAogICAgKE5vbmUsICd1bmljb2RlJyksCiAgICAoTm9uZSwgJ3VuaWNvZGUtcmFuZ2UnKSwKICAgIChOb25lLCAndW5pdHMtcGVyLWVtJyksCiAgICAoTm9uZSwgJ3ZhbHVlcycpLAogICAgKE5vbmUsICd2ZXJzaW9uJyksCiAgICAoTm9uZSwgJ3ZpZXdCb3gnKSwKICAgIChOb25lLCAndmlzaWJpbGl0eScpLAogICAgKE5vbmUsICd3aWR0aCcpLAogICAgKE5vbmUsICd3aWR0aHMnKSwKICAgIChOb25lLCAneCcpLAogICAgKE5vbmUsICd4LWhlaWdodCcpLAogICAgKE5vbmUsICd4MScpLAogICAgKE5vbmUsICd4MicpLAogICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICdhY3R1YXRlJyksCiAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ2FyY3JvbGUnKSwKICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAnaHJlZicpLAogICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICdyb2xlJyksCiAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ3Nob3cnKSwKICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAndGl0bGUnKSwKICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAndHlwZScpLAogICAgKG5hbWVzcGFjZXNbJ3htbCddLCAnYmFzZScpLAogICAgKG5hbWVzcGFjZXNbJ3htbCddLCAnbGFuZycpLAogICAgKG5hbWVzcGFjZXNbJ3htbCddLCAnc3BhY2UnKSwKICAgIChOb25lLCAneScpLAogICAgKE5vbmUsICd5MScpLAogICAgKE5vbmUsICd5MicpLAogICAgKE5vbmUsICd6b29tQW5kUGFuJyksCikpCgphdHRyX3ZhbF9pc191cmkgPSBmcm96ZW5zZXQoKAogICAgKE5vbmUsICdocmVmJyksCiAgICAoTm9uZSwgJ3NyYycpLAogICAgKE5vbmUsICdjaXRlJyksCiAgICAoTm9uZSwgJ2FjdGlvbicpLAogICAgKE5vbmUsICdsb25nZGVzYycpLAogICAgKE5vbmUsICdwb3N0ZXInKSwKICAgIChOb25lLCAnYmFja2dyb3VuZCcpLAogICAgKE5vbmUsICdkYXRhc3JjJyksCiAgICAoTm9uZSwgJ2R5bnNyYycpLAogICAgKE5vbmUsICdsb3dzcmMnKSwKICAgIChOb25lLCAncGluZycpLAogICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICdocmVmJyksCiAgICAobmFtZXNwYWNlc1sneG1sJ10sICdiYXNlJyksCikpCgpzdmdfYXR0cl92YWxfYWxsb3dzX3JlZiA9IGZyb3plbnNldCgoCiAgICAoTm9uZSwgJ2NsaXAtcGF0aCcpLAogICAgKE5vbmUsICdjb2xvci1wcm9maWxlJyksCiAgICAoTm9uZSwgJ2N1cnNvcicpLAogICAgKE5vbmUsICdmaWxsJyksCiAgICAoTm9uZSwgJ2ZpbHRlcicpLAogICAgKE5vbmUsICdtYXJrZXInKSwKICAgIChOb25lLCAnbWFya2VyLXN0YXJ0JyksCiAgICAoTm9uZSwgJ21hcmtlci1taWQnKSwKICAgIChOb25lLCAnbWFya2VyLWVuZCcpLAogICAgKE5vbmUsICdtYXNrJyksCiAgICAoTm9uZSwgJ3N0cm9rZScpLAopKQoKc3ZnX2FsbG93X2xvY2FsX2hyZWYgPSBmcm96ZW5zZXQoKAogICAgKE5vbmUsICdhbHRHbHlwaCcpLAogICAgKE5vbmUsICdhbmltYXRlJyksCiAgICAoTm9uZSwgJ2FuaW1hdGVDb2xvcicpLAogICAgKE5vbmUsICdhbmltYXRlTW90aW9uJyksCiAgICAoTm9uZSwgJ2FuaW1hdGVUcmFuc2Zvcm0nKSwKICAgIChOb25lLCAnY3Vyc29yJyksCiAgICAoTm9uZSwgJ2ZlSW1hZ2UnKSwKICAgIChOb25lLCAnZmlsdGVyJyksCiAgICAoTm9uZSwgJ2xpbmVhckdyYWRpZW50JyksCiAgICAoTm9uZSwgJ3BhdHRlcm4nKSwKICAgIChOb25lLCAncmFkaWFsR3JhZGllbnQnKSwKICAgIChOb25lLCAndGV4dHBhdGgnKSwKICAgIChOb25lLCAndHJlZicpLAogICAgKE5vbmUsICdzZXQnKSwKICAgIChOb25lLCAndXNlJykKKSkKCmFsbG93ZWRfY3NzX3Byb3BlcnRpZXMgPSBmcm96ZW5zZXQoKAogICAgJ2F6aW11dGgnLAogICAgJ2JhY2tncm91bmQtY29sb3InLAogICAgJ2JvcmRlci1ib3R0b20tY29sb3InLAogICAgJ2JvcmRlci1jb2xsYXBzZScsCiAgICAnYm9yZGVyLWNvbG9yJywKICAgICdib3JkZXItbGVmdC1jb2xvcicsCiAgICAnYm9yZGVyLXJpZ2h0LWNvbG9yJywKICAgICdib3JkZXItdG9wLWNvbG9yJywKICAgICdjbGVhcicsCiAgICAnY29sb3InLAogICAgJ2N1cnNvcicsCiAgICAnZGlyZWN0aW9uJywKICAgICdkaXNwbGF5JywKICAgICdlbGV2YXRpb24nLAogICAgJ2Zsb2F0JywKICAgICdmb250JywKICAgICdmb250LWZhbWlseScsCiAgICAnZm9udC1zaXplJywKICAgICdmb250LXN0eWxlJywKICAgICdmb250LXZhcmlhbnQnLAogICAgJ2ZvbnQtd2VpZ2h0JywKICAgICdoZWlnaHQnLAogICAgJ2xldHRlci1zcGFjaW5nJywKICAgICdsaW5lLWhlaWdodCcsCiAgICAnb3ZlcmZsb3cnLAogICAgJ3BhdXNlJywKICAgICdwYXVzZS1hZnRlcicsCiAgICAncGF1c2UtYmVmb3JlJywKICAgICdwaXRjaCcsCiAgICAncGl0Y2gtcmFuZ2UnLAogICAgJ3JpY2huZXNzJywKICAgICdzcGVhaycsCiAgICAnc3BlYWstaGVhZGVyJywKICAgICdzcGVhay1udW1lcmFsJywKICAgICdzcGVhay1wdW5jdHVhdGlvbicsCiAgICAnc3BlZWNoLXJhdGUnLAogICAgJ3N0cmVzcycsCiAgICAndGV4dC1hbGlnbicsCiAgICAndGV4dC1kZWNvcmF0aW9uJywKICAgICd0ZXh0LWluZGVudCcsCiAgICAndW5pY29kZS1iaWRpJywKICAgICd2ZXJ0aWNhbC1hbGlnbicsCiAgICAndm9pY2UtZmFtaWx5JywKICAgICd2b2x1bWUnLAogICAgJ3doaXRlLXNwYWNlJywKICAgICd3aWR0aCcsCikpCgphbGxvd2VkX2Nzc19rZXl3b3JkcyA9IGZyb3plbnNldCgoCiAgICAnYXV0bycsCiAgICAnYXF1YScsCiAgICAnYmxhY2snLAogICAgJ2Jsb2NrJywKICAgICdibHVlJywKICAgICdib2xkJywKICAgICdib3RoJywKICAgICdib3R0b20nLAogICAgJ2Jyb3duJywKICAgICdjZW50ZXInLAogICAgJ2NvbGxhcHNlJywKICAgICdkYXNoZWQnLAogICAgJ2RvdHRlZCcsCiAgICAnZnVjaHNpYScsCiAgICAnZ3JheScsCiAgICAnZ3JlZW4nLAogICAgJyFpbXBvcnRhbnQnLAogICAgJ2l0YWxpYycsCiAgICAnbGVmdCcsCiAgICAnbGltZScsCiAgICAnbWFyb29uJywKICAgICdtZWRpdW0nLAogICAgJ25vbmUnLAogICAgJ25hdnknLAogICAgJ25vcm1hbCcsCiAgICAnbm93cmFwJywKICAgICdvbGl2ZScsCiAgICAncG9pbnRlcicsCiAgICAncHVycGxlJywKICAgICdyZWQnLAogICAgJ3JpZ2h0JywKICAgICdzb2xpZCcsCiAgICAnc2lsdmVyJywKICAgICd0ZWFsJywKICAgICd0b3AnLAogICAgJ3RyYW5zcGFyZW50JywKICAgICd1bmRlcmxpbmUnLAogICAgJ3doaXRlJywKICAgICd5ZWxsb3cnLAopKQoKYWxsb3dlZF9zdmdfcHJvcGVydGllcyA9IGZyb3plbnNldCgoCiAgICAnZmlsbCcsCiAgICAnZmlsbC1vcGFjaXR5JywKICAgICdmaWxsLXJ1bGUnLAogICAgJ3N0cm9rZScsCiAgICAnc3Ryb2tlLXdpZHRoJywKICAgICdzdHJva2UtbGluZWNhcCcsCiAgICAnc3Ryb2tlLWxpbmVqb2luJywKICAgICdzdHJva2Utb3BhY2l0eScsCikpCgphbGxvd2VkX3Byb3RvY29scyA9IGZyb3plbnNldCgoCiAgICAnZWQyaycsCiAgICAnZnRwJywKICAgICdodHRwJywKICAgICdodHRwcycsCiAgICAnaXJjJywKICAgICdtYWlsdG8nLAogICAgJ25ld3MnLAogICAgJ2dvcGhlcicsCiAgICAnbm50cCcsCiAgICAndGVsbmV0JywKICAgICd3ZWJjYWwnLAogICAgJ3htcHAnLAogICAgJ2NhbGx0bycsCiAgICAnZmVlZCcsCiAgICAndXJuJywKICAgICdhaW0nLAogICAgJ3JzeW5jJywKICAgICd0YWcnLAogICAgJ3NzaCcsCiAgICAnc2Z0cCcsCiAgICAncnRzcCcsCiAgICAnYWZzJywKICAgICdkYXRhJywKKSkKCmFsbG93ZWRfY29udGVudF90eXBlcyA9IGZyb3plbnNldCgoCiAgICAnaW1hZ2UvcG5nJywKICAgICdpbWFnZS9qcGVnJywKICAgICdpbWFnZS9naWYnLAogICAgJ2ltYWdlL3dlYnAnLAogICAgJ2ltYWdlL2JtcCcsCiAgICAndGV4dC9wbGFpbicsCikpCgoKZGF0YV9jb250ZW50X3R5cGUgPSByZS5jb21waWxlKHInJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNYXRjaCBhIGNvbnRlbnQgdHlwZSA8YXBwbGljYXRpb24+Lzx0eXBlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg/UDxjb250ZW50X3R5cGU+Wy1hLXpBLVowLTkuXSsvWy1hLXpBLVowLTkuXSspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNYXRjaCBhbnkgY2hhcmFjdGVyIHNldCBhbmQgZW5jb2RpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPzooPzo7Y2hhcnNldD0oPzpbLWEtekEtWjAtOV0rKSg/OjsoPzpiYXNlNjQpKT8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8KD86Oyg/OmJhc2U2NCkpPyg/OjtjaGFyc2V0PSg/OlstYS16QS1aMC05XSspKT8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBBc3N1bWUgdGhlIHJlc3QgaXMgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwuKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZS5WRVJCT1NFKQoKCmNsYXNzIEZpbHRlcihiYXNlLkZpbHRlcik6CiAgICAiIiIgc2FuaXRpemF0aW9uIG9mIFhIVE1MK01hdGhNTCtTVkcgYW5kIG9mIGlubGluZSBzdHlsZSBhdHRyaWJ1dGVzLiIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsCiAgICAgICAgICAgICAgICAgc291cmNlLAogICAgICAgICAgICAgICAgIGFsbG93ZWRfZWxlbWVudHM9YWxsb3dlZF9lbGVtZW50cywKICAgICAgICAgICAgICAgICBhbGxvd2VkX2F0dHJpYnV0ZXM9YWxsb3dlZF9hdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgIGFsbG93ZWRfY3NzX3Byb3BlcnRpZXM9YWxsb3dlZF9jc3NfcHJvcGVydGllcywKICAgICAgICAgICAgICAgICBhbGxvd2VkX2Nzc19rZXl3b3Jkcz1hbGxvd2VkX2Nzc19rZXl3b3JkcywKICAgICAgICAgICAgICAgICBhbGxvd2VkX3N2Z19wcm9wZXJ0aWVzPWFsbG93ZWRfc3ZnX3Byb3BlcnRpZXMsCiAgICAgICAgICAgICAgICAgYWxsb3dlZF9wcm90b2NvbHM9YWxsb3dlZF9wcm90b2NvbHMsCiAgICAgICAgICAgICAgICAgYWxsb3dlZF9jb250ZW50X3R5cGVzPWFsbG93ZWRfY29udGVudF90eXBlcywKICAgICAgICAgICAgICAgICBhdHRyX3ZhbF9pc191cmk9YXR0cl92YWxfaXNfdXJpLAogICAgICAgICAgICAgICAgIHN2Z19hdHRyX3ZhbF9hbGxvd3NfcmVmPXN2Z19hdHRyX3ZhbF9hbGxvd3NfcmVmLAogICAgICAgICAgICAgICAgIHN2Z19hbGxvd19sb2NhbF9ocmVmPXN2Z19hbGxvd19sb2NhbF9ocmVmKToKICAgICAgICBzdXBlcihGaWx0ZXIsIHNlbGYpLl9faW5pdF9fKHNvdXJjZSkKICAgICAgICBzZWxmLmFsbG93ZWRfZWxlbWVudHMgPSBhbGxvd2VkX2VsZW1lbnRzCiAgICAgICAgc2VsZi5hbGxvd2VkX2F0dHJpYnV0ZXMgPSBhbGxvd2VkX2F0dHJpYnV0ZXMKICAgICAgICBzZWxmLmFsbG93ZWRfY3NzX3Byb3BlcnRpZXMgPSBhbGxvd2VkX2Nzc19wcm9wZXJ0aWVzCiAgICAgICAgc2VsZi5hbGxvd2VkX2Nzc19rZXl3b3JkcyA9IGFsbG93ZWRfY3NzX2tleXdvcmRzCiAgICAgICAgc2VsZi5hbGxvd2VkX3N2Z19wcm9wZXJ0aWVzID0gYWxsb3dlZF9zdmdfcHJvcGVydGllcwogICAgICAgIHNlbGYuYWxsb3dlZF9wcm90b2NvbHMgPSBhbGxvd2VkX3Byb3RvY29scwogICAgICAgIHNlbGYuYWxsb3dlZF9jb250ZW50X3R5cGVzID0gYWxsb3dlZF9jb250ZW50X3R5cGVzCiAgICAgICAgc2VsZi5hdHRyX3ZhbF9pc191cmkgPSBhdHRyX3ZhbF9pc191cmkKICAgICAgICBzZWxmLnN2Z19hdHRyX3ZhbF9hbGxvd3NfcmVmID0gc3ZnX2F0dHJfdmFsX2FsbG93c19yZWYKICAgICAgICBzZWxmLnN2Z19hbGxvd19sb2NhbF9ocmVmID0gc3ZnX2FsbG93X2xvY2FsX2hyZWYKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgZm9yIHRva2VuIGluIGJhc2UuRmlsdGVyLl9faXRlcl9fKHNlbGYpOgogICAgICAgICAgICB0b2tlbiA9IHNlbGYuc2FuaXRpemVfdG9rZW4odG9rZW4pCiAgICAgICAgICAgIGlmIHRva2VuOgogICAgICAgICAgICAgICAgeWllbGQgdG9rZW4KCiAgICAjIFNhbml0aXplIHRoZSAraHRtbCssIGVzY2FwaW5nIGFsbCBlbGVtZW50cyBub3QgaW4gQUxMT1dFRF9FTEVNRU5UUywgYW5kCiAgICAjIHN0cmlwcGluZyBvdXQgYWxsICMgYXR0cmlidXRlcyBub3QgaW4gQUxMT1dFRF9BVFRSSUJVVEVTLiBTdHlsZQogICAgIyBhdHRyaWJ1dGVzIGFyZSBwYXJzZWQsIGFuZCBhIHJlc3RyaWN0ZWQgc2V0LCAjIHNwZWNpZmllZCBieQogICAgIyBBTExPV0VEX0NTU19QUk9QRVJUSUVTIGFuZCBBTExPV0VEX0NTU19LRVlXT1JEUywgYXJlIGFsbG93ZWQgdGhyb3VnaC4KICAgICMgYXR0cmlidXRlcyBpbiBBVFRSX1ZBTF9JU19VUkkgYXJlIHNjYW5uZWQsIGFuZCBvbmx5IFVSSSBzY2hlbWVzIHNwZWNpZmllZAogICAgIyBpbiBBTExPV0VEX1BST1RPQ09MUyBhcmUgYWxsb3dlZC4KICAgICMKICAgICMgICBzYW5pdGl6ZV9odG1sKCc8c2NyaXB0PiBkb19uYXN0eV9zdHVmZigpIDwvc2NyaXB0PicpCiAgICAjICAgID0+ICZsdDtzY3JpcHQ+IGRvX25hc3R5X3N0dWZmKCkgJmx0Oy9zY3JpcHQ+CiAgICAjICAgc2FuaXRpemVfaHRtbCgnPGEgaHJlZj0iamF2YXNjcmlwdDogc3Vja2VyKCk7Ij5DbGljayBoZXJlIGZvciAkMTAwPC9hPicpCiAgICAjICAgID0+IDxhPkNsaWNrIGhlcmUgZm9yICQxMDA8L2E+CiAgICBkZWYgc2FuaXRpemVfdG9rZW4oc2VsZiwgdG9rZW4pOgoKICAgICAgICAjIGFjY29tbW9kYXRlIGZpbHRlcnMgd2hpY2ggdXNlIHRva2VuX3R5cGUgZGlmZmVyZW50bHkKICAgICAgICB0b2tlbl90eXBlID0gdG9rZW5bInR5cGUiXQogICAgICAgIGlmIHRva2VuX3R5cGUgaW4gKCJTdGFydFRhZyIsICJFbmRUYWciLCAiRW1wdHlUYWciKToKICAgICAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICAgICAgbmFtZXNwYWNlID0gdG9rZW5bIm5hbWVzcGFjZSJdCiAgICAgICAgICAgIGlmICgobmFtZXNwYWNlLCBuYW1lKSBpbiBzZWxmLmFsbG93ZWRfZWxlbWVudHMgb3IKICAgICAgICAgICAgICAgIChuYW1lc3BhY2UgaXMgTm9uZSBhbmQKICAgICAgICAgICAgICAgICAobmFtZXNwYWNlc1siaHRtbCJdLCBuYW1lKSBpbiBzZWxmLmFsbG93ZWRfZWxlbWVudHMpKToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmFsbG93ZWRfdG9rZW4odG9rZW4pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kaXNhbGxvd2VkX3Rva2VuKHRva2VuKQogICAgICAgIGVsaWYgdG9rZW5fdHlwZSA9PSAiQ29tbWVudCI6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICBkZWYgYWxsb3dlZF90b2tlbihzZWxmLCB0b2tlbik6CiAgICAgICAgaWYgImRhdGEiIGluIHRva2VuOgogICAgICAgICAgICBhdHRycyA9IHRva2VuWyJkYXRhIl0KICAgICAgICAgICAgYXR0cl9uYW1lcyA9IHNldChhdHRycy5rZXlzKCkpCgogICAgICAgICAgICAjIFJlbW92ZSBmb3JiaWRkZW4gYXR0cmlidXRlcwogICAgICAgICAgICBmb3IgdG9fcmVtb3ZlIGluIChhdHRyX25hbWVzIC0gc2VsZi5hbGxvd2VkX2F0dHJpYnV0ZXMpOgogICAgICAgICAgICAgICAgZGVsIHRva2VuWyJkYXRhIl1bdG9fcmVtb3ZlXQogICAgICAgICAgICAgICAgYXR0cl9uYW1lcy5yZW1vdmUodG9fcmVtb3ZlKQoKICAgICAgICAgICAgIyBSZW1vdmUgYXR0cmlidXRlcyB3aXRoIGRpc2FsbG93ZWQgVVJMIHZhbHVlcwogICAgICAgICAgICBmb3IgYXR0ciBpbiAoYXR0cl9uYW1lcyAmIHNlbGYuYXR0cl92YWxfaXNfdXJpKToKICAgICAgICAgICAgICAgIGFzc2VydCBhdHRyIGluIGF0dHJzCiAgICAgICAgICAgICAgICAjIEkgZG9uJ3QgaGF2ZSBhIGNsdWUgd2hlcmUgdGhpcyByZWdleHAgY29tZXMgZnJvbSBvciB3aHkgaXQgbWF0Y2hlcyB0aG9zZQogICAgICAgICAgICAgICAgIyBjaGFyYWN0ZXJzLCBub3Igd2h5IHdlIGNhbGwgdW5lc2NhcGUuIEkganVzdCBrbm93IGl0J3MgYWx3YXlzIGJlZW4gaGVyZS4KICAgICAgICAgICAgICAgICMgU2hvdWxkIHlvdSBiZSB3b3JyaWVkIGJ5IHRoaXMgY29tbWVudCBpbiBhIHNhbml0aXplcj8gWWVzLiBPbiB0aGUgb3RoZXIgaGFuZCwgYWxsCiAgICAgICAgICAgICAgICAjIHRoaXMgd2lsbCBkbyBpcyByZW1vdmUgKm1vcmUqIHRoYW4gaXQgb3RoZXJ3aXNlIHdvdWxkLgogICAgICAgICAgICAgICAgdmFsX3VuZXNjYXBlZCA9IHJlLnN1YigiW2BceDAwLVx4MjBceDdmLVx4YTBcc10rIiwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZXNjYXBlKGF0dHJzW2F0dHJdKSkubG93ZXIoKQogICAgICAgICAgICAgICAgIyByZW1vdmUgcmVwbGFjZW1lbnQgY2hhcmFjdGVycyBmcm9tIHVuZXNjYXBlZCBjaGFyYWN0ZXJzCiAgICAgICAgICAgICAgICB2YWxfdW5lc2NhcGVkID0gdmFsX3VuZXNjYXBlZC5yZXBsYWNlKCJcdWZmZmQiLCAiIikKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICB1cmkgPSB1cmxwYXJzZS51cmxwYXJzZSh2YWxfdW5lc2NhcGVkKQogICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgdXJpID0gTm9uZQogICAgICAgICAgICAgICAgICAgIGRlbCBhdHRyc1thdHRyXQogICAgICAgICAgICAgICAgaWYgdXJpIGFuZCB1cmkuc2NoZW1lOgogICAgICAgICAgICAgICAgICAgIGlmIHVyaS5zY2hlbWUgbm90IGluIHNlbGYuYWxsb3dlZF9wcm90b2NvbHM6CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBhdHRyc1thdHRyXQogICAgICAgICAgICAgICAgICAgIGlmIHVyaS5zY2hlbWUgPT0gJ2RhdGEnOgogICAgICAgICAgICAgICAgICAgICAgICBtID0gZGF0YV9jb250ZW50X3R5cGUubWF0Y2godXJpLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBtOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGF0dHJzW2F0dHJdCiAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbS5ncm91cCgnY29udGVudF90eXBlJykgbm90IGluIHNlbGYuYWxsb3dlZF9jb250ZW50X3R5cGVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGF0dHJzW2F0dHJdCgogICAgICAgICAgICBmb3IgYXR0ciBpbiBzZWxmLnN2Z19hdHRyX3ZhbF9hbGxvd3NfcmVmOgogICAgICAgICAgICAgICAgaWYgYXR0ciBpbiBhdHRyczoKICAgICAgICAgICAgICAgICAgICBhdHRyc1thdHRyXSA9IHJlLnN1YihyJ3VybFxzKlwoXHMqW14jXHNdW14pXSs/XCknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmVzY2FwZShhdHRyc1thdHRyXSkpCiAgICAgICAgICAgIGlmICh0b2tlblsibmFtZSJdIGluIHNlbGYuc3ZnX2FsbG93X2xvY2FsX2hyZWYgYW5kCiAgICAgICAgICAgICAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ2hyZWYnKSBpbiBhdHRycyBhbmQgcmUuc2VhcmNoKCdeXHMqW14jXHNdLionLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyc1sobmFtZXNwYWNlc1sneGxpbmsnXSwgJ2hyZWYnKV0pKToKICAgICAgICAgICAgICAgIGRlbCBhdHRyc1sobmFtZXNwYWNlc1sneGxpbmsnXSwgJ2hyZWYnKV0KICAgICAgICAgICAgaWYgKE5vbmUsICdzdHlsZScpIGluIGF0dHJzOgogICAgICAgICAgICAgICAgYXR0cnNbKE5vbmUsICdzdHlsZScpXSA9IHNlbGYuc2FuaXRpemVfY3NzKGF0dHJzWyhOb25lLCAnc3R5bGUnKV0pCiAgICAgICAgICAgIHRva2VuWyJkYXRhIl0gPSBhdHRycwogICAgICAgIHJldHVybiB0b2tlbgoKICAgIGRlZiBkaXNhbGxvd2VkX3Rva2VuKHNlbGYsIHRva2VuKToKICAgICAgICB0b2tlbl90eXBlID0gdG9rZW5bInR5cGUiXQogICAgICAgIGlmIHRva2VuX3R5cGUgPT0gIkVuZFRhZyI6CiAgICAgICAgICAgIHRva2VuWyJkYXRhIl0gPSAiPC8lcz4iICUgdG9rZW5bIm5hbWUiXQogICAgICAgIGVsaWYgdG9rZW5bImRhdGEiXToKICAgICAgICAgICAgYXNzZXJ0IHRva2VuX3R5cGUgaW4gKCJTdGFydFRhZyIsICJFbXB0eVRhZyIpCiAgICAgICAgICAgIGF0dHJzID0gW10KICAgICAgICAgICAgZm9yIChucywgbmFtZSksIHYgaW4gdG9rZW5bImRhdGEiXS5pdGVtcygpOgogICAgICAgICAgICAgICAgYXR0cnMuYXBwZW5kKCcgJXM9IiVzIicgJSAobmFtZSBpZiBucyBpcyBOb25lIGVsc2UgIiVzOiVzIiAlIChwcmVmaXhlc1tuc10sIG5hbWUpLCBlc2NhcGUodikpKQogICAgICAgICAgICB0b2tlblsiZGF0YSJdID0gIjwlcyVzPiIgJSAodG9rZW5bIm5hbWUiXSwgJycuam9pbihhdHRycykpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdG9rZW5bImRhdGEiXSA9ICI8JXM+IiAlIHRva2VuWyJuYW1lIl0KICAgICAgICBpZiB0b2tlbi5nZXQoInNlbGZDbG9zaW5nIik6CiAgICAgICAgICAgIHRva2VuWyJkYXRhIl0gPSB0b2tlblsiZGF0YSJdWzotMV0gKyAiLz4iCgogICAgICAgIHRva2VuWyJ0eXBlIl0gPSAiQ2hhcmFjdGVycyIKCiAgICAgICAgZGVsIHRva2VuWyJuYW1lIl0KICAgICAgICByZXR1cm4gdG9rZW4KCiAgICBkZWYgc2FuaXRpemVfY3NzKHNlbGYsIHN0eWxlKToKICAgICAgICAjIGRpc2FsbG93IHVybHMKICAgICAgICBzdHlsZSA9IHJlLmNvbXBpbGUoJ3VybFxzKlwoXHMqW15ccyldKz9ccypcKVxzKicpLnN1YignICcsIHN0eWxlKQoKICAgICAgICAjIGdhdW50bGV0CiAgICAgICAgaWYgbm90IHJlLm1hdGNoKCIiIl4oWzosOyMlLlxzYS16QS1aMC05IV18XHctXHd8J1tcc1x3XSsnfCJbXHNcd10rInxcKFtcZCxcc10rXCkpKiQiIiIsIHN0eWxlKToKICAgICAgICAgICAgcmV0dXJuICcnCiAgICAgICAgaWYgbm90IHJlLm1hdGNoKCJeXHMqKFstXHddK1xzKjpbXjo7XSooO1xzKnwkKSkqJCIsIHN0eWxlKToKICAgICAgICAgICAgcmV0dXJuICcnCgogICAgICAgIGNsZWFuID0gW10KICAgICAgICBmb3IgcHJvcCwgdmFsdWUgaW4gcmUuZmluZGFsbCgiKFstXHddKylccyo6XHMqKFteOjtdKikiLCBzdHlsZSk6CiAgICAgICAgICAgIGlmIG5vdCB2YWx1ZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIHByb3AubG93ZXIoKSBpbiBzZWxmLmFsbG93ZWRfY3NzX3Byb3BlcnRpZXM6CiAgICAgICAgICAgICAgICBjbGVhbi5hcHBlbmQocHJvcCArICc6ICcgKyB2YWx1ZSArICc7JykKICAgICAgICAgICAgZWxpZiBwcm9wLnNwbGl0KCctJylbMF0ubG93ZXIoKSBpbiBbJ2JhY2tncm91bmQnLCAnYm9yZGVyJywgJ21hcmdpbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWRkaW5nJ106CiAgICAgICAgICAgICAgICBmb3Iga2V5d29yZCBpbiB2YWx1ZS5zcGxpdCgpOgogICAgICAgICAgICAgICAgICAgIGlmIGtleXdvcmQgbm90IGluIHNlbGYuYWxsb3dlZF9jc3Nfa2V5d29yZHMgYW5kIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCByZS5tYXRjaCgiXigjWzAtOWEtZl0rfHJnYlwoXGQrJT8sXGQqJT8sP1xkKiU/XCk/fFxkezAsMn1cLj9cZHswLDJ9KGNtfGVtfGV4fGlufG1tfHBjfHB0fHB4fCV8LHxcKSk/KSQiLCBrZXl3b3JkKTogICMgbm9xYQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjbGVhbi5hcHBlbmQocHJvcCArICc6ICcgKyB2YWx1ZSArICc7JykKICAgICAgICAgICAgZWxpZiBwcm9wLmxvd2VyKCkgaW4gc2VsZi5hbGxvd2VkX3N2Z19wcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgY2xlYW4uYXBwZW5kKHByb3AgKyAnOiAnICsgdmFsdWUgKyAnOycpCgogICAgICAgIHJldHVybiAnICcuam9pbihjbGVhbikKUEsDBBQAAAAAAAAAIQCfjmqtcwQAAHMEAAA6AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvd2hpdGVzcGFjZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IHJlCgpmcm9tIC4gaW1wb3J0IGJhc2UKZnJvbSAuLmNvbnN0YW50cyBpbXBvcnQgcmNkYXRhRWxlbWVudHMsIHNwYWNlQ2hhcmFjdGVycwpzcGFjZUNoYXJhY3RlcnMgPSAiIi5qb2luKHNwYWNlQ2hhcmFjdGVycykKClNQQUNFU19SRUdFWCA9IHJlLmNvbXBpbGUoIlslc10rIiAlIHNwYWNlQ2hhcmFjdGVycykKCgpjbGFzcyBGaWx0ZXIoYmFzZS5GaWx0ZXIpOgoKICAgIHNwYWNlUHJlc2VydmVFbGVtZW50cyA9IGZyb3plbnNldChbInByZSIsICJ0ZXh0YXJlYSJdICsgbGlzdChyY2RhdGFFbGVtZW50cykpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHByZXNlcnZlID0gMAogICAgICAgIGZvciB0b2tlbiBpbiBiYXNlLkZpbHRlci5fX2l0ZXJfXyhzZWxmKToKICAgICAgICAgICAgdHlwZSA9IHRva2VuWyJ0eXBlIl0KICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3RhcnRUYWciIFwKICAgICAgICAgICAgICAgICAgICBhbmQgKHByZXNlcnZlIG9yIHRva2VuWyJuYW1lIl0gaW4gc2VsZi5zcGFjZVByZXNlcnZlRWxlbWVudHMpOgogICAgICAgICAgICAgICAgcHJlc2VydmUgKz0gMQoKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJFbmRUYWciIGFuZCBwcmVzZXJ2ZToKICAgICAgICAgICAgICAgIHByZXNlcnZlIC09IDEKCiAgICAgICAgICAgIGVsaWYgbm90IHByZXNlcnZlIGFuZCB0eXBlID09ICJTcGFjZUNoYXJhY3RlcnMiIGFuZCB0b2tlblsiZGF0YSJdOgogICAgICAgICAgICAgICAgIyBUZXN0IG9uIHRva2VuWyJkYXRhIl0gYWJvdmUgdG8gbm90IGludHJvZHVjZSBzcGFjZXMgd2hlcmUgdGhlcmUgd2VyZSBub3QKICAgICAgICAgICAgICAgIHRva2VuWyJkYXRhIl0gPSAiICIKCiAgICAgICAgICAgIGVsaWYgbm90IHByZXNlcnZlIGFuZCB0eXBlID09ICJDaGFyYWN0ZXJzIjoKICAgICAgICAgICAgICAgIHRva2VuWyJkYXRhIl0gPSBjb2xsYXBzZV9zcGFjZXModG9rZW5bImRhdGEiXSkKCiAgICAgICAgICAgIHlpZWxkIHRva2VuCgoKZGVmIGNvbGxhcHNlX3NwYWNlcyh0ZXh0KToKICAgIHJldHVybiBTUEFDRVNfUkVHRVguc3ViKCcgJywgdGV4dCkKUEsDBBQAAAAAAAAAIQBj2HfcsskBALLJAQAzAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2h0bWw1cGFyc2VyLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB3aXRoX21ldGFjbGFzcywgdmlld2tleXMsIFBZMwoKaW1wb3J0IHR5cGVzCgp0cnk6CiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIHBpcC5fdmVuZG9yLm9yZGVyZWRkaWN0IGltcG9ydCBPcmRlcmVkRGljdAoKZnJvbSAuIGltcG9ydCBfaW5wdXRzdHJlYW0KZnJvbSAuIGltcG9ydCBfdG9rZW5pemVyCgpmcm9tIC4gaW1wb3J0IHRyZWVidWlsZGVycwpmcm9tIC50cmVlYnVpbGRlcnMuYmFzZSBpbXBvcnQgTWFya2VyCgpmcm9tIC4gaW1wb3J0IF91dGlscwpmcm9tIC5jb25zdGFudHMgaW1wb3J0ICgKICAgIHNwYWNlQ2hhcmFjdGVycywgYXNjaWlVcHBlcjJMb3dlciwKICAgIHNwZWNpYWxFbGVtZW50cywgaGVhZGluZ0VsZW1lbnRzLCBjZGF0YUVsZW1lbnRzLCByY2RhdGFFbGVtZW50cywKICAgIHRva2VuVHlwZXMsIHRhZ1Rva2VuVHlwZXMsCiAgICBuYW1lc3BhY2VzLAogICAgaHRtbEludGVncmF0aW9uUG9pbnRFbGVtZW50cywgbWF0aG1sVGV4dEludGVncmF0aW9uUG9pbnRFbGVtZW50cywKICAgIGFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzIGFzIGFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzTWFwLAogICAgYWRqdXN0TWF0aE1MQXR0cmlidXRlcywgYWRqdXN0U1ZHQXR0cmlidXRlcywKICAgIEUsCiAgICBSZXBhcnNlRXhjZXB0aW9uCikKCgpkZWYgcGFyc2UoZG9jLCB0cmVlYnVpbGRlcj0iZXRyZWUiLCBuYW1lc3BhY2VIVE1MRWxlbWVudHM9VHJ1ZSwgKiprd2FyZ3MpOgogICAgIiIiUGFyc2UgYSBzdHJpbmcgb3IgZmlsZS1saWtlIG9iamVjdCBpbnRvIGEgdHJlZSIiIgogICAgdGIgPSB0cmVlYnVpbGRlcnMuZ2V0VHJlZUJ1aWxkZXIodHJlZWJ1aWxkZXIpCiAgICBwID0gSFRNTFBhcnNlcih0YiwgbmFtZXNwYWNlSFRNTEVsZW1lbnRzPW5hbWVzcGFjZUhUTUxFbGVtZW50cykKICAgIHJldHVybiBwLnBhcnNlKGRvYywgKiprd2FyZ3MpCgoKZGVmIHBhcnNlRnJhZ21lbnQoZG9jLCBjb250YWluZXI9ImRpdiIsIHRyZWVidWlsZGVyPSJldHJlZSIsIG5hbWVzcGFjZUhUTUxFbGVtZW50cz1UcnVlLCAqKmt3YXJncyk6CiAgICB0YiA9IHRyZWVidWlsZGVycy5nZXRUcmVlQnVpbGRlcih0cmVlYnVpbGRlcikKICAgIHAgPSBIVE1MUGFyc2VyKHRiLCBuYW1lc3BhY2VIVE1MRWxlbWVudHM9bmFtZXNwYWNlSFRNTEVsZW1lbnRzKQogICAgcmV0dXJuIHAucGFyc2VGcmFnbWVudChkb2MsIGNvbnRhaW5lcj1jb250YWluZXIsICoqa3dhcmdzKQoKCmRlZiBtZXRob2RfZGVjb3JhdG9yX21ldGFjbGFzcyhmdW5jdGlvbik6CiAgICBjbGFzcyBEZWNvcmF0ZWQodHlwZSk6CiAgICAgICAgZGVmIF9fbmV3X18obWV0YSwgY2xhc3NuYW1lLCBiYXNlcywgY2xhc3NEaWN0KToKICAgICAgICAgICAgZm9yIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZSBpbiBjbGFzc0RpY3QuaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXR0cmlidXRlLCB0eXBlcy5GdW5jdGlvblR5cGUpOgogICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9IGZ1bmN0aW9uKGF0dHJpYnV0ZSkKCiAgICAgICAgICAgICAgICBjbGFzc0RpY3RbYXR0cmlidXRlTmFtZV0gPSBhdHRyaWJ1dGUKICAgICAgICAgICAgcmV0dXJuIHR5cGUuX19uZXdfXyhtZXRhLCBjbGFzc25hbWUsIGJhc2VzLCBjbGFzc0RpY3QpCiAgICByZXR1cm4gRGVjb3JhdGVkCgoKY2xhc3MgSFRNTFBhcnNlcihvYmplY3QpOgogICAgIiIiSFRNTCBwYXJzZXIuIEdlbmVyYXRlcyBhIHRyZWUgc3RydWN0dXJlIGZyb20gYSBzdHJlYW0gb2YgKHBvc3NpYmx5CiAgICAgICAgbWFsZm9ybWVkKSBIVE1MIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyZWU9Tm9uZSwgc3RyaWN0PUZhbHNlLCBuYW1lc3BhY2VIVE1MRWxlbWVudHM9VHJ1ZSwgZGVidWc9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIHN0cmljdCAtIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIGEgcGFyc2UgZXJyb3IgaXMgZW5jb3VudGVyZWQKCiAgICAgICAgdHJlZSAtIGEgdHJlZWJ1aWxkZXIgY2xhc3MgY29udHJvbGxpbmcgdGhlIHR5cGUgb2YgdHJlZSB0aGF0IHdpbGwgYmUKICAgICAgICByZXR1cm5lZC4gQnVpbHQgaW4gdHJlZWJ1aWxkZXJzIGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoCiAgICAgICAgaHRtbDVsaWIudHJlZWJ1aWxkZXJzLmdldFRyZWVCdWlsZGVyKHRyZWVUeXBlKQogICAgICAgICIiIgoKICAgICAgICAjIFJhaXNlIGFuIGV4Y2VwdGlvbiBvbiB0aGUgZmlyc3QgZXJyb3IgZW5jb3VudGVyZWQKICAgICAgICBzZWxmLnN0cmljdCA9IHN0cmljdAoKICAgICAgICBpZiB0cmVlIGlzIE5vbmU6CiAgICAgICAgICAgIHRyZWUgPSB0cmVlYnVpbGRlcnMuZ2V0VHJlZUJ1aWxkZXIoImV0cmVlIikKICAgICAgICBzZWxmLnRyZWUgPSB0cmVlKG5hbWVzcGFjZUhUTUxFbGVtZW50cykKICAgICAgICBzZWxmLmVycm9ycyA9IFtdCgogICAgICAgIHNlbGYucGhhc2VzID0gZGljdChbKG5hbWUsIGNscyhzZWxmLCBzZWxmLnRyZWUpKSBmb3IgbmFtZSwgY2xzIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQaGFzZXMoZGVidWcpLml0ZW1zKCldKQoKICAgIGRlZiBfcGFyc2Uoc2VsZiwgc3RyZWFtLCBpbm5lckhUTUw9RmFsc2UsIGNvbnRhaW5lcj0iZGl2Iiwgc2NyaXB0aW5nPUZhbHNlLCAqKmt3YXJncyk6CgogICAgICAgIHNlbGYuaW5uZXJIVE1MTW9kZSA9IGlubmVySFRNTAogICAgICAgIHNlbGYuY29udGFpbmVyID0gY29udGFpbmVyCiAgICAgICAgc2VsZi5zY3JpcHRpbmcgPSBzY3JpcHRpbmcKICAgICAgICBzZWxmLnRva2VuaXplciA9IF90b2tlbml6ZXIuSFRNTFRva2VuaXplcihzdHJlYW0sIHBhcnNlcj1zZWxmLCAqKmt3YXJncykKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLm1haW5Mb29wKCkKICAgICAgICBleGNlcHQgUmVwYXJzZUV4Y2VwdGlvbjoKICAgICAgICAgICAgc2VsZi5yZXNldCgpCiAgICAgICAgICAgIHNlbGYubWFpbkxvb3AoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLnRyZWUucmVzZXQoKQogICAgICAgIHNlbGYuZmlyc3RTdGFydFRhZyA9IEZhbHNlCiAgICAgICAgc2VsZi5lcnJvcnMgPSBbXQogICAgICAgIHNlbGYubG9nID0gW10gICMgb25seSB1c2VkIHdpdGggZGVidWcgbW9kZQogICAgICAgICMgInF1aXJrcyIgLyAibGltaXRlZCBxdWlya3MiIC8gIm5vIHF1aXJrcyIKICAgICAgICBzZWxmLmNvbXBhdE1vZGUgPSAibm8gcXVpcmtzIgoKICAgICAgICBpZiBzZWxmLmlubmVySFRNTE1vZGU6CiAgICAgICAgICAgIHNlbGYuaW5uZXJIVE1MID0gc2VsZi5jb250YWluZXIubG93ZXIoKQoKICAgICAgICAgICAgaWYgc2VsZi5pbm5lckhUTUwgaW4gY2RhdGFFbGVtZW50czoKICAgICAgICAgICAgICAgIHNlbGYudG9rZW5pemVyLnN0YXRlID0gc2VsZi50b2tlbml6ZXIucmNkYXRhU3RhdGUKICAgICAgICAgICAgZWxpZiBzZWxmLmlubmVySFRNTCBpbiByY2RhdGFFbGVtZW50czoKICAgICAgICAgICAgICAgIHNlbGYudG9rZW5pemVyLnN0YXRlID0gc2VsZi50b2tlbml6ZXIucmF3dGV4dFN0YXRlCiAgICAgICAgICAgIGVsaWYgc2VsZi5pbm5lckhUTUwgPT0gJ3BsYWludGV4dCc6CiAgICAgICAgICAgICAgICBzZWxmLnRva2VuaXplci5zdGF0ZSA9IHNlbGYudG9rZW5pemVyLnBsYWludGV4dFN0YXRlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIHN0YXRlIGFscmVhZHkgaXMgZGF0YSBzdGF0ZQogICAgICAgICAgICAgICAgIyBzZWxmLnRva2VuaXplci5zdGF0ZSA9IHNlbGYudG9rZW5pemVyLmRhdGFTdGF0ZQogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBzZWxmLnBoYXNlID0gc2VsZi5waGFzZXNbImJlZm9yZUh0bWwiXQogICAgICAgICAgICBzZWxmLnBoYXNlLmluc2VydEh0bWxFbGVtZW50KCkKICAgICAgICAgICAgc2VsZi5yZXNldEluc2VydGlvbk1vZGUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuaW5uZXJIVE1MID0gRmFsc2UgICMgcHlsaW50OmRpc2FibGU9cmVkZWZpbmVkLXZhcmlhYmxlLXR5cGUKICAgICAgICAgICAgc2VsZi5waGFzZSA9IHNlbGYucGhhc2VzWyJpbml0aWFsIl0KCiAgICAgICAgc2VsZi5sYXN0UGhhc2UgPSBOb25lCgogICAgICAgIHNlbGYuYmVmb3JlUkNEYXRhUGhhc2UgPSBOb25lCgogICAgICAgIHNlbGYuZnJhbWVzZXRPSyA9IFRydWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkb2N1bWVudEVuY29kaW5nKHNlbGYpOgogICAgICAgICIiIlRoZSBuYW1lIG9mIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcKICAgICAgICB0aGF0IHdhcyB1c2VkIHRvIGRlY29kZSB0aGUgaW5wdXQgc3RyZWFtLAogICAgICAgIG9yIDpvYmo6YE5vbmVgIGlmIHRoYXQgaXMgbm90IGRldGVybWluZWQgeWV0LgoKICAgICAgICAiIiIKICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAndG9rZW5pemVyJyk6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIHNlbGYudG9rZW5pemVyLnN0cmVhbS5jaGFyRW5jb2RpbmdbMF0ubmFtZQoKICAgIGRlZiBpc0hUTUxJbnRlZ3JhdGlvblBvaW50KHNlbGYsIGVsZW1lbnQpOgogICAgICAgIGlmIChlbGVtZW50Lm5hbWUgPT0gImFubm90YXRpb24teG1sIiBhbmQKICAgICAgICAgICAgICAgIGVsZW1lbnQubmFtZXNwYWNlID09IG5hbWVzcGFjZXNbIm1hdGhtbCJdKToKICAgICAgICAgICAgcmV0dXJuICgiZW5jb2RpbmciIGluIGVsZW1lbnQuYXR0cmlidXRlcyBhbmQKICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmF0dHJpYnV0ZXNbImVuY29kaW5nIl0udHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICBhc2NpaVVwcGVyMkxvd2VyKSBpbgogICAgICAgICAgICAgICAgICAgICgidGV4dC9odG1sIiwgImFwcGxpY2F0aW9uL3hodG1sK3htbCIpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAoZWxlbWVudC5uYW1lc3BhY2UsIGVsZW1lbnQubmFtZSkgaW4gaHRtbEludGVncmF0aW9uUG9pbnRFbGVtZW50cwoKICAgIGRlZiBpc01hdGhNTFRleHRJbnRlZ3JhdGlvblBvaW50KHNlbGYsIGVsZW1lbnQpOgogICAgICAgIHJldHVybiAoZWxlbWVudC5uYW1lc3BhY2UsIGVsZW1lbnQubmFtZSkgaW4gbWF0aG1sVGV4dEludGVncmF0aW9uUG9pbnRFbGVtZW50cwoKICAgIGRlZiBtYWluTG9vcChzZWxmKToKICAgICAgICBDaGFyYWN0ZXJzVG9rZW4gPSB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0KICAgICAgICBTcGFjZUNoYXJhY3RlcnNUb2tlbiA9IHRva2VuVHlwZXNbIlNwYWNlQ2hhcmFjdGVycyJdCiAgICAgICAgU3RhcnRUYWdUb2tlbiA9IHRva2VuVHlwZXNbIlN0YXJ0VGFnIl0KICAgICAgICBFbmRUYWdUb2tlbiA9IHRva2VuVHlwZXNbIkVuZFRhZyJdCiAgICAgICAgQ29tbWVudFRva2VuID0gdG9rZW5UeXBlc1siQ29tbWVudCJdCiAgICAgICAgRG9jdHlwZVRva2VuID0gdG9rZW5UeXBlc1siRG9jdHlwZSJdCiAgICAgICAgUGFyc2VFcnJvclRva2VuID0gdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdCgogICAgICAgIGZvciB0b2tlbiBpbiBzZWxmLm5vcm1hbGl6ZWRUb2tlbnMoKToKICAgICAgICAgICAgcHJldl90b2tlbiA9IE5vbmUKICAgICAgICAgICAgbmV3X3Rva2VuID0gdG9rZW4KICAgICAgICAgICAgd2hpbGUgbmV3X3Rva2VuIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcHJldl90b2tlbiA9IG5ld190b2tlbgogICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXSBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzIGVsc2UgTm9uZQogICAgICAgICAgICAgICAgY3VycmVudE5vZGVOYW1lc3BhY2UgPSBjdXJyZW50Tm9kZS5uYW1lc3BhY2UgaWYgY3VycmVudE5vZGUgZWxzZSBOb25lCiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZU5hbWUgPSBjdXJyZW50Tm9kZS5uYW1lIGlmIGN1cnJlbnROb2RlIGVsc2UgTm9uZQoKICAgICAgICAgICAgICAgIHR5cGUgPSBuZXdfdG9rZW5bInR5cGUiXQoKICAgICAgICAgICAgICAgIGlmIHR5cGUgPT0gUGFyc2VFcnJvclRva2VuOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VFcnJvcihuZXdfdG9rZW5bImRhdGEiXSwgbmV3X3Rva2VuLmdldCgiZGF0YXZhcnMiLCB7fSkpCiAgICAgICAgICAgICAgICAgICAgbmV3X3Rva2VuID0gTm9uZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiAobGVuKHNlbGYudHJlZS5vcGVuRWxlbWVudHMpID09IDAgb3IKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGVOYW1lc3BhY2UgPT0gc2VsZi50cmVlLmRlZmF1bHROYW1lc3BhY2Ugb3IKICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuaXNNYXRoTUxUZXh0SW50ZWdyYXRpb25Qb2ludChjdXJyZW50Tm9kZSkgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAoKHR5cGUgPT0gU3RhcnRUYWdUb2tlbiBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bIm5hbWUiXSBub3QgaW4gZnJvemVuc2V0KFsibWdseXBoIiwgIm1hbGlnbm1hcmsiXSkpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBpbiAoQ2hhcmFjdGVyc1Rva2VuLCBTcGFjZUNoYXJhY3RlcnNUb2tlbikpKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudE5vZGVOYW1lc3BhY2UgPT0gbmFtZXNwYWNlc1sibWF0aG1sIl0gYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZU5hbWUgPT0gImFubm90YXRpb24teG1sIiBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gU3RhcnRUYWdUb2tlbiBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lIl0gPT0gInN2ZyIpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmlzSFRNTEludGVncmF0aW9uUG9pbnQoY3VycmVudE5vZGUpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBpbiAoU3RhcnRUYWdUb2tlbiwgQ2hhcmFjdGVyc1Rva2VuLCBTcGFjZUNoYXJhY3RlcnNUb2tlbikpKToKICAgICAgICAgICAgICAgICAgICAgICAgcGhhc2UgPSBzZWxmLnBoYXNlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgcGhhc2UgPSBzZWxmLnBoYXNlc1siaW5Gb3JlaWduQ29udGVudCJdCgogICAgICAgICAgICAgICAgICAgIGlmIHR5cGUgPT0gQ2hhcmFjdGVyc1Rva2VuOgogICAgICAgICAgICAgICAgICAgICAgICBuZXdfdG9rZW4gPSBwaGFzZS5wcm9jZXNzQ2hhcmFjdGVycyhuZXdfdG9rZW4pCiAgICAgICAgICAgICAgICAgICAgZWxpZiB0eXBlID09IFNwYWNlQ2hhcmFjdGVyc1Rva2VuOgogICAgICAgICAgICAgICAgICAgICAgICBuZXdfdG9rZW4gPSBwaGFzZS5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKG5ld190b2tlbikKICAgICAgICAgICAgICAgICAgICBlbGlmIHR5cGUgPT0gU3RhcnRUYWdUb2tlbjoKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3Rva2VuID0gcGhhc2UucHJvY2Vzc1N0YXJ0VGFnKG5ld190b2tlbikKICAgICAgICAgICAgICAgICAgICBlbGlmIHR5cGUgPT0gRW5kVGFnVG9rZW46CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld190b2tlbiA9IHBoYXNlLnByb2Nlc3NFbmRUYWcobmV3X3Rva2VuKQogICAgICAgICAgICAgICAgICAgIGVsaWYgdHlwZSA9PSBDb21tZW50VG9rZW46CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld190b2tlbiA9IHBoYXNlLnByb2Nlc3NDb21tZW50KG5ld190b2tlbikKICAgICAgICAgICAgICAgICAgICBlbGlmIHR5cGUgPT0gRG9jdHlwZVRva2VuOgogICAgICAgICAgICAgICAgICAgICAgICBuZXdfdG9rZW4gPSBwaGFzZS5wcm9jZXNzRG9jdHlwZShuZXdfdG9rZW4pCgogICAgICAgICAgICBpZiAodHlwZSA9PSBTdGFydFRhZ1Rva2VuIGFuZCBwcmV2X3Rva2VuWyJzZWxmQ2xvc2luZyJdIGFuZAogICAgICAgICAgICAgICAgICAgIG5vdCBwcmV2X3Rva2VuWyJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCJdKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VFcnJvcigibm9uLXZvaWQtZWxlbWVudC13aXRoLXRyYWlsaW5nLXNvbGlkdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHByZXZfdG9rZW5bIm5hbWUiXX0pCgogICAgICAgICMgV2hlbiB0aGUgbG9vcCBmaW5pc2hlcyBpdCdzIEVPRgogICAgICAgIHJlcHJvY2VzcyA9IFRydWUKICAgICAgICBwaGFzZXMgPSBbXQogICAgICAgIHdoaWxlIHJlcHJvY2VzczoKICAgICAgICAgICAgcGhhc2VzLmFwcGVuZChzZWxmLnBoYXNlKQogICAgICAgICAgICByZXByb2Nlc3MgPSBzZWxmLnBoYXNlLnByb2Nlc3NFT0YoKQogICAgICAgICAgICBpZiByZXByb2Nlc3M6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5waGFzZSBub3QgaW4gcGhhc2VzCgogICAgZGVmIG5vcm1hbGl6ZWRUb2tlbnMoc2VsZik6CiAgICAgICAgZm9yIHRva2VuIGluIHNlbGYudG9rZW5pemVyOgogICAgICAgICAgICB5aWVsZCBzZWxmLm5vcm1hbGl6ZVRva2VuKHRva2VuKQoKICAgIGRlZiBwYXJzZShzZWxmLCBzdHJlYW0sICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiUGFyc2UgYSBIVE1MIGRvY3VtZW50IGludG8gYSB3ZWxsLWZvcm1lZCB0cmVlCgogICAgICAgIHN0cmVhbSAtIGEgZmlsZWxpa2Ugb2JqZWN0IG9yIHN0cmluZyBjb250YWluaW5nIHRoZSBIVE1MIHRvIGJlIHBhcnNlZAoKICAgICAgICBUaGUgb3B0aW9uYWwgZW5jb2RpbmcgcGFyYW1ldGVyIG11c3QgYmUgYSBzdHJpbmcgdGhhdCBpbmRpY2F0ZXMKICAgICAgICB0aGUgZW5jb2RpbmcuICBJZiBzcGVjaWZpZWQsIHRoYXQgZW5jb2Rpbmcgd2lsbCBiZSB1c2VkLAogICAgICAgIHJlZ2FyZGxlc3Mgb2YgYW55IEJPTSBvciBsYXRlciBkZWNsYXJhdGlvbiAoc3VjaCBhcyBpbiBhIG1ldGEKICAgICAgICBlbGVtZW50KQoKICAgICAgICBzY3JpcHRpbmcgLSB0cmVhdCBub3NjcmlwdCBlbGVtZW50cyBhcyBpZiBqYXZhc2NyaXB0IHdhcyB0dXJuZWQgb24KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9wYXJzZShzdHJlYW0sIEZhbHNlLCBOb25lLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcmV0dXJuIHNlbGYudHJlZS5nZXREb2N1bWVudCgpCgogICAgZGVmIHBhcnNlRnJhZ21lbnQoc2VsZiwgc3RyZWFtLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIlBhcnNlIGEgSFRNTCBmcmFnbWVudCBpbnRvIGEgd2VsbC1mb3JtZWQgdHJlZSBmcmFnbWVudAoKICAgICAgICBjb250YWluZXIgLSBuYW1lIG9mIHRoZSBlbGVtZW50IHdlJ3JlIHNldHRpbmcgdGhlIGlubmVySFRNTCBwcm9wZXJ0eQogICAgICAgIGlmIHNldCB0byBOb25lLCBkZWZhdWx0IHRvICdkaXYnCgogICAgICAgIHN0cmVhbSAtIGEgZmlsZWxpa2Ugb2JqZWN0IG9yIHN0cmluZyBjb250YWluaW5nIHRoZSBIVE1MIHRvIGJlIHBhcnNlZAoKICAgICAgICBUaGUgb3B0aW9uYWwgZW5jb2RpbmcgcGFyYW1ldGVyIG11c3QgYmUgYSBzdHJpbmcgdGhhdCBpbmRpY2F0ZXMKICAgICAgICB0aGUgZW5jb2RpbmcuICBJZiBzcGVjaWZpZWQsIHRoYXQgZW5jb2Rpbmcgd2lsbCBiZSB1c2VkLAogICAgICAgIHJlZ2FyZGxlc3Mgb2YgYW55IEJPTSBvciBsYXRlciBkZWNsYXJhdGlvbiAoc3VjaCBhcyBpbiBhIG1ldGEKICAgICAgICBlbGVtZW50KQoKICAgICAgICBzY3JpcHRpbmcgLSB0cmVhdCBub3NjcmlwdCBlbGVtZW50cyBhcyBpZiBqYXZhc2NyaXB0IHdhcyB0dXJuZWQgb24KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9wYXJzZShzdHJlYW0sIFRydWUsICphcmdzLCAqKmt3YXJncykKICAgICAgICByZXR1cm4gc2VsZi50cmVlLmdldEZyYWdtZW50KCkKCiAgICBkZWYgcGFyc2VFcnJvcihzZWxmLCBlcnJvcmNvZGU9IlhYWC11bmRlZmluZWQtZXJyb3IiLCBkYXRhdmFycz1Ob25lKToKICAgICAgICAjIFhYWCBUaGUgaWRlYSBpcyB0byBtYWtlIGVycm9yY29kZSBtYW5kYXRvcnkuCiAgICAgICAgaWYgZGF0YXZhcnMgaXMgTm9uZToKICAgICAgICAgICAgZGF0YXZhcnMgPSB7fQogICAgICAgIHNlbGYuZXJyb3JzLmFwcGVuZCgoc2VsZi50b2tlbml6ZXIuc3RyZWFtLnBvc2l0aW9uKCksIGVycm9yY29kZSwgZGF0YXZhcnMpKQogICAgICAgIGlmIHNlbGYuc3RyaWN0OgogICAgICAgICAgICByYWlzZSBQYXJzZUVycm9yKEVbZXJyb3Jjb2RlXSAlIGRhdGF2YXJzKQoKICAgIGRlZiBub3JtYWxpemVUb2tlbihzZWxmLCB0b2tlbik6CiAgICAgICAgIiIiIEhUTUw1IHNwZWNpZmljIG5vcm1hbGl6YXRpb25zIHRvIHRoZSB0b2tlbiBzdHJlYW0gIiIiCgogICAgICAgIGlmIHRva2VuWyJ0eXBlIl0gPT0gdG9rZW5UeXBlc1siU3RhcnRUYWciXToKICAgICAgICAgICAgcmF3ID0gdG9rZW5bImRhdGEiXQogICAgICAgICAgICB0b2tlblsiZGF0YSJdID0gT3JkZXJlZERpY3QocmF3KQogICAgICAgICAgICBpZiBsZW4ocmF3KSA+IGxlbih0b2tlblsiZGF0YSJdKToKICAgICAgICAgICAgICAgICMgd2UgaGFkIHNvbWUgZHVwbGljYXRlZCBhdHRyaWJ1dGUsIGZpeCBzbyBmaXJzdCB3aW5zCiAgICAgICAgICAgICAgICB0b2tlblsiZGF0YSJdLnVwZGF0ZShyYXdbOjotMV0pCgogICAgICAgIHJldHVybiB0b2tlbgoKICAgIGRlZiBhZGp1c3RNYXRoTUxBdHRyaWJ1dGVzKHNlbGYsIHRva2VuKToKICAgICAgICBhZGp1c3RfYXR0cmlidXRlcyh0b2tlbiwgYWRqdXN0TWF0aE1MQXR0cmlidXRlcykKCiAgICBkZWYgYWRqdXN0U1ZHQXR0cmlidXRlcyhzZWxmLCB0b2tlbik6CiAgICAgICAgYWRqdXN0X2F0dHJpYnV0ZXModG9rZW4sIGFkanVzdFNWR0F0dHJpYnV0ZXMpCgogICAgZGVmIGFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzKHNlbGYsIHRva2VuKToKICAgICAgICBhZGp1c3RfYXR0cmlidXRlcyh0b2tlbiwgYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXNNYXApCgogICAgZGVmIHJlcGFyc2VUb2tlbk5vcm1hbChzZWxmLCB0b2tlbik6CiAgICAgICAgIyBweWxpbnQ6ZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKICAgICAgICBzZWxmLnBhcnNlci5waGFzZSgpCgogICAgZGVmIHJlc2V0SW5zZXJ0aW9uTW9kZShzZWxmKToKICAgICAgICAjIFRoZSBuYW1lIG9mIHRoaXMgbWV0aG9kIGlzIG1vc3RseSBoaXN0b3JpY2FsLiAoSXQncyBhbHNvIHVzZWQgaW4gdGhlCiAgICAgICAgIyBzcGVjaWZpY2F0aW9uLikKICAgICAgICBsYXN0ID0gRmFsc2UKICAgICAgICBuZXdNb2RlcyA9IHsKICAgICAgICAgICAgInNlbGVjdCI6ICJpblNlbGVjdCIsCiAgICAgICAgICAgICJ0ZCI6ICJpbkNlbGwiLAogICAgICAgICAgICAidGgiOiAiaW5DZWxsIiwKICAgICAgICAgICAgInRyIjogImluUm93IiwKICAgICAgICAgICAgInRib2R5IjogImluVGFibGVCb2R5IiwKICAgICAgICAgICAgInRoZWFkIjogImluVGFibGVCb2R5IiwKICAgICAgICAgICAgInRmb290IjogImluVGFibGVCb2R5IiwKICAgICAgICAgICAgImNhcHRpb24iOiAiaW5DYXB0aW9uIiwKICAgICAgICAgICAgImNvbGdyb3VwIjogImluQ29sdW1uR3JvdXAiLAogICAgICAgICAgICAidGFibGUiOiAiaW5UYWJsZSIsCiAgICAgICAgICAgICJoZWFkIjogImluQm9keSIsCiAgICAgICAgICAgICJib2R5IjogImluQm9keSIsCiAgICAgICAgICAgICJmcmFtZXNldCI6ICJpbkZyYW1lc2V0IiwKICAgICAgICAgICAgImh0bWwiOiAiYmVmb3JlSGVhZCIKICAgICAgICB9CiAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi50cmVlLm9wZW5FbGVtZW50c1s6Oi0xXToKICAgICAgICAgICAgbm9kZU5hbWUgPSBub2RlLm5hbWUKICAgICAgICAgICAgbmV3X3BoYXNlID0gTm9uZQogICAgICAgICAgICBpZiBub2RlID09IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMF06CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5pbm5lckhUTUwKICAgICAgICAgICAgICAgIGxhc3QgPSBUcnVlCiAgICAgICAgICAgICAgICBub2RlTmFtZSA9IHNlbGYuaW5uZXJIVE1MCiAgICAgICAgICAgICMgQ2hlY2sgZm9yIGNvbmRpdGlvbnMgdGhhdCBzaG91bGQgb25seSBoYXBwZW4gaW4gdGhlIGlubmVySFRNTAogICAgICAgICAgICAjIGNhc2UKICAgICAgICAgICAgaWYgbm9kZU5hbWUgaW4gKCJzZWxlY3QiLCAiY29sZ3JvdXAiLCAiaGVhZCIsICJodG1sIik6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5pbm5lckhUTUwKCiAgICAgICAgICAgIGlmIG5vdCBsYXN0IGFuZCBub2RlLm5hbWVzcGFjZSAhPSBzZWxmLnRyZWUuZGVmYXVsdE5hbWVzcGFjZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBpZiBub2RlTmFtZSBpbiBuZXdNb2RlczoKICAgICAgICAgICAgICAgIG5ld19waGFzZSA9IHNlbGYucGhhc2VzW25ld01vZGVzW25vZGVOYW1lXV0KICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgbGFzdDoKICAgICAgICAgICAgICAgIG5ld19waGFzZSA9IHNlbGYucGhhc2VzWyJpbkJvZHkiXQogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgc2VsZi5waGFzZSA9IG5ld19waGFzZQoKICAgIGRlZiBwYXJzZVJDRGF0YVJhd3RleHQoc2VsZiwgdG9rZW4sIGNvbnRlbnRUeXBlKToKICAgICAgICAiIiJHZW5lcmljIFJDREFUQS9SQVdURVhUIFBhcnNpbmcgYWxnb3JpdGhtCiAgICAgICAgY29udGVudFR5cGUgLSBSQ0RBVEEgb3IgUkFXVEVYVAogICAgICAgICIiIgogICAgICAgIGFzc2VydCBjb250ZW50VHlwZSBpbiAoIlJBV1RFWFQiLCAiUkNEQVRBIikKCiAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCgogICAgICAgIGlmIGNvbnRlbnRUeXBlID09ICJSQVdURVhUIjoKICAgICAgICAgICAgc2VsZi50b2tlbml6ZXIuc3RhdGUgPSBzZWxmLnRva2VuaXplci5yYXd0ZXh0U3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuaXplci5zdGF0ZSA9IHNlbGYudG9rZW5pemVyLnJjZGF0YVN0YXRlCgogICAgICAgIHNlbGYub3JpZ2luYWxQaGFzZSA9IHNlbGYucGhhc2UKCiAgICAgICAgc2VsZi5waGFzZSA9IHNlbGYucGhhc2VzWyJ0ZXh0Il0KCgpAX3V0aWxzLm1lbW9pemUKZGVmIGdldFBoYXNlcyhkZWJ1Zyk6CiAgICBkZWYgbG9nKGZ1bmN0aW9uKToKICAgICAgICAiIiJMb2dnZXIgdGhhdCByZWNvcmRzIHdoaWNoIHBoYXNlIHByb2Nlc3NlcyBlYWNoIHRva2VuIiIiCiAgICAgICAgdHlwZV9uYW1lcyA9IGRpY3QoKHZhbHVlLCBrZXkpIGZvciBrZXksIHZhbHVlIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5UeXBlcy5pdGVtcygpKQoKICAgICAgICBkZWYgd3JhcHBlZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICBpZiBmdW5jdGlvbi5fX25hbWVfXy5zdGFydHN3aXRoKCJwcm9jZXNzIikgYW5kIGxlbihhcmdzKSA+IDA6CiAgICAgICAgICAgICAgICB0b2tlbiA9IGFyZ3NbMF0KICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBpbmZvID0geyJ0eXBlIjogdHlwZV9uYW1lc1t0b2tlblsndHlwZSddXX0KICAgICAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgaWYgdG9rZW5bJ3R5cGUnXSBpbiB0YWdUb2tlblR5cGVzOgogICAgICAgICAgICAgICAgICAgIGluZm9bIm5hbWUiXSA9IHRva2VuWyduYW1lJ10KCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5sb2cuYXBwZW5kKChzZWxmLnBhcnNlci50b2tlbml6ZXIuc3RhdGUuX19uYW1lX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5fX2NsYXNzX18uX19uYW1lX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLl9fbmFtZV9fLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbykpCiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNlbGYsICphcmdzLCAqKmt3YXJncykKICAgICAgICByZXR1cm4gd3JhcHBlZAoKICAgIGRlZiBnZXRNZXRhY2xhc3ModXNlX21ldGFjbGFzcywgbWV0YWNsYXNzX2Z1bmMpOgogICAgICAgIGlmIHVzZV9tZXRhY2xhc3M6CiAgICAgICAgICAgIHJldHVybiBtZXRob2RfZGVjb3JhdG9yX21ldGFjbGFzcyhtZXRhY2xhc3NfZnVuYykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gdHlwZQoKICAgICMgcHlsaW50OmRpc2FibGU9dW51c2VkLWFyZ3VtZW50CiAgICBjbGFzcyBQaGFzZSh3aXRoX21ldGFjbGFzcyhnZXRNZXRhY2xhc3MoZGVidWcsIGxvZykpKToKICAgICAgICAiIiJCYXNlIGNsYXNzIGZvciBoZWxwZXIgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBlYWNoIHBoYXNlIG9mIHByb2Nlc3NpbmcKICAgICAgICAiIiIKCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIHNlbGYucGFyc2VyID0gcGFyc2VyCiAgICAgICAgICAgIHNlbGYudHJlZSA9IHRyZWUKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICAgICAgZGVmIHByb2Nlc3NDb21tZW50KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyBGb3IgbW9zdCBwaGFzZXMgdGhlIGZvbGxvd2luZyBpcyBjb3JyZWN0LiBXaGVyZSBpdCdzIG5vdCBpdCB3aWxsIGJlCiAgICAgICAgICAgICMgb3ZlcnJpZGRlbi4KICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydENvbW1lbnQodG9rZW4sIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdKQoKICAgICAgICBkZWYgcHJvY2Vzc0RvY3R5cGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWRvY3R5cGUiKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0VGV4dCh0b2tlblsiZGF0YSJdKQoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRUZXh0KHRva2VuWyJkYXRhIl0pCgogICAgICAgIGRlZiBwcm9jZXNzU3RhcnRUYWcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5zdGFydFRhZ0hhbmRsZXJbdG9rZW5bIm5hbWUiXV0odG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0h0bWwoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5wYXJzZXIuZmlyc3RTdGFydFRhZyBhbmQgdG9rZW5bIm5hbWUiXSA9PSAiaHRtbCI6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJub24taHRtbC1yb290IikKICAgICAgICAgICAgIyBYWFggTmVlZCBhIGNoZWNrIGhlcmUgdG8gc2VlIGlmIHRoZSBmaXJzdCBzdGFydCB0YWcgdG9rZW4gZW1pdHRlZCBpcwogICAgICAgICAgICAjIHRoaXMgdG9rZW4uLi4gSWYgaXQncyBub3QsIGludm9rZSBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkuCiAgICAgICAgICAgIGZvciBhdHRyLCB2YWx1ZSBpbiB0b2tlblsiZGF0YSJdLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiBhdHRyIG5vdCBpbiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzBdLmF0dHJpYnV0ZXM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50c1swXS5hdHRyaWJ1dGVzW2F0dHJdID0gdmFsdWUKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZmlyc3RTdGFydFRhZyA9IEZhbHNlCgogICAgICAgIGRlZiBwcm9jZXNzRW5kVGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZW5kVGFnSGFuZGxlclt0b2tlblsibmFtZSJdXSh0b2tlbikKCiAgICBjbGFzcyBJbml0aWFsUGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcGFzcwoKICAgICAgICBkZWYgcHJvY2Vzc0NvbW1lbnQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0Q29tbWVudCh0b2tlbiwgc2VsZi50cmVlLmRvY3VtZW50KQoKICAgICAgICBkZWYgcHJvY2Vzc0RvY3R5cGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICBwdWJsaWNJZCA9IHRva2VuWyJwdWJsaWNJZCJdCiAgICAgICAgICAgIHN5c3RlbUlkID0gdG9rZW5bInN5c3RlbUlkIl0KICAgICAgICAgICAgY29ycmVjdCA9IHRva2VuWyJjb3JyZWN0Il0KCiAgICAgICAgICAgIGlmIChuYW1lICE9ICJodG1sIiBvciBwdWJsaWNJZCBpcyBub3QgTm9uZSBvcgogICAgICAgICAgICAgICAgICAgIHN5c3RlbUlkIGlzIG5vdCBOb25lIGFuZCBzeXN0ZW1JZCAhPSAiYWJvdXQ6bGVnYWN5LWNvbXBhdCIpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5rbm93bi1kb2N0eXBlIikKCiAgICAgICAgICAgIGlmIHB1YmxpY0lkIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBwdWJsaWNJZCA9ICIiCgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RG9jdHlwZSh0b2tlbikKCiAgICAgICAgICAgIGlmIHB1YmxpY0lkICE9ICIiOgogICAgICAgICAgICAgICAgcHVibGljSWQgPSBwdWJsaWNJZC50cmFuc2xhdGUoYXNjaWlVcHBlcjJMb3dlcikKCiAgICAgICAgICAgIGlmIChub3QgY29ycmVjdCBvciB0b2tlblsibmFtZSJdICE9ICJodG1sIiBvcgogICAgICAgICAgICAgICAgICAgIHB1YmxpY0lkLnN0YXJ0c3dpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICgiKy8vc2lsbWFyaWwvL2R0ZCBodG1sIHBybyB2MHIxMSAxOTk3MDEwMS8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9hZHZhc29mdCBsdGQvL2R0ZCBodG1sIDMuMCBhc3dlZGl0ICsgZXh0ZW5zaW9ucy8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9hcy8vZHRkIGh0bWwgMy4wIGFzd2VkaXQgKyBleHRlbnNpb25zLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIDIuMCBsZXZlbCAxLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIDIuMCBsZXZlbCAyLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIDIuMCBzdHJpY3QgbGV2ZWwgMS8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCAyLjAgc3RyaWN0IGxldmVsIDIvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgMi4wIHN0cmljdC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCAyLjAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgMi4xZS8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCAzLjAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgMy4yIGZpbmFsLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIDMuMi8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCAzLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIGxldmVsIDAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgbGV2ZWwgMS8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCBsZXZlbCAyLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIGxldmVsIDMvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0IGxldmVsIDAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0IGxldmVsIDEvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0IGxldmVsIDIvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0IGxldmVsIDMvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0Ly8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL21ldHJpdXMvL2R0ZCBtZXRyaXVzIHByZXNlbnRhdGlvbmFsLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDIuMCBodG1sIHN0cmljdC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9taWNyb3NvZnQvL2R0ZCBpbnRlcm5ldCBleHBsb3JlciAyLjAgaHRtbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9taWNyb3NvZnQvL2R0ZCBpbnRlcm5ldCBleHBsb3JlciAyLjAgdGFibGVzLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDMuMCBodG1sIHN0cmljdC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9taWNyb3NvZnQvL2R0ZCBpbnRlcm5ldCBleHBsb3JlciAzLjAgaHRtbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9taWNyb3NvZnQvL2R0ZCBpbnRlcm5ldCBleHBsb3JlciAzLjAgdGFibGVzLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL25ldHNjYXBlIGNvbW0uIGNvcnAuLy9kdGQgaHRtbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9uZXRzY2FwZSBjb21tLiBjb3JwLi8vZHRkIHN0cmljdCBodG1sLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL28ncmVpbGx5IGFuZCBhc3NvY2lhdGVzLy9kdGQgaHRtbCAyLjAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vbydyZWlsbHkgYW5kIGFzc29jaWF0ZXMvL2R0ZCBodG1sIGV4dGVuZGVkIDEuMC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9vJ3JlaWxseSBhbmQgYXNzb2NpYXRlcy8vZHRkIGh0bWwgZXh0ZW5kZWQgcmVsYXhlZCAxLjAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vc29mdHF1YWQgc29mdHdhcmUvL2R0ZCBob3RtZXRhbCBwcm8gNi4wOjoxOTk5MDYwMTo6ZXh0ZW5zaW9ucyB0byBodG1sIDQuMC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9zb2Z0cXVhZC8vZHRkIGhvdG1ldGFsIHBybyA0LjA6OjE5OTcxMDEwOjpleHRlbnNpb25zIHRvIGh0bWwgNC4wLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3NweWdsYXNzLy9kdGQgaHRtbCAyLjAgZXh0ZW5kZWQvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vc3EvL2R0ZCBodG1sIDIuMCBob3RtZXRhbCArIGV4dGVuc2lvbnMvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vc3VuIG1pY3Jvc3lzdGVtcyBjb3JwLi8vZHRkIGhvdGphdmEgaHRtbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9zdW4gbWljcm9zeXN0ZW1zIGNvcnAuLy9kdGQgaG90amF2YSBzdHJpY3QgaHRtbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIDMgMTk5NS0wMy0yNC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIDMuMiBkcmFmdC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIDMuMiBmaW5hbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIDMuMi8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIDMuMnMgZHJhZnQvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgZnJhbWVzZXQvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3czYy8vZHRkIGh0bWwgZXhwZXJpbWVudGFsIDE5OTYwNzEyLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3czYy8vZHRkIGh0bWwgZXhwZXJpbWVudGFsIDk3MDQyMS8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCB3MyBodG1sLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3czby8vZHRkIHczIGh0bWwgMy4wLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3dlYnRlY2hzLy9kdGQgbW96aWxsYSBodG1sIDIuMC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93ZWJ0ZWNocy8vZHRkIG1vemlsbGEgaHRtbC8vIikpIG9yCiAgICAgICAgICAgICAgICAgICAgcHVibGljSWQgaW4gKCItLy93M28vL2R0ZCB3MyBodG1sIHN0cmljdCAzLjAvL2VuLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS93M2MvZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC9lbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodG1sIikgb3IKICAgICAgICAgICAgICAgICAgICBwdWJsaWNJZC5zdGFydHN3aXRoKAogICAgICAgICAgICAgICAgICAgICAgICAoIi0vL3czYy8vZHRkIGh0bWwgNC4wMSBmcmFtZXNldC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIDQuMDEgdHJhbnNpdGlvbmFsLy8iKSkgYW5kCiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQgaXMgTm9uZSBvcgogICAgICAgICAgICAgICAgICAgIHN5c3RlbUlkIGFuZCBzeXN0ZW1JZC5sb3dlcigpID09ICJodHRwOi8vd3d3LmlibS5jb20vZGF0YS9kdGQvdjExL2libXhodG1sMS10cmFuc2l0aW9uYWwuZHRkIik6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5jb21wYXRNb2RlID0gInF1aXJrcyIKICAgICAgICAgICAgZWxpZiAocHVibGljSWQuc3RhcnRzd2l0aCgKICAgICAgICAgICAgICAgICAgICAoIi0vL3czYy8vZHRkIHhodG1sIDEuMCBmcmFtZXNldC8vIiwKICAgICAgICAgICAgICAgICAgICAgIi0vL3czYy8vZHRkIHhodG1sIDEuMCB0cmFuc2l0aW9uYWwvLyIpKSBvcgogICAgICAgICAgICAgICAgICBwdWJsaWNJZC5zdGFydHN3aXRoKAogICAgICAgICAgICAgICAgICAgICAgKCItLy93M2MvL2R0ZCBodG1sIDQuMDEgZnJhbWVzZXQvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgIi0vL3czYy8vZHRkIGh0bWwgNC4wMSB0cmFuc2l0aW9uYWwvLyIpKSBhbmQKICAgICAgICAgICAgICAgICAgc3lzdGVtSWQgaXMgbm90IE5vbmUpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuY29tcGF0TW9kZSA9ICJsaW1pdGVkIHF1aXJrcyIKCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJiZWZvcmVIdG1sIl0KCiAgICAgICAgZGVmIGFueXRoaW5nRWxzZShzZWxmKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIuY29tcGF0TW9kZSA9ICJxdWlya3MiCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJiZWZvcmVIdG1sIl0KCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtZG9jdHlwZS1idXQtZ290LWNoYXJzIikKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHByb2Nlc3NTdGFydFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLWRvY3R5cGUtYnV0LWdvdC1zdGFydC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgcHJvY2Vzc0VuZFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLWRvY3R5cGUtYnV0LWdvdC1lbmQtdGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLWRvY3R5cGUtYnV0LWdvdC1lb2YiKQogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgY2xhc3MgQmVmb3JlSHRtbFBoYXNlKFBoYXNlKToKICAgICAgICAjIGhlbHBlciBtZXRob2RzCiAgICAgICAgZGVmIGluc2VydEh0bWxFbGVtZW50KHNlbGYpOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0Um9vdChpbXBsaWVkVGFnVG9rZW4oImh0bWwiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImJlZm9yZUhlYWQiXQoKICAgICAgICAjIG90aGVyCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYuaW5zZXJ0SHRtbEVsZW1lbnQoKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBkZWYgcHJvY2Vzc0NvbW1lbnQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0Q29tbWVudCh0b2tlbiwgc2VsZi50cmVlLmRvY3VtZW50KQoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5pbnNlcnRIdG1sRWxlbWVudCgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgcHJvY2Vzc1N0YXJ0VGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWUiXSA9PSAiaHRtbCI6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5maXJzdFN0YXJ0VGFnID0gVHJ1ZQogICAgICAgICAgICBzZWxmLmluc2VydEh0bWxFbGVtZW50KCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBwcm9jZXNzRW5kVGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWUiXSBub3QgaW4gKCJoZWFkIiwgImJvZHkiLCAiaHRtbCIsICJiciIpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWJlZm9yZS1odG1sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLmluc2VydEh0bWxFbGVtZW50KCkKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgIGNsYXNzIEJlZm9yZUhlYWRQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCJoZWFkIiwgc2VsZi5zdGFydFRhZ0hlYWQpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgoImhlYWQiLCAiYm9keSIsICJodG1sIiwgImJyIiksIHNlbGYuZW5kVGFnSW1wbHlIZWFkKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIZWFkKGltcGxpZWRUYWdUb2tlbigiaGVhZCIsICJTdGFydFRhZyIpKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hlYWQoaW1wbGllZFRhZ1Rva2VuKCJoZWFkIiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdIdG1sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdIZWFkKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5oZWFkUG9pbnRlciA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkhlYWQiXQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIZWFkKGltcGxpZWRUYWdUb2tlbigiaGVhZCIsICJTdGFydFRhZyIpKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ0ltcGx5SGVhZChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIZWFkKGltcGxpZWRUYWdUb2tlbigiaGVhZCIsICJTdGFydFRhZyIpKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZW5kLXRhZy1hZnRlci1pbXBsaWVkLXJvb3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgIGNsYXNzIEluSGVhZFBoYXNlKFBoYXNlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoInRpdGxlIiwgc2VsZi5zdGFydFRhZ1RpdGxlKSwKICAgICAgICAgICAgICAgICgoIm5vZnJhbWVzIiwgInN0eWxlIiksIHNlbGYuc3RhcnRUYWdOb0ZyYW1lc1N0eWxlKSwKICAgICAgICAgICAgICAgICgibm9zY3JpcHQiLCBzZWxmLnN0YXJ0VGFnTm9zY3JpcHQpLAogICAgICAgICAgICAgICAgKCJzY3JpcHQiLCBzZWxmLnN0YXJ0VGFnU2NyaXB0KSwKICAgICAgICAgICAgICAgICgoImJhc2UiLCAiYmFzZWZvbnQiLCAiYmdzb3VuZCIsICJjb21tYW5kIiwgImxpbmsiKSwKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnQmFzZUxpbmtDb21tYW5kKSwKICAgICAgICAgICAgICAgICgibWV0YSIsIHNlbGYuc3RhcnRUYWdNZXRhKSwKICAgICAgICAgICAgICAgICgiaGVhZCIsIHNlbGYuc3RhcnRUYWdIZWFkKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImhlYWQiLCBzZWxmLmVuZFRhZ0hlYWQpLAogICAgICAgICAgICAgICAgKCgiYnIiLCAiaHRtbCIsICJib2R5IiksIHNlbGYuZW5kVGFnSHRtbEJvZHlCcikKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgICMgdGhlIHJlYWwgdGhpbmcKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdIdG1sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdIZWFkKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidHdvLWhlYWRzLWFyZS1ub3QtYmV0dGVyLXRoYW4tb25lIikKCiAgICAgICAgZGVmIHN0YXJ0VGFnQmFzZUxpbmtDb21tYW5kKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgdG9rZW5bInNlbGZDbG9zaW5nQWNrbm93bGVkZ2VkIl0gPSBUcnVlCgogICAgICAgIGRlZiBzdGFydFRhZ01ldGEoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICB0b2tlblsic2VsZkNsb3NpbmdBY2tub3dsZWRnZWQiXSA9IFRydWUKCiAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSB0b2tlblsiZGF0YSJdCiAgICAgICAgICAgIGlmIHNlbGYucGFyc2VyLnRva2VuaXplci5zdHJlYW0uY2hhckVuY29kaW5nWzFdID09ICJ0ZW50YXRpdmUiOgogICAgICAgICAgICAgICAgaWYgImNoYXJzZXQiIGluIGF0dHJpYnV0ZXM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIudG9rZW5pemVyLnN0cmVhbS5jaGFuZ2VFbmNvZGluZyhhdHRyaWJ1dGVzWyJjaGFyc2V0Il0pCiAgICAgICAgICAgICAgICBlbGlmICgiY29udGVudCIgaW4gYXR0cmlidXRlcyBhbmQKICAgICAgICAgICAgICAgICAgICAgICJodHRwLWVxdWl2IiBpbiBhdHRyaWJ1dGVzIGFuZAogICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1siaHR0cC1lcXVpdiJdLmxvd2VyKCkgPT0gImNvbnRlbnQtdHlwZSIpOgogICAgICAgICAgICAgICAgICAgICMgRW5jb2RpbmcgaXQgYXMgVVRGLTggaGVyZSBpcyBhIGhhY2ssIGFzIHJlYWxseSB3ZSBzaG91bGQgcGFzcwogICAgICAgICAgICAgICAgICAgICMgdGhlIGFic3RyYWN0IFVuaWNvZGUgc3RyaW5nLCBhbmQganVzdCB1c2UgdGhlCiAgICAgICAgICAgICAgICAgICAgIyBDb250ZW50QXR0clBhcnNlciBvbiB0aGF0LCBidXQgdXNpbmcgVVRGLTggYWxsb3dzIGFsbCBjaGFycwogICAgICAgICAgICAgICAgICAgICMgdG8gYmUgZW5jb2RlZCBhbmQgYXMgYSBBU0NJSS1zdXBlcnNldCB3b3Jrcy4KICAgICAgICAgICAgICAgICAgICBkYXRhID0gX2lucHV0c3RyZWFtLkVuY29kaW5nQnl0ZXMoYXR0cmlidXRlc1siY29udGVudCJdLmVuY29kZSgidXRmLTgiKSkKICAgICAgICAgICAgICAgICAgICBwYXJzZXIgPSBfaW5wdXRzdHJlYW0uQ29udGVudEF0dHJQYXJzZXIoZGF0YSkKICAgICAgICAgICAgICAgICAgICBjb2RlYyA9IHBhcnNlci5wYXJzZSgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIudG9rZW5pemVyLnN0cmVhbS5jaGFuZ2VFbmNvZGluZyhjb2RlYykKCiAgICAgICAgZGVmIHN0YXJ0VGFnVGl0bGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZVJDRGF0YVJhd3RleHQodG9rZW4sICJSQ0RBVEEiKQoKICAgICAgICBkZWYgc3RhcnRUYWdOb0ZyYW1lc1N0eWxlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyBOZWVkIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGltcGxlbWVudCB0aGUgc2NyaXB0aW5nLWRpc2FibGVkIGNhc2UKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VSQ0RhdGFSYXd0ZXh0KHRva2VuLCAiUkFXVEVYVCIpCgogICAgICAgIGRlZiBzdGFydFRhZ05vc2NyaXB0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi5wYXJzZXIuc2NyaXB0aW5nOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VSQ0RhdGFSYXd0ZXh0KHRva2VuLCAiUkFXVEVYVCIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkhlYWROb3NjcmlwdCJdCgogICAgICAgIGRlZiBzdGFydFRhZ1NjcmlwdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci50b2tlbml6ZXIuc3RhdGUgPSBzZWxmLnBhcnNlci50b2tlbml6ZXIuc2NyaXB0RGF0YVN0YXRlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLm9yaWdpbmFsUGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1sidGV4dCJdCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ0hlYWQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBub2RlID0gc2VsZi5wYXJzZXIudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgYXNzZXJ0IG5vZGUubmFtZSA9PSAiaGVhZCIsICJFeHBlY3RlZCBoZWFkIGdvdCAlcyIgJSBub2RlLm5hbWUKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImFmdGVySGVhZCJdCgogICAgICAgIGRlZiBlbmRUYWdIdG1sQm9keUJyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBhbnl0aGluZ0Vsc2Uoc2VsZik6CiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGVhZChpbXBsaWVkVGFnVG9rZW4oImhlYWQiKSkKCiAgICBjbGFzcyBJbkhlYWROb3NjcmlwdFBoYXNlKFBoYXNlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoKCJiYXNlZm9udCIsICJiZ3NvdW5kIiwgImxpbmsiLCAibWV0YSIsICJub2ZyYW1lcyIsICJzdHlsZSIpLCBzZWxmLnN0YXJ0VGFnQmFzZUxpbmtDb21tYW5kKSwKICAgICAgICAgICAgICAgICgoImhlYWQiLCAibm9zY3JpcHQiKSwgc2VsZi5zdGFydFRhZ0hlYWROb3NjcmlwdCksCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgibm9zY3JpcHQiLCBzZWxmLmVuZFRhZ05vc2NyaXB0KSwKICAgICAgICAgICAgICAgICgiYnIiLCBzZWxmLmVuZFRhZ0JyKSwKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJlb2YtaW4taGVhZC1ub3NjcmlwdCIpCiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZGVmIHByb2Nlc3NDb21tZW50KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkIl0ucHJvY2Vzc0NvbW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImNoYXItaW4taGVhZC1ub3NjcmlwdCIpCiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkIl0ucHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnSHRtbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnQmFzZUxpbmtDb21tYW5kKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkIl0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdIZWFkTm9zY3JpcHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtaW5oZWFkLW5vc2NyaXB0LXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnTm9zY3JpcHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBub2RlID0gc2VsZi5wYXJzZXIudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgYXNzZXJ0IG5vZGUubmFtZSA9PSAibm9zY3JpcHQiLCAiRXhwZWN0ZWQgbm9zY3JpcHQgZ290ICVzIiAlIG5vZGUubmFtZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkIl0KCiAgICAgICAgZGVmIGVuZFRhZ0JyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1pbmhlYWQtbm9zY3JpcHQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgYW55dGhpbmdFbHNlKHNlbGYpOgogICAgICAgICAgICAjIENhbGxlciBtdXN0IHJhaXNlIHBhcnNlIGVycm9yIGZpcnN0IQogICAgICAgICAgICBzZWxmLmVuZFRhZ05vc2NyaXB0KGltcGxpZWRUYWdUb2tlbigibm9zY3JpcHQiKSkKCiAgICBjbGFzcyBBZnRlckhlYWRQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCJib2R5Iiwgc2VsZi5zdGFydFRhZ0JvZHkpLAogICAgICAgICAgICAgICAgKCJmcmFtZXNldCIsIHNlbGYuc3RhcnRUYWdGcmFtZXNldCksCiAgICAgICAgICAgICAgICAoKCJiYXNlIiwgImJhc2Vmb250IiwgImJnc291bmQiLCAibGluayIsICJtZXRhIiwgIm5vZnJhbWVzIiwgInNjcmlwdCIsCiAgICAgICAgICAgICAgICAgICJzdHlsZSIsICJ0aXRsZSIpLAogICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdGcm9tSGVhZCksCiAgICAgICAgICAgICAgICAoImhlYWQiLCBzZWxmLnN0YXJ0VGFnSGVhZCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbKCgiYm9keSIsICJodG1sIiwgImJyIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdIdG1sQm9keUJyKV0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdIdG1sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdCb2R5KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0KCiAgICAgICAgZGVmIHN0YXJ0VGFnRnJhbWVzZXQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluRnJhbWVzZXQiXQoKICAgICAgICBkZWYgc3RhcnRUYWdGcm9tSGVhZChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLW91dC1vZi1teS1oZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5hcHBlbmQoc2VsZi50cmVlLmhlYWRQb2ludGVyKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKICAgICAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi50cmVlLm9wZW5FbGVtZW50c1s6Oi0xXToKICAgICAgICAgICAgICAgIGlmIG5vZGUubmFtZSA9PSAiaGVhZCI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5yZW1vdmUobm9kZSkKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICBkZWYgc3RhcnRUYWdIZWFkKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnSHRtbEJvZHlCcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgYW55dGhpbmdFbHNlKHNlbGYpOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudChpbXBsaWVkVGFnVG9rZW4oImJvZHkiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBUcnVlCgogICAgY2xhc3MgSW5Cb2R5UGhhc2UoUGhhc2UpOgogICAgICAgICMgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jcGFyc2luZy1tYWluLWluYm9keQogICAgICAgICMgdGhlIHJlYWxseS1yZWFsbHktcmVhbGx5LXZlcnkgY3JhenkgbW9kZQogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICAjIFNldCB0aGlzIHRvIHRoZSBkZWZhdWx0IGhhbmRsZXIKICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzID0gc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzTm9uUHJlCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgoImJhc2UiLCAiYmFzZWZvbnQiLCAiYmdzb3VuZCIsICJjb21tYW5kIiwgImxpbmsiLCAibWV0YSIsCiAgICAgICAgICAgICAgICAgICJzY3JpcHQiLCAic3R5bGUiLCAidGl0bGUiKSwKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnUHJvY2Vzc0luSGVhZCksCiAgICAgICAgICAgICAgICAoImJvZHkiLCBzZWxmLnN0YXJ0VGFnQm9keSksCiAgICAgICAgICAgICAgICAoImZyYW1lc2V0Iiwgc2VsZi5zdGFydFRhZ0ZyYW1lc2V0KSwKICAgICAgICAgICAgICAgICgoImFkZHJlc3MiLCAiYXJ0aWNsZSIsICJhc2lkZSIsICJibG9ja3F1b3RlIiwgImNlbnRlciIsICJkZXRhaWxzIiwKICAgICAgICAgICAgICAgICAgImRpciIsICJkaXYiLCAiZGwiLCAiZmllbGRzZXQiLCAiZmlnY2FwdGlvbiIsICJmaWd1cmUiLAogICAgICAgICAgICAgICAgICAiZm9vdGVyIiwgImhlYWRlciIsICJoZ3JvdXAiLCAibWFpbiIsICJtZW51IiwgIm5hdiIsICJvbCIsICJwIiwKICAgICAgICAgICAgICAgICAgInNlY3Rpb24iLCAic3VtbWFyeSIsICJ1bCIpLAogICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdDbG9zZVApLAogICAgICAgICAgICAgICAgKGhlYWRpbmdFbGVtZW50cywgc2VsZi5zdGFydFRhZ0hlYWRpbmcpLAogICAgICAgICAgICAgICAgKCgicHJlIiwgImxpc3RpbmciKSwgc2VsZi5zdGFydFRhZ1ByZUxpc3RpbmcpLAogICAgICAgICAgICAgICAgKCJmb3JtIiwgc2VsZi5zdGFydFRhZ0Zvcm0pLAogICAgICAgICAgICAgICAgKCgibGkiLCAiZGQiLCAiZHQiKSwgc2VsZi5zdGFydFRhZ0xpc3RJdGVtKSwKICAgICAgICAgICAgICAgICgicGxhaW50ZXh0Iiwgc2VsZi5zdGFydFRhZ1BsYWludGV4dCksCiAgICAgICAgICAgICAgICAoImEiLCBzZWxmLnN0YXJ0VGFnQSksCiAgICAgICAgICAgICAgICAoKCJiIiwgImJpZyIsICJjb2RlIiwgImVtIiwgImZvbnQiLCAiaSIsICJzIiwgInNtYWxsIiwgInN0cmlrZSIsCiAgICAgICAgICAgICAgICAgICJzdHJvbmciLCAidHQiLCAidSIpLCBzZWxmLnN0YXJ0VGFnRm9ybWF0dGluZyksCiAgICAgICAgICAgICAgICAoIm5vYnIiLCBzZWxmLnN0YXJ0VGFnTm9iciksCiAgICAgICAgICAgICAgICAoImJ1dHRvbiIsIHNlbGYuc3RhcnRUYWdCdXR0b24pLAogICAgICAgICAgICAgICAgKCgiYXBwbGV0IiwgIm1hcnF1ZWUiLCAib2JqZWN0IiksIHNlbGYuc3RhcnRUYWdBcHBsZXRNYXJxdWVlT2JqZWN0KSwKICAgICAgICAgICAgICAgICgieG1wIiwgc2VsZi5zdGFydFRhZ1htcCksCiAgICAgICAgICAgICAgICAoInRhYmxlIiwgc2VsZi5zdGFydFRhZ1RhYmxlKSwKICAgICAgICAgICAgICAgICgoImFyZWEiLCAiYnIiLCAiZW1iZWQiLCAiaW1nIiwgImtleWdlbiIsICJ3YnIiKSwKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnVm9pZEZvcm1hdHRpbmcpLAogICAgICAgICAgICAgICAgKCgicGFyYW0iLCAic291cmNlIiwgInRyYWNrIiksIHNlbGYuc3RhcnRUYWdQYXJhbVNvdXJjZSksCiAgICAgICAgICAgICAgICAoImlucHV0Iiwgc2VsZi5zdGFydFRhZ0lucHV0KSwKICAgICAgICAgICAgICAgICgiaHIiLCBzZWxmLnN0YXJ0VGFnSHIpLAogICAgICAgICAgICAgICAgKCJpbWFnZSIsIHNlbGYuc3RhcnRUYWdJbWFnZSksCiAgICAgICAgICAgICAgICAoImlzaW5kZXgiLCBzZWxmLnN0YXJ0VGFnSXNJbmRleCksCiAgICAgICAgICAgICAgICAoInRleHRhcmVhIiwgc2VsZi5zdGFydFRhZ1RleHRhcmVhKSwKICAgICAgICAgICAgICAgICgiaWZyYW1lIiwgc2VsZi5zdGFydFRhZ0lGcmFtZSksCiAgICAgICAgICAgICAgICAoIm5vc2NyaXB0Iiwgc2VsZi5zdGFydFRhZ05vc2NyaXB0KSwKICAgICAgICAgICAgICAgICgoIm5vZW1iZWQiLCAibm9mcmFtZXMiKSwgc2VsZi5zdGFydFRhZ1Jhd3RleHQpLAogICAgICAgICAgICAgICAgKCJzZWxlY3QiLCBzZWxmLnN0YXJ0VGFnU2VsZWN0KSwKICAgICAgICAgICAgICAgICgoInJwIiwgInJ0IiksIHNlbGYuc3RhcnRUYWdScFJ0KSwKICAgICAgICAgICAgICAgICgoIm9wdGlvbiIsICJvcHRncm91cCIpLCBzZWxmLnN0YXJ0VGFnT3B0KSwKICAgICAgICAgICAgICAgICgoIm1hdGgiKSwgc2VsZi5zdGFydFRhZ01hdGgpLAogICAgICAgICAgICAgICAgKCgic3ZnIiksIHNlbGYuc3RhcnRUYWdTdmcpLAogICAgICAgICAgICAgICAgKCgiY2FwdGlvbiIsICJjb2wiLCAiY29sZ3JvdXAiLCAiZnJhbWUiLCAiaGVhZCIsCiAgICAgICAgICAgICAgICAgICJ0Ym9keSIsICJ0ZCIsICJ0Zm9vdCIsICJ0aCIsICJ0aGVhZCIsCiAgICAgICAgICAgICAgICAgICJ0ciIpLCBzZWxmLnN0YXJ0VGFnTWlzcGxhY2VkKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImJvZHkiLCBzZWxmLmVuZFRhZ0JvZHkpLAogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5lbmRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgoImFkZHJlc3MiLCAiYXJ0aWNsZSIsICJhc2lkZSIsICJibG9ja3F1b3RlIiwgImJ1dHRvbiIsICJjZW50ZXIiLAogICAgICAgICAgICAgICAgICAiZGV0YWlscyIsICJkaWFsb2ciLCAiZGlyIiwgImRpdiIsICJkbCIsICJmaWVsZHNldCIsICJmaWdjYXB0aW9uIiwgImZpZ3VyZSIsCiAgICAgICAgICAgICAgICAgICJmb290ZXIiLCAiaGVhZGVyIiwgImhncm91cCIsICJsaXN0aW5nIiwgIm1haW4iLCAibWVudSIsICJuYXYiLCAib2wiLCAicHJlIiwKICAgICAgICAgICAgICAgICAgInNlY3Rpb24iLCAic3VtbWFyeSIsICJ1bCIpLCBzZWxmLmVuZFRhZ0Jsb2NrKSwKICAgICAgICAgICAgICAgICgiZm9ybSIsIHNlbGYuZW5kVGFnRm9ybSksCiAgICAgICAgICAgICAgICAoInAiLCBzZWxmLmVuZFRhZ1ApLAogICAgICAgICAgICAgICAgKCgiZGQiLCAiZHQiLCAibGkiKSwgc2VsZi5lbmRUYWdMaXN0SXRlbSksCiAgICAgICAgICAgICAgICAoaGVhZGluZ0VsZW1lbnRzLCBzZWxmLmVuZFRhZ0hlYWRpbmcpLAogICAgICAgICAgICAgICAgKCgiYSIsICJiIiwgImJpZyIsICJjb2RlIiwgImVtIiwgImZvbnQiLCAiaSIsICJub2JyIiwgInMiLCAic21hbGwiLAogICAgICAgICAgICAgICAgICAic3RyaWtlIiwgInN0cm9uZyIsICJ0dCIsICJ1IiksIHNlbGYuZW5kVGFnRm9ybWF0dGluZyksCiAgICAgICAgICAgICAgICAoKCJhcHBsZXQiLCAibWFycXVlZSIsICJvYmplY3QiKSwgc2VsZi5lbmRUYWdBcHBsZXRNYXJxdWVlT2JqZWN0KSwKICAgICAgICAgICAgICAgICgiYnIiLCBzZWxmLmVuZFRhZ0JyKSwKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgIGRlZiBpc01hdGNoaW5nRm9ybWF0dGluZ0VsZW1lbnQoc2VsZiwgbm9kZTEsIG5vZGUyKToKICAgICAgICAgICAgcmV0dXJuIChub2RlMS5uYW1lID09IG5vZGUyLm5hbWUgYW5kCiAgICAgICAgICAgICAgICAgICAgbm9kZTEubmFtZXNwYWNlID09IG5vZGUyLm5hbWVzcGFjZSBhbmQKICAgICAgICAgICAgICAgICAgICBub2RlMS5hdHRyaWJ1dGVzID09IG5vZGUyLmF0dHJpYnV0ZXMpCgogICAgICAgICMgaGVscGVyCiAgICAgICAgZGVmIGFkZEZvcm1hdHRpbmdFbGVtZW50KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIGVsZW1lbnQgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXQoKICAgICAgICAgICAgbWF0Y2hpbmdFbGVtZW50cyA9IFtdCiAgICAgICAgICAgIGZvciBub2RlIGluIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHNbOjotMV06CiAgICAgICAgICAgICAgICBpZiBub2RlIGlzIE1hcmtlcjoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxpZiBzZWxmLmlzTWF0Y2hpbmdGb3JtYXR0aW5nRWxlbWVudChub2RlLCBlbGVtZW50KToKICAgICAgICAgICAgICAgICAgICBtYXRjaGluZ0VsZW1lbnRzLmFwcGVuZChub2RlKQoKICAgICAgICAgICAgYXNzZXJ0IGxlbihtYXRjaGluZ0VsZW1lbnRzKSA8PSAzCiAgICAgICAgICAgIGlmIGxlbihtYXRjaGluZ0VsZW1lbnRzKSA9PSAzOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5yZW1vdmUobWF0Y2hpbmdFbGVtZW50c1stMV0pCiAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuYXBwZW5kKGVsZW1lbnQpCgogICAgICAgICMgdGhlIHJlYWwgZGVhbAogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBhbGxvd2VkX2VsZW1lbnRzID0gZnJvemVuc2V0KCgiZGQiLCAiZHQiLCAibGkiLCAicCIsICJ0Ym9keSIsICJ0ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0Zm9vdCIsICJ0aCIsICJ0aGVhZCIsICJ0ciIsICJib2R5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0bWwiKSkKICAgICAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi50cmVlLm9wZW5FbGVtZW50c1s6Oi0xXToKICAgICAgICAgICAgICAgIGlmIG5vZGUubmFtZSBub3QgaW4gYWxsb3dlZF9lbGVtZW50czoKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1jbG9zaW5nLXRhZy1idXQtZ290LWVvZiIpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIyBTdG9wIHBhcnNpbmcKCiAgICAgICAgZGVmIHByb2Nlc3NTcGFjZUNoYXJhY3RlcnNEcm9wTmV3bGluZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgU29tZXRpbWVzIChzdGFydCBvZiA8cHJlPiwgPGxpc3Rpbmc+LCBhbmQgPHRleHRhcmVhPiBibG9ja3MpIHdlCiAgICAgICAgICAgICMgd2FudCB0byBkcm9wIGxlYWRpbmcgbmV3bGluZXMKICAgICAgICAgICAgZGF0YSA9IHRva2VuWyJkYXRhIl0KICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzID0gc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzTm9uUHJlCiAgICAgICAgICAgIGlmIChkYXRhLnN0YXJ0c3dpdGgoIlxuIikgYW5kCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lIGluICgicHJlIiwgImxpc3RpbmciLCAidGV4dGFyZWEiKSBhbmQKICAgICAgICAgICAgICAgICAgICBub3Qgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0uaGFzQ29udGVudCgpKToKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhWzE6XQogICAgICAgICAgICBpZiBkYXRhOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRUZXh0KGRhdGEpCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHRva2VuWyJkYXRhIl0gPT0gIlx1MDAwMCI6CiAgICAgICAgICAgICAgICAjIFRoZSB0b2tlbml6ZXIgc2hvdWxkIGFsd2F5cyBlbWl0IG51bGwgb24gaXRzIG93bgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRUZXh0KHRva2VuWyJkYXRhIl0pCiAgICAgICAgICAgICMgVGhpcyBtdXN0IGJlIGJhZCBmb3IgcGVyZm9ybWFuY2UKICAgICAgICAgICAgaWYgKHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgYW5kCiAgICAgICAgICAgICAgICBhbnkoW2NoYXIgbm90IGluIHNwYWNlQ2hhcmFjdGVycwogICAgICAgICAgICAgICAgICAgICBmb3IgY2hhciBpbiB0b2tlblsiZGF0YSJdXSkpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzTm9uUHJlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydFRleHQodG9rZW5bImRhdGEiXSkKCiAgICAgICAgZGVmIHN0YXJ0VGFnUHJvY2Vzc0luSGVhZChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnQm9keShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnIiwgeyJuYW1lIjogImJvZHkifSkKICAgICAgICAgICAgaWYgKGxlbihzZWxmLnRyZWUub3BlbkVsZW1lbnRzKSA9PSAxIG9yCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50c1sxXS5uYW1lICE9ICJib2R5Iik6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKICAgICAgICAgICAgICAgIGZvciBhdHRyLCB2YWx1ZSBpbiB0b2tlblsiZGF0YSJdLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgaWYgYXR0ciBub3QgaW4gc2VsZi50cmVlLm9wZW5FbGVtZW50c1sxXS5hdHRyaWJ1dGVzOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzFdLmF0dHJpYnV0ZXNbYXR0cl0gPSB2YWx1ZQoKICAgICAgICBkZWYgc3RhcnRUYWdGcmFtZXNldChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnIiwgeyJuYW1lIjogImZyYW1lc2V0In0pCiAgICAgICAgICAgIGlmIChsZW4oc2VsZi50cmVlLm9wZW5FbGVtZW50cykgPT0gMSBvciBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzFdLm5hbWUgIT0gImJvZHkiKToKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKICAgICAgICAgICAgZWxpZiBub3Qgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSzoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMV0ucGFyZW50OgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMV0ucGFyZW50LnJlbW92ZUNoaWxkKHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMV0pCiAgICAgICAgICAgICAgICB3aGlsZSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9ICJodG1sIjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkZyYW1lc2V0Il0KCiAgICAgICAgZGVmIHN0YXJ0VGFnQ2xvc2VQKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJwIiwgdmFyaWFudD0iYnV0dG9uIik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1AoaW1wbGllZFRhZ1Rva2VuKCJwIikpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdQcmVMaXN0aW5nKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJwIiwgdmFyaWFudD0iYnV0dG9uIik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1AoaW1wbGllZFRhZ1Rva2VuKCJwIikpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzID0gc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzRHJvcE5ld2xpbmUKCiAgICAgICAgZGVmIHN0YXJ0VGFnRm9ybShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5mb3JtUG9pbnRlcjoKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnIiwgeyJuYW1lIjogImZvcm0ifSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicCIsIHZhcmlhbnQ9ImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnUChpbXBsaWVkVGFnVG9rZW4oInAiKSkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLmZvcm1Qb2ludGVyID0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0KCiAgICAgICAgZGVmIHN0YXJ0VGFnTGlzdEl0ZW0oc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKCiAgICAgICAgICAgIHN0b3BOYW1lc01hcCA9IHsibGkiOiBbImxpIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHQiOiBbImR0IiwgImRkIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGQiOiBbImR0IiwgImRkIl19CiAgICAgICAgICAgIHN0b3BOYW1lcyA9IHN0b3BOYW1lc01hcFt0b2tlblsibmFtZSJdXQogICAgICAgICAgICBmb3Igbm9kZSBpbiByZXZlcnNlZChzZWxmLnRyZWUub3BlbkVsZW1lbnRzKToKICAgICAgICAgICAgICAgIGlmIG5vZGUubmFtZSBpbiBzdG9wTmFtZXM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UucHJvY2Vzc0VuZFRhZygKICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGllZFRhZ1Rva2VuKG5vZGUubmFtZSwgIkVuZFRhZyIpKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBpZiAobm9kZS5uYW1lVHVwbGUgaW4gc3BlY2lhbEVsZW1lbnRzIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5hbWUgbm90IGluICgiYWRkcmVzcyIsICJkaXYiLCAicCIpKToKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJwIiwgdmFyaWFudD0iYnV0dG9uIik6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5wcm9jZXNzRW5kVGFnKAogICAgICAgICAgICAgICAgICAgIGltcGxpZWRUYWdUb2tlbigicCIsICJFbmRUYWciKSkKCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdQbGFpbnRleHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInAiLCB2YXJpYW50PSJidXR0b24iKToKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnUChpbXBsaWVkVGFnVG9rZW4oInAiKSkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnRva2VuaXplci5zdGF0ZSA9IHNlbGYucGFyc2VyLnRva2VuaXplci5wbGFpbnRleHRTdGF0ZQoKICAgICAgICBkZWYgc3RhcnRUYWdIZWFkaW5nKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJwIiwgdmFyaWFudD0iYnV0dG9uIik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1AoaW1wbGllZFRhZ1Rva2VuKCJwIikpCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgaW4gaGVhZGluZ0VsZW1lbnRzOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0Eoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBhZmVBRWxlbWVudCA9IHNlbGYudHJlZS5lbGVtZW50SW5BY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoImEiKQogICAgICAgICAgICBpZiBhZmVBRWxlbWVudDoKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWltcGxpZXMtZW5kLXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsic3RhcnROYW1lIjogImEiLCAiZW5kTmFtZSI6ICJhIn0pCiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ0Zvcm1hdHRpbmcoaW1wbGllZFRhZ1Rva2VuKCJhIikpCiAgICAgICAgICAgICAgICBpZiBhZmVBRWxlbWVudCBpbiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucmVtb3ZlKGFmZUFFbGVtZW50KQogICAgICAgICAgICAgICAgaWYgYWZlQUVsZW1lbnQgaW4gc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50czoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLnJlbW92ZShhZmVBRWxlbWVudCkKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi5hZGRGb3JtYXR0aW5nRWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnRm9ybWF0dGluZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYuYWRkRm9ybWF0dGluZ0VsZW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ05vYnIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoIm5vYnIiKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWltcGxpZXMtZW5kLXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsic3RhcnROYW1lIjogIm5vYnIiLCAiZW5kTmFtZSI6ICJub2JyIn0pCiAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NFbmRUYWcoaW1wbGllZFRhZ1Rva2VuKCJub2JyIikpCiAgICAgICAgICAgICAgICAjIFhYWCBOZWVkIHRlc3RzIHRoYXQgdHJpZ2dlciB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLmFkZEZvcm1hdHRpbmdFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdCdXR0b24oc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWctaW1wbGllcy1lbmQtdGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJzdGFydE5hbWUiOiAiYnV0dG9uIiwgImVuZE5hbWUiOiAiYnV0dG9uIn0pCiAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NFbmRUYWcoaW1wbGllZFRhZ1Rva2VuKCJidXR0b24iKSkKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCgogICAgICAgIGRlZiBzdGFydFRhZ0FwcGxldE1hcnF1ZWVPYmplY3Qoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5hcHBlbmQoTWFya2VyKQogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKCiAgICAgICAgZGVmIHN0YXJ0VGFnWG1wKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJwIiwgdmFyaWFudD0iYnV0dG9uIik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1AoaW1wbGllZFRhZ1Rva2VuKCJwIikpCiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZVJDRGF0YVJhd3RleHQodG9rZW4sICJSQVdURVhUIikKCiAgICAgICAgZGVmIHN0YXJ0VGFnVGFibGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnBhcnNlci5jb21wYXRNb2RlICE9ICJxdWlya3MiOgogICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJwIiwgdmFyaWFudD0iYnV0dG9uIik6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzRW5kVGFnKGltcGxpZWRUYWdUb2tlbigicCIpKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0KCiAgICAgICAgZGVmIHN0YXJ0VGFnVm9pZEZvcm1hdHRpbmcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICB0b2tlblsic2VsZkNsb3NpbmdBY2tub3dsZWRnZWQiXSA9IFRydWUKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCgogICAgICAgIGRlZiBzdGFydFRhZ0lucHV0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgZnJhbWVzZXRPSyA9IHNlbGYucGFyc2VyLmZyYW1lc2V0T0sKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ1ZvaWRGb3JtYXR0aW5nKHRva2VuKQogICAgICAgICAgICBpZiAoInR5cGUiIGluIHRva2VuWyJkYXRhIl0gYW5kCiAgICAgICAgICAgICAgICAgICAgdG9rZW5bImRhdGEiXVsidHlwZSJdLnRyYW5zbGF0ZShhc2NpaVVwcGVyMkxvd2VyKSA9PSAiaGlkZGVuIik6CiAgICAgICAgICAgICAgICAjIGlucHV0IHR5cGU9aGlkZGVuIGRvZXNuJ3QgY2hhbmdlIGZyYW1lc2V0T0sKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBmcmFtZXNldE9LCgogICAgICAgIGRlZiBzdGFydFRhZ1BhcmFtU291cmNlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgdG9rZW5bInNlbGZDbG9zaW5nQWNrbm93bGVkZ2VkIl0gPSBUcnVlCgogICAgICAgIGRlZiBzdGFydFRhZ0hyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJwIiwgdmFyaWFudD0iYnV0dG9uIik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1AoaW1wbGllZFRhZ1Rva2VuKCJwIikpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIHRva2VuWyJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCJdID0gVHJ1ZQogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKCiAgICAgICAgZGVmIHN0YXJ0VGFnSW1hZ2Uoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAjIE5vIHJlYWxseS4uLgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy10cmVhdGVkLWFzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im9yaWdpbmFsTmFtZSI6ICJpbWFnZSIsICJuZXdOYW1lIjogImltZyJ9KQogICAgICAgICAgICBzZWxmLnByb2Nlc3NTdGFydFRhZyhpbXBsaWVkVGFnVG9rZW4oImltZyIsICJTdGFydFRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzPXRva2VuWyJkYXRhIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmQ2xvc2luZz10b2tlblsic2VsZkNsb3NpbmciXSkpCgogICAgICAgIGRlZiBzdGFydFRhZ0lzSW5kZXgoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJkZXByZWNhdGVkLXRhZyIsIHsibmFtZSI6ICJpc2luZGV4In0pCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5mb3JtUG9pbnRlcjoKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBmb3JtX2F0dHJzID0ge30KICAgICAgICAgICAgaWYgImFjdGlvbiIgaW4gdG9rZW5bImRhdGEiXToKICAgICAgICAgICAgICAgIGZvcm1fYXR0cnNbImFjdGlvbiJdID0gdG9rZW5bImRhdGEiXVsiYWN0aW9uIl0KICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3RhcnRUYWcoaW1wbGllZFRhZ1Rva2VuKCJmb3JtIiwgIlN0YXJ0VGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM9Zm9ybV9hdHRycykpCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc1N0YXJ0VGFnKGltcGxpZWRUYWdUb2tlbigiaHIiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3RhcnRUYWcoaW1wbGllZFRhZ1Rva2VuKCJsYWJlbCIsICJTdGFydFRhZyIpKQogICAgICAgICAgICAjIFhYWCBMb2NhbGl6YXRpb24gLi4uCiAgICAgICAgICAgIGlmICJwcm9tcHQiIGluIHRva2VuWyJkYXRhIl06CiAgICAgICAgICAgICAgICBwcm9tcHQgPSB0b2tlblsiZGF0YSJdWyJwcm9tcHQiXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcHJvbXB0ID0gIlRoaXMgaXMgYSBzZWFyY2hhYmxlIGluZGV4LiBFbnRlciBzZWFyY2gga2V5d29yZHM6ICIKICAgICAgICAgICAgc2VsZi5wcm9jZXNzQ2hhcmFjdGVycygKICAgICAgICAgICAgICAgIHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBwcm9tcHR9KQogICAgICAgICAgICBhdHRyaWJ1dGVzID0gdG9rZW5bImRhdGEiXS5jb3B5KCkKICAgICAgICAgICAgaWYgImFjdGlvbiIgaW4gYXR0cmlidXRlczoKICAgICAgICAgICAgICAgIGRlbCBhdHRyaWJ1dGVzWyJhY3Rpb24iXQogICAgICAgICAgICBpZiAicHJvbXB0IiBpbiBhdHRyaWJ1dGVzOgogICAgICAgICAgICAgICAgZGVsIGF0dHJpYnV0ZXNbInByb21wdCJdCiAgICAgICAgICAgIGF0dHJpYnV0ZXNbIm5hbWUiXSA9ICJpc2luZGV4IgogICAgICAgICAgICBzZWxmLnByb2Nlc3NTdGFydFRhZyhpbXBsaWVkVGFnVG9rZW4oImlucHV0IiwgIlN0YXJ0VGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM9YXR0cmlidXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZDbG9zaW5nPXRva2VuWyJzZWxmQ2xvc2luZyJdKSkKICAgICAgICAgICAgc2VsZi5wcm9jZXNzRW5kVGFnKGltcGxpZWRUYWdUb2tlbigibGFiZWwiKSkKICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3RhcnRUYWcoaW1wbGllZFRhZ1Rva2VuKCJociIsICJTdGFydFRhZyIpKQogICAgICAgICAgICBzZWxmLnByb2Nlc3NFbmRUYWcoaW1wbGllZFRhZ1Rva2VuKCJmb3JtIikpCgogICAgICAgIGRlZiBzdGFydFRhZ1RleHRhcmVhKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnRva2VuaXplci5zdGF0ZSA9IHNlbGYucGFyc2VyLnRva2VuaXplci5yY2RhdGFTdGF0ZQogICAgICAgICAgICBzZWxmLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnMgPSBzZWxmLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnNEcm9wTmV3bGluZQogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKCiAgICAgICAgZGVmIHN0YXJ0VGFnSUZyYW1lKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdSYXd0ZXh0KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdOb3NjcmlwdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYucGFyc2VyLnNjcmlwdGluZzoKICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdSYXd0ZXh0KHRva2VuKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5zdGFydFRhZ090aGVyKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdSYXd0ZXh0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIiIiaWZyYW1lLCBub2VtYmVkIG5vZnJhbWVzLCBub3NjcmlwdChpZiBzY3JpcHRpbmcgZW5hYmxlZCkiIiIKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VSQ0RhdGFSYXd0ZXh0KHRva2VuLCAiUkFXVEVYVCIpCgogICAgICAgIGRlZiBzdGFydFRhZ09wdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgPT0gIm9wdGlvbiI6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5wcm9jZXNzRW5kVGFnKGltcGxpZWRUYWdUb2tlbigib3B0aW9uIikpCiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnU2VsZWN0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQogICAgICAgICAgICBpZiBzZWxmLnBhcnNlci5waGFzZSBpbiAoc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluQ2FwdGlvbiJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpbkNvbHVtbkdyb3VwIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGVCb2R5Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluUm93Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluQ2VsbCJdKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblNlbGVjdEluVGFibGUiXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluU2VsZWN0Il0KCiAgICAgICAgZGVmIHN0YXJ0VGFnUnBSdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicnVieSIpOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKQogICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAicnVieSI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdNYXRoKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi5wYXJzZXIuYWRqdXN0TWF0aE1MQXR0cmlidXRlcyh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIuYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXModG9rZW4pCiAgICAgICAgICAgIHRva2VuWyJuYW1lc3BhY2UiXSA9IG5hbWVzcGFjZXNbIm1hdGhtbCJdCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICAjIE5lZWQgdG8gZ2V0IHRoZSBwYXJzZSBlcnJvciByaWdodCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHRva2VuCiAgICAgICAgICAgICMgaGFzIGEgbmFtZXNwYWNlIG5vdCBlcXVhbCB0byB0aGUgeG1sbnMgYXR0cmlidXRlCiAgICAgICAgICAgIGlmIHRva2VuWyJzZWxmQ2xvc2luZyJdOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgdG9rZW5bInNlbGZDbG9zaW5nQWNrbm93bGVkZ2VkIl0gPSBUcnVlCgogICAgICAgIGRlZiBzdGFydFRhZ1N2ZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmFkanVzdFNWR0F0dHJpYnV0ZXModG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzKHRva2VuKQogICAgICAgICAgICB0b2tlblsibmFtZXNwYWNlIl0gPSBuYW1lc3BhY2VzWyJzdmciXQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgIyBOZWVkIHRvIGdldCB0aGUgcGFyc2UgZXJyb3IgcmlnaHQgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSB0b2tlbgogICAgICAgICAgICAjIGhhcyBhIG5hbWVzcGFjZSBub3QgZXF1YWwgdG8gdGhlIHhtbG5zIGF0dHJpYnV0ZQogICAgICAgICAgICBpZiB0b2tlblsic2VsZkNsb3NpbmciXToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHRva2VuWyJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCJdID0gVHJ1ZQoKICAgICAgICBkZWYgc3RhcnRUYWdNaXNwbGFjZWQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAiIiIgRWxlbWVudHMgdGhhdCBzaG91bGQgYmUgY2hpbGRyZW4gb2Ygb3RoZXIgZWxlbWVudHMgdGhhdCBoYXZlIGEKICAgICAgICAgICAgZGlmZmVyZW50IGluc2VydGlvbiBtb2RlOyBoZXJlIHRoZXkgYXJlIGlnbm9yZWQKICAgICAgICAgICAgImNhcHRpb24iLCAiY29sIiwgImNvbGdyb3VwIiwgImZyYW1lIiwgImZyYW1lc2V0IiwgImhlYWQiLAogICAgICAgICAgICAib3B0aW9uIiwgIm9wdGdyb3VwIiwgInRib2R5IiwgInRkIiwgInRmb290IiwgInRoIiwgInRoZWFkIiwKICAgICAgICAgICAgInRyIiwgIm5vc2NyaXB0IgogICAgICAgICAgICAiIiIKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWctaWdub3JlZCIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgZW5kVGFnUChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInAiLCB2YXJpYW50PSJidXR0b24iKToKICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdDbG9zZVAoaW1wbGllZFRhZ1Rva2VuKCJwIiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiAicCJ9KQogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdQKGltcGxpZWRUYWdUb2tlbigicCIsICJFbmRUYWciKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCJwIikKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gInAiOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6ICJwIn0pCiAgICAgICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgd2hpbGUgbm9kZS5uYW1lICE9ICJwIjoKICAgICAgICAgICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQoKICAgICAgICBkZWYgZW5kVGFnQm9keShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoImJvZHkiKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGVsaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAiYm9keSI6CiAgICAgICAgICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzI6XToKICAgICAgICAgICAgICAgICAgICBpZiBub2RlLm5hbWUgbm90IGluIGZyb3plbnNldCgoImRkIiwgImR0IiwgImxpIiwgIm9wdGdyb3VwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbiIsICJwIiwgInJwIiwgInJ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRib2R5IiwgInRkIiwgInRmb290IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoIiwgInRoZWFkIiwgInRyIiwgImJvZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHRtbCIpKToKICAgICAgICAgICAgICAgICAgICAgICAgIyBOb3Qgc3VyZSB0aGlzIGlzIHRoZSBjb3JyZWN0IG5hbWUgZm9yIHRoZSBwYXJzZSBlcnJvcgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLW9uZS1lbmQtdGFnLWJ1dC1nb3QtYW5vdGhlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImdvdE5hbWUiOiAiYm9keSIsICJleHBlY3RlZE5hbWUiOiBub2RlLm5hbWV9KQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siYWZ0ZXJCb2R5Il0KCiAgICAgICAgZGVmIGVuZFRhZ0h0bWwoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAjIFdlIHJlcGVhdCB0aGUgdGVzdCBmb3IgdGhlIGJvZHkgZW5kIHRhZyB0b2tlbiBiZWluZyBpZ25vcmVkIGhlcmUKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJib2R5Iik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ0JvZHkoaW1wbGllZFRhZ1Rva2VuKCJib2R5IikpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ0Jsb2NrKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyBQdXQgdXMgYmFjayBpbiB0aGUgcmlnaHQgd2hpdGVzcGFjZSBoYW5kbGluZyBtb2RlCiAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lIl0gPT0gInByZSI6CiAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnMgPSBzZWxmLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnNOb25QcmUKICAgICAgICAgICAgaW5TY29wZSA9IHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSh0b2tlblsibmFtZSJdKQogICAgICAgICAgICBpZiBpblNjb3BlOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKQogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJlbmQtdGFnLXRvby1lYXJseSIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBpZiBpblNjb3BlOgogICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHdoaWxlIG5vZGUubmFtZSAhPSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCgogICAgICAgIGRlZiBlbmRUYWdGb3JtKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5mb3JtUG9pbnRlcgogICAgICAgICAgICBzZWxmLnRyZWUuZm9ybVBvaW50ZXIgPSBOb25lCiAgICAgICAgICAgIGlmIG5vZGUgaXMgTm9uZSBvciBub3Qgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKG5vZGUpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogImZvcm0ifSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCkKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdICE9IG5vZGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZW5kLXRhZy10b28tZWFybHktaWdub3JlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiAiZm9ybSJ9KQogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5yZW1vdmUobm9kZSkKCiAgICAgICAgZGVmIGVuZFRhZ0xpc3RJdGVtKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWUiXSA9PSAibGkiOgogICAgICAgICAgICAgICAgdmFyaWFudCA9ICJsaXN0IgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmFyaWFudCA9IE5vbmUKICAgICAgICAgICAgaWYgbm90IHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSh0b2tlblsibmFtZSJdLCB2YXJpYW50PXZhcmlhbnQpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncyhleGNsdWRlPXRva2VuWyJuYW1lIl0pCiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgImVuZC10YWctdG9vLWVhcmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgd2hpbGUgbm9kZS5uYW1lICE9IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKCiAgICAgICAgZGVmIGVuZFRhZ0hlYWRpbmcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBmb3IgaXRlbSBpbiBoZWFkaW5nRWxlbWVudHM6CiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoaXRlbSk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImVuZC10YWctdG9vLWVhcmx5IiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgICAgICBmb3IgaXRlbSBpbiBoZWFkaW5nRWxlbWVudHM6CiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoaXRlbSk6CiAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgICAgICB3aGlsZSBpdGVtLm5hbWUgbm90IGluIGhlYWRpbmdFbGVtZW50czoKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICBkZWYgZW5kVGFnRm9ybWF0dGluZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICIiIlRoZSBtdWNoLWZlYXJlZCBhZG9wdGlvbiBhZ2VuY3kgYWxnb3JpdGhtIiIiCiAgICAgICAgICAgICMgaHR0cDovL3N2bi53aGF0d2cub3JnL3dlYmFwcHMvY29tcGxldGUuaHRtbCNhZG9wdGlvbkFnZW5jeSByZXZpc2lvbiA3ODY3CiAgICAgICAgICAgICMgWFhYIEJldHRlciBwYXJzZUVycm9yIG1lc3NhZ2VzIGFwcHJlY2lhdGVkLgoKICAgICAgICAgICAgIyBTdGVwIDEKICAgICAgICAgICAgb3V0ZXJMb29wQ291bnRlciA9IDAKCiAgICAgICAgICAgICMgU3RlcCAyCiAgICAgICAgICAgIHdoaWxlIG91dGVyTG9vcENvdW50ZXIgPCA4OgoKICAgICAgICAgICAgICAgICMgU3RlcCAzCiAgICAgICAgICAgICAgICBvdXRlckxvb3BDb3VudGVyICs9IDEKCiAgICAgICAgICAgICAgICAjIFN0ZXAgNDoKCiAgICAgICAgICAgICAgICAjIExldCB0aGUgZm9ybWF0dGluZyBlbGVtZW50IGJlIHRoZSBsYXN0IGVsZW1lbnQgaW4KICAgICAgICAgICAgICAgICMgdGhlIGxpc3Qgb2YgYWN0aXZlIGZvcm1hdHRpbmcgZWxlbWVudHMgdGhhdDoKICAgICAgICAgICAgICAgICMgLSBpcyBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIGxpc3QgYW5kIHRoZSBsYXN0IHNjb3BlCiAgICAgICAgICAgICAgICAjIG1hcmtlciBpbiB0aGUgbGlzdCwgaWYgYW55LCBvciB0aGUgc3RhcnQgb2YgdGhlIGxpc3QKICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlLCBhbmQKICAgICAgICAgICAgICAgICMgLSBoYXMgdGhlIHNhbWUgdGFnIG5hbWUgYXMgdGhlIHRva2VuLgogICAgICAgICAgICAgICAgZm9ybWF0dGluZ0VsZW1lbnQgPSBzZWxmLnRyZWUuZWxlbWVudEluQWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKAogICAgICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lIl0pCiAgICAgICAgICAgICAgICBpZiAobm90IGZvcm1hdHRpbmdFbGVtZW50IG9yCiAgICAgICAgICAgICAgICAgICAgKGZvcm1hdHRpbmdFbGVtZW50IGluIHNlbGYudHJlZS5vcGVuRWxlbWVudHMgYW5kCiAgICAgICAgICAgICAgICAgICAgIG5vdCBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoZm9ybWF0dGluZ0VsZW1lbnQubmFtZSkpKToKICAgICAgICAgICAgICAgICAgICAjIElmIHRoZXJlIGlzIG5vIHN1Y2ggbm9kZSwgdGhlbiBhYm9ydCB0aGVzZSBzdGVwcwogICAgICAgICAgICAgICAgICAgICMgYW5kIGluc3RlYWQgYWN0IGFzIGRlc2NyaWJlZCBpbiB0aGUgImFueSBvdGhlcgogICAgICAgICAgICAgICAgICAgICMgZW5kIHRhZyIgZW50cnkgYmVsb3cuCiAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdPdGhlcih0b2tlbikKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgICAgICAjIE90aGVyd2lzZSwgaWYgdGhlcmUgaXMgc3VjaCBhIG5vZGUsIGJ1dCB0aGF0IG5vZGUgaXMKICAgICAgICAgICAgICAgICMgbm90IGluIHRoZSBzdGFjayBvZiBvcGVuIGVsZW1lbnRzLCB0aGVuIHRoaXMgaXMgYQogICAgICAgICAgICAgICAgIyBwYXJzZSBlcnJvcjsgcmVtb3ZlIHRoZSBlbGVtZW50IGZyb20gdGhlIGxpc3QsIGFuZAogICAgICAgICAgICAgICAgIyBhYm9ydCB0aGVzZSBzdGVwcy4KICAgICAgICAgICAgICAgIGVsaWYgZm9ybWF0dGluZ0VsZW1lbnQgbm90IGluIHNlbGYudHJlZS5vcGVuRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiYWRvcHRpb24tYWdlbmN5LTEuMiIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucmVtb3ZlKGZvcm1hdHRpbmdFbGVtZW50KQogICAgICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgICAgICMgT3RoZXJ3aXNlLCBpZiB0aGVyZSBpcyBzdWNoIGEgbm9kZSwgYW5kIHRoYXQgbm9kZSBpcwogICAgICAgICAgICAgICAgIyBhbHNvIGluIHRoZSBzdGFjayBvZiBvcGVuIGVsZW1lbnRzLCBidXQgdGhlIGVsZW1lbnQKICAgICAgICAgICAgICAgICMgaXMgbm90IGluIHNjb3BlLCB0aGVuIHRoaXMgaXMgYSBwYXJzZSBlcnJvcjsgaWdub3JlCiAgICAgICAgICAgICAgICAjIHRoZSB0b2tlbiwgYW5kIGFib3J0IHRoZXNlIHN0ZXBzLgogICAgICAgICAgICAgICAgZWxpZiBub3Qgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKGZvcm1hdHRpbmdFbGVtZW50Lm5hbWUpOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImFkb3B0aW9uLWFnZW5jeS00LjQiLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgICAgICAjIE90aGVyd2lzZSwgdGhlcmUgaXMgYSBmb3JtYXR0aW5nIGVsZW1lbnQgYW5kIHRoYXQKICAgICAgICAgICAgICAgICMgZWxlbWVudCBpcyBpbiB0aGUgc3RhY2sgYW5kIGlzIGluIHNjb3BlLiBJZiB0aGUKICAgICAgICAgICAgICAgICMgZWxlbWVudCBpcyBub3QgdGhlIGN1cnJlbnQgbm9kZSwgdGhpcyBpcyBhIHBhcnNlCiAgICAgICAgICAgICAgICAjIGVycm9yLiBJbiBhbnkgY2FzZSwgcHJvY2VlZCB3aXRoIHRoZSBhbGdvcml0aG0gYXMKICAgICAgICAgICAgICAgICMgd3JpdHRlbiBpbiB0aGUgZm9sbG93aW5nIHN0ZXBzLgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiBmb3JtYXR0aW5nRWxlbWVudCAhPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiYWRvcHRpb24tYWdlbmN5LTEuMyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICAgICAgICAgICMgU3RlcCA1OgoKICAgICAgICAgICAgICAgICMgTGV0IHRoZSBmdXJ0aGVzdCBibG9jayBiZSB0aGUgdG9wbW9zdCBub2RlIGluIHRoZQogICAgICAgICAgICAgICAgIyBzdGFjayBvZiBvcGVuIGVsZW1lbnRzIHRoYXQgaXMgbG93ZXIgaW4gdGhlIHN0YWNrCiAgICAgICAgICAgICAgICAjIHRoYW4gdGhlIGZvcm1hdHRpbmcgZWxlbWVudCwgYW5kIGlzIGFuIGVsZW1lbnQgaW4KICAgICAgICAgICAgICAgICMgdGhlIHNwZWNpYWwgY2F0ZWdvcnkuIFRoZXJlIG1pZ2h0IG5vdCBiZSBvbmUuCiAgICAgICAgICAgICAgICBhZmVJbmRleCA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMuaW5kZXgoZm9ybWF0dGluZ0VsZW1lbnQpCiAgICAgICAgICAgICAgICBmdXJ0aGVzdEJsb2NrID0gTm9uZQogICAgICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gc2VsZi50cmVlLm9wZW5FbGVtZW50c1thZmVJbmRleDpdOgogICAgICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQubmFtZVR1cGxlIGluIHNwZWNpYWxFbGVtZW50czoKICAgICAgICAgICAgICAgICAgICAgICAgZnVydGhlc3RCbG9jayA9IGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgICAgICAgICAjIFN0ZXAgNjoKCiAgICAgICAgICAgICAgICAjIElmIHRoZXJlIGlzIG5vIGZ1cnRoZXN0IGJsb2NrLCB0aGVuIHRoZSBVQSBtdXN0CiAgICAgICAgICAgICAgICAjIGZpcnN0IHBvcCBhbGwgdGhlIG5vZGVzIGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2sKICAgICAgICAgICAgICAgICMgb2Ygb3BlbiBlbGVtZW50cywgZnJvbSB0aGUgY3VycmVudCBub2RlIHVwIHRvIGFuZAogICAgICAgICAgICAgICAgIyBpbmNsdWRpbmcgdGhlIGZvcm1hdHRpbmcgZWxlbWVudCwgdGhlbiByZW1vdmUgdGhlCiAgICAgICAgICAgICAgICAjIGZvcm1hdHRpbmcgZWxlbWVudCBmcm9tIHRoZSBsaXN0IG9mIGFjdGl2ZQogICAgICAgICAgICAgICAgIyBmb3JtYXR0aW5nIGVsZW1lbnRzLCBhbmQgZmluYWxseSBhYm9ydCB0aGVzZSBzdGVwcy4KICAgICAgICAgICAgICAgIGlmIGZ1cnRoZXN0QmxvY2sgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgICAgIHdoaWxlIGVsZW1lbnQgIT0gZm9ybWF0dGluZ0VsZW1lbnQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5yZW1vdmUoZWxlbWVudCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgICAgICAjIFN0ZXAgNwogICAgICAgICAgICAgICAgY29tbW9uQW5jZXN0b3IgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzW2FmZUluZGV4IC0gMV0KCiAgICAgICAgICAgICAgICAjIFN0ZXAgODoKICAgICAgICAgICAgICAgICMgVGhlIGJvb2ttYXJrIGlzIHN1cHBvc2VkIHRvIGhlbHAgdXMgaWRlbnRpZnkgd2hlcmUgdG8gcmVpbnNlcnQKICAgICAgICAgICAgICAgICMgbm9kZXMgaW4gc3RlcCAxNS4gV2UgaGF2ZSB0byBlbnN1cmUgdGhhdCB3ZSByZWluc2VydCBub2RlcyBhZnRlcgogICAgICAgICAgICAgICAgIyB0aGUgbm9kZSBiZWZvcmUgdGhlIGFjdGl2ZSBmb3JtYXR0aW5nIGVsZW1lbnQuIE5vdGUgdGhlIGJvb2ttYXJrCiAgICAgICAgICAgICAgICAjIGNhbiBtb3ZlIGluIHN0ZXAgOS43CiAgICAgICAgICAgICAgICBib29rbWFyayA9IHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuaW5kZXgoZm9ybWF0dGluZ0VsZW1lbnQpCgogICAgICAgICAgICAgICAgIyBTdGVwIDkKICAgICAgICAgICAgICAgIGxhc3ROb2RlID0gbm9kZSA9IGZ1cnRoZXN0QmxvY2sKICAgICAgICAgICAgICAgIGlubmVyTG9vcENvdW50ZXIgPSAwCgogICAgICAgICAgICAgICAgaW5kZXggPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLmluZGV4KG5vZGUpCiAgICAgICAgICAgICAgICB3aGlsZSBpbm5lckxvb3BDb3VudGVyIDwgMzoKICAgICAgICAgICAgICAgICAgICBpbm5lckxvb3BDb3VudGVyICs9IDEKICAgICAgICAgICAgICAgICAgICAjIE5vZGUgaXMgZWxlbWVudCBiZWZvcmUgbm9kZSBpbiBvcGVuIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgaW5kZXggLT0gMQogICAgICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzW2luZGV4XQogICAgICAgICAgICAgICAgICAgIGlmIG5vZGUgbm90IGluIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucmVtb3ZlKG5vZGUpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgIyBTdGVwIDkuNgogICAgICAgICAgICAgICAgICAgIGlmIG5vZGUgPT0gZm9ybWF0dGluZ0VsZW1lbnQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgIyBTdGVwIDkuNwogICAgICAgICAgICAgICAgICAgIGlmIGxhc3ROb2RlID09IGZ1cnRoZXN0QmxvY2s6CiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2ttYXJrID0gc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5pbmRleChub2RlKSArIDEKICAgICAgICAgICAgICAgICAgICAjIFN0ZXAgOS44CiAgICAgICAgICAgICAgICAgICAgY2xvbmUgPSBub2RlLmNsb25lTm9kZSgpCiAgICAgICAgICAgICAgICAgICAgIyBSZXBsYWNlIG5vZGUgd2l0aCBjbG9uZQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHNbCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuaW5kZXgobm9kZSldID0gY2xvbmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLmluZGV4KG5vZGUpXSA9IGNsb25lCiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IGNsb25lCiAgICAgICAgICAgICAgICAgICAgIyBTdGVwIDkuOQogICAgICAgICAgICAgICAgICAgICMgUmVtb3ZlIGxhc3ROb2RlIGZyb20gaXRzIHBhcmVudHMsIGlmIGFueQogICAgICAgICAgICAgICAgICAgIGlmIGxhc3ROb2RlLnBhcmVudDoKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE5vZGUucGFyZW50LnJlbW92ZUNoaWxkKGxhc3ROb2RlKQogICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQobGFzdE5vZGUpCiAgICAgICAgICAgICAgICAgICAgIyBTdGVwIDkuMTAKICAgICAgICAgICAgICAgICAgICBsYXN0Tm9kZSA9IG5vZGUKCiAgICAgICAgICAgICAgICAjIFN0ZXAgMTAKICAgICAgICAgICAgICAgICMgRm9zdGVyIHBhcmVudCBsYXN0Tm9kZSBpZiBjb21tb25BbmNlc3RvciBpcyBhCiAgICAgICAgICAgICAgICAjIHRhYmxlLCB0Ym9keSwgdGZvb3QsIHRoZWFkLCBvciB0ciB3ZSBuZWVkIHRvIGZvc3RlcgogICAgICAgICAgICAgICAgIyBwYXJlbnQgdGhlIGxhc3ROb2RlCiAgICAgICAgICAgICAgICBpZiBsYXN0Tm9kZS5wYXJlbnQ6CiAgICAgICAgICAgICAgICAgICAgbGFzdE5vZGUucGFyZW50LnJlbW92ZUNoaWxkKGxhc3ROb2RlKQoKICAgICAgICAgICAgICAgIGlmIGNvbW1vbkFuY2VzdG9yLm5hbWUgaW4gZnJvemVuc2V0KCgidGFibGUiLCAidGJvZHkiLCAidGZvb3QiLCAidGhlYWQiLCAidHIiKSk6CiAgICAgICAgICAgICAgICAgICAgcGFyZW50LCBpbnNlcnRCZWZvcmUgPSBzZWxmLnRyZWUuZ2V0VGFibGVNaXNuZXN0ZWROb2RlUG9zaXRpb24oKQogICAgICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobGFzdE5vZGUsIGluc2VydEJlZm9yZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY29tbW9uQW5jZXN0b3IuYXBwZW5kQ2hpbGQobGFzdE5vZGUpCgogICAgICAgICAgICAgICAgIyBTdGVwIDExCiAgICAgICAgICAgICAgICBjbG9uZSA9IGZvcm1hdHRpbmdFbGVtZW50LmNsb25lTm9kZSgpCgogICAgICAgICAgICAgICAgIyBTdGVwIDEyCiAgICAgICAgICAgICAgICBmdXJ0aGVzdEJsb2NrLnJlcGFyZW50Q2hpbGRyZW4oY2xvbmUpCgogICAgICAgICAgICAgICAgIyBTdGVwIDEzCiAgICAgICAgICAgICAgICBmdXJ0aGVzdEJsb2NrLmFwcGVuZENoaWxkKGNsb25lKQoKICAgICAgICAgICAgICAgICMgU3RlcCAxNAogICAgICAgICAgICAgICAgc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5yZW1vdmUoZm9ybWF0dGluZ0VsZW1lbnQpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmluc2VydChib29rbWFyaywgY2xvbmUpCgogICAgICAgICAgICAgICAgIyBTdGVwIDE1CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnJlbW92ZShmb3JtYXR0aW5nRWxlbWVudCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMuaW5zZXJ0KAogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMuaW5kZXgoZnVydGhlc3RCbG9jaykgKyAxLCBjbG9uZSkKCiAgICAgICAgZGVmIGVuZFRhZ0FwcGxldE1hcnF1ZWVPYmplY3Qoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUodG9rZW5bIm5hbWUiXSk6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncygpCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImVuZC10YWctdG9vLWVhcmx5IiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUodG9rZW5bIm5hbWUiXSk6CiAgICAgICAgICAgICAgICBlbGVtZW50ID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgd2hpbGUgZWxlbWVudC5uYW1lICE9IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5jbGVhckFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCgogICAgICAgIGRlZiBlbmRUYWdCcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy10cmVhdGVkLWFzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im9yaWdpbmFsTmFtZSI6ICJiciIsICJuZXdOYW1lIjogImJyIGVsZW1lbnQifSkKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQoaW1wbGllZFRhZ1Rva2VuKCJiciIsICJTdGFydFRhZyIpKQogICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGZvciBub2RlIGluIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbOjotMV06CiAgICAgICAgICAgICAgICBpZiBub2RlLm5hbWUgPT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncyhleGNsdWRlPXRva2VuWyJuYW1lIl0pCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgICAgICAgICB3aGlsZSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpICE9IG5vZGU6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiBub2RlLm5hbWVUdXBsZSBpbiBzcGVjaWFsRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgIGNsYXNzIFRleHRQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoInNjcmlwdCIsIHNlbGYuZW5kVGFnU2NyaXB0KV0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0VGV4dCh0b2tlblsiZGF0YSJdKQoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtbmFtZWQtY2xvc2luZy10YWctYnV0LWdvdC1lb2YiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWV9KQogICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIub3JpZ2luYWxQaGFzZQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGFzc2VydCBGYWxzZSwgIlRyaWVkIHRvIHByb2Nlc3Mgc3RhcnQgdGFnICVzIGluIFJDREFUQS9SQVdURVhUIG1vZGUiICUgdG9rZW5bJ25hbWUnXQoKICAgICAgICBkZWYgZW5kVGFnU2NyaXB0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgYXNzZXJ0IG5vZGUubmFtZSA9PSAic2NyaXB0IgogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLm9yaWdpbmFsUGhhc2UKICAgICAgICAgICAgIyBUaGUgcmVzdCBvZiB0aGlzIG1ldGhvZCBpcyBhbGwgc3R1ZmYgdGhhdCBvbmx5IGhhcHBlbnMgaWYKICAgICAgICAgICAgIyBkb2N1bWVudC53cml0ZSB3b3JrcwoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIub3JpZ2luYWxQaGFzZQoKICAgIGNsYXNzIEluVGFibGVQaGFzZShQaGFzZSk6CiAgICAgICAgIyBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNpbi10YWJsZQogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCJjYXB0aW9uIiwgc2VsZi5zdGFydFRhZ0NhcHRpb24pLAogICAgICAgICAgICAgICAgKCJjb2xncm91cCIsIHNlbGYuc3RhcnRUYWdDb2xncm91cCksCiAgICAgICAgICAgICAgICAoImNvbCIsIHNlbGYuc3RhcnRUYWdDb2wpLAogICAgICAgICAgICAgICAgKCgidGJvZHkiLCAidGZvb3QiLCAidGhlYWQiKSwgc2VsZi5zdGFydFRhZ1Jvd0dyb3VwKSwKICAgICAgICAgICAgICAgICgoInRkIiwgInRoIiwgInRyIiksIHNlbGYuc3RhcnRUYWdJbXBseVRib2R5KSwKICAgICAgICAgICAgICAgICgidGFibGUiLCBzZWxmLnN0YXJ0VGFnVGFibGUpLAogICAgICAgICAgICAgICAgKCgic3R5bGUiLCAic2NyaXB0IiksIHNlbGYuc3RhcnRUYWdTdHlsZVNjcmlwdCksCiAgICAgICAgICAgICAgICAoImlucHV0Iiwgc2VsZi5zdGFydFRhZ0lucHV0KSwKICAgICAgICAgICAgICAgICgiZm9ybSIsIHNlbGYuc3RhcnRUYWdGb3JtKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoInRhYmxlIiwgc2VsZi5lbmRUYWdUYWJsZSksCiAgICAgICAgICAgICAgICAoKCJib2R5IiwgImNhcHRpb24iLCAiY29sIiwgImNvbGdyb3VwIiwgImh0bWwiLCAidGJvZHkiLCAidGQiLAogICAgICAgICAgICAgICAgICAidGZvb3QiLCAidGgiLCAidGhlYWQiLCAidHIiKSwgc2VsZi5lbmRUYWdJZ25vcmUpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICAjIGhlbHBlciBtZXRob2RzCiAgICAgICAgZGVmIGNsZWFyU3RhY2tUb1RhYmxlQ29udGV4dChzZWxmKToKICAgICAgICAgICAgIyAiY2xlYXIgdGhlIHN0YWNrIGJhY2sgdG8gYSB0YWJsZSBjb250ZXh0IgogICAgICAgICAgICB3aGlsZSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lIG5vdCBpbiAoInRhYmxlIiwgImh0bWwiKToKICAgICAgICAgICAgICAgICMgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1pbXBsaWVkLWVuZC10YWctaW4tdGFibGUiLAogICAgICAgICAgICAgICAgIyAgeyJuYW1lIjogIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWV9KQogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAjIFdoZW4gdGhlIGN1cnJlbnQgbm9kZSBpcyA8aHRtbD4gaXQncyBhbiBpbm5lckhUTUwgY2FzZQoKICAgICAgICAjIHByb2Nlc3NpbmcgbWV0aG9kcwogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9ICJodG1sIjoKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImVvZi1pbi10YWJsZSIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgICMgU3RvcCBwYXJzaW5nCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgb3JpZ2luYWxQaGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlVGV4dCJdCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlLm9yaWdpbmFsUGhhc2UgPSBvcmlnaW5hbFBoYXNlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIG9yaWdpbmFsUGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZVRleHQiXQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5vcmlnaW5hbFBoYXNlID0gb3JpZ2luYWxQaGFzZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5wcm9jZXNzQ2hhcmFjdGVycyh0b2tlbikKCiAgICAgICAgZGVmIGluc2VydFRleHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAjIElmIHdlIGdldCBoZXJlIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcgogICAgICAgICAgICAjIERvIHRoZSB0YWJsZSBtYWdpYyEKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEZyb21UYWJsZSA9IFRydWUKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzQ2hhcmFjdGVycyh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEZyb21UYWJsZSA9IEZhbHNlCgogICAgICAgIGRlZiBzdGFydFRhZ0NhcHRpb24oc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmNsZWFyU3RhY2tUb1RhYmxlQ29udGV4dCgpCiAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuYXBwZW5kKE1hcmtlcikKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkNhcHRpb24iXQoKICAgICAgICBkZWYgc3RhcnRUYWdDb2xncm91cChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuY2xlYXJTdGFja1RvVGFibGVDb250ZXh0KCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkNvbHVtbkdyb3VwIl0KCiAgICAgICAgZGVmIHN0YXJ0VGFnQ29sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0NvbGdyb3VwKGltcGxpZWRUYWdUb2tlbigiY29sZ3JvdXAiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBzdGFydFRhZ1Jvd0dyb3VwKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5jbGVhclN0YWNrVG9UYWJsZUNvbnRleHQoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGVCb2R5Il0KCiAgICAgICAgZGVmIHN0YXJ0VGFnSW1wbHlUYm9keShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdSb3dHcm91cChpbXBsaWVkVGFnVG9rZW4oInRib2R5IiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdUYWJsZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWltcGxpZXMtZW5kLXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJzdGFydE5hbWUiOiAidGFibGUiLCAiZW5kTmFtZSI6ICJ0YWJsZSJ9KQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5wcm9jZXNzRW5kVGFnKGltcGxpZWRUYWdUb2tlbigidGFibGUiKSkKICAgICAgICAgICAgaWYgbm90IHNlbGYucGFyc2VyLmlubmVySFRNTDoKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdTdHlsZVNjcmlwdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnSW5wdXQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiAoInR5cGUiIGluIHRva2VuWyJkYXRhIl0gYW5kCiAgICAgICAgICAgICAgICAgICAgdG9rZW5bImRhdGEiXVsidHlwZSJdLnRyYW5zbGF0ZShhc2NpaVVwcGVyMkxvd2VyKSA9PSAiaGlkZGVuIik6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWhpZGRlbi1pbnB1dC1pbi10YWJsZSIpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgICAgICMgWFhYIGFzc29jaWF0ZSB3aXRoIGZvcm0KICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdPdGhlcih0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnRm9ybShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZm9ybS1pbi10YWJsZSIpCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5mb3JtUG9pbnRlciBpcyBOb25lOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZm9ybVBvaW50ZXIgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXQogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWltcGxpZXMtdGFibGUtdm9vZG9vIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgICMgRG8gdGhlIHRhYmxlIG1hZ2ljIQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RnJvbVRhYmxlID0gVHJ1ZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEZyb21UYWJsZSA9IEZhbHNlCgogICAgICAgIGRlZiBlbmRUYWdUYWJsZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGFibGUiLCB2YXJpYW50PSJ0YWJsZSIpOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKQogICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAidGFibGUiOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImVuZC10YWctdG9vLWVhcmx5LW5hbWVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZ290TmFtZSI6ICJ0YWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkTmFtZSI6IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWV9KQogICAgICAgICAgICAgICAgd2hpbGUgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAidGFibGUiOgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnJlc2V0SW5zZXJ0aW9uTW9kZSgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGlubmVySFRNTCBjYXNlCiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKCiAgICAgICAgZGVmIGVuZFRhZ0lnbm9yZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctaW1wbGllcy10YWJsZS12b29kb28iLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgIyBEbyB0aGUgdGFibGUgbWFnaWMhCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRGcm9tVGFibGUgPSBUcnVlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc0VuZFRhZyh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEZyb21UYWJsZSA9IEZhbHNlCgogICAgY2xhc3MgSW5UYWJsZVRleHRQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKICAgICAgICAgICAgc2VsZi5vcmlnaW5hbFBoYXNlID0gTm9uZQogICAgICAgICAgICBzZWxmLmNoYXJhY3RlclRva2VucyA9IFtdCgogICAgICAgIGRlZiBmbHVzaENoYXJhY3RlcnMoc2VsZik6CiAgICAgICAgICAgIGRhdGEgPSAiIi5qb2luKFtpdGVtWyJkYXRhIl0gZm9yIGl0ZW0gaW4gc2VsZi5jaGFyYWN0ZXJUb2tlbnNdKQogICAgICAgICAgICBpZiBhbnkoW2l0ZW0gbm90IGluIHNwYWNlQ2hhcmFjdGVycyBmb3IgaXRlbSBpbiBkYXRhXSk6CiAgICAgICAgICAgICAgICB0b2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBkYXRhfQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0uaW5zZXJ0VGV4dCh0b2tlbikKICAgICAgICAgICAgZWxpZiBkYXRhOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydFRleHQoZGF0YSkKICAgICAgICAgICAgc2VsZi5jaGFyYWN0ZXJUb2tlbnMgPSBbXQoKICAgICAgICBkZWYgcHJvY2Vzc0NvbW1lbnQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmZsdXNoQ2hhcmFjdGVycygpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5vcmlnaW5hbFBoYXNlCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5mbHVzaENoYXJhY3RlcnMoKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYub3JpZ2luYWxQaGFzZQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiB0b2tlblsiZGF0YSJdID09ICJcdTAwMDAiOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIHNlbGYuY2hhcmFjdGVyVG9rZW5zLmFwcGVuZCh0b2tlbikKCiAgICAgICAgZGVmIHByb2Nlc3NTcGFjZUNoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAjIHByZXR0eSBzdXJlIHdlIHNob3VsZCBuZXZlciByZWFjaCBoZXJlCiAgICAgICAgICAgIHNlbGYuY2hhcmFjdGVyVG9rZW5zLmFwcGVuZCh0b2tlbikKICAgICMgICAgICAgIGFzc2VydCBGYWxzZQoKICAgICAgICBkZWYgcHJvY2Vzc1N0YXJ0VGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5mbHVzaENoYXJhY3RlcnMoKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYub3JpZ2luYWxQaGFzZQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHByb2Nlc3NFbmRUYWcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmZsdXNoQ2hhcmFjdGVycygpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5vcmlnaW5hbFBoYXNlCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgIGNsYXNzIEluQ2FwdGlvblBoYXNlKFBoYXNlKToKICAgICAgICAjIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2luLWNhcHRpb24KICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoKCJjYXB0aW9uIiwgImNvbCIsICJjb2xncm91cCIsICJ0Ym9keSIsICJ0ZCIsICJ0Zm9vdCIsICJ0aCIsCiAgICAgICAgICAgICAgICAgICJ0aGVhZCIsICJ0ciIpLCBzZWxmLnN0YXJ0VGFnVGFibGVFbGVtZW50KQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImNhcHRpb24iLCBzZWxmLmVuZFRhZ0NhcHRpb24pLAogICAgICAgICAgICAgICAgKCJ0YWJsZSIsIHNlbGYuZW5kVGFnVGFibGUpLAogICAgICAgICAgICAgICAgKCgiYm9keSIsICJjb2wiLCAiY29sZ3JvdXAiLCAiaHRtbCIsICJ0Ym9keSIsICJ0ZCIsICJ0Zm9vdCIsICJ0aCIsCiAgICAgICAgICAgICAgICAgICJ0aGVhZCIsICJ0ciIpLCBzZWxmLmVuZFRhZ0lnbm9yZSkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgIGRlZiBpZ25vcmVFbmRUYWdDYXB0aW9uKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gbm90IHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgiY2FwdGlvbiIsIHZhcmlhbnQ9InRhYmxlIikKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc0VPRigpCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NDaGFyYWN0ZXJzKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdUYWJsZUVsZW1lbnQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKICAgICAgICAgICAgIyBYWFggSGF2ZSB0byBkdXBsaWNhdGUgbG9naWMgaGVyZSB0byBmaW5kIG91dCBpZiB0aGUgdGFnIGlzIGlnbm9yZWQKICAgICAgICAgICAgaWdub3JlRW5kVGFnID0gc2VsZi5pZ25vcmVFbmRUYWdDYXB0aW9uKCkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UucHJvY2Vzc0VuZFRhZyhpbXBsaWVkVGFnVG9rZW4oImNhcHRpb24iKSkKICAgICAgICAgICAgaWYgbm90IGlnbm9yZUVuZFRhZzoKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIGVuZFRhZ0NhcHRpb24oc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5pZ25vcmVFbmRUYWdDYXB0aW9uKCk6CiAgICAgICAgICAgICAgICAjIEFUIHRoaXMgY29kZSBpcyBxdWl0ZSBzaW1pbGFyIHRvIGVuZFRhZ1RhYmxlIGluICJJblRhYmxlIgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKQogICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAiY2FwdGlvbiI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtb25lLWVuZC10YWctYnV0LWdvdC1hbm90aGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZ290TmFtZSI6ICJjYXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWROYW1lIjogc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZX0pCiAgICAgICAgICAgICAgICB3aGlsZSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9ICJjYXB0aW9uIjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuY2xlYXJBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBpbm5lckhUTUwgY2FzZQogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCgogICAgICAgIGRlZiBlbmRUYWdUYWJsZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQogICAgICAgICAgICBpZ25vcmVFbmRUYWcgPSBzZWxmLmlnbm9yZUVuZFRhZ0NhcHRpb24oKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5wcm9jZXNzRW5kVGFnKGltcGxpZWRUYWdUb2tlbigiY2FwdGlvbiIpKQogICAgICAgICAgICBpZiBub3QgaWdub3JlRW5kVGFnOgogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdJZ25vcmUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc0VuZFRhZyh0b2tlbikKCiAgICBjbGFzcyBJbkNvbHVtbkdyb3VwUGhhc2UoUGhhc2UpOgogICAgICAgICMgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jaW4tY29sdW1uCgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgiY29sIiwgc2VsZi5zdGFydFRhZ0NvbCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJjb2xncm91cCIsIHNlbGYuZW5kVGFnQ29sZ3JvdXApLAogICAgICAgICAgICAgICAgKCJjb2wiLCBzZWxmLmVuZFRhZ0NvbCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgIGRlZiBpZ25vcmVFbmRUYWdDb2xncm91cChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgPT0gImh0bWwiCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJodG1sIjoKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWdub3JlRW5kVGFnID0gc2VsZi5pZ25vcmVFbmRUYWdDb2xncm91cCgpCiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ0NvbGdyb3VwKGltcGxpZWRUYWdUb2tlbigiY29sZ3JvdXAiKSkKICAgICAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVFbmRUYWc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWdub3JlRW5kVGFnID0gc2VsZi5pZ25vcmVFbmRUYWdDb2xncm91cCgpCiAgICAgICAgICAgIHNlbGYuZW5kVGFnQ29sZ3JvdXAoaW1wbGllZFRhZ1Rva2VuKCJjb2xncm91cCIpKQogICAgICAgICAgICBpZiBub3QgaWdub3JlRW5kVGFnOgogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBzdGFydFRhZ0NvbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIHRva2VuWyJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCJdID0gVHJ1ZQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlnbm9yZUVuZFRhZyA9IHNlbGYuaWdub3JlRW5kVGFnQ29sZ3JvdXAoKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0NvbGdyb3VwKGltcGxpZWRUYWdUb2tlbigiY29sZ3JvdXAiKSkKICAgICAgICAgICAgaWYgbm90IGlnbm9yZUVuZFRhZzoKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnQ29sZ3JvdXAoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLmlnbm9yZUVuZFRhZ0NvbGdyb3VwKCk6CiAgICAgICAgICAgICAgICAjIGlubmVySFRNTCBjYXNlCiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0KCiAgICAgICAgZGVmIGVuZFRhZ0NvbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoIm5vLWVuZC10YWciLCB7Im5hbWUiOiAiY29sIn0pCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlnbm9yZUVuZFRhZyA9IHNlbGYuaWdub3JlRW5kVGFnQ29sZ3JvdXAoKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0NvbGdyb3VwKGltcGxpZWRUYWdUb2tlbigiY29sZ3JvdXAiKSkKICAgICAgICAgICAgaWYgbm90IGlnbm9yZUVuZFRhZzoKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgIGNsYXNzIEluVGFibGVCb2R5UGhhc2UoUGhhc2UpOgogICAgICAgICMgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jaW4tdGFibGUwCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoInRyIiwgc2VsZi5zdGFydFRhZ1RyKSwKICAgICAgICAgICAgICAgICgoInRkIiwgInRoIiksIHNlbGYuc3RhcnRUYWdUYWJsZUNlbGwpLAogICAgICAgICAgICAgICAgKCgiY2FwdGlvbiIsICJjb2wiLCAiY29sZ3JvdXAiLCAidGJvZHkiLCAidGZvb3QiLCAidGhlYWQiKSwKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnVGFibGVPdGhlcikKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCgidGJvZHkiLCAidGZvb3QiLCAidGhlYWQiKSwgc2VsZi5lbmRUYWdUYWJsZVJvd0dyb3VwKSwKICAgICAgICAgICAgICAgICgidGFibGUiLCBzZWxmLmVuZFRhZ1RhYmxlKSwKICAgICAgICAgICAgICAgICgoImJvZHkiLCAiY2FwdGlvbiIsICJjb2wiLCAiY29sZ3JvdXAiLCAiaHRtbCIsICJ0ZCIsICJ0aCIsCiAgICAgICAgICAgICAgICAgICJ0ciIpLCBzZWxmLmVuZFRhZ0lnbm9yZSkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgICMgaGVscGVyIG1ldGhvZHMKICAgICAgICBkZWYgY2xlYXJTdGFja1RvVGFibGVCb2R5Q29udGV4dChzZWxmKToKICAgICAgICAgICAgd2hpbGUgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSBub3QgaW4gKCJ0Ym9keSIsICJ0Zm9vdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlYWQiLCAiaHRtbCIpOgogICAgICAgICAgICAgICAgIyBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWltcGxpZWQtZW5kLXRhZy1pbi10YWJsZSIsCiAgICAgICAgICAgICAgICAjICB7Im5hbWUiOiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lfSkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSA9PSAiaHRtbCI6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCgogICAgICAgICMgdGhlIHJlc3QKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0ucHJvY2Vzc0VPRigpCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXS5wcm9jZXNzQ2hhcmFjdGVycyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnVHIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmNsZWFyU3RhY2tUb1RhYmxlQm9keUNvbnRleHQoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluUm93Il0KCiAgICAgICAgZGVmIHN0YXJ0VGFnVGFibGVDZWxsKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1jZWxsLWluLXRhYmxlLWJvZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnVHIoaW1wbGllZFRhZ1Rva2VuKCJ0ciIsICJTdGFydFRhZyIpKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnVGFibGVPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgWFhYIEFUIEFueSBpZGVhcyBvbiBob3cgdG8gc2hhcmUgdGhpcyB3aXRoIGVuZFRhZ1RhYmxlPwogICAgICAgICAgICBpZiAoc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJ0Ym9keSIsIHZhcmlhbnQ9InRhYmxlIikgb3IKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGhlYWQiLCB2YXJpYW50PSJ0YWJsZSIpIG9yCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJ0Zm9vdCIsIHZhcmlhbnQ9InRhYmxlIikpOgogICAgICAgICAgICAgICAgc2VsZi5jbGVhclN0YWNrVG9UYWJsZUJvZHlDb250ZXh0KCkKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnVGFibGVSb3dHcm91cCgKICAgICAgICAgICAgICAgICAgICBpbXBsaWVkVGFnVG9rZW4oc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSkpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgaW5uZXJIVE1MIGNhc2UKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBlbmRUYWdUYWJsZVJvd0dyb3VwKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKHRva2VuWyJuYW1lIl0sIHZhcmlhbnQ9InRhYmxlIik6CiAgICAgICAgICAgICAgICBzZWxmLmNsZWFyU3RhY2tUb1RhYmxlQm9keUNvbnRleHQoKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWluLXRhYmxlLWJvZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGVuZFRhZ1RhYmxlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgKHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGJvZHkiLCB2YXJpYW50PSJ0YWJsZSIpIG9yCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInRoZWFkIiwgdmFyaWFudD0idGFibGUiKSBvcgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGZvb3QiLCB2YXJpYW50PSJ0YWJsZSIpKToKICAgICAgICAgICAgICAgIHNlbGYuY2xlYXJTdGFja1RvVGFibGVCb2R5Q29udGV4dCgpCiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1RhYmxlUm93R3JvdXAoCiAgICAgICAgICAgICAgICAgICAgaW1wbGllZFRhZ1Rva2VuKHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUpKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGlubmVySFRNTCBjYXNlCiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKCiAgICAgICAgZGVmIGVuZFRhZ0lnbm9yZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi10YWJsZS1ib2R5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLnByb2Nlc3NFbmRUYWcodG9rZW4pCgogICAgY2xhc3MgSW5Sb3dQaGFzZShQaGFzZSk6CiAgICAgICAgIyBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNpbi1yb3cKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgoInRkIiwgInRoIiksIHNlbGYuc3RhcnRUYWdUYWJsZUNlbGwpLAogICAgICAgICAgICAgICAgKCgiY2FwdGlvbiIsICJjb2wiLCAiY29sZ3JvdXAiLCAidGJvZHkiLCAidGZvb3QiLCAidGhlYWQiLAogICAgICAgICAgICAgICAgICAidHIiKSwgc2VsZi5zdGFydFRhZ1RhYmxlT3RoZXIpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgidHIiLCBzZWxmLmVuZFRhZ1RyKSwKICAgICAgICAgICAgICAgICgidGFibGUiLCBzZWxmLmVuZFRhZ1RhYmxlKSwKICAgICAgICAgICAgICAgICgoInRib2R5IiwgInRmb290IiwgInRoZWFkIiksIHNlbGYuZW5kVGFnVGFibGVSb3dHcm91cCksCiAgICAgICAgICAgICAgICAoKCJib2R5IiwgImNhcHRpb24iLCAiY29sIiwgImNvbGdyb3VwIiwgImh0bWwiLCAidGQiLCAidGgiKSwKICAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ0lnbm9yZSkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgICMgaGVscGVyIG1ldGhvZHMgKFhYWCB1bmlmeSB0aGlzIHdpdGggb3RoZXIgdGFibGUgaGVscGVyIG1ldGhvZHMpCiAgICAgICAgZGVmIGNsZWFyU3RhY2tUb1RhYmxlUm93Q29udGV4dChzZWxmKToKICAgICAgICAgICAgd2hpbGUgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSBub3QgaW4gKCJ0ciIsICJodG1sIik6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWltcGxpZWQtZW5kLXRhZy1pbi10YWJsZS1yb3ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lfSkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKCiAgICAgICAgZGVmIGlnbm9yZUVuZFRhZ1RyKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gbm90IHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidHIiLCB2YXJpYW50PSJ0YWJsZSIpCgogICAgICAgICMgdGhlIHJlc3QKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0ucHJvY2Vzc0VPRigpCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXS5wcm9jZXNzQ2hhcmFjdGVycyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnVGFibGVDZWxsKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5jbGVhclN0YWNrVG9UYWJsZVJvd0NvbnRleHQoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluQ2VsbCJdCiAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuYXBwZW5kKE1hcmtlcikKCiAgICAgICAgZGVmIHN0YXJ0VGFnVGFibGVPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlnbm9yZUVuZFRhZyA9IHNlbGYuaWdub3JlRW5kVGFnVHIoKQogICAgICAgICAgICBzZWxmLmVuZFRhZ1RyKGltcGxpZWRUYWdUb2tlbigidHIiKSkKICAgICAgICAgICAgIyBYWFggaG93IGFyZSB3ZSBzdXJlIGl0J3MgYWx3YXlzIGlnbm9yZWQgaW4gdGhlIGlubmVySFRNTCBjYXNlPwogICAgICAgICAgICBpZiBub3QgaWdub3JlRW5kVGFnOgogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIGVuZFRhZ1RyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgbm90IHNlbGYuaWdub3JlRW5kVGFnVHIoKToKICAgICAgICAgICAgICAgIHNlbGYuY2xlYXJTdGFja1RvVGFibGVSb3dDb250ZXh0KCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlQm9keSJdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGlubmVySFRNTCBjYXNlCiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKCiAgICAgICAgZGVmIGVuZFRhZ1RhYmxlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWdub3JlRW5kVGFnID0gc2VsZi5pZ25vcmVFbmRUYWdUcigpCiAgICAgICAgICAgIHNlbGYuZW5kVGFnVHIoaW1wbGllZFRhZ1Rva2VuKCJ0ciIpKQogICAgICAgICAgICAjIFJlcHJvY2VzcyB0aGUgY3VycmVudCB0YWcgaWYgdGhlIHRyIGVuZCB0YWcgd2FzIG5vdCBpZ25vcmVkCiAgICAgICAgICAgICMgWFhYIGhvdyBhcmUgd2Ugc3VyZSBpdCdzIGFsd2F5cyBpZ25vcmVkIGluIHRoZSBpbm5lckhUTUwgY2FzZT8KICAgICAgICAgICAgaWYgbm90IGlnbm9yZUVuZFRhZzoKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnVGFibGVSb3dHcm91cChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSh0b2tlblsibmFtZSJdLCB2YXJpYW50PSJ0YWJsZSIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdUcihpbXBsaWVkVGFnVG9rZW4oInRyIikpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQoKICAgICAgICBkZWYgZW5kVGFnSWdub3JlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWluLXRhYmxlLXJvdyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXS5wcm9jZXNzRW5kVGFnKHRva2VuKQoKICAgIGNsYXNzIEluQ2VsbFBoYXNlKFBoYXNlKToKICAgICAgICAjIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2luLWNlbGwKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgoImNhcHRpb24iLCAiY29sIiwgImNvbGdyb3VwIiwgInRib2R5IiwgInRkIiwgInRmb290IiwgInRoIiwKICAgICAgICAgICAgICAgICAgInRoZWFkIiwgInRyIiksIHNlbGYuc3RhcnRUYWdUYWJsZU90aGVyKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoKCJ0ZCIsICJ0aCIpLCBzZWxmLmVuZFRhZ1RhYmxlQ2VsbCksCiAgICAgICAgICAgICAgICAoKCJib2R5IiwgImNhcHRpb24iLCAiY29sIiwgImNvbGdyb3VwIiwgImh0bWwiKSwgc2VsZi5lbmRUYWdJZ25vcmUpLAogICAgICAgICAgICAgICAgKCgidGFibGUiLCAidGJvZHkiLCAidGZvb3QiLCAidGhlYWQiLCAidHIiKSwgc2VsZi5lbmRUYWdJbXBseSkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgICMgaGVscGVyCiAgICAgICAgZGVmIGNsb3NlQ2VsbChzZWxmKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJ0ZCIsIHZhcmlhbnQ9InRhYmxlIik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1RhYmxlQ2VsbChpbXBsaWVkVGFnVG9rZW4oInRkIikpCiAgICAgICAgICAgIGVsaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJ0aCIsIHZhcmlhbnQ9InRhYmxlIik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1RhYmxlQ2VsbChpbXBsaWVkVGFnVG9rZW4oInRoIikpCgogICAgICAgICMgdGhlIHJlc3QKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzRU9GKCkKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc0NoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ1RhYmxlT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiAoc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJ0ZCIsIHZhcmlhbnQ9InRhYmxlIikgb3IKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInRoIiwgdmFyaWFudD0idGFibGUiKSk6CiAgICAgICAgICAgICAgICBzZWxmLmNsb3NlQ2VsbCgpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgaW5uZXJIVE1MIGNhc2UKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIGVuZFRhZ1RhYmxlQ2VsbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSh0b2tlblsibmFtZSJdLCB2YXJpYW50PSJ0YWJsZSIpOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3ModG9rZW5bIm5hbWUiXSkKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWNlbGwtZW5kLXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBub2RlLm5hbWUgPT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5jbGVhckFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5Sb3ciXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBlbmRUYWdJZ25vcmUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGVuZFRhZ0ltcGx5KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKHRva2VuWyJuYW1lIl0sIHZhcmlhbnQ9InRhYmxlIik6CiAgICAgICAgICAgICAgICBzZWxmLmNsb3NlQ2VsbCgpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgc29tZXRpbWVzIGlubmVySFRNTCBjYXNlCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc0VuZFRhZyh0b2tlbikKCiAgICBjbGFzcyBJblNlbGVjdFBoYXNlKFBoYXNlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoIm9wdGlvbiIsIHNlbGYuc3RhcnRUYWdPcHRpb24pLAogICAgICAgICAgICAgICAgKCJvcHRncm91cCIsIHNlbGYuc3RhcnRUYWdPcHRncm91cCksCiAgICAgICAgICAgICAgICAoInNlbGVjdCIsIHNlbGYuc3RhcnRUYWdTZWxlY3QpLAogICAgICAgICAgICAgICAgKCgiaW5wdXQiLCAia2V5Z2VuIiwgInRleHRhcmVhIiksIHNlbGYuc3RhcnRUYWdJbnB1dCksCiAgICAgICAgICAgICAgICAoInNjcmlwdCIsIHNlbGYuc3RhcnRUYWdTY3JpcHQpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgib3B0aW9uIiwgc2VsZi5lbmRUYWdPcHRpb24pLAogICAgICAgICAgICAgICAgKCJvcHRncm91cCIsIHNlbGYuZW5kVGFnT3B0Z3JvdXApLAogICAgICAgICAgICAgICAgKCJzZWxlY3QiLCBzZWxmLmVuZFRhZ1NlbGVjdCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgICMgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jaW4tc2VsZWN0CiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gImh0bWwiOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZW9mLWluLXNlbGVjdCIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHRva2VuWyJkYXRhIl0gPT0gIlx1MDAwMCI6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydFRleHQodG9rZW5bImRhdGEiXSkKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3B0aW9uKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyBXZSBuZWVkIHRvIGltcGx5IDwvb3B0aW9uPiBpZiA8b3B0aW9uPiBpcyB0aGUgY3VycmVudCBub2RlLgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJvcHRpb24iOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3B0Z3JvdXAoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJvcHRpb24iOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJvcHRncm91cCI6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdTZWxlY3Qoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXNlbGVjdC1pbi1zZWxlY3QiKQogICAgICAgICAgICBzZWxmLmVuZFRhZ1NlbGVjdChpbXBsaWVkVGFnVG9rZW4oInNlbGVjdCIpKQoKICAgICAgICBkZWYgc3RhcnRUYWdJbnB1dChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtaW5wdXQtaW4tc2VsZWN0IikKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJzZWxlY3QiLCB2YXJpYW50PSJzZWxlY3QiKToKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnU2VsZWN0KGltcGxpZWRUYWdUb2tlbigic2VsZWN0IikpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKCiAgICAgICAgZGVmIHN0YXJ0VGFnU2NyaXB0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkIl0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWluLXNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBlbmRUYWdPcHRpb24oc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJvcHRpb24iOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWluLXNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6ICJvcHRpb24ifSkKCiAgICAgICAgZGVmIGVuZFRhZ09wdGdyb3VwKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyA8L29wdGdyb3VwPiBpbXBsaWNpdGx5IGNsb3NlcyA8b3B0aW9uPgogICAgICAgICAgICBpZiAoc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSA9PSAib3B0aW9uIiBhbmQKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0yXS5uYW1lID09ICJvcHRncm91cCIpOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAjIEl0IGFsc28gY2xvc2VzIDwvb3B0Z3JvdXA+CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgPT0gIm9wdGdyb3VwIjoKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgIyBCdXQgbm90aGluZyBlbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctaW4tc2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogIm9wdGdyb3VwIn0pCgogICAgICAgIGRlZiBlbmRUYWdTZWxlY3Qoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInNlbGVjdCIsIHZhcmlhbnQ9InNlbGVjdCIpOgogICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHdoaWxlIG5vZGUubmFtZSAhPSAic2VsZWN0IjoKICAgICAgICAgICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucmVzZXRJbnNlcnRpb25Nb2RlKCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgaW5uZXJIVE1MIGNhc2UKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctaW4tc2VsZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICBjbGFzcyBJblNlbGVjdEluVGFibGVQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCgiY2FwdGlvbiIsICJ0YWJsZSIsICJ0Ym9keSIsICJ0Zm9vdCIsICJ0aGVhZCIsICJ0ciIsICJ0ZCIsICJ0aCIpLAogICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdUYWJsZSkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCgiY2FwdGlvbiIsICJ0YWJsZSIsICJ0Ym9keSIsICJ0Zm9vdCIsICJ0aGVhZCIsICJ0ciIsICJ0ZCIsICJ0aCIpLAogICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnVGFibGUpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpblNlbGVjdCJdLnByb2Nlc3NFT0YoKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpblNlbGVjdCJdLnByb2Nlc3NDaGFyYWN0ZXJzKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdUYWJsZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtdGFibGUtZWxlbWVudC1zdGFydC10YWctaW4tc2VsZWN0LWluLXRhYmxlIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnT3RoZXIoaW1wbGllZFRhZ1Rva2VuKCJzZWxlY3QiKSkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5TZWxlY3QiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBlbmRUYWdUYWJsZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtdGFibGUtZWxlbWVudC1lbmQtdGFnLWluLXNlbGVjdC1pbi10YWJsZSIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUodG9rZW5bIm5hbWUiXSwgdmFyaWFudD0idGFibGUiKToKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnT3RoZXIoaW1wbGllZFRhZ1Rva2VuKCJzZWxlY3QiKSkKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpblNlbGVjdCJdLnByb2Nlc3NFbmRUYWcodG9rZW4pCgogICAgY2xhc3MgSW5Gb3JlaWduQ29udGVudFBoYXNlKFBoYXNlKToKICAgICAgICBicmVha291dEVsZW1lbnRzID0gZnJvemVuc2V0KFsiYiIsICJiaWciLCAiYmxvY2txdW90ZSIsICJib2R5IiwgImJyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2VudGVyIiwgImNvZGUiLCAiZGQiLCAiZGl2IiwgImRsIiwgImR0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW0iLCAiZW1iZWQiLCAiaDEiLCAiaDIiLCAiaDMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoNCIsICJoNSIsICJoNiIsICJoZWFkIiwgImhyIiwgImkiLCAiaW1nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGkiLCAibGlzdGluZyIsICJtZW51IiwgIm1ldGEiLCAibm9iciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9sIiwgInAiLCAicHJlIiwgInJ1YnkiLCAicyIsICJzbWFsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwYW4iLCAic3Ryb25nIiwgInN0cmlrZSIsICJzdWIiLCAic3VwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFibGUiLCAidHQiLCAidSIsICJ1bCIsICJ2YXIiXSkKCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgZGVmIGFkanVzdFNWR1RhZ05hbWVzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmVwbGFjZW1lbnRzID0geyJhbHRnbHlwaCI6ICJhbHRHbHlwaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWx0Z2x5cGhkZWYiOiAiYWx0R2x5cGhEZWYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsdGdseXBoaXRlbSI6ICJhbHRHbHlwaEl0ZW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuaW1hdGVjb2xvciI6ICJhbmltYXRlQ29sb3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuaW1hdGVtb3Rpb24iOiAiYW5pbWF0ZU1vdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5pbWF0ZXRyYW5zZm9ybSI6ICJhbmltYXRlVHJhbnNmb3JtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGlwcGF0aCI6ICJjbGlwUGF0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVibGVuZCI6ICJmZUJsZW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWNvbG9ybWF0cml4IjogImZlQ29sb3JNYXRyaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlY29tcG9uZW50dHJhbnNmZXIiOiAiZmVDb21wb25lbnRUcmFuc2ZlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVjb21wb3NpdGUiOiAiZmVDb21wb3NpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlY29udm9sdmVtYXRyaXgiOiAiZmVDb252b2x2ZU1hdHJpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVkaWZmdXNlbGlnaHRpbmciOiAiZmVEaWZmdXNlTGlnaHRpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlZGlzcGxhY2VtZW50bWFwIjogImZlRGlzcGxhY2VtZW50TWFwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWRpc3RhbnRsaWdodCI6ICJmZURpc3RhbnRMaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVmbG9vZCI6ICJmZUZsb29kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWZ1bmNhIjogImZlRnVuY0EiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlZnVuY2IiOiAiZmVGdW5jQiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVmdW5jZyI6ICJmZUZ1bmNHIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWZ1bmNyIjogImZlRnVuY1IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlZ2F1c3NpYW5ibHVyIjogImZlR2F1c3NpYW5CbHVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWltYWdlIjogImZlSW1hZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlbWVyZ2UiOiAiZmVNZXJnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVtZXJnZW5vZGUiOiAiZmVNZXJnZU5vZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlbW9ycGhvbG9neSI6ICJmZU1vcnBob2xvZ3kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlb2Zmc2V0IjogImZlT2Zmc2V0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZXBvaW50bGlnaHQiOiAiZmVQb2ludExpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZXNwZWN1bGFybGlnaHRpbmciOiAiZmVTcGVjdWxhckxpZ2h0aW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZXNwb3RsaWdodCI6ICJmZVNwb3RMaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmV0aWxlIjogImZlVGlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmV0dXJidWxlbmNlIjogImZlVHVyYnVsZW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yZWlnbm9iamVjdCI6ICJmb3JlaWduT2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbHlwaHJlZiI6ICJnbHlwaFJlZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGluZWFyZ3JhZGllbnQiOiAibGluZWFyR3JhZGllbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInJhZGlhbGdyYWRpZW50IjogInJhZGlhbEdyYWRpZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0cGF0aCI6ICJ0ZXh0UGF0aCJ9CgogICAgICAgICAgICBpZiB0b2tlblsibmFtZSJdIGluIHJlcGxhY2VtZW50czoKICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lIl0gPSByZXBsYWNlbWVudHNbdG9rZW5bIm5hbWUiXV0KCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgdG9rZW5bImRhdGEiXSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgICAgIHRva2VuWyJkYXRhIl0gPSAiXHVGRkZEIgogICAgICAgICAgICBlbGlmIChzZWxmLnBhcnNlci5mcmFtZXNldE9LIGFuZAogICAgICAgICAgICAgICAgICBhbnkoY2hhciBub3QgaW4gc3BhY2VDaGFyYWN0ZXJzIGZvciBjaGFyIGluIHRva2VuWyJkYXRhIl0pKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQogICAgICAgICAgICBQaGFzZS5wcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbikKCiAgICAgICAgZGVmIHByb2Nlc3NTdGFydFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0KICAgICAgICAgICAgaWYgKHRva2VuWyJuYW1lIl0gaW4gc2VsZi5icmVha291dEVsZW1lbnRzIG9yCiAgICAgICAgICAgICAgICAodG9rZW5bIm5hbWUiXSA9PSAiZm9udCIgYW5kCiAgICAgICAgICAgICAgICAgc2V0KHRva2VuWyJkYXRhIl0ua2V5cygpKSAmIHNldChbImNvbG9yIiwgImZhY2UiLCAic2l6ZSJdKSkpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1odG1sLWVsZW1lbnQtaW4tZm9yZWlnbi1jb250ZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgICAgICB3aGlsZSAoc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZXNwYWNlICE9CiAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLmRlZmF1bHROYW1lc3BhY2UgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgbm90IHNlbGYucGFyc2VyLmlzSFRNTEludGVncmF0aW9uUG9pbnQoc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0pIGFuZAogICAgICAgICAgICAgICAgICAgICAgIG5vdCBzZWxmLnBhcnNlci5pc01hdGhNTFRleHRJbnRlZ3JhdGlvblBvaW50KHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdKSk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgY3VycmVudE5vZGUubmFtZXNwYWNlID09IG5hbWVzcGFjZXNbIm1hdGhtbCJdOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmFkanVzdE1hdGhNTEF0dHJpYnV0ZXModG9rZW4pCiAgICAgICAgICAgICAgICBlbGlmIGN1cnJlbnROb2RlLm5hbWVzcGFjZSA9PSBuYW1lc3BhY2VzWyJzdmciXToKICAgICAgICAgICAgICAgICAgICBzZWxmLmFkanVzdFNWR1RhZ05hbWVzKHRva2VuKQogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmFkanVzdFNWR0F0dHJpYnV0ZXModG9rZW4pCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5hZGp1c3RGb3JlaWduQXR0cmlidXRlcyh0b2tlbikKICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lc3BhY2UiXSA9IGN1cnJlbnROb2RlLm5hbWVzcGFjZQogICAgICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgICAgICBpZiB0b2tlblsic2VsZkNsb3NpbmciXToKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICAgICAgdG9rZW5bInNlbGZDbG9zaW5nQWNrbm93bGVkZ2VkIl0gPSBUcnVlCgogICAgICAgIGRlZiBwcm9jZXNzRW5kVGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgbm9kZUluZGV4ID0gbGVuKHNlbGYudHJlZS5vcGVuRWxlbWVudHMpIC0gMQogICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0KICAgICAgICAgICAgaWYgbm9kZS5uYW1lLnRyYW5zbGF0ZShhc2NpaVVwcGVyMkxvd2VyKSAhPSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgaWYgbm9kZS5uYW1lLnRyYW5zbGF0ZShhc2NpaVVwcGVyMkxvd2VyKSA9PSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgICAgICMgWFhYIHRoaXMgaXNuJ3QgaW4gdGhlIHNwZWMgYnV0IGl0IHNlZW1zIG5lY2Vzc2FyeQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucGFyc2VyLnBoYXNlID09IHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZVRleHQiXToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UuZmx1c2hDaGFyYWN0ZXJzKCkKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZS5vcmlnaW5hbFBoYXNlCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKSAhPSBub2RlOgogICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi50cmVlLm9wZW5FbGVtZW50cwogICAgICAgICAgICAgICAgICAgIG5ld190b2tlbiA9IE5vbmUKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgbm9kZUluZGV4IC09IDEKCiAgICAgICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1tub2RlSW5kZXhdCiAgICAgICAgICAgICAgICBpZiBub2RlLm5hbWVzcGFjZSAhPSBzZWxmLnRyZWUuZGVmYXVsdE5hbWVzcGFjZToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuZXdfdG9rZW4gPSBzZWxmLnBhcnNlci5waGFzZS5wcm9jZXNzRW5kVGFnKHRva2VuKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHJldHVybiBuZXdfdG9rZW4KCiAgICBjbGFzcyBBZnRlckJvZHlQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsoImh0bWwiLCBzZWxmLmVuZFRhZ0h0bWwpXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICAjIFN0b3AgcGFyc2luZwogICAgICAgICAgICBwYXNzCgogICAgICAgIGRlZiBwcm9jZXNzQ29tbWVudChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBkYXRhIGlzIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSA8aHRtbD4gZWxlbWVudAogICAgICAgICAgICAjIGhlcmUgYW5kIG5vdCB0byB3aGF0ZXZlciBpcyBjdXJyZW50bHkgb3Blbi4KICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydENvbW1lbnQodG9rZW4sIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMF0pCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtY2hhci1hZnRlci1ib2R5IikKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdIdG1sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWFmdGVyLWJvZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0KICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdIdG1sKHNlbGYsIG5hbWUpOgogICAgICAgICAgICBpZiBzZWxmLnBhcnNlci5pbm5lckhUTUw6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctYWZ0ZXItYm9keS1pbm5lcmh0bWwiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImFmdGVyQWZ0ZXJCb2R5Il0KCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWFmdGVyLWJvZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0KICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgY2xhc3MgSW5GcmFtZXNldFBoYXNlKFBoYXNlKToKICAgICAgICAjIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2luLWZyYW1lc2V0CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCJmcmFtZXNldCIsIHNlbGYuc3RhcnRUYWdGcmFtZXNldCksCiAgICAgICAgICAgICAgICAoImZyYW1lIiwgc2VsZi5zdGFydFRhZ0ZyYW1lKSwKICAgICAgICAgICAgICAgICgibm9mcmFtZXMiLCBzZWxmLnN0YXJ0VGFnTm9mcmFtZXMpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiZnJhbWVzZXQiLCBzZWxmLmVuZFRhZ0ZyYW1lc2V0KQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gImh0bWwiOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZW9mLWluLWZyYW1lc2V0IikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1jaGFyLWluLWZyYW1lc2V0IikKCiAgICAgICAgZGVmIHN0YXJ0VGFnRnJhbWVzZXQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnRnJhbWUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQoKICAgICAgICBkZWYgc3RhcnRUYWdOb2ZyYW1lcyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbi1mcmFtZXNldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBlbmRUYWdGcmFtZXNldChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgPT0gImh0bWwiOgogICAgICAgICAgICAgICAgIyBpbm5lckhUTUwgY2FzZQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1mcmFtZXNldC1pbi1mcmFtZXNldC1pbm5lcmh0bWwiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBpZiAobm90IHNlbGYucGFyc2VyLmlubmVySFRNTCBhbmQKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9ICJmcmFtZXNldCIpOgogICAgICAgICAgICAgICAgIyBJZiB3ZSdyZSBub3QgaW4gaW5uZXJIVE1MIG1vZGUgYW5kIHRoZSBjdXJyZW50IG5vZGUgaXMgbm90IGEKICAgICAgICAgICAgICAgICMgImZyYW1lc2V0IiBlbGVtZW50IChhbnltb3JlKSB0aGVuIHN3aXRjaC4KICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJhZnRlckZyYW1lc2V0Il0KCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWluLWZyYW1lc2V0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICBjbGFzcyBBZnRlckZyYW1lc2V0UGhhc2UoUGhhc2UpOgogICAgICAgICMgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jYWZ0ZXIzCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCJub2ZyYW1lcyIsIHNlbGYuc3RhcnRUYWdOb2ZyYW1lcykKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5lbmRUYWdIdG1sKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgICMgU3RvcCBwYXJzaW5nCiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1jaGFyLWFmdGVyLWZyYW1lc2V0IikKCiAgICAgICAgZGVmIHN0YXJ0VGFnTm9mcmFtZXMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkhlYWQiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWctYWZ0ZXItZnJhbWVzZXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgZW5kVGFnSHRtbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJhZnRlckFmdGVyRnJhbWVzZXQiXQoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctYWZ0ZXItZnJhbWVzZXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgIGNsYXNzIEFmdGVyQWZ0ZXJCb2R5UGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGRlZiBwcm9jZXNzQ29tbWVudChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRDb21tZW50KHRva2VuLCBzZWxmLnRyZWUuZG9jdW1lbnQpCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyh0b2tlbikKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtZW9mLWJ1dC1nb3QtY2hhciIpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnSHRtbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1lb2YtYnV0LWdvdC1zdGFydC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0KICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBwcm9jZXNzRW5kVGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtZW9mLWJ1dC1nb3QtZW5kLXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICBjbGFzcyBBZnRlckFmdGVyRnJhbWVzZXRQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCJub2ZyYW1lcyIsIHNlbGYuc3RhcnRUYWdOb0ZyYW1lcykKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgcGFzcwoKICAgICAgICBkZWYgcHJvY2Vzc0NvbW1lbnQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0Q29tbWVudCh0b2tlbiwgc2VsZi50cmVlLmRvY3VtZW50KQoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLWVvZi1idXQtZ290LWNoYXIiKQoKICAgICAgICBkZWYgc3RhcnRUYWdIdG1sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdOb0ZyYW1lcyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1lb2YtYnV0LWdvdC1zdGFydC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgcHJvY2Vzc0VuZFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLWVvZi1idXQtZ290LWVuZC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgIyBweWxpbnQ6ZW5hYmxlPXVudXNlZC1hcmd1bWVudAoKICAgIHJldHVybiB7CiAgICAgICAgImluaXRpYWwiOiBJbml0aWFsUGhhc2UsCiAgICAgICAgImJlZm9yZUh0bWwiOiBCZWZvcmVIdG1sUGhhc2UsCiAgICAgICAgImJlZm9yZUhlYWQiOiBCZWZvcmVIZWFkUGhhc2UsCiAgICAgICAgImluSGVhZCI6IEluSGVhZFBoYXNlLAogICAgICAgICJpbkhlYWROb3NjcmlwdCI6IEluSGVhZE5vc2NyaXB0UGhhc2UsCiAgICAgICAgImFmdGVySGVhZCI6IEFmdGVySGVhZFBoYXNlLAogICAgICAgICJpbkJvZHkiOiBJbkJvZHlQaGFzZSwKICAgICAgICAidGV4dCI6IFRleHRQaGFzZSwKICAgICAgICAiaW5UYWJsZSI6IEluVGFibGVQaGFzZSwKICAgICAgICAiaW5UYWJsZVRleHQiOiBJblRhYmxlVGV4dFBoYXNlLAogICAgICAgICJpbkNhcHRpb24iOiBJbkNhcHRpb25QaGFzZSwKICAgICAgICAiaW5Db2x1bW5Hcm91cCI6IEluQ29sdW1uR3JvdXBQaGFzZSwKICAgICAgICAiaW5UYWJsZUJvZHkiOiBJblRhYmxlQm9keVBoYXNlLAogICAgICAgICJpblJvdyI6IEluUm93UGhhc2UsCiAgICAgICAgImluQ2VsbCI6IEluQ2VsbFBoYXNlLAogICAgICAgICJpblNlbGVjdCI6IEluU2VsZWN0UGhhc2UsCiAgICAgICAgImluU2VsZWN0SW5UYWJsZSI6IEluU2VsZWN0SW5UYWJsZVBoYXNlLAogICAgICAgICJpbkZvcmVpZ25Db250ZW50IjogSW5Gb3JlaWduQ29udGVudFBoYXNlLAogICAgICAgICJhZnRlckJvZHkiOiBBZnRlckJvZHlQaGFzZSwKICAgICAgICAiaW5GcmFtZXNldCI6IEluRnJhbWVzZXRQaGFzZSwKICAgICAgICAiYWZ0ZXJGcmFtZXNldCI6IEFmdGVyRnJhbWVzZXRQaGFzZSwKICAgICAgICAiYWZ0ZXJBZnRlckJvZHkiOiBBZnRlckFmdGVyQm9keVBoYXNlLAogICAgICAgICJhZnRlckFmdGVyRnJhbWVzZXQiOiBBZnRlckFmdGVyRnJhbWVzZXRQaGFzZSwKICAgICAgICAjIFhYWCBhZnRlciBhZnRlciBmcmFtZXNldAogICAgfQoKCmRlZiBhZGp1c3RfYXR0cmlidXRlcyh0b2tlbiwgcmVwbGFjZW1lbnRzKToKICAgIGlmIFBZMyBvciBfdXRpbHMuUFkyNzoKICAgICAgICBuZWVkc19hZGp1c3RtZW50ID0gdmlld2tleXModG9rZW5bJ2RhdGEnXSkgJiB2aWV3a2V5cyhyZXBsYWNlbWVudHMpCiAgICBlbHNlOgogICAgICAgIG5lZWRzX2FkanVzdG1lbnQgPSBmcm96ZW5zZXQodG9rZW5bJ2RhdGEnXSkgJiBmcm96ZW5zZXQocmVwbGFjZW1lbnRzKQogICAgaWYgbmVlZHNfYWRqdXN0bWVudDoKICAgICAgICB0b2tlblsnZGF0YSddID0gT3JkZXJlZERpY3QoKHJlcGxhY2VtZW50cy5nZXQoaywgayksIHYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIHRva2VuWydkYXRhJ10uaXRlbXMoKSkKCgpkZWYgaW1wbGllZFRhZ1Rva2VuKG5hbWUsIHR5cGU9IkVuZFRhZyIsIGF0dHJpYnV0ZXM9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBzZWxmQ2xvc2luZz1GYWxzZSk6CiAgICBpZiBhdHRyaWJ1dGVzIGlzIE5vbmU6CiAgICAgICAgYXR0cmlidXRlcyA9IHt9CiAgICByZXR1cm4geyJ0eXBlIjogdG9rZW5UeXBlc1t0eXBlXSwgIm5hbWUiOiBuYW1lLCAiZGF0YSI6IGF0dHJpYnV0ZXMsCiAgICAgICAgICAgICJzZWxmQ2xvc2luZyI6IHNlbGZDbG9zaW5nfQoKCmNsYXNzIFBhcnNlRXJyb3IoRXhjZXB0aW9uKToKICAgICIiIkVycm9yIGluIHBhcnNlZCBkb2N1bWVudCIiIgogICAgcGFzcwpQSwMEFAAAAAAAAAAhANzHuzRhNwAAYTcAADIAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvc2VyaWFsaXplci5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgdGV4dF90eXBlCgppbXBvcnQgcmUKCmZyb20gY29kZWNzIGltcG9ydCByZWdpc3Rlcl9lcnJvciwgeG1sY2hhcnJlZnJlcGxhY2VfZXJyb3JzCgpmcm9tIC5jb25zdGFudHMgaW1wb3J0IHZvaWRFbGVtZW50cywgYm9vbGVhbkF0dHJpYnV0ZXMsIHNwYWNlQ2hhcmFjdGVycwpmcm9tIC5jb25zdGFudHMgaW1wb3J0IHJjZGF0YUVsZW1lbnRzLCBlbnRpdGllcywgeG1sRW50aXRpZXMKZnJvbSAuIGltcG9ydCB0cmVld2Fsa2VycywgX3V0aWxzCmZyb20geG1sLnNheC5zYXh1dGlscyBpbXBvcnQgZXNjYXBlCgpfcXVvdGVBdHRyaWJ1dGVTcGVjQ2hhcnMgPSAiIi5qb2luKHNwYWNlQ2hhcmFjdGVycykgKyAiXCInPTw+YCIKX3F1b3RlQXR0cmlidXRlU3BlYyA9IHJlLmNvbXBpbGUoIlsiICsgX3F1b3RlQXR0cmlidXRlU3BlY0NoYXJzICsgIl0iKQpfcXVvdGVBdHRyaWJ1dGVMZWdhY3kgPSByZS5jb21waWxlKCJbIiArIF9xdW90ZUF0dHJpYnV0ZVNwZWNDaGFycyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx0XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MGJceDBjXHJceDBlXHgwZlx4MTBceDExXHgxMlx4MTNceDE0XHgxNSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgxNlx4MTdceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgyMFx4MmZceDYwXHhhMFx1MTY4MFx1MTgwZVx1MTgwZlx1MjAwMCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMjhcdTIwMjlcdTIwMmZcdTIwNWYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzAwMF0iKQoKCl9lbmNvZGVfZW50aXR5X21hcCA9IHt9Cl9pc191Y3M0ID0gbGVuKCJcVTAwMTBGRkZGIikgPT0gMQpmb3IgaywgdiBpbiBsaXN0KGVudGl0aWVzLml0ZW1zKCkpOgogICAgIyBza2lwIG11bHRpLWNoYXJhY3RlciBlbnRpdGllcwogICAgaWYgKChfaXNfdWNzNCBhbmQgbGVuKHYpID4gMSkgb3IKICAgICAgICAgICAgKG5vdCBfaXNfdWNzNCBhbmQgbGVuKHYpID4gMikpOgogICAgICAgIGNvbnRpbnVlCiAgICBpZiB2ICE9ICImIjoKICAgICAgICBpZiBsZW4odikgPT0gMjoKICAgICAgICAgICAgdiA9IF91dGlscy5zdXJyb2dhdGVQYWlyVG9Db2RlcG9pbnQodikKICAgICAgICBlbHNlOgogICAgICAgICAgICB2ID0gb3JkKHYpCiAgICAgICAgaWYgdiBub3QgaW4gX2VuY29kZV9lbnRpdHlfbWFwIG9yIGsuaXNsb3dlcigpOgogICAgICAgICAgICAjIHByZWZlciAmbHQ7IG92ZXIgJkxUOyBhbmQgc2ltaWxhcmx5IGZvciAmYW1wOywgJmd0OywgZXRjLgogICAgICAgICAgICBfZW5jb2RlX2VudGl0eV9tYXBbdl0gPSBrCgoKZGVmIGh0bWxlbnRpdHlyZXBsYWNlX2Vycm9ycyhleGMpOgogICAgaWYgaXNpbnN0YW5jZShleGMsIChVbmljb2RlRW5jb2RlRXJyb3IsIFVuaWNvZGVUcmFuc2xhdGVFcnJvcikpOgogICAgICAgIHJlcyA9IFtdCiAgICAgICAgY29kZXBvaW50cyA9IFtdCiAgICAgICAgc2tpcCA9IEZhbHNlCiAgICAgICAgZm9yIGksIGMgaW4gZW51bWVyYXRlKGV4Yy5vYmplY3RbZXhjLnN0YXJ0OmV4Yy5lbmRdKToKICAgICAgICAgICAgaWYgc2tpcDoKICAgICAgICAgICAgICAgIHNraXAgPSBGYWxzZQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaW5kZXggPSBpICsgZXhjLnN0YXJ0CiAgICAgICAgICAgIGlmIF91dGlscy5pc1N1cnJvZ2F0ZVBhaXIoZXhjLm9iamVjdFtpbmRleDptaW4oW2V4Yy5lbmQsIGluZGV4ICsgMl0pXSk6CiAgICAgICAgICAgICAgICBjb2RlcG9pbnQgPSBfdXRpbHMuc3Vycm9nYXRlUGFpclRvQ29kZXBvaW50KGV4Yy5vYmplY3RbaW5kZXg6aW5kZXggKyAyXSkKICAgICAgICAgICAgICAgIHNraXAgPSBUcnVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBjb2RlcG9pbnQgPSBvcmQoYykKICAgICAgICAgICAgY29kZXBvaW50cy5hcHBlbmQoY29kZXBvaW50KQogICAgICAgIGZvciBjcCBpbiBjb2RlcG9pbnRzOgogICAgICAgICAgICBlID0gX2VuY29kZV9lbnRpdHlfbWFwLmdldChjcCkKICAgICAgICAgICAgaWYgZToKICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoIiYiKQogICAgICAgICAgICAgICAgcmVzLmFwcGVuZChlKQogICAgICAgICAgICAgICAgaWYgbm90IGUuZW5kc3dpdGgoIjsiKToKICAgICAgICAgICAgICAgICAgICByZXMuYXBwZW5kKCI7IikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoIiYjeCVzOyIgJSAoaGV4KGNwKVsyOl0pKQogICAgICAgIHJldHVybiAoIiIuam9pbihyZXMpLCBleGMuZW5kKQogICAgZWxzZToKICAgICAgICByZXR1cm4geG1sY2hhcnJlZnJlcGxhY2VfZXJyb3JzKGV4YykKCnJlZ2lzdGVyX2Vycm9yKCJodG1sZW50aXR5cmVwbGFjZSIsIGh0bWxlbnRpdHlyZXBsYWNlX2Vycm9ycykKCgpkZWYgc2VyaWFsaXplKGlucHV0LCB0cmVlPSJldHJlZSIsIGVuY29kaW5nPU5vbmUsICoqc2VyaWFsaXplcl9vcHRzKToKICAgICMgWFhYOiBTaG91bGQgd2UgY2FjaGUgdGhpcz8KICAgIHdhbGtlciA9IHRyZWV3YWxrZXJzLmdldFRyZWVXYWxrZXIodHJlZSkKICAgIHMgPSBIVE1MU2VyaWFsaXplcigqKnNlcmlhbGl6ZXJfb3B0cykKICAgIHJldHVybiBzLnJlbmRlcih3YWxrZXIoaW5wdXQpLCBlbmNvZGluZykKCgpjbGFzcyBIVE1MU2VyaWFsaXplcihvYmplY3QpOgoKICAgICMgYXR0cmlidXRlIHF1b3Rpbmcgb3B0aW9ucwogICAgcXVvdGVfYXR0cl92YWx1ZXMgPSAibGVnYWN5IiAgIyBiZSBzZWN1cmUgYnkgZGVmYXVsdAogICAgcXVvdGVfY2hhciA9ICciJwogICAgdXNlX2Jlc3RfcXVvdGVfY2hhciA9IFRydWUKCiAgICAjIHRhZyBzeW50YXggb3B0aW9ucwogICAgb21pdF9vcHRpb25hbF90YWdzID0gVHJ1ZQogICAgbWluaW1pemVfYm9vbGVhbl9hdHRyaWJ1dGVzID0gVHJ1ZQogICAgdXNlX3RyYWlsaW5nX3NvbGlkdXMgPSBGYWxzZQogICAgc3BhY2VfYmVmb3JlX3RyYWlsaW5nX3NvbGlkdXMgPSBUcnVlCgogICAgIyBlc2NhcGluZyBvcHRpb25zCiAgICBlc2NhcGVfbHRfaW5fYXR0cnMgPSBGYWxzZQogICAgZXNjYXBlX3JjZGF0YSA9IEZhbHNlCiAgICByZXNvbHZlX2VudGl0aWVzID0gVHJ1ZQoKICAgICMgbWlzY2VsbGFuZW91cyBvcHRpb25zCiAgICBhbHBoYWJldGljYWxfYXR0cmlidXRlcyA9IEZhbHNlCiAgICBpbmplY3RfbWV0YV9jaGFyc2V0ID0gVHJ1ZQogICAgc3RyaXBfd2hpdGVzcGFjZSA9IEZhbHNlCiAgICBzYW5pdGl6ZSA9IEZhbHNlCgogICAgb3B0aW9ucyA9ICgicXVvdGVfYXR0cl92YWx1ZXMiLCAicXVvdGVfY2hhciIsICJ1c2VfYmVzdF9xdW90ZV9jaGFyIiwKICAgICAgICAgICAgICAgIm9taXRfb3B0aW9uYWxfdGFncyIsICJtaW5pbWl6ZV9ib29sZWFuX2F0dHJpYnV0ZXMiLAogICAgICAgICAgICAgICAidXNlX3RyYWlsaW5nX3NvbGlkdXMiLCAic3BhY2VfYmVmb3JlX3RyYWlsaW5nX3NvbGlkdXMiLAogICAgICAgICAgICAgICAiZXNjYXBlX2x0X2luX2F0dHJzIiwgImVzY2FwZV9yY2RhdGEiLCAicmVzb2x2ZV9lbnRpdGllcyIsCiAgICAgICAgICAgICAgICJhbHBoYWJldGljYWxfYXR0cmlidXRlcyIsICJpbmplY3RfbWV0YV9jaGFyc2V0IiwKICAgICAgICAgICAgICAgInN0cmlwX3doaXRlc3BhY2UiLCAic2FuaXRpemUiKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3YXJncyk6CiAgICAgICAgIiIiSW5pdGlhbGl6ZSBIVE1MU2VyaWFsaXplci4KCiAgICAgICAgS2V5d29yZCBvcHRpb25zIChkZWZhdWx0IGdpdmVuIGZpcnN0IHVubGVzcyBzcGVjaWZpZWQpIGluY2x1ZGU6CgogICAgICAgIGluamVjdF9tZXRhX2NoYXJzZXQ9VHJ1ZXxGYWxzZQogICAgICAgICAgV2hldGhlciBpdCBpbnNlcnQgYSBtZXRhIGVsZW1lbnQgdG8gZGVmaW5lIHRoZSBjaGFyYWN0ZXIgc2V0IG9mIHRoZQogICAgICAgICAgZG9jdW1lbnQuCiAgICAgICAgcXVvdGVfYXR0cl92YWx1ZXM9ImxlZ2FjeSJ8InNwZWMifCJhbHdheXMiCiAgICAgICAgICBXaGV0aGVyIHRvIHF1b3RlIGF0dHJpYnV0ZSB2YWx1ZXMgdGhhdCBkb24ndCByZXF1aXJlIHF1b3RpbmcKICAgICAgICAgIHBlciBsZWdhY3kgYnJvd3NlciBiZWhhdmlvdXIsIHdoZW4gcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkLCBvciBhbHdheXMuCiAgICAgICAgcXVvdGVfY2hhcj11JyInfHUiJyIKICAgICAgICAgIFVzZSBnaXZlbiBxdW90ZSBjaGFyYWN0ZXIgZm9yIGF0dHJpYnV0ZSBxdW90aW5nLiBEZWZhdWx0IGlzIHRvCiAgICAgICAgICB1c2UgZG91YmxlIHF1b3RlIHVubGVzcyBhdHRyaWJ1dGUgdmFsdWUgY29udGFpbnMgYSBkb3VibGUgcXVvdGUsCiAgICAgICAgICBpbiB3aGljaCBjYXNlIHNpbmdsZSBxdW90ZXMgYXJlIHVzZWQgaW5zdGVhZC4KICAgICAgICBlc2NhcGVfbHRfaW5fYXR0cnM9RmFsc2V8VHJ1ZQogICAgICAgICAgV2hldGhlciB0byBlc2NhcGUgPCBpbiBhdHRyaWJ1dGUgdmFsdWVzLgogICAgICAgIGVzY2FwZV9yY2RhdGE9RmFsc2V8VHJ1ZQogICAgICAgICAgV2hldGhlciB0byBlc2NhcGUgY2hhcmFjdGVycyB0aGF0IG5lZWQgdG8gYmUgZXNjYXBlZCB3aXRoaW4gbm9ybWFsCiAgICAgICAgICBlbGVtZW50cyB3aXRoaW4gcmNkYXRhIGVsZW1lbnRzIHN1Y2ggYXMgc3R5bGUuCiAgICAgICAgcmVzb2x2ZV9lbnRpdGllcz1UcnVlfEZhbHNlCiAgICAgICAgICBXaGV0aGVyIHRvIHJlc29sdmUgbmFtZWQgY2hhcmFjdGVyIGVudGl0aWVzIHRoYXQgYXBwZWFyIGluIHRoZQogICAgICAgICAgc291cmNlIHRyZWUuIFRoZSBYTUwgcHJlZGVmaW5lZCBlbnRpdGllcyAmbHQ7ICZndDsgJmFtcDsgJnF1b3Q7ICZhcG9zOwogICAgICAgICAgYXJlIHVuYWZmZWN0ZWQgYnkgdGhpcyBzZXR0aW5nLgogICAgICAgIHN0cmlwX3doaXRlc3BhY2U9RmFsc2V8VHJ1ZQogICAgICAgICAgV2hldGhlciB0byByZW1vdmUgc2VtYW50aWNhbGx5IG1lYW5pbmdsZXNzIHdoaXRlc3BhY2UuIChUaGlzCiAgICAgICAgICBjb21wcmVzc2VzIGFsbCB3aGl0ZXNwYWNlIHRvIGEgc2luZ2xlIHNwYWNlIGV4Y2VwdCB3aXRoaW4gcHJlLikKICAgICAgICBtaW5pbWl6ZV9ib29sZWFuX2F0dHJpYnV0ZXM9VHJ1ZXxGYWxzZQogICAgICAgICAgU2hvcnRlbnMgYm9vbGVhbiBhdHRyaWJ1dGVzIHRvIGdpdmUganVzdCB0aGUgYXR0cmlidXRlIHZhbHVlLAogICAgICAgICAgZm9yIGV4YW1wbGUgPGlucHV0IGRpc2FibGVkPSJkaXNhYmxlZCI+IGJlY29tZXMgPGlucHV0IGRpc2FibGVkPi4KICAgICAgICB1c2VfdHJhaWxpbmdfc29saWR1cz1GYWxzZXxUcnVlCiAgICAgICAgICBJbmNsdWRlcyBhIGNsb3NlLXRhZyBzbGFzaCBhdCB0aGUgZW5kIG9mIHRoZSBzdGFydCB0YWcgb2Ygdm9pZAogICAgICAgICAgZWxlbWVudHMgKGVtcHR5IGVsZW1lbnRzIHdob3NlIGVuZCB0YWcgaXMgZm9yYmlkZGVuKS4gRS5nLiA8aHIvPi4KICAgICAgICBzcGFjZV9iZWZvcmVfdHJhaWxpbmdfc29saWR1cz1UcnVlfEZhbHNlCiAgICAgICAgICBQbGFjZXMgYSBzcGFjZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGNsb3Npbmcgc2xhc2ggaW4gYSB0YWcKICAgICAgICAgIHVzaW5nIGEgdHJhaWxpbmcgc29saWR1cy4gRS5nLiA8aHIgLz4uIFJlcXVpcmVzIHVzZV90cmFpbGluZ19zb2xpZHVzLgogICAgICAgIHNhbml0aXplPUZhbHNlfFRydWUKICAgICAgICAgIFN0cmlwIGFsbCB1bnNhZmUgb3IgdW5rbm93biBjb25zdHJ1Y3RzIGZyb20gb3V0cHV0LgogICAgICAgICAgU2VlIGBodG1sNWxpYiB1c2VyIGRvY3VtZW50YXRpb25gXwogICAgICAgIG9taXRfb3B0aW9uYWxfdGFncz1UcnVlfEZhbHNlCiAgICAgICAgICBPbWl0IHN0YXJ0L2VuZCB0YWdzIHRoYXQgYXJlIG9wdGlvbmFsLgogICAgICAgIGFscGhhYmV0aWNhbF9hdHRyaWJ1dGVzPUZhbHNlfFRydWUKICAgICAgICAgIFJlb3JkZXIgYXR0cmlidXRlcyB0byBiZSBpbiBhbHBoYWJldGljYWwgb3JkZXIuCgogICAgICAgIC4uIF9odG1sNWxpYiB1c2VyIGRvY3VtZW50YXRpb246IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9odG1sNWxpYi93aWtpL1VzZXJEb2N1bWVudGF0aW9uCiAgICAgICAgIiIiCiAgICAgICAgdW5leHBlY3RlZF9hcmdzID0gZnJvemVuc2V0KGt3YXJncykgLSBmcm96ZW5zZXQoc2VsZi5vcHRpb25zKQogICAgICAgIGlmIGxlbih1bmV4cGVjdGVkX2FyZ3MpID4gMDoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJfX2luaXRfXygpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJyVzJyIgJSBuZXh0KGl0ZXIodW5leHBlY3RlZF9hcmdzKSkpCiAgICAgICAgaWYgJ3F1b3RlX2NoYXInIGluIGt3YXJnczoKICAgICAgICAgICAgc2VsZi51c2VfYmVzdF9xdW90ZV9jaGFyID0gRmFsc2UKICAgICAgICBmb3IgYXR0ciBpbiBzZWxmLm9wdGlvbnM6CiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwga3dhcmdzLmdldChhdHRyLCBnZXRhdHRyKHNlbGYsIGF0dHIpKSkKICAgICAgICBzZWxmLmVycm9ycyA9IFtdCiAgICAgICAgc2VsZi5zdHJpY3QgPSBGYWxzZQoKICAgIGRlZiBlbmNvZGUoc2VsZiwgc3RyaW5nKToKICAgICAgICBhc3NlcnQoaXNpbnN0YW5jZShzdHJpbmcsIHRleHRfdHlwZSkpCiAgICAgICAgaWYgc2VsZi5lbmNvZGluZzoKICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5lbmNvZGUoc2VsZi5lbmNvZGluZywgImh0bWxlbnRpdHlyZXBsYWNlIikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3RyaW5nCgogICAgZGVmIGVuY29kZVN0cmljdChzZWxmLCBzdHJpbmcpOgogICAgICAgIGFzc2VydChpc2luc3RhbmNlKHN0cmluZywgdGV4dF90eXBlKSkKICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgogICAgICAgICAgICByZXR1cm4gc3RyaW5nLmVuY29kZShzZWxmLmVuY29kaW5nLCAic3RyaWN0IikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3RyaW5nCgogICAgZGVmIHNlcmlhbGl6ZShzZWxmLCB0cmVld2Fsa2VyLCBlbmNvZGluZz1Ob25lKToKICAgICAgICAjIHB5bGludDpkaXNhYmxlPXRvby1tYW55LW5lc3RlZC1ibG9ja3MKICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKICAgICAgICBpbl9jZGF0YSA9IEZhbHNlCiAgICAgICAgc2VsZi5lcnJvcnMgPSBbXQoKICAgICAgICBpZiBlbmNvZGluZyBhbmQgc2VsZi5pbmplY3RfbWV0YV9jaGFyc2V0OgogICAgICAgICAgICBmcm9tIC5maWx0ZXJzLmluamVjdF9tZXRhX2NoYXJzZXQgaW1wb3J0IEZpbHRlcgogICAgICAgICAgICB0cmVld2Fsa2VyID0gRmlsdGVyKHRyZWV3YWxrZXIsIGVuY29kaW5nKQogICAgICAgICMgQWxwaGFiZXRpY2FsIGF0dHJpYnV0ZXMgaXMgaGVyZSB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IG5vbmUgb2YKICAgICAgICAjIHRoZSBsYXRlciBmaWx0ZXJzIGFkZCBvciBjaGFuZ2Ugb3JkZXIgb2YgYXR0cmlidXRlczsgaXQgbmVlZHMgdG8gYmUKICAgICAgICAjIGJlZm9yZSB0aGUgc2FuaXRpemVyIHNvIGVzY2FwZWQgZWxlbWVudHMgY29tZSBvdXQgY29ycmVjdGx5CiAgICAgICAgaWYgc2VsZi5hbHBoYWJldGljYWxfYXR0cmlidXRlczoKICAgICAgICAgICAgZnJvbSAuZmlsdGVycy5hbHBoYWJldGljYWxhdHRyaWJ1dGVzIGltcG9ydCBGaWx0ZXIKICAgICAgICAgICAgdHJlZXdhbGtlciA9IEZpbHRlcih0cmVld2Fsa2VyKQogICAgICAgICMgV2hpdGVzcGFjZUZpbHRlciBzaG91bGQgYmUgdXNlZCBiZWZvcmUgT3B0aW9uYWxUYWdGaWx0ZXIKICAgICAgICAjIGZvciBtYXhpbXVtIGVmZmljaWVudGx5IG9mIHRoaXMgbGF0dGVyIGZpbHRlcgogICAgICAgIGlmIHNlbGYuc3RyaXBfd2hpdGVzcGFjZToKICAgICAgICAgICAgZnJvbSAuZmlsdGVycy53aGl0ZXNwYWNlIGltcG9ydCBGaWx0ZXIKICAgICAgICAgICAgdHJlZXdhbGtlciA9IEZpbHRlcih0cmVld2Fsa2VyKQogICAgICAgIGlmIHNlbGYuc2FuaXRpemU6CiAgICAgICAgICAgIGZyb20gLmZpbHRlcnMuc2FuaXRpemVyIGltcG9ydCBGaWx0ZXIKICAgICAgICAgICAgdHJlZXdhbGtlciA9IEZpbHRlcih0cmVld2Fsa2VyKQogICAgICAgIGlmIHNlbGYub21pdF9vcHRpb25hbF90YWdzOgogICAgICAgICAgICBmcm9tIC5maWx0ZXJzLm9wdGlvbmFsdGFncyBpbXBvcnQgRmlsdGVyCiAgICAgICAgICAgIHRyZWV3YWxrZXIgPSBGaWx0ZXIodHJlZXdhbGtlcikKCiAgICAgICAgZm9yIHRva2VuIGluIHRyZWV3YWxrZXI6CiAgICAgICAgICAgIHR5cGUgPSB0b2tlblsidHlwZSJdCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIkRvY3R5cGUiOgogICAgICAgICAgICAgICAgZG9jdHlwZSA9ICI8IURPQ1RZUEUgJXMiICUgdG9rZW5bIm5hbWUiXQoKICAgICAgICAgICAgICAgIGlmIHRva2VuWyJwdWJsaWNJZCJdOgogICAgICAgICAgICAgICAgICAgIGRvY3R5cGUgKz0gJyBQVUJMSUMgIiVzIicgJSB0b2tlblsicHVibGljSWQiXQogICAgICAgICAgICAgICAgZWxpZiB0b2tlblsic3lzdGVtSWQiXToKICAgICAgICAgICAgICAgICAgICBkb2N0eXBlICs9ICIgU1lTVEVNIgogICAgICAgICAgICAgICAgaWYgdG9rZW5bInN5c3RlbUlkIl06CiAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW5bInN5c3RlbUlkIl0uZmluZCgnIicpID49IDA6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRva2VuWyJzeXN0ZW1JZCJdLmZpbmQoIiciKSA+PSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVFcnJvcigiU3lzdGVtIGlkZW50aWZlciBjb250YWlucyBib3RoIHNpbmdsZSBhbmQgZG91YmxlIHF1b3RlIGNoYXJhY3RlcnMiKQogICAgICAgICAgICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gIiciCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVfY2hhciA9ICciJwogICAgICAgICAgICAgICAgICAgIGRvY3R5cGUgKz0gIiAlcyVzJXMiICUgKHF1b3RlX2NoYXIsIHRva2VuWyJzeXN0ZW1JZCJdLCBxdW90ZV9jaGFyKQoKICAgICAgICAgICAgICAgIGRvY3R5cGUgKz0gIj4iCiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdChkb2N0eXBlKQoKICAgICAgICAgICAgZWxpZiB0eXBlIGluICgiQ2hhcmFjdGVycyIsICJTcGFjZUNoYXJhY3RlcnMiKToKICAgICAgICAgICAgICAgIGlmIHR5cGUgPT0gIlNwYWNlQ2hhcmFjdGVycyIgb3IgaW5fY2RhdGE6CiAgICAgICAgICAgICAgICAgICAgaWYgaW5fY2RhdGEgYW5kIHRva2VuWyJkYXRhIl0uZmluZCgiPC8iKSA+PSAwOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZUVycm9yKCJVbmV4cGVjdGVkIDwvIGluIENEQVRBIikKICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZSh0b2tlblsiZGF0YSJdKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZShlc2NhcGUodG9rZW5bImRhdGEiXSkpCgogICAgICAgICAgICBlbGlmIHR5cGUgaW4gKCJTdGFydFRhZyIsICJFbXB0eVRhZyIpOgogICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KCI8JXMiICUgbmFtZSkKICAgICAgICAgICAgICAgIGlmIG5hbWUgaW4gcmNkYXRhRWxlbWVudHMgYW5kIG5vdCBzZWxmLmVzY2FwZV9yY2RhdGE6CiAgICAgICAgICAgICAgICAgICAgaW5fY2RhdGEgPSBUcnVlCiAgICAgICAgICAgICAgICBlbGlmIGluX2NkYXRhOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplRXJyb3IoIlVuZXhwZWN0ZWQgY2hpbGQgZWxlbWVudCBvZiBhIENEQVRBIGVsZW1lbnQiKQogICAgICAgICAgICAgICAgZm9yIChfLCBhdHRyX25hbWUpLCBhdHRyX3ZhbHVlIGluIHRva2VuWyJkYXRhIl0uaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICAjIFRPRE86IEFkZCBuYW1lc3BhY2Ugc3VwcG9ydCBoZXJlCiAgICAgICAgICAgICAgICAgICAgayA9IGF0dHJfbmFtZQogICAgICAgICAgICAgICAgICAgIHYgPSBhdHRyX3ZhbHVlCiAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QoJyAnKQoKICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdChrKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLm1pbmltaXplX2Jvb2xlYW5fYXR0cmlidXRlcyBvciBcCiAgICAgICAgICAgICAgICAgICAgICAgIChrIG5vdCBpbiBib29sZWFuQXR0cmlidXRlcy5nZXQobmFtZSwgdHVwbGUoKSkgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICBrIG5vdCBpbiBib29sZWFuQXR0cmlidXRlcy5nZXQoIiIsIHR1cGxlKCkpKToKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QoIj0iKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnF1b3RlX2F0dHJfdmFsdWVzID09ICJhbHdheXMiIG9yIGxlbih2KSA9PSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVfYXR0ciA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBzZWxmLnF1b3RlX2F0dHJfdmFsdWVzID09ICJzcGVjIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlX2F0dHIgPSBfcXVvdGVBdHRyaWJ1dGVTcGVjLnNlYXJjaCh2KSBpcyBub3QgTm9uZQogICAgICAgICAgICAgICAgICAgICAgICBlbGlmIHNlbGYucXVvdGVfYXR0cl92YWx1ZXMgPT0gImxlZ2FjeSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZV9hdHRyID0gX3F1b3RlQXR0cmlidXRlTGVnYWN5LnNlYXJjaCh2KSBpcyBub3QgTm9uZQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicXVvdGVfYXR0cl92YWx1ZXMgbXVzdCBiZSBvbmUgb2Y6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIidhbHdheXMnLCAnc3BlYycsIG9yICdsZWdhY3knIikKICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHYucmVwbGFjZSgiJiIsICImYW1wOyIpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNjYXBlX2x0X2luX2F0dHJzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHYucmVwbGFjZSgiPCIsICImbHQ7IikKICAgICAgICAgICAgICAgICAgICAgICAgaWYgcXVvdGVfYXR0cjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlX2NoYXIgPSBzZWxmLnF1b3RlX2NoYXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudXNlX2Jlc3RfcXVvdGVfY2hhcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAiJyIgaW4gdiBhbmQgJyInIG5vdCBpbiB2OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gJyInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiAnIicgaW4gdiBhbmQgIiciIG5vdCBpbiB2OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gIiciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBxdW90ZV9jaGFyID09ICInIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdi5yZXBsYWNlKCInIiwgIiYjMzk7IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHYucmVwbGFjZSgnIicsICImcXVvdDsiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QocXVvdGVfY2hhcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlKHYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdChxdW90ZV9jaGFyKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGUodikKICAgICAgICAgICAgICAgIGlmIG5hbWUgaW4gdm9pZEVsZW1lbnRzIGFuZCBzZWxmLnVzZV90cmFpbGluZ19zb2xpZHVzOgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuc3BhY2VfYmVmb3JlX3RyYWlsaW5nX3NvbGlkdXM6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KCIgLyIpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QoIi8iKQogICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGUoIj4iKQoKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJFbmRUYWciOgogICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICAgICAgICAgIGlmIG5hbWUgaW4gcmNkYXRhRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgaW5fY2RhdGEgPSBGYWxzZQogICAgICAgICAgICAgICAgZWxpZiBpbl9jZGF0YToKICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZUVycm9yKCJVbmV4cGVjdGVkIGNoaWxkIGVsZW1lbnQgb2YgYSBDREFUQSBlbGVtZW50IikKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KCI8LyVzPiIgJSBuYW1lKQoKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJDb21tZW50IjoKICAgICAgICAgICAgICAgIGRhdGEgPSB0b2tlblsiZGF0YSJdCiAgICAgICAgICAgICAgICBpZiBkYXRhLmZpbmQoIi0tIikgPj0gMDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZUVycm9yKCJDb21tZW50IGNvbnRhaW5zIC0tIikKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KCI8IS0tJXMtLT4iICUgdG9rZW5bImRhdGEiXSkKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiRW50aXR5IjoKICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgICAgICAgICBrZXkgPSBuYW1lICsgIjsiCiAgICAgICAgICAgICAgICBpZiBrZXkgbm90IGluIGVudGl0aWVzOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplRXJyb3IoIkVudGl0eSAlcyBub3QgcmVjb2duaXplZCIgJSBuYW1lKQogICAgICAgICAgICAgICAgaWYgc2VsZi5yZXNvbHZlX2VudGl0aWVzIGFuZCBrZXkgbm90IGluIHhtbEVudGl0aWVzOgogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBlbnRpdGllc1trZXldCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGRhdGEgPSAiJiVzOyIgJSBuYW1lCiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdChkYXRhKQoKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplRXJyb3IodG9rZW5bImRhdGEiXSkKCiAgICBkZWYgcmVuZGVyKHNlbGYsIHRyZWV3YWxrZXIsIGVuY29kaW5nPU5vbmUpOgogICAgICAgIGlmIGVuY29kaW5nOgogICAgICAgICAgICByZXR1cm4gYiIiLmpvaW4obGlzdChzZWxmLnNlcmlhbGl6ZSh0cmVld2Fsa2VyLCBlbmNvZGluZykpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAiIi5qb2luKGxpc3Qoc2VsZi5zZXJpYWxpemUodHJlZXdhbGtlcikpKQoKICAgIGRlZiBzZXJpYWxpemVFcnJvcihzZWxmLCBkYXRhPSJYWFggRVJST1IgTUVTU0FHRSBORUVERUQiKToKICAgICAgICAjIFhYWCBUaGUgaWRlYSBpcyB0byBtYWtlIGRhdGEgbWFuZGF0b3J5LgogICAgICAgIHNlbGYuZXJyb3JzLmFwcGVuZChkYXRhKQogICAgICAgIGlmIHNlbGYuc3RyaWN0OgogICAgICAgICAgICByYWlzZSBTZXJpYWxpemVFcnJvcgoKCmNsYXNzIFNlcmlhbGl6ZUVycm9yKEV4Y2VwdGlvbik6CiAgICAiIiJFcnJvciBpbiBzZXJpYWxpemVkIHRyZWUiIiIKICAgIHBhc3MKUEsDBBQAAAAAAAAAIQCCMmMk0AAAANAAAAA9AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVhZGFwdGVycy9fX2luaXRfXy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSAuIGltcG9ydCBzYXgKCl9fYWxsX18gPSBbInNheCJdCgp0cnk6CiAgICBmcm9tIC4gaW1wb3J0IGdlbnNoaSAgIyBub3FhCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHBhc3MKZWxzZToKICAgIF9fYWxsX18uYXBwZW5kKCJnZW5zaGkiKQpQSwMEFAAAAAAAAAAhADEnx74TBgAAEwYAADsAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWFkYXB0ZXJzL2dlbnNoaS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSBnZW5zaGkuY29yZSBpbXBvcnQgUU5hbWUsIEF0dHJzCmZyb20gZ2Vuc2hpLmNvcmUgaW1wb3J0IFNUQVJULCBFTkQsIFRFWFQsIENPTU1FTlQsIERPQ1RZUEUKCgpkZWYgdG9fZ2Vuc2hpKHdhbGtlcik6CiAgICB0ZXh0ID0gW10KICAgIGZvciB0b2tlbiBpbiB3YWxrZXI6CiAgICAgICAgdHlwZSA9IHRva2VuWyJ0eXBlIl0KICAgICAgICBpZiB0eXBlIGluICgiQ2hhcmFjdGVycyIsICJTcGFjZUNoYXJhY3RlcnMiKToKICAgICAgICAgICAgdGV4dC5hcHBlbmQodG9rZW5bImRhdGEiXSkKICAgICAgICBlbGlmIHRleHQ6CiAgICAgICAgICAgIHlpZWxkIFRFWFQsICIiLmpvaW4odGV4dCksIChOb25lLCAtMSwgLTEpCiAgICAgICAgICAgIHRleHQgPSBbXQoKICAgICAgICBpZiB0eXBlIGluICgiU3RhcnRUYWciLCAiRW1wdHlUYWciKToKICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWVzcGFjZSJdOgogICAgICAgICAgICAgICAgbmFtZSA9ICJ7JXN9JXMiICUgKHRva2VuWyJuYW1lc3BhY2UiXSwgdG9rZW5bIm5hbWUiXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgICAgIGF0dHJzID0gQXR0cnMoWyhRTmFtZSgieyVzfSVzIiAlIGF0dHIgaWYgYXR0clswXSBpcyBub3QgTm9uZSBlbHNlIGF0dHJbMV0pLCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGF0dHIsIHZhbHVlIGluIHRva2VuWyJkYXRhIl0uaXRlbXMoKV0pCiAgICAgICAgICAgIHlpZWxkIChTVEFSVCwgKFFOYW1lKG5hbWUpLCBhdHRycyksIChOb25lLCAtMSwgLTEpKQogICAgICAgICAgICBpZiB0eXBlID09ICJFbXB0eVRhZyI6CiAgICAgICAgICAgICAgICB0eXBlID0gIkVuZFRhZyIKCiAgICAgICAgaWYgdHlwZSA9PSAiRW5kVGFnIjoKICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWVzcGFjZSJdOgogICAgICAgICAgICAgICAgbmFtZSA9ICJ7JXN9JXMiICUgKHRva2VuWyJuYW1lc3BhY2UiXSwgdG9rZW5bIm5hbWUiXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCgogICAgICAgICAgICB5aWVsZCBFTkQsIFFOYW1lKG5hbWUpLCAoTm9uZSwgLTEsIC0xKQoKICAgICAgICBlbGlmIHR5cGUgPT0gIkNvbW1lbnQiOgogICAgICAgICAgICB5aWVsZCBDT01NRU5ULCB0b2tlblsiZGF0YSJdLCAoTm9uZSwgLTEsIC0xKQoKICAgICAgICBlbGlmIHR5cGUgPT0gIkRvY3R5cGUiOgogICAgICAgICAgICB5aWVsZCBET0NUWVBFLCAodG9rZW5bIm5hbWUiXSwgdG9rZW5bInB1YmxpY0lkIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsic3lzdGVtSWQiXSksIChOb25lLCAtMSwgLTEpCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhc3MgICMgRklYTUU6IFdoYXQgdG8gZG8/CgogICAgaWYgdGV4dDoKICAgICAgICB5aWVsZCBURVhULCAiIi5qb2luKHRleHQpLCAoTm9uZSwgLTEsIC0xKQpQSwMEFAAAAAAAAAAhAORcXxB9BgAAfQYAADgAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWFkYXB0ZXJzL3NheC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSB4bWwuc2F4LnhtbHJlYWRlciBpbXBvcnQgQXR0cmlidXRlc05TSW1wbAoKZnJvbSAuLmNvbnN0YW50cyBpbXBvcnQgYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXMsIHVuYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXMKCnByZWZpeF9tYXBwaW5nID0ge30KZm9yIHByZWZpeCwgbG9jYWxOYW1lLCBuYW1lc3BhY2UgaW4gYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXMudmFsdWVzKCk6CiAgICBpZiBwcmVmaXggaXMgbm90IE5vbmU6CiAgICAgICAgcHJlZml4X21hcHBpbmdbcHJlZml4XSA9IG5hbWVzcGFjZQoKCmRlZiB0b19zYXgod2Fsa2VyLCBoYW5kbGVyKToKICAgICIiIkNhbGwgU0FYLWxpa2UgY29udGVudCBoYW5kbGVyIGJhc2VkIG9uIHRyZWV3YWxrZXIgd2Fsa2VyIiIiCiAgICBoYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKQogICAgZm9yIHByZWZpeCwgbmFtZXNwYWNlIGluIHByZWZpeF9tYXBwaW5nLml0ZW1zKCk6CiAgICAgICAgaGFuZGxlci5zdGFydFByZWZpeE1hcHBpbmcocHJlZml4LCBuYW1lc3BhY2UpCgogICAgZm9yIHRva2VuIGluIHdhbGtlcjoKICAgICAgICB0eXBlID0gdG9rZW5bInR5cGUiXQogICAgICAgIGlmIHR5cGUgPT0gIkRvY3R5cGUiOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGVsaWYgdHlwZSBpbiAoIlN0YXJ0VGFnIiwgIkVtcHR5VGFnIik6CiAgICAgICAgICAgIGF0dHJzID0gQXR0cmlidXRlc05TSW1wbCh0b2tlblsiZGF0YSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5hZGp1c3RGb3JlaWduQXR0cmlidXRlcykKICAgICAgICAgICAgaGFuZGxlci5zdGFydEVsZW1lbnROUygodG9rZW5bIm5hbWVzcGFjZSJdLCB0b2tlblsibmFtZSJdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsibmFtZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzKQogICAgICAgICAgICBpZiB0eXBlID09ICJFbXB0eVRhZyI6CiAgICAgICAgICAgICAgICBoYW5kbGVyLmVuZEVsZW1lbnROUygodG9rZW5bIm5hbWVzcGFjZSJdLCB0b2tlblsibmFtZSJdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lIl0pCiAgICAgICAgZWxpZiB0eXBlID09ICJFbmRUYWciOgogICAgICAgICAgICBoYW5kbGVyLmVuZEVsZW1lbnROUygodG9rZW5bIm5hbWVzcGFjZSJdLCB0b2tlblsibmFtZSJdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bIm5hbWUiXSkKICAgICAgICBlbGlmIHR5cGUgaW4gKCJDaGFyYWN0ZXJzIiwgIlNwYWNlQ2hhcmFjdGVycyIpOgogICAgICAgICAgICBoYW5kbGVyLmNoYXJhY3RlcnModG9rZW5bImRhdGEiXSkKICAgICAgICBlbGlmIHR5cGUgPT0gIkNvbW1lbnQiOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXNzZXJ0IEZhbHNlLCAiVW5rbm93biB0b2tlbiB0eXBlIgoKICAgIGZvciBwcmVmaXgsIG5hbWVzcGFjZSBpbiBwcmVmaXhfbWFwcGluZy5pdGVtcygpOgogICAgICAgIGhhbmRsZXIuZW5kUHJlZml4TWFwcGluZyhwcmVmaXgpCiAgICBoYW5kbGVyLmVuZERvY3VtZW50KCkKUEsDBBQAAAAAAAAAIQBH2TduTg0AAE4NAAA9AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9fX2luaXRfXy5weSIiIkEgY29sbGVjdGlvbiBvZiBtb2R1bGVzIGZvciBidWlsZGluZyBkaWZmZXJlbnQga2luZHMgb2YgdHJlZSBmcm9tCkhUTUwgZG9jdW1lbnRzLgoKVG8gY3JlYXRlIGEgdHJlZWJ1aWxkZXIgZm9yIGEgbmV3IHR5cGUgb2YgdHJlZSwgeW91IG5lZWQgdG8gZG8KaW1wbGVtZW50IHNldmVyYWwgdGhpbmdzOgoKMSkgQSBzZXQgb2YgY2xhc3NlcyBmb3IgdmFyaW91cyB0eXBlcyBvZiBlbGVtZW50czogRG9jdW1lbnQsIERvY3R5cGUsCkNvbW1lbnQsIEVsZW1lbnQuIFRoZXNlIG11c3QgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2Ugb2YKX2Jhc2UudHJlZWJ1aWxkZXJzLk5vZGUgKGFsdGhvdWdoIGNvbW1lbnQgbm9kZXMgaGF2ZSBhIGRpZmZlcmVudApzaWduYXR1cmUgZm9yIHRoZWlyIGNvbnN0cnVjdG9yLCBzZWUgdHJlZWJ1aWxkZXJzLmV0cmVlLkNvbW1lbnQpClRleHR1YWwgY29udGVudCBtYXkgYWxzbyBiZSBpbXBsZW1lbnRlZCBhcyBhbm90aGVyIG5vZGUgdHlwZSwgb3Igbm90LCBhcwp5b3VyIHRyZWUgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMuCgoyKSBBIHRyZWVidWlsZGVyIG9iamVjdCAoY2FsbGVkIFRyZWVCdWlsZGVyIGJ5IGNvbnZlbnRpb24pIHRoYXQKaW5oZXJpdHMgZnJvbSB0cmVlYnVpbGRlcnMuX2Jhc2UuVHJlZUJ1aWxkZXIuIFRoaXMgaGFzIDQgcmVxdWlyZWQgYXR0cmlidXRlczoKZG9jdW1lbnRDbGFzcyAtIHRoZSBjbGFzcyB0byB1c2UgZm9yIHRoZSBib3R0b21tb3N0IG5vZGUgb2YgYSBkb2N1bWVudAplbGVtZW50Q2xhc3MgLSB0aGUgY2xhc3MgdG8gdXNlIGZvciBIVE1MIEVsZW1lbnRzCmNvbW1lbnRDbGFzcyAtIHRoZSBjbGFzcyB0byB1c2UgZm9yIGNvbW1lbnRzCmRvY3R5cGVDbGFzcyAtIHRoZSBjbGFzcyB0byB1c2UgZm9yIGRvY3R5cGVzCkl0IGFsc28gaGFzIG9uZSByZXF1aXJlZCBtZXRob2Q6CmdldERvY3VtZW50IC0gUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoZSBjb21wbGV0ZSBkb2N1bWVudCB0cmVlCgozKSBJZiB5b3Ugd2lzaCB0byBydW4gdGhlIHVuaXQgdGVzdHMsIHlvdSBtdXN0IGFsc28gY3JlYXRlIGEKdGVzdFNlcmlhbGl6ZXIgbWV0aG9kIG9uIHlvdXIgdHJlZWJ1aWxkZXIgd2hpY2ggYWNjZXB0cyBhIG5vZGUgYW5kCnJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBOb2RlIGFuZCBpdHMgY2hpbGRyZW4gc2VyaWFsaXplZCBhY2NvcmRpbmcKdG8gdGhlIGZvcm1hdCB1c2VkIGluIHRoZSB1bml0dGVzdHMKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gLi5fdXRpbHMgaW1wb3J0IGRlZmF1bHRfZXRyZWUKCnRyZWVCdWlsZGVyQ2FjaGUgPSB7fQoKCmRlZiBnZXRUcmVlQnVpbGRlcih0cmVlVHlwZSwgaW1wbGVtZW50YXRpb249Tm9uZSwgKiprd2FyZ3MpOgogICAgIiIiR2V0IGEgVHJlZUJ1aWxkZXIgY2xhc3MgZm9yIHZhcmlvdXMgdHlwZXMgb2YgdHJlZSB3aXRoIGJ1aWx0LWluIHN1cHBvcnQKCiAgICB0cmVlVHlwZSAtIHRoZSBuYW1lIG9mIHRoZSB0cmVlIHR5cGUgcmVxdWlyZWQgKGNhc2UtaW5zZW5zaXRpdmUpLiBTdXBwb3J0ZWQKICAgICAgICAgICAgICAgdmFsdWVzIGFyZToKCiAgICAgICAgICAgICAgICJkb20iIC0gQSBnZW5lcmljIGJ1aWxkZXIgZm9yIERPTSBpbXBsZW1lbnRhdGlvbnMsIGRlZmF1bHRpbmcgdG8KICAgICAgICAgICAgICAgICAgICAgICBhIHhtbC5kb20ubWluaWRvbSBiYXNlZCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgICAgICAgImV0cmVlIiAtIEEgZ2VuZXJpYyBidWlsZGVyIGZvciB0cmVlIGltcGxlbWVudGF0aW9ucyBleHBvc2luZyBhbgogICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudFRyZWUtbGlrZSBpbnRlcmZhY2UsIGRlZmF1bHRpbmcgdG8KICAgICAgICAgICAgICAgICAgICAgICAgIHhtbC5ldHJlZS5jRWxlbWVudFRyZWUgaWYgYXZhaWxhYmxlIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIGlmIG5vdC4KICAgICAgICAgICAgICAgImx4bWwiIC0gQSBldHJlZS1iYXNlZCBidWlsZGVyIGZvciBseG1sLmV0cmVlLCBoYW5kbGluZwogICAgICAgICAgICAgICAgICAgICAgICBsaW1pdGF0aW9ucyBvZiBseG1sJ3MgaW1wbGVtZW50YXRpb24uCgogICAgaW1wbGVtZW50YXRpb24gLSAoQ3VycmVudGx5IGFwcGxpZXMgdG8gdGhlICJldHJlZSIgYW5kICJkb20iIHRyZWUgdHlwZXMpLiBBCiAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgaW1wbGVtZW50aW5nIHRoZSB0cmVlIHR5cGUgZS5nLgogICAgICAgICAgICAgICAgICAgICAgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIG9yIHhtbC5ldHJlZS5jRWxlbWVudFRyZWUuIiIiCgogICAgdHJlZVR5cGUgPSB0cmVlVHlwZS5sb3dlcigpCiAgICBpZiB0cmVlVHlwZSBub3QgaW4gdHJlZUJ1aWxkZXJDYWNoZToKICAgICAgICBpZiB0cmVlVHlwZSA9PSAiZG9tIjoKICAgICAgICAgICAgZnJvbSAuIGltcG9ydCBkb20KICAgICAgICAgICAgIyBDb21lIHVwIHdpdGggYSBzYW5lIGRlZmF1bHQgKHByZWYuIGZyb20gdGhlIHN0ZGxpYikKICAgICAgICAgICAgaWYgaW1wbGVtZW50YXRpb24gaXMgTm9uZToKICAgICAgICAgICAgICAgIGZyb20geG1sLmRvbSBpbXBvcnQgbWluaWRvbQogICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gPSBtaW5pZG9tCiAgICAgICAgICAgICMgTkVWRVIgY2FjaGUgaGVyZSwgY2FjaGluZyBpcyBkb25lIGluIHRoZSBkb20gc3VibW9kdWxlCiAgICAgICAgICAgIHJldHVybiBkb20uZ2V0RG9tTW9kdWxlKGltcGxlbWVudGF0aW9uLCAqKmt3YXJncykuVHJlZUJ1aWxkZXIKICAgICAgICBlbGlmIHRyZWVUeXBlID09ICJseG1sIjoKICAgICAgICAgICAgZnJvbSAuIGltcG9ydCBldHJlZV9seG1sCiAgICAgICAgICAgIHRyZWVCdWlsZGVyQ2FjaGVbdHJlZVR5cGVdID0gZXRyZWVfbHhtbC5UcmVlQnVpbGRlcgogICAgICAgIGVsaWYgdHJlZVR5cGUgPT0gImV0cmVlIjoKICAgICAgICAgICAgZnJvbSAuIGltcG9ydCBldHJlZQogICAgICAgICAgICBpZiBpbXBsZW1lbnRhdGlvbiBpcyBOb25lOgogICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gPSBkZWZhdWx0X2V0cmVlCiAgICAgICAgICAgICMgTkVWRVIgY2FjaGUgaGVyZSwgY2FjaGluZyBpcyBkb25lIGluIHRoZSBldHJlZSBzdWJtb2R1bGUKICAgICAgICAgICAgcmV0dXJuIGV0cmVlLmdldEVUcmVlTW9kdWxlKGltcGxlbWVudGF0aW9uLCAqKmt3YXJncykuVHJlZUJ1aWxkZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCIiIlVucmVjb2duaXNlZCB0cmVlYnVpbGRlciAiJXMiICIiIiAlIHRyZWVUeXBlKQogICAgcmV0dXJuIHRyZWVCdWlsZGVyQ2FjaGUuZ2V0KHRyZWVUeXBlKQpQSwMEFAAAAAAAAAAhAETKVqp2NgAAdjYAADkAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2Jhc2UucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHRleHRfdHlwZQoKZnJvbSAuLmNvbnN0YW50cyBpbXBvcnQgc2NvcGluZ0VsZW1lbnRzLCB0YWJsZUluc2VydE1vZGVFbGVtZW50cywgbmFtZXNwYWNlcwoKIyBUaGUgc2NvcGUgbWFya2VycyBhcmUgaW5zZXJ0ZWQgd2hlbiBlbnRlcmluZyBvYmplY3QgZWxlbWVudHMsCiMgbWFycXVlZXMsIHRhYmxlIGNlbGxzLCBhbmQgdGFibGUgY2FwdGlvbnMsIGFuZCBhcmUgdXNlZCB0byBwcmV2ZW50IGZvcm1hdHRpbmcKIyBmcm9tICJsZWFraW5nIiBpbnRvIHRhYmxlcywgb2JqZWN0IGVsZW1lbnRzLCBhbmQgbWFycXVlZXMuCk1hcmtlciA9IE5vbmUKCmxpc3RFbGVtZW50c01hcCA9IHsKICAgIE5vbmU6IChmcm96ZW5zZXQoc2NvcGluZ0VsZW1lbnRzKSwgRmFsc2UpLAogICAgImJ1dHRvbiI6IChmcm96ZW5zZXQoc2NvcGluZ0VsZW1lbnRzIHwgc2V0KFsobmFtZXNwYWNlc1siaHRtbCJdLCAiYnV0dG9uIildKSksIEZhbHNlKSwKICAgICJsaXN0IjogKGZyb3plbnNldChzY29waW5nRWxlbWVudHMgfCBzZXQoWyhuYW1lc3BhY2VzWyJodG1sIl0sICJvbCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInVsIildKSksIEZhbHNlKSwKICAgICJ0YWJsZSI6IChmcm96ZW5zZXQoWyhuYW1lc3BhY2VzWyJodG1sIl0sICJodG1sIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGFibGUiKV0pLCBGYWxzZSksCiAgICAic2VsZWN0IjogKGZyb3plbnNldChbKG5hbWVzcGFjZXNbImh0bWwiXSwgIm9wdGdyb3VwIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm9wdGlvbiIpXSksIFRydWUpCn0KCgpjbGFzcyBOb2RlKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiTm9kZSByZXByZXNlbnRpbmcgYW4gaXRlbSBpbiB0aGUgdHJlZS4KICAgICAgICBuYW1lIC0gVGhlIHRhZyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9kZQogICAgICAgIHBhcmVudCAtIFRoZSBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZSAob3IgTm9uZSBmb3IgdGhlIGRvY3VtZW50IG5vZGUpCiAgICAgICAgdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgbm9kZSAoYXBwbGllcyB0byB0ZXh0IG5vZGVzIGFuZAogICAgICAgIGNvbW1lbnRzCiAgICAgICAgYXR0cmlidXRlcyAtIGEgZGljdCBob2xkaW5nIG5hbWUsIHZhbHVlIHBhaXJzIGZvciBhdHRyaWJ1dGVzIG9mIHRoZSBub2RlCiAgICAgICAgY2hpbGROb2RlcyAtIGEgbGlzdCBvZiBjaGlsZCBub2RlcyBvZiB0aGUgY3VycmVudCBub2RlLiBUaGlzIG11c3QKICAgICAgICBpbmNsdWRlIGFsbCBlbGVtZW50cyBidXQgbm90IG5lY2Vzc2FyaWx5IG90aGVyIG5vZGUgdHlwZXMKICAgICAgICBfZmxhZ3MgLSBBIGxpc3Qgb2YgbWlzY2VsbGFuZW91cyBmbGFncyB0aGF0IGNhbiBiZSBzZXQgb24gdGhlIG5vZGUKICAgICAgICAiIiIKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCiAgICAgICAgc2VsZi52YWx1ZSA9IE5vbmUKICAgICAgICBzZWxmLmF0dHJpYnV0ZXMgPSB7fQogICAgICAgIHNlbGYuY2hpbGROb2RlcyA9IFtdCiAgICAgICAgc2VsZi5fZmxhZ3MgPSBbXQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIGF0dHJpYnV0ZXNTdHIgPSAiICIuam9pbihbIiVzPVwiJXNcIiIgJSAobmFtZSwgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXR0cmlidXRlcy5pdGVtcygpXSkKICAgICAgICBpZiBhdHRyaWJ1dGVzU3RyOgogICAgICAgICAgICByZXR1cm4gIjwlcyAlcz4iICUgKHNlbGYubmFtZSwgYXR0cmlidXRlc1N0cikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gIjwlcz4iICUgKHNlbGYubmFtZSkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8JXM+IiAlIChzZWxmLm5hbWUpCgogICAgZGVmIGFwcGVuZENoaWxkKHNlbGYsIG5vZGUpOgogICAgICAgICIiIkluc2VydCBub2RlIGFzIGEgY2hpbGQgb2YgdGhlIGN1cnJlbnQgbm9kZQogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgaW5zZXJ0VGV4dChzZWxmLCBkYXRhLCBpbnNlcnRCZWZvcmU9Tm9uZSk6CiAgICAgICAgIiIiSW5zZXJ0IGRhdGEgYXMgdGV4dCBpbiB0aGUgY3VycmVudCBub2RlLCBwb3NpdGlvbmVkIGJlZm9yZSB0aGUKICAgICAgICBzdGFydCBvZiBub2RlIGluc2VydEJlZm9yZSBvciB0byB0aGUgZW5kIG9mIHRoZSBub2RlJ3MgdGV4dC4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGluc2VydEJlZm9yZShzZWxmLCBub2RlLCByZWZOb2RlKToKICAgICAgICAiIiJJbnNlcnQgbm9kZSBhcyBhIGNoaWxkIG9mIHRoZSBjdXJyZW50IG5vZGUsIGJlZm9yZSByZWZOb2RlIGluIHRoZQogICAgICAgIGxpc3Qgb2YgY2hpbGQgbm9kZXMuIFJhaXNlcyBWYWx1ZUVycm9yIGlmIHJlZk5vZGUgaXMgbm90IGEgY2hpbGQgb2YKICAgICAgICB0aGUgY3VycmVudCBub2RlIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiByZW1vdmVDaGlsZChzZWxmLCBub2RlKToKICAgICAgICAiIiJSZW1vdmUgbm9kZSBmcm9tIHRoZSBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBub2RlCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiByZXBhcmVudENoaWxkcmVuKHNlbGYsIG5ld1BhcmVudCk6CiAgICAgICAgIiIiTW92ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IG5vZGUgdG8gbmV3UGFyZW50LgogICAgICAgIFRoaXMgaXMgbmVlZGVkIHNvIHRoYXQgdHJlZXMgdGhhdCBkb24ndCBzdG9yZSB0ZXh0IGFzIG5vZGVzIG1vdmUgdGhlCiAgICAgICAgdGV4dCBpbiB0aGUgY29ycmVjdCB3YXkKICAgICAgICAiIiIKICAgICAgICAjIFhYWCAtIHNob3VsZCB0aGlzIG1ldGhvZCBiZSBtYWRlIG1vcmUgZ2VuZXJhbD8KICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5jaGlsZE5vZGVzOgogICAgICAgICAgICBuZXdQYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpCiAgICAgICAgc2VsZi5jaGlsZE5vZGVzID0gW10KCiAgICBkZWYgY2xvbmVOb2RlKHNlbGYpOgogICAgICAgICIiIlJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGUgY3VycmVudCBub2RlIGkuZS4gYSBub2RlIHdpdGggdGhlIHNhbWUKICAgICAgICBuYW1lIGFuZCBhdHRyaWJ1dGVzIGJ1dCB3aXRoIG5vIHBhcmVudCBvciBjaGlsZCBub2RlcwogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgaGFzQ29udGVudChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBoYXMgY2hpbGRyZW4gb3IgdGV4dCwgZmFsc2Ugb3RoZXJ3aXNlCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKCmNsYXNzIEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cyhsaXN0KToKICAgIGRlZiBhcHBlbmQoc2VsZiwgbm9kZSk6CiAgICAgICAgZXF1YWxDb3VudCA9IDAKICAgICAgICBpZiBub2RlICE9IE1hcmtlcjoKICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gc2VsZls6Oi0xXToKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQgPT0gTWFya2VyOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBpZiBzZWxmLm5vZGVzRXF1YWwoZWxlbWVudCwgbm9kZSk6CiAgICAgICAgICAgICAgICAgICAgZXF1YWxDb3VudCArPSAxCiAgICAgICAgICAgICAgICBpZiBlcXVhbENvdW50ID09IDM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZW1vdmUoZWxlbWVudCkKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGxpc3QuYXBwZW5kKHNlbGYsIG5vZGUpCgogICAgZGVmIG5vZGVzRXF1YWwoc2VsZiwgbm9kZTEsIG5vZGUyKToKICAgICAgICBpZiBub3Qgbm9kZTEubmFtZVR1cGxlID09IG5vZGUyLm5hbWVUdXBsZToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGlmIG5vdCBub2RlMS5hdHRyaWJ1dGVzID09IG5vZGUyLmF0dHJpYnV0ZXM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICByZXR1cm4gVHJ1ZQoKCmNsYXNzIFRyZWVCdWlsZGVyKG9iamVjdCk6CiAgICAiIiJCYXNlIHRyZWVidWlsZGVyIGltcGxlbWVudGF0aW9uCiAgICBkb2N1bWVudENsYXNzIC0gdGhlIGNsYXNzIHRvIHVzZSBmb3IgdGhlIGJvdHRvbW1vc3Qgbm9kZSBvZiBhIGRvY3VtZW50CiAgICBlbGVtZW50Q2xhc3MgLSB0aGUgY2xhc3MgdG8gdXNlIGZvciBIVE1MIEVsZW1lbnRzCiAgICBjb21tZW50Q2xhc3MgLSB0aGUgY2xhc3MgdG8gdXNlIGZvciBjb21tZW50cwogICAgZG9jdHlwZUNsYXNzIC0gdGhlIGNsYXNzIHRvIHVzZSBmb3IgZG9jdHlwZXMKICAgICIiIgogICAgIyBweWxpbnQ6ZGlzYWJsZT1ub3QtY2FsbGFibGUKCiAgICAjIERvY3VtZW50IGNsYXNzCiAgICBkb2N1bWVudENsYXNzID0gTm9uZQoKICAgICMgVGhlIGNsYXNzIHRvIHVzZSBmb3IgY3JlYXRpbmcgYSBub2RlCiAgICBlbGVtZW50Q2xhc3MgPSBOb25lCgogICAgIyBUaGUgY2xhc3MgdG8gdXNlIGZvciBjcmVhdGluZyBjb21tZW50cwogICAgY29tbWVudENsYXNzID0gTm9uZQoKICAgICMgVGhlIGNsYXNzIHRvIHVzZSBmb3IgY3JlYXRpbmcgZG9jdHlwZXMKICAgIGRvY3R5cGVDbGFzcyA9IE5vbmUKCiAgICAjIEZyYWdtZW50IGNsYXNzCiAgICBmcmFnbWVudENsYXNzID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lc3BhY2VIVE1MRWxlbWVudHMpOgogICAgICAgIGlmIG5hbWVzcGFjZUhUTUxFbGVtZW50czoKICAgICAgICAgICAgc2VsZi5kZWZhdWx0TmFtZXNwYWNlID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5kZWZhdWx0TmFtZXNwYWNlID0gTm9uZQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLm9wZW5FbGVtZW50cyA9IFtdCiAgICAgICAgc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMgPSBBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQoKICAgICAgICAjIFhYWCAtIHJlbmFtZSB0aGVzZSB0byBoZWFkRWxlbWVudCwgZm9ybUVsZW1lbnQKICAgICAgICBzZWxmLmhlYWRQb2ludGVyID0gTm9uZQogICAgICAgIHNlbGYuZm9ybVBvaW50ZXIgPSBOb25lCgogICAgICAgIHNlbGYuaW5zZXJ0RnJvbVRhYmxlID0gRmFsc2UKCiAgICAgICAgc2VsZi5kb2N1bWVudCA9IHNlbGYuZG9jdW1lbnRDbGFzcygpCgogICAgZGVmIGVsZW1lbnRJblNjb3BlKHNlbGYsIHRhcmdldCwgdmFyaWFudD1Ob25lKToKCiAgICAgICAgIyBJZiB3ZSBwYXNzIGEgbm9kZSBpbiB3ZSBtYXRjaCB0aGF0LiBpZiB3ZSBwYXNzIGEgc3RyaW5nCiAgICAgICAgIyBtYXRjaCBhbnkgbm9kZSB3aXRoIHRoYXQgbmFtZQogICAgICAgIGV4YWN0Tm9kZSA9IGhhc2F0dHIodGFyZ2V0LCAibmFtZVR1cGxlIikKICAgICAgICBpZiBub3QgZXhhY3ROb2RlOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRhcmdldCwgdGV4dF90eXBlKToKICAgICAgICAgICAgICAgIHRhcmdldCA9IChuYW1lc3BhY2VzWyJodG1sIl0sIHRhcmdldCkKICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodGFyZ2V0LCB0dXBsZSkKCiAgICAgICAgbGlzdEVsZW1lbnRzLCBpbnZlcnQgPSBsaXN0RWxlbWVudHNNYXBbdmFyaWFudF0KCiAgICAgICAgZm9yIG5vZGUgaW4gcmV2ZXJzZWQoc2VsZi5vcGVuRWxlbWVudHMpOgogICAgICAgICAgICBpZiBleGFjdE5vZGUgYW5kIG5vZGUgPT0gdGFyZ2V0OgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgZWxpZiBub3QgZXhhY3ROb2RlIGFuZCBub2RlLm5hbWVUdXBsZSA9PSB0YXJnZXQ6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICBlbGlmIChpbnZlcnQgXiAobm9kZS5uYW1lVHVwbGUgaW4gbGlzdEVsZW1lbnRzKSk6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgYXNzZXJ0IEZhbHNlICAjIFdlIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIHBvaW50CgogICAgZGVmIHJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKHNlbGYpOgogICAgICAgICMgV2l0aGluIHRoaXMgYWxnb3JpdGhtIHRoZSBvcmRlciBvZiBzdGVwcyBkZXNjcmliZWQgaW4gdGhlCiAgICAgICAgIyBzcGVjaWZpY2F0aW9uIGlzIG5vdCBxdWl0ZSB0aGUgc2FtZSBhcyB0aGUgb3JkZXIgb2Ygc3RlcHMgaW4gdGhlCiAgICAgICAgIyBjb2RlLiBJdCBzaG91bGQgc3RpbGwgZG8gdGhlIHNhbWUgdGhvdWdoLgoKICAgICAgICAjIFN0ZXAgMTogc3RvcCB0aGUgYWxnb3JpdGhtIHdoZW4gdGhlcmUncyBub3RoaW5nIHRvIGRvLgogICAgICAgIGlmIG5vdCBzZWxmLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50czoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgU3RlcCAyIGFuZCBzdGVwIDM6IHdlIHN0YXJ0IHdpdGggdGhlIGxhc3QgZWxlbWVudC4gU28gaSBpcyAtMS4KICAgICAgICBpID0gbGVuKHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKSAtIDEKICAgICAgICBlbnRyeSA9IHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzW2ldCiAgICAgICAgaWYgZW50cnkgPT0gTWFya2VyIG9yIGVudHJ5IGluIHNlbGYub3BlbkVsZW1lbnRzOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBTdGVwIDYKICAgICAgICB3aGlsZSBlbnRyeSAhPSBNYXJrZXIgYW5kIGVudHJ5IG5vdCBpbiBzZWxmLm9wZW5FbGVtZW50czoKICAgICAgICAgICAgaWYgaSA9PSAwOgogICAgICAgICAgICAgICAgIyBUaGlzIHdpbGwgYmUgcmVzZXQgdG8gMCBiZWxvdwogICAgICAgICAgICAgICAgaSA9IC0xCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpIC09IDEKICAgICAgICAgICAgIyBTdGVwIDU6IGxldCBlbnRyeSBiZSBvbmUgZWFybGllciBpbiB0aGUgbGlzdC4KICAgICAgICAgICAgZW50cnkgPSBzZWxmLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50c1tpXQoKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAjIFN0ZXAgNwogICAgICAgICAgICBpICs9IDEKCiAgICAgICAgICAgICMgU3RlcCA4CiAgICAgICAgICAgIGVudHJ5ID0gc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHNbaV0KICAgICAgICAgICAgY2xvbmUgPSBlbnRyeS5jbG9uZU5vZGUoKSAgIyBNYWlubHkgdG8gZ2V0IGEgbmV3IGNvcHkgb2YgdGhlIGF0dHJpYnV0ZXMKCiAgICAgICAgICAgICMgU3RlcCA5CiAgICAgICAgICAgIGVsZW1lbnQgPSBzZWxmLmluc2VydEVsZW1lbnQoeyJ0eXBlIjogIlN0YXJ0VGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjbG9uZS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZXNwYWNlIjogY2xvbmUubmFtZXNwYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGNsb25lLmF0dHJpYnV0ZXN9KQoKICAgICAgICAgICAgIyBTdGVwIDEwCiAgICAgICAgICAgIHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzW2ldID0gZWxlbWVudAoKICAgICAgICAgICAgIyBTdGVwIDExCiAgICAgICAgICAgIGlmIGVsZW1lbnQgPT0gc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHNbLTFdOgogICAgICAgICAgICAgICAgYnJlYWsKCiAgICBkZWYgY2xlYXJBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoc2VsZik6CiAgICAgICAgZW50cnkgPSBzZWxmLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5wb3AoKQogICAgICAgIHdoaWxlIHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzIGFuZCBlbnRyeSAhPSBNYXJrZXI6CiAgICAgICAgICAgIGVudHJ5ID0gc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucG9wKCkKCiAgICBkZWYgZWxlbWVudEluQWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKHNlbGYsIG5hbWUpOgogICAgICAgICIiIkNoZWNrIGlmIGFuIGVsZW1lbnQgZXhpc3RzIGJldHdlZW4gdGhlIGVuZCBvZiB0aGUgYWN0aXZlCiAgICAgICAgZm9ybWF0dGluZyBlbGVtZW50cyBhbmQgdGhlIGxhc3QgbWFya2VyLiBJZiBpdCBkb2VzLCByZXR1cm4gaXQsIGVsc2UKICAgICAgICByZXR1cm4gZmFsc2UiIiIKCiAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHNbOjotMV06CiAgICAgICAgICAgICMgQ2hlY2sgZm9yIE1hcmtlciBmaXJzdCBiZWNhdXNlIGlmIGl0J3MgYSBNYXJrZXIgaXQgZG9lc24ndCBoYXZlIGEKICAgICAgICAgICAgIyBuYW1lIGF0dHJpYnV0ZS4KICAgICAgICAgICAgaWYgaXRlbSA9PSBNYXJrZXI6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGl0ZW0ubmFtZSA9PSBuYW1lOgogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0KICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgaW5zZXJ0Um9vdChzZWxmLCB0b2tlbik6CiAgICAgICAgZWxlbWVudCA9IHNlbGYuY3JlYXRlRWxlbWVudCh0b2tlbikKICAgICAgICBzZWxmLm9wZW5FbGVtZW50cy5hcHBlbmQoZWxlbWVudCkKICAgICAgICBzZWxmLmRvY3VtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpCgogICAgZGVmIGluc2VydERvY3R5cGUoc2VsZiwgdG9rZW4pOgogICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgcHVibGljSWQgPSB0b2tlblsicHVibGljSWQiXQogICAgICAgIHN5c3RlbUlkID0gdG9rZW5bInN5c3RlbUlkIl0KCiAgICAgICAgZG9jdHlwZSA9IHNlbGYuZG9jdHlwZUNsYXNzKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkKICAgICAgICBzZWxmLmRvY3VtZW50LmFwcGVuZENoaWxkKGRvY3R5cGUpCgogICAgZGVmIGluc2VydENvbW1lbnQoc2VsZiwgdG9rZW4sIHBhcmVudD1Ob25lKToKICAgICAgICBpZiBwYXJlbnQgaXMgTm9uZToKICAgICAgICAgICAgcGFyZW50ID0gc2VsZi5vcGVuRWxlbWVudHNbLTFdCiAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKHNlbGYuY29tbWVudENsYXNzKHRva2VuWyJkYXRhIl0pKQoKICAgIGRlZiBjcmVhdGVFbGVtZW50KHNlbGYsIHRva2VuKToKICAgICAgICAiIiJDcmVhdGUgYW4gZWxlbWVudCBidXQgZG9uJ3QgaW5zZXJ0IGl0IGFueXdoZXJlIiIiCiAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICBuYW1lc3BhY2UgPSB0b2tlbi5nZXQoIm5hbWVzcGFjZSIsIHNlbGYuZGVmYXVsdE5hbWVzcGFjZSkKICAgICAgICBlbGVtZW50ID0gc2VsZi5lbGVtZW50Q2xhc3MobmFtZSwgbmFtZXNwYWNlKQogICAgICAgIGVsZW1lbnQuYXR0cmlidXRlcyA9IHRva2VuWyJkYXRhIl0KICAgICAgICByZXR1cm4gZWxlbWVudAoKICAgIGRlZiBfZ2V0SW5zZXJ0RnJvbVRhYmxlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9pbnNlcnRGcm9tVGFibGUKCiAgICBkZWYgX3NldEluc2VydEZyb21UYWJsZShzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiU3dpdGNoIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGluc2VydCBhbiBlbGVtZW50IGZyb20gdGhlCiAgICAgICAgbm9ybWFsIG9uZSB0byB0aGUgbWlzbmVzdGVkIHRhYmxlIG9uZSBhbmQgYmFjayBhZ2FpbiIiIgogICAgICAgIHNlbGYuX2luc2VydEZyb21UYWJsZSA9IHZhbHVlCiAgICAgICAgaWYgdmFsdWU6CiAgICAgICAgICAgIHNlbGYuaW5zZXJ0RWxlbWVudCA9IHNlbGYuaW5zZXJ0RWxlbWVudFRhYmxlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5pbnNlcnRFbGVtZW50ID0gc2VsZi5pbnNlcnRFbGVtZW50Tm9ybWFsCgogICAgaW5zZXJ0RnJvbVRhYmxlID0gcHJvcGVydHkoX2dldEluc2VydEZyb21UYWJsZSwgX3NldEluc2VydEZyb21UYWJsZSkKCiAgICBkZWYgaW5zZXJ0RWxlbWVudE5vcm1hbChzZWxmLCB0b2tlbik6CiAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShuYW1lLCB0ZXh0X3R5cGUpLCAiRWxlbWVudCAlcyBub3QgdW5pY29kZSIgJSBuYW1lCiAgICAgICAgbmFtZXNwYWNlID0gdG9rZW4uZ2V0KCJuYW1lc3BhY2UiLCBzZWxmLmRlZmF1bHROYW1lc3BhY2UpCiAgICAgICAgZWxlbWVudCA9IHNlbGYuZWxlbWVudENsYXNzKG5hbWUsIG5hbWVzcGFjZSkKICAgICAgICBlbGVtZW50LmF0dHJpYnV0ZXMgPSB0b2tlblsiZGF0YSJdCiAgICAgICAgc2VsZi5vcGVuRWxlbWVudHNbLTFdLmFwcGVuZENoaWxkKGVsZW1lbnQpCiAgICAgICAgc2VsZi5vcGVuRWxlbWVudHMuYXBwZW5kKGVsZW1lbnQpCiAgICAgICAgcmV0dXJuIGVsZW1lbnQKCiAgICBkZWYgaW5zZXJ0RWxlbWVudFRhYmxlKHNlbGYsIHRva2VuKToKICAgICAgICAiIiJDcmVhdGUgYW4gZWxlbWVudCBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIHRyZWUiIiIKICAgICAgICBlbGVtZW50ID0gc2VsZi5jcmVhdGVFbGVtZW50KHRva2VuKQogICAgICAgIGlmIHNlbGYub3BlbkVsZW1lbnRzWy0xXS5uYW1lIG5vdCBpbiB0YWJsZUluc2VydE1vZGVFbGVtZW50czoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5zZXJ0RWxlbWVudE5vcm1hbCh0b2tlbikKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFdlIHNob3VsZCBiZSBpbiB0aGUgSW5UYWJsZSBtb2RlLiBUaGlzIG1lYW5zIHdlIHdhbnQgdG8gZG8KICAgICAgICAgICAgIyBzcGVjaWFsIG1hZ2ljIGVsZW1lbnQgcmVhcnJhbmdpbmcKICAgICAgICAgICAgcGFyZW50LCBpbnNlcnRCZWZvcmUgPSBzZWxmLmdldFRhYmxlTWlzbmVzdGVkTm9kZVBvc2l0aW9uKCkKICAgICAgICAgICAgaWYgaW5zZXJ0QmVmb3JlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZWxlbWVudCwgaW5zZXJ0QmVmb3JlKQogICAgICAgICAgICBzZWxmLm9wZW5FbGVtZW50cy5hcHBlbmQoZWxlbWVudCkKICAgICAgICByZXR1cm4gZWxlbWVudAoKICAgIGRlZiBpbnNlcnRUZXh0KHNlbGYsIGRhdGEsIHBhcmVudD1Ob25lKToKICAgICAgICAiIiJJbnNlcnQgdGV4dCBkYXRhLiIiIgogICAgICAgIGlmIHBhcmVudCBpcyBOb25lOgogICAgICAgICAgICBwYXJlbnQgPSBzZWxmLm9wZW5FbGVtZW50c1stMV0KCiAgICAgICAgaWYgKG5vdCBzZWxmLmluc2VydEZyb21UYWJsZSBvciAoc2VsZi5pbnNlcnRGcm9tVGFibGUgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcGVuRWxlbWVudHNbLTFdLm5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgaW4gdGFibGVJbnNlcnRNb2RlRWxlbWVudHMpKToKICAgICAgICAgICAgcGFyZW50Lmluc2VydFRleHQoZGF0YSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFdlIHNob3VsZCBiZSBpbiB0aGUgSW5UYWJsZSBtb2RlLiBUaGlzIG1lYW5zIHdlIHdhbnQgdG8gZG8KICAgICAgICAgICAgIyBzcGVjaWFsIG1hZ2ljIGVsZW1lbnQgcmVhcnJhbmdpbmcKICAgICAgICAgICAgcGFyZW50LCBpbnNlcnRCZWZvcmUgPSBzZWxmLmdldFRhYmxlTWlzbmVzdGVkTm9kZVBvc2l0aW9uKCkKICAgICAgICAgICAgcGFyZW50Lmluc2VydFRleHQoZGF0YSwgaW5zZXJ0QmVmb3JlKQoKICAgIGRlZiBnZXRUYWJsZU1pc25lc3RlZE5vZGVQb3NpdGlvbihzZWxmKToKICAgICAgICAiIiJHZXQgdGhlIGZvc3RlciBwYXJlbnQgZWxlbWVudCwgYW5kIHNpYmxpbmcgdG8gaW5zZXJ0IGJlZm9yZQogICAgICAgIChvciBOb25lKSB3aGVuIGluc2VydGluZyBhIG1pc25lc3RlZCB0YWJsZSBub2RlIiIiCiAgICAgICAgIyBUaGUgZm9zdGVyIHBhcmVudCBlbGVtZW50IGlzIHRoZSBvbmUgd2hpY2ggY29tZXMgYmVmb3JlIHRoZSBtb3N0CiAgICAgICAgIyByZWNlbnRseSBvcGVuZWQgdGFibGUgZWxlbWVudAogICAgICAgICMgWFhYIC0gdGhpcyBpcyByZWFsbHkgaW5lbGVnYW50CiAgICAgICAgbGFzdFRhYmxlID0gTm9uZQogICAgICAgIGZvc3RlclBhcmVudCA9IE5vbmUKICAgICAgICBpbnNlcnRCZWZvcmUgPSBOb25lCiAgICAgICAgZm9yIGVsbSBpbiBzZWxmLm9wZW5FbGVtZW50c1s6Oi0xXToKICAgICAgICAgICAgaWYgZWxtLm5hbWUgPT0gInRhYmxlIjoKICAgICAgICAgICAgICAgIGxhc3RUYWJsZSA9IGVsbQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBsYXN0VGFibGU6CiAgICAgICAgICAgICMgWFhYIC0gd2Ugc2hvdWxkIHJlYWxseSBjaGVjayB0aGF0IHRoaXMgcGFyZW50IGlzIGFjdHVhbGx5IGEKICAgICAgICAgICAgIyBub2RlIGhlcmUKICAgICAgICAgICAgaWYgbGFzdFRhYmxlLnBhcmVudDoKICAgICAgICAgICAgICAgIGZvc3RlclBhcmVudCA9IGxhc3RUYWJsZS5wYXJlbnQKICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZSA9IGxhc3RUYWJsZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZm9zdGVyUGFyZW50ID0gc2VsZi5vcGVuRWxlbWVudHNbCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vcGVuRWxlbWVudHMuaW5kZXgobGFzdFRhYmxlKSAtIDFdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm9zdGVyUGFyZW50ID0gc2VsZi5vcGVuRWxlbWVudHNbMF0KICAgICAgICByZXR1cm4gZm9zdGVyUGFyZW50LCBpbnNlcnRCZWZvcmUKCiAgICBkZWYgZ2VuZXJhdGVJbXBsaWVkRW5kVGFncyhzZWxmLCBleGNsdWRlPU5vbmUpOgogICAgICAgIG5hbWUgPSBzZWxmLm9wZW5FbGVtZW50c1stMV0ubmFtZQogICAgICAgICMgWFhYIHRkLCB0aCBhbmQgdHIgYXJlIG5vdCBhY3R1YWxseSBuZWVkZWQKICAgICAgICBpZiAobmFtZSBpbiBmcm96ZW5zZXQoKCJkZCIsICJkdCIsICJsaSIsICJvcHRpb24iLCAib3B0Z3JvdXAiLCAicCIsICJycCIsICJydCIpKSBhbmQKICAgICAgICAgICAgICAgIG5hbWUgIT0gZXhjbHVkZSk6CiAgICAgICAgICAgIHNlbGYub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICMgWFhYIFRoaXMgaXMgbm90IGVudGlyZWx5IHdoYXQgdGhlIHNwZWNpZmljYXRpb24gc2F5cy4gV2Ugc2hvdWxkCiAgICAgICAgICAgICMgaW52ZXN0aWdhdGUgaXQgbW9yZSBjbG9zZWx5LgogICAgICAgICAgICBzZWxmLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoZXhjbHVkZSkKCiAgICBkZWYgZ2V0RG9jdW1lbnQoc2VsZik6CiAgICAgICAgIlJldHVybiB0aGUgZmluYWwgdHJlZSIKICAgICAgICByZXR1cm4gc2VsZi5kb2N1bWVudAoKICAgIGRlZiBnZXRGcmFnbWVudChzZWxmKToKICAgICAgICAiUmV0dXJuIHRoZSBmaW5hbCBmcmFnbWVudCIKICAgICAgICAjIGFzc2VydCBzZWxmLmlubmVySFRNTAogICAgICAgIGZyYWdtZW50ID0gc2VsZi5mcmFnbWVudENsYXNzKCkKICAgICAgICBzZWxmLm9wZW5FbGVtZW50c1swXS5yZXBhcmVudENoaWxkcmVuKGZyYWdtZW50KQogICAgICAgIHJldHVybiBmcmFnbWVudAoKICAgIGRlZiB0ZXN0U2VyaWFsaXplcihzZWxmLCBub2RlKToKICAgICAgICAiIiJTZXJpYWxpemUgdGhlIHN1YnRyZWUgb2Ygbm9kZSBpbiB0aGUgZm9ybWF0IHJlcXVpcmVkIGJ5IHVuaXQgdGVzdHMKICAgICAgICBub2RlIC0gdGhlIG5vZGUgZnJvbSB3aGljaCB0byBzdGFydCBzZXJpYWxpemluZyIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKUEsDBBQAAAAAAAAAIQAI6i74gyIAAIMiAAA4AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9kb20ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCgpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBNdXRhYmxlTWFwcGluZwpmcm9tIHhtbC5kb20gaW1wb3J0IG1pbmlkb20sIE5vZGUKaW1wb3J0IHdlYWtyZWYKCmZyb20gLiBpbXBvcnQgYmFzZQpmcm9tIC4uIGltcG9ydCBjb25zdGFudHMKZnJvbSAuLmNvbnN0YW50cyBpbXBvcnQgbmFtZXNwYWNlcwpmcm9tIC4uX3V0aWxzIGltcG9ydCBtb2R1bGVGYWN0b3J5RmFjdG9yeQoKCmRlZiBnZXREb21CdWlsZGVyKERvbUltcGxlbWVudGF0aW9uKToKICAgIERvbSA9IERvbUltcGxlbWVudGF0aW9uCgogICAgY2xhc3MgQXR0ckxpc3QoTXV0YWJsZU1hcHBpbmcpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbGVtZW50KToKICAgICAgICAgICAgc2VsZi5lbGVtZW50ID0gZWxlbWVudAoKICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBpdGVyKHNlbGYuZWxlbWVudC5hdHRyaWJ1dGVzLmtleXMoKSkKCiAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIG5hbWUsIHZhbHVlKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLCB0dXBsZSk6CiAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhdHRyID0gc2VsZi5lbGVtZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKG5hbWUpCiAgICAgICAgICAgICAgICBhdHRyLnZhbHVlID0gdmFsdWUKICAgICAgICAgICAgICAgIHNlbGYuZWxlbWVudC5hdHRyaWJ1dGVzW25hbWVdID0gYXR0cgoKICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIGxlbihzZWxmLmVsZW1lbnQuYXR0cmlidXRlcykKCiAgICAgICAgZGVmIGl0ZW1zKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmLmVsZW1lbnQuYXR0cmlidXRlcy5pdGVtcygpKQoKICAgICAgICBkZWYgdmFsdWVzKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmLmVsZW1lbnQuYXR0cmlidXRlcy52YWx1ZXMoKSkKCiAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWUpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWUsIHR1cGxlKToKICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmVsZW1lbnQuYXR0cmlidXRlc1tuYW1lXS52YWx1ZQoKICAgICAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgbmFtZSk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSwgdHVwbGUpOgogICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZGVsIHNlbGYuZWxlbWVudC5hdHRyaWJ1dGVzW25hbWVdCgogICAgY2xhc3MgTm9kZUJ1aWxkZXIoYmFzZS5Ob2RlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZWxlbWVudCk6CiAgICAgICAgICAgIGJhc2UuTm9kZS5fX2luaXRfXyhzZWxmLCBlbGVtZW50Lm5vZGVOYW1lKQogICAgICAgICAgICBzZWxmLmVsZW1lbnQgPSBlbGVtZW50CgogICAgICAgIG5hbWVzcGFjZSA9IHByb3BlcnR5KGxhbWJkYSBzZWxmOiBoYXNhdHRyKHNlbGYuZWxlbWVudCwgIm5hbWVzcGFjZVVSSSIpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWxlbWVudC5uYW1lc3BhY2VVUkkgb3IgTm9uZSkKCiAgICAgICAgZGVmIGFwcGVuZENoaWxkKHNlbGYsIG5vZGUpOgogICAgICAgICAgICBub2RlLnBhcmVudCA9IHNlbGYKICAgICAgICAgICAgc2VsZi5lbGVtZW50LmFwcGVuZENoaWxkKG5vZGUuZWxlbWVudCkKCiAgICAgICAgZGVmIGluc2VydFRleHQoc2VsZiwgZGF0YSwgaW5zZXJ0QmVmb3JlPU5vbmUpOgogICAgICAgICAgICB0ZXh0ID0gc2VsZi5lbGVtZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGF0YSkKICAgICAgICAgICAgaWYgaW5zZXJ0QmVmb3JlOgogICAgICAgICAgICAgICAgc2VsZi5lbGVtZW50Lmluc2VydEJlZm9yZSh0ZXh0LCBpbnNlcnRCZWZvcmUuZWxlbWVudCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuZWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0KQoKICAgICAgICBkZWYgaW5zZXJ0QmVmb3JlKHNlbGYsIG5vZGUsIHJlZk5vZGUpOgogICAgICAgICAgICBzZWxmLmVsZW1lbnQuaW5zZXJ0QmVmb3JlKG5vZGUuZWxlbWVudCwgcmVmTm9kZS5lbGVtZW50KQogICAgICAgICAgICBub2RlLnBhcmVudCA9IHNlbGYKCiAgICAgICAgZGVmIHJlbW92ZUNoaWxkKHNlbGYsIG5vZGUpOgogICAgICAgICAgICBpZiBub2RlLmVsZW1lbnQucGFyZW50Tm9kZSA9PSBzZWxmLmVsZW1lbnQ6CiAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnQucmVtb3ZlQ2hpbGQobm9kZS5lbGVtZW50KQogICAgICAgICAgICBub2RlLnBhcmVudCA9IE5vbmUKCiAgICAgICAgZGVmIHJlcGFyZW50Q2hpbGRyZW4oc2VsZiwgbmV3UGFyZW50KToKICAgICAgICAgICAgd2hpbGUgc2VsZi5lbGVtZW50Lmhhc0NoaWxkTm9kZXMoKToKICAgICAgICAgICAgICAgIGNoaWxkID0gc2VsZi5lbGVtZW50LmZpcnN0Q2hpbGQKICAgICAgICAgICAgICAgIHNlbGYuZWxlbWVudC5yZW1vdmVDaGlsZChjaGlsZCkKICAgICAgICAgICAgICAgIG5ld1BhcmVudC5lbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKQogICAgICAgICAgICBzZWxmLmNoaWxkTm9kZXMgPSBbXQoKICAgICAgICBkZWYgZ2V0QXR0cmlidXRlcyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIEF0dHJMaXN0KHNlbGYuZWxlbWVudCkKCiAgICAgICAgZGVmIHNldEF0dHJpYnV0ZXMoc2VsZiwgYXR0cmlidXRlcyk6CiAgICAgICAgICAgIGlmIGF0dHJpYnV0ZXM6CiAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gbGlzdChhdHRyaWJ1dGVzLml0ZW1zKCkpOgogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSwgdHVwbGUpOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBuYW1lWzBdIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkTmFtZSA9IChuYW1lWzBdICsgIjoiICsgbmFtZVsxXSkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZE5hbWUgPSBuYW1lWzFdCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhuYW1lWzJdLCBxdWFsaWZpZWROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbGVtZW50LnNldEF0dHJpYnV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHZhbHVlKQogICAgICAgIGF0dHJpYnV0ZXMgPSBwcm9wZXJ0eShnZXRBdHRyaWJ1dGVzLCBzZXRBdHRyaWJ1dGVzKQoKICAgICAgICBkZWYgY2xvbmVOb2RlKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gTm9kZUJ1aWxkZXIoc2VsZi5lbGVtZW50LmNsb25lTm9kZShGYWxzZSkpCgogICAgICAgIGRlZiBoYXNDb250ZW50KHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5lbGVtZW50Lmhhc0NoaWxkTm9kZXMoKQoKICAgICAgICBkZWYgZ2V0TmFtZVR1cGxlKHNlbGYpOgogICAgICAgICAgICBpZiBzZWxmLm5hbWVzcGFjZSBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVzcGFjZXNbImh0bWwiXSwgc2VsZi5uYW1lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lc3BhY2UsIHNlbGYubmFtZQoKICAgICAgICBuYW1lVHVwbGUgPSBwcm9wZXJ0eShnZXROYW1lVHVwbGUpCgogICAgY2xhc3MgVHJlZUJ1aWxkZXIoYmFzZS5UcmVlQnVpbGRlcik6ICAjIHB5bGludDpkaXNhYmxlPXVudXNlZC12YXJpYWJsZQogICAgICAgIGRlZiBkb2N1bWVudENsYXNzKHNlbGYpOgogICAgICAgICAgICBzZWxmLmRvbSA9IERvbS5nZXRET01JbXBsZW1lbnRhdGlvbigpLmNyZWF0ZURvY3VtZW50KE5vbmUsIE5vbmUsIE5vbmUpCiAgICAgICAgICAgIHJldHVybiB3ZWFrcmVmLnByb3h5KHNlbGYpCgogICAgICAgIGRlZiBpbnNlcnREb2N0eXBlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICAgICAgcHVibGljSWQgPSB0b2tlblsicHVibGljSWQiXQogICAgICAgICAgICBzeXN0ZW1JZCA9IHRva2VuWyJzeXN0ZW1JZCJdCgogICAgICAgICAgICBkb21pbXBsID0gRG9tLmdldERPTUltcGxlbWVudGF0aW9uKCkKICAgICAgICAgICAgZG9jdHlwZSA9IGRvbWltcGwuY3JlYXRlRG9jdW1lbnRUeXBlKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkKICAgICAgICAgICAgc2VsZi5kb2N1bWVudC5hcHBlbmRDaGlsZChOb2RlQnVpbGRlcihkb2N0eXBlKSkKICAgICAgICAgICAgaWYgRG9tID09IG1pbmlkb206CiAgICAgICAgICAgICAgICBkb2N0eXBlLm93bmVyRG9jdW1lbnQgPSBzZWxmLmRvbQoKICAgICAgICBkZWYgZWxlbWVudENsYXNzKHNlbGYsIG5hbWUsIG5hbWVzcGFjZT1Ob25lKToKICAgICAgICAgICAgaWYgbmFtZXNwYWNlIGlzIE5vbmUgYW5kIHNlbGYuZGVmYXVsdE5hbWVzcGFjZSBpcyBOb25lOgogICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYuZG9tLmNyZWF0ZUVsZW1lbnQobmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLmRvbS5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlLCBuYW1lKQoKICAgICAgICAgICAgcmV0dXJuIE5vZGVCdWlsZGVyKG5vZGUpCgogICAgICAgIGRlZiBjb21tZW50Q2xhc3Moc2VsZiwgZGF0YSk6CiAgICAgICAgICAgIHJldHVybiBOb2RlQnVpbGRlcihzZWxmLmRvbS5jcmVhdGVDb21tZW50KGRhdGEpKQoKICAgICAgICBkZWYgZnJhZ21lbnRDbGFzcyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIE5vZGVCdWlsZGVyKHNlbGYuZG9tLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSkKCiAgICAgICAgZGVmIGFwcGVuZENoaWxkKHNlbGYsIG5vZGUpOgogICAgICAgICAgICBzZWxmLmRvbS5hcHBlbmRDaGlsZChub2RlLmVsZW1lbnQpCgogICAgICAgIGRlZiB0ZXN0U2VyaWFsaXplcihzZWxmLCBlbGVtZW50KToKICAgICAgICAgICAgcmV0dXJuIHRlc3RTZXJpYWxpemVyKGVsZW1lbnQpCgogICAgICAgIGRlZiBnZXREb2N1bWVudChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZG9tCgogICAgICAgIGRlZiBnZXRGcmFnbWVudChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIGJhc2UuVHJlZUJ1aWxkZXIuZ2V0RnJhZ21lbnQoc2VsZikuZWxlbWVudAoKICAgICAgICBkZWYgaW5zZXJ0VGV4dChzZWxmLCBkYXRhLCBwYXJlbnQ9Tm9uZSk6CiAgICAgICAgICAgIGRhdGEgPSBkYXRhCiAgICAgICAgICAgIGlmIHBhcmVudCAhPSBzZWxmOgogICAgICAgICAgICAgICAgYmFzZS5UcmVlQnVpbGRlci5pbnNlcnRUZXh0KHNlbGYsIGRhdGEsIHBhcmVudCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgSEFDSzogYWxsb3cgdGV4dCBub2RlcyBhcyBjaGlsZHJlbiBvZiB0aGUgZG9jdW1lbnQgbm9kZQogICAgICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLmRvbSwgJ19jaGlsZF9ub2RlX3R5cGVzJyk6CiAgICAgICAgICAgICAgICAgICAgIyBweWxpbnQ6ZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCiAgICAgICAgICAgICAgICAgICAgaWYgTm9kZS5URVhUX05PREUgbm90IGluIHNlbGYuZG9tLl9jaGlsZF9ub2RlX3R5cGVzOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRvbS5fY2hpbGRfbm9kZV90eXBlcyA9IGxpc3Qoc2VsZi5kb20uX2NoaWxkX25vZGVfdHlwZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZG9tLl9jaGlsZF9ub2RlX3R5cGVzLmFwcGVuZChOb2RlLlRFWFRfTk9ERSkKICAgICAgICAgICAgICAgIHNlbGYuZG9tLmFwcGVuZENoaWxkKHNlbGYuZG9tLmNyZWF0ZVRleHROb2RlKGRhdGEpKQoKICAgICAgICBpbXBsZW1lbnRhdGlvbiA9IERvbUltcGxlbWVudGF0aW9uCiAgICAgICAgbmFtZSA9IE5vbmUKCiAgICBkZWYgdGVzdFNlcmlhbGl6ZXIoZWxlbWVudCk6CiAgICAgICAgZWxlbWVudC5ub3JtYWxpemUoKQogICAgICAgIHJ2ID0gW10KCiAgICAgICAgZGVmIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCwgaW5kZW50PTApOgogICAgICAgICAgICBpZiBlbGVtZW50Lm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOgogICAgICAgICAgICAgICAgaWYgZWxlbWVudC5uYW1lOgogICAgICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQucHVibGljSWQgb3IgZWxlbWVudC5zeXN0ZW1JZDoKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljSWQgPSBlbGVtZW50LnB1YmxpY0lkIG9yICIiCiAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbUlkID0gZWxlbWVudC5zeXN0ZW1JZCBvciAiIgogICAgICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoIiIifCVzPCFET0NUWVBFICVzICIlcyIgIiVzIj4iIiIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCcgJyAqIGluZGVudCwgZWxlbWVudC5uYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzPCFET0NUWVBFICVzPiIgJSAoJyAnICogaW5kZW50LCBlbGVtZW50Lm5hbWUpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlczwhRE9DVFlQRSA+IiAlICgnICcgKiBpbmRlbnQsKSkKICAgICAgICAgICAgZWxpZiBlbGVtZW50Lm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfTk9ERToKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiI2RvY3VtZW50IikKICAgICAgICAgICAgZWxpZiBlbGVtZW50Lm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERToKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiI2RvY3VtZW50LWZyYWdtZW50IikKICAgICAgICAgICAgZWxpZiBlbGVtZW50Lm5vZGVUeXBlID09IE5vZGUuQ09NTUVOVF9OT0RFOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXM8IS0tICVzIC0tPiIgJSAoJyAnICogaW5kZW50LCBlbGVtZW50Lm5vZGVWYWx1ZSkpCiAgICAgICAgICAgIGVsaWYgZWxlbWVudC5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERToKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzXCIlc1wiIiAlICgnICcgKiBpbmRlbnQsIGVsZW1lbnQubm9kZVZhbHVlKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIChoYXNhdHRyKGVsZW1lbnQsICJuYW1lc3BhY2VVUkkiKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5uYW1lc3BhY2VVUkkgaXMgbm90IE5vbmUpOgogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiJXMgJXMiICUgKGNvbnN0YW50cy5wcmVmaXhlc1tlbGVtZW50Lm5hbWVzcGFjZVVSSV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5ub2RlTmFtZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGVsZW1lbnQubm9kZU5hbWUKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzPCVzPiIgJSAoJyAnICogaW5kZW50LCBuYW1lKSkKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQuaGFzQXR0cmlidXRlcygpOgogICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBbXQogICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihlbGVtZW50LmF0dHJpYnV0ZXMpKToKICAgICAgICAgICAgICAgICAgICAgICAgYXR0ciA9IGVsZW1lbnQuYXR0cmlidXRlcy5pdGVtKGkpCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBhdHRyLm5vZGVOYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXR0ci52YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICBucyA9IGF0dHIubmFtZXNwYWNlVVJJCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5zOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIlcyAlcyIgJSAoY29uc3RhbnRzLnByZWZpeGVzW25zXSwgYXR0ci5sb2NhbE5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gYXR0ci5ub2RlTmFtZQogICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFwcGVuZCgobmFtZSwgdmFsdWUpKQoKICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gc29ydGVkKGF0dHJpYnV0ZXMpOgogICAgICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoJ3wlcyVzPSIlcyInICUgKCcgJyAqIChpbmRlbnQgKyAyKSwgbmFtZSwgdmFsdWUpKQogICAgICAgICAgICBpbmRlbnQgKz0gMgogICAgICAgICAgICBmb3IgY2hpbGQgaW4gZWxlbWVudC5jaGlsZE5vZGVzOgogICAgICAgICAgICAgICAgc2VyaWFsaXplRWxlbWVudChjaGlsZCwgaW5kZW50KQogICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCwgMCkKCiAgICAgICAgcmV0dXJuICJcbiIuam9pbihydikKCiAgICByZXR1cm4gbG9jYWxzKCkKCgojIFRoZSBhY3R1YWwgbWVhbnMgdG8gZ2V0IGEgbW9kdWxlIQpnZXREb21Nb2R1bGUgPSBtb2R1bGVGYWN0b3J5RmFjdG9yeShnZXREb21CdWlsZGVyKQpQSwMEFAAAAAAAAAAhAKF9l/DcMQAA3DEAADoAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2V0cmVlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCiMgcHlsaW50OmRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcwoKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHRleHRfdHlwZQoKaW1wb3J0IHJlCgpmcm9tIC4gaW1wb3J0IGJhc2UKZnJvbSAuLiBpbXBvcnQgX2loYXRleG1sCmZyb20gLi4gaW1wb3J0IGNvbnN0YW50cwpmcm9tIC4uY29uc3RhbnRzIGltcG9ydCBuYW1lc3BhY2VzCmZyb20gLi5fdXRpbHMgaW1wb3J0IG1vZHVsZUZhY3RvcnlGYWN0b3J5Cgp0YWdfcmVnZXhwID0gcmUuY29tcGlsZSgieyhbXn1dKil9KC4qKSIpCgoKZGVmIGdldEVUcmVlQnVpbGRlcihFbGVtZW50VHJlZUltcGxlbWVudGF0aW9uLCBmdWxsVHJlZT1GYWxzZSk6CiAgICBFbGVtZW50VHJlZSA9IEVsZW1lbnRUcmVlSW1wbGVtZW50YXRpb24KICAgIEVsZW1lbnRUcmVlQ29tbWVudFR5cGUgPSBFbGVtZW50VHJlZS5Db21tZW50KCJhc2QiKS50YWcKCiAgICBjbGFzcyBFbGVtZW50KGJhc2UuTm9kZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG5hbWVzcGFjZT1Ob25lKToKICAgICAgICAgICAgc2VsZi5fbmFtZSA9IG5hbWUKICAgICAgICAgICAgc2VsZi5fbmFtZXNwYWNlID0gbmFtZXNwYWNlCiAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQgPSBFbGVtZW50VHJlZS5FbGVtZW50KHNlbGYuX2dldEVUcmVlVGFnKG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSkpCiAgICAgICAgICAgIGlmIG5hbWVzcGFjZSBpcyBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5uYW1lVHVwbGUgPSBuYW1lc3BhY2VzWyJodG1sIl0sIHNlbGYuX25hbWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYubmFtZVR1cGxlID0gc2VsZi5fbmFtZXNwYWNlLCBzZWxmLl9uYW1lCiAgICAgICAgICAgIHNlbGYucGFyZW50ID0gTm9uZQogICAgICAgICAgICBzZWxmLl9jaGlsZE5vZGVzID0gW10KICAgICAgICAgICAgc2VsZi5fZmxhZ3MgPSBbXQoKICAgICAgICBkZWYgX2dldEVUcmVlVGFnKHNlbGYsIG5hbWUsIG5hbWVzcGFjZSk6CiAgICAgICAgICAgIGlmIG5hbWVzcGFjZSBpcyBOb25lOgogICAgICAgICAgICAgICAgZXRyZWVfdGFnID0gbmFtZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZXRyZWVfdGFnID0gInslc30lcyIgJSAobmFtZXNwYWNlLCBuYW1lKQogICAgICAgICAgICByZXR1cm4gZXRyZWVfdGFnCgogICAgICAgIGRlZiBfc2V0TmFtZShzZWxmLCBuYW1lKToKICAgICAgICAgICAgc2VsZi5fbmFtZSA9IG5hbWUKICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50YWcgPSBzZWxmLl9nZXRFVHJlZVRhZyhzZWxmLl9uYW1lLCBzZWxmLl9uYW1lc3BhY2UpCgogICAgICAgIGRlZiBfZ2V0TmFtZShzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX25hbWUKCiAgICAgICAgbmFtZSA9IHByb3BlcnR5KF9nZXROYW1lLCBfc2V0TmFtZSkKCiAgICAgICAgZGVmIF9zZXROYW1lc3BhY2Uoc2VsZiwgbmFtZXNwYWNlKToKICAgICAgICAgICAgc2VsZi5fbmFtZXNwYWNlID0gbmFtZXNwYWNlCiAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQudGFnID0gc2VsZi5fZ2V0RVRyZWVUYWcoc2VsZi5fbmFtZSwgc2VsZi5fbmFtZXNwYWNlKQoKICAgICAgICBkZWYgX2dldE5hbWVzcGFjZShzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX25hbWVzcGFjZQoKICAgICAgICBuYW1lc3BhY2UgPSBwcm9wZXJ0eShfZ2V0TmFtZXNwYWNlLCBfc2V0TmFtZXNwYWNlKQoKICAgICAgICBkZWYgX2dldEF0dHJpYnV0ZXMoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9lbGVtZW50LmF0dHJpYgoKICAgICAgICBkZWYgX3NldEF0dHJpYnV0ZXMoc2VsZiwgYXR0cmlidXRlcyk6CiAgICAgICAgICAgICMgRGVsZXRlIGV4aXN0aW5nIGF0dHJpYnV0ZXMgZmlyc3QKICAgICAgICAgICAgIyBYWFggLSB0aGVyZSBtYXkgYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMuLi4KICAgICAgICAgICAgZm9yIGtleSBpbiBsaXN0KHNlbGYuX2VsZW1lbnQuYXR0cmliLmtleXMoKSk6CiAgICAgICAgICAgICAgICBkZWwgc2VsZi5fZWxlbWVudC5hdHRyaWJba2V5XQogICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBhdHRyaWJ1dGVzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgdHVwbGUpOgogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAieyVzfSVzIiAlIChrZXlbMl0sIGtleVsxXSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGtleQogICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC5zZXQobmFtZSwgdmFsdWUpCgogICAgICAgIGF0dHJpYnV0ZXMgPSBwcm9wZXJ0eShfZ2V0QXR0cmlidXRlcywgX3NldEF0dHJpYnV0ZXMpCgogICAgICAgIGRlZiBfZ2V0Q2hpbGROb2RlcyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkTm9kZXMKCiAgICAgICAgZGVmIF9zZXRDaGlsZE5vZGVzKHNlbGYsIHZhbHVlKToKICAgICAgICAgICAgZGVsIHNlbGYuX2VsZW1lbnRbOl0KICAgICAgICAgICAgc2VsZi5fY2hpbGROb2RlcyA9IFtdCiAgICAgICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgogICAgICAgICAgICAgICAgc2VsZi5pbnNlcnRDaGlsZChlbGVtZW50KQoKICAgICAgICBjaGlsZE5vZGVzID0gcHJvcGVydHkoX2dldENoaWxkTm9kZXMsIF9zZXRDaGlsZE5vZGVzKQoKICAgICAgICBkZWYgaGFzQ29udGVudChzZWxmKToKICAgICAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgaGFzIGNoaWxkcmVuIG9yIHRleHQiIiIKICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fZWxlbWVudC50ZXh0IG9yIGxlbihzZWxmLl9lbGVtZW50KSkKCiAgICAgICAgZGVmIGFwcGVuZENoaWxkKHNlbGYsIG5vZGUpOgogICAgICAgICAgICBzZWxmLl9jaGlsZE5vZGVzLmFwcGVuZChub2RlKQogICAgICAgICAgICBzZWxmLl9lbGVtZW50LmFwcGVuZChub2RlLl9lbGVtZW50KQogICAgICAgICAgICBub2RlLnBhcmVudCA9IHNlbGYKCiAgICAgICAgZGVmIGluc2VydEJlZm9yZShzZWxmLCBub2RlLCByZWZOb2RlKToKICAgICAgICAgICAgaW5kZXggPSBsaXN0KHNlbGYuX2VsZW1lbnQpLmluZGV4KHJlZk5vZGUuX2VsZW1lbnQpCiAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQuaW5zZXJ0KGluZGV4LCBub2RlLl9lbGVtZW50KQogICAgICAgICAgICBub2RlLnBhcmVudCA9IHNlbGYKCiAgICAgICAgZGVmIHJlbW92ZUNoaWxkKHNlbGYsIG5vZGUpOgogICAgICAgICAgICBzZWxmLl9jaGlsZE5vZGVzLnJlbW92ZShub2RlKQogICAgICAgICAgICBzZWxmLl9lbGVtZW50LnJlbW92ZShub2RlLl9lbGVtZW50KQogICAgICAgICAgICBub2RlLnBhcmVudCA9IE5vbmUKCiAgICAgICAgZGVmIGluc2VydFRleHQoc2VsZiwgZGF0YSwgaW5zZXJ0QmVmb3JlPU5vbmUpOgogICAgICAgICAgICBpZiBub3QobGVuKHNlbGYuX2VsZW1lbnQpKToKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9lbGVtZW50LnRleHQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50ZXh0ID0gIiIKICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQudGV4dCArPSBkYXRhCiAgICAgICAgICAgIGVsaWYgaW5zZXJ0QmVmb3JlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAjIEluc2VydCB0aGUgdGV4dCBhcyB0aGUgdGFpbCBvZiB0aGUgbGFzdCBjaGlsZCBlbGVtZW50CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fZWxlbWVudFstMV0udGFpbDoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50Wy0xXS50YWlsID0gIiIKICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnRbLTFdLnRhaWwgKz0gZGF0YQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBJbnNlcnQgdGhlIHRleHQgYmVmb3JlIHRoZSBzcGVjaWZpZWQgbm9kZQogICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBsaXN0KHNlbGYuX2VsZW1lbnQpCiAgICAgICAgICAgICAgICBpbmRleCA9IGNoaWxkcmVuLmluZGV4KGluc2VydEJlZm9yZS5fZWxlbWVudCkKICAgICAgICAgICAgICAgIGlmIGluZGV4ID4gMDoKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fZWxlbWVudFtpbmRleCAtIDFdLnRhaWw6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnRbaW5kZXggLSAxXS50YWlsID0gIiIKICAgICAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50W2luZGV4IC0gMV0udGFpbCArPSBkYXRhCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9lbGVtZW50LnRleHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQudGV4dCA9ICIiCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50ZXh0ICs9IGRhdGEKCiAgICAgICAgZGVmIGNsb25lTm9kZShzZWxmKToKICAgICAgICAgICAgZWxlbWVudCA9IHR5cGUoc2VsZikoc2VsZi5uYW1lLCBzZWxmLm5hbWVzcGFjZSkKICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNlbGYuYXR0cmlidXRlcy5pdGVtcygpOgogICAgICAgICAgICAgICAgZWxlbWVudC5hdHRyaWJ1dGVzW25hbWVdID0gdmFsdWUKICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQKCiAgICAgICAgZGVmIHJlcGFyZW50Q2hpbGRyZW4oc2VsZiwgbmV3UGFyZW50KToKICAgICAgICAgICAgaWYgbmV3UGFyZW50LmNoaWxkTm9kZXM6CiAgICAgICAgICAgICAgICBuZXdQYXJlbnQuY2hpbGROb2Rlc1stMV0uX2VsZW1lbnQudGFpbCArPSBzZWxmLl9lbGVtZW50LnRleHQKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIG5vdCBuZXdQYXJlbnQuX2VsZW1lbnQudGV4dDoKICAgICAgICAgICAgICAgICAgICBuZXdQYXJlbnQuX2VsZW1lbnQudGV4dCA9ICIiCiAgICAgICAgICAgICAgICBpZiBzZWxmLl9lbGVtZW50LnRleHQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50Ll9lbGVtZW50LnRleHQgKz0gc2VsZi5fZWxlbWVudC50ZXh0CiAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQudGV4dCA9ICIiCiAgICAgICAgICAgIGJhc2UuTm9kZS5yZXBhcmVudENoaWxkcmVuKHNlbGYsIG5ld1BhcmVudCkKCiAgICBjbGFzcyBDb21tZW50KEVsZW1lbnQpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKICAgICAgICAgICAgIyBVc2UgdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IgdG8gc2V0IGFsbCBwcm9wZXJ0aWVzIG9uIHRoZQogICAgICAgICAgICAjIHdyYXBwZXIgZWxlbWVudAogICAgICAgICAgICBzZWxmLl9lbGVtZW50ID0gRWxlbWVudFRyZWUuQ29tbWVudChkYXRhKQogICAgICAgICAgICBzZWxmLnBhcmVudCA9IE5vbmUKICAgICAgICAgICAgc2VsZi5fY2hpbGROb2RlcyA9IFtdCiAgICAgICAgICAgIHNlbGYuX2ZsYWdzID0gW10KCiAgICAgICAgZGVmIF9nZXREYXRhKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZWxlbWVudC50ZXh0CgogICAgICAgIGRlZiBfc2V0RGF0YShzZWxmLCB2YWx1ZSk6CiAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQudGV4dCA9IHZhbHVlCgogICAgICAgIGRhdGEgPSBwcm9wZXJ0eShfZ2V0RGF0YSwgX3NldERhdGEpCgogICAgY2xhc3MgRG9jdW1lbnRUeXBlKEVsZW1lbnQpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpOgogICAgICAgICAgICBFbGVtZW50Ll9faW5pdF9fKHNlbGYsICI8IURPQ1RZUEU+IikKICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50ZXh0ID0gbmFtZQogICAgICAgICAgICBzZWxmLnB1YmxpY0lkID0gcHVibGljSWQKICAgICAgICAgICAgc2VsZi5zeXN0ZW1JZCA9IHN5c3RlbUlkCgogICAgICAgIGRlZiBfZ2V0UHVibGljSWQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9lbGVtZW50LmdldCgicHVibGljSWQiLCAiIikKCiAgICAgICAgZGVmIF9zZXRQdWJsaWNJZChzZWxmLCB2YWx1ZSk6CiAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC5zZXQoInB1YmxpY0lkIiwgdmFsdWUpCgogICAgICAgIHB1YmxpY0lkID0gcHJvcGVydHkoX2dldFB1YmxpY0lkLCBfc2V0UHVibGljSWQpCgogICAgICAgIGRlZiBfZ2V0U3lzdGVtSWQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9lbGVtZW50LmdldCgic3lzdGVtSWQiLCAiIikKCiAgICAgICAgZGVmIF9zZXRTeXN0ZW1JZChzZWxmLCB2YWx1ZSk6CiAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC5zZXQoInN5c3RlbUlkIiwgdmFsdWUpCgogICAgICAgIHN5c3RlbUlkID0gcHJvcGVydHkoX2dldFN5c3RlbUlkLCBfc2V0U3lzdGVtSWQpCgogICAgY2xhc3MgRG9jdW1lbnQoRWxlbWVudCk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICBFbGVtZW50Ll9faW5pdF9fKHNlbGYsICJET0NVTUVOVF9ST09UIikKCiAgICBjbGFzcyBEb2N1bWVudEZyYWdtZW50KEVsZW1lbnQpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgRWxlbWVudC5fX2luaXRfXyhzZWxmLCAiRE9DVU1FTlRfRlJBR01FTlQiKQoKICAgIGRlZiB0ZXN0U2VyaWFsaXplcihlbGVtZW50KToKICAgICAgICBydiA9IFtdCgogICAgICAgIGRlZiBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQsIGluZGVudD0wKToKICAgICAgICAgICAgaWYgbm90KGhhc2F0dHIoZWxlbWVudCwgInRhZyIpKToKICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmdldHJvb3QoKQogICAgICAgICAgICBpZiBlbGVtZW50LnRhZyA9PSAiPCFET0NUWVBFPiI6CiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LmdldCgicHVibGljSWQiKSBvciBlbGVtZW50LmdldCgic3lzdGVtSWQiKToKICAgICAgICAgICAgICAgICAgICBwdWJsaWNJZCA9IGVsZW1lbnQuZ2V0KCJwdWJsaWNJZCIpIG9yICIiCiAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQgPSBlbGVtZW50LmdldCgic3lzdGVtSWQiKSBvciAiIgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiIiI8IURPQ1RZUEUgJXMgIiVzIiAiJXMiPiIiIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbGVtZW50LnRleHQsIHB1YmxpY0lkLCBzeXN0ZW1JZCkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiPCFET0NUWVBFICVzPiIgJSAoZWxlbWVudC50ZXh0LCkpCiAgICAgICAgICAgIGVsaWYgZWxlbWVudC50YWcgPT0gIkRPQ1VNRU5UX1JPT1QiOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCIjZG9jdW1lbnQiKQogICAgICAgICAgICAgICAgaWYgZWxlbWVudC50ZXh0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzXCIlc1wiIiAlICgnICcgKiAoaW5kZW50ICsgMiksIGVsZW1lbnQudGV4dCkpCiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LnRhaWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJEb2N1bWVudCBub2RlIGNhbm5vdCBoYXZlIHRhaWwiKQogICAgICAgICAgICAgICAgaWYgaGFzYXR0cihlbGVtZW50LCAiYXR0cmliIikgYW5kIGxlbihlbGVtZW50LmF0dHJpYik6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJEb2N1bWVudCBub2RlIGNhbm5vdCBoYXZlIGF0dHJpYnV0ZXMiKQogICAgICAgICAgICBlbGlmIGVsZW1lbnQudGFnID09IEVsZW1lbnRUcmVlQ29tbWVudFR5cGU6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlczwhLS0gJXMgLS0+IiAlICgnICcgKiBpbmRlbnQsIGVsZW1lbnQudGV4dCkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShlbGVtZW50LnRhZywgdGV4dF90eXBlKSwgXAogICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCB1bmljb2RlLCBnb3QgJXMsICVzIiAlICh0eXBlKGVsZW1lbnQudGFnKSwgZWxlbWVudC50YWcpCiAgICAgICAgICAgICAgICBuc21hdGNoID0gdGFnX3JlZ2V4cC5tYXRjaChlbGVtZW50LnRhZykKCiAgICAgICAgICAgICAgICBpZiBuc21hdGNoIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGVsZW1lbnQudGFnCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5zLCBuYW1lID0gbnNtYXRjaC5ncm91cHMoKQogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGNvbnN0YW50cy5wcmVmaXhlc1tuc10KICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiVzICVzIiAlIChwcmVmaXgsIG5hbWUpCiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlczwlcz4iICUgKCcgJyAqIGluZGVudCwgbmFtZSkpCgogICAgICAgICAgICAgICAgaWYgaGFzYXR0cihlbGVtZW50LCAiYXR0cmliIik6CiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IFtdCiAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGVsZW1lbnQuYXR0cmliLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIG5zbWF0Y2ggPSB0YWdfcmVnZXhwLm1hdGNoKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5zbWF0Y2ggaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBucywgbmFtZSA9IG5zbWF0Y2guZ3JvdXBzKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGNvbnN0YW50cy5wcmVmaXhlc1tuc10KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfc3RyaW5nID0gIiVzICVzIiAlIChwcmVmaXgsIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyX3N0cmluZyA9IG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5hcHBlbmQoKGF0dHJfc3RyaW5nLCB2YWx1ZSkpCgogICAgICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBzb3J0ZWQoYXR0cmlidXRlcyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgnfCVzJXM9IiVzIicgJSAoJyAnICogKGluZGVudCArIDIpLCBuYW1lLCB2YWx1ZSkpCiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LnRleHQ6CiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXNcIiVzXCIiICUgKCcgJyAqIChpbmRlbnQgKyAyKSwgZWxlbWVudC50ZXh0KSkKICAgICAgICAgICAgaW5kZW50ICs9IDIKICAgICAgICAgICAgZm9yIGNoaWxkIGluIGVsZW1lbnQ6CiAgICAgICAgICAgICAgICBzZXJpYWxpemVFbGVtZW50KGNoaWxkLCBpbmRlbnQpCiAgICAgICAgICAgIGlmIGVsZW1lbnQudGFpbDoKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzXCIlc1wiIiAlICgnICcgKiAoaW5kZW50IC0gMiksIGVsZW1lbnQudGFpbCkpCiAgICAgICAgc2VyaWFsaXplRWxlbWVudChlbGVtZW50LCAwKQoKICAgICAgICByZXR1cm4gIlxuIi5qb2luKHJ2KQoKICAgIGRlZiB0b3N0cmluZyhlbGVtZW50KTogICMgcHlsaW50OmRpc2FibGU9dW51c2VkLXZhcmlhYmxlCiAgICAgICAgIiIiU2VyaWFsaXplIGFuIGVsZW1lbnQgYW5kIGl0cyBjaGlsZCBub2RlcyB0byBhIHN0cmluZyIiIgogICAgICAgIHJ2ID0gW10KICAgICAgICBmaWx0ZXIgPSBfaWhhdGV4bWwuSW5mb3NldEZpbHRlcigpCgogICAgICAgIGRlZiBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVsZW1lbnQsIEVsZW1lbnRUcmVlLkVsZW1lbnRUcmVlKToKICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmdldHJvb3QoKQoKICAgICAgICAgICAgaWYgZWxlbWVudC50YWcgPT0gIjwhRE9DVFlQRT4iOgogICAgICAgICAgICAgICAgaWYgZWxlbWVudC5nZXQoInB1YmxpY0lkIikgb3IgZWxlbWVudC5nZXQoInN5c3RlbUlkIik6CiAgICAgICAgICAgICAgICAgICAgcHVibGljSWQgPSBlbGVtZW50LmdldCgicHVibGljSWQiKSBvciAiIgogICAgICAgICAgICAgICAgICAgIHN5c3RlbUlkID0gZWxlbWVudC5nZXQoInN5c3RlbUlkIikgb3IgIiIKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoIiIiPCFET0NUWVBFICVzIFBVQkxJQyAiJXMiICIlcyI+IiIiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsZW1lbnQudGV4dCwgcHVibGljSWQsIHN5c3RlbUlkKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCI8IURPQ1RZUEUgJXM+IiAlIChlbGVtZW50LnRleHQsKSkKICAgICAgICAgICAgZWxpZiBlbGVtZW50LnRhZyA9PSAiRE9DVU1FTlRfUk9PVCI6CiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LnRleHQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKGVsZW1lbnQudGV4dCkKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQudGFpbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkRvY3VtZW50IG5vZGUgY2Fubm90IGhhdmUgdGFpbCIpCiAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGVsZW1lbnQsICJhdHRyaWIiKSBhbmQgbGVuKGVsZW1lbnQuYXR0cmliKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkRvY3VtZW50IG5vZGUgY2Fubm90IGhhdmUgYXR0cmlidXRlcyIpCgogICAgICAgICAgICAgICAgZm9yIGNoaWxkIGluIGVsZW1lbnQ6CiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplRWxlbWVudChjaGlsZCkKCiAgICAgICAgICAgIGVsaWYgZWxlbWVudC50YWcgPT0gRWxlbWVudFRyZWVDb21tZW50VHlwZToKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiPCEtLSVzLS0+IiAlIChlbGVtZW50LnRleHQsKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgVGhpcyBpcyBhc3N1bWVkIHRvIGJlIGFuIG9yZGluYXJ5IGVsZW1lbnQKICAgICAgICAgICAgICAgIGlmIG5vdCBlbGVtZW50LmF0dHJpYjoKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoIjwlcz4iICUgKGZpbHRlci5mcm9tWG1sTmFtZShlbGVtZW50LnRhZyksKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgYXR0ciA9ICIgIi5qb2luKFsiJXM9XCIlc1wiIiAlICgKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmZyb21YbWxOYW1lKG5hbWUpLCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGVsZW1lbnQuYXR0cmliLml0ZW1zKCldKQogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiPCVzICVzPiIgJSAoZWxlbWVudC50YWcsIGF0dHIpKQogICAgICAgICAgICAgICAgaWYgZWxlbWVudC50ZXh0OgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZChlbGVtZW50LnRleHQpCgogICAgICAgICAgICAgICAgZm9yIGNoaWxkIGluIGVsZW1lbnQ6CiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplRWxlbWVudChjaGlsZCkKCiAgICAgICAgICAgICAgICBydi5hcHBlbmQoIjwvJXM+IiAlIChlbGVtZW50LnRhZywpKQoKICAgICAgICAgICAgaWYgZWxlbWVudC50YWlsOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKGVsZW1lbnQudGFpbCkKCiAgICAgICAgc2VyaWFsaXplRWxlbWVudChlbGVtZW50KQoKICAgICAgICByZXR1cm4gIiIuam9pbihydikKCiAgICBjbGFzcyBUcmVlQnVpbGRlcihiYXNlLlRyZWVCdWlsZGVyKTogICMgcHlsaW50OmRpc2FibGU9dW51c2VkLXZhcmlhYmxlCiAgICAgICAgZG9jdW1lbnRDbGFzcyA9IERvY3VtZW50CiAgICAgICAgZG9jdHlwZUNsYXNzID0gRG9jdW1lbnRUeXBlCiAgICAgICAgZWxlbWVudENsYXNzID0gRWxlbWVudAogICAgICAgIGNvbW1lbnRDbGFzcyA9IENvbW1lbnQKICAgICAgICBmcmFnbWVudENsYXNzID0gRG9jdW1lbnRGcmFnbWVudAogICAgICAgIGltcGxlbWVudGF0aW9uID0gRWxlbWVudFRyZWVJbXBsZW1lbnRhdGlvbgoKICAgICAgICBkZWYgdGVzdFNlcmlhbGl6ZXIoc2VsZiwgZWxlbWVudCk6CiAgICAgICAgICAgIHJldHVybiB0ZXN0U2VyaWFsaXplcihlbGVtZW50KQoKICAgICAgICBkZWYgZ2V0RG9jdW1lbnQoc2VsZik6CiAgICAgICAgICAgIGlmIGZ1bGxUcmVlOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZG9jdW1lbnQuX2VsZW1lbnQKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVmYXVsdE5hbWVzcGFjZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kb2N1bWVudC5fZWxlbWVudC5maW5kKAogICAgICAgICAgICAgICAgICAgICAgICAieyVzfWh0bWwiICUgc2VsZi5kZWZhdWx0TmFtZXNwYWNlKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kb2N1bWVudC5fZWxlbWVudC5maW5kKCJodG1sIikKCiAgICAgICAgZGVmIGdldEZyYWdtZW50KHNlbGYpOgogICAgICAgICAgICByZXR1cm4gYmFzZS5UcmVlQnVpbGRlci5nZXRGcmFnbWVudChzZWxmKS5fZWxlbWVudAoKICAgIHJldHVybiBsb2NhbHMoKQoKCmdldEVUcmVlTW9kdWxlID0gbW9kdWxlRmFjdG9yeUZhY3RvcnkoZ2V0RVRyZWVCdWlsZGVyKQpQSwMEFAAAAAAAAAAhANr+StBRNwAAUTcAAD8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2V0cmVlX2x4bWwucHkiIiJNb2R1bGUgZm9yIHN1cHBvcnRpbmcgdGhlIGx4bWwuZXRyZWUgbGlicmFyeS4gVGhlIGlkZWEgaGVyZSBpcyB0byB1c2UgYXMgbXVjaApvZiB0aGUgbmF0aXZlIGxpYnJhcnkgYXMgcG9zc2libGUsIHdpdGhvdXQgdXNpbmcgZnJhZ2lsZSBoYWNrcyBsaWtlIGN1c3RvbSBlbGVtZW50Cm5hbWVzIHRoYXQgYnJlYWsgYmV0d2VlbiByZWxlYXNlcy4gVGhlIGRvd25zaWRlIG9mIHRoaXMgaXMgdGhhdCB3ZSBjYW5ub3QgcmVwcmVzZW50CmFsbCBwb3NzaWJsZSB0cmVlczsgc3BlY2lmaWNhbGx5IHRoZSBmb2xsb3dpbmcgYXJlIGtub3duIHRvIGNhdXNlIHByb2JsZW1zOgoKVGV4dCBvciBjb21tZW50cyBhcyBzaWJsaW5ncyBvZiB0aGUgcm9vdCBlbGVtZW50CkRvY3lwZXMgd2l0aCBubyBuYW1lCgpXaGVuIGFueSBvZiB0aGVzZSB0aGluZ3Mgb2NjdXIsIHdlIGVtaXQgYSBEYXRhTG9zc1dhcm5pbmcKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKIyBweWxpbnQ6ZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCgppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHJlCmltcG9ydCBzeXMKCmZyb20gLiBpbXBvcnQgYmFzZQpmcm9tIC4uY29uc3RhbnRzIGltcG9ydCBEYXRhTG9zc1dhcm5pbmcKZnJvbSAuLiBpbXBvcnQgY29uc3RhbnRzCmZyb20gLiBpbXBvcnQgZXRyZWUgYXMgZXRyZWVfYnVpbGRlcnMKZnJvbSAuLiBpbXBvcnQgX2loYXRleG1sCgppbXBvcnQgbHhtbC5ldHJlZSBhcyBldHJlZQoKCmZ1bGxUcmVlID0gVHJ1ZQp0YWdfcmVnZXhwID0gcmUuY29tcGlsZSgieyhbXn1dKil9KC4qKSIpCgpjb21tZW50X3R5cGUgPSBldHJlZS5Db21tZW50KCJhc2QiKS50YWcKCgpjbGFzcyBEb2N1bWVudFR5cGUob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLnB1YmxpY0lkID0gcHVibGljSWQKICAgICAgICBzZWxmLnN5c3RlbUlkID0gc3lzdGVtSWQKCgpjbGFzcyBEb2N1bWVudChvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuX2VsZW1lbnRUcmVlID0gTm9uZQogICAgICAgIHNlbGYuX2NoaWxkTm9kZXMgPSBbXQoKICAgIGRlZiBhcHBlbmRDaGlsZChzZWxmLCBlbGVtZW50KToKICAgICAgICBzZWxmLl9lbGVtZW50VHJlZS5nZXRyb290KCkuYWRkbmV4dChlbGVtZW50Ll9lbGVtZW50KQoKICAgIGRlZiBfZ2V0Q2hpbGROb2RlcyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGROb2RlcwoKICAgIGNoaWxkTm9kZXMgPSBwcm9wZXJ0eShfZ2V0Q2hpbGROb2RlcykKCgpkZWYgdGVzdFNlcmlhbGl6ZXIoZWxlbWVudCk6CiAgICBydiA9IFtdCiAgICBpbmZvc2V0RmlsdGVyID0gX2loYXRleG1sLkluZm9zZXRGaWx0ZXIocHJldmVudERvdWJsZURhc2hDb21tZW50cz1UcnVlKQoKICAgIGRlZiBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQsIGluZGVudD0wKToKICAgICAgICBpZiBub3QgaGFzYXR0cihlbGVtZW50LCAidGFnIik6CiAgICAgICAgICAgIGlmIGhhc2F0dHIoZWxlbWVudCwgImdldHJvb3QiKToKICAgICAgICAgICAgICAgICMgRnVsbCB0cmVlIGNhc2UKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiI2RvY3VtZW50IikKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQuZG9jaW5mby5pbnRlcm5hbERURDoKICAgICAgICAgICAgICAgICAgICBpZiBub3QgKGVsZW1lbnQuZG9jaW5mby5wdWJsaWNfaWQgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZG9jaW5mby5zeXN0ZW1fdXJsKToKICAgICAgICAgICAgICAgICAgICAgICAgZHRkX3N0ciA9ICI8IURPQ1RZUEUgJXM+IiAlIGVsZW1lbnQuZG9jaW5mby5yb290X25hbWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBkdGRfc3RyID0gIiIiPCFET0NUWVBFICVzICIlcyIgIiVzIj4iIiIgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRvY2luZm8ucm9vdF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kb2NpbmZvLnB1YmxpY19pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZG9jaW5mby5zeXN0ZW1fdXJsKQogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzJXMiICUgKCcgJyAqIChpbmRlbnQgKyAyKSwgZHRkX3N0cikpCiAgICAgICAgICAgICAgICBuZXh0X2VsZW1lbnQgPSBlbGVtZW50LmdldHJvb3QoKQogICAgICAgICAgICAgICAgd2hpbGUgbmV4dF9lbGVtZW50LmdldHByZXZpb3VzKCkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbmV4dF9lbGVtZW50ID0gbmV4dF9lbGVtZW50LmdldHByZXZpb3VzKCkKICAgICAgICAgICAgICAgIHdoaWxlIG5leHRfZWxlbWVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVFbGVtZW50KG5leHRfZWxlbWVudCwgaW5kZW50ICsgMikKICAgICAgICAgICAgICAgICAgICBuZXh0X2VsZW1lbnQgPSBuZXh0X2VsZW1lbnQuZ2V0bmV4dCgpCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShlbGVtZW50LCBzdHIpIG9yIGlzaW5zdGFuY2UoZWxlbWVudCwgYnl0ZXMpOgogICAgICAgICAgICAgICAgIyBUZXh0IGluIGEgZnJhZ21lbnQKICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGVsZW1lbnQsIHN0cikgb3Igc3lzLnZlcnNpb25faW5mb1swXSA9PSAyCiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlc1wiJXNcIiIgJSAoJyAnICogaW5kZW50LCBlbGVtZW50KSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgRnJhZ21lbnQgY2FzZQogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCIjZG9jdW1lbnQtZnJhZ21lbnQiKQogICAgICAgICAgICAgICAgZm9yIG5leHRfZWxlbWVudCBpbiBlbGVtZW50OgogICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQobmV4dF9lbGVtZW50LCBpbmRlbnQgKyAyKQogICAgICAgIGVsaWYgZWxlbWVudC50YWcgPT0gY29tbWVudF90eXBlOgogICAgICAgICAgICBydi5hcHBlbmQoInwlczwhLS0gJXMgLS0+IiAlICgnICcgKiBpbmRlbnQsIGVsZW1lbnQudGV4dCkpCiAgICAgICAgICAgIGlmIGhhc2F0dHIoZWxlbWVudCwgInRhaWwiKSBhbmQgZWxlbWVudC50YWlsOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXNcIiVzXCIiICUgKCcgJyAqIGluZGVudCwgZWxlbWVudC50YWlsKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShlbGVtZW50LCBldHJlZS5fRWxlbWVudCkKICAgICAgICAgICAgbnNtYXRjaCA9IGV0cmVlX2J1aWxkZXJzLnRhZ19yZWdleHAubWF0Y2goZWxlbWVudC50YWcpCiAgICAgICAgICAgIGlmIG5zbWF0Y2ggaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBucyA9IG5zbWF0Y2guZ3JvdXAoMSkKICAgICAgICAgICAgICAgIHRhZyA9IG5zbWF0Y2guZ3JvdXAoMikKICAgICAgICAgICAgICAgIHByZWZpeCA9IGNvbnN0YW50cy5wcmVmaXhlc1tuc10KICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzPCVzICVzPiIgJSAoJyAnICogaW5kZW50LCBwcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9zZXRGaWx0ZXIuZnJvbVhtbE5hbWUodGFnKSkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlczwlcz4iICUgKCcgJyAqIGluZGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3NldEZpbHRlci5mcm9tWG1sTmFtZShlbGVtZW50LnRhZykpKQoKICAgICAgICAgICAgaWYgaGFzYXR0cihlbGVtZW50LCAiYXR0cmliIik6CiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gW10KICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBlbGVtZW50LmF0dHJpYi5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgIG5zbWF0Y2ggPSB0YWdfcmVnZXhwLm1hdGNoKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgaWYgbnNtYXRjaCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgbnMsIG5hbWUgPSBuc21hdGNoLmdyb3VwcygpCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBpbmZvc2V0RmlsdGVyLmZyb21YbWxOYW1lKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGNvbnN0YW50cy5wcmVmaXhlc1tuc10KICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9zdHJpbmcgPSAiJXMgJXMiICUgKHByZWZpeCwgbmFtZSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBhdHRyX3N0cmluZyA9IGluZm9zZXRGaWx0ZXIuZnJvbVhtbE5hbWUobmFtZSkKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFwcGVuZCgoYXR0cl9zdHJpbmcsIHZhbHVlKSkKCiAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gc29ydGVkKGF0dHJpYnV0ZXMpOgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgnfCVzJXM9IiVzIicgJSAoJyAnICogKGluZGVudCArIDIpLCBuYW1lLCB2YWx1ZSkpCgogICAgICAgICAgICBpZiBlbGVtZW50LnRleHQ6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlc1wiJXNcIiIgJSAoJyAnICogKGluZGVudCArIDIpLCBlbGVtZW50LnRleHQpKQogICAgICAgICAgICBpbmRlbnQgKz0gMgogICAgICAgICAgICBmb3IgY2hpbGQgaW4gZWxlbWVudDoKICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQoY2hpbGQsIGluZGVudCkKICAgICAgICAgICAgaWYgaGFzYXR0cihlbGVtZW50LCAidGFpbCIpIGFuZCBlbGVtZW50LnRhaWw6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlc1wiJXNcIiIgJSAoJyAnICogKGluZGVudCAtIDIpLCBlbGVtZW50LnRhaWwpKQogICAgc2VyaWFsaXplRWxlbWVudChlbGVtZW50LCAwKQoKICAgIHJldHVybiAiXG4iLmpvaW4ocnYpCgoKZGVmIHRvc3RyaW5nKGVsZW1lbnQpOgogICAgIiIiU2VyaWFsaXplIGFuIGVsZW1lbnQgYW5kIGl0cyBjaGlsZCBub2RlcyB0byBhIHN0cmluZyIiIgogICAgcnYgPSBbXQoKICAgIGRlZiBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQpOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKGVsZW1lbnQsICJ0YWciKToKICAgICAgICAgICAgaWYgZWxlbWVudC5kb2NpbmZvLmludGVybmFsRFREOgogICAgICAgICAgICAgICAgaWYgZWxlbWVudC5kb2NpbmZvLmRvY3R5cGU6CiAgICAgICAgICAgICAgICAgICAgZHRkX3N0ciA9IGVsZW1lbnQuZG9jaW5mby5kb2N0eXBlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGR0ZF9zdHIgPSAiPCFET0NUWVBFICVzPiIgJSBlbGVtZW50LmRvY2luZm8ucm9vdF9uYW1lCiAgICAgICAgICAgICAgICBydi5hcHBlbmQoZHRkX3N0cikKICAgICAgICAgICAgc2VyaWFsaXplRWxlbWVudChlbGVtZW50LmdldHJvb3QoKSkKCiAgICAgICAgZWxpZiBlbGVtZW50LnRhZyA9PSBjb21tZW50X3R5cGU6CiAgICAgICAgICAgIHJ2LmFwcGVuZCgiPCEtLSVzLS0+IiAlIChlbGVtZW50LnRleHQsKSkKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBUaGlzIGlzIGFzc3VtZWQgdG8gYmUgYW4gb3JkaW5hcnkgZWxlbWVudAogICAgICAgICAgICBpZiBub3QgZWxlbWVudC5hdHRyaWI6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoIjwlcz4iICUgKGVsZW1lbnQudGFnLCkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhdHRyID0gIiAiLmpvaW4oWyIlcz1cIiVzXCIiICUgKG5hbWUsIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gZWxlbWVudC5hdHRyaWIuaXRlbXMoKV0pCiAgICAgICAgICAgICAgICBydi5hcHBlbmQoIjwlcyAlcz4iICUgKGVsZW1lbnQudGFnLCBhdHRyKSkKICAgICAgICAgICAgaWYgZWxlbWVudC50ZXh0OgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKGVsZW1lbnQudGV4dCkKCiAgICAgICAgICAgIGZvciBjaGlsZCBpbiBlbGVtZW50OgogICAgICAgICAgICAgICAgc2VyaWFsaXplRWxlbWVudChjaGlsZCkKCiAgICAgICAgICAgIHJ2LmFwcGVuZCgiPC8lcz4iICUgKGVsZW1lbnQudGFnLCkpCgogICAgICAgIGlmIGhhc2F0dHIoZWxlbWVudCwgInRhaWwiKSBhbmQgZWxlbWVudC50YWlsOgogICAgICAgICAgICBydi5hcHBlbmQoZWxlbWVudC50YWlsKQoKICAgIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCkKCiAgICByZXR1cm4gIiIuam9pbihydikKCgpjbGFzcyBUcmVlQnVpbGRlcihiYXNlLlRyZWVCdWlsZGVyKToKICAgIGRvY3VtZW50Q2xhc3MgPSBEb2N1bWVudAogICAgZG9jdHlwZUNsYXNzID0gRG9jdW1lbnRUeXBlCiAgICBlbGVtZW50Q2xhc3MgPSBOb25lCiAgICBjb21tZW50Q2xhc3MgPSBOb25lCiAgICBmcmFnbWVudENsYXNzID0gRG9jdW1lbnQKICAgIGltcGxlbWVudGF0aW9uID0gZXRyZWUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZXNwYWNlSFRNTEVsZW1lbnRzLCBmdWxsVHJlZT1GYWxzZSk6CiAgICAgICAgYnVpbGRlciA9IGV0cmVlX2J1aWxkZXJzLmdldEVUcmVlTW9kdWxlKGV0cmVlLCBmdWxsVHJlZT1mdWxsVHJlZSkKICAgICAgICBpbmZvc2V0RmlsdGVyID0gc2VsZi5pbmZvc2V0RmlsdGVyID0gX2loYXRleG1sLkluZm9zZXRGaWx0ZXIocHJldmVudERvdWJsZURhc2hDb21tZW50cz1UcnVlKQogICAgICAgIHNlbGYubmFtZXNwYWNlSFRNTEVsZW1lbnRzID0gbmFtZXNwYWNlSFRNTEVsZW1lbnRzCgogICAgICAgIGNsYXNzIEF0dHJpYnV0ZXMoZGljdCk6CiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbGVtZW50LCB2YWx1ZT1Ob25lKToKICAgICAgICAgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7fQogICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudCA9IGVsZW1lbnQKICAgICAgICAgICAgICAgIGRpY3QuX19pbml0X18oc2VsZiwgdmFsdWUpICAjIHB5bGludDpkaXNhYmxlPW5vbi1wYXJlbnQtaW5pdC1jYWxsZWQKICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgdHVwbGUpOgogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gInslc30lcyIgJSAoa2V5WzJdLCBpbmZvc2V0RmlsdGVyLmNvZXJjZUF0dHJpYnV0ZShrZXlbMV0pKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBpbmZvc2V0RmlsdGVyLmNvZXJjZUF0dHJpYnV0ZShrZXkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC5fZWxlbWVudC5hdHRyaWJbbmFtZV0gPSB2YWx1ZQoKICAgICAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgICAgICAgICAgZGljdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIHR1cGxlKToKICAgICAgICAgICAgICAgICAgICBuYW1lID0gInslc30lcyIgJSAoa2V5WzJdLCBpbmZvc2V0RmlsdGVyLmNvZXJjZUF0dHJpYnV0ZShrZXlbMV0pKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuYW1lID0gaW5mb3NldEZpbHRlci5jb2VyY2VBdHRyaWJ1dGUoa2V5KQogICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC5fZWxlbWVudC5hdHRyaWJbbmFtZV0gPSB2YWx1ZQoKICAgICAgICBjbGFzcyBFbGVtZW50KGJ1aWxkZXIuRWxlbWVudCk6CiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBuYW1lc3BhY2UpOgogICAgICAgICAgICAgICAgbmFtZSA9IGluZm9zZXRGaWx0ZXIuY29lcmNlRWxlbWVudChuYW1lKQogICAgICAgICAgICAgICAgYnVpbGRlci5FbGVtZW50Ll9faW5pdF9fKHNlbGYsIG5hbWUsIG5hbWVzcGFjZT1uYW1lc3BhY2UpCiAgICAgICAgICAgICAgICBzZWxmLl9hdHRyaWJ1dGVzID0gQXR0cmlidXRlcyhzZWxmKQoKICAgICAgICAgICAgZGVmIF9zZXROYW1lKHNlbGYsIG5hbWUpOgogICAgICAgICAgICAgICAgc2VsZi5fbmFtZSA9IGluZm9zZXRGaWx0ZXIuY29lcmNlRWxlbWVudChuYW1lKQogICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50YWcgPSBzZWxmLl9nZXRFVHJlZVRhZygKICAgICAgICAgICAgICAgICAgICBzZWxmLl9uYW1lLCBzZWxmLl9uYW1lc3BhY2UpCgogICAgICAgICAgICBkZWYgX2dldE5hbWUoc2VsZik6CiAgICAgICAgICAgICAgICByZXR1cm4gaW5mb3NldEZpbHRlci5mcm9tWG1sTmFtZShzZWxmLl9uYW1lKQoKICAgICAgICAgICAgbmFtZSA9IHByb3BlcnR5KF9nZXROYW1lLCBfc2V0TmFtZSkKCiAgICAgICAgICAgIGRlZiBfZ2V0QXR0cmlidXRlcyhzZWxmKToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9hdHRyaWJ1dGVzCgogICAgICAgICAgICBkZWYgX3NldEF0dHJpYnV0ZXMoc2VsZiwgYXR0cmlidXRlcyk6CiAgICAgICAgICAgICAgICBzZWxmLl9hdHRyaWJ1dGVzID0gQXR0cmlidXRlcyhzZWxmLCBhdHRyaWJ1dGVzKQoKICAgICAgICAgICAgYXR0cmlidXRlcyA9IHByb3BlcnR5KF9nZXRBdHRyaWJ1dGVzLCBfc2V0QXR0cmlidXRlcykKCiAgICAgICAgICAgIGRlZiBpbnNlcnRUZXh0KHNlbGYsIGRhdGEsIGluc2VydEJlZm9yZT1Ob25lKToKICAgICAgICAgICAgICAgIGRhdGEgPSBpbmZvc2V0RmlsdGVyLmNvZXJjZUNoYXJhY3RlcnMoZGF0YSkKICAgICAgICAgICAgICAgIGJ1aWxkZXIuRWxlbWVudC5pbnNlcnRUZXh0KHNlbGYsIGRhdGEsIGluc2VydEJlZm9yZSkKCiAgICAgICAgICAgIGRlZiBhcHBlbmRDaGlsZChzZWxmLCBjaGlsZCk6CiAgICAgICAgICAgICAgICBidWlsZGVyLkVsZW1lbnQuYXBwZW5kQ2hpbGQoc2VsZiwgY2hpbGQpCgogICAgICAgIGNsYXNzIENvbW1lbnQoYnVpbGRlci5Db21tZW50KToKICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOgogICAgICAgICAgICAgICAgZGF0YSA9IGluZm9zZXRGaWx0ZXIuY29lcmNlQ29tbWVudChkYXRhKQogICAgICAgICAgICAgICAgYnVpbGRlci5Db21tZW50Ll9faW5pdF9fKHNlbGYsIGRhdGEpCgogICAgICAgICAgICBkZWYgX3NldERhdGEoc2VsZiwgZGF0YSk6CiAgICAgICAgICAgICAgICBkYXRhID0gaW5mb3NldEZpbHRlci5jb2VyY2VDb21tZW50KGRhdGEpCiAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50LnRleHQgPSBkYXRhCgogICAgICAgICAgICBkZWYgX2dldERhdGEoc2VsZik6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZWxlbWVudC50ZXh0CgogICAgICAgICAgICBkYXRhID0gcHJvcGVydHkoX2dldERhdGEsIF9zZXREYXRhKQoKICAgICAgICBzZWxmLmVsZW1lbnRDbGFzcyA9IEVsZW1lbnQKICAgICAgICBzZWxmLmNvbW1lbnRDbGFzcyA9IENvbW1lbnQKICAgICAgICAjIHNlbGYuZnJhZ21lbnRDbGFzcyA9IGJ1aWxkZXIuRG9jdW1lbnRGcmFnbWVudAogICAgICAgIGJhc2UuVHJlZUJ1aWxkZXIuX19pbml0X18oc2VsZiwgbmFtZXNwYWNlSFRNTEVsZW1lbnRzKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBiYXNlLlRyZWVCdWlsZGVyLnJlc2V0KHNlbGYpCiAgICAgICAgc2VsZi5pbnNlcnRDb21tZW50ID0gc2VsZi5pbnNlcnRDb21tZW50SW5pdGlhbAogICAgICAgIHNlbGYuaW5pdGlhbF9jb21tZW50cyA9IFtdCiAgICAgICAgc2VsZi5kb2N0eXBlID0gTm9uZQoKICAgIGRlZiB0ZXN0U2VyaWFsaXplcihzZWxmLCBlbGVtZW50KToKICAgICAgICByZXR1cm4gdGVzdFNlcmlhbGl6ZXIoZWxlbWVudCkKCiAgICBkZWYgZ2V0RG9jdW1lbnQoc2VsZik6CiAgICAgICAgaWYgZnVsbFRyZWU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmRvY3VtZW50Ll9lbGVtZW50VHJlZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmRvY3VtZW50Ll9lbGVtZW50VHJlZS5nZXRyb290KCkKCiAgICBkZWYgZ2V0RnJhZ21lbnQoc2VsZik6CiAgICAgICAgZnJhZ21lbnQgPSBbXQogICAgICAgIGVsZW1lbnQgPSBzZWxmLm9wZW5FbGVtZW50c1swXS5fZWxlbWVudAogICAgICAgIGlmIGVsZW1lbnQudGV4dDoKICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kKGVsZW1lbnQudGV4dCkKICAgICAgICBmcmFnbWVudC5leHRlbmQobGlzdChlbGVtZW50KSkKICAgICAgICBpZiBlbGVtZW50LnRhaWw6CiAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZChlbGVtZW50LnRhaWwpCiAgICAgICAgcmV0dXJuIGZyYWdtZW50CgogICAgZGVmIGluc2VydERvY3R5cGUoc2VsZiwgdG9rZW4pOgogICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgcHVibGljSWQgPSB0b2tlblsicHVibGljSWQiXQogICAgICAgIHN5c3RlbUlkID0gdG9rZW5bInN5c3RlbUlkIl0KCiAgICAgICAgaWYgbm90IG5hbWU6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImx4bWwgY2Fubm90IHJlcHJlc2VudCBlbXB0eSBkb2N0eXBlIiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgICAgICBzZWxmLmRvY3R5cGUgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29lcmNlZE5hbWUgPSBzZWxmLmluZm9zZXRGaWx0ZXIuY29lcmNlRWxlbWVudChuYW1lKQogICAgICAgICAgICBpZiBjb2VyY2VkTmFtZSAhPSBuYW1lOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigibHhtbCBjYW5ub3QgcmVwcmVzZW50IG5vbi14bWwgZG9jdHlwZSIsIERhdGFMb3NzV2FybmluZykKCiAgICAgICAgICAgIGRvY3R5cGUgPSBzZWxmLmRvY3R5cGVDbGFzcyhjb2VyY2VkTmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKQogICAgICAgICAgICBzZWxmLmRvY3R5cGUgPSBkb2N0eXBlCgogICAgZGVmIGluc2VydENvbW1lbnRJbml0aWFsKHNlbGYsIGRhdGEsIHBhcmVudD1Ob25lKToKICAgICAgICBhc3NlcnQgcGFyZW50IGlzIE5vbmUgb3IgcGFyZW50IGlzIHNlbGYuZG9jdW1lbnQKICAgICAgICBhc3NlcnQgc2VsZi5kb2N1bWVudC5fZWxlbWVudFRyZWUgaXMgTm9uZQogICAgICAgIHNlbGYuaW5pdGlhbF9jb21tZW50cy5hcHBlbmQoZGF0YSkKCiAgICBkZWYgaW5zZXJ0Q29tbWVudE1haW4oc2VsZiwgZGF0YSwgcGFyZW50PU5vbmUpOgogICAgICAgIGlmIChwYXJlbnQgPT0gc2VsZi5kb2N1bWVudCBhbmQKICAgICAgICAgICAgICAgIHNlbGYuZG9jdW1lbnQuX2VsZW1lbnRUcmVlLmdldHJvb3QoKVstMV0udGFnID09IGNvbW1lbnRfdHlwZSk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImx4bWwgY2Fubm90IHJlcHJlc2VudCBhZGphY2VudCBjb21tZW50cyBiZXlvbmQgdGhlIHJvb3QgZWxlbWVudHMiLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgc3VwZXIoVHJlZUJ1aWxkZXIsIHNlbGYpLmluc2VydENvbW1lbnQoZGF0YSwgcGFyZW50KQoKICAgIGRlZiBpbnNlcnRSb290KHNlbGYsIHRva2VuKToKICAgICAgICAiIiJDcmVhdGUgdGhlIGRvY3VtZW50IHJvb3QiIiIKICAgICAgICAjIEJlY2F1c2Ugb2YgdGhlIHdheSBsaWJ4bWwyIHdvcmtzLCBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgcG9zc2libGUgdG8KICAgICAgICAjIGFsdGVyIGluZm9ybWF0aW9uIGxpa2UgdGhlIGRvY3R5cGUgYWZ0ZXIgdGhlIHRyZWUgaGFzIGJlZW4gcGFyc2VkLgogICAgICAgICMgVGhlcmVmb3JlIHdlIG5lZWQgdG8gdXNlIHRoZSBidWlsdC1pbiBwYXJzZXIgdG8gY3JlYXRlIG91ciBpbml0aWFsCiAgICAgICAgIyB0cmVlLCBhZnRlciB3aGljaCB3ZSBjYW4gYWRkIGVsZW1lbnRzIGxpa2Ugbm9ybWFsCiAgICAgICAgZG9jU3RyID0gIiIKICAgICAgICBpZiBzZWxmLmRvY3R5cGU6CiAgICAgICAgICAgIGFzc2VydCBzZWxmLmRvY3R5cGUubmFtZQogICAgICAgICAgICBkb2NTdHIgKz0gIjwhRE9DVFlQRSAlcyIgJSBzZWxmLmRvY3R5cGUubmFtZQogICAgICAgICAgICBpZiAoc2VsZi5kb2N0eXBlLnB1YmxpY0lkIGlzIG5vdCBOb25lIG9yCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kb2N0eXBlLnN5c3RlbUlkIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgICAgIGRvY1N0ciArPSAoJyBQVUJMSUMgIiVzIiAnICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuaW5mb3NldEZpbHRlci5jb2VyY2VQdWJpZChzZWxmLmRvY3R5cGUucHVibGljSWQgb3IgIiIpKSkKICAgICAgICAgICAgICAgIGlmIHNlbGYuZG9jdHlwZS5zeXN0ZW1JZDoKICAgICAgICAgICAgICAgICAgICBzeXNpZCA9IHNlbGYuZG9jdHlwZS5zeXN0ZW1JZAogICAgICAgICAgICAgICAgICAgIGlmIHN5c2lkLmZpbmQoIiciKSA+PSAwIGFuZCBzeXNpZC5maW5kKCciJykgPj0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiRE9DVFlQRSBzeXN0ZW0gY2Fubm90IGNvbnRhaW4gc2luZ2xlIGFuZCBkb3VibGUgcXVvdGVzIiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgICAgICAgICAgICAgICAgICBzeXNpZCA9IHN5c2lkLnJlcGxhY2UoIiciLCAnVTAwMDI3JykKICAgICAgICAgICAgICAgICAgICBpZiBzeXNpZC5maW5kKCInIikgPj0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jU3RyICs9ICciJXMiJyAlIHN5c2lkCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgZG9jU3RyICs9ICInJXMnIiAlIHN5c2lkCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGRvY1N0ciArPSAiJyciCiAgICAgICAgICAgIGRvY1N0ciArPSAiPiIKICAgICAgICAgICAgaWYgc2VsZi5kb2N0eXBlLm5hbWUgIT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImx4bWwgY2Fubm90IHJlcHJlc2VudCBkb2N0eXBlIHdpdGggYSBkaWZmZXJlbnQgbmFtZSB0byB0aGUgcm9vdCBlbGVtZW50IiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgIGRvY1N0ciArPSAiPFRISVNfU0hPVUxEX05FVkVSX0FQUEVBUl9QVUJMSUNMWS8+IgogICAgICAgIHJvb3QgPSBldHJlZS5mcm9tc3RyaW5nKGRvY1N0cikKCiAgICAgICAgIyBBcHBlbmQgdGhlIGluaXRpYWwgY29tbWVudHM6CiAgICAgICAgZm9yIGNvbW1lbnRfdG9rZW4gaW4gc2VsZi5pbml0aWFsX2NvbW1lbnRzOgogICAgICAgICAgICBjb21tZW50ID0gc2VsZi5jb21tZW50Q2xhc3MoY29tbWVudF90b2tlblsiZGF0YSJdKQogICAgICAgICAgICByb290LmFkZHByZXZpb3VzKGNvbW1lbnQuX2VsZW1lbnQpCgogICAgICAgICMgQ3JlYXRlIHRoZSByb290IGRvY3VtZW50IGFuZCBhZGQgdGhlIEVsZW1lbnRUcmVlIHRvIGl0CiAgICAgICAgc2VsZi5kb2N1bWVudCA9IHNlbGYuZG9jdW1lbnRDbGFzcygpCiAgICAgICAgc2VsZi5kb2N1bWVudC5fZWxlbWVudFRyZWUgPSByb290LmdldHJvb3R0cmVlKCkKCiAgICAgICAgIyBHaXZlIHRoZSByb290IGVsZW1lbnQgdGhlIHJpZ2h0IG5hbWUKICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgIG5hbWVzcGFjZSA9IHRva2VuLmdldCgibmFtZXNwYWNlIiwgc2VsZi5kZWZhdWx0TmFtZXNwYWNlKQogICAgICAgIGlmIG5hbWVzcGFjZSBpcyBOb25lOgogICAgICAgICAgICBldHJlZV90YWcgPSBuYW1lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZXRyZWVfdGFnID0gInslc30lcyIgJSAobmFtZXNwYWNlLCBuYW1lKQogICAgICAgIHJvb3QudGFnID0gZXRyZWVfdGFnCgogICAgICAgICMgQWRkIHRoZSByb290IGVsZW1lbnQgdG8gdGhlIGludGVybmFsIGNoaWxkL29wZW4gZGF0YSBzdHJ1Y3R1cmVzCiAgICAgICAgcm9vdF9lbGVtZW50ID0gc2VsZi5lbGVtZW50Q2xhc3MobmFtZSwgbmFtZXNwYWNlKQogICAgICAgIHJvb3RfZWxlbWVudC5fZWxlbWVudCA9IHJvb3QKICAgICAgICBzZWxmLmRvY3VtZW50Ll9jaGlsZE5vZGVzLmFwcGVuZChyb290X2VsZW1lbnQpCiAgICAgICAgc2VsZi5vcGVuRWxlbWVudHMuYXBwZW5kKHJvb3RfZWxlbWVudCkKCiAgICAgICAgIyBSZXNldCB0byB0aGUgZGVmYXVsdCBpbnNlcnQgY29tbWVudCBmdW5jdGlvbgogICAgICAgIHNlbGYuaW5zZXJ0Q29tbWVudCA9IHNlbGYuaW5zZXJ0Q29tbWVudE1haW4KUEsDBBQAAAAAAAAAIQBzRCGWqBUAAKgVAAA8AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL19faW5pdF9fLnB5IiIiQSBjb2xsZWN0aW9uIG9mIG1vZHVsZXMgZm9yIGl0ZXJhdGluZyB0aHJvdWdoIGRpZmZlcmVudCBraW5kcyBvZgp0cmVlLCBnZW5lcmF0aW5nIHRva2VucyBpZGVudGljYWwgdG8gdGhvc2UgcHJvZHVjZWQgYnkgdGhlIHRva2VuaXplcgptb2R1bGUuCgpUbyBjcmVhdGUgYSB0cmVlIHdhbGtlciBmb3IgYSBuZXcgdHlwZSBvZiB0cmVlLCB5b3UgbmVlZCB0byBkbwppbXBsZW1lbnQgYSB0cmVlIHdhbGtlciBvYmplY3QgKGNhbGxlZCBUcmVlV2Fsa2VyIGJ5IGNvbnZlbnRpb24pIHRoYXQKaW1wbGVtZW50cyBhICdzZXJpYWxpemUnIG1ldGhvZCB0YWtpbmcgYSB0cmVlIGFzIHNvbGUgYXJndW1lbnQgYW5kCnJldHVybmluZyBhbiBpdGVyYXRvciBnZW5lcmF0aW5nIHRva2Vucy4KIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gLi4gaW1wb3J0IGNvbnN0YW50cwpmcm9tIC4uX3V0aWxzIGltcG9ydCBkZWZhdWx0X2V0cmVlCgpfX2FsbF9fID0gWyJnZXRUcmVlV2Fsa2VyIiwgInBwcmludCIsICJkb20iLCAiZXRyZWUiLCAiZ2Vuc2hpIiwgImV0cmVlX2x4bWwiXQoKdHJlZVdhbGtlckNhY2hlID0ge30KCgpkZWYgZ2V0VHJlZVdhbGtlcih0cmVlVHlwZSwgaW1wbGVtZW50YXRpb249Tm9uZSwgKiprd2FyZ3MpOgogICAgIiIiR2V0IGEgVHJlZVdhbGtlciBjbGFzcyBmb3IgdmFyaW91cyB0eXBlcyBvZiB0cmVlIHdpdGggYnVpbHQtaW4gc3VwcG9ydAoKICAgIEFyZ3M6CiAgICAgICAgdHJlZVR5cGUgKHN0cik6IHRoZSBuYW1lIG9mIHRoZSB0cmVlIHR5cGUgcmVxdWlyZWQgKGNhc2UtaW5zZW5zaXRpdmUpLgogICAgICAgICAgICBTdXBwb3J0ZWQgdmFsdWVzIGFyZToKCiAgICAgICAgICAgIC0gImRvbSI6IFRoZSB4bWwuZG9tLm1pbmlkb20gRE9NIGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgIC0gImV0cmVlIjogQSBnZW5lcmljIHdhbGtlciBmb3IgdHJlZSBpbXBsZW1lbnRhdGlvbnMgZXhwb3NpbmcgYW4KICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50dHJlZS1saWtlIGludGVyZmFjZSAoa25vd24gdG8gd29yayB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudFRyZWUsIGNFbGVtZW50VHJlZSBhbmQgbHhtbC5ldHJlZSkuCiAgICAgICAgICAgIC0gImx4bWwiOiBPcHRpbWl6ZWQgd2Fsa2VyIGZvciBseG1sLmV0cmVlCiAgICAgICAgICAgIC0gImdlbnNoaSI6IGEgR2Vuc2hpIHN0cmVhbQoKICAgICAgICBJbXBsZW1lbnRhdGlvbjogQSBtb2R1bGUgaW1wbGVtZW50aW5nIHRoZSB0cmVlIHR5cGUgZS5nLgogICAgICAgICAgICB4bWwuZXRyZWUuRWxlbWVudFRyZWUgb3IgY0VsZW1lbnRUcmVlIChDdXJyZW50bHkgYXBwbGllcyB0byB0aGUKICAgICAgICAgICAgImV0cmVlIiB0cmVlIHR5cGUgb25seSkuCiAgICAiIiIKCiAgICB0cmVlVHlwZSA9IHRyZWVUeXBlLmxvd2VyKCkKICAgIGlmIHRyZWVUeXBlIG5vdCBpbiB0cmVlV2Fsa2VyQ2FjaGU6CiAgICAgICAgaWYgdHJlZVR5cGUgPT0gImRvbSI6CiAgICAgICAgICAgIGZyb20gLiBpbXBvcnQgZG9tCiAgICAgICAgICAgIHRyZWVXYWxrZXJDYWNoZVt0cmVlVHlwZV0gPSBkb20uVHJlZVdhbGtlcgogICAgICAgIGVsaWYgdHJlZVR5cGUgPT0gImdlbnNoaSI6CiAgICAgICAgICAgIGZyb20gLiBpbXBvcnQgZ2Vuc2hpCiAgICAgICAgICAgIHRyZWVXYWxrZXJDYWNoZVt0cmVlVHlwZV0gPSBnZW5zaGkuVHJlZVdhbGtlcgogICAgICAgIGVsaWYgdHJlZVR5cGUgPT0gImx4bWwiOgogICAgICAgICAgICBmcm9tIC4gaW1wb3J0IGV0cmVlX2x4bWwKICAgICAgICAgICAgdHJlZVdhbGtlckNhY2hlW3RyZWVUeXBlXSA9IGV0cmVlX2x4bWwuVHJlZVdhbGtlcgogICAgICAgIGVsaWYgdHJlZVR5cGUgPT0gImV0cmVlIjoKICAgICAgICAgICAgZnJvbSAuIGltcG9ydCBldHJlZQogICAgICAgICAgICBpZiBpbXBsZW1lbnRhdGlvbiBpcyBOb25lOgogICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gPSBkZWZhdWx0X2V0cmVlCiAgICAgICAgICAgICMgWFhYOiBORVZFUiBjYWNoZSBoZXJlLCBjYWNoaW5nIGlzIGRvbmUgaW4gdGhlIGV0cmVlIHN1Ym1vZHVsZQogICAgICAgICAgICByZXR1cm4gZXRyZWUuZ2V0RVRyZWVNb2R1bGUoaW1wbGVtZW50YXRpb24sICoqa3dhcmdzKS5UcmVlV2Fsa2VyCiAgICByZXR1cm4gdHJlZVdhbGtlckNhY2hlLmdldCh0cmVlVHlwZSkKCgpkZWYgY29uY2F0ZW5hdGVDaGFyYWN0ZXJUb2tlbnModG9rZW5zKToKICAgIHBlbmRpbmdDaGFyYWN0ZXJzID0gW10KICAgIGZvciB0b2tlbiBpbiB0b2tlbnM6CiAgICAgICAgdHlwZSA9IHRva2VuWyJ0eXBlIl0KICAgICAgICBpZiB0eXBlIGluICgiQ2hhcmFjdGVycyIsICJTcGFjZUNoYXJhY3RlcnMiKToKICAgICAgICAgICAgcGVuZGluZ0NoYXJhY3RlcnMuYXBwZW5kKHRva2VuWyJkYXRhIl0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgcGVuZGluZ0NoYXJhY3RlcnM6CiAgICAgICAgICAgICAgICB5aWVsZCB7InR5cGUiOiAiQ2hhcmFjdGVycyIsICJkYXRhIjogIiIuam9pbihwZW5kaW5nQ2hhcmFjdGVycyl9CiAgICAgICAgICAgICAgICBwZW5kaW5nQ2hhcmFjdGVycyA9IFtdCiAgICAgICAgICAgIHlpZWxkIHRva2VuCiAgICBpZiBwZW5kaW5nQ2hhcmFjdGVyczoKICAgICAgICB5aWVsZCB7InR5cGUiOiAiQ2hhcmFjdGVycyIsICJkYXRhIjogIiIuam9pbihwZW5kaW5nQ2hhcmFjdGVycyl9CgoKZGVmIHBwcmludCh3YWxrZXIpOgogICAgIiIiUHJldHR5IHByaW50ZXIgZm9yIHRyZWUgd2Fsa2VycyIiIgogICAgb3V0cHV0ID0gW10KICAgIGluZGVudCA9IDAKICAgIGZvciB0b2tlbiBpbiBjb25jYXRlbmF0ZUNoYXJhY3RlclRva2Vucyh3YWxrZXIpOgogICAgICAgIHR5cGUgPSB0b2tlblsidHlwZSJdCiAgICAgICAgaWYgdHlwZSBpbiAoIlN0YXJ0VGFnIiwgIkVtcHR5VGFnIik6CiAgICAgICAgICAgICMgdGFnIG5hbWUKICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWVzcGFjZSJdIGFuZCB0b2tlblsibmFtZXNwYWNlIl0gIT0gY29uc3RhbnRzLm5hbWVzcGFjZXNbImh0bWwiXToKICAgICAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lc3BhY2UiXSBpbiBjb25zdGFudHMucHJlZml4ZXM6CiAgICAgICAgICAgICAgICAgICAgbnMgPSBjb25zdGFudHMucHJlZml4ZXNbdG9rZW5bIm5hbWVzcGFjZSJdXQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBucyA9IHRva2VuWyJuYW1lc3BhY2UiXQogICAgICAgICAgICAgICAgbmFtZSA9ICIlcyAlcyIgJSAobnMsIHRva2VuWyJuYW1lIl0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIlczwlcz4iICUgKCIgIiAqIGluZGVudCwgbmFtZSkpCiAgICAgICAgICAgIGluZGVudCArPSAyCiAgICAgICAgICAgICMgYXR0cmlidXRlcyAoc29ydGVkIGZvciBjb25zaXN0ZW50IG9yZGVyaW5nKQogICAgICAgICAgICBhdHRycyA9IHRva2VuWyJkYXRhIl0KICAgICAgICAgICAgZm9yIChuYW1lc3BhY2UsIGxvY2FsbmFtZSksIHZhbHVlIGluIHNvcnRlZChhdHRycy5pdGVtcygpKToKICAgICAgICAgICAgICAgIGlmIG5hbWVzcGFjZToKICAgICAgICAgICAgICAgICAgICBpZiBuYW1lc3BhY2UgaW4gY29uc3RhbnRzLnByZWZpeGVzOgogICAgICAgICAgICAgICAgICAgICAgICBucyA9IGNvbnN0YW50cy5wcmVmaXhlc1tuYW1lc3BhY2VdCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbnMgPSBuYW1lc3BhY2UKICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiVzICVzIiAlIChucywgbG9jYWxuYW1lKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuYW1lID0gbG9jYWxuYW1lCiAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIlcyVzPVwiJXNcIiIgJSAoIiAiICogaW5kZW50LCBuYW1lLCB2YWx1ZSkpCiAgICAgICAgICAgICMgc2VsZi1jbG9zaW5nCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIkVtcHR5VGFnIjoKICAgICAgICAgICAgICAgIGluZGVudCAtPSAyCgogICAgICAgIGVsaWYgdHlwZSA9PSAiRW5kVGFnIjoKICAgICAgICAgICAgaW5kZW50IC09IDIKCiAgICAgICAgZWxpZiB0eXBlID09ICJDb21tZW50IjoKICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiJXM8IS0tICVzIC0tPiIgJSAoIiAiICogaW5kZW50LCB0b2tlblsiZGF0YSJdKSkKCiAgICAgICAgZWxpZiB0eXBlID09ICJEb2N0eXBlIjoKICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgIGlmIHRva2VuWyJwdWJsaWNJZCJdOgogICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiIiJXM8IURPQ1RZUEUgJXMgIiVzIiAiJXMiPiIiIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIiAiICogaW5kZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bInB1YmxpY0lkIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bInN5c3RlbUlkIl0gaWYgdG9rZW5bInN5c3RlbUlkIl0gZWxzZSAiIikpCiAgICAgICAgICAgICAgICBlbGlmIHRva2VuWyJzeXN0ZW1JZCJdOgogICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiIiJXM8IURPQ1RZUEUgJXMgIiIgIiVzIj4iIiIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCIgIiAqIGluZGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsibmFtZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJzeXN0ZW1JZCJdKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiJXM8IURPQ1RZUEUgJXM+IiAlICgiICIgKiBpbmRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsibmFtZSJdKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiVzPCFET0NUWVBFID4iICUgKCIgIiAqIGluZGVudCwpKQoKICAgICAgICBlbGlmIHR5cGUgPT0gIkNoYXJhY3RlcnMiOgogICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIlc1wiJXNcIiIgJSAoIiAiICogaW5kZW50LCB0b2tlblsiZGF0YSJdKSkKCiAgICAgICAgZWxpZiB0eXBlID09ICJTcGFjZUNoYXJhY3RlcnMiOgogICAgICAgICAgICBhc3NlcnQgRmFsc2UsICJjb25jYXRlbmF0ZUNoYXJhY3RlclRva2VucyBzaG91bGQgaGF2ZSBnb3QgcmlkIG9mIGFsbCBTcGFjZSB0b2tlbnMiCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlVua25vd24gdG9rZW4gdHlwZSwgJXMiICUgdHlwZSkKCiAgICByZXR1cm4gIlxuIi5qb2luKG91dHB1dCkKUEsDBBQAAAAAAAAAIQBNI5jASxMAAEsTAAA4AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2Jhc2UucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20geG1sLmRvbSBpbXBvcnQgTm9kZQpmcm9tIC4uY29uc3RhbnRzIGltcG9ydCBuYW1lc3BhY2VzLCB2b2lkRWxlbWVudHMsIHNwYWNlQ2hhcmFjdGVycwoKX19hbGxfXyA9IFsiRE9DVU1FTlQiLCAiRE9DVFlQRSIsICJURVhUIiwgIkVMRU1FTlQiLCAiQ09NTUVOVCIsICJFTlRJVFkiLCAiVU5LTk9XTiIsCiAgICAgICAgICAgIlRyZWVXYWxrZXIiLCAiTm9uUmVjdXJzaXZlVHJlZVdhbGtlciJdCgpET0NVTUVOVCA9IE5vZGUuRE9DVU1FTlRfTk9ERQpET0NUWVBFID0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUKVEVYVCA9IE5vZGUuVEVYVF9OT0RFCkVMRU1FTlQgPSBOb2RlLkVMRU1FTlRfTk9ERQpDT01NRU5UID0gTm9kZS5DT01NRU5UX05PREUKRU5USVRZID0gTm9kZS5FTlRJVFlfTk9ERQpVTktOT1dOID0gIjwjVU5LTk9XTiM+IgoKc3BhY2VDaGFyYWN0ZXJzID0gIiIuam9pbihzcGFjZUNoYXJhY3RlcnMpCgoKY2xhc3MgVHJlZVdhbGtlcihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyZWUpOgogICAgICAgIHNlbGYudHJlZSA9IHRyZWUKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBlcnJvcihzZWxmLCBtc2cpOgogICAgICAgIHJldHVybiB7InR5cGUiOiAiU2VyaWFsaXplRXJyb3IiLCAiZGF0YSI6IG1zZ30KCiAgICBkZWYgZW1wdHlUYWcoc2VsZiwgbmFtZXNwYWNlLCBuYW1lLCBhdHRycywgaGFzQ2hpbGRyZW49RmFsc2UpOgogICAgICAgIHlpZWxkIHsidHlwZSI6ICJFbXB0eVRhZyIsICJuYW1lIjogbmFtZSwKICAgICAgICAgICAgICAgIm5hbWVzcGFjZSI6IG5hbWVzcGFjZSwKICAgICAgICAgICAgICAgImRhdGEiOiBhdHRyc30KICAgICAgICBpZiBoYXNDaGlsZHJlbjoKICAgICAgICAgICAgeWllbGQgc2VsZi5lcnJvcigiVm9pZCBlbGVtZW50IGhhcyBjaGlsZHJlbiIpCgogICAgZGVmIHN0YXJ0VGFnKHNlbGYsIG5hbWVzcGFjZSwgbmFtZSwgYXR0cnMpOgogICAgICAgIHJldHVybiB7InR5cGUiOiAiU3RhcnRUYWciLAogICAgICAgICAgICAgICAgIm5hbWUiOiBuYW1lLAogICAgICAgICAgICAgICAgIm5hbWVzcGFjZSI6IG5hbWVzcGFjZSwKICAgICAgICAgICAgICAgICJkYXRhIjogYXR0cnN9CgogICAgZGVmIGVuZFRhZyhzZWxmLCBuYW1lc3BhY2UsIG5hbWUpOgogICAgICAgIHJldHVybiB7InR5cGUiOiAiRW5kVGFnIiwKICAgICAgICAgICAgICAgICJuYW1lIjogbmFtZSwKICAgICAgICAgICAgICAgICJuYW1lc3BhY2UiOiBuYW1lc3BhY2V9CgogICAgZGVmIHRleHQoc2VsZiwgZGF0YSk6CiAgICAgICAgZGF0YSA9IGRhdGEKICAgICAgICBtaWRkbGUgPSBkYXRhLmxzdHJpcChzcGFjZUNoYXJhY3RlcnMpCiAgICAgICAgbGVmdCA9IGRhdGFbOmxlbihkYXRhKSAtIGxlbihtaWRkbGUpXQogICAgICAgIGlmIGxlZnQ6CiAgICAgICAgICAgIHlpZWxkIHsidHlwZSI6ICJTcGFjZUNoYXJhY3RlcnMiLCAiZGF0YSI6IGxlZnR9CiAgICAgICAgZGF0YSA9IG1pZGRsZQogICAgICAgIG1pZGRsZSA9IGRhdGEucnN0cmlwKHNwYWNlQ2hhcmFjdGVycykKICAgICAgICByaWdodCA9IGRhdGFbbGVuKG1pZGRsZSk6XQogICAgICAgIGlmIG1pZGRsZToKICAgICAgICAgICAgeWllbGQgeyJ0eXBlIjogIkNoYXJhY3RlcnMiLCAiZGF0YSI6IG1pZGRsZX0KICAgICAgICBpZiByaWdodDoKICAgICAgICAgICAgeWllbGQgeyJ0eXBlIjogIlNwYWNlQ2hhcmFjdGVycyIsICJkYXRhIjogcmlnaHR9CgogICAgZGVmIGNvbW1lbnQoc2VsZiwgZGF0YSk6CiAgICAgICAgcmV0dXJuIHsidHlwZSI6ICJDb21tZW50IiwgImRhdGEiOiBkYXRhfQoKICAgIGRlZiBkb2N0eXBlKHNlbGYsIG5hbWUsIHB1YmxpY0lkPU5vbmUsIHN5c3RlbUlkPU5vbmUpOgogICAgICAgIHJldHVybiB7InR5cGUiOiAiRG9jdHlwZSIsCiAgICAgICAgICAgICAgICAibmFtZSI6IG5hbWUsCiAgICAgICAgICAgICAgICAicHVibGljSWQiOiBwdWJsaWNJZCwKICAgICAgICAgICAgICAgICJzeXN0ZW1JZCI6IHN5c3RlbUlkfQoKICAgIGRlZiBlbnRpdHkoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHsidHlwZSI6ICJFbnRpdHkiLCAibmFtZSI6IG5hbWV9CgogICAgZGVmIHVua25vd24oc2VsZiwgbm9kZVR5cGUpOgogICAgICAgIHJldHVybiBzZWxmLmVycm9yKCJVbmtub3duIG5vZGUgdHlwZTogIiArIG5vZGVUeXBlKQoKCmNsYXNzIE5vblJlY3Vyc2l2ZVRyZWVXYWxrZXIoVHJlZVdhbGtlcik6CiAgICBkZWYgZ2V0Tm9kZURldGFpbHMoc2VsZiwgbm9kZSk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBnZXRGaXJzdENoaWxkKHNlbGYsIG5vZGUpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgZ2V0TmV4dFNpYmxpbmcoc2VsZiwgbm9kZSk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBnZXRQYXJlbnROb2RlKHNlbGYsIG5vZGUpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgY3VycmVudE5vZGUgPSBzZWxmLnRyZWUKICAgICAgICB3aGlsZSBjdXJyZW50Tm9kZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgZGV0YWlscyA9IHNlbGYuZ2V0Tm9kZURldGFpbHMoY3VycmVudE5vZGUpCiAgICAgICAgICAgIHR5cGUsIGRldGFpbHMgPSBkZXRhaWxzWzBdLCBkZXRhaWxzWzE6XQogICAgICAgICAgICBoYXNDaGlsZHJlbiA9IEZhbHNlCgogICAgICAgICAgICBpZiB0eXBlID09IERPQ1RZUEU6CiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmRvY3R5cGUoKmRldGFpbHMpCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gVEVYVDoKICAgICAgICAgICAgICAgIGZvciB0b2tlbiBpbiBzZWxmLnRleHQoKmRldGFpbHMpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gRUxFTUVOVDoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSwgbmFtZSwgYXR0cmlidXRlcywgaGFzQ2hpbGRyZW4gPSBkZXRhaWxzCiAgICAgICAgICAgICAgICBpZiAobm90IG5hbWVzcGFjZSBvciBuYW1lc3BhY2UgPT0gbmFtZXNwYWNlc1siaHRtbCJdKSBhbmQgbmFtZSBpbiB2b2lkRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgZm9yIHRva2VuIGluIHNlbGYuZW1wdHlUYWcobmFtZXNwYWNlLCBuYW1lLCBhdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NoaWxkcmVuKToKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdG9rZW4KICAgICAgICAgICAgICAgICAgICBoYXNDaGlsZHJlbiA9IEZhbHNlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuc3RhcnRUYWcobmFtZXNwYWNlLCBuYW1lLCBhdHRyaWJ1dGVzKQoKICAgICAgICAgICAgZWxpZiB0eXBlID09IENPTU1FTlQ6CiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmNvbW1lbnQoZGV0YWlsc1swXSkKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSBFTlRJVFk6CiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVudGl0eShkZXRhaWxzWzBdKQoKICAgICAgICAgICAgZWxpZiB0eXBlID09IERPQ1VNRU5UOgogICAgICAgICAgICAgICAgaGFzQ2hpbGRyZW4gPSBUcnVlCgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgeWllbGQgc2VsZi51bmtub3duKGRldGFpbHNbMF0pCgogICAgICAgICAgICBpZiBoYXNDaGlsZHJlbjoKICAgICAgICAgICAgICAgIGZpcnN0Q2hpbGQgPSBzZWxmLmdldEZpcnN0Q2hpbGQoY3VycmVudE5vZGUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmaXJzdENoaWxkID0gTm9uZQoKICAgICAgICAgICAgaWYgZmlyc3RDaGlsZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gZmlyc3RDaGlsZAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgd2hpbGUgY3VycmVudE5vZGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgZGV0YWlscyA9IHNlbGYuZ2V0Tm9kZURldGFpbHMoY3VycmVudE5vZGUpCiAgICAgICAgICAgICAgICAgICAgdHlwZSwgZGV0YWlscyA9IGRldGFpbHNbMF0sIGRldGFpbHNbMTpdCiAgICAgICAgICAgICAgICAgICAgaWYgdHlwZSA9PSBFTEVNRU5UOgogICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UsIG5hbWUsIGF0dHJpYnV0ZXMsIGhhc0NoaWxkcmVuID0gZGV0YWlscwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlIGFuZCBuYW1lc3BhY2UgIT0gbmFtZXNwYWNlc1siaHRtbCJdKSBvciBuYW1lIG5vdCBpbiB2b2lkRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuZFRhZyhuYW1lc3BhY2UsIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlIGlzIGN1cnJlbnROb2RlOgogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IE5vbmUKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBuZXh0U2libGluZyA9IHNlbGYuZ2V0TmV4dFNpYmxpbmcoY3VycmVudE5vZGUpCiAgICAgICAgICAgICAgICAgICAgaWYgbmV4dFNpYmxpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gbmV4dFNpYmxpbmcKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHNlbGYuZ2V0UGFyZW50Tm9kZShjdXJyZW50Tm9kZSkKUEsDBBQAAAAAAAAAIQBlim+phQUAAIUFAAA3AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2RvbS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSB4bWwuZG9tIGltcG9ydCBOb2RlCgpmcm9tIC4gaW1wb3J0IGJhc2UKCgpjbGFzcyBUcmVlV2Fsa2VyKGJhc2UuTm9uUmVjdXJzaXZlVHJlZVdhbGtlcik6CiAgICBkZWYgZ2V0Tm9kZURldGFpbHMoc2VsZiwgbm9kZSk6CiAgICAgICAgaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERToKICAgICAgICAgICAgcmV0dXJuIGJhc2UuRE9DVFlQRSwgbm9kZS5uYW1lLCBub2RlLnB1YmxpY0lkLCBub2RlLnN5c3RlbUlkCgogICAgICAgIGVsaWYgbm9kZS5ub2RlVHlwZSBpbiAoTm9kZS5URVhUX05PREUsIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKToKICAgICAgICAgICAgcmV0dXJuIGJhc2UuVEVYVCwgbm9kZS5ub2RlVmFsdWUKCiAgICAgICAgZWxpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFOgogICAgICAgICAgICBhdHRycyA9IHt9CiAgICAgICAgICAgIGZvciBhdHRyIGluIGxpc3Qobm9kZS5hdHRyaWJ1dGVzLmtleXMoKSk6CiAgICAgICAgICAgICAgICBhdHRyID0gbm9kZS5nZXRBdHRyaWJ1dGVOb2RlKGF0dHIpCiAgICAgICAgICAgICAgICBpZiBhdHRyLm5hbWVzcGFjZVVSSToKICAgICAgICAgICAgICAgICAgICBhdHRyc1soYXR0ci5uYW1lc3BhY2VVUkksIGF0dHIubG9jYWxOYW1lKV0gPSBhdHRyLnZhbHVlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGF0dHJzWyhOb25lLCBhdHRyLm5hbWUpXSA9IGF0dHIudmFsdWUKICAgICAgICAgICAgcmV0dXJuIChiYXNlLkVMRU1FTlQsIG5vZGUubmFtZXNwYWNlVVJJLCBub2RlLm5vZGVOYW1lLAogICAgICAgICAgICAgICAgICAgIGF0dHJzLCBub2RlLmhhc0NoaWxkTm9kZXMoKSkKCiAgICAgICAgZWxpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuQ09NTUVOVF9OT0RFOgogICAgICAgICAgICByZXR1cm4gYmFzZS5DT01NRU5ULCBub2RlLm5vZGVWYWx1ZQoKICAgICAgICBlbGlmIG5vZGUubm9kZVR5cGUgaW4gKE5vZGUuRE9DVU1FTlRfTk9ERSwgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKToKICAgICAgICAgICAgcmV0dXJuIChiYXNlLkRPQ1VNRU5ULCkKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGJhc2UuVU5LTk9XTiwgbm9kZS5ub2RlVHlwZQoKICAgIGRlZiBnZXRGaXJzdENoaWxkKHNlbGYsIG5vZGUpOgogICAgICAgIHJldHVybiBub2RlLmZpcnN0Q2hpbGQKCiAgICBkZWYgZ2V0TmV4dFNpYmxpbmcoc2VsZiwgbm9kZSk6CiAgICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmcKCiAgICBkZWYgZ2V0UGFyZW50Tm9kZShzZWxmLCBub2RlKToKICAgICAgICByZXR1cm4gbm9kZS5wYXJlbnROb2RlClBLAwQUAAAAAAAAACEAIsEQMUwSAABMEgAAOQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9ldHJlZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKdHJ5OgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgdHJ5OgogICAgICAgIGZyb20gb3JkZXJlZGRpY3QgaW1wb3J0IE9yZGVyZWREaWN0CiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgT3JkZXJlZERpY3QgPSBkaWN0CgppbXBvcnQgcmUKCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCBzdHJpbmdfdHlwZXMKCmZyb20gLiBpbXBvcnQgYmFzZQpmcm9tIC4uX3V0aWxzIGltcG9ydCBtb2R1bGVGYWN0b3J5RmFjdG9yeQoKdGFnX3JlZ2V4cCA9IHJlLmNvbXBpbGUoInsoW159XSopfSguKikiKQoKCmRlZiBnZXRFVHJlZUJ1aWxkZXIoRWxlbWVudFRyZWVJbXBsZW1lbnRhdGlvbik6CiAgICBFbGVtZW50VHJlZSA9IEVsZW1lbnRUcmVlSW1wbGVtZW50YXRpb24KICAgIEVsZW1lbnRUcmVlQ29tbWVudFR5cGUgPSBFbGVtZW50VHJlZS5Db21tZW50KCJhc2QiKS50YWcKCiAgICBjbGFzcyBUcmVlV2Fsa2VyKGJhc2UuTm9uUmVjdXJzaXZlVHJlZVdhbGtlcik6ICAjIHB5bGludDpkaXNhYmxlPXVudXNlZC12YXJpYWJsZQogICAgICAgICIiIkdpdmVuIHRoZSBwYXJ0aWN1bGFyIEVsZW1lbnRUcmVlIHJlcHJlc2VudGF0aW9uLCB0aGlzIGltcGxlbWVudGF0aW9uLAogICAgICAgIHRvIGF2b2lkIHVzaW5nIHJlY3Vyc2lvbiwgcmV0dXJucyAibm9kZXMiIGFzIHR1cGxlcyB3aXRoIHRoZSBmb2xsb3dpbmcKICAgICAgICBjb250ZW50OgoKICAgICAgICAxLiBUaGUgY3VycmVudCBlbGVtZW50CgogICAgICAgIDIuIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgcGFyZW50CgogICAgICAgIDMuIEEgc3RhY2sgb2YgYW5jZXN0b3IgZWxlbWVudHMKCiAgICAgICAgNC4gQSBmbGFnICJ0ZXh0IiwgInRhaWwiIG9yIE5vbmUgdG8gaW5kaWNhdGUgaWYgdGhlIGN1cnJlbnQgbm9kZSBpcyBhCiAgICAgICAgICAgdGV4dCBub2RlOyBlaXRoZXIgdGhlIHRleHQgb3IgdGFpbCBvZiB0aGUgY3VycmVudCBlbGVtZW50ICgxKQogICAgICAgICIiIgogICAgICAgIGRlZiBnZXROb2RlRGV0YWlscyhzZWxmLCBub2RlKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCB0dXBsZSk6ICAjIEl0IG1pZ2h0IGJlIHRoZSByb290IEVsZW1lbnQKICAgICAgICAgICAgICAgIGVsdCwgXywgXywgZmxhZyA9IG5vZGUKICAgICAgICAgICAgICAgIGlmIGZsYWcgaW4gKCJ0ZXh0IiwgInRhaWwiKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5URVhULCBnZXRhdHRyKGVsdCwgZmxhZykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IGVsdAoKICAgICAgICAgICAgaWYgbm90KGhhc2F0dHIobm9kZSwgInRhZyIpKToKICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldHJvb3QoKQoKICAgICAgICAgICAgaWYgbm9kZS50YWcgaW4gKCJET0NVTUVOVF9ST09UIiwgIkRPQ1VNRU5UX0ZSQUdNRU5UIik6CiAgICAgICAgICAgICAgICByZXR1cm4gKGJhc2UuRE9DVU1FTlQsKQoKICAgICAgICAgICAgZWxpZiBub2RlLnRhZyA9PSAiPCFET0NUWVBFPiI6CiAgICAgICAgICAgICAgICByZXR1cm4gKGJhc2UuRE9DVFlQRSwgbm9kZS50ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICBub2RlLmdldCgicHVibGljSWQiKSwgbm9kZS5nZXQoInN5c3RlbUlkIikpCgogICAgICAgICAgICBlbGlmIG5vZGUudGFnID09IEVsZW1lbnRUcmVlQ29tbWVudFR5cGU6CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5DT01NRU5ULCBub2RlLnRleHQKCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShub2RlLnRhZywgc3RyaW5nX3R5cGVzKSwgdHlwZShub2RlLnRhZykKICAgICAgICAgICAgICAgICMgVGhpcyBpcyBhc3N1bWVkIHRvIGJlIGFuIG9yZGluYXJ5IGVsZW1lbnQKICAgICAgICAgICAgICAgIG1hdGNoID0gdGFnX3JlZ2V4cC5tYXRjaChub2RlLnRhZykKICAgICAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSwgdGFnID0gbWF0Y2guZ3JvdXBzKCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gTm9uZQogICAgICAgICAgICAgICAgICAgIHRhZyA9IG5vZGUudGFnCiAgICAgICAgICAgICAgICBhdHRycyA9IE9yZGVyZWREaWN0KCkKICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBsaXN0KG5vZGUuYXR0cmliLml0ZW1zKCkpOgogICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdGFnX3JlZ2V4cC5tYXRjaChuYW1lKQogICAgICAgICAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgICAgICAgICBhdHRyc1sobWF0Y2guZ3JvdXAoMSksIG1hdGNoLmdyb3VwKDIpKV0gPSB2YWx1ZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzWyhOb25lLCBuYW1lKV0gPSB2YWx1ZQogICAgICAgICAgICAgICAgcmV0dXJuIChiYXNlLkVMRU1FTlQsIG5hbWVzcGFjZSwgdGFnLAogICAgICAgICAgICAgICAgICAgICAgICBhdHRycywgbGVuKG5vZGUpIG9yIG5vZGUudGV4dCkKCiAgICAgICAgZGVmIGdldEZpcnN0Q2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgdHVwbGUpOgogICAgICAgICAgICAgICAgZWxlbWVudCwga2V5LCBwYXJlbnRzLCBmbGFnID0gbm9kZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZWxlbWVudCwga2V5LCBwYXJlbnRzLCBmbGFnID0gbm9kZSwgTm9uZSwgW10sIE5vbmUKCiAgICAgICAgICAgIGlmIGZsYWcgaW4gKCJ0ZXh0IiwgInRhaWwiKToKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LnRleHQ6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQsIGtleSwgcGFyZW50cywgInRleHQiCiAgICAgICAgICAgICAgICBlbGlmIGxlbihlbGVtZW50KToKICAgICAgICAgICAgICAgICAgICBwYXJlbnRzLmFwcGVuZChlbGVtZW50KQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50WzBdLCAwLCBwYXJlbnRzLCBOb25lCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIGRlZiBnZXROZXh0U2libGluZyhzZWxmLCBub2RlKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCB0dXBsZSk6CiAgICAgICAgICAgICAgICBlbGVtZW50LCBrZXksIHBhcmVudHMsIGZsYWcgPSBub2RlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAgICAgaWYgZmxhZyA9PSAidGV4dCI6CiAgICAgICAgICAgICAgICBpZiBsZW4oZWxlbWVudCk6CiAgICAgICAgICAgICAgICAgICAgcGFyZW50cy5hcHBlbmQoZWxlbWVudCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFswXSwgMCwgcGFyZW50cywgTm9uZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgZWxlbWVudC50YWlsIGFuZCBmbGFnICE9ICJ0YWlsIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudCwga2V5LCBwYXJlbnRzLCAidGFpbCIKICAgICAgICAgICAgICAgIGVsaWYga2V5IDwgbGVuKHBhcmVudHNbLTFdKSAtIDE6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudHNbLTFdW2tleSArIDFdLCBrZXkgKyAxLCBwYXJlbnRzLCBOb25lCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIGRlZiBnZXRQYXJlbnROb2RlKHNlbGYsIG5vZGUpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHR1cGxlKToKICAgICAgICAgICAgICAgIGVsZW1lbnQsIGtleSwgcGFyZW50cywgZmxhZyA9IG5vZGUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICAgICBpZiBmbGFnID09ICJ0ZXh0IjoKICAgICAgICAgICAgICAgIGlmIG5vdCBwYXJlbnRzOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50CiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LCBrZXksIHBhcmVudHMsIE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudHMucG9wKCkKICAgICAgICAgICAgICAgIGlmIG5vdCBwYXJlbnRzOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGxpc3QocGFyZW50c1stMV0pLmNvdW50KHBhcmVudCkgPT0gMQogICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQsIGxpc3QocGFyZW50c1stMV0pLmluZGV4KHBhcmVudCksIHBhcmVudHMsIE5vbmUKCiAgICByZXR1cm4gbG9jYWxzKCkKCmdldEVUcmVlTW9kdWxlID0gbW9kdWxlRmFjdG9yeUZhY3RvcnkoZ2V0RVRyZWVCdWlsZGVyKQpQSwMEFAAAAAAAAAAhAJYNnEelGAAApRgAAD4AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvZXRyZWVfbHhtbC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgdGV4dF90eXBlCgpmcm9tIGx4bWwgaW1wb3J0IGV0cmVlCmZyb20gLi50cmVlYnVpbGRlcnMuZXRyZWUgaW1wb3J0IHRhZ19yZWdleHAKCmZyb20gLiBpbXBvcnQgYmFzZQoKZnJvbSAuLiBpbXBvcnQgX2loYXRleG1sCgoKZGVmIGVuc3VyZV9zdHIocyk6CiAgICBpZiBzIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGVsaWYgaXNpbnN0YW5jZShzLCB0ZXh0X3R5cGUpOgogICAgICAgIHJldHVybiBzCiAgICBlbHNlOgogICAgICAgIHJldHVybiBzLmRlY29kZSgiYXNjaWkiLCAic3RyaWN0IikKCgpjbGFzcyBSb290KG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZXQpOgogICAgICAgIHNlbGYuZWxlbWVudHRyZWUgPSBldAogICAgICAgIHNlbGYuY2hpbGRyZW4gPSBbXQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIGV0LmRvY2luZm8uaW50ZXJuYWxEVEQ6CiAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuLmFwcGVuZChEb2N0eXBlKHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZV9zdHIoZXQuZG9jaW5mby5yb290X25hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnN1cmVfc3RyKGV0LmRvY2luZm8ucHVibGljX2lkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlX3N0cihldC5kb2NpbmZvLnN5c3RlbV91cmwpKSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBub2RlID0gZXQuZ2V0cm9vdCgpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBub2RlID0gZXQKCiAgICAgICAgd2hpbGUgbm9kZS5nZXRwcmV2aW91cygpIGlzIG5vdCBOb25lOgogICAgICAgICAgICBub2RlID0gbm9kZS5nZXRwcmV2aW91cygpCiAgICAgICAgd2hpbGUgbm9kZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5jaGlsZHJlbi5hcHBlbmQobm9kZSkKICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0bmV4dCgpCgogICAgICAgIHNlbGYudGV4dCA9IE5vbmUKICAgICAgICBzZWxmLnRhaWwgPSBOb25lCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIHNlbGYuY2hpbGRyZW5ba2V5XQoKICAgIGRlZiBnZXRuZXh0KHNlbGYpOgogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgcmV0dXJuIDEKCgpjbGFzcyBEb2N0eXBlKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdF9ub2RlLCBuYW1lLCBwdWJsaWNfaWQsIHN5c3RlbV9pZCk6CiAgICAgICAgc2VsZi5yb290X25vZGUgPSByb290X25vZGUKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5wdWJsaWNfaWQgPSBwdWJsaWNfaWQKICAgICAgICBzZWxmLnN5c3RlbV9pZCA9IHN5c3RlbV9pZAoKICAgICAgICBzZWxmLnRleHQgPSBOb25lCiAgICAgICAgc2VsZi50YWlsID0gTm9uZQoKICAgIGRlZiBnZXRuZXh0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnJvb3Rfbm9kZS5jaGlsZHJlblsxXQoKCmNsYXNzIEZyYWdtZW50Um9vdChSb290KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjaGlsZHJlbik6CiAgICAgICAgc2VsZi5jaGlsZHJlbiA9IFtGcmFnbWVudFdyYXBwZXIoc2VsZiwgY2hpbGQpIGZvciBjaGlsZCBpbiBjaGlsZHJlbl0KICAgICAgICBzZWxmLnRleHQgPSBzZWxmLnRhaWwgPSBOb25lCgogICAgZGVmIGdldG5leHQoc2VsZik6CiAgICAgICAgcmV0dXJuIE5vbmUKCgpjbGFzcyBGcmFnbWVudFdyYXBwZXIob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmcmFnbWVudF9yb290LCBvYmopOgogICAgICAgIHNlbGYucm9vdF9ub2RlID0gZnJhZ21lbnRfcm9vdAogICAgICAgIHNlbGYub2JqID0gb2JqCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLm9iaiwgJ3RleHQnKToKICAgICAgICAgICAgc2VsZi50ZXh0ID0gZW5zdXJlX3N0cihzZWxmLm9iai50ZXh0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudGV4dCA9IE5vbmUKICAgICAgICBpZiBoYXNhdHRyKHNlbGYub2JqLCAndGFpbCcpOgogICAgICAgICAgICBzZWxmLnRhaWwgPSBlbnN1cmVfc3RyKHNlbGYub2JqLnRhaWwpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50YWlsID0gTm9uZQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLm9iaiwgbmFtZSkKCiAgICBkZWYgZ2V0bmV4dChzZWxmKToKICAgICAgICBzaWJsaW5ncyA9IHNlbGYucm9vdF9ub2RlLmNoaWxkcmVuCiAgICAgICAgaWR4ID0gc2libGluZ3MuaW5kZXgoc2VsZikKICAgICAgICBpZiBpZHggPCBsZW4oc2libGluZ3MpIC0gMToKICAgICAgICAgICAgcmV0dXJuIHNpYmxpbmdzW2lkeCArIDFdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4gc2VsZi5vYmpba2V5XQoKICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToKICAgICAgICByZXR1cm4gYm9vbChzZWxmLm9iaikKCiAgICBkZWYgZ2V0cGFyZW50KHNlbGYpOgogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmLm9iaikKCiAgICBkZWYgX191bmljb2RlX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmLm9iaikKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICByZXR1cm4gbGVuKHNlbGYub2JqKQoKCmNsYXNzIFRyZWVXYWxrZXIoYmFzZS5Ob25SZWN1cnNpdmVUcmVlV2Fsa2VyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmVlKToKICAgICAgICAjIHB5bGludDpkaXNhYmxlPXJlZGVmaW5lZC12YXJpYWJsZS10eXBlCiAgICAgICAgaWYgaXNpbnN0YW5jZSh0cmVlLCBsaXN0KToKICAgICAgICAgICAgc2VsZi5mcmFnbWVudENoaWxkcmVuID0gc2V0KHRyZWUpCiAgICAgICAgICAgIHRyZWUgPSBGcmFnbWVudFJvb3QodHJlZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmZyYWdtZW50Q2hpbGRyZW4gPSBzZXQoKQogICAgICAgICAgICB0cmVlID0gUm9vdCh0cmVlKQogICAgICAgIGJhc2UuTm9uUmVjdXJzaXZlVHJlZVdhbGtlci5fX2luaXRfXyhzZWxmLCB0cmVlKQogICAgICAgIHNlbGYuZmlsdGVyID0gX2loYXRleG1sLkluZm9zZXRGaWx0ZXIoKQoKICAgIGRlZiBnZXROb2RlRGV0YWlscyhzZWxmLCBub2RlKToKICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHR1cGxlKTogICMgVGV4dCBub2RlCiAgICAgICAgICAgIG5vZGUsIGtleSA9IG5vZGUKICAgICAgICAgICAgYXNzZXJ0IGtleSBpbiAoInRleHQiLCAidGFpbCIpLCAiVGV4dCBub2RlcyBhcmUgdGV4dCBvciB0YWlsLCBmb3VuZCAlcyIgJSBrZXkKICAgICAgICAgICAgcmV0dXJuIGJhc2UuVEVYVCwgZW5zdXJlX3N0cihnZXRhdHRyKG5vZGUsIGtleSkpCgogICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBSb290KToKICAgICAgICAgICAgcmV0dXJuIChiYXNlLkRPQ1VNRU5ULCkKCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIERvY3R5cGUpOgogICAgICAgICAgICByZXR1cm4gYmFzZS5ET0NUWVBFLCBub2RlLm5hbWUsIG5vZGUucHVibGljX2lkLCBub2RlLnN5c3RlbV9pZAoKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgRnJhZ21lbnRXcmFwcGVyKSBhbmQgbm90IGhhc2F0dHIobm9kZSwgInRhZyIpOgogICAgICAgICAgICByZXR1cm4gYmFzZS5URVhULCBlbnN1cmVfc3RyKG5vZGUub2JqKQoKICAgICAgICBlbGlmIG5vZGUudGFnID09IGV0cmVlLkNvbW1lbnQ6CiAgICAgICAgICAgIHJldHVybiBiYXNlLkNPTU1FTlQsIGVuc3VyZV9zdHIobm9kZS50ZXh0KQoKICAgICAgICBlbGlmIG5vZGUudGFnID09IGV0cmVlLkVudGl0eToKICAgICAgICAgICAgcmV0dXJuIGJhc2UuRU5USVRZLCBlbnN1cmVfc3RyKG5vZGUudGV4dClbMTotMV0gICMgc3RyaXAgJjsKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBUaGlzIGlzIGFzc3VtZWQgdG8gYmUgYW4gb3JkaW5hcnkgZWxlbWVudAogICAgICAgICAgICBtYXRjaCA9IHRhZ19yZWdleHAubWF0Y2goZW5zdXJlX3N0cihub2RlLnRhZykpCiAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgbmFtZXNwYWNlLCB0YWcgPSBtYXRjaC5ncm91cHMoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gTm9uZQogICAgICAgICAgICAgICAgdGFnID0gZW5zdXJlX3N0cihub2RlLnRhZykKICAgICAgICAgICAgYXR0cnMgPSB7fQogICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gbGlzdChub2RlLmF0dHJpYi5pdGVtcygpKToKICAgICAgICAgICAgICAgIG5hbWUgPSBlbnN1cmVfc3RyKG5hbWUpCiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVuc3VyZV9zdHIodmFsdWUpCiAgICAgICAgICAgICAgICBtYXRjaCA9IHRhZ19yZWdleHAubWF0Y2gobmFtZSkKICAgICAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgICAgIGF0dHJzWyhtYXRjaC5ncm91cCgxKSwgbWF0Y2guZ3JvdXAoMikpXSA9IHZhbHVlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGF0dHJzWyhOb25lLCBuYW1lKV0gPSB2YWx1ZQogICAgICAgICAgICByZXR1cm4gKGJhc2UuRUxFTUVOVCwgbmFtZXNwYWNlLCBzZWxmLmZpbHRlci5mcm9tWG1sTmFtZSh0YWcpLAogICAgICAgICAgICAgICAgICAgIGF0dHJzLCBsZW4obm9kZSkgPiAwIG9yIG5vZGUudGV4dCkKCiAgICBkZWYgZ2V0Rmlyc3RDaGlsZChzZWxmLCBub2RlKToKICAgICAgICBhc3NlcnQgbm90IGlzaW5zdGFuY2Uobm9kZSwgdHVwbGUpLCAiVGV4dCBub2RlcyBoYXZlIG5vIGNoaWxkcmVuIgoKICAgICAgICBhc3NlcnQgbGVuKG5vZGUpIG9yIG5vZGUudGV4dCwgIk5vZGUgaGFzIG5vIGNoaWxkcmVuIgogICAgICAgIGlmIG5vZGUudGV4dDoKICAgICAgICAgICAgcmV0dXJuIChub2RlLCAidGV4dCIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIG5vZGVbMF0KCiAgICBkZWYgZ2V0TmV4dFNpYmxpbmcoc2VsZiwgbm9kZSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCB0dXBsZSk6ICAjIFRleHQgbm9kZQogICAgICAgICAgICBub2RlLCBrZXkgPSBub2RlCiAgICAgICAgICAgIGFzc2VydCBrZXkgaW4gKCJ0ZXh0IiwgInRhaWwiKSwgIlRleHQgbm9kZXMgYXJlIHRleHQgb3IgdGFpbCwgZm91bmQgJXMiICUga2V5CiAgICAgICAgICAgIGlmIGtleSA9PSAidGV4dCI6CiAgICAgICAgICAgICAgICAjIFhYWDogd2UgY2Fubm90IHVzZSBhICJib29sKG5vZGUpIGFuZCBub2RlWzBdIG9yIE5vbmUiIGNvbnN0cnVjdCBoZXJlCiAgICAgICAgICAgICAgICAjIGJlY2F1c2Ugbm9kZVswXSBtaWdodCBldmFsdWF0ZSB0byBGYWxzZSBpZiBpdCBoYXMgbm8gY2hpbGQgZWxlbWVudAogICAgICAgICAgICAgICAgaWYgbGVuKG5vZGUpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlWzBdCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIGVsc2U6ICAjIHRhaWwKICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmdldG5leHQoKQoKICAgICAgICByZXR1cm4gKG5vZGUsICJ0YWlsIikgaWYgbm9kZS50YWlsIGVsc2Ugbm9kZS5nZXRuZXh0KCkKCiAgICBkZWYgZ2V0UGFyZW50Tm9kZShzZWxmLCBub2RlKToKICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHR1cGxlKTogICMgVGV4dCBub2RlCiAgICAgICAgICAgIG5vZGUsIGtleSA9IG5vZGUKICAgICAgICAgICAgYXNzZXJ0IGtleSBpbiAoInRleHQiLCAidGFpbCIpLCAiVGV4dCBub2RlcyBhcmUgdGV4dCBvciB0YWlsLCBmb3VuZCAlcyIgJSBrZXkKICAgICAgICAgICAgaWYga2V5ID09ICJ0ZXh0IjoKICAgICAgICAgICAgICAgIHJldHVybiBub2RlCiAgICAgICAgICAgICMgZWxzZTogZmFsbGJhY2sgdG8gIm5vcm1hbCIgcHJvY2Vzc2luZwogICAgICAgIGVsaWYgbm9kZSBpbiBzZWxmLmZyYWdtZW50Q2hpbGRyZW46CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIHJldHVybiBub2RlLmdldHBhcmVudCgpClBLAwQUAAAAAAAAACEAE19tEAUJAAAFCQAAOgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9nZW5zaGkucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gZ2Vuc2hpLmNvcmUgaW1wb3J0IFFOYW1lCmZyb20gZ2Vuc2hpLmNvcmUgaW1wb3J0IFNUQVJULCBFTkQsIFhNTF9OQU1FU1BBQ0UsIERPQ1RZUEUsIFRFWFQKZnJvbSBnZW5zaGkuY29yZSBpbXBvcnQgU1RBUlRfTlMsIEVORF9OUywgU1RBUlRfQ0RBVEEsIEVORF9DREFUQSwgUEksIENPTU1FTlQKCmZyb20gLiBpbXBvcnQgYmFzZQoKZnJvbSAuLmNvbnN0YW50cyBpbXBvcnQgdm9pZEVsZW1lbnRzLCBuYW1lc3BhY2VzCgoKY2xhc3MgVHJlZVdhbGtlcihiYXNlLlRyZWVXYWxrZXIpOgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICMgQnVmZmVyIHRoZSBldmVudHMgc28gd2UgY2FuIHBhc3MgaW4gdGhlIGZvbGxvd2luZyBvbmUKICAgICAgICBwcmV2aW91cyA9IE5vbmUKICAgICAgICBmb3IgZXZlbnQgaW4gc2VsZi50cmVlOgogICAgICAgICAgICBpZiBwcmV2aW91cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGZvciB0b2tlbiBpbiBzZWxmLnRva2VucyhwcmV2aW91cywgZXZlbnQpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuCiAgICAgICAgICAgIHByZXZpb3VzID0gZXZlbnQKCiAgICAgICAgIyBEb24ndCBmb3JnZXQgdGhlIGZpbmFsIGV2ZW50IQogICAgICAgIGlmIHByZXZpb3VzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmb3IgdG9rZW4gaW4gc2VsZi50b2tlbnMocHJldmlvdXMsIE5vbmUpOgogICAgICAgICAgICAgICAgeWllbGQgdG9rZW4KCiAgICBkZWYgdG9rZW5zKHNlbGYsIGV2ZW50LCBuZXh0KToKICAgICAgICBraW5kLCBkYXRhLCBfID0gZXZlbnQKICAgICAgICBpZiBraW5kID09IFNUQVJUOgogICAgICAgICAgICB0YWcsIGF0dHJpYnMgPSBkYXRhCiAgICAgICAgICAgIG5hbWUgPSB0YWcubG9jYWxuYW1lCiAgICAgICAgICAgIG5hbWVzcGFjZSA9IHRhZy5uYW1lc3BhY2UKICAgICAgICAgICAgY29udmVydGVkX2F0dHJpYnMgPSB7fQogICAgICAgICAgICBmb3IgaywgdiBpbiBhdHRyaWJzOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrLCBRTmFtZSk6CiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkX2F0dHJpYnNbKGsubmFtZXNwYWNlLCBrLmxvY2FsbmFtZSldID0gdgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRfYXR0cmlic1soTm9uZSwgayldID0gdgoKICAgICAgICAgICAgaWYgbmFtZXNwYWNlID09IG5hbWVzcGFjZXNbImh0bWwiXSBhbmQgbmFtZSBpbiB2b2lkRWxlbWVudHM6CiAgICAgICAgICAgICAgICBmb3IgdG9rZW4gaW4gc2VsZi5lbXB0eVRhZyhuYW1lc3BhY2UsIG5hbWUsIGNvbnZlcnRlZF9hdHRyaWJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IG5leHQgb3IgbmV4dFswXSAhPSBFTkQgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRbMV0gIT0gdGFnKToKICAgICAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgeWllbGQgc2VsZi5zdGFydFRhZyhuYW1lc3BhY2UsIG5hbWUsIGNvbnZlcnRlZF9hdHRyaWJzKQoKICAgICAgICBlbGlmIGtpbmQgPT0gRU5EOgogICAgICAgICAgICBuYW1lID0gZGF0YS5sb2NhbG5hbWUKICAgICAgICAgICAgbmFtZXNwYWNlID0gZGF0YS5uYW1lc3BhY2UKICAgICAgICAgICAgaWYgbmFtZXNwYWNlICE9IG5hbWVzcGFjZXNbImh0bWwiXSBvciBuYW1lIG5vdCBpbiB2b2lkRWxlbWVudHM6CiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuZFRhZyhuYW1lc3BhY2UsIG5hbWUpCgogICAgICAgIGVsaWYga2luZCA9PSBDT01NRU5UOgogICAgICAgICAgICB5aWVsZCBzZWxmLmNvbW1lbnQoZGF0YSkKCiAgICAgICAgZWxpZiBraW5kID09IFRFWFQ6CiAgICAgICAgICAgIGZvciB0b2tlbiBpbiBzZWxmLnRleHQoZGF0YSk6CiAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbgoKICAgICAgICBlbGlmIGtpbmQgPT0gRE9DVFlQRToKICAgICAgICAgICAgeWllbGQgc2VsZi5kb2N0eXBlKCpkYXRhKQoKICAgICAgICBlbGlmIGtpbmQgaW4gKFhNTF9OQU1FU1BBQ0UsIERPQ1RZUEUsIFNUQVJUX05TLCBFTkRfTlMsCiAgICAgICAgICAgICAgICAgICAgICBTVEFSVF9DREFUQSwgRU5EX0NEQVRBLCBQSSk6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgeWllbGQgc2VsZi51bmtub3duKGtpbmQpClBLAwQUAAAAAAAAACEAAEdcmzoAAAA6AAAALAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL19faW5pdF9fLnB5ZnJvbSAucGFja2FnZV9kYXRhIGltcG9ydCBfX3ZlcnNpb25fXwpmcm9tIC5jb3JlIGltcG9ydCAqClBLAwQUAAAAAAAAACEA80jU6eMMAADjDAAAKQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL2NvZGVjLnB5ZnJvbSAuY29yZSBpbXBvcnQgZW5jb2RlLCBkZWNvZGUsIGFsYWJlbCwgdWxhYmVsLCBJRE5BRXJyb3IKaW1wb3J0IGNvZGVjcwppbXBvcnQgcmUKCl91bmljb2RlX2RvdHNfcmUgPSByZS5jb21waWxlKHUnW1x1MDAyZVx1MzAwMlx1ZmYwZVx1ZmY2MV0nKQoKY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKCiAgICBkZWYgZW5jb2RlKHNlbGYsIGRhdGEsIGVycm9ycz0nc3RyaWN0Jyk6CgogICAgICAgIGlmIGVycm9ycyAhPSAnc3RyaWN0JzoKICAgICAgICAgICAgcmFpc2UgSUROQUVycm9yKCJVbnN1cHBvcnRlZCBlcnJvciBoYW5kbGluZyBcInswfVwiIi5mb3JtYXQoZXJyb3JzKSkKCiAgICAgICAgaWYgbm90IGRhdGE6CiAgICAgICAgICAgIHJldHVybiAiIiwgMAoKICAgICAgICByZXR1cm4gZW5jb2RlKGRhdGEpLCBsZW4oZGF0YSkKCiAgICBkZWYgZGVjb2RlKHNlbGYsIGRhdGEsIGVycm9ycz0nc3RyaWN0Jyk6CgogICAgICAgIGlmIGVycm9ycyAhPSAnc3RyaWN0JzoKICAgICAgICAgICAgcmFpc2UgSUROQUVycm9yKCJVbnN1cHBvcnRlZCBlcnJvciBoYW5kbGluZyBcInswfVwiIi5mb3JtYXQoZXJyb3JzKSkKCiAgICAgICAgaWYgbm90IGRhdGE6CiAgICAgICAgICAgIHJldHVybiB1IiIsIDAKCiAgICAgICAgcmV0dXJuIGRlY29kZShkYXRhKSwgbGVuKGRhdGEpCgpjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxFbmNvZGVyKToKICAgIGRlZiBfYnVmZmVyX2VuY29kZShzZWxmLCBkYXRhLCBlcnJvcnMsIGZpbmFsKToKICAgICAgICBpZiBlcnJvcnMgIT0gJ3N0cmljdCc6CiAgICAgICAgICAgIHJhaXNlIElETkFFcnJvcigiVW5zdXBwb3J0ZWQgZXJyb3IgaGFuZGxpbmcgXCJ7MH1cIiIuZm9ybWF0KGVycm9ycykpCgogICAgICAgIGlmIG5vdCBkYXRhOgogICAgICAgICAgICByZXR1cm4gKCIiLCAwKQoKICAgICAgICBsYWJlbHMgPSBfdW5pY29kZV9kb3RzX3JlLnNwbGl0KGRhdGEpCiAgICAgICAgdHJhaWxpbmdfZG90ID0gdScnCiAgICAgICAgaWYgbGFiZWxzOgogICAgICAgICAgICBpZiBub3QgbGFiZWxzWy0xXToKICAgICAgICAgICAgICAgIHRyYWlsaW5nX2RvdCA9ICcuJwogICAgICAgICAgICAgICAgZGVsIGxhYmVsc1stMV0KICAgICAgICAgICAgZWxpZiBub3QgZmluYWw6CiAgICAgICAgICAgICAgICAjIEtlZXAgcG90ZW50aWFsbHkgdW5maW5pc2hlZCBsYWJlbCB1bnRpbCB0aGUgbmV4dCBjYWxsCiAgICAgICAgICAgICAgICBkZWwgbGFiZWxzWy0xXQogICAgICAgICAgICAgICAgaWYgbGFiZWxzOgogICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nX2RvdCA9ICcuJwoKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgIHNpemUgPSAwCiAgICAgICAgZm9yIGxhYmVsIGluIGxhYmVsczoKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChhbGFiZWwobGFiZWwpKQogICAgICAgICAgICBpZiBzaXplOgogICAgICAgICAgICAgICAgc2l6ZSArPSAxCiAgICAgICAgICAgIHNpemUgKz0gbGVuKGxhYmVsKQoKICAgICAgICAjIEpvaW4gd2l0aCBVKzAwMkUKICAgICAgICByZXN1bHQgPSAiLiIuam9pbihyZXN1bHQpICsgdHJhaWxpbmdfZG90CiAgICAgICAgc2l6ZSArPSBsZW4odHJhaWxpbmdfZG90KQogICAgICAgIHJldHVybiAocmVzdWx0LCBzaXplKQoKY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5CdWZmZXJlZEluY3JlbWVudGFsRGVjb2Rlcik6CiAgICBkZWYgX2J1ZmZlcl9kZWNvZGUoc2VsZiwgZGF0YSwgZXJyb3JzLCBmaW5hbCk6CiAgICAgICAgaWYgZXJyb3JzICE9ICdzdHJpY3QnOgogICAgICAgICAgICByYWlzZSBJRE5BRXJyb3IoIlVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nIFwiezB9XCIiLmZvcm1hdChlcnJvcnMpKQoKICAgICAgICBpZiBub3QgZGF0YToKICAgICAgICAgICAgcmV0dXJuICh1IiIsIDApCgogICAgICAgICMgSUROQSBhbGxvd3MgZGVjb2RpbmcgdG8gb3BlcmF0ZSBvbiBVbmljb2RlIHN0cmluZ3MsIHRvby4KICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIHVuaWNvZGUpOgogICAgICAgICAgICBsYWJlbHMgPSBfdW5pY29kZV9kb3RzX3JlLnNwbGl0KGRhdGEpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBNdXN0IGJlIEFTQ0lJIHN0cmluZwogICAgICAgICAgICBkYXRhID0gc3RyKGRhdGEpCiAgICAgICAgICAgIHVuaWNvZGUoZGF0YSwgImFzY2lpIikKICAgICAgICAgICAgbGFiZWxzID0gZGF0YS5zcGxpdCgiLiIpCgogICAgICAgIHRyYWlsaW5nX2RvdCA9IHUnJwogICAgICAgIGlmIGxhYmVsczoKICAgICAgICAgICAgaWYgbm90IGxhYmVsc1stMV06CiAgICAgICAgICAgICAgICB0cmFpbGluZ19kb3QgPSB1Jy4nCiAgICAgICAgICAgICAgICBkZWwgbGFiZWxzWy0xXQogICAgICAgICAgICBlbGlmIG5vdCBmaW5hbDoKICAgICAgICAgICAgICAgICMgS2VlcCBwb3RlbnRpYWxseSB1bmZpbmlzaGVkIGxhYmVsIHVudGlsIHRoZSBuZXh0IGNhbGwKICAgICAgICAgICAgICAgIGRlbCBsYWJlbHNbLTFdCiAgICAgICAgICAgICAgICBpZiBsYWJlbHM6CiAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdfZG90ID0gdScuJwoKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgIHNpemUgPSAwCiAgICAgICAgZm9yIGxhYmVsIGluIGxhYmVsczoKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh1bGFiZWwobGFiZWwpKQogICAgICAgICAgICBpZiBzaXplOgogICAgICAgICAgICAgICAgc2l6ZSArPSAxCiAgICAgICAgICAgIHNpemUgKz0gbGVuKGxhYmVsKQoKICAgICAgICByZXN1bHQgPSB1Ii4iLmpvaW4ocmVzdWx0KSArIHRyYWlsaW5nX2RvdAogICAgICAgIHNpemUgKz0gbGVuKHRyYWlsaW5nX2RvdCkKICAgICAgICByZXR1cm4gKHJlc3VsdCwgc2l6ZSkKCgpjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgogICAgcGFzcwoKY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKICAgIHBhc3MKCmRlZiBnZXRyZWdlbnRyeSgpOgogICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCiAgICAgICAgbmFtZT0naWRuYScsCiAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAogICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAogICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCiAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAogICAgKQpQSwMEFAAAAAAAAAAhAHyBlnDoAAAA6AAAACoAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9jb21wYXQucHlmcm9tIC5jb3JlIGltcG9ydCAqCmZyb20gLmNvZGVjIGltcG9ydCAqCgpkZWYgVG9BU0NJSShsYWJlbCk6CiAgICByZXR1cm4gZW5jb2RlKGxhYmVsKQoKZGVmIFRvVW5pY29kZShsYWJlbCk6CiAgICByZXR1cm4gZGVjb2RlKGxhYmVsKQoKZGVmIG5hbWVwcmVwKHMpOgogICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigiSUROQSAyMDA4IGRvZXMgbm90IHV0aWxpc2UgbmFtZXByZXAgcHJvdG9jb2wiKQoKUEsDBBQAAAAAAAAAIQAJLvpxfiwAAH4sAAAoAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvY29yZS5weWZyb20gLiBpbXBvcnQgaWRuYWRhdGEKaW1wb3J0IGJpc2VjdAppbXBvcnQgdW5pY29kZWRhdGEKaW1wb3J0IHJlCmltcG9ydCBzeXMKZnJvbSAuaW50cmFuZ2VzIGltcG9ydCBpbnRyYW5nZXNfY29udGFpbgoKX3ZpcmFtYV9jb21iaW5pbmdfY2xhc3MgPSA5Cl9hbGFiZWxfcHJlZml4ID0gYid4bi0tJwpfdW5pY29kZV9kb3RzX3JlID0gcmUuY29tcGlsZSh1J1tcdTAwMmVcdTMwMDJcdWZmMGVcdWZmNjFdJykKCmlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMzoKICAgIHVuaWNvZGUgPSBzdHIKICAgIHVuaWNociA9IGNocgoKY2xhc3MgSUROQUVycm9yKFVuaWNvZGVFcnJvcik6CiAgICAiIiIgQmFzZSBleGNlcHRpb24gZm9yIGFsbCBJRE5BLWVuY29kaW5nIHJlbGF0ZWQgcHJvYmxlbXMgIiIiCiAgICBwYXNzCgoKY2xhc3MgSUROQUJpZGlFcnJvcihJRE5BRXJyb3IpOgogICAgIiIiIEV4Y2VwdGlvbiB3aGVuIGJpZGlyZWN0aW9uYWwgcmVxdWlyZW1lbnRzIGFyZSBub3Qgc2F0aXNmaWVkICIiIgogICAgcGFzcwoKCmNsYXNzIEludmFsaWRDb2RlcG9pbnQoSUROQUVycm9yKToKICAgICIiIiBFeGNlcHRpb24gd2hlbiBhIGRpc2FsbG93ZWQgb3IgdW5hbGxvY2F0ZWQgY29kZXBvaW50IGlzIHVzZWQgIiIiCiAgICBwYXNzCgoKY2xhc3MgSW52YWxpZENvZGVwb2ludENvbnRleHQoSUROQUVycm9yKToKICAgICIiIiBFeGNlcHRpb24gd2hlbiB0aGUgY29kZXBvaW50IGlzIG5vdCB2YWxpZCBpbiB0aGUgY29udGV4dCBpdCBpcyB1c2VkICIiIgogICAgcGFzcwoKCmRlZiBfY29tYmluaW5nX2NsYXNzKGNwKToKICAgIHJldHVybiB1bmljb2RlZGF0YS5jb21iaW5pbmcodW5pY2hyKGNwKSkKCmRlZiBfaXNfc2NyaXB0KGNwLCBzY3JpcHQpOgogICAgcmV0dXJuIGludHJhbmdlc19jb250YWluKG9yZChjcCksIGlkbmFkYXRhLnNjcmlwdHNbc2NyaXB0XSkKCmRlZiBfcHVueWNvZGUocyk6CiAgICByZXR1cm4gcy5lbmNvZGUoJ3B1bnljb2RlJykKCmRlZiBfdW5vdChzKToKICAgIHJldHVybiAnVSt7MDowNFh9Jy5mb3JtYXQocykKCgpkZWYgdmFsaWRfbGFiZWxfbGVuZ3RoKGxhYmVsKToKCiAgICBpZiBsZW4obGFiZWwpID4gNjM6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gVHJ1ZQoKCmRlZiB2YWxpZF9zdHJpbmdfbGVuZ3RoKGxhYmVsLCB0cmFpbGluZ19kb3QpOgoKICAgIGlmIGxlbihsYWJlbCkgPiAoMjU0IGlmIHRyYWlsaW5nX2RvdCBlbHNlIDI1Myk6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gVHJ1ZQoKCmRlZiBjaGVja19iaWRpKGxhYmVsLCBjaGVja19sdHI9RmFsc2UpOgoKICAgICMgQmlkaSBydWxlcyBzaG91bGQgb25seSBiZSBhcHBsaWVkIGlmIHN0cmluZyBjb250YWlucyBSVEwgY2hhcmFjdGVycwogICAgYmlkaV9sYWJlbCA9IEZhbHNlCiAgICBmb3IgKGlkeCwgY3ApIGluIGVudW1lcmF0ZShsYWJlbCwgMSk6CiAgICAgICAgZGlyZWN0aW9uID0gdW5pY29kZWRhdGEuYmlkaXJlY3Rpb25hbChjcCkKICAgICAgICBpZiBkaXJlY3Rpb24gPT0gJyc6CiAgICAgICAgICAgICMgU3RyaW5nIGxpa2VseSBjb21lcyBmcm9tIGEgbmV3ZXIgdmVyc2lvbiBvZiBVbmljb2RlCiAgICAgICAgICAgIHJhaXNlIElETkFCaWRpRXJyb3IoJ1Vua25vd24gZGlyZWN0aW9uYWxpdHkgaW4gbGFiZWwgezB9IGF0IHBvc2l0aW9uIHsxfScuZm9ybWF0KHJlcHIobGFiZWwpLCBpZHgpKQogICAgICAgIGlmIGRpcmVjdGlvbiBpbiBbJ1InLCAnQUwnLCAnQU4nXToKICAgICAgICAgICAgYmlkaV9sYWJlbCA9IFRydWUKICAgICAgICAgICAgYnJlYWsKICAgIGlmIG5vdCBiaWRpX2xhYmVsIGFuZCBub3QgY2hlY2tfbHRyOgogICAgICAgIHJldHVybiBUcnVlCgogICAgIyBCaWRpIHJ1bGUgMQogICAgZGlyZWN0aW9uID0gdW5pY29kZWRhdGEuYmlkaXJlY3Rpb25hbChsYWJlbFswXSkKICAgIGlmIGRpcmVjdGlvbiBpbiBbJ1InLCAnQUwnXToKICAgICAgICBydGwgPSBUcnVlCiAgICBlbGlmIGRpcmVjdGlvbiA9PSAnTCc6CiAgICAgICAgcnRsID0gRmFsc2UKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgSUROQUJpZGlFcnJvcignRmlyc3QgY29kZXBvaW50IGluIGxhYmVsIHswfSBtdXN0IGJlIGRpcmVjdGlvbmFsaXR5IEwsIFIgb3IgQUwnLmZvcm1hdChyZXByKGxhYmVsKSkpCgogICAgdmFsaWRfZW5kaW5nID0gRmFsc2UKICAgIG51bWJlcl90eXBlID0gRmFsc2UKICAgIGZvciAoaWR4LCBjcCkgaW4gZW51bWVyYXRlKGxhYmVsLCAxKToKICAgICAgICBkaXJlY3Rpb24gPSB1bmljb2RlZGF0YS5iaWRpcmVjdGlvbmFsKGNwKQoKICAgICAgICBpZiBydGw6CiAgICAgICAgICAgICMgQmlkaSBydWxlIDIKICAgICAgICAgICAgaWYgbm90IGRpcmVjdGlvbiBpbiBbJ1InLCAnQUwnLCAnQU4nLCAnRU4nLCAnRVMnLCAnQ1MnLCAnRVQnLCAnT04nLCAnQk4nLCAnTlNNJ106CiAgICAgICAgICAgICAgICByYWlzZSBJRE5BQmlkaUVycm9yKCdJbnZhbGlkIGRpcmVjdGlvbiBmb3IgY29kZXBvaW50IGF0IHBvc2l0aW9uIHswfSBpbiBhIHJpZ2h0LXRvLWxlZnQgbGFiZWwnLmZvcm1hdChpZHgpKQogICAgICAgICAgICAjIEJpZGkgcnVsZSAzCiAgICAgICAgICAgIGlmIGRpcmVjdGlvbiBpbiBbJ1InLCAnQUwnLCAnRU4nLCAnQU4nXToKICAgICAgICAgICAgICAgIHZhbGlkX2VuZGluZyA9IFRydWUKICAgICAgICAgICAgZWxpZiBkaXJlY3Rpb24gIT0gJ05TTSc6CiAgICAgICAgICAgICAgICB2YWxpZF9lbmRpbmcgPSBGYWxzZQogICAgICAgICAgICAjIEJpZGkgcnVsZSA0CiAgICAgICAgICAgIGlmIGRpcmVjdGlvbiBpbiBbJ0FOJywgJ0VOJ106CiAgICAgICAgICAgICAgICBpZiBub3QgbnVtYmVyX3R5cGU6CiAgICAgICAgICAgICAgICAgICAgbnVtYmVyX3R5cGUgPSBkaXJlY3Rpb24KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgbnVtYmVyX3R5cGUgIT0gZGlyZWN0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBJRE5BQmlkaUVycm9yKCdDYW4gbm90IG1peCBudW1lcmFsIHR5cGVzIGluIGEgcmlnaHQtdG8tbGVmdCBsYWJlbCcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBCaWRpIHJ1bGUgNQogICAgICAgICAgICBpZiBub3QgZGlyZWN0aW9uIGluIFsnTCcsICdFTicsICdFUycsICdDUycsICdFVCcsICdPTicsICdCTicsICdOU00nXToKICAgICAgICAgICAgICAgIHJhaXNlIElETkFCaWRpRXJyb3IoJ0ludmFsaWQgZGlyZWN0aW9uIGZvciBjb2RlcG9pbnQgYXQgcG9zaXRpb24gezB9IGluIGEgbGVmdC10by1yaWdodCBsYWJlbCcuZm9ybWF0KGlkeCkpCiAgICAgICAgICAgICMgQmlkaSBydWxlIDYKICAgICAgICAgICAgaWYgZGlyZWN0aW9uIGluIFsnTCcsICdFTiddOgogICAgICAgICAgICAgICAgdmFsaWRfZW5kaW5nID0gVHJ1ZQogICAgICAgICAgICBlbGlmIGRpcmVjdGlvbiAhPSAnTlNNJzoKICAgICAgICAgICAgICAgIHZhbGlkX2VuZGluZyA9IEZhbHNlCgogICAgaWYgbm90IHZhbGlkX2VuZGluZzoKICAgICAgICByYWlzZSBJRE5BQmlkaUVycm9yKCdMYWJlbCBlbmRzIHdpdGggaWxsZWdhbCBjb2RlcG9pbnQgZGlyZWN0aW9uYWxpdHknKQoKICAgIHJldHVybiBUcnVlCgoKZGVmIGNoZWNrX2luaXRpYWxfY29tYmluZXIobGFiZWwpOgoKICAgIGlmIHVuaWNvZGVkYXRhLmNhdGVnb3J5KGxhYmVsWzBdKVswXSA9PSAnTSc6CiAgICAgICAgcmFpc2UgSUROQUVycm9yKCdMYWJlbCBiZWdpbnMgd2l0aCBhbiBpbGxlZ2FsIGNvbWJpbmluZyBjaGFyYWN0ZXInKQogICAgcmV0dXJuIFRydWUKCgpkZWYgY2hlY2tfaHlwaGVuX29rKGxhYmVsKToKCiAgICBpZiBsYWJlbFsyOjRdID09ICctLSc6CiAgICAgICAgcmFpc2UgSUROQUVycm9yKCdMYWJlbCBoYXMgZGlzYWxsb3dlZCBoeXBoZW5zIGluIDNyZCBhbmQgNHRoIHBvc2l0aW9uJykKICAgIGlmIGxhYmVsWzBdID09ICctJyBvciBsYWJlbFstMV0gPT0gJy0nOgogICAgICAgIHJhaXNlIElETkFFcnJvcignTGFiZWwgbXVzdCBub3Qgc3RhcnQgb3IgZW5kIHdpdGggYSBoeXBoZW4nKQogICAgcmV0dXJuIFRydWUKCgpkZWYgY2hlY2tfbmZjKGxhYmVsKToKCiAgICBpZiB1bmljb2RlZGF0YS5ub3JtYWxpemUoJ05GQycsIGxhYmVsKSAhPSBsYWJlbDoKICAgICAgICByYWlzZSBJRE5BRXJyb3IoJ0xhYmVsIG11c3QgYmUgaW4gTm9ybWFsaXphdGlvbiBGb3JtIEMnKQoKCmRlZiB2YWxpZF9jb250ZXh0aihsYWJlbCwgcG9zKToKCiAgICBjcF92YWx1ZSA9IG9yZChsYWJlbFtwb3NdKQoKICAgIGlmIGNwX3ZhbHVlID09IDB4MjAwYzoKCiAgICAgICAgaWYgcG9zID4gMDoKICAgICAgICAgICAgaWYgX2NvbWJpbmluZ19jbGFzcyhvcmQobGFiZWxbcG9zIC0gMV0pKSA9PSBfdmlyYW1hX2NvbWJpbmluZ19jbGFzczoKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIG9rID0gRmFsc2UKICAgICAgICBmb3IgaSBpbiByYW5nZShwb3MtMSwgLTEsIC0xKToKICAgICAgICAgICAgam9pbmluZ190eXBlID0gaWRuYWRhdGEuam9pbmluZ190eXBlcy5nZXQob3JkKGxhYmVsW2ldKSkKICAgICAgICAgICAgaWYgam9pbmluZ190eXBlID09IG9yZCgnVCcpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgam9pbmluZ190eXBlIGluIFtvcmQoJ0wnKSwgb3JkKCdEJyldOgogICAgICAgICAgICAgICAgb2sgPSBUcnVlCiAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICBpZiBub3Qgb2s6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBvayA9IEZhbHNlCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UocG9zKzEsIGxlbihsYWJlbCkpOgogICAgICAgICAgICBqb2luaW5nX3R5cGUgPSBpZG5hZGF0YS5qb2luaW5nX3R5cGVzLmdldChvcmQobGFiZWxbaV0pKQogICAgICAgICAgICBpZiBqb2luaW5nX3R5cGUgPT0gb3JkKCdUJyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBqb2luaW5nX3R5cGUgaW4gW29yZCgnUicpLCBvcmQoJ0QnKV06CiAgICAgICAgICAgICAgICBvayA9IFRydWUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIG9rCgogICAgaWYgY3BfdmFsdWUgPT0gMHgyMDBkOgoKICAgICAgICBpZiBwb3MgPiAwOgogICAgICAgICAgICBpZiBfY29tYmluaW5nX2NsYXNzKG9yZChsYWJlbFtwb3MgLSAxXSkpID09IF92aXJhbWFfY29tYmluaW5nX2NsYXNzOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBlbHNlOgoKICAgICAgICByZXR1cm4gRmFsc2UKCgpkZWYgdmFsaWRfY29udGV4dG8obGFiZWwsIHBvcywgZXhjZXB0aW9uPUZhbHNlKToKCiAgICBjcF92YWx1ZSA9IG9yZChsYWJlbFtwb3NdKQoKICAgIGlmIGNwX3ZhbHVlID09IDB4MDBiNzoKICAgICAgICBpZiAwIDwgcG9zIDwgbGVuKGxhYmVsKS0xOgogICAgICAgICAgICBpZiBvcmQobGFiZWxbcG9zIC0gMV0pID09IDB4MDA2YyBhbmQgb3JkKGxhYmVsW3BvcyArIDFdKSA9PSAweDAwNmM6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGVsaWYgY3BfdmFsdWUgPT0gMHgwMzc1OgogICAgICAgIGlmIHBvcyA8IGxlbihsYWJlbCktMSBhbmQgbGVuKGxhYmVsKSA+IDE6CiAgICAgICAgICAgIHJldHVybiBfaXNfc2NyaXB0KGxhYmVsW3BvcyArIDFdLCAnR3JlZWsnKQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGVsaWYgY3BfdmFsdWUgPT0gMHgwNWYzIG9yIGNwX3ZhbHVlID09IDB4MDVmNDoKICAgICAgICBpZiBwb3MgPiAwOgogICAgICAgICAgICByZXR1cm4gX2lzX3NjcmlwdChsYWJlbFtwb3MgLSAxXSwgJ0hlYnJldycpCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZWxpZiBjcF92YWx1ZSA9PSAweDMwZmI6CiAgICAgICAgZm9yIGNwIGluIGxhYmVsOgogICAgICAgICAgICBpZiBjcCA9PSB1J1x1MzBmYic6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBfaXNfc2NyaXB0KGNwLCAnSGlyYWdhbmEnKSBvciBfaXNfc2NyaXB0KGNwLCAnS2F0YWthbmEnKSBvciBfaXNfc2NyaXB0KGNwLCAnSGFuJyk6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGVsaWYgMHg2NjAgPD0gY3BfdmFsdWUgPD0gMHg2Njk6CiAgICAgICAgZm9yIGNwIGluIGxhYmVsOgogICAgICAgICAgICBpZiAweDZmMCA8PSBvcmQoY3ApIDw9IDB4MDZmOToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZWxpZiAweDZmMCA8PSBjcF92YWx1ZSA8PSAweDZmOToKICAgICAgICBmb3IgY3AgaW4gbGFiZWw6CiAgICAgICAgICAgIGlmIDB4NjYwIDw9IG9yZChjcCkgPD0gMHgwNjY5OgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIFRydWUKCgpkZWYgY2hlY2tfbGFiZWwobGFiZWwpOgoKICAgIGlmIGlzaW5zdGFuY2UobGFiZWwsIChieXRlcywgYnl0ZWFycmF5KSk6CiAgICAgICAgbGFiZWwgPSBsYWJlbC5kZWNvZGUoJ3V0Zi04JykKICAgIGlmIGxlbihsYWJlbCkgPT0gMDoKICAgICAgICByYWlzZSBJRE5BRXJyb3IoJ0VtcHR5IExhYmVsJykKCiAgICBjaGVja19uZmMobGFiZWwpCiAgICBjaGVja19oeXBoZW5fb2sobGFiZWwpCiAgICBjaGVja19pbml0aWFsX2NvbWJpbmVyKGxhYmVsKQoKICAgIGZvciAocG9zLCBjcCkgaW4gZW51bWVyYXRlKGxhYmVsKToKICAgICAgICBjcF92YWx1ZSA9IG9yZChjcCkKICAgICAgICBpZiBpbnRyYW5nZXNfY29udGFpbihjcF92YWx1ZSwgaWRuYWRhdGEuY29kZXBvaW50X2NsYXNzZXNbJ1BWQUxJRCddKToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBlbGlmIGludHJhbmdlc19jb250YWluKGNwX3ZhbHVlLCBpZG5hZGF0YS5jb2RlcG9pbnRfY2xhc3Nlc1snQ09OVEVYVEonXSk6CiAgICAgICAgICAgIGlmIG5vdCB2YWxpZF9jb250ZXh0aihsYWJlbCwgcG9zKToKICAgICAgICAgICAgICAgIHJhaXNlIEludmFsaWRDb2RlcG9pbnRDb250ZXh0KCdKb2luZXIgezB9IG5vdCBhbGxvd2VkIGF0IHBvc2l0aW9uIHsxfSBpbiB7Mn0nLmZvcm1hdChfdW5vdChjcF92YWx1ZSksIHBvcysxLCByZXByKGxhYmVsKSkpCiAgICAgICAgZWxpZiBpbnRyYW5nZXNfY29udGFpbihjcF92YWx1ZSwgaWRuYWRhdGEuY29kZXBvaW50X2NsYXNzZXNbJ0NPTlRFWFRPJ10pOgogICAgICAgICAgICBpZiBub3QgdmFsaWRfY29udGV4dG8obGFiZWwsIHBvcyk6CiAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkQ29kZXBvaW50Q29udGV4dCgnQ29kZXBvaW50IHswfSBub3QgYWxsb3dlZCBhdCBwb3NpdGlvbiB7MX0gaW4gezJ9Jy5mb3JtYXQoX3Vub3QoY3BfdmFsdWUpLCBwb3MrMSwgcmVwcihsYWJlbCkpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRDb2RlcG9pbnQoJ0NvZGVwb2ludCB7MH0gYXQgcG9zaXRpb24gezF9IG9mIHsyfSBub3QgYWxsb3dlZCcuZm9ybWF0KF91bm90KGNwX3ZhbHVlKSwgcG9zKzEsIHJlcHIobGFiZWwpKSkKCiAgICBjaGVja19iaWRpKGxhYmVsKQoKCmRlZiBhbGFiZWwobGFiZWwpOgoKICAgIHRyeToKICAgICAgICBsYWJlbCA9IGxhYmVsLmVuY29kZSgnYXNjaWknKQogICAgICAgIHRyeToKICAgICAgICAgICAgdWxhYmVsKGxhYmVsKQogICAgICAgIGV4Y2VwdCBJRE5BRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIElETkFFcnJvcignVGhlIGxhYmVsIHswfSBpcyBub3QgYSB2YWxpZCBBLWxhYmVsJy5mb3JtYXQobGFiZWwpKQogICAgICAgIGlmIG5vdCB2YWxpZF9sYWJlbF9sZW5ndGgobGFiZWwpOgogICAgICAgICAgICByYWlzZSBJRE5BRXJyb3IoJ0xhYmVsIHRvbyBsb25nJykKICAgICAgICByZXR1cm4gbGFiZWwKICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgcGFzcwoKICAgIGlmIG5vdCBsYWJlbDoKICAgICAgICByYWlzZSBJRE5BRXJyb3IoJ05vIElucHV0JykKCiAgICBsYWJlbCA9IHVuaWNvZGUobGFiZWwpCiAgICBjaGVja19sYWJlbChsYWJlbCkKICAgIGxhYmVsID0gX3B1bnljb2RlKGxhYmVsKQogICAgbGFiZWwgPSBfYWxhYmVsX3ByZWZpeCArIGxhYmVsCgogICAgaWYgbm90IHZhbGlkX2xhYmVsX2xlbmd0aChsYWJlbCk6CiAgICAgICAgcmFpc2UgSUROQUVycm9yKCdMYWJlbCB0b28gbG9uZycpCgogICAgcmV0dXJuIGxhYmVsCgoKZGVmIHVsYWJlbChsYWJlbCk6CgogICAgaWYgbm90IGlzaW5zdGFuY2UobGFiZWwsIChieXRlcywgYnl0ZWFycmF5KSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBsYWJlbCA9IGxhYmVsLmVuY29kZSgnYXNjaWknKQogICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgICAgIGNoZWNrX2xhYmVsKGxhYmVsKQogICAgICAgICAgICByZXR1cm4gbGFiZWwKCiAgICBsYWJlbCA9IGxhYmVsLmxvd2VyKCkKICAgIGlmIGxhYmVsLnN0YXJ0c3dpdGgoX2FsYWJlbF9wcmVmaXgpOgogICAgICAgIGxhYmVsID0gbGFiZWxbbGVuKF9hbGFiZWxfcHJlZml4KTpdCiAgICBlbHNlOgogICAgICAgIGNoZWNrX2xhYmVsKGxhYmVsKQogICAgICAgIHJldHVybiBsYWJlbC5kZWNvZGUoJ2FzY2lpJykKCiAgICBsYWJlbCA9IGxhYmVsLmRlY29kZSgncHVueWNvZGUnKQogICAgY2hlY2tfbGFiZWwobGFiZWwpCiAgICByZXR1cm4gbGFiZWwKCgpkZWYgdXRzNDZfcmVtYXAoZG9tYWluLCBzdGQzX3J1bGVzPVRydWUsIHRyYW5zaXRpb25hbD1GYWxzZSk6CiAgICAiIiJSZS1tYXAgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhY2NvcmRpbmcgdG8gVVRTNDYgcHJvY2Vzc2luZy4iIiIKICAgIGZyb20gLnV0czQ2ZGF0YSBpbXBvcnQgdXRzNDZkYXRhCiAgICBvdXRwdXQgPSB1IiIKICAgIHRyeToKICAgICAgICBmb3IgcG9zLCBjaGFyIGluIGVudW1lcmF0ZShkb21haW4pOgogICAgICAgICAgICBjb2RlX3BvaW50ID0gb3JkKGNoYXIpCiAgICAgICAgICAgIHV0czQ2cm93ID0gdXRzNDZkYXRhW2NvZGVfcG9pbnQgaWYgY29kZV9wb2ludCA8IDI1NiBlbHNlCiAgICAgICAgICAgICAgICBiaXNlY3QuYmlzZWN0X2xlZnQodXRzNDZkYXRhLCAoY29kZV9wb2ludCwgIloiKSkgLSAxXQogICAgICAgICAgICBzdGF0dXMgPSB1dHM0NnJvd1sxXQogICAgICAgICAgICByZXBsYWNlbWVudCA9IHV0czQ2cm93WzJdIGlmIGxlbih1dHM0NnJvdykgPT0gMyBlbHNlIE5vbmUKICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAiViIgb3IKICAgICAgICAgICAgICAgICAgICAoc3RhdHVzID09ICJEIiBhbmQgbm90IHRyYW5zaXRpb25hbCkgb3IKICAgICAgICAgICAgICAgICAgICAoc3RhdHVzID09ICIzIiBhbmQgc3RkM19ydWxlcyBhbmQgcmVwbGFjZW1lbnQgaXMgTm9uZSkpOgogICAgICAgICAgICAgICAgb3V0cHV0ICs9IGNoYXIKICAgICAgICAgICAgZWxpZiByZXBsYWNlbWVudCBpcyBub3QgTm9uZSBhbmQgKHN0YXR1cyA9PSAiTSIgb3IKICAgICAgICAgICAgICAgICAgICAoc3RhdHVzID09ICIzIiBhbmQgc3RkM19ydWxlcykgb3IKICAgICAgICAgICAgICAgICAgICAoc3RhdHVzID09ICJEIiBhbmQgdHJhbnNpdGlvbmFsKSk6CiAgICAgICAgICAgICAgICBvdXRwdXQgKz0gcmVwbGFjZW1lbnQKICAgICAgICAgICAgZWxpZiBzdGF0dXMgIT0gIkkiOgogICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcigpCiAgICAgICAgcmV0dXJuIHVuaWNvZGVkYXRhLm5vcm1hbGl6ZSgiTkZDIiwgb3V0cHV0KQogICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgcmFpc2UgSW52YWxpZENvZGVwb2ludCgKICAgICAgICAgICAgIkNvZGVwb2ludCB7MH0gbm90IGFsbG93ZWQgYXQgcG9zaXRpb24gezF9IGluIHsyfSIuZm9ybWF0KAogICAgICAgICAgICBfdW5vdChjb2RlX3BvaW50KSwgcG9zICsgMSwgcmVwcihkb21haW4pKSkKCgpkZWYgZW5jb2RlKHMsIHN0cmljdD1GYWxzZSwgdXRzNDY9RmFsc2UsIHN0ZDNfcnVsZXM9RmFsc2UsIHRyYW5zaXRpb25hbD1GYWxzZSk6CgogICAgaWYgaXNpbnN0YW5jZShzLCAoYnl0ZXMsIGJ5dGVhcnJheSkpOgogICAgICAgIHMgPSBzLmRlY29kZSgiYXNjaWkiKQogICAgaWYgdXRzNDY6CiAgICAgICAgcyA9IHV0czQ2X3JlbWFwKHMsIHN0ZDNfcnVsZXMsIHRyYW5zaXRpb25hbCkKICAgIHRyYWlsaW5nX2RvdCA9IEZhbHNlCiAgICByZXN1bHQgPSBbXQogICAgaWYgc3RyaWN0OgogICAgICAgIGxhYmVscyA9IHMuc3BsaXQoJy4nKQogICAgZWxzZToKICAgICAgICBsYWJlbHMgPSBfdW5pY29kZV9kb3RzX3JlLnNwbGl0KHMpCiAgICB3aGlsZSBsYWJlbHMgYW5kIG5vdCBsYWJlbHNbMF06CiAgICAgICAgZGVsIGxhYmVsc1swXQogICAgaWYgbm90IGxhYmVsczoKICAgICAgICByYWlzZSBJRE5BRXJyb3IoJ0VtcHR5IGRvbWFpbicpCiAgICBpZiBsYWJlbHNbLTFdID09ICcnOgogICAgICAgIGRlbCBsYWJlbHNbLTFdCiAgICAgICAgdHJhaWxpbmdfZG90ID0gVHJ1ZQogICAgZm9yIGxhYmVsIGluIGxhYmVsczoKICAgICAgICByZXN1bHQuYXBwZW5kKGFsYWJlbChsYWJlbCkpCiAgICBpZiB0cmFpbGluZ19kb3Q6CiAgICAgICAgcmVzdWx0LmFwcGVuZChiJycpCiAgICBzID0gYicuJy5qb2luKHJlc3VsdCkKICAgIGlmIG5vdCB2YWxpZF9zdHJpbmdfbGVuZ3RoKHMsIHRyYWlsaW5nX2RvdCk6CiAgICAgICAgcmFpc2UgSUROQUVycm9yKCdEb21haW4gdG9vIGxvbmcnKQogICAgcmV0dXJuIHMKCgpkZWYgZGVjb2RlKHMsIHN0cmljdD1GYWxzZSwgdXRzNDY9RmFsc2UsIHN0ZDNfcnVsZXM9RmFsc2UpOgoKICAgIGlmIGlzaW5zdGFuY2UocywgKGJ5dGVzLCBieXRlYXJyYXkpKToKICAgICAgICBzID0gcy5kZWNvZGUoImFzY2lpIikKICAgIGlmIHV0czQ2OgogICAgICAgIHMgPSB1dHM0Nl9yZW1hcChzLCBzdGQzX3J1bGVzLCBGYWxzZSkKICAgIHRyYWlsaW5nX2RvdCA9IEZhbHNlCiAgICByZXN1bHQgPSBbXQogICAgaWYgbm90IHN0cmljdDoKICAgICAgICBsYWJlbHMgPSBfdW5pY29kZV9kb3RzX3JlLnNwbGl0KHMpCiAgICBlbHNlOgogICAgICAgIGxhYmVscyA9IHMuc3BsaXQodScuJykKICAgIHdoaWxlIGxhYmVscyBhbmQgbm90IGxhYmVsc1swXToKICAgICAgICBkZWwgbGFiZWxzWzBdCiAgICBpZiBub3QgbGFiZWxzOgogICAgICAgIHJhaXNlIElETkFFcnJvcignRW1wdHkgZG9tYWluJykKICAgIGlmIG5vdCBsYWJlbHNbLTFdOgogICAgICAgIGRlbCBsYWJlbHNbLTFdCiAgICAgICAgdHJhaWxpbmdfZG90ID0gVHJ1ZQogICAgZm9yIGxhYmVsIGluIGxhYmVsczoKICAgICAgICByZXN1bHQuYXBwZW5kKHVsYWJlbChsYWJlbCkpCiAgICBpZiB0cmFpbGluZ19kb3Q6CiAgICAgICAgcmVzdWx0LmFwcGVuZCh1JycpCiAgICByZXR1cm4gdScuJy5qb2luKHJlc3VsdCkKUEsDBBQAAAAAAAAAIQBjvPoR54AAAOeAAAAsAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvaWRuYWRhdGEucHkjIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0b29scy9pZG5hLWRhdGEKCl9fdmVyc2lvbl9fID0gIjYuMy4wIgpzY3JpcHRzID0gewogICAgJ0dyZWVrJzogKAogICAgICAgIDB4MzcwMDAwMDAzNzQsCiAgICAgICAgMHgzNzUwMDAwMDM3OCwKICAgICAgICAweDM3YTAwMDAwMzdlLAogICAgICAgIDB4Mzg0MDAwMDAzODUsCiAgICAgICAgMHgzODYwMDAwMDM4NywKICAgICAgICAweDM4ODAwMDAwMzhiLAogICAgICAgIDB4MzhjMDAwMDAzOGQsCiAgICAgICAgMHgzOGUwMDAwMDNhMiwKICAgICAgICAweDNhMzAwMDAwM2UyLAogICAgICAgIDB4M2YwMDAwMDA0MDAsCiAgICAgICAgMHgxZDI2MDAwMDFkMmIsCiAgICAgICAgMHgxZDVkMDAwMDFkNjIsCiAgICAgICAgMHgxZDY2MDAwMDFkNmIsCiAgICAgICAgMHgxZGJmMDAwMDFkYzAsCiAgICAgICAgMHgxZjAwMDAwMDFmMTYsCiAgICAgICAgMHgxZjE4MDAwMDFmMWUsCiAgICAgICAgMHgxZjIwMDAwMDFmNDYsCiAgICAgICAgMHgxZjQ4MDAwMDFmNGUsCiAgICAgICAgMHgxZjUwMDAwMDFmNTgsCiAgICAgICAgMHgxZjU5MDAwMDFmNWEsCiAgICAgICAgMHgxZjViMDAwMDFmNWMsCiAgICAgICAgMHgxZjVkMDAwMDFmNWUsCiAgICAgICAgMHgxZjVmMDAwMDFmN2UsCiAgICAgICAgMHgxZjgwMDAwMDFmYjUsCiAgICAgICAgMHgxZmI2MDAwMDFmYzUsCiAgICAgICAgMHgxZmM2MDAwMDFmZDQsCiAgICAgICAgMHgxZmQ2MDAwMDFmZGMsCiAgICAgICAgMHgxZmRkMDAwMDFmZjAsCiAgICAgICAgMHgxZmYyMDAwMDFmZjUsCiAgICAgICAgMHgxZmY2MDAwMDFmZmYsCiAgICAgICAgMHgyMTI2MDAwMDIxMjcsCiAgICAgICAgMHgxMDE0MDAwMDEwMThiLAogICAgICAgIDB4MWQyMDAwMDAxZDI0NiwKICAgICksCiAgICAnSGFuJzogKAogICAgICAgIDB4MmU4MDAwMDAyZTlhLAogICAgICAgIDB4MmU5YjAwMDAyZWY0LAogICAgICAgIDB4MmYwMDAwMDAyZmQ2LAogICAgICAgIDB4MzAwNTAwMDAzMDA2LAogICAgICAgIDB4MzAwNzAwMDAzMDA4LAogICAgICAgIDB4MzAyMTAwMDAzMDJhLAogICAgICAgIDB4MzAzODAwMDAzMDNjLAogICAgICAgIDB4MzQwMDAwMDA0ZGI2LAogICAgICAgIDB4NGUwMDAwMDA5ZmNkLAogICAgICAgIDB4ZjkwMDAwMDBmYTZlLAogICAgICAgIDB4ZmE3MDAwMDBmYWRhLAogICAgICAgIDB4MjAwMDAwMDAyYTZkNywKICAgICAgICAweDJhNzAwMDAwMmI3MzUsCiAgICAgICAgMHgyYjc0MDAwMDJiODFlLAogICAgICAgIDB4MmY4MDAwMDAyZmExZSwKICAgICksCiAgICAnSGVicmV3JzogKAogICAgICAgIDB4NTkxMDAwMDA1YzgsCiAgICAgICAgMHg1ZDAwMDAwMDVlYiwKICAgICAgICAweDVmMDAwMDAwNWY1LAogICAgICAgIDB4ZmIxZDAwMDBmYjM3LAogICAgICAgIDB4ZmIzODAwMDBmYjNkLAogICAgICAgIDB4ZmIzZTAwMDBmYjNmLAogICAgICAgIDB4ZmI0MDAwMDBmYjQyLAogICAgICAgIDB4ZmI0MzAwMDBmYjQ1LAogICAgICAgIDB4ZmI0NjAwMDBmYjUwLAogICAgKSwKICAgICdIaXJhZ2FuYSc6ICgKICAgICAgICAweDMwNDEwMDAwMzA5NywKICAgICAgICAweDMwOWQwMDAwMzBhMCwKICAgICAgICAweDFiMDAxMDAwMWIwMDIsCiAgICAgICAgMHgxZjIwMDAwMDFmMjAxLAogICAgKSwKICAgICdLYXRha2FuYSc6ICgKICAgICAgICAweDMwYTEwMDAwMzBmYiwKICAgICAgICAweDMwZmQwMDAwMzEwMCwKICAgICAgICAweDMxZjAwMDAwMzIwMCwKICAgICAgICAweDMyZDAwMDAwMzJmZiwKICAgICAgICAweDMzMDAwMDAwMzM1OCwKICAgICAgICAweGZmNjYwMDAwZmY3MCwKICAgICAgICAweGZmNzEwMDAwZmY5ZSwKICAgICAgICAweDFiMDAwMDAwMWIwMDEsCiAgICApLAp9CmpvaW5pbmdfdHlwZXMgPSB7CiAgICAweDYwMDogODUsCiAgICAweDYwMTogODUsCiAgICAweDYwMjogODUsCiAgICAweDYwMzogODUsCiAgICAweDYwNDogODUsCiAgICAweDYwODogODUsCiAgICAweDYwYjogODUsCiAgICAweDYyMDogNjgsCiAgICAweDYyMTogODUsCiAgICAweDYyMjogODIsCiAgICAweDYyMzogODIsCiAgICAweDYyNDogODIsCiAgICAweDYyNTogODIsCiAgICAweDYyNjogNjgsCiAgICAweDYyNzogODIsCiAgICAweDYyODogNjgsCiAgICAweDYyOTogODIsCiAgICAweDYyYTogNjgsCiAgICAweDYyYjogNjgsCiAgICAweDYyYzogNjgsCiAgICAweDYyZDogNjgsCiAgICAweDYyZTogNjgsCiAgICAweDYyZjogODIsCiAgICAweDYzMDogODIsCiAgICAweDYzMTogODIsCiAgICAweDYzMjogODIsCiAgICAweDYzMzogNjgsCiAgICAweDYzNDogNjgsCiAgICAweDYzNTogNjgsCiAgICAweDYzNjogNjgsCiAgICAweDYzNzogNjgsCiAgICAweDYzODogNjgsCiAgICAweDYzOTogNjgsCiAgICAweDYzYTogNjgsCiAgICAweDYzYjogNjgsCiAgICAweDYzYzogNjgsCiAgICAweDYzZDogNjgsCiAgICAweDYzZTogNjgsCiAgICAweDYzZjogNjgsCiAgICAweDY0MDogNjcsCiAgICAweDY0MTogNjgsCiAgICAweDY0MjogNjgsCiAgICAweDY0MzogNjgsCiAgICAweDY0NDogNjgsCiAgICAweDY0NTogNjgsCiAgICAweDY0NjogNjgsCiAgICAweDY0NzogNjgsCiAgICAweDY0ODogODIsCiAgICAweDY0OTogNjgsCiAgICAweDY0YTogNjgsCiAgICAweDY2ZTogNjgsCiAgICAweDY2ZjogNjgsCiAgICAweDY3MTogODIsCiAgICAweDY3MjogODIsCiAgICAweDY3MzogODIsCiAgICAweDY3NDogODUsCiAgICAweDY3NTogODIsCiAgICAweDY3NjogODIsCiAgICAweDY3NzogODIsCiAgICAweDY3ODogNjgsCiAgICAweDY3OTogNjgsCiAgICAweDY3YTogNjgsCiAgICAweDY3YjogNjgsCiAgICAweDY3YzogNjgsCiAgICAweDY3ZDogNjgsCiAgICAweDY3ZTogNjgsCiAgICAweDY3ZjogNjgsCiAgICAweDY4MDogNjgsCiAgICAweDY4MTogNjgsCiAgICAweDY4MjogNjgsCiAgICAweDY4MzogNjgsCiAgICAweDY4NDogNjgsCiAgICAweDY4NTogNjgsCiAgICAweDY4NjogNjgsCiAgICAweDY4NzogNjgsCiAgICAweDY4ODogODIsCiAgICAweDY4OTogODIsCiAgICAweDY4YTogODIsCiAgICAweDY4YjogODIsCiAgICAweDY4YzogODIsCiAgICAweDY4ZDogODIsCiAgICAweDY4ZTogODIsCiAgICAweDY4ZjogODIsCiAgICAweDY5MDogODIsCiAgICAweDY5MTogODIsCiAgICAweDY5MjogODIsCiAgICAweDY5MzogODIsCiAgICAweDY5NDogODIsCiAgICAweDY5NTogODIsCiAgICAweDY5NjogODIsCiAgICAweDY5NzogODIsCiAgICAweDY5ODogODIsCiAgICAweDY5OTogODIsCiAgICAweDY5YTogNjgsCiAgICAweDY5YjogNjgsCiAgICAweDY5YzogNjgsCiAgICAweDY5ZDogNjgsCiAgICAweDY5ZTogNjgsCiAgICAweDY5ZjogNjgsCiAgICAweDZhMDogNjgsCiAgICAweDZhMTogNjgsCiAgICAweDZhMjogNjgsCiAgICAweDZhMzogNjgsCiAgICAweDZhNDogNjgsCiAgICAweDZhNTogNjgsCiAgICAweDZhNjogNjgsCiAgICAweDZhNzogNjgsCiAgICAweDZhODogNjgsCiAgICAweDZhOTogNjgsCiAgICAweDZhYTogNjgsCiAgICAweDZhYjogNjgsCiAgICAweDZhYzogNjgsCiAgICAweDZhZDogNjgsCiAgICAweDZhZTogNjgsCiAgICAweDZhZjogNjgsCiAgICAweDZiMDogNjgsCiAgICAweDZiMTogNjgsCiAgICAweDZiMjogNjgsCiAgICAweDZiMzogNjgsCiAgICAweDZiNDogNjgsCiAgICAweDZiNTogNjgsCiAgICAweDZiNjogNjgsCiAgICAweDZiNzogNjgsCiAgICAweDZiODogNjgsCiAgICAweDZiOTogNjgsCiAgICAweDZiYTogNjgsCiAgICAweDZiYjogNjgsCiAgICAweDZiYzogNjgsCiAgICAweDZiZDogNjgsCiAgICAweDZiZTogNjgsCiAgICAweDZiZjogNjgsCiAgICAweDZjMDogODIsCiAgICAweDZjMTogNjgsCiAgICAweDZjMjogNjgsCiAgICAweDZjMzogODIsCiAgICAweDZjNDogODIsCiAgICAweDZjNTogODIsCiAgICAweDZjNjogODIsCiAgICAweDZjNzogODIsCiAgICAweDZjODogODIsCiAgICAweDZjOTogODIsCiAgICAweDZjYTogODIsCiAgICAweDZjYjogODIsCiAgICAweDZjYzogNjgsCiAgICAweDZjZDogODIsCiAgICAweDZjZTogNjgsCiAgICAweDZjZjogODIsCiAgICAweDZkMDogNjgsCiAgICAweDZkMTogNjgsCiAgICAweDZkMjogODIsCiAgICAweDZkMzogODIsCiAgICAweDZkNTogODIsCiAgICAweDZkZDogODUsCiAgICAweDZlZTogODIsCiAgICAweDZlZjogODIsCiAgICAweDZmYTogNjgsCiAgICAweDZmYjogNjgsCiAgICAweDZmYzogNjgsCiAgICAweDZmZjogNjgsCiAgICAweDcxMDogODIsCiAgICAweDcxMjogNjgsCiAgICAweDcxMzogNjgsCiAgICAweDcxNDogNjgsCiAgICAweDcxNTogODIsCiAgICAweDcxNjogODIsCiAgICAweDcxNzogODIsCiAgICAweDcxODogODIsCiAgICAweDcxOTogODIsCiAgICAweDcxYTogNjgsCiAgICAweDcxYjogNjgsCiAgICAweDcxYzogNjgsCiAgICAweDcxZDogNjgsCiAgICAweDcxZTogODIsCiAgICAweDcxZjogNjgsCiAgICAweDcyMDogNjgsCiAgICAweDcyMTogNjgsCiAgICAweDcyMjogNjgsCiAgICAweDcyMzogNjgsCiAgICAweDcyNDogNjgsCiAgICAweDcyNTogNjgsCiAgICAweDcyNjogNjgsCiAgICAweDcyNzogNjgsCiAgICAweDcyODogODIsCiAgICAweDcyOTogNjgsCiAgICAweDcyYTogODIsCiAgICAweDcyYjogNjgsCiAgICAweDcyYzogODIsCiAgICAweDcyZDogNjgsCiAgICAweDcyZTogNjgsCiAgICAweDcyZjogODIsCiAgICAweDc0ZDogODIsCiAgICAweDc0ZTogNjgsCiAgICAweDc0ZjogNjgsCiAgICAweDc1MDogNjgsCiAgICAweDc1MTogNjgsCiAgICAweDc1MjogNjgsCiAgICAweDc1MzogNjgsCiAgICAweDc1NDogNjgsCiAgICAweDc1NTogNjgsCiAgICAweDc1NjogNjgsCiAgICAweDc1NzogNjgsCiAgICAweDc1ODogNjgsCiAgICAweDc1OTogODIsCiAgICAweDc1YTogODIsCiAgICAweDc1YjogODIsCiAgICAweDc1YzogNjgsCiAgICAweDc1ZDogNjgsCiAgICAweDc1ZTogNjgsCiAgICAweDc1ZjogNjgsCiAgICAweDc2MDogNjgsCiAgICAweDc2MTogNjgsCiAgICAweDc2MjogNjgsCiAgICAweDc2MzogNjgsCiAgICAweDc2NDogNjgsCiAgICAweDc2NTogNjgsCiAgICAweDc2NjogNjgsCiAgICAweDc2NzogNjgsCiAgICAweDc2ODogNjgsCiAgICAweDc2OTogNjgsCiAgICAweDc2YTogNjgsCiAgICAweDc2YjogODIsCiAgICAweDc2YzogODIsCiAgICAweDc2ZDogNjgsCiAgICAweDc2ZTogNjgsCiAgICAweDc2ZjogNjgsCiAgICAweDc3MDogNjgsCiAgICAweDc3MTogODIsCiAgICAweDc3MjogNjgsCiAgICAweDc3MzogODIsCiAgICAweDc3NDogODIsCiAgICAweDc3NTogNjgsCiAgICAweDc3NjogNjgsCiAgICAweDc3NzogNjgsCiAgICAweDc3ODogODIsCiAgICAweDc3OTogODIsCiAgICAweDc3YTogNjgsCiAgICAweDc3YjogNjgsCiAgICAweDc3YzogNjgsCiAgICAweDc3ZDogNjgsCiAgICAweDc3ZTogNjgsCiAgICAweDc3ZjogNjgsCiAgICAweDdjYTogNjgsCiAgICAweDdjYjogNjgsCiAgICAweDdjYzogNjgsCiAgICAweDdjZDogNjgsCiAgICAweDdjZTogNjgsCiAgICAweDdjZjogNjgsCiAgICAweDdkMDogNjgsCiAgICAweDdkMTogNjgsCiAgICAweDdkMjogNjgsCiAgICAweDdkMzogNjgsCiAgICAweDdkNDogNjgsCiAgICAweDdkNTogNjgsCiAgICAweDdkNjogNjgsCiAgICAweDdkNzogNjgsCiAgICAweDdkODogNjgsCiAgICAweDdkOTogNjgsCiAgICAweDdkYTogNjgsCiAgICAweDdkYjogNjgsCiAgICAweDdkYzogNjgsCiAgICAweDdkZDogNjgsCiAgICAweDdkZTogNjgsCiAgICAweDdkZjogNjgsCiAgICAweDdlMDogNjgsCiAgICAweDdlMTogNjgsCiAgICAweDdlMjogNjgsCiAgICAweDdlMzogNjgsCiAgICAweDdlNDogNjgsCiAgICAweDdlNTogNjgsCiAgICAweDdlNjogNjgsCiAgICAweDdlNzogNjgsCiAgICAweDdlODogNjgsCiAgICAweDdlOTogNjgsCiAgICAweDdlYTogNjgsCiAgICAweDdmYTogNjcsCiAgICAweDg0MDogODIsCiAgICAweDg0MTogNjgsCiAgICAweDg0MjogNjgsCiAgICAweDg0MzogNjgsCiAgICAweDg0NDogNjgsCiAgICAweDg0NTogNjgsCiAgICAweDg0NjogODIsCiAgICAweDg0NzogNjgsCiAgICAweDg0ODogNjgsCiAgICAweDg0OTogODIsCiAgICAweDg0YTogNjgsCiAgICAweDg0YjogNjgsCiAgICAweDg0YzogNjgsCiAgICAweDg0ZDogNjgsCiAgICAweDg0ZTogNjgsCiAgICAweDg0ZjogODIsCiAgICAweDg1MDogNjgsCiAgICAweDg1MTogNjgsCiAgICAweDg1MjogNjgsCiAgICAweDg1MzogNjgsCiAgICAweDg1NDogODIsCiAgICAweDg1NTogNjgsCiAgICAweDg1NjogODUsCiAgICAweDg1NzogODUsCiAgICAweDg1ODogODUsCiAgICAweDhhMDogNjgsCiAgICAweDhhMjogNjgsCiAgICAweDhhMzogNjgsCiAgICAweDhhNDogNjgsCiAgICAweDhhNTogNjgsCiAgICAweDhhNjogNjgsCiAgICAweDhhNzogNjgsCiAgICAweDhhODogNjgsCiAgICAweDhhOTogNjgsCiAgICAweDhhYTogODIsCiAgICAweDhhYjogODIsCiAgICAweDhhYzogODIsCiAgICAweDE4MDY6IDg1LAogICAgMHgxODA3OiA2OCwKICAgIDB4MTgwYTogNjcsCiAgICAweDE4MGU6IDg1LAogICAgMHgxODIwOiA2OCwKICAgIDB4MTgyMTogNjgsCiAgICAweDE4MjI6IDY4LAogICAgMHgxODIzOiA2OCwKICAgIDB4MTgyNDogNjgsCiAgICAweDE4MjU6IDY4LAogICAgMHgxODI2OiA2OCwKICAgIDB4MTgyNzogNjgsCiAgICAweDE4Mjg6IDY4LAogICAgMHgxODI5OiA2OCwKICAgIDB4MTgyYTogNjgsCiAgICAweDE4MmI6IDY4LAogICAgMHgxODJjOiA2OCwKICAgIDB4MTgyZDogNjgsCiAgICAweDE4MmU6IDY4LAogICAgMHgxODJmOiA2OCwKICAgIDB4MTgzMDogNjgsCiAgICAweDE4MzE6IDY4LAogICAgMHgxODMyOiA2OCwKICAgIDB4MTgzMzogNjgsCiAgICAweDE4MzQ6IDY4LAogICAgMHgxODM1OiA2OCwKICAgIDB4MTgzNjogNjgsCiAgICAweDE4Mzc6IDY4LAogICAgMHgxODM4OiA2OCwKICAgIDB4MTgzOTogNjgsCiAgICAweDE4M2E6IDY4LAogICAgMHgxODNiOiA2OCwKICAgIDB4MTgzYzogNjgsCiAgICAweDE4M2Q6IDY4LAogICAgMHgxODNlOiA2OCwKICAgIDB4MTgzZjogNjgsCiAgICAweDE4NDA6IDY4LAogICAgMHgxODQxOiA2OCwKICAgIDB4MTg0MjogNjgsCiAgICAweDE4NDM6IDY4LAogICAgMHgxODQ0OiA2OCwKICAgIDB4MTg0NTogNjgsCiAgICAweDE4NDY6IDY4LAogICAgMHgxODQ3OiA2OCwKICAgIDB4MTg0ODogNjgsCiAgICAweDE4NDk6IDY4LAogICAgMHgxODRhOiA2OCwKICAgIDB4MTg0YjogNjgsCiAgICAweDE4NGM6IDY4LAogICAgMHgxODRkOiA2OCwKICAgIDB4MTg0ZTogNjgsCiAgICAweDE4NGY6IDY4LAogICAgMHgxODUwOiA2OCwKICAgIDB4MTg1MTogNjgsCiAgICAweDE4NTI6IDY4LAogICAgMHgxODUzOiA2OCwKICAgIDB4MTg1NDogNjgsCiAgICAweDE4NTU6IDY4LAogICAgMHgxODU2OiA2OCwKICAgIDB4MTg1NzogNjgsCiAgICAweDE4NTg6IDY4LAogICAgMHgxODU5OiA2OCwKICAgIDB4MTg1YTogNjgsCiAgICAweDE4NWI6IDY4LAogICAgMHgxODVjOiA2OCwKICAgIDB4MTg1ZDogNjgsCiAgICAweDE4NWU6IDY4LAogICAgMHgxODVmOiA2OCwKICAgIDB4MTg2MDogNjgsCiAgICAweDE4NjE6IDY4LAogICAgMHgxODYyOiA2OCwKICAgIDB4MTg2MzogNjgsCiAgICAweDE4NjQ6IDY4LAogICAgMHgxODY1OiA2OCwKICAgIDB4MTg2NjogNjgsCiAgICAweDE4Njc6IDY4LAogICAgMHgxODY4OiA2OCwKICAgIDB4MTg2OTogNjgsCiAgICAweDE4NmE6IDY4LAogICAgMHgxODZiOiA2OCwKICAgIDB4MTg2YzogNjgsCiAgICAweDE4NmQ6IDY4LAogICAgMHgxODZlOiA2OCwKICAgIDB4MTg2ZjogNjgsCiAgICAweDE4NzA6IDY4LAogICAgMHgxODcxOiA2OCwKICAgIDB4MTg3MjogNjgsCiAgICAweDE4NzM6IDY4LAogICAgMHgxODc0OiA2OCwKICAgIDB4MTg3NTogNjgsCiAgICAweDE4NzY6IDY4LAogICAgMHgxODc3OiA2OCwKICAgIDB4MTg4MDogODUsCiAgICAweDE4ODE6IDg1LAogICAgMHgxODgyOiA4NSwKICAgIDB4MTg4MzogODUsCiAgICAweDE4ODQ6IDg1LAogICAgMHgxODg1OiA4NSwKICAgIDB4MTg4NjogODUsCiAgICAweDE4ODc6IDY4LAogICAgMHgxODg4OiA2OCwKICAgIDB4MTg4OTogNjgsCiAgICAweDE4OGE6IDY4LAogICAgMHgxODhiOiA2OCwKICAgIDB4MTg4YzogNjgsCiAgICAweDE4OGQ6IDY4LAogICAgMHgxODhlOiA2OCwKICAgIDB4MTg4ZjogNjgsCiAgICAweDE4OTA6IDY4LAogICAgMHgxODkxOiA2OCwKICAgIDB4MTg5MjogNjgsCiAgICAweDE4OTM6IDY4LAogICAgMHgxODk0OiA2OCwKICAgIDB4MTg5NTogNjgsCiAgICAweDE4OTY6IDY4LAogICAgMHgxODk3OiA2OCwKICAgIDB4MTg5ODogNjgsCiAgICAweDE4OTk6IDY4LAogICAgMHgxODlhOiA2OCwKICAgIDB4MTg5YjogNjgsCiAgICAweDE4OWM6IDY4LAogICAgMHgxODlkOiA2OCwKICAgIDB4MTg5ZTogNjgsCiAgICAweDE4OWY6IDY4LAogICAgMHgxOGEwOiA2OCwKICAgIDB4MThhMTogNjgsCiAgICAweDE4YTI6IDY4LAogICAgMHgxOGEzOiA2OCwKICAgIDB4MThhNDogNjgsCiAgICAweDE4YTU6IDY4LAogICAgMHgxOGE2OiA2OCwKICAgIDB4MThhNzogNjgsCiAgICAweDE4YTg6IDY4LAogICAgMHgxOGFhOiA2OCwKICAgIDB4MjAwYzogODUsCiAgICAweDIwMGQ6IDY3LAogICAgMHgyMDY2OiA4NSwKICAgIDB4MjA2NzogODUsCiAgICAweDIwNjg6IDg1LAogICAgMHgyMDY5OiA4NSwKICAgIDB4YTg0MDogNjgsCiAgICAweGE4NDE6IDY4LAogICAgMHhhODQyOiA2OCwKICAgIDB4YTg0MzogNjgsCiAgICAweGE4NDQ6IDY4LAogICAgMHhhODQ1OiA2OCwKICAgIDB4YTg0NjogNjgsCiAgICAweGE4NDc6IDY4LAogICAgMHhhODQ4OiA2OCwKICAgIDB4YTg0OTogNjgsCiAgICAweGE4NGE6IDY4LAogICAgMHhhODRiOiA2OCwKICAgIDB4YTg0YzogNjgsCiAgICAweGE4NGQ6IDY4LAogICAgMHhhODRlOiA2OCwKICAgIDB4YTg0ZjogNjgsCiAgICAweGE4NTA6IDY4LAogICAgMHhhODUxOiA2OCwKICAgIDB4YTg1MjogNjgsCiAgICAweGE4NTM6IDY4LAogICAgMHhhODU0OiA2OCwKICAgIDB4YTg1NTogNjgsCiAgICAweGE4NTY6IDY4LAogICAgMHhhODU3OiA2OCwKICAgIDB4YTg1ODogNjgsCiAgICAweGE4NTk6IDY4LAogICAgMHhhODVhOiA2OCwKICAgIDB4YTg1YjogNjgsCiAgICAweGE4NWM6IDY4LAogICAgMHhhODVkOiA2OCwKICAgIDB4YTg1ZTogNjgsCiAgICAweGE4NWY6IDY4LAogICAgMHhhODYwOiA2OCwKICAgIDB4YTg2MTogNjgsCiAgICAweGE4NjI6IDY4LAogICAgMHhhODYzOiA2OCwKICAgIDB4YTg2NDogNjgsCiAgICAweGE4NjU6IDY4LAogICAgMHhhODY2OiA2OCwKICAgIDB4YTg2NzogNjgsCiAgICAweGE4Njg6IDY4LAogICAgMHhhODY5OiA2OCwKICAgIDB4YTg2YTogNjgsCiAgICAweGE4NmI6IDY4LAogICAgMHhhODZjOiA2OCwKICAgIDB4YTg2ZDogNjgsCiAgICAweGE4NmU6IDY4LAogICAgMHhhODZmOiA2OCwKICAgIDB4YTg3MDogNjgsCiAgICAweGE4NzE6IDY4LAogICAgMHhhODcyOiA3NiwKICAgIDB4YTg3MzogODUsCn0KY29kZXBvaW50X2NsYXNzZXMgPSB7CiAgICAnUFZBTElEJzogKAogICAgICAgIDB4MmQwMDAwMDAyZSwKICAgICAgICAweDMwMDAwMDAwM2EsCiAgICAgICAgMHg2MTAwMDAwMDdiLAogICAgICAgIDB4ZGYwMDAwMDBmNywKICAgICAgICAweGY4MDAwMDAxMDAsCiAgICAgICAgMHgxMDEwMDAwMDEwMiwKICAgICAgICAweDEwMzAwMDAwMTA0LAogICAgICAgIDB4MTA1MDAwMDAxMDYsCiAgICAgICAgMHgxMDcwMDAwMDEwOCwKICAgICAgICAweDEwOTAwMDAwMTBhLAogICAgICAgIDB4MTBiMDAwMDAxMGMsCiAgICAgICAgMHgxMGQwMDAwMDEwZSwKICAgICAgICAweDEwZjAwMDAwMTEwLAogICAgICAgIDB4MTExMDAwMDAxMTIsCiAgICAgICAgMHgxMTMwMDAwMDExNCwKICAgICAgICAweDExNTAwMDAwMTE2LAogICAgICAgIDB4MTE3MDAwMDAxMTgsCiAgICAgICAgMHgxMTkwMDAwMDExYSwKICAgICAgICAweDExYjAwMDAwMTFjLAogICAgICAgIDB4MTFkMDAwMDAxMWUsCiAgICAgICAgMHgxMWYwMDAwMDEyMCwKICAgICAgICAweDEyMTAwMDAwMTIyLAogICAgICAgIDB4MTIzMDAwMDAxMjQsCiAgICAgICAgMHgxMjUwMDAwMDEyNiwKICAgICAgICAweDEyNzAwMDAwMTI4LAogICAgICAgIDB4MTI5MDAwMDAxMmEsCiAgICAgICAgMHgxMmIwMDAwMDEyYywKICAgICAgICAweDEyZDAwMDAwMTJlLAogICAgICAgIDB4MTJmMDAwMDAxMzAsCiAgICAgICAgMHgxMzEwMDAwMDEzMiwKICAgICAgICAweDEzNTAwMDAwMTM2LAogICAgICAgIDB4MTM3MDAwMDAxMzksCiAgICAgICAgMHgxM2EwMDAwMDEzYiwKICAgICAgICAweDEzYzAwMDAwMTNkLAogICAgICAgIDB4MTNlMDAwMDAxM2YsCiAgICAgICAgMHgxNDIwMDAwMDE0MywKICAgICAgICAweDE0NDAwMDAwMTQ1LAogICAgICAgIDB4MTQ2MDAwMDAxNDcsCiAgICAgICAgMHgxNDgwMDAwMDE0OSwKICAgICAgICAweDE0YjAwMDAwMTRjLAogICAgICAgIDB4MTRkMDAwMDAxNGUsCiAgICAgICAgMHgxNGYwMDAwMDE1MCwKICAgICAgICAweDE1MTAwMDAwMTUyLAogICAgICAgIDB4MTUzMDAwMDAxNTQsCiAgICAgICAgMHgxNTUwMDAwMDE1NiwKICAgICAgICAweDE1NzAwMDAwMTU4LAogICAgICAgIDB4MTU5MDAwMDAxNWEsCiAgICAgICAgMHgxNWIwMDAwMDE1YywKICAgICAgICAweDE1ZDAwMDAwMTVlLAogICAgICAgIDB4MTVmMDAwMDAxNjAsCiAgICAgICAgMHgxNjEwMDAwMDE2MiwKICAgICAgICAweDE2MzAwMDAwMTY0LAogICAgICAgIDB4MTY1MDAwMDAxNjYsCiAgICAgICAgMHgxNjcwMDAwMDE2OCwKICAgICAgICAweDE2OTAwMDAwMTZhLAogICAgICAgIDB4MTZiMDAwMDAxNmMsCiAgICAgICAgMHgxNmQwMDAwMDE2ZSwKICAgICAgICAweDE2ZjAwMDAwMTcwLAogICAgICAgIDB4MTcxMDAwMDAxNzIsCiAgICAgICAgMHgxNzMwMDAwMDE3NCwKICAgICAgICAweDE3NTAwMDAwMTc2LAogICAgICAgIDB4MTc3MDAwMDAxNzgsCiAgICAgICAgMHgxN2EwMDAwMDE3YiwKICAgICAgICAweDE3YzAwMDAwMTdkLAogICAgICAgIDB4MTdlMDAwMDAxN2YsCiAgICAgICAgMHgxODAwMDAwMDE4MSwKICAgICAgICAweDE4MzAwMDAwMTg0LAogICAgICAgIDB4MTg1MDAwMDAxODYsCiAgICAgICAgMHgxODgwMDAwMDE4OSwKICAgICAgICAweDE4YzAwMDAwMThlLAogICAgICAgIDB4MTkyMDAwMDAxOTMsCiAgICAgICAgMHgxOTUwMDAwMDE5NiwKICAgICAgICAweDE5OTAwMDAwMTljLAogICAgICAgIDB4MTllMDAwMDAxOWYsCiAgICAgICAgMHgxYTEwMDAwMDFhMiwKICAgICAgICAweDFhMzAwMDAwMWE0LAogICAgICAgIDB4MWE1MDAwMDAxYTYsCiAgICAgICAgMHgxYTgwMDAwMDFhOSwKICAgICAgICAweDFhYTAwMDAwMWFjLAogICAgICAgIDB4MWFkMDAwMDAxYWUsCiAgICAgICAgMHgxYjAwMDAwMDFiMSwKICAgICAgICAweDFiNDAwMDAwMWI1LAogICAgICAgIDB4MWI2MDAwMDAxYjcsCiAgICAgICAgMHgxYjkwMDAwMDFiYywKICAgICAgICAweDFiZDAwMDAwMWM0LAogICAgICAgIDB4MWNlMDAwMDAxY2YsCiAgICAgICAgMHgxZDAwMDAwMDFkMSwKICAgICAgICAweDFkMjAwMDAwMWQzLAogICAgICAgIDB4MWQ0MDAwMDAxZDUsCiAgICAgICAgMHgxZDYwMDAwMDFkNywKICAgICAgICAweDFkODAwMDAwMWQ5LAogICAgICAgIDB4MWRhMDAwMDAxZGIsCiAgICAgICAgMHgxZGMwMDAwMDFkZSwKICAgICAgICAweDFkZjAwMDAwMWUwLAogICAgICAgIDB4MWUxMDAwMDAxZTIsCiAgICAgICAgMHgxZTMwMDAwMDFlNCwKICAgICAgICAweDFlNTAwMDAwMWU2LAogICAgICAgIDB4MWU3MDAwMDAxZTgsCiAgICAgICAgMHgxZTkwMDAwMDFlYSwKICAgICAgICAweDFlYjAwMDAwMWVjLAogICAgICAgIDB4MWVkMDAwMDAxZWUsCiAgICAgICAgMHgxZWYwMDAwMDFmMSwKICAgICAgICAweDFmNTAwMDAwMWY2LAogICAgICAgIDB4MWY5MDAwMDAxZmEsCiAgICAgICAgMHgxZmIwMDAwMDFmYywKICAgICAgICAweDFmZDAwMDAwMWZlLAogICAgICAgIDB4MWZmMDAwMDAyMDAsCiAgICAgICAgMHgyMDEwMDAwMDIwMiwKICAgICAgICAweDIwMzAwMDAwMjA0LAogICAgICAgIDB4MjA1MDAwMDAyMDYsCiAgICAgICAgMHgyMDcwMDAwMDIwOCwKICAgICAgICAweDIwOTAwMDAwMjBhLAogICAgICAgIDB4MjBiMDAwMDAyMGMsCiAgICAgICAgMHgyMGQwMDAwMDIwZSwKICAgICAgICAweDIwZjAwMDAwMjEwLAogICAgICAgIDB4MjExMDAwMDAyMTIsCiAgICAgICAgMHgyMTMwMDAwMDIxNCwKICAgICAgICAweDIxNTAwMDAwMjE2LAogICAgICAgIDB4MjE3MDAwMDAyMTgsCiAgICAgICAgMHgyMTkwMDAwMDIxYSwKICAgICAgICAweDIxYjAwMDAwMjFjLAogICAgICAgIDB4MjFkMDAwMDAyMWUsCiAgICAgICAgMHgyMWYwMDAwMDIyMCwKICAgICAgICAweDIyMTAwMDAwMjIyLAogICAgICAgIDB4MjIzMDAwMDAyMjQsCiAgICAgICAgMHgyMjUwMDAwMDIyNiwKICAgICAgICAweDIyNzAwMDAwMjI4LAogICAgICAgIDB4MjI5MDAwMDAyMmEsCiAgICAgICAgMHgyMmIwMDAwMDIyYywKICAgICAgICAweDIyZDAwMDAwMjJlLAogICAgICAgIDB4MjJmMDAwMDAyMzAsCiAgICAgICAgMHgyMzEwMDAwMDIzMiwKICAgICAgICAweDIzMzAwMDAwMjNhLAogICAgICAgIDB4MjNjMDAwMDAyM2QsCiAgICAgICAgMHgyM2YwMDAwMDI0MSwKICAgICAgICAweDI0MjAwMDAwMjQzLAogICAgICAgIDB4MjQ3MDAwMDAyNDgsCiAgICAgICAgMHgyNDkwMDAwMDI0YSwKICAgICAgICAweDI0YjAwMDAwMjRjLAogICAgICAgIDB4MjRkMDAwMDAyNGUsCiAgICAgICAgMHgyNGYwMDAwMDJiMCwKICAgICAgICAweDJiOTAwMDAwMmMyLAogICAgICAgIDB4MmM2MDAwMDAyZDIsCiAgICAgICAgMHgyZWMwMDAwMDJlZCwKICAgICAgICAweDJlZTAwMDAwMmVmLAogICAgICAgIDB4MzAwMDAwMDAzNDAsCiAgICAgICAgMHgzNDIwMDAwMDM0MywKICAgICAgICAweDM0NjAwMDAwMzRmLAogICAgICAgIDB4MzUwMDAwMDAzNzAsCiAgICAgICAgMHgzNzEwMDAwMDM3MiwKICAgICAgICAweDM3MzAwMDAwMzc0LAogICAgICAgIDB4Mzc3MDAwMDAzNzgsCiAgICAgICAgMHgzN2IwMDAwMDM3ZSwKICAgICAgICAweDM5MDAwMDAwMzkxLAogICAgICAgIDB4M2FjMDAwMDAzY2YsCiAgICAgICAgMHgzZDcwMDAwMDNkOCwKICAgICAgICAweDNkOTAwMDAwM2RhLAogICAgICAgIDB4M2RiMDAwMDAzZGMsCiAgICAgICAgMHgzZGQwMDAwMDNkZSwKICAgICAgICAweDNkZjAwMDAwM2UwLAogICAgICAgIDB4M2UxMDAwMDAzZTIsCiAgICAgICAgMHgzZTMwMDAwMDNlNCwKICAgICAgICAweDNlNTAwMDAwM2U2LAogICAgICAgIDB4M2U3MDAwMDAzZTgsCiAgICAgICAgMHgzZTkwMDAwMDNlYSwKICAgICAgICAweDNlYjAwMDAwM2VjLAogICAgICAgIDB4M2VkMDAwMDAzZWUsCiAgICAgICAgMHgzZWYwMDAwMDNmMCwKICAgICAgICAweDNmMzAwMDAwM2Y0LAogICAgICAgIDB4M2Y4MDAwMDAzZjksCiAgICAgICAgMHgzZmIwMDAwMDNmZCwKICAgICAgICAweDQzMDAwMDAwNDYwLAogICAgICAgIDB4NDYxMDAwMDA0NjIsCiAgICAgICAgMHg0NjMwMDAwMDQ2NCwKICAgICAgICAweDQ2NTAwMDAwNDY2LAogICAgICAgIDB4NDY3MDAwMDA0NjgsCiAgICAgICAgMHg0NjkwMDAwMDQ2YSwKICAgICAgICAweDQ2YjAwMDAwNDZjLAogICAgICAgIDB4NDZkMDAwMDA0NmUsCiAgICAgICAgMHg0NmYwMDAwMDQ3MCwKICAgICAgICAweDQ3MTAwMDAwNDcyLAogICAgICAgIDB4NDczMDAwMDA0NzQsCiAgICAgICAgMHg0NzUwMDAwMDQ3NiwKICAgICAgICAweDQ3NzAwMDAwNDc4LAogICAgICAgIDB4NDc5MDAwMDA0N2EsCiAgICAgICAgMHg0N2IwMDAwMDQ3YywKICAgICAgICAweDQ3ZDAwMDAwNDdlLAogICAgICAgIDB4NDdmMDAwMDA0ODAsCiAgICAgICAgMHg0ODEwMDAwMDQ4MiwKICAgICAgICAweDQ4MzAwMDAwNDg4LAogICAgICAgIDB4NDhiMDAwMDA0OGMsCiAgICAgICAgMHg0OGQwMDAwMDQ4ZSwKICAgICAgICAweDQ4ZjAwMDAwNDkwLAogICAgICAgIDB4NDkxMDAwMDA0OTIsCiAgICAgICAgMHg0OTMwMDAwMDQ5NCwKICAgICAgICAweDQ5NTAwMDAwNDk2LAogICAgICAgIDB4NDk3MDAwMDA0OTgsCiAgICAgICAgMHg0OTkwMDAwMDQ5YSwKICAgICAgICAweDQ5YjAwMDAwNDljLAogICAgICAgIDB4NDlkMDAwMDA0OWUsCiAgICAgICAgMHg0OWYwMDAwMDRhMCwKICAgICAgICAweDRhMTAwMDAwNGEyLAogICAgICAgIDB4NGEzMDAwMDA0YTQsCiAgICAgICAgMHg0YTUwMDAwMDRhNiwKICAgICAgICAweDRhNzAwMDAwNGE4LAogICAgICAgIDB4NGE5MDAwMDA0YWEsCiAgICAgICAgMHg0YWIwMDAwMDRhYywKICAgICAgICAweDRhZDAwMDAwNGFlLAogICAgICAgIDB4NGFmMDAwMDA0YjAsCiAgICAgICAgMHg0YjEwMDAwMDRiMiwKICAgICAgICAweDRiMzAwMDAwNGI0LAogICAgICAgIDB4NGI1MDAwMDA0YjYsCiAgICAgICAgMHg0YjcwMDAwMDRiOCwKICAgICAgICAweDRiOTAwMDAwNGJhLAogICAgICAgIDB4NGJiMDAwMDA0YmMsCiAgICAgICAgMHg0YmQwMDAwMDRiZSwKICAgICAgICAweDRiZjAwMDAwNGMwLAogICAgICAgIDB4NGMyMDAwMDA0YzMsCiAgICAgICAgMHg0YzQwMDAwMDRjNSwKICAgICAgICAweDRjNjAwMDAwNGM3LAogICAgICAgIDB4NGM4MDAwMDA0YzksCiAgICAgICAgMHg0Y2EwMDAwMDRjYiwKICAgICAgICAweDRjYzAwMDAwNGNkLAogICAgICAgIDB4NGNlMDAwMDA0ZDAsCiAgICAgICAgMHg0ZDEwMDAwMDRkMiwKICAgICAgICAweDRkMzAwMDAwNGQ0LAogICAgICAgIDB4NGQ1MDAwMDA0ZDYsCiAgICAgICAgMHg0ZDcwMDAwMDRkOCwKICAgICAgICAweDRkOTAwMDAwNGRhLAogICAgICAgIDB4NGRiMDAwMDA0ZGMsCiAgICAgICAgMHg0ZGQwMDAwMDRkZSwKICAgICAgICAweDRkZjAwMDAwNGUwLAogICAgICAgIDB4NGUxMDAwMDA0ZTIsCiAgICAgICAgMHg0ZTMwMDAwMDRlNCwKICAgICAgICAweDRlNTAwMDAwNGU2LAogICAgICAgIDB4NGU3MDAwMDA0ZTgsCiAgICAgICAgMHg0ZTkwMDAwMDRlYSwKICAgICAgICAweDRlYjAwMDAwNGVjLAogICAgICAgIDB4NGVkMDAwMDA0ZWUsCiAgICAgICAgMHg0ZWYwMDAwMDRmMCwKICAgICAgICAweDRmMTAwMDAwNGYyLAogICAgICAgIDB4NGYzMDAwMDA0ZjQsCiAgICAgICAgMHg0ZjUwMDAwMDRmNiwKICAgICAgICAweDRmNzAwMDAwNGY4LAogICAgICAgIDB4NGY5MDAwMDA0ZmEsCiAgICAgICAgMHg0ZmIwMDAwMDRmYywKICAgICAgICAweDRmZDAwMDAwNGZlLAogICAgICAgIDB4NGZmMDAwMDA1MDAsCiAgICAgICAgMHg1MDEwMDAwMDUwMiwKICAgICAgICAweDUwMzAwMDAwNTA0LAogICAgICAgIDB4NTA1MDAwMDA1MDYsCiAgICAgICAgMHg1MDcwMDAwMDUwOCwKICAgICAgICAweDUwOTAwMDAwNTBhLAogICAgICAgIDB4NTBiMDAwMDA1MGMsCiAgICAgICAgMHg1MGQwMDAwMDUwZSwKICAgICAgICAweDUwZjAwMDAwNTEwLAogICAgICAgIDB4NTExMDAwMDA1MTIsCiAgICAgICAgMHg1MTMwMDAwMDUxNCwKICAgICAgICAweDUxNTAwMDAwNTE2LAogICAgICAgIDB4NTE3MDAwMDA1MTgsCiAgICAgICAgMHg1MTkwMDAwMDUxYSwKICAgICAgICAweDUxYjAwMDAwNTFjLAogICAgICAgIDB4NTFkMDAwMDA1MWUsCiAgICAgICAgMHg1MWYwMDAwMDUyMCwKICAgICAgICAweDUyMTAwMDAwNTIyLAogICAgICAgIDB4NTIzMDAwMDA1MjQsCiAgICAgICAgMHg1MjUwMDAwMDUyNiwKICAgICAgICAweDUyNzAwMDAwNTI4LAogICAgICAgIDB4NTU5MDAwMDA1NWEsCiAgICAgICAgMHg1NjEwMDAwMDU4NywKICAgICAgICAweDU5MTAwMDAwNWJlLAogICAgICAgIDB4NWJmMDAwMDA1YzAsCiAgICAgICAgMHg1YzEwMDAwMDVjMywKICAgICAgICAweDVjNDAwMDAwNWM2LAogICAgICAgIDB4NWM3MDAwMDA1YzgsCiAgICAgICAgMHg1ZDAwMDAwMDVlYiwKICAgICAgICAweDVmMDAwMDAwNWYzLAogICAgICAgIDB4NjEwMDAwMDA2MWIsCiAgICAgICAgMHg2MjAwMDAwMDY0MCwKICAgICAgICAweDY0MTAwMDAwNjYwLAogICAgICAgIDB4NjZlMDAwMDA2NzUsCiAgICAgICAgMHg2NzkwMDAwMDZkNCwKICAgICAgICAweDZkNTAwMDAwNmRkLAogICAgICAgIDB4NmRmMDAwMDA2ZTksCiAgICAgICAgMHg2ZWEwMDAwMDZmMCwKICAgICAgICAweDZmYTAwMDAwNzAwLAogICAgICAgIDB4NzEwMDAwMDA3NGIsCiAgICAgICAgMHg3NGQwMDAwMDdiMiwKICAgICAgICAweDdjMDAwMDAwN2Y2LAogICAgICAgIDB4ODAwMDAwMDA4MmUsCiAgICAgICAgMHg4NDAwMDAwMDg1YywKICAgICAgICAweDhhMDAwMDAwOGExLAogICAgICAgIDB4OGEyMDAwMDA4YWQsCiAgICAgICAgMHg4ZTQwMDAwMDhmZiwKICAgICAgICAweDkwMDAwMDAwOTU4LAogICAgICAgIDB4OTYwMDAwMDA5NjQsCiAgICAgICAgMHg5NjYwMDAwMDk3MCwKICAgICAgICAweDk3MTAwMDAwOTc4LAogICAgICAgIDB4OTc5MDAwMDA5ODAsCiAgICAgICAgMHg5ODEwMDAwMDk4NCwKICAgICAgICAweDk4NTAwMDAwOThkLAogICAgICAgIDB4OThmMDAwMDA5OTEsCiAgICAgICAgMHg5OTMwMDAwMDlhOSwKICAgICAgICAweDlhYTAwMDAwOWIxLAogICAgICAgIDB4OWIyMDAwMDA5YjMsCiAgICAgICAgMHg5YjYwMDAwMDliYSwKICAgICAgICAweDliYzAwMDAwOWM1LAogICAgICAgIDB4OWM3MDAwMDA5YzksCiAgICAgICAgMHg5Y2IwMDAwMDljZiwKICAgICAgICAweDlkNzAwMDAwOWQ4LAogICAgICAgIDB4OWUwMDAwMDA5ZTQsCiAgICAgICAgMHg5ZTYwMDAwMDlmMiwKICAgICAgICAweGEwMTAwMDAwYTA0LAogICAgICAgIDB4YTA1MDAwMDBhMGIsCiAgICAgICAgMHhhMGYwMDAwMGExMSwKICAgICAgICAweGExMzAwMDAwYTI5LAogICAgICAgIDB4YTJhMDAwMDBhMzEsCiAgICAgICAgMHhhMzIwMDAwMGEzMywKICAgICAgICAweGEzNTAwMDAwYTM2LAogICAgICAgIDB4YTM4MDAwMDBhM2EsCiAgICAgICAgMHhhM2MwMDAwMGEzZCwKICAgICAgICAweGEzZTAwMDAwYTQzLAogICAgICAgIDB4YTQ3MDAwMDBhNDksCiAgICAgICAgMHhhNGIwMDAwMGE0ZSwKICAgICAgICAweGE1MTAwMDAwYTUyLAogICAgICAgIDB4YTVjMDAwMDBhNWQsCiAgICAgICAgMHhhNjYwMDAwMGE3NiwKICAgICAgICAweGE4MTAwMDAwYTg0LAogICAgICAgIDB4YTg1MDAwMDBhOGUsCiAgICAgICAgMHhhOGYwMDAwMGE5MiwKICAgICAgICAweGE5MzAwMDAwYWE5LAogICAgICAgIDB4YWFhMDAwMDBhYjEsCiAgICAgICAgMHhhYjIwMDAwMGFiNCwKICAgICAgICAweGFiNTAwMDAwYWJhLAogICAgICAgIDB4YWJjMDAwMDBhYzYsCiAgICAgICAgMHhhYzcwMDAwMGFjYSwKICAgICAgICAweGFjYjAwMDAwYWNlLAogICAgICAgIDB4YWQwMDAwMDBhZDEsCiAgICAgICAgMHhhZTAwMDAwMGFlNCwKICAgICAgICAweGFlNjAwMDAwYWYwLAogICAgICAgIDB4YjAxMDAwMDBiMDQsCiAgICAgICAgMHhiMDUwMDAwMGIwZCwKICAgICAgICAweGIwZjAwMDAwYjExLAogICAgICAgIDB4YjEzMDAwMDBiMjksCiAgICAgICAgMHhiMmEwMDAwMGIzMSwKICAgICAgICAweGIzMjAwMDAwYjM0LAogICAgICAgIDB4YjM1MDAwMDBiM2EsCiAgICAgICAgMHhiM2MwMDAwMGI0NSwKICAgICAgICAweGI0NzAwMDAwYjQ5LAogICAgICAgIDB4YjRiMDAwMDBiNGUsCiAgICAgICAgMHhiNTYwMDAwMGI1OCwKICAgICAgICAweGI1ZjAwMDAwYjY0LAogICAgICAgIDB4YjY2MDAwMDBiNzAsCiAgICAgICAgMHhiNzEwMDAwMGI3MiwKICAgICAgICAweGI4MjAwMDAwYjg0LAogICAgICAgIDB4Yjg1MDAwMDBiOGIsCiAgICAgICAgMHhiOGUwMDAwMGI5MSwKICAgICAgICAweGI5MjAwMDAwYjk2LAogICAgICAgIDB4Yjk5MDAwMDBiOWIsCiAgICAgICAgMHhiOWMwMDAwMGI5ZCwKICAgICAgICAweGI5ZTAwMDAwYmEwLAogICAgICAgIDB4YmEzMDAwMDBiYTUsCiAgICAgICAgMHhiYTgwMDAwMGJhYiwKICAgICAgICAweGJhZTAwMDAwYmJhLAogICAgICAgIDB4YmJlMDAwMDBiYzMsCiAgICAgICAgMHhiYzYwMDAwMGJjOSwKICAgICAgICAweGJjYTAwMDAwYmNlLAogICAgICAgIDB4YmQwMDAwMDBiZDEsCiAgICAgICAgMHhiZDcwMDAwMGJkOCwKICAgICAgICAweGJlNjAwMDAwYmYwLAogICAgICAgIDB4YzAxMDAwMDBjMDQsCiAgICAgICAgMHhjMDUwMDAwMGMwZCwKICAgICAgICAweGMwZTAwMDAwYzExLAogICAgICAgIDB4YzEyMDAwMDBjMjksCiAgICAgICAgMHhjMmEwMDAwMGMzNCwKICAgICAgICAweGMzNTAwMDAwYzNhLAogICAgICAgIDB4YzNkMDAwMDBjNDUsCiAgICAgICAgMHhjNDYwMDAwMGM0OSwKICAgICAgICAweGM0YTAwMDAwYzRlLAogICAgICAgIDB4YzU1MDAwMDBjNTcsCiAgICAgICAgMHhjNTgwMDAwMGM1YSwKICAgICAgICAweGM2MDAwMDAwYzY0LAogICAgICAgIDB4YzY2MDAwMDBjNzAsCiAgICAgICAgMHhjODIwMDAwMGM4NCwKICAgICAgICAweGM4NTAwMDAwYzhkLAogICAgICAgIDB4YzhlMDAwMDBjOTEsCiAgICAgICAgMHhjOTIwMDAwMGNhOSwKICAgICAgICAweGNhYTAwMDAwY2I0LAogICAgICAgIDB4Y2I1MDAwMDBjYmEsCiAgICAgICAgMHhjYmMwMDAwMGNjNSwKICAgICAgICAweGNjNjAwMDAwY2M5LAogICAgICAgIDB4Y2NhMDAwMDBjY2UsCiAgICAgICAgMHhjZDUwMDAwMGNkNywKICAgICAgICAweGNkZTAwMDAwY2RmLAogICAgICAgIDB4Y2UwMDAwMDBjZTQsCiAgICAgICAgMHhjZTYwMDAwMGNmMCwKICAgICAgICAweGNmMTAwMDAwY2YzLAogICAgICAgIDB4ZDAyMDAwMDBkMDQsCiAgICAgICAgMHhkMDUwMDAwMGQwZCwKICAgICAgICAweGQwZTAwMDAwZDExLAogICAgICAgIDB4ZDEyMDAwMDBkM2IsCiAgICAgICAgMHhkM2QwMDAwMGQ0NSwKICAgICAgICAweGQ0NjAwMDAwZDQ5LAogICAgICAgIDB4ZDRhMDAwMDBkNGYsCiAgICAgICAgMHhkNTcwMDAwMGQ1OCwKICAgICAgICAweGQ2MDAwMDAwZDY0LAogICAgICAgIDB4ZDY2MDAwMDBkNzAsCiAgICAgICAgMHhkN2EwMDAwMGQ4MCwKICAgICAgICAweGQ4MjAwMDAwZDg0LAogICAgICAgIDB4ZDg1MDAwMDBkOTcsCiAgICAgICAgMHhkOWEwMDAwMGRiMiwKICAgICAgICAweGRiMzAwMDAwZGJjLAogICAgICAgIDB4ZGJkMDAwMDBkYmUsCiAgICAgICAgMHhkYzAwMDAwMGRjNywKICAgICAgICAweGRjYTAwMDAwZGNiLAogICAgICAgIDB4ZGNmMDAwMDBkZDUsCiAgICAgICAgMHhkZDYwMDAwMGRkNywKICAgICAgICAweGRkODAwMDAwZGUwLAogICAgICAgIDB4ZGYyMDAwMDBkZjQsCiAgICAgICAgMHhlMDEwMDAwMGUzMywKICAgICAgICAweGUzNDAwMDAwZTNiLAogICAgICAgIDB4ZTQwMDAwMDBlNGYsCiAgICAgICAgMHhlNTAwMDAwMGU1YSwKICAgICAgICAweGU4MTAwMDAwZTgzLAogICAgICAgIDB4ZTg0MDAwMDBlODUsCiAgICAgICAgMHhlODcwMDAwMGU4OSwKICAgICAgICAweGU4YTAwMDAwZThiLAogICAgICAgIDB4ZThkMDAwMDBlOGUsCiAgICAgICAgMHhlOTQwMDAwMGU5OCwKICAgICAgICAweGU5OTAwMDAwZWEwLAogICAgICAgIDB4ZWExMDAwMDBlYTQsCiAgICAgICAgMHhlYTUwMDAwMGVhNiwKICAgICAgICAweGVhNzAwMDAwZWE4LAogICAgICAgIDB4ZWFhMDAwMDBlYWMsCiAgICAgICAgMHhlYWQwMDAwMGViMywKICAgICAgICAweGViNDAwMDAwZWJhLAogICAgICAgIDB4ZWJiMDAwMDBlYmUsCiAgICAgICAgMHhlYzAwMDAwMGVjNSwKICAgICAgICAweGVjNjAwMDAwZWM3LAogICAgICAgIDB4ZWM4MDAwMDBlY2UsCiAgICAgICAgMHhlZDAwMDAwMGVkYSwKICAgICAgICAweGVkZTAwMDAwZWUwLAogICAgICAgIDB4ZjAwMDAwMDBmMDEsCiAgICAgICAgMHhmMGIwMDAwMGYwYywKICAgICAgICAweGYxODAwMDAwZjFhLAogICAgICAgIDB4ZjIwMDAwMDBmMmEsCiAgICAgICAgMHhmMzUwMDAwMGYzNiwKICAgICAgICAweGYzNzAwMDAwZjM4LAogICAgICAgIDB4ZjM5MDAwMDBmM2EsCiAgICAgICAgMHhmM2UwMDAwMGY0MywKICAgICAgICAweGY0NDAwMDAwZjQ4LAogICAgICAgIDB4ZjQ5MDAwMDBmNGQsCiAgICAgICAgMHhmNGUwMDAwMGY1MiwKICAgICAgICAweGY1MzAwMDAwZjU3LAogICAgICAgIDB4ZjU4MDAwMDBmNWMsCiAgICAgICAgMHhmNWQwMDAwMGY2OSwKICAgICAgICAweGY2YTAwMDAwZjZkLAogICAgICAgIDB4ZjcxMDAwMDBmNzMsCiAgICAgICAgMHhmNzQwMDAwMGY3NSwKICAgICAgICAweGY3YTAwMDAwZjgxLAogICAgICAgIDB4ZjgyMDAwMDBmODUsCiAgICAgICAgMHhmODYwMDAwMGY5MywKICAgICAgICAweGY5NDAwMDAwZjk4LAogICAgICAgIDB4Zjk5MDAwMDBmOWQsCiAgICAgICAgMHhmOWUwMDAwMGZhMiwKICAgICAgICAweGZhMzAwMDAwZmE3LAogICAgICAgIDB4ZmE4MDAwMDBmYWMsCiAgICAgICAgMHhmYWQwMDAwMGZiOSwKICAgICAgICAweGZiYTAwMDAwZmJkLAogICAgICAgIDB4ZmM2MDAwMDBmYzcsCiAgICAgICAgMHgxMDAwMDAwMDEwNGEsCiAgICAgICAgMHgxMDUwMDAwMDEwOWUsCiAgICAgICAgMHgxMGQwMDAwMDEwZmIsCiAgICAgICAgMHgxMGZkMDAwMDExMDAsCiAgICAgICAgMHgxMjAwMDAwMDEyNDksCiAgICAgICAgMHgxMjRhMDAwMDEyNGUsCiAgICAgICAgMHgxMjUwMDAwMDEyNTcsCiAgICAgICAgMHgxMjU4MDAwMDEyNTksCiAgICAgICAgMHgxMjVhMDAwMDEyNWUsCiAgICAgICAgMHgxMjYwMDAwMDEyODksCiAgICAgICAgMHgxMjhhMDAwMDEyOGUsCiAgICAgICAgMHgxMjkwMDAwMDEyYjEsCiAgICAgICAgMHgxMmIyMDAwMDEyYjYsCiAgICAgICAgMHgxMmI4MDAwMDEyYmYsCiAgICAgICAgMHgxMmMwMDAwMDEyYzEsCiAgICAgICAgMHgxMmMyMDAwMDEyYzYsCiAgICAgICAgMHgxMmM4MDAwMDEyZDcsCiAgICAgICAgMHgxMmQ4MDAwMDEzMTEsCiAgICAgICAgMHgxMzEyMDAwMDEzMTYsCiAgICAgICAgMHgxMzE4MDAwMDEzNWIsCiAgICAgICAgMHgxMzVkMDAwMDEzNjAsCiAgICAgICAgMHgxMzgwMDAwMDEzOTAsCiAgICAgICAgMHgxM2EwMDAwMDEzZjUsCiAgICAgICAgMHgxNDAxMDAwMDE2NmQsCiAgICAgICAgMHgxNjZmMDAwMDE2ODAsCiAgICAgICAgMHgxNjgxMDAwMDE2OWIsCiAgICAgICAgMHgxNmEwMDAwMDE2ZWIsCiAgICAgICAgMHgxNzAwMDAwMDE3MGQsCiAgICAgICAgMHgxNzBlMDAwMDE3MTUsCiAgICAgICAgMHgxNzIwMDAwMDE3MzUsCiAgICAgICAgMHgxNzQwMDAwMDE3NTQsCiAgICAgICAgMHgxNzYwMDAwMDE3NmQsCiAgICAgICAgMHgxNzZlMDAwMDE3NzEsCiAgICAgICAgMHgxNzcyMDAwMDE3NzQsCiAgICAgICAgMHgxNzgwMDAwMDE3YjQsCiAgICAgICAgMHgxN2I2MDAwMDE3ZDQsCiAgICAgICAgMHgxN2Q3MDAwMDE3ZDgsCiAgICAgICAgMHgxN2RjMDAwMDE3ZGUsCiAgICAgICAgMHgxN2UwMDAwMDE3ZWEsCiAgICAgICAgMHgxODEwMDAwMDE4MWEsCiAgICAgICAgMHgxODIwMDAwMDE4NzgsCiAgICAgICAgMHgxODgwMDAwMDE4YWIsCiAgICAgICAgMHgxOGIwMDAwMDE4ZjYsCiAgICAgICAgMHgxOTAwMDAwMDE5MWQsCiAgICAgICAgMHgxOTIwMDAwMDE5MmMsCiAgICAgICAgMHgxOTMwMDAwMDE5M2MsCiAgICAgICAgMHgxOTQ2MDAwMDE5NmUsCiAgICAgICAgMHgxOTcwMDAwMDE5NzUsCiAgICAgICAgMHgxOTgwMDAwMDE5YWMsCiAgICAgICAgMHgxOWIwMDAwMDE5Y2EsCiAgICAgICAgMHgxOWQwMDAwMDE5ZGEsCiAgICAgICAgMHgxYTAwMDAwMDFhMWMsCiAgICAgICAgMHgxYTIwMDAwMDFhNWYsCiAgICAgICAgMHgxYTYwMDAwMDFhN2QsCiAgICAgICAgMHgxYTdmMDAwMDFhOGEsCiAgICAgICAgMHgxYTkwMDAwMDFhOWEsCiAgICAgICAgMHgxYWE3MDAwMDFhYTgsCiAgICAgICAgMHgxYjAwMDAwMDFiNGMsCiAgICAgICAgMHgxYjUwMDAwMDFiNWEsCiAgICAgICAgMHgxYjZiMDAwMDFiNzQsCiAgICAgICAgMHgxYjgwMDAwMDFiZjQsCiAgICAgICAgMHgxYzAwMDAwMDFjMzgsCiAgICAgICAgMHgxYzQwMDAwMDFjNGEsCiAgICAgICAgMHgxYzRkMDAwMDFjN2UsCiAgICAgICAgMHgxY2QwMDAwMDFjZDMsCiAgICAgICAgMHgxY2Q0MDAwMDFjZjcsCiAgICAgICAgMHgxZDAwMDAwMDFkMmMsCiAgICAgICAgMHgxZDJmMDAwMDFkMzAsCiAgICAgICAgMHgxZDNiMDAwMDFkM2MsCiAgICAgICAgMHgxZDRlMDAwMDFkNGYsCiAgICAgICAgMHgxZDZiMDAwMDFkNzgsCiAgICAgICAgMHgxZDc5MDAwMDFkOWIsCiAgICAgICAgMHgxZGMwMDAwMDFkZTcsCiAgICAgICAgMHgxZGZjMDAwMDFlMDAsCiAgICAgICAgMHgxZTAxMDAwMDFlMDIsCiAgICAgICAgMHgxZTAzMDAwMDFlMDQsCiAgICAgICAgMHgxZTA1MDAwMDFlMDYsCiAgICAgICAgMHgxZTA3MDAwMDFlMDgsCiAgICAgICAgMHgxZTA5MDAwMDFlMGEsCiAgICAgICAgMHgxZTBiMDAwMDFlMGMsCiAgICAgICAgMHgxZTBkMDAwMDFlMGUsCiAgICAgICAgMHgxZTBmMDAwMDFlMTAsCiAgICAgICAgMHgxZTExMDAwMDFlMTIsCiAgICAgICAgMHgxZTEzMDAwMDFlMTQsCiAgICAgICAgMHgxZTE1MDAwMDFlMTYsCiAgICAgICAgMHgxZTE3MDAwMDFlMTgsCiAgICAgICAgMHgxZTE5MDAwMDFlMWEsCiAgICAgICAgMHgxZTFiMDAwMDFlMWMsCiAgICAgICAgMHgxZTFkMDAwMDFlMWUsCiAgICAgICAgMHgxZTFmMDAwMDFlMjAsCiAgICAgICAgMHgxZTIxMDAwMDFlMjIsCiAgICAgICAgMHgxZTIzMDAwMDFlMjQsCiAgICAgICAgMHgxZTI1MDAwMDFlMjYsCiAgICAgICAgMHgxZTI3MDAwMDFlMjgsCiAgICAgICAgMHgxZTI5MDAwMDFlMmEsCiAgICAgICAgMHgxZTJiMDAwMDFlMmMsCiAgICAgICAgMHgxZTJkMDAwMDFlMmUsCiAgICAgICAgMHgxZTJmMDAwMDFlMzAsCiAgICAgICAgMHgxZTMxMDAwMDFlMzIsCiAgICAgICAgMHgxZTMzMDAwMDFlMzQsCiAgICAgICAgMHgxZTM1MDAwMDFlMzYsCiAgICAgICAgMHgxZTM3MDAwMDFlMzgsCiAgICAgICAgMHgxZTM5MDAwMDFlM2EsCiAgICAgICAgMHgxZTNiMDAwMDFlM2MsCiAgICAgICAgMHgxZTNkMDAwMDFlM2UsCiAgICAgICAgMHgxZTNmMDAwMDFlNDAsCiAgICAgICAgMHgxZTQxMDAwMDFlNDIsCiAgICAgICAgMHgxZTQzMDAwMDFlNDQsCiAgICAgICAgMHgxZTQ1MDAwMDFlNDYsCiAgICAgICAgMHgxZTQ3MDAwMDFlNDgsCiAgICAgICAgMHgxZTQ5MDAwMDFlNGEsCiAgICAgICAgMHgxZTRiMDAwMDFlNGMsCiAgICAgICAgMHgxZTRkMDAwMDFlNGUsCiAgICAgICAgMHgxZTRmMDAwMDFlNTAsCiAgICAgICAgMHgxZTUxMDAwMDFlNTIsCiAgICAgICAgMHgxZTUzMDAwMDFlNTQsCiAgICAgICAgMHgxZTU1MDAwMDFlNTYsCiAgICAgICAgMHgxZTU3MDAwMDFlNTgsCiAgICAgICAgMHgxZTU5MDAwMDFlNWEsCiAgICAgICAgMHgxZTViMDAwMDFlNWMsCiAgICAgICAgMHgxZTVkMDAwMDFlNWUsCiAgICAgICAgMHgxZTVmMDAwMDFlNjAsCiAgICAgICAgMHgxZTYxMDAwMDFlNjIsCiAgICAgICAgMHgxZTYzMDAwMDFlNjQsCiAgICAgICAgMHgxZTY1MDAwMDFlNjYsCiAgICAgICAgMHgxZTY3MDAwMDFlNjgsCiAgICAgICAgMHgxZTY5MDAwMDFlNmEsCiAgICAgICAgMHgxZTZiMDAwMDFlNmMsCiAgICAgICAgMHgxZTZkMDAwMDFlNmUsCiAgICAgICAgMHgxZTZmMDAwMDFlNzAsCiAgICAgICAgMHgxZTcxMDAwMDFlNzIsCiAgICAgICAgMHgxZTczMDAwMDFlNzQsCiAgICAgICAgMHgxZTc1MDAwMDFlNzYsCiAgICAgICAgMHgxZTc3MDAwMDFlNzgsCiAgICAgICAgMHgxZTc5MDAwMDFlN2EsCiAgICAgICAgMHgxZTdiMDAwMDFlN2MsCiAgICAgICAgMHgxZTdkMDAwMDFlN2UsCiAgICAgICAgMHgxZTdmMDAwMDFlODAsCiAgICAgICAgMHgxZTgxMDAwMDFlODIsCiAgICAgICAgMHgxZTgzMDAwMDFlODQsCiAgICAgICAgMHgxZTg1MDAwMDFlODYsCiAgICAgICAgMHgxZTg3MDAwMDFlODgsCiAgICAgICAgMHgxZTg5MDAwMDFlOGEsCiAgICAgICAgMHgxZThiMDAwMDFlOGMsCiAgICAgICAgMHgxZThkMDAwMDFlOGUsCiAgICAgICAgMHgxZThmMDAwMDFlOTAsCiAgICAgICAgMHgxZTkxMDAwMDFlOTIsCiAgICAgICAgMHgxZTkzMDAwMDFlOTQsCiAgICAgICAgMHgxZTk1MDAwMDFlOWEsCiAgICAgICAgMHgxZTljMDAwMDFlOWUsCiAgICAgICAgMHgxZTlmMDAwMDFlYTAsCiAgICAgICAgMHgxZWExMDAwMDFlYTIsCiAgICAgICAgMHgxZWEzMDAwMDFlYTQsCiAgICAgICAgMHgxZWE1MDAwMDFlYTYsCiAgICAgICAgMHgxZWE3MDAwMDFlYTgsCiAgICAgICAgMHgxZWE5MDAwMDFlYWEsCiAgICAgICAgMHgxZWFiMDAwMDFlYWMsCiAgICAgICAgMHgxZWFkMDAwMDFlYWUsCiAgICAgICAgMHgxZWFmMDAwMDFlYjAsCiAgICAgICAgMHgxZWIxMDAwMDFlYjIsCiAgICAgICAgMHgxZWIzMDAwMDFlYjQsCiAgICAgICAgMHgxZWI1MDAwMDFlYjYsCiAgICAgICAgMHgxZWI3MDAwMDFlYjgsCiAgICAgICAgMHgxZWI5MDAwMDFlYmEsCiAgICAgICAgMHgxZWJiMDAwMDFlYmMsCiAgICAgICAgMHgxZWJkMDAwMDFlYmUsCiAgICAgICAgMHgxZWJmMDAwMDFlYzAsCiAgICAgICAgMHgxZWMxMDAwMDFlYzIsCiAgICAgICAgMHgxZWMzMDAwMDFlYzQsCiAgICAgICAgMHgxZWM1MDAwMDFlYzYsCiAgICAgICAgMHgxZWM3MDAwMDFlYzgsCiAgICAgICAgMHgxZWM5MDAwMDFlY2EsCiAgICAgICAgMHgxZWNiMDAwMDFlY2MsCiAgICAgICAgMHgxZWNkMDAwMDFlY2UsCiAgICAgICAgMHgxZWNmMDAwMDFlZDAsCiAgICAgICAgMHgxZWQxMDAwMDFlZDIsCiAgICAgICAgMHgxZWQzMDAwMDFlZDQsCiAgICAgICAgMHgxZWQ1MDAwMDFlZDYsCiAgICAgICAgMHgxZWQ3MDAwMDFlZDgsCiAgICAgICAgMHgxZWQ5MDAwMDFlZGEsCiAgICAgICAgMHgxZWRiMDAwMDFlZGMsCiAgICAgICAgMHgxZWRkMDAwMDFlZGUsCiAgICAgICAgMHgxZWRmMDAwMDFlZTAsCiAgICAgICAgMHgxZWUxMDAwMDFlZTIsCiAgICAgICAgMHgxZWUzMDAwMDFlZTQsCiAgICAgICAgMHgxZWU1MDAwMDFlZTYsCiAgICAgICAgMHgxZWU3MDAwMDFlZTgsCiAgICAgICAgMHgxZWU5MDAwMDFlZWEsCiAgICAgICAgMHgxZWViMDAwMDFlZWMsCiAgICAgICAgMHgxZWVkMDAwMDFlZWUsCiAgICAgICAgMHgxZWVmMDAwMDFlZjAsCiAgICAgICAgMHgxZWYxMDAwMDFlZjIsCiAgICAgICAgMHgxZWYzMDAwMDFlZjQsCiAgICAgICAgMHgxZWY1MDAwMDFlZjYsCiAgICAgICAgMHgxZWY3MDAwMDFlZjgsCiAgICAgICAgMHgxZWY5MDAwMDFlZmEsCiAgICAgICAgMHgxZWZiMDAwMDFlZmMsCiAgICAgICAgMHgxZWZkMDAwMDFlZmUsCiAgICAgICAgMHgxZWZmMDAwMDFmMDgsCiAgICAgICAgMHgxZjEwMDAwMDFmMTYsCiAgICAgICAgMHgxZjIwMDAwMDFmMjgsCiAgICAgICAgMHgxZjMwMDAwMDFmMzgsCiAgICAgICAgMHgxZjQwMDAwMDFmNDYsCiAgICAgICAgMHgxZjUwMDAwMDFmNTgsCiAgICAgICAgMHgxZjYwMDAwMDFmNjgsCiAgICAgICAgMHgxZjcwMDAwMDFmNzEsCiAgICAgICAgMHgxZjcyMDAwMDFmNzMsCiAgICAgICAgMHgxZjc0MDAwMDFmNzUsCiAgICAgICAgMHgxZjc2MDAwMDFmNzcsCiAgICAgICAgMHgxZjc4MDAwMDFmNzksCiAgICAgICAgMHgxZjdhMDAwMDFmN2IsCiAgICAgICAgMHgxZjdjMDAwMDFmN2QsCiAgICAgICAgMHgxZmIwMDAwMDFmYjIsCiAgICAgICAgMHgxZmI2MDAwMDFmYjcsCiAgICAgICAgMHgxZmM2MDAwMDFmYzcsCiAgICAgICAgMHgxZmQwMDAwMDFmZDMsCiAgICAgICAgMHgxZmQ2MDAwMDFmZDgsCiAgICAgICAgMHgxZmUwMDAwMDFmZTMsCiAgICAgICAgMHgxZmU0MDAwMDFmZTgsCiAgICAgICAgMHgxZmY2MDAwMDFmZjcsCiAgICAgICAgMHgyMTRlMDAwMDIxNGYsCiAgICAgICAgMHgyMTg0MDAwMDIxODUsCiAgICAgICAgMHgyYzMwMDAwMDJjNWYsCiAgICAgICAgMHgyYzYxMDAwMDJjNjIsCiAgICAgICAgMHgyYzY1MDAwMDJjNjcsCiAgICAgICAgMHgyYzY4MDAwMDJjNjksCiAgICAgICAgMHgyYzZhMDAwMDJjNmIsCiAgICAgICAgMHgyYzZjMDAwMDJjNmQsCiAgICAgICAgMHgyYzcxMDAwMDJjNzIsCiAgICAgICAgMHgyYzczMDAwMDJjNzUsCiAgICAgICAgMHgyYzc2MDAwMDJjN2MsCiAgICAgICAgMHgyYzgxMDAwMDJjODIsCiAgICAgICAgMHgyYzgzMDAwMDJjODQsCiAgICAgICAgMHgyYzg1MDAwMDJjODYsCiAgICAgICAgMHgyYzg3MDAwMDJjODgsCiAgICAgICAgMHgyYzg5MDAwMDJjOGEsCiAgICAgICAgMHgyYzhiMDAwMDJjOGMsCiAgICAgICAgMHgyYzhkMDAwMDJjOGUsCiAgICAgICAgMHgyYzhmMDAwMDJjOTAsCiAgICAgICAgMHgyYzkxMDAwMDJjOTIsCiAgICAgICAgMHgyYzkzMDAwMDJjOTQsCiAgICAgICAgMHgyYzk1MDAwMDJjOTYsCiAgICAgICAgMHgyYzk3MDAwMDJjOTgsCiAgICAgICAgMHgyYzk5MDAwMDJjOWEsCiAgICAgICAgMHgyYzliMDAwMDJjOWMsCiAgICAgICAgMHgyYzlkMDAwMDJjOWUsCiAgICAgICAgMHgyYzlmMDAwMDJjYTAsCiAgICAgICAgMHgyY2ExMDAwMDJjYTIsCiAgICAgICAgMHgyY2EzMDAwMDJjYTQsCiAgICAgICAgMHgyY2E1MDAwMDJjYTYsCiAgICAgICAgMHgyY2E3MDAwMDJjYTgsCiAgICAgICAgMHgyY2E5MDAwMDJjYWEsCiAgICAgICAgMHgyY2FiMDAwMDJjYWMsCiAgICAgICAgMHgyY2FkMDAwMDJjYWUsCiAgICAgICAgMHgyY2FmMDAwMDJjYjAsCiAgICAgICAgMHgyY2IxMDAwMDJjYjIsCiAgICAgICAgMHgyY2IzMDAwMDJjYjQsCiAgICAgICAgMHgyY2I1MDAwMDJjYjYsCiAgICAgICAgMHgyY2I3MDAwMDJjYjgsCiAgICAgICAgMHgyY2I5MDAwMDJjYmEsCiAgICAgICAgMHgyY2JiMDAwMDJjYmMsCiAgICAgICAgMHgyY2JkMDAwMDJjYmUsCiAgICAgICAgMHgyY2JmMDAwMDJjYzAsCiAgICAgICAgMHgyY2MxMDAwMDJjYzIsCiAgICAgICAgMHgyY2MzMDAwMDJjYzQsCiAgICAgICAgMHgyY2M1MDAwMDJjYzYsCiAgICAgICAgMHgyY2M3MDAwMDJjYzgsCiAgICAgICAgMHgyY2M5MDAwMDJjY2EsCiAgICAgICAgMHgyY2NiMDAwMDJjY2MsCiAgICAgICAgMHgyY2NkMDAwMDJjY2UsCiAgICAgICAgMHgyY2NmMDAwMDJjZDAsCiAgICAgICAgMHgyY2QxMDAwMDJjZDIsCiAgICAgICAgMHgyY2QzMDAwMDJjZDQsCiAgICAgICAgMHgyY2Q1MDAwMDJjZDYsCiAgICAgICAgMHgyY2Q3MDAwMDJjZDgsCiAgICAgICAgMHgyY2Q5MDAwMDJjZGEsCiAgICAgICAgMHgyY2RiMDAwMDJjZGMsCiAgICAgICAgMHgyY2RkMDAwMDJjZGUsCiAgICAgICAgMHgyY2RmMDAwMDJjZTAsCiAgICAgICAgMHgyY2UxMDAwMDJjZTIsCiAgICAgICAgMHgyY2UzMDAwMDJjZTUsCiAgICAgICAgMHgyY2VjMDAwMDJjZWQsCiAgICAgICAgMHgyY2VlMDAwMDJjZjIsCiAgICAgICAgMHgyY2YzMDAwMDJjZjQsCiAgICAgICAgMHgyZDAwMDAwMDJkMjYsCiAgICAgICAgMHgyZDI3MDAwMDJkMjgsCiAgICAgICAgMHgyZDJkMDAwMDJkMmUsCiAgICAgICAgMHgyZDMwMDAwMDJkNjgsCiAgICAgICAgMHgyZDdmMDAwMDJkOTcsCiAgICAgICAgMHgyZGEwMDAwMDJkYTcsCiAgICAgICAgMHgyZGE4MDAwMDJkYWYsCiAgICAgICAgMHgyZGIwMDAwMDJkYjcsCiAgICAgICAgMHgyZGI4MDAwMDJkYmYsCiAgICAgICAgMHgyZGMwMDAwMDJkYzcsCiAgICAgICAgMHgyZGM4MDAwMDJkY2YsCiAgICAgICAgMHgyZGQwMDAwMDJkZDcsCiAgICAgICAgMHgyZGQ4MDAwMDJkZGYsCiAgICAgICAgMHgyZGUwMDAwMDJlMDAsCiAgICAgICAgMHgyZTJmMDAwMDJlMzAsCiAgICAgICAgMHgzMDA1MDAwMDMwMDgsCiAgICAgICAgMHgzMDJhMDAwMDMwMmUsCiAgICAgICAgMHgzMDNjMDAwMDMwM2QsCiAgICAgICAgMHgzMDQxMDAwMDMwOTcsCiAgICAgICAgMHgzMDk5MDAwMDMwOWIsCiAgICAgICAgMHgzMDlkMDAwMDMwOWYsCiAgICAgICAgMHgzMGExMDAwMDMwZmIsCiAgICAgICAgMHgzMGZjMDAwMDMwZmYsCiAgICAgICAgMHgzMTA1MDAwMDMxMmUsCiAgICAgICAgMHgzMWEwMDAwMDMxYmIsCiAgICAgICAgMHgzMWYwMDAwMDMyMDAsCiAgICAgICAgMHgzNDAwMDAwMDRkYjYsCiAgICAgICAgMHg0ZTAwMDAwMDlmY2QsCiAgICAgICAgMHhhMDAwMDAwMGE0OGQsCiAgICAgICAgMHhhNGQwMDAwMGE0ZmUsCiAgICAgICAgMHhhNTAwMDAwMGE2MGQsCiAgICAgICAgMHhhNjEwMDAwMGE2MmMsCiAgICAgICAgMHhhNjQxMDAwMGE2NDIsCiAgICAgICAgMHhhNjQzMDAwMGE2NDQsCiAgICAgICAgMHhhNjQ1MDAwMGE2NDYsCiAgICAgICAgMHhhNjQ3MDAwMGE2NDgsCiAgICAgICAgMHhhNjQ5MDAwMGE2NGEsCiAgICAgICAgMHhhNjRiMDAwMGE2NGMsCiAgICAgICAgMHhhNjRkMDAwMGE2NGUsCiAgICAgICAgMHhhNjRmMDAwMGE2NTAsCiAgICAgICAgMHhhNjUxMDAwMGE2NTIsCiAgICAgICAgMHhhNjUzMDAwMGE2NTQsCiAgICAgICAgMHhhNjU1MDAwMGE2NTYsCiAgICAgICAgMHhhNjU3MDAwMGE2NTgsCiAgICAgICAgMHhhNjU5MDAwMGE2NWEsCiAgICAgICAgMHhhNjViMDAwMGE2NWMsCiAgICAgICAgMHhhNjVkMDAwMGE2NWUsCiAgICAgICAgMHhhNjVmMDAwMGE2NjAsCiAgICAgICAgMHhhNjYxMDAwMGE2NjIsCiAgICAgICAgMHhhNjYzMDAwMGE2NjQsCiAgICAgICAgMHhhNjY1MDAwMGE2NjYsCiAgICAgICAgMHhhNjY3MDAwMGE2NjgsCiAgICAgICAgMHhhNjY5MDAwMGE2NmEsCiAgICAgICAgMHhhNjZiMDAwMGE2NmMsCiAgICAgICAgMHhhNjZkMDAwMGE2NzAsCiAgICAgICAgMHhhNjc0MDAwMGE2N2UsCiAgICAgICAgMHhhNjdmMDAwMGE2ODAsCiAgICAgICAgMHhhNjgxMDAwMGE2ODIsCiAgICAgICAgMHhhNjgzMDAwMGE2ODQsCiAgICAgICAgMHhhNjg1MDAwMGE2ODYsCiAgICAgICAgMHhhNjg3MDAwMGE2ODgsCiAgICAgICAgMHhhNjg5MDAwMGE2OGEsCiAgICAgICAgMHhhNjhiMDAwMGE2OGMsCiAgICAgICAgMHhhNjhkMDAwMGE2OGUsCiAgICAgICAgMHhhNjhmMDAwMGE2OTAsCiAgICAgICAgMHhhNjkxMDAwMGE2OTIsCiAgICAgICAgMHhhNjkzMDAwMGE2OTQsCiAgICAgICAgMHhhNjk1MDAwMGE2OTYsCiAgICAgICAgMHhhNjk3MDAwMGE2OTgsCiAgICAgICAgMHhhNjlmMDAwMGE2ZTYsCiAgICAgICAgMHhhNmYwMDAwMGE2ZjIsCiAgICAgICAgMHhhNzE3MDAwMGE3MjAsCiAgICAgICAgMHhhNzIzMDAwMGE3MjQsCiAgICAgICAgMHhhNzI1MDAwMGE3MjYsCiAgICAgICAgMHhhNzI3MDAwMGE3MjgsCiAgICAgICAgMHhhNzI5MDAwMGE3MmEsCiAgICAgICAgMHhhNzJiMDAwMGE3MmMsCiAgICAgICAgMHhhNzJkMDAwMGE3MmUsCiAgICAgICAgMHhhNzJmMDAwMGE3MzIsCiAgICAgICAgMHhhNzMzMDAwMGE3MzQsCiAgICAgICAgMHhhNzM1MDAwMGE3MzYsCiAgICAgICAgMHhhNzM3MDAwMGE3MzgsCiAgICAgICAgMHhhNzM5MDAwMGE3M2EsCiAgICAgICAgMHhhNzNiMDAwMGE3M2MsCiAgICAgICAgMHhhNzNkMDAwMGE3M2UsCiAgICAgICAgMHhhNzNmMDAwMGE3NDAsCiAgICAgICAgMHhhNzQxMDAwMGE3NDIsCiAgICAgICAgMHhhNzQzMDAwMGE3NDQsCiAgICAgICAgMHhhNzQ1MDAwMGE3NDYsCiAgICAgICAgMHhhNzQ3MDAwMGE3NDgsCiAgICAgICAgMHhhNzQ5MDAwMGE3NGEsCiAgICAgICAgMHhhNzRiMDAwMGE3NGMsCiAgICAgICAgMHhhNzRkMDAwMGE3NGUsCiAgICAgICAgMHhhNzRmMDAwMGE3NTAsCiAgICAgICAgMHhhNzUxMDAwMGE3NTIsCiAgICAgICAgMHhhNzUzMDAwMGE3NTQsCiAgICAgICAgMHhhNzU1MDAwMGE3NTYsCiAgICAgICAgMHhhNzU3MDAwMGE3NTgsCiAgICAgICAgMHhhNzU5MDAwMGE3NWEsCiAgICAgICAgMHhhNzViMDAwMGE3NWMsCiAgICAgICAgMHhhNzVkMDAwMGE3NWUsCiAgICAgICAgMHhhNzVmMDAwMGE3NjAsCiAgICAgICAgMHhhNzYxMDAwMGE3NjIsCiAgICAgICAgMHhhNzYzMDAwMGE3NjQsCiAgICAgICAgMHhhNzY1MDAwMGE3NjYsCiAgICAgICAgMHhhNzY3MDAwMGE3NjgsCiAgICAgICAgMHhhNzY5MDAwMGE3NmEsCiAgICAgICAgMHhhNzZiMDAwMGE3NmMsCiAgICAgICAgMHhhNzZkMDAwMGE3NmUsCiAgICAgICAgMHhhNzZmMDAwMGE3NzAsCiAgICAgICAgMHhhNzcxMDAwMGE3NzksCiAgICAgICAgMHhhNzdhMDAwMGE3N2IsCiAgICAgICAgMHhhNzdjMDAwMGE3N2QsCiAgICAgICAgMHhhNzdmMDAwMGE3ODAsCiAgICAgICAgMHhhNzgxMDAwMGE3ODIsCiAgICAgICAgMHhhNzgzMDAwMGE3ODQsCiAgICAgICAgMHhhNzg1MDAwMGE3ODYsCiAgICAgICAgMHhhNzg3MDAwMGE3ODksCiAgICAgICAgMHhhNzhjMDAwMGE3OGQsCiAgICAgICAgMHhhNzhlMDAwMGE3OGYsCiAgICAgICAgMHhhNzkxMDAwMGE3OTIsCiAgICAgICAgMHhhNzkzMDAwMGE3OTQsCiAgICAgICAgMHhhN2ExMDAwMGE3YTIsCiAgICAgICAgMHhhN2EzMDAwMGE3YTQsCiAgICAgICAgMHhhN2E1MDAwMGE3YTYsCiAgICAgICAgMHhhN2E3MDAwMGE3YTgsCiAgICAgICAgMHhhN2E5MDAwMGE3YWEsCiAgICAgICAgMHhhN2ZhMDAwMGE4MjgsCiAgICAgICAgMHhhODQwMDAwMGE4NzQsCiAgICAgICAgMHhhODgwMDAwMGE4YzUsCiAgICAgICAgMHhhOGQwMDAwMGE4ZGEsCiAgICAgICAgMHhhOGUwMDAwMGE4ZjgsCiAgICAgICAgMHhhOGZiMDAwMGE4ZmMsCiAgICAgICAgMHhhOTAwMDAwMGE5MmUsCiAgICAgICAgMHhhOTMwMDAwMGE5NTQsCiAgICAgICAgMHhhOTgwMDAwMGE5YzEsCiAgICAgICAgMHhhOWNmMDAwMGE5ZGEsCiAgICAgICAgMHhhYTAwMDAwMGFhMzcsCiAgICAgICAgMHhhYTQwMDAwMGFhNGUsCiAgICAgICAgMHhhYTUwMDAwMGFhNWEsCiAgICAgICAgMHhhYTYwMDAwMGFhNzcsCiAgICAgICAgMHhhYTdhMDAwMGFhN2MsCiAgICAgICAgMHhhYTgwMDAwMGFhYzMsCiAgICAgICAgMHhhYWRiMDAwMGFhZGUsCiAgICAgICAgMHhhYWUwMDAwMGFhZjAsCiAgICAgICAgMHhhYWYyMDAwMGFhZjcsCiAgICAgICAgMHhhYjAxMDAwMGFiMDcsCiAgICAgICAgMHhhYjA5MDAwMGFiMGYsCiAgICAgICAgMHhhYjExMDAwMGFiMTcsCiAgICAgICAgMHhhYjIwMDAwMGFiMjcsCiAgICAgICAgMHhhYjI4MDAwMGFiMmYsCiAgICAgICAgMHhhYmMwMDAwMGFiZWIsCiAgICAgICAgMHhhYmVjMDAwMGFiZWUsCiAgICAgICAgMHhhYmYwMDAwMGFiZmEsCiAgICAgICAgMHhhYzAwMDAwMGQ3YTQsCiAgICAgICAgMHhmYTBlMDAwMGZhMTAsCiAgICAgICAgMHhmYTExMDAwMGZhMTIsCiAgICAgICAgMHhmYTEzMDAwMGZhMTUsCiAgICAgICAgMHhmYTFmMDAwMGZhMjAsCiAgICAgICAgMHhmYTIxMDAwMGZhMjIsCiAgICAgICAgMHhmYTIzMDAwMGZhMjUsCiAgICAgICAgMHhmYTI3MDAwMGZhMmEsCiAgICAgICAgMHhmYjFlMDAwMGZiMWYsCiAgICAgICAgMHhmZTIwMDAwMGZlMjcsCiAgICAgICAgMHhmZTczMDAwMGZlNzQsCiAgICAgICAgMHgxMDAwMDAwMDEwMDBjLAogICAgICAgIDB4MTAwMGQwMDAxMDAyNywKICAgICAgICAweDEwMDI4MDAwMTAwM2IsCiAgICAgICAgMHgxMDAzYzAwMDEwMDNlLAogICAgICAgIDB4MTAwM2YwMDAxMDA0ZSwKICAgICAgICAweDEwMDUwMDAwMTAwNWUsCiAgICAgICAgMHgxMDA4MDAwMDEwMGZiLAogICAgICAgIDB4MTAxZmQwMDAxMDFmZSwKICAgICAgICAweDEwMjgwMDAwMTAyOWQsCiAgICAgICAgMHgxMDJhMDAwMDEwMmQxLAogICAgICAgIDB4MTAzMDAwMDAxMDMxZiwKICAgICAgICAweDEwMzMwMDAwMTAzNDEsCiAgICAgICAgMHgxMDM0MjAwMDEwMzRhLAogICAgICAgIDB4MTAzODAwMDAxMDM5ZSwKICAgICAgICAweDEwM2EwMDAwMTAzYzQsCiAgICAgICAgMHgxMDNjODAwMDEwM2QwLAogICAgICAgIDB4MTA0MjgwMDAxMDQ5ZSwKICAgICAgICAweDEwNGEwMDAwMTA0YWEsCiAgICAgICAgMHgxMDgwMDAwMDEwODA2LAogICAgICAgIDB4MTA4MDgwMDAxMDgwOSwKICAgICAgICAweDEwODBhMDAwMTA4MzYsCiAgICAgICAgMHgxMDgzNzAwMDEwODM5LAogICAgICAgIDB4MTA4M2MwMDAxMDgzZCwKICAgICAgICAweDEwODNmMDAwMTA4NTYsCiAgICAgICAgMHgxMDkwMDAwMDEwOTE2LAogICAgICAgIDB4MTA5MjAwMDAxMDkzYSwKICAgICAgICAweDEwOTgwMDAwMTA5YjgsCiAgICAgICAgMHgxMDliZTAwMDEwOWMwLAogICAgICAgIDB4MTBhMDAwMDAxMGEwNCwKICAgICAgICAweDEwYTA1MDAwMTBhMDcsCiAgICAgICAgMHgxMGEwYzAwMDEwYTE0LAogICAgICAgIDB4MTBhMTUwMDAxMGExOCwKICAgICAgICAweDEwYTE5MDAwMTBhMzQsCiAgICAgICAgMHgxMGEzODAwMDEwYTNiLAogICAgICAgIDB4MTBhM2YwMDAxMGE0MCwKICAgICAgICAweDEwYTYwMDAwMTBhN2QsCiAgICAgICAgMHgxMGIwMDAwMDEwYjM2LAogICAgICAgIDB4MTBiNDAwMDAxMGI1NiwKICAgICAgICAweDEwYjYwMDAwMTBiNzMsCiAgICAgICAgMHgxMGMwMDAwMDEwYzQ5LAogICAgICAgIDB4MTEwMDAwMDAxMTA0NywKICAgICAgICAweDExMDY2MDAwMTEwNzAsCiAgICAgICAgMHgxMTA4MDAwMDExMGJiLAogICAgICAgIDB4MTEwZDAwMDAxMTBlOSwKICAgICAgICAweDExMGYwMDAwMTEwZmEsCiAgICAgICAgMHgxMTEwMDAwMDExMTM1LAogICAgICAgIDB4MTExMzYwMDAxMTE0MCwKICAgICAgICAweDExMTgwMDAwMTExYzUsCiAgICAgICAgMHgxMTFkMDAwMDExMWRhLAogICAgICAgIDB4MTE2ODAwMDAxMTZiOCwKICAgICAgICAweDExNmMwMDAwMTE2Y2EsCiAgICAgICAgMHgxMjAwMDAwMDEyMzZmLAogICAgICAgIDB4MTMwMDAwMDAxMzQyZiwKICAgICAgICAweDE2ODAwMDAwMTZhMzksCiAgICAgICAgMHgxNmYwMDAwMDE2ZjQ1LAogICAgICAgIDB4MTZmNTAwMDAxNmY3ZiwKICAgICAgICAweDE2ZjhmMDAwMTZmYTAsCiAgICAgICAgMHgxYjAwMDAwMDFiMDAyLAogICAgICAgIDB4MjAwMDAwMDAyYTZkNywKICAgICAgICAweDJhNzAwMDAwMmI3MzUsCiAgICAgICAgMHgyYjc0MDAwMDJiODFlLAogICAgKSwKICAgICdDT05URVhUSic6ICgKICAgICAgICAweDIwMGMwMDAwMjAwZSwKICAgICksCiAgICAnQ09OVEVYVE8nOiAoCiAgICAgICAgMHhiNzAwMDAwMGI4LAogICAgICAgIDB4Mzc1MDAwMDAzNzYsCiAgICAgICAgMHg1ZjMwMDAwMDVmNSwKICAgICAgICAweDY2MDAwMDAwNjZhLAogICAgICAgIDB4NmYwMDAwMDA2ZmEsCiAgICAgICAgMHgzMGZiMDAwMDMwZmMsCiAgICApLAp9ClBLAwQUAAAAAAAAACEAt2P0stUGAADVBgAALQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL2ludHJhbmdlcy5weSIiIgpHaXZlbiBhIGxpc3Qgb2YgaW50ZWdlcnMsIG1hZGUgdXAgb2YgKGhvcGVmdWxseSkgYSBzbWFsbCBudW1iZXIgb2YgbG9uZyBydW5zCm9mIGNvbnNlY3V0aXZlIGludGVnZXJzLCBjb21wdXRlIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZvcm0KKChzdGFydDEsIGVuZDEpLCAoc3RhcnQyLCBlbmQyKSAuLi4pLiBUaGVuIGFuc3dlciB0aGUgcXVlc3Rpb24gIndhcyB4IHByZXNlbnQKaW4gdGhlIG9yaWdpbmFsIGxpc3Q/IiBpbiB0aW1lIE8obG9nKCMgcnVucykpLgoiIiIKCmltcG9ydCBiaXNlY3QKCmRlZiBpbnRyYW5nZXNfZnJvbV9saXN0KGxpc3RfKToKICAgICIiIlJlcHJlc2VudCBhIGxpc3Qgb2YgaW50ZWdlcnMgYXMgYSBzZXF1ZW5jZSBvZiByYW5nZXM6CiAgICAoKHN0YXJ0XzAsIGVuZF8wKSwgKHN0YXJ0XzEsIGVuZF8xKSwgLi4uKSwgc3VjaCB0aGF0IHRoZSBvcmlnaW5hbAogICAgaW50ZWdlcnMgYXJlIGV4YWN0bHkgdGhvc2UgeCBzdWNoIHRoYXQgc3RhcnRfaSA8PSB4IDwgZW5kX2kgZm9yIHNvbWUgaS4KCiAgICBSYW5nZXMgYXJlIGVuY29kZWQgYXMgc2luZ2xlIGludGVnZXJzIChzdGFydCA8PCAzMiB8IGVuZCksIG5vdCBhcyB0dXBsZXMuCiAgICAiIiIKCiAgICBzb3J0ZWRfbGlzdCA9IHNvcnRlZChsaXN0XykKICAgIHJhbmdlcyA9IFtdCiAgICBsYXN0X3dyaXRlID0gLTEKICAgIGZvciBpIGluIHJhbmdlKGxlbihzb3J0ZWRfbGlzdCkpOgogICAgICAgIGlmIGkrMSA8IGxlbihzb3J0ZWRfbGlzdCk6CiAgICAgICAgICAgIGlmIHNvcnRlZF9saXN0W2ldID09IHNvcnRlZF9saXN0W2krMV0tMToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgY3VycmVudF9yYW5nZSA9IHNvcnRlZF9saXN0W2xhc3Rfd3JpdGUrMTppKzFdCiAgICAgICAgcmFuZ2VzLmFwcGVuZChfZW5jb2RlX3JhbmdlKGN1cnJlbnRfcmFuZ2VbMF0sIGN1cnJlbnRfcmFuZ2VbLTFdICsgMSkpCiAgICAgICAgbGFzdF93cml0ZSA9IGkKCiAgICByZXR1cm4gdHVwbGUocmFuZ2VzKQoKZGVmIF9lbmNvZGVfcmFuZ2Uoc3RhcnQsIGVuZCk6CiAgICByZXR1cm4gKHN0YXJ0IDw8IDMyKSB8IGVuZAoKZGVmIF9kZWNvZGVfcmFuZ2Uocik6CiAgICByZXR1cm4gKHIgPj4gMzIpLCAociAmICgoMSA8PCAzMikgLSAxKSkKCgpkZWYgaW50cmFuZ2VzX2NvbnRhaW4oaW50XywgcmFuZ2VzKToKICAgICIiIkRldGVybWluZSBpZiBgaW50X2AgZmFsbHMgaW50byBvbmUgb2YgdGhlIHJhbmdlcyBpbiBgcmFuZ2VzYC4iIiIKICAgIHR1cGxlXyA9IF9lbmNvZGVfcmFuZ2UoaW50XywgMCkKICAgIHBvcyA9IGJpc2VjdC5iaXNlY3RfbGVmdChyYW5nZXMsIHR1cGxlXykKICAgICMgd2UgY291bGQgYmUgaW1tZWRpYXRlbHkgYWhlYWQgb2YgYSB0dXBsZSAoc3RhcnQsIGVuZCkKICAgICMgd2l0aCBzdGFydCA8IGludF8gPD0gZW5kCiAgICBpZiBwb3MgPiAwOgogICAgICAgIGxlZnQsIHJpZ2h0ID0gX2RlY29kZV9yYW5nZShyYW5nZXNbcG9zLTFdKQogICAgICAgIGlmIGxlZnQgPD0gaW50XyA8IHJpZ2h0OgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgIyBvciB3ZSBjb3VsZCBiZSBpbW1lZGlhdGVseSBiZWhpbmQgYSB0dXBsZSAoaW50XywgZW5kKQogICAgaWYgcG9zIDwgbGVuKHJhbmdlcyk6CiAgICAgICAgbGVmdCwgXyA9IF9kZWNvZGVfcmFuZ2UocmFuZ2VzW3Bvc10pCiAgICAgICAgaWYgbGVmdCA9PSBpbnRfOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlClBLAwQUAAAAAAAAACEAG+d9ohUAAAAVAAAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL3BhY2thZ2VfZGF0YS5weV9fdmVyc2lvbl9fID0gJzIuNicKClBLAwQUAAAAAAAAACEAyYWFhXDSAgBw0gIALQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL3V0czQ2ZGF0YS5weSMgVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRvb2xzL2lkbmEtZGF0YQojIHZpbTogc2V0IGZpbGVlbmNvZGluZz11dGYtOCA6CgoiIiJJRE5BIE1hcHBpbmcgVGFibGUgZnJvbSBVVFM0Ni4iIiIKCgpfX3ZlcnNpb25fXyA9ICI2LjMuMCIKZGVmIF9zZWdfMCgpOgogICAgcmV0dXJuIFsKICAgICgweDAsICczJyksCiAgICAoMHgxLCAnMycpLAogICAgKDB4MiwgJzMnKSwKICAgICgweDMsICczJyksCiAgICAoMHg0LCAnMycpLAogICAgKDB4NSwgJzMnKSwKICAgICgweDYsICczJyksCiAgICAoMHg3LCAnMycpLAogICAgKDB4OCwgJzMnKSwKICAgICgweDksICczJyksCiAgICAoMHhBLCAnMycpLAogICAgKDB4QiwgJzMnKSwKICAgICgweEMsICczJyksCiAgICAoMHhELCAnMycpLAogICAgKDB4RSwgJzMnKSwKICAgICgweEYsICczJyksCiAgICAoMHgxMCwgJzMnKSwKICAgICgweDExLCAnMycpLAogICAgKDB4MTIsICczJyksCiAgICAoMHgxMywgJzMnKSwKICAgICgweDE0LCAnMycpLAogICAgKDB4MTUsICczJyksCiAgICAoMHgxNiwgJzMnKSwKICAgICgweDE3LCAnMycpLAogICAgKDB4MTgsICczJyksCiAgICAoMHgxOSwgJzMnKSwKICAgICgweDFBLCAnMycpLAogICAgKDB4MUIsICczJyksCiAgICAoMHgxQywgJzMnKSwKICAgICgweDFELCAnMycpLAogICAgKDB4MUUsICczJyksCiAgICAoMHgxRiwgJzMnKSwKICAgICgweDIwLCAnMycpLAogICAgKDB4MjEsICczJyksCiAgICAoMHgyMiwgJzMnKSwKICAgICgweDIzLCAnMycpLAogICAgKDB4MjQsICczJyksCiAgICAoMHgyNSwgJzMnKSwKICAgICgweDI2LCAnMycpLAogICAgKDB4MjcsICczJyksCiAgICAoMHgyOCwgJzMnKSwKICAgICgweDI5LCAnMycpLAogICAgKDB4MkEsICczJyksCiAgICAoMHgyQiwgJzMnKSwKICAgICgweDJDLCAnMycpLAogICAgKDB4MkQsICdWJyksCiAgICAoMHgyRSwgJ1YnKSwKICAgICgweDJGLCAnMycpLAogICAgKDB4MzAsICdWJyksCiAgICAoMHgzMSwgJ1YnKSwKICAgICgweDMyLCAnVicpLAogICAgKDB4MzMsICdWJyksCiAgICAoMHgzNCwgJ1YnKSwKICAgICgweDM1LCAnVicpLAogICAgKDB4MzYsICdWJyksCiAgICAoMHgzNywgJ1YnKSwKICAgICgweDM4LCAnVicpLAogICAgKDB4MzksICdWJyksCiAgICAoMHgzQSwgJzMnKSwKICAgICgweDNCLCAnMycpLAogICAgKDB4M0MsICczJyksCiAgICAoMHgzRCwgJzMnKSwKICAgICgweDNFLCAnMycpLAogICAgKDB4M0YsICczJyksCiAgICAoMHg0MCwgJzMnKSwKICAgICgweDQxLCAnTScsIHUnYScpLAogICAgKDB4NDIsICdNJywgdSdiJyksCiAgICAoMHg0MywgJ00nLCB1J2MnKSwKICAgICgweDQ0LCAnTScsIHUnZCcpLAogICAgKDB4NDUsICdNJywgdSdlJyksCiAgICAoMHg0NiwgJ00nLCB1J2YnKSwKICAgICgweDQ3LCAnTScsIHUnZycpLAogICAgKDB4NDgsICdNJywgdSdoJyksCiAgICAoMHg0OSwgJ00nLCB1J2knKSwKICAgICgweDRBLCAnTScsIHUnaicpLAogICAgKDB4NEIsICdNJywgdSdrJyksCiAgICAoMHg0QywgJ00nLCB1J2wnKSwKICAgICgweDRELCAnTScsIHUnbScpLAogICAgKDB4NEUsICdNJywgdSduJyksCiAgICAoMHg0RiwgJ00nLCB1J28nKSwKICAgICgweDUwLCAnTScsIHUncCcpLAogICAgKDB4NTEsICdNJywgdSdxJyksCiAgICAoMHg1MiwgJ00nLCB1J3InKSwKICAgICgweDUzLCAnTScsIHUncycpLAogICAgKDB4NTQsICdNJywgdSd0JyksCiAgICAoMHg1NSwgJ00nLCB1J3UnKSwKICAgICgweDU2LCAnTScsIHUndicpLAogICAgKDB4NTcsICdNJywgdSd3JyksCiAgICAoMHg1OCwgJ00nLCB1J3gnKSwKICAgICgweDU5LCAnTScsIHUneScpLAogICAgKDB4NUEsICdNJywgdSd6JyksCiAgICAoMHg1QiwgJzMnKSwKICAgICgweDVDLCAnMycpLAogICAgKDB4NUQsICczJyksCiAgICAoMHg1RSwgJzMnKSwKICAgICgweDVGLCAnMycpLAogICAgKDB4NjAsICczJyksCiAgICAoMHg2MSwgJ1YnKSwKICAgICgweDYyLCAnVicpLAogICAgKDB4NjMsICdWJyksCiAgICBdCgpkZWYgX3NlZ18xKCk6CiAgICByZXR1cm4gWwogICAgKDB4NjQsICdWJyksCiAgICAoMHg2NSwgJ1YnKSwKICAgICgweDY2LCAnVicpLAogICAgKDB4NjcsICdWJyksCiAgICAoMHg2OCwgJ1YnKSwKICAgICgweDY5LCAnVicpLAogICAgKDB4NkEsICdWJyksCiAgICAoMHg2QiwgJ1YnKSwKICAgICgweDZDLCAnVicpLAogICAgKDB4NkQsICdWJyksCiAgICAoMHg2RSwgJ1YnKSwKICAgICgweDZGLCAnVicpLAogICAgKDB4NzAsICdWJyksCiAgICAoMHg3MSwgJ1YnKSwKICAgICgweDcyLCAnVicpLAogICAgKDB4NzMsICdWJyksCiAgICAoMHg3NCwgJ1YnKSwKICAgICgweDc1LCAnVicpLAogICAgKDB4NzYsICdWJyksCiAgICAoMHg3NywgJ1YnKSwKICAgICgweDc4LCAnVicpLAogICAgKDB4NzksICdWJyksCiAgICAoMHg3QSwgJ1YnKSwKICAgICgweDdCLCAnMycpLAogICAgKDB4N0MsICczJyksCiAgICAoMHg3RCwgJzMnKSwKICAgICgweDdFLCAnMycpLAogICAgKDB4N0YsICczJyksCiAgICAoMHg4MCwgJ1gnKSwKICAgICgweDgxLCAnWCcpLAogICAgKDB4ODIsICdYJyksCiAgICAoMHg4MywgJ1gnKSwKICAgICgweDg0LCAnWCcpLAogICAgKDB4ODUsICdYJyksCiAgICAoMHg4NiwgJ1gnKSwKICAgICgweDg3LCAnWCcpLAogICAgKDB4ODgsICdYJyksCiAgICAoMHg4OSwgJ1gnKSwKICAgICgweDhBLCAnWCcpLAogICAgKDB4OEIsICdYJyksCiAgICAoMHg4QywgJ1gnKSwKICAgICgweDhELCAnWCcpLAogICAgKDB4OEUsICdYJyksCiAgICAoMHg4RiwgJ1gnKSwKICAgICgweDkwLCAnWCcpLAogICAgKDB4OTEsICdYJyksCiAgICAoMHg5MiwgJ1gnKSwKICAgICgweDkzLCAnWCcpLAogICAgKDB4OTQsICdYJyksCiAgICAoMHg5NSwgJ1gnKSwKICAgICgweDk2LCAnWCcpLAogICAgKDB4OTcsICdYJyksCiAgICAoMHg5OCwgJ1gnKSwKICAgICgweDk5LCAnWCcpLAogICAgKDB4OUEsICdYJyksCiAgICAoMHg5QiwgJ1gnKSwKICAgICgweDlDLCAnWCcpLAogICAgKDB4OUQsICdYJyksCiAgICAoMHg5RSwgJ1gnKSwKICAgICgweDlGLCAnWCcpLAogICAgKDB4QTAsICczJywgdScgJyksCiAgICAoMHhBMSwgJ1YnKSwKICAgICgweEEyLCAnVicpLAogICAgKDB4QTMsICdWJyksCiAgICAoMHhBNCwgJ1YnKSwKICAgICgweEE1LCAnVicpLAogICAgKDB4QTYsICdWJyksCiAgICAoMHhBNywgJ1YnKSwKICAgICgweEE4LCAnMycsIHUnIMyIJyksCiAgICAoMHhBOSwgJ1YnKSwKICAgICgweEFBLCAnTScsIHUnYScpLAogICAgKDB4QUIsICdWJyksCiAgICAoMHhBQywgJ1YnKSwKICAgICgweEFELCAnSScpLAogICAgKDB4QUUsICdWJyksCiAgICAoMHhBRiwgJzMnLCB1JyDMhCcpLAogICAgKDB4QjAsICdWJyksCiAgICAoMHhCMSwgJ1YnKSwKICAgICgweEIyLCAnTScsIHUnMicpLAogICAgKDB4QjMsICdNJywgdSczJyksCiAgICAoMHhCNCwgJzMnLCB1JyDMgScpLAogICAgKDB4QjUsICdNJywgdSfOvCcpLAogICAgKDB4QjYsICdWJyksCiAgICAoMHhCNywgJ1YnKSwKICAgICgweEI4LCAnMycsIHUnIMynJyksCiAgICAoMHhCOSwgJ00nLCB1JzEnKSwKICAgICgweEJBLCAnTScsIHUnbycpLAogICAgKDB4QkIsICdWJyksCiAgICAoMHhCQywgJ00nLCB1JzHigYQ0JyksCiAgICAoMHhCRCwgJ00nLCB1JzHigYQyJyksCiAgICAoMHhCRSwgJ00nLCB1JzPigYQ0JyksCiAgICAoMHhCRiwgJ1YnKSwKICAgICgweEMwLCAnTScsIHUnw6AnKSwKICAgICgweEMxLCAnTScsIHUnw6EnKSwKICAgICgweEMyLCAnTScsIHUnw6InKSwKICAgICgweEMzLCAnTScsIHUnw6MnKSwKICAgICgweEM0LCAnTScsIHUnw6QnKSwKICAgICgweEM1LCAnTScsIHUnw6UnKSwKICAgICgweEM2LCAnTScsIHUnw6YnKSwKICAgICgweEM3LCAnTScsIHUnw6cnKSwKICAgIF0KCmRlZiBfc2VnXzIoKToKICAgIHJldHVybiBbCiAgICAoMHhDOCwgJ00nLCB1J8OoJyksCiAgICAoMHhDOSwgJ00nLCB1J8OpJyksCiAgICAoMHhDQSwgJ00nLCB1J8OqJyksCiAgICAoMHhDQiwgJ00nLCB1J8OrJyksCiAgICAoMHhDQywgJ00nLCB1J8OsJyksCiAgICAoMHhDRCwgJ00nLCB1J8OtJyksCiAgICAoMHhDRSwgJ00nLCB1J8OuJyksCiAgICAoMHhDRiwgJ00nLCB1J8OvJyksCiAgICAoMHhEMCwgJ00nLCB1J8OwJyksCiAgICAoMHhEMSwgJ00nLCB1J8OxJyksCiAgICAoMHhEMiwgJ00nLCB1J8OyJyksCiAgICAoMHhEMywgJ00nLCB1J8OzJyksCiAgICAoMHhENCwgJ00nLCB1J8O0JyksCiAgICAoMHhENSwgJ00nLCB1J8O1JyksCiAgICAoMHhENiwgJ00nLCB1J8O2JyksCiAgICAoMHhENywgJ1YnKSwKICAgICgweEQ4LCAnTScsIHUnw7gnKSwKICAgICgweEQ5LCAnTScsIHUnw7knKSwKICAgICgweERBLCAnTScsIHUnw7onKSwKICAgICgweERCLCAnTScsIHUnw7snKSwKICAgICgweERDLCAnTScsIHUnw7wnKSwKICAgICgweERELCAnTScsIHUnw70nKSwKICAgICgweERFLCAnTScsIHUnw74nKSwKICAgICgweERGLCAnRCcsIHUnc3MnKSwKICAgICgweEUwLCAnVicpLAogICAgKDB4RTEsICdWJyksCiAgICAoMHhFMiwgJ1YnKSwKICAgICgweEUzLCAnVicpLAogICAgKDB4RTQsICdWJyksCiAgICAoMHhFNSwgJ1YnKSwKICAgICgweEU2LCAnVicpLAogICAgKDB4RTcsICdWJyksCiAgICAoMHhFOCwgJ1YnKSwKICAgICgweEU5LCAnVicpLAogICAgKDB4RUEsICdWJyksCiAgICAoMHhFQiwgJ1YnKSwKICAgICgweEVDLCAnVicpLAogICAgKDB4RUQsICdWJyksCiAgICAoMHhFRSwgJ1YnKSwKICAgICgweEVGLCAnVicpLAogICAgKDB4RjAsICdWJyksCiAgICAoMHhGMSwgJ1YnKSwKICAgICgweEYyLCAnVicpLAogICAgKDB4RjMsICdWJyksCiAgICAoMHhGNCwgJ1YnKSwKICAgICgweEY1LCAnVicpLAogICAgKDB4RjYsICdWJyksCiAgICAoMHhGNywgJ1YnKSwKICAgICgweEY4LCAnVicpLAogICAgKDB4RjksICdWJyksCiAgICAoMHhGQSwgJ1YnKSwKICAgICgweEZCLCAnVicpLAogICAgKDB4RkMsICdWJyksCiAgICAoMHhGRCwgJ1YnKSwKICAgICgweEZFLCAnVicpLAogICAgKDB4RkYsICdWJyksCiAgICAoMHgxMDAsICdNJywgdSfEgScpLAogICAgKDB4MTAxLCAnVicpLAogICAgKDB4MTAyLCAnTScsIHUnxIMnKSwKICAgICgweDEwMywgJ1YnKSwKICAgICgweDEwNCwgJ00nLCB1J8SFJyksCiAgICAoMHgxMDUsICdWJyksCiAgICAoMHgxMDYsICdNJywgdSfEhycpLAogICAgKDB4MTA3LCAnVicpLAogICAgKDB4MTA4LCAnTScsIHUnxIknKSwKICAgICgweDEwOSwgJ1YnKSwKICAgICgweDEwQSwgJ00nLCB1J8SLJyksCiAgICAoMHgxMEIsICdWJyksCiAgICAoMHgxMEMsICdNJywgdSfEjScpLAogICAgKDB4MTBELCAnVicpLAogICAgKDB4MTBFLCAnTScsIHUnxI8nKSwKICAgICgweDEwRiwgJ1YnKSwKICAgICgweDExMCwgJ00nLCB1J8SRJyksCiAgICAoMHgxMTEsICdWJyksCiAgICAoMHgxMTIsICdNJywgdSfEkycpLAogICAgKDB4MTEzLCAnVicpLAogICAgKDB4MTE0LCAnTScsIHUnxJUnKSwKICAgICgweDExNSwgJ1YnKSwKICAgICgweDExNiwgJ00nLCB1J8SXJyksCiAgICAoMHgxMTcsICdWJyksCiAgICAoMHgxMTgsICdNJywgdSfEmScpLAogICAgKDB4MTE5LCAnVicpLAogICAgKDB4MTFBLCAnTScsIHUnxJsnKSwKICAgICgweDExQiwgJ1YnKSwKICAgICgweDExQywgJ00nLCB1J8SdJyksCiAgICAoMHgxMUQsICdWJyksCiAgICAoMHgxMUUsICdNJywgdSfEnycpLAogICAgKDB4MTFGLCAnVicpLAogICAgKDB4MTIwLCAnTScsIHUnxKEnKSwKICAgICgweDEyMSwgJ1YnKSwKICAgICgweDEyMiwgJ00nLCB1J8SjJyksCiAgICAoMHgxMjMsICdWJyksCiAgICAoMHgxMjQsICdNJywgdSfEpScpLAogICAgKDB4MTI1LCAnVicpLAogICAgKDB4MTI2LCAnTScsIHUnxKcnKSwKICAgICgweDEyNywgJ1YnKSwKICAgICgweDEyOCwgJ00nLCB1J8SpJyksCiAgICAoMHgxMjksICdWJyksCiAgICAoMHgxMkEsICdNJywgdSfEqycpLAogICAgKDB4MTJCLCAnVicpLAogICAgXQoKZGVmIF9zZWdfMygpOgogICAgcmV0dXJuIFsKICAgICgweDEyQywgJ00nLCB1J8StJyksCiAgICAoMHgxMkQsICdWJyksCiAgICAoMHgxMkUsICdNJywgdSfErycpLAogICAgKDB4MTJGLCAnVicpLAogICAgKDB4MTMwLCAnTScsIHUnacyHJyksCiAgICAoMHgxMzEsICdWJyksCiAgICAoMHgxMzIsICdNJywgdSdpaicpLAogICAgKDB4MTM0LCAnTScsIHUnxLUnKSwKICAgICgweDEzNSwgJ1YnKSwKICAgICgweDEzNiwgJ00nLCB1J8S3JyksCiAgICAoMHgxMzcsICdWJyksCiAgICAoMHgxMzksICdNJywgdSfEuicpLAogICAgKDB4MTNBLCAnVicpLAogICAgKDB4MTNCLCAnTScsIHUnxLwnKSwKICAgICgweDEzQywgJ1YnKSwKICAgICgweDEzRCwgJ00nLCB1J8S+JyksCiAgICAoMHgxM0UsICdWJyksCiAgICAoMHgxM0YsICdNJywgdSdswrcnKSwKICAgICgweDE0MSwgJ00nLCB1J8WCJyksCiAgICAoMHgxNDIsICdWJyksCiAgICAoMHgxNDMsICdNJywgdSfFhCcpLAogICAgKDB4MTQ0LCAnVicpLAogICAgKDB4MTQ1LCAnTScsIHUnxYYnKSwKICAgICgweDE0NiwgJ1YnKSwKICAgICgweDE0NywgJ00nLCB1J8WIJyksCiAgICAoMHgxNDgsICdWJyksCiAgICAoMHgxNDksICdNJywgdSfKvG4nKSwKICAgICgweDE0QSwgJ00nLCB1J8WLJyksCiAgICAoMHgxNEIsICdWJyksCiAgICAoMHgxNEMsICdNJywgdSfFjScpLAogICAgKDB4MTRELCAnVicpLAogICAgKDB4MTRFLCAnTScsIHUnxY8nKSwKICAgICgweDE0RiwgJ1YnKSwKICAgICgweDE1MCwgJ00nLCB1J8WRJyksCiAgICAoMHgxNTEsICdWJyksCiAgICAoMHgxNTIsICdNJywgdSfFkycpLAogICAgKDB4MTUzLCAnVicpLAogICAgKDB4MTU0LCAnTScsIHUnxZUnKSwKICAgICgweDE1NSwgJ1YnKSwKICAgICgweDE1NiwgJ00nLCB1J8WXJyksCiAgICAoMHgxNTcsICdWJyksCiAgICAoMHgxNTgsICdNJywgdSfFmScpLAogICAgKDB4MTU5LCAnVicpLAogICAgKDB4MTVBLCAnTScsIHUnxZsnKSwKICAgICgweDE1QiwgJ1YnKSwKICAgICgweDE1QywgJ00nLCB1J8WdJyksCiAgICAoMHgxNUQsICdWJyksCiAgICAoMHgxNUUsICdNJywgdSfFnycpLAogICAgKDB4MTVGLCAnVicpLAogICAgKDB4MTYwLCAnTScsIHUnxaEnKSwKICAgICgweDE2MSwgJ1YnKSwKICAgICgweDE2MiwgJ00nLCB1J8WjJyksCiAgICAoMHgxNjMsICdWJyksCiAgICAoMHgxNjQsICdNJywgdSfFpScpLAogICAgKDB4MTY1LCAnVicpLAogICAgKDB4MTY2LCAnTScsIHUnxacnKSwKICAgICgweDE2NywgJ1YnKSwKICAgICgweDE2OCwgJ00nLCB1J8WpJyksCiAgICAoMHgxNjksICdWJyksCiAgICAoMHgxNkEsICdNJywgdSfFqycpLAogICAgKDB4MTZCLCAnVicpLAogICAgKDB4MTZDLCAnTScsIHUnxa0nKSwKICAgICgweDE2RCwgJ1YnKSwKICAgICgweDE2RSwgJ00nLCB1J8WvJyksCiAgICAoMHgxNkYsICdWJyksCiAgICAoMHgxNzAsICdNJywgdSfFsScpLAogICAgKDB4MTcxLCAnVicpLAogICAgKDB4MTcyLCAnTScsIHUnxbMnKSwKICAgICgweDE3MywgJ1YnKSwKICAgICgweDE3NCwgJ00nLCB1J8W1JyksCiAgICAoMHgxNzUsICdWJyksCiAgICAoMHgxNzYsICdNJywgdSfFtycpLAogICAgKDB4MTc3LCAnVicpLAogICAgKDB4MTc4LCAnTScsIHUnw78nKSwKICAgICgweDE3OSwgJ00nLCB1J8W6JyksCiAgICAoMHgxN0EsICdWJyksCiAgICAoMHgxN0IsICdNJywgdSfFvCcpLAogICAgKDB4MTdDLCAnVicpLAogICAgKDB4MTdELCAnTScsIHUnxb4nKSwKICAgICgweDE3RSwgJ1YnKSwKICAgICgweDE3RiwgJ00nLCB1J3MnKSwKICAgICgweDE4MCwgJ1YnKSwKICAgICgweDE4MSwgJ00nLCB1J8mTJyksCiAgICAoMHgxODIsICdNJywgdSfGgycpLAogICAgKDB4MTgzLCAnVicpLAogICAgKDB4MTg0LCAnTScsIHUnxoUnKSwKICAgICgweDE4NSwgJ1YnKSwKICAgICgweDE4NiwgJ00nLCB1J8mUJyksCiAgICAoMHgxODcsICdNJywgdSfGiCcpLAogICAgKDB4MTg4LCAnVicpLAogICAgKDB4MTg5LCAnTScsIHUnyZYnKSwKICAgICgweDE4QSwgJ00nLCB1J8mXJyksCiAgICAoMHgxOEIsICdNJywgdSfGjCcpLAogICAgKDB4MThDLCAnVicpLAogICAgKDB4MThFLCAnTScsIHUnx50nKSwKICAgICgweDE4RiwgJ00nLCB1J8mZJyksCiAgICAoMHgxOTAsICdNJywgdSfJmycpLAogICAgKDB4MTkxLCAnTScsIHUnxpInKSwKICAgICgweDE5MiwgJ1YnKSwKICAgICgweDE5MywgJ00nLCB1J8mgJyksCiAgICBdCgpkZWYgX3NlZ180KCk6CiAgICByZXR1cm4gWwogICAgKDB4MTk0LCAnTScsIHUnyaMnKSwKICAgICgweDE5NSwgJ1YnKSwKICAgICgweDE5NiwgJ00nLCB1J8mpJyksCiAgICAoMHgxOTcsICdNJywgdSfJqCcpLAogICAgKDB4MTk4LCAnTScsIHUnxpknKSwKICAgICgweDE5OSwgJ1YnKSwKICAgICgweDE5QywgJ00nLCB1J8mvJyksCiAgICAoMHgxOUQsICdNJywgdSfJsicpLAogICAgKDB4MTlFLCAnVicpLAogICAgKDB4MTlGLCAnTScsIHUnybUnKSwKICAgICgweDFBMCwgJ00nLCB1J8ahJyksCiAgICAoMHgxQTEsICdWJyksCiAgICAoMHgxQTIsICdNJywgdSfGoycpLAogICAgKDB4MUEzLCAnVicpLAogICAgKDB4MUE0LCAnTScsIHUnxqUnKSwKICAgICgweDFBNSwgJ1YnKSwKICAgICgweDFBNiwgJ00nLCB1J8qAJyksCiAgICAoMHgxQTcsICdNJywgdSfGqCcpLAogICAgKDB4MUE4LCAnVicpLAogICAgKDB4MUE5LCAnTScsIHUnyoMnKSwKICAgICgweDFBQSwgJ1YnKSwKICAgICgweDFBQywgJ00nLCB1J8atJyksCiAgICAoMHgxQUQsICdWJyksCiAgICAoMHgxQUUsICdNJywgdSfKiCcpLAogICAgKDB4MUFGLCAnTScsIHUnxrAnKSwKICAgICgweDFCMCwgJ1YnKSwKICAgICgweDFCMSwgJ00nLCB1J8qKJyksCiAgICAoMHgxQjIsICdNJywgdSfKiycpLAogICAgKDB4MUIzLCAnTScsIHUnxrQnKSwKICAgICgweDFCNCwgJ1YnKSwKICAgICgweDFCNSwgJ00nLCB1J8a2JyksCiAgICAoMHgxQjYsICdWJyksCiAgICAoMHgxQjcsICdNJywgdSfKkicpLAogICAgKDB4MUI4LCAnTScsIHUnxrknKSwKICAgICgweDFCOSwgJ1YnKSwKICAgICgweDFCQywgJ00nLCB1J8a9JyksCiAgICAoMHgxQkQsICdWJyksCiAgICAoMHgxQzQsICdNJywgdSdkxb4nKSwKICAgICgweDFDNywgJ00nLCB1J2xqJyksCiAgICAoMHgxQ0EsICdNJywgdSduaicpLAogICAgKDB4MUNELCAnTScsIHUnx44nKSwKICAgICgweDFDRSwgJ1YnKSwKICAgICgweDFDRiwgJ00nLCB1J8eQJyksCiAgICAoMHgxRDAsICdWJyksCiAgICAoMHgxRDEsICdNJywgdSfHkicpLAogICAgKDB4MUQyLCAnVicpLAogICAgKDB4MUQzLCAnTScsIHUnx5QnKSwKICAgICgweDFENCwgJ1YnKSwKICAgICgweDFENSwgJ00nLCB1J8eWJyksCiAgICAoMHgxRDYsICdWJyksCiAgICAoMHgxRDcsICdNJywgdSfHmCcpLAogICAgKDB4MUQ4LCAnVicpLAogICAgKDB4MUQ5LCAnTScsIHUnx5onKSwKICAgICgweDFEQSwgJ1YnKSwKICAgICgweDFEQiwgJ00nLCB1J8ecJyksCiAgICAoMHgxREMsICdWJyksCiAgICAoMHgxREUsICdNJywgdSfHnycpLAogICAgKDB4MURGLCAnVicpLAogICAgKDB4MUUwLCAnTScsIHUnx6EnKSwKICAgICgweDFFMSwgJ1YnKSwKICAgICgweDFFMiwgJ00nLCB1J8ejJyksCiAgICAoMHgxRTMsICdWJyksCiAgICAoMHgxRTQsICdNJywgdSfHpScpLAogICAgKDB4MUU1LCAnVicpLAogICAgKDB4MUU2LCAnTScsIHUnx6cnKSwKICAgICgweDFFNywgJ1YnKSwKICAgICgweDFFOCwgJ00nLCB1J8epJyksCiAgICAoMHgxRTksICdWJyksCiAgICAoMHgxRUEsICdNJywgdSfHqycpLAogICAgKDB4MUVCLCAnVicpLAogICAgKDB4MUVDLCAnTScsIHUnx60nKSwKICAgICgweDFFRCwgJ1YnKSwKICAgICgweDFFRSwgJ00nLCB1J8evJyksCiAgICAoMHgxRUYsICdWJyksCiAgICAoMHgxRjEsICdNJywgdSdkeicpLAogICAgKDB4MUY0LCAnTScsIHUnx7UnKSwKICAgICgweDFGNSwgJ1YnKSwKICAgICgweDFGNiwgJ00nLCB1J8aVJyksCiAgICAoMHgxRjcsICdNJywgdSfGvycpLAogICAgKDB4MUY4LCAnTScsIHUnx7knKSwKICAgICgweDFGOSwgJ1YnKSwKICAgICgweDFGQSwgJ00nLCB1J8e7JyksCiAgICAoMHgxRkIsICdWJyksCiAgICAoMHgxRkMsICdNJywgdSfHvScpLAogICAgKDB4MUZELCAnVicpLAogICAgKDB4MUZFLCAnTScsIHUnx78nKSwKICAgICgweDFGRiwgJ1YnKSwKICAgICgweDIwMCwgJ00nLCB1J8iBJyksCiAgICAoMHgyMDEsICdWJyksCiAgICAoMHgyMDIsICdNJywgdSfIgycpLAogICAgKDB4MjAzLCAnVicpLAogICAgKDB4MjA0LCAnTScsIHUnyIUnKSwKICAgICgweDIwNSwgJ1YnKSwKICAgICgweDIwNiwgJ00nLCB1J8iHJyksCiAgICAoMHgyMDcsICdWJyksCiAgICAoMHgyMDgsICdNJywgdSfIiScpLAogICAgKDB4MjA5LCAnVicpLAogICAgKDB4MjBBLCAnTScsIHUnyIsnKSwKICAgICgweDIwQiwgJ1YnKSwKICAgICgweDIwQywgJ00nLCB1J8iNJyksCiAgICBdCgpkZWYgX3NlZ181KCk6CiAgICByZXR1cm4gWwogICAgKDB4MjBELCAnVicpLAogICAgKDB4MjBFLCAnTScsIHUnyI8nKSwKICAgICgweDIwRiwgJ1YnKSwKICAgICgweDIxMCwgJ00nLCB1J8iRJyksCiAgICAoMHgyMTEsICdWJyksCiAgICAoMHgyMTIsICdNJywgdSfIkycpLAogICAgKDB4MjEzLCAnVicpLAogICAgKDB4MjE0LCAnTScsIHUnyJUnKSwKICAgICgweDIxNSwgJ1YnKSwKICAgICgweDIxNiwgJ00nLCB1J8iXJyksCiAgICAoMHgyMTcsICdWJyksCiAgICAoMHgyMTgsICdNJywgdSfImScpLAogICAgKDB4MjE5LCAnVicpLAogICAgKDB4MjFBLCAnTScsIHUnyJsnKSwKICAgICgweDIxQiwgJ1YnKSwKICAgICgweDIxQywgJ00nLCB1J8idJyksCiAgICAoMHgyMUQsICdWJyksCiAgICAoMHgyMUUsICdNJywgdSfInycpLAogICAgKDB4MjFGLCAnVicpLAogICAgKDB4MjIwLCAnTScsIHUnxp4nKSwKICAgICgweDIyMSwgJ1YnKSwKICAgICgweDIyMiwgJ00nLCB1J8ijJyksCiAgICAoMHgyMjMsICdWJyksCiAgICAoMHgyMjQsICdNJywgdSfIpScpLAogICAgKDB4MjI1LCAnVicpLAogICAgKDB4MjI2LCAnTScsIHUnyKcnKSwKICAgICgweDIyNywgJ1YnKSwKICAgICgweDIyOCwgJ00nLCB1J8ipJyksCiAgICAoMHgyMjksICdWJyksCiAgICAoMHgyMkEsICdNJywgdSfIqycpLAogICAgKDB4MjJCLCAnVicpLAogICAgKDB4MjJDLCAnTScsIHUnyK0nKSwKICAgICgweDIyRCwgJ1YnKSwKICAgICgweDIyRSwgJ00nLCB1J8ivJyksCiAgICAoMHgyMkYsICdWJyksCiAgICAoMHgyMzAsICdNJywgdSfIsScpLAogICAgKDB4MjMxLCAnVicpLAogICAgKDB4MjMyLCAnTScsIHUnyLMnKSwKICAgICgweDIzMywgJ1YnKSwKICAgICgweDIzQSwgJ00nLCB1J+KxpScpLAogICAgKDB4MjNCLCAnTScsIHUnyLwnKSwKICAgICgweDIzQywgJ1YnKSwKICAgICgweDIzRCwgJ00nLCB1J8aaJyksCiAgICAoMHgyM0UsICdNJywgdSfisaYnKSwKICAgICgweDIzRiwgJ1YnKSwKICAgICgweDI0MSwgJ00nLCB1J8mCJyksCiAgICAoMHgyNDIsICdWJyksCiAgICAoMHgyNDMsICdNJywgdSfGgCcpLAogICAgKDB4MjQ0LCAnTScsIHUnyoknKSwKICAgICgweDI0NSwgJ00nLCB1J8qMJyksCiAgICAoMHgyNDYsICdNJywgdSfJhycpLAogICAgKDB4MjQ3LCAnVicpLAogICAgKDB4MjQ4LCAnTScsIHUnyYknKSwKICAgICgweDI0OSwgJ1YnKSwKICAgICgweDI0QSwgJ00nLCB1J8mLJyksCiAgICAoMHgyNEIsICdWJyksCiAgICAoMHgyNEMsICdNJywgdSfJjScpLAogICAgKDB4MjRELCAnVicpLAogICAgKDB4MjRFLCAnTScsIHUnyY8nKSwKICAgICgweDI0RiwgJ1YnKSwKICAgICgweDJCMCwgJ00nLCB1J2gnKSwKICAgICgweDJCMSwgJ00nLCB1J8mmJyksCiAgICAoMHgyQjIsICdNJywgdSdqJyksCiAgICAoMHgyQjMsICdNJywgdSdyJyksCiAgICAoMHgyQjQsICdNJywgdSfJuScpLAogICAgKDB4MkI1LCAnTScsIHUnybsnKSwKICAgICgweDJCNiwgJ00nLCB1J8qBJyksCiAgICAoMHgyQjcsICdNJywgdSd3JyksCiAgICAoMHgyQjgsICdNJywgdSd5JyksCiAgICAoMHgyQjksICdWJyksCiAgICAoMHgyRDgsICczJywgdScgzIYnKSwKICAgICgweDJEOSwgJzMnLCB1JyDMhycpLAogICAgKDB4MkRBLCAnMycsIHUnIMyKJyksCiAgICAoMHgyREIsICczJywgdScgzKgnKSwKICAgICgweDJEQywgJzMnLCB1JyDMgycpLAogICAgKDB4MkRELCAnMycsIHUnIMyLJyksCiAgICAoMHgyREUsICdWJyksCiAgICAoMHgyRTAsICdNJywgdSfJoycpLAogICAgKDB4MkUxLCAnTScsIHUnbCcpLAogICAgKDB4MkUyLCAnTScsIHUncycpLAogICAgKDB4MkUzLCAnTScsIHUneCcpLAogICAgKDB4MkU0LCAnTScsIHUnypUnKSwKICAgICgweDJFNSwgJ1YnKSwKICAgICgweDM0MCwgJ00nLCB1J8yAJyksCiAgICAoMHgzNDEsICdNJywgdSfMgScpLAogICAgKDB4MzQyLCAnVicpLAogICAgKDB4MzQzLCAnTScsIHUnzJMnKSwKICAgICgweDM0NCwgJ00nLCB1J8yIzIEnKSwKICAgICgweDM0NSwgJ00nLCB1J865JyksCiAgICAoMHgzNDYsICdWJyksCiAgICAoMHgzNEYsICdJJyksCiAgICAoMHgzNTAsICdWJyksCiAgICAoMHgzNzAsICdNJywgdSfNsScpLAogICAgKDB4MzcxLCAnVicpLAogICAgKDB4MzcyLCAnTScsIHUnzbMnKSwKICAgICgweDM3MywgJ1YnKSwKICAgICgweDM3NCwgJ00nLCB1J8q5JyksCiAgICAoMHgzNzUsICdWJyksCiAgICAoMHgzNzYsICdNJywgdSfNtycpLAogICAgKDB4Mzc3LCAnVicpLAogICAgXQoKZGVmIF9zZWdfNigpOgogICAgcmV0dXJuIFsKICAgICgweDM3OCwgJ1gnKSwKICAgICgweDM3QSwgJzMnLCB1JyDOuScpLAogICAgKDB4MzdCLCAnVicpLAogICAgKDB4MzdFLCAnMycsIHUnOycpLAogICAgKDB4MzdGLCAnWCcpLAogICAgKDB4Mzg0LCAnMycsIHUnIMyBJyksCiAgICAoMHgzODUsICczJywgdScgzIjMgScpLAogICAgKDB4Mzg2LCAnTScsIHUnzqwnKSwKICAgICgweDM4NywgJ00nLCB1J8K3JyksCiAgICAoMHgzODgsICdNJywgdSfOrScpLAogICAgKDB4Mzg5LCAnTScsIHUnzq4nKSwKICAgICgweDM4QSwgJ00nLCB1J86vJyksCiAgICAoMHgzOEIsICdYJyksCiAgICAoMHgzOEMsICdNJywgdSfPjCcpLAogICAgKDB4MzhELCAnWCcpLAogICAgKDB4MzhFLCAnTScsIHUnz40nKSwKICAgICgweDM4RiwgJ00nLCB1J8+OJyksCiAgICAoMHgzOTAsICdWJyksCiAgICAoMHgzOTEsICdNJywgdSfOsScpLAogICAgKDB4MzkyLCAnTScsIHUnzrInKSwKICAgICgweDM5MywgJ00nLCB1J86zJyksCiAgICAoMHgzOTQsICdNJywgdSfOtCcpLAogICAgKDB4Mzk1LCAnTScsIHUnzrUnKSwKICAgICgweDM5NiwgJ00nLCB1J862JyksCiAgICAoMHgzOTcsICdNJywgdSfOtycpLAogICAgKDB4Mzk4LCAnTScsIHUnzrgnKSwKICAgICgweDM5OSwgJ00nLCB1J865JyksCiAgICAoMHgzOUEsICdNJywgdSfOuicpLAogICAgKDB4MzlCLCAnTScsIHUnzrsnKSwKICAgICgweDM5QywgJ00nLCB1J868JyksCiAgICAoMHgzOUQsICdNJywgdSfOvScpLAogICAgKDB4MzlFLCAnTScsIHUnzr4nKSwKICAgICgweDM5RiwgJ00nLCB1J86/JyksCiAgICAoMHgzQTAsICdNJywgdSfPgCcpLAogICAgKDB4M0ExLCAnTScsIHUnz4EnKSwKICAgICgweDNBMiwgJ1gnKSwKICAgICgweDNBMywgJ00nLCB1J8+DJyksCiAgICAoMHgzQTQsICdNJywgdSfPhCcpLAogICAgKDB4M0E1LCAnTScsIHUnz4UnKSwKICAgICgweDNBNiwgJ00nLCB1J8+GJyksCiAgICAoMHgzQTcsICdNJywgdSfPhycpLAogICAgKDB4M0E4LCAnTScsIHUnz4gnKSwKICAgICgweDNBOSwgJ00nLCB1J8+JJyksCiAgICAoMHgzQUEsICdNJywgdSfPiicpLAogICAgKDB4M0FCLCAnTScsIHUnz4snKSwKICAgICgweDNBQywgJ1YnKSwKICAgICgweDNDMiwgJ0QnLCB1J8+DJyksCiAgICAoMHgzQzMsICdWJyksCiAgICAoMHgzQ0YsICdNJywgdSfPlycpLAogICAgKDB4M0QwLCAnTScsIHUnzrInKSwKICAgICgweDNEMSwgJ00nLCB1J864JyksCiAgICAoMHgzRDIsICdNJywgdSfPhScpLAogICAgKDB4M0QzLCAnTScsIHUnz40nKSwKICAgICgweDNENCwgJ00nLCB1J8+LJyksCiAgICAoMHgzRDUsICdNJywgdSfPhicpLAogICAgKDB4M0Q2LCAnTScsIHUnz4AnKSwKICAgICgweDNENywgJ1YnKSwKICAgICgweDNEOCwgJ00nLCB1J8+ZJyksCiAgICAoMHgzRDksICdWJyksCiAgICAoMHgzREEsICdNJywgdSfPmycpLAogICAgKDB4M0RCLCAnVicpLAogICAgKDB4M0RDLCAnTScsIHUnz50nKSwKICAgICgweDNERCwgJ1YnKSwKICAgICgweDNERSwgJ00nLCB1J8+fJyksCiAgICAoMHgzREYsICdWJyksCiAgICAoMHgzRTAsICdNJywgdSfPoScpLAogICAgKDB4M0UxLCAnVicpLAogICAgKDB4M0UyLCAnTScsIHUnz6MnKSwKICAgICgweDNFMywgJ1YnKSwKICAgICgweDNFNCwgJ00nLCB1J8+lJyksCiAgICAoMHgzRTUsICdWJyksCiAgICAoMHgzRTYsICdNJywgdSfPpycpLAogICAgKDB4M0U3LCAnVicpLAogICAgKDB4M0U4LCAnTScsIHUnz6knKSwKICAgICgweDNFOSwgJ1YnKSwKICAgICgweDNFQSwgJ00nLCB1J8+rJyksCiAgICAoMHgzRUIsICdWJyksCiAgICAoMHgzRUMsICdNJywgdSfPrScpLAogICAgKDB4M0VELCAnVicpLAogICAgKDB4M0VFLCAnTScsIHUnz68nKSwKICAgICgweDNFRiwgJ1YnKSwKICAgICgweDNGMCwgJ00nLCB1J866JyksCiAgICAoMHgzRjEsICdNJywgdSfPgScpLAogICAgKDB4M0YyLCAnTScsIHUnz4MnKSwKICAgICgweDNGMywgJ1YnKSwKICAgICgweDNGNCwgJ00nLCB1J864JyksCiAgICAoMHgzRjUsICdNJywgdSfOtScpLAogICAgKDB4M0Y2LCAnVicpLAogICAgKDB4M0Y3LCAnTScsIHUnz7gnKSwKICAgICgweDNGOCwgJ1YnKSwKICAgICgweDNGOSwgJ00nLCB1J8+DJyksCiAgICAoMHgzRkEsICdNJywgdSfPuycpLAogICAgKDB4M0ZCLCAnVicpLAogICAgKDB4M0ZELCAnTScsIHUnzbsnKSwKICAgICgweDNGRSwgJ00nLCB1J828JyksCiAgICAoMHgzRkYsICdNJywgdSfNvScpLAogICAgKDB4NDAwLCAnTScsIHUn0ZAnKSwKICAgICgweDQwMSwgJ00nLCB1J9GRJyksCiAgICAoMHg0MDIsICdNJywgdSfRkicpLAogICAgKDB4NDAzLCAnTScsIHUn0ZMnKSwKICAgIF0KCmRlZiBfc2VnXzcoKToKICAgIHJldHVybiBbCiAgICAoMHg0MDQsICdNJywgdSfRlCcpLAogICAgKDB4NDA1LCAnTScsIHUn0ZUnKSwKICAgICgweDQwNiwgJ00nLCB1J9GWJyksCiAgICAoMHg0MDcsICdNJywgdSfRlycpLAogICAgKDB4NDA4LCAnTScsIHUn0ZgnKSwKICAgICgweDQwOSwgJ00nLCB1J9GZJyksCiAgICAoMHg0MEEsICdNJywgdSfRmicpLAogICAgKDB4NDBCLCAnTScsIHUn0ZsnKSwKICAgICgweDQwQywgJ00nLCB1J9GcJyksCiAgICAoMHg0MEQsICdNJywgdSfRnScpLAogICAgKDB4NDBFLCAnTScsIHUn0Z4nKSwKICAgICgweDQwRiwgJ00nLCB1J9GfJyksCiAgICAoMHg0MTAsICdNJywgdSfQsCcpLAogICAgKDB4NDExLCAnTScsIHUn0LEnKSwKICAgICgweDQxMiwgJ00nLCB1J9CyJyksCiAgICAoMHg0MTMsICdNJywgdSfQsycpLAogICAgKDB4NDE0LCAnTScsIHUn0LQnKSwKICAgICgweDQxNSwgJ00nLCB1J9C1JyksCiAgICAoMHg0MTYsICdNJywgdSfQticpLAogICAgKDB4NDE3LCAnTScsIHUn0LcnKSwKICAgICgweDQxOCwgJ00nLCB1J9C4JyksCiAgICAoMHg0MTksICdNJywgdSfQuScpLAogICAgKDB4NDFBLCAnTScsIHUn0LonKSwKICAgICgweDQxQiwgJ00nLCB1J9C7JyksCiAgICAoMHg0MUMsICdNJywgdSfQvCcpLAogICAgKDB4NDFELCAnTScsIHUn0L0nKSwKICAgICgweDQxRSwgJ00nLCB1J9C+JyksCiAgICAoMHg0MUYsICdNJywgdSfQvycpLAogICAgKDB4NDIwLCAnTScsIHUn0YAnKSwKICAgICgweDQyMSwgJ00nLCB1J9GBJyksCiAgICAoMHg0MjIsICdNJywgdSfRgicpLAogICAgKDB4NDIzLCAnTScsIHUn0YMnKSwKICAgICgweDQyNCwgJ00nLCB1J9GEJyksCiAgICAoMHg0MjUsICdNJywgdSfRhScpLAogICAgKDB4NDI2LCAnTScsIHUn0YYnKSwKICAgICgweDQyNywgJ00nLCB1J9GHJyksCiAgICAoMHg0MjgsICdNJywgdSfRiCcpLAogICAgKDB4NDI5LCAnTScsIHUn0YknKSwKICAgICgweDQyQSwgJ00nLCB1J9GKJyksCiAgICAoMHg0MkIsICdNJywgdSfRiycpLAogICAgKDB4NDJDLCAnTScsIHUn0YwnKSwKICAgICgweDQyRCwgJ00nLCB1J9GNJyksCiAgICAoMHg0MkUsICdNJywgdSfRjicpLAogICAgKDB4NDJGLCAnTScsIHUn0Y8nKSwKICAgICgweDQzMCwgJ1YnKSwKICAgICgweDQ2MCwgJ00nLCB1J9GhJyksCiAgICAoMHg0NjEsICdWJyksCiAgICAoMHg0NjIsICdNJywgdSfRoycpLAogICAgKDB4NDYzLCAnVicpLAogICAgKDB4NDY0LCAnTScsIHUn0aUnKSwKICAgICgweDQ2NSwgJ1YnKSwKICAgICgweDQ2NiwgJ00nLCB1J9GnJyksCiAgICAoMHg0NjcsICdWJyksCiAgICAoMHg0NjgsICdNJywgdSfRqScpLAogICAgKDB4NDY5LCAnVicpLAogICAgKDB4NDZBLCAnTScsIHUn0asnKSwKICAgICgweDQ2QiwgJ1YnKSwKICAgICgweDQ2QywgJ00nLCB1J9GtJyksCiAgICAoMHg0NkQsICdWJyksCiAgICAoMHg0NkUsICdNJywgdSfRrycpLAogICAgKDB4NDZGLCAnVicpLAogICAgKDB4NDcwLCAnTScsIHUn0bEnKSwKICAgICgweDQ3MSwgJ1YnKSwKICAgICgweDQ3MiwgJ00nLCB1J9GzJyksCiAgICAoMHg0NzMsICdWJyksCiAgICAoMHg0NzQsICdNJywgdSfRtScpLAogICAgKDB4NDc1LCAnVicpLAogICAgKDB4NDc2LCAnTScsIHUn0bcnKSwKICAgICgweDQ3NywgJ1YnKSwKICAgICgweDQ3OCwgJ00nLCB1J9G5JyksCiAgICAoMHg0NzksICdWJyksCiAgICAoMHg0N0EsICdNJywgdSfRuycpLAogICAgKDB4NDdCLCAnVicpLAogICAgKDB4NDdDLCAnTScsIHUn0b0nKSwKICAgICgweDQ3RCwgJ1YnKSwKICAgICgweDQ3RSwgJ00nLCB1J9G/JyksCiAgICAoMHg0N0YsICdWJyksCiAgICAoMHg0ODAsICdNJywgdSfSgScpLAogICAgKDB4NDgxLCAnVicpLAogICAgKDB4NDhBLCAnTScsIHUn0osnKSwKICAgICgweDQ4QiwgJ1YnKSwKICAgICgweDQ4QywgJ00nLCB1J9KNJyksCiAgICAoMHg0OEQsICdWJyksCiAgICAoMHg0OEUsICdNJywgdSfSjycpLAogICAgKDB4NDhGLCAnVicpLAogICAgKDB4NDkwLCAnTScsIHUn0pEnKSwKICAgICgweDQ5MSwgJ1YnKSwKICAgICgweDQ5MiwgJ00nLCB1J9KTJyksCiAgICAoMHg0OTMsICdWJyksCiAgICAoMHg0OTQsICdNJywgdSfSlScpLAogICAgKDB4NDk1LCAnVicpLAogICAgKDB4NDk2LCAnTScsIHUn0pcnKSwKICAgICgweDQ5NywgJ1YnKSwKICAgICgweDQ5OCwgJ00nLCB1J9KZJyksCiAgICAoMHg0OTksICdWJyksCiAgICAoMHg0OUEsICdNJywgdSfSmycpLAogICAgKDB4NDlCLCAnVicpLAogICAgKDB4NDlDLCAnTScsIHUn0p0nKSwKICAgICgweDQ5RCwgJ1YnKSwKICAgICgweDQ5RSwgJ00nLCB1J9KfJyksCiAgICBdCgpkZWYgX3NlZ184KCk6CiAgICByZXR1cm4gWwogICAgKDB4NDlGLCAnVicpLAogICAgKDB4NEEwLCAnTScsIHUn0qEnKSwKICAgICgweDRBMSwgJ1YnKSwKICAgICgweDRBMiwgJ00nLCB1J9KjJyksCiAgICAoMHg0QTMsICdWJyksCiAgICAoMHg0QTQsICdNJywgdSfSpScpLAogICAgKDB4NEE1LCAnVicpLAogICAgKDB4NEE2LCAnTScsIHUn0qcnKSwKICAgICgweDRBNywgJ1YnKSwKICAgICgweDRBOCwgJ00nLCB1J9KpJyksCiAgICAoMHg0QTksICdWJyksCiAgICAoMHg0QUEsICdNJywgdSfSqycpLAogICAgKDB4NEFCLCAnVicpLAogICAgKDB4NEFDLCAnTScsIHUn0q0nKSwKICAgICgweDRBRCwgJ1YnKSwKICAgICgweDRBRSwgJ00nLCB1J9KvJyksCiAgICAoMHg0QUYsICdWJyksCiAgICAoMHg0QjAsICdNJywgdSfSsScpLAogICAgKDB4NEIxLCAnVicpLAogICAgKDB4NEIyLCAnTScsIHUn0rMnKSwKICAgICgweDRCMywgJ1YnKSwKICAgICgweDRCNCwgJ00nLCB1J9K1JyksCiAgICAoMHg0QjUsICdWJyksCiAgICAoMHg0QjYsICdNJywgdSfStycpLAogICAgKDB4NEI3LCAnVicpLAogICAgKDB4NEI4LCAnTScsIHUn0rknKSwKICAgICgweDRCOSwgJ1YnKSwKICAgICgweDRCQSwgJ00nLCB1J9K7JyksCiAgICAoMHg0QkIsICdWJyksCiAgICAoMHg0QkMsICdNJywgdSfSvScpLAogICAgKDB4NEJELCAnVicpLAogICAgKDB4NEJFLCAnTScsIHUn0r8nKSwKICAgICgweDRCRiwgJ1YnKSwKICAgICgweDRDMCwgJ1gnKSwKICAgICgweDRDMSwgJ00nLCB1J9OCJyksCiAgICAoMHg0QzIsICdWJyksCiAgICAoMHg0QzMsICdNJywgdSfThCcpLAogICAgKDB4NEM0LCAnVicpLAogICAgKDB4NEM1LCAnTScsIHUn04YnKSwKICAgICgweDRDNiwgJ1YnKSwKICAgICgweDRDNywgJ00nLCB1J9OIJyksCiAgICAoMHg0QzgsICdWJyksCiAgICAoMHg0QzksICdNJywgdSfTiicpLAogICAgKDB4NENBLCAnVicpLAogICAgKDB4NENCLCAnTScsIHUn04wnKSwKICAgICgweDRDQywgJ1YnKSwKICAgICgweDRDRCwgJ00nLCB1J9OOJyksCiAgICAoMHg0Q0UsICdWJyksCiAgICAoMHg0RDAsICdNJywgdSfTkScpLAogICAgKDB4NEQxLCAnVicpLAogICAgKDB4NEQyLCAnTScsIHUn05MnKSwKICAgICgweDREMywgJ1YnKSwKICAgICgweDRENCwgJ00nLCB1J9OVJyksCiAgICAoMHg0RDUsICdWJyksCiAgICAoMHg0RDYsICdNJywgdSfTlycpLAogICAgKDB4NEQ3LCAnVicpLAogICAgKDB4NEQ4LCAnTScsIHUn05knKSwKICAgICgweDREOSwgJ1YnKSwKICAgICgweDREQSwgJ00nLCB1J9ObJyksCiAgICAoMHg0REIsICdWJyksCiAgICAoMHg0REMsICdNJywgdSfTnScpLAogICAgKDB4NERELCAnVicpLAogICAgKDB4NERFLCAnTScsIHUn058nKSwKICAgICgweDRERiwgJ1YnKSwKICAgICgweDRFMCwgJ00nLCB1J9OhJyksCiAgICAoMHg0RTEsICdWJyksCiAgICAoMHg0RTIsICdNJywgdSfToycpLAogICAgKDB4NEUzLCAnVicpLAogICAgKDB4NEU0LCAnTScsIHUn06UnKSwKICAgICgweDRFNSwgJ1YnKSwKICAgICgweDRFNiwgJ00nLCB1J9OnJyksCiAgICAoMHg0RTcsICdWJyksCiAgICAoMHg0RTgsICdNJywgdSfTqScpLAogICAgKDB4NEU5LCAnVicpLAogICAgKDB4NEVBLCAnTScsIHUn06snKSwKICAgICgweDRFQiwgJ1YnKSwKICAgICgweDRFQywgJ00nLCB1J9OtJyksCiAgICAoMHg0RUQsICdWJyksCiAgICAoMHg0RUUsICdNJywgdSfTrycpLAogICAgKDB4NEVGLCAnVicpLAogICAgKDB4NEYwLCAnTScsIHUn07EnKSwKICAgICgweDRGMSwgJ1YnKSwKICAgICgweDRGMiwgJ00nLCB1J9OzJyksCiAgICAoMHg0RjMsICdWJyksCiAgICAoMHg0RjQsICdNJywgdSfTtScpLAogICAgKDB4NEY1LCAnVicpLAogICAgKDB4NEY2LCAnTScsIHUn07cnKSwKICAgICgweDRGNywgJ1YnKSwKICAgICgweDRGOCwgJ00nLCB1J9O5JyksCiAgICAoMHg0RjksICdWJyksCiAgICAoMHg0RkEsICdNJywgdSfTuycpLAogICAgKDB4NEZCLCAnVicpLAogICAgKDB4NEZDLCAnTScsIHUn070nKSwKICAgICgweDRGRCwgJ1YnKSwKICAgICgweDRGRSwgJ00nLCB1J9O/JyksCiAgICAoMHg0RkYsICdWJyksCiAgICAoMHg1MDAsICdNJywgdSfUgScpLAogICAgKDB4NTAxLCAnVicpLAogICAgKDB4NTAyLCAnTScsIHUn1IMnKSwKICAgICgweDUwMywgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzkoKToKICAgIHJldHVybiBbCiAgICAoMHg1MDQsICdNJywgdSfUhScpLAogICAgKDB4NTA1LCAnVicpLAogICAgKDB4NTA2LCAnTScsIHUn1IcnKSwKICAgICgweDUwNywgJ1YnKSwKICAgICgweDUwOCwgJ00nLCB1J9SJJyksCiAgICAoMHg1MDksICdWJyksCiAgICAoMHg1MEEsICdNJywgdSfUiycpLAogICAgKDB4NTBCLCAnVicpLAogICAgKDB4NTBDLCAnTScsIHUn1I0nKSwKICAgICgweDUwRCwgJ1YnKSwKICAgICgweDUwRSwgJ00nLCB1J9SPJyksCiAgICAoMHg1MEYsICdWJyksCiAgICAoMHg1MTAsICdNJywgdSfUkScpLAogICAgKDB4NTExLCAnVicpLAogICAgKDB4NTEyLCAnTScsIHUn1JMnKSwKICAgICgweDUxMywgJ1YnKSwKICAgICgweDUxNCwgJ00nLCB1J9SVJyksCiAgICAoMHg1MTUsICdWJyksCiAgICAoMHg1MTYsICdNJywgdSfUlycpLAogICAgKDB4NTE3LCAnVicpLAogICAgKDB4NTE4LCAnTScsIHUn1JknKSwKICAgICgweDUxOSwgJ1YnKSwKICAgICgweDUxQSwgJ00nLCB1J9SbJyksCiAgICAoMHg1MUIsICdWJyksCiAgICAoMHg1MUMsICdNJywgdSfUnScpLAogICAgKDB4NTFELCAnVicpLAogICAgKDB4NTFFLCAnTScsIHUn1J8nKSwKICAgICgweDUxRiwgJ1YnKSwKICAgICgweDUyMCwgJ00nLCB1J9ShJyksCiAgICAoMHg1MjEsICdWJyksCiAgICAoMHg1MjIsICdNJywgdSfUoycpLAogICAgKDB4NTIzLCAnVicpLAogICAgKDB4NTI0LCAnTScsIHUn1KUnKSwKICAgICgweDUyNSwgJ1YnKSwKICAgICgweDUyNiwgJ00nLCB1J9SnJyksCiAgICAoMHg1MjcsICdWJyksCiAgICAoMHg1MjgsICdYJyksCiAgICAoMHg1MzEsICdNJywgdSfVoScpLAogICAgKDB4NTMyLCAnTScsIHUn1aInKSwKICAgICgweDUzMywgJ00nLCB1J9WjJyksCiAgICAoMHg1MzQsICdNJywgdSfVpCcpLAogICAgKDB4NTM1LCAnTScsIHUn1aUnKSwKICAgICgweDUzNiwgJ00nLCB1J9WmJyksCiAgICAoMHg1MzcsICdNJywgdSfVpycpLAogICAgKDB4NTM4LCAnTScsIHUn1agnKSwKICAgICgweDUzOSwgJ00nLCB1J9WpJyksCiAgICAoMHg1M0EsICdNJywgdSfVqicpLAogICAgKDB4NTNCLCAnTScsIHUn1asnKSwKICAgICgweDUzQywgJ00nLCB1J9WsJyksCiAgICAoMHg1M0QsICdNJywgdSfVrScpLAogICAgKDB4NTNFLCAnTScsIHUn1a4nKSwKICAgICgweDUzRiwgJ00nLCB1J9WvJyksCiAgICAoMHg1NDAsICdNJywgdSfVsCcpLAogICAgKDB4NTQxLCAnTScsIHUn1bEnKSwKICAgICgweDU0MiwgJ00nLCB1J9WyJyksCiAgICAoMHg1NDMsICdNJywgdSfVsycpLAogICAgKDB4NTQ0LCAnTScsIHUn1bQnKSwKICAgICgweDU0NSwgJ00nLCB1J9W1JyksCiAgICAoMHg1NDYsICdNJywgdSfVticpLAogICAgKDB4NTQ3LCAnTScsIHUn1bcnKSwKICAgICgweDU0OCwgJ00nLCB1J9W4JyksCiAgICAoMHg1NDksICdNJywgdSfVuScpLAogICAgKDB4NTRBLCAnTScsIHUn1bonKSwKICAgICgweDU0QiwgJ00nLCB1J9W7JyksCiAgICAoMHg1NEMsICdNJywgdSfVvCcpLAogICAgKDB4NTRELCAnTScsIHUn1b0nKSwKICAgICgweDU0RSwgJ00nLCB1J9W+JyksCiAgICAoMHg1NEYsICdNJywgdSfVvycpLAogICAgKDB4NTUwLCAnTScsIHUn1oAnKSwKICAgICgweDU1MSwgJ00nLCB1J9aBJyksCiAgICAoMHg1NTIsICdNJywgdSfWgicpLAogICAgKDB4NTUzLCAnTScsIHUn1oMnKSwKICAgICgweDU1NCwgJ00nLCB1J9aEJyksCiAgICAoMHg1NTUsICdNJywgdSfWhScpLAogICAgKDB4NTU2LCAnTScsIHUn1oYnKSwKICAgICgweDU1NywgJ1gnKSwKICAgICgweDU1OSwgJ1YnKSwKICAgICgweDU2MCwgJ1gnKSwKICAgICgweDU2MSwgJ1YnKSwKICAgICgweDU4NywgJ00nLCB1J9Wl1oInKSwKICAgICgweDU4OCwgJ1gnKSwKICAgICgweDU4OSwgJ1YnKSwKICAgICgweDU4QiwgJ1gnKSwKICAgICgweDU4RiwgJ1YnKSwKICAgICgweDU5MCwgJ1gnKSwKICAgICgweDU5MSwgJ1YnKSwKICAgICgweDVDOCwgJ1gnKSwKICAgICgweDVEMCwgJ1YnKSwKICAgICgweDVFQiwgJ1gnKSwKICAgICgweDVGMCwgJ1YnKSwKICAgICgweDVGNSwgJ1gnKSwKICAgICgweDYwNiwgJ1YnKSwKICAgICgweDYxQywgJ1gnKSwKICAgICgweDYxRSwgJ1YnKSwKICAgICgweDY3NSwgJ00nLCB1J9in2bQnKSwKICAgICgweDY3NiwgJ00nLCB1J9mI2bQnKSwKICAgICgweDY3NywgJ00nLCB1J9uH2bQnKSwKICAgICgweDY3OCwgJ00nLCB1J9mK2bQnKSwKICAgICgweDY3OSwgJ1YnKSwKICAgICgweDZERCwgJ1gnKSwKICAgIF0KCmRlZiBfc2VnXzEwKCk6CiAgICByZXR1cm4gWwogICAgKDB4NkRFLCAnVicpLAogICAgKDB4NzBFLCAnWCcpLAogICAgKDB4NzEwLCAnVicpLAogICAgKDB4NzRCLCAnWCcpLAogICAgKDB4NzRELCAnVicpLAogICAgKDB4N0IyLCAnWCcpLAogICAgKDB4N0MwLCAnVicpLAogICAgKDB4N0ZCLCAnWCcpLAogICAgKDB4ODAwLCAnVicpLAogICAgKDB4ODJFLCAnWCcpLAogICAgKDB4ODMwLCAnVicpLAogICAgKDB4ODNGLCAnWCcpLAogICAgKDB4ODQwLCAnVicpLAogICAgKDB4ODVDLCAnWCcpLAogICAgKDB4ODVFLCAnVicpLAogICAgKDB4ODVGLCAnWCcpLAogICAgKDB4OEEwLCAnVicpLAogICAgKDB4OEExLCAnWCcpLAogICAgKDB4OEEyLCAnVicpLAogICAgKDB4OEFELCAnWCcpLAogICAgKDB4OEU0LCAnVicpLAogICAgKDB4OEZGLCAnWCcpLAogICAgKDB4OTAwLCAnVicpLAogICAgKDB4OTU4LCAnTScsIHUn4KSV4KS8JyksCiAgICAoMHg5NTksICdNJywgdSfgpJbgpLwnKSwKICAgICgweDk1QSwgJ00nLCB1J+Ckl+CkvCcpLAogICAgKDB4OTVCLCAnTScsIHUn4KSc4KS8JyksCiAgICAoMHg5NUMsICdNJywgdSfgpKHgpLwnKSwKICAgICgweDk1RCwgJ00nLCB1J+CkouCkvCcpLAogICAgKDB4OTVFLCAnTScsIHUn4KSr4KS8JyksCiAgICAoMHg5NUYsICdNJywgdSfgpK/gpLwnKSwKICAgICgweDk2MCwgJ1YnKSwKICAgICgweDk3OCwgJ1gnKSwKICAgICgweDk3OSwgJ1YnKSwKICAgICgweDk4MCwgJ1gnKSwKICAgICgweDk4MSwgJ1YnKSwKICAgICgweDk4NCwgJ1gnKSwKICAgICgweDk4NSwgJ1YnKSwKICAgICgweDk4RCwgJ1gnKSwKICAgICgweDk4RiwgJ1YnKSwKICAgICgweDk5MSwgJ1gnKSwKICAgICgweDk5MywgJ1YnKSwKICAgICgweDlBOSwgJ1gnKSwKICAgICgweDlBQSwgJ1YnKSwKICAgICgweDlCMSwgJ1gnKSwKICAgICgweDlCMiwgJ1YnKSwKICAgICgweDlCMywgJ1gnKSwKICAgICgweDlCNiwgJ1YnKSwKICAgICgweDlCQSwgJ1gnKSwKICAgICgweDlCQywgJ1YnKSwKICAgICgweDlDNSwgJ1gnKSwKICAgICgweDlDNywgJ1YnKSwKICAgICgweDlDOSwgJ1gnKSwKICAgICgweDlDQiwgJ1YnKSwKICAgICgweDlDRiwgJ1gnKSwKICAgICgweDlENywgJ1YnKSwKICAgICgweDlEOCwgJ1gnKSwKICAgICgweDlEQywgJ00nLCB1J+CmoeCmvCcpLAogICAgKDB4OURELCAnTScsIHUn4Kai4Ka8JyksCiAgICAoMHg5REUsICdYJyksCiAgICAoMHg5REYsICdNJywgdSfgpq/gprwnKSwKICAgICgweDlFMCwgJ1YnKSwKICAgICgweDlFNCwgJ1gnKSwKICAgICgweDlFNiwgJ1YnKSwKICAgICgweDlGQywgJ1gnKSwKICAgICgweEEwMSwgJ1YnKSwKICAgICgweEEwNCwgJ1gnKSwKICAgICgweEEwNSwgJ1YnKSwKICAgICgweEEwQiwgJ1gnKSwKICAgICgweEEwRiwgJ1YnKSwKICAgICgweEExMSwgJ1gnKSwKICAgICgweEExMywgJ1YnKSwKICAgICgweEEyOSwgJ1gnKSwKICAgICgweEEyQSwgJ1YnKSwKICAgICgweEEzMSwgJ1gnKSwKICAgICgweEEzMiwgJ1YnKSwKICAgICgweEEzMywgJ00nLCB1J+CosuCovCcpLAogICAgKDB4QTM0LCAnWCcpLAogICAgKDB4QTM1LCAnVicpLAogICAgKDB4QTM2LCAnTScsIHUn4Ki44Ki8JyksCiAgICAoMHhBMzcsICdYJyksCiAgICAoMHhBMzgsICdWJyksCiAgICAoMHhBM0EsICdYJyksCiAgICAoMHhBM0MsICdWJyksCiAgICAoMHhBM0QsICdYJyksCiAgICAoMHhBM0UsICdWJyksCiAgICAoMHhBNDMsICdYJyksCiAgICAoMHhBNDcsICdWJyksCiAgICAoMHhBNDksICdYJyksCiAgICAoMHhBNEIsICdWJyksCiAgICAoMHhBNEUsICdYJyksCiAgICAoMHhBNTEsICdWJyksCiAgICAoMHhBNTIsICdYJyksCiAgICAoMHhBNTksICdNJywgdSfgqJbgqLwnKSwKICAgICgweEE1QSwgJ00nLCB1J+Col+CovCcpLAogICAgKDB4QTVCLCAnTScsIHUn4Kic4Ki8JyksCiAgICAoMHhBNUMsICdWJyksCiAgICAoMHhBNUQsICdYJyksCiAgICAoMHhBNUUsICdNJywgdSfgqKvgqLwnKSwKICAgICgweEE1RiwgJ1gnKSwKICAgIF0KCmRlZiBfc2VnXzExKCk6CiAgICByZXR1cm4gWwogICAgKDB4QTY2LCAnVicpLAogICAgKDB4QTc2LCAnWCcpLAogICAgKDB4QTgxLCAnVicpLAogICAgKDB4QTg0LCAnWCcpLAogICAgKDB4QTg1LCAnVicpLAogICAgKDB4QThFLCAnWCcpLAogICAgKDB4QThGLCAnVicpLAogICAgKDB4QTkyLCAnWCcpLAogICAgKDB4QTkzLCAnVicpLAogICAgKDB4QUE5LCAnWCcpLAogICAgKDB4QUFBLCAnVicpLAogICAgKDB4QUIxLCAnWCcpLAogICAgKDB4QUIyLCAnVicpLAogICAgKDB4QUI0LCAnWCcpLAogICAgKDB4QUI1LCAnVicpLAogICAgKDB4QUJBLCAnWCcpLAogICAgKDB4QUJDLCAnVicpLAogICAgKDB4QUM2LCAnWCcpLAogICAgKDB4QUM3LCAnVicpLAogICAgKDB4QUNBLCAnWCcpLAogICAgKDB4QUNCLCAnVicpLAogICAgKDB4QUNFLCAnWCcpLAogICAgKDB4QUQwLCAnVicpLAogICAgKDB4QUQxLCAnWCcpLAogICAgKDB4QUUwLCAnVicpLAogICAgKDB4QUU0LCAnWCcpLAogICAgKDB4QUU2LCAnVicpLAogICAgKDB4QUYyLCAnWCcpLAogICAgKDB4QjAxLCAnVicpLAogICAgKDB4QjA0LCAnWCcpLAogICAgKDB4QjA1LCAnVicpLAogICAgKDB4QjBELCAnWCcpLAogICAgKDB4QjBGLCAnVicpLAogICAgKDB4QjExLCAnWCcpLAogICAgKDB4QjEzLCAnVicpLAogICAgKDB4QjI5LCAnWCcpLAogICAgKDB4QjJBLCAnVicpLAogICAgKDB4QjMxLCAnWCcpLAogICAgKDB4QjMyLCAnVicpLAogICAgKDB4QjM0LCAnWCcpLAogICAgKDB4QjM1LCAnVicpLAogICAgKDB4QjNBLCAnWCcpLAogICAgKDB4QjNDLCAnVicpLAogICAgKDB4QjQ1LCAnWCcpLAogICAgKDB4QjQ3LCAnVicpLAogICAgKDB4QjQ5LCAnWCcpLAogICAgKDB4QjRCLCAnVicpLAogICAgKDB4QjRFLCAnWCcpLAogICAgKDB4QjU2LCAnVicpLAogICAgKDB4QjU4LCAnWCcpLAogICAgKDB4QjVDLCAnTScsIHUn4Kyh4Ky8JyksCiAgICAoMHhCNUQsICdNJywgdSfgrKLgrLwnKSwKICAgICgweEI1RSwgJ1gnKSwKICAgICgweEI1RiwgJ1YnKSwKICAgICgweEI2NCwgJ1gnKSwKICAgICgweEI2NiwgJ1YnKSwKICAgICgweEI3OCwgJ1gnKSwKICAgICgweEI4MiwgJ1YnKSwKICAgICgweEI4NCwgJ1gnKSwKICAgICgweEI4NSwgJ1YnKSwKICAgICgweEI4QiwgJ1gnKSwKICAgICgweEI4RSwgJ1YnKSwKICAgICgweEI5MSwgJ1gnKSwKICAgICgweEI5MiwgJ1YnKSwKICAgICgweEI5NiwgJ1gnKSwKICAgICgweEI5OSwgJ1YnKSwKICAgICgweEI5QiwgJ1gnKSwKICAgICgweEI5QywgJ1YnKSwKICAgICgweEI5RCwgJ1gnKSwKICAgICgweEI5RSwgJ1YnKSwKICAgICgweEJBMCwgJ1gnKSwKICAgICgweEJBMywgJ1YnKSwKICAgICgweEJBNSwgJ1gnKSwKICAgICgweEJBOCwgJ1YnKSwKICAgICgweEJBQiwgJ1gnKSwKICAgICgweEJBRSwgJ1YnKSwKICAgICgweEJCQSwgJ1gnKSwKICAgICgweEJCRSwgJ1YnKSwKICAgICgweEJDMywgJ1gnKSwKICAgICgweEJDNiwgJ1YnKSwKICAgICgweEJDOSwgJ1gnKSwKICAgICgweEJDQSwgJ1YnKSwKICAgICgweEJDRSwgJ1gnKSwKICAgICgweEJEMCwgJ1YnKSwKICAgICgweEJEMSwgJ1gnKSwKICAgICgweEJENywgJ1YnKSwKICAgICgweEJEOCwgJ1gnKSwKICAgICgweEJFNiwgJ1YnKSwKICAgICgweEJGQiwgJ1gnKSwKICAgICgweEMwMSwgJ1YnKSwKICAgICgweEMwNCwgJ1gnKSwKICAgICgweEMwNSwgJ1YnKSwKICAgICgweEMwRCwgJ1gnKSwKICAgICgweEMwRSwgJ1YnKSwKICAgICgweEMxMSwgJ1gnKSwKICAgICgweEMxMiwgJ1YnKSwKICAgICgweEMyOSwgJ1gnKSwKICAgICgweEMyQSwgJ1YnKSwKICAgICgweEMzNCwgJ1gnKSwKICAgICgweEMzNSwgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzEyKCk6CiAgICByZXR1cm4gWwogICAgKDB4QzNBLCAnWCcpLAogICAgKDB4QzNELCAnVicpLAogICAgKDB4QzQ1LCAnWCcpLAogICAgKDB4QzQ2LCAnVicpLAogICAgKDB4QzQ5LCAnWCcpLAogICAgKDB4QzRBLCAnVicpLAogICAgKDB4QzRFLCAnWCcpLAogICAgKDB4QzU1LCAnVicpLAogICAgKDB4QzU3LCAnWCcpLAogICAgKDB4QzU4LCAnVicpLAogICAgKDB4QzVBLCAnWCcpLAogICAgKDB4QzYwLCAnVicpLAogICAgKDB4QzY0LCAnWCcpLAogICAgKDB4QzY2LCAnVicpLAogICAgKDB4QzcwLCAnWCcpLAogICAgKDB4Qzc4LCAnVicpLAogICAgKDB4QzgwLCAnWCcpLAogICAgKDB4QzgyLCAnVicpLAogICAgKDB4Qzg0LCAnWCcpLAogICAgKDB4Qzg1LCAnVicpLAogICAgKDB4QzhELCAnWCcpLAogICAgKDB4QzhFLCAnVicpLAogICAgKDB4QzkxLCAnWCcpLAogICAgKDB4QzkyLCAnVicpLAogICAgKDB4Q0E5LCAnWCcpLAogICAgKDB4Q0FBLCAnVicpLAogICAgKDB4Q0I0LCAnWCcpLAogICAgKDB4Q0I1LCAnVicpLAogICAgKDB4Q0JBLCAnWCcpLAogICAgKDB4Q0JDLCAnVicpLAogICAgKDB4Q0M1LCAnWCcpLAogICAgKDB4Q0M2LCAnVicpLAogICAgKDB4Q0M5LCAnWCcpLAogICAgKDB4Q0NBLCAnVicpLAogICAgKDB4Q0NFLCAnWCcpLAogICAgKDB4Q0Q1LCAnVicpLAogICAgKDB4Q0Q3LCAnWCcpLAogICAgKDB4Q0RFLCAnVicpLAogICAgKDB4Q0RGLCAnWCcpLAogICAgKDB4Q0UwLCAnVicpLAogICAgKDB4Q0U0LCAnWCcpLAogICAgKDB4Q0U2LCAnVicpLAogICAgKDB4Q0YwLCAnWCcpLAogICAgKDB4Q0YxLCAnVicpLAogICAgKDB4Q0YzLCAnWCcpLAogICAgKDB4RDAyLCAnVicpLAogICAgKDB4RDA0LCAnWCcpLAogICAgKDB4RDA1LCAnVicpLAogICAgKDB4RDBELCAnWCcpLAogICAgKDB4RDBFLCAnVicpLAogICAgKDB4RDExLCAnWCcpLAogICAgKDB4RDEyLCAnVicpLAogICAgKDB4RDNCLCAnWCcpLAogICAgKDB4RDNELCAnVicpLAogICAgKDB4RDQ1LCAnWCcpLAogICAgKDB4RDQ2LCAnVicpLAogICAgKDB4RDQ5LCAnWCcpLAogICAgKDB4RDRBLCAnVicpLAogICAgKDB4RDRGLCAnWCcpLAogICAgKDB4RDU3LCAnVicpLAogICAgKDB4RDU4LCAnWCcpLAogICAgKDB4RDYwLCAnVicpLAogICAgKDB4RDY0LCAnWCcpLAogICAgKDB4RDY2LCAnVicpLAogICAgKDB4RDc2LCAnWCcpLAogICAgKDB4RDc5LCAnVicpLAogICAgKDB4RDgwLCAnWCcpLAogICAgKDB4RDgyLCAnVicpLAogICAgKDB4RDg0LCAnWCcpLAogICAgKDB4RDg1LCAnVicpLAogICAgKDB4RDk3LCAnWCcpLAogICAgKDB4RDlBLCAnVicpLAogICAgKDB4REIyLCAnWCcpLAogICAgKDB4REIzLCAnVicpLAogICAgKDB4REJDLCAnWCcpLAogICAgKDB4REJELCAnVicpLAogICAgKDB4REJFLCAnWCcpLAogICAgKDB4REMwLCAnVicpLAogICAgKDB4REM3LCAnWCcpLAogICAgKDB4RENBLCAnVicpLAogICAgKDB4RENCLCAnWCcpLAogICAgKDB4RENGLCAnVicpLAogICAgKDB4REQ1LCAnWCcpLAogICAgKDB4REQ2LCAnVicpLAogICAgKDB4REQ3LCAnWCcpLAogICAgKDB4REQ4LCAnVicpLAogICAgKDB4REUwLCAnWCcpLAogICAgKDB4REYyLCAnVicpLAogICAgKDB4REY1LCAnWCcpLAogICAgKDB4RTAxLCAnVicpLAogICAgKDB4RTMzLCAnTScsIHUn4LmN4LiyJyksCiAgICAoMHhFMzQsICdWJyksCiAgICAoMHhFM0IsICdYJyksCiAgICAoMHhFM0YsICdWJyksCiAgICAoMHhFNUMsICdYJyksCiAgICAoMHhFODEsICdWJyksCiAgICAoMHhFODMsICdYJyksCiAgICAoMHhFODQsICdWJyksCiAgICAoMHhFODUsICdYJyksCiAgICAoMHhFODcsICdWJyksCiAgICBdCgpkZWYgX3NlZ18xMygpOgogICAgcmV0dXJuIFsKICAgICgweEU4OSwgJ1gnKSwKICAgICgweEU4QSwgJ1YnKSwKICAgICgweEU4QiwgJ1gnKSwKICAgICgweEU4RCwgJ1YnKSwKICAgICgweEU4RSwgJ1gnKSwKICAgICgweEU5NCwgJ1YnKSwKICAgICgweEU5OCwgJ1gnKSwKICAgICgweEU5OSwgJ1YnKSwKICAgICgweEVBMCwgJ1gnKSwKICAgICgweEVBMSwgJ1YnKSwKICAgICgweEVBNCwgJ1gnKSwKICAgICgweEVBNSwgJ1YnKSwKICAgICgweEVBNiwgJ1gnKSwKICAgICgweEVBNywgJ1YnKSwKICAgICgweEVBOCwgJ1gnKSwKICAgICgweEVBQSwgJ1YnKSwKICAgICgweEVBQywgJ1gnKSwKICAgICgweEVBRCwgJ1YnKSwKICAgICgweEVCMywgJ00nLCB1J+C7jeC6sicpLAogICAgKDB4RUI0LCAnVicpLAogICAgKDB4RUJBLCAnWCcpLAogICAgKDB4RUJCLCAnVicpLAogICAgKDB4RUJFLCAnWCcpLAogICAgKDB4RUMwLCAnVicpLAogICAgKDB4RUM1LCAnWCcpLAogICAgKDB4RUM2LCAnVicpLAogICAgKDB4RUM3LCAnWCcpLAogICAgKDB4RUM4LCAnVicpLAogICAgKDB4RUNFLCAnWCcpLAogICAgKDB4RUQwLCAnVicpLAogICAgKDB4RURBLCAnWCcpLAogICAgKDB4RURDLCAnTScsIHUn4Lqr4LqZJyksCiAgICAoMHhFREQsICdNJywgdSfguqvguqEnKSwKICAgICgweEVERSwgJ1YnKSwKICAgICgweEVFMCwgJ1gnKSwKICAgICgweEYwMCwgJ1YnKSwKICAgICgweEYwQywgJ00nLCB1J+C8iycpLAogICAgKDB4RjBELCAnVicpLAogICAgKDB4RjQzLCAnTScsIHUn4L2C4L63JyksCiAgICAoMHhGNDQsICdWJyksCiAgICAoMHhGNDgsICdYJyksCiAgICAoMHhGNDksICdWJyksCiAgICAoMHhGNEQsICdNJywgdSfgvYzgvrcnKSwKICAgICgweEY0RSwgJ1YnKSwKICAgICgweEY1MiwgJ00nLCB1J+C9keC+tycpLAogICAgKDB4RjUzLCAnVicpLAogICAgKDB4RjU3LCAnTScsIHUn4L2W4L63JyksCiAgICAoMHhGNTgsICdWJyksCiAgICAoMHhGNUMsICdNJywgdSfgvZvgvrcnKSwKICAgICgweEY1RCwgJ1YnKSwKICAgICgweEY2OSwgJ00nLCB1J+C9gOC+tScpLAogICAgKDB4RjZBLCAnVicpLAogICAgKDB4RjZELCAnWCcpLAogICAgKDB4RjcxLCAnVicpLAogICAgKDB4RjczLCAnTScsIHUn4L2x4L2yJyksCiAgICAoMHhGNzQsICdWJyksCiAgICAoMHhGNzUsICdNJywgdSfgvbHgvbQnKSwKICAgICgweEY3NiwgJ00nLCB1J+C+suC+gCcpLAogICAgKDB4Rjc3LCAnTScsIHUn4L6y4L2x4L6AJyksCiAgICAoMHhGNzgsICdNJywgdSfgvrPgvoAnKSwKICAgICgweEY3OSwgJ00nLCB1J+C+s+C9seC+gCcpLAogICAgKDB4RjdBLCAnVicpLAogICAgKDB4RjgxLCAnTScsIHUn4L2x4L6AJyksCiAgICAoMHhGODIsICdWJyksCiAgICAoMHhGOTMsICdNJywgdSfgvpLgvrcnKSwKICAgICgweEY5NCwgJ1YnKSwKICAgICgweEY5OCwgJ1gnKSwKICAgICgweEY5OSwgJ1YnKSwKICAgICgweEY5RCwgJ00nLCB1J+C+nOC+tycpLAogICAgKDB4RjlFLCAnVicpLAogICAgKDB4RkEyLCAnTScsIHUn4L6h4L63JyksCiAgICAoMHhGQTMsICdWJyksCiAgICAoMHhGQTcsICdNJywgdSfgvqbgvrcnKSwKICAgICgweEZBOCwgJ1YnKSwKICAgICgweEZBQywgJ00nLCB1J+C+q+C+tycpLAogICAgKDB4RkFELCAnVicpLAogICAgKDB4RkI5LCAnTScsIHUn4L6Q4L61JyksCiAgICAoMHhGQkEsICdWJyksCiAgICAoMHhGQkQsICdYJyksCiAgICAoMHhGQkUsICdWJyksCiAgICAoMHhGQ0QsICdYJyksCiAgICAoMHhGQ0UsICdWJyksCiAgICAoMHhGREIsICdYJyksCiAgICAoMHgxMDAwLCAnVicpLAogICAgKDB4MTBBMCwgJ1gnKSwKICAgICgweDEwQzcsICdNJywgdSfitKcnKSwKICAgICgweDEwQzgsICdYJyksCiAgICAoMHgxMENELCAnTScsIHUn4rStJyksCiAgICAoMHgxMENFLCAnWCcpLAogICAgKDB4MTBEMCwgJ1YnKSwKICAgICgweDEwRkMsICdNJywgdSfhg5wnKSwKICAgICgweDEwRkQsICdWJyksCiAgICAoMHgxMTVGLCAnWCcpLAogICAgKDB4MTE2MSwgJ1YnKSwKICAgICgweDEyNDksICdYJyksCiAgICAoMHgxMjRBLCAnVicpLAogICAgKDB4MTI0RSwgJ1gnKSwKICAgICgweDEyNTAsICdWJyksCiAgICAoMHgxMjU3LCAnWCcpLAogICAgKDB4MTI1OCwgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzE0KCk6CiAgICByZXR1cm4gWwogICAgKDB4MTI1OSwgJ1gnKSwKICAgICgweDEyNUEsICdWJyksCiAgICAoMHgxMjVFLCAnWCcpLAogICAgKDB4MTI2MCwgJ1YnKSwKICAgICgweDEyODksICdYJyksCiAgICAoMHgxMjhBLCAnVicpLAogICAgKDB4MTI4RSwgJ1gnKSwKICAgICgweDEyOTAsICdWJyksCiAgICAoMHgxMkIxLCAnWCcpLAogICAgKDB4MTJCMiwgJ1YnKSwKICAgICgweDEyQjYsICdYJyksCiAgICAoMHgxMkI4LCAnVicpLAogICAgKDB4MTJCRiwgJ1gnKSwKICAgICgweDEyQzAsICdWJyksCiAgICAoMHgxMkMxLCAnWCcpLAogICAgKDB4MTJDMiwgJ1YnKSwKICAgICgweDEyQzYsICdYJyksCiAgICAoMHgxMkM4LCAnVicpLAogICAgKDB4MTJENywgJ1gnKSwKICAgICgweDEyRDgsICdWJyksCiAgICAoMHgxMzExLCAnWCcpLAogICAgKDB4MTMxMiwgJ1YnKSwKICAgICgweDEzMTYsICdYJyksCiAgICAoMHgxMzE4LCAnVicpLAogICAgKDB4MTM1QiwgJ1gnKSwKICAgICgweDEzNUQsICdWJyksCiAgICAoMHgxMzdELCAnWCcpLAogICAgKDB4MTM4MCwgJ1YnKSwKICAgICgweDEzOUEsICdYJyksCiAgICAoMHgxM0EwLCAnVicpLAogICAgKDB4MTNGNSwgJ1gnKSwKICAgICgweDE0MDAsICdWJyksCiAgICAoMHgxNjgwLCAnWCcpLAogICAgKDB4MTY4MSwgJ1YnKSwKICAgICgweDE2OUQsICdYJyksCiAgICAoMHgxNkEwLCAnVicpLAogICAgKDB4MTZGMSwgJ1gnKSwKICAgICgweDE3MDAsICdWJyksCiAgICAoMHgxNzBELCAnWCcpLAogICAgKDB4MTcwRSwgJ1YnKSwKICAgICgweDE3MTUsICdYJyksCiAgICAoMHgxNzIwLCAnVicpLAogICAgKDB4MTczNywgJ1gnKSwKICAgICgweDE3NDAsICdWJyksCiAgICAoMHgxNzU0LCAnWCcpLAogICAgKDB4MTc2MCwgJ1YnKSwKICAgICgweDE3NkQsICdYJyksCiAgICAoMHgxNzZFLCAnVicpLAogICAgKDB4MTc3MSwgJ1gnKSwKICAgICgweDE3NzIsICdWJyksCiAgICAoMHgxNzc0LCAnWCcpLAogICAgKDB4MTc4MCwgJ1YnKSwKICAgICgweDE3QjQsICdYJyksCiAgICAoMHgxN0I2LCAnVicpLAogICAgKDB4MTdERSwgJ1gnKSwKICAgICgweDE3RTAsICdWJyksCiAgICAoMHgxN0VBLCAnWCcpLAogICAgKDB4MTdGMCwgJ1YnKSwKICAgICgweDE3RkEsICdYJyksCiAgICAoMHgxODAwLCAnVicpLAogICAgKDB4MTgwNiwgJ1gnKSwKICAgICgweDE4MDcsICdWJyksCiAgICAoMHgxODBCLCAnSScpLAogICAgKDB4MTgwRSwgJ1gnKSwKICAgICgweDE4MTAsICdWJyksCiAgICAoMHgxODFBLCAnWCcpLAogICAgKDB4MTgyMCwgJ1YnKSwKICAgICgweDE4NzgsICdYJyksCiAgICAoMHgxODgwLCAnVicpLAogICAgKDB4MThBQiwgJ1gnKSwKICAgICgweDE4QjAsICdWJyksCiAgICAoMHgxOEY2LCAnWCcpLAogICAgKDB4MTkwMCwgJ1YnKSwKICAgICgweDE5MUQsICdYJyksCiAgICAoMHgxOTIwLCAnVicpLAogICAgKDB4MTkyQywgJ1gnKSwKICAgICgweDE5MzAsICdWJyksCiAgICAoMHgxOTNDLCAnWCcpLAogICAgKDB4MTk0MCwgJ1YnKSwKICAgICgweDE5NDEsICdYJyksCiAgICAoMHgxOTQ0LCAnVicpLAogICAgKDB4MTk2RSwgJ1gnKSwKICAgICgweDE5NzAsICdWJyksCiAgICAoMHgxOTc1LCAnWCcpLAogICAgKDB4MTk4MCwgJ1YnKSwKICAgICgweDE5QUMsICdYJyksCiAgICAoMHgxOUIwLCAnVicpLAogICAgKDB4MTlDQSwgJ1gnKSwKICAgICgweDE5RDAsICdWJyksCiAgICAoMHgxOURCLCAnWCcpLAogICAgKDB4MTlERSwgJ1YnKSwKICAgICgweDFBMUMsICdYJyksCiAgICAoMHgxQTFFLCAnVicpLAogICAgKDB4MUE1RiwgJ1gnKSwKICAgICgweDFBNjAsICdWJyksCiAgICAoMHgxQTdELCAnWCcpLAogICAgKDB4MUE3RiwgJ1YnKSwKICAgICgweDFBOEEsICdYJyksCiAgICAoMHgxQTkwLCAnVicpLAogICAgKDB4MUE5QSwgJ1gnKSwKICAgIF0KCmRlZiBfc2VnXzE1KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUFBMCwgJ1YnKSwKICAgICgweDFBQUUsICdYJyksCiAgICAoMHgxQjAwLCAnVicpLAogICAgKDB4MUI0QywgJ1gnKSwKICAgICgweDFCNTAsICdWJyksCiAgICAoMHgxQjdELCAnWCcpLAogICAgKDB4MUI4MCwgJ1YnKSwKICAgICgweDFCRjQsICdYJyksCiAgICAoMHgxQkZDLCAnVicpLAogICAgKDB4MUMzOCwgJ1gnKSwKICAgICgweDFDM0IsICdWJyksCiAgICAoMHgxQzRBLCAnWCcpLAogICAgKDB4MUM0RCwgJ1YnKSwKICAgICgweDFDODAsICdYJyksCiAgICAoMHgxQ0MwLCAnVicpLAogICAgKDB4MUNDOCwgJ1gnKSwKICAgICgweDFDRDAsICdWJyksCiAgICAoMHgxQ0Y3LCAnWCcpLAogICAgKDB4MUQwMCwgJ1YnKSwKICAgICgweDFEMkMsICdNJywgdSdhJyksCiAgICAoMHgxRDJELCAnTScsIHUnw6YnKSwKICAgICgweDFEMkUsICdNJywgdSdiJyksCiAgICAoMHgxRDJGLCAnVicpLAogICAgKDB4MUQzMCwgJ00nLCB1J2QnKSwKICAgICgweDFEMzEsICdNJywgdSdlJyksCiAgICAoMHgxRDMyLCAnTScsIHUnx50nKSwKICAgICgweDFEMzMsICdNJywgdSdnJyksCiAgICAoMHgxRDM0LCAnTScsIHUnaCcpLAogICAgKDB4MUQzNSwgJ00nLCB1J2knKSwKICAgICgweDFEMzYsICdNJywgdSdqJyksCiAgICAoMHgxRDM3LCAnTScsIHUnaycpLAogICAgKDB4MUQzOCwgJ00nLCB1J2wnKSwKICAgICgweDFEMzksICdNJywgdSdtJyksCiAgICAoMHgxRDNBLCAnTScsIHUnbicpLAogICAgKDB4MUQzQiwgJ1YnKSwKICAgICgweDFEM0MsICdNJywgdSdvJyksCiAgICAoMHgxRDNELCAnTScsIHUnyKMnKSwKICAgICgweDFEM0UsICdNJywgdSdwJyksCiAgICAoMHgxRDNGLCAnTScsIHUncicpLAogICAgKDB4MUQ0MCwgJ00nLCB1J3QnKSwKICAgICgweDFENDEsICdNJywgdSd1JyksCiAgICAoMHgxRDQyLCAnTScsIHUndycpLAogICAgKDB4MUQ0MywgJ00nLCB1J2EnKSwKICAgICgweDFENDQsICdNJywgdSfJkCcpLAogICAgKDB4MUQ0NSwgJ00nLCB1J8mRJyksCiAgICAoMHgxRDQ2LCAnTScsIHUn4bSCJyksCiAgICAoMHgxRDQ3LCAnTScsIHUnYicpLAogICAgKDB4MUQ0OCwgJ00nLCB1J2QnKSwKICAgICgweDFENDksICdNJywgdSdlJyksCiAgICAoMHgxRDRBLCAnTScsIHUnyZknKSwKICAgICgweDFENEIsICdNJywgdSfJmycpLAogICAgKDB4MUQ0QywgJ00nLCB1J8mcJyksCiAgICAoMHgxRDRELCAnTScsIHUnZycpLAogICAgKDB4MUQ0RSwgJ1YnKSwKICAgICgweDFENEYsICdNJywgdSdrJyksCiAgICAoMHgxRDUwLCAnTScsIHUnbScpLAogICAgKDB4MUQ1MSwgJ00nLCB1J8WLJyksCiAgICAoMHgxRDUyLCAnTScsIHUnbycpLAogICAgKDB4MUQ1MywgJ00nLCB1J8mUJyksCiAgICAoMHgxRDU0LCAnTScsIHUn4bSWJyksCiAgICAoMHgxRDU1LCAnTScsIHUn4bSXJyksCiAgICAoMHgxRDU2LCAnTScsIHUncCcpLAogICAgKDB4MUQ1NywgJ00nLCB1J3QnKSwKICAgICgweDFENTgsICdNJywgdSd1JyksCiAgICAoMHgxRDU5LCAnTScsIHUn4bSdJyksCiAgICAoMHgxRDVBLCAnTScsIHUnya8nKSwKICAgICgweDFENUIsICdNJywgdSd2JyksCiAgICAoMHgxRDVDLCAnTScsIHUn4bSlJyksCiAgICAoMHgxRDVELCAnTScsIHUnzrInKSwKICAgICgweDFENUUsICdNJywgdSfOsycpLAogICAgKDB4MUQ1RiwgJ00nLCB1J860JyksCiAgICAoMHgxRDYwLCAnTScsIHUnz4YnKSwKICAgICgweDFENjEsICdNJywgdSfPhycpLAogICAgKDB4MUQ2MiwgJ00nLCB1J2knKSwKICAgICgweDFENjMsICdNJywgdSdyJyksCiAgICAoMHgxRDY0LCAnTScsIHUndScpLAogICAgKDB4MUQ2NSwgJ00nLCB1J3YnKSwKICAgICgweDFENjYsICdNJywgdSfOsicpLAogICAgKDB4MUQ2NywgJ00nLCB1J86zJyksCiAgICAoMHgxRDY4LCAnTScsIHUnz4EnKSwKICAgICgweDFENjksICdNJywgdSfPhicpLAogICAgKDB4MUQ2QSwgJ00nLCB1J8+HJyksCiAgICAoMHgxRDZCLCAnVicpLAogICAgKDB4MUQ3OCwgJ00nLCB1J9C9JyksCiAgICAoMHgxRDc5LCAnVicpLAogICAgKDB4MUQ5QiwgJ00nLCB1J8mSJyksCiAgICAoMHgxRDlDLCAnTScsIHUnYycpLAogICAgKDB4MUQ5RCwgJ00nLCB1J8mVJyksCiAgICAoMHgxRDlFLCAnTScsIHUnw7AnKSwKICAgICgweDFEOUYsICdNJywgdSfJnCcpLAogICAgKDB4MURBMCwgJ00nLCB1J2YnKSwKICAgICgweDFEQTEsICdNJywgdSfJnycpLAogICAgKDB4MURBMiwgJ00nLCB1J8mhJyksCiAgICAoMHgxREEzLCAnTScsIHUnyaUnKSwKICAgICgweDFEQTQsICdNJywgdSfJqCcpLAogICAgKDB4MURBNSwgJ00nLCB1J8mpJyksCiAgICAoMHgxREE2LCAnTScsIHUnyaonKSwKICAgICgweDFEQTcsICdNJywgdSfhtbsnKSwKICAgICgweDFEQTgsICdNJywgdSfKnScpLAogICAgKDB4MURBOSwgJ00nLCB1J8mtJyksCiAgICBdCgpkZWYgX3NlZ18xNigpOgogICAgcmV0dXJuIFsKICAgICgweDFEQUEsICdNJywgdSfhtoUnKSwKICAgICgweDFEQUIsICdNJywgdSfKnycpLAogICAgKDB4MURBQywgJ00nLCB1J8mxJyksCiAgICAoMHgxREFELCAnTScsIHUnybAnKSwKICAgICgweDFEQUUsICdNJywgdSfJsicpLAogICAgKDB4MURBRiwgJ00nLCB1J8mzJyksCiAgICAoMHgxREIwLCAnTScsIHUnybQnKSwKICAgICgweDFEQjEsICdNJywgdSfJtScpLAogICAgKDB4MURCMiwgJ00nLCB1J8m4JyksCiAgICAoMHgxREIzLCAnTScsIHUnyoInKSwKICAgICgweDFEQjQsICdNJywgdSfKgycpLAogICAgKDB4MURCNSwgJ00nLCB1J8arJyksCiAgICAoMHgxREI2LCAnTScsIHUnyoknKSwKICAgICgweDFEQjcsICdNJywgdSfKiicpLAogICAgKDB4MURCOCwgJ00nLCB1J+G0nCcpLAogICAgKDB4MURCOSwgJ00nLCB1J8qLJyksCiAgICAoMHgxREJBLCAnTScsIHUnyownKSwKICAgICgweDFEQkIsICdNJywgdSd6JyksCiAgICAoMHgxREJDLCAnTScsIHUnypAnKSwKICAgICgweDFEQkQsICdNJywgdSfKkScpLAogICAgKDB4MURCRSwgJ00nLCB1J8qSJyksCiAgICAoMHgxREJGLCAnTScsIHUnzrgnKSwKICAgICgweDFEQzAsICdWJyksCiAgICAoMHgxREU3LCAnWCcpLAogICAgKDB4MURGQywgJ1YnKSwKICAgICgweDFFMDAsICdNJywgdSfhuIEnKSwKICAgICgweDFFMDEsICdWJyksCiAgICAoMHgxRTAyLCAnTScsIHUn4biDJyksCiAgICAoMHgxRTAzLCAnVicpLAogICAgKDB4MUUwNCwgJ00nLCB1J+G4hScpLAogICAgKDB4MUUwNSwgJ1YnKSwKICAgICgweDFFMDYsICdNJywgdSfhuIcnKSwKICAgICgweDFFMDcsICdWJyksCiAgICAoMHgxRTA4LCAnTScsIHUn4biJJyksCiAgICAoMHgxRTA5LCAnVicpLAogICAgKDB4MUUwQSwgJ00nLCB1J+G4iycpLAogICAgKDB4MUUwQiwgJ1YnKSwKICAgICgweDFFMEMsICdNJywgdSfhuI0nKSwKICAgICgweDFFMEQsICdWJyksCiAgICAoMHgxRTBFLCAnTScsIHUn4biPJyksCiAgICAoMHgxRTBGLCAnVicpLAogICAgKDB4MUUxMCwgJ00nLCB1J+G4kScpLAogICAgKDB4MUUxMSwgJ1YnKSwKICAgICgweDFFMTIsICdNJywgdSfhuJMnKSwKICAgICgweDFFMTMsICdWJyksCiAgICAoMHgxRTE0LCAnTScsIHUn4biVJyksCiAgICAoMHgxRTE1LCAnVicpLAogICAgKDB4MUUxNiwgJ00nLCB1J+G4lycpLAogICAgKDB4MUUxNywgJ1YnKSwKICAgICgweDFFMTgsICdNJywgdSfhuJknKSwKICAgICgweDFFMTksICdWJyksCiAgICAoMHgxRTFBLCAnTScsIHUn4bibJyksCiAgICAoMHgxRTFCLCAnVicpLAogICAgKDB4MUUxQywgJ00nLCB1J+G4nScpLAogICAgKDB4MUUxRCwgJ1YnKSwKICAgICgweDFFMUUsICdNJywgdSfhuJ8nKSwKICAgICgweDFFMUYsICdWJyksCiAgICAoMHgxRTIwLCAnTScsIHUn4bihJyksCiAgICAoMHgxRTIxLCAnVicpLAogICAgKDB4MUUyMiwgJ00nLCB1J+G4oycpLAogICAgKDB4MUUyMywgJ1YnKSwKICAgICgweDFFMjQsICdNJywgdSfhuKUnKSwKICAgICgweDFFMjUsICdWJyksCiAgICAoMHgxRTI2LCAnTScsIHUn4binJyksCiAgICAoMHgxRTI3LCAnVicpLAogICAgKDB4MUUyOCwgJ00nLCB1J+G4qScpLAogICAgKDB4MUUyOSwgJ1YnKSwKICAgICgweDFFMkEsICdNJywgdSfhuKsnKSwKICAgICgweDFFMkIsICdWJyksCiAgICAoMHgxRTJDLCAnTScsIHUn4bitJyksCiAgICAoMHgxRTJELCAnVicpLAogICAgKDB4MUUyRSwgJ00nLCB1J+G4rycpLAogICAgKDB4MUUyRiwgJ1YnKSwKICAgICgweDFFMzAsICdNJywgdSfhuLEnKSwKICAgICgweDFFMzEsICdWJyksCiAgICAoMHgxRTMyLCAnTScsIHUn4bizJyksCiAgICAoMHgxRTMzLCAnVicpLAogICAgKDB4MUUzNCwgJ00nLCB1J+G4tScpLAogICAgKDB4MUUzNSwgJ1YnKSwKICAgICgweDFFMzYsICdNJywgdSfhuLcnKSwKICAgICgweDFFMzcsICdWJyksCiAgICAoMHgxRTM4LCAnTScsIHUn4bi5JyksCiAgICAoMHgxRTM5LCAnVicpLAogICAgKDB4MUUzQSwgJ00nLCB1J+G4uycpLAogICAgKDB4MUUzQiwgJ1YnKSwKICAgICgweDFFM0MsICdNJywgdSfhuL0nKSwKICAgICgweDFFM0QsICdWJyksCiAgICAoMHgxRTNFLCAnTScsIHUn4bi/JyksCiAgICAoMHgxRTNGLCAnVicpLAogICAgKDB4MUU0MCwgJ00nLCB1J+G5gScpLAogICAgKDB4MUU0MSwgJ1YnKSwKICAgICgweDFFNDIsICdNJywgdSfhuYMnKSwKICAgICgweDFFNDMsICdWJyksCiAgICAoMHgxRTQ0LCAnTScsIHUn4bmFJyksCiAgICAoMHgxRTQ1LCAnVicpLAogICAgKDB4MUU0NiwgJ00nLCB1J+G5hycpLAogICAgKDB4MUU0NywgJ1YnKSwKICAgICgweDFFNDgsICdNJywgdSfhuYknKSwKICAgICgweDFFNDksICdWJyksCiAgICAoMHgxRTRBLCAnTScsIHUn4bmLJyksCiAgICBdCgpkZWYgX3NlZ18xNygpOgogICAgcmV0dXJuIFsKICAgICgweDFFNEIsICdWJyksCiAgICAoMHgxRTRDLCAnTScsIHUn4bmNJyksCiAgICAoMHgxRTRELCAnVicpLAogICAgKDB4MUU0RSwgJ00nLCB1J+G5jycpLAogICAgKDB4MUU0RiwgJ1YnKSwKICAgICgweDFFNTAsICdNJywgdSfhuZEnKSwKICAgICgweDFFNTEsICdWJyksCiAgICAoMHgxRTUyLCAnTScsIHUn4bmTJyksCiAgICAoMHgxRTUzLCAnVicpLAogICAgKDB4MUU1NCwgJ00nLCB1J+G5lScpLAogICAgKDB4MUU1NSwgJ1YnKSwKICAgICgweDFFNTYsICdNJywgdSfhuZcnKSwKICAgICgweDFFNTcsICdWJyksCiAgICAoMHgxRTU4LCAnTScsIHUn4bmZJyksCiAgICAoMHgxRTU5LCAnVicpLAogICAgKDB4MUU1QSwgJ00nLCB1J+G5mycpLAogICAgKDB4MUU1QiwgJ1YnKSwKICAgICgweDFFNUMsICdNJywgdSfhuZ0nKSwKICAgICgweDFFNUQsICdWJyksCiAgICAoMHgxRTVFLCAnTScsIHUn4bmfJyksCiAgICAoMHgxRTVGLCAnVicpLAogICAgKDB4MUU2MCwgJ00nLCB1J+G5oScpLAogICAgKDB4MUU2MSwgJ1YnKSwKICAgICgweDFFNjIsICdNJywgdSfhuaMnKSwKICAgICgweDFFNjMsICdWJyksCiAgICAoMHgxRTY0LCAnTScsIHUn4bmlJyksCiAgICAoMHgxRTY1LCAnVicpLAogICAgKDB4MUU2NiwgJ00nLCB1J+G5pycpLAogICAgKDB4MUU2NywgJ1YnKSwKICAgICgweDFFNjgsICdNJywgdSfhuaknKSwKICAgICgweDFFNjksICdWJyksCiAgICAoMHgxRTZBLCAnTScsIHUn4bmrJyksCiAgICAoMHgxRTZCLCAnVicpLAogICAgKDB4MUU2QywgJ00nLCB1J+G5rScpLAogICAgKDB4MUU2RCwgJ1YnKSwKICAgICgweDFFNkUsICdNJywgdSfhua8nKSwKICAgICgweDFFNkYsICdWJyksCiAgICAoMHgxRTcwLCAnTScsIHUn4bmxJyksCiAgICAoMHgxRTcxLCAnVicpLAogICAgKDB4MUU3MiwgJ00nLCB1J+G5sycpLAogICAgKDB4MUU3MywgJ1YnKSwKICAgICgweDFFNzQsICdNJywgdSfhubUnKSwKICAgICgweDFFNzUsICdWJyksCiAgICAoMHgxRTc2LCAnTScsIHUn4bm3JyksCiAgICAoMHgxRTc3LCAnVicpLAogICAgKDB4MUU3OCwgJ00nLCB1J+G5uScpLAogICAgKDB4MUU3OSwgJ1YnKSwKICAgICgweDFFN0EsICdNJywgdSfhubsnKSwKICAgICgweDFFN0IsICdWJyksCiAgICAoMHgxRTdDLCAnTScsIHUn4bm9JyksCiAgICAoMHgxRTdELCAnVicpLAogICAgKDB4MUU3RSwgJ00nLCB1J+G5vycpLAogICAgKDB4MUU3RiwgJ1YnKSwKICAgICgweDFFODAsICdNJywgdSfhuoEnKSwKICAgICgweDFFODEsICdWJyksCiAgICAoMHgxRTgyLCAnTScsIHUn4bqDJyksCiAgICAoMHgxRTgzLCAnVicpLAogICAgKDB4MUU4NCwgJ00nLCB1J+G6hScpLAogICAgKDB4MUU4NSwgJ1YnKSwKICAgICgweDFFODYsICdNJywgdSfhuocnKSwKICAgICgweDFFODcsICdWJyksCiAgICAoMHgxRTg4LCAnTScsIHUn4bqJJyksCiAgICAoMHgxRTg5LCAnVicpLAogICAgKDB4MUU4QSwgJ00nLCB1J+G6iycpLAogICAgKDB4MUU4QiwgJ1YnKSwKICAgICgweDFFOEMsICdNJywgdSfhuo0nKSwKICAgICgweDFFOEQsICdWJyksCiAgICAoMHgxRThFLCAnTScsIHUn4bqPJyksCiAgICAoMHgxRThGLCAnVicpLAogICAgKDB4MUU5MCwgJ00nLCB1J+G6kScpLAogICAgKDB4MUU5MSwgJ1YnKSwKICAgICgweDFFOTIsICdNJywgdSfhupMnKSwKICAgICgweDFFOTMsICdWJyksCiAgICAoMHgxRTk0LCAnTScsIHUn4bqVJyksCiAgICAoMHgxRTk1LCAnVicpLAogICAgKDB4MUU5QSwgJ00nLCB1J2HKvicpLAogICAgKDB4MUU5QiwgJ00nLCB1J+G5oScpLAogICAgKDB4MUU5QywgJ1YnKSwKICAgICgweDFFOUUsICdNJywgdSdzcycpLAogICAgKDB4MUU5RiwgJ1YnKSwKICAgICgweDFFQTAsICdNJywgdSfhuqEnKSwKICAgICgweDFFQTEsICdWJyksCiAgICAoMHgxRUEyLCAnTScsIHUn4bqjJyksCiAgICAoMHgxRUEzLCAnVicpLAogICAgKDB4MUVBNCwgJ00nLCB1J+G6pScpLAogICAgKDB4MUVBNSwgJ1YnKSwKICAgICgweDFFQTYsICdNJywgdSfhuqcnKSwKICAgICgweDFFQTcsICdWJyksCiAgICAoMHgxRUE4LCAnTScsIHUn4bqpJyksCiAgICAoMHgxRUE5LCAnVicpLAogICAgKDB4MUVBQSwgJ00nLCB1J+G6qycpLAogICAgKDB4MUVBQiwgJ1YnKSwKICAgICgweDFFQUMsICdNJywgdSfhuq0nKSwKICAgICgweDFFQUQsICdWJyksCiAgICAoMHgxRUFFLCAnTScsIHUn4bqvJyksCiAgICAoMHgxRUFGLCAnVicpLAogICAgKDB4MUVCMCwgJ00nLCB1J+G6sScpLAogICAgKDB4MUVCMSwgJ1YnKSwKICAgICgweDFFQjIsICdNJywgdSfhurMnKSwKICAgICgweDFFQjMsICdWJyksCiAgICBdCgpkZWYgX3NlZ18xOCgpOgogICAgcmV0dXJuIFsKICAgICgweDFFQjQsICdNJywgdSfhurUnKSwKICAgICgweDFFQjUsICdWJyksCiAgICAoMHgxRUI2LCAnTScsIHUn4bq3JyksCiAgICAoMHgxRUI3LCAnVicpLAogICAgKDB4MUVCOCwgJ00nLCB1J+G6uScpLAogICAgKDB4MUVCOSwgJ1YnKSwKICAgICgweDFFQkEsICdNJywgdSfhursnKSwKICAgICgweDFFQkIsICdWJyksCiAgICAoMHgxRUJDLCAnTScsIHUn4bq9JyksCiAgICAoMHgxRUJELCAnVicpLAogICAgKDB4MUVCRSwgJ00nLCB1J+G6vycpLAogICAgKDB4MUVCRiwgJ1YnKSwKICAgICgweDFFQzAsICdNJywgdSfhu4EnKSwKICAgICgweDFFQzEsICdWJyksCiAgICAoMHgxRUMyLCAnTScsIHUn4buDJyksCiAgICAoMHgxRUMzLCAnVicpLAogICAgKDB4MUVDNCwgJ00nLCB1J+G7hScpLAogICAgKDB4MUVDNSwgJ1YnKSwKICAgICgweDFFQzYsICdNJywgdSfhu4cnKSwKICAgICgweDFFQzcsICdWJyksCiAgICAoMHgxRUM4LCAnTScsIHUn4buJJyksCiAgICAoMHgxRUM5LCAnVicpLAogICAgKDB4MUVDQSwgJ00nLCB1J+G7iycpLAogICAgKDB4MUVDQiwgJ1YnKSwKICAgICgweDFFQ0MsICdNJywgdSfhu40nKSwKICAgICgweDFFQ0QsICdWJyksCiAgICAoMHgxRUNFLCAnTScsIHUn4buPJyksCiAgICAoMHgxRUNGLCAnVicpLAogICAgKDB4MUVEMCwgJ00nLCB1J+G7kScpLAogICAgKDB4MUVEMSwgJ1YnKSwKICAgICgweDFFRDIsICdNJywgdSfhu5MnKSwKICAgICgweDFFRDMsICdWJyksCiAgICAoMHgxRUQ0LCAnTScsIHUn4buVJyksCiAgICAoMHgxRUQ1LCAnVicpLAogICAgKDB4MUVENiwgJ00nLCB1J+G7lycpLAogICAgKDB4MUVENywgJ1YnKSwKICAgICgweDFFRDgsICdNJywgdSfhu5knKSwKICAgICgweDFFRDksICdWJyksCiAgICAoMHgxRURBLCAnTScsIHUn4bubJyksCiAgICAoMHgxRURCLCAnVicpLAogICAgKDB4MUVEQywgJ00nLCB1J+G7nScpLAogICAgKDB4MUVERCwgJ1YnKSwKICAgICgweDFFREUsICdNJywgdSfhu58nKSwKICAgICgweDFFREYsICdWJyksCiAgICAoMHgxRUUwLCAnTScsIHUn4buhJyksCiAgICAoMHgxRUUxLCAnVicpLAogICAgKDB4MUVFMiwgJ00nLCB1J+G7oycpLAogICAgKDB4MUVFMywgJ1YnKSwKICAgICgweDFFRTQsICdNJywgdSfhu6UnKSwKICAgICgweDFFRTUsICdWJyksCiAgICAoMHgxRUU2LCAnTScsIHUn4bunJyksCiAgICAoMHgxRUU3LCAnVicpLAogICAgKDB4MUVFOCwgJ00nLCB1J+G7qScpLAogICAgKDB4MUVFOSwgJ1YnKSwKICAgICgweDFFRUEsICdNJywgdSfhu6snKSwKICAgICgweDFFRUIsICdWJyksCiAgICAoMHgxRUVDLCAnTScsIHUn4butJyksCiAgICAoMHgxRUVELCAnVicpLAogICAgKDB4MUVFRSwgJ00nLCB1J+G7rycpLAogICAgKDB4MUVFRiwgJ1YnKSwKICAgICgweDFFRjAsICdNJywgdSfhu7EnKSwKICAgICgweDFFRjEsICdWJyksCiAgICAoMHgxRUYyLCAnTScsIHUn4buzJyksCiAgICAoMHgxRUYzLCAnVicpLAogICAgKDB4MUVGNCwgJ00nLCB1J+G7tScpLAogICAgKDB4MUVGNSwgJ1YnKSwKICAgICgweDFFRjYsICdNJywgdSfhu7cnKSwKICAgICgweDFFRjcsICdWJyksCiAgICAoMHgxRUY4LCAnTScsIHUn4bu5JyksCiAgICAoMHgxRUY5LCAnVicpLAogICAgKDB4MUVGQSwgJ00nLCB1J+G7uycpLAogICAgKDB4MUVGQiwgJ1YnKSwKICAgICgweDFFRkMsICdNJywgdSfhu70nKSwKICAgICgweDFFRkQsICdWJyksCiAgICAoMHgxRUZFLCAnTScsIHUn4bu/JyksCiAgICAoMHgxRUZGLCAnVicpLAogICAgKDB4MUYwOCwgJ00nLCB1J+G8gCcpLAogICAgKDB4MUYwOSwgJ00nLCB1J+G8gScpLAogICAgKDB4MUYwQSwgJ00nLCB1J+G8gicpLAogICAgKDB4MUYwQiwgJ00nLCB1J+G8gycpLAogICAgKDB4MUYwQywgJ00nLCB1J+G8hCcpLAogICAgKDB4MUYwRCwgJ00nLCB1J+G8hScpLAogICAgKDB4MUYwRSwgJ00nLCB1J+G8hicpLAogICAgKDB4MUYwRiwgJ00nLCB1J+G8hycpLAogICAgKDB4MUYxMCwgJ1YnKSwKICAgICgweDFGMTYsICdYJyksCiAgICAoMHgxRjE4LCAnTScsIHUn4byQJyksCiAgICAoMHgxRjE5LCAnTScsIHUn4byRJyksCiAgICAoMHgxRjFBLCAnTScsIHUn4bySJyksCiAgICAoMHgxRjFCLCAnTScsIHUn4byTJyksCiAgICAoMHgxRjFDLCAnTScsIHUn4byUJyksCiAgICAoMHgxRjFELCAnTScsIHUn4byVJyksCiAgICAoMHgxRjFFLCAnWCcpLAogICAgKDB4MUYyMCwgJ1YnKSwKICAgICgweDFGMjgsICdNJywgdSfhvKAnKSwKICAgICgweDFGMjksICdNJywgdSfhvKEnKSwKICAgICgweDFGMkEsICdNJywgdSfhvKInKSwKICAgICgweDFGMkIsICdNJywgdSfhvKMnKSwKICAgICgweDFGMkMsICdNJywgdSfhvKQnKSwKICAgICgweDFGMkQsICdNJywgdSfhvKUnKSwKICAgIF0KCmRlZiBfc2VnXzE5KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUYyRSwgJ00nLCB1J+G8picpLAogICAgKDB4MUYyRiwgJ00nLCB1J+G8pycpLAogICAgKDB4MUYzMCwgJ1YnKSwKICAgICgweDFGMzgsICdNJywgdSfhvLAnKSwKICAgICgweDFGMzksICdNJywgdSfhvLEnKSwKICAgICgweDFGM0EsICdNJywgdSfhvLInKSwKICAgICgweDFGM0IsICdNJywgdSfhvLMnKSwKICAgICgweDFGM0MsICdNJywgdSfhvLQnKSwKICAgICgweDFGM0QsICdNJywgdSfhvLUnKSwKICAgICgweDFGM0UsICdNJywgdSfhvLYnKSwKICAgICgweDFGM0YsICdNJywgdSfhvLcnKSwKICAgICgweDFGNDAsICdWJyksCiAgICAoMHgxRjQ2LCAnWCcpLAogICAgKDB4MUY0OCwgJ00nLCB1J+G9gCcpLAogICAgKDB4MUY0OSwgJ00nLCB1J+G9gScpLAogICAgKDB4MUY0QSwgJ00nLCB1J+G9gicpLAogICAgKDB4MUY0QiwgJ00nLCB1J+G9gycpLAogICAgKDB4MUY0QywgJ00nLCB1J+G9hCcpLAogICAgKDB4MUY0RCwgJ00nLCB1J+G9hScpLAogICAgKDB4MUY0RSwgJ1gnKSwKICAgICgweDFGNTAsICdWJyksCiAgICAoMHgxRjU4LCAnWCcpLAogICAgKDB4MUY1OSwgJ00nLCB1J+G9kScpLAogICAgKDB4MUY1QSwgJ1gnKSwKICAgICgweDFGNUIsICdNJywgdSfhvZMnKSwKICAgICgweDFGNUMsICdYJyksCiAgICAoMHgxRjVELCAnTScsIHUn4b2VJyksCiAgICAoMHgxRjVFLCAnWCcpLAogICAgKDB4MUY1RiwgJ00nLCB1J+G9lycpLAogICAgKDB4MUY2MCwgJ1YnKSwKICAgICgweDFGNjgsICdNJywgdSfhvaAnKSwKICAgICgweDFGNjksICdNJywgdSfhvaEnKSwKICAgICgweDFGNkEsICdNJywgdSfhvaInKSwKICAgICgweDFGNkIsICdNJywgdSfhvaMnKSwKICAgICgweDFGNkMsICdNJywgdSfhvaQnKSwKICAgICgweDFGNkQsICdNJywgdSfhvaUnKSwKICAgICgweDFGNkUsICdNJywgdSfhvaYnKSwKICAgICgweDFGNkYsICdNJywgdSfhvacnKSwKICAgICgweDFGNzAsICdWJyksCiAgICAoMHgxRjcxLCAnTScsIHUnzqwnKSwKICAgICgweDFGNzIsICdWJyksCiAgICAoMHgxRjczLCAnTScsIHUnzq0nKSwKICAgICgweDFGNzQsICdWJyksCiAgICAoMHgxRjc1LCAnTScsIHUnzq4nKSwKICAgICgweDFGNzYsICdWJyksCiAgICAoMHgxRjc3LCAnTScsIHUnzq8nKSwKICAgICgweDFGNzgsICdWJyksCiAgICAoMHgxRjc5LCAnTScsIHUnz4wnKSwKICAgICgweDFGN0EsICdWJyksCiAgICAoMHgxRjdCLCAnTScsIHUnz40nKSwKICAgICgweDFGN0MsICdWJyksCiAgICAoMHgxRjdELCAnTScsIHUnz44nKSwKICAgICgweDFGN0UsICdYJyksCiAgICAoMHgxRjgwLCAnTScsIHUn4byAzrknKSwKICAgICgweDFGODEsICdNJywgdSfhvIHOuScpLAogICAgKDB4MUY4MiwgJ00nLCB1J+G8gs65JyksCiAgICAoMHgxRjgzLCAnTScsIHUn4byDzrknKSwKICAgICgweDFGODQsICdNJywgdSfhvITOuScpLAogICAgKDB4MUY4NSwgJ00nLCB1J+G8hc65JyksCiAgICAoMHgxRjg2LCAnTScsIHUn4byGzrknKSwKICAgICgweDFGODcsICdNJywgdSfhvIfOuScpLAogICAgKDB4MUY4OCwgJ00nLCB1J+G8gM65JyksCiAgICAoMHgxRjg5LCAnTScsIHUn4byBzrknKSwKICAgICgweDFGOEEsICdNJywgdSfhvILOuScpLAogICAgKDB4MUY4QiwgJ00nLCB1J+G8g865JyksCiAgICAoMHgxRjhDLCAnTScsIHUn4byEzrknKSwKICAgICgweDFGOEQsICdNJywgdSfhvIXOuScpLAogICAgKDB4MUY4RSwgJ00nLCB1J+G8hs65JyksCiAgICAoMHgxRjhGLCAnTScsIHUn4byHzrknKSwKICAgICgweDFGOTAsICdNJywgdSfhvKDOuScpLAogICAgKDB4MUY5MSwgJ00nLCB1J+G8oc65JyksCiAgICAoMHgxRjkyLCAnTScsIHUn4byizrknKSwKICAgICgweDFGOTMsICdNJywgdSfhvKPOuScpLAogICAgKDB4MUY5NCwgJ00nLCB1J+G8pM65JyksCiAgICAoMHgxRjk1LCAnTScsIHUn4bylzrknKSwKICAgICgweDFGOTYsICdNJywgdSfhvKbOuScpLAogICAgKDB4MUY5NywgJ00nLCB1J+G8p865JyksCiAgICAoMHgxRjk4LCAnTScsIHUn4bygzrknKSwKICAgICgweDFGOTksICdNJywgdSfhvKHOuScpLAogICAgKDB4MUY5QSwgJ00nLCB1J+G8os65JyksCiAgICAoMHgxRjlCLCAnTScsIHUn4byjzrknKSwKICAgICgweDFGOUMsICdNJywgdSfhvKTOuScpLAogICAgKDB4MUY5RCwgJ00nLCB1J+G8pc65JyksCiAgICAoMHgxRjlFLCAnTScsIHUn4bymzrknKSwKICAgICgweDFGOUYsICdNJywgdSfhvKfOuScpLAogICAgKDB4MUZBMCwgJ00nLCB1J+G9oM65JyksCiAgICAoMHgxRkExLCAnTScsIHUn4b2hzrknKSwKICAgICgweDFGQTIsICdNJywgdSfhvaLOuScpLAogICAgKDB4MUZBMywgJ00nLCB1J+G9o865JyksCiAgICAoMHgxRkE0LCAnTScsIHUn4b2kzrknKSwKICAgICgweDFGQTUsICdNJywgdSfhvaXOuScpLAogICAgKDB4MUZBNiwgJ00nLCB1J+G9ps65JyksCiAgICAoMHgxRkE3LCAnTScsIHUn4b2nzrknKSwKICAgICgweDFGQTgsICdNJywgdSfhvaDOuScpLAogICAgKDB4MUZBOSwgJ00nLCB1J+G9oc65JyksCiAgICAoMHgxRkFBLCAnTScsIHUn4b2izrknKSwKICAgICgweDFGQUIsICdNJywgdSfhvaPOuScpLAogICAgKDB4MUZBQywgJ00nLCB1J+G9pM65JyksCiAgICAoMHgxRkFELCAnTScsIHUn4b2lzrknKSwKICAgICgweDFGQUUsICdNJywgdSfhvabOuScpLAogICAgXQoKZGVmIF9zZWdfMjAoKToKICAgIHJldHVybiBbCiAgICAoMHgxRkFGLCAnTScsIHUn4b2nzrknKSwKICAgICgweDFGQjAsICdWJyksCiAgICAoMHgxRkIyLCAnTScsIHUn4b2wzrknKSwKICAgICgweDFGQjMsICdNJywgdSfOsc65JyksCiAgICAoMHgxRkI0LCAnTScsIHUnzqzOuScpLAogICAgKDB4MUZCNSwgJ1gnKSwKICAgICgweDFGQjYsICdWJyksCiAgICAoMHgxRkI3LCAnTScsIHUn4b62zrknKSwKICAgICgweDFGQjgsICdNJywgdSfhvrAnKSwKICAgICgweDFGQjksICdNJywgdSfhvrEnKSwKICAgICgweDFGQkEsICdNJywgdSfhvbAnKSwKICAgICgweDFGQkIsICdNJywgdSfOrCcpLAogICAgKDB4MUZCQywgJ00nLCB1J86xzrknKSwKICAgICgweDFGQkQsICczJywgdScgzJMnKSwKICAgICgweDFGQkUsICdNJywgdSfOuScpLAogICAgKDB4MUZCRiwgJzMnLCB1JyDMkycpLAogICAgKDB4MUZDMCwgJzMnLCB1JyDNgicpLAogICAgKDB4MUZDMSwgJzMnLCB1JyDMiM2CJyksCiAgICAoMHgxRkMyLCAnTScsIHUn4b20zrknKSwKICAgICgweDFGQzMsICdNJywgdSfOt865JyksCiAgICAoMHgxRkM0LCAnTScsIHUnzq7OuScpLAogICAgKDB4MUZDNSwgJ1gnKSwKICAgICgweDFGQzYsICdWJyksCiAgICAoMHgxRkM3LCAnTScsIHUn4b+GzrknKSwKICAgICgweDFGQzgsICdNJywgdSfhvbInKSwKICAgICgweDFGQzksICdNJywgdSfOrScpLAogICAgKDB4MUZDQSwgJ00nLCB1J+G9tCcpLAogICAgKDB4MUZDQiwgJ00nLCB1J86uJyksCiAgICAoMHgxRkNDLCAnTScsIHUnzrfOuScpLAogICAgKDB4MUZDRCwgJzMnLCB1JyDMk8yAJyksCiAgICAoMHgxRkNFLCAnMycsIHUnIMyTzIEnKSwKICAgICgweDFGQ0YsICczJywgdScgzJPNgicpLAogICAgKDB4MUZEMCwgJ1YnKSwKICAgICgweDFGRDMsICdNJywgdSfOkCcpLAogICAgKDB4MUZENCwgJ1gnKSwKICAgICgweDFGRDYsICdWJyksCiAgICAoMHgxRkQ4LCAnTScsIHUn4b+QJyksCiAgICAoMHgxRkQ5LCAnTScsIHUn4b+RJyksCiAgICAoMHgxRkRBLCAnTScsIHUn4b22JyksCiAgICAoMHgxRkRCLCAnTScsIHUnzq8nKSwKICAgICgweDFGREMsICdYJyksCiAgICAoMHgxRkRELCAnMycsIHUnIMyUzIAnKSwKICAgICgweDFGREUsICczJywgdScgzJTMgScpLAogICAgKDB4MUZERiwgJzMnLCB1JyDMlM2CJyksCiAgICAoMHgxRkUwLCAnVicpLAogICAgKDB4MUZFMywgJ00nLCB1J86wJyksCiAgICAoMHgxRkU0LCAnVicpLAogICAgKDB4MUZFOCwgJ00nLCB1J+G/oCcpLAogICAgKDB4MUZFOSwgJ00nLCB1J+G/oScpLAogICAgKDB4MUZFQSwgJ00nLCB1J+G9uicpLAogICAgKDB4MUZFQiwgJ00nLCB1J8+NJyksCiAgICAoMHgxRkVDLCAnTScsIHUn4b+lJyksCiAgICAoMHgxRkVELCAnMycsIHUnIMyIzIAnKSwKICAgICgweDFGRUUsICczJywgdScgzIjMgScpLAogICAgKDB4MUZFRiwgJzMnLCB1J2AnKSwKICAgICgweDFGRjAsICdYJyksCiAgICAoMHgxRkYyLCAnTScsIHUn4b28zrknKSwKICAgICgweDFGRjMsICdNJywgdSfPic65JyksCiAgICAoMHgxRkY0LCAnTScsIHUnz47OuScpLAogICAgKDB4MUZGNSwgJ1gnKSwKICAgICgweDFGRjYsICdWJyksCiAgICAoMHgxRkY3LCAnTScsIHUn4b+2zrknKSwKICAgICgweDFGRjgsICdNJywgdSfhvbgnKSwKICAgICgweDFGRjksICdNJywgdSfPjCcpLAogICAgKDB4MUZGQSwgJ00nLCB1J+G9vCcpLAogICAgKDB4MUZGQiwgJ00nLCB1J8+OJyksCiAgICAoMHgxRkZDLCAnTScsIHUnz4nOuScpLAogICAgKDB4MUZGRCwgJzMnLCB1JyDMgScpLAogICAgKDB4MUZGRSwgJzMnLCB1JyDMlCcpLAogICAgKDB4MUZGRiwgJ1gnKSwKICAgICgweDIwMDAsICczJywgdScgJyksCiAgICAoMHgyMDBCLCAnSScpLAogICAgKDB4MjAwQywgJ0QnLCB1JycpLAogICAgKDB4MjAwRSwgJ1gnKSwKICAgICgweDIwMTAsICdWJyksCiAgICAoMHgyMDExLCAnTScsIHUn4oCQJyksCiAgICAoMHgyMDEyLCAnVicpLAogICAgKDB4MjAxNywgJzMnLCB1JyDMsycpLAogICAgKDB4MjAxOCwgJ1YnKSwKICAgICgweDIwMjQsICdYJyksCiAgICAoMHgyMDI3LCAnVicpLAogICAgKDB4MjAyOCwgJ1gnKSwKICAgICgweDIwMkYsICczJywgdScgJyksCiAgICAoMHgyMDMwLCAnVicpLAogICAgKDB4MjAzMywgJ00nLCB1J+KAsuKAsicpLAogICAgKDB4MjAzNCwgJ00nLCB1J+KAsuKAsuKAsicpLAogICAgKDB4MjAzNSwgJ1YnKSwKICAgICgweDIwMzYsICdNJywgdSfigLXigLUnKSwKICAgICgweDIwMzcsICdNJywgdSfigLXigLXigLUnKSwKICAgICgweDIwMzgsICdWJyksCiAgICAoMHgyMDNDLCAnMycsIHUnISEnKSwKICAgICgweDIwM0QsICdWJyksCiAgICAoMHgyMDNFLCAnMycsIHUnIMyFJyksCiAgICAoMHgyMDNGLCAnVicpLAogICAgKDB4MjA0NywgJzMnLCB1Jz8/JyksCiAgICAoMHgyMDQ4LCAnMycsIHUnPyEnKSwKICAgICgweDIwNDksICczJywgdSchPycpLAogICAgKDB4MjA0QSwgJ1YnKSwKICAgICgweDIwNTcsICdNJywgdSfigLLigLLigLLigLInKSwKICAgICgweDIwNTgsICdWJyksCiAgICBdCgpkZWYgX3NlZ18yMSgpOgogICAgcmV0dXJuIFsKICAgICgweDIwNUYsICczJywgdScgJyksCiAgICAoMHgyMDYwLCAnSScpLAogICAgKDB4MjA2MSwgJ1gnKSwKICAgICgweDIwNjQsICdJJyksCiAgICAoMHgyMDY1LCAnWCcpLAogICAgKDB4MjA3MCwgJ00nLCB1JzAnKSwKICAgICgweDIwNzEsICdNJywgdSdpJyksCiAgICAoMHgyMDcyLCAnWCcpLAogICAgKDB4MjA3NCwgJ00nLCB1JzQnKSwKICAgICgweDIwNzUsICdNJywgdSc1JyksCiAgICAoMHgyMDc2LCAnTScsIHUnNicpLAogICAgKDB4MjA3NywgJ00nLCB1JzcnKSwKICAgICgweDIwNzgsICdNJywgdSc4JyksCiAgICAoMHgyMDc5LCAnTScsIHUnOScpLAogICAgKDB4MjA3QSwgJzMnLCB1JysnKSwKICAgICgweDIwN0IsICdNJywgdSfiiJInKSwKICAgICgweDIwN0MsICczJywgdSc9JyksCiAgICAoMHgyMDdELCAnMycsIHUnKCcpLAogICAgKDB4MjA3RSwgJzMnLCB1JyknKSwKICAgICgweDIwN0YsICdNJywgdSduJyksCiAgICAoMHgyMDgwLCAnTScsIHUnMCcpLAogICAgKDB4MjA4MSwgJ00nLCB1JzEnKSwKICAgICgweDIwODIsICdNJywgdScyJyksCiAgICAoMHgyMDgzLCAnTScsIHUnMycpLAogICAgKDB4MjA4NCwgJ00nLCB1JzQnKSwKICAgICgweDIwODUsICdNJywgdSc1JyksCiAgICAoMHgyMDg2LCAnTScsIHUnNicpLAogICAgKDB4MjA4NywgJ00nLCB1JzcnKSwKICAgICgweDIwODgsICdNJywgdSc4JyksCiAgICAoMHgyMDg5LCAnTScsIHUnOScpLAogICAgKDB4MjA4QSwgJzMnLCB1JysnKSwKICAgICgweDIwOEIsICdNJywgdSfiiJInKSwKICAgICgweDIwOEMsICczJywgdSc9JyksCiAgICAoMHgyMDhELCAnMycsIHUnKCcpLAogICAgKDB4MjA4RSwgJzMnLCB1JyknKSwKICAgICgweDIwOEYsICdYJyksCiAgICAoMHgyMDkwLCAnTScsIHUnYScpLAogICAgKDB4MjA5MSwgJ00nLCB1J2UnKSwKICAgICgweDIwOTIsICdNJywgdSdvJyksCiAgICAoMHgyMDkzLCAnTScsIHUneCcpLAogICAgKDB4MjA5NCwgJ00nLCB1J8mZJyksCiAgICAoMHgyMDk1LCAnTScsIHUnaCcpLAogICAgKDB4MjA5NiwgJ00nLCB1J2snKSwKICAgICgweDIwOTcsICdNJywgdSdsJyksCiAgICAoMHgyMDk4LCAnTScsIHUnbScpLAogICAgKDB4MjA5OSwgJ00nLCB1J24nKSwKICAgICgweDIwOUEsICdNJywgdSdwJyksCiAgICAoMHgyMDlCLCAnTScsIHUncycpLAogICAgKDB4MjA5QywgJ00nLCB1J3QnKSwKICAgICgweDIwOUQsICdYJyksCiAgICAoMHgyMEEwLCAnVicpLAogICAgKDB4MjBBOCwgJ00nLCB1J3JzJyksCiAgICAoMHgyMEE5LCAnVicpLAogICAgKDB4MjBCQiwgJ1gnKSwKICAgICgweDIwRDAsICdWJyksCiAgICAoMHgyMEYxLCAnWCcpLAogICAgKDB4MjEwMCwgJzMnLCB1J2EvYycpLAogICAgKDB4MjEwMSwgJzMnLCB1J2EvcycpLAogICAgKDB4MjEwMiwgJ00nLCB1J2MnKSwKICAgICgweDIxMDMsICdNJywgdSfCsGMnKSwKICAgICgweDIxMDQsICdWJyksCiAgICAoMHgyMTA1LCAnMycsIHUnYy9vJyksCiAgICAoMHgyMTA2LCAnMycsIHUnYy91JyksCiAgICAoMHgyMTA3LCAnTScsIHUnyZsnKSwKICAgICgweDIxMDgsICdWJyksCiAgICAoMHgyMTA5LCAnTScsIHUnwrBmJyksCiAgICAoMHgyMTBBLCAnTScsIHUnZycpLAogICAgKDB4MjEwQiwgJ00nLCB1J2gnKSwKICAgICgweDIxMEYsICdNJywgdSfEpycpLAogICAgKDB4MjExMCwgJ00nLCB1J2knKSwKICAgICgweDIxMTIsICdNJywgdSdsJyksCiAgICAoMHgyMTE0LCAnVicpLAogICAgKDB4MjExNSwgJ00nLCB1J24nKSwKICAgICgweDIxMTYsICdNJywgdSdubycpLAogICAgKDB4MjExNywgJ1YnKSwKICAgICgweDIxMTksICdNJywgdSdwJyksCiAgICAoMHgyMTFBLCAnTScsIHUncScpLAogICAgKDB4MjExQiwgJ00nLCB1J3InKSwKICAgICgweDIxMUUsICdWJyksCiAgICAoMHgyMTIwLCAnTScsIHUnc20nKSwKICAgICgweDIxMjEsICdNJywgdSd0ZWwnKSwKICAgICgweDIxMjIsICdNJywgdSd0bScpLAogICAgKDB4MjEyMywgJ1YnKSwKICAgICgweDIxMjQsICdNJywgdSd6JyksCiAgICAoMHgyMTI1LCAnVicpLAogICAgKDB4MjEyNiwgJ00nLCB1J8+JJyksCiAgICAoMHgyMTI3LCAnVicpLAogICAgKDB4MjEyOCwgJ00nLCB1J3onKSwKICAgICgweDIxMjksICdWJyksCiAgICAoMHgyMTJBLCAnTScsIHUnaycpLAogICAgKDB4MjEyQiwgJ00nLCB1J8OlJyksCiAgICAoMHgyMTJDLCAnTScsIHUnYicpLAogICAgKDB4MjEyRCwgJ00nLCB1J2MnKSwKICAgICgweDIxMkUsICdWJyksCiAgICAoMHgyMTJGLCAnTScsIHUnZScpLAogICAgKDB4MjEzMSwgJ00nLCB1J2YnKSwKICAgICgweDIxMzIsICdYJyksCiAgICAoMHgyMTMzLCAnTScsIHUnbScpLAogICAgKDB4MjEzNCwgJ00nLCB1J28nKSwKICAgICgweDIxMzUsICdNJywgdSfXkCcpLAogICAgXQoKZGVmIF9zZWdfMjIoKToKICAgIHJldHVybiBbCiAgICAoMHgyMTM2LCAnTScsIHUn15EnKSwKICAgICgweDIxMzcsICdNJywgdSfXkicpLAogICAgKDB4MjEzOCwgJ00nLCB1J9eTJyksCiAgICAoMHgyMTM5LCAnTScsIHUnaScpLAogICAgKDB4MjEzQSwgJ1YnKSwKICAgICgweDIxM0IsICdNJywgdSdmYXgnKSwKICAgICgweDIxM0MsICdNJywgdSfPgCcpLAogICAgKDB4MjEzRCwgJ00nLCB1J86zJyksCiAgICAoMHgyMTNGLCAnTScsIHUnz4AnKSwKICAgICgweDIxNDAsICdNJywgdSfiiJEnKSwKICAgICgweDIxNDEsICdWJyksCiAgICAoMHgyMTQ1LCAnTScsIHUnZCcpLAogICAgKDB4MjE0NywgJ00nLCB1J2UnKSwKICAgICgweDIxNDgsICdNJywgdSdpJyksCiAgICAoMHgyMTQ5LCAnTScsIHUnaicpLAogICAgKDB4MjE0QSwgJ1YnKSwKICAgICgweDIxNTAsICdNJywgdScx4oGENycpLAogICAgKDB4MjE1MSwgJ00nLCB1JzHigYQ5JyksCiAgICAoMHgyMTUyLCAnTScsIHUnMeKBhDEwJyksCiAgICAoMHgyMTUzLCAnTScsIHUnMeKBhDMnKSwKICAgICgweDIxNTQsICdNJywgdScy4oGEMycpLAogICAgKDB4MjE1NSwgJ00nLCB1JzHigYQ1JyksCiAgICAoMHgyMTU2LCAnTScsIHUnMuKBhDUnKSwKICAgICgweDIxNTcsICdNJywgdScz4oGENScpLAogICAgKDB4MjE1OCwgJ00nLCB1JzTigYQ1JyksCiAgICAoMHgyMTU5LCAnTScsIHUnMeKBhDYnKSwKICAgICgweDIxNUEsICdNJywgdSc14oGENicpLAogICAgKDB4MjE1QiwgJ00nLCB1JzHigYQ4JyksCiAgICAoMHgyMTVDLCAnTScsIHUnM+KBhDgnKSwKICAgICgweDIxNUQsICdNJywgdSc14oGEOCcpLAogICAgKDB4MjE1RSwgJ00nLCB1JzfigYQ4JyksCiAgICAoMHgyMTVGLCAnTScsIHUnMeKBhCcpLAogICAgKDB4MjE2MCwgJ00nLCB1J2knKSwKICAgICgweDIxNjEsICdNJywgdSdpaScpLAogICAgKDB4MjE2MiwgJ00nLCB1J2lpaScpLAogICAgKDB4MjE2MywgJ00nLCB1J2l2JyksCiAgICAoMHgyMTY0LCAnTScsIHUndicpLAogICAgKDB4MjE2NSwgJ00nLCB1J3ZpJyksCiAgICAoMHgyMTY2LCAnTScsIHUndmlpJyksCiAgICAoMHgyMTY3LCAnTScsIHUndmlpaScpLAogICAgKDB4MjE2OCwgJ00nLCB1J2l4JyksCiAgICAoMHgyMTY5LCAnTScsIHUneCcpLAogICAgKDB4MjE2QSwgJ00nLCB1J3hpJyksCiAgICAoMHgyMTZCLCAnTScsIHUneGlpJyksCiAgICAoMHgyMTZDLCAnTScsIHUnbCcpLAogICAgKDB4MjE2RCwgJ00nLCB1J2MnKSwKICAgICgweDIxNkUsICdNJywgdSdkJyksCiAgICAoMHgyMTZGLCAnTScsIHUnbScpLAogICAgKDB4MjE3MCwgJ00nLCB1J2knKSwKICAgICgweDIxNzEsICdNJywgdSdpaScpLAogICAgKDB4MjE3MiwgJ00nLCB1J2lpaScpLAogICAgKDB4MjE3MywgJ00nLCB1J2l2JyksCiAgICAoMHgyMTc0LCAnTScsIHUndicpLAogICAgKDB4MjE3NSwgJ00nLCB1J3ZpJyksCiAgICAoMHgyMTc2LCAnTScsIHUndmlpJyksCiAgICAoMHgyMTc3LCAnTScsIHUndmlpaScpLAogICAgKDB4MjE3OCwgJ00nLCB1J2l4JyksCiAgICAoMHgyMTc5LCAnTScsIHUneCcpLAogICAgKDB4MjE3QSwgJ00nLCB1J3hpJyksCiAgICAoMHgyMTdCLCAnTScsIHUneGlpJyksCiAgICAoMHgyMTdDLCAnTScsIHUnbCcpLAogICAgKDB4MjE3RCwgJ00nLCB1J2MnKSwKICAgICgweDIxN0UsICdNJywgdSdkJyksCiAgICAoMHgyMTdGLCAnTScsIHUnbScpLAogICAgKDB4MjE4MCwgJ1YnKSwKICAgICgweDIxODMsICdYJyksCiAgICAoMHgyMTg0LCAnVicpLAogICAgKDB4MjE4OSwgJ00nLCB1JzDigYQzJyksCiAgICAoMHgyMThBLCAnWCcpLAogICAgKDB4MjE5MCwgJ1YnKSwKICAgICgweDIyMkMsICdNJywgdSfiiKviiKsnKSwKICAgICgweDIyMkQsICdNJywgdSfiiKviiKviiKsnKSwKICAgICgweDIyMkUsICdWJyksCiAgICAoMHgyMjJGLCAnTScsIHUn4oiu4oiuJyksCiAgICAoMHgyMjMwLCAnTScsIHUn4oiu4oiu4oiuJyksCiAgICAoMHgyMjMxLCAnVicpLAogICAgKDB4MjI2MCwgJzMnKSwKICAgICgweDIyNjEsICdWJyksCiAgICAoMHgyMjZFLCAnMycpLAogICAgKDB4MjI3MCwgJ1YnKSwKICAgICgweDIzMjksICdNJywgdSfjgIgnKSwKICAgICgweDIzMkEsICdNJywgdSfjgIknKSwKICAgICgweDIzMkIsICdWJyksCiAgICAoMHgyM0Y0LCAnWCcpLAogICAgKDB4MjQwMCwgJ1YnKSwKICAgICgweDI0MjcsICdYJyksCiAgICAoMHgyNDQwLCAnVicpLAogICAgKDB4MjQ0QiwgJ1gnKSwKICAgICgweDI0NjAsICdNJywgdScxJyksCiAgICAoMHgyNDYxLCAnTScsIHUnMicpLAogICAgKDB4MjQ2MiwgJ00nLCB1JzMnKSwKICAgICgweDI0NjMsICdNJywgdSc0JyksCiAgICAoMHgyNDY0LCAnTScsIHUnNScpLAogICAgKDB4MjQ2NSwgJ00nLCB1JzYnKSwKICAgICgweDI0NjYsICdNJywgdSc3JyksCiAgICAoMHgyNDY3LCAnTScsIHUnOCcpLAogICAgKDB4MjQ2OCwgJ00nLCB1JzknKSwKICAgICgweDI0NjksICdNJywgdScxMCcpLAogICAgKDB4MjQ2QSwgJ00nLCB1JzExJyksCiAgICAoMHgyNDZCLCAnTScsIHUnMTInKSwKICAgIF0KCmRlZiBfc2VnXzIzKCk6CiAgICByZXR1cm4gWwogICAgKDB4MjQ2QywgJ00nLCB1JzEzJyksCiAgICAoMHgyNDZELCAnTScsIHUnMTQnKSwKICAgICgweDI0NkUsICdNJywgdScxNScpLAogICAgKDB4MjQ2RiwgJ00nLCB1JzE2JyksCiAgICAoMHgyNDcwLCAnTScsIHUnMTcnKSwKICAgICgweDI0NzEsICdNJywgdScxOCcpLAogICAgKDB4MjQ3MiwgJ00nLCB1JzE5JyksCiAgICAoMHgyNDczLCAnTScsIHUnMjAnKSwKICAgICgweDI0NzQsICczJywgdScoMSknKSwKICAgICgweDI0NzUsICczJywgdScoMiknKSwKICAgICgweDI0NzYsICczJywgdScoMyknKSwKICAgICgweDI0NzcsICczJywgdScoNCknKSwKICAgICgweDI0NzgsICczJywgdScoNSknKSwKICAgICgweDI0NzksICczJywgdScoNiknKSwKICAgICgweDI0N0EsICczJywgdScoNyknKSwKICAgICgweDI0N0IsICczJywgdScoOCknKSwKICAgICgweDI0N0MsICczJywgdScoOSknKSwKICAgICgweDI0N0QsICczJywgdScoMTApJyksCiAgICAoMHgyNDdFLCAnMycsIHUnKDExKScpLAogICAgKDB4MjQ3RiwgJzMnLCB1JygxMiknKSwKICAgICgweDI0ODAsICczJywgdScoMTMpJyksCiAgICAoMHgyNDgxLCAnMycsIHUnKDE0KScpLAogICAgKDB4MjQ4MiwgJzMnLCB1JygxNSknKSwKICAgICgweDI0ODMsICczJywgdScoMTYpJyksCiAgICAoMHgyNDg0LCAnMycsIHUnKDE3KScpLAogICAgKDB4MjQ4NSwgJzMnLCB1JygxOCknKSwKICAgICgweDI0ODYsICczJywgdScoMTkpJyksCiAgICAoMHgyNDg3LCAnMycsIHUnKDIwKScpLAogICAgKDB4MjQ4OCwgJ1gnKSwKICAgICgweDI0OUMsICczJywgdScoYSknKSwKICAgICgweDI0OUQsICczJywgdScoYiknKSwKICAgICgweDI0OUUsICczJywgdScoYyknKSwKICAgICgweDI0OUYsICczJywgdScoZCknKSwKICAgICgweDI0QTAsICczJywgdScoZSknKSwKICAgICgweDI0QTEsICczJywgdScoZiknKSwKICAgICgweDI0QTIsICczJywgdScoZyknKSwKICAgICgweDI0QTMsICczJywgdScoaCknKSwKICAgICgweDI0QTQsICczJywgdScoaSknKSwKICAgICgweDI0QTUsICczJywgdScoaiknKSwKICAgICgweDI0QTYsICczJywgdScoayknKSwKICAgICgweDI0QTcsICczJywgdScobCknKSwKICAgICgweDI0QTgsICczJywgdScobSknKSwKICAgICgweDI0QTksICczJywgdScobiknKSwKICAgICgweDI0QUEsICczJywgdScobyknKSwKICAgICgweDI0QUIsICczJywgdScocCknKSwKICAgICgweDI0QUMsICczJywgdScocSknKSwKICAgICgweDI0QUQsICczJywgdScociknKSwKICAgICgweDI0QUUsICczJywgdScocyknKSwKICAgICgweDI0QUYsICczJywgdScodCknKSwKICAgICgweDI0QjAsICczJywgdScodSknKSwKICAgICgweDI0QjEsICczJywgdScodiknKSwKICAgICgweDI0QjIsICczJywgdScodyknKSwKICAgICgweDI0QjMsICczJywgdScoeCknKSwKICAgICgweDI0QjQsICczJywgdScoeSknKSwKICAgICgweDI0QjUsICczJywgdScoeiknKSwKICAgICgweDI0QjYsICdNJywgdSdhJyksCiAgICAoMHgyNEI3LCAnTScsIHUnYicpLAogICAgKDB4MjRCOCwgJ00nLCB1J2MnKSwKICAgICgweDI0QjksICdNJywgdSdkJyksCiAgICAoMHgyNEJBLCAnTScsIHUnZScpLAogICAgKDB4MjRCQiwgJ00nLCB1J2YnKSwKICAgICgweDI0QkMsICdNJywgdSdnJyksCiAgICAoMHgyNEJELCAnTScsIHUnaCcpLAogICAgKDB4MjRCRSwgJ00nLCB1J2knKSwKICAgICgweDI0QkYsICdNJywgdSdqJyksCiAgICAoMHgyNEMwLCAnTScsIHUnaycpLAogICAgKDB4MjRDMSwgJ00nLCB1J2wnKSwKICAgICgweDI0QzIsICdNJywgdSdtJyksCiAgICAoMHgyNEMzLCAnTScsIHUnbicpLAogICAgKDB4MjRDNCwgJ00nLCB1J28nKSwKICAgICgweDI0QzUsICdNJywgdSdwJyksCiAgICAoMHgyNEM2LCAnTScsIHUncScpLAogICAgKDB4MjRDNywgJ00nLCB1J3InKSwKICAgICgweDI0QzgsICdNJywgdSdzJyksCiAgICAoMHgyNEM5LCAnTScsIHUndCcpLAogICAgKDB4MjRDQSwgJ00nLCB1J3UnKSwKICAgICgweDI0Q0IsICdNJywgdSd2JyksCiAgICAoMHgyNENDLCAnTScsIHUndycpLAogICAgKDB4MjRDRCwgJ00nLCB1J3gnKSwKICAgICgweDI0Q0UsICdNJywgdSd5JyksCiAgICAoMHgyNENGLCAnTScsIHUneicpLAogICAgKDB4MjREMCwgJ00nLCB1J2EnKSwKICAgICgweDI0RDEsICdNJywgdSdiJyksCiAgICAoMHgyNEQyLCAnTScsIHUnYycpLAogICAgKDB4MjREMywgJ00nLCB1J2QnKSwKICAgICgweDI0RDQsICdNJywgdSdlJyksCiAgICAoMHgyNEQ1LCAnTScsIHUnZicpLAogICAgKDB4MjRENiwgJ00nLCB1J2cnKSwKICAgICgweDI0RDcsICdNJywgdSdoJyksCiAgICAoMHgyNEQ4LCAnTScsIHUnaScpLAogICAgKDB4MjREOSwgJ00nLCB1J2onKSwKICAgICgweDI0REEsICdNJywgdSdrJyksCiAgICAoMHgyNERCLCAnTScsIHUnbCcpLAogICAgKDB4MjREQywgJ00nLCB1J20nKSwKICAgICgweDI0REQsICdNJywgdSduJyksCiAgICAoMHgyNERFLCAnTScsIHUnbycpLAogICAgKDB4MjRERiwgJ00nLCB1J3AnKSwKICAgICgweDI0RTAsICdNJywgdSdxJyksCiAgICAoMHgyNEUxLCAnTScsIHUncicpLAogICAgKDB4MjRFMiwgJ00nLCB1J3MnKSwKICAgIF0KCmRlZiBfc2VnXzI0KCk6CiAgICByZXR1cm4gWwogICAgKDB4MjRFMywgJ00nLCB1J3QnKSwKICAgICgweDI0RTQsICdNJywgdSd1JyksCiAgICAoMHgyNEU1LCAnTScsIHUndicpLAogICAgKDB4MjRFNiwgJ00nLCB1J3cnKSwKICAgICgweDI0RTcsICdNJywgdSd4JyksCiAgICAoMHgyNEU4LCAnTScsIHUneScpLAogICAgKDB4MjRFOSwgJ00nLCB1J3onKSwKICAgICgweDI0RUEsICdNJywgdScwJyksCiAgICAoMHgyNEVCLCAnVicpLAogICAgKDB4MjcwMCwgJ1gnKSwKICAgICgweDI3MDEsICdWJyksCiAgICAoMHgyQTBDLCAnTScsIHUn4oir4oir4oir4oirJyksCiAgICAoMHgyQTBELCAnVicpLAogICAgKDB4MkE3NCwgJzMnLCB1Jzo6PScpLAogICAgKDB4MkE3NSwgJzMnLCB1Jz09JyksCiAgICAoMHgyQTc2LCAnMycsIHUnPT09JyksCiAgICAoMHgyQTc3LCAnVicpLAogICAgKDB4MkFEQywgJ00nLCB1J+Krncy4JyksCiAgICAoMHgyQURELCAnVicpLAogICAgKDB4MkI0RCwgJ1gnKSwKICAgICgweDJCNTAsICdWJyksCiAgICAoMHgyQjVBLCAnWCcpLAogICAgKDB4MkMwMCwgJ00nLCB1J+KwsCcpLAogICAgKDB4MkMwMSwgJ00nLCB1J+KwsScpLAogICAgKDB4MkMwMiwgJ00nLCB1J+KwsicpLAogICAgKDB4MkMwMywgJ00nLCB1J+KwsycpLAogICAgKDB4MkMwNCwgJ00nLCB1J+KwtCcpLAogICAgKDB4MkMwNSwgJ00nLCB1J+KwtScpLAogICAgKDB4MkMwNiwgJ00nLCB1J+KwticpLAogICAgKDB4MkMwNywgJ00nLCB1J+KwtycpLAogICAgKDB4MkMwOCwgJ00nLCB1J+KwuCcpLAogICAgKDB4MkMwOSwgJ00nLCB1J+KwuScpLAogICAgKDB4MkMwQSwgJ00nLCB1J+KwuicpLAogICAgKDB4MkMwQiwgJ00nLCB1J+KwuycpLAogICAgKDB4MkMwQywgJ00nLCB1J+KwvCcpLAogICAgKDB4MkMwRCwgJ00nLCB1J+KwvScpLAogICAgKDB4MkMwRSwgJ00nLCB1J+KwvicpLAogICAgKDB4MkMwRiwgJ00nLCB1J+KwvycpLAogICAgKDB4MkMxMCwgJ00nLCB1J+KxgCcpLAogICAgKDB4MkMxMSwgJ00nLCB1J+KxgScpLAogICAgKDB4MkMxMiwgJ00nLCB1J+KxgicpLAogICAgKDB4MkMxMywgJ00nLCB1J+KxgycpLAogICAgKDB4MkMxNCwgJ00nLCB1J+KxhCcpLAogICAgKDB4MkMxNSwgJ00nLCB1J+KxhScpLAogICAgKDB4MkMxNiwgJ00nLCB1J+KxhicpLAogICAgKDB4MkMxNywgJ00nLCB1J+KxhycpLAogICAgKDB4MkMxOCwgJ00nLCB1J+KxiCcpLAogICAgKDB4MkMxOSwgJ00nLCB1J+KxiScpLAogICAgKDB4MkMxQSwgJ00nLCB1J+KxiicpLAogICAgKDB4MkMxQiwgJ00nLCB1J+KxiycpLAogICAgKDB4MkMxQywgJ00nLCB1J+KxjCcpLAogICAgKDB4MkMxRCwgJ00nLCB1J+KxjScpLAogICAgKDB4MkMxRSwgJ00nLCB1J+KxjicpLAogICAgKDB4MkMxRiwgJ00nLCB1J+KxjycpLAogICAgKDB4MkMyMCwgJ00nLCB1J+KxkCcpLAogICAgKDB4MkMyMSwgJ00nLCB1J+KxkScpLAogICAgKDB4MkMyMiwgJ00nLCB1J+KxkicpLAogICAgKDB4MkMyMywgJ00nLCB1J+KxkycpLAogICAgKDB4MkMyNCwgJ00nLCB1J+KxlCcpLAogICAgKDB4MkMyNSwgJ00nLCB1J+KxlScpLAogICAgKDB4MkMyNiwgJ00nLCB1J+KxlicpLAogICAgKDB4MkMyNywgJ00nLCB1J+KxlycpLAogICAgKDB4MkMyOCwgJ00nLCB1J+KxmCcpLAogICAgKDB4MkMyOSwgJ00nLCB1J+KxmScpLAogICAgKDB4MkMyQSwgJ00nLCB1J+KxmicpLAogICAgKDB4MkMyQiwgJ00nLCB1J+KxmycpLAogICAgKDB4MkMyQywgJ00nLCB1J+KxnCcpLAogICAgKDB4MkMyRCwgJ00nLCB1J+KxnScpLAogICAgKDB4MkMyRSwgJ00nLCB1J+KxnicpLAogICAgKDB4MkMyRiwgJ1gnKSwKICAgICgweDJDMzAsICdWJyksCiAgICAoMHgyQzVGLCAnWCcpLAogICAgKDB4MkM2MCwgJ00nLCB1J+KxoScpLAogICAgKDB4MkM2MSwgJ1YnKSwKICAgICgweDJDNjIsICdNJywgdSfJqycpLAogICAgKDB4MkM2MywgJ00nLCB1J+G1vScpLAogICAgKDB4MkM2NCwgJ00nLCB1J8m9JyksCiAgICAoMHgyQzY1LCAnVicpLAogICAgKDB4MkM2NywgJ00nLCB1J+KxqCcpLAogICAgKDB4MkM2OCwgJ1YnKSwKICAgICgweDJDNjksICdNJywgdSfisaonKSwKICAgICgweDJDNkEsICdWJyksCiAgICAoMHgyQzZCLCAnTScsIHUn4rGsJyksCiAgICAoMHgyQzZDLCAnVicpLAogICAgKDB4MkM2RCwgJ00nLCB1J8mRJyksCiAgICAoMHgyQzZFLCAnTScsIHUnybEnKSwKICAgICgweDJDNkYsICdNJywgdSfJkCcpLAogICAgKDB4MkM3MCwgJ00nLCB1J8mSJyksCiAgICAoMHgyQzcxLCAnVicpLAogICAgKDB4MkM3MiwgJ00nLCB1J+KxsycpLAogICAgKDB4MkM3MywgJ1YnKSwKICAgICgweDJDNzUsICdNJywgdSfisbYnKSwKICAgICgweDJDNzYsICdWJyksCiAgICAoMHgyQzdDLCAnTScsIHUnaicpLAogICAgKDB4MkM3RCwgJ00nLCB1J3YnKSwKICAgICgweDJDN0UsICdNJywgdSfIvycpLAogICAgKDB4MkM3RiwgJ00nLCB1J8mAJyksCiAgICAoMHgyQzgwLCAnTScsIHUn4rKBJyksCiAgICAoMHgyQzgxLCAnVicpLAogICAgKDB4MkM4MiwgJ00nLCB1J+KygycpLAogICAgXQoKZGVmIF9zZWdfMjUoKToKICAgIHJldHVybiBbCiAgICAoMHgyQzgzLCAnVicpLAogICAgKDB4MkM4NCwgJ00nLCB1J+KyhScpLAogICAgKDB4MkM4NSwgJ1YnKSwKICAgICgweDJDODYsICdNJywgdSfisocnKSwKICAgICgweDJDODcsICdWJyksCiAgICAoMHgyQzg4LCAnTScsIHUn4rKJJyksCiAgICAoMHgyQzg5LCAnVicpLAogICAgKDB4MkM4QSwgJ00nLCB1J+KyiycpLAogICAgKDB4MkM4QiwgJ1YnKSwKICAgICgweDJDOEMsICdNJywgdSfiso0nKSwKICAgICgweDJDOEQsICdWJyksCiAgICAoMHgyQzhFLCAnTScsIHUn4rKPJyksCiAgICAoMHgyQzhGLCAnVicpLAogICAgKDB4MkM5MCwgJ00nLCB1J+KykScpLAogICAgKDB4MkM5MSwgJ1YnKSwKICAgICgweDJDOTIsICdNJywgdSfispMnKSwKICAgICgweDJDOTMsICdWJyksCiAgICAoMHgyQzk0LCAnTScsIHUn4rKVJyksCiAgICAoMHgyQzk1LCAnVicpLAogICAgKDB4MkM5NiwgJ00nLCB1J+KylycpLAogICAgKDB4MkM5NywgJ1YnKSwKICAgICgweDJDOTgsICdNJywgdSfispknKSwKICAgICgweDJDOTksICdWJyksCiAgICAoMHgyQzlBLCAnTScsIHUn4rKbJyksCiAgICAoMHgyQzlCLCAnVicpLAogICAgKDB4MkM5QywgJ00nLCB1J+KynScpLAogICAgKDB4MkM5RCwgJ1YnKSwKICAgICgweDJDOUUsICdNJywgdSfisp8nKSwKICAgICgweDJDOUYsICdWJyksCiAgICAoMHgyQ0EwLCAnTScsIHUn4rKhJyksCiAgICAoMHgyQ0ExLCAnVicpLAogICAgKDB4MkNBMiwgJ00nLCB1J+KyoycpLAogICAgKDB4MkNBMywgJ1YnKSwKICAgICgweDJDQTQsICdNJywgdSfisqUnKSwKICAgICgweDJDQTUsICdWJyksCiAgICAoMHgyQ0E2LCAnTScsIHUn4rKnJyksCiAgICAoMHgyQ0E3LCAnVicpLAogICAgKDB4MkNBOCwgJ00nLCB1J+KyqScpLAogICAgKDB4MkNBOSwgJ1YnKSwKICAgICgweDJDQUEsICdNJywgdSfisqsnKSwKICAgICgweDJDQUIsICdWJyksCiAgICAoMHgyQ0FDLCAnTScsIHUn4rKtJyksCiAgICAoMHgyQ0FELCAnVicpLAogICAgKDB4MkNBRSwgJ00nLCB1J+KyrycpLAogICAgKDB4MkNBRiwgJ1YnKSwKICAgICgweDJDQjAsICdNJywgdSfisrEnKSwKICAgICgweDJDQjEsICdWJyksCiAgICAoMHgyQ0IyLCAnTScsIHUn4rKzJyksCiAgICAoMHgyQ0IzLCAnVicpLAogICAgKDB4MkNCNCwgJ00nLCB1J+KytScpLAogICAgKDB4MkNCNSwgJ1YnKSwKICAgICgweDJDQjYsICdNJywgdSfisrcnKSwKICAgICgweDJDQjcsICdWJyksCiAgICAoMHgyQ0I4LCAnTScsIHUn4rK5JyksCiAgICAoMHgyQ0I5LCAnVicpLAogICAgKDB4MkNCQSwgJ00nLCB1J+KyuycpLAogICAgKDB4MkNCQiwgJ1YnKSwKICAgICgweDJDQkMsICdNJywgdSfisr0nKSwKICAgICgweDJDQkQsICdWJyksCiAgICAoMHgyQ0JFLCAnTScsIHUn4rK/JyksCiAgICAoMHgyQ0JGLCAnVicpLAogICAgKDB4MkNDMCwgJ00nLCB1J+KzgScpLAogICAgKDB4MkNDMSwgJ1YnKSwKICAgICgweDJDQzIsICdNJywgdSfis4MnKSwKICAgICgweDJDQzMsICdWJyksCiAgICAoMHgyQ0M0LCAnTScsIHUn4rOFJyksCiAgICAoMHgyQ0M1LCAnVicpLAogICAgKDB4MkNDNiwgJ00nLCB1J+KzhycpLAogICAgKDB4MkNDNywgJ1YnKSwKICAgICgweDJDQzgsICdNJywgdSfis4knKSwKICAgICgweDJDQzksICdWJyksCiAgICAoMHgyQ0NBLCAnTScsIHUn4rOLJyksCiAgICAoMHgyQ0NCLCAnVicpLAogICAgKDB4MkNDQywgJ00nLCB1J+KzjScpLAogICAgKDB4MkNDRCwgJ1YnKSwKICAgICgweDJDQ0UsICdNJywgdSfis48nKSwKICAgICgweDJDQ0YsICdWJyksCiAgICAoMHgyQ0QwLCAnTScsIHUn4rORJyksCiAgICAoMHgyQ0QxLCAnVicpLAogICAgKDB4MkNEMiwgJ00nLCB1J+KzkycpLAogICAgKDB4MkNEMywgJ1YnKSwKICAgICgweDJDRDQsICdNJywgdSfis5UnKSwKICAgICgweDJDRDUsICdWJyksCiAgICAoMHgyQ0Q2LCAnTScsIHUn4rOXJyksCiAgICAoMHgyQ0Q3LCAnVicpLAogICAgKDB4MkNEOCwgJ00nLCB1J+KzmScpLAogICAgKDB4MkNEOSwgJ1YnKSwKICAgICgweDJDREEsICdNJywgdSfis5snKSwKICAgICgweDJDREIsICdWJyksCiAgICAoMHgyQ0RDLCAnTScsIHUn4rOdJyksCiAgICAoMHgyQ0RELCAnVicpLAogICAgKDB4MkNERSwgJ00nLCB1J+KznycpLAogICAgKDB4MkNERiwgJ1YnKSwKICAgICgweDJDRTAsICdNJywgdSfis6EnKSwKICAgICgweDJDRTEsICdWJyksCiAgICAoMHgyQ0UyLCAnTScsIHUn4rOjJyksCiAgICAoMHgyQ0UzLCAnVicpLAogICAgKDB4MkNFQiwgJ00nLCB1J+KzrCcpLAogICAgKDB4MkNFQywgJ1YnKSwKICAgICgweDJDRUQsICdNJywgdSfis64nKSwKICAgIF0KCmRlZiBfc2VnXzI2KCk6CiAgICByZXR1cm4gWwogICAgKDB4MkNFRSwgJ1YnKSwKICAgICgweDJDRjIsICdNJywgdSfis7MnKSwKICAgICgweDJDRjMsICdWJyksCiAgICAoMHgyQ0Y0LCAnWCcpLAogICAgKDB4MkNGOSwgJ1YnKSwKICAgICgweDJEMjYsICdYJyksCiAgICAoMHgyRDI3LCAnVicpLAogICAgKDB4MkQyOCwgJ1gnKSwKICAgICgweDJEMkQsICdWJyksCiAgICAoMHgyRDJFLCAnWCcpLAogICAgKDB4MkQzMCwgJ1YnKSwKICAgICgweDJENjgsICdYJyksCiAgICAoMHgyRDZGLCAnTScsIHUn4rWhJyksCiAgICAoMHgyRDcwLCAnVicpLAogICAgKDB4MkQ3MSwgJ1gnKSwKICAgICgweDJEN0YsICdWJyksCiAgICAoMHgyRDk3LCAnWCcpLAogICAgKDB4MkRBMCwgJ1YnKSwKICAgICgweDJEQTcsICdYJyksCiAgICAoMHgyREE4LCAnVicpLAogICAgKDB4MkRBRiwgJ1gnKSwKICAgICgweDJEQjAsICdWJyksCiAgICAoMHgyREI3LCAnWCcpLAogICAgKDB4MkRCOCwgJ1YnKSwKICAgICgweDJEQkYsICdYJyksCiAgICAoMHgyREMwLCAnVicpLAogICAgKDB4MkRDNywgJ1gnKSwKICAgICgweDJEQzgsICdWJyksCiAgICAoMHgyRENGLCAnWCcpLAogICAgKDB4MkREMCwgJ1YnKSwKICAgICgweDJERDcsICdYJyksCiAgICAoMHgyREQ4LCAnVicpLAogICAgKDB4MkRERiwgJ1gnKSwKICAgICgweDJERTAsICdWJyksCiAgICAoMHgyRTNDLCAnWCcpLAogICAgKDB4MkU4MCwgJ1YnKSwKICAgICgweDJFOUEsICdYJyksCiAgICAoMHgyRTlCLCAnVicpLAogICAgKDB4MkU5RiwgJ00nLCB1J+avjScpLAogICAgKDB4MkVBMCwgJ1YnKSwKICAgICgweDJFRjMsICdNJywgdSfpvp8nKSwKICAgICgweDJFRjQsICdYJyksCiAgICAoMHgyRjAwLCAnTScsIHUn5LiAJyksCiAgICAoMHgyRjAxLCAnTScsIHUn5LioJyksCiAgICAoMHgyRjAyLCAnTScsIHUn5Li2JyksCiAgICAoMHgyRjAzLCAnTScsIHUn5Li/JyksCiAgICAoMHgyRjA0LCAnTScsIHUn5LmZJyksCiAgICAoMHgyRjA1LCAnTScsIHUn5LqFJyksCiAgICAoMHgyRjA2LCAnTScsIHUn5LqMJyksCiAgICAoMHgyRjA3LCAnTScsIHUn5LqgJyksCiAgICAoMHgyRjA4LCAnTScsIHUn5Lq6JyksCiAgICAoMHgyRjA5LCAnTScsIHUn5YS/JyksCiAgICAoMHgyRjBBLCAnTScsIHUn5YWlJyksCiAgICAoMHgyRjBCLCAnTScsIHUn5YWrJyksCiAgICAoMHgyRjBDLCAnTScsIHUn5YaCJyksCiAgICAoMHgyRjBELCAnTScsIHUn5YaWJyksCiAgICAoMHgyRjBFLCAnTScsIHUn5YarJyksCiAgICAoMHgyRjBGLCAnTScsIHUn5YegJyksCiAgICAoMHgyRjEwLCAnTScsIHUn5Ye1JyksCiAgICAoMHgyRjExLCAnTScsIHUn5YiAJyksCiAgICAoMHgyRjEyLCAnTScsIHUn5YqbJyksCiAgICAoMHgyRjEzLCAnTScsIHUn5Yu5JyksCiAgICAoMHgyRjE0LCAnTScsIHUn5YyVJyksCiAgICAoMHgyRjE1LCAnTScsIHUn5YyaJyksCiAgICAoMHgyRjE2LCAnTScsIHUn5Yy4JyksCiAgICAoMHgyRjE3LCAnTScsIHUn5Y2BJyksCiAgICAoMHgyRjE4LCAnTScsIHUn5Y2cJyksCiAgICAoMHgyRjE5LCAnTScsIHUn5Y2pJyksCiAgICAoMHgyRjFBLCAnTScsIHUn5Y6CJyksCiAgICAoMHgyRjFCLCAnTScsIHUn5Y62JyksCiAgICAoMHgyRjFDLCAnTScsIHUn5Y+IJyksCiAgICAoMHgyRjFELCAnTScsIHUn5Y+jJyksCiAgICAoMHgyRjFFLCAnTScsIHUn5ZuXJyksCiAgICAoMHgyRjFGLCAnTScsIHUn5ZyfJyksCiAgICAoMHgyRjIwLCAnTScsIHUn5aOrJyksCiAgICAoMHgyRjIxLCAnTScsIHUn5aSCJyksCiAgICAoMHgyRjIyLCAnTScsIHUn5aSKJyksCiAgICAoMHgyRjIzLCAnTScsIHUn5aSVJyksCiAgICAoMHgyRjI0LCAnTScsIHUn5aSnJyksCiAgICAoMHgyRjI1LCAnTScsIHUn5aWzJyksCiAgICAoMHgyRjI2LCAnTScsIHUn5a2QJyksCiAgICAoMHgyRjI3LCAnTScsIHUn5a6AJyksCiAgICAoMHgyRjI4LCAnTScsIHUn5a+4JyksCiAgICAoMHgyRjI5LCAnTScsIHUn5bCPJyksCiAgICAoMHgyRjJBLCAnTScsIHUn5bCiJyksCiAgICAoMHgyRjJCLCAnTScsIHUn5bC4JyksCiAgICAoMHgyRjJDLCAnTScsIHUn5bGuJyksCiAgICAoMHgyRjJELCAnTScsIHUn5bGxJyksCiAgICAoMHgyRjJFLCAnTScsIHUn5bebJyksCiAgICAoMHgyRjJGLCAnTScsIHUn5belJyksCiAgICAoMHgyRjMwLCAnTScsIHUn5bexJyksCiAgICAoMHgyRjMxLCAnTScsIHUn5be+JyksCiAgICAoMHgyRjMyLCAnTScsIHUn5bmyJyksCiAgICAoMHgyRjMzLCAnTScsIHUn5bm6JyksCiAgICAoMHgyRjM0LCAnTScsIHUn5bm/JyksCiAgICAoMHgyRjM1LCAnTScsIHUn5bu0JyksCiAgICAoMHgyRjM2LCAnTScsIHUn5bu+JyksCiAgICAoMHgyRjM3LCAnTScsIHUn5byLJyksCiAgICAoMHgyRjM4LCAnTScsIHUn5byTJyksCiAgICAoMHgyRjM5LCAnTScsIHUn5b2QJyksCiAgICBdCgpkZWYgX3NlZ18yNygpOgogICAgcmV0dXJuIFsKICAgICgweDJGM0EsICdNJywgdSflvaEnKSwKICAgICgweDJGM0IsICdNJywgdSflvbMnKSwKICAgICgweDJGM0MsICdNJywgdSflv4MnKSwKICAgICgweDJGM0QsICdNJywgdSfmiIgnKSwKICAgICgweDJGM0UsICdNJywgdSfmiLYnKSwKICAgICgweDJGM0YsICdNJywgdSfmiYsnKSwKICAgICgweDJGNDAsICdNJywgdSfmlK8nKSwKICAgICgweDJGNDEsICdNJywgdSfmlLQnKSwKICAgICgweDJGNDIsICdNJywgdSfmlocnKSwKICAgICgweDJGNDMsICdNJywgdSfmlpcnKSwKICAgICgweDJGNDQsICdNJywgdSfmlqQnKSwKICAgICgweDJGNDUsICdNJywgdSfmlrknKSwKICAgICgweDJGNDYsICdNJywgdSfml6AnKSwKICAgICgweDJGNDcsICdNJywgdSfml6UnKSwKICAgICgweDJGNDgsICdNJywgdSfmm7AnKSwKICAgICgweDJGNDksICdNJywgdSfmnIgnKSwKICAgICgweDJGNEEsICdNJywgdSfmnKgnKSwKICAgICgweDJGNEIsICdNJywgdSfmrKAnKSwKICAgICgweDJGNEMsICdNJywgdSfmraInKSwKICAgICgweDJGNEQsICdNJywgdSfmrbknKSwKICAgICgweDJGNEUsICdNJywgdSfmrrMnKSwKICAgICgweDJGNEYsICdNJywgdSfmr4snKSwKICAgICgweDJGNTAsICdNJywgdSfmr5QnKSwKICAgICgweDJGNTEsICdNJywgdSfmr5snKSwKICAgICgweDJGNTIsICdNJywgdSfmsI8nKSwKICAgICgweDJGNTMsICdNJywgdSfmsJQnKSwKICAgICgweDJGNTQsICdNJywgdSfmsLQnKSwKICAgICgweDJGNTUsICdNJywgdSfngasnKSwKICAgICgweDJGNTYsICdNJywgdSfniKonKSwKICAgICgweDJGNTcsICdNJywgdSfniLYnKSwKICAgICgweDJGNTgsICdNJywgdSfniLsnKSwKICAgICgweDJGNTksICdNJywgdSfniL8nKSwKICAgICgweDJGNUEsICdNJywgdSfniYcnKSwKICAgICgweDJGNUIsICdNJywgdSfniZknKSwKICAgICgweDJGNUMsICdNJywgdSfniZsnKSwKICAgICgweDJGNUQsICdNJywgdSfniqwnKSwKICAgICgweDJGNUUsICdNJywgdSfnjoQnKSwKICAgICgweDJGNUYsICdNJywgdSfnjoknKSwKICAgICgweDJGNjAsICdNJywgdSfnk5wnKSwKICAgICgweDJGNjEsICdNJywgdSfnk6YnKSwKICAgICgweDJGNjIsICdNJywgdSfnlJgnKSwKICAgICgweDJGNjMsICdNJywgdSfnlJ8nKSwKICAgICgweDJGNjQsICdNJywgdSfnlKgnKSwKICAgICgweDJGNjUsICdNJywgdSfnlLAnKSwKICAgICgweDJGNjYsICdNJywgdSfnlosnKSwKICAgICgweDJGNjcsICdNJywgdSfnlpInKSwKICAgICgweDJGNjgsICdNJywgdSfnmbYnKSwKICAgICgweDJGNjksICdNJywgdSfnmb0nKSwKICAgICgweDJGNkEsICdNJywgdSfnmq4nKSwKICAgICgweDJGNkIsICdNJywgdSfnmr8nKSwKICAgICgweDJGNkMsICdNJywgdSfnm64nKSwKICAgICgweDJGNkQsICdNJywgdSfnn5snKSwKICAgICgweDJGNkUsICdNJywgdSfnn6InKSwKICAgICgweDJGNkYsICdNJywgdSfnn7MnKSwKICAgICgweDJGNzAsICdNJywgdSfnpLonKSwKICAgICgweDJGNzEsICdNJywgdSfnprgnKSwKICAgICgweDJGNzIsICdNJywgdSfnpr4nKSwKICAgICgweDJGNzMsICdNJywgdSfnqbQnKSwKICAgICgweDJGNzQsICdNJywgdSfnq4snKSwKICAgICgweDJGNzUsICdNJywgdSfnq7knKSwKICAgICgweDJGNzYsICdNJywgdSfnsbMnKSwKICAgICgweDJGNzcsICdNJywgdSfns7gnKSwKICAgICgweDJGNzgsICdNJywgdSfnvLYnKSwKICAgICgweDJGNzksICdNJywgdSfnvZEnKSwKICAgICgweDJGN0EsICdNJywgdSfnvoonKSwKICAgICgweDJGN0IsICdNJywgdSfnvr0nKSwKICAgICgweDJGN0MsICdNJywgdSfogIEnKSwKICAgICgweDJGN0QsICdNJywgdSfogIwnKSwKICAgICgweDJGN0UsICdNJywgdSfogJInKSwKICAgICgweDJGN0YsICdNJywgdSfogLMnKSwKICAgICgweDJGODAsICdNJywgdSfogb8nKSwKICAgICgweDJGODEsICdNJywgdSfogoknKSwKICAgICgweDJGODIsICdNJywgdSfoh6MnKSwKICAgICgweDJGODMsICdNJywgdSfoh6onKSwKICAgICgweDJGODQsICdNJywgdSfoh7MnKSwKICAgICgweDJGODUsICdNJywgdSfoh7wnKSwKICAgICgweDJGODYsICdNJywgdSfoiIwnKSwKICAgICgweDJGODcsICdNJywgdSfoiJsnKSwKICAgICgweDJGODgsICdNJywgdSfoiJ8nKSwKICAgICgweDJGODksICdNJywgdSfoia4nKSwKICAgICgweDJGOEEsICdNJywgdSfoibInKSwKICAgICgweDJGOEIsICdNJywgdSfoibgnKSwKICAgICgweDJGOEMsICdNJywgdSfomY0nKSwKICAgICgweDJGOEQsICdNJywgdSfomasnKSwKICAgICgweDJGOEUsICdNJywgdSfooYAnKSwKICAgICgweDJGOEYsICdNJywgdSfooYwnKSwKICAgICgweDJGOTAsICdNJywgdSfooaMnKSwKICAgICgweDJGOTEsICdNJywgdSfopb4nKSwKICAgICgweDJGOTIsICdNJywgdSfoposnKSwKICAgICgweDJGOTMsICdNJywgdSfop5InKSwKICAgICgweDJGOTQsICdNJywgdSfoqIAnKSwKICAgICgweDJGOTUsICdNJywgdSfosLcnKSwKICAgICgweDJGOTYsICdNJywgdSfosYYnKSwKICAgICgweDJGOTcsICdNJywgdSfosZUnKSwKICAgICgweDJGOTgsICdNJywgdSfosbgnKSwKICAgICgweDJGOTksICdNJywgdSfosp0nKSwKICAgICgweDJGOUEsICdNJywgdSfotaQnKSwKICAgICgweDJGOUIsICdNJywgdSfotbAnKSwKICAgICgweDJGOUMsICdNJywgdSfotrMnKSwKICAgICgweDJGOUQsICdNJywgdSfouqsnKSwKICAgIF0KCmRlZiBfc2VnXzI4KCk6CiAgICByZXR1cm4gWwogICAgKDB4MkY5RSwgJ00nLCB1J+i7iicpLAogICAgKDB4MkY5RiwgJ00nLCB1J+i+mycpLAogICAgKDB4MkZBMCwgJ00nLCB1J+i+sCcpLAogICAgKDB4MkZBMSwgJ00nLCB1J+i+tScpLAogICAgKDB4MkZBMiwgJ00nLCB1J+mCkScpLAogICAgKDB4MkZBMywgJ00nLCB1J+mFiScpLAogICAgKDB4MkZBNCwgJ00nLCB1J+mHhicpLAogICAgKDB4MkZBNSwgJ00nLCB1J+mHjCcpLAogICAgKDB4MkZBNiwgJ00nLCB1J+mHkScpLAogICAgKDB4MkZBNywgJ00nLCB1J+mVtycpLAogICAgKDB4MkZBOCwgJ00nLCB1J+mWgCcpLAogICAgKDB4MkZBOSwgJ00nLCB1J+mYnCcpLAogICAgKDB4MkZBQSwgJ00nLCB1J+maticpLAogICAgKDB4MkZBQiwgJ00nLCB1J+mauScpLAogICAgKDB4MkZBQywgJ00nLCB1J+mbqCcpLAogICAgKDB4MkZBRCwgJ00nLCB1J+mdkScpLAogICAgKDB4MkZBRSwgJ00nLCB1J+mdnicpLAogICAgKDB4MkZBRiwgJ00nLCB1J+mdoicpLAogICAgKDB4MkZCMCwgJ00nLCB1J+mdqScpLAogICAgKDB4MkZCMSwgJ00nLCB1J+mfiycpLAogICAgKDB4MkZCMiwgJ00nLCB1J+mfrScpLAogICAgKDB4MkZCMywgJ00nLCB1J+mfsycpLAogICAgKDB4MkZCNCwgJ00nLCB1J+mggScpLAogICAgKDB4MkZCNSwgJ00nLCB1J+miqCcpLAogICAgKDB4MkZCNiwgJ00nLCB1J+mjmycpLAogICAgKDB4MkZCNywgJ00nLCB1J+mjnycpLAogICAgKDB4MkZCOCwgJ00nLCB1J+mmlicpLAogICAgKDB4MkZCOSwgJ00nLCB1J+mmmScpLAogICAgKDB4MkZCQSwgJ00nLCB1J+mmrCcpLAogICAgKDB4MkZCQiwgJ00nLCB1J+mqqCcpLAogICAgKDB4MkZCQywgJ00nLCB1J+mrmCcpLAogICAgKDB4MkZCRCwgJ00nLCB1J+mrnycpLAogICAgKDB4MkZCRSwgJ00nLCB1J+mspScpLAogICAgKDB4MkZCRiwgJ00nLCB1J+msrycpLAogICAgKDB4MkZDMCwgJ00nLCB1J+mssicpLAogICAgKDB4MkZDMSwgJ00nLCB1J+msvCcpLAogICAgKDB4MkZDMiwgJ00nLCB1J+mtmicpLAogICAgKDB4MkZDMywgJ00nLCB1J+mzpScpLAogICAgKDB4MkZDNCwgJ00nLCB1J+m5tScpLAogICAgKDB4MkZDNSwgJ00nLCB1J+m5vycpLAogICAgKDB4MkZDNiwgJ00nLCB1J+m6pScpLAogICAgKDB4MkZDNywgJ00nLCB1J+m6uycpLAogICAgKDB4MkZDOCwgJ00nLCB1J+m7gycpLAogICAgKDB4MkZDOSwgJ00nLCB1J+m7jScpLAogICAgKDB4MkZDQSwgJ00nLCB1J+m7kScpLAogICAgKDB4MkZDQiwgJ00nLCB1J+m7uScpLAogICAgKDB4MkZDQywgJ00nLCB1J+m7vScpLAogICAgKDB4MkZDRCwgJ00nLCB1J+m8jicpLAogICAgKDB4MkZDRSwgJ00nLCB1J+m8kycpLAogICAgKDB4MkZDRiwgJ00nLCB1J+m8oCcpLAogICAgKDB4MkZEMCwgJ00nLCB1J+m8uycpLAogICAgKDB4MkZEMSwgJ00nLCB1J+m9iicpLAogICAgKDB4MkZEMiwgJ00nLCB1J+m9kicpLAogICAgKDB4MkZEMywgJ00nLCB1J+m+jScpLAogICAgKDB4MkZENCwgJ00nLCB1J+m+nCcpLAogICAgKDB4MkZENSwgJ00nLCB1J+m+oCcpLAogICAgKDB4MkZENiwgJ1gnKSwKICAgICgweDMwMDAsICczJywgdScgJyksCiAgICAoMHgzMDAxLCAnVicpLAogICAgKDB4MzAwMiwgJ00nLCB1Jy4nKSwKICAgICgweDMwMDMsICdWJyksCiAgICAoMHgzMDM2LCAnTScsIHUn44CSJyksCiAgICAoMHgzMDM3LCAnVicpLAogICAgKDB4MzAzOCwgJ00nLCB1J+WNgScpLAogICAgKDB4MzAzOSwgJ00nLCB1J+WNhCcpLAogICAgKDB4MzAzQSwgJ00nLCB1J+WNhScpLAogICAgKDB4MzAzQiwgJ1YnKSwKICAgICgweDMwNDAsICdYJyksCiAgICAoMHgzMDQxLCAnVicpLAogICAgKDB4MzA5NywgJ1gnKSwKICAgICgweDMwOTksICdWJyksCiAgICAoMHgzMDlCLCAnMycsIHUnIOOCmScpLAogICAgKDB4MzA5QywgJzMnLCB1JyDjgponKSwKICAgICgweDMwOUQsICdWJyksCiAgICAoMHgzMDlGLCAnTScsIHUn44KI44KKJyksCiAgICAoMHgzMEEwLCAnVicpLAogICAgKDB4MzBGRiwgJ00nLCB1J+OCs+ODiCcpLAogICAgKDB4MzEwMCwgJ1gnKSwKICAgICgweDMxMDUsICdWJyksCiAgICAoMHgzMTJFLCAnWCcpLAogICAgKDB4MzEzMSwgJ00nLCB1J+GEgCcpLAogICAgKDB4MzEzMiwgJ00nLCB1J+GEgScpLAogICAgKDB4MzEzMywgJ00nLCB1J+GGqicpLAogICAgKDB4MzEzNCwgJ00nLCB1J+GEgicpLAogICAgKDB4MzEzNSwgJ00nLCB1J+GGrCcpLAogICAgKDB4MzEzNiwgJ00nLCB1J+GGrScpLAogICAgKDB4MzEzNywgJ00nLCB1J+GEgycpLAogICAgKDB4MzEzOCwgJ00nLCB1J+GEhCcpLAogICAgKDB4MzEzOSwgJ00nLCB1J+GEhScpLAogICAgKDB4MzEzQSwgJ00nLCB1J+GGsCcpLAogICAgKDB4MzEzQiwgJ00nLCB1J+GGsScpLAogICAgKDB4MzEzQywgJ00nLCB1J+GGsicpLAogICAgKDB4MzEzRCwgJ00nLCB1J+GGsycpLAogICAgKDB4MzEzRSwgJ00nLCB1J+GGtCcpLAogICAgKDB4MzEzRiwgJ00nLCB1J+GGtScpLAogICAgKDB4MzE0MCwgJ00nLCB1J+GEmicpLAogICAgKDB4MzE0MSwgJ00nLCB1J+GEhicpLAogICAgKDB4MzE0MiwgJ00nLCB1J+GEhycpLAogICAgKDB4MzE0MywgJ00nLCB1J+GEiCcpLAogICAgKDB4MzE0NCwgJ00nLCB1J+GEoScpLAogICAgXQoKZGVmIF9zZWdfMjkoKToKICAgIHJldHVybiBbCiAgICAoMHgzMTQ1LCAnTScsIHUn4YSJJyksCiAgICAoMHgzMTQ2LCAnTScsIHUn4YSKJyksCiAgICAoMHgzMTQ3LCAnTScsIHUn4YSLJyksCiAgICAoMHgzMTQ4LCAnTScsIHUn4YSMJyksCiAgICAoMHgzMTQ5LCAnTScsIHUn4YSNJyksCiAgICAoMHgzMTRBLCAnTScsIHUn4YSOJyksCiAgICAoMHgzMTRCLCAnTScsIHUn4YSPJyksCiAgICAoMHgzMTRDLCAnTScsIHUn4YSQJyksCiAgICAoMHgzMTRELCAnTScsIHUn4YSRJyksCiAgICAoMHgzMTRFLCAnTScsIHUn4YSSJyksCiAgICAoMHgzMTRGLCAnTScsIHUn4YWhJyksCiAgICAoMHgzMTUwLCAnTScsIHUn4YWiJyksCiAgICAoMHgzMTUxLCAnTScsIHUn4YWjJyksCiAgICAoMHgzMTUyLCAnTScsIHUn4YWkJyksCiAgICAoMHgzMTUzLCAnTScsIHUn4YWlJyksCiAgICAoMHgzMTU0LCAnTScsIHUn4YWmJyksCiAgICAoMHgzMTU1LCAnTScsIHUn4YWnJyksCiAgICAoMHgzMTU2LCAnTScsIHUn4YWoJyksCiAgICAoMHgzMTU3LCAnTScsIHUn4YWpJyksCiAgICAoMHgzMTU4LCAnTScsIHUn4YWqJyksCiAgICAoMHgzMTU5LCAnTScsIHUn4YWrJyksCiAgICAoMHgzMTVBLCAnTScsIHUn4YWsJyksCiAgICAoMHgzMTVCLCAnTScsIHUn4YWtJyksCiAgICAoMHgzMTVDLCAnTScsIHUn4YWuJyksCiAgICAoMHgzMTVELCAnTScsIHUn4YWvJyksCiAgICAoMHgzMTVFLCAnTScsIHUn4YWwJyksCiAgICAoMHgzMTVGLCAnTScsIHUn4YWxJyksCiAgICAoMHgzMTYwLCAnTScsIHUn4YWyJyksCiAgICAoMHgzMTYxLCAnTScsIHUn4YWzJyksCiAgICAoMHgzMTYyLCAnTScsIHUn4YW0JyksCiAgICAoMHgzMTYzLCAnTScsIHUn4YW1JyksCiAgICAoMHgzMTY0LCAnWCcpLAogICAgKDB4MzE2NSwgJ00nLCB1J+GElCcpLAogICAgKDB4MzE2NiwgJ00nLCB1J+GElScpLAogICAgKDB4MzE2NywgJ00nLCB1J+GHhycpLAogICAgKDB4MzE2OCwgJ00nLCB1J+GHiCcpLAogICAgKDB4MzE2OSwgJ00nLCB1J+GHjCcpLAogICAgKDB4MzE2QSwgJ00nLCB1J+GHjicpLAogICAgKDB4MzE2QiwgJ00nLCB1J+GHkycpLAogICAgKDB4MzE2QywgJ00nLCB1J+GHlycpLAogICAgKDB4MzE2RCwgJ00nLCB1J+GHmScpLAogICAgKDB4MzE2RSwgJ00nLCB1J+GEnCcpLAogICAgKDB4MzE2RiwgJ00nLCB1J+GHnScpLAogICAgKDB4MzE3MCwgJ00nLCB1J+GHnycpLAogICAgKDB4MzE3MSwgJ00nLCB1J+GEnScpLAogICAgKDB4MzE3MiwgJ00nLCB1J+GEnicpLAogICAgKDB4MzE3MywgJ00nLCB1J+GEoCcpLAogICAgKDB4MzE3NCwgJ00nLCB1J+GEoicpLAogICAgKDB4MzE3NSwgJ00nLCB1J+GEoycpLAogICAgKDB4MzE3NiwgJ00nLCB1J+GEpycpLAogICAgKDB4MzE3NywgJ00nLCB1J+GEqScpLAogICAgKDB4MzE3OCwgJ00nLCB1J+GEqycpLAogICAgKDB4MzE3OSwgJ00nLCB1J+GErCcpLAogICAgKDB4MzE3QSwgJ00nLCB1J+GErScpLAogICAgKDB4MzE3QiwgJ00nLCB1J+GEricpLAogICAgKDB4MzE3QywgJ00nLCB1J+GErycpLAogICAgKDB4MzE3RCwgJ00nLCB1J+GEsicpLAogICAgKDB4MzE3RSwgJ00nLCB1J+GEticpLAogICAgKDB4MzE3RiwgJ00nLCB1J+GFgCcpLAogICAgKDB4MzE4MCwgJ00nLCB1J+GFhycpLAogICAgKDB4MzE4MSwgJ00nLCB1J+GFjCcpLAogICAgKDB4MzE4MiwgJ00nLCB1J+GHsScpLAogICAgKDB4MzE4MywgJ00nLCB1J+GHsicpLAogICAgKDB4MzE4NCwgJ00nLCB1J+GFlycpLAogICAgKDB4MzE4NSwgJ00nLCB1J+GFmCcpLAogICAgKDB4MzE4NiwgJ00nLCB1J+GFmScpLAogICAgKDB4MzE4NywgJ00nLCB1J+GGhCcpLAogICAgKDB4MzE4OCwgJ00nLCB1J+GGhScpLAogICAgKDB4MzE4OSwgJ00nLCB1J+GGiCcpLAogICAgKDB4MzE4QSwgJ00nLCB1J+GGkScpLAogICAgKDB4MzE4QiwgJ00nLCB1J+GGkicpLAogICAgKDB4MzE4QywgJ00nLCB1J+GGlCcpLAogICAgKDB4MzE4RCwgJ00nLCB1J+GGnicpLAogICAgKDB4MzE4RSwgJ00nLCB1J+GGoScpLAogICAgKDB4MzE4RiwgJ1gnKSwKICAgICgweDMxOTAsICdWJyksCiAgICAoMHgzMTkyLCAnTScsIHUn5LiAJyksCiAgICAoMHgzMTkzLCAnTScsIHUn5LqMJyksCiAgICAoMHgzMTk0LCAnTScsIHUn5LiJJyksCiAgICAoMHgzMTk1LCAnTScsIHUn5ZubJyksCiAgICAoMHgzMTk2LCAnTScsIHUn5LiKJyksCiAgICAoMHgzMTk3LCAnTScsIHUn5LitJyksCiAgICAoMHgzMTk4LCAnTScsIHUn5LiLJyksCiAgICAoMHgzMTk5LCAnTScsIHUn55SyJyksCiAgICAoMHgzMTlBLCAnTScsIHUn5LmZJyksCiAgICAoMHgzMTlCLCAnTScsIHUn5LiZJyksCiAgICAoMHgzMTlDLCAnTScsIHUn5LiBJyksCiAgICAoMHgzMTlELCAnTScsIHUn5aSpJyksCiAgICAoMHgzMTlFLCAnTScsIHUn5ZywJyksCiAgICAoMHgzMTlGLCAnTScsIHUn5Lq6JyksCiAgICAoMHgzMUEwLCAnVicpLAogICAgKDB4MzFCQiwgJ1gnKSwKICAgICgweDMxQzAsICdWJyksCiAgICAoMHgzMUU0LCAnWCcpLAogICAgKDB4MzFGMCwgJ1YnKSwKICAgICgweDMyMDAsICczJywgdSco4YSAKScpLAogICAgKDB4MzIwMSwgJzMnLCB1JyjhhIIpJyksCiAgICAoMHgzMjAyLCAnMycsIHUnKOGEgyknKSwKICAgICgweDMyMDMsICczJywgdSco4YSFKScpLAogICAgKDB4MzIwNCwgJzMnLCB1JyjhhIYpJyksCiAgICBdCgpkZWYgX3NlZ18zMCgpOgogICAgcmV0dXJuIFsKICAgICgweDMyMDUsICczJywgdSco4YSHKScpLAogICAgKDB4MzIwNiwgJzMnLCB1JyjhhIkpJyksCiAgICAoMHgzMjA3LCAnMycsIHUnKOGEiyknKSwKICAgICgweDMyMDgsICczJywgdSco4YSMKScpLAogICAgKDB4MzIwOSwgJzMnLCB1JyjhhI4pJyksCiAgICAoMHgzMjBBLCAnMycsIHUnKOGEjyknKSwKICAgICgweDMyMEIsICczJywgdSco4YSQKScpLAogICAgKDB4MzIwQywgJzMnLCB1JyjhhJEpJyksCiAgICAoMHgzMjBELCAnMycsIHUnKOGEkiknKSwKICAgICgweDMyMEUsICczJywgdSco6rCAKScpLAogICAgKDB4MzIwRiwgJzMnLCB1JyjrgpgpJyksCiAgICAoMHgzMjEwLCAnMycsIHUnKOuLpCknKSwKICAgICgweDMyMTEsICczJywgdSco6528KScpLAogICAgKDB4MzIxMiwgJzMnLCB1Jyjrp4gpJyksCiAgICAoMHgzMjEzLCAnMycsIHUnKOuwlCknKSwKICAgICgweDMyMTQsICczJywgdSco7IKsKScpLAogICAgKDB4MzIxNSwgJzMnLCB1JyjslYQpJyksCiAgICAoMHgzMjE2LCAnMycsIHUnKOyekCknKSwKICAgICgweDMyMTcsICczJywgdSco7LCoKScpLAogICAgKDB4MzIxOCwgJzMnLCB1JyjsubQpJyksCiAgICAoMHgzMjE5LCAnMycsIHUnKO2DgCknKSwKICAgICgweDMyMUEsICczJywgdSco7YyMKScpLAogICAgKDB4MzIxQiwgJzMnLCB1JyjtlZgpJyksCiAgICAoMHgzMjFDLCAnMycsIHUnKOyjvCknKSwKICAgICgweDMyMUQsICczJywgdSco7Jik7KCEKScpLAogICAgKDB4MzIxRSwgJzMnLCB1JyjsmKTtm4QpJyksCiAgICAoMHgzMjFGLCAnWCcpLAogICAgKDB4MzIyMCwgJzMnLCB1JyjkuIApJyksCiAgICAoMHgzMjIxLCAnMycsIHUnKOS6jCknKSwKICAgICgweDMyMjIsICczJywgdSco5LiJKScpLAogICAgKDB4MzIyMywgJzMnLCB1Jyjlm5spJyksCiAgICAoMHgzMjI0LCAnMycsIHUnKOS6lCknKSwKICAgICgweDMyMjUsICczJywgdSco5YWtKScpLAogICAgKDB4MzIyNiwgJzMnLCB1JyjkuIMpJyksCiAgICAoMHgzMjI3LCAnMycsIHUnKOWFqyknKSwKICAgICgweDMyMjgsICczJywgdSco5LmdKScpLAogICAgKDB4MzIyOSwgJzMnLCB1JyjljYEpJyksCiAgICAoMHgzMjJBLCAnMycsIHUnKOaciCknKSwKICAgICgweDMyMkIsICczJywgdSco54GrKScpLAogICAgKDB4MzIyQywgJzMnLCB1JyjmsLQpJyksCiAgICAoMHgzMjJELCAnMycsIHUnKOacqCknKSwKICAgICgweDMyMkUsICczJywgdSco6YeRKScpLAogICAgKDB4MzIyRiwgJzMnLCB1JyjlnJ8pJyksCiAgICAoMHgzMjMwLCAnMycsIHUnKOaXpSknKSwKICAgICgweDMyMzEsICczJywgdSco5qCqKScpLAogICAgKDB4MzIzMiwgJzMnLCB1JyjmnIkpJyksCiAgICAoMHgzMjMzLCAnMycsIHUnKOekviknKSwKICAgICgweDMyMzQsICczJywgdSco5ZCNKScpLAogICAgKDB4MzIzNSwgJzMnLCB1JyjnibkpJyksCiAgICAoMHgzMjM2LCAnMycsIHUnKOiyoSknKSwKICAgICgweDMyMzcsICczJywgdSco56WdKScpLAogICAgKDB4MzIzOCwgJzMnLCB1JyjlirQpJyksCiAgICAoMHgzMjM5LCAnMycsIHUnKOS7oyknKSwKICAgICgweDMyM0EsICczJywgdSco5ZG8KScpLAogICAgKDB4MzIzQiwgJzMnLCB1JyjlraYpJyksCiAgICAoMHgzMjNDLCAnMycsIHUnKOeboyknKSwKICAgICgweDMyM0QsICczJywgdSco5LyBKScpLAogICAgKDB4MzIzRSwgJzMnLCB1Jyjos4cpJyksCiAgICAoMHgzMjNGLCAnMycsIHUnKOWNlCknKSwKICAgICgweDMyNDAsICczJywgdSco56WtKScpLAogICAgKDB4MzI0MSwgJzMnLCB1JyjkvJEpJyksCiAgICAoMHgzMjQyLCAnMycsIHUnKOiHqiknKSwKICAgICgweDMyNDMsICczJywgdSco6IezKScpLAogICAgKDB4MzI0NCwgJ00nLCB1J+WVjycpLAogICAgKDB4MzI0NSwgJ00nLCB1J+W5vCcpLAogICAgKDB4MzI0NiwgJ00nLCB1J+aWhycpLAogICAgKDB4MzI0NywgJ00nLCB1J+eujycpLAogICAgKDB4MzI0OCwgJ1YnKSwKICAgICgweDMyNTAsICdNJywgdSdwdGUnKSwKICAgICgweDMyNTEsICdNJywgdScyMScpLAogICAgKDB4MzI1MiwgJ00nLCB1JzIyJyksCiAgICAoMHgzMjUzLCAnTScsIHUnMjMnKSwKICAgICgweDMyNTQsICdNJywgdScyNCcpLAogICAgKDB4MzI1NSwgJ00nLCB1JzI1JyksCiAgICAoMHgzMjU2LCAnTScsIHUnMjYnKSwKICAgICgweDMyNTcsICdNJywgdScyNycpLAogICAgKDB4MzI1OCwgJ00nLCB1JzI4JyksCiAgICAoMHgzMjU5LCAnTScsIHUnMjknKSwKICAgICgweDMyNUEsICdNJywgdSczMCcpLAogICAgKDB4MzI1QiwgJ00nLCB1JzMxJyksCiAgICAoMHgzMjVDLCAnTScsIHUnMzInKSwKICAgICgweDMyNUQsICdNJywgdSczMycpLAogICAgKDB4MzI1RSwgJ00nLCB1JzM0JyksCiAgICAoMHgzMjVGLCAnTScsIHUnMzUnKSwKICAgICgweDMyNjAsICdNJywgdSfhhIAnKSwKICAgICgweDMyNjEsICdNJywgdSfhhIInKSwKICAgICgweDMyNjIsICdNJywgdSfhhIMnKSwKICAgICgweDMyNjMsICdNJywgdSfhhIUnKSwKICAgICgweDMyNjQsICdNJywgdSfhhIYnKSwKICAgICgweDMyNjUsICdNJywgdSfhhIcnKSwKICAgICgweDMyNjYsICdNJywgdSfhhIknKSwKICAgICgweDMyNjcsICdNJywgdSfhhIsnKSwKICAgICgweDMyNjgsICdNJywgdSfhhIwnKSwKICAgICgweDMyNjksICdNJywgdSfhhI4nKSwKICAgICgweDMyNkEsICdNJywgdSfhhI8nKSwKICAgICgweDMyNkIsICdNJywgdSfhhJAnKSwKICAgICgweDMyNkMsICdNJywgdSfhhJEnKSwKICAgICgweDMyNkQsICdNJywgdSfhhJInKSwKICAgICgweDMyNkUsICdNJywgdSfqsIAnKSwKICAgICgweDMyNkYsICdNJywgdSfrgpgnKSwKICAgIF0KCmRlZiBfc2VnXzMxKCk6CiAgICByZXR1cm4gWwogICAgKDB4MzI3MCwgJ00nLCB1J+uLpCcpLAogICAgKDB4MzI3MSwgJ00nLCB1J+udvCcpLAogICAgKDB4MzI3MiwgJ00nLCB1J+uniCcpLAogICAgKDB4MzI3MywgJ00nLCB1J+uwlCcpLAogICAgKDB4MzI3NCwgJ00nLCB1J+yCrCcpLAogICAgKDB4MzI3NSwgJ00nLCB1J+yVhCcpLAogICAgKDB4MzI3NiwgJ00nLCB1J+yekCcpLAogICAgKDB4MzI3NywgJ00nLCB1J+ywqCcpLAogICAgKDB4MzI3OCwgJ00nLCB1J+y5tCcpLAogICAgKDB4MzI3OSwgJ00nLCB1J+2DgCcpLAogICAgKDB4MzI3QSwgJ00nLCB1J+2MjCcpLAogICAgKDB4MzI3QiwgJ00nLCB1J+2VmCcpLAogICAgKDB4MzI3QywgJ00nLCB1J+ywuOqzoCcpLAogICAgKDB4MzI3RCwgJ00nLCB1J+yjvOydmCcpLAogICAgKDB4MzI3RSwgJ00nLCB1J+yasCcpLAogICAgKDB4MzI3RiwgJ1YnKSwKICAgICgweDMyODAsICdNJywgdSfkuIAnKSwKICAgICgweDMyODEsICdNJywgdSfkuownKSwKICAgICgweDMyODIsICdNJywgdSfkuIknKSwKICAgICgweDMyODMsICdNJywgdSflm5snKSwKICAgICgweDMyODQsICdNJywgdSfkupQnKSwKICAgICgweDMyODUsICdNJywgdSflha0nKSwKICAgICgweDMyODYsICdNJywgdSfkuIMnKSwKICAgICgweDMyODcsICdNJywgdSflhasnKSwKICAgICgweDMyODgsICdNJywgdSfkuZ0nKSwKICAgICgweDMyODksICdNJywgdSfljYEnKSwKICAgICgweDMyOEEsICdNJywgdSfmnIgnKSwKICAgICgweDMyOEIsICdNJywgdSfngasnKSwKICAgICgweDMyOEMsICdNJywgdSfmsLQnKSwKICAgICgweDMyOEQsICdNJywgdSfmnKgnKSwKICAgICgweDMyOEUsICdNJywgdSfph5EnKSwKICAgICgweDMyOEYsICdNJywgdSflnJ8nKSwKICAgICgweDMyOTAsICdNJywgdSfml6UnKSwKICAgICgweDMyOTEsICdNJywgdSfmoKonKSwKICAgICgweDMyOTIsICdNJywgdSfmnIknKSwKICAgICgweDMyOTMsICdNJywgdSfnpL4nKSwKICAgICgweDMyOTQsICdNJywgdSflkI0nKSwKICAgICgweDMyOTUsICdNJywgdSfnibknKSwKICAgICgweDMyOTYsICdNJywgdSfosqEnKSwKICAgICgweDMyOTcsICdNJywgdSfnpZ0nKSwKICAgICgweDMyOTgsICdNJywgdSflirQnKSwKICAgICgweDMyOTksICdNJywgdSfnp5gnKSwKICAgICgweDMyOUEsICdNJywgdSfnlLcnKSwKICAgICgweDMyOUIsICdNJywgdSflpbMnKSwKICAgICgweDMyOUMsICdNJywgdSfpgaknKSwKICAgICgweDMyOUQsICdNJywgdSflhKonKSwKICAgICgweDMyOUUsICdNJywgdSfljbAnKSwKICAgICgweDMyOUYsICdNJywgdSfms6gnKSwKICAgICgweDMyQTAsICdNJywgdSfpoIUnKSwKICAgICgweDMyQTEsICdNJywgdSfkvJEnKSwKICAgICgweDMyQTIsICdNJywgdSflhpknKSwKICAgICgweDMyQTMsICdNJywgdSfmraMnKSwKICAgICgweDMyQTQsICdNJywgdSfkuIonKSwKICAgICgweDMyQTUsICdNJywgdSfkuK0nKSwKICAgICgweDMyQTYsICdNJywgdSfkuIsnKSwKICAgICgweDMyQTcsICdNJywgdSflt6YnKSwKICAgICgweDMyQTgsICdNJywgdSflj7MnKSwKICAgICgweDMyQTksICdNJywgdSfljLsnKSwKICAgICgweDMyQUEsICdNJywgdSflrpcnKSwKICAgICgweDMyQUIsICdNJywgdSflraYnKSwKICAgICgweDMyQUMsICdNJywgdSfnm6MnKSwKICAgICgweDMyQUQsICdNJywgdSfkvIEnKSwKICAgICgweDMyQUUsICdNJywgdSfos4cnKSwKICAgICgweDMyQUYsICdNJywgdSfljZQnKSwKICAgICgweDMyQjAsICdNJywgdSflpJwnKSwKICAgICgweDMyQjEsICdNJywgdSczNicpLAogICAgKDB4MzJCMiwgJ00nLCB1JzM3JyksCiAgICAoMHgzMkIzLCAnTScsIHUnMzgnKSwKICAgICgweDMyQjQsICdNJywgdSczOScpLAogICAgKDB4MzJCNSwgJ00nLCB1JzQwJyksCiAgICAoMHgzMkI2LCAnTScsIHUnNDEnKSwKICAgICgweDMyQjcsICdNJywgdSc0MicpLAogICAgKDB4MzJCOCwgJ00nLCB1JzQzJyksCiAgICAoMHgzMkI5LCAnTScsIHUnNDQnKSwKICAgICgweDMyQkEsICdNJywgdSc0NScpLAogICAgKDB4MzJCQiwgJ00nLCB1JzQ2JyksCiAgICAoMHgzMkJDLCAnTScsIHUnNDcnKSwKICAgICgweDMyQkQsICdNJywgdSc0OCcpLAogICAgKDB4MzJCRSwgJ00nLCB1JzQ5JyksCiAgICAoMHgzMkJGLCAnTScsIHUnNTAnKSwKICAgICgweDMyQzAsICdNJywgdScx5pyIJyksCiAgICAoMHgzMkMxLCAnTScsIHUnMuaciCcpLAogICAgKDB4MzJDMiwgJ00nLCB1JzPmnIgnKSwKICAgICgweDMyQzMsICdNJywgdSc05pyIJyksCiAgICAoMHgzMkM0LCAnTScsIHUnNeaciCcpLAogICAgKDB4MzJDNSwgJ00nLCB1JzbmnIgnKSwKICAgICgweDMyQzYsICdNJywgdSc35pyIJyksCiAgICAoMHgzMkM3LCAnTScsIHUnOOaciCcpLAogICAgKDB4MzJDOCwgJ00nLCB1JznmnIgnKSwKICAgICgweDMyQzksICdNJywgdScxMOaciCcpLAogICAgKDB4MzJDQSwgJ00nLCB1JzEx5pyIJyksCiAgICAoMHgzMkNCLCAnTScsIHUnMTLmnIgnKSwKICAgICgweDMyQ0MsICdNJywgdSdoZycpLAogICAgKDB4MzJDRCwgJ00nLCB1J2VyZycpLAogICAgKDB4MzJDRSwgJ00nLCB1J2V2JyksCiAgICAoMHgzMkNGLCAnTScsIHUnbHRkJyksCiAgICAoMHgzMkQwLCAnTScsIHUn44KiJyksCiAgICAoMHgzMkQxLCAnTScsIHUn44KkJyksCiAgICAoMHgzMkQyLCAnTScsIHUn44KmJyksCiAgICAoMHgzMkQzLCAnTScsIHUn44KoJyksCiAgICBdCgpkZWYgX3NlZ18zMigpOgogICAgcmV0dXJuIFsKICAgICgweDMyRDQsICdNJywgdSfjgqonKSwKICAgICgweDMyRDUsICdNJywgdSfjgqsnKSwKICAgICgweDMyRDYsICdNJywgdSfjgq0nKSwKICAgICgweDMyRDcsICdNJywgdSfjgq8nKSwKICAgICgweDMyRDgsICdNJywgdSfjgrEnKSwKICAgICgweDMyRDksICdNJywgdSfjgrMnKSwKICAgICgweDMyREEsICdNJywgdSfjgrUnKSwKICAgICgweDMyREIsICdNJywgdSfjgrcnKSwKICAgICgweDMyREMsICdNJywgdSfjgrknKSwKICAgICgweDMyREQsICdNJywgdSfjgrsnKSwKICAgICgweDMyREUsICdNJywgdSfjgr0nKSwKICAgICgweDMyREYsICdNJywgdSfjgr8nKSwKICAgICgweDMyRTAsICdNJywgdSfjg4EnKSwKICAgICgweDMyRTEsICdNJywgdSfjg4QnKSwKICAgICgweDMyRTIsICdNJywgdSfjg4YnKSwKICAgICgweDMyRTMsICdNJywgdSfjg4gnKSwKICAgICgweDMyRTQsICdNJywgdSfjg4onKSwKICAgICgweDMyRTUsICdNJywgdSfjg4snKSwKICAgICgweDMyRTYsICdNJywgdSfjg4wnKSwKICAgICgweDMyRTcsICdNJywgdSfjg40nKSwKICAgICgweDMyRTgsICdNJywgdSfjg44nKSwKICAgICgweDMyRTksICdNJywgdSfjg48nKSwKICAgICgweDMyRUEsICdNJywgdSfjg5InKSwKICAgICgweDMyRUIsICdNJywgdSfjg5UnKSwKICAgICgweDMyRUMsICdNJywgdSfjg5gnKSwKICAgICgweDMyRUQsICdNJywgdSfjg5snKSwKICAgICgweDMyRUUsICdNJywgdSfjg54nKSwKICAgICgweDMyRUYsICdNJywgdSfjg58nKSwKICAgICgweDMyRjAsICdNJywgdSfjg6AnKSwKICAgICgweDMyRjEsICdNJywgdSfjg6EnKSwKICAgICgweDMyRjIsICdNJywgdSfjg6InKSwKICAgICgweDMyRjMsICdNJywgdSfjg6QnKSwKICAgICgweDMyRjQsICdNJywgdSfjg6YnKSwKICAgICgweDMyRjUsICdNJywgdSfjg6gnKSwKICAgICgweDMyRjYsICdNJywgdSfjg6knKSwKICAgICgweDMyRjcsICdNJywgdSfjg6onKSwKICAgICgweDMyRjgsICdNJywgdSfjg6snKSwKICAgICgweDMyRjksICdNJywgdSfjg6wnKSwKICAgICgweDMyRkEsICdNJywgdSfjg60nKSwKICAgICgweDMyRkIsICdNJywgdSfjg68nKSwKICAgICgweDMyRkMsICdNJywgdSfjg7AnKSwKICAgICgweDMyRkQsICdNJywgdSfjg7EnKSwKICAgICgweDMyRkUsICdNJywgdSfjg7InKSwKICAgICgweDMyRkYsICdYJyksCiAgICAoMHgzMzAwLCAnTScsIHUn44Ki44OR44O844OIJyksCiAgICAoMHgzMzAxLCAnTScsIHUn44Ki44Or44OV44KhJyksCiAgICAoMHgzMzAyLCAnTScsIHUn44Ki44Oz44Oa44KiJyksCiAgICAoMHgzMzAzLCAnTScsIHUn44Ki44O844OrJyksCiAgICAoMHgzMzA0LCAnTScsIHUn44Kk44OL44Oz44KwJyksCiAgICAoMHgzMzA1LCAnTScsIHUn44Kk44Oz44OBJyksCiAgICAoMHgzMzA2LCAnTScsIHUn44Km44Kp44OzJyksCiAgICAoMHgzMzA3LCAnTScsIHUn44Ko44K544Kv44O844OJJyksCiAgICAoMHgzMzA4LCAnTScsIHUn44Ko44O844Kr44O8JyksCiAgICAoMHgzMzA5LCAnTScsIHUn44Kq44Oz44K5JyksCiAgICAoMHgzMzBBLCAnTScsIHUn44Kq44O844OgJyksCiAgICAoMHgzMzBCLCAnTScsIHUn44Kr44Kk44OqJyksCiAgICAoMHgzMzBDLCAnTScsIHUn44Kr44Op44OD44OIJyksCiAgICAoMHgzMzBELCAnTScsIHUn44Kr44Ot44Oq44O8JyksCiAgICAoMHgzMzBFLCAnTScsIHUn44Ks44Ot44OzJyksCiAgICAoMHgzMzBGLCAnTScsIHUn44Ks44Oz44OeJyksCiAgICAoMHgzMzEwLCAnTScsIHUn44Ku44KsJyksCiAgICAoMHgzMzExLCAnTScsIHUn44Ku44OL44O8JyksCiAgICAoMHgzMzEyLCAnTScsIHUn44Kt44Ol44Oq44O8JyksCiAgICAoMHgzMzEzLCAnTScsIHUn44Ku44Or44OA44O8JyksCiAgICAoMHgzMzE0LCAnTScsIHUn44Kt44OtJyksCiAgICAoMHgzMzE1LCAnTScsIHUn44Kt44Ot44Kw44Op44OgJyksCiAgICAoMHgzMzE2LCAnTScsIHUn44Kt44Ot44Oh44O844OI44OrJyksCiAgICAoMHgzMzE3LCAnTScsIHUn44Kt44Ot44Ov44OD44OIJyksCiAgICAoMHgzMzE4LCAnTScsIHUn44Kw44Op44OgJyksCiAgICAoMHgzMzE5LCAnTScsIHUn44Kw44Op44Og44OI44OzJyksCiAgICAoMHgzMzFBLCAnTScsIHUn44Kv44Or44K844Kk44OtJyksCiAgICAoMHgzMzFCLCAnTScsIHUn44Kv44Ot44O844ONJyksCiAgICAoMHgzMzFDLCAnTScsIHUn44Kx44O844K5JyksCiAgICAoMHgzMzFELCAnTScsIHUn44Kz44Or44OKJyksCiAgICAoMHgzMzFFLCAnTScsIHUn44Kz44O844OdJyksCiAgICAoMHgzMzFGLCAnTScsIHUn44K144Kk44Kv44OrJyksCiAgICAoMHgzMzIwLCAnTScsIHUn44K144Oz44OB44O844OgJyksCiAgICAoMHgzMzIxLCAnTScsIHUn44K344Oq44Oz44KwJyksCiAgICAoMHgzMzIyLCAnTScsIHUn44K744Oz44OBJyksCiAgICAoMHgzMzIzLCAnTScsIHUn44K744Oz44OIJyksCiAgICAoMHgzMzI0LCAnTScsIHUn44OA44O844K5JyksCiAgICAoMHgzMzI1LCAnTScsIHUn44OH44K3JyksCiAgICAoMHgzMzI2LCAnTScsIHUn44OJ44OrJyksCiAgICAoMHgzMzI3LCAnTScsIHUn44OI44OzJyksCiAgICAoMHgzMzI4LCAnTScsIHUn44OK44OOJyksCiAgICAoMHgzMzI5LCAnTScsIHUn44OO44OD44OIJyksCiAgICAoMHgzMzJBLCAnTScsIHUn44OP44Kk44OEJyksCiAgICAoMHgzMzJCLCAnTScsIHUn44OR44O844K744Oz44OIJyksCiAgICAoMHgzMzJDLCAnTScsIHUn44OR44O844OEJyksCiAgICAoMHgzMzJELCAnTScsIHUn44OQ44O844Os44OrJyksCiAgICAoMHgzMzJFLCAnTScsIHUn44OU44Ki44K544OI44OrJyksCiAgICAoMHgzMzJGLCAnTScsIHUn44OU44Kv44OrJyksCiAgICAoMHgzMzMwLCAnTScsIHUn44OU44KzJyksCiAgICAoMHgzMzMxLCAnTScsIHUn44OT44OrJyksCiAgICAoMHgzMzMyLCAnTScsIHUn44OV44Kh44Op44OD44OJJyksCiAgICAoMHgzMzMzLCAnTScsIHUn44OV44Kj44O844OIJyksCiAgICAoMHgzMzM0LCAnTScsIHUn44OW44OD44K344Kn44OrJyksCiAgICAoMHgzMzM1LCAnTScsIHUn44OV44Op44OzJyksCiAgICAoMHgzMzM2LCAnTScsIHUn44OY44Kv44K/44O844OrJyksCiAgICAoMHgzMzM3LCAnTScsIHUn44Oa44K9JyksCiAgICBdCgpkZWYgX3NlZ18zMygpOgogICAgcmV0dXJuIFsKICAgICgweDMzMzgsICdNJywgdSfjg5rjg4vjg5InKSwKICAgICgweDMzMzksICdNJywgdSfjg5jjg6vjg4QnKSwKICAgICgweDMzM0EsICdNJywgdSfjg5rjg7PjgrknKSwKICAgICgweDMzM0IsICdNJywgdSfjg5rjg7zjgrgnKSwKICAgICgweDMzM0MsICdNJywgdSfjg5njg7zjgr8nKSwKICAgICgweDMzM0QsICdNJywgdSfjg53jgqTjg7Pjg4gnKSwKICAgICgweDMzM0UsICdNJywgdSfjg5zjg6vjg4gnKSwKICAgICgweDMzM0YsICdNJywgdSfjg5vjg7MnKSwKICAgICgweDMzNDAsICdNJywgdSfjg53jg7Pjg4knKSwKICAgICgweDMzNDEsICdNJywgdSfjg5vjg7zjg6snKSwKICAgICgweDMzNDIsICdNJywgdSfjg5vjg7zjg7MnKSwKICAgICgweDMzNDMsICdNJywgdSfjg57jgqTjgq/jg60nKSwKICAgICgweDMzNDQsICdNJywgdSfjg57jgqTjg6snKSwKICAgICgweDMzNDUsICdNJywgdSfjg57jg4Pjg48nKSwKICAgICgweDMzNDYsICdNJywgdSfjg57jg6vjgq8nKSwKICAgICgweDMzNDcsICdNJywgdSfjg57jg7Pjgrfjg6fjg7MnKSwKICAgICgweDMzNDgsICdNJywgdSfjg5/jgq/jg63jg7MnKSwKICAgICgweDMzNDksICdNJywgdSfjg5/jg6onKSwKICAgICgweDMzNEEsICdNJywgdSfjg5/jg6rjg5Djg7zjg6snKSwKICAgICgweDMzNEIsICdNJywgdSfjg6HjgqwnKSwKICAgICgweDMzNEMsICdNJywgdSfjg6Hjgqzjg4jjg7MnKSwKICAgICgweDMzNEQsICdNJywgdSfjg6Hjg7zjg4jjg6snKSwKICAgICgweDMzNEUsICdNJywgdSfjg6Tjg7zjg4knKSwKICAgICgweDMzNEYsICdNJywgdSfjg6Tjg7zjg6snKSwKICAgICgweDMzNTAsICdNJywgdSfjg6bjgqLjg7MnKSwKICAgICgweDMzNTEsICdNJywgdSfjg6rjg4Pjg4jjg6snKSwKICAgICgweDMzNTIsICdNJywgdSfjg6rjg6knKSwKICAgICgweDMzNTMsICdNJywgdSfjg6vjg5Tjg7wnKSwKICAgICgweDMzNTQsICdNJywgdSfjg6vjg7zjg5bjg6snKSwKICAgICgweDMzNTUsICdNJywgdSfjg6zjg6AnKSwKICAgICgweDMzNTYsICdNJywgdSfjg6zjg7Pjg4jjgrLjg7MnKSwKICAgICgweDMzNTcsICdNJywgdSfjg6/jg4Pjg4gnKSwKICAgICgweDMzNTgsICdNJywgdScw54K5JyksCiAgICAoMHgzMzU5LCAnTScsIHUnMeeCuScpLAogICAgKDB4MzM1QSwgJ00nLCB1JzLngrknKSwKICAgICgweDMzNUIsICdNJywgdScz54K5JyksCiAgICAoMHgzMzVDLCAnTScsIHUnNOeCuScpLAogICAgKDB4MzM1RCwgJ00nLCB1JzXngrknKSwKICAgICgweDMzNUUsICdNJywgdSc254K5JyksCiAgICAoMHgzMzVGLCAnTScsIHUnN+eCuScpLAogICAgKDB4MzM2MCwgJ00nLCB1JzjngrknKSwKICAgICgweDMzNjEsICdNJywgdSc554K5JyksCiAgICAoMHgzMzYyLCAnTScsIHUnMTDngrknKSwKICAgICgweDMzNjMsICdNJywgdScxMeeCuScpLAogICAgKDB4MzM2NCwgJ00nLCB1JzEy54K5JyksCiAgICAoMHgzMzY1LCAnTScsIHUnMTPngrknKSwKICAgICgweDMzNjYsICdNJywgdScxNOeCuScpLAogICAgKDB4MzM2NywgJ00nLCB1JzE154K5JyksCiAgICAoMHgzMzY4LCAnTScsIHUnMTbngrknKSwKICAgICgweDMzNjksICdNJywgdScxN+eCuScpLAogICAgKDB4MzM2QSwgJ00nLCB1JzE454K5JyksCiAgICAoMHgzMzZCLCAnTScsIHUnMTnngrknKSwKICAgICgweDMzNkMsICdNJywgdScyMOeCuScpLAogICAgKDB4MzM2RCwgJ00nLCB1JzIx54K5JyksCiAgICAoMHgzMzZFLCAnTScsIHUnMjLngrknKSwKICAgICgweDMzNkYsICdNJywgdScyM+eCuScpLAogICAgKDB4MzM3MCwgJ00nLCB1JzI054K5JyksCiAgICAoMHgzMzcxLCAnTScsIHUnaHBhJyksCiAgICAoMHgzMzcyLCAnTScsIHUnZGEnKSwKICAgICgweDMzNzMsICdNJywgdSdhdScpLAogICAgKDB4MzM3NCwgJ00nLCB1J2JhcicpLAogICAgKDB4MzM3NSwgJ00nLCB1J292JyksCiAgICAoMHgzMzc2LCAnTScsIHUncGMnKSwKICAgICgweDMzNzcsICdNJywgdSdkbScpLAogICAgKDB4MzM3OCwgJ00nLCB1J2RtMicpLAogICAgKDB4MzM3OSwgJ00nLCB1J2RtMycpLAogICAgKDB4MzM3QSwgJ00nLCB1J2l1JyksCiAgICAoMHgzMzdCLCAnTScsIHUn5bmz5oiQJyksCiAgICAoMHgzMzdDLCAnTScsIHUn5pit5ZKMJyksCiAgICAoMHgzMzdELCAnTScsIHUn5aSn5q2jJyksCiAgICAoMHgzMzdFLCAnTScsIHUn5piO5rK7JyksCiAgICAoMHgzMzdGLCAnTScsIHUn5qCq5byP5Lya56S+JyksCiAgICAoMHgzMzgwLCAnTScsIHUncGEnKSwKICAgICgweDMzODEsICdNJywgdSduYScpLAogICAgKDB4MzM4MiwgJ00nLCB1J868YScpLAogICAgKDB4MzM4MywgJ00nLCB1J21hJyksCiAgICAoMHgzMzg0LCAnTScsIHUna2EnKSwKICAgICgweDMzODUsICdNJywgdSdrYicpLAogICAgKDB4MzM4NiwgJ00nLCB1J21iJyksCiAgICAoMHgzMzg3LCAnTScsIHUnZ2InKSwKICAgICgweDMzODgsICdNJywgdSdjYWwnKSwKICAgICgweDMzODksICdNJywgdSdrY2FsJyksCiAgICAoMHgzMzhBLCAnTScsIHUncGYnKSwKICAgICgweDMzOEIsICdNJywgdSduZicpLAogICAgKDB4MzM4QywgJ00nLCB1J868ZicpLAogICAgKDB4MzM4RCwgJ00nLCB1J868ZycpLAogICAgKDB4MzM4RSwgJ00nLCB1J21nJyksCiAgICAoMHgzMzhGLCAnTScsIHUna2cnKSwKICAgICgweDMzOTAsICdNJywgdSdoeicpLAogICAgKDB4MzM5MSwgJ00nLCB1J2toeicpLAogICAgKDB4MzM5MiwgJ00nLCB1J21oeicpLAogICAgKDB4MzM5MywgJ00nLCB1J2doeicpLAogICAgKDB4MzM5NCwgJ00nLCB1J3RoeicpLAogICAgKDB4MzM5NSwgJ00nLCB1J868bCcpLAogICAgKDB4MzM5NiwgJ00nLCB1J21sJyksCiAgICAoMHgzMzk3LCAnTScsIHUnZGwnKSwKICAgICgweDMzOTgsICdNJywgdSdrbCcpLAogICAgKDB4MzM5OSwgJ00nLCB1J2ZtJyksCiAgICAoMHgzMzlBLCAnTScsIHUnbm0nKSwKICAgICgweDMzOUIsICdNJywgdSfOvG0nKSwKICAgIF0KCmRlZiBfc2VnXzM0KCk6CiAgICByZXR1cm4gWwogICAgKDB4MzM5QywgJ00nLCB1J21tJyksCiAgICAoMHgzMzlELCAnTScsIHUnY20nKSwKICAgICgweDMzOUUsICdNJywgdSdrbScpLAogICAgKDB4MzM5RiwgJ00nLCB1J21tMicpLAogICAgKDB4MzNBMCwgJ00nLCB1J2NtMicpLAogICAgKDB4MzNBMSwgJ00nLCB1J20yJyksCiAgICAoMHgzM0EyLCAnTScsIHUna20yJyksCiAgICAoMHgzM0EzLCAnTScsIHUnbW0zJyksCiAgICAoMHgzM0E0LCAnTScsIHUnY20zJyksCiAgICAoMHgzM0E1LCAnTScsIHUnbTMnKSwKICAgICgweDMzQTYsICdNJywgdSdrbTMnKSwKICAgICgweDMzQTcsICdNJywgdSdt4oiVcycpLAogICAgKDB4MzNBOCwgJ00nLCB1J23iiJVzMicpLAogICAgKDB4MzNBOSwgJ00nLCB1J3BhJyksCiAgICAoMHgzM0FBLCAnTScsIHUna3BhJyksCiAgICAoMHgzM0FCLCAnTScsIHUnbXBhJyksCiAgICAoMHgzM0FDLCAnTScsIHUnZ3BhJyksCiAgICAoMHgzM0FELCAnTScsIHUncmFkJyksCiAgICAoMHgzM0FFLCAnTScsIHUncmFk4oiVcycpLAogICAgKDB4MzNBRiwgJ00nLCB1J3JhZOKIlXMyJyksCiAgICAoMHgzM0IwLCAnTScsIHUncHMnKSwKICAgICgweDMzQjEsICdNJywgdSducycpLAogICAgKDB4MzNCMiwgJ00nLCB1J868cycpLAogICAgKDB4MzNCMywgJ00nLCB1J21zJyksCiAgICAoMHgzM0I0LCAnTScsIHUncHYnKSwKICAgICgweDMzQjUsICdNJywgdSdudicpLAogICAgKDB4MzNCNiwgJ00nLCB1J868dicpLAogICAgKDB4MzNCNywgJ00nLCB1J212JyksCiAgICAoMHgzM0I4LCAnTScsIHUna3YnKSwKICAgICgweDMzQjksICdNJywgdSdtdicpLAogICAgKDB4MzNCQSwgJ00nLCB1J3B3JyksCiAgICAoMHgzM0JCLCAnTScsIHUnbncnKSwKICAgICgweDMzQkMsICdNJywgdSfOvHcnKSwKICAgICgweDMzQkQsICdNJywgdSdtdycpLAogICAgKDB4MzNCRSwgJ00nLCB1J2t3JyksCiAgICAoMHgzM0JGLCAnTScsIHUnbXcnKSwKICAgICgweDMzQzAsICdNJywgdSdrz4knKSwKICAgICgweDMzQzEsICdNJywgdSdtz4knKSwKICAgICgweDMzQzIsICdYJyksCiAgICAoMHgzM0MzLCAnTScsIHUnYnEnKSwKICAgICgweDMzQzQsICdNJywgdSdjYycpLAogICAgKDB4MzNDNSwgJ00nLCB1J2NkJyksCiAgICAoMHgzM0M2LCAnTScsIHUnY+KIlWtnJyksCiAgICAoMHgzM0M3LCAnWCcpLAogICAgKDB4MzNDOCwgJ00nLCB1J2RiJyksCiAgICAoMHgzM0M5LCAnTScsIHUnZ3knKSwKICAgICgweDMzQ0EsICdNJywgdSdoYScpLAogICAgKDB4MzNDQiwgJ00nLCB1J2hwJyksCiAgICAoMHgzM0NDLCAnTScsIHUnaW4nKSwKICAgICgweDMzQ0QsICdNJywgdSdraycpLAogICAgKDB4MzNDRSwgJ00nLCB1J2ttJyksCiAgICAoMHgzM0NGLCAnTScsIHUna3QnKSwKICAgICgweDMzRDAsICdNJywgdSdsbScpLAogICAgKDB4MzNEMSwgJ00nLCB1J2xuJyksCiAgICAoMHgzM0QyLCAnTScsIHUnbG9nJyksCiAgICAoMHgzM0QzLCAnTScsIHUnbHgnKSwKICAgICgweDMzRDQsICdNJywgdSdtYicpLAogICAgKDB4MzNENSwgJ00nLCB1J21pbCcpLAogICAgKDB4MzNENiwgJ00nLCB1J21vbCcpLAogICAgKDB4MzNENywgJ00nLCB1J3BoJyksCiAgICAoMHgzM0Q4LCAnWCcpLAogICAgKDB4MzNEOSwgJ00nLCB1J3BwbScpLAogICAgKDB4MzNEQSwgJ00nLCB1J3ByJyksCiAgICAoMHgzM0RCLCAnTScsIHUnc3InKSwKICAgICgweDMzREMsICdNJywgdSdzdicpLAogICAgKDB4MzNERCwgJ00nLCB1J3diJyksCiAgICAoMHgzM0RFLCAnTScsIHUnduKIlW0nKSwKICAgICgweDMzREYsICdNJywgdSdh4oiVbScpLAogICAgKDB4MzNFMCwgJ00nLCB1JzHml6UnKSwKICAgICgweDMzRTEsICdNJywgdScy5pelJyksCiAgICAoMHgzM0UyLCAnTScsIHUnM+aXpScpLAogICAgKDB4MzNFMywgJ00nLCB1JzTml6UnKSwKICAgICgweDMzRTQsICdNJywgdSc15pelJyksCiAgICAoMHgzM0U1LCAnTScsIHUnNuaXpScpLAogICAgKDB4MzNFNiwgJ00nLCB1Jzfml6UnKSwKICAgICgweDMzRTcsICdNJywgdSc45pelJyksCiAgICAoMHgzM0U4LCAnTScsIHUnOeaXpScpLAogICAgKDB4MzNFOSwgJ00nLCB1JzEw5pelJyksCiAgICAoMHgzM0VBLCAnTScsIHUnMTHml6UnKSwKICAgICgweDMzRUIsICdNJywgdScxMuaXpScpLAogICAgKDB4MzNFQywgJ00nLCB1JzEz5pelJyksCiAgICAoMHgzM0VELCAnTScsIHUnMTTml6UnKSwKICAgICgweDMzRUUsICdNJywgdScxNeaXpScpLAogICAgKDB4MzNFRiwgJ00nLCB1JzE25pelJyksCiAgICAoMHgzM0YwLCAnTScsIHUnMTfml6UnKSwKICAgICgweDMzRjEsICdNJywgdScxOOaXpScpLAogICAgKDB4MzNGMiwgJ00nLCB1JzE55pelJyksCiAgICAoMHgzM0YzLCAnTScsIHUnMjDml6UnKSwKICAgICgweDMzRjQsICdNJywgdScyMeaXpScpLAogICAgKDB4MzNGNSwgJ00nLCB1JzIy5pelJyksCiAgICAoMHgzM0Y2LCAnTScsIHUnMjPml6UnKSwKICAgICgweDMzRjcsICdNJywgdScyNOaXpScpLAogICAgKDB4MzNGOCwgJ00nLCB1JzI15pelJyksCiAgICAoMHgzM0Y5LCAnTScsIHUnMjbml6UnKSwKICAgICgweDMzRkEsICdNJywgdScyN+aXpScpLAogICAgKDB4MzNGQiwgJ00nLCB1JzI45pelJyksCiAgICAoMHgzM0ZDLCAnTScsIHUnMjnml6UnKSwKICAgICgweDMzRkQsICdNJywgdSczMOaXpScpLAogICAgKDB4MzNGRSwgJ00nLCB1JzMx5pelJyksCiAgICAoMHgzM0ZGLCAnTScsIHUnZ2FsJyksCiAgICBdCgpkZWYgX3NlZ18zNSgpOgogICAgcmV0dXJuIFsKICAgICgweDM0MDAsICdWJyksCiAgICAoMHg0REI2LCAnWCcpLAogICAgKDB4NERDMCwgJ1YnKSwKICAgICgweDlGQ0QsICdYJyksCiAgICAoMHhBMDAwLCAnVicpLAogICAgKDB4QTQ4RCwgJ1gnKSwKICAgICgweEE0OTAsICdWJyksCiAgICAoMHhBNEM3LCAnWCcpLAogICAgKDB4QTREMCwgJ1YnKSwKICAgICgweEE2MkMsICdYJyksCiAgICAoMHhBNjQwLCAnTScsIHUn6pmBJyksCiAgICAoMHhBNjQxLCAnVicpLAogICAgKDB4QTY0MiwgJ00nLCB1J+qZgycpLAogICAgKDB4QTY0MywgJ1YnKSwKICAgICgweEE2NDQsICdNJywgdSfqmYUnKSwKICAgICgweEE2NDUsICdWJyksCiAgICAoMHhBNjQ2LCAnTScsIHUn6pmHJyksCiAgICAoMHhBNjQ3LCAnVicpLAogICAgKDB4QTY0OCwgJ00nLCB1J+qZiScpLAogICAgKDB4QTY0OSwgJ1YnKSwKICAgICgweEE2NEEsICdNJywgdSfqmYsnKSwKICAgICgweEE2NEIsICdWJyksCiAgICAoMHhBNjRDLCAnTScsIHUn6pmNJyksCiAgICAoMHhBNjRELCAnVicpLAogICAgKDB4QTY0RSwgJ00nLCB1J+qZjycpLAogICAgKDB4QTY0RiwgJ1YnKSwKICAgICgweEE2NTAsICdNJywgdSfqmZEnKSwKICAgICgweEE2NTEsICdWJyksCiAgICAoMHhBNjUyLCAnTScsIHUn6pmTJyksCiAgICAoMHhBNjUzLCAnVicpLAogICAgKDB4QTY1NCwgJ00nLCB1J+qZlScpLAogICAgKDB4QTY1NSwgJ1YnKSwKICAgICgweEE2NTYsICdNJywgdSfqmZcnKSwKICAgICgweEE2NTcsICdWJyksCiAgICAoMHhBNjU4LCAnTScsIHUn6pmZJyksCiAgICAoMHhBNjU5LCAnVicpLAogICAgKDB4QTY1QSwgJ00nLCB1J+qZmycpLAogICAgKDB4QTY1QiwgJ1YnKSwKICAgICgweEE2NUMsICdNJywgdSfqmZ0nKSwKICAgICgweEE2NUQsICdWJyksCiAgICAoMHhBNjVFLCAnTScsIHUn6pmfJyksCiAgICAoMHhBNjVGLCAnVicpLAogICAgKDB4QTY2MCwgJ00nLCB1J+qZoScpLAogICAgKDB4QTY2MSwgJ1YnKSwKICAgICgweEE2NjIsICdNJywgdSfqmaMnKSwKICAgICgweEE2NjMsICdWJyksCiAgICAoMHhBNjY0LCAnTScsIHUn6pmlJyksCiAgICAoMHhBNjY1LCAnVicpLAogICAgKDB4QTY2NiwgJ00nLCB1J+qZpycpLAogICAgKDB4QTY2NywgJ1YnKSwKICAgICgweEE2NjgsICdNJywgdSfqmaknKSwKICAgICgweEE2NjksICdWJyksCiAgICAoMHhBNjZBLCAnTScsIHUn6pmrJyksCiAgICAoMHhBNjZCLCAnVicpLAogICAgKDB4QTY2QywgJ00nLCB1J+qZrScpLAogICAgKDB4QTY2RCwgJ1YnKSwKICAgICgweEE2ODAsICdNJywgdSfqmoEnKSwKICAgICgweEE2ODEsICdWJyksCiAgICAoMHhBNjgyLCAnTScsIHUn6pqDJyksCiAgICAoMHhBNjgzLCAnVicpLAogICAgKDB4QTY4NCwgJ00nLCB1J+qahScpLAogICAgKDB4QTY4NSwgJ1YnKSwKICAgICgweEE2ODYsICdNJywgdSfqmocnKSwKICAgICgweEE2ODcsICdWJyksCiAgICAoMHhBNjg4LCAnTScsIHUn6pqJJyksCiAgICAoMHhBNjg5LCAnVicpLAogICAgKDB4QTY4QSwgJ00nLCB1J+qaiycpLAogICAgKDB4QTY4QiwgJ1YnKSwKICAgICgweEE2OEMsICdNJywgdSfqmo0nKSwKICAgICgweEE2OEQsICdWJyksCiAgICAoMHhBNjhFLCAnTScsIHUn6pqPJyksCiAgICAoMHhBNjhGLCAnVicpLAogICAgKDB4QTY5MCwgJ00nLCB1J+qakScpLAogICAgKDB4QTY5MSwgJ1YnKSwKICAgICgweEE2OTIsICdNJywgdSfqmpMnKSwKICAgICgweEE2OTMsICdWJyksCiAgICAoMHhBNjk0LCAnTScsIHUn6pqVJyksCiAgICAoMHhBNjk1LCAnVicpLAogICAgKDB4QTY5NiwgJ00nLCB1J+qalycpLAogICAgKDB4QTY5NywgJ1YnKSwKICAgICgweEE2OTgsICdYJyksCiAgICAoMHhBNjlGLCAnVicpLAogICAgKDB4QTZGOCwgJ1gnKSwKICAgICgweEE3MDAsICdWJyksCiAgICAoMHhBNzIyLCAnTScsIHUn6pyjJyksCiAgICAoMHhBNzIzLCAnVicpLAogICAgKDB4QTcyNCwgJ00nLCB1J+qcpScpLAogICAgKDB4QTcyNSwgJ1YnKSwKICAgICgweEE3MjYsICdNJywgdSfqnKcnKSwKICAgICgweEE3MjcsICdWJyksCiAgICAoMHhBNzI4LCAnTScsIHUn6pypJyksCiAgICAoMHhBNzI5LCAnVicpLAogICAgKDB4QTcyQSwgJ00nLCB1J+qcqycpLAogICAgKDB4QTcyQiwgJ1YnKSwKICAgICgweEE3MkMsICdNJywgdSfqnK0nKSwKICAgICgweEE3MkQsICdWJyksCiAgICAoMHhBNzJFLCAnTScsIHUn6pyvJyksCiAgICAoMHhBNzJGLCAnVicpLAogICAgKDB4QTczMiwgJ00nLCB1J+qcsycpLAogICAgKDB4QTczMywgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzM2KCk6CiAgICByZXR1cm4gWwogICAgKDB4QTczNCwgJ00nLCB1J+qctScpLAogICAgKDB4QTczNSwgJ1YnKSwKICAgICgweEE3MzYsICdNJywgdSfqnLcnKSwKICAgICgweEE3MzcsICdWJyksCiAgICAoMHhBNzM4LCAnTScsIHUn6py5JyksCiAgICAoMHhBNzM5LCAnVicpLAogICAgKDB4QTczQSwgJ00nLCB1J+qcuycpLAogICAgKDB4QTczQiwgJ1YnKSwKICAgICgweEE3M0MsICdNJywgdSfqnL0nKSwKICAgICgweEE3M0QsICdWJyksCiAgICAoMHhBNzNFLCAnTScsIHUn6py/JyksCiAgICAoMHhBNzNGLCAnVicpLAogICAgKDB4QTc0MCwgJ00nLCB1J+qdgScpLAogICAgKDB4QTc0MSwgJ1YnKSwKICAgICgweEE3NDIsICdNJywgdSfqnYMnKSwKICAgICgweEE3NDMsICdWJyksCiAgICAoMHhBNzQ0LCAnTScsIHUn6p2FJyksCiAgICAoMHhBNzQ1LCAnVicpLAogICAgKDB4QTc0NiwgJ00nLCB1J+qdhycpLAogICAgKDB4QTc0NywgJ1YnKSwKICAgICgweEE3NDgsICdNJywgdSfqnYknKSwKICAgICgweEE3NDksICdWJyksCiAgICAoMHhBNzRBLCAnTScsIHUn6p2LJyksCiAgICAoMHhBNzRCLCAnVicpLAogICAgKDB4QTc0QywgJ00nLCB1J+qdjScpLAogICAgKDB4QTc0RCwgJ1YnKSwKICAgICgweEE3NEUsICdNJywgdSfqnY8nKSwKICAgICgweEE3NEYsICdWJyksCiAgICAoMHhBNzUwLCAnTScsIHUn6p2RJyksCiAgICAoMHhBNzUxLCAnVicpLAogICAgKDB4QTc1MiwgJ00nLCB1J+qdkycpLAogICAgKDB4QTc1MywgJ1YnKSwKICAgICgweEE3NTQsICdNJywgdSfqnZUnKSwKICAgICgweEE3NTUsICdWJyksCiAgICAoMHhBNzU2LCAnTScsIHUn6p2XJyksCiAgICAoMHhBNzU3LCAnVicpLAogICAgKDB4QTc1OCwgJ00nLCB1J+qdmScpLAogICAgKDB4QTc1OSwgJ1YnKSwKICAgICgweEE3NUEsICdNJywgdSfqnZsnKSwKICAgICgweEE3NUIsICdWJyksCiAgICAoMHhBNzVDLCAnTScsIHUn6p2dJyksCiAgICAoMHhBNzVELCAnVicpLAogICAgKDB4QTc1RSwgJ00nLCB1J+qdnycpLAogICAgKDB4QTc1RiwgJ1YnKSwKICAgICgweEE3NjAsICdNJywgdSfqnaEnKSwKICAgICgweEE3NjEsICdWJyksCiAgICAoMHhBNzYyLCAnTScsIHUn6p2jJyksCiAgICAoMHhBNzYzLCAnVicpLAogICAgKDB4QTc2NCwgJ00nLCB1J+qdpScpLAogICAgKDB4QTc2NSwgJ1YnKSwKICAgICgweEE3NjYsICdNJywgdSfqnacnKSwKICAgICgweEE3NjcsICdWJyksCiAgICAoMHhBNzY4LCAnTScsIHUn6p2pJyksCiAgICAoMHhBNzY5LCAnVicpLAogICAgKDB4QTc2QSwgJ00nLCB1J+qdqycpLAogICAgKDB4QTc2QiwgJ1YnKSwKICAgICgweEE3NkMsICdNJywgdSfqna0nKSwKICAgICgweEE3NkQsICdWJyksCiAgICAoMHhBNzZFLCAnTScsIHUn6p2vJyksCiAgICAoMHhBNzZGLCAnVicpLAogICAgKDB4QTc3MCwgJ00nLCB1J+qdrycpLAogICAgKDB4QTc3MSwgJ1YnKSwKICAgICgweEE3NzksICdNJywgdSfqnbonKSwKICAgICgweEE3N0EsICdWJyksCiAgICAoMHhBNzdCLCAnTScsIHUn6p28JyksCiAgICAoMHhBNzdDLCAnVicpLAogICAgKDB4QTc3RCwgJ00nLCB1J+G1uScpLAogICAgKDB4QTc3RSwgJ00nLCB1J+qdvycpLAogICAgKDB4QTc3RiwgJ1YnKSwKICAgICgweEE3ODAsICdNJywgdSfqnoEnKSwKICAgICgweEE3ODEsICdWJyksCiAgICAoMHhBNzgyLCAnTScsIHUn6p6DJyksCiAgICAoMHhBNzgzLCAnVicpLAogICAgKDB4QTc4NCwgJ00nLCB1J+qehScpLAogICAgKDB4QTc4NSwgJ1YnKSwKICAgICgweEE3ODYsICdNJywgdSfqnocnKSwKICAgICgweEE3ODcsICdWJyksCiAgICAoMHhBNzhCLCAnTScsIHUn6p6MJyksCiAgICAoMHhBNzhDLCAnVicpLAogICAgKDB4QTc4RCwgJ00nLCB1J8mlJyksCiAgICAoMHhBNzhFLCAnVicpLAogICAgKDB4QTc4RiwgJ1gnKSwKICAgICgweEE3OTAsICdNJywgdSfqnpEnKSwKICAgICgweEE3OTEsICdWJyksCiAgICAoMHhBNzkyLCAnTScsIHUn6p6TJyksCiAgICAoMHhBNzkzLCAnVicpLAogICAgKDB4QTc5NCwgJ1gnKSwKICAgICgweEE3QTAsICdNJywgdSfqnqEnKSwKICAgICgweEE3QTEsICdWJyksCiAgICAoMHhBN0EyLCAnTScsIHUn6p6jJyksCiAgICAoMHhBN0EzLCAnVicpLAogICAgKDB4QTdBNCwgJ00nLCB1J+qepScpLAogICAgKDB4QTdBNSwgJ1YnKSwKICAgICgweEE3QTYsICdNJywgdSfqnqcnKSwKICAgICgweEE3QTcsICdWJyksCiAgICAoMHhBN0E4LCAnTScsIHUn6p6pJyksCiAgICAoMHhBN0E5LCAnVicpLAogICAgKDB4QTdBQSwgJ00nLCB1J8mmJyksCiAgICAoMHhBN0FCLCAnWCcpLAogICAgKDB4QTdGOCwgJ00nLCB1J8SnJyksCiAgICBdCgpkZWYgX3NlZ18zNygpOgogICAgcmV0dXJuIFsKICAgICgweEE3RjksICdNJywgdSfFkycpLAogICAgKDB4QTdGQSwgJ1YnKSwKICAgICgweEE4MkMsICdYJyksCiAgICAoMHhBODMwLCAnVicpLAogICAgKDB4QTgzQSwgJ1gnKSwKICAgICgweEE4NDAsICdWJyksCiAgICAoMHhBODc4LCAnWCcpLAogICAgKDB4QTg4MCwgJ1YnKSwKICAgICgweEE4QzUsICdYJyksCiAgICAoMHhBOENFLCAnVicpLAogICAgKDB4QThEQSwgJ1gnKSwKICAgICgweEE4RTAsICdWJyksCiAgICAoMHhBOEZDLCAnWCcpLAogICAgKDB4QTkwMCwgJ1YnKSwKICAgICgweEE5NTQsICdYJyksCiAgICAoMHhBOTVGLCAnVicpLAogICAgKDB4QTk3RCwgJ1gnKSwKICAgICgweEE5ODAsICdWJyksCiAgICAoMHhBOUNFLCAnWCcpLAogICAgKDB4QTlDRiwgJ1YnKSwKICAgICgweEE5REEsICdYJyksCiAgICAoMHhBOURFLCAnVicpLAogICAgKDB4QTlFMCwgJ1gnKSwKICAgICgweEFBMDAsICdWJyksCiAgICAoMHhBQTM3LCAnWCcpLAogICAgKDB4QUE0MCwgJ1YnKSwKICAgICgweEFBNEUsICdYJyksCiAgICAoMHhBQTUwLCAnVicpLAogICAgKDB4QUE1QSwgJ1gnKSwKICAgICgweEFBNUMsICdWJyksCiAgICAoMHhBQTdDLCAnWCcpLAogICAgKDB4QUE4MCwgJ1YnKSwKICAgICgweEFBQzMsICdYJyksCiAgICAoMHhBQURCLCAnVicpLAogICAgKDB4QUFGNywgJ1gnKSwKICAgICgweEFCMDEsICdWJyksCiAgICAoMHhBQjA3LCAnWCcpLAogICAgKDB4QUIwOSwgJ1YnKSwKICAgICgweEFCMEYsICdYJyksCiAgICAoMHhBQjExLCAnVicpLAogICAgKDB4QUIxNywgJ1gnKSwKICAgICgweEFCMjAsICdWJyksCiAgICAoMHhBQjI3LCAnWCcpLAogICAgKDB4QUIyOCwgJ1YnKSwKICAgICgweEFCMkYsICdYJyksCiAgICAoMHhBQkMwLCAnVicpLAogICAgKDB4QUJFRSwgJ1gnKSwKICAgICgweEFCRjAsICdWJyksCiAgICAoMHhBQkZBLCAnWCcpLAogICAgKDB4QUMwMCwgJ1YnKSwKICAgICgweEQ3QTQsICdYJyksCiAgICAoMHhEN0IwLCAnVicpLAogICAgKDB4RDdDNywgJ1gnKSwKICAgICgweEQ3Q0IsICdWJyksCiAgICAoMHhEN0ZDLCAnWCcpLAogICAgKDB4RjkwMCwgJ00nLCB1J+ixiCcpLAogICAgKDB4RjkwMSwgJ00nLCB1J+abtCcpLAogICAgKDB4RjkwMiwgJ00nLCB1J+i7iicpLAogICAgKDB4RjkwMywgJ00nLCB1J+iziCcpLAogICAgKDB4RjkwNCwgJ00nLCB1J+a7kScpLAogICAgKDB4RjkwNSwgJ00nLCB1J+S4sicpLAogICAgKDB4RjkwNiwgJ00nLCB1J+WPpScpLAogICAgKDB4RjkwNywgJ00nLCB1J+m+nCcpLAogICAgKDB4RjkwOSwgJ00nLCB1J+WlkScpLAogICAgKDB4RjkwQSwgJ00nLCB1J+mHkScpLAogICAgKDB4RjkwQiwgJ00nLCB1J+WWhycpLAogICAgKDB4RjkwQywgJ00nLCB1J+WliCcpLAogICAgKDB4RjkwRCwgJ00nLCB1J+aHticpLAogICAgKDB4RjkwRSwgJ00nLCB1J+eZqScpLAogICAgKDB4RjkwRiwgJ00nLCB1J+e+hScpLAogICAgKDB4RjkxMCwgJ00nLCB1J+iYvycpLAogICAgKDB4RjkxMSwgJ00nLCB1J+ieuicpLAogICAgKDB4RjkxMiwgJ00nLCB1J+ijuCcpLAogICAgKDB4RjkxMywgJ00nLCB1J+mCjycpLAogICAgKDB4RjkxNCwgJ00nLCB1J+aogicpLAogICAgKDB4RjkxNSwgJ00nLCB1J+a0mycpLAogICAgKDB4RjkxNiwgJ00nLCB1J+eDmScpLAogICAgKDB4RjkxNywgJ00nLCB1J+ePnicpLAogICAgKDB4RjkxOCwgJ00nLCB1J+iQvScpLAogICAgKDB4RjkxOSwgJ00nLCB1J+mFqicpLAogICAgKDB4RjkxQSwgJ00nLCB1J+mnsScpLAogICAgKDB4RjkxQiwgJ00nLCB1J+S6gicpLAogICAgKDB4RjkxQywgJ00nLCB1J+WNtScpLAogICAgKDB4RjkxRCwgJ00nLCB1J+ashCcpLAogICAgKDB4RjkxRSwgJ00nLCB1J+eImycpLAogICAgKDB4RjkxRiwgJ00nLCB1J+iYrScpLAogICAgKDB4RjkyMCwgJ00nLCB1J+m4nicpLAogICAgKDB4RjkyMSwgJ00nLCB1J+W1kCcpLAogICAgKDB4RjkyMiwgJ00nLCB1J+a/qycpLAogICAgKDB4RjkyMywgJ00nLCB1J+iXjScpLAogICAgKDB4RjkyNCwgJ00nLCB1J+ilpCcpLAogICAgKDB4RjkyNSwgJ00nLCB1J+aLiScpLAogICAgKDB4RjkyNiwgJ00nLCB1J+iHmCcpLAogICAgKDB4RjkyNywgJ00nLCB1J+ignycpLAogICAgKDB4RjkyOCwgJ00nLCB1J+W7iicpLAogICAgKDB4RjkyOSwgJ00nLCB1J+aclycpLAogICAgKDB4RjkyQSwgJ00nLCB1J+a1qicpLAogICAgKDB4RjkyQiwgJ00nLCB1J+eLvCcpLAogICAgKDB4RjkyQywgJ00nLCB1J+mDjicpLAogICAgKDB4RjkyRCwgJ00nLCB1J+S+hicpLAogICAgXQoKZGVmIF9zZWdfMzgoKToKICAgIHJldHVybiBbCiAgICAoMHhGOTJFLCAnTScsIHUn5Ya3JyksCiAgICAoMHhGOTJGLCAnTScsIHUn5YueJyksCiAgICAoMHhGOTMwLCAnTScsIHUn5pOEJyksCiAgICAoMHhGOTMxLCAnTScsIHUn5quTJyksCiAgICAoMHhGOTMyLCAnTScsIHUn54iQJyksCiAgICAoMHhGOTMzLCAnTScsIHUn55unJyksCiAgICAoMHhGOTM0LCAnTScsIHUn6ICBJyksCiAgICAoMHhGOTM1LCAnTScsIHUn6JiGJyksCiAgICAoMHhGOTM2LCAnTScsIHUn6JmcJyksCiAgICAoMHhGOTM3LCAnTScsIHUn6LevJyksCiAgICAoMHhGOTM4LCAnTScsIHUn6ZyyJyksCiAgICAoMHhGOTM5LCAnTScsIHUn6a2vJyksCiAgICAoMHhGOTNBLCAnTScsIHUn6be6JyksCiAgICAoMHhGOTNCLCAnTScsIHUn56KMJyksCiAgICAoMHhGOTNDLCAnTScsIHUn56W/JyksCiAgICAoMHhGOTNELCAnTScsIHUn57agJyksCiAgICAoMHhGOTNFLCAnTScsIHUn6I+JJyksCiAgICAoMHhGOTNGLCAnTScsIHUn6YyEJyksCiAgICAoMHhGOTQwLCAnTScsIHUn6bm/JyksCiAgICAoMHhGOTQxLCAnTScsIHUn6KuWJyksCiAgICAoMHhGOTQyLCAnTScsIHUn5aOfJyksCiAgICAoMHhGOTQzLCAnTScsIHUn5byEJyksCiAgICAoMHhGOTQ0LCAnTScsIHUn57GgJyksCiAgICAoMHhGOTQ1LCAnTScsIHUn6IG+JyksCiAgICAoMHhGOTQ2LCAnTScsIHUn54miJyksCiAgICAoMHhGOTQ3LCAnTScsIHUn56OKJyksCiAgICAoMHhGOTQ4LCAnTScsIHUn6LOCJyksCiAgICAoMHhGOTQ5LCAnTScsIHUn6Zu3JyksCiAgICAoMHhGOTRBLCAnTScsIHUn5aOYJyksCiAgICAoMHhGOTRCLCAnTScsIHUn5bGiJyksCiAgICAoMHhGOTRDLCAnTScsIHUn5qiTJyksCiAgICAoMHhGOTRELCAnTScsIHUn5reaJyksCiAgICAoMHhGOTRFLCAnTScsIHUn5ryPJyksCiAgICAoMHhGOTRGLCAnTScsIHUn57SvJyksCiAgICAoMHhGOTUwLCAnTScsIHUn57i3JyksCiAgICAoMHhGOTUxLCAnTScsIHUn6ZmLJyksCiAgICAoMHhGOTUyLCAnTScsIHUn5YuSJyksCiAgICAoMHhGOTUzLCAnTScsIHUn6IKLJyksCiAgICAoMHhGOTU0LCAnTScsIHUn5YecJyksCiAgICAoMHhGOTU1LCAnTScsIHUn5YeMJyksCiAgICAoMHhGOTU2LCAnTScsIHUn56icJyksCiAgICAoMHhGOTU3LCAnTScsIHUn57a+JyksCiAgICAoMHhGOTU4LCAnTScsIHUn6I+xJyksCiAgICAoMHhGOTU5LCAnTScsIHUn6Zm1JyksCiAgICAoMHhGOTVBLCAnTScsIHUn6K6AJyksCiAgICAoMHhGOTVCLCAnTScsIHUn5ouPJyksCiAgICAoMHhGOTVDLCAnTScsIHUn5qiCJyksCiAgICAoMHhGOTVELCAnTScsIHUn6Ku+JyksCiAgICAoMHhGOTVFLCAnTScsIHUn5Li5JyksCiAgICAoMHhGOTVGLCAnTScsIHUn5a+nJyksCiAgICAoMHhGOTYwLCAnTScsIHUn5oCSJyksCiAgICAoMHhGOTYxLCAnTScsIHUn546HJyksCiAgICAoMHhGOTYyLCAnTScsIHUn55WwJyksCiAgICAoMHhGOTYzLCAnTScsIHUn5YyXJyksCiAgICAoMHhGOTY0LCAnTScsIHUn56O7JyksCiAgICAoMHhGOTY1LCAnTScsIHUn5L6/JyksCiAgICAoMHhGOTY2LCAnTScsIHUn5b6pJyksCiAgICAoMHhGOTY3LCAnTScsIHUn5LiNJyksCiAgICAoMHhGOTY4LCAnTScsIHUn5rOMJyksCiAgICAoMHhGOTY5LCAnTScsIHUn5pW4JyksCiAgICAoMHhGOTZBLCAnTScsIHUn57SiJyksCiAgICAoMHhGOTZCLCAnTScsIHUn5Y+DJyksCiAgICAoMHhGOTZDLCAnTScsIHUn5aGeJyksCiAgICAoMHhGOTZELCAnTScsIHUn55yBJyksCiAgICAoMHhGOTZFLCAnTScsIHUn6JGJJyksCiAgICAoMHhGOTZGLCAnTScsIHUn6KqqJyksCiAgICAoMHhGOTcwLCAnTScsIHUn5q66JyksCiAgICAoMHhGOTcxLCAnTScsIHUn6L6wJyksCiAgICAoMHhGOTcyLCAnTScsIHUn5rKIJyksCiAgICAoMHhGOTczLCAnTScsIHUn5ou+JyksCiAgICAoMHhGOTc0LCAnTScsIHUn6IulJyksCiAgICAoMHhGOTc1LCAnTScsIHUn5o6gJyksCiAgICAoMHhGOTc2LCAnTScsIHUn55WlJyksCiAgICAoMHhGOTc3LCAnTScsIHUn5LquJyksCiAgICAoMHhGOTc4LCAnTScsIHUn5YWpJyksCiAgICAoMHhGOTc5LCAnTScsIHUn5YeJJyksCiAgICAoMHhGOTdBLCAnTScsIHUn5qKBJyksCiAgICAoMHhGOTdCLCAnTScsIHUn57OnJyksCiAgICAoMHhGOTdDLCAnTScsIHUn6ImvJyksCiAgICAoMHhGOTdELCAnTScsIHUn6KuSJyksCiAgICAoMHhGOTdFLCAnTScsIHUn6YePJyksCiAgICAoMHhGOTdGLCAnTScsIHUn5Yu1JyksCiAgICAoMHhGOTgwLCAnTScsIHUn5ZGCJyksCiAgICAoMHhGOTgxLCAnTScsIHUn5aWzJyksCiAgICAoMHhGOTgyLCAnTScsIHUn5busJyksCiAgICAoMHhGOTgzLCAnTScsIHUn5peFJyksCiAgICAoMHhGOTg0LCAnTScsIHUn5r++JyksCiAgICAoMHhGOTg1LCAnTScsIHUn56SqJyksCiAgICAoMHhGOTg2LCAnTScsIHUn6ZatJyksCiAgICAoMHhGOTg3LCAnTScsIHUn6amqJyksCiAgICAoMHhGOTg4LCAnTScsIHUn6bqXJyksCiAgICAoMHhGOTg5LCAnTScsIHUn6buOJyksCiAgICAoMHhGOThBLCAnTScsIHUn5YqbJyksCiAgICAoMHhGOThCLCAnTScsIHUn5puGJyksCiAgICAoMHhGOThDLCAnTScsIHUn5q23JyksCiAgICAoMHhGOThELCAnTScsIHUn6L2iJyksCiAgICAoMHhGOThFLCAnTScsIHUn5bm0JyksCiAgICAoMHhGOThGLCAnTScsIHUn5oaQJyksCiAgICAoMHhGOTkwLCAnTScsIHUn5oiAJyksCiAgICAoMHhGOTkxLCAnTScsIHUn5pKaJyksCiAgICBdCgpkZWYgX3NlZ18zOSgpOgogICAgcmV0dXJuIFsKICAgICgweEY5OTIsICdNJywgdSfmvKMnKSwKICAgICgweEY5OTMsICdNJywgdSfnhYknKSwKICAgICgweEY5OTQsICdNJywgdSfnkoknKSwKICAgICgweEY5OTUsICdNJywgdSfnp4onKSwKICAgICgweEY5OTYsICdNJywgdSfnt7QnKSwKICAgICgweEY5OTcsICdNJywgdSfoga8nKSwKICAgICgweEY5OTgsICdNJywgdSfovKYnKSwKICAgICgweEY5OTksICdNJywgdSfok64nKSwKICAgICgweEY5OUEsICdNJywgdSfpgKMnKSwKICAgICgweEY5OUIsICdNJywgdSfpjYonKSwKICAgICgweEY5OUMsICdNJywgdSfliJcnKSwKICAgICgweEY5OUQsICdNJywgdSfliqMnKSwKICAgICgweEY5OUUsICdNJywgdSflkr0nKSwKICAgICgweEY5OUYsICdNJywgdSfng4gnKSwKICAgICgweEY5QTAsICdNJywgdSfoo4InKSwKICAgICgweEY5QTEsICdNJywgdSfoqqonKSwKICAgICgweEY5QTIsICdNJywgdSflu4knKSwKICAgICgweEY5QTMsICdNJywgdSflv7UnKSwKICAgICgweEY5QTQsICdNJywgdSfmjbsnKSwKICAgICgweEY5QTUsICdNJywgdSfmrq4nKSwKICAgICgweEY5QTYsICdNJywgdSfnsL4nKSwKICAgICgweEY5QTcsICdNJywgdSfnjbUnKSwKICAgICgweEY5QTgsICdNJywgdSfku6QnKSwKICAgICgweEY5QTksICdNJywgdSflm7knKSwKICAgICgweEY5QUEsICdNJywgdSflr6cnKSwKICAgICgweEY5QUIsICdNJywgdSfltronKSwKICAgICgweEY5QUMsICdNJywgdSfmgJwnKSwKICAgICgweEY5QUQsICdNJywgdSfnjrInKSwKICAgICgweEY5QUUsICdNJywgdSfnkaknKSwKICAgICgweEY5QUYsICdNJywgdSfnvponKSwKICAgICgweEY5QjAsICdNJywgdSfogYYnKSwKICAgICgweEY5QjEsICdNJywgdSfpiLQnKSwKICAgICgweEY5QjIsICdNJywgdSfpm7YnKSwKICAgICgweEY5QjMsICdNJywgdSfpnYgnKSwKICAgICgweEY5QjQsICdNJywgdSfpoJgnKSwKICAgICgweEY5QjUsICdNJywgdSfkvosnKSwKICAgICgweEY5QjYsICdNJywgdSfnpq4nKSwKICAgICgweEY5QjcsICdNJywgdSfphrQnKSwKICAgICgweEY5QjgsICdNJywgdSfpmrgnKSwKICAgICgweEY5QjksICdNJywgdSfmg6EnKSwKICAgICgweEY5QkEsICdNJywgdSfkuoYnKSwKICAgICgweEY5QkIsICdNJywgdSflg5onKSwKICAgICgweEY5QkMsICdNJywgdSflr64nKSwKICAgICgweEY5QkQsICdNJywgdSflsL8nKSwKICAgICgweEY5QkUsICdNJywgdSfmlpknKSwKICAgICgweEY5QkYsICdNJywgdSfmqIInKSwKICAgICgweEY5QzAsICdNJywgdSfnh44nKSwKICAgICgweEY5QzEsICdNJywgdSfnmYInKSwKICAgICgweEY5QzIsICdNJywgdSfok7wnKSwKICAgICgweEY5QzMsICdNJywgdSfpgbwnKSwKICAgICgweEY5QzQsICdNJywgdSfpvo0nKSwKICAgICgweEY5QzUsICdNJywgdSfmmognKSwKICAgICgweEY5QzYsICdNJywgdSfpmK4nKSwKICAgICgweEY5QzcsICdNJywgdSflioknKSwKICAgICgweEY5QzgsICdNJywgdSfmnbsnKSwKICAgICgweEY5QzksICdNJywgdSfmn7MnKSwKICAgICgweEY5Q0EsICdNJywgdSfmtYEnKSwKICAgICgweEY5Q0IsICdNJywgdSfmupwnKSwKICAgICgweEY5Q0MsICdNJywgdSfnkIknKSwKICAgICgweEY5Q0QsICdNJywgdSfnlZknKSwKICAgICgweEY5Q0UsICdNJywgdSfnoasnKSwKICAgICgweEY5Q0YsICdNJywgdSfntJAnKSwKICAgICgweEY5RDAsICdNJywgdSfpoZ4nKSwKICAgICgweEY5RDEsICdNJywgdSflha0nKSwKICAgICgweEY5RDIsICdNJywgdSfmiK4nKSwKICAgICgweEY5RDMsICdNJywgdSfpmbgnKSwKICAgICgweEY5RDQsICdNJywgdSflgKsnKSwKICAgICgweEY5RDUsICdNJywgdSfltJknKSwKICAgICgweEY5RDYsICdNJywgdSfmt6onKSwKICAgICgweEY5RDcsICdNJywgdSfovKonKSwKICAgICgweEY5RDgsICdNJywgdSflvosnKSwKICAgICgweEY5RDksICdNJywgdSfmhYQnKSwKICAgICgweEY5REEsICdNJywgdSfmoJcnKSwKICAgICgweEY5REIsICdNJywgdSfnjocnKSwKICAgICgweEY5REMsICdNJywgdSfpmoYnKSwKICAgICgweEY5REQsICdNJywgdSfliKknKSwKICAgICgweEY5REUsICdNJywgdSflkI8nKSwKICAgICgweEY5REYsICdNJywgdSflsaUnKSwKICAgICgweEY5RTAsICdNJywgdSfmmJMnKSwKICAgICgweEY5RTEsICdNJywgdSfmnY4nKSwKICAgICgweEY5RTIsICdNJywgdSfmoqgnKSwKICAgICgweEY5RTMsICdNJywgdSfms6UnKSwKICAgICgweEY5RTQsICdNJywgdSfnkIYnKSwKICAgICgweEY5RTUsICdNJywgdSfnl6InKSwKICAgICgweEY5RTYsICdNJywgdSfnvbknKSwKICAgICgweEY5RTcsICdNJywgdSfoo48nKSwKICAgICgweEY5RTgsICdNJywgdSfoo6EnKSwKICAgICgweEY5RTksICdNJywgdSfph4wnKSwKICAgICgweEY5RUEsICdNJywgdSfpm6InKSwKICAgICgweEY5RUIsICdNJywgdSfljL8nKSwKICAgICgweEY5RUMsICdNJywgdSfmuronKSwKICAgICgweEY5RUQsICdNJywgdSflkJ0nKSwKICAgICgweEY5RUUsICdNJywgdSfnh5AnKSwKICAgICgweEY5RUYsICdNJywgdSfnkpgnKSwKICAgICgweEY5RjAsICdNJywgdSfol7onKSwKICAgICgweEY5RjEsICdNJywgdSfpmqMnKSwKICAgICgweEY5RjIsICdNJywgdSfpsZcnKSwKICAgICgweEY5RjMsICdNJywgdSfpup8nKSwKICAgICgweEY5RjQsICdNJywgdSfmnpcnKSwKICAgICgweEY5RjUsICdNJywgdSfmt4snKSwKICAgIF0KCmRlZiBfc2VnXzQwKCk6CiAgICByZXR1cm4gWwogICAgKDB4RjlGNiwgJ00nLCB1J+iHqCcpLAogICAgKDB4RjlGNywgJ00nLCB1J+eriycpLAogICAgKDB4RjlGOCwgJ00nLCB1J+esoCcpLAogICAgKDB4RjlGOSwgJ00nLCB1J+eykicpLAogICAgKDB4RjlGQSwgJ00nLCB1J+eLgCcpLAogICAgKDB4RjlGQiwgJ00nLCB1J+eCmScpLAogICAgKDB4RjlGQywgJ00nLCB1J+itmCcpLAogICAgKDB4RjlGRCwgJ00nLCB1J+S7gCcpLAogICAgKDB4RjlGRSwgJ00nLCB1J+iMticpLAogICAgKDB4RjlGRiwgJ00nLCB1J+WIuicpLAogICAgKDB4RkEwMCwgJ00nLCB1J+WIhycpLAogICAgKDB4RkEwMSwgJ00nLCB1J+W6picpLAogICAgKDB4RkEwMiwgJ00nLCB1J+aLkycpLAogICAgKDB4RkEwMywgJ00nLCB1J+ezlicpLAogICAgKDB4RkEwNCwgJ00nLCB1J+WuhScpLAogICAgKDB4RkEwNSwgJ00nLCB1J+a0nicpLAogICAgKDB4RkEwNiwgJ00nLCB1J+aatCcpLAogICAgKDB4RkEwNywgJ00nLCB1J+i8uycpLAogICAgKDB4RkEwOCwgJ00nLCB1J+ihjCcpLAogICAgKDB4RkEwOSwgJ00nLCB1J+mZjScpLAogICAgKDB4RkEwQSwgJ00nLCB1J+imiycpLAogICAgKDB4RkEwQiwgJ00nLCB1J+W7kycpLAogICAgKDB4RkEwQywgJ00nLCB1J+WFgCcpLAogICAgKDB4RkEwRCwgJ00nLCB1J+WXgCcpLAogICAgKDB4RkEwRSwgJ1YnKSwKICAgICgweEZBMTAsICdNJywgdSfloZonKSwKICAgICgweEZBMTEsICdWJyksCiAgICAoMHhGQTEyLCAnTScsIHUn5pm0JyksCiAgICAoMHhGQTEzLCAnVicpLAogICAgKDB4RkExNSwgJ00nLCB1J+WHnicpLAogICAgKDB4RkExNiwgJ00nLCB1J+eMqicpLAogICAgKDB4RkExNywgJ00nLCB1J+ebiicpLAogICAgKDB4RkExOCwgJ00nLCB1J+ekvCcpLAogICAgKDB4RkExOSwgJ00nLCB1J+elnicpLAogICAgKDB4RkExQSwgJ00nLCB1J+elpScpLAogICAgKDB4RkExQiwgJ00nLCB1J+emjycpLAogICAgKDB4RkExQywgJ00nLCB1J+mdlicpLAogICAgKDB4RkExRCwgJ00nLCB1J+eyvicpLAogICAgKDB4RkExRSwgJ00nLCB1J+e+vScpLAogICAgKDB4RkExRiwgJ1YnKSwKICAgICgweEZBMjAsICdNJywgdSfomJInKSwKICAgICgweEZBMjEsICdWJyksCiAgICAoMHhGQTIyLCAnTScsIHUn6Ku4JyksCiAgICAoMHhGQTIzLCAnVicpLAogICAgKDB4RkEyNSwgJ00nLCB1J+mAuCcpLAogICAgKDB4RkEyNiwgJ00nLCB1J+mDvScpLAogICAgKDB4RkEyNywgJ1YnKSwKICAgICgweEZBMkEsICdNJywgdSfpo68nKSwKICAgICgweEZBMkIsICdNJywgdSfpo7wnKSwKICAgICgweEZBMkMsICdNJywgdSfppKgnKSwKICAgICgweEZBMkQsICdNJywgdSfptrQnKSwKICAgICgweEZBMkUsICdNJywgdSfpg54nKSwKICAgICgweEZBMkYsICdNJywgdSfpmrcnKSwKICAgICgweEZBMzAsICdNJywgdSfkvq4nKSwKICAgICgweEZBMzEsICdNJywgdSflg6cnKSwKICAgICgweEZBMzIsICdNJywgdSflhY0nKSwKICAgICgweEZBMzMsICdNJywgdSfli4knKSwKICAgICgweEZBMzQsICdNJywgdSfli6QnKSwKICAgICgweEZBMzUsICdNJywgdSfljZEnKSwKICAgICgweEZBMzYsICdNJywgdSfllp0nKSwKICAgICgweEZBMzcsICdNJywgdSflmIYnKSwKICAgICgweEZBMzgsICdNJywgdSflmagnKSwKICAgICgweEZBMzksICdNJywgdSfloYAnKSwKICAgICgweEZBM0EsICdNJywgdSfloqgnKSwKICAgICgweEZBM0IsICdNJywgdSflsaQnKSwKICAgICgweEZBM0MsICdNJywgdSflsa4nKSwKICAgICgweEZBM0QsICdNJywgdSfmgpQnKSwKICAgICgweEZBM0UsICdNJywgdSfmhagnKSwKICAgICgweEZBM0YsICdNJywgdSfmho4nKSwKICAgICgweEZBNDAsICdNJywgdSfmh7InKSwKICAgICgweEZBNDEsICdNJywgdSfmlY8nKSwKICAgICgweEZBNDIsICdNJywgdSfml6InKSwKICAgICgweEZBNDMsICdNJywgdSfmmpEnKSwKICAgICgweEZBNDQsICdNJywgdSfmooUnKSwKICAgICgweEZBNDUsICdNJywgdSfmtbcnKSwKICAgICgweEZBNDYsICdNJywgdSfmuJonKSwKICAgICgweEZBNDcsICdNJywgdSfmvKInKSwKICAgICgweEZBNDgsICdNJywgdSfnha4nKSwKICAgICgweEZBNDksICdNJywgdSfniKsnKSwKICAgICgweEZBNEEsICdNJywgdSfnkKInKSwKICAgICgweEZBNEIsICdNJywgdSfnopEnKSwKICAgICgweEZBNEMsICdNJywgdSfnpL4nKSwKICAgICgweEZBNEQsICdNJywgdSfnpYknKSwKICAgICgweEZBNEUsICdNJywgdSfnpYgnKSwKICAgICgweEZBNEYsICdNJywgdSfnpZAnKSwKICAgICgweEZBNTAsICdNJywgdSfnpZYnKSwKICAgICgweEZBNTEsICdNJywgdSfnpZ0nKSwKICAgICgweEZBNTIsICdNJywgdSfnpo0nKSwKICAgICgweEZBNTMsICdNJywgdSfnpo4nKSwKICAgICgweEZBNTQsICdNJywgdSfnqYAnKSwKICAgICgweEZBNTUsICdNJywgdSfnqoEnKSwKICAgICgweEZBNTYsICdNJywgdSfnr4AnKSwKICAgICgweEZBNTcsICdNJywgdSfnt7QnKSwKICAgICgweEZBNTgsICdNJywgdSfnuIknKSwKICAgICgweEZBNTksICdNJywgdSfnuYEnKSwKICAgICgweEZBNUEsICdNJywgdSfnvbInKSwKICAgICgweEZBNUIsICdNJywgdSfogIUnKSwKICAgICgweEZBNUMsICdNJywgdSfoh60nKSwKICAgICgweEZBNUQsICdNJywgdSfoibknKSwKICAgICgweEZBNUYsICdNJywgdSfokZcnKSwKICAgIF0KCmRlZiBfc2VnXzQxKCk6CiAgICByZXR1cm4gWwogICAgKDB4RkE2MCwgJ00nLCB1J+ikkCcpLAogICAgKDB4RkE2MSwgJ00nLCB1J+imlicpLAogICAgKDB4RkE2MiwgJ00nLCB1J+isgScpLAogICAgKDB4RkE2MywgJ00nLCB1J+isuScpLAogICAgKDB4RkE2NCwgJ00nLCB1J+izkycpLAogICAgKDB4RkE2NSwgJ00nLCB1J+i0iCcpLAogICAgKDB4RkE2NiwgJ00nLCB1J+i+ticpLAogICAgKDB4RkE2NywgJ00nLCB1J+mAuCcpLAogICAgKDB4RkE2OCwgJ00nLCB1J+mboycpLAogICAgKDB4RkE2OSwgJ00nLCB1J+mfvycpLAogICAgKDB4RkE2QSwgJ00nLCB1J+mguycpLAogICAgKDB4RkE2QiwgJ00nLCB1J+aBtScpLAogICAgKDB4RkE2QywgJ00nLCB1J/Cki64nKSwKICAgICgweEZBNkQsICdNJywgdSfoiJgnKSwKICAgICgweEZBNkUsICdYJyksCiAgICAoMHhGQTcwLCAnTScsIHUn5LimJyksCiAgICAoMHhGQTcxLCAnTScsIHUn5Ya1JyksCiAgICAoMHhGQTcyLCAnTScsIHUn5YWoJyksCiAgICAoMHhGQTczLCAnTScsIHUn5L6AJyksCiAgICAoMHhGQTc0LCAnTScsIHUn5YWFJyksCiAgICAoMHhGQTc1LCAnTScsIHUn5YaAJyksCiAgICAoMHhGQTc2LCAnTScsIHUn5YuHJyksCiAgICAoMHhGQTc3LCAnTScsIHUn5Yu6JyksCiAgICAoMHhGQTc4LCAnTScsIHUn5ZadJyksCiAgICAoMHhGQTc5LCAnTScsIHUn5ZWVJyksCiAgICAoMHhGQTdBLCAnTScsIHUn5ZaZJyksCiAgICAoMHhGQTdCLCAnTScsIHUn5ZeiJyksCiAgICAoMHhGQTdDLCAnTScsIHUn5aGaJyksCiAgICAoMHhGQTdELCAnTScsIHUn5aKzJyksCiAgICAoMHhGQTdFLCAnTScsIHUn5aWEJyksCiAgICAoMHhGQTdGLCAnTScsIHUn5aWUJyksCiAgICAoMHhGQTgwLCAnTScsIHUn5amiJyksCiAgICAoMHhGQTgxLCAnTScsIHUn5ayoJyksCiAgICAoMHhGQTgyLCAnTScsIHUn5buSJyksCiAgICAoMHhGQTgzLCAnTScsIHUn5buZJyksCiAgICAoMHhGQTg0LCAnTScsIHUn5b2pJyksCiAgICAoMHhGQTg1LCAnTScsIHUn5b6tJyksCiAgICAoMHhGQTg2LCAnTScsIHUn5oOYJyksCiAgICAoMHhGQTg3LCAnTScsIHUn5oWOJyksCiAgICAoMHhGQTg4LCAnTScsIHUn5oSIJyksCiAgICAoMHhGQTg5LCAnTScsIHUn5oaOJyksCiAgICAoMHhGQThBLCAnTScsIHUn5oWgJyksCiAgICAoMHhGQThCLCAnTScsIHUn5oeyJyksCiAgICAoMHhGQThDLCAnTScsIHUn5oi0JyksCiAgICAoMHhGQThELCAnTScsIHUn5o+EJyksCiAgICAoMHhGQThFLCAnTScsIHUn5pCcJyksCiAgICAoMHhGQThGLCAnTScsIHUn5pGSJyksCiAgICAoMHhGQTkwLCAnTScsIHUn5pWWJyksCiAgICAoMHhGQTkxLCAnTScsIHUn5pm0JyksCiAgICAoMHhGQTkyLCAnTScsIHUn5pyXJyksCiAgICAoMHhGQTkzLCAnTScsIHUn5pybJyksCiAgICAoMHhGQTk0LCAnTScsIHUn5p2WJyksCiAgICAoMHhGQTk1LCAnTScsIHUn5q25JyksCiAgICAoMHhGQTk2LCAnTScsIHUn5q66JyksCiAgICAoMHhGQTk3LCAnTScsIHUn5rWBJyksCiAgICAoMHhGQTk4LCAnTScsIHUn5rubJyksCiAgICAoMHhGQTk5LCAnTScsIHUn5ruLJyksCiAgICAoMHhGQTlBLCAnTScsIHUn5ryiJyksCiAgICAoMHhGQTlCLCAnTScsIHUn54CeJyksCiAgICAoMHhGQTlDLCAnTScsIHUn54WuJyksCiAgICAoMHhGQTlELCAnTScsIHUn556nJyksCiAgICAoMHhGQTlFLCAnTScsIHUn54i1JyksCiAgICAoMHhGQTlGLCAnTScsIHUn54qvJyksCiAgICAoMHhGQUEwLCAnTScsIHUn54yqJyksCiAgICAoMHhGQUExLCAnTScsIHUn55GxJyksCiAgICAoMHhGQUEyLCAnTScsIHUn55SGJyksCiAgICAoMHhGQUEzLCAnTScsIHUn55S7JyksCiAgICAoMHhGQUE0LCAnTScsIHUn55idJyksCiAgICAoMHhGQUE1LCAnTScsIHUn55ifJyksCiAgICAoMHhGQUE2LCAnTScsIHUn55uKJyksCiAgICAoMHhGQUE3LCAnTScsIHUn55ubJyksCiAgICAoMHhGQUE4LCAnTScsIHUn55u0JyksCiAgICAoMHhGQUE5LCAnTScsIHUn552KJyksCiAgICAoMHhGQUFBLCAnTScsIHUn552AJyksCiAgICAoMHhGQUFCLCAnTScsIHUn56OMJyksCiAgICAoMHhGQUFDLCAnTScsIHUn56qxJyksCiAgICAoMHhGQUFELCAnTScsIHUn56+AJyksCiAgICAoMHhGQUFFLCAnTScsIHUn57G7JyksCiAgICAoMHhGQUFGLCAnTScsIHUn57WbJyksCiAgICAoMHhGQUIwLCAnTScsIHUn57e0JyksCiAgICAoMHhGQUIxLCAnTScsIHUn57y+JyksCiAgICAoMHhGQUIyLCAnTScsIHUn6ICFJyksCiAgICAoMHhGQUIzLCAnTScsIHUn6I2SJyksCiAgICAoMHhGQUI0LCAnTScsIHUn6I+vJyksCiAgICAoMHhGQUI1LCAnTScsIHUn6J25JyksCiAgICAoMHhGQUI2LCAnTScsIHUn6KWBJyksCiAgICAoMHhGQUI3LCAnTScsIHUn6KaGJyksCiAgICAoMHhGQUI4LCAnTScsIHUn6KaWJyksCiAgICAoMHhGQUI5LCAnTScsIHUn6Kq/JyksCiAgICAoMHhGQUJBLCAnTScsIHUn6Ku4JyksCiAgICAoMHhGQUJCLCAnTScsIHUn6KuLJyksCiAgICAoMHhGQUJDLCAnTScsIHUn6KyBJyksCiAgICAoMHhGQUJELCAnTScsIHUn6Ku+JyksCiAgICAoMHhGQUJFLCAnTScsIHUn6KutJyksCiAgICAoMHhGQUJGLCAnTScsIHUn6Ky5JyksCiAgICAoMHhGQUMwLCAnTScsIHUn6K6KJyksCiAgICAoMHhGQUMxLCAnTScsIHUn6LSIJyksCiAgICAoMHhGQUMyLCAnTScsIHUn6Ly4JyksCiAgICAoMHhGQUMzLCAnTScsIHUn6YGyJyksCiAgICAoMHhGQUM0LCAnTScsIHUn6YaZJyksCiAgICBdCgpkZWYgX3NlZ180MigpOgogICAgcmV0dXJuIFsKICAgICgweEZBQzUsICdNJywgdSfpibYnKSwKICAgICgweEZBQzYsICdNJywgdSfpmbwnKSwKICAgICgweEZBQzcsICdNJywgdSfpm6MnKSwKICAgICgweEZBQzgsICdNJywgdSfpnZYnKSwKICAgICgweEZBQzksICdNJywgdSfpn5snKSwKICAgICgweEZBQ0EsICdNJywgdSfpn78nKSwKICAgICgweEZBQ0IsICdNJywgdSfpoIsnKSwKICAgICgweEZBQ0MsICdNJywgdSfpoLsnKSwKICAgICgweEZBQ0QsICdNJywgdSfprJInKSwKICAgICgweEZBQ0UsICdNJywgdSfpvpwnKSwKICAgICgweEZBQ0YsICdNJywgdSfwoqGKJyksCiAgICAoMHhGQUQwLCAnTScsIHUn8KKhhCcpLAogICAgKDB4RkFEMSwgJ00nLCB1J/Cjj5UnKSwKICAgICgweEZBRDIsICdNJywgdSfjrp0nKSwKICAgICgweEZBRDMsICdNJywgdSfkgJgnKSwKICAgICgweEZBRDQsICdNJywgdSfkgLknKSwKICAgICgweEZBRDUsICdNJywgdSfwpYmJJyksCiAgICAoMHhGQUQ2LCAnTScsIHUn8KWzkCcpLAogICAgKDB4RkFENywgJ00nLCB1J/Cnu5MnKSwKICAgICgweEZBRDgsICdNJywgdSfpvYMnKSwKICAgICgweEZBRDksICdNJywgdSfpvo4nKSwKICAgICgweEZBREEsICdYJyksCiAgICAoMHhGQjAwLCAnTScsIHUnZmYnKSwKICAgICgweEZCMDEsICdNJywgdSdmaScpLAogICAgKDB4RkIwMiwgJ00nLCB1J2ZsJyksCiAgICAoMHhGQjAzLCAnTScsIHUnZmZpJyksCiAgICAoMHhGQjA0LCAnTScsIHUnZmZsJyksCiAgICAoMHhGQjA1LCAnTScsIHUnc3QnKSwKICAgICgweEZCMDcsICdYJyksCiAgICAoMHhGQjEzLCAnTScsIHUn1bTVticpLAogICAgKDB4RkIxNCwgJ00nLCB1J9W01aUnKSwKICAgICgweEZCMTUsICdNJywgdSfVtNWrJyksCiAgICAoMHhGQjE2LCAnTScsIHUn1b7VticpLAogICAgKDB4RkIxNywgJ00nLCB1J9W01a0nKSwKICAgICgweEZCMTgsICdYJyksCiAgICAoMHhGQjFELCAnTScsIHUn15nWtCcpLAogICAgKDB4RkIxRSwgJ1YnKSwKICAgICgweEZCMUYsICdNJywgdSfXsta3JyksCiAgICAoMHhGQjIwLCAnTScsIHUn16InKSwKICAgICgweEZCMjEsICdNJywgdSfXkCcpLAogICAgKDB4RkIyMiwgJ00nLCB1J9eTJyksCiAgICAoMHhGQjIzLCAnTScsIHUn15QnKSwKICAgICgweEZCMjQsICdNJywgdSfXmycpLAogICAgKDB4RkIyNSwgJ00nLCB1J9ecJyksCiAgICAoMHhGQjI2LCAnTScsIHUn150nKSwKICAgICgweEZCMjcsICdNJywgdSfXqCcpLAogICAgKDB4RkIyOCwgJ00nLCB1J9eqJyksCiAgICAoMHhGQjI5LCAnMycsIHUnKycpLAogICAgKDB4RkIyQSwgJ00nLCB1J9ep14EnKSwKICAgICgweEZCMkIsICdNJywgdSfXqdeCJyksCiAgICAoMHhGQjJDLCAnTScsIHUn16nWvNeBJyksCiAgICAoMHhGQjJELCAnTScsIHUn16nWvNeCJyksCiAgICAoMHhGQjJFLCAnTScsIHUn15DWtycpLAogICAgKDB4RkIyRiwgJ00nLCB1J9eQ1rgnKSwKICAgICgweEZCMzAsICdNJywgdSfXkNa8JyksCiAgICAoMHhGQjMxLCAnTScsIHUn15HWvCcpLAogICAgKDB4RkIzMiwgJ00nLCB1J9eS1rwnKSwKICAgICgweEZCMzMsICdNJywgdSfXk9a8JyksCiAgICAoMHhGQjM0LCAnTScsIHUn15TWvCcpLAogICAgKDB4RkIzNSwgJ00nLCB1J9eV1rwnKSwKICAgICgweEZCMzYsICdNJywgdSfXlta8JyksCiAgICAoMHhGQjM3LCAnWCcpLAogICAgKDB4RkIzOCwgJ00nLCB1J9eY1rwnKSwKICAgICgweEZCMzksICdNJywgdSfXmda8JyksCiAgICAoMHhGQjNBLCAnTScsIHUn15rWvCcpLAogICAgKDB4RkIzQiwgJ00nLCB1J9eb1rwnKSwKICAgICgweEZCM0MsICdNJywgdSfXnNa8JyksCiAgICAoMHhGQjNELCAnWCcpLAogICAgKDB4RkIzRSwgJ00nLCB1J9ee1rwnKSwKICAgICgweEZCM0YsICdYJyksCiAgICAoMHhGQjQwLCAnTScsIHUn16DWvCcpLAogICAgKDB4RkI0MSwgJ00nLCB1J9eh1rwnKSwKICAgICgweEZCNDIsICdYJyksCiAgICAoMHhGQjQzLCAnTScsIHUn16PWvCcpLAogICAgKDB4RkI0NCwgJ00nLCB1J9ek1rwnKSwKICAgICgweEZCNDUsICdYJyksCiAgICAoMHhGQjQ2LCAnTScsIHUn16bWvCcpLAogICAgKDB4RkI0NywgJ00nLCB1J9en1rwnKSwKICAgICgweEZCNDgsICdNJywgdSfXqNa8JyksCiAgICAoMHhGQjQ5LCAnTScsIHUn16nWvCcpLAogICAgKDB4RkI0QSwgJ00nLCB1J9eq1rwnKSwKICAgICgweEZCNEIsICdNJywgdSfXlda5JyksCiAgICAoMHhGQjRDLCAnTScsIHUn15HWvycpLAogICAgKDB4RkI0RCwgJ00nLCB1J9eb1r8nKSwKICAgICgweEZCNEUsICdNJywgdSfXpNa/JyksCiAgICAoMHhGQjRGLCAnTScsIHUn15DXnCcpLAogICAgKDB4RkI1MCwgJ00nLCB1J9mxJyksCiAgICAoMHhGQjUyLCAnTScsIHUn2bsnKSwKICAgICgweEZCNTYsICdNJywgdSfZvicpLAogICAgKDB4RkI1QSwgJ00nLCB1J9qAJyksCiAgICAoMHhGQjVFLCAnTScsIHUn2bonKSwKICAgICgweEZCNjIsICdNJywgdSfZvycpLAogICAgKDB4RkI2NiwgJ00nLCB1J9m5JyksCiAgICAoMHhGQjZBLCAnTScsIHUn2qQnKSwKICAgICgweEZCNkUsICdNJywgdSfapicpLAogICAgKDB4RkI3MiwgJ00nLCB1J9qEJyksCiAgICAoMHhGQjc2LCAnTScsIHUn2oMnKSwKICAgICgweEZCN0EsICdNJywgdSfahicpLAogICAgKDB4RkI3RSwgJ00nLCB1J9qHJyksCiAgICAoMHhGQjgyLCAnTScsIHUn2o0nKSwKICAgIF0KCmRlZiBfc2VnXzQzKCk6CiAgICByZXR1cm4gWwogICAgKDB4RkI4NCwgJ00nLCB1J9qMJyksCiAgICAoMHhGQjg2LCAnTScsIHUn2o4nKSwKICAgICgweEZCODgsICdNJywgdSfaiCcpLAogICAgKDB4RkI4QSwgJ00nLCB1J9qYJyksCiAgICAoMHhGQjhDLCAnTScsIHUn2pEnKSwKICAgICgweEZCOEUsICdNJywgdSfaqScpLAogICAgKDB4RkI5MiwgJ00nLCB1J9qvJyksCiAgICAoMHhGQjk2LCAnTScsIHUn2rMnKSwKICAgICgweEZCOUEsICdNJywgdSfasScpLAogICAgKDB4RkI5RSwgJ00nLCB1J9q6JyksCiAgICAoMHhGQkEwLCAnTScsIHUn2rsnKSwKICAgICgweEZCQTQsICdNJywgdSfbgCcpLAogICAgKDB4RkJBNiwgJ00nLCB1J9uBJyksCiAgICAoMHhGQkFBLCAnTScsIHUn2r4nKSwKICAgICgweEZCQUUsICdNJywgdSfbkicpLAogICAgKDB4RkJCMCwgJ00nLCB1J9uTJyksCiAgICAoMHhGQkIyLCAnVicpLAogICAgKDB4RkJDMiwgJ1gnKSwKICAgICgweEZCRDMsICdNJywgdSfarScpLAogICAgKDB4RkJENywgJ00nLCB1J9uHJyksCiAgICAoMHhGQkQ5LCAnTScsIHUn24YnKSwKICAgICgweEZCREIsICdNJywgdSfbiCcpLAogICAgKDB4RkJERCwgJ00nLCB1J9uH2bQnKSwKICAgICgweEZCREUsICdNJywgdSfbiycpLAogICAgKDB4RkJFMCwgJ00nLCB1J9uFJyksCiAgICAoMHhGQkUyLCAnTScsIHUn24knKSwKICAgICgweEZCRTQsICdNJywgdSfbkCcpLAogICAgKDB4RkJFOCwgJ00nLCB1J9mJJyksCiAgICAoMHhGQkVBLCAnTScsIHUn2KbYpycpLAogICAgKDB4RkJFQywgJ00nLCB1J9im25UnKSwKICAgICgweEZCRUUsICdNJywgdSfYptmIJyksCiAgICAoMHhGQkYwLCAnTScsIHUn2KbbhycpLAogICAgKDB4RkJGMiwgJ00nLCB1J9im24YnKSwKICAgICgweEZCRjQsICdNJywgdSfYptuIJyksCiAgICAoMHhGQkY2LCAnTScsIHUn2KbbkCcpLAogICAgKDB4RkJGOSwgJ00nLCB1J9im2YknKSwKICAgICgweEZCRkMsICdNJywgdSfbjCcpLAogICAgKDB4RkMwMCwgJ00nLCB1J9im2KwnKSwKICAgICgweEZDMDEsICdNJywgdSfYptitJyksCiAgICAoMHhGQzAyLCAnTScsIHUn2KbZhScpLAogICAgKDB4RkMwMywgJ00nLCB1J9im2YknKSwKICAgICgweEZDMDQsICdNJywgdSfYptmKJyksCiAgICAoMHhGQzA1LCAnTScsIHUn2KjYrCcpLAogICAgKDB4RkMwNiwgJ00nLCB1J9io2K0nKSwKICAgICgweEZDMDcsICdNJywgdSfYqNiuJyksCiAgICAoMHhGQzA4LCAnTScsIHUn2KjZhScpLAogICAgKDB4RkMwOSwgJ00nLCB1J9io2YknKSwKICAgICgweEZDMEEsICdNJywgdSfYqNmKJyksCiAgICAoMHhGQzBCLCAnTScsIHUn2KrYrCcpLAogICAgKDB4RkMwQywgJ00nLCB1J9iq2K0nKSwKICAgICgweEZDMEQsICdNJywgdSfYqtiuJyksCiAgICAoMHhGQzBFLCAnTScsIHUn2KrZhScpLAogICAgKDB4RkMwRiwgJ00nLCB1J9iq2YknKSwKICAgICgweEZDMTAsICdNJywgdSfYqtmKJyksCiAgICAoMHhGQzExLCAnTScsIHUn2KvYrCcpLAogICAgKDB4RkMxMiwgJ00nLCB1J9ir2YUnKSwKICAgICgweEZDMTMsICdNJywgdSfYq9mJJyksCiAgICAoMHhGQzE0LCAnTScsIHUn2KvZiicpLAogICAgKDB4RkMxNSwgJ00nLCB1J9is2K0nKSwKICAgICgweEZDMTYsICdNJywgdSfYrNmFJyksCiAgICAoMHhGQzE3LCAnTScsIHUn2K3YrCcpLAogICAgKDB4RkMxOCwgJ00nLCB1J9it2YUnKSwKICAgICgweEZDMTksICdNJywgdSfYrtisJyksCiAgICAoMHhGQzFBLCAnTScsIHUn2K7YrScpLAogICAgKDB4RkMxQiwgJ00nLCB1J9iu2YUnKSwKICAgICgweEZDMUMsICdNJywgdSfYs9isJyksCiAgICAoMHhGQzFELCAnTScsIHUn2LPYrScpLAogICAgKDB4RkMxRSwgJ00nLCB1J9iz2K4nKSwKICAgICgweEZDMUYsICdNJywgdSfYs9mFJyksCiAgICAoMHhGQzIwLCAnTScsIHUn2LXYrScpLAogICAgKDB4RkMyMSwgJ00nLCB1J9i12YUnKSwKICAgICgweEZDMjIsICdNJywgdSfYttisJyksCiAgICAoMHhGQzIzLCAnTScsIHUn2LbYrScpLAogICAgKDB4RkMyNCwgJ00nLCB1J9i22K4nKSwKICAgICgweEZDMjUsICdNJywgdSfYttmFJyksCiAgICAoMHhGQzI2LCAnTScsIHUn2LfYrScpLAogICAgKDB4RkMyNywgJ00nLCB1J9i32YUnKSwKICAgICgweEZDMjgsICdNJywgdSfYuNmFJyksCiAgICAoMHhGQzI5LCAnTScsIHUn2LnYrCcpLAogICAgKDB4RkMyQSwgJ00nLCB1J9i52YUnKSwKICAgICgweEZDMkIsICdNJywgdSfYutisJyksCiAgICAoMHhGQzJDLCAnTScsIHUn2LrZhScpLAogICAgKDB4RkMyRCwgJ00nLCB1J9mB2KwnKSwKICAgICgweEZDMkUsICdNJywgdSfZgditJyksCiAgICAoMHhGQzJGLCAnTScsIHUn2YHYricpLAogICAgKDB4RkMzMCwgJ00nLCB1J9mB2YUnKSwKICAgICgweEZDMzEsICdNJywgdSfZgdmJJyksCiAgICAoMHhGQzMyLCAnTScsIHUn2YHZiicpLAogICAgKDB4RkMzMywgJ00nLCB1J9mC2K0nKSwKICAgICgweEZDMzQsICdNJywgdSfZgtmFJyksCiAgICAoMHhGQzM1LCAnTScsIHUn2YLZiScpLAogICAgKDB4RkMzNiwgJ00nLCB1J9mC2YonKSwKICAgICgweEZDMzcsICdNJywgdSfZg9inJyksCiAgICAoMHhGQzM4LCAnTScsIHUn2YPYrCcpLAogICAgKDB4RkMzOSwgJ00nLCB1J9mD2K0nKSwKICAgICgweEZDM0EsICdNJywgdSfZg9iuJyksCiAgICAoMHhGQzNCLCAnTScsIHUn2YPZhCcpLAogICAgKDB4RkMzQywgJ00nLCB1J9mD2YUnKSwKICAgICgweEZDM0QsICdNJywgdSfZg9mJJyksCiAgICAoMHhGQzNFLCAnTScsIHUn2YPZiicpLAogICAgXQoKZGVmIF9zZWdfNDQoKToKICAgIHJldHVybiBbCiAgICAoMHhGQzNGLCAnTScsIHUn2YTYrCcpLAogICAgKDB4RkM0MCwgJ00nLCB1J9mE2K0nKSwKICAgICgweEZDNDEsICdNJywgdSfZhNiuJyksCiAgICAoMHhGQzQyLCAnTScsIHUn2YTZhScpLAogICAgKDB4RkM0MywgJ00nLCB1J9mE2YknKSwKICAgICgweEZDNDQsICdNJywgdSfZhNmKJyksCiAgICAoMHhGQzQ1LCAnTScsIHUn2YXYrCcpLAogICAgKDB4RkM0NiwgJ00nLCB1J9mF2K0nKSwKICAgICgweEZDNDcsICdNJywgdSfZhdiuJyksCiAgICAoMHhGQzQ4LCAnTScsIHUn2YXZhScpLAogICAgKDB4RkM0OSwgJ00nLCB1J9mF2YknKSwKICAgICgweEZDNEEsICdNJywgdSfZhdmKJyksCiAgICAoMHhGQzRCLCAnTScsIHUn2YbYrCcpLAogICAgKDB4RkM0QywgJ00nLCB1J9mG2K0nKSwKICAgICgweEZDNEQsICdNJywgdSfZhtiuJyksCiAgICAoMHhGQzRFLCAnTScsIHUn2YbZhScpLAogICAgKDB4RkM0RiwgJ00nLCB1J9mG2YknKSwKICAgICgweEZDNTAsICdNJywgdSfZhtmKJyksCiAgICAoMHhGQzUxLCAnTScsIHUn2YfYrCcpLAogICAgKDB4RkM1MiwgJ00nLCB1J9mH2YUnKSwKICAgICgweEZDNTMsICdNJywgdSfZh9mJJyksCiAgICAoMHhGQzU0LCAnTScsIHUn2YfZiicpLAogICAgKDB4RkM1NSwgJ00nLCB1J9mK2KwnKSwKICAgICgweEZDNTYsICdNJywgdSfZititJyksCiAgICAoMHhGQzU3LCAnTScsIHUn2YrYricpLAogICAgKDB4RkM1OCwgJ00nLCB1J9mK2YUnKSwKICAgICgweEZDNTksICdNJywgdSfZitmJJyksCiAgICAoMHhGQzVBLCAnTScsIHUn2YrZiicpLAogICAgKDB4RkM1QiwgJ00nLCB1J9iw2bAnKSwKICAgICgweEZDNUMsICdNJywgdSfYsdmwJyksCiAgICAoMHhGQzVELCAnTScsIHUn2YnZsCcpLAogICAgKDB4RkM1RSwgJzMnLCB1JyDZjNmRJyksCiAgICAoMHhGQzVGLCAnMycsIHUnINmN2ZEnKSwKICAgICgweEZDNjAsICczJywgdScg2Y7ZkScpLAogICAgKDB4RkM2MSwgJzMnLCB1JyDZj9mRJyksCiAgICAoMHhGQzYyLCAnMycsIHUnINmQ2ZEnKSwKICAgICgweEZDNjMsICczJywgdScg2ZHZsCcpLAogICAgKDB4RkM2NCwgJ00nLCB1J9im2LEnKSwKICAgICgweEZDNjUsICdNJywgdSfYptiyJyksCiAgICAoMHhGQzY2LCAnTScsIHUn2KbZhScpLAogICAgKDB4RkM2NywgJ00nLCB1J9im2YYnKSwKICAgICgweEZDNjgsICdNJywgdSfYptmJJyksCiAgICAoMHhGQzY5LCAnTScsIHUn2KbZiicpLAogICAgKDB4RkM2QSwgJ00nLCB1J9io2LEnKSwKICAgICgweEZDNkIsICdNJywgdSfYqNiyJyksCiAgICAoMHhGQzZDLCAnTScsIHUn2KjZhScpLAogICAgKDB4RkM2RCwgJ00nLCB1J9io2YYnKSwKICAgICgweEZDNkUsICdNJywgdSfYqNmJJyksCiAgICAoMHhGQzZGLCAnTScsIHUn2KjZiicpLAogICAgKDB4RkM3MCwgJ00nLCB1J9iq2LEnKSwKICAgICgweEZDNzEsICdNJywgdSfYqtiyJyksCiAgICAoMHhGQzcyLCAnTScsIHUn2KrZhScpLAogICAgKDB4RkM3MywgJ00nLCB1J9iq2YYnKSwKICAgICgweEZDNzQsICdNJywgdSfYqtmJJyksCiAgICAoMHhGQzc1LCAnTScsIHUn2KrZiicpLAogICAgKDB4RkM3NiwgJ00nLCB1J9ir2LEnKSwKICAgICgweEZDNzcsICdNJywgdSfYq9iyJyksCiAgICAoMHhGQzc4LCAnTScsIHUn2KvZhScpLAogICAgKDB4RkM3OSwgJ00nLCB1J9ir2YYnKSwKICAgICgweEZDN0EsICdNJywgdSfYq9mJJyksCiAgICAoMHhGQzdCLCAnTScsIHUn2KvZiicpLAogICAgKDB4RkM3QywgJ00nLCB1J9mB2YknKSwKICAgICgweEZDN0QsICdNJywgdSfZgdmKJyksCiAgICAoMHhGQzdFLCAnTScsIHUn2YLZiScpLAogICAgKDB4RkM3RiwgJ00nLCB1J9mC2YonKSwKICAgICgweEZDODAsICdNJywgdSfZg9inJyksCiAgICAoMHhGQzgxLCAnTScsIHUn2YPZhCcpLAogICAgKDB4RkM4MiwgJ00nLCB1J9mD2YUnKSwKICAgICgweEZDODMsICdNJywgdSfZg9mJJyksCiAgICAoMHhGQzg0LCAnTScsIHUn2YPZiicpLAogICAgKDB4RkM4NSwgJ00nLCB1J9mE2YUnKSwKICAgICgweEZDODYsICdNJywgdSfZhNmJJyksCiAgICAoMHhGQzg3LCAnTScsIHUn2YTZiicpLAogICAgKDB4RkM4OCwgJ00nLCB1J9mF2KcnKSwKICAgICgweEZDODksICdNJywgdSfZhdmFJyksCiAgICAoMHhGQzhBLCAnTScsIHUn2YbYsScpLAogICAgKDB4RkM4QiwgJ00nLCB1J9mG2LInKSwKICAgICgweEZDOEMsICdNJywgdSfZhtmFJyksCiAgICAoMHhGQzhELCAnTScsIHUn2YbZhicpLAogICAgKDB4RkM4RSwgJ00nLCB1J9mG2YknKSwKICAgICgweEZDOEYsICdNJywgdSfZhtmKJyksCiAgICAoMHhGQzkwLCAnTScsIHUn2YnZsCcpLAogICAgKDB4RkM5MSwgJ00nLCB1J9mK2LEnKSwKICAgICgweEZDOTIsICdNJywgdSfZitiyJyksCiAgICAoMHhGQzkzLCAnTScsIHUn2YrZhScpLAogICAgKDB4RkM5NCwgJ00nLCB1J9mK2YYnKSwKICAgICgweEZDOTUsICdNJywgdSfZitmJJyksCiAgICAoMHhGQzk2LCAnTScsIHUn2YrZiicpLAogICAgKDB4RkM5NywgJ00nLCB1J9im2KwnKSwKICAgICgweEZDOTgsICdNJywgdSfYptitJyksCiAgICAoMHhGQzk5LCAnTScsIHUn2KbYricpLAogICAgKDB4RkM5QSwgJ00nLCB1J9im2YUnKSwKICAgICgweEZDOUIsICdNJywgdSfYptmHJyksCiAgICAoMHhGQzlDLCAnTScsIHUn2KjYrCcpLAogICAgKDB4RkM5RCwgJ00nLCB1J9io2K0nKSwKICAgICgweEZDOUUsICdNJywgdSfYqNiuJyksCiAgICAoMHhGQzlGLCAnTScsIHUn2KjZhScpLAogICAgKDB4RkNBMCwgJ00nLCB1J9io2YcnKSwKICAgICgweEZDQTEsICdNJywgdSfYqtisJyksCiAgICAoMHhGQ0EyLCAnTScsIHUn2KrYrScpLAogICAgXQoKZGVmIF9zZWdfNDUoKToKICAgIHJldHVybiBbCiAgICAoMHhGQ0EzLCAnTScsIHUn2KrYricpLAogICAgKDB4RkNBNCwgJ00nLCB1J9iq2YUnKSwKICAgICgweEZDQTUsICdNJywgdSfYqtmHJyksCiAgICAoMHhGQ0E2LCAnTScsIHUn2KvZhScpLAogICAgKDB4RkNBNywgJ00nLCB1J9is2K0nKSwKICAgICgweEZDQTgsICdNJywgdSfYrNmFJyksCiAgICAoMHhGQ0E5LCAnTScsIHUn2K3YrCcpLAogICAgKDB4RkNBQSwgJ00nLCB1J9it2YUnKSwKICAgICgweEZDQUIsICdNJywgdSfYrtisJyksCiAgICAoMHhGQ0FDLCAnTScsIHUn2K7ZhScpLAogICAgKDB4RkNBRCwgJ00nLCB1J9iz2KwnKSwKICAgICgweEZDQUUsICdNJywgdSfYs9itJyksCiAgICAoMHhGQ0FGLCAnTScsIHUn2LPYricpLAogICAgKDB4RkNCMCwgJ00nLCB1J9iz2YUnKSwKICAgICgweEZDQjEsICdNJywgdSfYtditJyksCiAgICAoMHhGQ0IyLCAnTScsIHUn2LXYricpLAogICAgKDB4RkNCMywgJ00nLCB1J9i12YUnKSwKICAgICgweEZDQjQsICdNJywgdSfYttisJyksCiAgICAoMHhGQ0I1LCAnTScsIHUn2LbYrScpLAogICAgKDB4RkNCNiwgJ00nLCB1J9i22K4nKSwKICAgICgweEZDQjcsICdNJywgdSfYttmFJyksCiAgICAoMHhGQ0I4LCAnTScsIHUn2LfYrScpLAogICAgKDB4RkNCOSwgJ00nLCB1J9i42YUnKSwKICAgICgweEZDQkEsICdNJywgdSfYudisJyksCiAgICAoMHhGQ0JCLCAnTScsIHUn2LnZhScpLAogICAgKDB4RkNCQywgJ00nLCB1J9i62KwnKSwKICAgICgweEZDQkQsICdNJywgdSfYutmFJyksCiAgICAoMHhGQ0JFLCAnTScsIHUn2YHYrCcpLAogICAgKDB4RkNCRiwgJ00nLCB1J9mB2K0nKSwKICAgICgweEZDQzAsICdNJywgdSfZgdiuJyksCiAgICAoMHhGQ0MxLCAnTScsIHUn2YHZhScpLAogICAgKDB4RkNDMiwgJ00nLCB1J9mC2K0nKSwKICAgICgweEZDQzMsICdNJywgdSfZgtmFJyksCiAgICAoMHhGQ0M0LCAnTScsIHUn2YPYrCcpLAogICAgKDB4RkNDNSwgJ00nLCB1J9mD2K0nKSwKICAgICgweEZDQzYsICdNJywgdSfZg9iuJyksCiAgICAoMHhGQ0M3LCAnTScsIHUn2YPZhCcpLAogICAgKDB4RkNDOCwgJ00nLCB1J9mD2YUnKSwKICAgICgweEZDQzksICdNJywgdSfZhNisJyksCiAgICAoMHhGQ0NBLCAnTScsIHUn2YTYrScpLAogICAgKDB4RkNDQiwgJ00nLCB1J9mE2K4nKSwKICAgICgweEZDQ0MsICdNJywgdSfZhNmFJyksCiAgICAoMHhGQ0NELCAnTScsIHUn2YTZhycpLAogICAgKDB4RkNDRSwgJ00nLCB1J9mF2KwnKSwKICAgICgweEZDQ0YsICdNJywgdSfZhditJyksCiAgICAoMHhGQ0QwLCAnTScsIHUn2YXYricpLAogICAgKDB4RkNEMSwgJ00nLCB1J9mF2YUnKSwKICAgICgweEZDRDIsICdNJywgdSfZhtisJyksCiAgICAoMHhGQ0QzLCAnTScsIHUn2YbYrScpLAogICAgKDB4RkNENCwgJ00nLCB1J9mG2K4nKSwKICAgICgweEZDRDUsICdNJywgdSfZhtmFJyksCiAgICAoMHhGQ0Q2LCAnTScsIHUn2YbZhycpLAogICAgKDB4RkNENywgJ00nLCB1J9mH2KwnKSwKICAgICgweEZDRDgsICdNJywgdSfZh9mFJyksCiAgICAoMHhGQ0Q5LCAnTScsIHUn2YfZsCcpLAogICAgKDB4RkNEQSwgJ00nLCB1J9mK2KwnKSwKICAgICgweEZDREIsICdNJywgdSfZititJyksCiAgICAoMHhGQ0RDLCAnTScsIHUn2YrYricpLAogICAgKDB4RkNERCwgJ00nLCB1J9mK2YUnKSwKICAgICgweEZDREUsICdNJywgdSfZitmHJyksCiAgICAoMHhGQ0RGLCAnTScsIHUn2KbZhScpLAogICAgKDB4RkNFMCwgJ00nLCB1J9im2YcnKSwKICAgICgweEZDRTEsICdNJywgdSfYqNmFJyksCiAgICAoMHhGQ0UyLCAnTScsIHUn2KjZhycpLAogICAgKDB4RkNFMywgJ00nLCB1J9iq2YUnKSwKICAgICgweEZDRTQsICdNJywgdSfYqtmHJyksCiAgICAoMHhGQ0U1LCAnTScsIHUn2KvZhScpLAogICAgKDB4RkNFNiwgJ00nLCB1J9ir2YcnKSwKICAgICgweEZDRTcsICdNJywgdSfYs9mFJyksCiAgICAoMHhGQ0U4LCAnTScsIHUn2LPZhycpLAogICAgKDB4RkNFOSwgJ00nLCB1J9i02YUnKSwKICAgICgweEZDRUEsICdNJywgdSfYtNmHJyksCiAgICAoMHhGQ0VCLCAnTScsIHUn2YPZhCcpLAogICAgKDB4RkNFQywgJ00nLCB1J9mD2YUnKSwKICAgICgweEZDRUQsICdNJywgdSfZhNmFJyksCiAgICAoMHhGQ0VFLCAnTScsIHUn2YbZhScpLAogICAgKDB4RkNFRiwgJ00nLCB1J9mG2YcnKSwKICAgICgweEZDRjAsICdNJywgdSfZitmFJyksCiAgICAoMHhGQ0YxLCAnTScsIHUn2YrZhycpLAogICAgKDB4RkNGMiwgJ00nLCB1J9mA2Y7ZkScpLAogICAgKDB4RkNGMywgJ00nLCB1J9mA2Y/ZkScpLAogICAgKDB4RkNGNCwgJ00nLCB1J9mA2ZDZkScpLAogICAgKDB4RkNGNSwgJ00nLCB1J9i32YknKSwKICAgICgweEZDRjYsICdNJywgdSfYt9mKJyksCiAgICAoMHhGQ0Y3LCAnTScsIHUn2LnZiScpLAogICAgKDB4RkNGOCwgJ00nLCB1J9i52YonKSwKICAgICgweEZDRjksICdNJywgdSfYutmJJyksCiAgICAoMHhGQ0ZBLCAnTScsIHUn2LrZiicpLAogICAgKDB4RkNGQiwgJ00nLCB1J9iz2YknKSwKICAgICgweEZDRkMsICdNJywgdSfYs9mKJyksCiAgICAoMHhGQ0ZELCAnTScsIHUn2LTZiScpLAogICAgKDB4RkNGRSwgJ00nLCB1J9i02YonKSwKICAgICgweEZDRkYsICdNJywgdSfYrdmJJyksCiAgICAoMHhGRDAwLCAnTScsIHUn2K3ZiicpLAogICAgKDB4RkQwMSwgJ00nLCB1J9is2YknKSwKICAgICgweEZEMDIsICdNJywgdSfYrNmKJyksCiAgICAoMHhGRDAzLCAnTScsIHUn2K7ZiScpLAogICAgKDB4RkQwNCwgJ00nLCB1J9iu2YonKSwKICAgICgweEZEMDUsICdNJywgdSfYtdmJJyksCiAgICAoMHhGRDA2LCAnTScsIHUn2LXZiicpLAogICAgXQoKZGVmIF9zZWdfNDYoKToKICAgIHJldHVybiBbCiAgICAoMHhGRDA3LCAnTScsIHUn2LbZiScpLAogICAgKDB4RkQwOCwgJ00nLCB1J9i22YonKSwKICAgICgweEZEMDksICdNJywgdSfYtNisJyksCiAgICAoMHhGRDBBLCAnTScsIHUn2LTYrScpLAogICAgKDB4RkQwQiwgJ00nLCB1J9i02K4nKSwKICAgICgweEZEMEMsICdNJywgdSfYtNmFJyksCiAgICAoMHhGRDBELCAnTScsIHUn2LTYsScpLAogICAgKDB4RkQwRSwgJ00nLCB1J9iz2LEnKSwKICAgICgweEZEMEYsICdNJywgdSfYtdixJyksCiAgICAoMHhGRDEwLCAnTScsIHUn2LbYsScpLAogICAgKDB4RkQxMSwgJ00nLCB1J9i32YknKSwKICAgICgweEZEMTIsICdNJywgdSfYt9mKJyksCiAgICAoMHhGRDEzLCAnTScsIHUn2LnZiScpLAogICAgKDB4RkQxNCwgJ00nLCB1J9i52YonKSwKICAgICgweEZEMTUsICdNJywgdSfYutmJJyksCiAgICAoMHhGRDE2LCAnTScsIHUn2LrZiicpLAogICAgKDB4RkQxNywgJ00nLCB1J9iz2YknKSwKICAgICgweEZEMTgsICdNJywgdSfYs9mKJyksCiAgICAoMHhGRDE5LCAnTScsIHUn2LTZiScpLAogICAgKDB4RkQxQSwgJ00nLCB1J9i02YonKSwKICAgICgweEZEMUIsICdNJywgdSfYrdmJJyksCiAgICAoMHhGRDFDLCAnTScsIHUn2K3ZiicpLAogICAgKDB4RkQxRCwgJ00nLCB1J9is2YknKSwKICAgICgweEZEMUUsICdNJywgdSfYrNmKJyksCiAgICAoMHhGRDFGLCAnTScsIHUn2K7ZiScpLAogICAgKDB4RkQyMCwgJ00nLCB1J9iu2YonKSwKICAgICgweEZEMjEsICdNJywgdSfYtdmJJyksCiAgICAoMHhGRDIyLCAnTScsIHUn2LXZiicpLAogICAgKDB4RkQyMywgJ00nLCB1J9i22YknKSwKICAgICgweEZEMjQsICdNJywgdSfYttmKJyksCiAgICAoMHhGRDI1LCAnTScsIHUn2LTYrCcpLAogICAgKDB4RkQyNiwgJ00nLCB1J9i02K0nKSwKICAgICgweEZEMjcsICdNJywgdSfYtNiuJyksCiAgICAoMHhGRDI4LCAnTScsIHUn2LTZhScpLAogICAgKDB4RkQyOSwgJ00nLCB1J9i02LEnKSwKICAgICgweEZEMkEsICdNJywgdSfYs9ixJyksCiAgICAoMHhGRDJCLCAnTScsIHUn2LXYsScpLAogICAgKDB4RkQyQywgJ00nLCB1J9i22LEnKSwKICAgICgweEZEMkQsICdNJywgdSfYtNisJyksCiAgICAoMHhGRDJFLCAnTScsIHUn2LTYrScpLAogICAgKDB4RkQyRiwgJ00nLCB1J9i02K4nKSwKICAgICgweEZEMzAsICdNJywgdSfYtNmFJyksCiAgICAoMHhGRDMxLCAnTScsIHUn2LPZhycpLAogICAgKDB4RkQzMiwgJ00nLCB1J9i02YcnKSwKICAgICgweEZEMzMsICdNJywgdSfYt9mFJyksCiAgICAoMHhGRDM0LCAnTScsIHUn2LPYrCcpLAogICAgKDB4RkQzNSwgJ00nLCB1J9iz2K0nKSwKICAgICgweEZEMzYsICdNJywgdSfYs9iuJyksCiAgICAoMHhGRDM3LCAnTScsIHUn2LTYrCcpLAogICAgKDB4RkQzOCwgJ00nLCB1J9i02K0nKSwKICAgICgweEZEMzksICdNJywgdSfYtNiuJyksCiAgICAoMHhGRDNBLCAnTScsIHUn2LfZhScpLAogICAgKDB4RkQzQiwgJ00nLCB1J9i42YUnKSwKICAgICgweEZEM0MsICdNJywgdSfYp9mLJyksCiAgICAoMHhGRDNFLCAnVicpLAogICAgKDB4RkQ0MCwgJ1gnKSwKICAgICgweEZENTAsICdNJywgdSfYqtis2YUnKSwKICAgICgweEZENTEsICdNJywgdSfYqtit2KwnKSwKICAgICgweEZENTMsICdNJywgdSfYqtit2YUnKSwKICAgICgweEZENTQsICdNJywgdSfYqtiu2YUnKSwKICAgICgweEZENTUsICdNJywgdSfYqtmF2KwnKSwKICAgICgweEZENTYsICdNJywgdSfYqtmF2K0nKSwKICAgICgweEZENTcsICdNJywgdSfYqtmF2K4nKSwKICAgICgweEZENTgsICdNJywgdSfYrNmF2K0nKSwKICAgICgweEZENUEsICdNJywgdSfYrdmF2YonKSwKICAgICgweEZENUIsICdNJywgdSfYrdmF2YknKSwKICAgICgweEZENUMsICdNJywgdSfYs9it2KwnKSwKICAgICgweEZENUQsICdNJywgdSfYs9is2K0nKSwKICAgICgweEZENUUsICdNJywgdSfYs9is2YknKSwKICAgICgweEZENUYsICdNJywgdSfYs9mF2K0nKSwKICAgICgweEZENjEsICdNJywgdSfYs9mF2KwnKSwKICAgICgweEZENjIsICdNJywgdSfYs9mF2YUnKSwKICAgICgweEZENjQsICdNJywgdSfYtdit2K0nKSwKICAgICgweEZENjYsICdNJywgdSfYtdmF2YUnKSwKICAgICgweEZENjcsICdNJywgdSfYtNit2YUnKSwKICAgICgweEZENjksICdNJywgdSfYtNis2YonKSwKICAgICgweEZENkEsICdNJywgdSfYtNmF2K4nKSwKICAgICgweEZENkMsICdNJywgdSfYtNmF2YUnKSwKICAgICgweEZENkUsICdNJywgdSfYttit2YknKSwKICAgICgweEZENkYsICdNJywgdSfYttiu2YUnKSwKICAgICgweEZENzEsICdNJywgdSfYt9mF2K0nKSwKICAgICgweEZENzMsICdNJywgdSfYt9mF2YUnKSwKICAgICgweEZENzQsICdNJywgdSfYt9mF2YonKSwKICAgICgweEZENzUsICdNJywgdSfYudis2YUnKSwKICAgICgweEZENzYsICdNJywgdSfYudmF2YUnKSwKICAgICgweEZENzgsICdNJywgdSfYudmF2YknKSwKICAgICgweEZENzksICdNJywgdSfYutmF2YUnKSwKICAgICgweEZEN0EsICdNJywgdSfYutmF2YonKSwKICAgICgweEZEN0IsICdNJywgdSfYutmF2YknKSwKICAgICgweEZEN0MsICdNJywgdSfZgdiu2YUnKSwKICAgICgweEZEN0UsICdNJywgdSfZgtmF2K0nKSwKICAgICgweEZEN0YsICdNJywgdSfZgtmF2YUnKSwKICAgICgweEZEODAsICdNJywgdSfZhNit2YUnKSwKICAgICgweEZEODEsICdNJywgdSfZhNit2YonKSwKICAgICgweEZEODIsICdNJywgdSfZhNit2YknKSwKICAgICgweEZEODMsICdNJywgdSfZhNis2KwnKSwKICAgICgweEZEODUsICdNJywgdSfZhNiu2YUnKSwKICAgICgweEZEODcsICdNJywgdSfZhNmF2K0nKSwKICAgICgweEZEODksICdNJywgdSfZhdit2KwnKSwKICAgICgweEZEOEEsICdNJywgdSfZhdit2YUnKSwKICAgIF0KCmRlZiBfc2VnXzQ3KCk6CiAgICByZXR1cm4gWwogICAgKDB4RkQ4QiwgJ00nLCB1J9mF2K3ZiicpLAogICAgKDB4RkQ4QywgJ00nLCB1J9mF2KzYrScpLAogICAgKDB4RkQ4RCwgJ00nLCB1J9mF2KzZhScpLAogICAgKDB4RkQ4RSwgJ00nLCB1J9mF2K7YrCcpLAogICAgKDB4RkQ4RiwgJ00nLCB1J9mF2K7ZhScpLAogICAgKDB4RkQ5MCwgJ1gnKSwKICAgICgweEZEOTIsICdNJywgdSfZhdis2K4nKSwKICAgICgweEZEOTMsICdNJywgdSfZh9mF2KwnKSwKICAgICgweEZEOTQsICdNJywgdSfZh9mF2YUnKSwKICAgICgweEZEOTUsICdNJywgdSfZhtit2YUnKSwKICAgICgweEZEOTYsICdNJywgdSfZhtit2YknKSwKICAgICgweEZEOTcsICdNJywgdSfZhtis2YUnKSwKICAgICgweEZEOTksICdNJywgdSfZhtis2YknKSwKICAgICgweEZEOUEsICdNJywgdSfZhtmF2YonKSwKICAgICgweEZEOUIsICdNJywgdSfZhtmF2YknKSwKICAgICgweEZEOUMsICdNJywgdSfZitmF2YUnKSwKICAgICgweEZEOUUsICdNJywgdSfYqNiu2YonKSwKICAgICgweEZEOUYsICdNJywgdSfYqtis2YonKSwKICAgICgweEZEQTAsICdNJywgdSfYqtis2YknKSwKICAgICgweEZEQTEsICdNJywgdSfYqtiu2YonKSwKICAgICgweEZEQTIsICdNJywgdSfYqtiu2YknKSwKICAgICgweEZEQTMsICdNJywgdSfYqtmF2YonKSwKICAgICgweEZEQTQsICdNJywgdSfYqtmF2YknKSwKICAgICgweEZEQTUsICdNJywgdSfYrNmF2YonKSwKICAgICgweEZEQTYsICdNJywgdSfYrNit2YknKSwKICAgICgweEZEQTcsICdNJywgdSfYrNmF2YknKSwKICAgICgweEZEQTgsICdNJywgdSfYs9iu2YknKSwKICAgICgweEZEQTksICdNJywgdSfYtdit2YonKSwKICAgICgweEZEQUEsICdNJywgdSfYtNit2YonKSwKICAgICgweEZEQUIsICdNJywgdSfYttit2YonKSwKICAgICgweEZEQUMsICdNJywgdSfZhNis2YonKSwKICAgICgweEZEQUQsICdNJywgdSfZhNmF2YonKSwKICAgICgweEZEQUUsICdNJywgdSfZitit2YonKSwKICAgICgweEZEQUYsICdNJywgdSfZitis2YonKSwKICAgICgweEZEQjAsICdNJywgdSfZitmF2YonKSwKICAgICgweEZEQjEsICdNJywgdSfZhdmF2YonKSwKICAgICgweEZEQjIsICdNJywgdSfZgtmF2YonKSwKICAgICgweEZEQjMsICdNJywgdSfZhtit2YonKSwKICAgICgweEZEQjQsICdNJywgdSfZgtmF2K0nKSwKICAgICgweEZEQjUsICdNJywgdSfZhNit2YUnKSwKICAgICgweEZEQjYsICdNJywgdSfYudmF2YonKSwKICAgICgweEZEQjcsICdNJywgdSfZg9mF2YonKSwKICAgICgweEZEQjgsICdNJywgdSfZhtis2K0nKSwKICAgICgweEZEQjksICdNJywgdSfZhdiu2YonKSwKICAgICgweEZEQkEsICdNJywgdSfZhNis2YUnKSwKICAgICgweEZEQkIsICdNJywgdSfZg9mF2YUnKSwKICAgICgweEZEQkMsICdNJywgdSfZhNis2YUnKSwKICAgICgweEZEQkQsICdNJywgdSfZhtis2K0nKSwKICAgICgweEZEQkUsICdNJywgdSfYrNit2YonKSwKICAgICgweEZEQkYsICdNJywgdSfYrdis2YonKSwKICAgICgweEZEQzAsICdNJywgdSfZhdis2YonKSwKICAgICgweEZEQzEsICdNJywgdSfZgdmF2YonKSwKICAgICgweEZEQzIsICdNJywgdSfYqNit2YonKSwKICAgICgweEZEQzMsICdNJywgdSfZg9mF2YUnKSwKICAgICgweEZEQzQsICdNJywgdSfYudis2YUnKSwKICAgICgweEZEQzUsICdNJywgdSfYtdmF2YUnKSwKICAgICgweEZEQzYsICdNJywgdSfYs9iu2YonKSwKICAgICgweEZEQzcsICdNJywgdSfZhtis2YonKSwKICAgICgweEZEQzgsICdYJyksCiAgICAoMHhGREYwLCAnTScsIHUn2LXZhNuSJyksCiAgICAoMHhGREYxLCAnTScsIHUn2YLZhNuSJyksCiAgICAoMHhGREYyLCAnTScsIHUn2KfZhNmE2YcnKSwKICAgICgweEZERjMsICdNJywgdSfYp9mD2KjYsScpLAogICAgKDB4RkRGNCwgJ00nLCB1J9mF2K3ZhdivJyksCiAgICAoMHhGREY1LCAnTScsIHUn2LXZhNi52YUnKSwKICAgICgweEZERjYsICdNJywgdSfYsdiz2YjZhCcpLAogICAgKDB4RkRGNywgJ00nLCB1J9i52YTZitmHJyksCiAgICAoMHhGREY4LCAnTScsIHUn2YjYs9mE2YUnKSwKICAgICgweEZERjksICdNJywgdSfYtdmE2YknKSwKICAgICgweEZERkEsICczJywgdSfYtdmE2Ykg2KfZhNmE2Ycg2LnZhNmK2Ycg2YjYs9mE2YUnKSwKICAgICgweEZERkIsICczJywgdSfYrNmEINis2YTYp9mE2YcnKSwKICAgICgweEZERkMsICdNJywgdSfYsduM2KfZhCcpLAogICAgKDB4RkRGRCwgJ1YnKSwKICAgICgweEZERkUsICdYJyksCiAgICAoMHhGRTAwLCAnSScpLAogICAgKDB4RkUxMCwgJzMnLCB1JywnKSwKICAgICgweEZFMTEsICdNJywgdSfjgIEnKSwKICAgICgweEZFMTIsICdYJyksCiAgICAoMHhGRTEzLCAnMycsIHUnOicpLAogICAgKDB4RkUxNCwgJzMnLCB1JzsnKSwKICAgICgweEZFMTUsICczJywgdSchJyksCiAgICAoMHhGRTE2LCAnMycsIHUnPycpLAogICAgKDB4RkUxNywgJ00nLCB1J+OAlicpLAogICAgKDB4RkUxOCwgJ00nLCB1J+OAlycpLAogICAgKDB4RkUxOSwgJ1gnKSwKICAgICgweEZFMjAsICdWJyksCiAgICAoMHhGRTI3LCAnWCcpLAogICAgKDB4RkUzMSwgJ00nLCB1J+KAlCcpLAogICAgKDB4RkUzMiwgJ00nLCB1J+KAkycpLAogICAgKDB4RkUzMywgJzMnLCB1J18nKSwKICAgICgweEZFMzUsICczJywgdScoJyksCiAgICAoMHhGRTM2LCAnMycsIHUnKScpLAogICAgKDB4RkUzNywgJzMnLCB1J3snKSwKICAgICgweEZFMzgsICczJywgdSd9JyksCiAgICAoMHhGRTM5LCAnTScsIHUn44CUJyksCiAgICAoMHhGRTNBLCAnTScsIHUn44CVJyksCiAgICAoMHhGRTNCLCAnTScsIHUn44CQJyksCiAgICAoMHhGRTNDLCAnTScsIHUn44CRJyksCiAgICAoMHhGRTNELCAnTScsIHUn44CKJyksCiAgICAoMHhGRTNFLCAnTScsIHUn44CLJyksCiAgICBdCgpkZWYgX3NlZ180OCgpOgogICAgcmV0dXJuIFsKICAgICgweEZFM0YsICdNJywgdSfjgIgnKSwKICAgICgweEZFNDAsICdNJywgdSfjgIknKSwKICAgICgweEZFNDEsICdNJywgdSfjgIwnKSwKICAgICgweEZFNDIsICdNJywgdSfjgI0nKSwKICAgICgweEZFNDMsICdNJywgdSfjgI4nKSwKICAgICgweEZFNDQsICdNJywgdSfjgI8nKSwKICAgICgweEZFNDUsICdWJyksCiAgICAoMHhGRTQ3LCAnMycsIHUnWycpLAogICAgKDB4RkU0OCwgJzMnLCB1J10nKSwKICAgICgweEZFNDksICczJywgdScgzIUnKSwKICAgICgweEZFNEQsICczJywgdSdfJyksCiAgICAoMHhGRTUwLCAnMycsIHUnLCcpLAogICAgKDB4RkU1MSwgJ00nLCB1J+OAgScpLAogICAgKDB4RkU1MiwgJ1gnKSwKICAgICgweEZFNTQsICczJywgdSc7JyksCiAgICAoMHhGRTU1LCAnMycsIHUnOicpLAogICAgKDB4RkU1NiwgJzMnLCB1Jz8nKSwKICAgICgweEZFNTcsICczJywgdSchJyksCiAgICAoMHhGRTU4LCAnTScsIHUn4oCUJyksCiAgICAoMHhGRTU5LCAnMycsIHUnKCcpLAogICAgKDB4RkU1QSwgJzMnLCB1JyknKSwKICAgICgweEZFNUIsICczJywgdSd7JyksCiAgICAoMHhGRTVDLCAnMycsIHUnfScpLAogICAgKDB4RkU1RCwgJ00nLCB1J+OAlCcpLAogICAgKDB4RkU1RSwgJ00nLCB1J+OAlScpLAogICAgKDB4RkU1RiwgJzMnLCB1JyMnKSwKICAgICgweEZFNjAsICczJywgdScmJyksCiAgICAoMHhGRTYxLCAnMycsIHUnKicpLAogICAgKDB4RkU2MiwgJzMnLCB1JysnKSwKICAgICgweEZFNjMsICdNJywgdSctJyksCiAgICAoMHhGRTY0LCAnMycsIHUnPCcpLAogICAgKDB4RkU2NSwgJzMnLCB1Jz4nKSwKICAgICgweEZFNjYsICczJywgdSc9JyksCiAgICAoMHhGRTY3LCAnWCcpLAogICAgKDB4RkU2OCwgJzMnLCB1J1xcJyksCiAgICAoMHhGRTY5LCAnMycsIHUnJCcpLAogICAgKDB4RkU2QSwgJzMnLCB1JyUnKSwKICAgICgweEZFNkIsICczJywgdSdAJyksCiAgICAoMHhGRTZDLCAnWCcpLAogICAgKDB4RkU3MCwgJzMnLCB1JyDZiycpLAogICAgKDB4RkU3MSwgJ00nLCB1J9mA2YsnKSwKICAgICgweEZFNzIsICczJywgdScg2YwnKSwKICAgICgweEZFNzMsICdWJyksCiAgICAoMHhGRTc0LCAnMycsIHUnINmNJyksCiAgICAoMHhGRTc1LCAnWCcpLAogICAgKDB4RkU3NiwgJzMnLCB1JyDZjicpLAogICAgKDB4RkU3NywgJ00nLCB1J9mA2Y4nKSwKICAgICgweEZFNzgsICczJywgdScg2Y8nKSwKICAgICgweEZFNzksICdNJywgdSfZgNmPJyksCiAgICAoMHhGRTdBLCAnMycsIHUnINmQJyksCiAgICAoMHhGRTdCLCAnTScsIHUn2YDZkCcpLAogICAgKDB4RkU3QywgJzMnLCB1JyDZkScpLAogICAgKDB4RkU3RCwgJ00nLCB1J9mA2ZEnKSwKICAgICgweEZFN0UsICczJywgdScg2ZInKSwKICAgICgweEZFN0YsICdNJywgdSfZgNmSJyksCiAgICAoMHhGRTgwLCAnTScsIHUn2KEnKSwKICAgICgweEZFODEsICdNJywgdSfYoicpLAogICAgKDB4RkU4MywgJ00nLCB1J9ijJyksCiAgICAoMHhGRTg1LCAnTScsIHUn2KQnKSwKICAgICgweEZFODcsICdNJywgdSfYpScpLAogICAgKDB4RkU4OSwgJ00nLCB1J9imJyksCiAgICAoMHhGRThELCAnTScsIHUn2KcnKSwKICAgICgweEZFOEYsICdNJywgdSfYqCcpLAogICAgKDB4RkU5MywgJ00nLCB1J9ipJyksCiAgICAoMHhGRTk1LCAnTScsIHUn2KonKSwKICAgICgweEZFOTksICdNJywgdSfYqycpLAogICAgKDB4RkU5RCwgJ00nLCB1J9isJyksCiAgICAoMHhGRUExLCAnTScsIHUn2K0nKSwKICAgICgweEZFQTUsICdNJywgdSfYricpLAogICAgKDB4RkVBOSwgJ00nLCB1J9ivJyksCiAgICAoMHhGRUFCLCAnTScsIHUn2LAnKSwKICAgICgweEZFQUQsICdNJywgdSfYsScpLAogICAgKDB4RkVBRiwgJ00nLCB1J9iyJyksCiAgICAoMHhGRUIxLCAnTScsIHUn2LMnKSwKICAgICgweEZFQjUsICdNJywgdSfYtCcpLAogICAgKDB4RkVCOSwgJ00nLCB1J9i1JyksCiAgICAoMHhGRUJELCAnTScsIHUn2LYnKSwKICAgICgweEZFQzEsICdNJywgdSfYtycpLAogICAgKDB4RkVDNSwgJ00nLCB1J9i4JyksCiAgICAoMHhGRUM5LCAnTScsIHUn2LknKSwKICAgICgweEZFQ0QsICdNJywgdSfYuicpLAogICAgKDB4RkVEMSwgJ00nLCB1J9mBJyksCiAgICAoMHhGRUQ1LCAnTScsIHUn2YInKSwKICAgICgweEZFRDksICdNJywgdSfZgycpLAogICAgKDB4RkVERCwgJ00nLCB1J9mEJyksCiAgICAoMHhGRUUxLCAnTScsIHUn2YUnKSwKICAgICgweEZFRTUsICdNJywgdSfZhicpLAogICAgKDB4RkVFOSwgJ00nLCB1J9mHJyksCiAgICAoMHhGRUVELCAnTScsIHUn2YgnKSwKICAgICgweEZFRUYsICdNJywgdSfZiScpLAogICAgKDB4RkVGMSwgJ00nLCB1J9mKJyksCiAgICAoMHhGRUY1LCAnTScsIHUn2YTYoicpLAogICAgKDB4RkVGNywgJ00nLCB1J9mE2KMnKSwKICAgICgweEZFRjksICdNJywgdSfZhNilJyksCiAgICAoMHhGRUZCLCAnTScsIHUn2YTYpycpLAogICAgKDB4RkVGRCwgJ1gnKSwKICAgICgweEZFRkYsICdJJyksCiAgICAoMHhGRjAwLCAnWCcpLAogICAgKDB4RkYwMSwgJzMnLCB1JyEnKSwKICAgICgweEZGMDIsICczJywgdSciJyksCiAgICBdCgpkZWYgX3NlZ180OSgpOgogICAgcmV0dXJuIFsKICAgICgweEZGMDMsICczJywgdScjJyksCiAgICAoMHhGRjA0LCAnMycsIHUnJCcpLAogICAgKDB4RkYwNSwgJzMnLCB1JyUnKSwKICAgICgweEZGMDYsICczJywgdScmJyksCiAgICAoMHhGRjA3LCAnMycsIHUnXCcnKSwKICAgICgweEZGMDgsICczJywgdScoJyksCiAgICAoMHhGRjA5LCAnMycsIHUnKScpLAogICAgKDB4RkYwQSwgJzMnLCB1JyonKSwKICAgICgweEZGMEIsICczJywgdScrJyksCiAgICAoMHhGRjBDLCAnMycsIHUnLCcpLAogICAgKDB4RkYwRCwgJ00nLCB1Jy0nKSwKICAgICgweEZGMEUsICdNJywgdScuJyksCiAgICAoMHhGRjBGLCAnMycsIHUnLycpLAogICAgKDB4RkYxMCwgJ00nLCB1JzAnKSwKICAgICgweEZGMTEsICdNJywgdScxJyksCiAgICAoMHhGRjEyLCAnTScsIHUnMicpLAogICAgKDB4RkYxMywgJ00nLCB1JzMnKSwKICAgICgweEZGMTQsICdNJywgdSc0JyksCiAgICAoMHhGRjE1LCAnTScsIHUnNScpLAogICAgKDB4RkYxNiwgJ00nLCB1JzYnKSwKICAgICgweEZGMTcsICdNJywgdSc3JyksCiAgICAoMHhGRjE4LCAnTScsIHUnOCcpLAogICAgKDB4RkYxOSwgJ00nLCB1JzknKSwKICAgICgweEZGMUEsICczJywgdSc6JyksCiAgICAoMHhGRjFCLCAnMycsIHUnOycpLAogICAgKDB4RkYxQywgJzMnLCB1JzwnKSwKICAgICgweEZGMUQsICczJywgdSc9JyksCiAgICAoMHhGRjFFLCAnMycsIHUnPicpLAogICAgKDB4RkYxRiwgJzMnLCB1Jz8nKSwKICAgICgweEZGMjAsICczJywgdSdAJyksCiAgICAoMHhGRjIxLCAnTScsIHUnYScpLAogICAgKDB4RkYyMiwgJ00nLCB1J2InKSwKICAgICgweEZGMjMsICdNJywgdSdjJyksCiAgICAoMHhGRjI0LCAnTScsIHUnZCcpLAogICAgKDB4RkYyNSwgJ00nLCB1J2UnKSwKICAgICgweEZGMjYsICdNJywgdSdmJyksCiAgICAoMHhGRjI3LCAnTScsIHUnZycpLAogICAgKDB4RkYyOCwgJ00nLCB1J2gnKSwKICAgICgweEZGMjksICdNJywgdSdpJyksCiAgICAoMHhGRjJBLCAnTScsIHUnaicpLAogICAgKDB4RkYyQiwgJ00nLCB1J2snKSwKICAgICgweEZGMkMsICdNJywgdSdsJyksCiAgICAoMHhGRjJELCAnTScsIHUnbScpLAogICAgKDB4RkYyRSwgJ00nLCB1J24nKSwKICAgICgweEZGMkYsICdNJywgdSdvJyksCiAgICAoMHhGRjMwLCAnTScsIHUncCcpLAogICAgKDB4RkYzMSwgJ00nLCB1J3EnKSwKICAgICgweEZGMzIsICdNJywgdSdyJyksCiAgICAoMHhGRjMzLCAnTScsIHUncycpLAogICAgKDB4RkYzNCwgJ00nLCB1J3QnKSwKICAgICgweEZGMzUsICdNJywgdSd1JyksCiAgICAoMHhGRjM2LCAnTScsIHUndicpLAogICAgKDB4RkYzNywgJ00nLCB1J3cnKSwKICAgICgweEZGMzgsICdNJywgdSd4JyksCiAgICAoMHhGRjM5LCAnTScsIHUneScpLAogICAgKDB4RkYzQSwgJ00nLCB1J3onKSwKICAgICgweEZGM0IsICczJywgdSdbJyksCiAgICAoMHhGRjNDLCAnMycsIHUnXFwnKSwKICAgICgweEZGM0QsICczJywgdSddJyksCiAgICAoMHhGRjNFLCAnMycsIHUnXicpLAogICAgKDB4RkYzRiwgJzMnLCB1J18nKSwKICAgICgweEZGNDAsICczJywgdSdgJyksCiAgICAoMHhGRjQxLCAnTScsIHUnYScpLAogICAgKDB4RkY0MiwgJ00nLCB1J2InKSwKICAgICgweEZGNDMsICdNJywgdSdjJyksCiAgICAoMHhGRjQ0LCAnTScsIHUnZCcpLAogICAgKDB4RkY0NSwgJ00nLCB1J2UnKSwKICAgICgweEZGNDYsICdNJywgdSdmJyksCiAgICAoMHhGRjQ3LCAnTScsIHUnZycpLAogICAgKDB4RkY0OCwgJ00nLCB1J2gnKSwKICAgICgweEZGNDksICdNJywgdSdpJyksCiAgICAoMHhGRjRBLCAnTScsIHUnaicpLAogICAgKDB4RkY0QiwgJ00nLCB1J2snKSwKICAgICgweEZGNEMsICdNJywgdSdsJyksCiAgICAoMHhGRjRELCAnTScsIHUnbScpLAogICAgKDB4RkY0RSwgJ00nLCB1J24nKSwKICAgICgweEZGNEYsICdNJywgdSdvJyksCiAgICAoMHhGRjUwLCAnTScsIHUncCcpLAogICAgKDB4RkY1MSwgJ00nLCB1J3EnKSwKICAgICgweEZGNTIsICdNJywgdSdyJyksCiAgICAoMHhGRjUzLCAnTScsIHUncycpLAogICAgKDB4RkY1NCwgJ00nLCB1J3QnKSwKICAgICgweEZGNTUsICdNJywgdSd1JyksCiAgICAoMHhGRjU2LCAnTScsIHUndicpLAogICAgKDB4RkY1NywgJ00nLCB1J3cnKSwKICAgICgweEZGNTgsICdNJywgdSd4JyksCiAgICAoMHhGRjU5LCAnTScsIHUneScpLAogICAgKDB4RkY1QSwgJ00nLCB1J3onKSwKICAgICgweEZGNUIsICczJywgdSd7JyksCiAgICAoMHhGRjVDLCAnMycsIHUnfCcpLAogICAgKDB4RkY1RCwgJzMnLCB1J30nKSwKICAgICgweEZGNUUsICczJywgdSd+JyksCiAgICAoMHhGRjVGLCAnTScsIHUn4qaFJyksCiAgICAoMHhGRjYwLCAnTScsIHUn4qaGJyksCiAgICAoMHhGRjYxLCAnTScsIHUnLicpLAogICAgKDB4RkY2MiwgJ00nLCB1J+OAjCcpLAogICAgKDB4RkY2MywgJ00nLCB1J+OAjScpLAogICAgKDB4RkY2NCwgJ00nLCB1J+OAgScpLAogICAgKDB4RkY2NSwgJ00nLCB1J+ODuycpLAogICAgKDB4RkY2NiwgJ00nLCB1J+ODsicpLAogICAgXQoKZGVmIF9zZWdfNTAoKToKICAgIHJldHVybiBbCiAgICAoMHhGRjY3LCAnTScsIHUn44KhJyksCiAgICAoMHhGRjY4LCAnTScsIHUn44KjJyksCiAgICAoMHhGRjY5LCAnTScsIHUn44KlJyksCiAgICAoMHhGRjZBLCAnTScsIHUn44KnJyksCiAgICAoMHhGRjZCLCAnTScsIHUn44KpJyksCiAgICAoMHhGRjZDLCAnTScsIHUn44OjJyksCiAgICAoMHhGRjZELCAnTScsIHUn44OlJyksCiAgICAoMHhGRjZFLCAnTScsIHUn44OnJyksCiAgICAoMHhGRjZGLCAnTScsIHUn44ODJyksCiAgICAoMHhGRjcwLCAnTScsIHUn44O8JyksCiAgICAoMHhGRjcxLCAnTScsIHUn44KiJyksCiAgICAoMHhGRjcyLCAnTScsIHUn44KkJyksCiAgICAoMHhGRjczLCAnTScsIHUn44KmJyksCiAgICAoMHhGRjc0LCAnTScsIHUn44KoJyksCiAgICAoMHhGRjc1LCAnTScsIHUn44KqJyksCiAgICAoMHhGRjc2LCAnTScsIHUn44KrJyksCiAgICAoMHhGRjc3LCAnTScsIHUn44KtJyksCiAgICAoMHhGRjc4LCAnTScsIHUn44KvJyksCiAgICAoMHhGRjc5LCAnTScsIHUn44KxJyksCiAgICAoMHhGRjdBLCAnTScsIHUn44KzJyksCiAgICAoMHhGRjdCLCAnTScsIHUn44K1JyksCiAgICAoMHhGRjdDLCAnTScsIHUn44K3JyksCiAgICAoMHhGRjdELCAnTScsIHUn44K5JyksCiAgICAoMHhGRjdFLCAnTScsIHUn44K7JyksCiAgICAoMHhGRjdGLCAnTScsIHUn44K9JyksCiAgICAoMHhGRjgwLCAnTScsIHUn44K/JyksCiAgICAoMHhGRjgxLCAnTScsIHUn44OBJyksCiAgICAoMHhGRjgyLCAnTScsIHUn44OEJyksCiAgICAoMHhGRjgzLCAnTScsIHUn44OGJyksCiAgICAoMHhGRjg0LCAnTScsIHUn44OIJyksCiAgICAoMHhGRjg1LCAnTScsIHUn44OKJyksCiAgICAoMHhGRjg2LCAnTScsIHUn44OLJyksCiAgICAoMHhGRjg3LCAnTScsIHUn44OMJyksCiAgICAoMHhGRjg4LCAnTScsIHUn44ONJyksCiAgICAoMHhGRjg5LCAnTScsIHUn44OOJyksCiAgICAoMHhGRjhBLCAnTScsIHUn44OPJyksCiAgICAoMHhGRjhCLCAnTScsIHUn44OSJyksCiAgICAoMHhGRjhDLCAnTScsIHUn44OVJyksCiAgICAoMHhGRjhELCAnTScsIHUn44OYJyksCiAgICAoMHhGRjhFLCAnTScsIHUn44ObJyksCiAgICAoMHhGRjhGLCAnTScsIHUn44OeJyksCiAgICAoMHhGRjkwLCAnTScsIHUn44OfJyksCiAgICAoMHhGRjkxLCAnTScsIHUn44OgJyksCiAgICAoMHhGRjkyLCAnTScsIHUn44OhJyksCiAgICAoMHhGRjkzLCAnTScsIHUn44OiJyksCiAgICAoMHhGRjk0LCAnTScsIHUn44OkJyksCiAgICAoMHhGRjk1LCAnTScsIHUn44OmJyksCiAgICAoMHhGRjk2LCAnTScsIHUn44OoJyksCiAgICAoMHhGRjk3LCAnTScsIHUn44OpJyksCiAgICAoMHhGRjk4LCAnTScsIHUn44OqJyksCiAgICAoMHhGRjk5LCAnTScsIHUn44OrJyksCiAgICAoMHhGRjlBLCAnTScsIHUn44OsJyksCiAgICAoMHhGRjlCLCAnTScsIHUn44OtJyksCiAgICAoMHhGRjlDLCAnTScsIHUn44OvJyksCiAgICAoMHhGRjlELCAnTScsIHUn44OzJyksCiAgICAoMHhGRjlFLCAnTScsIHUn44KZJyksCiAgICAoMHhGRjlGLCAnTScsIHUn44KaJyksCiAgICAoMHhGRkEwLCAnWCcpLAogICAgKDB4RkZBMSwgJ00nLCB1J+GEgCcpLAogICAgKDB4RkZBMiwgJ00nLCB1J+GEgScpLAogICAgKDB4RkZBMywgJ00nLCB1J+GGqicpLAogICAgKDB4RkZBNCwgJ00nLCB1J+GEgicpLAogICAgKDB4RkZBNSwgJ00nLCB1J+GGrCcpLAogICAgKDB4RkZBNiwgJ00nLCB1J+GGrScpLAogICAgKDB4RkZBNywgJ00nLCB1J+GEgycpLAogICAgKDB4RkZBOCwgJ00nLCB1J+GEhCcpLAogICAgKDB4RkZBOSwgJ00nLCB1J+GEhScpLAogICAgKDB4RkZBQSwgJ00nLCB1J+GGsCcpLAogICAgKDB4RkZBQiwgJ00nLCB1J+GGsScpLAogICAgKDB4RkZBQywgJ00nLCB1J+GGsicpLAogICAgKDB4RkZBRCwgJ00nLCB1J+GGsycpLAogICAgKDB4RkZBRSwgJ00nLCB1J+GGtCcpLAogICAgKDB4RkZBRiwgJ00nLCB1J+GGtScpLAogICAgKDB4RkZCMCwgJ00nLCB1J+GEmicpLAogICAgKDB4RkZCMSwgJ00nLCB1J+GEhicpLAogICAgKDB4RkZCMiwgJ00nLCB1J+GEhycpLAogICAgKDB4RkZCMywgJ00nLCB1J+GEiCcpLAogICAgKDB4RkZCNCwgJ00nLCB1J+GEoScpLAogICAgKDB4RkZCNSwgJ00nLCB1J+GEiScpLAogICAgKDB4RkZCNiwgJ00nLCB1J+GEiicpLAogICAgKDB4RkZCNywgJ00nLCB1J+GEiycpLAogICAgKDB4RkZCOCwgJ00nLCB1J+GEjCcpLAogICAgKDB4RkZCOSwgJ00nLCB1J+GEjScpLAogICAgKDB4RkZCQSwgJ00nLCB1J+GEjicpLAogICAgKDB4RkZCQiwgJ00nLCB1J+GEjycpLAogICAgKDB4RkZCQywgJ00nLCB1J+GEkCcpLAogICAgKDB4RkZCRCwgJ00nLCB1J+GEkScpLAogICAgKDB4RkZCRSwgJ00nLCB1J+GEkicpLAogICAgKDB4RkZCRiwgJ1gnKSwKICAgICgweEZGQzIsICdNJywgdSfhhaEnKSwKICAgICgweEZGQzMsICdNJywgdSfhhaInKSwKICAgICgweEZGQzQsICdNJywgdSfhhaMnKSwKICAgICgweEZGQzUsICdNJywgdSfhhaQnKSwKICAgICgweEZGQzYsICdNJywgdSfhhaUnKSwKICAgICgweEZGQzcsICdNJywgdSfhhaYnKSwKICAgICgweEZGQzgsICdYJyksCiAgICAoMHhGRkNBLCAnTScsIHUn4YWnJyksCiAgICAoMHhGRkNCLCAnTScsIHUn4YWoJyksCiAgICAoMHhGRkNDLCAnTScsIHUn4YWpJyksCiAgICAoMHhGRkNELCAnTScsIHUn4YWqJyksCiAgICBdCgpkZWYgX3NlZ181MSgpOgogICAgcmV0dXJuIFsKICAgICgweEZGQ0UsICdNJywgdSfhhasnKSwKICAgICgweEZGQ0YsICdNJywgdSfhhawnKSwKICAgICgweEZGRDAsICdYJyksCiAgICAoMHhGRkQyLCAnTScsIHUn4YWtJyksCiAgICAoMHhGRkQzLCAnTScsIHUn4YWuJyksCiAgICAoMHhGRkQ0LCAnTScsIHUn4YWvJyksCiAgICAoMHhGRkQ1LCAnTScsIHUn4YWwJyksCiAgICAoMHhGRkQ2LCAnTScsIHUn4YWxJyksCiAgICAoMHhGRkQ3LCAnTScsIHUn4YWyJyksCiAgICAoMHhGRkQ4LCAnWCcpLAogICAgKDB4RkZEQSwgJ00nLCB1J+GFsycpLAogICAgKDB4RkZEQiwgJ00nLCB1J+GFtCcpLAogICAgKDB4RkZEQywgJ00nLCB1J+GFtScpLAogICAgKDB4RkZERCwgJ1gnKSwKICAgICgweEZGRTAsICdNJywgdSfCoicpLAogICAgKDB4RkZFMSwgJ00nLCB1J8KjJyksCiAgICAoMHhGRkUyLCAnTScsIHUnwqwnKSwKICAgICgweEZGRTMsICczJywgdScgzIQnKSwKICAgICgweEZGRTQsICdNJywgdSfCpicpLAogICAgKDB4RkZFNSwgJ00nLCB1J8KlJyksCiAgICAoMHhGRkU2LCAnTScsIHUn4oKpJyksCiAgICAoMHhGRkU3LCAnWCcpLAogICAgKDB4RkZFOCwgJ00nLCB1J+KUgicpLAogICAgKDB4RkZFOSwgJ00nLCB1J+KGkCcpLAogICAgKDB4RkZFQSwgJ00nLCB1J+KGkScpLAogICAgKDB4RkZFQiwgJ00nLCB1J+KGkicpLAogICAgKDB4RkZFQywgJ00nLCB1J+KGkycpLAogICAgKDB4RkZFRCwgJ00nLCB1J+KWoCcpLAogICAgKDB4RkZFRSwgJ00nLCB1J+KXiycpLAogICAgKDB4RkZFRiwgJ1gnKSwKICAgICgweDEwMDAwLCAnVicpLAogICAgKDB4MTAwMEMsICdYJyksCiAgICAoMHgxMDAwRCwgJ1YnKSwKICAgICgweDEwMDI3LCAnWCcpLAogICAgKDB4MTAwMjgsICdWJyksCiAgICAoMHgxMDAzQiwgJ1gnKSwKICAgICgweDEwMDNDLCAnVicpLAogICAgKDB4MTAwM0UsICdYJyksCiAgICAoMHgxMDAzRiwgJ1YnKSwKICAgICgweDEwMDRFLCAnWCcpLAogICAgKDB4MTAwNTAsICdWJyksCiAgICAoMHgxMDA1RSwgJ1gnKSwKICAgICgweDEwMDgwLCAnVicpLAogICAgKDB4MTAwRkIsICdYJyksCiAgICAoMHgxMDEwMCwgJ1YnKSwKICAgICgweDEwMTAzLCAnWCcpLAogICAgKDB4MTAxMDcsICdWJyksCiAgICAoMHgxMDEzNCwgJ1gnKSwKICAgICgweDEwMTM3LCAnVicpLAogICAgKDB4MTAxOEIsICdYJyksCiAgICAoMHgxMDE5MCwgJ1YnKSwKICAgICgweDEwMTlDLCAnWCcpLAogICAgKDB4MTAxRDAsICdWJyksCiAgICAoMHgxMDFGRSwgJ1gnKSwKICAgICgweDEwMjgwLCAnVicpLAogICAgKDB4MTAyOUQsICdYJyksCiAgICAoMHgxMDJBMCwgJ1YnKSwKICAgICgweDEwMkQxLCAnWCcpLAogICAgKDB4MTAzMDAsICdWJyksCiAgICAoMHgxMDMxRiwgJ1gnKSwKICAgICgweDEwMzIwLCAnVicpLAogICAgKDB4MTAzMjQsICdYJyksCiAgICAoMHgxMDMzMCwgJ1YnKSwKICAgICgweDEwMzRCLCAnWCcpLAogICAgKDB4MTAzODAsICdWJyksCiAgICAoMHgxMDM5RSwgJ1gnKSwKICAgICgweDEwMzlGLCAnVicpLAogICAgKDB4MTAzQzQsICdYJyksCiAgICAoMHgxMDNDOCwgJ1YnKSwKICAgICgweDEwM0Q2LCAnWCcpLAogICAgKDB4MTA0MDAsICdNJywgdSfwkJCoJyksCiAgICAoMHgxMDQwMSwgJ00nLCB1J/CQkKknKSwKICAgICgweDEwNDAyLCAnTScsIHUn8JCQqicpLAogICAgKDB4MTA0MDMsICdNJywgdSfwkJCrJyksCiAgICAoMHgxMDQwNCwgJ00nLCB1J/CQkKwnKSwKICAgICgweDEwNDA1LCAnTScsIHUn8JCQrScpLAogICAgKDB4MTA0MDYsICdNJywgdSfwkJCuJyksCiAgICAoMHgxMDQwNywgJ00nLCB1J/CQkK8nKSwKICAgICgweDEwNDA4LCAnTScsIHUn8JCQsCcpLAogICAgKDB4MTA0MDksICdNJywgdSfwkJCxJyksCiAgICAoMHgxMDQwQSwgJ00nLCB1J/CQkLInKSwKICAgICgweDEwNDBCLCAnTScsIHUn8JCQsycpLAogICAgKDB4MTA0MEMsICdNJywgdSfwkJC0JyksCiAgICAoMHgxMDQwRCwgJ00nLCB1J/CQkLUnKSwKICAgICgweDEwNDBFLCAnTScsIHUn8JCQticpLAogICAgKDB4MTA0MEYsICdNJywgdSfwkJC3JyksCiAgICAoMHgxMDQxMCwgJ00nLCB1J/CQkLgnKSwKICAgICgweDEwNDExLCAnTScsIHUn8JCQuScpLAogICAgKDB4MTA0MTIsICdNJywgdSfwkJC6JyksCiAgICAoMHgxMDQxMywgJ00nLCB1J/CQkLsnKSwKICAgICgweDEwNDE0LCAnTScsIHUn8JCQvCcpLAogICAgKDB4MTA0MTUsICdNJywgdSfwkJC9JyksCiAgICAoMHgxMDQxNiwgJ00nLCB1J/CQkL4nKSwKICAgICgweDEwNDE3LCAnTScsIHUn8JCQvycpLAogICAgKDB4MTA0MTgsICdNJywgdSfwkJGAJyksCiAgICAoMHgxMDQxOSwgJ00nLCB1J/CQkYEnKSwKICAgICgweDEwNDFBLCAnTScsIHUn8JCRgicpLAogICAgKDB4MTA0MUIsICdNJywgdSfwkJGDJyksCiAgICAoMHgxMDQxQywgJ00nLCB1J/CQkYQnKSwKICAgICgweDEwNDFELCAnTScsIHUn8JCRhScpLAogICAgXQoKZGVmIF9zZWdfNTIoKToKICAgIHJldHVybiBbCiAgICAoMHgxMDQxRSwgJ00nLCB1J/CQkYYnKSwKICAgICgweDEwNDFGLCAnTScsIHUn8JCRhycpLAogICAgKDB4MTA0MjAsICdNJywgdSfwkJGIJyksCiAgICAoMHgxMDQyMSwgJ00nLCB1J/CQkYknKSwKICAgICgweDEwNDIyLCAnTScsIHUn8JCRiicpLAogICAgKDB4MTA0MjMsICdNJywgdSfwkJGLJyksCiAgICAoMHgxMDQyNCwgJ00nLCB1J/CQkYwnKSwKICAgICgweDEwNDI1LCAnTScsIHUn8JCRjScpLAogICAgKDB4MTA0MjYsICdNJywgdSfwkJGOJyksCiAgICAoMHgxMDQyNywgJ00nLCB1J/CQkY8nKSwKICAgICgweDEwNDI4LCAnVicpLAogICAgKDB4MTA0OUUsICdYJyksCiAgICAoMHgxMDRBMCwgJ1YnKSwKICAgICgweDEwNEFBLCAnWCcpLAogICAgKDB4MTA4MDAsICdWJyksCiAgICAoMHgxMDgwNiwgJ1gnKSwKICAgICgweDEwODA4LCAnVicpLAogICAgKDB4MTA4MDksICdYJyksCiAgICAoMHgxMDgwQSwgJ1YnKSwKICAgICgweDEwODM2LCAnWCcpLAogICAgKDB4MTA4MzcsICdWJyksCiAgICAoMHgxMDgzOSwgJ1gnKSwKICAgICgweDEwODNDLCAnVicpLAogICAgKDB4MTA4M0QsICdYJyksCiAgICAoMHgxMDgzRiwgJ1YnKSwKICAgICgweDEwODU2LCAnWCcpLAogICAgKDB4MTA4NTcsICdWJyksCiAgICAoMHgxMDg2MCwgJ1gnKSwKICAgICgweDEwOTAwLCAnVicpLAogICAgKDB4MTA5MUMsICdYJyksCiAgICAoMHgxMDkxRiwgJ1YnKSwKICAgICgweDEwOTNBLCAnWCcpLAogICAgKDB4MTA5M0YsICdWJyksCiAgICAoMHgxMDk0MCwgJ1gnKSwKICAgICgweDEwOTgwLCAnVicpLAogICAgKDB4MTA5QjgsICdYJyksCiAgICAoMHgxMDlCRSwgJ1YnKSwKICAgICgweDEwOUMwLCAnWCcpLAogICAgKDB4MTBBMDAsICdWJyksCiAgICAoMHgxMEEwNCwgJ1gnKSwKICAgICgweDEwQTA1LCAnVicpLAogICAgKDB4MTBBMDcsICdYJyksCiAgICAoMHgxMEEwQywgJ1YnKSwKICAgICgweDEwQTE0LCAnWCcpLAogICAgKDB4MTBBMTUsICdWJyksCiAgICAoMHgxMEExOCwgJ1gnKSwKICAgICgweDEwQTE5LCAnVicpLAogICAgKDB4MTBBMzQsICdYJyksCiAgICAoMHgxMEEzOCwgJ1YnKSwKICAgICgweDEwQTNCLCAnWCcpLAogICAgKDB4MTBBM0YsICdWJyksCiAgICAoMHgxMEE0OCwgJ1gnKSwKICAgICgweDEwQTUwLCAnVicpLAogICAgKDB4MTBBNTksICdYJyksCiAgICAoMHgxMEE2MCwgJ1YnKSwKICAgICgweDEwQTgwLCAnWCcpLAogICAgKDB4MTBCMDAsICdWJyksCiAgICAoMHgxMEIzNiwgJ1gnKSwKICAgICgweDEwQjM5LCAnVicpLAogICAgKDB4MTBCNTYsICdYJyksCiAgICAoMHgxMEI1OCwgJ1YnKSwKICAgICgweDEwQjczLCAnWCcpLAogICAgKDB4MTBCNzgsICdWJyksCiAgICAoMHgxMEI4MCwgJ1gnKSwKICAgICgweDEwQzAwLCAnVicpLAogICAgKDB4MTBDNDksICdYJyksCiAgICAoMHgxMEU2MCwgJ1YnKSwKICAgICgweDEwRTdGLCAnWCcpLAogICAgKDB4MTEwMDAsICdWJyksCiAgICAoMHgxMTA0RSwgJ1gnKSwKICAgICgweDExMDUyLCAnVicpLAogICAgKDB4MTEwNzAsICdYJyksCiAgICAoMHgxMTA4MCwgJ1YnKSwKICAgICgweDExMEJELCAnWCcpLAogICAgKDB4MTEwQkUsICdWJyksCiAgICAoMHgxMTBDMiwgJ1gnKSwKICAgICgweDExMEQwLCAnVicpLAogICAgKDB4MTEwRTksICdYJyksCiAgICAoMHgxMTBGMCwgJ1YnKSwKICAgICgweDExMEZBLCAnWCcpLAogICAgKDB4MTExMDAsICdWJyksCiAgICAoMHgxMTEzNSwgJ1gnKSwKICAgICgweDExMTM2LCAnVicpLAogICAgKDB4MTExNDQsICdYJyksCiAgICAoMHgxMTE4MCwgJ1YnKSwKICAgICgweDExMUM5LCAnWCcpLAogICAgKDB4MTExRDAsICdWJyksCiAgICAoMHgxMTFEQSwgJ1gnKSwKICAgICgweDExNjgwLCAnVicpLAogICAgKDB4MTE2QjgsICdYJyksCiAgICAoMHgxMTZDMCwgJ1YnKSwKICAgICgweDExNkNBLCAnWCcpLAogICAgKDB4MTIwMDAsICdWJyksCiAgICAoMHgxMjM2RiwgJ1gnKSwKICAgICgweDEyNDAwLCAnVicpLAogICAgKDB4MTI0NjMsICdYJyksCiAgICAoMHgxMjQ3MCwgJ1YnKSwKICAgICgweDEyNDc0LCAnWCcpLAogICAgKDB4MTMwMDAsICdWJyksCiAgICAoMHgxMzQyRiwgJ1gnKSwKICAgIF0KCmRlZiBfc2VnXzUzKCk6CiAgICByZXR1cm4gWwogICAgKDB4MTY4MDAsICdWJyksCiAgICAoMHgxNkEzOSwgJ1gnKSwKICAgICgweDE2RjAwLCAnVicpLAogICAgKDB4MTZGNDUsICdYJyksCiAgICAoMHgxNkY1MCwgJ1YnKSwKICAgICgweDE2RjdGLCAnWCcpLAogICAgKDB4MTZGOEYsICdWJyksCiAgICAoMHgxNkZBMCwgJ1gnKSwKICAgICgweDFCMDAwLCAnVicpLAogICAgKDB4MUIwMDIsICdYJyksCiAgICAoMHgxRDAwMCwgJ1YnKSwKICAgICgweDFEMEY2LCAnWCcpLAogICAgKDB4MUQxMDAsICdWJyksCiAgICAoMHgxRDEyNywgJ1gnKSwKICAgICgweDFEMTI5LCAnVicpLAogICAgKDB4MUQxNUUsICdNJywgdSfwnYWX8J2FpScpLAogICAgKDB4MUQxNUYsICdNJywgdSfwnYWY8J2FpScpLAogICAgKDB4MUQxNjAsICdNJywgdSfwnYWY8J2FpfCdha4nKSwKICAgICgweDFEMTYxLCAnTScsIHUn8J2FmPCdhaXwnYWvJyksCiAgICAoMHgxRDE2MiwgJ00nLCB1J/CdhZjwnYWl8J2FsCcpLAogICAgKDB4MUQxNjMsICdNJywgdSfwnYWY8J2FpfCdhbEnKSwKICAgICgweDFEMTY0LCAnTScsIHUn8J2FmPCdhaXwnYWyJyksCiAgICAoMHgxRDE2NSwgJ1YnKSwKICAgICgweDFEMTczLCAnWCcpLAogICAgKDB4MUQxN0IsICdWJyksCiAgICAoMHgxRDFCQiwgJ00nLCB1J/CdhrnwnYWlJyksCiAgICAoMHgxRDFCQywgJ00nLCB1J/CdhrrwnYWlJyksCiAgICAoMHgxRDFCRCwgJ00nLCB1J/CdhrnwnYWl8J2FricpLAogICAgKDB4MUQxQkUsICdNJywgdSfwnYa68J2FpfCdha4nKSwKICAgICgweDFEMUJGLCAnTScsIHUn8J2GufCdhaXwnYWvJyksCiAgICAoMHgxRDFDMCwgJ00nLCB1J/CdhrrwnYWl8J2FrycpLAogICAgKDB4MUQxQzEsICdWJyksCiAgICAoMHgxRDFERSwgJ1gnKSwKICAgICgweDFEMjAwLCAnVicpLAogICAgKDB4MUQyNDYsICdYJyksCiAgICAoMHgxRDMwMCwgJ1YnKSwKICAgICgweDFEMzU3LCAnWCcpLAogICAgKDB4MUQzNjAsICdWJyksCiAgICAoMHgxRDM3MiwgJ1gnKSwKICAgICgweDFENDAwLCAnTScsIHUnYScpLAogICAgKDB4MUQ0MDEsICdNJywgdSdiJyksCiAgICAoMHgxRDQwMiwgJ00nLCB1J2MnKSwKICAgICgweDFENDAzLCAnTScsIHUnZCcpLAogICAgKDB4MUQ0MDQsICdNJywgdSdlJyksCiAgICAoMHgxRDQwNSwgJ00nLCB1J2YnKSwKICAgICgweDFENDA2LCAnTScsIHUnZycpLAogICAgKDB4MUQ0MDcsICdNJywgdSdoJyksCiAgICAoMHgxRDQwOCwgJ00nLCB1J2knKSwKICAgICgweDFENDA5LCAnTScsIHUnaicpLAogICAgKDB4MUQ0MEEsICdNJywgdSdrJyksCiAgICAoMHgxRDQwQiwgJ00nLCB1J2wnKSwKICAgICgweDFENDBDLCAnTScsIHUnbScpLAogICAgKDB4MUQ0MEQsICdNJywgdSduJyksCiAgICAoMHgxRDQwRSwgJ00nLCB1J28nKSwKICAgICgweDFENDBGLCAnTScsIHUncCcpLAogICAgKDB4MUQ0MTAsICdNJywgdSdxJyksCiAgICAoMHgxRDQxMSwgJ00nLCB1J3InKSwKICAgICgweDFENDEyLCAnTScsIHUncycpLAogICAgKDB4MUQ0MTMsICdNJywgdSd0JyksCiAgICAoMHgxRDQxNCwgJ00nLCB1J3UnKSwKICAgICgweDFENDE1LCAnTScsIHUndicpLAogICAgKDB4MUQ0MTYsICdNJywgdSd3JyksCiAgICAoMHgxRDQxNywgJ00nLCB1J3gnKSwKICAgICgweDFENDE4LCAnTScsIHUneScpLAogICAgKDB4MUQ0MTksICdNJywgdSd6JyksCiAgICAoMHgxRDQxQSwgJ00nLCB1J2EnKSwKICAgICgweDFENDFCLCAnTScsIHUnYicpLAogICAgKDB4MUQ0MUMsICdNJywgdSdjJyksCiAgICAoMHgxRDQxRCwgJ00nLCB1J2QnKSwKICAgICgweDFENDFFLCAnTScsIHUnZScpLAogICAgKDB4MUQ0MUYsICdNJywgdSdmJyksCiAgICAoMHgxRDQyMCwgJ00nLCB1J2cnKSwKICAgICgweDFENDIxLCAnTScsIHUnaCcpLAogICAgKDB4MUQ0MjIsICdNJywgdSdpJyksCiAgICAoMHgxRDQyMywgJ00nLCB1J2onKSwKICAgICgweDFENDI0LCAnTScsIHUnaycpLAogICAgKDB4MUQ0MjUsICdNJywgdSdsJyksCiAgICAoMHgxRDQyNiwgJ00nLCB1J20nKSwKICAgICgweDFENDI3LCAnTScsIHUnbicpLAogICAgKDB4MUQ0MjgsICdNJywgdSdvJyksCiAgICAoMHgxRDQyOSwgJ00nLCB1J3AnKSwKICAgICgweDFENDJBLCAnTScsIHUncScpLAogICAgKDB4MUQ0MkIsICdNJywgdSdyJyksCiAgICAoMHgxRDQyQywgJ00nLCB1J3MnKSwKICAgICgweDFENDJELCAnTScsIHUndCcpLAogICAgKDB4MUQ0MkUsICdNJywgdSd1JyksCiAgICAoMHgxRDQyRiwgJ00nLCB1J3YnKSwKICAgICgweDFENDMwLCAnTScsIHUndycpLAogICAgKDB4MUQ0MzEsICdNJywgdSd4JyksCiAgICAoMHgxRDQzMiwgJ00nLCB1J3knKSwKICAgICgweDFENDMzLCAnTScsIHUneicpLAogICAgKDB4MUQ0MzQsICdNJywgdSdhJyksCiAgICAoMHgxRDQzNSwgJ00nLCB1J2InKSwKICAgICgweDFENDM2LCAnTScsIHUnYycpLAogICAgKDB4MUQ0MzcsICdNJywgdSdkJyksCiAgICAoMHgxRDQzOCwgJ00nLCB1J2UnKSwKICAgICgweDFENDM5LCAnTScsIHUnZicpLAogICAgKDB4MUQ0M0EsICdNJywgdSdnJyksCiAgICAoMHgxRDQzQiwgJ00nLCB1J2gnKSwKICAgICgweDFENDNDLCAnTScsIHUnaScpLAogICAgXQoKZGVmIF9zZWdfNTQoKToKICAgIHJldHVybiBbCiAgICAoMHgxRDQzRCwgJ00nLCB1J2onKSwKICAgICgweDFENDNFLCAnTScsIHUnaycpLAogICAgKDB4MUQ0M0YsICdNJywgdSdsJyksCiAgICAoMHgxRDQ0MCwgJ00nLCB1J20nKSwKICAgICgweDFENDQxLCAnTScsIHUnbicpLAogICAgKDB4MUQ0NDIsICdNJywgdSdvJyksCiAgICAoMHgxRDQ0MywgJ00nLCB1J3AnKSwKICAgICgweDFENDQ0LCAnTScsIHUncScpLAogICAgKDB4MUQ0NDUsICdNJywgdSdyJyksCiAgICAoMHgxRDQ0NiwgJ00nLCB1J3MnKSwKICAgICgweDFENDQ3LCAnTScsIHUndCcpLAogICAgKDB4MUQ0NDgsICdNJywgdSd1JyksCiAgICAoMHgxRDQ0OSwgJ00nLCB1J3YnKSwKICAgICgweDFENDRBLCAnTScsIHUndycpLAogICAgKDB4MUQ0NEIsICdNJywgdSd4JyksCiAgICAoMHgxRDQ0QywgJ00nLCB1J3knKSwKICAgICgweDFENDRELCAnTScsIHUneicpLAogICAgKDB4MUQ0NEUsICdNJywgdSdhJyksCiAgICAoMHgxRDQ0RiwgJ00nLCB1J2InKSwKICAgICgweDFENDUwLCAnTScsIHUnYycpLAogICAgKDB4MUQ0NTEsICdNJywgdSdkJyksCiAgICAoMHgxRDQ1MiwgJ00nLCB1J2UnKSwKICAgICgweDFENDUzLCAnTScsIHUnZicpLAogICAgKDB4MUQ0NTQsICdNJywgdSdnJyksCiAgICAoMHgxRDQ1NSwgJ1gnKSwKICAgICgweDFENDU2LCAnTScsIHUnaScpLAogICAgKDB4MUQ0NTcsICdNJywgdSdqJyksCiAgICAoMHgxRDQ1OCwgJ00nLCB1J2snKSwKICAgICgweDFENDU5LCAnTScsIHUnbCcpLAogICAgKDB4MUQ0NUEsICdNJywgdSdtJyksCiAgICAoMHgxRDQ1QiwgJ00nLCB1J24nKSwKICAgICgweDFENDVDLCAnTScsIHUnbycpLAogICAgKDB4MUQ0NUQsICdNJywgdSdwJyksCiAgICAoMHgxRDQ1RSwgJ00nLCB1J3EnKSwKICAgICgweDFENDVGLCAnTScsIHUncicpLAogICAgKDB4MUQ0NjAsICdNJywgdSdzJyksCiAgICAoMHgxRDQ2MSwgJ00nLCB1J3QnKSwKICAgICgweDFENDYyLCAnTScsIHUndScpLAogICAgKDB4MUQ0NjMsICdNJywgdSd2JyksCiAgICAoMHgxRDQ2NCwgJ00nLCB1J3cnKSwKICAgICgweDFENDY1LCAnTScsIHUneCcpLAogICAgKDB4MUQ0NjYsICdNJywgdSd5JyksCiAgICAoMHgxRDQ2NywgJ00nLCB1J3onKSwKICAgICgweDFENDY4LCAnTScsIHUnYScpLAogICAgKDB4MUQ0NjksICdNJywgdSdiJyksCiAgICAoMHgxRDQ2QSwgJ00nLCB1J2MnKSwKICAgICgweDFENDZCLCAnTScsIHUnZCcpLAogICAgKDB4MUQ0NkMsICdNJywgdSdlJyksCiAgICAoMHgxRDQ2RCwgJ00nLCB1J2YnKSwKICAgICgweDFENDZFLCAnTScsIHUnZycpLAogICAgKDB4MUQ0NkYsICdNJywgdSdoJyksCiAgICAoMHgxRDQ3MCwgJ00nLCB1J2knKSwKICAgICgweDFENDcxLCAnTScsIHUnaicpLAogICAgKDB4MUQ0NzIsICdNJywgdSdrJyksCiAgICAoMHgxRDQ3MywgJ00nLCB1J2wnKSwKICAgICgweDFENDc0LCAnTScsIHUnbScpLAogICAgKDB4MUQ0NzUsICdNJywgdSduJyksCiAgICAoMHgxRDQ3NiwgJ00nLCB1J28nKSwKICAgICgweDFENDc3LCAnTScsIHUncCcpLAogICAgKDB4MUQ0NzgsICdNJywgdSdxJyksCiAgICAoMHgxRDQ3OSwgJ00nLCB1J3InKSwKICAgICgweDFENDdBLCAnTScsIHUncycpLAogICAgKDB4MUQ0N0IsICdNJywgdSd0JyksCiAgICAoMHgxRDQ3QywgJ00nLCB1J3UnKSwKICAgICgweDFENDdELCAnTScsIHUndicpLAogICAgKDB4MUQ0N0UsICdNJywgdSd3JyksCiAgICAoMHgxRDQ3RiwgJ00nLCB1J3gnKSwKICAgICgweDFENDgwLCAnTScsIHUneScpLAogICAgKDB4MUQ0ODEsICdNJywgdSd6JyksCiAgICAoMHgxRDQ4MiwgJ00nLCB1J2EnKSwKICAgICgweDFENDgzLCAnTScsIHUnYicpLAogICAgKDB4MUQ0ODQsICdNJywgdSdjJyksCiAgICAoMHgxRDQ4NSwgJ00nLCB1J2QnKSwKICAgICgweDFENDg2LCAnTScsIHUnZScpLAogICAgKDB4MUQ0ODcsICdNJywgdSdmJyksCiAgICAoMHgxRDQ4OCwgJ00nLCB1J2cnKSwKICAgICgweDFENDg5LCAnTScsIHUnaCcpLAogICAgKDB4MUQ0OEEsICdNJywgdSdpJyksCiAgICAoMHgxRDQ4QiwgJ00nLCB1J2onKSwKICAgICgweDFENDhDLCAnTScsIHUnaycpLAogICAgKDB4MUQ0OEQsICdNJywgdSdsJyksCiAgICAoMHgxRDQ4RSwgJ00nLCB1J20nKSwKICAgICgweDFENDhGLCAnTScsIHUnbicpLAogICAgKDB4MUQ0OTAsICdNJywgdSdvJyksCiAgICAoMHgxRDQ5MSwgJ00nLCB1J3AnKSwKICAgICgweDFENDkyLCAnTScsIHUncScpLAogICAgKDB4MUQ0OTMsICdNJywgdSdyJyksCiAgICAoMHgxRDQ5NCwgJ00nLCB1J3MnKSwKICAgICgweDFENDk1LCAnTScsIHUndCcpLAogICAgKDB4MUQ0OTYsICdNJywgdSd1JyksCiAgICAoMHgxRDQ5NywgJ00nLCB1J3YnKSwKICAgICgweDFENDk4LCAnTScsIHUndycpLAogICAgKDB4MUQ0OTksICdNJywgdSd4JyksCiAgICAoMHgxRDQ5QSwgJ00nLCB1J3knKSwKICAgICgweDFENDlCLCAnTScsIHUneicpLAogICAgKDB4MUQ0OUMsICdNJywgdSdhJyksCiAgICAoMHgxRDQ5RCwgJ1gnKSwKICAgICgweDFENDlFLCAnTScsIHUnYycpLAogICAgKDB4MUQ0OUYsICdNJywgdSdkJyksCiAgICAoMHgxRDRBMCwgJ1gnKSwKICAgIF0KCmRlZiBfc2VnXzU1KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUQ0QTIsICdNJywgdSdnJyksCiAgICAoMHgxRDRBMywgJ1gnKSwKICAgICgweDFENEE1LCAnTScsIHUnaicpLAogICAgKDB4MUQ0QTYsICdNJywgdSdrJyksCiAgICAoMHgxRDRBNywgJ1gnKSwKICAgICgweDFENEE5LCAnTScsIHUnbicpLAogICAgKDB4MUQ0QUEsICdNJywgdSdvJyksCiAgICAoMHgxRDRBQiwgJ00nLCB1J3AnKSwKICAgICgweDFENEFDLCAnTScsIHUncScpLAogICAgKDB4MUQ0QUQsICdYJyksCiAgICAoMHgxRDRBRSwgJ00nLCB1J3MnKSwKICAgICgweDFENEFGLCAnTScsIHUndCcpLAogICAgKDB4MUQ0QjAsICdNJywgdSd1JyksCiAgICAoMHgxRDRCMSwgJ00nLCB1J3YnKSwKICAgICgweDFENEIyLCAnTScsIHUndycpLAogICAgKDB4MUQ0QjMsICdNJywgdSd4JyksCiAgICAoMHgxRDRCNCwgJ00nLCB1J3knKSwKICAgICgweDFENEI1LCAnTScsIHUneicpLAogICAgKDB4MUQ0QjYsICdNJywgdSdhJyksCiAgICAoMHgxRDRCNywgJ00nLCB1J2InKSwKICAgICgweDFENEI4LCAnTScsIHUnYycpLAogICAgKDB4MUQ0QjksICdNJywgdSdkJyksCiAgICAoMHgxRDRCQSwgJ1gnKSwKICAgICgweDFENEJCLCAnTScsIHUnZicpLAogICAgKDB4MUQ0QkMsICdYJyksCiAgICAoMHgxRDRCRCwgJ00nLCB1J2gnKSwKICAgICgweDFENEJFLCAnTScsIHUnaScpLAogICAgKDB4MUQ0QkYsICdNJywgdSdqJyksCiAgICAoMHgxRDRDMCwgJ00nLCB1J2snKSwKICAgICgweDFENEMxLCAnTScsIHUnbCcpLAogICAgKDB4MUQ0QzIsICdNJywgdSdtJyksCiAgICAoMHgxRDRDMywgJ00nLCB1J24nKSwKICAgICgweDFENEM0LCAnWCcpLAogICAgKDB4MUQ0QzUsICdNJywgdSdwJyksCiAgICAoMHgxRDRDNiwgJ00nLCB1J3EnKSwKICAgICgweDFENEM3LCAnTScsIHUncicpLAogICAgKDB4MUQ0QzgsICdNJywgdSdzJyksCiAgICAoMHgxRDRDOSwgJ00nLCB1J3QnKSwKICAgICgweDFENENBLCAnTScsIHUndScpLAogICAgKDB4MUQ0Q0IsICdNJywgdSd2JyksCiAgICAoMHgxRDRDQywgJ00nLCB1J3cnKSwKICAgICgweDFENENELCAnTScsIHUneCcpLAogICAgKDB4MUQ0Q0UsICdNJywgdSd5JyksCiAgICAoMHgxRDRDRiwgJ00nLCB1J3onKSwKICAgICgweDFENEQwLCAnTScsIHUnYScpLAogICAgKDB4MUQ0RDEsICdNJywgdSdiJyksCiAgICAoMHgxRDREMiwgJ00nLCB1J2MnKSwKICAgICgweDFENEQzLCAnTScsIHUnZCcpLAogICAgKDB4MUQ0RDQsICdNJywgdSdlJyksCiAgICAoMHgxRDRENSwgJ00nLCB1J2YnKSwKICAgICgweDFENEQ2LCAnTScsIHUnZycpLAogICAgKDB4MUQ0RDcsICdNJywgdSdoJyksCiAgICAoMHgxRDREOCwgJ00nLCB1J2knKSwKICAgICgweDFENEQ5LCAnTScsIHUnaicpLAogICAgKDB4MUQ0REEsICdNJywgdSdrJyksCiAgICAoMHgxRDREQiwgJ00nLCB1J2wnKSwKICAgICgweDFENERDLCAnTScsIHUnbScpLAogICAgKDB4MUQ0REQsICdNJywgdSduJyksCiAgICAoMHgxRDRERSwgJ00nLCB1J28nKSwKICAgICgweDFENERGLCAnTScsIHUncCcpLAogICAgKDB4MUQ0RTAsICdNJywgdSdxJyksCiAgICAoMHgxRDRFMSwgJ00nLCB1J3InKSwKICAgICgweDFENEUyLCAnTScsIHUncycpLAogICAgKDB4MUQ0RTMsICdNJywgdSd0JyksCiAgICAoMHgxRDRFNCwgJ00nLCB1J3UnKSwKICAgICgweDFENEU1LCAnTScsIHUndicpLAogICAgKDB4MUQ0RTYsICdNJywgdSd3JyksCiAgICAoMHgxRDRFNywgJ00nLCB1J3gnKSwKICAgICgweDFENEU4LCAnTScsIHUneScpLAogICAgKDB4MUQ0RTksICdNJywgdSd6JyksCiAgICAoMHgxRDRFQSwgJ00nLCB1J2EnKSwKICAgICgweDFENEVCLCAnTScsIHUnYicpLAogICAgKDB4MUQ0RUMsICdNJywgdSdjJyksCiAgICAoMHgxRDRFRCwgJ00nLCB1J2QnKSwKICAgICgweDFENEVFLCAnTScsIHUnZScpLAogICAgKDB4MUQ0RUYsICdNJywgdSdmJyksCiAgICAoMHgxRDRGMCwgJ00nLCB1J2cnKSwKICAgICgweDFENEYxLCAnTScsIHUnaCcpLAogICAgKDB4MUQ0RjIsICdNJywgdSdpJyksCiAgICAoMHgxRDRGMywgJ00nLCB1J2onKSwKICAgICgweDFENEY0LCAnTScsIHUnaycpLAogICAgKDB4MUQ0RjUsICdNJywgdSdsJyksCiAgICAoMHgxRDRGNiwgJ00nLCB1J20nKSwKICAgICgweDFENEY3LCAnTScsIHUnbicpLAogICAgKDB4MUQ0RjgsICdNJywgdSdvJyksCiAgICAoMHgxRDRGOSwgJ00nLCB1J3AnKSwKICAgICgweDFENEZBLCAnTScsIHUncScpLAogICAgKDB4MUQ0RkIsICdNJywgdSdyJyksCiAgICAoMHgxRDRGQywgJ00nLCB1J3MnKSwKICAgICgweDFENEZELCAnTScsIHUndCcpLAogICAgKDB4MUQ0RkUsICdNJywgdSd1JyksCiAgICAoMHgxRDRGRiwgJ00nLCB1J3YnKSwKICAgICgweDFENTAwLCAnTScsIHUndycpLAogICAgKDB4MUQ1MDEsICdNJywgdSd4JyksCiAgICAoMHgxRDUwMiwgJ00nLCB1J3knKSwKICAgICgweDFENTAzLCAnTScsIHUneicpLAogICAgKDB4MUQ1MDQsICdNJywgdSdhJyksCiAgICAoMHgxRDUwNSwgJ00nLCB1J2InKSwKICAgICgweDFENTA2LCAnWCcpLAogICAgKDB4MUQ1MDcsICdNJywgdSdkJyksCiAgICBdCgpkZWYgX3NlZ181NigpOgogICAgcmV0dXJuIFsKICAgICgweDFENTA4LCAnTScsIHUnZScpLAogICAgKDB4MUQ1MDksICdNJywgdSdmJyksCiAgICAoMHgxRDUwQSwgJ00nLCB1J2cnKSwKICAgICgweDFENTBCLCAnWCcpLAogICAgKDB4MUQ1MEQsICdNJywgdSdqJyksCiAgICAoMHgxRDUwRSwgJ00nLCB1J2snKSwKICAgICgweDFENTBGLCAnTScsIHUnbCcpLAogICAgKDB4MUQ1MTAsICdNJywgdSdtJyksCiAgICAoMHgxRDUxMSwgJ00nLCB1J24nKSwKICAgICgweDFENTEyLCAnTScsIHUnbycpLAogICAgKDB4MUQ1MTMsICdNJywgdSdwJyksCiAgICAoMHgxRDUxNCwgJ00nLCB1J3EnKSwKICAgICgweDFENTE1LCAnWCcpLAogICAgKDB4MUQ1MTYsICdNJywgdSdzJyksCiAgICAoMHgxRDUxNywgJ00nLCB1J3QnKSwKICAgICgweDFENTE4LCAnTScsIHUndScpLAogICAgKDB4MUQ1MTksICdNJywgdSd2JyksCiAgICAoMHgxRDUxQSwgJ00nLCB1J3cnKSwKICAgICgweDFENTFCLCAnTScsIHUneCcpLAogICAgKDB4MUQ1MUMsICdNJywgdSd5JyksCiAgICAoMHgxRDUxRCwgJ1gnKSwKICAgICgweDFENTFFLCAnTScsIHUnYScpLAogICAgKDB4MUQ1MUYsICdNJywgdSdiJyksCiAgICAoMHgxRDUyMCwgJ00nLCB1J2MnKSwKICAgICgweDFENTIxLCAnTScsIHUnZCcpLAogICAgKDB4MUQ1MjIsICdNJywgdSdlJyksCiAgICAoMHgxRDUyMywgJ00nLCB1J2YnKSwKICAgICgweDFENTI0LCAnTScsIHUnZycpLAogICAgKDB4MUQ1MjUsICdNJywgdSdoJyksCiAgICAoMHgxRDUyNiwgJ00nLCB1J2knKSwKICAgICgweDFENTI3LCAnTScsIHUnaicpLAogICAgKDB4MUQ1MjgsICdNJywgdSdrJyksCiAgICAoMHgxRDUyOSwgJ00nLCB1J2wnKSwKICAgICgweDFENTJBLCAnTScsIHUnbScpLAogICAgKDB4MUQ1MkIsICdNJywgdSduJyksCiAgICAoMHgxRDUyQywgJ00nLCB1J28nKSwKICAgICgweDFENTJELCAnTScsIHUncCcpLAogICAgKDB4MUQ1MkUsICdNJywgdSdxJyksCiAgICAoMHgxRDUyRiwgJ00nLCB1J3InKSwKICAgICgweDFENTMwLCAnTScsIHUncycpLAogICAgKDB4MUQ1MzEsICdNJywgdSd0JyksCiAgICAoMHgxRDUzMiwgJ00nLCB1J3UnKSwKICAgICgweDFENTMzLCAnTScsIHUndicpLAogICAgKDB4MUQ1MzQsICdNJywgdSd3JyksCiAgICAoMHgxRDUzNSwgJ00nLCB1J3gnKSwKICAgICgweDFENTM2LCAnTScsIHUneScpLAogICAgKDB4MUQ1MzcsICdNJywgdSd6JyksCiAgICAoMHgxRDUzOCwgJ00nLCB1J2EnKSwKICAgICgweDFENTM5LCAnTScsIHUnYicpLAogICAgKDB4MUQ1M0EsICdYJyksCiAgICAoMHgxRDUzQiwgJ00nLCB1J2QnKSwKICAgICgweDFENTNDLCAnTScsIHUnZScpLAogICAgKDB4MUQ1M0QsICdNJywgdSdmJyksCiAgICAoMHgxRDUzRSwgJ00nLCB1J2cnKSwKICAgICgweDFENTNGLCAnWCcpLAogICAgKDB4MUQ1NDAsICdNJywgdSdpJyksCiAgICAoMHgxRDU0MSwgJ00nLCB1J2onKSwKICAgICgweDFENTQyLCAnTScsIHUnaycpLAogICAgKDB4MUQ1NDMsICdNJywgdSdsJyksCiAgICAoMHgxRDU0NCwgJ00nLCB1J20nKSwKICAgICgweDFENTQ1LCAnWCcpLAogICAgKDB4MUQ1NDYsICdNJywgdSdvJyksCiAgICAoMHgxRDU0NywgJ1gnKSwKICAgICgweDFENTRBLCAnTScsIHUncycpLAogICAgKDB4MUQ1NEIsICdNJywgdSd0JyksCiAgICAoMHgxRDU0QywgJ00nLCB1J3UnKSwKICAgICgweDFENTRELCAnTScsIHUndicpLAogICAgKDB4MUQ1NEUsICdNJywgdSd3JyksCiAgICAoMHgxRDU0RiwgJ00nLCB1J3gnKSwKICAgICgweDFENTUwLCAnTScsIHUneScpLAogICAgKDB4MUQ1NTEsICdYJyksCiAgICAoMHgxRDU1MiwgJ00nLCB1J2EnKSwKICAgICgweDFENTUzLCAnTScsIHUnYicpLAogICAgKDB4MUQ1NTQsICdNJywgdSdjJyksCiAgICAoMHgxRDU1NSwgJ00nLCB1J2QnKSwKICAgICgweDFENTU2LCAnTScsIHUnZScpLAogICAgKDB4MUQ1NTcsICdNJywgdSdmJyksCiAgICAoMHgxRDU1OCwgJ00nLCB1J2cnKSwKICAgICgweDFENTU5LCAnTScsIHUnaCcpLAogICAgKDB4MUQ1NUEsICdNJywgdSdpJyksCiAgICAoMHgxRDU1QiwgJ00nLCB1J2onKSwKICAgICgweDFENTVDLCAnTScsIHUnaycpLAogICAgKDB4MUQ1NUQsICdNJywgdSdsJyksCiAgICAoMHgxRDU1RSwgJ00nLCB1J20nKSwKICAgICgweDFENTVGLCAnTScsIHUnbicpLAogICAgKDB4MUQ1NjAsICdNJywgdSdvJyksCiAgICAoMHgxRDU2MSwgJ00nLCB1J3AnKSwKICAgICgweDFENTYyLCAnTScsIHUncScpLAogICAgKDB4MUQ1NjMsICdNJywgdSdyJyksCiAgICAoMHgxRDU2NCwgJ00nLCB1J3MnKSwKICAgICgweDFENTY1LCAnTScsIHUndCcpLAogICAgKDB4MUQ1NjYsICdNJywgdSd1JyksCiAgICAoMHgxRDU2NywgJ00nLCB1J3YnKSwKICAgICgweDFENTY4LCAnTScsIHUndycpLAogICAgKDB4MUQ1NjksICdNJywgdSd4JyksCiAgICAoMHgxRDU2QSwgJ00nLCB1J3knKSwKICAgICgweDFENTZCLCAnTScsIHUneicpLAogICAgKDB4MUQ1NkMsICdNJywgdSdhJyksCiAgICAoMHgxRDU2RCwgJ00nLCB1J2InKSwKICAgICgweDFENTZFLCAnTScsIHUnYycpLAogICAgXQoKZGVmIF9zZWdfNTcoKToKICAgIHJldHVybiBbCiAgICAoMHgxRDU2RiwgJ00nLCB1J2QnKSwKICAgICgweDFENTcwLCAnTScsIHUnZScpLAogICAgKDB4MUQ1NzEsICdNJywgdSdmJyksCiAgICAoMHgxRDU3MiwgJ00nLCB1J2cnKSwKICAgICgweDFENTczLCAnTScsIHUnaCcpLAogICAgKDB4MUQ1NzQsICdNJywgdSdpJyksCiAgICAoMHgxRDU3NSwgJ00nLCB1J2onKSwKICAgICgweDFENTc2LCAnTScsIHUnaycpLAogICAgKDB4MUQ1NzcsICdNJywgdSdsJyksCiAgICAoMHgxRDU3OCwgJ00nLCB1J20nKSwKICAgICgweDFENTc5LCAnTScsIHUnbicpLAogICAgKDB4MUQ1N0EsICdNJywgdSdvJyksCiAgICAoMHgxRDU3QiwgJ00nLCB1J3AnKSwKICAgICgweDFENTdDLCAnTScsIHUncScpLAogICAgKDB4MUQ1N0QsICdNJywgdSdyJyksCiAgICAoMHgxRDU3RSwgJ00nLCB1J3MnKSwKICAgICgweDFENTdGLCAnTScsIHUndCcpLAogICAgKDB4MUQ1ODAsICdNJywgdSd1JyksCiAgICAoMHgxRDU4MSwgJ00nLCB1J3YnKSwKICAgICgweDFENTgyLCAnTScsIHUndycpLAogICAgKDB4MUQ1ODMsICdNJywgdSd4JyksCiAgICAoMHgxRDU4NCwgJ00nLCB1J3knKSwKICAgICgweDFENTg1LCAnTScsIHUneicpLAogICAgKDB4MUQ1ODYsICdNJywgdSdhJyksCiAgICAoMHgxRDU4NywgJ00nLCB1J2InKSwKICAgICgweDFENTg4LCAnTScsIHUnYycpLAogICAgKDB4MUQ1ODksICdNJywgdSdkJyksCiAgICAoMHgxRDU4QSwgJ00nLCB1J2UnKSwKICAgICgweDFENThCLCAnTScsIHUnZicpLAogICAgKDB4MUQ1OEMsICdNJywgdSdnJyksCiAgICAoMHgxRDU4RCwgJ00nLCB1J2gnKSwKICAgICgweDFENThFLCAnTScsIHUnaScpLAogICAgKDB4MUQ1OEYsICdNJywgdSdqJyksCiAgICAoMHgxRDU5MCwgJ00nLCB1J2snKSwKICAgICgweDFENTkxLCAnTScsIHUnbCcpLAogICAgKDB4MUQ1OTIsICdNJywgdSdtJyksCiAgICAoMHgxRDU5MywgJ00nLCB1J24nKSwKICAgICgweDFENTk0LCAnTScsIHUnbycpLAogICAgKDB4MUQ1OTUsICdNJywgdSdwJyksCiAgICAoMHgxRDU5NiwgJ00nLCB1J3EnKSwKICAgICgweDFENTk3LCAnTScsIHUncicpLAogICAgKDB4MUQ1OTgsICdNJywgdSdzJyksCiAgICAoMHgxRDU5OSwgJ00nLCB1J3QnKSwKICAgICgweDFENTlBLCAnTScsIHUndScpLAogICAgKDB4MUQ1OUIsICdNJywgdSd2JyksCiAgICAoMHgxRDU5QywgJ00nLCB1J3cnKSwKICAgICgweDFENTlELCAnTScsIHUneCcpLAogICAgKDB4MUQ1OUUsICdNJywgdSd5JyksCiAgICAoMHgxRDU5RiwgJ00nLCB1J3onKSwKICAgICgweDFENUEwLCAnTScsIHUnYScpLAogICAgKDB4MUQ1QTEsICdNJywgdSdiJyksCiAgICAoMHgxRDVBMiwgJ00nLCB1J2MnKSwKICAgICgweDFENUEzLCAnTScsIHUnZCcpLAogICAgKDB4MUQ1QTQsICdNJywgdSdlJyksCiAgICAoMHgxRDVBNSwgJ00nLCB1J2YnKSwKICAgICgweDFENUE2LCAnTScsIHUnZycpLAogICAgKDB4MUQ1QTcsICdNJywgdSdoJyksCiAgICAoMHgxRDVBOCwgJ00nLCB1J2knKSwKICAgICgweDFENUE5LCAnTScsIHUnaicpLAogICAgKDB4MUQ1QUEsICdNJywgdSdrJyksCiAgICAoMHgxRDVBQiwgJ00nLCB1J2wnKSwKICAgICgweDFENUFDLCAnTScsIHUnbScpLAogICAgKDB4MUQ1QUQsICdNJywgdSduJyksCiAgICAoMHgxRDVBRSwgJ00nLCB1J28nKSwKICAgICgweDFENUFGLCAnTScsIHUncCcpLAogICAgKDB4MUQ1QjAsICdNJywgdSdxJyksCiAgICAoMHgxRDVCMSwgJ00nLCB1J3InKSwKICAgICgweDFENUIyLCAnTScsIHUncycpLAogICAgKDB4MUQ1QjMsICdNJywgdSd0JyksCiAgICAoMHgxRDVCNCwgJ00nLCB1J3UnKSwKICAgICgweDFENUI1LCAnTScsIHUndicpLAogICAgKDB4MUQ1QjYsICdNJywgdSd3JyksCiAgICAoMHgxRDVCNywgJ00nLCB1J3gnKSwKICAgICgweDFENUI4LCAnTScsIHUneScpLAogICAgKDB4MUQ1QjksICdNJywgdSd6JyksCiAgICAoMHgxRDVCQSwgJ00nLCB1J2EnKSwKICAgICgweDFENUJCLCAnTScsIHUnYicpLAogICAgKDB4MUQ1QkMsICdNJywgdSdjJyksCiAgICAoMHgxRDVCRCwgJ00nLCB1J2QnKSwKICAgICgweDFENUJFLCAnTScsIHUnZScpLAogICAgKDB4MUQ1QkYsICdNJywgdSdmJyksCiAgICAoMHgxRDVDMCwgJ00nLCB1J2cnKSwKICAgICgweDFENUMxLCAnTScsIHUnaCcpLAogICAgKDB4MUQ1QzIsICdNJywgdSdpJyksCiAgICAoMHgxRDVDMywgJ00nLCB1J2onKSwKICAgICgweDFENUM0LCAnTScsIHUnaycpLAogICAgKDB4MUQ1QzUsICdNJywgdSdsJyksCiAgICAoMHgxRDVDNiwgJ00nLCB1J20nKSwKICAgICgweDFENUM3LCAnTScsIHUnbicpLAogICAgKDB4MUQ1QzgsICdNJywgdSdvJyksCiAgICAoMHgxRDVDOSwgJ00nLCB1J3AnKSwKICAgICgweDFENUNBLCAnTScsIHUncScpLAogICAgKDB4MUQ1Q0IsICdNJywgdSdyJyksCiAgICAoMHgxRDVDQywgJ00nLCB1J3MnKSwKICAgICgweDFENUNELCAnTScsIHUndCcpLAogICAgKDB4MUQ1Q0UsICdNJywgdSd1JyksCiAgICAoMHgxRDVDRiwgJ00nLCB1J3YnKSwKICAgICgweDFENUQwLCAnTScsIHUndycpLAogICAgKDB4MUQ1RDEsICdNJywgdSd4JyksCiAgICAoMHgxRDVEMiwgJ00nLCB1J3knKSwKICAgIF0KCmRlZiBfc2VnXzU4KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUQ1RDMsICdNJywgdSd6JyksCiAgICAoMHgxRDVENCwgJ00nLCB1J2EnKSwKICAgICgweDFENUQ1LCAnTScsIHUnYicpLAogICAgKDB4MUQ1RDYsICdNJywgdSdjJyksCiAgICAoMHgxRDVENywgJ00nLCB1J2QnKSwKICAgICgweDFENUQ4LCAnTScsIHUnZScpLAogICAgKDB4MUQ1RDksICdNJywgdSdmJyksCiAgICAoMHgxRDVEQSwgJ00nLCB1J2cnKSwKICAgICgweDFENURCLCAnTScsIHUnaCcpLAogICAgKDB4MUQ1REMsICdNJywgdSdpJyksCiAgICAoMHgxRDVERCwgJ00nLCB1J2onKSwKICAgICgweDFENURFLCAnTScsIHUnaycpLAogICAgKDB4MUQ1REYsICdNJywgdSdsJyksCiAgICAoMHgxRDVFMCwgJ00nLCB1J20nKSwKICAgICgweDFENUUxLCAnTScsIHUnbicpLAogICAgKDB4MUQ1RTIsICdNJywgdSdvJyksCiAgICAoMHgxRDVFMywgJ00nLCB1J3AnKSwKICAgICgweDFENUU0LCAnTScsIHUncScpLAogICAgKDB4MUQ1RTUsICdNJywgdSdyJyksCiAgICAoMHgxRDVFNiwgJ00nLCB1J3MnKSwKICAgICgweDFENUU3LCAnTScsIHUndCcpLAogICAgKDB4MUQ1RTgsICdNJywgdSd1JyksCiAgICAoMHgxRDVFOSwgJ00nLCB1J3YnKSwKICAgICgweDFENUVBLCAnTScsIHUndycpLAogICAgKDB4MUQ1RUIsICdNJywgdSd4JyksCiAgICAoMHgxRDVFQywgJ00nLCB1J3knKSwKICAgICgweDFENUVELCAnTScsIHUneicpLAogICAgKDB4MUQ1RUUsICdNJywgdSdhJyksCiAgICAoMHgxRDVFRiwgJ00nLCB1J2InKSwKICAgICgweDFENUYwLCAnTScsIHUnYycpLAogICAgKDB4MUQ1RjEsICdNJywgdSdkJyksCiAgICAoMHgxRDVGMiwgJ00nLCB1J2UnKSwKICAgICgweDFENUYzLCAnTScsIHUnZicpLAogICAgKDB4MUQ1RjQsICdNJywgdSdnJyksCiAgICAoMHgxRDVGNSwgJ00nLCB1J2gnKSwKICAgICgweDFENUY2LCAnTScsIHUnaScpLAogICAgKDB4MUQ1RjcsICdNJywgdSdqJyksCiAgICAoMHgxRDVGOCwgJ00nLCB1J2snKSwKICAgICgweDFENUY5LCAnTScsIHUnbCcpLAogICAgKDB4MUQ1RkEsICdNJywgdSdtJyksCiAgICAoMHgxRDVGQiwgJ00nLCB1J24nKSwKICAgICgweDFENUZDLCAnTScsIHUnbycpLAogICAgKDB4MUQ1RkQsICdNJywgdSdwJyksCiAgICAoMHgxRDVGRSwgJ00nLCB1J3EnKSwKICAgICgweDFENUZGLCAnTScsIHUncicpLAogICAgKDB4MUQ2MDAsICdNJywgdSdzJyksCiAgICAoMHgxRDYwMSwgJ00nLCB1J3QnKSwKICAgICgweDFENjAyLCAnTScsIHUndScpLAogICAgKDB4MUQ2MDMsICdNJywgdSd2JyksCiAgICAoMHgxRDYwNCwgJ00nLCB1J3cnKSwKICAgICgweDFENjA1LCAnTScsIHUneCcpLAogICAgKDB4MUQ2MDYsICdNJywgdSd5JyksCiAgICAoMHgxRDYwNywgJ00nLCB1J3onKSwKICAgICgweDFENjA4LCAnTScsIHUnYScpLAogICAgKDB4MUQ2MDksICdNJywgdSdiJyksCiAgICAoMHgxRDYwQSwgJ00nLCB1J2MnKSwKICAgICgweDFENjBCLCAnTScsIHUnZCcpLAogICAgKDB4MUQ2MEMsICdNJywgdSdlJyksCiAgICAoMHgxRDYwRCwgJ00nLCB1J2YnKSwKICAgICgweDFENjBFLCAnTScsIHUnZycpLAogICAgKDB4MUQ2MEYsICdNJywgdSdoJyksCiAgICAoMHgxRDYxMCwgJ00nLCB1J2knKSwKICAgICgweDFENjExLCAnTScsIHUnaicpLAogICAgKDB4MUQ2MTIsICdNJywgdSdrJyksCiAgICAoMHgxRDYxMywgJ00nLCB1J2wnKSwKICAgICgweDFENjE0LCAnTScsIHUnbScpLAogICAgKDB4MUQ2MTUsICdNJywgdSduJyksCiAgICAoMHgxRDYxNiwgJ00nLCB1J28nKSwKICAgICgweDFENjE3LCAnTScsIHUncCcpLAogICAgKDB4MUQ2MTgsICdNJywgdSdxJyksCiAgICAoMHgxRDYxOSwgJ00nLCB1J3InKSwKICAgICgweDFENjFBLCAnTScsIHUncycpLAogICAgKDB4MUQ2MUIsICdNJywgdSd0JyksCiAgICAoMHgxRDYxQywgJ00nLCB1J3UnKSwKICAgICgweDFENjFELCAnTScsIHUndicpLAogICAgKDB4MUQ2MUUsICdNJywgdSd3JyksCiAgICAoMHgxRDYxRiwgJ00nLCB1J3gnKSwKICAgICgweDFENjIwLCAnTScsIHUneScpLAogICAgKDB4MUQ2MjEsICdNJywgdSd6JyksCiAgICAoMHgxRDYyMiwgJ00nLCB1J2EnKSwKICAgICgweDFENjIzLCAnTScsIHUnYicpLAogICAgKDB4MUQ2MjQsICdNJywgdSdjJyksCiAgICAoMHgxRDYyNSwgJ00nLCB1J2QnKSwKICAgICgweDFENjI2LCAnTScsIHUnZScpLAogICAgKDB4MUQ2MjcsICdNJywgdSdmJyksCiAgICAoMHgxRDYyOCwgJ00nLCB1J2cnKSwKICAgICgweDFENjI5LCAnTScsIHUnaCcpLAogICAgKDB4MUQ2MkEsICdNJywgdSdpJyksCiAgICAoMHgxRDYyQiwgJ00nLCB1J2onKSwKICAgICgweDFENjJDLCAnTScsIHUnaycpLAogICAgKDB4MUQ2MkQsICdNJywgdSdsJyksCiAgICAoMHgxRDYyRSwgJ00nLCB1J20nKSwKICAgICgweDFENjJGLCAnTScsIHUnbicpLAogICAgKDB4MUQ2MzAsICdNJywgdSdvJyksCiAgICAoMHgxRDYzMSwgJ00nLCB1J3AnKSwKICAgICgweDFENjMyLCAnTScsIHUncScpLAogICAgKDB4MUQ2MzMsICdNJywgdSdyJyksCiAgICAoMHgxRDYzNCwgJ00nLCB1J3MnKSwKICAgICgweDFENjM1LCAnTScsIHUndCcpLAogICAgKDB4MUQ2MzYsICdNJywgdSd1JyksCiAgICBdCgpkZWYgX3NlZ181OSgpOgogICAgcmV0dXJuIFsKICAgICgweDFENjM3LCAnTScsIHUndicpLAogICAgKDB4MUQ2MzgsICdNJywgdSd3JyksCiAgICAoMHgxRDYzOSwgJ00nLCB1J3gnKSwKICAgICgweDFENjNBLCAnTScsIHUneScpLAogICAgKDB4MUQ2M0IsICdNJywgdSd6JyksCiAgICAoMHgxRDYzQywgJ00nLCB1J2EnKSwKICAgICgweDFENjNELCAnTScsIHUnYicpLAogICAgKDB4MUQ2M0UsICdNJywgdSdjJyksCiAgICAoMHgxRDYzRiwgJ00nLCB1J2QnKSwKICAgICgweDFENjQwLCAnTScsIHUnZScpLAogICAgKDB4MUQ2NDEsICdNJywgdSdmJyksCiAgICAoMHgxRDY0MiwgJ00nLCB1J2cnKSwKICAgICgweDFENjQzLCAnTScsIHUnaCcpLAogICAgKDB4MUQ2NDQsICdNJywgdSdpJyksCiAgICAoMHgxRDY0NSwgJ00nLCB1J2onKSwKICAgICgweDFENjQ2LCAnTScsIHUnaycpLAogICAgKDB4MUQ2NDcsICdNJywgdSdsJyksCiAgICAoMHgxRDY0OCwgJ00nLCB1J20nKSwKICAgICgweDFENjQ5LCAnTScsIHUnbicpLAogICAgKDB4MUQ2NEEsICdNJywgdSdvJyksCiAgICAoMHgxRDY0QiwgJ00nLCB1J3AnKSwKICAgICgweDFENjRDLCAnTScsIHUncScpLAogICAgKDB4MUQ2NEQsICdNJywgdSdyJyksCiAgICAoMHgxRDY0RSwgJ00nLCB1J3MnKSwKICAgICgweDFENjRGLCAnTScsIHUndCcpLAogICAgKDB4MUQ2NTAsICdNJywgdSd1JyksCiAgICAoMHgxRDY1MSwgJ00nLCB1J3YnKSwKICAgICgweDFENjUyLCAnTScsIHUndycpLAogICAgKDB4MUQ2NTMsICdNJywgdSd4JyksCiAgICAoMHgxRDY1NCwgJ00nLCB1J3knKSwKICAgICgweDFENjU1LCAnTScsIHUneicpLAogICAgKDB4MUQ2NTYsICdNJywgdSdhJyksCiAgICAoMHgxRDY1NywgJ00nLCB1J2InKSwKICAgICgweDFENjU4LCAnTScsIHUnYycpLAogICAgKDB4MUQ2NTksICdNJywgdSdkJyksCiAgICAoMHgxRDY1QSwgJ00nLCB1J2UnKSwKICAgICgweDFENjVCLCAnTScsIHUnZicpLAogICAgKDB4MUQ2NUMsICdNJywgdSdnJyksCiAgICAoMHgxRDY1RCwgJ00nLCB1J2gnKSwKICAgICgweDFENjVFLCAnTScsIHUnaScpLAogICAgKDB4MUQ2NUYsICdNJywgdSdqJyksCiAgICAoMHgxRDY2MCwgJ00nLCB1J2snKSwKICAgICgweDFENjYxLCAnTScsIHUnbCcpLAogICAgKDB4MUQ2NjIsICdNJywgdSdtJyksCiAgICAoMHgxRDY2MywgJ00nLCB1J24nKSwKICAgICgweDFENjY0LCAnTScsIHUnbycpLAogICAgKDB4MUQ2NjUsICdNJywgdSdwJyksCiAgICAoMHgxRDY2NiwgJ00nLCB1J3EnKSwKICAgICgweDFENjY3LCAnTScsIHUncicpLAogICAgKDB4MUQ2NjgsICdNJywgdSdzJyksCiAgICAoMHgxRDY2OSwgJ00nLCB1J3QnKSwKICAgICgweDFENjZBLCAnTScsIHUndScpLAogICAgKDB4MUQ2NkIsICdNJywgdSd2JyksCiAgICAoMHgxRDY2QywgJ00nLCB1J3cnKSwKICAgICgweDFENjZELCAnTScsIHUneCcpLAogICAgKDB4MUQ2NkUsICdNJywgdSd5JyksCiAgICAoMHgxRDY2RiwgJ00nLCB1J3onKSwKICAgICgweDFENjcwLCAnTScsIHUnYScpLAogICAgKDB4MUQ2NzEsICdNJywgdSdiJyksCiAgICAoMHgxRDY3MiwgJ00nLCB1J2MnKSwKICAgICgweDFENjczLCAnTScsIHUnZCcpLAogICAgKDB4MUQ2NzQsICdNJywgdSdlJyksCiAgICAoMHgxRDY3NSwgJ00nLCB1J2YnKSwKICAgICgweDFENjc2LCAnTScsIHUnZycpLAogICAgKDB4MUQ2NzcsICdNJywgdSdoJyksCiAgICAoMHgxRDY3OCwgJ00nLCB1J2knKSwKICAgICgweDFENjc5LCAnTScsIHUnaicpLAogICAgKDB4MUQ2N0EsICdNJywgdSdrJyksCiAgICAoMHgxRDY3QiwgJ00nLCB1J2wnKSwKICAgICgweDFENjdDLCAnTScsIHUnbScpLAogICAgKDB4MUQ2N0QsICdNJywgdSduJyksCiAgICAoMHgxRDY3RSwgJ00nLCB1J28nKSwKICAgICgweDFENjdGLCAnTScsIHUncCcpLAogICAgKDB4MUQ2ODAsICdNJywgdSdxJyksCiAgICAoMHgxRDY4MSwgJ00nLCB1J3InKSwKICAgICgweDFENjgyLCAnTScsIHUncycpLAogICAgKDB4MUQ2ODMsICdNJywgdSd0JyksCiAgICAoMHgxRDY4NCwgJ00nLCB1J3UnKSwKICAgICgweDFENjg1LCAnTScsIHUndicpLAogICAgKDB4MUQ2ODYsICdNJywgdSd3JyksCiAgICAoMHgxRDY4NywgJ00nLCB1J3gnKSwKICAgICgweDFENjg4LCAnTScsIHUneScpLAogICAgKDB4MUQ2ODksICdNJywgdSd6JyksCiAgICAoMHgxRDY4QSwgJ00nLCB1J2EnKSwKICAgICgweDFENjhCLCAnTScsIHUnYicpLAogICAgKDB4MUQ2OEMsICdNJywgdSdjJyksCiAgICAoMHgxRDY4RCwgJ00nLCB1J2QnKSwKICAgICgweDFENjhFLCAnTScsIHUnZScpLAogICAgKDB4MUQ2OEYsICdNJywgdSdmJyksCiAgICAoMHgxRDY5MCwgJ00nLCB1J2cnKSwKICAgICgweDFENjkxLCAnTScsIHUnaCcpLAogICAgKDB4MUQ2OTIsICdNJywgdSdpJyksCiAgICAoMHgxRDY5MywgJ00nLCB1J2onKSwKICAgICgweDFENjk0LCAnTScsIHUnaycpLAogICAgKDB4MUQ2OTUsICdNJywgdSdsJyksCiAgICAoMHgxRDY5NiwgJ00nLCB1J20nKSwKICAgICgweDFENjk3LCAnTScsIHUnbicpLAogICAgKDB4MUQ2OTgsICdNJywgdSdvJyksCiAgICAoMHgxRDY5OSwgJ00nLCB1J3AnKSwKICAgICgweDFENjlBLCAnTScsIHUncScpLAogICAgXQoKZGVmIF9zZWdfNjAoKToKICAgIHJldHVybiBbCiAgICAoMHgxRDY5QiwgJ00nLCB1J3InKSwKICAgICgweDFENjlDLCAnTScsIHUncycpLAogICAgKDB4MUQ2OUQsICdNJywgdSd0JyksCiAgICAoMHgxRDY5RSwgJ00nLCB1J3UnKSwKICAgICgweDFENjlGLCAnTScsIHUndicpLAogICAgKDB4MUQ2QTAsICdNJywgdSd3JyksCiAgICAoMHgxRDZBMSwgJ00nLCB1J3gnKSwKICAgICgweDFENkEyLCAnTScsIHUneScpLAogICAgKDB4MUQ2QTMsICdNJywgdSd6JyksCiAgICAoMHgxRDZBNCwgJ00nLCB1J8SxJyksCiAgICAoMHgxRDZBNSwgJ00nLCB1J8i3JyksCiAgICAoMHgxRDZBNiwgJ1gnKSwKICAgICgweDFENkE4LCAnTScsIHUnzrEnKSwKICAgICgweDFENkE5LCAnTScsIHUnzrInKSwKICAgICgweDFENkFBLCAnTScsIHUnzrMnKSwKICAgICgweDFENkFCLCAnTScsIHUnzrQnKSwKICAgICgweDFENkFDLCAnTScsIHUnzrUnKSwKICAgICgweDFENkFELCAnTScsIHUnzrYnKSwKICAgICgweDFENkFFLCAnTScsIHUnzrcnKSwKICAgICgweDFENkFGLCAnTScsIHUnzrgnKSwKICAgICgweDFENkIwLCAnTScsIHUnzrknKSwKICAgICgweDFENkIxLCAnTScsIHUnzronKSwKICAgICgweDFENkIyLCAnTScsIHUnzrsnKSwKICAgICgweDFENkIzLCAnTScsIHUnzrwnKSwKICAgICgweDFENkI0LCAnTScsIHUnzr0nKSwKICAgICgweDFENkI1LCAnTScsIHUnzr4nKSwKICAgICgweDFENkI2LCAnTScsIHUnzr8nKSwKICAgICgweDFENkI3LCAnTScsIHUnz4AnKSwKICAgICgweDFENkI4LCAnTScsIHUnz4EnKSwKICAgICgweDFENkI5LCAnTScsIHUnzrgnKSwKICAgICgweDFENkJBLCAnTScsIHUnz4MnKSwKICAgICgweDFENkJCLCAnTScsIHUnz4QnKSwKICAgICgweDFENkJDLCAnTScsIHUnz4UnKSwKICAgICgweDFENkJELCAnTScsIHUnz4YnKSwKICAgICgweDFENkJFLCAnTScsIHUnz4cnKSwKICAgICgweDFENkJGLCAnTScsIHUnz4gnKSwKICAgICgweDFENkMwLCAnTScsIHUnz4knKSwKICAgICgweDFENkMxLCAnTScsIHUn4oiHJyksCiAgICAoMHgxRDZDMiwgJ00nLCB1J86xJyksCiAgICAoMHgxRDZDMywgJ00nLCB1J86yJyksCiAgICAoMHgxRDZDNCwgJ00nLCB1J86zJyksCiAgICAoMHgxRDZDNSwgJ00nLCB1J860JyksCiAgICAoMHgxRDZDNiwgJ00nLCB1J861JyksCiAgICAoMHgxRDZDNywgJ00nLCB1J862JyksCiAgICAoMHgxRDZDOCwgJ00nLCB1J863JyksCiAgICAoMHgxRDZDOSwgJ00nLCB1J864JyksCiAgICAoMHgxRDZDQSwgJ00nLCB1J865JyksCiAgICAoMHgxRDZDQiwgJ00nLCB1J866JyksCiAgICAoMHgxRDZDQywgJ00nLCB1J867JyksCiAgICAoMHgxRDZDRCwgJ00nLCB1J868JyksCiAgICAoMHgxRDZDRSwgJ00nLCB1J869JyksCiAgICAoMHgxRDZDRiwgJ00nLCB1J86+JyksCiAgICAoMHgxRDZEMCwgJ00nLCB1J86/JyksCiAgICAoMHgxRDZEMSwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDZEMiwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDZEMywgJ00nLCB1J8+DJyksCiAgICAoMHgxRDZENSwgJ00nLCB1J8+EJyksCiAgICAoMHgxRDZENiwgJ00nLCB1J8+FJyksCiAgICAoMHgxRDZENywgJ00nLCB1J8+GJyksCiAgICAoMHgxRDZEOCwgJ00nLCB1J8+HJyksCiAgICAoMHgxRDZEOSwgJ00nLCB1J8+IJyksCiAgICAoMHgxRDZEQSwgJ00nLCB1J8+JJyksCiAgICAoMHgxRDZEQiwgJ00nLCB1J+KIgicpLAogICAgKDB4MUQ2REMsICdNJywgdSfOtScpLAogICAgKDB4MUQ2REQsICdNJywgdSfOuCcpLAogICAgKDB4MUQ2REUsICdNJywgdSfOuicpLAogICAgKDB4MUQ2REYsICdNJywgdSfPhicpLAogICAgKDB4MUQ2RTAsICdNJywgdSfPgScpLAogICAgKDB4MUQ2RTEsICdNJywgdSfPgCcpLAogICAgKDB4MUQ2RTIsICdNJywgdSfOsScpLAogICAgKDB4MUQ2RTMsICdNJywgdSfOsicpLAogICAgKDB4MUQ2RTQsICdNJywgdSfOsycpLAogICAgKDB4MUQ2RTUsICdNJywgdSfOtCcpLAogICAgKDB4MUQ2RTYsICdNJywgdSfOtScpLAogICAgKDB4MUQ2RTcsICdNJywgdSfOticpLAogICAgKDB4MUQ2RTgsICdNJywgdSfOtycpLAogICAgKDB4MUQ2RTksICdNJywgdSfOuCcpLAogICAgKDB4MUQ2RUEsICdNJywgdSfOuScpLAogICAgKDB4MUQ2RUIsICdNJywgdSfOuicpLAogICAgKDB4MUQ2RUMsICdNJywgdSfOuycpLAogICAgKDB4MUQ2RUQsICdNJywgdSfOvCcpLAogICAgKDB4MUQ2RUUsICdNJywgdSfOvScpLAogICAgKDB4MUQ2RUYsICdNJywgdSfOvicpLAogICAgKDB4MUQ2RjAsICdNJywgdSfOvycpLAogICAgKDB4MUQ2RjEsICdNJywgdSfPgCcpLAogICAgKDB4MUQ2RjIsICdNJywgdSfPgScpLAogICAgKDB4MUQ2RjMsICdNJywgdSfOuCcpLAogICAgKDB4MUQ2RjQsICdNJywgdSfPgycpLAogICAgKDB4MUQ2RjUsICdNJywgdSfPhCcpLAogICAgKDB4MUQ2RjYsICdNJywgdSfPhScpLAogICAgKDB4MUQ2RjcsICdNJywgdSfPhicpLAogICAgKDB4MUQ2RjgsICdNJywgdSfPhycpLAogICAgKDB4MUQ2RjksICdNJywgdSfPiCcpLAogICAgKDB4MUQ2RkEsICdNJywgdSfPiScpLAogICAgKDB4MUQ2RkIsICdNJywgdSfiiIcnKSwKICAgICgweDFENkZDLCAnTScsIHUnzrEnKSwKICAgICgweDFENkZELCAnTScsIHUnzrInKSwKICAgICgweDFENkZFLCAnTScsIHUnzrMnKSwKICAgICgweDFENkZGLCAnTScsIHUnzrQnKSwKICAgICgweDFENzAwLCAnTScsIHUnzrUnKSwKICAgIF0KCmRlZiBfc2VnXzYxKCk6CiAgICByZXR1cm4gWwogICAgKDB4MUQ3MDEsICdNJywgdSfOticpLAogICAgKDB4MUQ3MDIsICdNJywgdSfOtycpLAogICAgKDB4MUQ3MDMsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3MDQsICdNJywgdSfOuScpLAogICAgKDB4MUQ3MDUsICdNJywgdSfOuicpLAogICAgKDB4MUQ3MDYsICdNJywgdSfOuycpLAogICAgKDB4MUQ3MDcsICdNJywgdSfOvCcpLAogICAgKDB4MUQ3MDgsICdNJywgdSfOvScpLAogICAgKDB4MUQ3MDksICdNJywgdSfOvicpLAogICAgKDB4MUQ3MEEsICdNJywgdSfOvycpLAogICAgKDB4MUQ3MEIsICdNJywgdSfPgCcpLAogICAgKDB4MUQ3MEMsICdNJywgdSfPgScpLAogICAgKDB4MUQ3MEQsICdNJywgdSfPgycpLAogICAgKDB4MUQ3MEYsICdNJywgdSfPhCcpLAogICAgKDB4MUQ3MTAsICdNJywgdSfPhScpLAogICAgKDB4MUQ3MTEsICdNJywgdSfPhicpLAogICAgKDB4MUQ3MTIsICdNJywgdSfPhycpLAogICAgKDB4MUQ3MTMsICdNJywgdSfPiCcpLAogICAgKDB4MUQ3MTQsICdNJywgdSfPiScpLAogICAgKDB4MUQ3MTUsICdNJywgdSfiiIInKSwKICAgICgweDFENzE2LCAnTScsIHUnzrUnKSwKICAgICgweDFENzE3LCAnTScsIHUnzrgnKSwKICAgICgweDFENzE4LCAnTScsIHUnzronKSwKICAgICgweDFENzE5LCAnTScsIHUnz4YnKSwKICAgICgweDFENzFBLCAnTScsIHUnz4EnKSwKICAgICgweDFENzFCLCAnTScsIHUnz4AnKSwKICAgICgweDFENzFDLCAnTScsIHUnzrEnKSwKICAgICgweDFENzFELCAnTScsIHUnzrInKSwKICAgICgweDFENzFFLCAnTScsIHUnzrMnKSwKICAgICgweDFENzFGLCAnTScsIHUnzrQnKSwKICAgICgweDFENzIwLCAnTScsIHUnzrUnKSwKICAgICgweDFENzIxLCAnTScsIHUnzrYnKSwKICAgICgweDFENzIyLCAnTScsIHUnzrcnKSwKICAgICgweDFENzIzLCAnTScsIHUnzrgnKSwKICAgICgweDFENzI0LCAnTScsIHUnzrknKSwKICAgICgweDFENzI1LCAnTScsIHUnzronKSwKICAgICgweDFENzI2LCAnTScsIHUnzrsnKSwKICAgICgweDFENzI3LCAnTScsIHUnzrwnKSwKICAgICgweDFENzI4LCAnTScsIHUnzr0nKSwKICAgICgweDFENzI5LCAnTScsIHUnzr4nKSwKICAgICgweDFENzJBLCAnTScsIHUnzr8nKSwKICAgICgweDFENzJCLCAnTScsIHUnz4AnKSwKICAgICgweDFENzJDLCAnTScsIHUnz4EnKSwKICAgICgweDFENzJELCAnTScsIHUnzrgnKSwKICAgICgweDFENzJFLCAnTScsIHUnz4MnKSwKICAgICgweDFENzJGLCAnTScsIHUnz4QnKSwKICAgICgweDFENzMwLCAnTScsIHUnz4UnKSwKICAgICgweDFENzMxLCAnTScsIHUnz4YnKSwKICAgICgweDFENzMyLCAnTScsIHUnz4cnKSwKICAgICgweDFENzMzLCAnTScsIHUnz4gnKSwKICAgICgweDFENzM0LCAnTScsIHUnz4knKSwKICAgICgweDFENzM1LCAnTScsIHUn4oiHJyksCiAgICAoMHgxRDczNiwgJ00nLCB1J86xJyksCiAgICAoMHgxRDczNywgJ00nLCB1J86yJyksCiAgICAoMHgxRDczOCwgJ00nLCB1J86zJyksCiAgICAoMHgxRDczOSwgJ00nLCB1J860JyksCiAgICAoMHgxRDczQSwgJ00nLCB1J861JyksCiAgICAoMHgxRDczQiwgJ00nLCB1J862JyksCiAgICAoMHgxRDczQywgJ00nLCB1J863JyksCiAgICAoMHgxRDczRCwgJ00nLCB1J864JyksCiAgICAoMHgxRDczRSwgJ00nLCB1J865JyksCiAgICAoMHgxRDczRiwgJ00nLCB1J866JyksCiAgICAoMHgxRDc0MCwgJ00nLCB1J867JyksCiAgICAoMHgxRDc0MSwgJ00nLCB1J868JyksCiAgICAoMHgxRDc0MiwgJ00nLCB1J869JyksCiAgICAoMHgxRDc0MywgJ00nLCB1J86+JyksCiAgICAoMHgxRDc0NCwgJ00nLCB1J86/JyksCiAgICAoMHgxRDc0NSwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDc0NiwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDc0NywgJ00nLCB1J8+DJyksCiAgICAoMHgxRDc0OSwgJ00nLCB1J8+EJyksCiAgICAoMHgxRDc0QSwgJ00nLCB1J8+FJyksCiAgICAoMHgxRDc0QiwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDc0QywgJ00nLCB1J8+HJyksCiAgICAoMHgxRDc0RCwgJ00nLCB1J8+IJyksCiAgICAoMHgxRDc0RSwgJ00nLCB1J8+JJyksCiAgICAoMHgxRDc0RiwgJ00nLCB1J+KIgicpLAogICAgKDB4MUQ3NTAsICdNJywgdSfOtScpLAogICAgKDB4MUQ3NTEsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3NTIsICdNJywgdSfOuicpLAogICAgKDB4MUQ3NTMsICdNJywgdSfPhicpLAogICAgKDB4MUQ3NTQsICdNJywgdSfPgScpLAogICAgKDB4MUQ3NTUsICdNJywgdSfPgCcpLAogICAgKDB4MUQ3NTYsICdNJywgdSfOsScpLAogICAgKDB4MUQ3NTcsICdNJywgdSfOsicpLAogICAgKDB4MUQ3NTgsICdNJywgdSfOsycpLAogICAgKDB4MUQ3NTksICdNJywgdSfOtCcpLAogICAgKDB4MUQ3NUEsICdNJywgdSfOtScpLAogICAgKDB4MUQ3NUIsICdNJywgdSfOticpLAogICAgKDB4MUQ3NUMsICdNJywgdSfOtycpLAogICAgKDB4MUQ3NUQsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3NUUsICdNJywgdSfOuScpLAogICAgKDB4MUQ3NUYsICdNJywgdSfOuicpLAogICAgKDB4MUQ3NjAsICdNJywgdSfOuycpLAogICAgKDB4MUQ3NjEsICdNJywgdSfOvCcpLAogICAgKDB4MUQ3NjIsICdNJywgdSfOvScpLAogICAgKDB4MUQ3NjMsICdNJywgdSfOvicpLAogICAgKDB4MUQ3NjQsICdNJywgdSfOvycpLAogICAgKDB4MUQ3NjUsICdNJywgdSfPgCcpLAogICAgKDB4MUQ3NjYsICdNJywgdSfPgScpLAogICAgXQoKZGVmIF9zZWdfNjIoKToKICAgIHJldHVybiBbCiAgICAoMHgxRDc2NywgJ00nLCB1J864JyksCiAgICAoMHgxRDc2OCwgJ00nLCB1J8+DJyksCiAgICAoMHgxRDc2OSwgJ00nLCB1J8+EJyksCiAgICAoMHgxRDc2QSwgJ00nLCB1J8+FJyksCiAgICAoMHgxRDc2QiwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDc2QywgJ00nLCB1J8+HJyksCiAgICAoMHgxRDc2RCwgJ00nLCB1J8+IJyksCiAgICAoMHgxRDc2RSwgJ00nLCB1J8+JJyksCiAgICAoMHgxRDc2RiwgJ00nLCB1J+KIhycpLAogICAgKDB4MUQ3NzAsICdNJywgdSfOsScpLAogICAgKDB4MUQ3NzEsICdNJywgdSfOsicpLAogICAgKDB4MUQ3NzIsICdNJywgdSfOsycpLAogICAgKDB4MUQ3NzMsICdNJywgdSfOtCcpLAogICAgKDB4MUQ3NzQsICdNJywgdSfOtScpLAogICAgKDB4MUQ3NzUsICdNJywgdSfOticpLAogICAgKDB4MUQ3NzYsICdNJywgdSfOtycpLAogICAgKDB4MUQ3NzcsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3NzgsICdNJywgdSfOuScpLAogICAgKDB4MUQ3NzksICdNJywgdSfOuicpLAogICAgKDB4MUQ3N0EsICdNJywgdSfOuycpLAogICAgKDB4MUQ3N0IsICdNJywgdSfOvCcpLAogICAgKDB4MUQ3N0MsICdNJywgdSfOvScpLAogICAgKDB4MUQ3N0QsICdNJywgdSfOvicpLAogICAgKDB4MUQ3N0UsICdNJywgdSfOvycpLAogICAgKDB4MUQ3N0YsICdNJywgdSfPgCcpLAogICAgKDB4MUQ3ODAsICdNJywgdSfPgScpLAogICAgKDB4MUQ3ODEsICdNJywgdSfPgycpLAogICAgKDB4MUQ3ODMsICdNJywgdSfPhCcpLAogICAgKDB4MUQ3ODQsICdNJywgdSfPhScpLAogICAgKDB4MUQ3ODUsICdNJywgdSfPhicpLAogICAgKDB4MUQ3ODYsICdNJywgdSfPhycpLAogICAgKDB4MUQ3ODcsICdNJywgdSfPiCcpLAogICAgKDB4MUQ3ODgsICdNJywgdSfPiScpLAogICAgKDB4MUQ3ODksICdNJywgdSfiiIInKSwKICAgICgweDFENzhBLCAnTScsIHUnzrUnKSwKICAgICgweDFENzhCLCAnTScsIHUnzrgnKSwKICAgICgweDFENzhDLCAnTScsIHUnzronKSwKICAgICgweDFENzhELCAnTScsIHUnz4YnKSwKICAgICgweDFENzhFLCAnTScsIHUnz4EnKSwKICAgICgweDFENzhGLCAnTScsIHUnz4AnKSwKICAgICgweDFENzkwLCAnTScsIHUnzrEnKSwKICAgICgweDFENzkxLCAnTScsIHUnzrInKSwKICAgICgweDFENzkyLCAnTScsIHUnzrMnKSwKICAgICgweDFENzkzLCAnTScsIHUnzrQnKSwKICAgICgweDFENzk0LCAnTScsIHUnzrUnKSwKICAgICgweDFENzk1LCAnTScsIHUnzrYnKSwKICAgICgweDFENzk2LCAnTScsIHUnzrcnKSwKICAgICgweDFENzk3LCAnTScsIHUnzrgnKSwKICAgICgweDFENzk4LCAnTScsIHUnzrknKSwKICAgICgweDFENzk5LCAnTScsIHUnzronKSwKICAgICgweDFENzlBLCAnTScsIHUnzrsnKSwKICAgICgweDFENzlCLCAnTScsIHUnzrwnKSwKICAgICgweDFENzlDLCAnTScsIHUnzr0nKSwKICAgICgweDFENzlELCAnTScsIHUnzr4nKSwKICAgICgweDFENzlFLCAnTScsIHUnzr8nKSwKICAgICgweDFENzlGLCAnTScsIHUnz4AnKSwKICAgICgweDFEN0EwLCAnTScsIHUnz4EnKSwKICAgICgweDFEN0ExLCAnTScsIHUnzrgnKSwKICAgICgweDFEN0EyLCAnTScsIHUnz4MnKSwKICAgICgweDFEN0EzLCAnTScsIHUnz4QnKSwKICAgICgweDFEN0E0LCAnTScsIHUnz4UnKSwKICAgICgweDFEN0E1LCAnTScsIHUnz4YnKSwKICAgICgweDFEN0E2LCAnTScsIHUnz4cnKSwKICAgICgweDFEN0E3LCAnTScsIHUnz4gnKSwKICAgICgweDFEN0E4LCAnTScsIHUnz4knKSwKICAgICgweDFEN0E5LCAnTScsIHUn4oiHJyksCiAgICAoMHgxRDdBQSwgJ00nLCB1J86xJyksCiAgICAoMHgxRDdBQiwgJ00nLCB1J86yJyksCiAgICAoMHgxRDdBQywgJ00nLCB1J86zJyksCiAgICAoMHgxRDdBRCwgJ00nLCB1J860JyksCiAgICAoMHgxRDdBRSwgJ00nLCB1J861JyksCiAgICAoMHgxRDdBRiwgJ00nLCB1J862JyksCiAgICAoMHgxRDdCMCwgJ00nLCB1J863JyksCiAgICAoMHgxRDdCMSwgJ00nLCB1J864JyksCiAgICAoMHgxRDdCMiwgJ00nLCB1J865JyksCiAgICAoMHgxRDdCMywgJ00nLCB1J866JyksCiAgICAoMHgxRDdCNCwgJ00nLCB1J867JyksCiAgICAoMHgxRDdCNSwgJ00nLCB1J868JyksCiAgICAoMHgxRDdCNiwgJ00nLCB1J869JyksCiAgICAoMHgxRDdCNywgJ00nLCB1J86+JyksCiAgICAoMHgxRDdCOCwgJ00nLCB1J86/JyksCiAgICAoMHgxRDdCOSwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDdCQSwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDdCQiwgJ00nLCB1J8+DJyksCiAgICAoMHgxRDdCRCwgJ00nLCB1J8+EJyksCiAgICAoMHgxRDdCRSwgJ00nLCB1J8+FJyksCiAgICAoMHgxRDdCRiwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDdDMCwgJ00nLCB1J8+HJyksCiAgICAoMHgxRDdDMSwgJ00nLCB1J8+IJyksCiAgICAoMHgxRDdDMiwgJ00nLCB1J8+JJyksCiAgICAoMHgxRDdDMywgJ00nLCB1J+KIgicpLAogICAgKDB4MUQ3QzQsICdNJywgdSfOtScpLAogICAgKDB4MUQ3QzUsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3QzYsICdNJywgdSfOuicpLAogICAgKDB4MUQ3QzcsICdNJywgdSfPhicpLAogICAgKDB4MUQ3QzgsICdNJywgdSfPgScpLAogICAgKDB4MUQ3QzksICdNJywgdSfPgCcpLAogICAgKDB4MUQ3Q0EsICdNJywgdSfPnScpLAogICAgKDB4MUQ3Q0MsICdYJyksCiAgICAoMHgxRDdDRSwgJ00nLCB1JzAnKSwKICAgIF0KCmRlZiBfc2VnXzYzKCk6CiAgICByZXR1cm4gWwogICAgKDB4MUQ3Q0YsICdNJywgdScxJyksCiAgICAoMHgxRDdEMCwgJ00nLCB1JzInKSwKICAgICgweDFEN0QxLCAnTScsIHUnMycpLAogICAgKDB4MUQ3RDIsICdNJywgdSc0JyksCiAgICAoMHgxRDdEMywgJ00nLCB1JzUnKSwKICAgICgweDFEN0Q0LCAnTScsIHUnNicpLAogICAgKDB4MUQ3RDUsICdNJywgdSc3JyksCiAgICAoMHgxRDdENiwgJ00nLCB1JzgnKSwKICAgICgweDFEN0Q3LCAnTScsIHUnOScpLAogICAgKDB4MUQ3RDgsICdNJywgdScwJyksCiAgICAoMHgxRDdEOSwgJ00nLCB1JzEnKSwKICAgICgweDFEN0RBLCAnTScsIHUnMicpLAogICAgKDB4MUQ3REIsICdNJywgdSczJyksCiAgICAoMHgxRDdEQywgJ00nLCB1JzQnKSwKICAgICgweDFEN0RELCAnTScsIHUnNScpLAogICAgKDB4MUQ3REUsICdNJywgdSc2JyksCiAgICAoMHgxRDdERiwgJ00nLCB1JzcnKSwKICAgICgweDFEN0UwLCAnTScsIHUnOCcpLAogICAgKDB4MUQ3RTEsICdNJywgdSc5JyksCiAgICAoMHgxRDdFMiwgJ00nLCB1JzAnKSwKICAgICgweDFEN0UzLCAnTScsIHUnMScpLAogICAgKDB4MUQ3RTQsICdNJywgdScyJyksCiAgICAoMHgxRDdFNSwgJ00nLCB1JzMnKSwKICAgICgweDFEN0U2LCAnTScsIHUnNCcpLAogICAgKDB4MUQ3RTcsICdNJywgdSc1JyksCiAgICAoMHgxRDdFOCwgJ00nLCB1JzYnKSwKICAgICgweDFEN0U5LCAnTScsIHUnNycpLAogICAgKDB4MUQ3RUEsICdNJywgdSc4JyksCiAgICAoMHgxRDdFQiwgJ00nLCB1JzknKSwKICAgICgweDFEN0VDLCAnTScsIHUnMCcpLAogICAgKDB4MUQ3RUQsICdNJywgdScxJyksCiAgICAoMHgxRDdFRSwgJ00nLCB1JzInKSwKICAgICgweDFEN0VGLCAnTScsIHUnMycpLAogICAgKDB4MUQ3RjAsICdNJywgdSc0JyksCiAgICAoMHgxRDdGMSwgJ00nLCB1JzUnKSwKICAgICgweDFEN0YyLCAnTScsIHUnNicpLAogICAgKDB4MUQ3RjMsICdNJywgdSc3JyksCiAgICAoMHgxRDdGNCwgJ00nLCB1JzgnKSwKICAgICgweDFEN0Y1LCAnTScsIHUnOScpLAogICAgKDB4MUQ3RjYsICdNJywgdScwJyksCiAgICAoMHgxRDdGNywgJ00nLCB1JzEnKSwKICAgICgweDFEN0Y4LCAnTScsIHUnMicpLAogICAgKDB4MUQ3RjksICdNJywgdSczJyksCiAgICAoMHgxRDdGQSwgJ00nLCB1JzQnKSwKICAgICgweDFEN0ZCLCAnTScsIHUnNScpLAogICAgKDB4MUQ3RkMsICdNJywgdSc2JyksCiAgICAoMHgxRDdGRCwgJ00nLCB1JzcnKSwKICAgICgweDFEN0ZFLCAnTScsIHUnOCcpLAogICAgKDB4MUQ3RkYsICdNJywgdSc5JyksCiAgICAoMHgxRDgwMCwgJ1gnKSwKICAgICgweDFFRTAwLCAnTScsIHUn2KcnKSwKICAgICgweDFFRTAxLCAnTScsIHUn2KgnKSwKICAgICgweDFFRTAyLCAnTScsIHUn2KwnKSwKICAgICgweDFFRTAzLCAnTScsIHUn2K8nKSwKICAgICgweDFFRTA0LCAnWCcpLAogICAgKDB4MUVFMDUsICdNJywgdSfZiCcpLAogICAgKDB4MUVFMDYsICdNJywgdSfYsicpLAogICAgKDB4MUVFMDcsICdNJywgdSfYrScpLAogICAgKDB4MUVFMDgsICdNJywgdSfYtycpLAogICAgKDB4MUVFMDksICdNJywgdSfZiicpLAogICAgKDB4MUVFMEEsICdNJywgdSfZgycpLAogICAgKDB4MUVFMEIsICdNJywgdSfZhCcpLAogICAgKDB4MUVFMEMsICdNJywgdSfZhScpLAogICAgKDB4MUVFMEQsICdNJywgdSfZhicpLAogICAgKDB4MUVFMEUsICdNJywgdSfYsycpLAogICAgKDB4MUVFMEYsICdNJywgdSfYuScpLAogICAgKDB4MUVFMTAsICdNJywgdSfZgScpLAogICAgKDB4MUVFMTEsICdNJywgdSfYtScpLAogICAgKDB4MUVFMTIsICdNJywgdSfZgicpLAogICAgKDB4MUVFMTMsICdNJywgdSfYsScpLAogICAgKDB4MUVFMTQsICdNJywgdSfYtCcpLAogICAgKDB4MUVFMTUsICdNJywgdSfYqicpLAogICAgKDB4MUVFMTYsICdNJywgdSfYqycpLAogICAgKDB4MUVFMTcsICdNJywgdSfYricpLAogICAgKDB4MUVFMTgsICdNJywgdSfYsCcpLAogICAgKDB4MUVFMTksICdNJywgdSfYticpLAogICAgKDB4MUVFMUEsICdNJywgdSfYuCcpLAogICAgKDB4MUVFMUIsICdNJywgdSfYuicpLAogICAgKDB4MUVFMUMsICdNJywgdSfZricpLAogICAgKDB4MUVFMUQsICdNJywgdSfauicpLAogICAgKDB4MUVFMUUsICdNJywgdSfaoScpLAogICAgKDB4MUVFMUYsICdNJywgdSfZrycpLAogICAgKDB4MUVFMjAsICdYJyksCiAgICAoMHgxRUUyMSwgJ00nLCB1J9ioJyksCiAgICAoMHgxRUUyMiwgJ00nLCB1J9isJyksCiAgICAoMHgxRUUyMywgJ1gnKSwKICAgICgweDFFRTI0LCAnTScsIHUn2YcnKSwKICAgICgweDFFRTI1LCAnWCcpLAogICAgKDB4MUVFMjcsICdNJywgdSfYrScpLAogICAgKDB4MUVFMjgsICdYJyksCiAgICAoMHgxRUUyOSwgJ00nLCB1J9mKJyksCiAgICAoMHgxRUUyQSwgJ00nLCB1J9mDJyksCiAgICAoMHgxRUUyQiwgJ00nLCB1J9mEJyksCiAgICAoMHgxRUUyQywgJ00nLCB1J9mFJyksCiAgICAoMHgxRUUyRCwgJ00nLCB1J9mGJyksCiAgICAoMHgxRUUyRSwgJ00nLCB1J9izJyksCiAgICAoMHgxRUUyRiwgJ00nLCB1J9i5JyksCiAgICAoMHgxRUUzMCwgJ00nLCB1J9mBJyksCiAgICAoMHgxRUUzMSwgJ00nLCB1J9i1JyksCiAgICAoMHgxRUUzMiwgJ00nLCB1J9mCJyksCiAgICBdCgpkZWYgX3NlZ182NCgpOgogICAgcmV0dXJuIFsKICAgICgweDFFRTMzLCAnWCcpLAogICAgKDB4MUVFMzQsICdNJywgdSfYtCcpLAogICAgKDB4MUVFMzUsICdNJywgdSfYqicpLAogICAgKDB4MUVFMzYsICdNJywgdSfYqycpLAogICAgKDB4MUVFMzcsICdNJywgdSfYricpLAogICAgKDB4MUVFMzgsICdYJyksCiAgICAoMHgxRUUzOSwgJ00nLCB1J9i2JyksCiAgICAoMHgxRUUzQSwgJ1gnKSwKICAgICgweDFFRTNCLCAnTScsIHUn2LonKSwKICAgICgweDFFRTNDLCAnWCcpLAogICAgKDB4MUVFNDIsICdNJywgdSfYrCcpLAogICAgKDB4MUVFNDMsICdYJyksCiAgICAoMHgxRUU0NywgJ00nLCB1J9itJyksCiAgICAoMHgxRUU0OCwgJ1gnKSwKICAgICgweDFFRTQ5LCAnTScsIHUn2YonKSwKICAgICgweDFFRTRBLCAnWCcpLAogICAgKDB4MUVFNEIsICdNJywgdSfZhCcpLAogICAgKDB4MUVFNEMsICdYJyksCiAgICAoMHgxRUU0RCwgJ00nLCB1J9mGJyksCiAgICAoMHgxRUU0RSwgJ00nLCB1J9izJyksCiAgICAoMHgxRUU0RiwgJ00nLCB1J9i5JyksCiAgICAoMHgxRUU1MCwgJ1gnKSwKICAgICgweDFFRTUxLCAnTScsIHUn2LUnKSwKICAgICgweDFFRTUyLCAnTScsIHUn2YInKSwKICAgICgweDFFRTUzLCAnWCcpLAogICAgKDB4MUVFNTQsICdNJywgdSfYtCcpLAogICAgKDB4MUVFNTUsICdYJyksCiAgICAoMHgxRUU1NywgJ00nLCB1J9iuJyksCiAgICAoMHgxRUU1OCwgJ1gnKSwKICAgICgweDFFRTU5LCAnTScsIHUn2LYnKSwKICAgICgweDFFRTVBLCAnWCcpLAogICAgKDB4MUVFNUIsICdNJywgdSfYuicpLAogICAgKDB4MUVFNUMsICdYJyksCiAgICAoMHgxRUU1RCwgJ00nLCB1J9q6JyksCiAgICAoMHgxRUU1RSwgJ1gnKSwKICAgICgweDFFRTVGLCAnTScsIHUn2a8nKSwKICAgICgweDFFRTYwLCAnWCcpLAogICAgKDB4MUVFNjEsICdNJywgdSfYqCcpLAogICAgKDB4MUVFNjIsICdNJywgdSfYrCcpLAogICAgKDB4MUVFNjMsICdYJyksCiAgICAoMHgxRUU2NCwgJ00nLCB1J9mHJyksCiAgICAoMHgxRUU2NSwgJ1gnKSwKICAgICgweDFFRTY3LCAnTScsIHUn2K0nKSwKICAgICgweDFFRTY4LCAnTScsIHUn2LcnKSwKICAgICgweDFFRTY5LCAnTScsIHUn2YonKSwKICAgICgweDFFRTZBLCAnTScsIHUn2YMnKSwKICAgICgweDFFRTZCLCAnWCcpLAogICAgKDB4MUVFNkMsICdNJywgdSfZhScpLAogICAgKDB4MUVFNkQsICdNJywgdSfZhicpLAogICAgKDB4MUVFNkUsICdNJywgdSfYsycpLAogICAgKDB4MUVFNkYsICdNJywgdSfYuScpLAogICAgKDB4MUVFNzAsICdNJywgdSfZgScpLAogICAgKDB4MUVFNzEsICdNJywgdSfYtScpLAogICAgKDB4MUVFNzIsICdNJywgdSfZgicpLAogICAgKDB4MUVFNzMsICdYJyksCiAgICAoMHgxRUU3NCwgJ00nLCB1J9i0JyksCiAgICAoMHgxRUU3NSwgJ00nLCB1J9iqJyksCiAgICAoMHgxRUU3NiwgJ00nLCB1J9irJyksCiAgICAoMHgxRUU3NywgJ00nLCB1J9iuJyksCiAgICAoMHgxRUU3OCwgJ1gnKSwKICAgICgweDFFRTc5LCAnTScsIHUn2LYnKSwKICAgICgweDFFRTdBLCAnTScsIHUn2LgnKSwKICAgICgweDFFRTdCLCAnTScsIHUn2LonKSwKICAgICgweDFFRTdDLCAnTScsIHUn2a4nKSwKICAgICgweDFFRTdELCAnWCcpLAogICAgKDB4MUVFN0UsICdNJywgdSfaoScpLAogICAgKDB4MUVFN0YsICdYJyksCiAgICAoMHgxRUU4MCwgJ00nLCB1J9inJyksCiAgICAoMHgxRUU4MSwgJ00nLCB1J9ioJyksCiAgICAoMHgxRUU4MiwgJ00nLCB1J9isJyksCiAgICAoMHgxRUU4MywgJ00nLCB1J9ivJyksCiAgICAoMHgxRUU4NCwgJ00nLCB1J9mHJyksCiAgICAoMHgxRUU4NSwgJ00nLCB1J9mIJyksCiAgICAoMHgxRUU4NiwgJ00nLCB1J9iyJyksCiAgICAoMHgxRUU4NywgJ00nLCB1J9itJyksCiAgICAoMHgxRUU4OCwgJ00nLCB1J9i3JyksCiAgICAoMHgxRUU4OSwgJ00nLCB1J9mKJyksCiAgICAoMHgxRUU4QSwgJ1gnKSwKICAgICgweDFFRThCLCAnTScsIHUn2YQnKSwKICAgICgweDFFRThDLCAnTScsIHUn2YUnKSwKICAgICgweDFFRThELCAnTScsIHUn2YYnKSwKICAgICgweDFFRThFLCAnTScsIHUn2LMnKSwKICAgICgweDFFRThGLCAnTScsIHUn2LknKSwKICAgICgweDFFRTkwLCAnTScsIHUn2YEnKSwKICAgICgweDFFRTkxLCAnTScsIHUn2LUnKSwKICAgICgweDFFRTkyLCAnTScsIHUn2YInKSwKICAgICgweDFFRTkzLCAnTScsIHUn2LEnKSwKICAgICgweDFFRTk0LCAnTScsIHUn2LQnKSwKICAgICgweDFFRTk1LCAnTScsIHUn2KonKSwKICAgICgweDFFRTk2LCAnTScsIHUn2KsnKSwKICAgICgweDFFRTk3LCAnTScsIHUn2K4nKSwKICAgICgweDFFRTk4LCAnTScsIHUn2LAnKSwKICAgICgweDFFRTk5LCAnTScsIHUn2LYnKSwKICAgICgweDFFRTlBLCAnTScsIHUn2LgnKSwKICAgICgweDFFRTlCLCAnTScsIHUn2LonKSwKICAgICgweDFFRTlDLCAnWCcpLAogICAgKDB4MUVFQTEsICdNJywgdSfYqCcpLAogICAgKDB4MUVFQTIsICdNJywgdSfYrCcpLAogICAgKDB4MUVFQTMsICdNJywgdSfYrycpLAogICAgKDB4MUVFQTQsICdYJyksCiAgICBdCgpkZWYgX3NlZ182NSgpOgogICAgcmV0dXJuIFsKICAgICgweDFFRUE1LCAnTScsIHUn2YgnKSwKICAgICgweDFFRUE2LCAnTScsIHUn2LInKSwKICAgICgweDFFRUE3LCAnTScsIHUn2K0nKSwKICAgICgweDFFRUE4LCAnTScsIHUn2LcnKSwKICAgICgweDFFRUE5LCAnTScsIHUn2YonKSwKICAgICgweDFFRUFBLCAnWCcpLAogICAgKDB4MUVFQUIsICdNJywgdSfZhCcpLAogICAgKDB4MUVFQUMsICdNJywgdSfZhScpLAogICAgKDB4MUVFQUQsICdNJywgdSfZhicpLAogICAgKDB4MUVFQUUsICdNJywgdSfYsycpLAogICAgKDB4MUVFQUYsICdNJywgdSfYuScpLAogICAgKDB4MUVFQjAsICdNJywgdSfZgScpLAogICAgKDB4MUVFQjEsICdNJywgdSfYtScpLAogICAgKDB4MUVFQjIsICdNJywgdSfZgicpLAogICAgKDB4MUVFQjMsICdNJywgdSfYsScpLAogICAgKDB4MUVFQjQsICdNJywgdSfYtCcpLAogICAgKDB4MUVFQjUsICdNJywgdSfYqicpLAogICAgKDB4MUVFQjYsICdNJywgdSfYqycpLAogICAgKDB4MUVFQjcsICdNJywgdSfYricpLAogICAgKDB4MUVFQjgsICdNJywgdSfYsCcpLAogICAgKDB4MUVFQjksICdNJywgdSfYticpLAogICAgKDB4MUVFQkEsICdNJywgdSfYuCcpLAogICAgKDB4MUVFQkIsICdNJywgdSfYuicpLAogICAgKDB4MUVFQkMsICdYJyksCiAgICAoMHgxRUVGMCwgJ1YnKSwKICAgICgweDFFRUYyLCAnWCcpLAogICAgKDB4MUYwMDAsICdWJyksCiAgICAoMHgxRjAyQywgJ1gnKSwKICAgICgweDFGMDMwLCAnVicpLAogICAgKDB4MUYwOTQsICdYJyksCiAgICAoMHgxRjBBMCwgJ1YnKSwKICAgICgweDFGMEFGLCAnWCcpLAogICAgKDB4MUYwQjEsICdWJyksCiAgICAoMHgxRjBCRiwgJ1gnKSwKICAgICgweDFGMEMxLCAnVicpLAogICAgKDB4MUYwRDAsICdYJyksCiAgICAoMHgxRjBEMSwgJ1YnKSwKICAgICgweDFGMEUwLCAnWCcpLAogICAgKDB4MUYxMDEsICczJywgdScwLCcpLAogICAgKDB4MUYxMDIsICczJywgdScxLCcpLAogICAgKDB4MUYxMDMsICczJywgdScyLCcpLAogICAgKDB4MUYxMDQsICczJywgdSczLCcpLAogICAgKDB4MUYxMDUsICczJywgdSc0LCcpLAogICAgKDB4MUYxMDYsICczJywgdSc1LCcpLAogICAgKDB4MUYxMDcsICczJywgdSc2LCcpLAogICAgKDB4MUYxMDgsICczJywgdSc3LCcpLAogICAgKDB4MUYxMDksICczJywgdSc4LCcpLAogICAgKDB4MUYxMEEsICczJywgdSc5LCcpLAogICAgKDB4MUYxMEIsICdYJyksCiAgICAoMHgxRjExMCwgJzMnLCB1JyhhKScpLAogICAgKDB4MUYxMTEsICczJywgdScoYiknKSwKICAgICgweDFGMTEyLCAnMycsIHUnKGMpJyksCiAgICAoMHgxRjExMywgJzMnLCB1JyhkKScpLAogICAgKDB4MUYxMTQsICczJywgdScoZSknKSwKICAgICgweDFGMTE1LCAnMycsIHUnKGYpJyksCiAgICAoMHgxRjExNiwgJzMnLCB1JyhnKScpLAogICAgKDB4MUYxMTcsICczJywgdScoaCknKSwKICAgICgweDFGMTE4LCAnMycsIHUnKGkpJyksCiAgICAoMHgxRjExOSwgJzMnLCB1JyhqKScpLAogICAgKDB4MUYxMUEsICczJywgdScoayknKSwKICAgICgweDFGMTFCLCAnMycsIHUnKGwpJyksCiAgICAoMHgxRjExQywgJzMnLCB1JyhtKScpLAogICAgKDB4MUYxMUQsICczJywgdScobiknKSwKICAgICgweDFGMTFFLCAnMycsIHUnKG8pJyksCiAgICAoMHgxRjExRiwgJzMnLCB1JyhwKScpLAogICAgKDB4MUYxMjAsICczJywgdScocSknKSwKICAgICgweDFGMTIxLCAnMycsIHUnKHIpJyksCiAgICAoMHgxRjEyMiwgJzMnLCB1JyhzKScpLAogICAgKDB4MUYxMjMsICczJywgdScodCknKSwKICAgICgweDFGMTI0LCAnMycsIHUnKHUpJyksCiAgICAoMHgxRjEyNSwgJzMnLCB1Jyh2KScpLAogICAgKDB4MUYxMjYsICczJywgdScodyknKSwKICAgICgweDFGMTI3LCAnMycsIHUnKHgpJyksCiAgICAoMHgxRjEyOCwgJzMnLCB1Jyh5KScpLAogICAgKDB4MUYxMjksICczJywgdScoeiknKSwKICAgICgweDFGMTJBLCAnTScsIHUn44CUc+OAlScpLAogICAgKDB4MUYxMkIsICdNJywgdSdjJyksCiAgICAoMHgxRjEyQywgJ00nLCB1J3InKSwKICAgICgweDFGMTJELCAnTScsIHUnY2QnKSwKICAgICgweDFGMTJFLCAnTScsIHUnd3onKSwKICAgICgweDFGMTJGLCAnWCcpLAogICAgKDB4MUYxMzAsICdNJywgdSdhJyksCiAgICAoMHgxRjEzMSwgJ00nLCB1J2InKSwKICAgICgweDFGMTMyLCAnTScsIHUnYycpLAogICAgKDB4MUYxMzMsICdNJywgdSdkJyksCiAgICAoMHgxRjEzNCwgJ00nLCB1J2UnKSwKICAgICgweDFGMTM1LCAnTScsIHUnZicpLAogICAgKDB4MUYxMzYsICdNJywgdSdnJyksCiAgICAoMHgxRjEzNywgJ00nLCB1J2gnKSwKICAgICgweDFGMTM4LCAnTScsIHUnaScpLAogICAgKDB4MUYxMzksICdNJywgdSdqJyksCiAgICAoMHgxRjEzQSwgJ00nLCB1J2snKSwKICAgICgweDFGMTNCLCAnTScsIHUnbCcpLAogICAgKDB4MUYxM0MsICdNJywgdSdtJyksCiAgICAoMHgxRjEzRCwgJ00nLCB1J24nKSwKICAgICgweDFGMTNFLCAnTScsIHUnbycpLAogICAgKDB4MUYxM0YsICdNJywgdSdwJyksCiAgICAoMHgxRjE0MCwgJ00nLCB1J3EnKSwKICAgICgweDFGMTQxLCAnTScsIHUncicpLAogICAgKDB4MUYxNDIsICdNJywgdSdzJyksCiAgICBdCgpkZWYgX3NlZ182NigpOgogICAgcmV0dXJuIFsKICAgICgweDFGMTQzLCAnTScsIHUndCcpLAogICAgKDB4MUYxNDQsICdNJywgdSd1JyksCiAgICAoMHgxRjE0NSwgJ00nLCB1J3YnKSwKICAgICgweDFGMTQ2LCAnTScsIHUndycpLAogICAgKDB4MUYxNDcsICdNJywgdSd4JyksCiAgICAoMHgxRjE0OCwgJ00nLCB1J3knKSwKICAgICgweDFGMTQ5LCAnTScsIHUneicpLAogICAgKDB4MUYxNEEsICdNJywgdSdodicpLAogICAgKDB4MUYxNEIsICdNJywgdSdtdicpLAogICAgKDB4MUYxNEMsICdNJywgdSdzZCcpLAogICAgKDB4MUYxNEQsICdNJywgdSdzcycpLAogICAgKDB4MUYxNEUsICdNJywgdSdwcHYnKSwKICAgICgweDFGMTRGLCAnTScsIHUnd2MnKSwKICAgICgweDFGMTUwLCAnVicpLAogICAgKDB4MUYxNkEsICdNJywgdSdtYycpLAogICAgKDB4MUYxNkIsICdNJywgdSdtZCcpLAogICAgKDB4MUYxNkMsICdYJyksCiAgICAoMHgxRjE3MCwgJ1YnKSwKICAgICgweDFGMTkwLCAnTScsIHUnZGonKSwKICAgICgweDFGMTkxLCAnVicpLAogICAgKDB4MUYxOUIsICdYJyksCiAgICAoMHgxRjFFNiwgJ1YnKSwKICAgICgweDFGMjAwLCAnTScsIHUn44G744GLJyksCiAgICAoMHgxRjIwMSwgJ00nLCB1J+OCs+OCsycpLAogICAgKDB4MUYyMDIsICdNJywgdSfjgrUnKSwKICAgICgweDFGMjAzLCAnWCcpLAogICAgKDB4MUYyMTAsICdNJywgdSfmiYsnKSwKICAgICgweDFGMjExLCAnTScsIHUn5a2XJyksCiAgICAoMHgxRjIxMiwgJ00nLCB1J+WPjCcpLAogICAgKDB4MUYyMTMsICdNJywgdSfjg4cnKSwKICAgICgweDFGMjE0LCAnTScsIHUn5LqMJyksCiAgICAoMHgxRjIxNSwgJ00nLCB1J+WkmicpLAogICAgKDB4MUYyMTYsICdNJywgdSfop6MnKSwKICAgICgweDFGMjE3LCAnTScsIHUn5aSpJyksCiAgICAoMHgxRjIxOCwgJ00nLCB1J+S6pCcpLAogICAgKDB4MUYyMTksICdNJywgdSfmmKAnKSwKICAgICgweDFGMjFBLCAnTScsIHUn54ShJyksCiAgICAoMHgxRjIxQiwgJ00nLCB1J+aWmScpLAogICAgKDB4MUYyMUMsICdNJywgdSfliY0nKSwKICAgICgweDFGMjFELCAnTScsIHUn5b6MJyksCiAgICAoMHgxRjIxRSwgJ00nLCB1J+WGjScpLAogICAgKDB4MUYyMUYsICdNJywgdSfmlrAnKSwKICAgICgweDFGMjIwLCAnTScsIHUn5YidJyksCiAgICAoMHgxRjIyMSwgJ00nLCB1J+e1gicpLAogICAgKDB4MUYyMjIsICdNJywgdSfnlJ8nKSwKICAgICgweDFGMjIzLCAnTScsIHUn6LKpJyksCiAgICAoMHgxRjIyNCwgJ00nLCB1J+WjsCcpLAogICAgKDB4MUYyMjUsICdNJywgdSflkLknKSwKICAgICgweDFGMjI2LCAnTScsIHUn5ryUJyksCiAgICAoMHgxRjIyNywgJ00nLCB1J+aKlScpLAogICAgKDB4MUYyMjgsICdNJywgdSfmjZUnKSwKICAgICgweDFGMjI5LCAnTScsIHUn5LiAJyksCiAgICAoMHgxRjIyQSwgJ00nLCB1J+S4iScpLAogICAgKDB4MUYyMkIsICdNJywgdSfpgYonKSwKICAgICgweDFGMjJDLCAnTScsIHUn5bemJyksCiAgICAoMHgxRjIyRCwgJ00nLCB1J+S4rScpLAogICAgKDB4MUYyMkUsICdNJywgdSflj7MnKSwKICAgICgweDFGMjJGLCAnTScsIHUn5oyHJyksCiAgICAoMHgxRjIzMCwgJ00nLCB1J+i1sCcpLAogICAgKDB4MUYyMzEsICdNJywgdSfmiZMnKSwKICAgICgweDFGMjMyLCAnTScsIHUn56aBJyksCiAgICAoMHgxRjIzMywgJ00nLCB1J+epuicpLAogICAgKDB4MUYyMzQsICdNJywgdSflkIgnKSwKICAgICgweDFGMjM1LCAnTScsIHUn5rqAJyksCiAgICAoMHgxRjIzNiwgJ00nLCB1J+aciScpLAogICAgKDB4MUYyMzcsICdNJywgdSfmnIgnKSwKICAgICgweDFGMjM4LCAnTScsIHUn55SzJyksCiAgICAoMHgxRjIzOSwgJ00nLCB1J+WJsicpLAogICAgKDB4MUYyM0EsICdNJywgdSfllrYnKSwKICAgICgweDFGMjNCLCAnWCcpLAogICAgKDB4MUYyNDAsICdNJywgdSfjgJTmnKzjgJUnKSwKICAgICgweDFGMjQxLCAnTScsIHUn44CU5LiJ44CVJyksCiAgICAoMHgxRjI0MiwgJ00nLCB1J+OAlOS6jOOAlScpLAogICAgKDB4MUYyNDMsICdNJywgdSfjgJTlronjgJUnKSwKICAgICgweDFGMjQ0LCAnTScsIHUn44CU54K544CVJyksCiAgICAoMHgxRjI0NSwgJ00nLCB1J+OAlOaJk+OAlScpLAogICAgKDB4MUYyNDYsICdNJywgdSfjgJTnm5fjgJUnKSwKICAgICgweDFGMjQ3LCAnTScsIHUn44CU5Yud44CVJyksCiAgICAoMHgxRjI0OCwgJ00nLCB1J+OAlOaVl+OAlScpLAogICAgKDB4MUYyNDksICdYJyksCiAgICAoMHgxRjI1MCwgJ00nLCB1J+W+lycpLAogICAgKDB4MUYyNTEsICdNJywgdSflj68nKSwKICAgICgweDFGMjUyLCAnWCcpLAogICAgKDB4MUYzMDAsICdWJyksCiAgICAoMHgxRjMyMSwgJ1gnKSwKICAgICgweDFGMzMwLCAnVicpLAogICAgKDB4MUYzMzYsICdYJyksCiAgICAoMHgxRjMzNywgJ1YnKSwKICAgICgweDFGMzdELCAnWCcpLAogICAgKDB4MUYzODAsICdWJyksCiAgICAoMHgxRjM5NCwgJ1gnKSwKICAgICgweDFGM0EwLCAnVicpLAogICAgKDB4MUYzQzUsICdYJyksCiAgICAoMHgxRjNDNiwgJ1YnKSwKICAgICgweDFGM0NCLCAnWCcpLAogICAgKDB4MUYzRTAsICdWJyksCiAgICAoMHgxRjNGMSwgJ1gnKSwKICAgICgweDFGNDAwLCAnVicpLAogICAgKDB4MUY0M0YsICdYJyksCiAgICAoMHgxRjQ0MCwgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzY3KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUY0NDEsICdYJyksCiAgICAoMHgxRjQ0MiwgJ1YnKSwKICAgICgweDFGNEY4LCAnWCcpLAogICAgKDB4MUY0RjksICdWJyksCiAgICAoMHgxRjRGRCwgJ1gnKSwKICAgICgweDFGNTAwLCAnVicpLAogICAgKDB4MUY1M0UsICdYJyksCiAgICAoMHgxRjU0MCwgJ1YnKSwKICAgICgweDFGNTQ0LCAnWCcpLAogICAgKDB4MUY1NTAsICdWJyksCiAgICAoMHgxRjU2OCwgJ1gnKSwKICAgICgweDFGNUZCLCAnVicpLAogICAgKDB4MUY2NDEsICdYJyksCiAgICAoMHgxRjY0NSwgJ1YnKSwKICAgICgweDFGNjUwLCAnWCcpLAogICAgKDB4MUY2ODAsICdWJyksCiAgICAoMHgxRjZDNiwgJ1gnKSwKICAgICgweDFGNzAwLCAnVicpLAogICAgKDB4MUY3NzQsICdYJyksCiAgICAoMHgyMDAwMCwgJ1YnKSwKICAgICgweDJBNkQ3LCAnWCcpLAogICAgKDB4MkE3MDAsICdWJyksCiAgICAoMHgyQjczNSwgJ1gnKSwKICAgICgweDJCNzQwLCAnVicpLAogICAgKDB4MkI4MUUsICdYJyksCiAgICAoMHgyRjgwMCwgJ00nLCB1J+S4vScpLAogICAgKDB4MkY4MDEsICdNJywgdSfkuLgnKSwKICAgICgweDJGODAyLCAnTScsIHUn5LmBJyksCiAgICAoMHgyRjgwMywgJ00nLCB1J/CghKInKSwKICAgICgweDJGODA0LCAnTScsIHUn5L2gJyksCiAgICAoMHgyRjgwNSwgJ00nLCB1J+S+ricpLAogICAgKDB4MkY4MDYsICdNJywgdSfkvrsnKSwKICAgICgweDJGODA3LCAnTScsIHUn5YCCJyksCiAgICAoMHgyRjgwOCwgJ00nLCB1J+WBuicpLAogICAgKDB4MkY4MDksICdNJywgdSflgpknKSwKICAgICgweDJGODBBLCAnTScsIHUn5YOnJyksCiAgICAoMHgyRjgwQiwgJ00nLCB1J+WDjycpLAogICAgKDB4MkY4MEMsICdNJywgdSfjkp4nKSwKICAgICgweDJGODBELCAnTScsIHUn8KCYuicpLAogICAgKDB4MkY4MEUsICdNJywgdSflhY0nKSwKICAgICgweDJGODBGLCAnTScsIHUn5YWUJyksCiAgICAoMHgyRjgxMCwgJ00nLCB1J+WFpCcpLAogICAgKDB4MkY4MTEsICdNJywgdSflhbcnKSwKICAgICgweDJGODEyLCAnTScsIHUn8KCUnCcpLAogICAgKDB4MkY4MTMsICdNJywgdSfjkrknKSwKICAgICgweDJGODE0LCAnTScsIHUn5YWnJyksCiAgICAoMHgyRjgxNSwgJ00nLCB1J+WGjScpLAogICAgKDB4MkY4MTYsICdNJywgdSfwoJWLJyksCiAgICAoMHgyRjgxNywgJ00nLCB1J+WGlycpLAogICAgKDB4MkY4MTgsICdNJywgdSflhqQnKSwKICAgICgweDJGODE5LCAnTScsIHUn5LuMJyksCiAgICAoMHgyRjgxQSwgJ00nLCB1J+WGrCcpLAogICAgKDB4MkY4MUIsICdNJywgdSflhrUnKSwKICAgICgweDJGODFDLCAnTScsIHUn8KmHnycpLAogICAgKDB4MkY4MUQsICdNJywgdSflh7UnKSwKICAgICgweDJGODFFLCAnTScsIHUn5YiDJyksCiAgICAoMHgyRjgxRiwgJ00nLCB1J+OTnycpLAogICAgKDB4MkY4MjAsICdNJywgdSfliLsnKSwKICAgICgweDJGODIxLCAnTScsIHUn5YmGJyksCiAgICAoMHgyRjgyMiwgJ00nLCB1J+WJsicpLAogICAgKDB4MkY4MjMsICdNJywgdSflibcnKSwKICAgICgweDJGODI0LCAnTScsIHUn45SVJyksCiAgICAoMHgyRjgyNSwgJ00nLCB1J+WLhycpLAogICAgKDB4MkY4MjYsICdNJywgdSfli4knKSwKICAgICgweDJGODI3LCAnTScsIHUn5YukJyksCiAgICAoMHgyRjgyOCwgJ00nLCB1J+WLuicpLAogICAgKDB4MkY4MjksICdNJywgdSfljIUnKSwKICAgICgweDJGODJBLCAnTScsIHUn5YyGJyksCiAgICAoMHgyRjgyQiwgJ00nLCB1J+WMlycpLAogICAgKDB4MkY4MkMsICdNJywgdSfljYknKSwKICAgICgweDJGODJELCAnTScsIHUn5Y2RJyksCiAgICAoMHgyRjgyRSwgJ00nLCB1J+WNmicpLAogICAgKDB4MkY4MkYsICdNJywgdSfljbMnKSwKICAgICgweDJGODMwLCAnTScsIHUn5Y29JyksCiAgICAoMHgyRjgzMSwgJ00nLCB1J+WNvycpLAogICAgKDB4MkY4MzQsICdNJywgdSfwoKisJyksCiAgICAoMHgyRjgzNSwgJ00nLCB1J+eBsCcpLAogICAgKDB4MkY4MzYsICdNJywgdSflj4onKSwKICAgICgweDJGODM3LCAnTScsIHUn5Y+fJyksCiAgICAoMHgyRjgzOCwgJ00nLCB1J/CgraMnKSwKICAgICgweDJGODM5LCAnTScsIHUn5Y+rJyksCiAgICAoMHgyRjgzQSwgJ00nLCB1J+WPsScpLAogICAgKDB4MkY4M0IsICdNJywgdSflkIYnKSwKICAgICgweDJGODNDLCAnTScsIHUn5ZKeJyksCiAgICAoMHgyRjgzRCwgJ00nLCB1J+WQuCcpLAogICAgKDB4MkY4M0UsICdNJywgdSflkYgnKSwKICAgICgweDJGODNGLCAnTScsIHUn5ZGoJyksCiAgICAoMHgyRjg0MCwgJ00nLCB1J+WSoicpLAogICAgKDB4MkY4NDEsICdNJywgdSflk7YnKSwKICAgICgweDJGODQyLCAnTScsIHUn5ZSQJyksCiAgICAoMHgyRjg0MywgJ00nLCB1J+WVkycpLAogICAgKDB4MkY4NDQsICdNJywgdSfllaMnKSwKICAgICgweDJGODQ1LCAnTScsIHUn5ZaEJyksCiAgICAoMHgyRjg0NywgJ00nLCB1J+WWmScpLAogICAgKDB4MkY4NDgsICdNJywgdSfllqsnKSwKICAgICgweDJGODQ5LCAnTScsIHUn5ZazJyksCiAgICAoMHgyRjg0QSwgJ00nLCB1J+WXgicpLAogICAgKDB4MkY4NEIsICdNJywgdSflnJYnKSwKICAgICgweDJGODRDLCAnTScsIHUn5ZiGJyksCiAgICAoMHgyRjg0RCwgJ00nLCB1J+WclycpLAogICAgXQoKZGVmIF9zZWdfNjgoKToKICAgIHJldHVybiBbCiAgICAoMHgyRjg0RSwgJ00nLCB1J+WZkScpLAogICAgKDB4MkY4NEYsICdNJywgdSflmbQnKSwKICAgICgweDJGODUwLCAnTScsIHUn5YiHJyksCiAgICAoMHgyRjg1MSwgJ00nLCB1J+WjricpLAogICAgKDB4MkY4NTIsICdNJywgdSfln44nKSwKICAgICgweDJGODUzLCAnTScsIHUn5Z+0JyksCiAgICAoMHgyRjg1NCwgJ00nLCB1J+WgjScpLAogICAgKDB4MkY4NTUsICdNJywgdSflnosnKSwKICAgICgweDJGODU2LCAnTScsIHUn5aCyJyksCiAgICAoMHgyRjg1NywgJ00nLCB1J+WgsScpLAogICAgKDB4MkY4NTgsICdNJywgdSfloqwnKSwKICAgICgweDJGODU5LCAnTScsIHUn8KGTpCcpLAogICAgKDB4MkY4NUEsICdNJywgdSflo7InKSwKICAgICgweDJGODVCLCAnTScsIHUn5aO3JyksCiAgICAoMHgyRjg1QywgJ00nLCB1J+WkhicpLAogICAgKDB4MkY4NUQsICdNJywgdSflpJonKSwKICAgICgweDJGODVFLCAnTScsIHUn5aSiJyksCiAgICAoMHgyRjg1RiwgJ00nLCB1J+WloicpLAogICAgKDB4MkY4NjAsICdNJywgdSfwoZqoJyksCiAgICAoMHgyRjg2MSwgJ00nLCB1J/Chm6onKSwKICAgICgweDJGODYyLCAnTScsIHUn5aesJyksCiAgICAoMHgyRjg2MywgJ00nLCB1J+WomycpLAogICAgKDB4MkY4NjQsICdNJywgdSflqKcnKSwKICAgICgweDJGODY1LCAnTScsIHUn5aeYJyksCiAgICAoMHgyRjg2NiwgJ00nLCB1J+WppicpLAogICAgKDB4MkY4NjcsICdNJywgdSfjm64nKSwKICAgICgweDJGODY4LCAnWCcpLAogICAgKDB4MkY4NjksICdNJywgdSflrIgnKSwKICAgICgweDJGODZBLCAnTScsIHUn5ay+JyksCiAgICAoMHgyRjg2QywgJ00nLCB1J/Chp4gnKSwKICAgICgweDJGODZELCAnTScsIHUn5a+DJyksCiAgICAoMHgyRjg2RSwgJ00nLCB1J+WvmCcpLAogICAgKDB4MkY4NkYsICdNJywgdSflr6cnKSwKICAgICgweDJGODcwLCAnTScsIHUn5a+zJyksCiAgICAoMHgyRjg3MSwgJ00nLCB1J/ChrJgnKSwKICAgICgweDJGODcyLCAnTScsIHUn5a+/JyksCiAgICAoMHgyRjg3MywgJ00nLCB1J+WwhicpLAogICAgKDB4MkY4NzQsICdYJyksCiAgICAoMHgyRjg3NSwgJ00nLCB1J+WwoicpLAogICAgKDB4MkY4NzYsICdNJywgdSfjnoEnKSwKICAgICgweDJGODc3LCAnTScsIHUn5bGgJyksCiAgICAoMHgyRjg3OCwgJ00nLCB1J+WxricpLAogICAgKDB4MkY4NzksICdNJywgdSfls4AnKSwKICAgICgweDJGODdBLCAnTScsIHUn5bKNJyksCiAgICAoMHgyRjg3QiwgJ00nLCB1J/Cht6QnKSwKICAgICgweDJGODdDLCAnTScsIHUn5bWDJyksCiAgICAoMHgyRjg3RCwgJ00nLCB1J/Cht6YnKSwKICAgICgweDJGODdFLCAnTScsIHUn5bWuJyksCiAgICAoMHgyRjg3RiwgJ00nLCB1J+W1qycpLAogICAgKDB4MkY4ODAsICdNJywgdSfltbwnKSwKICAgICgweDJGODgxLCAnTScsIHUn5behJyksCiAgICAoMHgyRjg4MiwgJ00nLCB1J+W3oicpLAogICAgKDB4MkY4ODMsICdNJywgdSfjoK8nKSwKICAgICgweDJGODg0LCAnTScsIHUn5be9JyksCiAgICAoMHgyRjg4NSwgJ00nLCB1J+W4qCcpLAogICAgKDB4MkY4ODYsICdNJywgdSfluL0nKSwKICAgICgweDJGODg3LCAnTScsIHUn5bmpJyksCiAgICAoMHgyRjg4OCwgJ00nLCB1J+OhoicpLAogICAgKDB4MkY4ODksICdNJywgdSfwooaDJyksCiAgICAoMHgyRjg4QSwgJ00nLCB1J+OhvCcpLAogICAgKDB4MkY4OEIsICdNJywgdSflurAnKSwKICAgICgweDJGODhDLCAnTScsIHUn5bqzJyksCiAgICAoMHgyRjg4RCwgJ00nLCB1J+W6ticpLAogICAgKDB4MkY4OEUsICdNJywgdSflu4onKSwKICAgICgweDJGODhGLCAnTScsIHUn8KqOkicpLAogICAgKDB4MkY4OTAsICdNJywgdSflu74nKSwKICAgICgweDJGODkxLCAnTScsIHUn8KKMsScpLAogICAgKDB4MkY4OTMsICdNJywgdSfoiIEnKSwKICAgICgweDJGODk0LCAnTScsIHUn5byiJyksCiAgICAoMHgyRjg5NiwgJ00nLCB1J+OjhycpLAogICAgKDB4MkY4OTcsICdNJywgdSfwo4q4JyksCiAgICAoMHgyRjg5OCwgJ00nLCB1J/Cmh5onKSwKICAgICgweDJGODk5LCAnTScsIHUn5b2iJyksCiAgICAoMHgyRjg5QSwgJ00nLCB1J+W9qycpLAogICAgKDB4MkY4OUIsICdNJywgdSfjo6MnKSwKICAgICgweDJGODlDLCAnTScsIHUn5b6aJyksCiAgICAoMHgyRjg5RCwgJ00nLCB1J+W/jScpLAogICAgKDB4MkY4OUUsICdNJywgdSflv5cnKSwKICAgICgweDJGODlGLCAnTScsIHUn5b+5JyksCiAgICAoMHgyRjhBMCwgJ00nLCB1J+aCgScpLAogICAgKDB4MkY4QTEsICdNJywgdSfjpLonKSwKICAgICgweDJGOEEyLCAnTScsIHUn46ScJyksCiAgICAoMHgyRjhBMywgJ00nLCB1J+aClCcpLAogICAgKDB4MkY4QTQsICdNJywgdSfwopuUJyksCiAgICAoMHgyRjhBNSwgJ00nLCB1J+aDhycpLAogICAgKDB4MkY4QTYsICdNJywgdSfmhYgnKSwKICAgICgweDJGOEE3LCAnTScsIHUn5oWMJyksCiAgICAoMHgyRjhBOCwgJ00nLCB1J+aFjicpLAogICAgKDB4MkY4QTksICdNJywgdSfmhYwnKSwKICAgICgweDJGOEFBLCAnTScsIHUn5oW6JyksCiAgICAoMHgyRjhBQiwgJ00nLCB1J+aGjicpLAogICAgKDB4MkY4QUMsICdNJywgdSfmhrInKSwKICAgICgweDJGOEFELCAnTScsIHUn5oakJyksCiAgICAoMHgyRjhBRSwgJ00nLCB1J+aGrycpLAogICAgKDB4MkY4QUYsICdNJywgdSfmh54nKSwKICAgICgweDJGOEIwLCAnTScsIHUn5oeyJyksCiAgICAoMHgyRjhCMSwgJ00nLCB1J+aHticpLAogICAgKDB4MkY4QjIsICdNJywgdSfmiJAnKSwKICAgICgweDJGOEIzLCAnTScsIHUn5oibJyksCiAgICAoMHgyRjhCNCwgJ00nLCB1J+aJnScpLAogICAgXQoKZGVmIF9zZWdfNjkoKToKICAgIHJldHVybiBbCiAgICAoMHgyRjhCNSwgJ00nLCB1J+aKsScpLAogICAgKDB4MkY4QjYsICdNJywgdSfmi5QnKSwKICAgICgweDJGOEI3LCAnTScsIHUn5o2QJyksCiAgICAoMHgyRjhCOCwgJ00nLCB1J/CirIwnKSwKICAgICgweDJGOEI5LCAnTScsIHUn5oy9JyksCiAgICAoMHgyRjhCQSwgJ00nLCB1J+aLvCcpLAogICAgKDB4MkY4QkIsICdNJywgdSfmjagnKSwKICAgICgweDJGOEJDLCAnTScsIHUn5o6DJyksCiAgICAoMHgyRjhCRCwgJ00nLCB1J+aPpCcpLAogICAgKDB4MkY4QkUsICdNJywgdSfwoq+xJyksCiAgICAoMHgyRjhCRiwgJ00nLCB1J+aQoicpLAogICAgKDB4MkY4QzAsICdNJywgdSfmj4UnKSwKICAgICgweDJGOEMxLCAnTScsIHUn5o6pJyksCiAgICAoMHgyRjhDMiwgJ00nLCB1J+OoricpLAogICAgKDB4MkY4QzMsICdNJywgdSfmkaknKSwKICAgICgweDJGOEM0LCAnTScsIHUn5pG+JyksCiAgICAoMHgyRjhDNSwgJ00nLCB1J+aSnScpLAogICAgKDB4MkY4QzYsICdNJywgdSfmkbcnKSwKICAgICgweDJGOEM3LCAnTScsIHUn46msJyksCiAgICAoMHgyRjhDOCwgJ00nLCB1J+aVjycpLAogICAgKDB4MkY4QzksICdNJywgdSfmlawnKSwKICAgICgweDJGOENBLCAnTScsIHUn8KOAiicpLAogICAgKDB4MkY4Q0IsICdNJywgdSfml6MnKSwKICAgICgweDJGOENDLCAnTScsIHUn5pu4JyksCiAgICAoMHgyRjhDRCwgJ00nLCB1J+aZiScpLAogICAgKDB4MkY4Q0UsICdNJywgdSfjrJknKSwKICAgICgweDJGOENGLCAnTScsIHUn5pqRJyksCiAgICAoMHgyRjhEMCwgJ00nLCB1J+OsiCcpLAogICAgKDB4MkY4RDEsICdNJywgdSfjq6QnKSwKICAgICgweDJGOEQyLCAnTScsIHUn5YaSJyksCiAgICAoMHgyRjhEMywgJ00nLCB1J+WGlScpLAogICAgKDB4MkY4RDQsICdNJywgdSfmnIAnKSwKICAgICgweDJGOEQ1LCAnTScsIHUn5pqcJyksCiAgICAoMHgyRjhENiwgJ00nLCB1J+iCrScpLAogICAgKDB4MkY4RDcsICdNJywgdSfkj5knKSwKICAgICgweDJGOEQ4LCAnTScsIHUn5pyXJyksCiAgICAoMHgyRjhEOSwgJ00nLCB1J+acmycpLAogICAgKDB4MkY4REEsICdNJywgdSfmnKEnKSwKICAgICgweDJGOERCLCAnTScsIHUn5p2eJyksCiAgICAoMHgyRjhEQywgJ00nLCB1J+adkycpLAogICAgKDB4MkY4REQsICdNJywgdSfwo4+DJyksCiAgICAoMHgyRjhERSwgJ00nLCB1J+OtiScpLAogICAgKDB4MkY4REYsICdNJywgdSfmn7onKSwKICAgICgweDJGOEUwLCAnTScsIHUn5p6FJyksCiAgICAoMHgyRjhFMSwgJ00nLCB1J+ahkicpLAogICAgKDB4MkY4RTIsICdNJywgdSfmooUnKSwKICAgICgweDJGOEUzLCAnTScsIHUn8KORrScpLAogICAgKDB4MkY4RTQsICdNJywgdSfmoo4nKSwKICAgICgweDJGOEU1LCAnTScsIHUn5qCfJyksCiAgICAoMHgyRjhFNiwgJ00nLCB1J+aklCcpLAogICAgKDB4MkY4RTcsICdNJywgdSfjrp0nKSwKICAgICgweDJGOEU4LCAnTScsIHUn5qWCJyksCiAgICAoMHgyRjhFOSwgJ00nLCB1J+amoycpLAogICAgKDB4MkY4RUEsICdNJywgdSfmp6onKSwKICAgICgweDJGOEVCLCAnTScsIHUn5qqoJyksCiAgICAoMHgyRjhFQywgJ00nLCB1J/CjmqMnKSwKICAgICgweDJGOEVELCAnTScsIHUn5qubJyksCiAgICAoMHgyRjhFRSwgJ00nLCB1J+OwmCcpLAogICAgKDB4MkY4RUYsICdNJywgdSfmrKEnKSwKICAgICgweDJGOEYwLCAnTScsIHUn8KOipycpLAogICAgKDB4MkY4RjEsICdNJywgdSfmrZQnKSwKICAgICgweDJGOEYyLCAnTScsIHUn47GOJyksCiAgICAoMHgyRjhGMywgJ00nLCB1J+atsicpLAogICAgKDB4MkY4RjQsICdNJywgdSfmrp8nKSwKICAgICgweDJGOEY1LCAnTScsIHUn5q66JyksCiAgICAoMHgyRjhGNiwgJ00nLCB1J+auuycpLAogICAgKDB4MkY4RjcsICdNJywgdSfwo6qNJyksCiAgICAoMHgyRjhGOCwgJ00nLCB1J/ChtIsnKSwKICAgICgweDJGOEY5LCAnTScsIHUn8KOruicpLAogICAgKDB4MkY4RkEsICdNJywgdSfmsY4nKSwKICAgICgweDJGOEZCLCAnTScsIHUn8KOyvCcpLAogICAgKDB4MkY4RkMsICdNJywgdSfmsr8nKSwKICAgICgweDJGOEZELCAnTScsIHUn5rONJyksCiAgICAoMHgyRjhGRSwgJ00nLCB1J+axpycpLAogICAgKDB4MkY4RkYsICdNJywgdSfmtJYnKSwKICAgICgweDJGOTAwLCAnTScsIHUn5rS+JyksCiAgICAoMHgyRjkwMSwgJ00nLCB1J+a1tycpLAogICAgKDB4MkY5MDIsICdNJywgdSfmtYEnKSwKICAgICgweDJGOTAzLCAnTScsIHUn5rWpJyksCiAgICAoMHgyRjkwNCwgJ00nLCB1J+a1uCcpLAogICAgKDB4MkY5MDUsICdNJywgdSfmtoUnKSwKICAgICgweDJGOTA2LCAnTScsIHUn8KO0nicpLAogICAgKDB4MkY5MDcsICdNJywgdSfmtLQnKSwKICAgICgweDJGOTA4LCAnTScsIHUn5rivJyksCiAgICAoMHgyRjkwOSwgJ00nLCB1J+a5ricpLAogICAgKDB4MkY5MEEsICdNJywgdSfjtLMnKSwKICAgICgweDJGOTBCLCAnTScsIHUn5ruLJyksCiAgICAoMHgyRjkwQywgJ00nLCB1J+a7hycpLAogICAgKDB4MkY5MEQsICdNJywgdSfwo7uRJyksCiAgICAoMHgyRjkwRSwgJ00nLCB1J+a3uScpLAogICAgKDB4MkY5MEYsICdNJywgdSfmva4nKSwKICAgICgweDJGOTEwLCAnTScsIHUn8KO9nicpLAogICAgKDB4MkY5MTEsICdNJywgdSfwo76OJyksCiAgICAoMHgyRjkxMiwgJ00nLCB1J+a/hicpLAogICAgKDB4MkY5MTMsICdNJywgdSfngLknKSwKICAgICgweDJGOTE0LCAnTScsIHUn54CeJyksCiAgICAoMHgyRjkxNSwgJ00nLCB1J+eAmycpLAogICAgKDB4MkY5MTYsICdNJywgdSfjtpYnKSwKICAgICgweDJGOTE3LCAnTScsIHUn54GKJyksCiAgICAoMHgyRjkxOCwgJ00nLCB1J+eBvScpLAogICAgXQoKZGVmIF9zZWdfNzAoKToKICAgIHJldHVybiBbCiAgICAoMHgyRjkxOSwgJ00nLCB1J+eBtycpLAogICAgKDB4MkY5MUEsICdNJywgdSfngq0nKSwKICAgICgweDJGOTFCLCAnTScsIHUn8KCUpScpLAogICAgKDB4MkY5MUMsICdNJywgdSfnhYUnKSwKICAgICgweDJGOTFELCAnTScsIHUn8KSJoycpLAogICAgKDB4MkY5MUUsICdNJywgdSfnhpwnKSwKICAgICgweDJGOTFGLCAnWCcpLAogICAgKDB4MkY5MjAsICdNJywgdSfniKgnKSwKICAgICgweDJGOTIxLCAnTScsIHUn54i1JyksCiAgICAoMHgyRjkyMiwgJ00nLCB1J+eJkCcpLAogICAgKDB4MkY5MjMsICdNJywgdSfwpJiIJyksCiAgICAoMHgyRjkyNCwgJ00nLCB1J+eKgCcpLAogICAgKDB4MkY5MjUsICdNJywgdSfnipUnKSwKICAgICgweDJGOTI2LCAnTScsIHUn8KSctScpLAogICAgKDB4MkY5MjcsICdNJywgdSfwpKCUJyksCiAgICAoMHgyRjkyOCwgJ00nLCB1J+eNuicpLAogICAgKDB4MkY5MjksICdNJywgdSfnjosnKSwKICAgICgweDJGOTJBLCAnTScsIHUn47qsJyksCiAgICAoMHgyRjkyQiwgJ00nLCB1J+eOpScpLAogICAgKDB4MkY5MkMsICdNJywgdSfjurgnKSwKICAgICgweDJGOTJFLCAnTScsIHUn55GHJyksCiAgICAoMHgyRjkyRiwgJ00nLCB1J+eRnCcpLAogICAgKDB4MkY5MzAsICdNJywgdSfnkbEnKSwKICAgICgweDJGOTMxLCAnTScsIHUn55KFJyksCiAgICAoMHgyRjkzMiwgJ00nLCB1J+eTiicpLAogICAgKDB4MkY5MzMsICdNJywgdSfjvJsnKSwKICAgICgweDJGOTM0LCAnTScsIHUn55SkJyksCiAgICAoMHgyRjkzNSwgJ00nLCB1J/CksLYnKSwKICAgICgweDJGOTM2LCAnTScsIHUn55S+JyksCiAgICAoMHgyRjkzNywgJ00nLCB1J/CkspInKSwKICAgICgweDJGOTM4LCAnTScsIHUn55WwJyksCiAgICAoMHgyRjkzOSwgJ00nLCB1J/Cihp8nKSwKICAgICgweDJGOTNBLCAnTScsIHUn55iQJyksCiAgICAoMHgyRjkzQiwgJ00nLCB1J/CkvqEnKSwKICAgICgweDJGOTNDLCAnTScsIHUn8KS+uCcpLAogICAgKDB4MkY5M0QsICdNJywgdSfwpYGEJyksCiAgICAoMHgyRjkzRSwgJ00nLCB1J+O/vCcpLAogICAgKDB4MkY5M0YsICdNJywgdSfkgIgnKSwKICAgICgweDJGOTQwLCAnTScsIHUn55u0JyksCiAgICAoMHgyRjk0MSwgJ00nLCB1J/Clg7MnKSwKICAgICgweDJGOTQyLCAnTScsIHUn8KWDsicpLAogICAgKDB4MkY5NDMsICdNJywgdSfwpYSZJyksCiAgICAoMHgyRjk0NCwgJ00nLCB1J/ClhLMnKSwKICAgICgweDJGOTQ1LCAnTScsIHUn55yeJyksCiAgICAoMHgyRjk0NiwgJ00nLCB1J+ecnycpLAogICAgKDB4MkY5NDgsICdNJywgdSfnnYonKSwKICAgICgweDJGOTQ5LCAnTScsIHUn5IC5JyksCiAgICAoMHgyRjk0QSwgJ00nLCB1J+eeiycpLAogICAgKDB4MkY5NEIsICdNJywgdSfkgYYnKSwKICAgICgweDJGOTRDLCAnTScsIHUn5IKWJyksCiAgICAoMHgyRjk0RCwgJ00nLCB1J/ClkJ0nKSwKICAgICgweDJGOTRFLCAnTScsIHUn56GOJyksCiAgICAoMHgyRjk0RiwgJ00nLCB1J+eijCcpLAogICAgKDB4MkY5NTAsICdNJywgdSfno4wnKSwKICAgICgweDJGOTUxLCAnTScsIHUn5IOjJyksCiAgICAoMHgyRjk1MiwgJ00nLCB1J/ClmKYnKSwKICAgICgweDJGOTUzLCAnTScsIHUn56WWJyksCiAgICAoMHgyRjk1NCwgJ00nLCB1J/ClmponKSwKICAgICgweDJGOTU1LCAnTScsIHUn8KWbhScpLAogICAgKDB4MkY5NTYsICdNJywgdSfnpo8nKSwKICAgICgweDJGOTU3LCAnTScsIHUn56erJyksCiAgICAoMHgyRjk1OCwgJ00nLCB1J+SErycpLAogICAgKDB4MkY5NTksICdNJywgdSfnqYAnKSwKICAgICgweDJGOTVBLCAnTScsIHUn56mKJyksCiAgICAoMHgyRjk1QiwgJ00nLCB1J+epjycpLAogICAgKDB4MkY5NUMsICdNJywgdSfwpaW8JyksCiAgICAoMHgyRjk1RCwgJ00nLCB1J/ClqqcnKSwKICAgICgweDJGOTVGLCAnWCcpLAogICAgKDB4MkY5NjAsICdNJywgdSfkiIInKSwKICAgICgweDJGOTYxLCAnTScsIHUn8KWuqycpLAogICAgKDB4MkY5NjIsICdNJywgdSfnr4YnKSwKICAgICgweDJGOTYzLCAnTScsIHUn56+JJyksCiAgICAoMHgyRjk2NCwgJ00nLCB1J+SIpycpLAogICAgKDB4MkY5NjUsICdNJywgdSfwpbKAJyksCiAgICAoMHgyRjk2NiwgJ00nLCB1J+ezkicpLAogICAgKDB4MkY5NjcsICdNJywgdSfkiqAnKSwKICAgICgweDJGOTY4LCAnTScsIHUn57OoJyksCiAgICAoMHgyRjk2OSwgJ00nLCB1J+ezoycpLAogICAgKDB4MkY5NkEsICdNJywgdSfntIAnKSwKICAgICgweDJGOTZCLCAnTScsIHUn8KW+hicpLAogICAgKDB4MkY5NkMsICdNJywgdSfntaMnKSwKICAgICgweDJGOTZELCAnTScsIHUn5IyBJyksCiAgICAoMHgyRjk2RSwgJ00nLCB1J+e3hycpLAogICAgKDB4MkY5NkYsICdNJywgdSfnuIInKSwKICAgICgweDJGOTcwLCAnTScsIHUn57mFJyksCiAgICAoMHgyRjk3MSwgJ00nLCB1J+SMtCcpLAogICAgKDB4MkY5NzIsICdNJywgdSfwpoioJyksCiAgICAoMHgyRjk3MywgJ00nLCB1J/CmiYcnKSwKICAgICgweDJGOTc0LCAnTScsIHUn5I2ZJyksCiAgICAoMHgyRjk3NSwgJ00nLCB1J/Cmi5knKSwKICAgICgweDJGOTc2LCAnTScsIHUn5726JyksCiAgICAoMHgyRjk3NywgJ00nLCB1J/CmjL4nKSwKICAgICgweDJGOTc4LCAnTScsIHUn576VJyksCiAgICAoMHgyRjk3OSwgJ00nLCB1J+e/uicpLAogICAgKDB4MkY5N0EsICdNJywgdSfogIUnKSwKICAgICgweDJGOTdCLCAnTScsIHUn8KaTmicpLAogICAgKDB4MkY5N0MsICdNJywgdSfwppSjJyksCiAgICAoMHgyRjk3RCwgJ00nLCB1J+iBoCcpLAogICAgKDB4MkY5N0UsICdNJywgdSfwppaoJyksCiAgICAoMHgyRjk3RiwgJ00nLCB1J+iBsCcpLAogICAgXQoKZGVmIF9zZWdfNzEoKToKICAgIHJldHVybiBbCiAgICAoMHgyRjk4MCwgJ00nLCB1J/CjjZ8nKSwKICAgICgweDJGOTgxLCAnTScsIHUn5I+VJyksCiAgICAoMHgyRjk4MiwgJ00nLCB1J+iCsicpLAogICAgKDB4MkY5ODMsICdNJywgdSfohIMnKSwKICAgICgweDJGOTg0LCAnTScsIHUn5JCLJyksCiAgICAoMHgyRjk4NSwgJ00nLCB1J+iEvicpLAogICAgKDB4MkY5ODYsICdNJywgdSflqrUnKSwKICAgICgweDJGOTg3LCAnTScsIHUn8KaepycpLAogICAgKDB4MkY5ODgsICdNJywgdSfwpp61JyksCiAgICAoMHgyRjk4OSwgJ00nLCB1J/CjjpMnKSwKICAgICgweDJGOThBLCAnTScsIHUn8KOOnCcpLAogICAgKDB4MkY5OEIsICdNJywgdSfoiIEnKSwKICAgICgweDJGOThDLCAnTScsIHUn6IiEJyksCiAgICAoMHgyRjk4RCwgJ00nLCB1J+i+nicpLAogICAgKDB4MkY5OEUsICdNJywgdSfkkasnKSwKICAgICgweDJGOThGLCAnTScsIHUn6IqRJyksCiAgICAoMHgyRjk5MCwgJ00nLCB1J+iKiycpLAogICAgKDB4MkY5OTEsICdNJywgdSfoip0nKSwKICAgICgweDJGOTkyLCAnTScsIHUn5YqzJyksCiAgICAoMHgyRjk5MywgJ00nLCB1J+iKsScpLAogICAgKDB4MkY5OTQsICdNJywgdSfoirMnKSwKICAgICgweDJGOTk1LCAnTScsIHUn6Iq9JyksCiAgICAoMHgyRjk5NiwgJ00nLCB1J+iLpicpLAogICAgKDB4MkY5OTcsICdNJywgdSfwpqy8JyksCiAgICAoMHgyRjk5OCwgJ00nLCB1J+iLpScpLAogICAgKDB4MkY5OTksICdNJywgdSfojJ0nKSwKICAgICgweDJGOTlBLCAnTScsIHUn6I2jJyksCiAgICAoMHgyRjk5QiwgJ00nLCB1J+iOrScpLAogICAgKDB4MkY5OUMsICdNJywgdSfojKMnKSwKICAgICgweDJGOTlELCAnTScsIHUn6I69JyksCiAgICAoMHgyRjk5RSwgJ00nLCB1J+iPpycpLAogICAgKDB4MkY5OUYsICdNJywgdSfokZcnKSwKICAgICgweDJGOUEwLCAnTScsIHUn6I2TJyksCiAgICAoMHgyRjlBMSwgJ00nLCB1J+iPiicpLAogICAgKDB4MkY5QTIsICdNJywgdSfoj4wnKSwKICAgICgweDJGOUEzLCAnTScsIHUn6I+cJyksCiAgICAoMHgyRjlBNCwgJ00nLCB1J/CmsLYnKSwKICAgICgweDJGOUE1LCAnTScsIHUn8Ka1qycpLAogICAgKDB4MkY5QTYsICdNJywgdSfwprOVJyksCiAgICAoMHgyRjlBNywgJ00nLCB1J+SUqycpLAogICAgKDB4MkY5QTgsICdNJywgdSfok7EnKSwKICAgICgweDJGOUE5LCAnTScsIHUn6JOzJyksCiAgICAoMHgyRjlBQSwgJ00nLCB1J+iUlicpLAogICAgKDB4MkY5QUIsICdNJywgdSfwp4+KJyksCiAgICAoMHgyRjlBQywgJ00nLCB1J+iVpCcpLAogICAgKDB4MkY5QUQsICdNJywgdSfwprysJyksCiAgICAoMHgyRjlBRSwgJ00nLCB1J+SVnScpLAogICAgKDB4MkY5QUYsICdNJywgdSfklaEnKSwKICAgICgweDJGOUIwLCAnTScsIHUn8Ka+sScpLAogICAgKDB4MkY5QjEsICdNJywgdSfwp4OSJyksCiAgICAoMHgyRjlCMiwgJ00nLCB1J+SVqycpLAogICAgKDB4MkY5QjMsICdNJywgdSfomZAnKSwKICAgICgweDJGOUI0LCAnTScsIHUn6JmcJyksCiAgICAoMHgyRjlCNSwgJ00nLCB1J+iZpycpLAogICAgKDB4MkY5QjYsICdNJywgdSfomaknKSwKICAgICgweDJGOUI3LCAnTScsIHUn6JqpJyksCiAgICAoMHgyRjlCOCwgJ00nLCB1J+iaiCcpLAogICAgKDB4MkY5QjksICdNJywgdSfonI4nKSwKICAgICgweDJGOUJBLCAnTScsIHUn6JuiJyksCiAgICAoMHgyRjlCQiwgJ00nLCB1J+iduScpLAogICAgKDB4MkY5QkMsICdNJywgdSfonKgnKSwKICAgICgweDJGOUJELCAnTScsIHUn6J2rJyksCiAgICAoMHgyRjlCRSwgJ00nLCB1J+iehicpLAogICAgKDB4MkY5QkYsICdYJyksCiAgICAoMHgyRjlDMCwgJ00nLCB1J+ifoScpLAogICAgKDB4MkY5QzEsICdNJywgdSfooIEnKSwKICAgICgweDJGOUMyLCAnTScsIHUn5Je5JyksCiAgICAoMHgyRjlDMywgJ00nLCB1J+ihoCcpLAogICAgKDB4MkY5QzQsICdNJywgdSfooaMnKSwKICAgICgweDJGOUM1LCAnTScsIHUn8KeZpycpLAogICAgKDB4MkY5QzYsICdNJywgdSfoo5cnKSwKICAgICgweDJGOUM3LCAnTScsIHUn6KOeJyksCiAgICAoMHgyRjlDOCwgJ00nLCB1J+SYtScpLAogICAgKDB4MkY5QzksICdNJywgdSfoo7onKSwKICAgICgweDJGOUNBLCAnTScsIHUn45K7JyksCiAgICAoMHgyRjlDQiwgJ00nLCB1J/Cnoq4nKSwKICAgICgweDJGOUNDLCAnTScsIHUn8KelpicpLAogICAgKDB4MkY5Q0QsICdNJywgdSfkmr4nKSwKICAgICgweDJGOUNFLCAnTScsIHUn5JuHJyksCiAgICAoMHgyRjlDRiwgJ00nLCB1J+iqoCcpLAogICAgKDB4MkY5RDAsICdNJywgdSfoq60nKSwKICAgICgweDJGOUQxLCAnTScsIHUn6K6KJyksCiAgICAoMHgyRjlEMiwgJ00nLCB1J+ixlScpLAogICAgKDB4MkY5RDMsICdNJywgdSfwp7KoJyksCiAgICAoMHgyRjlENCwgJ00nLCB1J+iyqycpLAogICAgKDB4MkY5RDUsICdNJywgdSfos4EnKSwKICAgICgweDJGOUQ2LCAnTScsIHUn6LSbJyksCiAgICAoMHgyRjlENywgJ00nLCB1J+i1tycpLAogICAgKDB4MkY5RDgsICdNJywgdSfwp7yvJyksCiAgICAoMHgyRjlEOSwgJ00nLCB1J/CgoIQnKSwKICAgICgweDJGOURBLCAnTScsIHUn6LeLJyksCiAgICAoMHgyRjlEQiwgJ00nLCB1J+i2vCcpLAogICAgKDB4MkY5REMsICdNJywgdSfot7AnKSwKICAgICgweDJGOURELCAnTScsIHUn8KCjnicpLAogICAgKDB4MkY5REUsICdNJywgdSfou5QnKSwKICAgICgweDJGOURGLCAnTScsIHUn6Ly4JyksCiAgICAoMHgyRjlFMCwgJ00nLCB1J/Col5InKSwKICAgICgweDJGOUUxLCAnTScsIHUn8KiXrScpLAogICAgKDB4MkY5RTIsICdNJywgdSfpgpQnKSwKICAgICgweDJGOUUzLCAnTScsIHUn6YOxJyksCiAgICBdCgpkZWYgX3NlZ183MigpOgogICAgcmV0dXJuIFsKICAgICgweDJGOUU0LCAnTScsIHUn6YSRJyksCiAgICAoMHgyRjlFNSwgJ00nLCB1J/ConK4nKSwKICAgICgweDJGOUU2LCAnTScsIHUn6YSbJyksCiAgICAoMHgyRjlFNywgJ00nLCB1J+mIuCcpLAogICAgKDB4MkY5RTgsICdNJywgdSfpi5cnKSwKICAgICgweDJGOUU5LCAnTScsIHUn6YuYJyksCiAgICAoMHgyRjlFQSwgJ00nLCB1J+mJvCcpLAogICAgKDB4MkY5RUIsICdNJywgdSfpj7knKSwKICAgICgweDJGOUVDLCAnTScsIHUn6ZCVJyksCiAgICAoMHgyRjlFRCwgJ00nLCB1J/Cor7onKSwKICAgICgweDJGOUVFLCAnTScsIHUn6ZaLJyksCiAgICAoMHgyRjlFRiwgJ00nLCB1J+SmlScpLAogICAgKDB4MkY5RjAsICdNJywgdSfplrcnKSwKICAgICgweDJGOUYxLCAnTScsIHUn8Ki1tycpLAogICAgKDB4MkY5RjIsICdNJywgdSfkp6YnKSwKICAgICgweDJGOUYzLCAnTScsIHUn6ZuDJyksCiAgICAoMHgyRjlGNCwgJ00nLCB1J+W2sicpLAogICAgKDB4MkY5RjUsICdNJywgdSfpnKMnKSwKICAgICgweDJGOUY2LCAnTScsIHUn8KmFhScpLAogICAgKDB4MkY5RjcsICdNJywgdSfwqYiaJyksCiAgICAoMHgyRjlGOCwgJ00nLCB1J+SpricpLAogICAgKDB4MkY5RjksICdNJywgdSfkqbYnKSwKICAgICgweDJGOUZBLCAnTScsIHUn6Z+gJyksCiAgICAoMHgyRjlGQiwgJ00nLCB1J/CpkIonKSwKICAgICgweDJGOUZDLCAnTScsIHUn5KqyJyksCiAgICAoMHgyRjlGRCwgJ00nLCB1J/CpkpYnKSwKICAgICgweDJGOUZFLCAnTScsIHUn6aCLJyksCiAgICAoMHgyRkEwMCwgJ00nLCB1J+mgqScpLAogICAgKDB4MkZBMDEsICdNJywgdSfwqZa2JyksCiAgICAoMHgyRkEwMiwgJ00nLCB1J+mjoicpLAogICAgKDB4MkZBMDMsICdNJywgdSfkrLMnKSwKICAgICgweDJGQTA0LCAnTScsIHUn6aSpJyksCiAgICAoMHgyRkEwNSwgJ00nLCB1J+mmpycpLAogICAgKDB4MkZBMDYsICdNJywgdSfpp4InKSwKICAgICgweDJGQTA3LCAnTScsIHUn6ae+JyksCiAgICAoMHgyRkEwOCwgJ00nLCB1J+SvjicpLAogICAgKDB4MkZBMDksICdNJywgdSfwqaywJyksCiAgICAoMHgyRkEwQSwgJ00nLCB1J+mskicpLAogICAgKDB4MkZBMEIsICdNJywgdSfpsYAnKSwKICAgICgweDJGQTBDLCAnTScsIHUn6bO9JyksCiAgICAoMHgyRkEwRCwgJ00nLCB1J+SzjicpLAogICAgKDB4MkZBMEUsICdNJywgdSfks60nKSwKICAgICgweDJGQTBGLCAnTScsIHUn6bWnJyksCiAgICAoMHgyRkExMCwgJ00nLCB1J/Cqg44nKSwKICAgICgweDJGQTExLCAnTScsIHUn5LO4JyksCiAgICAoMHgyRkExMiwgJ00nLCB1J/CqhIUnKSwKICAgICgweDJGQTEzLCAnTScsIHUn8KqIjicpLAogICAgKDB4MkZBMTQsICdNJywgdSfwqoqRJyksCiAgICAoMHgyRkExNSwgJ00nLCB1J+m6uycpLAogICAgKDB4MkZBMTYsICdNJywgdSfktZYnKSwKICAgICgweDJGQTE3LCAnTScsIHUn6bu5JyksCiAgICAoMHgyRkExOCwgJ00nLCB1J+m7vicpLAogICAgKDB4MkZBMTksICdNJywgdSfpvIUnKSwKICAgICgweDJGQTFBLCAnTScsIHUn6byPJyksCiAgICAoMHgyRkExQiwgJ00nLCB1J+m8licpLAogICAgKDB4MkZBMUMsICdNJywgdSfpvLsnKSwKICAgICgweDJGQTFELCAnTScsIHUn8KqYgCcpLAogICAgKDB4MkZBMUUsICdYJyksCiAgICAoMHhFMDEwMCwgJ0knKSwKICAgICgweEUwMUYwLCAnWCcpLAogICAgXQoKdXRzNDZkYXRhID0gdHVwbGUoCiAgICBfc2VnXzAoKQogICAgKyBfc2VnXzEoKQogICAgKyBfc2VnXzIoKQogICAgKyBfc2VnXzMoKQogICAgKyBfc2VnXzQoKQogICAgKyBfc2VnXzUoKQogICAgKyBfc2VnXzYoKQogICAgKyBfc2VnXzcoKQogICAgKyBfc2VnXzgoKQogICAgKyBfc2VnXzkoKQogICAgKyBfc2VnXzEwKCkKICAgICsgX3NlZ18xMSgpCiAgICArIF9zZWdfMTIoKQogICAgKyBfc2VnXzEzKCkKICAgICsgX3NlZ18xNCgpCiAgICArIF9zZWdfMTUoKQogICAgKyBfc2VnXzE2KCkKICAgICsgX3NlZ18xNygpCiAgICArIF9zZWdfMTgoKQogICAgKyBfc2VnXzE5KCkKICAgICsgX3NlZ18yMCgpCiAgICArIF9zZWdfMjEoKQogICAgKyBfc2VnXzIyKCkKICAgICsgX3NlZ18yMygpCiAgICArIF9zZWdfMjQoKQogICAgKyBfc2VnXzI1KCkKICAgICsgX3NlZ18yNigpCiAgICArIF9zZWdfMjcoKQogICAgKyBfc2VnXzI4KCkKICAgICsgX3NlZ18yOSgpCiAgICArIF9zZWdfMzAoKQogICAgKyBfc2VnXzMxKCkKICAgICsgX3NlZ18zMigpCiAgICArIF9zZWdfMzMoKQogICAgKyBfc2VnXzM0KCkKICAgICsgX3NlZ18zNSgpCiAgICArIF9zZWdfMzYoKQogICAgKyBfc2VnXzM3KCkKICAgICsgX3NlZ18zOCgpCiAgICArIF9zZWdfMzkoKQogICAgKyBfc2VnXzQwKCkKICAgICsgX3NlZ180MSgpCiAgICArIF9zZWdfNDIoKQogICAgKyBfc2VnXzQzKCkKICAgICsgX3NlZ180NCgpCiAgICArIF9zZWdfNDUoKQogICAgKyBfc2VnXzQ2KCkKICAgICsgX3NlZ180NygpCiAgICArIF9zZWdfNDgoKQogICAgKyBfc2VnXzQ5KCkKICAgICsgX3NlZ181MCgpCiAgICArIF9zZWdfNTEoKQogICAgKyBfc2VnXzUyKCkKICAgICsgX3NlZ181MygpCiAgICArIF9zZWdfNTQoKQogICAgKyBfc2VnXzU1KCkKICAgICsgX3NlZ181NigpCiAgICArIF9zZWdfNTcoKQogICAgKyBfc2VnXzU4KCkKICAgICsgX3NlZ181OSgpCiAgICArIF9zZWdfNjAoKQogICAgKyBfc2VnXzYxKCkKICAgICsgX3NlZ182MigpCiAgICArIF9zZWdfNjMoKQogICAgKyBfc2VnXzY0KCkKICAgICsgX3NlZ182NSgpCiAgICArIF9zZWdfNjYoKQogICAgKyBfc2VnXzY3KCkKICAgICsgX3NlZ182OCgpCiAgICArIF9zZWdfNjkoKQogICAgKyBfc2VnXzcwKCkKICAgICsgX3NlZ183MSgpCiAgICArIF9zZWdfNzIoKQopClBLAwQUAAAAAAAAACEA3cSmBTA5AQAwOQEAKAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pcGFkZHJlc3MucHkjIENvcHlyaWdodCAyMDA3IEdvb2dsZSBJbmMuCiMgIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KCiIiIkEgZmFzdCwgbGlnaHR3ZWlnaHQgSVB2NC9JUHY2IG1hbmlwdWxhdGlvbiBsaWJyYXJ5IGluIFB5dGhvbi4KClRoaXMgbGlicmFyeSBpcyB1c2VkIHRvIGNyZWF0ZS9wb2tlL21hbmlwdWxhdGUgSVB2NCBhbmQgSVB2NiBhZGRyZXNzZXMKYW5kIG5ldHdvcmtzLgoKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKCgppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBzdHJ1Y3QKCl9fdmVyc2lvbl9fID0gJzEuMC4xNycKCiMgQ29tcGF0aWJpbGl0eSBmdW5jdGlvbnMKX2NvbXBhdF9pbnRfdHlwZXMgPSAoaW50LCkKdHJ5OgogICAgX2NvbXBhdF9pbnRfdHlwZXMgPSAoaW50LCBsb25nKQpleGNlcHQgTmFtZUVycm9yOgogICAgcGFzcwp0cnk6CiAgICBfY29tcGF0X3N0ciA9IHVuaWNvZGUKZXhjZXB0IE5hbWVFcnJvcjoKICAgIF9jb21wYXRfc3RyID0gc3RyCiAgICBhc3NlcnQgYnl0ZXMgIT0gc3RyCmlmIGInXDAnWzBdID09IDA6ICAjIFB5dGhvbiAzIHNlbWFudGljcwogICAgZGVmIF9jb21wYXRfYnl0ZXNfdG9fYnl0ZV92YWxzKGJ5dCk6CiAgICAgICAgcmV0dXJuIGJ5dAplbHNlOgogICAgZGVmIF9jb21wYXRfYnl0ZXNfdG9fYnl0ZV92YWxzKGJ5dCk6CiAgICAgICAgcmV0dXJuIFtzdHJ1Y3QudW5wYWNrKGInIUInLCBiKVswXSBmb3IgYiBpbiBieXRdCnRyeToKICAgIF9jb21wYXRfaW50X2Zyb21fYnl0ZV92YWxzID0gaW50LmZyb21fYnl0ZXMKZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgZGVmIF9jb21wYXRfaW50X2Zyb21fYnl0ZV92YWxzKGJ5dHZhbHMsIGVuZGlhbmVzcyk6CiAgICAgICAgYXNzZXJ0IGVuZGlhbmVzcyA9PSAnYmlnJwogICAgICAgIHJlcyA9IDAKICAgICAgICBmb3IgYnYgaW4gYnl0dmFsczoKICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYnYsIF9jb21wYXRfaW50X3R5cGVzKQogICAgICAgICAgICByZXMgPSAocmVzIDw8IDgpICsgYnYKICAgICAgICByZXR1cm4gcmVzCgoKZGVmIF9jb21wYXRfdG9fYnl0ZXMoaW50dmFsLCBsZW5ndGgsIGVuZGlhbmVzcyk6CiAgICBhc3NlcnQgaXNpbnN0YW5jZShpbnR2YWwsIF9jb21wYXRfaW50X3R5cGVzKQogICAgYXNzZXJ0IGVuZGlhbmVzcyA9PSAnYmlnJwogICAgaWYgbGVuZ3RoID09IDQ6CiAgICAgICAgaWYgaW50dmFsIDwgMCBvciBpbnR2YWwgPj0gMiAqKiAzMjoKICAgICAgICAgICAgcmFpc2Ugc3RydWN0LmVycm9yKCJpbnRlZ2VyIG91dCBvZiByYW5nZSBmb3IgJ0knIGZvcm1hdCBjb2RlIikKICAgICAgICByZXR1cm4gc3RydWN0LnBhY2soYichSScsIGludHZhbCkKICAgIGVsaWYgbGVuZ3RoID09IDE2OgogICAgICAgIGlmIGludHZhbCA8IDAgb3IgaW50dmFsID49IDIgKiogMTI4OgogICAgICAgICAgICByYWlzZSBzdHJ1Y3QuZXJyb3IoImludGVnZXIgb3V0IG9mIHJhbmdlIGZvciAnUVEnIGZvcm1hdCBjb2RlIikKICAgICAgICByZXR1cm4gc3RydWN0LnBhY2soYichUVEnLCBpbnR2YWwgPj4gNjQsIGludHZhbCAmIDB4ZmZmZmZmZmZmZmZmZmZmZikKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCmlmIGhhc2F0dHIoaW50LCAnYml0X2xlbmd0aCcpOgogICAgIyBOb3QgaW50LmJpdF9sZW5ndGggLCBzaW5jZSB0aGF0IHdvbid0IHdvcmsgaW4gMi43IHdoZXJlIGxvbmcgZXhpc3RzCiAgICBkZWYgX2NvbXBhdF9iaXRfbGVuZ3RoKGkpOgogICAgICAgIHJldHVybiBpLmJpdF9sZW5ndGgoKQplbHNlOgogICAgZGVmIF9jb21wYXRfYml0X2xlbmd0aChpKToKICAgICAgICBmb3IgcmVzIGluIGl0ZXJ0b29scy5jb3VudCgpOgogICAgICAgICAgICBpZiBpID4+IHJlcyA9PSAwOgogICAgICAgICAgICAgICAgcmV0dXJuIHJlcwoKCmRlZiBfY29tcGF0X3JhbmdlKHN0YXJ0LCBlbmQsIHN0ZXA9MSk6CiAgICBhc3NlcnQgc3RlcCA+IDAKICAgIGkgPSBzdGFydAogICAgd2hpbGUgaSA8IGVuZDoKICAgICAgICB5aWVsZCBpCiAgICAgICAgaSArPSBzdGVwCgoKY2xhc3MgX1RvdGFsT3JkZXJpbmdNaXhpbihvYmplY3QpOgogICAgX19zbG90c19fID0gKCkKCiAgICAjIEhlbHBlciB0aGF0IGRlcml2ZXMgdGhlIG90aGVyIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBmcm9tCiAgICAjIF9fbHRfXyBhbmQgX19lcV9fCiAgICAjIFdlIGF2b2lkIGZ1bmN0b29scy50b3RhbF9vcmRlcmluZyBiZWNhdXNlIGl0IGRvZXNuJ3QgaGFuZGxlCiAgICAjIE5vdEltcGxlbWVudGVkIGNvcnJlY3RseSB5ZXQgKGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMDA0MikKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBlcXVhbCA9IHNlbGYuX19lcV9fKG90aGVyKQogICAgICAgIGlmIGVxdWFsIGlzIE5vdEltcGxlbWVudGVkOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICByZXR1cm4gbm90IGVxdWFsCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGxlc3MgPSBzZWxmLl9fbHRfXyhvdGhlcikKICAgICAgICBpZiBsZXNzIGlzIE5vdEltcGxlbWVudGVkIG9yIG5vdCBsZXNzOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2VxX18ob3RoZXIpCiAgICAgICAgcmV0dXJuIGxlc3MKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICBsZXNzID0gc2VsZi5fX2x0X18ob3RoZXIpCiAgICAgICAgaWYgbGVzcyBpcyBOb3RJbXBsZW1lbnRlZDoKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgZXF1YWwgPSBzZWxmLl9fZXFfXyhvdGhlcikKICAgICAgICBpZiBlcXVhbCBpcyBOb3RJbXBsZW1lbnRlZDoKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgcmV0dXJuIG5vdCAobGVzcyBvciBlcXVhbCkKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBsZXNzID0gc2VsZi5fX2x0X18ob3RoZXIpCiAgICAgICAgaWYgbGVzcyBpcyBOb3RJbXBsZW1lbnRlZDoKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgcmV0dXJuIG5vdCBsZXNzCgoKSVBWNExFTkdUSCA9IDMyCklQVjZMRU5HVEggPSAxMjgKCgpjbGFzcyBBZGRyZXNzVmFsdWVFcnJvcihWYWx1ZUVycm9yKToKICAgICIiIkEgVmFsdWUgRXJyb3IgcmVsYXRlZCB0byB0aGUgYWRkcmVzcy4iIiIKCgpjbGFzcyBOZXRtYXNrVmFsdWVFcnJvcihWYWx1ZUVycm9yKToKICAgICIiIkEgVmFsdWUgRXJyb3IgcmVsYXRlZCB0byB0aGUgbmV0bWFzay4iIiIKCgpkZWYgaXBfYWRkcmVzcyhhZGRyZXNzKToKICAgICIiIlRha2UgYW4gSVAgc3RyaW5nL2ludCBhbmQgcmV0dXJuIGFuIG9iamVjdCBvZiB0aGUgY29ycmVjdCB0eXBlLgoKICAgIEFyZ3M6CiAgICAgICAgYWRkcmVzczogQSBzdHJpbmcgb3IgaW50ZWdlciwgdGhlIElQIGFkZHJlc3MuICBFaXRoZXIgSVB2NCBvcgogICAgICAgICAgSVB2NiBhZGRyZXNzZXMgbWF5IGJlIHN1cHBsaWVkOyBpbnRlZ2VycyBsZXNzIHRoYW4gMioqMzIgd2lsbAogICAgICAgICAgYmUgY29uc2lkZXJlZCB0byBiZSBJUHY0IGJ5IGRlZmF1bHQuCgogICAgUmV0dXJuczoKICAgICAgICBBbiBJUHY0QWRkcmVzcyBvciBJUHY2QWRkcmVzcyBvYmplY3QuCgogICAgUmFpc2VzOgogICAgICAgIFZhbHVlRXJyb3I6IGlmIHRoZSAqYWRkcmVzcyogcGFzc2VkIGlzbid0IGVpdGhlciBhIHY0IG9yIGEgdjYKICAgICAgICAgIGFkZHJlc3MKCiAgICAiIiIKICAgIHRyeToKICAgICAgICByZXR1cm4gSVB2NEFkZHJlc3MoYWRkcmVzcykKICAgIGV4Y2VwdCAoQWRkcmVzc1ZhbHVlRXJyb3IsIE5ldG1hc2tWYWx1ZUVycm9yKToKICAgICAgICBwYXNzCgogICAgdHJ5OgogICAgICAgIHJldHVybiBJUHY2QWRkcmVzcyhhZGRyZXNzKQogICAgZXhjZXB0IChBZGRyZXNzVmFsdWVFcnJvciwgTmV0bWFza1ZhbHVlRXJyb3IpOgogICAgICAgIHBhc3MKCiAgICBpZiBpc2luc3RhbmNlKGFkZHJlc3MsIGJ5dGVzKToKICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcigKICAgICAgICAgICAgJyVyIGRvZXMgbm90IGFwcGVhciB0byBiZSBhbiBJUHY0IG9yIElQdjYgYWRkcmVzcy4gJwogICAgICAgICAgICAnRGlkIHlvdSBwYXNzIGluIGEgYnl0ZXMgKHN0ciBpbiBQeXRob24gMikgaW5zdGVhZCBvZicKICAgICAgICAgICAgJyBhIHVuaWNvZGUgb2JqZWN0PycgJSBhZGRyZXNzKQoKICAgIHJhaXNlIFZhbHVlRXJyb3IoJyVyIGRvZXMgbm90IGFwcGVhciB0byBiZSBhbiBJUHY0IG9yIElQdjYgYWRkcmVzcycgJQogICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKQoKCmRlZiBpcF9uZXR3b3JrKGFkZHJlc3MsIHN0cmljdD1UcnVlKToKICAgICIiIlRha2UgYW4gSVAgc3RyaW5nL2ludCBhbmQgcmV0dXJuIGFuIG9iamVjdCBvZiB0aGUgY29ycmVjdCB0eXBlLgoKICAgIEFyZ3M6CiAgICAgICAgYWRkcmVzczogQSBzdHJpbmcgb3IgaW50ZWdlciwgdGhlIElQIG5ldHdvcmsuICBFaXRoZXIgSVB2NCBvcgogICAgICAgICAgSVB2NiBuZXR3b3JrcyBtYXkgYmUgc3VwcGxpZWQ7IGludGVnZXJzIGxlc3MgdGhhbiAyKiozMiB3aWxsCiAgICAgICAgICBiZSBjb25zaWRlcmVkIHRvIGJlIElQdjQgYnkgZGVmYXVsdC4KCiAgICBSZXR1cm5zOgogICAgICAgIEFuIElQdjROZXR3b3JrIG9yIElQdjZOZXR3b3JrIG9iamVjdC4KCiAgICBSYWlzZXM6CiAgICAgICAgVmFsdWVFcnJvcjogaWYgdGhlIHN0cmluZyBwYXNzZWQgaXNuJ3QgZWl0aGVyIGEgdjQgb3IgYSB2NgogICAgICAgICAgYWRkcmVzcy4gT3IgaWYgdGhlIG5ldHdvcmsgaGFzIGhvc3QgYml0cyBzZXQuCgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIElQdjROZXR3b3JrKGFkZHJlc3MsIHN0cmljdCkKICAgIGV4Y2VwdCAoQWRkcmVzc1ZhbHVlRXJyb3IsIE5ldG1hc2tWYWx1ZUVycm9yKToKICAgICAgICBwYXNzCgogICAgdHJ5OgogICAgICAgIHJldHVybiBJUHY2TmV0d29yayhhZGRyZXNzLCBzdHJpY3QpCiAgICBleGNlcHQgKEFkZHJlc3NWYWx1ZUVycm9yLCBOZXRtYXNrVmFsdWVFcnJvcik6CiAgICAgICAgcGFzcwoKICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgYnl0ZXMpOgogICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKAogICAgICAgICAgICAnJXIgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGFuIElQdjQgb3IgSVB2NiBuZXR3b3JrLiAnCiAgICAgICAgICAgICdEaWQgeW91IHBhc3MgaW4gYSBieXRlcyAoc3RyIGluIFB5dGhvbiAyKSBpbnN0ZWFkIG9mJwogICAgICAgICAgICAnIGEgdW5pY29kZSBvYmplY3Q/JyAlIGFkZHJlc3MpCgogICAgcmFpc2UgVmFsdWVFcnJvcignJXIgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGFuIElQdjQgb3IgSVB2NiBuZXR3b3JrJyAlCiAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MpCgoKZGVmIGlwX2ludGVyZmFjZShhZGRyZXNzKToKICAgICIiIlRha2UgYW4gSVAgc3RyaW5nL2ludCBhbmQgcmV0dXJuIGFuIG9iamVjdCBvZiB0aGUgY29ycmVjdCB0eXBlLgoKICAgIEFyZ3M6CiAgICAgICAgYWRkcmVzczogQSBzdHJpbmcgb3IgaW50ZWdlciwgdGhlIElQIGFkZHJlc3MuICBFaXRoZXIgSVB2NCBvcgogICAgICAgICAgSVB2NiBhZGRyZXNzZXMgbWF5IGJlIHN1cHBsaWVkOyBpbnRlZ2VycyBsZXNzIHRoYW4gMioqMzIgd2lsbAogICAgICAgICAgYmUgY29uc2lkZXJlZCB0byBiZSBJUHY0IGJ5IGRlZmF1bHQuCgogICAgUmV0dXJuczoKICAgICAgICBBbiBJUHY0SW50ZXJmYWNlIG9yIElQdjZJbnRlcmZhY2Ugb2JqZWN0LgoKICAgIFJhaXNlczoKICAgICAgICBWYWx1ZUVycm9yOiBpZiB0aGUgc3RyaW5nIHBhc3NlZCBpc24ndCBlaXRoZXIgYSB2NCBvciBhIHY2CiAgICAgICAgICBhZGRyZXNzLgoKICAgIE5vdGVzOgogICAgICAgIFRoZSBJUHY/SW50ZXJmYWNlIGNsYXNzZXMgZGVzY3JpYmUgYW4gQWRkcmVzcyBvbiBhIHBhcnRpY3VsYXIKICAgICAgICBOZXR3b3JrLCBzbyB0aGV5J3JlIGJhc2ljYWxseSBhIGNvbWJpbmF0aW9uIG9mIGJvdGggdGhlIEFkZHJlc3MKICAgICAgICBhbmQgTmV0d29yayBjbGFzc2VzLgoKICAgICIiIgogICAgdHJ5OgogICAgICAgIHJldHVybiBJUHY0SW50ZXJmYWNlKGFkZHJlc3MpCiAgICBleGNlcHQgKEFkZHJlc3NWYWx1ZUVycm9yLCBOZXRtYXNrVmFsdWVFcnJvcik6CiAgICAgICAgcGFzcwoKICAgIHRyeToKICAgICAgICByZXR1cm4gSVB2NkludGVyZmFjZShhZGRyZXNzKQogICAgZXhjZXB0IChBZGRyZXNzVmFsdWVFcnJvciwgTmV0bWFza1ZhbHVlRXJyb3IpOgogICAgICAgIHBhc3MKCiAgICByYWlzZSBWYWx1ZUVycm9yKCclciBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYW4gSVB2NCBvciBJUHY2IGludGVyZmFjZScgJQogICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKQoKCmRlZiB2NF9pbnRfdG9fcGFja2VkKGFkZHJlc3MpOgogICAgIiIiUmVwcmVzZW50IGFuIGFkZHJlc3MgYXMgNCBwYWNrZWQgYnl0ZXMgaW4gbmV0d29yayAoYmlnLWVuZGlhbikgb3JkZXIuCgogICAgQXJnczoKICAgICAgICBhZGRyZXNzOiBBbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIGFuIElQdjQgSVAgYWRkcmVzcy4KCiAgICBSZXR1cm5zOgogICAgICAgIFRoZSBpbnRlZ2VyIGFkZHJlc3MgcGFja2VkIGFzIDQgYnl0ZXMgaW4gbmV0d29yayAoYmlnLWVuZGlhbikgb3JkZXIuCgogICAgUmFpc2VzOgogICAgICAgIFZhbHVlRXJyb3I6IElmIHRoZSBpbnRlZ2VyIGlzIG5lZ2F0aXZlIG9yIHRvbyBsYXJnZSB0byBiZSBhbgogICAgICAgICAgSVB2NCBJUCBhZGRyZXNzLgoKICAgICIiIgogICAgdHJ5OgogICAgICAgIHJldHVybiBfY29tcGF0X3RvX2J5dGVzKGFkZHJlc3MsIDQsICdiaWcnKQogICAgZXhjZXB0IChzdHJ1Y3QuZXJyb3IsIE92ZXJmbG93RXJyb3IpOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkFkZHJlc3MgbmVnYXRpdmUgb3IgdG9vIGxhcmdlIGZvciBJUHY0IikKCgpkZWYgdjZfaW50X3RvX3BhY2tlZChhZGRyZXNzKToKICAgICIiIlJlcHJlc2VudCBhbiBhZGRyZXNzIGFzIDE2IHBhY2tlZCBieXRlcyBpbiBuZXR3b3JrIChiaWctZW5kaWFuKSBvcmRlci4KCiAgICBBcmdzOgogICAgICAgIGFkZHJlc3M6IEFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgYW4gSVB2NiBJUCBhZGRyZXNzLgoKICAgIFJldHVybnM6CiAgICAgICAgVGhlIGludGVnZXIgYWRkcmVzcyBwYWNrZWQgYXMgMTYgYnl0ZXMgaW4gbmV0d29yayAoYmlnLWVuZGlhbikgb3JkZXIuCgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIF9jb21wYXRfdG9fYnl0ZXMoYWRkcmVzcywgMTYsICdiaWcnKQogICAgZXhjZXB0IChzdHJ1Y3QuZXJyb3IsIE92ZXJmbG93RXJyb3IpOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkFkZHJlc3MgbmVnYXRpdmUgb3IgdG9vIGxhcmdlIGZvciBJUHY2IikKCgpkZWYgX3NwbGl0X29wdGlvbmFsX25ldG1hc2soYWRkcmVzcyk6CiAgICAiIiJIZWxwZXIgdG8gc3BsaXQgdGhlIG5ldG1hc2sgYW5kIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yIGlmIG5lZWRlZCIiIgogICAgYWRkciA9IF9jb21wYXRfc3RyKGFkZHJlc3MpLnNwbGl0KCcvJykKICAgIGlmIGxlbihhZGRyKSA+IDI6CiAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IoIk9ubHkgb25lICcvJyBwZXJtaXR0ZWQgaW4gJXIiICUgYWRkcmVzcykKICAgIHJldHVybiBhZGRyCgoKZGVmIF9maW5kX2FkZHJlc3NfcmFuZ2UoYWRkcmVzc2VzKToKICAgICIiIkZpbmQgYSBzZXF1ZW5jZSBvZiBzb3J0ZWQgZGVkdXBsaWNhdGVkIElQdiNBZGRyZXNzLgoKICAgIEFyZ3M6CiAgICAgICAgYWRkcmVzc2VzOiBhIGxpc3Qgb2YgSVB2I0FkZHJlc3Mgb2JqZWN0cy4KCiAgICBZaWVsZHM6CiAgICAgICAgQSB0dXBsZSBjb250YWluaW5nIHRoZSBmaXJzdCBhbmQgbGFzdCBJUCBhZGRyZXNzZXMgaW4gdGhlIHNlcXVlbmNlLgoKICAgICIiIgogICAgaXQgPSBpdGVyKGFkZHJlc3NlcykKICAgIGZpcnN0ID0gbGFzdCA9IG5leHQoaXQpCiAgICBmb3IgaXAgaW4gaXQ6CiAgICAgICAgaWYgaXAuX2lwICE9IGxhc3QuX2lwICsgMToKICAgICAgICAgICAgeWllbGQgZmlyc3QsIGxhc3QKICAgICAgICAgICAgZmlyc3QgPSBpcAogICAgICAgIGxhc3QgPSBpcAogICAgeWllbGQgZmlyc3QsIGxhc3QKCgpkZWYgX2NvdW50X3JpZ2h0aGFuZF96ZXJvX2JpdHMobnVtYmVyLCBiaXRzKToKICAgICIiIkNvdW50IHRoZSBudW1iZXIgb2YgemVybyBiaXRzIG9uIHRoZSByaWdodCBoYW5kIHNpZGUuCgogICAgQXJnczoKICAgICAgICBudW1iZXI6IGFuIGludGVnZXIuCiAgICAgICAgYml0czogbWF4aW11bSBudW1iZXIgb2YgYml0cyB0byBjb3VudC4KCiAgICBSZXR1cm5zOgogICAgICAgIFRoZSBudW1iZXIgb2YgemVybyBiaXRzIG9uIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgdGhlIG51bWJlci4KCiAgICAiIiIKICAgIGlmIG51bWJlciA9PSAwOgogICAgICAgIHJldHVybiBiaXRzCiAgICByZXR1cm4gbWluKGJpdHMsIF9jb21wYXRfYml0X2xlbmd0aCh+bnVtYmVyICYgKG51bWJlciAtIDEpKSkKCgpkZWYgc3VtbWFyaXplX2FkZHJlc3NfcmFuZ2UoZmlyc3QsIGxhc3QpOgogICAgIiIiU3VtbWFyaXplIGEgbmV0d29yayByYW5nZSBnaXZlbiB0aGUgZmlyc3QgYW5kIGxhc3QgSVAgYWRkcmVzc2VzLgoKICAgIEV4YW1wbGU6CiAgICAgICAgPj4+IGxpc3Qoc3VtbWFyaXplX2FkZHJlc3NfcmFuZ2UoSVB2NEFkZHJlc3MoJzE5Mi4wLjIuMCcpLAogICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQdjRBZGRyZXNzKCcxOTIuMC4yLjEzMCcpKSkKICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNkb2N0ZXN0OiArTk9STUFMSVpFX1dISVRFU1BBQ0UKICAgICAgICBbSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMC8yNScpLCBJUHY0TmV0d29yaygnMTkyLjAuMi4xMjgvMzEnKSwKICAgICAgICAgSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMTMwLzMyJyldCgogICAgQXJnczoKICAgICAgICBmaXJzdDogdGhlIGZpcnN0IElQdjRBZGRyZXNzIG9yIElQdjZBZGRyZXNzIGluIHRoZSByYW5nZS4KICAgICAgICBsYXN0OiB0aGUgbGFzdCBJUHY0QWRkcmVzcyBvciBJUHY2QWRkcmVzcyBpbiB0aGUgcmFuZ2UuCgogICAgUmV0dXJuczoKICAgICAgICBBbiBpdGVyYXRvciBvZiB0aGUgc3VtbWFyaXplZCBJUHYoNHw2KSBuZXR3b3JrIG9iamVjdHMuCgogICAgUmFpc2U6CiAgICAgICAgVHlwZUVycm9yOgogICAgICAgICAgICBJZiB0aGUgZmlyc3QgYW5kIGxhc3Qgb2JqZWN0cyBhcmUgbm90IElQIGFkZHJlc3Nlcy4KICAgICAgICAgICAgSWYgdGhlIGZpcnN0IGFuZCBsYXN0IG9iamVjdHMgYXJlIG5vdCB0aGUgc2FtZSB2ZXJzaW9uLgogICAgICAgIFZhbHVlRXJyb3I6CiAgICAgICAgICAgIElmIHRoZSBsYXN0IG9iamVjdCBpcyBub3QgZ3JlYXRlciB0aGFuIHRoZSBmaXJzdC4KICAgICAgICAgICAgSWYgdGhlIHZlcnNpb24gb2YgdGhlIGZpcnN0IGFkZHJlc3MgaXMgbm90IDQgb3IgNi4KCiAgICAiIiIKICAgIGlmIChub3QgKGlzaW5zdGFuY2UoZmlyc3QsIF9CYXNlQWRkcmVzcykgYW5kCiAgICAgICAgICAgICBpc2luc3RhbmNlKGxhc3QsIF9CYXNlQWRkcmVzcykpKToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2ZpcnN0IGFuZCBsYXN0IG11c3QgYmUgSVAgYWRkcmVzc2VzLCBub3QgbmV0d29ya3MnKQogICAgaWYgZmlyc3QudmVyc2lvbiAhPSBsYXN0LnZlcnNpb246CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIlcyBhbmQgJXMgYXJlIG5vdCBvZiB0aGUgc2FtZSB2ZXJzaW9uIiAlICgKICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QsIGxhc3QpKQogICAgaWYgZmlyc3QgPiBsYXN0OgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2xhc3QgSVAgYWRkcmVzcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBmaXJzdCcpCgogICAgaWYgZmlyc3QudmVyc2lvbiA9PSA0OgogICAgICAgIGlwID0gSVB2NE5ldHdvcmsKICAgIGVsaWYgZmlyc3QudmVyc2lvbiA9PSA2OgogICAgICAgIGlwID0gSVB2Nk5ldHdvcmsKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndW5rbm93biBJUCB2ZXJzaW9uJykKCiAgICBpcF9iaXRzID0gZmlyc3QuX21heF9wcmVmaXhsZW4KICAgIGZpcnN0X2ludCA9IGZpcnN0Ll9pcAogICAgbGFzdF9pbnQgPSBsYXN0Ll9pcAogICAgd2hpbGUgZmlyc3RfaW50IDw9IGxhc3RfaW50OgogICAgICAgIG5iaXRzID0gbWluKF9jb3VudF9yaWdodGhhbmRfemVyb19iaXRzKGZpcnN0X2ludCwgaXBfYml0cyksCiAgICAgICAgICAgICAgICAgICAgX2NvbXBhdF9iaXRfbGVuZ3RoKGxhc3RfaW50IC0gZmlyc3RfaW50ICsgMSkgLSAxKQogICAgICAgIG5ldCA9IGlwKChmaXJzdF9pbnQsIGlwX2JpdHMgLSBuYml0cykpCiAgICAgICAgeWllbGQgbmV0CiAgICAgICAgZmlyc3RfaW50ICs9IDEgPDwgbmJpdHMKICAgICAgICBpZiBmaXJzdF9pbnQgLSAxID09IGlwLl9BTExfT05FUzoKICAgICAgICAgICAgYnJlYWsKCgpkZWYgX2NvbGxhcHNlX2FkZHJlc3Nlc19pbnRlcm5hbChhZGRyZXNzZXMpOgogICAgIiIiTG9vcHMgdGhyb3VnaCB0aGUgYWRkcmVzc2VzLCBjb2xsYXBzaW5nIGNvbmN1cnJlbnQgbmV0YmxvY2tzLgoKICAgIEV4YW1wbGU6CgogICAgICAgIGlwMSA9IElQdjROZXR3b3JrKCcxOTIuMC4yLjAvMjYnKQogICAgICAgIGlwMiA9IElQdjROZXR3b3JrKCcxOTIuMC4yLjY0LzI2JykKICAgICAgICBpcDMgPSBJUHY0TmV0d29yaygnMTkyLjAuMi4xMjgvMjYnKQogICAgICAgIGlwNCA9IElQdjROZXR3b3JrKCcxOTIuMC4yLjE5Mi8yNicpCgogICAgICAgIF9jb2xsYXBzZV9hZGRyZXNzZXNfaW50ZXJuYWwoW2lwMSwgaXAyLCBpcDMsIGlwNF0pIC0+CiAgICAgICAgICBbSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMC8yNCcpXQoKICAgICAgICBUaGlzIHNob3VsZG4ndCBiZSBjYWxsZWQgZGlyZWN0bHk7IGl0IGlzIGNhbGxlZCB2aWEKICAgICAgICAgIGNvbGxhcHNlX2FkZHJlc3NlcyhbXSkuCgogICAgQXJnczoKICAgICAgICBhZGRyZXNzZXM6IEEgbGlzdCBvZiBJUHY0TmV0d29yaydzIG9yIElQdjZOZXR3b3JrJ3MKCiAgICBSZXR1cm5zOgogICAgICAgIEEgbGlzdCBvZiBJUHY0TmV0d29yaydzIG9yIElQdjZOZXR3b3JrJ3MgZGVwZW5kaW5nIG9uIHdoYXQgd2Ugd2VyZQogICAgICAgIHBhc3NlZC4KCiAgICAiIiIKICAgICMgRmlyc3QgbWVyZ2UKICAgIHRvX21lcmdlID0gbGlzdChhZGRyZXNzZXMpCiAgICBzdWJuZXRzID0ge30KICAgIHdoaWxlIHRvX21lcmdlOgogICAgICAgIG5ldCA9IHRvX21lcmdlLnBvcCgpCiAgICAgICAgc3VwZXJuZXQgPSBuZXQuc3VwZXJuZXQoKQogICAgICAgIGV4aXN0aW5nID0gc3VibmV0cy5nZXQoc3VwZXJuZXQpCiAgICAgICAgaWYgZXhpc3RpbmcgaXMgTm9uZToKICAgICAgICAgICAgc3VibmV0c1tzdXBlcm5ldF0gPSBuZXQKICAgICAgICBlbGlmIGV4aXN0aW5nICE9IG5ldDoKICAgICAgICAgICAgIyBNZXJnZSBjb25zZWN1dGl2ZSBzdWJuZXRzCiAgICAgICAgICAgIGRlbCBzdWJuZXRzW3N1cGVybmV0XQogICAgICAgICAgICB0b19tZXJnZS5hcHBlbmQoc3VwZXJuZXQpCiAgICAjIFRoZW4gaXRlcmF0ZSBvdmVyIHJlc3VsdGluZyBuZXR3b3Jrcywgc2tpcHBpbmcgc3Vic3VtZWQgc3VibmV0cwogICAgbGFzdCA9IE5vbmUKICAgIGZvciBuZXQgaW4gc29ydGVkKHN1Ym5ldHMudmFsdWVzKCkpOgogICAgICAgIGlmIGxhc3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICMgU2luY2UgdGhleSBhcmUgc29ydGVkLAogICAgICAgICAgICAjIGxhc3QubmV0d29ya19hZGRyZXNzIDw9IG5ldC5uZXR3b3JrX2FkZHJlc3MgaXMgYSBnaXZlbi4KICAgICAgICAgICAgaWYgbGFzdC5icm9hZGNhc3RfYWRkcmVzcyA+PSBuZXQuYnJvYWRjYXN0X2FkZHJlc3M6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgIHlpZWxkIG5ldAogICAgICAgIGxhc3QgPSBuZXQKCgpkZWYgY29sbGFwc2VfYWRkcmVzc2VzKGFkZHJlc3Nlcyk6CiAgICAiIiJDb2xsYXBzZSBhIGxpc3Qgb2YgSVAgb2JqZWN0cy4KCiAgICBFeGFtcGxlOgogICAgICAgIGNvbGxhcHNlX2FkZHJlc3NlcyhbSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMC8yNScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMTI4LzI1JyldKSAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICBbSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMC8yNCcpXQoKICAgIEFyZ3M6CiAgICAgICAgYWRkcmVzc2VzOiBBbiBpdGVyYXRvciBvZiBJUHY0TmV0d29yayBvciBJUHY2TmV0d29yayBvYmplY3RzLgoKICAgIFJldHVybnM6CiAgICAgICAgQW4gaXRlcmF0b3Igb2YgdGhlIGNvbGxhcHNlZCBJUHYoNHw2KU5ldHdvcmsgb2JqZWN0cy4KCiAgICBSYWlzZXM6CiAgICAgICAgVHlwZUVycm9yOiBJZiBwYXNzZWQgYSBsaXN0IG9mIG1peGVkIHZlcnNpb24gb2JqZWN0cy4KCiAgICAiIiIKICAgIGFkZHJzID0gW10KICAgIGlwcyA9IFtdCiAgICBuZXRzID0gW10KCiAgICAjIHNwbGl0IElQIGFkZHJlc3NlcyBhbmQgbmV0d29ya3MKICAgIGZvciBpcCBpbiBhZGRyZXNzZXM6CiAgICAgICAgaWYgaXNpbnN0YW5jZShpcCwgX0Jhc2VBZGRyZXNzKToKICAgICAgICAgICAgaWYgaXBzIGFuZCBpcHNbLTFdLl92ZXJzaW9uICE9IGlwLl92ZXJzaW9uOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIlcyBhbmQgJXMgYXJlIG5vdCBvZiB0aGUgc2FtZSB2ZXJzaW9uIiAlICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcCwgaXBzWy0xXSkpCiAgICAgICAgICAgIGlwcy5hcHBlbmQoaXApCiAgICAgICAgZWxpZiBpcC5fcHJlZml4bGVuID09IGlwLl9tYXhfcHJlZml4bGVuOgogICAgICAgICAgICBpZiBpcHMgYW5kIGlwc1stMV0uX3ZlcnNpb24gIT0gaXAuX3ZlcnNpb246CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIiVzIGFuZCAlcyBhcmUgbm90IG9mIHRoZSBzYW1lIHZlcnNpb24iICUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwLCBpcHNbLTFdKSkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaXBzLmFwcGVuZChpcC5pcCkKICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgaXBzLmFwcGVuZChpcC5uZXR3b3JrX2FkZHJlc3MpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgbmV0cyBhbmQgbmV0c1stMV0uX3ZlcnNpb24gIT0gaXAuX3ZlcnNpb246CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIiVzIGFuZCAlcyBhcmUgbm90IG9mIHRoZSBzYW1lIHZlcnNpb24iICUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwLCBuZXRzWy0xXSkpCiAgICAgICAgICAgIG5ldHMuYXBwZW5kKGlwKQoKICAgICMgc29ydCBhbmQgZGVkdXAKICAgIGlwcyA9IHNvcnRlZChzZXQoaXBzKSkKCiAgICAjIGZpbmQgY29uc2VjdXRpdmUgYWRkcmVzcyByYW5nZXMgaW4gdGhlIHNvcnRlZCBzZXF1ZW5jZSBhbmQgc3VtbWFyaXplIHRoZW0KICAgIGlmIGlwczoKICAgICAgICBmb3IgZmlyc3QsIGxhc3QgaW4gX2ZpbmRfYWRkcmVzc19yYW5nZShpcHMpOgogICAgICAgICAgICBhZGRycy5leHRlbmQoc3VtbWFyaXplX2FkZHJlc3NfcmFuZ2UoZmlyc3QsIGxhc3QpKQoKICAgIHJldHVybiBfY29sbGFwc2VfYWRkcmVzc2VzX2ludGVybmFsKGFkZHJzICsgbmV0cykKCgpkZWYgZ2V0X21peGVkX3R5cGVfa2V5KG9iaik6CiAgICAiIiJSZXR1cm4gYSBrZXkgc3VpdGFibGUgZm9yIHNvcnRpbmcgYmV0d2VlbiBuZXR3b3JrcyBhbmQgYWRkcmVzc2VzLgoKICAgIEFkZHJlc3MgYW5kIE5ldHdvcmsgb2JqZWN0cyBhcmUgbm90IHNvcnRhYmxlIGJ5IGRlZmF1bHQ7IHRoZXkncmUKICAgIGZ1bmRhbWVudGFsbHkgZGlmZmVyZW50IHNvIHRoZSBleHByZXNzaW9uCgogICAgICAgIElQdjRBZGRyZXNzKCcxOTIuMC4yLjAnKSA8PSBJUHY0TmV0d29yaygnMTkyLjAuMi4wLzI0JykKCiAgICBkb2Vzbid0IG1ha2UgYW55IHNlbnNlLiAgVGhlcmUgYXJlIHNvbWUgdGltZXMgaG93ZXZlciwgd2hlcmUgeW91IG1heSB3aXNoCiAgICB0byBoYXZlIGlwYWRkcmVzcyBzb3J0IHRoZXNlIGZvciB5b3UgYW55d2F5LiBJZiB5b3UgbmVlZCB0byBkbyB0aGlzLCB5b3UKICAgIGNhbiB1c2UgdGhpcyBmdW5jdGlvbiBhcyB0aGUga2V5PSBhcmd1bWVudCB0byBzb3J0ZWQoKS4KCiAgICBBcmdzOgogICAgICBvYmo6IGVpdGhlciBhIE5ldHdvcmsgb3IgQWRkcmVzcyBvYmplY3QuCiAgICBSZXR1cm5zOgogICAgICBhcHByb3ByaWF0ZSBrZXkuCgogICAgIiIiCiAgICBpZiBpc2luc3RhbmNlKG9iaiwgX0Jhc2VOZXR3b3JrKToKICAgICAgICByZXR1cm4gb2JqLl9nZXRfbmV0d29ya3Nfa2V5KCkKICAgIGVsaWYgaXNpbnN0YW5jZShvYmosIF9CYXNlQWRkcmVzcyk6CiAgICAgICAgcmV0dXJuIG9iai5fZ2V0X2FkZHJlc3Nfa2V5KCkKICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKCmNsYXNzIF9JUEFkZHJlc3NCYXNlKF9Ub3RhbE9yZGVyaW5nTWl4aW4pOgoKICAgICIiIlRoZSBtb3RoZXIgY2xhc3MuIiIiCgogICAgX19zbG90c19fID0gKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBleHBsb2RlZChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIGxvbmdoYW5kIHZlcnNpb24gb2YgdGhlIElQIGFkZHJlc3MgYXMgYSBzdHJpbmcuIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2V4cGxvZGVfc2hvcnRoYW5kX2lwX3N0cmluZygpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY29tcHJlc3NlZChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIHNob3J0aGFuZCB2ZXJzaW9uIG9mIHRoZSBJUCBhZGRyZXNzIGFzIGEgc3RyaW5nLiIiIgogICAgICAgIHJldHVybiBfY29tcGF0X3N0cihzZWxmKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJldmVyc2VfcG9pbnRlcihzZWxmKToKICAgICAgICAiIiJUaGUgbmFtZSBvZiB0aGUgcmV2ZXJzZSBETlMgcG9pbnRlciBmb3IgdGhlIElQIGFkZHJlc3MsIGUuZy46CiAgICAgICAgICAgID4+PiBpcGFkZHJlc3MuaXBfYWRkcmVzcygiMTI3LjAuMC4xIikucmV2ZXJzZV9wb2ludGVyCiAgICAgICAgICAgICcxLjAuMC4xMjcuaW4tYWRkci5hcnBhJwogICAgICAgICAgICA+Pj4gaXBhZGRyZXNzLmlwX2FkZHJlc3MoIjIwMDE6ZGI4OjoxIikucmV2ZXJzZV9wb2ludGVyCiAgICAgICAgICAgICcxLjAuMC4wLjAuMC4wLjAuMC4wLjAuMC4wLjAuMC4wLjAuMC4wLjAuMC4wLjAuMC44LmIuZC4wLjEuMC4wLjIuaXA2LmFycGEnCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9yZXZlcnNlX3BvaW50ZXIoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAgICAgbXNnID0gJyUyMDBzIGhhcyBubyB2ZXJzaW9uIHNwZWNpZmllZCcgJSAodHlwZShzZWxmKSwpCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihtc2cpCgogICAgZGVmIF9jaGVja19pbnRfYWRkcmVzcyhzZWxmLCBhZGRyZXNzKToKICAgICAgICBpZiBhZGRyZXNzIDwgMDoKICAgICAgICAgICAgbXNnID0gIiVkICg8IDApIGlzIG5vdCBwZXJtaXR0ZWQgYXMgYW4gSVB2JWQgYWRkcmVzcyIKICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IobXNnICUgKGFkZHJlc3MsIHNlbGYuX3ZlcnNpb24pKQogICAgICAgIGlmIGFkZHJlc3MgPiBzZWxmLl9BTExfT05FUzoKICAgICAgICAgICAgbXNnID0gIiVkICg+PSAyKiolZCkgaXMgbm90IHBlcm1pdHRlZCBhcyBhbiBJUHYlZCBhZGRyZXNzIgogICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcihtc2cgJSAoYWRkcmVzcywgc2VsZi5fbWF4X3ByZWZpeGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24pKQoKICAgIGRlZiBfY2hlY2tfcGFja2VkX2FkZHJlc3Moc2VsZiwgYWRkcmVzcywgZXhwZWN0ZWRfbGVuKToKICAgICAgICBhZGRyZXNzX2xlbiA9IGxlbihhZGRyZXNzKQogICAgICAgIGlmIGFkZHJlc3NfbGVuICE9IGV4cGVjdGVkX2xlbjoKICAgICAgICAgICAgbXNnID0gKAogICAgICAgICAgICAgICAgJyVyIChsZW4gJWQgIT0gJWQpIGlzIG5vdCBwZXJtaXR0ZWQgYXMgYW4gSVB2JWQgYWRkcmVzcy4gJwogICAgICAgICAgICAgICAgJ0RpZCB5b3UgcGFzcyBpbiBhIGJ5dGVzIChzdHIgaW4gUHl0aG9uIDIpIGluc3RlYWQgb2YnCiAgICAgICAgICAgICAgICAnIGEgdW5pY29kZSBvYmplY3Q/JwogICAgICAgICAgICApCiAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKG1zZyAlIChhZGRyZXNzLCBhZGRyZXNzX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2xlbiwgc2VsZi5fdmVyc2lvbikpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2lwX2ludF9mcm9tX3ByZWZpeChjbHMsIHByZWZpeGxlbik6CiAgICAgICAgIiIiVHVybiB0aGUgcHJlZml4IGxlbmd0aCBpbnRvIGEgYml0d2lzZSBuZXRtYXNrCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHByZWZpeGxlbjogQW4gaW50ZWdlciwgdGhlIHByZWZpeCBsZW5ndGguCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEFuIGludGVnZXIuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBjbHMuX0FMTF9PTkVTIF4gKGNscy5fQUxMX09ORVMgPj4gcHJlZml4bGVuKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wcmVmaXhfZnJvbV9pcF9pbnQoY2xzLCBpcF9pbnQpOgogICAgICAgICIiIlJldHVybiBwcmVmaXggbGVuZ3RoIGZyb20gdGhlIGJpdHdpc2UgbmV0bWFzay4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgaXBfaW50OiBBbiBpbnRlZ2VyLCB0aGUgbmV0bWFzayBpbiBleHBhbmRlZCBiaXR3aXNlIGZvcm1hdAoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBbiBpbnRlZ2VyLCB0aGUgcHJlZml4IGxlbmd0aC4KCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBWYWx1ZUVycm9yOiBJZiB0aGUgaW5wdXQgaW50ZXJtaW5nbGVzIHplcm9lcyAmIG9uZXMKICAgICAgICAiIiIKICAgICAgICB0cmFpbGluZ196ZXJvZXMgPSBfY291bnRfcmlnaHRoYW5kX3plcm9fYml0cyhpcF9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzLl9tYXhfcHJlZml4bGVuKQogICAgICAgIHByZWZpeGxlbiA9IGNscy5fbWF4X3ByZWZpeGxlbiAtIHRyYWlsaW5nX3plcm9lcwogICAgICAgIGxlYWRpbmdfb25lcyA9IGlwX2ludCA+PiB0cmFpbGluZ196ZXJvZXMKICAgICAgICBhbGxfb25lcyA9ICgxIDw8IHByZWZpeGxlbikgLSAxCiAgICAgICAgaWYgbGVhZGluZ19vbmVzICE9IGFsbF9vbmVzOgogICAgICAgICAgICBieXRlc2xlbiA9IGNscy5fbWF4X3ByZWZpeGxlbiAvLyA4CiAgICAgICAgICAgIGRldGFpbHMgPSBfY29tcGF0X3RvX2J5dGVzKGlwX2ludCwgYnl0ZXNsZW4sICdiaWcnKQogICAgICAgICAgICBtc2cgPSAnTmV0bWFzayBwYXR0ZXJuICVyIG1peGVzIHplcm9lcyAmIG9uZXMnCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnICUgZGV0YWlscykKICAgICAgICByZXR1cm4gcHJlZml4bGVuCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3JlcG9ydF9pbnZhbGlkX25ldG1hc2soY2xzLCBuZXRtYXNrX3N0cik6CiAgICAgICAgbXNnID0gJyVyIGlzIG5vdCBhIHZhbGlkIG5ldG1hc2snICUgbmV0bWFza19zdHIKICAgICAgICByYWlzZSBOZXRtYXNrVmFsdWVFcnJvcihtc2cpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3ByZWZpeF9mcm9tX3ByZWZpeF9zdHJpbmcoY2xzLCBwcmVmaXhsZW5fc3RyKToKICAgICAgICAiIiJSZXR1cm4gcHJlZml4IGxlbmd0aCBmcm9tIGEgbnVtZXJpYyBzdHJpbmcKCiAgICAgICAgQXJnczoKICAgICAgICAgICAgcHJlZml4bGVuX3N0cjogVGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQKCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQW4gaW50ZWdlciwgdGhlIHByZWZpeCBsZW5ndGguCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgTmV0bWFza1ZhbHVlRXJyb3I6IElmIHRoZSBpbnB1dCBpcyBub3QgYSB2YWxpZCBuZXRtYXNrCiAgICAgICAgIiIiCiAgICAgICAgIyBpbnQgYWxsb3dzIGEgbGVhZGluZyArLy0gYXMgd2VsbCBhcyBzdXJyb3VuZGluZyB3aGl0ZXNwYWNlLAogICAgICAgICMgc28gd2UgZW5zdXJlIHRoYXQgaXNuJ3QgdGhlIGNhc2UKICAgICAgICBpZiBub3QgX0Jhc2VWNC5fREVDSU1BTF9ESUdJVFMuaXNzdXBlcnNldChwcmVmaXhsZW5fc3RyKToKICAgICAgICAgICAgY2xzLl9yZXBvcnRfaW52YWxpZF9uZXRtYXNrKHByZWZpeGxlbl9zdHIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwcmVmaXhsZW4gPSBpbnQocHJlZml4bGVuX3N0cikKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgY2xzLl9yZXBvcnRfaW52YWxpZF9uZXRtYXNrKHByZWZpeGxlbl9zdHIpCiAgICAgICAgaWYgbm90ICgwIDw9IHByZWZpeGxlbiA8PSBjbHMuX21heF9wcmVmaXhsZW4pOgogICAgICAgICAgICBjbHMuX3JlcG9ydF9pbnZhbGlkX25ldG1hc2socHJlZml4bGVuX3N0cikKICAgICAgICByZXR1cm4gcHJlZml4bGVuCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3ByZWZpeF9mcm9tX2lwX3N0cmluZyhjbHMsIGlwX3N0cik6CiAgICAgICAgIiIiVHVybiBhIG5ldG1hc2svaG9zdG1hc2sgc3RyaW5nIGludG8gYSBwcmVmaXggbGVuZ3RoCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGlwX3N0cjogVGhlIG5ldG1hc2svaG9zdG1hc2sgdG8gYmUgY29udmVydGVkCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEFuIGludGVnZXIsIHRoZSBwcmVmaXggbGVuZ3RoLgoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIE5ldG1hc2tWYWx1ZUVycm9yOiBJZiB0aGUgaW5wdXQgaXMgbm90IGEgdmFsaWQgbmV0bWFzay9ob3N0bWFzawogICAgICAgICIiIgogICAgICAgICMgUGFyc2UgdGhlIG5ldG1hc2svaG9zdG1hc2sgbGlrZSBhbiBJUCBhZGRyZXNzLgogICAgICAgIHRyeToKICAgICAgICAgICAgaXBfaW50ID0gY2xzLl9pcF9pbnRfZnJvbV9zdHJpbmcoaXBfc3RyKQogICAgICAgIGV4Y2VwdCBBZGRyZXNzVmFsdWVFcnJvcjoKICAgICAgICAgICAgY2xzLl9yZXBvcnRfaW52YWxpZF9uZXRtYXNrKGlwX3N0cikKCiAgICAgICAgIyBUcnkgbWF0Y2hpbmcgYSBuZXRtYXNrICh0aGlzIHdvdWxkIGJlIC8xKjAqLyBhcyBhIGJpdHdpc2UgcmVnZXhwKS4KICAgICAgICAjIE5vdGUgdGhhdCB0aGUgdHdvIGFtYmlndW91cyBjYXNlcyAoYWxsLW9uZXMgYW5kIGFsbC16ZXJvZXMpIGFyZQogICAgICAgICMgdHJlYXRlZCBhcyBuZXRtYXNrcy4KICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBjbHMuX3ByZWZpeF9mcm9tX2lwX2ludChpcF9pbnQpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgIyBJbnZlcnQgdGhlIGJpdHMsIGFuZCB0cnkgbWF0Y2hpbmcgYSAvMCsxKy8gaG9zdG1hc2sgaW5zdGVhZC4KICAgICAgICBpcF9pbnQgXj0gY2xzLl9BTExfT05FUwogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIGNscy5fcHJlZml4X2Zyb21faXBfaW50KGlwX2ludCkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgY2xzLl9yZXBvcnRfaW52YWxpZF9uZXRtYXNrKGlwX3N0cikKCiAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18sIChfY29tcGF0X3N0cihzZWxmKSwpCgoKY2xhc3MgX0Jhc2VBZGRyZXNzKF9JUEFkZHJlc3NCYXNlKToKCiAgICAiIiJBIGdlbmVyaWMgSVAgb2JqZWN0LgoKICAgIFRoaXMgSVAgY2xhc3MgY29udGFpbnMgdGhlIHZlcnNpb24gaW5kZXBlbmRlbnQgbWV0aG9kcyB3aGljaCBhcmUKICAgIHVzZWQgYnkgc2luZ2xlIElQIGFkZHJlc3Nlcy4KICAgICIiIgoKICAgIF9fc2xvdHNfXyA9ICgpCgogICAgZGVmIF9faW50X18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2lwCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gKHNlbGYuX2lwID09IG90aGVyLl9pcCBhbmQKICAgICAgICAgICAgICAgICAgICBzZWxmLl92ZXJzaW9uID09IG90aGVyLl92ZXJzaW9uKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIF9JUEFkZHJlc3NCYXNlKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIF9CYXNlQWRkcmVzcyk6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignJXMgYW5kICVzIGFyZSBub3Qgb2YgdGhlIHNhbWUgdHlwZScgJSAoCiAgICAgICAgICAgICAgICBzZWxmLCBvdGhlcikpCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbiAhPSBvdGhlci5fdmVyc2lvbjoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCclcyBhbmQgJXMgYXJlIG5vdCBvZiB0aGUgc2FtZSB2ZXJzaW9uJyAlICgKICAgICAgICAgICAgICAgIHNlbGYsIG90aGVyKSkKICAgICAgICBpZiBzZWxmLl9pcCAhPSBvdGhlci5faXA6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9pcCA8IG90aGVyLl9pcAogICAgICAgIHJldHVybiBGYWxzZQoKICAgICMgU2hvcnRoYW5kIGZvciBJbnRlZ2VyIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbi4gVGhpcyBpcyBub3QKICAgICMgbWVhbnQgdG8gZXZlciBzdXBwb3J0IGFkZGl0aW9uL3N1YnRyYWN0aW9uIG9mIGFkZHJlc3Nlcy4KICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgX2NvbXBhdF9pbnRfdHlwZXMpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oaW50KHNlbGYpICsgb3RoZXIpCgogICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBfY29tcGF0X2ludF90eXBlcyk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhpbnQoc2VsZikgLSBvdGhlcikKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICclcyglciknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBfY29tcGF0X3N0cihzZWxmKSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gX2NvbXBhdF9zdHIoc2VsZi5fc3RyaW5nX2Zyb21faXBfaW50KHNlbGYuX2lwKSkKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goaGV4KGludChzZWxmLl9pcCkpKQoKICAgIGRlZiBfZ2V0X2FkZHJlc3Nfa2V5KHNlbGYpOgogICAgICAgIHJldHVybiAoc2VsZi5fdmVyc2lvbiwgc2VsZikKCiAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18sIChzZWxmLl9pcCwpCgoKY2xhc3MgX0Jhc2VOZXR3b3JrKF9JUEFkZHJlc3NCYXNlKToKCiAgICAiIiJBIGdlbmVyaWMgSVAgbmV0d29yayBvYmplY3QuCgogICAgVGhpcyBJUCBjbGFzcyBjb250YWlucyB0aGUgdmVyc2lvbiBpbmRlcGVuZGVudCBtZXRob2RzIHdoaWNoIGFyZQogICAgdXNlZCBieSBuZXR3b3Jrcy4KCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzKToKICAgICAgICBzZWxmLl9jYWNoZSA9IHt9CgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMoJXIpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgX2NvbXBhdF9zdHIoc2VsZikpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICclcy8lZCcgJSAoc2VsZi5uZXR3b3JrX2FkZHJlc3MsIHNlbGYucHJlZml4bGVuKQoKICAgIGRlZiBob3N0cyhzZWxmKToKICAgICAgICAiIiJHZW5lcmF0ZSBJdGVyYXRvciBvdmVyIHVzYWJsZSBob3N0cyBpbiBhIG5ldHdvcmsuCgogICAgICAgIFRoaXMgaXMgbGlrZSBfX2l0ZXJfXyBleGNlcHQgaXQgZG9lc24ndCByZXR1cm4gdGhlIG5ldHdvcmsKICAgICAgICBvciBicm9hZGNhc3QgYWRkcmVzc2VzLgoKICAgICAgICAiIiIKICAgICAgICBuZXR3b3JrID0gaW50KHNlbGYubmV0d29ya19hZGRyZXNzKQogICAgICAgIGJyb2FkY2FzdCA9IGludChzZWxmLmJyb2FkY2FzdF9hZGRyZXNzKQogICAgICAgIGZvciB4IGluIF9jb21wYXRfcmFuZ2UobmV0d29yayArIDEsIGJyb2FkY2FzdCk6CiAgICAgICAgICAgIHlpZWxkIHNlbGYuX2FkZHJlc3NfY2xhc3MoeCkKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgbmV0d29yayA9IGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykKICAgICAgICBicm9hZGNhc3QgPSBpbnQoc2VsZi5icm9hZGNhc3RfYWRkcmVzcykKICAgICAgICBmb3IgeCBpbiBfY29tcGF0X3JhbmdlKG5ldHdvcmssIGJyb2FkY2FzdCArIDEpOgogICAgICAgICAgICB5aWVsZCBzZWxmLl9hZGRyZXNzX2NsYXNzKHgpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG4pOgogICAgICAgIG5ldHdvcmsgPSBpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpCiAgICAgICAgYnJvYWRjYXN0ID0gaW50KHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MpCiAgICAgICAgaWYgbiA+PSAwOgogICAgICAgICAgICBpZiBuZXR3b3JrICsgbiA+IGJyb2FkY2FzdDoKICAgICAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IoJ2FkZHJlc3Mgb3V0IG9mIHJhbmdlJykKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2FkZHJlc3NfY2xhc3MobmV0d29yayArIG4pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbiArPSAxCiAgICAgICAgICAgIGlmIGJyb2FkY2FzdCArIG4gPCBuZXR3b3JrOgogICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcignYWRkcmVzcyBvdXQgb2YgcmFuZ2UnKQogICAgICAgICAgICByZXR1cm4gc2VsZi5fYWRkcmVzc19jbGFzcyhicm9hZGNhc3QgKyBuKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBfSVBBZGRyZXNzQmFzZSk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBfQmFzZU5ldHdvcmspOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJyVzIGFuZCAlcyBhcmUgbm90IG9mIHRoZSBzYW1lIHR5cGUnICUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgb3RoZXIpKQogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24gIT0gb3RoZXIuX3ZlcnNpb246CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignJXMgYW5kICVzIGFyZSBub3Qgb2YgdGhlIHNhbWUgdmVyc2lvbicgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBvdGhlcikpCiAgICAgICAgaWYgc2VsZi5uZXR3b3JrX2FkZHJlc3MgIT0gb3RoZXIubmV0d29ya19hZGRyZXNzOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uZXR3b3JrX2FkZHJlc3MgPCBvdGhlci5uZXR3b3JrX2FkZHJlc3MKICAgICAgICBpZiBzZWxmLm5ldG1hc2sgIT0gb3RoZXIubmV0bWFzazoKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmV0bWFzayA8IG90aGVyLm5ldG1hc2sKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiAoc2VsZi5fdmVyc2lvbiA9PSBvdGhlci5fdmVyc2lvbiBhbmQKICAgICAgICAgICAgICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyA9PSBvdGhlci5uZXR3b3JrX2FkZHJlc3MgYW5kCiAgICAgICAgICAgICAgICAgICAgaW50KHNlbGYubmV0bWFzaykgPT0gaW50KG90aGVyLm5ldG1hc2spKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykgXiBpbnQoc2VsZi5uZXRtYXNrKSkKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIG90aGVyKToKICAgICAgICAjIGFsd2F5cyBmYWxzZSBpZiBvbmUgaXMgdjQgYW5kIHRoZSBvdGhlciBpcyB2Ni4KICAgICAgICBpZiBzZWxmLl92ZXJzaW9uICE9IG90aGVyLl92ZXJzaW9uOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAjIGRlYWxpbmcgd2l0aCBhbm90aGVyIG5ldHdvcmsuCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgX0Jhc2VOZXR3b3JrKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIyBkZWFsaW5nIHdpdGggYW5vdGhlciBhZGRyZXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBhZGRyZXNzCiAgICAgICAgICAgIHJldHVybiAoaW50KHNlbGYubmV0d29ya19hZGRyZXNzKSA8PSBpbnQob3RoZXIuX2lwKSA8PQogICAgICAgICAgICAgICAgICAgIGludChzZWxmLmJyb2FkY2FzdF9hZGRyZXNzKSkKCiAgICBkZWYgb3ZlcmxhcHMoc2VsZiwgb3RoZXIpOgogICAgICAgICIiIlRlbGwgaWYgc2VsZiBpcyBwYXJ0bHkgY29udGFpbmVkIGluIG90aGVyLiIiIgogICAgICAgIHJldHVybiBzZWxmLm5ldHdvcmtfYWRkcmVzcyBpbiBvdGhlciBvciAoCiAgICAgICAgICAgIHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MgaW4gb3RoZXIgb3IgKAogICAgICAgICAgICAgICAgb3RoZXIubmV0d29ya19hZGRyZXNzIGluIHNlbGYgb3IgKAogICAgICAgICAgICAgICAgICAgIG90aGVyLmJyb2FkY2FzdF9hZGRyZXNzIGluIHNlbGYpKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBicm9hZGNhc3RfYWRkcmVzcyhzZWxmKToKICAgICAgICB4ID0gc2VsZi5fY2FjaGUuZ2V0KCdicm9hZGNhc3RfYWRkcmVzcycpCiAgICAgICAgaWYgeCBpcyBOb25lOgogICAgICAgICAgICB4ID0gc2VsZi5fYWRkcmVzc19jbGFzcyhpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KHNlbGYuaG9zdG1hc2spKQogICAgICAgICAgICBzZWxmLl9jYWNoZVsnYnJvYWRjYXN0X2FkZHJlc3MnXSA9IHgKICAgICAgICByZXR1cm4geAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGhvc3RtYXNrKHNlbGYpOgogICAgICAgIHggPSBzZWxmLl9jYWNoZS5nZXQoJ2hvc3RtYXNrJykKICAgICAgICBpZiB4IGlzIE5vbmU6CiAgICAgICAgICAgIHggPSBzZWxmLl9hZGRyZXNzX2NsYXNzKGludChzZWxmLm5ldG1hc2spIF4gc2VsZi5fQUxMX09ORVMpCiAgICAgICAgICAgIHNlbGYuX2NhY2hlWydob3N0bWFzayddID0geAogICAgICAgIHJldHVybiB4CgogICAgQHByb3BlcnR5CiAgICBkZWYgd2l0aF9wcmVmaXhsZW4oc2VsZik6CiAgICAgICAgcmV0dXJuICclcy8lZCcgJSAoc2VsZi5uZXR3b3JrX2FkZHJlc3MsIHNlbGYuX3ByZWZpeGxlbikKCiAgICBAcHJvcGVydHkKICAgIGRlZiB3aXRoX25ldG1hc2soc2VsZik6CiAgICAgICAgcmV0dXJuICclcy8lcycgJSAoc2VsZi5uZXR3b3JrX2FkZHJlc3MsIHNlbGYubmV0bWFzaykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB3aXRoX2hvc3RtYXNrKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMvJXMnICUgKHNlbGYubmV0d29ya19hZGRyZXNzLCBzZWxmLmhvc3RtYXNrKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG51bV9hZGRyZXNzZXMoc2VsZik6CiAgICAgICAgIiIiTnVtYmVyIG9mIGhvc3RzIGluIHRoZSBjdXJyZW50IHN1Ym5ldC4iIiIKICAgICAgICByZXR1cm4gaW50KHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MpIC0gaW50KHNlbGYubmV0d29ya19hZGRyZXNzKSArIDEKCiAgICBAcHJvcGVydHkKICAgIGRlZiBfYWRkcmVzc19jbGFzcyhzZWxmKToKICAgICAgICAjIFJldHVybmluZyBiYXJlIGFkZHJlc3Mgb2JqZWN0cyAocmF0aGVyIHRoYW4gaW50ZXJmYWNlcykgYWxsb3dzIGZvcgogICAgICAgICMgbW9yZSBjb25zaXN0ZW50IGJlaGF2aW91ciBhY3Jvc3MgdGhlIG5ldHdvcmsgYWRkcmVzcywgYnJvYWRjYXN0CiAgICAgICAgIyBhZGRyZXNzIGFuZCBpbmRpdmlkdWFsIGhvc3QgYWRkcmVzc2VzLgogICAgICAgIG1zZyA9ICclMjAwcyBoYXMgbm8gYXNzb2NpYXRlZCBhZGRyZXNzIGNsYXNzJyAlICh0eXBlKHNlbGYpLCkKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKG1zZykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcmVmaXhsZW4oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ByZWZpeGxlbgoKICAgIGRlZiBhZGRyZXNzX2V4Y2x1ZGUoc2VsZiwgb3RoZXIpOgogICAgICAgICIiIlJlbW92ZSBhbiBhZGRyZXNzIGZyb20gYSBsYXJnZXIgYmxvY2suCgogICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgYWRkcjEgPSBpcF9uZXR3b3JrKCcxOTIuMC4yLjAvMjgnKQogICAgICAgICAgICBhZGRyMiA9IGlwX25ldHdvcmsoJzE5Mi4wLjIuMS8zMicpCiAgICAgICAgICAgIGxpc3QoYWRkcjEuYWRkcmVzc19leGNsdWRlKGFkZHIyKSkgPQogICAgICAgICAgICAgICAgW0lQdjROZXR3b3JrKCcxOTIuMC4yLjAvMzInKSwgSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMi8zMScpLAogICAgICAgICAgICAgICAgIElQdjROZXR3b3JrKCcxOTIuMC4yLjQvMzAnKSwgSVB2NE5ldHdvcmsoJzE5Mi4wLjIuOC8yOScpXQoKICAgICAgICBvciBJUHY2OgoKICAgICAgICAgICAgYWRkcjEgPSBpcF9uZXR3b3JrKCcyMDAxOmRiODo6MS8zMicpCiAgICAgICAgICAgIGFkZHIyID0gaXBfbmV0d29yaygnMjAwMTpkYjg6OjEvMTI4JykKICAgICAgICAgICAgbGlzdChhZGRyMS5hZGRyZXNzX2V4Y2x1ZGUoYWRkcjIpKSA9CiAgICAgICAgICAgICAgICBbaXBfbmV0d29yaygnMjAwMTpkYjg6OjEvMTI4JyksCiAgICAgICAgICAgICAgICAgaXBfbmV0d29yaygnMjAwMTpkYjg6OjIvMTI3JyksCiAgICAgICAgICAgICAgICAgaXBfbmV0d29yaygnMjAwMTpkYjg6OjQvMTI2JyksCiAgICAgICAgICAgICAgICAgaXBfbmV0d29yaygnMjAwMTpkYjg6OjgvMTI1JyksCiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgaXBfbmV0d29yaygnMjAwMTpkYjg6ODAwMDo6LzMzJyldCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIG90aGVyOiBBbiBJUHY0TmV0d29yayBvciBJUHY2TmV0d29yayBvYmplY3Qgb2YgdGhlIHNhbWUgdHlwZS4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQW4gaXRlcmF0b3Igb2YgdGhlIElQdig0fDYpTmV0d29yayBvYmplY3RzIHdoaWNoIGlzIHNlbGYKICAgICAgICAgICAgbWludXMgb3RoZXIuCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgVHlwZUVycm9yOiBJZiBzZWxmIGFuZCBvdGhlciBhcmUgb2YgZGlmZmVyaW5nIGFkZHJlc3MKICAgICAgICAgICAgICB2ZXJzaW9ucywgb3IgaWYgb3RoZXIgaXMgbm90IGEgbmV0d29yayBvYmplY3QuCiAgICAgICAgICAgIFZhbHVlRXJyb3I6IElmIG90aGVyIGlzIG5vdCBjb21wbGV0ZWx5IGNvbnRhaW5lZCBieSBzZWxmLgoKICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5fdmVyc2lvbiA9PSBvdGhlci5fdmVyc2lvbjoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIlcyBhbmQgJXMgYXJlIG5vdCBvZiB0aGUgc2FtZSB2ZXJzaW9uIiAlICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIG90aGVyKSkKCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIF9CYXNlTmV0d29yayk6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiJXMgaXMgbm90IGEgbmV0d29yayBvYmplY3QiICUgb3RoZXIpCgogICAgICAgIGlmIG5vdCBvdGhlci5zdWJuZXRfb2Yoc2VsZik6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJyVzIG5vdCBjb250YWluZWQgaW4gJXMnICUgKG90aGVyLCBzZWxmKSkKICAgICAgICBpZiBvdGhlciA9PSBzZWxmOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBNYWtlIHN1cmUgd2UncmUgY29tcGFyaW5nIHRoZSBuZXR3b3JrIG9mIG90aGVyLgogICAgICAgIG90aGVyID0gb3RoZXIuX19jbGFzc19fKCclcy8lcycgJSAob3RoZXIubmV0d29ya19hZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIucHJlZml4bGVuKSkKCiAgICAgICAgczEsIHMyID0gc2VsZi5zdWJuZXRzKCkKICAgICAgICB3aGlsZSBzMSAhPSBvdGhlciBhbmQgczIgIT0gb3RoZXI6CiAgICAgICAgICAgIGlmIG90aGVyLnN1Ym5ldF9vZihzMSk6CiAgICAgICAgICAgICAgICB5aWVsZCBzMgogICAgICAgICAgICAgICAgczEsIHMyID0gczEuc3VibmV0cygpCiAgICAgICAgICAgIGVsaWYgb3RoZXIuc3VibmV0X29mKHMyKToKICAgICAgICAgICAgICAgIHlpZWxkIHMxCiAgICAgICAgICAgICAgICBzMSwgczIgPSBzMi5zdWJuZXRzKCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgSWYgd2UgZ290IGhlcmUsIHRoZXJlJ3MgYSBidWcgc29tZXdoZXJlLgogICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ0Vycm9yIHBlcmZvcm1pbmcgZXhjbHVzaW9uOiAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnczE6ICVzIHMyOiAlcyBvdGhlcjogJXMnICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzMSwgczIsIG90aGVyKSkKICAgICAgICBpZiBzMSA9PSBvdGhlcjoKICAgICAgICAgICAgeWllbGQgczIKICAgICAgICBlbGlmIHMyID09IG90aGVyOgogICAgICAgICAgICB5aWVsZCBzMQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgSWYgd2UgZ290IGhlcmUsIHRoZXJlJ3MgYSBidWcgc29tZXdoZXJlLgogICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignRXJyb3IgcGVyZm9ybWluZyBleGNsdXNpb246ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MxOiAlcyBzMjogJXMgb3RoZXI6ICVzJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzMSwgczIsIG90aGVyKSkKCiAgICBkZWYgY29tcGFyZV9uZXR3b3JrcyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiQ29tcGFyZSB0d28gSVAgb2JqZWN0cy4KCiAgICAgICAgVGhpcyBpcyBvbmx5IGNvbmNlcm5lZCBhYm91dCB0aGUgY29tcGFyaXNvbiBvZiB0aGUgaW50ZWdlcgogICAgICAgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBuZXR3b3JrIGFkZHJlc3Nlcy4gIFRoaXMgbWVhbnMgdGhhdCB0aGUKICAgICAgICBob3N0IGJpdHMgYXJlbid0IGNvbnNpZGVyZWQgYXQgYWxsIGluIHRoaXMgbWV0aG9kLiAgSWYgeW91IHdhbnQKICAgICAgICB0byBjb21wYXJlIGhvc3QgYml0cywgeW91IGNhbiBlYXNpbHkgZW5vdWdoIGRvIGEKICAgICAgICAnSG9zdEEuX2lwIDwgSG9zdEIuX2lwJwoKICAgICAgICBBcmdzOgogICAgICAgICAgICBvdGhlcjogQW4gSVAgb2JqZWN0LgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBJZiB0aGUgSVAgdmVyc2lvbnMgb2Ygc2VsZiBhbmQgb3RoZXIgYXJlIHRoZSBzYW1lLCByZXR1cm5zOgoKICAgICAgICAgICAgLTEgaWYgc2VsZiA8IG90aGVyOgogICAgICAgICAgICAgIGVnOiBJUHY0TmV0d29yaygnMTkyLjAuMi4wLzI1JykgPCBJUHY0TmV0d29yaygnMTkyLjAuMi4xMjgvMjUnKQogICAgICAgICAgICAgIElQdjZOZXR3b3JrKCcyMDAxOmRiODo6MTAwMC8xMjQnKSA8CiAgICAgICAgICAgICAgICAgIElQdjZOZXR3b3JrKCcyMDAxOmRiODo6MjAwMC8xMjQnKQogICAgICAgICAgICAwIGlmIHNlbGYgPT0gb3RoZXIKICAgICAgICAgICAgICBlZzogSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMC8yNCcpID09IElQdjROZXR3b3JrKCcxOTIuMC4yLjAvMjQnKQogICAgICAgICAgICAgIElQdjZOZXR3b3JrKCcyMDAxOmRiODo6MTAwMC8xMjQnKSA9PQogICAgICAgICAgICAgICAgICBJUHY2TmV0d29yaygnMjAwMTpkYjg6OjEwMDAvMTI0JykKICAgICAgICAgICAgMSBpZiBzZWxmID4gb3RoZXIKICAgICAgICAgICAgICBlZzogSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMTI4LzI1JykgPiBJUHY0TmV0d29yaygnMTkyLjAuMi4wLzI1JykKICAgICAgICAgICAgICAgICAgSVB2Nk5ldHdvcmsoJzIwMDE6ZGI4OjoyMDAwLzEyNCcpID4KICAgICAgICAgICAgICAgICAgICAgIElQdjZOZXR3b3JrKCcyMDAxOmRiODo6MTAwMC8xMjQnKQoKICAgICAgICAgIFJhaXNlczoKICAgICAgICAgICAgICBUeXBlRXJyb3IgaWYgdGhlIElQIHZlcnNpb25zIGFyZSBkaWZmZXJlbnQuCgogICAgICAgICIiIgogICAgICAgICMgZG9lcyB0aGlzIG5lZWQgdG8gcmFpc2UgYSBWYWx1ZUVycm9yPwogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24gIT0gb3RoZXIuX3ZlcnNpb246CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignJXMgYW5kICVzIGFyZSBub3Qgb2YgdGhlIHNhbWUgdHlwZScgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBvdGhlcikpCiAgICAgICAgIyBzZWxmLl92ZXJzaW9uID09IG90aGVyLl92ZXJzaW9uIGJlbG93IGhlcmU6CiAgICAgICAgaWYgc2VsZi5uZXR3b3JrX2FkZHJlc3MgPCBvdGhlci5uZXR3b3JrX2FkZHJlc3M6CiAgICAgICAgICAgIHJldHVybiAtMQogICAgICAgIGlmIHNlbGYubmV0d29ya19hZGRyZXNzID4gb3RoZXIubmV0d29ya19hZGRyZXNzOgogICAgICAgICAgICByZXR1cm4gMQogICAgICAgICMgc2VsZi5uZXR3b3JrX2FkZHJlc3MgPT0gb3RoZXIubmV0d29ya19hZGRyZXNzIGJlbG93IGhlcmU6CiAgICAgICAgaWYgc2VsZi5uZXRtYXNrIDwgb3RoZXIubmV0bWFzazoKICAgICAgICAgICAgcmV0dXJuIC0xCiAgICAgICAgaWYgc2VsZi5uZXRtYXNrID4gb3RoZXIubmV0bWFzazoKICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICByZXR1cm4gMAoKICAgIGRlZiBfZ2V0X25ldHdvcmtzX2tleShzZWxmKToKICAgICAgICAiIiJOZXR3b3JrLW9ubHkga2V5IGZ1bmN0aW9uLgoKICAgICAgICBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGlkZW50aWZpZXMgdGhpcyBhZGRyZXNzJyBuZXR3b3JrIGFuZAogICAgICAgIG5ldG1hc2suIFRoaXMgZnVuY3Rpb24gaXMgYSBzdWl0YWJsZSAia2V5IiBhcmd1bWVudCBmb3Igc29ydGVkKCkKICAgICAgICBhbmQgbGlzdC5zb3J0KCkuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoc2VsZi5fdmVyc2lvbiwgc2VsZi5uZXR3b3JrX2FkZHJlc3MsIHNlbGYubmV0bWFzaykKCiAgICBkZWYgc3VibmV0cyhzZWxmLCBwcmVmaXhsZW5fZGlmZj0xLCBuZXdfcHJlZml4PU5vbmUpOgogICAgICAgICIiIlRoZSBzdWJuZXRzIHdoaWNoIGpvaW4gdG8gbWFrZSB0aGUgY3VycmVudCBzdWJuZXQuCgogICAgICAgIEluIHRoZSBjYXNlIHRoYXQgc2VsZiBjb250YWlucyBvbmx5IG9uZSBJUAogICAgICAgIChzZWxmLl9wcmVmaXhsZW4gPT0gMzIgZm9yIElQdjQgb3Igc2VsZi5fcHJlZml4bGVuID09IDEyOAogICAgICAgIGZvciBJUHY2KSwgeWllbGQgYW4gaXRlcmF0b3Igd2l0aCBqdXN0IG91cnNlbGYuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHByZWZpeGxlbl9kaWZmOiBBbiBpbnRlZ2VyLCB0aGUgYW1vdW50IHRoZSBwcmVmaXggbGVuZ3RoCiAgICAgICAgICAgICAgc2hvdWxkIGJlIGluY3JlYXNlZCBieS4gVGhpcyBzaG91bGQgbm90IGJlIHNldCBpZgogICAgICAgICAgICAgIG5ld19wcmVmaXggaXMgYWxzbyBzZXQuCiAgICAgICAgICAgIG5ld19wcmVmaXg6IFRoZSBkZXNpcmVkIG5ldyBwcmVmaXggbGVuZ3RoLiBUaGlzIG11c3QgYmUgYQogICAgICAgICAgICAgIGxhcmdlciBudW1iZXIgKHNtYWxsZXIgcHJlZml4KSB0aGFuIHRoZSBleGlzdGluZyBwcmVmaXguCiAgICAgICAgICAgICAgVGhpcyBzaG91bGQgbm90IGJlIHNldCBpZiBwcmVmaXhsZW5fZGlmZiBpcyBhbHNvIHNldC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQW4gaXRlcmF0b3Igb2YgSVB2KDR8Nikgb2JqZWN0cy4KCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBWYWx1ZUVycm9yOiBUaGUgcHJlZml4bGVuX2RpZmYgaXMgdG9vIHNtYWxsIG9yIHRvbyBsYXJnZS4KICAgICAgICAgICAgICAgIE9SCiAgICAgICAgICAgIHByZWZpeGxlbl9kaWZmIGFuZCBuZXdfcHJlZml4IGFyZSBib3RoIHNldCBvciBuZXdfcHJlZml4CiAgICAgICAgICAgICAgaXMgYSBzbWFsbGVyIG51bWJlciB0aGFuIHRoZSBjdXJyZW50IHByZWZpeCAoc21hbGxlcgogICAgICAgICAgICAgIG51bWJlciBtZWFucyBhIGxhcmdlciBuZXR3b3JrKQoKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9wcmVmaXhsZW4gPT0gc2VsZi5fbWF4X3ByZWZpeGxlbjoKICAgICAgICAgICAgeWllbGQgc2VsZgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgbmV3X3ByZWZpeCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgbmV3X3ByZWZpeCA8IHNlbGYuX3ByZWZpeGxlbjoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ25ldyBwcmVmaXggbXVzdCBiZSBsb25nZXInKQogICAgICAgICAgICBpZiBwcmVmaXhsZW5fZGlmZiAhPSAxOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignY2Fubm90IHNldCBwcmVmaXhsZW5fZGlmZiBhbmQgbmV3X3ByZWZpeCcpCiAgICAgICAgICAgIHByZWZpeGxlbl9kaWZmID0gbmV3X3ByZWZpeCAtIHNlbGYuX3ByZWZpeGxlbgoKICAgICAgICBpZiBwcmVmaXhsZW5fZGlmZiA8IDA6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3ByZWZpeCBsZW5ndGggZGlmZiBtdXN0IGJlID4gMCcpCiAgICAgICAgbmV3X3ByZWZpeGxlbiA9IHNlbGYuX3ByZWZpeGxlbiArIHByZWZpeGxlbl9kaWZmCgogICAgICAgIGlmIG5ld19wcmVmaXhsZW4gPiBzZWxmLl9tYXhfcHJlZml4bGVuOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgJ3ByZWZpeCBsZW5ndGggZGlmZiAlZCBpcyBpbnZhbGlkIGZvciBuZXRibG9jayAlcycgJSAoCiAgICAgICAgICAgICAgICAgICAgbmV3X3ByZWZpeGxlbiwgc2VsZikpCgogICAgICAgIHN0YXJ0ID0gaW50KHNlbGYubmV0d29ya19hZGRyZXNzKQogICAgICAgIGVuZCA9IGludChzZWxmLmJyb2FkY2FzdF9hZGRyZXNzKSArIDEKICAgICAgICBzdGVwID0gKGludChzZWxmLmhvc3RtYXNrKSArIDEpID4+IHByZWZpeGxlbl9kaWZmCiAgICAgICAgZm9yIG5ld19hZGRyIGluIF9jb21wYXRfcmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCk6CiAgICAgICAgICAgIGN1cnJlbnQgPSBzZWxmLl9fY2xhc3NfXygobmV3X2FkZHIsIG5ld19wcmVmaXhsZW4pKQogICAgICAgICAgICB5aWVsZCBjdXJyZW50CgogICAgZGVmIHN1cGVybmV0KHNlbGYsIHByZWZpeGxlbl9kaWZmPTEsIG5ld19wcmVmaXg9Tm9uZSk6CiAgICAgICAgIiIiVGhlIHN1cGVybmV0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgbmV0d29yay4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgcHJlZml4bGVuX2RpZmY6IEFuIGludGVnZXIsIHRoZSBhbW91bnQgdGhlIHByZWZpeCBsZW5ndGggb2YKICAgICAgICAgICAgICB0aGUgbmV0d29yayBzaG91bGQgYmUgZGVjcmVhc2VkIGJ5LiAgRm9yIGV4YW1wbGUsIGdpdmVuIGEKICAgICAgICAgICAgICAvMjQgbmV0d29yayBhbmQgYSBwcmVmaXhsZW5fZGlmZiBvZiAzLCBhIHN1cGVybmV0IHdpdGggYQogICAgICAgICAgICAgIC8yMSBuZXRtYXNrIGlzIHJldHVybmVkLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBbiBJUHY0IG5ldHdvcmsgb2JqZWN0LgoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIFZhbHVlRXJyb3I6IElmIHNlbGYucHJlZml4bGVuIC0gcHJlZml4bGVuX2RpZmYgPCAwLiBJLmUuLCB5b3UgaGF2ZQogICAgICAgICAgICAgIGEgbmVnYXRpdmUgcHJlZml4IGxlbmd0aC4KICAgICAgICAgICAgICAgIE9SCiAgICAgICAgICAgIElmIHByZWZpeGxlbl9kaWZmIGFuZCBuZXdfcHJlZml4IGFyZSBib3RoIHNldCBvciBuZXdfcHJlZml4IGlzIGEKICAgICAgICAgICAgICBsYXJnZXIgbnVtYmVyIHRoYW4gdGhlIGN1cnJlbnQgcHJlZml4IChsYXJnZXIgbnVtYmVyIG1lYW5zIGEKICAgICAgICAgICAgICBzbWFsbGVyIG5ldHdvcmspCgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuX3ByZWZpeGxlbiA9PSAwOgogICAgICAgICAgICByZXR1cm4gc2VsZgoKICAgICAgICBpZiBuZXdfcHJlZml4IGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBuZXdfcHJlZml4ID4gc2VsZi5fcHJlZml4bGVuOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbmV3IHByZWZpeCBtdXN0IGJlIHNob3J0ZXInKQogICAgICAgICAgICBpZiBwcmVmaXhsZW5fZGlmZiAhPSAxOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignY2Fubm90IHNldCBwcmVmaXhsZW5fZGlmZiBhbmQgbmV3X3ByZWZpeCcpCiAgICAgICAgICAgIHByZWZpeGxlbl9kaWZmID0gc2VsZi5fcHJlZml4bGVuIC0gbmV3X3ByZWZpeAoKICAgICAgICBuZXdfcHJlZml4bGVuID0gc2VsZi5wcmVmaXhsZW4gLSBwcmVmaXhsZW5fZGlmZgogICAgICAgIGlmIG5ld19wcmVmaXhsZW4gPCAwOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgJ2N1cnJlbnQgcHJlZml4bGVuIGlzICVkLCBjYW5ub3QgaGF2ZSBhIHByZWZpeGxlbl9kaWZmIG9mICVkJyAlCiAgICAgICAgICAgICAgICAoc2VsZi5wcmVmaXhsZW4sIHByZWZpeGxlbl9kaWZmKSkKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oKAogICAgICAgICAgICBpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpICYgKGludChzZWxmLm5ldG1hc2spIDw8IHByZWZpeGxlbl9kaWZmKSwKICAgICAgICAgICAgbmV3X3ByZWZpeGxlbgogICAgICAgICkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfbXVsdGljYXN0KHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgZm9yIG11bHRpY2FzdCB1c2UuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBhIG11bHRpY2FzdCBhZGRyZXNzLgogICAgICAgICAgICBTZWUgUkZDIDIzNzMgMi43IGZvciBkZXRhaWxzLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKHNlbGYubmV0d29ya19hZGRyZXNzLmlzX211bHRpY2FzdCBhbmQKICAgICAgICAgICAgICAgIHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MuaXNfbXVsdGljYXN0KQoKICAgIGRlZiBzdWJuZXRfb2Yoc2VsZiwgb3RoZXIpOgogICAgICAgICMgYWx3YXlzIGZhbHNlIGlmIG9uZSBpcyB2NCBhbmQgdGhlIG90aGVyIGlzIHY2LgogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24gIT0gb3RoZXIuX3ZlcnNpb246CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICMgZGVhbGluZyB3aXRoIGFub3RoZXIgbmV0d29yay4KICAgICAgICBpZiAoaGFzYXR0cihvdGhlciwgJ25ldHdvcmtfYWRkcmVzcycpIGFuZAogICAgICAgICAgICAgICAgaGFzYXR0cihvdGhlciwgJ2Jyb2FkY2FzdF9hZGRyZXNzJykpOgogICAgICAgICAgICByZXR1cm4gKG90aGVyLm5ldHdvcmtfYWRkcmVzcyA8PSBzZWxmLm5ldHdvcmtfYWRkcmVzcyBhbmQKICAgICAgICAgICAgICAgICAgICBvdGhlci5icm9hZGNhc3RfYWRkcmVzcyA+PSBzZWxmLmJyb2FkY2FzdF9hZGRyZXNzKQogICAgICAgICMgZGVhbGluZyB3aXRoIGFub3RoZXIgYWRkcmVzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignVW5hYmxlIHRvIHRlc3Qgc3VibmV0IGNvbnRhaW5tZW50IHdpdGggZWxlbWVudCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2YgdHlwZSAlcycgJSB0eXBlKG90aGVyKSkKCiAgICBkZWYgc3VwZXJuZXRfb2Yoc2VsZiwgb3RoZXIpOgogICAgICAgICMgYWx3YXlzIGZhbHNlIGlmIG9uZSBpcyB2NCBhbmQgdGhlIG90aGVyIGlzIHY2LgogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24gIT0gb3RoZXIuX3ZlcnNpb246CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICMgZGVhbGluZyB3aXRoIGFub3RoZXIgbmV0d29yay4KICAgICAgICBpZiAoaGFzYXR0cihvdGhlciwgJ25ldHdvcmtfYWRkcmVzcycpIGFuZAogICAgICAgICAgICAgICAgaGFzYXR0cihvdGhlciwgJ2Jyb2FkY2FzdF9hZGRyZXNzJykpOgogICAgICAgICAgICByZXR1cm4gKG90aGVyLm5ldHdvcmtfYWRkcmVzcyA+PSBzZWxmLm5ldHdvcmtfYWRkcmVzcyBhbmQKICAgICAgICAgICAgICAgICAgICBvdGhlci5icm9hZGNhc3RfYWRkcmVzcyA8PSBzZWxmLmJyb2FkY2FzdF9hZGRyZXNzKQogICAgICAgICMgZGVhbGluZyB3aXRoIGFub3RoZXIgYWRkcmVzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignVW5hYmxlIHRvIHRlc3Qgc3VibmV0IGNvbnRhaW5tZW50IHdpdGggZWxlbWVudCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2YgdHlwZSAlcycgJSB0eXBlKG90aGVyKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19yZXNlcnZlZChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIG90aGVyd2lzZSBJRVRGIHJlc2VydmVkLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgd2l0aGluIG9uZSBvZiB0aGUKICAgICAgICAgICAgcmVzZXJ2ZWQgSVB2NiBOZXR3b3JrIHJhbmdlcy4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIChzZWxmLm5ldHdvcmtfYWRkcmVzcy5pc19yZXNlcnZlZCBhbmQKICAgICAgICAgICAgICAgIHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MuaXNfcmVzZXJ2ZWQpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfbGlua19sb2NhbChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIGZvciBsaW5rLWxvY2FsLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgcGVyIFJGQyA0MjkxLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKHNlbGYubmV0d29ya19hZGRyZXNzLmlzX2xpbmtfbG9jYWwgYW5kCiAgICAgICAgICAgICAgICBzZWxmLmJyb2FkY2FzdF9hZGRyZXNzLmlzX2xpbmtfbG9jYWwpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJpdmF0ZShzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoaXMgYWRkcmVzcyBpcyBhbGxvY2F0ZWQgZm9yIHByaXZhdGUgbmV0d29ya3MuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyByZXNlcnZlZCBwZXIKICAgICAgICAgICAgaWFuYS1pcHY0LXNwZWNpYWwtcmVnaXN0cnkgb3IgaWFuYS1pcHY2LXNwZWNpYWwtcmVnaXN0cnkuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoc2VsZi5uZXR3b3JrX2FkZHJlc3MuaXNfcHJpdmF0ZSBhbmQKICAgICAgICAgICAgICAgIHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MuaXNfcHJpdmF0ZSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19nbG9iYWwoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGlzIGFkZHJlc3MgaXMgYWxsb2NhdGVkIGZvciBwdWJsaWMgbmV0d29ya3MuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBub3QgcmVzZXJ2ZWQgcGVyCiAgICAgICAgICAgIGlhbmEtaXB2NC1zcGVjaWFsLXJlZ2lzdHJ5IG9yIGlhbmEtaXB2Ni1zcGVjaWFsLXJlZ2lzdHJ5LgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gbm90IHNlbGYuaXNfcHJpdmF0ZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3Vuc3BlY2lmaWVkKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgdW5zcGVjaWZpZWQuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGlzIGlzIHRoZSB1bnNwZWNpZmllZCBhZGRyZXNzIGFzIGRlZmluZWQgaW4KICAgICAgICAgICAgUkZDIDIzNzMgMi41LjIuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoc2VsZi5uZXR3b3JrX2FkZHJlc3MuaXNfdW5zcGVjaWZpZWQgYW5kCiAgICAgICAgICAgICAgICBzZWxmLmJyb2FkY2FzdF9hZGRyZXNzLmlzX3Vuc3BlY2lmaWVkKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2xvb3BiYWNrKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgYSBsb29wYmFjayBhZGRyZXNzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSBsb29wYmFjayBhZGRyZXNzIGFzIGRlZmluZWQgaW4KICAgICAgICAgICAgUkZDIDIzNzMgMi41LjMuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoc2VsZi5uZXR3b3JrX2FkZHJlc3MuaXNfbG9vcGJhY2sgYW5kCiAgICAgICAgICAgICAgICBzZWxmLmJyb2FkY2FzdF9hZGRyZXNzLmlzX2xvb3BiYWNrKQoKCmNsYXNzIF9CYXNlVjQob2JqZWN0KToKCiAgICAiIiJCYXNlIElQdjQgb2JqZWN0LgoKICAgIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCBieSBJUHY0IG9iamVjdHMgaW4gYm90aCBzaW5nbGUgSVAKICAgIGFkZHJlc3NlcyBhbmQgbmV0d29ya3MuCgogICAgIiIiCgogICAgX19zbG90c19fID0gKCkKICAgIF92ZXJzaW9uID0gNAogICAgIyBFcXVpdmFsZW50IHRvIDI1NS4yNTUuMjU1LjI1NSBvciAzMiBiaXRzIG9mIDEncy4KICAgIF9BTExfT05FUyA9ICgyICoqIElQVjRMRU5HVEgpIC0gMQogICAgX0RFQ0lNQUxfRElHSVRTID0gZnJvemVuc2V0KCcwMTIzNDU2Nzg5JykKCiAgICAjIHRoZSB2YWxpZCBvY3RldHMgZm9yIGhvc3QgYW5kIG5ldG1hc2tzLiBvbmx5IHVzZWZ1bCBmb3IgSVB2NC4KICAgIF92YWxpZF9tYXNrX29jdGV0cyA9IGZyb3plbnNldChbMjU1LCAyNTQsIDI1MiwgMjQ4LCAyNDAsIDIyNCwgMTkyLCAxMjgsIDBdKQoKICAgIF9tYXhfcHJlZml4bGVuID0gSVBWNExFTkdUSAogICAgIyBUaGVyZSBhcmUgb25seSBhIGhhbmRmdWwgb2YgdmFsaWQgdjQgbmV0bWFza3MsIHNvIHdlIGNhY2hlIHRoZW0gYWxsCiAgICAjIHdoZW4gY29uc3RydWN0ZWQgKHNlZSBfbWFrZV9uZXRtYXNrKCkpLgogICAgX25ldG1hc2tfY2FjaGUgPSB7fQoKICAgIGRlZiBfZXhwbG9kZV9zaG9ydGhhbmRfaXBfc3RyaW5nKHNlbGYpOgogICAgICAgIHJldHVybiBfY29tcGF0X3N0cihzZWxmKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9tYWtlX25ldG1hc2soY2xzLCBhcmcpOgogICAgICAgICIiIk1ha2UgYSAobmV0bWFzaywgcHJlZml4X2xlbikgdHVwbGUgZnJvbSB0aGUgZ2l2ZW4gYXJndW1lbnQuCgogICAgICAgIEFyZ3VtZW50IGNhbiBiZToKICAgICAgICAtIGFuIGludGVnZXIgKHRoZSBwcmVmaXggbGVuZ3RoKQogICAgICAgIC0gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwcmVmaXggbGVuZ3RoIChlLmcuICIyNCIpCiAgICAgICAgLSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHByZWZpeCBuZXRtYXNrIChlLmcuICIyNTUuMjU1LjI1NS4wIikKICAgICAgICAiIiIKICAgICAgICBpZiBhcmcgbm90IGluIGNscy5fbmV0bWFza19jYWNoZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIF9jb21wYXRfaW50X3R5cGVzKToKICAgICAgICAgICAgICAgIHByZWZpeGxlbiA9IGFyZwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgZm9yIGEgbmV0bWFzayBpbiBwcmVmaXggbGVuZ3RoIGZvcm0KICAgICAgICAgICAgICAgICAgICBwcmVmaXhsZW4gPSBjbHMuX3ByZWZpeF9mcm9tX3ByZWZpeF9zdHJpbmcoYXJnKQogICAgICAgICAgICAgICAgZXhjZXB0IE5ldG1hc2tWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgZm9yIGEgbmV0bWFzayBvciBob3N0bWFzayBpbiBkb3R0ZWQtcXVhZCBmb3JtLgogICAgICAgICAgICAgICAgICAgICMgVGhpcyBtYXkgcmFpc2UgTmV0bWFza1ZhbHVlRXJyb3IuCiAgICAgICAgICAgICAgICAgICAgcHJlZml4bGVuID0gY2xzLl9wcmVmaXhfZnJvbV9pcF9zdHJpbmcoYXJnKQogICAgICAgICAgICBuZXRtYXNrID0gSVB2NEFkZHJlc3MoY2xzLl9pcF9pbnRfZnJvbV9wcmVmaXgocHJlZml4bGVuKSkKICAgICAgICAgICAgY2xzLl9uZXRtYXNrX2NhY2hlW2FyZ10gPSBuZXRtYXNrLCBwcmVmaXhsZW4KICAgICAgICByZXR1cm4gY2xzLl9uZXRtYXNrX2NhY2hlW2FyZ10KCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfaXBfaW50X2Zyb21fc3RyaW5nKGNscywgaXBfc3RyKToKICAgICAgICAiIiJUdXJuIHRoZSBnaXZlbiBJUCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIGZvciBjb21wYXJpc29uLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBpcF9zdHI6IEEgc3RyaW5nLCB0aGUgSVAgaXBfc3RyLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBUaGUgSVAgaXBfc3RyIGFzIGFuIGludGVnZXIuCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgQWRkcmVzc1ZhbHVlRXJyb3I6IGlmIGlwX3N0ciBpc24ndCBhIHZhbGlkIElQdjQgQWRkcmVzcy4KCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IGlwX3N0cjoKICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IoJ0FkZHJlc3MgY2Fubm90IGJlIGVtcHR5JykKCiAgICAgICAgb2N0ZXRzID0gaXBfc3RyLnNwbGl0KCcuJykKICAgICAgICBpZiBsZW4ob2N0ZXRzKSAhPSA0OgogICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcigiRXhwZWN0ZWQgNCBvY3RldHMgaW4gJXIiICUgaXBfc3RyKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBfY29tcGF0X2ludF9mcm9tX2J5dGVfdmFscygKICAgICAgICAgICAgICAgIG1hcChjbHMuX3BhcnNlX29jdGV0LCBvY3RldHMpLCAnYmlnJykKICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBleGM6CiAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKCIlcyBpbiAlciIgJSAoZXhjLCBpcF9zdHIpKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9vY3RldChjbHMsIG9jdGV0X3N0cik6CiAgICAgICAgIiIiQ29udmVydCBhIGRlY2ltYWwgb2N0ZXQgaW50byBhbiBpbnRlZ2VyLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBvY3RldF9zdHI6IEEgc3RyaW5nLCB0aGUgbnVtYmVyIHRvIHBhcnNlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBUaGUgb2N0ZXQgYXMgYW4gaW50ZWdlci4KCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBWYWx1ZUVycm9yOiBpZiB0aGUgb2N0ZXQgaXNuJ3Qgc3RyaWN0bHkgYSBkZWNpbWFsIGZyb20gWzAuLjI1NV0uCgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBvY3RldF9zdHI6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkVtcHR5IG9jdGV0IG5vdCBwZXJtaXR0ZWQiKQogICAgICAgICMgV2hpdGVsaXN0IHRoZSBjaGFyYWN0ZXJzLCBzaW5jZSBpbnQoKSBhbGxvd3MgYSBsb3Qgb2YgYml6YXJyZSBzdHVmZi4KICAgICAgICBpZiBub3QgY2xzLl9ERUNJTUFMX0RJR0lUUy5pc3N1cGVyc2V0KG9jdGV0X3N0cik6CiAgICAgICAgICAgIG1zZyA9ICJPbmx5IGRlY2ltYWwgZGlnaXRzIHBlcm1pdHRlZCBpbiAlciIKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2cgJSBvY3RldF9zdHIpCiAgICAgICAgIyBXZSBkbyB0aGUgbGVuZ3RoIGNoZWNrIHNlY29uZCwgc2luY2UgdGhlIGludmFsaWQgY2hhcmFjdGVyIGVycm9yCiAgICAgICAgIyBpcyBsaWtlbHkgdG8gYmUgbW9yZSBpbmZvcm1hdGl2ZSBmb3IgdGhlIHVzZXIKICAgICAgICBpZiBsZW4ob2N0ZXRfc3RyKSA+IDM6CiAgICAgICAgICAgIG1zZyA9ICJBdCBtb3N0IDMgY2hhcmFjdGVycyBwZXJtaXR0ZWQgaW4gJXIiCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnICUgb2N0ZXRfc3RyKQogICAgICAgICMgQ29udmVydCB0byBpbnRlZ2VyICh3ZSBrbm93IGRpZ2l0cyBhcmUgbGVnYWwpCiAgICAgICAgb2N0ZXRfaW50ID0gaW50KG9jdGV0X3N0ciwgMTApCiAgICAgICAgIyBBbnkgb2N0ZXRzIHRoYXQgbG9vayBsaWtlIHRoZXkgKm1pZ2h0KiBiZSB3cml0dGVuIGluIG9jdGFsLAogICAgICAgICMgYW5kIHdoaWNoIGRvbid0IGxvb2sgZXhhY3RseSB0aGUgc2FtZSBpbiBib3RoIG9jdGFsIGFuZAogICAgICAgICMgZGVjaW1hbCBhcmUgcmVqZWN0ZWQgYXMgYW1iaWd1b3VzCiAgICAgICAgaWYgb2N0ZXRfaW50ID4gNyBhbmQgb2N0ZXRfc3RyWzBdID09ICcwJzoKICAgICAgICAgICAgbXNnID0gIkFtYmlndW91cyAob2N0YWwvZGVjaW1hbCkgdmFsdWUgaW4gJXIgbm90IHBlcm1pdHRlZCIKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2cgJSBvY3RldF9zdHIpCiAgICAgICAgaWYgb2N0ZXRfaW50ID4gMjU1OgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJPY3RldCAlZCAoPiAyNTUpIG5vdCBwZXJtaXR0ZWQiICUgb2N0ZXRfaW50KQogICAgICAgIHJldHVybiBvY3RldF9pbnQKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfc3RyaW5nX2Zyb21faXBfaW50KGNscywgaXBfaW50KToKICAgICAgICAiIiJUdXJucyBhIDMyLWJpdCBpbnRlZ2VyIGludG8gZG90dGVkIGRlY2ltYWwgbm90YXRpb24uCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGlwX2ludDogQW4gaW50ZWdlciwgdGhlIElQIGFkZHJlc3MuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIFRoZSBJUCBhZGRyZXNzIGFzIGEgc3RyaW5nIGluIGRvdHRlZCBkZWNpbWFsIG5vdGF0aW9uLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gJy4nLmpvaW4oX2NvbXBhdF9zdHIoc3RydWN0LnVucGFjayhiJyFCJywgYilbMF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShiLCBieXRlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBiKQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgYiBpbiBfY29tcGF0X3RvX2J5dGVzKGlwX2ludCwgNCwgJ2JpZycpKQoKICAgIGRlZiBfaXNfaG9zdG1hc2soc2VsZiwgaXBfc3RyKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBJUCBzdHJpbmcgaXMgYSBob3N0bWFzayAocmF0aGVyIHRoYW4gYSBuZXRtYXNrKS4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgaXBfc3RyOiBBIHN0cmluZywgdGhlIHBvdGVudGlhbCBob3N0bWFzay4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBJUCBzdHJpbmcgaXMgYSBob3N0bWFzay4KCiAgICAgICAgIiIiCiAgICAgICAgYml0cyA9IGlwX3N0ci5zcGxpdCgnLicpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwYXJ0cyA9IFt4IGZvciB4IGluIG1hcChpbnQsIGJpdHMpIGlmIHggaW4gc2VsZi5fdmFsaWRfbWFza19vY3RldHNdCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGlmIGxlbihwYXJ0cykgIT0gbGVuKGJpdHMpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBpZiBwYXJ0c1swXSA8IHBhcnRzWy0xXToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX3JldmVyc2VfcG9pbnRlcihzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIHJldmVyc2UgRE5TIHBvaW50ZXIgbmFtZSBmb3IgdGhlIElQdjQgYWRkcmVzcy4KCiAgICAgICAgVGhpcyBpbXBsZW1lbnRzIHRoZSBtZXRob2QgZGVzY3JpYmVkIGluIFJGQzEwMzUgMy41LgoKICAgICAgICAiIiIKICAgICAgICByZXZlcnNlX29jdGV0cyA9IF9jb21wYXRfc3RyKHNlbGYpLnNwbGl0KCcuJylbOjotMV0KICAgICAgICByZXR1cm4gJy4nLmpvaW4ocmV2ZXJzZV9vY3RldHMpICsgJy5pbi1hZGRyLmFycGEnCgogICAgQHByb3BlcnR5CiAgICBkZWYgbWF4X3ByZWZpeGxlbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fbWF4X3ByZWZpeGxlbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCgpjbGFzcyBJUHY0QWRkcmVzcyhfQmFzZVY0LCBfQmFzZUFkZHJlc3MpOgoKICAgICIiIlJlcHJlc2VudCBhbmQgbWFuaXB1bGF0ZSBzaW5nbGUgSVB2NCBBZGRyZXNzZXMuIiIiCgogICAgX19zbG90c19fID0gKCdfaXAnLCAnX193ZWFrcmVmX18nKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzKToKCiAgICAgICAgIiIiCiAgICAgICAgQXJnczoKICAgICAgICAgICAgYWRkcmVzczogQSBzdHJpbmcgb3IgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIElQCgogICAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgYW4gaW50ZWdlciBjYW4gYmUgcGFzc2VkLCBzbwogICAgICAgICAgICAgIElQdjRBZGRyZXNzKCcxOTIuMC4yLjEnKSA9PSBJUHY0QWRkcmVzcygzMjIxMjI1OTg1KS4KICAgICAgICAgICAgICBvciwgbW9yZSBnZW5lcmFsbHkKICAgICAgICAgICAgICBJUHY0QWRkcmVzcyhpbnQoSVB2NEFkZHJlc3MoJzE5Mi4wLjIuMScpKSkgPT0KICAgICAgICAgICAgICAgIElQdjRBZGRyZXNzKCcxOTIuMC4yLjEnKQoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIEFkZHJlc3NWYWx1ZUVycm9yOiBJZiBpcGFkZHJlc3MgaXNuJ3QgYSB2YWxpZCBJUHY0IGFkZHJlc3MuCgogICAgICAgICIiIgogICAgICAgICMgRWZmaWNpZW50IGNvbnN0cnVjdG9yIGZyb20gaW50ZWdlci4KICAgICAgICBpZiBpc2luc3RhbmNlKGFkZHJlc3MsIF9jb21wYXRfaW50X3R5cGVzKToKICAgICAgICAgICAgc2VsZi5fY2hlY2tfaW50X2FkZHJlc3MoYWRkcmVzcykKICAgICAgICAgICAgc2VsZi5faXAgPSBhZGRyZXNzCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIENvbnN0cnVjdGluZyBmcm9tIGEgcGFja2VkIGFkZHJlc3MKICAgICAgICBpZiBpc2luc3RhbmNlKGFkZHJlc3MsIGJ5dGVzKToKICAgICAgICAgICAgc2VsZi5fY2hlY2tfcGFja2VkX2FkZHJlc3MoYWRkcmVzcywgNCkKICAgICAgICAgICAgYnZzID0gX2NvbXBhdF9ieXRlc190b19ieXRlX3ZhbHMoYWRkcmVzcykKICAgICAgICAgICAgc2VsZi5faXAgPSBfY29tcGF0X2ludF9mcm9tX2J5dGVfdmFscyhidnMsICdiaWcnKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBBc3N1bWUgaW5wdXQgYXJndW1lbnQgdG8gYmUgc3RyaW5nIG9yIGFueSBvYmplY3QgcmVwcmVzZW50YXRpb24KICAgICAgICAjIHdoaWNoIGNvbnZlcnRzIGludG8gYSBmb3JtYXR0ZWQgSVAgc3RyaW5nLgogICAgICAgIGFkZHJfc3RyID0gX2NvbXBhdF9zdHIoYWRkcmVzcykKICAgICAgICBpZiAnLycgaW4gYWRkcl9zdHI6CiAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKCJVbmV4cGVjdGVkICcvJyBpbiAlciIgJSBhZGRyZXNzKQogICAgICAgIHNlbGYuX2lwID0gc2VsZi5faXBfaW50X2Zyb21fc3RyaW5nKGFkZHJfc3RyKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhY2tlZChzZWxmKToKICAgICAgICAiIiJUaGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgYWRkcmVzcy4iIiIKICAgICAgICByZXR1cm4gdjRfaW50X3RvX3BhY2tlZChzZWxmLl9pcCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19yZXNlcnZlZChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIG90aGVyd2lzZSBJRVRGIHJlc2VydmVkLgoKICAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyB3aXRoaW4gdGhlCiAgICAgICAgICAgICByZXNlcnZlZCBJUHY0IE5ldHdvcmsgcmFuZ2UuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmIGluIHNlbGYuX2NvbnN0YW50cy5fcmVzZXJ2ZWRfbmV0d29yawoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByaXZhdGUoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGlzIGFkZHJlc3MgaXMgYWxsb2NhdGVkIGZvciBwcml2YXRlIG5ldHdvcmtzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgcGVyCiAgICAgICAgICAgIGlhbmEtaXB2NC1zcGVjaWFsLXJlZ2lzdHJ5LgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gYW55KHNlbGYgaW4gbmV0IGZvciBuZXQgaW4gc2VsZi5fY29uc3RhbnRzLl9wcml2YXRlX25ldHdvcmtzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2dsb2JhbChzZWxmKToKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBzZWxmIG5vdCBpbiBzZWxmLl9jb25zdGFudHMuX3B1YmxpY19uZXR3b3JrIGFuZAogICAgICAgICAgICBub3Qgc2VsZi5pc19wcml2YXRlKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX211bHRpY2FzdChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIGZvciBtdWx0aWNhc3QgdXNlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgbXVsdGljYXN0LgogICAgICAgICAgICBTZWUgUkZDIDMxNzEgZm9yIGRldGFpbHMuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmIGluIHNlbGYuX2NvbnN0YW50cy5fbXVsdGljYXN0X25ldHdvcmsKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc191bnNwZWNpZmllZChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIHVuc3BlY2lmaWVkLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhpcyBpcyB0aGUgdW5zcGVjaWZpZWQgYWRkcmVzcyBhcyBkZWZpbmVkIGluCiAgICAgICAgICAgIFJGQyA1NzM1IDMuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmID09IHNlbGYuX2NvbnN0YW50cy5fdW5zcGVjaWZpZWRfYWRkcmVzcwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2xvb3BiYWNrKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgYSBsb29wYmFjayBhZGRyZXNzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSBsb29wYmFjayBwZXIgUkZDIDMzMzAuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmIGluIHNlbGYuX2NvbnN0YW50cy5fbG9vcGJhY2tfbmV0d29yawoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2xpbmtfbG9jYWwoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyByZXNlcnZlZCBmb3IgbGluay1sb2NhbC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIGxpbmstbG9jYWwgcGVyIFJGQyAzOTI3LgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZiBpbiBzZWxmLl9jb25zdGFudHMuX2xpbmtsb2NhbF9uZXR3b3JrCgoKY2xhc3MgSVB2NEludGVyZmFjZShJUHY0QWRkcmVzcyk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHJlc3MpOgogICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgKGJ5dGVzLCBfY29tcGF0X2ludF90eXBlcykpOgogICAgICAgICAgICBJUHY0QWRkcmVzcy5fX2luaXRfXyhzZWxmLCBhZGRyZXNzKQogICAgICAgICAgICBzZWxmLm5ldHdvcmsgPSBJUHY0TmV0d29yayhzZWxmLl9pcCkKICAgICAgICAgICAgc2VsZi5fcHJlZml4bGVuID0gc2VsZi5fbWF4X3ByZWZpeGxlbgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgaXNpbnN0YW5jZShhZGRyZXNzLCB0dXBsZSk6CiAgICAgICAgICAgIElQdjRBZGRyZXNzLl9faW5pdF9fKHNlbGYsIGFkZHJlc3NbMF0pCiAgICAgICAgICAgIGlmIGxlbihhZGRyZXNzKSA+IDE6CiAgICAgICAgICAgICAgICBzZWxmLl9wcmVmaXhsZW4gPSBpbnQoYWRkcmVzc1sxXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX3ByZWZpeGxlbiA9IHNlbGYuX21heF9wcmVmaXhsZW4KCiAgICAgICAgICAgIHNlbGYubmV0d29yayA9IElQdjROZXR3b3JrKGFkZHJlc3MsIHN0cmljdD1GYWxzZSkKICAgICAgICAgICAgc2VsZi5uZXRtYXNrID0gc2VsZi5uZXR3b3JrLm5ldG1hc2sKICAgICAgICAgICAgc2VsZi5ob3N0bWFzayA9IHNlbGYubmV0d29yay5ob3N0bWFzawogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgYWRkciA9IF9zcGxpdF9vcHRpb25hbF9uZXRtYXNrKGFkZHJlc3MpCiAgICAgICAgSVB2NEFkZHJlc3MuX19pbml0X18oc2VsZiwgYWRkclswXSkKCiAgICAgICAgc2VsZi5uZXR3b3JrID0gSVB2NE5ldHdvcmsoYWRkcmVzcywgc3RyaWN0PUZhbHNlKQogICAgICAgIHNlbGYuX3ByZWZpeGxlbiA9IHNlbGYubmV0d29yay5fcHJlZml4bGVuCgogICAgICAgIHNlbGYubmV0bWFzayA9IHNlbGYubmV0d29yay5uZXRtYXNrCiAgICAgICAgc2VsZi5ob3N0bWFzayA9IHNlbGYubmV0d29yay5ob3N0bWFzawoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMvJWQnICUgKHNlbGYuX3N0cmluZ19mcm9tX2lwX2ludChzZWxmLl9pcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXR3b3JrLnByZWZpeGxlbikKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBhZGRyZXNzX2VxdWFsID0gSVB2NEFkZHJlc3MuX19lcV9fKHNlbGYsIG90aGVyKQogICAgICAgIGlmIG5vdCBhZGRyZXNzX2VxdWFsIG9yIGFkZHJlc3NfZXF1YWwgaXMgTm90SW1wbGVtZW50ZWQ6CiAgICAgICAgICAgIHJldHVybiBhZGRyZXNzX2VxdWFsCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5uZXR3b3JrID09IG90aGVyLm5ldHdvcmsKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICMgQW4gaW50ZXJmYWNlIHdpdGggYW4gYXNzb2NpYXRlZCBuZXR3b3JrIGlzIE5PVCB0aGUKICAgICAgICAgICAgIyBzYW1lIGFzIGFuIHVuYXNzb2NpYXRlZCBhZGRyZXNzLiBUaGF0J3Mgd2h5IHRoZSBoYXNoCiAgICAgICAgICAgICMgdGFrZXMgdGhlIGV4dHJhIGluZm8gaW50byBhY2NvdW50LgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICBhZGRyZXNzX2xlc3MgPSBJUHY0QWRkcmVzcy5fX2x0X18oc2VsZiwgb3RoZXIpCiAgICAgICAgaWYgYWRkcmVzc19sZXNzIGlzIE5vdEltcGxlbWVudGVkOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5ldHdvcmsgPCBvdGhlci5uZXR3b3JrCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAjIFdlICpkbyogYWxsb3cgYWRkcmVzc2VzIGFuZCBpbnRlcmZhY2VzIHRvIGJlIHNvcnRlZC4gVGhlCiAgICAgICAgICAgICMgdW5hc3NvY2lhdGVkIGFkZHJlc3MgaXMgY29uc2lkZXJlZCBsZXNzIHRoYW4gYWxsIGludGVyZmFjZXMuCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5faXAgXiBzZWxmLl9wcmVmaXhsZW4gXiBpbnQoc2VsZi5uZXR3b3JrLm5ldHdvcmtfYWRkcmVzcykKCiAgICBfX3JlZHVjZV9fID0gX0lQQWRkcmVzc0Jhc2UuX19yZWR1Y2VfXwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlwKHNlbGYpOgogICAgICAgIHJldHVybiBJUHY0QWRkcmVzcyhzZWxmLl9pcCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB3aXRoX3ByZWZpeGxlbihzZWxmKToKICAgICAgICByZXR1cm4gJyVzLyVzJyAlIChzZWxmLl9zdHJpbmdfZnJvbV9pcF9pbnQoc2VsZi5faXApLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3ByZWZpeGxlbikKCiAgICBAcHJvcGVydHkKICAgIGRlZiB3aXRoX25ldG1hc2soc2VsZik6CiAgICAgICAgcmV0dXJuICclcy8lcycgJSAoc2VsZi5fc3RyaW5nX2Zyb21faXBfaW50KHNlbGYuX2lwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5ldG1hc2spCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2l0aF9ob3N0bWFzayhzZWxmKToKICAgICAgICByZXR1cm4gJyVzLyVzJyAlIChzZWxmLl9zdHJpbmdfZnJvbV9pcF9pbnQoc2VsZi5faXApLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaG9zdG1hc2spCgoKY2xhc3MgSVB2NE5ldHdvcmsoX0Jhc2VWNCwgX0Jhc2VOZXR3b3JrKToKCiAgICAiIiJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW5kIG1hbmlwdWxhdGVzIDMyLWJpdCBJUHY0IG5ldHdvcmsgKyBhZGRyZXNzZXMuLgoKICAgIEF0dHJpYnV0ZXM6IFtleGFtcGxlcyBmb3IgSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMC8yNycpXQogICAgICAgIC5uZXR3b3JrX2FkZHJlc3M6IElQdjRBZGRyZXNzKCcxOTIuMC4yLjAnKQogICAgICAgIC5ob3N0bWFzazogSVB2NEFkZHJlc3MoJzAuMC4wLjMxJykKICAgICAgICAuYnJvYWRjYXN0X2FkZHJlc3M6IElQdjRBZGRyZXNzKCcxOTIuMC4yLjMyJykKICAgICAgICAubmV0bWFzazogSVB2NEFkZHJlc3MoJzI1NS4yNTUuMjU1LjIyNCcpCiAgICAgICAgLnByZWZpeGxlbjogMjcKCiAgICAiIiIKICAgICMgQ2xhc3MgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYWRkcmVzcyBvYmplY3RzCiAgICBfYWRkcmVzc19jbGFzcyA9IElQdjRBZGRyZXNzCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHJlc3MsIHN0cmljdD1UcnVlKToKCiAgICAgICAgIiIiSW5zdGFudGlhdGUgYSBuZXcgSVB2NCBuZXR3b3JrIG9iamVjdC4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgYWRkcmVzczogQSBzdHJpbmcgb3IgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIElQIFsmIG5ldHdvcmtdLgogICAgICAgICAgICAgICcxOTIuMC4yLjAvMjQnCiAgICAgICAgICAgICAgJzE5Mi4wLjIuMC8yNTUuMjU1LjI1NS4wJwogICAgICAgICAgICAgICcxOTIuMC4wLjIvMC4wLjAuMjU1JwogICAgICAgICAgICAgIGFyZSBhbGwgZnVuY3Rpb25hbGx5IHRoZSBzYW1lIGluIElQdjQuIFNpbWlsYXJseSwKICAgICAgICAgICAgICAnMTkyLjAuMi4xJwogICAgICAgICAgICAgICcxOTIuMC4yLjEvMjU1LjI1NS4yNTUuMjU1JwogICAgICAgICAgICAgICcxOTIuMC4yLjEvMzInCiAgICAgICAgICAgICAgYXJlIGFsc28gZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQuIFRoYXQgaXMgdG8gc2F5LCBmYWlsaW5nIHRvCiAgICAgICAgICAgICAgcHJvdmlkZSBhIHN1Ym5ldG1hc2sgd2lsbCBjcmVhdGUgYW4gb2JqZWN0IHdpdGggYSBtYXNrIG9mIC8zMi4KCiAgICAgICAgICAgICAgSWYgdGhlIG1hc2sgKHBvcnRpb24gYWZ0ZXIgdGhlIC8gaW4gdGhlIGFyZ3VtZW50KSBpcyBnaXZlbiBpbgogICAgICAgICAgICAgIGRvdHRlZCBxdWFkIGZvcm0sIGl0IGlzIHRyZWF0ZWQgYXMgYSBuZXRtYXNrIGlmIGl0IHN0YXJ0cyB3aXRoIGEKICAgICAgICAgICAgICBub24temVybyBmaWVsZCAoZS5nLiAvMjU1LjAuMC4wID09IC84KSBhbmQgYXMgYSBob3N0bWFzayBpZiBpdAogICAgICAgICAgICAgIHN0YXJ0cyB3aXRoIGEgemVybyBmaWVsZCAoZS5nLiAwLjI1NS4yNTUuMjU1ID09IC84KSwgd2l0aCB0aGUKICAgICAgICAgICAgICBzaW5nbGUgZXhjZXB0aW9uIG9mIGFuIGFsbC16ZXJvIG1hc2sgd2hpY2ggaXMgdHJlYXRlZCBhcyBhCiAgICAgICAgICAgICAgbmV0bWFzayA9PSAvMC4gSWYgbm8gbWFzayBpcyBnaXZlbiwgYSBkZWZhdWx0IG9mIC8zMiBpcyB1c2VkLgoKICAgICAgICAgICAgICBBZGRpdGlvbmFsbHksIGFuIGludGVnZXIgY2FuIGJlIHBhc3NlZCwgc28KICAgICAgICAgICAgICBJUHY0TmV0d29yaygnMTkyLjAuMi4xJykgPT0gSVB2NE5ldHdvcmsoMzIyMTIyNTk4NSkKICAgICAgICAgICAgICBvciwgbW9yZSBnZW5lcmFsbHkKICAgICAgICAgICAgICBJUHY0SW50ZXJmYWNlKGludChJUHY0SW50ZXJmYWNlKCcxOTIuMC4yLjEnKSkpID09CiAgICAgICAgICAgICAgICBJUHY0SW50ZXJmYWNlKCcxOTIuMC4yLjEnKQoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIEFkZHJlc3NWYWx1ZUVycm9yOiBJZiBpcGFkZHJlc3MgaXNuJ3QgYSB2YWxpZCBJUHY0IGFkZHJlc3MuCiAgICAgICAgICAgIE5ldG1hc2tWYWx1ZUVycm9yOiBJZiB0aGUgbmV0bWFzayBpc24ndCB2YWxpZCBmb3IKICAgICAgICAgICAgICBhbiBJUHY0IGFkZHJlc3MuCiAgICAgICAgICAgIFZhbHVlRXJyb3I6IElmIHN0cmljdCBpcyBUcnVlIGFuZCBhIG5ldHdvcmsgYWRkcmVzcyBpcyBub3QKICAgICAgICAgICAgICBzdXBwbGllZC4KCiAgICAgICAgIiIiCiAgICAgICAgX0Jhc2VOZXR3b3JrLl9faW5pdF9fKHNlbGYsIGFkZHJlc3MpCgogICAgICAgICMgQ29uc3RydWN0aW5nIGZyb20gYSBwYWNrZWQgYWRkcmVzcyBvciBpbnRlZ2VyCiAgICAgICAgaWYgaXNpbnN0YW5jZShhZGRyZXNzLCAoX2NvbXBhdF9pbnRfdHlwZXMsIGJ5dGVzKSk6CiAgICAgICAgICAgIHNlbGYubmV0d29ya19hZGRyZXNzID0gSVB2NEFkZHJlc3MoYWRkcmVzcykKICAgICAgICAgICAgc2VsZi5uZXRtYXNrLCBzZWxmLl9wcmVmaXhsZW4gPSBzZWxmLl9tYWtlX25ldG1hc2soCiAgICAgICAgICAgICAgICBzZWxmLl9tYXhfcHJlZml4bGVuKQogICAgICAgICAgICAjIGZpeG1lOiBhZGRyZXNzL25ldHdvcmsgdGVzdCBoZXJlLgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgaXNpbnN0YW5jZShhZGRyZXNzLCB0dXBsZSk6CiAgICAgICAgICAgIGlmIGxlbihhZGRyZXNzKSA+IDE6CiAgICAgICAgICAgICAgICBhcmcgPSBhZGRyZXNzWzFdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIFdlIHdlcmVuJ3QgZ2l2ZW4gYW4gYWRkcmVzc1sxXQogICAgICAgICAgICAgICAgYXJnID0gc2VsZi5fbWF4X3ByZWZpeGxlbgogICAgICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyA9IElQdjRBZGRyZXNzKGFkZHJlc3NbMF0pCiAgICAgICAgICAgIHNlbGYubmV0bWFzaywgc2VsZi5fcHJlZml4bGVuID0gc2VsZi5fbWFrZV9uZXRtYXNrKGFyZykKICAgICAgICAgICAgcGFja2VkID0gaW50KHNlbGYubmV0d29ya19hZGRyZXNzKQogICAgICAgICAgICBpZiBwYWNrZWQgJiBpbnQoc2VsZi5uZXRtYXNrKSAhPSBwYWNrZWQ6CiAgICAgICAgICAgICAgICBpZiBzdHJpY3Q6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignJXMgaGFzIGhvc3QgYml0cyBzZXQnICUgc2VsZikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXR3b3JrX2FkZHJlc3MgPSBJUHY0QWRkcmVzcyhwYWNrZWQgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KHNlbGYubmV0bWFzaykpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIEFzc3VtZSBpbnB1dCBhcmd1bWVudCB0byBiZSBzdHJpbmcgb3IgYW55IG9iamVjdCByZXByZXNlbnRhdGlvbgogICAgICAgICMgd2hpY2ggY29udmVydHMgaW50byBhIGZvcm1hdHRlZCBJUCBwcmVmaXggc3RyaW5nLgogICAgICAgIGFkZHIgPSBfc3BsaXRfb3B0aW9uYWxfbmV0bWFzayhhZGRyZXNzKQogICAgICAgIHNlbGYubmV0d29ya19hZGRyZXNzID0gSVB2NEFkZHJlc3Moc2VsZi5faXBfaW50X2Zyb21fc3RyaW5nKGFkZHJbMF0pKQoKICAgICAgICBpZiBsZW4oYWRkcikgPT0gMjoKICAgICAgICAgICAgYXJnID0gYWRkclsxXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFyZyA9IHNlbGYuX21heF9wcmVmaXhsZW4KICAgICAgICBzZWxmLm5ldG1hc2ssIHNlbGYuX3ByZWZpeGxlbiA9IHNlbGYuX21ha2VfbmV0bWFzayhhcmcpCgogICAgICAgIGlmIHN0cmljdDoKICAgICAgICAgICAgaWYgKElQdjRBZGRyZXNzKGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykgJiBpbnQoc2VsZi5uZXRtYXNrKSkgIT0KICAgICAgICAgICAgICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyk6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCclcyBoYXMgaG9zdCBiaXRzIHNldCcgJSBzZWxmKQogICAgICAgIHNlbGYubmV0d29ya19hZGRyZXNzID0gSVB2NEFkZHJlc3MoaW50KHNlbGYubmV0d29ya19hZGRyZXNzKSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQoc2VsZi5uZXRtYXNrKSkKCiAgICAgICAgaWYgc2VsZi5fcHJlZml4bGVuID09IChzZWxmLl9tYXhfcHJlZml4bGVuIC0gMSk6CiAgICAgICAgICAgIHNlbGYuaG9zdHMgPSBzZWxmLl9faXRlcl9fCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfZ2xvYmFsKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhpcyBhZGRyZXNzIGlzIGFsbG9jYXRlZCBmb3IgcHVibGljIG5ldHdvcmtzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgbm90IHJlc2VydmVkIHBlcgogICAgICAgICAgICBpYW5hLWlwdjQtc3BlY2lhbC1yZWdpc3RyeS4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIChub3QgKHNlbGYubmV0d29ya19hZGRyZXNzIGluIElQdjROZXR3b3JrKCcxMDAuNjQuMC4wLzEwJykgYW5kCiAgICAgICAgICAgICAgICBzZWxmLmJyb2FkY2FzdF9hZGRyZXNzIGluIElQdjROZXR3b3JrKCcxMDAuNjQuMC4wLzEwJykpIGFuZAogICAgICAgICAgICAgICAgbm90IHNlbGYuaXNfcHJpdmF0ZSkKCgpjbGFzcyBfSVB2NENvbnN0YW50cyhvYmplY3QpOgoKICAgIF9saW5rbG9jYWxfbmV0d29yayA9IElQdjROZXR3b3JrKCcxNjkuMjU0LjAuMC8xNicpCgogICAgX2xvb3BiYWNrX25ldHdvcmsgPSBJUHY0TmV0d29yaygnMTI3LjAuMC4wLzgnKQoKICAgIF9tdWx0aWNhc3RfbmV0d29yayA9IElQdjROZXR3b3JrKCcyMjQuMC4wLjAvNCcpCgogICAgX3B1YmxpY19uZXR3b3JrID0gSVB2NE5ldHdvcmsoJzEwMC42NC4wLjAvMTAnKQoKICAgIF9wcml2YXRlX25ldHdvcmtzID0gWwogICAgICAgIElQdjROZXR3b3JrKCcwLjAuMC4wLzgnKSwKICAgICAgICBJUHY0TmV0d29yaygnMTAuMC4wLjAvOCcpLAogICAgICAgIElQdjROZXR3b3JrKCcxMjcuMC4wLjAvOCcpLAogICAgICAgIElQdjROZXR3b3JrKCcxNjkuMjU0LjAuMC8xNicpLAogICAgICAgIElQdjROZXR3b3JrKCcxNzIuMTYuMC4wLzEyJyksCiAgICAgICAgSVB2NE5ldHdvcmsoJzE5Mi4wLjAuMC8yOScpLAogICAgICAgIElQdjROZXR3b3JrKCcxOTIuMC4wLjE3MC8zMScpLAogICAgICAgIElQdjROZXR3b3JrKCcxOTIuMC4yLjAvMjQnKSwKICAgICAgICBJUHY0TmV0d29yaygnMTkyLjE2OC4wLjAvMTYnKSwKICAgICAgICBJUHY0TmV0d29yaygnMTk4LjE4LjAuMC8xNScpLAogICAgICAgIElQdjROZXR3b3JrKCcxOTguNTEuMTAwLjAvMjQnKSwKICAgICAgICBJUHY0TmV0d29yaygnMjAzLjAuMTEzLjAvMjQnKSwKICAgICAgICBJUHY0TmV0d29yaygnMjQwLjAuMC4wLzQnKSwKICAgICAgICBJUHY0TmV0d29yaygnMjU1LjI1NS4yNTUuMjU1LzMyJyksCiAgICBdCgogICAgX3Jlc2VydmVkX25ldHdvcmsgPSBJUHY0TmV0d29yaygnMjQwLjAuMC4wLzQnKQoKICAgIF91bnNwZWNpZmllZF9hZGRyZXNzID0gSVB2NEFkZHJlc3MoJzAuMC4wLjAnKQoKCklQdjRBZGRyZXNzLl9jb25zdGFudHMgPSBfSVB2NENvbnN0YW50cwoKCmNsYXNzIF9CYXNlVjYob2JqZWN0KToKCiAgICAiIiJCYXNlIElQdjYgb2JqZWN0LgoKICAgIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCBieSBJUHY2IG9iamVjdHMgaW4gYm90aCBzaW5nbGUgSVAKICAgIGFkZHJlc3NlcyBhbmQgbmV0d29ya3MuCgogICAgIiIiCgogICAgX19zbG90c19fID0gKCkKICAgIF92ZXJzaW9uID0gNgogICAgX0FMTF9PTkVTID0gKDIgKiogSVBWNkxFTkdUSCkgLSAxCiAgICBfSEVYVEVUX0NPVU5UID0gOAogICAgX0hFWF9ESUdJVFMgPSBmcm96ZW5zZXQoJzAxMjM0NTY3ODlBQkNERUZhYmNkZWYnKQogICAgX21heF9wcmVmaXhsZW4gPSBJUFY2TEVOR1RICgogICAgIyBUaGVyZSBhcmUgb25seSBhIGJ1bmNoIG9mIHZhbGlkIHY2IG5ldG1hc2tzLCBzbyB3ZSBjYWNoZSB0aGVtIGFsbAogICAgIyB3aGVuIGNvbnN0cnVjdGVkIChzZWUgX21ha2VfbmV0bWFzaygpKS4KICAgIF9uZXRtYXNrX2NhY2hlID0ge30KCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfbWFrZV9uZXRtYXNrKGNscywgYXJnKToKICAgICAgICAiIiJNYWtlIGEgKG5ldG1hc2ssIHByZWZpeF9sZW4pIHR1cGxlIGZyb20gdGhlIGdpdmVuIGFyZ3VtZW50LgoKICAgICAgICBBcmd1bWVudCBjYW4gYmU6CiAgICAgICAgLSBhbiBpbnRlZ2VyICh0aGUgcHJlZml4IGxlbmd0aCkKICAgICAgICAtIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcHJlZml4IGxlbmd0aCAoZS5nLiAiMjQiKQogICAgICAgIC0gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwcmVmaXggbmV0bWFzayAoZS5nLiAiMjU1LjI1NS4yNTUuMCIpCiAgICAgICAgIiIiCiAgICAgICAgaWYgYXJnIG5vdCBpbiBjbHMuX25ldG1hc2tfY2FjaGU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnLCBfY29tcGF0X2ludF90eXBlcyk6CiAgICAgICAgICAgICAgICBwcmVmaXhsZW4gPSBhcmcKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByZWZpeGxlbiA9IGNscy5fcHJlZml4X2Zyb21fcHJlZml4X3N0cmluZyhhcmcpCiAgICAgICAgICAgIG5ldG1hc2sgPSBJUHY2QWRkcmVzcyhjbHMuX2lwX2ludF9mcm9tX3ByZWZpeChwcmVmaXhsZW4pKQogICAgICAgICAgICBjbHMuX25ldG1hc2tfY2FjaGVbYXJnXSA9IG5ldG1hc2ssIHByZWZpeGxlbgogICAgICAgIHJldHVybiBjbHMuX25ldG1hc2tfY2FjaGVbYXJnXQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9pcF9pbnRfZnJvbV9zdHJpbmcoY2xzLCBpcF9zdHIpOgogICAgICAgICIiIlR1cm4gYW4gSVB2NiBpcF9zdHIgaW50byBhbiBpbnRlZ2VyLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBpcF9zdHI6IEEgc3RyaW5nLCB0aGUgSVB2NiBpcF9zdHIuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEFuIGludCwgdGhlIElQdjYgYWRkcmVzcwoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIEFkZHJlc3NWYWx1ZUVycm9yOiBpZiBpcF9zdHIgaXNuJ3QgYSB2YWxpZCBJUHY2IEFkZHJlc3MuCgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBpcF9zdHI6CiAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKCdBZGRyZXNzIGNhbm5vdCBiZSBlbXB0eScpCgogICAgICAgIHBhcnRzID0gaXBfc3RyLnNwbGl0KCc6JykKCiAgICAgICAgIyBBbiBJUHY2IGFkZHJlc3MgbmVlZHMgYXQgbGVhc3QgMiBjb2xvbnMgKDMgcGFydHMpLgogICAgICAgIF9taW5fcGFydHMgPSAzCiAgICAgICAgaWYgbGVuKHBhcnRzKSA8IF9taW5fcGFydHM6CiAgICAgICAgICAgIG1zZyA9ICJBdCBsZWFzdCAlZCBwYXJ0cyBleHBlY3RlZCBpbiAlciIgJSAoX21pbl9wYXJ0cywgaXBfc3RyKQogICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcihtc2cpCgogICAgICAgICMgSWYgdGhlIGFkZHJlc3MgaGFzIGFuIElQdjQtc3R5bGUgc3VmZml4LCBjb252ZXJ0IGl0IHRvIGhleGFkZWNpbWFsLgogICAgICAgIGlmICcuJyBpbiBwYXJ0c1stMV06CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlwdjRfaW50ID0gSVB2NEFkZHJlc3MocGFydHMucG9wKCkpLl9pcAogICAgICAgICAgICBleGNlcHQgQWRkcmVzc1ZhbHVlRXJyb3IgYXMgZXhjOgogICAgICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IoIiVzIGluICVyIiAlIChleGMsIGlwX3N0cikpCiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgnJXgnICUgKChpcHY0X2ludCA+PiAxNikgJiAweEZGRkYpKQogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoJyV4JyAlIChpcHY0X2ludCAmIDB4RkZGRikpCgogICAgICAgICMgQW4gSVB2NiBhZGRyZXNzIGNhbid0IGhhdmUgbW9yZSB0aGFuIDggY29sb25zICg5IHBhcnRzKS4KICAgICAgICAjIFRoZSBleHRyYSBjb2xvbiBjb21lcyBmcm9tIHVzaW5nIHRoZSAiOjoiIG5vdGF0aW9uIGZvciBhIHNpbmdsZQogICAgICAgICMgbGVhZGluZyBvciB0cmFpbGluZyB6ZXJvIHBhcnQuCiAgICAgICAgX21heF9wYXJ0cyA9IGNscy5fSEVYVEVUX0NPVU5UICsgMQogICAgICAgIGlmIGxlbihwYXJ0cykgPiBfbWF4X3BhcnRzOgogICAgICAgICAgICBtc2cgPSAiQXQgbW9zdCAlZCBjb2xvbnMgcGVybWl0dGVkIGluICVyIiAlICgKICAgICAgICAgICAgICAgIF9tYXhfcGFydHMgLSAxLCBpcF9zdHIpCiAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKG1zZykKCiAgICAgICAgIyBEaXNyZWdhcmRpbmcgdGhlIGVuZHBvaW50cywgZmluZCAnOjonIHdpdGggbm90aGluZyBpbiBiZXR3ZWVuLgogICAgICAgICMgVGhpcyBpbmRpY2F0ZXMgdGhhdCBhIHJ1biBvZiB6ZXJvZXMgaGFzIGJlZW4gc2tpcHBlZC4KICAgICAgICBza2lwX2luZGV4ID0gTm9uZQogICAgICAgIGZvciBpIGluIF9jb21wYXRfcmFuZ2UoMSwgbGVuKHBhcnRzKSAtIDEpOgogICAgICAgICAgICBpZiBub3QgcGFydHNbaV06CiAgICAgICAgICAgICAgICBpZiBza2lwX2luZGV4IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICMgQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gb25lICc6OicKICAgICAgICAgICAgICAgICAgICBtc2cgPSAiQXQgbW9zdCBvbmUgJzo6JyBwZXJtaXR0ZWQgaW4gJXIiICUgaXBfc3RyCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IobXNnKQogICAgICAgICAgICAgICAgc2tpcF9pbmRleCA9IGkKCiAgICAgICAgIyBwYXJ0c19oaSBpcyB0aGUgbnVtYmVyIG9mIHBhcnRzIHRvIGNvcHkgZnJvbSBhYm92ZS9iZWZvcmUgdGhlICc6OicKICAgICAgICAjIHBhcnRzX2xvIGlzIHRoZSBudW1iZXIgb2YgcGFydHMgdG8gY29weSBmcm9tIGJlbG93L2FmdGVyIHRoZSAnOjonCiAgICAgICAgaWYgc2tpcF9pbmRleCBpcyBub3QgTm9uZToKICAgICAgICAgICAgIyBJZiB3ZSBmb3VuZCBhICc6OicsIHRoZW4gY2hlY2sgaWYgaXQgYWxzbyBjb3ZlcnMgdGhlIGVuZHBvaW50cy4KICAgICAgICAgICAgcGFydHNfaGkgPSBza2lwX2luZGV4CiAgICAgICAgICAgIHBhcnRzX2xvID0gbGVuKHBhcnRzKSAtIHNraXBfaW5kZXggLSAxCiAgICAgICAgICAgIGlmIG5vdCBwYXJ0c1swXToKICAgICAgICAgICAgICAgIHBhcnRzX2hpIC09IDEKICAgICAgICAgICAgICAgIGlmIHBhcnRzX2hpOgogICAgICAgICAgICAgICAgICAgIG1zZyA9ICJMZWFkaW5nICc6JyBvbmx5IHBlcm1pdHRlZCBhcyBwYXJ0IG9mICc6OicgaW4gJXIiCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IobXNnICUgaXBfc3RyKSAgIyBeOiByZXF1aXJlcyBeOjoKICAgICAgICAgICAgaWYgbm90IHBhcnRzWy0xXToKICAgICAgICAgICAgICAgIHBhcnRzX2xvIC09IDEKICAgICAgICAgICAgICAgIGlmIHBhcnRzX2xvOgogICAgICAgICAgICAgICAgICAgIG1zZyA9ICJUcmFpbGluZyAnOicgb25seSBwZXJtaXR0ZWQgYXMgcGFydCBvZiAnOjonIGluICVyIgogICAgICAgICAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKG1zZyAlIGlwX3N0cikgICMgOiQgcmVxdWlyZXMgOjokCiAgICAgICAgICAgIHBhcnRzX3NraXBwZWQgPSBjbHMuX0hFWFRFVF9DT1VOVCAtIChwYXJ0c19oaSArIHBhcnRzX2xvKQogICAgICAgICAgICBpZiBwYXJ0c19za2lwcGVkIDwgMToKICAgICAgICAgICAgICAgIG1zZyA9ICJFeHBlY3RlZCBhdCBtb3N0ICVkIG90aGVyIHBhcnRzIHdpdGggJzo6JyBpbiAlciIKICAgICAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKG1zZyAlIChjbHMuX0hFWFRFVF9DT1VOVCAtIDEsIGlwX3N0cikpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBPdGhlcndpc2UsIGFsbG9jYXRlIHRoZSBlbnRpcmUgYWRkcmVzcyB0byBwYXJ0c19oaS4gIFRoZQogICAgICAgICAgICAjIGVuZHBvaW50cyBjb3VsZCBzdGlsbCBiZSBlbXB0eSwgYnV0IF9wYXJzZV9oZXh0ZXQoKSB3aWxsIGNoZWNrCiAgICAgICAgICAgICMgZm9yIHRoYXQuCiAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgIT0gY2xzLl9IRVhURVRfQ09VTlQ6CiAgICAgICAgICAgICAgICBtc2cgPSAiRXhhY3RseSAlZCBwYXJ0cyBleHBlY3RlZCB3aXRob3V0ICc6OicgaW4gJXIiCiAgICAgICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcihtc2cgJSAoY2xzLl9IRVhURVRfQ09VTlQsIGlwX3N0cikpCiAgICAgICAgICAgIGlmIG5vdCBwYXJ0c1swXToKICAgICAgICAgICAgICAgIG1zZyA9ICJMZWFkaW5nICc6JyBvbmx5IHBlcm1pdHRlZCBhcyBwYXJ0IG9mICc6OicgaW4gJXIiCiAgICAgICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcihtc2cgJSBpcF9zdHIpICAjIF46IHJlcXVpcmVzIF46OgogICAgICAgICAgICBpZiBub3QgcGFydHNbLTFdOgogICAgICAgICAgICAgICAgbXNnID0gIlRyYWlsaW5nICc6JyBvbmx5IHBlcm1pdHRlZCBhcyBwYXJ0IG9mICc6OicgaW4gJXIiCiAgICAgICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcihtc2cgJSBpcF9zdHIpICAjIDokIHJlcXVpcmVzIDo6JAogICAgICAgICAgICBwYXJ0c19oaSA9IGxlbihwYXJ0cykKICAgICAgICAgICAgcGFydHNfbG8gPSAwCiAgICAgICAgICAgIHBhcnRzX3NraXBwZWQgPSAwCgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBOb3csIHBhcnNlIHRoZSBoZXh0ZXRzIGludG8gYSAxMjgtYml0IGludGVnZXIuCiAgICAgICAgICAgIGlwX2ludCA9IDAKICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UocGFydHNfaGkpOgogICAgICAgICAgICAgICAgaXBfaW50IDw8PSAxNgogICAgICAgICAgICAgICAgaXBfaW50IHw9IGNscy5fcGFyc2VfaGV4dGV0KHBhcnRzW2ldKQogICAgICAgICAgICBpcF9pbnQgPDw9IDE2ICogcGFydHNfc2tpcHBlZAogICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgtcGFydHNfbG8sIDApOgogICAgICAgICAgICAgICAgaXBfaW50IDw8PSAxNgogICAgICAgICAgICAgICAgaXBfaW50IHw9IGNscy5fcGFyc2VfaGV4dGV0KHBhcnRzW2ldKQogICAgICAgICAgICByZXR1cm4gaXBfaW50CiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZXhjOgogICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcigiJXMgaW4gJXIiICUgKGV4YywgaXBfc3RyKSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2VfaGV4dGV0KGNscywgaGV4dGV0X3N0cik6CiAgICAgICAgIiIiQ29udmVydCBhbiBJUHY2IGhleHRldCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBoZXh0ZXRfc3RyOiBBIHN0cmluZywgdGhlIG51bWJlciB0byBwYXJzZS4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgVGhlIGhleHRldCBhcyBhbiBpbnRlZ2VyLgoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIFZhbHVlRXJyb3I6IGlmIHRoZSBpbnB1dCBpc24ndCBzdHJpY3RseSBhIGhleCBudW1iZXIgZnJvbQogICAgICAgICAgICAgIFswLi5GRkZGXS4KCiAgICAgICAgIiIiCiAgICAgICAgIyBXaGl0ZWxpc3QgdGhlIGNoYXJhY3RlcnMsIHNpbmNlIGludCgpIGFsbG93cyBhIGxvdCBvZiBiaXphcnJlIHN0dWZmLgogICAgICAgIGlmIG5vdCBjbHMuX0hFWF9ESUdJVFMuaXNzdXBlcnNldChoZXh0ZXRfc3RyKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiT25seSBoZXggZGlnaXRzIHBlcm1pdHRlZCBpbiAlciIgJSBoZXh0ZXRfc3RyKQogICAgICAgICMgV2UgZG8gdGhlIGxlbmd0aCBjaGVjayBzZWNvbmQsIHNpbmNlIHRoZSBpbnZhbGlkIGNoYXJhY3RlciBlcnJvcgogICAgICAgICMgaXMgbGlrZWx5IHRvIGJlIG1vcmUgaW5mb3JtYXRpdmUgZm9yIHRoZSB1c2VyCiAgICAgICAgaWYgbGVuKGhleHRldF9zdHIpID4gNDoKICAgICAgICAgICAgbXNnID0gIkF0IG1vc3QgNCBjaGFyYWN0ZXJzIHBlcm1pdHRlZCBpbiAlciIKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2cgJSBoZXh0ZXRfc3RyKQogICAgICAgICMgTGVuZ3RoIGNoZWNrIG1lYW5zIHdlIGNhbiBza2lwIGNoZWNraW5nIHRoZSBpbnRlZ2VyIHZhbHVlCiAgICAgICAgcmV0dXJuIGludChoZXh0ZXRfc3RyLCAxNikKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfY29tcHJlc3NfaGV4dGV0cyhjbHMsIGhleHRldHMpOgogICAgICAgICIiIkNvbXByZXNzZXMgYSBsaXN0IG9mIGhleHRldHMuCgogICAgICAgIENvbXByZXNzZXMgYSBsaXN0IG9mIHN0cmluZ3MsIHJlcGxhY2luZyB0aGUgbG9uZ2VzdCBjb250aW51b3VzCiAgICAgICAgc2VxdWVuY2Ugb2YgIjAiIGluIHRoZSBsaXN0IHdpdGggIiIgYW5kIGFkZGluZyBlbXB0eSBzdHJpbmdzIGF0CiAgICAgICAgdGhlIGJlZ2lubmluZyBvciBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgc3VjaCB0aGF0IHN1YnNlcXVlbnRseQogICAgICAgIGNhbGxpbmcgIjoiLmpvaW4oaGV4dGV0cykgd2lsbCBwcm9kdWNlIHRoZSBjb21wcmVzc2VkIHZlcnNpb24gb2YKICAgICAgICB0aGUgSVB2NiBhZGRyZXNzLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBoZXh0ZXRzOiBBIGxpc3Qgb2Ygc3RyaW5ncywgdGhlIGhleHRldHMgdG8gY29tcHJlc3MuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgbGlzdCBvZiBzdHJpbmdzLgoKICAgICAgICAiIiIKICAgICAgICBiZXN0X2RvdWJsZWNvbG9uX3N0YXJ0ID0gLTEKICAgICAgICBiZXN0X2RvdWJsZWNvbG9uX2xlbiA9IDAKICAgICAgICBkb3VibGVjb2xvbl9zdGFydCA9IC0xCiAgICAgICAgZG91YmxlY29sb25fbGVuID0gMAogICAgICAgIGZvciBpbmRleCwgaGV4dGV0IGluIGVudW1lcmF0ZShoZXh0ZXRzKToKICAgICAgICAgICAgaWYgaGV4dGV0ID09ICcwJzoKICAgICAgICAgICAgICAgIGRvdWJsZWNvbG9uX2xlbiArPSAxCiAgICAgICAgICAgICAgICBpZiBkb3VibGVjb2xvbl9zdGFydCA9PSAtMToKICAgICAgICAgICAgICAgICAgICAjIFN0YXJ0IG9mIGEgc2VxdWVuY2Ugb2YgemVyb3MuCiAgICAgICAgICAgICAgICAgICAgZG91YmxlY29sb25fc3RhcnQgPSBpbmRleAogICAgICAgICAgICAgICAgaWYgZG91YmxlY29sb25fbGVuID4gYmVzdF9kb3VibGVjb2xvbl9sZW46CiAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIHRoZSBsb25nZXN0IHNlcXVlbmNlIG9mIHplcm9zIHNvIGZhci4KICAgICAgICAgICAgICAgICAgICBiZXN0X2RvdWJsZWNvbG9uX2xlbiA9IGRvdWJsZWNvbG9uX2xlbgogICAgICAgICAgICAgICAgICAgIGJlc3RfZG91YmxlY29sb25fc3RhcnQgPSBkb3VibGVjb2xvbl9zdGFydAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZG91YmxlY29sb25fbGVuID0gMAogICAgICAgICAgICAgICAgZG91YmxlY29sb25fc3RhcnQgPSAtMQoKICAgICAgICBpZiBiZXN0X2RvdWJsZWNvbG9uX2xlbiA+IDE6CiAgICAgICAgICAgIGJlc3RfZG91YmxlY29sb25fZW5kID0gKGJlc3RfZG91YmxlY29sb25fc3RhcnQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X2RvdWJsZWNvbG9uX2xlbikKICAgICAgICAgICAgIyBGb3IgemVyb3MgYXQgdGhlIGVuZCBvZiB0aGUgYWRkcmVzcy4KICAgICAgICAgICAgaWYgYmVzdF9kb3VibGVjb2xvbl9lbmQgPT0gbGVuKGhleHRldHMpOgogICAgICAgICAgICAgICAgaGV4dGV0cyArPSBbJyddCiAgICAgICAgICAgIGhleHRldHNbYmVzdF9kb3VibGVjb2xvbl9zdGFydDpiZXN0X2RvdWJsZWNvbG9uX2VuZF0gPSBbJyddCiAgICAgICAgICAgICMgRm9yIHplcm9zIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFkZHJlc3MuCiAgICAgICAgICAgIGlmIGJlc3RfZG91YmxlY29sb25fc3RhcnQgPT0gMDoKICAgICAgICAgICAgICAgIGhleHRldHMgPSBbJyddICsgaGV4dGV0cwoKICAgICAgICByZXR1cm4gaGV4dGV0cwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9zdHJpbmdfZnJvbV9pcF9pbnQoY2xzLCBpcF9pbnQ9Tm9uZSk6CiAgICAgICAgIiIiVHVybnMgYSAxMjgtYml0IGludGVnZXIgaW50byBoZXhhZGVjaW1hbCBub3RhdGlvbi4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgaXBfaW50OiBBbiBpbnRlZ2VyLCB0aGUgSVAgYWRkcmVzcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBzdHJpbmcsIHRoZSBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWRkcmVzcy4KCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBWYWx1ZUVycm9yOiBUaGUgYWRkcmVzcyBpcyBiaWdnZXIgdGhhbiAxMjggYml0cyBvZiBhbGwgb25lcy4KCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXBfaW50IGlzIE5vbmU6CiAgICAgICAgICAgIGlwX2ludCA9IGludChjbHMuX2lwKQoKICAgICAgICBpZiBpcF9pbnQgPiBjbHMuX0FMTF9PTkVTOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdJUHY2IGFkZHJlc3MgaXMgdG9vIGxhcmdlJykKCiAgICAgICAgaGV4X3N0ciA9ICclMDMyeCcgJSBpcF9pbnQKICAgICAgICBoZXh0ZXRzID0gWycleCcgJSBpbnQoaGV4X3N0clt4OnggKyA0XSwgMTYpIGZvciB4IGluIHJhbmdlKDAsIDMyLCA0KV0KCiAgICAgICAgaGV4dGV0cyA9IGNscy5fY29tcHJlc3NfaGV4dGV0cyhoZXh0ZXRzKQogICAgICAgIHJldHVybiAnOicuam9pbihoZXh0ZXRzKQoKICAgIGRlZiBfZXhwbG9kZV9zaG9ydGhhbmRfaXBfc3RyaW5nKHNlbGYpOgogICAgICAgICIiIkV4cGFuZCBhIHNob3J0ZW5lZCBJUHY2IGFkZHJlc3MuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGlwX3N0cjogQSBzdHJpbmcsIHRoZSBJUHY2IGFkZHJlc3MuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgc3RyaW5nLCB0aGUgZXhwYW5kZWQgSVB2NiBhZGRyZXNzLgoKICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYsIElQdjZOZXR3b3JrKToKICAgICAgICAgICAgaXBfc3RyID0gX2NvbXBhdF9zdHIoc2VsZi5uZXR3b3JrX2FkZHJlc3MpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKHNlbGYsIElQdjZJbnRlcmZhY2UpOgogICAgICAgICAgICBpcF9zdHIgPSBfY29tcGF0X3N0cihzZWxmLmlwKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlwX3N0ciA9IF9jb21wYXRfc3RyKHNlbGYpCgogICAgICAgIGlwX2ludCA9IHNlbGYuX2lwX2ludF9mcm9tX3N0cmluZyhpcF9zdHIpCiAgICAgICAgaGV4X3N0ciA9ICclMDMyeCcgJSBpcF9pbnQKICAgICAgICBwYXJ0cyA9IFtoZXhfc3RyW3g6eCArIDRdIGZvciB4IGluIHJhbmdlKDAsIDMyLCA0KV0KICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYsIChfQmFzZU5ldHdvcmssIElQdjZJbnRlcmZhY2UpKToKICAgICAgICAgICAgcmV0dXJuICclcy8lZCcgJSAoJzonLmpvaW4ocGFydHMpLCBzZWxmLl9wcmVmaXhsZW4pCiAgICAgICAgcmV0dXJuICc6Jy5qb2luKHBhcnRzKQoKICAgIGRlZiBfcmV2ZXJzZV9wb2ludGVyKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgcmV2ZXJzZSBETlMgcG9pbnRlciBuYW1lIGZvciB0aGUgSVB2NiBhZGRyZXNzLgoKICAgICAgICBUaGlzIGltcGxlbWVudHMgdGhlIG1ldGhvZCBkZXNjcmliZWQgaW4gUkZDMzU5NiAyLjUuCgogICAgICAgICIiIgogICAgICAgIHJldmVyc2VfY2hhcnMgPSBzZWxmLmV4cGxvZGVkWzo6LTFdLnJlcGxhY2UoJzonLCAnJykKICAgICAgICByZXR1cm4gJy4nLmpvaW4ocmV2ZXJzZV9jaGFycykgKyAnLmlwNi5hcnBhJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG1heF9wcmVmaXhsZW4oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX21heF9wcmVmaXhsZW4KCiAgICBAcHJvcGVydHkKICAgIGRlZiB2ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCgoKY2xhc3MgSVB2NkFkZHJlc3MoX0Jhc2VWNiwgX0Jhc2VBZGRyZXNzKToKCiAgICAiIiJSZXByZXNlbnQgYW5kIG1hbmlwdWxhdGUgc2luZ2xlIElQdjYgQWRkcmVzc2VzLiIiIgoKICAgIF9fc2xvdHNfXyA9ICgnX2lwJywgJ19fd2Vha3JlZl9fJykKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkcmVzcyk6CiAgICAgICAgIiIiSW5zdGFudGlhdGUgYSBuZXcgSVB2NiBhZGRyZXNzIG9iamVjdC4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgYWRkcmVzczogQSBzdHJpbmcgb3IgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIElQCgogICAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgYW4gaW50ZWdlciBjYW4gYmUgcGFzc2VkLCBzbwogICAgICAgICAgICAgIElQdjZBZGRyZXNzKCcyMDAxOmRiODo6JykgPT0KICAgICAgICAgICAgICAgIElQdjZBZGRyZXNzKDQyNTQwNzY2NDExMjgyNTkyODU2OTAzOTg0OTUxNjUzODI2NTYwKQogICAgICAgICAgICAgIG9yLCBtb3JlIGdlbmVyYWxseQogICAgICAgICAgICAgIElQdjZBZGRyZXNzKGludChJUHY2QWRkcmVzcygnMjAwMTpkYjg6OicpKSkgPT0KICAgICAgICAgICAgICAgIElQdjZBZGRyZXNzKCcyMDAxOmRiODo6JykKCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBBZGRyZXNzVmFsdWVFcnJvcjogSWYgYWRkcmVzcyBpc24ndCBhIHZhbGlkIElQdjYgYWRkcmVzcy4KCiAgICAgICAgIiIiCiAgICAgICAgIyBFZmZpY2llbnQgY29uc3RydWN0b3IgZnJvbSBpbnRlZ2VyLgogICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgX2NvbXBhdF9pbnRfdHlwZXMpOgogICAgICAgICAgICBzZWxmLl9jaGVja19pbnRfYWRkcmVzcyhhZGRyZXNzKQogICAgICAgICAgICBzZWxmLl9pcCA9IGFkZHJlc3MKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgQ29uc3RydWN0aW5nIGZyb20gYSBwYWNrZWQgYWRkcmVzcwogICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgYnl0ZXMpOgogICAgICAgICAgICBzZWxmLl9jaGVja19wYWNrZWRfYWRkcmVzcyhhZGRyZXNzLCAxNikKICAgICAgICAgICAgYnZzID0gX2NvbXBhdF9ieXRlc190b19ieXRlX3ZhbHMoYWRkcmVzcykKICAgICAgICAgICAgc2VsZi5faXAgPSBfY29tcGF0X2ludF9mcm9tX2J5dGVfdmFscyhidnMsICdiaWcnKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBBc3N1bWUgaW5wdXQgYXJndW1lbnQgdG8gYmUgc3RyaW5nIG9yIGFueSBvYmplY3QgcmVwcmVzZW50YXRpb24KICAgICAgICAjIHdoaWNoIGNvbnZlcnRzIGludG8gYSBmb3JtYXR0ZWQgSVAgc3RyaW5nLgogICAgICAgIGFkZHJfc3RyID0gX2NvbXBhdF9zdHIoYWRkcmVzcykKICAgICAgICBpZiAnLycgaW4gYWRkcl9zdHI6CiAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKCJVbmV4cGVjdGVkICcvJyBpbiAlciIgJSBhZGRyZXNzKQogICAgICAgIHNlbGYuX2lwID0gc2VsZi5faXBfaW50X2Zyb21fc3RyaW5nKGFkZHJfc3RyKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhY2tlZChzZWxmKToKICAgICAgICAiIiJUaGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgYWRkcmVzcy4iIiIKICAgICAgICByZXR1cm4gdjZfaW50X3RvX3BhY2tlZChzZWxmLl9pcCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19tdWx0aWNhc3Qoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyByZXNlcnZlZCBmb3IgbXVsdGljYXN0IHVzZS4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgbXVsdGljYXN0IGFkZHJlc3MuCiAgICAgICAgICAgIFNlZSBSRkMgMjM3MyAyLjcgZm9yIGRldGFpbHMuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmIGluIHNlbGYuX2NvbnN0YW50cy5fbXVsdGljYXN0X25ldHdvcmsKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19yZXNlcnZlZChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIG90aGVyd2lzZSBJRVRGIHJlc2VydmVkLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgd2l0aGluIG9uZSBvZiB0aGUKICAgICAgICAgICAgcmVzZXJ2ZWQgSVB2NiBOZXR3b3JrIHJhbmdlcy4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGFueShzZWxmIGluIHggZm9yIHggaW4gc2VsZi5fY29uc3RhbnRzLl9yZXNlcnZlZF9uZXR3b3JrcykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19saW5rX2xvY2FsKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgZm9yIGxpbmstbG9jYWwuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyByZXNlcnZlZCBwZXIgUkZDIDQyOTEuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmIGluIHNlbGYuX2NvbnN0YW50cy5fbGlua2xvY2FsX25ldHdvcmsKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19zaXRlX2xvY2FsKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgZm9yIHNpdGUtbG9jYWwuCgogICAgICAgIE5vdGUgdGhhdCB0aGUgc2l0ZS1sb2NhbCBhZGRyZXNzIHNwYWNlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYnkgUkZDIDM4NzkuCiAgICAgICAgVXNlIGlzX3ByaXZhdGUgdG8gdGVzdCBpZiB0aGlzIGFkZHJlc3MgaXMgaW4gdGhlIHNwYWNlIG9mIHVuaXF1ZSBsb2NhbAogICAgICAgIGFkZHJlc3NlcyBhcyBkZWZpbmVkIGJ5IFJGQyA0MTkzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgcGVyIFJGQyAzNTEzIDIuNS42LgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZiBpbiBzZWxmLl9jb25zdGFudHMuX3NpdGVsb2NhbF9uZXR3b3JrCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJpdmF0ZShzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoaXMgYWRkcmVzcyBpcyBhbGxvY2F0ZWQgZm9yIHByaXZhdGUgbmV0d29ya3MuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyByZXNlcnZlZCBwZXIKICAgICAgICAgICAgaWFuYS1pcHY2LXNwZWNpYWwtcmVnaXN0cnkuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBhbnkoc2VsZiBpbiBuZXQgZm9yIG5ldCBpbiBzZWxmLl9jb25zdGFudHMuX3ByaXZhdGVfbmV0d29ya3MpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfZ2xvYmFsKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhpcyBhZGRyZXNzIGlzIGFsbG9jYXRlZCBmb3IgcHVibGljIG5ldHdvcmtzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgbm90IHJlc2VydmVkIHBlcgogICAgICAgICAgICBpYW5hLWlwdjYtc3BlY2lhbC1yZWdpc3RyeS4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLmlzX3ByaXZhdGUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc191bnNwZWNpZmllZChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIHVuc3BlY2lmaWVkLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhpcyBpcyB0aGUgdW5zcGVjaWZpZWQgYWRkcmVzcyBhcyBkZWZpbmVkIGluCiAgICAgICAgICAgIFJGQyAyMzczIDIuNS4yLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5faXAgPT0gMAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2xvb3BiYWNrKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgYSBsb29wYmFjayBhZGRyZXNzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSBsb29wYmFjayBhZGRyZXNzIGFzIGRlZmluZWQgaW4KICAgICAgICAgICAgUkZDIDIzNzMgMi41LjMuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9pcCA9PSAxCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXB2NF9tYXBwZWQoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBJUHY0IG1hcHBlZCBhZGRyZXNzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBJZiB0aGUgSVB2NiBhZGRyZXNzIGlzIGEgdjQgbWFwcGVkIGFkZHJlc3MsIHJldHVybiB0aGUKICAgICAgICAgICAgSVB2NCBtYXBwZWQgYWRkcmVzcy4gUmV0dXJuIE5vbmUgb3RoZXJ3aXNlLgoKICAgICAgICAiIiIKICAgICAgICBpZiAoc2VsZi5faXAgPj4gMzIpICE9IDB4RkZGRjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gSVB2NEFkZHJlc3Moc2VsZi5faXAgJiAweEZGRkZGRkZGKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHRlcmVkbyhzZWxmKToKICAgICAgICAiIiJUdXBsZSBvZiBlbWJlZGRlZCB0ZXJlZG8gSVBzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBUdXBsZSBvZiB0aGUgKHNlcnZlciwgY2xpZW50KSBJUHMgb3IgTm9uZSBpZiB0aGUgYWRkcmVzcwogICAgICAgICAgICBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHRlcmVkbyBhZGRyZXNzIChkb2Vzbid0IHN0YXJ0IHdpdGgKICAgICAgICAgICAgMjAwMTo6LzMyKQoKICAgICAgICAiIiIKICAgICAgICBpZiAoc2VsZi5faXAgPj4gOTYpICE9IDB4MjAwMTAwMDA6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIChJUHY0QWRkcmVzcygoc2VsZi5faXAgPj4gNjQpICYgMHhGRkZGRkZGRiksCiAgICAgICAgICAgICAgICBJUHY0QWRkcmVzcyh+c2VsZi5faXAgJiAweEZGRkZGRkZGKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzaXh0b2ZvdXIoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBJUHY0IDZ0bzQgZW1iZWRkZWQgYWRkcmVzcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgVGhlIElQdjQgNnRvNC1lbWJlZGRlZCBhZGRyZXNzIGlmIHByZXNlbnQgb3IgTm9uZSBpZiB0aGUKICAgICAgICAgICAgYWRkcmVzcyBkb2Vzbid0IGFwcGVhciB0byBjb250YWluIGEgNnRvNCBlbWJlZGRlZCBhZGRyZXNzLgoKICAgICAgICAiIiIKICAgICAgICBpZiAoc2VsZi5faXAgPj4gMTEyKSAhPSAweDIwMDI6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIElQdjRBZGRyZXNzKChzZWxmLl9pcCA+PiA4MCkgJiAweEZGRkZGRkZGKQoKCmNsYXNzIElQdjZJbnRlcmZhY2UoSVB2NkFkZHJlc3MpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzKToKICAgICAgICBpZiBpc2luc3RhbmNlKGFkZHJlc3MsIChieXRlcywgX2NvbXBhdF9pbnRfdHlwZXMpKToKICAgICAgICAgICAgSVB2NkFkZHJlc3MuX19pbml0X18oc2VsZiwgYWRkcmVzcykKICAgICAgICAgICAgc2VsZi5uZXR3b3JrID0gSVB2Nk5ldHdvcmsoc2VsZi5faXApCiAgICAgICAgICAgIHNlbGYuX3ByZWZpeGxlbiA9IHNlbGYuX21heF9wcmVmaXhsZW4KICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgaXNpbnN0YW5jZShhZGRyZXNzLCB0dXBsZSk6CiAgICAgICAgICAgIElQdjZBZGRyZXNzLl9faW5pdF9fKHNlbGYsIGFkZHJlc3NbMF0pCiAgICAgICAgICAgIGlmIGxlbihhZGRyZXNzKSA+IDE6CiAgICAgICAgICAgICAgICBzZWxmLl9wcmVmaXhsZW4gPSBpbnQoYWRkcmVzc1sxXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX3ByZWZpeGxlbiA9IHNlbGYuX21heF9wcmVmaXhsZW4KICAgICAgICAgICAgc2VsZi5uZXR3b3JrID0gSVB2Nk5ldHdvcmsoYWRkcmVzcywgc3RyaWN0PUZhbHNlKQogICAgICAgICAgICBzZWxmLm5ldG1hc2sgPSBzZWxmLm5ldHdvcmsubmV0bWFzawogICAgICAgICAgICBzZWxmLmhvc3RtYXNrID0gc2VsZi5uZXR3b3JrLmhvc3RtYXNrCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBhZGRyID0gX3NwbGl0X29wdGlvbmFsX25ldG1hc2soYWRkcmVzcykKICAgICAgICBJUHY2QWRkcmVzcy5fX2luaXRfXyhzZWxmLCBhZGRyWzBdKQogICAgICAgIHNlbGYubmV0d29yayA9IElQdjZOZXR3b3JrKGFkZHJlc3MsIHN0cmljdD1GYWxzZSkKICAgICAgICBzZWxmLm5ldG1hc2sgPSBzZWxmLm5ldHdvcmsubmV0bWFzawogICAgICAgIHNlbGYuX3ByZWZpeGxlbiA9IHNlbGYubmV0d29yay5fcHJlZml4bGVuCiAgICAgICAgc2VsZi5ob3N0bWFzayA9IHNlbGYubmV0d29yay5ob3N0bWFzawoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMvJWQnICUgKHNlbGYuX3N0cmluZ19mcm9tX2lwX2ludChzZWxmLl9pcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXR3b3JrLnByZWZpeGxlbikKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBhZGRyZXNzX2VxdWFsID0gSVB2NkFkZHJlc3MuX19lcV9fKHNlbGYsIG90aGVyKQogICAgICAgIGlmIG5vdCBhZGRyZXNzX2VxdWFsIG9yIGFkZHJlc3NfZXF1YWwgaXMgTm90SW1wbGVtZW50ZWQ6CiAgICAgICAgICAgIHJldHVybiBhZGRyZXNzX2VxdWFsCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5uZXR3b3JrID09IG90aGVyLm5ldHdvcmsKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICMgQW4gaW50ZXJmYWNlIHdpdGggYW4gYXNzb2NpYXRlZCBuZXR3b3JrIGlzIE5PVCB0aGUKICAgICAgICAgICAgIyBzYW1lIGFzIGFuIHVuYXNzb2NpYXRlZCBhZGRyZXNzLiBUaGF0J3Mgd2h5IHRoZSBoYXNoCiAgICAgICAgICAgICMgdGFrZXMgdGhlIGV4dHJhIGluZm8gaW50byBhY2NvdW50LgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICBhZGRyZXNzX2xlc3MgPSBJUHY2QWRkcmVzcy5fX2x0X18oc2VsZiwgb3RoZXIpCiAgICAgICAgaWYgYWRkcmVzc19sZXNzIGlzIE5vdEltcGxlbWVudGVkOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5ldHdvcmsgPCBvdGhlci5uZXR3b3JrCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAjIFdlICpkbyogYWxsb3cgYWRkcmVzc2VzIGFuZCBpbnRlcmZhY2VzIHRvIGJlIHNvcnRlZC4gVGhlCiAgICAgICAgICAgICMgdW5hc3NvY2lhdGVkIGFkZHJlc3MgaXMgY29uc2lkZXJlZCBsZXNzIHRoYW4gYWxsIGludGVyZmFjZXMuCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5faXAgXiBzZWxmLl9wcmVmaXhsZW4gXiBpbnQoc2VsZi5uZXR3b3JrLm5ldHdvcmtfYWRkcmVzcykKCiAgICBfX3JlZHVjZV9fID0gX0lQQWRkcmVzc0Jhc2UuX19yZWR1Y2VfXwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlwKHNlbGYpOgogICAgICAgIHJldHVybiBJUHY2QWRkcmVzcyhzZWxmLl9pcCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB3aXRoX3ByZWZpeGxlbihzZWxmKToKICAgICAgICByZXR1cm4gJyVzLyVzJyAlIChzZWxmLl9zdHJpbmdfZnJvbV9pcF9pbnQoc2VsZi5faXApLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3ByZWZpeGxlbikKCiAgICBAcHJvcGVydHkKICAgIGRlZiB3aXRoX25ldG1hc2soc2VsZik6CiAgICAgICAgcmV0dXJuICclcy8lcycgJSAoc2VsZi5fc3RyaW5nX2Zyb21faXBfaW50KHNlbGYuX2lwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5ldG1hc2spCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2l0aF9ob3N0bWFzayhzZWxmKToKICAgICAgICByZXR1cm4gJyVzLyVzJyAlIChzZWxmLl9zdHJpbmdfZnJvbV9pcF9pbnQoc2VsZi5faXApLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaG9zdG1hc2spCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfdW5zcGVjaWZpZWQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2lwID09IDAgYW5kIHNlbGYubmV0d29yay5pc191bnNwZWNpZmllZAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2xvb3BiYWNrKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9pcCA9PSAxIGFuZCBzZWxmLm5ldHdvcmsuaXNfbG9vcGJhY2sKCgpjbGFzcyBJUHY2TmV0d29yayhfQmFzZVY2LCBfQmFzZU5ldHdvcmspOgoKICAgICIiIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbmQgbWFuaXB1bGF0ZXMgMTI4LWJpdCBJUHY2IG5ldHdvcmtzLgoKICAgIEF0dHJpYnV0ZXM6IFtleGFtcGxlcyBmb3IgSVB2NignMjAwMTpkYjg6OjEwMDAvMTI0JyldCiAgICAgICAgLm5ldHdvcmtfYWRkcmVzczogSVB2NkFkZHJlc3MoJzIwMDE6ZGI4OjoxMDAwJykKICAgICAgICAuaG9zdG1hc2s6IElQdjZBZGRyZXNzKCc6OmYnKQogICAgICAgIC5icm9hZGNhc3RfYWRkcmVzczogSVB2NkFkZHJlc3MoJzIwMDE6ZGI4OjoxMDBmJykKICAgICAgICAubmV0bWFzazogSVB2NkFkZHJlc3MoJ2ZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmMCcpCiAgICAgICAgLnByZWZpeGxlbjogMTI0CgogICAgIiIiCgogICAgIyBDbGFzcyB0byB1c2Ugd2hlbiBjcmVhdGluZyBhZGRyZXNzIG9iamVjdHMKICAgIF9hZGRyZXNzX2NsYXNzID0gSVB2NkFkZHJlc3MKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkcmVzcywgc3RyaWN0PVRydWUpOgogICAgICAgICIiIkluc3RhbnRpYXRlIGEgbmV3IElQdjYgTmV0d29yayBvYmplY3QuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGFkZHJlc3M6IEEgc3RyaW5nIG9yIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBJUHY2IG5ldHdvcmsgb3IgdGhlCiAgICAgICAgICAgICAgSVAgYW5kIHByZWZpeC9uZXRtYXNrLgogICAgICAgICAgICAgICcyMDAxOmRiODo6LzEyOCcKICAgICAgICAgICAgICAnMjAwMTpkYjg6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDAvMTI4JwogICAgICAgICAgICAgICcyMDAxOmRiODo6JwogICAgICAgICAgICAgIGFyZSBhbGwgZnVuY3Rpb25hbGx5IHRoZSBzYW1lIGluIElQdjYuICBUaGF0IGlzIHRvIHNheSwKICAgICAgICAgICAgICBmYWlsaW5nIHRvIHByb3ZpZGUgYSBzdWJuZXRtYXNrIHdpbGwgY3JlYXRlIGFuIG9iamVjdCB3aXRoCiAgICAgICAgICAgICAgYSBtYXNrIG9mIC8xMjguCgogICAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgYW4gaW50ZWdlciBjYW4gYmUgcGFzc2VkLCBzbwogICAgICAgICAgICAgIElQdjZOZXR3b3JrKCcyMDAxOmRiODo6JykgPT0KICAgICAgICAgICAgICAgIElQdjZOZXR3b3JrKDQyNTQwNzY2NDExMjgyNTkyODU2OTAzOTg0OTUxNjUzODI2NTYwKQogICAgICAgICAgICAgIG9yLCBtb3JlIGdlbmVyYWxseQogICAgICAgICAgICAgIElQdjZOZXR3b3JrKGludChJUHY2TmV0d29yaygnMjAwMTpkYjg6OicpKSkgPT0KICAgICAgICAgICAgICAgIElQdjZOZXR3b3JrKCcyMDAxOmRiODo6JykKCiAgICAgICAgICAgIHN0cmljdDogQSBib29sZWFuLiBJZiB0cnVlLCBlbnN1cmUgdGhhdCB3ZSBoYXZlIGJlZW4gcGFzc2VkCiAgICAgICAgICAgICAgQSB0cnVlIG5ldHdvcmsgYWRkcmVzcywgZWcsIDIwMDE6ZGI4OjoxMDAwLzEyNCBhbmQgbm90IGFuCiAgICAgICAgICAgICAgSVAgYWRkcmVzcyBvbiBhIG5ldHdvcmssIGVnLCAyMDAxOmRiODo6MS8xMjQuCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgQWRkcmVzc1ZhbHVlRXJyb3I6IElmIGFkZHJlc3MgaXNuJ3QgYSB2YWxpZCBJUHY2IGFkZHJlc3MuCiAgICAgICAgICAgIE5ldG1hc2tWYWx1ZUVycm9yOiBJZiB0aGUgbmV0bWFzayBpc24ndCB2YWxpZCBmb3IKICAgICAgICAgICAgICBhbiBJUHY2IGFkZHJlc3MuCiAgICAgICAgICAgIFZhbHVlRXJyb3I6IElmIHN0cmljdCB3YXMgVHJ1ZSBhbmQgYSBuZXR3b3JrIGFkZHJlc3Mgd2FzIG5vdAogICAgICAgICAgICAgIHN1cHBsaWVkLgoKICAgICAgICAiIiIKICAgICAgICBfQmFzZU5ldHdvcmsuX19pbml0X18oc2VsZiwgYWRkcmVzcykKCiAgICAgICAgIyBFZmZpY2llbnQgY29uc3RydWN0b3IgZnJvbSBpbnRlZ2VyIG9yIHBhY2tlZCBhZGRyZXNzCiAgICAgICAgaWYgaXNpbnN0YW5jZShhZGRyZXNzLCAoYnl0ZXMsIF9jb21wYXRfaW50X3R5cGVzKSk6CiAgICAgICAgICAgIHNlbGYubmV0d29ya19hZGRyZXNzID0gSVB2NkFkZHJlc3MoYWRkcmVzcykKICAgICAgICAgICAgc2VsZi5uZXRtYXNrLCBzZWxmLl9wcmVmaXhsZW4gPSBzZWxmLl9tYWtlX25ldG1hc2soCiAgICAgICAgICAgICAgICBzZWxmLl9tYXhfcHJlZml4bGVuKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgaXNpbnN0YW5jZShhZGRyZXNzLCB0dXBsZSk6CiAgICAgICAgICAgIGlmIGxlbihhZGRyZXNzKSA+IDE6CiAgICAgICAgICAgICAgICBhcmcgPSBhZGRyZXNzWzFdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhcmcgPSBzZWxmLl9tYXhfcHJlZml4bGVuCiAgICAgICAgICAgIHNlbGYubmV0bWFzaywgc2VsZi5fcHJlZml4bGVuID0gc2VsZi5fbWFrZV9uZXRtYXNrKGFyZykKICAgICAgICAgICAgc2VsZi5uZXR3b3JrX2FkZHJlc3MgPSBJUHY2QWRkcmVzcyhhZGRyZXNzWzBdKQogICAgICAgICAgICBwYWNrZWQgPSBpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpCiAgICAgICAgICAgIGlmIHBhY2tlZCAmIGludChzZWxmLm5ldG1hc2spICE9IHBhY2tlZDoKICAgICAgICAgICAgICAgIGlmIHN0cmljdDoKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCclcyBoYXMgaG9zdCBiaXRzIHNldCcgJSBzZWxmKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyA9IElQdjZBZGRyZXNzKHBhY2tlZCAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQoc2VsZi5uZXRtYXNrKSkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgQXNzdW1lIGlucHV0IGFyZ3VtZW50IHRvIGJlIHN0cmluZyBvciBhbnkgb2JqZWN0IHJlcHJlc2VudGF0aW9uCiAgICAgICAgIyB3aGljaCBjb252ZXJ0cyBpbnRvIGEgZm9ybWF0dGVkIElQIHByZWZpeCBzdHJpbmcuCiAgICAgICAgYWRkciA9IF9zcGxpdF9vcHRpb25hbF9uZXRtYXNrKGFkZHJlc3MpCgogICAgICAgIHNlbGYubmV0d29ya19hZGRyZXNzID0gSVB2NkFkZHJlc3Moc2VsZi5faXBfaW50X2Zyb21fc3RyaW5nKGFkZHJbMF0pKQoKICAgICAgICBpZiBsZW4oYWRkcikgPT0gMjoKICAgICAgICAgICAgYXJnID0gYWRkclsxXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFyZyA9IHNlbGYuX21heF9wcmVmaXhsZW4KICAgICAgICBzZWxmLm5ldG1hc2ssIHNlbGYuX3ByZWZpeGxlbiA9IHNlbGYuX21ha2VfbmV0bWFzayhhcmcpCgogICAgICAgIGlmIHN0cmljdDoKICAgICAgICAgICAgaWYgKElQdjZBZGRyZXNzKGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykgJiBpbnQoc2VsZi5uZXRtYXNrKSkgIT0KICAgICAgICAgICAgICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyk6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCclcyBoYXMgaG9zdCBiaXRzIHNldCcgJSBzZWxmKQogICAgICAgIHNlbGYubmV0d29ya19hZGRyZXNzID0gSVB2NkFkZHJlc3MoaW50KHNlbGYubmV0d29ya19hZGRyZXNzKSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQoc2VsZi5uZXRtYXNrKSkKCiAgICAgICAgaWYgc2VsZi5fcHJlZml4bGVuID09IChzZWxmLl9tYXhfcHJlZml4bGVuIC0gMSk6CiAgICAgICAgICAgIHNlbGYuaG9zdHMgPSBzZWxmLl9faXRlcl9fCgogICAgZGVmIGhvc3RzKHNlbGYpOgogICAgICAgICIiIkdlbmVyYXRlIEl0ZXJhdG9yIG92ZXIgdXNhYmxlIGhvc3RzIGluIGEgbmV0d29yay4KCiAgICAgICAgICBUaGlzIGlzIGxpa2UgX19pdGVyX18gZXhjZXB0IGl0IGRvZXNuJ3QgcmV0dXJuIHRoZQogICAgICAgICAgU3VibmV0LVJvdXRlciBhbnljYXN0IGFkZHJlc3MuCgogICAgICAgICIiIgogICAgICAgIG5ldHdvcmsgPSBpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpCiAgICAgICAgYnJvYWRjYXN0ID0gaW50KHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MpCiAgICAgICAgZm9yIHggaW4gX2NvbXBhdF9yYW5nZShuZXR3b3JrICsgMSwgYnJvYWRjYXN0ICsgMSk6CiAgICAgICAgICAgIHlpZWxkIHNlbGYuX2FkZHJlc3NfY2xhc3MoeCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19zaXRlX2xvY2FsKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgZm9yIHNpdGUtbG9jYWwuCgogICAgICAgIE5vdGUgdGhhdCB0aGUgc2l0ZS1sb2NhbCBhZGRyZXNzIHNwYWNlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYnkgUkZDIDM4NzkuCiAgICAgICAgVXNlIGlzX3ByaXZhdGUgdG8gdGVzdCBpZiB0aGlzIGFkZHJlc3MgaXMgaW4gdGhlIHNwYWNlIG9mIHVuaXF1ZSBsb2NhbAogICAgICAgIGFkZHJlc3NlcyBhcyBkZWZpbmVkIGJ5IFJGQyA0MTkzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgcGVyIFJGQyAzNTEzIDIuNS42LgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKHNlbGYubmV0d29ya19hZGRyZXNzLmlzX3NpdGVfbG9jYWwgYW5kCiAgICAgICAgICAgICAgICBzZWxmLmJyb2FkY2FzdF9hZGRyZXNzLmlzX3NpdGVfbG9jYWwpCgoKY2xhc3MgX0lQdjZDb25zdGFudHMob2JqZWN0KToKCiAgICBfbGlua2xvY2FsX25ldHdvcmsgPSBJUHY2TmV0d29yaygnZmU4MDo6LzEwJykKCiAgICBfbXVsdGljYXN0X25ldHdvcmsgPSBJUHY2TmV0d29yaygnZmYwMDo6LzgnKQoKICAgIF9wcml2YXRlX25ldHdvcmtzID0gWwogICAgICAgIElQdjZOZXR3b3JrKCc6OjEvMTI4JyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJzo6LzEyOCcpLAogICAgICAgIElQdjZOZXR3b3JrKCc6OmZmZmY6MDowLzk2JyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJzEwMDo6LzY0JyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJzIwMDE6Oi8yMycpLAogICAgICAgIElQdjZOZXR3b3JrKCcyMDAxOjI6Oi80OCcpLAogICAgICAgIElQdjZOZXR3b3JrKCcyMDAxOmRiODo6LzMyJyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJzIwMDE6MTA6Oi8yOCcpLAogICAgICAgIElQdjZOZXR3b3JrKCdmYzAwOjovNycpLAogICAgICAgIElQdjZOZXR3b3JrKCdmZTgwOjovMTAnKSwKICAgIF0KCiAgICBfcmVzZXJ2ZWRfbmV0d29ya3MgPSBbCiAgICAgICAgSVB2Nk5ldHdvcmsoJzo6LzgnKSwgSVB2Nk5ldHdvcmsoJzEwMDo6LzgnKSwKICAgICAgICBJUHY2TmV0d29yaygnMjAwOjovNycpLCBJUHY2TmV0d29yaygnNDAwOjovNicpLAogICAgICAgIElQdjZOZXR3b3JrKCc4MDA6Oi81JyksIElQdjZOZXR3b3JrKCcxMDAwOjovNCcpLAogICAgICAgIElQdjZOZXR3b3JrKCc0MDAwOjovMycpLCBJUHY2TmV0d29yaygnNjAwMDo6LzMnKSwKICAgICAgICBJUHY2TmV0d29yaygnODAwMDo6LzMnKSwgSVB2Nk5ldHdvcmsoJ0EwMDA6Oi8zJyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJ0MwMDA6Oi8zJyksIElQdjZOZXR3b3JrKCdFMDAwOjovNCcpLAogICAgICAgIElQdjZOZXR3b3JrKCdGMDAwOjovNScpLCBJUHY2TmV0d29yaygnRjgwMDo6LzYnKSwKICAgICAgICBJUHY2TmV0d29yaygnRkUwMDo6LzknKSwKICAgIF0KCiAgICBfc2l0ZWxvY2FsX25ldHdvcmsgPSBJUHY2TmV0d29yaygnZmVjMDo6LzEwJykKCgpJUHY2QWRkcmVzcy5fY29uc3RhbnRzID0gX0lQdjZDb25zdGFudHMKUEsDBBQAAAAAAAAAIQDzmSOAmyQAAJskAAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL19faW5pdF9fLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpsb2NrZmlsZS5weSAtIFBsYXRmb3JtLWluZGVwZW5kZW50IGFkdmlzb3J5IGZpbGUgbG9ja3MuCgpSZXF1aXJlcyBQeXRob24gMi41IHVubGVzcyB5b3UgYXBwbHkgMi40LmRpZmYKTG9ja2luZyBpcyBkb25lIG9uIGEgcGVyLXRocmVhZCBiYXNpcyBpbnN0ZWFkIG9mIGEgcGVyLXByb2Nlc3MgYmFzaXMuCgpVc2FnZToKCj4+PiBsb2NrID0gTG9ja0ZpbGUoJ3NvbWVmaWxlJykKPj4+IHRyeToKLi4uICAgICBsb2NrLmFjcXVpcmUoKQouLi4gZXhjZXB0IEFscmVhZHlMb2NrZWQ6Ci4uLiAgICAgcHJpbnQgJ3NvbWVmaWxlJywgJ2lzIGxvY2tlZCBhbHJlYWR5LicKLi4uIGV4Y2VwdCBMb2NrRmFpbGVkOgouLi4gICAgIHByaW50ICdzb21lZmlsZScsICdjYW5cXCd0IGJlIGxvY2tlZC4nCi4uLiBlbHNlOgouLi4gICAgIHByaW50ICdnb3QgbG9jaycKZ290IGxvY2sKPj4+IHByaW50IGxvY2suaXNfbG9ja2VkKCkKVHJ1ZQo+Pj4gbG9jay5yZWxlYXNlKCkKCj4+PiBsb2NrID0gTG9ja0ZpbGUoJ3NvbWVmaWxlJykKPj4+IHByaW50IGxvY2suaXNfbG9ja2VkKCkKRmFsc2UKPj4+IHdpdGggbG9jazoKLi4uICAgIHByaW50IGxvY2suaXNfbG9ja2VkKCkKVHJ1ZQo+Pj4gcHJpbnQgbG9jay5pc19sb2NrZWQoKQpGYWxzZQoKPj4+IGxvY2sgPSBMb2NrRmlsZSgnc29tZWZpbGUnKQo+Pj4gIyBJdCBpcyBva2F5IHRvIGxvY2sgdHdpY2UgZnJvbSB0aGUgc2FtZSB0aHJlYWQuLi4KPj4+IHdpdGggbG9jazoKLi4uICAgICBsb2NrLmFjcXVpcmUoKQouLi4KPj4+ICMgVGhvdWdoIG5vIGNvdW50ZXIgaXMga2VwdCwgc28geW91IGNhbid0IHVubG9jayBtdWx0aXBsZSB0aW1lcy4uLgo+Pj4gcHJpbnQgbG9jay5pc19sb2NrZWQoKQpGYWxzZQoKRXhjZXB0aW9uczoKCiAgICBFcnJvciAtIGJhc2UgY2xhc3MgZm9yIG90aGVyIGV4Y2VwdGlvbnMKICAgICAgICBMb2NrRXJyb3IgLSBiYXNlIGNsYXNzIGZvciBhbGwgbG9ja2luZyBleGNlcHRpb25zCiAgICAgICAgICAgIEFscmVhZHlMb2NrZWQgLSBBbm90aGVyIHRocmVhZCBvciBwcm9jZXNzIGFscmVhZHkgaG9sZHMgdGhlIGxvY2sKICAgICAgICAgICAgTG9ja0ZhaWxlZCAtIExvY2sgZmFpbGVkIGZvciBzb21lIG90aGVyIHJlYXNvbgogICAgICAgIFVubG9ja0Vycm9yIC0gYmFzZSBjbGFzcyBmb3IgYWxsIHVubG9ja2luZyBleGNlcHRpb25zCiAgICAgICAgICAgIEFscmVhZHlVbmxvY2tlZCAtIEZpbGUgd2FzIG5vdCBsb2NrZWQuCiAgICAgICAgICAgIE5vdE15TG9jayAtIEZpbGUgd2FzIGxvY2tlZCBidXQgbm90IGJ5IHRoZSBjdXJyZW50IHRocmVhZC9wcm9jZXNzCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IG9zCmltcG9ydCBzb2NrZXQKaW1wb3J0IHRocmVhZGluZwppbXBvcnQgd2FybmluZ3MKCiMgV29yayB3aXRoIFBFUDggYW5kIG5vbi1QRVA4IHZlcnNpb25zIG9mIHRocmVhZGluZyBtb2R1bGUuCmlmIG5vdCBoYXNhdHRyKHRocmVhZGluZywgImN1cnJlbnRfdGhyZWFkIik6CiAgICB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQgPSB0aHJlYWRpbmcuY3VycmVudFRocmVhZAppZiBub3QgaGFzYXR0cih0aHJlYWRpbmcuVGhyZWFkLCAiZ2V0X25hbWUiKToKICAgIHRocmVhZGluZy5UaHJlYWQuZ2V0X25hbWUgPSB0aHJlYWRpbmcuVGhyZWFkLmdldE5hbWUKCl9fYWxsX18gPSBbJ0Vycm9yJywgJ0xvY2tFcnJvcicsICdMb2NrVGltZW91dCcsICdBbHJlYWR5TG9ja2VkJywKICAgICAgICAgICAnTG9ja0ZhaWxlZCcsICdVbmxvY2tFcnJvcicsICdOb3RMb2NrZWQnLCAnTm90TXlMb2NrJywKICAgICAgICAgICAnTGlua0ZpbGVMb2NrJywgJ01rZGlyRmlsZUxvY2snLCAnU1FMaXRlRmlsZUxvY2snLAogICAgICAgICAgICdMb2NrQmFzZScsICdsb2NrZWQnXQoKCmNsYXNzIEVycm9yKEV4Y2VwdGlvbik6CiAgICAiIiIKICAgIEJhc2UgY2xhc3MgZm9yIG90aGVyIGV4Y2VwdGlvbnMuCgogICAgPj4+IHRyeToKICAgIC4uLiAgIHJhaXNlIEVycm9yCiAgICAuLi4gZXhjZXB0IEV4Y2VwdGlvbjoKICAgIC4uLiAgIHBhc3MKICAgICIiIgogICAgcGFzcwoKCmNsYXNzIExvY2tFcnJvcihFcnJvcik6CiAgICAiIiIKICAgIEJhc2UgY2xhc3MgZm9yIGVycm9yIGFyaXNpbmcgZnJvbSBhdHRlbXB0cyB0byBhY3F1aXJlIHRoZSBsb2NrLgoKICAgID4+PiB0cnk6CiAgICAuLi4gICByYWlzZSBMb2NrRXJyb3IKICAgIC4uLiBleGNlcHQgRXJyb3I6CiAgICAuLi4gICBwYXNzCiAgICAiIiIKICAgIHBhc3MKCgpjbGFzcyBMb2NrVGltZW91dChMb2NrRXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gbG9jayBjcmVhdGlvbiBmYWlscyB3aXRoaW4gYSB1c2VyLWRlZmluZWQgcGVyaW9kIG9mIHRpbWUuCgogICAgPj4+IHRyeToKICAgIC4uLiAgIHJhaXNlIExvY2tUaW1lb3V0CiAgICAuLi4gZXhjZXB0IExvY2tFcnJvcjoKICAgIC4uLiAgIHBhc3MKICAgICIiIgogICAgcGFzcwoKCmNsYXNzIEFscmVhZHlMb2NrZWQoTG9ja0Vycm9yKToKICAgICIiIlNvbWUgb3RoZXIgdGhyZWFkL3Byb2Nlc3MgaXMgbG9ja2luZyB0aGUgZmlsZS4KCiAgICA+Pj4gdHJ5OgogICAgLi4uICAgcmFpc2UgQWxyZWFkeUxvY2tlZAogICAgLi4uIGV4Y2VwdCBMb2NrRXJyb3I6CiAgICAuLi4gICBwYXNzCiAgICAiIiIKICAgIHBhc3MKCgpjbGFzcyBMb2NrRmFpbGVkKExvY2tFcnJvcik6CiAgICAiIiJMb2NrIGZpbGUgY3JlYXRpb24gZmFpbGVkIGZvciBzb21lIG90aGVyIHJlYXNvbi4KCiAgICA+Pj4gdHJ5OgogICAgLi4uICAgcmFpc2UgTG9ja0ZhaWxlZAogICAgLi4uIGV4Y2VwdCBMb2NrRXJyb3I6CiAgICAuLi4gICBwYXNzCiAgICAiIiIKICAgIHBhc3MKCgpjbGFzcyBVbmxvY2tFcnJvcihFcnJvcik6CiAgICAiIiIKICAgIEJhc2UgY2xhc3MgZm9yIGVycm9ycyBhcmlzaW5nIGZyb20gYXR0ZW1wdHMgdG8gcmVsZWFzZSB0aGUgbG9jay4KCiAgICA+Pj4gdHJ5OgogICAgLi4uICAgcmFpc2UgVW5sb2NrRXJyb3IKICAgIC4uLiBleGNlcHQgRXJyb3I6CiAgICAuLi4gICBwYXNzCiAgICAiIiIKICAgIHBhc3MKCgpjbGFzcyBOb3RMb2NrZWQoVW5sb2NrRXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHVubG9jayBhbiB1bmxvY2tlZCBmaWxlLgoKICAgID4+PiB0cnk6CiAgICAuLi4gICByYWlzZSBOb3RMb2NrZWQKICAgIC4uLiBleGNlcHQgVW5sb2NrRXJyb3I6CiAgICAuLi4gICBwYXNzCiAgICAiIiIKICAgIHBhc3MKCgpjbGFzcyBOb3RNeUxvY2soVW5sb2NrRXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHVubG9jayBhIGZpbGUgc29tZW9uZSBlbHNlIGxvY2tlZC4KCiAgICA+Pj4gdHJ5OgogICAgLi4uICAgcmFpc2UgTm90TXlMb2NrCiAgICAuLi4gZXhjZXB0IFVubG9ja0Vycm9yOgogICAgLi4uICAgcGFzcwogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgX1NoYXJlZEJhc2Uob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoKToKICAgICAgICBzZWxmLnBhdGggPSBwYXRoCgogICAgZGVmIGFjcXVpcmUoc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBBY3F1aXJlIHRoZSBsb2NrLgoKICAgICAgICAqIElmIHRpbWVvdXQgaXMgb21pdHRlZCAob3IgTm9uZSksIHdhaXQgZm9yZXZlciB0cnlpbmcgdG8gbG9jayB0aGUKICAgICAgICAgIGZpbGUuCgogICAgICAgICogSWYgdGltZW91dCA+IDAsIHRyeSB0byBhY3F1aXJlIHRoZSBsb2NrIGZvciB0aGF0IG1hbnkgc2Vjb25kcy4gIElmCiAgICAgICAgICB0aGUgbG9jayBwZXJpb2QgZXhwaXJlcyBhbmQgdGhlIGZpbGUgaXMgc3RpbGwgbG9ja2VkLCByYWlzZQogICAgICAgICAgTG9ja1RpbWVvdXQuCgogICAgICAgICogSWYgdGltZW91dCA8PSAwLCByYWlzZSBBbHJlYWR5TG9ja2VkIGltbWVkaWF0ZWx5IGlmIHRoZSBmaWxlIGlzCiAgICAgICAgICBhbHJlYWR5IGxvY2tlZC4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZCgiaW1wbGVtZW50IGluIHN1YmNsYXNzIikKCiAgICBkZWYgcmVsZWFzZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZWxlYXNlIHRoZSBsb2NrLgoKICAgICAgICBJZiB0aGUgZmlsZSBpcyBub3QgbG9ja2VkLCByYWlzZSBOb3RMb2NrZWQuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWQoImltcGxlbWVudCBpbiBzdWJjbGFzcyIpCgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDb250ZXh0IG1hbmFnZXIgc3VwcG9ydC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmFjcXVpcmUoKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsICpfZXhjKToKICAgICAgICAiIiIKICAgICAgICBDb250ZXh0IG1hbmFnZXIgc3VwcG9ydC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnJlbGVhc2UoKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjwlczogJXI+IiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5wYXRoKQoKCmNsYXNzIExvY2tCYXNlKF9TaGFyZWRCYXNlKToKICAgICIiIkJhc2UgY2xhc3MgZm9yIHBsYXRmb3JtLXNwZWNpZmljIGxvY2sgY2xhc3Nlcy4iIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCB0aHJlYWRlZD1UcnVlLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICIiIgogICAgICAgID4+PiBsb2NrID0gTG9ja0Jhc2UoJ3NvbWVmaWxlJykKICAgICAgICA+Pj4gbG9jayA9IExvY2tCYXNlKCdzb21lZmlsZScsIHRocmVhZGVkPUZhbHNlKQogICAgICAgICIiIgogICAgICAgIHN1cGVyKExvY2tCYXNlLCBzZWxmKS5fX2luaXRfXyhwYXRoKQogICAgICAgIHNlbGYubG9ja19maWxlID0gb3MucGF0aC5hYnNwYXRoKHBhdGgpICsgIi5sb2NrIgogICAgICAgIHNlbGYuaG9zdG5hbWUgPSBzb2NrZXQuZ2V0aG9zdG5hbWUoKQogICAgICAgIHNlbGYucGlkID0gb3MuZ2V0cGlkKCkKICAgICAgICBpZiB0aHJlYWRlZDoKICAgICAgICAgICAgdCA9IHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpCiAgICAgICAgICAgICMgVGhyZWFkIG9iamVjdHMgaW4gUHl0aG9uIDIuNCBhbmQgZWFybGllciBkbyBub3QgaGF2ZSBpZGVudAogICAgICAgICAgICAjIGF0dHJzLiAgV29ybSBhcm91bmQgdGhhdC4KICAgICAgICAgICAgaWRlbnQgPSBnZXRhdHRyKHQsICJpZGVudCIsIGhhc2godCkpCiAgICAgICAgICAgIHNlbGYudG5hbWUgPSAiLSV4IiAlIChpZGVudCAmIDB4ZmZmZmZmZmYpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50bmFtZSA9ICIiCiAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShzZWxmLmxvY2tfZmlsZSkKCiAgICAgICAgIyB1bmlxdWUgbmFtZSBpcyBtb3N0bHkgYWJvdXQgdGhlIGN1cnJlbnQgcHJvY2VzcywgYnV0IG11c3QKICAgICAgICAjIGFsc28gY29udGFpbiB0aGUgcGF0aCAtLSBvdGhlcndpc2UsIHR3byBhZGphY2VudCBsb2NrZWQKICAgICAgICAjIGZpbGVzIGNvbmZsaWN0IChvbmUgZmlsZSBnZXRzIGxvY2tlZCwgY3JlYXRpbmcgbG9jay1maWxlIGFuZAogICAgICAgICMgdW5pcXVlIGZpbGUsIHRoZSBvdGhlciBvbmUgZ2V0cyBsb2NrZWQsIGNyZWF0aW5nIGxvY2stZmlsZQogICAgICAgICMgYW5kIG92ZXJ3cml0aW5nIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGxvY2stZmlsZSwgdGhlbiBvbmUKICAgICAgICAjIGdldHMgdW5sb2NrZWQsIGRlbGV0aW5nIGJvdGggbG9jay1maWxlIGFuZCB1bmlxdWUgZmlsZSwKICAgICAgICAjIGZpbmFsbHkgdGhlIGxhc3QgbG9jayBlcnJvcnMgb3V0IHVwb24gcmVsZWFzaW5nLgogICAgICAgIHNlbGYudW5pcXVlX25hbWUgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyVzLiVzJXMiICUgKHNlbGYuaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5waWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoKHNlbGYucGF0aCkpKQogICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQKCiAgICBkZWYgaXNfbG9ja2VkKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlbGwgd2hldGhlciBvciBub3QgdGhlIGZpbGUgaXMgbG9ja2VkLgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkKCJpbXBsZW1lbnQgaW4gc3ViY2xhc3MiKQoKICAgIGRlZiBpX2FtX2xvY2tpbmcoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIFRydWUgaWYgdGhpcyBvYmplY3QgaXMgbG9ja2luZyB0aGUgZmlsZS4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZCgiaW1wbGVtZW50IGluIHN1YmNsYXNzIikKCiAgICBkZWYgYnJlYWtfbG9jayhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZW1vdmUgYSBsb2NrLiAgVXNlZnVsIGlmIGEgbG9ja2luZyB0aHJlYWQgZmFpbGVkIHRvIHVubG9jay4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZCgiaW1wbGVtZW50IGluIHN1YmNsYXNzIikKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8JXM6ICVyIC0tICVyPiIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYudW5pcXVlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoKQoKCmRlZiBfZmxfaGVscGVyKGNscywgbW9kLCAqYXJncywgKiprd2RzKToKICAgIHdhcm5pbmdzLndhcm4oIkltcG9ydCBmcm9tICVzIG1vZHVsZSBpbnN0ZWFkIG9mIGxvY2tmaWxlIHBhY2thZ2UiICUgbW9kLAogICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICMgVGhpcyBpcyBhIGJpdCBmdW5reSwgYnV0IGl0J3Mgb25seSBmb3IgYXdoaWxlLiAgVGhlIHdheSB0aGUgdW5pdCB0ZXN0cwogICAgIyBhcmUgY29uc3RydWN0ZWQgdGhpcyBmdW5jdGlvbiB3aW5kcyB1cCBhcyBhbiB1bmJvdW5kIG1ldGhvZCwgc28gaXQKICAgICMgYWN0dWFsbHkgdGFrZXMgdGhyZWUgYXJncywgbm90IHR3by4gIFdlIHdhbnQgdG8gdG9zcyBvdXQgc2VsZi4KICAgIGlmIG5vdCBpc2luc3RhbmNlKGFyZ3NbMF0sIHN0cik6CiAgICAgICAgIyBXZSBhcmUgdGVzdGluZywgYXZvaWQgdGhlIGZpcnN0IGFyZwogICAgICAgIGFyZ3MgPSBhcmdzWzE6XQogICAgaWYgbGVuKGFyZ3MpID09IDEgYW5kIG5vdCBrd2RzOgogICAgICAgIGt3ZHNbInRocmVhZGVkIl0gPSBUcnVlCiAgICByZXR1cm4gY2xzKCphcmdzLCAqKmt3ZHMpCgoKZGVmIExpbmtGaWxlTG9jaygqYXJncywgKiprd2RzKToKICAgICIiIkZhY3RvcnkgZnVuY3Rpb24gcHJvdmlkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgoKICAgIERvIG5vdCB1c2UgaW4gbmV3IGNvZGUuICBJbnN0ZWFkLCBpbXBvcnQgTGlua0xvY2tGaWxlIGZyb20gdGhlCiAgICBsb2NrZmlsZS5saW5rbG9ja2ZpbGUgbW9kdWxlLgogICAgIiIiCiAgICBmcm9tIC4gaW1wb3J0IGxpbmtsb2NrZmlsZQogICAgcmV0dXJuIF9mbF9oZWxwZXIobGlua2xvY2tmaWxlLkxpbmtMb2NrRmlsZSwgImxvY2tmaWxlLmxpbmtsb2NrZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAqYXJncywgKiprd2RzKQoKCmRlZiBNa2RpckZpbGVMb2NrKCphcmdzLCAqKmt3ZHMpOgogICAgIiIiRmFjdG9yeSBmdW5jdGlvbiBwcm92aWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCgogICAgRG8gbm90IHVzZSBpbiBuZXcgY29kZS4gIEluc3RlYWQsIGltcG9ydCBNa2RpckxvY2tGaWxlIGZyb20gdGhlCiAgICBsb2NrZmlsZS5ta2RpcmxvY2tmaWxlIG1vZHVsZS4KICAgICIiIgogICAgZnJvbSAuIGltcG9ydCBta2RpcmxvY2tmaWxlCiAgICByZXR1cm4gX2ZsX2hlbHBlcihta2RpcmxvY2tmaWxlLk1rZGlyTG9ja0ZpbGUsICJsb2NrZmlsZS5ta2RpcmxvY2tmaWxlIiwKICAgICAgICAgICAgICAgICAgICAgICphcmdzLCAqKmt3ZHMpCgoKZGVmIFNRTGl0ZUZpbGVMb2NrKCphcmdzLCAqKmt3ZHMpOgogICAgIiIiRmFjdG9yeSBmdW5jdGlvbiBwcm92aWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCgogICAgRG8gbm90IHVzZSBpbiBuZXcgY29kZS4gIEluc3RlYWQsIGltcG9ydCBTUUxpdGVMb2NrRmlsZSBmcm9tIHRoZQogICAgbG9ja2ZpbGUubWtkaXJsb2NrZmlsZSBtb2R1bGUuCiAgICAiIiIKICAgIGZyb20gLiBpbXBvcnQgc3FsaXRlbG9ja2ZpbGUKICAgIHJldHVybiBfZmxfaGVscGVyKHNxbGl0ZWxvY2tmaWxlLlNRTGl0ZUxvY2tGaWxlLCAibG9ja2ZpbGUuc3FsaXRlbG9ja2ZpbGUiLAogICAgICAgICAgICAgICAgICAgICAgKmFyZ3MsICoqa3dkcykKCgpkZWYgbG9ja2VkKHBhdGgsIHRpbWVvdXQ9Tm9uZSk6CiAgICAiIiJEZWNvcmF0b3Igd2hpY2ggZW5hYmxlcyBsb2NrcyBmb3IgZGVjb3JhdGVkIGZ1bmN0aW9uLgoKICAgIEFyZ3VtZW50czoKICAgICAtIHBhdGg6IHBhdGggZm9yIGxvY2tmaWxlLgogICAgIC0gdGltZW91dCAob3B0aW9uYWwpOiBUaW1lb3V0IGZvciBhY3F1aXJpbmcgbG9jay4KCiAgICAgVXNhZ2U6CiAgICAgICAgIEBsb2NrZWQoJy92YXIvcnVuL215bmFtZScsIHRpbWVvdXQ9MCkKICAgICAgICAgZGVmIG15bmFtZSguLi4pOgogICAgICAgICAgICAgLi4uCiAgICAiIiIKICAgIGRlZiBkZWNvcihmdW5jKToKICAgICAgICBAZnVuY3Rvb2xzLndyYXBzKGZ1bmMpCiAgICAgICAgZGVmIHdyYXBwZXIoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgbG9jayA9IEZpbGVMb2NrKHBhdGgsIHRpbWVvdXQ9dGltZW91dCkKICAgICAgICAgICAgbG9jay5hY3F1aXJlKCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgbG9jay5yZWxlYXNlKCkKICAgICAgICByZXR1cm4gd3JhcHBlcgogICAgcmV0dXJuIGRlY29yCgoKaWYgaGFzYXR0cihvcywgImxpbmsiKToKICAgIGZyb20gLiBpbXBvcnQgbGlua2xvY2tmaWxlIGFzIF9sbGYKICAgIExvY2tGaWxlID0gX2xsZi5MaW5rTG9ja0ZpbGUKZWxzZToKICAgIGZyb20gLiBpbXBvcnQgbWtkaXJsb2NrZmlsZSBhcyBfbWxmCiAgICBMb2NrRmlsZSA9IF9tbGYuTWtkaXJMb2NrRmlsZQoKRmlsZUxvY2sgPSBMb2NrRmlsZQpQSwMEFAAAAAAAAAAhACve8idcCgAAXAoAADQAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvbGlua2xvY2tmaWxlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCB0aW1lCmltcG9ydCBvcwoKZnJvbSAuIGltcG9ydCAoTG9ja0Jhc2UsIExvY2tGYWlsZWQsIE5vdExvY2tlZCwgTm90TXlMb2NrLCBMb2NrVGltZW91dCwKICAgICAgICAgICAgICAgQWxyZWFkeUxvY2tlZCkKCgpjbGFzcyBMaW5rTG9ja0ZpbGUoTG9ja0Jhc2UpOgogICAgIiIiTG9jayBhY2Nlc3MgdG8gYSBmaWxlIHVzaW5nIGF0b21pYyBwcm9wZXJ0eSBvZiBsaW5rKDIpLgoKICAgID4+PiBsb2NrID0gTGlua0xvY2tGaWxlKCdzb21lZmlsZScpCiAgICA+Pj4gbG9jayA9IExpbmtMb2NrRmlsZSgnc29tZWZpbGUnLCB0aHJlYWRlZD1GYWxzZSkKICAgICIiIgoKICAgIGRlZiBhY3F1aXJlKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcGVuKHNlbGYudW5pcXVlX25hbWUsICJ3YiIpLmNsb3NlKCkKICAgICAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICAgICAgcmFpc2UgTG9ja0ZhaWxlZCgiZmFpbGVkIHRvIGNyZWF0ZSAlcyIgJSBzZWxmLnVuaXF1ZV9uYW1lKQoKICAgICAgICB0aW1lb3V0ID0gdGltZW91dCBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGVsc2Ugc2VsZi50aW1lb3V0CiAgICAgICAgZW5kX3RpbWUgPSB0aW1lLnRpbWUoKQogICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgYW5kIHRpbWVvdXQgPiAwOgogICAgICAgICAgICBlbmRfdGltZSArPSB0aW1lb3V0CgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICMgVHJ5IGFuZCBjcmVhdGUgYSBoYXJkIGxpbmsgdG8gaXQuCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG9zLmxpbmsoc2VsZi51bmlxdWVfbmFtZSwgc2VsZi5sb2NrX2ZpbGUpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgIyBMaW5rIGNyZWF0aW9uIGZhaWxlZC4gIE1heWJlIHdlJ3ZlIGRvdWJsZS1sb2NrZWQ/CiAgICAgICAgICAgICAgICBubGlua3MgPSBvcy5zdGF0KHNlbGYudW5pcXVlX25hbWUpLnN0X25saW5rCiAgICAgICAgICAgICAgICBpZiBubGlua3MgPT0gMjoKICAgICAgICAgICAgICAgICAgICAjIFRoZSBvcmlnaW5hbCBsaW5rIHBsdXMgdGhlIG9uZSBJIGNyZWF0ZWQgPT0gMi4gIFdlJ3JlCiAgICAgICAgICAgICAgICAgICAgIyBnb29kIHRvIGdvLgogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIE90aGVyd2lzZSB0aGUgbG9jayBjcmVhdGlvbiBmYWlsZWQuCiAgICAgICAgICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZS50aW1lKCkgPiBlbmRfdGltZToKICAgICAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHNlbGYudW5pcXVlX25hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgPiAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgTG9ja1RpbWVvdXQoIlRpbWVvdXQgd2FpdGluZyB0byBhY3F1aXJlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBsb2NrIGZvciAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQWxyZWFkeUxvY2tlZCgiJXMgaXMgYWxyZWFkeSBsb2NrZWQiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoKQogICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAodGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZW91dCAvIDEwIG9yIDAuMSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgTGluayBjcmVhdGlvbiBzdWNjZWVkZWQuICBXZSdyZSBnb29kIHRvIGdvLgogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgZGVmIHJlbGVhc2Uoc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYuaXNfbG9ja2VkKCk6CiAgICAgICAgICAgIHJhaXNlIE5vdExvY2tlZCgiJXMgaXMgbm90IGxvY2tlZCIgJSBzZWxmLnBhdGgpCiAgICAgICAgZWxpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi51bmlxdWVfbmFtZSk6CiAgICAgICAgICAgIHJhaXNlIE5vdE15TG9jaygiJXMgaXMgbG9ja2VkLCBidXQgbm90IGJ5IG1lIiAlIHNlbGYucGF0aCkKICAgICAgICBvcy51bmxpbmsoc2VsZi51bmlxdWVfbmFtZSkKICAgICAgICBvcy51bmxpbmsoc2VsZi5sb2NrX2ZpbGUpCgogICAgZGVmIGlzX2xvY2tlZChzZWxmKToKICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMoc2VsZi5sb2NrX2ZpbGUpCgogICAgZGVmIGlfYW1fbG9ja2luZyhzZWxmKToKICAgICAgICByZXR1cm4gKHNlbGYuaXNfbG9ja2VkKCkgYW5kCiAgICAgICAgICAgICAgICBvcy5wYXRoLmV4aXN0cyhzZWxmLnVuaXF1ZV9uYW1lKSBhbmQKICAgICAgICAgICAgICAgIG9zLnN0YXQoc2VsZi51bmlxdWVfbmFtZSkuc3RfbmxpbmsgPT0gMikKCiAgICBkZWYgYnJlYWtfbG9jayhzZWxmKToKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmxvY2tfZmlsZSk6CiAgICAgICAgICAgIG9zLnVubGluayhzZWxmLmxvY2tfZmlsZSkKUEsDBBQAAAAAAAAAIQAhJrx+GAwAABgMAAA1AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL21rZGlybG9ja2ZpbGUucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24KCmltcG9ydCB0aW1lCmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBlcnJubwoKZnJvbSAuIGltcG9ydCAoTG9ja0Jhc2UsIExvY2tGYWlsZWQsIE5vdExvY2tlZCwgTm90TXlMb2NrLCBMb2NrVGltZW91dCwKICAgICAgICAgICAgICAgQWxyZWFkeUxvY2tlZCkKCgpjbGFzcyBNa2RpckxvY2tGaWxlKExvY2tCYXNlKToKICAgICIiIkxvY2sgZmlsZSBieSBjcmVhdGluZyBhIGRpcmVjdG9yeS4iIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCB0aHJlYWRlZD1UcnVlLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICIiIgogICAgICAgID4+PiBsb2NrID0gTWtkaXJMb2NrRmlsZSgnc29tZWZpbGUnKQogICAgICAgID4+PiBsb2NrID0gTWtkaXJMb2NrRmlsZSgnc29tZWZpbGUnLCB0aHJlYWRlZD1GYWxzZSkKICAgICAgICAiIiIKICAgICAgICBMb2NrQmFzZS5fX2luaXRfXyhzZWxmLCBwYXRoLCB0aHJlYWRlZCwgdGltZW91dCkKICAgICAgICAjIExvY2sgZmlsZSBpdHNlbGYgaXMgYSBkaXJlY3RvcnkuICBQbGFjZSB0aGUgdW5pcXVlIGZpbGUgbmFtZSBpbnRvCiAgICAgICAgIyBpdC4KICAgICAgICBzZWxmLnVuaXF1ZV9uYW1lID0gb3MucGF0aC5qb2luKHNlbGYubG9ja19maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzLiVzJXMiICUgKHNlbGYuaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBpZCkpCgogICAgZGVmIGFjcXVpcmUoc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICB0aW1lb3V0ID0gdGltZW91dCBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGVsc2Ugc2VsZi50aW1lb3V0CiAgICAgICAgZW5kX3RpbWUgPSB0aW1lLnRpbWUoKQogICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgYW5kIHRpbWVvdXQgPiAwOgogICAgICAgICAgICBlbmRfdGltZSArPSB0aW1lb3V0CgogICAgICAgIGlmIHRpbWVvdXQgaXMgTm9uZToKICAgICAgICAgICAgd2FpdCA9IDAuMQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHdhaXQgPSBtYXgoMCwgdGltZW91dCAvIDEwKQoKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvcy5ta2RpcihzZWxmLmxvY2tfZmlsZSkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICBlcnIgPSBzeXMuZXhjX2luZm8oKVsxXQogICAgICAgICAgICAgICAgaWYgZXJyLmVycm5vID09IGVycm5vLkVFWElTVDoKICAgICAgICAgICAgICAgICAgICAjIEFscmVhZHkgbG9ja2VkLgogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYudW5pcXVlX25hbWUpOgogICAgICAgICAgICAgICAgICAgICAgICAjIEFscmVhZHkgbG9ja2VkIGJ5IG1lLgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lLnRpbWUoKSA+IGVuZF90aW1lOgogICAgICAgICAgICAgICAgICAgICAgICBpZiB0aW1lb3V0ID4gMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIExvY2tUaW1lb3V0KCJUaW1lb3V0IHdhaXRpbmcgdG8gYWNxdWlyZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbG9jayBmb3IgJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU29tZW9uZSBlbHNlIGhhcyB0aGUgbG9jay4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFscmVhZHlMb2NrZWQoIiVzIGlzIGFscmVhZHkgbG9ja2VkIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aCkKICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHdhaXQpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgQ291bGRuJ3QgY3JlYXRlIHRoZSBsb2NrIGZvciBzb21lIG90aGVyIHJlYXNvbgogICAgICAgICAgICAgICAgICAgIHJhaXNlIExvY2tGYWlsZWQoImZhaWxlZCB0byBjcmVhdGUgJXMiICUgc2VsZi5sb2NrX2ZpbGUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBvcGVuKHNlbGYudW5pcXVlX25hbWUsICJ3YiIpLmNsb3NlKCkKICAgICAgICAgICAgICAgIHJldHVybgoKICAgIGRlZiByZWxlYXNlKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLmlzX2xvY2tlZCgpOgogICAgICAgICAgICByYWlzZSBOb3RMb2NrZWQoIiVzIGlzIG5vdCBsb2NrZWQiICUgc2VsZi5wYXRoKQogICAgICAgIGVsaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYudW5pcXVlX25hbWUpOgogICAgICAgICAgICByYWlzZSBOb3RNeUxvY2soIiVzIGlzIGxvY2tlZCwgYnV0IG5vdCBieSBtZSIgJSBzZWxmLnBhdGgpCiAgICAgICAgb3MudW5saW5rKHNlbGYudW5pcXVlX25hbWUpCiAgICAgICAgb3Mucm1kaXIoc2VsZi5sb2NrX2ZpbGUpCgogICAgZGVmIGlzX2xvY2tlZChzZWxmKToKICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMoc2VsZi5sb2NrX2ZpbGUpCgogICAgZGVmIGlfYW1fbG9ja2luZyhzZWxmKToKICAgICAgICByZXR1cm4gKHNlbGYuaXNfbG9ja2VkKCkgYW5kCiAgICAgICAgICAgICAgICBvcy5wYXRoLmV4aXN0cyhzZWxmLnVuaXF1ZV9uYW1lKSkKCiAgICBkZWYgYnJlYWtfbG9jayhzZWxmKToKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmxvY2tfZmlsZSk6CiAgICAgICAgICAgIGZvciBuYW1lIGluIG9zLmxpc3RkaXIoc2VsZi5sb2NrX2ZpbGUpOgogICAgICAgICAgICAgICAgb3MudW5saW5rKG9zLnBhdGguam9pbihzZWxmLmxvY2tfZmlsZSwgbmFtZSkpCiAgICAgICAgICAgIG9zLnJtZGlyKHNlbGYubG9ja19maWxlKQpQSwMEFAAAAAAAAAAhACA8ci3KFwAAyhcAADMAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvcGlkbG9ja2ZpbGUucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIyBwaWRsb2NrZmlsZS5weQojCiMgQ29weXJpZ2h0IMKpIDIwMDjigJMyMDA5IEJlbiBGaW5uZXkgPGJlbitweXRob25AYmVuZmlubmV5LmlkLmF1PgojCiMgVGhpcyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgbWF5IGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyB3b3JrCiMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiBMaWNlbnNlLCB2ZXJzaW9uIDIgb3IKIyBsYXRlciBhcyBwdWJsaXNoZWQgYnkgdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgojIE5vIHdhcnJhbnR5IGV4cHJlc3NlZCBvciBpbXBsaWVkLiBTZWUgdGhlIGZpbGUgTElDRU5TRS5QU0YtMiBmb3IgZGV0YWlscy4KCiIiIiBMb2NrZmlsZSBiZWhhdmlvdXIgaW1wbGVtZW50ZWQgdmlhIFVuaXggUElEIGZpbGVzLgogICAgIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGVycm5vCmltcG9ydCBvcwppbXBvcnQgdGltZQoKZnJvbSAuIGltcG9ydCAoTG9ja0Jhc2UsIEFscmVhZHlMb2NrZWQsIExvY2tGYWlsZWQsIE5vdExvY2tlZCwgTm90TXlMb2NrLAogICAgICAgICAgICAgICBMb2NrVGltZW91dCkKCgwKY2xhc3MgUElETG9ja0ZpbGUoTG9ja0Jhc2UpOgogICAgIiIiIExvY2tmaWxlIGltcGxlbWVudGVkIGFzIGEgVW5peCBQSUQgZmlsZS4KCiAgICBUaGUgbG9jayBmaWxlIGlzIGEgbm9ybWFsIGZpbGUgbmFtZWQgYnkgdGhlIGF0dHJpYnV0ZSBgcGF0aGAuCiAgICBBIGxvY2sncyBQSUQgZmlsZSBjb250YWlucyBhIHNpbmdsZSBsaW5lIG9mIHRleHQsIGNvbnRhaW5pbmcKICAgIHRoZSBwcm9jZXNzIElEIChQSUQpIG9mIHRoZSBwcm9jZXNzIHRoYXQgYWNxdWlyZWQgdGhlIGxvY2suCgogICAgPj4+IGxvY2sgPSBQSURMb2NrRmlsZSgnc29tZWZpbGUnKQogICAgPj4+IGxvY2sgPSBQSURMb2NrRmlsZSgnc29tZWZpbGUnKQogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIHRocmVhZGVkPUZhbHNlLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICMgcGlkIGxvY2tmaWxlcyBkb24ndCBzdXBwb3J0IHRocmVhZGVkIG9wZXJhdGlvbiwgc28gYWx3YXlzIGZvcmNlCiAgICAgICAgIyBGYWxzZSBhcyB0aGUgdGhyZWFkZWQgYXJnLgogICAgICAgIExvY2tCYXNlLl9faW5pdF9fKHNlbGYsIHBhdGgsIEZhbHNlLCB0aW1lb3V0KQogICAgICAgIHNlbGYudW5pcXVlX25hbWUgPSBzZWxmLnBhdGgKCiAgICBkZWYgcmVhZF9waWQoc2VsZik6CiAgICAgICAgIiIiIEdldCB0aGUgUElEIGZyb20gdGhlIGxvY2sgZmlsZS4KICAgICAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHJlYWRfcGlkX2Zyb21fcGlkZmlsZShzZWxmLnBhdGgpCgogICAgZGVmIGlzX2xvY2tlZChzZWxmKToKICAgICAgICAiIiIgVGVzdCBpZiB0aGUgbG9jayBpcyBjdXJyZW50bHkgaGVsZC4KCiAgICAgICAgICAgIFRoZSBsb2NrIGlzIGhlbGQgaWYgdGhlIFBJRCBmaWxlIGZvciB0aGlzIGxvY2sgZXhpc3RzLgoKICAgICAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKHNlbGYucGF0aCkKCiAgICBkZWYgaV9hbV9sb2NraW5nKHNlbGYpOgogICAgICAgICIiIiBUZXN0IGlmIHRoZSBsb2NrIGlzIGhlbGQgYnkgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KCiAgICAgICAgUmV0dXJucyBgYFRydWVgYCBpZiB0aGUgY3VycmVudCBwcm9jZXNzIElEIG1hdGNoZXMgdGhlCiAgICAgICAgbnVtYmVyIHN0b3JlZCBpbiB0aGUgUElEIGZpbGUuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuaXNfbG9ja2VkKCkgYW5kIG9zLmdldHBpZCgpID09IHNlbGYucmVhZF9waWQoKQoKICAgIGRlZiBhY3F1aXJlKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgIiIiIEFjcXVpcmUgdGhlIGxvY2suCgogICAgICAgIENyZWF0ZXMgdGhlIFBJRCBmaWxlIGZvciB0aGlzIGxvY2ssIG9yIHJhaXNlcyBhbiBlcnJvciBpZgogICAgICAgIHRoZSBsb2NrIGNvdWxkIG5vdCBiZSBhY3F1aXJlZC4KICAgICAgICAiIiIKCiAgICAgICAgdGltZW91dCA9IHRpbWVvdXQgaWYgdGltZW91dCBpcyBub3QgTm9uZSBlbHNlIHNlbGYudGltZW91dAogICAgICAgIGVuZF90aW1lID0gdGltZS50aW1lKCkKICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lb3V0ID4gMDoKICAgICAgICAgICAgZW5kX3RpbWUgKz0gdGltZW91dAoKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB3cml0ZV9waWRfdG9fcGlkZmlsZShzZWxmLnBhdGgpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKICAgICAgICAgICAgICAgIGlmIGV4Yy5lcnJubyA9PSBlcnJuby5FRVhJU1Q6CiAgICAgICAgICAgICAgICAgICAgIyBUaGUgbG9jayBjcmVhdGlvbiBmYWlsZWQuICBNYXliZSBzbGVlcCBhIGJpdC4KICAgICAgICAgICAgICAgICAgICBpZiB0aW1lLnRpbWUoKSA+IGVuZF90aW1lOgogICAgICAgICAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lb3V0ID4gMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIExvY2tUaW1lb3V0KCJUaW1lb3V0IHdhaXRpbmcgdG8gYWNxdWlyZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbG9jayBmb3IgJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFscmVhZHlMb2NrZWQoIiVzIGlzIGFscmVhZHkgbG9ja2VkIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aCkKICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHRpbWVvdXQgaXMgbm90IE5vbmUgYW5kIHRpbWVvdXQgLyAxMCBvciAwLjEpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIExvY2tGYWlsZWQoImZhaWxlZCB0byBjcmVhdGUgJXMiICUgc2VsZi5wYXRoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgZGVmIHJlbGVhc2Uoc2VsZik6CiAgICAgICAgIiIiIFJlbGVhc2UgdGhlIGxvY2suCgogICAgICAgICAgICBSZW1vdmVzIHRoZSBQSUQgZmlsZSB0byByZWxlYXNlIHRoZSBsb2NrLCBvciByYWlzZXMgYW4KICAgICAgICAgICAgZXJyb3IgaWYgdGhlIGN1cnJlbnQgcHJvY2VzcyBkb2VzIG5vdCBob2xkIHRoZSBsb2NrLgoKICAgICAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuaXNfbG9ja2VkKCk6CiAgICAgICAgICAgIHJhaXNlIE5vdExvY2tlZCgiJXMgaXMgbm90IGxvY2tlZCIgJSBzZWxmLnBhdGgpCiAgICAgICAgaWYgbm90IHNlbGYuaV9hbV9sb2NraW5nKCk6CiAgICAgICAgICAgIHJhaXNlIE5vdE15TG9jaygiJXMgaXMgbG9ja2VkLCBidXQgbm90IGJ5IG1lIiAlIHNlbGYucGF0aCkKICAgICAgICByZW1vdmVfZXhpc3RpbmdfcGlkZmlsZShzZWxmLnBhdGgpCgogICAgZGVmIGJyZWFrX2xvY2soc2VsZik6CiAgICAgICAgIiIiIEJyZWFrIGFuIGV4aXN0aW5nIGxvY2suCgogICAgICAgICAgICBSZW1vdmVzIHRoZSBQSUQgZmlsZSBpZiBpdCBhbHJlYWR5IGV4aXN0cywgb3RoZXJ3aXNlIGRvZXMKICAgICAgICAgICAgbm90aGluZy4KCiAgICAgICAgICAgICIiIgogICAgICAgIHJlbW92ZV9leGlzdGluZ19waWRmaWxlKHNlbGYucGF0aCkKCgpkZWYgcmVhZF9waWRfZnJvbV9waWRmaWxlKHBpZGZpbGVfcGF0aCk6CiAgICAiIiIgUmVhZCB0aGUgUElEIHJlY29yZGVkIGluIHRoZSBuYW1lZCBQSUQgZmlsZS4KCiAgICAgICAgUmVhZCBhbmQgcmV0dXJuIHRoZSBudW1lcmljIFBJRCByZWNvcmRlZCBhcyB0ZXh0IGluIHRoZSBuYW1lZAogICAgICAgIFBJRCBmaWxlLiBJZiB0aGUgUElEIGZpbGUgY2Fubm90IGJlIHJlYWQsIG9yIGlmIHRoZSBjb250ZW50IGlzCiAgICAgICAgbm90IGEgdmFsaWQgUElELCByZXR1cm4gYGBOb25lYGAuCgogICAgICAgICIiIgogICAgcGlkID0gTm9uZQogICAgdHJ5OgogICAgICAgIHBpZGZpbGUgPSBvcGVuKHBpZGZpbGVfcGF0aCwgJ3InKQogICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICAjIEFjY29yZGluZyB0byB0aGUgRkhTIDIuMyBzZWN0aW9uIG9uIFBJRCBmaWxlcyBpbiAvdmFyL3J1bjoKICAgICAgICAjCiAgICAgICAgIyAgIFRoZSBmaWxlIG11c3QgY29uc2lzdCBvZiB0aGUgcHJvY2VzcyBpZGVudGlmaWVyIGluCiAgICAgICAgIyAgIEFTQ0lJLWVuY29kZWQgZGVjaW1hbCwgZm9sbG93ZWQgYnkgYSBuZXdsaW5lIGNoYXJhY3Rlci4KICAgICAgICAjCiAgICAgICAgIyAgIFByb2dyYW1zIHRoYXQgcmVhZCBQSUQgZmlsZXMgc2hvdWxkIGJlIHNvbWV3aGF0IGZsZXhpYmxlCiAgICAgICAgIyAgIGluIHdoYXQgdGhleSBhY2NlcHQ7IGkuZS4sIHRoZXkgc2hvdWxkIGlnbm9yZSBleHRyYQogICAgICAgICMgICB3aGl0ZXNwYWNlLCBsZWFkaW5nIHplcm9lcywgYWJzZW5jZSBvZiB0aGUgdHJhaWxpbmcKICAgICAgICAjICAgbmV3bGluZSwgb3IgYWRkaXRpb25hbCBsaW5lcyBpbiB0aGUgUElEIGZpbGUuCgogICAgICAgIGxpbmUgPSBwaWRmaWxlLnJlYWRsaW5lKCkuc3RyaXAoKQogICAgICAgIHRyeToKICAgICAgICAgICAgcGlkID0gaW50KGxpbmUpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBwaWRmaWxlLmNsb3NlKCkKCiAgICByZXR1cm4gcGlkCgoKZGVmIHdyaXRlX3BpZF90b19waWRmaWxlKHBpZGZpbGVfcGF0aCk6CiAgICAiIiIgV3JpdGUgdGhlIFBJRCBpbiB0aGUgbmFtZWQgUElEIGZpbGUuCgogICAgICAgIEdldCB0aGUgbnVtZXJpYyBwcm9jZXNzIElEICjigJxQSUTigJ0pIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MKICAgICAgICBhbmQgd3JpdGUgaXQgdG8gdGhlIG5hbWVkIGZpbGUgYXMgYSBsaW5lIG9mIHRleHQuCgogICAgICAgICIiIgogICAgb3Blbl9mbGFncyA9IChvcy5PX0NSRUFUIHwgb3MuT19FWENMIHwgb3MuT19XUk9OTFkpCiAgICBvcGVuX21vZGUgPSAwbzY0NAogICAgcGlkZmlsZV9mZCA9IG9zLm9wZW4ocGlkZmlsZV9wYXRoLCBvcGVuX2ZsYWdzLCBvcGVuX21vZGUpCiAgICBwaWRmaWxlID0gb3MuZmRvcGVuKHBpZGZpbGVfZmQsICd3JykKCiAgICAjIEFjY29yZGluZyB0byB0aGUgRkhTIDIuMyBzZWN0aW9uIG9uIFBJRCBmaWxlcyBpbiAvdmFyL3J1bjoKICAgICMKICAgICMgICBUaGUgZmlsZSBtdXN0IGNvbnNpc3Qgb2YgdGhlIHByb2Nlc3MgaWRlbnRpZmllciBpbgogICAgIyAgIEFTQ0lJLWVuY29kZWQgZGVjaW1hbCwgZm9sbG93ZWQgYnkgYSBuZXdsaW5lIGNoYXJhY3Rlci4gRm9yCiAgICAjICAgZXhhbXBsZSwgaWYgY3JvbmQgd2FzIHByb2Nlc3MgbnVtYmVyIDI1LCAvdmFyL3J1bi9jcm9uZC5waWQKICAgICMgICB3b3VsZCBjb250YWluIHRocmVlIGNoYXJhY3RlcnM6IHR3bywgZml2ZSwgYW5kIG5ld2xpbmUuCgogICAgcGlkID0gb3MuZ2V0cGlkKCkKICAgIHBpZGZpbGUud3JpdGUoIiVzXG4iICUgcGlkKQogICAgcGlkZmlsZS5jbG9zZSgpCgoKZGVmIHJlbW92ZV9leGlzdGluZ19waWRmaWxlKHBpZGZpbGVfcGF0aCk6CiAgICAiIiIgUmVtb3ZlIHRoZSBuYW1lZCBQSUQgZmlsZSBpZiBpdCBleGlzdHMuCgogICAgICAgIFJlbW92aW5nIGEgUElEIGZpbGUgdGhhdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QgcHV0cyB1cyBpbiB0aGUKICAgICAgICBkZXNpcmVkIHN0YXRlLCBzbyB3ZSBpZ25vcmUgdGhlIGNvbmRpdGlvbiBpZiB0aGUgZmlsZSBkb2VzIG5vdAogICAgICAgIGV4aXN0LgoKICAgICAgICAiIiIKICAgIHRyeToKICAgICAgICBvcy5yZW1vdmUocGlkZmlsZV9wYXRoKQogICAgZXhjZXB0IE9TRXJyb3IgYXMgZXhjOgogICAgICAgIGlmIGV4Yy5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZQpQSwMEFAAAAAAAAAAhALuF8L2CFQAAghUAADYAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvc3FsaXRlbG9ja2ZpbGUucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24KCmltcG9ydCB0aW1lCmltcG9ydCBvcwoKdHJ5OgogICAgdW5pY29kZQpleGNlcHQgTmFtZUVycm9yOgogICAgdW5pY29kZSA9IHN0cgoKZnJvbSAuIGltcG9ydCBMb2NrQmFzZSwgTm90TG9ja2VkLCBOb3RNeUxvY2ssIExvY2tUaW1lb3V0LCBBbHJlYWR5TG9ja2VkCgoKY2xhc3MgU1FMaXRlTG9ja0ZpbGUoTG9ja0Jhc2UpOgogICAgIkRlbW9uc3RyYXRlIFNRTC1iYXNlZCBsb2NraW5nLiIKCiAgICB0ZXN0ZGIgPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIHRocmVhZGVkPVRydWUsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgPj4+IGxvY2sgPSBTUUxpdGVMb2NrRmlsZSgnc29tZWZpbGUnKQogICAgICAgID4+PiBsb2NrID0gU1FMaXRlTG9ja0ZpbGUoJ3NvbWVmaWxlJywgdGhyZWFkZWQ9RmFsc2UpCiAgICAgICAgIiIiCiAgICAgICAgTG9ja0Jhc2UuX19pbml0X18oc2VsZiwgcGF0aCwgdGhyZWFkZWQsIHRpbWVvdXQpCiAgICAgICAgc2VsZi5sb2NrX2ZpbGUgPSB1bmljb2RlKHNlbGYubG9ja19maWxlKQogICAgICAgIHNlbGYudW5pcXVlX25hbWUgPSB1bmljb2RlKHNlbGYudW5pcXVlX25hbWUpCgogICAgICAgIGlmIFNRTGl0ZUxvY2tGaWxlLnRlc3RkYiBpcyBOb25lOgogICAgICAgICAgICBpbXBvcnQgdGVtcGZpbGUKICAgICAgICAgICAgX2ZkLCB0ZXN0ZGIgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKICAgICAgICAgICAgb3MuY2xvc2UoX2ZkKQogICAgICAgICAgICBvcy51bmxpbmsodGVzdGRiKQogICAgICAgICAgICBkZWwgX2ZkLCB0ZW1wZmlsZQogICAgICAgICAgICBTUUxpdGVMb2NrRmlsZS50ZXN0ZGIgPSB0ZXN0ZGIKCiAgICAgICAgaW1wb3J0IHNxbGl0ZTMKICAgICAgICBzZWxmLmNvbm5lY3Rpb24gPSBzcWxpdGUzLmNvbm5lY3QoU1FMaXRlTG9ja0ZpbGUudGVzdGRiKQoKICAgICAgICBjID0gc2VsZi5jb25uZWN0aW9uLmN1cnNvcigpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBsb2NrcyIKICAgICAgICAgICAgICAgICAgICAgICIoIgogICAgICAgICAgICAgICAgICAgICAgIiAgIGxvY2tfZmlsZSB2YXJjaGFyKDMyKSwiCiAgICAgICAgICAgICAgICAgICAgICAiICAgdW5pcXVlX25hbWUgdmFyY2hhcigzMikiCiAgICAgICAgICAgICAgICAgICAgICAiKSIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZTMuT3BlcmF0aW9uYWxFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY29ubmVjdGlvbi5jb21taXQoKQogICAgICAgICAgICBpbXBvcnQgYXRleGl0CiAgICAgICAgICAgIGF0ZXhpdC5yZWdpc3Rlcihvcy51bmxpbmssIFNRTGl0ZUxvY2tGaWxlLnRlc3RkYikKCiAgICBkZWYgYWNxdWlyZShzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgIHRpbWVvdXQgPSB0aW1lb3V0IGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgZWxzZSBzZWxmLnRpbWVvdXQKICAgICAgICBlbmRfdGltZSA9IHRpbWUudGltZSgpCiAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZW91dCA+IDA6CiAgICAgICAgICAgIGVuZF90aW1lICs9IHRpbWVvdXQKCiAgICAgICAgaWYgdGltZW91dCBpcyBOb25lOgogICAgICAgICAgICB3YWl0ID0gMC4xCiAgICAgICAgZWxpZiB0aW1lb3V0IDw9IDA6CiAgICAgICAgICAgIHdhaXQgPSAwCiAgICAgICAgZWxzZToKICAgICAgICAgICAgd2FpdCA9IHRpbWVvdXQgLyAxMAoKICAgICAgICBjdXJzb3IgPSBzZWxmLmNvbm5lY3Rpb24uY3Vyc29yKCkKCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfbG9ja2VkKCk6CiAgICAgICAgICAgICAgICAjIE5vdCBsb2NrZWQuICBUcnkgdG8gbG9jayBpdC4KICAgICAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKCJpbnNlcnQgaW50byBsb2NrcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIChsb2NrX2ZpbGUsIHVuaXF1ZV9uYW1lKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHZhbHVlcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICg/LCA/KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5sb2NrX2ZpbGUsIHNlbGYudW5pcXVlX25hbWUpKQogICAgICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbW1pdCgpCgogICAgICAgICAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgd2UgYXJlIHRoZSBvbmx5IGxvY2sgaG9sZGVyLgogICAgICAgICAgICAgICAgY3Vyc29yLmV4ZWN1dGUoInNlbGVjdCAqIGZyb20gbG9ja3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB3aGVyZSB1bmlxdWVfbmFtZSA9ID8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYudW5pcXVlX25hbWUsKSkKICAgICAgICAgICAgICAgIHJvd3MgPSBjdXJzb3IuZmV0Y2hhbGwoKQogICAgICAgICAgICAgICAgaWYgbGVuKHJvd3MpID4gMToKICAgICAgICAgICAgICAgICAgICAjIE5vcGUuICBTb21lb25lIGVsc2UgZ290IHRoZXJlLiAgUmVtb3ZlIG91ciBsb2NrLgogICAgICAgICAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKCJkZWxldGUgZnJvbSBsb2NrcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB3aGVyZSB1bmlxdWVfbmFtZSA9ID8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnVuaXF1ZV9uYW1lLCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbW1pdCgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgWXVwLiAgV2UncmUgZG9uZSwgc28gZ28gaG9tZS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSB0aGUgb25seSBsb2NrIGhvbGRlci4KICAgICAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIGxvY2tzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgd2hlcmUgdW5pcXVlX25hbWUgPSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnVuaXF1ZV9uYW1lLCkpCiAgICAgICAgICAgICAgICByb3dzID0gY3Vyc29yLmZldGNoYWxsKCkKICAgICAgICAgICAgICAgIGlmIGxlbihyb3dzKSA9PSAxOgogICAgICAgICAgICAgICAgICAgICMgV2UncmUgdGhlIGxvY2tlciwgc28gZ28gaG9tZS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgICMgTWF5YmUgd2Ugc2hvdWxkIHdhaXQgYSBiaXQgbG9uZ2VyLgogICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lLnRpbWUoKSA+IGVuZF90aW1lOgogICAgICAgICAgICAgICAgaWYgdGltZW91dCA+IDA6CiAgICAgICAgICAgICAgICAgICAgIyBObyBtb3JlIHdhaXRpbmcuCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgTG9ja1RpbWVvdXQoIlRpbWVvdXQgd2FpdGluZyB0byBhY3F1aXJlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbG9jayBmb3IgJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgU29tZW9uZSBlbHNlIGhhcyB0aGUgbG9jayBhbmQgd2UgYXJlIGltcGF0aWVudC4uCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgQWxyZWFkeUxvY2tlZCgiJXMgaXMgYWxyZWFkeSBsb2NrZWQiICUgc2VsZi5wYXRoKQoKICAgICAgICAgICAgIyBXZWxsLCBva2F5LiAgV2UnbGwgZ2l2ZSBpdCBhIGJpdCBsb25nZXIuCiAgICAgICAgICAgIHRpbWUuc2xlZXAod2FpdCkKCiAgICBkZWYgcmVsZWFzZShzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5pc19sb2NrZWQoKToKICAgICAgICAgICAgcmFpc2UgTm90TG9ja2VkKCIlcyBpcyBub3QgbG9ja2VkIiAlIHNlbGYucGF0aCkKICAgICAgICBpZiBub3Qgc2VsZi5pX2FtX2xvY2tpbmcoKToKICAgICAgICAgICAgcmFpc2UgTm90TXlMb2NrKCIlcyBpcyBsb2NrZWQsIGJ1dCBub3QgYnkgbWUgKGJ5ICVzKSIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYudW5pcXVlX25hbWUsIHNlbGYuX3dob19pc19sb2NraW5nKCkpKQogICAgICAgIGN1cnNvciA9IHNlbGYuY29ubmVjdGlvbi5jdXJzb3IoKQogICAgICAgIGN1cnNvci5leGVjdXRlKCJkZWxldGUgZnJvbSBsb2NrcyIKICAgICAgICAgICAgICAgICAgICAgICAiICB3aGVyZSB1bmlxdWVfbmFtZSA9ID8iLAogICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnVuaXF1ZV9uYW1lLCkpCiAgICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbW1pdCgpCgogICAgZGVmIF93aG9faXNfbG9ja2luZyhzZWxmKToKICAgICAgICBjdXJzb3IgPSBzZWxmLmNvbm5lY3Rpb24uY3Vyc29yKCkKICAgICAgICBjdXJzb3IuZXhlY3V0ZSgic2VsZWN0IHVuaXF1ZV9uYW1lIGZyb20gbG9ja3MiCiAgICAgICAgICAgICAgICAgICAgICAgIiAgd2hlcmUgbG9ja19maWxlID0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYubG9ja19maWxlLCkpCiAgICAgICAgcmV0dXJuIGN1cnNvci5mZXRjaG9uZSgpWzBdCgogICAgZGVmIGlzX2xvY2tlZChzZWxmKToKICAgICAgICBjdXJzb3IgPSBzZWxmLmNvbm5lY3Rpb24uY3Vyc29yKCkKICAgICAgICBjdXJzb3IuZXhlY3V0ZSgic2VsZWN0ICogZnJvbSBsb2NrcyIKICAgICAgICAgICAgICAgICAgICAgICAiICB3aGVyZSBsb2NrX2ZpbGUgPSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5sb2NrX2ZpbGUsKSkKICAgICAgICByb3dzID0gY3Vyc29yLmZldGNoYWxsKCkKICAgICAgICByZXR1cm4gbm90IG5vdCByb3dzCgogICAgZGVmIGlfYW1fbG9ja2luZyhzZWxmKToKICAgICAgICBjdXJzb3IgPSBzZWxmLmNvbm5lY3Rpb24uY3Vyc29yKCkKICAgICAgICBjdXJzb3IuZXhlY3V0ZSgic2VsZWN0ICogZnJvbSBsb2NrcyIKICAgICAgICAgICAgICAgICAgICAgICAiICB3aGVyZSBsb2NrX2ZpbGUgPSA/IgogICAgICAgICAgICAgICAgICAgICAgICIgICAgYW5kIHVuaXF1ZV9uYW1lID0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYubG9ja19maWxlLCBzZWxmLnVuaXF1ZV9uYW1lKSkKICAgICAgICByZXR1cm4gbm90IG5vdCBjdXJzb3IuZmV0Y2hhbGwoKQoKICAgIGRlZiBicmVha19sb2NrKHNlbGYpOgogICAgICAgIGN1cnNvciA9IHNlbGYuY29ubmVjdGlvbi5jdXJzb3IoKQogICAgICAgIGN1cnNvci5leGVjdXRlKCJkZWxldGUgZnJvbSBsb2NrcyIKICAgICAgICAgICAgICAgICAgICAgICAiICB3aGVyZSBsb2NrX2ZpbGUgPSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5sb2NrX2ZpbGUsKSkKICAgICAgICBzZWxmLmNvbm5lY3Rpb24uY29tbWl0KCkKUEsDBBQAAAAAAAAAIQCRIwnZOAoAADgKAAA3AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL3N5bWxpbmtsb2NrZmlsZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgb3MKaW1wb3J0IHRpbWUKCmZyb20gLiBpbXBvcnQgKExvY2tCYXNlLCBOb3RMb2NrZWQsIE5vdE15TG9jaywgTG9ja1RpbWVvdXQsCiAgICAgICAgICAgICAgIEFscmVhZHlMb2NrZWQpCgoKY2xhc3MgU3ltbGlua0xvY2tGaWxlKExvY2tCYXNlKToKICAgICIiIkxvY2sgYWNjZXNzIHRvIGEgZmlsZSB1c2luZyBzeW1saW5rKDIpLiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCB0aHJlYWRlZD1UcnVlLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICMgc3VwZXIoU3ltbGlua0xvY2tGaWxlKS5fX2luaXQoLi4uKQogICAgICAgIExvY2tCYXNlLl9faW5pdF9fKHNlbGYsIHBhdGgsIHRocmVhZGVkLCB0aW1lb3V0KQogICAgICAgICMgc3BsaXQgaXQgYmFjayEKICAgICAgICBzZWxmLnVuaXF1ZV9uYW1lID0gb3MucGF0aC5zcGxpdChzZWxmLnVuaXF1ZV9uYW1lKVsxXQoKICAgIGRlZiBhY3F1aXJlKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgIyBIb3BlZnVsbHkgdW5uZWNlc3NhcnkgZm9yIHN5bWxpbmsuCiAgICAgICAgIyB0cnk6CiAgICAgICAgIyAgICAgb3BlbihzZWxmLnVuaXF1ZV9uYW1lLCAid2IiKS5jbG9zZSgpCiAgICAgICAgIyBleGNlcHQgSU9FcnJvcjoKICAgICAgICAjICAgICByYWlzZSBMb2NrRmFpbGVkKCJmYWlsZWQgdG8gY3JlYXRlICVzIiAlIHNlbGYudW5pcXVlX25hbWUpCiAgICAgICAgdGltZW91dCA9IHRpbWVvdXQgaWYgdGltZW91dCBpcyBub3QgTm9uZSBlbHNlIHNlbGYudGltZW91dAogICAgICAgIGVuZF90aW1lID0gdGltZS50aW1lKCkKICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lb3V0ID4gMDoKICAgICAgICAgICAgZW5kX3RpbWUgKz0gdGltZW91dAoKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAjIFRyeSBhbmQgY3JlYXRlIGEgc3ltYm9saWMgbGluayB0byBpdC4KICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3Muc3ltbGluayhzZWxmLnVuaXF1ZV9uYW1lLCBzZWxmLmxvY2tfZmlsZSkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICAjIExpbmsgY3JlYXRpb24gZmFpbGVkLiAgTWF5YmUgd2UndmUgZG91YmxlLWxvY2tlZD8KICAgICAgICAgICAgICAgIGlmIHNlbGYuaV9hbV9sb2NraW5nKCk6CiAgICAgICAgICAgICAgICAgICAgIyBMaW5rZWQgdG8gb3V0IHVuaXF1ZSBuYW1lLiBQcm9jZWVkLgogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIE90aGVyd2lzZSB0aGUgbG9jayBjcmVhdGlvbiBmYWlsZWQuCiAgICAgICAgICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZS50aW1lKCkgPiBlbmRfdGltZToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGltZW91dCA+IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBMb2NrVGltZW91dCgiVGltZW91dCB3YWl0aW5nIHRvIGFjcXVpcmUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGxvY2sgZm9yICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBBbHJlYWR5TG9ja2VkKCIlcyBpcyBhbHJlYWR5IGxvY2tlZCIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCh0aW1lb3V0IC8gMTAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBlbHNlIDAuMSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgTGluayBjcmVhdGlvbiBzdWNjZWVkZWQuICBXZSdyZSBnb29kIHRvIGdvLgogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgZGVmIHJlbGVhc2Uoc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYuaXNfbG9ja2VkKCk6CiAgICAgICAgICAgIHJhaXNlIE5vdExvY2tlZCgiJXMgaXMgbm90IGxvY2tlZCIgJSBzZWxmLnBhdGgpCiAgICAgICAgZWxpZiBub3Qgc2VsZi5pX2FtX2xvY2tpbmcoKToKICAgICAgICAgICAgcmFpc2UgTm90TXlMb2NrKCIlcyBpcyBsb2NrZWQsIGJ1dCBub3QgYnkgbWUiICUgc2VsZi5wYXRoKQogICAgICAgIG9zLnVubGluayhzZWxmLmxvY2tfZmlsZSkKCiAgICBkZWYgaXNfbG9ja2VkKHNlbGYpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmlzbGluayhzZWxmLmxvY2tfZmlsZSkKCiAgICBkZWYgaV9hbV9sb2NraW5nKHNlbGYpOgogICAgICAgIHJldHVybiAob3MucGF0aC5pc2xpbmsoc2VsZi5sb2NrX2ZpbGUpCiAgICAgICAgICAgICAgICBhbmQgb3MucmVhZGxpbmsoc2VsZi5sb2NrX2ZpbGUpID09IHNlbGYudW5pcXVlX25hbWUpCgogICAgZGVmIGJyZWFrX2xvY2soc2VsZik6CiAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsoc2VsZi5sb2NrX2ZpbGUpOiAgIyBleGlzdHMgJiYgbGluawogICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5sb2NrX2ZpbGUpClBLAwQUAAAAAAAAACEA1lIZI/4PAAD+DwAAKgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9vcmRlcmVkZGljdC5weSMgQ29weXJpZ2h0IChjKSAyMDA5IFJheW1vbmQgSGV0dGluZ2VyCiMKIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgojIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCiMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKIyBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAojIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCiMgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKIyBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIwojICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQojICAgICBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KIwojICAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKIyAgICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCiMgICAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECiMgICAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCiMgICAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAojICAgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKIyAgICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgojICAgICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgpmcm9tIFVzZXJEaWN0IGltcG9ydCBEaWN0TWl4aW4KCmNsYXNzIE9yZGVyZWREaWN0KGRpY3QsIERpY3RNaXhpbik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3ZHMpOgogICAgICAgIGlmIGxlbihhcmdzKSA+IDE6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignZXhwZWN0ZWQgYXQgbW9zdCAxIGFyZ3VtZW50cywgZ290ICVkJyAlIGxlbihhcmdzKSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX19lbmQKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHNlbGYuY2xlYXIoKQogICAgICAgIHNlbGYudXBkYXRlKCphcmdzLCAqKmt3ZHMpCgogICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgIHNlbGYuX19lbmQgPSBlbmQgPSBbXQogICAgICAgIGVuZCArPSBbTm9uZSwgZW5kLCBlbmRdICAgICAgICAgIyBzZW50aW5lbCBub2RlIGZvciBkb3VibHkgbGlua2VkIGxpc3QKICAgICAgICBzZWxmLl9fbWFwID0ge30gICAgICAgICAgICAgICAgICMga2V5IC0tPiBba2V5LCBwcmV2LCBuZXh0XQogICAgICAgIGRpY3QuY2xlYXIoc2VsZikKCiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgaWYga2V5IG5vdCBpbiBzZWxmOgogICAgICAgICAgICBlbmQgPSBzZWxmLl9fZW5kCiAgICAgICAgICAgIGN1cnIgPSBlbmRbMV0KICAgICAgICAgICAgY3VyclsyXSA9IGVuZFsxXSA9IHNlbGYuX19tYXBba2V5XSA9IFtrZXksIGN1cnIsIGVuZF0KICAgICAgICBkaWN0Ll9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpCgogICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgZGljdC5fX2RlbGl0ZW1fXyhzZWxmLCBrZXkpCiAgICAgICAga2V5LCBwcmV2LCBuZXh0ID0gc2VsZi5fX21hcC5wb3Aoa2V5KQogICAgICAgIHByZXZbMl0gPSBuZXh0CiAgICAgICAgbmV4dFsxXSA9IHByZXYKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgZW5kID0gc2VsZi5fX2VuZAogICAgICAgIGN1cnIgPSBlbmRbMl0KICAgICAgICB3aGlsZSBjdXJyIGlzIG5vdCBlbmQ6CiAgICAgICAgICAgIHlpZWxkIGN1cnJbMF0KICAgICAgICAgICAgY3VyciA9IGN1cnJbMl0KCiAgICBkZWYgX19yZXZlcnNlZF9fKHNlbGYpOgogICAgICAgIGVuZCA9IHNlbGYuX19lbmQKICAgICAgICBjdXJyID0gZW5kWzFdCiAgICAgICAgd2hpbGUgY3VyciBpcyBub3QgZW5kOgogICAgICAgICAgICB5aWVsZCBjdXJyWzBdCiAgICAgICAgICAgIGN1cnIgPSBjdXJyWzFdCgogICAgZGVmIHBvcGl0ZW0oc2VsZiwgbGFzdD1UcnVlKToKICAgICAgICBpZiBub3Qgc2VsZjoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ2RpY3Rpb25hcnkgaXMgZW1wdHknKQogICAgICAgIGlmIGxhc3Q6CiAgICAgICAgICAgIGtleSA9IHJldmVyc2VkKHNlbGYpLm5leHQoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGtleSA9IGl0ZXIoc2VsZikubmV4dCgpCiAgICAgICAgdmFsdWUgPSBzZWxmLnBvcChrZXkpCiAgICAgICAgcmV0dXJuIGtleSwgdmFsdWUKCiAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKICAgICAgICBpdGVtcyA9IFtbaywgc2VsZltrXV0gZm9yIGsgaW4gc2VsZl0KICAgICAgICB0bXAgPSBzZWxmLl9fbWFwLCBzZWxmLl9fZW5kCiAgICAgICAgZGVsIHNlbGYuX19tYXAsIHNlbGYuX19lbmQKICAgICAgICBpbnN0X2RpY3QgPSB2YXJzKHNlbGYpLmNvcHkoKQogICAgICAgIHNlbGYuX19tYXAsIHNlbGYuX19lbmQgPSB0bXAKICAgICAgICBpZiBpbnN0X2RpY3Q6CiAgICAgICAgICAgIHJldHVybiAoc2VsZi5fX2NsYXNzX18sIChpdGVtcywpLCBpbnN0X2RpY3QpCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLCAoaXRlbXMsKQoKICAgIGRlZiBrZXlzKHNlbGYpOgogICAgICAgIHJldHVybiBsaXN0KHNlbGYpCgogICAgc2V0ZGVmYXVsdCA9IERpY3RNaXhpbi5zZXRkZWZhdWx0CiAgICB1cGRhdGUgPSBEaWN0TWl4aW4udXBkYXRlCiAgICBwb3AgPSBEaWN0TWl4aW4ucG9wCiAgICB2YWx1ZXMgPSBEaWN0TWl4aW4udmFsdWVzCiAgICBpdGVtcyA9IERpY3RNaXhpbi5pdGVtcwogICAgaXRlcmtleXMgPSBEaWN0TWl4aW4uaXRlcmtleXMKICAgIGl0ZXJ2YWx1ZXMgPSBEaWN0TWl4aW4uaXRlcnZhbHVlcwogICAgaXRlcml0ZW1zID0gRGljdE1peGluLml0ZXJpdGVtcwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZjoKICAgICAgICAgICAgcmV0dXJuICclcygpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywpCiAgICAgICAgcmV0dXJuICclcyglciknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLml0ZW1zKCkpCgogICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbWtleXMoY2xzLCBpdGVyYWJsZSwgdmFsdWU9Tm9uZSk6CiAgICAgICAgZCA9IGNscygpCiAgICAgICAgZm9yIGtleSBpbiBpdGVyYWJsZToKICAgICAgICAgICAgZFtrZXldID0gdmFsdWUKICAgICAgICByZXR1cm4gZAoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIE9yZGVyZWREaWN0KToKICAgICAgICAgICAgaWYgbGVuKHNlbGYpICE9IGxlbihvdGhlcik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgZm9yIHAsIHEgaW4gIHppcChzZWxmLml0ZW1zKCksIG90aGVyLml0ZW1zKCkpOgogICAgICAgICAgICAgICAgaWYgcCAhPSBxOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBkaWN0Ll9fZXFfXyhzZWxmLCBvdGhlcikKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKUEsDBBQAAAAAAAAAIQA8KVjG0AIAANACAAAyAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9fX2Fib3V0X18ucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgpfX2FsbF9fID0gWwogICAgIl9fdGl0bGVfXyIsICJfX3N1bW1hcnlfXyIsICJfX3VyaV9fIiwgIl9fdmVyc2lvbl9fIiwgIl9fYXV0aG9yX18iLAogICAgIl9fZW1haWxfXyIsICJfX2xpY2Vuc2VfXyIsICJfX2NvcHlyaWdodF9fIiwKXQoKX190aXRsZV9fID0gInBhY2thZ2luZyIKX19zdW1tYXJ5X18gPSAiQ29yZSB1dGlsaXRpZXMgZm9yIFB5dGhvbiBwYWNrYWdlcyIKX191cmlfXyA9ICJodHRwczovL2dpdGh1Yi5jb20vcHlwYS9wYWNrYWdpbmciCgpfX3ZlcnNpb25fXyA9ICIxNi44IgoKX19hdXRob3JfXyA9ICJEb25hbGQgU3R1ZmZ0IGFuZCBpbmRpdmlkdWFsIGNvbnRyaWJ1dG9ycyIKX19lbWFpbF9fID0gImRvbmFsZEBzdHVmZnQuaW8iCgpfX2xpY2Vuc2VfXyA9ICJCU0Qgb3IgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIgpfX2NvcHlyaWdodF9fID0gIkNvcHlyaWdodCAyMDE0LTIwMTYgJXMiICUgX19hdXRob3JfXwpQSwMEFAAAAAAAAAAhAIF2lsoBAgAAAQIAADEAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL19faW5pdF9fLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKZnJvbSAuX19hYm91dF9fIGltcG9ydCAoCiAgICBfX2F1dGhvcl9fLCBfX2NvcHlyaWdodF9fLCBfX2VtYWlsX18sIF9fbGljZW5zZV9fLCBfX3N1bW1hcnlfXywgX190aXRsZV9fLAogICAgX191cmlfXywgX192ZXJzaW9uX18KKQoKX19hbGxfXyA9IFsKICAgICJfX3RpdGxlX18iLCAiX19zdW1tYXJ5X18iLCAiX191cmlfXyIsICJfX3ZlcnNpb25fXyIsICJfX2F1dGhvcl9fIiwKICAgICJfX2VtYWlsX18iLCAiX19saWNlbnNlX18iLCAiX19jb3B5cmlnaHRfXyIsCl0KUEsDBBQAAAAAAAAAIQDmaUrjXAMAAFwDAAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9fY29tcGF0LnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IHN5cwoKClBZMiA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMgpQWTMgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDMKCiMgZmxha2U4OiBub3FhCgppZiBQWTM6CiAgICBzdHJpbmdfdHlwZXMgPSBzdHIsCmVsc2U6CiAgICBzdHJpbmdfdHlwZXMgPSBiYXNlc3RyaW5nLAoKCmRlZiB3aXRoX21ldGFjbGFzcyhtZXRhLCAqYmFzZXMpOgogICAgIiIiCiAgICBDcmVhdGUgYSBiYXNlIGNsYXNzIHdpdGggYSBtZXRhY2xhc3MuCiAgICAiIiIKICAgICMgVGhpcyByZXF1aXJlcyBhIGJpdCBvZiBleHBsYW5hdGlvbjogdGhlIGJhc2ljIGlkZWEgaXMgdG8gbWFrZSBhIGR1bW15CiAgICAjIG1ldGFjbGFzcyBmb3Igb25lIGxldmVsIG9mIGNsYXNzIGluc3RhbnRpYXRpb24gdGhhdCByZXBsYWNlcyBpdHNlbGYgd2l0aAogICAgIyB0aGUgYWN0dWFsIG1ldGFjbGFzcy4KICAgIGNsYXNzIG1ldGFjbGFzcyhtZXRhKToKICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIHRoaXNfYmFzZXMsIGQpOgogICAgICAgICAgICByZXR1cm4gbWV0YShuYW1lLCBiYXNlcywgZCkKICAgIHJldHVybiB0eXBlLl9fbmV3X18obWV0YWNsYXNzLCAndGVtcG9yYXJ5X2NsYXNzJywgKCksIHt9KQpQSwMEFAAAAAAAAAAhAPr9pBKIBQAAiAUAADQAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL19zdHJ1Y3R1cmVzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKCmNsYXNzIEluZmluaXR5KG9iamVjdCk6CgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiSW5maW5pdHkiCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHJlcHIoc2VsZikpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX25lZ19fKHNlbGYpOgogICAgICAgIHJldHVybiBOZWdhdGl2ZUluZmluaXR5CgpJbmZpbml0eSA9IEluZmluaXR5KCkKCgpjbGFzcyBOZWdhdGl2ZUluZmluaXR5KG9iamVjdCk6CgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiLUluZmluaXR5IgoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChyZXByKHNlbGYpKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19uZWdfXyhzZWxmKToKICAgICAgICByZXR1cm4gSW5maW5pdHkKCk5lZ2F0aXZlSW5maW5pdHkgPSBOZWdhdGl2ZUluZmluaXR5KCkKUEsDBBQAAAAAAAAAIQB9LCtXJiAAACYgAAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBvcwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHN5cwoKZnJvbSBwaXAuX3ZlbmRvci5weXBhcnNpbmcgaW1wb3J0ICgKICAgIFBhcnNlRXhjZXB0aW9uLCBQYXJzZVJlc3VsdHMsIHN0cmluZ1N0YXJ0LCBzdHJpbmdFbmQsCikKZnJvbSBwaXAuX3ZlbmRvci5weXBhcnNpbmcgaW1wb3J0IFplcm9Pck1vcmUsIEdyb3VwLCBGb3J3YXJkLCBRdW90ZWRTdHJpbmcKZnJvbSBwaXAuX3ZlbmRvci5weXBhcnNpbmcgaW1wb3J0IExpdGVyYWwgYXMgTCAgIyBub3FhCgpmcm9tIC5fY29tcGF0IGltcG9ydCBzdHJpbmdfdHlwZXMKZnJvbSAuc3BlY2lmaWVycyBpbXBvcnQgU3BlY2lmaWVyLCBJbnZhbGlkU3BlY2lmaWVyCgoKX19hbGxfXyA9IFsKICAgICJJbnZhbGlkTWFya2VyIiwgIlVuZGVmaW5lZENvbXBhcmlzb24iLCAiVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lIiwKICAgICJNYXJrZXIiLCAiZGVmYXVsdF9lbnZpcm9ubWVudCIsCl0KCgpjbGFzcyBJbnZhbGlkTWFya2VyKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIG1hcmtlciB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNTA4LgogICAgIiIiCgoKY2xhc3MgVW5kZWZpbmVkQ29tcGFyaXNvbihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIHZhbHVlIHRoYXQgZG9lc24ndCBzdXBwb3J0IGl0LgogICAgIiIiCgoKY2xhc3MgVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBIG5hbWUgd2FzIGF0dGVtcHRlZCB0byBiZSB1c2VkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW5zaWRlIG9mIHRoZQogICAgZW52aXJvbm1lbnQuCiAgICAiIiIKCgpjbGFzcyBOb2RlKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYudmFsdWUpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPHswfSh7MSFyfSk+Ii5mb3JtYXQoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHN0cihzZWxmKSkKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCgpjbGFzcyBWYXJpYWJsZShOb2RlKToKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikKCgpjbGFzcyBWYWx1ZShOb2RlKToKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiAnInswfSInLmZvcm1hdChzZWxmKQoKCmNsYXNzIE9wKE5vZGUpOgoKICAgIGRlZiBzZXJpYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmKQoKClZBUklBQkxFID0gKAogICAgTCgiaW1wbGVtZW50YXRpb25fdmVyc2lvbiIpIHwKICAgIEwoInBsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbiIpIHwKICAgIEwoImltcGxlbWVudGF0aW9uX25hbWUiKSB8CiAgICBMKCJweXRob25fZnVsbF92ZXJzaW9uIikgfAogICAgTCgicGxhdGZvcm1fcmVsZWFzZSIpIHwKICAgIEwoInBsYXRmb3JtX3ZlcnNpb24iKSB8CiAgICBMKCJwbGF0Zm9ybV9tYWNoaW5lIikgfAogICAgTCgicGxhdGZvcm1fc3lzdGVtIikgfAogICAgTCgicHl0aG9uX3ZlcnNpb24iKSB8CiAgICBMKCJzeXNfcGxhdGZvcm0iKSB8CiAgICBMKCJvc19uYW1lIikgfAogICAgTCgib3MubmFtZSIpIHwgICMgUEVQLTM0NQogICAgTCgic3lzLnBsYXRmb3JtIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJwbGF0Zm9ybS52ZXJzaW9uIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJwbGF0Zm9ybS5tYWNoaW5lIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24iKSB8ICAjIFBFUC0zNDUKICAgIEwoInB5dGhvbl9pbXBsZW1lbnRhdGlvbiIpIHwgICMgdW5kb2N1bWVudGVkIHNldHVwdG9vbHMgbGVnYWN5CiAgICBMKCJleHRyYSIpCikKQUxJQVNFUyA9IHsKICAgICdvcy5uYW1lJzogJ29zX25hbWUnLAogICAgJ3N5cy5wbGF0Zm9ybSc6ICdzeXNfcGxhdGZvcm0nLAogICAgJ3BsYXRmb3JtLnZlcnNpb24nOiAncGxhdGZvcm1fdmVyc2lvbicsCiAgICAncGxhdGZvcm0ubWFjaGluZSc6ICdwbGF0Zm9ybV9tYWNoaW5lJywKICAgICdwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24nOiAncGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uJywKICAgICdweXRob25faW1wbGVtZW50YXRpb24nOiAncGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uJwp9ClZBUklBQkxFLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiBWYXJpYWJsZShBTElBU0VTLmdldCh0WzBdLCB0WzBdKSkpCgpWRVJTSU9OX0NNUCA9ICgKICAgIEwoIj09PSIpIHwKICAgIEwoIj09IikgfAogICAgTCgiPj0iKSB8CiAgICBMKCI8PSIpIHwKICAgIEwoIiE9IikgfAogICAgTCgifj0iKSB8CiAgICBMKCI+IikgfAogICAgTCgiPCIpCikKCk1BUktFUl9PUCA9IFZFUlNJT05fQ01QIHwgTCgibm90IGluIikgfCBMKCJpbiIpCk1BUktFUl9PUC5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogT3AodFswXSkpCgpNQVJLRVJfVkFMVUUgPSBRdW90ZWRTdHJpbmcoIiciKSB8IFF1b3RlZFN0cmluZygnIicpCk1BUktFUl9WQUxVRS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogVmFsdWUodFswXSkpCgpCT09MT1AgPSBMKCJhbmQiKSB8IEwoIm9yIikKCk1BUktFUl9WQVIgPSBWQVJJQUJMRSB8IE1BUktFUl9WQUxVRQoKTUFSS0VSX0lURU0gPSBHcm91cChNQVJLRVJfVkFSICsgTUFSS0VSX09QICsgTUFSS0VSX1ZBUikKTUFSS0VSX0lURU0uc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IHR1cGxlKHRbMF0pKQoKTFBBUkVOID0gTCgiKCIpLnN1cHByZXNzKCkKUlBBUkVOID0gTCgiKSIpLnN1cHByZXNzKCkKCk1BUktFUl9FWFBSID0gRm9yd2FyZCgpCk1BUktFUl9BVE9NID0gTUFSS0VSX0lURU0gfCBHcm91cChMUEFSRU4gKyBNQVJLRVJfRVhQUiArIFJQQVJFTikKTUFSS0VSX0VYUFIgPDwgTUFSS0VSX0FUT00gKyBaZXJvT3JNb3JlKEJPT0xPUCArIE1BUktFUl9FWFBSKQoKTUFSS0VSID0gc3RyaW5nU3RhcnQgKyBNQVJLRVJfRVhQUiArIHN0cmluZ0VuZAoKCmRlZiBfY29lcmNlX3BhcnNlX3Jlc3VsdChyZXN1bHRzKToKICAgIGlmIGlzaW5zdGFuY2UocmVzdWx0cywgUGFyc2VSZXN1bHRzKToKICAgICAgICByZXR1cm4gW19jb2VyY2VfcGFyc2VfcmVzdWx0KGkpIGZvciBpIGluIHJlc3VsdHNdCiAgICBlbHNlOgogICAgICAgIHJldHVybiByZXN1bHRzCgoKZGVmIF9mb3JtYXRfbWFya2VyKG1hcmtlciwgZmlyc3Q9VHJ1ZSk6CiAgICBhc3NlcnQgaXNpbnN0YW5jZShtYXJrZXIsIChsaXN0LCB0dXBsZSwgc3RyaW5nX3R5cGVzKSkKCiAgICAjIFNvbWV0aW1lcyB3ZSBoYXZlIGEgc3RydWN0dXJlIGxpa2UgW1suLi5dXSB3aGljaCBpcyBhIHNpbmdsZSBpdGVtIGxpc3QKICAgICMgd2hlcmUgdGhlIHNpbmdsZSBpdGVtIGlzIGl0c2VsZiBpdCdzIG93biBsaXN0LiBJbiB0aGF0IGNhc2Ugd2Ugd2FudCBza2lwCiAgICAjIHRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gc28gdGhhdCB3ZSBkb24ndCBnZXQgZXh0cmFuZW91cyAoKSBvbiB0aGUKICAgICMgb3V0c2lkZS4KICAgIGlmIChpc2luc3RhbmNlKG1hcmtlciwgbGlzdCkgYW5kIGxlbihtYXJrZXIpID09IDEgYW5kCiAgICAgICAgICAgIGlzaW5zdGFuY2UobWFya2VyWzBdLCAobGlzdCwgdHVwbGUpKSk6CiAgICAgICAgcmV0dXJuIF9mb3JtYXRfbWFya2VyKG1hcmtlclswXSkKCiAgICBpZiBpc2luc3RhbmNlKG1hcmtlciwgbGlzdCk6CiAgICAgICAgaW5uZXIgPSAoX2Zvcm1hdF9tYXJrZXIobSwgZmlyc3Q9RmFsc2UpIGZvciBtIGluIG1hcmtlcikKICAgICAgICBpZiBmaXJzdDoKICAgICAgICAgICAgcmV0dXJuICIgIi5qb2luKGlubmVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAiKCIgKyAiICIuam9pbihpbm5lcikgKyAiKSIKICAgIGVsaWYgaXNpbnN0YW5jZShtYXJrZXIsIHR1cGxlKToKICAgICAgICByZXR1cm4gIiAiLmpvaW4oW20uc2VyaWFsaXplKCkgZm9yIG0gaW4gbWFya2VyXSkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIG1hcmtlcgoKCl9vcGVyYXRvcnMgPSB7CiAgICAiaW4iOiBsYW1iZGEgbGhzLCByaHM6IGxocyBpbiByaHMsCiAgICAibm90IGluIjogbGFtYmRhIGxocywgcmhzOiBsaHMgbm90IGluIHJocywKICAgICI8Ijogb3BlcmF0b3IubHQsCiAgICAiPD0iOiBvcGVyYXRvci5sZSwKICAgICI9PSI6IG9wZXJhdG9yLmVxLAogICAgIiE9Ijogb3BlcmF0b3IubmUsCiAgICAiPj0iOiBvcGVyYXRvci5nZSwKICAgICI+Ijogb3BlcmF0b3IuZ3QsCn0KCgpkZWYgX2V2YWxfb3AobGhzLCBvcCwgcmhzKToKICAgIHRyeToKICAgICAgICBzcGVjID0gU3BlY2lmaWVyKCIiLmpvaW4oW29wLnNlcmlhbGl6ZSgpLCByaHNdKSkKICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHNwZWMuY29udGFpbnMobGhzKQoKICAgIG9wZXIgPSBfb3BlcmF0b3JzLmdldChvcC5zZXJpYWxpemUoKSkKICAgIGlmIG9wZXIgaXMgTm9uZToKICAgICAgICByYWlzZSBVbmRlZmluZWRDb21wYXJpc29uKAogICAgICAgICAgICAiVW5kZWZpbmVkIHswIXJ9IG9uIHsxIXJ9IGFuZCB7MiFyfS4iLmZvcm1hdChvcCwgbGhzLCByaHMpCiAgICAgICAgKQoKICAgIHJldHVybiBvcGVyKGxocywgcmhzKQoKCl91bmRlZmluZWQgPSBvYmplY3QoKQoKCmRlZiBfZ2V0X2VudihlbnZpcm9ubWVudCwgbmFtZSk6CiAgICB2YWx1ZSA9IGVudmlyb25tZW50LmdldChuYW1lLCBfdW5kZWZpbmVkKQoKICAgIGlmIHZhbHVlIGlzIF91bmRlZmluZWQ6CiAgICAgICAgcmFpc2UgVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lKAogICAgICAgICAgICAiezAhcn0gZG9lcyBub3QgZXhpc3QgaW4gZXZhbHVhdGlvbiBlbnZpcm9ubWVudC4iLmZvcm1hdChuYW1lKQogICAgICAgICkKCiAgICByZXR1cm4gdmFsdWUKCgpkZWYgX2V2YWx1YXRlX21hcmtlcnMobWFya2VycywgZW52aXJvbm1lbnQpOgogICAgZ3JvdXBzID0gW1tdXQoKICAgIGZvciBtYXJrZXIgaW4gbWFya2VyczoKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShtYXJrZXIsIChsaXN0LCB0dXBsZSwgc3RyaW5nX3R5cGVzKSkKCiAgICAgICAgaWYgaXNpbnN0YW5jZShtYXJrZXIsIGxpc3QpOgogICAgICAgICAgICBncm91cHNbLTFdLmFwcGVuZChfZXZhbHVhdGVfbWFya2VycyhtYXJrZXIsIGVudmlyb25tZW50KSkKICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWFya2VyLCB0dXBsZSk6CiAgICAgICAgICAgIGxocywgb3AsIHJocyA9IG1hcmtlcgoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShsaHMsIFZhcmlhYmxlKToKICAgICAgICAgICAgICAgIGxoc192YWx1ZSA9IF9nZXRfZW52KGVudmlyb25tZW50LCBsaHMudmFsdWUpCiAgICAgICAgICAgICAgICByaHNfdmFsdWUgPSByaHMudmFsdWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxoc192YWx1ZSA9IGxocy52YWx1ZQogICAgICAgICAgICAgICAgcmhzX3ZhbHVlID0gX2dldF9lbnYoZW52aXJvbm1lbnQsIHJocy52YWx1ZSkKCiAgICAgICAgICAgIGdyb3Vwc1stMV0uYXBwZW5kKF9ldmFsX29wKGxoc192YWx1ZSwgb3AsIHJoc192YWx1ZSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXNzZXJ0IG1hcmtlciBpbiBbImFuZCIsICJvciJdCiAgICAgICAgICAgIGlmIG1hcmtlciA9PSAib3IiOgogICAgICAgICAgICAgICAgZ3JvdXBzLmFwcGVuZChbXSkKCiAgICByZXR1cm4gYW55KGFsbChpdGVtKSBmb3IgaXRlbSBpbiBncm91cHMpCgoKZGVmIGZvcm1hdF9mdWxsX3ZlcnNpb24oaW5mbyk6CiAgICB2ZXJzaW9uID0gJ3swLm1ham9yfS57MC5taW5vcn0uezAubWljcm99Jy5mb3JtYXQoaW5mbykKICAgIGtpbmQgPSBpbmZvLnJlbGVhc2VsZXZlbAogICAgaWYga2luZCAhPSAnZmluYWwnOgogICAgICAgIHZlcnNpb24gKz0ga2luZFswXSArIHN0cihpbmZvLnNlcmlhbCkKICAgIHJldHVybiB2ZXJzaW9uCgoKZGVmIGRlZmF1bHRfZW52aXJvbm1lbnQoKToKICAgIGlmIGhhc2F0dHIoc3lzLCAnaW1wbGVtZW50YXRpb24nKToKICAgICAgICBpdmVyID0gZm9ybWF0X2Z1bGxfdmVyc2lvbihzeXMuaW1wbGVtZW50YXRpb24udmVyc2lvbikKICAgICAgICBpbXBsZW1lbnRhdGlvbl9uYW1lID0gc3lzLmltcGxlbWVudGF0aW9uLm5hbWUKICAgIGVsc2U6CiAgICAgICAgaXZlciA9ICcwJwogICAgICAgIGltcGxlbWVudGF0aW9uX25hbWUgPSAnJwoKICAgIHJldHVybiB7CiAgICAgICAgImltcGxlbWVudGF0aW9uX25hbWUiOiBpbXBsZW1lbnRhdGlvbl9uYW1lLAogICAgICAgICJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIjogaXZlciwKICAgICAgICAib3NfbmFtZSI6IG9zLm5hbWUsCiAgICAgICAgInBsYXRmb3JtX21hY2hpbmUiOiBwbGF0Zm9ybS5tYWNoaW5lKCksCiAgICAgICAgInBsYXRmb3JtX3JlbGVhc2UiOiBwbGF0Zm9ybS5yZWxlYXNlKCksCiAgICAgICAgInBsYXRmb3JtX3N5c3RlbSI6IHBsYXRmb3JtLnN5c3RlbSgpLAogICAgICAgICJwbGF0Zm9ybV92ZXJzaW9uIjogcGxhdGZvcm0udmVyc2lvbigpLAogICAgICAgICJweXRob25fZnVsbF92ZXJzaW9uIjogcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKSwKICAgICAgICAicGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uIjogcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCksCiAgICAgICAgInB5dGhvbl92ZXJzaW9uIjogcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKVs6M10sCiAgICAgICAgInN5c19wbGF0Zm9ybSI6IHN5cy5wbGF0Zm9ybSwKICAgIH0KCgpjbGFzcyBNYXJrZXIob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWFya2VyKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX21hcmtlcnMgPSBfY29lcmNlX3BhcnNlX3Jlc3VsdChNQVJLRVIucGFyc2VTdHJpbmcobWFya2VyKSkKICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgZXJyX3N0ciA9ICJJbnZhbGlkIG1hcmtlcjogezAhcn0sIHBhcnNlIGVycm9yIGF0IHsxIXJ9Ii5mb3JtYXQoCiAgICAgICAgICAgICAgICBtYXJrZXIsIG1hcmtlcltlLmxvYzplLmxvYyArIDhdKQogICAgICAgICAgICByYWlzZSBJbnZhbGlkTWFya2VyKGVycl9zdHIpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIF9mb3JtYXRfbWFya2VyKHNlbGYuX21hcmtlcnMpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPE1hcmtlcih7MCFyfSk+Ii5mb3JtYXQoc3RyKHNlbGYpKQoKICAgIGRlZiBldmFsdWF0ZShzZWxmLCBlbnZpcm9ubWVudD1Ob25lKToKICAgICAgICAiIiJFdmFsdWF0ZSBhIG1hcmtlci4KCiAgICAgICAgUmV0dXJuIHRoZSBib29sZWFuIGZyb20gZXZhbHVhdGluZyB0aGUgZ2l2ZW4gbWFya2VyIGFnYWluc3QgdGhlCiAgICAgICAgZW52aXJvbm1lbnQuIGVudmlyb25tZW50IGlzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRvIG92ZXJyaWRlIGFsbCBvcgogICAgICAgIHBhcnQgb2YgdGhlIGRldGVybWluZWQgZW52aXJvbm1lbnQuCgogICAgICAgIFRoZSBlbnZpcm9ubWVudCBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGN1cnJlbnQgUHl0aG9uIHByb2Nlc3MuCiAgICAgICAgIiIiCiAgICAgICAgY3VycmVudF9lbnZpcm9ubWVudCA9IGRlZmF1bHRfZW52aXJvbm1lbnQoKQogICAgICAgIGlmIGVudmlyb25tZW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICBjdXJyZW50X2Vudmlyb25tZW50LnVwZGF0ZShlbnZpcm9ubWVudCkKCiAgICAgICAgcmV0dXJuIF9ldmFsdWF0ZV9tYXJrZXJzKHNlbGYuX21hcmtlcnMsIGN1cnJlbnRfZW52aXJvbm1lbnQpClBLAwQUAAAAAAAAACEArhGf8+cQAADnEAAANQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvcmVxdWlyZW1lbnRzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IHN0cmluZwppbXBvcnQgcmUKCmZyb20gcGlwLl92ZW5kb3IucHlwYXJzaW5nIGltcG9ydCAoCiAgICBzdHJpbmdTdGFydCwgc3RyaW5nRW5kLCBvcmlnaW5hbFRleHRGb3IsIFBhcnNlRXhjZXB0aW9uCikKZnJvbSBwaXAuX3ZlbmRvci5weXBhcnNpbmcgaW1wb3J0IFplcm9Pck1vcmUsIFdvcmQsIE9wdGlvbmFsLCBSZWdleCwgQ29tYmluZQpmcm9tIHBpcC5fdmVuZG9yLnB5cGFyc2luZyBpbXBvcnQgTGl0ZXJhbCBhcyBMICAjIG5vcWEKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMudXJsbGliIGltcG9ydCBwYXJzZSBhcyB1cmxwYXJzZQoKZnJvbSAubWFya2VycyBpbXBvcnQgTUFSS0VSX0VYUFIsIE1hcmtlcgpmcm9tIC5zcGVjaWZpZXJzIGltcG9ydCBMZWdhY3lTcGVjaWZpZXIsIFNwZWNpZmllciwgU3BlY2lmaWVyU2V0CgoKY2xhc3MgSW52YWxpZFJlcXVpcmVtZW50KFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIHJlcXVpcmVtZW50IHdhcyBmb3VuZCwgdXNlcnMgc2hvdWxkIHJlZmVyIHRvIFBFUCA1MDguCiAgICAiIiIKCgpBTFBIQU5VTSA9IFdvcmQoc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzKQoKTEJSQUNLRVQgPSBMKCJbIikuc3VwcHJlc3MoKQpSQlJBQ0tFVCA9IEwoIl0iKS5zdXBwcmVzcygpCkxQQVJFTiA9IEwoIigiKS5zdXBwcmVzcygpClJQQVJFTiA9IEwoIikiKS5zdXBwcmVzcygpCkNPTU1BID0gTCgiLCIpLnN1cHByZXNzKCkKU0VNSUNPTE9OID0gTCgiOyIpLnN1cHByZXNzKCkKQVQgPSBMKCJAIikuc3VwcHJlc3MoKQoKUFVOQ1RVQVRJT04gPSBXb3JkKCItXy4iKQpJREVOVElGSUVSX0VORCA9IEFMUEhBTlVNIHwgKFplcm9Pck1vcmUoUFVOQ1RVQVRJT04pICsgQUxQSEFOVU0pCklERU5USUZJRVIgPSBDb21iaW5lKEFMUEhBTlVNICsgWmVyb09yTW9yZShJREVOVElGSUVSX0VORCkpCgpOQU1FID0gSURFTlRJRklFUigibmFtZSIpCkVYVFJBID0gSURFTlRJRklFUgoKVVJJID0gUmVnZXgocidbXiBdKycpKCJ1cmwiKQpVUkwgPSAoQVQgKyBVUkkpCgpFWFRSQVNfTElTVCA9IEVYVFJBICsgWmVyb09yTW9yZShDT01NQSArIEVYVFJBKQpFWFRSQVMgPSAoTEJSQUNLRVQgKyBPcHRpb25hbChFWFRSQVNfTElTVCkgKyBSQlJBQ0tFVCkoImV4dHJhcyIpCgpWRVJTSU9OX1BFUDQ0MCA9IFJlZ2V4KFNwZWNpZmllci5fcmVnZXhfc3RyLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKVkVSU0lPTl9MRUdBQ1kgPSBSZWdleChMZWdhY3lTcGVjaWZpZXIuX3JlZ2V4X3N0ciwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpCgpWRVJTSU9OX09ORSA9IFZFUlNJT05fUEVQNDQwIF4gVkVSU0lPTl9MRUdBQ1kKVkVSU0lPTl9NQU5ZID0gQ29tYmluZShWRVJTSU9OX09ORSArIFplcm9Pck1vcmUoQ09NTUEgKyBWRVJTSU9OX09ORSksCiAgICAgICAgICAgICAgICAgICAgICAgam9pblN0cmluZz0iLCIsIGFkamFjZW50PUZhbHNlKSgiX3Jhd19zcGVjIikKX1ZFUlNJT05fU1BFQyA9IE9wdGlvbmFsKCgoTFBBUkVOICsgVkVSU0lPTl9NQU5ZICsgUlBBUkVOKSB8IFZFUlNJT05fTUFOWSkpCl9WRVJTSU9OX1NQRUMuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IHQuX3Jhd19zcGVjIG9yICcnKQoKVkVSU0lPTl9TUEVDID0gb3JpZ2luYWxUZXh0Rm9yKF9WRVJTSU9OX1NQRUMpKCJzcGVjaWZpZXIiKQpWRVJTSU9OX1NQRUMuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IHRbMV0pCgpNQVJLRVJfRVhQUiA9IG9yaWdpbmFsVGV4dEZvcihNQVJLRVJfRVhQUigpKSgibWFya2VyIikKTUFSS0VSX0VYUFIuc2V0UGFyc2VBY3Rpb24oCiAgICBsYW1iZGEgcywgbCwgdDogTWFya2VyKHNbdC5fb3JpZ2luYWxfc3RhcnQ6dC5fb3JpZ2luYWxfZW5kXSkKKQpNQVJLRVJfU0VQRVJBVE9SID0gU0VNSUNPTE9OCk1BUktFUiA9IE1BUktFUl9TRVBFUkFUT1IgKyBNQVJLRVJfRVhQUgoKVkVSU0lPTl9BTkRfTUFSS0VSID0gVkVSU0lPTl9TUEVDICsgT3B0aW9uYWwoTUFSS0VSKQpVUkxfQU5EX01BUktFUiA9IFVSTCArIE9wdGlvbmFsKE1BUktFUikKCk5BTUVEX1JFUVVJUkVNRU5UID0gXAogICAgTkFNRSArIE9wdGlvbmFsKEVYVFJBUykgKyAoVVJMX0FORF9NQVJLRVIgfCBWRVJTSU9OX0FORF9NQVJLRVIpCgpSRVFVSVJFTUVOVCA9IHN0cmluZ1N0YXJ0ICsgTkFNRURfUkVRVUlSRU1FTlQgKyBzdHJpbmdFbmQKCgpjbGFzcyBSZXF1aXJlbWVudChvYmplY3QpOgogICAgIiIiUGFyc2UgYSByZXF1aXJlbWVudC4KCiAgICBQYXJzZSBhIGdpdmVuIHJlcXVpcmVtZW50IHN0cmluZyBpbnRvIGl0cyBwYXJ0cywgc3VjaCBhcyBuYW1lLCBzcGVjaWZpZXIsCiAgICBVUkwsIGFuZCBleHRyYXMuIFJhaXNlcyBJbnZhbGlkUmVxdWlyZW1lbnQgb24gYSBiYWRseS1mb3JtZWQgcmVxdWlyZW1lbnQKICAgIHN0cmluZy4KICAgICIiIgoKICAgICMgVE9ETzogQ2FuIHdlIHRlc3Qgd2hldGhlciBzb21ldGhpbmcgaXMgY29udGFpbmVkIHdpdGhpbiBhIHJlcXVpcmVtZW50PwogICAgIyAgICAgICBJZiBzbyBob3cgZG8gd2UgZG8gdGhhdD8gRG8gd2UgbmVlZCB0byB0ZXN0IGFnYWluc3QgdGhlIF9uYW1lXyBvZgogICAgIyAgICAgICB0aGUgdGhpbmcgYXMgd2VsbCBhcyB0aGUgdmVyc2lvbj8gV2hhdCBhYm91dCB0aGUgbWFya2Vycz8KICAgICMgVE9ETzogQ2FuIHdlIG5vcm1hbGl6ZSB0aGUgbmFtZSBhbmQgZXh0cmEgbmFtZT8KCiAgICBkZWYgX19pbml0X18oc2VsZiwgcmVxdWlyZW1lbnRfc3RyaW5nKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlcSA9IFJFUVVJUkVNRU5ULnBhcnNlU3RyaW5nKHJlcXVpcmVtZW50X3N0cmluZykKICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFJlcXVpcmVtZW50KAogICAgICAgICAgICAgICAgIkludmFsaWQgcmVxdWlyZW1lbnQsIHBhcnNlIGVycm9yIGF0IFwiezAhcn1cIiIuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3N0cmluZ1tlLmxvYzplLmxvYyArIDhdKSkKCiAgICAgICAgc2VsZi5uYW1lID0gcmVxLm5hbWUKICAgICAgICBpZiByZXEudXJsOgogICAgICAgICAgICBwYXJzZWRfdXJsID0gdXJscGFyc2UudXJscGFyc2UocmVxLnVybCkKICAgICAgICAgICAgaWYgbm90IChwYXJzZWRfdXJsLnNjaGVtZSBhbmQgcGFyc2VkX3VybC5uZXRsb2MpIG9yICgKICAgICAgICAgICAgICAgICAgICBub3QgcGFyc2VkX3VybC5zY2hlbWUgYW5kIG5vdCBwYXJzZWRfdXJsLm5ldGxvYyk6CiAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkUmVxdWlyZW1lbnQoIkludmFsaWQgVVJMIGdpdmVuIikKICAgICAgICAgICAgc2VsZi51cmwgPSByZXEudXJsCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi51cmwgPSBOb25lCiAgICAgICAgc2VsZi5leHRyYXMgPSBzZXQocmVxLmV4dHJhcy5hc0xpc3QoKSBpZiByZXEuZXh0cmFzIGVsc2UgW10pCiAgICAgICAgc2VsZi5zcGVjaWZpZXIgPSBTcGVjaWZpZXJTZXQocmVxLnNwZWNpZmllcikKICAgICAgICBzZWxmLm1hcmtlciA9IHJlcS5tYXJrZXIgaWYgcmVxLm1hcmtlciBlbHNlIE5vbmUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBwYXJ0cyA9IFtzZWxmLm5hbWVdCgogICAgICAgIGlmIHNlbGYuZXh0cmFzOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIlt7MH1dIi5mb3JtYXQoIiwiLmpvaW4oc29ydGVkKHNlbGYuZXh0cmFzKSkpKQoKICAgICAgICBpZiBzZWxmLnNwZWNpZmllcjoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKHN0cihzZWxmLnNwZWNpZmllcikpCgogICAgICAgIGlmIHNlbGYudXJsOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIkAgezB9Ii5mb3JtYXQoc2VsZi51cmwpKQoKICAgICAgICBpZiBzZWxmLm1hcmtlcjoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCI7IHswfSIuZm9ybWF0KHNlbGYubWFya2VyKSkKCiAgICAgICAgcmV0dXJuICIiLmpvaW4ocGFydHMpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPFJlcXVpcmVtZW50KHswIXJ9KT4iLmZvcm1hdChzdHIoc2VsZikpClBLAwQUAAAAAAAAACEAfEWDjHltAAB5bQAAMwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvc3BlY2lmaWVycy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBhYmMKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCByZQoKZnJvbSAuX2NvbXBhdCBpbXBvcnQgc3RyaW5nX3R5cGVzLCB3aXRoX21ldGFjbGFzcwpmcm9tIC52ZXJzaW9uIGltcG9ydCBWZXJzaW9uLCBMZWdhY3lWZXJzaW9uLCBwYXJzZQoKCmNsYXNzIEludmFsaWRTcGVjaWZpZXIoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgc3BlY2lmaWVyIHdhcyBmb3VuZCwgdXNlcnMgc2hvdWxkIHJlZmVyIHRvIFBFUCA0NDAuCiAgICAiIiIKCgpjbGFzcyBCYXNlU3BlY2lmaWVyKHdpdGhfbWV0YWNsYXNzKGFiYy5BQkNNZXRhLCBvYmplY3QpKToKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHRoZSBzdHIgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBTcGVjaWZpZXIgbGlrZSBvYmplY3QuIFRoaXMKICAgICAgICBzaG91bGQgYmUgcmVwcmVzZW50YXRpdmUgb2YgdGhlIFNwZWNpZmllciBpdHNlbGYuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBoYXNoIHZhbHVlIGZvciB0aGlzIFNwZWNpZmllciBsaWtlIG9iamVjdC4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgYm9vbGVhbiByZXByZXNlbnRpbmcgd2hldGhlciBvciBub3QgdGhlIHR3byBTcGVjaWZpZXIgbGlrZQogICAgICAgIG9iamVjdHMgYXJlIGVxdWFsLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBib29sZWFuIHJlcHJlc2VudGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgdHdvIFNwZWNpZmllciBsaWtlCiAgICAgICAgb2JqZWN0cyBhcmUgbm90IGVxdWFsLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3Rwcm9wZXJ0eQogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgd2hldGhlciBvciBub3QgcHJlLXJlbGVhc2VzIGFzIGEgd2hvbGUgYXJlIGFsbG93ZWQgYnkgdGhpcwogICAgICAgIHNwZWNpZmllci4KICAgICAgICAiIiIKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIgogICAgICAgIFNldHMgd2hldGhlciBvciBub3QgcHJlLXJlbGVhc2VzIGFzIGEgd2hvbGUgYXJlIGFsbG93ZWQgYnkgdGhpcwogICAgICAgIHNwZWNpZmllci4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgY29udGFpbnMoc2VsZiwgaXRlbSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gaXRlbSBpcyBjb250YWluZWQgd2l0aGluIHRoaXMgc3BlY2lmaWVyLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBmaWx0ZXIoc2VsZiwgaXRlcmFibGUsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFRha2VzIGFuIGl0ZXJhYmxlIG9mIGl0ZW1zIGFuZCBmaWx0ZXJzIHRoZW0gc28gdGhhdCBvbmx5IGl0ZW1zIHdoaWNoCiAgICAgICAgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBzcGVjaWZpZXIgYXJlIGFsbG93ZWQgaW4gaXQuCiAgICAgICAgIiIiCgoKY2xhc3MgX0luZGl2aWR1YWxTcGVjaWZpZXIoQmFzZVNwZWNpZmllcik6CgogICAgX29wZXJhdG9ycyA9IHt9CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNwZWM9IiIsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgIG1hdGNoID0gc2VsZi5fcmVnZXguc2VhcmNoKHNwZWMpCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkU3BlY2lmaWVyKCJJbnZhbGlkIHNwZWNpZmllcjogJ3swfSciLmZvcm1hdChzcGVjKSkKCiAgICAgICAgc2VsZi5fc3BlYyA9ICgKICAgICAgICAgICAgbWF0Y2guZ3JvdXAoIm9wZXJhdG9yIikuc3RyaXAoKSwKICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInZlcnNpb24iKS5zdHJpcCgpLAogICAgICAgICkKCiAgICAgICAgIyBTdG9yZSB3aGV0aGVyIG9yIG5vdCB0aGlzIFNwZWNpZmllciBzaG91bGQgYWNjZXB0IHByZXJlbGVhc2VzCiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSBwcmVyZWxlYXNlcwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICBwcmUgPSAoCiAgICAgICAgICAgICIsIHByZXJlbGVhc2VzPXswIXJ9Ii5mb3JtYXQoc2VsZi5wcmVyZWxlYXNlcykKICAgICAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmUKICAgICAgICAgICAgZWxzZSAiIgogICAgICAgICkKCiAgICAgICAgcmV0dXJuICI8ezB9KHsxIXJ9ezJ9KT4iLmZvcm1hdCgKICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sCiAgICAgICAgICAgIHN0cihzZWxmKSwKICAgICAgICAgICAgcHJlLAogICAgICAgICkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gInswfXsxfSIuZm9ybWF0KCpzZWxmLl9zcGVjKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9zcGVjKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG90aGVyID0gc2VsZi5fX2NsYXNzX18ob3RoZXIpCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWMgPT0gb3RoZXIuX3NwZWMKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvdGhlciA9IHNlbGYuX19jbGFzc19fKG90aGVyKQogICAgICAgICAgICBleGNlcHQgSW52YWxpZFNwZWNpZmllcjoKICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjICE9IG90aGVyLl9zcGVjCgogICAgZGVmIF9nZXRfb3BlcmF0b3Ioc2VsZiwgb3ApOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsICJfY29tcGFyZV97MH0iLmZvcm1hdChzZWxmLl9vcGVyYXRvcnNbb3BdKSkKCiAgICBkZWYgX2NvZXJjZV92ZXJzaW9uKHNlbGYsIHZlcnNpb24pOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZlcnNpb24sIChMZWdhY3lWZXJzaW9uLCBWZXJzaW9uKSk6CiAgICAgICAgICAgIHZlcnNpb24gPSBwYXJzZSh2ZXJzaW9uKQogICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgQHByb3BlcnR5CiAgICBkZWYgb3BlcmF0b3Ioc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiB2ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjWzFdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXJlbGVhc2VzCgogICAgQHByZXJlbGVhc2VzLnNldHRlcgogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHZhbHVlCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKICAgICAgICByZXR1cm4gc2VsZi5jb250YWlucyhpdGVtKQoKICAgIGRlZiBjb250YWlucyhzZWxmLCBpdGVtLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAjIERldGVybWluZSBpZiBwcmVyZWxlYXNlcyBhcmUgdG8gYmUgYWxsb3dlZCBvciBub3QuCiAgICAgICAgaWYgcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgcHJlcmVsZWFzZXMgPSBzZWxmLnByZXJlbGVhc2VzCgogICAgICAgICMgTm9ybWFsaXplIGl0ZW0gdG8gYSBWZXJzaW9uIG9yIExlZ2FjeVZlcnNpb24sIHRoaXMgYWxsb3dzIHVzIHRvIGhhdmUKICAgICAgICAjIGEgc2hvcnRjdXQgZm9yIGBgIjIuMCIgaW4gU3BlY2lmaWVyKCI+PTIiKQogICAgICAgIGl0ZW0gPSBzZWxmLl9jb2VyY2VfdmVyc2lvbihpdGVtKQoKICAgICAgICAjIERldGVybWluZSBpZiB3ZSBzaG91bGQgYmUgc3VwcG9ydGluZyBwcmVyZWxlYXNlcyBpbiB0aGlzIHNwZWNpZmllcgogICAgICAgICMgb3Igbm90LCBpZiB3ZSBkbyBub3Qgc3VwcG9ydCBwcmVyZWxlYXNlcyB0aGFuIHdlIGNhbiBzaG9ydCBjaXJjdWl0CiAgICAgICAgIyBsb2dpYyBpZiB0aGlzIHZlcnNpb24gaXMgYSBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBpdGVtLmlzX3ByZXJlbGVhc2UgYW5kIG5vdCBwcmVyZWxlYXNlczoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgQWN0dWFsbHkgZG8gdGhlIGNvbXBhcmlzb24gdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXRlbSBpcyBjb250YWluZWQKICAgICAgICAjIHdpdGhpbiB0aGlzIFNwZWNpZmllciBvciBub3QuCiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9vcGVyYXRvcihzZWxmLm9wZXJhdG9yKShpdGVtLCBzZWxmLnZlcnNpb24pCgogICAgZGVmIGZpbHRlcihzZWxmLCBpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgeWllbGRlZCA9IEZhbHNlCiAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMgPSBbXQoKICAgICAgICBrdyA9IHsicHJlcmVsZWFzZXMiOiBwcmVyZWxlYXNlcyBpZiBwcmVyZWxlYXNlcyBpcyBub3QgTm9uZSBlbHNlIFRydWV9CgogICAgICAgICMgQXR0ZW1wdCB0byBpdGVyYXRlIG92ZXIgYWxsIHRoZSB2YWx1ZXMgaW4gdGhlIGl0ZXJhYmxlIGFuZCBpZiBhbnkgb2YKICAgICAgICAjIHRoZW0gbWF0Y2gsIHlpZWxkIHRoZW0uCiAgICAgICAgZm9yIHZlcnNpb24gaW4gaXRlcmFibGU6CiAgICAgICAgICAgIHBhcnNlZF92ZXJzaW9uID0gc2VsZi5fY29lcmNlX3ZlcnNpb24odmVyc2lvbikKCiAgICAgICAgICAgIGlmIHNlbGYuY29udGFpbnMocGFyc2VkX3ZlcnNpb24sICoqa3cpOgogICAgICAgICAgICAgICAgIyBJZiBvdXIgdmVyc2lvbiBpcyBhIHByZXJlbGVhc2UsIGFuZCB3ZSB3ZXJlIG5vdCBzZXQgdG8gYWxsb3cKICAgICAgICAgICAgICAgICMgcHJlcmVsZWFzZXMsIHRoZW4gd2UnbGwgc3RvcmUgaXQgZm9yIGxhdGVyIGluY2FzZSBub3RoaW5nCiAgICAgICAgICAgICAgICAjIGVsc2UgbWF0Y2hlcyB0aGlzIHNwZWNpZmllci4KICAgICAgICAgICAgICAgIGlmIChwYXJzZWRfdmVyc2lvbi5pc19wcmVyZWxlYXNlIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICAgICAgKHByZXJlbGVhc2VzIG9yIHNlbGYucHJlcmVsZWFzZXMpKToKICAgICAgICAgICAgICAgICAgICBmb3VuZF9wcmVyZWxlYXNlcy5hcHBlbmQodmVyc2lvbikKICAgICAgICAgICAgICAgICMgRWl0aGVyIHRoaXMgaXMgbm90IGEgcHJlcmVsZWFzZSwgb3Igd2Ugc2hvdWxkIGhhdmUgYmVlbgogICAgICAgICAgICAgICAgIyBhY2NlcHRpbmcgcHJlcmVsZWFzZXMgZnJvbSB0aGUgYmVnaW5pbmcuCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHlpZWxkZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgeWllbGQgdmVyc2lvbgoKICAgICAgICAjIE5vdyB0aGF0IHdlJ3ZlIGl0ZXJhdGVkIG92ZXIgZXZlcnl0aGluZywgZGV0ZXJtaW5lIGlmIHdlJ3ZlIHlpZWxkZWQKICAgICAgICAjIGFueSB2YWx1ZXMsIGFuZCBpZiB3ZSBoYXZlIG5vdCBhbmQgd2UgaGF2ZSBhbnkgcHJlcmVsZWFzZXMgc3RvcmVkIHVwCiAgICAgICAgIyB0aGVuIHdlIHdpbGwgZ28gYWhlYWQgYW5kIHlpZWxkIHRoZSBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBub3QgeWllbGRlZCBhbmQgZm91bmRfcHJlcmVsZWFzZXM6CiAgICAgICAgICAgIGZvciB2ZXJzaW9uIGluIGZvdW5kX3ByZXJlbGVhc2VzOgogICAgICAgICAgICAgICAgeWllbGQgdmVyc2lvbgoKCmNsYXNzIExlZ2FjeVNwZWNpZmllcihfSW5kaXZpZHVhbFNwZWNpZmllcik6CgogICAgX3JlZ2V4X3N0ciA9ICgKICAgICAgICByIiIiCiAgICAgICAgKD9QPG9wZXJhdG9yPig9PXwhPXw8PXw+PXw8fD4pKQogICAgICAgIFxzKgogICAgICAgICg/UDx2ZXJzaW9uPgogICAgICAgICAgICBbXiw7XHMpXSogIyBTaW5jZSB0aGlzIGlzIGEgImxlZ2FjeSIgc3BlY2lmaWVyLCBhbmQgdGhlIHZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgICMgc3RyaW5nIGNhbiBiZSBqdXN0IGFib3V0IGFueXRoaW5nLCB3ZSBtYXRjaCBldmVyeXRoaW5nCiAgICAgICAgICAgICAgICAgICAgICAjIGV4Y2VwdCBmb3Igd2hpdGVzcGFjZSwgYSBzZW1pLWNvbG9uIGZvciBtYXJrZXIgc3VwcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICMgYSBjbG9zaW5nIHBhcmVuIHNpbmNlIHZlcnNpb25zIGNhbiBiZSBlbmNsb3NlZCBpbgogICAgICAgICAgICAgICAgICAgICAgIyB0aGVtLCBhbmQgYSBjb21tYSBzaW5jZSBpdCdzIGEgdmVyc2lvbiBzZXBhcmF0b3IuCiAgICAgICAgKQogICAgICAgICIiIgogICAgKQoKICAgIF9yZWdleCA9IHJlLmNvbXBpbGUoCiAgICAgICAgciJeXHMqIiArIF9yZWdleF9zdHIgKyByIlxzKiQiLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKCiAgICBfb3BlcmF0b3JzID0gewogICAgICAgICI9PSI6ICJlcXVhbCIsCiAgICAgICAgIiE9IjogIm5vdF9lcXVhbCIsCiAgICAgICAgIjw9IjogImxlc3NfdGhhbl9lcXVhbCIsCiAgICAgICAgIj49IjogImdyZWF0ZXJfdGhhbl9lcXVhbCIsCiAgICAgICAgIjwiOiAibGVzc190aGFuIiwKICAgICAgICAiPiI6ICJncmVhdGVyX3RoYW4iLAogICAgfQoKICAgIGRlZiBfY29lcmNlX3ZlcnNpb24oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbiwgTGVnYWN5VmVyc2lvbik6CiAgICAgICAgICAgIHZlcnNpb24gPSBMZWdhY3lWZXJzaW9uKHN0cih2ZXJzaW9uKSkKICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgIGRlZiBfY29tcGFyZV9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID09IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX25vdF9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlICE9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlIDw9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2dyZWF0ZXJfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID49IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlIDwgc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPiBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKCmRlZiBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUoZm4pOgogICAgQGZ1bmN0b29scy53cmFwcyhmbikKICAgIGRlZiB3cmFwcGVkKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwcm9zcGVjdGl2ZSwgVmVyc2lvbik6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBmbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYykKICAgIHJldHVybiB3cmFwcGVkCgoKY2xhc3MgU3BlY2lmaWVyKF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKCiAgICBfcmVnZXhfc3RyID0gKAogICAgICAgIHIiIiIKICAgICAgICAoP1A8b3BlcmF0b3I+KH49fD09fCE9fDw9fD49fDx8Pnw9PT0pKQogICAgICAgICg/UDx2ZXJzaW9uPgogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgVGhlIGlkZW50aXR5IG9wZXJhdG9ycyBhbGxvdyBmb3IgYW4gZXNjYXBlIGhhdGNoIHRoYXQgd2lsbAogICAgICAgICAgICAgICAgIyBkbyBhbiBleGFjdCBzdHJpbmcgbWF0Y2ggb2YgdGhlIHZlcnNpb24geW91IHdpc2ggdG8gaW5zdGFsbC4KICAgICAgICAgICAgICAgICMgVGhpcyB3aWxsIG5vdCBiZSBwYXJzZWQgYnkgUEVQIDQ0MCBhbmQgd2UgY2Fubm90IGRldGVybWluZQogICAgICAgICAgICAgICAgIyBhbnkgc2VtYW50aWMgbWVhbmluZyBmcm9tIGl0LiBUaGlzIG9wZXJhdG9yIGlzIGRpc2NvdXJhZ2VkCiAgICAgICAgICAgICAgICAjIGJ1dCBpbmNsdWRlZCBlbnRpcmVseSBhcyBhbiBlc2NhcGUgaGF0Y2guCiAgICAgICAgICAgICAgICAoPzw9PT09KSAgIyBPbmx5IG1hdGNoIGZvciB0aGUgaWRlbnRpdHkgb3BlcmF0b3IKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgW15cc10qICAgICMgV2UganVzdCBtYXRjaCBldmVyeXRoaW5nLCBleGNlcHQgZm9yIHdoaXRlc3BhY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNpbmNlIHdlIGFyZSBvbmx5IHRlc3RpbmcgZm9yIHN0cmljdCBpZGVudGl0eS4KICAgICAgICAgICAgKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBUaGUgKG5vbillcXVhbGl0eSBvcGVyYXRvcnMgYWxsb3cgZm9yIHdpbGQgY2FyZCBhbmQgbG9jYWwKICAgICAgICAgICAgICAgICMgdmVyc2lvbnMgdG8gYmUgc3BlY2lmaWVkIHNvIHdlIGhhdmUgdG8gZGVmaW5lIHRoZXNlIHR3bwogICAgICAgICAgICAgICAgIyBvcGVyYXRvcnMgc2VwYXJhdGVseSB0byBlbmFibGUgdGhhdC4KICAgICAgICAgICAgICAgICg/PD09PXwhPSkgICAgICAgICAgICAjIE9ubHkgbWF0Y2ggZm9yIGVxdWFscyBhbmQgbm90IGVxdWFscwoKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgdj8KICAgICAgICAgICAgICAgICg/OlswLTldKyEpPyAgICAgICAgICAjIGVwb2NoCiAgICAgICAgICAgICAgICBbMC05XSsoPzpcLlswLTldKykqICAgIyByZWxlYXNlCiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwcmUgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICAoYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgWzAtOV0qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgKD86LVswLTldKyl8KD86Wy1fXC5dPyhwb3N0fHJldnxyKVstX1wuXT9bMC05XSopCiAgICAgICAgICAgICAgICApPwoKICAgICAgICAgICAgICAgICMgWW91IGNhbm5vdCB1c2UgYSB3aWxkIGNhcmQgYW5kIGEgZGV2IG9yIGxvY2FsIHZlcnNpb24KICAgICAgICAgICAgICAgICMgdG9nZXRoZXIgc28gZ3JvdXAgdGhlbSB3aXRoIGEgfCBhbmQgbWFrZSB0aGVtIG9wdGlvbmFsLgogICAgICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAgICAgKD86Wy1fXC5dP2RldlstX1wuXT9bMC05XSopPyAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzpcK1thLXowLTldKyg/OlstX1wuXVthLXowLTldKykqKT8gIyBsb2NhbAogICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICBcLlwqICAjIFdpbGQgY2FyZCBzeW50YXggb2YgLioKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICkKICAgICAgICAgICAgfAogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgVGhlIGNvbXBhdGlibGUgb3BlcmF0b3IgcmVxdWlyZXMgYXQgbGVhc3QgdHdvIGRpZ2l0cyBpbiB0aGUKICAgICAgICAgICAgICAgICMgcmVsZWFzZSBzZWdtZW50LgogICAgICAgICAgICAgICAgKD88PX49KSAgICAgICAgICAgICAgICMgT25seSBtYXRjaCBmb3IgdGhlIGNvbXBhdGlibGUgb3BlcmF0b3IKCiAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgIHY/CiAgICAgICAgICAgICAgICAoPzpbMC05XSshKT8gICAgICAgICAgIyBlcG9jaAogICAgICAgICAgICAgICAgWzAtOV0rKD86XC5bMC05XSspKyAgICMgcmVsZWFzZSAgKFdlIGhhdmUgYSArIGluc3RlYWQgb2YgYSAqKQogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcHJlIHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgKGF8YnxjfHJjfGFscGhhfGJldGF8cHJlfHByZXZpZXcpCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIFswLTldKgogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzotWzAtOV0rKXwoPzpbLV9cLl0/KHBvc3R8cmV2fHIpWy1fXC5dP1swLTldKikKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzpbLV9cLl0/ZGV2Wy1fXC5dP1swLTldKik/ICAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBBbGwgb3RoZXIgb3BlcmF0b3JzIG9ubHkgYWxsb3cgYSBzdWIgc2V0IG9mIHdoYXQgdGhlCiAgICAgICAgICAgICAgICAjIChub24pZXF1YWxpdHkgb3BlcmF0b3JzIGRvLiBTcGVjaWZpY2FsbHkgdGhleSBkbyBub3QgYWxsb3cKICAgICAgICAgICAgICAgICMgbG9jYWwgdmVyc2lvbnMgdG8gYmUgc3BlY2lmaWVkIG5vciBkbyB0aGV5IGFsbG93IHRoZSBwcmVmaXgKICAgICAgICAgICAgICAgICMgbWF0Y2hpbmcgd2lsZCBjYXJkcy4KICAgICAgICAgICAgICAgICg/PCE9PXwhPXx+PSkgICAgICAgICAjIFdlIGhhdmUgc3BlY2lhbCBjYXNlcyBmb3IgdGhlc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wZXJhdG9ycyBzbyB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGV5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkb24ndCBtYXRjaCBoZXJlLgoKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgdj8KICAgICAgICAgICAgICAgICg/OlswLTldKyEpPyAgICAgICAgICAjIGVwb2NoCiAgICAgICAgICAgICAgICBbMC05XSsoPzpcLlswLTldKykqICAgIyByZWxlYXNlCiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwcmUgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICAoYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgWzAtOV0qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBvc3QgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgICg/Oi1bMC05XSspfCg/OlstX1wuXT8ocG9zdHxyZXZ8cilbLV9cLl0/WzAtOV0qKQogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OlstX1wuXT9kZXZbLV9cLl0/WzAtOV0qKT8gICAgICAgICAgIyBkZXYgcmVsZWFzZQogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgICIiIgogICAgKQoKICAgIF9yZWdleCA9IHJlLmNvbXBpbGUoCiAgICAgICAgciJeXHMqIiArIF9yZWdleF9zdHIgKyByIlxzKiQiLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKCiAgICBfb3BlcmF0b3JzID0gewogICAgICAgICJ+PSI6ICJjb21wYXRpYmxlIiwKICAgICAgICAiPT0iOiAiZXF1YWwiLAogICAgICAgICIhPSI6ICJub3RfZXF1YWwiLAogICAgICAgICI8PSI6ICJsZXNzX3RoYW5fZXF1YWwiLAogICAgICAgICI+PSI6ICJncmVhdGVyX3RoYW5fZXF1YWwiLAogICAgICAgICI8IjogImxlc3NfdGhhbiIsCiAgICAgICAgIj4iOiAiZ3JlYXRlcl90aGFuIiwKICAgICAgICAiPT09IjogImFyYml0cmFyeSIsCiAgICB9CgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2NvbXBhdGlibGUoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgICMgQ29tcGF0aWJsZSByZWxlYXNlcyBoYXZlIGFuIGVxdWl2YWxlbnQgY29tYmluYXRpb24gb2YgPj0gYW5kID09LiBUaGF0CiAgICAgICAgIyBpcyB0aGF0IH49Mi4yIGlzIGVxdWl2YWxlbnQgdG8gPj0yLjIsPT0yLiouIFRoaXMgYWxsb3dzIHVzIHRvCiAgICAgICAgIyBpbXBsZW1lbnQgdGhpcyBpbiB0ZXJtcyBvZiB0aGUgb3RoZXIgc3BlY2lmaWVycyBpbnN0ZWFkIG9mCiAgICAgICAgIyBpbXBsZW1lbnRpbmcgaXQgb3Vyc2VsdmVzLiBUaGUgb25seSB0aGluZyB3ZSBuZWVkIHRvIGRvIGlzIGNvbnN0cnVjdAogICAgICAgICMgdGhlIG90aGVyIHNwZWNpZmllcnMuCgogICAgICAgICMgV2Ugd2FudCBldmVyeXRoaW5nIGJ1dCB0aGUgbGFzdCBpdGVtIGluIHRoZSB2ZXJzaW9uLCBidXQgd2Ugd2FudCB0bwogICAgICAgICMgaWdub3JlIHBvc3QgYW5kIGRldiByZWxlYXNlcyBhbmQgd2Ugd2FudCB0byB0cmVhdCB0aGUgcHJlLXJlbGVhc2UgYXMKICAgICAgICAjIGl0J3Mgb3duIHNlcGFyYXRlIHNlZ21lbnQuCiAgICAgICAgcHJlZml4ID0gIi4iLmpvaW4oCiAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgICBpdGVydG9vbHMudGFrZXdoaWxlKAogICAgICAgICAgICAgICAgICAgIGxhbWJkYSB4OiAobm90IHguc3RhcnRzd2l0aCgicG9zdCIpIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHguc3RhcnRzd2l0aCgiZGV2IikpLAogICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uX3NwbGl0KHNwZWMpLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApWzotMV0KICAgICAgICApCgogICAgICAgICMgQWRkIHRoZSBwcmVmaXggbm90YXRpb24gdG8gdGhlIGVuZCBvZiBvdXIgc3RyaW5nCiAgICAgICAgcHJlZml4ICs9ICIuKiIKCiAgICAgICAgcmV0dXJuIChzZWxmLl9nZXRfb3BlcmF0b3IoIj49IikocHJvc3BlY3RpdmUsIHNwZWMpIGFuZAogICAgICAgICAgICAgICAgc2VsZi5fZ2V0X29wZXJhdG9yKCI9PSIpKHByb3NwZWN0aXZlLCBwcmVmaXgpKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBXZSBuZWVkIHNwZWNpYWwgbG9naWMgdG8gaGFuZGxlIHByZWZpeCBtYXRjaGluZwogICAgICAgIGlmIHNwZWMuZW5kc3dpdGgoIi4qIik6CiAgICAgICAgICAgICMgSW4gdGhlIGNhc2Ugb2YgcHJlZml4IG1hdGNoaW5nIHdlIHdhbnQgdG8gaWdub3JlIGxvY2FsIHNlZ21lbnQuCiAgICAgICAgICAgIHByb3NwZWN0aXZlID0gVmVyc2lvbihwcm9zcGVjdGl2ZS5wdWJsaWMpCiAgICAgICAgICAgICMgU3BsaXQgdGhlIHNwZWMgb3V0IGJ5IGRvdHMsIGFuZCBwcmV0ZW5kIHRoYXQgdGhlcmUgaXMgYW4gaW1wbGljaXQKICAgICAgICAgICAgIyBkb3QgaW4gYmV0d2VlbiBhIHJlbGVhc2Ugc2VnbWVudCBhbmQgYSBwcmUtcmVsZWFzZSBzZWdtZW50LgogICAgICAgICAgICBzcGVjID0gX3ZlcnNpb25fc3BsaXQoc3BlY1s6LTJdKSAgIyBSZW1vdmUgdGhlIHRyYWlsaW5nIC4qCgogICAgICAgICAgICAjIFNwbGl0IHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIG91dCBieSBkb3RzLCBhbmQgcHJldGVuZCB0aGF0IHRoZXJlCiAgICAgICAgICAgICMgaXMgYW4gaW1wbGljaXQgZG90IGluIGJldHdlZW4gYSByZWxlYXNlIHNlZ21lbnQgYW5kIGEgcHJlLXJlbGVhc2UKICAgICAgICAgICAgIyBzZWdtZW50LgogICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IF92ZXJzaW9uX3NwbGl0KHN0cihwcm9zcGVjdGl2ZSkpCgogICAgICAgICAgICAjIFNob3J0ZW4gdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gdG8gYmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzcGVjCiAgICAgICAgICAgICMgc28gdGhhdCB3ZSBjYW4gZGV0ZXJtaW5lIGlmIHRoZSBzcGVjaWZpZXIgaXMgYSBwcmVmaXggb2YgdGhlCiAgICAgICAgICAgICMgcHJvc3BlY3RpdmUgdmVyc2lvbiBvciBub3QuCiAgICAgICAgICAgIHByb3NwZWN0aXZlID0gcHJvc3BlY3RpdmVbOmxlbihzcGVjKV0KCiAgICAgICAgICAgICMgUGFkIG91dCBvdXIgdHdvIHNpZGVzIHdpdGggemVyb3Mgc28gdGhhdCB0aGV5IGJvdGggZXF1YWwgdGhlIHNhbWUKICAgICAgICAgICAgIyBsZW5ndGguCiAgICAgICAgICAgIHNwZWMsIHByb3NwZWN0aXZlID0gX3BhZF92ZXJzaW9uKHNwZWMsIHByb3NwZWN0aXZlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgQ29udmVydCBvdXIgc3BlYyBzdHJpbmcgaW50byBhIFZlcnNpb24KICAgICAgICAgICAgc3BlYyA9IFZlcnNpb24oc3BlYykKCiAgICAgICAgICAgICMgSWYgdGhlIHNwZWNpZmllciBkb2VzIG5vdCBoYXZlIGEgbG9jYWwgc2VnbWVudCwgdGhlbiB3ZSB3YW50IHRvCiAgICAgICAgICAgICMgYWN0IGFzIGlmIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGFsc28gZG9lcyBub3QgaGF2ZSBhIGxvY2FsCiAgICAgICAgICAgICMgc2VnbWVudC4KICAgICAgICAgICAgaWYgbm90IHNwZWMubG9jYWw6CiAgICAgICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IFZlcnNpb24ocHJvc3BlY3RpdmUucHVibGljKQoKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPT0gc3BlYwoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9ub3RfZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBub3Qgc2VsZi5fY29tcGFyZV9lcXVhbChwcm9zcGVjdGl2ZSwgc3BlYykKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfbGVzc190aGFuX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPD0gVmVyc2lvbihzcGVjKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9ncmVhdGVyX3RoYW5fZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA+PSBWZXJzaW9uKHNwZWMpCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBDb252ZXJ0IG91ciBzcGVjIHRvIGEgVmVyc2lvbiBpbnN0YW5jZSwgc2luY2Ugd2UnbGwgd2FudCB0byB3b3JrIHdpdGgKICAgICAgICAjIGl0IGFzIGEgdmVyc2lvbi4KICAgICAgICBzcGVjID0gVmVyc2lvbihzcGVjKQoKICAgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiBpcyBsZXNzIHRoYW4gdGhlIHNwZWMKICAgICAgICAjIHZlcnNpb24uIElmIGl0J3Mgbm90IHdlIGNhbiBzaG9ydCBjaXJjdWl0IGFuZCBqdXN0IHJldHVybiBGYWxzZSBub3cKICAgICAgICAjIGluc3RlYWQgb2YgZG9pbmcgZXh0cmEgdW5uZWVkZWQgd29yay4KICAgICAgICBpZiBub3QgcHJvc3BlY3RpdmUgPCBzcGVjOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBUaGlzIHNwZWNpYWwgY2FzZSBpcyBoZXJlIHNvIHRoYXQsIHVubGVzcyB0aGUgc3BlY2lmaWVyIGl0c2VsZgogICAgICAgICMgaW5jbHVkZXMgaXMgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uLCB0aGF0IHdlIGRvIG5vdCBhY2NlcHQgcHJlLXJlbGVhc2UKICAgICAgICAjIHZlcnNpb25zIGZvciB0aGUgdmVyc2lvbiBtZW50aW9uZWQgaW4gdGhlIHNwZWNpZmllciAoZS5nLiA8My4xIHNob3VsZAogICAgICAgICMgbm90IG1hdGNoIDMuMS5kZXYwLCBidXQgc2hvdWxkIG1hdGNoIDMuMC5kZXYwKS4KICAgICAgICBpZiBub3Qgc3BlYy5pc19wcmVyZWxlYXNlIGFuZCBwcm9zcGVjdGl2ZS5pc19wcmVyZWxlYXNlOgogICAgICAgICAgICBpZiBWZXJzaW9uKHByb3NwZWN0aXZlLmJhc2VfdmVyc2lvbikgPT0gVmVyc2lvbihzcGVjLmJhc2VfdmVyc2lvbik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gaGVyZSwgaXQgbWVhbnMgdGhhdCBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGJvdGgKICAgICAgICAjIGxlc3MgdGhhbiB0aGUgc3BlYyB2ZXJzaW9uICphbmQqIGl0J3Mgbm90IGEgcHJlLXJlbGVhc2Ugb2YgdGhlIHNhbWUKICAgICAgICAjIHZlcnNpb24gaW4gdGhlIHNwZWMuCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICAjIENvbnZlcnQgb3VyIHNwZWMgdG8gYSBWZXJzaW9uIGluc3RhbmNlLCBzaW5jZSB3ZSdsbCB3YW50IHRvIHdvcmsgd2l0aAogICAgICAgICMgaXQgYXMgYSB2ZXJzaW9uLgogICAgICAgIHNwZWMgPSBWZXJzaW9uKHNwZWMpCgogICAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlYwogICAgICAgICMgdmVyc2lvbi4gSWYgaXQncyBub3Qgd2UgY2FuIHNob3J0IGNpcmN1aXQgYW5kIGp1c3QgcmV0dXJuIEZhbHNlIG5vdwogICAgICAgICMgaW5zdGVhZCBvZiBkb2luZyBleHRyYSB1bm5lZWRlZCB3b3JrLgogICAgICAgIGlmIG5vdCBwcm9zcGVjdGl2ZSA+IHNwZWM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIFRoaXMgc3BlY2lhbCBjYXNlIGlzIGhlcmUgc28gdGhhdCwgdW5sZXNzIHRoZSBzcGVjaWZpZXIgaXRzZWxmCiAgICAgICAgIyBpbmNsdWRlcyBpcyBhIHBvc3QtcmVsZWFzZSB2ZXJzaW9uLCB0aGF0IHdlIGRvIG5vdCBhY2NlcHQKICAgICAgICAjIHBvc3QtcmVsZWFzZSB2ZXJzaW9ucyBmb3IgdGhlIHZlcnNpb24gbWVudGlvbmVkIGluIHRoZSBzcGVjaWZpZXIKICAgICAgICAjIChlLmcuID4zLjEgc2hvdWxkIG5vdCBtYXRjaCAzLjAucG9zdDAsIGJ1dCBzaG91bGQgbWF0Y2ggMy4yLnBvc3QwKS4KICAgICAgICBpZiBub3Qgc3BlYy5pc19wb3N0cmVsZWFzZSBhbmQgcHJvc3BlY3RpdmUuaXNfcG9zdHJlbGVhc2U6CiAgICAgICAgICAgIGlmIFZlcnNpb24ocHJvc3BlY3RpdmUuYmFzZV92ZXJzaW9uKSA9PSBWZXJzaW9uKHNwZWMuYmFzZV92ZXJzaW9uKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIEVuc3VyZSB0aGF0IHdlIGRvIG5vdCBhbGxvdyBhIGxvY2FsIHZlcnNpb24gb2YgdGhlIHZlcnNpb24gbWVudGlvbmVkCiAgICAgICAgIyBpbiB0aGUgc3BlY2lmaWVyLCB3aGljaCBpcyB0ZWNoaW5jYWxseSBncmVhdGVyIHRoYW4sIHRvIG1hdGNoLgogICAgICAgIGlmIHByb3NwZWN0aXZlLmxvY2FsIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBWZXJzaW9uKHByb3NwZWN0aXZlLmJhc2VfdmVyc2lvbikgPT0gVmVyc2lvbihzcGVjLmJhc2VfdmVyc2lvbik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gaGVyZSwgaXQgbWVhbnMgdGhhdCBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGJvdGgKICAgICAgICAjIGdyZWF0ZXIgdGhhbiB0aGUgc3BlYyB2ZXJzaW9uICphbmQqIGl0J3Mgbm90IGEgcHJlLXJlbGVhc2Ugb2YgdGhlCiAgICAgICAgIyBzYW1lIHZlcnNpb24gaW4gdGhlIHNwZWMuCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX2NvbXBhcmVfYXJiaXRyYXJ5KHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gc3RyKHByb3NwZWN0aXZlKS5sb3dlcigpID09IHN0cihzcGVjKS5sb3dlcigpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgIyBJZiB0aGVyZSBpcyBhbiBleHBsaWNpdCBwcmVyZWxlYXNlcyBzZXQgZm9yIHRoaXMsIHRoZW4gd2UnbGwganVzdAogICAgICAgICMgYmxpbmRseSB1c2UgdGhhdC4KICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXJlbGVhc2VzCgogICAgICAgICMgTG9vayBhdCBhbGwgb2Ygb3VyIHNwZWNpZmllcnMgYW5kIGRldGVybWluZSBpZiB0aGV5IGFyZSBpbmNsdXNpdmUKICAgICAgICAjIG9wZXJhdG9ycywgYW5kIGlmIHRoZXkgYXJlIGlmIHRoZXkgYXJlIGluY2x1ZGluZyBhbiBleHBsaWNpdAogICAgICAgICMgcHJlcmVsZWFzZS4KICAgICAgICBvcGVyYXRvciwgdmVyc2lvbiA9IHNlbGYuX3NwZWMKICAgICAgICBpZiBvcGVyYXRvciBpbiBbIj09IiwgIj49IiwgIjw9IiwgIn49IiwgIj09PSJdOgogICAgICAgICAgICAjIFRoZSA9PSBzcGVjaWZpZXIgY2FuIGluY2x1ZGUgYSB0cmFpbGluZyAuKiwgaWYgaXQgZG9lcyB3ZQogICAgICAgICAgICAjIHdhbnQgdG8gcmVtb3ZlIGJlZm9yZSBwYXJzaW5nLgogICAgICAgICAgICBpZiBvcGVyYXRvciA9PSAiPT0iIGFuZCB2ZXJzaW9uLmVuZHN3aXRoKCIuKiIpOgogICAgICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb25bOi0yXQoKICAgICAgICAgICAgIyBQYXJzZSB0aGUgdmVyc2lvbiwgYW5kIGlmIGl0IGlzIGEgcHJlLXJlbGVhc2UgdGhhbiB0aGlzCiAgICAgICAgICAgICMgc3BlY2lmaWVyIGFsbG93cyBwcmUtcmVsZWFzZXMuCiAgICAgICAgICAgIGlmIHBhcnNlKHZlcnNpb24pLmlzX3ByZXJlbGVhc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gdmFsdWUKCgpfcHJlZml4X3JlZ2V4ID0gcmUuY29tcGlsZShyIl4oWzAtOV0rKSgoPzphfGJ8Y3xyYylbMC05XSspJCIpCgoKZGVmIF92ZXJzaW9uX3NwbGl0KHZlcnNpb24pOgogICAgcmVzdWx0ID0gW10KICAgIGZvciBpdGVtIGluIHZlcnNpb24uc3BsaXQoIi4iKToKICAgICAgICBtYXRjaCA9IF9wcmVmaXhfcmVnZXguc2VhcmNoKGl0ZW0pCiAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgIHJlc3VsdC5leHRlbmQobWF0Y2guZ3JvdXBzKCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpdGVtKQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBfcGFkX3ZlcnNpb24obGVmdCwgcmlnaHQpOgogICAgbGVmdF9zcGxpdCwgcmlnaHRfc3BsaXQgPSBbXSwgW10KCiAgICAjIEdldCB0aGUgcmVsZWFzZSBzZWdtZW50IG9mIG91ciB2ZXJzaW9ucwogICAgbGVmdF9zcGxpdC5hcHBlbmQobGlzdChpdGVydG9vbHMudGFrZXdoaWxlKGxhbWJkYSB4OiB4LmlzZGlnaXQoKSwgbGVmdCkpKQogICAgcmlnaHRfc3BsaXQuYXBwZW5kKGxpc3QoaXRlcnRvb2xzLnRha2V3aGlsZShsYW1iZGEgeDogeC5pc2RpZ2l0KCksIHJpZ2h0KSkpCgogICAgIyBHZXQgdGhlIHJlc3Qgb2Ygb3VyIHZlcnNpb25zCiAgICBsZWZ0X3NwbGl0LmFwcGVuZChsZWZ0W2xlbihsZWZ0X3NwbGl0WzBdKTpdKQogICAgcmlnaHRfc3BsaXQuYXBwZW5kKHJpZ2h0W2xlbihyaWdodF9zcGxpdFswXSk6XSkKCiAgICAjIEluc2VydCBvdXIgcGFkZGluZwogICAgbGVmdF9zcGxpdC5pbnNlcnQoCiAgICAgICAgMSwKICAgICAgICBbIjAiXSAqIG1heCgwLCBsZW4ocmlnaHRfc3BsaXRbMF0pIC0gbGVuKGxlZnRfc3BsaXRbMF0pKSwKICAgICkKICAgIHJpZ2h0X3NwbGl0Lmluc2VydCgKICAgICAgICAxLAogICAgICAgIFsiMCJdICogbWF4KDAsIGxlbihsZWZ0X3NwbGl0WzBdKSAtIGxlbihyaWdodF9zcGxpdFswXSkpLAogICAgKQoKICAgIHJldHVybiAoCiAgICAgICAgbGlzdChpdGVydG9vbHMuY2hhaW4oKmxlZnRfc3BsaXQpKSwKICAgICAgICBsaXN0KGl0ZXJ0b29scy5jaGFpbigqcmlnaHRfc3BsaXQpKSwKICAgICkKCgpjbGFzcyBTcGVjaWZpZXJTZXQoQmFzZVNwZWNpZmllcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNwZWNpZmllcnM9IiIsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgU3BsaXQgb24gLCB0byBicmVhayBlYWNoIGluZGlkaXZ1YWwgc3BlY2lmaWVyIGludG8gaXQncyBvd24gaXRlbSwgYW5kCiAgICAgICAgIyBzdHJpcCBlYWNoIGl0ZW0gdG8gcmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZS4KICAgICAgICBzcGVjaWZpZXJzID0gW3Muc3RyaXAoKSBmb3IgcyBpbiBzcGVjaWZpZXJzLnNwbGl0KCIsIikgaWYgcy5zdHJpcCgpXQoKICAgICAgICAjIFBhcnNlZCBlYWNoIGluZGl2aWR1YWwgc3BlY2lmaWVyLCBhdHRlbXB0aW5nIGZpcnN0IHRvIG1ha2UgaXQgYQogICAgICAgICMgU3BlY2lmaWVyIGFuZCBmYWxsaW5nIGJhY2sgdG8gYSBMZWdhY3lTcGVjaWZpZXIuCiAgICAgICAgcGFyc2VkID0gc2V0KCkKICAgICAgICBmb3Igc3BlY2lmaWVyIGluIHNwZWNpZmllcnM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHBhcnNlZC5hZGQoU3BlY2lmaWVyKHNwZWNpZmllcikpCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgICAgICAgICAgcGFyc2VkLmFkZChMZWdhY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkKCiAgICAgICAgIyBUdXJuIG91ciBwYXJzZWQgc3BlY2lmaWVycyBpbnRvIGEgZnJvemVuIHNldCBhbmQgc2F2ZSB0aGVtIGZvciBsYXRlci4KICAgICAgICBzZWxmLl9zcGVjcyA9IGZyb3plbnNldChwYXJzZWQpCgogICAgICAgICMgU3RvcmUgb3VyIHByZXJlbGVhc2VzIHZhbHVlIHNvIHdlIGNhbiB1c2UgaXQgbGF0ZXIgdG8gZGV0ZXJtaW5lIGlmCiAgICAgICAgIyB3ZSBhY2NlcHQgcHJlcmVsZWFzZXMgb3Igbm90LgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gcHJlcmVsZWFzZXMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcHJlID0gKAogICAgICAgICAgICAiLCBwcmVyZWxlYXNlcz17MCFyfSIuZm9ybWF0KHNlbGYucHJlcmVsZWFzZXMpCiAgICAgICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lCiAgICAgICAgICAgIGVsc2UgIiIKICAgICAgICApCgogICAgICAgIHJldHVybiAiPFNwZWNpZmllclNldCh7MCFyfXsxfSk+Ii5mb3JtYXQoc3RyKHNlbGYpLCBwcmUpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICIsIi5qb2luKHNvcnRlZChzdHIocykgZm9yIHMgaW4gc2VsZi5fc3BlY3MpKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9zcGVjcykKCiAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQob3RoZXIpCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU3BlY2lmaWVyU2V0KToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHNwZWNpZmllciA9IFNwZWNpZmllclNldCgpCiAgICAgICAgc3BlY2lmaWVyLl9zcGVjcyA9IGZyb3plbnNldChzZWxmLl9zcGVjcyB8IG90aGVyLl9zcGVjcykKCiAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgTm9uZSBhbmQgb3RoZXIuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzcGVjaWZpZXIuX3ByZXJlbGVhc2VzID0gb3RoZXIuX3ByZXJlbGVhc2VzCiAgICAgICAgZWxpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZSBhbmQgb3RoZXIuX3ByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHNwZWNpZmllci5fcHJlcmVsZWFzZXMgPSBzZWxmLl9wcmVyZWxlYXNlcwogICAgICAgIGVsaWYgc2VsZi5fcHJlcmVsZWFzZXMgPT0gb3RoZXIuX3ByZXJlbGVhc2VzOgogICAgICAgICAgICBzcGVjaWZpZXIuX3ByZXJlbGVhc2VzID0gc2VsZi5fcHJlcmVsZWFzZXMKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIkNhbm5vdCBjb21iaW5lIFNwZWNpZmllclNldHMgd2l0aCBUcnVlIGFuZCBGYWxzZSBwcmVyZWxlYXNlICIKICAgICAgICAgICAgICAgICJvdmVycmlkZXMuIgogICAgICAgICAgICApCgogICAgICAgIHJldHVybiBzcGVjaWZpZXIKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChvdGhlcikKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQoc3RyKG90aGVyKSkKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTcGVjaWZpZXJTZXQpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNzID09IG90aGVyLl9zcGVjcwoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KG90aGVyKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgX0luZGl2aWR1YWxTcGVjaWZpZXIpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChzdHIob3RoZXIpKQogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNwZWNpZmllclNldCk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gc2VsZi5fc3BlY3MgIT0gb3RoZXIuX3NwZWNzCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9zcGVjcykKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fc3BlY3MpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgIyBJZiB3ZSBoYXZlIGJlZW4gZ2l2ZW4gYW4gZXhwbGljaXQgcHJlcmVsZWFzZSBtb2RpZmllciwgdGhlbiB3ZSdsbAogICAgICAgICMgcGFzcyB0aGF0IHRocm91Z2ggaGVyZS4KICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ByZXJlbGVhc2VzCgogICAgICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgc3BlY2lmaWVycywgYW5kIHdlIGRvbid0IGhhdmUgYSBmb3JjZWQgdmFsdWUsCiAgICAgICAgIyB0aGVuIHdlJ2xsIGp1c3QgcmV0dXJuIE5vbmUgc2luY2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGlzIHNob3VsZCBoYXZlCiAgICAgICAgIyBwcmUtcmVsZWFzZXMgb3Igbm90LgogICAgICAgIGlmIG5vdCBzZWxmLl9zcGVjczoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgIyBPdGhlcndpc2Ugd2UnbGwgc2VlIGlmIGFueSBvZiB0aGUgZ2l2ZW4gc3BlY2lmaWVycyBhY2NlcHQKICAgICAgICAjIHByZXJlbGVhc2VzLCBpZiBhbnkgb2YgdGhlbSBkbyB3ZSdsbCByZXR1cm4gVHJ1ZSwgb3RoZXJ3aXNlIEZhbHNlLgogICAgICAgIHJldHVybiBhbnkocy5wcmVyZWxlYXNlcyBmb3IgcyBpbiBzZWxmLl9zcGVjcykKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gdmFsdWUKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgogICAgICAgIHJldHVybiBzZWxmLmNvbnRhaW5zKGl0ZW0pCgogICAgZGVmIGNvbnRhaW5zKHNlbGYsIGl0ZW0sIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgRW5zdXJlIHRoYXQgb3VyIGl0ZW0gaXMgYSBWZXJzaW9uIG9yIExlZ2FjeVZlcnNpb24gaW5zdGFuY2UuCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlbSwgKExlZ2FjeVZlcnNpb24sIFZlcnNpb24pKToKICAgICAgICAgICAgaXRlbSA9IHBhcnNlKGl0ZW0pCgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlJ3JlIGZvcmNpbmcgYSBwcmVyZWxlYXNlIG9yIG5vdCwgaWYgd2UncmUgbm90IGZvcmNpbmcKICAgICAgICAjIG9uZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpbHRlciBjYWxsLCB0aGVuIHdlJ2xsIHVzZSB3aGF0ZXZlciB0aGUKICAgICAgICAjIFNwZWNpZmllclNldCB0aGlua3MgZm9yIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBzdXBwb3J0IHByZXJlbGVhc2VzLgogICAgICAgIGlmIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHByZXJlbGVhc2VzID0gc2VsZi5wcmVyZWxlYXNlcwoKICAgICAgICAjIFdlIGNhbiBkZXRlcm1pbmUgaWYgd2UncmUgZ29pbmcgdG8gYWxsb3cgcHJlLXJlbGVhc2VzIGJ5IGxvb2tpbmcgdG8KICAgICAgICAjIHNlZSBpZiBhbnkgb2YgdGhlIHVuZGVybHlpbmcgaXRlbXMgc3VwcG9ydHMgdGhlbS4gSWYgbm9uZSBvZiB0aGVtIGRvCiAgICAgICAgIyBhbmQgdGhpcyBpdGVtIGlzIGEgcHJlLXJlbGVhc2UgdGhlbiB3ZSBkbyBub3QgYWxsb3cgaXQgYW5kIHdlIGNhbgogICAgICAgICMgc2hvcnQgY2lyY3VpdCB0aGF0IGhlcmUuCiAgICAgICAgIyBOb3RlOiBUaGlzIG1lYW5zIHRoYXQgMS4wLmRldjEgd291bGQgbm90IGJlIGNvbnRhaW5lZCBpbiBzb21ldGhpbmcKICAgICAgICAjICAgICAgIGxpa2UgPj0xLjAuZGV2YWJjIGhvd2V2ZXIgaXQgd291bGQgYmUgaW4gPj0xLjAuZGViYWJjLD4wLjAuZGV2MAogICAgICAgIGlmIG5vdCBwcmVyZWxlYXNlcyBhbmQgaXRlbS5pc19wcmVyZWxlYXNlOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBXZSBzaW1wbHkgZGlzcGF0Y2ggdG8gdGhlIHVuZGVybHlpbmcgc3BlY3MgaGVyZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUKICAgICAgICAjIGdpdmVuIHZlcnNpb24gaXMgY29udGFpbmVkIHdpdGhpbiBhbGwgb2YgdGhlbS4KICAgICAgICAjIE5vdGU6IFRoaXMgdXNlIG9mIGFsbCgpIGhlcmUgbWVhbnMgdGhhdCBhbiBlbXB0eSBzZXQgb2Ygc3BlY2lmaWVycwogICAgICAgICMgICAgICAgd2lsbCBhbHdheXMgcmV0dXJuIFRydWUsIHRoaXMgaXMgYW4gZXhwbGljaXQgZGVzaWduIGRlY2lzaW9uLgogICAgICAgIHJldHVybiBhbGwoCiAgICAgICAgICAgIHMuY29udGFpbnMoaXRlbSwgcHJlcmVsZWFzZXM9cHJlcmVsZWFzZXMpCiAgICAgICAgICAgIGZvciBzIGluIHNlbGYuX3NwZWNzCiAgICAgICAgKQoKICAgIGRlZiBmaWx0ZXIoc2VsZiwgaXRlcmFibGUsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlJ3JlIGZvcmNpbmcgYSBwcmVyZWxlYXNlIG9yIG5vdCwgaWYgd2UncmUgbm90IGZvcmNpbmcKICAgICAgICAjIG9uZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpbHRlciBjYWxsLCB0aGVuIHdlJ2xsIHVzZSB3aGF0ZXZlciB0aGUKICAgICAgICAjIFNwZWNpZmllclNldCB0aGlua3MgZm9yIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBzdXBwb3J0IHByZXJlbGVhc2VzLgogICAgICAgIGlmIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHByZXJlbGVhc2VzID0gc2VsZi5wcmVyZWxlYXNlcwoKICAgICAgICAjIElmIHdlIGhhdmUgYW55IHNwZWNpZmllcnMsIHRoZW4gd2Ugd2FudCB0byB3cmFwIG91ciBpdGVyYWJsZSBpbiB0aGUKICAgICAgICAjIGZpbHRlciBtZXRob2QgZm9yIGVhY2ggb25lLCB0aGlzIHdpbGwgYWN0IGFzIGEgbG9naWNhbCBBTkQgYW1vbmdzdAogICAgICAgICMgZWFjaCBzcGVjaWZpZXIuCiAgICAgICAgaWYgc2VsZi5fc3BlY3M6CiAgICAgICAgICAgIGZvciBzcGVjIGluIHNlbGYuX3NwZWNzOgogICAgICAgICAgICAgICAgaXRlcmFibGUgPSBzcGVjLmZpbHRlcihpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Ym9vbChwcmVyZWxlYXNlcykpCiAgICAgICAgICAgIHJldHVybiBpdGVyYWJsZQogICAgICAgICMgSWYgd2UgZG8gbm90IGhhdmUgYW55IHNwZWNpZmllcnMsIHRoZW4gd2UgbmVlZCB0byBoYXZlIGEgcm91Z2ggZmlsdGVyCiAgICAgICAgIyB3aGljaCB3aWxsIGZpbHRlciBvdXQgYW55IHByZS1yZWxlYXNlcywgdW5sZXNzIHRoZXJlIGFyZSBubyBmaW5hbAogICAgICAgICMgcmVsZWFzZXMsIGFuZCB3aGljaCB3aWxsIGZpbHRlciBvdXQgTGVnYWN5VmVyc2lvbiBpbiBnZW5lcmFsLgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZpbHRlcmVkID0gW10KICAgICAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMgPSBbXQoKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gaXRlcmFibGU6CiAgICAgICAgICAgICAgICAjIEVuc3VyZSB0aGF0IHdlIHNvbWUga2luZCBvZiBWZXJzaW9uIGNsYXNzIGZvciB0aGlzIGl0ZW0uCiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdGVtLCAoTGVnYWN5VmVyc2lvbiwgVmVyc2lvbikpOgogICAgICAgICAgICAgICAgICAgIHBhcnNlZF92ZXJzaW9uID0gcGFyc2UoaXRlbSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcGFyc2VkX3ZlcnNpb24gPSBpdGVtCgogICAgICAgICAgICAgICAgIyBGaWx0ZXIgb3V0IGFueSBpdGVtIHdoaWNoIGlzIHBhcnNlZCBhcyBhIExlZ2FjeVZlcnNpb24KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGFyc2VkX3ZlcnNpb24sIExlZ2FjeVZlcnNpb24pOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgIyBTdG9yZSBhbnkgaXRlbSB3aGljaCBpcyBhIHByZS1yZWxlYXNlIGZvciBsYXRlciB1bmxlc3Mgd2UndmUKICAgICAgICAgICAgICAgICMgYWxyZWFkeSBmb3VuZCBhIGZpbmFsIHZlcnNpb24gb3Igd2UgYXJlIGFjY2VwdGluZyBwcmVyZWxlYXNlcwogICAgICAgICAgICAgICAgaWYgcGFyc2VkX3ZlcnNpb24uaXNfcHJlcmVsZWFzZSBhbmQgbm90IHByZXJlbGVhc2VzOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBmaWx0ZXJlZDoKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMuYXBwZW5kKGl0ZW0pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLmFwcGVuZChpdGVtKQoKICAgICAgICAgICAgIyBJZiB3ZSd2ZSBmb3VuZCBubyBpdGVtcyBleGNlcHQgZm9yIHByZS1yZWxlYXNlcywgdGhlbiB3ZSdsbCBnbwogICAgICAgICAgICAjIGFoZWFkIGFuZCB1c2UgdGhlIHByZS1yZWxlYXNlcwogICAgICAgICAgICBpZiBub3QgZmlsdGVyZWQgYW5kIGZvdW5kX3ByZXJlbGVhc2VzIGFuZCBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kX3ByZXJlbGVhc2VzCgogICAgICAgICAgICByZXR1cm4gZmlsdGVyZWQKUEsDBBQAAAAAAAAAIQDF6icPpQEAAKUBAAAuAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy91dGlscy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCByZQoKCl9jYW5vbmljYWxpemVfcmVnZXggPSByZS5jb21waWxlKHIiWy1fLl0rIikKCgpkZWYgY2Fub25pY2FsaXplX25hbWUobmFtZSk6CiAgICAjIFRoaXMgaXMgdGFrZW4gZnJvbSBQRVAgNTAzLgogICAgcmV0dXJuIF9jYW5vbmljYWxpemVfcmVnZXguc3ViKCItIiwgbmFtZSkubG93ZXIoKQpQSwMEFAAAAAAAAAAhAA7vxqEkLQAAJC0AADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL3ZlcnNpb24ucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgcmUKCmZyb20gLl9zdHJ1Y3R1cmVzIGltcG9ydCBJbmZpbml0eQoKCl9fYWxsX18gPSBbCiAgICAicGFyc2UiLCAiVmVyc2lvbiIsICJMZWdhY3lWZXJzaW9uIiwgIkludmFsaWRWZXJzaW9uIiwgIlZFUlNJT05fUEFUVEVSTiIKXQoKCl9WZXJzaW9uID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgKICAgICJfVmVyc2lvbiIsCiAgICBbImVwb2NoIiwgInJlbGVhc2UiLCAiZGV2IiwgInByZSIsICJwb3N0IiwgImxvY2FsIl0sCikKCgpkZWYgcGFyc2UodmVyc2lvbik6CiAgICAiIiIKICAgIFBhcnNlIHRoZSBnaXZlbiB2ZXJzaW9uIHN0cmluZyBhbmQgcmV0dXJuIGVpdGhlciBhIDpjbGFzczpgVmVyc2lvbmAgb2JqZWN0CiAgICBvciBhIDpjbGFzczpgTGVnYWN5VmVyc2lvbmAgb2JqZWN0IGRlcGVuZGluZyBvbiBpZiB0aGUgZ2l2ZW4gdmVyc2lvbiBpcwogICAgYSB2YWxpZCBQRVAgNDQwIHZlcnNpb24gb3IgYSBsZWdhY3kgdmVyc2lvbi4KICAgICIiIgogICAgdHJ5OgogICAgICAgIHJldHVybiBWZXJzaW9uKHZlcnNpb24pCiAgICBleGNlcHQgSW52YWxpZFZlcnNpb246CiAgICAgICAgcmV0dXJuIExlZ2FjeVZlcnNpb24odmVyc2lvbikKCgpjbGFzcyBJbnZhbGlkVmVyc2lvbihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCB2ZXJzaW9uIHdhcyBmb3VuZCwgdXNlcnMgc2hvdWxkIHJlZmVyIHRvIFBFUCA0NDAuCiAgICAiIiIKCgpjbGFzcyBfQmFzZVZlcnNpb24ob2JqZWN0KToKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fa2V5KQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA8IG8pCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzIDw9IG8pCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzID09IG8pCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzID49IG8pCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzID4gbykKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgIT0gbykKCiAgICBkZWYgX2NvbXBhcmUoc2VsZiwgb3RoZXIsIG1ldGhvZCk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIF9CYXNlVmVyc2lvbik6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gbWV0aG9kKHNlbGYuX2tleSwgb3RoZXIuX2tleSkKCgpjbGFzcyBMZWdhY3lWZXJzaW9uKF9CYXNlVmVyc2lvbik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcnNpb24pOgogICAgICAgIHNlbGYuX3ZlcnNpb24gPSBzdHIodmVyc2lvbikKICAgICAgICBzZWxmLl9rZXkgPSBfbGVnYWN5X2NtcGtleShzZWxmLl92ZXJzaW9uKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPExlZ2FjeVZlcnNpb24oezB9KT4iLmZvcm1hdChyZXByKHN0cihzZWxmKSkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHVibGljKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCgogICAgQHByb3BlcnR5CiAgICBkZWYgYmFzZV92ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCgogICAgQHByb3BlcnR5CiAgICBkZWYgbG9jYWwoc2VsZik6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wcmVyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3Bvc3RyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBGYWxzZQoKCl9sZWdhY3lfdmVyc2lvbl9jb21wb25lbnRfcmUgPSByZS5jb21waWxlKAogICAgciIoXGQrIHwgW2Etel0rIHwgXC58IC0pIiwgcmUuVkVSQk9TRSwKKQoKX2xlZ2FjeV92ZXJzaW9uX3JlcGxhY2VtZW50X21hcCA9IHsKICAgICJwcmUiOiAiYyIsICJwcmV2aWV3IjogImMiLCAiLSI6ICJmaW5hbC0iLCAicmMiOiAiYyIsICJkZXYiOiAiQCIsCn0KCgpkZWYgX3BhcnNlX3ZlcnNpb25fcGFydHMocyk6CiAgICBmb3IgcGFydCBpbiBfbGVnYWN5X3ZlcnNpb25fY29tcG9uZW50X3JlLnNwbGl0KHMpOgogICAgICAgIHBhcnQgPSBfbGVnYWN5X3ZlcnNpb25fcmVwbGFjZW1lbnRfbWFwLmdldChwYXJ0LCBwYXJ0KQoKICAgICAgICBpZiBub3QgcGFydCBvciBwYXJ0ID09ICIuIjoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgcGFydFs6MV0gaW4gIjAxMjM0NTY3ODkiOgogICAgICAgICAgICAjIHBhZCBmb3IgbnVtZXJpYyBjb21wYXJpc29uCiAgICAgICAgICAgIHlpZWxkIHBhcnQuemZpbGwoOCkKICAgICAgICBlbHNlOgogICAgICAgICAgICB5aWVsZCAiKiIgKyBwYXJ0CgogICAgIyBlbnN1cmUgdGhhdCBhbHBoYS9iZXRhL2NhbmRpZGF0ZSBhcmUgYmVmb3JlIGZpbmFsCiAgICB5aWVsZCAiKmZpbmFsIgoKCmRlZiBfbGVnYWN5X2NtcGtleSh2ZXJzaW9uKToKICAgICMgV2UgaGFyZGNvZGUgYW4gZXBvY2ggb2YgLTEgaGVyZS4gQSBQRVAgNDQwIHZlcnNpb24gY2FuIG9ubHkgaGF2ZSBhIGVwb2NoCiAgICAjIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLiBUaGlzIHdpbGwgZWZmZWN0aXZlbHkgcHV0IHRoZSBMZWdhY3lWZXJzaW9uLAogICAgIyB3aGljaCB1c2VzIHRoZSBkZWZhY3RvIHN0YW5kYXJkIG9yaWdpbmFsbHkgaW1wbGVtZW50ZWQgYnkgc2V0dXB0b29scywKICAgICMgYXMgYmVmb3JlIGFsbCBQRVAgNDQwIHZlcnNpb25zLgogICAgZXBvY2ggPSAtMQoKICAgICMgVGhpcyBzY2hlbWUgaXMgdGFrZW4gZnJvbSBwa2dfcmVzb3VyY2VzLnBhcnNlX3ZlcnNpb24gc2V0dXB0b29scyBwcmlvciB0bwogICAgIyBpdCdzIGFkb3B0aW9uIG9mIHRoZSBwYWNrYWdpbmcgbGlicmFyeS4KICAgIHBhcnRzID0gW10KICAgIGZvciBwYXJ0IGluIF9wYXJzZV92ZXJzaW9uX3BhcnRzKHZlcnNpb24ubG93ZXIoKSk6CiAgICAgICAgaWYgcGFydC5zdGFydHN3aXRoKCIqIik6CiAgICAgICAgICAgICMgcmVtb3ZlICItIiBiZWZvcmUgYSBwcmVyZWxlYXNlIHRhZwogICAgICAgICAgICBpZiBwYXJ0IDwgIipmaW5hbCI6CiAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0cyBhbmQgcGFydHNbLTFdID09ICIqZmluYWwtIjoKICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQoKICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgemVyb3MgZnJvbSBlYWNoIHNlcmllcyBvZiBudW1lcmljIHBhcnRzCiAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV0gPT0gIjAwMDAwMDAwIjoKICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpCgogICAgICAgIHBhcnRzLmFwcGVuZChwYXJ0KQogICAgcGFydHMgPSB0dXBsZShwYXJ0cykKCiAgICByZXR1cm4gZXBvY2gsIHBhcnRzCgojIERlbGliZXJhdGVseSBub3QgYW5jaG9yZWQgdG8gdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHN0cmluZywgdG8gbWFrZSBpdAojIGVhc2llciBmb3IgM3JkIHBhcnR5IGNvZGUgdG8gcmV1c2UKVkVSU0lPTl9QQVRURVJOID0gciIiIgogICAgdj8KICAgICg/OgogICAgICAgICg/Oig/UDxlcG9jaD5bMC05XSspISk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlcG9jaAogICAgICAgICg/UDxyZWxlYXNlPlswLTldKyg/OlwuWzAtOV0rKSopICAgICAgICAgICAgICAgICAgIyByZWxlYXNlIHNlZ21lbnQKICAgICAgICAoP1A8cHJlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJlLXJlbGVhc2UKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8cHJlX2w+KGF8YnxjfHJjfGFscGhhfGJldGF8cHJlfHByZXZpZXcpKQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxwcmVfbj5bMC05XSspPwogICAgICAgICk/CiAgICAgICAgKD9QPHBvc3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBvc3QgcmVsZWFzZQogICAgICAgICAgICAoPzotKD9QPHBvc3RfbjE+WzAtOV0rKSkKICAgICAgICAgICAgfAogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICg/UDxwb3N0X2w+cG9zdHxyZXZ8cikKICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICg/UDxwb3N0X24yPlswLTldKyk/CiAgICAgICAgICAgICkKICAgICAgICApPwogICAgICAgICg/UDxkZXY+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkZXYgcmVsZWFzZQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxkZXZfbD5kZXYpCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPGRldl9uPlswLTldKyk/CiAgICAgICAgKT8KICAgICkKICAgICg/OlwrKD9QPGxvY2FsPlthLXowLTldKyg/OlstX1wuXVthLXowLTldKykqKSk/ICAgICAgICMgbG9jYWwgdmVyc2lvbgoiIiIKCgpjbGFzcyBWZXJzaW9uKF9CYXNlVmVyc2lvbik6CgogICAgX3JlZ2V4ID0gcmUuY29tcGlsZSgKICAgICAgICByIl5ccyoiICsgVkVSU0lPTl9QQVRURVJOICsgciJccyokIiwKICAgICAgICByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSwKICAgICkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgIyBWYWxpZGF0ZSB0aGUgdmVyc2lvbiBhbmQgcGFyc2UgaXQgaW50byBwaWVjZXMKICAgICAgICBtYXRjaCA9IHNlbGYuX3JlZ2V4LnNlYXJjaCh2ZXJzaW9uKQogICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFZlcnNpb24oIkludmFsaWQgdmVyc2lvbjogJ3swfSciLmZvcm1hdCh2ZXJzaW9uKSkKCiAgICAgICAgIyBTdG9yZSB0aGUgcGFyc2VkIG91dCBwaWVjZXMgb2YgdGhlIHZlcnNpb24KICAgICAgICBzZWxmLl92ZXJzaW9uID0gX1ZlcnNpb24oCiAgICAgICAgICAgIGVwb2NoPWludChtYXRjaC5ncm91cCgiZXBvY2giKSkgaWYgbWF0Y2guZ3JvdXAoImVwb2NoIikgZWxzZSAwLAogICAgICAgICAgICByZWxlYXNlPXR1cGxlKGludChpKSBmb3IgaSBpbiBtYXRjaC5ncm91cCgicmVsZWFzZSIpLnNwbGl0KCIuIikpLAogICAgICAgICAgICBwcmU9X3BhcnNlX2xldHRlcl92ZXJzaW9uKAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInByZV9sIiksCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgicHJlX24iKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgcG9zdD1fcGFyc2VfbGV0dGVyX3ZlcnNpb24oCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgicG9zdF9sIiksCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgicG9zdF9uMSIpIG9yIG1hdGNoLmdyb3VwKCJwb3N0X24yIiksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGRldj1fcGFyc2VfbGV0dGVyX3ZlcnNpb24oCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgiZGV2X2wiKSwKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJkZXZfbiIpLAogICAgICAgICAgICApLAogICAgICAgICAgICBsb2NhbD1fcGFyc2VfbG9jYWxfdmVyc2lvbihtYXRjaC5ncm91cCgibG9jYWwiKSksCiAgICAgICAgKQoKICAgICAgICAjIEdlbmVyYXRlIGEga2V5IHdoaWNoIHdpbGwgYmUgdXNlZCBmb3Igc29ydGluZwogICAgICAgIHNlbGYuX2tleSA9IF9jbXBrZXkoCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24uZXBvY2gsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24ucmVsZWFzZSwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5wcmUsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24ucG9zdCwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5kZXYsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24ubG9jYWwsCiAgICAgICAgKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxWZXJzaW9uKHswfSk+Ii5mb3JtYXQocmVwcihzdHIoc2VsZikpKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHBhcnRzID0gW10KCiAgICAgICAgIyBFcG9jaAogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24uZXBvY2ggIT0gMDoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJ7MH0hIi5mb3JtYXQoc2VsZi5fdmVyc2lvbi5lcG9jaCkpCgogICAgICAgICMgUmVsZWFzZSBzZWdtZW50CiAgICAgICAgcGFydHMuYXBwZW5kKCIuIi5qb2luKHN0cih4KSBmb3IgeCBpbiBzZWxmLl92ZXJzaW9uLnJlbGVhc2UpKQoKICAgICAgICAjIFByZS1yZWxlYXNlCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5wcmUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiIi5qb2luKHN0cih4KSBmb3IgeCBpbiBzZWxmLl92ZXJzaW9uLnByZSkpCgogICAgICAgICMgUG9zdC1yZWxlYXNlCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5wb3N0IGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIi5wb3N0ezB9Ii5mb3JtYXQoc2VsZi5fdmVyc2lvbi5wb3N0WzFdKSkKCiAgICAgICAgIyBEZXZlbG9wbWVudCByZWxlYXNlCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5kZXYgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiLmRldnswfSIuZm9ybWF0KHNlbGYuX3ZlcnNpb24uZGV2WzFdKSkKCiAgICAgICAgIyBMb2NhbCB2ZXJzaW9uIHNlZ21lbnQKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLmxvY2FsIGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoCiAgICAgICAgICAgICAgICAiK3swfSIuZm9ybWF0KCIuIi5qb2luKHN0cih4KSBmb3IgeCBpbiBzZWxmLl92ZXJzaW9uLmxvY2FsKSkKICAgICAgICAgICAgKQoKICAgICAgICByZXR1cm4gIiIuam9pbihwYXJ0cykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwdWJsaWMoc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmKS5zcGxpdCgiKyIsIDEpWzBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgYmFzZV92ZXJzaW9uKHNlbGYpOgogICAgICAgIHBhcnRzID0gW10KCiAgICAgICAgIyBFcG9jaAogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24uZXBvY2ggIT0gMDoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJ7MH0hIi5mb3JtYXQoc2VsZi5fdmVyc2lvbi5lcG9jaCkpCgogICAgICAgICMgUmVsZWFzZSBzZWdtZW50CiAgICAgICAgcGFydHMuYXBwZW5kKCIuIi5qb2luKHN0cih4KSBmb3IgeCBpbiBzZWxmLl92ZXJzaW9uLnJlbGVhc2UpKQoKICAgICAgICByZXR1cm4gIiIuam9pbihwYXJ0cykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsb2NhbChzZWxmKToKICAgICAgICB2ZXJzaW9uX3N0cmluZyA9IHN0cihzZWxmKQogICAgICAgIGlmICIrIiBpbiB2ZXJzaW9uX3N0cmluZzoKICAgICAgICAgICAgcmV0dXJuIHZlcnNpb25fc3RyaW5nLnNwbGl0KCIrIiwgMSlbMV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wcmVyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBib29sKHNlbGYuX3ZlcnNpb24uZGV2IG9yIHNlbGYuX3ZlcnNpb24ucHJlKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3Bvc3RyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBib29sKHNlbGYuX3ZlcnNpb24ucG9zdCkKCgpkZWYgX3BhcnNlX2xldHRlcl92ZXJzaW9uKGxldHRlciwgbnVtYmVyKToKICAgIGlmIGxldHRlcjoKICAgICAgICAjIFdlIGNvbnNpZGVyIHRoZXJlIHRvIGJlIGFuIGltcGxpY2l0IDAgaW4gYSBwcmUtcmVsZWFzZSBpZiB0aGVyZSBpcwogICAgICAgICMgbm90IGEgbnVtZXJhbCBhc3NvY2lhdGVkIHdpdGggaXQuCiAgICAgICAgaWYgbnVtYmVyIGlzIE5vbmU6CiAgICAgICAgICAgIG51bWJlciA9IDAKCiAgICAgICAgIyBXZSBub3JtYWxpemUgYW55IGxldHRlcnMgdG8gdGhlaXIgbG93ZXIgY2FzZSBmb3JtCiAgICAgICAgbGV0dGVyID0gbGV0dGVyLmxvd2VyKCkKCiAgICAgICAgIyBXZSBjb25zaWRlciBzb21lIHdvcmRzIHRvIGJlIGFsdGVybmF0ZSBzcGVsbGluZ3Mgb2Ygb3RoZXIgd29yZHMgYW5kCiAgICAgICAgIyBpbiB0aG9zZSBjYXNlcyB3ZSB3YW50IHRvIG5vcm1hbGl6ZSB0aGUgc3BlbGxpbmdzIHRvIG91ciBwcmVmZXJyZWQKICAgICAgICAjIHNwZWxsaW5nLgogICAgICAgIGlmIGxldHRlciA9PSAiYWxwaGEiOgogICAgICAgICAgICBsZXR0ZXIgPSAiYSIKICAgICAgICBlbGlmIGxldHRlciA9PSAiYmV0YSI6CiAgICAgICAgICAgIGxldHRlciA9ICJiIgogICAgICAgIGVsaWYgbGV0dGVyIGluIFsiYyIsICJwcmUiLCAicHJldmlldyJdOgogICAgICAgICAgICBsZXR0ZXIgPSAicmMiCiAgICAgICAgZWxpZiBsZXR0ZXIgaW4gWyJyZXYiLCAiciJdOgogICAgICAgICAgICBsZXR0ZXIgPSAicG9zdCIKCiAgICAgICAgcmV0dXJuIGxldHRlciwgaW50KG51bWJlcikKICAgIGlmIG5vdCBsZXR0ZXIgYW5kIG51bWJlcjoKICAgICAgICAjIFdlIGFzc3VtZSBpZiB3ZSBhcmUgZ2l2ZW4gYSBudW1iZXIsIGJ1dCB3ZSBhcmUgbm90IGdpdmVuIGEgbGV0dGVyCiAgICAgICAgIyB0aGVuIHRoaXMgaXMgdXNpbmcgdGhlIGltcGxpY2l0IHBvc3QgcmVsZWFzZSBzeW50YXggKGUuZy4gMS4wLTEpCiAgICAgICAgbGV0dGVyID0gInBvc3QiCgogICAgICAgIHJldHVybiBsZXR0ZXIsIGludChudW1iZXIpCgoKX2xvY2FsX3ZlcnNpb25fc2VwZXJhdG9ycyA9IHJlLmNvbXBpbGUociJbXC5fLV0iKQoKCmRlZiBfcGFyc2VfbG9jYWxfdmVyc2lvbihsb2NhbCk6CiAgICAiIiIKICAgIFRha2VzIGEgc3RyaW5nIGxpa2UgYWJjLjEudHdlbHZlIGFuZCB0dXJucyBpdCBpbnRvICgiYWJjIiwgMSwgInR3ZWx2ZSIpLgogICAgIiIiCiAgICBpZiBsb2NhbCBpcyBub3QgTm9uZToKICAgICAgICByZXR1cm4gdHVwbGUoCiAgICAgICAgICAgIHBhcnQubG93ZXIoKSBpZiBub3QgcGFydC5pc2RpZ2l0KCkgZWxzZSBpbnQocGFydCkKICAgICAgICAgICAgZm9yIHBhcnQgaW4gX2xvY2FsX3ZlcnNpb25fc2VwZXJhdG9ycy5zcGxpdChsb2NhbCkKICAgICAgICApCgoKZGVmIF9jbXBrZXkoZXBvY2gsIHJlbGVhc2UsIHByZSwgcG9zdCwgZGV2LCBsb2NhbCk6CiAgICAjIFdoZW4gd2UgY29tcGFyZSBhIHJlbGVhc2UgdmVyc2lvbiwgd2Ugd2FudCB0byBjb21wYXJlIGl0IHdpdGggYWxsIG9mIHRoZQogICAgIyB0cmFpbGluZyB6ZXJvcyByZW1vdmVkLiBTbyB3ZSdsbCB1c2UgYSByZXZlcnNlIHRoZSBsaXN0LCBkcm9wIGFsbCB0aGUgbm93CiAgICAjIGxlYWRpbmcgemVyb3MgdW50aWwgd2UgY29tZSB0byBzb21ldGhpbmcgbm9uIHplcm8sIHRoZW4gdGFrZSB0aGUgcmVzdAogICAgIyByZS1yZXZlcnNlIGl0IGJhY2sgaW50byB0aGUgY29ycmVjdCBvcmRlciBhbmQgbWFrZSBpdCBhIHR1cGxlIGFuZCB1c2UKICAgICMgdGhhdCBmb3Igb3VyIHNvcnRpbmcga2V5LgogICAgcmVsZWFzZSA9IHR1cGxlKAogICAgICAgIHJldmVyc2VkKGxpc3QoCiAgICAgICAgICAgIGl0ZXJ0b29scy5kcm9wd2hpbGUoCiAgICAgICAgICAgICAgICBsYW1iZGEgeDogeCA9PSAwLAogICAgICAgICAgICAgICAgcmV2ZXJzZWQocmVsZWFzZSksCiAgICAgICAgICAgICkKICAgICAgICApKQogICAgKQoKICAgICMgV2UgbmVlZCB0byAidHJpY2siIHRoZSBzb3J0aW5nIGFsZ29yaXRobSB0byBwdXQgMS4wLmRldjAgYmVmb3JlIDEuMGEwLgogICAgIyBXZSdsbCBkbyB0aGlzIGJ5IGFidXNpbmcgdGhlIHByZSBzZWdtZW50LCBidXQgd2UgX29ubHlfIHdhbnQgdG8gZG8gdGhpcwogICAgIyBpZiB0aGVyZSBpcyBub3QgYSBwcmUgb3IgYSBwb3N0IHNlZ21lbnQuIElmIHdlIGhhdmUgb25lIG9mIHRob3NlIHRoZW4KICAgICMgdGhlIG5vcm1hbCBzb3J0aW5nIHJ1bGVzIHdpbGwgaGFuZGxlIHRoaXMgY2FzZSBjb3JyZWN0bHkuCiAgICBpZiBwcmUgaXMgTm9uZSBhbmQgcG9zdCBpcyBOb25lIGFuZCBkZXYgaXMgbm90IE5vbmU6CiAgICAgICAgcHJlID0gLUluZmluaXR5CiAgICAjIFZlcnNpb25zIHdpdGhvdXQgYSBwcmUtcmVsZWFzZSAoZXhjZXB0IGFzIG5vdGVkIGFib3ZlKSBzaG91bGQgc29ydCBhZnRlcgogICAgIyB0aG9zZSB3aXRoIG9uZS4KICAgIGVsaWYgcHJlIGlzIE5vbmU6CiAgICAgICAgcHJlID0gSW5maW5pdHkKCiAgICAjIFZlcnNpb25zIHdpdGhvdXQgYSBwb3N0IHNlZ21lbnQgc2hvdWxkIHNvcnQgYmVmb3JlIHRob3NlIHdpdGggb25lLgogICAgaWYgcG9zdCBpcyBOb25lOgogICAgICAgIHBvc3QgPSAtSW5maW5pdHkKCiAgICAjIFZlcnNpb25zIHdpdGhvdXQgYSBkZXZlbG9wbWVudCBzZWdtZW50IHNob3VsZCBzb3J0IGFmdGVyIHRob3NlIHdpdGggb25lLgogICAgaWYgZGV2IGlzIE5vbmU6CiAgICAgICAgZGV2ID0gSW5maW5pdHkKCiAgICBpZiBsb2NhbCBpcyBOb25lOgogICAgICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIGxvY2FsIHNlZ21lbnQgc2hvdWxkIHNvcnQgYmVmb3JlIHRob3NlIHdpdGggb25lLgogICAgICAgIGxvY2FsID0gLUluZmluaXR5CiAgICBlbHNlOgogICAgICAgICMgVmVyc2lvbnMgd2l0aCBhIGxvY2FsIHNlZ21lbnQgbmVlZCB0aGF0IHNlZ21lbnQgcGFyc2VkIHRvIGltcGxlbWVudAogICAgICAgICMgdGhlIHNvcnRpbmcgcnVsZXMgaW4gUEVQNDQwLgogICAgICAgICMgLSBBbHBoYSBudW1lcmljIHNlZ21lbnRzIHNvcnQgYmVmb3JlIG51bWVyaWMgc2VnbWVudHMKICAgICAgICAjIC0gQWxwaGEgbnVtZXJpYyBzZWdtZW50cyBzb3J0IGxleGljb2dyYXBoaWNhbGx5CiAgICAgICAgIyAtIE51bWVyaWMgc2VnbWVudHMgc29ydCBudW1lcmljYWxseQogICAgICAgICMgLSBTaG9ydGVyIHZlcnNpb25zIHNvcnQgYmVmb3JlIGxvbmdlciB2ZXJzaW9ucyB3aGVuIHRoZSBwcmVmaXhlcwogICAgICAgICMgICBtYXRjaCBleGFjdGx5CiAgICAgICAgbG9jYWwgPSB0dXBsZSgKICAgICAgICAgICAgKGksICIiKSBpZiBpc2luc3RhbmNlKGksIGludCkgZWxzZSAoLUluZmluaXR5LCBpKQogICAgICAgICAgICBmb3IgaSBpbiBsb2NhbAogICAgICAgICkKCiAgICByZXR1cm4gZXBvY2gsIHJlbGVhc2UsIHByZSwgcG9zdCwgZGV2LCBsb2NhbApQSwMEFAAAAAAAAAAhAMktQCY+kwEAPpMBADUAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGtnX3Jlc291cmNlcy9fX2luaXRfXy5weSMgY29kaW5nOiB1dGYtOAoiIiIKUGFja2FnZSByZXNvdXJjZSBBUEkKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkEgcmVzb3VyY2UgaXMgYSBsb2dpY2FsIGZpbGUgY29udGFpbmVkIHdpdGhpbiBhIHBhY2thZ2UsIG9yIGEgbG9naWNhbApzdWJkaXJlY3RvcnkgdGhlcmVvZi4gIFRoZSBwYWNrYWdlIHJlc291cmNlIEFQSSBleHBlY3RzIHJlc291cmNlIG5hbWVzCnRvIGhhdmUgdGhlaXIgcGF0aCBwYXJ0cyBzZXBhcmF0ZWQgd2l0aCBgYC9gYCwgKm5vdCogd2hhdGV2ZXIgdGhlIGxvY2FsCnBhdGggc2VwYXJhdG9yIGlzLiAgRG8gbm90IHVzZSBvcy5wYXRoIG9wZXJhdGlvbnMgdG8gbWFuaXB1bGF0ZSByZXNvdXJjZQpuYW1lcyBiZWluZyBwYXNzZWQgaW50byB0aGUgQVBJLgoKVGhlIHBhY2thZ2UgcmVzb3VyY2UgQVBJIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBub3JtYWwgZmlsZXN5c3RlbSBwYWNrYWdlcywKLmVnZyBmaWxlcywgYW5kIHVucGFja2VkIC5lZ2cgZmlsZXMuICBJdCBjYW4gYWxzbyB3b3JrIGluIGEgbGltaXRlZCB3YXkgd2l0aAouemlwIGZpbGVzIGFuZCB3aXRoIGN1c3RvbSBQRVAgMzAyIGxvYWRlcnMgdGhhdCBzdXBwb3J0IHRoZSBgYGdldF9kYXRhKClgYAptZXRob2QuCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCBpbwppbXBvcnQgdGltZQppbXBvcnQgcmUKaW1wb3J0IHR5cGVzCmltcG9ydCB6aXBmaWxlCmltcG9ydCB6aXBpbXBvcnQKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBzdGF0CmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IHBrZ3V0aWwKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IHBsaXN0bGliCmltcG9ydCBlbWFpbC5wYXJzZXIKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCB0ZXh0d3JhcAppbXBvcnQgaXRlcnRvb2xzCmZyb20gcGtndXRpbCBpbXBvcnQgZ2V0X2ltcG9ydGVyCgp0cnk6CiAgICBpbXBvcnQgX2ltcApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAjIFB5dGhvbiAzLjIgY29tcGF0aWJpbGl0eQogICAgaW1wb3J0IGltcCBhcyBfaW1wCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBzaXgKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMgaW1wb3J0IHVybGxpYiwgbWFwLCBmaWx0ZXIKCiMgY2FwdHVyZSB0aGVzZSB0byBieXBhc3Mgc2FuZGJveGluZwpmcm9tIG9zIGltcG9ydCB1dGltZQp0cnk6CiAgICBmcm9tIG9zIGltcG9ydCBta2RpciwgcmVuYW1lLCB1bmxpbmsKICAgIFdSSVRFX1NVUFBPUlQgPSBUcnVlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICMgbm8gd3JpdGUgc3VwcG9ydCwgcHJvYmFibHkgdW5kZXIgR0FFCiAgICBXUklURV9TVVBQT1JUID0gRmFsc2UKCmZyb20gb3MgaW1wb3J0IG9wZW4gYXMgb3Nfb3Blbgpmcm9tIG9zLnBhdGggaW1wb3J0IGlzZGlyLCBzcGxpdAoKdHJ5OgogICAgaW1wb3J0IGltcG9ydGxpYi5tYWNoaW5lcnkgYXMgaW1wb3J0bGliX21hY2hpbmVyeQogICAgIyBhY2Nlc3MgYXR0cmlidXRlIHRvIGZvcmNlIGltcG9ydCB1bmRlciBkZWxheWVkIGltcG9ydCBtZWNoYW5pc21zLgogICAgaW1wb3J0bGliX21hY2hpbmVyeS5fX25hbWVfXwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnRsaWJfbWFjaGluZXJ5ID0gTm9uZQoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgYXBwZGlycwpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBwYWNrYWdpbmcKX19pbXBvcnRfXygncGlwLl92ZW5kb3IucGFja2FnaW5nLnZlcnNpb24nKQpfX2ltcG9ydF9fKCdwaXAuX3ZlbmRvci5wYWNrYWdpbmcuc3BlY2lmaWVycycpCl9faW1wb3J0X18oJ3BpcC5fdmVuZG9yLnBhY2thZ2luZy5yZXF1aXJlbWVudHMnKQpfX2ltcG9ydF9fKCdwaXAuX3ZlbmRvci5wYWNrYWdpbmcubWFya2VycycpCgoKaWYgKDMsIDApIDwgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzKToKICAgIG1zZyA9ICgKICAgICAgICAiU3VwcG9ydCBmb3IgUHl0aG9uIDMuMC0zLjIgaGFzIGJlZW4gZHJvcHBlZC4gRnV0dXJlIHZlcnNpb25zICIKICAgICAgICAid2lsbCBmYWlsIGhlcmUuIgogICAgKQogICAgd2FybmluZ3Mud2Fybihtc2cpCgojIGRlY2xhcmUgc29tZSBnbG9iYWxzIHRoYXQgd2lsbCBiZSBkZWZpbmVkIGxhdGVyIHRvCiMgc2F0aXNmeSB0aGUgbGludGVycy4KcmVxdWlyZSA9IE5vbmUKd29ya2luZ19zZXQgPSBOb25lCgoKY2xhc3MgUEVQNDQwV2FybmluZyhSdW50aW1lV2FybmluZyk6CiAgICAiIiIKICAgIFVzZWQgd2hlbiB0aGVyZSBpcyBhbiBpc3N1ZSB3aXRoIGEgdmVyc2lvbiBvciBzcGVjaWZpZXIgbm90IGNvbXBseWluZyB3aXRoCiAgICBQRVAgNDQwLgogICAgIiIiCgoKY2xhc3MgX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4ob2JqZWN0KToKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9faGFzaF9fKCkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSA8IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2x0X18ob3RoZXIpCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgPD0gb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fbGVfXyhvdGhlcikKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSA9PSBvdGhlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19lcV9fKG90aGVyKQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpID49IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2dlX18ob3RoZXIpCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgPiBvdGhlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19ndF9fKG90aGVyKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpICE9IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX25lX18ob3RoZXIpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpW2tleV0KCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgY29tcG9uZW50X3JlID0gcmUuY29tcGlsZShyJyhcZCsgfCBbYS16XSsgfCBcLnwgLSknLCByZS5WRVJCT1NFKQogICAgICAgIHJlcGxhY2UgPSB7CiAgICAgICAgICAgICdwcmUnOiAnYycsCiAgICAgICAgICAgICdwcmV2aWV3JzogJ2MnLAogICAgICAgICAgICAnLSc6ICdmaW5hbC0nLAogICAgICAgICAgICAncmMnOiAnYycsCiAgICAgICAgICAgICdkZXYnOiAnQCcsCiAgICAgICAgfS5nZXQKCiAgICAgICAgZGVmIF9wYXJzZV92ZXJzaW9uX3BhcnRzKHMpOgogICAgICAgICAgICBmb3IgcGFydCBpbiBjb21wb25lbnRfcmUuc3BsaXQocyk6CiAgICAgICAgICAgICAgICBwYXJ0ID0gcmVwbGFjZShwYXJ0LCBwYXJ0KQogICAgICAgICAgICAgICAgaWYgbm90IHBhcnQgb3IgcGFydCA9PSAnLic6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIHBhcnRbOjFdIGluICcwMTIzNDU2Nzg5JzoKICAgICAgICAgICAgICAgICAgICAjIHBhZCBmb3IgbnVtZXJpYyBjb21wYXJpc29uCiAgICAgICAgICAgICAgICAgICAgeWllbGQgcGFydC56ZmlsbCg4KQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB5aWVsZCAnKicgKyBwYXJ0CgogICAgICAgICAgICAjIGVuc3VyZSB0aGF0IGFscGhhL2JldGEvY2FuZGlkYXRlIGFyZSBiZWZvcmUgZmluYWwKICAgICAgICAgICAgeWllbGQgJypmaW5hbCcKCiAgICAgICAgZGVmIG9sZF9wYXJzZV92ZXJzaW9uKHMpOgogICAgICAgICAgICBwYXJ0cyA9IFtdCiAgICAgICAgICAgIGZvciBwYXJ0IGluIF9wYXJzZV92ZXJzaW9uX3BhcnRzKHMubG93ZXIoKSk6CiAgICAgICAgICAgICAgICBpZiBwYXJ0LnN0YXJ0c3dpdGgoJyonKToKICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSAnLScgYmVmb3JlIGEgcHJlcmVsZWFzZSB0YWcKICAgICAgICAgICAgICAgICAgICBpZiBwYXJ0IDwgJypmaW5hbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV0gPT0gJypmaW5hbC0nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMucG9wKCkKICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyB6ZXJvcyBmcm9tIGVhY2ggc2VyaWVzIG9mIG51bWVyaWMgcGFydHMKICAgICAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0cyBhbmQgcGFydHNbLTFdID09ICcwMDAwMDAwMCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpCiAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQocGFydCkKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHBhcnRzKQoKICAgICAgICAjIFdhcm4gZm9yIHVzZSBvZiB0aGlzIGZ1bmN0aW9uCiAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgIllvdSBoYXZlIGl0ZXJhdGVkIG92ZXIgdGhlIHJlc3VsdCBvZiAiCiAgICAgICAgICAgICJwa2dfcmVzb3VyY2VzLnBhcnNlX3ZlcnNpb24uIFRoaXMgaXMgYSBsZWdhY3kgYmVoYXZpb3Igd2hpY2ggaXMgIgogICAgICAgICAgICAiaW5jb25zaXN0ZW50IHdpdGggdGhlIG5ldyB2ZXJzaW9uIGNsYXNzIGludHJvZHVjZWQgaW4gc2V0dXB0b29scyAiCiAgICAgICAgICAgICI4LjAuIEluIG1vc3QgY2FzZXMsIGNvbnZlcnNpb24gdG8gYSB0dXBsZSBpcyB1bm5lY2Vzc2FyeS4gRm9yICIKICAgICAgICAgICAgImNvbXBhcmlzb24gb2YgdmVyc2lvbnMsIHNvcnQgdGhlIFZlcnNpb24gaW5zdGFuY2VzIGRpcmVjdGx5LiBJZiAiCiAgICAgICAgICAgICJ5b3UgaGF2ZSBhbm90aGVyIHVzZSBjYXNlIHJlcXVpcmluZyB0aGUgdHVwbGUsIHBsZWFzZSBmaWxlIGEgIgogICAgICAgICAgICAiYnVnIHdpdGggdGhlIHNldHVwdG9vbHMgcHJvamVjdCBkZXNjcmliaW5nIHRoYXQgbmVlZC4iLAogICAgICAgICAgICBSdW50aW1lV2FybmluZywKICAgICAgICAgICAgc3RhY2tsZXZlbD0xLAogICAgICAgICkKCiAgICAgICAgZm9yIHBhcnQgaW4gb2xkX3BhcnNlX3ZlcnNpb24oc3RyKHNlbGYpKToKICAgICAgICAgICAgeWllbGQgcGFydAoKCmNsYXNzIFNldHVwdG9vbHNWZXJzaW9uKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uKToKICAgIHBhc3MKCgpjbGFzcyBTZXR1cHRvb2xzTGVnYWN5VmVyc2lvbihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnaW5nLnZlcnNpb24uTGVnYWN5VmVyc2lvbik6CiAgICBwYXNzCgoKZGVmIHBhcnNlX3ZlcnNpb24odik6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIFNldHVwdG9vbHNWZXJzaW9uKHYpCiAgICBleGNlcHQgcGFja2FnaW5nLnZlcnNpb24uSW52YWxpZFZlcnNpb246CiAgICAgICAgcmV0dXJuIFNldHVwdG9vbHNMZWdhY3lWZXJzaW9uKHYpCgoKX3N0YXRlX3ZhcnMgPSB7fQoKCmRlZiBfZGVjbGFyZV9zdGF0ZSh2YXJ0eXBlLCAqKmt3KToKICAgIGdsb2JhbHMoKS51cGRhdGUoa3cpCiAgICBfc3RhdGVfdmFycy51cGRhdGUoZGljdC5mcm9ta2V5cyhrdywgdmFydHlwZSkpCgoKZGVmIF9fZ2V0c3RhdGVfXygpOgogICAgc3RhdGUgPSB7fQogICAgZyA9IGdsb2JhbHMoKQogICAgZm9yIGssIHYgaW4gX3N0YXRlX3ZhcnMuaXRlbXMoKToKICAgICAgICBzdGF0ZVtrXSA9IGdbJ19zZ2V0XycgKyB2XShnW2tdKQogICAgcmV0dXJuIHN0YXRlCgoKZGVmIF9fc2V0c3RhdGVfXyhzdGF0ZSk6CiAgICBnID0gZ2xvYmFscygpCiAgICBmb3IgaywgdiBpbiBzdGF0ZS5pdGVtcygpOgogICAgICAgIGdbJ19zc2V0XycgKyBfc3RhdGVfdmFyc1trXV0oaywgZ1trXSwgdikKICAgIHJldHVybiBzdGF0ZQoKCmRlZiBfc2dldF9kaWN0KHZhbCk6CiAgICByZXR1cm4gdmFsLmNvcHkoKQoKCmRlZiBfc3NldF9kaWN0KGtleSwgb2IsIHN0YXRlKToKICAgIG9iLmNsZWFyKCkKICAgIG9iLnVwZGF0ZShzdGF0ZSkKCgpkZWYgX3NnZXRfb2JqZWN0KHZhbCk6CiAgICByZXR1cm4gdmFsLl9fZ2V0c3RhdGVfXygpCgoKZGVmIF9zc2V0X29iamVjdChrZXksIG9iLCBzdGF0ZSk6CiAgICBvYi5fX3NldHN0YXRlX18oc3RhdGUpCgoKX3NnZXRfbm9uZSA9IF9zc2V0X25vbmUgPSBsYW1iZGEgKmFyZ3M6IE5vbmUKCgpkZWYgZ2V0X3N1cHBvcnRlZF9wbGF0Zm9ybSgpOgogICAgIiIiUmV0dXJuIHRoaXMgcGxhdGZvcm0ncyBtYXhpbXVtIGNvbXBhdGlibGUgdmVyc2lvbi4KCiAgICBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKSBub3JtYWxseSByZXBvcnRzIHRoZSBtaW5pbXVtIHZlcnNpb24KICAgIG9mIE1hYyBPUyBYIHRoYXQgd291bGQgYmUgcmVxdWlyZWQgdG8gKnVzZSogZXh0ZW5zaW9ucyBwcm9kdWNlZCBieQogICAgZGlzdHV0aWxzLiAgQnV0IHdoYXQgd2Ugd2FudCB3aGVuIGNoZWNraW5nIGNvbXBhdGliaWxpdHkgaXMgdG8ga25vdyB0aGUKICAgIHZlcnNpb24gb2YgTWFjIE9TIFggdGhhdCB3ZSBhcmUgKnJ1bm5pbmcqLiAgVG8gYWxsb3cgdXNhZ2Ugb2YgcGFja2FnZXMgdGhhdAogICAgZXhwbGljaXRseSByZXF1aXJlIGEgbmV3ZXIgdmVyc2lvbiBvZiBNYWMgT1MgWCwgd2UgbXVzdCBhbHNvIGtub3cgdGhlCiAgICBjdXJyZW50IHZlcnNpb24gb2YgdGhlIE9TLgoKICAgIElmIHRoaXMgY29uZGl0aW9uIG9jY3VycyBmb3IgYW55IG90aGVyIHBsYXRmb3JtIHdpdGggYSB2ZXJzaW9uIGluIGl0cwogICAgcGxhdGZvcm0gc3RyaW5ncywgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgZXh0ZW5kZWQgYWNjb3JkaW5nbHkuCiAgICAiIiIKICAgIHBsYXQgPSBnZXRfYnVpbGRfcGxhdGZvcm0oKQogICAgbSA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChwbGF0KQogICAgaWYgbSBpcyBub3QgTm9uZSBhbmQgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgICAgIHRyeToKICAgICAgICAgICAgcGxhdCA9ICdtYWNvc3gtJXMtJXMnICUgKCcuJy5qb2luKF9tYWNvc3hfdmVycygpWzoyXSksIG0uZ3JvdXAoMykpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICMgbm90IE1hYyBPUyBYCiAgICAgICAgICAgIHBhc3MKICAgIHJldHVybiBwbGF0CgoKX19hbGxfXyA9IFsKICAgICMgQmFzaWMgcmVzb3VyY2UgYWNjZXNzIGFuZCBkaXN0cmlidXRpb24vZW50cnkgcG9pbnQgZGlzY292ZXJ5CiAgICAncmVxdWlyZScsICdydW5fc2NyaXB0JywgJ2dldF9wcm92aWRlcicsICdnZXRfZGlzdHJpYnV0aW9uJywKICAgICdsb2FkX2VudHJ5X3BvaW50JywgJ2dldF9lbnRyeV9tYXAnLCAnZ2V0X2VudHJ5X2luZm8nLAogICAgJ2l0ZXJfZW50cnlfcG9pbnRzJywKICAgICdyZXNvdXJjZV9zdHJpbmcnLCAncmVzb3VyY2Vfc3RyZWFtJywgJ3Jlc291cmNlX2ZpbGVuYW1lJywKICAgICdyZXNvdXJjZV9saXN0ZGlyJywgJ3Jlc291cmNlX2V4aXN0cycsICdyZXNvdXJjZV9pc2RpcicsCgogICAgIyBFbnZpcm9ubWVudGFsIGNvbnRyb2wKICAgICdkZWNsYXJlX25hbWVzcGFjZScsICd3b3JraW5nX3NldCcsICdhZGRfYWN0aXZhdGlvbl9saXN0ZW5lcicsCiAgICAnZmluZF9kaXN0cmlidXRpb25zJywgJ3NldF9leHRyYWN0aW9uX3BhdGgnLCAnY2xlYW51cF9yZXNvdXJjZXMnLAogICAgJ2dldF9kZWZhdWx0X2NhY2hlJywKCiAgICAjIFByaW1hcnkgaW1wbGVtZW50YXRpb24gY2xhc3NlcwogICAgJ0Vudmlyb25tZW50JywgJ1dvcmtpbmdTZXQnLCAnUmVzb3VyY2VNYW5hZ2VyJywKICAgICdEaXN0cmlidXRpb24nLCAnUmVxdWlyZW1lbnQnLCAnRW50cnlQb2ludCcsCgogICAgIyBFeGNlcHRpb25zCiAgICAnUmVzb2x1dGlvbkVycm9yJywgJ1ZlcnNpb25Db25mbGljdCcsICdEaXN0cmlidXRpb25Ob3RGb3VuZCcsCiAgICAnVW5rbm93bkV4dHJhJywgJ0V4dHJhY3Rpb25FcnJvcicsCgogICAgIyBXYXJuaW5ncwogICAgJ1BFUDQ0MFdhcm5pbmcnLAoKICAgICMgUGFyc2luZyBmdW5jdGlvbnMgYW5kIHN0cmluZyB1dGlsaXRpZXMKICAgICdwYXJzZV9yZXF1aXJlbWVudHMnLCAncGFyc2VfdmVyc2lvbicsICdzYWZlX25hbWUnLCAnc2FmZV92ZXJzaW9uJywKICAgICdnZXRfcGxhdGZvcm0nLCAnY29tcGF0aWJsZV9wbGF0Zm9ybXMnLCAneWllbGRfbGluZXMnLCAnc3BsaXRfc2VjdGlvbnMnLAogICAgJ3NhZmVfZXh0cmEnLCAndG9fZmlsZW5hbWUnLCAnaW52YWxpZF9tYXJrZXInLCAnZXZhbHVhdGVfbWFya2VyJywKCiAgICAjIGZpbGVzeXN0ZW0gdXRpbGl0aWVzCiAgICAnZW5zdXJlX2RpcmVjdG9yeScsICdub3JtYWxpemVfcGF0aCcsCgogICAgIyBEaXN0cmlidXRpb24gInByZWNlZGVuY2UiIGNvbnN0YW50cwogICAgJ0VHR19ESVNUJywgJ0JJTkFSWV9ESVNUJywgJ1NPVVJDRV9ESVNUJywgJ0NIRUNLT1VUX0RJU1QnLCAnREVWRUxPUF9ESVNUJywKCiAgICAjICJQcm92aWRlciIgaW50ZXJmYWNlcywgaW1wbGVtZW50YXRpb25zLCBhbmQgcmVnaXN0cmF0aW9uL2xvb2t1cCBBUElzCiAgICAnSU1ldGFkYXRhUHJvdmlkZXInLCAnSVJlc291cmNlUHJvdmlkZXInLCAnRmlsZU1ldGFkYXRhJywKICAgICdQYXRoTWV0YWRhdGEnLCAnRWdnTWV0YWRhdGEnLCAnRW1wdHlQcm92aWRlcicsICdlbXB0eV9wcm92aWRlcicsCiAgICAnTnVsbFByb3ZpZGVyJywgJ0VnZ1Byb3ZpZGVyJywgJ0RlZmF1bHRQcm92aWRlcicsICdaaXBQcm92aWRlcicsCiAgICAncmVnaXN0ZXJfZmluZGVyJywgJ3JlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyJywgJ3JlZ2lzdGVyX2xvYWRlcl90eXBlJywKICAgICdmaXh1cF9uYW1lc3BhY2VfcGFja2FnZXMnLCAnZ2V0X2ltcG9ydGVyJywKCiAgICAjIERlcHJlY2F0ZWQvYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvbmx5CiAgICAncnVuX21haW4nLCAnQXZhaWxhYmxlRGlzdHJpYnV0aW9ucycsCl0KCgpjbGFzcyBSZXNvbHV0aW9uRXJyb3IoRXhjZXB0aW9uKToKICAgICIiIkFic3RyYWN0IGJhc2UgZm9yIGRlcGVuZGVuY3kgcmVzb2x1dGlvbiBlcnJvcnMiIiIKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgcmVwcihzZWxmLmFyZ3MpCgoKY2xhc3MgVmVyc2lvbkNvbmZsaWN0KFJlc29sdXRpb25FcnJvcik6CiAgICAiIiIKICAgIEFuIGFscmVhZHktaW5zdGFsbGVkIHZlcnNpb24gY29uZmxpY3RzIHdpdGggdGhlIHJlcXVlc3RlZCB2ZXJzaW9uLgoKICAgIFNob3VsZCBiZSBpbml0aWFsaXplZCB3aXRoIHRoZSBpbnN0YWxsZWQgRGlzdHJpYnV0aW9uIGFuZCB0aGUgcmVxdWVzdGVkCiAgICBSZXF1aXJlbWVudC4KICAgICIiIgoKICAgIF90ZW1wbGF0ZSA9ICJ7c2VsZi5kaXN0fSBpcyBpbnN0YWxsZWQgYnV0IHtzZWxmLnJlcX0gaXMgcmVxdWlyZWQiCgogICAgQHByb3BlcnR5CiAgICBkZWYgZGlzdChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMV0KCiAgICBkZWYgcmVwb3J0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl90ZW1wbGF0ZS5mb3JtYXQoKipsb2NhbHMoKSkKCiAgICBkZWYgd2l0aF9jb250ZXh0KHNlbGYsIHJlcXVpcmVkX2J5KToKICAgICAgICAiIiIKICAgICAgICBJZiByZXF1aXJlZF9ieSBpcyBub24tZW1wdHksIHJldHVybiBhIHZlcnNpb24gb2Ygc2VsZiB0aGF0IGlzIGEKICAgICAgICBDb250ZXh0dWFsVmVyc2lvbkNvbmZsaWN0LgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCByZXF1aXJlZF9ieToKICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICBhcmdzID0gc2VsZi5hcmdzICsgKHJlcXVpcmVkX2J5LCkKICAgICAgICByZXR1cm4gQ29udGV4dHVhbFZlcnNpb25Db25mbGljdCgqYXJncykKCgpjbGFzcyBDb250ZXh0dWFsVmVyc2lvbkNvbmZsaWN0KFZlcnNpb25Db25mbGljdCk6CiAgICAiIiIKICAgIEEgVmVyc2lvbkNvbmZsaWN0IHRoYXQgYWNjZXB0cyBhIHRoaXJkIHBhcmFtZXRlciwgdGhlIHNldCBvZiB0aGUKICAgIHJlcXVpcmVtZW50cyB0aGF0IHJlcXVpcmVkIHRoZSBpbnN0YWxsZWQgRGlzdHJpYnV0aW9uLgogICAgIiIiCgogICAgX3RlbXBsYXRlID0gVmVyc2lvbkNvbmZsaWN0Ll90ZW1wbGF0ZSArICcgYnkge3NlbGYucmVxdWlyZWRfYnl9JwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcXVpcmVkX2J5KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMl0KCgpjbGFzcyBEaXN0cmlidXRpb25Ob3RGb3VuZChSZXNvbHV0aW9uRXJyb3IpOgogICAgIiIiQSByZXF1ZXN0ZWQgZGlzdHJpYnV0aW9uIHdhcyBub3QgZm91bmQiIiIKCiAgICBfdGVtcGxhdGUgPSAoIlRoZSAne3NlbGYucmVxfScgZGlzdHJpYnV0aW9uIHdhcyBub3QgZm91bmQgIgogICAgICAgICAgICAgICAgICJhbmQgaXMgcmVxdWlyZWQgYnkge3NlbGYucmVxdWlyZXJzX3N0cn0iKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxdWlyZXJzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXF1aXJlcnNfc3RyKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLnJlcXVpcmVyczoKICAgICAgICAgICAgcmV0dXJuICd0aGUgYXBwbGljYXRpb24nCiAgICAgICAgcmV0dXJuICcsICcuam9pbihzZWxmLnJlcXVpcmVycykKCiAgICBkZWYgcmVwb3J0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl90ZW1wbGF0ZS5mb3JtYXQoKipsb2NhbHMoKSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5yZXBvcnQoKQoKCmNsYXNzIFVua25vd25FeHRyYShSZXNvbHV0aW9uRXJyb3IpOgogICAgIiIiRGlzdHJpYnV0aW9uIGRvZXNuJ3QgaGF2ZSBhbiAiZXh0cmEgZmVhdHVyZSIgb2YgdGhlIGdpdmVuIG5hbWUiIiIKCgpfcHJvdmlkZXJfZmFjdG9yaWVzID0ge30KClBZX01BSk9SID0gc3lzLnZlcnNpb25bOjNdCkVHR19ESVNUID0gMwpCSU5BUllfRElTVCA9IDIKU09VUkNFX0RJU1QgPSAxCkNIRUNLT1VUX0RJU1QgPSAwCkRFVkVMT1BfRElTVCA9IC0xCgoKZGVmIHJlZ2lzdGVyX2xvYWRlcl90eXBlKGxvYWRlcl90eXBlLCBwcm92aWRlcl9mYWN0b3J5KToKICAgICIiIlJlZ2lzdGVyIGBwcm92aWRlcl9mYWN0b3J5YCB0byBtYWtlIHByb3ZpZGVycyBmb3IgYGxvYWRlcl90eXBlYAoKICAgIGBsb2FkZXJfdHlwZWAgaXMgdGhlIHR5cGUgb3IgY2xhc3Mgb2YgYSBQRVAgMzAyIGBgbW9kdWxlLl9fbG9hZGVyX19gYCwKICAgIGFuZCBgcHJvdmlkZXJfZmFjdG9yeWAgaXMgYSBmdW5jdGlvbiB0aGF0LCBwYXNzZWQgYSAqbW9kdWxlKiBvYmplY3QsCiAgICByZXR1cm5zIGFuIGBgSVJlc291cmNlUHJvdmlkZXJgYCBmb3IgdGhhdCBtb2R1bGUuCiAgICAiIiIKICAgIF9wcm92aWRlcl9mYWN0b3JpZXNbbG9hZGVyX3R5cGVdID0gcHJvdmlkZXJfZmFjdG9yeQoKCmRlZiBnZXRfcHJvdmlkZXIobW9kdWxlT3JSZXEpOgogICAgIiIiUmV0dXJuIGFuIElSZXNvdXJjZVByb3ZpZGVyIGZvciB0aGUgbmFtZWQgbW9kdWxlIG9yIHJlcXVpcmVtZW50IiIiCiAgICBpZiBpc2luc3RhbmNlKG1vZHVsZU9yUmVxLCBSZXF1aXJlbWVudCk6CiAgICAgICAgcmV0dXJuIHdvcmtpbmdfc2V0LmZpbmQobW9kdWxlT3JSZXEpIG9yIHJlcXVpcmUoc3RyKG1vZHVsZU9yUmVxKSlbMF0KICAgIHRyeToKICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1ttb2R1bGVPclJlcV0KICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICBfX2ltcG9ydF9fKG1vZHVsZU9yUmVxKQogICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZHVsZU9yUmVxXQogICAgbG9hZGVyID0gZ2V0YXR0cihtb2R1bGUsICdfX2xvYWRlcl9fJywgTm9uZSkKICAgIHJldHVybiBfZmluZF9hZGFwdGVyKF9wcm92aWRlcl9mYWN0b3JpZXMsIGxvYWRlcikobW9kdWxlKQoKCmRlZiBfbWFjb3N4X3ZlcnMoX2NhY2hlPVtdKToKICAgIGlmIG5vdCBfY2FjaGU6CiAgICAgICAgdmVyc2lvbiA9IHBsYXRmb3JtLm1hY192ZXIoKVswXQogICAgICAgICMgZmFsbGJhY2sgZm9yIE1hY1BvcnRzCiAgICAgICAgaWYgdmVyc2lvbiA9PSAnJzoKICAgICAgICAgICAgcGxpc3QgPSAnL1N5c3RlbS9MaWJyYXJ5L0NvcmVTZXJ2aWNlcy9TeXN0ZW1WZXJzaW9uLnBsaXN0JwogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwbGlzdCk6CiAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHBsaXN0bGliLCAncmVhZFBsaXN0Jyk6CiAgICAgICAgICAgICAgICAgICAgcGxpc3RfY29udGVudCA9IHBsaXN0bGliLnJlYWRQbGlzdChwbGlzdCkKICAgICAgICAgICAgICAgICAgICBpZiAnUHJvZHVjdFZlcnNpb24nIGluIHBsaXN0X2NvbnRlbnQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBwbGlzdF9jb250ZW50WydQcm9kdWN0VmVyc2lvbiddCgogICAgICAgIF9jYWNoZS5hcHBlbmQodmVyc2lvbi5zcGxpdCgnLicpKQogICAgcmV0dXJuIF9jYWNoZVswXQoKCmRlZiBfbWFjb3N4X2FyY2gobWFjaGluZSk6CiAgICByZXR1cm4geydQb3dlclBDJzogJ3BwYycsICdQb3dlcl9NYWNpbnRvc2gnOiAncHBjJ30uZ2V0KG1hY2hpbmUsIG1hY2hpbmUpCgoKZGVmIGdldF9idWlsZF9wbGF0Zm9ybSgpOgogICAgIiIiUmV0dXJuIHRoaXMgcGxhdGZvcm0ncyBzdHJpbmcgZm9yIHBsYXRmb3JtLXNwZWNpZmljIGRpc3RyaWJ1dGlvbnMKCiAgICBYWFggQ3VycmVudGx5IHRoaXMgaXMgdGhlIHNhbWUgYXMgYGBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKWBgLCBidXQgaXQKICAgIG5lZWRzIHNvbWUgaGFja3MgZm9yIExpbnV4IGFuZCBNYWMgT1MgWC4KICAgICIiIgogICAgdHJ5OgogICAgICAgICMgUHl0aG9uIDIuNyBvciA+PTMuMgogICAgICAgIGZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfcGxhdGZvcm0KICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBnZXRfcGxhdGZvcm0KCiAgICBwbGF0ID0gZ2V0X3BsYXRmb3JtKCkKICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIiBhbmQgbm90IHBsYXQuc3RhcnRzd2l0aCgnbWFjb3N4LScpOgogICAgICAgIHRyeToKICAgICAgICAgICAgdmVyc2lvbiA9IF9tYWNvc3hfdmVycygpCiAgICAgICAgICAgIG1hY2hpbmUgPSBvcy51bmFtZSgpWzRdLnJlcGxhY2UoIiAiLCAiXyIpCiAgICAgICAgICAgIHJldHVybiAibWFjb3N4LSVkLiVkLSVzIiAlIChpbnQodmVyc2lvblswXSksIGludCh2ZXJzaW9uWzFdKSwKICAgICAgICAgICAgICAgIF9tYWNvc3hfYXJjaChtYWNoaW5lKSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIyBpZiBzb21lb25lIGlzIHJ1bm5pbmcgYSBub24tTWFjIGRhcndpbiBzeXN0ZW0sIHRoaXMgd2lsbCBmYWxsCiAgICAgICAgICAgICMgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICBwYXNzCiAgICByZXR1cm4gcGxhdAoKCm1hY29zVmVyc2lvblN0cmluZyA9IHJlLmNvbXBpbGUociJtYWNvc3gtKFxkKylcLihcZCspLSguKikiKQpkYXJ3aW5WZXJzaW9uU3RyaW5nID0gcmUuY29tcGlsZShyImRhcndpbi0oXGQrKVwuKFxkKylcLihcZCspLSguKikiKQojIFhYWCBiYWNrd2FyZCBjb21wYXQKZ2V0X3BsYXRmb3JtID0gZ2V0X2J1aWxkX3BsYXRmb3JtCgoKZGVmIGNvbXBhdGlibGVfcGxhdGZvcm1zKHByb3ZpZGVkLCByZXF1aXJlZCk6CiAgICAiIiJDYW4gY29kZSBmb3IgdGhlIGBwcm92aWRlZGAgcGxhdGZvcm0gcnVuIG9uIHRoZSBgcmVxdWlyZWRgIHBsYXRmb3JtPwoKICAgIFJldHVybnMgdHJ1ZSBpZiBlaXRoZXIgcGxhdGZvcm0gaXMgYGBOb25lYGAsIG9yIHRoZSBwbGF0Zm9ybXMgYXJlIGVxdWFsLgoKICAgIFhYWCBOZWVkcyBjb21wYXRpYmlsaXR5IGNoZWNrcyBmb3IgTGludXggYW5kIG90aGVyIHVuaXh5IE9TZXMuCiAgICAiIiIKICAgIGlmIHByb3ZpZGVkIGlzIE5vbmUgb3IgcmVxdWlyZWQgaXMgTm9uZSBvciBwcm92aWRlZCA9PSByZXF1aXJlZDoKICAgICAgICAjIGVhc3kgY2FzZQogICAgICAgIHJldHVybiBUcnVlCgogICAgIyBNYWMgT1MgWCBzcGVjaWFsIGNhc2VzCiAgICByZXFNYWMgPSBtYWNvc1ZlcnNpb25TdHJpbmcubWF0Y2gocmVxdWlyZWQpCiAgICBpZiByZXFNYWM6CiAgICAgICAgcHJvdk1hYyA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChwcm92aWRlZCkKCiAgICAgICAgIyBpcyB0aGlzIGEgTWFjIHBhY2thZ2U/CiAgICAgICAgaWYgbm90IHByb3ZNYWM6CiAgICAgICAgICAgICMgdGhpcyBpcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgcGFja2FnZXMgYnVpbHQgYmVmb3JlCiAgICAgICAgICAgICMgc2V0dXB0b29scyAwLjYuIEFsbCBwYWNrYWdlcyBidWlsdCBhZnRlciB0aGlzIHBvaW50IHdpbGwKICAgICAgICAgICAgIyB1c2UgdGhlIG5ldyBtYWNvc3ggZGVzaWduYXRpb24uCiAgICAgICAgICAgIHByb3ZEYXJ3aW4gPSBkYXJ3aW5WZXJzaW9uU3RyaW5nLm1hdGNoKHByb3ZpZGVkKQogICAgICAgICAgICBpZiBwcm92RGFyd2luOgogICAgICAgICAgICAgICAgZHZlcnNpb24gPSBpbnQocHJvdkRhcndpbi5ncm91cCgxKSkKICAgICAgICAgICAgICAgIG1hY29zdmVyc2lvbiA9ICIlcy4lcyIgJSAocmVxTWFjLmdyb3VwKDEpLCByZXFNYWMuZ3JvdXAoMikpCiAgICAgICAgICAgICAgICBpZiBkdmVyc2lvbiA9PSA3IGFuZCBtYWNvc3ZlcnNpb24gPj0gIjEwLjMiIG9yIFwKICAgICAgICAgICAgICAgICAgICAgICAgZHZlcnNpb24gPT0gOCBhbmQgbWFjb3N2ZXJzaW9uID49ICIxMC40IjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICAjIGVnZyBpc24ndCBtYWNvc3ggb3IgbGVnYWN5IGRhcndpbgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBhcmUgdGhleSB0aGUgc2FtZSBtYWpvciB2ZXJzaW9uIGFuZCBtYWNoaW5lIHR5cGU/CiAgICAgICAgaWYgcHJvdk1hYy5ncm91cCgxKSAhPSByZXFNYWMuZ3JvdXAoMSkgb3IgXAogICAgICAgICAgICAgICAgcHJvdk1hYy5ncm91cCgzKSAhPSByZXFNYWMuZ3JvdXAoMyk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIGlzIHRoZSByZXF1aXJlZCBPUyBtYWpvciB1cGRhdGUgPj0gdGhlIHByb3ZpZGVkIG9uZT8KICAgICAgICBpZiBpbnQocHJvdk1hYy5ncm91cCgyKSkgPiBpbnQocmVxTWFjLmdyb3VwKDIpKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHJldHVybiBUcnVlCgogICAgIyBYWFggTGludXggYW5kIG90aGVyIHBsYXRmb3Jtcycgc3BlY2lhbCBjYXNlcyBzaG91bGQgZ28gaGVyZQogICAgcmV0dXJuIEZhbHNlCgoKZGVmIHJ1bl9zY3JpcHQoZGlzdF9zcGVjLCBzY3JpcHRfbmFtZSk6CiAgICAiIiJMb2NhdGUgZGlzdHJpYnV0aW9uIGBkaXN0X3NwZWNgIGFuZCBydW4gaXRzIGBzY3JpcHRfbmFtZWAgc2NyaXB0IiIiCiAgICBucyA9IHN5cy5fZ2V0ZnJhbWUoMSkuZl9nbG9iYWxzCiAgICBuYW1lID0gbnNbJ19fbmFtZV9fJ10KICAgIG5zLmNsZWFyKCkKICAgIG5zWydfX25hbWVfXyddID0gbmFtZQogICAgcmVxdWlyZShkaXN0X3NwZWMpWzBdLnJ1bl9zY3JpcHQoc2NyaXB0X25hbWUsIG5zKQoKCiMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQpydW5fbWFpbiA9IHJ1bl9zY3JpcHQKCgpkZWYgZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KToKICAgICIiIlJldHVybiBhIGN1cnJlbnQgZGlzdHJpYnV0aW9uIG9iamVjdCBmb3IgYSBSZXF1aXJlbWVudCBvciBzdHJpbmciIiIKICAgIGlmIGlzaW5zdGFuY2UoZGlzdCwgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgZGlzdCA9IFJlcXVpcmVtZW50LnBhcnNlKGRpc3QpCiAgICBpZiBpc2luc3RhbmNlKGRpc3QsIFJlcXVpcmVtZW50KToKICAgICAgICBkaXN0ID0gZ2V0X3Byb3ZpZGVyKGRpc3QpCiAgICBpZiBub3QgaXNpbnN0YW5jZShkaXN0LCBEaXN0cmlidXRpb24pOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcigiRXhwZWN0ZWQgc3RyaW5nLCBSZXF1aXJlbWVudCwgb3IgRGlzdHJpYnV0aW9uIiwgZGlzdCkKICAgIHJldHVybiBkaXN0CgoKZGVmIGxvYWRfZW50cnlfcG9pbnQoZGlzdCwgZ3JvdXAsIG5hbWUpOgogICAgIiIiUmV0dXJuIGBuYW1lYCBlbnRyeSBwb2ludCBvZiBgZ3JvdXBgIGZvciBgZGlzdGAgb3IgcmFpc2UgSW1wb3J0RXJyb3IiIiIKICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmxvYWRfZW50cnlfcG9pbnQoZ3JvdXAsIG5hbWUpCgoKZGVmIGdldF9lbnRyeV9tYXAoZGlzdCwgZ3JvdXA9Tm9uZSk6CiAgICAiIiJSZXR1cm4gdGhlIGVudHJ5IHBvaW50IG1hcCBmb3IgYGdyb3VwYCwgb3IgdGhlIGZ1bGwgZW50cnkgbWFwIiIiCiAgICByZXR1cm4gZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KS5nZXRfZW50cnlfbWFwKGdyb3VwKQoKCmRlZiBnZXRfZW50cnlfaW5mbyhkaXN0LCBncm91cCwgbmFtZSk6CiAgICAiIiJSZXR1cm4gdGhlIEVudHJ5UG9pbnQgb2JqZWN0IGZvciBgZ3JvdXBgK2BuYW1lYCwgb3IgYGBOb25lYGAiIiIKICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmdldF9lbnRyeV9pbmZvKGdyb3VwLCBuYW1lKQoKCmNsYXNzIElNZXRhZGF0YVByb3ZpZGVyOgogICAgZGVmIGhhc19tZXRhZGF0YShuYW1lKToKICAgICAgICAiIiJEb2VzIHRoZSBwYWNrYWdlJ3MgZGlzdHJpYnV0aW9uIGNvbnRhaW4gdGhlIG5hbWVkIG1ldGFkYXRhPyIiIgoKICAgIGRlZiBnZXRfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgIiIiVGhlIG5hbWVkIG1ldGFkYXRhIHJlc291cmNlIGFzIGEgc3RyaW5nIiIiCgogICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhuYW1lKToKICAgICAgICAiIiJZaWVsZCBuYW1lZCBtZXRhZGF0YSByZXNvdXJjZSBhcyBsaXN0IG9mIG5vbi1ibGFuayBub24tY29tbWVudCBsaW5lcwoKICAgICAgIExlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgc3RyaXBwZWQgZnJvbSBlYWNoIGxpbmUsIGFuZCBsaW5lcwogICAgICAgd2l0aCBgYCNgYCBhcyB0aGUgZmlyc3Qgbm9uLWJsYW5rIGNoYXJhY3RlciBhcmUgb21pdHRlZC4iIiIKCiAgICBkZWYgbWV0YWRhdGFfaXNkaXIobmFtZSk6CiAgICAgICAgIiIiSXMgdGhlIG5hbWVkIG1ldGFkYXRhIGEgZGlyZWN0b3J5PyAgKGxpa2UgYGBvcy5wYXRoLmlzZGlyKClgYCkiIiIKCiAgICBkZWYgbWV0YWRhdGFfbGlzdGRpcihuYW1lKToKICAgICAgICAiIiJMaXN0IG9mIG1ldGFkYXRhIG5hbWVzIGluIHRoZSBkaXJlY3RvcnkgKGxpa2UgYGBvcy5saXN0ZGlyKClgYCkiIiIKCiAgICBkZWYgcnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbmFtZXNwYWNlKToKICAgICAgICAiIiJFeGVjdXRlIHRoZSBuYW1lZCBzY3JpcHQgaW4gdGhlIHN1cHBsaWVkIG5hbWVzcGFjZSBkaWN0aW9uYXJ5IiIiCgoKY2xhc3MgSVJlc291cmNlUHJvdmlkZXIoSU1ldGFkYXRhUHJvdmlkZXIpOgogICAgIiIiQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHBhY2thZ2UgcmVzb3VyY2VzIiIiCgogICAgZGVmIGdldF9yZXNvdXJjZV9maWxlbmFtZShtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSB0cnVlIGZpbGVzeXN0ZW0gcGF0aCBmb3IgYHJlc291cmNlX25hbWVgCgogICAgICAgIGBtYW5hZ2VyYCBtdXN0IGJlIGFuIGBgSVJlc291cmNlTWFuYWdlcmBgIiIiCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJlYW0obWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgcmVhZGFibGUgZmlsZS1saWtlIG9iamVjdCBmb3IgYHJlc291cmNlX25hbWVgCgogICAgICAgIGBtYW5hZ2VyYCBtdXN0IGJlIGFuIGBgSVJlc291cmNlTWFuYWdlcmBgIiIiCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJpbmcobWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIGByZXNvdXJjZV9uYW1lYAoKICAgICAgICBgbWFuYWdlcmAgbXVzdCBiZSBhbiBgYElSZXNvdXJjZU1hbmFnZXJgYCIiIgoKICAgIGRlZiBoYXNfcmVzb3VyY2UocmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiRG9lcyB0aGUgcGFja2FnZSBjb250YWluIHRoZSBuYW1lZCByZXNvdXJjZT8iIiIKCiAgICBkZWYgcmVzb3VyY2VfaXNkaXIocmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiSXMgdGhlIG5hbWVkIHJlc291cmNlIGEgZGlyZWN0b3J5PyAgKGxpa2UgYGBvcy5wYXRoLmlzZGlyKClgYCkiIiIKCiAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihyZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJMaXN0IG9mIHJlc291cmNlIG5hbWVzIGluIHRoZSBkaXJlY3RvcnkgKGxpa2UgYGBvcy5saXN0ZGlyKClgYCkiIiIKCgpjbGFzcyBXb3JraW5nU2V0KG9iamVjdCk6CiAgICAiIiJBIGNvbGxlY3Rpb24gb2YgYWN0aXZlIGRpc3RyaWJ1dGlvbnMgb24gc3lzLnBhdGggKG9yIGEgc2ltaWxhciBsaXN0KSIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbnRyaWVzPU5vbmUpOgogICAgICAgICIiIkNyZWF0ZSB3b3JraW5nIHNldCBmcm9tIGxpc3Qgb2YgcGF0aCBlbnRyaWVzIChkZWZhdWx0PXN5cy5wYXRoKSIiIgogICAgICAgIHNlbGYuZW50cmllcyA9IFtdCiAgICAgICAgc2VsZi5lbnRyeV9rZXlzID0ge30KICAgICAgICBzZWxmLmJ5X2tleSA9IHt9CiAgICAgICAgc2VsZi5jYWxsYmFja3MgPSBbXQoKICAgICAgICBpZiBlbnRyaWVzIGlzIE5vbmU6CiAgICAgICAgICAgIGVudHJpZXMgPSBzeXMucGF0aAoKICAgICAgICBmb3IgZW50cnkgaW4gZW50cmllczoKICAgICAgICAgICAgc2VsZi5hZGRfZW50cnkoZW50cnkpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2J1aWxkX21hc3RlcihjbHMpOgogICAgICAgICIiIgogICAgICAgIFByZXBhcmUgdGhlIG1hc3RlciB3b3JraW5nIHNldC4KICAgICAgICAiIiIKICAgICAgICB3cyA9IGNscygpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIF9fbWFpbl9fIGltcG9ydCBfX3JlcXVpcmVzX18KICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICMgVGhlIG1haW4gcHJvZ3JhbSBkb2VzIG5vdCBsaXN0IGFueSByZXF1aXJlbWVudHMKICAgICAgICAgICAgcmV0dXJuIHdzCgogICAgICAgICMgZW5zdXJlIHRoZSByZXF1aXJlbWVudHMgYXJlIG1ldAogICAgICAgIHRyeToKICAgICAgICAgICAgd3MucmVxdWlyZShfX3JlcXVpcmVzX18pCiAgICAgICAgZXhjZXB0IFZlcnNpb25Db25mbGljdDoKICAgICAgICAgICAgcmV0dXJuIGNscy5fYnVpbGRfZnJvbV9yZXF1aXJlbWVudHMoX19yZXF1aXJlc19fKQoKICAgICAgICByZXR1cm4gd3MKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfYnVpbGRfZnJvbV9yZXF1aXJlbWVudHMoY2xzLCByZXFfc3BlYyk6CiAgICAgICAgIiIiCiAgICAgICAgQnVpbGQgYSB3b3JraW5nIHNldCBmcm9tIGEgcmVxdWlyZW1lbnQgc3BlYy4gUmV3cml0ZXMgc3lzLnBhdGguCiAgICAgICAgIiIiCiAgICAgICAgIyB0cnkgaXQgd2l0aG91dCBkZWZhdWx0cyBhbHJlYWR5IG9uIHN5cy5wYXRoCiAgICAgICAgIyBieSBzdGFydGluZyB3aXRoIGFuIGVtcHR5IHBhdGgKICAgICAgICB3cyA9IGNscyhbXSkKICAgICAgICByZXFzID0gcGFyc2VfcmVxdWlyZW1lbnRzKHJlcV9zcGVjKQogICAgICAgIGRpc3RzID0gd3MucmVzb2x2ZShyZXFzLCBFbnZpcm9ubWVudCgpKQogICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgICAgICB3cy5hZGQoZGlzdCkKCiAgICAgICAgIyBhZGQgYW55IG1pc3NpbmcgZW50cmllcyBmcm9tIHN5cy5wYXRoCiAgICAgICAgZm9yIGVudHJ5IGluIHN5cy5wYXRoOgogICAgICAgICAgICBpZiBlbnRyeSBub3QgaW4gd3MuZW50cmllczoKICAgICAgICAgICAgICAgIHdzLmFkZF9lbnRyeShlbnRyeSkKCiAgICAgICAgIyB0aGVuIGNvcHkgYmFjayB0byBzeXMucGF0aAogICAgICAgIHN5cy5wYXRoWzpdID0gd3MuZW50cmllcwogICAgICAgIHJldHVybiB3cwoKICAgIGRlZiBhZGRfZW50cnkoc2VsZiwgZW50cnkpOgogICAgICAgICIiIkFkZCBhIHBhdGggaXRlbSB0byBgYC5lbnRyaWVzYGAsIGZpbmRpbmcgYW55IGRpc3RyaWJ1dGlvbnMgb24gaXQKCiAgICAgICAgYGBmaW5kX2Rpc3RyaWJ1dGlvbnMoZW50cnksIFRydWUpYGAgaXMgdXNlZCB0byBmaW5kIGRpc3RyaWJ1dGlvbnMKICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXRoIGVudHJ5LCBhbmQgdGhleSBhcmUgYWRkZWQuICBgZW50cnlgIGlzCiAgICAgICAgYWx3YXlzIGFwcGVuZGVkIHRvIGBgLmVudHJpZXNgYCwgZXZlbiBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQuCiAgICAgICAgKFRoaXMgaXMgYmVjYXVzZSBgYHN5cy5wYXRoYGAgY2FuIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWUgbW9yZSB0aGFuCiAgICAgICAgb25jZSwgYW5kIHRoZSBgYC5lbnRyaWVzYGAgb2YgdGhlIGBgc3lzLnBhdGhgYCBXb3JraW5nU2V0IHNob3VsZCBhbHdheXMKICAgICAgICBlcXVhbCBgYHN5cy5wYXRoYGAuKQogICAgICAgICIiIgogICAgICAgIHNlbGYuZW50cnlfa2V5cy5zZXRkZWZhdWx0KGVudHJ5LCBbXSkKICAgICAgICBzZWxmLmVudHJpZXMuYXBwZW5kKGVudHJ5KQogICAgICAgIGZvciBkaXN0IGluIGZpbmRfZGlzdHJpYnV0aW9ucyhlbnRyeSwgVHJ1ZSk6CiAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QsIGVudHJ5LCBGYWxzZSkKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGRpc3QpOgogICAgICAgICIiIlRydWUgaWYgYGRpc3RgIGlzIHRoZSBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciBpdHMgcHJvamVjdCIiIgogICAgICAgIHJldHVybiBzZWxmLmJ5X2tleS5nZXQoZGlzdC5rZXkpID09IGRpc3QKCiAgICBkZWYgZmluZChzZWxmLCByZXEpOgogICAgICAgICIiIkZpbmQgYSBkaXN0cmlidXRpb24gbWF0Y2hpbmcgcmVxdWlyZW1lbnQgYHJlcWAKCiAgICAgICAgSWYgdGhlcmUgaXMgYW4gYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBwcm9qZWN0LCB0aGlzCiAgICAgICAgcmV0dXJucyBpdCBhcyBsb25nIGFzIGl0IG1lZXRzIHRoZSB2ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWNpZmllZCBieQogICAgICAgIGByZXFgLiAgQnV0LCBpZiB0aGVyZSBpcyBhbiBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgcHJvamVjdCBhbmQgaXQKICAgICAgICBkb2VzICpub3QqIG1lZXQgdGhlIGByZXFgIHJlcXVpcmVtZW50LCBgYFZlcnNpb25Db25mbGljdGBgIGlzIHJhaXNlZC4KICAgICAgICBJZiB0aGVyZSBpcyBubyBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgcmVxdWVzdGVkIHByb2plY3QsIGBgTm9uZWBgCiAgICAgICAgaXMgcmV0dXJuZWQuCiAgICAgICAgIiIiCiAgICAgICAgZGlzdCA9IHNlbGYuYnlfa2V5LmdldChyZXEua2V5KQogICAgICAgIGlmIGRpc3QgaXMgbm90IE5vbmUgYW5kIGRpc3Qgbm90IGluIHJlcToKICAgICAgICAgICAgIyBYWFggYWRkIG1vcmUgaW5mbwogICAgICAgICAgICByYWlzZSBWZXJzaW9uQ29uZmxpY3QoZGlzdCwgcmVxKQogICAgICAgIHJldHVybiBkaXN0CgogICAgZGVmIGl0ZXJfZW50cnlfcG9pbnRzKHNlbGYsIGdyb3VwLCBuYW1lPU5vbmUpOgogICAgICAgICIiIllpZWxkIGVudHJ5IHBvaW50IG9iamVjdHMgZnJvbSBgZ3JvdXBgIG1hdGNoaW5nIGBuYW1lYAoKICAgICAgICBJZiBgbmFtZWAgaXMgTm9uZSwgeWllbGRzIGFsbCBlbnRyeSBwb2ludHMgaW4gYGdyb3VwYCBmcm9tIGFsbAogICAgICAgIGRpc3RyaWJ1dGlvbnMgaW4gdGhlIHdvcmtpbmcgc2V0LCBvdGhlcndpc2Ugb25seSBvbmVzIG1hdGNoaW5nCiAgICAgICAgYm90aCBgZ3JvdXBgIGFuZCBgbmFtZWAgYXJlIHlpZWxkZWQgKGluIGRpc3RyaWJ1dGlvbiBvcmRlcikuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZjoKICAgICAgICAgICAgZW50cmllcyA9IGRpc3QuZ2V0X2VudHJ5X21hcChncm91cCkKICAgICAgICAgICAgaWYgbmFtZSBpcyBOb25lOgogICAgICAgICAgICAgICAgZm9yIGVwIGluIGVudHJpZXMudmFsdWVzKCk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgZXAKICAgICAgICAgICAgZWxpZiBuYW1lIGluIGVudHJpZXM6CiAgICAgICAgICAgICAgICB5aWVsZCBlbnRyaWVzW25hbWVdCgogICAgZGVmIHJ1bl9zY3JpcHQoc2VsZiwgcmVxdWlyZXMsIHNjcmlwdF9uYW1lKToKICAgICAgICAiIiJMb2NhdGUgZGlzdHJpYnV0aW9uIGZvciBgcmVxdWlyZXNgIGFuZCBydW4gYHNjcmlwdF9uYW1lYCBzY3JpcHQiIiIKICAgICAgICBucyA9IHN5cy5fZ2V0ZnJhbWUoMSkuZl9nbG9iYWxzCiAgICAgICAgbmFtZSA9IG5zWydfX25hbWVfXyddCiAgICAgICAgbnMuY2xlYXIoKQogICAgICAgIG5zWydfX25hbWVfXyddID0gbmFtZQogICAgICAgIHNlbGYucmVxdWlyZShyZXF1aXJlcylbMF0ucnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbnMpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIllpZWxkIGRpc3RyaWJ1dGlvbnMgZm9yIG5vbi1kdXBsaWNhdGUgcHJvamVjdHMgaW4gdGhlIHdvcmtpbmcgc2V0CgogICAgICAgIFRoZSB5aWVsZCBvcmRlciBpcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGl0ZW1zJyBwYXRoIGVudHJpZXMgd2VyZQogICAgICAgIGFkZGVkIHRvIHRoZSB3b3JraW5nIHNldC4KICAgICAgICAiIiIKICAgICAgICBzZWVuID0ge30KICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLmVudHJpZXM6CiAgICAgICAgICAgIGlmIGl0ZW0gbm90IGluIHNlbGYuZW50cnlfa2V5czoKICAgICAgICAgICAgICAgICMgd29ya2Fyb3VuZCBhIGNhY2hlIGlzc3VlCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgZm9yIGtleSBpbiBzZWxmLmVudHJ5X2tleXNbaXRlbV06CiAgICAgICAgICAgICAgICBpZiBrZXkgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICAgICAgc2VlbltrZXldID0gMQogICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuYnlfa2V5W2tleV0KCiAgICBkZWYgYWRkKHNlbGYsIGRpc3QsIGVudHJ5PU5vbmUsIGluc2VydD1UcnVlLCByZXBsYWNlPUZhbHNlKToKICAgICAgICAiIiJBZGQgYGRpc3RgIHRvIHdvcmtpbmcgc2V0LCBhc3NvY2lhdGVkIHdpdGggYGVudHJ5YAoKICAgICAgICBJZiBgZW50cnlgIGlzIHVuc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB0aGUgYGAubG9jYXRpb25gYCBvZiBgZGlzdGAuCiAgICAgICAgT24gZXhpdCBmcm9tIHRoaXMgcm91dGluZSwgYGVudHJ5YCBpcyBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSB3b3JraW5nCiAgICAgICAgc2V0J3MgYGAuZW50cmllc2BgIChpZiBpdCB3YXNuJ3QgYWxyZWFkeSBwcmVzZW50KS4KCiAgICAgICAgYGRpc3RgIGlzIG9ubHkgYWRkZWQgdG8gdGhlIHdvcmtpbmcgc2V0IGlmIGl0J3MgZm9yIGEgcHJvamVjdCB0aGF0CiAgICAgICAgZG9lc24ndCBhbHJlYWR5IGhhdmUgYSBkaXN0cmlidXRpb24gaW4gdGhlIHNldCwgdW5sZXNzIGByZXBsYWNlPVRydWVgLgogICAgICAgIElmIGl0J3MgYWRkZWQsIGFueSBjYWxsYmFja3MgcmVnaXN0ZXJlZCB3aXRoIHRoZSBgYHN1YnNjcmliZSgpYGAgbWV0aG9kCiAgICAgICAgd2lsbCBiZSBjYWxsZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaW5zZXJ0OgogICAgICAgICAgICBkaXN0Lmluc2VydF9vbihzZWxmLmVudHJpZXMsIGVudHJ5LCByZXBsYWNlPXJlcGxhY2UpCgogICAgICAgIGlmIGVudHJ5IGlzIE5vbmU6CiAgICAgICAgICAgIGVudHJ5ID0gZGlzdC5sb2NhdGlvbgogICAgICAgIGtleXMgPSBzZWxmLmVudHJ5X2tleXMuc2V0ZGVmYXVsdChlbnRyeSwgW10pCiAgICAgICAga2V5czIgPSBzZWxmLmVudHJ5X2tleXMuc2V0ZGVmYXVsdChkaXN0LmxvY2F0aW9uLCBbXSkKICAgICAgICBpZiBub3QgcmVwbGFjZSBhbmQgZGlzdC5rZXkgaW4gc2VsZi5ieV9rZXk6CiAgICAgICAgICAgICMgaWdub3JlIGhpZGRlbiBkaXN0cm9zCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZWxmLmJ5X2tleVtkaXN0LmtleV0gPSBkaXN0CiAgICAgICAgaWYgZGlzdC5rZXkgbm90IGluIGtleXM6CiAgICAgICAgICAgIGtleXMuYXBwZW5kKGRpc3Qua2V5KQogICAgICAgIGlmIGRpc3Qua2V5IG5vdCBpbiBrZXlzMjoKICAgICAgICAgICAga2V5czIuYXBwZW5kKGRpc3Qua2V5KQogICAgICAgIHNlbGYuX2FkZGVkX25ldyhkaXN0KQoKICAgIGRlZiByZXNvbHZlKHNlbGYsIHJlcXVpcmVtZW50cywgZW52PU5vbmUsIGluc3RhbGxlcj1Ob25lLAogICAgICAgICAgICByZXBsYWNlX2NvbmZsaWN0aW5nPUZhbHNlKToKICAgICAgICAiIiJMaXN0IGFsbCBkaXN0cmlidXRpb25zIG5lZWRlZCB0byAocmVjdXJzaXZlbHkpIG1lZXQgYHJlcXVpcmVtZW50c2AKCiAgICAgICAgYHJlcXVpcmVtZW50c2AgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIGBgUmVxdWlyZW1lbnRgYCBvYmplY3RzLiAgYGVudmAsCiAgICAgICAgaWYgc3VwcGxpZWQsIHNob3VsZCBiZSBhbiBgYEVudmlyb25tZW50YGAgaW5zdGFuY2UuICBJZgogICAgICAgIG5vdCBzdXBwbGllZCwgaXQgZGVmYXVsdHMgdG8gYWxsIGRpc3RyaWJ1dGlvbnMgYXZhaWxhYmxlIHdpdGhpbiBhbnkKICAgICAgICBlbnRyeSBvciBkaXN0cmlidXRpb24gaW4gdGhlIHdvcmtpbmcgc2V0LiAgYGluc3RhbGxlcmAsIGlmIHN1cHBsaWVkLAogICAgICAgIHdpbGwgYmUgaW52b2tlZCB3aXRoIGVhY2ggcmVxdWlyZW1lbnQgdGhhdCBjYW5ub3QgYmUgbWV0IGJ5IGFuCiAgICAgICAgYWxyZWFkeS1pbnN0YWxsZWQgZGlzdHJpYnV0aW9uOyBpdCBzaG91bGQgcmV0dXJuIGEgYGBEaXN0cmlidXRpb25gYCBvcgogICAgICAgIGBgTm9uZWBgLgoKICAgICAgICBVbmxlc3MgYHJlcGxhY2VfY29uZmxpY3Rpbmc9VHJ1ZWAsIHJhaXNlcyBhIFZlcnNpb25Db25mbGljdCBleGNlcHRpb24gaWYKICAgICAgICBhbnkgcmVxdWlyZW1lbnRzIGFyZSBmb3VuZCBvbiB0aGUgcGF0aCB0aGF0IGhhdmUgdGhlIGNvcnJlY3QgbmFtZSBidXQKICAgICAgICB0aGUgd3JvbmcgdmVyc2lvbi4gIE90aGVyd2lzZSwgaWYgYW4gYGluc3RhbGxlcmAgaXMgc3VwcGxpZWQgaXQgd2lsbCBiZQogICAgICAgIGludm9rZWQgdG8gb2J0YWluIHRoZSBjb3JyZWN0IHZlcnNpb24gb2YgdGhlIHJlcXVpcmVtZW50IGFuZCBhY3RpdmF0ZQogICAgICAgIGl0LgogICAgICAgICIiIgoKICAgICAgICAjIHNldCB1cCB0aGUgc3RhY2sKICAgICAgICByZXF1aXJlbWVudHMgPSBsaXN0KHJlcXVpcmVtZW50cylbOjotMV0KICAgICAgICAjIHNldCBvZiBwcm9jZXNzZWQgcmVxdWlyZW1lbnRzCiAgICAgICAgcHJvY2Vzc2VkID0ge30KICAgICAgICAjIGtleSAtPiBkaXN0CiAgICAgICAgYmVzdCA9IHt9CiAgICAgICAgdG9fYWN0aXZhdGUgPSBbXQoKICAgICAgICByZXFfZXh0cmFzID0gX1JlcUV4dHJhcygpCgogICAgICAgICMgTWFwcGluZyBvZiByZXF1aXJlbWVudCB0byBzZXQgb2YgZGlzdHJpYnV0aW9ucyB0aGF0IHJlcXVpcmVkIGl0OwogICAgICAgICMgdXNlZnVsIGZvciByZXBvcnRpbmcgaW5mbyBhYm91dCBjb25mbGljdHMuCiAgICAgICAgcmVxdWlyZWRfYnkgPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChzZXQpCgogICAgICAgIHdoaWxlIHJlcXVpcmVtZW50czoKICAgICAgICAgICAgIyBwcm9jZXNzIGRlcGVuZGVuY2llcyBicmVhZHRoLWZpcnN0CiAgICAgICAgICAgIHJlcSA9IHJlcXVpcmVtZW50cy5wb3AoMCkKICAgICAgICAgICAgaWYgcmVxIGluIHByb2Nlc3NlZDoKICAgICAgICAgICAgICAgICMgSWdub3JlIGN5Y2xpYyBvciByZWR1bmRhbnQgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgaWYgbm90IHJlcV9leHRyYXMubWFya2Vyc19wYXNzKHJlcSk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgZGlzdCA9IGJlc3QuZ2V0KHJlcS5rZXkpCiAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgICAgICMgRmluZCB0aGUgYmVzdCBkaXN0cmlidXRpb24gYW5kIGFkZCBpdCB0byB0aGUgbWFwCiAgICAgICAgICAgICAgICBkaXN0ID0gc2VsZi5ieV9rZXkuZ2V0KHJlcS5rZXkpCiAgICAgICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmUgb3IgKGRpc3Qgbm90IGluIHJlcSBhbmQgcmVwbGFjZV9jb25mbGljdGluZyk6CiAgICAgICAgICAgICAgICAgICAgd3MgPSBzZWxmCiAgICAgICAgICAgICAgICAgICAgaWYgZW52IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IEVudmlyb25tZW50KHNlbGYuZW50cmllcykKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlIGFuIGVtcHR5IGVudmlyb25tZW50IGFuZCB3b3JraW5nc2V0IHRvIGF2b2lkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFueSBmdXJ0aGVyIGNvbmZsaWN0cyB3aXRoIHRoZSBjb25mbGljdGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkaXN0cmlidXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IEVudmlyb25tZW50KFtdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd3MgPSBXb3JraW5nU2V0KFtdKQogICAgICAgICAgICAgICAgICAgIGRpc3QgPSBiZXN0W3JlcS5rZXldID0gZW52LmJlc3RfbWF0Y2gocmVxLCB3cywgaW5zdGFsbGVyKQogICAgICAgICAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXJzID0gcmVxdWlyZWRfYnkuZ2V0KHJlcSwgTm9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHJpYnV0aW9uTm90Rm91bmQocmVxLCByZXF1aXJlcnMpCiAgICAgICAgICAgICAgICB0b19hY3RpdmF0ZS5hcHBlbmQoZGlzdCkKICAgICAgICAgICAgaWYgZGlzdCBub3QgaW4gcmVxOgogICAgICAgICAgICAgICAgIyBPb3BzLCB0aGUgImJlc3QiIHNvIGZhciBjb25mbGljdHMgd2l0aCBhIGRlcGVuZGVuY3kKICAgICAgICAgICAgICAgIGRlcGVuZGVudF9yZXEgPSByZXF1aXJlZF9ieVtyZXFdCiAgICAgICAgICAgICAgICByYWlzZSBWZXJzaW9uQ29uZmxpY3QoZGlzdCwgcmVxKS53aXRoX2NvbnRleHQoZGVwZW5kZW50X3JlcSkKCiAgICAgICAgICAgICMgcHVzaCB0aGUgbmV3IHJlcXVpcmVtZW50cyBvbnRvIHRoZSBzdGFjawogICAgICAgICAgICBuZXdfcmVxdWlyZW1lbnRzID0gZGlzdC5yZXF1aXJlcyhyZXEuZXh0cmFzKVs6Oi0xXQogICAgICAgICAgICByZXF1aXJlbWVudHMuZXh0ZW5kKG5ld19yZXF1aXJlbWVudHMpCgogICAgICAgICAgICAjIFJlZ2lzdGVyIHRoZSBuZXcgcmVxdWlyZW1lbnRzIG5lZWRlZCBieSByZXEKICAgICAgICAgICAgZm9yIG5ld19yZXF1aXJlbWVudCBpbiBuZXdfcmVxdWlyZW1lbnRzOgogICAgICAgICAgICAgICAgcmVxdWlyZWRfYnlbbmV3X3JlcXVpcmVtZW50XS5hZGQocmVxLnByb2plY3RfbmFtZSkKICAgICAgICAgICAgICAgIHJlcV9leHRyYXNbbmV3X3JlcXVpcmVtZW50XSA9IHJlcS5leHRyYXMKCiAgICAgICAgICAgIHByb2Nlc3NlZFtyZXFdID0gVHJ1ZQoKICAgICAgICAjIHJldHVybiBsaXN0IG9mIGRpc3Ryb3MgdG8gYWN0aXZhdGUKICAgICAgICByZXR1cm4gdG9fYWN0aXZhdGUKCiAgICBkZWYgZmluZF9wbHVnaW5zKHNlbGYsIHBsdWdpbl9lbnYsIGZ1bGxfZW52PU5vbmUsIGluc3RhbGxlcj1Ob25lLAogICAgICAgICAgICBmYWxsYmFjaz1UcnVlKToKICAgICAgICAiIiJGaW5kIGFsbCBhY3RpdmF0YWJsZSBkaXN0cmlidXRpb25zIGluIGBwbHVnaW5fZW52YAoKICAgICAgICBFeGFtcGxlIHVzYWdlOjoKCiAgICAgICAgICAgIGRpc3RyaWJ1dGlvbnMsIGVycm9ycyA9IHdvcmtpbmdfc2V0LmZpbmRfcGx1Z2lucygKICAgICAgICAgICAgICAgIEVudmlyb25tZW50KHBsdWdpbl9kaXJsaXN0KQogICAgICAgICAgICApCiAgICAgICAgICAgICMgYWRkIHBsdWdpbnMrbGlicyB0byBzeXMucGF0aAogICAgICAgICAgICBtYXAod29ya2luZ19zZXQuYWRkLCBkaXN0cmlidXRpb25zKQogICAgICAgICAgICAjIGRpc3BsYXkgZXJyb3JzCiAgICAgICAgICAgIHByaW50KCdDb3VsZCBub3QgbG9hZCcsIGVycm9ycykKCiAgICAgICAgVGhlIGBwbHVnaW5fZW52YCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgIGluc3RhbmNlIHRoYXQgY29udGFpbnMKICAgICAgICBvbmx5IGRpc3RyaWJ1dGlvbnMgdGhhdCBhcmUgaW4gdGhlIHByb2plY3QncyAicGx1Z2luIGRpcmVjdG9yeSIgb3IKICAgICAgICBkaXJlY3Rvcmllcy4gVGhlIGBmdWxsX2VudmAsIGlmIHN1cHBsaWVkLCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgCiAgICAgICAgY29udGFpbnMgYWxsIGN1cnJlbnRseS1hdmFpbGFibGUgZGlzdHJpYnV0aW9ucy4gIElmIGBmdWxsX2VudmAgaXMgbm90CiAgICAgICAgc3VwcGxpZWQsIG9uZSBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgYGBXb3JraW5nU2V0YGAgdGhpcwogICAgICAgIG1ldGhvZCBpcyBjYWxsZWQgb24sIHdoaWNoIHdpbGwgdHlwaWNhbGx5IG1lYW4gdGhhdCBldmVyeSBkaXJlY3Rvcnkgb24KICAgICAgICBgYHN5cy5wYXRoYGAgd2lsbCBiZSBzY2FubmVkIGZvciBkaXN0cmlidXRpb25zLgoKICAgICAgICBgaW5zdGFsbGVyYCBpcyBhIHN0YW5kYXJkIGluc3RhbGxlciBjYWxsYmFjayBhcyB1c2VkIGJ5IHRoZQogICAgICAgIGBgcmVzb2x2ZSgpYGAgbWV0aG9kLiBUaGUgYGZhbGxiYWNrYCBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZAogICAgICAgIGF0dGVtcHQgdG8gcmVzb2x2ZSBvbGRlciB2ZXJzaW9ucyBvZiBhIHBsdWdpbiBpZiB0aGUgbmV3ZXN0IHZlcnNpb24KICAgICAgICBjYW5ub3QgYmUgcmVzb2x2ZWQuCgogICAgICAgIFRoaXMgbWV0aG9kIHJldHVybnMgYSAyLXR1cGxlOiAoYGRpc3RyaWJ1dGlvbnNgLCBgZXJyb3JfaW5mb2ApLCB3aGVyZQogICAgICAgIGBkaXN0cmlidXRpb25zYCBpcyBhIGxpc3Qgb2YgdGhlIGRpc3RyaWJ1dGlvbnMgZm91bmQgaW4gYHBsdWdpbl9lbnZgCiAgICAgICAgdGhhdCB3ZXJlIGxvYWRhYmxlLCBhbG9uZyB3aXRoIGFueSBvdGhlciBkaXN0cmlidXRpb25zIHRoYXQgYXJlIG5lZWRlZAogICAgICAgIHRvIHJlc29sdmUgdGhlaXIgZGVwZW5kZW5jaWVzLiAgYGVycm9yX2luZm9gIGlzIGEgZGljdGlvbmFyeSBtYXBwaW5nCiAgICAgICAgdW5sb2FkYWJsZSBwbHVnaW4gZGlzdHJpYnV0aW9ucyB0byBhbiBleGNlcHRpb24gaW5zdGFuY2UgZGVzY3JpYmluZyB0aGUKICAgICAgICBlcnJvciB0aGF0IG9jY3VycmVkLiBVc3VhbGx5IHRoaXMgd2lsbCBiZSBhIGBgRGlzdHJpYnV0aW9uTm90Rm91bmRgYCBvcgogICAgICAgIGBgVmVyc2lvbkNvbmZsaWN0YGAgaW5zdGFuY2UuCiAgICAgICAgIiIiCgogICAgICAgIHBsdWdpbl9wcm9qZWN0cyA9IGxpc3QocGx1Z2luX2VudikKICAgICAgICAjIHNjYW4gcHJvamVjdCBuYW1lcyBpbiBhbHBoYWJldGljIG9yZGVyCiAgICAgICAgcGx1Z2luX3Byb2plY3RzLnNvcnQoKQoKICAgICAgICBlcnJvcl9pbmZvID0ge30KICAgICAgICBkaXN0cmlidXRpb25zID0ge30KCiAgICAgICAgaWYgZnVsbF9lbnYgaXMgTm9uZToKICAgICAgICAgICAgZW52ID0gRW52aXJvbm1lbnQoc2VsZi5lbnRyaWVzKQogICAgICAgICAgICBlbnYgKz0gcGx1Z2luX2VudgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGVudiA9IGZ1bGxfZW52ICsgcGx1Z2luX2VudgoKICAgICAgICBzaGFkb3dfc2V0ID0gc2VsZi5fX2NsYXNzX18oW10pCiAgICAgICAgIyBwdXQgYWxsIG91ciBlbnRyaWVzIGluIHNoYWRvd19zZXQKICAgICAgICBsaXN0KG1hcChzaGFkb3dfc2V0LmFkZCwgc2VsZikpCgogICAgICAgIGZvciBwcm9qZWN0X25hbWUgaW4gcGx1Z2luX3Byb2plY3RzOgoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gcGx1Z2luX2Vudltwcm9qZWN0X25hbWVdOgoKICAgICAgICAgICAgICAgIHJlcSA9IFtkaXN0LmFzX3JlcXVpcmVtZW50KCldCgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJlc29sdmVlcyA9IHNoYWRvd19zZXQucmVzb2x2ZShyZXEsIGVudiwgaW5zdGFsbGVyKQoKICAgICAgICAgICAgICAgIGV4Y2VwdCBSZXNvbHV0aW9uRXJyb3IgYXMgdjoKICAgICAgICAgICAgICAgICAgICAjIHNhdmUgZXJyb3IgaW5mbwogICAgICAgICAgICAgICAgICAgIGVycm9yX2luZm9bZGlzdF0gPSB2CiAgICAgICAgICAgICAgICAgICAgaWYgZmFsbGJhY2s6CiAgICAgICAgICAgICAgICAgICAgICAgICMgdHJ5IHRoZSBuZXh0IG9sZGVyIHZlcnNpb24gb2YgcHJvamVjdAogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICMgZ2l2ZSB1cCBvbiB0aGlzIHByb2plY3QsIGtlZXAgZ29pbmcKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGxpc3QobWFwKHNoYWRvd19zZXQuYWRkLCByZXNvbHZlZXMpKQogICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbnMudXBkYXRlKGRpY3QuZnJvbWtleXMocmVzb2x2ZWVzKSkKCiAgICAgICAgICAgICAgICAgICAgIyBzdWNjZXNzLCBubyBuZWVkIHRvIHRyeSBhbnkgbW9yZSB2ZXJzaW9ucyBvZiB0aGlzIHByb2plY3QKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICBkaXN0cmlidXRpb25zID0gbGlzdChkaXN0cmlidXRpb25zKQogICAgICAgIGRpc3RyaWJ1dGlvbnMuc29ydCgpCgogICAgICAgIHJldHVybiBkaXN0cmlidXRpb25zLCBlcnJvcl9pbmZvCgogICAgZGVmIHJlcXVpcmUoc2VsZiwgKnJlcXVpcmVtZW50cyk6CiAgICAgICAgIiIiRW5zdXJlIHRoYXQgZGlzdHJpYnV0aW9ucyBtYXRjaGluZyBgcmVxdWlyZW1lbnRzYCBhcmUgYWN0aXZhdGVkCgogICAgICAgIGByZXF1aXJlbWVudHNgIG11c3QgYmUgYSBzdHJpbmcgb3IgYSAocG9zc2libHktbmVzdGVkKSBzZXF1ZW5jZQogICAgICAgIHRoZXJlb2YsIHNwZWNpZnlpbmcgdGhlIGRpc3RyaWJ1dGlvbnMgYW5kIHZlcnNpb25zIHJlcXVpcmVkLiAgVGhlCiAgICAgICAgcmV0dXJuIHZhbHVlIGlzIGEgc2VxdWVuY2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbnMgdGhhdCBuZWVkZWQgdG8gYmUKICAgICAgICBhY3RpdmF0ZWQgdG8gZnVsZmlsbCB0aGUgcmVxdWlyZW1lbnRzOyBhbGwgcmVsZXZhbnQgZGlzdHJpYnV0aW9ucyBhcmUKICAgICAgICBpbmNsdWRlZCwgZXZlbiBpZiB0aGV5IHdlcmUgYWxyZWFkeSBhY3RpdmF0ZWQgaW4gdGhpcyB3b3JraW5nIHNldC4KICAgICAgICAiIiIKICAgICAgICBuZWVkZWQgPSBzZWxmLnJlc29sdmUocGFyc2VfcmVxdWlyZW1lbnRzKHJlcXVpcmVtZW50cykpCgogICAgICAgIGZvciBkaXN0IGluIG5lZWRlZDoKICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKCiAgICAgICAgcmV0dXJuIG5lZWRlZAoKICAgIGRlZiBzdWJzY3JpYmUoc2VsZiwgY2FsbGJhY2ssIGV4aXN0aW5nPVRydWUpOgogICAgICAgICIiIkludm9rZSBgY2FsbGJhY2tgIGZvciBhbGwgZGlzdHJpYnV0aW9ucwoKICAgICAgICBJZiBgZXhpc3Rpbmc9VHJ1ZWAgKGRlZmF1bHQpLAogICAgICAgIGNhbGwgb24gYWxsIGV4aXN0aW5nIG9uZXMsIGFzIHdlbGwuCiAgICAgICAgIiIiCiAgICAgICAgaWYgY2FsbGJhY2sgaW4gc2VsZi5jYWxsYmFja3M6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuY2FsbGJhY2tzLmFwcGVuZChjYWxsYmFjaykKICAgICAgICBpZiBub3QgZXhpc3Rpbmc6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGZvciBkaXN0IGluIHNlbGY6CiAgICAgICAgICAgIGNhbGxiYWNrKGRpc3QpCgogICAgZGVmIF9hZGRlZF9uZXcoc2VsZiwgZGlzdCk6CiAgICAgICAgZm9yIGNhbGxiYWNrIGluIHNlbGYuY2FsbGJhY2tzOgogICAgICAgICAgICBjYWxsYmFjayhkaXN0KQoKICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgc2VsZi5lbnRyaWVzWzpdLCBzZWxmLmVudHJ5X2tleXMuY29weSgpLCBzZWxmLmJ5X2tleS5jb3B5KCksCiAgICAgICAgICAgIHNlbGYuY2FsbGJhY2tzWzpdCiAgICAgICAgKQoKICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgZV9rX2JfYyk6CiAgICAgICAgZW50cmllcywga2V5cywgYnlfa2V5LCBjYWxsYmFja3MgPSBlX2tfYl9jCiAgICAgICAgc2VsZi5lbnRyaWVzID0gZW50cmllc1s6XQogICAgICAgIHNlbGYuZW50cnlfa2V5cyA9IGtleXMuY29weSgpCiAgICAgICAgc2VsZi5ieV9rZXkgPSBieV9rZXkuY29weSgpCiAgICAgICAgc2VsZi5jYWxsYmFja3MgPSBjYWxsYmFja3NbOl0KCgpjbGFzcyBfUmVxRXh0cmFzKGRpY3QpOgogICAgIiIiCiAgICBNYXAgZWFjaCByZXF1aXJlbWVudCB0byB0aGUgZXh0cmFzIHRoYXQgZGVtYW5kZWQgaXQuCiAgICAiIiIKCiAgICBkZWYgbWFya2Vyc19wYXNzKHNlbGYsIHJlcSk6CiAgICAgICAgIiIiCiAgICAgICAgRXZhbHVhdGUgbWFya2VycyBmb3IgcmVxIGFnYWluc3QgZWFjaCBleHRyYSB0aGF0CiAgICAgICAgZGVtYW5kZWQgaXQuCgogICAgICAgIFJldHVybiBGYWxzZSBpZiB0aGUgcmVxIGhhcyBhIG1hcmtlciBhbmQgZmFpbHMKICAgICAgICBldmFsdWF0aW9uLiBPdGhlcndpc2UsIHJldHVybiBUcnVlLgogICAgICAgICIiIgogICAgICAgIGV4dHJhX2V2YWxzID0gKAogICAgICAgICAgICByZXEubWFya2VyLmV2YWx1YXRlKHsnZXh0cmEnOiBleHRyYX0pCiAgICAgICAgICAgIGZvciBleHRyYSBpbiBzZWxmLmdldChyZXEsICgpKSArIChOb25lLCkKICAgICAgICApCiAgICAgICAgcmV0dXJuIG5vdCByZXEubWFya2VyIG9yIGFueShleHRyYV9ldmFscykKCgpjbGFzcyBFbnZpcm9ubWVudChvYmplY3QpOgogICAgIiIiU2VhcmNoYWJsZSBzbmFwc2hvdCBvZiBkaXN0cmlidXRpb25zIG9uIGEgc2VhcmNoIHBhdGgiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc2VhcmNoX3BhdGg9Tm9uZSwgcGxhdGZvcm09Z2V0X3N1cHBvcnRlZF9wbGF0Zm9ybSgpLAogICAgICAgICAgICBweXRob249UFlfTUFKT1IpOgogICAgICAgICIiIlNuYXBzaG90IGRpc3RyaWJ1dGlvbnMgYXZhaWxhYmxlIG9uIGEgc2VhcmNoIHBhdGgKCiAgICAgICAgQW55IGRpc3RyaWJ1dGlvbnMgZm91bmQgb24gYHNlYXJjaF9wYXRoYCBhcmUgYWRkZWQgdG8gdGhlIGVudmlyb25tZW50LgogICAgICAgIGBzZWFyY2hfcGF0aGAgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2YgYGBzeXMucGF0aGBgIGl0ZW1zLiAgSWYgbm90CiAgICAgICAgc3VwcGxpZWQsIGBgc3lzLnBhdGhgYCBpcyB1c2VkLgoKICAgICAgICBgcGxhdGZvcm1gIGlzIGFuIG9wdGlvbmFsIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBuYW1lIG9mIHRoZSBwbGF0Zm9ybQogICAgICAgIHRoYXQgcGxhdGZvcm0tc3BlY2lmaWMgZGlzdHJpYnV0aW9ucyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aC4gIElmCiAgICAgICAgdW5zcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHBsYXRmb3JtLiAgYHB5dGhvbmAgaXMgYW4KICAgICAgICBvcHRpb25hbCBzdHJpbmcgbmFtaW5nIHRoZSBkZXNpcmVkIHZlcnNpb24gb2YgUHl0aG9uIChlLmcuIGBgJzMuMydgYCk7CiAgICAgICAgaXQgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdmVyc2lvbi4KCiAgICAgICAgWW91IG1heSBleHBsaWNpdGx5IHNldCBgcGxhdGZvcm1gIChhbmQvb3IgYHB5dGhvbmApIHRvIGBgTm9uZWBgIGlmIHlvdQogICAgICAgIHdpc2ggdG8gbWFwICphbGwqIGRpc3RyaWJ1dGlvbnMsIG5vdCBqdXN0IHRob3NlIGNvbXBhdGlibGUgd2l0aCB0aGUKICAgICAgICBydW5uaW5nIHBsYXRmb3JtIG9yIFB5dGhvbiB2ZXJzaW9uLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2Rpc3RtYXAgPSB7fQogICAgICAgIHNlbGYucGxhdGZvcm0gPSBwbGF0Zm9ybQogICAgICAgIHNlbGYucHl0aG9uID0gcHl0aG9uCiAgICAgICAgc2VsZi5zY2FuKHNlYXJjaF9wYXRoKQoKICAgIGRlZiBjYW5fYWRkKHNlbGYsIGRpc3QpOgogICAgICAgICIiIklzIGRpc3RyaWJ1dGlvbiBgZGlzdGAgYWNjZXB0YWJsZSBmb3IgdGhpcyBlbnZpcm9ubWVudD8KCiAgICAgICAgVGhlIGRpc3RyaWJ1dGlvbiBtdXN0IG1hdGNoIHRoZSBwbGF0Zm9ybSBhbmQgcHl0aG9uIHZlcnNpb24KICAgICAgICByZXF1aXJlbWVudHMgc3BlY2lmaWVkIHdoZW4gdGhpcyBlbnZpcm9ubWVudCB3YXMgY3JlYXRlZCwgb3IgRmFsc2UKICAgICAgICBpcyByZXR1cm5lZC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKHNlbGYucHl0aG9uIGlzIE5vbmUgb3IgZGlzdC5weV92ZXJzaW9uIGlzIE5vbmUKICAgICAgICAgICAgb3IgZGlzdC5weV92ZXJzaW9uID09IHNlbGYucHl0aG9uKSBcCiAgICAgICAgICAgIGFuZCBjb21wYXRpYmxlX3BsYXRmb3JtcyhkaXN0LnBsYXRmb3JtLCBzZWxmLnBsYXRmb3JtKQoKICAgIGRlZiByZW1vdmUoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiUmVtb3ZlIGBkaXN0YCBmcm9tIHRoZSBlbnZpcm9ubWVudCIiIgogICAgICAgIHNlbGYuX2Rpc3RtYXBbZGlzdC5rZXldLnJlbW92ZShkaXN0KQoKICAgIGRlZiBzY2FuKHNlbGYsIHNlYXJjaF9wYXRoPU5vbmUpOgogICAgICAgICIiIlNjYW4gYHNlYXJjaF9wYXRoYCBmb3IgZGlzdHJpYnV0aW9ucyB1c2FibGUgaW4gdGhpcyBlbnZpcm9ubWVudAoKICAgICAgICBBbnkgZGlzdHJpYnV0aW9ucyBmb3VuZCBhcmUgYWRkZWQgdG8gdGhlIGVudmlyb25tZW50LgogICAgICAgIGBzZWFyY2hfcGF0aGAgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2YgYGBzeXMucGF0aGBgIGl0ZW1zLiAgSWYgbm90CiAgICAgICAgc3VwcGxpZWQsIGBgc3lzLnBhdGhgYCBpcyB1c2VkLiAgT25seSBkaXN0cmlidXRpb25zIGNvbmZvcm1pbmcgdG8KICAgICAgICB0aGUgcGxhdGZvcm0vcHl0aG9uIHZlcnNpb24gZGVmaW5lZCBhdCBpbml0aWFsaXphdGlvbiBhcmUgYWRkZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VhcmNoX3BhdGggaXMgTm9uZToKICAgICAgICAgICAgc2VhcmNoX3BhdGggPSBzeXMucGF0aAoKICAgICAgICBmb3IgaXRlbSBpbiBzZWFyY2hfcGF0aDoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0cmlidXRpb25zKGl0ZW0pOgogICAgICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgcHJvamVjdF9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSBuZXdlc3QtdG8tb2xkZXN0IGxpc3Qgb2YgZGlzdHJpYnV0aW9ucyBmb3IgYHByb2plY3RfbmFtZWAKCiAgICAgICAgVXNlcyBjYXNlLWluc2Vuc2l0aXZlIGBwcm9qZWN0X25hbWVgIGNvbXBhcmlzb24sIGFzc3VtaW5nIGFsbCB0aGUKICAgICAgICBwcm9qZWN0J3MgZGlzdHJpYnV0aW9ucyB1c2UgdGhlaXIgcHJvamVjdCdzIG5hbWUgY29udmVydGVkIHRvIGFsbAogICAgICAgIGxvd2VyY2FzZSBhcyB0aGVpciBrZXkuCgogICAgICAgICIiIgogICAgICAgIGRpc3RyaWJ1dGlvbl9rZXkgPSBwcm9qZWN0X25hbWUubG93ZXIoKQogICAgICAgIHJldHVybiBzZWxmLl9kaXN0bWFwLmdldChkaXN0cmlidXRpb25fa2V5LCBbXSkKCiAgICBkZWYgYWRkKHNlbGYsIGRpc3QpOgogICAgICAgICIiIkFkZCBgZGlzdGAgaWYgd2UgYGBjYW5fYWRkKClgYCBpdCBhbmQgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWRkZWQKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNhbl9hZGQoZGlzdCkgYW5kIGRpc3QuaGFzX3ZlcnNpb24oKToKICAgICAgICAgICAgZGlzdHMgPSBzZWxmLl9kaXN0bWFwLnNldGRlZmF1bHQoZGlzdC5rZXksIFtdKQogICAgICAgICAgICBpZiBkaXN0IG5vdCBpbiBkaXN0czoKICAgICAgICAgICAgICAgIGRpc3RzLmFwcGVuZChkaXN0KQogICAgICAgICAgICAgICAgZGlzdHMuc29ydChrZXk9b3BlcmF0b3IuYXR0cmdldHRlcignaGFzaGNtcCcpLCByZXZlcnNlPVRydWUpCgogICAgZGVmIGJlc3RfbWF0Y2goc2VsZiwgcmVxLCB3b3JraW5nX3NldCwgaW5zdGFsbGVyPU5vbmUpOgogICAgICAgICIiIkZpbmQgZGlzdHJpYnV0aW9uIGJlc3QgbWF0Y2hpbmcgYHJlcWAgYW5kIHVzYWJsZSBvbiBgd29ya2luZ19zZXRgCgogICAgICAgIFRoaXMgY2FsbHMgdGhlIGBgZmluZChyZXEpYGAgbWV0aG9kIG9mIHRoZSBgd29ya2luZ19zZXRgIHRvIHNlZSBpZiBhCiAgICAgICAgc3VpdGFibGUgZGlzdHJpYnV0aW9uIGlzIGFscmVhZHkgYWN0aXZlLiAgKFRoaXMgbWF5IHJhaXNlCiAgICAgICAgYGBWZXJzaW9uQ29uZmxpY3RgYCBpZiBhbiB1bnN1aXRhYmxlIHZlcnNpb24gb2YgdGhlIHByb2plY3QgaXMgYWxyZWFkeQogICAgICAgIGFjdGl2ZSBpbiB0aGUgc3BlY2lmaWVkIGB3b3JraW5nX3NldGAuKSAgSWYgYSBzdWl0YWJsZSBkaXN0cmlidXRpb24KICAgICAgICBpc24ndCBhY3RpdmUsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5ld2VzdCBkaXN0cmlidXRpb24gaW4gdGhlCiAgICAgICAgZW52aXJvbm1lbnQgdGhhdCBtZWV0cyB0aGUgYGBSZXF1aXJlbWVudGBgIGluIGByZXFgLiAgSWYgbm8gc3VpdGFibGUKICAgICAgICBkaXN0cmlidXRpb24gaXMgZm91bmQsIGFuZCBgaW5zdGFsbGVyYCBpcyBzdXBwbGllZCwgdGhlbiB0aGUgcmVzdWx0IG9mCiAgICAgICAgY2FsbGluZyB0aGUgZW52aXJvbm1lbnQncyBgYG9idGFpbihyZXEsIGluc3RhbGxlcilgYCBtZXRob2Qgd2lsbCBiZQogICAgICAgIHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIGRpc3QgPSB3b3JraW5nX3NldC5maW5kKHJlcSkKICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gZGlzdAogICAgICAgIGZvciBkaXN0IGluIHNlbGZbcmVxLmtleV06CiAgICAgICAgICAgIGlmIGRpc3QgaW4gcmVxOgogICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKICAgICAgICAjIHRyeSB0byBkb3dubG9hZC9pbnN0YWxsCiAgICAgICAgcmV0dXJuIHNlbGYub2J0YWluKHJlcSwgaW5zdGFsbGVyKQoKICAgIGRlZiBvYnRhaW4oc2VsZiwgcmVxdWlyZW1lbnQsIGluc3RhbGxlcj1Ob25lKToKICAgICAgICAiIiJPYnRhaW4gYSBkaXN0cmlidXRpb24gbWF0Y2hpbmcgYHJlcXVpcmVtZW50YCAoZS5nLiB2aWEgZG93bmxvYWQpCgogICAgICAgIE9idGFpbiBhIGRpc3RybyB0aGF0IG1hdGNoZXMgcmVxdWlyZW1lbnQgKGUuZy4gdmlhIGRvd25sb2FkKS4gIEluIHRoZQogICAgICAgIGJhc2UgYGBFbnZpcm9ubWVudGBgIGNsYXNzLCB0aGlzIHJvdXRpbmUganVzdCByZXR1cm5zCiAgICAgICAgYGBpbnN0YWxsZXIocmVxdWlyZW1lbnQpYGAsIHVubGVzcyBgaW5zdGFsbGVyYCBpcyBOb25lLCBpbiB3aGljaCBjYXNlCiAgICAgICAgTm9uZSBpcyByZXR1cm5lZCBpbnN0ZWFkLiAgVGhpcyBtZXRob2QgaXMgYSBob29rIHRoYXQgYWxsb3dzIHN1YmNsYXNzZXMKICAgICAgICB0byBhdHRlbXB0IG90aGVyIHdheXMgb2Ygb2J0YWluaW5nIGEgZGlzdHJpYnV0aW9uIGJlZm9yZSBmYWxsaW5nIGJhY2sKICAgICAgICB0byB0aGUgYGluc3RhbGxlcmAgYXJndW1lbnQuIiIiCiAgICAgICAgaWYgaW5zdGFsbGVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gaW5zdGFsbGVyKHJlcXVpcmVtZW50KQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiJZaWVsZCB0aGUgdW5pcXVlIHByb2plY3QgbmFtZXMgb2YgdGhlIGF2YWlsYWJsZSBkaXN0cmlidXRpb25zIiIiCiAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9kaXN0bWFwLmtleXMoKToKICAgICAgICAgICAgaWYgc2VsZltrZXldOgogICAgICAgICAgICAgICAgeWllbGQga2V5CgogICAgZGVmIF9faWFkZF9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiJJbi1wbGFjZSBhZGRpdGlvbiBvZiBhIGRpc3RyaWJ1dGlvbiBvciBlbnZpcm9ubWVudCIiIgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIERpc3RyaWJ1dGlvbik6CiAgICAgICAgICAgIHNlbGYuYWRkKG90aGVyKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgRW52aXJvbm1lbnQpOgogICAgICAgICAgICBmb3IgcHJvamVjdCBpbiBvdGhlcjoKICAgICAgICAgICAgICAgIGZvciBkaXN0IGluIG90aGVyW3Byb2plY3RdOgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW4ndCBhZGQgJXIgdG8gZW52aXJvbm1lbnQiICUgKG90aGVyLCkpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiQWRkIGFuIGVudmlyb25tZW50IG9yIGRpc3RyaWJ1dGlvbiB0byBhbiBlbnZpcm9ubWVudCIiIgogICAgICAgIG5ldyA9IHNlbGYuX19jbGFzc19fKFtdLCBwbGF0Zm9ybT1Ob25lLCBweXRob249Tm9uZSkKICAgICAgICBmb3IgZW52IGluIHNlbGYsIG90aGVyOgogICAgICAgICAgICBuZXcgKz0gZW52CiAgICAgICAgcmV0dXJuIG5ldwoKCiMgWFhYIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKQXZhaWxhYmxlRGlzdHJpYnV0aW9ucyA9IEVudmlyb25tZW50CgoKY2xhc3MgRXh0cmFjdGlvbkVycm9yKFJ1bnRpbWVFcnJvcik6CiAgICAiIiJBbiBlcnJvciBvY2N1cnJlZCBleHRyYWN0aW5nIGEgcmVzb3VyY2UKCiAgICBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGF2YWlsYWJsZSBmcm9tIGluc3RhbmNlcyBvZiB0aGlzIGV4Y2VwdGlvbjoKCiAgICBtYW5hZ2VyCiAgICAgICAgVGhlIHJlc291cmNlIG1hbmFnZXIgdGhhdCByYWlzZWQgdGhpcyBleGNlcHRpb24KCiAgICBjYWNoZV9wYXRoCiAgICAgICAgVGhlIGJhc2UgZGlyZWN0b3J5IGZvciByZXNvdXJjZSBleHRyYWN0aW9uCgogICAgb3JpZ2luYWxfZXJyb3IKICAgICAgICBUaGUgZXhjZXB0aW9uIGluc3RhbmNlIHRoYXQgY2F1c2VkIGV4dHJhY3Rpb24gdG8gZmFpbAogICAgIiIiCgoKY2xhc3MgUmVzb3VyY2VNYW5hZ2VyOgogICAgIiIiTWFuYWdlIHJlc291cmNlIGV4dHJhY3Rpb24gYW5kIHBhY2thZ2VzIiIiCiAgICBleHRyYWN0aW9uX3BhdGggPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuY2FjaGVkX2ZpbGVzID0ge30KCiAgICBkZWYgcmVzb3VyY2VfZXhpc3RzKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIkRvZXMgdGhlIG5hbWVkIHJlc291cmNlIGV4aXN0PyIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuaGFzX3Jlc291cmNlKHJlc291cmNlX25hbWUpCgogICAgZGVmIHJlc291cmNlX2lzZGlyKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIklzIHRoZSBuYW1lZCByZXNvdXJjZSBhbiBleGlzdGluZyBkaXJlY3Rvcnk/IiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5yZXNvdXJjZV9pc2RpcigKICAgICAgICAgICAgcmVzb3VyY2VfbmFtZQogICAgICAgICkKCiAgICBkZWYgcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgdHJ1ZSBmaWxlc3lzdGVtIHBhdGggZm9yIHNwZWNpZmllZCByZXNvdXJjZSIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKAogICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9zdHJlYW0oc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgcmVhZGFibGUgZmlsZS1saWtlIG9iamVjdCBmb3Igc3BlY2lmaWVkIHJlc291cmNlIiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5nZXRfcmVzb3VyY2Vfc3RyZWFtKAogICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9zdHJpbmcoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIHNwZWNpZmllZCByZXNvdXJjZSBhcyBhIHN0cmluZyIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuZ2V0X3Jlc291cmNlX3N0cmluZygKICAgICAgICAgICAgc2VsZiwgcmVzb3VyY2VfbmFtZQogICAgICAgICkKCiAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJMaXN0IHRoZSBjb250ZW50cyBvZiB0aGUgbmFtZWQgcmVzb3VyY2UgZGlyZWN0b3J5IiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5yZXNvdXJjZV9saXN0ZGlyKAogICAgICAgICAgICByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiBleHRyYWN0aW9uX2Vycm9yKHNlbGYpOgogICAgICAgICIiIkdpdmUgYW4gZXJyb3IgbWVzc2FnZSBmb3IgcHJvYmxlbXMgZXh0cmFjdGluZyBmaWxlKHMpIiIiCgogICAgICAgIG9sZF9leGMgPSBzeXMuZXhjX2luZm8oKVsxXQogICAgICAgIGNhY2hlX3BhdGggPSBzZWxmLmV4dHJhY3Rpb25fcGF0aCBvciBnZXRfZGVmYXVsdF9jYWNoZSgpCgogICAgICAgIHRtcGwgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgICAgIENhbid0IGV4dHJhY3QgZmlsZShzKSB0byBlZ2cgY2FjaGUKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGV4dHJhY3QgZmlsZShzKSB0byB0aGUgUHl0aG9uIGVnZwogICAgICAgICAgICBjYWNoZToKCiAgICAgICAgICAgICAge29sZF9leGN9CgogICAgICAgICAgICBUaGUgUHl0aG9uIGVnZyBjYWNoZSBkaXJlY3RvcnkgaXMgY3VycmVudGx5IHNldCB0bzoKCiAgICAgICAgICAgICAge2NhY2hlX3BhdGh9CgogICAgICAgICAgICBQZXJoYXBzIHlvdXIgYWNjb3VudCBkb2VzIG5vdCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGRpcmVjdG9yeT8gIFlvdSBjYW4KICAgICAgICAgICAgY2hhbmdlIHRoZSBjYWNoZSBkaXJlY3RvcnkgYnkgc2V0dGluZyB0aGUgUFlUSE9OX0VHR19DQUNIRSBlbnZpcm9ubWVudAogICAgICAgICAgICB2YXJpYWJsZSB0byBwb2ludCB0byBhbiBhY2Nlc3NpYmxlIGRpcmVjdG9yeS4KICAgICAgICAgICAgIiIiKS5sc3RyaXAoKQogICAgICAgIGVyciA9IEV4dHJhY3Rpb25FcnJvcih0bXBsLmZvcm1hdCgqKmxvY2FscygpKSkKICAgICAgICBlcnIubWFuYWdlciA9IHNlbGYKICAgICAgICBlcnIuY2FjaGVfcGF0aCA9IGNhY2hlX3BhdGgKICAgICAgICBlcnIub3JpZ2luYWxfZXJyb3IgPSBvbGRfZXhjCiAgICAgICAgcmFpc2UgZXJyCgogICAgZGVmIGdldF9jYWNoZV9wYXRoKHNlbGYsIGFyY2hpdmVfbmFtZSwgbmFtZXM9KCkpOgogICAgICAgICIiIlJldHVybiBhYnNvbHV0ZSBsb2NhdGlvbiBpbiBjYWNoZSBmb3IgYGFyY2hpdmVfbmFtZWAgYW5kIGBuYW1lc2AKCiAgICAgICAgVGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIHJlc3VsdGluZyBwYXRoIHdpbGwgYmUgY3JlYXRlZCBpZiBpdCBkb2VzCiAgICAgICAgbm90IGFscmVhZHkgZXhpc3QuICBgYXJjaGl2ZV9uYW1lYCBzaG91bGQgYmUgdGhlIGJhc2UgZmlsZW5hbWUgb2YgdGhlCiAgICAgICAgZW5jbG9zaW5nIGVnZyAod2hpY2ggbWF5IG5vdCBiZSB0aGUgbmFtZSBvZiB0aGUgZW5jbG9zaW5nIHppcGZpbGUhKSwKICAgICAgICBpbmNsdWRpbmcgaXRzICIuZWdnIiBleHRlbnNpb24uICBgbmFtZXNgLCBpZiBwcm92aWRlZCwgc2hvdWxkIGJlIGEKICAgICAgICBzZXF1ZW5jZSBvZiBwYXRoIG5hbWUgcGFydHMgInVuZGVyIiB0aGUgZWdnJ3MgZXh0cmFjdGlvbiBsb2NhdGlvbi4KCiAgICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHJlc291cmNlIHByb3ZpZGVycyB0aGF0IG5lZWQgdG8KICAgICAgICBvYnRhaW4gYW4gZXh0cmFjdGlvbiBsb2NhdGlvbiwgYW5kIG9ubHkgZm9yIG5hbWVzIHRoZXkgaW50ZW5kIHRvCiAgICAgICAgZXh0cmFjdCwgYXMgaXQgdHJhY2tzIHRoZSBnZW5lcmF0ZWQgbmFtZXMgZm9yIHBvc3NpYmxlIGNsZWFudXAgbGF0ZXIuCiAgICAgICAgIiIiCiAgICAgICAgZXh0cmFjdF9wYXRoID0gc2VsZi5leHRyYWN0aW9uX3BhdGggb3IgZ2V0X2RlZmF1bHRfY2FjaGUoKQogICAgICAgIHRhcmdldF9wYXRoID0gb3MucGF0aC5qb2luKGV4dHJhY3RfcGF0aCwgYXJjaGl2ZV9uYW1lICsgJy10bXAnLCAqbmFtZXMpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBfYnlwYXNzX2Vuc3VyZV9kaXJlY3RvcnkodGFyZ2V0X3BhdGgpCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBzZWxmLmV4dHJhY3Rpb25fZXJyb3IoKQoKICAgICAgICBzZWxmLl93YXJuX3Vuc2FmZV9leHRyYWN0aW9uX3BhdGgoZXh0cmFjdF9wYXRoKQoKICAgICAgICBzZWxmLmNhY2hlZF9maWxlc1t0YXJnZXRfcGF0aF0gPSAxCiAgICAgICAgcmV0dXJuIHRhcmdldF9wYXRoCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF93YXJuX3Vuc2FmZV9leHRyYWN0aW9uX3BhdGgocGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgSWYgdGhlIGRlZmF1bHQgZXh0cmFjdGlvbiBwYXRoIGlzIG92ZXJyaWRkZW4gYW5kIHNldCB0byBhbiBpbnNlY3VyZQogICAgICAgIGxvY2F0aW9uLCBzdWNoIGFzIC90bXAsIGl0IG9wZW5zIHVwIGFuIG9wcG9ydHVuaXR5IGZvciBhbiBhdHRhY2tlciB0bwogICAgICAgIHJlcGxhY2UgYW4gZXh0cmFjdGVkIGZpbGUgd2l0aCBhbiB1bmF1dGhvcml6ZWQgcGF5bG9hZC4gV2FybiB0aGUgdXNlcgogICAgICAgIGlmIGEga25vd24gaW5zZWN1cmUgbG9jYXRpb24gaXMgdXNlZC4KCiAgICAgICAgU2VlIERpc3RyaWJ1dGUgIzM3NSBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgICIiIgogICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JyBhbmQgbm90IHBhdGguc3RhcnRzd2l0aChvcy5lbnZpcm9uWyd3aW5kaXInXSk6CiAgICAgICAgICAgICMgT24gV2luZG93cywgcGVybWlzc2lvbnMgYXJlIGdlbmVyYWxseSByZXN0cmljdGl2ZSBieSBkZWZhdWx0CiAgICAgICAgICAgICMgIGFuZCB0ZW1wIGRpcmVjdG9yaWVzIGFyZSBub3Qgd3JpdGFibGUgYnkgb3RoZXIgdXNlcnMsIHNvCiAgICAgICAgICAgICMgIGJ5cGFzcyB0aGUgd2FybmluZy4KICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbW9kZSA9IG9zLnN0YXQocGF0aCkuc3RfbW9kZQogICAgICAgIGlmIG1vZGUgJiBzdGF0LlNfSVdPVEggb3IgbW9kZSAmIHN0YXQuU19JV0dSUDoKICAgICAgICAgICAgbXNnID0gKCIlcyBpcyB3cml0YWJsZSBieSBncm91cC9vdGhlcnMgYW5kIHZ1bG5lcmFibGUgdG8gYXR0YWNrICIKICAgICAgICAgICAgICAgICJ3aGVuICIKICAgICAgICAgICAgICAgICJ1c2VkIHdpdGggZ2V0X3Jlc291cmNlX2ZpbGVuYW1lLiBDb25zaWRlciBhIG1vcmUgc2VjdXJlICIKICAgICAgICAgICAgICAgICJsb2NhdGlvbiAoc2V0IHdpdGggLnNldF9leHRyYWN0aW9uX3BhdGggb3IgdGhlICIKICAgICAgICAgICAgICAgICJQWVRIT05fRUdHX0NBQ0hFIGVudmlyb25tZW50IHZhcmlhYmxlKS4iICUgcGF0aCkKICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2csIFVzZXJXYXJuaW5nKQoKICAgIGRlZiBwb3N0cHJvY2VzcyhzZWxmLCB0ZW1wbmFtZSwgZmlsZW5hbWUpOgogICAgICAgICIiIlBlcmZvcm0gYW55IHBsYXRmb3JtLXNwZWNpZmljIHBvc3Rwcm9jZXNzaW5nIG9mIGB0ZW1wbmFtZWAKCiAgICAgICAgVGhpcyBpcyB3aGVyZSBNYWMgaGVhZGVyIHJld3JpdGVzIHNob3VsZCBiZSBkb25lOyBvdGhlciBwbGF0Zm9ybXMgZG9uJ3QKICAgICAgICBoYXZlIGFueXRoaW5nIHNwZWNpYWwgdGhleSBzaG91bGQgZG8uCgogICAgICAgIFJlc291cmNlIHByb3ZpZGVycyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBPTkxZIGFmdGVyIHN1Y2Nlc3NmdWxseQogICAgICAgIGV4dHJhY3RpbmcgYSBjb21wcmVzc2VkIHJlc291cmNlLiAgVGhleSBtdXN0IE5PVCBjYWxsIGl0IG9uIHJlc291cmNlcwogICAgICAgIHRoYXQgYXJlIGFscmVhZHkgaW4gdGhlIGZpbGVzeXN0ZW0uCgogICAgICAgIGB0ZW1wbmFtZWAgaXMgdGhlIGN1cnJlbnQgKHRlbXBvcmFyeSkgbmFtZSBvZiB0aGUgZmlsZSwgYW5kIGBmaWxlbmFtZWAKICAgICAgICBpcyB0aGUgbmFtZSBpdCB3aWxsIGJlIHJlbmFtZWQgdG8gYnkgdGhlIGNhbGxlciBhZnRlciB0aGlzIHJvdXRpbmUKICAgICAgICByZXR1cm5zLgogICAgICAgICIiIgoKICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CiAgICAgICAgICAgICMgTWFrZSB0aGUgcmVzb3VyY2UgZXhlY3V0YWJsZQogICAgICAgICAgICBtb2RlID0gKChvcy5zdGF0KHRlbXBuYW1lKS5zdF9tb2RlKSB8IDBvNTU1KSAmIDBvNzc3NwogICAgICAgICAgICBvcy5jaG1vZCh0ZW1wbmFtZSwgbW9kZSkKCiAgICBkZWYgc2V0X2V4dHJhY3Rpb25fcGF0aChzZWxmLCBwYXRoKToKICAgICAgICAiIiJTZXQgdGhlIGJhc2UgcGF0aCB3aGVyZSByZXNvdXJjZXMgd2lsbCBiZSBleHRyYWN0ZWQgdG8sIGlmIG5lZWRlZC4KCiAgICAgICAgSWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgcm91dGluZSBiZWZvcmUgYW55IGV4dHJhY3Rpb25zIHRha2UgcGxhY2UsIHRoZQogICAgICAgIHBhdGggZGVmYXVsdHMgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiBgYGdldF9kZWZhdWx0X2NhY2hlKClgYC4gIChXaGljaAogICAgICAgIGlzIGJhc2VkIG9uIHRoZSBgYFBZVEhPTl9FR0dfQ0FDSEVgYCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgd2l0aCB2YXJpb3VzCiAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZmFsbGJhY2tzLiAgU2VlIHRoYXQgcm91dGluZSdzIGRvY3VtZW50YXRpb24gZm9yIG1vcmUKICAgICAgICBkZXRhaWxzLikKCiAgICAgICAgUmVzb3VyY2VzIGFyZSBleHRyYWN0ZWQgdG8gc3ViZGlyZWN0b3JpZXMgb2YgdGhpcyBwYXRoIGJhc2VkIHVwb24KICAgICAgICBpbmZvcm1hdGlvbiBnaXZlbiBieSB0aGUgYGBJUmVzb3VyY2VQcm92aWRlcmBgLiAgWW91IG1heSBzZXQgdGhpcyB0byBhCiAgICAgICAgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgYnV0IHRoZW4geW91IG11c3QgY2FsbCBgYGNsZWFudXBfcmVzb3VyY2VzKClgYCB0bwogICAgICAgIGRlbGV0ZSB0aGUgZXh0cmFjdGVkIGZpbGVzIHdoZW4gZG9uZS4gIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0CiAgICAgICAgYGBjbGVhbnVwX3Jlc291cmNlcygpYGAgd2lsbCBiZSBhYmxlIHRvIHJlbW92ZSBhbGwgZXh0cmFjdGVkIGZpbGVzLgoKICAgICAgICAoTm90ZTogeW91IG1heSBub3QgY2hhbmdlIHRoZSBleHRyYWN0aW9uIHBhdGggZm9yIGEgZ2l2ZW4gcmVzb3VyY2UKICAgICAgICBtYW5hZ2VyIG9uY2UgcmVzb3VyY2VzIGhhdmUgYmVlbiBleHRyYWN0ZWQsIHVubGVzcyB5b3UgZmlyc3QgY2FsbAogICAgICAgIGBgY2xlYW51cF9yZXNvdXJjZXMoKWBgLikKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNhY2hlZF9maWxlczoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJDYW4ndCBjaGFuZ2UgZXh0cmFjdGlvbiBwYXRoLCBmaWxlcyBhbHJlYWR5IGV4dHJhY3RlZCIKICAgICAgICAgICAgKQoKICAgICAgICBzZWxmLmV4dHJhY3Rpb25fcGF0aCA9IHBhdGgKCiAgICBkZWYgY2xlYW51cF9yZXNvdXJjZXMoc2VsZiwgZm9yY2U9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIERlbGV0ZSBhbGwgZXh0cmFjdGVkIHJlc291cmNlIGZpbGVzIGFuZCBkaXJlY3RvcmllcywgcmV0dXJuaW5nIGEgbGlzdAogICAgICAgIG9mIHRoZSBmaWxlIGFuZCBkaXJlY3RvcnkgbmFtZXMgdGhhdCBjb3VsZCBub3QgYmUgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuCiAgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIGFueSBjb25jdXJyZW5jeSBwcm90ZWN0aW9uLCBzbyBpdCBzaG91bGQKICAgICAgICBnZW5lcmFsbHkgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgZXh0cmFjdGlvbiBwYXRoIGlzIGEgdGVtcG9yYXJ5CiAgICAgICAgZGlyZWN0b3J5IGV4Y2x1c2l2ZSB0byBhIHNpbmdsZSBwcm9jZXNzLiAgVGhpcyBtZXRob2QgaXMgbm90CiAgICAgICAgYXV0b21hdGljYWxseSBjYWxsZWQ7IHlvdSBtdXN0IGNhbGwgaXQgZXhwbGljaXRseSBvciByZWdpc3RlciBpdCBhcyBhbgogICAgICAgIGBgYXRleGl0YGAgZnVuY3Rpb24gaWYgeW91IHdpc2ggdG8gZW5zdXJlIGNsZWFudXAgb2YgYSB0ZW1wb3JhcnkKICAgICAgICBkaXJlY3RvcnkgdXNlZCBmb3IgZXh0cmFjdGlvbnMuCiAgICAgICAgIiIiCiAgICAgICAgIyBYWFgKCgpkZWYgZ2V0X2RlZmF1bHRfY2FjaGUoKToKICAgICIiIgogICAgUmV0dXJuIHRoZSBgYFBZVEhPTl9FR0dfQ0FDSEVgYCBlbnZpcm9ubWVudCB2YXJpYWJsZQogICAgb3IgYSBwbGF0Zm9ybS1yZWxldmFudCB1c2VyIGNhY2hlIGRpciBmb3IgYW4gYXBwCiAgICBuYW1lZCAiUHl0aG9uLUVnZ3MiLgogICAgIiIiCiAgICByZXR1cm4gKAogICAgICAgIG9zLmVudmlyb24uZ2V0KCdQWVRIT05fRUdHX0NBQ0hFJykKICAgICAgICBvciBhcHBkaXJzLnVzZXJfY2FjaGVfZGlyKGFwcG5hbWU9J1B5dGhvbi1FZ2dzJykKICAgICkKCgpkZWYgc2FmZV9uYW1lKG5hbWUpOgogICAgIiIiQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgZGlzdHJpYnV0aW9uIG5hbWUKCiAgICBBbnkgcnVucyBvZiBub24tYWxwaGFudW1lcmljLy4gY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSAnLScuCiAgICAiIiIKICAgIHJldHVybiByZS5zdWIoJ1teQS1aYS16MC05Ll0rJywgJy0nLCBuYW1lKQoKCmRlZiBzYWZlX3ZlcnNpb24odmVyc2lvbik6CiAgICAiIiIKICAgIENvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkIHZlcnNpb24gc3RyaW5nCiAgICAiIiIKICAgIHRyeToKICAgICAgICAjIG5vcm1hbGl6ZSB0aGUgdmVyc2lvbgogICAgICAgIHJldHVybiBzdHIocGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbih2ZXJzaW9uKSkKICAgIGV4Y2VwdCBwYWNrYWdpbmcudmVyc2lvbi5JbnZhbGlkVmVyc2lvbjoKICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi5yZXBsYWNlKCcgJywgJy4nKQogICAgICAgIHJldHVybiByZS5zdWIoJ1teQS1aYS16MC05Ll0rJywgJy0nLCB2ZXJzaW9uKQoKCmRlZiBzYWZlX2V4dHJhKGV4dHJhKToKICAgICIiIkNvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkICdleHRyYScgbmFtZQoKICAgIEFueSBydW5zIG9mIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSAnXycsCiAgICBhbmQgdGhlIHJlc3VsdCBpcyBhbHdheXMgbG93ZXJjYXNlZC4KICAgICIiIgogICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuLV0rJywgJ18nLCBleHRyYSkubG93ZXIoKQoKCmRlZiB0b19maWxlbmFtZShuYW1lKToKICAgICIiIkNvbnZlcnQgYSBwcm9qZWN0IG9yIHZlcnNpb24gbmFtZSB0byBpdHMgZmlsZW5hbWUtZXNjYXBlZCBmb3JtCgogICAgQW55ICctJyBjaGFyYWN0ZXJzIGFyZSBjdXJyZW50bHkgcmVwbGFjZWQgd2l0aCAnXycuCiAgICAiIiIKICAgIHJldHVybiBuYW1lLnJlcGxhY2UoJy0nLCAnXycpCgoKZGVmIGludmFsaWRfbWFya2VyKHRleHQpOgogICAgIiIiCiAgICBWYWxpZGF0ZSB0ZXh0IGFzIGEgUEVQIDUwOCBlbnZpcm9ubWVudCBtYXJrZXI7IHJldHVybiBhbiBleGNlcHRpb24KICAgIGlmIGludmFsaWQgb3IgRmFsc2Ugb3RoZXJ3aXNlLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgZXZhbHVhdGVfbWFya2VyKHRleHQpCiAgICBleGNlcHQgU3ludGF4RXJyb3IgYXMgZToKICAgICAgICBlLmZpbGVuYW1lID0gTm9uZQogICAgICAgIGUubGluZW5vID0gTm9uZQogICAgICAgIHJldHVybiBlCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgZXZhbHVhdGVfbWFya2VyKHRleHQsIGV4dHJhPU5vbmUpOgogICAgIiIiCiAgICBFdmFsdWF0ZSBhIFBFUCA1MDggZW52aXJvbm1lbnQgbWFya2VyLgogICAgUmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHRoZSBtYXJrZXIgcmVzdWx0IGluIHRoaXMgZW52aXJvbm1lbnQuCiAgICBSYWlzZSBTeW50YXhFcnJvciBpZiBtYXJrZXIgaXMgaW52YWxpZC4KCiAgICBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlICdweXBhcnNpbmcnIG1vZHVsZS4KICAgICIiIgogICAgdHJ5OgogICAgICAgIG1hcmtlciA9IHBhY2thZ2luZy5tYXJrZXJzLk1hcmtlcih0ZXh0KQogICAgICAgIHJldHVybiBtYXJrZXIuZXZhbHVhdGUoKQogICAgZXhjZXB0IHBhY2thZ2luZy5tYXJrZXJzLkludmFsaWRNYXJrZXIgYXMgZToKICAgICAgICByYWlzZSBTeW50YXhFcnJvcihlKQoKCmNsYXNzIE51bGxQcm92aWRlcjoKICAgICIiIlRyeSB0byBpbXBsZW1lbnQgcmVzb3VyY2VzIGFuZCBtZXRhZGF0YSBmb3IgYXJiaXRyYXJ5IFBFUCAzMDIgbG9hZGVycyIiIgoKICAgIGVnZ19uYW1lID0gTm9uZQogICAgZWdnX2luZm8gPSBOb25lCiAgICBsb2FkZXIgPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgc2VsZi5sb2FkZXIgPSBnZXRhdHRyKG1vZHVsZSwgJ19fbG9hZGVyX18nLCBOb25lKQogICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBvcy5wYXRoLmRpcm5hbWUoZ2V0YXR0cihtb2R1bGUsICdfX2ZpbGVfXycsICcnKSkKCiAgICBkZWYgZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKQoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyZWFtKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBpby5CeXRlc0lPKHNlbGYuZ2V0X3Jlc291cmNlX3N0cmluZyhtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmluZyhzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5fZ2V0KHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBoYXNfcmVzb3VyY2Uoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2hhcyhzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgaGFzX21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLmVnZ19pbmZvIGFuZCBzZWxmLl9oYXMoc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbywgbmFtZSkpCgogICAgZGVmIGdldF9tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICBpZiBub3Qgc2VsZi5lZ2dfaW5mbzoKICAgICAgICAgICAgcmV0dXJuICIiCiAgICAgICAgdmFsdWUgPSBzZWxmLl9nZXQoc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbywgbmFtZSkpCiAgICAgICAgcmV0dXJuIHZhbHVlLmRlY29kZSgndXRmLTgnKSBpZiBzaXguUFkzIGVsc2UgdmFsdWUKCiAgICBkZWYgZ2V0X21ldGFkYXRhX2xpbmVzKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiB5aWVsZF9saW5lcyhzZWxmLmdldF9tZXRhZGF0YShuYW1lKSkKCiAgICBkZWYgcmVzb3VyY2VfaXNkaXIoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2lzZGlyKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBtZXRhZGF0YV9pc2RpcihzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5lZ2dfaW5mbyBhbmQgc2VsZi5faXNkaXIoc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbywgbmFtZSkpCgogICAgZGVmIHJlc291cmNlX2xpc3RkaXIoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2xpc3RkaXIoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIG1ldGFkYXRhX2xpc3RkaXIoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgc2VsZi5lZ2dfaW5mbzoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2xpc3RkaXIoc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbywgbmFtZSkpCiAgICAgICAgcmV0dXJuIFtdCgogICAgZGVmIHJ1bl9zY3JpcHQoc2VsZiwgc2NyaXB0X25hbWUsIG5hbWVzcGFjZSk6CiAgICAgICAgc2NyaXB0ID0gJ3NjcmlwdHMvJyArIHNjcmlwdF9uYW1lCiAgICAgICAgaWYgbm90IHNlbGYuaGFzX21ldGFkYXRhKHNjcmlwdCk6CiAgICAgICAgICAgIHJhaXNlIFJlc29sdXRpb25FcnJvcigiTm8gc2NyaXB0IG5hbWVkICVyIiAlIHNjcmlwdF9uYW1lKQogICAgICAgIHNjcmlwdF90ZXh0ID0gc2VsZi5nZXRfbWV0YWRhdGEoc2NyaXB0KS5yZXBsYWNlKCdcclxuJywgJ1xuJykKICAgICAgICBzY3JpcHRfdGV4dCA9IHNjcmlwdF90ZXh0LnJlcGxhY2UoJ1xyJywgJ1xuJykKICAgICAgICBzY3JpcHRfZmlsZW5hbWUgPSBzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBzY3JpcHQpCiAgICAgICAgbmFtZXNwYWNlWydfX2ZpbGVfXyddID0gc2NyaXB0X2ZpbGVuYW1lCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2NyaXB0X2ZpbGVuYW1lKToKICAgICAgICAgICAgc291cmNlID0gb3BlbihzY3JpcHRfZmlsZW5hbWUpLnJlYWQoKQogICAgICAgICAgICBjb2RlID0gY29tcGlsZShzb3VyY2UsIHNjcmlwdF9maWxlbmFtZSwgJ2V4ZWMnKQogICAgICAgICAgICBleGVjKGNvZGUsIG5hbWVzcGFjZSwgbmFtZXNwYWNlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZyb20gbGluZWNhY2hlIGltcG9ydCBjYWNoZQogICAgICAgICAgICBjYWNoZVtzY3JpcHRfZmlsZW5hbWVdID0gKAogICAgICAgICAgICAgICAgbGVuKHNjcmlwdF90ZXh0KSwgMCwgc2NyaXB0X3RleHQuc3BsaXQoJ1xuJyksIHNjcmlwdF9maWxlbmFtZQogICAgICAgICAgICApCiAgICAgICAgICAgIHNjcmlwdF9jb2RlID0gY29tcGlsZShzY3JpcHRfdGV4dCwgc2NyaXB0X2ZpbGVuYW1lLCAnZXhlYycpCiAgICAgICAgICAgIGV4ZWMoc2NyaXB0X2NvZGUsIG5hbWVzcGFjZSwgbmFtZXNwYWNlKQoKICAgIGRlZiBfaGFzKHNlbGYsIHBhdGgpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciB1bnJlZ2lzdGVyZWQgbG9hZGVyIHR5cGUiCiAgICAgICAgKQoKICAgIGRlZiBfaXNkaXIoc2VsZiwgcGF0aCk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHVucmVnaXN0ZXJlZCBsb2FkZXIgdHlwZSIKICAgICAgICApCgogICAgZGVmIF9saXN0ZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciB1bnJlZ2lzdGVyZWQgbG9hZGVyIHR5cGUiCiAgICAgICAgKQoKICAgIGRlZiBfZm4oc2VsZiwgYmFzZSwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgaWYgcmVzb3VyY2VfbmFtZToKICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihiYXNlLCAqcmVzb3VyY2VfbmFtZS5zcGxpdCgnLycpKQogICAgICAgIHJldHVybiBiYXNlCgogICAgZGVmIF9nZXQoc2VsZiwgcGF0aCk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLmxvYWRlciwgJ2dldF9kYXRhJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWRlci5nZXRfZGF0YShwYXRoKQogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciBsb2FkZXJzIHdpdGhvdXQgJ2dldF9kYXRhKCknIgogICAgICAgICkKCgpyZWdpc3Rlcl9sb2FkZXJfdHlwZShvYmplY3QsIE51bGxQcm92aWRlcikKCgpjbGFzcyBFZ2dQcm92aWRlcihOdWxsUHJvdmlkZXIpOgogICAgIiIiUHJvdmlkZXIgYmFzZWQgb24gYSB2aXJ0dWFsIGZpbGVzeXN0ZW0iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKICAgICAgICBOdWxsUHJvdmlkZXIuX19pbml0X18oc2VsZiwgbW9kdWxlKQogICAgICAgIHNlbGYuX3NldHVwX3ByZWZpeCgpCgogICAgZGVmIF9zZXR1cF9wcmVmaXgoc2VsZik6CiAgICAgICAgIyB3ZSBhc3N1bWUgaGVyZSB0aGF0IG91ciBtZXRhZGF0YSBtYXkgYmUgbmVzdGVkIGluc2lkZSBhICJiYXNrZXQiCiAgICAgICAgIyBvZiBtdWx0aXBsZSBlZ2dzOyB0aGF0J3Mgd2h5IHdlIHVzZSBtb2R1bGVfcGF0aCBpbnN0ZWFkIG9mIC5hcmNoaXZlCiAgICAgICAgcGF0aCA9IHNlbGYubW9kdWxlX3BhdGgKICAgICAgICBvbGQgPSBOb25lCiAgICAgICAgd2hpbGUgcGF0aCAhPSBvbGQ6CiAgICAgICAgICAgIGlmIF9pc191bnBhY2tlZF9lZ2cocGF0aCk6CiAgICAgICAgICAgICAgICBzZWxmLmVnZ19uYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQogICAgICAgICAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IG9zLnBhdGguam9pbihwYXRoLCAnRUdHLUlORk8nKQogICAgICAgICAgICAgICAgc2VsZi5lZ2dfcm9vdCA9IHBhdGgKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIG9sZCA9IHBhdGgKICAgICAgICAgICAgcGF0aCwgYmFzZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKCgpjbGFzcyBEZWZhdWx0UHJvdmlkZXIoRWdnUHJvdmlkZXIpOgogICAgIiIiUHJvdmlkZXMgYWNjZXNzIHRvIHBhY2thZ2UgcmVzb3VyY2VzIGluIHRoZSBmaWxlc3lzdGVtIiIiCgogICAgZGVmIF9oYXMoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKHBhdGgpCgogICAgZGVmIF9pc2RpcihzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MucGF0aC5pc2RpcihwYXRoKQoKICAgIGRlZiBfbGlzdGRpcihzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MubGlzdGRpcihwYXRoKQoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyZWFtKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBvcGVuKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpLCAncmInKQoKICAgIGRlZiBfZ2V0KHNlbGYsIHBhdGgpOgogICAgICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBzdHJlYW06CiAgICAgICAgICAgIHJldHVybiBzdHJlYW0ucmVhZCgpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3JlZ2lzdGVyKGNscyk6CiAgICAgICAgbG9hZGVyX2NscyA9IGdldGF0dHIoaW1wb3J0bGliX21hY2hpbmVyeSwgJ1NvdXJjZUZpbGVMb2FkZXInLAogICAgICAgICAgICB0eXBlKE5vbmUpKQogICAgICAgIHJlZ2lzdGVyX2xvYWRlcl90eXBlKGxvYWRlcl9jbHMsIGNscykKCgpEZWZhdWx0UHJvdmlkZXIuX3JlZ2lzdGVyKCkKCgpjbGFzcyBFbXB0eVByb3ZpZGVyKE51bGxQcm92aWRlcik6CiAgICAiIiJQcm92aWRlciB0aGF0IHJldHVybnMgbm90aGluZyBmb3IgYWxsIHJlcXVlc3RzIiIiCgogICAgX2lzZGlyID0gX2hhcyA9IGxhbWJkYSBzZWxmLCBwYXRoOiBGYWxzZQogICAgX2dldCA9IGxhbWJkYSBzZWxmLCBwYXRoOiAnJwogICAgX2xpc3RkaXIgPSBsYW1iZGEgc2VsZiwgcGF0aDogW10KICAgIG1vZHVsZV9wYXRoID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBwYXNzCgoKZW1wdHlfcHJvdmlkZXIgPSBFbXB0eVByb3ZpZGVyKCkKCgpjbGFzcyBaaXBNYW5pZmVzdHMoZGljdCk6CiAgICAiIiIKICAgIHppcCBtYW5pZmVzdCBidWlsZGVyCiAgICAiIiIKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBidWlsZChjbHMsIHBhdGgpOgogICAgICAgICIiIgogICAgICAgIEJ1aWxkIGEgZGljdGlvbmFyeSBzaW1pbGFyIHRvIHRoZSB6aXBpbXBvcnQgZGlyZWN0b3J5CiAgICAgICAgY2FjaGVzLCBleGNlcHQgaW5zdGVhZCBvZiB0dXBsZXMsIHN0b3JlIFppcEluZm8gb2JqZWN0cy4KCiAgICAgICAgVXNlIGEgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3IgKG9zLnNlcCkgZm9yIHRoZSBwYXRoIGtleXMKICAgICAgICBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHB5cHkgb24gV2luZG93cy4KICAgICAgICAiIiIKICAgICAgICB3aXRoIENvbnRleHR1YWxaaXBGaWxlKHBhdGgpIGFzIHpmaWxlOgogICAgICAgICAgICBpdGVtcyA9ICgKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBuYW1lLnJlcGxhY2UoJy8nLCBvcy5zZXApLAogICAgICAgICAgICAgICAgICAgIHpmaWxlLmdldGluZm8obmFtZSksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiB6ZmlsZS5uYW1lbGlzdCgpCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIGRpY3QoaXRlbXMpCgogICAgbG9hZCA9IGJ1aWxkCgoKY2xhc3MgTWVtb2l6ZWRaaXBNYW5pZmVzdHMoWmlwTWFuaWZlc3RzKToKICAgICIiIgogICAgTWVtb2l6ZWQgemlwZmlsZSBtYW5pZmVzdHMuCiAgICAiIiIKICAgIG1hbmlmZXN0X21vZCA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoJ21hbmlmZXN0X21vZCcsICdtYW5pZmVzdCBtdGltZScpCgogICAgZGVmIGxvYWQoc2VsZiwgcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgTG9hZCBhIG1hbmlmZXN0IGF0IHBhdGggb3IgcmV0dXJuIGEgc3VpdGFibGUgbWFuaWZlc3QgYWxyZWFkeSBsb2FkZWQuCiAgICAgICAgIiIiCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgocGF0aCkKICAgICAgICBtdGltZSA9IG9zLnN0YXQocGF0aCkuc3RfbXRpbWUKCiAgICAgICAgaWYgcGF0aCBub3QgaW4gc2VsZiBvciBzZWxmW3BhdGhdLm10aW1lICE9IG10aW1lOgogICAgICAgICAgICBtYW5pZmVzdCA9IHNlbGYuYnVpbGQocGF0aCkKICAgICAgICAgICAgc2VsZltwYXRoXSA9IHNlbGYubWFuaWZlc3RfbW9kKG1hbmlmZXN0LCBtdGltZSkKCiAgICAgICAgcmV0dXJuIHNlbGZbcGF0aF0ubWFuaWZlc3QKCgpjbGFzcyBDb250ZXh0dWFsWmlwRmlsZSh6aXBmaWxlLlppcEZpbGUpOgogICAgIiIiCiAgICBTdXBwbGVtZW50IFppcEZpbGUgY2xhc3MgdG8gc3VwcG9ydCBjb250ZXh0IG1hbmFnZXIgZm9yIFB5dGhvbiAyLjYKICAgICIiIgoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6CiAgICAgICAgc2VsZi5jbG9zZSgpCgogICAgZGVmIF9fbmV3X18oY2xzLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIENvbnN0cnVjdCBhIFppcEZpbGUgb3IgQ29udGV4dHVhbFppcEZpbGUgYXMgYXBwcm9wcmlhdGUKICAgICAgICAiIiIKICAgICAgICBpZiBoYXNhdHRyKHppcGZpbGUuWmlwRmlsZSwgJ19fZXhpdF9fJyk6CiAgICAgICAgICAgIHJldHVybiB6aXBmaWxlLlppcEZpbGUoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHJldHVybiBzdXBlcihDb250ZXh0dWFsWmlwRmlsZSwgY2xzKS5fX25ld19fKGNscykKCgpjbGFzcyBaaXBQcm92aWRlcihFZ2dQcm92aWRlcik6CiAgICAiIiJSZXNvdXJjZSBzdXBwb3J0IGZvciB6aXBzIGFuZCBlZ2dzIiIiCgogICAgZWFnZXJzID0gTm9uZQogICAgX3ppcF9tYW5pZmVzdHMgPSBNZW1vaXplZFppcE1hbmlmZXN0cygpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgRWdnUHJvdmlkZXIuX19pbml0X18oc2VsZiwgbW9kdWxlKQogICAgICAgIHNlbGYuemlwX3ByZSA9IHNlbGYubG9hZGVyLmFyY2hpdmUgKyBvcy5zZXAKCiAgICBkZWYgX3ppcGluZm9fbmFtZShzZWxmLCBmc3BhdGgpOgogICAgICAgICMgQ29udmVydCBhIHZpcnR1YWwgZmlsZW5hbWUgKGZ1bGwgcGF0aCB0byBmaWxlKSBpbnRvIGEgemlwZmlsZSBzdWJwYXRoCiAgICAgICAgIyB1c2FibGUgd2l0aCB0aGUgemlwaW1wb3J0IGRpcmVjdG9yeSBjYWNoZSBmb3Igb3VyIHRhcmdldCBhcmNoaXZlCiAgICAgICAgaWYgZnNwYXRoLnN0YXJ0c3dpdGgoc2VsZi56aXBfcHJlKToKICAgICAgICAgICAgcmV0dXJuIGZzcGF0aFtsZW4oc2VsZi56aXBfcHJlKTpdCiAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdWJwYXRoIG9mICVzIiAlIChmc3BhdGgsIHNlbGYuemlwX3ByZSkKICAgICAgICApCgogICAgZGVmIF9wYXJ0cyhzZWxmLCB6aXBfcGF0aCk6CiAgICAgICAgIyBDb252ZXJ0IGEgemlwZmlsZSBzdWJwYXRoIGludG8gYW4gZWdnLXJlbGF0aXZlIHBhdGggcGFydCBsaXN0LgogICAgICAgICMgcHNldWRvLWZzIHBhdGgKICAgICAgICBmc3BhdGggPSBzZWxmLnppcF9wcmUgKyB6aXBfcGF0aAogICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuZWdnX3Jvb3QgKyBvcy5zZXApOgogICAgICAgICAgICByZXR1cm4gZnNwYXRoW2xlbihzZWxmLmVnZ19yb290KSArIDE6XS5zcGxpdChvcy5zZXApCiAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdWJwYXRoIG9mICVzIiAlIChmc3BhdGgsIHNlbGYuZWdnX3Jvb3QpCiAgICAgICAgKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHppcGluZm8oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ppcF9tYW5pZmVzdHMubG9hZChzZWxmLmxvYWRlci5hcmNoaXZlKQoKICAgIGRlZiBnZXRfcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgaWYgbm90IHNlbGYuZWdnX25hbWU6CiAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfZmlsZW5hbWUoKSBvbmx5IHN1cHBvcnRlZCBmb3IgLmVnZywgbm90IC56aXAiCiAgICAgICAgICAgICkKICAgICAgICAjIG5vIG5lZWQgdG8gbG9jayBmb3IgZXh0cmFjdGlvbiwgc2luY2Ugd2UgdXNlIHRlbXAgbmFtZXMKICAgICAgICB6aXBfcGF0aCA9IHNlbGYuX3Jlc291cmNlX3RvX3ppcChyZXNvdXJjZV9uYW1lKQogICAgICAgIGVhZ2VycyA9IHNlbGYuX2dldF9lYWdlcl9yZXNvdXJjZXMoKQogICAgICAgIGlmICcvJy5qb2luKHNlbGYuX3BhcnRzKHppcF9wYXRoKSkgaW4gZWFnZXJzOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBlYWdlcnM6CiAgICAgICAgICAgICAgICBzZWxmLl9leHRyYWN0X3Jlc291cmNlKG1hbmFnZXIsIHNlbGYuX2VhZ2VyX3RvX3ppcChuYW1lKSkKICAgICAgICByZXR1cm4gc2VsZi5fZXh0cmFjdF9yZXNvdXJjZShtYW5hZ2VyLCB6aXBfcGF0aCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2dldF9kYXRlX2FuZF9zaXplKHppcF9zdGF0KToKICAgICAgICBzaXplID0gemlwX3N0YXQuZmlsZV9zaXplCiAgICAgICAgIyB5bWRobXMrd2RheSwgeWRheSwgZHN0CiAgICAgICAgZGF0ZV90aW1lID0gemlwX3N0YXQuZGF0ZV90aW1lICsgKDAsIDAsIC0xKQogICAgICAgICMgMTk4MCBvZmZzZXQgYWxyZWFkeSBkb25lCiAgICAgICAgdGltZXN0YW1wID0gdGltZS5ta3RpbWUoZGF0ZV90aW1lKQogICAgICAgIHJldHVybiB0aW1lc3RhbXAsIHNpemUKCiAgICBkZWYgX2V4dHJhY3RfcmVzb3VyY2Uoc2VsZiwgbWFuYWdlciwgemlwX3BhdGgpOgoKICAgICAgICBpZiB6aXBfcGF0aCBpbiBzZWxmLl9pbmRleCgpOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLl9pbmRleCgpW3ppcF9wYXRoXToKICAgICAgICAgICAgICAgIGxhc3QgPSBzZWxmLl9leHRyYWN0X3Jlc291cmNlKAogICAgICAgICAgICAgICAgICAgIG1hbmFnZXIsIG9zLnBhdGguam9pbih6aXBfcGF0aCwgbmFtZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgIyByZXR1cm4gdGhlIGV4dHJhY3RlZCBkaXJlY3RvcnkgbmFtZQogICAgICAgICAgICByZXR1cm4gb3MucGF0aC5kaXJuYW1lKGxhc3QpCgogICAgICAgIHRpbWVzdGFtcCwgc2l6ZSA9IHNlbGYuX2dldF9kYXRlX2FuZF9zaXplKHNlbGYuemlwaW5mb1t6aXBfcGF0aF0pCgogICAgICAgIGlmIG5vdCBXUklURV9TVVBQT1JUOgogICAgICAgICAgICByYWlzZSBJT0Vycm9yKCcib3MucmVuYW1lIiBhbmQgIm9zLnVubGluayIgYXJlIG5vdCBzdXBwb3J0ZWQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICdvbiB0aGlzIHBsYXRmb3JtJykKICAgICAgICB0cnk6CgogICAgICAgICAgICByZWFsX3BhdGggPSBtYW5hZ2VyLmdldF9jYWNoZV9wYXRoKAogICAgICAgICAgICAgICAgc2VsZi5lZ2dfbmFtZSwgc2VsZi5fcGFydHMoemlwX3BhdGgpCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmIHNlbGYuX2lzX2N1cnJlbnQocmVhbF9wYXRoLCB6aXBfcGF0aCk6CiAgICAgICAgICAgICAgICByZXR1cm4gcmVhbF9wYXRoCgogICAgICAgICAgICBvdXRmLCB0bXBuYW0gPSBfbWtzdGVtcCgiLiRleHRyYWN0IiwgZGlyPW9zLnBhdGguZGlybmFtZShyZWFsX3BhdGgpKQogICAgICAgICAgICBvcy53cml0ZShvdXRmLCBzZWxmLmxvYWRlci5nZXRfZGF0YSh6aXBfcGF0aCkpCiAgICAgICAgICAgIG9zLmNsb3NlKG91dGYpCiAgICAgICAgICAgIHV0aW1lKHRtcG5hbSwgKHRpbWVzdGFtcCwgdGltZXN0YW1wKSkKICAgICAgICAgICAgbWFuYWdlci5wb3N0cHJvY2Vzcyh0bXBuYW0sIHJlYWxfcGF0aCkKCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlbmFtZSh0bXBuYW0sIHJlYWxfcGF0aCkKCiAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHJlYWxfcGF0aCk6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5faXNfY3VycmVudChyZWFsX3BhdGgsIHppcF9wYXRoKToKICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgZmlsZSBiZWNhbWUgY3VycmVudCBzaW5jZSBpdCB3YXMgY2hlY2tlZCBhYm92ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIyAgc28gcHJvY2VlZC4KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAogICAgICAgICAgICAgICAgICAgICMgV2luZG93cywgZGVsIG9sZCBmaWxlIGFuZCByZXRyeQogICAgICAgICAgICAgICAgICAgIGVsaWYgb3MubmFtZSA9PSAnbnQnOgogICAgICAgICAgICAgICAgICAgICAgICB1bmxpbmsocmVhbF9wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWUodG1wbmFtLCByZWFsX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsX3BhdGgKICAgICAgICAgICAgICAgIHJhaXNlCgogICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKICAgICAgICAgICAgIyByZXBvcnQgYSB1c2VyLWZyaWVuZGx5IGVycm9yCiAgICAgICAgICAgIG1hbmFnZXIuZXh0cmFjdGlvbl9lcnJvcigpCgogICAgICAgIHJldHVybiByZWFsX3BhdGgKCiAgICBkZWYgX2lzX2N1cnJlbnQoc2VsZiwgZmlsZV9wYXRoLCB6aXBfcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIFRydWUgaWYgdGhlIGZpbGVfcGF0aCBpcyBjdXJyZW50IGZvciB0aGlzIHppcF9wYXRoCiAgICAgICAgIiIiCiAgICAgICAgdGltZXN0YW1wLCBzaXplID0gc2VsZi5fZ2V0X2RhdGVfYW5kX3NpemUoc2VsZi56aXBpbmZvW3ppcF9wYXRoXSkKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoZmlsZV9wYXRoKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgc3RhdCA9IG9zLnN0YXQoZmlsZV9wYXRoKQogICAgICAgIGlmIHN0YXQuc3Rfc2l6ZSAhPSBzaXplIG9yIHN0YXQuc3RfbXRpbWUgIT0gdGltZXN0YW1wOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAjIGNoZWNrIHRoYXQgdGhlIGNvbnRlbnRzIG1hdGNoCiAgICAgICAgemlwX2NvbnRlbnRzID0gc2VsZi5sb2FkZXIuZ2V0X2RhdGEoemlwX3BhdGgpCiAgICAgICAgd2l0aCBvcGVuKGZpbGVfcGF0aCwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgZmlsZV9jb250ZW50cyA9IGYucmVhZCgpCiAgICAgICAgcmV0dXJuIHppcF9jb250ZW50cyA9PSBmaWxlX2NvbnRlbnRzCgogICAgZGVmIF9nZXRfZWFnZXJfcmVzb3VyY2VzKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZWFnZXJzIGlzIE5vbmU6CiAgICAgICAgICAgIGVhZ2VycyA9IFtdCiAgICAgICAgICAgIGZvciBuYW1lIGluICgnbmF0aXZlX2xpYnMudHh0JywgJ2VhZ2VyX3Jlc291cmNlcy50eHQnKToKICAgICAgICAgICAgICAgIGlmIHNlbGYuaGFzX21ldGFkYXRhKG5hbWUpOgogICAgICAgICAgICAgICAgICAgIGVhZ2Vycy5leHRlbmQoc2VsZi5nZXRfbWV0YWRhdGFfbGluZXMobmFtZSkpCiAgICAgICAgICAgIHNlbGYuZWFnZXJzID0gZWFnZXJzCiAgICAgICAgcmV0dXJuIHNlbGYuZWFnZXJzCgogICAgZGVmIF9pbmRleChzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9kaXJpbmRleAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgaW5kID0ge30KICAgICAgICAgICAgZm9yIHBhdGggaW4gc2VsZi56aXBpbmZvOgogICAgICAgICAgICAgICAgcGFydHMgPSBwYXRoLnNwbGl0KG9zLnNlcCkKICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzOgogICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IG9zLnNlcC5qb2luKHBhcnRzWzotMV0pCiAgICAgICAgICAgICAgICAgICAgaWYgcGFyZW50IGluIGluZDoKICAgICAgICAgICAgICAgICAgICAgICAgaW5kW3BhcmVudF0uYXBwZW5kKHBhcnRzWy0xXSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBpbmRbcGFyZW50XSA9IFtwYXJ0cy5wb3AoKV0KICAgICAgICAgICAgc2VsZi5fZGlyaW5kZXggPSBpbmQKICAgICAgICAgICAgcmV0dXJuIGluZAoKICAgIGRlZiBfaGFzKHNlbGYsIGZzcGF0aCk6CiAgICAgICAgemlwX3BhdGggPSBzZWxmLl96aXBpbmZvX25hbWUoZnNwYXRoKQogICAgICAgIHJldHVybiB6aXBfcGF0aCBpbiBzZWxmLnppcGluZm8gb3IgemlwX3BhdGggaW4gc2VsZi5faW5kZXgoKQoKICAgIGRlZiBfaXNkaXIoc2VsZiwgZnNwYXRoKToKICAgICAgICByZXR1cm4gc2VsZi5femlwaW5mb19uYW1lKGZzcGF0aCkgaW4gc2VsZi5faW5kZXgoKQoKICAgIGRlZiBfbGlzdGRpcihzZWxmLCBmc3BhdGgpOgogICAgICAgIHJldHVybiBsaXN0KHNlbGYuX2luZGV4KCkuZ2V0KHNlbGYuX3ppcGluZm9fbmFtZShmc3BhdGgpLCAoKSkpCgogICAgZGVmIF9lYWdlcl90b196aXAoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ppcGluZm9fbmFtZShzZWxmLl9mbihzZWxmLmVnZ19yb290LCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgX3Jlc291cmNlX3RvX3ppcChzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5femlwaW5mb19uYW1lKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKCnJlZ2lzdGVyX2xvYWRlcl90eXBlKHppcGltcG9ydC56aXBpbXBvcnRlciwgWmlwUHJvdmlkZXIpCgoKY2xhc3MgRmlsZU1ldGFkYXRhKEVtcHR5UHJvdmlkZXIpOgogICAgIiIiTWV0YWRhdGEgaGFuZGxlciBmb3Igc3RhbmRhbG9uZSBQS0ctSU5GTyBmaWxlcwoKICAgIFVzYWdlOjoKCiAgICAgICAgbWV0YWRhdGEgPSBGaWxlTWV0YWRhdGEoIi9wYXRoL3RvL1BLRy1JTkZPIikKCiAgICBUaGlzIHByb3ZpZGVyIHJlamVjdHMgYWxsIGRhdGEgYW5kIG1ldGFkYXRhIHJlcXVlc3RzIGV4Y2VwdCBmb3IgUEtHLUlORk8sCiAgICB3aGljaCBpcyB0cmVhdGVkIGFzIGV4aXN0aW5nLCBhbmQgd2lsbCBiZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgYXQKICAgIHRoZSBwcm92aWRlZCBsb2NhdGlvbi4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoKToKICAgICAgICBzZWxmLnBhdGggPSBwYXRoCgogICAgZGVmIGhhc19tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gbmFtZSA9PSAnUEtHLUlORk8nIGFuZCBvcy5wYXRoLmlzZmlsZShzZWxmLnBhdGgpCgogICAgZGVmIGdldF9tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICBpZiBuYW1lICE9ICdQS0ctSU5GTyc6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJObyBtZXRhZGF0YSBleGNlcHQgUEtHLUlORk8gaXMgYXZhaWxhYmxlIikKCiAgICAgICAgd2l0aCBpby5vcGVuKHNlbGYucGF0aCwgZW5jb2Rpbmc9J3V0Zi04JywgZXJyb3JzPSJyZXBsYWNlIikgYXMgZjoKICAgICAgICAgICAgbWV0YWRhdGEgPSBmLnJlYWQoKQogICAgICAgIHNlbGYuX3dhcm5fb25fcmVwbGFjZW1lbnQobWV0YWRhdGEpCiAgICAgICAgcmV0dXJuIG1ldGFkYXRhCgogICAgZGVmIF93YXJuX29uX3JlcGxhY2VtZW50KHNlbGYsIG1ldGFkYXRhKToKICAgICAgICAjIFB5dGhvbiAyLjYgYW5kIDMuMiBjb21wYXQgZm9yOiByZXBsYWNlbWVudF9jaGFyID0gJ++/vScKICAgICAgICByZXBsYWNlbWVudF9jaGFyID0gYidceGVmXHhiZlx4YmQnLmRlY29kZSgndXRmLTgnKQogICAgICAgIGlmIHJlcGxhY2VtZW50X2NoYXIgaW4gbWV0YWRhdGE6CiAgICAgICAgICAgIHRtcGwgPSAie3NlbGYucGF0aH0gY291bGQgbm90IGJlIHByb3Blcmx5IGRlY29kZWQgaW4gVVRGLTgiCiAgICAgICAgICAgIG1zZyA9IHRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnKQoKICAgIGRlZiBnZXRfbWV0YWRhdGFfbGluZXMoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHlpZWxkX2xpbmVzKHNlbGYuZ2V0X21ldGFkYXRhKG5hbWUpKQoKCmNsYXNzIFBhdGhNZXRhZGF0YShEZWZhdWx0UHJvdmlkZXIpOgogICAgIiIiTWV0YWRhdGEgcHJvdmlkZXIgZm9yIGVnZyBkaXJlY3RvcmllcwoKICAgIFVzYWdlOjoKCiAgICAgICAgIyBEZXZlbG9wbWVudCBlZ2dzOgoKICAgICAgICBlZ2dfaW5mbyA9ICIvcGF0aC90by9QYWNrYWdlTmFtZS5lZ2ctaW5mbyIKICAgICAgICBiYXNlX2RpciA9IG9zLnBhdGguZGlybmFtZShlZ2dfaW5mbykKICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShiYXNlX2RpciwgZWdnX2luZm8pCiAgICAgICAgZGlzdF9uYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGVnZ19pbmZvKSlbMF0KICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKGJhc2VkaXIsIHByb2plY3RfbmFtZT1kaXN0X25hbWUsIG1ldGFkYXRhPW1ldGFkYXRhKQoKICAgICAgICAjIFVucGFja2VkIGVnZyBkaXJlY3RvcmllczoKCiAgICAgICAgZWdnX3BhdGggPSAiL3BhdGgvdG8vUGFja2FnZU5hbWUtdmVyLXB5dmVyLWV0Yy5lZ2ciCiAgICAgICAgbWV0YWRhdGEgPSBQYXRoTWV0YWRhdGEoZWdnX3BhdGgsIG9zLnBhdGguam9pbihlZ2dfcGF0aCwnRUdHLUlORk8nKSkKICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoZWdnX3BhdGgsIG1ldGFkYXRhPW1ldGFkYXRhKQogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIGVnZ19pbmZvKToKICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gcGF0aAogICAgICAgIHNlbGYuZWdnX2luZm8gPSBlZ2dfaW5mbwoKCmNsYXNzIEVnZ01ldGFkYXRhKFppcFByb3ZpZGVyKToKICAgICIiIk1ldGFkYXRhIHByb3ZpZGVyIGZvciAuZWdnIGZpbGVzIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGltcG9ydGVyKToKICAgICAgICAiIiJDcmVhdGUgYSBtZXRhZGF0YSBwcm92aWRlciBmcm9tIGEgemlwaW1wb3J0ZXIiIiIKCiAgICAgICAgc2VsZi56aXBfcHJlID0gaW1wb3J0ZXIuYXJjaGl2ZSArIG9zLnNlcAogICAgICAgIHNlbGYubG9hZGVyID0gaW1wb3J0ZXIKICAgICAgICBpZiBpbXBvcnRlci5wcmVmaXg6CiAgICAgICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBvcy5wYXRoLmpvaW4oaW1wb3J0ZXIuYXJjaGl2ZSwgaW1wb3J0ZXIucHJlZml4KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBpbXBvcnRlci5hcmNoaXZlCiAgICAgICAgc2VsZi5fc2V0dXBfcHJlZml4KCkKCgpfZGVjbGFyZV9zdGF0ZSgnZGljdCcsIF9kaXN0cmlidXRpb25fZmluZGVycz17fSkKCgpkZWYgcmVnaXN0ZXJfZmluZGVyKGltcG9ydGVyX3R5cGUsIGRpc3RyaWJ1dGlvbl9maW5kZXIpOgogICAgIiIiUmVnaXN0ZXIgYGRpc3RyaWJ1dGlvbl9maW5kZXJgIHRvIGZpbmQgZGlzdHJpYnV0aW9ucyBpbiBzeXMucGF0aCBpdGVtcwoKICAgIGBpbXBvcnRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgIkltcG9ydGVyIiAoc3lzLnBhdGggaXRlbQogICAgaGFuZGxlciksIGFuZCBgZGlzdHJpYnV0aW9uX2ZpbmRlcmAgaXMgYSBjYWxsYWJsZSB0aGF0LCBwYXNzZWQgYSBwYXRoCiAgICBpdGVtIGFuZCB0aGUgaW1wb3J0ZXIgaW5zdGFuY2UsIHlpZWxkcyBgYERpc3RyaWJ1dGlvbmBgIGluc3RhbmNlcyBmb3VuZCBvbgogICAgdGhhdCBwYXRoIGl0ZW0uICBTZWUgYGBwa2dfcmVzb3VyY2VzLmZpbmRfb25fcGF0aGBgIGZvciBhbiBleGFtcGxlLiIiIgogICAgX2Rpc3RyaWJ1dGlvbl9maW5kZXJzW2ltcG9ydGVyX3R5cGVdID0gZGlzdHJpYnV0aW9uX2ZpbmRlcgoKCmRlZiBmaW5kX2Rpc3RyaWJ1dGlvbnMocGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgICIiIllpZWxkIGRpc3RyaWJ1dGlvbnMgYWNjZXNzaWJsZSB2aWEgYHBhdGhfaXRlbWAiIiIKICAgIGltcG9ydGVyID0gZ2V0X2ltcG9ydGVyKHBhdGhfaXRlbSkKICAgIGZpbmRlciA9IF9maW5kX2FkYXB0ZXIoX2Rpc3RyaWJ1dGlvbl9maW5kZXJzLCBpbXBvcnRlcikKICAgIHJldHVybiBmaW5kZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seSkKCgpkZWYgZmluZF9lZ2dzX2luX3ppcChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgICIiIgogICAgRmluZCBlZ2dzIGluIHppcCBmaWxlczsgcG9zc2libHkgbXVsdGlwbGUgbmVzdGVkIGVnZ3MuCiAgICAiIiIKICAgIGlmIGltcG9ydGVyLmFyY2hpdmUuZW5kc3dpdGgoJy53aGwnKToKICAgICAgICAjIHdoZWVscyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIHRoaXMgZmluZGVyCiAgICAgICAgIyB0aGV5IGRvbid0IGhhdmUgUEtHLUlORk8gbWV0YWRhdGEsIGFuZCB3b24ndCBldmVyIGNvbnRhaW4gZWdncwogICAgICAgIHJldHVybgogICAgbWV0YWRhdGEgPSBFZ2dNZXRhZGF0YShpbXBvcnRlcikKICAgIGlmIG1ldGFkYXRhLmhhc19tZXRhZGF0YSgnUEtHLUlORk8nKToKICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShwYXRoX2l0ZW0sIG1ldGFkYXRhPW1ldGFkYXRhKQogICAgaWYgb25seToKICAgICAgICAjIGRvbid0IHlpZWxkIG5lc3RlZCBkaXN0cm9zCiAgICAgICAgcmV0dXJuCiAgICBmb3Igc3ViaXRlbSBpbiBtZXRhZGF0YS5yZXNvdXJjZV9saXN0ZGlyKCcvJyk6CiAgICAgICAgaWYgX2lzX3VucGFja2VkX2VnZyhzdWJpdGVtKToKICAgICAgICAgICAgc3VicGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIHN1Yml0ZW0pCiAgICAgICAgICAgIGZvciBkaXN0IGluIGZpbmRfZWdnc19pbl96aXAoemlwaW1wb3J0LnppcGltcG9ydGVyKHN1YnBhdGgpLCBzdWJwYXRoKToKICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKCgpyZWdpc3Rlcl9maW5kZXIoemlwaW1wb3J0LnppcGltcG9ydGVyLCBmaW5kX2VnZ3NfaW5femlwKQoKCmRlZiBmaW5kX25vdGhpbmcoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CiAgICByZXR1cm4gKCkKCgpyZWdpc3Rlcl9maW5kZXIob2JqZWN0LCBmaW5kX25vdGhpbmcpCgoKZGVmIF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpOgogICAgIiIiCiAgICBHaXZlbiBhIGxpc3Qgb2YgZmlsZW5hbWVzLCByZXR1cm4gdGhlbSBpbiBkZXNjZW5kaW5nIG9yZGVyCiAgICBieSB2ZXJzaW9uIG51bWJlci4KCiAgICA+Pj4gbmFtZXMgPSAnYmFyJywgJ2ZvbycsICdQeXRob24tMi43LjEwLmVnZycsICdQeXRob24tMi43LjIuZWdnJwogICAgPj4+IF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpCiAgICBbJ1B5dGhvbi0yLjcuMTAuZWdnJywgJ1B5dGhvbi0yLjcuMi5lZ2cnLCAnZm9vJywgJ2JhciddCiAgICA+Pj4gbmFtZXMgPSAnU2V0dXB0b29scy0xLjIuM2IxLmVnZycsICdTZXR1cHRvb2xzLTEuMi4zLmVnZycKICAgID4+PiBfYnlfdmVyc2lvbl9kZXNjZW5kaW5nKG5hbWVzKQogICAgWydTZXR1cHRvb2xzLTEuMi4zLmVnZycsICdTZXR1cHRvb2xzLTEuMi4zYjEuZWdnJ10KICAgID4+PiBuYW1lcyA9ICdTZXR1cHRvb2xzLTEuMi4zYjEuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjMucG9zdDEuZWdnJwogICAgPj4+IF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpCiAgICBbJ1NldHVwdG9vbHMtMS4yLjMucG9zdDEuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjNiMS5lZ2cnXQogICAgIiIiCiAgICBkZWYgX2J5X3ZlcnNpb24obmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUGFyc2UgZWFjaCBjb21wb25lbnQgb2YgdGhlIGZpbGVuYW1lCiAgICAgICAgIiIiCiAgICAgICAgbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQogICAgICAgIHBhcnRzID0gaXRlcnRvb2xzLmNoYWluKG5hbWUuc3BsaXQoJy0nKSwgW2V4dF0pCiAgICAgICAgcmV0dXJuIFtwYWNrYWdpbmcudmVyc2lvbi5wYXJzZShwYXJ0KSBmb3IgcGFydCBpbiBwYXJ0c10KCiAgICByZXR1cm4gc29ydGVkKG5hbWVzLCBrZXk9X2J5X3ZlcnNpb24sIHJldmVyc2U9VHJ1ZSkKCgpkZWYgZmluZF9vbl9wYXRoKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBhY2Nlc3NpYmxlIG9uIGEgc3lzLnBhdGggZGlyZWN0b3J5IiIiCiAgICBwYXRoX2l0ZW0gPSBfbm9ybWFsaXplX2NhY2hlZChwYXRoX2l0ZW0pCgogICAgaWYgb3MucGF0aC5pc2RpcihwYXRoX2l0ZW0pIGFuZCBvcy5hY2Nlc3MocGF0aF9pdGVtLCBvcy5SX09LKToKICAgICAgICBpZiBfaXNfdW5wYWNrZWRfZWdnKHBhdGhfaXRlbSk6CiAgICAgICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKAogICAgICAgICAgICAgICAgcGF0aF9pdGVtLCBtZXRhZGF0YT1QYXRoTWV0YWRhdGEoCiAgICAgICAgICAgICAgICAgICAgcGF0aF9pdGVtLCBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCAnRUdHLUlORk8nKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBzY2FuIGZvciAuZWdnIGFuZCAuZWdnLWluZm8gaW4gZGlyZWN0b3J5CiAgICAgICAgICAgIHBhdGhfaXRlbV9lbnRyaWVzID0gX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhvcy5saXN0ZGlyKHBhdGhfaXRlbSkpCiAgICAgICAgICAgIGZvciBlbnRyeSBpbiBwYXRoX2l0ZW1fZW50cmllczoKICAgICAgICAgICAgICAgIGxvd2VyID0gZW50cnkubG93ZXIoKQogICAgICAgICAgICAgICAgaWYgbG93ZXIuZW5kc3dpdGgoJy5lZ2ctaW5mbycpIG9yIGxvd2VyLmVuZHN3aXRoKCcuZGlzdC1pbmZvJyk6CiAgICAgICAgICAgICAgICAgICAgZnVsbHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBlbnRyeSkKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZ1bGxwYXRoKToKICAgICAgICAgICAgICAgICAgICAgICAgIyBlZ2ctaW5mbyBkaXJlY3RvcnksIGFsbG93IGdldHRpbmcgbWV0YWRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGVuKG9zLmxpc3RkaXIoZnVsbHBhdGgpKSA9PSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBFbXB0eSBlZ2cgZGlyZWN0b3J5LCBza2lwLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBQYXRoTWV0YWRhdGEocGF0aF9pdGVtLCBmdWxscGF0aCkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IEZpbGVNZXRhZGF0YShmdWxscGF0aCkKICAgICAgICAgICAgICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9sb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9pdGVtLCBlbnRyeSwgbWV0YWRhdGEsIHByZWNlZGVuY2U9REVWRUxPUF9ESVNUCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZWxpZiBub3Qgb25seSBhbmQgX2lzX3VucGFja2VkX2VnZyhlbnRyeSk6CiAgICAgICAgICAgICAgICAgICAgZGlzdHMgPSBmaW5kX2Rpc3RyaWJ1dGlvbnMob3MucGF0aC5qb2luKHBhdGhfaXRlbSwgZW50cnkpKQogICAgICAgICAgICAgICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CiAgICAgICAgICAgICAgICBlbGlmIG5vdCBvbmx5IGFuZCBsb3dlci5lbmRzd2l0aCgnLmVnZy1saW5rJyk6CiAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIGVudHJ5KSkgYXMgZW50cnlfZmlsZToKICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlfbGluZXMgPSBlbnRyeV9maWxlLnJlYWRsaW5lcygpCiAgICAgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gZW50cnlfbGluZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lLnN0cmlwKCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgbGluZS5yc3RyaXAoKSkKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHMgPSBmaW5kX2Rpc3RyaWJ1dGlvbnMocGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gZGlzdHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBpdGVtCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCgoKcmVnaXN0ZXJfZmluZGVyKHBrZ3V0aWwuSW1wSW1wb3J0ZXIsIGZpbmRfb25fcGF0aCkKCmlmIGhhc2F0dHIoaW1wb3J0bGliX21hY2hpbmVyeSwgJ0ZpbGVGaW5kZXInKToKICAgIHJlZ2lzdGVyX2ZpbmRlcihpbXBvcnRsaWJfbWFjaGluZXJ5LkZpbGVGaW5kZXIsIGZpbmRfb25fcGF0aCkKCl9kZWNsYXJlX3N0YXRlKCdkaWN0JywgX25hbWVzcGFjZV9oYW5kbGVycz17fSkKX2RlY2xhcmVfc3RhdGUoJ2RpY3QnLCBfbmFtZXNwYWNlX3BhY2thZ2VzPXt9KQoKCmRlZiByZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcihpbXBvcnRlcl90eXBlLCBuYW1lc3BhY2VfaGFuZGxlcik6CiAgICAiIiJSZWdpc3RlciBgbmFtZXNwYWNlX2hhbmRsZXJgIHRvIGRlY2xhcmUgbmFtZXNwYWNlIHBhY2thZ2VzCgogICAgYGltcG9ydGVyX3R5cGVgIGlzIHRoZSB0eXBlIG9yIGNsYXNzIG9mIGEgUEVQIDMwMiAiSW1wb3J0ZXIiIChzeXMucGF0aCBpdGVtCiAgICBoYW5kbGVyKSwgYW5kIGBuYW1lc3BhY2VfaGFuZGxlcmAgaXMgYSBjYWxsYWJsZSBsaWtlIHRoaXM6OgoKICAgICAgICBkZWYgbmFtZXNwYWNlX2hhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfZW50cnksIG1vZHVsZU5hbWUsIG1vZHVsZSk6CiAgICAgICAgICAgICMgcmV0dXJuIGEgcGF0aF9lbnRyeSB0byB1c2UgZm9yIGNoaWxkIHBhY2thZ2VzCgogICAgTmFtZXNwYWNlIGhhbmRsZXJzIGFyZSBvbmx5IGNhbGxlZCBpZiB0aGUgaW1wb3J0ZXIgb2JqZWN0IGhhcyBhbHJlYWR5CiAgICBhZ3JlZWQgdGhhdCBpdCBjYW4gaGFuZGxlIHRoZSByZWxldmFudCBwYXRoIGl0ZW0sIGFuZCB0aGV5IHNob3VsZCBvbmx5CiAgICByZXR1cm4gYSBzdWJwYXRoIGlmIHRoZSBtb2R1bGUgX19wYXRoX18gZG9lcyBub3QgYWxyZWFkeSBjb250YWluIGFuCiAgICBlcXVpdmFsZW50IHN1YnBhdGguICBGb3IgYW4gZXhhbXBsZSBuYW1lc3BhY2UgaGFuZGxlciwgc2VlCiAgICBgYHBrZ19yZXNvdXJjZXMuZmlsZV9uc19oYW5kbGVyYGAuCiAgICAiIiIKICAgIF9uYW1lc3BhY2VfaGFuZGxlcnNbaW1wb3J0ZXJfdHlwZV0gPSBuYW1lc3BhY2VfaGFuZGxlcgoKCmRlZiBfaGFuZGxlX25zKHBhY2thZ2VOYW1lLCBwYXRoX2l0ZW0pOgogICAgIiIiRW5zdXJlIHRoYXQgbmFtZWQgcGFja2FnZSBpbmNsdWRlcyBhIHN1YnBhdGggb2YgcGF0aF9pdGVtIChpZiBuZWVkZWQpIiIiCgogICAgaW1wb3J0ZXIgPSBnZXRfaW1wb3J0ZXIocGF0aF9pdGVtKQogICAgaWYgaW1wb3J0ZXIgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQogICAgbG9hZGVyID0gaW1wb3J0ZXIuZmluZF9tb2R1bGUocGFja2FnZU5hbWUpCiAgICBpZiBsb2FkZXIgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQogICAgbW9kdWxlID0gc3lzLm1vZHVsZXMuZ2V0KHBhY2thZ2VOYW1lKQogICAgaWYgbW9kdWxlIGlzIE5vbmU6CiAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbcGFja2FnZU5hbWVdID0gdHlwZXMuTW9kdWxlVHlwZShwYWNrYWdlTmFtZSkKICAgICAgICBtb2R1bGUuX19wYXRoX18gPSBbXQogICAgICAgIF9zZXRfcGFyZW50X25zKHBhY2thZ2VOYW1lKQogICAgZWxpZiBub3QgaGFzYXR0cihtb2R1bGUsICdfX3BhdGhfXycpOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcigiTm90IGEgcGFja2FnZToiLCBwYWNrYWdlTmFtZSkKICAgIGhhbmRsZXIgPSBfZmluZF9hZGFwdGVyKF9uYW1lc3BhY2VfaGFuZGxlcnMsIGltcG9ydGVyKQogICAgc3VicGF0aCA9IGhhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgcGFja2FnZU5hbWUsIG1vZHVsZSkKICAgIGlmIHN1YnBhdGggaXMgbm90IE5vbmU6CiAgICAgICAgcGF0aCA9IG1vZHVsZS5fX3BhdGhfXwogICAgICAgIHBhdGguYXBwZW5kKHN1YnBhdGgpCiAgICAgICAgbG9hZGVyLmxvYWRfbW9kdWxlKHBhY2thZ2VOYW1lKQogICAgICAgIF9yZWJ1aWxkX21vZF9wYXRoKHBhdGgsIHBhY2thZ2VOYW1lLCBtb2R1bGUpCiAgICByZXR1cm4gc3VicGF0aAoKCmRlZiBfcmVidWlsZF9tb2RfcGF0aChvcmlnX3BhdGgsIHBhY2thZ2VfbmFtZSwgbW9kdWxlKToKICAgICIiIgogICAgUmVidWlsZCBtb2R1bGUuX19wYXRoX18gZW5zdXJpbmcgdGhhdCBhbGwgZW50cmllcyBhcmUgb3JkZXJlZAogICAgY29ycmVzcG9uZGluZyB0byB0aGVpciBzeXMucGF0aCBvcmRlcgogICAgIiIiCiAgICBzeXNfcGF0aCA9IFtfbm9ybWFsaXplX2NhY2hlZChwKSBmb3IgcCBpbiBzeXMucGF0aF0KCiAgICBkZWYgc2FmZV9zeXNfcGF0aF9pbmRleChlbnRyeSk6CiAgICAgICAgIiIiCiAgICAgICAgV29ya2Fyb3VuZCBmb3IgIzUyMCBhbmQgIzUxMy4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzeXNfcGF0aC5pbmRleChlbnRyeSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIGZsb2F0KCdpbmYnKQoKICAgIGRlZiBwb3NpdGlvbl9pbl9zeXNfcGF0aChwYXRoKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIG9yZGluYWwgb2YgdGhlIHBhdGggYmFzZWQgb24gaXRzIHBvc2l0aW9uIGluIHN5cy5wYXRoCiAgICAgICAgIiIiCiAgICAgICAgcGF0aF9wYXJ0cyA9IHBhdGguc3BsaXQob3Muc2VwKQogICAgICAgIG1vZHVsZV9wYXJ0cyA9IHBhY2thZ2VfbmFtZS5jb3VudCgnLicpICsgMQogICAgICAgIHBhcnRzID0gcGF0aF9wYXJ0c1s6LW1vZHVsZV9wYXJ0c10KICAgICAgICByZXR1cm4gc2FmZV9zeXNfcGF0aF9pbmRleChfbm9ybWFsaXplX2NhY2hlZChvcy5zZXAuam9pbihwYXJ0cykpKQoKICAgIG9yaWdfcGF0aC5zb3J0KGtleT1wb3NpdGlvbl9pbl9zeXNfcGF0aCkKICAgIG1vZHVsZS5fX3BhdGhfX1s6XSA9IFtfbm9ybWFsaXplX2NhY2hlZChwKSBmb3IgcCBpbiBvcmlnX3BhdGhdCgoKZGVmIGRlY2xhcmVfbmFtZXNwYWNlKHBhY2thZ2VOYW1lKToKICAgICIiIkRlY2xhcmUgdGhhdCBwYWNrYWdlICdwYWNrYWdlTmFtZScgaXMgYSBuYW1lc3BhY2UgcGFja2FnZSIiIgoKICAgIF9pbXAuYWNxdWlyZV9sb2NrKCkKICAgIHRyeToKICAgICAgICBpZiBwYWNrYWdlTmFtZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgcGF0aCwgcGFyZW50ID0gc3lzLnBhdGgsIE5vbmUKICAgICAgICBpZiAnLicgaW4gcGFja2FnZU5hbWU6CiAgICAgICAgICAgIHBhcmVudCA9ICcuJy5qb2luKHBhY2thZ2VOYW1lLnNwbGl0KCcuJylbOi0xXSkKICAgICAgICAgICAgZGVjbGFyZV9uYW1lc3BhY2UocGFyZW50KQogICAgICAgICAgICBpZiBwYXJlbnQgbm90IGluIF9uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgICAgICBfX2ltcG9ydF9fKHBhcmVudCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcGF0aCA9IHN5cy5tb2R1bGVzW3BhcmVudF0uX19wYXRoX18KICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJOb3QgYSBwYWNrYWdlOiIsIHBhcmVudCkKCiAgICAgICAgIyBUcmFjayB3aGF0IHBhY2thZ2VzIGFyZSBuYW1lc3BhY2VzLCBzbyB3aGVuIG5ldyBwYXRoIGl0ZW1zIGFyZSBhZGRlZCwKICAgICAgICAjIHRoZXkgY2FuIGJlIHVwZGF0ZWQKICAgICAgICBfbmFtZXNwYWNlX3BhY2thZ2VzLnNldGRlZmF1bHQocGFyZW50LCBbXSkuYXBwZW5kKHBhY2thZ2VOYW1lKQogICAgICAgIF9uYW1lc3BhY2VfcGFja2FnZXMuc2V0ZGVmYXVsdChwYWNrYWdlTmFtZSwgW10pCgogICAgICAgIGZvciBwYXRoX2l0ZW0gaW4gcGF0aDoKICAgICAgICAgICAgIyBFbnN1cmUgYWxsIHRoZSBwYXJlbnQncyBwYXRoIGl0ZW1zIGFyZSByZWZsZWN0ZWQgaW4gdGhlIGNoaWxkLAogICAgICAgICAgICAjIGlmIHRoZXkgYXBwbHkKICAgICAgICAgICAgX2hhbmRsZV9ucyhwYWNrYWdlTmFtZSwgcGF0aF9pdGVtKQoKICAgIGZpbmFsbHk6CiAgICAgICAgX2ltcC5yZWxlYXNlX2xvY2soKQoKCmRlZiBmaXh1cF9uYW1lc3BhY2VfcGFja2FnZXMocGF0aF9pdGVtLCBwYXJlbnQ9Tm9uZSk6CiAgICAiIiJFbnN1cmUgdGhhdCBwcmV2aW91c2x5LWRlY2xhcmVkIG5hbWVzcGFjZSBwYWNrYWdlcyBpbmNsdWRlIHBhdGhfaXRlbSIiIgogICAgX2ltcC5hY3F1aXJlX2xvY2soKQogICAgdHJ5OgogICAgICAgIGZvciBwYWNrYWdlIGluIF9uYW1lc3BhY2VfcGFja2FnZXMuZ2V0KHBhcmVudCwgKCkpOgogICAgICAgICAgICBzdWJwYXRoID0gX2hhbmRsZV9ucyhwYWNrYWdlLCBwYXRoX2l0ZW0pCiAgICAgICAgICAgIGlmIHN1YnBhdGg6CiAgICAgICAgICAgICAgICBmaXh1cF9uYW1lc3BhY2VfcGFja2FnZXMoc3VicGF0aCwgcGFja2FnZSkKICAgIGZpbmFsbHk6CiAgICAgICAgX2ltcC5yZWxlYXNlX2xvY2soKQoKCmRlZiBmaWxlX25zX2hhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgcGFja2FnZU5hbWUsIG1vZHVsZSk6CiAgICAiIiJDb21wdXRlIGFuIG5zLXBhY2thZ2Ugc3VicGF0aCBmb3IgYSBmaWxlc3lzdGVtIG9yIHppcGZpbGUgaW1wb3J0ZXIiIiIKCiAgICBzdWJwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgcGFja2FnZU5hbWUuc3BsaXQoJy4nKVstMV0pCiAgICBub3JtYWxpemVkID0gX25vcm1hbGl6ZV9jYWNoZWQoc3VicGF0aCkKICAgIGZvciBpdGVtIGluIG1vZHVsZS5fX3BhdGhfXzoKICAgICAgICBpZiBfbm9ybWFsaXplX2NhY2hlZChpdGVtKSA9PSBub3JtYWxpemVkOgogICAgICAgICAgICBicmVhawogICAgZWxzZToKICAgICAgICAjIE9ubHkgcmV0dXJuIHRoZSBwYXRoIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUKICAgICAgICByZXR1cm4gc3VicGF0aAoKCnJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKHBrZ3V0aWwuSW1wSW1wb3J0ZXIsIGZpbGVfbnNfaGFuZGxlcikKcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIoemlwaW1wb3J0LnppcGltcG9ydGVyLCBmaWxlX25zX2hhbmRsZXIpCgppZiBoYXNhdHRyKGltcG9ydGxpYl9tYWNoaW5lcnksICdGaWxlRmluZGVyJyk6CiAgICByZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcihpbXBvcnRsaWJfbWFjaGluZXJ5LkZpbGVGaW5kZXIsIGZpbGVfbnNfaGFuZGxlcikKCgpkZWYgbnVsbF9uc19oYW5kbGVyKGltcG9ydGVyLCBwYXRoX2l0ZW0sIHBhY2thZ2VOYW1lLCBtb2R1bGUpOgogICAgcmV0dXJuIE5vbmUKCgpyZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcihvYmplY3QsIG51bGxfbnNfaGFuZGxlcikKCgpkZWYgbm9ybWFsaXplX3BhdGgoZmlsZW5hbWUpOgogICAgIiIiTm9ybWFsaXplIGEgZmlsZS9kaXIgbmFtZSBmb3IgY29tcGFyaXNvbiBwdXJwb3NlcyIiIgogICAgcmV0dXJuIG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5yZWFscGF0aChmaWxlbmFtZSkpCgoKZGVmIF9ub3JtYWxpemVfY2FjaGVkKGZpbGVuYW1lLCBfY2FjaGU9e30pOgogICAgdHJ5OgogICAgICAgIHJldHVybiBfY2FjaGVbZmlsZW5hbWVdCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgX2NhY2hlW2ZpbGVuYW1lXSA9IHJlc3VsdCA9IG5vcm1hbGl6ZV9wYXRoKGZpbGVuYW1lKQogICAgICAgIHJldHVybiByZXN1bHQKCgpkZWYgX2lzX3VucGFja2VkX2VnZyhwYXRoKToKICAgICIiIgogICAgRGV0ZXJtaW5lIGlmIGdpdmVuIHBhdGggYXBwZWFycyB0byBiZSBhbiB1bnBhY2tlZCBlZ2cuCiAgICAiIiIKICAgIHJldHVybiAoCiAgICAgICAgcGF0aC5sb3dlcigpLmVuZHN3aXRoKCcuZWdnJykKICAgICkKCgpkZWYgX3NldF9wYXJlbnRfbnMocGFja2FnZU5hbWUpOgogICAgcGFydHMgPSBwYWNrYWdlTmFtZS5zcGxpdCgnLicpCiAgICBuYW1lID0gcGFydHMucG9wKCkKICAgIGlmIHBhcnRzOgogICAgICAgIHBhcmVudCA9ICcuJy5qb2luKHBhcnRzKQogICAgICAgIHNldGF0dHIoc3lzLm1vZHVsZXNbcGFyZW50XSwgbmFtZSwgc3lzLm1vZHVsZXNbcGFja2FnZU5hbWVdKQoKCmRlZiB5aWVsZF9saW5lcyhzdHJzKToKICAgICIiIllpZWxkIG5vbi1lbXB0eS9ub24tY29tbWVudCBsaW5lcyBvZiBhIHN0cmluZyBvciBzZXF1ZW5jZSIiIgogICAgaWYgaXNpbnN0YW5jZShzdHJzLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICBmb3IgcyBpbiBzdHJzLnNwbGl0bGluZXMoKToKICAgICAgICAgICAgcyA9IHMuc3RyaXAoKQogICAgICAgICAgICAjIHNraXAgYmxhbmsgbGluZXMvY29tbWVudHMKICAgICAgICAgICAgaWYgcyBhbmQgbm90IHMuc3RhcnRzd2l0aCgnIycpOgogICAgICAgICAgICAgICAgeWllbGQgcwogICAgZWxzZToKICAgICAgICBmb3Igc3MgaW4gc3RyczoKICAgICAgICAgICAgZm9yIHMgaW4geWllbGRfbGluZXMoc3MpOgogICAgICAgICAgICAgICAgeWllbGQgcwoKCk1PRFVMRSA9IHJlLmNvbXBpbGUociJcdysoXC5cdyspKiQiKS5tYXRjaApFR0dfTkFNRSA9IHJlLmNvbXBpbGUoCiAgICByIiIiCiAgICAoP1A8bmFtZT5bXi1dKykgKAogICAgICAgIC0oP1A8dmVyPlteLV0rKSAoCiAgICAgICAgICAgIC1weSg/UDxweXZlcj5bXi1dKykgKAogICAgICAgICAgICAgICAgLSg/UDxwbGF0Pi4rKQogICAgICAgICAgICApPwogICAgICAgICk/CiAgICApPwogICAgIiIiLAogICAgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UsCikubWF0Y2gKCgpjbGFzcyBFbnRyeVBvaW50KG9iamVjdCk6CiAgICAiIiJPYmplY3QgcmVwcmVzZW50aW5nIGFuIGFkdmVydGlzZWQgaW1wb3J0YWJsZSBvYmplY3QiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbW9kdWxlX25hbWUsIGF0dHJzPSgpLCBleHRyYXM9KCksIGRpc3Q9Tm9uZSk6CiAgICAgICAgaWYgbm90IE1PRFVMRShtb2R1bGVfbmFtZSk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgbW9kdWxlIG5hbWUiLCBtb2R1bGVfbmFtZSkKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5tb2R1bGVfbmFtZSA9IG1vZHVsZV9uYW1lCiAgICAgICAgc2VsZi5hdHRycyA9IHR1cGxlKGF0dHJzKQogICAgICAgIHNlbGYuZXh0cmFzID0gUmVxdWlyZW1lbnQucGFyc2UoKCJ4WyVzXSIgJSAnLCcuam9pbihleHRyYXMpKSkuZXh0cmFzCiAgICAgICAgc2VsZi5kaXN0ID0gZGlzdAoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHMgPSAiJXMgPSAlcyIgJSAoc2VsZi5uYW1lLCBzZWxmLm1vZHVsZV9uYW1lKQogICAgICAgIGlmIHNlbGYuYXR0cnM6CiAgICAgICAgICAgIHMgKz0gJzonICsgJy4nLmpvaW4oc2VsZi5hdHRycykKICAgICAgICBpZiBzZWxmLmV4dHJhczoKICAgICAgICAgICAgcyArPSAnIFslc10nICUgJywnLmpvaW4oc2VsZi5leHRyYXMpCiAgICAgICAgcmV0dXJuIHMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJFbnRyeVBvaW50LnBhcnNlKCVyKSIgJSBzdHIoc2VsZikKCiAgICBkZWYgbG9hZChzZWxmLCByZXF1aXJlPVRydWUsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgUmVxdWlyZSBwYWNrYWdlcyBmb3IgdGhpcyBFbnRyeVBvaW50LCB0aGVuIHJlc29sdmUgaXQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHJlcXVpcmUgb3IgYXJncyBvciBrd2FyZ3M6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiUGFyYW1ldGVycyB0byBsb2FkIGFyZSBkZXByZWNhdGVkLiAgQ2FsbCAucmVzb2x2ZSBhbmQgIgogICAgICAgICAgICAgICAgIi5yZXF1aXJlIHNlcGFyYXRlbHkuIiwKICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywKICAgICAgICAgICAgICAgIHN0YWNrbGV2ZWw9MiwKICAgICAgICAgICAgKQogICAgICAgIGlmIHJlcXVpcmU6CiAgICAgICAgICAgIHNlbGYucmVxdWlyZSgqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcmV0dXJuIHNlbGYucmVzb2x2ZSgpCgogICAgZGVmIHJlc29sdmUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVzb2x2ZSB0aGUgZW50cnkgcG9pbnQgZnJvbSBpdHMgbW9kdWxlIGFuZCBhdHRycy4KICAgICAgICAiIiIKICAgICAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKHNlbGYubW9kdWxlX25hbWUsIGZyb21saXN0PVsnX19uYW1lX18nXSwgbGV2ZWw9MCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBmdW5jdG9vbHMucmVkdWNlKGdldGF0dHIsIHNlbGYuYXR0cnMsIG1vZHVsZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IgYXMgZXhjOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcihzdHIoZXhjKSkKCiAgICBkZWYgcmVxdWlyZShzZWxmLCBlbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUpOgogICAgICAgIGlmIHNlbGYuZXh0cmFzIGFuZCBub3Qgc2VsZi5kaXN0OgogICAgICAgICAgICByYWlzZSBVbmtub3duRXh0cmEoIkNhbid0IHJlcXVpcmUoKSB3aXRob3V0IGEgZGlzdHJpYnV0aW9uIiwgc2VsZikKICAgICAgICByZXFzID0gc2VsZi5kaXN0LnJlcXVpcmVzKHNlbGYuZXh0cmFzKQogICAgICAgIGl0ZW1zID0gd29ya2luZ19zZXQucmVzb2x2ZShyZXFzLCBlbnYsIGluc3RhbGxlcikKICAgICAgICBsaXN0KG1hcCh3b3JraW5nX3NldC5hZGQsIGl0ZW1zKSkKCiAgICBwYXR0ZXJuID0gcmUuY29tcGlsZSgKICAgICAgICByJ1xzKicKICAgICAgICByJyg/UDxuYW1lPi4rPylccyonCiAgICAgICAgcic9XHMqJwogICAgICAgIHInKD9QPG1vZHVsZT5bXHcuXSspXHMqJwogICAgICAgIHInKDpccyooP1A8YXR0cj5bXHcuXSspKT9ccyonCiAgICAgICAgcicoP1A8ZXh0cmFzPlxbLipcXSk/XHMqJCcKICAgICkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBwYXJzZShjbHMsIHNyYywgZGlzdD1Ob25lKToKICAgICAgICAiIiJQYXJzZSBhIHNpbmdsZSBlbnRyeSBwb2ludCBmcm9tIHN0cmluZyBgc3JjYAoKICAgICAgICBFbnRyeSBwb2ludCBzeW50YXggZm9sbG93cyB0aGUgZm9ybTo6CgogICAgICAgICAgICBuYW1lID0gc29tZS5tb2R1bGU6c29tZS5hdHRyIFtleHRyYTEsIGV4dHJhMl0KCiAgICAgICAgVGhlIGVudHJ5IG5hbWUgYW5kIG1vZHVsZSBuYW1lIGFyZSByZXF1aXJlZCwgYnV0IHRoZSBgYDphdHRyc2BgIGFuZAogICAgICAgIGBgW2V4dHJhc11gYCBwYXJ0cyBhcmUgb3B0aW9uYWwKICAgICAgICAiIiIKICAgICAgICBtID0gY2xzLnBhdHRlcm4ubWF0Y2goc3JjKQogICAgICAgIGlmIG5vdCBtOgogICAgICAgICAgICBtc2cgPSAiRW50cnlQb2ludCBtdXN0IGJlIGluICduYW1lPW1vZHVsZTphdHRycyBbZXh0cmFzXScgZm9ybWF0IgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZywgc3JjKQogICAgICAgIHJlcyA9IG0uZ3JvdXBkaWN0KCkKICAgICAgICBleHRyYXMgPSBjbHMuX3BhcnNlX2V4dHJhcyhyZXNbJ2V4dHJhcyddKQogICAgICAgIGF0dHJzID0gcmVzWydhdHRyJ10uc3BsaXQoJy4nKSBpZiByZXNbJ2F0dHInXSBlbHNlICgpCiAgICAgICAgcmV0dXJuIGNscyhyZXNbJ25hbWUnXSwgcmVzWydtb2R1bGUnXSwgYXR0cnMsIGV4dHJhcywgZGlzdCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2VfZXh0cmFzKGNscywgZXh0cmFzX3NwZWMpOgogICAgICAgIGlmIG5vdCBleHRyYXNfc3BlYzoKICAgICAgICAgICAgcmV0dXJuICgpCiAgICAgICAgcmVxID0gUmVxdWlyZW1lbnQucGFyc2UoJ3gnICsgZXh0cmFzX3NwZWMpCiAgICAgICAgaWYgcmVxLnNwZWNzOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCkKICAgICAgICByZXR1cm4gcmVxLmV4dHJhcwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHBhcnNlX2dyb3VwKGNscywgZ3JvdXAsIGxpbmVzLCBkaXN0PU5vbmUpOgogICAgICAgICIiIlBhcnNlIGFuIGVudHJ5IHBvaW50IGdyb3VwIiIiCiAgICAgICAgaWYgbm90IE1PRFVMRShncm91cCk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgZ3JvdXAgbmFtZSIsIGdyb3VwKQogICAgICAgIHRoaXMgPSB7fQogICAgICAgIGZvciBsaW5lIGluIHlpZWxkX2xpbmVzKGxpbmVzKToKICAgICAgICAgICAgZXAgPSBjbHMucGFyc2UobGluZSwgZGlzdCkKICAgICAgICAgICAgaWYgZXAubmFtZSBpbiB0aGlzOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRHVwbGljYXRlIGVudHJ5IHBvaW50IiwgZ3JvdXAsIGVwLm5hbWUpCiAgICAgICAgICAgIHRoaXNbZXAubmFtZV0gPSBlcAogICAgICAgIHJldHVybiB0aGlzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgcGFyc2VfbWFwKGNscywgZGF0YSwgZGlzdD1Ob25lKToKICAgICAgICAiIiJQYXJzZSBhIG1hcCBvZiBlbnRyeSBwb2ludCBncm91cHMiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIGRpY3QpOgogICAgICAgICAgICBkYXRhID0gZGF0YS5pdGVtcygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGF0YSA9IHNwbGl0X3NlY3Rpb25zKGRhdGEpCiAgICAgICAgbWFwcyA9IHt9CiAgICAgICAgZm9yIGdyb3VwLCBsaW5lcyBpbiBkYXRhOgogICAgICAgICAgICBpZiBncm91cCBpcyBOb25lOgogICAgICAgICAgICAgICAgaWYgbm90IGxpbmVzOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJFbnRyeSBwb2ludHMgbXVzdCBiZSBsaXN0ZWQgaW4gZ3JvdXBzIikKICAgICAgICAgICAgZ3JvdXAgPSBncm91cC5zdHJpcCgpCiAgICAgICAgICAgIGlmIGdyb3VwIGluIG1hcHM6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEdXBsaWNhdGUgZ3JvdXAgbmFtZSIsIGdyb3VwKQogICAgICAgICAgICBtYXBzW2dyb3VwXSA9IGNscy5wYXJzZV9ncm91cChncm91cCwgbGluZXMsIGRpc3QpCiAgICAgICAgcmV0dXJuIG1hcHMKCgpkZWYgX3JlbW92ZV9tZDVfZnJhZ21lbnQobG9jYXRpb24pOgogICAgaWYgbm90IGxvY2F0aW9uOgogICAgICAgIHJldHVybiAnJwogICAgcGFyc2VkID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKGxvY2F0aW9uKQogICAgaWYgcGFyc2VkWy0xXS5zdGFydHN3aXRoKCdtZDU9Jyk6CiAgICAgICAgcmV0dXJuIHVybGxpYi5wYXJzZS51cmx1bnBhcnNlKHBhcnNlZFs6LTFdICsgKCcnLCkpCiAgICByZXR1cm4gbG9jYXRpb24KCgpkZWYgX3ZlcnNpb25fZnJvbV9maWxlKGxpbmVzKToKICAgICIiIgogICAgR2l2ZW4gYW4gaXRlcmFibGUgb2YgbGluZXMgZnJvbSBhIE1ldGFkYXRhIGZpbGUsIHJldHVybgogICAgdGhlIHZhbHVlIG9mIHRoZSBWZXJzaW9uIGZpZWxkLCBpZiBwcmVzZW50LCBvciBOb25lIG90aGVyd2lzZS4KICAgICIiIgogICAgaXNfdmVyc2lvbl9saW5lID0gbGFtYmRhIGxpbmU6IGxpbmUubG93ZXIoKS5zdGFydHN3aXRoKCd2ZXJzaW9uOicpCiAgICB2ZXJzaW9uX2xpbmVzID0gZmlsdGVyKGlzX3ZlcnNpb25fbGluZSwgbGluZXMpCiAgICBsaW5lID0gbmV4dChpdGVyKHZlcnNpb25fbGluZXMpLCAnJykKICAgIF8sIF8sIHZhbHVlID0gbGluZS5wYXJ0aXRpb24oJzonKQogICAgcmV0dXJuIHNhZmVfdmVyc2lvbih2YWx1ZS5zdHJpcCgpKSBvciBOb25lCgoKY2xhc3MgRGlzdHJpYnV0aW9uKG9iamVjdCk6CiAgICAiIiJXcmFwIGFuIGFjdHVhbCBvciBwb3RlbnRpYWwgc3lzLnBhdGggZW50cnkgdy9tZXRhZGF0YSIiIgogICAgUEtHX0lORk8gPSAnUEtHLUlORk8nCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvY2F0aW9uPU5vbmUsIG1ldGFkYXRhPU5vbmUsIHByb2plY3RfbmFtZT1Ob25lLAogICAgICAgICAgICB2ZXJzaW9uPU5vbmUsIHB5X3ZlcnNpb249UFlfTUFKT1IsIHBsYXRmb3JtPU5vbmUsCiAgICAgICAgICAgIHByZWNlZGVuY2U9RUdHX0RJU1QpOgogICAgICAgIHNlbGYucHJvamVjdF9uYW1lID0gc2FmZV9uYW1lKHByb2plY3RfbmFtZSBvciAnVW5rbm93bicpCiAgICAgICAgaWYgdmVyc2lvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9IHNhZmVfdmVyc2lvbih2ZXJzaW9uKQogICAgICAgIHNlbGYucHlfdmVyc2lvbiA9IHB5X3ZlcnNpb24KICAgICAgICBzZWxmLnBsYXRmb3JtID0gcGxhdGZvcm0KICAgICAgICBzZWxmLmxvY2F0aW9uID0gbG9jYXRpb24KICAgICAgICBzZWxmLnByZWNlZGVuY2UgPSBwcmVjZWRlbmNlCiAgICAgICAgc2VsZi5fcHJvdmlkZXIgPSBtZXRhZGF0YSBvciBlbXB0eV9wcm92aWRlcgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fbG9jYXRpb24oY2xzLCBsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhPU5vbmUsICoqa3cpOgogICAgICAgIHByb2plY3RfbmFtZSwgdmVyc2lvbiwgcHlfdmVyc2lvbiwgcGxhdGZvcm0gPSBbTm9uZV0gKiA0CiAgICAgICAgYmFzZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoYmFzZW5hbWUpCiAgICAgICAgaWYgZXh0Lmxvd2VyKCkgaW4gX2Rpc3RyaWJ1dGlvbkltcGw6CiAgICAgICAgICAgIGNscyA9IF9kaXN0cmlidXRpb25JbXBsW2V4dC5sb3dlcigpXQoKICAgICAgICAgICAgbWF0Y2ggPSBFR0dfTkFNRShiYXNlbmFtZSkKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICBwcm9qZWN0X25hbWUsIHZlcnNpb24sIHB5X3ZlcnNpb24sIHBsYXRmb3JtID0gbWF0Y2guZ3JvdXAoCiAgICAgICAgICAgICAgICAgICAgJ25hbWUnLCAndmVyJywgJ3B5dmVyJywgJ3BsYXQnCiAgICAgICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGNscygKICAgICAgICAgICAgbG9jYXRpb24sIG1ldGFkYXRhLCBwcm9qZWN0X25hbWU9cHJvamVjdF9uYW1lLCB2ZXJzaW9uPXZlcnNpb24sCiAgICAgICAgICAgIHB5X3ZlcnNpb249cHlfdmVyc2lvbiwgcGxhdGZvcm09cGxhdGZvcm0sICoqa3cKICAgICAgICApLl9yZWxvYWRfdmVyc2lvbigpCgogICAgZGVmIF9yZWxvYWRfdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGhhc2hjbXAoc2VsZik6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgc2VsZi5wYXJzZWRfdmVyc2lvbiwKICAgICAgICAgICAgc2VsZi5wcmVjZWRlbmNlLAogICAgICAgICAgICBzZWxmLmtleSwKICAgICAgICAgICAgX3JlbW92ZV9tZDVfZnJhZ21lbnQoc2VsZi5sb2NhdGlvbiksCiAgICAgICAgICAgIHNlbGYucHlfdmVyc2lvbiBvciAnJywKICAgICAgICAgICAgc2VsZi5wbGF0Zm9ybSBvciAnJywKICAgICAgICApCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuaGFzaGNtcCkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wIDwgb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPD0gb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPiBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA+PSBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKICAgICAgICAgICAgIyBJdCdzIG5vdCBhIERpc3RyaWJ1dGlvbiwgc28gdGhleSBhcmUgbm90IGVxdWFsCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPT0gb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgoKICAgICMgVGhlc2UgcHJvcGVydGllcyBoYXZlIHRvIGJlIGxhenkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGxvYWQgYW55CiAgICAjIG1ldGFkYXRhIHVudGlsL3VubGVzcyBpdCdzIGFjdHVhbGx5IG5lZWRlZC4gIChpLmUuLCBzb21lIGRpc3RyaWJ1dGlvbnMKICAgICMgbWF5IG5vdCBrbm93IHRoZWlyIG5hbWUgb3IgdmVyc2lvbiB3aXRob3V0IGxvYWRpbmcgUEtHLUlORk8pCgogICAgQHByb3BlcnR5CiAgICBkZWYga2V5KHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2tleQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgc2VsZi5fa2V5ID0ga2V5ID0gc2VsZi5wcm9qZWN0X25hbWUubG93ZXIoKQogICAgICAgICAgICByZXR1cm4ga2V5CgogICAgQHByb3BlcnR5CiAgICBkZWYgcGFyc2VkX3ZlcnNpb24oc2VsZik6CiAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgIl9wYXJzZWRfdmVyc2lvbiIpOgogICAgICAgICAgICBzZWxmLl9wYXJzZWRfdmVyc2lvbiA9IHBhcnNlX3ZlcnNpb24oc2VsZi52ZXJzaW9uKQoKICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VkX3ZlcnNpb24KCiAgICBkZWYgX3dhcm5fbGVnYWN5X3ZlcnNpb24oc2VsZik6CiAgICAgICAgTFYgPSBwYWNrYWdpbmcudmVyc2lvbi5MZWdhY3lWZXJzaW9uCiAgICAgICAgaXNfbGVnYWN5ID0gaXNpbnN0YW5jZShzZWxmLl9wYXJzZWRfdmVyc2lvbiwgTFYpCiAgICAgICAgaWYgbm90IGlzX2xlZ2FjeToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgV2hpbGUgYW4gZW1wdHkgdmVyc2lvbiBpcyB0ZWNobmljYWxseSBhIGxlZ2FjeSB2ZXJzaW9uIGFuZAogICAgICAgICMgaXMgbm90IGEgdmFsaWQgUEVQIDQ0MCB2ZXJzaW9uLCBpdCdzIGFsc28gdW5saWtlbHkgdG8KICAgICAgICAjIGFjdHVhbGx5IGNvbWUgZnJvbSBzb21lb25lIGFuZCBpbnN0ZWFkIGl0IGlzIG1vcmUgbGlrZWx5IHRoYXQKICAgICAgICAjIGl0IGNvbWVzIGZyb20gc2V0dXB0b29scyBhdHRlbXB0aW5nIHRvIHBhcnNlIGEgZmlsZW5hbWUgYW5kCiAgICAgICAgIyBpbmNsdWRpbmcgaXQgaW4gdGhlIGxpc3QuIFNvIGZvciB0aGF0IHdlJ2xsIGdhdGUgdGhpcyB3YXJuaW5nCiAgICAgICAgIyBvbiBpZiB0aGUgdmVyc2lvbiBpcyBhbnl0aGluZyBhdCBhbGwgb3Igbm90LgogICAgICAgIGlmIG5vdCBzZWxmLnZlcnNpb246CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB0bXBsID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgICAgICAne3Byb2plY3RfbmFtZX0gKHt2ZXJzaW9ufSknIGlzIGJlaW5nIHBhcnNlZCBhcyBhIGxlZ2FjeSwKICAgICAgICAgICAgbm9uIFBFUCA0NDAsCiAgICAgICAgICAgIHZlcnNpb24uIFlvdSBtYXkgZmluZCBvZGQgYmVoYXZpb3IgYW5kIHNvcnQgb3JkZXIuCiAgICAgICAgICAgIEluIHBhcnRpY3VsYXIgaXQgd2lsbCBiZSBzb3J0ZWQgYXMgbGVzcyB0aGFuIDAuMC4gSXQKICAgICAgICAgICAgaXMgcmVjb21tZW5kZWQgdG8gbWlncmF0ZSB0byBQRVAgNDQwIGNvbXBhdGlibGUKICAgICAgICAgICAgdmVyc2lvbnMuCiAgICAgICAgICAgICIiIikuc3RyaXAoKS5yZXBsYWNlKCdcbicsICcgJykKCiAgICAgICAgd2FybmluZ3Mud2Fybih0bXBsLmZvcm1hdCgqKnZhcnMoc2VsZikpLCBQRVA0NDBXYXJuaW5nKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgdmVyc2lvbiA9IF92ZXJzaW9uX2Zyb21fZmlsZShzZWxmLl9nZXRfbWV0YWRhdGEoc2VsZi5QS0dfSU5GTykpCiAgICAgICAgICAgIGlmIHZlcnNpb24gaXMgTm9uZToKICAgICAgICAgICAgICAgIHRtcGwgPSAiTWlzc2luZyAnVmVyc2lvbjonIGhlYWRlciBhbmQvb3IgJXMgZmlsZSIKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IodG1wbCAlIHNlbGYuUEtHX0lORk8sIHNlbGYpCiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgQHByb3BlcnR5CiAgICBkZWYgX2RlcF9tYXAoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RlcF9tYXAKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIGRtID0gc2VsZi5fX2RlcF9tYXAgPSB7Tm9uZTogW119CiAgICAgICAgICAgIGZvciBuYW1lIGluICdyZXF1aXJlcy50eHQnLCAnZGVwZW5kcy50eHQnOgogICAgICAgICAgICAgICAgZm9yIGV4dHJhLCByZXFzIGluIHNwbGl0X3NlY3Rpb25zKHNlbGYuX2dldF9tZXRhZGF0YShuYW1lKSk6CiAgICAgICAgICAgICAgICAgICAgaWYgZXh0cmE6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICc6JyBpbiBleHRyYToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLCBtYXJrZXIgPSBleHRyYS5zcGxpdCgnOicsIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpbnZhbGlkX21hcmtlcihtYXJrZXIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgWFhYIHdhcm4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFzID0gW10KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbm90IGV2YWx1YXRlX21hcmtlcihtYXJrZXIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXMgPSBbXQogICAgICAgICAgICAgICAgICAgICAgICBleHRyYSA9IHNhZmVfZXh0cmEoZXh0cmEpIG9yIE5vbmUKICAgICAgICAgICAgICAgICAgICBkbS5zZXRkZWZhdWx0KGV4dHJhLCBbXSkuZXh0ZW5kKHBhcnNlX3JlcXVpcmVtZW50cyhyZXFzKSkKICAgICAgICAgICAgcmV0dXJuIGRtCgogICAgZGVmIHJlcXVpcmVzKHNlbGYsIGV4dHJhcz0oKSk6CiAgICAgICAgIiIiTGlzdCBvZiBSZXF1aXJlbWVudHMgbmVlZGVkIGZvciB0aGlzIGRpc3RybyBpZiBgZXh0cmFzYCBhcmUgdXNlZCIiIgogICAgICAgIGRtID0gc2VsZi5fZGVwX21hcAogICAgICAgIGRlcHMgPSBbXQogICAgICAgIGRlcHMuZXh0ZW5kKGRtLmdldChOb25lLCAoKSkpCiAgICAgICAgZm9yIGV4dCBpbiBleHRyYXM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGRlcHMuZXh0ZW5kKGRtW3NhZmVfZXh0cmEoZXh0KV0pCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIFVua25vd25FeHRyYSgKICAgICAgICAgICAgICAgICAgICAiJXMgaGFzIG5vIHN1Y2ggZXh0cmEgZmVhdHVyZSAlciIgJSAoc2VsZiwgZXh0KQogICAgICAgICAgICAgICAgKQogICAgICAgIHJldHVybiBkZXBzCgogICAgZGVmIF9nZXRfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgc2VsZi5oYXNfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuZ2V0X21ldGFkYXRhX2xpbmVzKG5hbWUpOgogICAgICAgICAgICAgICAgeWllbGQgbGluZQoKICAgIGRlZiBhY3RpdmF0ZShzZWxmLCBwYXRoPU5vbmUsIHJlcGxhY2U9RmFsc2UpOgogICAgICAgICIiIkVuc3VyZSBkaXN0cmlidXRpb24gaXMgaW1wb3J0YWJsZSBvbiBgcGF0aGAgKGRlZmF1bHQ9c3lzLnBhdGgpIiIiCiAgICAgICAgaWYgcGF0aCBpcyBOb25lOgogICAgICAgICAgICBwYXRoID0gc3lzLnBhdGgKICAgICAgICBzZWxmLmluc2VydF9vbihwYXRoLCByZXBsYWNlPXJlcGxhY2UpCiAgICAgICAgaWYgcGF0aCBpcyBzeXMucGF0aDoKICAgICAgICAgICAgZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzKHNlbGYubG9jYXRpb24pCiAgICAgICAgICAgIGZvciBwa2cgaW4gc2VsZi5fZ2V0X21ldGFkYXRhKCduYW1lc3BhY2VfcGFja2FnZXMudHh0Jyk6CiAgICAgICAgICAgICAgICBpZiBwa2cgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyZV9uYW1lc3BhY2UocGtnKQoKICAgIGRlZiBlZ2dfbmFtZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gd2hhdCB0aGlzIGRpc3RyaWJ1dGlvbidzIHN0YW5kYXJkIC5lZ2cgZmlsZW5hbWUgc2hvdWxkIGJlIiIiCiAgICAgICAgZmlsZW5hbWUgPSAiJXMtJXMtcHklcyIgJSAoCiAgICAgICAgICAgIHRvX2ZpbGVuYW1lKHNlbGYucHJvamVjdF9uYW1lKSwgdG9fZmlsZW5hbWUoc2VsZi52ZXJzaW9uKSwKICAgICAgICAgICAgc2VsZi5weV92ZXJzaW9uIG9yIFBZX01BSk9SCiAgICAgICAgKQoKICAgICAgICBpZiBzZWxmLnBsYXRmb3JtOgogICAgICAgICAgICBmaWxlbmFtZSArPSAnLScgKyBzZWxmLnBsYXRmb3JtCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIGlmIHNlbGYubG9jYXRpb246CiAgICAgICAgICAgIHJldHVybiAiJXMgKCVzKSIgJSAoc2VsZiwgc2VsZi5sb2NhdGlvbikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB2ZXJzaW9uID0gZ2V0YXR0cihzZWxmLCAndmVyc2lvbicsIE5vbmUpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHZlcnNpb24gPSBOb25lCiAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24gb3IgIlt1bmtub3duIHZlcnNpb25dIgogICAgICAgIHJldHVybiAiJXMgJXMiICUgKHNlbGYucHJvamVjdF9uYW1lLCB2ZXJzaW9uKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICAiIiJEZWxlZ2F0ZSBhbGwgdW5yZWNvZ25pemVkIHB1YmxpYyBhdHRyaWJ1dGVzIHRvIC5tZXRhZGF0YSBwcm92aWRlciIiIgogICAgICAgIGlmIGF0dHIuc3RhcnRzd2l0aCgnXycpOgogICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihhdHRyKQogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX3Byb3ZpZGVyLCBhdHRyKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fZmlsZW5hbWUoY2xzLCBmaWxlbmFtZSwgbWV0YWRhdGE9Tm9uZSwgKiprdyk6CiAgICAgICAgcmV0dXJuIGNscy5mcm9tX2xvY2F0aW9uKAogICAgICAgICAgICBfbm9ybWFsaXplX2NhY2hlZChmaWxlbmFtZSksIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpLCBtZXRhZGF0YSwKICAgICAgICAgICAgKiprdwogICAgICAgICkKCiAgICBkZWYgYXNfcmVxdWlyZW1lbnQoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgYGBSZXF1aXJlbWVudGBgIHRoYXQgbWF0Y2hlcyB0aGlzIGRpc3RyaWJ1dGlvbiBleGFjdGx5IiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnBhcnNlZF92ZXJzaW9uLCBwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uKToKICAgICAgICAgICAgc3BlYyA9ICIlcz09JXMiICUgKHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLnBhcnNlZF92ZXJzaW9uKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNwZWMgPSAiJXM9PT0lcyIgJSAoc2VsZi5wcm9qZWN0X25hbWUsIHNlbGYucGFyc2VkX3ZlcnNpb24pCgogICAgICAgIHJldHVybiBSZXF1aXJlbWVudC5wYXJzZShzcGVjKQoKICAgIGRlZiBsb2FkX2VudHJ5X3BvaW50KHNlbGYsIGdyb3VwLCBuYW1lKToKICAgICAgICAiIiJSZXR1cm4gdGhlIGBuYW1lYCBlbnRyeSBwb2ludCBvZiBgZ3JvdXBgIG9yIHJhaXNlIEltcG9ydEVycm9yIiIiCiAgICAgICAgZXAgPSBzZWxmLmdldF9lbnRyeV9pbmZvKGdyb3VwLCBuYW1lKQogICAgICAgIGlmIGVwIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJFbnRyeSBwb2ludCAlciBub3QgZm91bmQiICUgKChncm91cCwgbmFtZSksKSkKICAgICAgICByZXR1cm4gZXAubG9hZCgpCgogICAgZGVmIGdldF9lbnRyeV9tYXAoc2VsZiwgZ3JvdXA9Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBlbnRyeSBwb2ludCBtYXAgZm9yIGBncm91cGAsIG9yIHRoZSBmdWxsIGVudHJ5IG1hcCIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgZXBfbWFwID0gc2VsZi5fZXBfbWFwCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBlcF9tYXAgPSBzZWxmLl9lcF9tYXAgPSBFbnRyeVBvaW50LnBhcnNlX21hcCgKICAgICAgICAgICAgICAgIHNlbGYuX2dldF9tZXRhZGF0YSgnZW50cnlfcG9pbnRzLnR4dCcpLCBzZWxmCiAgICAgICAgICAgICkKICAgICAgICBpZiBncm91cCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGVwX21hcC5nZXQoZ3JvdXAsIHt9KQogICAgICAgIHJldHVybiBlcF9tYXAKCiAgICBkZWYgZ2V0X2VudHJ5X2luZm8oc2VsZiwgZ3JvdXAsIG5hbWUpOgogICAgICAgICIiIlJldHVybiB0aGUgRW50cnlQb2ludCBvYmplY3QgZm9yIGBncm91cGArYG5hbWVgLCBvciBgYE5vbmVgYCIiIgogICAgICAgIHJldHVybiBzZWxmLmdldF9lbnRyeV9tYXAoZ3JvdXApLmdldChuYW1lKQoKICAgIGRlZiBpbnNlcnRfb24oc2VsZiwgcGF0aCwgbG9jPU5vbmUsIHJlcGxhY2U9RmFsc2UpOgogICAgICAgICIiIkVuc3VyZSBzZWxmLmxvY2F0aW9uIGlzIG9uIHBhdGgKCiAgICAgICAgSWYgcmVwbGFjZT1GYWxzZSAoZGVmYXVsdCk6CiAgICAgICAgICAgIC0gSWYgbG9jYXRpb24gaXMgYWxyZWFkeSBpbiBwYXRoIGFueXdoZXJlLCBkbyBub3RoaW5nLgogICAgICAgICAgICAtIEVsc2U6CiAgICAgICAgICAgICAgLSBJZiBpdCdzIGFuIGVnZyBhbmQgaXRzIHBhcmVudCBkaXJlY3RvcnkgaXMgb24gcGF0aCwKICAgICAgICAgICAgICAgIGluc2VydCBqdXN0IGFoZWFkIG9mIHRoZSBwYXJlbnQuCiAgICAgICAgICAgICAgLSBFbHNlOiBhZGQgdG8gdGhlIGVuZCBvZiBwYXRoLgogICAgICAgIElmIHJlcGxhY2U9VHJ1ZToKICAgICAgICAgICAgLSBJZiBsb2NhdGlvbiBpcyBhbHJlYWR5IG9uIHBhdGggYW55d2hlcmUgKG5vdCBlZ2dzKQogICAgICAgICAgICAgIG9yIGhpZ2hlciBwcmlvcml0eSB0aGFuIGl0cyBwYXJlbnQgKGVnZ3MpCiAgICAgICAgICAgICAgZG8gbm90aGluZy4KICAgICAgICAgICAgLSBFbHNlOgogICAgICAgICAgICAgIC0gSWYgaXQncyBhbiBlZ2cgYW5kIGl0cyBwYXJlbnQgZGlyZWN0b3J5IGlzIG9uIHBhdGgsCiAgICAgICAgICAgICAgICBpbnNlcnQganVzdCBhaGVhZCBvZiB0aGUgcGFyZW50LAogICAgICAgICAgICAgICAgcmVtb3ZpbmcgYW55IGxvd2VyLXByaW9yaXR5IGVudHJpZXMuCiAgICAgICAgICAgICAgLSBFbHNlOiBhZGQgaXQgdG8gdGhlIGZyb250IG9mIHBhdGguCiAgICAgICAgIiIiCgogICAgICAgIGxvYyA9IGxvYyBvciBzZWxmLmxvY2F0aW9uCiAgICAgICAgaWYgbm90IGxvYzoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIG5sb2MgPSBfbm9ybWFsaXplX2NhY2hlZChsb2MpCiAgICAgICAgYmRpciA9IG9zLnBhdGguZGlybmFtZShubG9jKQogICAgICAgIG5wYXRoID0gWyhwIGFuZCBfbm9ybWFsaXplX2NhY2hlZChwKSBvciBwKSBmb3IgcCBpbiBwYXRoXQoKICAgICAgICBmb3IgcCwgaXRlbSBpbiBlbnVtZXJhdGUobnBhdGgpOgogICAgICAgICAgICBpZiBpdGVtID09IG5sb2M6CiAgICAgICAgICAgICAgICBpZiByZXBsYWNlOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgZG9uJ3QgbW9kaWZ5IHBhdGggKGV2ZW4gcmVtb3ZpbmcgZHVwbGljYXRlcykgaWYgZm91bmQgYW5kIG5vdCByZXBsYWNlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGVsaWYgaXRlbSA9PSBiZGlyIGFuZCBzZWxmLnByZWNlZGVuY2UgPT0gRUdHX0RJU1Q6CiAgICAgICAgICAgICAgICAjIGlmIGl0J3MgYW4gLmVnZywgZ2l2ZSBpdCBwcmVjZWRlbmNlIG92ZXIgaXRzIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgIyBVTkxFU1MgaXQncyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gc3lzLnBhdGggYW5kIHJlcGxhY2U9RmFsc2UKICAgICAgICAgICAgICAgIGlmIChub3QgcmVwbGFjZSkgYW5kIG5sb2MgaW4gbnBhdGhbcDpdOgogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgaWYgcGF0aCBpcyBzeXMucGF0aDoKICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fY29uZmxpY3QoKQogICAgICAgICAgICAgICAgcGF0aC5pbnNlcnQocCwgbG9jKQogICAgICAgICAgICAgICAgbnBhdGguaW5zZXJ0KHAsIG5sb2MpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHBhdGggaXMgc3lzLnBhdGg6CiAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fY29uZmxpY3QoKQogICAgICAgICAgICBpZiByZXBsYWNlOgogICAgICAgICAgICAgICAgcGF0aC5pbnNlcnQoMCwgbG9jKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0aC5hcHBlbmQobG9jKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBwIGlzIHRoZSBzcG90IHdoZXJlIHdlIGZvdW5kIG9yIGluc2VydGVkIGxvYzsgbm93IHJlbW92ZSBkdXBsaWNhdGVzCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbnAgPSBucGF0aC5pbmRleChubG9jLCBwICsgMSkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZGVsIG5wYXRoW25wXSwgcGF0aFtucF0KICAgICAgICAgICAgICAgICMgaGEhCiAgICAgICAgICAgICAgICBwID0gbnAKCiAgICAgICAgcmV0dXJuCgogICAgZGVmIGNoZWNrX3ZlcnNpb25fY29uZmxpY3Qoc2VsZik6CiAgICAgICAgaWYgc2VsZi5rZXkgPT0gJ3NldHVwdG9vbHMnOgogICAgICAgICAgICAjIGlnbm9yZSB0aGUgaW5ldml0YWJsZSBzZXR1cHRvb2xzIHNlbGYtY29uZmxpY3RzICA6KAogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgbnNwID0gZGljdC5mcm9ta2V5cyhzZWxmLl9nZXRfbWV0YWRhdGEoJ25hbWVzcGFjZV9wYWNrYWdlcy50eHQnKSkKICAgICAgICBsb2MgPSBub3JtYWxpemVfcGF0aChzZWxmLmxvY2F0aW9uKQogICAgICAgIGZvciBtb2RuYW1lIGluIHNlbGYuX2dldF9tZXRhZGF0YSgndG9wX2xldmVsLnR4dCcpOgogICAgICAgICAgICBpZiAobW9kbmFtZSBub3QgaW4gc3lzLm1vZHVsZXMgb3IgbW9kbmFtZSBpbiBuc3AKICAgICAgICAgICAgICAgICAgICBvciBtb2RuYW1lIGluIF9uYW1lc3BhY2VfcGFja2FnZXMpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbW9kbmFtZSBpbiAoJ3BrZ19yZXNvdXJjZXMnLCAnc2V0dXB0b29scycsICdzaXRlJyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBmbiA9IGdldGF0dHIoc3lzLm1vZHVsZXNbbW9kbmFtZV0sICdfX2ZpbGVfXycsIE5vbmUpCiAgICAgICAgICAgIGlmIGZuIGFuZCAobm9ybWFsaXplX3BhdGgoZm4pLnN0YXJ0c3dpdGgobG9jKSBvcgogICAgICAgICAgICAgICAgICAgICAgIGZuLnN0YXJ0c3dpdGgoc2VsZi5sb2NhdGlvbikpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaXNzdWVfd2FybmluZygKICAgICAgICAgICAgICAgICJNb2R1bGUgJXMgd2FzIGFscmVhZHkgaW1wb3J0ZWQgZnJvbSAlcywgYnV0ICVzIGlzIGJlaW5nIGFkZGVkIgogICAgICAgICAgICAgICAgIiB0byBzeXMucGF0aCIgJSAobW9kbmFtZSwgZm4sIHNlbGYubG9jYXRpb24pLAogICAgICAgICAgICApCgogICAgZGVmIGhhc192ZXJzaW9uKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi52ZXJzaW9uCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIGlzc3VlX3dhcm5pbmcoIlVuYnVpbHQgZWdnIGZvciAiICsgcmVwcihzZWxmKSkKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY2xvbmUoc2VsZiwgKiprdyk6CiAgICAgICAgIiIiQ29weSB0aGlzIGRpc3RyaWJ1dGlvbiwgc3Vic3RpdHV0aW5nIGluIGFueSBjaGFuZ2VkIGtleXdvcmQgYXJncyIiIgogICAgICAgIG5hbWVzID0gJ3Byb2plY3RfbmFtZSB2ZXJzaW9uIHB5X3ZlcnNpb24gcGxhdGZvcm0gbG9jYXRpb24gcHJlY2VkZW5jZScKICAgICAgICBmb3IgYXR0ciBpbiBuYW1lcy5zcGxpdCgpOgogICAgICAgICAgICBrdy5zZXRkZWZhdWx0KGF0dHIsIGdldGF0dHIoc2VsZiwgYXR0ciwgTm9uZSkpCiAgICAgICAga3cuc2V0ZGVmYXVsdCgnbWV0YWRhdGEnLCBzZWxmLl9wcm92aWRlcikKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oKiprdykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBleHRyYXMoc2VsZik6CiAgICAgICAgcmV0dXJuIFtkZXAgZm9yIGRlcCBpbiBzZWxmLl9kZXBfbWFwIGlmIGRlcF0KCgpjbGFzcyBFZ2dJbmZvRGlzdHJpYnV0aW9uKERpc3RyaWJ1dGlvbik6CiAgICBkZWYgX3JlbG9hZF92ZXJzaW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFBhY2thZ2VzIGluc3RhbGxlZCBieSBkaXN0dXRpbHMgKGUuZy4gbnVtcHkgb3Igc2NpcHkpLAogICAgICAgIHdoaWNoIHVzZXMgYW4gb2xkIHNhZmVfdmVyc2lvbiwgYW5kIHNvCiAgICAgICAgdGhlaXIgdmVyc2lvbiBudW1iZXJzIGNhbiBnZXQgbWFuZ2xlZCB3aGVuCiAgICAgICAgY29udmVydGVkIHRvIGZpbGVuYW1lcyAoZS5nLiwgMS4xMS4wLmRldjArMjMyOWVhZSB0bwogICAgICAgIDEuMTEuMC5kZXYwXzIzMjllYWUpLiBUaGVzZSBkaXN0cmlidXRpb25zIHdpbGwgbm90IGJlCiAgICAgICAgcGFyc2VkIHByb3Blcmx5CiAgICAgICAgZG93bnN0cmVhbSBieSBEaXN0cmlidXRpb24gYW5kIHNhZmVfdmVyc2lvbiwgc28KICAgICAgICB0YWtlIGFuIGV4dHJhIHN0ZXAgYW5kIHRyeSB0byBnZXQgdGhlIHZlcnNpb24gbnVtYmVyIGZyb20KICAgICAgICB0aGUgbWV0YWRhdGEgZmlsZSBpdHNlbGYgaW5zdGVhZCBvZiB0aGUgZmlsZW5hbWUuCiAgICAgICAgIiIiCiAgICAgICAgbWRfdmVyc2lvbiA9IF92ZXJzaW9uX2Zyb21fZmlsZShzZWxmLl9nZXRfbWV0YWRhdGEoc2VsZi5QS0dfSU5GTykpCiAgICAgICAgaWYgbWRfdmVyc2lvbjoKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9IG1kX3ZlcnNpb24KICAgICAgICByZXR1cm4gc2VsZgoKCmNsYXNzIERpc3RJbmZvRGlzdHJpYnV0aW9uKERpc3RyaWJ1dGlvbik6CiAgICAiIiJXcmFwIGFuIGFjdHVhbCBvciBwb3RlbnRpYWwgc3lzLnBhdGggZW50cnkgdy9tZXRhZGF0YSwgLmRpc3QtaW5mbyBzdHlsZSIiIgogICAgUEtHX0lORk8gPSAnTUVUQURBVEEnCiAgICBFUUVRID0gcmUuY29tcGlsZShyIihbXCgsXSlccyooXGQuKj8pXHMqKFssXCldKSIpCgogICAgQHByb3BlcnR5CiAgICBkZWYgX3BhcnNlZF9wa2dfaW5mbyhzZWxmKToKICAgICAgICAiIiJQYXJzZSBhbmQgY2FjaGUgbWV0YWRhdGEiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wa2dfaW5mbwogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgbWV0YWRhdGEgPSBzZWxmLmdldF9tZXRhZGF0YShzZWxmLlBLR19JTkZPKQogICAgICAgICAgICBzZWxmLl9wa2dfaW5mbyA9IGVtYWlsLnBhcnNlci5QYXJzZXIoKS5wYXJzZXN0cihtZXRhZGF0YSkKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BrZ19pbmZvCgogICAgQHByb3BlcnR5CiAgICBkZWYgX2RlcF9tYXAoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RlcF9tYXAKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHNlbGYuX19kZXBfbWFwID0gc2VsZi5fY29tcHV0ZV9kZXBlbmRlbmNpZXMoKQogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RlcF9tYXAKCiAgICBkZWYgX2NvbXB1dGVfZGVwZW5kZW5jaWVzKHNlbGYpOgogICAgICAgICIiIlJlY29tcHV0ZSB0aGlzIGRpc3RyaWJ1dGlvbidzIGRlcGVuZGVuY2llcy4iIiIKICAgICAgICBkbSA9IHNlbGYuX19kZXBfbWFwID0ge05vbmU6IFtdfQoKICAgICAgICByZXFzID0gW10KICAgICAgICAjIEluY2x1ZGluZyBhbnkgY29uZGl0aW9uIGV4cHJlc3Npb25zCiAgICAgICAgZm9yIHJlcSBpbiBzZWxmLl9wYXJzZWRfcGtnX2luZm8uZ2V0X2FsbCgnUmVxdWlyZXMtRGlzdCcpIG9yIFtdOgogICAgICAgICAgICByZXFzLmV4dGVuZChwYXJzZV9yZXF1aXJlbWVudHMocmVxKSkKCiAgICAgICAgZGVmIHJlcXNfZm9yX2V4dHJhKGV4dHJhKToKICAgICAgICAgICAgZm9yIHJlcSBpbiByZXFzOgogICAgICAgICAgICAgICAgaWYgbm90IHJlcS5tYXJrZXIgb3IgcmVxLm1hcmtlci5ldmFsdWF0ZSh7J2V4dHJhJzogZXh0cmF9KToKICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXEKCiAgICAgICAgY29tbW9uID0gZnJvemVuc2V0KHJlcXNfZm9yX2V4dHJhKE5vbmUpKQogICAgICAgIGRtW05vbmVdLmV4dGVuZChjb21tb24pCgogICAgICAgIGZvciBleHRyYSBpbiBzZWxmLl9wYXJzZWRfcGtnX2luZm8uZ2V0X2FsbCgnUHJvdmlkZXMtRXh0cmEnKSBvciBbXToKICAgICAgICAgICAgc19leHRyYSA9IHNhZmVfZXh0cmEoZXh0cmEuc3RyaXAoKSkKICAgICAgICAgICAgZG1bc19leHRyYV0gPSBsaXN0KGZyb3plbnNldChyZXFzX2Zvcl9leHRyYShleHRyYSkpIC0gY29tbW9uKQoKICAgICAgICByZXR1cm4gZG0KCgpfZGlzdHJpYnV0aW9uSW1wbCA9IHsKICAgICcuZWdnJzogRGlzdHJpYnV0aW9uLAogICAgJy5lZ2ctaW5mbyc6IEVnZ0luZm9EaXN0cmlidXRpb24sCiAgICAnLmRpc3QtaW5mbyc6IERpc3RJbmZvRGlzdHJpYnV0aW9uLAogICAgfQoKCmRlZiBpc3N1ZV93YXJuaW5nKCphcmdzLCAqKmt3KToKICAgIGxldmVsID0gMQogICAgZyA9IGdsb2JhbHMoKQogICAgdHJ5OgogICAgICAgICMgZmluZCB0aGUgZmlyc3Qgc3RhY2sgZnJhbWUgdGhhdCBpcyAqbm90KiBjb2RlIGluCiAgICAgICAgIyB0aGUgcGtnX3Jlc291cmNlcyBtb2R1bGUsIHRvIHVzZSBmb3IgdGhlIHdhcm5pbmcKICAgICAgICB3aGlsZSBzeXMuX2dldGZyYW1lKGxldmVsKS5mX2dsb2JhbHMgaXMgZzoKICAgICAgICAgICAgbGV2ZWwgKz0gMQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcGFzcwogICAgd2FybmluZ3Mud2FybihzdGFja2xldmVsPWxldmVsICsgMSwgKmFyZ3MsICoqa3cpCgoKY2xhc3MgUmVxdWlyZW1lbnRQYXJzZUVycm9yKFZhbHVlRXJyb3IpOgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICcgJy5qb2luKHNlbGYuYXJncykKCgpkZWYgcGFyc2VfcmVxdWlyZW1lbnRzKHN0cnMpOgogICAgIiIiWWllbGQgYGBSZXF1aXJlbWVudGBgIG9iamVjdHMgZm9yIGVhY2ggc3BlY2lmaWNhdGlvbiBpbiBgc3Ryc2AKCiAgICBgc3Ryc2AgbXVzdCBiZSBhIHN0cmluZywgb3IgYSAocG9zc2libHktbmVzdGVkKSBpdGVyYWJsZSB0aGVyZW9mLgogICAgIiIiCiAgICAjIGNyZWF0ZSBhIHN0ZXBwYWJsZSBpdGVyYXRvciwgc28gd2UgY2FuIGhhbmRsZSBcLWNvbnRpbnVhdGlvbnMKICAgIGxpbmVzID0gaXRlcih5aWVsZF9saW5lcyhzdHJzKSkKCiAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICAjIERyb3AgY29tbWVudHMgLS0gYSBoYXNoIHdpdGhvdXQgYSBzcGFjZSBtYXkgYmUgaW4gYSBVUkwuCiAgICAgICAgaWYgJyAjJyBpbiBsaW5lOgogICAgICAgICAgICBsaW5lID0gbGluZVs6bGluZS5maW5kKCcgIycpXQogICAgICAgICMgSWYgdGhlcmUgaXMgYSBsaW5lIGNvbnRpbnVhdGlvbiwgZHJvcCBpdCwgYW5kIGFwcGVuZCB0aGUgbmV4dCBsaW5lLgogICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoJ1xcJyk6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMl0uc3RyaXAoKQogICAgICAgICAgICBsaW5lICs9IG5leHQobGluZXMpCiAgICAgICAgeWllbGQgUmVxdWlyZW1lbnQobGluZSkKCgpjbGFzcyBSZXF1aXJlbWVudChwYWNrYWdpbmcucmVxdWlyZW1lbnRzLlJlcXVpcmVtZW50KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXF1aXJlbWVudF9zdHJpbmcpOgogICAgICAgICIiIkRPIE5PVCBDQUxMIFRISVMgVU5ET0NVTUVOVEVEIE1FVEhPRDsgdXNlIFJlcXVpcmVtZW50LnBhcnNlKCkhIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdXBlcihSZXF1aXJlbWVudCwgc2VsZikuX19pbml0X18ocmVxdWlyZW1lbnRfc3RyaW5nKQogICAgICAgIGV4Y2VwdCBwYWNrYWdpbmcucmVxdWlyZW1lbnRzLkludmFsaWRSZXF1aXJlbWVudCBhcyBlOgogICAgICAgICAgICByYWlzZSBSZXF1aXJlbWVudFBhcnNlRXJyb3Ioc3RyKGUpKQogICAgICAgIHNlbGYudW5zYWZlX25hbWUgPSBzZWxmLm5hbWUKICAgICAgICBwcm9qZWN0X25hbWUgPSBzYWZlX25hbWUoc2VsZi5uYW1lKQogICAgICAgIHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLmtleSA9IHByb2plY3RfbmFtZSwgcHJvamVjdF9uYW1lLmxvd2VyKCkKICAgICAgICBzZWxmLnNwZWNzID0gWwogICAgICAgICAgICAoc3BlYy5vcGVyYXRvciwgc3BlYy52ZXJzaW9uKSBmb3Igc3BlYyBpbiBzZWxmLnNwZWNpZmllcl0KICAgICAgICBzZWxmLmV4dHJhcyA9IHR1cGxlKG1hcChzYWZlX2V4dHJhLCBzZWxmLmV4dHJhcykpCiAgICAgICAgc2VsZi5oYXNoQ21wID0gKAogICAgICAgICAgICBzZWxmLmtleSwKICAgICAgICAgICAgc2VsZi5zcGVjaWZpZXIsCiAgICAgICAgICAgIGZyb3plbnNldChzZWxmLmV4dHJhcyksCiAgICAgICAgICAgIHN0cihzZWxmLm1hcmtlcikgaWYgc2VsZi5tYXJrZXIgZWxzZSBOb25lLAogICAgICAgICkKICAgICAgICBzZWxmLl9faGFzaCA9IGhhc2goc2VsZi5oYXNoQ21wKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIGlzaW5zdGFuY2Uob3RoZXIsIFJlcXVpcmVtZW50KSBhbmQKICAgICAgICAgICAgc2VsZi5oYXNoQ21wID09IG90aGVyLmhhc2hDbXAKICAgICAgICApCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIERpc3RyaWJ1dGlvbik6CiAgICAgICAgICAgIGlmIGl0ZW0ua2V5ICE9IHNlbGYua2V5OgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICAgICBpdGVtID0gaXRlbS52ZXJzaW9uCgogICAgICAgICMgQWxsb3cgcHJlcmVsZWFzZXMgYWx3YXlzIGluIG9yZGVyIHRvIG1hdGNoIHRoZSBwcmV2aW91cyBiZWhhdmlvciBvZgogICAgICAgICMgdGhpcyBtZXRob2QuIEluIHRoZSBmdXR1cmUgdGhpcyBzaG91bGQgYmUgc21hcnRlciBhbmQgZm9sbG93IFBFUCA0NDAKICAgICAgICAjIG1vcmUgYWNjdXJhdGVseS4KICAgICAgICByZXR1cm4gc2VsZi5zcGVjaWZpZXIuY29udGFpbnMoaXRlbSwgcHJlcmVsZWFzZXM9VHJ1ZSkKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19oYXNoCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOiByZXR1cm4gIlJlcXVpcmVtZW50LnBhcnNlKCVyKSIgJSBzdHIoc2VsZikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgcGFyc2Uocyk6CiAgICAgICAgcmVxLCA9IHBhcnNlX3JlcXVpcmVtZW50cyhzKQogICAgICAgIHJldHVybiByZXEKCgpkZWYgX2dldF9tcm8oY2xzKToKICAgICIiIkdldCBhbiBtcm8gZm9yIGEgdHlwZSBvciBjbGFzc2ljIGNsYXNzIiIiCiAgICBpZiBub3QgaXNpbnN0YW5jZShjbHMsIHR5cGUpOgoKICAgICAgICBjbGFzcyBjbHMoY2xzLCBvYmplY3QpOgogICAgICAgICAgICBwYXNzCgogICAgICAgIHJldHVybiBjbHMuX19tcm9fX1sxOl0KICAgIHJldHVybiBjbHMuX19tcm9fXwoKCmRlZiBfZmluZF9hZGFwdGVyKHJlZ2lzdHJ5LCBvYik6CiAgICAiIiJSZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciBgb2JgIGZyb20gYHJlZ2lzdHJ5YCIiIgogICAgZm9yIHQgaW4gX2dldF9tcm8oZ2V0YXR0cihvYiwgJ19fY2xhc3NfXycsIHR5cGUob2IpKSk6CiAgICAgICAgaWYgdCBpbiByZWdpc3RyeToKICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5W3RdCgoKZGVmIGVuc3VyZV9kaXJlY3RvcnkocGF0aCk6CiAgICAiIiJFbnN1cmUgdGhhdCB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiBgcGF0aGAgZXhpc3RzIiIiCiAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKHBhdGgpCiAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkaXJuYW1lKToKICAgICAgICBvcy5tYWtlZGlycyhkaXJuYW1lKQoKCmRlZiBfYnlwYXNzX2Vuc3VyZV9kaXJlY3RvcnkocGF0aCk6CiAgICAiIiJTYW5kYm94LWJ5cGFzc2luZyB2ZXJzaW9uIG9mIGVuc3VyZV9kaXJlY3RvcnkoKSIiIgogICAgaWYgbm90IFdSSVRFX1NVUFBPUlQ6CiAgICAgICAgcmFpc2UgSU9FcnJvcignIm9zLm1rZGlyIiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0uJykKICAgIGRpcm5hbWUsIGZpbGVuYW1lID0gc3BsaXQocGF0aCkKICAgIGlmIGRpcm5hbWUgYW5kIGZpbGVuYW1lIGFuZCBub3QgaXNkaXIoZGlybmFtZSk6CiAgICAgICAgX2J5cGFzc19lbnN1cmVfZGlyZWN0b3J5KGRpcm5hbWUpCiAgICAgICAgbWtkaXIoZGlybmFtZSwgMG83NTUpCgoKZGVmIHNwbGl0X3NlY3Rpb25zKHMpOgogICAgIiIiU3BsaXQgYSBzdHJpbmcgb3IgaXRlcmFibGUgdGhlcmVvZiBpbnRvIChzZWN0aW9uLCBjb250ZW50KSBwYWlycwoKICAgIEVhY2ggYGBzZWN0aW9uYGAgaXMgYSBzdHJpcHBlZCB2ZXJzaW9uIG9mIHRoZSBzZWN0aW9uIGhlYWRlciAoIltzZWN0aW9uXSIpCiAgICBhbmQgZWFjaCBgYGNvbnRlbnRgYCBpcyBhIGxpc3Qgb2Ygc3RyaXBwZWQgbGluZXMgZXhjbHVkaW5nIGJsYW5rIGxpbmVzIGFuZAogICAgY29tbWVudC1vbmx5IGxpbmVzLiAgSWYgdGhlcmUgYXJlIGFueSBzdWNoIGxpbmVzIGJlZm9yZSB0aGUgZmlyc3Qgc2VjdGlvbgogICAgaGVhZGVyLCB0aGV5J3JlIHJldHVybmVkIGluIGEgZmlyc3QgYGBzZWN0aW9uYGAgb2YgYGBOb25lYGAuCiAgICAiIiIKICAgIHNlY3Rpb24gPSBOb25lCiAgICBjb250ZW50ID0gW10KICAgIGZvciBsaW5lIGluIHlpZWxkX2xpbmVzKHMpOgogICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiWyIpOgogICAgICAgICAgICBpZiBsaW5lLmVuZHN3aXRoKCJdIik6CiAgICAgICAgICAgICAgICBpZiBzZWN0aW9uIG9yIGNvbnRlbnQ6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VjdGlvbiwgY29udGVudAogICAgICAgICAgICAgICAgc2VjdGlvbiA9IGxpbmVbMTotMV0uc3RyaXAoKQogICAgICAgICAgICAgICAgY29udGVudCA9IFtdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIHNlY3Rpb24gaGVhZGluZyIsIGxpbmUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29udGVudC5hcHBlbmQobGluZSkKCiAgICAjIHdyYXAgdXAgbGFzdCBzZWdtZW50CiAgICB5aWVsZCBzZWN0aW9uLCBjb250ZW50CgoKZGVmIF9ta3N0ZW1wKCphcmdzLCAqKmt3KToKICAgIG9sZF9vcGVuID0gb3Mub3BlbgogICAgdHJ5OgogICAgICAgICMgdGVtcG9yYXJpbHkgYnlwYXNzIHNhbmRib3hpbmcKICAgICAgICBvcy5vcGVuID0gb3Nfb3BlbgogICAgICAgIHJldHVybiB0ZW1wZmlsZS5ta3N0ZW1wKCphcmdzLCAqKmt3KQogICAgZmluYWxseToKICAgICAgICAjIGFuZCB0aGVuIHB1dCBpdCBiYWNrCiAgICAgICAgb3Mub3BlbiA9IG9sZF9vcGVuCgoKIyBTaWxlbmNlIHRoZSBQRVA0NDBXYXJuaW5nIGJ5IGRlZmF1bHQsIHNvIHRoYXQgZW5kIHVzZXJzIGRvbid0IGdldCBoaXQgYnkgaXQKIyByYW5kb21seSBqdXN0IGJlY2F1c2UgdGhleSB1c2UgcGtnX3Jlc291cmNlcy4gV2Ugd2FudCB0byBhcHBlbmQgdGhlIHJ1bGUKIyBiZWNhdXNlIHdlIHdhbnQgZWFybGllciB1c2VzIG9mIGZpbHRlcndhcm5pbmdzIHRvIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoaXMKIyBvbmUuCndhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCBjYXRlZ29yeT1QRVA0NDBXYXJuaW5nLCBhcHBlbmQ9VHJ1ZSkKCgojIGZyb20gamFyYWNvLmZ1bmN0b29scyAxLjMKZGVmIF9jYWxsX2FzaWRlKGYsICphcmdzLCAqKmt3YXJncyk6CiAgICBmKCphcmdzLCAqKmt3YXJncykKICAgIHJldHVybiBmCgoKQF9jYWxsX2FzaWRlCmRlZiBfaW5pdGlhbGl6ZShnPWdsb2JhbHMoKSk6CiAgICAiU2V0IHVwIGdsb2JhbCByZXNvdXJjZSBtYW5hZ2VyIChkZWxpYmVyYXRlbHkgbm90IHN0YXRlLXNhdmVkKSIKICAgIG1hbmFnZXIgPSBSZXNvdXJjZU1hbmFnZXIoKQogICAgZ1snX21hbmFnZXInXSA9IG1hbmFnZXIKICAgIGZvciBuYW1lIGluIGRpcihtYW5hZ2VyKToKICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJyk6CiAgICAgICAgICAgIGdbbmFtZV0gPSBnZXRhdHRyKG1hbmFnZXIsIG5hbWUpCgoKQF9jYWxsX2FzaWRlCmRlZiBfaW5pdGlhbGl6ZV9tYXN0ZXJfd29ya2luZ19zZXQoKToKICAgICIiIgogICAgUHJlcGFyZSB0aGUgbWFzdGVyIHdvcmtpbmcgc2V0IGFuZCBtYWtlIHRoZSBgYHJlcXVpcmUoKWBgCiAgICBBUEkgYXZhaWxhYmxlLgoKICAgIFRoaXMgZnVuY3Rpb24gaGFzIGV4cGxpY2l0IGVmZmVjdHMgb24gdGhlIGdsb2JhbCBzdGF0ZQogICAgb2YgcGtnX3Jlc291cmNlcy4gSXQgaXMgaW50ZW5kZWQgdG8gYmUgaW52b2tlZCBvbmNlIGF0CiAgICB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhpcyBtb2R1bGUuCgogICAgSW52b2NhdGlvbiBieSBvdGhlciBwYWNrYWdlcyBpcyB1bnN1cHBvcnRlZCBhbmQgZG9uZQogICAgYXQgdGhlaXIgb3duIHJpc2suCiAgICAiIiIKICAgIHdvcmtpbmdfc2V0ID0gV29ya2luZ1NldC5fYnVpbGRfbWFzdGVyKCkKICAgIF9kZWNsYXJlX3N0YXRlKCdvYmplY3QnLCB3b3JraW5nX3NldD13b3JraW5nX3NldCkKCiAgICByZXF1aXJlID0gd29ya2luZ19zZXQucmVxdWlyZQogICAgaXRlcl9lbnRyeV9wb2ludHMgPSB3b3JraW5nX3NldC5pdGVyX2VudHJ5X3BvaW50cwogICAgYWRkX2FjdGl2YXRpb25fbGlzdGVuZXIgPSB3b3JraW5nX3NldC5zdWJzY3JpYmUKICAgIHJ1bl9zY3JpcHQgPSB3b3JraW5nX3NldC5ydW5fc2NyaXB0CiAgICAjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgIHJ1bl9tYWluID0gcnVuX3NjcmlwdAogICAgIyBBY3RpdmF0ZSBhbGwgZGlzdHJpYnV0aW9ucyBhbHJlYWR5IG9uIHN5cy5wYXRoIHdpdGggcmVwbGFjZT1GYWxzZSBhbmQKICAgICMgZW5zdXJlIHRoYXQgYWxsIGRpc3RyaWJ1dGlvbnMgYWRkZWQgdG8gdGhlIHdvcmtpbmcgc2V0IGluIHRoZSBmdXR1cmUKICAgICMgKGUuZy4gYnkgY2FsbGluZyBgYHJlcXVpcmUoKWBgKSB3aWxsIGdldCBhY3RpdmF0ZWQgYXMgd2VsbCwKICAgICMgd2l0aCBoaWdoZXIgcHJpb3JpdHkgKHJlcGxhY2U9VHJ1ZSkuCiAgICBkaXN0ID0gTm9uZSAgIyBlbnN1cmUgZGlzdCBpcyBkZWZpbmVkIGZvciBkZWwgZGlzdCBiZWxvdwogICAgZm9yIGRpc3QgaW4gd29ya2luZ19zZXQ6CiAgICAgICAgZGlzdC5hY3RpdmF0ZShyZXBsYWNlPUZhbHNlKQogICAgZGVsIGRpc3QKICAgIGFkZF9hY3RpdmF0aW9uX2xpc3RlbmVyKGxhbWJkYSBkaXN0OiBkaXN0LmFjdGl2YXRlKHJlcGxhY2U9VHJ1ZSksIGV4aXN0aW5nPUZhbHNlKQogICAgd29ya2luZ19zZXQuZW50cmllcyA9IFtdCiAgICAjIG1hdGNoIG9yZGVyCiAgICBsaXN0KG1hcCh3b3JraW5nX3NldC5hZGRfZW50cnksIHN5cy5wYXRoKSkKICAgIGdsb2JhbHMoKS51cGRhdGUobG9jYWxzKCkpClBLAwQUAAAAAAAAACEA+lpxjM8LAADPCwAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wcm9ncmVzcy9fX2luaXRfXy5weSMgQ29weXJpZ2h0IChjKSAyMDEyIEdpb3Jnb3MgVmVyaWdha2lzIDx2ZXJpZ2FrQGdtYWlsLmNvbT4KIwojIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQojIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCiMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgojIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCiMgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwojIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgojIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCiMgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCmZyb20gZGF0ZXRpbWUgaW1wb3J0IHRpbWVkZWx0YQpmcm9tIG1hdGggaW1wb3J0IGNlaWwKZnJvbSBzeXMgaW1wb3J0IHN0ZGVycgpmcm9tIHRpbWUgaW1wb3J0IHRpbWUKCgpfX3ZlcnNpb25fXyA9ICcxLjInCgoKY2xhc3MgSW5maW5pdGUob2JqZWN0KToKICAgIGZpbGUgPSBzdGRlcnIKICAgIHNtYV93aW5kb3cgPSAxMAoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHNlbGYuaW5kZXggPSAwCiAgICAgICAgc2VsZi5zdGFydF90cyA9IHRpbWUoKQogICAgICAgIHNlbGYuX3RzID0gc2VsZi5zdGFydF90cwogICAgICAgIHNlbGYuX2R0ID0gZGVxdWUobWF4bGVuPXNlbGYuc21hX3dpbmRvdykKICAgICAgICBmb3Iga2V5LCB2YWwgaW4ga3dhcmdzLml0ZW1zKCk6CiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwga2V5LCB2YWwpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgaWYga2V5LnN0YXJ0c3dpdGgoJ18nKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBrZXksIE5vbmUpCgogICAgQHByb3BlcnR5CiAgICBkZWYgYXZnKHNlbGYpOgogICAgICAgIHJldHVybiBzdW0oc2VsZi5fZHQpIC8gbGVuKHNlbGYuX2R0KSBpZiBzZWxmLl9kdCBlbHNlIDAKCiAgICBAcHJvcGVydHkKICAgIGRlZiBlbGFwc2VkKHNlbGYpOgogICAgICAgIHJldHVybiBpbnQodGltZSgpIC0gc2VsZi5zdGFydF90cykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBlbGFwc2VkX3RkKHNlbGYpOgogICAgICAgIHJldHVybiB0aW1lZGVsdGEoc2Vjb25kcz1zZWxmLmVsYXBzZWQpCgogICAgZGVmIHVwZGF0ZShzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIHN0YXJ0KHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgZmluaXNoKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgbmV4dChzZWxmLCBuPTEpOgogICAgICAgIGlmIG4gPiAwOgogICAgICAgICAgICBub3cgPSB0aW1lKCkKICAgICAgICAgICAgZHQgPSAobm93IC0gc2VsZi5fdHMpIC8gbgogICAgICAgICAgICBzZWxmLl9kdC5hcHBlbmQoZHQpCiAgICAgICAgICAgIHNlbGYuX3RzID0gbm93CgogICAgICAgIHNlbGYuaW5kZXggPSBzZWxmLmluZGV4ICsgbgogICAgICAgIHNlbGYudXBkYXRlKCkKCiAgICBkZWYgaXRlcihzZWxmLCBpdCk6CiAgICAgICAgZm9yIHggaW4gaXQ6CiAgICAgICAgICAgIHlpZWxkIHgKICAgICAgICAgICAgc2VsZi5uZXh0KCkKICAgICAgICBzZWxmLmZpbmlzaCgpCgoKY2xhc3MgUHJvZ3Jlc3MoSW5maW5pdGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc3VwZXIoUHJvZ3Jlc3MsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKICAgICAgICBzZWxmLm1heCA9IGt3YXJncy5nZXQoJ21heCcsIDEwMCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBldGEoc2VsZik6CiAgICAgICAgcmV0dXJuIGludChjZWlsKHNlbGYuYXZnICogc2VsZi5yZW1haW5pbmcpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGV0YV90ZChzZWxmKToKICAgICAgICByZXR1cm4gdGltZWRlbHRhKHNlY29uZHM9c2VsZi5ldGEpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcGVyY2VudChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5wcm9ncmVzcyAqIDEwMAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByb2dyZXNzKHNlbGYpOgogICAgICAgIHJldHVybiBtaW4oMSwgc2VsZi5pbmRleCAvIHNlbGYubWF4KQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlbWFpbmluZyhzZWxmKToKICAgICAgICByZXR1cm4gbWF4KHNlbGYubWF4IC0gc2VsZi5pbmRleCwgMCkKCiAgICBkZWYgc3RhcnQoc2VsZik6CiAgICAgICAgc2VsZi51cGRhdGUoKQoKICAgIGRlZiBnb3RvKHNlbGYsIGluZGV4KToKICAgICAgICBpbmNyID0gaW5kZXggLSBzZWxmLmluZGV4CiAgICAgICAgc2VsZi5uZXh0KGluY3IpCgogICAgZGVmIGl0ZXIoc2VsZiwgaXQpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5tYXggPSBsZW4oaXQpCiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgICAgICBmb3IgeCBpbiBpdDoKICAgICAgICAgICAgeWllbGQgeAogICAgICAgICAgICBzZWxmLm5leHQoKQogICAgICAgIHNlbGYuZmluaXNoKCkKUEsDBBQAAAAAAAAAIQAPw0YDfQoAAH0KAAArAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3Byb2dyZXNzL2Jhci5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgojIENvcHlyaWdodCAoYykgMjAxMiBHaW9yZ29zIFZlcmlnYWtpcyA8dmVyaWdha0BnbWFpbC5jb20+CiMKIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKIyBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCiMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KIwojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwojIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgojIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKIyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KIyBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgojIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCgpmcm9tIC4gaW1wb3J0IFByb2dyZXNzCmZyb20gLmhlbHBlcnMgaW1wb3J0IFdyaXRlbG5NaXhpbgoKCmNsYXNzIEJhcihXcml0ZWxuTWl4aW4sIFByb2dyZXNzKToKICAgIHdpZHRoID0gMzIKICAgIG1lc3NhZ2UgPSAnJwogICAgc3VmZml4ID0gJyUoaW5kZXgpZC8lKG1heClkJwogICAgYmFyX3ByZWZpeCA9ICcgfCcKICAgIGJhcl9zdWZmaXggPSAnfCAnCiAgICBlbXB0eV9maWxsID0gJyAnCiAgICBmaWxsID0gJyMnCiAgICBoaWRlX2N1cnNvciA9IFRydWUKCiAgICBkZWYgdXBkYXRlKHNlbGYpOgogICAgICAgIGZpbGxlZF9sZW5ndGggPSBpbnQoc2VsZi53aWR0aCAqIHNlbGYucHJvZ3Jlc3MpCiAgICAgICAgZW1wdHlfbGVuZ3RoID0gc2VsZi53aWR0aCAtIGZpbGxlZF9sZW5ndGgKCiAgICAgICAgbWVzc2FnZSA9IHNlbGYubWVzc2FnZSAlIHNlbGYKICAgICAgICBiYXIgPSBzZWxmLmZpbGwgKiBmaWxsZWRfbGVuZ3RoCiAgICAgICAgZW1wdHkgPSBzZWxmLmVtcHR5X2ZpbGwgKiBlbXB0eV9sZW5ndGgKICAgICAgICBzdWZmaXggPSBzZWxmLnN1ZmZpeCAlIHNlbGYKICAgICAgICBsaW5lID0gJycuam9pbihbbWVzc2FnZSwgc2VsZi5iYXJfcHJlZml4LCBiYXIsIGVtcHR5LCBzZWxmLmJhcl9zdWZmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeF0pCiAgICAgICAgc2VsZi53cml0ZWxuKGxpbmUpCgoKY2xhc3MgQ2hhcmdpbmdCYXIoQmFyKToKICAgIHN1ZmZpeCA9ICclKHBlcmNlbnQpZCUlJwogICAgYmFyX3ByZWZpeCA9ICcgJwogICAgYmFyX3N1ZmZpeCA9ICcgJwogICAgZW1wdHlfZmlsbCA9IHUn4oiZJwogICAgZmlsbCA9IHUn4paIJwoKCmNsYXNzIEZpbGxpbmdTcXVhcmVzQmFyKENoYXJnaW5nQmFyKToKICAgIGVtcHR5X2ZpbGwgPSB1J+KWoicKICAgIGZpbGwgPSB1J+KWoycKCgpjbGFzcyBGaWxsaW5nQ2lyY2xlc0JhcihDaGFyZ2luZ0Jhcik6CiAgICBlbXB0eV9maWxsID0gdSfil68nCiAgICBmaWxsID0gdSfil4knCgoKY2xhc3MgSW5jcmVtZW50YWxCYXIoQmFyKToKICAgIHBoYXNlcyA9ICh1JyAnLCB1J+KWjycsIHUn4paOJywgdSfilo0nLCB1J+KWjCcsIHUn4paLJywgdSfiloonLCB1J+KWiScsIHUn4paIJykKCiAgICBkZWYgdXBkYXRlKHNlbGYpOgogICAgICAgIG5waGFzZXMgPSBsZW4oc2VsZi5waGFzZXMpCiAgICAgICAgZXhwYW5kZWRfbGVuZ3RoID0gaW50KG5waGFzZXMgKiBzZWxmLndpZHRoICogc2VsZi5wcm9ncmVzcykKICAgICAgICBmaWxsZWRfbGVuZ3RoID0gaW50KHNlbGYud2lkdGggKiBzZWxmLnByb2dyZXNzKQogICAgICAgIGVtcHR5X2xlbmd0aCA9IHNlbGYud2lkdGggLSBmaWxsZWRfbGVuZ3RoCiAgICAgICAgcGhhc2UgPSBleHBhbmRlZF9sZW5ndGggLSAoZmlsbGVkX2xlbmd0aCAqIG5waGFzZXMpCgogICAgICAgIG1lc3NhZ2UgPSBzZWxmLm1lc3NhZ2UgJSBzZWxmCiAgICAgICAgYmFyID0gc2VsZi5waGFzZXNbLTFdICogZmlsbGVkX2xlbmd0aAogICAgICAgIGN1cnJlbnQgPSBzZWxmLnBoYXNlc1twaGFzZV0gaWYgcGhhc2UgPiAwIGVsc2UgJycKICAgICAgICBlbXB0eSA9IHNlbGYuZW1wdHlfZmlsbCAqIG1heCgwLCBlbXB0eV9sZW5ndGggLSBsZW4oY3VycmVudCkpCiAgICAgICAgc3VmZml4ID0gc2VsZi5zdWZmaXggJSBzZWxmCiAgICAgICAgbGluZSA9ICcnLmpvaW4oW21lc3NhZ2UsIHNlbGYuYmFyX3ByZWZpeCwgYmFyLCBjdXJyZW50LCBlbXB0eSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5iYXJfc3VmZml4LCBzdWZmaXhdKQogICAgICAgIHNlbGYud3JpdGVsbihsaW5lKQoKCmNsYXNzIFNoYWR5QmFyKEluY3JlbWVudGFsQmFyKToKICAgIHBoYXNlcyA9ICh1JyAnLCB1J+KWkScsIHUn4paSJywgdSfilpMnLCB1J+KWiCcpClBLAwQUAAAAAAAAACEAKn/xMN4FAADeBQAALwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wcm9ncmVzcy9jb3VudGVyLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiMgQ29weXJpZ2h0IChjKSAyMDEyIEdpb3Jnb3MgVmVyaWdha2lzIDx2ZXJpZ2FrQGdtYWlsLmNvbT4KIwojIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQojIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCiMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgojIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCiMgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwojIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgojIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCiMgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KCmZyb20gLiBpbXBvcnQgSW5maW5pdGUsIFByb2dyZXNzCmZyb20gLmhlbHBlcnMgaW1wb3J0IFdyaXRlTWl4aW4KCgpjbGFzcyBDb3VudGVyKFdyaXRlTWl4aW4sIEluZmluaXRlKToKICAgIG1lc3NhZ2UgPSAnJwogICAgaGlkZV9jdXJzb3IgPSBUcnVlCgogICAgZGVmIHVwZGF0ZShzZWxmKToKICAgICAgICBzZWxmLndyaXRlKHN0cihzZWxmLmluZGV4KSkKCgpjbGFzcyBDb3VudGRvd24oV3JpdGVNaXhpbiwgUHJvZ3Jlc3MpOgogICAgaGlkZV9jdXJzb3IgPSBUcnVlCgogICAgZGVmIHVwZGF0ZShzZWxmKToKICAgICAgICBzZWxmLndyaXRlKHN0cihzZWxmLnJlbWFpbmluZykpCgoKY2xhc3MgU3RhY2soV3JpdGVNaXhpbiwgUHJvZ3Jlc3MpOgogICAgcGhhc2VzID0gKHUnICcsIHUn4paBJywgdSfiloInLCB1J+KWgycsIHUn4paEJywgdSfiloUnLCB1J+KWhicsIHUn4paHJywgdSfilognKQogICAgaGlkZV9jdXJzb3IgPSBUcnVlCgogICAgZGVmIHVwZGF0ZShzZWxmKToKICAgICAgICBucGhhc2VzID0gbGVuKHNlbGYucGhhc2VzKQogICAgICAgIGkgPSBtaW4obnBoYXNlcyAtIDEsIGludChzZWxmLnByb2dyZXNzICogbnBoYXNlcykpCiAgICAgICAgc2VsZi53cml0ZShzZWxmLnBoYXNlc1tpXSkKCgpjbGFzcyBQaWUoU3RhY2spOgogICAgcGhhc2VzID0gKHUn4peLJywgdSfil5QnLCB1J+KXkScsIHUn4peVJywgdSfil48nKQpQSwMEFAAAAAAAAAAhAM7sD04mCwAAJgsAAC8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcHJvZ3Jlc3MvaGVscGVycy5weSMgQ29weXJpZ2h0IChjKSAyMDEyIEdpb3Jnb3MgVmVyaWdha2lzIDx2ZXJpZ2FrQGdtYWlsLmNvbT4KIwojIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQojIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCiMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgojIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCiMgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwojIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgojIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCiMgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KCgpISURFX0NVUlNPUiA9ICdceDFiWz8yNWwnClNIT1dfQ1VSU09SID0gJ1x4MWJbPzI1aCcKCgpjbGFzcyBXcml0ZU1peGluKG9iamVjdCk6CiAgICBoaWRlX2N1cnNvciA9IEZhbHNlCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2U9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKFdyaXRlTWl4aW4sIHNlbGYpLl9faW5pdF9fKCoqa3dhcmdzKQogICAgICAgIHNlbGYuX3dpZHRoID0gMAogICAgICAgIGlmIG1lc3NhZ2U6CiAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKCiAgICAgICAgaWYgc2VsZi5maWxlLmlzYXR0eSgpOgogICAgICAgICAgICBpZiBzZWxmLmhpZGVfY3Vyc29yOgogICAgICAgICAgICAgICAgcHJpbnQoSElERV9DVVJTT1IsIGVuZD0nJywgZmlsZT1zZWxmLmZpbGUpCiAgICAgICAgICAgIHByaW50KHNlbGYubWVzc2FnZSwgZW5kPScnLCBmaWxlPXNlbGYuZmlsZSkKICAgICAgICAgICAgc2VsZi5maWxlLmZsdXNoKCkKCiAgICBkZWYgd3JpdGUoc2VsZiwgcyk6CiAgICAgICAgaWYgc2VsZi5maWxlLmlzYXR0eSgpOgogICAgICAgICAgICBiID0gJ1xiJyAqIHNlbGYuX3dpZHRoCiAgICAgICAgICAgIGMgPSBzLmxqdXN0KHNlbGYuX3dpZHRoKQogICAgICAgICAgICBwcmludChiICsgYywgZW5kPScnLCBmaWxlPXNlbGYuZmlsZSkKICAgICAgICAgICAgc2VsZi5fd2lkdGggPSBtYXgoc2VsZi5fd2lkdGgsIGxlbihzKSkKICAgICAgICAgICAgc2VsZi5maWxlLmZsdXNoKCkKCiAgICBkZWYgZmluaXNoKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZmlsZS5pc2F0dHkoKSBhbmQgc2VsZi5oaWRlX2N1cnNvcjoKICAgICAgICAgICAgcHJpbnQoU0hPV19DVVJTT1IsIGVuZD0nJywgZmlsZT1zZWxmLmZpbGUpCgoKY2xhc3MgV3JpdGVsbk1peGluKG9iamVjdCk6CiAgICBoaWRlX2N1cnNvciA9IEZhbHNlCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2U9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKFdyaXRlbG5NaXhpbiwgc2VsZikuX19pbml0X18oKiprd2FyZ3MpCiAgICAgICAgaWYgbWVzc2FnZToKICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQoKICAgICAgICBpZiBzZWxmLmZpbGUuaXNhdHR5KCkgYW5kIHNlbGYuaGlkZV9jdXJzb3I6CiAgICAgICAgICAgIHByaW50KEhJREVfQ1VSU09SLCBlbmQ9JycsIGZpbGU9c2VsZi5maWxlKQoKICAgIGRlZiBjbGVhcmxuKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZmlsZS5pc2F0dHkoKToKICAgICAgICAgICAgcHJpbnQoJ1xyXHgxYltLJywgZW5kPScnLCBmaWxlPXNlbGYuZmlsZSkKCiAgICBkZWYgd3JpdGVsbihzZWxmLCBsaW5lKToKICAgICAgICBpZiBzZWxmLmZpbGUuaXNhdHR5KCk6CiAgICAgICAgICAgIHNlbGYuY2xlYXJsbigpCiAgICAgICAgICAgIHByaW50KGxpbmUsIGVuZD0nJywgZmlsZT1zZWxmLmZpbGUpCiAgICAgICAgICAgIHNlbGYuZmlsZS5mbHVzaCgpCgogICAgZGVmIGZpbmlzaChzZWxmKToKICAgICAgICBpZiBzZWxmLmZpbGUuaXNhdHR5KCk6CiAgICAgICAgICAgIHByaW50KGZpbGU9c2VsZi5maWxlKQogICAgICAgICAgICBpZiBzZWxmLmhpZGVfY3Vyc29yOgogICAgICAgICAgICAgICAgcHJpbnQoU0hPV19DVVJTT1IsIGVuZD0nJywgZmlsZT1zZWxmLmZpbGUpCgoKZnJvbSBzaWduYWwgaW1wb3J0IHNpZ25hbCwgU0lHSU5UCmZyb20gc3lzIGltcG9ydCBleGl0CgoKY2xhc3MgU2lnSW50TWl4aW4ob2JqZWN0KToKICAgICIiIlJlZ2lzdGVycyBhIHNpZ25hbCBoYW5kbGVyIHRoYXQgY2FsbHMgZmluaXNoIG9uIFNJR0lOVCIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKFNpZ0ludE1peGluLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgc2lnbmFsKFNJR0lOVCwgc2VsZi5fc2lnaW50X2hhbmRsZXIpCgogICAgZGVmIF9zaWdpbnRfaGFuZGxlcihzZWxmLCBzaWdudW0sIGZyYW1lKToKICAgICAgICBzZWxmLmZpbmlzaCgpCiAgICAgICAgZXhpdCgwKQpQSwMEFAAAAAAAAAAhAHcIUnsiBQAAIgUAAC8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcHJvZ3Jlc3Mvc3Bpbm5lci5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgojIENvcHlyaWdodCAoYykgMjAxMiBHaW9yZ29zIFZlcmlnYWtpcyA8dmVyaWdha0BnbWFpbC5jb20+CiMKIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKIyBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCiMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KIwojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwojIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgojIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKIyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KIyBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgojIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCgpmcm9tIC4gaW1wb3J0IEluZmluaXRlCmZyb20gLmhlbHBlcnMgaW1wb3J0IFdyaXRlTWl4aW4KCgpjbGFzcyBTcGlubmVyKFdyaXRlTWl4aW4sIEluZmluaXRlKToKICAgIG1lc3NhZ2UgPSAnJwogICAgcGhhc2VzID0gKCctJywgJ1xcJywgJ3wnLCAnLycpCiAgICBoaWRlX2N1cnNvciA9IFRydWUKCiAgICBkZWYgdXBkYXRlKHNlbGYpOgogICAgICAgIGkgPSBzZWxmLmluZGV4ICUgbGVuKHNlbGYucGhhc2VzKQogICAgICAgIHNlbGYud3JpdGUoc2VsZi5waGFzZXNbaV0pCgoKY2xhc3MgUGllU3Bpbm5lcihTcGlubmVyKToKICAgIHBoYXNlcyA9IFt1J+KXtycsIHUn4pe2JywgdSfil7UnLCB1J+KXtCddCgoKY2xhc3MgTW9vblNwaW5uZXIoU3Bpbm5lcik6CiAgICBwaGFzZXMgPSBbdSfil5EnLCB1J+KXkicsIHUn4peQJywgdSfil5MnXQoKCmNsYXNzIExpbmVTcGlubmVyKFNwaW5uZXIpOgogICAgcGhhc2VzID0gW3Un4o66JywgdSfijrsnLCB1J+KOvCcsIHUn4o69JywgdSfijrwnLCB1J+KOuyddClBLAwQUAAAAAAAAACEAwSB0jqtrAwCrawMAKAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9weXBhcnNpbmcucHkjIG1vZHVsZSBweXBhcnNpbmcucHkKIwojIENvcHlyaWdodCAoYykgMjAwMy0yMDE2ICBQYXVsIFQuIE1jR3VpcmUKIwojIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwojIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQojICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKIyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiMgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiMgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiMgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgojCiMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKIyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KIwojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAojIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgojIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KIyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQojIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCiMgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKIyBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KIwoKX19kb2NfXyA9IFwKIiIiCnB5cGFyc2luZyBtb2R1bGUgLSBDbGFzc2VzIGFuZCBtZXRob2RzIHRvIGRlZmluZSBhbmQgZXhlY3V0ZSBwYXJzaW5nIGdyYW1tYXJzCgpUaGUgcHlwYXJzaW5nIG1vZHVsZSBpcyBhbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCB0byBjcmVhdGluZyBhbmQgZXhlY3V0aW5nIHNpbXBsZSBncmFtbWFycywKdnMuIHRoZSB0cmFkaXRpb25hbCBsZXgveWFjYyBhcHByb2FjaCwgb3IgdGhlIHVzZSBvZiByZWd1bGFyIGV4cHJlc3Npb25zLiAgV2l0aCBweXBhcnNpbmcsIHlvdQpkb24ndCBuZWVkIHRvIGxlYXJuIGEgbmV3IHN5bnRheCBmb3IgZGVmaW5pbmcgZ3JhbW1hcnMgb3IgbWF0Y2hpbmcgZXhwcmVzc2lvbnMgLSB0aGUgcGFyc2luZyBtb2R1bGUKcHJvdmlkZXMgYSBsaWJyYXJ5IG9mIGNsYXNzZXMgdGhhdCB5b3UgdXNlIHRvIGNvbnN0cnVjdCB0aGUgZ3JhbW1hciBkaXJlY3RseSBpbiBQeXRob24uCgpIZXJlIGlzIGEgcHJvZ3JhbSB0byBwYXJzZSAiSGVsbG8sIFdvcmxkISIgKG9yIGFueSBncmVldGluZyBvZiB0aGUgZm9ybSAKQ3siPHNhbHV0YXRpb24+LCA8YWRkcmVzc2VlPiEifSksIGJ1aWx0IHVwIHVzaW5nIEx7V29yZH0sIEx7TGl0ZXJhbH0sIGFuZCBMe0FuZH0gZWxlbWVudHMgCihMeycrJzxQYXJzZXJFbGVtZW50Ll9fYWRkX18+fSBvcGVyYXRvciBnaXZlcyBMe0FuZH0gZXhwcmVzc2lvbnMsIHN0cmluZ3MgYXJlIGF1dG8tY29udmVydGVkIHRvCkx7TGl0ZXJhbH0gZXhwcmVzc2lvbnMpOjoKCiAgICBmcm9tIHB5cGFyc2luZyBpbXBvcnQgV29yZCwgYWxwaGFzCgogICAgIyBkZWZpbmUgZ3JhbW1hciBvZiBhIGdyZWV0aW5nCiAgICBncmVldCA9IFdvcmQoYWxwaGFzKSArICIsIiArIFdvcmQoYWxwaGFzKSArICIhIgoKICAgIGhlbGxvID0gIkhlbGxvLCBXb3JsZCEiCiAgICBwcmludCAoaGVsbG8sICItPiIsIGdyZWV0LnBhcnNlU3RyaW5nKGhlbGxvKSkKClRoZSBwcm9ncmFtIG91dHB1dHMgdGhlIGZvbGxvd2luZzo6CgogICAgSGVsbG8sIFdvcmxkISAtPiBbJ0hlbGxvJywgJywnLCAnV29ybGQnLCAnISddCgpUaGUgUHl0aG9uIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBncmFtbWFyIGlzIHF1aXRlIHJlYWRhYmxlLCBvd2luZyB0byB0aGUgc2VsZi1leHBsYW5hdG9yeQpjbGFzcyBuYW1lcywgYW5kIHRoZSB1c2Ugb2YgJysnLCAnfCcgYW5kICdeJyBvcGVyYXRvcnMuCgpUaGUgTHtQYXJzZVJlc3VsdHN9IG9iamVjdCByZXR1cm5lZCBmcm9tIEx7UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZzxQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPn0gY2FuIGJlIGFjY2Vzc2VkIGFzIGEgbmVzdGVkIGxpc3QsIGEgZGljdGlvbmFyeSwgb3IgYW4Kb2JqZWN0IHdpdGggbmFtZWQgYXR0cmlidXRlcy4KClRoZSBweXBhcnNpbmcgbW9kdWxlIGhhbmRsZXMgc29tZSBvZiB0aGUgcHJvYmxlbXMgdGhhdCBhcmUgdHlwaWNhbGx5IHZleGluZyB3aGVuIHdyaXRpbmcgdGV4dCBwYXJzZXJzOgogLSBleHRyYSBvciBtaXNzaW5nIHdoaXRlc3BhY2UgKHRoZSBhYm92ZSBwcm9ncmFtIHdpbGwgYWxzbyBoYW5kbGUgIkhlbGxvLFdvcmxkISIsICJIZWxsbyAgLCAgV29ybGQgICEiLCBldGMuKQogLSBxdW90ZWQgc3RyaW5ncwogLSBlbWJlZGRlZCBjb21tZW50cwoiIiIKCl9fdmVyc2lvbl9fID0gIjIuMS4xMCIKX192ZXJzaW9uVGltZV9fID0gIjA3IE9jdCAyMDE2IDAxOjMxIFVUQyIKX19hdXRob3JfXyA9ICJQYXVsIE1jR3VpcmUgPHB0bWNnQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iCgppbXBvcnQgc3RyaW5nCmZyb20gd2Vha3JlZiBpbXBvcnQgcmVmIGFzIHdrcmVmCmltcG9ydCBjb3B5CmltcG9ydCBzeXMKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCByZQppbXBvcnQgc3JlX2NvbnN0YW50cwppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IHBwcmludAppbXBvcnQgdHJhY2ViYWNrCmltcG9ydCB0eXBlcwpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQoKdHJ5OgogICAgZnJvbSBfdGhyZWFkIGltcG9ydCBSTG9jawpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgUkxvY2sKCnRyeToKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0IGFzIF9PcmRlcmVkRGljdApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICB0cnk6CiAgICAgICAgZnJvbSBvcmRlcmVkZGljdCBpbXBvcnQgT3JkZXJlZERpY3QgYXMgX09yZGVyZWREaWN0CiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgX09yZGVyZWREaWN0ID0gTm9uZQoKI34gc3lzLnN0ZGVyci53cml0ZSggInRlc3RpbmcgcHlwYXJzaW5nIG1vZHVsZSwgdmVyc2lvbiAlcywgJXNcbiIgJSAoX192ZXJzaW9uX18sX192ZXJzaW9uVGltZV9fICkgKQoKX19hbGxfXyA9IFsKJ0FuZCcsICdDYXNlbGVzc0tleXdvcmQnLCAnQ2FzZWxlc3NMaXRlcmFsJywgJ0NoYXJzTm90SW4nLCAnQ29tYmluZScsICdEaWN0JywgJ0VhY2gnLCAnRW1wdHknLAonRm9sbG93ZWRCeScsICdGb3J3YXJkJywgJ0dvVG9Db2x1bW4nLCAnR3JvdXAnLCAnS2V5d29yZCcsICdMaW5lRW5kJywgJ0xpbmVTdGFydCcsICdMaXRlcmFsJywKJ01hdGNoRmlyc3QnLCAnTm9NYXRjaCcsICdOb3RBbnknLCAnT25lT3JNb3JlJywgJ09ubHlPbmNlJywgJ09wdGlvbmFsJywgJ09yJywKJ1BhcnNlQmFzZUV4Y2VwdGlvbicsICdQYXJzZUVsZW1lbnRFbmhhbmNlJywgJ1BhcnNlRXhjZXB0aW9uJywgJ1BhcnNlRXhwcmVzc2lvbicsICdQYXJzZUZhdGFsRXhjZXB0aW9uJywKJ1BhcnNlUmVzdWx0cycsICdQYXJzZVN5bnRheEV4Y2VwdGlvbicsICdQYXJzZXJFbGVtZW50JywgJ1F1b3RlZFN0cmluZycsICdSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uJywKJ1JlZ2V4JywgJ1NraXBUbycsICdTdHJpbmdFbmQnLCAnU3RyaW5nU3RhcnQnLCAnU3VwcHJlc3MnLCAnVG9rZW4nLCAnVG9rZW5Db252ZXJ0ZXInLCAKJ1doaXRlJywgJ1dvcmQnLCAnV29yZEVuZCcsICdXb3JkU3RhcnQnLCAnWmVyb09yTW9yZScsCidhbHBoYW51bXMnLCAnYWxwaGFzJywgJ2FscGhhczhiaXQnLCAnYW55Q2xvc2VUYWcnLCAnYW55T3BlblRhZycsICdjU3R5bGVDb21tZW50JywgJ2NvbCcsCidjb21tYVNlcGFyYXRlZExpc3QnLCAnY29tbW9uSFRNTEVudGl0eScsICdjb3VudGVkQXJyYXknLCAnY3BwU3R5bGVDb21tZW50JywgJ2RibFF1b3RlZFN0cmluZycsCidkYmxTbGFzaENvbW1lbnQnLCAnZGVsaW1pdGVkTGlzdCcsICdkaWN0T2YnLCAnZG93bmNhc2VUb2tlbnMnLCAnZW1wdHknLCAnaGV4bnVtcycsCidodG1sQ29tbWVudCcsICdqYXZhU3R5bGVDb21tZW50JywgJ2xpbmUnLCAnbGluZUVuZCcsICdsaW5lU3RhcnQnLCAnbGluZW5vJywKJ21ha2VIVE1MVGFncycsICdtYWtlWE1MVGFncycsICdtYXRjaE9ubHlBdENvbCcsICdtYXRjaFByZXZpb3VzRXhwcicsICdtYXRjaFByZXZpb3VzTGl0ZXJhbCcsCiduZXN0ZWRFeHByJywgJ251bGxEZWJ1Z0FjdGlvbicsICdudW1zJywgJ29uZU9mJywgJ29wQXNzb2MnLCAnb3BlcmF0b3JQcmVjZWRlbmNlJywgJ3ByaW50YWJsZXMnLAoncHVuYzhiaXQnLCAncHl0aG9uU3R5bGVDb21tZW50JywgJ3F1b3RlZFN0cmluZycsICdyZW1vdmVRdW90ZXMnLCAncmVwbGFjZUhUTUxFbnRpdHknLCAKJ3JlcGxhY2VXaXRoJywgJ3Jlc3RPZkxpbmUnLCAnc2dsUXVvdGVkU3RyaW5nJywgJ3NyYW5nZScsICdzdHJpbmdFbmQnLAonc3RyaW5nU3RhcnQnLCAndHJhY2VQYXJzZUFjdGlvbicsICd1bmljb2RlU3RyaW5nJywgJ3VwY2FzZVRva2VucycsICd3aXRoQXR0cmlidXRlJywKJ2luZGVudGVkQmxvY2snLCAnb3JpZ2luYWxUZXh0Rm9yJywgJ3VuZ3JvdXAnLCAnaW5maXhOb3RhdGlvbicsJ2xvY2F0ZWRFeHByJywgJ3dpdGhDbGFzcycsCidDbG9zZU1hdGNoJywgJ3Rva2VuTWFwJywgJ3B5cGFyc2luZ19jb21tb24nLApdCgpzeXN0ZW1fdmVyc2lvbiA9IHR1cGxlKHN5cy52ZXJzaW9uX2luZm8pWzozXQpQWV8zID0gc3lzdGVtX3ZlcnNpb25bMF0gPT0gMwppZiBQWV8zOgogICAgX01BWF9JTlQgPSBzeXMubWF4c2l6ZQogICAgYmFzZXN0cmluZyA9IHN0cgogICAgdW5pY2hyID0gY2hyCiAgICBfdXN0ciA9IHN0cgoKICAgICMgYnVpbGQgbGlzdCBvZiBzaW5nbGUgYXJnIGJ1aWx0aW5zLCB0aGF0IGNhbiBiZSB1c2VkIGFzIHBhcnNlIGFjdGlvbnMKICAgIHNpbmdsZUFyZ0J1aWx0aW5zID0gW3N1bSwgbGVuLCBzb3J0ZWQsIHJldmVyc2VkLCBsaXN0LCB0dXBsZSwgc2V0LCBhbnksIGFsbCwgbWluLCBtYXhdCgplbHNlOgogICAgX01BWF9JTlQgPSBzeXMubWF4aW50CiAgICByYW5nZSA9IHhyYW5nZQoKICAgIGRlZiBfdXN0cihvYmopOgogICAgICAgICIiIkRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIHN0cihvYmopIHRoYXQgdHJpZXMgdG8gYmUgVW5pY29kZSBmcmllbmRseS4gSXQgZmlyc3QgdHJpZXMKICAgICAgICAgICBzdHIob2JqKS4gSWYgdGhhdCBmYWlscyB3aXRoIGEgVW5pY29kZUVuY29kZUVycm9yLCB0aGVuIGl0IHRyaWVzIHVuaWNvZGUob2JqKS4gSXQKICAgICAgICAgICB0aGVuIDwgcmV0dXJucyB0aGUgdW5pY29kZSBvYmplY3QgfCBlbmNvZGVzIGl0IHdpdGggdGhlIGRlZmF1bHQgZW5jb2RpbmcgfCAuLi4gPi4KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKG9iaix1bmljb2RlKToKICAgICAgICAgICAgcmV0dXJuIG9iagoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgSWYgdGhpcyB3b3JrcywgdGhlbiBfdXN0cihvYmopIGhhcyB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgc3RyKG9iaiksIHNvCiAgICAgICAgICAgICMgaXQgd29uJ3QgYnJlYWsgYW55IGV4aXN0aW5nIGNvZGUuCiAgICAgICAgICAgIHJldHVybiBzdHIob2JqKQoKICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgICAgICAjIEVsc2UgZW5jb2RlIGl0CiAgICAgICAgICAgIHJldCA9IHVuaWNvZGUob2JqKS5lbmNvZGUoc3lzLmdldGRlZmF1bHRlbmNvZGluZygpLCAneG1sY2hhcnJlZnJlcGxhY2UnKQogICAgICAgICAgICB4bWxjaGFycmVmID0gUmVnZXgoJyYjXGQrOycpCiAgICAgICAgICAgIHhtbGNoYXJyZWYuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6ICdcXHUnICsgaGV4KGludCh0WzBdWzI6LTFdKSlbMjpdKQogICAgICAgICAgICByZXR1cm4geG1sY2hhcnJlZi50cmFuc2Zvcm1TdHJpbmcocmV0KQoKICAgICMgYnVpbGQgbGlzdCBvZiBzaW5nbGUgYXJnIGJ1aWx0aW5zLCB0b2xlcmFudCBvZiBQeXRob24gdmVyc2lvbiwgdGhhdCBjYW4gYmUgdXNlZCBhcyBwYXJzZSBhY3Rpb25zCiAgICBzaW5nbGVBcmdCdWlsdGlucyA9IFtdCiAgICBpbXBvcnQgX19idWlsdGluX18KICAgIGZvciBmbmFtZSBpbiAic3VtIGxlbiBzb3J0ZWQgcmV2ZXJzZWQgbGlzdCB0dXBsZSBzZXQgYW55IGFsbCBtaW4gbWF4Ii5zcGxpdCgpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2luZ2xlQXJnQnVpbHRpbnMuYXBwZW5kKGdldGF0dHIoX19idWlsdGluX18sZm5hbWUpKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgCl9nZW5lcmF0b3JUeXBlID0gdHlwZSgoeSBmb3IgeSBpbiByYW5nZSgxKSkpCiAKZGVmIF94bWxfZXNjYXBlKGRhdGEpOgogICAgIiIiRXNjYXBlICYsIDwsID4sICIsICcsIGV0Yy4gaW4gYSBzdHJpbmcgb2YgZGF0YS4iIiIKCiAgICAjIGFtcGVyc2FuZCBtdXN0IGJlIHJlcGxhY2VkIGZpcnN0CiAgICBmcm9tX3N5bWJvbHMgPSAnJj48IlwnJwogICAgdG9fc3ltYm9scyA9ICgnJicrcysnOycgZm9yIHMgaW4gImFtcCBndCBsdCBxdW90IGFwb3MiLnNwbGl0KCkpCiAgICBmb3IgZnJvbV8sdG9fIGluIHppcChmcm9tX3N5bWJvbHMsIHRvX3N5bWJvbHMpOgogICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoZnJvbV8sIHRvXykKICAgIHJldHVybiBkYXRhCgpjbGFzcyBfQ29uc3RhbnRzKG9iamVjdCk6CiAgICBwYXNzCgphbHBoYXMgICAgID0gc3RyaW5nLmFzY2lpX3VwcGVyY2FzZSArIHN0cmluZy5hc2NpaV9sb3dlcmNhc2UKbnVtcyAgICAgICA9ICIwMTIzNDU2Nzg5IgpoZXhudW1zICAgID0gbnVtcyArICJBQkNERUZhYmNkZWYiCmFscGhhbnVtcyAgPSBhbHBoYXMgKyBudW1zCl9ic2xhc2ggICAgPSBjaHIoOTIpCnByaW50YWJsZXMgPSAiIi5qb2luKGMgZm9yIGMgaW4gc3RyaW5nLnByaW50YWJsZSBpZiBjIG5vdCBpbiBzdHJpbmcud2hpdGVzcGFjZSkKCmNsYXNzIFBhcnNlQmFzZUV4Y2VwdGlvbihFeGNlcHRpb24pOgogICAgIiIiYmFzZSBleGNlcHRpb24gY2xhc3MgZm9yIGFsbCBwYXJzaW5nIHJ1bnRpbWUgZXhjZXB0aW9ucyIiIgogICAgIyBQZXJmb3JtYW5jZSB0dW5pbmc6IHdlIGNvbnN0cnVjdCBhICpsb3QqIG9mIHRoZXNlLCBzbyBrZWVwIHRoaXMKICAgICMgY29uc3RydWN0b3IgYXMgc21hbGwgYW5kIGZhc3QgYXMgcG9zc2libGUKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcHN0ciwgbG9jPTAsIG1zZz1Ob25lLCBlbGVtPU5vbmUgKToKICAgICAgICBzZWxmLmxvYyA9IGxvYwogICAgICAgIGlmIG1zZyBpcyBOb25lOgogICAgICAgICAgICBzZWxmLm1zZyA9IHBzdHIKICAgICAgICAgICAgc2VsZi5wc3RyID0gIiIKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1zZyA9IG1zZwogICAgICAgICAgICBzZWxmLnBzdHIgPSBwc3RyCiAgICAgICAgc2VsZi5wYXJzZXJFbGVtZW50ID0gZWxlbQogICAgICAgIHNlbGYuYXJncyA9IChwc3RyLCBsb2MsIG1zZykKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfZnJvbV9leGNlcHRpb24oY2xzLCBwZSk6CiAgICAgICAgIiIiCiAgICAgICAgaW50ZXJuYWwgZmFjdG9yeSBtZXRob2QgdG8gc2ltcGxpZnkgY3JlYXRpbmcgb25lIHR5cGUgb2YgUGFyc2VFeGNlcHRpb24gCiAgICAgICAgZnJvbSBhbm90aGVyIC0gYXZvaWRzIGhhdmluZyBfX2luaXRfXyBzaWduYXR1cmUgY29uZmxpY3RzIGFtb25nIHN1YmNsYXNzZXMKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gY2xzKHBlLnBzdHIsIHBlLmxvYywgcGUubXNnLCBwZS5wYXJzZXJFbGVtZW50KQoKICAgIGRlZiBfX2dldGF0dHJfXyggc2VsZiwgYW5hbWUgKToKICAgICAgICAiIiJzdXBwb3J0ZWQgYXR0cmlidXRlcyBieSBuYW1lIGFyZToKICAgICAgICAgICAgLSBsaW5lbm8gLSByZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQKICAgICAgICAgICAgLSBjb2wgLSByZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dAogICAgICAgICAgICAtIGxpbmUgLSByZXR1cm5zIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGV4Y2VwdGlvbiB0ZXh0CiAgICAgICAgIiIiCiAgICAgICAgaWYoIGFuYW1lID09ICJsaW5lbm8iICk6CiAgICAgICAgICAgIHJldHVybiBsaW5lbm8oIHNlbGYubG9jLCBzZWxmLnBzdHIgKQogICAgICAgIGVsaWYoIGFuYW1lIGluICgiY29sIiwgImNvbHVtbiIpICk6CiAgICAgICAgICAgIHJldHVybiBjb2woIHNlbGYubG9jLCBzZWxmLnBzdHIgKQogICAgICAgIGVsaWYoIGFuYW1lID09ICJsaW5lIiApOgogICAgICAgICAgICByZXR1cm4gbGluZSggc2VsZi5sb2MsIHNlbGYucHN0ciApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoYW5hbWUpCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICByZXR1cm4gIiVzIChhdCBjaGFyICVkKSwgKGxpbmU6JWQsIGNvbDolZCkiICUgXAogICAgICAgICAgICAgICAgKCBzZWxmLm1zZywgc2VsZi5sb2MsIHNlbGYubGluZW5vLCBzZWxmLmNvbHVtbiApCiAgICBkZWYgX19yZXByX18oIHNlbGYgKToKICAgICAgICByZXR1cm4gX3VzdHIoc2VsZikKICAgIGRlZiBtYXJrSW5wdXRsaW5lKCBzZWxmLCBtYXJrZXJTdHJpbmcgPSAiPiE8IiApOgogICAgICAgICIiIkV4dHJhY3RzIHRoZSBleGNlcHRpb24gbGluZSBmcm9tIHRoZSBpbnB1dCBzdHJpbmcsIGFuZCBtYXJrcwogICAgICAgICAgIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXhjZXB0aW9uIHdpdGggYSBzcGVjaWFsIHN5bWJvbC4KICAgICAgICAiIiIKICAgICAgICBsaW5lX3N0ciA9IHNlbGYubGluZQogICAgICAgIGxpbmVfY29sdW1uID0gc2VsZi5jb2x1bW4gLSAxCiAgICAgICAgaWYgbWFya2VyU3RyaW5nOgogICAgICAgICAgICBsaW5lX3N0ciA9ICIiLmpvaW4oKGxpbmVfc3RyWzpsaW5lX2NvbHVtbl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyU3RyaW5nLCBsaW5lX3N0cltsaW5lX2NvbHVtbjpdKSkKICAgICAgICByZXR1cm4gbGluZV9zdHIuc3RyaXAoKQogICAgZGVmIF9fZGlyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJsaW5lbm8gY29sIGxpbmUiLnNwbGl0KCkgKyBkaXIodHlwZShzZWxmKSkKCmNsYXNzIFBhcnNlRXhjZXB0aW9uKFBhcnNlQmFzZUV4Y2VwdGlvbik6CiAgICAiIiIKICAgIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBwYXJzZSBleHByZXNzaW9ucyBkb24ndCBtYXRjaCBjbGFzczsKICAgIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGJ5IG5hbWUgYXJlOgogICAgIC0gbGluZW5vIC0gcmV0dXJucyB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0CiAgICAgLSBjb2wgLSByZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dAogICAgIC0gbGluZSAtIHJldHVybnMgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uIHRleHQKICAgICAgICAKICAgIEV4YW1wbGU6OgogICAgICAgIHRyeToKICAgICAgICAgICAgV29yZChudW1zKS5zZXROYW1lKCJpbnRlZ2VyIikucGFyc2VTdHJpbmcoIkFCQyIpCiAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIHBlOgogICAgICAgICAgICBwcmludChwZSkKICAgICAgICAgICAgcHJpbnQoImNvbHVtbjoge30iLmZvcm1hdChwZS5jb2wpKQogICAgICAgICAgICAKICAgIHByaW50czo6CiAgICAgICBFeHBlY3RlZCBpbnRlZ2VyIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkKICAgICAgICBjb2x1bW46IDEKICAgICIiIgogICAgcGFzcwoKY2xhc3MgUGFyc2VGYXRhbEV4Y2VwdGlvbihQYXJzZUJhc2VFeGNlcHRpb24pOgogICAgIiIidXNlci10aHJvd2FibGUgZXhjZXB0aW9uIHRocm93biB3aGVuIGluY29uc2lzdGVudCBwYXJzZSBjb250ZW50CiAgICAgICBpcyBmb3VuZDsgc3RvcHMgYWxsIHBhcnNpbmcgaW1tZWRpYXRlbHkiIiIKICAgIHBhc3MKCmNsYXNzIFBhcnNlU3ludGF4RXhjZXB0aW9uKFBhcnNlRmF0YWxFeGNlcHRpb24pOgogICAgIiIianVzdCBsaWtlIEx7UGFyc2VGYXRhbEV4Y2VwdGlvbn0sIGJ1dCB0aHJvd24gaW50ZXJuYWxseSB3aGVuIGFuCiAgICAgICBMe0Vycm9yU3RvcDxBbmQuX0Vycm9yU3RvcD59ICgnLScgb3BlcmF0b3IpIGluZGljYXRlcyB0aGF0IHBhcnNpbmcgaXMgdG8gc3RvcCAKICAgICAgIGltbWVkaWF0ZWx5IGJlY2F1c2UgYW4gdW5iYWNrdHJhY2thYmxlIHN5bnRheCBlcnJvciBoYXMgYmVlbiBmb3VuZCIiIgogICAgcGFzcwoKI34gY2xhc3MgUmVwYXJzZUV4Y2VwdGlvbihQYXJzZUJhc2VFeGNlcHRpb24pOgogICAgI34gIiIiRXhwZXJpbWVudGFsIGNsYXNzIC0gcGFyc2UgYWN0aW9ucyBjYW4gcmFpc2UgdGhpcyBleGNlcHRpb24gdG8gY2F1c2UKICAgICAgICN+IHB5cGFyc2luZyB0byByZXBhcnNlIHRoZSBpbnB1dCBzdHJpbmc6CiAgICAgICAgI34gLSB3aXRoIGEgbW9kaWZpZWQgaW5wdXQgc3RyaW5nLCBhbmQvb3IKICAgICAgICAjfiAtIHdpdGggYSBtb2RpZmllZCBzdGFydCBsb2NhdGlvbgogICAgICAgI34gU2V0IHRoZSB2YWx1ZXMgb2YgdGhlIFJlcGFyc2VFeGNlcHRpb24gaW4gdGhlIGNvbnN0cnVjdG9yLCBhbmQgcmFpc2UgdGhlCiAgICAgICAjfiBleGNlcHRpb24gaW4gYSBwYXJzZSBhY3Rpb24gdG8gY2F1c2UgcHlwYXJzaW5nIHRvIHVzZSB0aGUgbmV3IHN0cmluZy9sb2NhdGlvbi4KICAgICAgICN+IFNldHRpbmcgdGhlIHZhbHVlcyBhcyBOb25lIGNhdXNlcyBubyBjaGFuZ2UgdG8gYmUgbWFkZS4KICAgICAgICN+ICIiIgogICAgI34gZGVmIF9faW5pdF8oIHNlbGYsIG5ld3N0cmluZywgcmVzdGFydExvYyApOgogICAgICAgICN+IHNlbGYubmV3UGFyc2VUZXh0ID0gbmV3c3RyaW5nCiAgICAgICAgI34gc2VsZi5yZXBhcnNlTG9jID0gcmVzdGFydExvYwoKY2xhc3MgUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbihFeGNlcHRpb24pOgogICAgIiIiZXhjZXB0aW9uIHRocm93biBieSBMe1BhcnNlckVsZW1lbnQudmFsaWRhdGV9IGlmIHRoZSBncmFtbWFyIGNvdWxkIGJlIGltcHJvcGVybHkgcmVjdXJzaXZlIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToKICAgICAgICBzZWxmLnBhcnNlRWxlbWVudFRyYWNlID0gcGFyc2VFbGVtZW50TGlzdAoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgcmV0dXJuICJSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uOiAlcyIgJSBzZWxmLnBhcnNlRWxlbWVudFRyYWNlCgpjbGFzcyBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYscDEscDIpOgogICAgICAgIHNlbGYudHVwID0gKHAxLHAyKQogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsaSk6CiAgICAgICAgcmV0dXJuIHNlbGYudHVwW2ldCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHJlcHIoc2VsZi50dXBbMF0pCiAgICBkZWYgc2V0T2Zmc2V0KHNlbGYsaSk6CiAgICAgICAgc2VsZi50dXAgPSAoc2VsZi50dXBbMF0saSkKCmNsYXNzIFBhcnNlUmVzdWx0cyhvYmplY3QpOgogICAgIiIiCiAgICBTdHJ1Y3R1cmVkIHBhcnNlIHJlc3VsdHMsIHRvIHByb3ZpZGUgbXVsdGlwbGUgbWVhbnMgb2YgYWNjZXNzIHRvIHRoZSBwYXJzZWQgZGF0YToKICAgICAgIC0gYXMgYSBsaXN0IChDe2xlbihyZXN1bHRzKX0pCiAgICAgICAtIGJ5IGxpc3QgaW5kZXggKEN7cmVzdWx0c1swXSwgcmVzdWx0c1sxXX0sIGV0Yy4pCiAgICAgICAtIGJ5IGF0dHJpYnV0ZSAoQ3tyZXN1bHRzLjxyZXN1bHRzTmFtZT59IC0gc2VlIEx7UGFyc2VyRWxlbWVudC5zZXRSZXN1bHRzTmFtZX0pCgogICAgRXhhbXBsZTo6CiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykKICAgICAgICBkYXRlX3N0ciA9IChpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJ5ZWFyIikgKyAnLycgCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgibW9udGgiKSArICcvJyAKICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJkYXkiKSkKICAgICAgICAjIGVxdWl2YWxlbnQgZm9ybToKICAgICAgICAjIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpCgogICAgICAgICMgcGFyc2VTdHJpbmcgcmV0dXJucyBhIFBhcnNlUmVzdWx0cyBvYmplY3QKICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpCgogICAgICAgIGRlZiB0ZXN0KHMsIGZuPXJlcHIpOgogICAgICAgICAgICBwcmludCgiJXMgLT4gJXMiICUgKHMsIGZuKGV2YWwocykpKSkKICAgICAgICB0ZXN0KCJsaXN0KHJlc3VsdCkiKQogICAgICAgIHRlc3QoInJlc3VsdFswXSIpCiAgICAgICAgdGVzdCgicmVzdWx0Wydtb250aCddIikKICAgICAgICB0ZXN0KCJyZXN1bHQuZGF5IikKICAgICAgICB0ZXN0KCInbW9udGgnIGluIHJlc3VsdCIpCiAgICAgICAgdGVzdCgiJ21pbnV0ZXMnIGluIHJlc3VsdCIpCiAgICAgICAgdGVzdCgicmVzdWx0LmR1bXAoKSIsIHN0cikKICAgIHByaW50czo6CiAgICAgICAgbGlzdChyZXN1bHQpIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQogICAgICAgIHJlc3VsdFswXSAtPiAnMTk5OScKICAgICAgICByZXN1bHRbJ21vbnRoJ10gLT4gJzEyJwogICAgICAgIHJlc3VsdC5kYXkgLT4gJzMxJwogICAgICAgICdtb250aCcgaW4gcmVzdWx0IC0+IFRydWUKICAgICAgICAnbWludXRlcycgaW4gcmVzdWx0IC0+IEZhbHNlCiAgICAgICAgcmVzdWx0LmR1bXAoKSAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10KICAgICAgICAtIGRheTogMzEKICAgICAgICAtIG1vbnRoOiAxMgogICAgICAgIC0geWVhcjogMTk5OQogICAgIiIiCiAgICBkZWYgX19uZXdfXyhjbHMsIHRva2xpc3Q9Tm9uZSwgbmFtZT1Ob25lLCBhc0xpc3Q9VHJ1ZSwgbW9kYWw9VHJ1ZSApOgogICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCwgY2xzKToKICAgICAgICAgICAgcmV0dXJuIHRva2xpc3QKICAgICAgICByZXRvYmogPSBvYmplY3QuX19uZXdfXyhjbHMpCiAgICAgICAgcmV0b2JqLl9fZG9pbml0ID0gVHJ1ZQogICAgICAgIHJldHVybiByZXRvYmoKCiAgICAjIFBlcmZvcm1hbmNlIHR1bmluZzogd2UgY29uc3RydWN0IGEgKmxvdCogb2YgdGhlc2UsIHNvIGtlZXAgdGhpcwogICAgIyBjb25zdHJ1Y3RvciBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCB0b2tsaXN0PU5vbmUsIG5hbWU9Tm9uZSwgYXNMaXN0PVRydWUsIG1vZGFsPVRydWUsIGlzaW5zdGFuY2U9aXNpbnN0YW5jZSApOgogICAgICAgIGlmIHNlbGYuX19kb2luaXQ6CiAgICAgICAgICAgIHNlbGYuX19kb2luaXQgPSBGYWxzZQogICAgICAgICAgICBzZWxmLl9fbmFtZSA9IE5vbmUKICAgICAgICAgICAgc2VsZi5fX3BhcmVudCA9IE5vbmUKICAgICAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMgPSB7fQogICAgICAgICAgICBzZWxmLl9fYXNMaXN0ID0gYXNMaXN0CiAgICAgICAgICAgIHNlbGYuX19tb2RhbCA9IG1vZGFsCiAgICAgICAgICAgIGlmIHRva2xpc3QgaXMgTm9uZToKICAgICAgICAgICAgICAgIHRva2xpc3QgPSBbXQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsIGxpc3QpOgogICAgICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSB0b2tsaXN0WzpdCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh0b2tsaXN0LCBfZ2VuZXJhdG9yVHlwZSk6CiAgICAgICAgICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IGxpc3QodG9rbGlzdCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX190b2tsaXN0ID0gW3Rva2xpc3RdCiAgICAgICAgICAgIHNlbGYuX190b2tkaWN0ID0gZGljdCgpCgogICAgICAgIGlmIG5hbWUgaXMgbm90IE5vbmUgYW5kIG5hbWU6CiAgICAgICAgICAgIGlmIG5vdCBtb2RhbDoKICAgICAgICAgICAgICAgIHNlbGYuX19hY2N1bU5hbWVzW25hbWVdID0gMAogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWUsaW50KToKICAgICAgICAgICAgICAgIG5hbWUgPSBfdXN0cihuYW1lKSAjIHdpbGwgYWx3YXlzIHJldHVybiBhIHN0ciwgYnV0IHVzZSBfdXN0ciBmb3IgY29uc2lzdGVuY3kKICAgICAgICAgICAgc2VsZi5fX25hbWUgPSBuYW1lCiAgICAgICAgICAgIGlmIG5vdCAoaXNpbnN0YW5jZSh0b2tsaXN0LCAodHlwZShOb25lKSwgYmFzZXN0cmluZywgbGlzdCkpIGFuZCB0b2tsaXN0IGluIChOb25lLCcnLFtdKSk6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsYmFzZXN0cmluZyk6CiAgICAgICAgICAgICAgICAgICAgdG9rbGlzdCA9IFsgdG9rbGlzdCBdCiAgICAgICAgICAgICAgICBpZiBhc0xpc3Q6CiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LFBhcnNlUmVzdWx0cyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh0b2tsaXN0LmNvcHkoKSwwKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChQYXJzZVJlc3VsdHModG9rbGlzdFswXSksMCkKICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdLl9fbmFtZSA9IG5hbWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gdG9rbGlzdFswXQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCAoS2V5RXJyb3IsVHlwZUVycm9yLEluZGV4RXJyb3IpOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gdG9rbGlzdAoKICAgIGRlZiBfX2dldGl0ZW1fXyggc2VsZiwgaSApOgogICAgICAgIGlmIGlzaW5zdGFuY2UoIGksIChpbnQsc2xpY2UpICk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rbGlzdFtpXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGkgbm90IGluIHNlbGYuX19hY2N1bU5hbWVzOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tkaWN0W2ldWy0xXVswXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlUmVzdWx0cyhbIHZbMF0gZm9yIHYgaW4gc2VsZi5fX3Rva2RpY3RbaV0gXSkKCiAgICBkZWYgX19zZXRpdGVtX18oIHNlbGYsIGssIHYsIGlzaW5zdGFuY2U9aXNpbnN0YW5jZSApOgogICAgICAgIGlmIGlzaW5zdGFuY2UodixfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCk6CiAgICAgICAgICAgIHNlbGYuX190b2tkaWN0W2tdID0gc2VsZi5fX3Rva2RpY3QuZ2V0KGssbGlzdCgpKSArIFt2XQogICAgICAgICAgICBzdWIgPSB2WzBdCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGssKGludCxzbGljZSkpOgogICAgICAgICAgICBzZWxmLl9fdG9rbGlzdFtrXSA9IHYKICAgICAgICAgICAgc3ViID0gdgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX190b2tkaWN0W2tdID0gc2VsZi5fX3Rva2RpY3QuZ2V0KGssbGlzdCgpKSArIFtfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2LDApXQogICAgICAgICAgICBzdWIgPSB2CiAgICAgICAgaWYgaXNpbnN0YW5jZShzdWIsUGFyc2VSZXN1bHRzKToKICAgICAgICAgICAgc3ViLl9fcGFyZW50ID0gd2tyZWYoc2VsZikKCiAgICBkZWYgX19kZWxpdGVtX18oIHNlbGYsIGkgKToKICAgICAgICBpZiBpc2luc3RhbmNlKGksKGludCxzbGljZSkpOgogICAgICAgICAgICBteWxlbiA9IGxlbiggc2VsZi5fX3Rva2xpc3QgKQogICAgICAgICAgICBkZWwgc2VsZi5fX3Rva2xpc3RbaV0KCiAgICAgICAgICAgICMgY29udmVydCBpbnQgdG8gc2xpY2UKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpLCBpbnQpOgogICAgICAgICAgICAgICAgaWYgaSA8IDA6CiAgICAgICAgICAgICAgICAgICAgaSArPSBteWxlbgogICAgICAgICAgICAgICAgaSA9IHNsaWNlKGksIGkrMSkKICAgICAgICAgICAgIyBnZXQgcmVtb3ZlZCBpbmRpY2VzCiAgICAgICAgICAgIHJlbW92ZWQgPSBsaXN0KHJhbmdlKCppLmluZGljZXMobXlsZW4pKSkKICAgICAgICAgICAgcmVtb3ZlZC5yZXZlcnNlKCkKICAgICAgICAgICAgIyBmaXh1cCBpbmRpY2VzIGluIHRva2VuIGRpY3Rpb25hcnkKICAgICAgICAgICAgZm9yIG5hbWUsb2NjdXJyZW5jZXMgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKToKICAgICAgICAgICAgICAgIGZvciBqIGluIHJlbW92ZWQ6CiAgICAgICAgICAgICAgICAgICAgZm9yIGssICh2YWx1ZSwgcG9zaXRpb24pIGluIGVudW1lcmF0ZShvY2N1cnJlbmNlcyk6CiAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVuY2VzW2tdID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodmFsdWUsIHBvc2l0aW9uIC0gKHBvc2l0aW9uID4gaikpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGVsIHNlbGYuX190b2tkaWN0W2ldCgogICAgZGVmIF9fY29udGFpbnNfXyggc2VsZiwgayApOgogICAgICAgIHJldHVybiBrIGluIHNlbGYuX190b2tkaWN0CgogICAgZGVmIF9fbGVuX18oIHNlbGYgKTogcmV0dXJuIGxlbiggc2VsZi5fX3Rva2xpc3QgKQogICAgZGVmIF9fYm9vbF9fKHNlbGYpOiByZXR1cm4gKCBub3Qgbm90IHNlbGYuX190b2tsaXN0ICkKICAgIF9fbm9uemVyb19fID0gX19ib29sX18KICAgIGRlZiBfX2l0ZXJfXyggc2VsZiApOiByZXR1cm4gaXRlciggc2VsZi5fX3Rva2xpc3QgKQogICAgZGVmIF9fcmV2ZXJzZWRfXyggc2VsZiApOiByZXR1cm4gaXRlciggc2VsZi5fX3Rva2xpc3RbOjotMV0gKQogICAgZGVmIF9pdGVya2V5cyggc2VsZiApOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZi5fX3Rva2RpY3QsICJpdGVya2V5cyIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2RpY3QuaXRlcmtleXMoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBpdGVyKHNlbGYuX190b2tkaWN0KQoKICAgIGRlZiBfaXRlcnZhbHVlcyggc2VsZiApOgogICAgICAgIHJldHVybiAoc2VsZltrXSBmb3IgayBpbiBzZWxmLl9pdGVya2V5cygpKQogICAgICAgICAgICAKICAgIGRlZiBfaXRlcml0ZW1zKCBzZWxmICk6CiAgICAgICAgcmV0dXJuICgoaywgc2VsZltrXSkgZm9yIGsgaW4gc2VsZi5faXRlcmtleXMoKSkKCiAgICBpZiBQWV8zOgogICAgICAgIGtleXMgPSBfaXRlcmtleXMgICAgICAgCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleXMgKFB5dGhvbiAzLnggb25seSkuIiIiCgogICAgICAgIHZhbHVlcyA9IF9pdGVydmFsdWVzCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IHZhbHVlcyAoUHl0aG9uIDMueCBvbmx5KS4iIiIKCiAgICAgICAgaXRlbXMgPSBfaXRlcml0ZW1zCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleS12YWx1ZSB0dXBsZXMgKFB5dGhvbiAzLnggb25seSkuIiIiCgogICAgZWxzZToKICAgICAgICBpdGVya2V5cyA9IF9pdGVya2V5cwogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXlzIChQeXRob24gMi54IG9ubHkpLiIiIgoKICAgICAgICBpdGVydmFsdWVzID0gX2l0ZXJ2YWx1ZXMKICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQgdmFsdWVzIChQeXRob24gMi54IG9ubHkpLiIiIgoKICAgICAgICBpdGVyaXRlbXMgPSBfaXRlcml0ZW1zCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleS12YWx1ZSB0dXBsZXMgKFB5dGhvbiAyLnggb25seSkuIiIiCgogICAgICAgIGRlZiBrZXlzKCBzZWxmICk6CiAgICAgICAgICAgICIiIlJldHVybnMgYWxsIG5hbWVkIHJlc3VsdCBrZXlzIChhcyBhIGxpc3QgaW4gUHl0aG9uIDIueCwgYXMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMueCkuIiIiCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcmtleXMoKSkKCiAgICAgICAgZGVmIHZhbHVlcyggc2VsZiApOgogICAgICAgICAgICAiIiJSZXR1cm5zIGFsbCBuYW1lZCByZXN1bHQgdmFsdWVzIChhcyBhIGxpc3QgaW4gUHl0aG9uIDIueCwgYXMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMueCkuIiIiCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcnZhbHVlcygpKQogICAgICAgICAgICAgICAgCiAgICAgICAgZGVmIGl0ZW1zKCBzZWxmICk6CiAgICAgICAgICAgICIiIlJldHVybnMgYWxsIG5hbWVkIHJlc3VsdCBrZXktdmFsdWVzIChhcyBhIGxpc3Qgb2YgdHVwbGVzIGluIFB5dGhvbiAyLngsIGFzIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAzLngpLiIiIgogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJpdGVtcygpKQoKICAgIGRlZiBoYXNrZXlzKCBzZWxmICk6CiAgICAgICAgIiIiU2luY2Uga2V5cygpIHJldHVybnMgYW4gaXRlcmF0b3IsIHRoaXMgbWV0aG9kIGlzIGhlbHBmdWwgaW4gYnlwYXNzaW5nCiAgICAgICAgICAgY29kZSB0aGF0IGxvb2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFueSBkZWZpbmVkIHJlc3VsdHMgbmFtZXMuIiIiCiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fX3Rva2RpY3QpCiAgICAgICAgCiAgICBkZWYgcG9wKCBzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIFJlbW92ZXMgYW5kIHJldHVybnMgaXRlbSBhdCBzcGVjaWZpZWQgaW5kZXggKGRlZmF1bHQ9Q3tsYXN0fSkuCiAgICAgICAgU3VwcG9ydHMgYm90aCBDe2xpc3R9IGFuZCBDe2RpY3R9IHNlbWFudGljcyBmb3IgQ3twb3AoKX0uIElmIHBhc3NlZCBubwogICAgICAgIGFyZ3VtZW50IG9yIGFuIGludGVnZXIgYXJndW1lbnQsIGl0IHdpbGwgdXNlIEN7bGlzdH0gc2VtYW50aWNzCiAgICAgICAgYW5kIHBvcCB0b2tlbnMgZnJvbSB0aGUgbGlzdCBvZiBwYXJzZWQgdG9rZW5zLiBJZiBwYXNzZWQgYSAKICAgICAgICBub24taW50ZWdlciBhcmd1bWVudCAobW9zdCBsaWtlbHkgYSBzdHJpbmcpLCBpdCB3aWxsIHVzZSBDe2RpY3R9CiAgICAgICAgc2VtYW50aWNzIGFuZCBwb3AgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgZnJvbSBhbnkgZGVmaW5lZCAKICAgICAgICByZXN1bHRzIG5hbWVzLiBBIHNlY29uZCBkZWZhdWx0IHJldHVybiB2YWx1ZSBhcmd1bWVudCBpcyAKICAgICAgICBzdXBwb3J0ZWQsIGp1c3QgYXMgaW4gQ3tkaWN0LnBvcCgpfS4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGRlZiByZW1vdmVfZmlyc3QodG9rZW5zKToKICAgICAgICAgICAgICAgIHRva2Vucy5wb3AoMCkKICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMSddCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5hZGRQYXJzZUFjdGlvbihyZW1vdmVfZmlyc3QpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzEyMycsICczMjEnXQoKICAgICAgICAgICAgbGFiZWwgPSBXb3JkKGFscGhhcykKICAgICAgICAgICAgcGF0dCA9IGxhYmVsKCJMQUJFTCIpICsgT25lT3JNb3JlKFdvcmQobnVtcykpCiAgICAgICAgICAgIHByaW50KHBhdHQucGFyc2VTdHJpbmcoIkFBQiAxMjMgMzIxIikuZHVtcCgpKQoKICAgICAgICAgICAgIyBVc2UgcG9wKCkgaW4gYSBwYXJzZSBhY3Rpb24gdG8gcmVtb3ZlIG5hbWVkIHJlc3VsdCAobm90ZSB0aGF0IGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMgbm90CiAgICAgICAgICAgICMgcmVtb3ZlZCBmcm9tIGxpc3QgZm9ybSBvZiByZXN1bHRzKQogICAgICAgICAgICBkZWYgcmVtb3ZlX0xBQkVMKHRva2Vucyk6CiAgICAgICAgICAgICAgICB0b2tlbnMucG9wKCJMQUJFTCIpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5zCiAgICAgICAgICAgIHBhdHQuYWRkUGFyc2VBY3Rpb24ocmVtb3ZlX0xBQkVMKQogICAgICAgICAgICBwcmludChwYXR0LnBhcnNlU3RyaW5nKCJBQUIgMTIzIDMyMSIpLmR1bXAoKSkKICAgICAgICBwcmludHM6OgogICAgICAgICAgICBbJ0FBQicsICcxMjMnLCAnMzIxJ10KICAgICAgICAgICAgLSBMQUJFTDogQUFCCgogICAgICAgICAgICBbJ0FBQicsICcxMjMnLCAnMzIxJ10KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgYXJnczoKICAgICAgICAgICAgYXJncyA9IFstMV0KICAgICAgICBmb3Igayx2IGluIGt3YXJncy5pdGVtcygpOgogICAgICAgICAgICBpZiBrID09ICdkZWZhdWx0JzoKICAgICAgICAgICAgICAgIGFyZ3MgPSAoYXJnc1swXSwgdikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigicG9wKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnJXMnIiAlIGspCiAgICAgICAgaWYgKGlzaW5zdGFuY2UoYXJnc1swXSwgaW50KSBvciAKICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGFyZ3MpID09IDEgb3IgCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMF0gaW4gc2VsZik6CiAgICAgICAgICAgIGluZGV4ID0gYXJnc1swXQogICAgICAgICAgICByZXQgPSBzZWxmW2luZGV4XQogICAgICAgICAgICBkZWwgc2VsZltpbmRleF0KICAgICAgICAgICAgcmV0dXJuIHJldAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRlZmF1bHR2YWx1ZSA9IGFyZ3NbMV0KICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHR2YWx1ZQoKICAgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0VmFsdWU9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBuYW1lZCByZXN1bHQgbWF0Y2hpbmcgdGhlIGdpdmVuIGtleSwgb3IgaWYgdGhlcmUgaXMgbm8KICAgICAgICBzdWNoIG5hbWUsIHRoZW4gcmV0dXJucyB0aGUgZ2l2ZW4gQ3tkZWZhdWx0VmFsdWV9IG9yIEN7Tm9uZX0gaWYgbm8KICAgICAgICBDe2RlZmF1bHRWYWx1ZX0gaXMgc3BlY2lmaWVkLgoKICAgICAgICBTaW1pbGFyIHRvIEN7ZGljdC5nZXQoKX0uCiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpICAgICAgICAgICAKCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikKICAgICAgICAgICAgcHJpbnQocmVzdWx0LmdldCgieWVhciIpKSAjIC0+ICcxOTk5JwogICAgICAgICAgICBwcmludChyZXN1bHQuZ2V0KCJob3VyIiwgIm5vdCBzcGVjaWZpZWQiKSkgIyAtPiAnbm90IHNwZWNpZmllZCcKICAgICAgICAgICAgcHJpbnQocmVzdWx0LmdldCgiaG91ciIpKSAjIC0+IE5vbmUKICAgICAgICAiIiIKICAgICAgICBpZiBrZXkgaW4gc2VsZjoKICAgICAgICAgICAgcmV0dXJuIHNlbGZba2V5XQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWUKCiAgICBkZWYgaW5zZXJ0KCBzZWxmLCBpbmRleCwgaW5zU3RyICk6CiAgICAgICAgIiIiCiAgICAgICAgSW5zZXJ0cyBuZXcgZWxlbWVudCBhdCBsb2NhdGlvbiBpbmRleCBpbiB0aGUgbGlzdCBvZiBwYXJzZWQgdG9rZW5zLgogICAgICAgIAogICAgICAgIFNpbWlsYXIgdG8gQ3tsaXN0Lmluc2VydCgpfS4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnXQoKICAgICAgICAgICAgIyB1c2UgYSBwYXJzZSBhY3Rpb24gdG8gaW5zZXJ0IHRoZSBwYXJzZSBsb2NhdGlvbiBpbiB0aGUgZnJvbnQgb2YgdGhlIHBhcnNlZCByZXN1bHRzCiAgICAgICAgICAgIGRlZiBpbnNlcnRfbG9jbihsb2NuLCB0b2tlbnMpOgogICAgICAgICAgICAgICAgdG9rZW5zLmluc2VydCgwLCBsb2NuKQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkuYWRkUGFyc2VBY3Rpb24oaW5zZXJ0X2xvY24pLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbMCwgJzAnLCAnMTIzJywgJzMyMSddCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fX3Rva2xpc3QuaW5zZXJ0KGluZGV4LCBpbnNTdHIpCiAgICAgICAgIyBmaXh1cCBpbmRpY2VzIGluIHRva2VuIGRpY3Rpb25hcnkKICAgICAgICBmb3IgbmFtZSxvY2N1cnJlbmNlcyBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpOgogICAgICAgICAgICBmb3IgaywgKHZhbHVlLCBwb3NpdGlvbikgaW4gZW51bWVyYXRlKG9jY3VycmVuY2VzKToKICAgICAgICAgICAgICAgIG9jY3VycmVuY2VzW2tdID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodmFsdWUsIHBvc2l0aW9uICsgKHBvc2l0aW9uID4gaW5kZXgpKQoKICAgIGRlZiBhcHBlbmQoIHNlbGYsIGl0ZW0gKToKICAgICAgICAiIiIKICAgICAgICBBZGQgc2luZ2xlIGVsZW1lbnQgdG8gZW5kIG9mIFBhcnNlUmVzdWx0cyBsaXN0IG9mIGVsZW1lbnRzLgoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMSddCiAgICAgICAgICAgIAogICAgICAgICAgICAjIHVzZSBhIHBhcnNlIGFjdGlvbiB0byBjb21wdXRlIHRoZSBzdW0gb2YgdGhlIHBhcnNlZCBpbnRlZ2VycywgYW5kIGFkZCBpdCB0byB0aGUgZW5kCiAgICAgICAgICAgIGRlZiBhcHBlbmRfc3VtKHRva2Vucyk6CiAgICAgICAgICAgICAgICB0b2tlbnMuYXBwZW5kKHN1bShtYXAoaW50LCB0b2tlbnMpKSkKICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLmFkZFBhcnNlQWN0aW9uKGFwcGVuZF9zdW0pLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMScsIDQ0NF0KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9fdG9rbGlzdC5hcHBlbmQoaXRlbSkKCiAgICBkZWYgZXh0ZW5kKCBzZWxmLCBpdGVtc2VxICk6CiAgICAgICAgIiIiCiAgICAgICAgQWRkIHNlcXVlbmNlIG9mIGVsZW1lbnRzIHRvIGVuZCBvZiBQYXJzZVJlc3VsdHMgbGlzdCBvZiBlbGVtZW50cy4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIHBhdHQgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQogICAgICAgICAgICAKICAgICAgICAgICAgIyB1c2UgYSBwYXJzZSBhY3Rpb24gdG8gYXBwZW5kIHRoZSByZXZlcnNlIG9mIHRoZSBtYXRjaGVkIHN0cmluZ3MsIHRvIG1ha2UgYSBwYWxpbmRyb21lCiAgICAgICAgICAgIGRlZiBtYWtlX3BhbGluZHJvbWUodG9rZW5zKToKICAgICAgICAgICAgICAgIHRva2Vucy5leHRlbmQocmV2ZXJzZWQoW3RbOjotMV0gZm9yIHQgaW4gdG9rZW5zXSkpCiAgICAgICAgICAgICAgICByZXR1cm4gJycuam9pbih0b2tlbnMpCiAgICAgICAgICAgIHByaW50KHBhdHQuYWRkUGFyc2VBY3Rpb24obWFrZV9wYWxpbmRyb21lKS5wYXJzZVN0cmluZygibHNrZGogc2Rsa2pmIGxrc2QiKSkgIyAtPiAnbHNrZGpzZGxramZsa3NkZHNrbGZqa2xkc2pka3NsJwogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbXNlcSwgUGFyc2VSZXN1bHRzKToKICAgICAgICAgICAgc2VsZiArPSBpdGVtc2VxCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QuZXh0ZW5kKGl0ZW1zZXEpCgogICAgZGVmIGNsZWFyKCBzZWxmICk6CiAgICAgICAgIiIiCiAgICAgICAgQ2xlYXIgYWxsIGVsZW1lbnRzIGFuZCByZXN1bHRzIG5hbWVzLgogICAgICAgICIiIgogICAgICAgIGRlbCBzZWxmLl9fdG9rbGlzdFs6XQogICAgICAgIHNlbGYuX190b2tkaWN0LmNsZWFyKCkKCiAgICBkZWYgX19nZXRhdHRyX18oIHNlbGYsIG5hbWUgKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmW25hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgICAgCiAgICAgICAgaWYgbmFtZSBpbiBzZWxmLl9fdG9rZGljdDoKICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5fX2FjY3VtTmFtZXM6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2RpY3RbbmFtZV1bLTFdWzBdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VSZXN1bHRzKFsgdlswXSBmb3IgdiBpbiBzZWxmLl9fdG9rZGljdFtuYW1lXSBdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAiIgoKICAgIGRlZiBfX2FkZF9fKCBzZWxmLCBvdGhlciApOgogICAgICAgIHJldCA9IHNlbGYuY29weSgpCiAgICAgICAgcmV0ICs9IG90aGVyCiAgICAgICAgcmV0dXJuIHJldAoKICAgIGRlZiBfX2lhZGRfXyggc2VsZiwgb3RoZXIgKToKICAgICAgICBpZiBvdGhlci5fX3Rva2RpY3Q6CiAgICAgICAgICAgIG9mZnNldCA9IGxlbihzZWxmLl9fdG9rbGlzdCkKICAgICAgICAgICAgYWRkb2Zmc2V0ID0gbGFtYmRhIGE6IG9mZnNldCBpZiBhPDAgZWxzZSBhK29mZnNldAogICAgICAgICAgICBvdGhlcml0ZW1zID0gb3RoZXIuX190b2tkaWN0Lml0ZW1zKCkKICAgICAgICAgICAgb3RoZXJkaWN0aXRlbXMgPSBbKGssIF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHZbMF0sYWRkb2Zmc2V0KHZbMV0pKSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrLHZsaXN0KSBpbiBvdGhlcml0ZW1zIGZvciB2IGluIHZsaXN0XQogICAgICAgICAgICBmb3Igayx2IGluIG90aGVyZGljdGl0ZW1zOgogICAgICAgICAgICAgICAgc2VsZltrXSA9IHYKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodlswXSxQYXJzZVJlc3VsdHMpOgogICAgICAgICAgICAgICAgICAgIHZbMF0uX19wYXJlbnQgPSB3a3JlZihzZWxmKQogICAgICAgICAgICAKICAgICAgICBzZWxmLl9fdG9rbGlzdCArPSBvdGhlci5fX3Rva2xpc3QKICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcy51cGRhdGUoIG90aGVyLl9fYWNjdW1OYW1lcyApCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsaW50KSBhbmQgb3RoZXIgPT0gMDoKICAgICAgICAgICAgIyB1c2VmdWwgZm9yIG1lcmdpbmcgbWFueSBQYXJzZVJlc3VsdHMgdXNpbmcgc3VtKCkgYnVpbHRpbgogICAgICAgICAgICByZXR1cm4gc2VsZi5jb3B5KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIHRoaXMgbWF5IHJhaXNlIGEgVHlwZUVycm9yIC0gc28gYmUgaXQKICAgICAgICAgICAgcmV0dXJuIG90aGVyICsgc2VsZgogICAgICAgIAogICAgZGVmIF9fcmVwcl9fKCBzZWxmICk6CiAgICAgICAgcmV0dXJuICIoJXMsICVzKSIgJSAoIHJlcHIoIHNlbGYuX190b2tsaXN0ICksIHJlcHIoIHNlbGYuX190b2tkaWN0ICkgKQoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgcmV0dXJuICdbJyArICcsICcuam9pbihfdXN0cihpKSBpZiBpc2luc3RhbmNlKGksIFBhcnNlUmVzdWx0cykgZWxzZSByZXByKGkpIGZvciBpIGluIHNlbGYuX190b2tsaXN0KSArICddJwoKICAgIGRlZiBfYXNTdHJpbmdMaXN0KCBzZWxmLCBzZXA9JycgKToKICAgICAgICBvdXQgPSBbXQogICAgICAgIGZvciBpdGVtIGluIHNlbGYuX190b2tsaXN0OgogICAgICAgICAgICBpZiBvdXQgYW5kIHNlcDoKICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoc2VwKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKCBpdGVtLCBQYXJzZVJlc3VsdHMgKToKICAgICAgICAgICAgICAgIG91dCArPSBpdGVtLl9hc1N0cmluZ0xpc3QoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggX3VzdHIoaXRlbSkgKQogICAgICAgIHJldHVybiBvdXQKCiAgICBkZWYgYXNMaXN0KCBzZWxmICk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB0aGUgcGFyc2UgcmVzdWx0cyBhcyBhIG5lc3RlZCBsaXN0IG9mIG1hdGNoaW5nIHRva2VucywgYWxsIGNvbnZlcnRlZCB0byBzdHJpbmdzLgoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgcGF0dCA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpCiAgICAgICAgICAgIHJlc3VsdCA9IHBhdHQucGFyc2VTdHJpbmcoInNsZGtqIGxzZGtqIHNsZGtqIikKICAgICAgICAgICAgIyBldmVuIHRob3VnaCB0aGUgcmVzdWx0IHByaW50cyBpbiBzdHJpbmctbGlrZSBmb3JtLCBpdCBpcyBhY3R1YWxseSBhIHB5cGFyc2luZyBQYXJzZVJlc3VsdHMKICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHQpLCByZXN1bHQpICMgLT4gPGNsYXNzICdweXBhcnNpbmcuUGFyc2VSZXN1bHRzJz4gWydzbGRraicsICdsc2RraicsICdzbGRraiddCiAgICAgICAgICAgIAogICAgICAgICAgICAjIFVzZSBhc0xpc3QoKSB0byBjcmVhdGUgYW4gYWN0dWFsIGxpc3QKICAgICAgICAgICAgcmVzdWx0X2xpc3QgPSByZXN1bHQuYXNMaXN0KCkKICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHRfbGlzdCksIHJlc3VsdF9saXN0KSAjIC0+IDxjbGFzcyAnbGlzdCc+IFsnc2xka2onLCAnbHNka2onLCAnc2xka2onXQogICAgICAgICIiIgogICAgICAgIHJldHVybiBbcmVzLmFzTGlzdCgpIGlmIGlzaW5zdGFuY2UocmVzLFBhcnNlUmVzdWx0cykgZWxzZSByZXMgZm9yIHJlcyBpbiBzZWxmLl9fdG9rbGlzdF0KCiAgICBkZWYgYXNEaWN0KCBzZWxmICk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB0aGUgbmFtZWQgcGFyc2UgcmVzdWx0cyBhcyBhIG5lc3RlZCBkaWN0aW9uYXJ5LgoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykKICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikKICAgICAgICAgICAgCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCcxMi8zMS8xOTk5JykKICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHQpLCByZXByKHJlc3VsdCkpICMgLT4gPGNsYXNzICdweXBhcnNpbmcuUGFyc2VSZXN1bHRzJz4gKFsnMTInLCAnLycsICczMScsICcvJywgJzE5OTknXSwgeydkYXknOiBbKCcxOTk5JywgNCldLCAneWVhcic6IFsoJzEyJywgMCldLCAnbW9udGgnOiBbKCczMScsIDIpXX0pCiAgICAgICAgICAgIAogICAgICAgICAgICByZXN1bHRfZGljdCA9IHJlc3VsdC5hc0RpY3QoKQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdF9kaWN0KSwgcmVwcihyZXN1bHRfZGljdCkpICMgLT4gPGNsYXNzICdkaWN0Jz4geydkYXknOiAnMTk5OScsICd5ZWFyJzogJzEyJywgJ21vbnRoJzogJzMxJ30KCiAgICAgICAgICAgICMgZXZlbiB0aG91Z2ggYSBQYXJzZVJlc3VsdHMgc3VwcG9ydHMgZGljdC1saWtlIGFjY2Vzcywgc29tZXRpbWUgeW91IGp1c3QgbmVlZCB0byBoYXZlIGEgZGljdAogICAgICAgICAgICBpbXBvcnQganNvbgogICAgICAgICAgICBwcmludChqc29uLmR1bXBzKHJlc3VsdCkpICMgLT4gRXhjZXB0aW9uOiBUeXBlRXJyb3I6IC4uLiBpcyBub3QgSlNPTiBzZXJpYWxpemFibGUKICAgICAgICAgICAgcHJpbnQoanNvbi5kdW1wcyhyZXN1bHQuYXNEaWN0KCkpKSAjIC0+IHsibW9udGgiOiAiMzEiLCAiZGF5IjogIjE5OTkiLCAieWVhciI6ICIxMiJ9CiAgICAgICAgIiIiCiAgICAgICAgaWYgUFlfMzoKICAgICAgICAgICAgaXRlbV9mbiA9IHNlbGYuaXRlbXMKICAgICAgICBlbHNlOgogICAgICAgICAgICBpdGVtX2ZuID0gc2VsZi5pdGVyaXRlbXMKICAgICAgICAgICAgCiAgICAgICAgZGVmIHRvSXRlbShvYmopOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgUGFyc2VSZXN1bHRzKToKICAgICAgICAgICAgICAgIGlmIG9iai5oYXNrZXlzKCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iai5hc0RpY3QoKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3RvSXRlbSh2KSBmb3IgdiBpbiBvYmpdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqCiAgICAgICAgICAgICAgICAKICAgICAgICByZXR1cm4gZGljdCgoayx0b0l0ZW0odikpIGZvciBrLHYgaW4gaXRlbV9mbigpKQoKICAgIGRlZiBjb3B5KCBzZWxmICk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIG5ldyBjb3B5IG9mIGEgQ3tQYXJzZVJlc3VsdHN9IG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICByZXQgPSBQYXJzZVJlc3VsdHMoIHNlbGYuX190b2tsaXN0ICkKICAgICAgICByZXQuX190b2tkaWN0ID0gc2VsZi5fX3Rva2RpY3QuY29weSgpCiAgICAgICAgcmV0Ll9fcGFyZW50ID0gc2VsZi5fX3BhcmVudAogICAgICAgIHJldC5fX2FjY3VtTmFtZXMudXBkYXRlKCBzZWxmLl9fYWNjdW1OYW1lcyApCiAgICAgICAgcmV0Ll9fbmFtZSA9IHNlbGYuX19uYW1lCiAgICAgICAgcmV0dXJuIHJldAoKICAgIGRlZiBhc1hNTCggc2VsZiwgZG9jdGFnPU5vbmUsIG5hbWVkSXRlbXNPbmx5PUZhbHNlLCBpbmRlbnQ9IiIsIGZvcm1hdHRlZD1UcnVlICk6CiAgICAgICAgIiIiCiAgICAgICAgKERlcHJlY2F0ZWQpIFJldHVybnMgdGhlIHBhcnNlIHJlc3VsdHMgYXMgWE1MLiBUYWdzIGFyZSBjcmVhdGVkIGZvciB0b2tlbnMgYW5kIGxpc3RzIHRoYXQgaGF2ZSBkZWZpbmVkIHJlc3VsdHMgbmFtZXMuCiAgICAgICAgIiIiCiAgICAgICAgbmwgPSAiXG4iCiAgICAgICAgb3V0ID0gW10KICAgICAgICBuYW1lZEl0ZW1zID0gZGljdCgodlsxXSxrKSBmb3IgKGssdmxpc3QpIGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHYgaW4gdmxpc3QpCiAgICAgICAgbmV4dExldmVsSW5kZW50ID0gaW5kZW50ICsgIiAgIgoKICAgICAgICAjIGNvbGxhcHNlIG91dCBpbmRlbnRzIGlmIGZvcm1hdHRpbmcgaXMgbm90IGRlc2lyZWQKICAgICAgICBpZiBub3QgZm9ybWF0dGVkOgogICAgICAgICAgICBpbmRlbnQgPSAiIgogICAgICAgICAgICBuZXh0TGV2ZWxJbmRlbnQgPSAiIgogICAgICAgICAgICBubCA9ICIiCgogICAgICAgIHNlbGZUYWcgPSBOb25lCiAgICAgICAgaWYgZG9jdGFnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmVGFnID0gZG9jdGFnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgc2VsZi5fX25hbWU6CiAgICAgICAgICAgICAgICBzZWxmVGFnID0gc2VsZi5fX25hbWUKCiAgICAgICAgaWYgbm90IHNlbGZUYWc6CiAgICAgICAgICAgIGlmIG5hbWVkSXRlbXNPbmx5OgogICAgICAgICAgICAgICAgcmV0dXJuICIiCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmVGFnID0gIklURU0iCgogICAgICAgIG91dCArPSBbIG5sLCBpbmRlbnQsICI8Iiwgc2VsZlRhZywgIj4iIF0KCiAgICAgICAgZm9yIGkscmVzIGluIGVudW1lcmF0ZShzZWxmLl9fdG9rbGlzdCk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocmVzLFBhcnNlUmVzdWx0cyk6CiAgICAgICAgICAgICAgICBpZiBpIGluIG5hbWVkSXRlbXM6CiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IFsgcmVzLmFzWE1MKG5hbWVkSXRlbXNbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lZEl0ZW1zT25seSBhbmQgZG9jdGFnIGlzIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGV2ZWxJbmRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQpXQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBvdXQgKz0gWyByZXMuYXNYTUwoTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkSXRlbXNPbmx5IGFuZCBkb2N0YWcgaXMgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMZXZlbEluZGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCldCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGluZGl2aWR1YWwgdG9rZW4sIHNlZSBpZiB0aGVyZSBpcyBhIG5hbWUgZm9yIGl0CiAgICAgICAgICAgICAgICByZXNUYWcgPSBOb25lCiAgICAgICAgICAgICAgICBpZiBpIGluIG5hbWVkSXRlbXM6CiAgICAgICAgICAgICAgICAgICAgcmVzVGFnID0gbmFtZWRJdGVtc1tpXQogICAgICAgICAgICAgICAgaWYgbm90IHJlc1RhZzoKICAgICAgICAgICAgICAgICAgICBpZiBuYW1lZEl0ZW1zT25seToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICByZXNUYWcgPSAiSVRFTSIKICAgICAgICAgICAgICAgIHhtbEJvZHlUZXh0ID0gX3htbF9lc2NhcGUoX3VzdHIocmVzKSkKICAgICAgICAgICAgICAgIG91dCArPSBbIG5sLCBuZXh0TGV2ZWxJbmRlbnQsICI8IiwgcmVzVGFnLCAiPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbEJvZHlUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC8iLCByZXNUYWcsICI+IiBdCgogICAgICAgIG91dCArPSBbIG5sLCBpbmRlbnQsICI8LyIsIHNlbGZUYWcsICI+IiBdCiAgICAgICAgcmV0dXJuICIiLmpvaW4ob3V0KQoKICAgIGRlZiBfX2xvb2t1cChzZWxmLHN1Yik6CiAgICAgICAgZm9yIGssdmxpc3QgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKToKICAgICAgICAgICAgZm9yIHYsbG9jIGluIHZsaXN0OgogICAgICAgICAgICAgICAgaWYgc3ViIGlzIHY6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGsKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBnZXROYW1lKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgdGhlIHJlc3VsdHMgbmFtZSBmb3IgdGhpcyB0b2tlbiBleHByZXNzaW9uLiBVc2VmdWwgd2hlbiBzZXZlcmFsIAogICAgICAgIGRpZmZlcmVudCBleHByZXNzaW9ucyBtaWdodCBtYXRjaCBhdCBhIHBhcnRpY3VsYXIgbG9jYXRpb24uCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQogICAgICAgICAgICBzc25fZXhwciA9IFJlZ2V4KHIiXGRcZFxkLVxkXGQtXGRcZFxkXGQiKQogICAgICAgICAgICBob3VzZV9udW1iZXJfZXhwciA9IFN1cHByZXNzKCcjJykgKyBXb3JkKG51bXMsIGFscGhhbnVtcykKICAgICAgICAgICAgdXNlcl9kYXRhID0gKEdyb3VwKGhvdXNlX251bWJlcl9leHByKSgiaG91c2VfbnVtYmVyIikgCiAgICAgICAgICAgICAgICAgICAgICAgIHwgR3JvdXAoc3NuX2V4cHIpKCJzc24iKQogICAgICAgICAgICAgICAgICAgICAgICB8IEdyb3VwKGludGVnZXIpKCJhZ2UiKSkKICAgICAgICAgICAgdXNlcl9pbmZvID0gT25lT3JNb3JlKHVzZXJfZGF0YSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHJlc3VsdCA9IHVzZXJfaW5mby5wYXJzZVN0cmluZygiMjIgMTExLTIyLTMzMzMgIzIyMUIiKQogICAgICAgICAgICBmb3IgaXRlbSBpbiByZXN1bHQ6CiAgICAgICAgICAgICAgICBwcmludChpdGVtLmdldE5hbWUoKSwgJzonLCBpdGVtWzBdKQogICAgICAgIHByaW50czo6CiAgICAgICAgICAgIGFnZSA6IDIyCiAgICAgICAgICAgIHNzbiA6IDExMS0yMi0zMzMzCiAgICAgICAgICAgIGhvdXNlX251bWJlciA6IDIyMUIKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9fbmFtZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19uYW1lCiAgICAgICAgZWxpZiBzZWxmLl9fcGFyZW50OgogICAgICAgICAgICBwYXIgPSBzZWxmLl9fcGFyZW50KCkKICAgICAgICAgICAgaWYgcGFyOgogICAgICAgICAgICAgICAgcmV0dXJuIHBhci5fX2xvb2t1cChzZWxmKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBlbGlmIChsZW4oc2VsZikgPT0gMSBhbmQKICAgICAgICAgICAgICAgbGVuKHNlbGYuX190b2tkaWN0KSA9PSAxIGFuZAogICAgICAgICAgICAgICBuZXh0KGl0ZXIoc2VsZi5fX3Rva2RpY3QudmFsdWVzKCkpKVswXVsxXSBpbiAoMCwtMSkpOgogICAgICAgICAgICByZXR1cm4gbmV4dChpdGVyKHNlbGYuX190b2tkaWN0LmtleXMoKSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgZHVtcChzZWxmLCBpbmRlbnQ9JycsIGRlcHRoPTAsIGZ1bGw9VHJ1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgRGlhZ25vc3RpYyBtZXRob2QgZm9yIGxpc3Rpbmcgb3V0IHRoZSBjb250ZW50cyBvZiBhIEN7UGFyc2VSZXN1bHRzfS4KICAgICAgICBBY2NlcHRzIGFuIG9wdGlvbmFsIEN7aW5kZW50fSBhcmd1bWVudCBzbyB0aGF0IHRoaXMgc3RyaW5nIGNhbiBiZSBlbWJlZGRlZAogICAgICAgIGluIGEgbmVzdGVkIGRpc3BsYXkgb2Ygb3RoZXIgZGF0YS4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpCiAgICAgICAgICAgIAogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygnMTIvMzEvMTk5OScpCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5kdW1wKCkpCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAgICAgWycxMicsICcvJywgJzMxJywgJy8nLCAnMTk5OSddCiAgICAgICAgICAgIC0gZGF5OiAxOTk5CiAgICAgICAgICAgIC0gbW9udGg6IDMxCiAgICAgICAgICAgIC0geWVhcjogMTIKICAgICAgICAiIiIKICAgICAgICBvdXQgPSBbXQogICAgICAgIE5MID0gJ1xuJwogICAgICAgIG91dC5hcHBlbmQoIGluZGVudCtfdXN0cihzZWxmLmFzTGlzdCgpKSApCiAgICAgICAgaWYgZnVsbDoKICAgICAgICAgICAgaWYgc2VsZi5oYXNrZXlzKCk6CiAgICAgICAgICAgICAgICBpdGVtcyA9IHNvcnRlZCgoc3RyKGspLCB2KSBmb3Igayx2IGluIHNlbGYuaXRlbXMoKSkKICAgICAgICAgICAgICAgIGZvciBrLHYgaW4gaXRlbXM6CiAgICAgICAgICAgICAgICAgICAgaWYgb3V0OgogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKE5MKQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoICIlcyVzLSAlczogIiAlIChpbmRlbnQsKCcgICcqZGVwdGgpLCBrKSApCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2LFBhcnNlUmVzdWx0cyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCB2LmR1bXAoaW5kZW50LGRlcHRoKzEpICkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoX3VzdHIodikpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChyZXByKHYpKQogICAgICAgICAgICBlbGlmIGFueShpc2luc3RhbmNlKHZ2LFBhcnNlUmVzdWx0cykgZm9yIHZ2IGluIHNlbGYpOgogICAgICAgICAgICAgICAgdiA9IHNlbGYKICAgICAgICAgICAgICAgIGZvciBpLHZ2IGluIGVudW1lcmF0ZSh2KToKICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZ2LFBhcnNlUmVzdWx0cyk6CiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIlxuJXMlc1slZF06XG4lcyVzJXMiICUgKGluZGVudCwoJyAgJyooZGVwdGgpKSxpLGluZGVudCwoJyAgJyooZGVwdGgrMSkpLHZ2LmR1bXAoaW5kZW50LGRlcHRoKzEpICkpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiXG4lcyVzWyVkXTpcbiVzJXMlcyIgJSAoaW5kZW50LCgnICAnKihkZXB0aCkpLGksaW5kZW50LCgnICAnKihkZXB0aCsxKSksX3VzdHIodnYpKSkKICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuICIiLmpvaW4ob3V0KQoKICAgIGRlZiBwcHJpbnQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBQcmV0dHktcHJpbnRlciBmb3IgcGFyc2VkIHJlc3VsdHMgYXMgYSBsaXN0LCB1c2luZyB0aGUgQ3twcHJpbnR9IG1vZHVsZS4KICAgICAgICBBY2NlcHRzIGFkZGl0aW9uYWwgcG9zaXRpb25hbCBvciBrZXl3b3JkIGFyZ3MgYXMgZGVmaW5lZCBmb3IgdGhlIAogICAgICAgIEN7cHByaW50LnBwcmludH0gbWV0aG9kLiAoVXtodHRwOi8vZG9jcy5weXRob24ub3JnLzMvbGlicmFyeS9wcHJpbnQuaHRtbCNwcHJpbnQucHByaW50fSkKCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGlkZW50ID0gV29yZChhbHBoYXMsIGFscGhhbnVtcykKICAgICAgICAgICAgbnVtID0gV29yZChudW1zKQogICAgICAgICAgICBmdW5jID0gRm9yd2FyZCgpCiAgICAgICAgICAgIHRlcm0gPSBpZGVudCB8IG51bSB8IEdyb3VwKCcoJyArIGZ1bmMgKyAnKScpCiAgICAgICAgICAgIGZ1bmMgPDw9IGlkZW50ICsgR3JvdXAoT3B0aW9uYWwoZGVsaW1pdGVkTGlzdCh0ZXJtKSkpCiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMucGFyc2VTdHJpbmcoImZuYSBhLGIsKGZuYiBjLGQsMjAwKSwxMDAiKQogICAgICAgICAgICByZXN1bHQucHByaW50KHdpZHRoPTQwKQogICAgICAgIHByaW50czo6CiAgICAgICAgICAgIFsnZm5hJywKICAgICAgICAgICAgIFsnYScsCiAgICAgICAgICAgICAgJ2InLAogICAgICAgICAgICAgIFsnKCcsICdmbmInLCBbJ2MnLCAnZCcsICcyMDAnXSwgJyknXSwKICAgICAgICAgICAgICAnMTAwJ11dCiAgICAgICAgIiIiCiAgICAgICAgcHByaW50LnBwcmludChzZWxmLmFzTGlzdCgpLCAqYXJncywgKiprd2FyZ3MpCgogICAgIyBhZGQgc3VwcG9ydCBmb3IgcGlja2xlIHByb3RvY29sCiAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgogICAgICAgIHJldHVybiAoIHNlbGYuX190b2tsaXN0LAogICAgICAgICAgICAgICAgICggc2VsZi5fX3Rva2RpY3QuY29weSgpLAogICAgICAgICAgICAgICAgICAgc2VsZi5fX3BhcmVudCBpcyBub3QgTm9uZSBhbmQgc2VsZi5fX3BhcmVudCgpIG9yIE5vbmUsCiAgICAgICAgICAgICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcywKICAgICAgICAgICAgICAgICAgIHNlbGYuX19uYW1lICkgKQoKICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZixzdGF0ZSk6CiAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSBzdGF0ZVswXQogICAgICAgIChzZWxmLl9fdG9rZGljdCwKICAgICAgICAgcGFyLAogICAgICAgICBpbkFjY3VtTmFtZXMsCiAgICAgICAgIHNlbGYuX19uYW1lKSA9IHN0YXRlWzFdCiAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMgPSB7fQogICAgICAgIHNlbGYuX19hY2N1bU5hbWVzLnVwZGF0ZShpbkFjY3VtTmFtZXMpCiAgICAgICAgaWYgcGFyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLl9fcGFyZW50ID0gd2tyZWYocGFyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX19wYXJlbnQgPSBOb25lCgogICAgZGVmIF9fZ2V0bmV3YXJnc19fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9fdG9rbGlzdCwgc2VsZi5fX25hbWUsIHNlbGYuX19hc0xpc3QsIHNlbGYuX19tb2RhbAoKICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAoZGlyKHR5cGUoc2VsZikpICsgbGlzdChzZWxmLmtleXMoKSkpCgpjb2xsZWN0aW9ucy5NdXRhYmxlTWFwcGluZy5yZWdpc3RlcihQYXJzZVJlc3VsdHMpCgpkZWYgY29sIChsb2Msc3RyZyk6CiAgICAiIiJSZXR1cm5zIGN1cnJlbnQgY29sdW1uIHdpdGhpbiBhIHN0cmluZywgY291bnRpbmcgbmV3bGluZXMgYXMgbGluZSBzZXBhcmF0b3JzLgogICBUaGUgZmlyc3QgY29sdW1uIGlzIG51bWJlciAxLgoKICAgTm90ZTogdGhlIGRlZmF1bHQgcGFyc2luZyBiZWhhdmlvciBpcyB0byBleHBhbmQgdGFicyBpbiB0aGUgaW5wdXQgc3RyaW5nCiAgIGJlZm9yZSBzdGFydGluZyB0aGUgcGFyc2luZyBwcm9jZXNzLiAgU2VlIEx7SXtQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nfTxQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24KICAgb24gcGFyc2luZyBzdHJpbmdzIGNvbnRhaW5pbmcgQ3s8VEFCPn1zLCBhbmQgc3VnZ2VzdGVkIG1ldGhvZHMgdG8gbWFpbnRhaW4gYQogICBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIHBhcnNlZCBzdHJpbmcsIHRoZSBwYXJzZSBsb2NhdGlvbiwgYW5kIGxpbmUgYW5kIGNvbHVtbgogICBwb3NpdGlvbnMgd2l0aGluIHRoZSBwYXJzZWQgc3RyaW5nLgogICAiIiIKICAgIHMgPSBzdHJnCiAgICByZXR1cm4gMSBpZiAwPGxvYzxsZW4ocykgYW5kIHNbbG9jLTFdID09ICdcbicgZWxzZSBsb2MgLSBzLnJmaW5kKCJcbiIsIDAsIGxvYykKCmRlZiBsaW5lbm8obG9jLHN0cmcpOgogICAgIiIiUmV0dXJucyBjdXJyZW50IGxpbmUgbnVtYmVyIHdpdGhpbiBhIHN0cmluZywgY291bnRpbmcgbmV3bGluZXMgYXMgbGluZSBzZXBhcmF0b3JzLgogICBUaGUgZmlyc3QgbGluZSBpcyBudW1iZXIgMS4KCiAgIE5vdGU6IHRoZSBkZWZhdWx0IHBhcnNpbmcgYmVoYXZpb3IgaXMgdG8gZXhwYW5kIHRhYnMgaW4gdGhlIGlucHV0IHN0cmluZwogICBiZWZvcmUgc3RhcnRpbmcgdGhlIHBhcnNpbmcgcHJvY2Vzcy4gIFNlZSBMe0l7UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZ308UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uCiAgIG9uIHBhcnNpbmcgc3RyaW5ncyBjb250YWluaW5nIEN7PFRBQj59cywgYW5kIHN1Z2dlc3RlZCBtZXRob2RzIHRvIG1haW50YWluIGEKICAgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBwYXJzZWQgc3RyaW5nLCB0aGUgcGFyc2UgbG9jYXRpb24sIGFuZCBsaW5lIGFuZCBjb2x1bW4KICAgcG9zaXRpb25zIHdpdGhpbiB0aGUgcGFyc2VkIHN0cmluZy4KICAgIiIiCiAgICByZXR1cm4gc3RyZy5jb3VudCgiXG4iLDAsbG9jKSArIDEKCmRlZiBsaW5lKCBsb2MsIHN0cmcgKToKICAgICIiIlJldHVybnMgdGhlIGxpbmUgb2YgdGV4dCBjb250YWluaW5nIGxvYyB3aXRoaW4gYSBzdHJpbmcsIGNvdW50aW5nIG5ld2xpbmVzIGFzIGxpbmUgc2VwYXJhdG9ycy4KICAgICAgICIiIgogICAgbGFzdENSID0gc3RyZy5yZmluZCgiXG4iLCAwLCBsb2MpCiAgICBuZXh0Q1IgPSBzdHJnLmZpbmQoIlxuIiwgbG9jKQogICAgaWYgbmV4dENSID49IDA6CiAgICAgICAgcmV0dXJuIHN0cmdbbGFzdENSKzE6bmV4dENSXQogICAgZWxzZToKICAgICAgICByZXR1cm4gc3RyZ1tsYXN0Q1IrMTpdCgpkZWYgX2RlZmF1bHRTdGFydERlYnVnQWN0aW9uKCBpbnN0cmluZywgbG9jLCBleHByICk6CiAgICBwcmludCAoKCJNYXRjaCAiICsgX3VzdHIoZXhwcikgKyAiIGF0IGxvYyAiICsgX3VzdHIobG9jKSArICIoJWQsJWQpIiAlICggbGluZW5vKGxvYyxpbnN0cmluZyksIGNvbChsb2MsaW5zdHJpbmcpICkpKQoKZGVmIF9kZWZhdWx0U3VjY2Vzc0RlYnVnQWN0aW9uKCBpbnN0cmluZywgc3RhcnRsb2MsIGVuZGxvYywgZXhwciwgdG9rcyApOgogICAgcHJpbnQgKCJNYXRjaGVkICIgKyBfdXN0cihleHByKSArICIgLT4gIiArIHN0cih0b2tzLmFzTGlzdCgpKSkKCmRlZiBfZGVmYXVsdEV4Y2VwdGlvbkRlYnVnQWN0aW9uKCBpbnN0cmluZywgbG9jLCBleHByLCBleGMgKToKICAgIHByaW50ICgiRXhjZXB0aW9uIHJhaXNlZDoiICsgX3VzdHIoZXhjKSkKCmRlZiBudWxsRGVidWdBY3Rpb24oKmFyZ3MpOgogICAgIiIiJ0RvLW5vdGhpbmcnIGRlYnVnIGFjdGlvbiwgdG8gc3VwcHJlc3MgZGVidWdnaW5nIG91dHB1dCBkdXJpbmcgcGFyc2luZy4iIiIKICAgIHBhc3MKCiMgT25seSB3b3JrcyBvbiBQeXRob24gMy54IC0gbm9ubG9jYWwgaXMgdG94aWMgdG8gUHl0aG9uIDIgaW5zdGFsbHMKI34gJ2RlY29yYXRvciB0byB0cmltIGZ1bmN0aW9uIGNhbGxzIHRvIG1hdGNoIHRoZSBhcml0eSBvZiB0aGUgdGFyZ2V0JwojfiBkZWYgX3RyaW1fYXJpdHkoZnVuYywgbWF4YXJncz0zKToKICAgICN+IGlmIGZ1bmMgaW4gc2luZ2xlQXJnQnVpbHRpbnM6CiAgICAgICAgI34gcmV0dXJuIGxhbWJkYSBzLGwsdDogZnVuYyh0KQogICAgI34gbGltaXQgPSAwCiAgICAjfiBmb3VuZEFyaXR5ID0gRmFsc2UKICAgICN+IGRlZiB3cmFwcGVyKCphcmdzKToKICAgICAgICAjfiBub25sb2NhbCBsaW1pdCxmb3VuZEFyaXR5CiAgICAgICAgI34gd2hpbGUgMToKICAgICAgICAgICAgI34gdHJ5OgogICAgICAgICAgICAgICAgI34gcmV0ID0gZnVuYygqYXJnc1tsaW1pdDpdKQogICAgICAgICAgICAgICAgI34gZm91bmRBcml0eSA9IFRydWUKICAgICAgICAgICAgICAgICN+IHJldHVybiByZXQKICAgICAgICAgICAgI34gZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgICAgICN+IGlmIGxpbWl0ID09IG1heGFyZ3Mgb3IgZm91bmRBcml0eToKICAgICAgICAgICAgICAgICAgICAjfiByYWlzZQogICAgICAgICAgICAgICAgI34gbGltaXQgKz0gMQogICAgICAgICAgICAgICAgI34gY29udGludWUKICAgICN+IHJldHVybiB3cmFwcGVyCgojIHRoaXMgdmVyc2lvbiBpcyBQeXRob24gMi54LTMueCBjcm9zcy1jb21wYXRpYmxlCidkZWNvcmF0b3IgdG8gdHJpbSBmdW5jdGlvbiBjYWxscyB0byBtYXRjaCB0aGUgYXJpdHkgb2YgdGhlIHRhcmdldCcKZGVmIF90cmltX2FyaXR5KGZ1bmMsIG1heGFyZ3M9Mik6CiAgICBpZiBmdW5jIGluIHNpbmdsZUFyZ0J1aWx0aW5zOgogICAgICAgIHJldHVybiBsYW1iZGEgcyxsLHQ6IGZ1bmModCkKICAgIGxpbWl0ID0gWzBdCiAgICBmb3VuZEFyaXR5ID0gW0ZhbHNlXQogICAgCiAgICAjIHRyYWNlYmFjayByZXR1cm4gZGF0YSBzdHJ1Y3R1cmUgY2hhbmdlZCBpbiBQeTMuNSAtIG5vcm1hbGl6ZSBiYWNrIHRvIHBsYWluIHR1cGxlcwogICAgaWYgc3lzdGVtX3ZlcnNpb25bOjJdID49ICgzLDUpOgogICAgICAgIGRlZiBleHRyYWN0X3N0YWNrKGxpbWl0PTApOgogICAgICAgICAgICAjIHNwZWNpYWwgaGFuZGxpbmcgZm9yIFB5dGhvbiAzLjUuMCAtIGV4dHJhIGRlZXAgY2FsbCBzdGFjayBieSAxCiAgICAgICAgICAgIG9mZnNldCA9IC0zIGlmIHN5c3RlbV92ZXJzaW9uID09ICgzLDUsMCkgZWxzZSAtMgogICAgICAgICAgICBmcmFtZV9zdW1tYXJ5ID0gdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2sobGltaXQ9LW9mZnNldCtsaW1pdC0xKVtvZmZzZXRdCiAgICAgICAgICAgIHJldHVybiBbKGZyYW1lX3N1bW1hcnkuZmlsZW5hbWUsIGZyYW1lX3N1bW1hcnkubGluZW5vKV0KICAgICAgICBkZWYgZXh0cmFjdF90Yih0YiwgbGltaXQ9MCk6CiAgICAgICAgICAgIGZyYW1lcyA9IHRyYWNlYmFjay5leHRyYWN0X3RiKHRiLCBsaW1pdD1saW1pdCkKICAgICAgICAgICAgZnJhbWVfc3VtbWFyeSA9IGZyYW1lc1stMV0KICAgICAgICAgICAgcmV0dXJuIFsoZnJhbWVfc3VtbWFyeS5maWxlbmFtZSwgZnJhbWVfc3VtbWFyeS5saW5lbm8pXQogICAgZWxzZToKICAgICAgICBleHRyYWN0X3N0YWNrID0gdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2sKICAgICAgICBleHRyYWN0X3RiID0gdHJhY2ViYWNrLmV4dHJhY3RfdGIKICAgIAogICAgIyBzeW50aGVzaXplIHdoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkgdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2sgYXQgdGhlIGNhbGwgdG8gCiAgICAjIHVzZXIncyBwYXJzZSBhY3Rpb24gJ2Z1bmMnLCBzbyB0aGF0IHdlIGRvbid0IGluY3VyIGNhbGwgcGVuYWx0eSBhdCBwYXJzZSB0aW1lCiAgICAKICAgIExJTkVfRElGRiA9IDYKICAgICMgSUYgQU5ZIENPREUgQ0hBTkdFUywgRVZFTiBKVVNUIENPTU1FTlRTIE9SIEJMQU5LIExJTkVTLCBCRVRXRUVOIFRIRSBORVhUIExJTkUgQU5EIAogICAgIyBUSEUgQ0FMTCBUTyBGVU5DIElOU0lERSBXUkFQUEVSLCBMSU5FX0RJRkYgTVVTVCBCRSBNT0RJRklFRCEhISEKICAgIHRoaXNfbGluZSA9IGV4dHJhY3Rfc3RhY2sobGltaXQ9MilbLTFdCiAgICBwYV9jYWxsX2xpbmVfc3ludGggPSAodGhpc19saW5lWzBdLCB0aGlzX2xpbmVbMV0rTElORV9ESUZGKQoKICAgIGRlZiB3cmFwcGVyKCphcmdzKToKICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXQgPSBmdW5jKCphcmdzW2xpbWl0WzBdOl0pCiAgICAgICAgICAgICAgICBmb3VuZEFyaXR5WzBdID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIHJldAogICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgICAgIyByZS1yYWlzZSBUeXBlRXJyb3JzIGlmIHRoZXkgZGlkIG5vdCBjb21lIGZyb20gb3VyIGFyaXR5IHRlc3RpbmcKICAgICAgICAgICAgICAgIGlmIGZvdW5kQXJpdHlbMF06CiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICB0YiA9IHN5cy5leGNfaW5mbygpWy0xXQogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgZXh0cmFjdF90Yih0YiwgbGltaXQ9MilbLTFdWzoyXSA9PSBwYV9jYWxsX2xpbmVfc3ludGg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbCB0YgoKICAgICAgICAgICAgICAgIGlmIGxpbWl0WzBdIDw9IG1heGFyZ3M6CiAgICAgICAgICAgICAgICAgICAgbGltaXRbMF0gKz0gMQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICByYWlzZQoKICAgICMgY29weSBmdW5jIG5hbWUgdG8gd3JhcHBlciBmb3Igc2Vuc2libGUgZGVidWcgb3V0cHV0CiAgICBmdW5jX25hbWUgPSAiPHBhcnNlIGFjdGlvbj4iCiAgICB0cnk6CiAgICAgICAgZnVuY19uYW1lID0gZ2V0YXR0cihmdW5jLCAnX19uYW1lX18nLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoZnVuYywgJ19fY2xhc3NfXycpLl9fbmFtZV9fKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBmdW5jX25hbWUgPSBzdHIoZnVuYykKICAgIHdyYXBwZXIuX19uYW1lX18gPSBmdW5jX25hbWUKCiAgICByZXR1cm4gd3JhcHBlcgoKY2xhc3MgUGFyc2VyRWxlbWVudChvYmplY3QpOgogICAgIiIiQWJzdHJhY3QgYmFzZSBsZXZlbCBwYXJzZXIgZWxlbWVudCBjbGFzcy4iIiIKICAgIERFRkFVTFRfV0hJVEVfQ0hBUlMgPSAiIFxuXHRcciIKICAgIHZlcmJvc2Vfc3RhY2t0cmFjZSA9IEZhbHNlCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHNldERlZmF1bHRXaGl0ZXNwYWNlQ2hhcnMoIGNoYXJzICk6CiAgICAgICAgciIiIgogICAgICAgIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCB3aGl0ZXNwYWNlIGNoYXJzCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICAjIGRlZmF1bHQgd2hpdGVzcGFjZSBjaGFycyBhcmUgc3BhY2UsIDxUQUI+IGFuZCBuZXdsaW5lCiAgICAgICAgICAgIE9uZU9yTW9yZShXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCJhYmMgZGVmXG5naGkgamtsIikgICMgLT4gWydhYmMnLCAnZGVmJywgJ2doaScsICdqa2wnXQogICAgICAgICAgICAKICAgICAgICAgICAgIyBjaGFuZ2UgdG8ganVzdCB0cmVhdCBuZXdsaW5lIGFzIHNpZ25pZmljYW50CiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuc2V0RGVmYXVsdFdoaXRlc3BhY2VDaGFycygiIFx0IikKICAgICAgICAgICAgT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoImFiYyBkZWZcbmdoaSBqa2wiKSAgIyAtPiBbJ2FiYycsICdkZWYnXQogICAgICAgICIiIgogICAgICAgIFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyA9IGNoYXJzCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGlubGluZUxpdGVyYWxzVXNpbmcoY2xzKToKICAgICAgICAiIiIKICAgICAgICBTZXQgY2xhc3MgdG8gYmUgdXNlZCBmb3IgaW5jbHVzaW9uIG9mIHN0cmluZyBsaXRlcmFscyBpbnRvIGEgcGFyc2VyLgogICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICAjIGRlZmF1bHQgbGl0ZXJhbCBjbGFzcyB1c2VkIGlzIExpdGVyYWwKICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykKICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikgICAgICAgICAgIAoKICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10KCgogICAgICAgICAgICAjIGNoYW5nZSB0byBTdXBwcmVzcwogICAgICAgICAgICBQYXJzZXJFbGVtZW50LmlubGluZUxpdGVyYWxzVXNpbmcoU3VwcHJlc3MpCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpICAgICAgICAgICAKCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWycxOTk5JywgJzEyJywgJzMxJ10KICAgICAgICAiIiIKICAgICAgICBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MgPSBjbHMKCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHNhdmVsaXN0PUZhbHNlICk6CiAgICAgICAgc2VsZi5wYXJzZUFjdGlvbiA9IGxpc3QoKQogICAgICAgIHNlbGYuZmFpbEFjdGlvbiA9IE5vbmUKICAgICAgICAjfiBzZWxmLm5hbWUgPSAiPHVua25vd24+IiAgIyBkb24ndCBkZWZpbmUgc2VsZi5uYW1lLCBsZXQgc3ViY2xhc3NlcyB0cnkvZXhjZXB0IHVwY2FsbAogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUKICAgICAgICBzZWxmLnJlc3VsdHNOYW1lID0gTm9uZQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IHNhdmVsaXN0CiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUKICAgICAgICBzZWxmLndoaXRlQ2hhcnMgPSBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMKICAgICAgICBzZWxmLmNvcHlEZWZhdWx0V2hpdGVDaGFycyA9IFRydWUKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UgIyB1c2VkIHdoZW4gY2hlY2tpbmcgZm9yIGxlZnQtcmVjdXJzaW9uCiAgICAgICAgc2VsZi5rZWVwVGFicyA9IEZhbHNlCiAgICAgICAgc2VsZi5pZ25vcmVFeHBycyA9IGxpc3QoKQogICAgICAgIHNlbGYuZGVidWcgPSBGYWxzZQogICAgICAgIHNlbGYuc3RyZWFtbGluZWQgPSBGYWxzZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IFRydWUgIyB1c2VkIHRvIG9wdGltaXplIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3Igc3ViY2xhc3NlcyB0aGF0IGRvbid0IGFkdmFuY2UgcGFyc2UgaW5kZXgKICAgICAgICBzZWxmLmVycm1zZyA9ICIiCiAgICAgICAgc2VsZi5tb2RhbFJlc3VsdHMgPSBUcnVlICMgdXNlZCB0byBtYXJrIHJlc3VsdHMgbmFtZXMgYXMgbW9kYWwgKHJlcG9ydCBvbmx5IGxhc3QpIG9yIGN1bXVsYXRpdmUgKGxpc3QgYWxsKQogICAgICAgIHNlbGYuZGVidWdBY3Rpb25zID0gKCBOb25lLCBOb25lLCBOb25lICkgI2N1c3RvbSBkZWJ1ZyBhY3Rpb25zCiAgICAgICAgc2VsZi5yZSA9IE5vbmUKICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IFRydWUgIyB1c2VkIHRvIGF2b2lkIHJlZHVuZGFudCBjYWxscyB0byBwcmVQYXJzZQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IEZhbHNlCgogICAgZGVmIGNvcHkoIHNlbGYgKToKICAgICAgICAiIiIKICAgICAgICBNYWtlIGEgY29weSBvZiB0aGlzIEN7UGFyc2VyRWxlbWVudH0uICBVc2VmdWwgZm9yIGRlZmluaW5nIGRpZmZlcmVudCBwYXJzZSBhY3Rpb25zCiAgICAgICAgZm9yIHRoZSBzYW1lIHBhcnNpbmcgcGF0dGVybiwgdXNpbmcgY29waWVzIG9mIHRoZSBvcmlnaW5hbCBwYXJzZSBlbGVtZW50LgogICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQogICAgICAgICAgICBpbnRlZ2VySyA9IGludGVnZXIuY29weSgpLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdKjEwMjQpICsgU3VwcHJlc3MoIksiKQogICAgICAgICAgICBpbnRlZ2VyTSA9IGludGVnZXIuY29weSgpLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdKjEwMjQqMTAyNCkgKyBTdXBwcmVzcygiTSIpCiAgICAgICAgICAgIAogICAgICAgICAgICBwcmludChPbmVPck1vcmUoaW50ZWdlcksgfCBpbnRlZ2VyTSB8IGludGVnZXIpLnBhcnNlU3RyaW5nKCI1SyAxMDAgNjQwSyAyNTZNIikpCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAgICAgWzUxMjAsIDEwMCwgNjU1MzYwLCAyNjg0MzU0NTZdCiAgICAgICAgRXF1aXZhbGVudCBmb3JtIG9mIEN7ZXhwci5jb3B5KCl9IGlzIGp1c3QgQ3tleHByKCl9OjoKICAgICAgICAgICAgaW50ZWdlck0gPSBpbnRlZ2VyKCkuYWRkUGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0qMTAyNCoxMDI0KSArIFN1cHByZXNzKCJNIikKICAgICAgICAiIiIKICAgICAgICBjcHkgPSBjb3B5LmNvcHkoIHNlbGYgKQogICAgICAgIGNweS5wYXJzZUFjdGlvbiA9IHNlbGYucGFyc2VBY3Rpb25bOl0KICAgICAgICBjcHkuaWdub3JlRXhwcnMgPSBzZWxmLmlnbm9yZUV4cHJzWzpdCiAgICAgICAgaWYgc2VsZi5jb3B5RGVmYXVsdFdoaXRlQ2hhcnM6CiAgICAgICAgICAgIGNweS53aGl0ZUNoYXJzID0gUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTCiAgICAgICAgcmV0dXJuIGNweQoKICAgIGRlZiBzZXROYW1lKCBzZWxmLCBuYW1lICk6CiAgICAgICAgIiIiCiAgICAgICAgRGVmaW5lIG5hbWUgZm9yIHRoaXMgZXhwcmVzc2lvbiwgbWFrZXMgZGVidWdnaW5nIGFuZCBleGNlcHRpb24gbWVzc2FnZXMgY2xlYXJlci4KICAgICAgICAKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgV29yZChudW1zKS5wYXJzZVN0cmluZygiQUJDIikgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBXOigwMTIzLi4uKSAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpCiAgICAgICAgICAgIFdvcmQobnVtcykuc2V0TmFtZSgiaW50ZWdlciIpLnBhcnNlU3RyaW5nKCJBQkMiKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIGludGVnZXIgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQogICAgICAgICIiIgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJleGNlcHRpb24iKToKICAgICAgICAgICAgc2VsZi5leGNlcHRpb24ubXNnID0gc2VsZi5lcnJtc2cKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzZXRSZXN1bHRzTmFtZSggc2VsZiwgbmFtZSwgbGlzdEFsbE1hdGNoZXM9RmFsc2UgKToKICAgICAgICAiIiIKICAgICAgICBEZWZpbmUgbmFtZSBmb3IgcmVmZXJlbmNpbmcgbWF0Y2hpbmcgdG9rZW5zIGFzIGEgbmVzdGVkIGF0dHJpYnV0ZQogICAgICAgIG9mIHRoZSByZXR1cm5lZCBwYXJzZSByZXN1bHRzLgogICAgICAgIE5PVEU6IHRoaXMgcmV0dXJucyBhICpjb3B5KiBvZiB0aGUgb3JpZ2luYWwgQ3tQYXJzZXJFbGVtZW50fSBvYmplY3Q7CiAgICAgICAgdGhpcyBpcyBzbyB0aGF0IHRoZSBjbGllbnQgY2FuIGRlZmluZSBhIGJhc2ljIGVsZW1lbnQsIHN1Y2ggYXMgYW4KICAgICAgICBpbnRlZ2VyLCBhbmQgcmVmZXJlbmNlIGl0IGluIG11bHRpcGxlIHBsYWNlcyB3aXRoIGRpZmZlcmVudCBuYW1lcy4KCiAgICAgICAgWW91IGNhbiBhbHNvIHNldCByZXN1bHRzIG5hbWVzIHVzaW5nIHRoZSBhYmJyZXZpYXRlZCBzeW50YXgsCiAgICAgICAgQ3tleHByKCJuYW1lIil9IGluIHBsYWNlIG9mIEN7ZXhwci5zZXRSZXN1bHRzTmFtZSgibmFtZSIpfSAtIAogICAgICAgIHNlZSBMe0l7X19jYWxsX199PF9fY2FsbF9fPn0uCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBkYXRlX3N0ciA9IChpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJ5ZWFyIikgKyAnLycgCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgibW9udGgiKSArICcvJyAKICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJkYXkiKSkKCiAgICAgICAgICAgICMgZXF1aXZhbGVudCBmb3JtOgogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQogICAgICAgICIiIgogICAgICAgIG5ld3NlbGYgPSBzZWxmLmNvcHkoKQogICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoIioiKToKICAgICAgICAgICAgbmFtZSA9IG5hbWVbOi0xXQogICAgICAgICAgICBsaXN0QWxsTWF0Y2hlcz1UcnVlCiAgICAgICAgbmV3c2VsZi5yZXN1bHRzTmFtZSA9IG5hbWUKICAgICAgICBuZXdzZWxmLm1vZGFsUmVzdWx0cyA9IG5vdCBsaXN0QWxsTWF0Y2hlcwogICAgICAgIHJldHVybiBuZXdzZWxmCgogICAgZGVmIHNldEJyZWFrKHNlbGYsYnJlYWtGbGFnID0gVHJ1ZSk6CiAgICAgICAgIiIiTWV0aG9kIHRvIGludm9rZSB0aGUgUHl0aG9uIHBkYiBkZWJ1Z2dlciB3aGVuIHRoaXMgZWxlbWVudCBpcwogICAgICAgICAgIGFib3V0IHRvIGJlIHBhcnNlZC4gU2V0IEN7YnJlYWtGbGFnfSB0byBUcnVlIHRvIGVuYWJsZSwgRmFsc2UgdG8KICAgICAgICAgICBkaXNhYmxlLgogICAgICAgICIiIgogICAgICAgIGlmIGJyZWFrRmxhZzoKICAgICAgICAgICAgX3BhcnNlTWV0aG9kID0gc2VsZi5fcGFyc2UKICAgICAgICAgICAgZGVmIGJyZWFrZXIoaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUsIGNhbGxQcmVQYXJzZT1UcnVlKToKICAgICAgICAgICAgICAgIGltcG9ydCBwZGIKICAgICAgICAgICAgICAgIHBkYi5zZXRfdHJhY2UoKQogICAgICAgICAgICAgICAgcmV0dXJuIF9wYXJzZU1ldGhvZCggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2UgKQogICAgICAgICAgICBicmVha2VyLl9vcmlnaW5hbFBhcnNlTWV0aG9kID0gX3BhcnNlTWV0aG9kCiAgICAgICAgICAgIHNlbGYuX3BhcnNlID0gYnJlYWtlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5fcGFyc2UsIl9vcmlnaW5hbFBhcnNlTWV0aG9kIik6CiAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZSA9IHNlbGYuX3BhcnNlLl9vcmlnaW5hbFBhcnNlTWV0aG9kCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgc2V0UGFyc2VBY3Rpb24oIHNlbGYsICpmbnMsICoqa3dhcmdzICk6CiAgICAgICAgIiIiCiAgICAgICAgRGVmaW5lIGFjdGlvbiB0byBwZXJmb3JtIHdoZW4gc3VjY2Vzc2Z1bGx5IG1hdGNoaW5nIHBhcnNlIGVsZW1lbnQgZGVmaW5pdGlvbi4KICAgICAgICBQYXJzZSBhY3Rpb24gZm4gaXMgYSBjYWxsYWJsZSBtZXRob2Qgd2l0aCAwLTMgYXJndW1lbnRzLCBjYWxsZWQgYXMgQ3tmbihzLGxvYyx0b2tzKX0sCiAgICAgICAgQ3tmbihsb2MsdG9rcyl9LCBDe2ZuKHRva3MpfSwgb3IganVzdCBDe2ZuKCl9LCB3aGVyZToKICAgICAgICAgLSBzICAgPSB0aGUgb3JpZ2luYWwgc3RyaW5nIGJlaW5nIHBhcnNlZCAoc2VlIG5vdGUgYmVsb3cpCiAgICAgICAgIC0gbG9jID0gdGhlIGxvY2F0aW9uIG9mIHRoZSBtYXRjaGluZyBzdWJzdHJpbmcKICAgICAgICAgLSB0b2tzID0gYSBsaXN0IG9mIHRoZSBtYXRjaGVkIHRva2VucywgcGFja2FnZWQgYXMgYSBDe0x7UGFyc2VSZXN1bHRzfX0gb2JqZWN0CiAgICAgICAgSWYgdGhlIGZ1bmN0aW9ucyBpbiBmbnMgbW9kaWZ5IHRoZSB0b2tlbnMsIHRoZXkgY2FuIHJldHVybiB0aGVtIGFzIHRoZSByZXR1cm4KICAgICAgICB2YWx1ZSBmcm9tIGZuLCBhbmQgdGhlIG1vZGlmaWVkIGxpc3Qgb2YgdG9rZW5zIHdpbGwgcmVwbGFjZSB0aGUgb3JpZ2luYWwuCiAgICAgICAgT3RoZXJ3aXNlLCBmbiBkb2VzIG5vdCBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUuCgogICAgICAgIE9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzOgogICAgICAgICAtIGNhbGxEdXJpbmdUcnkgPSAoZGVmYXVsdD1De0ZhbHNlfSkgaW5kaWNhdGUgaWYgcGFyc2UgYWN0aW9uIHNob3VsZCBiZSBydW4gZHVyaW5nIGxvb2thaGVhZHMgYW5kIGFsdGVybmF0ZSB0ZXN0aW5nCgogICAgICAgIE5vdGU6IHRoZSBkZWZhdWx0IHBhcnNpbmcgYmVoYXZpb3IgaXMgdG8gZXhwYW5kIHRhYnMgaW4gdGhlIGlucHV0IHN0cmluZwogICAgICAgIGJlZm9yZSBzdGFydGluZyB0aGUgcGFyc2luZyBwcm9jZXNzLiAgU2VlIEx7SXtwYXJzZVN0cmluZ308cGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbgogICAgICAgIG9uIHBhcnNpbmcgc3RyaW5ncyBjb250YWluaW5nIEN7PFRBQj59cywgYW5kIHN1Z2dlc3RlZCBtZXRob2RzIHRvIG1haW50YWluIGEKICAgICAgICBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIHBhcnNlZCBzdHJpbmcsIHRoZSBwYXJzZSBsb2NhdGlvbiwgYW5kIGxpbmUgYW5kIGNvbHVtbgogICAgICAgIHBvc2l0aW9ucyB3aXRoaW4gdGhlIHBhcnNlZCBzdHJpbmcuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlciArICcvJyArIGludGVnZXIgKyAnLycgKyBpbnRlZ2VyCgogICAgICAgICAgICBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQoKICAgICAgICAgICAgIyB1c2UgcGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG8gaW50cyBhdCBwYXJzZSB0aW1lCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlciArICcvJyArIGludGVnZXIgKyAnLycgKyBpbnRlZ2VyCgogICAgICAgICAgICAjIG5vdGUgdGhhdCBpbnRlZ2VyIGZpZWxkcyBhcmUgbm93IGludHMsIG5vdCBzdHJpbmdzCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWzE5OTksICcvJywgMTIsICcvJywgMzFdCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5wYXJzZUFjdGlvbiA9IGxpc3QobWFwKF90cmltX2FyaXR5LCBsaXN0KGZucykpKQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IGt3YXJncy5nZXQoImNhbGxEdXJpbmdUcnkiLCBGYWxzZSkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBhZGRQYXJzZUFjdGlvbiggc2VsZiwgKmZucywgKiprd2FyZ3MgKToKICAgICAgICAiIiIKICAgICAgICBBZGQgcGFyc2UgYWN0aW9uIHRvIGV4cHJlc3Npb24ncyBsaXN0IG9mIHBhcnNlIGFjdGlvbnMuIFNlZSBMe0l7c2V0UGFyc2VBY3Rpb259PHNldFBhcnNlQWN0aW9uPn0uCiAgICAgICAgCiAgICAgICAgU2VlIGV4YW1wbGVzIGluIEx7SXtjb3B5fTxjb3B5Pn0uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5wYXJzZUFjdGlvbiArPSBsaXN0KG1hcChfdHJpbV9hcml0eSwgbGlzdChmbnMpKSkKICAgICAgICBzZWxmLmNhbGxEdXJpbmdUcnkgPSBzZWxmLmNhbGxEdXJpbmdUcnkgb3Iga3dhcmdzLmdldCgiY2FsbER1cmluZ1RyeSIsIEZhbHNlKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIGFkZENvbmRpdGlvbihzZWxmLCAqZm5zLCAqKmt3YXJncyk6CiAgICAgICAgIiIiQWRkIGEgYm9vbGVhbiBwcmVkaWNhdGUgZnVuY3Rpb24gdG8gZXhwcmVzc2lvbidzIGxpc3Qgb2YgcGFyc2UgYWN0aW9ucy4gU2VlIAogICAgICAgIEx7SXtzZXRQYXJzZUFjdGlvbn08c2V0UGFyc2VBY3Rpb24+fSBmb3IgZnVuY3Rpb24gY2FsbCBzaWduYXR1cmVzLiBVbmxpa2UgQ3tzZXRQYXJzZUFjdGlvbn0sIAogICAgICAgIGZ1bmN0aW9ucyBwYXNzZWQgdG8gQ3thZGRDb25kaXRpb259IG5lZWQgdG8gcmV0dXJuIGJvb2xlYW4gc3VjY2Vzcy9mYWlsIG9mIHRoZSBjb25kaXRpb24uCgogICAgICAgIE9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzOgogICAgICAgICAtIG1lc3NhZ2UgPSBkZWZpbmUgYSBjdXN0b20gbWVzc2FnZSB0byBiZSB1c2VkIGluIHRoZSByYWlzZWQgZXhjZXB0aW9uCiAgICAgICAgIC0gZmF0YWwgICA9IGlmIFRydWUsIHdpbGwgcmFpc2UgUGFyc2VGYXRhbEV4Y2VwdGlvbiB0byBzdG9wIHBhcnNpbmcgaW1tZWRpYXRlbHk7IG90aGVyd2lzZSB3aWxsIHJhaXNlIFBhcnNlRXhjZXB0aW9uCiAgICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQogICAgICAgICAgICB5ZWFyX2ludCA9IGludGVnZXIuY29weSgpCiAgICAgICAgICAgIHllYXJfaW50LmFkZENvbmRpdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSA+PSAyMDAwLCBtZXNzYWdlPSJPbmx5IHN1cHBvcnQgeWVhcnMgMjAwMCBhbmQgbGF0ZXIiKQogICAgICAgICAgICBkYXRlX3N0ciA9IHllYXJfaW50ICsgJy8nICsgaW50ZWdlciArICcvJyArIGludGVnZXIKCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gRXhjZXB0aW9uOiBPbmx5IHN1cHBvcnQgeWVhcnMgMjAwMCBhbmQgbGF0ZXIgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQogICAgICAgICIiIgogICAgICAgIG1zZyA9IGt3YXJncy5nZXQoIm1lc3NhZ2UiLCAiZmFpbGVkIHVzZXItZGVmaW5lZCBjb25kaXRpb24iKQogICAgICAgIGV4Y190eXBlID0gUGFyc2VGYXRhbEV4Y2VwdGlvbiBpZiBrd2FyZ3MuZ2V0KCJmYXRhbCIsIEZhbHNlKSBlbHNlIFBhcnNlRXhjZXB0aW9uCiAgICAgICAgZm9yIGZuIGluIGZuczoKICAgICAgICAgICAgZGVmIHBhKHMsbCx0KToKICAgICAgICAgICAgICAgIGlmIG5vdCBib29sKF90cmltX2FyaXR5KGZuKShzLGwsdCkpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIGV4Y190eXBlKHMsbCxtc2cpCiAgICAgICAgICAgIHNlbGYucGFyc2VBY3Rpb24uYXBwZW5kKHBhKQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IHNlbGYuY2FsbER1cmluZ1RyeSBvciBrd2FyZ3MuZ2V0KCJjYWxsRHVyaW5nVHJ5IiwgRmFsc2UpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgc2V0RmFpbEFjdGlvbiggc2VsZiwgZm4gKToKICAgICAgICAiIiJEZWZpbmUgYWN0aW9uIHRvIHBlcmZvcm0gaWYgcGFyc2luZyBmYWlscyBhdCB0aGlzIGV4cHJlc3Npb24uCiAgICAgICAgICAgRmFpbCBhY3RvbiBmbiBpcyBhIGNhbGxhYmxlIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIGFyZ3VtZW50cwogICAgICAgICAgIEN7Zm4ocyxsb2MsZXhwcixlcnIpfSB3aGVyZToKICAgICAgICAgICAgLSBzID0gc3RyaW5nIGJlaW5nIHBhcnNlZAogICAgICAgICAgICAtIGxvYyA9IGxvY2F0aW9uIHdoZXJlIGV4cHJlc3Npb24gbWF0Y2ggd2FzIGF0dGVtcHRlZCBhbmQgZmFpbGVkCiAgICAgICAgICAgIC0gZXhwciA9IHRoZSBwYXJzZSBleHByZXNzaW9uIHRoYXQgZmFpbGVkCiAgICAgICAgICAgIC0gZXJyID0gdGhlIGV4Y2VwdGlvbiB0aHJvd24KICAgICAgICAgICBUaGUgZnVuY3Rpb24gcmV0dXJucyBubyB2YWx1ZS4gIEl0IG1heSB0aHJvdyBDe0x7UGFyc2VGYXRhbEV4Y2VwdGlvbn19CiAgICAgICAgICAgaWYgaXQgaXMgZGVzaXJlZCB0byBzdG9wIHBhcnNpbmcgaW1tZWRpYXRlbHkuIiIiCiAgICAgICAgc2VsZi5mYWlsQWN0aW9uID0gZm4KICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfc2tpcElnbm9yYWJsZXMoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToKICAgICAgICBleHByc0ZvdW5kID0gVHJ1ZQogICAgICAgIHdoaWxlIGV4cHJzRm91bmQ6CiAgICAgICAgICAgIGV4cHJzRm91bmQgPSBGYWxzZQogICAgICAgICAgICBmb3IgZSBpbiBzZWxmLmlnbm9yZUV4cHJzOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYyxkdW1teSA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jICkKICAgICAgICAgICAgICAgICAgICAgICAgZXhwcnNGb3VuZCA9IFRydWUKICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIGxvYwoKICAgIGRlZiBwcmVQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYyApOgogICAgICAgIGlmIHNlbGYuaWdub3JlRXhwcnM6CiAgICAgICAgICAgIGxvYyA9IHNlbGYuX3NraXBJZ25vcmFibGVzKCBpbnN0cmluZywgbG9jICkKCiAgICAgICAgaWYgc2VsZi5za2lwV2hpdGVzcGFjZToKICAgICAgICAgICAgd3QgPSBzZWxmLndoaXRlQ2hhcnMKICAgICAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpCiAgICAgICAgICAgIHdoaWxlIGxvYyA8IGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdIGluIHd0OgogICAgICAgICAgICAgICAgbG9jICs9IDEKCiAgICAgICAgcmV0dXJuIGxvYwoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgcmV0dXJuIGxvYywgW10KCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToKICAgICAgICByZXR1cm4gdG9rZW5saXN0CgogICAgI34gQHByb2ZpbGUKICAgIGRlZiBfcGFyc2VOb0NhY2hlKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSwgY2FsbFByZVBhcnNlPVRydWUgKToKICAgICAgICBkZWJ1Z2dpbmcgPSAoIHNlbGYuZGVidWcgKSAjYW5kIGRvQWN0aW9ucyApCgogICAgICAgIGlmIGRlYnVnZ2luZyBvciBzZWxmLmZhaWxBY3Rpb246CiAgICAgICAgICAgICN+IHByaW50ICgiTWF0Y2giLHNlbGYsImF0IGxvYyIsbG9jLCIoJWQsJWQpIiAlICggbGluZW5vKGxvYyxpbnN0cmluZyksIGNvbChsb2MsaW5zdHJpbmcpICkpCiAgICAgICAgICAgIGlmIChzZWxmLmRlYnVnQWN0aW9uc1swXSApOgogICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMF0oIGluc3RyaW5nLCBsb2MsIHNlbGYgKQogICAgICAgICAgICBpZiBjYWxsUHJlUGFyc2UgYW5kIHNlbGYuY2FsbFByZXBhcnNlOgogICAgICAgICAgICAgICAgcHJlbG9jID0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmVsb2MgPSBsb2MKICAgICAgICAgICAgdG9rZW5zU3RhcnQgPSBwcmVsb2MKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGxvYyx0b2tlbnMgPSBzZWxmLnBhcnNlSW1wbCggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbGVuKGluc3RyaW5nKSwgc2VsZi5lcnJtc2csIHNlbGYgKQogICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGVycjoKICAgICAgICAgICAgICAgICN+IHByaW50ICgiRXhjZXB0aW9uIHJhaXNlZDoiLCBlcnIpCiAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnQWN0aW9uc1syXToKICAgICAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1syXSggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBzZWxmLCBlcnIgKQogICAgICAgICAgICAgICAgaWYgc2VsZi5mYWlsQWN0aW9uOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbEFjdGlvbiggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBzZWxmLCBlcnIgKQogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBjYWxsUHJlUGFyc2UgYW5kIHNlbGYuY2FsbFByZXBhcnNlOgogICAgICAgICAgICAgICAgcHJlbG9jID0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmVsb2MgPSBsb2MKICAgICAgICAgICAgdG9rZW5zU3RhcnQgPSBwcmVsb2MKICAgICAgICAgICAgaWYgc2VsZi5tYXlJbmRleEVycm9yIG9yIGxvYyA+PSBsZW4oaW5zdHJpbmcpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGxvYyx0b2tlbnMgPSBzZWxmLnBhcnNlSW1wbCggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbGVuKGluc3RyaW5nKSwgc2VsZi5lcnJtc2csIHNlbGYgKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9jLHRva2VucyA9IHNlbGYucGFyc2VJbXBsKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQoKICAgICAgICB0b2tlbnMgPSBzZWxmLnBvc3RQYXJzZSggaW5zdHJpbmcsIGxvYywgdG9rZW5zICkKCiAgICAgICAgcmV0VG9rZW5zID0gUGFyc2VSZXN1bHRzKCB0b2tlbnMsIHNlbGYucmVzdWx0c05hbWUsIGFzTGlzdD1zZWxmLnNhdmVBc0xpc3QsIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzICkKICAgICAgICBpZiBzZWxmLnBhcnNlQWN0aW9uIGFuZCAoZG9BY3Rpb25zIG9yIHNlbGYuY2FsbER1cmluZ1RyeSk6CiAgICAgICAgICAgIGlmIGRlYnVnZ2luZzoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBmb3IgZm4gaW4gc2VsZi5wYXJzZUFjdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gZm4oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgcmV0VG9rZW5zICkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW5zIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW5zID0gUGFyc2VSZXN1bHRzKCB0b2tlbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0c05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzTGlzdD1zZWxmLnNhdmVBc0xpc3QgYW5kIGlzaW5zdGFuY2UodG9rZW5zLChQYXJzZVJlc3VsdHMsbGlzdCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cyApCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGVycjoKICAgICAgICAgICAgICAgICAgICAjfiBwcmludCAiRXhjZXB0aW9uIHJhaXNlZCBpbiB1c2VyIHBhcnNlIGFjdGlvbjoiLCBlcnIKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kZWJ1Z0FjdGlvbnNbMl0gKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMl0oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgc2VsZiwgZXJyICkKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZm9yIGZuIGluIHNlbGYucGFyc2VBY3Rpb246CiAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gZm4oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgcmV0VG9rZW5zICkKICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFRva2VucyA9IFBhcnNlUmVzdWx0cyggdG9rZW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0c05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNMaXN0PXNlbGYuc2F2ZUFzTGlzdCBhbmQgaXNpbnN0YW5jZSh0b2tlbnMsKFBhcnNlUmVzdWx0cyxsaXN0KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMgKQoKICAgICAgICBpZiBkZWJ1Z2dpbmc6CiAgICAgICAgICAgICN+IHByaW50ICgiTWF0Y2hlZCIsc2VsZiwiLT4iLHJldFRva2Vucy5hc0xpc3QoKSkKICAgICAgICAgICAgaWYgKHNlbGYuZGVidWdBY3Rpb25zWzFdICk6CiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1sxXSggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBsb2MsIHNlbGYsIHJldFRva2VucyApCgogICAgICAgIHJldHVybiBsb2MsIHJldFRva2VucwoKICAgIGRlZiB0cnlQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYyApOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9RmFsc2UgKVswXQogICAgICAgIGV4Y2VwdCBQYXJzZUZhdGFsRXhjZXB0aW9uOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbiggaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCiAgICAKICAgIGRlZiBjYW5QYXJzZU5leHQoc2VsZiwgaW5zdHJpbmcsIGxvYyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnRyeVBhcnNlKGluc3RyaW5nLCBsb2MpCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbiwgSW5kZXhFcnJvcik6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgY2xhc3MgX1VuYm91bmRlZENhY2hlKG9iamVjdCk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICBjYWNoZSA9IHt9CiAgICAgICAgICAgIHNlbGYubm90X2luX2NhY2hlID0gbm90X2luX2NhY2hlID0gb2JqZWN0KCkKCiAgICAgICAgICAgIGRlZiBnZXQoc2VsZiwga2V5KToKICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5LCBub3RfaW5fY2FjaGUpCgogICAgICAgICAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgICAgICAgICAgY2FjaGVba2V5XSA9IHZhbHVlCgogICAgICAgICAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgICAgICAgICBjYWNoZS5jbGVhcigpCgogICAgICAgICAgICBzZWxmLmdldCA9IHR5cGVzLk1ldGhvZFR5cGUoZ2V0LCBzZWxmKQogICAgICAgICAgICBzZWxmLnNldCA9IHR5cGVzLk1ldGhvZFR5cGUoc2V0LCBzZWxmKQogICAgICAgICAgICBzZWxmLmNsZWFyID0gdHlwZXMuTWV0aG9kVHlwZShjbGVhciwgc2VsZikKCiAgICBpZiBfT3JkZXJlZERpY3QgaXMgbm90IE5vbmU6CiAgICAgICAgY2xhc3MgX0ZpZm9DYWNoZShvYmplY3QpOgogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc2l6ZSk6CiAgICAgICAgICAgICAgICBzZWxmLm5vdF9pbl9jYWNoZSA9IG5vdF9pbl9jYWNoZSA9IG9iamVjdCgpCgogICAgICAgICAgICAgICAgY2FjaGUgPSBfT3JkZXJlZERpY3QoKQoKICAgICAgICAgICAgICAgIGRlZiBnZXQoc2VsZiwga2V5KToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSwgbm90X2luX2NhY2hlKQoKICAgICAgICAgICAgICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgICAgICAgICAgICAgY2FjaGVba2V5XSA9IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGNhY2hlKSA+IHNpemU6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnBvcGl0ZW0oRmFsc2UpCgogICAgICAgICAgICAgICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCkKCiAgICAgICAgICAgICAgICBzZWxmLmdldCA9IHR5cGVzLk1ldGhvZFR5cGUoZ2V0LCBzZWxmKQogICAgICAgICAgICAgICAgc2VsZi5zZXQgPSB0eXBlcy5NZXRob2RUeXBlKHNldCwgc2VsZikKICAgICAgICAgICAgICAgIHNlbGYuY2xlYXIgPSB0eXBlcy5NZXRob2RUeXBlKGNsZWFyLCBzZWxmKQoKICAgIGVsc2U6CiAgICAgICAgY2xhc3MgX0ZpZm9DYWNoZShvYmplY3QpOgogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc2l6ZSk6CiAgICAgICAgICAgICAgICBzZWxmLm5vdF9pbl9jYWNoZSA9IG5vdF9pbl9jYWNoZSA9IG9iamVjdCgpCgogICAgICAgICAgICAgICAgY2FjaGUgPSB7fQogICAgICAgICAgICAgICAga2V5X2ZpZm8gPSBjb2xsZWN0aW9ucy5kZXF1ZShbXSwgc2l6ZSkKCiAgICAgICAgICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXksIG5vdF9pbl9jYWNoZSkKCiAgICAgICAgICAgICAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgICAgICAgICAgICAgIGNhY2hlW2tleV0gPSB2YWx1ZQogICAgICAgICAgICAgICAgICAgIGlmIGxlbihjYWNoZSkgPiBzaXplOgogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5wb3Aoa2V5X2ZpZm8ucG9wbGVmdCgpLCBOb25lKQogICAgICAgICAgICAgICAgICAgIGtleV9maWZvLmFwcGVuZChrZXkpCgogICAgICAgICAgICAgICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCkKICAgICAgICAgICAgICAgICAgICBrZXlfZmlmby5jbGVhcigpCgogICAgICAgICAgICAgICAgc2VsZi5nZXQgPSB0eXBlcy5NZXRob2RUeXBlKGdldCwgc2VsZikKICAgICAgICAgICAgICAgIHNlbGYuc2V0ID0gdHlwZXMuTWV0aG9kVHlwZShzZXQsIHNlbGYpCiAgICAgICAgICAgICAgICBzZWxmLmNsZWFyID0gdHlwZXMuTWV0aG9kVHlwZShjbGVhciwgc2VsZikKCiAgICAjIGFyZ3VtZW50IGNhY2hlIGZvciBvcHRpbWl6aW5nIHJlcGVhdGVkIGNhbGxzIHdoZW4gYmFja3RyYWNraW5nIHRocm91Z2ggcmVjdXJzaXZlIGV4cHJlc3Npb25zCiAgICBwYWNrcmF0X2NhY2hlID0ge30gIyB0aGlzIGlzIHNldCBsYXRlciBieSBlbmFibGVkUGFja3JhdCgpOyB0aGlzIGlzIGhlcmUgc28gdGhhdCByZXNldENhY2hlKCkgZG9lc24ndCBmYWlsCiAgICBwYWNrcmF0X2NhY2hlX2xvY2sgPSBSTG9jaygpCiAgICBwYWNrcmF0X2NhY2hlX3N0YXRzID0gWzAsIDBdCgogICAgIyB0aGlzIG1ldGhvZCBnZXRzIHJlcGVhdGVkbHkgY2FsbGVkIGR1cmluZyBiYWNrdHJhY2tpbmcgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMgLQogICAgIyB3ZSBjYW4gY2FjaGUgdGhlc2UgYXJndW1lbnRzIGFuZCBzYXZlIG91cnNlbHZlcyB0aGUgdHJvdWJsZSBvZiByZS1wYXJzaW5nIHRoZSBjb250YWluZWQgZXhwcmVzc2lvbgogICAgZGVmIF9wYXJzZUNhY2hlKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSwgY2FsbFByZVBhcnNlPVRydWUgKToKICAgICAgICBISVQsIE1JU1MgPSAwLCAxCiAgICAgICAgbG9va3VwID0gKHNlbGYsIGluc3RyaW5nLCBsb2MsIGNhbGxQcmVQYXJzZSwgZG9BY3Rpb25zKQogICAgICAgIHdpdGggUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX2xvY2s6CiAgICAgICAgICAgIGNhY2hlID0gUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlCiAgICAgICAgICAgIHZhbHVlID0gY2FjaGUuZ2V0KGxvb2t1cCkKICAgICAgICAgICAgaWYgdmFsdWUgaXMgY2FjaGUubm90X2luX2NhY2hlOgogICAgICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzW01JU1NdICs9IDEKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX3BhcnNlTm9DYWNoZShpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgcGU6CiAgICAgICAgICAgICAgICAgICAgIyBjYWNoZSBhIGNvcHkgb2YgdGhlIGV4Y2VwdGlvbiwgd2l0aG91dCB0aGUgdHJhY2ViYWNrCiAgICAgICAgICAgICAgICAgICAgY2FjaGUuc2V0KGxvb2t1cCwgcGUuX19jbGFzc19fKCpwZS5hcmdzKSkKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjYWNoZS5zZXQobG9va3VwLCAodmFsdWVbMF0sIHZhbHVlWzFdLmNvcHkoKSkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHNbSElUXSArPSAxCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBFeGNlcHRpb24pOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIHZhbHVlCiAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlWzBdLCB2YWx1ZVsxXS5jb3B5KCkpCgogICAgX3BhcnNlID0gX3BhcnNlTm9DYWNoZQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiByZXNldENhY2hlKCk6CiAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlLmNsZWFyKCkKICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHNbOl0gPSBbMF0gKiBsZW4oUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzKQoKICAgIF9wYWNrcmF0RW5hYmxlZCA9IEZhbHNlCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZW5hYmxlUGFja3JhdChjYWNoZV9zaXplX2xpbWl0PTEyOCk6CiAgICAgICAgIiIiRW5hYmxlcyAicGFja3JhdCIgcGFyc2luZywgd2hpY2ggYWRkcyBtZW1vaXppbmcgdG8gdGhlIHBhcnNpbmcgbG9naWMuCiAgICAgICAgICAgUmVwZWF0ZWQgcGFyc2UgYXR0ZW1wdHMgYXQgdGhlIHNhbWUgc3RyaW5nIGxvY2F0aW9uICh3aGljaCBoYXBwZW5zCiAgICAgICAgICAgb2Z0ZW4gaW4gbWFueSBjb21wbGV4IGdyYW1tYXJzKSBjYW4gaW1tZWRpYXRlbHkgcmV0dXJuIGEgY2FjaGVkIHZhbHVlLAogICAgICAgICAgIGluc3RlYWQgb2YgcmUtZXhlY3V0aW5nIHBhcnNpbmcvdmFsaWRhdGluZyBjb2RlLiAgTWVtb2l6aW5nIGlzIGRvbmUgb2YKICAgICAgICAgICBib3RoIHZhbGlkIHJlc3VsdHMgYW5kIHBhcnNpbmcgZXhjZXB0aW9ucy4KICAgICAgICAgICAKICAgICAgICAgICBQYXJhbWV0ZXJzOgogICAgICAgICAgICAtIGNhY2hlX3NpemVfbGltaXQgLSAoZGVmYXVsdD1DezEyOH0pIC0gaWYgYW4gaW50ZWdlciB2YWx1ZSBpcyBwcm92aWRlZAogICAgICAgICAgICAgIHdpbGwgbGltaXQgdGhlIHNpemUgb2YgdGhlIHBhY2tyYXQgY2FjaGU7IGlmIE5vbmUgaXMgcGFzc2VkLCB0aGVuCiAgICAgICAgICAgICAgdGhlIGNhY2hlIHNpemUgd2lsbCBiZSB1bmJvdW5kZWQ7IGlmIDAgaXMgcGFzc2VkLCB0aGUgY2FjaGUgd2lsbAogICAgICAgICAgICAgIGJlIGVmZmVjdGl2ZWx5IGRpc2FibGVkLgogICAgICAgICAgICAKICAgICAgICAgICBUaGlzIHNwZWVkdXAgbWF5IGJyZWFrIGV4aXN0aW5nIHByb2dyYW1zIHRoYXQgdXNlIHBhcnNlIGFjdGlvbnMgdGhhdAogICAgICAgICAgIGhhdmUgc2lkZS1lZmZlY3RzLiAgRm9yIHRoaXMgcmVhc29uLCBwYWNrcmF0IHBhcnNpbmcgaXMgZGlzYWJsZWQgd2hlbgogICAgICAgICAgIHlvdSBmaXJzdCBpbXBvcnQgcHlwYXJzaW5nLiAgVG8gYWN0aXZhdGUgdGhlIHBhY2tyYXQgZmVhdHVyZSwgeW91cgogICAgICAgICAgIHByb2dyYW0gbXVzdCBjYWxsIHRoZSBjbGFzcyBtZXRob2QgQ3tQYXJzZXJFbGVtZW50LmVuYWJsZVBhY2tyYXQoKX0uICBJZgogICAgICAgICAgIHlvdXIgcHJvZ3JhbSB1c2VzIEN7cHN5Y299IHRvICJjb21waWxlIGFzIHlvdSBnbyIsIHlvdSBtdXN0IGNhbGwKICAgICAgICAgICBDe2VuYWJsZVBhY2tyYXR9IGJlZm9yZSBjYWxsaW5nIEN7cHN5Y28uZnVsbCgpfS4gIElmIHlvdSBkbyBub3QgZG8gdGhpcywKICAgICAgICAgICBQeXRob24gd2lsbCBjcmFzaC4gIEZvciBiZXN0IHJlc3VsdHMsIGNhbGwgQ3tlbmFibGVQYWNrcmF0KCl9IGltbWVkaWF0ZWx5CiAgICAgICAgICAgYWZ0ZXIgaW1wb3J0aW5nIHB5cGFyc2luZy4KICAgICAgICAgICAKICAgICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgICAgaW1wb3J0IHB5cGFyc2luZwogICAgICAgICAgICAgICBweXBhcnNpbmcuUGFyc2VyRWxlbWVudC5lbmFibGVQYWNrcmF0KCkKICAgICAgICAiIiIKICAgICAgICBpZiBub3QgUGFyc2VyRWxlbWVudC5fcGFja3JhdEVuYWJsZWQ6CiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuX3BhY2tyYXRFbmFibGVkID0gVHJ1ZQogICAgICAgICAgICBpZiBjYWNoZV9zaXplX2xpbWl0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUgPSBQYXJzZXJFbGVtZW50Ll9VbmJvdW5kZWRDYWNoZSgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUgPSBQYXJzZXJFbGVtZW50Ll9GaWZvQ2FjaGUoY2FjaGVfc2l6ZV9saW1pdCkKICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5fcGFyc2UgPSBQYXJzZXJFbGVtZW50Ll9wYXJzZUNhY2hlCgogICAgZGVmIHBhcnNlU3RyaW5nKCBzZWxmLCBpbnN0cmluZywgcGFyc2VBbGw9RmFsc2UgKToKICAgICAgICAiIiIKICAgICAgICBFeGVjdXRlIHRoZSBwYXJzZSBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIHN0cmluZy4KICAgICAgICBUaGlzIGlzIHRoZSBtYWluIGludGVyZmFjZSB0byB0aGUgY2xpZW50IGNvZGUsIG9uY2UgdGhlIGNvbXBsZXRlCiAgICAgICAgZXhwcmVzc2lvbiBoYXMgYmVlbiBidWlsdC4KCiAgICAgICAgSWYgeW91IHdhbnQgdGhlIGdyYW1tYXIgdG8gcmVxdWlyZSB0aGF0IHRoZSBlbnRpcmUgaW5wdXQgc3RyaW5nIGJlCiAgICAgICAgc3VjY2Vzc2Z1bGx5IHBhcnNlZCwgdGhlbiBzZXQgQ3twYXJzZUFsbH0gdG8gVHJ1ZSAoZXF1aXZhbGVudCB0byBlbmRpbmcKICAgICAgICB0aGUgZ3JhbW1hciB3aXRoIEN7THtTdHJpbmdFbmQoKX19KS4KCiAgICAgICAgTm90ZTogQ3twYXJzZVN0cmluZ30gaW1wbGljaXRseSBjYWxscyBDe2V4cGFuZHRhYnMoKX0gb24gdGhlIGlucHV0IHN0cmluZywKICAgICAgICBpbiBvcmRlciB0byByZXBvcnQgcHJvcGVyIGNvbHVtbiBudW1iZXJzIGluIHBhcnNlIGFjdGlvbnMuCiAgICAgICAgSWYgdGhlIGlucHV0IHN0cmluZyBjb250YWlucyB0YWJzIGFuZAogICAgICAgIHRoZSBncmFtbWFyIHVzZXMgcGFyc2UgYWN0aW9ucyB0aGF0IHVzZSB0aGUgQ3tsb2N9IGFyZ3VtZW50IHRvIGluZGV4IGludG8gdGhlCiAgICAgICAgc3RyaW5nIGJlaW5nIHBhcnNlZCwgeW91IGNhbiBlbnN1cmUgeW91IGhhdmUgYSBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIGlucHV0CiAgICAgICAgc3RyaW5nIGJ5OgogICAgICAgICAtIGNhbGxpbmcgQ3twYXJzZVdpdGhUYWJzfSBvbiB5b3VyIGdyYW1tYXIgYmVmb3JlIGNhbGxpbmcgQ3twYXJzZVN0cmluZ30KICAgICAgICAgICAoc2VlIEx7SXtwYXJzZVdpdGhUYWJzfTxwYXJzZVdpdGhUYWJzPn0pCiAgICAgICAgIC0gZGVmaW5lIHlvdXIgcGFyc2UgYWN0aW9uIHVzaW5nIHRoZSBmdWxsIEN7KHMsbG9jLHRva3MpfSBzaWduYXR1cmUsIGFuZAogICAgICAgICAgIHJlZmVyZW5jZSB0aGUgaW5wdXQgc3RyaW5nIHVzaW5nIHRoZSBwYXJzZSBhY3Rpb24ncyBDe3N9IGFyZ3VtZW50CiAgICAgICAgIC0gZXhwbGljdGx5IGV4cGFuZCB0aGUgdGFicyBpbiB5b3VyIGlucHV0IHN0cmluZyBiZWZvcmUgY2FsbGluZwogICAgICAgICAgIEN7cGFyc2VTdHJpbmd9CiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIFdvcmQoJ2EnKS5wYXJzZVN0cmluZygnYWFhYWFiYWFhJykgICMgLT4gWydhYWFhYSddCiAgICAgICAgICAgIFdvcmQoJ2EnKS5wYXJzZVN0cmluZygnYWFhYWFiYWFhJywgcGFyc2VBbGw9VHJ1ZSkgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBlbmQgb2YgdGV4dAogICAgICAgICIiIgogICAgICAgIFBhcnNlckVsZW1lbnQucmVzZXRDYWNoZSgpCiAgICAgICAgaWYgbm90IHNlbGYuc3RyZWFtbGluZWQ6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtbGluZSgpCiAgICAgICAgICAgICN+IHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUKICAgICAgICBmb3IgZSBpbiBzZWxmLmlnbm9yZUV4cHJzOgogICAgICAgICAgICBlLnN0cmVhbWxpbmUoKQogICAgICAgIGlmIG5vdCBzZWxmLmtlZXBUYWJzOgogICAgICAgICAgICBpbnN0cmluZyA9IGluc3RyaW5nLmV4cGFuZHRhYnMoKQogICAgICAgIHRyeToKICAgICAgICAgICAgbG9jLCB0b2tlbnMgPSBzZWxmLl9wYXJzZSggaW5zdHJpbmcsIDAgKQogICAgICAgICAgICBpZiBwYXJzZUFsbDoKICAgICAgICAgICAgICAgIGxvYyA9IHNlbGYucHJlUGFyc2UoIGluc3RyaW5nLCBsb2MgKQogICAgICAgICAgICAgICAgc2UgPSBFbXB0eSgpICsgU3RyaW5nRW5kKCkKICAgICAgICAgICAgICAgIHNlLl9wYXJzZSggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlCiAgICAgICAgICAgICAgICByYWlzZSBleGMKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gdG9rZW5zCgogICAgZGVmIHNjYW5TdHJpbmcoIHNlbGYsIGluc3RyaW5nLCBtYXhNYXRjaGVzPV9NQVhfSU5ULCBvdmVybGFwPUZhbHNlICk6CiAgICAgICAgIiIiCiAgICAgICAgU2NhbiB0aGUgaW5wdXQgc3RyaW5nIGZvciBleHByZXNzaW9uIG1hdGNoZXMuICBFYWNoIG1hdGNoIHdpbGwgcmV0dXJuIHRoZQogICAgICAgIG1hdGNoaW5nIHRva2Vucywgc3RhcnQgbG9jYXRpb24sIGFuZCBlbmQgbG9jYXRpb24uICBNYXkgYmUgY2FsbGVkIHdpdGggb3B0aW9uYWwKICAgICAgICBDe21heE1hdGNoZXN9IGFyZ3VtZW50LCB0byBjbGlwIHNjYW5uaW5nIGFmdGVyICduJyBtYXRjaGVzIGFyZSBmb3VuZC4gIElmCiAgICAgICAgQ3tvdmVybGFwfSBpcyBzcGVjaWZpZWQsIHRoZW4gb3ZlcmxhcHBpbmcgbWF0Y2hlcyB3aWxsIGJlIHJlcG9ydGVkLgoKICAgICAgICBOb3RlIHRoYXQgdGhlIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb25zIGFyZSByZXBvcnRlZCByZWxhdGl2ZSB0byB0aGUgc3RyaW5nCiAgICAgICAgYmVpbmcgcGFyc2VkLiAgU2VlIEx7SXtwYXJzZVN0cmluZ308cGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwYXJzaW5nCiAgICAgICAgc3RyaW5ncyB3aXRoIGVtYmVkZGVkIHRhYnMuCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBzb3VyY2UgPSAic2xkamYxMjNsc2RqamtmMzQ1c2xka2pmODc5bGtqc2ZkOTg3IgogICAgICAgICAgICBwcmludChzb3VyY2UpCiAgICAgICAgICAgIGZvciB0b2tlbnMsc3RhcnQsZW5kIGluIFdvcmQoYWxwaGFzKS5zY2FuU3RyaW5nKHNvdXJjZSk6CiAgICAgICAgICAgICAgICBwcmludCgnICcqc3RhcnQgKyAnXicqKGVuZC1zdGFydCkpCiAgICAgICAgICAgICAgICBwcmludCgnICcqc3RhcnQgKyB0b2tlbnNbMF0pCiAgICAgICAgCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAKICAgICAgICAgICAgc2xkamYxMjNsc2RqamtmMzQ1c2xka2pmODc5bGtqc2ZkOTg3CiAgICAgICAgICAgIF5eXl5eCiAgICAgICAgICAgIHNsZGpmCiAgICAgICAgICAgICAgICAgICAgXl5eXl5eXgogICAgICAgICAgICAgICAgICAgIGxzZGpqa2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZGtqZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGtqc2ZkCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuc3RyZWFtbGluZWQ6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtbGluZSgpCiAgICAgICAgZm9yIGUgaW4gc2VsZi5pZ25vcmVFeHByczoKICAgICAgICAgICAgZS5zdHJlYW1saW5lKCkKCiAgICAgICAgaWYgbm90IHNlbGYua2VlcFRhYnM6CiAgICAgICAgICAgIGluc3RyaW5nID0gX3VzdHIoaW5zdHJpbmcpLmV4cGFuZHRhYnMoKQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQogICAgICAgIGxvYyA9IDAKICAgICAgICBwcmVwYXJzZUZuID0gc2VsZi5wcmVQYXJzZQogICAgICAgIHBhcnNlRm4gPSBzZWxmLl9wYXJzZQogICAgICAgIFBhcnNlckVsZW1lbnQucmVzZXRDYWNoZSgpCiAgICAgICAgbWF0Y2hlcyA9IDAKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdoaWxlIGxvYyA8PSBpbnN0cmxlbiBhbmQgbWF0Y2hlcyA8IG1heE1hdGNoZXM6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcHJlbG9jID0gcHJlcGFyc2VGbiggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgICAgICAgICAgICAgbmV4dExvYyx0b2tlbnMgPSBwYXJzZUZuKCBpbnN0cmluZywgcHJlbG9jLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgIGxvYyA9IHByZWxvYysxCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmIG5leHRMb2MgPiBsb2M6CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgKz0gMQogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbnMsIHByZWxvYywgbmV4dExvYwogICAgICAgICAgICAgICAgICAgICAgICBpZiBvdmVybGFwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dGxvYyA9IHByZXBhcnNlRm4oIGluc3RyaW5nLCBsb2MgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmV4dGxvYyA+IGxvYzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MgPSBuZXh0TG9jCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYyArPSAxCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MgPSBuZXh0TG9jCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbG9jID0gcHJlbG9jKzEKICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UKICAgICAgICAgICAgICAgIHJhaXNlIGV4YwoKICAgIGRlZiB0cmFuc2Zvcm1TdHJpbmcoIHNlbGYsIGluc3RyaW5nICk6CiAgICAgICAgIiIiCiAgICAgICAgRXh0ZW5zaW9uIHRvIEN7THtzY2FuU3RyaW5nfX0sIHRvIG1vZGlmeSBtYXRjaGluZyB0ZXh0IHdpdGggbW9kaWZpZWQgdG9rZW5zIHRoYXQgbWF5CiAgICAgICAgYmUgcmV0dXJuZWQgZnJvbSBhIHBhcnNlIGFjdGlvbi4gIFRvIHVzZSBDe3RyYW5zZm9ybVN0cmluZ30sIGRlZmluZSBhIGdyYW1tYXIgYW5kCiAgICAgICAgYXR0YWNoIGEgcGFyc2UgYWN0aW9uIHRvIGl0IHRoYXQgbW9kaWZpZXMgdGhlIHJldHVybmVkIHRva2VuIGxpc3QuCiAgICAgICAgSW52b2tpbmcgQ3t0cmFuc2Zvcm1TdHJpbmcoKX0gb24gYSB0YXJnZXQgc3RyaW5nIHdpbGwgdGhlbiBzY2FuIGZvciBtYXRjaGVzLAogICAgICAgIGFuZCByZXBsYWNlIHRoZSBtYXRjaGVkIHRleHQgcGF0dGVybnMgYWNjb3JkaW5nIHRvIHRoZSBsb2dpYyBpbiB0aGUgcGFyc2UKICAgICAgICBhY3Rpb24uICBDe3RyYW5zZm9ybVN0cmluZygpfSByZXR1cm5zIHRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgc3RyaW5nLgogICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQogICAgICAgICAgICB3ZC5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXS50aXRsZSgpKQogICAgICAgICAgICAKICAgICAgICAgICAgcHJpbnQod2QudHJhbnNmb3JtU3RyaW5nKCJub3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCBtYWRlIGdsb3Jpb3VzIHN1bW1lciBieSB0aGlzIHN1biBvZiB5b3JrLiIpKQogICAgICAgIFByaW50czo6CiAgICAgICAgICAgIE5vdyBJcyBUaGUgV2ludGVyIE9mIE91ciBEaXNjb250ZW50IE1hZGUgR2xvcmlvdXMgU3VtbWVyIEJ5IFRoaXMgU3VuIE9mIFlvcmsuCiAgICAgICAgIiIiCiAgICAgICAgb3V0ID0gW10KICAgICAgICBsYXN0RSA9IDAKICAgICAgICAjIGZvcmNlIHByZXNlcnZhdGlvbiBvZiA8VEFCPnMsIHRvIG1pbmltaXplIHVud2FudGVkIHRyYW5zZm9ybWF0aW9uIG9mIHN0cmluZywgYW5kIHRvCiAgICAgICAgIyBrZWVwIHN0cmluZyBsb2NzIHN0cmFpZ2h0IGJldHdlZW4gdHJhbnNmb3JtU3RyaW5nIGFuZCBzY2FuU3RyaW5nCiAgICAgICAgc2VsZi5rZWVwVGFicyA9IFRydWUKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZvciB0LHMsZSBpbiBzZWxmLnNjYW5TdHJpbmcoIGluc3RyaW5nICk6CiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCBpbnN0cmluZ1tsYXN0RTpzXSApCiAgICAgICAgICAgICAgICBpZiB0OgogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodCxQYXJzZVJlc3VsdHMpOgogICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gdC5hc0xpc3QoKQogICAgICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh0LGxpc3QpOgogICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gdAogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQodCkKICAgICAgICAgICAgICAgIGxhc3RFID0gZQogICAgICAgICAgICBvdXQuYXBwZW5kKGluc3RyaW5nW2xhc3RFOl0pCiAgICAgICAgICAgIG91dCA9IFtvIGZvciBvIGluIG91dCBpZiBvXQogICAgICAgICAgICByZXR1cm4gIiIuam9pbihtYXAoX3VzdHIsX2ZsYXR0ZW4ob3V0KSkpCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlCiAgICAgICAgICAgICAgICByYWlzZSBleGMKCiAgICBkZWYgc2VhcmNoU3RyaW5nKCBzZWxmLCBpbnN0cmluZywgbWF4TWF0Y2hlcz1fTUFYX0lOVCApOgogICAgICAgICIiIgogICAgICAgIEFub3RoZXIgZXh0ZW5zaW9uIHRvIEN7THtzY2FuU3RyaW5nfX0sIHNpbXBsaWZ5aW5nIHRoZSBhY2Nlc3MgdG8gdGhlIHRva2VucyBmb3VuZAogICAgICAgIHRvIG1hdGNoIHRoZSBnaXZlbiBwYXJzZSBleHByZXNzaW9uLiAgTWF5IGJlIGNhbGxlZCB3aXRoIG9wdGlvbmFsCiAgICAgICAgQ3ttYXhNYXRjaGVzfSBhcmd1bWVudCwgdG8gY2xpcCBzZWFyY2hpbmcgYWZ0ZXIgJ24nIG1hdGNoZXMgYXJlIGZvdW5kLgogICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICAjIGEgY2FwaXRhbGl6ZWQgd29yZCBzdGFydHMgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyLCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgbG93ZXJjYXNlIGxldHRlcnMKICAgICAgICAgICAgY2FwX3dvcmQgPSBXb3JkKGFscGhhcy51cHBlcigpLCBhbHBoYXMubG93ZXIoKSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHByaW50KGNhcF93b3JkLnNlYXJjaFN0cmluZygiTW9yZSB0aGFuIElyb24sIG1vcmUgdGhhbiBMZWFkLCBtb3JlIHRoYW4gR29sZCBJIG5lZWQgRWxlY3RyaWNpdHkiKSkKICAgICAgICBwcmludHM6OgogICAgICAgICAgICBbJ01vcmUnLCAnSXJvbicsICdMZWFkJywgJ0dvbGQnLCAnSSddCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gUGFyc2VSZXN1bHRzKFsgdCBmb3IgdCxzLGUgaW4gc2VsZi5zY2FuU3RyaW5nKCBpbnN0cmluZywgbWF4TWF0Y2hlcyApIF0pCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlCiAgICAgICAgICAgICAgICByYWlzZSBleGMKCiAgICBkZWYgc3BsaXQoc2VsZiwgaW5zdHJpbmcsIG1heHNwbGl0PV9NQVhfSU5ULCBpbmNsdWRlU2VwYXJhdG9ycz1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgR2VuZXJhdG9yIG1ldGhvZCB0byBzcGxpdCBhIHN0cmluZyB1c2luZyB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhcyBhIHNlcGFyYXRvci4KICAgICAgICBNYXkgYmUgY2FsbGVkIHdpdGggb3B0aW9uYWwgQ3ttYXhzcGxpdH0gYXJndW1lbnQsIHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygc3BsaXRzOwogICAgICAgIGFuZCB0aGUgb3B0aW9uYWwgQ3tpbmNsdWRlU2VwYXJhdG9yc30gYXJndW1lbnQgKGRlZmF1bHQ9Q3tGYWxzZX0pLCBpZiB0aGUgc2VwYXJhdGluZwogICAgICAgIG1hdGNoaW5nIHRleHQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBzcGxpdCByZXN1bHRzLgogICAgICAgIAogICAgICAgIEV4YW1wbGU6OiAgICAgICAgCiAgICAgICAgICAgIHB1bmMgPSBvbmVPZihsaXN0KCIuLDs6Ly0hPyIpKQogICAgICAgICAgICBwcmludChsaXN0KHB1bmMuc3BsaXQoIlRoaXMsIHRoaXM/LCB0aGlzIHNlbnRlbmNlLCBpcyBiYWRseSBwdW5jdHVhdGVkISIpKSkKICAgICAgICBwcmludHM6OgogICAgICAgICAgICBbJ1RoaXMnLCAnIHRoaXMnLCAnJywgJyB0aGlzIHNlbnRlbmNlJywgJyBpcyBiYWRseSBwdW5jdHVhdGVkJywgJyddCiAgICAgICAgIiIiCiAgICAgICAgc3BsaXRzID0gMAogICAgICAgIGxhc3QgPSAwCiAgICAgICAgZm9yIHQscyxlIGluIHNlbGYuc2NhblN0cmluZyhpbnN0cmluZywgbWF4TWF0Y2hlcz1tYXhzcGxpdCk6CiAgICAgICAgICAgIHlpZWxkIGluc3RyaW5nW2xhc3Q6c10KICAgICAgICAgICAgaWYgaW5jbHVkZVNlcGFyYXRvcnM6CiAgICAgICAgICAgICAgICB5aWVsZCB0WzBdCiAgICAgICAgICAgIGxhc3QgPSBlCiAgICAgICAgeWllbGQgaW5zdHJpbmdbbGFzdDpdCgogICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiArIG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7QW5kfX0uIEFkZGluZyBzdHJpbmdzIHRvIGEgUGFyc2VyRWxlbWVudAogICAgICAgIGNvbnZlcnRzIHRoZW0gdG8gTHtMaXRlcmFsfXMgYnkgZGVmYXVsdC4KICAgICAgICAKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgZ3JlZXQgPSBXb3JkKGFscGhhcykgKyAiLCIgKyBXb3JkKGFscGhhcykgKyAiISIKICAgICAgICAgICAgaGVsbG8gPSAiSGVsbG8sIFdvcmxkISIKICAgICAgICAgICAgcHJpbnQgKGhlbGxvLCAiLT4iLCBncmVldC5wYXJzZVN0cmluZyhoZWxsbykpCiAgICAgICAgUHJpbnRzOjoKICAgICAgICAgICAgSGVsbG8sIFdvcmxkISAtPiBbJ0hlbGxvJywgJywnLCAnV29ybGQnLCAnISddCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIEFuZCggWyBzZWxmLCBvdGhlciBdICkKCiAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiArIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gb3RoZXIgKyBzZWxmCgogICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIC0gb3BlcmF0b3IsIHJldHVybnMgQ3tMe0FuZH19IHdpdGggZXJyb3Igc3RvcAogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBBbmQoIFsgc2VsZiwgQW5kLl9FcnJvclN0b3AoKSwgb3RoZXIgXSApCgogICAgZGVmIF9fcnN1Yl9fKHNlbGYsIG90aGVyICk6CiAgICAgICAgIiIiCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgLSBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19CiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIG90aGVyIC0gc2VsZgoKICAgIGRlZiBfX211bF9fKHNlbGYsb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICogb3BlcmF0b3IsIGFsbG93cyB1c2Ugb2YgQ3tleHByICogM30gaW4gcGxhY2Ugb2YKICAgICAgICBDe2V4cHIgKyBleHByICsgZXhwcn0uICBFeHByZXNzaW9ucyBtYXkgYWxzbyBtZSBtdWx0aXBsaWVkIGJ5IGEgMi1pbnRlZ2VyCiAgICAgICAgdHVwbGUsIHNpbWlsYXIgdG8gQ3t7bWluLG1heH19IG11bHRpcGxpZXJzIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBUdXBsZXMKICAgICAgICBtYXkgYWxzbyBpbmNsdWRlIEN7Tm9uZX0gYXMgaW46CiAgICAgICAgIC0gQ3tleHByKihuLE5vbmUpfSBvciBDe2V4cHIqKG4sKX0gaXMgZXF1aXZhbGVudAogICAgICAgICAgICAgIHRvIEN7ZXhwcipuICsgTHtaZXJvT3JNb3JlfShleHByKX0KICAgICAgICAgICAgICAocmVhZCBhcyAiYXQgbGVhc3QgbiBpbnN0YW5jZXMgb2YgQ3tleHByfSIpCiAgICAgICAgIC0gQ3tleHByKihOb25lLG4pfSBpcyBlcXVpdmFsZW50IHRvIEN7ZXhwciooMCxuKX0KICAgICAgICAgICAgICAocmVhZCBhcyAiMCB0byBuIGluc3RhbmNlcyBvZiBDe2V4cHJ9IikKICAgICAgICAgLSBDe2V4cHIqKE5vbmUsTm9uZSl9IGlzIGVxdWl2YWxlbnQgdG8gQ3tMe1plcm9Pck1vcmV9KGV4cHIpfQogICAgICAgICAtIEN7ZXhwciooMSxOb25lKX0gaXMgZXF1aXZhbGVudCB0byBDe0x7T25lT3JNb3JlfShleHByKX0KCiAgICAgICAgTm90ZSB0aGF0IEN7ZXhwciooTm9uZSxuKX0gZG9lcyBub3QgcmFpc2UgYW4gZXhjZXB0aW9uIGlmCiAgICAgICAgbW9yZSB0aGFuIG4gZXhwcnMgZXhpc3QgaW4gdGhlIGlucHV0IHN0cmVhbTsgdGhhdCBpcywKICAgICAgICBDe2V4cHIqKE5vbmUsbil9IGRvZXMgbm90IGVuZm9yY2UgYSBtYXhpbXVtIG51bWJlciBvZiBleHByCiAgICAgICAgb2NjdXJyZW5jZXMuICBJZiB0aGlzIGJlaGF2aW9yIGlzIGRlc2lyZWQsIHRoZW4gd3JpdGUKICAgICAgICBDe2V4cHIqKE5vbmUsbikgKyB+ZXhwcn0KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLGludCk6CiAgICAgICAgICAgIG1pbkVsZW1lbnRzLCBvcHRFbGVtZW50cyA9IG90aGVyLDAKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsdHVwbGUpOgogICAgICAgICAgICBvdGhlciA9IChvdGhlciArIChOb25lLCBOb25lKSlbOjJdCiAgICAgICAgICAgIGlmIG90aGVyWzBdIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBvdGhlciA9ICgwLCBvdGhlclsxXSkKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlclswXSxpbnQpIGFuZCBvdGhlclsxXSBpcyBOb25lOgogICAgICAgICAgICAgICAgaWYgb3RoZXJbMF0gPT0gMDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWmVyb09yTW9yZShzZWxmKQogICAgICAgICAgICAgICAgaWYgb3RoZXJbMF0gPT0gMToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT25lT3JNb3JlKHNlbGYpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmKm90aGVyWzBdICsgWmVyb09yTW9yZShzZWxmKQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXJbMF0saW50KSBhbmQgaXNpbnN0YW5jZShvdGhlclsxXSxpbnQpOgogICAgICAgICAgICAgICAgbWluRWxlbWVudHMsIG9wdEVsZW1lbnRzID0gb3RoZXIKICAgICAgICAgICAgICAgIG9wdEVsZW1lbnRzIC09IG1pbkVsZW1lbnRzCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImNhbm5vdCBtdWx0aXBseSAnUGFyc2VyRWxlbWVudCcgYW5kICgnJXMnLCclcycpIG9iamVjdHMiLCB0eXBlKG90aGVyWzBdKSx0eXBlKG90aGVyWzFdKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImNhbm5vdCBtdWx0aXBseSAnUGFyc2VyRWxlbWVudCcgYW5kICclcycgb2JqZWN0cyIsIHR5cGUob3RoZXIpKQoKICAgICAgICBpZiBtaW5FbGVtZW50cyA8IDA6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBtdWx0aXBseSBQYXJzZXJFbGVtZW50IGJ5IG5lZ2F0aXZlIHZhbHVlIikKICAgICAgICBpZiBvcHRFbGVtZW50cyA8IDA6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInNlY29uZCB0dXBsZSB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gZmlyc3QgdHVwbGUgdmFsdWUiKQogICAgICAgIGlmIG1pbkVsZW1lbnRzID09IG9wdEVsZW1lbnRzID09IDA6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBtdWx0aXBseSBQYXJzZXJFbGVtZW50IGJ5IDAgb3IgKDAsMCkiKQoKICAgICAgICBpZiAob3B0RWxlbWVudHMpOgogICAgICAgICAgICBkZWYgbWFrZU9wdGlvbmFsTGlzdChuKToKICAgICAgICAgICAgICAgIGlmIG4+MToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwoc2VsZiArIG1ha2VPcHRpb25hbExpc3Qobi0xKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsKHNlbGYpCiAgICAgICAgICAgIGlmIG1pbkVsZW1lbnRzOgogICAgICAgICAgICAgICAgaWYgbWluRWxlbWVudHMgPT0gMToKICAgICAgICAgICAgICAgICAgICByZXQgPSBzZWxmICsgbWFrZU9wdGlvbmFsTGlzdChvcHRFbGVtZW50cykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gQW5kKFtzZWxmXSptaW5FbGVtZW50cykgKyBtYWtlT3B0aW9uYWxMaXN0KG9wdEVsZW1lbnRzKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0ID0gbWFrZU9wdGlvbmFsTGlzdChvcHRFbGVtZW50cykKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBtaW5FbGVtZW50cyA9PSAxOgogICAgICAgICAgICAgICAgcmV0ID0gc2VsZgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0ID0gQW5kKFtzZWxmXSptaW5FbGVtZW50cykKICAgICAgICByZXR1cm4gcmV0CgogICAgZGVmIF9fcm11bF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fX211bF9fKG90aGVyKQoKICAgIGRlZiBfX29yX18oc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiB8IG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7TWF0Y2hGaXJzdH19CiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIE1hdGNoRmlyc3QoIFsgc2VsZiwgb3RoZXIgXSApCgogICAgZGVmIF9fcm9yX18oc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiB8IG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gb3RoZXIgfCBzZWxmCgogICAgZGVmIF9feG9yX18oc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBeIG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7T3J9fQogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBPciggWyBzZWxmLCBvdGhlciBdICkKCiAgICBkZWYgX19yeG9yX18oc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBeIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gb3RoZXIgXiBzZWxmCgogICAgZGVmIF9fYW5kX18oc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAmIG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7RWFjaH19CiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIEVhY2goIFsgc2VsZiwgb3RoZXIgXSApCgogICAgZGVmIF9fcmFuZF9fKHNlbGYsIG90aGVyICk6CiAgICAgICAgIiIiCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgJiBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19CiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIG90aGVyICYgc2VsZgoKICAgIGRlZiBfX2ludmVydF9fKCBzZWxmICk6CiAgICAgICAgIiIiCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgfiBvcGVyYXRvciAtIHJldHVybnMgQ3tMe05vdEFueX19CiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIE5vdEFueSggc2VsZiApCgogICAgZGVmIF9fY2FsbF9fKHNlbGYsIG5hbWU9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2hvcnRjdXQgZm9yIEN7THtzZXRSZXN1bHRzTmFtZX19LCB3aXRoIEN7bGlzdEFsbE1hdGNoZXM9RmFsc2V9LgogICAgICAgIAogICAgICAgIElmIEN7bmFtZX0gaXMgZ2l2ZW4gd2l0aCBhIHRyYWlsaW5nIEN7JyonfSBjaGFyYWN0ZXIsIHRoZW4gQ3tsaXN0QWxsTWF0Y2hlc30gd2lsbCBiZQogICAgICAgIHBhc3NlZCBhcyBDe1RydWV9LgogICAgICAgICAgIAogICAgICAgIElmIEN7bmFtZX0gaXMgb21pdHRlZCwgc2FtZSBhcyBjYWxsaW5nIEN7THtjb3B5fX0uCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICAjIHRoZXNlIGFyZSBlcXVpdmFsZW50CiAgICAgICAgICAgIHVzZXJkYXRhID0gV29yZChhbHBoYXMpLnNldFJlc3VsdHNOYW1lKCJuYW1lIikgKyBXb3JkKG51bXMrIi0iKS5zZXRSZXN1bHRzTmFtZSgic29jc2Vjbm8iKQogICAgICAgICAgICB1c2VyZGF0YSA9IFdvcmQoYWxwaGFzKSgibmFtZSIpICsgV29yZChudW1zKyItIikoInNvY3NlY25vIikgICAgICAgICAgICAgCiAgICAgICAgIiIiCiAgICAgICAgaWYgbmFtZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2V0UmVzdWx0c05hbWUobmFtZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5jb3B5KCkKCiAgICBkZWYgc3VwcHJlc3MoIHNlbGYgKToKICAgICAgICAiIiIKICAgICAgICBTdXBwcmVzc2VzIHRoZSBvdXRwdXQgb2YgdGhpcyBDe1BhcnNlckVsZW1lbnR9OyB1c2VmdWwgdG8ga2VlcCBwdW5jdHVhdGlvbiBmcm9tCiAgICAgICAgY2x1dHRlcmluZyB1cCByZXR1cm5lZCBvdXRwdXQuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFN1cHByZXNzKCBzZWxmICkKCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6CiAgICAgICAgIiIiCiAgICAgICAgRGlzYWJsZXMgdGhlIHNraXBwaW5nIG9mIHdoaXRlc3BhY2UgYmVmb3JlIG1hdGNoaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoZQogICAgICAgIEN7UGFyc2VyRWxlbWVudH0ncyBkZWZpbmVkIHBhdHRlcm4uICBUaGlzIGlzIG5vcm1hbGx5IG9ubHkgdXNlZCBpbnRlcm5hbGx5IGJ5CiAgICAgICAgdGhlIHB5cGFyc2luZyBtb2R1bGUsIGJ1dCBtYXkgYmUgbmVlZGVkIGluIHNvbWUgd2hpdGVzcGFjZS1zZW5zaXRpdmUgZ3JhbW1hcnMuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgc2V0V2hpdGVzcGFjZUNoYXJzKCBzZWxmLCBjaGFycyApOgogICAgICAgICIiIgogICAgICAgIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCB3aGl0ZXNwYWNlIGNoYXJzCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUKICAgICAgICBzZWxmLndoaXRlQ2hhcnMgPSBjaGFycwogICAgICAgIHNlbGYuY29weURlZmF1bHRXaGl0ZUNoYXJzID0gRmFsc2UKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBwYXJzZVdpdGhUYWJzKCBzZWxmICk6CiAgICAgICAgIiIiCiAgICAgICAgT3ZlcnJpZGVzIGRlZmF1bHQgYmVoYXZpb3IgdG8gZXhwYW5kIEN7PFRBQj59cyB0byBzcGFjZXMgYmVmb3JlIHBhcnNpbmcgdGhlIGlucHV0IHN0cmluZy4KICAgICAgICBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgQ3twYXJzZVN0cmluZ30gd2hlbiB0aGUgaW5wdXQgZ3JhbW1hciBjb250YWlucyBlbGVtZW50cyB0aGF0CiAgICAgICAgbWF0Y2ggQ3s8VEFCPn0gY2hhcmFjdGVycy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmtlZXBUYWJzID0gVHJ1ZQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToKICAgICAgICAiIiIKICAgICAgICBEZWZpbmUgZXhwcmVzc2lvbiB0byBiZSBpZ25vcmVkIChlLmcuLCBjb21tZW50cykgd2hpbGUgZG9pbmcgcGF0dGVybgogICAgICAgIG1hdGNoaW5nOyBtYXkgYmUgY2FsbGVkIHJlcGVhdGVkbHksIHRvIGRlZmluZSBtdWx0aXBsZSBjb21tZW50IG9yIG90aGVyCiAgICAgICAgaWdub3JhYmxlIHBhdHRlcm5zLgogICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBwYXR0ID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkKICAgICAgICAgICAgcGF0dC5wYXJzZVN0cmluZygnYWJsYWogLyogY29tbWVudCAqLyBsc2tqZCcpICMgLT4gWydhYmxhaiddCiAgICAgICAgICAgIAogICAgICAgICAgICBwYXR0Lmlnbm9yZShjU3R5bGVDb21tZW50KQogICAgICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCdhYmxhaiAvKiBjb21tZW50ICovIGxza2pkJykgIyAtPiBbJ2FibGFqJywgJ2xza2pkJ10KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgb3RoZXIgPSBTdXBwcmVzcyhvdGhlcikKCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIFN1cHByZXNzICk6CiAgICAgICAgICAgIGlmIG90aGVyIG5vdCBpbiBzZWxmLmlnbm9yZUV4cHJzOgogICAgICAgICAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5hcHBlbmQob3RoZXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5hcHBlbmQoIFN1cHByZXNzKCBvdGhlci5jb3B5KCkgKSApCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgc2V0RGVidWdBY3Rpb25zKCBzZWxmLCBzdGFydEFjdGlvbiwgc3VjY2Vzc0FjdGlvbiwgZXhjZXB0aW9uQWN0aW9uICk6CiAgICAgICAgIiIiCiAgICAgICAgRW5hYmxlIGRpc3BsYXkgb2YgZGVidWdnaW5nIG1lc3NhZ2VzIHdoaWxlIGRvaW5nIHBhdHRlcm4gbWF0Y2hpbmcuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnMgPSAoc3RhcnRBY3Rpb24gb3IgX2RlZmF1bHRTdGFydERlYnVnQWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NBY3Rpb24gb3IgX2RlZmF1bHRTdWNjZXNzRGVidWdBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uQWN0aW9uIG9yIF9kZWZhdWx0RXhjZXB0aW9uRGVidWdBY3Rpb24pCiAgICAgICAgc2VsZi5kZWJ1ZyA9IFRydWUKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzZXREZWJ1Zyggc2VsZiwgZmxhZz1UcnVlICk6CiAgICAgICAgIiIiCiAgICAgICAgRW5hYmxlIGRpc3BsYXkgb2YgZGVidWdnaW5nIG1lc3NhZ2VzIHdoaWxlIGRvaW5nIHBhdHRlcm4gbWF0Y2hpbmcuCiAgICAgICAgU2V0IEN7ZmxhZ30gdG8gVHJ1ZSB0byBlbmFibGUsIEZhbHNlIHRvIGRpc2FibGUuCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKS5zZXROYW1lKCJhbHBoYXdvcmQiKQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXROYW1lKCJudW13b3JkIikKICAgICAgICAgICAgdGVybSA9IHdkIHwgaW50ZWdlcgogICAgICAgICAgICAKICAgICAgICAgICAgIyB0dXJuIG9uIGRlYnVnZ2luZyBmb3Igd2QKICAgICAgICAgICAgd2Quc2V0RGVidWcoKQoKICAgICAgICAgICAgT25lT3JNb3JlKHRlcm0pLnBhcnNlU3RyaW5nKCJhYmMgMTIzIHh5eiA4OTAiKQogICAgICAgIAogICAgICAgIHByaW50czo6CiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMCgxLDEpCiAgICAgICAgICAgIE1hdGNoZWQgYWxwaGF3b3JkIC0+IFsnYWJjJ10KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAzKDEsNCkKICAgICAgICAgICAgRXhjZXB0aW9uIHJhaXNlZDpFeHBlY3RlZCBhbHBoYXdvcmQgKGF0IGNoYXIgNCksIChsaW5lOjEsIGNvbDo1KQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDcoMSw4KQogICAgICAgICAgICBNYXRjaGVkIGFscGhhd29yZCAtPiBbJ3h5eiddCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMTEoMSwxMikKICAgICAgICAgICAgRXhjZXB0aW9uIHJhaXNlZDpFeHBlY3RlZCBhbHBoYXdvcmQgKGF0IGNoYXIgMTIpLCAobGluZToxLCBjb2w6MTMpCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMTUoMSwxNikKICAgICAgICAgICAgRXhjZXB0aW9uIHJhaXNlZDpFeHBlY3RlZCBhbHBoYXdvcmQgKGF0IGNoYXIgMTUpLCAobGluZToxLCBjb2w6MTYpCgogICAgICAgIFRoZSBvdXRwdXQgc2hvd24gaXMgdGhhdCBwcm9kdWNlZCBieSB0aGUgZGVmYXVsdCBkZWJ1ZyBhY3Rpb25zIC0gY3VzdG9tIGRlYnVnIGFjdGlvbnMgY2FuIGJlCiAgICAgICAgc3BlY2lmaWVkIHVzaW5nIEx7c2V0RGVidWdBY3Rpb25zfS4gUHJpb3IgdG8gYXR0ZW1wdGluZwogICAgICAgIHRvIG1hdGNoIHRoZSBDe3dkfSBleHByZXNzaW9uLCB0aGUgZGVidWdnaW5nIG1lc3NhZ2UgQ3siTWF0Y2ggPGV4cHJuYW1lPiBhdCBsb2MgPG4+KDxsaW5lPiw8Y29sPikifQogICAgICAgIGlzIHNob3duLiBUaGVuIGlmIHRoZSBwYXJzZSBzdWNjZWVkcywgYSBDeyJNYXRjaGVkIn0gbWVzc2FnZSBpcyBzaG93biwgb3IgYW4gQ3siRXhjZXB0aW9uIHJhaXNlZCJ9CiAgICAgICAgbWVzc2FnZSBpcyBzaG93bi4gQWxzbyBub3RlIHRoZSB1c2Ugb2YgTHtzZXROYW1lfSB0byBhc3NpZ24gYSBodW1hbi1yZWFkYWJsZSBuYW1lIHRvIHRoZSBleHByZXNzaW9uLAogICAgICAgIHdoaWNoIG1ha2VzIGRlYnVnZ2luZyBhbmQgZXhjZXB0aW9uIG1lc3NhZ2VzIGVhc2llciB0byB1bmRlcnN0YW5kIC0gZm9yIGluc3RhbmNlLCB0aGUgZGVmYXVsdAogICAgICAgIG5hbWUgY3JlYXRlZCBmb3IgdGhlIEN7V29yZH0gZXhwcmVzc2lvbiB3aXRob3V0IGNhbGxpbmcgQ3tzZXROYW1lfSBpcyBDeyJXOihBQkNELi4uKSJ9LgogICAgICAgICIiIgogICAgICAgIGlmIGZsYWc6CiAgICAgICAgICAgIHNlbGYuc2V0RGVidWdBY3Rpb25zKCBfZGVmYXVsdFN0YXJ0RGVidWdBY3Rpb24sIF9kZWZhdWx0U3VjY2Vzc0RlYnVnQWN0aW9uLCBfZGVmYXVsdEV4Y2VwdGlvbkRlYnVnQWN0aW9uICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmRlYnVnID0gRmFsc2UKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgIGRlZiBfX3JlcHJfXyggc2VsZiApOgogICAgICAgIHJldHVybiBfdXN0cihzZWxmKQoKICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6CiAgICAgICAgc2VsZi5zdHJlYW1saW5lZCA9IFRydWUKICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToKICAgICAgICBwYXNzCgogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6CiAgICAgICAgIiIiCiAgICAgICAgQ2hlY2sgZGVmaW5lZCBleHByZXNzaW9ucyBmb3IgdmFsaWQgc3RydWN0dXJlLCBjaGVjayBmb3IgaW5maW5pdGUgcmVjdXJzaXZlIGRlZmluaXRpb25zLgogICAgICAgICIiIgogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oIFtdICkKCiAgICBkZWYgcGFyc2VGaWxlKCBzZWxmLCBmaWxlX29yX2ZpbGVuYW1lLCBwYXJzZUFsbD1GYWxzZSApOgogICAgICAgICIiIgogICAgICAgIEV4ZWN1dGUgdGhlIHBhcnNlIGV4cHJlc3Npb24gb24gdGhlIGdpdmVuIGZpbGUgb3IgZmlsZW5hbWUuCiAgICAgICAgSWYgYSBmaWxlbmFtZSBpcyBzcGVjaWZpZWQgKGluc3RlYWQgb2YgYSBmaWxlIG9iamVjdCksCiAgICAgICAgdGhlIGVudGlyZSBmaWxlIGlzIG9wZW5lZCwgcmVhZCwgYW5kIGNsb3NlZCBiZWZvcmUgcGFyc2luZy4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZpbGVfY29udGVudHMgPSBmaWxlX29yX2ZpbGVuYW1lLnJlYWQoKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVfb3JfZmlsZW5hbWUsICJyIikgYXMgZjoKICAgICAgICAgICAgICAgIGZpbGVfY29udGVudHMgPSBmLnJlYWQoKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VTdHJpbmcoZmlsZV9jb250ZW50cywgcGFyc2VBbGwpCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlCiAgICAgICAgICAgICAgICByYWlzZSBleGMKCiAgICBkZWYgX19lcV9fKHNlbGYsb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFBhcnNlckVsZW1lbnQpOgogICAgICAgICAgICByZXR1cm4gc2VsZiBpcyBvdGhlciBvciB2YXJzKHNlbGYpID09IHZhcnMob3RoZXIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubWF0Y2hlcyhvdGhlcikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoUGFyc2VyRWxlbWVudCxzZWxmKT09b3RoZXIKCiAgICBkZWYgX19uZV9fKHNlbGYsb3RoZXIpOgogICAgICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKGlkKHNlbGYpKQoKICAgIGRlZiBfX3JlcV9fKHNlbGYsb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmID09IG90aGVyCgogICAgZGVmIF9fcm5lX18oc2VsZixvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKCiAgICBkZWYgbWF0Y2hlcyhzZWxmLCB0ZXN0U3RyaW5nLCBwYXJzZUFsbD1UcnVlKToKICAgICAgICAiIiIKICAgICAgICBNZXRob2QgZm9yIHF1aWNrIHRlc3Rpbmcgb2YgYSBwYXJzZXIgYWdhaW5zdCBhIHRlc3Qgc3RyaW5nLiBHb29kIGZvciBzaW1wbGUgCiAgICAgICAgaW5saW5lIG1pY3JvdGVzdHMgb2Ygc3ViIGV4cHJlc3Npb25zIHdoaWxlIGJ1aWxkaW5nIHVwIGxhcmdlciBwYXJzZXIuCiAgICAgICAgICAgCiAgICAgICAgUGFyYW1ldGVyczoKICAgICAgICAgLSB0ZXN0U3RyaW5nIC0gdG8gdGVzdCBhZ2FpbnN0IHRoaXMgZXhwcmVzc2lvbiBmb3IgYSBtYXRjaAogICAgICAgICAtIHBhcnNlQWxsIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBmbGFnIHRvIHBhc3MgdG8gQ3tMe3BhcnNlU3RyaW5nfX0gd2hlbiBydW5uaW5nIHRlc3RzCiAgICAgICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBleHByID0gV29yZChudW1zKQogICAgICAgICAgICBhc3NlcnQgZXhwci5tYXRjaGVzKCIxMDAiKQogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5wYXJzZVN0cmluZyhfdXN0cih0ZXN0U3RyaW5nKSwgcGFyc2VBbGw9cGFyc2VBbGwpCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgICAgICAKICAgIGRlZiBydW5UZXN0cyhzZWxmLCB0ZXN0cywgcGFyc2VBbGw9VHJ1ZSwgY29tbWVudD0nIycsIGZ1bGxEdW1wPVRydWUsIHByaW50UmVzdWx0cz1UcnVlLCBmYWlsdXJlVGVzdHM9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIEV4ZWN1dGUgdGhlIHBhcnNlIGV4cHJlc3Npb24gb24gYSBzZXJpZXMgb2YgdGVzdCBzdHJpbmdzLCBzaG93aW5nIGVhY2gKICAgICAgICB0ZXN0LCB0aGUgcGFyc2VkIHJlc3VsdHMgb3Igd2hlcmUgdGhlIHBhcnNlIGZhaWxlZC4gUXVpY2sgYW5kIGVhc3kgd2F5IHRvCiAgICAgICAgcnVuIGEgcGFyc2UgZXhwcmVzc2lvbiBhZ2FpbnN0IGEgbGlzdCBvZiBzYW1wbGUgc3RyaW5ncy4KICAgICAgICAgICAKICAgICAgICBQYXJhbWV0ZXJzOgogICAgICAgICAtIHRlc3RzIC0gYSBsaXN0IG9mIHNlcGFyYXRlIHRlc3Qgc3RyaW5ncywgb3IgYSBtdWx0aWxpbmUgc3RyaW5nIG9mIHRlc3Qgc3RyaW5ncwogICAgICAgICAtIHBhcnNlQWxsIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBmbGFnIHRvIHBhc3MgdG8gQ3tMe3BhcnNlU3RyaW5nfX0gd2hlbiBydW5uaW5nIHRlc3RzICAgICAgICAgICAKICAgICAgICAgLSBjb21tZW50IC0gKGRlZmF1bHQ9Q3snIyd9KSAtIGV4cHJlc3Npb24gZm9yIGluZGljYXRpbmcgZW1iZWRkZWQgY29tbWVudHMgaW4gdGhlIHRlc3QgCiAgICAgICAgICAgICAgc3RyaW5nOyBwYXNzIE5vbmUgdG8gZGlzYWJsZSBjb21tZW50IGZpbHRlcmluZwogICAgICAgICAtIGZ1bGxEdW1wIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBkdW1wIHJlc3VsdHMgYXMgbGlzdCBmb2xsb3dlZCBieSByZXN1bHRzIG5hbWVzIGluIG5lc3RlZCBvdXRsaW5lOwogICAgICAgICAgICAgIGlmIEZhbHNlLCBvbmx5IGR1bXAgbmVzdGVkIGxpc3QKICAgICAgICAgLSBwcmludFJlc3VsdHMgLSAoZGVmYXVsdD1De1RydWV9KSBwcmludHMgdGVzdCBvdXRwdXQgdG8gc3Rkb3V0CiAgICAgICAgIC0gZmFpbHVyZVRlc3RzIC0gKGRlZmF1bHQ9Q3tGYWxzZX0pIGluZGljYXRlcyBpZiB0aGVzZSB0ZXN0cyBhcmUgZXhwZWN0ZWQgdG8gZmFpbCBwYXJzaW5nCgogICAgICAgIFJldHVybnM6IGEgKHN1Y2Nlc3MsIHJlc3VsdHMpIHR1cGxlLCB3aGVyZSBzdWNjZXNzIGluZGljYXRlcyB0aGF0IGFsbCB0ZXN0cyBzdWNjZWVkZWQKICAgICAgICAob3IgZmFpbGVkIGlmIEN7ZmFpbHVyZVRlc3RzfSBpcyBUcnVlKSwgYW5kIHRoZSByZXN1bHRzIGNvbnRhaW4gYSBsaXN0IG9mIGxpbmVzIG9mIGVhY2ggCiAgICAgICAgdGVzdCdzIG91dHB1dAogICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBudW1iZXJfZXhwciA9IHB5cGFyc2luZ19jb21tb24ubnVtYmVyLmNvcHkoKQoKICAgICAgICAgICAgcmVzdWx0ID0gbnVtYmVyX2V4cHIucnVuVGVzdHMoJycnCiAgICAgICAgICAgICAgICAjIHVuc2lnbmVkIGludGVnZXIKICAgICAgICAgICAgICAgIDEwMAogICAgICAgICAgICAgICAgIyBuZWdhdGl2ZSBpbnRlZ2VyCiAgICAgICAgICAgICAgICAtMTAwCiAgICAgICAgICAgICAgICAjIGZsb2F0IHdpdGggc2NpZW50aWZpYyBub3RhdGlvbgogICAgICAgICAgICAgICAgNi4wMmUyMwogICAgICAgICAgICAgICAgIyBpbnRlZ2VyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbgogICAgICAgICAgICAgICAgMWUtMTIKICAgICAgICAgICAgICAgICcnJykKICAgICAgICAgICAgcHJpbnQoIlN1Y2Nlc3MiIGlmIHJlc3VsdFswXSBlbHNlICJGYWlsZWQhIikKCiAgICAgICAgICAgIHJlc3VsdCA9IG51bWJlcl9leHByLnJ1blRlc3RzKCcnJwogICAgICAgICAgICAgICAgIyBzdHJheSBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgIDEwMFoKICAgICAgICAgICAgICAgICMgbWlzc2luZyBsZWFkaW5nIGRpZ2l0IGJlZm9yZSAnLicKICAgICAgICAgICAgICAgIC0uMTAwCiAgICAgICAgICAgICAgICAjIHRvbyBtYW55ICcuJwogICAgICAgICAgICAgICAgMy4xNC4xNTkKICAgICAgICAgICAgICAgICcnJywgZmFpbHVyZVRlc3RzPVRydWUpCiAgICAgICAgICAgIHByaW50KCJTdWNjZXNzIiBpZiByZXN1bHRbMF0gZWxzZSAiRmFpbGVkISIpCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAgICAgIyB1bnNpZ25lZCBpbnRlZ2VyCiAgICAgICAgICAgIDEwMAogICAgICAgICAgICBbMTAwXQoKICAgICAgICAgICAgIyBuZWdhdGl2ZSBpbnRlZ2VyCiAgICAgICAgICAgIC0xMDAKICAgICAgICAgICAgWy0xMDBdCgogICAgICAgICAgICAjIGZsb2F0IHdpdGggc2NpZW50aWZpYyBub3RhdGlvbgogICAgICAgICAgICA2LjAyZTIzCiAgICAgICAgICAgIFs2LjAyZSsyM10KCiAgICAgICAgICAgICMgaW50ZWdlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24KICAgICAgICAgICAgMWUtMTIKICAgICAgICAgICAgWzFlLTEyXQoKICAgICAgICAgICAgU3VjY2VzcwogICAgICAgICAgICAKICAgICAgICAgICAgIyBzdHJheSBjaGFyYWN0ZXIKICAgICAgICAgICAgMTAwWgogICAgICAgICAgICAgICBeCiAgICAgICAgICAgIEZBSUw6IEV4cGVjdGVkIGVuZCBvZiB0ZXh0IChhdCBjaGFyIDMpLCAobGluZToxLCBjb2w6NCkKCiAgICAgICAgICAgICMgbWlzc2luZyBsZWFkaW5nIGRpZ2l0IGJlZm9yZSAnLicKICAgICAgICAgICAgLS4xMDAKICAgICAgICAgICAgXgogICAgICAgICAgICBGQUlMOiBFeHBlY3RlZCB7cmVhbCBudW1iZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uIHwgcmVhbCBudW1iZXIgfCBzaWduZWQgaW50ZWdlcn0gKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQoKICAgICAgICAgICAgIyB0b28gbWFueSAnLicKICAgICAgICAgICAgMy4xNC4xNTkKICAgICAgICAgICAgICAgIF4KICAgICAgICAgICAgRkFJTDogRXhwZWN0ZWQgZW5kIG9mIHRleHQgKGF0IGNoYXIgNCksIChsaW5lOjEsIGNvbDo1KQoKICAgICAgICAgICAgU3VjY2VzcwoKICAgICAgICBFYWNoIHRlc3Qgc3RyaW5nIG11c3QgYmUgb24gYSBzaW5nbGUgbGluZS4gSWYgeW91IHdhbnQgdG8gdGVzdCBhIHN0cmluZyB0aGF0IHNwYW5zIG11bHRpcGxlCiAgICAgICAgbGluZXMsIGNyZWF0ZSBhIHRlc3QgbGlrZSB0aGlzOjoKCiAgICAgICAgICAgIGV4cHIucnVuVGVzdChyInRoaXMgaXMgYSB0ZXN0XFxuIG9mIHN0cmluZ3MgdGhhdCBzcGFucyBcXG4gMyBsaW5lcyIpCiAgICAgICAgCiAgICAgICAgKE5vdGUgdGhhdCB0aGlzIGlzIGEgcmF3IHN0cmluZyBsaXRlcmFsLCB5b3UgbXVzdCBpbmNsdWRlIHRoZSBsZWFkaW5nICdyJy4pCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSh0ZXN0cywgYmFzZXN0cmluZyk6CiAgICAgICAgICAgIHRlc3RzID0gbGlzdChtYXAoc3RyLnN0cmlwLCB0ZXN0cy5yc3RyaXAoKS5zcGxpdGxpbmVzKCkpKQogICAgICAgIGlmIGlzaW5zdGFuY2UoY29tbWVudCwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgIGNvbW1lbnQgPSBMaXRlcmFsKGNvbW1lbnQpCiAgICAgICAgYWxsUmVzdWx0cyA9IFtdCiAgICAgICAgY29tbWVudHMgPSBbXQogICAgICAgIHN1Y2Nlc3MgPSBUcnVlCiAgICAgICAgZm9yIHQgaW4gdGVzdHM6CiAgICAgICAgICAgIGlmIGNvbW1lbnQgaXMgbm90IE5vbmUgYW5kIGNvbW1lbnQubWF0Y2hlcyh0LCBGYWxzZSkgb3IgY29tbWVudHMgYW5kIG5vdCB0OgogICAgICAgICAgICAgICAgY29tbWVudHMuYXBwZW5kKHQpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBub3QgdDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIG91dCA9IFsnXG4nLmpvaW4oY29tbWVudHMpLCB0XQogICAgICAgICAgICBjb21tZW50cyA9IFtdCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHQgPSB0LnJlcGxhY2UocidcbicsJ1xuJykKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYucGFyc2VTdHJpbmcodCwgcGFyc2VBbGw9cGFyc2VBbGwpCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHJlc3VsdC5kdW1wKGZ1bGw9ZnVsbER1bXApKQogICAgICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIG5vdCBmYWlsdXJlVGVzdHMKICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBwZToKICAgICAgICAgICAgICAgIGZhdGFsID0gIihGQVRBTCkiIGlmIGlzaW5zdGFuY2UocGUsIFBhcnNlRmF0YWxFeGNlcHRpb24pIGVsc2UgIiIKICAgICAgICAgICAgICAgIGlmICdcbicgaW4gdDoKICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKGxpbmUocGUubG9jLCB0KSkKICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcgJyooY29sKHBlLmxvYyx0KS0xKSArICdeJyArIGZhdGFsKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcgJypwZS5sb2MgKyAnXicgKyBmYXRhbCkKICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIkZBSUw6ICIgKyBzdHIocGUpKQogICAgICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIGZhaWx1cmVUZXN0cwogICAgICAgICAgICAgICAgcmVzdWx0ID0gcGUKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJGQUlMLUVYQ0VQVElPTjogIiArIHN0cihleGMpKQogICAgICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIGZhaWx1cmVUZXN0cwogICAgICAgICAgICAgICAgcmVzdWx0ID0gZXhjCgogICAgICAgICAgICBpZiBwcmludFJlc3VsdHM6CiAgICAgICAgICAgICAgICBpZiBmdWxsRHVtcDoKICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcnKQogICAgICAgICAgICAgICAgcHJpbnQoJ1xuJy5qb2luKG91dCkpCgogICAgICAgICAgICBhbGxSZXN1bHRzLmFwcGVuZCgodCwgcmVzdWx0KSkKICAgICAgICAKICAgICAgICByZXR1cm4gc3VjY2VzcywgYWxsUmVzdWx0cwoKICAgICAgICAKY2xhc3MgVG9rZW4oUGFyc2VyRWxlbWVudCk6CiAgICAiIiIKICAgIEFic3RyYWN0IEN7UGFyc2VyRWxlbWVudH0gc3ViY2xhc3MsIGZvciBkZWZpbmluZyBhdG9taWMgbWF0Y2hpbmcgcGF0dGVybnMuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgogICAgICAgIHN1cGVyKFRva2VuLHNlbGYpLl9faW5pdF9fKCBzYXZlbGlzdD1GYWxzZSApCgoKY2xhc3MgRW1wdHkoVG9rZW4pOgogICAgIiIiCiAgICBBbiBlbXB0eSB0b2tlbiwgd2lsbCBhbHdheXMgbWF0Y2guCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgogICAgICAgIHN1cGVyKEVtcHR5LHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLm5hbWUgPSAiRW1wdHkiCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQoKCmNsYXNzIE5vTWF0Y2goVG9rZW4pOgogICAgIiIiCiAgICBBIHRva2VuIHRoYXQgd2lsbCBuZXZlciBtYXRjaC4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6CiAgICAgICAgc3VwZXIoTm9NYXRjaCxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5uYW1lID0gIk5vTWF0Y2giCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQogICAgICAgIHNlbGYuZXJybXNnID0gIlVubWF0Y2hhYmxlIHRva2VuIgoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgoKY2xhc3MgTGl0ZXJhbChUb2tlbik6CiAgICAiIiIKICAgIFRva2VuIHRvIGV4YWN0bHkgbWF0Y2ggYSBzcGVjaWZpZWQgc3RyaW5nLgogICAgCiAgICBFeGFtcGxlOjoKICAgICAgICBMaXRlcmFsKCdibGFoJykucGFyc2VTdHJpbmcoJ2JsYWgnKSAgIyAtPiBbJ2JsYWgnXQogICAgICAgIExpdGVyYWwoJ2JsYWgnKS5wYXJzZVN0cmluZygnYmxhaGZvb2JsYWgnKSAgIyAtPiBbJ2JsYWgnXQogICAgICAgIExpdGVyYWwoJ2JsYWgnKS5wYXJzZVN0cmluZygnYmxhJykgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCAiYmxhaCIKICAgIAogICAgRm9yIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIHVzZSBMe0Nhc2VsZXNzTGl0ZXJhbH0uCiAgICAKICAgIEZvciBrZXl3b3JkIG1hdGNoaW5nIChmb3JjZSB3b3JkIGJyZWFrIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG1hdGNoZWQgc3RyaW5nKSwKICAgIHVzZSBMe0tleXdvcmR9IG9yIEx7Q2FzZWxlc3NLZXl3b3JkfS4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZyApOgogICAgICAgIHN1cGVyKExpdGVyYWwsc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYubWF0Y2ggPSBtYXRjaFN0cmluZwogICAgICAgIHNlbGYubWF0Y2hMZW4gPSBsZW4obWF0Y2hTdHJpbmcpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmZpcnN0TWF0Y2hDaGFyID0gbWF0Y2hTdHJpbmdbMF0KICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigibnVsbCBzdHJpbmcgcGFzc2VkIHRvIExpdGVyYWw7IHVzZSBFbXB0eSgpIGluc3RlYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IEVtcHR5CiAgICAgICAgc2VsZi5uYW1lID0gJyIlcyInICUgX3VzdHIoc2VsZi5tYXRjaCkKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UKCiAgICAjIFBlcmZvcm1hbmNlIHR1bmluZzogdGhpcyByb3V0aW5lIGdldHMgY2FsbGVkIGEgKmxvdCoKICAgICMgaWYgdGhpcyBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIgbWF0Y2ggc3RyaW5nICBhbmQgdGhlIGZpcnN0IGNoYXJhY3RlciBtYXRjaGVzLAogICAgIyBzaG9ydC1jaXJjdWl0IGFzIHF1aWNrbHkgYXMgcG9zc2libGUsIGFuZCBhdm9pZCBjYWxsaW5nIHN0YXJ0c3dpdGgKICAgICN+IEBwcm9maWxlCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIChpbnN0cmluZ1tsb2NdID09IHNlbGYuZmlyc3RNYXRjaENoYXIgYW5kCiAgICAgICAgICAgIChzZWxmLm1hdGNoTGVuPT0xIG9yIGluc3RyaW5nLnN0YXJ0c3dpdGgoc2VsZi5tYXRjaCxsb2MpKSApOgogICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gKICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKX0wgPSBMaXRlcmFsClBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyA9IExpdGVyYWwKCmNsYXNzIEtleXdvcmQoVG9rZW4pOgogICAgIiIiCiAgICBUb2tlbiB0byBleGFjdGx5IG1hdGNoIGEgc3BlY2lmaWVkIHN0cmluZyBhcyBhIGtleXdvcmQsIHRoYXQgaXMsIGl0IG11c3QgYmUKICAgIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgbm9uLWtleXdvcmQgY2hhcmFjdGVyLiAgQ29tcGFyZSB3aXRoIEN7THtMaXRlcmFsfX06CiAgICAgLSBDe0xpdGVyYWwoImlmIil9IHdpbGwgbWF0Y2ggdGhlIGxlYWRpbmcgQ3snaWYnfSBpbiBDeydpZkFuZE9ubHlJZid9LgogICAgIC0gQ3tLZXl3b3JkKCJpZiIpfSB3aWxsIG5vdDsgaXQgd2lsbCBvbmx5IG1hdGNoIHRoZSBsZWFkaW5nIEN7J2lmJ30gaW4gQ3snaWYgeD0xJ30sIG9yIEN7J2lmKHk9PTIpJ30KICAgIEFjY2VwdHMgdHdvIG9wdGlvbmFsIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBpbiBhZGRpdGlvbiB0byB0aGUga2V5d29yZCBzdHJpbmc6CiAgICAgLSBDe2lkZW50Q2hhcnN9IGlzIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBiZSB2YWxpZCBpZGVudGlmaWVyIGNoYXJhY3RlcnMsCiAgICAgICAgICBkZWZhdWx0aW5nIHRvIGFsbCBhbHBoYW51bWVyaWNzICsgIl8iIGFuZCAiJCIKICAgICAtIEN7Y2FzZWxlc3N9IGFsbG93cyBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLCBkZWZhdWx0IGlzIEN7RmFsc2V9LgogICAgICAgCiAgICBFeGFtcGxlOjoKICAgICAgICBLZXl3b3JkKCJzdGFydCIpLnBhcnNlU3RyaW5nKCJzdGFydCIpICAjIC0+IFsnc3RhcnQnXQogICAgICAgIEtleXdvcmQoInN0YXJ0IikucGFyc2VTdHJpbmcoInN0YXJ0aW5nIikgICMgLT4gRXhjZXB0aW9uCgogICAgRm9yIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIHVzZSBMe0Nhc2VsZXNzS2V5d29yZH0uCiAgICAiIiIKICAgIERFRkFVTFRfS0VZV09SRF9DSEFSUyA9IGFscGhhbnVtcysiXyQiCgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZywgaWRlbnRDaGFycz1Ob25lLCBjYXNlbGVzcz1GYWxzZSApOgogICAgICAgIHN1cGVyKEtleXdvcmQsc2VsZikuX19pbml0X18oKQogICAgICAgIGlmIGlkZW50Q2hhcnMgaXMgTm9uZToKICAgICAgICAgICAgaWRlbnRDaGFycyA9IEtleXdvcmQuREVGQVVMVF9LRVlXT1JEX0NIQVJTCiAgICAgICAgc2VsZi5tYXRjaCA9IG1hdGNoU3RyaW5nCiAgICAgICAgc2VsZi5tYXRjaExlbiA9IGxlbihtYXRjaFN0cmluZykKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuZmlyc3RNYXRjaENoYXIgPSBtYXRjaFN0cmluZ1swXQogICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJudWxsIHN0cmluZyBwYXNzZWQgdG8gS2V5d29yZDsgdXNlIEVtcHR5KCkgaW5zdGVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgc2VsZi5uYW1lID0gJyIlcyInICUgc2VsZi5tYXRjaAogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQogICAgICAgIHNlbGYuY2FzZWxlc3MgPSBjYXNlbGVzcwogICAgICAgIGlmIGNhc2VsZXNzOgogICAgICAgICAgICBzZWxmLmNhc2VsZXNzbWF0Y2ggPSBtYXRjaFN0cmluZy51cHBlcigpCiAgICAgICAgICAgIGlkZW50Q2hhcnMgPSBpZGVudENoYXJzLnVwcGVyKCkKICAgICAgICBzZWxmLmlkZW50Q2hhcnMgPSBzZXQoaWRlbnRDaGFycykKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIHNlbGYuY2FzZWxlc3M6CiAgICAgICAgICAgIGlmICggKGluc3RyaW5nWyBsb2M6bG9jK3NlbGYubWF0Y2hMZW4gXS51cHBlcigpID09IHNlbGYuY2FzZWxlc3NtYXRjaCkgYW5kCiAgICAgICAgICAgICAgICAgKGxvYyA+PSBsZW4oaW5zdHJpbmcpLXNlbGYubWF0Y2hMZW4gb3IgaW5zdHJpbmdbbG9jK3NlbGYubWF0Y2hMZW5dLnVwcGVyKCkgbm90IGluIHNlbGYuaWRlbnRDaGFycykgYW5kCiAgICAgICAgICAgICAgICAgKGxvYyA9PSAwIG9yIGluc3RyaW5nW2xvYy0xXS51cHBlcigpIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpICk6CiAgICAgICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiAoaW5zdHJpbmdbbG9jXSA9PSBzZWxmLmZpcnN0TWF0Y2hDaGFyIGFuZAogICAgICAgICAgICAgICAgKHNlbGYubWF0Y2hMZW49PTEgb3IgaW5zdHJpbmcuc3RhcnRzd2l0aChzZWxmLm1hdGNoLGxvYykpIGFuZAogICAgICAgICAgICAgICAgKGxvYyA+PSBsZW4oaW5zdHJpbmcpLXNlbGYubWF0Y2hMZW4gb3IgaW5zdHJpbmdbbG9jK3NlbGYubWF0Y2hMZW5dIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpIGFuZAogICAgICAgICAgICAgICAgKGxvYyA9PSAwIG9yIGluc3RyaW5nW2xvYy0xXSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSApOgogICAgICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLm1hdGNoCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgogICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgYyA9IHN1cGVyKEtleXdvcmQsc2VsZikuY29weSgpCiAgICAgICAgYy5pZGVudENoYXJzID0gS2V5d29yZC5ERUZBVUxUX0tFWVdPUkRfQ0hBUlMKICAgICAgICByZXR1cm4gYwoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBzZXREZWZhdWx0S2V5d29yZENoYXJzKCBjaGFycyApOgogICAgICAgICIiIk92ZXJyaWRlcyB0aGUgZGVmYXVsdCBLZXl3b3JkIGNoYXJzCiAgICAgICAgIiIiCiAgICAgICAgS2V5d29yZC5ERUZBVUxUX0tFWVdPUkRfQ0hBUlMgPSBjaGFycwoKY2xhc3MgQ2FzZWxlc3NMaXRlcmFsKExpdGVyYWwpOgogICAgIiIiCiAgICBUb2tlbiB0byBtYXRjaCBhIHNwZWNpZmllZCBzdHJpbmcsIGlnbm9yaW5nIGNhc2Ugb2YgbGV0dGVycy4KICAgIE5vdGU6IHRoZSBtYXRjaGVkIHJlc3VsdHMgd2lsbCBhbHdheXMgYmUgaW4gdGhlIGNhc2Ugb2YgdGhlIGdpdmVuCiAgICBtYXRjaCBzdHJpbmcsIE5PVCB0aGUgY2FzZSBvZiB0aGUgaW5wdXQgdGV4dC4KCiAgICBFeGFtcGxlOjoKICAgICAgICBPbmVPck1vcmUoQ2FzZWxlc3NMaXRlcmFsKCJDTUQiKSkucGFyc2VTdHJpbmcoImNtZCBDTUQgQ21kMTAiKSAjIC0+IFsnQ01EJywgJ0NNRCcsICdDTUQnXQogICAgICAgIAogICAgKENvbnRyYXN0IHdpdGggZXhhbXBsZSBmb3IgTHtDYXNlbGVzc0tleXdvcmR9LikKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZyApOgogICAgICAgIHN1cGVyKENhc2VsZXNzTGl0ZXJhbCxzZWxmKS5fX2luaXRfXyggbWF0Y2hTdHJpbmcudXBwZXIoKSApCiAgICAgICAgIyBQcmVzZXJ2ZSB0aGUgZGVmaW5pbmcgbGl0ZXJhbC4KICAgICAgICBzZWxmLnJldHVyblN0cmluZyA9IG1hdGNoU3RyaW5nCiAgICAgICAgc2VsZi5uYW1lID0gIiclcyciICUgc2VsZi5yZXR1cm5TdHJpbmcKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBpbnN0cmluZ1sgbG9jOmxvYytzZWxmLm1hdGNoTGVuIF0udXBwZXIoKSA9PSBzZWxmLm1hdGNoOgogICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYucmV0dXJuU3RyaW5nCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgpjbGFzcyBDYXNlbGVzc0tleXdvcmQoS2V5d29yZCk6CiAgICAiIiIKICAgIENhc2VsZXNzIHZlcnNpb24gb2YgTHtLZXl3b3JkfS4KCiAgICBFeGFtcGxlOjoKICAgICAgICBPbmVPck1vcmUoQ2FzZWxlc3NLZXl3b3JkKCJDTUQiKSkucGFyc2VTdHJpbmcoImNtZCBDTUQgQ21kMTAiKSAjIC0+IFsnQ01EJywgJ0NNRCddCiAgICAgICAgCiAgICAoQ29udHJhc3Qgd2l0aCBleGFtcGxlIGZvciBMe0Nhc2VsZXNzTGl0ZXJhbH0uKQogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nLCBpZGVudENoYXJzPU5vbmUgKToKICAgICAgICBzdXBlcihDYXNlbGVzc0tleXdvcmQsc2VsZikuX19pbml0X18oIG1hdGNoU3RyaW5nLCBpZGVudENoYXJzLCBjYXNlbGVzcz1UcnVlICkKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmICggKGluc3RyaW5nWyBsb2M6bG9jK3NlbGYubWF0Y2hMZW4gXS51cHBlcigpID09IHNlbGYuY2FzZWxlc3NtYXRjaCkgYW5kCiAgICAgICAgICAgICAobG9jID49IGxlbihpbnN0cmluZyktc2VsZi5tYXRjaExlbiBvciBpbnN0cmluZ1tsb2Mrc2VsZi5tYXRjaExlbl0udXBwZXIoKSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSApOgogICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gKICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCmNsYXNzIENsb3NlTWF0Y2goVG9rZW4pOgogICAgIiIiCiAgICBBIHZhcmlhdGlvbiBvbiBMe0xpdGVyYWx9IHdoaWNoIG1hdGNoZXMgImNsb3NlIiBtYXRjaGVzLCB0aGF0IGlzLCAKICAgIHN0cmluZ3Mgd2l0aCBhdCBtb3N0ICduJyBtaXNtYXRjaGluZyBjaGFyYWN0ZXJzLiBDe0Nsb3NlTWF0Y2h9IHRha2VzIHBhcmFtZXRlcnM6CiAgICAgLSBDe21hdGNoX3N0cmluZ30gLSBzdHJpbmcgdG8gYmUgbWF0Y2hlZAogICAgIC0gQ3ttYXhNaXNtYXRjaGVzfSAtIChDe2RlZmF1bHQ9MX0pIG1heGltdW0gbnVtYmVyIG9mIG1pc21hdGNoZXMgYWxsb3dlZCB0byBjb3VudCBhcyBhIG1hdGNoCiAgICAKICAgIFRoZSByZXN1bHRzIGZyb20gYSBzdWNjZXNzZnVsIHBhcnNlIHdpbGwgY29udGFpbiB0aGUgbWF0Y2hlZCB0ZXh0IGZyb20gdGhlIGlucHV0IHN0cmluZyBhbmQgdGhlIGZvbGxvd2luZyBuYW1lZCByZXN1bHRzOgogICAgIC0gQ3ttaXNtYXRjaGVzfSAtIGEgbGlzdCBvZiB0aGUgcG9zaXRpb25zIHdpdGhpbiB0aGUgbWF0Y2hfc3RyaW5nIHdoZXJlIG1pc21hdGNoZXMgd2VyZSBmb3VuZAogICAgIC0gQ3tvcmlnaW5hbH0gLSB0aGUgb3JpZ2luYWwgbWF0Y2hfc3RyaW5nIHVzZWQgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBpbnB1dCBzdHJpbmcKICAgIAogICAgSWYgQ3ttaXNtYXRjaGVzfSBpcyBhbiBlbXB0eSBsaXN0LCB0aGVuIHRoZSBtYXRjaCB3YXMgYW4gZXhhY3QgbWF0Y2guCiAgICAKICAgIEV4YW1wbGU6OgogICAgICAgIHBhdHQgPSBDbG9zZU1hdGNoKCJBVENBVENHQUFUR0dBIikKICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBVENHQUFYR0dBIikgIyAtPiAoWydBVENBVENHQUFYR0dBJ10sIHsnbWlzbWF0Y2hlcyc6IFtbOV1dLCAnb3JpZ2luYWwnOiBbJ0FUQ0FUQ0dBQVRHR0EnXX0pCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVhDR0FBWEdHQSIpICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCAnQVRDQVRDR0FBVEdHQScgKHdpdGggdXAgdG8gMSBtaXNtYXRjaGVzKSAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpCgogICAgICAgICMgZXhhY3QgbWF0Y2gKICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBVENHQUFUR0dBIikgIyAtPiAoWydBVENBVENHQUFUR0dBJ10sIHsnbWlzbWF0Y2hlcyc6IFtbXV0sICdvcmlnaW5hbCc6IFsnQVRDQVRDR0FBVEdHQSddfSkKCiAgICAgICAgIyBjbG9zZSBtYXRjaCBhbGxvd2luZyB1cCB0byAyIG1pc21hdGNoZXMKICAgICAgICBwYXR0ID0gQ2xvc2VNYXRjaCgiQVRDQVRDR0FBVEdHQSIsIG1heE1pc21hdGNoZXM9MikKICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBWENHQUFYR0dBIikgIyAtPiAoWydBVENBWENHQUFYR0dBJ10sIHsnbWlzbWF0Y2hlcyc6IFtbNCwgOV1dLCAnb3JpZ2luYWwnOiBbJ0FUQ0FUQ0dBQVRHR0EnXX0pCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXRjaF9zdHJpbmcsIG1heE1pc21hdGNoZXM9MSk6CiAgICAgICAgc3VwZXIoQ2xvc2VNYXRjaCxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5uYW1lID0gbWF0Y2hfc3RyaW5nCiAgICAgICAgc2VsZi5tYXRjaF9zdHJpbmcgPSBtYXRjaF9zdHJpbmcKICAgICAgICBzZWxmLm1heE1pc21hdGNoZXMgPSBtYXhNaXNtYXRjaGVzCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgJXIgKHdpdGggdXAgdG8gJWQgbWlzbWF0Y2hlcykiICUgKHNlbGYubWF0Y2hfc3RyaW5nLCBzZWxmLm1heE1pc21hdGNoZXMpCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIHN0YXJ0ID0gbG9jCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpCiAgICAgICAgbWF4bG9jID0gc3RhcnQgKyBsZW4oc2VsZi5tYXRjaF9zdHJpbmcpCgogICAgICAgIGlmIG1heGxvYyA8PSBpbnN0cmxlbjoKICAgICAgICAgICAgbWF0Y2hfc3RyaW5nID0gc2VsZi5tYXRjaF9zdHJpbmcKICAgICAgICAgICAgbWF0Y2hfc3RyaW5nbG9jID0gMAogICAgICAgICAgICBtaXNtYXRjaGVzID0gW10KICAgICAgICAgICAgbWF4TWlzbWF0Y2hlcyA9IHNlbGYubWF4TWlzbWF0Y2hlcwoKICAgICAgICAgICAgZm9yIG1hdGNoX3N0cmluZ2xvYyxzX20gaW4gZW51bWVyYXRlKHppcChpbnN0cmluZ1tsb2M6bWF4bG9jXSwgc2VsZi5tYXRjaF9zdHJpbmcpKToKICAgICAgICAgICAgICAgIHNyYyxtYXQgPSBzX20KICAgICAgICAgICAgICAgIGlmIHNyYyAhPSBtYXQ6CiAgICAgICAgICAgICAgICAgICAgbWlzbWF0Y2hlcy5hcHBlbmQobWF0Y2hfc3RyaW5nbG9jKQogICAgICAgICAgICAgICAgICAgIGlmIGxlbihtaXNtYXRjaGVzKSA+IG1heE1pc21hdGNoZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2MgPSBtYXRjaF9zdHJpbmdsb2MgKyAxCiAgICAgICAgICAgICAgICByZXN1bHRzID0gUGFyc2VSZXN1bHRzKFtpbnN0cmluZ1tzdGFydDpsb2NdXSkKICAgICAgICAgICAgICAgIHJlc3VsdHNbJ29yaWdpbmFsJ10gPSBzZWxmLm1hdGNoX3N0cmluZwogICAgICAgICAgICAgICAgcmVzdWx0c1snbWlzbWF0Y2hlcyddID0gbWlzbWF0Y2hlcwogICAgICAgICAgICAgICAgcmV0dXJuIGxvYywgcmVzdWx0cwoKICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCgpjbGFzcyBXb3JkKFRva2VuKToKICAgICIiIgogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHdvcmRzIGNvbXBvc2VkIG9mIGFsbG93ZWQgY2hhcmFjdGVyIHNldHMuCiAgICBEZWZpbmVkIHdpdGggc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGFsbG93ZWQgaW5pdGlhbCBjaGFyYWN0ZXJzLAogICAgYW4gb3B0aW9uYWwgc3RyaW5nIGNvbnRhaW5pbmcgYWxsb3dlZCBib2R5IGNoYXJhY3RlcnMgKGlmIG9taXR0ZWQsCiAgICBkZWZhdWx0cyB0byB0aGUgaW5pdGlhbCBjaGFyYWN0ZXIgc2V0KSwgYW5kIGFuIG9wdGlvbmFsIG1pbmltdW0sCiAgICBtYXhpbXVtLCBhbmQvb3IgZXhhY3QgbGVuZ3RoLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIEN7bWlufSBpcyAxIChhCiAgICBtaW5pbXVtIHZhbHVlIDwgMSBpcyBub3QgdmFsaWQpOyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIEN7bWF4fSBhbmQgQ3tleGFjdH0KICAgIGFyZSAwLCBtZWFuaW5nIG5vIG1heGltdW0gb3IgZXhhY3QgbGVuZ3RoIHJlc3RyaWN0aW9uLiBBbiBvcHRpb25hbAogICAgQ3tleGNsdWRlQ2hhcnN9IHBhcmFtZXRlciBjYW4gbGlzdCBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgYmUgZm91bmQgaW4gCiAgICB0aGUgaW5wdXQgQ3tib2R5Q2hhcnN9IHN0cmluZzsgdXNlZnVsIHRvIGRlZmluZSBhIHdvcmQgb2YgYWxsIHByaW50YWJsZXMKICAgIGV4Y2VwdCBmb3Igb25lIG9yIHR3byBjaGFyYWN0ZXJzLCBmb3IgaW5zdGFuY2UuCiAgICAKICAgIEx7c3JhbmdlfSBpcyB1c2VmdWwgZm9yIGRlZmluaW5nIGN1c3RvbSBjaGFyYWN0ZXIgc2V0IHN0cmluZ3MgZm9yIGRlZmluaW5nIAogICAgQ3tXb3JkfSBleHByZXNzaW9ucywgdXNpbmcgcmFuZ2Ugbm90YXRpb24gZnJvbSByZWd1bGFyIGV4cHJlc3Npb24gY2hhcmFjdGVyIHNldHMuCiAgICAKICAgIEEgY29tbW9uIG1pc3Rha2UgaXMgdG8gdXNlIEN7V29yZH0gdG8gbWF0Y2ggYSBzcGVjaWZpYyBsaXRlcmFsIHN0cmluZywgYXMgaW4gCiAgICBDe1dvcmQoIkFkZHJlc3MiKX0uIFJlbWVtYmVyIHRoYXQgQ3tXb3JkfSB1c2VzIHRoZSBzdHJpbmcgYXJndW1lbnQgdG8gZGVmaW5lCiAgICBJe3NldHN9IG9mIG1hdGNoYWJsZSBjaGFyYWN0ZXJzLiBUaGlzIGV4cHJlc3Npb24gd291bGQgbWF0Y2ggIkFkZCIsICJBQUEiLAogICAgImRBcmVkIiwgb3IgYW55IG90aGVyIHdvcmQgbWFkZSB1cCBvZiB0aGUgY2hhcmFjdGVycyAnQScsICdkJywgJ3InLCAnZScsIGFuZCAncycuCiAgICBUbyBtYXRjaCBhbiBleGFjdCBsaXRlcmFsIHN0cmluZywgdXNlIEx7TGl0ZXJhbH0gb3IgTHtLZXl3b3JkfS4KCiAgICBweXBhcnNpbmcgaW5jbHVkZXMgaGVscGVyIHN0cmluZ3MgZm9yIGJ1aWxkaW5nIFdvcmRzOgogICAgIC0gTHthbHBoYXN9CiAgICAgLSBMe251bXN9CiAgICAgLSBMe2FscGhhbnVtc30KICAgICAtIEx7aGV4bnVtc30KICAgICAtIEx7YWxwaGFzOGJpdH0gKGFscGhhYmV0aWMgY2hhcmFjdGVycyBpbiBBU0NJSSByYW5nZSAxMjgtMjU1IC0gYWNjZW50ZWQsIHRpbGRlZCwgdW1sYXV0ZWQsIGV0Yy4pCiAgICAgLSBMe3B1bmM4Yml0fSAobm9uLWFscGhhYmV0aWMgY2hhcmFjdGVycyBpbiBBU0NJSSByYW5nZSAxMjgtMjU1IC0gY3VycmVuY3ksIHN5bWJvbHMsIHN1cGVyc2NyaXB0cywgZGlhY3JpdGljYWxzLCBldGMuKQogICAgIC0gTHtwcmludGFibGVzfSAoYW55IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcikKCiAgICBFeGFtcGxlOjoKICAgICAgICAjIGEgd29yZCBjb21wb3NlZCBvZiBkaWdpdHMKICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKSAjIGVxdWl2YWxlbnQgdG8gV29yZCgiMDEyMzQ1Njc4OSIpIG9yIFdvcmQoc3JhbmdlKCIwLTkiKSkKICAgICAgICAKICAgICAgICAjIGEgd29yZCB3aXRoIGEgbGVhZGluZyBjYXBpdGFsLCBhbmQgemVybyBvciBtb3JlIGxvd2VyY2FzZQogICAgICAgIGNhcGl0YWxfd29yZCA9IFdvcmQoYWxwaGFzLnVwcGVyKCksIGFscGhhcy5sb3dlcigpKQoKICAgICAgICAjIGhvc3RuYW1lcyBhcmUgYWxwaGFudW1lcmljLCB3aXRoIGxlYWRpbmcgYWxwaGEsIGFuZCAnLScKICAgICAgICBob3N0bmFtZSA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMrJy0nKQogICAgICAgIAogICAgICAgICMgcm9tYW4gbnVtZXJhbCAobm90IGEgc3RyaWN0IHBhcnNlciwgYWNjZXB0cyBpbnZhbGlkIG1peCBvZiBjaGFyYWN0ZXJzKQogICAgICAgIHJvbWFuID0gV29yZCgiSVZYTENETSIpCiAgICAgICAgCiAgICAgICAgIyBhbnkgc3RyaW5nIG9mIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMsIGV4Y2VwdCBmb3IgJywnCiAgICAgICAgY3N2X3ZhbHVlID0gV29yZChwcmludGFibGVzLCBleGNsdWRlQ2hhcnM9IiwiKQogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGluaXRDaGFycywgYm9keUNoYXJzPU5vbmUsIG1pbj0xLCBtYXg9MCwgZXhhY3Q9MCwgYXNLZXl3b3JkPUZhbHNlLCBleGNsdWRlQ2hhcnM9Tm9uZSApOgogICAgICAgIHN1cGVyKFdvcmQsc2VsZikuX19pbml0X18oKQogICAgICAgIGlmIGV4Y2x1ZGVDaGFyczoKICAgICAgICAgICAgaW5pdENoYXJzID0gJycuam9pbihjIGZvciBjIGluIGluaXRDaGFycyBpZiBjIG5vdCBpbiBleGNsdWRlQ2hhcnMpCiAgICAgICAgICAgIGlmIGJvZHlDaGFyczoKICAgICAgICAgICAgICAgIGJvZHlDaGFycyA9ICcnLmpvaW4oYyBmb3IgYyBpbiBib2R5Q2hhcnMgaWYgYyBub3QgaW4gZXhjbHVkZUNoYXJzKQogICAgICAgIHNlbGYuaW5pdENoYXJzT3JpZyA9IGluaXRDaGFycwogICAgICAgIHNlbGYuaW5pdENoYXJzID0gc2V0KGluaXRDaGFycykKICAgICAgICBpZiBib2R5Q2hhcnMgOgogICAgICAgICAgICBzZWxmLmJvZHlDaGFyc09yaWcgPSBib2R5Q2hhcnMKICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnMgPSBzZXQoYm9keUNoYXJzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzT3JpZyA9IGluaXRDaGFycwogICAgICAgICAgICBzZWxmLmJvZHlDaGFycyA9IHNldChpbml0Q2hhcnMpCgogICAgICAgIHNlbGYubWF4U3BlY2lmaWVkID0gbWF4ID4gMAoKICAgICAgICBpZiBtaW4gPCAxOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3Qgc3BlY2lmeSBhIG1pbmltdW0gbGVuZ3RoIDwgMTsgdXNlIE9wdGlvbmFsKFdvcmQoKSkgaWYgemVyby1sZW5ndGggd29yZCBpcyBwZXJtaXR0ZWQiKQoKICAgICAgICBzZWxmLm1pbkxlbiA9IG1pbgoKICAgICAgICBpZiBtYXggPiAwOgogICAgICAgICAgICBzZWxmLm1heExlbiA9IG1heAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gX01BWF9JTlQKCiAgICAgICAgaWYgZXhhY3QgPiAwOgogICAgICAgICAgICBzZWxmLm1heExlbiA9IGV4YWN0CiAgICAgICAgICAgIHNlbGYubWluTGVuID0gZXhhY3QKCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UKICAgICAgICBzZWxmLmFzS2V5d29yZCA9IGFzS2V5d29yZAoKICAgICAgICBpZiAnICcgbm90IGluIHNlbGYuaW5pdENoYXJzT3JpZytzZWxmLmJvZHlDaGFyc09yaWcgYW5kIChtaW49PTEgYW5kIG1heD09MCBhbmQgZXhhY3Q9PTApOgogICAgICAgICAgICBpZiBzZWxmLmJvZHlDaGFyc09yaWcgPT0gc2VsZi5pbml0Q2hhcnNPcmlnOgogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9ICJbJXNdKyIgJSBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuaW5pdENoYXJzT3JpZykKICAgICAgICAgICAgZWxpZiBsZW4oc2VsZi5pbml0Q2hhcnNPcmlnKSA9PSAxOgogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9ICIlc1slc10qIiAlIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmUuZXNjYXBlKHNlbGYuaW5pdENoYXJzT3JpZyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmJvZHlDaGFyc09yaWcpLCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSAiWyVzXVslc10qIiAlIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmluaXRDaGFyc09yaWcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5ib2R5Q2hhcnNPcmlnKSwpCiAgICAgICAgICAgIGlmIHNlbGYuYXNLZXl3b3JkOgogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHIiXGIiK3NlbGYucmVTdHJpbmcrciJcYiIKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5yZSA9IHJlLmNvbXBpbGUoIHNlbGYucmVTdHJpbmcgKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgc2VsZi5yZSA9IE5vbmUKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIHNlbGYucmU6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYucmUubWF0Y2goaW5zdHJpbmcsbG9jKQogICAgICAgICAgICBpZiBub3QgcmVzdWx0OgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgogICAgICAgICAgICBsb2MgPSByZXN1bHQuZW5kKCkKICAgICAgICAgICAgcmV0dXJuIGxvYywgcmVzdWx0Lmdyb3VwKCkKCiAgICAgICAgaWYgbm90KGluc3RyaW5nWyBsb2MgXSBpbiBzZWxmLmluaXRDaGFycyk6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKICAgICAgICBzdGFydCA9IGxvYwogICAgICAgIGxvYyArPSAxCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpCiAgICAgICAgYm9keWNoYXJzID0gc2VsZi5ib2R5Q2hhcnMKICAgICAgICBtYXhsb2MgPSBzdGFydCArIHNlbGYubWF4TGVuCiAgICAgICAgbWF4bG9jID0gbWluKCBtYXhsb2MsIGluc3RybGVuICkKICAgICAgICB3aGlsZSBsb2MgPCBtYXhsb2MgYW5kIGluc3RyaW5nW2xvY10gaW4gYm9keWNoYXJzOgogICAgICAgICAgICBsb2MgKz0gMQoKICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IEZhbHNlCiAgICAgICAgaWYgbG9jIC0gc3RhcnQgPCBzZWxmLm1pbkxlbjoKICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBUcnVlCiAgICAgICAgaWYgc2VsZi5tYXhTcGVjaWZpZWQgYW5kIGxvYyA8IGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdIGluIGJvZHljaGFyczoKICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBUcnVlCiAgICAgICAgaWYgc2VsZi5hc0tleXdvcmQ6CiAgICAgICAgICAgIGlmIChzdGFydD4wIGFuZCBpbnN0cmluZ1tzdGFydC0xXSBpbiBib2R5Y2hhcnMpIG9yIChsb2M8aW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10gaW4gYm9keWNoYXJzKToKICAgICAgICAgICAgICAgIHRocm93RXhjZXB0aW9uID0gVHJ1ZQoKICAgICAgICBpZiB0aHJvd0V4Y2VwdGlvbjoKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgogICAgICAgIHJldHVybiBsb2MsIGluc3RyaW5nW3N0YXJ0OmxvY10KCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFdvcmQsc2VsZikuX19zdHJfXygpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CgogICAgICAgICAgICBkZWYgY2hhcnNBc1N0cihzKToKICAgICAgICAgICAgICAgIGlmIGxlbihzKT40OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBzWzo0XSsiLi4uIgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcwoKICAgICAgICAgICAgaWYgKCBzZWxmLmluaXRDaGFyc09yaWcgIT0gc2VsZi5ib2R5Q2hhcnNPcmlnICk6CiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiVzooJXMsJXMpIiAlICggY2hhcnNBc1N0cihzZWxmLmluaXRDaGFyc09yaWcpLCBjaGFyc0FzU3RyKHNlbGYuYm9keUNoYXJzT3JpZykgKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlc6KCVzKSIgJSBjaGFyc0FzU3RyKHNlbGYuaW5pdENoYXJzT3JpZykKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKCmNsYXNzIFJlZ2V4KFRva2VuKToKICAgICIiIgogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHN0cmluZ3MgdGhhdCBtYXRjaCBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbi4KICAgIERlZmluZWQgd2l0aCBzdHJpbmcgc3BlY2lmeWluZyB0aGUgcmVndWxhciBleHByZXNzaW9uIGluIGEgZm9ybSByZWNvZ25pemVkIGJ5IHRoZSBpbmJ1aWx0IFB5dGhvbiByZSBtb2R1bGUuCiAgICBJZiB0aGUgZ2l2ZW4gcmVnZXggY29udGFpbnMgbmFtZWQgZ3JvdXBzIChkZWZpbmVkIHVzaW5nIEN7KD9QPG5hbWU+Li4uKX0pLCB0aGVzZSB3aWxsIGJlIHByZXNlcnZlZCBhcyAKICAgIG5hbWVkIHBhcnNlIHJlc3VsdHMuCgogICAgRXhhbXBsZTo6CiAgICAgICAgcmVhbG51bSA9IFJlZ2V4KHIiWystXT9cZCtcLlxkKiIpCiAgICAgICAgZGF0ZSA9IFJlZ2V4KHInKD9QPHllYXI+XGR7NH0pLSg/UDxtb250aD5cZFxkPyktKD9QPGRheT5cZFxkPyknKQogICAgICAgICMgcmVmOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI2NzM5OS9ob3ctZG8teW91LW1hdGNoLW9ubHktdmFsaWQtcm9tYW4tbnVtZXJhbHMtd2l0aC1hLXJlZ3VsYXItZXhwcmVzc2lvbgogICAgICAgIHJvbWFuID0gUmVnZXgociJNezAsNH0oQ018Q0R8RD9DezAsM30pKFhDfFhMfEw/WHswLDN9KShJWHxJVnxWP0l7MCwzfSkiKQogICAgIiIiCiAgICBjb21waWxlZFJFdHlwZSA9IHR5cGUocmUuY29tcGlsZSgiW0EtWl0iKSkKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcGF0dGVybiwgZmxhZ3M9MCk6CiAgICAgICAgIiIiVGhlIHBhcmFtZXRlcnMgQ3twYXR0ZXJufSBhbmQgQ3tmbGFnc30gYXJlIHBhc3NlZCB0byB0aGUgQ3tyZS5jb21waWxlKCl9IGZ1bmN0aW9uIGFzLWlzLiBTZWUgdGhlIFB5dGhvbiBDe3JlfSBtb2R1bGUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBhY2NlcHRhYmxlIHBhdHRlcm5zIGFuZCBmbGFncy4iIiIKICAgICAgICBzdXBlcihSZWdleCxzZWxmKS5fX2luaXRfXygpCgogICAgICAgIGlmIGlzaW5zdGFuY2UocGF0dGVybiwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgIGlmIG5vdCBwYXR0ZXJuOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigibnVsbCBzdHJpbmcgcGFzc2VkIHRvIFJlZ2V4OyB1c2UgRW1wdHkoKSBpbnN0ZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQoKICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gcGF0dGVybgogICAgICAgICAgICBzZWxmLmZsYWdzID0gZmxhZ3MKCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYucmUgPSByZS5jb21waWxlKHNlbGYucGF0dGVybiwgc2VsZi5mbGFncykKICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSBzZWxmLnBhdHRlcm4KICAgICAgICAgICAgZXhjZXB0IHNyZV9jb25zdGFudHMuZXJyb3I6CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJpbnZhbGlkIHBhdHRlcm4gKCVzKSBwYXNzZWQgdG8gUmVnZXgiICUgcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICBlbGlmIGlzaW5zdGFuY2UocGF0dGVybiwgUmVnZXguY29tcGlsZWRSRXR5cGUpOgogICAgICAgICAgICBzZWxmLnJlID0gcGF0dGVybgogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSBcCiAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSBzdHIocGF0dGVybikKICAgICAgICAgICAgc2VsZi5mbGFncyA9IGZsYWdzCiAgICAgICAgICAgIAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlJlZ2V4IG1heSBvbmx5IGJlIGNvbnN0cnVjdGVkIHdpdGggYSBzdHJpbmcgb3IgYSBjb21waWxlZCBSRSBvYmplY3QiKQoKICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICByZXN1bHQgPSBzZWxmLnJlLm1hdGNoKGluc3RyaW5nLGxvYykKICAgICAgICBpZiBub3QgcmVzdWx0OgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCiAgICAgICAgbG9jID0gcmVzdWx0LmVuZCgpCiAgICAgICAgZCA9IHJlc3VsdC5ncm91cGRpY3QoKQogICAgICAgIHJldCA9IFBhcnNlUmVzdWx0cyhyZXN1bHQuZ3JvdXAoKSkKICAgICAgICBpZiBkOgogICAgICAgICAgICBmb3IgayBpbiBkOgogICAgICAgICAgICAgICAgcmV0W2tdID0gZFtrXQogICAgICAgIHJldHVybiBsb2MscmV0CgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihSZWdleCxzZWxmKS5fX3N0cl9fKCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiUmU6KCVzKSIgJSByZXByKHNlbGYucGF0dGVybikKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKCmNsYXNzIFF1b3RlZFN0cmluZyhUb2tlbik6CiAgICByIiIiCiAgICBUb2tlbiBmb3IgbWF0Y2hpbmcgc3RyaW5ncyB0aGF0IGFyZSBkZWxpbWl0ZWQgYnkgcXVvdGluZyBjaGFyYWN0ZXJzLgogICAgCiAgICBEZWZpbmVkIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgogICAgICAgIC0gcXVvdGVDaGFyIC0gc3RyaW5nIG9mIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgZGVmaW5pbmcgdGhlIHF1b3RlIGRlbGltaXRpbmcgc3RyaW5nCiAgICAgICAgLSBlc2NDaGFyIC0gY2hhcmFjdGVyIHRvIGVzY2FwZSBxdW90ZXMsIHR5cGljYWxseSBiYWNrc2xhc2ggKGRlZmF1bHQ9Q3tOb25lfSkKICAgICAgICAtIGVzY1F1b3RlIC0gc3BlY2lhbCBxdW90ZSBzZXF1ZW5jZSB0byBlc2NhcGUgYW4gZW1iZWRkZWQgcXVvdGUgc3RyaW5nIChzdWNoIGFzIFNRTCdzICIiIHRvIGVzY2FwZSBhbiBlbWJlZGRlZCAiKSAoZGVmYXVsdD1De05vbmV9KQogICAgICAgIC0gbXVsdGlsaW5lIC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgcXVvdGVzIGNhbiBzcGFuIG11bHRpcGxlIGxpbmVzIChkZWZhdWx0PUN7RmFsc2V9KQogICAgICAgIC0gdW5xdW90ZVJlc3VsdHMgLSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWF0Y2hlZCB0ZXh0IHNob3VsZCBiZSB1bnF1b3RlZCAoZGVmYXVsdD1De1RydWV9KQogICAgICAgIC0gZW5kUXVvdGVDaGFyIC0gc3RyaW5nIG9mIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgZGVmaW5pbmcgdGhlIGVuZCBvZiB0aGUgcXVvdGUgZGVsaW1pdGVkIHN0cmluZyAoZGVmYXVsdD1De05vbmV9ID0+IHNhbWUgYXMgcXVvdGVDaGFyKQogICAgICAgIC0gY29udmVydFdoaXRlc3BhY2VFc2NhcGVzIC0gY29udmVydCBlc2NhcGVkIHdoaXRlc3BhY2UgKEN7J1x0J30sIEN7J1xuJ30sIGV0Yy4pIHRvIGFjdHVhbCB3aGl0ZXNwYWNlIChkZWZhdWx0PUN7VHJ1ZX0pCgogICAgRXhhbXBsZTo6CiAgICAgICAgcXMgPSBRdW90ZWRTdHJpbmcoJyInKQogICAgICAgIHByaW50KHFzLnNlYXJjaFN0cmluZygnbHNqZGYgIlRoaXMgaXMgdGhlIHF1b3RlIiBzbGRqZicpKQogICAgICAgIGNvbXBsZXhfcXMgPSBRdW90ZWRTdHJpbmcoJ3t7JywgZW5kUXVvdGVDaGFyPSd9fScpCiAgICAgICAgcHJpbnQoY29tcGxleF9xcy5zZWFyY2hTdHJpbmcoJ2xzamRmIHt7VGhpcyBpcyB0aGUgInF1b3RlIn19IHNsZGpmJykpCiAgICAgICAgc3FsX3FzID0gUXVvdGVkU3RyaW5nKCciJywgZXNjUXVvdGU9JyIiJykKICAgICAgICBwcmludChzcWxfcXMuc2VhcmNoU3RyaW5nKCdsc2pkZiAiVGhpcyBpcyB0aGUgcXVvdGUgd2l0aCAiImVtYmVkZGVkIiIgcXVvdGVzIiBzbGRqZicpKQogICAgcHJpbnRzOjoKICAgICAgICBbWydUaGlzIGlzIHRoZSBxdW90ZSddXQogICAgICAgIFtbJ1RoaXMgaXMgdGhlICJxdW90ZSInXV0KICAgICAgICBbWydUaGlzIGlzIHRoZSBxdW90ZSB3aXRoICJlbWJlZGRlZCIgcXVvdGVzJ11dCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcXVvdGVDaGFyLCBlc2NDaGFyPU5vbmUsIGVzY1F1b3RlPU5vbmUsIG11bHRpbGluZT1GYWxzZSwgdW5xdW90ZVJlc3VsdHM9VHJ1ZSwgZW5kUXVvdGVDaGFyPU5vbmUsIGNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcz1UcnVlKToKICAgICAgICBzdXBlcihRdW90ZWRTdHJpbmcsc2VsZikuX19pbml0X18oKQoKICAgICAgICAjIHJlbW92ZSB3aGl0ZSBzcGFjZSBmcm9tIHF1b3RlIGNoYXJzIC0gd29udCB3b3JrIGFueXdheQogICAgICAgIHF1b3RlQ2hhciA9IHF1b3RlQ2hhci5zdHJpcCgpCiAgICAgICAgaWYgbm90IHF1b3RlQ2hhcjoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigicXVvdGVDaGFyIGNhbm5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nIixTeW50YXhXYXJuaW5nLHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoKQoKICAgICAgICBpZiBlbmRRdW90ZUNoYXIgaXMgTm9uZToKICAgICAgICAgICAgZW5kUXVvdGVDaGFyID0gcXVvdGVDaGFyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZW5kUXVvdGVDaGFyID0gZW5kUXVvdGVDaGFyLnN0cmlwKCkKICAgICAgICAgICAgaWYgbm90IGVuZFF1b3RlQ2hhcjoKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImVuZFF1b3RlQ2hhciBjYW5ub3QgYmUgdGhlIGVtcHR5IHN0cmluZyIsU3ludGF4V2FybmluZyxzdGFja2xldmVsPTIpCiAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigpCgogICAgICAgIHNlbGYucXVvdGVDaGFyID0gcXVvdGVDaGFyCiAgICAgICAgc2VsZi5xdW90ZUNoYXJMZW4gPSBsZW4ocXVvdGVDaGFyKQogICAgICAgIHNlbGYuZmlyc3RRdW90ZUNoYXIgPSBxdW90ZUNoYXJbMF0KICAgICAgICBzZWxmLmVuZFF1b3RlQ2hhciA9IGVuZFF1b3RlQ2hhcgogICAgICAgIHNlbGYuZW5kUXVvdGVDaGFyTGVuID0gbGVuKGVuZFF1b3RlQ2hhcikKICAgICAgICBzZWxmLmVzY0NoYXIgPSBlc2NDaGFyCiAgICAgICAgc2VsZi5lc2NRdW90ZSA9IGVzY1F1b3RlCiAgICAgICAgc2VsZi51bnF1b3RlUmVzdWx0cyA9IHVucXVvdGVSZXN1bHRzCiAgICAgICAgc2VsZi5jb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXMgPSBjb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXMKCiAgICAgICAgaWYgbXVsdGlsaW5lOgogICAgICAgICAgICBzZWxmLmZsYWdzID0gcmUuTVVMVElMSU5FIHwgcmUuRE9UQUxMCiAgICAgICAgICAgIHNlbGYucGF0dGVybiA9IHInJXMoPzpbXiVzJXNdJyAlIFwKICAgICAgICAgICAgICAgICggcmUuZXNjYXBlKHNlbGYucXVvdGVDaGFyKSwKICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmVuZFF1b3RlQ2hhclswXSksCiAgICAgICAgICAgICAgICAgIChlc2NDaGFyIGlzIG5vdCBOb25lIGFuZCBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKGVzY0NoYXIpIG9yICcnKSApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5mbGFncyA9IDAKICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gciclcyg/OlteJXNcblxyJXNdJyAlIFwKICAgICAgICAgICAgICAgICggcmUuZXNjYXBlKHNlbGYucXVvdGVDaGFyKSwKICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmVuZFF1b3RlQ2hhclswXSksCiAgICAgICAgICAgICAgICAgIChlc2NDaGFyIGlzIG5vdCBOb25lIGFuZCBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKGVzY0NoYXIpIG9yICcnKSApCiAgICAgICAgaWYgbGVuKHNlbGYuZW5kUXVvdGVDaGFyKSA+IDE6CiAgICAgICAgICAgIHNlbGYucGF0dGVybiArPSAoCiAgICAgICAgICAgICAgICAnfCg/OicgKyAnKXwoPzonLmpvaW4oIiVzW14lc10iICUgKHJlLmVzY2FwZShzZWxmLmVuZFF1b3RlQ2hhcls6aV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5lbmRRdW90ZUNoYXJbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5lbmRRdW90ZUNoYXIpLTEsMCwtMSkpICsgJyknCiAgICAgICAgICAgICAgICApCiAgICAgICAgaWYgZXNjUXVvdGU6CiAgICAgICAgICAgIHNlbGYucGF0dGVybiArPSAocid8KD86JXMpJyAlIHJlLmVzY2FwZShlc2NRdW90ZSkpCiAgICAgICAgaWYgZXNjQ2hhcjoKICAgICAgICAgICAgc2VsZi5wYXR0ZXJuICs9IChyJ3woPzolcy4pJyAlIHJlLmVzY2FwZShlc2NDaGFyKSkKICAgICAgICAgICAgc2VsZi5lc2NDaGFyUmVwbGFjZVBhdHRlcm4gPSByZS5lc2NhcGUoc2VsZi5lc2NDaGFyKSsiKC4pIgogICAgICAgIHNlbGYucGF0dGVybiArPSAocicpKiVzJyAlIHJlLmVzY2FwZShzZWxmLmVuZFF1b3RlQ2hhcikpCgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5yZSA9IHJlLmNvbXBpbGUoc2VsZi5wYXR0ZXJuLCBzZWxmLmZsYWdzKQogICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gc2VsZi5wYXR0ZXJuCiAgICAgICAgZXhjZXB0IHNyZV9jb25zdGFudHMuZXJyb3I6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImludmFsaWQgcGF0dGVybiAoJXMpIHBhc3NlZCB0byBSZWdleCIgJSBzZWxmLnBhdHRlcm4sCiAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJhaXNlCgogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIHJlc3VsdCA9IGluc3RyaW5nW2xvY10gPT0gc2VsZi5maXJzdFF1b3RlQ2hhciBhbmQgc2VsZi5yZS5tYXRjaChpbnN0cmluZyxsb2MpIG9yIE5vbmUKICAgICAgICBpZiBub3QgcmVzdWx0OgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCiAgICAgICAgbG9jID0gcmVzdWx0LmVuZCgpCiAgICAgICAgcmV0ID0gcmVzdWx0Lmdyb3VwKCkKCiAgICAgICAgaWYgc2VsZi51bnF1b3RlUmVzdWx0czoKCiAgICAgICAgICAgICMgc3RyaXAgb2ZmIHF1b3RlcwogICAgICAgICAgICByZXQgPSByZXRbc2VsZi5xdW90ZUNoYXJMZW46LXNlbGYuZW5kUXVvdGVDaGFyTGVuXQoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXQsYmFzZXN0cmluZyk6CiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgZXNjYXBlZCB3aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICBpZiAnXFwnIGluIHJldCBhbmQgc2VsZi5jb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXM6CiAgICAgICAgICAgICAgICAgICAgd3NfbWFwID0gewogICAgICAgICAgICAgICAgICAgICAgICByJ1x0JyA6ICdcdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHInXG4nIDogJ1xuJywKICAgICAgICAgICAgICAgICAgICAgICAgcidcZicgOiAnXGYnLAogICAgICAgICAgICAgICAgICAgICAgICByJ1xyJyA6ICdccicsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvciB3c2xpdCx3c2NoYXIgaW4gd3NfbWFwLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldC5yZXBsYWNlKHdzbGl0LCB3c2NoYXIpCgogICAgICAgICAgICAgICAgIyByZXBsYWNlIGVzY2FwZWQgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgaWYgc2VsZi5lc2NDaGFyOgogICAgICAgICAgICAgICAgICAgIHJldCA9IHJlLnN1YihzZWxmLmVzY0NoYXJSZXBsYWNlUGF0dGVybiwiXGc8MT4iLHJldCkKCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgZXNjYXBlZCBxdW90ZXMKICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNjUXVvdGU6CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0LnJlcGxhY2Uoc2VsZi5lc2NRdW90ZSwgc2VsZi5lbmRRdW90ZUNoYXIpCgogICAgICAgIHJldHVybiBsb2MsIHJldAoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3VwZXIoUXVvdGVkU3RyaW5nLHNlbGYpLl9fc3RyX18oKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJxdW90ZWQgc3RyaW5nLCBzdGFydGluZyB3aXRoICVzIGVuZGluZyB3aXRoICVzIiAlIChzZWxmLnF1b3RlQ2hhciwgc2VsZi5lbmRRdW90ZUNoYXIpCgogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCgpjbGFzcyBDaGFyc05vdEluKFRva2VuKToKICAgICIiIgogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHdvcmRzIGNvbXBvc2VkIG9mIGNoYXJhY3RlcnMgSXtub3R9IGluIGEgZ2l2ZW4gc2V0ICh3aWxsCiAgICBpbmNsdWRlIHdoaXRlc3BhY2UgaW4gbWF0Y2hlZCBjaGFyYWN0ZXJzIGlmIG5vdCBsaXN0ZWQgaW4gdGhlIHByb3ZpZGVkIGV4Y2x1c2lvbiBzZXQgLSBzZWUgZXhhbXBsZSkuCiAgICBEZWZpbmVkIHdpdGggc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGRpc2FsbG93ZWQgY2hhcmFjdGVycywgYW5kIGFuIG9wdGlvbmFsCiAgICBtaW5pbXVtLCBtYXhpbXVtLCBhbmQvb3IgZXhhY3QgbGVuZ3RoLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIEN7bWlufSBpcyAxIChhCiAgICBtaW5pbXVtIHZhbHVlIDwgMSBpcyBub3QgdmFsaWQpOyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIEN7bWF4fSBhbmQgQ3tleGFjdH0KICAgIGFyZSAwLCBtZWFuaW5nIG5vIG1heGltdW0gb3IgZXhhY3QgbGVuZ3RoIHJlc3RyaWN0aW9uLgoKICAgIEV4YW1wbGU6OgogICAgICAgICMgZGVmaW5lIGEgY29tbWEtc2VwYXJhdGVkLXZhbHVlIGFzIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgJywnCiAgICAgICAgY3N2X3ZhbHVlID0gQ2hhcnNOb3RJbignLCcpCiAgICAgICAgcHJpbnQoZGVsaW1pdGVkTGlzdChjc3ZfdmFsdWUpLnBhcnNlU3RyaW5nKCJka2xzLGxzZGtqZixzMTIgMzQsQCEjLDIxMyIpKQogICAgcHJpbnRzOjoKICAgICAgICBbJ2RrbHMnLCAnbHNka2pmJywgJ3MxMiAzNCcsICdAISMnLCAnMjEzJ10KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBub3RDaGFycywgbWluPTEsIG1heD0wLCBleGFjdD0wICk6CiAgICAgICAgc3VwZXIoQ2hhcnNOb3RJbixzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlCiAgICAgICAgc2VsZi5ub3RDaGFycyA9IG5vdENoYXJzCgogICAgICAgIGlmIG1pbiA8IDE6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBzcGVjaWZ5IGEgbWluaW11bSBsZW5ndGggPCAxOyB1c2UgT3B0aW9uYWwoQ2hhcnNOb3RJbigpKSBpZiB6ZXJvLWxlbmd0aCBjaGFyIGdyb3VwIGlzIHBlcm1pdHRlZCIpCgogICAgICAgIHNlbGYubWluTGVuID0gbWluCgogICAgICAgIGlmIG1heCA+IDA6CiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gbWF4CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBfTUFYX0lOVAoKICAgICAgICBpZiBleGFjdCA+IDA6CiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gZXhhY3QKICAgICAgICAgICAgc2VsZi5taW5MZW4gPSBleGFjdAoKICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gKCBzZWxmLm1pbkxlbiA9PSAwICkKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgaW5zdHJpbmdbbG9jXSBpbiBzZWxmLm5vdENoYXJzOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCiAgICAgICAgc3RhcnQgPSBsb2MKICAgICAgICBsb2MgKz0gMQogICAgICAgIG5vdGNoYXJzID0gc2VsZi5ub3RDaGFycwogICAgICAgIG1heGxlbiA9IG1pbiggc3RhcnQrc2VsZi5tYXhMZW4sIGxlbihpbnN0cmluZykgKQogICAgICAgIHdoaWxlIGxvYyA8IG1heGxlbiBhbmQgXAogICAgICAgICAgICAgIChpbnN0cmluZ1tsb2NdIG5vdCBpbiBub3RjaGFycyk6CiAgICAgICAgICAgIGxvYyArPSAxCgogICAgICAgIGlmIGxvYyAtIHN0YXJ0IDwgc2VsZi5taW5MZW46CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKICAgICAgICByZXR1cm4gbG9jLCBpbnN0cmluZ1tzdGFydDpsb2NdCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihDaGFyc05vdEluLCBzZWxmKS5fX3N0cl9fKCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBpZiBsZW4oc2VsZi5ub3RDaGFycykgPiA0OgogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiFXOiglcy4uLikiICUgc2VsZi5ub3RDaGFyc1s6NF0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIhVzooJXMpIiAlIHNlbGYubm90Q2hhcnMKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKY2xhc3MgV2hpdGUoVG9rZW4pOgogICAgIiIiCiAgICBTcGVjaWFsIG1hdGNoaW5nIGNsYXNzIGZvciBtYXRjaGluZyB3aGl0ZXNwYWNlLiAgTm9ybWFsbHksIHdoaXRlc3BhY2UgaXMgaWdub3JlZAogICAgYnkgcHlwYXJzaW5nIGdyYW1tYXJzLiAgVGhpcyBjbGFzcyBpcyBpbmNsdWRlZCB3aGVuIHNvbWUgd2hpdGVzcGFjZSBzdHJ1Y3R1cmVzCiAgICBhcmUgc2lnbmlmaWNhbnQuICBEZWZpbmUgd2l0aCBhIHN0cmluZyBjb250YWluaW5nIHRoZSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gYmUKICAgIG1hdGNoZWQ7IGRlZmF1bHQgaXMgQ3siIFxcdFxcclxcbiJ9LiAgQWxzbyB0YWtlcyBvcHRpb25hbCBDe21pbn0sIEN7bWF4fSwgYW5kIEN7ZXhhY3R9IGFyZ3VtZW50cywKICAgIGFzIGRlZmluZWQgZm9yIHRoZSBDe0x7V29yZH19IGNsYXNzLgogICAgIiIiCiAgICB3aGl0ZVN0cnMgPSB7CiAgICAgICAgIiAiIDogIjxTUEM+IiwKICAgICAgICAiXHQiOiAiPFRBQj4iLAogICAgICAgICJcbiI6ICI8TEY+IiwKICAgICAgICAiXHIiOiAiPENSPiIsCiAgICAgICAgIlxmIjogIjxGRj4iLAogICAgICAgIH0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3cz0iIFx0XHJcbiIsIG1pbj0xLCBtYXg9MCwgZXhhY3Q9MCk6CiAgICAgICAgc3VwZXIoV2hpdGUsc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYubWF0Y2hXaGl0ZSA9IHdzCiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoICIiLmpvaW4oYyBmb3IgYyBpbiBzZWxmLndoaXRlQ2hhcnMgaWYgYyBub3QgaW4gc2VsZi5tYXRjaFdoaXRlKSApCiAgICAgICAgI34gc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQogICAgICAgIHNlbGYubmFtZSA9ICgiIi5qb2luKFdoaXRlLndoaXRlU3Ryc1tjXSBmb3IgYyBpbiBzZWxmLm1hdGNoV2hpdGUpKQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQoKICAgICAgICBzZWxmLm1pbkxlbiA9IG1pbgoKICAgICAgICBpZiBtYXggPiAwOgogICAgICAgICAgICBzZWxmLm1heExlbiA9IG1heAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gX01BWF9JTlQKCiAgICAgICAgaWYgZXhhY3QgPiAwOgogICAgICAgICAgICBzZWxmLm1heExlbiA9IGV4YWN0CiAgICAgICAgICAgIHNlbGYubWluTGVuID0gZXhhY3QKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIG5vdChpbnN0cmluZ1sgbG9jIF0gaW4gc2VsZi5tYXRjaFdoaXRlKToKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCiAgICAgICAgc3RhcnQgPSBsb2MKICAgICAgICBsb2MgKz0gMQogICAgICAgIG1heGxvYyA9IHN0YXJ0ICsgc2VsZi5tYXhMZW4KICAgICAgICBtYXhsb2MgPSBtaW4oIG1heGxvYywgbGVuKGluc3RyaW5nKSApCiAgICAgICAgd2hpbGUgbG9jIDwgbWF4bG9jIGFuZCBpbnN0cmluZ1tsb2NdIGluIHNlbGYubWF0Y2hXaGl0ZToKICAgICAgICAgICAgbG9jICs9IDEKCiAgICAgICAgaWYgbG9jIC0gc3RhcnQgPCBzZWxmLm1pbkxlbjoKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgogICAgICAgIHJldHVybiBsb2MsIGluc3RyaW5nW3N0YXJ0OmxvY10KCgpjbGFzcyBfUG9zaXRpb25Ub2tlbihUb2tlbik6CiAgICBkZWYgX19pbml0X18oIHNlbGYgKToKICAgICAgICBzdXBlcihfUG9zaXRpb25Ub2tlbixzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5uYW1lPXNlbGYuX19jbGFzc19fLl9fbmFtZV9fCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQoKY2xhc3MgR29Ub0NvbHVtbihfUG9zaXRpb25Ub2tlbik6CiAgICAiIiIKICAgIFRva2VuIHRvIGFkdmFuY2UgdG8gYSBzcGVjaWZpYyBjb2x1bW4gb2YgaW5wdXQgdGV4dDsgdXNlZnVsIGZvciB0YWJ1bGFyIHJlcG9ydCBzY3JhcGluZy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBjb2xubyApOgogICAgICAgIHN1cGVyKEdvVG9Db2x1bW4sc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuY29sID0gY29sbm8KCiAgICBkZWYgcHJlUGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToKICAgICAgICBpZiBjb2wobG9jLGluc3RyaW5nKSAhPSBzZWxmLmNvbDoKICAgICAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpCiAgICAgICAgICAgIGlmIHNlbGYuaWdub3JlRXhwcnM6CiAgICAgICAgICAgICAgICBsb2MgPSBzZWxmLl9za2lwSWdub3JhYmxlcyggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgICAgIHdoaWxlIGxvYyA8IGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdLmlzc3BhY2UoKSBhbmQgY29sKCBsb2MsIGluc3RyaW5nICkgIT0gc2VsZi5jb2wgOgogICAgICAgICAgICAgICAgbG9jICs9IDEKICAgICAgICByZXR1cm4gbG9jCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICB0aGlzY29sID0gY29sKCBsb2MsIGluc3RyaW5nICkKICAgICAgICBpZiB0aGlzY29sID4gc2VsZi5jb2w6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbG9jLCAiVGV4dCBub3QgaW4gZXhwZWN0ZWQgY29sdW1uIiwgc2VsZiApCiAgICAgICAgbmV3bG9jID0gbG9jICsgc2VsZi5jb2wgLSB0aGlzY29sCiAgICAgICAgcmV0ID0gaW5zdHJpbmdbIGxvYzogbmV3bG9jIF0KICAgICAgICByZXR1cm4gbmV3bG9jLCByZXQKCgpjbGFzcyBMaW5lU3RhcnQoX1Bvc2l0aW9uVG9rZW4pOgogICAgIiIiCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgd2l0aGluIHRoZSBwYXJzZSBzdHJpbmcKICAgIAogICAgRXhhbXBsZTo6CiAgICAKICAgICAgICB0ZXN0ID0gJycnXAogICAgICAgIEFBQSB0aGlzIGxpbmUKICAgICAgICBBQUEgYW5kIHRoaXMgbGluZQogICAgICAgICAgQUFBIGJ1dCBub3QgdGhpcyBvbmUKICAgICAgICBCIEFBQSBhbmQgZGVmaW5pdGVseSBub3QgdGhpcyBvbmUKICAgICAgICAnJycKCiAgICAgICAgZm9yIHQgaW4gKExpbmVTdGFydCgpICsgJ0FBQScgKyByZXN0T2ZMaW5lKS5zZWFyY2hTdHJpbmcodGVzdCk6CiAgICAgICAgICAgIHByaW50KHQpCiAgICAKICAgIFByaW50czo6CiAgICAgICAgWydBQUEnLCAnIHRoaXMgbGluZSddCiAgICAgICAgWydBQUEnLCAnIGFuZCB0aGlzIGxpbmUnXSAgICAKCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgogICAgICAgIHN1cGVyKExpbmVTdGFydCxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgc3RhcnQgb2YgbGluZSIKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIGNvbChsb2MsIGluc3RyaW5nKSA9PSAxOgogICAgICAgICAgICByZXR1cm4gbG9jLCBbXQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKY2xhc3MgTGluZUVuZChfUG9zaXRpb25Ub2tlbik6CiAgICAiIiIKICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mIGEgbGluZSB3aXRoaW4gdGhlIHBhcnNlIHN0cmluZwogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToKICAgICAgICBzdXBlcihMaW5lRW5kLHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLnJlcGxhY2UoIlxuIiwiIikgKQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIGVuZCBvZiBsaW5lIgoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgbG9jPGxlbihpbnN0cmluZyk6CiAgICAgICAgICAgIGlmIGluc3RyaW5nW2xvY10gPT0gIlxuIjoKICAgICAgICAgICAgICAgIHJldHVybiBsb2MrMSwgIlxuIgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCiAgICAgICAgZWxpZiBsb2MgPT0gbGVuKGluc3RyaW5nKToKICAgICAgICAgICAgcmV0dXJuIGxvYysxLCBbXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKY2xhc3MgU3RyaW5nU3RhcnQoX1Bvc2l0aW9uVG9rZW4pOgogICAgIiIiCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFyc2Ugc3RyaW5nCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgogICAgICAgIHN1cGVyKFN0cmluZ1N0YXJ0LHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBzdGFydCBvZiB0ZXh0IgoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgbG9jICE9IDA6CiAgICAgICAgICAgICMgc2VlIGlmIGVudGlyZSBzdHJpbmcgdXAgdG8gaGVyZSBpcyBqdXN0IHdoaXRlc3BhY2UgYW5kIGlnbm9yZWFibGVzCiAgICAgICAgICAgIGlmIGxvYyAhPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgMCApOgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCiAgICAgICAgcmV0dXJuIGxvYywgW10KCmNsYXNzIFN0cmluZ0VuZChfUG9zaXRpb25Ub2tlbik6CiAgICAiIiIKICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mIHRoZSBwYXJzZSBzdHJpbmcKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6CiAgICAgICAgc3VwZXIoU3RyaW5nRW5kLHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBlbmQgb2YgdGV4dCIKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIGxvYyA8IGxlbihpbnN0cmluZyk6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQogICAgICAgIGVsaWYgbG9jID09IGxlbihpbnN0cmluZyk6CiAgICAgICAgICAgIHJldHVybiBsb2MrMSwgW10KICAgICAgICBlbGlmIGxvYyA+IGxlbihpbnN0cmluZyk6CiAgICAgICAgICAgIHJldHVybiBsb2MsIFtdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgpjbGFzcyBXb3JkU3RhcnQoX1Bvc2l0aW9uVG9rZW4pOgogICAgIiIiCiAgICBNYXRjaGVzIGlmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBXb3JkLCBhbmQKICAgIGlzIG5vdCBwcmVjZWRlZCBieSBhbnkgY2hhcmFjdGVyIGluIGEgZ2l2ZW4gc2V0IG9mIEN7d29yZENoYXJzfQogICAgKGRlZmF1bHQ9Q3twcmludGFibGVzfSkuIFRvIGVtdWxhdGUgdGhlIEN7XGJ9IGJlaGF2aW9yIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMsCiAgICB1c2UgQ3tXb3JkU3RhcnQoYWxwaGFudW1zKX0uIEN7V29yZFN0YXJ0fSB3aWxsIGFsc28gbWF0Y2ggYXQgdGhlIGJlZ2lubmluZyBvZgogICAgdGhlIHN0cmluZyBiZWluZyBwYXJzZWQsIG9yIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgd29yZENoYXJzID0gcHJpbnRhYmxlcyk6CiAgICAgICAgc3VwZXIoV29yZFN0YXJ0LHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLndvcmRDaGFycyA9IHNldCh3b3JkQ2hhcnMpCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiTm90IGF0IHRoZSBzdGFydCBvZiBhIHdvcmQiCgogICAgZGVmIHBhcnNlSW1wbChzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIGxvYyAhPSAwOgogICAgICAgICAgICBpZiAoaW5zdHJpbmdbbG9jLTFdIGluIHNlbGYud29yZENoYXJzIG9yCiAgICAgICAgICAgICAgICBpbnN0cmluZ1tsb2NdIG5vdCBpbiBzZWxmLndvcmRDaGFycyk6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKICAgICAgICByZXR1cm4gbG9jLCBbXQoKY2xhc3MgV29yZEVuZChfUG9zaXRpb25Ub2tlbik6CiAgICAiIiIKICAgIE1hdGNoZXMgaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGVuZCBvZiBhIFdvcmQsIGFuZAogICAgaXMgbm90IGZvbGxvd2VkIGJ5IGFueSBjaGFyYWN0ZXIgaW4gYSBnaXZlbiBzZXQgb2YgQ3t3b3JkQ2hhcnN9CiAgICAoZGVmYXVsdD1De3ByaW50YWJsZXN9KS4gVG8gZW11bGF0ZSB0aGUgQ3tcYn0gYmVoYXZpb3Igb2YgcmVndWxhciBleHByZXNzaW9ucywKICAgIHVzZSBDe1dvcmRFbmQoYWxwaGFudW1zKX0uIEN7V29yZEVuZH0gd2lsbCBhbHNvIG1hdGNoIGF0IHRoZSBlbmQgb2YKICAgIHRoZSBzdHJpbmcgYmVpbmcgcGFyc2VkLCBvciBhdCB0aGUgZW5kIG9mIGEgbGluZS4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdvcmRDaGFycyA9IHByaW50YWJsZXMpOgogICAgICAgIHN1cGVyKFdvcmRFbmQsc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYud29yZENoYXJzID0gc2V0KHdvcmRDaGFycykKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UKICAgICAgICBzZWxmLmVycm1zZyA9ICJOb3QgYXQgdGhlIGVuZCBvZiBhIHdvcmQiCgogICAgZGVmIHBhcnNlSW1wbChzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQogICAgICAgIGlmIGluc3RybGVuPjAgYW5kIGxvYzxpbnN0cmxlbjoKICAgICAgICAgICAgaWYgKGluc3RyaW5nW2xvY10gaW4gc2VsZi53b3JkQ2hhcnMgb3IKICAgICAgICAgICAgICAgIGluc3RyaW5nW2xvYy0xXSBub3QgaW4gc2VsZi53b3JkQ2hhcnMpOgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCiAgICAgICAgcmV0dXJuIGxvYywgW10KCgpjbGFzcyBQYXJzZUV4cHJlc3Npb24oUGFyc2VyRWxlbWVudCk6CiAgICAiIiIKICAgIEFic3RyYWN0IHN1YmNsYXNzIG9mIFBhcnNlckVsZW1lbnQsIGZvciBjb21iaW5pbmcgYW5kIHBvc3QtcHJvY2Vzc2luZyBwYXJzZWQgdG9rZW5zLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IEZhbHNlICk6CiAgICAgICAgc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLl9faW5pdF9fKHNhdmVsaXN0KQogICAgICAgIGlmIGlzaW5zdGFuY2UoIGV4cHJzLCBfZ2VuZXJhdG9yVHlwZSApOgogICAgICAgICAgICBleHBycyA9IGxpc3QoZXhwcnMpCgogICAgICAgIGlmIGlzaW5zdGFuY2UoIGV4cHJzLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBbIFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggZXhwcnMgKSBdCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKCBleHBycywgY29sbGVjdGlvbnMuSXRlcmFibGUgKToKICAgICAgICAgICAgZXhwcnMgPSBsaXN0KGV4cHJzKQogICAgICAgICAgICAjIGlmIHNlcXVlbmNlIG9mIHN0cmluZ3MgcHJvdmlkZWQsIHdyYXAgd2l0aCBMaXRlcmFsCiAgICAgICAgICAgIGlmIGFsbChpc2luc3RhbmNlKGV4cHIsIGJhc2VzdHJpbmcpIGZvciBleHByIGluIGV4cHJzKToKICAgICAgICAgICAgICAgIGV4cHJzID0gbWFwKFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcywgZXhwcnMpCiAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBsaXN0KGV4cHJzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBsaXN0KCBleHBycyApCiAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gWyBleHBycyBdCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBGYWxzZQoKICAgIGRlZiBfX2dldGl0ZW1fXyggc2VsZiwgaSApOgogICAgICAgIHJldHVybiBzZWxmLmV4cHJzW2ldCgogICAgZGVmIGFwcGVuZCggc2VsZiwgb3RoZXIgKToKICAgICAgICBzZWxmLmV4cHJzLmFwcGVuZCggb3RoZXIgKQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToKICAgICAgICAiIiJFeHRlbmRzIEN7bGVhdmVXaGl0ZXNwYWNlfSBkZWZpbmVkIGluIGJhc2UgY2xhc3MsIGFuZCBhbHNvIGludm9rZXMgQ3tsZWF2ZVdoaXRlc3BhY2V9IG9uCiAgICAgICAgICAgYWxsIGNvbnRhaW5lZCBleHByZXNzaW9ucy4iIiIKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UKICAgICAgICBzZWxmLmV4cHJzID0gWyBlLmNvcHkoKSBmb3IgZSBpbiBzZWxmLmV4cHJzIF0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOgogICAgICAgICAgICBlLmxlYXZlV2hpdGVzcGFjZSgpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBTdXBwcmVzcyApOgogICAgICAgICAgICBpZiBvdGhlciBub3QgaW4gc2VsZi5pZ25vcmVFeHByczoKICAgICAgICAgICAgICAgIHN1cGVyKCBQYXJzZUV4cHJlc3Npb24sIHNlbGYpLmlnbm9yZSggb3RoZXIgKQogICAgICAgICAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoKICAgICAgICAgICAgICAgICAgICBlLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN1cGVyKCBQYXJzZUV4cHJlc3Npb24sIHNlbGYpLmlnbm9yZSggb3RoZXIgKQogICAgICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOgogICAgICAgICAgICAgICAgZS5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLl9fc3RyX18oKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIlczooJXMpIiAlICggc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIF91c3RyKHNlbGYuZXhwcnMpICkKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToKICAgICAgICBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuc3RyZWFtbGluZSgpCgogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6CiAgICAgICAgICAgIGUuc3RyZWFtbGluZSgpCgogICAgICAgICMgY29sbGFwc2UgbmVzdGVkIEFuZCdzIG9mIHRoZSBmb3JtIEFuZCggQW5kKCBBbmQoIGEsYiksIGMpLCBkKSB0byBBbmQoIGEsYixjLGQgKQogICAgICAgICMgYnV0IG9ubHkgaWYgdGhlcmUgYXJlIG5vIHBhcnNlIGFjdGlvbnMgb3IgcmVzdWx0c05hbWVzIG9uIHRoZSBuZXN0ZWQgQW5kJ3MKICAgICAgICAjIChsaWtld2lzZSBmb3IgT3IncyBhbmQgTWF0Y2hGaXJzdCdzKQogICAgICAgIGlmICggbGVuKHNlbGYuZXhwcnMpID09IDIgKToKICAgICAgICAgICAgb3RoZXIgPSBzZWxmLmV4cHJzWzBdCiAgICAgICAgICAgIGlmICggaXNpbnN0YW5jZSggb3RoZXIsIHNlbGYuX19jbGFzc19fICkgYW5kCiAgICAgICAgICAgICAgICAgIG5vdChvdGhlci5wYXJzZUFjdGlvbikgYW5kCiAgICAgICAgICAgICAgICAgIG90aGVyLnJlc3VsdHNOYW1lIGlzIE5vbmUgYW5kCiAgICAgICAgICAgICAgICAgIG5vdCBvdGhlci5kZWJ1ZyApOgogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IG90aGVyLmV4cHJzWzpdICsgWyBzZWxmLmV4cHJzWzFdIF0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUKICAgICAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgfD0gb3RoZXIubWF5UmV0dXJuRW1wdHkKICAgICAgICAgICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciAgfD0gb3RoZXIubWF5SW5kZXhFcnJvcgoKICAgICAgICAgICAgb3RoZXIgPSBzZWxmLmV4cHJzWy0xXQogICAgICAgICAgICBpZiAoIGlzaW5zdGFuY2UoIG90aGVyLCBzZWxmLl9fY2xhc3NfXyApIGFuZAogICAgICAgICAgICAgICAgICBub3Qob3RoZXIucGFyc2VBY3Rpb24pIGFuZAogICAgICAgICAgICAgICAgICBvdGhlci5yZXN1bHRzTmFtZSBpcyBOb25lIGFuZAogICAgICAgICAgICAgICAgICBub3Qgb3RoZXIuZGVidWcgKToKICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBzZWxmLmV4cHJzWzotMV0gKyBvdGhlci5leHByc1s6XQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQogICAgICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSB8PSBvdGhlci5tYXlSZXR1cm5FbXB0eQogICAgICAgICAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yICB8PSBvdGhlci5tYXlJbmRleEVycm9yCgogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBfdXN0cihzZWxmKQogICAgICAgIAogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHNldFJlc3VsdHNOYW1lKCBzZWxmLCBuYW1lLCBsaXN0QWxsTWF0Y2hlcz1GYWxzZSApOgogICAgICAgIHJldCA9IHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5zZXRSZXN1bHRzTmFtZShuYW1lLGxpc3RBbGxNYXRjaGVzKQogICAgICAgIHJldHVybiByZXQKCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToKICAgICAgICB0bXAgPSB2YWxpZGF0ZVRyYWNlWzpdK1tzZWxmXQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6CiAgICAgICAgICAgIGUudmFsaWRhdGUodG1wKQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oIFtdICkKICAgICAgICAKICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgIHJldCA9IHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5jb3B5KCkKICAgICAgICByZXQuZXhwcnMgPSBbZS5jb3B5KCkgZm9yIGUgaW4gc2VsZi5leHByc10KICAgICAgICByZXR1cm4gcmV0CgpjbGFzcyBBbmQoUGFyc2VFeHByZXNzaW9uKToKICAgICIiIgogICAgUmVxdWlyZXMgYWxsIGdpdmVuIEN7UGFyc2VFeHByZXNzaW9ufXMgdG8gYmUgZm91bmQgaW4gdGhlIGdpdmVuIG9yZGVyLgogICAgRXhwcmVzc2lvbnMgbWF5IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLgogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeycrJ30gb3BlcmF0b3IuCiAgICBNYXkgYWxzbyBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snLSd9IG9wZXJhdG9yLCB3aGljaCB3aWxsIHN1cHByZXNzIGJhY2t0cmFja2luZy4KCiAgICBFeGFtcGxlOjoKICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQogICAgICAgIG5hbWVfZXhwciA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpCgogICAgICAgIGV4cHIgPSBBbmQoW2ludGVnZXIoImlkIiksbmFtZV9leHByKCJuYW1lIiksaW50ZWdlcigiYWdlIildKQogICAgICAgICMgbW9yZSBlYXNpbHkgd3JpdHRlbiBhczoKICAgICAgICBleHByID0gaW50ZWdlcigiaWQiKSArIG5hbWVfZXhwcigibmFtZSIpICsgaW50ZWdlcigiYWdlIikKICAgICIiIgoKICAgIGNsYXNzIF9FcnJvclN0b3AoRW1wdHkpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICBzdXBlcihBbmQuX0Vycm9yU3RvcCxzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIHNlbGYubmFtZSA9ICctJwogICAgICAgICAgICBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpCgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBUcnVlICk6CiAgICAgICAgc3VwZXIoQW5kLHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYWxsKGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykKICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggc2VsZi5leHByc1swXS53aGl0ZUNoYXJzICkKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gc2VsZi5leHByc1swXS5za2lwV2hpdGVzcGFjZQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gVHJ1ZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgIyBwYXNzIEZhbHNlIGFzIGxhc3QgYXJnIHRvIF9wYXJzZSBmb3IgZmlyc3QgZWxlbWVudCwgc2luY2Ugd2UgYWxyZWFkeQogICAgICAgICMgcHJlLXBhcnNlZCB0aGUgc3RyaW5nIGFzIHBhcnQgb2Ygb3VyIEFuZCBwcmUtcGFyc2luZwogICAgICAgIGxvYywgcmVzdWx0bGlzdCA9IHNlbGYuZXhwcnNbMF0uX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApCiAgICAgICAgZXJyb3JTdG9wID0gRmFsc2UKICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzWzE6XToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlLCBBbmQuX0Vycm9yU3RvcCk6CiAgICAgICAgICAgICAgICBlcnJvclN0b3AgPSBUcnVlCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBlcnJvclN0b3A6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgbG9jLCBleHBydG9rZW5zID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VTeW50YXhFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgcGU6CiAgICAgICAgICAgICAgICAgICAgcGUuX190cmFjZWJhY2tfXyA9IE5vbmUKICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZVN5bnRheEV4Y2VwdGlvbi5fZnJvbV9leGNlcHRpb24ocGUpCiAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZVN5bnRheEV4Y2VwdGlvbihpbnN0cmluZywgbGVuKGluc3RyaW5nKSwgc2VsZi5lcnJtc2csIHNlbGYpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2MsIGV4cHJ0b2tlbnMgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkKICAgICAgICAgICAgaWYgZXhwcnRva2VucyBvciBleHBydG9rZW5zLmhhc2tleXMoKToKICAgICAgICAgICAgICAgIHJlc3VsdGxpc3QgKz0gZXhwcnRva2VucwogICAgICAgIHJldHVybiBsb2MsIHJlc3VsdGxpc3QKCiAgICBkZWYgX19pYWRkX18oc2VsZiwgb3RoZXIgKToKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIHJldHVybiBzZWxmLmFwcGVuZCggb3RoZXIgKSAjQW5kKCBbIHNlbGYsIG90aGVyIF0gKQoKICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOgogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6CiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApCiAgICAgICAgICAgIGlmIG5vdCBlLm1heVJldHVybkVtcHR5OgogICAgICAgICAgICAgICAgYnJlYWsKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9IgoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgoKY2xhc3MgT3IoUGFyc2VFeHByZXNzaW9uKToKICAgICIiIgogICAgUmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgQ3tQYXJzZUV4cHJlc3Npb259IGlzIGZvdW5kLgogICAgSWYgdHdvIGV4cHJlc3Npb25zIG1hdGNoLCB0aGUgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgdGhlIGxvbmdlc3Qgc3RyaW5nIHdpbGwgYmUgdXNlZC4KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snXid9IG9wZXJhdG9yLgoKICAgIEV4YW1wbGU6OgogICAgICAgICMgY29uc3RydWN0IE9yIHVzaW5nICdeJyBvcGVyYXRvcgogICAgICAgIAogICAgICAgIG51bWJlciA9IFdvcmQobnVtcykgXiBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKQogICAgICAgIHByaW50KG51bWJlci5zZWFyY2hTdHJpbmcoIjEyMyAzLjE0MTYgNzg5IikpCiAgICBwcmludHM6OgogICAgICAgIFtbJzEyMyddLCBbJzMuMTQxNiddLCBbJzc4OSddXQogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IEZhbHNlICk6CiAgICAgICAgc3VwZXIoT3Isc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQogICAgICAgIGlmIHNlbGYuZXhwcnM6CiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbnkoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBtYXhFeGNMb2MgPSAtMQogICAgICAgIG1heEV4Y2VwdGlvbiA9IE5vbmUKICAgICAgICBtYXRjaGVzID0gW10KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBsb2MyID0gZS50cnlQYXJzZSggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlcnI6CiAgICAgICAgICAgICAgICBlcnIuX190cmFjZWJhY2tfXyA9IE5vbmUKICAgICAgICAgICAgICAgIGlmIGVyci5sb2MgPiBtYXhFeGNMb2M6CiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gZXJyCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gZXJyLmxvYwogICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgICAgIGlmIGxlbihpbnN0cmluZykgPiBtYXhFeGNMb2M6CiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsbGVuKGluc3RyaW5nKSxlLmVycm1zZyxzZWxmKQogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGxlbihpbnN0cmluZykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgc2F2ZSBtYXRjaCBhbW9uZyBhbGwgbWF0Y2hlcywgdG8gcmV0cnkgbG9uZ2VzdCB0byBzaG9ydGVzdAogICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoKGxvYzIsIGUpKQoKICAgICAgICBpZiBtYXRjaGVzOgogICAgICAgICAgICBtYXRjaGVzLnNvcnQoa2V5PWxhbWJkYSB4OiAteFswXSkKICAgICAgICAgICAgZm9yIF8sZSBpbiBtYXRjaGVzOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlcnI6CiAgICAgICAgICAgICAgICAgICAgZXJyLl9fdHJhY2ViYWNrX18gPSBOb25lCiAgICAgICAgICAgICAgICAgICAgaWYgZXJyLmxvYyA+IG1heEV4Y0xvYzoKICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gZXJyCiAgICAgICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGVyci5sb2MKCiAgICAgICAgaWYgbWF4RXhjZXB0aW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICBtYXhFeGNlcHRpb24ubXNnID0gc2VsZi5lcnJtc2cKICAgICAgICAgICAgcmFpc2UgbWF4RXhjZXB0aW9uCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgIm5vIGRlZmluZWQgYWx0ZXJuYXRpdmVzIHRvIG1hdGNoIiwgc2VsZikKCgogICAgZGVmIF9faXhvcl9fKHNlbGYsIG90aGVyICk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICByZXR1cm4gc2VsZi5hcHBlbmQoIG90aGVyICkgI09yKCBbIHNlbGYsIG90aGVyIF0gKQoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgXiAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gc2VsZi5leHBycykgKyAifSIKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOgogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6CiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApCgoKY2xhc3MgTWF0Y2hGaXJzdChQYXJzZUV4cHJlc3Npb24pOgogICAgIiIiCiAgICBSZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBDe1BhcnNlRXhwcmVzc2lvbn0gaXMgZm91bmQuCiAgICBJZiB0d28gZXhwcmVzc2lvbnMgbWF0Y2gsIHRoZSBmaXJzdCBvbmUgbGlzdGVkIGlzIHRoZSBvbmUgdGhhdCB3aWxsIG1hdGNoLgogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeyd8J30gb3BlcmF0b3IuCgogICAgRXhhbXBsZTo6CiAgICAgICAgIyBjb25zdHJ1Y3QgTWF0Y2hGaXJzdCB1c2luZyAnfCcgb3BlcmF0b3IKICAgICAgICAKICAgICAgICAjIHdhdGNoIHRoZSBvcmRlciBvZiBleHByZXNzaW9ucyB0byBtYXRjaAogICAgICAgIG51bWJlciA9IFdvcmQobnVtcykgfCBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKQogICAgICAgIHByaW50KG51bWJlci5zZWFyY2hTdHJpbmcoIjEyMyAzLjE0MTYgNzg5IikpICMgIEZhaWwhIC0+IFtbJzEyMyddLCBbJzMnXSwgWycxNDE2J10sIFsnNzg5J11dCgogICAgICAgICMgcHV0IG1vcmUgc2VsZWN0aXZlIGV4cHJlc3Npb24gZmlyc3QKICAgICAgICBudW1iZXIgPSBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKSB8IFdvcmQobnVtcykKICAgICAgICBwcmludChudW1iZXIuc2VhcmNoU3RyaW5nKCIxMjMgMy4xNDE2IDc4OSIpKSAjICBCZXR0ZXIgLT4gW1snMTIzJ10sIFsnMy4xNDE2J10sIFsnNzg5J11dCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gRmFsc2UgKToKICAgICAgICBzdXBlcihNYXRjaEZpcnN0LHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkKICAgICAgICBpZiBzZWxmLmV4cHJzOgogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYW55KGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgbWF4RXhjTG9jID0gLTEKICAgICAgICBtYXhFeGNlcHRpb24gPSBOb25lCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0ID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApCiAgICAgICAgICAgICAgICByZXR1cm4gcmV0CiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlcnI6CiAgICAgICAgICAgICAgICBpZiBlcnIubG9jID4gbWF4RXhjTG9jOgogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IGVycgogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGVyci5sb2MKICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgICAgICBpZiBsZW4oaW5zdHJpbmcpID4gbWF4RXhjTG9jOgogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLGxlbihpbnN0cmluZyksZS5lcnJtc2csc2VsZikKICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBsZW4oaW5zdHJpbmcpCgogICAgICAgICMgb25seSBnb3QgaGVyZSBpZiBubyBleHByZXNzaW9uIG1hdGNoZWQsIHJhaXNlIGV4Y2VwdGlvbiBmb3IgbWF0Y2ggdGhhdCBtYWRlIGl0IHRoZSBmdXJ0aGVzdAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG1heEV4Y2VwdGlvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbi5tc2cgPSBzZWxmLmVycm1zZwogICAgICAgICAgICAgICAgcmFpc2UgbWF4RXhjZXB0aW9uCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCAibm8gZGVmaW5lZCBhbHRlcm5hdGl2ZXMgdG8gbWF0Y2giLCBzZWxmKQoKICAgIGRlZiBfX2lvcl9fKHNlbGYsIG90aGVyICk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICByZXR1cm4gc2VsZi5hcHBlbmQoIG90aGVyICkgI01hdGNoRmlyc3QoIFsgc2VsZiwgb3RoZXIgXSApCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiB8ICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9IgoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6CiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoKICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkKCgpjbGFzcyBFYWNoKFBhcnNlRXhwcmVzc2lvbik6CiAgICAiIiIKICAgIFJlcXVpcmVzIGFsbCBnaXZlbiBDe1BhcnNlRXhwcmVzc2lvbn1zIHRvIGJlIGZvdW5kLCBidXQgaW4gYW55IG9yZGVyLgogICAgRXhwcmVzc2lvbnMgbWF5IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLgogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeycmJ30gb3BlcmF0b3IuCgogICAgRXhhbXBsZTo6CiAgICAgICAgY29sb3IgPSBvbmVPZigiUkVEIE9SQU5HRSBZRUxMT1cgR1JFRU4gQkxVRSBQVVJQTEUgQkxBQ0sgV0hJVEUgQlJPV04iKQogICAgICAgIHNoYXBlX3R5cGUgPSBvbmVPZigiU1FVQVJFIENJUkNMRSBUUklBTkdMRSBTVEFSIEhFWEFHT04gT0NUQUdPTiIpCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykKICAgICAgICBzaGFwZV9hdHRyID0gInNoYXBlOiIgKyBzaGFwZV90eXBlKCJzaGFwZSIpCiAgICAgICAgcG9zbl9hdHRyID0gInBvc246IiArIEdyb3VwKGludGVnZXIoIngiKSArICcsJyArIGludGVnZXIoInkiKSkoInBvc24iKQogICAgICAgIGNvbG9yX2F0dHIgPSAiY29sb3I6IiArIGNvbG9yKCJjb2xvciIpCiAgICAgICAgc2l6ZV9hdHRyID0gInNpemU6IiArIGludGVnZXIoInNpemUiKQoKICAgICAgICAjIHVzZSBFYWNoICh1c2luZyBvcGVyYXRvciAnJicpIHRvIGFjY2VwdCBhdHRyaWJ1dGVzIGluIGFueSBvcmRlciAKICAgICAgICAjIChzaGFwZSBhbmQgcG9zbiBhcmUgcmVxdWlyZWQsIGNvbG9yIGFuZCBzaXplIGFyZSBvcHRpb25hbCkKICAgICAgICBzaGFwZV9zcGVjID0gc2hhcGVfYXR0ciAmIHBvc25fYXR0ciAmIE9wdGlvbmFsKGNvbG9yX2F0dHIpICYgT3B0aW9uYWwoc2l6ZV9hdHRyKQoKICAgICAgICBzaGFwZV9zcGVjLnJ1blRlc3RzKCcnJwogICAgICAgICAgICBzaGFwZTogU1FVQVJFIGNvbG9yOiBCTEFDSyBwb3NuOiAxMDAsIDEyMAogICAgICAgICAgICBzaGFwZTogQ0lSQ0xFIHNpemU6IDUwIGNvbG9yOiBCTFVFIHBvc246IDUwLDgwCiAgICAgICAgICAgIGNvbG9yOkdSRUVOIHNpemU6MjAgc2hhcGU6VFJJQU5HTEUgcG9zbjoyMCw0MAogICAgICAgICAgICAnJycKICAgICAgICAgICAgKQogICAgcHJpbnRzOjoKICAgICAgICBzaGFwZTogU1FVQVJFIGNvbG9yOiBCTEFDSyBwb3NuOiAxMDAsIDEyMAogICAgICAgIFsnc2hhcGU6JywgJ1NRVUFSRScsICdjb2xvcjonLCAnQkxBQ0snLCAncG9zbjonLCBbJzEwMCcsICcsJywgJzEyMCddXQogICAgICAgIC0gY29sb3I6IEJMQUNLCiAgICAgICAgLSBwb3NuOiBbJzEwMCcsICcsJywgJzEyMCddCiAgICAgICAgICAtIHg6IDEwMAogICAgICAgICAgLSB5OiAxMjAKICAgICAgICAtIHNoYXBlOiBTUVVBUkUKCgogICAgICAgIHNoYXBlOiBDSVJDTEUgc2l6ZTogNTAgY29sb3I6IEJMVUUgcG9zbjogNTAsODAKICAgICAgICBbJ3NoYXBlOicsICdDSVJDTEUnLCAnc2l6ZTonLCAnNTAnLCAnY29sb3I6JywgJ0JMVUUnLCAncG9zbjonLCBbJzUwJywgJywnLCAnODAnXV0KICAgICAgICAtIGNvbG9yOiBCTFVFCiAgICAgICAgLSBwb3NuOiBbJzUwJywgJywnLCAnODAnXQogICAgICAgICAgLSB4OiA1MAogICAgICAgICAgLSB5OiA4MAogICAgICAgIC0gc2hhcGU6IENJUkNMRQogICAgICAgIC0gc2l6ZTogNTAKCgogICAgICAgIGNvbG9yOiBHUkVFTiBzaXplOiAyMCBzaGFwZTogVFJJQU5HTEUgcG9zbjogMjAsNDAKICAgICAgICBbJ2NvbG9yOicsICdHUkVFTicsICdzaXplOicsICcyMCcsICdzaGFwZTonLCAnVFJJQU5HTEUnLCAncG9zbjonLCBbJzIwJywgJywnLCAnNDAnXV0KICAgICAgICAtIGNvbG9yOiBHUkVFTgogICAgICAgIC0gcG9zbjogWycyMCcsICcsJywgJzQwJ10KICAgICAgICAgIC0geDogMjAKICAgICAgICAgIC0geTogNDAKICAgICAgICAtIHNoYXBlOiBUUklBTkdMRQogICAgICAgIC0gc2l6ZTogMjAKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBUcnVlICk6CiAgICAgICAgc3VwZXIoRWFjaCxzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFsbChlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUKICAgICAgICBzZWxmLmluaXRFeHByR3JvdXBzID0gVHJ1ZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgc2VsZi5pbml0RXhwckdyb3VwczoKICAgICAgICAgICAgc2VsZi5vcHQxbWFwID0gZGljdCgoaWQoZS5leHByKSxlKSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPcHRpb25hbCkpCiAgICAgICAgICAgIG9wdDEgPSBbIGUuZXhwciBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPcHRpb25hbCkgXQogICAgICAgICAgICBvcHQyID0gWyBlIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgZS5tYXlSZXR1cm5FbXB0eSBhbmQgbm90IGlzaW5zdGFuY2UoZSxPcHRpb25hbCldCiAgICAgICAgICAgIHNlbGYub3B0aW9uYWxzID0gb3B0MSArIG9wdDIKICAgICAgICAgICAgc2VsZi5tdWx0aW9wdGlvbmFscyA9IFsgZS5leHByIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLFplcm9Pck1vcmUpIF0KICAgICAgICAgICAgc2VsZi5tdWx0aXJlcXVpcmVkID0gWyBlLmV4cHIgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT25lT3JNb3JlKSBdCiAgICAgICAgICAgIHNlbGYucmVxdWlyZWQgPSBbIGUgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBub3QgaXNpbnN0YW5jZShlLChPcHRpb25hbCxaZXJvT3JNb3JlLE9uZU9yTW9yZSkpIF0KICAgICAgICAgICAgc2VsZi5yZXF1aXJlZCArPSBzZWxmLm11bHRpcmVxdWlyZWQKICAgICAgICAgICAgc2VsZi5pbml0RXhwckdyb3VwcyA9IEZhbHNlCiAgICAgICAgdG1wTG9jID0gbG9jCiAgICAgICAgdG1wUmVxZCA9IHNlbGYucmVxdWlyZWRbOl0KICAgICAgICB0bXBPcHQgID0gc2VsZi5vcHRpb25hbHNbOl0KICAgICAgICBtYXRjaE9yZGVyID0gW10KCiAgICAgICAga2VlcE1hdGNoaW5nID0gVHJ1ZQogICAgICAgIHdoaWxlIGtlZXBNYXRjaGluZzoKICAgICAgICAgICAgdG1wRXhwcnMgPSB0bXBSZXFkICsgdG1wT3B0ICsgc2VsZi5tdWx0aW9wdGlvbmFscyArIHNlbGYubXVsdGlyZXF1aXJlZAogICAgICAgICAgICBmYWlsZWQgPSBbXQogICAgICAgICAgICBmb3IgZSBpbiB0bXBFeHByczoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICB0bXBMb2MgPSBlLnRyeVBhcnNlKCBpbnN0cmluZywgdG1wTG9jICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICBmYWlsZWQuYXBwZW5kKGUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG1hdGNoT3JkZXIuYXBwZW5kKHNlbGYub3B0MW1hcC5nZXQoaWQoZSksZSkpCiAgICAgICAgICAgICAgICAgICAgaWYgZSBpbiB0bXBSZXFkOgogICAgICAgICAgICAgICAgICAgICAgICB0bXBSZXFkLnJlbW92ZShlKQogICAgICAgICAgICAgICAgICAgIGVsaWYgZSBpbiB0bXBPcHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHRtcE9wdC5yZW1vdmUoZSkKICAgICAgICAgICAgaWYgbGVuKGZhaWxlZCkgPT0gbGVuKHRtcEV4cHJzKToKICAgICAgICAgICAgICAgIGtlZXBNYXRjaGluZyA9IEZhbHNlCgogICAgICAgIGlmIHRtcFJlcWQ6CiAgICAgICAgICAgIG1pc3NpbmcgPSAiLCAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gdG1wUmVxZCkKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsbG9jLCJNaXNzaW5nIG9uZSBvciBtb3JlIHJlcXVpcmVkIGVsZW1lbnRzICglcykiICUgbWlzc2luZyApCgogICAgICAgICMgYWRkIGFueSB1bm1hdGNoZWQgT3B0aW9uYWxzLCBpbiBjYXNlIHRoZXkgaGF2ZSBkZWZhdWx0IHZhbHVlcyBkZWZpbmVkCiAgICAgICAgbWF0Y2hPcmRlciArPSBbZSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPcHRpb25hbCkgYW5kIGUuZXhwciBpbiB0bXBPcHRdCgogICAgICAgIHJlc3VsdGxpc3QgPSBbXQogICAgICAgIGZvciBlIGluIG1hdGNoT3JkZXI6CiAgICAgICAgICAgIGxvYyxyZXN1bHRzID0gZS5fcGFyc2UoaW5zdHJpbmcsbG9jLGRvQWN0aW9ucykKICAgICAgICAgICAgcmVzdWx0bGlzdC5hcHBlbmQocmVzdWx0cykKCiAgICAgICAgZmluYWxSZXN1bHRzID0gc3VtKHJlc3VsdGxpc3QsIFBhcnNlUmVzdWx0cyhbXSkpCiAgICAgICAgcmV0dXJuIGxvYywgZmluYWxSZXN1bHRzCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiAmICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9IgoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6CiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoKICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkKCgpjbGFzcyBQYXJzZUVsZW1lbnRFbmhhbmNlKFBhcnNlckVsZW1lbnQpOgogICAgIiIiCiAgICBBYnN0cmFjdCBzdWJjbGFzcyBvZiBDe1BhcnNlckVsZW1lbnR9LCBmb3IgY29tYmluaW5nIGFuZCBwb3N0LXByb2Nlc3NpbmcgcGFyc2VkIHRva2Vucy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzYXZlbGlzdD1GYWxzZSApOgogICAgICAgIHN1cGVyKFBhcnNlRWxlbWVudEVuaGFuY2Usc2VsZikuX19pbml0X18oc2F2ZWxpc3QpCiAgICAgICAgaWYgaXNpbnN0YW5jZSggZXhwciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBpZiBpc3N1YmNsYXNzKFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcywgVG9rZW4pOgogICAgICAgICAgICAgICAgZXhwciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhleHByKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZXhwciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhMaXRlcmFsKGV4cHIpKQogICAgICAgIHNlbGYuZXhwciA9IGV4cHIKICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lCiAgICAgICAgaWYgZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gZXhwci5tYXlJbmRleEVycm9yCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBleHByLm1heVJldHVybkVtcHR5CiAgICAgICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBleHByLndoaXRlQ2hhcnMgKQogICAgICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gZXhwci5za2lwV2hpdGVzcGFjZQogICAgICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBleHByLnNhdmVBc0xpc3QKICAgICAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBleHByLmNhbGxQcmVwYXJzZQogICAgICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmV4dGVuZChleHByLmlnbm9yZUV4cHJzKQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5leHByLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCIiLGxvYyxzZWxmLmVycm1zZyxzZWxmKQoKICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UKICAgICAgICBzZWxmLmV4cHIgPSBzZWxmLmV4cHIuY29weSgpCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV4cHIubGVhdmVXaGl0ZXNwYWNlKCkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIFN1cHByZXNzICk6CiAgICAgICAgICAgIGlmIG90aGVyIG5vdCBpbiBzZWxmLmlnbm9yZUV4cHJzOgogICAgICAgICAgICAgICAgc3VwZXIoIFBhcnNlRWxlbWVudEVuaGFuY2UsIHNlbGYpLmlnbm9yZSggb3RoZXIgKQogICAgICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZXhwci5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdXBlciggUGFyc2VFbGVtZW50RW5oYW5jZSwgc2VsZikuaWdub3JlKCBvdGhlciApCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuZXhwci5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6CiAgICAgICAgc3VwZXIoUGFyc2VFbGVtZW50RW5oYW5jZSxzZWxmKS5zdHJlYW1saW5lKCkKICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZXhwci5zdHJlYW1saW5lKCkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOgogICAgICAgIGlmIHNlbGYgaW4gcGFyc2VFbGVtZW50TGlzdDoKICAgICAgICAgICAgcmFpc2UgUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbiggcGFyc2VFbGVtZW50TGlzdCtbc2VsZl0gKQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5leHByLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQoKICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOgogICAgICAgIHRtcCA9IHZhbGlkYXRlVHJhY2VbOl0rW3NlbGZdCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV4cHIudmFsaWRhdGUodG1wKQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oIFtdICkKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFBhcnNlRWxlbWVudEVuaGFuY2Usc2VsZikuX19zdHJfXygpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZSBhbmQgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiJXM6KCVzKSIgJSAoIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBfdXN0cihzZWxmLmV4cHIpICkKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgoKY2xhc3MgRm9sbG93ZWRCeShQYXJzZUVsZW1lbnRFbmhhbmNlKToKICAgICIiIgogICAgTG9va2FoZWFkIG1hdGNoaW5nIG9mIHRoZSBnaXZlbiBwYXJzZSBleHByZXNzaW9uLiAgQ3tGb2xsb3dlZEJ5fQogICAgZG9lcyBJe25vdH0gYWR2YW5jZSB0aGUgcGFyc2luZyBwb3NpdGlvbiB3aXRoaW4gdGhlIGlucHV0IHN0cmluZywgaXQgb25seQogICAgdmVyaWZpZXMgdGhhdCB0aGUgc3BlY2lmaWVkIHBhcnNlIGV4cHJlc3Npb24gbWF0Y2hlcyBhdCB0aGUgY3VycmVudAogICAgcG9zaXRpb24uICBDe0ZvbGxvd2VkQnl9IGFsd2F5cyByZXR1cm5zIGEgbnVsbCB0b2tlbiBsaXN0LgoKICAgIEV4YW1wbGU6OgogICAgICAgICMgdXNlIEZvbGxvd2VkQnkgdG8gbWF0Y2ggYSBsYWJlbCBvbmx5IGlmIGl0IGlzIGZvbGxvd2VkIGJ5IGEgJzonCiAgICAgICAgZGF0YV93b3JkID0gV29yZChhbHBoYXMpCiAgICAgICAgbGFiZWwgPSBkYXRhX3dvcmQgKyBGb2xsb3dlZEJ5KCc6JykKICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkKICAgICAgICAKICAgICAgICBPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZygic2hhcGU6IFNRVUFSRSBjb2xvcjogQkxBQ0sgcG9zbjogdXBwZXIgbGVmdCIpLnBwcmludCgpCiAgICBwcmludHM6OgogICAgICAgIFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ2NvbG9yJywgJ0JMQUNLJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J11dCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOgogICAgICAgIHN1cGVyKEZvbGxvd2VkQnksc2VsZikuX19pbml0X18oZXhwcikKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgc2VsZi5leHByLnRyeVBhcnNlKCBpbnN0cmluZywgbG9jICkKICAgICAgICByZXR1cm4gbG9jLCBbXQoKCmNsYXNzIE5vdEFueShQYXJzZUVsZW1lbnRFbmhhbmNlKToKICAgICIiIgogICAgTG9va2FoZWFkIHRvIGRpc2FsbG93IG1hdGNoaW5nIHdpdGggdGhlIGdpdmVuIHBhcnNlIGV4cHJlc3Npb24uICBDe05vdEFueX0KICAgIGRvZXMgSXtub3R9IGFkdmFuY2UgdGhlIHBhcnNpbmcgcG9zaXRpb24gd2l0aGluIHRoZSBpbnB1dCBzdHJpbmcsIGl0IG9ubHkKICAgIHZlcmlmaWVzIHRoYXQgdGhlIHNwZWNpZmllZCBwYXJzZSBleHByZXNzaW9uIGRvZXMgSXtub3R9IG1hdGNoIGF0IHRoZSBjdXJyZW50CiAgICBwb3NpdGlvbi4gIEFsc28sIEN7Tm90QW55fSBkb2VzIEl7bm90fSBza2lwIG92ZXIgbGVhZGluZyB3aGl0ZXNwYWNlLiBDe05vdEFueX0KICAgIGFsd2F5cyByZXR1cm5zIGEgbnVsbCB0b2tlbiBsaXN0LiAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSAnficgb3BlcmF0b3IuCgogICAgRXhhbXBsZTo6CiAgICAgICAgCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOgogICAgICAgIHN1cGVyKE5vdEFueSxzZWxmKS5fX2luaXRfXyhleHByKQogICAgICAgICN+IHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UgICMgZG8gTk9UIHVzZSBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpLCBkb24ndCB3YW50IHRvIHByb3BhZ2F0ZSB0byBleHBycwogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRm91bmQgdW53YW50ZWQgdG9rZW4sICIrX3VzdHIoc2VsZi5leHByKQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgc2VsZi5leHByLmNhblBhcnNlTmV4dChpbnN0cmluZywgbG9jKToKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCiAgICAgICAgcmV0dXJuIGxvYywgW10KCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAifnsiICsgX3VzdHIoc2VsZi5leHByKSArICJ9IgoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgpjbGFzcyBfTXVsdGlwbGVNYXRjaChQYXJzZUVsZW1lbnRFbmhhbmNlKToKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc3RvcE9uPU5vbmUpOgogICAgICAgIHN1cGVyKF9NdWx0aXBsZU1hdGNoLCBzZWxmKS5fX2luaXRfXyhleHByKQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUKICAgICAgICBlbmRlciA9IHN0b3BPbgogICAgICAgIGlmIGlzaW5zdGFuY2UoZW5kZXIsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICBlbmRlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhlbmRlcikKICAgICAgICBzZWxmLm5vdF9lbmRlciA9IH5lbmRlciBpZiBlbmRlciBpcyBub3QgTm9uZSBlbHNlIE5vbmUKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIHNlbGZfZXhwcl9wYXJzZSA9IHNlbGYuZXhwci5fcGFyc2UKICAgICAgICBzZWxmX3NraXBfaWdub3JhYmxlcyA9IHNlbGYuX3NraXBJZ25vcmFibGVzCiAgICAgICAgY2hlY2tfZW5kZXIgPSBzZWxmLm5vdF9lbmRlciBpcyBub3QgTm9uZQogICAgICAgIGlmIGNoZWNrX2VuZGVyOgogICAgICAgICAgICB0cnlfbm90X2VuZGVyID0gc2VsZi5ub3RfZW5kZXIudHJ5UGFyc2UKICAgICAgICAKICAgICAgICAjIG11c3QgYmUgYXQgbGVhc3Qgb25lIChidXQgZmlyc3Qgc2VlIGlmIHdlIGFyZSB0aGUgc3RvcE9uIHNlbnRpbmVsOwogICAgICAgICMgaWYgc28sIGZhaWwpCiAgICAgICAgaWYgY2hlY2tfZW5kZXI6CiAgICAgICAgICAgIHRyeV9ub3RfZW5kZXIoaW5zdHJpbmcsIGxvYykKICAgICAgICBsb2MsIHRva2VucyA9IHNlbGZfZXhwcl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQogICAgICAgIHRyeToKICAgICAgICAgICAgaGFzSWdub3JlRXhwcnMgPSAobm90IG5vdCBzZWxmLmlnbm9yZUV4cHJzKQogICAgICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAgICAgaWYgY2hlY2tfZW5kZXI6CiAgICAgICAgICAgICAgICAgICAgdHJ5X25vdF9lbmRlcihpbnN0cmluZywgbG9jKQogICAgICAgICAgICAgICAgaWYgaGFzSWdub3JlRXhwcnM6CiAgICAgICAgICAgICAgICAgICAgcHJlbG9jID0gc2VsZl9za2lwX2lnbm9yYWJsZXMoIGluc3RyaW5nLCBsb2MgKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBwcmVsb2MgPSBsb2MKICAgICAgICAgICAgICAgIGxvYywgdG1wdG9rZW5zID0gc2VsZl9leHByX3BhcnNlKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQogICAgICAgICAgICAgICAgaWYgdG1wdG9rZW5zIG9yIHRtcHRva2Vucy5oYXNrZXlzKCk6CiAgICAgICAgICAgICAgICAgICAgdG9rZW5zICs9IHRtcHRva2VucwogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sSW5kZXhFcnJvcik6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgcmV0dXJuIGxvYywgdG9rZW5zCiAgICAgICAgCmNsYXNzIE9uZU9yTW9yZShfTXVsdGlwbGVNYXRjaCk6CiAgICAiIiIKICAgIFJlcGV0aXRpb24gb2Ygb25lIG9yIG1vcmUgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24uCiAgICAKICAgIFBhcmFtZXRlcnM6CiAgICAgLSBleHByIC0gZXhwcmVzc2lvbiB0aGF0IG11c3QgbWF0Y2ggb25lIG9yIG1vcmUgdGltZXMKICAgICAtIHN0b3BPbiAtIChkZWZhdWx0PUN7Tm9uZX0pIC0gZXhwcmVzc2lvbiBmb3IgYSB0ZXJtaW5hdGluZyBzZW50aW5lbAogICAgICAgICAgKG9ubHkgcmVxdWlyZWQgaWYgdGhlIHNlbnRpbmVsIHdvdWxkIG9yZGluYXJpbHkgbWF0Y2ggdGhlIHJlcGV0aXRpb24gCiAgICAgICAgICBleHByZXNzaW9uKSAgICAgICAgICAKCiAgICBFeGFtcGxlOjoKICAgICAgICBkYXRhX3dvcmQgPSBXb3JkKGFscGhhcykKICAgICAgICBsYWJlbCA9IGRhdGFfd29yZCArIEZvbGxvd2VkQnkoJzonKQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkKCiAgICAgICAgdGV4dCA9ICJzaGFwZTogU1FVQVJFIHBvc246IHVwcGVyIGxlZnQgY29sb3I6IEJMQUNLIgogICAgICAgIE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLnBwcmludCgpICAjIEZhaWwhIHJlYWQgJ2NvbG9yJyBhcyBkYXRhIGluc3RlYWQgb2YgbmV4dCBsYWJlbCAtPiBbWydzaGFwZScsICdTUVVBUkUgY29sb3InXV0KCiAgICAgICAgIyB1c2Ugc3RvcE9uIGF0dHJpYnV0ZSBmb3IgT25lT3JNb3JlIHRvIGF2b2lkIHJlYWRpbmcgbGFiZWwgc3RyaW5nIGFzIHBhcnQgb2YgdGhlIGRhdGEKICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkKICAgICAgICBPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5wcHJpbnQoKSAjIEJldHRlciAtPiBbWydzaGFwZScsICdTUVVBUkUnXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXSwgWydjb2xvcicsICdCTEFDSyddXQogICAgICAgIAogICAgICAgICMgY291bGQgYWxzbyBiZSB3cml0dGVuIGFzCiAgICAgICAgKGF0dHJfZXhwciAqICgxLCkpLnBhcnNlU3RyaW5nKHRleHQpLnBwcmludCgpCiAgICAiIiIKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIn0uLi4iCgogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCmNsYXNzIFplcm9Pck1vcmUoX011bHRpcGxlTWF0Y2gpOgogICAgIiIiCiAgICBPcHRpb25hbCByZXBldGl0aW9uIG9mIHplcm8gb3IgbW9yZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4KICAgIAogICAgUGFyYW1ldGVyczoKICAgICAtIGV4cHIgLSBleHByZXNzaW9uIHRoYXQgbXVzdCBtYXRjaCB6ZXJvIG9yIG1vcmUgdGltZXMKICAgICAtIHN0b3BPbiAtIChkZWZhdWx0PUN7Tm9uZX0pIC0gZXhwcmVzc2lvbiBmb3IgYSB0ZXJtaW5hdGluZyBzZW50aW5lbAogICAgICAgICAgKG9ubHkgcmVxdWlyZWQgaWYgdGhlIHNlbnRpbmVsIHdvdWxkIG9yZGluYXJpbHkgbWF0Y2ggdGhlIHJlcGV0aXRpb24gCiAgICAgICAgICBleHByZXNzaW9uKSAgICAgICAgICAKCiAgICBFeGFtcGxlOiBzaW1pbGFyIHRvIEx7T25lT3JNb3JlfQogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHN0b3BPbj1Ob25lKToKICAgICAgICBzdXBlcihaZXJvT3JNb3JlLHNlbGYpLl9faW5pdF9fKGV4cHIsIHN0b3BPbj1zdG9wT24pCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKICAgICAgICAKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3VwZXIoWmVyb09yTW9yZSwgc2VsZikucGFyc2VJbXBsKGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucykKICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLEluZGV4RXJyb3IpOgogICAgICAgICAgICByZXR1cm4gbG9jLCBbXQoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJbIiArIF91c3RyKHNlbGYuZXhwcikgKyAiXS4uLiIKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKY2xhc3MgX051bGxUb2tlbihvYmplY3QpOgogICAgZGVmIF9fYm9vbF9fKHNlbGYpOgogICAgICAgIHJldHVybiBGYWxzZQogICAgX19ub256ZXJvX18gPSBfX2Jvb2xfXwogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICIiCgpfb3B0aW9uYWxOb3RNYXRjaGVkID0gX051bGxUb2tlbigpCmNsYXNzIE9wdGlvbmFsKFBhcnNlRWxlbWVudEVuaGFuY2UpOgogICAgIiIiCiAgICBPcHRpb25hbCBtYXRjaGluZyBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4KCiAgICBQYXJhbWV0ZXJzOgogICAgIC0gZXhwciAtIGV4cHJlc3Npb24gdGhhdCBtdXN0IG1hdGNoIHplcm8gb3IgbW9yZSB0aW1lcwogICAgIC0gZGVmYXVsdCAob3B0aW9uYWwpIC0gdmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIG9wdGlvbmFsIGV4cHJlc3Npb24gaXMgbm90IGZvdW5kLgoKICAgIEV4YW1wbGU6OgogICAgICAgICMgVVMgcG9zdGFsIGNvZGUgY2FuIGJlIGEgNS1kaWdpdCB6aXAsIHBsdXMgb3B0aW9uYWwgNC1kaWdpdCBxdWFsaWZpZXIKICAgICAgICB6aXAgPSBDb21iaW5lKFdvcmQobnVtcywgZXhhY3Q9NSkgKyBPcHRpb25hbCgnLScgKyBXb3JkKG51bXMsIGV4YWN0PTQpKSkKICAgICAgICB6aXAucnVuVGVzdHMoJycnCiAgICAgICAgICAgICMgdHJhZGl0aW9uYWwgWklQIGNvZGUKICAgICAgICAgICAgMTIzNDUKICAgICAgICAgICAgCiAgICAgICAgICAgICMgWklQKzQgZm9ybQogICAgICAgICAgICAxMjEwMS0wMDAxCiAgICAgICAgICAgIAogICAgICAgICAgICAjIGludmFsaWQgWklQCiAgICAgICAgICAgIDk4NzY1LQogICAgICAgICAgICAnJycpCiAgICBwcmludHM6OgogICAgICAgICMgdHJhZGl0aW9uYWwgWklQIGNvZGUKICAgICAgICAxMjM0NQogICAgICAgIFsnMTIzNDUnXQoKICAgICAgICAjIFpJUCs0IGZvcm0KICAgICAgICAxMjEwMS0wMDAxCiAgICAgICAgWycxMjEwMS0wMDAxJ10KCiAgICAgICAgIyBpbnZhbGlkIFpJUAogICAgICAgIDk4NzY1LQogICAgICAgICAgICAgXgogICAgICAgIEZBSUw6IEV4cGVjdGVkIGVuZCBvZiB0ZXh0IChhdCBjaGFyIDUpLCAobGluZToxLCBjb2w6NikKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBkZWZhdWx0PV9vcHRpb25hbE5vdE1hdGNoZWQgKToKICAgICAgICBzdXBlcihPcHRpb25hbCxzZWxmKS5fX2luaXRfXyggZXhwciwgc2F2ZWxpc3Q9RmFsc2UgKQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IHNlbGYuZXhwci5zYXZlQXNMaXN0CiAgICAgICAgc2VsZi5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0CiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIHRyeToKICAgICAgICAgICAgbG9jLCB0b2tlbnMgPSBzZWxmLmV4cHIuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbixJbmRleEVycm9yKToKICAgICAgICAgICAgaWYgc2VsZi5kZWZhdWx0VmFsdWUgaXMgbm90IF9vcHRpb25hbE5vdE1hdGNoZWQ6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmV4cHIucmVzdWx0c05hbWU6CiAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gUGFyc2VSZXN1bHRzKFsgc2VsZi5kZWZhdWx0VmFsdWUgXSkKICAgICAgICAgICAgICAgICAgICB0b2tlbnNbc2VsZi5leHByLnJlc3VsdHNOYW1lXSA9IHNlbGYuZGVmYXVsdFZhbHVlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IFsgc2VsZi5kZWZhdWx0VmFsdWUgXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdG9rZW5zID0gW10KICAgICAgICByZXR1cm4gbG9jLCB0b2tlbnMKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiWyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIl0iCgogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCmNsYXNzIFNraXBUbyhQYXJzZUVsZW1lbnRFbmhhbmNlKToKICAgICIiIgogICAgVG9rZW4gZm9yIHNraXBwaW5nIG92ZXIgYWxsIHVuZGVmaW5lZCB0ZXh0IHVudGlsIHRoZSBtYXRjaGVkIGV4cHJlc3Npb24gaXMgZm91bmQuCgogICAgUGFyYW1ldGVyczoKICAgICAtIGV4cHIgLSB0YXJnZXQgZXhwcmVzc2lvbiBtYXJraW5nIHRoZSBlbmQgb2YgdGhlIGRhdGEgdG8gYmUgc2tpcHBlZAogICAgIC0gaW5jbHVkZSAtIChkZWZhdWx0PUN7RmFsc2V9KSBpZiBUcnVlLCB0aGUgdGFyZ2V0IGV4cHJlc3Npb24gaXMgYWxzbyBwYXJzZWQgCiAgICAgICAgICAodGhlIHNraXBwZWQgdGV4dCBhbmQgdGFyZ2V0IGV4cHJlc3Npb24gYXJlIHJldHVybmVkIGFzIGEgMi1lbGVtZW50IGxpc3QpLgogICAgIC0gaWdub3JlIC0gKGRlZmF1bHQ9Q3tOb25lfSkgdXNlZCB0byBkZWZpbmUgZ3JhbW1hcnMgKHR5cGljYWxseSBxdW90ZWQgc3RyaW5ncyBhbmQgCiAgICAgICAgICBjb21tZW50cykgdGhhdCBtaWdodCBjb250YWluIGZhbHNlIG1hdGNoZXMgdG8gdGhlIHRhcmdldCBleHByZXNzaW9uCiAgICAgLSBmYWlsT24gLSAoZGVmYXVsdD1De05vbmV9KSBkZWZpbmUgZXhwcmVzc2lvbnMgdGhhdCBhcmUgbm90IGFsbG93ZWQgdG8gYmUgCiAgICAgICAgICBpbmNsdWRlZCBpbiB0aGUgc2tpcHBlZCB0ZXN0OyBpZiBmb3VuZCBiZWZvcmUgdGhlIHRhcmdldCBleHByZXNzaW9uIGlzIGZvdW5kLCAKICAgICAgICAgIHRoZSBTa2lwVG8gaXMgbm90IGEgbWF0Y2gKCiAgICBFeGFtcGxlOjoKICAgICAgICByZXBvcnQgPSAnJycKICAgICAgICAgICAgT3V0c3RhbmRpbmcgSXNzdWVzIFJlcG9ydCAtIDEgSmFuIDIwMDAKCiAgICAgICAgICAgICAgICMgfCBTZXZlcml0eSB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIERheXMgT3BlbgogICAgICAgICAgICAtLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0KICAgICAgICAgICAgIDEwMSB8IENyaXRpY2FsIHwgSW50ZXJtaXR0ZW50IHN5c3RlbSBjcmFzaCAgICAgICAgICAgICAgICAgfCAgICAgICAgICA2CiAgICAgICAgICAgICAgOTQgfCBDb3NtZXRpYyB8IFNwZWxsaW5nIGVycm9yIG9uIExvZ2luICgnbG9nfG4nKSAgICAgICAgIHwgICAgICAgICAxNAogICAgICAgICAgICAgIDc5IHwgTWlub3IgICAgfCBTeXN0ZW0gc2xvdyB3aGVuIHJ1bm5pbmcgdG9vIG1hbnkgcmVwb3J0cyB8ICAgICAgICAgNDcKICAgICAgICAgICAgJycnCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykKICAgICAgICBTRVAgPSBTdXBwcmVzcygnfCcpCiAgICAgICAgIyB1c2UgU2tpcFRvIHRvIHNpbXBseSBtYXRjaCBldmVyeXRoaW5nIHVwIHVudGlsIHRoZSBuZXh0IFNFUAogICAgICAgICMgLSBpZ25vcmUgcXVvdGVkIHN0cmluZ3MsIHNvIHRoYXQgYSAnfCcgY2hhcmFjdGVyIGluc2lkZSBhIHF1b3RlZCBzdHJpbmcgZG9lcyBub3QgbWF0Y2gKICAgICAgICAjIC0gcGFyc2UgYWN0aW9uIHdpbGwgY2FsbCB0b2tlbi5zdHJpcCgpIGZvciBlYWNoIG1hdGNoZWQgdG9rZW4sIGkuZS4sIHRoZSBkZXNjcmlwdGlvbiBib2R5CiAgICAgICAgc3RyaW5nX2RhdGEgPSBTa2lwVG8oU0VQLCBpZ25vcmU9cXVvdGVkU3RyaW5nKQogICAgICAgIHN0cmluZ19kYXRhLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHN0ci5zdHJpcCkpCiAgICAgICAgdGlja2V0X2V4cHIgPSAoaW50ZWdlcigiaXNzdWVfbnVtIikgKyBTRVAgCiAgICAgICAgICAgICAgICAgICAgICArIHN0cmluZ19kYXRhKCJzZXYiKSArIFNFUCAKICAgICAgICAgICAgICAgICAgICAgICsgc3RyaW5nX2RhdGEoImRlc2MiKSArIFNFUCAKICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlcigiZGF5c19vcGVuIikpCiAgICAgICAgCiAgICAgICAgZm9yIHRrdCBpbiB0aWNrZXRfZXhwci5zZWFyY2hTdHJpbmcocmVwb3J0KToKICAgICAgICAgICAgcHJpbnQgdGt0LmR1bXAoKQogICAgcHJpbnRzOjoKICAgICAgICBbJzEwMScsICdDcml0aWNhbCcsICdJbnRlcm1pdHRlbnQgc3lzdGVtIGNyYXNoJywgJzYnXQogICAgICAgIC0gZGF5c19vcGVuOiA2CiAgICAgICAgLSBkZXNjOiBJbnRlcm1pdHRlbnQgc3lzdGVtIGNyYXNoCiAgICAgICAgLSBpc3N1ZV9udW06IDEwMQogICAgICAgIC0gc2V2OiBDcml0aWNhbAogICAgICAgIFsnOTQnLCAnQ29zbWV0aWMnLCAiU3BlbGxpbmcgZXJyb3Igb24gTG9naW4gKCdsb2d8bicpIiwgJzE0J10KICAgICAgICAtIGRheXNfb3BlbjogMTQKICAgICAgICAtIGRlc2M6IFNwZWxsaW5nIGVycm9yIG9uIExvZ2luICgnbG9nfG4nKQogICAgICAgIC0gaXNzdWVfbnVtOiA5NAogICAgICAgIC0gc2V2OiBDb3NtZXRpYwogICAgICAgIFsnNzknLCAnTWlub3InLCAnU3lzdGVtIHNsb3cgd2hlbiBydW5uaW5nIHRvbyBtYW55IHJlcG9ydHMnLCAnNDcnXQogICAgICAgIC0gZGF5c19vcGVuOiA0NwogICAgICAgIC0gZGVzYzogU3lzdGVtIHNsb3cgd2hlbiBydW5uaW5nIHRvbyBtYW55IHJlcG9ydHMKICAgICAgICAtIGlzc3VlX251bTogNzkKICAgICAgICAtIHNldjogTWlub3IKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBvdGhlciwgaW5jbHVkZT1GYWxzZSwgaWdub3JlPU5vbmUsIGZhaWxPbj1Ob25lICk6CiAgICAgICAgc3VwZXIoIFNraXBUbywgc2VsZiApLl9faW5pdF9fKCBvdGhlciApCiAgICAgICAgc2VsZi5pZ25vcmVFeHByID0gaWdub3JlCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQogICAgICAgIHNlbGYuaW5jbHVkZU1hdGNoID0gaW5jbHVkZQogICAgICAgIHNlbGYuYXNMaXN0ID0gRmFsc2UKICAgICAgICBpZiBpc2luc3RhbmNlKGZhaWxPbiwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgIHNlbGYuZmFpbE9uID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKGZhaWxPbikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmZhaWxPbiA9IGZhaWxPbgogICAgICAgIHNlbGYuZXJybXNnID0gIk5vIG1hdGNoIGZvdW5kIGZvciAiK191c3RyKHNlbGYuZXhwcikKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIHN0YXJ0bG9jID0gbG9jCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpCiAgICAgICAgZXhwciA9IHNlbGYuZXhwcgogICAgICAgIGV4cHJfcGFyc2UgPSBzZWxmLmV4cHIuX3BhcnNlCiAgICAgICAgc2VsZl9mYWlsT25fY2FuUGFyc2VOZXh0ID0gc2VsZi5mYWlsT24uY2FuUGFyc2VOZXh0IGlmIHNlbGYuZmFpbE9uIGlzIG5vdCBOb25lIGVsc2UgTm9uZQogICAgICAgIHNlbGZfaWdub3JlRXhwcl90cnlQYXJzZSA9IHNlbGYuaWdub3JlRXhwci50cnlQYXJzZSBpZiBzZWxmLmlnbm9yZUV4cHIgaXMgbm90IE5vbmUgZWxzZSBOb25lCiAgICAgICAgCiAgICAgICAgdG1wbG9jID0gbG9jCiAgICAgICAgd2hpbGUgdG1wbG9jIDw9IGluc3RybGVuOgogICAgICAgICAgICBpZiBzZWxmX2ZhaWxPbl9jYW5QYXJzZU5leHQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAjIGJyZWFrIGlmIGZhaWxPbiBleHByZXNzaW9uIG1hdGNoZXMKICAgICAgICAgICAgICAgIGlmIHNlbGZfZmFpbE9uX2NhblBhcnNlTmV4dChpbnN0cmluZywgdG1wbG9jKToKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBpZiBzZWxmX2lnbm9yZUV4cHJfdHJ5UGFyc2UgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAjIGFkdmFuY2UgcGFzdCBpZ25vcmUgZXhwcmVzc2lvbnMKICAgICAgICAgICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICB0bXBsb2MgPSBzZWxmX2lnbm9yZUV4cHJfdHJ5UGFyc2UoaW5zdHJpbmcsIHRtcGxvYykKICAgICAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZXhwcl9wYXJzZShpbnN0cmluZywgdG1wbG9jLCBkb0FjdGlvbnM9RmFsc2UsIGNhbGxQcmVQYXJzZT1GYWxzZSkKICAgICAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbiwgSW5kZXhFcnJvcik6CiAgICAgICAgICAgICAgICAjIG5vIG1hdGNoLCBhZHZhbmNlIGxvYyBpbiBzdHJpbmcKICAgICAgICAgICAgICAgIHRtcGxvYyArPSAxCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIG1hdGNoZWQgc2tpcHRvIGV4cHIsIGRvbmUKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgcmFuIG9mZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBzdHJpbmcgd2l0aG91dCBtYXRjaGluZyBza2lwdG8gZXhwciwgZmFpbAogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCiAgICAgICAgIyBidWlsZCB1cCByZXR1cm4gdmFsdWVzCiAgICAgICAgbG9jID0gdG1wbG9jCiAgICAgICAgc2tpcHRleHQgPSBpbnN0cmluZ1tzdGFydGxvYzpsb2NdCiAgICAgICAgc2tpcHJlc3VsdCA9IFBhcnNlUmVzdWx0cyhza2lwdGV4dCkKICAgICAgICAKICAgICAgICBpZiBzZWxmLmluY2x1ZGVNYXRjaDoKICAgICAgICAgICAgbG9jLCBtYXQgPSBleHByX3BhcnNlKGluc3RyaW5nLGxvYyxkb0FjdGlvbnMsY2FsbFByZVBhcnNlPUZhbHNlKQogICAgICAgICAgICBza2lwcmVzdWx0ICs9IG1hdAoKICAgICAgICByZXR1cm4gbG9jLCBza2lwcmVzdWx0CgpjbGFzcyBGb3J3YXJkKFBhcnNlRWxlbWVudEVuaGFuY2UpOgogICAgIiIiCiAgICBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGFuIGV4cHJlc3Npb24gdG8gYmUgZGVmaW5lZCBsYXRlciAtCiAgICB1c2VkIGZvciByZWN1cnNpdmUgZ3JhbW1hcnMsIHN1Y2ggYXMgYWxnZWJyYWljIGluZml4IG5vdGF0aW9uLgogICAgV2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBrbm93biwgaXQgaXMgYXNzaWduZWQgdG8gdGhlIEN7Rm9yd2FyZH0gdmFyaWFibGUgdXNpbmcgdGhlICc8PCcgb3BlcmF0b3IuCgogICAgTm90ZTogdGFrZSBjYXJlIHdoZW4gYXNzaWduaW5nIHRvIEN7Rm9yd2FyZH0gbm90IHRvIG92ZXJsb29rIHByZWNlZGVuY2Ugb2Ygb3BlcmF0b3JzLgogICAgU3BlY2lmaWNhbGx5LCAnfCcgaGFzIGEgbG93ZXIgcHJlY2VkZW5jZSB0aGFuICc8PCcsIHNvIHRoYXQ6OgogICAgICAgIGZ3ZEV4cHIgPDwgYSB8IGIgfCBjCiAgICB3aWxsIGFjdHVhbGx5IGJlIGV2YWx1YXRlZCBhczo6CiAgICAgICAgKGZ3ZEV4cHIgPDwgYSkgfCBiIHwgYwogICAgdGhlcmVieSBsZWF2aW5nIGIgYW5kIGMgb3V0IGFzIHBhcnNlYWJsZSBhbHRlcm5hdGl2ZXMuICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdQogICAgZXhwbGljaXRseSBncm91cCB0aGUgdmFsdWVzIGluc2VydGVkIGludG8gdGhlIEN7Rm9yd2FyZH06OgogICAgICAgIGZ3ZEV4cHIgPDwgKGEgfCBiIHwgYykKICAgIENvbnZlcnRpbmcgdG8gdXNlIHRoZSAnPDw9JyBvcGVyYXRvciBpbnN0ZWFkIHdpbGwgYXZvaWQgdGhpcyBwcm9ibGVtLgoKICAgIFNlZSBMe1BhcnNlUmVzdWx0cy5wcHJpbnR9IGZvciBhbiBleGFtcGxlIG9mIGEgcmVjdXJzaXZlIHBhcnNlciBjcmVhdGVkIHVzaW5nCiAgICBDe0ZvcndhcmR9LgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG90aGVyPU5vbmUgKToKICAgICAgICBzdXBlcihGb3J3YXJkLHNlbGYpLl9faW5pdF9fKCBvdGhlciwgc2F2ZWxpc3Q9RmFsc2UgKQoKICAgIGRlZiBfX2xzaGlmdF9fKCBzZWxmLCBvdGhlciApOgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKG90aGVyKQogICAgICAgIHNlbGYuZXhwciA9IG90aGVyCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IHNlbGYuZXhwci5tYXlJbmRleEVycm9yCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IHNlbGYuZXhwci5tYXlSZXR1cm5FbXB0eQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBzZWxmLmV4cHIud2hpdGVDaGFycyApCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IHNlbGYuZXhwci5za2lwV2hpdGVzcGFjZQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IHNlbGYuZXhwci5zYXZlQXNMaXN0CiAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5leHRlbmQoc2VsZi5leHByLmlnbm9yZUV4cHJzKQogICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgCiAgICBkZWYgX19pbHNoaWZ0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmIDw8IG90aGVyCiAgICAKICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToKICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6CiAgICAgICAgaWYgbm90IHNlbGYuc3RyZWFtbGluZWQ6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtbGluZWQgPSBUcnVlCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuZXhwci5zdHJlYW1saW5lKCkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOgogICAgICAgIGlmIHNlbGYgbm90IGluIHZhbGlkYXRlVHJhY2U6CiAgICAgICAgICAgIHRtcCA9IHZhbGlkYXRlVHJhY2VbOl0rW3NlbGZdCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuZXhwci52YWxpZGF0ZSh0bXApCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbihbXSkKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgIjogLi4uIgoKICAgICAgICAjIHN0dWJiZWQgb3V0IGZvciBub3cgLSBjcmVhdGVzIGF3ZnVsIG1lbW9yeSBhbmQgcGVyZiBpc3N1ZXMKICAgICAgICBzZWxmLl9yZXZlcnRDbGFzcyA9IHNlbGYuX19jbGFzc19fCiAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBfRm9yd2FyZE5vUmVjdXJzZQogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcmV0U3RyaW5nID0gX3VzdHIoc2VsZi5leHByKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0U3RyaW5nID0gIk5vbmUiCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBzZWxmLl9yZXZlcnRDbGFzcwogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyArICI6ICIgKyByZXRTdHJpbmcKCiAgICBkZWYgY29weShzZWxmKToKICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihGb3J3YXJkLHNlbGYpLmNvcHkoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldCA9IEZvcndhcmQoKQogICAgICAgICAgICByZXQgPDw9IHNlbGYKICAgICAgICAgICAgcmV0dXJuIHJldAoKY2xhc3MgX0ZvcndhcmROb1JlY3Vyc2UoRm9yd2FyZCk6CiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIHJldHVybiAiLi4uIgoKY2xhc3MgVG9rZW5Db252ZXJ0ZXIoUGFyc2VFbGVtZW50RW5oYW5jZSk6CiAgICAiIiIKICAgIEFic3RyYWN0IHN1YmNsYXNzIG9mIEN7UGFyc2VFeHByZXNzaW9ufSwgZm9yIGNvbnZlcnRpbmcgcGFyc2VkIHJlc3VsdHMuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc2F2ZWxpc3Q9RmFsc2UgKToKICAgICAgICBzdXBlcihUb2tlbkNvbnZlcnRlcixzZWxmKS5fX2luaXRfXyggZXhwciApIywgc2F2ZWxpc3QgKQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IEZhbHNlCgpjbGFzcyBDb21iaW5lKFRva2VuQ29udmVydGVyKToKICAgICIiIgogICAgQ29udmVydGVyIHRvIGNvbmNhdGVuYXRlIGFsbCBtYXRjaGluZyB0b2tlbnMgdG8gYSBzaW5nbGUgc3RyaW5nLgogICAgQnkgZGVmYXVsdCwgdGhlIG1hdGNoaW5nIHBhdHRlcm5zIG11c3QgYWxzbyBiZSBjb250aWd1b3VzIGluIHRoZSBpbnB1dCBzdHJpbmc7CiAgICB0aGlzIGNhbiBiZSBkaXNhYmxlZCBieSBzcGVjaWZ5aW5nIEN7J2FkamFjZW50PUZhbHNlJ30gaW4gdGhlIGNvbnN0cnVjdG9yLgoKICAgIEV4YW1wbGU6OgogICAgICAgIHJlYWwgPSBXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKQogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuMTQxNicpKSAjIC0+IFsnMycsICcuJywgJzE0MTYnXQogICAgICAgICMgd2lsbCBhbHNvIGVycm9uZW91c2x5IG1hdGNoIHRoZSBmb2xsb3dpbmcKICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLiAxNDE2JykpICMgLT4gWyczJywgJy4nLCAnMTQxNiddCgogICAgICAgIHJlYWwgPSBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKQogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuMTQxNicpKSAjIC0+IFsnMy4xNDE2J10KICAgICAgICAjIG5vIG1hdGNoIHdoZW4gdGhlcmUgYXJlIGludGVybmFsIHNwYWNlcwogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuIDE0MTYnKSkgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIFc6KDAxMjMuLi4pCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgam9pblN0cmluZz0iIiwgYWRqYWNlbnQ9VHJ1ZSApOgogICAgICAgIHN1cGVyKENvbWJpbmUsc2VsZikuX19pbml0X18oIGV4cHIgKQogICAgICAgICMgc3VwcHJlc3Mgd2hpdGVzcGFjZS1zdHJpcHBpbmcgaW4gY29udGFpbmVkIHBhcnNlIGV4cHJlc3Npb25zLCBidXQgcmUtZW5hYmxlIGl0IG9uIHRoZSBDb21iaW5lIGl0c2VsZgogICAgICAgIGlmIGFkamFjZW50OgogICAgICAgICAgICBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpCiAgICAgICAgc2VsZi5hZGphY2VudCA9IGFkamFjZW50CiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUKICAgICAgICBzZWxmLmpvaW5TdHJpbmcgPSBqb2luU3RyaW5nCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBUcnVlCgogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToKICAgICAgICBpZiBzZWxmLmFkamFjZW50OgogICAgICAgICAgICBQYXJzZXJFbGVtZW50Lmlnbm9yZShzZWxmLCBvdGhlcikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdXBlciggQ29tYmluZSwgc2VsZikuaWdub3JlKCBvdGhlciApCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToKICAgICAgICByZXRUb2tzID0gdG9rZW5saXN0LmNvcHkoKQogICAgICAgIGRlbCByZXRUb2tzWzpdCiAgICAgICAgcmV0VG9rcyArPSBQYXJzZVJlc3VsdHMoWyAiIi5qb2luKHRva2VubGlzdC5fYXNTdHJpbmdMaXN0KHNlbGYuam9pblN0cmluZykpIF0sIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzKQoKICAgICAgICBpZiBzZWxmLnJlc3VsdHNOYW1lIGFuZCByZXRUb2tzLmhhc2tleXMoKToKICAgICAgICAgICAgcmV0dXJuIFsgcmV0VG9rcyBdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHJldFRva3MKCmNsYXNzIEdyb3VwKFRva2VuQ29udmVydGVyKToKICAgICIiIgogICAgQ29udmVydGVyIHRvIHJldHVybiB0aGUgbWF0Y2hlZCB0b2tlbnMgYXMgYSBsaXN0IC0gdXNlZnVsIGZvciByZXR1cm5pbmcgdG9rZW5zIG9mIEN7THtaZXJvT3JNb3JlfX0gYW5kIEN7THtPbmVPck1vcmV9fSBleHByZXNzaW9ucy4KCiAgICBFeGFtcGxlOjoKICAgICAgICBpZGVudCA9IFdvcmQoYWxwaGFzKQogICAgICAgIG51bSA9IFdvcmQobnVtcykKICAgICAgICB0ZXJtID0gaWRlbnQgfCBudW0KICAgICAgICBmdW5jID0gaWRlbnQgKyBPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHRlcm0pKQogICAgICAgIHByaW50KGZ1bmMucGFyc2VTdHJpbmcoImZuIGEsYiwxMDAiKSkgICMgLT4gWydmbicsICdhJywgJ2InLCAnMTAwJ10KCiAgICAgICAgZnVuYyA9IGlkZW50ICsgR3JvdXAoT3B0aW9uYWwoZGVsaW1pdGVkTGlzdCh0ZXJtKSkpCiAgICAgICAgcHJpbnQoZnVuYy5wYXJzZVN0cmluZygiZm4gYSxiLDEwMCIpKSAgIyAtPiBbJ2ZuJywgWydhJywgJ2InLCAnMTAwJ11dCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOgogICAgICAgIHN1cGVyKEdyb3VwLHNlbGYpLl9faW5pdF9fKCBleHByICkKICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlCgogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6CiAgICAgICAgcmV0dXJuIFsgdG9rZW5saXN0IF0KCmNsYXNzIERpY3QoVG9rZW5Db252ZXJ0ZXIpOgogICAgIiIiCiAgICBDb252ZXJ0ZXIgdG8gcmV0dXJuIGEgcmVwZXRpdGl2ZSBleHByZXNzaW9uIGFzIGEgbGlzdCwgYnV0IGFsc28gYXMgYSBkaWN0aW9uYXJ5LgogICAgRWFjaCBlbGVtZW50IGNhbiBhbHNvIGJlIHJlZmVyZW5jZWQgdXNpbmcgdGhlIGZpcnN0IHRva2VuIGluIHRoZSBleHByZXNzaW9uIGFzIGl0cyBrZXkuCiAgICBVc2VmdWwgZm9yIHRhYnVsYXIgcmVwb3J0IHNjcmFwaW5nIHdoZW4gdGhlIGZpcnN0IGNvbHVtbiBjYW4gYmUgdXNlZCBhcyBhIGl0ZW0ga2V5LgoKICAgIEV4YW1wbGU6OgogICAgICAgIGRhdGFfd29yZCA9IFdvcmQoYWxwaGFzKQogICAgICAgIGxhYmVsID0gZGF0YV93b3JkICsgRm9sbG93ZWRCeSgnOicpCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQoKICAgICAgICB0ZXh0ID0gInNoYXBlOiBTUVVBUkUgcG9zbjogdXBwZXIgbGVmdCBjb2xvcjogbGlnaHQgYmx1ZSB0ZXh0dXJlOiBidXJsYXAiCiAgICAgICAgYXR0cl9leHByID0gKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQogICAgICAgIAogICAgICAgICMgcHJpbnQgYXR0cmlidXRlcyBhcyBwbGFpbiBncm91cHMKICAgICAgICBwcmludChPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5kdW1wKCkpCiAgICAgICAgCiAgICAgICAgIyBpbnN0ZWFkIG9mIE9uZU9yTW9yZShleHByKSwgcGFyc2UgdXNpbmcgRGljdChPbmVPck1vcmUoR3JvdXAoZXhwcikpKSAtIERpY3Qgd2lsbCBhdXRvLWFzc2lnbiBuYW1lcwogICAgICAgIHJlc3VsdCA9IERpY3QoT25lT3JNb3JlKEdyb3VwKGF0dHJfZXhwcikpKS5wYXJzZVN0cmluZyh0ZXh0KQogICAgICAgIHByaW50KHJlc3VsdC5kdW1wKCkpCiAgICAgICAgCiAgICAgICAgIyBhY2Nlc3MgbmFtZWQgZmllbGRzIGFzIGRpY3QgZW50cmllcywgb3Igb3V0cHV0IGFzIGRpY3QKICAgICAgICBwcmludChyZXN1bHRbJ3NoYXBlJ10pICAgICAgICAKICAgICAgICBwcmludChyZXN1bHQuYXNEaWN0KCkpCiAgICBwcmludHM6OgogICAgICAgIFsnc2hhcGUnLCAnU1FVQVJFJywgJ3Bvc24nLCAndXBwZXIgbGVmdCcsICdjb2xvcicsICdsaWdodCBibHVlJywgJ3RleHR1cmUnLCAnYnVybGFwJ10KCiAgICAgICAgW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J10sIFsnY29sb3InLCAnbGlnaHQgYmx1ZSddLCBbJ3RleHR1cmUnLCAnYnVybGFwJ11dCiAgICAgICAgLSBjb2xvcjogbGlnaHQgYmx1ZQogICAgICAgIC0gcG9zbjogdXBwZXIgbGVmdAogICAgICAgIC0gc2hhcGU6IFNRVUFSRQogICAgICAgIC0gdGV4dHVyZTogYnVybGFwCiAgICAgICAgU1FVQVJFCiAgICAgICAgeydjb2xvcic6ICdsaWdodCBibHVlJywgJ3Bvc24nOiAndXBwZXIgbGVmdCcsICd0ZXh0dXJlJzogJ2J1cmxhcCcsICdzaGFwZSc6ICdTUVVBUkUnfQogICAgU2VlIG1vcmUgZXhhbXBsZXMgYXQgTHtQYXJzZVJlc3VsdHN9IG9mIGFjY2Vzc2luZyBmaWVsZHMgYnkgcmVzdWx0cyBuYW1lLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIgKToKICAgICAgICBzdXBlcihEaWN0LHNlbGYpLl9faW5pdF9fKCBleHByICkKICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlCgogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6CiAgICAgICAgZm9yIGksdG9rIGluIGVudW1lcmF0ZSh0b2tlbmxpc3QpOgogICAgICAgICAgICBpZiBsZW4odG9rKSA9PSAwOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWtleSA9IHRva1swXQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGlrZXksaW50KToKICAgICAgICAgICAgICAgIGlrZXkgPSBfdXN0cih0b2tbMF0pLnN0cmlwKCkKICAgICAgICAgICAgaWYgbGVuKHRvayk9PTE6CiAgICAgICAgICAgICAgICB0b2tlbmxpc3RbaWtleV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCgiIixpKQogICAgICAgICAgICBlbGlmIGxlbih0b2spPT0yIGFuZCBub3QgaXNpbnN0YW5jZSh0b2tbMV0sUGFyc2VSZXN1bHRzKToKICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHRva1sxXSxpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZGljdHZhbHVlID0gdG9rLmNvcHkoKSAjUGFyc2VSZXN1bHRzKGkpCiAgICAgICAgICAgICAgICBkZWwgZGljdHZhbHVlWzBdCiAgICAgICAgICAgICAgICBpZiBsZW4oZGljdHZhbHVlKSE9IDEgb3IgKGlzaW5zdGFuY2UoZGljdHZhbHVlLFBhcnNlUmVzdWx0cykgYW5kIGRpY3R2YWx1ZS5oYXNrZXlzKCkpOgogICAgICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KGRpY3R2YWx1ZSxpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB0b2tlbmxpc3RbaWtleV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChkaWN0dmFsdWVbMF0saSkKCiAgICAgICAgaWYgc2VsZi5yZXN1bHRzTmFtZToKICAgICAgICAgICAgcmV0dXJuIFsgdG9rZW5saXN0IF0KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gdG9rZW5saXN0CgoKY2xhc3MgU3VwcHJlc3MoVG9rZW5Db252ZXJ0ZXIpOgogICAgIiIiCiAgICBDb252ZXJ0ZXIgZm9yIGlnbm9yaW5nIHRoZSByZXN1bHRzIG9mIGEgcGFyc2VkIGV4cHJlc3Npb24uCgogICAgRXhhbXBsZTo6CiAgICAgICAgc291cmNlID0gImEsIGIsIGMsZCIKICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQogICAgICAgIHdkX2xpc3QxID0gd2QgKyBaZXJvT3JNb3JlKCcsJyArIHdkKQogICAgICAgIHByaW50KHdkX2xpc3QxLnBhcnNlU3RyaW5nKHNvdXJjZSkpCgogICAgICAgICMgb2Z0ZW4sIGRlbGltaXRlcnMgdGhhdCBhcmUgdXNlZnVsIGR1cmluZyBwYXJzaW5nIGFyZSBqdXN0IGluIHRoZQogICAgICAgICMgd2F5IGFmdGVyd2FyZCAtIHVzZSBTdXBwcmVzcyB0byBrZWVwIHRoZW0gb3V0IG9mIHRoZSBwYXJzZWQgb3V0cHV0CiAgICAgICAgd2RfbGlzdDIgPSB3ZCArIFplcm9Pck1vcmUoU3VwcHJlc3MoJywnKSArIHdkKQogICAgICAgIHByaW50KHdkX2xpc3QyLnBhcnNlU3RyaW5nKHNvdXJjZSkpCiAgICBwcmludHM6OgogICAgICAgIFsnYScsICcsJywgJ2InLCAnLCcsICdjJywgJywnLCAnZCddCiAgICAgICAgWydhJywgJ2InLCAnYycsICdkJ10KICAgIChTZWUgYWxzbyBMe2RlbGltaXRlZExpc3R9LikKICAgICIiIgogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6CiAgICAgICAgcmV0dXJuIFtdCgogICAgZGVmIHN1cHByZXNzKCBzZWxmICk6CiAgICAgICAgcmV0dXJuIHNlbGYKCgpjbGFzcyBPbmx5T25jZShvYmplY3QpOgogICAgIiIiCiAgICBXcmFwcGVyIGZvciBwYXJzZSBhY3Rpb25zLCB0byBlbnN1cmUgdGhleSBhcmUgb25seSBjYWxsZWQgb25jZS4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZENhbGwpOgogICAgICAgIHNlbGYuY2FsbGFibGUgPSBfdHJpbV9hcml0eShtZXRob2RDYWxsKQogICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UKICAgIGRlZiBfX2NhbGxfXyhzZWxmLHMsbCx0KToKICAgICAgICBpZiBub3Qgc2VsZi5jYWxsZWQ6CiAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxmLmNhbGxhYmxlKHMsbCx0KQogICAgICAgICAgICBzZWxmLmNhbGxlZCA9IFRydWUKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMKICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIiIpCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc2VsZi5jYWxsZWQgPSBGYWxzZQoKZGVmIHRyYWNlUGFyc2VBY3Rpb24oZik6CiAgICAiIiIKICAgIERlY29yYXRvciBmb3IgZGVidWdnaW5nIHBhcnNlIGFjdGlvbnMuIAogICAgCiAgICBXaGVuIHRoZSBwYXJzZSBhY3Rpb24gaXMgY2FsbGVkLCB0aGlzIGRlY29yYXRvciB3aWxsIHByaW50IEN7Ij4+IGVudGVyaW5nIEl7bWV0aG9kLW5hbWV9KGxpbmU6SXtjdXJyZW50X3NvdXJjZV9saW5lfSwgSXtwYXJzZV9sb2NhdGlvbn0sIEl7bWF0Y2hlZF90b2tlbnN9KSIufQogICAgV2hlbiB0aGUgcGFyc2UgYWN0aW9uIGNvbXBsZXRlcywgdGhlIGRlY29yYXRvciB3aWxsIHByaW50IEN7Ijw8In0gZm9sbG93ZWQgYnkgdGhlIHJldHVybmVkIHZhbHVlLCBvciBhbnkgZXhjZXB0aW9uIHRoYXQgdGhlIHBhcnNlIGFjdGlvbiByYWlzZWQuCgogICAgRXhhbXBsZTo6CiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykKCiAgICAgICAgQHRyYWNlUGFyc2VBY3Rpb24KICAgICAgICBkZWYgcmVtb3ZlX2R1cGxpY2F0ZV9jaGFycyh0b2tlbnMpOgogICAgICAgICAgICByZXR1cm4gJycuam9pbihzb3J0ZWQoc2V0KCcnLmpvaW4odG9rZW5zKSkpCgogICAgICAgIHdkcyA9IE9uZU9yTW9yZSh3ZCkuc2V0UGFyc2VBY3Rpb24ocmVtb3ZlX2R1cGxpY2F0ZV9jaGFycykKICAgICAgICBwcmludCh3ZHMucGFyc2VTdHJpbmcoInNsa2RqcyBzbGQgc2xkZCBzZGxmIHNkbGpmIikpCiAgICBwcmludHM6OgogICAgICAgID4+ZW50ZXJpbmcgcmVtb3ZlX2R1cGxpY2F0ZV9jaGFycyhsaW5lOiAnc2xrZGpzIHNsZCBzbGRkIHNkbGYgc2RsamYnLCAwLCAoWydzbGtkanMnLCAnc2xkJywgJ3NsZGQnLCAnc2RsZicsICdzZGxqZiddLCB7fSkpCiAgICAgICAgPDxsZWF2aW5nIHJlbW92ZV9kdXBsaWNhdGVfY2hhcnMgKHJldDogJ2RmamtscycpCiAgICAgICAgWydkZmprbHMnXQogICAgIiIiCiAgICBmID0gX3RyaW1fYXJpdHkoZikKICAgIGRlZiB6KCpwYUFyZ3MpOgogICAgICAgIHRoaXNGdW5jID0gZi5fX25hbWVfXwogICAgICAgIHMsbCx0ID0gcGFBcmdzWy0zOl0KICAgICAgICBpZiBsZW4ocGFBcmdzKT4zOgogICAgICAgICAgICB0aGlzRnVuYyA9IHBhQXJnc1swXS5fX2NsYXNzX18uX19uYW1lX18gKyAnLicgKyB0aGlzRnVuYwogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICI+PmVudGVyaW5nICVzKGxpbmU6ICclcycsICVkLCAlcilcbiIgJSAodGhpc0Z1bmMsbGluZShsLHMpLGwsdCkgKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0ID0gZigqcGFBcmdzKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiPDxsZWF2aW5nICVzIChleGNlcHRpb246ICVzKVxuIiAlICh0aGlzRnVuYyxleGMpICkKICAgICAgICAgICAgcmFpc2UKICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiPDxsZWF2aW5nICVzIChyZXQ6ICVyKVxuIiAlICh0aGlzRnVuYyxyZXQpICkKICAgICAgICByZXR1cm4gcmV0CiAgICB0cnk6CiAgICAgICAgei5fX25hbWVfXyA9IGYuX19uYW1lX18KICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICBwYXNzCiAgICByZXR1cm4gegoKIwojIGdsb2JhbCBoZWxwZXJzCiMKZGVmIGRlbGltaXRlZExpc3QoIGV4cHIsIGRlbGltPSIsIiwgY29tYmluZT1GYWxzZSApOgogICAgIiIiCiAgICBIZWxwZXIgdG8gZGVmaW5lIGEgZGVsaW1pdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMgLSB0aGUgZGVsaW1pdGVyIGRlZmF1bHRzIHRvICcsJy4KICAgIEJ5IGRlZmF1bHQsIHRoZSBsaXN0IGVsZW1lbnRzIGFuZCBkZWxpbWl0ZXJzIGNhbiBoYXZlIGludGVydmVuaW5nIHdoaXRlc3BhY2UsIGFuZAogICAgY29tbWVudHMsIGJ1dCB0aGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHBhc3NpbmcgQ3tjb21iaW5lPVRydWV9IGluIHRoZSBjb25zdHJ1Y3Rvci4KICAgIElmIEN7Y29tYmluZX0gaXMgc2V0IHRvIEN7VHJ1ZX0sIHRoZSBtYXRjaGluZyB0b2tlbnMgYXJlIHJldHVybmVkIGFzIGEgc2luZ2xlIHRva2VuCiAgICBzdHJpbmcsIHdpdGggdGhlIGRlbGltaXRlcnMgaW5jbHVkZWQ7IG90aGVyd2lzZSwgdGhlIG1hdGNoaW5nIHRva2VucyBhcmUgcmV0dXJuZWQKICAgIGFzIGEgbGlzdCBvZiB0b2tlbnMsIHdpdGggdGhlIGRlbGltaXRlcnMgc3VwcHJlc3NlZC4KCiAgICBFeGFtcGxlOjoKICAgICAgICBkZWxpbWl0ZWRMaXN0KFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoImFhLGJiLGNjIikgIyAtPiBbJ2FhJywgJ2JiJywgJ2NjJ10KICAgICAgICBkZWxpbWl0ZWRMaXN0KFdvcmQoaGV4bnVtcyksIGRlbGltPSc6JywgY29tYmluZT1UcnVlKS5wYXJzZVN0cmluZygiQUE6QkI6Q0M6REQ6RUUiKSAjIC0+IFsnQUE6QkI6Q0M6REQ6RUUnXQogICAgIiIiCiAgICBkbE5hbWUgPSBfdXN0cihleHByKSsiIFsiK191c3RyKGRlbGltKSsiICIrX3VzdHIoZXhwcikrIl0uLi4iCiAgICBpZiBjb21iaW5lOgogICAgICAgIHJldHVybiBDb21iaW5lKCBleHByICsgWmVyb09yTW9yZSggZGVsaW0gKyBleHByICkgKS5zZXROYW1lKGRsTmFtZSkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuICggZXhwciArIFplcm9Pck1vcmUoIFN1cHByZXNzKCBkZWxpbSApICsgZXhwciApICkuc2V0TmFtZShkbE5hbWUpCgpkZWYgY291bnRlZEFycmF5KCBleHByLCBpbnRFeHByPU5vbmUgKToKICAgICIiIgogICAgSGVscGVyIHRvIGRlZmluZSBhIGNvdW50ZWQgbGlzdCBvZiBleHByZXNzaW9ucy4KICAgIFRoaXMgaGVscGVyIGRlZmluZXMgYSBwYXR0ZXJuIG9mIHRoZSBmb3JtOjoKICAgICAgICBpbnRlZ2VyIGV4cHIgZXhwciBleHByLi4uCiAgICB3aGVyZSB0aGUgbGVhZGluZyBpbnRlZ2VyIHRlbGxzIGhvdyBtYW55IGV4cHIgZXhwcmVzc2lvbnMgZm9sbG93LgogICAgVGhlIG1hdGNoZWQgdG9rZW5zIHJldHVybnMgdGhlIGFycmF5IG9mIGV4cHIgdG9rZW5zIGFzIGEgbGlzdCAtIHRoZSBsZWFkaW5nIGNvdW50IHRva2VuIGlzIHN1cHByZXNzZWQuCiAgICAKICAgIElmIEN7aW50RXhwcn0gaXMgc3BlY2lmaWVkLCBpdCBzaG91bGQgYmUgYSBweXBhcnNpbmcgZXhwcmVzc2lvbiB0aGF0IHByb2R1Y2VzIGFuIGludGVnZXIgdmFsdWUuCgogICAgRXhhbXBsZTo6CiAgICAgICAgY291bnRlZEFycmF5KFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoJzIgYWIgY2QgZWYnKSAgIyAtPiBbJ2FiJywgJ2NkJ10KCiAgICAgICAgIyBpbiB0aGlzIHBhcnNlciwgdGhlIGxlYWRpbmcgaW50ZWdlciB2YWx1ZSBpcyBnaXZlbiBpbiBiaW5hcnksCiAgICAgICAgIyAnMTAnIGluZGljYXRpbmcgdGhhdCAyIHZhbHVlcyBhcmUgaW4gdGhlIGFycmF5CiAgICAgICAgYmluYXJ5Q29uc3RhbnQgPSBXb3JkKCcwMScpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OiBpbnQodFswXSwgMikpCiAgICAgICAgY291bnRlZEFycmF5KFdvcmQoYWxwaGFzKSwgaW50RXhwcj1iaW5hcnlDb25zdGFudCkucGFyc2VTdHJpbmcoJzEwIGFiIGNkIGVmJykgICMgLT4gWydhYicsICdjZCddCiAgICAiIiIKICAgIGFycmF5RXhwciA9IEZvcndhcmQoKQogICAgZGVmIGNvdW50RmllbGRQYXJzZUFjdGlvbihzLGwsdCk6CiAgICAgICAgbiA9IHRbMF0KICAgICAgICBhcnJheUV4cHIgPDwgKG4gYW5kIEdyb3VwKEFuZChbZXhwcl0qbikpIG9yIEdyb3VwKGVtcHR5KSkKICAgICAgICByZXR1cm4gW10KICAgIGlmIGludEV4cHIgaXMgTm9uZToKICAgICAgICBpbnRFeHByID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDppbnQodFswXSkpCiAgICBlbHNlOgogICAgICAgIGludEV4cHIgPSBpbnRFeHByLmNvcHkoKQogICAgaW50RXhwci5zZXROYW1lKCJhcnJheUxlbiIpCiAgICBpbnRFeHByLmFkZFBhcnNlQWN0aW9uKGNvdW50RmllbGRQYXJzZUFjdGlvbiwgY2FsbER1cmluZ1RyeT1UcnVlKQogICAgcmV0dXJuICggaW50RXhwciArIGFycmF5RXhwciApLnNldE5hbWUoJyhsZW4pICcgKyBfdXN0cihleHByKSArICcuLi4nKQoKZGVmIF9mbGF0dGVuKEwpOgogICAgcmV0ID0gW10KICAgIGZvciBpIGluIEw6CiAgICAgICAgaWYgaXNpbnN0YW5jZShpLGxpc3QpOgogICAgICAgICAgICByZXQuZXh0ZW5kKF9mbGF0dGVuKGkpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldC5hcHBlbmQoaSkKICAgIHJldHVybiByZXQKCmRlZiBtYXRjaFByZXZpb3VzTGl0ZXJhbChleHByKToKICAgICIiIgogICAgSGVscGVyIHRvIGRlZmluZSBhbiBleHByZXNzaW9uIHRoYXQgaXMgaW5kaXJlY3RseSBkZWZpbmVkIGZyb20KICAgIHRoZSB0b2tlbnMgbWF0Y2hlZCBpbiBhIHByZXZpb3VzIGV4cHJlc3Npb24sIHRoYXQgaXMsIGl0IGxvb2tzCiAgICBmb3IgYSAncmVwZWF0JyBvZiBhIHByZXZpb3VzIGV4cHJlc3Npb24uICBGb3IgZXhhbXBsZTo6CiAgICAgICAgZmlyc3QgPSBXb3JkKG51bXMpCiAgICAgICAgc2Vjb25kID0gbWF0Y2hQcmV2aW91c0xpdGVyYWwoZmlyc3QpCiAgICAgICAgbWF0Y2hFeHByID0gZmlyc3QgKyAiOiIgKyBzZWNvbmQKICAgIHdpbGwgbWF0Y2ggQ3siMToxIn0sIGJ1dCBub3QgQ3siMToyIn0uICBCZWNhdXNlIHRoaXMgbWF0Y2hlcyBhCiAgICBwcmV2aW91cyBsaXRlcmFsLCB3aWxsIGFsc28gbWF0Y2ggdGhlIGxlYWRpbmcgQ3siMToxIn0gaW4gQ3siMToxMCJ9LgogICAgSWYgdGhpcyBpcyBub3QgZGVzaXJlZCwgdXNlIEN7bWF0Y2hQcmV2aW91c0V4cHJ9LgogICAgRG8gSXtub3R9IHVzZSB3aXRoIHBhY2tyYXQgcGFyc2luZyBlbmFibGVkLgogICAgIiIiCiAgICByZXAgPSBGb3J3YXJkKCkKICAgIGRlZiBjb3B5VG9rZW5Ub1JlcGVhdGVyKHMsbCx0KToKICAgICAgICBpZiB0OgogICAgICAgICAgICBpZiBsZW4odCkgPT0gMToKICAgICAgICAgICAgICAgIHJlcCA8PCB0WzBdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGZsYXR0ZW4gdCB0b2tlbnMKICAgICAgICAgICAgICAgIHRmbGF0ID0gX2ZsYXR0ZW4odC5hc0xpc3QoKSkKICAgICAgICAgICAgICAgIHJlcCA8PCBBbmQoTGl0ZXJhbCh0dCkgZm9yIHR0IGluIHRmbGF0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlcCA8PCBFbXB0eSgpCiAgICBleHByLmFkZFBhcnNlQWN0aW9uKGNvcHlUb2tlblRvUmVwZWF0ZXIsIGNhbGxEdXJpbmdUcnk9VHJ1ZSkKICAgIHJlcC5zZXROYW1lKCcocHJldikgJyArIF91c3RyKGV4cHIpKQogICAgcmV0dXJuIHJlcAoKZGVmIG1hdGNoUHJldmlvdXNFeHByKGV4cHIpOgogICAgIiIiCiAgICBIZWxwZXIgdG8gZGVmaW5lIGFuIGV4cHJlc3Npb24gdGhhdCBpcyBpbmRpcmVjdGx5IGRlZmluZWQgZnJvbQogICAgdGhlIHRva2VucyBtYXRjaGVkIGluIGEgcHJldmlvdXMgZXhwcmVzc2lvbiwgdGhhdCBpcywgaXQgbG9va3MKICAgIGZvciBhICdyZXBlYXQnIG9mIGEgcHJldmlvdXMgZXhwcmVzc2lvbi4gIEZvciBleGFtcGxlOjoKICAgICAgICBmaXJzdCA9IFdvcmQobnVtcykKICAgICAgICBzZWNvbmQgPSBtYXRjaFByZXZpb3VzRXhwcihmaXJzdCkKICAgICAgICBtYXRjaEV4cHIgPSBmaXJzdCArICI6IiArIHNlY29uZAogICAgd2lsbCBtYXRjaCBDeyIxOjEifSwgYnV0IG5vdCBDeyIxOjIifS4gIEJlY2F1c2UgdGhpcyBtYXRjaGVzIGJ5CiAgICBleHByZXNzaW9ucywgd2lsbCBJe25vdH0gbWF0Y2ggdGhlIGxlYWRpbmcgQ3siMToxIn0gaW4gQ3siMToxMCJ9OwogICAgdGhlIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgZmlyc3QsIGFuZCB0aGVuIGNvbXBhcmVkLCBzbwogICAgQ3siMSJ9IGlzIGNvbXBhcmVkIHdpdGggQ3siMTAifS4KICAgIERvIEl7bm90fSB1c2Ugd2l0aCBwYWNrcmF0IHBhcnNpbmcgZW5hYmxlZC4KICAgICIiIgogICAgcmVwID0gRm9yd2FyZCgpCiAgICBlMiA9IGV4cHIuY29weSgpCiAgICByZXAgPDw9IGUyCiAgICBkZWYgY29weVRva2VuVG9SZXBlYXRlcihzLGwsdCk6CiAgICAgICAgbWF0Y2hUb2tlbnMgPSBfZmxhdHRlbih0LmFzTGlzdCgpKQogICAgICAgIGRlZiBtdXN0TWF0Y2hUaGVzZVRva2VucyhzLGwsdCk6CiAgICAgICAgICAgIHRoZXNlVG9rZW5zID0gX2ZsYXR0ZW4odC5hc0xpc3QoKSkKICAgICAgICAgICAgaWYgIHRoZXNlVG9rZW5zICE9IG1hdGNoVG9rZW5zOgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIiIsMCwiIikKICAgICAgICByZXAuc2V0UGFyc2VBY3Rpb24oIG11c3RNYXRjaFRoZXNlVG9rZW5zLCBjYWxsRHVyaW5nVHJ5PVRydWUgKQogICAgZXhwci5hZGRQYXJzZUFjdGlvbihjb3B5VG9rZW5Ub1JlcGVhdGVyLCBjYWxsRHVyaW5nVHJ5PVRydWUpCiAgICByZXAuc2V0TmFtZSgnKHByZXYpICcgKyBfdXN0cihleHByKSkKICAgIHJldHVybiByZXAKCmRlZiBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHMpOgogICAgI34gIGVzY2FwZSB0aGVzZSBjaGFyczogXi1dCiAgICBmb3IgYyBpbiByIlxeLV0iOgogICAgICAgIHMgPSBzLnJlcGxhY2UoYyxfYnNsYXNoK2MpCiAgICBzID0gcy5yZXBsYWNlKCJcbiIsciJcbiIpCiAgICBzID0gcy5yZXBsYWNlKCJcdCIsciJcdCIpCiAgICByZXR1cm4gX3VzdHIocykKCmRlZiBvbmVPZiggc3RycywgY2FzZWxlc3M9RmFsc2UsIHVzZVJlZ2V4PVRydWUgKToKICAgICIiIgogICAgSGVscGVyIHRvIHF1aWNrbHkgZGVmaW5lIGEgc2V0IG9mIGFsdGVybmF0aXZlIExpdGVyYWxzLCBhbmQgbWFrZXMgc3VyZSB0byBkbwogICAgbG9uZ2VzdC1maXJzdCB0ZXN0aW5nIHdoZW4gdGhlcmUgaXMgYSBjb25mbGljdCwgcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQgb3JkZXIsCiAgICBidXQgcmV0dXJucyBhIEN7THtNYXRjaEZpcnN0fX0gZm9yIGJlc3QgcGVyZm9ybWFuY2UuCgogICAgUGFyYW1ldGVyczoKICAgICAtIHN0cnMgLSBhIHN0cmluZyBvZiBzcGFjZS1kZWxpbWl0ZWQgbGl0ZXJhbHMsIG9yIGEgY29sbGVjdGlvbiBvZiBzdHJpbmcgbGl0ZXJhbHMKICAgICAtIGNhc2VsZXNzIC0gKGRlZmF1bHQ9Q3tGYWxzZX0pIC0gdHJlYXQgYWxsIGxpdGVyYWxzIGFzIGNhc2VsZXNzCiAgICAgLSB1c2VSZWdleCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gYXMgYW4gb3B0aW1pemF0aW9uLCB3aWxsIGdlbmVyYXRlIGEgUmVnZXgKICAgICAgICAgIG9iamVjdDsgb3RoZXJ3aXNlLCB3aWxsIGdlbmVyYXRlIGEgQ3tNYXRjaEZpcnN0fSBvYmplY3QgKGlmIEN7Y2FzZWxlc3M9VHJ1ZX0sIG9yCiAgICAgICAgICBpZiBjcmVhdGluZyBhIEN7UmVnZXh9IHJhaXNlcyBhbiBleGNlcHRpb24pCgogICAgRXhhbXBsZTo6CiAgICAgICAgY29tcF9vcGVyID0gb25lT2YoIjwgPSA+IDw9ID49ICE9IikKICAgICAgICB2YXIgPSBXb3JkKGFscGhhcykKICAgICAgICBudW1iZXIgPSBXb3JkKG51bXMpCiAgICAgICAgdGVybSA9IHZhciB8IG51bWJlcgogICAgICAgIGNvbXBhcmlzb25fZXhwciA9IHRlcm0gKyBjb21wX29wZXIgKyB0ZXJtCiAgICAgICAgcHJpbnQoY29tcGFyaXNvbl9leHByLnNlYXJjaFN0cmluZygiQiA9IDEyICBBQT0yMyBCPD1BQSBBQT4xMiIpKQogICAgcHJpbnRzOjoKICAgICAgICBbWydCJywgJz0nLCAnMTInXSwgWydBQScsICc9JywgJzIzJ10sIFsnQicsICc8PScsICdBQSddLCBbJ0FBJywgJz4nLCAnMTInXV0KICAgICIiIgogICAgaWYgY2FzZWxlc3M6CiAgICAgICAgaXNlcXVhbCA9ICggbGFtYmRhIGEsYjogYS51cHBlcigpID09IGIudXBwZXIoKSApCiAgICAgICAgbWFza3MgPSAoIGxhbWJkYSBhLGI6IGIudXBwZXIoKS5zdGFydHN3aXRoKGEudXBwZXIoKSkgKQogICAgICAgIHBhcnNlRWxlbWVudENsYXNzID0gQ2FzZWxlc3NMaXRlcmFsCiAgICBlbHNlOgogICAgICAgIGlzZXF1YWwgPSAoIGxhbWJkYSBhLGI6IGEgPT0gYiApCiAgICAgICAgbWFza3MgPSAoIGxhbWJkYSBhLGI6IGIuc3RhcnRzd2l0aChhKSApCiAgICAgICAgcGFyc2VFbGVtZW50Q2xhc3MgPSBMaXRlcmFsCgogICAgc3ltYm9scyA9IFtdCiAgICBpZiBpc2luc3RhbmNlKHN0cnMsYmFzZXN0cmluZyk6CiAgICAgICAgc3ltYm9scyA9IHN0cnMuc3BsaXQoKQogICAgZWxpZiBpc2luc3RhbmNlKHN0cnMsIGNvbGxlY3Rpb25zLkl0ZXJhYmxlKToKICAgICAgICBzeW1ib2xzID0gbGlzdChzdHJzKQogICAgZWxzZToKICAgICAgICB3YXJuaW5ncy53YXJuKCJJbnZhbGlkIGFyZ3VtZW50IHRvIG9uZU9mLCBleHBlY3RlZCBzdHJpbmcgb3IgaXRlcmFibGUiLAogICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgaWYgbm90IHN5bWJvbHM6CiAgICAgICAgcmV0dXJuIE5vTWF0Y2goKQoKICAgIGkgPSAwCiAgICB3aGlsZSBpIDwgbGVuKHN5bWJvbHMpLTE6CiAgICAgICAgY3VyID0gc3ltYm9sc1tpXQogICAgICAgIGZvciBqLG90aGVyIGluIGVudW1lcmF0ZShzeW1ib2xzW2krMTpdKToKICAgICAgICAgICAgaWYgKCBpc2VxdWFsKG90aGVyLCBjdXIpICk6CiAgICAgICAgICAgICAgICBkZWwgc3ltYm9sc1tpK2orMV0KICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgKCBtYXNrcyhjdXIsIG90aGVyKSApOgogICAgICAgICAgICAgICAgZGVsIHN5bWJvbHNbaStqKzFdCiAgICAgICAgICAgICAgICBzeW1ib2xzLmluc2VydChpLG90aGVyKQogICAgICAgICAgICAgICAgY3VyID0gb3RoZXIKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaSArPSAxCgogICAgaWYgbm90IGNhc2VsZXNzIGFuZCB1c2VSZWdleDoKICAgICAgICAjfiBwcmludCAoc3RycywiLT4iLCAifCIuam9pbiggWyBfZXNjYXBlUmVnZXhDaGFycyhzeW0pIGZvciBzeW0gaW4gc3ltYm9sc10gKSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIGxlbihzeW1ib2xzKT09bGVuKCIiLmpvaW4oc3ltYm9scykpOgogICAgICAgICAgICAgICAgcmV0dXJuIFJlZ2V4KCAiWyVzXSIgJSAiIi5qb2luKF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc3ltKSBmb3Igc3ltIGluIHN5bWJvbHMpICkuc2V0TmFtZSgnIHwgJy5qb2luKHN5bWJvbHMpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIFJlZ2V4KCAifCIuam9pbihyZS5lc2NhcGUoc3ltKSBmb3Igc3ltIGluIHN5bWJvbHMpICkuc2V0TmFtZSgnIHwgJy5qb2luKHN5bWJvbHMpKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkV4Y2VwdGlvbiBjcmVhdGluZyBSZWdleCBmb3Igb25lT2YsIGJ1aWxkaW5nIE1hdGNoRmlyc3QiLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKCgogICAgIyBsYXN0IHJlc29ydCwganVzdCB1c2UgTWF0Y2hGaXJzdAogICAgcmV0dXJuIE1hdGNoRmlyc3QocGFyc2VFbGVtZW50Q2xhc3Moc3ltKSBmb3Igc3ltIGluIHN5bWJvbHMpLnNldE5hbWUoJyB8ICcuam9pbihzeW1ib2xzKSkKCmRlZiBkaWN0T2YoIGtleSwgdmFsdWUgKToKICAgICIiIgogICAgSGVscGVyIHRvIGVhc2lseSBhbmQgY2xlYXJseSBkZWZpbmUgYSBkaWN0aW9uYXJ5IGJ5IHNwZWNpZnlpbmcgdGhlIHJlc3BlY3RpdmUgcGF0dGVybnMKICAgIGZvciB0aGUga2V5IGFuZCB2YWx1ZS4gIFRha2VzIGNhcmUgb2YgZGVmaW5pbmcgdGhlIEN7THtEaWN0fX0sIEN7THtaZXJvT3JNb3JlfX0sIGFuZCBDe0x7R3JvdXB9fSB0b2tlbnMKICAgIGluIHRoZSBwcm9wZXIgb3JkZXIuICBUaGUga2V5IHBhdHRlcm4gY2FuIGluY2x1ZGUgZGVsaW1pdGluZyBtYXJrZXJzIG9yIHB1bmN0dWF0aW9uLAogICAgYXMgbG9uZyBhcyB0aGV5IGFyZSBzdXBwcmVzc2VkLCB0aGVyZWJ5IGxlYXZpbmcgdGhlIHNpZ25pZmljYW50IGtleSB0ZXh0LiAgVGhlIHZhbHVlCiAgICBwYXR0ZXJuIGNhbiBpbmNsdWRlIG5hbWVkIHJlc3VsdHMsIHNvIHRoYXQgdGhlIEN7RGljdH0gcmVzdWx0cyBjYW4gaW5jbHVkZSBuYW1lZCB0b2tlbgogICAgZmllbGRzLgoKICAgIEV4YW1wbGU6OgogICAgICAgIHRleHQgPSAic2hhcGU6IFNRVUFSRSBwb3NuOiB1cHBlciBsZWZ0IGNvbG9yOiBsaWdodCBibHVlIHRleHR1cmU6IGJ1cmxhcCIKICAgICAgICBhdHRyX2V4cHIgPSAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpCiAgICAgICAgcHJpbnQoT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkuZHVtcCgpKQogICAgICAgIAogICAgICAgIGF0dHJfbGFiZWwgPSBsYWJlbAogICAgICAgIGF0dHJfdmFsdWUgPSBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikKCiAgICAgICAgIyBzaW1pbGFyIHRvIERpY3QsIGJ1dCBzaW1wbGVyIGNhbGwgZm9ybWF0CiAgICAgICAgcmVzdWx0ID0gZGljdE9mKGF0dHJfbGFiZWwsIGF0dHJfdmFsdWUpLnBhcnNlU3RyaW5nKHRleHQpCiAgICAgICAgcHJpbnQocmVzdWx0LmR1bXAoKSkKICAgICAgICBwcmludChyZXN1bHRbJ3NoYXBlJ10pCiAgICAgICAgcHJpbnQocmVzdWx0LnNoYXBlKSAgIyBvYmplY3QgYXR0cmlidXRlIGFjY2VzcyB3b3JrcyB0b28KICAgICAgICBwcmludChyZXN1bHQuYXNEaWN0KCkpCiAgICBwcmludHM6OgogICAgICAgIFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddLCBbJ2NvbG9yJywgJ2xpZ2h0IGJsdWUnXSwgWyd0ZXh0dXJlJywgJ2J1cmxhcCddXQogICAgICAgIC0gY29sb3I6IGxpZ2h0IGJsdWUKICAgICAgICAtIHBvc246IHVwcGVyIGxlZnQKICAgICAgICAtIHNoYXBlOiBTUVVBUkUKICAgICAgICAtIHRleHR1cmU6IGJ1cmxhcAogICAgICAgIFNRVUFSRQogICAgICAgIFNRVUFSRQogICAgICAgIHsnY29sb3InOiAnbGlnaHQgYmx1ZScsICdzaGFwZSc6ICdTUVVBUkUnLCAncG9zbic6ICd1cHBlciBsZWZ0JywgJ3RleHR1cmUnOiAnYnVybGFwJ30KICAgICIiIgogICAgcmV0dXJuIERpY3QoIFplcm9Pck1vcmUoIEdyb3VwICgga2V5ICsgdmFsdWUgKSApICkKCmRlZiBvcmlnaW5hbFRleHRGb3IoZXhwciwgYXNTdHJpbmc9VHJ1ZSk6CiAgICAiIiIKICAgIEhlbHBlciB0byByZXR1cm4gdGhlIG9yaWdpbmFsLCB1bnRva2VuaXplZCB0ZXh0IGZvciBhIGdpdmVuIGV4cHJlc3Npb24uICBVc2VmdWwgdG8KICAgIHJlc3RvcmUgdGhlIHBhcnNlZCBmaWVsZHMgb2YgYW4gSFRNTCBzdGFydCB0YWcgaW50byB0aGUgcmF3IHRhZyB0ZXh0IGl0c2VsZiwgb3IgdG8KICAgIHJldmVydCBzZXBhcmF0ZSB0b2tlbnMgd2l0aCBpbnRlcnZlbmluZyB3aGl0ZXNwYWNlIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG1hdGNoaW5nCiAgICBpbnB1dCB0ZXh0LiBCeSBkZWZhdWx0LCByZXR1cm5zIGFzdHJpbmcgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgcGFyc2VkIHRleHQuICAKICAgICAgIAogICAgSWYgdGhlIG9wdGlvbmFsIEN7YXNTdHJpbmd9IGFyZ3VtZW50IGlzIHBhc3NlZCBhcyBDe0ZhbHNlfSwgdGhlbiB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgCiAgICBDe0x7UGFyc2VSZXN1bHRzfX0gY29udGFpbmluZyBhbnkgcmVzdWx0cyBuYW1lcyB0aGF0IHdlcmUgb3JpZ2luYWxseSBtYXRjaGVkLCBhbmQgYSAKICAgIHNpbmdsZSB0b2tlbiBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBtYXRjaGVkIHRleHQgZnJvbSB0aGUgaW5wdXQgc3RyaW5nLiAgU28gaWYgCiAgICB0aGUgZXhwcmVzc2lvbiBwYXNzZWQgdG8gQ3tMe29yaWdpbmFsVGV4dEZvcn19IGNvbnRhaW5zIGV4cHJlc3Npb25zIHdpdGggZGVmaW5lZAogICAgcmVzdWx0cyBuYW1lcywgeW91IG11c3Qgc2V0IEN7YXNTdHJpbmd9IHRvIEN7RmFsc2V9IGlmIHlvdSB3YW50IHRvIHByZXNlcnZlIHRob3NlCiAgICByZXN1bHRzIG5hbWUgdmFsdWVzLgoKICAgIEV4YW1wbGU6OgogICAgICAgIHNyYyA9ICJ0aGlzIGlzIHRlc3QgPGI+IGJvbGQgPGk+dGV4dDwvaT4gPC9iPiBub3JtYWwgdGV4dCAiCiAgICAgICAgZm9yIHRhZyBpbiAoImIiLCJpIik6CiAgICAgICAgICAgIG9wZW5lcixjbG9zZXIgPSBtYWtlSFRNTFRhZ3ModGFnKQogICAgICAgICAgICBwYXR0ID0gb3JpZ2luYWxUZXh0Rm9yKG9wZW5lciArIFNraXBUbyhjbG9zZXIpICsgY2xvc2VyKQogICAgICAgICAgICBwcmludChwYXR0LnNlYXJjaFN0cmluZyhzcmMpWzBdKQogICAgcHJpbnRzOjoKICAgICAgICBbJzxiPiBib2xkIDxpPnRleHQ8L2k+IDwvYj4nXQogICAgICAgIFsnPGk+dGV4dDwvaT4nXQogICAgIiIiCiAgICBsb2NNYXJrZXIgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGxvYyx0OiBsb2MpCiAgICBlbmRsb2NNYXJrZXIgPSBsb2NNYXJrZXIuY29weSgpCiAgICBlbmRsb2NNYXJrZXIuY2FsbFByZXBhcnNlID0gRmFsc2UKICAgIG1hdGNoRXhwciA9IGxvY01hcmtlcigiX29yaWdpbmFsX3N0YXJ0IikgKyBleHByICsgZW5kbG9jTWFya2VyKCJfb3JpZ2luYWxfZW5kIikKICAgIGlmIGFzU3RyaW5nOgogICAgICAgIGV4dHJhY3RUZXh0ID0gbGFtYmRhIHMsbCx0OiBzW3QuX29yaWdpbmFsX3N0YXJ0OnQuX29yaWdpbmFsX2VuZF0KICAgIGVsc2U6CiAgICAgICAgZGVmIGV4dHJhY3RUZXh0KHMsbCx0KToKICAgICAgICAgICAgdFs6XSA9IFtzW3QucG9wKCdfb3JpZ2luYWxfc3RhcnQnKTp0LnBvcCgnX29yaWdpbmFsX2VuZCcpXV0KICAgIG1hdGNoRXhwci5zZXRQYXJzZUFjdGlvbihleHRyYWN0VGV4dCkKICAgIG1hdGNoRXhwci5pZ25vcmVFeHBycyA9IGV4cHIuaWdub3JlRXhwcnMKICAgIHJldHVybiBtYXRjaEV4cHIKCmRlZiB1bmdyb3VwKGV4cHIpOiAKICAgICIiIgogICAgSGVscGVyIHRvIHVuZG8gcHlwYXJzaW5nJ3MgZGVmYXVsdCBncm91cGluZyBvZiBBbmQgZXhwcmVzc2lvbnMsIGV2ZW4KICAgIGlmIGFsbCBidXQgb25lIGFyZSBub24tZW1wdHkuCiAgICAiIiIKICAgIHJldHVybiBUb2tlbkNvbnZlcnRlcihleHByKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdKQoKZGVmIGxvY2F0ZWRFeHByKGV4cHIpOgogICAgIiIiCiAgICBIZWxwZXIgdG8gZGVjb3JhdGUgYSByZXR1cm5lZCB0b2tlbiB3aXRoIGl0cyBzdGFydGluZyBhbmQgZW5kaW5nIGxvY2F0aW9ucyBpbiB0aGUgaW5wdXQgc3RyaW5nLgogICAgVGhpcyBoZWxwZXIgYWRkcyB0aGUgZm9sbG93aW5nIHJlc3VsdHMgbmFtZXM6CiAgICAgLSBsb2NuX3N0YXJ0ID0gbG9jYXRpb24gd2hlcmUgbWF0Y2hlZCBleHByZXNzaW9uIGJlZ2lucwogICAgIC0gbG9jbl9lbmQgPSBsb2NhdGlvbiB3aGVyZSBtYXRjaGVkIGV4cHJlc3Npb24gZW5kcwogICAgIC0gdmFsdWUgPSB0aGUgYWN0dWFsIHBhcnNlZCByZXN1bHRzCgogICAgQmUgY2FyZWZ1bCBpZiB0aGUgaW5wdXQgdGV4dCBjb250YWlucyBDezxUQUI+fSBjaGFyYWN0ZXJzLCB5b3UgbWF5IHdhbnQgdG8gY2FsbAogICAgQ3tMe1BhcnNlckVsZW1lbnQucGFyc2VXaXRoVGFic319CgogICAgRXhhbXBsZTo6CiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykKICAgICAgICBmb3IgbWF0Y2ggaW4gbG9jYXRlZEV4cHIod2QpLnNlYXJjaFN0cmluZygibGpzZGYxMjNsa3NkampmMTIzbGtramoxMjIyIik6CiAgICAgICAgICAgIHByaW50KG1hdGNoKQogICAgcHJpbnRzOjoKICAgICAgICBbWzAsICdsanNkZicsIDVdXQogICAgICAgIFtbOCwgJ2xrc2RqamYnLCAxNV1dCiAgICAgICAgW1sxOCwgJ2xra2pqJywgMjNdXQogICAgIiIiCiAgICBsb2NhdG9yID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6IGwpCiAgICByZXR1cm4gR3JvdXAobG9jYXRvcigibG9jbl9zdGFydCIpICsgZXhwcigidmFsdWUiKSArIGxvY2F0b3IuY29weSgpLmxlYXZlV2hpdGVzcGFjZSgpKCJsb2NuX2VuZCIpKQoKCiMgY29udmVuaWVuY2UgY29uc3RhbnRzIGZvciBwb3NpdGlvbmFsIGV4cHJlc3Npb25zCmVtcHR5ICAgICAgID0gRW1wdHkoKS5zZXROYW1lKCJlbXB0eSIpCmxpbmVTdGFydCAgID0gTGluZVN0YXJ0KCkuc2V0TmFtZSgibGluZVN0YXJ0IikKbGluZUVuZCAgICAgPSBMaW5lRW5kKCkuc2V0TmFtZSgibGluZUVuZCIpCnN0cmluZ1N0YXJ0ID0gU3RyaW5nU3RhcnQoKS5zZXROYW1lKCJzdHJpbmdTdGFydCIpCnN0cmluZ0VuZCAgID0gU3RyaW5nRW5kKCkuc2V0TmFtZSgic3RyaW5nRW5kIikKCl9lc2NhcGVkUHVuYyA9IFdvcmQoIF9ic2xhc2gsIHIiXFtdLSouJCtePygpfiAiLCBleGFjdD0yICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnRbMF1bMV0pCl9lc2NhcGVkSGV4Q2hhciA9IFJlZ2V4KHIiXFwwP1t4WF1bMC05YS1mQS1GXSsiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dW5pY2hyKGludCh0WzBdLmxzdHJpcChyJ1wweCcpLDE2KSkpCl9lc2NhcGVkT2N0Q2hhciA9IFJlZ2V4KHIiXFwwWzAtN10rIikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnVuaWNocihpbnQodFswXVsxOl0sOCkpKQpfc2luZ2xlQ2hhciA9IF9lc2NhcGVkUHVuYyB8IF9lc2NhcGVkSGV4Q2hhciB8IF9lc2NhcGVkT2N0Q2hhciB8IFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPXInXF0nLCBleGFjdD0xKSB8IFJlZ2V4KHIiXHciLCByZS5VTklDT0RFKQpfY2hhclJhbmdlID0gR3JvdXAoX3NpbmdsZUNoYXIgKyBTdXBwcmVzcygiLSIpICsgX3NpbmdsZUNoYXIpCl9yZUJyYWNrZXRFeHByID0gTGl0ZXJhbCgiWyIpICsgT3B0aW9uYWwoIl4iKS5zZXRSZXN1bHRzTmFtZSgibmVnYXRlIikgKyBHcm91cCggT25lT3JNb3JlKCBfY2hhclJhbmdlIHwgX3NpbmdsZUNoYXIgKSApLnNldFJlc3VsdHNOYW1lKCJib2R5IikgKyAiXSIKCmRlZiBzcmFuZ2Uocyk6CiAgICByIiIiCiAgICBIZWxwZXIgdG8gZWFzaWx5IGRlZmluZSBzdHJpbmcgcmFuZ2VzIGZvciB1c2UgaW4gV29yZCBjb25zdHJ1Y3Rpb24uICBCb3Jyb3dzCiAgICBzeW50YXggZnJvbSByZWdleHAgJ1tdJyBzdHJpbmcgcmFuZ2UgZGVmaW5pdGlvbnM6OgogICAgICAgIHNyYW5nZSgiWzAtOV0iKSAgIC0+ICIwMTIzNDU2Nzg5IgogICAgICAgIHNyYW5nZSgiW2Etel0iKSAgIC0+ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIKICAgICAgICBzcmFuZ2UoIlthLXokX10iKSAtPiAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXokXyIKICAgIFRoZSBpbnB1dCBzdHJpbmcgbXVzdCBiZSBlbmNsb3NlZCBpbiBbXSdzLCBhbmQgdGhlIHJldHVybmVkIHN0cmluZyBpcyB0aGUgZXhwYW5kZWQKICAgIGNoYXJhY3RlciBzZXQgam9pbmVkIGludG8gYSBzaW5nbGUgc3RyaW5nLgogICAgVGhlIHZhbHVlcyBlbmNsb3NlZCBpbiB0aGUgW10ncyBtYXkgYmU6CiAgICAgLSBhIHNpbmdsZSBjaGFyYWN0ZXIKICAgICAtIGFuIGVzY2FwZWQgY2hhcmFjdGVyIHdpdGggYSBsZWFkaW5nIGJhY2tzbGFzaCAoc3VjaCBhcyBDe1wtfSBvciBDe1xdfSkKICAgICAtIGFuIGVzY2FwZWQgaGV4IGNoYXJhY3RlciB3aXRoIGEgbGVhZGluZyBDeydceCd9IChDe1x4MjF9LCB3aGljaCBpcyBhIEN7JyEnfSBjaGFyYWN0ZXIpIAogICAgICAgICAoQ3tcMHgjI30gaXMgYWxzbyBzdXBwb3J0ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KSAKICAgICAtIGFuIGVzY2FwZWQgb2N0YWwgY2hhcmFjdGVyIHdpdGggYSBsZWFkaW5nIEN7J1wwJ30gKEN7XDA0MX0sIHdoaWNoIGlzIGEgQ3snISd9IGNoYXJhY3RlcikKICAgICAtIGEgcmFuZ2Ugb2YgYW55IG9mIHRoZSBhYm92ZSwgc2VwYXJhdGVkIGJ5IGEgZGFzaCAoQ3snYS16J30sIGV0Yy4pCiAgICAgLSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGFib3ZlIChDeydhZWlvdXknfSwgQ3snYS16QS1aMC05XyQnfSwgZXRjLikKICAgICIiIgogICAgX2V4cGFuZGVkID0gbGFtYmRhIHA6IHAgaWYgbm90IGlzaW5zdGFuY2UocCxQYXJzZVJlc3VsdHMpIGVsc2UgJycuam9pbih1bmljaHIoYykgZm9yIGMgaW4gcmFuZ2Uob3JkKHBbMF0pLG9yZChwWzFdKSsxKSkKICAgIHRyeToKICAgICAgICByZXR1cm4gIiIuam9pbihfZXhwYW5kZWQocGFydCkgZm9yIHBhcnQgaW4gX3JlQnJhY2tldEV4cHIucGFyc2VTdHJpbmcocykuYm9keSkKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgcmV0dXJuICIiCgpkZWYgbWF0Y2hPbmx5QXRDb2wobik6CiAgICAiIiIKICAgIEhlbHBlciBtZXRob2QgZm9yIGRlZmluaW5nIHBhcnNlIGFjdGlvbnMgdGhhdCByZXF1aXJlIG1hdGNoaW5nIGF0IGEgc3BlY2lmaWMKICAgIGNvbHVtbiBpbiB0aGUgaW5wdXQgdGV4dC4KICAgICIiIgogICAgZGVmIHZlcmlmeUNvbChzdHJnLGxvY24sdG9rcyk6CiAgICAgICAgaWYgY29sKGxvY24sc3RyZykgIT0gbjoKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oc3RyZyxsb2NuLCJtYXRjaGVkIHRva2VuIG5vdCBhdCBjb2x1bW4gJWQiICUgbikKICAgIHJldHVybiB2ZXJpZnlDb2wKCmRlZiByZXBsYWNlV2l0aChyZXBsU3RyKToKICAgICIiIgogICAgSGVscGVyIG1ldGhvZCBmb3IgY29tbW9uIHBhcnNlIGFjdGlvbnMgdGhhdCBzaW1wbHkgcmV0dXJuIGEgbGl0ZXJhbCB2YWx1ZS4gIEVzcGVjaWFsbHkKICAgIHVzZWZ1bCB3aGVuIHVzZWQgd2l0aCBDe0x7dHJhbnNmb3JtU3RyaW5nPFBhcnNlckVsZW1lbnQudHJhbnNmb3JtU3RyaW5nPn0oKX0uCgogICAgRXhhbXBsZTo6CiAgICAgICAgbnVtID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQogICAgICAgIG5hID0gb25lT2YoIk4vQSBOQSIpLnNldFBhcnNlQWN0aW9uKHJlcGxhY2VXaXRoKG1hdGgubmFuKSkKICAgICAgICB0ZXJtID0gbmEgfCBudW0KICAgICAgICAKICAgICAgICBPbmVPck1vcmUodGVybSkucGFyc2VTdHJpbmcoIjMyNCAyMzQgTi9BIDIzNCIpICMgLT4gWzMyNCwgMjM0LCBuYW4sIDIzNF0KICAgICIiIgogICAgcmV0dXJuIGxhbWJkYSBzLGwsdDogW3JlcGxTdHJdCgpkZWYgcmVtb3ZlUXVvdGVzKHMsbCx0KToKICAgICIiIgogICAgSGVscGVyIHBhcnNlIGFjdGlvbiBmb3IgcmVtb3ZpbmcgcXVvdGF0aW9uIG1hcmtzIGZyb20gcGFyc2VkIHF1b3RlZCBzdHJpbmdzLgoKICAgIEV4YW1wbGU6OgogICAgICAgICMgYnkgZGVmYXVsdCwgcXVvdGF0aW9uIG1hcmtzIGFyZSBpbmNsdWRlZCBpbiBwYXJzZWQgcmVzdWx0cwogICAgICAgIHF1b3RlZFN0cmluZy5wYXJzZVN0cmluZygiJ05vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50JyIpICMgLT4gWyInTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQnIl0KCiAgICAgICAgIyB1c2UgcmVtb3ZlUXVvdGVzIHRvIHN0cmlwIHF1b3RhdGlvbiBtYXJrcyBmcm9tIHBhcnNlZCByZXN1bHRzCiAgICAgICAgcXVvdGVkU3RyaW5nLnNldFBhcnNlQWN0aW9uKHJlbW92ZVF1b3RlcykKICAgICAgICBxdW90ZWRTdHJpbmcucGFyc2VTdHJpbmcoIidOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCciKSAjIC0+IFsiTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQiXQogICAgIiIiCiAgICByZXR1cm4gdFswXVsxOi0xXQoKZGVmIHRva2VuTWFwKGZ1bmMsICphcmdzKToKICAgICIiIgogICAgSGVscGVyIHRvIGRlZmluZSBhIHBhcnNlIGFjdGlvbiBieSBtYXBwaW5nIGEgZnVuY3Rpb24gdG8gYWxsIGVsZW1lbnRzIG9mIGEgUGFyc2VSZXN1bHRzIGxpc3QuSWYgYW55IGFkZGl0aW9uYWwgCiAgICBhcmdzIGFyZSBwYXNzZWQsIHRoZXkgYXJlIGZvcndhcmRlZCB0byB0aGUgZ2l2ZW4gZnVuY3Rpb24gYXMgYWRkaXRpb25hbCBhcmd1bWVudHMgYWZ0ZXIKICAgIHRoZSB0b2tlbiwgYXMgaW4gQ3toZXhfaW50ZWdlciA9IFdvcmQoaGV4bnVtcykuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoaW50LCAxNikpfSwgd2hpY2ggd2lsbCBjb252ZXJ0IHRoZQogICAgcGFyc2VkIGRhdGEgdG8gYW4gaW50ZWdlciB1c2luZyBiYXNlIDE2LgoKICAgIEV4YW1wbGUgKGNvbXBhcmUgdGhlIGxhc3QgdG8gZXhhbXBsZSBpbiBMe1BhcnNlckVsZW1lbnQudHJhbnNmb3JtU3RyaW5nfTo6CiAgICAgICAgaGV4X2ludHMgPSBPbmVPck1vcmUoV29yZChoZXhudW1zKSkuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoaW50LCAxNikpCiAgICAgICAgaGV4X2ludHMucnVuVGVzdHMoJycnCiAgICAgICAgICAgIDAwIDExIDIyIGFhIEZGIDBhIDBkIDFhCiAgICAgICAgICAgICcnJykKICAgICAgICAKICAgICAgICB1cHBlcndvcmQgPSBXb3JkKGFscGhhcykuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoc3RyLnVwcGVyKSkKICAgICAgICBPbmVPck1vcmUodXBwZXJ3b3JkKS5ydW5UZXN0cygnJycKICAgICAgICAgICAgbXkga2luZ2RvbSBmb3IgYSBob3JzZQogICAgICAgICAgICAnJycpCgogICAgICAgIHdkID0gV29yZChhbHBoYXMpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHN0ci50aXRsZSkpCiAgICAgICAgT25lT3JNb3JlKHdkKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikucnVuVGVzdHMoJycnCiAgICAgICAgICAgIG5vdyBpcyB0aGUgd2ludGVyIG9mIG91ciBkaXNjb250ZW50IG1hZGUgZ2xvcmlvdXMgc3VtbWVyIGJ5IHRoaXMgc3VuIG9mIHlvcmsKICAgICAgICAgICAgJycnKQogICAgcHJpbnRzOjoKICAgICAgICAwMCAxMSAyMiBhYSBGRiAwYSAwZCAxYQogICAgICAgIFswLCAxNywgMzQsIDE3MCwgMjU1LCAxMCwgMTMsIDI2XQoKICAgICAgICBteSBraW5nZG9tIGZvciBhIGhvcnNlCiAgICAgICAgWydNWScsICdLSU5HRE9NJywgJ0ZPUicsICdBJywgJ0hPUlNFJ10KCiAgICAgICAgbm93IGlzIHRoZSB3aW50ZXIgb2Ygb3VyIGRpc2NvbnRlbnQgbWFkZSBnbG9yaW91cyBzdW1tZXIgYnkgdGhpcyBzdW4gb2YgeW9yawogICAgICAgIFsnTm93IElzIFRoZSBXaW50ZXIgT2YgT3VyIERpc2NvbnRlbnQgTWFkZSBHbG9yaW91cyBTdW1tZXIgQnkgVGhpcyBTdW4gT2YgWW9yayddCiAgICAiIiIKICAgIGRlZiBwYShzLGwsdCk6CiAgICAgICAgcmV0dXJuIFtmdW5jKHRva24sICphcmdzKSBmb3IgdG9rbiBpbiB0XQoKICAgIHRyeToKICAgICAgICBmdW5jX25hbWUgPSBnZXRhdHRyKGZ1bmMsICdfX25hbWVfXycsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihmdW5jLCAnX19jbGFzc19fJykuX19uYW1lX18pCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIGZ1bmNfbmFtZSA9IHN0cihmdW5jKQogICAgcGEuX19uYW1lX18gPSBmdW5jX25hbWUKCiAgICByZXR1cm4gcGEKCnVwY2FzZVRva2VucyA9IHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS51cHBlcigpKQoiIiIoRGVwcmVjYXRlZCkgSGVscGVyIHBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byB1cHBlciBjYXNlLiBEZXByZWNhdGVkIGluIGZhdm9yIG9mIEx7cHlwYXJzaW5nX2NvbW1vbi51cGNhc2VUb2tlbnN9IiIiCgpkb3duY2FzZVRva2VucyA9IHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS5sb3dlcigpKQoiIiIoRGVwcmVjYXRlZCkgSGVscGVyIHBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byBsb3dlciBjYXNlLiBEZXByZWNhdGVkIGluIGZhdm9yIG9mIEx7cHlwYXJzaW5nX2NvbW1vbi5kb3duY2FzZVRva2Vuc30iIiIKICAgIApkZWYgX21ha2VUYWdzKHRhZ1N0ciwgeG1sKToKICAgICIiIkludGVybmFsIGhlbHBlciB0byBjb25zdHJ1Y3Qgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcgZXhwcmVzc2lvbnMsIGdpdmVuIGEgdGFnIG5hbWUiIiIKICAgIGlmIGlzaW5zdGFuY2UodGFnU3RyLGJhc2VzdHJpbmcpOgogICAgICAgIHJlc25hbWUgPSB0YWdTdHIKICAgICAgICB0YWdTdHIgPSBLZXl3b3JkKHRhZ1N0ciwgY2FzZWxlc3M9bm90IHhtbCkKICAgIGVsc2U6CiAgICAgICAgcmVzbmFtZSA9IHRhZ1N0ci5uYW1lCgogICAgdGFnQXR0ck5hbWUgPSBXb3JkKGFscGhhcyxhbHBoYW51bXMrIl8tOiIpCiAgICBpZiAoeG1sKToKICAgICAgICB0YWdBdHRyVmFsdWUgPSBkYmxRdW90ZWRTdHJpbmcuY29weSgpLnNldFBhcnNlQWN0aW9uKCByZW1vdmVRdW90ZXMgKQogICAgICAgIG9wZW5UYWcgPSBTdXBwcmVzcygiPCIpICsgdGFnU3RyKCJ0YWciKSArIFwKICAgICAgICAgICAgICAgIERpY3QoWmVyb09yTW9yZShHcm91cCggdGFnQXR0ck5hbWUgKyBTdXBwcmVzcygiPSIpICsgdGFnQXR0clZhbHVlICkpKSArIFwKICAgICAgICAgICAgICAgIE9wdGlvbmFsKCIvIixkZWZhdWx0PVtGYWxzZV0pLnNldFJlc3VsdHNOYW1lKCJlbXB0eSIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp0WzBdPT0nLycpICsgU3VwcHJlc3MoIj4iKQogICAgZWxzZToKICAgICAgICBwcmludGFibGVzTGVzc1JBYnJhY2sgPSAiIi5qb2luKGMgZm9yIGMgaW4gcHJpbnRhYmxlcyBpZiBjIG5vdCBpbiAiPiIpCiAgICAgICAgdGFnQXR0clZhbHVlID0gcXVvdGVkU3RyaW5nLmNvcHkoKS5zZXRQYXJzZUFjdGlvbiggcmVtb3ZlUXVvdGVzICkgfCBXb3JkKHByaW50YWJsZXNMZXNzUkFicmFjaykKICAgICAgICBvcGVuVGFnID0gU3VwcHJlc3MoIjwiKSArIHRhZ1N0cigidGFnIikgKyBcCiAgICAgICAgICAgICAgICBEaWN0KFplcm9Pck1vcmUoR3JvdXAoIHRhZ0F0dHJOYW1lLnNldFBhcnNlQWN0aW9uKGRvd25jYXNlVG9rZW5zKSArIFwKICAgICAgICAgICAgICAgIE9wdGlvbmFsKCBTdXBwcmVzcygiPSIpICsgdGFnQXR0clZhbHVlICkgKSkpICsgXAogICAgICAgICAgICAgICAgT3B0aW9uYWwoIi8iLGRlZmF1bHQ9W0ZhbHNlXSkuc2V0UmVzdWx0c05hbWUoImVtcHR5Iikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnRbMF09PScvJykgKyBTdXBwcmVzcygiPiIpCiAgICBjbG9zZVRhZyA9IENvbWJpbmUoX0woIjwvIikgKyB0YWdTdHIgKyAiPiIpCgogICAgb3BlblRhZyA9IG9wZW5UYWcuc2V0UmVzdWx0c05hbWUoInN0YXJ0IisiIi5qb2luKHJlc25hbWUucmVwbGFjZSgiOiIsIiAiKS50aXRsZSgpLnNwbGl0KCkpKS5zZXROYW1lKCI8JXM+IiAlIHJlc25hbWUpCiAgICBjbG9zZVRhZyA9IGNsb3NlVGFnLnNldFJlc3VsdHNOYW1lKCJlbmQiKyIiLmpvaW4ocmVzbmFtZS5yZXBsYWNlKCI6IiwiICIpLnRpdGxlKCkuc3BsaXQoKSkpLnNldE5hbWUoIjwvJXM+IiAlIHJlc25hbWUpCiAgICBvcGVuVGFnLnRhZyA9IHJlc25hbWUKICAgIGNsb3NlVGFnLnRhZyA9IHJlc25hbWUKICAgIHJldHVybiBvcGVuVGFnLCBjbG9zZVRhZwoKZGVmIG1ha2VIVE1MVGFncyh0YWdTdHIpOgogICAgIiIiCiAgICBIZWxwZXIgdG8gY29uc3RydWN0IG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFnIGV4cHJlc3Npb25zIGZvciBIVE1MLCBnaXZlbiBhIHRhZyBuYW1lLiBNYXRjaGVzCiAgICB0YWdzIGluIGVpdGhlciB1cHBlciBvciBsb3dlciBjYXNlLCBhdHRyaWJ1dGVzIHdpdGggbmFtZXNwYWNlcyBhbmQgd2l0aCBxdW90ZWQgb3IgdW5xdW90ZWQgdmFsdWVzLgoKICAgIEV4YW1wbGU6OgogICAgICAgIHRleHQgPSAnPHRkPk1vcmUgaW5mbyBhdCB0aGUgPGEgaHJlZj0iaHR0cDovL3B5cGFyc2luZy53aWtpc3BhY2VzLmNvbSI+cHlwYXJzaW5nPC9hPiB3aWtpIHBhZ2U8L3RkPicKICAgICAgICAjIG1ha2VIVE1MVGFncyByZXR1cm5zIHB5cGFyc2luZyBleHByZXNzaW9ucyBmb3IgdGhlIG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFncyBhcyBhIDItdHVwbGUKICAgICAgICBhLGFfZW5kID0gbWFrZUhUTUxUYWdzKCJBIikKICAgICAgICBsaW5rX2V4cHIgPSBhICsgU2tpcFRvKGFfZW5kKSgibGlua190ZXh0IikgKyBhX2VuZAogICAgICAgIAogICAgICAgIGZvciBsaW5rIGluIGxpbmtfZXhwci5zZWFyY2hTdHJpbmcodGV4dCk6CiAgICAgICAgICAgICMgYXR0cmlidXRlcyBpbiB0aGUgPEE+IHRhZyAobGlrZSAiaHJlZiIgc2hvd24gaGVyZSkgYXJlIGFsc28gYWNjZXNzaWJsZSBhcyBuYW1lZCByZXN1bHRzCiAgICAgICAgICAgIHByaW50KGxpbmsubGlua190ZXh0LCAnLT4nLCBsaW5rLmhyZWYpCiAgICBwcmludHM6OgogICAgICAgIHB5cGFyc2luZyAtPiBodHRwOi8vcHlwYXJzaW5nLndpa2lzcGFjZXMuY29tCiAgICAiIiIKICAgIHJldHVybiBfbWFrZVRhZ3MoIHRhZ1N0ciwgRmFsc2UgKQoKZGVmIG1ha2VYTUxUYWdzKHRhZ1N0cik6CiAgICAiIiIKICAgIEhlbHBlciB0byBjb25zdHJ1Y3Qgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcgZXhwcmVzc2lvbnMgZm9yIFhNTCwgZ2l2ZW4gYSB0YWcgbmFtZS4gTWF0Y2hlcwogICAgdGFncyBvbmx5IGluIHRoZSBnaXZlbiB1cHBlci9sb3dlciBjYXNlLgoKICAgIEV4YW1wbGU6IHNpbWlsYXIgdG8gTHttYWtlSFRNTFRhZ3N9CiAgICAiIiIKICAgIHJldHVybiBfbWFrZVRhZ3MoIHRhZ1N0ciwgVHJ1ZSApCgpkZWYgd2l0aEF0dHJpYnV0ZSgqYXJncywqKmF0dHJEaWN0KToKICAgICIiIgogICAgSGVscGVyIHRvIGNyZWF0ZSBhIHZhbGlkYXRpbmcgcGFyc2UgYWN0aW9uIHRvIGJlIHVzZWQgd2l0aCBzdGFydCB0YWdzIGNyZWF0ZWQKICAgIHdpdGggQ3tMe21ha2VYTUxUYWdzfX0gb3IgQ3tMe21ha2VIVE1MVGFnc319LiBVc2UgQ3t3aXRoQXR0cmlidXRlfSB0byBxdWFsaWZ5IGEgc3RhcnRpbmcgdGFnCiAgICB3aXRoIGEgcmVxdWlyZWQgYXR0cmlidXRlIHZhbHVlLCB0byBhdm9pZCBmYWxzZSBtYXRjaGVzIG9uIGNvbW1vbiB0YWdzIHN1Y2ggYXMKICAgIEN7PFREPn0gb3IgQ3s8RElWPn0uCgogICAgQ2FsbCBDe3dpdGhBdHRyaWJ1dGV9IHdpdGggYSBzZXJpZXMgb2YgYXR0cmlidXRlIG5hbWVzIGFuZCB2YWx1ZXMuIFNwZWNpZnkgdGhlIGxpc3QKICAgIG9mIGZpbHRlciBhdHRyaWJ1dGVzIG5hbWVzIGFuZCB2YWx1ZXMgYXM6CiAgICAgLSBrZXl3b3JkIGFyZ3VtZW50cywgYXMgaW4gQ3soYWxpZ249InJpZ2h0Iil9LCBvcgogICAgIC0gYXMgYW4gZXhwbGljaXQgZGljdCB3aXRoIEN7Kip9IG9wZXJhdG9yLCB3aGVuIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIGFsc28gYSBQeXRob24KICAgICAgICAgIHJlc2VydmVkIHdvcmQsIGFzIGluIEN7Kip7ImNsYXNzIjoiQ3VzdG9tZXIiLCAiYWxpZ24iOiJyaWdodCJ9fQogICAgIC0gYSBsaXN0IG9mIG5hbWUtdmFsdWUgdHVwbGVzLCBhcyBpbiAoICgibnMxOmNsYXNzIiwgIkN1c3RvbWVyIiksICgibnMyOmFsaWduIiwicmlnaHQiKSApCiAgICBGb3IgYXR0cmlidXRlIG5hbWVzIHdpdGggYSBuYW1lc3BhY2UgcHJlZml4LCB5b3UgbXVzdCB1c2UgdGhlIHNlY29uZCBmb3JtLiAgQXR0cmlidXRlCiAgICBuYW1lcyBhcmUgbWF0Y2hlZCBpbnNlbnNpdGl2ZSB0byB1cHBlci9sb3dlciBjYXNlLgogICAgICAgCiAgICBJZiBqdXN0IHRlc3RpbmcgZm9yIEN7Y2xhc3N9ICh3aXRoIG9yIHdpdGhvdXQgYSBuYW1lc3BhY2UpLCB1c2UgQ3tMe3dpdGhDbGFzc319LgoKICAgIFRvIHZlcmlmeSB0aGF0IHRoZSBhdHRyaWJ1dGUgZXhpc3RzLCBidXQgd2l0aG91dCBzcGVjaWZ5aW5nIGEgdmFsdWUsIHBhc3MKICAgIEN7d2l0aEF0dHJpYnV0ZS5BTllfVkFMVUV9IGFzIHRoZSB2YWx1ZS4KCiAgICBFeGFtcGxlOjoKICAgICAgICBodG1sID0gJycnCiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIFNvbWUgdGV4dAogICAgICAgICAgICA8ZGl2IHR5cGU9ImdyaWQiPjEgNCAwIDEgMDwvZGl2PgogICAgICAgICAgICA8ZGl2IHR5cGU9ImdyYXBoIj4xLDMgMiwzIDEsMTwvZGl2PgogICAgICAgICAgICA8ZGl2PnRoaXMgaGFzIG5vIHR5cGU8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAKICAgICAgICAnJycKICAgICAgICBkaXYsZGl2X2VuZCA9IG1ha2VIVE1MVGFncygiZGl2IikKCiAgICAgICAgIyBvbmx5IG1hdGNoIGRpdiB0YWcgaGF2aW5nIGEgdHlwZSBhdHRyaWJ1dGUgd2l0aCB2YWx1ZSAiZ3JpZCIKICAgICAgICBkaXZfZ3JpZCA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhBdHRyaWJ1dGUodHlwZT0iZ3JpZCIpKQogICAgICAgIGdyaWRfZXhwciA9IGRpdl9ncmlkICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikKICAgICAgICBmb3IgZ3JpZF9oZWFkZXIgaW4gZ3JpZF9leHByLnNlYXJjaFN0cmluZyhodG1sKToKICAgICAgICAgICAgcHJpbnQoZ3JpZF9oZWFkZXIuYm9keSkKICAgICAgICAKICAgICAgICAjIGNvbnN0cnVjdCBhIG1hdGNoIHdpdGggYW55IGRpdiB0YWcgaGF2aW5nIGEgdHlwZSBhdHRyaWJ1dGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlCiAgICAgICAgZGl2X2FueV90eXBlID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aEF0dHJpYnV0ZSh0eXBlPXdpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFKSkKICAgICAgICBkaXZfZXhwciA9IGRpdl9hbnlfdHlwZSArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpCiAgICAgICAgZm9yIGRpdl9oZWFkZXIgaW4gZGl2X2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOgogICAgICAgICAgICBwcmludChkaXZfaGVhZGVyLmJvZHkpCiAgICBwcmludHM6OgogICAgICAgIDEgNCAwIDEgMAoKICAgICAgICAxIDQgMCAxIDAKICAgICAgICAxLDMgMiwzIDEsMQogICAgIiIiCiAgICBpZiBhcmdzOgogICAgICAgIGF0dHJzID0gYXJnc1s6XQogICAgZWxzZToKICAgICAgICBhdHRycyA9IGF0dHJEaWN0Lml0ZW1zKCkKICAgIGF0dHJzID0gWyhrLHYpIGZvciBrLHYgaW4gYXR0cnNdCiAgICBkZWYgcGEocyxsLHRva2Vucyk6CiAgICAgICAgZm9yIGF0dHJOYW1lLGF0dHJWYWx1ZSBpbiBhdHRyczoKICAgICAgICAgICAgaWYgYXR0ck5hbWUgbm90IGluIHRva2VuczoKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm8gbWF0Y2hpbmcgYXR0cmlidXRlICIgKyBhdHRyTmFtZSkKICAgICAgICAgICAgaWYgYXR0clZhbHVlICE9IHdpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFIGFuZCB0b2tlbnNbYXR0ck5hbWVdICE9IGF0dHJWYWx1ZToKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwiYXR0cmlidXRlICclcycgaGFzIHZhbHVlICclcycsIG11c3QgYmUgJyVzJyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdHRyTmFtZSwgdG9rZW5zW2F0dHJOYW1lXSwgYXR0clZhbHVlKSkKICAgIHJldHVybiBwYQp3aXRoQXR0cmlidXRlLkFOWV9WQUxVRSA9IG9iamVjdCgpCgpkZWYgd2l0aENsYXNzKGNsYXNzbmFtZSwgbmFtZXNwYWNlPScnKToKICAgICIiIgogICAgU2ltcGxpZmllZCB2ZXJzaW9uIG9mIEN7THt3aXRoQXR0cmlidXRlfX0gd2hlbiBtYXRjaGluZyBvbiBhIGRpdiBjbGFzcyAtIG1hZGUKICAgIGRpZmZpY3VsdCBiZWNhdXNlIEN7Y2xhc3N9IGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBQeXRob24uCgogICAgRXhhbXBsZTo6CiAgICAgICAgaHRtbCA9ICcnJwogICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICBTb21lIHRleHQKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JpZCI+MSA0IDAgMSAwPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdyYXBoIj4xLDMgMiwzIDEsMTwvZGl2PgogICAgICAgICAgICA8ZGl2PnRoaXMgJmx0O2RpdiZndDsgaGFzIG5vIGNsYXNzPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgCiAgICAgICAgJycnCiAgICAgICAgZGl2LGRpdl9lbmQgPSBtYWtlSFRNTFRhZ3MoImRpdiIpCiAgICAgICAgZGl2X2dyaWQgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQ2xhc3MoImdyaWQiKSkKICAgICAgICAKICAgICAgICBncmlkX2V4cHIgPSBkaXZfZ3JpZCArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpCiAgICAgICAgZm9yIGdyaWRfaGVhZGVyIGluIGdyaWRfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6CiAgICAgICAgICAgIHByaW50KGdyaWRfaGVhZGVyLmJvZHkpCiAgICAgICAgCiAgICAgICAgZGl2X2FueV90eXBlID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aENsYXNzKHdpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFKSkKICAgICAgICBkaXZfZXhwciA9IGRpdl9hbnlfdHlwZSArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpCiAgICAgICAgZm9yIGRpdl9oZWFkZXIgaW4gZGl2X2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOgogICAgICAgICAgICBwcmludChkaXZfaGVhZGVyLmJvZHkpCiAgICBwcmludHM6OgogICAgICAgIDEgNCAwIDEgMAoKICAgICAgICAxIDQgMCAxIDAKICAgICAgICAxLDMgMiwzIDEsMQogICAgIiIiCiAgICBjbGFzc2F0dHIgPSAiJXM6Y2xhc3MiICUgbmFtZXNwYWNlIGlmIG5hbWVzcGFjZSBlbHNlICJjbGFzcyIKICAgIHJldHVybiB3aXRoQXR0cmlidXRlKCoqe2NsYXNzYXR0ciA6IGNsYXNzbmFtZX0pICAgICAgICAKCm9wQXNzb2MgPSBfQ29uc3RhbnRzKCkKb3BBc3NvYy5MRUZUID0gb2JqZWN0KCkKb3BBc3NvYy5SSUdIVCA9IG9iamVjdCgpCgpkZWYgaW5maXhOb3RhdGlvbiggYmFzZUV4cHIsIG9wTGlzdCwgbHBhcj1TdXBwcmVzcygnKCcpLCBycGFyPVN1cHByZXNzKCcpJykgKToKICAgICIiIgogICAgSGVscGVyIG1ldGhvZCBmb3IgY29uc3RydWN0aW5nIGdyYW1tYXJzIG9mIGV4cHJlc3Npb25zIG1hZGUgdXAgb2YKICAgIG9wZXJhdG9ycyB3b3JraW5nIGluIGEgcHJlY2VkZW5jZSBoaWVyYXJjaHkuICBPcGVyYXRvcnMgbWF5IGJlIHVuYXJ5IG9yCiAgICBiaW5hcnksIGxlZnQtIG9yIHJpZ2h0LWFzc29jaWF0aXZlLiAgUGFyc2UgYWN0aW9ucyBjYW4gYWxzbyBiZSBhdHRhY2hlZAogICAgdG8gb3BlcmF0b3IgZXhwcmVzc2lvbnMuIFRoZSBnZW5lcmF0ZWQgcGFyc2VyIHdpbGwgYWxzbyByZWNvZ25pemUgdGhlIHVzZSAKICAgIG9mIHBhcmVudGhlc2VzIHRvIG92ZXJyaWRlIG9wZXJhdG9yIHByZWNlZGVuY2VzIChzZWUgZXhhbXBsZSBiZWxvdykuCiAgICAKICAgIE5vdGU6IGlmIHlvdSBkZWZpbmUgYSBkZWVwIG9wZXJhdG9yIGxpc3QsIHlvdSBtYXkgc2VlIHBlcmZvcm1hbmNlIGlzc3VlcwogICAgd2hlbiB1c2luZyBpbmZpeE5vdGF0aW9uLiBTZWUgTHtQYXJzZXJFbGVtZW50LmVuYWJsZVBhY2tyYXR9IGZvciBhCiAgICBtZWNoYW5pc20gdG8gcG90ZW50aWFsbHkgaW1wcm92ZSB5b3VyIHBhcnNlciBwZXJmb3JtYW5jZS4KCiAgICBQYXJhbWV0ZXJzOgogICAgIC0gYmFzZUV4cHIgLSBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgbW9zdCBiYXNpYyBlbGVtZW50IGZvciB0aGUgbmVzdGVkCiAgICAgLSBvcExpc3QgLSBsaXN0IG9mIHR1cGxlcywgb25lIGZvciBlYWNoIG9wZXJhdG9yIHByZWNlZGVuY2UgbGV2ZWwgaW4gdGhlCiAgICAgIGV4cHJlc3Npb24gZ3JhbW1hcjsgZWFjaCB0dXBsZSBpcyBvZiB0aGUgZm9ybQogICAgICAob3BFeHByLCBudW1UZXJtcywgcmlnaHRMZWZ0QXNzb2MsIHBhcnNlQWN0aW9uKSwgd2hlcmU6CiAgICAgICAtIG9wRXhwciBpcyB0aGUgcHlwYXJzaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBvcGVyYXRvcjsKICAgICAgICAgIG1heSBhbHNvIGJlIGEgc3RyaW5nLCB3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIExpdGVyYWw7CiAgICAgICAgICBpZiBudW1UZXJtcyBpcyAzLCBvcEV4cHIgaXMgYSB0dXBsZSBvZiB0d28gZXhwcmVzc2lvbnMsIGZvciB0aGUKICAgICAgICAgIHR3byBvcGVyYXRvcnMgc2VwYXJhdGluZyB0aGUgMyB0ZXJtcwogICAgICAgLSBudW1UZXJtcyBpcyB0aGUgbnVtYmVyIG9mIHRlcm1zIGZvciB0aGlzIG9wZXJhdG9yIChtdXN0CiAgICAgICAgICBiZSAxLCAyLCBvciAzKQogICAgICAgLSByaWdodExlZnRBc3NvYyBpcyB0aGUgaW5kaWNhdG9yIHdoZXRoZXIgdGhlIG9wZXJhdG9yIGlzCiAgICAgICAgICByaWdodCBvciBsZWZ0IGFzc29jaWF0aXZlLCB1c2luZyB0aGUgcHlwYXJzaW5nLWRlZmluZWQKICAgICAgICAgIGNvbnN0YW50cyBDe29wQXNzb2MuUklHSFR9IGFuZCBDe29wQXNzb2MuTEVGVH0uCiAgICAgICAtIHBhcnNlQWN0aW9uIGlzIHRoZSBwYXJzZSBhY3Rpb24gdG8gYmUgYXNzb2NpYXRlZCB3aXRoCiAgICAgICAgICBleHByZXNzaW9ucyBtYXRjaGluZyB0aGlzIG9wZXJhdG9yIGV4cHJlc3Npb24gKHRoZQogICAgICAgICAgcGFyc2UgYWN0aW9uIHR1cGxlIG1lbWJlciBtYXkgYmUgb21pdHRlZCkKICAgICAtIGxwYXIgLSBleHByZXNzaW9uIGZvciBtYXRjaGluZyBsZWZ0LXBhcmVudGhlc2VzIChkZWZhdWx0PUN7U3VwcHJlc3MoJygnKX0pCiAgICAgLSBycGFyIC0gZXhwcmVzc2lvbiBmb3IgbWF0Y2hpbmcgcmlnaHQtcGFyZW50aGVzZXMgKGRlZmF1bHQ9Q3tTdXBwcmVzcygnKScpfSkKCiAgICBFeGFtcGxlOjoKICAgICAgICAjIHNpbXBsZSBleGFtcGxlIG9mIGZvdXItZnVuY3Rpb24gYXJpdGhtZXRpYyB3aXRoIGludHMgYW5kIHZhcmlhYmxlIG5hbWVzCiAgICAgICAgaW50ZWdlciA9IHB5cGFyc2luZ19jb21tb24uc2lnbmVkX2ludGVnZXIKICAgICAgICB2YXJuYW1lID0gcHlwYXJzaW5nX2NvbW1vbi5pZGVudGlmaWVyIAogICAgICAgIAogICAgICAgIGFyaXRoX2V4cHIgPSBpbmZpeE5vdGF0aW9uKGludGVnZXIgfCB2YXJuYW1lLAogICAgICAgICAgICBbCiAgICAgICAgICAgICgnLScsIDEsIG9wQXNzb2MuUklHSFQpLAogICAgICAgICAgICAob25lT2YoJyogLycpLCAyLCBvcEFzc29jLkxFRlQpLAogICAgICAgICAgICAob25lT2YoJysgLScpLCAyLCBvcEFzc29jLkxFRlQpLAogICAgICAgICAgICBdKQogICAgICAgIAogICAgICAgIGFyaXRoX2V4cHIucnVuVGVzdHMoJycnCiAgICAgICAgICAgIDUrMyo2CiAgICAgICAgICAgICg1KzMpKjYKICAgICAgICAgICAgLTItLTExCiAgICAgICAgICAgICcnJywgZnVsbER1bXA9RmFsc2UpCiAgICBwcmludHM6OgogICAgICAgIDUrMyo2CiAgICAgICAgW1s1LCAnKycsIFszLCAnKicsIDZdXV0KCiAgICAgICAgKDUrMykqNgogICAgICAgIFtbWzUsICcrJywgM10sICcqJywgNl1dCgogICAgICAgIC0yLS0xMQogICAgICAgIFtbWyctJywgMl0sICctJywgWyctJywgMTFdXV0KICAgICIiIgogICAgcmV0ID0gRm9yd2FyZCgpCiAgICBsYXN0RXhwciA9IGJhc2VFeHByIHwgKCBscGFyICsgcmV0ICsgcnBhciApCiAgICBmb3IgaSxvcGVyRGVmIGluIGVudW1lcmF0ZShvcExpc3QpOgogICAgICAgIG9wRXhwcixhcml0eSxyaWdodExlZnRBc3NvYyxwYSA9IChvcGVyRGVmICsgKE5vbmUsKSlbOjRdCiAgICAgICAgdGVybU5hbWUgPSAiJXMgdGVybSIgJSBvcEV4cHIgaWYgYXJpdHkgPCAzIGVsc2UgIiVzJXMgdGVybSIgJSBvcEV4cHIKICAgICAgICBpZiBhcml0eSA9PSAzOgogICAgICAgICAgICBpZiBvcEV4cHIgaXMgTm9uZSBvciBsZW4ob3BFeHByKSAhPSAyOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaWYgbnVtdGVybXM9Mywgb3BFeHByIG11c3QgYmUgYSB0dXBsZSBvciBsaXN0IG9mIHR3byBleHByZXNzaW9ucyIpCiAgICAgICAgICAgIG9wRXhwcjEsIG9wRXhwcjIgPSBvcEV4cHIKICAgICAgICB0aGlzRXhwciA9IEZvcndhcmQoKS5zZXROYW1lKHRlcm1OYW1lKQogICAgICAgIGlmIHJpZ2h0TGVmdEFzc29jID09IG9wQXNzb2MuTEVGVDoKICAgICAgICAgICAgaWYgYXJpdHkgPT0gMToKICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCBvcEV4cHIgKSApCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMjoKICAgICAgICAgICAgICAgIGlmIG9wRXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByICsgbGFzdEV4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCBvcEV4cHIgKyBsYXN0RXhwciApICkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwcitsYXN0RXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUobGFzdEV4cHIpICkKICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAzOgogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwcjEgKyBsYXN0RXhwciArIG9wRXhwcjIgKyBsYXN0RXhwcikgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCggbGFzdEV4cHIgKyBvcEV4cHIxICsgbGFzdEV4cHIgKyBvcEV4cHIyICsgbGFzdEV4cHIgKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlcmF0b3IgbXVzdCBiZSB1bmFyeSAoMSksIGJpbmFyeSAoMiksIG9yIHRlcm5hcnkgKDMpIikKICAgICAgICBlbGlmIHJpZ2h0TGVmdEFzc29jID09IG9wQXNzb2MuUklHSFQ6CiAgICAgICAgICAgIGlmIGFyaXR5ID09IDE6CiAgICAgICAgICAgICAgICAjIHRyeSB0byBhdm9pZCBMUiB3aXRoIHRoaXMgZXh0cmEgdGVzdAogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3BFeHByLCBPcHRpb25hbCk6CiAgICAgICAgICAgICAgICAgICAgb3BFeHByID0gT3B0aW9uYWwob3BFeHByKQogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShvcEV4cHIuZXhwciArIHRoaXNFeHByKSArIEdyb3VwKCBvcEV4cHIgKyB0aGlzRXhwciApCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMjoKICAgICAgICAgICAgICAgIGlmIG9wRXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByICsgdGhpc0V4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCBvcEV4cHIgKyB0aGlzRXhwciApICkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIHRoaXNFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZSggdGhpc0V4cHIgKSApCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMzoKICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIxICsgdGhpc0V4cHIgKyBvcEV4cHIyICsgdGhpc0V4cHIpICsgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAoIGxhc3RFeHByICsgb3BFeHByMSArIHRoaXNFeHByICsgb3BFeHByMiArIHRoaXNFeHByICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZXJhdG9yIG11c3QgYmUgdW5hcnkgKDEpLCBiaW5hcnkgKDIpLCBvciB0ZXJuYXJ5ICgzKSIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlcmF0b3IgbXVzdCBpbmRpY2F0ZSByaWdodCBvciBsZWZ0IGFzc29jaWF0aXZpdHkiKQogICAgICAgIGlmIHBhOgogICAgICAgICAgICBtYXRjaEV4cHIuc2V0UGFyc2VBY3Rpb24oIHBhICkKICAgICAgICB0aGlzRXhwciA8PD0gKCBtYXRjaEV4cHIuc2V0TmFtZSh0ZXJtTmFtZSkgfCBsYXN0RXhwciApCiAgICAgICAgbGFzdEV4cHIgPSB0aGlzRXhwcgogICAgcmV0IDw8PSBsYXN0RXhwcgogICAgcmV0dXJuIHJldAoKb3BlcmF0b3JQcmVjZWRlbmNlID0gaW5maXhOb3RhdGlvbgoiIiIoRGVwcmVjYXRlZCkgRm9ybWVyIG5hbWUgb2YgQ3tMe2luZml4Tm90YXRpb259fSwgd2lsbCBiZSBkcm9wcGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuIiIiCgpkYmxRdW90ZWRTdHJpbmcgPSBDb21iaW5lKFJlZ2V4KHInIig/OlteIlxuXHJcXF18KD86IiIpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKicpKyciJykuc2V0TmFtZSgic3RyaW5nIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMiKQpzZ2xRdW90ZWRTdHJpbmcgPSBDb21iaW5lKFJlZ2V4KHIiJyg/OlteJ1xuXHJcXF18KD86JycpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKiIpKyInIikuc2V0TmFtZSgic3RyaW5nIGVuY2xvc2VkIGluIHNpbmdsZSBxdW90ZXMiKQpxdW90ZWRTdHJpbmcgPSBDb21iaW5lKFJlZ2V4KHInIig/OlteIlxuXHJcXF18KD86IiIpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKicpKyciJ3wKICAgICAgICAgICAgICAgICAgICAgICBSZWdleChyIicoPzpbXidcblxyXFxdfCg/OicnKXwoPzpcXCg/OlteeF18eFswLTlhLWZBLUZdKykpKSoiKSsiJyIpLnNldE5hbWUoInF1b3RlZFN0cmluZyB1c2luZyBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcyIpCnVuaWNvZGVTdHJpbmcgPSBDb21iaW5lKF9MKCd1JykgKyBxdW90ZWRTdHJpbmcuY29weSgpKS5zZXROYW1lKCJ1bmljb2RlIHN0cmluZyBsaXRlcmFsIikKCmRlZiBuZXN0ZWRFeHByKG9wZW5lcj0iKCIsIGNsb3Nlcj0iKSIsIGNvbnRlbnQ9Tm9uZSwgaWdub3JlRXhwcj1xdW90ZWRTdHJpbmcuY29weSgpKToKICAgICIiIgogICAgSGVscGVyIG1ldGhvZCBmb3IgZGVmaW5pbmcgbmVzdGVkIGxpc3RzIGVuY2xvc2VkIGluIG9wZW5pbmcgYW5kIGNsb3NpbmcKICAgIGRlbGltaXRlcnMgKCIoIiBhbmQgIikiIGFyZSB0aGUgZGVmYXVsdCkuCgogICAgUGFyYW1ldGVyczoKICAgICAtIG9wZW5lciAtIG9wZW5pbmcgY2hhcmFjdGVyIGZvciBhIG5lc3RlZCBsaXN0IChkZWZhdWx0PUN7IigifSk7IGNhbiBhbHNvIGJlIGEgcHlwYXJzaW5nIGV4cHJlc3Npb24KICAgICAtIGNsb3NlciAtIGNsb3NpbmcgY2hhcmFjdGVyIGZvciBhIG5lc3RlZCBsaXN0IChkZWZhdWx0PUN7IikifSk7IGNhbiBhbHNvIGJlIGEgcHlwYXJzaW5nIGV4cHJlc3Npb24KICAgICAtIGNvbnRlbnQgLSBleHByZXNzaW9uIGZvciBpdGVtcyB3aXRoaW4gdGhlIG5lc3RlZCBsaXN0cyAoZGVmYXVsdD1De05vbmV9KQogICAgIC0gaWdub3JlRXhwciAtIGV4cHJlc3Npb24gZm9yIGlnbm9yaW5nIG9wZW5pbmcgYW5kIGNsb3NpbmcgZGVsaW1pdGVycyAoZGVmYXVsdD1De3F1b3RlZFN0cmluZ30pCgogICAgSWYgYW4gZXhwcmVzc2lvbiBpcyBub3QgcHJvdmlkZWQgZm9yIHRoZSBjb250ZW50IGFyZ3VtZW50LCB0aGUgbmVzdGVkCiAgICBleHByZXNzaW9uIHdpbGwgY2FwdHVyZSBhbGwgd2hpdGVzcGFjZS1kZWxpbWl0ZWQgY29udGVudCBiZXR3ZWVuIGRlbGltaXRlcnMKICAgIGFzIGEgbGlzdCBvZiBzZXBhcmF0ZSB2YWx1ZXMuCgogICAgVXNlIHRoZSBDe2lnbm9yZUV4cHJ9IGFyZ3VtZW50IHRvIGRlZmluZSBleHByZXNzaW9ucyB0aGF0IG1heSBjb250YWluCiAgICBvcGVuaW5nIG9yIGNsb3NpbmcgY2hhcmFjdGVycyB0aGF0IHNob3VsZCBub3QgYmUgdHJlYXRlZCBhcyBvcGVuaW5nCiAgICBvciBjbG9zaW5nIGNoYXJhY3RlcnMgZm9yIG5lc3RpbmcsIHN1Y2ggYXMgcXVvdGVkU3RyaW5nIG9yIGEgY29tbWVudAogICAgZXhwcmVzc2lvbi4gIFNwZWNpZnkgbXVsdGlwbGUgZXhwcmVzc2lvbnMgdXNpbmcgYW4gQ3tMe09yfX0gb3IgQ3tMe01hdGNoRmlyc3R9fS4KICAgIFRoZSBkZWZhdWx0IGlzIEx7cXVvdGVkU3RyaW5nfSwgYnV0IGlmIG5vIGV4cHJlc3Npb25zIGFyZSB0byBiZSBpZ25vcmVkLAogICAgdGhlbiBwYXNzIEN7Tm9uZX0gZm9yIHRoaXMgYXJndW1lbnQuCgogICAgRXhhbXBsZTo6CiAgICAgICAgZGF0YV90eXBlID0gb25lT2YoInZvaWQgaW50IHNob3J0IGxvbmcgY2hhciBmbG9hdCBkb3VibGUiKQogICAgICAgIGRlY2xfZGF0YV90eXBlID0gQ29tYmluZShkYXRhX3R5cGUgKyBPcHRpb25hbChXb3JkKCcqJykpKQogICAgICAgIGlkZW50ID0gV29yZChhbHBoYXMrJ18nLCBhbHBoYW51bXMrJ18nKQogICAgICAgIG51bWJlciA9IHB5cGFyc2luZ19jb21tb24ubnVtYmVyCiAgICAgICAgYXJnID0gR3JvdXAoZGVjbF9kYXRhX3R5cGUgKyBpZGVudCkKICAgICAgICBMUEFSLFJQQVIgPSBtYXAoU3VwcHJlc3MsICIoKSIpCgogICAgICAgIGNvZGVfYm9keSA9IG5lc3RlZEV4cHIoJ3snLCAnfScsIGlnbm9yZUV4cHI9KHF1b3RlZFN0cmluZyB8IGNTdHlsZUNvbW1lbnQpKQoKICAgICAgICBjX2Z1bmN0aW9uID0gKGRlY2xfZGF0YV90eXBlKCJ0eXBlIikgCiAgICAgICAgICAgICAgICAgICAgICArIGlkZW50KCJuYW1lIikKICAgICAgICAgICAgICAgICAgICAgICsgTFBBUiArIE9wdGlvbmFsKGRlbGltaXRlZExpc3QoYXJnKSwgW10pKCJhcmdzIikgKyBSUEFSIAogICAgICAgICAgICAgICAgICAgICAgKyBjb2RlX2JvZHkoImJvZHkiKSkKICAgICAgICBjX2Z1bmN0aW9uLmlnbm9yZShjU3R5bGVDb21tZW50KQogICAgICAgIAogICAgICAgIHNvdXJjZV9jb2RlID0gJycnCiAgICAgICAgICAgIGludCBpc19vZGQoaW50IHgpIHsgCiAgICAgICAgICAgICAgICByZXR1cm4gKHglMik7IAogICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaW50IGRlY190b19oZXgoY2hhciBoY2hhcikgeyAKICAgICAgICAgICAgICAgIGlmIChoY2hhciA+PSAnMCcgJiYgaGNoYXIgPD0gJzknKSB7IAogICAgICAgICAgICAgICAgICAgIHJldHVybiAob3JkKGhjaGFyKS1vcmQoJzAnKSk7IAogICAgICAgICAgICAgICAgfSBlbHNlIHsgCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgxMCtvcmQoaGNoYXIpLW9yZCgnQScpKTsKICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgIH0KICAgICAgICAnJycKICAgICAgICBmb3IgZnVuYyBpbiBjX2Z1bmN0aW9uLnNlYXJjaFN0cmluZyhzb3VyY2VfY29kZSk6CiAgICAgICAgICAgIHByaW50KCIlKG5hbWUpcyAoJSh0eXBlKXMpIGFyZ3M6ICUoYXJncylzIiAlIGZ1bmMpCgogICAgcHJpbnRzOjoKICAgICAgICBpc19vZGQgKGludCkgYXJnczogW1snaW50JywgJ3gnXV0KICAgICAgICBkZWNfdG9faGV4IChpbnQpIGFyZ3M6IFtbJ2NoYXInLCAnaGNoYXInXV0KICAgICIiIgogICAgaWYgb3BlbmVyID09IGNsb3NlcjoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVuaW5nIGFuZCBjbG9zaW5nIHN0cmluZ3MgY2Fubm90IGJlIHRoZSBzYW1lIikKICAgIGlmIGNvbnRlbnQgaXMgTm9uZToKICAgICAgICBpZiBpc2luc3RhbmNlKG9wZW5lcixiYXNlc3RyaW5nKSBhbmQgaXNpbnN0YW5jZShjbG9zZXIsYmFzZXN0cmluZyk6CiAgICAgICAgICAgIGlmIGxlbihvcGVuZXIpID09IDEgYW5kIGxlbihjbG9zZXIpPT0xOgogICAgICAgICAgICAgICAgaWYgaWdub3JlRXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gKENvbWJpbmUoT25lT3JNb3JlKH5pZ25vcmVFeHByICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNOb3RJbihvcGVuZXIrY2xvc2VyK1BhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyxleGFjdD0xKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoZW1wdHkuY29weSgpK0NoYXJzTm90SW4ob3BlbmVyK2Nsb3NlcitQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBpZ25vcmVFeHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoQ29tYmluZShPbmVPck1vcmUofmlnbm9yZUV4cHIgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkxpdGVyYWwob3BlbmVyKSArIH5MaXRlcmFsKGNsb3NlcikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc05vdEluKFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyxleGFjdD0xKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoQ29tYmluZShPbmVPck1vcmUofkxpdGVyYWwob3BlbmVyKSArIH5MaXRlcmFsKGNsb3NlcikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc05vdEluKFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyxleGFjdD0xKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlbmluZyBhbmQgY2xvc2luZyBhcmd1bWVudHMgbXVzdCBiZSBzdHJpbmdzIGlmIG5vIGNvbnRlbnQgZXhwcmVzc2lvbiBpcyBnaXZlbiIpCiAgICByZXQgPSBGb3J3YXJkKCkKICAgIGlmIGlnbm9yZUV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgcmV0IDw8PSBHcm91cCggU3VwcHJlc3Mob3BlbmVyKSArIFplcm9Pck1vcmUoIGlnbm9yZUV4cHIgfCByZXQgfCBjb250ZW50ICkgKyBTdXBwcmVzcyhjbG9zZXIpICkKICAgIGVsc2U6CiAgICAgICAgcmV0IDw8PSBHcm91cCggU3VwcHJlc3Mob3BlbmVyKSArIFplcm9Pck1vcmUoIHJldCB8IGNvbnRlbnQgKSAgKyBTdXBwcmVzcyhjbG9zZXIpICkKICAgIHJldC5zZXROYW1lKCduZXN0ZWQgJXMlcyBleHByZXNzaW9uJyAlIChvcGVuZXIsY2xvc2VyKSkKICAgIHJldHVybiByZXQKCmRlZiBpbmRlbnRlZEJsb2NrKGJsb2NrU3RhdGVtZW50RXhwciwgaW5kZW50U3RhY2ssIGluZGVudD1UcnVlKToKICAgICIiIgogICAgSGVscGVyIG1ldGhvZCBmb3IgZGVmaW5pbmcgc3BhY2UtZGVsaW1pdGVkIGluZGVudGF0aW9uIGJsb2Nrcywgc3VjaCBhcwogICAgdGhvc2UgdXNlZCB0byBkZWZpbmUgYmxvY2sgc3RhdGVtZW50cyBpbiBQeXRob24gc291cmNlIGNvZGUuCgogICAgUGFyYW1ldGVyczoKICAgICAtIGJsb2NrU3RhdGVtZW50RXhwciAtIGV4cHJlc3Npb24gZGVmaW5pbmcgc3ludGF4IG9mIHN0YXRlbWVudCB0aGF0CiAgICAgICAgICAgIGlzIHJlcGVhdGVkIHdpdGhpbiB0aGUgaW5kZW50ZWQgYmxvY2sKICAgICAtIGluZGVudFN0YWNrIC0gbGlzdCBjcmVhdGVkIGJ5IGNhbGxlciB0byBtYW5hZ2UgaW5kZW50YXRpb24gc3RhY2sKICAgICAgICAgICAgKG11bHRpcGxlIHN0YXRlbWVudFdpdGhJbmRlbnRlZEJsb2NrIGV4cHJlc3Npb25zIHdpdGhpbiBhIHNpbmdsZSBncmFtbWFyCiAgICAgICAgICAgIHNob3VsZCBzaGFyZSBhIGNvbW1vbiBpbmRlbnRTdGFjaykKICAgICAtIGluZGVudCAtIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGJsb2NrIG11c3QgYmUgaW5kZW50ZWQgYmV5b25kIHRoZQogICAgICAgICAgICB0aGUgY3VycmVudCBsZXZlbDsgc2V0IHRvIEZhbHNlIGZvciBibG9jayBvZiBsZWZ0LW1vc3Qgc3RhdGVtZW50cwogICAgICAgICAgICAoZGVmYXVsdD1De1RydWV9KQoKICAgIEEgdmFsaWQgYmxvY2sgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBDe2Jsb2NrU3RhdGVtZW50fS4KCiAgICBFeGFtcGxlOjoKICAgICAgICBkYXRhID0gJycnCiAgICAgICAgZGVmIEEoeik6CiAgICAgICAgICBBMQogICAgICAgICAgQiA9IDEwMAogICAgICAgICAgRyA9IEEyCiAgICAgICAgICBBMgogICAgICAgICAgQTMKICAgICAgICBCCiAgICAgICAgZGVmIEJCKGEsYixjKToKICAgICAgICAgIEJCMQogICAgICAgICAgZGVmIEJCQSgpOgogICAgICAgICAgICBiYmExCiAgICAgICAgICAgIGJiYTIKICAgICAgICAgICAgYmJhMwogICAgICAgIEMKICAgICAgICBECiAgICAgICAgZGVmIHNwYW0oeCx5KToKICAgICAgICAgICAgIGRlZiBlZ2dzKHopOgogICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAnJycKCgogICAgICAgIGluZGVudFN0YWNrID0gWzFdCiAgICAgICAgc3RtdCA9IEZvcndhcmQoKQoKICAgICAgICBpZGVudGlmaWVyID0gV29yZChhbHBoYXMsIGFscGhhbnVtcykKICAgICAgICBmdW5jRGVjbCA9ICgiZGVmIiArIGlkZW50aWZpZXIgKyBHcm91cCggIigiICsgT3B0aW9uYWwoIGRlbGltaXRlZExpc3QoaWRlbnRpZmllcikgKSArICIpIiApICsgIjoiKQogICAgICAgIGZ1bmNfYm9keSA9IGluZGVudGVkQmxvY2soc3RtdCwgaW5kZW50U3RhY2spCiAgICAgICAgZnVuY0RlZiA9IEdyb3VwKCBmdW5jRGVjbCArIGZ1bmNfYm9keSApCgogICAgICAgIHJ2YWx1ZSA9IEZvcndhcmQoKQogICAgICAgIGZ1bmNDYWxsID0gR3JvdXAoaWRlbnRpZmllciArICIoIiArIE9wdGlvbmFsKGRlbGltaXRlZExpc3QocnZhbHVlKSkgKyAiKSIpCiAgICAgICAgcnZhbHVlIDw8IChmdW5jQ2FsbCB8IGlkZW50aWZpZXIgfCBXb3JkKG51bXMpKQogICAgICAgIGFzc2lnbm1lbnQgPSBHcm91cChpZGVudGlmaWVyICsgIj0iICsgcnZhbHVlKQogICAgICAgIHN0bXQgPDwgKCBmdW5jRGVmIHwgYXNzaWdubWVudCB8IGlkZW50aWZpZXIgKQoKICAgICAgICBtb2R1bGVfYm9keSA9IE9uZU9yTW9yZShzdG10KQoKICAgICAgICBwYXJzZVRyZWUgPSBtb2R1bGVfYm9keS5wYXJzZVN0cmluZyhkYXRhKQogICAgICAgIHBhcnNlVHJlZS5wcHJpbnQoKQogICAgcHJpbnRzOjoKICAgICAgICBbWydkZWYnLAogICAgICAgICAgJ0EnLAogICAgICAgICAgWycoJywgJ3onLCAnKSddLAogICAgICAgICAgJzonLAogICAgICAgICAgW1snQTEnXSwgW1snQicsICc9JywgJzEwMCddXSwgW1snRycsICc9JywgJ0EyJ11dLCBbJ0EyJ10sIFsnQTMnXV1dLAogICAgICAgICAnQicsCiAgICAgICAgIFsnZGVmJywKICAgICAgICAgICdCQicsCiAgICAgICAgICBbJygnLCAnYScsICdiJywgJ2MnLCAnKSddLAogICAgICAgICAgJzonLAogICAgICAgICAgW1snQkIxJ10sIFtbJ2RlZicsICdCQkEnLCBbJygnLCAnKSddLCAnOicsIFtbJ2JiYTEnXSwgWydiYmEyJ10sIFsnYmJhMyddXV1dXV0sCiAgICAgICAgICdDJywKICAgICAgICAgJ0QnLAogICAgICAgICBbJ2RlZicsCiAgICAgICAgICAnc3BhbScsCiAgICAgICAgICBbJygnLCAneCcsICd5JywgJyknXSwKICAgICAgICAgICc6JywKICAgICAgICAgIFtbWydkZWYnLCAnZWdncycsIFsnKCcsICd6JywgJyknXSwgJzonLCBbWydwYXNzJ11dXV1dXV0gCiAgICAiIiIKICAgIGRlZiBjaGVja1BlZXJJbmRlbnQocyxsLHQpOgogICAgICAgIGlmIGwgPj0gbGVuKHMpOiByZXR1cm4KICAgICAgICBjdXJDb2wgPSBjb2wobCxzKQogICAgICAgIGlmIGN1ckNvbCAhPSBpbmRlbnRTdGFja1stMV06CiAgICAgICAgICAgIGlmIGN1ckNvbCA+IGluZGVudFN0YWNrWy0xXToKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRmF0YWxFeGNlcHRpb24ocyxsLCJpbGxlZ2FsIG5lc3RpbmciKQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vdCBhIHBlZXIgZW50cnkiKQoKICAgIGRlZiBjaGVja1N1YkluZGVudChzLGwsdCk6CiAgICAgICAgY3VyQ29sID0gY29sKGwscykKICAgICAgICBpZiBjdXJDb2wgPiBpbmRlbnRTdGFja1stMV06CiAgICAgICAgICAgIGluZGVudFN0YWNrLmFwcGVuZCggY3VyQ29sICkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vdCBhIHN1YmVudHJ5IikKCiAgICBkZWYgY2hlY2tVbmluZGVudChzLGwsdCk6CiAgICAgICAgaWYgbCA+PSBsZW4ocyk6IHJldHVybgogICAgICAgIGN1ckNvbCA9IGNvbChsLHMpCiAgICAgICAgaWYgbm90KGluZGVudFN0YWNrIGFuZCBjdXJDb2wgPCBpbmRlbnRTdGFja1stMV0gYW5kIGN1ckNvbCA8PSBpbmRlbnRTdGFja1stMl0pOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vdCBhbiB1bmluZGVudCIpCiAgICAgICAgaW5kZW50U3RhY2sucG9wKCkKCiAgICBOTCA9IE9uZU9yTW9yZShMaW5lRW5kKCkuc2V0V2hpdGVzcGFjZUNoYXJzKCJcdCAiKS5zdXBwcmVzcygpKQogICAgSU5ERU5UID0gKEVtcHR5KCkgKyBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGNoZWNrU3ViSW5kZW50KSkuc2V0TmFtZSgnSU5ERU5UJykKICAgIFBFRVIgICA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24oY2hlY2tQZWVySW5kZW50KS5zZXROYW1lKCcnKQogICAgVU5ERU5UID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihjaGVja1VuaW5kZW50KS5zZXROYW1lKCdVTklOREVOVCcpCiAgICBpZiBpbmRlbnQ6CiAgICAgICAgc21FeHByID0gR3JvdXAoIE9wdGlvbmFsKE5MKSArCiAgICAgICAgICAgICN+IEZvbGxvd2VkQnkoYmxvY2tTdGF0ZW1lbnRFeHByKSArCiAgICAgICAgICAgIElOREVOVCArIChPbmVPck1vcmUoIFBFRVIgKyBHcm91cChibG9ja1N0YXRlbWVudEV4cHIpICsgT3B0aW9uYWwoTkwpICkpICsgVU5ERU5UKQogICAgZWxzZToKICAgICAgICBzbUV4cHIgPSBHcm91cCggT3B0aW9uYWwoTkwpICsKICAgICAgICAgICAgKE9uZU9yTW9yZSggUEVFUiArIEdyb3VwKGJsb2NrU3RhdGVtZW50RXhwcikgKyBPcHRpb25hbChOTCkgKSkgKQogICAgYmxvY2tTdGF0ZW1lbnRFeHByLmlnbm9yZShfYnNsYXNoICsgTGluZUVuZCgpKQogICAgcmV0dXJuIHNtRXhwci5zZXROYW1lKCdpbmRlbnRlZCBibG9jaycpCgphbHBoYXM4Yml0ID0gc3JhbmdlKHIiW1wweGMwLVwweGQ2XDB4ZDgtXDB4ZjZcMHhmOC1cMHhmZl0iKQpwdW5jOGJpdCA9IHNyYW5nZShyIltcMHhhMS1cMHhiZlwweGQ3XDB4ZjddIikKCmFueU9wZW5UYWcsYW55Q2xvc2VUYWcgPSBtYWtlSFRNTFRhZ3MoV29yZChhbHBoYXMsYWxwaGFudW1zKyJfOiIpLnNldE5hbWUoJ2FueSB0YWcnKSkKX2h0bWxFbnRpdHlNYXAgPSBkaWN0KHppcCgiZ3QgbHQgYW1wIG5ic3AgcXVvdCBhcG9zIi5zcGxpdCgpLCc+PCYgIlwnJykpCmNvbW1vbkhUTUxFbnRpdHkgPSBSZWdleCgnJig/UDxlbnRpdHk+JyArICd8Jy5qb2luKF9odG1sRW50aXR5TWFwLmtleXMoKSkgKyIpOyIpLnNldE5hbWUoImNvbW1vbiBIVE1MIGVudGl0eSIpCmRlZiByZXBsYWNlSFRNTEVudGl0eSh0KToKICAgICIiIkhlbHBlciBwYXJzZXIgYWN0aW9uIHRvIHJlcGxhY2UgY29tbW9uIEhUTUwgZW50aXRpZXMgd2l0aCB0aGVpciBzcGVjaWFsIGNoYXJhY3RlcnMiIiIKICAgIHJldHVybiBfaHRtbEVudGl0eU1hcC5nZXQodC5lbnRpdHkpCgojIGl0J3MgZWFzeSB0byBnZXQgdGhlc2UgY29tbWVudCBzdHJ1Y3R1cmVzIHdyb25nIC0gdGhleSdyZSB2ZXJ5IGNvbW1vbiwgc28gbWF5IGFzIHdlbGwgbWFrZSB0aGVtIGF2YWlsYWJsZQpjU3R5bGVDb21tZW50ID0gQ29tYmluZShSZWdleChyIi9cKig/OlteKl18XCooPyEvKSkqIikgKyAnKi8nKS5zZXROYW1lKCJDIHN0eWxlIGNvbW1lbnQiKQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDey8qIC4uLiAqL30iCgpodG1sQ29tbWVudCA9IFJlZ2V4KHIiPCEtLVtcc1xTXSo/LS0+Iikuc2V0TmFtZSgiSFRNTCBjb21tZW50IikKIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3s8IS0tIC4uLiAtLT59IgoKcmVzdE9mTGluZSA9IFJlZ2V4KHIiLioiKS5sZWF2ZVdoaXRlc3BhY2UoKS5zZXROYW1lKCJyZXN0IG9mIGxpbmUiKQpkYmxTbGFzaENvbW1lbnQgPSBSZWdleChyIi8vKD86XFxcbnxbXlxuXSkqIikuc2V0TmFtZSgiLy8gY29tbWVudCIpCiJDb21tZW50IG9mIHRoZSBmb3JtIEN7Ly8gLi4uICh0byBlbmQgb2YgbGluZSl9IgoKY3BwU3R5bGVDb21tZW50ID0gQ29tYmluZShSZWdleChyIi9cKig/OlteKl18XCooPyEvKSkqIikgKyAnKi8nfCBkYmxTbGFzaENvbW1lbnQpLnNldE5hbWUoIkMrKyBzdHlsZSBjb21tZW50IikKIkNvbW1lbnQgb2YgZWl0aGVyIGZvcm0gQ3tMe2NTdHlsZUNvbW1lbnR9fSBvciBDe0x7ZGJsU2xhc2hDb21tZW50fX0iCgpqYXZhU3R5bGVDb21tZW50ID0gY3BwU3R5bGVDb21tZW50CiJTYW1lIGFzIEN7THtjcHBTdHlsZUNvbW1lbnR9fSIKCnB5dGhvblN0eWxlQ29tbWVudCA9IFJlZ2V4KHIiIy4qIikuc2V0TmFtZSgiUHl0aG9uIHN0eWxlIGNvbW1lbnQiKQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDeyMgLi4uICh0byBlbmQgb2YgbGluZSl9IgoKX2NvbW1hc2VwaXRlbSA9IENvbWJpbmUoT25lT3JNb3JlKFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPScsJykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwoIFdvcmQoIiBcdCIpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+TGl0ZXJhbCgiLCIpICsgfkxpbmVFbmQoKSApICkgKS5zdHJlYW1saW5lKCkuc2V0TmFtZSgiY29tbWFJdGVtIikKY29tbWFTZXBhcmF0ZWRMaXN0ID0gZGVsaW1pdGVkTGlzdCggT3B0aW9uYWwoIHF1b3RlZFN0cmluZy5jb3B5KCkgfCBfY29tbWFzZXBpdGVtLCBkZWZhdWx0PSIiKSApLnNldE5hbWUoImNvbW1hU2VwYXJhdGVkTGlzdCIpCiIiIihEZXByZWNhdGVkKSBQcmVkZWZpbmVkIGV4cHJlc3Npb24gb2YgMSBvciBtb3JlIHByaW50YWJsZSB3b3JkcyBvciBxdW90ZWQgc3RyaW5ncywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4KICAgVGhpcyBleHByZXNzaW9uIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgTHtweXBhcnNpbmdfY29tbW9uLmNvbW1hX3NlcGFyYXRlZF9saXN0fS4iIiIKCiMgc29tZSBvdGhlciB1c2VmdWwgZXhwcmVzc2lvbnMgLSB1c2luZyBsb3dlci1jYXNlIGNsYXNzIG5hbWUgc2luY2Ugd2UgYXJlIHJlYWxseSB1c2luZyB0aGlzIGFzIGEgbmFtZXNwYWNlCmNsYXNzIHB5cGFyc2luZ19jb21tb246CiAgICAiIiIKICAgIEhlcmUgYXJlIHNvbWUgY29tbW9uIGxvdy1sZXZlbCBleHByZXNzaW9ucyB0aGF0IG1heSBiZSB1c2VmdWwgaW4ganVtcC1zdGFydGluZyBwYXJzZXIgZGV2ZWxvcG1lbnQ6CiAgICAgLSBudW1lcmljIGZvcm1zIChMe2ludGVnZXJzPGludGVnZXI+fSwgTHtyZWFsczxyZWFsPn0sIEx7c2NpZW50aWZpYyBub3RhdGlvbjxzY2lfcmVhbD59KQogICAgIC0gY29tbW9uIEx7cHJvZ3JhbW1pbmcgaWRlbnRpZmllcnM8aWRlbnRpZmllcj59CiAgICAgLSBuZXR3b3JrIGFkZHJlc3NlcyAoTHtNQUM8bWFjX2FkZHJlc3M+fSwgTHtJUHY0PGlwdjRfYWRkcmVzcz59LCBMe0lQdjY8aXB2Nl9hZGRyZXNzPn0pCiAgICAgLSBJU084NjAxIEx7ZGF0ZXM8aXNvODYwMV9kYXRlPn0gYW5kIEx7ZGF0ZXRpbWU8aXNvODYwMV9kYXRldGltZT59CiAgICAgLSBMe1VVSUQ8dXVpZD59CiAgICAgLSBMe2NvbW1hLXNlcGFyYXRlZCBsaXN0PGNvbW1hX3NlcGFyYXRlZF9saXN0Pn0KICAgIFBhcnNlIGFjdGlvbnM6CiAgICAgLSBDe0x7Y29udmVydFRvSW50ZWdlcn19CiAgICAgLSBDe0x7Y29udmVydFRvRmxvYXR9fQogICAgIC0gQ3tMe2NvbnZlcnRUb0RhdGV9fQogICAgIC0gQ3tMe2NvbnZlcnRUb0RhdGV0aW1lfX0KICAgICAtIEN7THtzdHJpcEhUTUxUYWdzfX0KICAgICAtIEN7THt1cGNhc2VUb2tlbnN9fQogICAgIC0gQ3tMe2Rvd25jYXNlVG9rZW5zfX0KCiAgICBFeGFtcGxlOjoKICAgICAgICBweXBhcnNpbmdfY29tbW9uLm51bWJlci5ydW5UZXN0cygnJycKICAgICAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyB0aGUgYXBwcm9wcmlhdGUgdHlwZQogICAgICAgICAgICAxMDAKICAgICAgICAgICAgLTEwMAogICAgICAgICAgICArMTAwCiAgICAgICAgICAgIDMuMTQxNTkKICAgICAgICAgICAgNi4wMmUyMwogICAgICAgICAgICAxZS0xMgogICAgICAgICAgICAnJycpCgogICAgICAgIHB5cGFyc2luZ19jb21tb24uZm51bWJlci5ydW5UZXN0cygnJycKICAgICAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyBmbG9hdAogICAgICAgICAgICAxMDAKICAgICAgICAgICAgLTEwMAogICAgICAgICAgICArMTAwCiAgICAgICAgICAgIDMuMTQxNTkKICAgICAgICAgICAgNi4wMmUyMwogICAgICAgICAgICAxZS0xMgogICAgICAgICAgICAnJycpCgogICAgICAgIHB5cGFyc2luZ19jb21tb24uaGV4X2ludGVnZXIucnVuVGVzdHMoJycnCiAgICAgICAgICAgICMgaGV4IG51bWJlcnMKICAgICAgICAgICAgMTAwCiAgICAgICAgICAgIEZGCiAgICAgICAgICAgICcnJykKCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5mcmFjdGlvbi5ydW5UZXN0cygnJycKICAgICAgICAgICAgIyBmcmFjdGlvbnMKICAgICAgICAgICAgMS8yCiAgICAgICAgICAgIC0zLzQKICAgICAgICAgICAgJycnKQoKICAgICAgICBweXBhcnNpbmdfY29tbW9uLm1peGVkX2ludGVnZXIucnVuVGVzdHMoJycnCiAgICAgICAgICAgICMgbWl4ZWQgZnJhY3Rpb25zCiAgICAgICAgICAgIDEKICAgICAgICAgICAgMS8yCiAgICAgICAgICAgIC0zLzQKICAgICAgICAgICAgMS0zLzQKICAgICAgICAgICAgJycnKQoKICAgICAgICBpbXBvcnQgdXVpZAogICAgICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcCh1dWlkLlVVSUQpKQogICAgICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5ydW5UZXN0cygnJycKICAgICAgICAgICAgIyB1dWlkCiAgICAgICAgICAgIDEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OAogICAgICAgICAgICAnJycpCiAgICBwcmludHM6OgogICAgICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgdGhlIGFwcHJvcHJpYXRlIHR5cGUKICAgICAgICAxMDAKICAgICAgICBbMTAwXQoKICAgICAgICAtMTAwCiAgICAgICAgWy0xMDBdCgogICAgICAgICsxMDAKICAgICAgICBbMTAwXQoKICAgICAgICAzLjE0MTU5CiAgICAgICAgWzMuMTQxNTldCgogICAgICAgIDYuMDJlMjMKICAgICAgICBbNi4wMmUrMjNdCgogICAgICAgIDFlLTEyCiAgICAgICAgWzFlLTEyXQoKICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0CiAgICAgICAgMTAwCiAgICAgICAgWzEwMC4wXQoKICAgICAgICAtMTAwCiAgICAgICAgWy0xMDAuMF0KCiAgICAgICAgKzEwMAogICAgICAgIFsxMDAuMF0KCiAgICAgICAgMy4xNDE1OQogICAgICAgIFszLjE0MTU5XQoKICAgICAgICA2LjAyZTIzCiAgICAgICAgWzYuMDJlKzIzXQoKICAgICAgICAxZS0xMgogICAgICAgIFsxZS0xMl0KCiAgICAgICAgIyBoZXggbnVtYmVycwogICAgICAgIDEwMAogICAgICAgIFsyNTZdCgogICAgICAgIEZGCiAgICAgICAgWzI1NV0KCiAgICAgICAgIyBmcmFjdGlvbnMKICAgICAgICAxLzIKICAgICAgICBbMC41XQoKICAgICAgICAtMy80CiAgICAgICAgWy0wLjc1XQoKICAgICAgICAjIG1peGVkIGZyYWN0aW9ucwogICAgICAgIDEKICAgICAgICBbMV0KCiAgICAgICAgMS8yCiAgICAgICAgWzAuNV0KCiAgICAgICAgLTMvNAogICAgICAgIFstMC43NV0KCiAgICAgICAgMS0zLzQKICAgICAgICBbMS43NV0KCiAgICAgICAgIyB1dWlkCiAgICAgICAgMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4CiAgICAgICAgW1VVSUQoJzEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OCcpXQogICAgIiIiCgogICAgY29udmVydFRvSW50ZWdlciA9IHRva2VuTWFwKGludCkKICAgICIiIgogICAgUGFyc2UgYWN0aW9uIGZvciBjb252ZXJ0aW5nIHBhcnNlZCBpbnRlZ2VycyB0byBQeXRob24gaW50CiAgICAiIiIKCiAgICBjb252ZXJ0VG9GbG9hdCA9IHRva2VuTWFwKGZsb2F0KQogICAgIiIiCiAgICBQYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIG51bWJlcnMgdG8gUHl0aG9uIGZsb2F0CiAgICAiIiIKCiAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXROYW1lKCJpbnRlZ2VyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvSW50ZWdlcikKICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYW4gdW5zaWduZWQgaW50ZWdlciwgcmV0dXJucyBhbiBpbnQiIiIKCiAgICBoZXhfaW50ZWdlciA9IFdvcmQoaGV4bnVtcykuc2V0TmFtZSgiaGV4IGludGVnZXIiKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChpbnQsMTYpKQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhIGhleGFkZWNpbWFsIGludGVnZXIsIHJldHVybnMgYW4gaW50IiIiCgogICAgc2lnbmVkX2ludGVnZXIgPSBSZWdleChyJ1srLV0/XGQrJykuc2V0TmFtZSgic2lnbmVkIGludGVnZXIiKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9JbnRlZ2VyKQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhbiBpbnRlZ2VyIHdpdGggb3B0aW9uYWwgbGVhZGluZyBzaWduLCByZXR1cm5zIGFuIGludCIiIgoKICAgIGZyYWN0aW9uID0gKHNpZ25lZF9pbnRlZ2VyKCkuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpICsgJy8nICsgc2lnbmVkX2ludGVnZXIoKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkpLnNldE5hbWUoImZyYWN0aW9uIikKICAgICIiImZyYWN0aW9uYWwgZXhwcmVzc2lvbiBvZiBhbiBpbnRlZ2VyIGRpdmlkZWQgYnkgYW4gaW50ZWdlciwgcmV0dXJucyBhIGZsb2F0IiIiCiAgICBmcmFjdGlvbi5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdDogdFswXS90Wy0xXSkKCiAgICBtaXhlZF9pbnRlZ2VyID0gKGZyYWN0aW9uIHwgc2lnbmVkX2ludGVnZXIgKyBPcHRpb25hbChPcHRpb25hbCgnLScpLnN1cHByZXNzKCkgKyBmcmFjdGlvbikpLnNldE5hbWUoImZyYWN0aW9uIG9yIG1peGVkIGludGVnZXItZnJhY3Rpb24iKQogICAgIiIibWl4ZWQgaW50ZWdlciBvZiB0aGUgZm9ybSAnaW50ZWdlciAtIGZyYWN0aW9uJywgd2l0aCBvcHRpb25hbCBsZWFkaW5nIGludGVnZXIsIHJldHVybnMgZmxvYXQiIiIKICAgIG1peGVkX2ludGVnZXIuYWRkUGFyc2VBY3Rpb24oc3VtKQoKICAgIHJlYWwgPSBSZWdleChyJ1srLV0/XGQrXC5cZConKS5zZXROYW1lKCJyZWFsIG51bWJlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBhbmQgcmV0dXJucyBhIGZsb2F0IiIiCgogICAgc2NpX3JlYWwgPSBSZWdleChyJ1srLV0/XGQrKFtlRV1bKy1dP1xkK3xcLlxkKihbZUVdWystXT9cZCspPyknKS5zZXROYW1lKCJyZWFsIG51bWJlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24iKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkKICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgd2l0aCBvcHRpb25hbCBzY2llbnRpZmljIG5vdGF0aW9uIGFuZCByZXR1cm5zIGEgZmxvYXQiIiIKCiAgICAjIHN0cmVhbWxpbmluZyB0aGlzIGV4cHJlc3Npb24gbWFrZXMgdGhlIGRvY3MgbmljZXItbG9va2luZwogICAgbnVtYmVyID0gKHNjaV9yZWFsIHwgcmVhbCB8IHNpZ25lZF9pbnRlZ2VyKS5zdHJlYW1saW5lKCkKICAgICIiImFueSBudW1lcmljIGV4cHJlc3Npb24sIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgUHl0aG9uIHR5cGUiIiIKCiAgICBmbnVtYmVyID0gUmVnZXgocidbKy1dP1xkK1wuP1xkKihbZUVdWystXT9cZCspPycpLnNldE5hbWUoImZudW1iZXIiKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkKICAgICIiImFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0IiIiCiAgICAKICAgIGlkZW50aWZpZXIgPSBXb3JkKGFscGhhcysnXycsIGFscGhhbnVtcysnXycpLnNldE5hbWUoImlkZW50aWZpZXIiKQogICAgIiIidHlwaWNhbCBjb2RlIGlkZW50aWZpZXIgKGxlYWRpbmcgYWxwaGEgb3IgJ18nLCBmb2xsb3dlZCBieSAwIG9yIG1vcmUgYWxwaGFzLCBudW1zLCBvciAnXycpIiIiCiAgICAKICAgIGlwdjRfYWRkcmVzcyA9IFJlZ2V4KHInKDI1WzAtNV18MlswLTRdWzAtOV18MT9bMC05XXsxLDJ9KShcLigyNVswLTVdfDJbMC00XVswLTldfDE/WzAtOV17MSwyfSkpezN9Jykuc2V0TmFtZSgiSVB2NCBhZGRyZXNzIikKICAgICJJUHY0IGFkZHJlc3MgKEN7MC4wLjAuMCAtIDI1NS4yNTUuMjU1LjI1NX0pIgoKICAgIF9pcHY2X3BhcnQgPSBSZWdleChyJ1swLTlhLWZBLUZdezEsNH0nKS5zZXROYW1lKCJoZXhfaW50ZWdlciIpCiAgICBfZnVsbF9pcHY2X2FkZHJlc3MgPSAoX2lwdjZfcGFydCArICgnOicgKyBfaXB2Nl9wYXJ0KSo3KS5zZXROYW1lKCJmdWxsIElQdjYgYWRkcmVzcyIpCiAgICBfc2hvcnRfaXB2Nl9hZGRyZXNzID0gKE9wdGlvbmFsKF9pcHY2X3BhcnQgKyAoJzonICsgX2lwdjZfcGFydCkqKDAsNikpICsgIjo6IiArIE9wdGlvbmFsKF9pcHY2X3BhcnQgKyAoJzonICsgX2lwdjZfcGFydCkqKDAsNikpKS5zZXROYW1lKCJzaG9ydCBJUHY2IGFkZHJlc3MiKQogICAgX3Nob3J0X2lwdjZfYWRkcmVzcy5hZGRDb25kaXRpb24obGFtYmRhIHQ6IHN1bSgxIGZvciB0dCBpbiB0IGlmIHB5cGFyc2luZ19jb21tb24uX2lwdjZfcGFydC5tYXRjaGVzKHR0KSkgPCA4KQogICAgX21peGVkX2lwdjZfYWRkcmVzcyA9ICgiOjpmZmZmOiIgKyBpcHY0X2FkZHJlc3MpLnNldE5hbWUoIm1peGVkIElQdjYgYWRkcmVzcyIpCiAgICBpcHY2X2FkZHJlc3MgPSBDb21iaW5lKChfZnVsbF9pcHY2X2FkZHJlc3MgfCBfbWl4ZWRfaXB2Nl9hZGRyZXNzIHwgX3Nob3J0X2lwdjZfYWRkcmVzcykuc2V0TmFtZSgiSVB2NiBhZGRyZXNzIikpLnNldE5hbWUoIklQdjYgYWRkcmVzcyIpCiAgICAiSVB2NiBhZGRyZXNzIChsb25nLCBzaG9ydCwgb3IgbWl4ZWQgZm9ybSkiCiAgICAKICAgIG1hY19hZGRyZXNzID0gUmVnZXgocidbMC05YS1mQS1GXXsyfShbOi4tXSlbMC05YS1mQS1GXXsyfSg/OlwxWzAtOWEtZkEtRl17Mn0pezR9Jykuc2V0TmFtZSgiTUFDIGFkZHJlc3MiKQogICAgIk1BQyBhZGRyZXNzIHh4Onh4Onh4Onh4Onh4IChtYXkgYWxzbyBoYXZlICctJyBvciAnLicgZGVsaW1pdGVycykiCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGNvbnZlcnRUb0RhdGUoZm10PSIlWS0lbS0lZCIpOgogICAgICAgICIiIgogICAgICAgIEhlbHBlciB0byBjcmVhdGUgYSBwYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIGRhdGUgc3RyaW5nIHRvIFB5dGhvbiBkYXRldGltZS5kYXRlCgogICAgICAgIFBhcmFtcyAtCiAgICAgICAgIC0gZm10IC0gZm9ybWF0IHRvIGJlIHBhc3NlZCB0byBkYXRldGltZS5zdHJwdGltZSAoZGVmYXVsdD1DeyIlWS0lbS0lZCJ9KQoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgZGF0ZV9leHByID0gcHlwYXJzaW5nX2NvbW1vbi5pc284NjAxX2RhdGUuY29weSgpCiAgICAgICAgICAgIGRhdGVfZXhwci5zZXRQYXJzZUFjdGlvbihweXBhcnNpbmdfY29tbW9uLmNvbnZlcnRUb0RhdGUoKSkKICAgICAgICAgICAgcHJpbnQoZGF0ZV9leHByLnBhcnNlU3RyaW5nKCIxOTk5LTEyLTMxIikpCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAgICAgW2RhdGV0aW1lLmRhdGUoMTk5OSwgMTIsIDMxKV0KICAgICAgICAiIiIKICAgICAgICBkZWYgY3Z0X2ZuKHMsbCx0KToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGV0aW1lLnN0cnB0aW1lKHRbMF0sIGZtdCkuZGF0ZSgpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIHZlOgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocywgbCwgc3RyKHZlKSkKICAgICAgICByZXR1cm4gY3Z0X2ZuCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGNvbnZlcnRUb0RhdGV0aW1lKGZtdD0iJVktJW0tJWRUJUg6JU06JVMuJWYiKToKICAgICAgICAiIiIKICAgICAgICBIZWxwZXIgdG8gY3JlYXRlIGEgcGFyc2UgYWN0aW9uIGZvciBjb252ZXJ0aW5nIHBhcnNlZCBkYXRldGltZSBzdHJpbmcgdG8gUHl0aG9uIGRhdGV0aW1lLmRhdGV0aW1lCgogICAgICAgIFBhcmFtcyAtCiAgICAgICAgIC0gZm10IC0gZm9ybWF0IHRvIGJlIHBhc3NlZCB0byBkYXRldGltZS5zdHJwdGltZSAoZGVmYXVsdD1DeyIlWS0lbS0lZFQlSDolTTolUy4lZiJ9KQoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgZHRfZXhwciA9IHB5cGFyc2luZ19jb21tb24uaXNvODYwMV9kYXRldGltZS5jb3B5KCkKICAgICAgICAgICAgZHRfZXhwci5zZXRQYXJzZUFjdGlvbihweXBhcnNpbmdfY29tbW9uLmNvbnZlcnRUb0RhdGV0aW1lKCkpCiAgICAgICAgICAgIHByaW50KGR0X2V4cHIucGFyc2VTdHJpbmcoIjE5OTktMTItMzFUMjM6NTk6NTkuOTk5IikpCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAgICAgW2RhdGV0aW1lLmRhdGV0aW1lKDE5OTksIDEyLCAzMSwgMjMsIDU5LCA1OSwgOTk5MDAwKV0KICAgICAgICAiIiIKICAgICAgICBkZWYgY3Z0X2ZuKHMsbCx0KToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGV0aW1lLnN0cnB0aW1lKHRbMF0sIGZtdCkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgdmU6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLCBsLCBzdHIodmUpKQogICAgICAgIHJldHVybiBjdnRfZm4KCiAgICBpc284NjAxX2RhdGUgPSBSZWdleChyJyg/UDx5ZWFyPlxkezR9KSg/Oi0oP1A8bW9udGg+XGRcZCkoPzotKD9QPGRheT5cZFxkKSk/KT8nKS5zZXROYW1lKCJJU084NjAxIGRhdGUiKQogICAgIklTTzg2MDEgZGF0ZSAoQ3t5eXl5LW1tLWRkfSkiCgogICAgaXNvODYwMV9kYXRldGltZSA9IFJlZ2V4KHInKD9QPHllYXI+XGR7NH0pLSg/UDxtb250aD5cZFxkKS0oP1A8ZGF5PlxkXGQpW1QgXSg/UDxob3VyPlxkXGQpOig/UDxtaW51dGU+XGRcZCkoOig/UDxzZWNvbmQ+XGRcZChcLlxkKik/KT8pPyg/UDx0ej5afFsrLV1cZFxkOj9cZFxkKT8nKS5zZXROYW1lKCJJU084NjAxIGRhdGV0aW1lIikKICAgICJJU084NjAxIGRhdGV0aW1lIChDe3l5eXktbW0tZGRUaGg6bW06c3MucyhafCstMDA6MDApfSkgLSB0cmFpbGluZyBzZWNvbmRzLCBtaWxsaXNlY29uZHMsIGFuZCB0aW1lem9uZSBvcHRpb25hbDsgYWNjZXB0cyBzZXBhcmF0aW5nIEN7J1QnfSBvciBDeycgJ30iCgogICAgdXVpZCA9IFJlZ2V4KHInWzAtOWEtZkEtRl17OH0oLVswLTlhLWZBLUZdezR9KXszfS1bMC05YS1mQS1GXXsxMn0nKS5zZXROYW1lKCJVVUlEIikKICAgICJVVUlEIChDe3h4eHh4eHh4LXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eH0pIgoKICAgIF9odG1sX3N0cmlwcGVyID0gYW55T3BlblRhZy5zdXBwcmVzcygpIHwgYW55Q2xvc2VUYWcuc3VwcHJlc3MoKQogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHN0cmlwSFRNTFRhZ3MocywgbCwgdG9rZW5zKToKICAgICAgICAiIiIKICAgICAgICBQYXJzZSBhY3Rpb24gdG8gcmVtb3ZlIEhUTUwgdGFncyBmcm9tIHdlYiBwYWdlIEhUTUwgc291cmNlCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICAjIHN0cmlwIEhUTUwgbGlua3MgZnJvbSBub3JtYWwgdGV4dCAKICAgICAgICAgICAgdGV4dCA9ICc8dGQ+TW9yZSBpbmZvIGF0IHRoZSA8YSBocmVmPSJodHRwOi8vcHlwYXJzaW5nLndpa2lzcGFjZXMuY29tIj5weXBhcnNpbmc8L2E+IHdpa2kgcGFnZTwvdGQ+JwogICAgICAgICAgICB0ZCx0ZF9lbmQgPSBtYWtlSFRNTFRhZ3MoIlREIikKICAgICAgICAgICAgdGFibGVfdGV4dCA9IHRkICsgU2tpcFRvKHRkX2VuZCkuc2V0UGFyc2VBY3Rpb24ocHlwYXJzaW5nX2NvbW1vbi5zdHJpcEhUTUxUYWdzKSgiYm9keSIpICsgdGRfZW5kCiAgICAgICAgICAgIAogICAgICAgICAgICBwcmludCh0YWJsZV90ZXh0LnBhcnNlU3RyaW5nKHRleHQpLmJvZHkpICMgLT4gJ01vcmUgaW5mbyBhdCB0aGUgcHlwYXJzaW5nIHdpa2kgcGFnZScKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gcHlwYXJzaW5nX2NvbW1vbi5faHRtbF9zdHJpcHBlci50cmFuc2Zvcm1TdHJpbmcodG9rZW5zWzBdKQoKICAgIF9jb21tYXNlcGl0ZW0gPSBDb21iaW5lKE9uZU9yTW9yZSh+TGl0ZXJhbCgiLCIpICsgfkxpbmVFbmQoKSArIFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPScsJykgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE9wdGlvbmFsKCBXaGl0ZSgiIFx0IikgKSApICkuc3RyZWFtbGluZSgpLnNldE5hbWUoImNvbW1hSXRlbSIpCiAgICBjb21tYV9zZXBhcmF0ZWRfbGlzdCA9IGRlbGltaXRlZExpc3QoIE9wdGlvbmFsKCBxdW90ZWRTdHJpbmcuY29weSgpIHwgX2NvbW1hc2VwaXRlbSwgZGVmYXVsdD0iIikgKS5zZXROYW1lKCJjb21tYSBzZXBhcmF0ZWQgbGlzdCIpCiAgICAiIiJQcmVkZWZpbmVkIGV4cHJlc3Npb24gb2YgMSBvciBtb3JlIHByaW50YWJsZSB3b3JkcyBvciBxdW90ZWQgc3RyaW5ncywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4iIiIKCiAgICB1cGNhc2VUb2tlbnMgPSBzdGF0aWNtZXRob2QodG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLnVwcGVyKCkpKQogICAgIiIiUGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIHVwcGVyIGNhc2UuIiIiCgogICAgZG93bmNhc2VUb2tlbnMgPSBzdGF0aWNtZXRob2QodG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLmxvd2VyKCkpKQogICAgIiIiUGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIGxvd2VyIGNhc2UuIiIiCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKCiAgICBzZWxlY3RUb2tlbiAgICA9IENhc2VsZXNzTGl0ZXJhbCgic2VsZWN0IikKICAgIGZyb21Ub2tlbiAgICAgID0gQ2FzZWxlc3NMaXRlcmFsKCJmcm9tIikKCiAgICBpZGVudCAgICAgICAgICA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMgKyAiXyQiKQoKICAgIGNvbHVtbk5hbWUgICAgID0gZGVsaW1pdGVkTGlzdChpZGVudCwgIi4iLCBjb21iaW5lPVRydWUpLnNldFBhcnNlQWN0aW9uKHVwY2FzZVRva2VucykKICAgIGNvbHVtbk5hbWVMaXN0ID0gR3JvdXAoZGVsaW1pdGVkTGlzdChjb2x1bW5OYW1lKSkuc2V0TmFtZSgiY29sdW1ucyIpCiAgICBjb2x1bW5TcGVjICAgICA9ICgnKicgfCBjb2x1bW5OYW1lTGlzdCkKCiAgICB0YWJsZU5hbWUgICAgICA9IGRlbGltaXRlZExpc3QoaWRlbnQsICIuIiwgY29tYmluZT1UcnVlKS5zZXRQYXJzZUFjdGlvbih1cGNhc2VUb2tlbnMpCiAgICB0YWJsZU5hbWVMaXN0ICA9IEdyb3VwKGRlbGltaXRlZExpc3QodGFibGVOYW1lKSkuc2V0TmFtZSgidGFibGVzIikKICAgIAogICAgc2ltcGxlU1FMICAgICAgPSBzZWxlY3RUb2tlbigiY29tbWFuZCIpICsgY29sdW1uU3BlYygiY29sdW1ucyIpICsgZnJvbVRva2VuICsgdGFibGVOYW1lTGlzdCgidGFibGVzIikKCiAgICAjIGRlbW8gcnVuVGVzdHMgbWV0aG9kLCBpbmNsdWRpbmcgZW1iZWRkZWQgY29tbWVudHMgaW4gdGVzdCBzdHJpbmcKICAgIHNpbXBsZVNRTC5ydW5UZXN0cygiIiIKICAgICAgICAjICcqJyBhcyBjb2x1bW4gbGlzdCBhbmQgZG90dGVkIHRhYmxlIG5hbWUKICAgICAgICBzZWxlY3QgKiBmcm9tIFNZUy5YWVpaWQoKICAgICAgICAjIGNhc2VsZXNzIG1hdGNoIG9uICJTRUxFQ1QiLCBhbmQgY2FzdHMgYmFjayB0byAic2VsZWN0IgogICAgICAgIFNFTEVDVCAqIGZyb20gWFlaWlksIEFCQwoKICAgICAgICAjIGxpc3Qgb2YgY29sdW1uIG5hbWVzLCBhbmQgbWl4ZWQgY2FzZSBTRUxFQ1Qga2V5d29yZAogICAgICAgIFNlbGVjdCBBQSxCQixDQyBmcm9tIFN5cy5kdWFsCgogICAgICAgICMgbXVsdGlwbGUgdGFibGVzCiAgICAgICAgU2VsZWN0IEEsIEIsIEMgZnJvbSBTeXMuZHVhbCwgVGFibGUyCgogICAgICAgICMgaW52YWxpZCBTRUxFQ1Qga2V5d29yZCAtIHNob3VsZCBmYWlsCiAgICAgICAgWGVsZWN0IEEsIEIsIEMgZnJvbSBTeXMuZHVhbAoKICAgICAgICAjIGluY29tcGxldGUgY29tbWFuZCAtIHNob3VsZCBmYWlsCiAgICAgICAgU2VsZWN0CgogICAgICAgICMgaW52YWxpZCBjb2x1bW4gbmFtZSAtIHNob3VsZCBmYWlsCiAgICAgICAgU2VsZWN0IF5eXiBmcm94IFN5cy5kdWFsCgogICAgICAgICIiIikKCiAgICBweXBhcnNpbmdfY29tbW9uLm51bWJlci5ydW5UZXN0cygiIiIKICAgICAgICAxMDAKICAgICAgICAtMTAwCiAgICAgICAgKzEwMAogICAgICAgIDMuMTQxNTkKICAgICAgICA2LjAyZTIzCiAgICAgICAgMWUtMTIKICAgICAgICAiIiIpCgogICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyBmbG9hdAogICAgcHlwYXJzaW5nX2NvbW1vbi5mbnVtYmVyLnJ1blRlc3RzKCIiIgogICAgICAgIDEwMAogICAgICAgIC0xMDAKICAgICAgICArMTAwCiAgICAgICAgMy4xNDE1OQogICAgICAgIDYuMDJlMjMKICAgICAgICAxZS0xMgogICAgICAgICIiIikKCiAgICBweXBhcnNpbmdfY29tbW9uLmhleF9pbnRlZ2VyLnJ1blRlc3RzKCIiIgogICAgICAgIDEwMAogICAgICAgIEZGCiAgICAgICAgIiIiKQoKICAgIGltcG9ydCB1dWlkCiAgICBweXBhcnNpbmdfY29tbW9uLnV1aWQuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAodXVpZC5VVUlEKSkKICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5ydW5UZXN0cygiIiIKICAgICAgICAxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgKICAgICAgICAiIiIpClBLAwQUAAAAAAAAACEAYB4HjQUDAAAFAwAAKAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZS12ZW5kb3IucHlpbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgcGlwCmltcG9ydCBnbG9iCmltcG9ydCBzaHV0aWwKCmhlcmUgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKCmRlZiB1c2FnZSgpOgogICAgcHJpbnQoIlVzYWdlOiByZS12ZW5kb3IucHkgW2NsZWFufHZlbmRvcl0iKQogICAgc3lzLmV4aXQoMSkKCmRlZiBjbGVhbigpOgogICAgZm9yIGZuIGluIG9zLmxpc3RkaXIoaGVyZSk6CiAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguam9pbihoZXJlLCBmbikKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgogICAgICAgICAgICBzaHV0aWwucm10cmVlKGRpcm5hbWUpCiAgICAjIHNpeCBpcyBhIHNpbmdsZSBmaWxlLCBub3QgYSBwYWNrYWdlCiAgICBvcy51bmxpbmsob3MucGF0aC5qb2luKGhlcmUsICdzaXgucHknKSkKCmRlZiB2ZW5kb3IoKToKICAgIHBpcC5tYWluKFsnaW5zdGFsbCcsICctdCcsIGhlcmUsICctcicsICd2ZW5kb3IudHh0J10pCiAgICBmb3IgZGlybmFtZSBpbiBnbG9iLmdsb2IoJyouZWdnLWluZm8nKToKICAgICAgICBzaHV0aWwucm10cmVlKGRpcm5hbWUpCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgaWYgbGVuKHN5cy5hcmd2KSAhPSAyOgogICAgICAgIHVzYWdlKCkKICAgIGlmIHN5cy5hcmd2WzFdID09ICdjbGVhbic6CiAgICAgICAgY2xlYW4oKQogICAgZWxpZiBzeXMuYXJndlsxXSA9PSAndmVuZG9yJzoKICAgICAgICB2ZW5kb3IoKQogICAgZWxzZToKICAgICAgICB1c2FnZSgpClBLAwQUAAAAAAAAACEAH8buMPcNAAD3DQAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9fX2luaXRfXy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgojICAgX18KIyAgL19fKSAgXyAgXyAgICAgXyAgIF8gXy8gICBfCiMgLyAoICAgKC0gKC8gKC8gKC0gXykgIC8gIF8pCiMgICAgICAgICAgLwoKIiIiClJlcXVlc3RzIEhUVFAgTGlicmFyeQp+fn5+fn5+fn5+fn5+fn5+fn5+fn4KClJlcXVlc3RzIGlzIGFuIEhUVFAgbGlicmFyeSwgd3JpdHRlbiBpbiBQeXRob24sIGZvciBodW1hbiBiZWluZ3MuIEJhc2ljIEdFVAp1c2FnZToKCiAgID4+PiBpbXBvcnQgcmVxdWVzdHMKICAgPj4+IHIgPSByZXF1ZXN0cy5nZXQoJ2h0dHBzOi8vd3d3LnB5dGhvbi5vcmcnKQogICA+Pj4gci5zdGF0dXNfY29kZQogICAyMDAKICAgPj4+ICdQeXRob24gaXMgYSBwcm9ncmFtbWluZyBsYW5ndWFnZScgaW4gci5jb250ZW50CiAgIFRydWUKCi4uLiBvciBQT1NUOgoKICAgPj4+IHBheWxvYWQgPSBkaWN0KGtleTE9J3ZhbHVlMScsIGtleTI9J3ZhbHVlMicpCiAgID4+PiByID0gcmVxdWVzdHMucG9zdCgnaHR0cDovL2h0dHBiaW4ub3JnL3Bvc3QnLCBkYXRhPXBheWxvYWQpCiAgID4+PiBwcmludChyLnRleHQpCiAgIHsKICAgICAuLi4KICAgICAiZm9ybSI6IHsKICAgICAgICJrZXkyIjogInZhbHVlMiIsCiAgICAgICAia2V5MSI6ICJ2YWx1ZTEiCiAgICAgfSwKICAgICAuLi4KICAgfQoKVGhlIG90aGVyIEhUVFAgbWV0aG9kcyBhcmUgc3VwcG9ydGVkIC0gc2VlIGByZXF1ZXN0cy5hcGlgLiBGdWxsIGRvY3VtZW50YXRpb24KaXMgYXQgPGh0dHA6Ly9weXRob24tcmVxdWVzdHMub3JnPi4KCjpjb3B5cmlnaHQ6IChjKSAyMDE3IGJ5IEtlbm5ldGggUmVpdHouCjpsaWNlbnNlOiBBcGFjaGUgMi4wLCBzZWUgTElDRU5TRSBmb3IgbW9yZSBkZXRhaWxzLgoiIiIKCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHVybGxpYjMKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgY2hhcmRldAppbXBvcnQgd2FybmluZ3MKZnJvbSAuZXhjZXB0aW9ucyBpbXBvcnQgUmVxdWVzdHNEZXBlbmRlbmN5V2FybmluZwoKCmRlZiBjaGVja19jb21wYXRpYmlsaXR5KHVybGxpYjNfdmVyc2lvbiwgY2hhcmRldF92ZXJzaW9uKToKICAgIHVybGxpYjNfdmVyc2lvbiA9IHVybGxpYjNfdmVyc2lvbi5zcGxpdCgnLicpCiAgICBhc3NlcnQgdXJsbGliM192ZXJzaW9uICE9IFsnZGV2J10gICMgVmVyaWZ5IHVybGxpYjMgaXNuJ3QgaW5zdGFsbGVkIGZyb20gZ2l0LgoKICAgICMgU29tZXRpbWVzLCB1cmxsaWIzIG9ubHkgcmVwb3J0cyBpdHMgdmVyc2lvbiBhcyAxNi4xLgogICAgaWYgbGVuKHVybGxpYjNfdmVyc2lvbikgPT0gMjoKICAgICAgICB1cmxsaWIzX3ZlcnNpb24uYXBwZW5kKCcwJykKCiAgICAjIENoZWNrIHVybGxpYjMgZm9yIGNvbXBhdGliaWxpdHkuCiAgICBtYWpvciwgbWlub3IsIHBhdGNoID0gdXJsbGliM192ZXJzaW9uICAjIG5vcWE6IEY4MTEKICAgIG1ham9yLCBtaW5vciwgcGF0Y2ggPSBpbnQobWFqb3IpLCBpbnQobWlub3IpLCBpbnQocGF0Y2gpCiAgICAjIHVybGxpYjMgPj0gMS4yMS4xLCA8PSAxLjIyCiAgICBhc3NlcnQgbWFqb3IgPT0gMQogICAgYXNzZXJ0IG1pbm9yID49IDIxCiAgICBhc3NlcnQgbWlub3IgPD0gMjIKCiAgICAjIENoZWNrIGNoYXJkZXQgZm9yIGNvbXBhdGliaWxpdHkuCiAgICBtYWpvciwgbWlub3IsIHBhdGNoID0gY2hhcmRldF92ZXJzaW9uLnNwbGl0KCcuJylbOjNdCiAgICBtYWpvciwgbWlub3IsIHBhdGNoID0gaW50KG1ham9yKSwgaW50KG1pbm9yKSwgaW50KHBhdGNoKQogICAgIyBjaGFyZGV0ID49IDMuMC4yLCA8IDMuMS4wCiAgICBhc3NlcnQgbWFqb3IgPT0gMwogICAgYXNzZXJ0IG1pbm9yIDwgMQogICAgYXNzZXJ0IHBhdGNoID49IDIKCgojIENoZWNrIGltcG9ydGVkIGRlcGVuZGVuY2llcyBmb3IgY29tcGF0aWJpbGl0eS4KdHJ5OgogICAgY2hlY2tfY29tcGF0aWJpbGl0eSh1cmxsaWIzLl9fdmVyc2lvbl9fLCBjaGFyZGV0Ll9fdmVyc2lvbl9fKQpleGNlcHQgKEFzc2VydGlvbkVycm9yLCBWYWx1ZUVycm9yKToKICAgIHdhcm5pbmdzLndhcm4oInVybGxpYjMgKHswfSkgb3IgY2hhcmRldCAoezF9KSBkb2Vzbid0IG1hdGNoIGEgc3VwcG9ydGVkICIKICAgICAgICAgICAgICAgICAgInZlcnNpb24hIi5mb3JtYXQodXJsbGliMy5fX3ZlcnNpb25fXywgY2hhcmRldC5fX3ZlcnNpb25fXyksCiAgICAgICAgICAgICAgICAgIFJlcXVlc3RzRGVwZW5kZW5jeVdhcm5pbmcpCgojIEF0dGVtcHQgdG8gZW5hYmxlIHVybGxpYjMncyBTTkkgc3VwcG9ydCwgaWYgcG9zc2libGUKIyB0cnk6CiMgICAgIGZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5jb250cmliIGltcG9ydCBweW9wZW5zc2wKIyAgICAgcHlvcGVuc3NsLmluamVjdF9pbnRvX3VybGxpYjMoKQojIGV4Y2VwdCBJbXBvcnRFcnJvcjoKIyAgICAgcGFzcwoKIyB1cmxsaWIzJ3MgRGVwZW5kZW5jeVdhcm5pbmdzIHNob3VsZCBiZSBzaWxlbmNlZC4KZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IERlcGVuZGVuY3lXYXJuaW5nCndhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgRGVwZW5kZW5jeVdhcm5pbmcpCgpmcm9tIC5fX3ZlcnNpb25fXyBpbXBvcnQgX190aXRsZV9fLCBfX2Rlc2NyaXB0aW9uX18sIF9fdXJsX18sIF9fdmVyc2lvbl9fCmZyb20gLl9fdmVyc2lvbl9fIGltcG9ydCBfX2J1aWxkX18sIF9fYXV0aG9yX18sIF9fYXV0aG9yX2VtYWlsX18sIF9fbGljZW5zZV9fCmZyb20gLl9fdmVyc2lvbl9fIGltcG9ydCBfX2NvcHlyaWdodF9fLCBfX2Nha2VfXwoKZnJvbSAuIGltcG9ydCB1dGlscwpmcm9tIC4gaW1wb3J0IHBhY2thZ2VzCmZyb20gLm1vZGVscyBpbXBvcnQgUmVxdWVzdCwgUmVzcG9uc2UsIFByZXBhcmVkUmVxdWVzdApmcm9tIC5hcGkgaW1wb3J0IHJlcXVlc3QsIGdldCwgaGVhZCwgcG9zdCwgcGF0Y2gsIHB1dCwgZGVsZXRlLCBvcHRpb25zCmZyb20gLnNlc3Npb25zIGltcG9ydCBzZXNzaW9uLCBTZXNzaW9uCmZyb20gLnN0YXR1c19jb2RlcyBpbXBvcnQgY29kZXMKZnJvbSAuZXhjZXB0aW9ucyBpbXBvcnQgKAogICAgUmVxdWVzdEV4Y2VwdGlvbiwgVGltZW91dCwgVVJMUmVxdWlyZWQsCiAgICBUb29NYW55UmVkaXJlY3RzLCBIVFRQRXJyb3IsIENvbm5lY3Rpb25FcnJvciwKICAgIEZpbGVNb2RlV2FybmluZywgQ29ubmVjdFRpbWVvdXQsIFJlYWRUaW1lb3V0CikKCiMgU2V0IGRlZmF1bHQgbG9nZ2luZyBoYW5kbGVyIHRvIGF2b2lkICJObyBoYW5kbGVyIGZvdW5kIiB3YXJuaW5ncy4KaW1wb3J0IGxvZ2dpbmcKdHJ5OiAgIyBQeXRob24gMi43KwogICAgZnJvbSBsb2dnaW5nIGltcG9ydCBOdWxsSGFuZGxlcgpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBjbGFzcyBOdWxsSGFuZGxlcihsb2dnaW5nLkhhbmRsZXIpOgogICAgICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CiAgICAgICAgICAgIHBhc3MKCmxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKS5hZGRIYW5kbGVyKE51bGxIYW5kbGVyKCkpCgojIEZpbGVNb2RlV2FybmluZ3MgZ28gb2ZmIHBlciB0aGUgZGVmYXVsdC4Kd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdkZWZhdWx0JywgRmlsZU1vZGVXYXJuaW5nLCBhcHBlbmQ9VHJ1ZSkKUEsDBBQAAAAAAAAAIQDffHkltAEAALQBAAAzAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL19fdmVyc2lvbl9fLnB5IyAuLS4gLi0uIC4tLiAuIC4gLi0uIC4tLiAuLS4gLi0uCiMgfCggIHwtICB8LnwgfCB8IHwtICBgLS4gIHwgIGAtLgojICcgJyBgLScgYC1gLmAtJyBgLScgYC0nICAnICBgLScKCl9fdGl0bGVfXyA9ICdyZXF1ZXN0cycKX19kZXNjcmlwdGlvbl9fID0gJ1B5dGhvbiBIVFRQIGZvciBIdW1hbnMuJwpfX3VybF9fID0gJ2h0dHA6Ly9weXRob24tcmVxdWVzdHMub3JnJwpfX3ZlcnNpb25fXyA9ICcyLjE4LjQnCl9fYnVpbGRfXyA9IDB4MDIxODA0Cl9fYXV0aG9yX18gPSAnS2VubmV0aCBSZWl0eicKX19hdXRob3JfZW1haWxfXyA9ICdtZUBrZW5uZXRocmVpdHoub3JnJwpfX2xpY2Vuc2VfXyA9ICdBcGFjaGUgMi4wJwpfX2NvcHlyaWdodF9fID0gJ0NvcHlyaWdodCAyMDE3IEtlbm5ldGggUmVpdHonCl9fY2FrZV9fID0gdSdcdTI3MjggXFUwMDAxZjM3MCBcdTI3MjgnClBLAwQUAAAAAAAAACEAiKk5u0gEAABIBAAANwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9faW50ZXJuYWxfdXRpbHMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLl9pbnRlcm5hbF91dGlscwp+fn5+fn5+fn5+fn5+fgoKUHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgdGhhdCBhcmUgY29uc3VtZWQgaW50ZXJuYWxseSBieSBSZXF1ZXN0cwp3aGljaCBkZXBlbmQgb24gZXh0cmVtZWx5IGZldyBleHRlcm5hbCBoZWxwZXJzIChzdWNoIGFzIGNvbXBhdCkKIiIiCgpmcm9tIC5jb21wYXQgaW1wb3J0IGlzX3B5MiwgYnVpbHRpbl9zdHIsIHN0cgoKCmRlZiB0b19uYXRpdmVfc3RyaW5nKHN0cmluZywgZW5jb2Rpbmc9J2FzY2lpJyk6CiAgICAiIiJHaXZlbiBhIHN0cmluZyBvYmplY3QsIHJlZ2FyZGxlc3Mgb2YgdHlwZSwgcmV0dXJucyBhIHJlcHJlc2VudGF0aW9uIG9mCiAgICB0aGF0IHN0cmluZyBpbiB0aGUgbmF0aXZlIHN0cmluZyB0eXBlLCBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgd2hlcmUKICAgIG5lY2Vzc2FyeS4gVGhpcyBhc3N1bWVzIEFTQ0lJIHVubGVzcyB0b2xkIG90aGVyd2lzZS4KICAgICIiIgogICAgaWYgaXNpbnN0YW5jZShzdHJpbmcsIGJ1aWx0aW5fc3RyKToKICAgICAgICBvdXQgPSBzdHJpbmcKICAgIGVsc2U6CiAgICAgICAgaWYgaXNfcHkyOgogICAgICAgICAgICBvdXQgPSBzdHJpbmcuZW5jb2RlKGVuY29kaW5nKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG91dCA9IHN0cmluZy5kZWNvZGUoZW5jb2RpbmcpCgogICAgcmV0dXJuIG91dAoKCmRlZiB1bmljb2RlX2lzX2FzY2lpKHVfc3RyaW5nKToKICAgICIiIkRldGVybWluZSBpZiB1bmljb2RlIHN0cmluZyBvbmx5IGNvbnRhaW5zIEFTQ0lJIGNoYXJhY3RlcnMuCgogICAgOnBhcmFtIHN0ciB1X3N0cmluZzogdW5pY29kZSBzdHJpbmcgdG8gY2hlY2suIE11c3QgYmUgdW5pY29kZQogICAgICAgIGFuZCBub3QgUHl0aG9uIDIgYHN0cmAuCiAgICA6cnR5cGU6IGJvb2wKICAgICIiIgogICAgYXNzZXJ0IGlzaW5zdGFuY2UodV9zdHJpbmcsIHN0cikKICAgIHRyeToKICAgICAgICB1X3N0cmluZy5lbmNvZGUoJ2FzY2lpJykKICAgICAgICByZXR1cm4gVHJ1ZQogICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICByZXR1cm4gRmFsc2UKUEsDBBQAAAAAAAAAIQAjUN5SGFIAABhSAAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2FkYXB0ZXJzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy5hZGFwdGVycwp+fn5+fn5+fn5+fn5+fn5+fgoKVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIHRyYW5zcG9ydCBhZGFwdGVycyB0aGF0IFJlcXVlc3RzIHVzZXMgdG8gZGVmaW5lCmFuZCBtYWludGFpbiBjb25uZWN0aW9ucy4KIiIiCgppbXBvcnQgb3MucGF0aAppbXBvcnQgc29ja2V0Cgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMucG9vbG1hbmFnZXIgaW1wb3J0IFBvb2xNYW5hZ2VyLCBwcm94eV9mcm9tX3VybApmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMucmVzcG9uc2UgaW1wb3J0IEhUVFBSZXNwb25zZQpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMudXRpbCBpbXBvcnQgVGltZW91dCBhcyBUaW1lb3V0U2F1Y2UKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLnV0aWwucmV0cnkgaW1wb3J0IFJldHJ5CmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBDbG9zZWRQb29sRXJyb3IKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IENvbm5lY3RUaW1lb3V0RXJyb3IKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IEhUVFBFcnJvciBhcyBfSFRUUEVycm9yCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBNYXhSZXRyeUVycm9yCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBOZXdDb25uZWN0aW9uRXJyb3IKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IFByb3h5RXJyb3IgYXMgX1Byb3h5RXJyb3IKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IFByb3RvY29sRXJyb3IKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IFJlYWRUaW1lb3V0RXJyb3IKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IFNTTEVycm9yIGFzIF9TU0xFcnJvcgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgUmVzcG9uc2VFcnJvcgoKZnJvbSAubW9kZWxzIGltcG9ydCBSZXNwb25zZQpmcm9tIC5jb21wYXQgaW1wb3J0IHVybHBhcnNlLCBiYXNlc3RyaW5nCmZyb20gLnV0aWxzIGltcG9ydCAoREVGQVVMVF9DQV9CVU5ETEVfUEFUSCwgZ2V0X2VuY29kaW5nX2Zyb21faGVhZGVycywKICAgICAgICAgICAgICAgICAgICBwcmVwZW5kX3NjaGVtZV9pZl9uZWVkZWQsIGdldF9hdXRoX2Zyb21fdXJsLCB1cmxkZWZyYWdhdXRoLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdF9wcm94eSkKZnJvbSAuc3RydWN0dXJlcyBpbXBvcnQgQ2FzZUluc2Vuc2l0aXZlRGljdApmcm9tIC5jb29raWVzIGltcG9ydCBleHRyYWN0X2Nvb2tpZXNfdG9famFyCmZyb20gLmV4Y2VwdGlvbnMgaW1wb3J0IChDb25uZWN0aW9uRXJyb3IsIENvbm5lY3RUaW1lb3V0LCBSZWFkVGltZW91dCwgU1NMRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBQcm94eUVycm9yLCBSZXRyeUVycm9yLCBJbnZhbGlkU2NoZW1hKQpmcm9tIC5hdXRoIGltcG9ydCBfYmFzaWNfYXV0aF9zdHIKCnRyeToKICAgIGZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5jb250cmliLnNvY2tzIGltcG9ydCBTT0NLU1Byb3h5TWFuYWdlcgpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBkZWYgU09DS1NQcm94eU1hbmFnZXIoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICByYWlzZSBJbnZhbGlkU2NoZW1hKCJNaXNzaW5nIGRlcGVuZGVuY2llcyBmb3IgU09DS1Mgc3VwcG9ydC4iKQoKREVGQVVMVF9QT09MQkxPQ0sgPSBGYWxzZQpERUZBVUxUX1BPT0xTSVpFID0gMTAKREVGQVVMVF9SRVRSSUVTID0gMApERUZBVUxUX1BPT0xfVElNRU9VVCA9IE5vbmUKCgpjbGFzcyBCYXNlQWRhcHRlcihvYmplY3QpOgogICAgIiIiVGhlIEJhc2UgVHJhbnNwb3J0IEFkYXB0ZXIiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoQmFzZUFkYXB0ZXIsIHNlbGYpLl9faW5pdF9fKCkKCiAgICBkZWYgc2VuZChzZWxmLCByZXF1ZXN0LCBzdHJlYW09RmFsc2UsIHRpbWVvdXQ9Tm9uZSwgdmVyaWZ5PVRydWUsCiAgICAgICAgICAgICBjZXJ0PU5vbmUsIHByb3hpZXM9Tm9uZSk6CiAgICAgICAgIiIiU2VuZHMgUHJlcGFyZWRSZXF1ZXN0IG9iamVjdC4gUmV0dXJucyBSZXNwb25zZSBvYmplY3QuCgogICAgICAgIDpwYXJhbSByZXF1ZXN0OiBUaGUgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3QgPFByZXBhcmVkUmVxdWVzdD5gIGJlaW5nIHNlbnQuCiAgICAgICAgOnBhcmFtIHN0cmVhbTogKG9wdGlvbmFsKSBXaGV0aGVyIHRvIHN0cmVhbSB0aGUgcmVxdWVzdCBjb250ZW50LgogICAgICAgIDpwYXJhbSB0aW1lb3V0OiAob3B0aW9uYWwpIEhvdyBsb25nIHRvIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gc2VuZAogICAgICAgICAgICBkYXRhIGJlZm9yZSBnaXZpbmcgdXAsIGFzIGEgZmxvYXQsIG9yIGEgOnJlZjpgKGNvbm5lY3QgdGltZW91dCwKICAgICAgICAgICAgcmVhZCB0aW1lb3V0KSA8dGltZW91dHM+YCB0dXBsZS4KICAgICAgICA6dHlwZSB0aW1lb3V0OiBmbG9hdCBvciB0dXBsZQogICAgICAgIDpwYXJhbSB2ZXJpZnk6IChvcHRpb25hbCkgRWl0aGVyIGEgYm9vbGVhbiwgaW4gd2hpY2ggY2FzZSBpdCBjb250cm9scyB3aGV0aGVyIHdlIHZlcmlmeQogICAgICAgICAgICB0aGUgc2VydmVyJ3MgVExTIGNlcnRpZmljYXRlLCBvciBhIHN0cmluZywgaW4gd2hpY2ggY2FzZSBpdCBtdXN0IGJlIGEgcGF0aAogICAgICAgICAgICB0byBhIENBIGJ1bmRsZSB0byB1c2UKICAgICAgICA6cGFyYW0gY2VydDogKG9wdGlvbmFsKSBBbnkgdXNlci1wcm92aWRlZCBTU0wgY2VydGlmaWNhdGUgdG8gYmUgdHJ1c3RlZC4KICAgICAgICA6cGFyYW0gcHJveGllczogKG9wdGlvbmFsKSBUaGUgcHJveGllcyBkaWN0aW9uYXJ5IHRvIGFwcGx5IHRvIHRoZSByZXF1ZXN0LgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIiIiQ2xlYW5zIHVwIGFkYXB0ZXIgc3BlY2lmaWMgaXRlbXMuIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKCmNsYXNzIEhUVFBBZGFwdGVyKEJhc2VBZGFwdGVyKToKICAgICIiIlRoZSBidWlsdC1pbiBIVFRQIEFkYXB0ZXIgZm9yIHVybGxpYjMuCgogICAgUHJvdmlkZXMgYSBnZW5lcmFsLWNhc2UgaW50ZXJmYWNlIGZvciBSZXF1ZXN0cyBzZXNzaW9ucyB0byBjb250YWN0IEhUVFAgYW5kCiAgICBIVFRQUyB1cmxzIGJ5IGltcGxlbWVudGluZyB0aGUgVHJhbnNwb3J0IEFkYXB0ZXIgaW50ZXJmYWNlLiBUaGlzIGNsYXNzIHdpbGwKICAgIHVzdWFsbHkgYmUgY3JlYXRlZCBieSB0aGUgOmNsYXNzOmBTZXNzaW9uIDxTZXNzaW9uPmAgY2xhc3MgdW5kZXIgdGhlCiAgICBjb3ZlcnMuCgogICAgOnBhcmFtIHBvb2xfY29ubmVjdGlvbnM6IFRoZSBudW1iZXIgb2YgdXJsbGliMyBjb25uZWN0aW9uIHBvb2xzIHRvIGNhY2hlLgogICAgOnBhcmFtIHBvb2xfbWF4c2l6ZTogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRvIHNhdmUgaW4gdGhlIHBvb2wuCiAgICA6cGFyYW0gbWF4X3JldHJpZXM6IFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGVhY2ggY29ubmVjdGlvbgogICAgICAgIHNob3VsZCBhdHRlbXB0LiBOb3RlLCB0aGlzIGFwcGxpZXMgb25seSB0byBmYWlsZWQgRE5TIGxvb2t1cHMsIHNvY2tldAogICAgICAgIGNvbm5lY3Rpb25zIGFuZCBjb25uZWN0aW9uIHRpbWVvdXRzLCBuZXZlciB0byByZXF1ZXN0cyB3aGVyZSBkYXRhIGhhcwogICAgICAgIG1hZGUgaXQgdG8gdGhlIHNlcnZlci4gQnkgZGVmYXVsdCwgUmVxdWVzdHMgZG9lcyBub3QgcmV0cnkgZmFpbGVkCiAgICAgICAgY29ubmVjdGlvbnMuIElmIHlvdSBuZWVkIGdyYW51bGFyIGNvbnRyb2wgb3ZlciB0aGUgY29uZGl0aW9ucyB1bmRlcgogICAgICAgIHdoaWNoIHdlIHJldHJ5IGEgcmVxdWVzdCwgaW1wb3J0IHVybGxpYjMncyBgYFJldHJ5YGAgY2xhc3MgYW5kIHBhc3MKICAgICAgICB0aGF0IGluc3RlYWQuCiAgICA6cGFyYW0gcG9vbF9ibG9jazogV2hldGhlciB0aGUgY29ubmVjdGlvbiBwb29sIHNob3VsZCBibG9jayBmb3IgY29ubmVjdGlvbnMuCgogICAgVXNhZ2U6OgoKICAgICAgPj4+IGltcG9ydCByZXF1ZXN0cwogICAgICA+Pj4gcyA9IHJlcXVlc3RzLlNlc3Npb24oKQogICAgICA+Pj4gYSA9IHJlcXVlc3RzLmFkYXB0ZXJzLkhUVFBBZGFwdGVyKG1heF9yZXRyaWVzPTMpCiAgICAgID4+PiBzLm1vdW50KCdodHRwOi8vJywgYSkKICAgICIiIgogICAgX19hdHRyc19fID0gWydtYXhfcmV0cmllcycsICdjb25maWcnLCAnX3Bvb2xfY29ubmVjdGlvbnMnLCAnX3Bvb2xfbWF4c2l6ZScsCiAgICAgICAgICAgICAgICAgJ19wb29sX2Jsb2NrJ10KCiAgICBkZWYgX19pbml0X18oc2VsZiwgcG9vbF9jb25uZWN0aW9ucz1ERUZBVUxUX1BPT0xTSVpFLAogICAgICAgICAgICAgICAgIHBvb2xfbWF4c2l6ZT1ERUZBVUxUX1BPT0xTSVpFLCBtYXhfcmV0cmllcz1ERUZBVUxUX1JFVFJJRVMsCiAgICAgICAgICAgICAgICAgcG9vbF9ibG9jaz1ERUZBVUxUX1BPT0xCTE9DSyk6CiAgICAgICAgaWYgbWF4X3JldHJpZXMgPT0gREVGQVVMVF9SRVRSSUVTOgogICAgICAgICAgICBzZWxmLm1heF9yZXRyaWVzID0gUmV0cnkoMCwgcmVhZD1GYWxzZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1heF9yZXRyaWVzID0gUmV0cnkuZnJvbV9pbnQobWF4X3JldHJpZXMpCiAgICAgICAgc2VsZi5jb25maWcgPSB7fQogICAgICAgIHNlbGYucHJveHlfbWFuYWdlciA9IHt9CgogICAgICAgIHN1cGVyKEhUVFBBZGFwdGVyLCBzZWxmKS5fX2luaXRfXygpCgogICAgICAgIHNlbGYuX3Bvb2xfY29ubmVjdGlvbnMgPSBwb29sX2Nvbm5lY3Rpb25zCiAgICAgICAgc2VsZi5fcG9vbF9tYXhzaXplID0gcG9vbF9tYXhzaXplCiAgICAgICAgc2VsZi5fcG9vbF9ibG9jayA9IHBvb2xfYmxvY2sKCiAgICAgICAgc2VsZi5pbml0X3Bvb2xtYW5hZ2VyKHBvb2xfY29ubmVjdGlvbnMsIHBvb2xfbWF4c2l6ZSwgYmxvY2s9cG9vbF9ibG9jaykKCiAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgogICAgICAgIHJldHVybiBkaWN0KChhdHRyLCBnZXRhdHRyKHNlbGYsIGF0dHIsIE5vbmUpKSBmb3IgYXR0ciBpbgogICAgICAgICAgICAgICAgICAgIHNlbGYuX19hdHRyc19fKQoKICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgogICAgICAgICMgQ2FuJ3QgaGFuZGxlIGJ5IGFkZGluZyAncHJveHlfbWFuYWdlcicgdG8gc2VsZi5fX2F0dHJzX18gYmVjYXVzZQogICAgICAgICMgc2VsZi5wb29sbWFuYWdlciB1c2VzIGEgbGFtYmRhIGZ1bmN0aW9uLCB3aGljaCBpc24ndCBwaWNrbGVhYmxlLgogICAgICAgIHNlbGYucHJveHlfbWFuYWdlciA9IHt9CiAgICAgICAgc2VsZi5jb25maWcgPSB7fQoKICAgICAgICBmb3IgYXR0ciwgdmFsdWUgaW4gc3RhdGUuaXRlbXMoKToKICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWx1ZSkKCiAgICAgICAgc2VsZi5pbml0X3Bvb2xtYW5hZ2VyKHNlbGYuX3Bvb2xfY29ubmVjdGlvbnMsIHNlbGYuX3Bvb2xfbWF4c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2s9c2VsZi5fcG9vbF9ibG9jaykKCiAgICBkZWYgaW5pdF9wb29sbWFuYWdlcihzZWxmLCBjb25uZWN0aW9ucywgbWF4c2l6ZSwgYmxvY2s9REVGQVVMVF9QT09MQkxPQ0ssICoqcG9vbF9rd2FyZ3MpOgogICAgICAgICIiIkluaXRpYWxpemVzIGEgdXJsbGliMyBQb29sTWFuYWdlci4KCiAgICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSB1c2VyIGNvZGUsIGFuZCBpcyBvbmx5CiAgICAgICAgZXhwb3NlZCBmb3IgdXNlIHdoZW4gc3ViY2xhc3NpbmcgdGhlCiAgICAgICAgOmNsYXNzOmBIVFRQQWRhcHRlciA8cmVxdWVzdHMuYWRhcHRlcnMuSFRUUEFkYXB0ZXI+YC4KCiAgICAgICAgOnBhcmFtIGNvbm5lY3Rpb25zOiBUaGUgbnVtYmVyIG9mIHVybGxpYjMgY29ubmVjdGlvbiBwb29scyB0byBjYWNoZS4KICAgICAgICA6cGFyYW0gbWF4c2l6ZTogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRvIHNhdmUgaW4gdGhlIHBvb2wuCiAgICAgICAgOnBhcmFtIGJsb2NrOiBCbG9jayB3aGVuIG5vIGZyZWUgY29ubmVjdGlvbnMgYXJlIGF2YWlsYWJsZS4KICAgICAgICA6cGFyYW0gcG9vbF9rd2FyZ3M6IEV4dHJhIGtleXdvcmQgYXJndW1lbnRzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgUG9vbCBNYW5hZ2VyLgogICAgICAgICIiIgogICAgICAgICMgc2F2ZSB0aGVzZSB2YWx1ZXMgZm9yIHBpY2tsaW5nCiAgICAgICAgc2VsZi5fcG9vbF9jb25uZWN0aW9ucyA9IGNvbm5lY3Rpb25zCiAgICAgICAgc2VsZi5fcG9vbF9tYXhzaXplID0gbWF4c2l6ZQogICAgICAgIHNlbGYuX3Bvb2xfYmxvY2sgPSBibG9jawoKICAgICAgICBzZWxmLnBvb2xtYW5hZ2VyID0gUG9vbE1hbmFnZXIobnVtX3Bvb2xzPWNvbm5lY3Rpb25zLCBtYXhzaXplPW1heHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrPWJsb2NrLCBzdHJpY3Q9VHJ1ZSwgKipwb29sX2t3YXJncykKCiAgICBkZWYgcHJveHlfbWFuYWdlcl9mb3Ioc2VsZiwgcHJveHksICoqcHJveHlfa3dhcmdzKToKICAgICAgICAiIiJSZXR1cm4gdXJsbGliMyBQcm94eU1hbmFnZXIgZm9yIHRoZSBnaXZlbiBwcm94eS4KCiAgICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSB1c2VyIGNvZGUsIGFuZCBpcyBvbmx5CiAgICAgICAgZXhwb3NlZCBmb3IgdXNlIHdoZW4gc3ViY2xhc3NpbmcgdGhlCiAgICAgICAgOmNsYXNzOmBIVFRQQWRhcHRlciA8cmVxdWVzdHMuYWRhcHRlcnMuSFRUUEFkYXB0ZXI+YC4KCiAgICAgICAgOnBhcmFtIHByb3h5OiBUaGUgcHJveHkgdG8gcmV0dXJuIGEgdXJsbGliMyBQcm94eU1hbmFnZXIgZm9yLgogICAgICAgIDpwYXJhbSBwcm94eV9rd2FyZ3M6IEV4dHJhIGtleXdvcmQgYXJndW1lbnRzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBQcm94eSBNYW5hZ2VyLgogICAgICAgIDpyZXR1cm5zOiBQcm94eU1hbmFnZXIKICAgICAgICA6cnR5cGU6IHVybGxpYjMuUHJveHlNYW5hZ2VyCiAgICAgICAgIiIiCiAgICAgICAgaWYgcHJveHkgaW4gc2VsZi5wcm94eV9tYW5hZ2VyOgogICAgICAgICAgICBtYW5hZ2VyID0gc2VsZi5wcm94eV9tYW5hZ2VyW3Byb3h5XQogICAgICAgIGVsaWYgcHJveHkubG93ZXIoKS5zdGFydHN3aXRoKCdzb2NrcycpOgogICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSBnZXRfYXV0aF9mcm9tX3VybChwcm94eSkKICAgICAgICAgICAgbWFuYWdlciA9IHNlbGYucHJveHlfbWFuYWdlcltwcm94eV0gPSBTT0NLU1Byb3h5TWFuYWdlcigKICAgICAgICAgICAgICAgIHByb3h5LAogICAgICAgICAgICAgICAgdXNlcm5hbWU9dXNlcm5hbWUsCiAgICAgICAgICAgICAgICBwYXNzd29yZD1wYXNzd29yZCwKICAgICAgICAgICAgICAgIG51bV9wb29scz1zZWxmLl9wb29sX2Nvbm5lY3Rpb25zLAogICAgICAgICAgICAgICAgbWF4c2l6ZT1zZWxmLl9wb29sX21heHNpemUsCiAgICAgICAgICAgICAgICBibG9jaz1zZWxmLl9wb29sX2Jsb2NrLAogICAgICAgICAgICAgICAgKipwcm94eV9rd2FyZ3MKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByb3h5X2hlYWRlcnMgPSBzZWxmLnByb3h5X2hlYWRlcnMocHJveHkpCiAgICAgICAgICAgIG1hbmFnZXIgPSBzZWxmLnByb3h5X21hbmFnZXJbcHJveHldID0gcHJveHlfZnJvbV91cmwoCiAgICAgICAgICAgICAgICBwcm94eSwKICAgICAgICAgICAgICAgIHByb3h5X2hlYWRlcnM9cHJveHlfaGVhZGVycywKICAgICAgICAgICAgICAgIG51bV9wb29scz1zZWxmLl9wb29sX2Nvbm5lY3Rpb25zLAogICAgICAgICAgICAgICAgbWF4c2l6ZT1zZWxmLl9wb29sX21heHNpemUsCiAgICAgICAgICAgICAgICBibG9jaz1zZWxmLl9wb29sX2Jsb2NrLAogICAgICAgICAgICAgICAgKipwcm94eV9rd2FyZ3MpCgogICAgICAgIHJldHVybiBtYW5hZ2VyCgogICAgZGVmIGNlcnRfdmVyaWZ5KHNlbGYsIGNvbm4sIHVybCwgdmVyaWZ5LCBjZXJ0KToKICAgICAgICAiIiJWZXJpZnkgYSBTU0wgY2VydGlmaWNhdGUuIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdXNlcgogICAgICAgIGNvZGUsIGFuZCBpcyBvbmx5IGV4cG9zZWQgZm9yIHVzZSB3aGVuIHN1YmNsYXNzaW5nIHRoZQogICAgICAgIDpjbGFzczpgSFRUUEFkYXB0ZXIgPHJlcXVlc3RzLmFkYXB0ZXJzLkhUVFBBZGFwdGVyPmAuCgogICAgICAgIDpwYXJhbSBjb25uOiBUaGUgdXJsbGliMyBjb25uZWN0aW9uIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGNlcnQuCiAgICAgICAgOnBhcmFtIHVybDogVGhlIHJlcXVlc3RlZCBVUkwuCiAgICAgICAgOnBhcmFtIHZlcmlmeTogRWl0aGVyIGEgYm9vbGVhbiwgaW4gd2hpY2ggY2FzZSBpdCBjb250cm9scyB3aGV0aGVyIHdlIHZlcmlmeQogICAgICAgICAgICB0aGUgc2VydmVyJ3MgVExTIGNlcnRpZmljYXRlLCBvciBhIHN0cmluZywgaW4gd2hpY2ggY2FzZSBpdCBtdXN0IGJlIGEgcGF0aAogICAgICAgICAgICB0byBhIENBIGJ1bmRsZSB0byB1c2UKICAgICAgICA6cGFyYW0gY2VydDogVGhlIFNTTCBjZXJ0aWZpY2F0ZSB0byB2ZXJpZnkuCiAgICAgICAgIiIiCiAgICAgICAgaWYgdXJsLmxvd2VyKCkuc3RhcnRzd2l0aCgnaHR0cHMnKSBhbmQgdmVyaWZ5OgoKICAgICAgICAgICAgY2VydF9sb2MgPSBOb25lCgogICAgICAgICAgICAjIEFsbG93IHNlbGYtc3BlY2lmaWVkIGNlcnQgbG9jYXRpb24uCiAgICAgICAgICAgIGlmIHZlcmlmeSBpcyBub3QgVHJ1ZToKICAgICAgICAgICAgICAgIGNlcnRfbG9jID0gdmVyaWZ5CgogICAgICAgICAgICBpZiBub3QgY2VydF9sb2M6CiAgICAgICAgICAgICAgICBjZXJ0X2xvYyA9IERFRkFVTFRfQ0FfQlVORExFX1BBVEgKCiAgICAgICAgICAgIGlmIG5vdCBjZXJ0X2xvYyBvciBub3Qgb3MucGF0aC5leGlzdHMoY2VydF9sb2MpOgogICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiQ291bGQgbm90IGZpbmQgYSBzdWl0YWJsZSBUTFMgQ0EgY2VydGlmaWNhdGUgYnVuZGxlLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHBhdGg6IHswfSIuZm9ybWF0KGNlcnRfbG9jKSkKCiAgICAgICAgICAgIGNvbm4uY2VydF9yZXFzID0gJ0NFUlRfUkVRVUlSRUQnCgogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihjZXJ0X2xvYyk6CiAgICAgICAgICAgICAgICBjb25uLmNhX2NlcnRzID0gY2VydF9sb2MKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNvbm4uY2FfY2VydF9kaXIgPSBjZXJ0X2xvYwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbm4uY2VydF9yZXFzID0gJ0NFUlRfTk9ORScKICAgICAgICAgICAgY29ubi5jYV9jZXJ0cyA9IE5vbmUKICAgICAgICAgICAgY29ubi5jYV9jZXJ0X2RpciA9IE5vbmUKCiAgICAgICAgaWYgY2VydDoKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2VydCwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgICAgICBjb25uLmNlcnRfZmlsZSA9IGNlcnRbMF0KICAgICAgICAgICAgICAgIGNvbm4ua2V5X2ZpbGUgPSBjZXJ0WzFdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBjb25uLmNlcnRfZmlsZSA9IGNlcnQKICAgICAgICAgICAgICAgIGNvbm4ua2V5X2ZpbGUgPSBOb25lCiAgICAgICAgICAgIGlmIGNvbm4uY2VydF9maWxlIGFuZCBub3Qgb3MucGF0aC5leGlzdHMoY29ubi5jZXJ0X2ZpbGUpOgogICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiQ291bGQgbm90IGZpbmQgdGhlIFRMUyBjZXJ0aWZpY2F0ZSBmaWxlLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHBhdGg6IHswfSIuZm9ybWF0KGNvbm4uY2VydF9maWxlKSkKICAgICAgICAgICAgaWYgY29ubi5rZXlfZmlsZSBhbmQgbm90IG9zLnBhdGguZXhpc3RzKGNvbm4ua2V5X2ZpbGUpOgogICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiQ291bGQgbm90IGZpbmQgdGhlIFRMUyBrZXkgZmlsZSwgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBwYXRoOiB7MH0iLmZvcm1hdChjb25uLmtleV9maWxlKSkKCiAgICBkZWYgYnVpbGRfcmVzcG9uc2Uoc2VsZiwgcmVxLCByZXNwKToKICAgICAgICAiIiJCdWlsZHMgYSA6Y2xhc3M6YFJlc3BvbnNlIDxyZXF1ZXN0cy5SZXNwb25zZT5gIG9iamVjdCBmcm9tIGEgdXJsbGliMwogICAgICAgIHJlc3BvbnNlLiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdXNlciBjb2RlLCBhbmQgaXMgb25seSBleHBvc2VkCiAgICAgICAgZm9yIHVzZSB3aGVuIHN1YmNsYXNzaW5nIHRoZQogICAgICAgIDpjbGFzczpgSFRUUEFkYXB0ZXIgPHJlcXVlc3RzLmFkYXB0ZXJzLkhUVFBBZGFwdGVyPmAKCiAgICAgICAgOnBhcmFtIHJlcTogVGhlIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCB1c2VkIHRvIGdlbmVyYXRlIHRoZSByZXNwb25zZS4KICAgICAgICA6cGFyYW0gcmVzcDogVGhlIHVybGxpYjMgcmVzcG9uc2Ugb2JqZWN0LgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKICAgICAgICByZXNwb25zZSA9IFJlc3BvbnNlKCkKCiAgICAgICAgIyBGYWxsYmFjayB0byBOb25lIGlmIHRoZXJlJ3Mgbm8gc3RhdHVzX2NvZGUsIGZvciB3aGF0ZXZlciByZWFzb24uCiAgICAgICAgcmVzcG9uc2Uuc3RhdHVzX2NvZGUgPSBnZXRhdHRyKHJlc3AsICdzdGF0dXMnLCBOb25lKQoKICAgICAgICAjIE1ha2UgaGVhZGVycyBjYXNlLWluc2Vuc2l0aXZlLgogICAgICAgIHJlc3BvbnNlLmhlYWRlcnMgPSBDYXNlSW5zZW5zaXRpdmVEaWN0KGdldGF0dHIocmVzcCwgJ2hlYWRlcnMnLCB7fSkpCgogICAgICAgICMgU2V0IGVuY29kaW5nLgogICAgICAgIHJlc3BvbnNlLmVuY29kaW5nID0gZ2V0X2VuY29kaW5nX2Zyb21faGVhZGVycyhyZXNwb25zZS5oZWFkZXJzKQogICAgICAgIHJlc3BvbnNlLnJhdyA9IHJlc3AKICAgICAgICByZXNwb25zZS5yZWFzb24gPSByZXNwb25zZS5yYXcucmVhc29uCgogICAgICAgIGlmIGlzaW5zdGFuY2UocmVxLnVybCwgYnl0ZXMpOgogICAgICAgICAgICByZXNwb25zZS51cmwgPSByZXEudXJsLmRlY29kZSgndXRmLTgnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3BvbnNlLnVybCA9IHJlcS51cmwKCiAgICAgICAgIyBBZGQgbmV3IGNvb2tpZXMgZnJvbSB0aGUgc2VydmVyLgogICAgICAgIGV4dHJhY3RfY29va2llc190b19qYXIocmVzcG9uc2UuY29va2llcywgcmVxLCByZXNwKQoKICAgICAgICAjIEdpdmUgdGhlIFJlc3BvbnNlIHNvbWUgY29udGV4dC4KICAgICAgICByZXNwb25zZS5yZXF1ZXN0ID0gcmVxCiAgICAgICAgcmVzcG9uc2UuY29ubmVjdGlvbiA9IHNlbGYKCiAgICAgICAgcmV0dXJuIHJlc3BvbnNlCgogICAgZGVmIGdldF9jb25uZWN0aW9uKHNlbGYsIHVybCwgcHJveGllcz1Ob25lKToKICAgICAgICAiIiJSZXR1cm5zIGEgdXJsbGliMyBjb25uZWN0aW9uIGZvciB0aGUgZ2l2ZW4gVVJMLiBUaGlzIHNob3VsZCBub3QgYmUKICAgICAgICBjYWxsZWQgZnJvbSB1c2VyIGNvZGUsIGFuZCBpcyBvbmx5IGV4cG9zZWQgZm9yIHVzZSB3aGVuIHN1YmNsYXNzaW5nIHRoZQogICAgICAgIDpjbGFzczpgSFRUUEFkYXB0ZXIgPHJlcXVlc3RzLmFkYXB0ZXJzLkhUVFBBZGFwdGVyPmAuCgogICAgICAgIDpwYXJhbSB1cmw6IFRoZSBVUkwgdG8gY29ubmVjdCB0by4KICAgICAgICA6cGFyYW0gcHJveGllczogKG9wdGlvbmFsKSBBIFJlcXVlc3RzLXN0eWxlIGRpY3Rpb25hcnkgb2YgcHJveGllcyB1c2VkIG9uIHRoaXMgcmVxdWVzdC4KICAgICAgICA6cnR5cGU6IHVybGxpYjMuQ29ubmVjdGlvblBvb2wKICAgICAgICAiIiIKICAgICAgICBwcm94eSA9IHNlbGVjdF9wcm94eSh1cmwsIHByb3hpZXMpCgogICAgICAgIGlmIHByb3h5OgogICAgICAgICAgICBwcm94eSA9IHByZXBlbmRfc2NoZW1lX2lmX25lZWRlZChwcm94eSwgJ2h0dHAnKQogICAgICAgICAgICBwcm94eV9tYW5hZ2VyID0gc2VsZi5wcm94eV9tYW5hZ2VyX2Zvcihwcm94eSkKICAgICAgICAgICAgY29ubiA9IHByb3h5X21hbmFnZXIuY29ubmVjdGlvbl9mcm9tX3VybCh1cmwpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBPbmx5IHNjaGVtZSBzaG91bGQgYmUgbG93ZXIgY2FzZQogICAgICAgICAgICBwYXJzZWQgPSB1cmxwYXJzZSh1cmwpCiAgICAgICAgICAgIHVybCA9IHBhcnNlZC5nZXR1cmwoKQogICAgICAgICAgICBjb25uID0gc2VsZi5wb29sbWFuYWdlci5jb25uZWN0aW9uX2Zyb21fdXJsKHVybCkKCiAgICAgICAgcmV0dXJuIGNvbm4KCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIiIiRGlzcG9zZXMgb2YgYW55IGludGVybmFsIHN0YXRlLgoKICAgICAgICBDdXJyZW50bHksIHRoaXMgY2xvc2VzIHRoZSBQb29sTWFuYWdlciBhbmQgYW55IGFjdGl2ZSBQcm94eU1hbmFnZXIsCiAgICAgICAgd2hpY2ggY2xvc2VzIGFueSBwb29sZWQgY29ubmVjdGlvbnMuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5wb29sbWFuYWdlci5jbGVhcigpCiAgICAgICAgZm9yIHByb3h5IGluIHNlbGYucHJveHlfbWFuYWdlci52YWx1ZXMoKToKICAgICAgICAgICAgcHJveHkuY2xlYXIoKQoKICAgIGRlZiByZXF1ZXN0X3VybChzZWxmLCByZXF1ZXN0LCBwcm94aWVzKToKICAgICAgICAiIiJPYnRhaW4gdGhlIHVybCB0byB1c2Ugd2hlbiBtYWtpbmcgdGhlIGZpbmFsIHJlcXVlc3QuCgogICAgICAgIElmIHRoZSBtZXNzYWdlIGlzIGJlaW5nIHNlbnQgdGhyb3VnaCBhIEhUVFAgcHJveHksIHRoZSBmdWxsIFVSTCBoYXMgdG8KICAgICAgICBiZSB1c2VkLiBPdGhlcndpc2UsIHdlIHNob3VsZCBvbmx5IHVzZSB0aGUgcGF0aCBwb3J0aW9uIG9mIHRoZSBVUkwuCgogICAgICAgIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSB1c2VyIGNvZGUsIGFuZCBpcyBvbmx5IGV4cG9zZWQgZm9yIHVzZQogICAgICAgIHdoZW4gc3ViY2xhc3NpbmcgdGhlCiAgICAgICAgOmNsYXNzOmBIVFRQQWRhcHRlciA8cmVxdWVzdHMuYWRhcHRlcnMuSFRUUEFkYXB0ZXI+YC4KCiAgICAgICAgOnBhcmFtIHJlcXVlc3Q6IFRoZSA6Y2xhc3M6YFByZXBhcmVkUmVxdWVzdCA8UHJlcGFyZWRSZXF1ZXN0PmAgYmVpbmcgc2VudC4KICAgICAgICA6cGFyYW0gcHJveGllczogQSBkaWN0aW9uYXJ5IG9mIHNjaGVtZXMgb3Igc2NoZW1lcyBhbmQgaG9zdHMgdG8gcHJveHkgVVJMcy4KICAgICAgICA6cnR5cGU6IHN0cgogICAgICAgICIiIgogICAgICAgIHByb3h5ID0gc2VsZWN0X3Byb3h5KHJlcXVlc3QudXJsLCBwcm94aWVzKQogICAgICAgIHNjaGVtZSA9IHVybHBhcnNlKHJlcXVlc3QudXJsKS5zY2hlbWUKCiAgICAgICAgaXNfcHJveGllZF9odHRwX3JlcXVlc3QgPSAocHJveHkgYW5kIHNjaGVtZSAhPSAnaHR0cHMnKQogICAgICAgIHVzaW5nX3NvY2tzX3Byb3h5ID0gRmFsc2UKICAgICAgICBpZiBwcm94eToKICAgICAgICAgICAgcHJveHlfc2NoZW1lID0gdXJscGFyc2UocHJveHkpLnNjaGVtZS5sb3dlcigpCiAgICAgICAgICAgIHVzaW5nX3NvY2tzX3Byb3h5ID0gcHJveHlfc2NoZW1lLnN0YXJ0c3dpdGgoJ3NvY2tzJykKCiAgICAgICAgdXJsID0gcmVxdWVzdC5wYXRoX3VybAogICAgICAgIGlmIGlzX3Byb3hpZWRfaHR0cF9yZXF1ZXN0IGFuZCBub3QgdXNpbmdfc29ja3NfcHJveHk6CiAgICAgICAgICAgIHVybCA9IHVybGRlZnJhZ2F1dGgocmVxdWVzdC51cmwpCgogICAgICAgIHJldHVybiB1cmwKCiAgICBkZWYgYWRkX2hlYWRlcnMoc2VsZiwgcmVxdWVzdCwgKiprd2FyZ3MpOgogICAgICAgICIiIkFkZCBhbnkgaGVhZGVycyBuZWVkZWQgYnkgdGhlIGNvbm5lY3Rpb24uIEFzIG9mIHYyLjAgdGhpcyBkb2VzCiAgICAgICAgbm90aGluZyBieSBkZWZhdWx0LCBidXQgaXMgbGVmdCBmb3Igb3ZlcnJpZGluZyBieSB1c2VycyB0aGF0IHN1YmNsYXNzCiAgICAgICAgdGhlIDpjbGFzczpgSFRUUEFkYXB0ZXIgPHJlcXVlc3RzLmFkYXB0ZXJzLkhUVFBBZGFwdGVyPmAuCgogICAgICAgIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSB1c2VyIGNvZGUsIGFuZCBpcyBvbmx5IGV4cG9zZWQgZm9yIHVzZQogICAgICAgIHdoZW4gc3ViY2xhc3NpbmcgdGhlCiAgICAgICAgOmNsYXNzOmBIVFRQQWRhcHRlciA8cmVxdWVzdHMuYWRhcHRlcnMuSFRUUEFkYXB0ZXI+YC4KCiAgICAgICAgOnBhcmFtIHJlcXVlc3Q6IFRoZSA6Y2xhc3M6YFByZXBhcmVkUmVxdWVzdCA8UHJlcGFyZWRSZXF1ZXN0PmAgdG8gYWRkIGhlYWRlcnMgdG8uCiAgICAgICAgOnBhcmFtIGt3YXJnczogVGhlIGtleXdvcmQgYXJndW1lbnRzIGZyb20gdGhlIGNhbGwgdG8gc2VuZCgpLgogICAgICAgICIiIgogICAgICAgIHBhc3MKCiAgICBkZWYgcHJveHlfaGVhZGVycyhzZWxmLCBwcm94eSk6CiAgICAgICAgIiIiUmV0dXJucyBhIGRpY3Rpb25hcnkgb2YgdGhlIGhlYWRlcnMgdG8gYWRkIHRvIGFueSByZXF1ZXN0IHNlbnQKICAgICAgICB0aHJvdWdoIGEgcHJveHkuIFRoaXMgd29ya3Mgd2l0aCB1cmxsaWIzIG1hZ2ljIHRvIGVuc3VyZSB0aGF0IHRoZXkgYXJlCiAgICAgICAgY29ycmVjdGx5IHNlbnQgdG8gdGhlIHByb3h5LCByYXRoZXIgdGhhbiBpbiBhIHR1bm5lbGxlZCByZXF1ZXN0IGlmCiAgICAgICAgQ09OTkVDVCBpcyBiZWluZyB1c2VkLgoKICAgICAgICBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdXNlciBjb2RlLCBhbmQgaXMgb25seSBleHBvc2VkIGZvciB1c2UKICAgICAgICB3aGVuIHN1YmNsYXNzaW5nIHRoZQogICAgICAgIDpjbGFzczpgSFRUUEFkYXB0ZXIgPHJlcXVlc3RzLmFkYXB0ZXJzLkhUVFBBZGFwdGVyPmAuCgogICAgICAgIDpwYXJhbSBwcm94aWVzOiBUaGUgdXJsIG9mIHRoZSBwcm94eSBiZWluZyB1c2VkIGZvciB0aGlzIHJlcXVlc3QuCiAgICAgICAgOnJ0eXBlOiBkaWN0CiAgICAgICAgIiIiCiAgICAgICAgaGVhZGVycyA9IHt9CiAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gZ2V0X2F1dGhfZnJvbV91cmwocHJveHkpCgogICAgICAgIGlmIHVzZXJuYW1lOgogICAgICAgICAgICBoZWFkZXJzWydQcm94eS1BdXRob3JpemF0aW9uJ10gPSBfYmFzaWNfYXV0aF9zdHIodXNlcm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCkKCiAgICAgICAgcmV0dXJuIGhlYWRlcnMKCiAgICBkZWYgc2VuZChzZWxmLCByZXF1ZXN0LCBzdHJlYW09RmFsc2UsIHRpbWVvdXQ9Tm9uZSwgdmVyaWZ5PVRydWUsIGNlcnQ9Tm9uZSwgcHJveGllcz1Ob25lKToKICAgICAgICAiIiJTZW5kcyBQcmVwYXJlZFJlcXVlc3Qgb2JqZWN0LiBSZXR1cm5zIFJlc3BvbnNlIG9iamVjdC4KCiAgICAgICAgOnBhcmFtIHJlcXVlc3Q6IFRoZSA6Y2xhc3M6YFByZXBhcmVkUmVxdWVzdCA8UHJlcGFyZWRSZXF1ZXN0PmAgYmVpbmcgc2VudC4KICAgICAgICA6cGFyYW0gc3RyZWFtOiAob3B0aW9uYWwpIFdoZXRoZXIgdG8gc3RyZWFtIHRoZSByZXF1ZXN0IGNvbnRlbnQuCiAgICAgICAgOnBhcmFtIHRpbWVvdXQ6IChvcHRpb25hbCkgSG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIHNlcnZlciB0byBzZW5kCiAgICAgICAgICAgIGRhdGEgYmVmb3JlIGdpdmluZyB1cCwgYXMgYSBmbG9hdCwgb3IgYSA6cmVmOmAoY29ubmVjdCB0aW1lb3V0LAogICAgICAgICAgICByZWFkIHRpbWVvdXQpIDx0aW1lb3V0cz5gIHR1cGxlLgogICAgICAgIDp0eXBlIHRpbWVvdXQ6IGZsb2F0IG9yIHR1cGxlIG9yIHVybGxpYjMgVGltZW91dCBvYmplY3QKICAgICAgICA6cGFyYW0gdmVyaWZ5OiAob3B0aW9uYWwpIEVpdGhlciBhIGJvb2xlYW4sIGluIHdoaWNoIGNhc2UgaXQgY29udHJvbHMgd2hldGhlcgogICAgICAgICAgICB3ZSB2ZXJpZnkgdGhlIHNlcnZlcidzIFRMUyBjZXJ0aWZpY2F0ZSwgb3IgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgaXQKICAgICAgICAgICAgbXVzdCBiZSBhIHBhdGggdG8gYSBDQSBidW5kbGUgdG8gdXNlCiAgICAgICAgOnBhcmFtIGNlcnQ6IChvcHRpb25hbCkgQW55IHVzZXItcHJvdmlkZWQgU1NMIGNlcnRpZmljYXRlIHRvIGJlIHRydXN0ZWQuCiAgICAgICAgOnBhcmFtIHByb3hpZXM6IChvcHRpb25hbCkgVGhlIHByb3hpZXMgZGljdGlvbmFyeSB0byBhcHBseSB0byB0aGUgcmVxdWVzdC4KICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCgogICAgICAgIGNvbm4gPSBzZWxmLmdldF9jb25uZWN0aW9uKHJlcXVlc3QudXJsLCBwcm94aWVzKQoKICAgICAgICBzZWxmLmNlcnRfdmVyaWZ5KGNvbm4sIHJlcXVlc3QudXJsLCB2ZXJpZnksIGNlcnQpCiAgICAgICAgdXJsID0gc2VsZi5yZXF1ZXN0X3VybChyZXF1ZXN0LCBwcm94aWVzKQogICAgICAgIHNlbGYuYWRkX2hlYWRlcnMocmVxdWVzdCkKCiAgICAgICAgY2h1bmtlZCA9IG5vdCAocmVxdWVzdC5ib2R5IGlzIE5vbmUgb3IgJ0NvbnRlbnQtTGVuZ3RoJyBpbiByZXF1ZXN0LmhlYWRlcnMpCgogICAgICAgIGlmIGlzaW5zdGFuY2UodGltZW91dCwgdHVwbGUpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjb25uZWN0LCByZWFkID0gdGltZW91dAogICAgICAgICAgICAgICAgdGltZW91dCA9IFRpbWVvdXRTYXVjZShjb25uZWN0PWNvbm5lY3QsIHJlYWQ9cmVhZCkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICMgdGhpcyBtYXkgcmFpc2UgYSBzdHJpbmcgZm9ybWF0dGluZyBlcnJvci4KICAgICAgICAgICAgICAgIGVyciA9ICgiSW52YWxpZCB0aW1lb3V0IHswfS4gUGFzcyBhIChjb25uZWN0LCByZWFkKSAiCiAgICAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQgdHVwbGUsIG9yIGEgc2luZ2xlIGZsb2F0IHRvIHNldCAiCiAgICAgICAgICAgICAgICAgICAgICAgImJvdGggdGltZW91dHMgdG8gdGhlIHNhbWUgdmFsdWUiLmZvcm1hdCh0aW1lb3V0KSkKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZXJyKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZSh0aW1lb3V0LCBUaW1lb3V0U2F1Y2UpOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdGltZW91dCA9IFRpbWVvdXRTYXVjZShjb25uZWN0PXRpbWVvdXQsIHJlYWQ9dGltZW91dCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBub3QgY2h1bmtlZDoKICAgICAgICAgICAgICAgIHJlc3AgPSBjb25uLnVybG9wZW4oCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kPXJlcXVlc3QubWV0aG9kLAogICAgICAgICAgICAgICAgICAgIHVybD11cmwsCiAgICAgICAgICAgICAgICAgICAgYm9keT1yZXF1ZXN0LmJvZHksCiAgICAgICAgICAgICAgICAgICAgaGVhZGVycz1yZXF1ZXN0LmhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Q9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0X3NhbWVfaG9zdD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICBwcmVsb2FkX2NvbnRlbnQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2NvbnRlbnQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgcmV0cmllcz1zZWxmLm1heF9yZXRyaWVzLAogICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9dGltZW91dAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgIyBTZW5kIHRoZSByZXF1ZXN0LgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgaGFzYXR0cihjb25uLCAncHJveHlfcG9vbCcpOgogICAgICAgICAgICAgICAgICAgIGNvbm4gPSBjb25uLnByb3h5X3Bvb2wKCiAgICAgICAgICAgICAgICBsb3dfY29ubiA9IGNvbm4uX2dldF9jb25uKHRpbWVvdXQ9REVGQVVMVF9QT09MX1RJTUVPVVQpCgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGxvd19jb25uLnB1dHJlcXVlc3QocmVxdWVzdC5tZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwX2FjY2VwdF9lbmNvZGluZz1UcnVlKQoKICAgICAgICAgICAgICAgICAgICBmb3IgaGVhZGVyLCB2YWx1ZSBpbiByZXF1ZXN0LmhlYWRlcnMuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgbG93X2Nvbm4ucHV0aGVhZGVyKGhlYWRlciwgdmFsdWUpCgogICAgICAgICAgICAgICAgICAgIGxvd19jb25uLmVuZGhlYWRlcnMoKQoKICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXF1ZXN0LmJvZHk6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvd19jb25uLnNlbmQoaGV4KGxlbihpKSlbMjpdLmVuY29kZSgndXRmLTgnKSkKICAgICAgICAgICAgICAgICAgICAgICAgbG93X2Nvbm4uc2VuZChiJ1xyXG4nKQogICAgICAgICAgICAgICAgICAgICAgICBsb3dfY29ubi5zZW5kKGkpCiAgICAgICAgICAgICAgICAgICAgICAgIGxvd19jb25uLnNlbmQoYidcclxuJykKICAgICAgICAgICAgICAgICAgICBsb3dfY29ubi5zZW5kKGInMFxyXG5cclxuJykKCiAgICAgICAgICAgICAgICAgICAgIyBSZWNlaXZlIHRoZSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICMgRm9yIFB5dGhvbiAyLjcrIHZlcnNpb25zLCB1c2UgYnVmZmVyaW5nIG9mIEhUVFAKICAgICAgICAgICAgICAgICAgICAgICAgIyByZXNwb25zZXMKICAgICAgICAgICAgICAgICAgICAgICAgciA9IGxvd19jb25uLmdldHJlc3BvbnNlKGJ1ZmZlcmluZz1UcnVlKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICMgRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQeXRob24gMi42IHZlcnNpb25zIGFuZCBiYWNrCiAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBsb3dfY29ubi5nZXRyZXNwb25zZSgpCgogICAgICAgICAgICAgICAgICAgIHJlc3AgPSBIVFRQUmVzcG9uc2UuZnJvbV9odHRwbGliKAogICAgICAgICAgICAgICAgICAgICAgICByLAogICAgICAgICAgICAgICAgICAgICAgICBwb29sPWNvbm4sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb249bG93X2Nvbm4sCiAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRfY29udGVudD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2NvbnRlbnQ9RmFsc2UKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICAgICAgIyBJZiB3ZSBoaXQgYW55IHByb2JsZW1zIGhlcmUsIGNsZWFuIHVwIHRoZSBjb25uZWN0aW9uLgogICAgICAgICAgICAgICAgICAgICMgVGhlbiwgcmVyYWlzZSBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgdGhlIGFjdHVhbCBleGNlcHRpb24uCiAgICAgICAgICAgICAgICAgICAgbG93X2Nvbm4uY2xvc2UoKQogICAgICAgICAgICAgICAgICAgIHJhaXNlCgogICAgICAgIGV4Y2VwdCAoUHJvdG9jb2xFcnJvciwgc29ja2V0LmVycm9yKSBhcyBlcnI6CiAgICAgICAgICAgIHJhaXNlIENvbm5lY3Rpb25FcnJvcihlcnIsIHJlcXVlc3Q9cmVxdWVzdCkKCiAgICAgICAgZXhjZXB0IE1heFJldHJ5RXJyb3IgYXMgZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlLnJlYXNvbiwgQ29ubmVjdFRpbWVvdXRFcnJvcik6CiAgICAgICAgICAgICAgICAjIFRPRE86IFJlbW92ZSB0aGlzIGluIDMuMC4wOiBzZWUgIzI4MTEKICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGUucmVhc29uLCBOZXdDb25uZWN0aW9uRXJyb3IpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbm5lY3RUaW1lb3V0KGUsIHJlcXVlc3Q9cmVxdWVzdCkKCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZS5yZWFzb24sIFJlc3BvbnNlRXJyb3IpOgogICAgICAgICAgICAgICAgcmFpc2UgUmV0cnlFcnJvcihlLCByZXF1ZXN0PXJlcXVlc3QpCgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGUucmVhc29uLCBfUHJveHlFcnJvcik6CiAgICAgICAgICAgICAgICByYWlzZSBQcm94eUVycm9yKGUsIHJlcXVlc3Q9cmVxdWVzdCkKCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZS5yZWFzb24sIF9TU0xFcnJvcik6CiAgICAgICAgICAgICAgICAjIFRoaXMgYnJhbmNoIGlzIGZvciB1cmxsaWIzIHYxLjIyIGFuZCBsYXRlci4KICAgICAgICAgICAgICAgIHJhaXNlIFNTTEVycm9yKGUsIHJlcXVlc3Q9cmVxdWVzdCkKCiAgICAgICAgICAgIHJhaXNlIENvbm5lY3Rpb25FcnJvcihlLCByZXF1ZXN0PXJlcXVlc3QpCgogICAgICAgIGV4Y2VwdCBDbG9zZWRQb29sRXJyb3IgYXMgZToKICAgICAgICAgICAgcmFpc2UgQ29ubmVjdGlvbkVycm9yKGUsIHJlcXVlc3Q9cmVxdWVzdCkKCiAgICAgICAgZXhjZXB0IF9Qcm94eUVycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIFByb3h5RXJyb3IoZSkKCiAgICAgICAgZXhjZXB0IChfU1NMRXJyb3IsIF9IVFRQRXJyb3IpIGFzIGU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZSwgX1NTTEVycm9yKToKICAgICAgICAgICAgICAgICMgVGhpcyBicmFuY2ggaXMgZm9yIHVybGxpYjMgdmVyc2lvbnMgZWFybGllciB0aGFuIHYxLjIyCiAgICAgICAgICAgICAgICByYWlzZSBTU0xFcnJvcihlLCByZXF1ZXN0PXJlcXVlc3QpCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShlLCBSZWFkVGltZW91dEVycm9yKToKICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRUaW1lb3V0KGUsIHJlcXVlc3Q9cmVxdWVzdCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlCgogICAgICAgIHJldHVybiBzZWxmLmJ1aWxkX3Jlc3BvbnNlKHJlcXVlc3QsIHJlc3ApClBLAwQUAAAAAAAAACEAmGPoL10YAABdGAAAKwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9hcGkucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLmFwaQp+fn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIFJlcXVlc3RzIEFQSS4KCjpjb3B5cmlnaHQ6IChjKSAyMDEyIGJ5IEtlbm5ldGggUmVpdHouCjpsaWNlbnNlOiBBcGFjaGUyLCBzZWUgTElDRU5TRSBmb3IgbW9yZSBkZXRhaWxzLgoiIiIKCmZyb20gLiBpbXBvcnQgc2Vzc2lvbnMKCgpkZWYgcmVxdWVzdChtZXRob2QsIHVybCwgKiprd2FyZ3MpOgogICAgIiIiQ29uc3RydWN0cyBhbmQgc2VuZHMgYSA6Y2xhc3M6YFJlcXVlc3QgPFJlcXVlc3Q+YC4KCiAgICA6cGFyYW0gbWV0aG9kOiBtZXRob2QgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICA6cGFyYW0gcGFyYW1zOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgb3IgYnl0ZXMgdG8gYmUgc2VudCBpbiB0aGUgcXVlcnkgc3RyaW5nIGZvciB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBkYXRhOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgb3IgbGlzdCBvZiB0dXBsZXMgYGBbKGtleSwgdmFsdWUpXWBgICh3aWxsIGJlIGZvcm0tZW5jb2RlZCksIGJ5dGVzLCBvciBmaWxlLWxpa2Ugb2JqZWN0IHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICA6cGFyYW0ganNvbjogKG9wdGlvbmFsKSBqc29uIGRhdGEgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBoZWFkZXJzOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgb2YgSFRUUCBIZWFkZXJzIHRvIHNlbmQgd2l0aCB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBjb29raWVzOiAob3B0aW9uYWwpIERpY3Qgb3IgQ29va2llSmFyIG9iamVjdCB0byBzZW5kIHdpdGggdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICA6cGFyYW0gZmlsZXM6IChvcHRpb25hbCkgRGljdGlvbmFyeSBvZiBgYCduYW1lJzogZmlsZS1saWtlLW9iamVjdHNgYCAob3IgYGB7J25hbWUnOiBmaWxlLXR1cGxlfWBgKSBmb3IgbXVsdGlwYXJ0IGVuY29kaW5nIHVwbG9hZC4KICAgICAgICBgYGZpbGUtdHVwbGVgYCBjYW4gYmUgYSAyLXR1cGxlIGBgKCdmaWxlbmFtZScsIGZpbGVvYmopYGAsIDMtdHVwbGUgYGAoJ2ZpbGVuYW1lJywgZmlsZW9iaiwgJ2NvbnRlbnRfdHlwZScpYGAKICAgICAgICBvciBhIDQtdHVwbGUgYGAoJ2ZpbGVuYW1lJywgZmlsZW9iaiwgJ2NvbnRlbnRfdHlwZScsIGN1c3RvbV9oZWFkZXJzKWBgLCB3aGVyZSBgYCdjb250ZW50LXR5cGUnYGAgaXMgYSBzdHJpbmcKICAgICAgICBkZWZpbmluZyB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBnaXZlbiBmaWxlIGFuZCBgYGN1c3RvbV9oZWFkZXJzYGAgYSBkaWN0LWxpa2Ugb2JqZWN0IGNvbnRhaW5pbmcgYWRkaXRpb25hbCBoZWFkZXJzCiAgICAgICAgdG8gYWRkIGZvciB0aGUgZmlsZS4KICAgIDpwYXJhbSBhdXRoOiAob3B0aW9uYWwpIEF1dGggdHVwbGUgdG8gZW5hYmxlIEJhc2ljL0RpZ2VzdC9DdXN0b20gSFRUUCBBdXRoLgogICAgOnBhcmFtIHRpbWVvdXQ6IChvcHRpb25hbCkgSG93IG1hbnkgc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgc2VydmVyIHRvIHNlbmQgZGF0YQogICAgICAgIGJlZm9yZSBnaXZpbmcgdXAsIGFzIGEgZmxvYXQsIG9yIGEgOnJlZjpgKGNvbm5lY3QgdGltZW91dCwgcmVhZAogICAgICAgIHRpbWVvdXQpIDx0aW1lb3V0cz5gIHR1cGxlLgogICAgOnR5cGUgdGltZW91dDogZmxvYXQgb3IgdHVwbGUKICAgIDpwYXJhbSBhbGxvd19yZWRpcmVjdHM6IChvcHRpb25hbCkgQm9vbGVhbi4gRW5hYmxlL2Rpc2FibGUgR0VUL09QVElPTlMvUE9TVC9QVVQvUEFUQ0gvREVMRVRFL0hFQUQgcmVkaXJlY3Rpb24uIERlZmF1bHRzIHRvIGBgVHJ1ZWBgLgogICAgOnR5cGUgYWxsb3dfcmVkaXJlY3RzOiBib29sCiAgICA6cGFyYW0gcHJveGllczogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5IG1hcHBpbmcgcHJvdG9jb2wgdG8gdGhlIFVSTCBvZiB0aGUgcHJveHkuCiAgICA6cGFyYW0gdmVyaWZ5OiAob3B0aW9uYWwpIEVpdGhlciBhIGJvb2xlYW4sIGluIHdoaWNoIGNhc2UgaXQgY29udHJvbHMgd2hldGhlciB3ZSB2ZXJpZnkKICAgICAgICAgICAgdGhlIHNlcnZlcidzIFRMUyBjZXJ0aWZpY2F0ZSwgb3IgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgaXQgbXVzdCBiZSBhIHBhdGgKICAgICAgICAgICAgdG8gYSBDQSBidW5kbGUgdG8gdXNlLiBEZWZhdWx0cyB0byBgYFRydWVgYC4KICAgIDpwYXJhbSBzdHJlYW06IChvcHRpb25hbCkgaWYgYGBGYWxzZWBgLCB0aGUgcmVzcG9uc2UgY29udGVudCB3aWxsIGJlIGltbWVkaWF0ZWx5IGRvd25sb2FkZWQuCiAgICA6cGFyYW0gY2VydDogKG9wdGlvbmFsKSBpZiBTdHJpbmcsIHBhdGggdG8gc3NsIGNsaWVudCBjZXJ0IGZpbGUgKC5wZW0pLiBJZiBUdXBsZSwgKCdjZXJ0JywgJ2tleScpIHBhaXIuCiAgICA6cmV0dXJuOiA6Y2xhc3M6YFJlc3BvbnNlIDxSZXNwb25zZT5gIG9iamVjdAogICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQoKICAgIFVzYWdlOjoKCiAgICAgID4+PiBpbXBvcnQgcmVxdWVzdHMKICAgICAgPj4+IHJlcSA9IHJlcXVlc3RzLnJlcXVlc3QoJ0dFVCcsICdodHRwOi8vaHR0cGJpbi5vcmcvZ2V0JykKICAgICAgPFJlc3BvbnNlIFsyMDBdPgogICAgIiIiCgogICAgIyBCeSB1c2luZyB0aGUgJ3dpdGgnIHN0YXRlbWVudCB3ZSBhcmUgc3VyZSB0aGUgc2Vzc2lvbiBpcyBjbG9zZWQsIHRodXMgd2UKICAgICMgYXZvaWQgbGVhdmluZyBzb2NrZXRzIG9wZW4gd2hpY2ggY2FuIHRyaWdnZXIgYSBSZXNvdXJjZVdhcm5pbmcgaW4gc29tZQogICAgIyBjYXNlcywgYW5kIGxvb2sgbGlrZSBhIG1lbW9yeSBsZWFrIGluIG90aGVycy4KICAgIHdpdGggc2Vzc2lvbnMuU2Vzc2lvbigpIGFzIHNlc3Npb246CiAgICAgICAgcmV0dXJuIHNlc3Npb24ucmVxdWVzdChtZXRob2Q9bWV0aG9kLCB1cmw9dXJsLCAqKmt3YXJncykKCgpkZWYgZ2V0KHVybCwgcGFyYW1zPU5vbmUsICoqa3dhcmdzKToKICAgIHIiIiJTZW5kcyBhIEdFVCByZXF1ZXN0LgoKICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgIDpwYXJhbSBwYXJhbXM6IChvcHRpb25hbCkgRGljdGlvbmFyeSBvciBieXRlcyB0byBiZSBzZW50IGluIHRoZSBxdWVyeSBzdHJpbmcgZm9yIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgOnJldHVybjogOmNsYXNzOmBSZXNwb25zZSA8UmVzcG9uc2U+YCBvYmplY3QKICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICIiIgoKICAgIGt3YXJncy5zZXRkZWZhdWx0KCdhbGxvd19yZWRpcmVjdHMnLCBUcnVlKQogICAgcmV0dXJuIHJlcXVlc3QoJ2dldCcsIHVybCwgcGFyYW1zPXBhcmFtcywgKiprd2FyZ3MpCgoKZGVmIG9wdGlvbnModXJsLCAqKmt3YXJncyk6CiAgICByIiIiU2VuZHMgYW4gT1BUSU9OUyByZXF1ZXN0LgoKICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgIDpyZXR1cm46IDpjbGFzczpgUmVzcG9uc2UgPFJlc3BvbnNlPmAgb2JqZWN0CiAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAiIiIKCiAgICBrd2FyZ3Muc2V0ZGVmYXVsdCgnYWxsb3dfcmVkaXJlY3RzJywgVHJ1ZSkKICAgIHJldHVybiByZXF1ZXN0KCdvcHRpb25zJywgdXJsLCAqKmt3YXJncykKCgpkZWYgaGVhZCh1cmwsICoqa3dhcmdzKToKICAgIHIiIiJTZW5kcyBhIEhFQUQgcmVxdWVzdC4KCiAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICA6cmV0dXJuOiA6Y2xhc3M6YFJlc3BvbnNlIDxSZXNwb25zZT5gIG9iamVjdAogICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgIiIiCgogICAga3dhcmdzLnNldGRlZmF1bHQoJ2FsbG93X3JlZGlyZWN0cycsIEZhbHNlKQogICAgcmV0dXJuIHJlcXVlc3QoJ2hlYWQnLCB1cmwsICoqa3dhcmdzKQoKCmRlZiBwb3N0KHVybCwgZGF0YT1Ob25lLCBqc29uPU5vbmUsICoqa3dhcmdzKToKICAgIHIiIiJTZW5kcyBhIFBPU1QgcmVxdWVzdC4KCiAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICA6cGFyYW0gZGF0YTogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5ICh3aWxsIGJlIGZvcm0tZW5jb2RlZCksIGJ5dGVzLCBvciBmaWxlLWxpa2Ugb2JqZWN0IHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICA6cGFyYW0ganNvbjogKG9wdGlvbmFsKSBqc29uIGRhdGEgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgIDpyZXR1cm46IDpjbGFzczpgUmVzcG9uc2UgPFJlc3BvbnNlPmAgb2JqZWN0CiAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAiIiIKCiAgICByZXR1cm4gcmVxdWVzdCgncG9zdCcsIHVybCwgZGF0YT1kYXRhLCBqc29uPWpzb24sICoqa3dhcmdzKQoKCmRlZiBwdXQodXJsLCBkYXRhPU5vbmUsICoqa3dhcmdzKToKICAgIHIiIiJTZW5kcyBhIFBVVCByZXF1ZXN0LgoKICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgIDpwYXJhbSBkYXRhOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgKHdpbGwgYmUgZm9ybS1lbmNvZGVkKSwgYnl0ZXMsIG9yIGZpbGUtbGlrZSBvYmplY3QgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBqc29uOiAob3B0aW9uYWwpIGpzb24gZGF0YSB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgOnJldHVybjogOmNsYXNzOmBSZXNwb25zZSA8UmVzcG9uc2U+YCBvYmplY3QKICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICIiIgoKICAgIHJldHVybiByZXF1ZXN0KCdwdXQnLCB1cmwsIGRhdGE9ZGF0YSwgKiprd2FyZ3MpCgoKZGVmIHBhdGNoKHVybCwgZGF0YT1Ob25lLCAqKmt3YXJncyk6CiAgICByIiIiU2VuZHMgYSBQQVRDSCByZXF1ZXN0LgoKICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgIDpwYXJhbSBkYXRhOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgKHdpbGwgYmUgZm9ybS1lbmNvZGVkKSwgYnl0ZXMsIG9yIGZpbGUtbGlrZSBvYmplY3QgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBqc29uOiAob3B0aW9uYWwpIGpzb24gZGF0YSB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgOnJldHVybjogOmNsYXNzOmBSZXNwb25zZSA8UmVzcG9uc2U+YCBvYmplY3QKICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICIiIgoKICAgIHJldHVybiByZXF1ZXN0KCdwYXRjaCcsIHVybCwgZGF0YT1kYXRhLCAqKmt3YXJncykKCgpkZWYgZGVsZXRlKHVybCwgKiprd2FyZ3MpOgogICAgciIiIlNlbmRzIGEgREVMRVRFIHJlcXVlc3QuCgogICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgOnJldHVybjogOmNsYXNzOmBSZXNwb25zZSA8UmVzcG9uc2U+YCBvYmplY3QKICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICIiIgoKICAgIHJldHVybiByZXF1ZXN0KCdkZWxldGUnLCB1cmwsICoqa3dhcmdzKQpQSwMEFAAAAAAAAAAhAAOt8pIAJgAAACYAACwAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvYXV0aC5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMuYXV0aAp+fn5+fn5+fn5+fn5+CgpUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgYXV0aGVudGljYXRpb24gaGFuZGxlcnMgZm9yIFJlcXVlc3RzLgoiIiIKCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHRpbWUKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IHRocmVhZGluZwppbXBvcnQgd2FybmluZ3MKCmZyb20gYmFzZTY0IGltcG9ydCBiNjRlbmNvZGUKCmZyb20gLmNvbXBhdCBpbXBvcnQgdXJscGFyc2UsIHN0ciwgYmFzZXN0cmluZwpmcm9tIC5jb29raWVzIGltcG9ydCBleHRyYWN0X2Nvb2tpZXNfdG9famFyCmZyb20gLl9pbnRlcm5hbF91dGlscyBpbXBvcnQgdG9fbmF0aXZlX3N0cmluZwpmcm9tIC51dGlscyBpbXBvcnQgcGFyc2VfZGljdF9oZWFkZXIKCkNPTlRFTlRfVFlQRV9GT1JNX1VSTEVOQ09ERUQgPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJwpDT05URU5UX1RZUEVfTVVMVElfUEFSVCA9ICdtdWx0aXBhcnQvZm9ybS1kYXRhJwoKCmRlZiBfYmFzaWNfYXV0aF9zdHIodXNlcm5hbWUsIHBhc3N3b3JkKToKICAgICIiIlJldHVybnMgYSBCYXNpYyBBdXRoIHN0cmluZy4iIiIKCiAgICAjICJJIHdhbnQgdXMgdG8gcHV0IGEgYmlnLW9sJyBjb21tZW50IG9uIHRvcCBvZiBpdCB0aGF0CiAgICAjIHNheXMgdGhhdCB0aGlzIGJlaGF2aW91ciBpcyBkdW1iIGJ1dCB3ZSBuZWVkIHRvIHByZXNlcnZlCiAgICAjIGl0IGJlY2F1c2UgcGVvcGxlIGFyZSByZWx5aW5nIG9uIGl0LiIKICAgICMgICAgLSBMdWthc2EKICAgICMKICAgICMgVGhlc2UgYXJlIGhlcmUgc29sZWx5IHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CiAgICAjIGZvciB0aGluZ3MgbGlrZSBpbnRzLiBUaGlzIHdpbGwgYmUgcmVtb3ZlZCBpbiAzLjAuMC4KICAgIGlmIG5vdCBpc2luc3RhbmNlKHVzZXJuYW1lLCBiYXNlc3RyaW5nKToKICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAiTm9uLXN0cmluZyB1c2VybmFtZXMgd2lsbCBubyBsb25nZXIgYmUgc3VwcG9ydGVkIGluIFJlcXVlc3RzICIKICAgICAgICAgICAgIjMuMC4wLiBQbGVhc2UgY29udmVydCB0aGUgb2JqZWN0IHlvdSd2ZSBwYXNzZWQgaW4gKHswIXJ9KSB0byAiCiAgICAgICAgICAgICJhIHN0cmluZyBvciBieXRlcyBvYmplY3QgaW4gdGhlIG5lYXIgZnV0dXJlIHRvIGF2b2lkICIKICAgICAgICAgICAgInByb2JsZW1zLiIuZm9ybWF0KHVzZXJuYW1lKSwKICAgICAgICAgICAgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLAogICAgICAgICkKICAgICAgICB1c2VybmFtZSA9IHN0cih1c2VybmFtZSkKCiAgICBpZiBub3QgaXNpbnN0YW5jZShwYXNzd29yZCwgYmFzZXN0cmluZyk6CiAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgIk5vbi1zdHJpbmcgcGFzc3dvcmRzIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCBpbiBSZXF1ZXN0cyAiCiAgICAgICAgICAgICIzLjAuMC4gUGxlYXNlIGNvbnZlcnQgdGhlIG9iamVjdCB5b3UndmUgcGFzc2VkIGluICh7MCFyfSkgdG8gIgogICAgICAgICAgICAiYSBzdHJpbmcgb3IgYnl0ZXMgb2JqZWN0IGluIHRoZSBuZWFyIGZ1dHVyZSB0byBhdm9pZCAiCiAgICAgICAgICAgICJwcm9ibGVtcy4iLmZvcm1hdChwYXNzd29yZCksCiAgICAgICAgICAgIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywKICAgICAgICApCiAgICAgICAgcGFzc3dvcmQgPSBzdHIocGFzc3dvcmQpCiAgICAjIC0tIEVuZCBSZW1vdmFsIC0tCgogICAgaWYgaXNpbnN0YW5jZSh1c2VybmFtZSwgc3RyKToKICAgICAgICB1c2VybmFtZSA9IHVzZXJuYW1lLmVuY29kZSgnbGF0aW4xJykKCiAgICBpZiBpc2luc3RhbmNlKHBhc3N3b3JkLCBzdHIpOgogICAgICAgIHBhc3N3b3JkID0gcGFzc3dvcmQuZW5jb2RlKCdsYXRpbjEnKQoKICAgIGF1dGhzdHIgPSAnQmFzaWMgJyArIHRvX25hdGl2ZV9zdHJpbmcoCiAgICAgICAgYjY0ZW5jb2RlKGInOicuam9pbigodXNlcm5hbWUsIHBhc3N3b3JkKSkpLnN0cmlwKCkKICAgICkKCiAgICByZXR1cm4gYXV0aHN0cgoKCmNsYXNzIEF1dGhCYXNlKG9iamVjdCk6CiAgICAiIiJCYXNlIGNsYXNzIHRoYXQgYWxsIGF1dGggaW1wbGVtZW50YXRpb25zIGRlcml2ZSBmcm9tIiIiCgogICAgZGVmIF9fY2FsbF9fKHNlbGYsIHIpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ0F1dGggaG9va3MgbXVzdCBiZSBjYWxsYWJsZS4nKQoKCmNsYXNzIEhUVFBCYXNpY0F1dGgoQXV0aEJhc2UpOgogICAgIiIiQXR0YWNoZXMgSFRUUCBCYXNpYyBBdXRoZW50aWNhdGlvbiB0byB0aGUgZ2l2ZW4gUmVxdWVzdCBvYmplY3QuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVzZXJuYW1lLCBwYXNzd29yZCk6CiAgICAgICAgc2VsZi51c2VybmFtZSA9IHVzZXJuYW1lCiAgICAgICAgc2VsZi5wYXNzd29yZCA9IHBhc3N3b3JkCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIGFsbChbCiAgICAgICAgICAgIHNlbGYudXNlcm5hbWUgPT0gZ2V0YXR0cihvdGhlciwgJ3VzZXJuYW1lJywgTm9uZSksCiAgICAgICAgICAgIHNlbGYucGFzc3dvcmQgPT0gZ2V0YXR0cihvdGhlciwgJ3Bhc3N3b3JkJywgTm9uZSkKICAgICAgICBdKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgoKICAgIGRlZiBfX2NhbGxfXyhzZWxmLCByKToKICAgICAgICByLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IF9iYXNpY19hdXRoX3N0cihzZWxmLnVzZXJuYW1lLCBzZWxmLnBhc3N3b3JkKQogICAgICAgIHJldHVybiByCgoKY2xhc3MgSFRUUFByb3h5QXV0aChIVFRQQmFzaWNBdXRoKToKICAgICIiIkF0dGFjaGVzIEhUVFAgUHJveHkgQXV0aGVudGljYXRpb24gdG8gYSBnaXZlbiBSZXF1ZXN0IG9iamVjdC4iIiIKCiAgICBkZWYgX19jYWxsX18oc2VsZiwgcik6CiAgICAgICAgci5oZWFkZXJzWydQcm94eS1BdXRob3JpemF0aW9uJ10gPSBfYmFzaWNfYXV0aF9zdHIoc2VsZi51c2VybmFtZSwgc2VsZi5wYXNzd29yZCkKICAgICAgICByZXR1cm4gcgoKCmNsYXNzIEhUVFBEaWdlc3RBdXRoKEF1dGhCYXNlKToKICAgICIiIkF0dGFjaGVzIEhUVFAgRGlnZXN0IEF1dGhlbnRpY2F0aW9uIHRvIHRoZSBnaXZlbiBSZXF1ZXN0IG9iamVjdC4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXNlcm5hbWUsIHBhc3N3b3JkKToKICAgICAgICBzZWxmLnVzZXJuYW1lID0gdXNlcm5hbWUKICAgICAgICBzZWxmLnBhc3N3b3JkID0gcGFzc3dvcmQKICAgICAgICAjIEtlZXAgc3RhdGUgaW4gcGVyLXRocmVhZCBsb2NhbCBzdG9yYWdlCiAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsID0gdGhyZWFkaW5nLmxvY2FsKCkKCiAgICBkZWYgaW5pdF9wZXJfdGhyZWFkX3N0YXRlKHNlbGYpOgogICAgICAgICMgRW5zdXJlIHN0YXRlIGlzIGluaXRpYWxpemVkIGp1c3Qgb25jZSBwZXItdGhyZWFkCiAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZi5fdGhyZWFkX2xvY2FsLCAnaW5pdCcpOgogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwuaW5pdCA9IFRydWUKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLmxhc3Rfbm9uY2UgPSAnJwogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwubm9uY2VfY291bnQgPSAwCiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5jaGFsID0ge30KICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLnBvcyA9IE5vbmUKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLm51bV80MDFfY2FsbHMgPSBOb25lCgogICAgZGVmIGJ1aWxkX2RpZ2VzdF9oZWFkZXIoc2VsZiwgbWV0aG9kLCB1cmwpOgogICAgICAgICIiIgogICAgICAgIDpydHlwZTogc3RyCiAgICAgICAgIiIiCgogICAgICAgIHJlYWxtID0gc2VsZi5fdGhyZWFkX2xvY2FsLmNoYWxbJ3JlYWxtJ10KICAgICAgICBub25jZSA9IHNlbGYuX3RocmVhZF9sb2NhbC5jaGFsWydub25jZSddCiAgICAgICAgcW9wID0gc2VsZi5fdGhyZWFkX2xvY2FsLmNoYWwuZ2V0KCdxb3AnKQogICAgICAgIGFsZ29yaXRobSA9IHNlbGYuX3RocmVhZF9sb2NhbC5jaGFsLmdldCgnYWxnb3JpdGhtJykKICAgICAgICBvcGFxdWUgPSBzZWxmLl90aHJlYWRfbG9jYWwuY2hhbC5nZXQoJ29wYXF1ZScpCiAgICAgICAgaGFzaF91dGY4ID0gTm9uZQoKICAgICAgICBpZiBhbGdvcml0aG0gaXMgTm9uZToKICAgICAgICAgICAgX2FsZ29yaXRobSA9ICdNRDUnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX2FsZ29yaXRobSA9IGFsZ29yaXRobS51cHBlcigpCiAgICAgICAgIyBsYW1iZGFzIGFzc3VtZSBkaWdlc3QgbW9kdWxlcyBhcmUgaW1wb3J0ZWQgYXQgdGhlIHRvcCBsZXZlbAogICAgICAgIGlmIF9hbGdvcml0aG0gPT0gJ01ENScgb3IgX2FsZ29yaXRobSA9PSAnTUQ1LVNFU1MnOgogICAgICAgICAgICBkZWYgbWQ1X3V0ZjgoeCk6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHgsIHN0cik6CiAgICAgICAgICAgICAgICAgICAgeCA9IHguZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgICAgICByZXR1cm4gaGFzaGxpYi5tZDUoeCkuaGV4ZGlnZXN0KCkKICAgICAgICAgICAgaGFzaF91dGY4ID0gbWQ1X3V0ZjgKICAgICAgICBlbGlmIF9hbGdvcml0aG0gPT0gJ1NIQSc6CiAgICAgICAgICAgIGRlZiBzaGFfdXRmOCh4KToKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoeCwgc3RyKToKICAgICAgICAgICAgICAgICAgICB4ID0geC5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIHJldHVybiBoYXNobGliLnNoYTEoeCkuaGV4ZGlnZXN0KCkKICAgICAgICAgICAgaGFzaF91dGY4ID0gc2hhX3V0ZjgKCiAgICAgICAgS0QgPSBsYW1iZGEgcywgZDogaGFzaF91dGY4KCIlczolcyIgJSAocywgZCkpCgogICAgICAgIGlmIGhhc2hfdXRmOCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAjIFhYWCBub3QgaW1wbGVtZW50ZWQgeWV0CiAgICAgICAgZW50ZGlnID0gTm9uZQogICAgICAgIHBfcGFyc2VkID0gdXJscGFyc2UodXJsKQogICAgICAgICM6IHBhdGggaXMgcmVxdWVzdC11cmkgZGVmaW5lZCBpbiBSRkMgMjYxNiB3aGljaCBzaG91bGQgbm90IGJlIGVtcHR5CiAgICAgICAgcGF0aCA9IHBfcGFyc2VkLnBhdGggb3IgIi8iCiAgICAgICAgaWYgcF9wYXJzZWQucXVlcnk6CiAgICAgICAgICAgIHBhdGggKz0gJz8nICsgcF9wYXJzZWQucXVlcnkKCiAgICAgICAgQTEgPSAnJXM6JXM6JXMnICUgKHNlbGYudXNlcm5hbWUsIHJlYWxtLCBzZWxmLnBhc3N3b3JkKQogICAgICAgIEEyID0gJyVzOiVzJyAlIChtZXRob2QsIHBhdGgpCgogICAgICAgIEhBMSA9IGhhc2hfdXRmOChBMSkKICAgICAgICBIQTIgPSBoYXNoX3V0ZjgoQTIpCgogICAgICAgIGlmIG5vbmNlID09IHNlbGYuX3RocmVhZF9sb2NhbC5sYXN0X25vbmNlOgogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwubm9uY2VfY291bnQgKz0gMQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5ub25jZV9jb3VudCA9IDEKICAgICAgICBuY3ZhbHVlID0gJyUwOHgnICUgc2VsZi5fdGhyZWFkX2xvY2FsLm5vbmNlX2NvdW50CiAgICAgICAgcyA9IHN0cihzZWxmLl90aHJlYWRfbG9jYWwubm9uY2VfY291bnQpLmVuY29kZSgndXRmLTgnKQogICAgICAgIHMgKz0gbm9uY2UuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgcyArPSB0aW1lLmN0aW1lKCkuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgcyArPSBvcy51cmFuZG9tKDgpCgogICAgICAgIGNub25jZSA9IChoYXNobGliLnNoYTEocykuaGV4ZGlnZXN0KClbOjE2XSkKICAgICAgICBpZiBfYWxnb3JpdGhtID09ICdNRDUtU0VTUyc6CiAgICAgICAgICAgIEhBMSA9IGhhc2hfdXRmOCgnJXM6JXM6JXMnICUgKEhBMSwgbm9uY2UsIGNub25jZSkpCgogICAgICAgIGlmIG5vdCBxb3A6CiAgICAgICAgICAgIHJlc3BkaWcgPSBLRChIQTEsICIlczolcyIgJSAobm9uY2UsIEhBMikpCiAgICAgICAgZWxpZiBxb3AgPT0gJ2F1dGgnIG9yICdhdXRoJyBpbiBxb3Auc3BsaXQoJywnKToKICAgICAgICAgICAgbm9uY2ViaXQgPSAiJXM6JXM6JXM6JXM6JXMiICUgKAogICAgICAgICAgICAgICAgbm9uY2UsIG5jdmFsdWUsIGNub25jZSwgJ2F1dGgnLCBIQTIKICAgICAgICAgICAgKQogICAgICAgICAgICByZXNwZGlnID0gS0QoSEExLCBub25jZWJpdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFhYWCBoYW5kbGUgYXV0aC1pbnQuCiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5sYXN0X25vbmNlID0gbm9uY2UKCiAgICAgICAgIyBYWFggc2hvdWxkIHRoZSBwYXJ0aWFsIGRpZ2VzdHMgYmUgZW5jb2RlZCB0b28/CiAgICAgICAgYmFzZSA9ICd1c2VybmFtZT0iJXMiLCByZWFsbT0iJXMiLCBub25jZT0iJXMiLCB1cmk9IiVzIiwgJyBcCiAgICAgICAgICAgICAgICdyZXNwb25zZT0iJXMiJyAlIChzZWxmLnVzZXJuYW1lLCByZWFsbSwgbm9uY2UsIHBhdGgsIHJlc3BkaWcpCiAgICAgICAgaWYgb3BhcXVlOgogICAgICAgICAgICBiYXNlICs9ICcsIG9wYXF1ZT0iJXMiJyAlIG9wYXF1ZQogICAgICAgIGlmIGFsZ29yaXRobToKICAgICAgICAgICAgYmFzZSArPSAnLCBhbGdvcml0aG09IiVzIicgJSBhbGdvcml0aG0KICAgICAgICBpZiBlbnRkaWc6CiAgICAgICAgICAgIGJhc2UgKz0gJywgZGlnZXN0PSIlcyInICUgZW50ZGlnCiAgICAgICAgaWYgcW9wOgogICAgICAgICAgICBiYXNlICs9ICcsIHFvcD0iYXV0aCIsIG5jPSVzLCBjbm9uY2U9IiVzIicgJSAobmN2YWx1ZSwgY25vbmNlKQoKICAgICAgICByZXR1cm4gJ0RpZ2VzdCAlcycgJSAoYmFzZSkKCiAgICBkZWYgaGFuZGxlX3JlZGlyZWN0KHNlbGYsIHIsICoqa3dhcmdzKToKICAgICAgICAiIiJSZXNldCBudW1fNDAxX2NhbGxzIGNvdW50ZXIgb24gcmVkaXJlY3RzLiIiIgogICAgICAgIGlmIHIuaXNfcmVkaXJlY3Q6CiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5udW1fNDAxX2NhbGxzID0gMQoKICAgIGRlZiBoYW5kbGVfNDAxKHNlbGYsIHIsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBUYWtlcyB0aGUgZ2l2ZW4gcmVzcG9uc2UgYW5kIHRyaWVzIGRpZ2VzdC1hdXRoLCBpZiBuZWVkZWQuCgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKCiAgICAgICAgIyBJZiByZXNwb25zZSBpcyBub3QgNHh4LCBkbyBub3QgYXV0aAogICAgICAgICMgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXF1ZXN0cy9yZXF1ZXN0cy9pc3N1ZXMvMzc3MgogICAgICAgIGlmIG5vdCA0MDAgPD0gci5zdGF0dXNfY29kZSA8IDUwMDoKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLm51bV80MDFfY2FsbHMgPSAxCiAgICAgICAgICAgIHJldHVybiByCgogICAgICAgIGlmIHNlbGYuX3RocmVhZF9sb2NhbC5wb3MgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICMgUmV3aW5kIHRoZSBmaWxlIHBvc2l0aW9uIGluZGljYXRvciBvZiB0aGUgYm9keSB0byB3aGVyZQogICAgICAgICAgICAjIGl0IHdhcyB0byByZXNlbmQgdGhlIHJlcXVlc3QuCiAgICAgICAgICAgIHIucmVxdWVzdC5ib2R5LnNlZWsoc2VsZi5fdGhyZWFkX2xvY2FsLnBvcykKICAgICAgICBzX2F1dGggPSByLmhlYWRlcnMuZ2V0KCd3d3ctYXV0aGVudGljYXRlJywgJycpCgogICAgICAgIGlmICdkaWdlc3QnIGluIHNfYXV0aC5sb3dlcigpIGFuZCBzZWxmLl90aHJlYWRfbG9jYWwubnVtXzQwMV9jYWxscyA8IDI6CgogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwubnVtXzQwMV9jYWxscyArPSAxCiAgICAgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUocidkaWdlc3QgJywgZmxhZ3M9cmUuSUdOT1JFQ0FTRSkKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLmNoYWwgPSBwYXJzZV9kaWN0X2hlYWRlcihwYXQuc3ViKCcnLCBzX2F1dGgsIGNvdW50PTEpKQoKICAgICAgICAgICAgIyBDb25zdW1lIGNvbnRlbnQgYW5kIHJlbGVhc2UgdGhlIG9yaWdpbmFsIGNvbm5lY3Rpb24KICAgICAgICAgICAgIyB0byBhbGxvdyBvdXIgbmV3IHJlcXVlc3QgdG8gcmV1c2UgdGhlIHNhbWUgb25lLgogICAgICAgICAgICByLmNvbnRlbnQKICAgICAgICAgICAgci5jbG9zZSgpCiAgICAgICAgICAgIHByZXAgPSByLnJlcXVlc3QuY29weSgpCiAgICAgICAgICAgIGV4dHJhY3RfY29va2llc190b19qYXIocHJlcC5fY29va2llcywgci5yZXF1ZXN0LCByLnJhdykKICAgICAgICAgICAgcHJlcC5wcmVwYXJlX2Nvb2tpZXMocHJlcC5fY29va2llcykKCiAgICAgICAgICAgIHByZXAuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gc2VsZi5idWlsZF9kaWdlc3RfaGVhZGVyKAogICAgICAgICAgICAgICAgcHJlcC5tZXRob2QsIHByZXAudXJsKQogICAgICAgICAgICBfciA9IHIuY29ubmVjdGlvbi5zZW5kKHByZXAsICoqa3dhcmdzKQogICAgICAgICAgICBfci5oaXN0b3J5LmFwcGVuZChyKQogICAgICAgICAgICBfci5yZXF1ZXN0ID0gcHJlcAoKICAgICAgICAgICAgcmV0dXJuIF9yCgogICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5udW1fNDAxX2NhbGxzID0gMQogICAgICAgIHJldHVybiByCgogICAgZGVmIF9fY2FsbF9fKHNlbGYsIHIpOgogICAgICAgICMgSW5pdGlhbGl6ZSBwZXItdGhyZWFkIHN0YXRlLCBpZiBuZWVkZWQKICAgICAgICBzZWxmLmluaXRfcGVyX3RocmVhZF9zdGF0ZSgpCiAgICAgICAgIyBJZiB3ZSBoYXZlIGEgc2F2ZWQgbm9uY2UsIHNraXAgdGhlIDQwMQogICAgICAgIGlmIHNlbGYuX3RocmVhZF9sb2NhbC5sYXN0X25vbmNlOgogICAgICAgICAgICByLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IHNlbGYuYnVpbGRfZGlnZXN0X2hlYWRlcihyLm1ldGhvZCwgci51cmwpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwucG9zID0gci5ib2R5LnRlbGwoKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIyBJbiB0aGUgY2FzZSBvZiBIVFRQRGlnZXN0QXV0aCBiZWluZyByZXVzZWQgYW5kIHRoZSBib2R5IG9mCiAgICAgICAgICAgICMgdGhlIHByZXZpb3VzIHJlcXVlc3Qgd2FzIGEgZmlsZS1saWtlIG9iamVjdCwgcG9zIGhhcyB0aGUKICAgICAgICAgICAgIyBmaWxlIHBvc2l0aW9uIG9mIHRoZSBwcmV2aW91cyBib2R5LiBFbnN1cmUgaXQncyBzZXQgdG8KICAgICAgICAgICAgIyBOb25lLgogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwucG9zID0gTm9uZQogICAgICAgIHIucmVnaXN0ZXJfaG9vaygncmVzcG9uc2UnLCBzZWxmLmhhbmRsZV80MDEpCiAgICAgICAgci5yZWdpc3Rlcl9ob29rKCdyZXNwb25zZScsIHNlbGYuaGFuZGxlX3JlZGlyZWN0KQogICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5udW1fNDAxX2NhbGxzID0gMQoKICAgICAgICByZXR1cm4gcgoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBhbGwoWwogICAgICAgICAgICBzZWxmLnVzZXJuYW1lID09IGdldGF0dHIob3RoZXIsICd1c2VybmFtZScsIE5vbmUpLAogICAgICAgICAgICBzZWxmLnBhc3N3b3JkID09IGdldGF0dHIob3RoZXIsICdwYXNzd29yZCcsIE5vbmUpCiAgICAgICAgXSkKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKUEsDBBQAAAAAAAAAIQAFodr18CIEAPAiBAAvAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2NhY2VydC5wZW0KIyBJc3N1ZXI6IENOPUdsb2JhbFNpZ24gUm9vdCBDQSBPPUdsb2JhbFNpZ24gbnYtc2EgT1U9Um9vdCBDQQojIFN1YmplY3Q6IENOPUdsb2JhbFNpZ24gUm9vdCBDQSBPPUdsb2JhbFNpZ24gbnYtc2EgT1U9Um9vdCBDQQojIExhYmVsOiAiR2xvYmFsU2lnbiBSb290IENBIgojIFNlcmlhbDogNDgzNTcwMzI3ODQ1OTcwNzY2OTAwNTIwNAojIE1ENSBGaW5nZXJwcmludDogM2U6NDU6NTI6MTU6MDk6NTE6OTI6ZTE6Yjc6NWQ6Mzc6OWY6YjE6ODc6Mjk6OGEKIyBTSEExIEZpbmdlcnByaW50OiBiMTpiYzo5Njo4YjpkNDpmNDo5ZDo2MjoyYTphODo5YTo4MTpmMjoxNTowMTo1MjphNDoxZDo4Mjo5YwojIFNIQTI1NiBGaW5nZXJwcmludDogZWI6ZDQ6MTA6NDA6ZTQ6YmI6M2U6Yzc6NDI6Yzk6ZTM6ODE6ZDM6MWU6ZjI6YTQ6MWE6NDg6YjY6Njg6NWM6OTY6ZTc6Y2U6ZjM6YzE6ZGY6NmM6ZDQ6MzM6MWM6OTkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURkVENDQWwyZ0F3SUJBZ0lMQkFBQUFBQUJGVXRhdzVRd0RRWUpLb1pJaHZjTkFRRUZCUUF3VnpFTE1Ba0cKQTFVRUJoTUNRa1V4R1RBWEJnTlZCQW9URUVkc2IySmhiRk5wWjI0Z2JuWXRjMkV4RURBT0JnTlZCQXNUQjFKdgpiM1FnUTBFeEd6QVpCZ05WQkFNVEVrZHNiMkpoYkZOcFoyNGdVbTl2ZENCRFFUQWVGdzA1T0RBNU1ERXhNakF3Ck1EQmFGdzB5T0RBeE1qZ3hNakF3TURCYU1GY3hDekFKQmdOVkJBWVRBa0pGTVJrd0Z3WURWUVFLRXhCSGJHOWkKWVd4VGFXZHVJRzUyTFhOaE1SQXdEZ1lEVlFRTEV3ZFNiMjkwSUVOQk1Sc3dHUVlEVlFRREV4SkhiRzlpWVd4VAphV2R1SUZKdmIzUWdRMEV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRGFEdWFaCmpjNmo0MCtLZnZ2eGk0TWxhK3BJSC9FcXNMbVZFUVM5OEdQUjRtZG16eHpkenh0SUsrNk5pWTZhcnltQVphdnAKeHkwU3k2c2NUSEFIb1QwS01NMFZqVS80M2RTTVVCVWM3MUR1eEM3My9PbFM4cEY5NEczVk5UQ09Ya056OGtIcAoxV3Jqc29rNlZqazRid1k4aUdsYktrM0ZwMVM0YkluTW0vazh5dVg5aWZVU1BKSjRsdGJjZEc2VFJHSFJqY2RHCnNuVU9odWdaaXRWdGJOVjRGcFdpNmNnS09PdnlKQk5QYzFTVEU0VTZHN3dlTkxXTEJZeTVkNHV4Mng4Z2thc0oKVTI2UXpuczNkTGx3UjVFaVVXTVdlYTZ4cmtFbUNNZ1pLOUZHcWtqV1pDclhnelQvTENyQmJCbERTZ2VGNTlOOAo5aUZvNytyeVVwOS9rNURQQWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFCkJUQURBUUgvTUIwR0ExVWREZ1FXQkJSZ2UyWWFSUTJYeW9sUUwzMEV6VFNvLy96OVN6QU5CZ2txaGtpRzl3MEIKQVFVRkFBT0NBUUVBMW5QbmZFOTIwSTIvN0xxaXZqVEZLREsxZlB4c25Dd3J2UW1lVTc5clhxb1JTTGJsQ0tPegp5ajFoVGROR0NiTSt3NkRqWTFVYjhycnZyVG5oUTdrNG8rWXZpaVk3NzZCUVZ2bkdDdjA0emNRTGNGR1VsNWdFCjM4TmZsTlVWeVJSQm5NUmRkV1FWRGY5Vk1PeUdqLzhON3l5NVkwYjJxdnpmdkduOUxoSklaSnJnbGZDbTd5bVAKQWJFVnRRd2RwZjVwTEdra2VCNnpweHh4WXU3S3lKZXNGMTJLd3ZoSGhtNHF4Rll4bGRCbmlZVXIrV3ltWFVhZApES3FDNUpsUjNYQzMyMVk5WWVScTRWelc5djQ5M2tITUI2NWpVcjlUVS9RcjZjZjl0dmVDWDRYU1FSamJnYk1FCkhNVWZwSUJ2RlNESjNneUlDaDNXWmxYaS9FakpLU1pwNEE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBSb290IENBIC0gUjIKIyBTdWJqZWN0OiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIFJvb3QgQ0EgLSBSMgojIExhYmVsOiAiR2xvYmFsU2lnbiBSb290IENBIC0gUjIiCiMgU2VyaWFsOiA0ODM1NzAzMjc4NDU5NjgyODg1NjU4MTI1CiMgTUQ1IEZpbmdlcnByaW50OiA5NDoxNDo3Nzo3ZTozZTo1ZTpmZDo4ZjozMDpiZDo0MTpiMDpjZjplNzpkMDozMAojIFNIQTEgRmluZ2VycHJpbnQ6IDc1OmUwOmFiOmI2OjEzOjg1OjEyOjI3OjFjOjA0OmY4OjVmOmRkOmRlOjM4OmU0OmI3OjI0OjJlOmZlCiMgU0hBMjU2IEZpbmdlcnByaW50OiBjYTo0MjpkZDo0MTo3NDo1ZjpkMDpiODoxZTpiOTowMjozNjoyYzpmOTpkODpiZjo3MTo5ZDphMTpiZDoxYjoxZTpmYzo5NDo2Zjo1Yjo0Yzo5OTpmNDoyYzoxYjo5ZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHVqQ0NBcUtnQXdJQkFnSUxCQUFBQUFBQkQ0WW01ZzB3RFFZSktvWklodmNOQVFFRkJRQXdUREVnTUI0RwpBMVVFQ3hNWFIyeHZZbUZzVTJsbmJpQlNiMjkwSUVOQklDMGdVakl4RXpBUkJnTlZCQW9UQ2tkc2IySmhiRk5wCloyNHhFekFSQmdOVkJBTVRDa2RzYjJKaGJGTnBaMjR3SGhjTk1EWXhNakUxTURnd01EQXdXaGNOTWpFeE1qRTEKTURnd01EQXdXakJNTVNBd0hnWURWUVFMRXhkSGJHOWlZV3hUYVdkdUlGSnZiM1FnUTBFZ0xTQlNNakVUTUJFRwpBMVVFQ2hNS1IyeHZZbUZzVTJsbmJqRVRNQkVHQTFVRUF4TUtSMnh2WW1Gc1UybG5iakNDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS2JQSkE2K0xtOG9tVVZDeEtzK0lWU2JDOU4vaEhENkVyUEwKdjRkZnhuK0cwN0l3WE5iOXJmRjczT1g0WUpZSmtoRDEwRlBlKzN0K2M0aXNVb2g3U3FiS1NhWmVxS2VNV2hHOAplb0xydm96cHM2eVdKUWVYU3BrcUJ5KzBIbmUvaWcrMUFud2JscmpGdVRvc3ZOWVN1ZXRaZmVMUUJvWmZYa2xxCnRUbGVpRFRzdkhnTUNKaUViS2pOUzdTZ2ZReDVUZkM0TGNzaHl0VnNXMzNob0NtRW9mblRsRW5MSkdLUklMemQKQzlYWnpQbnFKd29yYzVIR25SdXN5TXZvNEtEMEw1Q0xUZnV3Tmh2MkdYcUY0RzN5WVJPSVhKL2drd3BSbDRwYQp6cStyMWZlcUNhcGd2ZHpaWDk5eXFXQVRYZ0FCeVVyNlA2VHFCd01oQW82Q3lnUENtNDhDQXdFQUFhT0JuRENCCm1UQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVW0rSUgKVjJjY0hzQnFCdDVadEpvdDM5d1poaTR3TmdZRFZSMGZCQzh3TFRBcm9DbWdKNFlsYUhSMGNEb3ZMMk55YkM1bgpiRzlpWVd4emFXZHVMbTVsZEM5eWIyOTBMWEl5TG1OeWJEQWZCZ05WSFNNRUdEQVdnQlNiNGdkWFp4d2V3R29HCjNsbTBtaTNmM0JtR0xqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFtWUZUaHh4b2w0YVI3T0JLdUVRTHE0R3MKSjAvV3diZ2NRM2l6REpyODZpdzhibUViVFVzcDlaOEZIU2JCdU9tREFHSkZ0cWtJazdtcE0wc1ltc0w0aDRoTwoyOTF4TkJyQlZOcEdQK0RUS3F0dFZDTDFPbUxOSUcrNktZblgzWkh1MDF5aVBxRmJRZlhmNVdSRExlblZPYXZTCm90KzNpOURBZ0JrY1JjQXRqT2o0TGFSMFZrbkZCYlZQRmQ1dVJIZzVoNmgrdS9ONUdKRzc5Rytkd2ZDTU5ZeGQKQWZ2RGJibnZSRzE1UmpGK0N2NnBnc0gvNzZ0dUlNUlF5VitkVFpzWGpBemxBY21nUVdwelUvcWxVTFJ1SlEvNwpUQmowL1ZMWmptbXg2QkVQM29qWSt4MUo5NnJlbGM4Z2VNSmdFdHNsUUl4cS9INUNPRUJrRXZlZWdlR1RMZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIlZlcmlzaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyIKIyBTZXJpYWw6IDIwNjY4NDY5NjI3OTQ3MjMxMDI1NDI3Nzg3MDE4MDk2NjcyMzQxNQojIE1ENSBGaW5nZXJwcmludDogY2Q6Njg6YjY6YTc6Yzc6YzQ6Y2U6NzU6ZTA6MWQ6NGY6NTc6NDQ6NjE6OTI6MDkKIyBTSEExIEZpbmdlcnByaW50OiAxMzoyZDowZDo0NTo1Mzo0Yjo2OTo5NzpjZDpiMjpkNTpjMzozOTplMjo1NTo3Njo2MDo5Yjo1YzpjNgojIFNIQTI1NiBGaW5nZXJwcmludDogZWI6MDQ6Y2Y6NWU6YjE6ZjM6OWE6ZmE6NzY6MmY6MmI6YjE6MjA6ZjI6OTY6Y2I6YTU6MjA6YzE6Yjk6N2Q6YjE6NTg6OTU6NjU6Yjg6MWM6Yjk6YTE6N2I6NzI6NDQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVHakNDQXdJQ0VRQ2JmZ1pKb3o1aXVkWHVrRWh4S2U5WE1BMEdDU3FHU0liM0RRRUJCUVVBTUlIS01Rc3cKQ1FZRFZRUUdFd0pWVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabApjbWxUYVdkdUlGUnlkWE4wSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1CkxDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4UlRCREJnTlZCQU1UUEZabGNtbFQKYVdkdUlFTnNZWE56SURNZ1VIVmliR2xqSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcApkSGtnTFNCSE16QWVGdzA1T1RFd01ERXdNREF3TURCYUZ3MHpOakEzTVRZeU16VTVOVGxhTUlIS01Rc3dDUVlEClZRUUdFd0pWVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabGNtbFQKYVdkdUlGUnlkWE4wSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1TENCSgpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4UlRCREJnTlZCQU1UUEZabGNtbFRhV2R1CklFTnNZWE56SURNZ1VIVmliR2xqSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2cKTFNCSE16Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU11Nm5GTDhlQjhhSG04YgpOM085K01scmxCSXdUL0EyUi9YUWtRcjFGOGlsWWNFV1FFMzdpbUdRNVhZZ3dSRUdmYXNzYnFiMUVVR08raTJ0CkttRlpwR2NtVE5Eb3ZGSmJjQ0FFV05GNnlhUnB2SU1YWkswRmk3elFXTTZOalBYcjhFSkpDNTJYSjJjeWJ1R3UKa3hVY2NMd2dUUzhZM3BLSTZHeUZWeEVhNlg3akpoRlVva1dXVllQS01Jbm8zTmlqN1NxQVAzOTVaVmMrRlNCbQpDQytWazcrcVJ5K29ScGZ3RXVMK3dnb3JVZVoyNXJkR3QrSU5wc3lvdzB4WlZZbm02Rk5jSE9xZDhHSVdDNmZKClh3enczc0oyenEvM2F2TDZRYWFpTXhUSjVYcGowNTVpTjlXRlpaNE81bE1rZEJ0ZUhSSlRXOGNzNTROSk94V3UKaW1pNVY1Y0NBd0VBQVRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQUVSU1d3YXVTQ1BjL0w4bXkvdVJhbjJUZQoyeUZQaHBrMGRqWlgzZEFWTDhXdGZ4VWZOMkp6UHRUblg4NFhBOXMxK2l2YnJtQUpYeDVmajI2N0N6M3FXaE1lCkRHQnZ0Y0MxSXlJdUJ3dkxxWFRMUjdzZHdkZWxhOHd2MGtMOVNkMm5pYzlUdXRvQVdpaS9ndC80dWhNZFVJYUMKL1k0d2p5bEdzQjQ5TmRvNFloWVlTcTNtdGxGczNxOWk2d0hRSGlUK2VvOFNHaEpvdVB0bW1SUVVSVnl1NTY1cApGNEVyV2pmSlhpcjB4dUtoWEZTYnBsUUF6L0R4d2NlWU1CbzdOaGJibzI3cS9hMnl3dHJ2QWtjVGlzRHhzekd0ClR4emhUNXl2RHd5ZDkzZ04yUFExVm9EYXQyMFhqNTBlZ1dUaC9zVkZ1cTFydVFwNlRrOUxoTzVMOFgzZEVRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KSBPPUVudHJ1c3QubmV0IE9VPXd3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikvKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZAojIFN1YmplY3Q6IENOPUVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KSBPPUVudHJ1c3QubmV0IE9VPXd3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikvKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZAojIExhYmVsOiAiRW50cnVzdC5uZXQgUHJlbWl1bSAyMDQ4IFNlY3VyZSBTZXJ2ZXIgQ0EiCiMgU2VyaWFsOiA5NDYwNjkyNDAKIyBNRDUgRmluZ2VycHJpbnQ6IGVlOjI5OjMxOmJjOjMyOjdlOjlhOmU2OmU4OmI1OmY3OjUxOmI0OjM0OjcxOjkwCiMgU0hBMSBGaW5nZXJwcmludDogNTA6MzA6MDY6MDk6MWQ6OTc6ZDQ6ZjU6YWU6Mzk6Zjc6Y2I6ZTc6OTI6N2Q6N2Q6NjU6MmQ6MzQ6MzEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDZkOmM0OjcxOjcyOmUwOjFjOmJjOmIwOmJmOjYyOjU4OjBkOjg5OjVmOmUyOmI4OmFjOjlhOmQ0OmY4OjczOjgwOjFlOjBjOjEwOmI5OmM4OjM3OmQyOjFlOmIxOjc3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFS2pDQ0F4S2dBd0lCQWdJRU9HUGUrREFOQmdrcWhraUc5dzBCQVFVRkFEQ0J0REVVTUJJR0ExVUVDaE1MClJXNTBjblZ6ZEM1dVpYUXhRREErQmdOVkJBc1VOM2QzZHk1bGJuUnlkWE4wTG01bGRDOURVRk5mTWpBME9DQnAKYm1OdmNuQXVJR0o1SUhKbFppNGdLR3hwYldsMGN5QnNhV0ZpTGlreEpUQWpCZ05WQkFzVEhDaGpLU0F4T1RrNQpJRVZ1ZEhKMWMzUXVibVYwSUV4cGJXbDBaV1F4TXpBeEJnTlZCQU1US2tWdWRISjFjM1F1Ym1WMElFTmxjblJwClptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDZ3lNRFE0S1RBZUZ3MDVPVEV5TWpReE56VXdOVEZhRncweU9UQTMKTWpReE5ERTFNVEphTUlHME1SUXdFZ1lEVlFRS0V3dEZiblJ5ZFhOMExtNWxkREZBTUQ0R0ExVUVDeFEzZDNkMwpMbVZ1ZEhKMWMzUXVibVYwTDBOUVUxOHlNRFE0SUdsdVkyOXljQzRnWW5rZ2NtVm1MaUFvYkdsdGFYUnpJR3hwCllXSXVLVEVsTUNNR0ExVUVDeE1jS0dNcElERTVPVGtnUlc1MGNuVnpkQzV1WlhRZ1RHbHRhWFJsWkRFek1ERUcKQTFVRUF4TXFSVzUwY25WemRDNXVaWFFnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dLREl3TkRncApNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXJVMUxxUktHc3VxaklBY1ZGbVFxCkswdlJ2d3RLVFk3dGdIYWxaN2Q0UU1CelFzaG93TnRUSzkxZXVIYVlOWk9MR3AxOEV6b09IMXUzSHMvbEpCUWUKc1lHcGpYMjR6R3RMQS9FQ0ROeXJwVUFrQUg5MGxLR2RDQ216aUF2MWgzZWRWYzNrdzM3WGFtU3JoUlNHbFZ1WApNbEJ2UGNpNlpnemovTDI0U2NGMmlVa1ovY0Nvdlltalp5L0duN3h4R1dDNExla3N5WkIyWm51VTRxOTQxbVZUClhUelduTExQS1FQNUw2UlFzdFJJemdVeVZZcjlzbVJNRHVTWUIzWGJmOSs1Q0ZWZ2hUQXArWHRJcEdtRzR6VS8KSG9aZGVub1Z2ZThBamhVaVZCY0FrQ2FUdkE1SmFKRy8rRWZUblpWQ3dRNU4zMjhtejhNWUlXSm1RM0RXMWNBSAo0UUlEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WCkhRNEVGZ1FVVmVTQjBSR0F2dGlKdVFpak1mbWhKQWtXdVhBd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFEdWIKajFhYk1PZFRtWHg2ZWFkTmw5Y1psWkQ3QmgvS00zeEdZNCtXWmlUNlFCc2hKOHJtY25QeVQvNHhtZjNJREV4bwpVOGFBZ2hPWStyYXQybDA5OGM1dTloVVJsSUlNN2orVnJ4R3JEOWN2M2g4RGoxY3NIc203bWhwRWxlc1lUNllmCnpYMVhFQytiQkFsYWhMVnUyQjA2NGRhZTBXeDVYbmtjRk1YajBFeVRPMlU4N2Q4OXZxYmxsUnJEdFJuRHZWNWIKdS84ajcyZ1p5eEtUSjF3RExXOHcwQjYyR3F6ZVd2ZlJxcWducHY1NWdjUjVtVE5YdWhLd3FlQkNiSlBLVnQ3KwpiWVFMQ0l0K2plclhtQ0hHOCtjOGVTOWVuTkZNRlkzaDdDSTN6SnBEQzVmY2dKQ05zMmViYjBnSUZWYlB2L0VyCmZGNmFkdWxaa01WOGd6VVJaVkU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1CYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290IE89QmFsdGltb3JlIE9VPUN5YmVyVHJ1c3QKIyBTdWJqZWN0OiBDTj1CYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290IE89QmFsdGltb3JlIE9VPUN5YmVyVHJ1c3QKIyBMYWJlbDogIkJhbHRpbW9yZSBDeWJlclRydXN0IFJvb3QiCiMgU2VyaWFsOiAzMzU1NDYxNwojIE1ENSBGaW5nZXJwcmludDogYWM6YjY6OTQ6YTU6OWM6MTc6ZTA6ZDc6OTE6NTI6OWI6YjE6OTc6MDY6YTY6ZTQKIyBTSEExIEZpbmdlcnByaW50OiBkNDpkZToyMDpkMDo1ZTo2NjpmYzo1MzpmZToxYTo1MDo4ODoyYzo3ODpkYjoyODo1MjpjYTplNDo3NAojIFNIQTI1NiBGaW5nZXJwcmludDogMTY6YWY6NTc6YTk6ZjY6NzY6YjA6YWI6MTI6NjA6OTU6YWE6NWU6YmE6ZGU6ZjI6MmE6YjM6MTE6MTk6ZDY6NDQ6YWM6OTU6Y2Q6NGI6OTM6ZGI6ZjM6ZjI6NmE6ZWIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURkekNDQWwrZ0F3SUJBZ0lFQWdBQXVUQU5CZ2txaGtpRzl3MEJBUVVGQURCYU1Rc3dDUVlEVlFRR0V3SkoKUlRFU01CQUdBMVVFQ2hNSlFtRnNkR2x0YjNKbE1STXdFUVlEVlFRTEV3cERlV0psY2xSeWRYTjBNU0l3SUFZRApWUVFERXhsQ1lXeDBhVzF2Y21VZ1EzbGlaWEpVY25WemRDQlNiMjkwTUI0WERUQXdNRFV4TWpFNE5EWXdNRm9YCkRUSTFNRFV4TWpJek5Ua3dNRm93V2pFTE1Ba0dBMVVFQmhNQ1NVVXhFakFRQmdOVkJBb1RDVUpoYkhScGJXOXkKWlRFVE1CRUdBMVVFQ3hNS1EzbGlaWEpVY25WemRERWlNQ0FHQTFVRUF4TVpRbUZzZEdsdGIzSmxJRU41WW1WeQpWSEoxYzNRZ1VtOXZkRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLTUV1eUtyCm1EMVg2Q1p5bXJWNTFDbmk0ZWlWZ0xHdzQxdU9LeW1hWk4raFhlMndDUVZ0MnlndXptS2lZdjYwaU5vUzZ6anIKSVozQVFTc0JVbnVJZDlNY2o4ZTZ1WWkxYWdubmMrZ1JRS2ZSek1waWpTM2xqd3VtVU5Lb1VNTW82dldySlllSwptcFljcVdlNFB3elY5L2xTRXkvQ0c5VndjUENQd0JMS0JzdWE0ZG5LTTNwMzF2anN1ZkZvUkVKSUU5TEF3cVN1ClhtRCt0cVlGL0xUZEIxa0MxRmtZbUdQMXBXUGdrQXg5WGJJR2V2T0Y2dXZVQTY1ZWhENWYveFh0YWJ6NU9UWnkKZGM5M1VrM3p5WkFzdVQzbHlTTlRQeDhrbUNGY0I1a3B2Y1k2N09kdWhqcHJsM1JqTTcxb0dESHdlSTEydi95ZQpqbDBxaHFkTmtOd25HamtDQXdFQUFhTkZNRU13SFFZRFZSME9CQllFRk9XZFdUQ0NSMWpNclBvSVZEYUdlenExCkJFM3dNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUU13RGdZRFZSMFBBUUgvQkFRREFnRUdNQTBHQ1NxR1NJYjMKRFFFQkJRVUFBNElCQVFDRkRGMk81RzlSYUVJRm9OMjdUeWNsaEFPOTkyVDlMZGN3NDZRUUYrdmFLU20yZVQ5Mgo5aGtUSTdnUUN2bFlwTlJoY0wwRVlXb1NpaGZWQ3IzRnZEQjgxdWtNSlkyR1FFL3N6S04rT01ZM0VVL3QzV2d4CmprelNzd0YwN3I1MVhnZElHbjl3L3haY2hNQjVoYmdGL1grK1pSR2pEOEFDdFBoU056a0UxYWt4ZWhpL29DcjAKRXBuM28wV0M0enhlOVoyZXRjaWVmQzdJcEo1T0NCUkxiZjF3YldzYVk3MWs1aCszenZEeW55NjdHN2Z5VUloegprc0xpNHhhTm1qSUNxNDRZM2VrUUVlNStOYXVRcno0d2xIclFNejJuWlEvMS9JNmVZczlIUkN3Qlhic2R0VExTClI5STRMdEQrZ2R3eWFoNjE3anpWL09lQkhSbkRKRUxxWXptcAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9vdCBPPUFkZFRydXN0IEFCIE9VPUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrCiMgU3ViamVjdDogQ049QWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9vdCBPPUFkZFRydXN0IEFCIE9VPUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrCiMgTGFiZWw6ICJBZGRUcnVzdCBFeHRlcm5hbCBSb290IgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogMWQ6MzU6NTQ6MDQ6ODU6Nzg6YjA6M2Y6NDI6NDI6NGQ6YmY6MjA6NzM6MGE6M2YKIyBTSEExIEZpbmdlcnByaW50OiAwMjpmYTpmMzplMjo5MTo0Mzo1NDo2ODo2MDo3ODo1Nzo2OTo0ZDpmNTplNDo1Yjo2ODo4NToxODo2OAojIFNIQTI1NiBGaW5nZXJwcmludDogNjg6N2Y6YTQ6NTE6Mzg6MjI6Nzg6ZmY6ZjA6Yzg6YjE6MWY6OGQ6NDM6ZDU6NzY6Njc6MWM6NmU6YjI6YmM6ZWE6YjQ6MTM6ZmI6ODM6ZDk6NjU6ZDA6NmQ6MmY6ZjIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVOakNDQXg2Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJ2TVFzd0NRWURWUVFHRXdKVFJURVUKTUJJR0ExVUVDaE1MUVdSa1ZISjFjM1FnUVVJeEpqQWtCZ05WQkFzVEhVRmtaRlJ5ZFhOMElFVjRkR1Z5Ym1GcwpJRlJVVUNCT1pYUjNiM0pyTVNJd0lBWURWUVFERXhsQlpHUlVjblZ6ZENCRmVIUmxjbTVoYkNCRFFTQlNiMjkwCk1CNFhEVEF3TURVek1ERXdORGd6T0ZvWERUSXdNRFV6TURFd05EZ3pPRm93YnpFTE1Ba0dBMVVFQmhNQ1UwVXgKRkRBU0JnTlZCQW9UQzBGa1pGUnlkWE4wSUVGQ01TWXdKQVlEVlFRTEV4MUJaR1JVY25WemRDQkZlSFJsY201aApiQ0JVVkZBZ1RtVjBkMjl5YXpFaU1DQUdBMVVFQXhNWlFXUmtWSEoxYzNRZ1JYaDBaWEp1WVd3Z1EwRWdVbTl2CmREQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxmM0dqUG04Z0FFTFRuZ1RsdnQKSDd4c0Q4MjEraU8yenQ2YkVUT1hwQ2xNZlpPZnZVcThrKzBER3VPUHorVnRVRnJXbHltVVdvQ3dTWHJiTHBYOQp1TXEvTnpndEhqNlJRYTF3VnNmd1R6L29NcDUweXNpUVZPbkdYdzk0blpwQVBBNnNZYXBlRkkrZWg2RnFVTnpYCm1rNnZCYk9tY1pTY2NiTlFZQXJIRTUwNEI0WUNxT21vYVNZWWtLdE1zRThqcXpwUGhOamZ6cC9oYVcrNzEwTFgKYTBUa3g2M3ViVUZmY2xweENEZXplV1drV2FDVU4vY0FMdzNDa25MYTBEaHkyeFNvUmNSZEtuMjN0TmJFN3F6TgpFMFMzeVN2ZFF3QWwrbUc1YVdwWUl4RzNwek9QVm5WWjljMHAxMGEzQ2l0bHR0TkNieFd5dUh2NzcrbGRVOVUwCldpY0NBd0VBQWFPQjNEQ0IyVEFkQmdOVkhRNEVGZ1FVcmIyWWVqUzBKdmY2eENaVTd3Tzk0Q1RMVkJvd0N3WUQKVlIwUEJBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3Z1prR0ExVWRJd1NCa1RDQmpvQVVyYjJZZWpTMApKdmY2eENaVTd3Tzk0Q1RMVkJxaGM2UnhNRzh4Q3pBSkJnTlZCQVlUQWxORk1SUXdFZ1lEVlFRS0V3dEJaR1JVCmNuVnpkQ0JCUWpFbU1DUUdBMVVFQ3hNZFFXUmtWSEoxYzNRZ1JYaDBaWEp1WVd3Z1ZGUlFJRTVsZEhkdmNtc3gKSWpBZ0JnTlZCQU1UR1VGa1pGUnlkWE4wSUVWNGRHVnlibUZzSUVOQklGSnZiM1NDQVFFd0RRWUpLb1pJaHZjTgpBUUVGQlFBRGdnRUJBTENiNElVbHd0WWo0ZytXQnBLZFFaaWMyWVI1Z2RrZVd4UUhJelpsajdEWWQ3dXNRV3hICllJTlJzUGt5UGVmODlpWVR4NEFXcGI5YS9JZlBlSG1KSVpyaVRBY0toalc4OHQ1UnhOS1d0OXgrVHU1dy9SdzUKNnd3Q1VSUXRqcjBXNE1IZlJuWG5KSzNzOUVLMGhaTndFR2U2blFZMVNoalRLM3JNVVVLaGVtUFI1cnVoeFN2QwpOcjRURGVhOVkzNTVlNmNKRFVDcmF0MlBpc1AyOW93YVFnVlIxRVgxbjZkaUlXZ1ZJRU04bWVkOHZTVFlxWkVYCmM0Zy9WaHN4T0JpMGNRK2F6Y2dPbm80dUcrR01tSVBMSHpIeFJFekdCSE5KZG1BUHgvaTlGNEJyTHVuTVRBNWEKbW5rUElBb3UxWjVqSmg1VmtwVFlnaGRhZTlDOHg0OU9oZ1E9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1FbnRydXN0LCBJbmMuIE9VPXd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZS8oYykgMjAwNiBFbnRydXN0LCBJbmMuCiMgU3ViamVjdDogQ049RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89RW50cnVzdCwgSW5jLiBPVT13d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVuY2UvKGMpIDIwMDYgRW50cnVzdCwgSW5jLgojIExhYmVsOiAiRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMTE2NDY2MDgyMAojIE1ENSBGaW5nZXJwcmludDogZDY6YTU6YzM6ZWQ6NWQ6ZGQ6M2U6MDA6YzE6M2Q6ODc6OTI6MWY6MWQ6M2Y6ZTQKIyBTSEExIEZpbmdlcnByaW50OiBiMzoxZTpiMTpiNzo0MDplMzo2Yzo4NDowMjpkYTpkYzozNzpkNDo0ZDpmNTpkNDo2Nzo0OTo1MjpmOQojIFNIQTI1NiBGaW5nZXJwcmludDogNzM6YzE6NzY6NDM6NGY6MWI6YzY6ZDU6YWQ6ZjQ6NWI6MGU6NzY6ZTc6Mjc6Mjg6N2M6OGQ6ZTU6NzY6MTY6YzE6ZTY6ZTY6MTQ6MWE6MmI6MmM6YmM6N2Q6OGU6NGMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVrVENDQTNtZ0F3SUJBZ0lFUld0UVZEQU5CZ2txaGtpRzl3MEJBUVVGQURDQnNERUxNQWtHQTFVRUJoTUMKVlZNeEZqQVVCZ05WQkFvVERVVnVkSEoxYzNRc0lFbHVZeTR4T1RBM0JnTlZCQXNUTUhkM2R5NWxiblJ5ZFhOMApMbTVsZEM5RFVGTWdhWE1nYVc1amIzSndiM0poZEdWa0lHSjVJSEpsWm1WeVpXNWpaVEVmTUIwR0ExVUVDeE1XCktHTXBJREl3TURZZ1JXNTBjblZ6ZEN3Z1NXNWpMakV0TUNzR0ExVUVBeE1rUlc1MGNuVnpkQ0JTYjI5MElFTmwKY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEEyTVRFeU56SXdNak0wTWxvWERUSTJNVEV5TnpJdwpOVE0wTWxvd2diQXhDekFKQmdOVkJBWVRBbFZUTVJZd0ZBWURWUVFLRXcxRmJuUnlkWE4wTENCSmJtTXVNVGt3Ck53WURWUVFMRXpCM2QzY3VaVzUwY25WemRDNXVaWFF2UTFCVElHbHpJR2x1WTI5eWNHOXlZWFJsWkNCaWVTQnkKWldabGNtVnVZMlV4SHpBZEJnTlZCQXNURmloaktTQXlNREEySUVWdWRISjFjM1FzSUVsdVl5NHhMVEFyQmdOVgpCQU1USkVWdWRISjFjM1FnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQ0FTSXdEUVlKCktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxhVnRrTkMrc1p0S205STM1Uk1PVmNGN3NONUVVRm8KTnUzcy9wb0JqNkU0S1B6M0VFWm1MazBlR3JFYVRzYlJ3SldJc01uL01Zc3pBOXUzZzNzK0lJUmU3YkpXS0tmNAo0TGxBY1RmRnkwY09seXBvd0NLVlloWGJSOW4xMEN2L2drdkpyVDdlVE51UWdGQS9DWXFFQU93d0NqMFl6ZnY5CktsbWFJNVVYTEVXZUgyNURlVzBNWEpqK1NLZkZJMGRjWHYxdTV4NjA5bWhGMFlhRFc2S0tqYkhqS1lEK0pYR0kKcmI2OGo2eFNsa3VxVVkza0V6RVo2RTVObjl1c3MyclZ2RGxVY2NwNmVuK1EzWDBkZ05tQnUxa213aEgrNXBQaQo5NERrWmZzME53NHBnSEJOcnppR0xwNS9WNitlRjY3ckhNc29JVisySE5qbm9nUWkrZFBhMk1zQ0F3RUFBYU9CCnNEQ0JyVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QXJCZ05WSFJBRUpEQWkKZ0E4eU1EQTJNVEV5TnpJd01qTTBNbHFCRHpJd01qWXhNVEkzTWpBMU16UXlXakFmQmdOVkhTTUVHREFXZ0JSbwprT1JucEtaVGdNZUdacVR4OTB0RCs0UzliVEFkQmdOVkhRNEVGZ1FVYUpEa1o2U21VNERIaG1hazhmZExRL3VFCnZXMHdIUVlKS29aSWh2WjlCMEVBQkJBd0Roc0lWamN1TVRvMExqQURBZ1NRTUEwR0NTcUdTSWIzRFFFQkJRVUEKQTRJQkFRQ1QxREN3MXdNZ0t0RDVZK2lSREFVZ3FWOFp5bnR5VHRTeDI5Q1crMVJhR1N3TUNQZXl2SVdvblg5dApPMUt6S3R2bjFJU01ZL1lQeXlZQmtWQnM5RjhVNHBOMHdCT2VNRHBRNDdSZ3hSendJa1NOY1Vlc3lCcko2WnVhCkFHQVQvM0IrWHhGTlNSdXpGVko3eVZUYXY1MlZyMnVhMko3cDhlUkRqZUlSUkRxL3I3MkRRbk5TaTZxN3B5blAKOVdRY0NrM1J2S3FzbnlyUS8zOS8ybjNxc2Uwd0pjR0UyalRTVzNpRFZ1eWNOc01tNGhIMlowa2RrcXVNKyt2LwpldTZGU3FkUWdQQ25YRXFVTGw4Rm1UeFNRZUROdEdQUEFVTzZuSVBjajJBNzgxcTB0SHV1Mmd1UU9IWHZnUjFtCjB2ZFhjRGF6di93b3IzRWxoVnNUL2g1L1dyUTgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdlb1RydXN0IEdsb2JhbCBDQSBPPUdlb1RydXN0IEluYy4KIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBHbG9iYWwgQ0EgTz1HZW9UcnVzdCBJbmMuCiMgTGFiZWw6ICJHZW9UcnVzdCBHbG9iYWwgQ0EiCiMgU2VyaWFsOiAxNDQ0NzAKIyBNRDUgRmluZ2VycHJpbnQ6IGY3Ojc1OmFiOjI5OmZiOjUxOjRlOmI3Ojc3OjVlOmZmOjA1OjNjOjk5OjhlOmY1CiMgU0hBMSBGaW5nZXJwcmludDogZGU6Mjg6ZjQ6YTQ6ZmY6ZTU6Yjk6MmY6YTM6YzU6MDM6ZDE6YTM6NDk6YTc6Zjk6OTY6MmE6ODI6MTIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGZmOjg1OjZhOjJkOjI1OjFkOmNkOjg4OmQzOjY2OjU2OmY0OjUwOjEyOjY3Ojk4OmNmOmFiOmFhOmRlOjQwOjc5OjljOjcyOjJkOmU0OmQyOmI1OmRiOjM2OmE3OjNhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEVkRDQ0FqeWdBd0lCQWdJREFqUldNQTBHQ1NxR1NJYjNEUUVCQlFVQU1FSXhDekFKQmdOVkJBWVRBbFZUCk1SWXdGQVlEVlFRS0V3MUhaVzlVY25WemRDQkpibU11TVJzd0dRWURWUVFERXhKSFpXOVVjblZ6ZENCSGJHOWkKWVd3Z1EwRXdIaGNOTURJd05USXhNRFF3TURBd1doY05Nakl3TlRJeE1EUXdNREF3V2pCQ01Rc3dDUVlEVlFRRwpFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakViTUJrR0ExVUVBeE1TUjJWdlZISjFjM1FnClIyeHZZbUZzSUVOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMnN3WVl6RDkKOUJjakdsWitXOTg4YkRqa2NiZDRrZFM4b2RoTStLaER0Z1BwVFNFSENJamFXQzltT1NtOUJYaUxuVGpvQmJkcQpmbkdrNXNSZ3ByRHZnT1NKS0ErZUpkYnRnL090cHBISG1NbENHRFVVbmEyWVJwSXVUOHJ4aDBQQkZwVlhMVkR2CmlTMkFlbGV0OHU1ZmE5SUFqYmtVK0JRVk5kbkFScU43Y3NpUnY4bFZLODNRbHo2Y0ptVE0zODZER1hIS1R1YlUKMVh1cEdjMVYzc2pzMGw0NFUrVmNUNHd0L2xBak52eG01c3VPcERrWkFMZVZBam1SQ3c3K09DN1JIUVdhOWswKwpidzhISGE4c0hvOWdPZUw2TmxNVE9kUmVKaXZiUGFnVXZUTHJHQU1vVWdSeDVhc3pQZUU0dXdjMmhHS2NlZW9XCk1QUmZ3Q3ZvY1d2aytRSURBUUFCbzFNd1VUQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCVEEKZXBob2pZbjdxd1ZrREJGOXFuMWx1TXJNVGpBZkJnTlZIU01FR0RBV2dCVEFlcGhvalluN3F3VmtEQkY5cW4xbAp1TXJNVGpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQU5lTXBhdVV2WFZTT0tWQ1VuNWthRk9TUGVDcGlsS0luClo1N1F6eHBlUituQnNxVFAzVUVhQlU2YlMrNUtiMVZTc3lTaE53cnJaSFlxTGl6ei9UdDFrTC82Y2RqSFBUZlMKdFFXVllybW0zb2s5Tm5zNGQwaVhyS1lnank2bXlRekNzcGxGQU1mT0VWRWlJdUNsNnJZVlNBbGs2bDVQZFBjRgpQc2VLVWd6YkZiUzliWnZseHJGVWFLbmphWkMybXFVUHVMay9JSDJ1U3JXNG5PUWR0cXZtbEtYQng0T3QyL1VuCmh3NEViTlgvM2FCZDdZZFN0eXNWQXE0NXBtcDA2ZHJFNTd4Tk5CNnBYRTB6WDVJSkw0aG1YWGVYeHgxMkU2blYKNWZFV0NSRTExYXpiSkhGd0xKaFdDOWtYdE5IalVTdGVkZWpWME54UE5PM0NCV2FBb2N2bU13PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdlb1RydXN0IFVuaXZlcnNhbCBDQSBPPUdlb1RydXN0IEluYy4KIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBVbml2ZXJzYWwgQ0EgTz1HZW9UcnVzdCBJbmMuCiMgTGFiZWw6ICJHZW9UcnVzdCBVbml2ZXJzYWwgQ0EiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiA5Mjo2NTo1ODo4YjphMjoxYTozMTo3Mjo3Mzo2ODo1YzpiNDphNTo3YTowNzo0OAojIFNIQTEgRmluZ2VycHJpbnQ6IGU2OjIxOmYzOjM1OjQzOjc5OjA1OjlhOjRiOjY4OjMwOjlkOjhhOjJmOjc0OjIyOjE1Ojg3OmVjOjc5CiMgU0hBMjU2IEZpbmdlcnByaW50OiBhMDo0NTo5Yjo5Zjo2MzpiMjoyNTo1OTpmNTpmYTo1ZDo0Yzo2ZDpiMzpmOTpmNzoyZjpmMTo5Mzo0MjowMzozNTo3ODpmMDo3MzpiZjoxZDoxYjo0NjpjYjpiOToxMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmFEQ0NBMUNnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQkZNUXN3Q1FZRFZRUUdFd0pWVXpFVwpNQlFHQTFVRUNoTU5SMlZ2VkhKMWMzUWdTVzVqTGpFZU1Cd0dBMVVFQXhNVlIyVnZWSEoxYzNRZ1ZXNXBkbVZ5CmMyRnNJRU5CTUI0WERUQTBNRE13TkRBMU1EQXdNRm9YRFRJNU1ETXdOREExTURBd01Gb3dSVEVMTUFrR0ExVUUKQmhNQ1ZWTXhGakFVQmdOVkJBb1REVWRsYjFSeWRYTjBJRWx1WXk0eEhqQWNCZ05WQkFNVEZVZGxiMVJ5ZFhOMApJRlZ1YVhabGNuTmhiQ0JEUVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBS1lWClZhQ2p4dUFmakowaFVOZkJ2aXRidGFTZW9kbHlXTDBBRzB5L1lja1VIVVdDcThZZGdOWTk2eENjT3E5dEpQaTgKY1FHZUJ2VjhYeDdCRGxYS2c1cFpNSzRaeXpCSWxlMGlONDMwU3BweVpqNnRsY0RnRmdEZ0VCOHJNUTdYbEZUVApRak9nTkIwZVJYYmRUOG9ZTit5RkZYb1pDUHpWeDV6dzhxa3VFS21TNWoxWVBha1dhRHd2ZFNFWWZ5aDNwZUZoCkY3ZW02ZmdlbWR0emJ2UUtvaUZzN3RxcWhaSm1yL1o2YTRMYXVpSUlOUS9QUXZFMSttcnVmaXNsekRvUjVHMnYKYzdKMkhhM1FzbmhuR3FRNUhGRUxaMWFEL1RoZERjN2Q4THNybGgvZWV6SlMvUjI3dFFhaHNpRmVwZGFWYUgvdwptWjdjUlFnKzU5SUpEVFdVM1lCT1U1Zlh0UWxFSUdRV0Z3TUNURk1OYU43VnFuSk5rMjJDRHR1Y3ZjKzA4MXhkClZIcHBDWmJXMnhIQmpYV290TTg1eU00OHZDUjg1bUxLNGIxOXA3MVhaUXZrL2lYdHRta1EzQ2dhUnIwQkhkQ1gKdGVHWU84QTNaTlk5bE80TDRmVW9yZ3RXdjNHTEl5bEJqb2JGUzFKNzJIR3JING9WcGp1RFd0ZFlBVkhHVEVIWgpmOWhCWjNLaUtOOWdnNm1leUh2OFUzTnlXZldUZWhkMkRzNzM1VnpaQzFVMG9xcGJ0V3BVNXhQS1YreVhiZlJlCkJpOUZpMWpVSXhhUzVCWnVLR05aTU45UUFaeGppUnFmMnhlVWduQTN3eVNlbWtmV1dzcE9xR21KY2grUmJOdCsKbmh1dHh4OXozU3hQR1dYOWY1TkFFQzdTOE8wOG5pNG9QbWttTThWN0FnTUJBQUdqWXpCaE1BOEdBMVVkRXdFQgovd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTnE3THFxd0RMaUlKbEYwWEcwRDA4RFlqM3JXTUI4R0ExVWRJd1FZCk1CYUFGTnE3THFxd0RMaUlKbEYwWEcwRDA4RFlqM3JXTUE0R0ExVWREd0VCL3dRRUF3SUJoakFOQmdrcWhraUcKOXcwQkFRVUZBQU9DQWdFQU1Yam14N1hmdUpSQXlYSEVxRFhzUmgzQ2hmTW9XSWF3Qy95T3NqbVBSRldyWklSYwphYW5RbWpnOCt1VWZOZVZFNDRCNWxHaWt1OFNmUGVFMHpUQkdpMVFybGFYdjl6K1poUDAxNXM4eHh0eHF2NmZYCkl3amhtRjdEV2doMnFhYXZkeSszWUwxRVJtcnZsLzl6bGNHTzZKUDcvVEczN0ZjUkVVV2JNUEVhaURuQlR6eW4KQU5YSC9LdHRnQ0p3cFF6Z1hRUXBBdnZMb0pIUmZOYkRmbERWblZpK1FUanJ1WFU4RmRtYnlVcURXY0RhVS8wegp1ellZbTRVUEZkM3VMYXgyazduWkFZMUlFS2o3OVRpRzhkc0t4cjJFb3lOQjN0WjNiNFhVaFJ4UTRLNVJpcnFOClBuYml1Y29uOGwrZjcyNVpEUWJZS3hlazBueHJ1MThVR2tpUEdrem5zMGNjamt4Rkt5RHVTTi9uM1FtT0dLamEKUUkyU0poRlRZWE5kNjczbnhFMHBOMkhyckRrdFp5NFcxdlVBZzRXaHpIOTJ4SDNrdDB0bTd3TkZZR20yREZLVwprb1JlcHFPMXBENHIyY3pZRzBlcThrVGFUL2tENlBBVXl6L3pnOTdRd1ZUanQrZ0tOMDJMSUZrRE1CbWhMTWk5CkVSL2Zyc2xLeGZNblptYUdyR2lSLzlubVV4d1BpMXhwWlFvbXlCNDB3MTFSZTllcG5BYWhOdDNWaVpTODJlUXQKREY0SmJBaVhmS005ZkpQL1A2RVVwOCsxWGV2YjJ4ekVkdCtJdWIxRkJaVWJydnhHYWt5dlNPUE9yZy9TZnV2bQpiSnhQZ1dwNlpLeTdQdFhueTNZdXhhZEl3VnlRRDh2SVAvcm1NdUdORzIrazVvN1krU2xJaXM1ei9pdz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdlb1RydXN0IFVuaXZlcnNhbCBDQSAyIE89R2VvVHJ1c3QgSW5jLgojIFN1YmplY3Q6IENOPUdlb1RydXN0IFVuaXZlcnNhbCBDQSAyIE89R2VvVHJ1c3QgSW5jLgojIExhYmVsOiAiR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiAzNDpmYzpiODpkMDozNjpkYjo5ZToxNDpiMzpjMjpmMjpkYjo4ZjplNDo5NDpjNwojIFNIQTEgRmluZ2VycHJpbnQ6IDM3OjlhOjE5OjdiOjQxOjg1OjQ1OjM1OjBjOmE2OjAzOjY5OmYzOjNjOjJlOmFmOjQ3OjRmOjIwOjc5CiMgU0hBMjU2IEZpbmdlcnByaW50OiBhMDoyMzo0ZjozYjpjODo1Mjo3YzphNTo2Mjo4ZTplYzo4MTphZDo1ZDo2OTo4OTo1ZDphNTo2ODowZDpjOToxZDoxYzpiODo0Nzo3ZjozMzpmODo3ODpiOTo1YjowYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmJEQ0NBMVNnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQkhNUXN3Q1FZRFZRUUdFd0pWVXpFVwpNQlFHQTFVRUNoTU5SMlZ2VkhKMWMzUWdTVzVqTGpFZ01CNEdBMVVFQXhNWFIyVnZWSEoxYzNRZ1ZXNXBkbVZ5CmMyRnNJRU5CSURJd0hoY05NRFF3TXpBME1EVXdNREF3V2hjTk1qa3dNekEwTURVd01EQXdXakJITVFzd0NRWUQKVlFRR0V3SlZVekVXTUJRR0ExVUVDaE1OUjJWdlZISjFjM1FnU1c1akxqRWdNQjRHQTFVRUF4TVhSMlZ2VkhKMQpjM1FnVlc1cGRtVnljMkZzSUVOQklESXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRQ3pWRkxCeVQ3eTJkeXhVeHBaS2VleHcwVW81ZGZSN2NYRlM2R3FkSHRYcjBvbS9OajFYcWR1R2R0MERFODEKV3pJTEFlUGI2M3AzTmVxcVd1RFc2S0ZYbFBDUW8zUldsRVF3QXg1Y1RpdUZKblNDZWd4Mm9HOU56a0V0b0JVRwpGRiszUXMxN2oxaGhOTndxQ1BrdXd3R21Ja1FjVEFlQzVsdk8wRXA4Qk5NWmN5ZndxcGgvTHE5TzY0Y2VKSGRxClhiYm9XMFc2M01PaEJXOVdqbzhRSnFWSnd5N1hRWWNpNEUrR3ltQzE2cUZqd0FHWEVIbTlBRHdTYlNzVnNheEwKc2U0WXVVNlczTngyL3p1K3oxOER3UHc3Nkw1R0cvL2FRTUpTOS83ak92ZHFkelhRMm8zclhoaHFNY2NldWp3YgpLTlpyVk1hcVc5ZWlMQnNaektJQzlwdFp2VGRyaHJWdGdyclk2c2xXdktrMldQMCtHZlB0RENhcGt6ajRUOEZkCklnYlFsK3JocmNaVjRJRXJLSU02K3ZSN0lWRUF2bEk0enMxbWVhajBnVmJpMElNSlIxRmJVR3JQMjBnYVhUNzMKeS9abDkyenhsZmdDT3pKV2dqbDZXNzB2aVJ1L29iVG8vMytOak44RDhXQk9XQkZNNjZNL0VDdURtZ0Z6MlpSdApoQUFuWnF6d2NFQUpRcEt0VDVNTllRbFJKTmlTMVF1VVliS0hzdTMvbWpYL2hWVEs3VVJEckJzOEZtdElTZ29jClFJZ2Zrc0lMQUFYLzhzZ0NTcVNxcWN5Wmxwd3ZXT0I5NGI2N0I5eGZCSEpjTVRURDdGOHQ0RDFra0NMbTBleTQKTHQxWnJ0bWhONzlVTmR4ek1rK01CQjR6c3NsRzhkaGN5RlZReVdpOXFMbzJDUUlEQVFBQm8yTXdZVEFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSMjgxWGgrcVEyKy9DZlhHSng3VHowUnpnUUt6QWZCZ05WCkhTTUVHREFXZ0JSMjgxWGgrcVEyKy9DZlhHSng3VHowUnpnUUt6QU9CZ05WSFE4QkFmOEVCQU1DQVlZd0RRWUoKS29aSWh2Y05BUUVGQlFBRGdnSUJBR2JCeGlQejJlQXVibC9vejY2d3NDVk5LL2c3V0p0QUpEZGF5NnNXU2YregpkWGt6b1M5dGNCYzBrZjVuZm8vc20rVmVncWxWSHkvYzFGRUhFdjZzRmo0c05jWmovTndRNncyanF0Qjh6TkhRCkwxRXV4QlJhM3VnWjRUN0d6S1FwNXk2RXFnWXdlSFpVY3lpWVdUamdBQTFpMDBKOUlaK3VQVHFNMWZwM0RSZ3IKRmc1Zk51SDhLclV3Sk0vZ1l3eDdXQnIrbWJwQ0VyR1I5SHhvNHNqb3J5enF5WDZ1dXlvOURSWGNOSlcyR0hTbwphZy9IdFBRVHhPUmI3UXJTcEpkTUt1MHZiQktKUGZFbmNLcHFBMUlobjBDb1oxRHk4MW9mMzk4ajl0eDRUdWFZClQxVTZVK1B2OHZTZngzellXSzhwSXBlNDRMMlJMckIyN0ZjUnorOHBSUFBwaFhwZ1krUmRNNGtYMlRHcTJ0YnoKR0RWeXo0Y3JMMk1qaEYyRWpEOVhvSWo4bVpFb0ptbVoxSStYUkw2TzFVaXhwQ2dwOFJXMDRlV2UzZmlQcG04bQoxd2s4T2h3UkRxWnNOL2V0Ukljc0tNZllkSUt6MEc5S1Y3czFLU2VnaStnaHA0ZGtObDNNMkJhc3g3SW5RSkpWCk9DaU5VVzdkRkdkVGJIRmNKb1JOZFZxMmZtQldxVTJ0KzVzZWwvTU4yZEtYVkhmYVBSSzM0Qjd2Q0FhcytZV0gKNmFMY3IzNFlFb1A5VmhkQkx0VXBnbjJaOURIMmNhblBMQUVucFFXNXFySklUaXJ2bjVOU1VaVThVbk9PVmt3WApRTUFKS09TTGFraFQyK3pOVlZYeHh2anBvaXhNcHRFbVgzNnZXa3phSDZieUhDeCtyZ0lXMGxiUUwxZFRSK2lTCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1WaXNhIGVDb21tZXJjZSBSb290IE89VklTQSBPVT1WaXNhIEludGVybmF0aW9uYWwgU2VydmljZSBBc3NvY2lhdGlvbgojIFN1YmplY3Q6IENOPVZpc2EgZUNvbW1lcmNlIFJvb3QgTz1WSVNBIE9VPVZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2aWNlIEFzc29jaWF0aW9uCiMgTGFiZWw6ICJWaXNhIGVDb21tZXJjZSBSb290IgojIFNlcmlhbDogMjU5NTIxODA3NzYyODU4MzYwNDgwMjQ4OTAyNDE1MDU1NjU3OTQKIyBNRDUgRmluZ2VycHJpbnQ6IGZjOjExOmI4OmQ4OjA4OjkzOjMwOjAwOjZkOjIzOmY5OjdlOmViOjUyOjFlOjAyCiMgU0hBMSBGaW5nZXJwcmludDogNzA6MTc6OWI6ODY6OGM6MDA6YTQ6ZmE6NjA6OTE6NTI6MjI6M2Y6OWY6M2U6MzI6YmQ6ZTA6MDU6NjIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDY5OmZhOmM5OmJkOjU1OmZiOjBhOmM3OjhkOjUzOmJiOmVlOjVjOmYxOmQ1Ojk3Ojk4OjlmOmQwOmFhOmFiOjIwOmEyOjUxOjUxOmJkOmYxOjczOjNlOmU3OmQxOjIyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEb2pDQ0FvcWdBd0lCQWdJUUU0WTFUUjAvQnZMQitXVUYxWkFjWWpBTkJna3Foa2lHOXcwQkFRVUZBREJyCk1Rc3dDUVlEVlFRR0V3SlZVekVOTUFzR0ExVUVDaE1FVmtsVFFURXZNQzBHQTFVRUN4TW1WbWx6WVNCSmJuUmwKY201aGRHbHZibUZzSUZObGNuWnBZMlVnUVhOemIyTnBZWFJwYjI0eEhEQWFCZ05WQkFNVEUxWnBjMkVnWlVOdgpiVzFsY21ObElGSnZiM1F3SGhjTk1ESXdOakkyTURJeE9ETTJXaGNOTWpJd05qSTBNREF4TmpFeVdqQnJNUXN3CkNRWURWUVFHRXdKVlV6RU5NQXNHQTFVRUNoTUVWa2xUUVRFdk1DMEdBMVVFQ3hNbVZtbHpZU0JKYm5SbGNtNWgKZEdsdmJtRnNJRk5sY25acFkyVWdRWE56YjJOcFlYUnBiMjR4SERBYUJnTlZCQU1URTFacGMyRWdaVU52YlcxbApjbU5sSUZKdmIzUXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdlY5NVdIbTZoCjJtQ3hsQ2ZMRjlzSFA0Q0ZUOGljdHREMGIwL1BtZGpoMjhKSVhEcXNPVFBISDJxTEpqMHJOZlZJc1pIQkFrNEUKbHBGN3NEUHdzUlJPRVcrMVFLOGJSYVZLNzM2MnJQS2dIMWcvRWtaZ1BJMmg0SDNQVno0ekh2dEg4YW9WbHdkVgpacVcxTFM3WWdGbXlwdzIzUnV3aFkvODFxNlVDenlyMFRQNTc5WlJkaEUybzhtQ1AydzRsUEo5emNjK1UzMHJxCjI5OXlPSXp6bHIzeEY3elN1anRGV3NhbjlzWVhpd0dkL0Jtb0tvTVd1RHBJL2s0K29Lc0dHZWxUODRBVEIrMHQKdno4S1BGVWdPU3dzQUdsMGxVcThJTEtwZWVVWWlaR28zQnhONzd0K053dGQvam1saUZLTUFHenNHSHhCdmZhTApkWGU2WUoyRTUvNHRBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFECkFnRUdNQjBHQTFVZERnUVdCQlFWT0lNUFB5dy9jRE1lelViK0I0d2c0TmZEdHpBTkJna3Foa2lHOXcwQkFRVUYKQUFPQ0FRRUFYL0ZCZlh4Y0NMa3I0TldTUi9wblhLVVR3d01obXl0TWlVYlBXVTNKL3FWQXRtUE4zWEVvbFdjUgp6Q1NzMDBSc2NhNEJJR3NEb284WXR5azZmZVVXWUZONFBNQ3ZGWVAzajFJekpMMWtrNWZ1aS9mYkdLaHRjYlAzCkxCZlFkQ1ZwOS81clBKUytUVXRCakU3aWM5RGprQ0p6UTgzejcrcHp6a1dLc0taSi8weDluWEdJeEhZZGtGc2QKN3YzTTkrNzlZS1d4ZWhaeDBSYlFmQkk4YkdtWDI2NWZPWnB3THdVOEdVWUVtU0EyMEdCdVlRYTdGa0tNY1BjdworK0RiWnFNQUFiM21MTnFSWDZCR2kwMXFuRDA5M1FWRy9uYS9vQW84NUFEbUo3Zi9oQzNldWlJbmxoQng2eUx0CjM5OHpuTS9qcmE2TzFJN21UMUd2RnBMZ1hQWUhEdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BQUEgQ2VydGlmaWNhdGUgU2VydmljZXMgTz1Db21vZG8gQ0EgTGltaXRlZAojIFN1YmplY3Q6IENOPUFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlcyBPPUNvbW9kbyBDQSBMaW1pdGVkCiMgTGFiZWw6ICJDb21vZG8gQUFBIFNlcnZpY2VzIHJvb3QiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiA0OTo3OTowNDpiMDplYjo4NzoxOTphYzo0NzpiMDpiYzoxMTo1MTo5Yjo3NDpkMAojIFNIQTEgRmluZ2VycHJpbnQ6IGQxOmViOjIzOmE0OjZkOjE3OmQ2OjhmOmQ5OjI1OjY0OmMyOmYxOmYxOjYwOjE3OjY0OmQ4OmUzOjQ5CiMgU0hBMjU2IEZpbmdlcnByaW50OiBkNzphNzphMDpmYjo1ZDo3ZToyNzozMTpkNzo3MTplOTo0ODo0ZTpiYzpkZTpmNzoxZDo1ZjowYzozZTowYToyOTo0ODo3ODoyYjpjODozZTplMDplYTo2OTo5ZTpmNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU1qQ0NBeHFnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQjdNUXN3Q1FZRFZRUUdFd0pIUWpFYgpNQmtHQTFVRUNBd1NSM0psWVhSbGNpQk5ZVzVqYUdWemRHVnlNUkF3RGdZRFZRUUhEQWRUWVd4bWIzSmtNUm93CkdBWURWUVFLREJGRGIyMXZaRzhnUTBFZ1RHbHRhWFJsWkRFaE1COEdBMVVFQXd3WVFVRkJJRU5sY25ScFptbGoKWVhSbElGTmxjblpwWTJWek1CNFhEVEEwTURFd01UQXdNREF3TUZvWERUSTRNVEl6TVRJek5UazFPVm93ZXpFTApNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdNRWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFCkJ3d0hVMkZzWm05eVpERWFNQmdHQTFVRUNnd1JRMjl0YjJSdklFTkJJRXhwYldsMFpXUXhJVEFmQmdOVkJBTU0KR0VGQlFTQkRaWEowYVdacFkyRjBaU0JUWlhKMmFXTmxjekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUApBRENDQVFvQ2dnRUJBTDVBbmZSdTRlcDJoeHhOUlVTT3ZrYklnd2Fkd1NyK0dCK081QUw2ODZ0ZFVJb1dNUXVhCkJ0REZjQ0xOU1MxVVk4eTJibWhHQzFQcXkwd2t3THh5VHVyeEZhNzBWSm9TQ3NONnNqTmc0dHFKVmZNaVdQUGUKM00vdmc0YWlqSlJQbjJqeW1KQkdoQ2ZIZHIvanpEVXNpMTRIWkdXQ3dFaXdxSkg1WVo5MklGQ29rY2RtdGV0NApZZ05XOElvYUUrb3hveDZnbWYwNDl2WW5NbGh2Qi9WcnVQc1VLNiszcXN6V1kxOXpqTm9GbWFnNHFNc1hlRFpSCnJPbWU5SGc2amM4UDJVTGltQXlyTDU4T0FkN3ZuNWxKOFMzZnJIUk5HNWkxUjhYbEtkSDVrQmpIWXB5K2c4Y20KZXo2S0pjZkEzWjNtTldnUUlKMlAyTjdTdzRTY0RWN29MOGtDQXdFQUFhT0J3RENCdlRBZEJnTlZIUTRFRmdRVQpvQkVLSXo2VzhRZnM0cThwNzRLbGY5QXdwTFF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3ZXdZRFZSMGZCSFF3Y2pBNG9EYWdOSVl5YUhSMGNEb3ZMMk55YkM1amIyMXZaRzlqWVM1amIyMHYKUVVGQlEyVnlkR2xtYVdOaGRHVlRaWEoyYVdObGN5NWpjbXd3TnFBMG9ES0dNR2gwZEhBNkx5OWpjbXd1WTI5dApiMlJ2TG01bGRDOUJRVUZEWlhKMGFXWnBZMkYwWlZObGNuWnBZMlZ6TG1OeWJEQU5CZ2txaGtpRzl3MEJBUVVGCkFBT0NBUUVBQ0ZiOEF2Q2I2UCtrK3RaN3hrU0F6ay9FeGZZQVdNeW10cndVU1dnRWR1am03bDNzQWc5ZzFvMVEKR0U4bVRnSGo1ckNsN3IrOGRGUkJ2LzM4RXJqSFQxcjBpV0FGZjJDM0JVcno5dkhDdjhTNWRJYTJMWDFyek5MegpSdDB2eHVCcXc4TTBBeXg5bHQxYXdnNm5DcG5CQll1ckRDL3pYRHJQYkRkVkNZZmVVMEJzV08vOHRxdGxiZ1QyCkc5dzg0Rm9WeHA3WjhWbElNQ0ZsQTJ6czZTRno3SnNEb2VBM3JhQVZHSS82dWdMT3B5eXBFQk1zMU9VSUpxc2kKbDJENGtGNTAxS0thVTczeXFXamdvbTdDMTJ5eG93K2V2K3RvNTFieXJ2TGpLemc2Q1lHMWE0WFh2aTN0UHhxMwpzbVBpOVdJc2d0UnFBRUZROFRtRG41WHBOcGFZYmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049UXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVF1b1ZhZGlzIExpbWl0ZWQgT1U9Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPVF1b1ZhZGlzIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1RdW9WYWRpcyBMaW1pdGVkIE9VPVJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIlF1b1ZhZGlzIFJvb3QgQ0EiCiMgU2VyaWFsOiA5ODUwMjY2OTkKIyBNRDUgRmluZ2VycHJpbnQ6IDI3OmRlOjM2OmZlOjcyOmI3OjAwOjAzOjAwOjlkOmY0OmYwOjFlOjZjOjA0OjI0CiMgU0hBMSBGaW5nZXJwcmludDogZGU6M2Y6NDA6YmQ6NTA6OTM6ZDM6OWI6NmM6NjA6ZjY6ZGE6YmM6MDc6NjI6MDE6MDA6ODk6NzY6YzkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGE0OjVlOmRlOjNiOmJiOmYwOjljOjhhOmUxOjVjOjcyOmVmOmMwOjcyOjY4OmQ2OjkzOmEyOjFjOjk5OjZmOmQ1OjFlOjY3OmNhOjA3Ojk0OjYwOmZkOjZkOjg4OjczCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGMERDQ0JMaWdBd0lCQWdJRU9yWlFpekFOQmdrcWhraUc5dzBCQVFVRkFEQi9NUXN3Q1FZRFZRUUdFd0pDClRURVpNQmNHQTFVRUNoTVFVWFZ2Vm1Ga2FYTWdUR2x0YVhSbFpERWxNQ01HQTFVRUN4TWNVbTl2ZENCRFpYSjAKYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRFdU1Dd0dBMVVFQXhNbFVYVnZWbUZrYVhNZ1VtOXZkQ0JEWlhKMAphV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwd01UQXpNVGt4T0RNek16TmFGdzB5TVRBek1UY3hPRE16Ck16TmFNSDh4Q3pBSkJnTlZCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk1hVzFwZEdWa01TVXcKSXdZRFZRUUxFeHhTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVM0d0xBWURWUVFERXlWUgpkVzlXWVdScGN5QlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUlCSWpBTkJna3Foa2lHCjl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF2MkcxbFZPNlYvejY4bWNMT2hyZkVZQmtsYlRSdk0xNnovWXAKbGk0a1ZFQWtPUGNhaGR4WVRNdWtKMEtYMEorRGlzUGtCZ05iQUtWUkhuQUVkT0xCMURxcjE2MDdCeGdGanYyRApyT3BtMlJnYmFJcjFWeHFZdXZYdGRqMTgyZDZVYWp0TEY4SFZqNzFsT0RxVjBEMVZOazdmZVZjeEtoN1lXV1ZKCldDQ1lmcXRmZnAvcDFrM3NnM1NweDJ6WTdpbEtoU29HRlBsVTV0UGFaUWVMWXpjUzE5RHN3M3NnUVVTajdjdWcKRitGeFpjNGRaakgzZGdFWnlIMERXTGFWU1IybUVpYm94Z3gyNE9ObXkrcGRwaWJ1NWN4ZnZXZW5BU2NPb3NwVQp4YkY2bFIxeEhrb3BpZ1BjYWtYQnBCbGViemJOdzZLd3QvNWNPT0pTdlBoRVErYVF1d0lEQVFBQm80SUNVakNDCkFrNHdQUVlJS3dZQkJRVUhBUUVFTVRBdk1DMEdDQ3NHQVFVRkJ6QUJoaUZvZEhSd2N6b3ZMMjlqYzNBdWNYVnYKZG1Ga2FYTnZabVp6YUc5eVpTNWpiMjB3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekNDQVJvR0ExVWRJQVNDQVJFdwpnZ0VOTUlJQkNRWUpLd1lCQkFHK1dBQUJNSUg3TUlIVUJnZ3JCZ0VGQlFjQ0FqQ0J4eHFCeEZKbGJHbGhibU5sCklHOXVJSFJvWlNCUmRXOVdZV1JwY3lCU2IyOTBJRU5sY25ScFptbGpZWFJsSUdKNUlHRnVlU0J3WVhKMGVTQmgKYzNOMWJXVnpJR0ZqWTJWd2RHRnVZMlVnYjJZZ2RHaGxJSFJvWlc0Z1lYQndiR2xqWVdKc1pTQnpkR0Z1WkdGeQpaQ0IwWlhKdGN5QmhibVFnWTI5dVpHbDBhVzl1Y3lCdlppQjFjMlVzSUdObGNuUnBabWxqWVhScGIyNGdjSEpoClkzUnBZMlZ6TENCaGJtUWdkR2hsSUZGMWIxWmhaR2x6SUVObGNuUnBabWxqWVhSbElGQnZiR2xqZVM0d0lnWUkKS3dZQkJRVUhBZ0VXRm1oMGRIQTZMeTkzZDNjdWNYVnZkbUZrYVhNdVltMHdIUVlEVlIwT0JCWUVGSXRMYmUzVApLYmtHR2V3NU9hbndsNFJxeSsvZk1JR3VCZ05WSFNNRWdhWXdnYU9BRkl0TGJlM1RLYmtHR2V3NU9hbndsNFJxCnkrL2ZvWUdFcElHQk1IOHhDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXAKZEdWa01TVXdJd1lEVlFRTEV4eFNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUzR3TEFZRApWUVFERXlWUmRXOVdZV1JwY3lCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNWdnUTZ0bENMCk1BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQWl0UVV0ZjcwbXBLbkdkU2sKZm5JWWo5bG9mRklrM1dkdk9YckVxbDQ5NGxpd1RYQ1loR0hvRytOcEdBN08rMGRRb0U3LzhDUWZ2YkxPOVNmOAo3QzlUcW5ON0F6MTBidVlXbnV1bExzUy9WaWRRSzJLNnZrc2NQRlZjUVIwa3ZvSWdSMTNWUkg1NkZtamZmVTFSCmNIaFhIVE1lL1FLWm5Bek5DZ1ZQeDd1T3BIWDZTbTJ4Z0k0SlZybWNHbUQrWGNIWGV0d1JlTkRXWGNHMzFhMHkKbVFNNmlzeFVKVGt4Z1hzVElsRzZSbXlodTU3NkJHeEpKblNQMG5QcnpEQ2k1dXBaSW9mNGwvVU8vZXJNa3FRVwp4RklZNmlIT3NmSG1oSUhsdXFtR0tQSkRXbDBTbmF3ZTJhamxDbXFuZjZDSEtjL3lpVTNVN01YaTVuclFOaU9LClNuUTIrUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENBIDIgTz1RdW9WYWRpcyBMaW1pdGVkCiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDQSAyIE89UXVvVmFkaXMgTGltaXRlZAojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSAyIgojIFNlcmlhbDogMTI4OQojIE1ENSBGaW5nZXJwcmludDogNWU6Mzk6N2I6ZGQ6Zjg6YmE6ZWM6ODI6ZTk6YWM6NjI6YmE6MGM6NTQ6MDA6MmIKIyBTSEExIEZpbmdlcnByaW50OiBjYTozYTpmYjpjZjoxMjo0MDozNjo0Yjo0NDpiMjoxNjoyMDo4ODo4MDo0ODozOToxOTo5Mzo3YzpmNwojIFNIQTI1NiBGaW5nZXJwcmludDogODU6YTA6ZGQ6N2Q6ZDc6MjA6YWQ6Yjc6ZmY6MDU6Zjg6M2Q6NTQ6MmI6MjA6OWQ6Yzc6ZmY6NDU6Mjg6Zjc6ZDY6Nzc6YjE6ODM6ODk6ZmU6YTU6ZTU6YzQ6OWU6ODYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ0ekNDQTUrZ0F3SUJBZ0lDQlFrd0RRWUpLb1pJaHZjTkFRRUZCUUF3UlRFTE1Ba0dBMVVFQmhNQ1FrMHgKR1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1URWxGMWIxWmhaR2x6SUZKdgpiM1FnUTBFZ01qQWVGdzB3TmpFeE1qUXhPREkzTURCYUZ3MHpNVEV4TWpReE9ESXpNek5hTUVVeEN6QUpCZ05WCkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXBkR1ZrTVJzd0dRWURWUVFERXhKUmRXOVcKWVdScGN5QlNiMjkwSUVOQklESXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDYQpHTXBMbEEwQUxhOERLWXJ3RDRISXJrd1poUjBJbjZzcFJJWHpMNEd0TWg2UVJyK2poaVlhSHY1K0hCZzZYSnhnCkZ5bzZkSU16TUgxaFZCSEw3YXZnNXRLaWZ2VnJieGkzQ2dzdC9lays3d3JHc3hEcDNNSkdGL2hkL2FUYS81NUoKV3B6bU0rWWtsdmMvdWxzckhIbzF3dFpuL3F0bVVJdHRLR0FyNzlkZ3c4ZVR2STAya2ZOLytOc1JFOFNjZDNiQgpycmNDYW9GNnFVV0Q0Z1htdVZiQmxEZVBTSEZqSXV3WFpRZVZpa3ZmajhaYUN1V3c0MTllYXhHckRQbUY2MFRwCitBUno4dW4rWEppTTlYT3ZhN1IremRSY0FpdE1PZUd5bFpVdFFvZlgxYk9RUTdkc0UvSGUzZmJFK0lrLzBYWDEKa3NPUjFZcUkwSkRzM0czZWljSmxjWmFMRFFQOW5MOWJGcXlTMityK2VYeXQ2Ni8zRnN2YnpTVXI1Ui83bXAvaQpVY3c2VXd4STVnNjl5YlIyQmxMbUVST0ZjbU1EQk9BRU5pc2dHUUxvZEtjZnRzbFdadkIxSmR4bndRNWhZSWl6ClB0R28vS1BhSGJEUnNTTlUzMFIyYmUxQjJNR3lJclpUSE44MUhkeWhkeW94NUMzMTVlWGJ5T0QvNVlEWEMyT2cKL3pPaEQ3b3NGUlhxbDdQU29yVys4b3lXSGhxUEhXeWtZVGU1aG5NejE1ZVduaU45Z3FSTWdlS2gwYnBuWDVVSApveWNSN2hZUWU3eEZTa3l5Qk5Lcjc5WDlERkhPVUdvSU1mbVIyZ3lQWkZ3RHd6cUxJRDl1aldjOU90YitmVnVJCnlWNzd6R0hjaXpOMzAwUXlOUWxpQkpJV0VOaWVKMGY3T3lIaitPc2RXd0lEQVFBQm80R3dNSUd0TUE4R0ExVWQKRXdFQi93UUZNQU1CQWY4d0N3WURWUjBQQkFRREFnRUdNQjBHQTFVZERnUVdCQlFhaEdLOFNFd3pKUVRVN3REMgpBOFFaUnRHVWF6QnVCZ05WSFNNRVp6QmxnQlFhaEdLOFNFd3pKUVRVN3REMkE4UVpSdEdVYTZGSnBFY3dSVEVMCk1Ba0dBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhHekFaQmdOVkJBTVQKRWxGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTW9JQ0JRa3dEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBRDRLRmsyZgpCbHVvcm5GZEx3VXZaK1lUUllQRU52Ynp3Q1lNRGJWSFpGMzR0SExKUnFVREdDZFZpWGg5ZHVxV05JQVhJTnpuCmcvaU4vQWU0Mmw5TkxtZXloUDNaUlB4M1VJSG1mTFRKRFF0eVUvaDJCd2RCUjVZTSsrQ0NKcE5WalA0aUgyQmwKZkYvbkpyUDNNcENZVU5RM2NWWDJraUY0OTVWNSt2Z3RKb2RtVmpCM3BqZDRNMUlRV0s0L1lZN3lhckh2R0g1SwpXV1BLamFKVzFhY3Z2RllmenpuQjR2c0txQlVzZlUxNlk4WnNsMFE4MG0vRFNoY0srSkRTVjZJWlVhVXRsMEhhCkIwK3BVTnFRalpSRzRUN3dsUDBRQURqMU8raEE0YlJ1VmhvZ3pHOVlqZTB1UlkvVzZaTS81N0VzM3pyV0lvemMKaExzaWI5RDQ1TVk1NlFTSVBNTzY2MVY2YllDWkpQVnNBZnY0bDdDVVcrdjkwbS94ZDJnTk5XUWpyTGhWb1FQUgpUVUlaM1BoMVdWYWorYWhKZWZpdkRya1JvSHkzYXUwMDBMWW1ZamdhaHd6NDZQMHUwNUIvQjVFcUhkWitYSVdECm1iQTRDRC9wWHZrMUIrVEpZbTVYZjZkUWxmZTZ5SnZtanFJQnhkWm12M2xoOHp3YzRibUNYRjJndytuWVNMMFoKb2hFVUdXNnloaHRvUGtnM0dvaTNYWlplbk1mdkoySUk0cEVaWE5MeElkMjZGMEtDbDNHQlV6R3BuL1o5WXI5eQo0YU9USGN5S0psb0pPTkRPMXcyQUZyUjRwVHFIVEkyS3BkVkdsL0lzRUxtOFZDTEFBVkJwUTU3MHN1OXQrT3phCjhlT3g3OStSajFRcUN5WEJKaG5FVWhBRlpkV0NFT3JDTWMwdQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049UXVvVmFkaXMgUm9vdCBDQSAzIE89UXVvVmFkaXMgTGltaXRlZAojIFN1YmplY3Q6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBMYWJlbDogIlF1b1ZhZGlzIFJvb3QgQ0EgMyIKIyBTZXJpYWw6IDE0NzgKIyBNRDUgRmluZ2VycHJpbnQ6IDMxOjg1OjNjOjYyOjk0Ojk3OjYzOmI5OmFhOmZkOjg5OjRlOmFmOjZmOmUwOmNmCiMgU0hBMSBGaW5nZXJwcmludDogMWY6NDk6MTQ6Zjc6ZDg6NzQ6OTU6MWQ6ZGQ6YWU6MDI6YzA6YmU6ZmQ6M2E6MmQ6ODI6NzU6NTE6ODUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE4OmYxOmZjOjdmOjIwOjVkOmY4OmFkOmRkOmViOjdmOmUwOjA3OmRkOjU3OmUzOmFmOjM3OjVhOjljOjRkOjhkOjczOjU0OjZiOmY0OmYxOmZlOmQxOmUxOjhkOjM1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHblRDQ0JJV2dBd0lCQWdJQ0JjWXdEUVlKS29aSWh2Y05BUUVGQlFBd1JURUxNQWtHQTFVRUJoTUNRazB4CkdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEd6QVpCZ05WQkFNVEVsRjFiMVpoWkdseklGSnYKYjNRZ1EwRWdNekFlRncwd05qRXhNalF4T1RFeE1qTmFGdzB6TVRFeE1qUXhPVEEyTkRSYU1FVXhDekFKQmdOVgpCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk1hVzFwZEdWa01Sc3dHUVlEVlFRREV4SlJkVzlXCllXUnBjeUJTYjI5MElFTkJJRE13Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRRE0KVjBJV1ZKem1tTlBUVGU3KzdjZWZRemxLWmJQb0ZvZzAydzFaa1hUUGtyZ0VRSzBDU3pHcnZJMlJhTmdnRGhvQgo0aHA3VGhkZDRvcTNQNWthemV0aHE4SmxwaCszdDcyM2ovejljSThMb0dlK0FhSlp6M0htRHlsMi83RldlVVVyCkg1NTZWT2lqS1RWb3BBRlBENlF1Tis4YnYrT1BFS2h5cTFoWDUxU0d5TW56VzlvczJsMk9ianlqUHRyN2d1WGQKOGx5eUJUTnZpamJPMEJOTy83OUtERFJNcHNNaHZWQUVWZXV4dTUzN1JSNWtGZDVWQVl3Q2RyWExvVDlDYWJ3dgp2V2hERmxhSktqZGhrZjJtcms3QXl4UmxsRGRMa2didkJOREluSWpiQzN1QnI3RTlLc1JsT25pMjd0eUFzZExUCm1adzY3bXRhYTdPTnQ5WE9uTUsrcFVzdkZyR2VhRHNHYjY1OW4vamU3TXdwcDVpakpVTXY3L0ZmSnVHSVRmaGUKYnRmWkZHNFpNMm1uTzRTSms4UlRWUk9oVVhoQStMakpvdTU3dWxKQ2c1NFU3UVZTV2xsV3A1ZjhuVDhLS2RqYwpUNUVPRTd6ZWxhVGZpNW0rckpzemlPKzFnYThieGlKVHlQYkg3cGNVc01WOGVGTEk4TTV1ZDJDRXB1a3FkaUR0CldBRVhNSlBwR292Z2MyUFphcEtVU1U2MHJVcUZ4S01pTVB3SjdXZ2ljNmFJREZVaFdNWGhPcDhxM2NyaGtPRFoKYzZ0c2dMam9DMlNUb0p5TUdmK3owZ3pza1NhSGlyT2k0WENQTEFybHpXMW9VZXZhUHdWL2l6TG1FMXhyL2w5QQo0aUxJdExSa1Q5YTZmVWcrcUdrTTE3dUdjY2x6dUQ4N25TVkwydjlBNndJREFRQUJvNElCbFRDQ0FaRXdEd1lEClZSMFRBUUgvQkFVd0F3RUIvekNCNFFZRFZSMGdCSUhaTUlIV01JSFRCZ2tyQmdFRUFiNVlBQU13Z2NVd2daTUcKQ0NzR0FRVUZCd0lDTUlHR0dvR0RRVzU1SUhWelpTQnZaaUIwYUdseklFTmxjblJwWm1sallYUmxJR052Ym5OMAphWFIxZEdWeklHRmpZMlZ3ZEdGdVkyVWdiMllnZEdobElGRjFiMVpoWkdseklGSnZiM1FnUTBFZ015QkRaWEowCmFXWnBZMkYwWlNCUWIyeHBZM2tnTHlCRFpYSjBhV1pwWTJGMGFXOXVJRkJ5WVdOMGFXTmxJRk4wWVhSbGJXVnUKZEM0d0xRWUlLd1lCQlFVSEFnRVdJV2gwZEhBNkx5OTNkM2N1Y1hWdmRtRmthWE5uYkc5aVlXd3VZMjl0TDJOdwpjekFMQmdOVkhROEVCQU1DQVFZd0hRWURWUjBPQkJZRUZQTEFFK0NDUXo3NzdpOW5NcFkxWE51NHl3TFFNRzRHCkExVWRJd1JuTUdXQUZQTEFFK0NDUXo3NzdpOW5NcFkxWE51NHl3TFFvVW1rUnpCRk1Rc3dDUVlEVlFRR0V3SkMKVFRFWk1CY0dBMVVFQ2hNUVVYVnZWbUZrYVhNZ1RHbHRhWFJsWkRFYk1Ca0dBMVVFQXhNU1VYVnZWbUZrYVhNZwpVbTl2ZENCRFFTQXpnZ0lGeGpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQWdFQVQ2MmdMRXo2d1BKdjkyWlZxeU0wCjd1Y3Ayc05idHJDRDJkRFE0aUg3ODJDbk8xMWdVeWVpbS9ZSUlpcm52NkJ5NVp3a2FqR3hrSG9uMjRRUmlTZW0KZDFvNDE3K3Nodnp1WFlPOEJzYlJkMnNQYlNRdlMzcHNwd2VXeXVPRW42MklpeDJyRm8xYlpoZlpGdlNMZ05MZAorTEoydy93NEU2b00za0pwSzI3elBPdUFKOXYxcGtRTm4xcFZXUXZWRFZKSXhhNmY4aStBeGVveVVEVVNseTdCCjRmL3hJNGhST0oveVpsWjI1dzlSbDZWU0RFMUpVWlUyUGIraVN3d1FIWWFaVEtyemNoR1Q1T3IybTlxb1hhZE4KdDU0Q3JuTUF5Tm9qQStqNTZobDBZZ0NVeXlJZ3ZwU25XYldDYXI2WmVYcXA4a29rVXZkMC9icE81cWdkQW02eApEWUJFd2E3VEl6ZGZ1NFY4SzVJdTZINmxpOTJaNGI4bmJ5MWRxbnVIL2dyZFMveU85U2JrYm5CQ2JqUHNNWjU3Cms4SGt5V2thUGNCclRpSnQ3cXRZVGNiUVFjRXI2azhTaDE3clJkaHM5WmdDMDZEWVZZb0dtUm1pb0hmUk1KNnMKekhYdWcvV3dZam5QYkZmaVROS1JDdzUxS0J1YXYvMGFRL0hLZC9zN2oyRzRhU2dXUWdSZWNDb2NJZGlQNGIwagpXeTEwUUpMWll4a05jOTFwdkdKSHZPQjBLN0xyZmI1Qkc3WEFSc1doSXN0ZlRzRW9rdDRZdXRVcUtMc1JpeGVUCm1KbGdsRndqejFvbmwxNExCUWFUTng0N2FUYnJxWjVoSFk4eTJvNE0xblErZXdrazJnRjNSOFE3elRTTW1mWEsKNFNWaE03SlpHK0p1MXpkWHRnMnBFdG89Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPVNFQ09NIFRydXN0Lm5ldCBPVT1TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEKIyBTdWJqZWN0OiBPPVNFQ09NIFRydXN0Lm5ldCBPVT1TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEKIyBMYWJlbDogIlNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdCBDQSIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IGYxOmJjOjYzOjZhOjU0OmUwOmI1OjI3OmY1OmNkOmU3OjFhOmUzOjRkOjZlOjRhCiMgU0hBMSBGaW5nZXJwcmludDogMzY6YjE6MmI6NDk6Zjk6ODE6OWU6ZDc6NGM6OWU6YmM6Mzg6MGY6YzY6NTY6OGY6NWQ6YWM6YjI6ZjcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGU3OjVlOjcyOmVkOjlmOjU2OjBlOmVjOjZlOmI0OjgwOjAwOjczOmE0OjNmOmMzOmFkOjE5OjE5OjVhOjM5OjIyOjgyOjAxOjc4Ojk1Ojk3OjRhOjk5OjAyOjZiOjZjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEV2pDQ0FrS2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURCUU1Rc3dDUVlEVlFRR0V3SktVREVZCk1CWUdBMVVFQ2hNUFUwVkRUMDBnVkhKMWMzUXVibVYwTVNjd0pRWURWUVFMRXg1VFpXTjFjbWwwZVNCRGIyMXQKZFc1cFkyRjBhVzl1SUZKdmIzUkRRVEV3SGhjTk1ETXdPVE13TURReU1EUTVXaGNOTWpNd09UTXdNRFF5TURRNQpXakJRTVFzd0NRWURWUVFHRXdKS1VERVlNQllHQTFVRUNoTVBVMFZEVDAwZ1ZISjFjM1F1Ym1WME1TY3dKUVlEClZRUUxFeDVUWldOMWNtbDBlU0JEYjIxdGRXNXBZMkYwYVc5dUlGSnZiM1JEUVRFd2dnRWlNQTBHQ1NxR1NJYjMKRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDenMvNS8wMjJ4N3haOFY2VU1iWGFLTDB1L1pQdE03b3J3OHlsOAo5Zi91S3VEcDZicGJaQ0thbW04c09pWnBVUVdaSnR6VkhHcHh4cHA5SHAzZGZHekdqR2RuU2o3NGNiQVpKNmtKCkRLYVZ2MHVNRFBwVm1Edlk2Q0toUzNFNGVheVhrbW16aVg3cUlXZ0dtQlNXaDlKaE5yeHRKMWFlVis3QXdGYjkKTXMrazJZN0NJOWVOcVBQWUpheVg1SEE0OUxZNnRKMDdseVpEbzZHOFNWbHlUQ013aHdGWTlrNitIR2hXWnEvTgpRVjNJczAwcVZVYXJIOW9lNGtBOTI4MTl1WktBbkRmZERKWmtuZHdpOTJTTDMySGVGWlJTRmFCOVVzbExxQ0hKCnhySHR5OE9WWU5FUDhLdHcrTi9MVFg3czF2cXIyYjEvVlBLbDZYbjYyZFoySkNoekFnTUJBQUdqUHpBOU1CMEcKQTFVZERnUVdCQlNnYzBtWmFOeUZXMlhqbXlndlY1KzlNN3dIU0RBTEJnTlZIUThFQkFNQ0FRWXdEd1lEVlIwVApBUUgvQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBYUVDcHFMdmtUMTE1c3dXMUY3TmdFK3ZHCmtsM2cwZE5xL3Z1K20yMi94d1Z0V1NERUhQQzMyb1JZQW1QNlNCYnZUNlVMOTBxWThqK2VHNjFIYTJQT0NFZnIKVWo5NG5LOU5ydmpWVDgrYW1Db1FRVGxTeE4zWm13N3Zrd0d1c2k3S2FFSWtRbXl3c3pvK3plbmFTTVFWeStuNQpCdytTVUVtSzNUR1hYOG5wTjZvN1dXV1hsRExKczU4K09tSll4VW10WWc1eHBUS3FMOGFKZGtOQUV4Tm5QYUpVCkpSREw4VHJ5MmZyYlNWYTdwdjZuUVRYRDRJaGh5WWpIM3pZUUlwaFo2ckJLKzFZV2MyNnNUZmNpb1UrdEhYb3QKUlNmbE1NRmU4dG9UeXlWQ1VaVkhBNHhzSWN4MFF1MVQvek9Manc5WEFSWXZ6NmJ1eVhBaUZMMzl2bXdMQXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U29uZXJhIENsYXNzMiBDQSBPPVNvbmVyYQojIFN1YmplY3Q6IENOPVNvbmVyYSBDbGFzczIgQ0EgTz1Tb25lcmEKIyBMYWJlbDogIlNvbmVyYSBDbGFzcyAyIFJvb3QgQ0EiCiMgU2VyaWFsOiAyOQojIE1ENSBGaW5nZXJwcmludDogYTM6ZWM6NzU6MGY6MmU6ODg6ZGY6ZmE6NDg6MDE6NGU6MGI6NWM6NDg6NmY6ZmIKIyBTSEExIEZpbmdlcnByaW50OiAzNzpmNzo2ZDplNjowNzo3Yzo5MDpjNTpiMTozZTo5MzoxYTpiNzo0MToxMDpiNDpmMjplNDo5YToyNwojIFNIQTI1NiBGaW5nZXJwcmludDogNzk6MDg6YjQ6MDM6MTQ6YzE6Mzg6MTA6MGI6NTE6OGQ6MDc6MzU6ODA6N2Y6ZmI6ZmM6Zjg6NTE6OGE6MDA6OTU6MzM6NzE6MDU6YmE6Mzg6NmI6MTU6M2Q6ZDk6MjcKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJRENDQWdpZ0F3SUJBZ0lCSFRBTkJna3Foa2lHOXcwQkFRVUZBREE1TVFzd0NRWURWUVFHRXdKR1NURVAKTUEwR0ExVUVDaE1HVTI5dVpYSmhNUmt3RndZRFZRUURFeEJUYjI1bGNtRWdRMnhoYzNNeUlFTkJNQjRYRFRBeApNRFF3TmpBM01qazBNRm9YRFRJeE1EUXdOakEzTWprME1Gb3dPVEVMTUFrR0ExVUVCaE1DUmtreER6QU5CZ05WCkJBb1RCbE52Ym1WeVlURVpNQmNHQTFVRUF4TVFVMjl1WlhKaElFTnNZWE56TWlCRFFUQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFKQVhTaldkeXZBTmxzZEUraFkzL0VpOXZYK0FMVFU3NFcrbwpaNm0vQXh4TmpHOHlSOVZCYUtRVEJNRTFESnFFUS94Y0hmK0pzK2dYR00yUlgvdUo0K3EvVGwxOEd5YlRkWG50CjVvVGpWK1d0S2NUME9pam5wWHVFTm1tei9WNTJ2YU10bWRPUVRpTW9mUmhqOFZRN0pwMTJXNWRDc3YrdThFN3MKM1RtVlRvTUdmK2RKUU1qRkFiSlVXbVlkUGZ6NTZUd0tub0c0Y1BBQmkrUWpWSHpJcnZpUUhnQ1djdFJVejJFagp2T3I3blFLVjBiYTVjVHBwQ0Q4UHRPRkN4NGoxUDVpb3A3b2M0SEZ4NzFoWGdWQjZYR3QwUmc2REE1akRqcWh1CjhuWXliaWVEd25QejNCam90SlBxZFVSckJHQWdjVmVIbmZPK29KQWpQWW9rNGRvaDI4TUNBd0VBQWFNek1ERXcKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFSQmdOVkhRNEVDZ1FJU3FDcVdJVFRYand3Q3dZRFZSMFBCQVFEQWdFRwpNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUJhem9mNUZuSVZWMHNkMlp2bm9pWXc3Sk5uMzlZdDBqU3Y5emlsCnpxc1d1YXN2ZkRYTHJOQVB0RXdyL0lEdmE0eVJYeloyOTl1ekd4bnE5TElSL1dGeFJMOG9zem9kdjdORDZKKy8KM0RFSWNiQ2RqZFkwUnpLUXhtVWs5NkJLZkFSemp6bHZGNHh5dGIxTHlIcjRlNFBES0U2Y0NlcG5QN0puQkJ2RApGTnI0NTBra2tkQWRhdnBoT2U5cjV5RjFCZ2ZZRXJRaElIQkNjWUhhUEpvMnZxWmJEV3BzbWgrUmUvbjU3MEs2ClRrNmV6QXlObE56WlJaeGU3RUpRWTY3MFhjU3hFdHpLTzZndW5SUmFCWFczN05kajRybzF0Z1FJa2VqYW5aejIKWnJVWXJBcW1WQ1kwTTlJYndkUi9HanFPQzZveWJ0djhUeVdmMlRMSGxscHdyTjlNCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1YUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1YUmFtcCBTZWN1cml0eSBTZXJ2aWNlcyBJbmMgT1U9d3d3LnhyYW1wc2VjdXJpdHkuY29tCiMgU3ViamVjdDogQ049WFJhbXAgR2xvYmFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89WFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jIE9VPXd3dy54cmFtcHNlY3VyaXR5LmNvbQojIExhYmVsOiAiWFJhbXAgR2xvYmFsIENBIFJvb3QiCiMgU2VyaWFsOiAxMDcxMDg5MDg4MDM2NTE1MDk2OTI5ODAxMjQyMzM3NDUwMTQ5NTcKIyBNRDUgRmluZ2VycHJpbnQ6IGExOjBiOjQ0OmIzOmNhOjEwOmQ4OjAwOjZlOjlkOjBmOmQ4OjBmOjkyOjBhOmQxCiMgU0hBMSBGaW5nZXJwcmludDogYjg6MDE6ODY6ZDE6ZWI6OWM6ODY6YTU6NDE6MDQ6Y2Y6MzA6NTQ6ZjM6NGM6NTI6Yjc6ZTU6NTg6YzYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGNlOmNkOmRjOjkwOjUwOjk5OmQ4OmRhOmRmOmM1OmIxOmQyOjA5OmI3OjM3OmNiOmUyOmMxOjhjOmZiOjJjOjEwOmMwOmZmOjBiOmNmOjBkOjMyOjg2OmZjOjFhOmEyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTURDQ0F4aWdBd0lCQWdJUVVKUnM3QmpxMVp4TjFaZnZkWStnclRBTkJna3Foa2lHOXcwQkFRVUZBRENCCmdqRUxNQWtHQTFVRUJoTUNWVk14SGpBY0JnTlZCQXNURlhkM2R5NTRjbUZ0Y0hObFkzVnlhWFI1TG1OdmJURWsKTUNJR0ExVUVDaE1iV0ZKaGJYQWdVMlZqZFhKcGRIa2dVMlZ5ZG1salpYTWdTVzVqTVMwd0t3WURWUVFERXlSWQpVbUZ0Y0NCSGJHOWlZV3dnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTURReE1UQXhNVGN4Ck5EQTBXaGNOTXpVd01UQXhNRFV6TnpFNVdqQ0JnakVMTUFrR0ExVUVCaE1DVlZNeEhqQWNCZ05WQkFzVEZYZDMKZHk1NGNtRnRjSE5sWTNWeWFYUjVMbU52YlRFa01DSUdBMVVFQ2hNYldGSmhiWEFnVTJWamRYSnBkSGtnVTJWeQpkbWxqWlhNZ1NXNWpNUzB3S3dZRFZRUURFeVJZVW1GdGNDQkhiRzlpWVd3Z1EyVnlkR2xtYVdOaGRHbHZiaUJCCmRYUm9iM0pwZEhrd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNZSkI2OUZiUzYKMzhlTXBTZTJPQXRwODdaT3FDd3VJUjFjUk44aFhYNGpkUDVlZnJSS3Q2YXRINjdnQmhiaW0xdlpaM1JyWFlDUApLWjJHRzltY0RaaHRkaEFvV09SbHNIOUttSG1mNE1NeGZvQXJ0WXpBUURzUmh0RExvb1kyWUtUVk1JSnQyVzdRCkR4SUVNNWRmVDJGYThPVDVrYXZuSFR1ODZNLzBheTAwZk9KSVlSeU84MkZFekcrZ1NxbVVzRTNhNTZrMGVuSTQKcUVITVBKUVJmZXZJcG95M2hzdktNenZaUFRlTCszbytoaXpuYzljS1Y2eGtteG5yOUE4RUNJcXNBeGNaWlBSYQpKU0tOTkN5eTltZ2RFbTNUaWg0VTJzU1BwdUlqaGRWNkRiMXE0T25zN0JlN1FodG5xaVh0UllNaC9NSEpmTlZpClB2cnl4UzNUL2RSbEFnTUJBQUdqZ1o4d2dad3dFd1lKS3dZQkJBR0NOeFFDQkFZZUJBQkRBRUV3Q3dZRFZSMFAKQkFRREFnR0dNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTVpQb2owR1k0UUpuTTVpNUFTcwpqVnkxNmJZYk1EWUdBMVVkSHdRdk1DMHdLNkFwb0NlR0pXaDBkSEE2THk5amNtd3VlSEpoYlhCelpXTjFjbWwwCmVTNWpiMjB2V0VkRFFTNWpjbXd3RUFZSkt3WUJCQUdDTnhVQkJBTUNBUUV3RFFZSktvWklodmNOQVFFRkJRQUQKZ2dFQkFKRVZPUU1CRzJmN1NoejVDbUJib2RwTmwyTDVKRk1uMTRKa1RwQXV3MGtiSzVyYy9LaDRaelh4SGZBUgp2YmRJNHhEMkRkOC8wc20ycWxXa1NMb0MyOTVaTGhWYk81MFdmVWZYTitwZlRYWVNOcnNmMTZHQkJFWWdveXh0CnFaNEJmajhwemdDVDMvM0prbk9KaVdTZTV5dmtISkVzMHJuT2ZjNXZNWm5UNXI3U0hwRHdDUlI1WENPclRkTGEKSVI5Tm1YbWQ0YzhubnhDYkhJZ05zSXBrUVRHNERteVFKS1NiWEhHUHVydCtIQnZiYW9BUElienAyNmEzUVBTeQppNm14NU8rYUd0QTlhWm51cUNpajRUeXo4TElSbk05OFFPYmQ1ME45b3RnNnRhbU44alNaeE5RUTRRYjlDWVFRCk8rN0VUUFRzSjN4Q3duUjhnb29KeWJRREpidz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuIE9VPUdvIERhZGR5IENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBPPVRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLiBPVT1HbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJHbyBEYWRkeSBDbGFzcyAyIENBIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogOTE6ZGU6MDY6MjU6YWI6ZGE6ZmQ6MzI6MTc6MGM6YmI6MjU6MTc6MmE6ODQ6NjcKIyBTSEExIEZpbmdlcnByaW50OiAyNzo5NjpiYTplNjozZjoxODowMTplMjo3NzoyNjoxYjphMDpkNzo3Nzo3MDowMjo4ZjoyMDplZTplNAojIFNIQTI1NiBGaW5nZXJwcmludDogYzM6ODQ6NmI6ZjI6NGI6OWU6OTM6Y2E6NjQ6Mjc6NGM6MGU6YzY6N2M6MWU6Y2M6NWU6MDI6NGY6ZmM6YWM6ZDI6ZDc6NDA6MTk6MzU6MGU6ODE6ZmU6NTQ6NmE6ZTQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVBRENDQXVpZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJqTVFzd0NRWURWUVFHRXdKVlV6RWgKTUI4R0ExVUVDaE1ZVkdobElFZHZJRVJoWkdSNUlFZHliM1Z3TENCSmJtTXVNVEV3THdZRFZRUUxFeWhIYnlCRQpZV1JrZVNCRGJHRnpjeUF5SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRBME1EWXlPVEUzCk1EWXlNRm9YRFRNME1EWXlPVEUzTURZeU1Gb3dZekVMTUFrR0ExVUVCaE1DVlZNeElUQWZCZ05WQkFvVEdGUm8KWlNCSGJ5QkVZV1JrZVNCSGNtOTFjQ3dnU1c1akxqRXhNQzhHQTFVRUN4TW9SMjhnUkdGa1pIa2dRMnhoYzNNZwpNaUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQ0NBU0F3RFFZSktvWklodmNOQVFFQkJRQURnZ0VOCkFEQ0NBUWdDZ2dFQkFONmQxK3BYR0VtaFcrdlhYMGlHNnI3ZC8rVHZaeHowWldpelYzR2dYbmU3N1p0SjZYQ0EKUFZZWVl3aHYydkxNMEQ5L0FsUWlWQkRZc29IVXdIVTlTMy9IZDhNK2VLc2FBN1VnYXk5cUs3SEZpSDdFdXg2dwp3ZGhGSjIrcU4xajNoeWJYMkMzMnFSZTNIM0kyVHFZWFAyV1lrdHNxYmwyaS9vamdDOTUvNVkwVjRldkxPdFhpCkVxSVRMZGlPcjE4U1BhQUlCUWkyWEtWbE9BUkZtUjZqWUdCMHhVR2xjbUliWXNVZmIxOGFRcjRDVVdXb3JpTVkKYXZ4NEE2bE5mNEREK3F0YS9LRkFwTW9aRnY2eXlPOWVjdzN1ZDcyYTlubVl2TEVIWjZJVkRkMmdXTVpFZXdvKwpZaWhmdWtFSFUxalBFWDQ0ZE1YNC83VnBrSStFZE9xWEc2OENBUU9qZ2NBd2diMHdIUVlEVlIwT0JCWUVGTkxFCnNOS1IxRXdSY2JOaHl6MmgvdDJvYXRUak1JR05CZ05WSFNNRWdZVXdnWUtBRk5MRXNOS1IxRXdSY2JOaHl6MmgKL3Qyb2F0VGpvV2VrWlRCak1Rc3dDUVlEVlFRR0V3SlZVekVoTUI4R0ExVUVDaE1ZVkdobElFZHZJRVJoWkdSNQpJRWR5YjNWd0xDQkpibU11TVRFd0x3WURWUVFMRXloSGJ5QkVZV1JrZVNCRGJHRnpjeUF5SUVObGNuUnBabWxqCllYUnBiMjRnUVhWMGFHOXlhWFI1Z2dFQU1Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQUQKZ2dFQkFESkw4N0xLUHBIOEVzYWhCNHlPZDZBekJoUmNrQjRZOXdpbVBRb1orWWVBRVc1cDVKWVhNUDgwa1dOeQpPTzdNSEFHakhaUW9wREgyZXNSVTEvYmxNVmdEb3N6T1l0dVVSWE8xdjBYSkpMWFZnZ0t0STNscGpiaTJUYzdQClRNb3pJK2djaUtxZGkwRnVGc2tnNVltZXpUdmFjUGQrbVNZZ0ZGUWxxMjV6aGVhYklaMEtiSUlPcVBqQ0RQb1EKSG15Vzc0Y054QTloaTYzdWd5dVYrSTZTaEhJNTZ5RHFnKzJEelpkdUNMenJUaWEyY3l2azAvWk0vaVp4NG1FUgpkRXIvVnhxSEQzVklMczlSYVJlZ0FoSmhsZFhSUUxJUVRPN0VyQkJEcHFXZUN0V1ZZcG9OejRpQ3hUSU01Q3VmClJlWU5ueWljc2JrcVdsZXROdyt2SFgvYnZaOD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLiBPVT1TdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IE89U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLiBPVT1TdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiU3RhcmZpZWxkIENsYXNzIDIgQ0EiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiAzMjo0YTo0YjpiYjpjODo2Mzo2OTo5YjpiZTo3NDo5YTpjNjpkZDoxZDo0NjoyNAojIFNIQTEgRmluZ2VycHJpbnQ6IGFkOjdlOjFjOjI4OmIwOjY0OmVmOjhmOjYwOjAzOjQwOjIwOjE0OmMzOmQwOmUzOjM3OjBlOmI1OjhhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNDo2NTpmYToyMDo1Mzo5NzpiODo3NjpmYTphNjpmMDphOTo5NTo4ZTo1NTo5MDplNDowZjpjYzo3ZjphYTo0ZjpiNzpjMjpjODo2Nzo3NToyMTpmYjo1ZjpiNjo1OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUR6Q0NBdmVnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQm9NUXN3Q1FZRFZRUUdFd0pWVXpFbApNQ01HQTFVRUNoTWNVM1JoY21acFpXeGtJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakV5TURBR0ExVUVDeE1wClUzUmhjbVpwWld4a0lFTnNZWE56SURJZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EUXcKTmpJNU1UY3pPVEUyV2hjTk16UXdOakk1TVRjek9URTJXakJvTVFzd0NRWURWUVFHRXdKVlV6RWxNQ01HQTFVRQpDaE1jVTNSaGNtWnBaV3hrSUZSbFkyaHViMnh2WjJsbGN5d2dTVzVqTGpFeU1EQUdBMVVFQ3hNcFUzUmhjbVpwClpXeGtJRU5zWVhOeklESWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd2dnRWdNQTBHQ1NxR1NJYjMKRFFFQkFRVUFBNElCRFFBd2dnRUlBb0lCQVFDM01zais2WEdtQklXdERCRmszODVONzhnREdJYy9vYXY3UEthZgo4TU9oMnRUWWJpdFRrUHNrcEQ2RThKN29YK3psSjBUMUtLWS9lOTdnS3ZESXIxTXZuc29GQVpNZWoyWWNPYWROCitscTJjd1FsWnV0M2YrZFp4a3FaSlJSVTZ5Ykg4MzhaMVRCd2o2K3dSaXIvcmVzcDdkZWZxZ1NIbzlUNWlhVTAKWDl0RGtZSTIyV1k4c2JpNWd2MmNPajRReUR2dkJtVm1lcHNaR0QzL2NWRThNQzVmdmoxM2M3SmRCbXpESTFhYQpLNFVta2h5bkFyUGtQdzJ2Q0htQ3VEWTk2cHpUTmJPOGFjcjF6SjNvL1dTTkY0QXpibDVLWFpuSkhvZTBuUnJBCjFXNFROU05lMzV0ZlBlL1c5M2JDNmo2N2VBMGNRbWRyQk5qNDF0cHZpL0pFb0FHckFnRURvNEhGTUlIQ01CMEcKQTFVZERnUVdCQlMvWDdmUnp0MGZodlJiVmF6YzF4RENEcW1JNXpDQmtnWURWUjBqQklHS01JR0hnQlMvWDdmUgp6dDBmaHZSYlZhemMxeERDRHFtSTU2RnNwR293YURFTE1Ba0dBMVVFQmhNQ1ZWTXhKVEFqQmdOVkJBb1RIRk4wCllYSm1hV1ZzWkNCVVpXTm9ibTlzYjJkcFpYTXNJRWx1WXk0eE1qQXdCZ05WQkFzVEtWTjBZWEptYVdWc1pDQkQKYkdGemN5QXlJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNWdnRUFNQXdHQTFVZEV3UUZNQU1CQWY4dwpEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBQVdkUDRpZDBja2FWYUdzYWZQeldkcWJBWWNhVDFlcG9Ya0pLdHYzCkw3SWV6TWRlYXRpRGg2R1g3MGsxUG5jR1FWaGl2NDVZdUFwblAreXozU0ZtSDhsVStuTE1QVXhBMklHdmQ1NkQKZXJ1aXgvVTBGNDdaRVVEMC9Dd3FUUlYvcDJKZExpWFRBQXNnR2gxbytSZTQ5TDJMN1NoWjNVMFdpeGVEeUxKbAp4eTE2cGFxOFU0WnQzVmVreXZnZ1FRdG84UFQ3ZEw1V1hYcDU5ZmtkaGVNdGxiNzFjWkJEekkwZm1nQUtoeW5wClZTSllBQ1BxNHhKREtWdEhDTjJNUVdwbEJxamxJYXBCdEpVaGxibDkwVFNyRTlhdHZOemlQVG5OdlQ1MWNLRVkKV1FQSklyU1BuTlZlS3RlbHR0UUtiZmkzUUJGR21oOTVEbUsvRDVmczRDOGZGNVE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPUdvdmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IE89R292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJUYWl3YW4gR1JDQSIKIyBTZXJpYWw6IDQyMDIzMDcwODA3NzA4NzI0MTU5OTkxMTQwNTU2NTI3MDY2ODcwCiMgTUQ1IEZpbmdlcnByaW50OiAzNzo4NTo0NDo1MzozMjo0NToxZjoyMDpmMDpmMzo5NTplMToyNTpjNDo0Mzo0ZQojIFNIQTEgRmluZ2VycHJpbnQ6IGY0OjhiOjExOmJmOmRlOmFiOmJlOjk0OjU0OjIwOjcxOmU2OjQxOmRlOjZiOmJlOjg4OjJiOjQwOmI5CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3NjowMDoyOTo1ZTplZjplODo1Yjo5ZToxZjpkNjoyNDpkYjo3NjowNjoyYTphYTphZTo1OTo4MTo4YTo1NDpkMjo3Nzo0YzpkNDpjMDpiMjpjMDoxMTozMTplMTpiMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmNqQ0NBMXFnQXdJQkFnSVFINTFaV3RjdndnWkVwWUFJYWVOZTlqQU5CZ2txaGtpRzl3MEJBUVVGQURBLwpNUXN3Q1FZRFZRUUdFd0pVVnpFd01DNEdBMVVFQ2d3blIyOTJaWEp1YldWdWRDQlNiMjkwSUVObGNuUnBabWxqCllYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUQXlNVEl3TlRFek1qTXpNMW9YRFRNeU1USXdOVEV6TWpNek0xb3cKUHpFTE1Ba0dBMVVFQmhNQ1ZGY3hNREF1QmdOVkJBb01KMGR2ZG1WeWJtMWxiblFnVW05dmRDQkRaWEowYVdacApZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCCkFKb2x1T3pNb25Xb2UvZk9XMW1LeWRHR0VnaFU3Snp5NTBiMmlQTjg2YVhmVEVjMnBCc0JISDhlVjRxTnc4WFIKSWVQYUpEOUlLL3VmTHFHVTV5d2NrOUcvR3dHSFU1bk9wL1VLSVhaMy82bTN4bk9VVDBiM0VFazMrcWhaU1YxcQpnUWRXOG9yNUJ0RDNjQ0pOdExkQnVUSzRzZkN4dzV3L2NQMVQzWUdxMkdONDl0aFRicUdzYW9Ra2NsU0d4dEt5Cnlod09lWUhXdFhCaUNBRXVUazhPMVJHdnFhL2xtci9jeklkdEp1VEpWNkw3bHZuTTRUOVRqR3hNZnB0VENBdHMKRi90bnlNS3RzYzJBdEpmY2RnRVdGZWxxMTZUaGVFZk9odFg3TWZQNk1iNDBxaWo3Y0V3ZFNjZXZMSjF0WnFhMgpqV1IrdFNCcW5UdUJ0bzlBQUdkTGlZYTR6R1grRlZQcEJNSFdYeDFFMXdvdko1cEdmYUVOZGExVWhoWGNTVHZ4CmxzNFBtNkRzbzNwZHZ0VXFkVUxsZTk2bHRxcXZLS3lza0t3NHQ5Vm9OU1o2M1BjNzgvMUZtOUc3UTNodWIvRkMKVkdxWThBMnRsK2xTWHVuVmFuTGVhdmNiWUJUMHBlUzJjV2VxSCtyaVRjRkNRUDVuUmhjNEwwYy9jWnl1NVNISwpZUzF0QjZpRWZDM3VVU1h4WTVDZS9lRlhpR3Z2aWlOdHNlYTlQNjNSUFpZTGhZM05heWU3dHdXYjdMdVJxUW9ICkVnS1hUaUNROFA4Tkh1SkJPOU5BT3VlTlhkcG01QUt3QjFLWVhBNk9NNXpDcHBYN1ZSbHVUSTZ1U3crOXdUaE4KWG8rRUhXYk54V0NXdEZKYUJZbU9sWHFZd1pFOGxTT3lEdlI1dE1sOHdVb2hBZ01CQUFHamFqQm9NQjBHQTFVZApEZ1FXQkJUTXpPL01LV0NrTzdHU3RqejZNbUtQckNVVk96QU1CZ05WSFJNRUJUQURBUUgvTURrR0JHY3FCd0FFCk1UQXZNQzBDQVFBd0NRWUZLdzREQWhvRkFEQUhCZ1ZuS2dNQUFBUVVBNXZ3SWhQL2xTZzIwOXlld0RMN01UcUsKVVdVd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFFQ0FTdm9teWM1ZU1OMVBoblIyV1BXdXM0TXplS1I2ZEJjWgpUdWxTdGJuZ0NuUmlxbWpLZUtCTW1vNHNJeTdWYWhJa3Y5Um8wNHJRMkp5ZnRCOE0zamgrVnpqOGplSlBYZ3lmCnF6dlMvM1dYeTZUalp3ai81Y0FXdFVnQmZlbjVDdjhiNVdwcHYzZ2hxTUtuSTZtR3EzWlc2QTRNOWhQZEttYUsKWkVrOUdoaUhrQVNmUWxLM1Q4ditSMEYyTmUvL0FIWTJSVEtieGthRlhlSWtzQjdqU0phWVYwZVVWWG9QUWJGRQpKUFBCL2hwcnY0ajl3YWJhazJCZWdVcVpJSnhJWmhtMUFIbFVEN2dzTDB1OHFWMWJZSCtNaDZYZ1VtTXF2dGc3CmhVQVYvaDYyWlQvRlM5cCt0WG8xS2FNdWVwaGdJcVAwZlNkT0xlcTBkRHpwRDZRekR4QVJ2Qk1CMXVVTzA3KzEKRXFMaFJTUEF6QWh1WWJlSnE0UGpKQjdtWFFmbkh5QSt6MmZJNTZ3d2JTZExhRzVMS2x3Q0NEVGIrSGJrWjZNbQpuRCtpTXNKS3hZRVlNUkJXcW9UdkxRci91QjkzMHIrbFdLQmk1TmRMa1hXTmlZQ1lmbTNMVTA1ZXIvYXlsNFdYCnVkcFZCcmtrN3RmR09CNWpHeEk3bGVGWXJQTGZoTlZmbVM4TlZWdm1PTnN1UDNMcFNJWEx1eWtUang0NFZibnoKc3NRd21TTk9YZkpJb1JJTTNCS1FDWkJVa1FNOFIrWFZ5V1hndDB0OTdFZlRzd3Mrclo3UWRBQU82NzFScmNEZQpMTUREYXY3djNBdW4ra2JmWU51Y3BsbFFkU05wYzVPeStmd0MwMGZtY2M0UUF1NG5qSVQvckVVTkUxeURNdUFsCnBZWXNmUFFTCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EiCiMgU2VyaWFsOiAxNzE1NDcxNzkzNDEyMDU4Nzg2MjE2Nzc5NDkxNDA3MTQyNTA4MQojIE1ENSBGaW5nZXJwcmludDogODc6Y2U6MGI6N2I6MmE6MGU6NDk6MDA6ZTE6NTg6NzE6OWI6Mzc6YTg6OTM6NzIKIyBTSEExIEZpbmdlcnByaW50OiAwNTo2MzpiODo2MzowZDo2MjpkNzo1YTpiYjpjODphYjoxZTo0YjpkZjpiNTphODo5OTpiMjo0ZDo0MwojIFNIQTI1NiBGaW5nZXJwcmludDogM2U6OTA6OTk6YjU6MDE6NWU6OGY6NDg6NmM6MDA6YmM6ZWE6OWQ6MTE6MWU6ZTc6MjE6ZmE6YmE6MzU6NWE6ODk6YmM6ZjE6ZGY6Njk6NTY6MWU6M2Q6YzY6MzI6NWMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR0ekNDQXArZ0F3SUJBZ0lRRE9mZzVSZllSdjZQNVdEOEcvQXdPVEFOQmdrcWhraUc5dzBCQVFVRkFEQmwKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2CmIzUWdRMEV3SGhjTk1EWXhNVEV3TURBd01EQXdXaGNOTXpFeE1URXdNREF3TURBd1dqQmxNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObApjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1EwRXdnZ0VpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3REaFhPNUVPQVhMR0g4N2RnK1hFU3BhN2MKSnBTSXF2VE85U0E1S0ZoZ0RQaUEycWtWbFRKaFBMV3hLSVNLaXR5ZkNneURGM3FQa0t5SzUzbFRYREdFS3ZZUAptREkyZHN6ZTNUeW9vdTlxK3lIeVVtSGZueURYSCtLeDJmNFlaTklTVzEvNVdCZzF2RWZOb1RiNWEzL1VzRGcrCndSdkRqRFBaMkM4WS9pZ1BzNmVEMXNOdVJNQmhOWllXL2xtY2kzWnQxL0dpU3cwci93dHkycDVnMEk2UU5jWjQKVlljZ29jL2xiUXJJU1h3eG1ETnNJdW1IMERKYW9yb1RnaEh0T1JlZG1UcHlvZWI2cE5uVkZ6RjFyb1Y5SXE0LwpBVWFHOWloNXlMSGE1RmNYeEg0Y0RyQzBrcVpXczcyeWwrMnFwL0MzeGFnL2xSYlEvNkdXNndoZkdIZFBBZ01CCkFBR2pZekJoTUE0R0ExVWREd0VCL3dRRUF3SUJoakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVcKQkJSRjY2S3Y5SkxMZ2pFdFVZdW5weUdkODIzSUR6QWZCZ05WSFNNRUdEQVdnQlJGNjZLdjlKTExnakV0VVl1bgpweUdkODIzSUR6QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFvZzY4MytMdDhPTnljM3BrbEwvM2NtYllNdVJDCmRXS3VoK3Z5MWRuZVZyT2Z6TTRVS0xrTmwyQmNFa3hZNU5NOWcwbEZXSmMxYVJxb1IrcFd4bm1yRXRobmdZVGYKZndrOGxPYTRKaXdndlQyektJbjNYLzhpNHBlRUgrbGw3NGZnMzhGblNiTmQ2N0lKS3VzbTdYaStmVDhyODdjbQpOVzFmaVFHMlNWdWZBUVdicXowbHdjeTJmOEx4YjRiRyttUm82NEV0bE90Q3QvcU1IdDFpOGI1UVo3ZHN2ZlB4Ckgyc01OZ2NXZnpkOHFWdHRldkVTUm1DRDF5Y0V2a3ZPbDc3RFp5cG9FZCtBNXd3elpyOFREUlJ1ODM4Zll4QWUKK28wYkpXMXNqNlczWVFHeDBxTW1vUkJ4bmEzaXcvbkRtVkczS3djSXppN21VTEtuK2dwRkw2THc4Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgR2xvYmFsIFJvb3QgQ0EiCiMgU2VyaWFsOiAxMDk0NDcxOTU5ODk1MjA0MDM3NDk1MTgzMjk2Mzc5NDQ1NDM0NgojIE1ENSBGaW5nZXJwcmludDogNzk6ZTQ6YTk6ODQ6MGQ6N2Q6M2E6OTY6ZDc6YzA6NGY6ZTI6NDM6NGM6ODk6MmUKIyBTSEExIEZpbmdlcnByaW50OiBhODo5ODo1ZDozYTo2NTplNTplNTpjNDpiMjpkNzpkNjo2ZDo0MDpjNjpkZDoyZjpiMTo5Yzo1NDozNgojIFNIQTI1NiBGaW5nZXJwcmludDogNDM6NDg6YTA6ZTk6NDQ6NGM6Nzg6Y2I6MjY6NWU6MDU6OGQ6NWU6ODk6NDQ6YjQ6ZDg6NGY6OTY6NjI6YmQ6MjY6ZGI6MjU6N2Y6ODk6MzQ6YTQ6NDM6Yzc6MDE6NjEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURyekNDQXBlZ0F3SUJBZ0lRQ0R2Z1ZwQkNSckdoZFdySldaSEhTakFOQmdrcWhraUc5dzBCQVFVRkFEQmgKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1TQXdIZ1lEVlFRREV4ZEVhV2RwUTJWeWRDQkhiRzlpWVd3Z1VtOXZkQ0JEClFUQWVGdzB3TmpFeE1UQXdNREF3TURCYUZ3MHpNVEV4TVRBd01EQXdNREJhTUdFeEN6QUpCZ05WQkFZVEFsVlQKTVJVd0V3WURWUVFLRXd4RWFXZHBRMlZ5ZENCSmJtTXhHVEFYQmdOVkJBc1RFSGQzZHk1a2FXZHBZMlZ5ZEM1agpiMjB4SURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFTkJNSUlCSWpBTkJna3Foa2lHCjl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUE0anZoRVhMZXFLVFRvMWVxVUtLUEMzZVF5YUtsN2hMT2xsc0IKQ1NETUFaT25UakMzVS9kRHhHa0FWNTNpalNMZGh3WkFBSUVKenM0Ymc3L2Z6VHR4UnVMV1pzY0ZzM1luRm85NwpuaDZWZmU2M1NLTUkydGF2ZWd3NUJtVi9TbDBmdkJmNHE3N3VLTmQwZjNwNG1WbUZhRzVjSXpKTHYwN0E2RnB0CjQzQy9keEMvL0FIMmhkbW9SQkJZTXFsMUdOWFJvcjVINGlkcTlKb3orRWtJWUl2VVg3UTZoTCtocWtwTWZUN1AKVDE5c2RsNmdTemVSbnR3aTVtM09GQnFPYXN2K3piTVVaQmZIV3ltZU1yL3k3dnJUQzBMVXE3ZEJNdG9NMU8vNApnZFc3alZnL3RSdm9TU2lpY05veEJOMzNzaGJ5VEFwT0I2anRTajFldFgramtNT3ZKd0lEQVFBQm8yTXdZVEFPCkJnTlZIUThCQWY4RUJBTUNBWVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVQTk1UU5WYlIKVEx0bThLUGlHeHZEbDdJOTBWVXdId1lEVlIwakJCZ3dGb0FVQTk1UU5WYlJUTHRtOEtQaUd4dkRsN0k5MFZVdwpEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBTXVjTjZwSUV4SUsrdDFFbkU5U3NQVGZyZ1QxZVhrSW95UVkvRXNyCmhNQXR1ZFhIL3ZUQkgxakx1RzJjZW5Ubm1DbXJFYlhqY0tDaHpVeUltWk9Na1hEaXF3OGN2cE9wLzJQVjVBZGcKMDZPL25Wc0o4ZFdPNDFQMGptUDZQNmZidEdiZlltYlcwVzVCamZJdHRlcDNTcCtkV09JcldjQkFJKzB0S0lKRgpQbmxVa2lhWTRJQklxRGZ2OE5aNVlCYmVyT2dPelc2c1JCYzRMMG5hNFVVK0tyazJVODg2VUFiM0x1akVWMGxzCllTRVkxUVN0ZUR3c09vQnJwK3V2RlJUcDJJbkJ1VGhzNHBGc2l2OWt1WGNsVnpEQUd5U2o0ZHpwMzBkOHRiUWsKQ0FVdzdDMjlDNzlGdjFDNXFmUHJtQUVTcmNpSXhwZzBYNDBLUE1icDFaV1ZiZDQ9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EiCiMgU2VyaWFsOiAzNTUzNDAwMDc2NDEwNTQ3OTE5NzI0NzMwNzM0Mzc4MTAwMDg3CiMgTUQ1IEZpbmdlcnByaW50OiBkNDo3NDpkZTo1Nzo1YzozOTpiMjpkMzo5Yzo4NTo4MzpjNTpjMDo2NTo0OTo4YQojIFNIQTEgRmluZ2VycHJpbnQ6IDVmOmI3OmVlOjA2OjMzOmUyOjU5OmRiOmFkOjBjOjRjOjlhOmU2OmQzOjhmOjFhOjYxOmM3OmRjOjI1CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3NDozMTplNTpmNDpjMzpjMTpjZTo0Njo5MDo3Nzo0ZjowYjo2MTplMDo1NDo0MDo4ODozYjphOTphMDoxZTpkMDowYjphNjphYjpkNzo4MDo2ZTpkMzpiMToxODpjZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHhUQ0NBcTJnQXdJQkFnSVFBcXhjSm1vTFFKdVBDM255cmtZbGR6QU5CZ2txaGtpRzl3MEJBUVVGQURCcwpNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNzd0tRWURWUVFERXlKRWFXZHBRMlZ5ZENCSWFXZG9JRUZ6YzNWeVlXNWoKWlNCRlZpQlNiMjkwSUVOQk1CNFhEVEEyTVRFeE1EQXdNREF3TUZvWERUTXhNVEV4TURBd01EQXdNRm93YkRFTApNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREVScFoybERaWEowSUVsdVl6RVpNQmNHQTFVRUN4TVFkM2QzCkxtUnBaMmxqWlhKMExtTnZiVEVyTUNrR0ExVUVBeE1pUkdsbmFVTmxjblFnU0dsbmFDQkJjM04xY21GdVkyVWcKUlZZZ1VtOXZkQ0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTWJNNVhQbQorOVM3NVMwdE1xYmY1WUUveWMwbFNiWnhLc1BWbERSbm9nb2NzRjlwcGtDeHhMZXlqOUNZcEtsQldUclQzSlRXClBOdDBPS1JLekUwbGd2ZEtwVk1TT083elNXMXhrWDVqdHF1bVg4T2toUGhQWWxHKytNWHMyemlTNHdibENKRU0KeENoQlZmdkxXb2tWZm5Ib05iOU5jZ2s5dmpvNFVGdDNNUnVOczhja1JacW5yRzBBRkZvRXQ3b1Q2MUVLbUVGQgpJazVsWVllQlFWQ21lVnlKM2hsS1Y5VXU1bDBjVXl4K21NMGFCaGFrYUhQUU5BUVRYS0Z4MDFwOFZkdGVaT0UzCmh6QldCT1VSdENtQUV2RjVPWWlpQWhGOEoyYTNpTGQ0OHNvS3FEaXJDbVRDdjJaZGxZVEJvU1VlaDEwYVVBc2cKRXN4QnUyNExVVGk0UzhzQ0F3RUFBYU5qTUdFd0RnWURWUjBQQVFIL0JBUURBZ0dHTUE4R0ExVWRFd0VCL3dRRgpNQU1CQWY4d0hRWURWUjBPQkJZRUZMRSt3MmtEK0w5SEFkU1lKaG9JQXU5alpDdkRNQjhHQTFVZEl3UVlNQmFBCkZMRSt3MmtEK0w5SEFkU1lKaG9JQXU5alpDdkRNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUFjR2dhWDNOZWMKbnp5SVpnWUlWeUhiSVVmNEttZXF2eGd5ZGtBUVY4R0s4M3JaRVdXT05mcWUvRVcxbnRsTU1VdTRrZWhETEk2egplTTdiNDFONWNkYmxJWlFCMmxXSG1pUms5b3Btek42Y044Mm9OTEZwbXlQSW5uZ2lLM0JENDFWSE1XRVo3MWpGCmhTOU9NUGFnTVJZanlPZmlaUll6eTc4YUc2QTkrTXBlaXpHTFlBaUpMUXdHWEZLM3hQa0ttTkVWWDU4U3ZudzIKWXppOVJLUi81Q1lyQ3NTWGFRM3BqT0xBRUZlNHlIWVNrVlh5U0duWXZDb0NXdzlFMUNBeDIvUzZjQ1pka0dDZQp2RXNYQ1MrMHl4NURhTWtISjhIU1hQZnFJYmxvRXB3OG5MK2UvSUJjbTJQTjdFZXFKU2Rub0RmekFJSjlWTmVwCitPa3VFNk4zNkI5SwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2xhc3MgMiBQcmltYXJ5IENBIE89Q2VydHBsdXMKIyBTdWJqZWN0OiBDTj1DbGFzcyAyIFByaW1hcnkgQ0EgTz1DZXJ0cGx1cwojIExhYmVsOiAiQ2VydHBsdXMgQ2xhc3MgMiBQcmltYXJ5IENBIgojIFNlcmlhbDogMTc3NzcwMjA4MDQ1OTM0MDQwMjQxNDY4NzYwNDg4MzI3NTk1MDQzCiMgTUQ1IEZpbmdlcnByaW50OiA4ODoyYzo4Yzo1MjpiODphMjozYzpmMzpmNzpiYjowMzplYTphZTphYzo0MjowYgojIFNIQTEgRmluZ2VycHJpbnQ6IDc0OjIwOjc0OjQxOjcyOjljOmRkOjkyOmVjOjc5OjMxOmQ4OjIzOjEwOjhkOmMyOjgxOjkyOmUyOmJiCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwZjo5OTozYzo4YTplZjo5NzpiYTphZjo1Njo4NzoxNDowZTpkNTo5YTpkMTo4MjoxYjpiNDphZjphYzpmMDphYTo5YTo1ODpiNTpkNTo3YTozMzo4YTozYTpmYjpjYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGtqQ0NBbnFnQXdJQkFnSVJBSVc5Uy9QWTJ1TnA5cFRYWDhPbFJDTXdEUVlKS29aSWh2Y05BUUVGQlFBdwpQVEVMTUFrR0ExVUVCaE1DUmxJeEVUQVBCZ05WQkFvVENFTmxjblJ3YkhWek1Sc3dHUVlEVlFRREV4SkRiR0Z6CmN5QXlJRkJ5YVcxaGNua2dRMEV3SGhjTk9Ua3dOekEzTVRjd05UQXdXaGNOTVRrd056QTJNak0xT1RVNVdqQTkKTVFzd0NRWURWUVFHRXdKR1VqRVJNQThHQTFVRUNoTUlRMlZ5ZEhCc2RYTXhHekFaQmdOVkJBTVRFa05zWVhOegpJRElnVUhKcGJXRnllU0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTnhRCmx0QVMrRFhTQ0hoNnRsSncvVy91ejdrUnkxMTM0ZXpwZmdTTjFzeHZjME5YWUt3ekNrVHNBMThjZ0NTUjVhaVIKVmhLQzkrQXI5TnV1WVM2SkVJMXJiTHF6QXIzVk5zVklOeVBpOEZvM1VqTVhFdUxSWUUyK0wwRVI0L1lYSlF5TAprY0FibVh1WlZnMnY3dEs4UjFmamVVbDdOSWtuSklUZXNlenBXRTcrVHQ5YXZrR3RyQWpGR0E3djBsUHViTkNkCkVnRVRqZHlBWXZlVnFVU0lTbkZPWUZXZTJ5TVplVllIREQ5akMxeXc0cjUrRmZ5VU0xaEJPSFRFNFkrTDN5YXMKSDdXTE83ZERXV3V3SktadGtJdkVjdXBkTTVpM3k5NWVlKytVOFJzK3lza2h3Y1dZQXFxaTlsdDNtL1YrbGxVMApIR2Rwd1BGQzQwZXMvQ2djWmxVQ0F3RUFBYU9CakRDQmlUQVBCZ05WSFJNRUNEQUdBUUgvQWdFS01Bc0dBMVVkCkR3UUVBd0lCQmpBZEJnTlZIUTRFRmdRVTQzTXQzOHNPS0F6ZTNiT2t5bm00anJ2b01Ja3dFUVlKWUlaSUFZYjQKUWdFQkJBUURBZ0VHTURjR0ExVWRId1F3TUM0d0xLQXFvQ2lHSm1oMGRIQTZMeTkzZDNjdVkyVnlkSEJzZFhNdQpZMjl0TDBOU1RDOWpiR0Z6Y3pJdVkzSnNNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUNuVk0rSVJCbkwzOVIvCkFOOVdNMksxOTFFQmtPdkRQOUdJUk9ra1hlL25GTDBndDVvOEFQNXRuOXVRM05mMFl0YUxjRjNuNVFSSXFXaDgKeWZGQzgyeC94WHA4SFZHSXV0SUtQaWRkM2kxUlR0TVRaR25rTHVQVDU1c0ptYWJnbFp2T0d0ZC92anpPVXJNUgpGY0VQRjgwRHU1d2xGYnFpZG9uOEJ2RVkwSk5MRG55Q3Q2WDA5bC8rN1VDbW5ZUjBPYm5jSG9VVzJpa2JoaU1BCnlidUpmbTZBaUI0dkZMUURKS2d5YndPYVJ5d3d2bGJHcDBJQ2NCdnFRTmk2QlFOd0I2U1cvLzFJTXdyaDNLV0IKa0p0TjNYM241N0xOWE1ocWxmaWw5bzNFWFhnSXZuc0cxa25QR1RaUUl5NEk1cDRGVFVjWTFSYnBzZGEyRU5XNwpsNytpanJSVQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RFNUIFJvb3QgQ0EgWDMgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4KIyBTdWJqZWN0OiBDTj1EU1QgUm9vdCBDQSBYMyBPPURpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLgojIExhYmVsOiAiRFNUIFJvb3QgQ0EgWDMiCiMgU2VyaWFsOiA5MTI5OTczNTU3NTMzOTk1MzMzNTkxOTI2Njk2NTgwMzc3ODE1NQojIE1ENSBGaW5nZXJwcmludDogNDE6MDM6NTI6ZGM6MGY6Zjc6NTA6MWI6MTY6ZjA6MDI6OGU6YmE6NmY6NDU6YzUKIyBTSEExIEZpbmdlcnByaW50OiBkYTpjOTowMjo0Zjo1NDpkODpmNjpkZjo5NDo5Mzo1ZjpiMTo3MzoyNjozODpjYTo2YTpkNzo3YzoxMwojIFNIQTI1NiBGaW5nZXJwcmludDogMDY6ODc6MjY6MDM6MzE6YTc6MjQ6MDM6ZDk6MDk6ZjE6MDU6ZTY6OWI6Y2Y6MGQ6MzI6ZTE6YmQ6MjQ6OTM6ZmY6YzY6ZDk6MjA6NmQ6MTE6YmM6ZDY6Nzc6MDc6MzkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURTakNDQWpLZ0F3SUJBZ0lRUksrd2dOYWpKN3FKTURtR0x2aEFhekFOQmdrcWhraUc5dzBCQVFVRkFEQS8KTVNRd0lnWURWUVFLRXh0RWFXZHBkR0ZzSUZOcFoyNWhkSFZ5WlNCVWNuVnpkQ0JEYnk0eEZ6QVZCZ05WQkFNVApEa1JUVkNCU2IyOTBJRU5CSUZnek1CNFhEVEF3TURrek1ESXhNVEl4T1ZvWERUSXhNRGt6TURFME1ERXhOVm93ClB6RWtNQ0lHQTFVRUNoTWJSR2xuYVhSaGJDQlRhV2R1WVhSMWNtVWdWSEoxYzNRZ1EyOHVNUmN3RlFZRFZRUUQKRXc1RVUxUWdVbTl2ZENCRFFTQllNekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQgpBTit2NlpkUUNJTlh0TXhpWmZhUWd1ekgweXhyTU1wYjdObkRmY2RBd1JnVWkrRG9NM1pKS3VNL0lVbVRyRTRPCnJ6NUl5Mlh1L05NaEQyWFNLdGt5ajR6bDkzZXdFbnUxbGNDSm82bTY3WE11ZWd3R01vT2lmb29VTU0wUm9PRXEKT0xsNUNqSDlVTDJBWmQrM1VXT0R5T0tJWWVwTFlZSHNVbXU1b3VKTEdpaWZTS09lRE5vSmpqNFhMaDdkSU45Ygp4aXFLcXk2OWNLM0ZDeG9sa0hSeXhYdHFxelRXTUluLzVXZ1RlMVFMeU5hdTdGcWNraDQ5WkxPTXh0Ky95VUZ3CjdCWnkxU2JzT0ZVNVE5RDgvUmhjUVBHWDY5V2FtNDBkdXRvbHVjYlkzOEVWQWpxcjJtN3hQaTcxWEFpY1BOYUQKYWVRUW14a3F0aWxYNCtVOW01L3dBbDBDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVgpIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRk1TbnNhUjdMSEg2MitGTGtIWC94QlZnaFlrUU1BMEdDU3FHClNJYjNEUUVCQlFVQUE0SUJBUUNqR2l5YkZ3QmNxUjd1S0dZM09yK0R4ejlMd3dtZ2xTQmQ0OWxaUk5JK0RUNjkKaWt1Z2RCL09FSUtjZEJvZGZwZ2EzY3NUUzdNZ1JPU1I2Y3o4ZmFYYmF1WCs1djNnVHQyM0FEcTFjRW12OHVYcgpBdkhSQW9zWnk1UTZYa2pFR0I1WUdWOGVBbHJ3RFBHeHJhbmNXWWFMYnVtUjlZYksrcmxtTTZwWlc4N2lweFp6ClI4c3J6Sm13TjBqUDQxWkw5YzhQREhJeWg4YndSTHRUY20xRDlTWkltbEpudDFpci9tZDJjWGpiRGFKV0ZCTTUKSkRHRm9xZ0NXakJINGQxUUI3d0NDWkFBNjJSallKc1d2SWpKRXViU2ZaR0wrVDB5aldXMDZYeXhWM2JxeGJZbwpPYjhWWlJ6STluZVdhZ3FOZHd2WWtRc0VqZ2ZiS2JZSzdwMkNOVFVRCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1Td2lzc1NpZ24gR29sZCBDQSAtIEcyIE89U3dpc3NTaWduIEFHCiMgU3ViamVjdDogQ049U3dpc3NTaWduIEdvbGQgQ0EgLSBHMiBPPVN3aXNzU2lnbiBBRwojIExhYmVsOiAiU3dpc3NTaWduIEdvbGQgQ0EgLSBHMiIKIyBTZXJpYWw6IDEzNDkyODE1NTYxODA2OTkxMjgwCiMgTUQ1IEZpbmdlcnByaW50OiAyNDo3NzpkOTphODo5MTpkMTozYjpmYTo4ODoyZDpjMjpmZjpmODpjZDozMzo5MwojIFNIQTEgRmluZ2VycHJpbnQ6IGQ4OmM1OjM4OjhhOmI3OjMwOjFiOjFiOjZlOmQ0OjdhOmU2OjQ1OjI1OjNhOjZmOjlmOjFhOjI3OjYxCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2MjpkZDowYjplOTpiOTpmNTowYToxNjozZTphMDpmODplNzo1YzowNTozYjoxZTpjYTo1NzplYTo1NTpjODo2ODo4Zjo2NDo3Yzo2ODo4MTpmMjpjODozNTo3Yjo5NQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnVqQ0NBNktnQXdJQkFnSUpBTHRBSEVQMVhrK3dNQTBHQ1NxR1NJYjNEUUVCQlFVQU1FVXhDekFKQmdOVgpCQVlUQWtOSU1SVXdFd1lEVlFRS0V3eFRkMmx6YzFOcFoyNGdRVWN4SHpBZEJnTlZCQU1URmxOM2FYTnpVMmxuCmJpQkhiMnhrSUVOQklDMGdSekl3SGhjTk1EWXhNREkxTURnek1ETTFXaGNOTXpZeE1ESTFNRGd6TURNMVdqQkYKTVFzd0NRWURWUVFHRXdKRFNERVZNQk1HQTFVRUNoTU1VM2RwYzNOVGFXZHVJRUZITVI4d0hRWURWUVFERXhaVApkMmx6YzFOcFoyNGdSMjlzWkNCRFFTQXRJRWN5TUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDCkNnS0NBZ0VBcitUdWZvc2tEaEp1cVZBdEZrUTdrcEpjeXJoZGhKSkNFeXE4WlZlQ1FENVhKTTFRaXlVcXQyLzgKNzZMUXdCOENKRW9UbG84akUrWW9XQUNqUjhjR3A0UWpLN3U5bGl0L1ZjeUx3VmNmRG1KbEQ5MDlWb3B6MnE1KwpiYnFCSEg1Q2pDQTEyVU5OaFBxRTIxSXM4dzRuZHd0cnZ4RXZjbmlmTHRnKzVoZzNXaXB5K2RwaWtKS1Z5aCtjCjZiTThLOHZ6QVJPL1dzL0J0UXBndmQyMW1XUlR1S0NXczIvaUpuZVJqT0JpRUFLZk5BK2sxWkl6VWQ2K2picUUKZW1BOGF0dWZLK3plM2dFL2JrM2xVSWJMdEsvdFJFREZ5bHFNMnRJcmZLanV2cWJsQ3FvT3BkOEZVcmRWeHlKZApNbXFYbDJNVDI4bmJlVFo3aFRwS3hWS0orU1RublhlcGd2OVZIS1Z4YVN2UkFpVHlzeWJVYTlvRVZlWEJDc2R0Ck1EZVFLdVNlRkROZUZoZFZ4VnUxeXpTSmt2R2RKbytoQjlUR3NuaFEyd3dNQzN3TGpFSFh1ZW5kaklqM28wMnkKTXN6WUY5ck50ODVtbmRUOVh2KzlsejRwZGVkK3AySllyeVUwcFVISFBid05VTW9EQXc4SVdoK1ZjM2hpdjY5eQpGR2tPcGVVRERuaU9KaWhDOEFjTFlpQVFaemxHK3FrRHpBUTRlbWJ2SUlPMWpFcFdqcEVBL0k1Y2d0NklvTVBpCmFHNTlqZTg4M1dYMFhheFI3eVNBcnFwV2wyLzVyWDNhWVQrWWR6eWxrYlljakNiYVphSUpiY0hpVk9PNXlreE0KZ0k5M2UyQ2FIdCsyOGtnZURycE9WRzJZNE9HaUdxSjNVTS9FWTVMc1J4bWQ2K1pyenNFQ0F3RUFBYU9CckRDQgpxVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVXeVY3CmxxUmxVWDY0T2ZQQWVHWmU2RHJuOE80d0h3WURWUjBqQkJnd0ZvQVVXeVY3bHFSbFVYNjRPZlBBZUdaZTZEcm4KOE80d1JnWURWUjBnQkQ4d1BUQTdCZ2xnaFhRQldRRUNBUUV3TGpBc0JnZ3JCZ0VGQlFjQ0FSWWdhSFIwY0RvdgpMM0psY0c5emFYUnZjbmt1YzNkcGMzTnphV2R1TG1OdmJTOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBQ2U2CjQ1Ujg4YTdBM2hmbTVkalY5VlN3Zy9TN3pWNEZlMCtmZFdhdlBPaFdmdnh5ZURnRDJTdGlHd0M1K09sZ3pjek8KVVlySFVERnU0VXArR0M5cFdiWTlaSUVyNDRPRTVpS0hqbjNnN2dLWlliZ2U5TGdyaUJJV2hNSXhremlXTWFhNQpPMU0vd3lTVFZsdHBrdXpGd2JzNEFPUHNGNm00M01kOEFZT2ZNa2U2VWlJMEhUSjZDVmFuZkNVMnFUMUwyc0NDCmJ3cTdFc2lIU3ljUitSNHR4NU0vbnR0ZkptdFMyUzZLOFJUR1JJMFZxYmUvdmQ2bUd1NnVMZnRJZHhmK3UreXYKR1BVcVVmQTVoSmVWYkc0Ynd5dkVkR0I1SmJBS0o5L2ZYdEk1ejBWOVFrdmZzeXdleGNaZHlsVTZvSnhwbW8vYQo3N0t3UEorSGJCSXJaWEFWVWpFYUpNOXZNU05RSDR4UGp5UERkRUZqSEZXb0ZOMCs0RkZRei9FYk1GWU9rckNDCmhkaUR5eUprdkMyNEpkVlVvcmdHNnEyU3BDU2d3WWExU2hOcVI4OHVDMWFWVk12T210dHF0S2F5MjBFSWhpZDMKOTJxZ1Ftd0xPTTdYZFZBeWtzTGZLekFpU05EVlFUZ2xYYVRwWFovR2xIWFFSZjB3bDBPUGtLc0t4NFp6WUVwcApMZDZsZU5jRzJtcWVTejUzT2lBVElnSFF2MmllWTJCck5VMExiYnFoUGNDVDRIOGpzMVd0Y2lWT1J2blNGdSt3ClpNRUJudW5Lb0dxWURzL1lZUEl2U2Jqa1F1RTROUmIweUc1UDk0Rlc2THFqdmlPdnJ2MXZBK0FDT3pCMitodHQKUWM4QnNlbTR5V2IwMnliek9xUjA4a2trVzhtdzBGZkIrajU2NFpmSgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyIE89U3dpc3NTaWduIEFHCiMgU3ViamVjdDogQ049U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyIE89U3dpc3NTaWduIEFHCiMgTGFiZWw6ICJTd2lzc1NpZ24gU2lsdmVyIENBIC0gRzIiCiMgU2VyaWFsOiA1NzAwMzgzMDUzMTE3NTk5NTYzCiMgTUQ1IEZpbmdlcnByaW50OiBlMDowNjphMTpjOTo3ZDpjZjpjOTpmYzowZDpjMDo1Njo3NTo5NjpkODo2MjoxMwojIFNIQTEgRmluZ2VycHJpbnQ6IDliOmFhOmU1OjlmOjU2OmVlOjIxOmNiOjQzOjVhOmJlOjI1OjkzOmRmOmE3OmYwOjQwOmQxOjFkOmNiCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZTo2Yzo0ZDphMjpiYjpiOTpiYTo1OTpiNjpmMzo5Mzo5Nzo2ODozNzo0Mjo0NjpjMzpjMDowNTo5OTozZjphOTo4ZjowMjowZDoxZDplZDpiZTpkNDo4YTo4MTpkNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnZUQ0NBNldnQXdJQkFnSUlUeHZVTDFTN0wwc3dEUVlKS29aSWh2Y05BUUVGQlFBd1J6RUxNQWtHQTFVRQpCaE1DUTBneEZUQVRCZ05WQkFvVERGTjNhWE56VTJsbmJpQkJSekVoTUI4R0ExVUVBeE1ZVTNkcGMzTlRhV2R1CklGTnBiSFpsY2lCRFFTQXRJRWN5TUI0WERUQTJNVEF5TlRBNE16STBObG9YRFRNMk1UQXlOVEE0TXpJME5sb3cKUnpFTE1Ba0dBMVVFQmhNQ1EwZ3hGVEFUQmdOVkJBb1RERk4zYVhOelUybG5iaUJCUnpFaE1COEdBMVVFQXhNWQpVM2RwYzNOVGFXZHVJRk5wYkhabGNpQkRRU0F0SUVjeU1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBCk1JSUNDZ0tDQWdFQXhQR0hmOU40TWZjNHlmakRtVU84eC9lOE4rZE9jYnBMajZWekhWeHVtSzREVjY0NE4wTXYKRnowZnlNNW9FTUY0cmhrREt4RDZMSG1EOXVpNWFMbFY4Z1JFcHpuNS9BU0xIdkdpVFNmNVlYdTZ0K1dpRTdicgpZVDdRYk5IbSsvcGU3UjIwbnFBMVc2R1N5L0JKa3Y2RkNnVSs1dGtMNGsrNzNKVTMvSkhwTWpVaTBSODZUaWVGCm5iQVZsRExhWVExSFRXQkNycEpINklOYVVGanBpb3U1WGFIYzNabEtIelpudTBqa2c3WTM2MGc2cnc5bmp4Y0gKNkFUSzcyb3hoOVRBdHZtVWNYdG5aTGkya1VwQ2UyVXVNR29NOVpEdWxlYnl6WUxzMmFGSzdQYXlTK1ZGaGVadAplSk1FTHB5Q2JUYXB4REZrSDRhREN5cjBOUXA0eVZYUFFiQkg2VENmbWI1aHFBYUV1U2g2WHpqWkc2azRzSU4vCmM4SERPMGdxZ2c4aG03ak1xRFhEaEJ1RHN6NitwSlZwQVRxSkFIZ0UyY24wbVJtclZuNWJpNFk1RlpHa0VDd0oKTW9CZ3M1UEFLcllZQzUxK2pVbnlFRXAvK2RWR0x4bVNvNW1uSnF5N2pEem1EcnhIQjl4elVmRndaQzhJK2JSSApIVEJzUk9vcE40V1NhR2E4Z3pqK2V6a3UwMUR3SC90ZVlMYXBwdm9uUWZHYkdITHk5WVIwU3NsbnhGU3VTR1RmCmpORnVzQjNoQjQ4SUhwbWNjZWxNMktYM1J4SWZkTkZSbm9iendxSWpRQXR6MjB1bTUzTUdqTUdnNmNGWnJFYjYKNWkvNHozR2NSbTI1eEJXTk9Ia0RSVWp2eEYzWENPNkhPU0tHc2cwUFdFUDNjYWxJTHYzcTFoOENBd0VBQWFPQgpyRENCcVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVCkY2RE53ZVJCdGpwYk84dEZuYjBjd3BqNmhsZ3dId1lEVlIwakJCZ3dGb0FVRjZETndlUkJ0anBiTzh0Rm5iMGMKd3BqNmhsZ3dSZ1lEVlIwZ0JEOHdQVEE3QmdsZ2hYUUJXUUVEQVFFd0xqQXNCZ2dyQmdFRkJRY0NBUllnYUhSMApjRG92TDNKbGNHOXphWFJ2Y25rdWMzZHBjM056YVdkdUxtTnZiUzh3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCCkFIUEdnZUFuMGkwUDRKVXc0cHBCZjFBc1gxOWlZYW1HYW1rWURIUkoxbDJFNmtGU0dHOVlyVkJXSUdyR3ZTaHAKV0pIY2tSRTFxVG9kdkJxbFlKN1lIMzlGa1duWmZydDRjc0VHRHlyT2o0VndZYXlnelF1NE9TbFdoREpPaHJzOQp4Q3JaMXg5eTd2NVJvU0pCc1hFQ1l4cUNzR0tyWGxjU0g5L0wzWFdnd0YxNWtJd2I0RkRtM2pIK21IdHdYNldRCjJLMzRBclp2MDJEZFFFc2l4VDJ0T25xZkdocEhrWGt6dW9MY01ta0RsbTRmUy9CeC91Tm5jcUN4djF5TDVQcVoKSXNlRXVSdU5JNWMvN1NYZ3oyVzc5V0VFNzkwZXNscEJJbHFobjEwczZGdkpiYWtNREhpcVlNWldqd0ZhREdpOAphUmw1eEI5K2x3Vy94ZWtrVVY3VTFVdFQ3ZGtqV2pZRFphUEJBNjFCTVBOR0c0V1FyMlcxMWJIa0ZsdDRkUjJYCmVtMVpxU3FQZTk3RGg0a1FtVWx6ZU1nOXZWRTFkQ3JWOFg1cEd5cTdPNzBsdUpwYVBYSmhrR2FIN2d6V1RkUVIKZEF0cS9nc0QvS05WVjRuK1NzdXVXeGNGeVBLTkl6RlRPTkl0YWorQ3VZMElhdmRlUVhSdXd4RitCNndwWUpFLwpPTXBYRUEyOU1DL0hwZVpCb05xdUJZZWFvS1JsYkV3SkRJbTZ1Tk81d0pPS01QcU41WnByRlFGT1o2cmFZbFkrCmhBaG0wc1EyZmFjK0VQeUk0TlNBNVFDOXF2Tk9CcU42YXZsaWN1TUpUK3ViRGdFajhaKzdmTnpjYkJHWEpiTHkKdEdNVTBnWXFaNHlEOWM3cUI5aWFhaDdzNUFxN0trenJDV0E1enNwaTJDNXUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1HZW9UcnVzdCBJbmMuCiMgU3ViamVjdDogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUdlb1RydXN0IEluYy4KIyBMYWJlbDogIkdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAzMjc5ODIyNjU1MTI1Njk2MzMyNDMxMzgwNjQzNjk4MTk4MjM2OQojIE1ENSBGaW5nZXJwcmludDogMDI6MjY6YzM6MDE6NWU6MDg6MzA6Mzc6NDM6YTk6ZDA6N2Q6Y2Y6Mzc6ZTY6YmYKIyBTSEExIEZpbmdlcnByaW50OiAzMjozYzoxMTo4ZToxYjpmNzpiODpiNjo1Mjo1NDplMjplMjoxMDowZDpkNjowMjo5MDozNzpmMDo5NgojIFNIQTI1NiBGaW5nZXJwcmludDogMzc6ZDU6MTA6MDY6YzU6MTI6ZWE6YWI6NjI6NjQ6MjE6ZjE6ZWM6OGM6OTI6MDE6M2Y6YzU6Zjg6MmE6ZTk6OGU6ZTU6MzM6ZWI6NDY6MTk6Yjg6ZGU6YjQ6ZDA6NmMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURmRENDQW1TZ0F3SUJBZ0lRR0t5MWF2MXB0aFU2WTJ5djJ2ckVvVEFOQmdrcWhraUc5dzBCQVFVRkFEQlkKTVFzd0NRWURWUVFHRXdKVlV6RVdNQlFHQTFVRUNoTU5SMlZ2VkhKMWMzUWdTVzVqTGpFeE1DOEdBMVVFQXhNbwpSMlZ2VkhKMWMzUWdVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MHdOakV4Ck1qY3dNREF3TURCYUZ3MHpOakEzTVRZeU16VTVOVGxhTUZneEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUsKRXcxSFpXOVVjblZ6ZENCSmJtTXVNVEV3THdZRFZRUURFeWhIWlc5VWNuVnpkQ0JRY21sdFlYSjVJRU5sY25ScApabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDCkFRRUF2cmdWZS8vVWZIMW5yWU5rZThoQ1V5M2Y5b1FJSUdIV0FWbHFuRVFScis5Mi9aVit6bUV3dTNxRFh3SzkKQVdiSzdoV05iNkV3bkwyaGhaNlVPdk5XaUFBeHo5anVhcFlDMmUwRGpQdDFiZWZxdUZVV0JSYWE5T0Jlc1lqQQpaSVZjRlUySXg3ZTY0SFhwclFVOW5jZUpTT0M3S01nRDRUQ1RaRjVTd0Zsd0lqVlhpSXJ4bFFxRDE3d3hjd0UwCjdlOUdjZUJyQXFnMWNtdVhtMmJneXh4NVg5Z2FCR2dlUndMbW5XRGlOcGNCMzg0MWt0KytaOGR0ZDFrN2o1M1cKa0JXVXZFSTBFTUU1K2JFblBuN1dpblhGc3ErVzA2TGVtK1NZdm4zaDZZR3R0bS84MXc3YTREU3dEUnAzNStNSQptTzlZK3B5RXR6YXZ3dCtzMHZRUUJuQnhOUUlEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHCkExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVTE5WUVFaY1ZpL0NQTm1GYlN2dHIyWm5KTTVJd0RRWUoKS29aSWh2Y05BUUVGQlFBRGdnRUJBRnB3Znl6ZHR6UlA5WVpScVNhK1M3aXE4WEVOM0dISG9PbzBIbnAzRHdRMQo2Q2VQYkpDL2tSWWtSajVLVHM0ckZ0VUxVaDM4SDJlaUFrVXhUODd6K2dPbmVaMVRhdG5hWXpyNGdOZlRtZUdsCjRiN1VWWEdZTlRxK2srcXVyVUt5a0cvZy9DRk5OV016aVVuV20wN0t4K2RPQ1FEMzJzZnZtV0taZDdhVklsNksKb0t2MHVIaVl5amdabWNseW5uak5TNnl2R2FCekVpMzh3a0c2Z1pIYUZsb3h0L20wY1lBU1NKbHljMXBaVThGagpValB0cDhuU09RSncrdUN4UW1ZcHFwdFI3VEJVSWhSZjJhc2R3ZVNVOFBqMUsvZnF5bmhHMXJpUi9hWU5LeG9VCkFUNkE4RUtnbFFkZWJjM01TNlJGamFzUzZMUGVXdVdnZk9nUEloMWE2Vms9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj10aGF3dGUgUHJpbWFyeSBSb290IENBIE89dGhhd3RlLCBJbmMuIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24vKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj10aGF3dGUgUHJpbWFyeSBSb290IENBIE89dGhhd3RlLCBJbmMuIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24vKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogInRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EiCiMgU2VyaWFsOiA2OTUyOTE4MTk5MjAzOTIwMzU2NjI5ODk1Mzc4NzcxMjk0MDkwOQojIE1ENSBGaW5nZXJwcmludDogOGM6Y2E6ZGM6MGI6MjI6Y2U6ZjU6YmU6NzI6YWM6NDE6MWE6MTE6YTg6ZDg6MTIKIyBTSEExIEZpbmdlcnByaW50OiA5MTpjNjpkNjplZTozZTo4YTpjODo2Mzo4NDplNTo0ODpjMjo5OToyOTo1Yzo3NTo2Yzo4MTo3Yjo4MQojIFNIQTI1NiBGaW5nZXJwcmludDogOGQ6NzI6MmY6ODE6YTk6YzE6MTM6YzA6Nzk6MWQ6ZjE6MzY6YTI6OTY6NmQ6YjI6NmM6OTU6MGE6OTc6MWQ6YjQ6NmI6NDE6OTk6ZjQ6ZWE6NTQ6Yjc6OGI6ZmI6OWYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVJRENDQXdpZ0F3SUJBZ0lRTkU3VlZ5RFY3ZXhKOUMvT045c3JiVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKcVRFTE1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RESFJvWVhkMFpTd2dTVzVqTGpFb01DWUdBMVVFQ3hNZgpRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFNE1EWUdBMVVFQ3hNdktHTXBJREl3Ck1EWWdkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4SHpBZEJnTlYKQkFNVEZuUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEV3SGhjTk1EWXhNVEUzTURBd01EQXdXaGNOTXpZdwpOekUyTWpNMU9UVTVXakNCcVRFTE1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RESFJvWVhkMFpTd2dTVzVqCkxqRW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFNE1EWUcKQTFVRUN4TXZLR01wSURJd01EWWdkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObApJRzl1YkhreEh6QWRCZ05WQkFNVEZuUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEV3Z2dFaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNzb1BEN2dGblVuTWVrejUyaFdYTUpFRVVNRFN4dWFQRnMKVzBob1NWazMvQXN6R2NKM2Y4d1FMWlUwSE9iclRRbW5ITks0eVpjMkFyZUoxQ1JmQnNETVJKU1VqUUppYit0YQozUkdOS0pwY2hKQVFlZzI5ZEdZdmFqaWc0dFZVUk9zZEI1OEh1bS91NmYxT0N5bjFQb1NnQWZHY3EvZ2Nmb21rCjZLSFljV1VObzFGNzdyelNJbUFOdVZ1ZDM3cjhVVnNMcjVpeTZTN3BCT2hpaDk0cnlOZE93VXhrSHQzUGgxaTYKU2svS2FBY2RISjFLeHRVdmtjeDhjWEljeGNCbjZ6TDl5WkpjbE5xRndKdS9VMzByQ2ZTTW5aRWZsMnBTeTk0SgpOcVIzMkh1SFVFVFZQbTRwYWZzNVNTWWVDYVdBZTBBdDYrZ25oY24rWWYxKzVueVhIZFdkQWdNQkFBR2pRakJBCk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJSN1cwWFAKcjg3TGV2MHhraHBxdHZORzYxZElVREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBZVJIQVM3T1J0dnp3NldmVQpEVzVGdmxYb2s5TE9Bei90MmlXd0hWZkxIanAyb0V6c1VIYm9aSElNcEtueHVJdlcxb2VFdXpMbFFSSEFkOW16CllKM3JHOVhSYmtSRXFhWUI3RlZpSFhlNFhJNUlTWHljTzFjUnJLMXpONDR2ZUZ5UWFFZlpZR0RtL0FjOUlpQVgKeFBjVzZjVFljdm5JYzN6ZkZpOFZxVDc5YWllMm9ldGF1cGdmMWVOTlpBcWRFOGhodXZVNUhJZTZ1TDE3SW4vMgovcXhBZWVXc0VHODlqeHQ1ZG92RU43TWhHSVRsTmdEcll5Q1p1ZW4rTXdTN1FjakJBdmxFWXlDZWdjNUMwOVkvCkxIYlRZNXhaM1krbTRRNmdMa0gzTHBWSHo3ejlNL1AyQzJGK2ZwRXJnVWZDSnpEdXB4QmRONDljT1N2a0JQQjcKalZhTWFBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNSBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDYgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPVZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNSBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDYgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiVmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc1IgojIFNlcmlhbDogMzMwMzc2NDQxNjc1NjgwNTg5NzAxNjQ3MTk0NzU2NzYxMDE0NTAKIyBNRDUgRmluZ2VycHJpbnQ6IGNiOjE3OmU0OjMxOjY3OjNlOmUyOjA5OmZlOjQ1OjU3OjkzOmYzOjBhOmZhOjFjCiMgU0hBMSBGaW5nZXJwcmludDogNGU6YjY6ZDU6Nzg6NDk6OWI6MWM6Y2Y6NWY6NTg6MWU6YWQ6NTY6YmU6M2Q6OWI6Njc6NDQ6YTU6ZTUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDlhOmNmOmFiOjdlOjQzOmM4OmQ4OjgwOmQwOjZiOjI2OjJhOjk0OmRlOmVlOmU0OmI0OjY1Ojk5Ojg5OmMzOmQwOmNhOmYxOjliOmFmOjY0OjA1OmU0OjFhOmI3OmRmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFMHpDQ0E3dWdBd0lCQWdJUUdOclJuaVo5Nkx0S0lWak56R3M3U2pBTkJna3Foa2lHOXcwQkFRVUZBRENCCnlqRUxNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUwKRXhaV1pYSnBVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOaUJXWlhKcApVMmxuYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNVVV3UXdZRFZRUURFenhXClpYSnBVMmxuYmlCRGJHRnpjeUF6SUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjAKYUc5eWFYUjVJQzBnUnpVd0hoY05NRFl4TVRBNE1EQXdNREF3V2hjTk16WXdOekUyTWpNMU9UVTVXakNCeWpFTApNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUxFeFpXClpYSnBVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOaUJXWlhKcFUybG4KYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNVVV3UXdZRFZRUURFenhXWlhKcApVMmxuYmlCRGJHRnpjeUF6SUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5CmFYUjVJQzBnUnpVd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN2SkFnSUtYbzEKbm1BTXF1ZExPMDdjZkx3OFJSeTdLK0QrS1FMNVZ3aWpaSVVWSi9YeHJjZ3hpVjBpNkNxcXBrS3pqL2k1VmJleAp0MHV6L285K0IxZnM3MFBiWm1JVlljOWdEYVRZM3ZqZ3cySUlQVlFUNjBuS1dWU0ZKdVVyanh1ZjYvV2hrY0l6ClNkaERZMnBTUzlLUDZIQlJUZEdKYVh2SGNQYXozQkowMjN0ZFMxYlRscjhWZDZHdzlLSWw4cThja21jWTVmUUcKQk8rUXVlUUE1TjA2dFJuL0FycjBQTzdnaStzM2krejAxNnp5OXZBOXI5MTFrVE1aSFJ4QXkzUWtHU0dUMlJUKwpyQ3BTeDQvVkJFbmtqV05IaUR4cGc4ditSNzByZmsvRmxhNE9uZFRSUThCbmMrTVVDSDdsUDU5enVETUt6MTAvCk5JZVdpdTVUNkNVVkFnTUJBQUdqZ2JJd2dhOHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEUKQkFNQ0FRWXdiUVlJS3dZQkJRVUhBUXdFWVRCZm9WMmdXekJaTUZjd1ZSWUphVzFoWjJVdloybG1NQ0V3SHpBSApCZ1VyRGdNQ0dnUVVqK1hUR29hc2pZNXJ3OCtBYXRSSUdDeDdHUzR3SlJZamFIUjBjRG92TDJ4dloyOHVkbVZ5CmFYTnBaMjR1WTI5dEwzWnpiRzluYnk1bmFXWXdIUVlEVlIwT0JCWUVGSC9UWmFmQzNleTc4REFKODBNNStnS3YKTXpFek1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQ1RKRW93WDJMUDJCcVlMejNxM0prdHZYZjJwWGtpT096RQpwNkI0RXExaURrVndaTVhubDJZdG1BbCtYNi9XekNobDhnR3FDQnBIM3ZuNWZKSmFDR2tnRGRrK2JXNDhEVzdZCjVnYVJRQmk1K01IdDM5dEJxdUNXSU1uTlpCVTRnY21VN3FLRUtRc1RiNDdiRE4wbEF0dWtpeGxFMGtGNkJXbEsKV0U5Z3luNkNhZ3NDcWlVWE9iWGJmK2VFWlNxVmlyMkczbDZCRm9NdEVNemUvYWlDS20wb0h3MEx4T1huR2lZWgo0ZlFSYnhDMWxmem5RZ1V5Mjg2ZFVWNG90cDZGMDF2dnBYMUZRSEtPdHc1ckRnYjdNelZJY2JpZEo0dkVaVjhOCmhuYWNSSHIybFZ6MlhUSUlNNlJVdGhnL2FGenlRa3FGT0ZTRFg5SG9MUEtzRWRhbzdXTnEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNlY3VyZVRydXN0IENBIE89U2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24KIyBTdWJqZWN0OiBDTj1TZWN1cmVUcnVzdCBDQSBPPVNlY3VyZVRydXN0IENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTZWN1cmVUcnVzdCBDQSIKIyBTZXJpYWw6IDE3MTk5Nzc0NTg5MTI1Mjc3Nzg4MzYyNzU3MDE0MjY2ODYyMDMyCiMgTUQ1IEZpbmdlcnByaW50OiBkYzozMjpjMzphNzo2ZDoyNTo1NzpjNzo2ODowOTo5ZDplYToyZDphOTphMjpkMQojIFNIQTEgRmluZ2VycHJpbnQ6IDg3OjgyOmM2OmMzOjA0OjM1OjNiOmNmOmQyOjk2OjkyOmQyOjU5OjNlOjdkOjQ0OmQ5OjM0OmZmOjExCiMgU0hBMjU2IEZpbmdlcnByaW50OiBmMTpjMTpiNTowYTplNTphMjowZDpkODowMzowZTpjOTpmNjpiYzoyNDo4MjozZDpkMzo2NzpiNToyNTo1Nzo1OTpiNDplNzoxYjo2MTpmYzplOTpmNzozNzo1ZDo3MwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHVEQ0NBcUNnQXdJQkFnSVFEUENPWEFnV3BhMUNmL0RySnhoWjBEQU5CZ2txaGtpRzl3MEJBUVVGQURCSQpNUXN3Q1FZRFZRUUdFd0pWVXpFZ01CNEdBMVVFQ2hNWFUyVmpkWEpsVkhKMWMzUWdRMjl5Y0c5eVlYUnBiMjR4CkZ6QVZCZ05WQkFNVERsTmxZM1Z5WlZSeWRYTjBJRU5CTUI0WERUQTJNVEV3TnpFNU16RXhPRm9YRFRJNU1USXoKTVRFNU5EQTFOVm93U0RFTE1Ba0dBMVVFQmhNQ1ZWTXhJREFlQmdOVkJBb1RGMU5sWTNWeVpWUnlkWE4wSUVOdgpjbkJ2Y21GMGFXOXVNUmN3RlFZRFZRUURFdzVUWldOMWNtVlVjblZ6ZENCRFFUQ0NBU0l3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLdWtnZVdWemZYMkZJN0NUOHJVNG5pVldKeEI0UTJaUUNRWE9aRXoKWnVtKzRZT3ZZbHlKMGZ3a1cyR3o0QkVSUVJ3ZGJ2QzR1L2plcDRHNnBrakdueDI5dm82cFFUNjRsTzBwR3RTTwowZ01kQSs5dERXY2NWOWNHcmNySTlmNE9yMllsU0FTV0MxMmp1aGJEQ0UvUlJ2Z1VYUExJWGdHWmJmMkl6SWFvCndXOHhRbXhTUG1qTDh4azAzN3VIR0ZhQUpzVFEzTUJ2Mzk2Z3dwRVdvR1FSUzBTOEh2Ym4rbVBlWnF4MnBIR2oKN0RhVWFIcDNwTEhuRGkrQmV1SzFjb2J2b211TDhBL2IwMWsvdW5LOFJDU2M0M096OTY5WEwwSW1uYWwwdWdCUwo4a3ZOVTN4SEN6YUZEbWFwQ0pjV05GZkJadmVBNCsxd1ZNZVQ0QzRvRlZtSHVyc0NBd0VBQWFPQm5UQ0JtakFUCkJna3JCZ0VFQVlJM0ZBSUVCaDRFQUVNQVFUQUxCZ05WSFE4RUJBTUNBWVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBZEJnTlZIUTRFRmdRVVFqSzJGdm9FL2Y1ZFMzckQvZmRNUUIxYVE2OHdOQVlEVlIwZkJDMHdLekFwb0NlZwpKWVlqYUhSMGNEb3ZMMk55YkM1elpXTjFjbVYwY25WemRDNWpiMjB2VTFSRFFTNWpjbXd3RUFZSkt3WUJCQUdDCk54VUJCQU1DQVFBd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFERHRUMHJoV0RwU2NsdTFwcU5sR0thN1VUdDMKNlozcTA1OWM0RVZsZXczS1crSndVTEtVQlJTdVNjZU5RUWNTYzVSK0RDTWgvYndRZjJBUVduTDFtQTZzN0xsLwozWHB2WGRNYzlQK0lCV2xDcVFWeHlMZXNKdWd1dEl4cS8zSGN1TEhmbWJ4OElWUXI1RmlpdTFjcHJwNnBveGttCkQ1a3VDTER2L1duUG1Sb0pqZU9ubnl2Sk5qUjdKTE40VEpVWHBBWW1IclprVWpaZllHZlpuTVVGZEF2blp5UFMKQ1B5STZhNkxmK0V3OURkKy9jWXkyaTJlUkRBd2JPNEgzdEkwL05ML1FQWkw5R1pHQmxTbThqSUtZeVl3YTV2UgozSXRIdXVHNTFXTFFvcUQwWndWNEtXTWFid1RXK01aTW81cXhON1NONVNoTEhaNHN3cmhvdk8wQzdqRT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNlY3VyZSBHbG9iYWwgQ0EgTz1TZWN1cmVUcnVzdCBDb3Jwb3JhdGlvbgojIFN1YmplY3Q6IENOPVNlY3VyZSBHbG9iYWwgQ0EgTz1TZWN1cmVUcnVzdCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU2VjdXJlIEdsb2JhbCBDQSIKIyBTZXJpYWw6IDk3NTE4MzYxNjc3MzEwNTE1NTQyMzIxMTk0ODE0NTY5Nzg1OTcKIyBNRDUgRmluZ2VycHJpbnQ6IGNmOmY0OjI3OjBkOmQ0OmVkOmRjOjY1OjE2OjQ5OjZkOjNkOmRhOmJmOjZlOmRlCiMgU0hBMSBGaW5nZXJwcmludDogM2E6NDQ6NzM6NWE6ZTU6ODE6OTA6MWY6MjQ6ODY6NjE6NDY6MWU6M2I6OWM6YzQ6NWY6ZjU6M2E6MWIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQyOjAwOmY1OjA0OjNhOmM4OjU5OjBlOmJiOjUyOjdkOjIwOjllOmQxOjUwOjMwOjI5OmZiOmNiOmQ0OjFjOmExOmI1OjA2OmVjOjI3OmYxOjVhOmRlOjdkOmFjOjY5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdkRDQ0FxU2dBd0lCQWdJUUIxWWlwT2pVaW9sTjlCUEk4UGpxcFRBTkJna3Foa2lHOXcwQkFRVUZBREJLCk1Rc3dDUVlEVlFRR0V3SlZVekVnTUI0R0ExVUVDaE1YVTJWamRYSmxWSEoxYzNRZ1EyOXljRzl5WVhScGIyNHgKR1RBWEJnTlZCQU1URUZObFkzVnlaU0JIYkc5aVlXd2dRMEV3SGhjTk1EWXhNVEEzTVRrME1qSTRXaGNOTWpreApNak14TVRrMU1qQTJXakJLTVFzd0NRWURWUVFHRXdKVlV6RWdNQjRHQTFVRUNoTVhVMlZqZFhKbFZISjFjM1FnClEyOXljRzl5WVhScGIyNHhHVEFYQmdOVkJBTVRFRk5sWTNWeVpTQkhiRzlpWVd3Z1EwRXdnZ0VpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3ZOUzdZckd4VmFRWng1Uk5vSkxOUDJNd2hSL2p4WURpSgppUVBwdmVwZVJsTUozRnoxV3VqM1JTb0M2ekZoMXlrelRNN0hmQW8zZmcrNk1wamhIWmV2ajhmY3lUaVc4OXNhCi9GSHRhTWJRYnFSOEpOR3VRc2lXVUdNdTRQNTEvcGluWDBrdWxlTTVNMlNPSHFSZmtOSm5QTExaL2tHNVZhY0oKam5JRkhvdmRSSVdDUXRCSndCMWc4TkVYTEpYcjlxWEJrcVBGd3FjSVlBMWdCQkNXZVo0V05PYXB0dm9sUlRuSQpIbVg1ay9XcThWTGNtWmc5cFlZYUREVXora3VsQkFZVkhER0E3Nm9ZYThKNzE5ck8rVE1nMWZXOWFqTXRnUVQ3CnNGelVuS1BpWEIzanFVSjFYbnZVZCs4NVZMckpDaGdiRXBsSkw0aEwvVkJpMFhQbmozcERBZ01CQUFHamdaMHcKZ1pvd0V3WUpLd1lCQkFHQ054UUNCQVllQkFCREFFRXdDd1lEVlIwUEJBUURBZ0dHTUE4R0ExVWRFd0VCL3dRRgpNQU1CQWY4d0hRWURWUjBPQkJZRUZLOUVCTUpCZmtpRDIwNDVBdXpzaEhybXpzbWtNRFFHQTFVZEh3UXRNQ3N3CkthQW5vQ1dHSTJoMGRIQTZMeTlqY213dWMyVmpkWEpsZEhKMWMzUXVZMjl0TDFOSFEwRXVZM0pzTUJBR0NTc0cKQVFRQmdqY1ZBUVFEQWdFQU1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQmpHZ2hBZmFSZVV3MTMySHF1SHcwTApVUllEN3hoOHlPT3ZhbGlURkdDUnNvVGNpRTYrT1lvNjgrYUNpVjBCTjdPckpLUVZEcEkxV2twRVhrNVgrblhPCkgwak9adlE4UUNhU21Hd2I3aVJHREJlelVxWGJwWkdSenpmVGIrY25DRHBPR1I4NnAxaGNGODk1UDR2a3A5TW0KSTUwbUQxaHAvRWQrc3RDTmk1Ty9LVTlEYVhSMlowdlBCNHptQXZlMTRiUkR0VXN0RkovNTNDWU52NlpIZEFiWQppTkU2S1RDRXp0STVnR0licU1kWFNieHFWVkZuRlVxK05RZmsxWFdZTjNrd0ZOc3BuV3pGYWN4SFZhSXc5OHhjCmY4TERtQnhyVGhhQTYzcDRaVVdpQUJxdkRBMVZaRFJJdUpLNThiUlFLZkpQSXgvYWJLd2ZST0hkSTNoUlc4Y1cKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgU3ViamVjdDogQ049Q09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89Q09NT0RPIENBIExpbWl0ZWQKIyBMYWJlbDogIkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDEwNDM1MDUxMzY0ODI0OTIzMjk0MTk5ODUwODk4NTgzNDQ2NDU3MwojIE1ENSBGaW5nZXJwcmludDogNWM6NDg6ZGM6Zjc6NDI6NzI6ZWM6NTY6OTQ6NmQ6MWM6Y2M6NzE6MzU6ODA6NzUKIyBTSEExIEZpbmdlcnByaW50OiA2NjozMTpiZjo5ZTpmNzo0Zjo5ZTpiNjpjOTpkNTphNjowYzpiYTo2YTpiZTpkMTpmNzpiZDplZjo3YgojIFNIQTI1NiBGaW5nZXJwcmludDogMGM6MmM6ZDY6M2Q6Zjc6ODA6NmY6YTM6OTk6ZWQ6ZTg6MDk6MTE6NmI6NTc6NWI6Zjg6Nzk6ODk6ZjA6NjU6MTg6Zjk6ODA6OGM6ODY6MDU6MDM6MTc6OGI6YWY6NjYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVIVENDQXdXZ0F3SUJBZ0lRVG9FdGlvSmw0QXNDN2o0MUFrYmxQVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKZ1RFTE1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0RwpBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEp6QWxCZ05WCkJBTVRIa05QVFU5RVR5QkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MHdOakV5TURFd01EQXcKTURCYUZ3MHlPVEV5TXpFeU16VTVOVGxhTUlHQk1Rc3dDUVlEVlFRR0V3SkhRakViTUJrR0ExVUVDQk1TUjNKbApZWFJsY2lCTllXNWphR1Z6ZEdWeU1SQXdEZ1lEVlFRSEV3ZFRZV3htYjNKa01Sb3dHQVlEVlFRS0V4RkRUMDFQClJFOGdRMEVnVEdsdGFYUmxaREVuTUNVR0ExVUVBeE1lUTA5TlQwUlBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjAKYUc5eWFYUjVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTBFQ0xpM0xqa1J2MwpVY0ViVkFTWTA2bS93ZWFLWFR1SCs3dUl6ZzNqTHo4R2x2Q2lLVkNacnRzN29WZXdkRkZ4emUxQ2tVMUIvcW5JCjJHcUdkMFM3V1dhWFVGNjAxQ3h3Uk0vYU41VkNhVHd3eEhHelV2QWhUYUhZdWpsOEhKNmpKSjN5Z3hhWXFoWjgKUTVzVlc3ZXVOSkgrMUdJbUdFYWFQK3ZCK2ZHUVYrdXNlZzJMMjNJd2FtYlY0RWFqY054bzJmOEVTSWwzM3JYcAorMmR0UWVtOE9iMHkyV0lDOGJHb1BXNDNuT0l2NHRPaUpvdkd1RlZEaU9FalBxWFNKRGxxUjZzQTFLR3pxU1grCkRUK25IYnJUVWNFTHBOcXNPTzlWVUNRRlpVYVRORTh0amEzRzFDRVowbzdLQldGeEIzTkg1WW9aRXIwRVRjNU8KbktWSXJMc205d0lEQVFBQm80R09NSUdMTUIwR0ExVWREZ1FXQkJRTFdPV0x4a3dWTjZSQXFUQ3BJYjVITmxwVwovekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QkpCZ05WSFI4RVFqQkFNRDZnClBLQTZoamhvZEhSd09pOHZZM0pzTG1OdmJXOWtiMk5oTG1OdmJTOURUMDFQUkU5RFpYSjBhV1pwWTJGMGFXOXUKUVhWMGFHOXlhWFI1TG1OeWJEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFQcGllbS9ZYjZkYzV0M2l1SFhJWQpTZE9INUVPQzZ6L0pxdldvdGU5VmZDRlNaZm5WRGVGczlENk1rM09STGdMRVRnZHhiOENQT0dFSXFCNkJDc0F2CklDOUJpNUhjU0VXODhjYmV1blpyTThnQUxURkdUTzNubmMrSWxQOHp3RmJvSklZbXVOZzRPTjhxYTkwU3pNYy8KUnhkTW9zSUdsZ25XMi80L1BFWkIzMWppVmc4OE84RWNrelhaT0ZLczdzanNMakJPbERXMEpCOUxlR25hOGdJNAp6SlZTay9Cd0pWbWNJR2ZFN3ZtTFYySDBrblo5UDRTTlZiZm81YXpWOGZVWlZxWmErNUFjcjVQcjVSelVaNWRkCkJBNitDNE9tRjRPNU1CS2d4VE1WQmJrTis4Y0ZkdVBZU28zOE5CZWp4aUVvdmpCRk1SN0hlTDVZWVRpc08rSUIKWlE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049TmV0d29yayBTb2x1dGlvbnMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IE89TmV0d29yayBTb2x1dGlvbnMgTC5MLkMuCiMgU3ViamVjdDogQ049TmV0d29yayBTb2x1dGlvbnMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IE89TmV0d29yayBTb2x1dGlvbnMgTC5MLkMuCiMgTGFiZWw6ICJOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkiCiMgU2VyaWFsOiAxMTY2OTc5MTUxNTI5Mzc0OTc0OTA0Mzc1NTYzODY4MTI0ODc5MDQKIyBNRDUgRmluZ2VycHJpbnQ6IGQzOmYzOmE2OjE2OmMwOmZhOjZiOjFkOjU5OmIxOjJkOjk2OjRkOjBlOjExOjJlCiMgU0hBMSBGaW5nZXJwcmludDogNzQ6Zjg6YTM6YzM6ZWY6ZTc6YjM6OTA6MDY6NGI6ODM6OTA6M2M6MjE6NjQ6NjA6MjA6ZTU6ZGY6Y2UKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE1OmYwOmJhOjAwOmEzOmFjOjdhOmYzOmFjOjg4OjRjOjA3OjJiOjEwOjExOmEwOjc3OmJkOjc3OmMwOjk3OmY0OjAxOjY0OmIyOmY4OjU5OjhhOmJkOjgzOjg2OjBjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlENWpDQ0FzNmdBd0lCQWdJUVY4c3piOEpjRnVaSEZoZmprREZvNERBTkJna3Foa2lHOXcwQkFRVUZBREJpCk1Rc3dDUVlEVlFRR0V3SlZVekVoTUI4R0ExVUVDaE1ZVG1WMGQyOXlheUJUYjJ4MWRHbHZibk1nVEM1TUxrTXUKTVRBd0xnWURWUVFERXlkT1pYUjNiM0pySUZOdmJIVjBhVzl1Y3lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcApkSGt3SGhjTk1EWXhNakF4TURBd01EQXdXaGNOTWpreE1qTXhNak0xT1RVNVdqQmlNUXN3Q1FZRFZRUUdFd0pWClV6RWhNQjhHQTFVRUNoTVlUbVYwZDI5eWF5QlRiMngxZEdsdmJuTWdUQzVNTGtNdU1UQXdMZ1lEVlFRREV5ZE8KWlhSM2IzSnJJRk52YkhWMGFXOXVjeUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrd2dnRWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEa3ZINlNNRzNHMkk0ckM3eEd6dUFubHQ3ZStmb1Mwend6CmM3TUVMN3h4ak9XZnRpSmdQbDlkemduL2dnd2JtbEZRR2lhSjNkVmhYUm5jRWc4dENxSkRYUmZRTkpJZzZuUFAKT0N3R0pnbDZjdmY2VURMNHdwUFRhYUlqemtHeHpPVFZIemJSaWpyNGpHUGlGRmxwN1EzVGYydm91QVBsVDJybAptR05wU0FXK0x2OHp0dW1YV1duNFp4bXVrMkdXUkJYVGNyQS92R3A5N0VoL2pjT3JxbkVyVTJsQlV6UzFzTG5GCkJnckVzRVgxUVYxdWlVVjdQVHNtakhUQzVkTFJmYklSMVB0WU1pS2FnTW5jL1F6cGYxNERsODQ3QUJTSEozQTQKcVk1dXN5ZDJtRkhnQmVNaHF4clZoU0k4S2JXYUZzV0FxUFM3YXpDUEwwWUNvckVNSXVEVEFnTUJBQUdqZ1pjdwpnWlF3SFFZRFZSME9CQllFRkNFd3lmc0ExMDZZMm9lcUt0Q25MckZBTWFkTU1BNEdBMVVkRHdFQi93UUVBd0lCCkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01GSUdBMVVkSHdSTE1Fa3dSNkJGb0VPR1FXaDBkSEE2THk5amNtd3UKYm1WMGMyOXNjM05zTG1OdmJTOU9aWFIzYjNKclUyOXNkWFJwYjI1elEyVnlkR2xtYVdOaGRHVkJkWFJvYjNKcApkSGt1WTNKc01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQzdya3ZudDFmcmY2b3R0M05IaFdyQjVLVWQ1T2M4CjZmUlpaWGUxZWx0YWpTVTI0SHFYTGpqQVYyQ0RtQWFEbjdsMmVtNVE0THFJTFB4RnpCaXdtWlZSRHV3ZHVJai8KaDFBY2dzTGo0REtBdjZBTFI4akRNZStaWnpLQVR4Y2hlUXhwWE41ZU5LNEN0U2JxVU45L0dHVXN5ZkpqNGFrSAovbnh4SDJzekpHb2VCZmNGYU1CcUVzc3VYbUhMcmlqVGZzSzBacEVtWHp3dUpGL0xXQS9yS095dkVaYnozSHR2CndLZUk4bE4zczJCZXJxNG8yalVzYnpSRjB5YmgzdXhiVHlkckZueTlSQVFZZ3JPSmVSY1FjVDE2b2haTzlRSE4KcEd4bGFLRkpkbHhEeWRpOE5tZHNwWlMxMU15NXZXbzFWaUhlMk1Qcis4dWtZRXl3VmFDZ2UxZXkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIFN1YmplY3Q6IENOPUNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIExhYmVsOiAiQ09NT0RPIEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDQxNTc4MjgzODY3MDg2NjkyNjM4MjU2OTIxNTg5NzA3OTM4MDkwCiMgTUQ1IEZpbmdlcnByaW50OiA3Yzo2MjpmZjo3NDo5ZDozMTo1Mzo1ZTo2ODo0YTpkNTo3ODphYToxZTpiZjoyMwojIFNIQTEgRmluZ2VycHJpbnQ6IDlmOjc0OjRlOjlmOjJiOjRkOmJhOmVjOjBmOjMxOjJjOjUwOmI2OjU2OjNiOjhlOjJkOjkzOmMzOjExCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNzo5Mzo5Mjo3YTowNjoxNDo1NDo5Nzo4OTphZDpjZToyZjo4ZjozNDpmNzpmMDpiNjo2ZDowZjozYTplMzphMzpiODo0ZDoyMTplYzoxNTpkYjpiYTo0ZjphZDpjNwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2lUQ0NBZytnQXdJQkFnSVFIMGV2cW1JQWNGQlVUQUdlbTJPWktqQUtCZ2dxaGtqT1BRUURBekNCaFRFTApNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFCkJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRUNoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVkJBTVQKSWtOUFRVOUVUeUJGUTBNZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EZ3dNekEyTURBdwpNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaFRFTE1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5ClpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2hNUlEwOU4KVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVkJBTVRJa05QVFU5RVR5QkZRME1nUTJWeWRHbG1hV05oZEdsdgpiaUJCZFhSb2IzSnBkSGt3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUURSM3N2ZGNtQ0ZZWDdkZVNSCkZ0U3JZcG4xUGxJTEJzNUJBSCtYNFFva1BCMEJCTzQ5MG8wSmx3emdkZVQ2KzNlS0t2VURZRXMyaXhZakZxMEoKY2ZSSzlDaFF0UDZJSEc0L2JDOHZDVmxicFZzTE01bml3ejJKK1dvczc3TFRCdW1qUWpCQU1CMEdBMVVkRGdRVwpCQlIxY2FjWlNCbThuWjNxUVVmZmxNUklkNW5UZVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBS0JnZ3Foa2pPUFFRREF3Tm9BREJsQWpFQTd3TmJlcXkzZUFweXQ0amYvN1ZHRkFrSytxRG0KZlFqR0dvZTlHS2h6dlNiS1lBeWR6cG1mejF3UE1PRytGREhxQWpBVTlKTThTYWN6ZXBCR1I3TmpmUk9iVHJkdgpHRGVBVS83ZElPQTFtamJSeHdHNTV0emQ4LzhkTERvV1Y5bVNPZFk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1PSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdBIENBIE89V0lTZUtleSBPVT1Db3B5cmlnaHQgKGMpIDIwMDUvT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZAojIFN1YmplY3Q6IENOPU9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0EgQ0EgTz1XSVNlS2V5IE9VPUNvcHlyaWdodCAoYykgMjAwNS9PSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkCiMgTGFiZWw6ICJPSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdBIENBIgojIFNlcmlhbDogODY3MTg4Nzc4NzExMzMxNTkwOTAwODA1NTU5MTE4MjM1NDgzMTQKIyBNRDUgRmluZ2VycHJpbnQ6IGJjOjZjOjUxOjMzOmE3OmU5OmQzOjY2OjYzOjU0OjE1OjcyOjFiOjIxOjkyOjkzCiMgU0hBMSBGaW5nZXJwcmludDogNTk6MjI6YTE6ZTE6NWE6ZWE6MTY6MzU6MjE6Zjg6OTg6Mzk6NmE6NDY6NDY6YjA6NDQ6MWI6MGY6YTkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQxOmM5OjIzOjg2OjZhOmI0OmNhOmQ2OmI3OmFkOjU3OjgwOjgxOjU4OjJlOjAyOjA3Ojk3OmE2OmNiOmRmOjRmOmZmOjc4OmNlOjgzOjk2OmIzOjg5OjM3OmQ3OmY1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEOFRDQ0F0bWdBd0lCQWdJUVFUMXl4L1JySDRGRGZmSFNLRlRmbWpBTkJna3Foa2lHOXcwQkFRVUZBRENCCmlqRUxNQWtHQTFVRUJoTUNRMGd4RURBT0JnTlZCQW9UQjFkSlUyVkxaWGt4R3pBWkJnTlZCQXNURWtOdmNIbHkKYVdkb2RDQW9ZeWtnTWpBd05URWlNQ0FHQTFVRUN4TVpUMGxUVkVVZ1JtOTFibVJoZEdsdmJpQkZibVJ2Y25ObApaREVvTUNZR0ExVUVBeE1mVDBsVFZFVWdWMGxUWlV0bGVTQkhiRzlpWVd3Z1VtOXZkQ0JIUVNCRFFUQWVGdzB3Ck5URXlNVEV4TmpBek5EUmFGdzB6TnpFeU1URXhOakE1TlRGYU1JR0tNUXN3Q1FZRFZRUUdFd0pEU0RFUU1BNEcKQTFVRUNoTUhWMGxUWlV0bGVURWJNQmtHQTFVRUN4TVNRMjl3ZVhKcFoyaDBJQ2hqS1NBeU1EQTFNU0l3SUFZRApWUVFMRXhsUFNWTlVSU0JHYjNWdVpHRjBhVzl1SUVWdVpHOXljMlZrTVNnd0pnWURWUVFERXg5UFNWTlVSU0JYClNWTmxTMlY1SUVkc2IySmhiQ0JTYjI5MElFZEJJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEEKTUlJQkNnS0NBUUVBeTArekFKczlOdDM1MFVscWF4QkpIK3pZSzdMRytES0JLVU9WVEpvWkl5RVZSZDdqeUJ4UgpWVnV1aytnMy95dHI2ZFRxdmlyZHFGRXIxMmJEWVZ4Z0FzajF6bko3TzdqeVRtVUltczJrYWhuQkFidHpwdGYyCnc5M052S1NMdFpsaHVBR2lvOVJOMUFVOWthMzR0QWh4Wks5dzhSeHJmdmJEZDUwa2MzdmtESXpoMlRiaG1Zc0YKbVF2dFJURUp5c0lBMi9keW9KYXFsWWZRanNlMllYTU5kbWFNM0J1MFk2S2ZmNU1UTVBHaEo5dloveXhWaUpHZwo0RThIc0NoV2pCZ2JsMFNPaWQzZ0YyN25LdStQT1FveGhJTFlRQlJKTG5wQjVLZis0MlRNd1ZseFN5d2hwMXQ5CjRCM1JMb0didzlobzk3MldHNnh3c1JZVUM5dGd1U1lCQlFJREFRQUJvMUV3VHpBTEJnTlZIUThFQkFNQ0FZWXcKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVc3dOK3JqYThzSG5SM0pRbXRoRytJYkpwaHBRdwpFQVlKS3dZQkJBR0NOeFVCQkFNQ0FRQXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRXVoL3d1SGJyUDV3VU94ClNQTW93QjB1eVFsQitwUUFIS1NrcTBsUGp6MGU3MDF2dmJ5azl2SW1NTWtReWgySSszUVpINFZGdmJCc1VmazIKZnR2MVRESTZRVTliUjgvb0N5MjJ4Qm1kZE1WSHhqdHFENndVMnp6MGM1eXBCZDhBM0hSNCt2ZzFZRmtDRXhoOAp2UHROc0NCdFE3dGdNSHBuTTF6Rm1kSDRMVGxTYy91TXFwY2xYSExaQ0I2clRqempnVEdmQTZiN3dQNHBpRlhhCmhOVlFBN2JpaEtPbU5xb1JPZ0hoR0V2V1JHaXpQZmxUZElTelJwRkdsZ0MzZ0N5MjRlTVE0dHVpNXlpUEFaWmkKRmo0QTR4eWxOb0VZb2t4U2RzQVJvMjdtSGJyaldyNDJVOFUrZFkrR2FTbFlVN1djdTIrZlhNVVk3TjB2NFpqSgovTDdmQ2cwPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2VydGlnbmEgTz1EaGlteW90aXMKIyBTdWJqZWN0OiBDTj1DZXJ0aWduYSBPPURoaW15b3RpcwojIExhYmVsOiAiQ2VydGlnbmEiCiMgU2VyaWFsOiAxODM2NDgwMjk3NDIwOTM2MjE3NQojIE1ENSBGaW5nZXJwcmludDogYWI6NTc6YTY6NWI6N2Q6NDI6ODI6MTk6YjU6ZDg6NTg6MjY6Mjg6NWU6ZmQ6ZmYKIyBTSEExIEZpbmdlcnByaW50OiBiMToyZToxMzo2Mzo0NTo4NjphNDo2ZjoxYTpiMjo2MDo2ODozNzo1ODoyZDpjNDphYzpmZDo5NDo5NwojIFNIQTI1NiBGaW5nZXJwcmludDogZTM6YjY6YTI6ZGI6MmU6ZDc6Y2U6NDg6ODQ6MmY6N2E6YzU6MzI6NDE6Yzc6Yjc6MWQ6NTQ6MTQ6NGI6ZmI6NDA6YzE6MWY6M2Y6MWQ6MGI6NDI6ZjU6ZWU6YTE6MmQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxRENDQXBDZ0F3SUJBZ0lKQVA3YzR3RVB5VWovTUEwR0NTcUdTSWIzRFFFQkJRVUFNRFF4Q3pBSkJnTlYKQkFZVEFrWlNNUkl3RUFZRFZRUUtEQWxFYUdsdGVXOTBhWE14RVRBUEJnTlZCQU1NQ0VObGNuUnBaMjVoTUI0WApEVEEzTURZeU9URTFNVE13TlZvWERUSTNNRFl5T1RFMU1UTXdOVm93TkRFTE1Ba0dBMVVFQmhNQ1JsSXhFakFRCkJnTlZCQW9NQ1VSb2FXMTViM1JwY3pFUk1BOEdBMVVFQXd3SVEyVnlkR2xuYm1Fd2dnRWlNQTBHQ1NxR1NJYjMKRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFESWFQSEoxdGF6TkhVbWdoN3N0TDdxWE9FbTdSRkhZZUdpZkJaNApRQ0hrWUo1YXlHUGh4TEdXa3Y4WWJXa2o0U3RpOTkzaU5pK1JCN2xJenc3c2ViWXM1elJMY0FnbG96eUhHeG55CmdRY1BPSkFaMHhIK2hyVHkwVjRlSHBiTmdHek9PekdUdHZLZzBLbVZFbjJsbXN4cnlJUldpak9wNXlJVlV4YncKekJmc1YxL3BvZ3FZQ2Q3alg1eHYzRWpqaFFzVldxYTZuNnhJNHdteTkvUXkzbDQwdmh4NFhVSmJ6ZzRpajAyUQoxMzB5R0xNTExHcS9qajhVRVlrZ0RuY1V0VDJVQ0lmM0pSN1ZzbUFBN0c4cUtDVnVLajRZWXhjbFB6NUVJQmIyCkpzZ2xyZ1ZLdE9kakxQT01GbE4rWFBzUkdnakJSbUtmSXJqeHdvMXAzUG82V0FiZkFnTUJBQUdqZ2J3d2dia3cKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVR3UzK1FUbVF0Q1JadmdIeVV0VkY5bG81M0JFdwpaQVlEVlIwakJGMHdXNEFVR3UzK1FUbVF0Q1JadmdIeVV0VkY5bG81M0JHaE9LUTJNRFF4Q3pBSkJnTlZCQVlUCkFrWlNNUkl3RUFZRFZRUUtEQWxFYUdsdGVXOTBhWE14RVRBUEJnTlZCQU1NQ0VObGNuUnBaMjVoZ2drQS90emoKQVEvSlNQOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CRUdDV0NHU0FHRytFSUJBUVFFQXdJQUJ6QU5CZ2txaGtpRwo5dzBCQVFVRkFBT0NBUUVBaFFNZWtuSDJRcS9obzJHZTYvUEFEL0tsMU5xVjV0YSthRFk5Zm00ZlRJcnYwUThoCmJWNmxVbVBPRXZqdkt0cHY2emYrRXdMSHl6cytJbXZhWVM1LzFISTkzVERoSGt4QUdZd1AxNXpSZ3pCN21GbmMKZmNhNURDbE1vVE9pNjJjNlpZVFRsdUx0ZGtWd2o3VXIzdmtqMWtsdVBCUzF4cDgxSGxEUXdZOXFjRVFDWXN1dQpIV2hCcDZwWDZGT3FCOUlHOXRVVUJndVJBM1VzYkhLMVlaV2FEWXU1RGVmMTMxVE4zdWJZMWdrSWwyUGx3UzZ3CnQwUW13Q2JBcjFVd25qdlZOaW9aQlBSY0h2L1BMTGYvMFAySFFCSFZFU083U01BaHFhUW9MZjBWK0xCT0svUXcKV3lIOEVaRTB2a0h2ZTUyWGRmK1hsY0NXV0MvcXUwYlh1K1RaTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIgTz1EZXV0c2NoZSBUZWxla29tIEFHIE9VPVQtVGVsZVNlYyBUcnVzdCBDZW50ZXIKIyBTdWJqZWN0OiBDTj1EZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EgMiBPPURldXRzY2hlIFRlbGVrb20gQUcgT1U9VC1UZWxlU2VjIFRydXN0IENlbnRlcgojIExhYmVsOiAiRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIiCiMgU2VyaWFsOiAzOAojIE1ENSBGaW5nZXJwcmludDogNzQ6MDE6NGE6OTE6YjE6MDg6YzQ6NTg6Y2U6NDc6Y2Q6ZjA6ZGQ6MTE6NTM6MDgKIyBTSEExIEZpbmdlcnByaW50OiA4NTphNDowODpjMDo5YzoxOTozZTo1ZDo1MTo1ODo3ZDpjZDpkNjoxMzozMDpmZDo4YzpkZTozNzpiZgojIFNIQTI1NiBGaW5nZXJwcmludDogYjY6MTk6MWE6NTA6ZDA6YzM6OTc6N2Y6N2Q6YTk6OWI6Y2Q6YWE6Yzg6NmE6MjI6N2Q6YWU6Yjk6Njc6OWU6Yzc6MGI6YTM6YjA6Yzk6ZDk6MjI6NzE6YzE6NzA6ZDMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURuekNDQW9lZ0F3SUJBZ0lCSmpBTkJna3Foa2lHOXcwQkFRVUZBREJ4TVFzd0NRWURWUVFHRXdKRVJURWMKTUJvR0ExVUVDaE1UUkdWMWRITmphR1VnVkdWc1pXdHZiU0JCUnpFZk1CMEdBMVVFQ3hNV1ZDMVVaV3hsVTJWagpJRlJ5ZFhOMElFTmxiblJsY2pFak1DRUdBMVVFQXhNYVJHVjFkSE5qYUdVZ1ZHVnNaV3R2YlNCU2IyOTBJRU5CCklESXdIaGNOT1Rrd056QTVNVEl4TVRBd1doY05NVGt3TnpBNU1qTTFPVEF3V2pCeE1Rc3dDUVlEVlFRR0V3SkUKUlRFY01Cb0dBMVVFQ2hNVFJHVjFkSE5qYUdVZ1ZHVnNaV3R2YlNCQlJ6RWZNQjBHQTFVRUN4TVdWQzFVWld4bApVMlZqSUZSeWRYTjBJRU5sYm5SbGNqRWpNQ0VHQTFVRUF4TWFSR1YxZEhOamFHVWdWR1ZzWld0dmJTQlNiMjkwCklFTkJJREl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3JDNk0xNElzcEZMRVUKaGE4OEVPUTVielZkU3E3ZDZtR05sVW4wYjJTakdtQm1wS2xBSW9UWjFLWGxlSk1PYUFHdHVVMWNPczdUdUtoQwpRTi9QbzdxQ1dXcVNHNndjbXRvSUt5VW4rV2tqUi9IZzZ5eDZtL1VUQXRCK05IekNuandBV2F2MTJnejFNandyCnJGRGExc1BlZzVUS3FBeVpNZzRJU0ZaYmF2dmE0VmhZQVVsZmNrRThGUVlCamwydHFyaVR0TTJlNjZmb2FpMVMKTk5zNjcxeDFVZHJiOHpINTduR1lNc1JVRlVRTStadFY3YTNmR0FpZ280YUtTZTVUQlk4WlROWGVXSG1iMG1vYwpRcXZGMWFmUGFBK1c1T0ZobUhaaHlKRjgxajRBNHBGUWgrR2RDdWF0bDlJZHhqcDl5N3phQXpUVmpsc0I5V29ICnR4YTJia3AvQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJReHcza2J1dlZUMXhmZ2lYb3RGMndLc3l1ZE16QVAKQmdOVkhSTUVDREFHQVFIL0FnRUZNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQwpBUUVBbEdSWnJUbGs1eW5yRS81YXc0c1RWOGdFSlBCMGQ4Qmc0MmY3NlltbWc3K1dnbnh1MU1NOTc1NkFicnNwCnRKaDZzVHRVNnprWFIzNGFqZ3Y4SHpGWk1RU3l6aGZ6TE1kaU5sWGlJdGlKVmJTWVNLcGsrdFljTnRoRWVGcGEKSXpwWGwvVjZNRSt1bjJwTVN5dU9vQVBqUHVDcDFOSjcwck9vNG5JOHJaNy9nRm5rbTBXMDlqdXd6VGtabURMbAo2aUZoa09ReElZNDBzZmN2TlVxRkVOcm5pamNodmxsajRQS0ZpREZUMUZRVWhYQjU5QzRHZHlkMUx4KzRpdm4rCnhicllOdVNEN09kbHQ3OWpXdk5HcjRHVU45UkJqTllqMWg3UDlXZ2JSR09pV3Jxbk5WbWg1WEFGbXc0alY1bVUKQ20yNk9XTW9ocEx6R0lUWSs5SFBCVlprVnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q3liZXJ0cnVzdCBHbG9iYWwgUm9vdCBPPUN5YmVydHJ1c3QsIEluYwojIFN1YmplY3Q6IENOPUN5YmVydHJ1c3QgR2xvYmFsIFJvb3QgTz1DeWJlcnRydXN0LCBJbmMKIyBMYWJlbDogIkN5YmVydHJ1c3QgR2xvYmFsIFJvb3QiCiMgU2VyaWFsOiA0ODM1NzAzMjc4NDU5NjgyODc3NDg0MzYwCiMgTUQ1IEZpbmdlcnByaW50OiA3MjplNDo0YTo4NzplMzo2OTo0MDo4MDo3NzplYTpiYzplMzpmNDpmZjpmMDplMQojIFNIQTEgRmluZ2VycHJpbnQ6IDVmOjQzOmU1OmIxOmJmOmY4Ojc4OjhjOmFjOjFjOmM3OmNhOjRhOjlhOmM2OjIyOjJiOmNjOjM0OmM2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5NjowYTpkZjowMDo2MzplOTo2Mzo1Njo3NTowYzoyOTo2NTpkZDowYTowODo2NzpkYTowYjo5YzpiZDo2ZTo3Nzo3MTo0YTplYTpmYjoyMzo0OTphYjozOTozZDphMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRG9UQ0NBb21nQXdJQkFnSUxCQUFBQUFBQkQ0V3FMVWd3RFFZSktvWklodmNOQVFFRkJRQXdPekVZTUJZRwpBMVVFQ2hNUFEzbGlaWEowY25WemRDd2dTVzVqTVI4d0hRWURWUVFERXhaRGVXSmxjblJ5ZFhOMElFZHNiMkpoCmJDQlNiMjkwTUI0WERUQTJNVEl4TlRBNE1EQXdNRm9YRFRJeE1USXhOVEE0TURBd01Gb3dPekVZTUJZR0ExVUUKQ2hNUFEzbGlaWEowY25WemRDd2dTVzVqTVI4d0hRWURWUVFERXhaRGVXSmxjblJ5ZFhOMElFZHNiMkpoYkNCUwpiMjkwTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUErTWk4dlJSUVpoUC84Tk41CjdDUHl0eHJIam9YeEVuT21HYW9RMjV5aVpYUmFkejVSZlZiMjNDTzIxTzFmV0xFM1RkVkpEbTcxYW9mVzBvelMKSjhiaS96YWZtR1dnRTA3R0ttU2IxWkFTenhRRzlEdmoxQ2krNkE3NHEwNUlsRzJPbFRFUVhPMmlMYjNWT20yeQpITHRnd0VaTEFmVkpybjVHaXRCMGphRU1Bczd1L09lUHVHdG04MzlFQUw5bUpSUXIzUkF3SFFlV1AwMzJhN2lQCnQzc01wVGpyM2tmYjFWMDUvSWluODljcWRQSG9XcUk3bjFDNnBveEZOY0pRWlpYY1k0THYzYjkzVFp4aXlXTnoKRnRBcEQwbXBTUEN6cXJkc3hhY3dPVUJkcnNUaVhTWlQ4TTRjSXdoaHFKUVp1Z1JpUU93Zk9IQjNFZ1p4cHpBWQpYU1VucFFJREFRQUJvNEdsTUlHaU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvCk1CMEdBMVVkRGdRV0JCUzJDSHNOZXN5c0lFeUdWakplejZ0dWhTMXdWekEvQmdOVkhSOEVPREEyTURTZ01xQXcKaGk1b2RIUndPaTh2ZDNkM01pNXdkV0pzYVdNdGRISjFjM1F1WTI5dEwyTnliQzlqZEM5amRISnZiM1F1WTNKcwpNQjhHQTFVZEl3UVlNQmFBRkxZSWV3MTZ6S3dnVElaV01sN1BxMjZGTFhCWE1BMEdDU3FHU0liM0RRRUJCUVVBCkE0SUJBUUJXN3dvam9GUk9sWmZKK0luYVJjSFVvd0FsOUI4VHE3ZWpoVmhwd2pDdDJCV0tMZVBKellGYStITWoKV3FkOEJmUDlJanNPMFFiRTJ6Wk1jd1NPNWJBaTVNWHpMcVhaSStPNFRrb2dwMjRDSko4aVlHZDdpeDF5Q2NVeApYT2w1bjRCSFBhMmhDd2NVUFVmL0Eya2FEQXRFNTJNbHAzK3l5YmgyaE8wajluMEhxMFYrMDkrenYrbUt0czJvCm9tY3JVdFczWmZBNVRHT2drWG1UVWc5VTNZTzduOUdQcDFOenc4di9NT3g4QkxqWVJCK1RYM0VKSXJkdVB1b2MKQTA2ZEdpQmgrNEUzN0Y3OENrV3IxK2NYVmRDZzZtQ2JwdmJqakZzcHdnWmdGSjB0bDB5cGt4V2RZY1FCWDBqVwpXTDFXTVJKT0VjZ2g0TE1Sa1dYYnRLYUlPTTVWCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPUNodW5naHdhIFRlbGVjb20gQ28uLCBMdGQuIE9VPWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IE89Q2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4gT1U9ZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJlUEtJIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAyODk1NjA4ODY4MjczNTE4OTY1NTAzMDUyOTA1NzM1Mjc2MDQ3NwojIE1ENSBGaW5nZXJwcmludDogMWI6MmU6MDA6Y2E6MjY6MDY6OTA6M2Q6YWQ6ZmU6NmY6MTU6Njg6ZDM6NmI6YjMKIyBTSEExIEZpbmdlcnByaW50OiA2Nzo2NTowZDpmMTo3ZTo4ZTo3ZTo1Yjo4Mjo0MDphNDpmNDo1Njo0YjpjZjplMjozZDo2OTpjNjpmMAojIFNIQTI1NiBGaW5nZXJwcmludDogYzA6YTY6ZjQ6ZGM6NjM6YTI6NGI6ZmQ6Y2Y6NTQ6ZWY6MmE6NmE6MDg6MmE6MGE6NzI6ZGU6MzU6ODA6M2U6MmY6ZjU6ZmY6NTI6N2E6ZTU6ZDg6NzI6MDY6ZGY6ZDUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZzRENDQTVpZ0F3SUJBZ0lRRmNpOVpVZGNyN2lYQUY3a0J0SzhuVEFOQmdrcWhraUc5dzBCQVFVRkFEQmUKTVFzd0NRWURWUVFHRXdKVVZ6RWpNQ0VHQTFVRUNnd2FRMmgxYm1kb2QyRWdWR1ZzWldOdmJTQkRieTRzSUV4MApaQzR4S2pBb0JnTlZCQXNNSVdWUVMwa2dVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlCkZ3MHdOREV5TWpBd01qTXhNamRhRncwek5ERXlNakF3TWpNeE1qZGFNRjR4Q3pBSkJnTlZCQVlUQWxSWE1TTXcKSVFZRFZRUUtEQnBEYUhWdVoyaDNZU0JVWld4bFkyOXRJRU52TGl3Z1RIUmtMakVxTUNnR0ExVUVDd3doWlZCTApTU0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGCkFBT0NBZzhBTUlJQ0NnS0NBZ0VBNFNVUDdvM2JpRE4xWjgydEgzMDZUbTJkMHk4VTgyTjB5d0VoYWpmcWhGQUgKU3laYkNVTnNJWjVxeU5VRDlXQnBqOHp3SXVRZjUvZHFJakczTEJYeTRQNEFha1AvaDJYR3RSckJwMHh0SW5BaAppakh5bDNTSkNSSW1ISjdLMlJLaWxUemE2V2UvQ0tCazQ5WkN0MFh2bC9UMjlkZTFTaFVDV0gyWVdFdGd2TTNYCkRab1RNMVBSWWZsNjFkZDRzNW96OXdDR3poMU5sRGl2cU94NFVYQ0tYQkNEVVNIM0VUMDBobDdsU00yWGdZSTEKVEJuc1pmWnJ4UVdoN2tjVDFyTWhKNVFRQ3Rra083cStSQk5HTUQrWFBOalgxMnJ1T3pqaks5U1hEcmtiNXdkSgpmemNxK1hkNHoxVHRXMGFkbzRBT2tVUEIxbHRmRkxxZnBvMGtSMEJadjNJNHNqWnNOLytaMFYwT1dRcXJhZmZBCnNnUkZlbFFBcnI1VDlyWG40Zmc4b3pIU3FmNGhVbVRGcG1md2RRY0dsQlNCVmNZbjVBR1BGOEZxY2RlK1MvdVUKV0gxK0VUT3hRdmRpYkJqV3p3bG9QbjlzOWg2UFlxMmxZOXNKcHg4aVFrRWViNW1LUHRmNVAwQjZlYkNsQVpMUwpuVDBJRmFVUUFTMnpNbmFvbFEyemVwcjdCeEI0RVcvaGo4ZTZEeVVhZENybEhKaEJtZDhoaCtpVkJtb0tzMnBICmRtWDJPcytQWWhjWmV3b296UnJTZ3g0aHh5eS92djloYUxkbkc3dDRUWTNPWitYa3dZNjNJMmJpblpCMU5KaXAKTml1S21wUzVuZXpNaXJINEpZbGNXcll2akI5dGVTU25VbWpEaERYaVpvMWpEaVZOMVJteTVuazNweUtkVkRFQwpBd0VBQWFOcU1HZ3dIUVlEVlIwT0JCWUVGQjRNOTdabjh1R1NKZ2xGd0ZVNUxuYy9Ra3FpTUF3R0ExVWRFd1FGCk1BTUJBZjh3T1FZRVp5b0hBQVF4TUM4d0xRSUJBREFKQmdVckRnTUNHZ1VBTUFjR0JXY3FBd0FBQkJSRnNNTEgKQ2xaODdsdDRESlg1R0ZQQnBoellFREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBZ0VBQ2JPRFUxa0JQcFZKdWZHQgp1dmwySUNPMUoyQjAxR3FaTkY1c0FGUFpuL0ttc1NRSFJHb3F4cVdPZUJMb1I5bFlHeE1xWG5tYm53b3FaNllsClB3WnBWblBEaW1aSSt5bUJWM1FHeXB6cUtPZzRaeVlyOGRXMVAyV1QrRFpkam8yTlFDQ0hHZXJ2SjhBOXREa1AKSlh0b1VIUlZuQXhaZlZvOVFaUWxVZ2pnUnl3Vk1SblZ2d2RWeHJzU3RaZjBYNE9GdW5IQjJXeUJFWFlLQ3JDLwpncGYzNmozNit1d3RxU2lVTzFiZDBsRXVyc0M5Q0JXTWQxSTBsdGFick5NZGptRVBOWHVicmpscEMySmdRQ0EyCmo2LzdOdTR0Q0VvZHVMK2JYUGpxcFJ1Z2M2YlkrRzdnTXdSZmFLb25oKzNad1pDYzdiM2phald2WTkrckdObTYKNXVsSzZsQ0tEMkdUSHVJdEdlSXdsRFdTWFE2MkI2OFpnSTlIa0ZGTExrM2RoZUxTQ2xJS0Y1cjhHckJRQXVVQgpvMk0zSVV4RXhKdFJtUkVPYzV3R2oxUXVweWhlUkRtSFZpMDN2WVZFbE9FTVN5eWN3NUtGTkdITEQ3aWJTa05TCi9qUTZmYmpwS2R4MnFjZ3crQlJ4Z01ZZU5raDBJa0ZjaDRMb0dIR0xRWWxFNTM1WVc2aTRqUlBwcDJ6RFIrMnoKR3AxaXJvMkM2cFNlM1ZrUXc2M2Q0azNqTWRYSDdPanlzUDZTSGhZS0d2elo4L2dudHNtK0hiUnNaSkIvOU9URQpXOWMzcmtJTzNhUWFiM3lJVk1VV2J1RjZhQzc0T3I4TnBEeUpPM2luVG1PREJDRUlaNDN5Z2tuUVcvMnh6UStECmhOUStJSVgzU2owcm5QMHFDZ2xONm9INEVadz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89Y2VydFNJR04gT1U9Y2VydFNJR04gUk9PVCBDQQojIFN1YmplY3Q6IE89Y2VydFNJR04gT1U9Y2VydFNJR04gUk9PVCBDQQojIExhYmVsOiAiY2VydFNJR04gUk9PVCBDQSIKIyBTZXJpYWw6IDM1MjEwMjI3MjQ5MTU0CiMgTUQ1IEZpbmdlcnByaW50OiAxODo5ODpjMDpkNjplOTozYTpmYzpmOTpiMDpmNTowYzpmNzo0YjowMTo0NDoxNwojIFNIQTEgRmluZ2VycHJpbnQ6IGZhOmI3OmVlOjM2Ojk3OjI2OjYyOmZiOjJkOmIwOjJhOmY2OmJmOjAzOmZkOmU4OjdjOjRiOjJmOjliCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlYTphOTo2MjpjNDpmYTo0YTo2YjphZjplYjplNDoxNToxOTo2ZDozNToxYzpjZDo4ODo4ZDo0Zjo1MzpmMzpmYTo4YTplNjpkNzpjNDo2NjphOTo0ZTo2MDo0MjpiYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRE9EQ0NBaUNnQXdJQkFnSUdJQVlGRm5BQ01BMEdDU3FHU0liM0RRRUJCUVVBTURzeEN6QUpCZ05WQkFZVApBbEpQTVJFd0R3WURWUVFLRXdoalpYSjBVMGxIVGpFWk1CY0dBMVVFQ3hNUVkyVnlkRk5KUjA0Z1VrOVBWQ0JEClFUQWVGdzB3TmpBM01EUXhOekl3TURSYUZ3MHpNVEEzTURReE56SXdNRFJhTURzeEN6QUpCZ05WQkFZVEFsSlAKTVJFd0R3WURWUVFLRXdoalpYSjBVMGxIVGpFWk1CY0dBMVVFQ3hNUVkyVnlkRk5KUjA0Z1VrOVBWQ0JEUVRDQwpBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxjenVYN0lKVXFPdGR1MEtCdXFWNURvCjBTTFRaTHJUaytqVXJJWmhRR3BnVjJoVWhFMjhhbFFDQmYvZm01b3FybDBIajByREtIL3YreXY2ZWZISHJmQVEKVXlTUWkyYkpxSWlycjFxakFPbSt1a2J1VzNON0xCZUNnVjVpTEtFQ1piTzl4U3NBZnNUOEF6TlhEZTNpK3M1ZApSZFk0elRXMnNzSFFuSUZLcXVTeUFWd2RqMStaeExHdDI0Z2g2NUFJZ29Eek1LTkQ1cENDcmxVb1NlMWIxNmtRCk9BNytqMHhibTBicVFmV3dDSFREMElnenRuelhkTi9jaE5GRERuVTVvU1ZBS09wNHl3NHNMam1kakl0dUZod3YKSm9JUTR1TmxsQW9Fd0Y3M1hWdjRFT0xRdW5wTCs5NDNBQUFhV3lqajBweHpQaktIbUtISlVTL1gzcXd6czA4QwpBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQWNZd0hRWURWUjBPCkJCWUVGT0NNbTlzbFNiUHhmSWJXc2tLSEM5QnJvTm5rTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFBKzBoeUoKTGpYOCtIWGQ1bjlsaVBSeVRNa3MxekpPODkwWmVVZTlqanRia3c5UVNTUVRheFFHY3U4SjA2R2g0MENFeWVjWQpNblE4U0c0UG4wdlU5eDdUazRaa1ZKZGpjbERWVmMvNklKTUNvcHZESTVOT0ZsVjJvSEI1YmMwaEg4OHZMYndaCjQ0Z3grRmthZ1FuSWw2WjB4MkRFVzh4WGpySjEvUnNDQ2R0WmIzS1RhZmN4UWRhSU9MK0hzcjBXZWZtcTVMNkkKSmQxaEp5TWN0VEVIQkRhMEdwQzlvSFJ4VUlsdHZCVGpENGF1OGFzK3g2QUp6S05JMGVEYlpPZVN0Yyt2Y2tOdwppL25EaER3VHFuNlNtMWRUay9wd3dwRU9NZm1iWjEzcGxqaGVYN056VG9nVlo5NmVkaEJpSUw1VmFaVkRBRGxOCjl1NndXazVKUkZSWVgwS0QKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyBPPUdlb1RydXN0IEluYy4gT1U9KGMpIDIwMDggR2VvVHJ1c3QgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIE89R2VvVHJ1c3QgSW5jLiBPVT0oYykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIkdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyIKIyBTZXJpYWw6IDI4ODA5MTA1NzY5OTI4NTY0MzEzOTg0MDg1MjA5OTc1ODg1NTk5CiMgTUQ1IEZpbmdlcnByaW50OiBiNTplODozNDozNjpjOToxMDo0NDo1ODo0ODo3MDo2ZDoyZTo4MzpkNDpiODowNQojIFNIQTEgRmluZ2VycHJpbnQ6IDAzOjllOmVkOmI4OjBiOmU3OmEwOjNjOjY5OjUzOjg5OjNiOjIwOmQyOmQ5OjMyOjNhOjRjOjJhOmZkCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiNDo3ODpiODoxMjoyNTowZDpmODo3ODo2Mzo1YzoyYTphNzplYzo3ZDoxNTo1ZTphYTo2Mjo1ZTplODoyOToxNjplMjpjZDoyOTo0Mzo2MTo4ODo2YzpkMTpmYjpkNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRC9qQ0NBdWFnQXdJQkFnSVFGYXh1bEJteWVVdEI5aWVwd3hnUEh6QU5CZ2txaGtpRzl3MEJBUXNGQURDQgptREVMTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVZGxiMVJ5ZFhOMElFbHVZeTR4T1RBM0JnTlZCQXNUCk1DaGpLU0F5TURBNElFZGxiMVJ5ZFhOMElFbHVZeTRnTFNCR2IzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXMKZVRFMk1EUUdBMVVFQXhNdFIyVnZWSEoxYzNRZ1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodgpjbWwwZVNBdElFY3pNQjRYRFRBNE1EUXdNakF3TURBd01Gb1hEVE0zTVRJd01USXpOVGsxT1Zvd2daZ3hDekFKCkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUhaVzlVY25WemRDQkpibU11TVRrd053WURWUVFMRXpBb1l5a2cKTWpBd09DQkhaVzlVY25WemRDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4TmpBMApCZ05WQkFNVExVZGxiMVJ5ZFhOMElGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnCkxTQkhNekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOemlYbUpZSFROWE9USXoKK3V2TGg0eW4xRXJkQm9qcVpJNHhtS1U0a0I2WXp5NWpLL0JHdkVTeWlhSEFLQXhKY0NHVm4yVEFwcE1TQW1VbQpoc2FsaWZENjE0U2djSzlQR3BjL0JrVFZ5ZXR5RUgza01TajdIR0htS0FkRWM1SWlhYWNEaUd5ZFk4aFMycGduCjV3aE1jRDYweVJMQnhXZURYVFB6QXhIc2F0QlQ0dEc2Tm1DVWdMdGhZMnhiRjM3ZlFKUWVxdzNDSVNod2lQL1cKSm14c1lBUWxUbFYrZmUrL2xFamV0eDNkY0kwRlg0aWxtL0xDN3VyUlFFRnRZamdkVmdiRkEwZFJJQm44ZXhBTApEbUt1ZGxXL1gzZStQa2tCVXoyWUpRTjJKRm9kdE51SjZubmx0ck03UDdwTUtFRi9CcXhxanNIUTlnVWRmZVpDCmh1T2wxVWNDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXcKSFFZRFZSME9CQllFRk1SNXlvNmhUZ01kSE54cjJ6RmJsRDQvTUg4dE1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQgpBUUF0eFJQUFZvQjdlbmk5bjY0c21lZnYydCtVWGdscHArZHVhSXk5Y3I1SHFRNlhFcmhLOFdUVE9kOGxOTlRCCnpVNkI4QThFeENTek5KYkdwcW93MzJoaGM5ZjVqb1dKN3c1ZWxTaEtLaWVQRUk0dWZJYkVBcDdhREhkbERrUU4Ka3YzOXN4WTIraEVOSFl3T0I0bHFLVmIzY3ZUZEZaeDNOV1pYcXhOVDJJN0JRTVhYRXhaYWNzZTNhUUhFZXJHRApBV2g5alVHaGxCakJKVno4OFA2REFvZDhEUTNQTGdoY1NrQU5QdXlCWWVZazI4cmdEaTBIc2o1VzNJMzFRWVVIClNKc01DOHRKUDMzc3QvM0xqV2VKR3F2dHV4NmpBQWdJRnlxQ1hERmRSb290RDRhYmRObEYrOVJBc1hxcWFDMkcKc3BraTRjRXJ4NXo0ODErb2doTHJHUkV0Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj10aGF3dGUgUHJpbWFyeSBSb290IENBIC0gRzIgTz10aGF3dGUsIEluYy4gT1U9KGMpIDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj10aGF3dGUgUHJpbWFyeSBSb290IENBIC0gRzIgTz10aGF3dGUsIEluYy4gT1U9KGMpIDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogInRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMiIKIyBTZXJpYWw6IDcxNzU4MzIwNjcyODI1NDEwMDIwNjYxNjIxMDg1MjU2NDcyNDA2CiMgTUQ1IEZpbmdlcnByaW50OiA3NDo5ZDplYTo2MDoyNDpjNDpmZDoyMjo1MzozZTpjYzozYTo3MjpkOToyOTo0ZgojIFNIQTEgRmluZ2VycHJpbnQ6IGFhOmRiOmJjOjIyOjIzOjhmOmM0OjAxOmExOjI3OmJiOjM4OmRkOmY0OjFkOmRiOjA4OjllOmYwOjEyCiMgU0hBMjU2IEZpbmdlcnByaW50OiBhNDozMTowZDo1MDphZjoxODphNjo0NDo3MTo5MDozNzoyYTo4NjphZjphZjo4Yjo5NToxZjpmYjo0MzoxZDo4Mzo3ZjoxZTo1Njo4ODpiNDo1OTo3MTplZDoxNTo1NwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2lEQ0NBZzJnQXdJQkFnSVFOZndtWE5tRVQ4azlKajFYbTY3WFZqQUtCZ2dxaGtqT1BRUURBekNCaERFTApNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREhSb1lYZDBaU3dnU1c1akxqRTRNRFlHQTFVRUN4TXZLR01wCklESXdNRGNnZEdoaGQzUmxMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreEpEQWkKQmdOVkJBTVRHM1JvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnUTBFZ0xTQkhNakFlRncwd056RXhNRFV3TURBdwpNREJhRncwek9EQXhNVGd5TXpVNU5UbGFNSUdFTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1kR2hoCmQzUmxMQ0JKYm1NdU1UZ3dOZ1lEVlFRTEV5OG9ZeWtnTWpBd055QjBhR0YzZEdVc0lFbHVZeTRnTFNCR2IzSWcKWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFa01DSUdBMVVFQXhNYmRHaGhkM1JsSUZCeWFXMWhjbmtnVW05dgpkQ0JEUVNBdElFY3lNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRW90V2NnbnVWbmZGU2VJZitpaGEvCkJlYmZvd0pQRFFmR0FGRzZEQUpTTFNLa1FqbkUvby9xeWNHKzFFMy9uM3FlNHJGOG1xMm5oZ2x6aDlIbm11TjYKcGFwdSs3cXpjTUJuaUtJMTFLT2FzZjJ0d3U4eCtxaTU4L3NJeHBIUit5bVZvMEl3UURBUEJnTlZIUk1CQWY4RQpCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVW10Z0FNQURuYTMrRkdPNkx0czZLCkRQZ1I0YnN3Q2dZSUtvWkl6ajBFQXdNRGFRQXdaZ0l4QU4zNDRGZEhXNmZtQ3NPOTlZQ0tselVORzRrOFZJWjMKS01xaDlIbmV0ZVk0c1BCbGNJeC9BbFRDdi8vWW9UN1p6d0l4QU1TTmxQemNVOUxjblhnV0h4VXpJMU5TNDFveApYWjNLcnIwVEtVUU5KMXVvNTJpY0V2ZFlQeTV5QWxlamo2RVVMZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj10aGF3dGUgUHJpbWFyeSBSb290IENBIC0gRzMgTz10aGF3dGUsIEluYy4gT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbi8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPXRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMyBPPXRoYXd0ZSwgSW5jLiBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLyhjKSAyMDA4IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJ0aGF3dGUgUHJpbWFyeSBSb290IENBIC0gRzMiCiMgU2VyaWFsOiAxMjc2MTQxNTcwNTY2ODEyOTk4MDU1NTY0NzYyNzU5OTU0MTQ3NzkKIyBNRDUgRmluZ2VycHJpbnQ6IGZiOjFiOjVkOjQzOjhhOjk0OmNkOjQ0OmM2Ojc2OmYyOjQzOjRiOjQ3OmU3OjMxCiMgU0hBMSBGaW5nZXJwcmludDogZjE6OGI6NTM6OGQ6MWI6ZTk6MDM6YjY6YTY6ZjA6NTY6NDM6NWI6MTc6MTU6ODk6Y2E6ZjM6NmI6ZjIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDRiOjAzOmY0OjU4OjA3OmFkOjcwOmYyOjFiOmZjOjJjOmFlOjcxOmM5OmZkOmU0OjYwOjRjOjA2OjRjOmY1OmZmOmI2Ojg2OmJhOmU1OmRiOmFhOmQ3OmZkOmQzOjRjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFS2pDQ0F4S2dBd0lCQWdJUVlBR1h0MGFuNnJTMG10WkxML2VRK3pBTkJna3Foa2lHOXcwQkFRc0ZBRENCCnJqRUxNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREhSb1lYZDBaU3dnU1c1akxqRW9NQ1lHQTFVRUN4TWYKUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObGN5QkVhWFpwYzJsdmJqRTRNRFlHQTFVRUN4TXZLR01wSURJdwpNRGdnZEdoaGQzUmxMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreEpEQWlCZ05WCkJBTVRHM1JvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnUTBFZ0xTQkhNekFlRncwd09EQTBNREl3TURBd01EQmEKRncwek56RXlNREV5TXpVNU5UbGFNSUd1TVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1kR2hoZDNSbApMQ0JKYm1NdU1TZ3dKZ1lEVlFRTEV4OURaWEowYVdacFkyRjBhVzl1SUZObGNuWnBZMlZ6SUVScGRtbHphVzl1Ck1UZ3dOZ1lEVlFRTEV5OG9ZeWtnTWpBd09DQjBhR0YzZEdVc0lFbHVZeTRnTFNCR2IzSWdZWFYwYUc5eWFYcGwKWkNCMWMyVWdiMjVzZVRFa01DSUdBMVVFQXhNYmRHaGhkM1JsSUZCeWFXMWhjbmtnVW05dmRDQkRRU0F0SUVjegpNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXNyOG5MUHZiMkZ2ZGVIc2JubmRtCmdjcyt2SHl1ODZZbm1qU2phREZ4T0ROaTVQTnhabm14cVdXanBZdlZqMkF0UDBMTXFtc3l3Q1BMTEVIZDVOLzgKWVp6aWM3SWlsUkZER0YvRXRoOVhiQW9GV0NMSU5rdzZmS1hSejRhdmlLZEVBaE4wY1hNS1Fsa0MrQnNVYTBMZgpiMSs2YTRLaW5Wdm5TcjBlQVhMYlMzVG9PMzkvZlI4RXRDYWI0TFJhckVjOVZialhzQ1pTS0FFeFFHYlkyU1M5Cjlpclk3Q0ZKWEp2MmV1bC9WVFYrbG11Tms1TW55NUs3NnF4QXdKL0MrSURQWGZSYTNNNTBocVkrYkF0VHlyMlMKemhrR2N1WU1YRGhweHdUV3ZHek9XL2IzYUp6Y0pSVklpS0hwcWZpWW5PRHoxVEVvWVJGc1o1YU5PWm5Md2tVawpPUUlEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WCkhRNEVGZ1FVcld5cWxHQ2M3ZVQvK2o0S2RDdGpBL2UyV2I4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFCcEEKMkpWbHJBbVNpY1k1OUJEbHFRNW1VMTE0M3Zva2tidm5SRkhmeGhZMEN1OXFSRkhxS3dlS0EzckQ2ejhLTEZJVwpvQ3REdVNXUVAzQ3BNeVZ0UlJvb095ZlBxc01wUWh2Zk8wekFNelJiUVlpL2F5dGxyeWp2c3ZYRHFtYk9lMWJ1CnQ4akxaOEhKbkJvWXVNVERTUVB4WUE1UXpVYkY4M2Q1OTdZVjREamJ4eThvb0F3L2R5WjAyU1VTMmpIYUdoN2MKS1VHUklqeHBwN3NDOHJaY0p3T0o5QWJxbStSeWd1T2hDY0hwQUJuVFB0UndhN3B4cHFwWXJ2Uzc2V3kyNzRmTQptN3YvT2VaV1lkTUtwOFJjVEdCN0JYY21lci9ZQjFJc1l2ZHdZOWs1dkc4Y3dubmNkaW12enNVc1pBUmVpRFp1Ck1kUkFHbUkwTmo4MUFhNnNZNkE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIgTz1HZW9UcnVzdCBJbmMuIE9VPShjKSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiBPPUdlb1RydXN0IEluYy4gT1U9KGMpIDIwMDcgR2VvVHJ1c3QgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJHZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIiCiMgU2VyaWFsOiA4MDY4Mjg2MzIwMzM4MTA2NTc4MjE3NzkwODc1MTc5NDYxOTI0MwojIE1ENSBGaW5nZXJwcmludDogMDE6NWU6ZDg6NmI6YmQ6NmY6M2Q6OGU6YTE6MzE6Zjg6MTI6ZTA6OTg6NzM6NmEKIyBTSEExIEZpbmdlcnByaW50OiA4ZDoxNzo4NDpkNTozNzpmMzowMzo3ZDplYzo3MDpmZTo1Nzo4Yjo1MTo5YTo5OTplNjoxMDpkNzpiMAojIFNIQTI1NiBGaW5nZXJwcmludDogNWU6ZGI6N2E6YzQ6M2I6ODI6YTA6NmE6ODc6NjE6ZTg6ZDc6YmU6NDk6Nzk6ZWI6ZjI6NjE6MWY6N2Q6ZDc6OWI6Zjk6MWM6MWM6NmI6NTY6NmE6MjE6OWU6ZDc6NjYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNyakNDQWpXZ0F3SUJBZ0lRUExMMFNBb0E0djdySkR0ZVlEN0RhekFLQmdncWhrak9QUVFEQXpDQm1ERUwKTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVZGxiMVJ5ZFhOMElFbHVZeTR4T1RBM0JnTlZCQXNUTUNoagpLU0F5TURBM0lFZGxiMVJ5ZFhOMElFbHVZeTRnTFNCR2IzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEUyCk1EUUdBMVVFQXhNdFIyVnZWSEoxYzNRZ1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDAKZVNBdElFY3lNQjRYRFRBM01URXdOVEF3TURBd01Gb1hEVE00TURFeE9ESXpOVGsxT1Zvd2daZ3hDekFKQmdOVgpCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUhaVzlVY25WemRDQkpibU11TVRrd053WURWUVFMRXpBb1l5a2dNakF3Ck55QkhaVzlVY25WemRDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4TmpBMEJnTlYKQkFNVExVZGxiMVJ5ZFhOMElGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnTFNCSApNakIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJCV3g2UDBERlVQbHJPdUhOeEZpNzlLRE5sSjlSVmNMClNvMTdWRHM2Ymw4VkFzQlFwczhsTDMzS1NMakhVR01jS2lFSWZKbzIyQXYrMFNiRldERXdLQ1h6WFYyanVMYWwKdEpMdGJDeWY2OTFEaWFJOFMwaVJIVkRzSnQvV1lDNjlJYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTwpCZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZCVmZOVmRSVmZzbHNxMERhZndCby9xK0VWWFZNQW9HCkNDcUdTTTQ5QkFNREEyY0FNR1FDTUdTV1dhYm9DZDZMdXZwYWlJandINUhUUnFqeVNrd0NZL3RzWHpqYkxrR1QKcVE3bW5kd3hITEtncHhnY2VlSEhOZ0l3T2xhdm1uUnM5dnVENERQVENGK2huTUpibjBiV3RzdVJCbU9pQnVjegpyRDZvZ1JMUXk3clFrZ3UybnBhcUJBK0sKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049VmVyaVNpZ24gVW5pdmVyc2FsIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIlZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogODUyMDk1NzQ3MzQwODQ1ODE5MTc3NjM3NTI2NDQwMzE3MjY4NzcKIyBNRDUgRmluZ2VycHJpbnQ6IDhlOmFkOmI1OjAxOmFhOjRkOjgxOmU0OjhjOjFkOmQxOmUxOjE0OjAwOjk1OjE5CiMgU0hBMSBGaW5nZXJwcmludDogMzY6Nzk6Y2E6MzU6NjY6ODc6NzI6MzA6NGQ6MzA6YTU6ZmI6ODc6M2I6MGY6YTc6N2I6Yjc6MGQ6NTQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDIzOjk5OjU2OjExOjI3OmE1OjcxOjI1OmRlOjhjOmVmOmVhOjYxOjBkOmRmOjJmOmEwOjc4OmI1OmM4OjA2OjdmOjRlOjgyOjgyOjkwOmJmOmI4OjYwOmU4OjRiOjNjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFdVRDQ0E2R2dBd0lCQWdJUVFCckVaQ0d6RXlFRERydmtFaHJGSFRBTkJna3Foa2lHOXcwQkFRc0ZBRENCCnZURUxNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUwKRXhaV1pYSnBVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdPQ0JXWlhKcApVMmxuYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNVGd3TmdZRFZRUURFeTlXClpYSnBVMmxuYmlCVmJtbDJaWEp6WVd3Z1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWUKRncwd09EQTBNREl3TURBd01EQmFGdzB6TnpFeU1ERXlNelU1TlRsYU1JRzlNUXN3Q1FZRFZRUUdFd0pWVXpFWApNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eEh6QWRCZ05WQkFzVEZsWmxjbWxUYVdkdUlGUnlkWE4wCklFNWxkSGR2Y21zeE9qQTRCZ05WQkFzVE1TaGpLU0F5TURBNElGWmxjbWxUYVdkdUxDQkpibU11SUMwZ1JtOXkKSUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreE9EQTJCZ05WQkFNVEwxWmxjbWxUYVdkdUlGVnVhWFpsY25OaApiQ0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGCkFBT0NBUThBTUlJQkNnS0NBUUVBeDJFM1hyRUJOTnRpMXhXYi8xaGFqQ01qMW1DT2tkZVFtSU42NWxnWk9JekYKOXVWa2hiU2ljZnZ0dmJuYXpVMEF0TWd0YzZYSGFYR1ZIems4c2tRSG5PZ08razFLeENIZktXR1BNaUpoZ3NXSApIMjZNZkY4V0lGRkUwWEJQVityakhPUE1lZTVZMkE3Q3MwV1R3Q3pubWhjcmV3QTNla0V6ZU9FejR2TVFHbitICkxMNzI5ZmRDNHVXL2gyS0pYd0JMMzhYZDVIVkVNa0U2SG5GdWFjc0xkVVlJMGNyU0s1WFF6L3U1UUd0a2pGZE4KL0JNUmVZVHRYbFQyTko4SUFmTVFKUVlYU3RyeEhYcG1hNWhnWnFUWjc5SXVndkh3N3ducVJNa1ZhdUlEYmpQVApySjlWQU1mMkNHcVV1Vi9jNERQeGhHRDVXeWNSdFB3VzhydFdhb0FsalFJREFRQUJvNEd5TUlHdk1BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01HMEdDQ3NHQVFVRkJ3RU1CR0V3WDZGZG9Gc3cKV1RCWE1GVVdDV2x0WVdkbEwyZHBaakFoTUI4d0J3WUZLdzREQWhvRUZJL2wweHFHckkyT2E4UFBnR3JVU0JncwpleGt1TUNVV0kyaDBkSEE2THk5c2IyZHZMblpsY21semFXZHVMbU52YlM5MmMyeHZaMjh1WjJsbU1CMEdBMVVkCkRnUVdCQlMyZC9wcFNFZWZVeExWd3VvSE1uWUgwWmNIR1RBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQVN2ajQKc0FQbUxHZDc1SlIzWTh4dVRQbDlEZzNjeUxrMXVYQlBZL29rK215RGpFZWRPMlB6bXZsMk1wV1JzWGU4ckpxKwpzZVF4SWNhQmxWWmFEckhDMUxHbVdhenhZOHU0VEIxWmtFcnZrQllvSDFxdUVQdUJVRGdNYk16eFBjUDFZK096CjR5SEpKRG5wL1JWbVJ2UWJFZEJOYzZOOVJ2azk3YWhmWXRUeFAvamdkRmNyR0oyQnRNUW8ycFNYcFhEcnJCMisKQnhIdzFkdmQ1WXp3MVRLd2crWlg0bysvdnFHcXZ6MGR0ZFE0NnRld1hEcFBhaitQd0dac1k2cnAyYVFXOUlIUgpsUlFPZmMyVk5OblNqM0J6Z1h1Y2ZyMllZZGhGaDVpUXhldUdNTVkxdi9EL3cxV0lnMHZ2QlpJR2NmSzRtSk8zCjdNMkNZZkU0NWsrWG1DcGFqUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAyMDA3IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAyMDA3IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIlZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNCIKIyBTZXJpYWw6IDYzMTQzNDg0MzQ4MTUzNTA2NjY1MzExOTg1NTAxNDU4NjQwMDUxCiMgTUQ1IEZpbmdlcnByaW50OiAzYTo1MjplMTplNzpmZDo2ZjozYTplMzo2ZjpmMzo2Zjo5OToxYjpmOToyMjo0MQojIFNIQTEgRmluZ2VycHJpbnQ6IDIyOmQ1OmQ4OmRmOjhmOjAyOjMxOmQxOjhkOmY3OjlkOmI3OmNmOjhhOjJkOjY0OmM5OjNmOjZjOjNhCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2OTpkZDpkNzplYTo5MDpiYjo1NzpjOTozZToxMzo1ZDpjODo1ZTphNjpmYzpkNTo0ODowYjo2MDozMjozOTpiZDpjNDo1NDpmYzo3NTo4YjoyYToyNjpjZjo3Zjo3OQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGhEQ0NBd3FnQXdJQkFnSVFMNEQrSTR3T0lnOUlaeElva1llc3N6QUtCZ2dxaGtqT1BRUURBekNCeWpFTApNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUxFeFpXClpYSnBVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOeUJXWlhKcFUybG4KYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNVVV3UXdZRFZRUURFenhXWlhKcApVMmxuYmlCRGJHRnpjeUF6SUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5CmFYUjVJQzBnUnpRd0hoY05NRGN4TVRBMU1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCeWpFTE1Ba0cKQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUxFeFpXWlhKcApVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOeUJXWlhKcFUybG5iaXdnClNXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNVVV3UXdZRFZRUURFenhXWlhKcFUybG4KYmlCRGJHRnpjeUF6SUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNQpJQzBnUnpRd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVNuVm5wOFV0cGttdzR0WE5oZXJKSTkvZ0htCkdVbzlGQU5MK21BbklObURpV242Vk1hYUdGNVZLbVRlQnZhTlNqdXRFRHhsUFpDSUJJbmdNR0d6cmwwQnAzdmUKZkxLK3ltVmhBSWF1Mm85NzBJbXRUUjFabWtHeHZFZUEzSjVpdy9tamdiSXdnYTh3RHdZRFZSMFRBUUgvQkFVdwpBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3YlFZSUt3WUJCUVVIQVF3RVlUQmZvVjJnV3pCWk1GY3dWUllKCmFXMWhaMlV2WjJsbU1DRXdIekFIQmdVckRnTUNHZ1FVaitYVEdvYXNqWTVydzgrQWF0UklHQ3g3R1M0d0pSWWoKYUhSMGNEb3ZMMnh2WjI4dWRtVnlhWE5wWjI0dVkyOXRMM1p6Ykc5bmJ5NW5hV1l3SFFZRFZSME9CQllFRkxNVwprZjN1cG03a3RTNUpqNGQ0Z1lEczViRzFNQW9HQ0NxR1NNNDlCQU1EQTJnQU1HVUNNR1loREJnbVlGbzRlMVpDCjRLZjhOb1JSa1NBc2RrMURQY1FkaENQUXJOWjhOUWJPeldtOWtBM2JiRWhDSFE2cVFnSXhBSnc5U0Rrak9WZ2EKRlJKWmFwN3YxVm15SFZJc21YSE54eW5mR3lwaGUzSFIzdlBBNVEwNlNxb3RwOWlHS3QwdUVBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEZcdTAxNTF0YW5ceGZhc1x4ZWR0dlx4ZTFueSBPPU5ldExvY2sgS2Z0LiBPVT1UYW5ceGZhc1x4ZWR0dlx4ZTFueWtpYWRceGYzayAoQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcykKIyBTdWJqZWN0OiBDTj1OZXRMb2NrIEFyYW55IChDbGFzcyBHb2xkKSBGXHUwMTUxdGFuXHhmYXNceGVkdHZceGUxbnkgTz1OZXRMb2NrIEtmdC4gT1U9VGFuXHhmYXNceGVkdHZceGUxbnlraWFkXHhmM2sgKENlcnRpZmljYXRpb24gU2VydmljZXMpCiMgTGFiZWw6ICJOZXRMb2NrIEFyYW55IChDbGFzcyBHb2xkKSBGXHUwMTUxdGFuXHhmYXNceGVkdHZceGUxbnkiCiMgU2VyaWFsOiA4MDU0NDI3NDg0MTYxNgojIE1ENSBGaW5nZXJwcmludDogYzU6YTE6Yjc6ZmY6NzM6ZGQ6ZDY6ZDc6MzQ6MzI6MTg6ZGY6ZmM6M2M6YWQ6ODgKIyBTSEExIEZpbmdlcnByaW50OiAwNjowODozZjo1OTozZjoxNTphMTowNDphMDo2OTphNDo2YjphOTowMzpkMDowNjpiNzo5NzowOTo5MQojIFNIQTI1NiBGaW5nZXJwcmludDogNmM6NjE6ZGE6YzM6YTI6ZGU6ZjA6MzE6NTA6NmI6ZTA6MzY6ZDI6YTY6ZmU6NDA6MTk6OTQ6ZmI6ZDE6M2Q6Zjk6Yzg6ZDQ6NjY6NTk6OTI6NzQ6YzQ6NDY6ZWM6OTgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVGVENDQXYyZ0F3SUJBZ0lHU1VFczVBQVFNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR25NUXN3Q1FZRFZRUUcKRXdKSVZURVJNQThHQTFVRUJ3d0lRblZrWVhCbGMzUXhGVEFUQmdOVkJBb01ERTVsZEV4dlkyc2dTMlowTGpFMwpNRFVHQTFVRUN3d3VWR0Z1dzdwenc2MTBkc09oYm5scmFXRmt3N05ySUNoRFpYSjBhV1pwWTJGMGFXOXVJRk5sCmNuWnBZMlZ6S1RFMU1ETUdBMVVFQXd3c1RtVjBURzlqYXlCQmNtRnVlU0FvUTJ4aGMzTWdSMjlzWkNrZ1JzV1IKZEdGdXc3cHp3NjEwZHNPaGJua3dIaGNOTURneE1qRXhNVFV3T0RJeFdoY05Namd4TWpBMk1UVXdPREl4V2pDQgpwekVMTUFrR0ExVUVCaE1DU0ZVeEVUQVBCZ05WQkFjTUNFSjFaR0Z3WlhOME1SVXdFd1lEVlFRS0RBeE9aWFJNCmIyTnJJRXRtZEM0eE56QTFCZ05WQkFzTUxsUmhic082YzhPdGRIYkRvVzU1YTJsaFpNT3pheUFvUTJWeWRHbG0KYVdOaGRHbHZiaUJUWlhKMmFXTmxjeWt4TlRBekJnTlZCQU1NTEU1bGRFeHZZMnNnUVhKaGJua2dLRU5zWVhOegpJRWR2YkdRcElFYkZrWFJoYnNPNmM4T3RkSGJEb1c1NU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBCk1JSUJDZ0tDQVFFQXhDUmVjNzVMYlJURG9mVGpsNUJ1MGpCRkhqenVaOWxrNEJxS2Y4b3d5b1BqSU1IajlEclQKbEY4YWZGdHR2ekJQaENmMm54OUp2TWFaQ3BEeUQvVi9RNFEzWTFHTGVxVncvSHBZelk2YjdjTkdiSVJ3WGRyegpBWkFqL0U0d3FYN2hKMlBuN1dROG9MakpNMlArRnBEL3NMajkxNmpBd0pSREM3YlZXYWFlVnRBa0gzQjVyOXM1ClZBMWxkZGtWUVpRQnIxN3M5bzN4LzYxay9pQ2ExMXpyL3FZZkNHU2ppM1pWclI0N0tHQXVoeVhvcXE4ZnhtUkcKSUxkd2Z6emVTTnVXVTdjNWQrUWE0c2NXaEhhWFd5KzdHUldGK0dtRjlabW5xZkkwcDZtMnBnUDhiNFk5Vkh4MgpCSnRyK1VCZEFEVEhMcGwxbmVXSUE2cE4rQVBTUW5iQUd3SURBS2lMbzBVd1F6QVNCZ05WSFJNQkFmOEVDREFHCkFRSC9BZ0VFTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVelBwbmsvQzJ1TkNsd0I3elUvMk0KVTkrRDE1WXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS3QvN2h3V3FadzhVUUNnd0JFSUJhZVo1bThCaUZSaApidkc1R0sxS3JmNkJRQ09VTC90MWZDOG9TMklrZ1lJTDlXSHhIRzY0WVRqcmdmcGlvVHRhWXRPVVpjVGg1bTJDCitDOGxjTEloSnNGeVVSK01MTU9Fa01OYWo3clA5S2RscGV1WTBmc0Zza1oxRlNOcWI0VmpNSUR3MVo0ZktSekMKYkxCUVdWMlFXenVvRFREUHYzMS96dkdkZzczSlJtNGdwdmxoVWJvaEwzdStwUlZqb2RTVmgvR2V1Zk9KOHoyRgp1TGpidnJXNUtmbmFOd1VBU1pRRGhFVG52ME14ejNXTEpkSDBwbVQxa3ZhckJlczk2YVVMTm1MYXpBWmZOb3UyClhqRzRLdnRlOW5IZlJDYWV4T1lOa2JRdWRaV0FVV3BMTUthd1lxR1Q4WnZZenNSamRUOVpSN0U9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgU3ViamVjdDogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMiBPPVN0YWF0IGRlciBOZWRlcmxhbmRlbgojIExhYmVsOiAiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMiIKIyBTZXJpYWw6IDEwMDAwMDEyCiMgTUQ1IEZpbmdlcnByaW50OiA3YzphNTowZjpmODo1Yjo5YTo3ZDo2ZDozMDphZTo1NDo1YTplMzo0MjphMjo4YQojIFNIQTEgRmluZ2VycHJpbnQ6IDU5OmFmOjgyOjc5OjkxOjg2OmM3OmI0Ojc1OjA3OmNiOmNmOjAzOjU3OjQ2OmViOjA0OmRkOmI3OjE2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA2Njo4Yzo4Mzo5NDo3ZDphNjozYjo3Mjo0YjplYzplMTo3NDozYzozMTphMDplNjphZTpkMDpkYjo4ZTpjNTpiMzoxYjplMzo3NzpiYjo3ODo0Zjo5MTpiNjo3MTo2ZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnlqQ0NBN0tnQXdJQkFnSUVBSmlXakRBTkJna3Foa2lHOXcwQkFRc0ZBREJhTVFzd0NRWURWUVFHRXdKTwpUREVlTUJ3R0ExVUVDZ3dWVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdU1Tc3dLUVlEVlFRRERDSlRkR0ZoCmRDQmtaWElnVG1Wa1pYSnNZVzVrWlc0Z1VtOXZkQ0JEUVNBdElFY3lNQjRYRFRBNE1ETXlOakV4TVRneE4xb1gKRFRJd01ETXlOVEV4TURNeE1Gb3dXakVMTUFrR0ExVUVCaE1DVGt3eEhqQWNCZ05WQkFvTUZWTjBZV0YwSUdSbApjaUJPWldSbGNteGhibVJsYmpFck1Da0dBMVVFQXd3aVUzUmhZWFFnWkdWeUlFNWxaR1Z5YkdGdVpHVnVJRkp2CmIzUWdRMEVnTFNCSE1qQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU1WWjUyOTEKcWo1TG5MVzRySjRMNVBuWnlxdGRqN1U1RUlMWHIxSGdPK0VBU0dyUDJ1RUdReEdacWhRbEVxMGk2QUJ0UThTcAp1T1VmaVV0bnZXRkk3LzNTNEdDSTVia1lZQ2pEZHl1dHNEZXFOOTVrV1NwR1YrUkx1ZmczZk5VMjU0REJ0dlBVClo1dVc2TTdYeGdwVDBHdEpsdk9qQ3dWM1NQY2w1WENzTUJRZ0plTi9kVnJsU1BoT2V3TUhCUHFDWVlkdThEdkUKcE1mUTlYUStwVjBhQ1BLYkpkTDJyQVFtUGxVNllpaWxlN0l3ci9nM3d0RzYxamo5OU85Sk1EZVpKaUZJaFFHcAo1UmJuM0pCVjN3L29PTTJaTnlGUFhmVWliMnJGRWhaZ0YxWHlaV2FtcHpDUk9NRTRIWVlFaExvYUpYaGVuYS9NClVHRFdFNGRTN1dNZmJXVjl3aFVZZE1yaGZtUXBqSExZRmhOOUMwbEs4U2diSUhScnhUM2RzS3BJQ1QwdWdwVE4KR21YWks0aWFtYndZZnAvdWZXWjhQcjJVdUlIT3paZ3dlTUZ2WjlDK1grQm83ZDdpc2Nrc1dYaVNxdDhyWUdQeQo1VjY1NDhyNmYxQ0dQcUkwR0F3SmFDZ1JIT1RodVZ3K1I3b3lQeGpNVzRUMTgydDB4SEowNGVPTG9FcTlqV1l2CjZxMDEyaURUaUlKaDhCSWl0cnpRMWFUc3IxU0lKU1E4cDIyeGNpay9QbGVtZjFXdmJpYkcvdWZNUUZ4UlJJRUsKZU41S3psVy9IZFhadDFidjhIYi9DM20xcjczN3FXbVJScGRvZ0JRMkhiTi91eW1ZTnFVZytvSmdZak9rN05hNgpCNmR1eGM4VXB1ZldralRZZ2ZYOEhWMnFYQjcybzAwN3VQYzVBZ01CQUFHamdaY3dnWlF3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pCU0JnTlZIU0FFU3pCSk1FY0dCRlVkSUFBd1B6QTlCZ2dyQmdFRkJRY0NBUll4YUhSMGNEb3YKTDNkM2R5NXdhMmx2ZG1WeWFHVnBaQzV1YkM5d2IyeHBZMmxsY3k5eWIyOTBMWEJ2YkdsamVTMUhNakFPQmdOVgpIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkpGb01vY1ZIWW5pdGZHc05pZzBqUXQ4WW9qck1BMEdDU3FHClNJYjNEUUVCQ3dVQUE0SUNBUUNvUVVwbktwS0JnbEJ1NGRmWXN6azc4d0lWQ1ZCUjd5MjlKSHVJaGp2NXRMeVMKQ1phNTlzQ3JJMkFHZVl3UlRsSFNlWUF6KzUxSXZ1eEJRNEVmZmtkQUhPVjZDTXFxaTNXdEZNVEM2R1k4Z2dlbgo1aWVDV3hqbUQyN1pVRDZLUWhncHhyUlcvRllRb0FVWHZRd2pmL1NUN1p3YVViN2RSVUcva1NTMEg0enBYODk3CklabWZsWjg1T2tZY2JQbk5lNXlRelNpcHg2bFZ1NnhpTkdJMUUwc1VPbFdEdVlhTmtxYkc5QWNsVk13V1Z4SksKZ25qSUZOa1hnaVl0WFNBZmVhNysxSEFXRnBXRDJEVTUvMUpkZFJ3V3hSTlZ6MGZNZFdWU1N0N3dzS2ZrQ3BZTAorNjNDNGlXRXN0M2t2WDVaYkp2dzhOam55dkxwbHpoK2liN00remtYWVQ5eTJ6cVIyR1VCR1IydFVLUlhDbnhMCnZKeHhjeXBGVVJtRnpJNzlSNmQwbFIybzBhOU9GN0ZwSnNLcWVGZGJ4VTJuNVo0RkY1VEtzbCtnU1JpTk5Pa20KYkVnZXFtaVNCZUdDYzFxYjNBZGJDRzE5bmRlTklkbjhGQ0Nxd2tYZlArY0FzbEhrd3ZnRnVYa2FqRFR6bmx2awpOMXRyU3Q4c1Y0cEFXamE2M1hWRUNEZENjQXorM0Y0aG9LT0t3SkNjYU5wUTVrVVFSM2kyVHRKbHljTTMzK0ZDClk3QlhOMFV0ZTRxY3Z3WHFaVlV6OXprUXhTZ3FJWG9iaXNRaytUOFZ5Sm9WSVBWVllwYnRiWk5Rdk9TcWVLM1oKeXdwbGg2Wm13Y1NCbzNjNldCNEw3b09MblI3U1VxVE1IVyt3bUcyVU1iWDRjUXJjdWZ4OU1tRG02NitLQVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SG9uZ2tvbmcgUG9zdCBSb290IENBIDEgTz1Ib25na29uZyBQb3N0CiMgU3ViamVjdDogQ049SG9uZ2tvbmcgUG9zdCBSb290IENBIDEgTz1Ib25na29uZyBQb3N0CiMgTGFiZWw6ICJIb25na29uZyBQb3N0IFJvb3QgQ0EgMSIKIyBTZXJpYWw6IDEwMDAKIyBNRDUgRmluZ2VycHJpbnQ6IGE4OjBkOjZmOjM5Ojc4OmI5OjQzOjZkOjc3OjQyOjZkOjk4OjVhOmNjOjIzOmNhCiMgU0hBMSBGaW5nZXJwcmludDogZDY6ZGE6YTg6MjA6OGQ6MDk6ZDI6MTU6NGQ6MjQ6YjU6MmY6Y2I6MzQ6NmU6YjI6NTg6YjI6OGE6NTgKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGY5OmU2OjdkOjMzOjZjOjUxOjAwOjJhOmMwOjU0OmM2OjMyOjAyOjJkOjY2OmRkOmEyOmU3OmUzOmZmOmYxOjBhOmQwOjYxOmVkOjMxOmQ4OmJiOmI0OjEwOmNmOmIyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlETURDQ0FoaWdBd0lCQWdJQ0ErZ3dEUVlKS29aSWh2Y05BUUVGQlFBd1J6RUxNQWtHQTFVRUJoTUNTRXN4CkZqQVVCZ05WQkFvVERVaHZibWRyYjI1bklGQnZjM1F4SURBZUJnTlZCQU1URjBodmJtZHJiMjVuSUZCdmMzUWcKVW05dmRDQkRRU0F4TUI0WERUQXpNRFV4TlRBMU1UTXhORm9YRFRJek1EVXhOVEEwTlRJeU9Wb3dSekVMTUFrRwpBMVVFQmhNQ1NFc3hGakFVQmdOVkJBb1REVWh2Ym1kcmIyNW5JRkJ2YzNReElEQWVCZ05WQkFNVEYwaHZibWRyCmIyNW5JRkJ2YzNRZ1VtOXZkQ0JEUVNBeE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0MKQVFFQXJQODR0dWxtQWtuam9yVGhrUGxBajNuNTRyMTUvZ0s5N2lTU0hTTDIyb1Z5YWY3WFB3blUzWkcxQXB6UQpqVnJoVmNOUWhya3BKc0xqMmFEeGFRTW9JSUJGSWkxV3B6dFVsVllpV1I4bzN4OGdQVzJpTnI0am9MRnV0YkVuClB6bFRDZXFyYXVoMHNzSmxYSTYvZk1ONGhNMmVGdnoxTGs4Z0tnaWZkL1BGSHNTYVVtWWVTRjdqRUFhUElwamgKWlk0YlhTTm1PN2lsTWxISWhxcWhxWjUvZHBUQ3BteTNRZkRWeUFZNDV0UU00dk03VEcxUWpNU0RKOEVUaEZrOQpublYwdHRnQ1hqcVFlc0JDTm5Mc2FrM2M3OFFBM3hNWVYxOG1lTWpXQ25sM3YvZXZ0M2E1cFF1RUYxMFE2bS9oCnE1VVJYMjA4bzF4TmcxdnlzeG1LZ0lzTGh3SURBUUFCb3lZd0pEQVNCZ05WSFJNQkFmOEVDREFHQVFIL0FnRUQKTUE0R0ExVWREd0VCL3dRRUF3SUJ4akFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBRGtiVlBLN2loOWxlZ1lzQwptRUVJakV5ODJ0dnVKeHVDNTJwRjdCYUxUNFdnODdKd3ZWcVd1c3B1YmU1R2kyN25LaTZXc3hrejY3U2ZxTEkzCjdwaW9sN1l1dG1jbjFLWkovUnlUWlhhZVFpL2NJbXlhVC9KYUZUbXhjZGNyVWVodEhKakEyU3Iwb1lKNzFjbEIKb2lNQmREaFZpdys1TG1laUlBUTMycHdMMHhjaDRJK1hlVFJ2aEVnQ0lETWI1alJFbjVGdzlJQmVoRVBDS2RKcwpFaFRrWVkyc0VKQ2VoRkM3OEpadlJaK0s4OHBzVC9vUk9oVVZSc1BOSDROYkxVRVM3VkJuUVJNOUlhdVVpcXBPCmZNR3grNmZXdFNjdmw2dHU0QjNpMFJ3c0gwVGkvTDZSb1p6NzFpbFRjNGFmVTloRERsM1dZNEp4SFlCMHl2YmkKQW12WldnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNlY3VyZVNpZ24gUm9vdENBMTEgTz1KYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuCiMgU3ViamVjdDogQ049U2VjdXJlU2lnbiBSb290Q0ExMSBPPUphcGFuIENlcnRpZmljYXRpb24gU2VydmljZXMsIEluYy4KIyBMYWJlbDogIlNlY3VyZVNpZ24gUm9vdENBMTEiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiBiNzo1Mjo3NDplMjo5MjpiNDo4MDo5MzpmMjo3NTplNDpjYzpkNzpmMjplYToyNgojIFNIQTEgRmluZ2VycHJpbnQ6IDNiOmM0OjlmOjQ4OmY4OmYzOjczOmEwOjljOjFlOmJkOmY4OjViOmIxOmMzOjY1OmM3OmQ4OjExOmIzCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZjowZjplZTpmYjo5ZTozYTo1ODoxYTpkNTpmOTplOTpkYjo3NTo4OTo5ODo1Nzo0MzpkMjo2MTowODo1Yzo0ZDozMTo0Zjo2Zjo1ZDo3Mjo1OTphYTo0MjoxNjoxMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGJUQ0NBbFdnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQllNUXN3Q1FZRFZRUUdFd0pLVURFcgpNQ2tHQTFVRUNoTWlTbUZ3WVc0Z1EyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMmFXTmxjeXdnU1c1akxqRWNNQm9HCkExVUVBeE1UVTJWamRYSmxVMmxuYmlCU2IyOTBRMEV4TVRBZUZ3MHdPVEEwTURnd05EVTJORGRhRncweU9UQTAKTURnd05EVTJORGRhTUZneEN6QUpCZ05WQkFZVEFrcFFNU3N3S1FZRFZRUUtFeUpLWVhCaGJpQkRaWEowYVdacApZMkYwYVc5dUlGTmxjblpwWTJWekxDQkpibU11TVJ3d0dnWURWUVFERXhOVFpXTjFjbVZUYVdkdUlGSnZiM1JEClFURXhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQS9YZXFwUnlRQlR2TFRKc3oKaTFvVVJhVG5rQmJSMzFmU0lSQ2tGLzNmck5ZZnArVGJmUGZzMzdnRDJwUlkvVjF5Zkl3L1h3Rm5kQldXNHdJOApoOXV1eXdHT3d2Tm14b1ZGOUFMR09yVmlzcS82bkwrazV0U0FNSmp6RGJhVGo2blUyRGJ5c1B5S3lpeWhGVE9WCk1kckFHL0x1WXBtR1l6Ky8zWk1xZzZoMnVSTWZ0ODVPUW9XUEl1Y3VHdktWQ2JJRnRVUk9kNkVndmFueVRncDkKVUszMUJRMUZUMFp4L1NnK1Uvc0UyQzNYWlIxS0cvclBPN0F4bWpWdXlJc0cwd0NSOHBRSVpVeXhOQVlBZW9uaQo4TWNEV2MvVjF1aW5NclBtbUVDR3hjMG5Fb3ZNZTg2M0VUeGlZQWNqUGl0QWJwU0FDVzIyczI5M2J6VUlVUHNDCmg4VStpUUlEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVVy9oTlQ3S2xodFE2MHZGam1xQytDZlpYdDk0d0RnWUQKVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQgpBS0NoT0JabUxxZFdIeUdjQnZvZDdia2l4VGdtMkU1UDdLTi9lZDVHSWFHSGQ0OEhDSnF5cE1XdkR6S1lDM3htCktiYWJmU1ZTU1VPclRDNHJibnB3cnhZTzR3SnMrMExtR0oxRjJGWEk2RHZkNStIMExnc2NORnhzV0VyN2pJaFEKWDVVY3YrMnJJclZsczRXNm5nKzRyZVY2RzRwUU9oMjlEYng3VkZBTHVVS3ZWYUFZZ2ExbG1lKys1SnkveElXcgpRYkpVYjl3bHplMTQ0bzRNalFsSjNXTjdXbW1XQWlHb3ZWSlo2WDAxeThoU3luK0IvdGxyMC9jUjdTWGYrT2Y1CnBQcHlsNFJURGFYUU1oaFJkbGtVYkEvcjdGK0FqSFZEZzhPRm1QOU1uaTBONUhlRGswNjFsZ2VMS0JPYmpCbU4KUVNkSlFPN2U1aU5FT2R5aEl0YTZBL0k9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1NaWNyb3NlYyBlLVN6aWdubyBSb290IENBIDIwMDkgTz1NaWNyb3NlYyBMdGQuCiMgU3ViamVjdDogQ049TWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQSAyMDA5IE89TWljcm9zZWMgTHRkLgojIExhYmVsOiAiTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQSAyMDA5IgojIFNlcmlhbDogMTQwMTQ3MTI3NzYxOTU3ODQ0NzMKIyBNRDUgRmluZ2VycHJpbnQ6IGY4OjQ5OmY0OjAzOmJjOjQ0OjJkOjgzOmJlOjQ4OjY5OjdkOjI5OjY0OmZjOmIxCiMgU0hBMSBGaW5nZXJwcmludDogODk6ZGY6NzQ6ZmU6NWM6ZjQ6MGY6NGE6ODA6Zjk6ZTM6Mzc6N2Q6NTQ6ZGE6OTE6ZTE6MDE6MzE6OGUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDNjOjVmOjgxOmZlOmE1OmZhOmI4OjJjOjY0OmJmOmEyOmVhOmVjOmFmOmNkOmU4OmUwOjc3OmZjOjg2OjIwOmE3OmNhOmU1OjM3OjE2OjNkOmYzOjZlOmRiOmYzOjc4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFQ2pDQ0F2S2dBd0lCQWdJSkFNSitRd1JPUno4Wk1BMEdDU3FHU0liM0RRRUJDd1VBTUlHQ01Rc3dDUVlEClZRUUdFd0pJVlRFUk1BOEdBMVVFQnd3SVFuVmtZWEJsYzNReEZqQVVCZ05WQkFvTURVMXBZM0p2YzJWaklFeDAKWkM0eEp6QWxCZ05WQkFNTUhrMXBZM0p2YzJWaklHVXRVM3BwWjI1dklGSnZiM1FnUTBFZ01qQXdPVEVmTUIwRwpDU3FHU0liM0RRRUpBUllRYVc1bWIwQmxMWE42YVdkdWJ5NW9kVEFlRncwd09UQTJNVFl4TVRNd01UaGFGdzB5Ck9URXlNekF4TVRNd01UaGFNSUdDTVFzd0NRWURWUVFHRXdKSVZURVJNQThHQTFVRUJ3d0lRblZrWVhCbGMzUXgKRmpBVUJnTlZCQW9NRFUxcFkzSnZjMlZqSUV4MFpDNHhKekFsQmdOVkJBTU1IazFwWTNKdmMyVmpJR1V0VTNwcApaMjV2SUZKdmIzUWdRMEVnTWpBd09URWZNQjBHQ1NxR1NJYjNEUUVKQVJZUWFXNW1iMEJsTFhONmFXZHVieTVvCmRUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU9uNGovTmpyZHFHMktmZ1F2dlAKa2Q2bUp2aVpwV053clp1dXlqTkFmVzJXYnFFT1JPN2hFNTJVUWxLYXZYV0ZkQ3lvRGgyVHRoaTNqQ3lvei90YwpjYm5hN1A3b2ZvL2tMeDJ5cUhXSDJMZWg1VHZQbVVwRzBJTVpmY0NoRWh5VmJVcjAyTWVsVFRNdWhUbEFkWDRVCmZJQVNtRkRIUVdlNG9JQmhWS1pzVGgvZ25RNEg2Y202TStmK3dGVW9MQUtBcHhuMW50eFZVd09YZXdkSS81bjcKTjRva3hGbk1VQkJqanFxcEdyQ0VHb2I1WDd1eFVHNmswUXJNMVhGK0g2Y2JmUFZUYmlKZnl5dm0xSHhkcnRiQwp4a3psQlFIWjdWZjh3U041L1BySUpJT1Y4N1ZxVVFIUWQ5YnBFcUg1R29QN2dodTVzSmYwZGdZelEwbWcvd3UxCityVUNBd0VBQWFPQmdEQitNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEcKQTFVZERnUVdCQlRMRDhiZlFrUE1QY3UxU0NPaEducW1LcnMwYURBZkJnTlZIU01FR0RBV2dCVExEOGJmUWtQTQpQY3UxU0NPaEducW1LcnMwYURBYkJnTlZIUkVFRkRBU2dSQnBibVp2UUdVdGMzcHBaMjV2TG1oMU1BMEdDU3FHClNJYjNEUUVCQ3dVQUE0SUJBUURKMFE1ZUx0WE1zM3creS93OS93MG9sWk1FeUwvYXpYbTRRNUR3cEw3djh1OGgKbUx6VTFGMEc5dTVDN0RCc29LcXB5dkd2aXZvL0MzTnFQdW91UUg0ZnJsUmhlZXN1Q0RmWEkvT01uNzRkc2VHawpkZHVnNGxRVXNib2NLYVFZOWhLNm9oUVU0ekUxeUVEL3QrQUZkbGZCSEZueStML2s3U1ZpWElUd2ZuNGZzNzc1CnR5RVJ6QU1CVm5DbkVKSWVHelNCSHEyY0dzTUVQTzBDWWRZZUJ2TmZPb2Z5Sy9GRmgrVTlyTkhIVjRTOWE2N2MKMlBtMkcySndDejAyeVVMeU10ZDZZZWJTMnozUHlLbkptOXpiV0VUWGJ6aXZmM2pUbzYwYWRib2N3VFo4ang1dApITU4xUnE0MUJhYjJYRDBoN2xid3lZSWlMWHBVcTNERGZTSmxnbkNXCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIFJvb3QgQ0EgLSBSMwojIFN1YmplY3Q6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gUm9vdCBDQSAtIFIzCiMgTGFiZWw6ICJHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMyIKIyBTZXJpYWw6IDQ4MzU3MDMyNzg0NTk3NTk0MjYyMDk5NTQKIyBNRDUgRmluZ2VycHJpbnQ6IGM1OmRmOmI4OjQ5OmNhOjA1OjEzOjU1OmVlOjJkOmJhOjFhOmMzOjNlOmIwOjI4CiMgU0hBMSBGaW5nZXJwcmludDogZDY6OWI6NTY6MTE6NDg6ZjA6MWM6Nzc6YzU6NDU6Nzg6YzE6MDk6MjY6ZGY6NWI6ODU6Njk6NzY6YWQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGNiOmI1OjIyOmQ3OmI3OmYxOjI3OmFkOjZhOjAxOjEzOjg2OjViOmRmOjFjOmQ0OjEwOjJlOjdkOjA3OjU5OmFmOjYzOjVhOjdjOmY0OjcyOjBkOmM5OjYzOmM1OjNiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEWHpDQ0FrZWdBd0lCQWdJTEJBQUFBQUFCSVZoVENLSXdEUVlKS29aSWh2Y05BUUVMQlFBd1RERWdNQjRHCkExVUVDeE1YUjJ4dlltRnNVMmxuYmlCU2IyOTBJRU5CSUMwZ1VqTXhFekFSQmdOVkJBb1RDa2RzYjJKaGJGTnAKWjI0eEV6QVJCZ05WQkFNVENrZHNiMkpoYkZOcFoyNHdIaGNOTURrd016RTRNVEF3TURBd1doY05Namt3TXpFNApNVEF3TURBd1dqQk1NU0F3SGdZRFZRUUxFeGRIYkc5aVlXeFRhV2R1SUZKdmIzUWdRMEVnTFNCU016RVRNQkVHCkExVUVDaE1LUjJ4dlltRnNVMmxuYmpFVE1CRUdBMVVFQXhNS1IyeHZZbUZzVTJsbmJqQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNd2xkcEI1Qm5naUZ2WEFnN2FFeWlpZS9RVjJFY1d0aUhMOApSZ0pEeDdLS25RUmZKTXN1UytGZ2drYmhVcXNNZ1Vkd2JOMWswZXYxTEtNUGdqME1LNjZYMTdZVWhoQjV1enNUCmdIZU1DT0ZKMG1waUx4OWUrcFpvMzRrbmxUaWZCdGMreWNzbVdRMXozckRJNlNZT2d4WEc3MXVMMGdSZ3lrbW0KS1BacE8vYkx5Q2lSNVoyS1lWYzNySFFVM0hUZ091NXlMeTZjKzlDN3YvVTlBT0VHTStpQ0s2NVRwam9XYzR6ZApRUTRnT3NDMHA2SHBzaytRTGpKZzZWZkx1UVNTYUdqbE9DWmdkYktmZC8rUkZPK3VJRW44clVBVlNORUNNV0VaClhyaVg3NjEzdDJTYWVyOWZ3UlB2bTJMN0RXemdWR2tXcVFQYWJ1bURrM0YyeG1tRmdoY0NBd0VBQWFOQ01FQXcKRGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGSS93UzMrbwpMa1VrcmsxUSttT2FpOTdpM1J1OE1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQkxRTnZBVUtyK3lBenY5NVpVClJVbTdsZ0FKUWF5ekU0YUdLQWN6eW12bWRMbTZBQzJ1cEFyVDlmSHhENHEvYzJkS2c4ZEVlM2pncjI1c2J3TXAKampNNVJjT081TGxYYktyOEVwYnNVOFl0NUNSc3VaUmorOXhUYUdkV1BvTzR6elVodzhsby9zN2F3bE9xekpDSwo2ZkJkUm95VjNYcFlLQm92SGQ3TkFEZEJqKzFFYmRkVEtKZCs4MmNFSGhYWGlwYTAwOTVNSjZSTUczTnpkdlFYCm1jSWZlZzdqTFFpdENod3MvenlyVlE0UGtYNDI2OE5YU2I3aExpMThZSXZEUVZFVEk1M085ekpybEFHb21lY3MKTXg4Nk95WFNoa0RPT3l5R2VNbGhMeFM2N3R0VmI5K0U3Z1VKVGIwbzJITE8wMkpRWlI3cmtwZURNZG16dGNwSApXRDlmCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgKIyBTdWJqZWN0OiBDTj1BdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgKIyBMYWJlbDogIkF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2OCIKIyBTZXJpYWw6IDYwNDcyNzQyOTcyNjI3NTM4ODcKIyBNRDUgRmluZ2VycHJpbnQ6IDczOjNhOjc0OjdhOmVjOmJiOmEzOjk2OmE2OmMyOmU0OmUyOmM4OjliOmMwOmMzCiMgU0hBMSBGaW5nZXJwcmludDogYWU6YzU6ZmI6M2Y6Yzg6ZTE6YmY6YzQ6ZTU6NGY6MDM6MDc6NWE6OWE6ZTg6MDA6Yjc6Zjc6YjY6ZmEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDA0OjA0OjgwOjI4OmJmOjFmOjI4OjY0OmQ0OjhmOjlhOmQ0OmQ4OjMyOjk0OjM2OjZhOjgyOjg4OjU2OjU1OjNmOjNiOjE0OjMwOjNmOjkwOjE0OjdmOjVkOjQwOmVmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHRkRDQ0EveWdBd0lCQWdJSVUrdzc3dnV5U0Y4d0RRWUpLb1pJaHZjTkFRRUZCUUF3VVRFTE1Ba0dBMVVFCkJoTUNSVk14UWpCQUJnTlZCQU1NT1VGMWRHOXlhV1JoWkNCa1pTQkRaWEowYVdacFkyRmphVzl1SUVacGNtMWgKY0hKdlptVnphVzl1WVd3Z1EwbEdJRUUyTWpZek5EQTJPREFlRncwd09UQTFNakF3T0RNNE1UVmFGdzB6TURFeQpNekV3T0RNNE1UVmFNRkV4Q3pBSkJnTlZCQVlUQWtWVE1VSXdRQVlEVlFRREREbEJkWFJ2Y21sa1lXUWdaR1VnClEyVnlkR2xtYVdOaFkybHZiaUJHYVhKdFlYQnliMlpsYzJsdmJtRnNJRU5KUmlCQk5qSTJNelF3Tmpnd2dnSWkKTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFES2xtdU82dmo3OGFJMTRIOU0ydUREVXRkOQp0aERJQWw2elF5ckVUMnF5eWh4ZEtKcDRFUnBwV1ZldnRTQkM1SXNQNXQ5YnBnT1NML1VSNUdMWE1uRTQyUVFNCmNhczlVWDRQQjk5akJWenB2NVJ2d1NtQ3dMVGFVYkRCUEx1dE4wcGN5dkZMTmc0a3E3L0RoSGY5cUZEMHNlZkcKTDlJdFdZMTZDazZXYVZJQ3FqYVk3UHo2RklNTU54L0pramQvMTRFdDVjUzU0RDQwL21mMFBtYlIwL1JBejE1aQpOQTl3Qmo0Z0dGck85M0liSld5VGRCU1RvM094RHFxSEVDTlpYeUFGR1VmdGFJNlNFc3BkL05ZcnNwSThJTS9oClg2OGd2cUIyZjNibDdCcUdZVE0rNTN1MFA2QVBqcUs1YW0rNWh5WnZRV3lJcGxEOWFtTUw5Wk1XR3htUHN1MmIKbThtUTlRRU0zeGs5RHo0NEk4a3Zqd3pSQXY0YlZkWk8wSTA4cjArazgvNnZLdE1GblhrSW9jdFhNYlNjeUpDeQpaL1FZRnBNNi9FZlkwWGlXTVIrNkt3eGZYWm10WTRsYUpDQjIyTi85cTA2bUlxcWRYdVluaW4xb0thUG5pcmphCkVic1hMWm1kRXlSRzk4WGkySitPZjhlUGRHMWFzdWh5OWF6dUpCQ3RMeFRhL3kyYVJuRkh2a0xmdXdIYjlIL1QKS0k4eFdWdlR5UUttdEZMS2JwZjdROFVJSm0rSzlMdjlueWlxRGRWRjh4TTZIZGpBZUk5Qlp6d2VsR1N1ZXd2Rgo2TmtCaURrYWw0WmtRZFU3aHd4dStnL0d2VWdVdnpsTjFKNUJ0bytXSFdPV2s5bVZCbmd4YUo0M0JqdUFpVVZoCk9TUEhHMFNqRmVVYytKSXd1d0lEQVFBQm80SHZNSUhzTUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFFd0RnWUQKVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUmx6ZXVyTlI0QVBuN1ZkTUFjdEhOSERocGtMekNCcGdZRApWUjBnQklHZU1JR2JNSUdZQmdSVkhTQUFNSUdQTUM4R0NDc0dBUVVGQndJQkZpTm9kSFJ3T2k4dmQzZDNMbVpwCmNtMWhjSEp2Wm1WemFXOXVZV3d1WTI5dEwyTndjekJjQmdnckJnRUZCUWNDQWpCUUhrNEFVQUJoQUhNQVpRQnYKQUNBQVpBQmxBQ0FBYkFCaEFDQUFRZ0J2QUc0QVlRQnVBRzhBZGdCaEFDQUFOQUEzQUNBQVFnQmhBSElBWXdCbApBR3dBYndCdUFHRUFJQUF3QURnQU1BQXhBRGN3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUJkOW9QbTAzY1hGCjY2MUxKTFdoQXF2ZHBZaEtzZzlWU3l0WGpEdmxNZDMreERMeDUxdGtsall5R095bE1uZlg0MFMyd0JFcWdMazkKYW01OG05T3QvTVBXbytaa0tYelI0VGdlZ2l2L0oyV3YreFlWeEM1eGhPVzEvL3FrUjcxa01ydjJKWVNpSjBMMQpJTERDRXhBUnpSQVZ1a0tRS3RKRTRaWW02ekZJRXYwcTJza0d6M1FlcVV2Vmh5ajVlVFNTUGk1RTZQYVBUNDgxClB5V3pPZHhqS3BCcklGL0VVaEpPbHl3cXJKMlgza2p5bzJiYnd0S0RsYVptcDU0bEQra0xNNUZsQ2xyRDJWUVMKM2EvRFRnNGZKbDROM0xPTjdOV0JjTjdTVHlRRjgyeE85VXhKWm8zUi85SUxKVUZJL2xHRXhrS3ZnQVRQMEg1awpTZVR5MzZMc3NVekFLaDNudExGbG9zUzg4WmowcW5BSFk3UzQyanRNK2tBaU1Gc1JwdkFGRHNZQ0EwaXJocHVGCjNkdmQ2cUoyZ0hOOTlad0V4RVdONTdrY2k1N3ExM1hSY3JIZWRVVG5RbjNpVjJ0OTNKbThQWU1vNm9DVGpjVk0KWmNGd2diZzQvRU14c3ZZRE5FZXlyUHNpQnNzZTNSZEhIRjltdWRNYW90b1JzYVM4SThua3ZvZi91WlMyK0YwZwpTdFJmNTcxb2UyWHlGUjdTT3FrdDZkaHJKS3lYV0VSSHJWa1k4U0ZsY043T05HQ29RUEh6UEtUREtDT00vaWN6ClEwQ2dGenpyNmp1d2NxYWp1VXBMWGhaSTlMSzh5SXlTeFoyZnJISTJ2RFNBTkd1cGk1TEF1QmZ0N0haVDlTUUIKakxNaTZFdDhWY2FkK3FNVXUyV0ZibTVQRW40S1BKMlYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUl6ZW5wZS5jb20gTz1JWkVOUEUgUy5BLgojIFN1YmplY3Q6IENOPUl6ZW5wZS5jb20gTz1JWkVOUEUgUy5BLgojIExhYmVsOiAiSXplbnBlLmNvbSIKIyBTZXJpYWw6IDkxNzU2MzA2NTQ5MDM4OTI0MTU5NTUzNjY4Njk5MTQwMjYyMQojIE1ENSBGaW5nZXJwcmludDogYTY6YjA6Y2Q6ODU6ODA6ZGE6NWM6NTA6MzQ6YTM6Mzk6OTA6MmY6NTU6Njc6NzMKIyBTSEExIEZpbmdlcnByaW50OiAyZjo3ODozZDoyNTo1MjoxODphNzo0YTo2NTozOTo3MTpiNToyYzphMjo5Yzo0NToxNTo2ZjplOToxOQojIFNIQTI1NiBGaW5nZXJwcmludDogMjU6MzA6Y2M6OGU6OTg6MzI6MTU6MDI6YmE6ZDk6NmY6OWI6MWY6YmE6MWI6MDk6OWU6MmQ6Mjk6OWU6MGY6NDU6NDg6YmI6OTE6NGY6MzY6M2I6YzA6ZDQ6NTM6MWYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUY4VENDQTltZ0F3SUJBZ0lRQUxDM1doWklYNy9oeS9XTDF4bm1mVEFOQmdrcWhraUc5dzBCQVFzRkFEQTQKTVFzd0NRWURWUVFHRXdKRlV6RVVNQklHQTFVRUNnd0xTVnBGVGxCRklGTXVRUzR4RXpBUkJnTlZCQU1NQ2tsNgpaVzV3WlM1amIyMHdIaGNOTURjeE1qRXpNVE13T0RJNFdoY05NemN4TWpFek1EZ3lOekkxV2pBNE1Rc3dDUVlEClZRUUdFd0pGVXpFVU1CSUdBMVVFQ2d3TFNWcEZUbEJGSUZNdVFTNHhFekFSQmdOVkJBTU1Da2w2Wlc1d1pTNWoKYjIwd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURKMDNyS0R4NnNwNGJvRm1WcQpzY0liUlRKeGxkbitFRnZNcitlbGVRR1BpY1BLOGxWeDkzZStkNVR6Y3FRc1JOaWVrcHNVT3FIbkpKQUtDbGFPCnhkZ21sT0haU09FdFB0b0tjdDJqbVJYYWdhS0g5SHR1Sm5lSldLM1c2d3l5UVhwemJtM2JlbmhCNlFpSUVuNkgKTG1ZUlkyeFUrenlkY3NDOEx2L0N0OTBOZHVNNjEvZTBhTDZpOWVPQmJzRkdiMTJONEUzR1ZGV0pHak14Q3JGWAp1YU9LbU1Qc096VEZsVUZwZm5YQ1BDREZZYnBSUjZBZ2tKT2hrRXZ6VG55RlJWU2EwUVVtUWJDMVRSMHp2c1FECnlDVjh3WERiTy9RSkxWUW5TS3d2NGNTc1Bzakxra3hUT1RjajdOTUIrZUFKUkUxTlpNRGhEVnFISXJ5dEc2UCsKSnJVVjg2ZjhoQm5wN0tHSXRFUnBoSVB6aWRGMEJxbk1DOWJDM2llRlVDYktGN2pKZW9kV0xCb0JIbXkrRTYwUQpyTFVrOVRpUm9kWkwydkc3MHQ1SHRmRzhnZlpaYTg4WlUrbU5GY3RLeTZsdlJPVWJRYy9oaHFmSzBHcWZ2RXlOCkJqTmFvb1hsa0RXZ1lsd1dUdkRqb3ZvREdyUXNjYk5ZTE41N0M5c2FEK3ZlSVI4R2R3WURzTW52bWZ6QXVVOEwKaGlqKzBybnE0OXFsdzBkcEV1RGI4UFlaaSsxN2NOY0MxdTJIR0Nnc0JDUk1kK1JJaWhyR081clVEOHI2ZGRJQgpRRnFOZWIrTHowdlBxaGJCbGVTdFRJbytGNUhVc1dMbGd1V0FCS1FEZm8yLzJuK2lENWRQRE5NTis5ZlI1WEorCkhNaDMvMXVhRDdldUJVYmw4YWdXN0Vla0Z3SURBUUFCbzRIMk1JSHpNSUd3QmdOVkhSRUVnYWd3Z2FXQkQybHUKWm05QWFYcGxibkJsTG1OdmJhU0JrVENCampGSE1FVUdBMVVFQ2d3K1NWcEZUbEJGSUZNdVFTNGdMU0JEU1VZZwpRVEF4TXpNM01qWXdMVkpOWlhKakxsWnBkRzl5YVdFdFIyRnpkR1ZwZWlCVU1UQTFOU0JHTmpJZ1V6Z3hRekJCCkJnTlZCQWtNT2tGMlpHRWdaR1ZzSUUxbFpHbDBaWEp5WVc1bGJ5QkZkRzl5WW1sa1pXRWdNVFFnTFNBd01UQXgKTUNCV2FYUnZjbWxoTFVkaGMzUmxhWG93RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQwpBUVl3SFFZRFZSME9CQllFRkIwY1pRNm84aVY3dEpIUDVMR3g1cjFWZEd3Rk1BMEdDU3FHU0liM0RRRUJDd1VBCkE0SUNBUUI0cGd3V1NwOU1pRHJBeXc2bEZuMmZ1VWhmR0k4TllqYjJ6Umxyckt2VjlwRjlybkh6UDdNT2VJV2IKbGFRbklVZENTbnhJT3ZWRmZMTU1qbEY0ckpVVDNzYjlmYmdha0V5cmtnUEg3VUlCemcvWXNmcWlrdUZnYmE1Ngphd21xeGludWFFbG5NSUFrZWpFV09WdCs4Und1M1d3SnJmSXh3WUpPdWJ2NXZyOHFoVC9BUUtNNldmeFpTendvCkpOdTBGWFd1RFlpNkxuUEF2VmlINVVMeTYxN3VIakFpbWNzMzBjUWhiSUhzdm0wbTVoemtRaUNlUjdDc2cxbHcKTERYV3J6WTB0TTA3K0RLbzcrTjRpZnVOUlN6YW5MaCtRQnhoNXo2aWtpeEw4czM2bUxZcC8vUHllNmtmTHFDVApWeXZlaFFQNWFUZkxubmhxQmJURk1YaUo3SHFuaGVHNWV6emV2aDU1aE02ZmNBNVp3alV1a0NveDJlUkZla0drCkxoT2JOQTVtZTBtclpKZlFSc041blhKUVk2YVlXd2E5U0czWU9ZTnc2RFh3QmRHcXZPUGJ5QUxxZlAyQzJzSmIKVWpXdW1EcXR1aldUSTZjZlNOMDFScGl5RUdqa3BUSENDbGd1R1lFUXlWQjEvT3BhRnM0UjErN3ZVSWd0WWY4LwpRbk1GbEVQVmpqeE9BVG9acFI5R1RuZlFYZVdCSWlHSC9wUjloTmlUcmRab1EwaXkyK3R6Sk9lUmYxU2t0b0ErCm5hTThUSExDVjhTZzFNdzRKODdWQnA2aVNObnBuODZDY0RhVG1qdmZsaUhqV2JjTTJwRTM4UDFaV3JPWnlHbHMKUXlZQk5XTmdWWWtET25YWXVrclpWUC91M29EWUxkRTQxVjR0QzVoOVBtemIvQ2FJeHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDggTz1BQyBDYW1lcmZpcm1hIFMuQS4KIyBTdWJqZWN0OiBDTj1DaGFtYmVycyBvZiBDb21tZXJjZSBSb290IC0gMjAwOCBPPUFDIENhbWVyZmlybWEgUy5BLgojIExhYmVsOiAiQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgiCiMgU2VyaWFsOiAxMTgwNjgyMjQ4NDgwMTU5NzE0NgojIE1ENSBGaW5nZXJwcmludDogNWU6ODA6OWU6ODQ6NWE6MGU6NjU6MGI6MTc6MDI6ZjM6NTU6MTg6MmE6M2U6ZDcKIyBTSEExIEZpbmdlcnByaW50OiA3ODo2YTo3NDphYzo3NjphYjoxNDo3Zjo5Yzo2YTozMDo1MDpiYTo5ZTphODo3ZTpmZTo5YTpjZTozYwojIFNIQTI1NiBGaW5nZXJwcmludDogMDY6M2U6NGE6ZmE6YzQ6OTE6ZGY6ZDM6MzI6ZjM6MDg6OWI6ODU6NDI6ZTk6NDY6MTc6ZDg6OTM6ZDc6ZmU6OTQ6NGU6MTA6YTc6OTM6N2U6ZTI6OWQ6OTY6OTM6YzAKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUhUekNDQlRlZ0F3SUJBZ0lKQUtQYVFuNmtzYTdhTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUd1TVFzd0NRWUQKVlFRR0V3SkZWVEZETUVFR0ExVUVCeE02VFdGa2NtbGtJQ2h6WldVZ1kzVnljbVZ1ZENCaFpHUnlaWE56SUdGMApJSGQzZHk1allXMWxjbVpwY20xaExtTnZiUzloWkdSeVpYTnpLVEVTTUJBR0ExVUVCUk1KUVRneU56UXpNamczCk1Sc3dHUVlEVlFRS0V4SkJReUJEWVcxbGNtWnBjbTFoSUZNdVFTNHhLVEFuQmdOVkJBTVRJRU5vWVcxaVpYSnoKSUc5bUlFTnZiVzFsY21ObElGSnZiM1FnTFNBeU1EQTRNQjRYRFRBNE1EZ3dNVEV5TWprMU1Gb1hEVE00TURjegpNVEV5TWprMU1Gb3dnYTR4Q3pBSkJnTlZCQVlUQWtWVk1VTXdRUVlEVlFRSEV6cE5ZV1J5YVdRZ0tITmxaU0JqCmRYSnlaVzUwSUdGa1pISmxjM01nWVhRZ2QzZDNMbU5oYldWeVptbHliV0V1WTI5dEwyRmtaSEpsYzNNcE1SSXcKRUFZRFZRUUZFd2xCT0RJM05ETXlPRGN4R3pBWkJnTlZCQW9URWtGRElFTmhiV1Z5Wm1seWJXRWdVeTVCTGpFcApNQ2NHQTFVRUF4TWdRMmhoYldKbGNuTWdiMllnUTI5dGJXVnlZMlVnVW05dmRDQXRJREl3TURnd2dnSWlNQTBHCkNTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDdkFNdHdOeXVBV2tvNmJIaVVmYU4vR2gvMk5kVzkKMjhzTlJISStKcktRVXJwak95aFliNld6YlpTbTg5MWtERlgyOXVmeUlpS0FYdUZpeHJZcDRZRnM4ci9sZlRKcQpWS0F5R1ZuK0g0dlhQV0NHaFNSdjR4R3pkejRnbGpVaGE3TUkyWEF1WlBlRWtsUFdEckNRaW9yamg0MEcwNzJRCkR1S1pvUnVHRHRxYUNyc0xZVkFHVXZHZWYzYnN5dy9RSGczUG1UQTlITVJGRUZpczF0UG8xK1hxeFFFSGQ5WlIKNWdOL2lraWxUV2gxdWVtOG5rNFpjZlV5UzV4dFlCa0wrOHlkZGR5L0pzMlBrM2c1ZVhOZUpRN0tYT3QzRWdmTApaRUZIY3BPclVNUHJDWFprTk5JNXQzWVJDUTEyUmNTcHJqMXFyN1Y5WlMrVVdCRHNYSHl2ZnVLMkdOblFtMDVhClNkK3BaZ3ZNUE1aNGZLZWNIZVBPamxPK0JkNWdEMnZsR3RzLzQrRWh5U25COGVzSG5GSWJBVVJSUEhzbDE4VGwKVWxSZEpRZktGaUM0cmVSQjdub0kvcGx2ZzZhUkFyQnNObFZxNTMzMWx1YktnZGFYOFpTRDZlMndzV3NTYVI2cworMTJweFpqcHRGdFllcjQ5b2tRNlkxblVDeVhlRzArOTVRR2V6ZElwMVo4WEdRcHZ2d3lRMHdsZjJlT0tOY3g1CldrMFpONUszeE1HdHIvUjVKSnF5QVF1eHIxeVc4NEF5KzF3OW1QR2dQMHJldnErVUx0bFZtaGR1WUoxamJMaGoKeWE2QlhCZzE0SkM3dmp4UE55SzVmdXZQbm5jaHBqMDRnZnRJMmpFOUsrT0o5ZEMxdlg3Z1VNUVNpYk1qbWhBeApoZHV1Yis4NE14aDJFUUlEQVFBQm80SUJiRENDQVdnd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkREQWRCZ05WCkhRNEVGZ1FVK1NTc0Q3SzErSG5BK21DSUc4VFpUUUtlRnhrd2dlTUdBMVVkSXdTQjJ6Q0IySUFVK1NTc0Q3SzEKK0huQSttQ0lHOFRaVFFLZUZ4bWhnYlNrZ2JFd2dhNHhDekFKQmdOVkJBWVRBa1ZWTVVNd1FRWURWUVFIRXpwTgpZV1J5YVdRZ0tITmxaU0JqZFhKeVpXNTBJR0ZrWkhKbGMzTWdZWFFnZDNkM0xtTmhiV1Z5Wm1seWJXRXVZMjl0CkwyRmtaSEpsYzNNcE1SSXdFQVlEVlFRRkV3bEJPREkzTkRNeU9EY3hHekFaQmdOVkJBb1RFa0ZESUVOaGJXVnkKWm1seWJXRWdVeTVCTGpFcE1DY0dBMVVFQXhNZ1EyaGhiV0psY25NZ2IyWWdRMjl0YldWeVkyVWdVbTl2ZENBdApJREl3TURpQ0NRQ2oya0orcExHdTJqQU9CZ05WSFE4QkFmOEVCQU1DQVFZd1BRWURWUjBnQkRZd05EQXlCZ1JWCkhTQUFNQ293S0FZSUt3WUJCUVVIQWdFV0hHaDBkSEE2THk5d2IyeHBZM2t1WTJGdFpYSm1hWEp0WVM1amIyMHcKRFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUpBU3J5STF3cU01OEM3ZTZiWHBlSHhJdmo5OVJaSmU2ZHF4R2Z3VwpQSiswVzJhZWF1ZkR1VjJJNkErdHp5TVAzaVU2WHN4UHBjRzFMYXdrMGxnSDNxTFBhWVJnTStnUURST3BJOUNGCjVZNTdwcDQ5Y2hOeU0vV3FmY1pqSHdqMC9nRi9KTThyTEZRSjN1SXJiWkxHT1U4VzZqeCtla2JVUldwR3FPdDEKZ2xhbnE2QjhhQk16OXAwdzhHOG5PU1FqS3BEOWtDazE4cFBmTktYRzkvanZqQTlpU255dTAvVlUrSTIybWxhSApGb0k2TTZ0YUlnajNncnJxTHVCSG1yUzFSYU1GTzluY0xrVkFPK3JjZitnNzY5SHNKdGcxcERERk9xeFhuck4yCnBTQjcrUjVLQldJQnBpaDFZSmVTRFc0K1RUZEREWklWbkJnaXpWR1pvQ2thUEYrS01qTmJNTWVKTDBlWUQ2TUQKeHZieHJOOHk4Tm1CR3VTY3ZmYUFGUERSTExtRjlkaWpzY2lsSWVVY0U1ZnVEcjNmS2Fudk5GTmIwK1JxRTRRRwp0aklDeEZLdUl0TGNzaUZDR3RwQThDbko3QW9NWE9MUXVzeEkwemNLekJJS2lubXdQUU4vYVV2ME5DQjlzelRxCmprdGs5VDc5c3lObkZRMEV1UEF0d1FsUlBMSnNGZkNsSTllRGRPVGxMc24rbUNkQ3hxdkduckRRV3ppbG0xRGUKZmhpWXRVVTc5bm0wNlBjYWV3YUQrOUNMMnJ2SHZSaXJDRzg4Z0d0QVB4a1p1bVdLNXI3VlhOTTIxKzlBVWlSZwpPR2NFTWV5UDg0TEczcmxWOHpzeGtWcmN0UWdWclhZbENnMTdMb2ZpREtZR3ZDWVFiVGVkN04xNGpIeUF4ZkRaCmQwalEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwOCBPPUFDIENhbWVyZmlybWEgUy5BLgojIFN1YmplY3Q6IENOPUdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwOCBPPUFDIENhbWVyZmlybWEgUy5BLgojIExhYmVsOiAiR2xvYmFsIENoYW1iZXJzaWduIFJvb3QgLSAyMDA4IgojIFNlcmlhbDogMTQ1NDE1MTE3NzMxMTE3ODg0OTQKIyBNRDUgRmluZ2VycHJpbnQ6IDllOjgwOmZmOjc4OjAxOjBjOjJlOmMxOjM2OmJkOmZlOjk2OjkwOjZlOjA4OmYzCiMgU0hBMSBGaW5nZXJwcmludDogNGE6YmQ6ZWU6ZWM6OTU6MGQ6MzU6OWM6ODk6YWU6Yzc6NTI6YTE6MmM6NWI6Mjk6ZjY6ZDY6YWE6MGMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDEzOjYzOjM1OjQzOjkzOjM0OmE3OjY5OjgwOjE2OmEwOmQzOjI0OmRlOjcyOjI4OjRlOjA3OjlkOjdiOjUyOjIwOmJiOjhmOmJkOjc0Ojc4OjE2OmVlOmJlOmJhOmNhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlIU1RDQ0JUR2dBd0lCQWdJSkFNbk4wK25WZlNQT01BMEdDU3FHU0liM0RRRUJCUVVBTUlHc01Rc3dDUVlEClZRUUdFd0pGVlRGRE1FRUdBMVVFQnhNNlRXRmtjbWxrSUNoelpXVWdZM1Z5Y21WdWRDQmhaR1J5WlhOeklHRjAKSUhkM2R5NWpZVzFsY21acGNtMWhMbU52YlM5aFpHUnlaWE56S1RFU01CQUdBMVVFQlJNSlFUZ3lOelF6TWpnMwpNUnN3R1FZRFZRUUtFeEpCUXlCRFlXMWxjbVpwY20xaElGTXVRUzR4SnpBbEJnTlZCQU1USGtkc2IySmhiQ0JECmFHRnRZbVZ5YzJsbmJpQlNiMjkwSUMwZ01qQXdPREFlRncwd09EQTRNREV4TWpNeE5EQmFGdzB6T0RBM016RXgKTWpNeE5EQmFNSUdzTVFzd0NRWURWUVFHRXdKRlZURkRNRUVHQTFVRUJ4TTZUV0ZrY21sa0lDaHpaV1VnWTNWeQpjbVZ1ZENCaFpHUnlaWE56SUdGMElIZDNkeTVqWVcxbGNtWnBjbTFoTG1OdmJTOWhaR1J5WlhOektURVNNQkFHCkExVUVCUk1KUVRneU56UXpNamczTVJzd0dRWURWUVFLRXhKQlF5QkRZVzFsY21acGNtMWhJRk11UVM0eEp6QWwKQmdOVkJBTVRIa2RzYjJKaGJDQkRhR0Z0WW1WeWMybG5iaUJTYjI5MElDMGdNakF3T0RDQ0FpSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU1EZlZ0UGtPcHQyUmJRVDIvL0J0aG1MTjBFWWxWSkg2eGVkCktZaU9OV3dHTWk1SFl2TkpCTDk5UkRheGNjeTlXZ2x6MWRtRlJQK1JWeVhmWGphT2NORmNjVU1kMmRydlhOTDcKRzcwNnRjdXRvOHhFcHcydUlSVS91WHBia25YWXBCSTRpUm1LdDREUzRqSnZWcHlSMW9nUUM3TjBaSkowWVBQMgp6eGhQWUxJajBNYzd6bUZMbVkvQ0ROQkFzcGpjRGFoT283a0tybUNnclVWU1k3cG12V2pnK2I0YXFJRzdIa0Y0CmRkUEIvZ0JWc0lkVTZDZVFOUjFNTTYyWC9KY3VtSVMvTE1tanY5R1lFUlR0WS9qS21JaFlGNW50UlFPWGZqeUcKSG9pTXZ2S1JoSTlsTk5nQVRIMjNNUmRhS1hvS0dDUXdvemUxZXFrQmZTYlcrUTZPV2ZIOUd6TzFLVHNYTzBHMgpJZDNVd0QybG41OGZRMURKdTd4c2VwZVk3czJNSC91Y1VhNkxjTDBubjNIQWE2eDlrR2JvMTEwNkRiRFZ3bzNWCnlKMmR3VzNRMEw5UjVPUDR3emcycnRhbmRlYXZoRU5kazVJTWFnZmVPeDJZSXRhc3dUWGJvNkFsLzNLMWRoM2UKYmVrc1ppeFNoTkJGa3M0YzVlVXpIZHdIVTFTanFvSTdtamN2M04yZ1pPbm0zYjJ1L0dTRkhUeW55UWJlaFA5cgo2R3NhUE1XaXMwTDdpd2srWHdoU3gyTEUxQVZ4djhSazVQaWhnK2crRXB1b0h0UTJUUzl4OW8wbzlvT3BFOUpoCndaRzdTTUEwajBHTVMwemJhUkwvVUpTY0lJTlpjKzE4b2ZMeC9kMzNTZE5EV0tCV1k4bzlQZVUxVmxucERzb2cKekN0TGt5a1BBZ01CQUFHamdnRnFNSUlCWmpBU0JnTlZIUk1CQWY4RUNEQUdBUUgvQWdFTU1CMEdBMVVkRGdRVwpCQlM1Q2NxY0h0dlRiRHBycnUxVThWdVRCalV1WGpDQjRRWURWUjBqQklIWk1JSFdnQlM1Q2NxY0h0dlRiRHByCnJ1MVU4VnVUQmpVdVhxR0JzcVNCcnpDQnJERUxNQWtHQTFVRUJoTUNSVlV4UXpCQkJnTlZCQWNUT2sxaFpISnAKWkNBb2MyVmxJR04xY25KbGJuUWdZV1JrY21WemN5QmhkQ0IzZDNjdVkyRnRaWEptYVhKdFlTNWpiMjB2WVdSawpjbVZ6Y3lreEVqQVFCZ05WQkFVVENVRTRNamMwTXpJNE56RWJNQmtHQTFVRUNoTVNRVU1nUTJGdFpYSm1hWEp0CllTQlRMa0V1TVNjd0pRWURWUVFERXg1SGJHOWlZV3dnUTJoaGJXSmxjbk5wWjI0Z1VtOXZkQ0F0SURJd01EaUMKQ1FESnpkUHAxWDBqempBT0JnTlZIUThCQWY4RUJBTUNBUVl3UFFZRFZSMGdCRFl3TkRBeUJnUlZIU0FBTUNvdwpLQVlJS3dZQkJRVUhBZ0VXSEdoMGRIQTZMeTl3YjJ4cFkza3VZMkZ0WlhKbWFYSnRZUzVqYjIwd0RRWUpLb1pJCmh2Y05BUUVGQlFBRGdnSUJBSUNJZjNEZWtpalpCWlJHLzVCWHFmRXYzeG9OYS9wOERoeEpKSGtuMkVhcWJ5bFoKVW9od0V1cmRQZldiVTFSdjRXQ2lxQW01N090WmZNWTE4ZHdZNmZGbjVhKzZSZUFKM3NwRUQ4SVhEbmVSUlhvegpYMStXTEdpTHdVZVBtSnM5d096TDlkV0Nrb1ExMGI0Mk9GWnlNVnRITGFvWHBHTlI2d29Cclgvc2RaN0xvUi94CmZ4S3h1ZVJrZjJmV0l5cjB1RGxkbU9naHArRzlQVUlhZEpwd3IyaHNVRjFKei8vN0RsM21MRWZYZ1RwWkFMVnoKYTJNZzlqRkZDRGtPOUhCK1FIQmFQOUJyUXFsMFBTZ3ZBbTExY3BVSmpVaGp4c1lqVjVLVFhqWEJqZmtLOXl5ZApZaHoyclh6ZHBqRWV0ckhIZm9VbStxUnF0ZHBqTU5Idmt6ZXlaaTk5QmZmbnQwdVlsRFhBMlRvcHdaMnlVRE1kClNxbGFwc2tENyszMDU2aHVpclJYaE91a1A5RHVxcXFIVzJQb2srSnJxTlM0Y25ockcrMDU1RjNMbTZxSDFVOU8KQVA3WmFwODhNUThvQWdGOW1PaW5zS0prbm5uNFNQSVZxY3pteUVUclAzaVo4bnR4UGp6eG1LZkZHQkkvNXJzbwpNMExwUlFwOGJmS0dlUy9GZ2hsOUNZbDhzbFIyaUs3ZXdmUE00VzdiTWRhVHJwbWc3eVZxYzVpSld6b3VFNGdlCnY4Q1NsRFFiNHllM2l4NXZRdi9uNlRlYlVCMHRvdmtDN3N0WVdEcHh2R2pqcXNHdkhDZ2ZvdHdqWlQrQjZxNloKMDlnd3p4TU5UeFhKaEx5blNDMzRNQ04zMkVaTGVXMzJqTzA2ZjJBUmVQVHBtNjdWVk1CMGdORUxRcC9CCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIE89R29EYWRkeS5jb20sIEluYy4KIyBTdWJqZWN0OiBDTj1HbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIE89R29EYWRkeS5jb20sIEluYy4KIyBMYWJlbDogIkdvIERhZGR5IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiA4MDozYTpiYzoyMjpjMTplNjpmYjo4ZDo5YjozYjoyNzo0YTozMjoxYjo5YTowMQojIFNIQTEgRmluZ2VycHJpbnQ6IDQ3OmJlOmFiOmM5OjIyOmVhOmU4OjBlOjc4Ojc4OjM0OjYyOmE3OjlmOjQ1OmMyOjU0OmZkOmU2OjhiCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0NToxNDowYjozMjo0NzplYjo5YzpjODpjNTpiNDpmMDpkNzpiNTozMDo5MTpmNzozMjo5MjowODo5ZTo2ZTo1YTo2MzplMjo3NDo5ZDpkMzphYzphOToxOTo4ZTpkYQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHhUQ0NBcTJnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JnekVMTUFrR0ExVUVCaE1DVlZNeApFREFPQmdOVkJBZ1RCMEZ5YVhwdmJtRXhFekFSQmdOVkJBY1RDbE5qYjNSMGMyUmhiR1V4R2pBWUJnTlZCQW9UCkVVZHZSR0ZrWkhrdVkyOXRMQ0JKYm1NdU1URXdMd1lEVlFRREV5aEhieUJFWVdSa2VTQlNiMjkwSUVObGNuUnAKWm1sallYUmxJRUYxZEdodmNtbDBlU0F0SUVjeU1CNFhEVEE1TURrd01UQXdNREF3TUZvWERUTTNNVEl6TVRJegpOVGsxT1Zvd2dZTXhDekFKQmdOVkJBWVRBbFZUTVJBd0RnWURWUVFJRXdkQmNtbDZiMjVoTVJNd0VRWURWUVFICkV3cFRZMjkwZEhOa1lXeGxNUm93R0FZRFZRUUtFeEZIYjBSaFpHUjVMbU52YlN3Z1NXNWpMakV4TUM4R0ExVUUKQXhNb1IyOGdSR0ZrWkhrZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrZ0xTQkhNakNDQVNJdwpEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDl4WWdqeCtsazA5eHZKR0tQM2dFbFk2U0tECkU2YkZJRU1CTzRUeDVvVkpueWZxOW9RYlRxQzAyM0NZeHpJQnNRVStCMDd1OVBwUEwxa3dJdWVyR1ZacjRvQUgKL1BNV2RZQTVVWHZsK1RXMmRFNnBqWUlUNUxZL3FRT0QrcUsraWhWcWY5NEx3N1laRkFYSzZzT29CSlE3Um53eQpEZk1BWmlMSWpXbHROb3dSR0xmVHNoeGd0RGo2QW96TzA5MUdCOTRLUHV0ZGZNaDgrN0FyVTZTU1ltbFJKUVZoCkdrU0JqQ3lwUTVZajM2dzZnWm9PS2NVY3FlbGRIcmFlbmpBS09jN3hpSUQ3UzEzTU11eUZZa01sTkFKV0p3R1IKdER0d0tqOXVzZWljaUFGOW45VDUyMU50WUoyL0xPZFlxN2hmUnZ6T3hCc0RQQW5yU1RGY2FVYXo0RWNDQXdFQQpBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFCkZEcWFoUWNRWnlpMjcvYTlCVUZ1SU1HVTJnL2VNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUNaMjExNTFmbVgKV1djRFlmRitPd1l4ZFMyaElJNVBaWWUwOTZhY3ZOanBMOURiV3U3UGRJeHp0RGhDMmdWNytBSjF1UDJsc2RldQo5dGZlRTh0VEVINktSdEdYK3JjdUt4R3JrTEFuZ1Bub24xcnBONStyNU45c3M0VVhuVDNaSkU5NWtUWFdYd1RyCmdJT3JtZ0l0dFJEMDJKREhCSE5BN1hJbG9LbWY3SjZyYUJLWlY4YVBFam9KcEwxRS9RWVZOOEdiNURLajdUam8KMkdUekxINFUvQUxxbjgzL0IyZ1gyeUtRT0MxNmpkRlU4V25qWHpQS2VqMTdDdVBLZjE4NTVlSjF1c1YyR0RQTwpMUEF2VEszM3NlZk9UNmpFbTBwVUJzVi9mZFVJRCtJYy9uNFh1S3hlOXRRV3NrTUpERTMycDJ1MG1ZUmx5bnFJCjR1SkV2bHozNmh6MQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3RhcmZpZWxkIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuCiMgU3ViamVjdDogQ049U3RhcmZpZWxkIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIgTz1TdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuCiMgTGFiZWw6ICJTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IGQ2OjM5OjgxOmM2OjUyOjdlOjk2OjY5OmZjOmZjOmNhOjY2OmVkOjA1OmYyOjk2CiMgU0hBMSBGaW5nZXJwcmludDogYjU6MWM6MDY6N2M6ZWU6MmI6MGM6M2Q6Zjg6NTU6YWI6MmQ6OTI6ZjQ6ZmU6Mzk6ZDQ6ZTc6MGY6MGUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDJjOmUxOmNiOjBiOmY5OmQyOmY5OmUxOjAyOjk5OjNmOmJlOjIxOjUxOjUyOmMzOmIyOmRkOjBjOmFiOmRlOjFjOjY4OmU1OjMxOjliOjgzOjkxOjU0OmRiOmI3OmY1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEM1RDQ0FzV2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQmp6RUxNQWtHQTFVRUJoTUNWVk14CkVEQU9CZ05WQkFnVEIwRnlhWHB2Ym1FeEV6QVJCZ05WQkFjVENsTmpiM1IwYzJSaGJHVXhKVEFqQmdOVkJBb1QKSEZOMFlYSm1hV1ZzWkNCVVpXTm9ibTlzYjJkcFpYTXNJRWx1WXk0eE1qQXdCZ05WQkFNVEtWTjBZWEptYVdWcwpaQ0JTYjI5MElFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlU0F0SUVjeU1CNFhEVEE1TURrd01UQXdNREF3Ck1Gb1hEVE0zTVRJek1USXpOVGsxT1Zvd2dZOHhDekFKQmdOVkJBWVRBbFZUTVJBd0RnWURWUVFJRXdkQmNtbDYKYjI1aE1STXdFUVlEVlFRSEV3cFRZMjkwZEhOa1lXeGxNU1V3SXdZRFZRUUtFeHhUZEdGeVptbGxiR1FnVkdWagphRzV2Ykc5bmFXVnpMQ0JKYm1NdU1USXdNQVlEVlFRREV5bFRkR0Z5Wm1sbGJHUWdVbTl2ZENCRFpYSjBhV1pwClkyRjBaU0JCZFhSb2IzSnBkSGtnTFNCSE1qQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0MKZ2dFQkFMM3R3UVA4OW8vOEFyRnZXNTlJMloxNTRxSzNBMkZXR01OSHR0ZktQVFV1aVVQM29XbWIzb29hL1JNZwpuTFJKZHpJcFZ2MjU3SXpkSXZweTNDZGhsKzcyV29Uc2JobTVpU3pjaEZ2VmRQdHJYOFdKcFJCU2lVWlY5TGgxCkhPWi81RlN1Uy9oVmNsY0NHZmdYY1ZuckhpZ0hkTVdkU0w1c3RQU2tzUE5rTjNtU3dPeEdYbi9oYlZOTVlxL04KSHd0anV6cWQrL3g1QUpoaGRNOG1na0JqODdKeWFoa05tY3JVRG5YTU4vdUxpY0ZaOFdKL1g3TmZaVEQ0cDdkTgpkbG9lZGw0MHdPaVdWcG1Lcy9CL3BNMjkzREl4ZkpIUDRGOFIrR3VxU1Z6Um1aVFJvdU5qV3dsMnRWWmk0VXQwCkhaYlVKdFFJQkZuUW1BNE81dDc4dyt3ZmtQRUNBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU8KQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGSHdNTWgrbjJUQi94SDFvbzJLb29jNnJCMXNuTUEwRwpDU3FHU0liM0RRRUJDd1VBQTRJQkFRQVJXZm9sVHdOdmxKazdtaCtDaFRuVWRnV1VYdUVvazIxaVhRbkNvS2pVCnNIVTQ4VFJxbmVTZmlvWW1VZVlzMGNZdGJwVWdTcElCN0xpS1ozc3g0bWN1akpVREppNURuVW94OWc2MURMdTMKNGpkL0lyb0FvdzU3VXZ0cnV6dkUwM2xSVHMyUTlHY0hHY2c4Um5vTkFYM0ZXT2R0NW9Vd0Y1b2t4QkRnQlBmZwo4bi9VcWdyL1FoMDM3WlRsWkZrU0lIYzQwekkrT0lGMWxuUDZhSSt4eTg0ZnhlejZuSDdQZnJIeEJ5MjIvTC9LCnBML1Fsd1ZLdk9vWUtBS1F2VlI0Q1NGeDA5RjlIZGtXc0tsaFBkQUtBQ0w4eDN2TENXUkZDenRBZ2ZkOWZETDEKbU1wWWpuMHE3cEJaYzJUNU5uUmVKYUgxWmdVdWZ6a1ZxU3I3VUl1T2hXbjAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIE89U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLgojIFN1YmplY3Q6IENOPVN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIE89U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLgojIExhYmVsOiAiU3RhcmZpZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiAxNzozNTo3NDphZjo3Yjo2MToxYzplYjpmNDpmOTozYzplMjplZTo0MDpmOTphMgojIFNIQTEgRmluZ2VycHJpbnQ6IDkyOjVhOjhmOjhkOjJjOjZkOjA0OmUwOjY2OjVmOjU5OjZhOmZmOjIyOmQ4OjYzOmU4OjI1OjZmOjNmCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1Njo4ZDo2OTowNTphMjpjODo4NzowODphNDpiMzowMjo1MTo5MDplZDpjZjplZDpiMTo5Nzo0YTo2MDo2YToxMzpjNjplNToyOTowZjpjYjoyYTplNjozZTpkYTpiNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDd6Q0NBdGVnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JtREVMTUFrR0ExVUVCaE1DVlZNeApFREFPQmdOVkJBZ1RCMEZ5YVhwdmJtRXhFekFSQmdOVkJBY1RDbE5qYjNSMGMyUmhiR1V4SlRBakJnTlZCQW9UCkhGTjBZWEptYVdWc1pDQlVaV05vYm05c2IyZHBaWE1zSUVsdVl5NHhPekE1QmdOVkJBTVRNbE4wWVhKbWFXVnMKWkNCVFpYSjJhV05sY3lCU2IyOTBJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVNBdElFY3lNQjRYRFRBNQpNRGt3TVRBd01EQXdNRm9YRFRNM01USXpNVEl6TlRrMU9Wb3dnWmd4Q3pBSkJnTlZCQVlUQWxWVE1SQXdEZ1lEClZRUUlFd2RCY21sNmIyNWhNUk13RVFZRFZRUUhFd3BUWTI5MGRITmtZV3hsTVNVd0l3WURWUVFLRXh4VGRHRnkKWm1sbGJHUWdWR1ZqYUc1dmJHOW5hV1Z6TENCSmJtTXVNVHN3T1FZRFZRUURFekpUZEdGeVptbGxiR1FnVTJWeQpkbWxqWlhNZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrZ0xTQkhNakNDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTlVNT3NRcStVN2k5YjRabDErT2lGT3hIei9MejU4Z0UyMHAKT3NnUGZUejNhM1k0WTlrMllLaWJYbHdBZ0xJdldYLzJoL2tsUTRibmFSdFNtcERoY2VQWUxRMU9iL2JJU2RtMgo4eHBXcml1MmRCVHJ6L3NtNHhxNkhaWXVhanRZbElsSFZ2OGxvSk53VTRQYWhIUVV3MmVlQkdnNjM0NUFXaDFLClRzOURrVHZuVnRZQWNNdFM3bnQ5cmpybnZESDVSZmJDWU04VFdRSXJnTXcwUjkrNTNwQmxiUUxQTEpHbXB1ZmUKaFJoSmZHWk9venB0cWJYdU5DNjZEUU80TTk5SDY3RnJqU1habTg2QjBVVkdNcFp3aDk0Q0RrbERoYlpzYzd0awo2bUZCck1uVVZOK0hMOGNpc2liTW4xbFVhSi84dmlvdnhGVWNkVUJnRjRVQ1ZUbUxmd1VDQXdFQUFhTkNNRUF3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkp4ZkFOK3EKQWRjd0t6aUlvcmh0U3B6eUVaR0RNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUJMTnFhRWQybmRPeG1mWnlNSQpidzVoeWYyRTNGL1lOb0hOMkJ0QkxaOWczY2NhYU5uUmJvYmhpQ1BQRTk1RHorSTBzd1NkSHluVnYvaGV5TlhCCnZlNlNiekowOHBHQ0w3MkNRbnF0S3JjZ2ZVMjhlbFVTd2hYcXZmZHFsUzVzZEovUEhMVHl4UUdqaGRCeVBxMXoKcXd1YmRReHRSYmVPbEt5V043V2cwSThWUnc3ajZJUGRqLzN2UVFGM3pDZXBZb1V6OGpjSTczSFBkd2JleUJrZAppRURQZlVZZC94N0g0YzcvSTl2RytvMVZUcWtDNTBjUlJqNzAvYjE3S1NhN3FXRmlOeWkyTFNyMkVJWmt5WENuCjBxMjNLWEI1Nmp6YVl5V2YvV2kzTU94dyszV0t0MjFnWjdJZXlMbnAyS2h2QW90bkRVMG1WM0hhSVB6QlNsQ04Kc1NpNgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QWZmaXJtVHJ1c3QgQ29tbWVyY2lhbCBPPUFmZmlybVRydXN0CiMgU3ViamVjdDogQ049QWZmaXJtVHJ1c3QgQ29tbWVyY2lhbCBPPUFmZmlybVRydXN0CiMgTGFiZWw6ICJBZmZpcm1UcnVzdCBDb21tZXJjaWFsIgojIFNlcmlhbDogODYwODM1NTk3Nzk2NDEzODg3NgojIE1ENSBGaW5nZXJwcmludDogODI6OTI6YmE6NWI6ZWY6Y2Q6OGE6NmY6YTY6M2Q6NTU6Zjk6ODQ6ZjY6ZDY6YjcKIyBTSEExIEZpbmdlcnByaW50OiBmOTpiNTpiNjozMjo0NTo1Zjo5YzpiZTplYzo1Nzo1Zjo4MDpkYzplOTo2ZToyYzpjNzpiMjo3ODpiNwojIFNIQTI1NiBGaW5nZXJwcmludDogMDM6NzY6YWI6MWQ6NTQ6YzU6Zjk6ODA6M2M6ZTQ6YjI6ZTI6MDE6YTA6ZWU6N2U6ZWY6N2I6NTc6YjY6MzY6ZTg6YTk6M2M6OWI6OGQ6NDg6NjA6Yzk6NmY6NWY6YTcKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURURENDQWpTZ0F3SUJBZ0lJZDNjR0p5YXBzWHd3RFFZSktvWklodmNOQVFFTEJRQXdSREVMTUFrR0ExVUUKQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnBjbTFVY25WegpkQ0JEYjIxdFpYSmphV0ZzTUI0WERURXdNREV5T1RFME1EWXdObG9YRFRNd01USXpNVEUwTURZd05sb3dSREVMCk1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnAKY20xVWNuVnpkQ0JEYjIxdFpYSmphV0ZzTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQwpBUUVBOWh0UFp3Y3JvUlgxQmlMTEh3R3k0M05GQmtSSkxMdEpKUlRXenNPM3F5eFB4a0V5bEZmNkVxZGJEdUtQCkh4NkdHYWVxdFMyNVh3Mkt3cStGTlhreUxic2NZamZ5c1Z0S1Bjck5jVi9wUXI2VTZNamUrU0pJWk1ibHE4WXIKYmEwRjhQclZDOCthNWZCUXBJczdSNlVqVzNwNitETS91TytabCtNZ3dkWW9pYytVKzdsRjdlTkFGeEhVZFBBTApNZUlySm1xYlRGZXVyQ0ErdWtWNkJmTzltMmtWcm4xT0lHUEVOWFk2QndMSk4vM0hSKzdvOFhZZGN4WHlsNlMxCnlIcDUyVUtxSzM5Yy9zNG1UNk5tZ1RXdlJMcFVIaHd3TW1XZDVqeVRYbEJPZXVNNjFHN01HdnY1MGpldUpDcXIKVndNaUtBMUpkWCszS05wMXY0N2ozQTU1TVFJREFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVW5aUEdVNHRleXE4LwpueDRQNVptVnZDVDJsSTh3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEUVlKCktvWklodmNOQVFFTEJRQURnZ0VCQUZpczlBUU96Y0FOL3dyOTFMb1dYeW05ZTJpWldFblN0QjAzVFg4bmZVWUcKWFVQR2hpNCtjN0ltZlUrVHFiYkVLcHFySVpjVXNkNk0wNnVKRmRockpOVHhGcTdZcEZ6VWYxR083UmdCc1pOagp2Yno0WVlDYW5ySE9RbkRpcVgwR0pYMG5vZjV2N0xNZUpOcmpTMVVhQURzMXREdloxMTB3L1lFVGlmTENCaXZ0Clo4U095VU95WEdzVmlRSzhZdnhPOHJVenFySnYwd3FpVU9QMk8rZ3VSTUxiWmppcE0xWkk4VzBiTTQwTmpEOWcKTjUzVHltMStOSDRObjNKMml4dWZjdjFTTlVGRkFwWXZITEthYzBraHNVbEhSVWUwNzJvMEVjbE5tc3hadDlZQwpubHBPWmJXVXJodmZLYkFXOGI4QW5nYzZGMlMxQkxVaklaa0tsVHVYZk84PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QWZmaXJtVHJ1c3QgTmV0d29ya2luZyBPPUFmZmlybVRydXN0CiMgU3ViamVjdDogQ049QWZmaXJtVHJ1c3QgTmV0d29ya2luZyBPPUFmZmlybVRydXN0CiMgTGFiZWw6ICJBZmZpcm1UcnVzdCBOZXR3b3JraW5nIgojIFNlcmlhbDogODk1NzM4MjgyNzIwNjU0Nzc1NwojIE1ENSBGaW5nZXJwcmludDogNDI6NjU6Y2E6YmU6MDE6OWE6OWE6NGM6YTk6OGM6NDE6NDk6Y2Q6YzA6ZDU6N2YKIyBTSEExIEZpbmdlcnByaW50OiAyOTozNjoyMTowMjo4YjoyMDplZDowMjpmNTo2NjpjNTozMjpkMTpkNjplZDo5MDo5Zjo0NTowMDoyZgojIFNIQTI1NiBGaW5nZXJwcmludDogMGE6ODE6ZWM6NWE6OTI6OTc6Nzc6ZjE6NDU6OTA6NGE6ZjM6OGQ6NWQ6NTA6OWY6NjY6YjU6ZTI6YzU6OGY6Y2Q6YjU6MzE6MDU6OGI6MGU6MTc6ZjM6ZjA6YjQ6MWIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURURENDQWpTZ0F3SUJBZ0lJZkU4RU9SelVtUzB3RFFZSktvWklodmNOQVFFRkJRQXdSREVMTUFrR0ExVUUKQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnBjbTFVY25WegpkQ0JPWlhSM2IzSnJhVzVuTUI0WERURXdNREV5T1RFME1EZ3lORm9YRFRNd01USXpNVEUwTURneU5Gb3dSREVMCk1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnAKY20xVWNuVnpkQ0JPWlhSM2IzSnJhVzVuTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQwpBUUVBdElUTU14Y3VhNVJzYTJGU29PdWp6M21VVE9XVWdKbkxWV1JFWlk5blpPSUc0MXczU2ZZdm00U0VIaTN5CllKMHdUc3lFaGVJc3p4NmUvamFyTTNjMVJOZzFsaG85TnVoNkR0alZSNkZxYVl2Wi9MczZybmxhMWZUV2NidWEKa0NOcm1yZUlkSWNNSGwrNW5pMzZxMU1yM0x0MlBwTk1DQWlNSHFJakhOUnFyU0s2bVFFdWJXWEx2aVJtVlNSTApRRVN4RzlmaHdvWEEzaEEvUGUyNC9QSHhJMVBjdjJXWGI5bjVRSEdOZmIyVjFNNitvRjRuSTk3OXB0QW1EZ0FwCjZ6eEc4RDFndno5UTB0d21RVkdlRkRkQ0JLTndWNmdiaCswdCtudnVqQXJqcVdhSkdjdEIrZDFFTm1IUDRuZEcKeUgzMjlKS0JOdjNiTlBGeWZ2TU1GcjIwRlFJREFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVUJ4L1M1NXphd202aQpRTFN3ZWxBUVVIVEV5TDB3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0VCQUlsWHNoWjZxTUw5MXRtYm16VENuTFF5RkUybnBOL3N2cWUrK0VQYmtUZk8KdERJdVVGVWFOVTUyUTNFZzc1TjNUaFZ3TG9mRHdSMXQzTXUxSjlRc1Z0RlNVenBFMG5QSXhCc0ZaVnBpa3B6dQpRWTB4MitjMDZsa2gxUUY2MTJTNFpEbk55ZTJ2N1VzRFNLZWdtUUdBM0dXak5xNWxXVWhQZ2t2SVpmRlhIZVZaCkxnby9iTmpSOWVVSnRHeFVBQXJnRlUySGRXMjNXSlphM1czU0FLRDBtMGkrd3pla3VqYmdmSWVGbHhvVm90NHUKb2x1OXJ4ajVrRkROY0ZuNEoyZEh5OGVnQnpwOTBTeGRiQms2WnJWOS9aRnZnckcrQ0pQYkZFZnhvamZIUlo0OAp4M2V2WktpVDMvWnBnNEpnOGtsQ05PMWFBRlNGSEJZMmtneGMrcWF0djlzPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QWZmaXJtVHJ1c3QgUHJlbWl1bSBPPUFmZmlybVRydXN0CiMgU3ViamVjdDogQ049QWZmaXJtVHJ1c3QgUHJlbWl1bSBPPUFmZmlybVRydXN0CiMgTGFiZWw6ICJBZmZpcm1UcnVzdCBQcmVtaXVtIgojIFNlcmlhbDogNzg5MzcwNjU0MDczNDM1MjExMAojIE1ENSBGaW5nZXJwcmludDogYzQ6NWQ6MGU6NDg6YjY6YWM6Mjg6MzA6NGU6MGE6YmM6Zjk6Mzg6MTY6ODc6NTcKIyBTSEExIEZpbmdlcnByaW50OiBkODphNjozMzoyYzplMDowMzo2ZjpiMTo4NTpmNjo2Mzo0Zjo3ZDo2YTowNjo2NToyNjozMjoyODoyNwojIFNIQTI1NiBGaW5nZXJwcmludDogNzA6YTc6M2Y6N2Y6Mzc6NmI6NjA6MDc6NDI6NDg6OTA6NDU6MzQ6YjE6MTQ6ODI6ZDU6YmY6MGU6Njk6OGU6Y2M6NDk6OGQ6ZjU6MjU6Nzc6ZWI6ZjI6ZTk6M2I6OWEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZSakNDQXk2Z0F3SUJBZ0lJYll3VVJyR21DdTR3RFFZSktvWklodmNOQVFFTUJRQXdRVEVMTUFrR0ExVUUKQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVJ3d0dnWURWUVFEREJOQlptWnBjbTFVY25WegpkQ0JRY21WdGFYVnRNQjRYRFRFd01ERXlPVEUwTVRBek5sb1hEVFF3TVRJek1URTBNVEF6Tmxvd1FURUxNQWtHCkExVUVCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUnd3R2dZRFZRUUREQk5CWm1acGNtMVUKY25WemRDQlFjbVZ0YVhWdE1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBeEJMZgpxVi8rUWQzZDlaK0s0L2FzNFR4NG1yelk4SDk2b0RNcTNJMGdXNjR0YitlVDJUWndhbWpQamxHamhWdG5CS0FRCkpHOWRLSUxCbDFmWVNDa1R0dUcra1UzZmhReFRHSm9lSktKUGovQ2loUXZMOUNsLzBxUlk3aVpOeWFxb2U1cloKK2pqZVJGY1Y1ZmlNeU5sSTRnMFdKeDBleUlPRkpiZTZxbFZCekFNaVN5MlJqWXZtaWE5bXgrbi9LK2s4ck5yUwpzOFBoYUp5SitIb0FWdDcwVlpWcys3cGszV0tMM3d0M011dGl6Q2FhbTd1cVlvTk10QVo2TU1ncHYrMEdUWmU1CkhNUXhLOVZmdkZNU0Y1eVpWeWxtZDJFaE1RY3VKVW1kR1BMdTh5dHhqTFc2T1FkSmQvenZMcEtRQlkwdEwzZDcKNzBPL05idWEyUGx6cHl6eTBGZnVLRTRtWDQrUWFBa3Z1UGpjQnVrdW1qNVJwOUVpeEFxbk9FaHNzL24vZmF1RwpWK082MW9WNGQ3cEQ2a2gvOXRpK0kyMGV2OUUyYkZoYzhlNmtHVlFhOVFQU2R1YmhqTDA4czlOSVMrTEkrSCtTCnFIWkduRUpsUHFRZXdRY0RXa1l0dUpmenQ5V3lWU0h2dXR4TUFKZjdGSlVuTTcvb1EwZEcwZ2laRm1BN21uN1MKNXUwNDZ1d0JIanhJVmtrSngwdzNBSjZJRHNCejRXOW02WEpITUQ0UTVRc0R5WnBDQUd6RmxINWh4SXJmZjRJYQpDMW5FV1RKM3M3eGdhVlk1L2JRR2V5eldaRGJadlVqdGhCOStwU0tQS3JoQzlJSzMxRk9RZUU0dEd2MkJiMFRYCk93RjBsa0xnQU9JdWErckY3bktzdTcvKzZxcW8rTnoyc25tS3RtY0NBd0VBQWFOQ01FQXdIUVlEVlIwT0JCWUUKRkozQVo2WU1JdGttOVVXcnBtVlNFU2ZZUmF4ak1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFILwpCQVFEQWdFR01BMEdDU3FHU0liM0RRRUJEQVVBQTRJQ0FRQ3pWMDBRWWs0NjVLenF1Qnl2TWlQSXMwbGFVWngyCktJMTVxbGRHRjlYMVV2YTNST2dJUkw4WWhOSUxnTTNGRXYwQVZRVmhoMEhjdFNTZVBNVFl5UHR3bmk5NGxvTWcKTnQ1OEQya1RpS1YxTnBnSXBzYmZyTTdqV05hM1B0NjY4K3MwUU5paWdmVjRQeS9WcGZ6Wm90UmVCQTRYcmY1Qgo4T1d5Y3ZwRWdqTkM2QzFZOTFhTVlqKzZRckNjREZ4K0xtVW1YRk5QQUxKNGZxRU5tUzJOdUIyT29zU3cvV0RRCk1LU095QVJpcWNUdE5kNTZsKzBPT0Y2U0w1TndwYW1jYjZkOUV4MSt4Z2hJc1Y1bjYxRUlKZW5tSld0U0taR2MKMGpsekNGZmVtUWEwVzUwUUJ1SENBS2k0SEVvQ0NoVFF3VUhLKzR3MUlYMkNPUEtwVkpFWk5aT1ViV282eGJMUQp1NG1HaytpYnlRODZwM3E0b2ZCNFJ2cjhOeS9saW9UejMvNEUyYUZvb0M4azRnbVZCdFdWeXVFa2x1dDg5cE1GCnUrMXo2UzNSZFRuWDV5VGIyRTVmUTQrZTBCUTV2MVZ3U0psWE1iU2M3a3FZQTVZd0gyQUc3aHNqL29GZ0l4cEgKWW9XbHpCazBnRyt6ckJyam4vQjdTSzNWQWRsbnRxbHlrK290WnJXeXVPUTlQTEx2VEl6cTZ3ZS9xeldhVllhOApHS2ExcUY2MGcyeHJhVURUbjl6eHcybHJ1ZUZ0Q2ZUeHFsQjJDbnA5ZWhlaFZaWkNtVEVKM1dBUmpRVXdmdWFPClJ0R2RGTnJIRitRRmxvekVKTFVienhRSHNrRDRvNTVCaHJ3RTBHdVd5Q3FBTlAyLzd3YWozVmpGaFQwK2ovNmUKS2VDMnVBbG9HUndZUXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MgTz1BZmZpcm1UcnVzdAojIFN1YmplY3Q6IENOPUFmZmlybVRydXN0IFByZW1pdW0gRUNDIE89QWZmaXJtVHJ1c3QKIyBMYWJlbDogIkFmZmlybVRydXN0IFByZW1pdW0gRUNDIgojIFNlcmlhbDogODQwMTIyNDkwNzg2MTQ5MDI2MAojIE1ENSBGaW5nZXJwcmludDogNjQ6YjA6MDk6NTU6Y2Y6YjE6ZDU6OTk6ZTI6YmU6MTM6YWI6YTY6NWQ6ZWE6NGQKIyBTSEExIEZpbmdlcnByaW50OiBiODoyMzo2YjowMDoyZjoxZDoxNjo4Njo1MzowMTo1NTo2YzoxMTphNDozNzpjYTplYjpmZjpjMzpiYgojIFNIQTI1NiBGaW5nZXJwcmludDogYmQ6NzE6ZmQ6ZjY6ZGE6OTc6ZTQ6Y2Y6NjI6ZDE6NjQ6N2E6ZGQ6MjU6ODE6YjA6N2Q6Nzk6YWQ6Zjg6Mzk6N2U6YjQ6ZWM6YmE6OWM6NWU6ODQ6ODg6ODI6MTQ6MjMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUIvakNDQVlXZ0F3SUJBZ0lJZEpjbGlzYy9lbFF3Q2dZSUtvWkl6ajBFQXdNd1JURUxNQWtHQTFVRUJoTUMKVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNU0F3SGdZRFZRUUREQmRCWm1acGNtMVVjblZ6ZENCUQpjbVZ0YVhWdElFVkRRekFlRncweE1EQXhNamt4TkRJd01qUmFGdzAwTURFeU16RXhOREl3TWpSYU1FVXhDekFKCkJnTlZCQVlUQWxWVE1SUXdFZ1lEVlFRS0RBdEJabVpwY20xVWNuVnpkREVnTUI0R0ExVUVBd3dYUVdabWFYSnQKVkhKMWMzUWdVSEpsYldsMWJTQkZRME13ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUU5NRjRiRlowRAowS0Y1TmJjNlBKSjZ5aFVjeldMem5DWmNCejNsVlBxajFzd1M2dlFVWCtpT0dhc3ZMa2ptckJoRGVLelFOOE85CnNzMHM1a2ZpR3VaanVEMHVMM2pFVDl2MEQ2Um9URlZ5YTVVZFRoaENsWGpNTnp5UjRwdGxLeW1qUWpCQU1CMEcKQTFVZERnUVdCQlNhcnlsNndCRTFOU1pSTUFERGF2NUExYTdXUERBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0RwpBMVVkRHdFQi93UUVBd0lCQmpBS0JnZ3Foa2pPUFFRREF3Tm5BREJrQWpBWENmT0hpRkJhcjhqQVFyOUhYL1ZzCmFvYmd4Q2QwNURoVDF3Vi9HelRqeGkrenlnazhONTNYNTdoRzhmMmg0bkVDTUVKWmgwUFVVZCs2MHdreVdzNkkKZmxjOW5GOUNhL1VITGJYd2dwUDVXVyt1WlBwWTVZc2U0Mk8rdFlITmJ3S01lUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIE89VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLiBPVT1DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1DZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIE89VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLiBPVT1DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIkNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EiCiMgU2VyaWFsOiAyNzk3NDQKIyBNRDUgRmluZ2VycHJpbnQ6IGQ1OmU5OjgxOjQwOmM1OjE4OjY5OmZjOjQ2OjJjOjg5Ojc1OjYyOjBmOmFhOjc4CiMgU0hBMSBGaW5nZXJwcmludDogMDc6ZTA6MzI6ZTA6MjA6Yjc6MmM6M2Y6MTk6MmY6MDY6Mjg6YTI6NTk6M2E6MTk6YTc6MGY6MDY6OWUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDVjOjU4OjQ2OjhkOjU1OmY1OjhlOjQ5OjdlOjc0OjM5OjgyOmQyOmI1OjAwOjEwOmI2OmQxOjY1OjM3OjRhOmNmOjgzOmE3OmQ0OmEzOjJkOmI3OjY4OmM0OjQwOjhlCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdXpDQ0FxT2dBd0lCQWdJREJFVEFNQTBHQ1NxR1NJYjNEUUVCQlFVQU1INHhDekFKQmdOVkJBWVRBbEJNCk1TSXdJQVlEVlFRS0V4bFZibWw2WlhSdklGUmxZMmh1YjJ4dloybGxjeUJUTGtFdU1TY3dKUVlEVlFRTEV4NUQKWlhKMGRXMGdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhreElqQWdCZ05WQkFNVEdVTmxjblIxYlNCVQpjblZ6ZEdWa0lFNWxkSGR2Y21zZ1EwRXdIaGNOTURneE1ESXlNVEl3TnpNM1doY05Namt4TWpNeE1USXdOek0zCldqQitNUXN3Q1FZRFZRUUdFd0pRVERFaU1DQUdBMVVFQ2hNWlZXNXBlbVYwYnlCVVpXTm9ibTlzYjJkcFpYTWcKVXk1QkxqRW5NQ1VHQTFVRUN4TWVRMlZ5ZEhWdElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVNJdwpJQVlEVlFRREV4bERaWEowZFcwZ1ZISjFjM1JsWkNCT1pYUjNiM0pySUVOQk1JSUJJakFOQmdrcWhraUc5dzBCCkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTQvdDlvM0s2d3ZESkZJZjFhd0ZPNFc1QUI3cHRKMTEvOTFzdHMxckgKVVYrcnBES21ZWWUyYmcrRzBqQUNsL2pYYVZlaEdEbGRhbVI1eGdGWnJEd3hTamg4MGdUU1N5am9JRjg3QjZMTQpUWFBiODY1UHgxYlZXcWVXaWZyenEyalVJNFpaSjg4Sko3eXNibktESERCeTMrQ2k2ZExoZEhVWnZTcWVleFZVCkJCdlhRem10VlNqRjRocTc5TURrcmpoSk04eDJoWjg1UmRLa252SVNqRkg0Zk9RdGYvV3NYK3NXbjdFdDBick0Ka1VKM1RDWEprRGh2Mi9ETSs0NGVsMWsrMVdCTzVnVW83VWw1RTB1NlNOc3YrWExUT2NyK0g5ZzBjdlcwUU04eApBY1BzM2hFdEYxMGZ1RkRSWGhtbmFkNEhNeWpLVUpYNXAxVExWSVpRUmFuNVNRSURBUUFCbzBJd1FEQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlFJZHMzTEIvOGs5c1hON2J1UXZPS0VOMFoxOXpBT0JnTlYKSFE4QkFmOEVCQU1DQVFZd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFLYW9yU0xPQVQybW8vOWkwRWlkaTE1eQpzSGhFNDl3Y3J3bjlJMGo2dlNyRXVWVUV0UkNqalNmZUM0SmowTzdlRERkNVFWc2lzckNhUVZ5bWNPRFUwSGZMCkk5TUE0R3hXTCtGcERRM1pxcjhoZ1ZEWkJxV28vNVUzMEtyKzRyUDFtUzFGaElybFFnblhkQUl2OTRuWW1lbTgKSjlSSGpib05SaHgzenhTa0hMbWtNY1NjS0hRRE5QOHpHU2FsNlExMHR6Nlh4bmJvSjVhalp0M2hydkpCVzhxWQpWb056Y09TR0d0SXhRYm92dmkwVFduWnZUdWhPZ1E0L1d3TWlvQksrWmxnUlNzc0R4TFFxS2kyV0YrQTVWTHhJCjAzWW5uWm90QnFiSjdEblNxOXVmbWdzbkFqVXBzVUNWNS9ub25GV0lHVWJXdHpUMWZzNDVtdGs0OFZIM1R5dz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRXQ0EgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVRBSVdBTi1DQSBPVT1Sb290IENBCiMgU3ViamVjdDogQ049VFdDQSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VEFJV0FOLUNBIE9VPVJvb3QgQ0EKIyBMYWJlbDogIlRXQ0EgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IGFhOjA4OjhmOmY2OmY5OjdiOmI3OmYyOmIxOmE3OjFlOjliOmVhOmVhOmJkOjc5CiMgU0hBMSBGaW5nZXJwcmludDogY2Y6OWU6ODc6NmQ6ZDM6ZWI6ZmM6NDI6MjY6OTc6YTM6YjU6YTM6N2E6YTA6NzY6YTk6MDY6MjM6NDgKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJmOmQ4OjhmOmUxOjEwOjFjOjQxOmFlOjNlOjgwOjFiOmY4OmJlOjU2OjM1OjBlOmU5OmJhOmQxOmE2OmI5OmJkOjUxOjVlOmRjOjVjOjZkOjViOjg3OjExOmFjOjQ0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZXpDQ0FtT2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCZk1Rc3dDUVlEVlFRR0V3SlVWekVTCk1CQUdBMVVFQ2d3SlZFRkpWMEZPTFVOQk1SQXdEZ1lEVlFRTERBZFNiMjkwSUVOQk1Tb3dLQVlEVlFRRERDRlUKVjBOQklGSnZiM1FnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTURnd09ESTRNRGN5TkRNegpXaGNOTXpBeE1qTXhNVFUxT1RVNVdqQmZNUXN3Q1FZRFZRUUdFd0pVVnpFU01CQUdBMVVFQ2d3SlZFRkpWMEZPCkxVTkJNUkF3RGdZRFZRUUxEQWRTYjI5MElFTkJNU293S0FZRFZRUUREQ0ZVVjBOQklGSnZiM1FnUTJWeWRHbG0KYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQgpBUUN3Zm5LNHBBT1U1cWZlQ1RpUlNoRkFoNmQ4V1dRVWU3VVJFTjMrdjlYQXUxYmloU1gwTlhJUCtGUFFRZUZFCkFjSzBITU14UWhaSGhUTWlkcklLYncvbEpWQlBoWWErdjVndUVHY2V2aEVGaGdXUXhGblFmSGdRc0lCY3QrSEgKSzNYTGZKK3V0ZEdkSXpkanA5eENvaTJTQkJ0UXdYdTRQaHZKVmdTTEwxS2JyYWxXNmNIL3JhbFloekMyZ2ZlWApSZndaVnpzcmIrUkg5SmxGL2gzeCtKZWppQjAzSEZ5UDRIWWxtbEQ0b0ZUL1JKQjJJOUl5eHNPckJyLzgrNy96CnJYMlNZZ0piS2RNMW81T2FRMlJnWGJMNk12ODdCSzlOUUdyNXgrUHZJLzFyeStVUGl6Z043Z3I4L2crWW56QXgKM1d4U1pmbUxnYjRpNFJ4WUE3cVJHNGtIQWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJScU9Gc21qZDZMV3ZKUGVsU0RHUmpqQ0RXbXVqQU5CZ2txCmhraUc5dzBCQVFVRkFBT0NBUUVBUE5WM1BkcmZpYnFIREFoVWFpQlFrcjZ3UVQyNUptU0RDaS9vUU1DWEtDZUMKTUVySmsvOXE1NllBZjRsQ210WVI1VlBPTDh6eTJnWEUvdUpReERxR2ZjemFmaEFKTzVJMUtsT3kvdXNyQmRscwpYZWJRNzlOcVpwNFZLSVY2NklJQXJCNm5DV2xXUXROb1VSaStWSnEvUkVHNlNiNGd1bWxjN3JoM3pjNXNINjJECmxoaDlEclVVT1lUeEtPa3RvNTU3SG5weVdvT3plVy92dFB6UUNxVllUMGJmKzIxNVdmS0VJbEt1RDh6N2ZEdm4KYXNwSFljTjYrTk9TQkIrNElJVGhObFFXeDBEZU80cHozTi9HQ1V6ZjdOci8xRk5Db2NueVloMGlnenlYeGZrWgpZaWVzWlNMWDB6ekc1WTZ5VTh4Snpyd3cvbnNPTTVENzdkSVVrUjhIcnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1TRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuIE9VPVNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMgojIFN1YmplY3Q6IE89U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELiBPVT1TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTIKIyBMYWJlbDogIlNlY3VyaXR5IENvbW11bmljYXRpb24gUm9vdENBMiIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDZjOjM5OjdkOmE0OjBlOjU1OjU5OmIyOjNmOmQ2OjQxOmIxOjEyOjUwOmRlOjQzCiMgU0hBMSBGaW5nZXJwcmludDogNWY6M2I6OGM6ZjI6Zjg6MTA6YjM6N2Q6Nzg6YjQ6Y2U6ZWM6MTk6MTk6YzM6NzM6MzQ6Yjk6Yzc6NzQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDUxOjNiOjJjOmVjOmI4OjEwOmQ0OmNkOmU1OmRkOjg1OjM5OjFhOmRmOmM2OmMyOmRkOjYwOmQ4OjdiOmI3OjM2OmQyOmI1OjIxOjQ4OjRhOmE0OjdhOjBlOmJlOmY2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURCZE1Rc3dDUVlEVlFRR0V3SktVREVsCk1DTUdBMVVFQ2hNY1UwVkRUMDBnVkhKMWMzUWdVM2x6ZEdWdGN5QkRUeTRzVEZSRUxqRW5NQ1VHQTFVRUN4TWUKVTJWamRYSnBkSGtnUTI5dGJYVnVhV05oZEdsdmJpQlNiMjkwUTBFeU1CNFhEVEE1TURVeU9UQTFNREF6T1ZvWApEVEk1TURVeU9UQTFNREF6T1Zvd1hURUxNQWtHQTFVRUJoTUNTbEF4SlRBakJnTlZCQW9USEZORlEwOU5JRlJ5CmRYTjBJRk41YzNSbGJYTWdRMDh1TEV4VVJDNHhKekFsQmdOVkJBc1RIbE5sWTNWeWFYUjVJRU52YlcxMWJtbGoKWVhScGIyNGdVbTl2ZEVOQk1qQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU5BVgpPVkt4VXJPNnhWbUN4RjFTcmpwRFpZQkx4L0tXdk5zMmw5YW1aSXlvWHZEakNoejMzNWM5UzY3Mlhld2h0VUdyCnpibCtkcCsrK1Q0Mk5LQTd3Zll4RVVWMGt6MVhnTVg1aVpuSzVhdHExTFhhUVpBUXdkYldRb25Ddi9RNEVwVk0KVkFYM051UkZnM3NVWmRiY0RFM1IzbjRNcXp2RUZiNDZWcVphYjNacFVxbDZ1Y2pyYXBwZFV0QXRDbXMxRmdrUQpoTkJxeWpvR0FEZEg1SDVYVHorTDYyZTRpS3JGdmxOVnNwSEVmYm13aFJrR2VDN2JZUnI2aGZWS2thSG5GdFdPCm9qbmZsTGh3SHlnL2kveEFYbU9EUElNcUdwbHJ6OTVaYWp2OGJ4YlhILzFLRU90T2doWTZyQ2NNVS9HdDFTU3cKYXdOUXdTMDhGdDFFTkNjYWRmc0NBd0VBQWFOQ01FQXdIUVlEVlIwT0JCWUVGQXFGcVhkbEJaaDhRSUg0RDVjcwpPUEVLN0R6UE1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUEwR0NTcUdTSWIzCkRRRUJDd1VBQTRJQkFRQk1PcU5FckxsRnNjZVRmc2dMQ2tMZlpPb2M3bGxzQ0xxSlgycktTcFdlZW84SHhkcEYKY29KeERqclN6RytudEtFanUvWWtuOHNYL295bXpzTFMyOHlOL0hIOEF5bkJiRjB6WDJTMlpUdUpieGgyZVBYYwpva2dmR1QrT2srdngraGZ1elU3akJCSlYxdVhrM2ZzK0JYemlIVjdHcDd5WFQyZzY5ZWt1Q2tPMnIxZGNZbWg4CnQvMmppb1NnckdLK0t3bUhOUEJxQWJ1YktWWTgvZ0EzenlOczhVNnF0blJHRW15UjdqVFY3SnFSNTBTK2tERnkKMVVrQzlnTGw5Qi9yZk5tV1Zhbi83SXI1bVVmL05Wb0NxZ1RMaWx1SGNTbVJ2YVMwZWcyOW12VlhJd0FISVJjLwpTam5SQlVrTHA3WTNnYVZkaktvelhvRW9mS2Q5SitzQXJvMDMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTEgTz1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTEgTz1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eQojIExhYmVsOiAiSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMSIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDczOjlmOjRjOjRiOjczOjViOjc5OmU5OmZhOmJhOjFjOmVmOjZlOmNiOmQ1OmM5CiMgU0hBMSBGaW5nZXJwcmludDogZmU6NDU6NjU6OWI6Nzk6MDM6NWI6OTg6YTE6NjE6YjU6NTE6MmU6YWM6ZGE6NTg6MDk6NDg6MjI6NGQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJjOjEwOjRmOjE1OmE0OjhiOmU3OjA5OmRjOmE1OjQyOmE3OmUxOmQ0OmI5OmRmOjZmOjA1OjQ1OjI3OmU4OjAyOmVhOmE5OjJkOjU5OjU0OjQ0OjI1OjhhOmZlOjcxCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTVRDQ0F4bWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURDQmxURUxNQWtHQTFVRUJoTUNSMUl4ClJEQkNCZ05WQkFvVE8waGxiR3hsYm1saklFRmpZV1JsYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjEKZEdsdmJuTWdRMlZ5ZEM0Z1FYVjBhRzl5YVhSNU1VQXdQZ1lEVlFRREV6ZElaV3hzWlc1cFl5QkJZMkZrWlcxcApZeUJoYm1RZ1VtVnpaV0Z5WTJnZ1NXNXpkR2wwZFhScGIyNXpJRkp2YjNSRFFTQXlNREV4TUI0WERURXhNVEl3Ck5qRXpORGsxTWxvWERUTXhNVEl3TVRFek5EazFNbG93Z1pVeEN6QUpCZ05WQkFZVEFrZFNNVVF3UWdZRFZRUUsKRXp0SVpXeHNaVzVwWXlCQlkyRmtaVzFwWXlCaGJtUWdVbVZ6WldGeVkyZ2dTVzV6ZEdsMGRYUnBiMjV6SUVObApjblF1SUVGMWRHaHZjbWwwZVRGQU1ENEdBMVVFQXhNM1NHVnNiR1Z1YVdNZ1FXTmhaR1Z0YVdNZ1lXNWtJRkpsCmMyVmhjbU5vSUVsdWMzUnBkSFYwYVc5dWN5QlNiMjkwUTBFZ01qQXhNVENDQVNJd0RRWUpLb1pJaHZjTkFRRUIKQlFBRGdnRVBBRENDQVFvQ2dnRUJBS2xUQU9NdXB2YU8rbURZTFpVKytDd3FWRTdOdVlSaGxGaFBqejJMNUVQegpkWW1OVWVURE45S0tpRTE1SHJjUzNVTjRTb3FTNXRkSTFRK2tPaWxFTmJnSDltZ2RWYzA0VWZDTUpER0ZyNFBKCmZlbDNyKzBhZTUwWCtiT2RPRkFQcGxwNWtZQ3ZONjZtMHpIN3RTWUpuVHhhNzFIRks5K1dYZXN5SGdMYWNFbnMKYmd6SW1qZU45L0UyWUVzbUxJS2UwSGp6RFE5anBGRXc0ZmtySnhJSDJPcTlHR0tZc0ZrM2ZiN3U4eUJSUWxxRAo3NU82YVJYeFlwMmZtVG1Db2JkMExvdlV4UXQ3TC9ESUN0bzllUXFha3h5bEtISnprVU9hcDlGTmhZUzVxWFNQCkZFREgzTjZzUVdSc3RCbWJBbU50SkdTUFJMSWw2czVkZEF4ak1seU5oK1VDQXdFQUFhT0JpVENCaGpBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01Bc0dBMVVkRHdRRUF3SUJCakFkQmdOVkhRNEVGZ1FVcHBGQy9STmhTaU9lQ0tRcAo1ZGdUQkNQdVFTVXdSd1lEVlIwZUJFQXdQcUE4TUFXQ0F5NW5jakFGZ2dNdVpYVXdCb0lFTG1Wa2RUQUdnZ1F1CmIzSm5NQVdCQXk1bmNqQUZnUU11WlhVd0JvRUVMbVZrZFRBR2dRUXViM0puTUEwR0NTcUdTSWIzRFFFQkJRVUEKQTRJQkFRQWY3M2xCNFh0dVA3S01oamRDU2s0Y054Nk5acm9rZ2NsUEVnOGh3QU9YaGlWdFhkTWlLYWhzb2cycAo2ejBHVzVrNng4ekRtalIvcXc3SVRoemgrdVRjelEyK3Z5VCtiT2Ryd2czSUJwNU9qV0VvcG1yOTVmWmk2aGc4ClRxQlRuYkk2bk91bG5KRVd0azJDNEF3RlNLbHM5Y3o0eTUxSnRQQUNwZjF3QSsyS0lhV3VFNFpKd3pOenZvYzcKZElzWFJTWk1GcEdEL21kOXpVMWpaL3J6QXhLV2VBYU5zV2Z0amorK24wOEM5Yk1KTC9OTWg5OHF5NVY4QWN5cwpObnEvb25ONjk0L0J0WnFoRkxLUE01OE43eUxjWm51RXZVVVhCajA4eXJsM05JL0s2czgvTVQ3amlPT0FTU1hJCmw3V2RtcGxOc0R6NFNnQ2JaTjJmT1V2Uko5ZTQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFjdGFsaXMgQXV0aGVudGljYXRpb24gUm9vdCBDQSBPPUFjdGFsaXMgUy5wLkEuLzAzMzU4NTIwOTY3CiMgU3ViamVjdDogQ049QWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBIE89QWN0YWxpcyBTLnAuQS4vMDMzNTg1MjA5NjcKIyBMYWJlbDogIkFjdGFsaXMgQXV0aGVudGljYXRpb24gUm9vdCBDQSIKIyBTZXJpYWw6IDYyNzE4NDQ3NzI0MjQ3NzA1MDgKIyBNRDUgRmluZ2VycHJpbnQ6IDY5OmMxOjBkOjRmOjA3OmEzOjFiOmMzOmZlOjU2OjNkOjA0OmJjOjExOmY2OmE2CiMgU0hBMSBGaW5nZXJwcmludDogZjM6NzM6YjM6ODc6MDY6NWE6Mjg6ODQ6OGE6ZjI6ZjM6NGE6Y2U6MTk6MmI6ZGQ6Yzc6OGU6OWM6YWMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU1OjkyOjYwOjg0OmVjOjk2OjNhOjY0OmI5OjZlOjJhOmJlOjAxOmNlOjBiOmE4OjZhOjY0OmZiOmZlOmJjOmM3OmFhOmI1OmFmOmMxOjU1OmIzOjdmOmQ3OjYwOjY2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdXpDQ0E2T2dBd0lCQWdJSVZ3b1JsMExFNDh3d0RRWUpLb1pJaHZjTkFRRUxCUUF3YXpFTE1Ba0dBMVVFCkJoTUNTVlF4RGpBTUJnTlZCQWNNQlUxcGJHRnVNU013SVFZRFZRUUtEQnBCWTNSaGJHbHpJRk11Y0M1QkxpOHcKTXpNMU9EVXlNRGsyTnpFbk1DVUdBMVVFQXd3ZVFXTjBZV3hwY3lCQmRYUm9aVzUwYVdOaGRHbHZiaUJTYjI5MApJRU5CTUI0WERURXhNRGt5TWpFeE1qSXdNbG9YRFRNd01Ea3lNakV4TWpJd01sb3dhekVMTUFrR0ExVUVCaE1DClNWUXhEakFNQmdOVkJBY01CVTFwYkdGdU1TTXdJUVlEVlFRS0RCcEJZM1JoYkdseklGTXVjQzVCTGk4d016TTEKT0RVeU1EazJOekVuTUNVR0ExVUVBd3dlUVdOMFlXeHBjeUJCZFhSb1pXNTBhV05oZEdsdmJpQlNiMjkwSUVOQgpNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQXA4YkVwU21rTE8vbEdNV3dVS052ClVUdWZDbHJKd2tnNENzSWNvQmgva2JXSHVVQS8zUjFvSHdpRDFTMGVpS0Q0ajFhUGJaa0NrcEFXMVY4SWJJblgKNGF5OElNS3g0SU5SaW1sTkFKWmFieS9BUkg2akR1U1J6Vmp1M1B2SEhrVkgzU2U1Q0FHZnBpRWQ5VUV0TDB6OQpLSzNnaXEwaXRGWmxqb1pVajVOREtkNDVSbmlqTUNPNnpmQjlFMWZBWGRLRGEwaE14S3VmZ0ZwYk9yM0pweUkvCmdDY3pXdzYzaWd4ZEJ6Y0l5MnpTZWtjaVJEWEZ6TXd1anQwcTdiZDlaZzFmWVZFaVZSdmpSdVBqUGRBMVlwcmIKcnhUSVc2SE1pUnZoTUNiOG9Kc2ZnYWRISHdUcm96bVNCcCtaMDcvVDZrOVFuQm4rbG9jZVBHWDJveGdrZzRZUQo1MVErcURwMkpFK0JJY1hqRHdMNGs1UkhJTHYrMUE3VGFMbmR4SHFFZ3VOVFZIbmQyNXpTOGdlYkxyYThQdTJGCmJlOGxFZktYR2tKaDkwcVg2SXV4RUFmNlpZR3lvam5QOXp6L0dQdkc4VnFMV2VJQ3JIdVMwRTRVVDFsRjlneGUKS0YrdzZEOUZ6OCt2bTIvN2hOTjNXcFZ2ckpTRW51Njh3RXFQU3BQNFJDSGlNVVZoVUU0UTJPTTFmRXdadE40Rgp2Nk1HbjhpMXplUWYxeGNHRFhxVmRGVU5hQnI4RUJ0aVpKMXQ0SldndzVRSFZ3MFU1cjBGKzdpZjV0K0w0c2JuCmZwYjJVOFdBTkZBb1dQQVNVSEVYTUxybWVHTzg5TEt0bXl1eS91RTVqRjY2Q3lDVTNudUR1UC9qVm8yM0VlazcKalBLeHdWMmRwQXRNSzlteUdQVzFuMHNDQXdFQUFhTmpNR0V3SFFZRFZSME9CQllFRkZMWWlEckluM2htN1luegplemh3bE1rQ0FqYlFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVVXRpSU9zaWZlR2J0CmlmTjdPSENVeVFJQ050QXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRQUwKZTNLSHdHQ21TVXlJV09ZZGlQY1VaRWltMkZnS0RrOFROZDgxSGRUdEJqSElnVDVxMWQwN0dqTHVrRDBSMGk3MApqc05qTGlObXNHZStiN2JBRXpsZ3FxSTBKWk4xVXQ2bm5hME9oNGxTY1dvV1BCa2RnL2lhS1dXKzlEK2EyZkR6CldvY2hjWUJOeStBNG16KzcrdUF3VGMrRzAyVVFHUmpSbHdLeEszSkNhS3lndlU1YTJoaS9hNWlCMFAyYXZsNFYKU00wUkZibkFLVnkwNklqM1BqYXV0Mkw5SG1MZWNIZ1FIRWhiMnJ5a09McG43VlUrWGxmZjFBTkFUSUdrMGs5agpwd2xDQ1JUOEFLbkNnSE5QTHNCQTJSRjdTT3A2QXNEVDZ5Z0JKbGgwd2NCekltMlRsZjA1ZmJzcTQvYUM0eXlYClgwNGZrWlQ2L2l5ajJIWWF1RTJ5T0UrYitoMUlZSGttNHZQOXFkQ2E2SENQU1hyVzViMEtEdHN0ODQyLzYrT2sKZmN2SGxYSG8ycU44eGNMNGRKSUVHNGFzcENKVFFMYXMva3gyei91VU1zQTFuM1kvYnVXUWJxQ21KcUs0TEw3UgpLNFg5cDJqSXVnRXJzV3gwSGJoemxlZnV0OGNsOEFCTUFMSit0Z3VMSFBQQVVKNGx1ZUFJM2pabS96ZWwwYnRVClpDekpKN1ZMa241bC85TXQ0YmxPdkgra1FTR1FRWGVtT1IvcW51T2YwR1p2QmV5cWRuNi9heGFnNjdYSC9KSlUKTHlzUkp5VTNlRXhSYXJEenpGaGRGUEZxU0JYL3dnZTJzWTBQamx4UVJyTTl2d0dZVDdKWlZFYytOSHQ0YlZhVApMblBxWmloNHpSMFV2NkNQTHk2NExvN3lGSXJNNmJWOCsyeWRES1hobGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1UcnVzdGlzIExpbWl0ZWQgT1U9VHJ1c3RpcyBGUFMgUm9vdCBDQQojIFN1YmplY3Q6IE89VHJ1c3RpcyBMaW1pdGVkIE9VPVRydXN0aXMgRlBTIFJvb3QgQ0EKIyBMYWJlbDogIlRydXN0aXMgRlBTIFJvb3QgQ0EiCiMgU2VyaWFsOiAzNjA1MzY0MDM3NTM5OTAzNDMwNDcyNDk4ODk3NTU2MzcxMDU1MwojIE1ENSBGaW5nZXJwcmludDogMzA6Yzk6ZTc6MWU6NmI6ZTY6MTQ6ZWI6NjU6YjI6MTY6Njk6MjA6MzE6Njc6NGQKIyBTSEExIEZpbmdlcnByaW50OiAzYjpjMDozODowYjozMzpjMzpmNjphNjowYzo4NjoxNToyMjo5MzpkOTpkZjpmNTo0Yjo4MTpjMDowNAojIFNIQTI1NiBGaW5nZXJwcmludDogYzE6YjQ6ODI6OTk6YWI6YTU6MjA6OGY6ZTk6NjM6MGE6Y2U6NTU6Y2E6Njg6YTA6M2U6ZGE6NWE6NTE6OWM6ODg6MDI6YTA6ZDM6YTY6NzM6YmU6OGY6OGU6NTU6N2QKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURaekNDQWsrZ0F3SUJBZ0lRR3grdHRpRDVKTk0yYS9mSDhZeWdXVEFOQmdrcWhraUc5dzBCQVFVRkFEQkYKTVFzd0NRWURWUVFHRXdKSFFqRVlNQllHQTFVRUNoTVBWSEoxYzNScGN5Qk1hVzFwZEdWa01Sd3dHZ1lEVlFRTApFeE5VY25WemRHbHpJRVpRVXlCU2IyOTBJRU5CTUI0WERUQXpNVEl5TXpFeU1UUXdObG9YRFRJME1ERXlNVEV4Ck16WTFORm93UlRFTE1Ba0dBMVVFQmhNQ1IwSXhHREFXQmdOVkJBb1REMVJ5ZFhOMGFYTWdUR2x0YVhSbFpERWMKTUJvR0ExVUVDeE1UVkhKMWMzUnBjeUJHVUZNZ1VtOXZkQ0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRApnZ0VQQURDQ0FRb0NnZ0VCQU1WUWU1NDdOZERmeEl6TmpwdnRvOEEybWZSQzZxYytnSU1QcHFkWmg4bVFSVU4rCkFPcUdlU29EdlQwM21ZbG10K1dLVm9hVG5HaExhQVNNazVNQ1BqRFNOem9pWVlrY2hVNTlqOVd2ZXpYMmZpaEgKaVRIY0RubGtINW5TVzdyK2YyQy9yZXZuUERncGFpL2xrUXRWLyt4dldOVXR5ZDVNWm5HUEROY0UyZ2ZtSGhqagp2U2tDcVBvYzRWdTVnNmhCU0x3YWNZM25ZdVV0c3V2ZmZNL2JxMXJLTWZGTUl2TUZFL2VDK1hONURMN1hTeHpBCjBSVThrMEZrMGVhK0l4Y2lBSWxlSDJ1bHJHNm5TNHp0bzNMbXIyTk5MNFhTRkRXYUxrNk02aktZS0lhaGtRbEIKT3JUaDQvTDY4TWtLb2tIZHFlTUR4NGdWT3h6VUdwVFhuMlJaRW0wQ0F3RUFBYU5UTUZFd0R3WURWUjBUQVFILwpCQVV3QXdFQi96QWZCZ05WSFNNRUdEQVdnQlM2K25FbGVZdFhRU1VoaGd0eDY3SmtEb3NoWnpBZEJnTlZIUTRFCkZnUVV1dnB4SlhtTFYwRWxJWVlMY2V1eVpBNkxJV2N3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUg1WS8vMDEKR1gyY0dFK2VzQ3U4am93VS95eWcya2RidysrQkxhOEY2blJJVy9NK1RnZkhiY1d6azg4aU5WeTJQM1VuWHdtVwp6YUQrdmtBTVhCSlYrSk9DeWlucFhqOVdWNHM0TnZkRkdrd296WjVCdU8xV1RJU2tRTWk0c0tVcmFYQUVhc1A0CjFCSXkrUTdEc2R3eWhFUXNiOHRHRCtwbVFROVA4VmlscGcwTkQySGVwWjVkZldXaFBCZm5xRlZPNzZESDdjWkUKZjFUMW8rQ1A4SHhWSW84cHRvR2o0VzFPTEJ1QVoreXRJSjhNWW1IVmwvOUQ3UzNCMmwwcEtvVS9yR1h1aGc4RgpqWkJmMys2ZjlML3VIZnVZNUgrUUs0UjRFQTVzU1ZQdkZWdGxSa3BkcjdyN09uSWR6ZllsaUI2WHpDR2NLUUVOClpldFgyZk5YbHJ0SXpZRT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUJ1eXBhc3MgQ2xhc3MgMiBSb290IENBIE89QnV5cGFzcyBBUy05ODMxNjMzMjcKIyBTdWJqZWN0OiBDTj1CdXlwYXNzIENsYXNzIDIgUm9vdCBDQSBPPUJ1eXBhc3MgQVMtOTgzMTYzMzI3CiMgTGFiZWw6ICJCdXlwYXNzIENsYXNzIDIgUm9vdCBDQSIKIyBTZXJpYWw6IDIKIyBNRDUgRmluZ2VycHJpbnQ6IDQ2OmE3OmQyOmZlOjQ1OmZiOjY0OjVhOmE4OjU5OjkwOjliOjc4OjQ0OjliOjI5CiMgU0hBMSBGaW5nZXJwcmludDogNDk6MGE6NzU6NzQ6ZGU6ODc6MGE6NDc6ZmU6NTg6ZWU6ZjY6Yzc6NmI6ZWI6YzY6MGI6MTI6NDA6OTkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDlhOjExOjQwOjI1OjE5OjdjOjViOmI5OjVkOjk0OmU2OjNkOjU1OmNkOjQzOjc5OjA4OjQ3OmI2OjQ2OmIyOjNjOmRmOjExOmFkOmE0OmEwOjBlOmZmOjE1OmZiOjQ4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGV1RDQ0EwR2dBd0lCQWdJQkFqQU5CZ2txaGtpRzl3MEJBUXNGQURCT01Rc3dDUVlEVlFRR0V3Sk9UekVkCk1Cc0dBMVVFQ2d3VVFuVjVjR0Z6Y3lCQlV5MDVPRE14TmpNek1qY3hJREFlQmdOVkJBTU1GMEoxZVhCaGMzTWcKUTJ4aGMzTWdNaUJTYjI5MElFTkJNQjRYRFRFd01UQXlOakE0TXpnd00xb1hEVFF3TVRBeU5qQTRNemd3TTFvdwpUakVMTUFrR0ExVUVCaE1DVGs4eEhUQWJCZ05WQkFvTUZFSjFlWEJoYzNNZ1FWTXRPVGd6TVRZek16STNNU0F3CkhnWURWUVFEREJkQ2RYbHdZWE56SUVOc1lYTnpJRElnVW05dmRDQkRRVENDQWlJd0RRWUpLb1pJaHZjTkFRRUIKQlFBRGdnSVBBRENDQWdvQ2dnSUJBTmZIWHZmQkI5UjMrME1oOVBUMWFlVHVNZ0hibzRZZjVGa051dWQxZzFMcgo2aHhoRlVpN0hRZktqSzZ3M0phZDZzTmdrb2FDS0hPY1ZnYi9TMlR3RENvM1NiWGx6d3g4N3ZGS3UzTXdaZlBWCkw0TzJmdVBuOVo2cllQblQ4WjJTZElya0hKYXNXNERwdGZReGg2TlIvTWQrb1crT1UzZlVsOEZWTTVJK0dDOTEKMUsyR1NjdVZyMVFHYk5nR0U0MWIvK0VtR1ZuQUpMcUJjWG1RUkZCb0pKUmZ1TE1SOFNsQllhTkJ5eU0yMWNIeApNbEFRVG4vMGhwUHNoTk9PdkV1L1hBRk9CejNjRklxVUNxVHFjL3NMVWVnVEJ4ajZEdkVyMFZRVmZUemg5N1FaClFtZGlYbmZnb2xYc3R0bHBGOVU2cjBUdFNzV2U1SG9uZk9WMTE2ckxKZWZmYXdyYkQwMlRUcWlnelhzdThsa0IKYXJjTnVBZUJmb3M0R3pqbUNsZVpQZTRoNktQMURCYmRpK3cwanB3cUhBQVZGNDFvZzlKd254Z0l6UkZvMWNscgpVczNFUm8vY3RmUFlWM01lNlpRNUJML1QzampldEZQc2FSeWlmc1NQNUJ0d3JmS2krZnYzRm1SbWFaOUpVYUxpCkZSaG5Ca3AvMVd5MVRiTXo0R0hyWGI3cG1BOHkxeDFMUEM1YUFWS1JDZkxmNm8zWUJrQmpxaEhrL3NNM25oUlMKUC9UaXpQSmhrOUg5WjJ2WFVxNi9hS3RBUTZCWE5WTjQ4RlA0WVVJSFpNYlhiNXRNT0ExanJHS3ZOb3VpY3dvTgo5U0c5ZEtwTjZuSURTZHZIWHgxaVk4ZjkzWkhzTSs3MWJiUnVNR2pleU5ZbXNIVmVlN1FISUppaGRqSzRUV3hQCkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZNbUFkK0Jpa29MMVJwenoKdXZkTXc5NjRvNjA1TUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBVTE4aAo5YnF3T2xJNUxKS3diQURKNzg0Zzd3YnlscDdwcEhSL2VoYjh0L1cyK3hVYlA2dW13SEpkRUxGeDdyeFA0NjJzCkEyMHVjUzZ2eE9PdG83ME1FYWUwLzBxeWV4QVFINmRYUWJMQXJ2UXNXZFpIRUlqeklWRXBNTXBnaHE5R3F4M3QKT2x1d2xONUU0MEVJb3NIc0hkYjlUN2JXUjlBVUM4cm15clY3ZDM1QkgxNkR4N2FNT1phd1A1YUJRVzlna09MbworZnNpY2RsOXN6MUd2N1NFcjVBY0Q0OFNhcS92N2g1NnJnSktpaGNyZHY2c1ZJa2tMRTgvdHJLblRveW9rWmY3CktjWjdYQzI1eTJhMnQ2aGJFbEdGdFFsK1luaHcvcWxxWUxZZERua00vY3JxSklCeXc1Yy84bmVyUXlJS3grdTIKRElTQ0xJQnJRWW9Jd091bGE5K1pFc3VLMVY2QURKSGdKZ2cyU01YNk9CRTEveVdETGZKNnY5cjlqdjZseTBVcwpIOFNJVTY1M0R0bWFkc1dPTEIyanV0WHNNcTdBcXF6MzBYcE42OVFINGtqM0lvNndwSjlxem82eXNtRDBveUxRCkkrdVVXbnBwM1ErL1FGZXNhMWxRMmFPWjRXNytqUUY1SnlNVjNwS2Rld2xOV3VkTFNEQmFHT1lLYmVhUDROSzcKNXQ5OGJpR0N3V2c1VGJTWVdHWml6RXFRWHNQNkp3U3hlUlYwbWN5K3JTRGVKbUFjNjFaUnBxUHE1S00vcC85aAozUEZhVFd3eUkwUHVyS2p1N2tvU0NUeGRjY0srZWZyQ2gyZ2RDLzFjYWN3RzBKcDlWSmtxeVRrYUdhOUxLa1B6ClkxMWFXT0l2NHgza3FkYlFDdENldjllQkNmSEp4eVlOckpnV1ZxQT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUJ1eXBhc3MgQ2xhc3MgMyBSb290IENBIE89QnV5cGFzcyBBUy05ODMxNjMzMjcKIyBTdWJqZWN0OiBDTj1CdXlwYXNzIENsYXNzIDMgUm9vdCBDQSBPPUJ1eXBhc3MgQVMtOTgzMTYzMzI3CiMgTGFiZWw6ICJCdXlwYXNzIENsYXNzIDMgUm9vdCBDQSIKIyBTZXJpYWw6IDIKIyBNRDUgRmluZ2VycHJpbnQ6IDNkOjNiOjE4OjllOjJjOjY0OjVhOmU4OmQ1Ojg4OmNlOjBlOmY5OjM3OmMyOmVjCiMgU0hBMSBGaW5nZXJwcmludDogZGE6ZmE6Zjc6ZmE6NjY6ODQ6ZWM6MDY6OGY6MTQ6NTA6YmQ6Yzc6YzI6ODE6YTU6YmM6YTk6NjQ6NTcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGVkOmY3OmViOmJjOmEyOjdhOjJhOjM4OjRkOjM4OjdiOjdkOjQwOjEwOmM2OjY2OmUyOmVkOmI0Ojg0OjNlOjRjOjI5OmI0OmFlOjFkOjViOjkzOjMyOmU2OmIyOjRkCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGV1RDQ0EwR2dBd0lCQWdJQkFqQU5CZ2txaGtpRzl3MEJBUXNGQURCT01Rc3dDUVlEVlFRR0V3Sk9UekVkCk1Cc0dBMVVFQ2d3VVFuVjVjR0Z6Y3lCQlV5MDVPRE14TmpNek1qY3hJREFlQmdOVkJBTU1GMEoxZVhCaGMzTWcKUTJ4aGMzTWdNeUJTYjI5MElFTkJNQjRYRFRFd01UQXlOakE0TWpnMU9Gb1hEVFF3TVRBeU5qQTRNamcxT0ZvdwpUakVMTUFrR0ExVUVCaE1DVGs4eEhUQWJCZ05WQkFvTUZFSjFlWEJoYzNNZ1FWTXRPVGd6TVRZek16STNNU0F3CkhnWURWUVFEREJkQ2RYbHdZWE56SUVOc1lYTnpJRE1nVW05dmRDQkRRVENDQWlJd0RRWUpLb1pJaHZjTkFRRUIKQlFBRGdnSVBBRENDQWdvQ2dnSUJBS1hhQ3BVV1VPT1Y4bDZkZGpFR01ucWI4UkIydUFDYXRWSTJ6U1JIc0o4WQpaTHlhOXZyVmVkaVFZa3dpTDk0NFBkYmdxT2tjTE50NEVlbU9hRkVWY3Nmek00ZmtvRjBMWE9CWEJ5b3c5YzNFCk4zY29UUmlSNXIvVlV2MXhMWEErNThiRWl1UHdLQXYwZHBpaGk0ZFZzam9UL0xjK0p6ZU9JdU9vVHlydllMczkKdHpuRERnRkhtVjBTVDl0RCtsZWg3Zm1kdmhGSEpsc1RtS3RkRm9xd054eFhuVVgvaUpZMnY3dktCM3R2aDJQWAowREpxMWwxc0RQR3piam5pYXpFdU9RQW5GTjQ0d093WlpvWVM2SjF5RmhOa1VzZXBOeHo5Z2pEdGhCZ2Q5SzVjCi8zQVRBT3V4OVRONlM5WlYrQVdOUzJtdzliTW9ObHdVeEZGelRXc0w4VFFIMnhjNTE5d29lMnYxbi9NdXdVOFgKS2hEenpNcm82LzFycXk2YW55MkNiZ1RVVWdHVExUMkcvSDc4Mys5Q0hhWnI3N2tneHZlOW9LZVYvYWZtaVNUWQp6SXcwYk9Jakw5a1NHaUc1VlpGdkM1RjVHUXl0UUlnTGNPSjYwZzdZYUVpN2doTTVFRmpwMkNvSHhoTGJXTnZTCk8xVVFSd1VWWjJKK0dHT21SajhKRGxReVhyOE5Zbm9uNzREbzI5bExCbG8zV2lYUUNCSjMxRzhKVUpjOXlCM0QKMzR4Rk1GYkcwMlNyWnZQQVhwYWN3OFR2dzN4cml6cDVmN05KenozaWlaK2dNRXVGdVp5VUpIbVBmV3VwUldnUApLOUR4Mmh6TGFiaktTV0p0eU5Call0MWdEMWlxajZHOEJhVm1vczhiZHJLRVpMRk1PVkxBTUxyd2pFc0NzTGEzCkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZFZTR6Zi9sYis3NHN1d3YKVGc3NUpiQ09QR3ZETUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBQUNBagpRVFVFa01KQVltRHY0alZNMXorczRqU1F1S0Z2ZHZvV0ZxUklOeXpwa01MeVBQZ0tuOWlCNWJ0YjJpVXNwS2RWCmNTUXk5c2dMOHJ4cStKT3NzZ2ZDWDUvYnpNaUtxcjVxYitGSkVNd3gxNEM3dThqWW9nNWtWK3FpOWNLcE1SWFMKSUdycy9DSUJLTStHdUlBZXFjd1JwVHp5RnJOSG5melNnQ0hFeTlCSGNFR2h5b01aQ0N4dDhsMTNuSW9VRTlRMgpISkx3NVFZMzNLYm1rSnM0ajF4ckcwYUdRMEpmUGdFSFUxUmRaWDMzaW5PaG1sUmFIeWxERkNmQ2hRKzFpSHNhCk81UzNIV0NudFp6bktXbFhXcHVUZWtNd0d3UFhZc2hBcHFyOFpPUksxNUZUQWFnZ2lHNmNYMFM1eTJDQk5PeHYKMDMzYVNGL3J0SkM4TGFrY0M2d2MxYUpvSUlBRTF2eXhqeSs3U2pFTlNvWWM2K0kyS1NiMTJ0akU4blZoejM2dQpkbU5LZWtCbGs0ZjRIb0NNaHVXRzFvOE8vRk1zWU9nV1lScWlQa043elRsZ1ZHcjE4b2ttQVdpRFNLSXo2TWtFCmtiSVJOQkUrNnRCREdSOERrNUFNLzFFOVYvUkJidUhMb0w3cnlXUE5iY3prK0RhcWFKM3R2VjJYY0VRTnRnNDEKM09FTVhidWdVWlRMZmhickVTK2pra1hJVEhIWnZNbVpVbGRHTDFEUHZUVnA5RDBWemdhbExBOCs5b0c2bEx2RAp1NzlsZU5LR2VmOUpPeHFERFBEZWVPekk4azFNR3Q2Q0tmakJXdHJ0N3VZblh1aEYwSjBjVWFob3EwVGowSXRxCjQvZzd1OXhOMTJUeVViN21xcXRhNlRIdUJyeHp2eE5pQ3AvSHVaYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMgTz1ULVN5c3RlbXMgRW50ZXJwcmlzZSBTZXJ2aWNlcyBHbWJIIE9VPVQtU3lzdGVtcyBUcnVzdCBDZW50ZXIKIyBTdWJqZWN0OiBDTj1ULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAzIE89VC1TeXN0ZW1zIEVudGVycHJpc2UgU2VydmljZXMgR21iSCBPVT1ULVN5c3RlbXMgVHJ1c3QgQ2VudGVyCiMgTGFiZWw6ICJULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAzIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogY2E6ZmI6NDA6YTg6NGU6Mzk6OTI6OGE6MWQ6ZmU6OGU6MmY6YzQ6Mjc6ZWE6ZWYKIyBTSEExIEZpbmdlcnByaW50OiA1NTphNjo3MjozZTpjYjpmMjplYzpjZDpjMzoyMzo3NDo3MDoxOTo5ZDoyYTpiZToxMTplMzo4MTpkMQojIFNIQTI1NiBGaW5nZXJwcmludDogZmQ6NzM6ZGE6ZDM6MWM6NjQ6NGY6ZjE6YjQ6M2I6ZWY6MGM6Y2Q6ZGE6OTY6NzE6MGI6OWM6ZDk6ODc6NWU6Y2E6N2U6MzE6NzA6N2E6ZjM6ZTk6NmQ6NTI6MmI6YmQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR3ekNDQXF1Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXgKS3pBcEJnTlZCQW9NSWxRdFUzbHpkR1Z0Y3lCRmJuUmxjbkJ5YVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZApCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlVjblZ6ZENCRFpXNTBaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sCll5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklETXdIaGNOTURneE1EQXhNVEF5T1RVMldoY05Nek14TURBeE1qTTEKT1RVNVdqQ0JnakVMTUFrR0ExVUVCaE1DUkVVeEt6QXBCZ05WQkFvTUlsUXRVM2x6ZEdWdGN5QkZiblJsY25CeQphWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVY25WemRDQkRaVzUwClpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmxZeUJIYkc5aVlXeFNiMjkwSUVOc1lYTnpJRE13Z2dFaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUM5ZFpQd1lpSnZKSzdnZW5hc2ZiM1pKTlc0dC96Tgo4RUxnNjNpSVZsNmJtbFFkVFF5Szl0UFBjUFJTdGRpVEJPTkdobkZCU2l2d0tpeFZBOVpJdytBNU9PM3lYRHcvClJMeVRQV0dyVHMwTnZ2QWdKMWdPUkg4RUdvZWwxNVlVTnBEUVNYdWhkZnNhYTNPeCtNNnBDU3p5VTlYREZFUzQKaHFYMml5czUycU16Vk5uNmNocjNJaFVjaUpGcmYyYmx3MnFBc0NUejM0WkZpUDBaZjNXSEh4K3hHd3B6SkZ1NQpaZUFzVk1oZzAyWVhQK0hNVkROemtRSTZwbjk3ZGptaUg1YTJPSzYxeUpOMEhaNjV0T1ZnblM5VzBlRHJYbHRNCkVuQU1iRVFncXhIWTlCbjIwcHhTTitmNnRzSXhPMHJVRkptdHh4cjFYVi82QjdoOERSL1dneDZ6QWdNQkFBR2oKUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJTMQpBL2QyTzJHQ2FoS3FHRlByQXlHVXYvN095akFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBVmozdmxOVzkybk95CldMNnVrSzJZSjVmK0FiR3dVZ0M0VGVRYklYUWJmc0R1WG1rcUphOWMxaDNhMG5uSjg1Y3A0SWFIM2dSWkQvRloKMUdTRlM1bXZKUVFleVVhcGw5NkNzaHR3bjV6MnIzRXgzWHNGcFN6VHVjcEg5c3J5OXVldHVVZy92QmEzd1czMAo2Z212N1BPMTV3V2VwaDZLVTFIV2s0SE1kSlAydWRxbUpRVjBlVnArUUQ2Q1N5WVJNRzdoUDBISFJ3QTExZlhUCjkxUStnVDNhU1dxYXMrOFFQZWJyYjlISUlrZkx6TThCTVpMWkdPTWl2Z2tlR2o1YXN1UnJERlI2ZlVOT3VJbWwKZTllaVBaYUd6UEltTkMxcWtwMmFHdEF3NGwxT0JMQmZpeUIrZDhFOWxZTFJScG83UEhpNGI2SFFEV1NpZUI0cApUcFBEcEZRVVd3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUVFIENlcnRpZmljYXRpb24gQ2VudHJlIFJvb3QgQ0EgTz1BUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzCiMgU3ViamVjdDogQ049RUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQSBPPUFTIFNlcnRpZml0c2VlcmltaXNrZXNrdXMKIyBMYWJlbDogIkVFIENlcnRpZmljYXRpb24gQ2VudHJlIFJvb3QgQ0EiCiMgU2VyaWFsOiAxMTIzMjQ4Mjg2NzYyMDAyOTE4NzE5MjY0MzE4ODg0OTQ5NDU4NjYKIyBNRDUgRmluZ2VycHJpbnQ6IDQzOjVlOjg4OmQ0OjdkOjFhOjRhOjdlOmZkOjg0OjJlOjUyOmViOjAxOmQ0OjZmCiMgU0hBMSBGaW5nZXJwcmludDogYzk6YTg6Yjk6ZTc6NTU6ODA6NWU6NTg6ZTM6NTM6Nzc6YTc6MjU6ZWI6YWY6YzM6N2I6Mjc6Y2M6ZDcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDNlOjg0OmJhOjQzOjQyOjkwOjg1OjE2OmU3Ojc1OjczOmMwOjk5OjJmOjA5Ojc5OmNhOjA4OjRlOjQ2Ojg1OjY4OjFmOmYxOjk1OmNjOmJhOjhhOjIyOjliOjhhOjc2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFQXpDQ0F1dWdBd0lCQWdJUVZJRDVvSFB0UHdCTXlvblk0M0htU2pBTkJna3Foa2lHOXcwQkFRVUZBREIxCk1Rc3dDUVlEVlFRR0V3SkZSVEVpTUNBR0ExVUVDZ3daUVZNZ1UyVnlkR2xtYVhSelpXVnlhVzFwYzJ0bGMydDEKY3pFb01DWUdBMVVFQXd3ZlJVVWdRMlZ5ZEdsbWFXTmhkR2x2YmlCRFpXNTBjbVVnVW05dmRDQkRRVEVZTUJZRwpDU3FHU0liM0RRRUpBUllKY0d0cFFITnJMbVZsTUNJWUR6SXdNVEF4TURNd01UQXhNRE13V2hnUE1qQXpNREV5Ck1UY3lNelU1TlRsYU1IVXhDekFKQmdOVkJBWVRBa1ZGTVNJd0lBWURWUVFLREJsQlV5QlRaWEowYVdacGRITmwKWlhKcGJXbHphMlZ6YTNWek1TZ3dKZ1lEVlFRRERCOUZSU0JEWlhKMGFXWnBZMkYwYVc5dUlFTmxiblJ5WlNCUwpiMjkwSUVOQk1SZ3dGZ1lKS29aSWh2Y05BUWtCRmdsd2EybEFjMnN1WldVd2dnRWlNQTBHQ1NxR1NJYjNEUUVCCkFRVUFBNElCRHdBd2dnRUtBb0lCQVFESUlNRHM0TVZMcXdkNGxmTkU3dnNMRFA5MGptRzdzV0xxSTlpcm9XVXkKZXV1T0YwK1cyQXA3a2FKamJNZU1UQzU1djZrRi9HbGNsWTFpK2JsdzdjTlJmZENUNW16ck1Fdmh2SDIvVXB2TwpibnRsOGppeHdLSXk3Mkt5YU9CaFU4RTJsZi9zbExvMnJwd2NweklQNVh5MHhtOTAvWHNZNkt4WDdRWWdTekl3CldGdjl6YWptb2Z4d3ZJNlNjOXVYcDN3aHJqM0I5VWlIYkNlOW55VjBnVld3OTNYMlBhUmthOVpQNTg1QXJRL2QKTXRPOGloSlRtTW1KK3hBZFRYN05maDlXRFNGd2hmWWdneC8ydWg4RWorcDNpRFhFLytwT29ZdE5QMk1iUk1ORQoxQ1YyeXJlTjF4NUtabVROWE1XY2crSENDSWlhN0U2ajhUNGNMTmxzSGFGTEFnTUJBQUdqZ1lvd2dZY3dEd1lEClZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGQkx5V2o3cVZoeS8KelFhczhmRWx5YWxMMUJTWk1FVUdBMVVkSlFRK01Ed0dDQ3NHQVFVRkJ3TUNCZ2dyQmdFRkJRY0RBUVlJS3dZQgpCUVVIQXdNR0NDc0dBUVVGQndNRUJnZ3JCZ0VGQlFjRENBWUlLd1lCQlFVSEF3a3dEUVlKS29aSWh2Y05BUUVGCkJRQURnZ0VCQUh2MjVNQU5xaGxIdDAxWG8vNnR1N0ZxMVErZTIrUmp4WTZoVUZhVGxyZzR3Q1FpWnJ4VEZHR1YKdjlESEtwWTVQMzBvc3hCQUlXckVyN0JTZHhqaGx0aFdYZVBkTmw0ZHAxQlVvTVVxNUtxTWxJcFBuVFgvZHFRRwpFNUdpb24wQVJEOVYwNEk4R3RWYnZGWk1JaTVHUTRva1FDM3pFcmc3Y0Jxa2xya2FyNGRCR21vWURRWlB4ejV1CnVTbE5EVW1KRVljeVcrWkxCTWprWE9aMGM1UmRGcGdUbGY3NzI3RkU1VHB3ckRkcjVyTXpjaWpKczFlZzlnSVcKaUFZTHRxWkxJQ2pVM2oyTHJUY0ZVM1QrYnN5OFF4ZHhYdm5GekJxcFllNzNkZ3p6Y3ZSeXJjOXlBallIUjgvdgpHVkNKWU16cEpKVVB3c3NkOG05MmtNZk1kY0dXeFowPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiAyMDA5IE89RC1UcnVzdCBHbWJICiMgU3ViamVjdDogQ049RC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiAyMDA5IE89RC1UcnVzdCBHbWJICiMgTGFiZWw6ICJELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIDIwMDkiCiMgU2VyaWFsOiA2MjM2MDMKIyBNRDUgRmluZ2VycHJpbnQ6IGNkOmUwOjI1OjY5OjhkOjQ3OmFjOjljOjg5OjM1OjkwOmY3OmZkOjUxOjNkOjJmCiMgU0hBMSBGaW5nZXJwcmludDogNTg6ZTg6YWI6YjA6MzY6MTU6MzM6ZmI6ODA6Zjc6OWI6MWI6NmQ6Mjk6ZDM6ZmY6OGQ6NWY6MDA6ZjAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQ5OmU3OmE0OjQyOmFjOmYwOmVhOjYyOjg3OjA1OjAwOjU0OmI1OjI1OjY0OmI2OjUwOmU0OmY0OjllOjQyOmUzOjQ4OmQ2OmFhOjM4OmUwOjM5OmU5OjU3OmIxOmMxCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTXpDQ0F4dWdBd0lCQWdJRENZUHpNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1FMHhDekFKQmdOVkJBWVRBa1JGCk1SVXdFd1lEVlFRS0RBeEVMVlJ5ZFhOMElFZHRZa2d4SnpBbEJnTlZCQU1NSGtRdFZGSlZVMVFnVW05dmRDQkQKYkdGemN5QXpJRU5CSURJZ01qQXdPVEFlRncwd09URXhNRFV3T0RNMU5UaGFGdzB5T1RFeE1EVXdPRE0xTlRoYQpNRTB4Q3pBSkJnTlZCQVlUQWtSRk1SVXdFd1lEVlFRS0RBeEVMVlJ5ZFhOMElFZHRZa2d4SnpBbEJnTlZCQU1NCkhrUXRWRkpWVTFRZ1VtOXZkQ0JEYkdGemN5QXpJRU5CSURJZ01qQXdPVENDQVNJd0RRWUpLb1pJaHZjTkFRRUIKQlFBRGdnRVBBRENDQVFvQ2dnRUJBTk95U3M5NlIrOTFteVA2T2kvV1VFV0pOVHJHYTl2KzJ3Qm9xT0FERVIwMwpVQWlmVFVwb2xEV3pVOUdVWTZjZ1ZxL2VVWGpzS2ozelNFaFFQZ3JmUmxXTEoyM0RFRTBOa1ZKRDJJZmdYVTQyCnRTSEtYemxBQkY5YmZzeWp4aXVwUUI3Wk5vVFdTUE9TSGpSR0lDVEJwRkdPU2hydlVEOXBYUmwvUmNQSEFZOVIKeVNQb2NxNjB2RllKZnhMTEhMR3ZLWkFLeVZYTUQ5TzBHdTFITlZwSzdaeHpCQ0hRcXIwTUU3VUF5aVpzeEdzTQpsRnFWbE5wUW12SC9wU3RtTWFUSk9LRGZIUis0Q1M3enAraG5VcXVWSCtCR1B0aWt3OHBheFRHQTZFaWFuNVJwCi9obmQySE44Z2NxVzNvN3RzeklGWllRMDV1YjlWeEMxWDNhL0w3QVFEY1VDQXdFQUFhT0NBUm93Z2dFV01BOEcKQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGUDNhRk1TZk1ONGh2UjVDT2Z5cll5Tko0UEdFTUE0RwpBMVVkRHdFQi93UUVBd0lCQmpDQjB3WURWUjBmQklITE1JSElNSUdBb0g2Z2ZJWjZiR1JoY0RvdkwyUnBjbVZqCmRHOXllUzVrTFhSeWRYTjBMbTVsZEM5RFRqMUVMVlJTVlZOVUpUSXdVbTl2ZENVeU1FTnNZWE56SlRJd015VXkKTUVOQkpUSXdNaVV5TURJd01Ea3NUejFFTFZSeWRYTjBKVEl3UjIxaVNDeERQVVJGUDJObGNuUnBabWxqWVhSbApjbVYyYjJOaGRHbHZibXhwYzNRd1E2QkJvRCtHUFdoMGRIQTZMeTkzZDNjdVpDMTBjblZ6ZEM1dVpYUXZZM0pzCkwyUXRkSEoxYzNSZmNtOXZkRjlqYkdGemMxOHpYMk5oWHpKZk1qQXdPUzVqY213d0RRWUpLb1pJaHZjTkFRRUwKQlFBRGdnRUJBSCtYMnpESTM2U2NmU0Y2Z0hET0ZCSnBpQlNWWUVRQnJMTHBNRStiVU1KbTJINk5NTFZ3TWVuaQphY2Z6Y05zZ0ZZYlFEZkMrckFGMWhNNStuMDIvdDJBN25QUEtIZUplYU5pam5aZmxRR0RTTmlIKzBMUzRGOXAwCm8zL1UzN0NZQXF4dmEyc3NKU1J5b1dYdUpWcmw1akxuOHQrclNmcnprR2tqMndUWjUxeFkvR1hVbDc3TS9DNEsKekNVcU5RVDRZSkVWZFQxQi95TWZHY2hzNjRKVEJLYmtUQ0pOall5NnpsdHo3R1JVVUczUm5GWDdhY00ydzR5OApQSVdtYXdvbURlQ1RtR0N1ZnNZa2w0cGhYNUdPWnBJSmh6Yk5pNXN0UHZaUjFGRFVXU2k5Zy9MTUtIdFRobTNZCkpvaHcxK3FSelQ2NXlzQ1FibHJHWG5SbDExeitvK0k9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1ELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIEVWIDIwMDkgTz1ELVRydXN0IEdtYkgKIyBTdWJqZWN0OiBDTj1ELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIEVWIDIwMDkgTz1ELVRydXN0IEdtYkgKIyBMYWJlbDogIkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOSIKIyBTZXJpYWw6IDYyMzYwNAojIE1ENSBGaW5nZXJwcmludDogYWE6YzY6NDM6MmM6NWU6MmQ6Y2Q6YzQ6MzQ6YzA6NTA6NGY6MTE6MDI6NGY6YjYKIyBTSEExIEZpbmdlcnByaW50OiA5NjpjOToxYjowYjo5NTpiNDoxMDo5ODo0MjpmYTpkMDpkODoyMjo3OTpmZTo2MDpmYTpiOToxNjo4MwojIFNIQTI1NiBGaW5nZXJwcmludDogZWU6YzU6NDk6NmI6OTg6OGM6ZTk6ODY6MjU6Yjk6MzQ6MDk6MmU6ZWM6Mjk6MDg6YmU6ZDA6YjA6ZjM6MTY6YzI6ZDQ6NzM6MGM6ODQ6ZWE6ZjE6ZjM6ZDM6NDg6ODEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVRekNDQXl1Z0F3SUJBZ0lEQ1lQME1BMEdDU3FHU0liM0RRRUJDd1VBTUZBeEN6QUpCZ05WQkFZVEFrUkYKTVJVd0V3WURWUVFLREF4RUxWUnlkWE4wSUVkdFlrZ3hLakFvQmdOVkJBTU1JVVF0VkZKVlUxUWdVbTl2ZENCRApiR0Z6Y3lBeklFTkJJRElnUlZZZ01qQXdPVEFlRncwd09URXhNRFV3T0RVd05EWmFGdzB5T1RFeE1EVXdPRFV3Ck5EWmFNRkF4Q3pBSkJnTlZCQVlUQWtSRk1SVXdFd1lEVlFRS0RBeEVMVlJ5ZFhOMElFZHRZa2d4S2pBb0JnTlYKQkFNTUlVUXRWRkpWVTFRZ1VtOXZkQ0JEYkdGemN5QXpJRU5CSURJZ1JWWWdNakF3T1RDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUpueGhEUnd1aSszTUtDT3ZYd0V6NzVpdkpuOWdwZlNlZ3BuCmxqZ0o5aEJPbFNKem1ZM2FGUzNuQmZ3WmN5SzNqcGdBdkR3OXJLRnMrOVo1SlV1dDhNeGsyb2crS2JnUENkTTAKM1RQMVl0SGh6Um5wN2hoUFRGaXU0aDdXREZzVld0ZzZ1TVFZWkI3ak03SzFpWGRPREwvWmxHc1RsMjhTby82WgpxUVRNRmV4Z2FEYnRDSHUzOWIrVDdXWXhnNHpHY1RTSFRoZnFyNHVSalJ4V1FhNGlOMTQzOGgzWjBTME5MMmxSCnA3NW1wb282S3IzSEdySGhGUEMrT2gyNXoxdXhhdjYwc1VZZ292c2VPM0R2azVoOWpIT1c4c1h2aFhDdEtTYjgKSGdRK0hLRFlEOHRTZzJKODdvdFRsWkNwVjZMcVlRWFkrVTNFSi9wdXJlMzUxMUgzYTZVQ0F3RUFBYU9DQVNRdwpnZ0VnTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk5PVWlreGlFeW9aTHN5dmNvcDlOdGVhCkhOeG5NQTRHQTFVZER3RUIvd1FFQXdJQkJqQ0IzUVlEVlIwZkJJSFZNSUhTTUlHSG9JR0VvSUdCaG45c1pHRncKT2k4dlpHbHlaV04wYjNKNUxtUXRkSEoxYzNRdWJtVjBMME5PUFVRdFZGSlZVMVFsTWpCU2IyOTBKVEl3UTJ4aApjM01sTWpBekpUSXdRMEVsTWpBeUpUSXdSVllsTWpBeU1EQTVMRTg5UkMxVWNuVnpkQ1V5TUVkdFlrZ3NRejFFClJUOWpaWEowYVdacFkyRjBaWEpsZG05allYUnBiMjVzYVhOME1FYWdSS0JDaGtCb2RIUndPaTh2ZDNkM0xtUXQKZEhKMWMzUXVibVYwTDJOeWJDOWtMWFJ5ZFhOMFgzSnZiM1JmWTJ4aGMzTmZNMTlqWVY4eVgyVjJYekl3TURrdQpZM0pzTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFBMDdYdGFQS1NVaU84YUVYVUhMN1ArUFBvZVVTYnJoL1lwCjN1RHgxTVlrQ2VuQnoxVWJ0RERaemhyK0JsR21GYVF0NzdKTHZ5QW9KVW5ScGpaM05PaGszMUt4RWNkemVzMDUKbnNLdGpIRWg4bHBycjk4OFRsV3Zzb1JsRkltNWQ4c3FNYjdQbzIzUGIwaVVNa1p2NTNHTW9LYUVHVGNIOGdORgpDU3VHZFh6ZlgybFhBTnR1MktaeUlrdFExSFdZVnQrM0dQOURRMUN1ZWtSNzhIbFIxME05cDlPQjAvREpUN25hCnhwZUcwSUxENUVKdC9yRGlaRTRPSnVkQU5DYTFDSW5YQ0dOak9DZDFIalBxYnFqZG41bFBkRTJCaVlCTDNacVgKS1Z3dnZvRkJ1WXovNm4xZ0JwN04xejNUTHFNVnZLam1KdVZ2dzl5NEF5SHFueGJ4TEZTMQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q0EgRGlzaWcgUm9vdCBSMiBPPURpc2lnIGEucy4KIyBTdWJqZWN0OiBDTj1DQSBEaXNpZyBSb290IFIyIE89RGlzaWcgYS5zLgojIExhYmVsOiAiQ0EgRGlzaWcgUm9vdCBSMiIKIyBTZXJpYWw6IDEwNTcyMzUwNjAyMzkzMzM4MjExCiMgTUQ1IEZpbmdlcnByaW50OiAyNjowMTpmYjpkODoyNzphNzoxNzo5YTo0NTo1NDozODoxYTo0MzowMTozYjowMwojIFNIQTEgRmluZ2VycHJpbnQ6IGI1OjYxOmViOmVhOmE0OmRlOmU0OjI1OjRiOjY5OjFhOjk4OmE1OjU3OjQ3OmMyOjM0OmM3OmQ5OjcxCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlMjozZDo0YTowMzo2ZDo3Yjo3MDplOTpmNTo5NTpiMTo0MjoyMDo3OTpkMjpiOToxZTpkZjpiYjoxZjpiNjo1MTphMDo2MzozZTphYTo4YTo5ZDpjNTpmODowNzowMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmFUQ0NBMUdnQXdJQkFnSUpBSks0aU51d2lzRmpNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1GSXhDekFKQmdOVgpCQVlUQWxOTE1STXdFUVlEVlFRSEV3cENjbUYwYVhOc1lYWmhNUk13RVFZRFZRUUtFd3BFYVhOcFp5QmhMbk11Ck1Sa3dGd1lEVlFRREV4QkRRU0JFYVhOcFp5QlNiMjkwSUZJeU1CNFhEVEV5TURjeE9UQTVNVFV6TUZvWERUUXkKTURjeE9UQTVNVFV6TUZvd1VqRUxNQWtHQTFVRUJoTUNVMHN4RXpBUkJnTlZCQWNUQ2tKeVlYUnBjMnhoZG1FeApFekFSQmdOVkJBb1RDa1JwYzJsbklHRXVjeTR4R1RBWEJnTlZCQU1URUVOQklFUnBjMmxuSUZKdmIzUWdVakl3CmdnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNpbzhRQUNkYUZYUzF0RlBiQ3czT2UKTmNKeFZYNkIrNnRHVU9EQmZFbDQ1cXQ1V0R6YS8zd2NuOWlYQW5nK2EwRUU2VUc5dmdNc1JmWXZaTlNyWGFOSApQV1NiNldpYXhzd2JQN3Erc29zMEFpNllWUm44akcrcVg5cE16azBESWFQWTBqU1RWcGJMVEF3QUZqeGZHczNJCngyeW1yZE14cDd6bzVlRm0xdEw3QTdSQlpja1FyZzRGWThhQWFta3cvZEx1a084Tko5K2ZsWFAwNFNYYWJCYmUKUVRnMDZvdjgwZWdFRkdFdFFYNnN4M2RPeTFGVSsxNlNHQnNFV21qR3ljVDZ0eE9nbUxjUks3ZldWOHg4bmhmUgp5eVgraGs0a0xsWU1lRTJlQVJLbUs2Y0JaVzU4WWgyRWhOL3F3R3UxcFNxVmc4TlRFUXh6SFF1eVJwRFJRanJPClFHNlZyZi9HbEsxdWw0U09mVytlaW9BTlNXMXo0bnVTSHNQendmUHJMZ1Z2MlJ2UE4zWUV5TFJhNUJlbnk5MTIKSDlBWmR1Z3NCYlBXbkRUWWx0eGhoNUVGNUVRSU04SGF1UWhsMUs2eU5nM3J1amk2RE9XYm51dU5adDJaejlhSgpRZllFa29vcEtXMXJPaHpuZFgwQ2NRN3p3T2U5eXhuZG5XQ3l3bVpndHJFRTdzbm1ocm1hWmtDbzV4SHRnVVVECmkvWm5XZWpCQmhHOTNjK0FBazlsUUhoY1IxREltK1lmZ1h2a1JLaGJoWnJpM2xyVngvazZSR1pMNURKVWZPUnMKbkxNT1BSZWlzalFTMW42eXFFbTcwWG9vUUw2aUZoL2Y1RGNmRVhQN2tBcGxRNklOZlBnR0FWVXpmYkFOdVBUMQpycVZDVjN3MkVZeDdYc1FEbll4NW5RSURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkCkR3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVV0Wm40cjdDVTllTWcxZ3F0ems1V3BDNXVRdTB3RFFZSktvWkkKaHZjTkFRRUxCUUFEZ2dJQkFDWUdYbkRuWlRQSWdtN1puQmM2RzNwbXNnSDJlRHRwWGkvcS8wNzVLTU9ZS21GTQp0Q1FTaW4xdEVSVDNuTFhLNXJ5ZUo0NU1HY2lwdlhyQTF6WU9iWVZ5YnFqR29tMzIrbk5qZjd4dWVRZ2NuWXFmCkdvcFRwdGk3MlRWVnNSSEZxUU96Vmp1NWhKTWlYbjdCOWhKU2krb3NaN3orTmt6MXVNL1JzMG1TTzlNcERwa2IKbHZkaHVEdkVLN1o0YkxRamIvRDkwN0plZFIrWmxhaXM5dHJoeFRGNys5RkdzOUs4WjdSaVZMb0o5Mk93azZLYQorZWxTTG90Z0Vxdjg5V0JXN3hCY2k4UWFRdHlEVzJRT3k3Vzgxay9CZkR4dWpSTnQrM3ZyTU5EY1RhL0YxYmFsClRGdHh5ZWd4dnVnNEJraWhHdUxxMHQ0U09WZ2EvNEFPZ25YbXQ4a0hiQTd2L3pqeG1ISEV0MzhPRmRBbGFiMGkKblN2dEJmWkdSNnp0d1BEVU8rTHM3cFpia0JOT0hsWTY2N0R2bHJ1V0l4RzY4a09HZEdTVnlDaDEzeDAxdXRJMwpnemhUT0RZN3oyenArV3NPMFBzRTZFOTMxMlVCZUlZTWVqNGhZdkYvWTNFTXlaOUUyNmdub25XK2JvRSsxOERyCkc1Z1BjRncwc29yTXdJVVk2MjU2cy9kYW9RZS9xVUtTODJBaWwrUVVvUWViVG5iQWpuMzlwQ1hIUiszL0gzT3MKek1PbDZXOEtqcHRsd2xDRnRhT2dVeExNVllkaDg0R3VFRVpodlVRaHVNSTlkTTkrSkRYNkhBY09tejBpeXU4eApMNHlzRXIzdlFDajhLV2Vmc2hOUFppVEVVeG5wSGlrVjcrWnRzSDh0Wi8zemJCdDFScVBsU2hmcHBOY0wKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFDQ1ZSQUlaMSBPPUFDQ1YgT1U9UEtJQUNDVgojIFN1YmplY3Q6IENOPUFDQ1ZSQUlaMSBPPUFDQ1YgT1U9UEtJQUNDVgojIExhYmVsOiAiQUNDVlJBSVoxIgojIFNlcmlhbDogNjgyODUwMzM4NDc0ODY5NjgwMAojIE1ENSBGaW5nZXJwcmludDogZDA6YTA6NWE6ZWU6MDU6YjY6MDk6OTQ6MjE6YTE6N2Q6ZjE6YjI6Mjk6ODI6MDIKIyBTSEExIEZpbmdlcnByaW50OiA5MzowNTo3YTo4ODoxNTpjNjo0ZjpjZTo4ODoyZjpmYTo5MToxNjo1MjoyODo3ODpiYzo1Mzo2NDoxNwojIFNIQTI1NiBGaW5nZXJwcmludDogOWE6NmU6YzA6MTI6ZTE6YTc6ZGE6OWQ6YmU6MzQ6MTk6NGQ6NDc6OGE6ZDc6YzA6ZGI6MTg6MjI6ZmI6MDc6MWQ6ZjE6Mjk6ODE6NDk6NmU6ZDE6MDQ6Mzg6NDE6MTMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUgwekNDQmJ1Z0F3SUJBZ0lJWHNPM3BrTi9wT0F3RFFZSktvWklodmNOQVFFRkJRQXdRakVTTUJBR0ExVUUKQXd3SlFVTkRWbEpCU1ZveE1SQXdEZ1lEVlFRTERBZFFTMGxCUTBOV01RMHdDd1lEVlFRS0RBUkJRME5XTVFzdwpDUVlEVlFRR0V3SkZVekFlRncweE1UQTFNRFV3T1RNM016ZGFGdzB6TURFeU16RXdPVE0zTXpkYU1FSXhFakFRCkJnTlZCQU1NQ1VGRFExWlNRVWxhTVRFUU1BNEdBMVVFQ3d3SFVFdEpRVU5EVmpFTk1Bc0dBMVVFQ2d3RVFVTkQKVmpFTE1Ba0dBMVVFQmhNQ1JWTXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDYgpxYXUvWVVxWHJ5K1hacHAwWDlEWmx2M1A0dVJtN3g4ZlJ6UENSS1BmbXQ0ZnRWVGRGWHhwTlJGdnU4Z01qbW9ZCkh0aVAyUmE4RUVnMlhQQmpzNUJhWENRMzE2UFd5d2x4dWZFQmNvU3dmZHROZ00zODAyL0orTnEyRG9MU1JZV28KRzJpb1BlajBSR3k5b2NMTEE3Nk1QaE1BaE45S1NNRGpJZ3JvNlRlbkdFeXhDUTBqVm44RVRka1hoQmlseU5wQQpsSFByemc1WFBBT0JPcDBLb1ZkRGFheFhiWG1RZU9XMXREdll2RXlOS0tHbm82ZTZBazRsMFNxdTdhNERJcmhyCklBOHdLRlNWZitEdXpncG1uZEZBTFc0aXI1MGF3UVVaMG0vQThwLzRlN01DUXZ0UXFSMHRrdzhqcThiQkQ1TC8KMEtJVjlWTUpjUnovUlJPRTVpWmUrT0NJSEFyOEZyYW9jd2E0OEdPRUFxREdXdXpuZE45d3JxT0RKZXJXeDVlSAprNmZHaW9vemwyQTNFRDZYUG00cEZkYWhEOUdJTEJLZmI2cWt4a0xyUWFMamxVUFRBWVZ0anJzNzh5TTJ4LzQ3CjRLRWxCMGlyeVlsMC93aVBnTC9BbG1Yejd1eExhTDJkaU1NeHMwRHg2TS8yT0x1YzVORi8xT1ZZbTN6NjFQTU8KbTNXUjVMcFNMaGwrMGZYTldobjh1Z2IyKzFLb1M1a0UzZmo1dEl0UW8wNWlpZkNISlBxRFFzR0grdFV0S1NwYQpjWHBrYXRjbllHTU4yODVKOVkwZmtJa3lGL2h6UTdqU1dwT0dZZGJoZFFycWVXWjJpRTl4NndRbDFncGFlcFBsCnVVc1hRQSt4dHJuMTNrL2M0TE9zT3hGd1lJUktRMjZaSU1BcGNRckFaUUlEQVFBQm80SUN5ekNDQXNjd2ZRWUkKS3dZQkJRVUhBUUVFY1RCdk1Fd0dDQ3NHQVFVRkJ6QUNoa0JvZEhSd09pOHZkM2QzTG1GalkzWXVaWE12Wm1scwpaV0ZrYldsdUwwRnlZMmhwZG05ekwyTmxjblJwWm1sallXUnZjeTl5WVdsNllXTmpkakV1WTNKME1COEdDQ3NHCkFRVUZCekFCaGhOb2RIUndPaTh2YjJOemNDNWhZMk4yTG1Wek1CMEdBMVVkRGdRV0JCVFNoN1RqM3pjbmsxWDIKVnVxQjVUYk1qQjQvdlRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZOS0h0T1BmTnllVApWZlpXNm9IbE5zeU1Iais5TUlJQmN3WURWUjBnQklJQmFqQ0NBV1l3Z2dGaUJnUlZIU0FBTUlJQldEQ0NBU0lHCkNDc0dBUVVGQndJQ01JSUJGQjZDQVJBQVFRQjFBSFFBYndCeUFHa0FaQUJoQUdRQUlBQmtBR1VBSUFCREFHVUEKY2dCMEFHa0FaZ0JwQUdNQVlRQmpBR2tBOHdCdUFDQUFVZ0JoQU8wQWVnQWdBR1FBWlFBZ0FHd0FZUUFnQUVFQQpRd0JEQUZZQUlBQW9BRUVBWndCbEFHNEFZd0JwQUdFQUlBQmtBR1VBSUFCVUFHVUFZd0J1QUc4QWJBQnZBR2NBCjdRQmhBQ0FBZVFBZ0FFTUFaUUJ5QUhRQWFRQm1BR2tBWXdCaEFHTUFhUUR6QUc0QUlBQkZBR3dBWlFCakFIUUEKY2dEekFHNEFhUUJqQUdFQUxBQWdBRU1BU1FCR0FDQUFVUUEwQURZQU1BQXhBREVBTlFBMkFFVUFLUUF1QUNBQQpRd0JRQUZNQUlBQmxBRzRBSUFCb0FIUUFkQUJ3QURvQUx3QXZBSGNBZHdCM0FDNEFZUUJqQUdNQWRnQXVBR1VBCmN6QXdCZ2dyQmdFRkJRY0NBUllrYUhSMGNEb3ZMM2QzZHk1aFkyTjJMbVZ6TDJ4bFoybHpiR0ZqYVc5dVgyTXUKYUhSdE1GVUdBMVVkSHdST01Fd3dTcUJJb0VhR1JHaDBkSEE2THk5M2QzY3VZV05qZGk1bGN5OW1hV3hsWVdSdAphVzR2UVhKamFHbDJiM012WTJWeWRHbG1hV05oWkc5ekwzSmhhWHBoWTJOMk1WOWtaWEl1WTNKc01BNEdBMVVkCkR3RUIvd1FFQXdJQkJqQVhCZ05WSFJFRUVEQU9nUXhoWTJOMlFHRmpZM1l1WlhNd0RRWUpLb1pJaHZjTkFRRUYKQlFBRGdnSUJBSmN4QXAvbi9VTm5TRVFVNUNtSDdVd29adENQTmRwTlliZEtsMDIxMjVEZ0JTNE94bm5ROHBkcApENzBFUjltKzI3VXAycHZacnFtWjFkTThNSlAxamFHby9BYU5SUFRLRnBWOE05eGlpNmczK0NmWUNTMGI3OGdVCkp5Q3BaRVQvTHRaMXFteE5ZRUFaU1VOVVk5cml6THBtNVU5RWVsdlphb0VyUU5WLytRRW5XQ3pJN1VpUmZEK20KQU0vRUtYTVJOdDZHR1Q2ZDdobUtHOVd3N1k0OW5DckFEZGc5WnVNOERiM1ZsRnppNHFjMUd3UUE5ajlhamVwRAp2VitKSGFuQnNNeVo0azBBQ3RySkoxdm5FNUJjNVBVem9sVnQzT0FKVFMreEpsc25kUUFKeEdKM0tRaGZubG1zCnRuNnRuMVF3SWdQQkhuRmsvdms0Q3BZWTNRSVVyQ1BMQmh3ZXBIMk5EZDRuUWVpdDJoVzNzQ1BkSzZqVDJpV0gKN2VoVlJFMkk5RForaEpwNHJQY09Wa2tPMWpNbDFvUlFRbXdnRWgwcTFiNjg4bkNCcEhCZ3ZnVzFtNTRFUkw1aApJNnpwcFNTTUVZQ1VXcUtpdVVuU3dkelJwKzB4RVN5ZUdhYnU0Vlhod09yUERZVGtGN2VpZktYZVZTVUc3c3pBCmgxeEEyc3lWUDFYZ05jZTRoTDYwWGMxNmd3Rnk3b2ZtWHgydXRZWEdKdC9td1pycEhnSkhueXFvYmFsYnoreEYKZDMrWUo1b3lYU3JqaE83Rm1HWXZsaUFkM2RqREo5ZXcrZjdaZmMzUW40OExGRmhSbnkrTHd6Z3QzdWlQMW8ySApwUFZXUXhhWkxQU2tWclEwdUdFM3ljSllnQnVnbDZIOFdZM3BFZmJSRDB0Vk5FWXFpNFk3Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UV0NBIEdsb2JhbCBSb290IENBIE89VEFJV0FOLUNBIE9VPVJvb3QgQ0EKIyBTdWJqZWN0OiBDTj1UV0NBIEdsb2JhbCBSb290IENBIE89VEFJV0FOLUNBIE9VPVJvb3QgQ0EKIyBMYWJlbDogIlRXQ0EgR2xvYmFsIFJvb3QgQ0EiCiMgU2VyaWFsOiAzMjYyCiMgTUQ1IEZpbmdlcnByaW50OiBmOTowMzo3ZTpjZjplNjo5ZTozYzo3Mzo3YToyYTo5MDowNzo2OTpmZjoyYjo5NgojIFNIQTEgRmluZ2VycHJpbnQ6IDljOmJiOjQ4OjUzOmY2OmE0OmY2OmQzOjUyOmE0OmU4OjMyOjUyOjU1OjYwOjEzOmY1OmFkOmFmOjY1CiMgU0hBMjU2IEZpbmdlcnByaW50OiA1OTo3Njo5MDowNzpmNzo2ODo1ZDowZjpjZDo1MDo4NzoyZjo5Zjo5NTpkNTo3NTo1YTo1YjoyYjo0NTo3ZDo4MTpmMzo2OToyYjo2MTowYTo5ODo2NzoyZjowZToxYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlFUQ0NBeW1nQXdJQkFnSUNETDR3RFFZSktvWklodmNOQVFFTEJRQXdVVEVMTUFrR0ExVUVCaE1DVkZjeApFakFRQmdOVkJBb1RDVlJCU1ZkQlRpMURRVEVRTUE0R0ExVUVDeE1IVW05dmRDQkRRVEVjTUJvR0ExVUVBeE1UClZGZERRU0JIYkc5aVlXd2dVbTl2ZENCRFFUQWVGdzB4TWpBMk1qY3dOakk0TXpOYUZ3MHpNREV5TXpFeE5UVTUKTlRsYU1GRXhDekFKQmdOVkJBWVRBbFJYTVJJd0VBWURWUVFLRXdsVVFVbFhRVTR0UTBFeEVEQU9CZ05WQkFzVApCMUp2YjNRZ1EwRXhIREFhQmdOVkJBTVRFMVJYUTBFZ1IyeHZZbUZzSUZKdmIzUWdRMEV3Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUN3QmR2STY0ekVib29oNzQ1Tm5IRUtIMUp3N1cyQ25KZkYKMTB4T1JVbkxRRUsxRWpSc0djSjBwREZmaFFLWDdFTXpDbFBTbkl5T3Q3aDUyeXZWYXZLT1pzVHVLd0VIa3RTegowQUxmVVBaVnIyWU95K0JIWUM4ck1qazFVam9vZy9oN0ZzWVl1R0xXUnlXUnp2QVpFazJ0WS9YVFAzVmZLZkNoCk1Cd3FvSmltRmIzdS9SazI4T0tSUTQvNnl0WVFKMGxNNzkzQjhZVndtOHJxcUZwRC9HMkdiM1BwTjBXcDhEYkgKekloMUhydHNCditiYXo0WDdHR3FjWHpHSGFMM1Nla1Z0VHpXb1dIMUVmY0ZieDM5RWI3UU1BZkNLYkFKVGliYwo0Nktva1dvZndwRkZpRnpsbUxoeHBSVVp5WHgxRWN4d2RFOHRteDJSUlAxV0tLRCt1NFpxeVBwY0MxamN4a3QyCnlLc2kyWE1QcGZSYUFvay9UNTRpZ3U2aWRGTXFQVk1uYVIxc2pqSXNaQUFtWTJFMlRxTkd0ejk5c3kyc2JaQ2kKbGFMT3o5cUM1d2MwR1picHVDR3FLWDZtT0w2T0tVb2habmtmczhPMUNXZmUxdFFIUnZNcTJ1WWlOMkRMZ2JZUApvQS9weUpWL3YxV1JCWHJQUFJYQWI5NEpsQUdEMXpRYnpFQ2w4TGliWjlXWWtUdW5oSGlWSnFSYUNQZ3JkTFFBCkJEemZ1QlNPNk4rcGpXeG5rak1kd0xmUzdKTEl2Z20vTENrRmJ3SnJudSs4dnlxOFc4QlFqMEZ3Y1lleVRiY0UKcVlTak1xK3U3bXNYaTdLeC9temhrSXlJcUpkSXpzaE55L01HejE5cUNrS3hIaDUzTDQ2ZzVwSU9CdndGSXRJbQo0VEZSZlRMY0R3SURBUUFCb3lNd0lUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFYelNCZHUrV0hkWGx0ZGtDWTRRV3dhNmdjRkduOTB4SE5jZ0wKMXlnOWlYSFpxak5CNmhRYmJDRUF3R3hDR1g2ZmFWc2dRdCtpMHRyRWZKZExqYkRvck1qdXBXa0VtUXFTcHFzbgpMaHBOZ2IrRTFIQWVyVWYrL1VxZE0rRHl1Y1JGQ0NFSzJtbHBjM0lOdmpUK2xJdXR3eDQxMTZLRDcrVTR4NldGCkg2dlBOT3cvS1A0TThWZUdUc2xWOXh6VTJLVjlCbnB2MWQ4UTM0Rk9JV1d4dHVFWGVaVkZCczVmek54R2lXTm8KUkkyVDlHUndvRDJkS0FYRE9YQzRZbnNnL2VUYjZRaWh1SjQ5Q2NkUCt5ejRrM1pCM2xMZzRWZlNuUU84ZDU3KwpuaWxlOThGUllCL2UyZ3V5TFhXM1EwaVQ1L1o1eG9SZGdGbGdsUHg0bUk4OGsxSHRRSkFIMzJSakpNdE9jUVdoCjE1UWFpREx4SW5RaXJxV20yQkpwVEdDakF1NHI3TlJqa2d0ZXZpOTJhNk8ySnJ5UEE5Z0s4a3hrUnIwNVl1V1cKNnpSakVTak1sZkd0NysvY2dGaEk2VXU0Nm1XczZmeUF0YlhJUmZtc3daL1p1ZXBpaUk3RThVdURFcTNtaTRUVwpuc0xyZ3hpZmFyc2JKR0F6Y016czl6THpYTmw1ZmUrZXBQN0pJOE1rN2hXU3NUMlJUeWFHdldaekpCUHFwSzVqCndhMTloQU04RUhpR0czbmp4UFB5QkpVZ3JpT0N4TE02QUdLLzVqWWs0VmU2eHg2UWRkVmZQNVZoSzhFN3plV3oKYUdIUVJpYXBJVkpwTGVzdXgrdDN6cVk2dFFNelQzYlI1MXhVQVYzTGVQVEpETC9QRW80WExTTm9sT2VyL3FteQpLd2JRQk0wPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VGVsaWFTb25lcmEgUm9vdCBDQSB2MSBPPVRlbGlhU29uZXJhCiMgU3ViamVjdDogQ049VGVsaWFTb25lcmEgUm9vdCBDQSB2MSBPPVRlbGlhU29uZXJhCiMgTGFiZWw6ICJUZWxpYVNvbmVyYSBSb290IENBIHYxIgojIFNlcmlhbDogMTk5MDQxOTY2NzQxMDkwMTA3OTY0OTA0Mjg3MjE3Nzg2ODAxNTU4CiMgTUQ1IEZpbmdlcnByaW50OiAzNzo0MTo0OToxYjoxODo1Njo5YToyNjpmNTphZDpjMjo2NjpmYjo0MDphNTo0YwojIFNIQTEgRmluZ2VycHJpbnQ6IDQzOjEzOmJiOjk2OmYxOmQ1Ojg2OjliOmMxOjRlOjZhOjkyOmY2OmNmOmY2OjM0OjY5Ojg3OjgyOjM3CiMgU0hBMjU2IEZpbmdlcnByaW50OiBkZDo2OTozNjpmZToyMTpmODpmMDo3NzpjMToyMzphMTphNToyMTpjMToyMjoyNDpmNzoyMjo1NTpiNzozZTowMzphNzoyNjowNjo5MzplODphMjo0YjowZjphMzo4OQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRk9EQ0NBeUNnQXdJQkFnSVJBSlcrRnFEM0xrYnhlem1DY3ZxTHpaWXdEUVlKS29aSWh2Y05BUUVGQlFBdwpOekVVTUJJR0ExVUVDZ3dMVkdWc2FXRlRiMjVsY21FeEh6QWRCZ05WQkFNTUZsUmxiR2xoVTI5dVpYSmhJRkp2CmIzUWdRMEVnZGpFd0hoY05NRGN4TURFNE1USXdNRFV3V2hjTk16SXhNREU0TVRJd01EVXdXakEzTVJRd0VnWUQKVlFRS0RBdFVaV3hwWVZOdmJtVnlZVEVmTUIwR0ExVUVBd3dXVkdWc2FXRlRiMjVsY21FZ1VtOXZkQ0JEUVNCMgpNVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFNSys2eWZ3SWFQemFTWlZmcDNGClZSYVJYUDN2SWI5VGdIb3QwcEdNWXpIdzdDVHd3NlhTY253UWJmUTN0K1htZkhucWpMV0NpNjVJdHF3QTNHVjEKN0NwTlg4R0g5U0JsSzRHb1J6NkpJNVV3RnBCLzZGY0hTT2NacnI5Rlo3RTNHd1lxL3Q3NXJIMkQrMTY2NUkrWApaNzVMam8xa0IxYzRWV2swTmowVFNPOVA0dE5tSHFUUEdyZGVOalBVdEFhOUdBSDlkNFJRQUVYMWpGM29JN3grCi9qWGg3VkI3cVRDTkdkTUpqbWhuWGI4OGx4aFR1eWxpeGNwZWNzSEhsdFRiTGFDMEgya0Q3T3JpVVBFTVBQQ3MKODFNdDhCejE3V3c1T1hPQUZzaFNzQ1BONEQ3YzNUeEhvTHMxaXVLWWFJdSs1Yjl5N3RMNnBlMFM3ZnlZR0trbQpkdHdvU3hBZ0hOTi9GbmN0N1crQTkwbTdVd1c3WFdqSDFNaDFGaitKV292M0YwZlVUUEhTaVhrK1RUMllxR0hlCk9oN1MrRjRENE1ISkhJelRqVTNUbFRhek4xOWpZNXN6RlBBdEptdFRmSW1NTXNKdTdEMGhBRG5Kb1dqaVVJTXUKc0Rvcjh6YWdyQy9rYjJIQ1VRazVQb3RUdWJ0bjJ0eFR1WFpaTnAxRDVTRGdQVEpnaFNKUnQ4Y3p1OTBWTDZSNApwZ2Q3Z1VZMkJJYmRlVFhIbFN3N3NLTVhOZVZ6SDdSY1dlL2E2aEJsZTNyUWY1K3p0Q28zTzNDTG0xdTVLN2ZzCnNsRVNsMU1wV3RUd0VoRGNUd0s3RXBJdll0US9hVU44RGRiOFdIVUJpSjFZRmt2ZXVwRC9Sd0dKQm1yMlg3S1EKYXJNQ3BnS0l2N05IZmlyWjFmcG9lRFZOQWdNQkFBR2pQekE5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3Q3dZRApWUjBQQkFRREFnRUdNQjBHQTFVZERnUVdCQlR3ajFrNEFMUDFqNXFXRE5YcitudXFGK2dURWpBTkJna3Foa2lHCjl3MEJBUVVGQUFPQ0FnRUF2dVJjWWs0azlBd0kvL0RUREdqa2swa2lQMFFuYjd0dDNvTm16cWpNRGZ6MW1nYmwKZHhTUjY1MUJlNWtxaE9YLy9DSEJYZkRrSDFlM2RhbWhYd0ltLzlmSDkwN2VUL2ozSEViQWVrOUFMQ0kxOEJteAowR3RuTExDbzRNQkFOelgyaEZ4YzQ2OUNlUDZueVExUTZnMkVkdlpSNzROVHhuci9EbFpKTG85NjFnem1KMVRqClRRcGdjbUxOa1FmV3BiL0ltV3Z0eEJubXEwd1JPTVZ2TWVKdVNjZy9kb0FtQXlZcDREYjI5aUJUNHhkd05CZWQKWTJnZWErekRUWWE0RXpBdlhVWU5SMFBWRzZwWkRybGNqUVpJclhTSFg4ZjhNVlJCRStMSElRNmU0QjRONGNCNwpRNFdReFlwWXhtVUtlRmZ5eGlNUEFka2dTOTRQKzVLRmRTcGNjNDF0ZXlXUnl1NUZyZ1pMQU16VHNWbFEyanFJCk95bERSbDZYSzFUT1UyK05TdWVXK3I5eERrS0xmUDBvb05CSXl0ckVnVXk3b25PVEpzanJETlltaUxiQUpNKzcKdlZ2cmRYM3BDSTZHTXl4NWR3bHBwWW44czNDUWgzYVAweUs3UXM2OWN3c2dKaXJRbXoxd0hpUnN6WWQycVJlVwp0ODhOa3Z1T0dLbVlTZEdlL21CRWNpRzVHZTNDOVRIeE9VaUlrQ1IxVkJhdHp2VDRhUlJrT2Z1anVMcHdRTWNuCkhML0VWbFA2WTJYUTh4d09GdlZyaGxoTkdOVGtEWTZsblZ1UjNIWWtVRC9HS3Z2WnQ1eTExdWJRMmVnWml4VngKU0syMzZ0aFppTlNRdnhhejJlbXNXV0ZVeUJ5NnlzSEs0YmtnVEk4Nms0bWxvTXkvMC9aMXBIV1diVlk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89RS1UdVx1MDExZnJhIEVCRyBCaWxpXHUwMTVmaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuXHUwMTVlLiBPVT1FLVR1Z3JhIFNlcnRpZmlrYXN5b24gTWVya2V6aQojIFN1YmplY3Q6IENOPUUtVHVncmEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1FLVR1XHUwMTFmcmEgRUJHIEJpbGlcdTAxNWZpbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS5cdTAxNWUuIE9VPUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppCiMgTGFiZWw6ICJFLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogNzY2NzQ0NzIwNjcwMzI1NDM1NQojIE1ENSBGaW5nZXJwcmludDogYjg6YTE6MDM6NjM6YjA6YmQ6MjE6NzE6NzA6OGE6NmY6MTM6M2E6YmI6Nzk6NDkKIyBTSEExIEZpbmdlcnByaW50OiA1MTpjNjplNzowODo0OTowNjo2ZTpmMzo5MjpkNDo1YzphMDowZDo2ZDphMzo2Mjo4ZjpjMzo1MjozOQojIFNIQTI1NiBGaW5nZXJwcmludDogYjA6YmY6ZDU6MmI6YjA6ZDc6ZDk6YmQ6OTI6YmY6NWQ6NGQ6YzE6M2Q6YTI6NTU6YzA6MmM6NTQ6MmY6Mzc6ODM6NjU6ZWE6ODk6Mzk6MTE6ZjU6NWU6NTU6ZjI6M2MKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdTekNDQkRPZ0F3SUJBZ0lJYW1nK25GR2J5MU13RFFZSktvWklodmNOQVFFTEJRQXdnYkl4Q3pBSkJnTlYKQkFZVEFsUlNNUTh3RFFZRFZRUUhEQVpCYm10aGNtRXhRREErQmdOVkJBb01OMFV0VkhYRW4zSmhJRVZDUnlCQwphV3hweFo5cGJTQlVaV3R1YjJ4dmFtbHNaWEpwSUhabElFaHBlbTFsZEd4bGNta2dRUzdGbmk0eEpqQWtCZ05WCkJBc01IVVV0VkhWbmNtRWdVMlZ5ZEdsbWFXdGhjM2x2YmlCTlpYSnJaWHBwTVNnd0pnWURWUVFEREI5RkxWUjEKWjNKaElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERURXpNRE13TlRFeU1EazBPRm9YRFRJegpNRE13TXpFeU1EazBPRm93Z2JJeEN6QUpCZ05WQkFZVEFsUlNNUTh3RFFZRFZRUUhEQVpCYm10aGNtRXhRREErCkJnTlZCQW9NTjBVdFZIWEVuM0poSUVWQ1J5QkNhV3hweFo5cGJTQlVaV3R1YjJ4dmFtbHNaWEpwSUhabElFaHAKZW0xbGRHeGxjbWtnUVM3Rm5pNHhKakFrQmdOVkJBc01IVVV0VkhWbmNtRWdVMlZ5ZEdsbWFXdGhjM2x2YmlCTgpaWEpyWlhwcE1TZ3dKZ1lEVlFRRERCOUZMVlIxWjNKaElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Ck1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBNHZVL2t3VlJIb1ZpVkY1NkMvVVkKQjRPdWZxOTg5OVNLYTZWalF6bTVTL2ZEeG1TSlBaUXVWSUJTT1RrSFMwdmRoUWQyaDh5L0w1Vk16SDJuUGJ4SApENWh3K0l5RkhuU09rbTBiUU5HWkRidDFic2lwYTVyQWhER3Z5a1BMNnlzMDZJK1hhd0diMVE1S0NLcGJrblNGClE5T0FycUdJVzY2ejZsN0xGcHAzUk1paDlsUm96dDZQbHl1NlcwQUNER1FYd0xXVHplSHhFMmJPREhudjBaRW8KcTErZ0VsSXdjeG1PaitHTUI2TER1MHJ3Nmg4VnFPNGx6S1JHK0JzaTc3TU9RN29zSkxqRkxGelVIUGhkWkwzRAprMTRvcHo4bjhZNGUweXBRQmFOVjJjdm5PVlBBbUo2TVZHS0xKckQzZlkxODVNYWVaa0pWZ2tmbnNsaU5admNICmZDNDI1bEFjUDl0REpNVy9oa2Q1czNrYzkxcjBFK3hzK0QvaVdSK1Y3a0krdWEyb01vVkpsMGIrU3pHUFdzdXQKZEVjZjZaRzMzeWdFSXFEVUQxM2llVS9xYklXR3ZhaW16dVQ2dytHenJ0NDhVZTdMRTN3QmY0UU9YVkdVbmhNTQp0aTZsVFBrNWNEWnZsc291REVSVnhjcjZYUUtqMzlaa2pGcXpBUXFwdFFwSEYvL3ZrVUFxanFGR09qR1k1Ukg4CnpMdEpWb3I4dWRCaG1tOWxiT2JEeXo1MVNmNlBwK0tKeFdmWG5VWVRUakYyT3lTem5oRmxocXQvN3gzVStMem4KckZwY3QxcEhYRlhPVmJRaWNWdGJDL0RQM0tCaFpPcXAxMmdLWTZmZ0RUK2dyOU9xMG43dlVhRG1VU3RWa2hVWApVOHUzWmc1bVRQajVkVXlRNXhKd3gwVUNBd0VBQWFOak1HRXdIUVlEVlIwT0JCWUVGQzdqMjdKSjBKeFVlVno2Ckp5cit6RTdTNkU1VU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVMdVBic2tuUW5GUjUKWFBvbkt2N01UdExvVGxRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFBRgpOenIwVGJkRjRrVjFKSSsyZDFMb0hOZ1FrMlh6OGxrR3BENGVLZXhkMGRDcmZPQUtrRWg0N1U2WUE1bitLR0NSCkhUQWR1R044cU9ZMXRmclRZWGJtMWdkTHltbWFzb1I2ZDVORkZ4V2ZKTkNZRXhML3U2QXUvVTVNaC9qT1hLcVkKR3dYZ0FFWktnb0NsTTRzbzNPMDQwOS9sUHVuKysxbmRZWVJQMGxTV0UyRVRQbytBYWI2VFI3VTFROUphdXoxYwo3N05DUjgwN1ZSTUdzQW5iL1dQMk9vZ0ttVzkrNGM0YlUycEVaaU5SQ0h1OFcxS2kvUVkzT0VCaGowcVd1SkEzCitHYkhlSkFBRlM2THJWRTFVd2VvYTJpdStVNDhCeWJOQ0FWd3pEay9kcjJsMDJjbUFZYW1VOUpnTzN4RGYxV0sKdkpVYXdTZzVUQjlEMHBIMGNsbUt1VmI4UDdTZDJuQ2NkbHFNUTFEdWpqQnlUZC8vU2ZmR3FXZlpiYXdDRWVJNgpGaVduV0FqTGIxTkJuRWc0UjJnejBkZkhqOVIwSWRUREJaQjYvODZXaUxFVktWMGpxOUJnb1JKUDN2UVh6VExsCnliL0lRNjM5TG83eHIrTDBtUG9TSHlEWXdLY01oY1dROURzdGxpYXhMTDVNcSt1eDBvckoyM2dURHg0Sm5XMlAKQUo4QzJzSDZIM3A2Q2NSSzVvZ3FsNStKaS8wM1gxODZ6amhaaGt1dmNRdTAyUEp3VDU4eUUrT3dwMWZsMnRwRAp5NFEwOGlqRTZtMzBLdS9CYTNiYSszNjdoVHpTVThKTnZuSGhSZEg5STJjTkUzWDd6MlZuSXAydXNBblJDZjhkCk5MLytJNWMzMGpuNlBRMEdDN1RiTzZPcmIxd2R0bjdvczRJMDdRWmNKQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1ULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAyIE89VC1TeXN0ZW1zIEVudGVycHJpc2UgU2VydmljZXMgR21iSCBPVT1ULVN5c3RlbXMgVHJ1c3QgQ2VudGVyCiMgU3ViamVjdDogQ049VC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMiBPPVQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkggT1U9VC1TeXN0ZW1zIFRydXN0IENlbnRlcgojIExhYmVsOiAiVC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMiIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDJiOjliOjllOmU0OjdiOjZjOjFmOjAwOjcyOjFhOmNjOmMxOjc3Ojc5OmRmOjZhCiMgU0hBMSBGaW5nZXJwcmludDogNTk6MGQ6MmQ6N2Q6ODg6NGY6NDA6MmU6NjE6N2U6YTU6NjI6MzI6MTc6NjU6Y2Y6MTc6ZDg6OTQ6ZTkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDkxOmUyOmY1Ojc4OjhkOjU4OjEwOmViOmE3OmJhOjU4OjczOjdkOmUxOjU0OjhhOjhlOmNhOmNkOjAxOjQ1Ojk4OmJjOjBiOjE0OjNlOjA0OjFiOjE3OjA1OjI1OjUyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEd3pDQ0FxdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURDQmdqRUxNQWtHQTFVRUJoTUNSRVV4Ckt6QXBCZ05WQkFvTUlsUXRVM2x6ZEdWdGN5QkZiblJsY25CeWFYTmxJRk5sY25acFkyVnpJRWR0WWtneEh6QWQKQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVY25WemRDQkRaVzUwWlhJeEpUQWpCZ05WQkFNTUhGUXRWR1ZzWlZObApZeUJIYkc5aVlXeFNiMjkwSUVOc1lYTnpJREl3SGhjTk1EZ3hNREF4TVRBME1ERTBXaGNOTXpNeE1EQXhNak0xCk9UVTVXakNCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXhLekFwQmdOVkJBb01JbFF0VTNsemRHVnRjeUJGYm5SbGNuQnkKYVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZEJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVWNuVnpkQ0JEWlc1MApaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURJd2dnRWlNQTBHCkNTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDcVg5b2JYK2h6a2VYYVhQU2k1a2ZsODJoVllBVWQKQXFTem0xbnpIb3F2TkszOERjTFpTQm51YVkvSklQd2hxZ2NaN2JCY3JHWEhYKzBDZkh0OExSdld1cm1Bd2hpQwpGb1Q2WnJBSXhsUWpnZVROdVVrLzlrOXVOMGdvT0EvRnZ1ZG9jUDA1bDAzU3g1aVJVS3JFUkxNamZUbEg2VkppCjFoS1RYcmN4bGtJRiszYW5IcVAxd3Z6cGVzVnNxWEZQNnN0NHZHQ3Z4OTcwMmN1K2ZqT2xicFNEOERUNklhdnEKam5LZ1A2VGVNRnZ2aGsxcWxWdERSS2dRRlJ6bEFWZkZtUEhtQmlpUnFpREZ0MU1tVVVPeUN4R1ZXT0hBRDNiWgp3STE4Z2ZOeWNKNXYvaHFPMlY4MXhySnZOSHkrU0UvaVdqblgySjE0bnArR1BnTmVHWXRFb3RYSEFnTUJBQUdqClFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUy8KV1NBMkFIbWdvQ0pyak5YeVlkSzRMTXVDU2pBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQU1RT2lZUXNmZE9oeQpOc1p0K1UyZStpS280WUZXejgyN24rcXJrUms0cjZwOEZVM3p0cU9OcGZTTzlrU3BwK2dobGEwK0FHSVdpUEFDCnV2eGhJK1l6bXpCNmF6WmllNjBFSTRSWVplTGJLNHJuSlZNM1lsTmZ2Tm9CWWltaXBpZHg1am9pZnNGdkhaVncKSUVvSE5OL3EveFdBNWJyWGV0aGJkWHdGZWlsSGZrQ29NUk4zelVBN3RGRkhlaTRSNDBjUjNwMW0wSXZWVkdiNgpnMVhxZk1JcGlSdnBiN1BPNGdXRXlTOCtlSVZpYnNsZndYaGpkRmpBU0JnTW1UbnJwTXdhdFhsYWpSV2MyQlFOCjlub0hWOGNpZ3dVdFBKc2xKajBZczZsRGZNaklxMlNQRHFPL25CdWRNTnZhMEJrdXFqengrek9BZHVUTnJSbFAKQlNlT0U2RnV3Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BdG9zIFRydXN0ZWRSb290IDIwMTEgTz1BdG9zCiMgU3ViamVjdDogQ049QXRvcyBUcnVzdGVkUm9vdCAyMDExIE89QXRvcwojIExhYmVsOiAiQXRvcyBUcnVzdGVkUm9vdCAyMDExIgojIFNlcmlhbDogNjY0Mzg3NzQ5NzgxMzMxNjQwMgojIE1ENSBGaW5nZXJwcmludDogYWU6Yjk6YzQ6MzI6NGI6YWM6N2Y6NWQ6NjY6Y2M6Nzc6OTQ6YmI6MmE6Nzc6NTYKIyBTSEExIEZpbmdlcnByaW50OiAyYjpiMTpmNTozZTo1NTowYzoxZDpjNTpmMTpkNDplNjpiNzo2YTo0Njo0Yjo1NTowNjowMjphYzoyMQojIFNIQTI1NiBGaW5nZXJwcmludDogZjM6NTY6YmU6YTI6NDQ6Yjc6YTk6MWU6YjM6NWQ6NTM6Y2E6OWE6ZDc6ODY6NGE6Y2U6MDE6OGU6MmQ6MzU6ZDU6Zjg6Zjk6NmQ6ZGY6Njg6YTY6ZjQ6MWE6YTQ6NzQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURkekNDQWwrZ0F3SUJBZ0lJWERQTFlpeGZzekl3RFFZSktvWklodmNOQVFFTEJRQXdQREVlTUJ3R0ExVUUKQXd3VlFYUnZjeUJVY25WemRHVmtVbTl2ZENBeU1ERXhNUTB3Q3dZRFZRUUtEQVJCZEc5ek1Rc3dDUVlEVlFRRwpFd0pFUlRBZUZ3MHhNVEEzTURjeE5EVTRNekJhRncwek1ERXlNekV5TXpVNU5UbGFNRHd4SGpBY0JnTlZCQU1NCkZVRjBiM01nVkhKMWMzUmxaRkp2YjNRZ01qQXhNVEVOTUFzR0ExVUVDZ3dFUVhSdmN6RUxNQWtHQTFVRUJoTUMKUkVVd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNWaFR1WGJ5bzdManZQcHZNcApOYjdQR0t3K3F0bjRUYUErR2tlNXZKcmY4djdNUGtmb2VwYkNKSTQxOUtrTS9JTDliY0Z5WWllOTZtdnI1NHJNClZENlFVTStBMUpYNzZMV0MxQlRGdHFsVkpWZmJzVkQyc0dCa1dYcHB6d08zYncyK3lqNXZkSExxcWpBcWMySysKU1pGaHlCSCtEZ01xOTJvZzNBSVZEVjRWYXZ6amdzRzF4WjFrQ1d5aldaZ0hKOGNibGl0aGRIRnNRL0gzTllrUQo0SjdzVmFFM0lxS0hCQVVzUjMyMEhMbGlLV1lveXJmaGsvV2tsQU9adVhDRnRlWkk2bzFRL05uZXpHOEhEdDBMCmNwMkFNQllIbFQ4b0R2M0ZkVTlUMW5TYXRDUXVqZ0tSejNiRm14NVZkSng0SWJId0xmRUxuOExWbGhnZjhGUWkKZW93SEFnTUJBQUdqZlRCN01CMEdBMVVkRGdRV0JCU25wUWF4TEtZSllPN1JsK2x3cnJ3N0dXemJJVEFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZLZWxCckVzcGdsZzd0R1g2WEN1dkRzWmJOc2hNQmdHCkExVWRJQVFSTUE4d0RRWUxLd1lCQkFHd0xRTUVBUUV3RGdZRFZSMFBBUUgvQkFRREFnR0dNQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFBbWR6VGJsRWlHS2tHZExENEdrR0RFakt3TFZMZ2Z1WHZUQnpuaytqNTdzajFPN1o4agp2WmZ6YTF6djd2MUFwdCtoazZFS2hxenZJTkI1QWIxNDl4bllKREUwQkFHbXVoV2F3eWZjMkU4UHpCaGovNWtQCkRwRnJkUmJoSWZ6WUpzZEh0NmJQV0hKeGZycmhUWlZITzhtdmJhRzB3ZXlKOXJRUE9MWGlaTndsejZiYjY1cGMKbWFIRkNONzk1dHJWMWxwRkRNUzN3clVVNzdRUi93NFZ0ZlgxMjhhOTYxcW44RllpcVR4bFZNWVZxTDJHbnMyRApsbWg2Y1lHSjRRdmg2aEViYUFqTWFaN3Nua0dlUkRJbWV1S0hDbkU5NitSYXBOTGJ4YzNHM21CL3VmTlBSSkx2CktyY1lQcWNaMlF0OXNUZEJRckM2WUIzeS9na1JzUENIZTZlZAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049UXVvVmFkaXMgUm9vdCBDQSAxIEczIE89UXVvVmFkaXMgTGltaXRlZAojIFN1YmplY3Q6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBMYWJlbDogIlF1b1ZhZGlzIFJvb3QgQ0EgMSBHMyIKIyBTZXJpYWw6IDY4NzA0OTY0OTYyNjY2OTI1MDczNjI3MTAzNzYwNjU1NDYyNDA3ODcyMDAzNDE5NQojIE1ENSBGaW5nZXJwcmludDogYTQ6YmM6NWI6M2Y6ZmU6Mzc6OWE6ZmE6NjQ6ZjA6ZTI6ZmE6MDU6M2Q6MGI6YWIKIyBTSEExIEZpbmdlcnByaW50OiAxYjo4ZTplYTo1Nzo5NjoyOToxYTpjOTozOTplYTpiODowYTo4MToxYTo3Mzo3MzpjMDo5Mzo3OTo2NwojIFNIQTI1NiBGaW5nZXJwcmludDogOGE6ODY6NmY6ZDE6YjI6NzY6YjU6N2U6NTc6OGU6OTI6MWM6NjU6ODI6OGE6MmI6ZWQ6NTg6ZTk6ZjI6ZjI6ODg6MDU6NDE6MzQ6Yjc6ZjE6ZjQ6YmY6Yzk6Y2M6NzQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZZRENDQTBpZ0F3SUJBZ0lVZUZoZkxxMHNHVXZqTndjMU5CTW90WmJVWlpNd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NERUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4SGpBYwpCZ05WQkFNVEZWRjFiMVpoWkdseklGSnZiM1FnUTBFZ01TQkhNekFlRncweE1qQXhNVEl4TnpJM05EUmFGdzAwCk1qQXhNVEl4TnpJM05EUmFNRWd4Q3pBSkJnTlZCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk0KYVcxcGRHVmtNUjR3SEFZRFZRUURFeFZSZFc5V1lXUnBjeUJTYjI5MElFTkJJREVnUnpNd2dnSWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDZ3ZsQVFqdW55YkVDMEJKeUZ1VEhLM0Mza0Vha0VQQnRWCndlZFlNQjBrdE1QdmhkNk1MT0hCUGQrQzVrK3RSNGRzN0Z0SndVclZ1NC9zaDZ4L2dwcUc3RDBEbVZJQjBqV2UKck5yd1U4bG1QTlNzQWdIYUpOTTdxQUpHcjZRYzQvaHpXSGEzOWc2UURiWHd6OHo2K2NaTTVjT0dNQXFORjM0MQo2OFhmdXc2Y3dJMkg0NGc0aFdmNlBzZXI0Qk9jQlJpWXo1UDFzWkswL0NQVHo5WEVKMG5nbmp5YkNLT0xYU29oCjRQdzVxbFBhZlg3UEdnbFR2RjBGQk0raFNvK0xkb0lOb2ZqU3h4UjNXNUEyQjRHYlBnYjZVbDVqeGFZQS9xWHAKVWh0U3RaSTVjZ01KWXIyd1lCWnVwdDBsd2dObTNmTUUwVURpVG91RzlHL2xnNkFuaEY0RXdmV1F2VEE5eE8rbwphYnc0bTZTa2x0RmkybW5BQVphdXk4UlJOT29NcXY4aGpsbVBTbHprWVpxbjB1a3FlSTFSUFRvVjdxSlpqcWxjCjNzWDVrQ0xsaUVWeDNaR1piSHFmUFQyWWZGNzJ2aFpvb0Y2dUN5UDhXZytxSW5ZdHlhRVFIZVRUUkNPUWlKL0cKS3ViWDlacXpXQjR2TUlrSUcxU2l0WmdqN0FoM0hKVmRZZEhMaVp4Zm9rcVJtdThocWtrV0NLaTlZU2d4eVhTdApoZmJaeGJHTDBlVVFNazFmaXlBNlBFa2ZNNFZaRGR2TENYVkRhWFA3YTNGOThOL0VUSDNHb3k3SWxYbkxjNktPClRrMGsrMTdrQkw1eUc2WW5MVWxhbVhyWFhBa2d0MytVdVUveERSeGVpRUliRWJmbmtkdWViUFJxMzR3R21BT3QKekNqdnBVZnpVd0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQgpCakFkQmdOVkhRNEVGZ1FVbzVmVzgxNmlFT0dyUlo4OEYyUTg3Z0Z3bk13d0RRWUpLb1pJaHZjTkFRRUxCUUFECmdnSUJBQmo2VzNYOFBuckhYM2ZIeXQvUFg4TVN4RUJkMURLcXVHclgxUlVWUnBnanBlYVFXeGlaVE9PdFFxT0MKTVRhSXplbjd4QVNXU0lzQng0MEJ6MXN6QnBaR1puUWRUKzNCdHJtMERXSE1ZMzdYTG5lTWxod3FJMmhyaFZkMgpjRE1UL3VGUHBpTjNHUG9hak9pOVpjblBQL1RKRjl6cng3ekFCQzR0Umk5cFpzTWJqLzdzUHRQS2xMOTJDaVVOCnFYc0NIS25RTzE4THdJRTZQV1RodjZjdFRyMU54TmdweGlJWTBNV3NjZ0tDUDZvNm9qb2lsekhkQ0dQRGRSUzUKWUNndFcyamdGcWxtZ2lOUjlldFQyREdiZSttM25VdnJpQmJQK1YwNGlra3dqKzN4NnhuMGR4b3hHRTFuVkd3dgpiMlg1Mnozc0lleGU5UFNMeW1CbFZORnhaUFQ1cHFPQk16WXpjZkNrZUY5T3JZTWgzalJKamVoWnJKM3lkbG8yCjhoUDByK0FKeDJFcWJQZmduYTY3aGtvb2J5N3V0SG5Oa0RQRHMzYjY5ZkJzblFHUStwNlE5cHh5ejBmYXd4L2sKTlNCVDhsVFIzMkdEcGdMaUpUamVoVEl0WG5PUVVsMUN4TTQ5UytINUdZUWQxYUpRekVIN1FSVER2ZGJKV3FOagpaZ0tBdlFVNk8wZWM3QUFtVFBXSVViK29JMzhZQjdBTDdZc21vV1RUWVVyclhKL2VzNjluQTdNZjNXMWRhV2hwCnExNDY3SHhwdk1jN2hVNmVGYm0wRlUvRGxYcFkxOGxzNld5NTh5bGpYclFzOEMwOTdWcGw0S2xiUU1KSW1ZRnQKbmg4R0tqd1N0SXNQbTZJazhLYU4xbnJnUzdaa2xtT1ZoTUpLelJ3dUpJY3pZT1hECi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENBIDIgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDQSAyIEczIE89UXVvVmFkaXMgTGltaXRlZAojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSAyIEczIgojIFNlcmlhbDogMzkwMTU2MDc5NDU4OTU5MjU3NDQ2MTMzMTY5MjY2MDc5OTYyMDI2ODI0NzI1ODAwCiMgTUQ1IEZpbmdlcnByaW50OiBhZjowYzo4Njo2ZTpiZjo0MDoyZDo3ZjowYjozZToxMjo1MDpiYToxMjozZDowNgojIFNIQTEgRmluZ2VycHJpbnQ6IDA5OjNjOjYxOmYzOjhiOjhiOmRjOjdkOjU1OmRmOjc1OjM4OjAyOjA1OjAwOmUxOjI1OmY1OmM4OjM2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA4ZjplNDpmYjowYTpmOTozYTo0ZDowZDo2NzpkYjowYjplYjpiMjozZTozNzpjNzoxYjpmMzoyNTpkYzpiYzpkZDoyNDowZTphMDo0ZDphZjo1ODpiNDo3ZToxODo0MAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRllEQ0NBMGlnQXdJQkFnSVVSRmMwSkZ1QmlaczE4czY0S3p0YnB5YndkU2d3RFFZSktvWklodmNOQVFFTApCUUF3U0RFTE1Ba0dBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhIakFjCkJnTlZCQU1URlZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTWlCSE16QWVGdzB4TWpBeE1USXhPRFU1TXpKYUZ3MDAKTWpBeE1USXhPRFU1TXpKYU1FZ3hDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTQphVzFwZEdWa01SNHdIQVlEVlFRREV4VlJkVzlXWVdScGN5QlNiMjkwSUVOQklESWdSek13Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNocmlXeUFSamNWNGcvUnV2NXIrTHJJM0hpbXRGaFppRmYKcXE4blVlVnVHeGJVTFgxUXNGTjN2WGc2WU9Ka0FwdDhocHZXR282dC94OFZmOVdWSGhMTDVoU0VCTUhmTnJNVwpuNHJqeWR1WU5NN1lNeGNvUnZ5bnlmRFN0TlZOQ1hKSitmS0g0Nm5hZmFGOWE3STZKYWx0VWtTcytMNXUrOXltCmM1R1FZYVlERkNEeTU0ZWppSzJ0b0l6L3Bnc2xVaVhuRmdIVnk3ZzFnUXlqTy9EaDRmeGFYYzZBY1czNFNhcysKTzdxNDE0QUIrNlhyVzdQRlhtQXFNYUN2TitnZ09wK29NaXdNekFrZDA1Nk9YYnhNbU83RkdtaDc3Rk9tNlJRMQpvOS9OZ0o4TVNQc2M5UEcvU3JqNjFZeHhTc2NmcmY1Qm1yT0RYZktFVnUrbFYwUE9LYTJNcTFXL3hQdGJBZDBqCklhRllBSTdEMEdvVDdSUGpFaXVBM0dmbWxiTE5IaUp1S3ZoQjFQTEtGQWVOaWxVU3htbjF1SVpvTDFOZXNOS3EKSWNHWTVqRGpaMVhIbTI2c0dhaFZwa1VHMENNNjIrdGxYU29SRWZBN1Q4cHQ5RFRFY2VUL0FGcjJYSzRqWUlWego4ZVFRc1NXdTFaSzdFOEVNNERuYXREbFh0YXMxcW5JaE80TTE1ekhmZWlGdXVESUlmUjB5a1JWS1luTFA0M2VoCnZOVVJHM1lCWndqZ1FRdkQ2eFZ1K0tRWjJhS3JyK0luVWxZckFvb3NGQ1Q1djBJQ3Z5Ykl4by9nYmpoOVV5M2wKN1ppemxXTm9mL2sxOU4rSXhXQTFrc0I4YVJ4aGxSYlE2OTRMcno0RUVFVmxXRkE0cjBqeVdiWVc4andOa0FMRwpjQzRCclR3VjF3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCCkJqQWRCZ05WSFE0RUZnUVU3ZWR2ZGxxL1lPeEpXOGFsZDd0eUZuR2J4RDB3RFFZSktvWklodmNOQVFFTEJRQUQKZ2dJQkFKSGZnRDlEQ1g1eHd2ZnJzNGlQNFZHeXZEMTErU2hkeUx5Wm0zdGRxdVhLNFFyMzZMTFRuOTFuTVg2NgpBYXJIYWtFN2tOUUlYTEpnYXBEd3lNNERZdm1MN2Z0dUt0d0dUVHdwRDRrV2lsaE1TQS9vaEdIcVBIS21kK1JDCnJvaWpRMWg1ZnE3S3BWTU5xVDF3dlNBWllhUnNPUHhETXVIQlIvLzQ3UEVSSWpLV25NTDJXMm1XZXlBTVEwR2EKVy9aWkdZamVWWWczVVF0NFhBb2VvMEw5eDUySUQ4RHllQUlrVkpPdmlZZUl5VXFBSGVyUWJqNWhMamE3TlE0bgpsdjFtTkR0aGNuUHhGbHhIQmxSSkFIcFlFckFLNzRYOXNiZ3pkV3FUSEJMbVlGNXZIWC9KSHlQTGhHR2ZIb0pFCitWK3RZbFVrbWxLWTdWSG5vWDZYT3VZdkh4SGFVNEFzaFo2ck5SRGJJbDlxeFY2WFUvSXlBZ2t3bzFqd0RRSFYKY3NheGZHbDd3L1UyUmN4aGJsNU1sTVZlcnVnT1hvdS85ODNnN2FFT0d6UHVWQmorRDc3dmZvUnJRK053bU50ZApkYklOV1FlRkZTTTUxdkhmcVNZUDFrakhzNllpOVRNM1dwVkhuM3U2R0JWdi85WVVaSU5KMGdwbklkc1BOV05nCktDTGpzWldEellXbTNTOFA1MmRTYnJzdmhYejFTblBueFQ3QXZTRVNCVC84dHdOSkFsdklKZWJpVkRqMWVZZU0KSFZPeVRvVjdCampITFBqNHNIS05KZVYzVXZRREhFaW1VRitJSURCdThvSkRxejJYaE9kVCt5SEJUdzhpbW9hNApXU3IyUnowWmlDM29oZUdlN0lVSWFyRnNOTWtkN0Vnck8zanRac1NPZVdtRDNuK00KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENBIDMgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIDMgRzMiCiMgU2VyaWFsOiAyNjgwOTA3NjExNzA0NjE0NjI0NjM5OTU5NTIxNTczMjcyNDIxMzcwODkyMzk1ODEKIyBNRDUgRmluZ2VycHJpbnQ6IGRmOjdkOmI5OmFkOjU0OjZmOjY4OmExOmRmOjg5OjU3OjAzOjk3OjQzOmIwOmQ3CiMgU0hBMSBGaW5nZXJwcmludDogNDg6MTI6YmQ6OTI6M2M6YTg6YzQ6Mzk6MDY6ZTc6MzA6NmQ6Mjc6OTY6ZTY6YTQ6Y2Y6MjI6MmU6N2QKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDg4OmVmOjgxOmRlOjIwOjJlOmIwOjE4OjQ1OjJlOjQzOmY4OjY0OjcyOjVjOmVhOjVmOmJkOjFmOmMyOmQ5OmQyOjA1OjczOjA3OjA5OmM1OmQ4OmI4OjY5OjBmOjQ2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWURDQ0EwaWdBd0lCQWdJVUx2V2JBaWluMjNyLzFhT3A3cjBEb004U2FoMHdEUVlKS29aSWh2Y05BUUVMCkJRQXdTREVMTUFrR0ExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEhqQWMKQmdOVkJBTVRGVkYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNeUJITXpBZUZ3MHhNakF4TVRJeU1ESTJNekphRncwMApNakF4TVRJeU1ESTJNekphTUVneEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNCmFXMXBkR1ZrTVI0d0hBWURWUVFERXhWUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURNZ1J6TXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3p5dzRRWjQ3cUZKZW5NaW9LVmpaL2FFekhzMjg2SXhTUgoveGwvcGNxczdyTjJuWHJwaXh1cmF6SGIrZ3RUVEsvRnBScDVQSXBNLzZ6ZkpkNU8yWUl5QzBUZXl0dU1yS051CkZvTTdwbVJMTW9uN0ZoWTRmdXRENHROMFNzSmlDbk1LM1VtelY5S3dDb1dkY1R6ZW84dkFNdk1CT1NCREd6WFIKVTdPeDdzV1RhWUkrRnJVb1JxSGU2b2tKN1VPNEJVYUtodlZaUjc0YmJ3RWhFTG45cWRJb3loQTVDY29UTnMrYwpyYTFBZEhrckFqODAvL29nYVgzVDdtSDF1clBuTU5BM0k0WnlZVVVwU0Zsb2IzZW1Mb0crQjAxdnI4N0VSUk9SCkZIQUdqeCtmK0lkcHNRN3Z3NGtaNitvY1lmeDZiSXJjMWdNTG5pYTZFdDNVVkRtckpxTXo2bldCMmkzTkQwL2sKQTlIdkZaY2JhNURGQXBDVFpnSWhzVWZlaTVwS2dMbFZqN1dpTDhEV00yZmFmc1NudEFSRTYwZjc1bGk1OXd6dwpleXV4d0hBcHcwQmlMVHRJYWR3alBFanJld2w1cVczYXFEQ1l6NEJ5QTRpbVcwYXVjbmw4Q0FNaFphNjM0UnlsCnNTcWlNZDVtQlBmQWRPaHgzdjg5V2N5V0poS0xoWlZYR3F0cmRRdEVQUkVvUEh0aHQrS1BaMC9sN0R4TVlJQnAKVnpnZUFWdU5WZWpIMzhETWR5TTBTWFY4OXBnUjZ5M2U3VUV1RkFVQ2YrRCtJT3MxNXhHc0lzNVhQZDdKTUcwUQpBNFhOOGYrTUZyWEJzajZJYkdCL2tFK1Y5L1l0clFFNUJ3VDZkWUI5djBsUTdlL0p4SHdjNjRCKzI3YlEzUlArCnlkT2MxN0tYcVFJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBZEJnTlZIUTRFRmdRVXhoZlF2S2pxQWtQeUd3YVpYU3VRSUxuWG5PUXdEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0lCQURSaDJWYTFFb2RWVGQyak5URkd1NlFIY3J4ZllXTG9wZnNMTjdFOHRyUDZLWjEvQXZXa3lhaVR0M3B4CktHbVBjK0ZTa05yVnZqcmx0M1pxVm9BaDMxM202VHFlNVQ3Mm9tbkhLZ3F3R0VmY0lIQjlVcU0rV1h6QnVzbkkKRlVCaHluTFdjS3pTdC9BYzVJWXA4TTd2YUdQUXRTQ0tGV0dhZm9hWXRNbkNkdnZNdWpBV3pLTmh4blFUNVd2dgpveFhxQS80VGkyVGswOEhTNklUN1NkRVFUWGxtNjZyOTlJMHhIbkFVcmR6ZVp4Tk1nUlZodkxmWmtYZHhHWUZnCnUvQllwYldjQy9lUElsVW53RXNCYlR1WkRkUWRtMk5uTDlEdURjcG12SlJQcHEzdC9PNWpyRmMvWlNYUHNvYVAKMEFqL3VIWVVidDdsSit5cmVMVlR1YlkvNkNENTBxaStZVWJLaDR5RTgvbnhvR2liSWg2Qkpwc1FCSkZ4d0FZZgozS0RUdVZhbjQ1Z3RmNE9kMzR3cm5ES09NcFR3QVR3aUtwOUR3aTdEbURrSE9IdjhYZ0JDSC9NeUpubURoUGJsCjhNRlJFc0FMSGdRakRGU2xUQzlKeFVyUnRtNWdEV3Y4YTR1RkpHUzNpUTZySlVkYlBNOStTYjNINlFyRzJ2ZCsKRGhjSTAwaVgwSEdTOEE4NVBqUnFISDNZOGlLdXUybjBNN1NtU0ZYUkR3NG02T3kyQ3kybmhUWE4vVm5JbjlITgpQbG9wTkxrOWhNNnhaZFJaa1pGV2RTSEJkNTc1ZXVGZ25kT3RCQmowZk90ZWs0OVRTaUlwK0VnclBrMkdyRnQvCnl3YVpXV0RZV0dXVmpVVFI5MzkrSjM5OXJvRDFCMHkyUHB4eFZKa0VTLzFZK1pqMAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEcyIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEcyIgojIFNlcmlhbDogMTUzODUzNDgxNjA4NDAyMTM5Mzg2NDMwMzM2MjA4OTQ5MDU0MTkKIyBNRDUgRmluZ2VycHJpbnQ6IDkyOjM4OmI5OmY4OjYzOjI0OjgyOjY1OjJjOjU3OjMzOmU2OmZlOjgxOjhmOjlkCiMgU0hBMSBGaW5nZXJwcmludDogYTE6NGI6NDg6ZDk6NDM6ZWU6MGE6MGU6NDA6OTA6NGY6M2M6ZTA6YTQ6YzA6OTE6OTM6NTE6NWQ6M2YKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDdkOjA1OmViOmI2OjgyOjMzOjlmOjhjOjk0OjUxOmVlOjA5OjRlOmViOmZlOmZhOjc5OjUzOmExOjE0OmVkOmIyOmY0OjQ5OjQ5OjQ1OjJmOmFiOjdkOjJmOmMxOjg1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEbGpDQ0FuNmdBd0lCQWdJUUM1TWNPdFk1Witwbkk3L0RyNXIwU3pBTkJna3Foa2lHOXcwQkFRc0ZBREJsCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdgpiM1FnUnpJd0hoY05NVE13T0RBeE1USXdNREF3V2hjTk16Z3dNVEUxTVRJd01EQXdXakJsTVFzd0NRWURWUVFHCkV3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmwKY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWdSekl3Z2dFaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURaNXlndlVqODJja21Ja3pUeitHb2VNVlNBCm42MVVRYlZIMzVhbzFLK0FMYmtLejNYOWlhVjlKUHJqSWd3cnZKVVhDek8vR1UxQkJwQUF2UXhORVA0SHRlY2MKYmlKVk1XV1h2ZE1YMGg1aTg5dnFiRkNNUDRRTWxzKzN5d1BneW0yaEZFd2JpZDN0QUxCU2ZLK1JiTEU0RTlIcApFZ2pBQUxBY0t4SGFkM0EybTY3T2VZZmNnbkRtQ1hSd1ZXbXZvMmlmdjkyMmViUHluWEFwVmZTci81Vmg4OGxBCmJ4M1J2cE83MDRncXU1Mi9jbHBXY1RzLzFQUFJDdjRvNzZQdTJabXZBOU9QWUxmeWtxR3h2WW1KSHpETnc2WXUKWWpPdUZnSjNSRnJuZ1FvOHAwUXVlYmcvQkx4Y29JZmhHNjlSanMzc0xQcjQvbTN3T255cWkrUm5sVEdOQWdNQgpBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUIwR0ExVWREZ1FXCkJCVE93MHE1bVZYeXVOdGd2NmwrdlZhMWx6YW4xakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBeXFWVmpPUEkKUVc1cEo2ZDFFZTg4aGpadjBwM0dlRGdkYVphaWtta3VPR3liZlFUVWlhV3hNVGVLeVNITXEyek5peHlhMXI5SQowakptd1lyQTh5ODY3OERqMUpHRzBWRGpBOXR6ZDI5S09WUHQzaWJIdFgydkswTFJkV0xqU2lzQ3gxQkw0R25pCmxtd09SR1lRUkkrdEJldjRlYXltRytnM05KMVR5V0dxb2xLdlNuQVdoc0k2eUxFVGNEYll6KzcwQ2pUVlcwejkKQjV5aXV0a0JjbHp6VGNIZERyRWNEY1JqdnEzMEZQdUo3S0pCRGt6TXlGZEEwRzREcXMwTWpvbVptV3p3UERDdgpPTjl2dktPK0tTQW5xM1QvRXlKNDNwZFNWUjZEdFZRZ0ErNnV3RTlXM2pmTXczK3FCQ2U3MDNlNFl0c1hmSndvCkloTnpiTThtOVlvcDV3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMyBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEczIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMyIKIyBTZXJpYWw6IDE1NDU5MzEyOTgxMDA4NTUzNzMxOTI4Mzg0OTUzMTM1NDI2Nzk2CiMgTUQ1IEZpbmdlcnByaW50OiA3Yzo3Zjo2NTozMTowYzo4MTpkZjo4ZDpiYTozZTo5OTplMjo1YzphZDo2ZTpmYgojIFNIQTEgRmluZ2VycHJpbnQ6IGY1OjE3OmEyOjRmOjlhOjQ4OmM2OmM5OmY4OmEyOjAwOjI2OjlmOmRjOjBmOjQ4OjJjOmFiOjMwOjg5CiMgU0hBMjU2IEZpbmdlcnByaW50OiA3ZTozNzpjYjo4Yjo0Yzo0NzowOTowYzphYjozNjo1NToxYjphNjpmNDo1ZDpiODo0MDo2ODowZjpiYToxNjo2YTo5NToyZDpiMTowMDo3MTo3Zjo0MzowNTozZjpjMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1JqQ0NBYzJnQXdJQkFnSVFDNkZhK2gzZm9MVkpSSy9OSktCczdEQUtCZ2dxaGtqT1BRUURBekJsTVFzdwpDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1ClpHbG5hV05sY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWcKUnpNd0hoY05NVE13T0RBeE1USXdNREF3V2hjTk16Z3dNVEUxTVRJd01EQXdXakJsTVFzd0NRWURWUVFHRXdKVgpVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1ClkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWdSek13ZGpBUUJnY3EKaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFaNTd5c1JHWHR6YmcvV1B1TnNWZXBSQzBGRmZMdkMvOFFkSisxWWxKZgpabjRmNWR3YlJYa0x6TVpUQ3AyTlhRTFpxVm5lQWxyMmxTb09qVGhLaWtuR3ZNWURPQWRmVmRwK0NXN2lmMTdRClJTQVBXWFlRMXFBazhDM2VOdkpzS1RtalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC8KQkFRREFnR0dNQjBHQTFVZERnUVdCQlRMMEwycDRaZ0ZVYUZOTjZLRGVjNk5IU3JraERBS0JnZ3Foa2pPUFFRRApBd05uQURCa0FqQWxwSUZGQW1zU1MzVjBUOGdqNDNEeWRYTGVmSW53ejVGeVlaNWVFSkpaVnJtRHh4RG5PT2xZCkpqWjkxZVEwaGprQ01IdzJVL0F3NVdKak9wbml0cU03bXpUNkh0b1FrbkZla1JPbjNhUnVrc3d5MXZVaFpzY3YKNnBaamFtVkZrcFVCdEE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgRzIgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IEcyIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEdsb2JhbCBSb290IEcyIgojIFNlcmlhbDogNDI5Mzc0MzU0MDA0Njk3NTM3ODUzNDg3OTUwMzIwMjI1MzU0MQojIE1ENSBGaW5nZXJwcmludDogZTQ6YTY6OGE6Yzg6NTQ6YWM6NTI6NDI6NDY6MGE6ZmQ6NzI6NDg6MWI6MmE6NDQKIyBTSEExIEZpbmdlcnByaW50OiBkZjozYzoyNDpmOTpiZjpkNjo2Njo3NjoxYjoyNjo4MDo3MzpmZTowNjpkMTpjYzo4ZDo0Zjo4MjphNAojIFNIQTI1NiBGaW5nZXJwcmludDogY2I6M2M6Y2I6Yjc6NjA6MzE6ZTU6ZTA6MTM6OGY6OGQ6ZDM6OWE6MjM6Zjk6ZGU6NDc6ZmY6YzM6NWU6NDM6YzE6MTQ6NGM6ZWE6Mjc6ZDQ6NmE6NWE6YjE6Y2I6NWYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURqakNDQW5hZ0F3SUJBZ0lRQXpyeDVxY1JxYUM3S0dTeEhRbjY1VEFOQmdrcWhraUc5dzBCQVFzRkFEQmgKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1TQXdIZ1lEVlFRREV4ZEVhV2RwUTJWeWRDQkhiRzlpWVd3Z1VtOXZkQ0JICk1qQWVGdzB4TXpBNE1ERXhNakF3TURCYUZ3MHpPREF4TVRVeE1qQXdNREJhTUdFeEN6QUpCZ05WQkFZVEFsVlQKTVJVd0V3WURWUVFLRXd4RWFXZHBRMlZ5ZENCSmJtTXhHVEFYQmdOVkJBc1RFSGQzZHk1a2FXZHBZMlZ5ZEM1agpiMjB4SURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFY3lNSUlCSWpBTkJna3Foa2lHCjl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF1emZOTk54N2E4bXlhSkN0U25YL1Jyb2hDZ2lOOVJsVXlmdUkKMi9PdThqcUprVHg2NXFzR0dtdlByQzNvWGdra1JMcGltbjdXbzZoKzRGUjFJQVdzVUxlY1l4cHNNTnphSHhteAoxeDdlL2RmZ3k1U0RONjdzSDBOTzNYc3MwcjB1cFMva3FiaXRPdFNacExZbDZadHJBR0NTWVA5UElVa1k5MmVRCnEyRUduSS95dXVtMDZaSXlhN1h6VitoZEc4Mk1IYXVWQkpWSjh6VXRsdU5KYmQxMzQvdEpTN1NzVlFlcGo1V3oKdENPN1RHMUY4UGFwc3BVd3RQMU1WWXduU2xjVWZJS2R6WE9TMHhaS0JneU1VTkdQSGdtK0Y2SG1JY3I5ZytVUQp2SU9sQ3NSbktQWnpGQlE5Um5iRGh4U0pJVFJOcnc5RkRLWkpvYnE3bk1XeE00TXBoUUlEQVFBQm8wSXdRREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJoakFkQmdOVkhRNEVGZ1FVVGlKVUlCaVYKNXVOdTVnLzYrcmtTN1FZWGp6a3dEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBR0JuS0pSdkRraGo2ekhkNm1jWQoxWWw5UE1XTFNuL3B2dHNyRjkrd1gzTjNLaklUT1lGblFvUWo4a1ZuTmV5SXYvaVBzR0VNTktTdUlFeUV4dHY0Ck5lRjIyZCttUXJ2SFJBaUdmelowSkZyYWJBMFVXVFc5OGtuZHRoL0pzdzFIS2oyWkw3dGN1N1hVSU9HWlgxTkcKRmR0b20vRHpNTlUrTWVLTmhKN2ppdHJhbGo0MUU2VmY4UGx3VUhCSFFSRlhHVTdBajY0R3hKVVRGeThiSlo5MQo4ckdPbWFGdkU3RkJjZjZJS3NoUEVDQlYxL01VUmVYZ1JQVHFoNVV5a3c3K1UwYjZMSjMvaXlLNVM5a0pSYVRlCnBMaWFXTjBiZlZLZmpsbERpSUdrbmliVmI2M2REY1kzZmUwRGtodmxkMTkyN2p5TnhGMVdXNkxaWm02ek5UZmwKTXJZPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgRzMgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IEczIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEdsb2JhbCBSb290IEczIgojIFNlcmlhbDogNzA4OTI0NDQ2OTAzMDI5MzI5MTc2MDA4MzMzMzg4NDM2NDE0NgojIE1ENSBGaW5nZXJwcmludDogZjU6NWQ6YTQ6NTA6YTU6ZmI6Mjg6N2U6MWU6MGY6MGQ6Y2M6OTY6NTc6NTY6Y2EKIyBTSEExIEZpbmdlcnByaW50OiA3ZTowNDpkZTo4OTo2YTozZTo2Njo2ZDowMDplNjo4NzpkMzozZjpmYTpkOTozYjplODozZDozNDo5ZQojIFNIQTI1NiBGaW5nZXJwcmludDogMzE6YWQ6NjY6NDg6Zjg6MTA6NDE6Mzg6Yzc6Mzg6ZjM6OWU6YTQ6MzI6MDE6MzM6Mzk6M2U6M2E6MTg6Y2M6MDI6Mjk6NmU6Zjk6N2M6MmE6Yzk6ZWY6Njc6MzE6ZDAKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNQekNDQWNXZ0F3SUJBZ0lRQlZWV3ZQSmVwRFUxdzZRUDFhdEZjakFLQmdncWhrak9QUVFEQXpCaE1Rc3cKQ1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdQpaR2xuYVdObGNuUXVZMjl0TVNBd0hnWURWUVFERXhkRWFXZHBRMlZ5ZENCSGJHOWlZV3dnVW05dmRDQkhNekFlCkZ3MHhNekE0TURFeE1qQXdNREJhRncwek9EQXhNVFV4TWpBd01EQmFNR0V4Q3pBSkJnTlZCQVlUQWxWVE1SVXcKRXdZRFZRUUtFd3hFYVdkcFEyVnlkQ0JKYm1NeEdUQVhCZ05WQkFzVEVIZDNkeTVrYVdkcFkyVnlkQzVqYjIweApJREFlQmdOVkJBTVRGMFJwWjJsRFpYSjBJRWRzYjJKaGJDQlNiMjkwSUVjek1IWXdFQVlIS29aSXpqMENBUVlGCks0RUVBQ0lEWWdBRTNhZlp1NHE0Qy9zTGZ5SFM4TDYrYy9NelhScThOT3JleHB1ODBKWDI4TXpRQzdwaFcxRkcKZnA0dG4rNk9Zd3dYN0FkdzljK0VMa0NEbk9nL1FXMDdyZE9rRkZrMmVKMERRKzRRRTJ4eTNxNklwNkZydFVQTwpaOXdqL3dNY28rSStvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJoakFkCkJnTlZIUTRFRmdRVXM5dElwUG1oeGRpdU5rSE1FV05wWWltOFM4WXdDZ1lJS29aSXpqMEVBd01EYUFBd1pRSXgKQUsyODhtdy9Fa3JSTFRuRENnbVhjL1NJTm95SUo3dm1pSTFRaGFkaitaNHkzbWFURC9ITXNRbVAzV3lyK210LwpvQUl3T1daYndtU051SjVRM0tqVlNhTHR4OXpSU1g4WEFiaklobzlPaklncnFKcXBpc1hSQUwzNFZPS2E1VnQ4CnN5Y1gKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNCBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0IE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNCIKIyBTZXJpYWw6IDc0NTE1MDA1NTg5NzczNzA3Nzc5MzAwODQ4NjkwMTY2MTQyMzYKIyBNRDUgRmluZ2VycHJpbnQ6IDc4OmYyOmZjOmFhOjYwOjFmOjJmOmI0OmViOmM5OjM3OmJhOjUzOjJlOjc1OjQ5CiMgU0hBMSBGaW5nZXJwcmludDogZGQ6ZmI6MTY6Y2Q6NDk6MzE6Yzk6NzM6YTI6MDM6N2Q6M2Y6Yzg6M2E6NGQ6N2Q6Nzc6NWQ6MDU6ZTQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU1OjJmOjdiOmRjOmYxOmE3OmFmOjllOjZjOmU2OjcyOjAxOjdmOjRmOjEyOmFiOmY3OjcyOjQwOmM3OjhlOjc2OjFhOmMyOjAzOmQxOmQ5OmQyOjBhOmM4Ojk5Ojg4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGa0RDQ0EzaWdBd0lCQWdJUUJac2JWNTZPSVRMaU9RZTlwM2QxWERBTkJna3Foa2lHOXcwQkFRd0ZBREJpCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU0V3SHdZRFZRUURFeGhFYVdkcFEyVnlkQ0JVY25WemRHVmtJRkp2YjNRZwpSelF3SGhjTk1UTXdPREF4TVRJd01EQXdXaGNOTXpnd01URTFNVEl3TURBd1dqQmlNUXN3Q1FZRFZRUUdFd0pWClV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXUKWTI5dE1TRXdId1lEVlFRREV4aEVhV2RwUTJWeWRDQlVjblZ6ZEdWa0lGSnZiM1FnUnpRd2dnSWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDLzVwQnphTjY3NUYxS1BEQWlNR2t6N01LbkpTN0pJVDN5Cml0aFp3dUVwcHoxWXEzYWF6YTU3RzRRTnhEQWY4eHVrT0JiclZzYVhiUjJyc25ueXloSFM1Ri9XQlR4U0QxSWYKeHA0VnBYNituNmxYRmxsVmNxOW9rM0RDc3JwMW1XcHpNcFRSRUVRUUx0K0M4d2VFNW5RN2JYSGlMUXdiN2lEVgp5U0FkWXlrdHp1eGVUc2lUK0NGaG16VHJCY1plN0ZzYXZPdkp6ODJzTkVCZnNYcG03bmZJU0tobVYxZWZWRmlPCkRDdTNUNmN3MlZidXludGQ0NjNKVDE3bE5lY3h5OXFUWHR5T2o0RGF0cEdZUUpCNXczakh0ckhFdFdvWU9BTVEKamRqVU42UXVCWDJJOVlJK0VKRndxMVdDUVRMWDJ3UnpLbTZSQVh3aFROUzhyaHNEZFYxNFp0azZNVVNhTTBDLwpDTmRhU2FUQzVxbWdaOTJrSjd5aFR6bTFFVmdYOXlSY1JvOWs5OEZwaUhhWWRqMVpYVUoyaDRtWGFYcEk4T0NpCkVodG1tblRLM2tzZTV3NWpydWJVNzVLU09wNDkzQURrUlNXSnRwcEVHU3Qrd0pTMDBtRnQ2elBaeGQ5TEJBRE0KZlJ5Vnc0LzNJYkt5RWJlN2YvTFZqSEFzUVdDcXNXTVlSSlVhZG1KKzlvQ3crK2hrcGpQUmlRZmh2YmZtUTZRWQp1S1ozQWVFUGxBd2hIYkpVS1NXSmJPVU9VbEZIZEw0bXJMWkJkZDU2ckYrTlA4bTgwMEVSRWx2bEVGRHJNY1hLCmNoWWlDZDk4VEhVL1krd2hYOFFnVVd0dnNhdUdpMC9DMWtWZm5TRDhvUjdGd0kraXNYNEtKcG4xNUdrdm1CMHQKOWRtcHNoM2xHd0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQgpoakFkQmdOVkhRNEVGZ1FVN05mamd0SnhYV1JNM3k1blArZTZtSzRjRDA4d0RRWUpLb1pJaHZjTkFRRU1CUUFECmdnSUJBTHRoMlgycGJMNFh4SkVidzZHaUFJM2paR2dQVnM5M3JuRDUvWnBLbWJuSmVGd01ERi9rNWhRcFZnczIKU1YxRVkrQ3RuSllZWmhzakRUMTU2VzFyMWxUNDBqekJRMEN1SFZEMVV2eVFPN3VZbVdscng4R25xR2lrSjl5ZAorU2V1TUlXNTltZE5PajZQV1RraVUwVHJ5RjBEeXUxUWVuMWlJUXFBeUhObTBhQUZZRi9vcGJTbnI2ajNiVFdjCmZGcUsxcUk0bWZONGkvUk4waUFMM2dUdWpKdEhnWElOd0JReTd6QlpMcTdnY2ZKVzVHcVhiNUpRYlphTmFIcWEKc2pZVWVnYnlKTGtKRVZEWENMRzRpWHFFSTJGQ0tlV2p6YUlnUWRmUm5HVFo2aWFoaXhUWFRCbXlVRUZ4UFQ5TgpjQ09HREVyY2dkTE1NcFNFRFFnSmx4eFB3TzVySUhRdzB1QTVOQkNGSVJVQkNPaFZNdDV4U2Rrb0YxQk41cjVOCjBYV3MwTXI3UWJoRHBhclR3d1ZFVHl3Mm0rTDY0a1c0STFOc0JtOW5WWDlHdFV3L2JpaGFlU2JTcEtoaWw5SWUKNHUxS2k3d2IvVWRLRGQ5blpuNnlXMEhRTytUME8vUUVZK252d2xRQVVhQ0tLc25PZU16VjZvY0VHTFBPcjBtSQpyL09TbWJhejVtRVAwb1VBNTFBYTVCdVZuUm1odVp5eG03RUFIdS9RRDA5Q2JNa0t2TzVEK2pweHBjaE5KcVUxCi9ZbGR2SVZpSFRMU29DdFU3WnBYd2R2NkVNOFp0NHRLRzQ4QnRpZVZVK2kyaVcxYnZHalVJK2lMVWFKVytmQ20KZ0tEV0hyTzhEdzlUZFNtcTZoTjM1TjZNZ1NHdEJ4QkhFYTJIUFFmUmRielA4MlorCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89Q09NT0RPIENBIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1DT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89Q09NT0RPIENBIExpbWl0ZWQKIyBMYWJlbDogIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAxMDE5MDkwODQ1Mzc1ODIwOTMzMDg5NDEzNjM1MjQ4NzMxOTMxMTcKIyBNRDUgRmluZ2VycHJpbnQ6IDFiOjMxOmIwOjcxOjQwOjM2OmNjOjE0OjM2OjkxOmFkOmM0OjNlOmZkOmVjOjE4CiMgU0hBMSBGaW5nZXJwcmludDogYWY6ZTU6ZDI6NDQ6YTg6ZDE6MTk6NDI6MzA6ZmY6NDc6OWY6ZTI6Zjg6OTc6YmI6Y2Q6N2E6OGM6YjQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDUyOmYwOmUxOmM0OmU1OjhlOmM2OjI5OjI5OjFiOjYwOjMxOjdmOjA3OjQ2OjcxOmI4OjVkOjdlOmE4OjBkOjViOjA3OjI3OjM0OjYzOjUzOjRiOjMyOmI0OjAyOjM0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGMkRDQ0E4Q2dBd0lCQWdJUVRLcjV5dHRqYitBZjkwN1lXd09HblRBTkJna3Foa2lHOXcwQkFRd0ZBRENCCmhURUxNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEcKQTFVRUJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRUNoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVgpCQU1USWtOUFRVOUVUeUJTVTBFZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1UQXdNVEU1Ck1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaFRFTE1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ1QKRWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2hNUgpRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVkJBTVRJa05QVFU5RVR5QlNVMEVnUTJWeWRHbG1hV05oCmRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ1IKNkZTUzBncFdzYXdOSk4zRnowUm5kSmtyTjZOOUkzQUFjYnhUMzhUNktoS1BTMzhRVnIyZmNISzNZWC9KU3c4WApwejNqc0FSaDd2OFJsOGYwaGo0SytqNWMrWlBtTkhyWkZHdm5uTE9Gb0lKNmRxOXhrTmZzL1EzNm5HejYzN0NDCjlCUisrYjdFcGk5UGY1bC90ZnhuUTNLOURBRFdpZXRyTE5QdGo1Z2NGS3QrNWVOdS9OaW81SklrMmtOcllyaFYKL2VyQnZHeTJpL01Palpya20yeHBtZmg0U0RCRjFhM2hEVHhGWVB3eWxsRW52R2ZEeWk2MmErcEd4OGNnb0xFZgpaZDVJQ0xxa1RxbnlnMFkzaE92b3pJRklRMmRPY2lxYlhMMU1HeWlLWENKN3RLdVkyZTdnVVlQRENVWk9iVDZaCitwVVgybnd6VjBFOGpWSHRDN1pjcnl4akd0OVh5RCs4NlYzRW02OUZtZUtqV2lTMHVxbFdQYzl2cXY5SldMN3cKcVAvMHVLM3BOL3U2dVBRTE92bm9RMEllaWRpRXl4UHgyYnZoaVdDNGpDaFdyQlFkbkFybmNldlBEdDA5cVphaApTTDA4OTYrMURTSk13QkdCN0ZZNzl0T2k0bHUzc2dRaVVwV0FrMm5vamt4bDhaRURMWEIwQXVxTFp4VXBhVklDCnU5ZmZVR3BWUnIrZ295aGhmM0RRdzZLcUxDR3FSODRvbkFaRmRyK0NHQ2UwMWE2MHkxRG1hL1JNaG5FdzZhYmYKRm9iZzJQOUEzZnZRUW9oL296TTZMbHdlUVJHQlk4NFljV3NyN0thS3R6RmNPbXBINE1ONVdkWWdHcS95YXBpcQpjcnhYU3RKTG5ic1EvTEJNUWVYdEhUMWVLSjJjekwrelVkcW5SK1dFVXdJREFRQUJvMEl3UURBZEJnTlZIUTRFCkZnUVV1NjkrQWozNnB2RThoSTZ0N2ppWTdOa3lNdFF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIKL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTUJRQURnZ0lCQUFyeDFVYUV0NjVSdTJ5eVRVRVVBSk5Nbk12bAp3RlRQb0NXT0F2bjlzS0lOOVNDWVBCTXRyRmFpc05aK0VaTHBMcnFlTHBweXNiMFpSR3hoTmFLYXRCWVNhVnFNCjRkYytwQnJvTHdQMHJtRWRFQnNxcEl0NnhmNEZwdUhBMXNqK25xNlBLN285bWZqWWN3bFlSbTZtblBUWEo5T1YKMmplRGNoelRjK0NpUjVrRE9GM1ZTWGtBS1J6SDdKc2dIQWNrYVZkNHNqbjhPb1NndFp4OGpiOHVrMkludHpuYQpGeGl1dlR3SmFQK0VtenpWMWdzRDQxZWVGUGZSNjAvSXZZY2p0N1pKUTNtRlhMcnJrZ3VoeHVob3FFd1dzUnFaCkN1aFRMSks3b1FrWWRReGxxSHZMSTdjYXdpaUZ3eHYvMEN0aTc2UjdDWkdZWjR3VUFjMW9CbXBqSVhVRGdJaUsKYm9IR2hmS3BwQzNuOUtVa0VFZUR5czMwalhsWXNRYWI1eG9xMlowQjE1Ujk3UU5LeXZEYjZLa0JQdlZXbWNrZQpqa2s5dStVSnVlQlBTWkk5Rm9KQXpNeFp4dVk2N1JJdWFUeHNsYkg5cWgxN2Y0YStIZzR5UnZ2N0U0OTFmMHlMClMwWmovZ0EwUUhEQnc3bWgzYVp3NGdTelFienBnSkhxWkp4NjRTSURxWnh1Ync1bFQyeUhoMTd6YnFENWRhV2IKUU9oVHNpZWRTcm5BZHlHTi80ZnkzcnlNN3hmZnQwa0wwZkp1TUFzYURrNTI3Ukg4OWVsV3NuMi94MjBLazR5bAowTUMySGI0NlRwU2kxMjVzQzhLS2ZQb2c4OFRrNWMwTnFNdVJrckY4aGV5MUZHbG1Eb0xuemM3SUxhWlJmeUhCCk5WT0ZCa3BkbjYyN0cxOTAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UaGUgVVNFUlRSVVNUIE5ldHdvcmsKIyBTdWJqZWN0OiBDTj1VU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VGhlIFVTRVJUUlVTVCBOZXR3b3JrCiMgTGFiZWw6ICJVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMjY0NTA5Mzc2NDc4MTA1ODc4NzU5MTg3MTY0NTY2NTc4ODcxNwojIE1ENSBGaW5nZXJwcmludDogMWI6ZmU6Njk6ZDE6OTE6Yjc6MTk6MzM6YTM6NzI6YTg6MGY6ZTE6NTU6ZTU6YjUKIyBTSEExIEZpbmdlcnByaW50OiAyYjo4ZjoxYjo1NzozMzowZDpiYjphMjpkMDo3YTo2Yzo1MTpmNzowZTplOTowZDpkYTpiOTphZDo4ZQojIFNIQTI1NiBGaW5nZXJwcmludDogZTc6OTM6Yzk6YjA6MmY6ZDg6YWE6MTM6ZTI6MWM6MzE6MjI6OGE6Y2M6YjA6ODE6MTk6NjQ6M2I6NzQ6OWM6ODk6ODk6NjQ6YjE6NzQ6NmQ6NDY6YzM6ZDQ6Y2I6ZDIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYzakNDQThhZ0F3SUJBZ0lRQWYxdE1QeWp5bEdvRzd4a0RqVURMVEFOQmdrcWhraUc5dzBCQVF3RkFEQ0IKaURFTE1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbApjbk5sZVNCRGFYUjVNUjR3SEFZRFZRUUtFeFZVYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WCkJBTVRKVlZUUlZKVWNuVnpkQ0JTVTBFZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1UQXcKTWpBeE1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaURFTE1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVgpCQWdUQ2s1bGR5QktaWEp6WlhreEZEQVNCZ05WQkFjVEMwcGxjbk5sZVNCRGFYUjVNUjR3SEFZRFZRUUtFeFZVCmFHVWdWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVkJBTVRKVlZUUlZKVWNuVnpkQ0JTVTBFZ1EyVnkKZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJSwpBb0lDQVFDQUVtVVhOZzdEMndpejBLeFhEWGJ0elNmVFRLMVFnMkhpcWlCTkNTMWtDZHpPaVovTVBhbnM5cy9CCjNQSFRzZFo3TnlnUkswZmFPY2E4T2htMFg2YTlmWjJqWTBLMmR2S3BPeXVSK09KdjBPd1dJSkFKUHVMb2RNa1kKdEpIVVltVGJmNk1HOFlnWWFwQWlQTHorRS9DSEZIdjI1QitPMU9SUnhoRm5SZ2hSeTRZVVZEKzhNLzUrYkp6LwpGcDBZdlZHT05hYW5ac2h5WjlzaFpySFVtM2dEd0ZBNjZNenczTHllVFA2dkJaWTFIMWRhdC8vTytUMjNMTGIyClZOM0k1eEk2VGE1TWlyZGNtclMzSUQzS2Z5STBybjQ3YUdZQlJPY0JUa1pUbXpOZzk1UytVemVRYzBQek1zTlQKNzl1cS9uUk9hY2RyakdDVDNzVEhETi9oTXE3TWt6dFJlSlZuaSs0OVZ2NE0wR2tQR3cvekpTWnJNMjMzYmtmNgpjMFBsZmc2bFpyRXBmREtFWTFXSnhBM0JrMVF3R1JPczAzMDNwK3RkT213MVhOdEIxeExhcVVrTDM5aUFpZ21UCllvNjFaczhsaU0yRXVMRS9wRGtQMlFLZTZ4Sk1sWHp6YXdXcFhoYUR6TGhuNHVnVG5jeGJndE5NcysxYi85N2wKYzZ3ak95MEF2elZWZEFsSjJFbFlHbitTTnVaUmtnN3pKbjBjVFJlOHlleERKdEMvUVY5QXFVUkU5Sm5uVjRlZQpVQjlYVktnKy9YUmpMN0ZRWlFubVdFSXVReHBNdFBBbFIxbjZCQjZUMUNaR1NsQ0JzdDYrZUxmOFp4WGh5VmVFCkhnOWoxdWxpdXRaZlZTN3FYTVlvQ0FRbE9iZ09LNm55VEpjY0J6OE5Vdlh0N3krQ0R3SURBUUFCbzBJd1FEQWQKQmdOVkhRNEVGZ1FVVTNtL1dxb3JTczlVZ09IWW04Q2Q4cklEWnNzd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4RwpBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRU1CUUFEZ2dJQkFGelVmQTNQOXdGOVFabGxESFBGClVwL0wrTStaQm44YjJrTVZuNTRDVlZlV0ZQRlNQQ2VIbENqdEh6b0JONkoyL0ZOUXdJU2J4bXRPdW93aFQ2S08KVldLUjgya1YyTHlJNDhTcUMvM3ZxT2xMVlNvR0lHMVZlQ2taN2w4d1hFc2tFVlgvSkpwdVhpb3I3Z3RObjMvMwpBVGlVRkpWREJ3bjdZS251SEtzU2pLQ2FYcWVZYWxsdGl6OEkrOGpSUmE4WUZXU1FFZzl6S0M3RjRpUk8vRmpzCjhQUkYvaUt6NnkrTzB0bEZZUVhCbDIrb2RuS1BpNHcycjc4TkJjNXhqZWFtYng5c3BuRml4ZGpRZzNJTThXY1IKaVF5Y0UweHlOTis4MVhIZnFuSGQ0YmxzakR3U1hXWGF2VmNTdGtOci8rWGVUV1lSVWMrWnJ1d1h0dWh4a1l6ZQpTZjdkTlhHaUZTZVVITTloNHlhN2I2Tm5KU0ZkNXQwZEN5NW9HenVDcit5RFo0WFVtRkYwc2JtWmdJbi9mM2daClhIbEtZQzZTUUs1TU55b3N5Y2RpeUE1ZDl6WmJ5dUFsSlFHMDNSb0huSGNBUDlEYzFldzkxUHE3UDh5RjFtOS8KcVMzZnVRTDM5WmVhdFRYYXcyZXdoMHFwS0o0amp2OWNKMnZoc0UvekIrNEFMdFJaaDh0U1FaWHE5RWZYN21SQgpWWHlOV1FLVjNXS2R3cm51V2loMGhLV2J0NURIREFmZjlZazJkRExXS01Hd3NBdmduRXpESE5iODQybTFSMGFCCkw2S0NxOU5qUkhERWpmOHRNN3F0ajN1MWNJaXVQaG5QUUNqWS9NaVF1MTJaSXZWUzVsakZINGd4USs2SUhkZkcKamp4RGFoMm5HTjU5UFJieFl2bktrS2o5Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1VU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VGhlIFVTRVJUUlVTVCBOZXR3b3JrCiMgU3ViamVjdDogQ049VVNFUlRydXN0IEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVRoZSBVU0VSVFJVU1QgTmV0d29yawojIExhYmVsOiAiVVNFUlRydXN0IEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDEyMzAxMzgyMzcyMDE5OTQ4MTQ1NjU2OTcyMDQ0Mzk5NzU3MjEzNAojIE1ENSBGaW5nZXJwcmludDogZmE6Njg6YmM6ZDk6YjU6N2Y6YWQ6ZmQ6Yzk6MWQ6MDY6ODM6Mjg6Y2M6MjQ6YzEKIyBTSEExIEZpbmdlcnByaW50OiBkMTpjYjpjYTo1ZDpiMjpkNToyYTo3Zjo2OTozYjo2Nzo0ZDplNTpmMDo1YToxZDowYzo5NTo3ZDpmMAojIFNIQTI1NiBGaW5nZXJwcmludDogNGY6ZjQ6NjA6ZDU6NGI6OWM6ODY6ZGE6YmY6YmM6ZmM6NTc6MTI6ZTA6NDA6MGQ6MmI6ZWQ6M2Y6YmM6NGQ6NGY6YmQ6YWE6ODY6ZTA6NmE6ZGM6ZDI6YTk6YWQ6N2EKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNqekNDQWhXZ0F3SUJBZ0lRWEl1WnhWcVV4ZEp4VnQ3TmlZRE1KakFLQmdncWhrak9QUVFEQXpDQmlERUwKTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsY25ObAplU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlVhR1VnVlZORlVsUlNWVk5VSUU1bGRIZHZjbXN4TGpBc0JnTlZCQU1UCkpWVlRSVkpVY25WemRDQkZRME1nUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTVRBd01qQXgKTURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JpREVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVApDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbGNuTmxlU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlVhR1VnClZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WQkFNVEpWVlRSVkpVY25WemRDQkZRME1nUTJWeWRHbG0KYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUWFyRlJhcWZsbwpJK2Q2MVNSdlU4WmEyRXVyeHRXMjBlWnpjYTdkbk5ZTVlmM2JvSWtEdUFVVTdGZk83bDAvNGlHenp2ZlVpbm5nCm80TitMWmZRWWNUeG1kd2xrV09yZnpDanRIRGl4NkV6blBPL0xseFRzVit6ZlRKL2lqVGplWG1qUWpCQU1CMEcKQTFVZERnUVdCQlE2NFFtRzFNOFp3cFoyZEVsMjNPQTF4bU5qbWpBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRApWUjBUQVFIL0JBVXdBd0VCL3pBS0JnZ3Foa2pPUFFRREF3Tm9BREJsQWpBMlo2RVdDTnprbHdCQkhVNis0V01CCnp6dXFRaEZrb0oyVU9RSVJlVng3SGZwa3VlNFdRck8vaXNJSnhPemtzVTBDTVFEcEttRkhqRkpLUzA0WWNQYlcKUk5adTlZTzZiVmk5Sk5sV1NPcnZ4S0pHZ1locU9rYlJxWnROeVdIYTBWMVhhaGc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQKIyBTdWJqZWN0OiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQKIyBMYWJlbDogIkdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNCIKIyBTZXJpYWw6IDE0MzY3MTQ4Mjk0OTIyOTY0NDgwODU5MDIyMTI1ODAwOTc3ODk3NDc0CiMgTUQ1IEZpbmdlcnByaW50OiAyMDpmMDoyNzo2ODpkMTo3ZTphMDo5ZDowZTplNjoyYTpjYTpkZjo1Yzo4OTo4ZQojIFNIQTEgRmluZ2VycHJpbnQ6IDY5OjY5OjU2OjJlOjQwOjgwOmY0OjI0OmExOmU3OjE5OjlmOjE0OmJhOmYzOmVlOjU4OmFiOjZhOmJiCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZTpjOTo0OToxMTpjMjo5NTo1Njo3NjpkYjo2YzowYTo1NTowOTo4NjpkNzo2ZTozYjphMDowNTo2Njo3Yzo0NDoyYzo5Nzo2MjpiNDpmYjpiNzo3MzpkZToyMjo4YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQjRUQ0NBWWVnQXdJQkFnSVJLamlrSEpZS0JONUNzaWlsQytnMG1BSXdDZ1lJS29aSXpqMEVBd0l3VURFawpNQ0lHQTFVRUN4TWJSMnh2WW1Gc1UybG5iaUJGUTBNZ1VtOXZkQ0JEUVNBdElGSTBNUk13RVFZRFZRUUtFd3BICmJHOWlZV3hUYVdkdU1STXdFUVlEVlFRREV3cEhiRzlpWVd4VGFXZHVNQjRYRFRFeU1URXhNekF3TURBd01Gb1gKRFRNNE1ERXhPVEF6TVRRd04xb3dVREVrTUNJR0ExVUVDeE1iUjJ4dlltRnNVMmxuYmlCRlEwTWdVbTl2ZENCRApRU0F0SUZJME1STXdFUVlEVlFRS0V3cEhiRzlpWVd4VGFXZHVNUk13RVFZRFZRUURFd3BIYkc5aVlXeFRhV2R1Ck1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXVNWjUwNDlzSlE2Zkxqa1pIQU9rcnBybE9RY0oKRnNwanNibUcrSXBYd1ZmT1F2cHpvZmRsUXY4ZXdRQ3libk1PLzhjaDVSaWtxdGx4UDZqVXVjNk1IYU5DTUVBdwpEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZGU3dlNjFGCnVPSkFmL3NLYnZ1K004azhvNFRWTUFvR0NDcUdTTTQ5QkFNQ0EwZ0FNRVVDSVFEY2txR2dFNmJQQTdEbXhDR1gKa1BvVVZ5MEQ3TzQ4MDI3S3FHeDJ2S0xldXdJZ0o2aUZKeldiVnNhajhrZlN0MjRiQWdBWHFtZW1GWkhlK3BUcwpld3Y0bjRRPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1CiMgU3ViamVjdDogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1CiMgTGFiZWw6ICJHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjUiCiMgU2VyaWFsOiAzMjc4NTc5MjA5OTk5MDUwNzIyNjY4MDY5ODAxMTU2MDk0NzkzMTI0NAojIE1ENSBGaW5nZXJwcmludDogOWY6YWQ6M2I6MWM6MDI6MWU6OGE6YmE6MTc6NzQ6Mzg6ODE6MGM6YTI6YmM6MDgKIyBTSEExIEZpbmdlcnByaW50OiAxZjoyNDpjNjozMDpjZDphNDoxODplZjoyMDo2OTpmZjphZDo0ZjpkZDo1Zjo0NjozYToxYjo2OTphYQojIFNIQTI1NiBGaW5nZXJwcmludDogMTc6OWY6YmM6MTQ6OGE6M2Q6ZDA6MGY6ZDI6NGU6YTE6MzQ6NTg6Y2M6NDM6YmY6YTc6ZjU6OWM6ODE6ODI6ZDc6ODM6YTU6MTM6ZjY6ZWI6ZWM6MTA6MGM6ODk6MjQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNIakNDQWFTZ0F3SUJBZ0lSWUZsSjRDWXV1MVg1Q25lS2NmbEsyR3d3Q2dZSUtvWkl6ajBFQXdNd1VERWsKTUNJR0ExVUVDeE1iUjJ4dlltRnNVMmxuYmlCRlEwTWdVbTl2ZENCRFFTQXRJRkkxTVJNd0VRWURWUVFLRXdwSApiRzlpWVd4VGFXZHVNUk13RVFZRFZRUURFd3BIYkc5aVlXeFRhV2R1TUI0WERURXlNVEV4TXpBd01EQXdNRm9YCkRUTTRNREV4T1RBek1UUXdOMW93VURFa01DSUdBMVVFQ3hNYlIyeHZZbUZzVTJsbmJpQkZRME1nVW05dmRDQkQKUVNBdElGSTFNUk13RVFZRFZRUUtFd3BIYkc5aVlXeFRhV2R1TVJNd0VRWURWUVFERXdwSGJHOWlZV3hUYVdkdQpNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRVIwVU9sdnQ5WGIvcE9kRWgrSjhMdHRWN0hwSTZTRmtjCjhHSXhMY0I2S1A0YXAxeXp0c3lYNTBYVVdQclJkMjFEb3NDSFpUUUtIM3JkNnp3em9jV2RUYVJ2UVpVNGY4a2UKaE92Um5rbVNoNVNIRERxRlNtYWZuVm1UVFpkaEJvWktvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRApWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVVBlWXBTSnZxQjhvaFJFb20zbTdlMG9QUW4xa3dDZ1lJCktvWkl6ajBFQXdNRGFBQXdaUUl4QU9WcEVzbHUyOFl4dWdsQjRaZjQrLzJhNG4wU3llMThaTlBMQlNXTFZ0bWcKNTE1ZFRndURuRnQyS2FBSkppRnFZZ0l3Y2RLMWoxenFPK0Y0Q1lXb2RaSTd5Rno5U084TmRDS29DT0p1eFVuTwp4d3k4cDJGcDhmYzc0U3JMK1N2elpwQTMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzMgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBTdWJqZWN0OiBDTj1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgTGFiZWw6ICJTdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczIgojIFNlcmlhbDogMTAwMDMwMDEKIyBNRDUgRmluZ2VycHJpbnQ6IDBiOjQ2OjY3OjA3OmRiOjEwOjJmOjE5OjhjOjM1OjUwOjYwOmQxOjBiOmY0OjM3CiMgU0hBMSBGaW5nZXJwcmludDogZDg6ZWI6NmI6NDE6NTE6OTI6NTk6ZTA6ZjM6ZTc6ODU6MDA6YzA6M2Q6YjY6ODg6OTc6Yzk6ZWU6ZmMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDNjOjRmOmIwOmI5OjVhOmI4OmIzOjAwOjMyOmY0OjMyOmI4OjZmOjUzOjVmOmUxOjcyOmMxOjg1OmQwOmZkOjM5Ojg2OjU4OjM3OmNmOjM2OjE4OjdmOmE2OmY0OjI4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGZERDQ0ExeWdBd0lCQWdJRUFKaWlPVEFOQmdrcWhraUc5dzBCQVFzRkFEQmFNUXN3Q1FZRFZRUUdFd0pPClRERWVNQndHQTFVRUNnd1ZVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1TVNzd0tRWURWUVFERENKVGRHRmgKZENCa1pYSWdUbVZrWlhKc1lXNWtaVzRnVW05dmRDQkRRU0F0SUVjek1CNFhEVEV6TVRFeE5ERXhNamcwTWxvWApEVEk0TVRFeE16SXpNREF3TUZvd1dqRUxNQWtHQTFVRUJoTUNUa3d4SGpBY0JnTlZCQW9NRlZOMFlXRjBJR1JsCmNpQk9aV1JsY214aGJtUmxiakVyTUNrR0ExVUVBd3dpVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdUlGSnYKYjNRZ1EwRWdMU0JITXpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTDR5b2xRUApjUHNzWEZucmJNU2tVZWlGS3JQTVNqVHlzRi96RHNjY1BWTWVpQWhvMkc4OXJjS2V6SUpuQnllSGFIRTZuM1dXCklrWUZzTzJ0eDF1ZUt0NmMvRHJHbGFmMUYyY1k1eTlKQ0F4Y3orYk1OTzE0KzFDeDNHc3k4S0wrdGp6azdGcVgKeHo4ZWNBZ3dvTnpGczIxdjBJSnlFYXZTZ1doWmdoZTNlSkpnK3N6ZVA0VHJqVGd6a0FweUkvbzF6Q1p4TWRGeQpLSkxaV3lOdFpyVnRCMExycGpQT2t0dkE5bXhqZU0zS1RqMjE1VktiOGI0NzVsUmdzR1llQ2FzSC9sU0pFVUxSCjl5UzZZSGdhbVBmSkVmMFd3VFVhVkhYdlE5UGxyazdPNTN2RHhrNWhVVXVybWtWTG9SOUJ2VWhURlhGa0M0YXoKNVM2K3pxUWJ3U21Fb3JYTENDTjJReUlrSHhjRTFHNmN4dngvSzJZYTdJcmwxczlOOVdNSnR4VTUxbnVzNitOOAo2VTc4ZFVMSTdWaVZEQVpDb3B6MzVIQ3ozM0p2V2pkQWlkaUZwTmZ4Qzk1REdkUktXQ3lNaWptZXY0U0g4Ulk3Ck5nenAwN1RLYkJsQlVnbWhIYkJxdjRMdmNGRWhNdHdGZG96TDkyVGtBMUN2akpGbnE4WHk3bGpZM3I3MzV6SFAKYk1rN2NjSFZpTFZsdk1Eb0Z4Y0hFclZjMHFzZ2s3VG1nb053TnNYTm80MnRpK3lqd1VPSDVrUGlOTDZWaXpYdApCem5hcUIxNm56YWVFckFNWlJLUUZXRFpKa0JFNDFaZ3BSRFVhano5UWR3T1drZTI3NWRoZFUvWi9zZXlIZFR0ClhVbXpxV3JMWm9RVDFWeWczTjl1ZHdiUmNYWElWMit2RDNkYkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUlVyZnJIa2xldXlqV2NMaEw3NUxwZApJTnlVVnpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQU1KbWRCVExJWGc0N21BRTZpcVRuQi9kNitPZWEzMUJEClU1Y3FQY284UjVndTRSVjc4Wkx6WWRxUUpSWmx3SjlVWFE0RE8xdDNBcHlFdGcyWVh6VGRPMlBDd3lpQndwd3AKTGluaXlNTUI4alBxS3FyTUNRajNaV2ZHemQvVHRpdW52Y3pSRG5CZnVDUFJ5NUZPQ3ZUSWV1WFpZemJCMU4vOApJcGYzWUYzcUtTOVlzcjFZdlkyV1R4QjF2MGg3UFZHSG9UeDBJc0w4QjMrQTNNU3MvbXJCY0RDdzZZNXA0aXhwCmdaUUp1dDMrVGNDRGpKUll3RVlncjV3ZkF2ZzFWVWt2UnRUQThLQ1dBZzh6eFhIem5pTjlsTGY5T3RNSmd3WWgKL1dBOXJqTEEwdTZOcHZEbnRJSjhDc3h3eVhtQStQNU05eldFR1lveCt3cloxMytiOEtLYWE4TUZTdTFCWUJRdwowYW9SUW03VEl3SUVDOFpsM2QxU2Q5cUJhN0tvK2dFNHVaYnFLbXhubDRtVW5yemhWTlhrYW5qdlNyMHJtajFBCmZzYkFkZEp1KzJndzdPeUxuZmxKTlpvYUxObXpsVG5WSHBMM3BybGxMK1U5YlRwSVRBamM1Q2dTS0w1OU5WenEKNEJaK0V4dHExejdYbnZ3dGRiTEJGTlVqQTl0YmJ3cytlQzhOM2pPTkZyZEk1NE9hZ1E5N3dVTk5WUVFYT0VwUgoxVm1paVhUVG43NGVTOWZHYmJlSUpHOWdrYVNDaFZ0V1FielFSS3RxRTc3UkxGaTNFak5Zc2pkajNCUDFsQjAvClFGSDFUL1U2N2NqRjY4SWVIUmFWZXNkK1FuR1Ria3NWdHpEZnF1MVhoVWlzSFdyZE9Xbms0WGw0dnM0RnY2RU0KOTRCN0lXY25NRms9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQSBPPVN0YWF0IGRlciBOZWRlcmxhbmRlbgojIFN1YmplY3Q6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBSb290IENBIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgTGFiZWw6ICJTdGFhdCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQSIKIyBTZXJpYWw6IDEwMDAwMDEzCiMgTUQ1IEZpbmdlcnByaW50OiBmYzowNjphZjo3YjplODoxYTpmMTo5YTpiNDplODpkMjo3MDoxZjpjMDpmNTpiYQojIFNIQTEgRmluZ2VycHJpbnQ6IDc2OmUyOjdlOmMxOjRmOmRiOjgyOmMxOmMwOmE2Ojc1OmI1OjA1OmJlOjNkOjI5OmI0OmVkOmRiOmJiCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0ZDoyNDo5MTo0MTo0YzpmZTo5NTo2Nzo0NjplYzo0YzplZjphNjpjZjo2Zjo3MjplMjo4YToxMzoyOTo0MzoyZjo5ZDo4YTo5MDo3YTpjNDpjYjo1ZDphZDpjMTo1YQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmNEQ0NBMWlnQXdJQkFnSUVBSmlXalRBTkJna3Foa2lHOXcwQkFRc0ZBREJZTVFzd0NRWURWUVFHRXdKTwpUREVlTUJ3R0ExVUVDZ3dWVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdU1Ta3dKd1lEVlFRRERDQlRkR0ZoCmRDQmtaWElnVG1Wa1pYSnNZVzVrWlc0Z1JWWWdVbTl2ZENCRFFUQWVGdzB4TURFeU1EZ3hNVEU1TWpsYUZ3MHkKTWpFeU1EZ3hNVEV3TWpoYU1GZ3hDekFKQmdOVkJBWVRBazVNTVI0d0hBWURWUVFLREJWVGRHRmhkQ0JrWlhJZwpUbVZrWlhKc1lXNWtaVzR4S1RBbkJnTlZCQU1NSUZOMFlXRjBJR1JsY2lCT1pXUmxjbXhoYm1SbGJpQkZWaUJTCmIyOTBJRU5CTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUE0OGQraWZra1N6clMKTTRNMUxHbnMzQW1rNDFHb0pTdDV1QWc5NEpHNmhJWEdoYVRLNXNrdVU2VEpKQjc5VldaeFhTekZZR2dFdDluQwpVaVk0aUtUV08wQ213czAvelppVHMxUVVXSlpWMVZEK2hxMmtZMzljaC9hTzVpZVNaeGVTQWdNczNOWm1kTzNkClovL0JZWTFqVHcrYmJSY3dKdStyMGg4UW9QbkZmeFpwZ1FOSDdSNW9qWEtoVGJJbXhycHNYMjNXcjlHeEU0NnAKcmZOZWFYVW1HRDVCS3lGLzdvdGRCd2FkUThRcENpdjhLajZHeXp5RE92bkpEZHJGbWVLOGVFRXpkdUcvTDEzbApwSmhRREJYZDRQcWNmemhvMExLbWVxZlJNYjEraWxnblE3TzZNNUhUcDVnVlhKcm0wdzkxMmZ4Qm1KYytxaVhiCmo1SXVzSHNNWC9GanFUZjVtM1ZwVENnbUpkclY4aEp3UlZYajMzTmVOL1VoYkpDT05WckoweVByMDhDK2VLeEMKS0ZobXBVWnRjQUxYRVBsTFZQeGRoa3FIejMvS1Jhd1JXclVnVVkwdmlFZVhPY0RQdXNCQ0FVQ1pTQ0VMYTZmUwovWmJWMGI1R25VbmdDNmFnSWs0NDBNRThNTHh3anl4MXpOREZqRkU3UFpRSVpDWmhmYm5EWlk4VW5DSFFxdjBYCmNnT1B2WnVNNWw1VG5ybWQ3NEs3NGJ6aWNrRmJJWlRUUlRlVTBkOEpPVjNuSTZxYUhjcHRxQXFHaFlxQ3ZrSUgKMXZJNGduUGFoMXZsUE5PZVBxYzdudlFEcy9ueGZSTjBBdis3b2VYNkFIa2NwbVpCaUZ4Z1Y2WXVDY1M2L1pyUApweDlBdzd2TVdncFZTenM0ZGxHNFk0dUVsQmJtVnZNQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZQNnJBSkNZbmlUOHFjd2FpdnNudUw4d2JxZzcKTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFEUGR5eHVWcjVPczdhRUFKU3JSOGtOMG5iSGhwOGRCOU8ydExzSQplSzlwMGd0SjNqUEZySzNDaUFKOUJyYzFBc0ZneWIvRTZKVGUxTk9wRXlWYS9tNmlybjBGM0gzemJQQitwbzN1CjJkZk9XQmZvcVNtdWMwaUg1NXZLYmltaFpGOFpFL2V1QmhEL1VjYWJUVlVsVDVPWkVBRlRkZkVUenNlbVFVSFMKdjRpbGYwWDhyTGlsdFRNTWdzVDdCL1pxNVNXRVh3Ykt3WVk1RWR0WXpYYzdMTUpNRDE2YTQvQ3JQbUViVUNUQwp3UFR4R2ZBUktiYWxHQUtiMTJOTWNJeEhvd05EWExsZFJxQU5iLzlaanI3ZG4zTERXeXZmakZ2TzVReEdiSkt5CkNxTk1WRUlZRlJJWXZkcjh1blJ1LzhHMm9HVFlxVjlWcnA5Y2FuYVcySE5uaC90TmYxenVhY3B6RVB1S3FmMmUKdlRZNFNVbUg5QTRVOE9tSHVEK25UM3Bham5uVWsrUzdhRktFckd6cDg1aHdWWEl5K1RTckswbTF6U0JpNURwNgpaMk9ybHR4dHJwZnMvSjkyVm9ndVpzOWJ0c21rc05jRnV1RW5MNU83SmlxaWs3QWI4NDYrSFVDanVUYVBQb0lhCkdsNkk2bEQ0V2VLRFJpa0w0MFJjNFpXMmFaQ2FGRytYcm9IUGFPK1ptcjYxNStGLytQb1RSeFpNekcwSVFPZUwKZUc5UWdrUlFQMllHaXF0RGhGWktEeUF0aGc3MTB0dlNlb3BMemFYb1R2RmVKaVVCV1NPZ2Z0TDJmaUZYMXllOApGVmRNcEViQjRJTWVERXhOSDA4R0dlTDVxUFE2Z3FHeWVVTjUxcTF2ZWllUUE2VHFKSWMvMmIzWjZmSmZVRWtjCjd1elhMZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEgTz1JZGVuVHJ1c3QKIyBTdWJqZWN0OiBDTj1JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEgTz1JZGVuVHJ1c3QKIyBMYWJlbDogIklkZW5UcnVzdCBDb21tZXJjaWFsIFJvb3QgQ0EgMSIKIyBTZXJpYWw6IDEzMjk4ODIxMDM0OTQ2MzQyMzkwNTIwMDAzODc3Nzk2ODM5NDI2CiMgTUQ1IEZpbmdlcnByaW50OiBiMzozZTo3Nzo3Mzo3NTplZTphMDpkMzplMzo3ZTo0OTo2Mzo0OTo1OTpiYjpjNwojIFNIQTEgRmluZ2VycHJpbnQ6IGRmOjcxOjdlOmFhOjRhOmQ5OjRlOmM5OjU1Ojg0Ojk5OjYwOjJkOjQ4OmRlOjVmOmJjOmYwOjNhOjI1CiMgU0hBMjU2IEZpbmdlcnByaW50OiA1ZDo1Njo0OTo5YjplNDpkMjplMDo4YjpjZjpjYTpkMDo4YTozZTozODo3MjozZDo1MDo1MDozYjpkZTo3MDo2OTo0ODplNDoyZjo1NTo2MDozMDoxOTplNToyODphZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRllEQ0NBMGlnQXdJQkFnSVFDZ0ZDZ0FBQUFVVWp5RVMxQUFBQUFqQU5CZ2txaGtpRzl3MEJBUXNGQURCSwpNUXN3Q1FZRFZRUUdFd0pWVXpFU01CQUdBMVVFQ2hNSlNXUmxibFJ5ZFhOME1TY3dKUVlEVlFRREV4NUpaR1Z1ClZISjFjM1FnUTI5dGJXVnlZMmxoYkNCU2IyOTBJRU5CSURFd0hoY05NVFF3TVRFMk1UZ3hNakl6V2hjTk16UXcKTVRFMk1UZ3hNakl6V2pCS01Rc3dDUVlEVlFRR0V3SlZVekVTTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wTVNjdwpKUVlEVlFRREV4NUpaR1Z1VkhKMWMzUWdRMjl0YldWeVkybGhiQ0JTYjI5MElFTkJJREV3Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNuVUJuZVA1azkxRE5HOFc5UllZS3lxVStQWjRsZGhObFQKM1F3bzJkZncvNjZWUTNLWitiVmRmSXJCUXVFeFVIVFJnUTE4elpzaHEwUGlySzFlaG03ekNZb2ZXaks5b3V1VQorZWhjQ3V6L21OS3ZjYk8wVTU5T2grK1N2TDNzVHpJd2lFc1hYbGZFVThMMkFwZU4yV0lydnlRZllvM2Z3N2dwClMwbDRQSk5naUNMOG1kbzJ5TUtpMUN4VUFHYzFibk8vQWxqd3BOM2xzS0ltZXNyZ05xVVpGdlg5dCsrdVAwRDEKYlZvRS9jNDB5aVRjZENNYlhUTVRFbDNFQVNYMk1OMENYWi9nMVVlOXRPc2JvYnRKU2RpZld3THppdVFra09SaQpUMC9CcjRzT2RCZW8wWEtJYW5vQlNjeTBSbm5HRjdIYW1CNEhXZnAxSVlWbDNaQld6dnVycFdDZHhKMzVVckNMCnZZZjVqeXNqQ2lOMk8vY3o0Y2tBODJuNVM2TGdUcngra3ptRUIvZEVjSDcrQjFybHNhelJHTXp5TmVWSlNRaksKVnNrOSt3OFlmWXM3d1JQQ1RZL0pUdzQzNlIraERtcmZZaTdMTlFaUmVTeklKVGowK2t1bmlWeWMwdU1OT1laSwpkSHpWV1lmQ1AwNE1YRkwwUGZkU2d2SHFvNno5U1RRYUtQTkJpRG9UN3VqZS81a2RYN3JMNkI3eXVWQmd3REhUCmMrWHZ2cUR0TXd0MHZpQWd4R2RzOEFnRGVsV0FmMFpPbHFmMEhqN2g5dGdKNFROa0syUFhNbDZmK2NCN0QzaHYKbDd5VG12bWNFcEI0ZW9DSEZkZHlkSnhWZEhpeHV1RnVjQVM2VDZDNmFNTjcvekh3Y3owOWxDcXhDMEVPb1A1TgppR1ZyZVRPMDF3SURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QWRCZ05WSFE0RUZnUVU3VVFad05Qd0JvdnVwSHUrUXVjbVZNaU9Obll3RFFZSktvWklodmNOQVFFTEJRQUQKZ2dJQkFBMnVrREwycGt0OFJIWVpZUjRuS00xZVZPOGx2T01Ja1BrcDE2NW9DT0dVQUZqdkxpNStVMUtNdGx3SAo2b2k2bVl0UWxOZUNnTjloQ1FDVHJRMFU1czdCOGplVWVMQmZuTE9pYzdpUEJaTTR6WTArc0xqN3dNK3g4dXd0CkxSdk03S3FhczZwZ2doc3RPOE9FUFZlS2xoNmNkYmpUTU0xZ0NJT1EwNDVVOFUxbXdGMTBBMENqN29WK3doOTMKbkFib3dhY1lYVktWN2NuZEpaNXQrcW50b3pvMDBGbDcydTFROHpXLzdlc1VUVEhIWVBUYThZZWM0a2ppeHNVMword1lRK25WWlpqRkhLZHAybWh6cGdxN3ZtcmxSOTRnam1tbVZZanpsVllBMjExUUMvL0c1WGM3VUkyL1lSWVJLClcyWHZpUXpkRktjZ3l4aWxKYlFOK1FId290TDBBTWgwanFFcVNJNWwyeFBFNGlVWGZldStoMXNYSUZSUmswcFQKQXd2c1hjb3o3V0w5UmNjdlc5eFlvSUE1NXZyWC9oTVVwdTA5bEVwQ2ROVERkMWx6elk5R3ZsVTQ3L3Jva1RMcQpsMWdFSXQ0NHc4eThiY2t6T21vS2FUK2d5T3B5ajR4amhpTzliVHlXbnBYZ1NVeXFvcmtxRzV3MmdYanR3K2hHCjRpWlpSSFVlMlhXSlVjMFFoSjFoWU10ZCtaY2lUWTZZNXVOLzlsdTdyczNLU29GclhndnpVZUYwSytsK0o2ZloKbVVsTytLV0EyeVVQSEdOaWlza3paMnM4RUlQR3JkNm96UmFPamZBSE4zR2Y4cXY4UWZYQmkrd0FOMTBKNVU2QQo3L3F4WERnR3BSdEs0ZHc0TFR6Y3F4K1FHdFZLbk83UmNHek03dlJYK0JpNmhHNkgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUlkZW5UcnVzdCBQdWJsaWMgU2VjdG9yIFJvb3QgQ0EgMSBPPUlkZW5UcnVzdAojIFN1YmplY3Q6IENOPUlkZW5UcnVzdCBQdWJsaWMgU2VjdG9yIFJvb3QgQ0EgMSBPPUlkZW5UcnVzdAojIExhYmVsOiAiSWRlblRydXN0IFB1YmxpYyBTZWN0b3IgUm9vdCBDQSAxIgojIFNlcmlhbDogMTMyOTg4MjEwMzQ5NDYzNDIzOTA1MjE5NzYxNTY4NDM5MzM2OTgKIyBNRDUgRmluZ2VycHJpbnQ6IDM3OjA2OmE1OmIwOmZjOjg5OjlkOmJhOmY0OjZiOjhjOjFhOjY0OmNkOmQ1OmJhCiMgU0hBMSBGaW5nZXJwcmludDogYmE6Mjk6NDE6NjA6Nzc6OTg6M2Y6ZjQ6ZjM6ZWY6ZjI6MzE6MDU6M2I6MmU6ZWE6NmQ6NGQ6NDU6ZmQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDMwOmQwOjg5OjVhOjlhOjQ0OjhhOjI2OjIwOjkxOjYzOjU1OjIyOmQxOmY1OjIwOjEwOmI1Ojg2OjdhOmNhOmUxOjJjOjc4OmVmOjk1OjhmOmQ0OmY0OjM4OjlmOjJmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWmpDQ0EwNmdBd0lCQWdJUUNnRkNnQUFBQVVVanowWjhBQUFBQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJOCk1Rc3dDUVlEVlFRR0V3SlZVekVTTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wTVNvd0tBWURWUVFERXlGSlpHVnUKVkhKMWMzUWdVSFZpYkdsaklGTmxZM1J2Y2lCU2IyOTBJRU5CSURFd0hoY05NVFF3TVRFMk1UYzFNek15V2hjTgpNelF3TVRFMk1UYzFNek15V2pCTk1Rc3dDUVlEVlFRR0V3SlZVekVTTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wCk1Tb3dLQVlEVlFRREV5RkpaR1Z1VkhKMWMzUWdVSFZpYkdsaklGTmxZM1J2Y2lCU2IyOTBJRU5CSURFd2dnSWkKTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDMklwVDhwRWl2NkVkckN2c25kdVR5UDRvNwpla29zTVNxTWpiQ3B3ekZycUhkMmhDYTJySUZDRFFqclZWaTdldmk4WlgzeW9HMkxxRWZwWW5ZZUVlNElGTkd5ClJCYjA2dEQ2SGk5ZTI4dHpRYTY4QUxCS0swQ3lyT0U3UzhJdG5lU2htK3dhT2g3d0NMUFE1Q1ExQjUrY3RNbFMKYmRzSHlvKzFXL0NEODAvSExhWElyY3VWSUtReEtGZFlXdVNORzVxcm5nME04Z296T1NJNUNwY3U4MU4zdVVSRgovWVRMTmlDQldTMmFiMjFJU0dIS1ROOVQwYTlTdkVTZnF5OXJnM0x2ZFlEYUJqTWJYY2phWThaTnpheG1NYzNSCjNqNkhFRGJodWFSNjcyQlFzc3ZLcGxiZ042K3JOQk01SmVnNVp1U1llcW9TbUp4WlpvWStyZkd3eWo0R0QzdncKRVVzM29FUnRlOHVvakhIMDFiV1JOc3p3RmNZcjNsRVhzWmRNVUQyeGxWbDhCWDB0SWRVQXZ3Rm5vbDU3cGx6eQo5eUx4a0EyVDI2cEVVV2JNZlhZRDYycW9LamdabDNZTmE0cGgrYnoyN25iOWNDdmRLVHo0Q2g1YlFoeUxWaTlWCkd4eWhMclhIRnViNHFqeVNqbW0yQWNHMWhwMkpEd3M0bEZUbzZ0eWVQU1c4VXlidDFhczVxc1ZBVEZTcnNyVFoKMmZqWGN0c2N2RzI5WlYvdmlEVXFaaS91OXJObDhET05mSmhCYVVZUFF4eHArcHUxMEdGcXpjcEwyVXlRUnFzVgpXYUZIVkNrdWd5aGZITUtpcTNJWEFBYU9SZXlMNGpNOWY5b1pST1JpY3NQZklzYnlWdFRkWDVWeTdXMWY5MGdEClcvM0ZLcUQyY3lPRUVCc0I1d0lEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVNDNIZ250aW5RdG5iY1pGcmxKUHJ3NlBSRktNd0RRWUpLb1pJaHZjTgpBUUVMQlFBRGdnSUJBRWY2M1Fxd0VaRTRyVTFkOStVT2wxUVpna2lIVkl5cVpKbllXdjZJQWNWWXBabXhJMVFqCnQyb2RJRmZsQVdKQkY5TUoyM1hMYmxTUWRmNGFuNEVLd3QzWDl3blFXM0lWNUI0SmFqMHo4eUdhNWhWK3JWSFYKRFJEdGZVTEFqKzdBbWdqVlFkWmNEaUZwYm9CaERoWEF1TS9GU1JKU3pMNDZ6TlF1T0FYZU5mMGZiN2lBYUpnOQpUYURLUUdYU2MzejFpOWtLbFQvWVB5TnRHdEVxSkJuWmhiTVg3M2h1cVZqUkk5UEhFKzF5Slg5ZHNYTncwSDhHCmx3bUVLWUJoSGZwZS8zT3NvT09KdUJ4eEZjYmVNWDhTM09GdG02L242SjkxZUV5clJqdWF6cjhGR0YxTkZUd1cKbWhsUUJKcXltbTlsaTFKZlBGZ0VLQ1hBWm1FeGZybmdkYmthcUlIV2NoZXp4UU14TlJGNGVLTGc2VENNZjREZgpXTjg4dWllVzRvQTBiZU9ZMDJRbnJFaCtLSGRjeGlWaEpmaUZER1g2eERJdnBaZ0Y1UGdMWnhZV3hvSzRNaG41CitibDUzQi9ONjYrckR0MGIyMFhrZXVjQzRwVmQvR253VTJsaGxYVjVDMTVWNWpnY2xLbFpNNTdJY1hSNWYxR0oKdHNocXVERElhampEYnA3aE54YnFCV0pNV3hKSDdhZTBzMWhXeDBuemZ4Sm9DVEZ4OEczNFRrZjcxb1h1eFZoQQpHYVFkcC9sTFF6ZmNhRnBQeit2Q1pIVGV0QlhaOUZSVUdpOGMxNWR4VkpDTzJTQ2RVeXQvcTQvaTZqQzhVRGZ2CjhVZTFmWHdzQk94b25iUkpSQkQwY2tzY1pPZjg1bXVRM1dsOWFmMEFWcVczckxhdHQ4bytBZStjCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiBPPUVudHJ1c3QsIEluYy4gT1U9U2VlIHd3dy5lbnRydXN0Lm5ldC9sZWdhbC10ZXJtcy8oYykgMjAwOSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiBPPUVudHJ1c3QsIEluYy4gT1U9U2VlIHd3dy5lbnRydXN0Lm5ldC9sZWdhbC10ZXJtcy8oYykgMjAwOSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIgojIFNlcmlhbDogMTI0Njk4OTM1MgojIE1ENSBGaW5nZXJwcmludDogNGI6ZTI6Yzk6OTE6OTY6NjU6MGM6ZjQ6MGU6NWE6OTM6OTI6YTA6MGE6ZmU6YjIKIyBTSEExIEZpbmdlcnByaW50OiA4YzpmNDoyNzpmZDo3OTowYzozYTpkMTo2NjowNjo4ZDplODoxZTo1NzplZjpiYjo5MzoyMjo3MjpkNAojIFNIQTI1NiBGaW5nZXJwcmludDogNDM6ZGY6NTc6NzQ6YjA6M2U6N2Y6ZWY6NWY6ZTQ6MGQ6OTM6MWE6N2I6ZWQ6ZjE6YmI6MmU6NmI6NDI6NzM6OGM6NGU6NmQ6Mzg6NDE6MTA6M2Q6M2E6YTc6ZjM6MzkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVQakNDQXlhZ0F3SUJBZ0lFU2xPTUtEQU5CZ2txaGtpRzl3MEJBUXNGQURDQnZqRUxNQWtHQTFVRUJoTUMKVlZNeEZqQVVCZ05WQkFvVERVVnVkSEoxYzNRc0lFbHVZeTR4S0RBbUJnTlZCQXNUSDFObFpTQjNkM2N1Wlc1MApjblZ6ZEM1dVpYUXZiR1ZuWVd3dGRHVnliWE14T1RBM0JnTlZCQXNUTUNoaktTQXlNREE1SUVWdWRISjFjM1FzCklFbHVZeTRnTFNCbWIzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEV5TURBR0ExVUVBeE1wUlc1MGNuVnoKZENCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDMGdSekl3SGhjTk1Ea3dOekEzTVRjeQpOVFUwV2hjTk16QXhNakEzTVRjMU5UVTBXakNCdmpFTE1Ba0dBMVVFQmhNQ1ZWTXhGakFVQmdOVkJBb1REVVZ1CmRISjFjM1FzSUVsdVl5NHhLREFtQmdOVkJBc1RIMU5sWlNCM2QzY3VaVzUwY25WemRDNXVaWFF2YkdWbllXd3QKZEdWeWJYTXhPVEEzQmdOVkJBc1RNQ2hqS1NBeU1EQTVJRVZ1ZEhKMWMzUXNJRWx1WXk0Z0xTQm1iM0lnWVhWMAphRzl5YVhwbFpDQjFjMlVnYjI1c2VURXlNREFHQTFVRUF4TXBSVzUwY25WemRDQlNiMjkwSUVObGNuUnBabWxqCllYUnBiMjRnUVhWMGFHOXlhWFI1SUMwZ1J6SXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUsKQW9JQkFRQzZoTFp5MjU0TWErS1o2VEFCcDNicU1yaVZRUnJKMm1GT1dITFAvdmFDZWI5ellRWUtwU2ZZczEvVApSVTRjY3RaT012SnlpZy8zZ3huUWFvQ0FBRVVlc01mbm1yOFNWeWNjbzJndkNvZTlhbXNPWG1YekhIZlYxSVdOCmNDRzBzekxuaTZMVmhqa0NzYmpTUjg3a3lVbkVPNmZlKzFSOVY3N3c2RzdDZWJJNkMxWGlVSmdXTWhOY0wzaFcKd2NLVXMvSmE1Q2VhbnlUWHh1elFteVdDNDh6Q3hFWEZqSmQ2Qm1zcUVaK3BDbTVJTzIvYjFCRVpRdmVQQjcvMQpVMStjUHZRWExPWnByRTR5VEdKMzZyZm81YnMwdkJtTHJweFI1N2QrdFZPeE15TGxiYzl3UEJyNjRwdG50b1AwCmphV3ZZa3hONEZpc1pEUVNBL2kyalpSakpLUnhBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVAKQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJxY2laNjBCN3ZmZWM3YVZIVWJJMmZrQkptcXpBTgpCZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFlWjhkbHNhMmVUOGlqWWZUaHdNRVlHcHJtaTVaaVhNUnJFUFI5UlAvCmpUa3J3UEs5VDNDTXFTL3FGOFFMVko3VUc1YVlNenlvcldLaUFIYXJXV2x1QmgxK3hMbEVqWml2RXRSaDJ3b1oKUmtmejYvZGp3VUFGUUtYU3QvUzFtamEvcVloMmlBUlZCQ3VjaDM4YU56eCtMYVVhMk5TSlhzcTlyRDFzMkcydgoxZk4yRDgwN2lEZ2luV3lUbXNROXY0SWJaVCttRDEycS9PV3lGY3ExcmNhOFBkQ0U2T29HY3JCTk9USjR2ejRSCm5BdWtuWm9oOC9DYkN6QjQyOEhjaDBQK3ZHT2F5c1hDSE1uSGpmODdFbGdJNXJZOTdIb3NUdnVEbHM0TVBHbUgKVkhPa2M4S1QvMUVRckJWVUFkajhCYkdKb1g5MGc1cEoxOXhPZTRwSWI0dEY5Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1FbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBFQzEgTz1FbnRydXN0LCBJbmMuIE9VPVNlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMvKGMpIDIwMTIgRW50cnVzdCwgSW5jLiAtIGZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxIE89RW50cnVzdCwgSW5jLiBPVT1TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zLyhjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxIgojIFNlcmlhbDogNTE1NDMxMjQ0ODE5MzA2NDkxMTQxMTYxMzMzNjkKIyBNRDUgRmluZ2VycHJpbnQ6IGI2OjdlOjFkOmYwOjU4OmM1OjQ5OjZjOjI0OjNiOjNkOmVkOjk4OjE4OmVkOmJjCiMgU0hBMSBGaW5nZXJwcmludDogMjA6ZDg6MDY6NDA6ZGY6OWI6MjU6ZjU6MTI6MjU6M2E6MTE6ZWE6Zjc6NTk6OGE6ZWI6MTQ6YjU6NDcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDAyOmVkOjBlOmIyOjhjOjE0OmRhOjQ1OjE2OjVjOjU2OjY3OjkxOjcwOjBkOjY0OjUxOmQ3OmZiOjU2OmYwOmIyOmFiOjFkOjNiOjhlOmIwOjcwOmU1OjZlOmRmOmY1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDK1RDQ0FvQ2dBd0lCQWdJTkFLYUxlU2tBQUFBQVVOQ1IrVEFLQmdncWhrak9QUVFEQXpDQnZ6RUxNQWtHCkExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVVnVkSEoxYzNRc0lFbHVZeTR4S0RBbUJnTlZCQXNUSDFObFpTQjMKZDNjdVpXNTBjblZ6ZEM1dVpYUXZiR1ZuWVd3dGRHVnliWE14T1RBM0JnTlZCQXNUTUNoaktTQXlNREV5SUVWdQpkSEoxYzNRc0lFbHVZeTRnTFNCbWIzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEV6TURFR0ExVUVBeE1xClJXNTBjblZ6ZENCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDMGdSVU14TUI0WERURXkKTVRJeE9ERTFNalV6TmxvWERUTTNNVEl4T0RFMU5UVXpObG93Z2I4eEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRApWUVFLRXcxRmJuUnlkWE4wTENCSmJtTXVNU2d3SmdZRFZRUUxFeDlUWldVZ2QzZDNMbVZ1ZEhKMWMzUXVibVYwCkwyeGxaMkZzTFhSbGNtMXpNVGt3TndZRFZRUUxFekFvWXlrZ01qQXhNaUJGYm5SeWRYTjBMQ0JKYm1NdUlDMGcKWm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hNekF4QmdOVkJBTVRLa1Z1ZEhKMWMzUWdVbTl2ZENCRApaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNBdElFVkRNVEIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpCkEySUFCSVFUeWRDNmJVRjc0bXpRNjFWZlpnSWFKUFJiaVdsSDQ3akNmZkh5QXNXZm9QWmIxWXNHR1laUFV4QnQKQnlRbm9hRDQxVWNaWVV4OXlwTW42blFNNzIrV0NmNWo3SEJkTnExbmQ2N0puWHhWUkRxaVkxRWY5ZU5pMUtsSApCejdNSUtOQ01FQXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPCkJCWUVGTGRqNXhyZGpla0lwbFdEcE9CcVVFRmxFVUpKTUFvR0NDcUdTTTQ5QkFNREEyY0FNR1FDTUdGNTJPVkMKUjk4Y3JsT1pGN1p2SEgzaHZ4R1UwUU9JZGVTTmlhU0tkMGJlYldIdkF2WDd0ZC9NL2s3Ly9xbm1wd0l3VzVuWApoVGNHdFhzSS9lc25pMHFVK2VINnA0NG1DT2g4a21odGM5aHZKcXdoQXJpWnR5WkJXeVZncnRCSUd1NEcKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNGQ0EgRVYgUk9PVCBPPUNoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUNGQ0EgRVYgUk9PVCBPPUNoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiQ0ZDQSBFViBST09UIgojIFNlcmlhbDogNDA3NTU1Mjg2CiMgTUQ1IEZpbmdlcnByaW50OiA3NDplMTpiNjplZDoyNjo3YTo3YTo0NDozMDozMzo5NDphYjo3YjoyNzo4MTozMAojIFNIQTEgRmluZ2VycHJpbnQ6IGUyOmI4OjI5OjRiOjU1Ojg0OmFiOjZiOjU4OmMyOjkwOjQ2OjZjOmFjOjNmOmI4OjM5OjhmOjg0OjgzCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1YzpjMzpkNzo4ZTo0ZToxZDo1ZTo0NTo1NDo3YTowNDplNjo4NzozZTo2NDpmOTowYzpmOTo1Mzo2ZDoxYzpjYzoyZTpmODowMDpmMzo1NTpjNDpjNTpmZDo3MDpmZAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmpUQ0NBM1dnQXdJQkFnSUVHRXJNMWpBTkJna3Foa2lHOXcwQkFRc0ZBREJXTVFzd0NRWURWUVFHRXdKRApUakV3TUM0R0ExVUVDZ3duUTJocGJtRWdSbWx1WVc1amFXRnNJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5CmFYUjVNUlV3RXdZRFZRUUREQXhEUmtOQklFVldJRkpQVDFRd0hoY05NVEl3T0RBNE1ETXdOekF4V2hjTk1qa3gKTWpNeE1ETXdOekF4V2pCV01Rc3dDUVlEVlFRR0V3SkRUakV3TUM0R0ExVUVDZ3duUTJocGJtRWdSbWx1WVc1agphV0ZzSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUlV3RXdZRFZRUUREQXhEUmtOQklFVldJRkpQClQxUXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFEWFhXdk5FRDhmQlZuVkJVMDMKc1E3c21DdU9GUjM2azBzWGdpRnhFRkxYVVdSd0ZzSlZhVTJPRlcyZnZ3d2J3dUNqWjlZTXJNOGlycTkzVkNwTApUSXBUVW5yRDdpN2VzM0Vsd2VsZFBlNmhMNlAzS2p6Skl4MXFxeDJocC9IejdLRFZSTThWejNJdkhXT1g2Sm41Ci9aT2tWSUJNVXRSU3F5NUozNUROdUYrK1A5Nmh5azBnMUNYb2hDbFR0N0dJSC8vNjJwQ2ZDcWt0UVQreDhSZ3AKN2haWkxEUkpHcWdHMTZpSTBnTnllakxpNm1oTmJpeVdaWHZLV2ZyeTR0M3VNQ3o3ekVhc3hHUHJiMzgyS3pSegpFcFIvMzh3bW52RnlYVkJsV1k5cHM0ZGVNbS9ER0lxMWxZK3dlamZlV2tVN3h6Ymg3MmZST2RPWFczTmlHVWd0Cmh4d0crM1NZSUVsejhBWFNHN0dnbzdjYmNOT0lhYmxhMWpqMFl0d2xpM2kvK09oK3VGekpsVTlmcHkyNUlHdlAKYTkzMURmU0N0L1N5Wmk0UUtQYVhXbnVXRm84QkdTMXNibjg1V0Faa2d3R0RnOE5Oa3QweXhvZWtOK2tXenFvdAphSzhLZ1dVNmNNR2JyVTF0Vk1vcUxVdUZHN09BNW5CRkRXdGVOZkIvTzdpYzVBUndpUklsazlvS21TSmdhbU5nClRuWUdtRTY5ZzYwZFdJb2xoZExIWlI0dGpzYmZ0c2JoZjRvRUlSVXBkUEErbkpDZERDN3hpajVhcWd3SkhzZlYKUEtQdGw4TWVOUG80K1FnTzQ4QmRLNFBSVm1ySnRxaFVVeTU0TW1jOWduOTAwUHZodGdWZ3VYRGJqZ3Y1RTFodgpjV0FRVWhDNXdVRUo3M0lmWnpGNC81WUZqUUlEQVFBQm8yTXdZVEFmQmdOVkhTTUVHREFXZ0JUai9pMzlLTkFMCnRicTJvc1MvQnFvRmpKUDdMekFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWQKQmdOVkhRNEVGZ1FVNC80dC9TalFDN1c2dHFMRXZ3YXFCWXlUK3k4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQgpBQ1hHdW12cmg4dmVnam1XUGZCRXAydUVjd1BlblN0UHVpQi92SGl5ejVld0c1enoxM2t1OVVpMjB2c1hpT2JUCmVqL3RVeFBRNGk5cWVjc0FJeWptSGpkWE5ZbUV3blpQTkRhdFo4UE9RUWFJeGZmdTJCcTQxZ3QvVVArVHFoZEwKak96dFVtQ3lwQWJxVHV2MGF4bjk2L1VhNENVcW10ekhRVGIzeUhRRmhEbVZPZFlMTzZRbitnallYQjc0QkdCUwpFU2dvQS8vdlUyWUFwVW8wRm1aOC9RbWtycDVuR205QkMyc0dFNXVQaG5FRnRDK05pV1l6S1haVW1oSDRKL3F5ClA1SGd6ZzBiOHpBYXJiOGlYUnZUdnlVRlRlR1NHbitabnp4RWs4clVRRWxzZ0lmWEJEckRNbEkxRGxiNHBkMTkKeElzTkVSOVR5eDZ5Rjdab2QxcmcxTXZJQjY3MU9pNk9ON2ZRQVV0REtYZU1PWmVQZ2xyNFVlV0pvQmpuYUg5ZApDaTc3bzBjT1BhWWplc1lCeDQvSVhyOXRnRmEraWlTNk0rcWY0VElSbnZIU1Q0RDJHMEN2T0o0UlVIbHpFaExOCjVteWRMSWh5UERDQkJwRWk2bG10MmhrdUlzS051WXlINEdhOGN5TmZJV1JqZ0VqMW9Ed1lQWlRJU0VFZFFMcGUKL3Y1V09hSEl6MTZlR1dSR0VOb1hrYmNGZ0t5TG1aSjk1NkxZQndzMkorZEllV0NLdzljVFhQaHlRTjlLeTgrWgpBQW9BQ3hHVjJsWkZBNGdLbjJmUTFYbXhxSTFBYlEzQ2VrRDY4MTlrUjVMTFU3bTdXYzVQL2RBVlV3SFkzK3ZaCjVuYnYwQ083TzZsNXM5VUNLYzJKbzVZUFNqWG5Ua0xBZGMwSHorWXM2M3N1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UXHhkY1JLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhXHUwMTFmbGF5XHUwMTMxY1x1MDEzMXNcdTAxMzEgSDUgTz1UXHhkY1JLVFJVU1QgQmlsZ2kgXHUwMTMwbGV0aVx1MDE1ZmltIHZlIEJpbGlcdTAxNWZpbSBHXHhmY3ZlbmxpXHUwMTFmaSBIaXptZXRsZXJpIEEuXHUwMTVlLgojIFN1YmplY3Q6IENOPVRceGRjUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2FcdTAxMWZsYXlcdTAxMzFjXHUwMTMxc1x1MDEzMSBINSBPPVRceGRjUktUUlVTVCBCaWxnaSBcdTAxMzBsZXRpXHUwMTVmaW0gdmUgQmlsaVx1MDE1ZmltIEdceGZjdmVubGlcdTAxMWZpIEhpem1ldGxlcmkgQS5cdTAxNWUuCiMgTGFiZWw6ICJUXHhkY1JLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhXHUwMTFmbGF5XHUwMTMxY1x1MDEzMXNcdTAxMzEgSDUiCiMgU2VyaWFsOiAxNTYyMzM2OTkxNzI0ODEKIyBNRDUgRmluZ2VycHJpbnQ6IGRhOjcwOjhlOmYwOjIyOmRmOjkzOjI2OmY2OjVmOjlmOmQzOjE1OjA2OjUyOjRlCiMgU0hBMSBGaW5nZXJwcmludDogYzQ6MTg6ZjY6NGQ6NDY6ZDE6ZGY6MDA6M2Q6Mjc6MzA6MTM6NzI6NDM6YTk6MTI6MTE6YzY6NzU6ZmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQ5OjM1OjFiOjkwOjM0OjQ0OmMxOjg1OmNjOmRjOjVjOjY5OjNkOjI0OmQ4OjU1OjVjOmIyOjA4OmQ2OmE4OjE0OjEzOjA3OjY5OjlmOjRhOmYwOjYzOjE5OjlkOjc4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFSnpDQ0F3K2dBd0lCQWdJSEFJNFgvaVFnZ1RBTkJna3Foa2lHOXcwQkFRc0ZBRENCc1RFTE1Ba0dBMVVFCkJoTUNWRkl4RHpBTkJnTlZCQWNNQmtGdWEyRnlZVEZOTUVzR0ExVUVDZ3hFVk1PY1VrdFVVbFZUVkNCQ2FXeG4KYVNERXNHeGxkR25GbjJsdElIWmxJRUpwYkduRm4ybHRJRWZEdkhabGJteHB4SjlwSUVocGVtMWxkR3hsY21rZwpRUzdGbmk0eFFqQkFCZ05WQkFNTU9WVERuRkpMVkZKVlUxUWdSV3hsYTNSeWIyNXBheUJUWlhKMGFXWnBhMkVnClNHbDZiV1YwSUZOaHhKOXNZWG5Fc1dQRXNYUEVzU0JJTlRBZUZ3MHhNekEwTXpBd09EQTNNREZhRncweU16QTAKTWpnd09EQTNNREZhTUlHeE1Rc3dDUVlEVlFRR0V3SlVVakVQTUEwR0ExVUVCd3dHUVc1cllYSmhNVTB3U3dZRApWUVFLREVSVXc1eFNTMVJTVlZOVUlFSnBiR2RwSU1Td2JHVjBhY1dmYVcwZ2RtVWdRbWxzYWNXZmFXMGdSOE84CmRtVnViR25FbjJrZ1NHbDZiV1YwYkdWeWFTQkJMc1dlTGpGQ01FQUdBMVVFQXd3NVZNT2NVa3RVVWxWVFZDQkYKYkdWcmRISnZibWxySUZObGNuUnBabWxyWVNCSWFYcHRaWFFnVTJIRW4yeGhlY1N4WThTeGM4U3hJRWcxTUlJQgpJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBcENVWjRXV2U2MGdoVUVvSTVSSHdXcm9tCi80Tlp6a1FxTC83aHptQUQvSTBEcGUzL2E2aTZ6RFFHbjFrMTl1d3N1NTM3alZKcDQ1d25FRlB6cEFMRnAva1IKR21sMWJzTWRpOUdZalpPSHAzR1hEU0hIbWZsUzB5eGpYVlc4NkI4QlNMbGcva0pLOXNpQXJzMW1lcDVGaW1oMwo0a2hvbjZMYThlSEJFSi9yUENtQnArRXlDTlNnQmJHTSs0MldBQTQrSmQ5VGhpSTcvUFM5OHdsK2QreUc2dzh6CjVVTlA5RlIxYlNtWkxtWmFROS9MWE1ySTVUanhmanMxblEvMHhWcWh6UE1nZ0NUVFYrd1Z1blVsbStoa1M3TTAKaE84RXVQYkpiS29DUHJaVjRqSTNYL3htbDEvTjFwN0hJTDlOeHF3L2RWOGM3VEtjZkdrQWFaSGpJeGhUNlFJRApBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVWcGtISHRPc0RHbGt0QXhRUjk1RExMNGd3UHN3RGdZRFZSMFBBUUgvCkJBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUo1RmRuc1gKU0RMeU9Jc3B2ZTZXU2s2QkdMRlJSeUROMEdTeERzblpBZGtKenNpWjNHZ2xFOVJjOHFQb0JQNXlDY2NMcWgwbApWWDZXbWxlM3VzVVJlaG5tcDM0OWhRNzErUzRwTCtmNWJGZ1dWMUFsOWo0dVBxcnRkM0dxcXBtV1JncXVqdXdxClVSYXdYczNxWndRY1dERDFZSXE5cHIxTjVaYTAvRUtKQVd2MmNNaFFPUXd0MVdiWnlOS3pNcmNiR1czTE0vbmYKcGVZVmhEZnd3dkpsbHBLUWQvQ3Q5SkRwRVhqWGs0bkFQUXU2S2ZUb21aMXlqdTJkTCs2U2ZhSHgvMTI2TTJDRgpZdjRIQXFHRVZrYStsZ3FhRTljaFRMZDhCNTlPVGorUmRQc25uUkhNM2VheHluRk5FeGM1SnNVcElTdVRLV3FXCitxdEI0VXUyTlF2QW14VT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnRpbm9taXMgLSBSb290IENBIE89Q2VydGlub21pcyBPVT0wMDAyIDQzMzk5ODkwMwojIFN1YmplY3Q6IENOPUNlcnRpbm9taXMgLSBSb290IENBIE89Q2VydGlub21pcyBPVT0wMDAyIDQzMzk5ODkwMwojIExhYmVsOiAiQ2VydGlub21pcyAtIFJvb3QgQ0EiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiAxNDowYTpmZDo4ZDphODoyODpiNTozODo2OTpkYjo1Njo3ZTo2MToyMjowMzozZgojIFNIQTEgRmluZ2VycHJpbnQ6IDlkOjcwOmJiOjAxOmE1OmE0OmEwOjE4OjExOjJlOmY3OjFjOjAxOmI5OjMyOmM1OjM0OmU3Ojg4OmE4CiMgU0hBMjU2IEZpbmdlcnByaW50OiAyYTo5OTpmNTpiYzoxMTo3NDpiNzozYzpiYjoxZDo2MjowODo4NDplMDoxYzozNDplNToxYzpjYjozOTo3ODpkYToxMjo1ZjowZTozMzoyNjo4ODo4MzpiZjo0MTo1OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmtqQ0NBM3FnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQmFNUXN3Q1FZRFZRUUdFd0pHVWpFVApNQkVHQTFVRUNoTUtRMlZ5ZEdsdWIyMXBjekVYTUJVR0ExVUVDeE1PTURBd01pQTBNek01T1RnNU1ETXhIVEFiCkJnTlZCQU1URkVObGNuUnBibTl0YVhNZ0xTQlNiMjkwSUVOQk1CNFhEVEV6TVRBeU1UQTVNVGN4T0ZvWERUTXoKTVRBeU1UQTVNVGN4T0Zvd1dqRUxNQWtHQTFVRUJoTUNSbEl4RXpBUkJnTlZCQW9UQ2tObGNuUnBibTl0YVhNeApGekFWQmdOVkJBc1REakF3TURJZ05ETXpPVGs0T1RBek1SMHdHd1lEVlFRREV4UkRaWEowYVc1dmJXbHpJQzBnClVtOXZkQ0JEUVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTlRNQ1Fvc1A1TDIKZnhTZUM1eWFhaDFBTUdUOXF0OE9IZ1pibjFDRjZzMk5xME5uM3JENmZvQ1dub1I0a2tqVzR6bnV6dVJaV0pmbApMaWVZNnBPb2Q1dEs4TzkwZ0Mzck1CKzEyY2VBbkdJbmtZandTb25kM0lqbUZQblZBeS8vbGR1OW4rd3MraFFWCldaVUt4a2Q4YVJpNXB3UDV5bmFwejhkdnRGNEYvdTdCVXJKMU1vZnM3U2xtTy9OS0ZvTDIxcHJiY3BqcDN2REYKVEtXcnRlb0I0b3d1Wkg5a2IvMmpKWk9MeUtJT1NZMDA4Qi9zV0VVdU5LcUVVTDNuc2tvVHVMQVByamhkc0trYgo1blBKV3FIWlprQ3FxVTJtTkFLdGhINnlJOEg3S3NabjlEUzJzSlZxTTA5eFJMV3R3SGt6aU9DLzdhT2dGTFNjCkNiQUs0MkMrK1BobWlNMWI4WGNGNExWemJzRjlSaTZPU3llbXpUVUsvZVZOZmFvcW95bkhXbWdFNk9YV2s2UmkKd3NYbTlFL0crWjhhallKSkdZcktXVU02NkEweXdmUk1Fd052YnFZL2tYUEx5bk52RWlDTDdzQ0NlTjVMTHNKSgp3eDN0RnZZazlDY2JYRmN4M0ZYdXFCNXZiS3ppUmN4WFY0cDFWeG5ndFZpWlNUWXhQRE1CYlJaS3piZ3FnNFNHCm0vbGcwaDl0a1FQVFlLYlZQWnJkZDVBOU5hU2ZEMTcxVWtScHVjQzYzTTk5MzN6WnhLeUdJaks4ZTJ1UjczcjQKRjJpdzRsTlZZQzJ2UHNLRDJOa0pLL0RBWk51SGk1SE1rZXNFL1hhMGxacm1GQVliMVRRZHZ0ai9kQnhUaFpuZwpXVkpLWWUySW5tdEppVVorSUZyWjUwcmxhdTdTWlJGREFnTUJBQUdqWXpCaE1BNEdBMVVkRHdFQi93UUVBd0lCCkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCVHZrVXoxcGNNdzZDOEk2dE54SXFTU2FIaDAKMlRBZkJnTlZIU01FR0RBV2dCVHZrVXoxcGNNdzZDOEk2dE54SXFTU2FIaDAyVEFOQmdrcWhraUc5dzBCQVFzRgpBQU9DQWdFQWZqMVUyaUpkR2xnK08xUW51cnJNeU9NYWF1bysrUkxyVmw4OVVNN2c2a2dtSnM5NVZuNlJISmsvCjBLR1JIQ3dQVDVpVldWTzkwQ0xZaUYyY04vejdaTUY0akl1YVlBbnExZm9oWDlCMFplZFF4Yjh1dVFzTHJiV3cKRjZZU2pOUmllT3BXYXV3SzBrRERQQVV3UGsyVXQ1OUtBOU45SjB1Mi9rVE8raGt6R20ya1F0SGR6TWpJMXhaUwpnMDgxbExNU1ZYM2w0a0xyNUp5VENjQk1Xd2VyeDIwUm9GQVhsQ09vdFFxU0Q3SjZ3V0FzT013YXBsdi84Z3pqCnFoOGMzTGlna3lmZVkrTi9JWjg2NVo3NjRCTnFkZXVXWEdLUmxJNW5VN2FKK0JJSnkyOVNXd055aGxDVkNOU04KaDRZVkg1VWsyS1J2bXM2a25adHQwckoyQm9iR1ZnakY2d25hTnNJYlcwRytZU3JqY09hNHB2aTJXc1M5SWZmLwpxbCtoYkhZNVp0YnFURlhoQURPYkU1aGp5Vy9RQVNBSk4xTG5ERTgremJ6MVg1WW5weUFDbGVBdTZBZEJCUjhWCmJ0YXc1Qm5nRHdLVEFDZHl4WXZSVkI5ZFNzTkFsMzVWcG56Qk13UVVBUjFKSUdrTEdaT2RibGdpOTBBTVJnd2oKWS9NNTBuOTJVYWYweUtIeERIWWlJMFpTS1MzaW8wRUhWbW1ZMGdVSnZHbkhXbUhOajRGZ0ZVMkEzWkRpZmNSUQo4b3c3YmtySHh1YUFLenlCdkJHQUZoQW4xL0ROUDNuTWN5ckRmbE9SMW03NDlmUEgwRkZOamt1bFcrWVpGenZXCmdRbmNJdHp1anJuRWoxUGhaN3N6dUlnVlJzL3RhVFgvZFExRzg4NXg0Y1ZyaGtJR3VVRT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0IgQ0EgTz1XSVNlS2V5IE9VPU9JU1RFIEZvdW5kYXRpb24gRW5kb3JzZWQKIyBTdWJqZWN0OiBDTj1PSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdCIENBIE89V0lTZUtleSBPVT1PSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkCiMgTGFiZWw6ICJPSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdCIENBIgojIFNlcmlhbDogMTU3NzY4NTk1NjE2NTg4NDE0NDIyMTU5Mjc4OTY2NzUwNzU3NTY4CiMgTUQ1IEZpbmdlcnByaW50OiBhNDplYjpiOTo2MToyODoyZTpiNzoyZjo5ODpiMDozNToyNjo5MDo5OTo1MToxZAojIFNIQTEgRmluZ2VycHJpbnQ6IDBmOmY5OjQwOjc2OjE4OmQzOmQ3OjZhOjRiOjk4OmYwOmE4OjM1OjllOjBjOmZkOjI3OmFjOmNjOmVkCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2Yjo5YzowODplODo2ZTpiMDpmNzo2NzpjZjphZDo2NTpjZDo5ODpiNjoyMTo0OTplNTo0OTo0YTo2NzpmNTo4NDo1ZTo3YjpkMTplZDowMTo5ZjoyNzpiODo2YjpkNgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHRUQ0NBcDJnQXdJQkFnSVFkckVnVW5Ud2hZZEdzL2dqR3ZiQ3dEQU5CZ2txaGtpRzl3MEJBUXNGQURCdApNUXN3Q1FZRFZRUUdFd0pEU0RFUU1BNEdBMVVFQ2hNSFYwbFRaVXRsZVRFaU1DQUdBMVVFQ3hNWlQwbFRWRVVnClJtOTFibVJoZEdsdmJpQkZibVJ2Y25ObFpERW9NQ1lHQTFVRUF4TWZUMGxUVkVVZ1YwbFRaVXRsZVNCSGJHOWkKWVd3Z1VtOXZkQ0JIUWlCRFFUQWVGdzB4TkRFeU1ERXhOVEF3TXpKYUZ3MHpPVEV5TURFeE5URXdNekZhTUcweApDekFKQmdOVkJBWVRBa05JTVJBd0RnWURWUVFLRXdkWFNWTmxTMlY1TVNJd0lBWURWUVFMRXhsUFNWTlVSU0JHCmIzVnVaR0YwYVc5dUlFVnVaRzl5YzJWa01TZ3dKZ1lEVlFRREV4OVBTVk5VUlNCWFNWTmxTMlY1SUVkc2IySmgKYkNCU2IyOTBJRWRDSUVOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMkJlMwpIRW9rS3RhWHNjcmlIdnQ5T08rWTliSTVtRTRudUJGZGU5SWxsSWlDRlNacUd6RzdxRnNoSVN2WUQwNmZXdkd4Cld1UjUxaklqSytGVHpKbEZYSHRQcmJ5L2gwb0xTNWRhcVBaSTdIMTdEYzBoQnQrZUZmMUJpa2kzSVBTaGVodFgKMUYxUS83cG4yQ09aSDhnLzQ5Ny9iMXQzc1d0dXVNbGs5K0hLUVVZT0tYSFF1U1A4eVlGZlR2ZHYzNytFclhOawp1N2RDam1uMjFIWWRmcDJudUZlS1VXZHkxOVNvdUpWVVFITUQ5dXIwNi80b1FuYy9uU01ic3JZOWdCUUhUQzVQCjk5VUtGZzI5WmtNM2ZpTkRlY05BaHZWTUtkcU9tcTBOcFFTSGlCNkY0K2xUMVp2SWl3TmplT3ZnR1VwdXV5OXIKTTJSWWs2MXB2NDhiNzRKSXh3SURBUUFCbzFFd1R6QUxCZ05WSFE4RUJBTUNBWVl3RHdZRFZSMFRBUUgvQkFVdwpBd0VCL3pBZEJnTlZIUTRFRmdRVU5RL0lObU5lNHFQcytUdG1GYzVSVXVPUm1qMHdFQVlKS3dZQkJBR0NOeFVCCkJBTUNBUUF3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUVCTSs0ZXltWUdRZnAzRnNMQW16WWg3S3pLTmJyZ2gKY1ZpWGZhNDNGSzgrNS9lYTRuMzJjWmlaQktwRGRIaWo0MGxoUG5PTVRaVGcrWEhFdGhZT1UzZ2YxcUtITHdJNQpnU2s4cnhXWUlURCtLSkFBak5IaHkvcGV5UDM0RUVZN29uaENrUmQwVlFyZVVHZE5adEduLy8zWndMV29vNHJPClp2VVBRODJuSzFkN1kwWnFxaTVTMlBUdDRXMnRLWkI0U0xyaEk2cWppZXkxcTViQXRFdWlIWmVlZXZKdVFISGYKYVBGbFRjNThCZDlUWmFtbDhMR1hCSEFWUmdPWTFOSy9WTFNnV0gxU2I5cFdKbUxVMk51Sk1XOGM4Q0xDMDJJYwpOYzFNYVJWVUdwQ1kzdXNlWDhwM3g4dU9QVU5wbkpwWTBDUTczeHRBbG40MXJZSEhUbkc2aUJNPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U1pBRklSIFJPT1QgQ0EyIE89S3Jham93YSBJemJhIFJvemxpY3plbmlvd2EgUy5BLgojIFN1YmplY3Q6IENOPVNaQUZJUiBST09UIENBMiBPPUtyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4KIyBMYWJlbDogIlNaQUZJUiBST09UIENBMiIKIyBTZXJpYWw6IDM1NzA0MzAzNDc2NzE4NjkxNDIxNzI3NzM0NDU4NzM4Njc0MzM3NzU1ODI5NjI5MgojIE1ENSBGaW5nZXJwcmludDogMTE6NjQ6YzE6ODk6YjA6MjQ6YjE6OGM6YjE6MDc6N2U6ODk6OWU6NTE6OWU6OTkKIyBTSEExIEZpbmdlcnByaW50OiBlMjo1MjpmYTo5NTozZjplZDpkYjoyNDo2MDpiZDo2ZToyODpmMzo5YzpjYzpjZjo1ZTpiMzozZjpkZQojIFNIQTI1NiBGaW5nZXJwcmludDogYTE6MzM6OWQ6MzM6Mjg6MWE6MGI6NTY6ZTU6NTc6ZDM6ZDM6MmI6MWM6ZTc6Zjk6MzY6N2U6YjA6OTQ6YmQ6NWY6YTc6MmE6N2U6NTA6MDQ6Yzg6ZGU6ZDc6Y2E6ZmUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURjakNDQWxxZ0F3SUJBZ0lVUG9wZEIreFYwakxWdCtPMlh3SHJMZHprMXVRd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1VURUxNQWtHQTFVRUJoTUNVRXd4S0RBbUJnTlZCQW9NSDB0eVlXcHZkMkVnU1hwaVlTQlNiM3BzYVdONgpaVzVwYjNkaElGTXVRUzR4R0RBV0JnTlZCQU1NRDFOYVFVWkpVaUJTVDA5VUlFTkJNakFlRncweE5URXdNVGt3Ck56UXpNekJhRncwek5URXdNVGt3TnpRek16QmFNRkV4Q3pBSkJnTlZCQVlUQWxCTU1TZ3dKZ1lEVlFRS0RCOUwKY21GcWIzZGhJRWw2WW1FZ1VtOTZiR2xqZW1WdWFXOTNZU0JUTGtFdU1SZ3dGZ1lEVlFRRERBOVRXa0ZHU1ZJZwpVazlQVkNCRFFUSXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDM3ZENVFxRXZOClFMWE9ZZWVXeXJTaDJnd2lzUHExZTNZQWQ0d0x6MzJvaHN3bVVlUWdQWVVNMWxqajUvUXFHSjNhMGE0bTd1dFQKM1BTUTFoTktESkE4dy9UYTBvNE5ranJjc2JIL09ON0R1aTFmZ0xrQ3ZVcWRHdyswdzhMQlp3UGQzQnVjUGJPdwozZ0FlcURSSHU1cnIvZ3NVdlRhRTJnMGd2L3BieTZrV0lLMDVZTzR2ZGJibmw1ejVQdjErVFc5TkwrK0lEV3I2CjNmRTliaUNsb0JLMFRYQzV6dGR5TzRtVHA0Q0VIQ2RKY2ttMS96dVZuc0hNeUFIczZBNktDcGJuczZhSDVkYjUKQlNzTmwwQndQTHFzZFZxYzFVMmRBZ3JTUzV0bVMwWUhGMld0bjJ5SUFOd2lpZURoWk5SbnZERjVZVHk3eWtITgpYR29BeUR3NGpsaXZBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFECkFnRUdNQjBHQTFVZERnUVdCQlF1RnFsS0dMWEx6UFZ2VVBNalgvaGQ1Nnp3eURBTkJna3Foa2lHOXcwQkFRc0YKQUFPQ0FRRUF0WFA0QTl4Wld4MTI2YU1xZTVBb3NrM0FNMCtxbXJIVXVPUW4vNm1XbWM1RzRHMThUS0k0cEFadwo4UFJCRWV3L1I0MC9jb2Y1Ty8ya2J5dFRBT0QvT2JscUJ3N3JIUnoyb25LUXk0STlFWUtMMHJ1ZktxOGg1bU9HCm5Ya1o3L2U3RERXUXc0cnRUdy8xekJMWnBENjdvUHdnbFY5UEppOFJJNE5PZFFjUHY1dlJ0QjNwRUFUK3ltQ1AKb2t5NHJjL2hrQS9OcmdySFhYdTNVTkxVWWZyVkZkdlhuNGRSVk91bDQrdkpoYUFsSURmN2pzNE1OSVRoUElHeQpkMDVEcFloZmhtZWhQZWEwWEdHMlB0dit0eWpGb2dldXRjcktqU29TNzVmdHdqQ2t5U3A2Ky9OTkl4dVpNelNnCkx2V3BDei9VWGVIUGhKL2lHY0pmaXRZZ0h1Tnp0dz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIDIgTz1Vbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuIE9VPUNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EgMiBPPVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4gT1U9Q2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIDIiCiMgU2VyaWFsOiA0NDk3OTkwMDAxNzIwNDM4MzA5OTQ2Mzc2NDM1NzUxMjU5Njk2OQojIE1ENSBGaW5nZXJwcmludDogNmQ6NDY6OWU6ZDk6MjU6NmQ6MDg6MjM6NWI6NWU6NzQ6N2Q6MWU6Mjc6ZGI6ZjIKIyBTSEExIEZpbmdlcnByaW50OiBkMzpkZDo0ODozZToyYjpiZjo0YzowNTplODphZjoxMDpmNTpmYTo3NjoyNjpjZjpkMzpkYzozMDo5MgojIFNIQTI1NiBGaW5nZXJwcmludDogYjY6NzY6ZjI6ZWQ6ZGE6ZTg6Nzc6NWM6ZDM6NmM6YjA6ZjY6M2M6ZDE6ZDQ6NjA6Mzk6NjE6ZjQ6OWU6NjI6NjU6YmE6MDE6M2E6MmY6MDM6MDc6YjY6ZDA6Yjg6MDQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYwakNDQTdxZ0F3SUJBZ0lRSWRiUVNrOGxEOGt5Ti95cVhoS042VEFOQmdrcWhraUc5dzBCQVEwRkFEQ0IKZ0RFTE1Ba0dBMVVFQmhNQ1VFd3hJakFnQmdOVkJBb1RHVlZ1YVhwbGRHOGdWR1ZqYUc1dmJHOW5hV1Z6SUZNdQpRUzR4SnpBbEJnTlZCQXNUSGtObGNuUjFiU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVURWtNQ0lHCkExVUVBeE1iUTJWeWRIVnRJRlJ5ZFhOMFpXUWdUbVYwZDI5eWF5QkRRU0F5TUNJWUR6SXdNVEV4TURBMk1EZ3oKT1RVMldoZ1BNakEwTmpFd01EWXdPRE01TlRaYU1JR0FNUXN3Q1FZRFZRUUdFd0pRVERFaU1DQUdBMVVFQ2hNWgpWVzVwZW1WMGJ5QlVaV05vYm05c2IyZHBaWE1nVXk1QkxqRW5NQ1VHQTFVRUN4TWVRMlZ5ZEhWdElFTmxjblJwClptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TUXdJZ1lEVlFRREV4dERaWEowZFcwZ1ZISjFjM1JsWkNCT1pYUjMKYjNKcklFTkJJREl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQzkrWGo0NXRXQQpER1NkaGh1V1pHYy9Jam9lZFFGOTcvdGNaNHpKekZ4cnFaSG11VUxsSUV1YjJwdDd1WmxkMlp1QVM5ZUVRQ3NuCjAraTZNTHMrQ1JxblNaWHZLMEFrd3BmSHArNmJKZStvQ2dDWGhWcXFuZHdweWVJMUIrdHdUVXJXd2JOV3VLRkIKT0p2Uit6Ri9qK0JmNGJFL0Q0NFdTV0RYQm8wWSthb21FS3NxMDlEUlo0MGJScjVITU5VdWN0SEZZOXJuWTNsRQpma3RqSkltR0xqUS9LVXhTaXlxbndPS1JLSW01d0Z2NUhkbm5KNjMvbWdLWHdjWlFrcHNDTEwycHVUUlpDcitFClN2L2Yvck9mNjltZTRKZ2o3S1pyZHhZcTI4eXRPeHlraDl4R2MxNFpZbWhGVitTUWdrSzdRdGJ3WWVEQm96MW0KbzEzMEdPNkl5WTBYUlNtWk1uVUNNZTRwSnNockF1YTFZa1YvTnhWYUkyaUoxRDdlVGlldzhFQU12RTBYeTAyaQpzeDdRQmxyZDlwUFBWM1daOWZxR0dtZDRzNytXL2pUY3ZlZFNWdVd6NVhWNzEwR1JCZHhkYWVPVkRVTzUvSU9XCk9aVjdiSUJhVHhOeXh0ZDlLWHBFdWxLa0t0VkJSZ2tnL2lLZ3Rsc3dqYnlKRE5YWGNQaUhVdjNhNzZ4UkxnZXoKVHY3UUNkcHc3NWo2VnVadDI3VlhTOXpsTENVVnlKNHVlRTc0MnB5ZWhpektWL01hNWNpU2l4cUNsbnJEdkZBUwphZGdPV2thTE91c20raVBKdHJDQnZrSUFwUGpXL2pBdXg5Skc5dVdPZGYzeXpMblFoMXZNQmhCZ3U0TTF0MTVuCjNrZnNtVWp4cEtFVi9xMk1ZbzQ1VlU4NUZybXhZNTMvdHdJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQUQKQVFIL01CMEdBMVVkRGdRV0JCUzJvVlE1QXNPZ1A0Nkt2UHJVK0J5bTBUb08vVEFPQmdOVkhROEJBZjhFQkFNQwpBUVl3RFFZSktvWklodmNOQVFFTkJRQURnZ0lCQUhHbERzN2s2YjgvT05XSldzUUNZZnRNeFJRWExZdFBVMnNRCkYveGxoTWNRU1pEZTI4Y21rNGdtYjNEV0FsNDVvUGVQcTVhMXBSTmNnUlJ0RG9HQ0VSdUtUc1pQcGQxaUhrVGYKQ1ZuMFczY0xOK21MSU1iNENrNHVXQnpyTTlEUGhtREoydnVBTDU1TVlJUjRQU0ZrMXZ0Qkh4Z1A1OGwxY2IyOQpYTjQwaHo1QnNBNzJ1ZFkvQ1JPV0ZDL2VtaDFhdVZiT05UcXdYM0JOWHVNcDhTTW9jbG0ycThLTVppWWNkeXdtCmRqV0xLS2Rwb1BrNzlTUGRoUkIweVpBRFZwSG5yN3BIMUJLWEVTTGpva21VYk9lM2xFdTZMYVRhTTR0TXBrVC8KV2p6R0hXVFl0VEhrcGp4NnFGY0wyKzFoR3N2eHpuTjNZNlNIYjB4Uk9OYmtYOGVmdG9FcTVJVkllVmhlTy9qYgpBb0pud1RuYnczUkxQVFllK1NtVGlHaGJxRVFaSWZDbjZJRU5MT2lUTnJRM3NzcXdHeVo2bWlVZm1wcUFua3NxClAvdWptdjV6TW5IQ25zWnk0WXBvSi9Ia0Q3VEVUS1Zoay9pWEVBY3FNQ1dwdWNoeHVPOW96QzErOWVCK0Q0S28KYjdhNmJJTkRkODJLa2hlaG5sdDRGajFGNGpOeTNlRm15cG5UeWNVbS9RMW9CRWF1dHRtYmpMNFp2ckhHOGhuagpYQUxLTE5odlNnZlp5VFhhUUhYeXhLY1piNTVDRUpoMTVwV0xZTHp0eFJMWGlzN1ZtRnhXbGdQRjduY0dOZi9QCjVPNC9FMkh1MjlvdGhmRE5ycDJ5R0FsRnc1S2hjaGY4UjdhZ0N5enh4TjVEYUFocVh6dndkbVA3ekFZc3BzYmkKRHJXNXZpU1AKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUgTz1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUgTz1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eQojIExhYmVsOiAiSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxNSIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IGNhOmZmOmUyOmRiOjAzOmQ5OmNiOjRiOmU5OjBmOmFkOjg0OmZkOjdiOjE4OmNlCiMgU0hBMSBGaW5nZXJwcmludDogMDE6MGM6MDY6OTU6YTY6OTg6MTk6MTQ6ZmY6YmY6NWY6YzY6YjA6YjY6OTU6ZWE6Mjk6ZTk6MTI6YTYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGEwOjQwOjkyOjlhOjAyOmNlOjUzOmI0OmFjOmY0OmYyOmZmOmM2Ojk4OjFjOmU0OjQ5OjZmOjc1OjVlOjZkOjQ1OmZlOjBiOjJhOjY5OjJiOmNkOjUyOjUyOjNmOjM2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHQ3pDQ0EvT2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQnBqRUxNQWtHQTFVRUJoTUNSMUl4CkR6QU5CZ05WQkFjVEJrRjBhR1Z1Y3pGRU1FSUdBMVVFQ2hNN1NHVnNiR1Z1YVdNZ1FXTmhaR1Z0YVdNZ1lXNWsKSUZKbGMyVmhjbU5vSUVsdWMzUnBkSFYwYVc5dWN5QkRaWEowTGlCQmRYUm9iM0pwZEhreFFEQStCZ05WQkFNVApOMGhsYkd4bGJtbGpJRUZqWVdSbGJXbGpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxZEdsdmJuTWdVbTl2CmRFTkJJREl3TVRVd0hoY05NVFV3TnpBM01UQXhNVEl4V2hjTk5EQXdOak13TVRBeE1USXhXakNCcGpFTE1Ba0cKQTFVRUJoTUNSMUl4RHpBTkJnTlZCQWNUQmtGMGFHVnVjekZFTUVJR0ExVUVDaE03U0dWc2JHVnVhV01nUVdOaApaR1Z0YVdNZ1lXNWtJRkpsYzJWaGNtTm9JRWx1YzNScGRIVjBhVzl1Y3lCRFpYSjBMaUJCZFhSb2IzSnBkSGt4ClFEQStCZ05WQkFNVE4waGxiR3hsYm1saklFRmpZV1JsYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjEKZEdsdmJuTWdVbTl2ZEVOQklESXdNVFV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQwpBUURDK0trL0c0bjhQRHdFWFQyUU5yQ1JPbms4WmxydmJUa0JTUnEwdDg5L1RTTlR0NUFBNHhNcUtLWXg4WkVBCjR5anNyaUZCemgvYS9YMFNXd0dERDdtd1g1bmg4aEtEZ0UwR1B0K3NyK2VoaUdzeHIvQ0wwQmd6dU50RmFqVDAKQW9Ba0tBb0NGWlZlZGlvTm1Ub1VXL2JMeTFPOEUwMEJpRGVVSlJ0Q3ZDTFlqcU9XWGpyWk10cys2UEFRWmUxMAo0UytuZks4bk5Mc3BmWnUyenduSTVkTUsvSWhsWlhRSzNITWNYTTFBc1J6VXRvU01URkRQYUk2b1dhN0NKMDZDCm9qWGRGUFFmLzdKMzFZY3ZxbTU5SkNmbnhzc201dVgrWndkajJFVU4zVHBaWlRsWWVwS1pjajJjaEY2SUlialYKOUN6ODJYQlNUM2k0dlR3cmk1V1k5YlBSYU04Z0ZINU1YRi9uaStYMU5ZRVpOOWNSQ0xkbXZ0Tkt6b05YQURyRApnZmdYeTVJMlhkR2oySFViNFlzbjZucElRZjFGR1FhdEo1bE93WEJIM2JXZmdWTVM1YkdNU0YweFF4ZmpqTVo2Clk1WkxLVEJPaEU1aUdWNDh6cGVRcFg4QjY1M2crSXVKM1NXWVBaSzJmdS9aOFZGUmZTMG15R2xaWWVDc2FyZ3EKTmhFRWVsQzlNb1MrTDl4eTFkY2RGa2ZrUjJZZ1AvU1d4YStPQVhxbEQzcGs5UTBZaDltdWlOWDZoTUU2d0drbwpMZklOYUZHcTQ2VjN4cVNRRHFFM2l6RWpSOEVKQ090dTkzaWIxNEw4aENDWlNSbTJFa2F4KzBWVkZxbWpaYXljCkJ3L3FhOXdmTGdaeTdJYUlFdVF0MjE4RkwrVHdBOU1tTStlQXdzMUNvUmMwQ3dJREFRQUJvMEl3UURBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVWNSVm55TWpKdlhWZApjdEE0R0dxZDgzRWtWQXN3RFFZSktvWklodmNOQVFFTEJRQURnZ0lCQUhXN2JWUkxxaEJZUmpUeVl0Y1dObDBJClh0VnN5SWU5dEM1RzhqSDRmT3BDdFpNV1ZkeWhEQktnMm1GK0QxaFljMlJ5eCtoRmp0eXA4aVkveG5tTXNWTUkKTTRHd1ZoTys1bEZjMkpzS1QwdWNWbE1DNlUvMkRXRHFUVUpWNkh3YklTSFRHenJNZC9LNGtQRm94L2xhL3ZvdAo5TC9KOVVVYnpqZ1FLamVLZWFPMDR3bHNoWWFULzRtV0ozaUJqMmZqUm5SVWp0a05hZUpLOUUxMEEvK3lkKzJWClo1ZmtzY1dydjJvajZOU1U0a1FvWXNSTDR2RFk0aWxyR25CK0pHR1RlMDhETWlVTlJTUXJsclJHYXI5S0MvZWEKajhHc0dzVm44MjgwMHZwelk0enZGckNvcEVZcStPc1M3SEswNy9ncmZveFN3SXVFVlBrdlB1TlZxTnhtc2RuaApYOWl6akZrMFdhU3JUMnk3SHhqYmRhdll5NUxObERoaERnY0dIMHRHRVBFVnZvMkZYRHRLSzRGNUQ3UnBuMGxRCmwwMzNEbFpkd0pWcXdqYkRHMmpKOVNyY1I1cStzczdGSmVqNkE3bmErUlp1a1lUMUhDakkvQ2JNMXh5UVZxZGYKYnpvRXZNMTRpUXVPRHkranFrK2lHeEk5RmdoQUQvRkdUTmVxZXdqQkN2VnRKOTRDajhyRHRTdks2ZXZJSVZNNApwY3c3MkhjM01LSlAyVy9SOGtDdFFYb1h4ZFpLTlltM1FkVjhobjlWVFlOS3BYTWd3RHF2a1BHYUpJN1pqbkhLCmU3aUcycktQbVQ0ZEV3MFNFZTdVcS9EcEZYWUM1T0RmcWlBZVcyR0ZaRUNwa0pjTnJWUFNXaDJIYWdDWFpXSzAKdm05cXAvVXNRdTB5cmJZaG5yNjgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1IE89SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290Q0EgMjAxNSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgTGFiZWw6ICJIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290Q0EgMjAxNSIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDgxOmU1OmI0OjE3OmViOmMyOmY1OmUxOjRiOjBkOjQxOjdiOjQ5OjkyOmZlOmVmCiMgU0hBMSBGaW5nZXJwcmludDogOWY6ZjE6NzE6OGQ6OTI6ZDU6OWE6ZjM6N2Q6NzQ6OTc6YjQ6YmM6NmY6ODQ6Njg6MGI6YmE6YjY6NjYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQ0OmI1OjQ1OmFhOjhhOjI1OmU2OjVhOjczOmNhOjE1OmRjOjI3OmZjOjM2OmQyOjRjOjFjOmI5Ojk1OjNhOjA2OjY1OjM5OmIxOjE1OjgyOmRjOjQ4OjdiOjQ4OjMzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDd3pDQ0FrcWdBd0lCQWdJQkFEQUtCZ2dxaGtqT1BRUURBakNCcWpFTE1Ba0dBMVVFQmhNQ1IxSXhEekFOCkJnTlZCQWNUQmtGMGFHVnVjekZFTUVJR0ExVUVDaE03U0dWc2JHVnVhV01nUVdOaFpHVnRhV01nWVc1a0lGSmwKYzJWaGNtTm9JRWx1YzNScGRIVjBhVzl1Y3lCRFpYSjBMaUJCZFhSb2IzSnBkSGt4UkRCQ0JnTlZCQU1UTzBobApiR3hsYm1saklFRmpZV1JsYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjFkR2x2Ym5NZ1JVTkRJRkp2CmIzUkRRU0F5TURFMU1CNFhEVEUxTURjd056RXdNemN4TWxvWERUUXdNRFl6TURFd016Y3hNbG93Z2FveEN6QUoKQmdOVkJBWVRBa2RTTVE4d0RRWURWUVFIRXdaQmRHaGxibk14UkRCQ0JnTlZCQW9UTzBobGJHeGxibWxqSUVGagpZV1JsYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjFkR2x2Ym5NZ1EyVnlkQzRnUVhWMGFHOXlhWFI1Ck1VUXdRZ1lEVlFRREV6dElaV3hzWlc1cFl5QkJZMkZrWlcxcFl5QmhibVFnVW1WelpXRnlZMmdnU1c1emRHbDAKZFhScGIyNXpJRVZEUXlCU2IyOTBRMEVnTWpBeE5UQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkpLZwpRZWhMZ29SYzR2Z3hFWm1HWkU0SkpTK2RRUzhLcmpWUGRKV3lVV1Jyald2bVAzQ1Y4QVZFUjZaeU9GQjJsUUphCmpxNG9udmt0VHBudkxFaHZUQ1VwNk5GeFc5OGR3WFUzdE5mNmUzcENuR29LVmxwOGFRdXFnQWtrYkg3QlJxTkMKTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkxRaQpDNEtaSkFFT25MdmtEdjIvKzVjZ2s1a3FNQW9HQ0NxR1NNNDlCQU1DQTJjQU1HUUNNR2ZPRm1JNG9xeGlSYWVwCmxTVEFHaWVjTWp2QXdOVzZxZWY0QkVOVGhlNVNJZDZkOVNXRFBwNVlTeS9YWnhNT0lRSXdCZUYxQWQ1bzdTb2YKVFV3SkNBM3NTNjFrRnlqbmRjNUZaWEloRjhzaVFRNk1FNWc0bWxSdG04cmlmT29DV0NLUgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2VydHBsdXMgUm9vdCBDQSBHMSBPPUNlcnRwbHVzCiMgU3ViamVjdDogQ049Q2VydHBsdXMgUm9vdCBDQSBHMSBPPUNlcnRwbHVzCiMgTGFiZWw6ICJDZXJ0cGx1cyBSb290IENBIEcxIgojIFNlcmlhbDogMTQ5MTkxMTU2NTc3OTg5ODM1NjcwOTczMTE3Njk2NTYxNTU2NDYzNzcxMwojIE1ENSBGaW5nZXJwcmludDogN2Y6MDk6OWM6Zjc6ZDk6Yjk6NWM6Njk6Njk6NTY6ZDU6Mzc6M2U6MTQ6MGQ6NDIKIyBTSEExIEZpbmdlcnByaW50OiAyMjpmZDpkMDpiNzpmZDphMjo0ZTowZDphYzo0OToyYzphMDphYzphNjo3Yjo2YToxZjplMzpmNzo2NgojIFNIQTI1NiBGaW5nZXJwcmludDogMTU6MmE6NDA6MmI6ZmM6ZGY6MmM6ZDU6NDg6MDU6NGQ6MjI6NzU6YjM6OWM6N2Y6Y2E6M2U6YzA6OTc6ODA6Nzg6YjA6ZjA6ZWE6NzY6ZTU6NjE6YTY6Yzc6NDM6M2UKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZhekNDQTFPZ0F3SUJBZ0lTRVNCVmcrUXRQbFJXaFMyRE43Y3MzRVlSTUEwR0NTcUdTSWIzRFFFQkRRVUEKTUQ0eEN6QUpCZ05WQkFZVEFrWlNNUkV3RHdZRFZRUUtEQWhEWlhKMGNHeDFjekVjTUJvR0ExVUVBd3dUUTJWeQpkSEJzZFhNZ1VtOXZkQ0JEUVNCSE1UQWVGdzB4TkRBMU1qWXdNREF3TURCYUZ3MHpPREF4TVRVd01EQXdNREJhCk1ENHhDekFKQmdOVkJBWVRBa1pTTVJFd0R3WURWUVFLREFoRFpYSjBjR3gxY3pFY01Cb0dBMVVFQXd3VFEyVnkKZEhCc2RYTWdVbTl2ZENCRFFTQkhNVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQgpBTnBRaDdiYXVLaytuV1Q2VmpPYVZqMFc1UU9Wc2pRY21tMWlCZFRZaitlSlpKKzYyMlNMWk9aNUttSE5yNDlhCmlaRmx1Vmo4dEFOZmtUOHRFQlhnZnMrOC9IOURaNml0WGpZajJKaXpUZk5EbmpsOEt2enNpTldJN25DOWhSWXQKNmt1SlBLTnhRdjRjL2RNY0xSQzRobFRxUTdqYnhvZmFxSzZBSmM5NkpoMnFrYkJJYjY2MTNwN1kxL29BL2NhUAowRkc3WW4ya3NZeXkveUFSdWpWakJZWkhZRU16a1BaSG9nTlBsazJkVDhIcTZweWkvalF1M3JmS0czYWt0NjJmCjZhalVlRDk0L3ZJNENUWWQwaFlDeU93cWFLLzFqcFR2TFJONkhrSktIUlV4cmd3RVYveGhjL014Vm9ZeGdLREUKRVc0d2R1T1U4RjhFeEt5SGNvbVl4WjNNVndpYTlBejhmWG9GT3ZwSGdEbTJ6NFFUZDI4bjZ2K1daeGNJYmVrTgoxaU5RTUxBVmRCTSs1Uy8vRHMzRUMwcGQ4TmdBTTBsbTY2RVlmRmt1UFNpNVlYSEx0YVc2dU9yYzRuQnZDR3JjCmgyYzA3OTh3Y3QzenlUOGovelhodmlFcElEQ0I1Qm1sSU9rbHluTXhkQ20rNGtMVjg3SW1ac2RvL1JtejV5Q1QKbWVoZDRGNkg1MGJvSlp3S0tTVFV6VmlHVWtBa3Nuc1BtQklnSlBhUWJFZklEYnNZSUM3Wi9meUw4aW5xaDNTVgo0RUpRZUlRRVFXR3c5Q0VqankzTEtDSHlhbXowR3FiRkZMUTNaVStWL1lESStITGxKV3ZFWUxGN2JZNUtpblBPCldmdHdlbk1HRTluVGREY2tRUW9SYjVmYzUrUitvYjBWOHJxSER6MW9paFlIQWdNQkFBR2pZekJoTUE0R0ExVWQKRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJTb3djQ2JrYWhERlh4ZApCaWUwS2xIWWx3dUJzVEFmQmdOVkhTTUVHREFXZ0JTb3djQ2JrYWhERlh4ZEJpZTBLbEhZbHd1QnNUQU5CZ2txCmhraUc5dzBCQVEwRkFBT0NBZ0VBbkZadkFYN1J2VXoxaXNid0poL2s0RGdZekRMREtUdWRRU2swWWNiWDhBQ2gKNjZSeWo1UVh2Qk1zZGJSWDdncDhDWHJjMWNxaDBEUVQrSGVybitYKzJCNTBpb1VIajMvTWVYcktsczNOL1UvNwovU01Oa1BYMFh0UEdZWDJlRWVBQzdna0UyUWZkcG9xM0RJTWt1NE5Ra3Y1Z2RSRSsySjJ3aW5xMTRKMmJ5NUJTClM3Q1RLdFErRmpQbG5zWmxGVDVrT3dRLzJ3eVBYMXdkYVIrdjgra2hqUFB2bC9hYXR4bTJoSFNjbzFTMWNFNWoKMkZkZFV5R2JRSkpEK3RaM1ZUTlBaTlg3MEN4cWptMGxwdStGNkFMRVV6NjVub2U4ekRVYTNxSHBpbU9IWlI0UgpLdHRqZDVjVXZwb1VtUkd5d082d1QvZ1VJVEpEVDUrcm9zdW9ENm83QmxYR0VpbFhDTlEzMTRjbnJVbFpwNUdyClJIcGVqWERibDg1SVVMRnprL2J3ZzJENXpmSGhNZjFiZkhFaFl4UVVxcS9GM3BOK2FMSHNJcUtxa0hXZXRVTnkKNm1TamhFdjlES2dtYTNHWDdsWmpadWhDVlBuSEhkL1FqMXZmeURCdmlQNE54RE1jVTZpai9VZ1E4dVFLVHVFVgpWL3h1WkREQ1ZSSGM2cW5OU2xTc0tXTkV6MHBBb05ab1dSc3orZTg2aTlzZ2t0eENoTDhCcTRmQTFTQ0MyOGE1Cmc0VkNYQTlETzJwSk5kV1k5QlcvK21HQkRBa2dHTkxRRnd6TFNBQlE2WGFDakdUWE9xQUhWY3dlTWNEdk9yUmwKKytPL1FtdWVENmk5YTVqYzJOdkxpNlRkMTFuMGJ0Mytxc09SMEM1Q0I4QU1UVlBOSkxGTVd4NVI5Ti9wa3ZvPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2VydHBsdXMgUm9vdCBDQSBHMiBPPUNlcnRwbHVzCiMgU3ViamVjdDogQ049Q2VydHBsdXMgUm9vdCBDQSBHMiBPPUNlcnRwbHVzCiMgTGFiZWw6ICJDZXJ0cGx1cyBSb290IENBIEcyIgojIFNlcmlhbDogMTQ5MjA4NzA5NjEzMTUzNjg0NDIwOTU2MzUwOTIyODk1MTg3NTg2MTU4OQojIE1ENSBGaW5nZXJwcmludDogYTc6ZWU6YzQ6Nzg6MmQ6MWI6ZWU6MmQ6Yjk6Mjk6Y2U6ZDY6YTc6OTY6MzI6MzEKIyBTSEExIEZpbmdlcnByaW50OiA0Zjo2NTo4ZToxZjplOTowNjpkODoyODowMjplOTo1NDo0Nzo0MTpjOTo1NDoyNTo1ZDo2OTpjYzoxYQojIFNIQTI1NiBGaW5nZXJwcmludDogNmM6YzA6NTA6NDE6ZTY6NDQ6NWU6NzQ6Njk6NmM6NGM6ZmI6Yzk6Zjg6MGY6NTQ6M2I6N2U6YWI6YmI6NDQ6YjQ6Y2U6NmY6Nzg6N2M6NmE6OTk6NzE6YzQ6MmY6MTcKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNIRENDQWFLZ0F3SUJBZ0lTRVNEWmtjNnVvK2pGNS8vcEFxL1BjN3hWTUFvR0NDcUdTTTQ5QkFNRE1ENHgKQ3pBSkJnTlZCQVlUQWtaU01SRXdEd1lEVlFRS0RBaERaWEowY0d4MWN6RWNNQm9HQTFVRUF3d1RRMlZ5ZEhCcwpkWE1nVW05dmRDQkRRU0JITWpBZUZ3MHhOREExTWpZd01EQXdNREJhRncwek9EQXhNVFV3TURBd01EQmFNRDR4CkN6QUpCZ05WQkFZVEFrWlNNUkV3RHdZRFZRUUtEQWhEWlhKMGNHeDFjekVjTUJvR0ExVUVBd3dUUTJWeWRIQnMKZFhNZ1VtOXZkQ0JEUVNCSE1qQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQk0wUFcxYUMzL0JGR3RhdAo5M253SGNtc2x0YWVUcHdmdEVJUnlvYS9iZnVGbzhYbEdWelg3cVkvYVdmWWVPS215Y1RiTFhrdTU0dU5BbTh4CklrMEc0MkJ5UlowT1FuZWV6cy9sZjRXYkdPVDh6QzV5MHhhVFRzcVpZMXloQlNwc0JxTmpNR0V3RGdZRFZSMFAKQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk5xRFl3SjVqdHBNeGp3agpGTmlQd3lDcktHQlpNQjhHQTFVZEl3UVlNQmFBRk5xRFl3SjVqdHBNeGp3akZOaVB3eUNyS0dCWk1Bb0dDQ3FHClNNNDlCQU1EQTJnQU1HVUNNSEQrc0F2Wjk0T1g3UE5WSGRUY3N3WU8vak9ZbllzNWtHdVVJZTIyMTEzV1ROY2gKcCtlL0lROHJ6ZmNxM0lVSG5RSXhBSVlVRnVYY3NHWEN3STRVbjc4a0Ztamx2UGw1YWR5dFJTdjN0akZ6ekFhbApVNU9SR3BPdWNHcG51dGVlNVdFYVh3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU9wZW5UcnVzdCBSb290IENBIEcxIE89T3BlblRydXN0CiMgU3ViamVjdDogQ049T3BlblRydXN0IFJvb3QgQ0EgRzEgTz1PcGVuVHJ1c3QKIyBMYWJlbDogIk9wZW5UcnVzdCBSb290IENBIEcxIgojIFNlcmlhbDogMTQ5MjAzNjU3NzgxMTk0NzAxMzc3MDQwMDEyNzAzNDgyNTE3ODg0NDc3NQojIE1ENSBGaW5nZXJwcmludDogNzY6MDA6Y2M6ODE6Mjk6Y2Q6NTU6NWU6ODg6NmE6N2E6MmU6Zjc6NGQ6Mzk6ZGEKIyBTSEExIEZpbmdlcnByaW50OiA3OTo5MTplODozNDpmNzplMjplZTpkZDowODo5NTowMTo1MjplOTo1NToyZDoxNDplOTo1ODpkNTo3ZQojIFNIQTI1NiBGaW5nZXJwcmludDogNTY6Yzc6NzE6Mjg6ZDk6OGM6MTg6ZDk6MWI6NGM6ZmQ6ZmY6YmM6MjU6ZWU6OTE6MDM6ZDQ6NzU6OGU6YTI6YWI6YWQ6ODI6NmE6OTA6ZjM6NDU6N2Q6NDY6MGU6YjQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZiekNDQTFlZ0F3SUJBZ0lTRVNDemtGVTVmWDgyYldUQ3A1OXJZNDVuTUEwR0NTcUdTSWIzRFFFQkN3VUEKTUVBeEN6QUpCZ05WQkFZVEFrWlNNUkl3RUFZRFZRUUtEQWxQY0dWdVZISjFjM1F4SFRBYkJnTlZCQU1NRkU5dwpaVzVVY25WemRDQlNiMjkwSUVOQklFY3hNQjRYRFRFME1EVXlOakE0TkRVMU1Gb1hEVE00TURFeE5UQXdNREF3Ck1Gb3dRREVMTUFrR0ExVUVCaE1DUmxJeEVqQVFCZ05WQkFvTUNVOXdaVzVVY25WemRERWRNQnNHQTFVRUF3d1UKVDNCbGJsUnlkWE4wSUZKdmIzUWdRMEVnUnpFd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJSwpBb0lDQVFENGVVYmFsc1V3WG9weEF5MXdwTHV3eFFqY3plWTF3SUNrRVMzZDVvZXVYVDJSMG9kc043ZmFZcDZiCndpVFhqL0hicHFiZlJtOVJwbkhMUGhzeFoyTDNFVnMwSjlWNVRveWJXTDBpRUExY0p3emRNT1dvMDEwaE9IUVgKL3VNZnRrODdheTNiZldBZmpIMU1CY0xyQVJZVm1CU08wWkIzSWovc3dqbTRlVHJ3U1NUaWxaSGNZVFNTakZSMAo3N0Y5akFIaU9IM0JYMnBmSkxLT1loZXRlU0N0cXgyMzRMU1dTRTltUXhBR0ZpUUQ0ZUNjanNaR1Q0NGFtZUdQCnVZNHpiR25lV0syZ0RxZGtWQkZwUkdaUFRCS25qaXg5eE5SYnhRQTBNTUhabWY0eXpnZUV0RTdOQ3Y4MlRXTHgKcDJOWDVOdHFwNjYvSzduSjVySW5pZVYrbWh4TmFNYkJHTjR6SzFGR1N4eU85ejBNK1lvMEZNVDdNelVqOGN6eApLc2VsdTdDaXp2NVRhMDFCRzJZb3NwYjZwNjRLVHJrNU0wU2NkTUdUSFBqZ25pUWxRL0diSTRLcTN5d2dzTncyClRnT3pmQUxVNW5zYXFvY1R2ejZoZEx1YkR1SEFrNS9YcEdiS3V4czc0ekQwTTFtS0IzSURWZWR6YWdNeGJtK1cKRytPaW42K1N4KzMxUXJjbFREc1RCTThjbHE4Y0lxUFFxd1d5VEJJalV0ejlHVnNubkI0N2V2MUNJOXNqZ0JQdwp2RkVWVkpTbWR6N1FkRkc5VVJRSU9UZkxIelNwTUoxU2hDNVZrTEc2MzFVQUM5aFdMYkZKU1hLQXFXTFh3UFlZCkVRUlZ6WFI3ejJGd2VmUjdMRnhja3Z6bHVGcXJUSk9Wb1NmdXBiN1BjU05DdXB0MkxRSURBUUFCbzJNd1lUQU8KQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVsMFloVnlFMQoyalpWeC9QeE4zRGxDUGFUS2JZd0h3WURWUjBqQkJnd0ZvQVVsMFloVnlFMTJqWlZ4L1B4TjNEbENQYVRLYll3CkRRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFCM2RBbUI4NERXbjVwaDc2a1RPWjBCUDhwTnVadFE1aVNhczAwMEUKUEx1SElUODM5SEVsMmt1NnE1YUNnWkcyN2RteHBHV1g0bTlrV2FTVzdtREtIeVA3UmJyL2p5VHd5cWt4ZjNrZgpnTE10TXJwa1oyQ3Z1Vm5OMzVwSjA2aUNzZm1ZbElyTTRMdmdCQnVaWUxGR1pkd0lvckpHbmtTSTZwTitWeGJTCkZYSmZMa3VyMUoxanVPTkk1ZjZFTGxnS24wTWQvcmNZa29aRFN3NmNNb1lzWVBYcFNPcVY3WEFwOGRVdi9UVzAKVjgvYmhVaVp1Y0p2YkkvTmVKV3NaQ2o5VnJERGI4TytXVkxoWDRTUGdQTDBEVGF0ZHJPanRlRmtkanBZM0gxUApYbFpzNVZWWlY2WGY4WXBtTUl6VVVtSTRkN1MrS05mS05zU2JCZkQ0RmR2YjhlODBuUjE0U29oV1oyNWcvNC9JCmkrR092VUtwTXdwWlFoSVNLdnF4blVPT0JadVoybUt0VnphekhiWU5lUzJXdU92eURFc01wWlRHTUtjbUdTM3QKVEFaUU1QSDlXRDI1U3hkZkdiUnFoRlMwT0U4NW9nMldhTU1vbFAzdExSOUthME9XTHBBQkVQczRwb0VMMEw5MQowOVM1enZFL2J3NGNIamR4NVJpSGRSay9VTGxlcEVVMHJiREs1dVVUZGc4eEZLbU9MWlRXMVlWTmN4VlBTL0t5ClB1MXN2ZjBPbldaenNEMjA5NytvNEJHa3hLNTFDVXBqQUVnZ3BzYWRDd21LdE9EbXpqN0hQaVk0NlN2ZXBnaEoKQXdTUWl1bVB2K2kydENxakk0MGNITEk1a3FpUEFseEFPWFhVYzBFQ2Q5N040RU9IMXVTNlNzTnNFbi8rS3VZagoxb3h4Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMiBPPU9wZW5UcnVzdAojIFN1YmplY3Q6IENOPU9wZW5UcnVzdCBSb290IENBIEcyIE89T3BlblRydXN0CiMgTGFiZWw6ICJPcGVuVHJ1c3QgUm9vdCBDQSBHMiIKIyBTZXJpYWw6IDE0OTIwMTI0NDgwNDI3MDIwOTY5ODY4NzU5ODc2NzY5MzU1NzM0MTU0NDEKIyBNRDUgRmluZ2VycHJpbnQ6IDU3OjI0OmI2OjU5OjI0OjZiOmFlOmM4OmZlOjFjOjBjOjIwOmYyOmMwOjRlOmViCiMgU0hBMSBGaW5nZXJwcmludDogNzk6NWY6ODg6NjA6YzU6YWI6N2M6M2Q6OTI6ZTY6Y2I6ZjQ6OGQ6ZTE6NDU6Y2Q6MTE6ZWY6NjA6MGIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDI3Ojk5OjU4OjI5OmZlOjZhOjc1OjE1OmMxOmJmOmU4OjQ4OmY5OmM0Ojc2OjFkOmIxOjZjOjIyOjU5OjI5OjI1OjdiOmY0OjBkOjA4Ojk0OmYyOjllOmE4OmJhOmYyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYnpDQ0ExZWdBd0lCQWdJU0VTQ2hhUnUvdmJtOVVwYVBJK2hJdnlZUk1BMEdDU3FHU0liM0RRRUJEUVVBCk1FQXhDekFKQmdOVkJBWVRBa1pTTVJJd0VBWURWUVFLREFsUGNHVnVWSEoxYzNReEhUQWJCZ05WQkFNTUZFOXcKWlc1VWNuVnpkQ0JTYjI5MElFTkJJRWN5TUI0WERURTBNRFV5TmpBd01EQXdNRm9YRFRNNE1ERXhOVEF3TURBdwpNRm93UURFTE1Ba0dBMVVFQmhNQ1JsSXhFakFRQmdOVkJBb01DVTl3Wlc1VWNuVnpkREVkTUJzR0ExVUVBd3dVClQzQmxibFJ5ZFhOMElGSnZiM1FnUTBFZ1J6SXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUsKQW9JQ0FRRE10bGVsTTVRUWdUSlQzMkYrRDNZNXoxekNVM1VkU1hxV09OMmljMnJ4Yjk1ZW9scTVjU0crTnRtaAovTHp1YktoOE5CcHhHdWdhMkY4T1JBYnRwK0R6MG1FTDRES2lsdEU0OE1MYUFSZjg1S3hQNk82SkhuU3JUNzhlCkNiWTJhbGJ6NGU2V2lXWWtCdVROUWpwSzNlQ2FzTVNDUmJQK3lhdGNmRDdKNnhjdkRIMXVycVdQeUt3bENtLzYKMVVXWTBqVUo5Z05EbFA3WnZ5Q1ZlWUNZaXRtSk5idFJHNlEzZmZ5Wk82di92NndOajBPeG1Yc1dFSDRkYjBmRQpGWThFbGdnR1FnVDRoTllkdkpHbVFyNUoxV3FJUDd3dFVkR2VqZUJTekZmZE5UVlkyN1NQSklqa2k5L2NhMVRTCmdTdXl6cEpMSEI5RytoM1lrc3QyWjdVSm1RbmxyQmNVVlhER1BLQldDZ096M0dJWjM4aTFNSC8xUENaMUViM1gKRzdPSG5nZXZaWEhsb004YXB3a1FIWk9KWmx2b1BHSXl0YlU2YnVtRkFZdWVRNHhuY3loWlcrdmozQ3pNcFNaeQpZaEswNXB5RFJQWlJwT0xBZWlSWHlnNmxQenExTzR2bGR1NXc1cExlRmx3b1c1Y1pKNUwrZXBKVXpwTTVDaGFICnZHT3o5YkdUWE9CdXQ5RHErV0l5aUVUN3Z5Y290akNWWFJJb3VaVytqMU1ZNWFJWUZ1SldwTElzRVBVZE42YjQKdC9iUVdWeUo5OExWdFpSMDBkWCtHN2J3NXRZZWU5STh5NmpqOVJqeklSOXU3MDFvQm5zdFhXNURpYWJBK2FDLwpnaDdQVTMrMDZ5emJYZlpxZlVBa0JYS0pPQUdUeTNIQ09WMEdFZlp2ZVBnM0RUbUVKd0lEQVFBQm8yTXdZVEFPCkJnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVYWpuNlFpTDMKNW9rQVRWNTlNNFBMdUc1M2hxOHdId1lEVlIwakJCZ3dGb0FVYWpuNlFpTDM1b2tBVFY1OU00UEx1RzUzaHE4dwpEUVlKS29aSWh2Y05BUUVOQlFBRGdnSUJBSmpMcTBBODVUTUNsMzh0aDZhUDFGNUtyN2dlNTd0eCs0QmtKYW16CkdqNW9YU2NtcDdvcTRmQlhnd3BrVHg0aWRCdnBrRi93ck0vL1QyaDZPS1FRYkEyeHg2UjNnQmkyb2loRWRxYzAKblhHRUw4cFowa2VJbVVFaXlUQ1lZVzQ5cUtnRmJkRWZ3RkZFVm44bk5RTGRYcGdLUXVzd3Y0MmhtMUdxTytxVApSbVRGQUhuZUlXdjJWNkNHMXdaeTdIQkdTNHR6M2FBaGRUN2NIY0NQMDA5ekhJWFovbjlpeUpWdnR0TjdqTHBUCndtK2JSRXg1MEIxd3M5ZWZBdlN5QjdESDVmaXRJdzZtVnNrcEVuZEkyUzlHL1R2dy9IUndrcVdPT0FnZlpEQzIKdDB2N05xd1FqcUJTTTJPZEF6Vld4V205eGlOYUo1VDJwQkw0TFRNOG9WYWxYOVlaNmUxOENMMTN6U2RrekpUYQpUa1pRaCtENXdWT0FIcnV0KzBkU2l4djlvdm5lRGlLM1BUTlpiTlRlOVpVR01nMVJHVUZjUGs4Rzk3a3JnQ2YyCm82cDZmQWJoUThNVE9XSWFOcjNnS0M2VUF1UXBMbUJWcmtBOXNIU1NYdkFnWkpZL1gwVmRpTFdLMmdLZ1cwVlUKM2pnOUNjQ29TbVZHRnZ5cXYxUk9UVnUrT0VPM0tNcUxNNm9hSmJvbFhDa3ZXMHB1ak9vdG5DcjJCWGJnZDVlQQppTjFuRTI4ZGFDU0xUN2QwZ2VYMFlKOTZWZGMrTjlvV2F6NTNySzRZY0pVSWVTa0RpdjdCTzdNL0dnK2tPMTRmCldLR1Z5YXN2YzByUUxXNmFXUTlWR0hndFBGR21sNHZtdTdKd3Frd1Izdjk4S3pmVWV0RjNOSS9uK1VMM1BJRU0KUzFJSwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049T3BlblRydXN0IFJvb3QgQ0EgRzMgTz1PcGVuVHJ1c3QKIyBTdWJqZWN0OiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMyBPPU9wZW5UcnVzdAojIExhYmVsOiAiT3BlblRydXN0IFJvb3QgQ0EgRzMiCiMgU2VyaWFsOiAxNDkyMTA0OTA4MjcxNDg1NjUzMDcxMjE5OTQxODY0MTcxMTcwNDU1NjE1CiMgTUQ1IEZpbmdlcnByaW50OiAyMTozNzpiNDoxNzoxNjo5Mjo3Yjo2Nzo0Njo3MDphOTo5NjpkNzphODoxMzoyNAojIFNIQTEgRmluZ2VycHJpbnQ6IDZlOjI2OjY0OmYzOjU2OmJmOjM0OjU1OmJmOmQxOjkzOjNmOjdjOjAxOmRlOmQ4OjEzOmRhOjhhOmE2CiMgU0hBMjU2IEZpbmdlcnByaW50OiBiNzpjMzo2MjozMTo3MDo2ZTo4MTowNzo4YzozNjo3YzpiODo5NjoxOTo4ZjoxZTozMjowODpkZDo5Mjo2OTo0OTpkZDo4Zjo1NzowOTphNDoxMDpmNzo1Yjo2Mjo5MgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0lUQ0NBYWFnQXdJQkFnSVNFU0RtK0V6OEpMQytCVUNzMm9NYk5HQS9NQW9HQ0NxR1NNNDlCQU1ETUVBeApDekFKQmdOVkJBWVRBa1pTTVJJd0VBWURWUVFLREFsUGNHVnVWSEoxYzNReEhUQWJCZ05WQkFNTUZFOXdaVzVVCmNuVnpkQ0JTYjI5MElFTkJJRWN6TUI0WERURTBNRFV5TmpBd01EQXdNRm9YRFRNNE1ERXhOVEF3TURBd01Gb3cKUURFTE1Ba0dBMVVFQmhNQ1JsSXhFakFRQmdOVkJBb01DVTl3Wlc1VWNuVnpkREVkTUJzR0ExVUVBd3dVVDNCbApibFJ5ZFhOMElGSnZiM1FnUTBFZ1J6TXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFSSzdsaXVUY3BtCjNnWTZveEg4NEJqd2JoeTZMVEFNaWRuVzdwdHpnNmtqRll3dldZcGEzUlRxblZrclE3Y0c3REsydXU1QnRhMWQKb1lYTTZoMFVacU5uZmtiaWxQUG50bGFoRlZtaFR6ZVh1U0lldlJIcjlMSWZYc01VbXVYWmw1bWpZekJoTUE0RwpBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSSGQ4TVVpMkk1CkRNbHY0VkJOMEJCWTNKV0liVEFmQmdOVkhTTUVHREFXZ0JSSGQ4TVVpMkk1RE1sdjRWQk4wQkJZM0pXSWJUQUsKQmdncWhrak9QUVFEQXdOcEFEQm1BakVBajZqY25ib01CQmY2RmVrOUx5a0JsNytCRmpOQWsyejgrZTJBY0crcQpqOXVFd292MU5jb0czR1J2YUJiaGo1RzVBakVBMkV1bHk4TFFDR3pwR1B0YTNVMWZKQXV3QUNFbDc0K25CQ1p4CjRueHA1VjJhK0VFZk96bVRrNTFWNnMyTjhmdkIKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUlTUkcgUm9vdCBYMSBPPUludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwCiMgU3ViamVjdDogQ049SVNSRyBSb290IFgxIE89SW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAKIyBMYWJlbDogIklTUkcgUm9vdCBYMSIKIyBTZXJpYWw6IDE3Mjg4NjkyODY2OTc5MDQ3NjA2NDY3MDI0MzUwNDE2OTA2MTEyMAojIE1ENSBGaW5nZXJwcmludDogMGM6ZDI6Zjk6ZTA6ZGE6MTc6NzM6ZTk6ZWQ6ODY6NGQ6YTU6ZTM6NzA6ZTc6NGUKIyBTSEExIEZpbmdlcnByaW50OiBjYTpiZDoyYTo3OTphMTowNzo2YTozMTpmMjoxZDoyNTozNjozNTpjYjowMzo5ZDo0MzoyOTphNTplOAojIFNIQTI1NiBGaW5nZXJwcmludDogOTY6YmM6ZWM6MDY6MjY6NDk6NzY6ZjM6NzQ6NjA6Nzc6OWE6Y2Y6Mjg6YzU6YTc6Y2Y6ZTg6YTM6YzA6YWE6ZTE6MWE6OGY6ZmM6ZWU6MDU6YzA6YmQ6ZGY6MDg6YzYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZhekNDQTFPZ0F3SUJBZ0lSQUlJUXo3RFNRT05aUkdQZ3UyT0Npd0F3RFFZSktvWklodmNOQVFFTEJRQXcKVHpFTE1Ba0dBMVVFQmhNQ1ZWTXhLVEFuQmdOVkJBb1RJRWx1ZEdWeWJtVjBJRk5sWTNWeWFYUjVJRkpsYzJWaApjbU5vSUVkeWIzVndNUlV3RXdZRFZRUURFd3hKVTFKSElGSnZiM1FnV0RFd0hoY05NVFV3TmpBME1URXdORE00CldoY05NelV3TmpBME1URXdORE00V2pCUE1Rc3dDUVlEVlFRR0V3SlZVekVwTUNjR0ExVUVDaE1nU1c1MFpYSnUKWlhRZ1UyVmpkWEpwZEhrZ1VtVnpaV0Z5WTJnZ1IzSnZkWEF4RlRBVEJnTlZCQU1UREVsVFVrY2dVbTl2ZENCWQpNVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLM29KSFAwRkRmem01NHJWeWdjCmg3N2N0OTg0a0l4dVBPWlhvSGozZGNLaS92VnFidllBVHlqYjNtaUdiRVNUdHJGai9SUVNhNzhmMHVveG15RisKMFRNOHVrajEzWG5mczdqL0V2RWhta3ZCaW9aeGFVcG1abXlQZmp4d3Y2MHBJZ2J6NU1EbWdLN2lTNCszbVg2VQpBNS9UUjVkOG1VZ2pVK2c0cms4S2I0TXUwVWxYaklCMHR0b3YwRGlOZXdOd0lSdDE4akE4K28rdTNkcGpxK3NXClQ4S09FVXQrend2by83VjNMdlN5ZTByZ1RCSWxESENOQXltZzRWTWs3QlBaN2htL0VMTktqRCtKbzJGUjNxeUgKQjVUMFkzSHNMdUp2VzVpQjRZbGNOSGxzZHU4N2tHSjU1dHVrbWk4bXhkQVE0UTdlMlJDT0Z2dTM5NmozeCtVQwpCNWlQTmdpVjUrSTNsZzAyZFo3N0RuS3hIWnU4QS9sSkJkaUIzUVcwS3RaQjZhd0JkcFVLRDlqZjFiMFNIelV2CktCZHMwcGpCcUFsa2QyNUhON3JPckZsZWFKMS9jdGFKeFFaQktUNVpQdDBtOVNUSkVhZGFvMHhBSDBhaG1iV24KT2xGdWhqdWVmWEtuRWdWNFdlMCtVWGdWQ3dPUGpkQXZCYkkrZTBvY1MzTUZFdnpHNnVCUUUzeERrM1N6eW5UbgpqaDhCQ05BdzFGdHhOclFIdXNFd01GeEl0NEk3bUtaOVlJcWlveW1DekxxOWd3UWJvb01EUWFIV0JmRWJ3cmJ3CnFIeUdPMGFvU0NxSTNIYWFkcjhmYXFVOUdZL3JPUE5rM3NnckRRb28vL2ZiNGhWQzFDTFFKMTNoZWY0WTUzQ0kKclU3bTJZczZ4dDBuVVc3L3ZHVDFNME5QQWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSNXRGbm1lN2JsNUFGemdBaUl5QnBZOXVtYmJqQU5CZ2txCmhraUc5dzBCQVFzRkFBT0NBZ0VBVlI5WXFieXlxRkRRRExIWUdta2dKeWtJckdGMVhJcHUrSUxsYVMvVjlsWkwKdWJoekVGblRJWmQrNTB4eCs3TFNZSzA1cUF2cUZ5RldoZkZRRGxucnp1Qlo2YnJKRmUrR25ZK0VnUGJrNlpHUQozQmViWWh0RjhHYVYwbnh2d3VvNzd4L1B5OWF1Si9HcHNNaXUvWDErbXZvaUJPdi8yWC9xa1NzaXNSY09qL0tLCk5GdFkyUHdCeVZTNXVDYk1pb2d6aVV3dGhEeUMzKzZXVndXNkxMdjN4TGZIVGp1Q3ZqSElJbk56a3RIQ2dLUTUKT1JBekk0Sk1QSitHc2xXWUhiNHBob3dpbTU3aWF6dFhPb0p3VGR3Sng0bkxDZ2ROYk9oZGpzbnZ6cXZIdTdVcgpUa1hXU3RBbXpPVnl5Z2hxcFpYakZhSDNwTzNKTEYrbCsvK3NLQUl1dnRkN3UrTnhlNUFXMHdkZVJsTjhOd2RDCmpOUEVscHpWbWJVcTRKVWFnRWl1VERrSHpzeEhwRktWSzdxNCs2M1NNMU45NVIxTmJkV2hzY2RDYitaQUp6VmMKb3lpM0I0M25qVE9RNXlPZisxQ2NlV3hHMWJRVnM1WnVmcHNNbGpxNFVpMC8xbHZoK3dqQ2hQNGtxS09KMnF4cQo0Umdxc2FoRFlWdlRIOXc3alhieUxlaU5kZDhYTTJ3OVUvdDd5MEZmLzl5aTBHRTQ0WmE0ckYyTE45ZDExVFBBCm1SR3VuVUhCY25XRXZnSkJRbDluSkVpVTBac252Z2MvdWJoUGdYUlI0WHEzN1owajRyN2cxU2dFRXp3eEE1N2QKZW15UHhnY1l4bi9lUjQ0L0tKNEVCcytsVkRSM3ZleUptK2tYUTk5YjIxLytqaDVYb3MxQW5YNWlJdHJlR0NjPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1GTk1ULVJDTSBPVT1BQyBSQUlaIEZOTVQtUkNNCiMgU3ViamVjdDogTz1GTk1ULVJDTSBPVT1BQyBSQUlaIEZOTVQtUkNNCiMgTGFiZWw6ICJBQyBSQUlaIEZOTVQtUkNNIgojIFNlcmlhbDogNDg1ODc2MzA4MjA2NDQ4ODA0NzAxNTU0NjgyNzYwNTU0NzU5CiMgTUQ1IEZpbmdlcnByaW50OiBlMjowOTowNDpiNDpkMzpiZDpkMTphMDoxNDpmZDoxYTpkMjo0NzpjNDo1NzoxZAojIFNIQTEgRmluZ2VycHJpbnQ6IGVjOjUwOjM1OjA3OmIyOjE1OmM0Ojk1OjYyOjE5OmUyOmE4OjlhOjViOjQyOjk5OjJjOjRjOjJjOjIwCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlYjpjNTo1NzowYzoyOTowMTo4Yzo0ZDo2NzpiMTphYToxMjo3YjphZjoxMjpmNzowMzpiNDo2MToxZTpiYzoxNzpiNzpkYTpiNTo1NzozODo5NDoxNzo5Yjo5MzpmYQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmd6Q0NBMnVnQXdJQkFnSVBYWk9OTUdjMnlBWWRHc2RVaEdrSE1BMEdDU3FHU0liM0RRRUJDd1VBTURzeApDekFKQmdOVkJBWVRBa1ZUTVJFd0R3WURWUVFLREFoR1RrMVVMVkpEVFRFWk1CY0dBMVVFQ3d3UVFVTWdVa0ZKCldpQkdUazFVTFZKRFRUQWVGdzB3T0RFd01qa3hOVFU1TlRaYUZ3MHpNREF4TURFd01EQXdNREJhTURzeEN6QUoKQmdOVkJBWVRBa1ZUTVJFd0R3WURWUVFLREFoR1RrMVVMVkpEVFRFWk1CY0dBMVVFQ3d3UVFVTWdVa0ZKV2lCRwpUazFVTFZKRFRUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUxweGdIcE1obTUvCnlCTnR3TVo5SEFDWGp5d01JN3NRbWtDcEdyZUhpUGliVm1yNzVudU9pNUtPcHlWZFdSSGJOaTYzVVJjZnFRZ2YKQkJja1dLbzNTaGpmNVRuVVYvM1h3U3lSQVpIaUl0UUR3Rmo4ZDBmc2p6NTBRN3FzTkkxTk9IWm5qckRJYnpBegpXSEZjdFBWcmJ0UUJVTGdUZm14S28wblJJQm51dk1BcEdHV24zdjd2M1FxUUllY2FaNUpDRUpoZlR6QzhQaHhGCnRCRFhhRUFVd0VENjUzY1hldVlMajJWYlBObWFVdHUxdlo1R3p6M3JrUVVDd0pheWRreE5FSlk3a3ZxY2Z3K1oKMzc0ak5VVWVBbHordGFpYm1TWGFYdk1pd3puMTVDb3UwOFlmeEd5cXhSeHFBUVZLTDlMRndhZzBKbDFtcGRJQwpJZmtZdHdiMVRwbHZxS3RNVWVqUFVCakZkOGc1Q1N4SmtqS1pxTHNYRjNtd1dzWG1vOFJaWlVjMWcxNnA2RFVMCm1idmt6U0RHbTBvR09iVm8vQ0s2N2xXTUswN3E4N0hqL0xhWm10VkMrbkZOQ00rSEhtcHhmZm5UdE9tbGNZRjcKd2s1SGxxWDJkb1dqS0kvcGdHNkJVNlZ0WDdoSStjTDVOcVl1U2YrNGxzS01CN09iaUZqODZ4c2MzaTF3NHBlUwpNS0dKNDd4VnFDZldTKzJRcll2Nll5VlpMYWcxM2NxWE03emx6Y2VkMGV6dlhnNUtrQVltWTYyNTJUVXRCN3AyClpTeXNWNDk5OUFlVTE0RUNsbDJqQjBuVmV0QlgrUnZuVTBaMXFyQjVRc3RvY1FqcFlMMDVhYzcwcjhOV1FNZXQKVXFJSjVHK0dSNG9mNnlnblhZTWdyd1RKYkZhYWkwYjFBZ01CQUFHamdZTXdnWUF3RHdZRFZSMFRBUUgvQkFVdwpBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRlBkOXhmM0U2Sm9iZDJTbjlSMmd6TCtICllKcHRNRDRHQTFVZElBUTNNRFV3TXdZRVZSMGdBREFyTUNrR0NDc0dBUVVGQndJQkZoMW9kSFJ3T2k4dmQzZDMKTG1ObGNuUXVabTV0ZEM1bGN5OWtjR056THpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQUI1QkszL01qVHZERApuRkZsbTV3aW9vb01oZk56S1d0Ti9nSGlxUXhqQWI4RVo2V2RtRi85QVJQNjdKcGk2WWIrdG1MU2JreVUrOEIxClJYeGxEUGl5Tjgrc0Q4K05iL2taOTQvc0h2SndudkRLdU8rMy8zWTNkbHYyYm9qenIySXlJcE1OT21xT0ZHWU0KTFZOMFYyVWUxYkxkSTRFN3BXWWpKMmNKaitGM3FrUE5aVkVJN1ZGWS91WTUrY3RIaEtRVjhYYTdwTzZrTzhSZgo3N0l6bGhFWXQ4bGx2aGpobzZUYytoajUwN3dUbXpsNk5MclRRZnY2TW9vcXR5dUdDMm1ET0w3TmlpNExjSzJOCkpwTHVIdlVCS3dyWjFwZWJidUNvR1J3NklZc01Ia0N0QStmZFpuNzF1U0FOQStpVytZSkYxRG5nb0FCZDE1am0KZlo1bmM4T2FLdmVyaTZFNkZPODB2RklPaVppYUJFQ0VIWDVGYVpOWHp1dk8rRkI4VHh4dUJFT2IrZFk3SXhqcAo2bzdSVFVhTjhUdmthc3E2K3lPM20vcVpBU2xhV0ZvdDQvblViUTRtcmNGdU5Md3krQXdGK21XajJ6czNneUxwCjF0eHlNLzFkOGlDOWRqd2oyaWozK1J2cldXVFYzRjl5ZmlEOHpZbTFrR2ROWW5vL1RxMGR3em4rZXZRb0Z0OUIKOWtpQUJkY1BVWG1zRUt2VTdBTm01bXF3dWpHU1FrQnF2anJUY3VGcU4xVzhyQjJWdDJsaDhrT1JkT2FnMHdvawpScUVJcjliYVJSbVcxRk1kVzRSNThNRDNSKytMajhVR3JwMU1ZcDMvUmdUNDA4bTJFQ1ZBZGY0V3FzbEtZSVl2CnV1OHdkK1JVNHJpRW1WaUFxaE9MVVRwUFNQYUx0ck09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BbWF6b24gUm9vdCBDQSAxIE89QW1hem9uCiMgU3ViamVjdDogQ049QW1hem9uIFJvb3QgQ0EgMSBPPUFtYXpvbgojIExhYmVsOiAiQW1hem9uIFJvb3QgQ0EgMSIKIyBTZXJpYWw6IDE0MzI2Njk3ODkxNjY1NTg1Njg3ODAzNDcxMjMxNzIzMDA1NDUzODM2OTk5NAojIE1ENSBGaW5nZXJwcmludDogNDM6YzY6YmY6YWU6ZWM6ZmU6YWQ6MmY6MTg6YzY6ODg6Njg6MzA6ZmM6Yzg6ZTYKIyBTSEExIEZpbmdlcnByaW50OiA4ZDphNzpmOTo2NTplYzo1ZTpmYzozNzo5MTowZjoxYzo2ZTo1OTpmZDpjMTpjYzo2YTo2ZTpkZToxNgojIFNIQTI1NiBGaW5nZXJwcmludDogOGU6Y2Q6ZTY6ODg6NGY6M2Q6ODc6YjE6MTI6NWI6YTM6MWE6YzM6ZmM6YjE6M2Q6NzA6MTY6ZGU6N2Y6NTc6Y2M6OTA6NGY6ZTE6Y2I6OTc6YzY6YWU6OTg6MTk6NmUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURRVENDQWltZ0F3SUJBZ0lUQm15Zno1bS9qQW81NHZCNGlrUG1salpieWpBTkJna3Foa2lHOXcwQkFRc0YKQURBNU1Rc3dDUVlEVlFRR0V3SlZVekVQTUEwR0ExVUVDaE1HUVcxaGVtOXVNUmt3RndZRFZRUURFeEJCYldGNgpiMjRnVW05dmRDQkRRU0F4TUI0WERURTFNRFV5TmpBd01EQXdNRm9YRFRNNE1ERXhOekF3TURBd01Gb3dPVEVMCk1Ba0dBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBb1RCa0Z0WVhwdmJqRVpNQmNHQTFVRUF4TVFRVzFoZW05dUlGSnYKYjNRZ1EwRWdNVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMSjRnSEhLZU5YagpjYTlIZ0ZCMGZXN1kxNGgyOUpsbzkxZ2hZUGwwaEFFdnJBSXRodE9nUTNwT3NxVFFOcm9Cdm8zYlNNZ0hGelpNCjlPNklJOGMrNnpmMXRSbjRTV2l3M3RlNWRqZ2RZWjZrL29JMnBlVktWdVJGNGZuOXRCYjZkTnFjbXpVNUwvcXcKSUZBR2JIclFnTEttK2Evc1J4bVBVRGdIM0tLSE9WajR1dFdwK1Vobk1KYnVsSGhlYjRtalVjQXdobWFoUldhNgpWT3VqdzVINVNOei8wZWd3TFgwdGRIQTExNGdrOTU3RVdXNjdjNGNYOGpKR0tMaEQrcmNkcXNxMDhwOGtEaTFMCjkzRmNYbW4vNnBVQ3l6aUtybEE0Yjl2N0xXSWJ4Y2NlVk9GMzRHZklENXlISTlZL1FDQi9JSURFZ0V3K095UW0KamdTdWJKcklxZzBDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQwpBWVl3SFFZRFZSME9CQllFRklRWXpJVTA3THdNbEpRdUNGbWN4N0lRVGdvSU1BMEdDU3FHU0liM0RRRUJDd1VBCkE0SUJBUUNZOGpkYVFaQ2hHc1YyVVNnZ05pTU9ydVlvdTZyNGxLNUlwREIvRy93a2pVdTB5S0dYOXJieGVuREkKVTVQTUNDamptQ1hQSTZUNTNpSFRmSVVKclU2YWRUckNDMnFKZUhaRVJ4aGxiSTFCamp0L21zdjB0YWRRMXdVcwpOK2dEUzYzcFlhQUNidlh5OE1XeTdWdTMzUHFVWEhlZUU2Vi9VcTJWOHZpVE85NkxYRnZLV2xKYllLOFU5MHZ2Cm8vdWZRSlZ0TVZUOFF0UEhSaDhqcmRrUFNIQ2EyWFY0Y2RGeVF6UjFibGRad2dKY0ptQXB6eU1aRm82SVE2WFUKNU1zSSt5TVJRK2hES1hKaW9hbGRYZ2pVa0s2NDJNNFV3dEJWOG9iMnhKTkRkMlpod0xub1FkZVhlR0FEYmtweQpycVhSZmJvUW5vWnNHNHE1V1RQNDY4U1F2dkc1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BbWF6b24gUm9vdCBDQSAyIE89QW1hem9uCiMgU3ViamVjdDogQ049QW1hem9uIFJvb3QgQ0EgMiBPPUFtYXpvbgojIExhYmVsOiAiQW1hem9uIFJvb3QgQ0EgMiIKIyBTZXJpYWw6IDE0MzI2Njk4Mjg4NTk2MzU1MTgxODM0OTE2MDY1ODkyNTAwNjk3MDY1MzIzOQojIE1ENSBGaW5nZXJwcmludDogYzg6ZTU6OGQ6Y2U6YTg6NDI6ZTI6N2E6YzA6MmE6NWM6N2M6OWU6MjY6YmY6NjYKIyBTSEExIEZpbmdlcnByaW50OiA1YTo4YzplZjo0NTpkNzphNjo5ODo1OTo3Njo3YTo4Yzo4Yjo0NDo5NjpiNTo3ODpjZjo0Nzo0YjoxYQojIFNIQTI1NiBGaW5nZXJwcmludDogMWI6YTU6YjI6YWE6OGM6NjU6NDA6MWE6ODI6OTY6MDE6MTg6Zjg6MGI6ZWM6NGY6NjI6MzA6NGQ6ODM6Y2U6YzQ6NzE6M2E6MTk6YzM6OWM6MDE6MWU6YTQ6NmQ6YjQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZRVENDQXltZ0F3SUJBZ0lUQm15ZjBwWTFocDhLRCtXR2VQaGJKcnVLTnpBTkJna3Foa2lHOXcwQkFRd0YKQURBNU1Rc3dDUVlEVlFRR0V3SlZVekVQTUEwR0ExVUVDaE1HUVcxaGVtOXVNUmt3RndZRFZRUURFeEJCYldGNgpiMjRnVW05dmRDQkRRU0F5TUI0WERURTFNRFV5TmpBd01EQXdNRm9YRFRRd01EVXlOakF3TURBd01Gb3dPVEVMCk1Ba0dBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBb1RCa0Z0WVhwdmJqRVpNQmNHQTFVRUF4TVFRVzFoZW05dUlGSnYKYjNRZ1EwRWdNakNDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLMldueTJjU2t4SwpnWGxSbWV5S3kydGdVUk84VFcwRy9MQUlqZDBaRUdySEpndzEyTUJ2SUlUcGxMR2JoUVBEVzl0SzZNajRrSGJaClcwL2pUT2dHTmszTW1xdzlESkFya3RRR0dXQ3NOMFI1aFlHQ3JWbzM0QTNNbmFaTVVuYnFRNTIzQk5GUTlsWGcKMWRLbVNZWHBOK25LZnE1Y2xVMUltait1SUZwdGlKWFpOTGhTR2tPUXNMOXNCYm0yZUxmcTBPUTZQQkpUWXY5Swo4bnUrTlFXcEVqVGo4MlIwWWl3OUFFbGFLUDR5Ukx1SDNXVW5BbkU3MmtyM0g5ck45eUZWa0U4UDdLNkM0WjlyCjJVWFR1L0JmaCswOExEbUcyai9lN0hKVjYzbWpyZHZkZkxDNkhNNzgzazgxZHM4UCtIZ2ZhalpSUmlkaFcrbWUKei9DaVZYMThKWXB2TDdURno0UXVLLzBOVVJCcysxOGJ2QnQreGE0N21BRXhrdjhMVi9TYXNybFg2YXZ2RFhiUgo4Tzcwem9hbjRHN3B0R21oMzJuMk04WnBMcGNUbnFXSHNGY1FnVGZKVTdPN2YvYVMwWnpRR1BTU2J0cURUNlpqCm1VeWwrMTd2SVdSNklGOXNaSVVWeXpmcFlnd0xLaGJjQVM0eTJqNUw5WjQ2OWhkQWxPK2VrUWlHK3I1anFGb3oKN010MFE1WDViR2xTTnNjcGIveFZBMXdmKzUrOVIrdm5TVWVWQzA2SklnbEo0UFZoSHZHL0xvcHlib0JaLzFjNgorWFV5bzA1ZjdPMG9ZdGxOYy9MTWdSZGc3YzNyM051bnlzVitBcjN5VkFoVS9iUXRDU3dYVkVxWTBWVGhVV2NJCjB1MXVmbTgvMGkyQldTbG15NUE1bFJFZWRDZiszZXV2QWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUIKQWY4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUIwR0ExVWREZ1FXQkJTd0RQQk1NUFFGV0FKSS9UUGxVcTlMaE9ObQpVakFOQmdrcWhraUc5dzBCQVF3RkFBT0NBZ0VBcXFpQWp3NTRvK0NpMU0zbTlaaDZPK29BQTdDWERwTzhXcWoyCkxJeHloNm14L0g5ei9XTnhlS1dIV2M4dzRRMFFzaE5hYllMMWF1YUFuNkFGQzJqa1IydkhhdCsyL1hjeWN1VVkKK2duMG9KTXNYZEtNZFlWMlpaQU1BM20zTVNOanJYaURDWVpvaE1yLytjOG1tcEo1NTgxTHhlZGhweGZMODZrUwprNU5ycCtndlU1TEVZRml3ekFKUkdGdUZqV0paWTdhdHRONmEreWIzQUNmQVhWVTNkSm5KVUgvaldTNUU0eXdsCjd1eE1NbmUwbnhycFMxMGd4ZHI5SEljV3hrUG8xTHNtbWtWd1hxa0xOMVBpUm5zbi9lQkc4b20zekVLMnl5Z20KYnRtbHlUcklRUk5nOTFDTUZhNnliUm9WR2xkNDVwSXEyV1dRZ2o5c0FxK3VFam9ubGpZRTF4MmlnR09wbS9IbAp1clI4RkxCT3liRWZkRjg0OWxIcW0vb3NvaEhVcVMwbkdrV3hyN0pPY1EzQVdFYldhUWJMVTh1ei9tdEJ6VUYrCmZVd1BmSEo1ZWxuTlhrb09ySnVwbUhONWZMVDB6TG00Qnd5eWRGeTR4MitJb1pDbjlLcjV2MmM2OUJvVlloNjMKbjc0OXNTbXZaNkVTOGxnUUdWTURNQnU0R29uMm5MMlhBNDZqQ2ZNZGl5SHh0Ti9rSE5HZlpRSUc2bHpXRTdPRQo3NktsWEl4M0thZG93R3V1UU5Lb3RPck44STFMT0p3Wm1oc29WTGlKa08vS2RZRStIdkprSk1jWXIwNy9SNTRICjlqVmxwTk1LVnYvMUYyUnM3NmdpSlVtVHR0OEFGOXBZZmwzdXhSdXcwZEZmSVJESCtmTzZBZ29uQjhYeDFzZlQKNFBzSllHdz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFtYXpvbiBSb290IENBIDMgTz1BbWF6b24KIyBTdWJqZWN0OiBDTj1BbWF6b24gUm9vdCBDQSAzIE89QW1hem9uCiMgTGFiZWw6ICJBbWF6b24gUm9vdCBDQSAzIgojIFNlcmlhbDogMTQzMjY2OTg2Njk5MDkwNzY2Mjk0NzAwNjM1MzgxMjMwOTM0Nzg4NjY1OTMwCiMgTUQ1IEZpbmdlcnByaW50OiBhMDpkNDplZjowYjpmNzpiNTpkODo0OTo5NToyYTplYzpmNTpjNDpmYzo4MTo4NwojIFNIQTEgRmluZ2VycHJpbnQ6IDBkOjQ0OmRkOjhjOjNjOjhjOjFhOjFhOjU4Ojc1OjY0OjgxOmU5OjBmOjJlOjJhOmZmOmIzOmQyOjZlCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxODpjZTo2YzpmZTo3YjpmMTo0ZTo2MDpiMjplMzo0NzpiODpkZjplODo2ODpjYjozMTpkMDoyZTpiYjozYTpkYToyNzoxNTo2OTpmNTowMzo0MzpiNDo2ZDpiMzphNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQnRqQ0NBVnVnQXdJQkFnSVRCbXlmMVhTWE5tWS9Pd3VhMmVpZWRnUHlTakFLQmdncWhrak9QUVFEQWpBNQpNUXN3Q1FZRFZRUUdFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJrd0Z3WURWUVFERXhCQmJXRjZiMjRnClVtOXZkQ0JEUVNBek1CNFhEVEUxTURVeU5qQXdNREF3TUZvWERUUXdNRFV5TmpBd01EQXdNRm93T1RFTE1Ba0cKQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHZiakVaTUJjR0ExVUVBeE1RUVcxaGVtOXVJRkp2YjNRZwpRMEVnTXpCWk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQkNtWHA4WkJmOEFObStnQkcxYkc4bEtsCnVpMnlFdWpTTHRmNnljWFlxbTBmYzRFN081aHJPWHd6cGNWT2hvNkFGMmhpUlZkOVJGZ2RzemZsWndqclp0NmoKUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUIwR0ExVWREZ1FXQkJTcgp0dHZYQnA0M3JEQ0dCNUZ3eDV6RUdiRjR3REFLQmdncWhrak9QUVFEQWdOSkFEQkdBaUVBNElXU294ZTNqZmtyCkJxV1RyQnFZYUdGeSt1R2gwUHNjZUdDbVE1bkZ1TVFDSVFDY0F1L3hsSnl6bHZucnhpcjR0aXorT3BBVUZ0ZU0KWXlSSUhOOHdmZFZvT3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QW1hem9uIFJvb3QgQ0EgNCBPPUFtYXpvbgojIFN1YmplY3Q6IENOPUFtYXpvbiBSb290IENBIDQgTz1BbWF6b24KIyBMYWJlbDogIkFtYXpvbiBSb290IENBIDQiCiMgU2VyaWFsOiAxNDMyNjY5ODk3NTgwODA3NjM5NzQxMDUyMDA2MzA3NjM4Nzc4NDkyODQ4NzgKIyBNRDUgRmluZ2VycHJpbnQ6IDg5OmJjOjI3OmQ1OmViOjE3OjhkOjA2OjZhOjY5OmQ1OmZkOjg5OjQ3OmI0OmNkCiMgU0hBMSBGaW5nZXJwcmludDogZjY6MTA6ODQ6MDc6ZDY6Zjg6YmI6Njc6OTg6MGM6YzI6ZTI6NDQ6YzI6ZWI6YWU6MWM6ZWY6NjM6YmUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGUzOjVkOjI4OjQxOjllOmQwOjIwOjI1OmNmOmE2OjkwOjM4OmNkOjYyOjM5OjYyOjQ1OjhkOmE1OmM2Ojk1OmZiOmRlOmEzOmMyOjJiOjBiOmZiOjI1Ojg5OjcwOjkyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCOGpDQ0FYaWdBd0lCQWdJVEJteWYxOEc3RUV3cFErVnhlM3NzeUJyQkRqQUtCZ2dxaGtqT1BRUURBekE1Ck1Rc3dDUVlEVlFRR0V3SlZVekVQTUEwR0ExVUVDaE1HUVcxaGVtOXVNUmt3RndZRFZRUURFeEJCYldGNmIyNGcKVW05dmRDQkRRU0EwTUI0WERURTFNRFV5TmpBd01EQXdNRm9YRFRRd01EVXlOakF3TURBd01Gb3dPVEVMTUFrRwpBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBb1RCa0Z0WVhwdmJqRVpNQmNHQTFVRUF4TVFRVzFoZW05dUlGSnZiM1FnClEwRWdOREIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJOS3JpamRQbzFNTi9zR0tlMHVvZTBaTFk3QmkKOWkwYjJ3aHhJZElBNkdPOW1pZjc4RGx1WGVvOXBjbUJxcU5iSUpoRlhSYmIvZWdRYmVPYzRPTzlYNFJpODNCawpNNkRMSkM5d3VvaWhLcUIxK0lHdVlnYkVnZHM1Ymltd0h2b3VYS05DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QU9CZ05WSFE4QkFmOEVCQU1DQVlZd0hRWURWUjBPQkJZRUZOUHN4enBsYnN6aDJuYWFWdnVjODRadFYrV0IKTUFvR0NDcUdTTTQ5QkFNREEyZ0FNR1VDTURxTElmRzlmaEd0ME85WWxpL1c2NTEra0kwcnoyWlZ3eXpqS0tsdwpDa2NPOERkWkV2OHRtWlFvVGlwUE5VMHpXZ0l4QU9wMUFFNDd4RHFVRXBISldFYWRJUk55cDRpY2l1Uk1TdHVXCjFLeUxhMnRKRWxNenJkZmt2aVQ4dFFwMjFLVzhFQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1MdXhUcnVzdCBHbG9iYWwgUm9vdCAyIE89THV4VHJ1c3QgUy5BLgojIFN1YmplY3Q6IENOPUx1eFRydXN0IEdsb2JhbCBSb290IDIgTz1MdXhUcnVzdCBTLkEuCiMgTGFiZWw6ICJMdXhUcnVzdCBHbG9iYWwgUm9vdCAyIgojIFNlcmlhbDogNTk5MTQzMzgyMjU3MzQxNDcxMjM5NDEwNTgzNzY3ODgxMTAzMDU4MjI0ODk1MjEKIyBNRDUgRmluZ2VycHJpbnQ6IGIyOmUxOjA5OjAwOjYxOmFmOmY3OmYxOjkxOjZmOmM0OmFkOjhkOjVlOjNiOjdjCiMgU0hBMSBGaW5nZXJwcmludDogMWU6MGU6NTY6MTk6MGE6ZDE6OGI6MjU6OTg6YjI6MDQ6NDQ6ZmY6NjY6OGE6MDQ6MTc6OTk6NWY6M2YKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU0OjQ1OjVmOjcxOjI5OmMyOjBiOjE0OjQ3OmM0OjE4OmY5Ojk3OjE2OjhmOjI0OmM1OjhmOmM1OjAyOjNiOmY1OmRhOjViOmUyOmViOjZlOjFkOmQ4OjkwOjJlOmQ1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGd3pDQ0E2dWdBd0lCQWdJVUNuNm0zMHRFbnRwcUpJV2U1cmdWMHhaL3U3RXdEUVlKS29aSWh2Y05BUUVMCkJRQXdSakVMTUFrR0ExVUVCaE1DVEZVeEZqQVVCZ05WQkFvTURVeDFlRlJ5ZFhOMElGTXVRUzR4SHpBZEJnTlYKQkFNTUZreDFlRlJ5ZFhOMElFZHNiMkpoYkNCU2IyOTBJREl3SGhjTk1UVXdNekExTVRNeU1UVTNXaGNOTXpVdwpNekExTVRNeU1UVTNXakJHTVFzd0NRWURWUVFHRXdKTVZURVdNQlFHQTFVRUNnd05USFY0VkhKMWMzUWdVeTVCCkxqRWZNQjBHQTFVRUF3d1dUSFY0VkhKMWMzUWdSMnh2WW1Gc0lGSnZiM1FnTWpDQ0FpSXdEUVlKS29aSWh2Y04KQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU5lRmw3OFJtT253WW9OTVBJZjVVMm8zQy9JUFBJZk9iOXdtS2IzRgppYnJKZ3ozMzdzcGJ4bTFKYzdUSlJxTWJOQk0vd1lsRlYvVFpzZnMyWlV2N0NPSkljUkhJYmp1ZW5kK0paVGVtCmhmWTdSQmkyeGpjd1lrU1NsMmw5UWpBazVBME1pV3RqM3NYaDMwNnBGR3hUNEdITzloY3ZIVHk5NWlKTUhaUDEKRU1TaGR1eHEzc1ZzMzVhMFZrQkN3R0tTTUtFdEZaU2cwaUFHQ1c1cWJlWHJ0NzdVOFBFVmZJdm1Ucm9UekVzbgpYcGs4RjEyUGdYOHpQVS9UUHh2c1hEL3dQRXgxYnZLbTFaM2FMUWRqQXNaeTZaUzhURW1WVDRoU3lOdm9hWUw0CnpEUmJJdkNHcDRtOVNBcHRab0Z0eU1oayt3SGg5T0hlMlo3ZDIxdlVLcGttRlJzZVRKSXBncDdWa29HU1FYQVoKOTZUbGswdThkMmN4M1J6OU1YQU5GNWtNK1F3NUdTb1h0VEJ4VmRVUHJsamhQUzgwbTgrZjluaUZ3cE42Y2o1bQpqNXdXRVdDUG5vbHZaNzdnUjFvN0RKcG5pODlHeHE0NG8vS252T2JXaFdzekpIQWlTOHNJbTd2SStBSXBIYjRnCkRFYS9hNGVic3lwbVFqVkdiS3E2cmZtWWUrbFFWUlF4djdIYUxlMkFyV2drKzJtcjJIRVRNT1puczRkQS9ZbCsKOGtQUkVkOHZaUzlremw4VXViRy9NYjJIZUZwWlpZaXEvRmt5U0liV1RMa3BTNVhUZHZOM0pXMUNIRGlEVGYyagpYNXQvTGF4NUd3NUNNWmRqcFB1S2FkVWlEVFNRTUM2b3RPQnR0cFNzdkl0TzEzRDh4VGlPWkNYaFRUbVF6c21ICmhGaHhBZ01CQUFHamdhZ3dnYVV3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekJDQmdOVkhTQUVPekE1TURjR0J5dUIKS3dFQkFRb3dMREFxQmdnckJnRUZCUWNDQVJZZWFIUjBjSE02THk5eVpYQnZjMmwwYjNKNUxteDFlSFJ5ZFhOMApMbXgxTUE0R0ExVWREd0VCL3dRRUF3SUJCakFmQmdOVkhTTUVHREFXZ0JUL0dDaDIrVWdGTEtHdThTc2JLN0pUCitFdDhzekFkQmdOVkhRNEVGZ1FVL3hnb2R2bElCU3locnZFckd5dXlVL2hMZkxNd0RRWUpLb1pJaHZjTkFRRUwKQlFBRGdnSUJBR29aRk8xdWVjRXNoOVFOY0g3WDluakpDd1JPeExIT2szRCtzRlRBTXMyWk1HUVh2dy9sNGpQOQpCelpBY2c0YXRtcFoxZ0RsYUNEZExuSU5IMnBrTVNDRWZVbW1XamZyUmNtRjlkVEhGNWtINXB0VjVBem9xYlRPCmpGdTFFVnpQaWc0TjFxeDNnZjR5bkNTZWNzNVU4OUJ2b2xiVzdNTTNMR1ZZdmxjQUd2STErdXQ3TVYzQ3dSSTkKbG9HSWxvbkJXVng2NW45d05PZUQ0ckhoNGJoWTc5U1Y1R0NjOEphWGNvenJoQUl1Wlkra3Q5Si9aOTNJMDU1YwpxcW1rb0NVVUJwdnNUMzR0QzM4ZGRmRXoyTzNPdUhWdFBsdTVtQjB4RFZiWVF3OHdrYklFYTkxV3ZwV0FWV2UrCjJNMkQyUmp1TGcrR0xaS2VjQlBzM2xISlEzZ0NwVTNJK1YvRWtWaEdGbmRhZEtwQXZBZWZNTG14OXhJWDNlUC8KSkVBZGVtclJUeGdLcXBBZDYwQWUzNkVlUkpJUW12S040ZEZMUnA3b1JVS1g2a1daOCt4bTFRTDY4cVpLSktyZQp6cm5LK1QrVGIvbWp1dXFsUHBtdC9mOTdtZlZsN3ZCWktHZlhrSldrRTRTcGhNSG96czUxazJNYXZEenExV1FmCkxTb1NPY2JEV2pMdFI1RVdEcnc0d1ZEZWo4b3FrRFFjN2tHVW5GNFpMdmhGU1psMGtiQUViK01FV3JHcktxdisKeDlDV3R0cmhTbVFHYm1CTnZVSk8vM2phSk1vYnROZVdPV3l1OFE2cXAzMUlpeUJNejJUV3VKZEdzRTdSS2xZNgpvSk85cjRBazRBcCs1OHJWeXVpRlZkdzJLdUdVYUpQSFpuSkVENEFoTW13bHh5T0Fnd3JyCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UVUJJVEFLIEthbXUgU00gU1NMIEtvayBTZXJ0aWZpa2FzaSAtIFN1cnVtIDEgTz1UdXJraXllIEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsgT1U9S2FtdSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkgLSBLYW11IFNNCiMgU3ViamVjdDogQ049VFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxIE89VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLIE9VPUthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTQojIExhYmVsOiAiVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogZGM6MDA6ODE6ZGM6Njk6MmY6M2U6MmY6YjA6M2I6ZjY6M2Q6NWE6OTE6OGU6NDkKIyBTSEExIEZpbmdlcnByaW50OiAzMTo0Mzo2NDo5YjplYzpjZToyNzplYzplZDozYTozZjowYjo4ZjowZDplNDplODo5MTpkZDplZTpjYQojIFNIQTI1NiBGaW5nZXJwcmludDogNDY6ZWQ6YzM6Njg6OTA6NDY6ZDU6M2E6NDU6M2Y6YjM6MTA6NGE6Yjg6MGQ6Y2E6ZWM6NjU6OGI6MjY6NjA6ZWE6MTY6Mjk6ZGQ6N2U6ODY6Nzk6OTA6NjQ6ODc6MTYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVZekNDQTB1Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCMGpFTE1Ba0dBMVVFQmhNQ1ZGSXgKR0RBV0JnTlZCQWNURDBkbFlucGxJQzBnUzI5allXVnNhVEZDTUVBR0ExVUVDaE01VkhWeWEybDVaU0JDYVd4cApiWE5sYkNCMlpTQlVaV3R1YjJ4dmFtbHJJRUZ5WVhOMGFYSnRZU0JMZFhKMWJYVWdMU0JVVlVKSlZFRkxNUzB3Ckt3WURWUVFMRXlSTFlXMTFJRk5sY25ScFptbHJZWE41YjI0Z1RXVnlhMlY2YVNBdElFdGhiWFVnVTAweE5qQTAKQmdOVkJBTVRMVlJWUWtsVVFVc2dTMkZ0ZFNCVFRTQlRVMHdnUzI5cklGTmxjblJwWm1scllYTnBJQzBnVTNWeQpkVzBnTVRBZUZ3MHhNekV4TWpVd09ESTFOVFZhRncwME16RXdNalV3T0RJMU5UVmFNSUhTTVFzd0NRWURWUVFHCkV3SlVVakVZTUJZR0ExVUVCeE1QUjJWaWVtVWdMU0JMYjJOaFpXeHBNVUl3UUFZRFZRUUtFemxVZFhKcmFYbGwKSUVKcGJHbHRjMlZzSUhabElGUmxhMjV2Ykc5cWFXc2dRWEpoYzNScGNtMWhJRXQxY25WdGRTQXRJRlJWUWtsVQpRVXN4TFRBckJnTlZCQXNUSkV0aGJYVWdVMlZ5ZEdsbWFXdGhjM2x2YmlCTlpYSnJaWHBwSUMwZ1MyRnRkU0JUClRURTJNRFFHQTFVRUF4TXRWRlZDU1ZSQlN5QkxZVzExSUZOTklGTlRUQ0JMYjJzZ1UyVnlkR2xtYVd0aGMya2cKTFNCVGRYSjFiU0F4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFyM1V3TTZxNwphOU9aTEJJM2hObU5lNWVBMDI3bi81dFFsVDZRbFZaQzF4bDhKb1NOa3ZvQkhUb1A0bVE0dDR5ODZJajVpeVNyCkxxUDFOK1JBamhnbGVZTjFIenYvYktqRnhsYjR0TzJLUktPcmJFejhIZERjNzJpOXorU3F6dkJWOTZJMDFJTnIKTjN3Y3d2NjFBK3hYenJ5MHRjWHRBQTlUTnlwTjlFOE1nL3VHejh2K2pFNjloL21uaXlGWG5IcmZBMmVKTEoyWApZYWNRdUZXUWZ3NHRKemgwMytmOTJrNFM0MDBWSWdMSTRPRDhENjJLMThsVVVNdzdEOG9XZ0lUUVVWYkRqbFovCmlTSXpMK2FGQ3IybHFCczIzdFBjTEcwN3h4TzlXU01zNXVXazk5Z0w3ZXFRUUVTb2xidVQxZENBTkxaR2VBNGYKQUpORzRlN3ArZXhQRndJREFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVVpUL0hpb2JHUE4wOFZGdzErRHJ0VWd4SApWOGd3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVMCkJRQURnZ0VCQUNvLzRmRXlqcTdobUZ4TFhzOXJIbW9KMGlLcEVzZGVWMzF6Vm1TQWhIcVQ1QW01RU0yZktpZmgKQUhlK1NNZzFxSUdmNUxnc3lYOE9zTkpMTjEzcXVkVUxYalM5OUhNcHcrMG1GWngrQ0ZPS1dJM1FTeWpmd2JQZgpJUFA1NCtNNjM4eWNsTmhPVDhOckY3ZjNjdWl0WmpPMUpWT3I0UGhNcVozOThnMjZycm5acXNacitaTzdycXU0Cmx6d0RHcnBEeHBhNVJYSTRzNmVobGoyUmUzN0FJVk5NaCszeUMxU1ZVWlBWSXFVTml2R1REajVVRHJEWXlVN2MKOGpFeVZ1cGsrZXExblJabVFuTHpmOU94TVVQOHBJNFg4VzBqcTVSbStLMzdEd2h1SmkxL0Z3Y0pzb3o3VU1DZgpsbzNQdHYwQW5Wb1VtcjhDUlBYQndwOGlYcUlQb2VNPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R0RDQSBUcnVzdEFVVEggUjUgUk9PVCBPPUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuCiMgU3ViamVjdDogQ049R0RDQSBUcnVzdEFVVEggUjUgUk9PVCBPPUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuCiMgTGFiZWw6ICJHRENBIFRydXN0QVVUSCBSNSBST09UIgojIFNlcmlhbDogOTAwOTg5OTY1MDc0MDEyMDE4NgojIE1ENSBGaW5nZXJwcmludDogNjM6Y2M6ZDk6M2Q6MzQ6MzU6NWM6NmY6NTM6YTM6ZTI6MDg6NzA6NDg6MWY6YjQKIyBTSEExIEZpbmdlcnByaW50OiAwZjozNjozODo1Yjo4MToxYToyNTpjMzo5YjozMTo0ZTo4MzpjYTplOTozNDo2Njo3MDpjYzo3NDpiNAojIFNIQTI1NiBGaW5nZXJwcmludDogYmY6ZmY6OGY6ZDA6NDQ6MzM6NDg6N2Q6NmE6OGE6YTY6MGM6MWE6Mjk6NzY6N2E6OWY6YzI6YmI6YjA6NWU6NDI6MGY6NzE6M2E6MTM6Yjk6OTI6ODk6MWQ6Mzg6OTMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZpRENDQTNDZ0F3SUJBZ0lJZlFtWC92Qkg2bm93RFFZSktvWklodmNOQVFFTEJRQXdZakVMTUFrR0ExVUUKQmhNQ1EwNHhNakF3QmdOVkJBb01LVWRWUVU1SElFUlBUa2NnUTBWU1ZFbEdTVU5CVkVVZ1FWVlVTRTlTU1ZSWgpJRU5QTGl4TVZFUXVNUjh3SFFZRFZRUUREQlpIUkVOQklGUnlkWE4wUVZWVVNDQlNOU0JTVDA5VU1CNFhEVEUwCk1URXlOakExTVRNeE5Wb1hEVFF3TVRJek1URTFOVGsxT1Zvd1lqRUxNQWtHQTFVRUJoTUNRMDR4TWpBd0JnTlYKQkFvTUtVZFZRVTVISUVSUFRrY2dRMFZTVkVsR1NVTkJWRVVnUVZWVVNFOVNTVlJaSUVOUExpeE1WRVF1TVI4dwpIUVlEVlFRRERCWkhSRU5CSUZSeWRYTjBRVlZVU0NCU05TQlNUMDlVTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGCkFBT0NBZzhBTUlJQ0NnS0NBZ0VBMmFNVzhNaDBkSGViN3pNTk93WitWZnkxWUk5MmhoSkNmVlptUG9pQzdYSmoKRHA2TDNUUXNBbEZSd3huOVdWU0V5ZkZyczB5dzZlaEdYVGpHb3FjdUVWZTZnaFdpbkk5dHNKbEtDdkxyaVhCagpUbm5FdDF1OW9sMng4a0VDSzYycE9xUHNlUXJzWHpyai9lK0FQSzAwbXhxcmlDWjdWcUtDaGgvck5ZbURmMSt1CktVNDl0bTdzcnNId0o1dXU0L1RzNzY1Lzk0WTljbnJycGZ0WlRxZnJsWXdpT1huaExRaVB6THlSdUVIM0ZNRWoKcWNPdG1rVkVzN0xYTE0zR0tlSlFFSzVjeTRLT0Z4ZzJmWmZtaUpxd1RUUUo5Q3k1V21ZcXNCZWJuaDUyblVwbQpNVUhmUC92RkJ1OGJ0bjRhUmpiM1pHTTc0emtZSStkbmRSVFZkVmVTTjcyK2Foc21VUEkySmdhUXhYQUJaRzEyClp1R1IyMjRId0dHQUxySXVMNHh3cDlFN1BMT1I1RzYyeER0dzhteVNsd25OUjMwWXdQTzduZy9XaTY0SHRsb1AKemdzTVI2ZmxQcmk5ZmNlYk5hQmhsenBCZFJmTUs1WjNLcEloSHRtVmRpQm5hTThOdmQvV0h3bHFtdUxNYzNHawpMMzBTZ0xkVE1FWmVTMVNaRDJmSnBjanlJTUdDN0owUjM4SUMreG83MGUwZ211OWxaSklRRFNyaTNuRHhHR2VDCmpHSGV1THpSTDV6N0Q5QXI3UnQydWVRNVZmajRvUjI0cW9BQVRJTG5zbjhKdUx3d29DOE45VktlanZlU3N3b0EKSFFCVWx3YmdzUWZaeHc5Y1pYMDhiVmxYNU8ybGplbEFVNThWUzZCeDlob2g0OXB3QmlGWUZJZUZkM21xZ25rQwpBd0VBQWFOQ01FQXdIUVlEVlIwT0JCWUVGT0xKUUo5Tnp1aWFvWHpQRGo5bHhTbUlhaGxSTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFEUlNWZmcKcDh4b1dMb0JEeXNaelkyd1lVV3NFZTFqVUduNEgzKytGby85bmVzTHFqSkhkdEpuSk8yOWZETXlseXJIQllabQpEUmQ5RkJVYjFPdjlINXIyWHBkcHR4b2xwQXF6a1Q5Zk5xeUw3RmVvUHVlQmloaFhPWVYwR2tMSDZWc1RYNC81CkNPbVNkSTMxUjlLck85YjdlR1pPTm4zNTZaTHBCTjc5U1dQOGJmc1VjWk5uTDBkS3Q3bi9IaXB6Y0VZd3YxcnkKTDNtbDRZME0yZm15WXplTU4yV0ZjR3BjV3dseXVhMWpQTEhkK1B3eXZ6ZUc1THVPbUNkK3VoOFc0WEFSOGdQZgpKV0l5SnlZWU1vU2Yvd0E2RTdxYVRmUlB1QlJ3SXJIS0s1RE9LY0Z3OUMrZGYvS1FIdFphMzdkRy9PYUcrc3ZnCklIWjZ1cWJMOVh6ZVlxV3hpKzdlZ21hS1Rqb3dIeitBeTYwbnVneGUxOUN4VnNwM2NiSzFkYUZRcVVCREY4SW8KMmM5U2kxdklZOVJDUHFBemVrWXU5d29nUmxSK2FrOHg4WUYrUW5RNFpYTW43c1o4dUk3WHBUclhtS0djakJCVgowOXRMN0VDUThzMXVWOUppRG54WGs3R25iYzJkZzdzcTUrVzJPM0ZZcmYzUlJieGFrZTVURlcvVFJRbDFicnFRClhSNEV6emZmSHFobXNZem1JR3J2L0VoT2RKaENyeWx2TG1ySCszM1JaakVpeklZQWZtYURERUwwdlRTU3d4cnEKVDhwK2NrMExjSXltU0x1bW9SVDIrMWhFbVJTdXFndVRhYUFwSlVxbHl5dmRpbVlIRm5nVlYzRWI3UFZIaFBPZQpNVGQ2MVg4a3JlUzgvZjNNYm9Qb0RLaTNRV3dIM2IwOGhwY3YwZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UcnVzdENvciBSb290Q2VydCBDQS0xIE89VHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuIE9VPVRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPVRydXN0Q29yIFJvb3RDZXJ0IENBLTEgTz1UcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4gT1U9VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiMgTGFiZWw6ICJUcnVzdENvciBSb290Q2VydCBDQS0xIgojIFNlcmlhbDogMTU3NTI0NDQwOTU4MTEwMDY0ODkKIyBNRDUgRmluZ2VycHJpbnQ6IDZlOjg1OmYxOmRjOjFhOjAwOmQzOjIyOmQ1OmIyOmIyOmFjOjZiOjM3OjA1OjQ1CiMgU0hBMSBGaW5nZXJwcmludDogZmY6YmQ6Y2Q6ZTc6ODI6Yzg6NDM6NWU6M2M6NmY6MjY6ODY6NWM6Y2E6YTg6M2E6NDU6NWI6YzM6MGEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGQ0OjBlOjljOjg2OmNkOjhmOmU0OjY4OmMxOjc3OjY5OjU5OmY0OjllOmE3Ojc0OmZhOjU0Ojg2Ojg0OmI2OmM0OjA2OmYzOjkwOjkyOjYxOmY0OmRjOmUyOjU3OjVjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTURDQ0F4aWdBd0lCQWdJSkFOcWI3SEh6QTdBWk1BMEdDU3FHU0liM0RRRUJDd1VBTUlHa01Rc3dDUVlEClZRUUdFd0pRUVRFUE1BMEdBMVVFQ0F3R1VHRnVZVzFoTVJRd0VnWURWUVFIREF0UVlXNWhiV0VnUTJsMGVURWsKTUNJR0ExVUVDZ3diVkhKMWMzUkRiM0lnVTNsemRHVnRjeUJUTGlCa1pTQlNMa3d1TVNjd0pRWURWUVFMREI1VQpjblZ6ZEVOdmNpQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGt4SHpBZEJnTlZCQU1NRmxSeWRYTjBRMjl5CklGSnZiM1JEWlhKMElFTkJMVEV3SGhjTk1UWXdNakEwTVRJek1qRTJXaGNOTWpreE1qTXhNVGN5TXpFMldqQ0IKcERFTE1Ba0dBMVVFQmhNQ1VFRXhEekFOQmdOVkJBZ01CbEJoYm1GdFlURVVNQklHQTFVRUJ3d0xVR0Z1WVcxaApJRU5wZEhreEpEQWlCZ05WQkFvTUcxUnlkWE4wUTI5eUlGTjVjM1JsYlhNZ1V5NGdaR1VnVWk1TUxqRW5NQ1VHCkExVUVDd3dlVkhKMWMzUkRiM0lnUTJWeWRHbG1hV05oZEdVZ1FYVjBhRzl5YVhSNU1SOHdIUVlEVlFRRERCWlUKY25WemRFTnZjaUJTYjI5MFEyVnlkQ0JEUVMweE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQgpDZ0tDQVFFQXY0NjNsZUxDSmhKck14bkhRRmdLcTFtcWpRQ2ovSURIVUh1TzFDQW11aklTMkNOVVNTVVFJcGlkClJ0TEJ5WjVPR3k0c0RqanpHaVZvSEtaYUJlWWVpMGkvbUpaMFBtbks2YlY0cFFhODFRQmVDUXJ5SjNwUy9DM1YKc2VxMGlXRWs4eG9UMjZuUFV1ME1KTHE1bnV4K0FIVDZrNjFzS1pLdVViUzcwMWUvcy9Pb2paejBKRXNxMXBtZQo5Sjcrd0g1Q091Y0xsVlBhdDJnT2tFejdjRCtQU2l5VTh5YmRZMm1wbE5nUVRzVkhDSkNaR3hkTnVXeHU3MkNWCkVZNGhnTFc5b0hQWTBMSjN4RVhxV2liN1puWjIrQVlmWVcwUFZjV0R0eEJXY2dZSHBmT3hHZ01GWkE2ZFdvclcKaG5BYkpONytLSW9yMEdxdy9IcWkzTEo1RG90bER3SURBUUFCbzJNd1lUQWRCZ05WSFE0RUZnUVU3bXRKUEhvLwpEZU94Q2JlS3lLc1puM016VU9jd0h3WURWUjBqQkJnd0ZvQVU3bXRKUEhvL0RlT3hDYmVLeUtzWm4zTXpVT2N3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3RFFZSktvWklodmNOQVFFTEJRQUQKZ2dFQkFDVVkxSkdQRSs2UEhoMFJVOW90UkNrWm9CNXJNWjVORHA2dFBWeEJiNVVySktGNW1EbzROdnU3WnA1SQovNUNRN3ozVXVKdTBoM1UvSUp2T2NzK2hWY0ZOWktJWkJxRUhNd3dMS2VYeDZxdWo3TFVLZEpESGZYTHkxMXlmCmtlK1JpN2ZjN1dhaXo0NW1PN3lmT2dMZ0o5MFdtTUNWMUFxazVJR2FkWlExbkpCZmlEY0dyVm1WQ3JEUlo5TVoKeW9ubk1sbzJIRDZDcUZxVHZzYlFaSkcyejltMkdNL2JmdEpsbzZiRWpoY3h3ZnQrZHR2VGhlTllzbmQ2ZGp0cwpMMUFjNTl2Mloza2Y5WUtWbWdlbkZLK1AzQ2doWnduUzFrMWFIQmtjam5kY3c1UWtQVEpyUzM3VWVKU0R2amROCnpsL0hIazQ4NElremxRc1BwVExXUEZwNUxCaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRydXN0Q29yIFJvb3RDZXJ0IENBLTIgTz1UcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4gT1U9VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiMgU3ViamVjdDogQ049VHJ1c3RDb3IgUm9vdENlcnQgQ0EtMiBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBMYWJlbDogIlRydXN0Q29yIFJvb3RDZXJ0IENBLTIiCiMgU2VyaWFsOiAyNzExNjk0NTEwMTk5MTAxNjk4CiMgTUQ1IEZpbmdlcnByaW50OiBhMjplMTpmODoxODowYjpiYTo0NTpkNTpjNzo0MToyYTpiYjozNzo1Mjo0NTo2NAojIFNIQTEgRmluZ2VycHJpbnQ6IGI4OmJlOjZkOmNiOjU2OmYxOjU1OmI5OjYzOmQ0OjEyOmNhOjRlOjA2OjM0OmM3Ojk0OmIyOjFjOmMwCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwNzo1MzplOTo0MDozNzo4YzoxYjpkNTplMzo4Mzo2ZTozOTo1ZDphZTphNTpjYjo4Mzo5ZTo1MDo0NjpmMTpiZDowZTphZToxOTo1MTpjZjoxMDpmZTpjNzpjOTo2NQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR0x6Q0NCQmVnQXdJQkFnSUlKYUhmeWpQTFdRSXdEUVlKS29aSWh2Y05BUUVMQlFBd2dhUXhDekFKQmdOVgpCQVlUQWxCQk1ROHdEUVlEVlFRSURBWlFZVzVoYldFeEZEQVNCZ05WQkFjTUMxQmhibUZ0WVNCRGFYUjVNU1F3CklnWURWUVFLREJ0VWNuVnpkRU52Y2lCVGVYTjBaVzF6SUZNdUlHUmxJRkl1VEM0eEp6QWxCZ05WQkFzTUhsUnkKZFhOMFEyOXlJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVRFZk1CMEdBMVVFQXd3V1ZISjFjM1JEYjNJZwpVbTl2ZEVObGNuUWdRMEV0TWpBZUZ3MHhOakF5TURReE1qTXlNak5hRncwek5ERXlNekV4TnpJMk16bGFNSUdrCk1Rc3dDUVlEVlFRR0V3SlFRVEVQTUEwR0ExVUVDQXdHVUdGdVlXMWhNUlF3RWdZRFZRUUhEQXRRWVc1aGJXRWcKUTJsMGVURWtNQ0lHQTFVRUNnd2JWSEoxYzNSRGIzSWdVM2x6ZEdWdGN5QlRMaUJrWlNCU0xrd3VNU2N3SlFZRApWUVFMREI1VWNuVnpkRU52Y2lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3hIekFkQmdOVkJBTU1GbFJ5CmRYTjBRMjl5SUZKdmIzUkRaWEowSUVOQkxUSXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUsKQW9JQ0FRQ25JRzdDS3FKaUpKV1Fkc2c0Zm9EU3E4R2JaUVdVOU1FS0VOVUNyTzJmazhlSHlMQW5LMElNUFFvKwpRVnFlZGQyTnl1Q2I3R2d5cEdtU2FJd0xnUTVXb0Q0YTNTd2xGSUl2bDlOa1J2UlVxZHc2VkMweEs1bUM4dGtxCjErOXhBTGd4cEw1NkpBZkRRaUR5aXRTU0JCdGxWa3hzMVB1MllWcEhJN1RZYWJTM090QjBQQXgxb1l4T2RxSHAKMnlxbE8vck9zUDkrYWlqOUp4eklzZWtwOFZkdVpMVFF3UlZ0RHI0dURrYklYdlJSL3U4T1l6bzdjYnJQYjFuSwpET09iWFVtNFRPSlhzWmlLUWxlY2R1L3Z2ZEZvcU5MMENidDNOYjRsZ2dqRUZpeEVJRmFwUkJGMzcxMjBIYXBlCmF6NkxNdllITDFjRWtzcjEvcDNDNmVpempreExBakhaNUR4SWdpZjNHSUoyU0RweHNST2hPZFV1eFRUQ0hXS0YKM3dQK1RmU3ZQZDljVzQzNmNPR2xmaWZIaGk1cWp4TEdoRjVEVVZDY0dadDQ1dnoyN1VkK2V6MW03eE1UaUY4OApvV1A3K2F5SE5aL3pncDZrUHdxY01XbUxtYVNJU281dVprM3ZGc1FQZVNnaFlBMkZGbjNYVkRqeGtsYjl0VE5NCmc5elhFSjlML2NiNFFyMjZmSE1DNFA5OXpWdmgxS3hoZTFmVlNudGIxSVZZSjEyLytDdGdyS0FtcmhRaEo4WjMKbWpPQVBGNUdQL2ZEc2FPR004Ym9YZzI1TlN5cVJzR0ZBbldBb09zayt4V3E1R2QvYm5jLzlBU0tMM3g3NHhkaAo4TjBKcVNESXZnbWswSDVFdzdJd1NqaXFxZXdZbWdlQ0s5dTRuQml0MnVCR0Y2elBYUUlEQVFBQm8yTXdZVEFkCkJnTlZIUTRFRmdRVTJmNGhRRzZVbnJ5YlBaeDltQ0FaNVl3d1lySXdId1lEVlIwakJCZ3dGb0FVMmY0aFFHNlUKbnJ5YlBaeDltQ0FaNVl3d1lySXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVlZdwpEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBSjVGbmd3N3R1L2hPc2g4MFFBOXorTHFCcld5T3JzR1MyaDYwQ09YCmRLY3M4QWpZZVZyWFdvU0syQkthRzlsOVhFMXd4YVg1cStXamlZbmRBZnJzM2ZucGtwZmJzRVpDODlOaXFwWCsKTVdjVWFWaVFDcW9MN2pjangxQlJ0UFYrbnVONzkrVE1Rakl0U1F6TC8wa01teDQwL1c1dWxvcDVBN1p2MnduTAovVjlsRkRmaE9QWHpZUlpZNUxWdERRc0VHejlRTFgrengzb2FGb0JnK0lvZjZSc3F4dm02QVJwcHY5Sll4MVJYCkNJL2hPV0IzUzZ4WmhCcUk4ZDNMVDNqWDUrRXpMZnp1UWZvZ3NMN0w5emlVd09IUWhRKzc3U3h6cSszK2tuWWEKWkg5YkRUTUpCek43Qmo4UnBGeHdQSVhBeitPUXFJTjMrdHZteFl4b1p4Qm5wVkl0OE1TWmozKy8wV3ZpdFVmVwoyZENGbVUyVW13OUxqZTRBV2tjZEVRT3NRUml2aDdkdkREcVB5cy9jQThHaUNjamwvWUJleUdCQ0FSc2FVMXE3Ck42YTN2THFFNlI1c0d0UmsydFJEL3BPTFMvSXNlUllRMUpNTGlJK2gySVlVUnBGSG15Z2s3MWRTVGx4Q25LcjMKU2V3bjZFQWVzNmFKSW5LYzlRMHp0RmlqTUR2ZDFHcFVrNzRhVGZPVGxQZjhoQXMvaENCY05BTkV4ZHF0dkFyQgpBczhlNVpUWjg0NWIyRXp3bmV4aEY3c1VNbFFNQWltVEhwS0c5bi92NTVJRkRsbmRtUWd1THZxY0FGTFR4V1lwCjVLZVhSS1FPS0lFVE5jWDJiMlRtUWNUVkw4dzBSU1hQUVFDV1BVb3V3cGFZVDA1S25KZTMyeCtTTXNqL0QxRnUKMXV3SgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VHJ1c3RDb3IgRUNBLTEgTz1UcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4gT1U9VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiMgU3ViamVjdDogQ049VHJ1c3RDb3IgRUNBLTEgTz1UcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4gT1U9VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiMgTGFiZWw6ICJUcnVzdENvciBFQ0EtMSIKIyBTZXJpYWw6IDk1NDgyNDI5NDY5ODg2MjU5ODQKIyBNRDUgRmluZ2VycHJpbnQ6IDI3OjkyOjIzOjFkOjBhOmY1OjQwOjdjOmU5OmU2OjZiOjlkOmQ4OmY1OmU3OjZjCiMgU0hBMSBGaW5nZXJwcmludDogNTg6ZDE6ZGY6OTU6OTU6Njc6NmI6NjM6YzA6ZjA6NWI6MWM6MTc6NGQ6OGI6ODQ6MGI6Yzg6Nzg6YmQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDVhOjg4OjVkOmIxOjljOjAxOmQ5OjEyOmM1Ojc1OjkzOjg4OjkzOjhjOmFmOmJiOmRmOjAzOjFhOmIyOmQ0OjhlOjkxOmVlOjE1OjU4OjliOjQyOjk3OjFkOjAzOjljCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFSURDQ0F3aWdBd0lCQWdJSkFJU0NMRjhjWXRCQU1BMEdDU3FHU0liM0RRRUJDd1VBTUlHY01Rc3dDUVlEClZRUUdFd0pRUVRFUE1BMEdBMVVFQ0F3R1VHRnVZVzFoTVJRd0VnWURWUVFIREF0UVlXNWhiV0VnUTJsMGVURWsKTUNJR0ExVUVDZ3diVkhKMWMzUkRiM0lnVTNsemRHVnRjeUJUTGlCa1pTQlNMa3d1TVNjd0pRWURWUVFMREI1VQpjblZ6ZEVOdmNpQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGt4RnpBVkJnTlZCQU1NRGxSeWRYTjBRMjl5CklFVkRRUzB4TUI0WERURTJNREl3TkRFeU16SXpNMW9YRFRJNU1USXpNVEUzTWpnd04xb3dnWnd4Q3pBSkJnTlYKQkFZVEFsQkJNUTh3RFFZRFZRUUlEQVpRWVc1aGJXRXhGREFTQmdOVkJBY01DMUJoYm1GdFlTQkRhWFI1TVNRdwpJZ1lEVlFRS0RCdFVjblZ6ZEVOdmNpQlRlWE4wWlcxeklGTXVJR1JsSUZJdVRDNHhKekFsQmdOVkJBc01IbFJ5CmRYTjBRMjl5SUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVURVhNQlVHQTFVRUF3d09WSEoxYzNSRGIzSWcKUlVOQkxURXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEUGorQVJ0WitvZG5iYgozdzlVNzNOaktZS3RSOGFqYSszK1h6UDRRMUhwR2pPUk1SZWdkTVRVcHdIbXNwSSthcDN0RHZsMG1FRFRQd09BCkJvSkE2TEhpcDFHbkhZTW1hNnZlK2hlUks5akdyQjZ4bmhrQjFaZW02ZzIzeEZVZkozelNDTlYySHlrVmgwQTUKM1RoRkVYWFFtcWMwNEwvTnlGSWR1VWQrRGJpN3hnejJjMWNXV241RGtSOVZPc1p0UkFTcW5LbWNwMHlKRjRPdQpvd1JlVW9DTEhoSWxFUm5YREgxOU1VUkI2dHV2c0J6dmdkQXN4Wm9obXozdFFqdFFKdkxzem5GaEJtSWhWRTUvCndaMCtmeUNNZ01zcTJKZGl5SU16a1gyd29sb1BWK2c3elBJbHN0UjhMK3hOeHFFNkZYcm50bDAxOWZaSVNqWkYKWnRTNm1GakJBZ01CQUFHall6QmhNQjBHQTFVZERnUVdCQlJFbmtqMXpHMUkxS0JMZi81WkpDK0RsNW1haGpBZgpCZ05WSFNNRUdEQVdnQlJFbmtqMXpHMUkxS0JMZi81WkpDK0RsNW1haGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvCk1BNEdBMVVkRHdFQi93UUVBd0lCaGpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQUJUNDFYQlZ3bThuSGMyRnYKY2l2VXdvL3lRMTBDenNTVXVaUVJnMmRkNG1kc2RYYS91d3lxTnNhdFI1TmozQjUrMXQ0dS91a1pNamdEZnhUMgpBSE1zV2JFaEJ1SDdyQmlWREtQL21aYjNLeWViMVNUTUhkM0JPdUNZUkxERTVENTNzWE9wWkN6MkhBRjhQMTFGCmhjQ0Y1eVdQbGR3WDh6eWZHbTZ3eXVNZEt1bE1ZL29rWVdMVzJuNjJIR3oxQWgzVUt0MVZrT3NxRVVjOExsNTAKc29JaXBYMVRIMFhzSjVGOTV5SVc2TUJvTnRqRzhVK0FSREw1NGRIUkhhcmVxS3VjQksrdElBNWttRTJsYThCSQpXSlpwVGR3SGpGR1RvdCtmRHoyTFlMU0NqYW9JVG1KRjRQa0wwdURnUEZ2ZVhIRW5KY0xtQTRHTEVGUGp4MVdpCnRKL1g1Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIE89U1NMIENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSBPPVNTTCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSIKIyBTZXJpYWw6IDg4NzU2NDAyOTY1NTgzMTAwNDEKIyBNRDUgRmluZ2VycHJpbnQ6IDg2OjY5OjEyOmMwOjcwOmYxOmVjOmFjOmFjOmMyOmQ1OmJjOmE1OjViOmExOjI5CiMgU0hBMSBGaW5nZXJwcmludDogYjc6YWI6MzM6MDg6ZDE6ZWE6NDQ6Nzc6YmE6MTQ6ODA6MTI6NWE6NmY6YmQ6YTk6MzY6NDk6MGM6YmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDg1OjY2OjZhOjU2OjJlOmUwOmJlOjVjOmU5OjI1OmMxOmQ4Ojg5OjBhOjZmOjc2OmE4OjdlOmMxOjZkOjRkOjdkOjVmOjI5OmVhOjc0OjE5OmNmOjIwOjEyOjNiOjY5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGM1RDQ0E4V2dBd0lCQWdJSWV5eWIweGFBTXBrd0RRWUpLb1pJaHZjTkFRRUxCUUF3ZkRFTE1Ba0dBMVVFCkJoTUNWVk14RGpBTUJnTlZCQWdNQlZSbGVHRnpNUkF3RGdZRFZRUUhEQWRJYjNWemRHOXVNUmd3RmdZRFZRUUsKREE5VFUwd2dRMjl5Y0c5eVlYUnBiMjR4TVRBdkJnTlZCQU1NS0ZOVFRDNWpiMjBnVW05dmRDQkRaWEowYVdacApZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQlNVMEV3SGhjTk1UWXdNakV5TVRjek9UTTVXaGNOTkRFd01qRXlNVGN6Ck9UTTVXakI4TVFzd0NRWURWUVFHRXdKVlV6RU9NQXdHQTFVRUNBd0ZWR1Y0WVhNeEVEQU9CZ05WQkFjTUIwaHYKZFhOMGIyNHhHREFXQmdOVkJBb01EMU5UVENCRGIzSndiM0poZEdsdmJqRXhNQzhHQTFVRUF3d29VMU5NTG1OdgpiU0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUZKVFFUQ0NBaUl3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFQa1AzYU1yZmN2UUt2N3NaNFdtNXk0YnVuZmg0L1d2cE96NlNsMlIKeEZkSGF4aDNhM2J5L1pQa1BRL0NGcDRMWnNOV2xKNFhnNFhPVnUveUZ2MEFZdlVpQ1ZUb1pSZE9RYm5nVDBhWApxaHZJdUc1aVhtbXhYOXNxQW43OGJNcnpRZGp0ME9qOFAyRkk3YkFERkIwUURrc1o0THRPN0labC96YnpYbWNDCkM1MkdWV0g5ZWpqdC91SVpBTGR2b1ZCaWRYUThvUHJJSlpLMGJub2l4L2dlb2VPeTNaRXhxeXNkQlArbFNnUTMKNllXa015djk0dFpWTkh3WnBFcG94N0tvMDdmS29aT0k2OEdYdkl6NUhka2loQ1IweHdROWFxa3BrOHpydUZ2aAovbDhscWpSWXlNRWpWSjBibUJIRE9KeCtQWVpzcFE5QWhud0M5RndDVHlqTHJuR2ZEenJJTS80UkpUWHEvTHJGCllEM1pmQmpWc3FuVGRYZ0RjaUxLT3NNZjd5emxMcW42bml5MlVVYjlyd1BXNm1CbzZvVVdObXVGNlI3QXM5M0UKSk55QUtvRkJiWlEreU9ESmdVRUFubDYvZjhVSW1LSVlMRUpBcy9sdk9DZExUb0QwUFlGSDRJaDg2aHpPdFhWYwpVUzRjSzM4YWNpam5BTFhSZE1iWDVKK3RCNU8yVXpVMS9EZmt3L1pkRnI0aGM5NlNDdmlnWTJxOGxwSnFQdmk4ClpWV2IzdlVOaVNZRS9DVWFwaVZweThKdHluemlXVitYck92dkxzaTgxeHRaUEN2TThobklrMnNuWXhuUC9Pa20KK01weG0zK1QvalJuaEU2WjYveXplQWt6Y0xwbXBuYnRHM1ByR3FVTnhDSVRJSlJXQ2s0c2JFNngvYytjQ2JxaQpNKzJIQWdNQkFBR2pZekJoTUIwR0ExVWREZ1FXQkJUZEJBa0hvdlY2ZlZKVEVwS1Y3amlBSlEybVdUQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjhHQTFVZEl3UVlNQmFBRk4wRUNRZWk5WHA5VWxNU2twWHVPSUFsRGFaWk1BNEcKQTFVZER3RUIvd1FFQXdJQmhqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFJQmdSbENuN0pwMGNIaDV3WWZHVgpjcE54Sksxb2sxaU9NcThiczNBRC9DVXJkSVdRUFhocTlMbUxwWmM3dFJpUnV4Nm4rVUJia2ZsVm1hOGVFZEJjCkhhZG00N0dVQnd3eU9hYnFHN0I1MkIyY2NFVGppdDNFK1pVZmlqaERQd0dGcFVlblBVYXl2T1VpYVBkN25OZ3MKUGdvaHlDMHpyTC9GZ1preGRNRjFjY1crc2ZBalJmU2RhL3daWTUyanZBVEdHQXNsdTFPSkQ3T0FVTjVGN2tSLwpxNVI0WkpqVDlpamRoOWh3WlhUN0Rya1Q2NmNQWWFreWxzemV1KzFqVEJpN3FVRDNvRlJ1SUloeGRSanFlclEwCmN1QWpKM2RjdHBEcWhpVkFxKzh6RDh1ZmdyNmlJUHYydFMwYTVzS0ZzWFFQKzhobEFxUlNBVWZkU1NMQnY5anIKYTZ4KzN1eGpNeFczSXdpUHhnK05RVnJkanNXNWorVkZQM2pidXRJYlFMSCtjVTAvNElHaXVsNjA3QlhnazkwSQpIMzdoVlprTElkNlRuZ3I3NXFOSnZUWXcvdWQzc3FCMWw3VXRnWWdYWlNEMzJwQUFuOGxTekRMS05YejFQUS9ZCks5ZjFKbXpKQmpTV0Z1cHdXUm95ZVhrTHRvaC9EMUpJUGI5czJLSkVMdEZPdDNKWTA0a1RsZjVFcS9qWGl4dHUKbkx3c29GdlZhZ0N2WHpmaDFmb1FDNWljaHVjbWo4N3c3RzZLVnd1QTQwNnl3S0JqWVpDNlZXZzNkR3Eya3R1ZgpvWVlpdG1VbkR1eTJuMEpnNUdmQ3RkcEJDOFRUaTJFYnZQb2ZrU3ZYUkFkZXVpbXMyY1hwNzFOSVd1dUE4U2hZCkljMndCbFg3Sno5VGtIQ3BCQjVYSjdrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyBPPVNTTCBDb3Jwb3JhdGlvbgojIFN1YmplY3Q6IENOPVNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MgTz1TU0wgQ29ycG9yYXRpb24KIyBMYWJlbDogIlNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MiCiMgU2VyaWFsOiA4NDk1NzIzODEzMjk3MjE2NDI0CiMgTUQ1IEZpbmdlcnByaW50OiAyZTpkYTplNDozOTo3Zjo5Yzo4ZjozNzpkMTo3MDo5ZjoyNjoxNzo1MTozYTo4ZQojIFNIQTEgRmluZ2VycHJpbnQ6IGMzOjE5OjdjOjM5OjI0OmU2OjU0OmFmOjFiOmM0OmFiOjIwOjk1OjdhOmUyOmMzOjBlOjEzOjAyOjZhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzNDoxNzpiYjowNjpjYzo2MDowNzpkYToxYjo5NjoxYzo5MjowYjo4YTpiNDpjZTozZjphZDo4MjowZTo0YTphMzowYjo5YTpjYjpjNDphNzo0ZTpiZDpjZTpiYzo2NQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2pUQ0NBaFNnQXdJQkFnSUlkZWJmeThGb1c2Z3dDZ1lJS29aSXpqMEVBd0l3ZkRFTE1Ba0dBMVVFQmhNQwpWVk14RGpBTUJnTlZCQWdNQlZSbGVHRnpNUkF3RGdZRFZRUUhEQWRJYjNWemRHOXVNUmd3RmdZRFZRUUtEQTlUClUwd2dRMjl5Y0c5eVlYUnBiMjR4TVRBdkJnTlZCQU1NS0ZOVFRDNWpiMjBnVW05dmRDQkRaWEowYVdacFkyRjAKYVc5dUlFRjFkR2h2Y21sMGVTQkZRME13SGhjTk1UWXdNakV5TVRneE5EQXpXaGNOTkRFd01qRXlNVGd4TkRBegpXakI4TVFzd0NRWURWUVFHRXdKVlV6RU9NQXdHQTFVRUNBd0ZWR1Y0WVhNeEVEQU9CZ05WQkFjTUIwaHZkWE4wCmIyNHhHREFXQmdOVkJBb01EMU5UVENCRGIzSndiM0poZEdsdmJqRXhNQzhHQTFVRUF3d29VMU5NTG1OdmJTQlMKYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUVWRFF6QjJNQkFHQnlxR1NNNDlBZ0VHQlN1QgpCQUFpQTJJQUJFVnVxVkRFcGlNMm5sOG9qUmZMbGlKa1A5eDZqaDNNQ0xPaWNTUzZqa201QkJ0SGxsaXJMWlhJCjdaNElOY2duNjRtTVUxanJZb3IrOEZzUGF6RlNZMEU3aWMzczdMYU5HZE0wQjl5N3hnWi93a1dWN010L3FDUGcKQ2VtQit2TkgwNk5qTUdFd0hRWURWUjBPQkJZRUZJTFJoWE13NXpVRTA0NENrdnZscE5IRUllak5NQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVWd0R0ZjekRuTlFUVGpnS1MrK1drMGNRaDZNMHdEZ1lEClZSMFBBUUgvQkFRREFnR0dNQW9HQ0NxR1NNNDlCQU1DQTJjQU1HUUNNRy9uNjFrUnBHRFBZYkNXZSswRitTOFQKa2R6dDVmeFFheEZHUnJNY0lRQml1NzdENStqTkI1bjVEUXRkY2o3RXFnSXdIN3k2QytJd0pQdDhiWUJWQ3BrKwpnQTB6NVdhanM2TzdwZFdMandrc3BsMSs0dkFIQ0dodDBueHBibC9mNVdwbAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSBSMiBPPVNTTCBDb3Jwb3JhdGlvbgojIFN1YmplY3Q6IENOPVNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EgUjIgTz1TU0wgQ29ycG9yYXRpb24KIyBMYWJlbDogIlNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EgUjIiCiMgU2VyaWFsOiA2MjQ4MjI3NDk0MzUyOTQzMzUwCiMgTUQ1IEZpbmdlcnByaW50OiBlMToxZTozMTo1ODoxYTphZTo1NDo1MzowMjpmNjoxNzo2YToxMTo3Yjo0ZDo5NQojIFNIQTEgRmluZ2VycHJpbnQ6IDc0OjNhOmYwOjUyOjliOmQwOjMyOmEwOmY0OjRhOjgzOmNkOmQ0OmJhOmE5OjdiOjdjOjJlOmM0OjlhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAyZTo3YjpmMTo2YzpjMjoyNDo4NTphNzpiYjplMjphYTo4Njo5Njo3NTowNzo2MTpiMDphZTozOTpiZTozYjoyZjplOTpkMDpjYzo2ZDo0ZTpmNzozNDo5MTo0Mjo1YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjZ6Q0NBOU9nQXdJQkFnSUlWcllwelRTOGVQWXdEUVlKS29aSWh2Y05BUUVMQlFBd2dZSXhDekFKQmdOVgpCQVlUQWxWVE1RNHdEQVlEVlFRSURBVlVaWGhoY3pFUU1BNEdBMVVFQnd3SFNHOTFjM1J2YmpFWU1CWUdBMVVFCkNnd1BVMU5NSUVOdmNuQnZjbUYwYVc5dU1UY3dOUVlEVlFRRERDNVRVMHd1WTI5dElFVldJRkp2YjNRZ1EyVnkKZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ1VsTkJJRkl5TUI0WERURTNNRFV6TVRFNE1UUXpOMW9YRFRReQpNRFV6TURFNE1UUXpOMW93Z1lJeEN6QUpCZ05WQkFZVEFsVlRNUTR3REFZRFZRUUlEQVZVWlhoaGN6RVFNQTRHCkExVUVCd3dIU0c5MWMzUnZiakVZTUJZR0ExVUVDZ3dQVTFOTUlFTnZjbkJ2Y21GMGFXOXVNVGN3TlFZRFZRUUQKREM1VFUwd3VZMjl0SUVWV0lGSnZiM1FnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dVbE5CSUZJeQpNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQWp6WmxRT0hXVGNEWHRPbEcybXZxCk0wZk5UUGw5ZmI2OUxUM3cyM2poaHFYWnVnbFhhTzFYUHFEUUNFR0Q1eWhCSkIvamNoWFFBUnI3WG5BanNzdWYKT2VQUHhVN0drbTBteG51N3M5b25uUXFHNllFM0JmN3djWEhzd3h6cFk2SVhGSjN2RzJmVGhWVUNBdFpKeWN4YQo0YkgzYnpLZnlkUTdpRUdvbkwzTHE5dHRld2tmb2t4eWtOb3JDUHpQUEZUT1p3K296MTJXR1F2RTQzTHJyZEY5CkhTZnZrdXNRdjF2ck82L1BnTjNCMHBZRVczcCtwS2s4T0hha1lvNmdPVjdxZDg5ZEFGbVBaaXcrQjZLakJTWVIKYVpmcWhiY1BsZ3RMeUVEaFVMb3Vpc3YzRDVvaTUzK2FOeFBOOGswVGF5SFJ3TXdpOHFGRzlrUnBuTXBoTlFjQQpiOVpoQ0JIcXVyajI2Yk5nNVUyNTdKOFVac2xYV052TmgybjRpb1lTQTBlL1poTjJySGQ5TkNTRmc4M1hxcHlRCkdwOGhMSDk0dDJTNDJPaW05SGl6VmN1RTBqTEVlSzZqajJIZHpnaFRyZXlJL0JYa21nM21ueHAzemt5UHVCUVYKUFdLY2hqZ0dBR1lTNUZsMldsUEFBcGlpRUN0b1JIdU9lYzR6U25hcVc0RVdHN1dLMk5BQWUxNWl0QW5XaG1NTwpwZ1dWU2Jvb2k0aVRzalFjMktSVmJyY2MwTjZaVlRzajlDTGcrU2xtSnV3Z1VIZmJTZ3VQdnVVQ1lIQkJYdFN1ClVEa2lGQ2JMc2p0emRGVkhCM21CT2Fnd0UwVGxCSXF1bGhNbFFnKzVVOFNiL00za0hONDgrcXZXQmtvZlo2YVkKTUJ6ZExOdmNHSlZYWnNiL1hJdFc5WGNDQXdFQUFhTmpNR0V3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFmQmdOVgpIU01FR0RBV2dCVDVZTHZVNDlVMDlyajFCb0FscDNQYlJtbW9uakFkQmdOVkhRNEVGZ1FVK1dDNzFPUFZOUGE0CjlRYUFKYWR6MjBacHFKNHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRQlcKczQ3TENwMUpqcitreEpHN1poY0ZVWmgxKytWUUxIcWU4UlQ2cTlPS1B2K1JLWTlqaTlpMHFWUUJEYjZUaGkvNQpTbTNIWHZWWCtjcFZIQksrUnc4MnhkOXF0OXQxd2tjbGY3bnhZL2hvTFZVRTBmS05zS1RQdkR4ZUgzam5wYUFnCmNMQUV4YmYzY3FmZUlnMjlNeVZHakdTU0p1TStMbU9XMnB1TVBmZ1lDZGNEekgyR2d1REtCQWRSVU5mL2t0VU0KNzlxR241blg2N2V2YU9JNUpwUzZhTGUvZzlQcWVtYzlZbWV1SmVWeTZPTGs3SzRTOWtzclBKL3BzRUR6T0ZTegovYmRveU5yR2oxRThzdnVSM0J6bm01M2h0dzF5aitLa3hLbDQrZXNVck1aREJjSmxPU2dZQXNPQ3NwMEZ2bVh0CmxsOWxkRHo3Q1RVdWU1d1QvUnNQWGNkdGdUcFdEOHc3NGE4Q0x5S3NSc3BHUEtBY1ROWkV0RjR1WEJWbUNlRW0KS2Y3R1VtRzZzWFAvd3d5YzVXeHFsRDhVeWtBV2xZVHpXYW1zWDB4aGsyM1JPOHlpbFF3aXBtZG5SQzY1MmRLSwpRYk5tQzFyN2ZTT2w4aHF3Lzk2Ymc1UXUwVC9ma3JlUnJ3VTdaY2VnYkxITlloTERrQnZqSmM0MHZHOTNkckVRCncvY0ZHc0RXcjNSaVNCZDNrbW1RWVJ6ZWxZQjBWSThZSE1QekE5Qy9wRU4xaGxNWWVnb3VDUncybjVIOWdvb2kKUzlFT1VDWGR5d01NRjhtREFBaE9OVTJLaSszd0FwUm1MRVIveTVVbmxoZXRDVENzdG5FWGJvc1g5aHdKMUMwNwptS1Z4MDFRVDJXRHo5VXRtVC9yeDdpQVNqYlNzVjdGRlk2R3NkcW5DK3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQyBPPVNTTCBDb3Jwb3JhdGlvbgojIFN1YmplY3Q6IENOPVNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MgTz1TU0wgQ29ycG9yYXRpb24KIyBMYWJlbDogIlNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MiCiMgU2VyaWFsOiAzMTgyMjQ2NTI2NzU0NTU1Mjg1CiMgTUQ1IEZpbmdlcnByaW50OiA1OTo1MzoyMjo2NTo4Mzo0MjowMTo1NDpjMDpjZTo0MjpiOTo1YTo3YzpmMjo5MAojIFNIQTEgRmluZ2VycHJpbnQ6IDRjOmRkOjUxOmEzOmQxOmY1OjIwOjMyOjE0OmIwOmM2OmM1OjMyOjIzOjAzOjkxOmM3OjQ2OjQyOjZkCiMgU0hBMjU2IEZpbmdlcnByaW50OiAyMjphMjpjMTpmNzpiZDplZDo3MDo0YzpjMTplNzowMTpiNTpmNDowODpjMzoxMDo4ODowZjplOTo1NjpiNTpkZToyYTo0YTo0NDpmOTo5Yzo4NzozYToyNTphNzpjOAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2xEQ0NBaHFnQXdJQkFnSUlMQ21jV3hidEJaVXdDZ1lJS29aSXpqMEVBd0l3ZnpFTE1Ba0dBMVVFQmhNQwpWVk14RGpBTUJnTlZCQWdNQlZSbGVHRnpNUkF3RGdZRFZRUUhEQWRJYjNWemRHOXVNUmd3RmdZRFZRUUtEQTlUClUwd2dRMjl5Y0c5eVlYUnBiMjR4TkRBeUJnTlZCQU1NSzFOVFRDNWpiMjBnUlZZZ1VtOXZkQ0JEWlhKMGFXWnAKWTJGMGFXOXVJRUYxZEdodmNtbDBlU0JGUTBNd0hoY05NVFl3TWpFeU1UZ3hOVEl6V2hjTk5ERXdNakV5TVRneApOVEl6V2pCL01Rc3dDUVlEVlFRR0V3SlZVekVPTUF3R0ExVUVDQXdGVkdWNFlYTXhFREFPQmdOVkJBY01CMGh2CmRYTjBiMjR4R0RBV0JnTlZCQW9NRDFOVFRDQkRiM0p3YjNKaGRHbHZiakUwTURJR0ExVUVBd3dyVTFOTUxtTnYKYlNCRlZpQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJRVZEUXpCMk1CQUdCeXFHU000OQpBZ0VHQlN1QkJBQWlBMklBQktvU1I1Q1lHL3Z2dzBBSGd5Qk84VENDb2diUjhwS0dZZkwySVdqS0FNVEg2a01BClZJYmMvUi9mQUxoQllsemNjQll5M2grWjFNekZCOGdJSDJFV0IxRTlmVndIVStNMU9JemZ6Wi9aTGcxS3Roa3UKV25CYUJ1Mis4S0d3eXRBSkthTmpNR0V3SFFZRFZSME9CQllFRkZ2S1h1WGUwb0dxemFndFpGRzIyWEtibCtaUApNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVVzhwZTVkN1NnYXJOcUMxa1ViYlpjcHVYCjVrOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01Bb0dDQ3FHU000OUJBTUNBMmdBTUdVQ01RQ0s1a0NKTit2cDFSUFoKeXRSckpQT3dQWWRHV0Jyc3NkOXYrMWE2Y0d2SE9Nem9zWXhQRC9meFozWU9nOUFlVVk4Q01EMzJJeWdtVE1aZwpoNU1tbTdJMUhyclc5enpSSE03NkpUeW1Hb0VWVy9NU0QyenVaWXJKaDZqNUIrQmltb3hjU2c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tClBLAwQUAAAAAAAAACEAgrKiz9EBAADRAQAALQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9jZXJ0cy5weSMhL3Vzci9iaW4vZW52IHB5dGhvbgojIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLmNlcnRzCn5+fn5+fn5+fn5+fn5+CgpUaGlzIG1vZHVsZSByZXR1cm5zIHRoZSBwcmVmZXJyZWQgZGVmYXVsdCBDQSBjZXJ0aWZpY2F0ZSBidW5kbGUuIFRoZXJlIGlzCm9ubHkgb25lIOKAlCB0aGUgb25lIGZyb20gdGhlIGNlcnRpZmkgcGFja2FnZS4KCklmIHlvdSBhcmUgcGFja2FnaW5nIFJlcXVlc3RzLCBlLmcuLCBmb3IgYSBMaW51eCBkaXN0cmlidXRpb24gb3IgYSBtYW5hZ2VkCmVudmlyb25tZW50LCB5b3UgY2FuIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiB3aGVyZSgpIHRvIHJldHVybiBhIHNlcGFyYXRlbHkKcGFja2FnZWQgQ0EgYnVuZGxlLgoiIiIKZnJvbSBwaXAuX3ZlbmRvci5jZXJ0aWZpIGltcG9ydCB3aGVyZQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHByaW50KHdoZXJlKCkpClBLAwQUAAAAAAAAACEAd8lhTVoGAABaBgAALgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9jb21wYXQucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLmNvbXBhdAp+fn5+fn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIGhhbmRsZXMgaW1wb3J0IGNvbXBhdGliaWxpdHkgaXNzdWVzIGJldHdlZW4gUHl0aG9uIDIgYW5kClB5dGhvbiAzLgoiIiIKCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IGNoYXJkZXQKCmltcG9ydCBzeXMKCiMgLS0tLS0tLQojIFB5dGhvbnMKIyAtLS0tLS0tCgojIFN5bnRheCBzdWdhci4KX3ZlciA9IHN5cy52ZXJzaW9uX2luZm8KCiM6IFB5dGhvbiAyLng/CmlzX3B5MiA9IChfdmVyWzBdID09IDIpCgojOiBQeXRob24gMy54Pwppc19weTMgPSAoX3ZlclswXSA9PSAzKQoKIyB0cnk6CiMgICAgIGltcG9ydCBzaW1wbGVqc29uIGFzIGpzb24KIyBleGNlcHQgSW1wb3J0RXJyb3I6CmltcG9ydCBqc29uCgojIC0tLS0tLS0tLQojIFNwZWNpZmljcwojIC0tLS0tLS0tLQoKaWYgaXNfcHkyOgogICAgZnJvbSB1cmxsaWIgaW1wb3J0ICgKICAgICAgICBxdW90ZSwgdW5xdW90ZSwgcXVvdGVfcGx1cywgdW5xdW90ZV9wbHVzLCB1cmxlbmNvZGUsIGdldHByb3hpZXMsCiAgICAgICAgcHJveHlfYnlwYXNzLCBwcm94eV9ieXBhc3NfZW52aXJvbm1lbnQsIGdldHByb3hpZXNfZW52aXJvbm1lbnQpCiAgICBmcm9tIHVybHBhcnNlIGltcG9ydCB1cmxwYXJzZSwgdXJsdW5wYXJzZSwgdXJsam9pbiwgdXJsc3BsaXQsIHVybGRlZnJhZwogICAgZnJvbSB1cmxsaWIyIGltcG9ydCBwYXJzZV9odHRwX2xpc3QKICAgIGltcG9ydCBjb29raWVsaWIKICAgIGZyb20gQ29va2llIGltcG9ydCBNb3JzZWwKICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCgogICAgZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLnBhY2thZ2VzLm9yZGVyZWRfZGljdCBpbXBvcnQgT3JkZXJlZERpY3QKCiAgICBidWlsdGluX3N0ciA9IHN0cgogICAgYnl0ZXMgPSBzdHIKICAgIHN0ciA9IHVuaWNvZGUKICAgIGJhc2VzdHJpbmcgPSBiYXNlc3RyaW5nCiAgICBudW1lcmljX3R5cGVzID0gKGludCwgbG9uZywgZmxvYXQpCiAgICBpbnRlZ2VyX3R5cGVzID0gKGludCwgbG9uZykKCmVsaWYgaXNfcHkzOgogICAgZnJvbSB1cmxsaWIucGFyc2UgaW1wb3J0IHVybHBhcnNlLCB1cmx1bnBhcnNlLCB1cmxqb2luLCB1cmxzcGxpdCwgdXJsZW5jb2RlLCBxdW90ZSwgdW5xdW90ZSwgcXVvdGVfcGx1cywgdW5xdW90ZV9wbHVzLCB1cmxkZWZyYWcKICAgIGZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IHBhcnNlX2h0dHBfbGlzdCwgZ2V0cHJveGllcywgcHJveHlfYnlwYXNzLCBwcm94eV9ieXBhc3NfZW52aXJvbm1lbnQsIGdldHByb3hpZXNfZW52aXJvbm1lbnQKICAgIGZyb20gaHR0cCBpbXBvcnQgY29va2llamFyIGFzIGNvb2tpZWxpYgogICAgZnJvbSBodHRwLmNvb2tpZXMgaW1wb3J0IE1vcnNlbAogICAgZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CgogICAgYnVpbHRpbl9zdHIgPSBzdHIKICAgIHN0ciA9IHN0cgogICAgYnl0ZXMgPSBieXRlcwogICAgYmFzZXN0cmluZyA9IChzdHIsIGJ5dGVzKQogICAgbnVtZXJpY190eXBlcyA9IChpbnQsIGZsb2F0KQogICAgaW50ZWdlcl90eXBlcyA9IChpbnQsKQpQSwMEFAAAAAAAAAAhABNDyTMgRwAAIEcAAC8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvY29va2llcy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMuY29va2llcwp+fn5+fn5+fn5+fn5+fn5+CgpDb21wYXRpYmlsaXR5IGNvZGUgdG8gYmUgYWJsZSB0byB1c2UgYGNvb2tpZWxpYi5Db29raWVKYXJgIHdpdGggcmVxdWVzdHMuCgpyZXF1ZXN0cy51dGlscyBpbXBvcnRzIGZyb20gaGVyZSwgc28gYmUgY2FyZWZ1bCB3aXRoIGltcG9ydHMuCiIiIgoKaW1wb3J0IGNvcHkKaW1wb3J0IHRpbWUKaW1wb3J0IGNhbGVuZGFyCmltcG9ydCBjb2xsZWN0aW9ucwoKZnJvbSAuX2ludGVybmFsX3V0aWxzIGltcG9ydCB0b19uYXRpdmVfc3RyaW5nCmZyb20gLmNvbXBhdCBpbXBvcnQgY29va2llbGliLCB1cmxwYXJzZSwgdXJsdW5wYXJzZSwgTW9yc2VsCgp0cnk6CiAgICBpbXBvcnQgdGhyZWFkaW5nCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydCBkdW1teV90aHJlYWRpbmcgYXMgdGhyZWFkaW5nCgoKY2xhc3MgTW9ja1JlcXVlc3Qob2JqZWN0KToKICAgICIiIldyYXBzIGEgYHJlcXVlc3RzLlJlcXVlc3RgIHRvIG1pbWljIGEgYHVybGxpYjIuUmVxdWVzdGAuCgogICAgVGhlIGNvZGUgaW4gYGNvb2tpZWxpYi5Db29raWVKYXJgIGV4cGVjdHMgdGhpcyBpbnRlcmZhY2UgaW4gb3JkZXIgdG8gY29ycmVjdGx5CiAgICBtYW5hZ2UgY29va2llIHBvbGljaWVzLCBpLmUuLCBkZXRlcm1pbmUgd2hldGhlciBhIGNvb2tpZSBjYW4gYmUgc2V0LCBnaXZlbiB0aGUKICAgIGRvbWFpbnMgb2YgdGhlIHJlcXVlc3QgYW5kIHRoZSBjb29raWUuCgogICAgVGhlIG9yaWdpbmFsIHJlcXVlc3Qgb2JqZWN0IGlzIHJlYWQtb25seS4gVGhlIGNsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgY29sbGVjdGluZwogICAgdGhlIG5ldyBoZWFkZXJzIHZpYSBgZ2V0X25ld19oZWFkZXJzKClgIGFuZCBpbnRlcnByZXRpbmcgdGhlbSBhcHByb3ByaWF0ZWx5LiBZb3UKICAgIHByb2JhYmx5IHdhbnQgYGdldF9jb29raWVfaGVhZGVyYCwgZGVmaW5lZCBiZWxvdy4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXF1ZXN0KToKICAgICAgICBzZWxmLl9yID0gcmVxdWVzdAogICAgICAgIHNlbGYuX25ld19oZWFkZXJzID0ge30KICAgICAgICBzZWxmLnR5cGUgPSB1cmxwYXJzZShzZWxmLl9yLnVybCkuc2NoZW1lCgogICAgZGVmIGdldF90eXBlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnR5cGUKCiAgICBkZWYgZ2V0X2hvc3Qoc2VsZik6CiAgICAgICAgcmV0dXJuIHVybHBhcnNlKHNlbGYuX3IudXJsKS5uZXRsb2MKCiAgICBkZWYgZ2V0X29yaWdpbl9yZXFfaG9zdChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5nZXRfaG9zdCgpCgogICAgZGVmIGdldF9mdWxsX3VybChzZWxmKToKICAgICAgICAjIE9ubHkgcmV0dXJuIHRoZSByZXNwb25zZSdzIFVSTCBpZiB0aGUgdXNlciBoYWRuJ3Qgc2V0IHRoZSBIb3N0CiAgICAgICAgIyBoZWFkZXIKICAgICAgICBpZiBub3Qgc2VsZi5fci5oZWFkZXJzLmdldCgnSG9zdCcpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fci51cmwKICAgICAgICAjIElmIHRoZXkgZGlkIHNldCBpdCwgcmV0cmlldmUgaXQgYW5kIHJlY29uc3RydWN0IHRoZSBleHBlY3RlZCBkb21haW4KICAgICAgICBob3N0ID0gdG9fbmF0aXZlX3N0cmluZyhzZWxmLl9yLmhlYWRlcnNbJ0hvc3QnXSwgZW5jb2Rpbmc9J3V0Zi04JykKICAgICAgICBwYXJzZWQgPSB1cmxwYXJzZShzZWxmLl9yLnVybCkKICAgICAgICAjIFJlY29uc3RydWN0IHRoZSBVUkwgYXMgd2UgZXhwZWN0IGl0CiAgICAgICAgcmV0dXJuIHVybHVucGFyc2UoWwogICAgICAgICAgICBwYXJzZWQuc2NoZW1lLCBob3N0LCBwYXJzZWQucGF0aCwgcGFyc2VkLnBhcmFtcywgcGFyc2VkLnF1ZXJ5LAogICAgICAgICAgICBwYXJzZWQuZnJhZ21lbnQKICAgICAgICBdKQoKICAgIGRlZiBpc191bnZlcmlmaWFibGUoc2VsZik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgaGFzX2hlYWRlcihzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gbmFtZSBpbiBzZWxmLl9yLmhlYWRlcnMgb3IgbmFtZSBpbiBzZWxmLl9uZXdfaGVhZGVycwoKICAgIGRlZiBnZXRfaGVhZGVyKHNlbGYsIG5hbWUsIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX3IuaGVhZGVycy5nZXQobmFtZSwgc2VsZi5fbmV3X2hlYWRlcnMuZ2V0KG5hbWUsIGRlZmF1bHQpKQoKICAgIGRlZiBhZGRfaGVhZGVyKHNlbGYsIGtleSwgdmFsKToKICAgICAgICAiIiJjb29raWVsaWIgaGFzIG5vIGxlZ2l0aW1hdGUgdXNlIGZvciB0aGlzIG1ldGhvZDsgYWRkIGl0IGJhY2sgaWYgeW91IGZpbmQgb25lLiIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoIkNvb2tpZSBoZWFkZXJzIHNob3VsZCBiZSBhZGRlZCB3aXRoIGFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKCkiKQoKICAgIGRlZiBhZGRfdW5yZWRpcmVjdGVkX2hlYWRlcihzZWxmLCBuYW1lLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fbmV3X2hlYWRlcnNbbmFtZV0gPSB2YWx1ZQoKICAgIGRlZiBnZXRfbmV3X2hlYWRlcnMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX25ld19oZWFkZXJzCgogICAgQHByb3BlcnR5CiAgICBkZWYgdW52ZXJpZmlhYmxlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmlzX3VudmVyaWZpYWJsZSgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgb3JpZ2luX3JlcV9ob3N0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmdldF9vcmlnaW5fcmVxX2hvc3QoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGhvc3Qoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X2hvc3QoKQoKCmNsYXNzIE1vY2tSZXNwb25zZShvYmplY3QpOgogICAgIiIiV3JhcHMgYSBgaHR0cGxpYi5IVFRQTWVzc2FnZWAgdG8gbWltaWMgYSBgdXJsbGliLmFkZGluZm91cmxgLgoKICAgIC4uLndoYXQ/IEJhc2ljYWxseSwgZXhwb3NlIHRoZSBwYXJzZWQgSFRUUCBoZWFkZXJzIGZyb20gdGhlIHNlcnZlciByZXNwb25zZQogICAgdGhlIHdheSBgY29va2llbGliYCBleHBlY3RzIHRvIHNlZSB0aGVtLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhlYWRlcnMpOgogICAgICAgICIiIk1ha2UgYSBNb2NrUmVzcG9uc2UgZm9yIGBjb29raWVsaWJgIHRvIHJlYWQuCgogICAgICAgIDpwYXJhbSBoZWFkZXJzOiBhIGh0dHBsaWIuSFRUUE1lc3NhZ2Ugb3IgYW5hbG9nb3VzIGNhcnJ5aW5nIHRoZSBoZWFkZXJzCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5faGVhZGVycyA9IGhlYWRlcnMKCiAgICBkZWYgaW5mbyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5faGVhZGVycwoKICAgIGRlZiBnZXRoZWFkZXJzKHNlbGYsIG5hbWUpOgogICAgICAgIHNlbGYuX2hlYWRlcnMuZ2V0aGVhZGVycyhuYW1lKQoKCmRlZiBleHRyYWN0X2Nvb2tpZXNfdG9famFyKGphciwgcmVxdWVzdCwgcmVzcG9uc2UpOgogICAgIiIiRXh0cmFjdCB0aGUgY29va2llcyBmcm9tIHRoZSByZXNwb25zZSBpbnRvIGEgQ29va2llSmFyLgoKICAgIDpwYXJhbSBqYXI6IGNvb2tpZWxpYi5Db29raWVKYXIgKG5vdCBuZWNlc3NhcmlseSBhIFJlcXVlc3RzQ29va2llSmFyKQogICAgOnBhcmFtIHJlcXVlc3Q6IG91ciBvd24gcmVxdWVzdHMuUmVxdWVzdCBvYmplY3QKICAgIDpwYXJhbSByZXNwb25zZTogdXJsbGliMy5IVFRQUmVzcG9uc2Ugb2JqZWN0CiAgICAiIiIKICAgIGlmIG5vdCAoaGFzYXR0cihyZXNwb25zZSwgJ19vcmlnaW5hbF9yZXNwb25zZScpIGFuZAogICAgICAgICAgICByZXNwb25zZS5fb3JpZ2luYWxfcmVzcG9uc2UpOgogICAgICAgIHJldHVybgogICAgIyB0aGUgX29yaWdpbmFsX3Jlc3BvbnNlIGZpZWxkIGlzIHRoZSB3cmFwcGVkIGh0dHBsaWIuSFRUUFJlc3BvbnNlIG9iamVjdCwKICAgIHJlcSA9IE1vY2tSZXF1ZXN0KHJlcXVlc3QpCiAgICAjIHB1bGwgb3V0IHRoZSBIVFRQTWVzc2FnZSB3aXRoIHRoZSBoZWFkZXJzIGFuZCBwdXQgaXQgaW4gdGhlIG1vY2s6CiAgICByZXMgPSBNb2NrUmVzcG9uc2UocmVzcG9uc2UuX29yaWdpbmFsX3Jlc3BvbnNlLm1zZykKICAgIGphci5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCgoKZGVmIGdldF9jb29raWVfaGVhZGVyKGphciwgcmVxdWVzdCk6CiAgICAiIiIKICAgIFByb2R1Y2UgYW4gYXBwcm9wcmlhdGUgQ29va2llIGhlYWRlciBzdHJpbmcgdG8gYmUgc2VudCB3aXRoIGByZXF1ZXN0YCwgb3IgTm9uZS4KCiAgICA6cnR5cGU6IHN0cgogICAgIiIiCiAgICByID0gTW9ja1JlcXVlc3QocmVxdWVzdCkKICAgIGphci5hZGRfY29va2llX2hlYWRlcihyKQogICAgcmV0dXJuIHIuZ2V0X25ld19oZWFkZXJzKCkuZ2V0KCdDb29raWUnKQoKCmRlZiByZW1vdmVfY29va2llX2J5X25hbWUoY29va2llamFyLCBuYW1lLCBkb21haW49Tm9uZSwgcGF0aD1Ob25lKToKICAgICIiIlVuc2V0cyBhIGNvb2tpZSBieSBuYW1lLCBieSBkZWZhdWx0IG92ZXIgYWxsIGRvbWFpbnMgYW5kIHBhdGhzLgoKICAgIFdyYXBzIENvb2tpZUphci5jbGVhcigpLCBpcyBPKG4pLgogICAgIiIiCiAgICBjbGVhcmFibGVzID0gW10KICAgIGZvciBjb29raWUgaW4gY29va2llamFyOgogICAgICAgIGlmIGNvb2tpZS5uYW1lICE9IG5hbWU6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaWYgZG9tYWluIGlzIG5vdCBOb25lIGFuZCBkb21haW4gIT0gY29va2llLmRvbWFpbjoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiBwYXRoIGlzIG5vdCBOb25lIGFuZCBwYXRoICE9IGNvb2tpZS5wYXRoOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGNsZWFyYWJsZXMuYXBwZW5kKChjb29raWUuZG9tYWluLCBjb29raWUucGF0aCwgY29va2llLm5hbWUpKQoKICAgIGZvciBkb21haW4sIHBhdGgsIG5hbWUgaW4gY2xlYXJhYmxlczoKICAgICAgICBjb29raWVqYXIuY2xlYXIoZG9tYWluLCBwYXRoLCBuYW1lKQoKCmNsYXNzIENvb2tpZUNvbmZsaWN0RXJyb3IoUnVudGltZUVycm9yKToKICAgICIiIlRoZXJlIGFyZSB0d28gY29va2llcyB0aGF0IG1lZXQgdGhlIGNyaXRlcmlhIHNwZWNpZmllZCBpbiB0aGUgY29va2llIGphci4KICAgIFVzZSAuZ2V0IGFuZCAuc2V0IGFuZCBpbmNsdWRlIGRvbWFpbiBhbmQgcGF0aCBhcmdzIGluIG9yZGVyIHRvIGJlIG1vcmUgc3BlY2lmaWMuCiAgICAiIiIKCgpjbGFzcyBSZXF1ZXN0c0Nvb2tpZUphcihjb29raWVsaWIuQ29va2llSmFyLCBjb2xsZWN0aW9ucy5NdXRhYmxlTWFwcGluZyk6CiAgICAiIiJDb21wYXRpYmlsaXR5IGNsYXNzOyBpcyBhIGNvb2tpZWxpYi5Db29raWVKYXIsIGJ1dCBleHBvc2VzIGEgZGljdAogICAgaW50ZXJmYWNlLgoKICAgIFRoaXMgaXMgdGhlIENvb2tpZUphciB3ZSBjcmVhdGUgYnkgZGVmYXVsdCBmb3IgcmVxdWVzdHMgYW5kIHNlc3Npb25zIHRoYXQKICAgIGRvbid0IHNwZWNpZnkgb25lLCBzaW5jZSBzb21lIGNsaWVudHMgbWF5IGV4cGVjdCByZXNwb25zZS5jb29raWVzIGFuZAogICAgc2Vzc2lvbi5jb29raWVzIHRvIHN1cHBvcnQgZGljdCBvcGVyYXRpb25zLgoKICAgIFJlcXVlc3RzIGRvZXMgbm90IHVzZSB0aGUgZGljdCBpbnRlcmZhY2UgaW50ZXJuYWxseTsgaXQncyBqdXN0IGZvcgogICAgY29tcGF0aWJpbGl0eSB3aXRoIGV4dGVybmFsIGNsaWVudCBjb2RlLiBBbGwgcmVxdWVzdHMgY29kZSBzaG91bGQgd29yawogICAgb3V0IG9mIHRoZSBib3ggd2l0aCBleHRlcm5hbGx5IHByb3ZpZGVkIGluc3RhbmNlcyBvZiBgYENvb2tpZUphcmBgLCBlLmcuCiAgICBgYExXUENvb2tpZUphcmBgIGFuZCBgYEZpbGVDb29raWVKYXJgYC4KCiAgICBVbmxpa2UgYSByZWd1bGFyIENvb2tpZUphciwgdGhpcyBjbGFzcyBpcyBwaWNrbGVhYmxlLgoKICAgIC4uIHdhcm5pbmc6OiBkaWN0aW9uYXJ5IG9wZXJhdGlvbnMgdGhhdCBhcmUgbm9ybWFsbHkgTygxKSBtYXkgYmUgTyhuKS4KICAgICIiIgoKICAgIGRlZiBnZXQoc2VsZiwgbmFtZSwgZGVmYXVsdD1Ob25lLCBkb21haW49Tm9uZSwgcGF0aD1Ob25lKToKICAgICAgICAiIiJEaWN0LWxpa2UgZ2V0KCkgdGhhdCBhbHNvIHN1cHBvcnRzIG9wdGlvbmFsIGRvbWFpbiBhbmQgcGF0aCBhcmdzIGluCiAgICAgICAgb3JkZXIgdG8gcmVzb2x2ZSBuYW1pbmcgY29sbGlzaW9ucyBmcm9tIHVzaW5nIG9uZSBjb29raWUgamFyIG92ZXIKICAgICAgICBtdWx0aXBsZSBkb21haW5zLgoKICAgICAgICAuLiB3YXJuaW5nOjogb3BlcmF0aW9uIGlzIE8obiksIG5vdCBPKDEpLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbmRfbm9fZHVwbGljYXRlcyhuYW1lLCBkb21haW4sIHBhdGgpCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByZXR1cm4gZGVmYXVsdAoKICAgIGRlZiBzZXQoc2VsZiwgbmFtZSwgdmFsdWUsICoqa3dhcmdzKToKICAgICAgICAiIiJEaWN0LWxpa2Ugc2V0KCkgdGhhdCBhbHNvIHN1cHBvcnRzIG9wdGlvbmFsIGRvbWFpbiBhbmQgcGF0aCBhcmdzIGluCiAgICAgICAgb3JkZXIgdG8gcmVzb2x2ZSBuYW1pbmcgY29sbGlzaW9ucyBmcm9tIHVzaW5nIG9uZSBjb29raWUgamFyIG92ZXIKICAgICAgICBtdWx0aXBsZSBkb21haW5zLgogICAgICAgICIiIgogICAgICAgICMgc3VwcG9ydCBjbGllbnQgY29kZSB0aGF0IHVuc2V0cyBjb29raWVzIGJ5IGFzc2lnbm1lbnQgb2YgYSBOb25lIHZhbHVlOgogICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgIHJlbW92ZV9jb29raWVfYnlfbmFtZShzZWxmLCBuYW1lLCBkb21haW49a3dhcmdzLmdldCgnZG9tYWluJyksIHBhdGg9a3dhcmdzLmdldCgncGF0aCcpKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgTW9yc2VsKToKICAgICAgICAgICAgYyA9IG1vcnNlbF90b19jb29raWUodmFsdWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYyA9IGNyZWF0ZV9jb29raWUobmFtZSwgdmFsdWUsICoqa3dhcmdzKQogICAgICAgIHNlbGYuc2V0X2Nvb2tpZShjKQogICAgICAgIHJldHVybiBjCgogICAgZGVmIGl0ZXJrZXlzKHNlbGYpOgogICAgICAgICIiIkRpY3QtbGlrZSBpdGVya2V5cygpIHRoYXQgcmV0dXJucyBhbiBpdGVyYXRvciBvZiBuYW1lcyBvZiBjb29raWVzCiAgICAgICAgZnJvbSB0aGUgamFyLgoKICAgICAgICAuLiBzZWVhbHNvOjogaXRlcnZhbHVlcygpIGFuZCBpdGVyaXRlbXMoKS4KICAgICAgICAiIiIKICAgICAgICBmb3IgY29va2llIGluIGl0ZXIoc2VsZik6CiAgICAgICAgICAgIHlpZWxkIGNvb2tpZS5uYW1lCgogICAgZGVmIGtleXMoc2VsZik6CiAgICAgICAgIiIiRGljdC1saWtlIGtleXMoKSB0aGF0IHJldHVybnMgYSBsaXN0IG9mIG5hbWVzIG9mIGNvb2tpZXMgZnJvbSB0aGUKICAgICAgICBqYXIuCgogICAgICAgIC4uIHNlZWFsc286OiB2YWx1ZXMoKSBhbmQgaXRlbXMoKS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJrZXlzKCkpCgogICAgZGVmIGl0ZXJ2YWx1ZXMoc2VsZik6CiAgICAgICAgIiIiRGljdC1saWtlIGl0ZXJ2YWx1ZXMoKSB0aGF0IHJldHVybnMgYW4gaXRlcmF0b3Igb2YgdmFsdWVzIG9mIGNvb2tpZXMKICAgICAgICBmcm9tIHRoZSBqYXIuCgogICAgICAgIC4uIHNlZWFsc286OiBpdGVya2V5cygpIGFuZCBpdGVyaXRlbXMoKS4KICAgICAgICAiIiIKICAgICAgICBmb3IgY29va2llIGluIGl0ZXIoc2VsZik6CiAgICAgICAgICAgIHlpZWxkIGNvb2tpZS52YWx1ZQoKICAgIGRlZiB2YWx1ZXMoc2VsZik6CiAgICAgICAgIiIiRGljdC1saWtlIHZhbHVlcygpIHRoYXQgcmV0dXJucyBhIGxpc3Qgb2YgdmFsdWVzIG9mIGNvb2tpZXMgZnJvbSB0aGUKICAgICAgICBqYXIuCgogICAgICAgIC4uIHNlZWFsc286OiBrZXlzKCkgYW5kIGl0ZW1zKCkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVydmFsdWVzKCkpCgogICAgZGVmIGl0ZXJpdGVtcyhzZWxmKToKICAgICAgICAiIiJEaWN0LWxpa2UgaXRlcml0ZW1zKCkgdGhhdCByZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIG5hbWUtdmFsdWUgdHVwbGVzCiAgICAgICAgZnJvbSB0aGUgamFyLgoKICAgICAgICAuLiBzZWVhbHNvOjogaXRlcmtleXMoKSBhbmQgaXRlcnZhbHVlcygpLgogICAgICAgICIiIgogICAgICAgIGZvciBjb29raWUgaW4gaXRlcihzZWxmKToKICAgICAgICAgICAgeWllbGQgY29va2llLm5hbWUsIGNvb2tpZS52YWx1ZQoKICAgIGRlZiBpdGVtcyhzZWxmKToKICAgICAgICAiIiJEaWN0LWxpa2UgaXRlbXMoKSB0aGF0IHJldHVybnMgYSBsaXN0IG9mIG5hbWUtdmFsdWUgdHVwbGVzIGZyb20gdGhlCiAgICAgICAgamFyLiBBbGxvd3MgY2xpZW50LWNvZGUgdG8gY2FsbCBgYGRpY3QoUmVxdWVzdHNDb29raWVKYXIpYGAgYW5kIGdldCBhCiAgICAgICAgdmFuaWxsYSBweXRob24gZGljdCBvZiBrZXkgdmFsdWUgcGFpcnMuCgogICAgICAgIC4uIHNlZWFsc286OiBrZXlzKCkgYW5kIHZhbHVlcygpLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcml0ZW1zKCkpCgogICAgZGVmIGxpc3RfZG9tYWlucyhzZWxmKToKICAgICAgICAiIiJVdGlsaXR5IG1ldGhvZCB0byBsaXN0IGFsbCB0aGUgZG9tYWlucyBpbiB0aGUgamFyLiIiIgogICAgICAgIGRvbWFpbnMgPSBbXQogICAgICAgIGZvciBjb29raWUgaW4gaXRlcihzZWxmKToKICAgICAgICAgICAgaWYgY29va2llLmRvbWFpbiBub3QgaW4gZG9tYWluczoKICAgICAgICAgICAgICAgIGRvbWFpbnMuYXBwZW5kKGNvb2tpZS5kb21haW4pCiAgICAgICAgcmV0dXJuIGRvbWFpbnMKCiAgICBkZWYgbGlzdF9wYXRocyhzZWxmKToKICAgICAgICAiIiJVdGlsaXR5IG1ldGhvZCB0byBsaXN0IGFsbCB0aGUgcGF0aHMgaW4gdGhlIGphci4iIiIKICAgICAgICBwYXRocyA9IFtdCiAgICAgICAgZm9yIGNvb2tpZSBpbiBpdGVyKHNlbGYpOgogICAgICAgICAgICBpZiBjb29raWUucGF0aCBub3QgaW4gcGF0aHM6CiAgICAgICAgICAgICAgICBwYXRocy5hcHBlbmQoY29va2llLnBhdGgpCiAgICAgICAgcmV0dXJuIHBhdGhzCgogICAgZGVmIG11bHRpcGxlX2RvbWFpbnMoc2VsZik6CiAgICAgICAgIiIiUmV0dXJucyBUcnVlIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBkb21haW5zIGluIHRoZSBqYXIuCiAgICAgICAgUmV0dXJucyBGYWxzZSBvdGhlcndpc2UuCgogICAgICAgIDpydHlwZTogYm9vbAogICAgICAgICIiIgogICAgICAgIGRvbWFpbnMgPSBbXQogICAgICAgIGZvciBjb29raWUgaW4gaXRlcihzZWxmKToKICAgICAgICAgICAgaWYgY29va2llLmRvbWFpbiBpcyBub3QgTm9uZSBhbmQgY29va2llLmRvbWFpbiBpbiBkb21haW5zOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgZG9tYWlucy5hcHBlbmQoY29va2llLmRvbWFpbikKICAgICAgICByZXR1cm4gRmFsc2UgICMgdGhlcmUgaXMgb25seSBvbmUgZG9tYWluIGluIGphcgoKICAgIGRlZiBnZXRfZGljdChzZWxmLCBkb21haW49Tm9uZSwgcGF0aD1Ob25lKToKICAgICAgICAiIiJUYWtlcyBhcyBhbiBhcmd1bWVudCBhbiBvcHRpb25hbCBkb21haW4gYW5kIHBhdGggYW5kIHJldHVybnMgYSBwbGFpbgogICAgICAgIG9sZCBQeXRob24gZGljdCBvZiBuYW1lLXZhbHVlIHBhaXJzIG9mIGNvb2tpZXMgdGhhdCBtZWV0IHRoZQogICAgICAgIHJlcXVpcmVtZW50cy4KCiAgICAgICAgOnJ0eXBlOiBkaWN0CiAgICAgICAgIiIiCiAgICAgICAgZGljdGlvbmFyeSA9IHt9CiAgICAgICAgZm9yIGNvb2tpZSBpbiBpdGVyKHNlbGYpOgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAoZG9tYWluIGlzIE5vbmUgb3IgY29va2llLmRvbWFpbiA9PSBkb21haW4pIGFuZAogICAgICAgICAgICAgICAgKHBhdGggaXMgTm9uZSBvciBjb29raWUucGF0aCA9PSBwYXRoKQogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgZGljdGlvbmFyeVtjb29raWUubmFtZV0gPSBjb29raWUudmFsdWUKICAgICAgICByZXR1cm4gZGljdGlvbmFyeQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgbmFtZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3VwZXIoUmVxdWVzdHNDb29raWVKYXIsIHNlbGYpLl9fY29udGFpbnNfXyhuYW1lKQogICAgICAgIGV4Y2VwdCBDb29raWVDb25mbGljdEVycm9yOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBuYW1lKToKICAgICAgICAiIiJEaWN0LWxpa2UgX19nZXRpdGVtX18oKSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGNsaWVudCBjb2RlLiBUaHJvd3MKICAgICAgICBleGNlcHRpb24gaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgY29va2llIHdpdGggbmFtZS4gSW4gdGhhdCBjYXNlLAogICAgICAgIHVzZSB0aGUgbW9yZSBleHBsaWNpdCBnZXQoKSBtZXRob2QgaW5zdGVhZC4KCiAgICAgICAgLi4gd2FybmluZzo6IG9wZXJhdGlvbiBpcyBPKG4pLCBub3QgTygxKS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fZmluZF9ub19kdXBsaWNhdGVzKG5hbWUpCgogICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIG5hbWUsIHZhbHVlKToKICAgICAgICAiIiJEaWN0LWxpa2UgX19zZXRpdGVtX18gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBjbGllbnQgY29kZS4gVGhyb3dzCiAgICAgICAgZXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFscmVhZHkgYSBjb29raWUgb2YgdGhhdCBuYW1lIGluIHRoZSBqYXIuIEluIHRoYXQKICAgICAgICBjYXNlLCB1c2UgdGhlIG1vcmUgZXhwbGljaXQgc2V0KCkgbWV0aG9kIGluc3RlYWQuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5zZXQobmFtZSwgdmFsdWUpCgogICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIG5hbWUpOgogICAgICAgICIiIkRlbGV0ZXMgYSBjb29raWUgZ2l2ZW4gYSBuYW1lLiBXcmFwcyBgYGNvb2tpZWxpYi5Db29raWVKYXJgYCdzCiAgICAgICAgYGByZW1vdmVfY29va2llX2J5X25hbWUoKWBgLgogICAgICAgICIiIgogICAgICAgIHJlbW92ZV9jb29raWVfYnlfbmFtZShzZWxmLCBuYW1lKQoKICAgIGRlZiBzZXRfY29va2llKHNlbGYsIGNvb2tpZSwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBpZiBoYXNhdHRyKGNvb2tpZS52YWx1ZSwgJ3N0YXJ0c3dpdGgnKSBhbmQgY29va2llLnZhbHVlLnN0YXJ0c3dpdGgoJyInKSBhbmQgY29va2llLnZhbHVlLmVuZHN3aXRoKCciJyk6CiAgICAgICAgICAgIGNvb2tpZS52YWx1ZSA9IGNvb2tpZS52YWx1ZS5yZXBsYWNlKCdcXCInLCAnJykKICAgICAgICByZXR1cm4gc3VwZXIoUmVxdWVzdHNDb29raWVKYXIsIHNlbGYpLnNldF9jb29raWUoY29va2llLCAqYXJncywgKiprd2FyZ3MpCgogICAgZGVmIHVwZGF0ZShzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiVXBkYXRlcyB0aGlzIGphciB3aXRoIGNvb2tpZXMgZnJvbSBhbm90aGVyIENvb2tpZUphciBvciBkaWN0LWxpa2UiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBjb29raWVsaWIuQ29va2llSmFyKToKICAgICAgICAgICAgZm9yIGNvb2tpZSBpbiBvdGhlcjoKICAgICAgICAgICAgICAgIHNlbGYuc2V0X2Nvb2tpZShjb3B5LmNvcHkoY29va2llKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdXBlcihSZXF1ZXN0c0Nvb2tpZUphciwgc2VsZikudXBkYXRlKG90aGVyKQoKICAgIGRlZiBfZmluZChzZWxmLCBuYW1lLCBkb21haW49Tm9uZSwgcGF0aD1Ob25lKToKICAgICAgICAiIiJSZXF1ZXN0cyB1c2VzIHRoaXMgbWV0aG9kIGludGVybmFsbHkgdG8gZ2V0IGNvb2tpZSB2YWx1ZXMuCgogICAgICAgIElmIHRoZXJlIGFyZSBjb25mbGljdGluZyBjb29raWVzLCBfZmluZCBhcmJpdHJhcmlseSBjaG9vc2VzIG9uZS4KICAgICAgICBTZWUgX2ZpbmRfbm9fZHVwbGljYXRlcyBpZiB5b3Ugd2FudCBhbiBleGNlcHRpb24gdGhyb3duIGlmIHRoZXJlIGFyZQogICAgICAgIGNvbmZsaWN0aW5nIGNvb2tpZXMuCgogICAgICAgIDpwYXJhbSBuYW1lOiBhIHN0cmluZyBjb250YWluaW5nIG5hbWUgb2YgY29va2llCiAgICAgICAgOnBhcmFtIGRvbWFpbjogKG9wdGlvbmFsKSBzdHJpbmcgY29udGFpbmluZyBkb21haW4gb2YgY29va2llCiAgICAgICAgOnBhcmFtIHBhdGg6IChvcHRpb25hbCkgc3RyaW5nIGNvbnRhaW5pbmcgcGF0aCBvZiBjb29raWUKICAgICAgICA6cmV0dXJuOiBjb29raWUudmFsdWUKICAgICAgICAiIiIKICAgICAgICBmb3IgY29va2llIGluIGl0ZXIoc2VsZik6CiAgICAgICAgICAgIGlmIGNvb2tpZS5uYW1lID09IG5hbWU6CiAgICAgICAgICAgICAgICBpZiBkb21haW4gaXMgTm9uZSBvciBjb29raWUuZG9tYWluID09IGRvbWFpbjoKICAgICAgICAgICAgICAgICAgICBpZiBwYXRoIGlzIE5vbmUgb3IgY29va2llLnBhdGggPT0gcGF0aDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvb2tpZS52YWx1ZQoKICAgICAgICByYWlzZSBLZXlFcnJvcignbmFtZT0lciwgZG9tYWluPSVyLCBwYXRoPSVyJyAlIChuYW1lLCBkb21haW4sIHBhdGgpKQoKICAgIGRlZiBfZmluZF9ub19kdXBsaWNhdGVzKHNlbGYsIG5hbWUsIGRvbWFpbj1Ob25lLCBwYXRoPU5vbmUpOgogICAgICAgICIiIkJvdGggYGBfX2dldF9pdGVtX19gYCBhbmQgYGBnZXRgYCBjYWxsIHRoaXMgZnVuY3Rpb246IGl0J3MgbmV2ZXIKICAgICAgICB1c2VkIGVsc2V3aGVyZSBpbiBSZXF1ZXN0cy4KCiAgICAgICAgOnBhcmFtIG5hbWU6IGEgc3RyaW5nIGNvbnRhaW5pbmcgbmFtZSBvZiBjb29raWUKICAgICAgICA6cGFyYW0gZG9tYWluOiAob3B0aW9uYWwpIHN0cmluZyBjb250YWluaW5nIGRvbWFpbiBvZiBjb29raWUKICAgICAgICA6cGFyYW0gcGF0aDogKG9wdGlvbmFsKSBzdHJpbmcgY29udGFpbmluZyBwYXRoIG9mIGNvb2tpZQogICAgICAgIDpyYWlzZXMgS2V5RXJyb3I6IGlmIGNvb2tpZSBpcyBub3QgZm91bmQKICAgICAgICA6cmFpc2VzIENvb2tpZUNvbmZsaWN0RXJyb3I6IGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb29raWVzCiAgICAgICAgICAgIHRoYXQgbWF0Y2ggbmFtZSBhbmQgb3B0aW9uYWxseSBkb21haW4gYW5kIHBhdGgKICAgICAgICA6cmV0dXJuOiBjb29raWUudmFsdWUKICAgICAgICAiIiIKICAgICAgICB0b1JldHVybiA9IE5vbmUKICAgICAgICBmb3IgY29va2llIGluIGl0ZXIoc2VsZik6CiAgICAgICAgICAgIGlmIGNvb2tpZS5uYW1lID09IG5hbWU6CiAgICAgICAgICAgICAgICBpZiBkb21haW4gaXMgTm9uZSBvciBjb29raWUuZG9tYWluID09IGRvbWFpbjoKICAgICAgICAgICAgICAgICAgICBpZiBwYXRoIGlzIE5vbmUgb3IgY29va2llLnBhdGggPT0gcGF0aDoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdG9SZXR1cm4gaXMgbm90IE5vbmU6ICAjIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb29raWVzIHRoYXQgbWVldCBwYXNzZWQgaW4gY3JpdGVyaWEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIENvb2tpZUNvbmZsaWN0RXJyb3IoJ1RoZXJlIGFyZSBtdWx0aXBsZSBjb29raWVzIHdpdGggbmFtZSwgJXInICUgKG5hbWUpKQogICAgICAgICAgICAgICAgICAgICAgICB0b1JldHVybiA9IGNvb2tpZS52YWx1ZSAgIyB3ZSB3aWxsIGV2ZW50dWFsbHkgcmV0dXJuIHRoaXMgYXMgbG9uZyBhcyBubyBjb29raWUgY29uZmxpY3QKCiAgICAgICAgaWYgdG9SZXR1cm46CiAgICAgICAgICAgIHJldHVybiB0b1JldHVybgogICAgICAgIHJhaXNlIEtleUVycm9yKCduYW1lPSVyLCBkb21haW49JXIsIHBhdGg9JXInICUgKG5hbWUsIGRvbWFpbiwgcGF0aCkpCgogICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKICAgICAgICAiIiJVbmxpa2UgYSBub3JtYWwgQ29va2llSmFyLCB0aGlzIGNsYXNzIGlzIHBpY2tsZWFibGUuIiIiCiAgICAgICAgc3RhdGUgPSBzZWxmLl9fZGljdF9fLmNvcHkoKQogICAgICAgICMgcmVtb3ZlIHRoZSB1bnBpY2tsZWFibGUgUkxvY2sgb2JqZWN0CiAgICAgICAgc3RhdGUucG9wKCdfY29va2llc19sb2NrJykKICAgICAgICByZXR1cm4gc3RhdGUKCiAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKICAgICAgICAiIiJVbmxpa2UgYSBub3JtYWwgQ29va2llSmFyLCB0aGlzIGNsYXNzIGlzIHBpY2tsZWFibGUuIiIiCiAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUoc3RhdGUpCiAgICAgICAgaWYgJ19jb29raWVzX2xvY2snIG5vdCBpbiBzZWxmLl9fZGljdF9fOgogICAgICAgICAgICBzZWxmLl9jb29raWVzX2xvY2sgPSB0aHJlYWRpbmcuUkxvY2soKQoKICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgICIiIlJldHVybiBhIGNvcHkgb2YgdGhpcyBSZXF1ZXN0c0Nvb2tpZUphci4iIiIKICAgICAgICBuZXdfY2ogPSBSZXF1ZXN0c0Nvb2tpZUphcigpCiAgICAgICAgbmV3X2NqLnVwZGF0ZShzZWxmKQogICAgICAgIHJldHVybiBuZXdfY2oKCgpkZWYgX2NvcHlfY29va2llX2phcihqYXIpOgogICAgaWYgamFyIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBpZiBoYXNhdHRyKGphciwgJ2NvcHknKToKICAgICAgICAjIFdlJ3JlIGRlYWxpbmcgd2l0aCBhbiBpbnN0YW5jZSBvZiBSZXF1ZXN0c0Nvb2tpZUphcgogICAgICAgIHJldHVybiBqYXIuY29weSgpCiAgICAjIFdlJ3JlIGRlYWxpbmcgd2l0aCBhIGdlbmVyaWMgQ29va2llSmFyIGluc3RhbmNlCiAgICBuZXdfamFyID0gY29weS5jb3B5KGphcikKICAgIG5ld19qYXIuY2xlYXIoKQogICAgZm9yIGNvb2tpZSBpbiBqYXI6CiAgICAgICAgbmV3X2phci5zZXRfY29va2llKGNvcHkuY29weShjb29raWUpKQogICAgcmV0dXJuIG5ld19qYXIKCgpkZWYgY3JlYXRlX2Nvb2tpZShuYW1lLCB2YWx1ZSwgKiprd2FyZ3MpOgogICAgIiIiTWFrZSBhIGNvb2tpZSBmcm9tIHVuZGVyc3BlY2lmaWVkIHBhcmFtZXRlcnMuCgogICAgQnkgZGVmYXVsdCwgdGhlIHBhaXIgb2YgYG5hbWVgIGFuZCBgdmFsdWVgIHdpbGwgYmUgc2V0IGZvciB0aGUgZG9tYWluICcnCiAgICBhbmQgc2VudCBvbiBldmVyeSByZXF1ZXN0ICh0aGlzIGlzIHNvbWV0aW1lcyBjYWxsZWQgYSAic3VwZXJjb29raWUiKS4KICAgICIiIgogICAgcmVzdWx0ID0gZGljdCgKICAgICAgICB2ZXJzaW9uPTAsCiAgICAgICAgbmFtZT1uYW1lLAogICAgICAgIHZhbHVlPXZhbHVlLAogICAgICAgIHBvcnQ9Tm9uZSwKICAgICAgICBkb21haW49JycsCiAgICAgICAgcGF0aD0nLycsCiAgICAgICAgc2VjdXJlPUZhbHNlLAogICAgICAgIGV4cGlyZXM9Tm9uZSwKICAgICAgICBkaXNjYXJkPVRydWUsCiAgICAgICAgY29tbWVudD1Ob25lLAogICAgICAgIGNvbW1lbnRfdXJsPU5vbmUsCiAgICAgICAgcmVzdD17J0h0dHBPbmx5JzogTm9uZX0sCiAgICAgICAgcmZjMjEwOT1GYWxzZSwpCgogICAgYmFkYXJncyA9IHNldChrd2FyZ3MpIC0gc2V0KHJlc3VsdCkKICAgIGlmIGJhZGFyZ3M6CiAgICAgICAgZXJyID0gJ2NyZWF0ZV9jb29raWUoKSBnb3QgdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50czogJXMnCiAgICAgICAgcmFpc2UgVHlwZUVycm9yKGVyciAlIGxpc3QoYmFkYXJncykpCgogICAgcmVzdWx0LnVwZGF0ZShrd2FyZ3MpCiAgICByZXN1bHRbJ3BvcnRfc3BlY2lmaWVkJ10gPSBib29sKHJlc3VsdFsncG9ydCddKQogICAgcmVzdWx0Wydkb21haW5fc3BlY2lmaWVkJ10gPSBib29sKHJlc3VsdFsnZG9tYWluJ10pCiAgICByZXN1bHRbJ2RvbWFpbl9pbml0aWFsX2RvdCddID0gcmVzdWx0Wydkb21haW4nXS5zdGFydHN3aXRoKCcuJykKICAgIHJlc3VsdFsncGF0aF9zcGVjaWZpZWQnXSA9IGJvb2wocmVzdWx0WydwYXRoJ10pCgogICAgcmV0dXJuIGNvb2tpZWxpYi5Db29raWUoKipyZXN1bHQpCgoKZGVmIG1vcnNlbF90b19jb29raWUobW9yc2VsKToKICAgICIiIkNvbnZlcnQgYSBNb3JzZWwgb2JqZWN0IGludG8gYSBDb29raWUgY29udGFpbmluZyB0aGUgb25lIGsvdiBwYWlyLiIiIgoKICAgIGV4cGlyZXMgPSBOb25lCiAgICBpZiBtb3JzZWxbJ21heC1hZ2UnXToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGV4cGlyZXMgPSBpbnQodGltZS50aW1lKCkgKyBpbnQobW9yc2VsWydtYXgtYWdlJ10pKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ21heC1hZ2U6ICVzIG11c3QgYmUgaW50ZWdlcicgJSBtb3JzZWxbJ21heC1hZ2UnXSkKICAgIGVsaWYgbW9yc2VsWydleHBpcmVzJ106CiAgICAgICAgdGltZV90ZW1wbGF0ZSA9ICclYSwgJWQtJWItJVkgJUg6JU06JVMgR01UJwogICAgICAgIGV4cGlyZXMgPSBjYWxlbmRhci50aW1lZ20oCiAgICAgICAgICAgIHRpbWUuc3RycHRpbWUobW9yc2VsWydleHBpcmVzJ10sIHRpbWVfdGVtcGxhdGUpCiAgICAgICAgKQogICAgcmV0dXJuIGNyZWF0ZV9jb29raWUoCiAgICAgICAgY29tbWVudD1tb3JzZWxbJ2NvbW1lbnQnXSwKICAgICAgICBjb21tZW50X3VybD1ib29sKG1vcnNlbFsnY29tbWVudCddKSwKICAgICAgICBkaXNjYXJkPUZhbHNlLAogICAgICAgIGRvbWFpbj1tb3JzZWxbJ2RvbWFpbiddLAogICAgICAgIGV4cGlyZXM9ZXhwaXJlcywKICAgICAgICBuYW1lPW1vcnNlbC5rZXksCiAgICAgICAgcGF0aD1tb3JzZWxbJ3BhdGgnXSwKICAgICAgICBwb3J0PU5vbmUsCiAgICAgICAgcmVzdD17J0h0dHBPbmx5JzogbW9yc2VsWydodHRwb25seSddfSwKICAgICAgICByZmMyMTA5PUZhbHNlLAogICAgICAgIHNlY3VyZT1ib29sKG1vcnNlbFsnc2VjdXJlJ10pLAogICAgICAgIHZhbHVlPW1vcnNlbC52YWx1ZSwKICAgICAgICB2ZXJzaW9uPW1vcnNlbFsndmVyc2lvbiddIG9yIDAsCiAgICApCgoKZGVmIGNvb2tpZWphcl9mcm9tX2RpY3QoY29va2llX2RpY3QsIGNvb2tpZWphcj1Ob25lLCBvdmVyd3JpdGU9VHJ1ZSk6CiAgICAiIiJSZXR1cm5zIGEgQ29va2llSmFyIGZyb20gYSBrZXkvdmFsdWUgZGljdGlvbmFyeS4KCiAgICA6cGFyYW0gY29va2llX2RpY3Q6IERpY3Qgb2Yga2V5L3ZhbHVlcyB0byBpbnNlcnQgaW50byBDb29raWVKYXIuCiAgICA6cGFyYW0gY29va2llamFyOiAob3B0aW9uYWwpIEEgY29va2llamFyIHRvIGFkZCB0aGUgY29va2llcyB0by4KICAgIDpwYXJhbSBvdmVyd3JpdGU6IChvcHRpb25hbCkgSWYgRmFsc2UsIHdpbGwgbm90IHJlcGxhY2UgY29va2llcwogICAgICAgIGFscmVhZHkgaW4gdGhlIGphciB3aXRoIG5ldyBvbmVzLgogICAgIiIiCiAgICBpZiBjb29raWVqYXIgaXMgTm9uZToKICAgICAgICBjb29raWVqYXIgPSBSZXF1ZXN0c0Nvb2tpZUphcigpCgogICAgaWYgY29va2llX2RpY3QgaXMgbm90IE5vbmU6CiAgICAgICAgbmFtZXNfZnJvbV9qYXIgPSBbY29va2llLm5hbWUgZm9yIGNvb2tpZSBpbiBjb29raWVqYXJdCiAgICAgICAgZm9yIG5hbWUgaW4gY29va2llX2RpY3Q6CiAgICAgICAgICAgIGlmIG92ZXJ3cml0ZSBvciAobmFtZSBub3QgaW4gbmFtZXNfZnJvbV9qYXIpOgogICAgICAgICAgICAgICAgY29va2llamFyLnNldF9jb29raWUoY3JlYXRlX2Nvb2tpZShuYW1lLCBjb29raWVfZGljdFtuYW1lXSkpCgogICAgcmV0dXJuIGNvb2tpZWphcgoKCmRlZiBtZXJnZV9jb29raWVzKGNvb2tpZWphciwgY29va2llcyk6CiAgICAiIiJBZGQgY29va2llcyB0byBjb29raWVqYXIgYW5kIHJldHVybnMgYSBtZXJnZWQgQ29va2llSmFyLgoKICAgIDpwYXJhbSBjb29raWVqYXI6IENvb2tpZUphciBvYmplY3QgdG8gYWRkIHRoZSBjb29raWVzIHRvLgogICAgOnBhcmFtIGNvb2tpZXM6IERpY3Rpb25hcnkgb3IgQ29va2llSmFyIG9iamVjdCB0byBiZSBhZGRlZC4KICAgICIiIgogICAgaWYgbm90IGlzaW5zdGFuY2UoY29va2llamFyLCBjb29raWVsaWIuQ29va2llSmFyKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdZb3UgY2FuIG9ubHkgbWVyZ2UgaW50byBDb29raWVKYXInKQoKICAgIGlmIGlzaW5zdGFuY2UoY29va2llcywgZGljdCk6CiAgICAgICAgY29va2llamFyID0gY29va2llamFyX2Zyb21fZGljdCgKICAgICAgICAgICAgY29va2llcywgY29va2llamFyPWNvb2tpZWphciwgb3ZlcndyaXRlPUZhbHNlKQogICAgZWxpZiBpc2luc3RhbmNlKGNvb2tpZXMsIGNvb2tpZWxpYi5Db29raWVKYXIpOgogICAgICAgIHRyeToKICAgICAgICAgICAgY29va2llamFyLnVwZGF0ZShjb29raWVzKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgZm9yIGNvb2tpZV9pbl9qYXIgaW4gY29va2llczoKICAgICAgICAgICAgICAgIGNvb2tpZWphci5zZXRfY29va2llKGNvb2tpZV9pbl9qYXIpCgogICAgcmV0dXJuIGNvb2tpZWphcgpQSwMEFAAAAAAAAAAhAPnO6dArDAAAKwwAADIAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvZXhjZXB0aW9ucy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMuZXhjZXB0aW9ucwp+fn5+fn5+fn5+fn5+fn5+fn5+CgpUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgc2V0IG9mIFJlcXVlc3RzJyBleGNlcHRpb25zLgoiIiIKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IEhUVFBFcnJvciBhcyBCYXNlSFRUUEVycm9yCgoKY2xhc3MgUmVxdWVzdEV4Y2VwdGlvbihJT0Vycm9yKToKICAgICIiIlRoZXJlIHdhcyBhbiBhbWJpZ3VvdXMgZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgeW91cgogICAgcmVxdWVzdC4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIkluaXRpYWxpemUgUmVxdWVzdEV4Y2VwdGlvbiB3aXRoIGByZXF1ZXN0YCBhbmQgYHJlc3BvbnNlYCBvYmplY3RzLiIiIgogICAgICAgIHJlc3BvbnNlID0ga3dhcmdzLnBvcCgncmVzcG9uc2UnLCBOb25lKQogICAgICAgIHNlbGYucmVzcG9uc2UgPSByZXNwb25zZQogICAgICAgIHNlbGYucmVxdWVzdCA9IGt3YXJncy5wb3AoJ3JlcXVlc3QnLCBOb25lKQogICAgICAgIGlmIChyZXNwb25zZSBpcyBub3QgTm9uZSBhbmQgbm90IHNlbGYucmVxdWVzdCBhbmQKICAgICAgICAgICAgICAgIGhhc2F0dHIocmVzcG9uc2UsICdyZXF1ZXN0JykpOgogICAgICAgICAgICBzZWxmLnJlcXVlc3QgPSBzZWxmLnJlc3BvbnNlLnJlcXVlc3QKICAgICAgICBzdXBlcihSZXF1ZXN0RXhjZXB0aW9uLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCgoKY2xhc3MgSFRUUEVycm9yKFJlcXVlc3RFeGNlcHRpb24pOgogICAgIiIiQW4gSFRUUCBlcnJvciBvY2N1cnJlZC4iIiIKCgpjbGFzcyBDb25uZWN0aW9uRXJyb3IoUmVxdWVzdEV4Y2VwdGlvbik6CiAgICAiIiJBIENvbm5lY3Rpb24gZXJyb3Igb2NjdXJyZWQuIiIiCgoKY2xhc3MgUHJveHlFcnJvcihDb25uZWN0aW9uRXJyb3IpOgogICAgIiIiQSBwcm94eSBlcnJvciBvY2N1cnJlZC4iIiIKCgpjbGFzcyBTU0xFcnJvcihDb25uZWN0aW9uRXJyb3IpOgogICAgIiIiQW4gU1NMIGVycm9yIG9jY3VycmVkLiIiIgoKCmNsYXNzIFRpbWVvdXQoUmVxdWVzdEV4Y2VwdGlvbik6CiAgICAiIiJUaGUgcmVxdWVzdCB0aW1lZCBvdXQuCgogICAgQ2F0Y2hpbmcgdGhpcyBlcnJvciB3aWxsIGNhdGNoIGJvdGgKICAgIDpleGM6YH5yZXF1ZXN0cy5leGNlcHRpb25zLkNvbm5lY3RUaW1lb3V0YCBhbmQKICAgIDpleGM6YH5yZXF1ZXN0cy5leGNlcHRpb25zLlJlYWRUaW1lb3V0YCBlcnJvcnMuCiAgICAiIiIKCgpjbGFzcyBDb25uZWN0VGltZW91dChDb25uZWN0aW9uRXJyb3IsIFRpbWVvdXQpOgogICAgIiIiVGhlIHJlcXVlc3QgdGltZWQgb3V0IHdoaWxlIHRyeWluZyB0byBjb25uZWN0IHRvIHRoZSByZW1vdGUgc2VydmVyLgoKICAgIFJlcXVlc3RzIHRoYXQgcHJvZHVjZWQgdGhpcyBlcnJvciBhcmUgc2FmZSB0byByZXRyeS4KICAgICIiIgoKCmNsYXNzIFJlYWRUaW1lb3V0KFRpbWVvdXQpOgogICAgIiIiVGhlIHNlcnZlciBkaWQgbm90IHNlbmQgYW55IGRhdGEgaW4gdGhlIGFsbG90dGVkIGFtb3VudCBvZiB0aW1lLiIiIgoKCmNsYXNzIFVSTFJlcXVpcmVkKFJlcXVlc3RFeGNlcHRpb24pOgogICAgIiIiQSB2YWxpZCBVUkwgaXMgcmVxdWlyZWQgdG8gbWFrZSBhIHJlcXVlc3QuIiIiCgoKY2xhc3MgVG9vTWFueVJlZGlyZWN0cyhSZXF1ZXN0RXhjZXB0aW9uKToKICAgICIiIlRvbyBtYW55IHJlZGlyZWN0cy4iIiIKCgpjbGFzcyBNaXNzaW5nU2NoZW1hKFJlcXVlc3RFeGNlcHRpb24sIFZhbHVlRXJyb3IpOgogICAgIiIiVGhlIFVSTCBzY2hlbWEgKGUuZy4gaHR0cCBvciBodHRwcykgaXMgbWlzc2luZy4iIiIKCgpjbGFzcyBJbnZhbGlkU2NoZW1hKFJlcXVlc3RFeGNlcHRpb24sIFZhbHVlRXJyb3IpOgogICAgIiIiU2VlIGRlZmF1bHRzLnB5IGZvciB2YWxpZCBzY2hlbWFzLiIiIgoKCmNsYXNzIEludmFsaWRVUkwoUmVxdWVzdEV4Y2VwdGlvbiwgVmFsdWVFcnJvcik6CiAgICAiIiJUaGUgVVJMIHByb3ZpZGVkIHdhcyBzb21laG93IGludmFsaWQuIiIiCgoKY2xhc3MgSW52YWxpZEhlYWRlcihSZXF1ZXN0RXhjZXB0aW9uLCBWYWx1ZUVycm9yKToKICAgICIiIlRoZSBoZWFkZXIgdmFsdWUgcHJvdmlkZWQgd2FzIHNvbWVob3cgaW52YWxpZC4iIiIKCgpjbGFzcyBDaHVua2VkRW5jb2RpbmdFcnJvcihSZXF1ZXN0RXhjZXB0aW9uKToKICAgICIiIlRoZSBzZXJ2ZXIgZGVjbGFyZWQgY2h1bmtlZCBlbmNvZGluZyBidXQgc2VudCBhbiBpbnZhbGlkIGNodW5rLiIiIgoKCmNsYXNzIENvbnRlbnREZWNvZGluZ0Vycm9yKFJlcXVlc3RFeGNlcHRpb24sIEJhc2VIVFRQRXJyb3IpOgogICAgIiIiRmFpbGVkIHRvIGRlY29kZSByZXNwb25zZSBjb250ZW50IiIiCgoKY2xhc3MgU3RyZWFtQ29uc3VtZWRFcnJvcihSZXF1ZXN0RXhjZXB0aW9uLCBUeXBlRXJyb3IpOgogICAgIiIiVGhlIGNvbnRlbnQgZm9yIHRoaXMgcmVzcG9uc2Ugd2FzIGFscmVhZHkgY29uc3VtZWQiIiIKCgpjbGFzcyBSZXRyeUVycm9yKFJlcXVlc3RFeGNlcHRpb24pOgogICAgIiIiQ3VzdG9tIHJldHJpZXMgbG9naWMgZmFpbGVkIiIiCgoKY2xhc3MgVW5yZXdpbmRhYmxlQm9keUVycm9yKFJlcXVlc3RFeGNlcHRpb24pOgogICAgIiIiUmVxdWVzdHMgZW5jb3VudGVyZWQgYW4gZXJyb3Igd2hlbiB0cnlpbmcgdG8gcmV3aW5kIGEgYm9keSIiIgoKIyBXYXJuaW5ncwoKCmNsYXNzIFJlcXVlc3RzV2FybmluZyhXYXJuaW5nKToKICAgICIiIkJhc2Ugd2FybmluZyBmb3IgUmVxdWVzdHMuIiIiCiAgICBwYXNzCgoKY2xhc3MgRmlsZU1vZGVXYXJuaW5nKFJlcXVlc3RzV2FybmluZywgRGVwcmVjYXRpb25XYXJuaW5nKToKICAgICIiIkEgZmlsZSB3YXMgb3BlbmVkIGluIHRleHQgbW9kZSwgYnV0IFJlcXVlc3RzIGRldGVybWluZWQgaXRzIGJpbmFyeSBsZW5ndGguIiIiCiAgICBwYXNzCgoKY2xhc3MgUmVxdWVzdHNEZXBlbmRlbmN5V2FybmluZyhSZXF1ZXN0c1dhcm5pbmcpOgogICAgIiIiQW4gaW1wb3J0ZWQgZGVwZW5kZW5jeSBkb2Vzbid0IG1hdGNoIHRoZSBleHBlY3RlZCB2ZXJzaW9uIHJhbmdlLiIiIgogICAgcGFzcwpQSwMEFAAAAAAAAAAhAIQdYOJTDgAAUw4AACwAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvaGVscC5weSIiIk1vZHVsZSBjb250YWluaW5nIGJ1ZyByZXBvcnQgaGVscGVyKHMpLiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCgppbXBvcnQganNvbgppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHN5cwppbXBvcnQgc3NsCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBpZG5hCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHVybGxpYjMKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgY2hhcmRldAoKZnJvbSAuIGltcG9ydCBfX3ZlcnNpb25fXyBhcyByZXF1ZXN0c192ZXJzaW9uCgp0cnk6CiAgICBmcm9tIC5wYWNrYWdlcy51cmxsaWIzLmNvbnRyaWIgaW1wb3J0IHB5b3BlbnNzbApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBweW9wZW5zc2wgPSBOb25lCiAgICBPcGVuU1NMID0gTm9uZQogICAgY3J5cHRvZ3JhcGh5ID0gTm9uZQplbHNlOgogICAgaW1wb3J0IE9wZW5TU0wKICAgIGltcG9ydCBjcnlwdG9ncmFwaHkKCgpkZWYgX2ltcGxlbWVudGF0aW9uKCk6CiAgICAiIiJSZXR1cm4gYSBkaWN0IHdpdGggdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBhbmQgdmVyc2lvbi4KCiAgICBQcm92aWRlIGJvdGggdGhlIG5hbWUgYW5kIHRoZSB2ZXJzaW9uIG9mIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24KICAgIGN1cnJlbnRseSBydW5uaW5nLiBGb3IgZXhhbXBsZSwgb24gQ1B5dGhvbiAyLjcuNSBpdCB3aWxsIHJldHVybgogICAgeyduYW1lJzogJ0NQeXRob24nLCAndmVyc2lvbic6ICcyLjcuNSd9LgoKICAgIFRoaXMgZnVuY3Rpb24gd29ya3MgYmVzdCBvbiBDUHl0aG9uIGFuZCBQeVB5OiBpbiBwYXJ0aWN1bGFyLCBpdCBwcm9iYWJseQogICAgZG9lc24ndCB3b3JrIGZvciBKeXRob24gb3IgSXJvblB5dGhvbi4gRnV0dXJlIGludmVzdGlnYXRpb24gc2hvdWxkIGJlIGRvbmUKICAgIHRvIHdvcmsgb3V0IHRoZSBjb3JyZWN0IHNoYXBlIG9mIHRoZSBjb2RlIGZvciB0aG9zZSBwbGF0Zm9ybXMuCiAgICAiIiIKICAgIGltcGxlbWVudGF0aW9uID0gcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCkKCiAgICBpZiBpbXBsZW1lbnRhdGlvbiA9PSAnQ1B5dGhvbic6CiAgICAgICAgaW1wbGVtZW50YXRpb25fdmVyc2lvbiA9IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCkKICAgIGVsaWYgaW1wbGVtZW50YXRpb24gPT0gJ1B5UHknOgogICAgICAgIGltcGxlbWVudGF0aW9uX3ZlcnNpb24gPSAnJXMuJXMuJXMnICUgKHN5cy5weXB5X3ZlcnNpb25faW5mby5tYWpvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMucHlweV92ZXJzaW9uX2luZm8ubWlub3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnB5cHlfdmVyc2lvbl9pbmZvLm1pY3JvKQogICAgICAgIGlmIHN5cy5weXB5X3ZlcnNpb25faW5mby5yZWxlYXNlbGV2ZWwgIT0gJ2ZpbmFsJzoKICAgICAgICAgICAgaW1wbGVtZW50YXRpb25fdmVyc2lvbiA9ICcnLmpvaW4oWwogICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25fdmVyc2lvbiwgc3lzLnB5cHlfdmVyc2lvbl9pbmZvLnJlbGVhc2VsZXZlbAogICAgICAgICAgICBdKQogICAgZWxpZiBpbXBsZW1lbnRhdGlvbiA9PSAnSnl0aG9uJzoKICAgICAgICBpbXBsZW1lbnRhdGlvbl92ZXJzaW9uID0gcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKSAgIyBDb21wbGV0ZSBHdWVzcwogICAgZWxpZiBpbXBsZW1lbnRhdGlvbiA9PSAnSXJvblB5dGhvbic6CiAgICAgICAgaW1wbGVtZW50YXRpb25fdmVyc2lvbiA9IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCkgICMgQ29tcGxldGUgR3Vlc3MKICAgIGVsc2U6CiAgICAgICAgaW1wbGVtZW50YXRpb25fdmVyc2lvbiA9ICdVbmtub3duJwoKICAgIHJldHVybiB7J25hbWUnOiBpbXBsZW1lbnRhdGlvbiwgJ3ZlcnNpb24nOiBpbXBsZW1lbnRhdGlvbl92ZXJzaW9ufQoKCmRlZiBpbmZvKCk6CiAgICAiIiJHZW5lcmF0ZSBpbmZvcm1hdGlvbiBmb3IgYSBidWcgcmVwb3J0LiIiIgogICAgdHJ5OgogICAgICAgIHBsYXRmb3JtX2luZm8gPSB7CiAgICAgICAgICAgICdzeXN0ZW0nOiBwbGF0Zm9ybS5zeXN0ZW0oKSwKICAgICAgICAgICAgJ3JlbGVhc2UnOiBwbGF0Zm9ybS5yZWxlYXNlKCksCiAgICAgICAgfQogICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgcGxhdGZvcm1faW5mbyA9IHsKICAgICAgICAgICAgJ3N5c3RlbSc6ICdVbmtub3duJywKICAgICAgICAgICAgJ3JlbGVhc2UnOiAnVW5rbm93bicsCiAgICAgICAgfQoKICAgIGltcGxlbWVudGF0aW9uX2luZm8gPSBfaW1wbGVtZW50YXRpb24oKQogICAgdXJsbGliM19pbmZvID0geyd2ZXJzaW9uJzogdXJsbGliMy5fX3ZlcnNpb25fX30KICAgIGNoYXJkZXRfaW5mbyA9IHsndmVyc2lvbic6IGNoYXJkZXQuX192ZXJzaW9uX199CgogICAgcHlvcGVuc3NsX2luZm8gPSB7CiAgICAgICAgJ3ZlcnNpb24nOiBOb25lLAogICAgICAgICdvcGVuc3NsX3ZlcnNpb24nOiAnJywKICAgIH0KICAgIGlmIE9wZW5TU0w6CiAgICAgICAgcHlvcGVuc3NsX2luZm8gPSB7CiAgICAgICAgICAgICd2ZXJzaW9uJzogT3BlblNTTC5fX3ZlcnNpb25fXywKICAgICAgICAgICAgJ29wZW5zc2xfdmVyc2lvbic6ICcleCcgJSBPcGVuU1NMLlNTTC5PUEVOU1NMX1ZFUlNJT05fTlVNQkVSLAogICAgICAgIH0KICAgIGNyeXB0b2dyYXBoeV9pbmZvID0gewogICAgICAgICd2ZXJzaW9uJzogZ2V0YXR0cihjcnlwdG9ncmFwaHksICdfX3ZlcnNpb25fXycsICcnKSwKICAgIH0KICAgIGlkbmFfaW5mbyA9IHsKICAgICAgICAndmVyc2lvbic6IGdldGF0dHIoaWRuYSwgJ19fdmVyc2lvbl9fJywgJycpLAogICAgfQoKICAgICMgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiBkb2Vzbid0IGV4aXN0IGluIHRoZSBQeXRob24gMi42IHNzbCBtb2R1bGUuCiAgICBzeXN0ZW1fc3NsID0gZ2V0YXR0cihzc2wsICdPUEVOU1NMX1ZFUlNJT05fTlVNQkVSJywgTm9uZSkKICAgIHN5c3RlbV9zc2xfaW5mbyA9IHsKICAgICAgICAndmVyc2lvbic6ICcleCcgJSBzeXN0ZW1fc3NsIGlmIHN5c3RlbV9zc2wgaXMgbm90IE5vbmUgZWxzZSAnJwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgJ3BsYXRmb3JtJzogcGxhdGZvcm1faW5mbywKICAgICAgICAnaW1wbGVtZW50YXRpb24nOiBpbXBsZW1lbnRhdGlvbl9pbmZvLAogICAgICAgICdzeXN0ZW1fc3NsJzogc3lzdGVtX3NzbF9pbmZvLAogICAgICAgICd1c2luZ19weW9wZW5zc2wnOiBweW9wZW5zc2wgaXMgbm90IE5vbmUsCiAgICAgICAgJ3B5T3BlblNTTCc6IHB5b3BlbnNzbF9pbmZvLAogICAgICAgICd1cmxsaWIzJzogdXJsbGliM19pbmZvLAogICAgICAgICdjaGFyZGV0JzogY2hhcmRldF9pbmZvLAogICAgICAgICdjcnlwdG9ncmFwaHknOiBjcnlwdG9ncmFwaHlfaW5mbywKICAgICAgICAnaWRuYSc6IGlkbmFfaW5mbywKICAgICAgICAncmVxdWVzdHMnOiB7CiAgICAgICAgICAgICd2ZXJzaW9uJzogcmVxdWVzdHNfdmVyc2lvbiwKICAgICAgICB9LAogICAgfQoKCmRlZiBtYWluKCk6CiAgICAiIiJQcmV0dHktcHJpbnQgdGhlIGJ1ZyBpbmZvcm1hdGlvbiBhcyBKU09OLiIiIgogICAgcHJpbnQoanNvbi5kdW1wcyhpbmZvKCksIHNvcnRfa2V5cz1UcnVlLCBpbmRlbnQ9MikpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIG1haW4oKQpQSwMEFAAAAAAAAAAhAHnao8r/AgAA/wIAAC0AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvaG9va3MucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLmhvb2tzCn5+fn5+fn5+fn5+fn5+CgpUaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgY2FwYWJpbGl0aWVzIGZvciB0aGUgUmVxdWVzdHMgaG9va3Mgc3lzdGVtLgoKQXZhaWxhYmxlIGhvb2tzOgoKYGByZXNwb25zZWBgOgogICAgVGhlIHJlc3BvbnNlIGdlbmVyYXRlZCBmcm9tIGEgUmVxdWVzdC4KIiIiCkhPT0tTID0gWydyZXNwb25zZSddCgoKZGVmIGRlZmF1bHRfaG9va3MoKToKICAgIHJldHVybiBkaWN0KChldmVudCwgW10pIGZvciBldmVudCBpbiBIT09LUykKCiMgVE9ETzogcmVzcG9uc2UgaXMgdGhlIG9ubHkgb25lCgoKZGVmIGRpc3BhdGNoX2hvb2soa2V5LCBob29rcywgaG9va19kYXRhLCAqKmt3YXJncyk6CiAgICAiIiJEaXNwYXRjaGVzIGEgaG9vayBkaWN0aW9uYXJ5IG9uIGEgZ2l2ZW4gcGllY2Ugb2YgZGF0YS4iIiIKICAgIGhvb2tzID0gaG9va3Mgb3IgZGljdCgpCiAgICBob29rcyA9IGhvb2tzLmdldChrZXkpCiAgICBpZiBob29rczoKICAgICAgICBpZiBoYXNhdHRyKGhvb2tzLCAnX19jYWxsX18nKToKICAgICAgICAgICAgaG9va3MgPSBbaG9va3NdCiAgICAgICAgZm9yIGhvb2sgaW4gaG9va3M6CiAgICAgICAgICAgIF9ob29rX2RhdGEgPSBob29rKGhvb2tfZGF0YSwgKiprd2FyZ3MpCiAgICAgICAgICAgIGlmIF9ob29rX2RhdGEgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBob29rX2RhdGEgPSBfaG9va19kYXRhCiAgICByZXR1cm4gaG9va19kYXRhClBLAwQUAAAAAAAAACEAZX1HdAOFAAADhQAALgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9tb2RlbHMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLm1vZGVscwp+fn5+fn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBwcmltYXJ5IG9iamVjdHMgdGhhdCBwb3dlciBSZXF1ZXN0cy4KIiIiCgppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IGRhdGV0aW1lCmltcG9ydCBzeXMKCiMgSW1wb3J0IGVuY29kaW5nIG5vdywgdG8gYXZvaWQgaW1wbGljaXQgaW1wb3J0IGxhdGVyLgojIEltcGxpY2l0IGltcG9ydCB3aXRoaW4gdGhyZWFkcyBtYXkgY2F1c2UgTG9va3VwRXJyb3Igd2hlbiBzdGFuZGFyZCBsaWJyYXJ5IGlzIGluIGEgWklQLAojIHN1Y2ggYXMgaW4gRW1iZWRkZWQgUHl0aG9uLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlcXVlc3RzL3JlcXVlc3RzL2lzc3Vlcy8zNTc4LgppbXBvcnQgZW5jb2RpbmdzLmlkbmEKCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5maWVsZHMgaW1wb3J0IFJlcXVlc3RGaWVsZApmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZmlsZXBvc3QgaW1wb3J0IGVuY29kZV9tdWx0aXBhcnRfZm9ybWRhdGEKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLnV0aWwgaW1wb3J0IHBhcnNlX3VybApmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgKAogICAgRGVjb2RlRXJyb3IsIFJlYWRUaW1lb3V0RXJyb3IsIFByb3RvY29sRXJyb3IsIExvY2F0aW9uUGFyc2VFcnJvcikKCmZyb20gaW8gaW1wb3J0IFVuc3VwcG9ydGVkT3BlcmF0aW9uCmZyb20gLmhvb2tzIGltcG9ydCBkZWZhdWx0X2hvb2tzCmZyb20gLnN0cnVjdHVyZXMgaW1wb3J0IENhc2VJbnNlbnNpdGl2ZURpY3QKCmZyb20gLmF1dGggaW1wb3J0IEhUVFBCYXNpY0F1dGgKZnJvbSAuY29va2llcyBpbXBvcnQgY29va2llamFyX2Zyb21fZGljdCwgZ2V0X2Nvb2tpZV9oZWFkZXIsIF9jb3B5X2Nvb2tpZV9qYXIKZnJvbSAuZXhjZXB0aW9ucyBpbXBvcnQgKAogICAgSFRUUEVycm9yLCBNaXNzaW5nU2NoZW1hLCBJbnZhbGlkVVJMLCBDaHVua2VkRW5jb2RpbmdFcnJvciwKICAgIENvbnRlbnREZWNvZGluZ0Vycm9yLCBDb25uZWN0aW9uRXJyb3IsIFN0cmVhbUNvbnN1bWVkRXJyb3IpCmZyb20gLl9pbnRlcm5hbF91dGlscyBpbXBvcnQgdG9fbmF0aXZlX3N0cmluZywgdW5pY29kZV9pc19hc2NpaQpmcm9tIC51dGlscyBpbXBvcnQgKAogICAgZ3Vlc3NfZmlsZW5hbWUsIGdldF9hdXRoX2Zyb21fdXJsLCByZXF1b3RlX3VyaSwKICAgIHN0cmVhbV9kZWNvZGVfcmVzcG9uc2VfdW5pY29kZSwgdG9fa2V5X3ZhbF9saXN0LCBwYXJzZV9oZWFkZXJfbGlua3MsCiAgICBpdGVyX3NsaWNlcywgZ3Vlc3NfanNvbl91dGYsIHN1cGVyX2xlbiwgY2hlY2tfaGVhZGVyX3ZhbGlkaXR5KQpmcm9tIC5jb21wYXQgaW1wb3J0ICgKICAgIGNvb2tpZWxpYiwgdXJsdW5wYXJzZSwgdXJsc3BsaXQsIHVybGVuY29kZSwgc3RyLCBieXRlcywKICAgIGlzX3B5MiwgY2hhcmRldCwgYnVpbHRpbl9zdHIsIGJhc2VzdHJpbmcpCmZyb20gLmNvbXBhdCBpbXBvcnQganNvbiBhcyBjb21wbGV4anNvbgpmcm9tIC5zdGF0dXNfY29kZXMgaW1wb3J0IGNvZGVzCgojOiBUaGUgc2V0IG9mIEhUVFAgc3RhdHVzIGNvZGVzIHRoYXQgaW5kaWNhdGUgYW4gYXV0b21hdGljYWxseQojOiBwcm9jZXNzYWJsZSByZWRpcmVjdC4KUkVESVJFQ1RfU1RBVEkgPSAoCiAgICBjb2Rlcy5tb3ZlZCwgICAgICAgICAgICAgICAjIDMwMQogICAgY29kZXMuZm91bmQsICAgICAgICAgICAgICAgIyAzMDIKICAgIGNvZGVzLm90aGVyLCAgICAgICAgICAgICAgICMgMzAzCiAgICBjb2Rlcy50ZW1wb3JhcnlfcmVkaXJlY3QsICAjIDMwNwogICAgY29kZXMucGVybWFuZW50X3JlZGlyZWN0LCAgIyAzMDgKKQoKREVGQVVMVF9SRURJUkVDVF9MSU1JVCA9IDMwCkNPTlRFTlRfQ0hVTktfU0laRSA9IDEwICogMTAyNApJVEVSX0NIVU5LX1NJWkUgPSA1MTIKCgpjbGFzcyBSZXF1ZXN0RW5jb2RpbmdNaXhpbihvYmplY3QpOgogICAgQHByb3BlcnR5CiAgICBkZWYgcGF0aF91cmwoc2VsZik6CiAgICAgICAgIiIiQnVpbGQgdGhlIHBhdGggVVJMIHRvIHVzZS4iIiIKCiAgICAgICAgdXJsID0gW10KCiAgICAgICAgcCA9IHVybHNwbGl0KHNlbGYudXJsKQoKICAgICAgICBwYXRoID0gcC5wYXRoCiAgICAgICAgaWYgbm90IHBhdGg6CiAgICAgICAgICAgIHBhdGggPSAnLycKCiAgICAgICAgdXJsLmFwcGVuZChwYXRoKQoKICAgICAgICBxdWVyeSA9IHAucXVlcnkKICAgICAgICBpZiBxdWVyeToKICAgICAgICAgICAgdXJsLmFwcGVuZCgnPycpCiAgICAgICAgICAgIHVybC5hcHBlbmQocXVlcnkpCgogICAgICAgIHJldHVybiAnJy5qb2luKHVybCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2VuY29kZV9wYXJhbXMoZGF0YSk6CiAgICAgICAgIiIiRW5jb2RlIHBhcmFtZXRlcnMgaW4gYSBwaWVjZSBvZiBkYXRhLgoKICAgICAgICBXaWxsIHN1Y2Nlc3NmdWxseSBlbmNvZGUgcGFyYW1ldGVycyB3aGVuIHBhc3NlZCBhcyBhIGRpY3Qgb3IgYSBsaXN0IG9mCiAgICAgICAgMi10dXBsZXMuIE9yZGVyIGlzIHJldGFpbmVkIGlmIGRhdGEgaXMgYSBsaXN0IG9mIDItdHVwbGVzIGJ1dCBhcmJpdHJhcnkKICAgICAgICBpZiBwYXJhbWV0ZXJzIGFyZSBzdXBwbGllZCBhcyBhIGRpY3QuCiAgICAgICAgIiIiCgogICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgKHN0ciwgYnl0ZXMpKToKICAgICAgICAgICAgcmV0dXJuIGRhdGEKICAgICAgICBlbGlmIGhhc2F0dHIoZGF0YSwgJ3JlYWQnKToKICAgICAgICAgICAgcmV0dXJuIGRhdGEKICAgICAgICBlbGlmIGhhc2F0dHIoZGF0YSwgJ19faXRlcl9fJyk6CiAgICAgICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgICAgIGZvciBrLCB2cyBpbiB0b19rZXlfdmFsX2xpc3QoZGF0YSk6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZzLCBiYXNlc3RyaW5nKSBvciBub3QgaGFzYXR0cih2cywgJ19faXRlcl9fJyk6CiAgICAgICAgICAgICAgICAgICAgdnMgPSBbdnNdCiAgICAgICAgICAgICAgICBmb3IgdiBpbiB2czoKICAgICAgICAgICAgICAgICAgICBpZiB2IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGsuZW5jb2RlKCd1dGYtOCcpIGlmIGlzaW5zdGFuY2Uoaywgc3RyKSBlbHNlIGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5lbmNvZGUoJ3V0Zi04JykgaWYgaXNpbnN0YW5jZSh2LCBzdHIpIGVsc2UgdikpCiAgICAgICAgICAgIHJldHVybiB1cmxlbmNvZGUocmVzdWx0LCBkb3NlcT1UcnVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBkYXRhCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9lbmNvZGVfZmlsZXMoZmlsZXMsIGRhdGEpOgogICAgICAgICIiIkJ1aWxkIHRoZSBib2R5IGZvciBhIG11bHRpcGFydC9mb3JtLWRhdGEgcmVxdWVzdC4KCiAgICAgICAgV2lsbCBzdWNjZXNzZnVsbHkgZW5jb2RlIGZpbGVzIHdoZW4gcGFzc2VkIGFzIGEgZGljdCBvciBhIGxpc3Qgb2YKICAgICAgICB0dXBsZXMuIE9yZGVyIGlzIHJldGFpbmVkIGlmIGRhdGEgaXMgYSBsaXN0IG9mIHR1cGxlcyBidXQgYXJiaXRyYXJ5CiAgICAgICAgaWYgcGFyYW1ldGVycyBhcmUgc3VwcGxpZWQgYXMgYSBkaWN0LgogICAgICAgIFRoZSB0dXBsZXMgbWF5IGJlIDItdHVwbGVzIChmaWxlbmFtZSwgZmlsZW9iaiksIDMtdHVwbGVzIChmaWxlbmFtZSwgZmlsZW9iaiwgY29udGVudHlwZSkKICAgICAgICBvciA0LXR1cGxlcyAoZmlsZW5hbWUsIGZpbGVvYmosIGNvbnRlbnR5cGUsIGN1c3RvbV9oZWFkZXJzKS4KICAgICAgICAiIiIKICAgICAgICBpZiAobm90IGZpbGVzKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRmlsZXMgbXVzdCBiZSBwcm92aWRlZC4iKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShkYXRhLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRGF0YSBtdXN0IG5vdCBiZSBhIHN0cmluZy4iKQoKICAgICAgICBuZXdfZmllbGRzID0gW10KICAgICAgICBmaWVsZHMgPSB0b19rZXlfdmFsX2xpc3QoZGF0YSBvciB7fSkKICAgICAgICBmaWxlcyA9IHRvX2tleV92YWxfbGlzdChmaWxlcyBvciB7fSkKCiAgICAgICAgZm9yIGZpZWxkLCB2YWwgaW4gZmllbGRzOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbCwgYmFzZXN0cmluZykgb3Igbm90IGhhc2F0dHIodmFsLCAnX19pdGVyX18nKToKICAgICAgICAgICAgICAgIHZhbCA9IFt2YWxdCiAgICAgICAgICAgIGZvciB2IGluIHZhbDoKICAgICAgICAgICAgICAgIGlmIHYgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgIyBEb24ndCBjYWxsIHN0cigpIG9uIGJ5dGVzdHJpbmdzOiBpbiBQeTMgaXQgYWxsIGdvZXMgd3JvbmcuCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodiwgYnl0ZXMpOgogICAgICAgICAgICAgICAgICAgICAgICB2ID0gc3RyKHYpCgogICAgICAgICAgICAgICAgICAgIG5ld19maWVsZHMuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAoZmllbGQuZGVjb2RlKCd1dGYtOCcpIGlmIGlzaW5zdGFuY2UoZmllbGQsIGJ5dGVzKSBlbHNlIGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgdi5lbmNvZGUoJ3V0Zi04JykgaWYgaXNpbnN0YW5jZSh2LCBzdHIpIGVsc2UgdikpCgogICAgICAgIGZvciAoaywgdikgaW4gZmlsZXM6CiAgICAgICAgICAgICMgc3VwcG9ydCBmb3IgZXhwbGljaXQgZmlsZW5hbWUKICAgICAgICAgICAgZnQgPSBOb25lCiAgICAgICAgICAgIGZoID0gTm9uZQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHYsICh0dXBsZSwgbGlzdCkpOgogICAgICAgICAgICAgICAgaWYgbGVuKHYpID09IDI6CiAgICAgICAgICAgICAgICAgICAgZm4sIGZwID0gdgogICAgICAgICAgICAgICAgZWxpZiBsZW4odikgPT0gMzoKICAgICAgICAgICAgICAgICAgICBmbiwgZnAsIGZ0ID0gdgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBmbiwgZnAsIGZ0LCBmaCA9IHYKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZuID0gZ3Vlc3NfZmlsZW5hbWUodikgb3IgawogICAgICAgICAgICAgICAgZnAgPSB2CgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGZwLCAoc3RyLCBieXRlcywgYnl0ZWFycmF5KSk6CiAgICAgICAgICAgICAgICBmZGF0YSA9IGZwCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmZGF0YSA9IGZwLnJlYWQoKQoKICAgICAgICAgICAgcmYgPSBSZXF1ZXN0RmllbGQobmFtZT1rLCBkYXRhPWZkYXRhLCBmaWxlbmFtZT1mbiwgaGVhZGVycz1maCkKICAgICAgICAgICAgcmYubWFrZV9tdWx0aXBhcnQoY29udGVudF90eXBlPWZ0KQogICAgICAgICAgICBuZXdfZmllbGRzLmFwcGVuZChyZikKCiAgICAgICAgYm9keSwgY29udGVudF90eXBlID0gZW5jb2RlX211bHRpcGFydF9mb3JtZGF0YShuZXdfZmllbGRzKQoKICAgICAgICByZXR1cm4gYm9keSwgY29udGVudF90eXBlCgoKY2xhc3MgUmVxdWVzdEhvb2tzTWl4aW4ob2JqZWN0KToKICAgIGRlZiByZWdpc3Rlcl9ob29rKHNlbGYsIGV2ZW50LCBob29rKToKICAgICAgICAiIiJQcm9wZXJseSByZWdpc3RlciBhIGhvb2suIiIiCgogICAgICAgIGlmIGV2ZW50IG5vdCBpbiBzZWxmLmhvb2tzOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbnN1cHBvcnRlZCBldmVudCBzcGVjaWZpZWQsIHdpdGggZXZlbnQgbmFtZSAiJXMiJyAlIChldmVudCkpCgogICAgICAgIGlmIGlzaW5zdGFuY2UoaG9vaywgY29sbGVjdGlvbnMuQ2FsbGFibGUpOgogICAgICAgICAgICBzZWxmLmhvb2tzW2V2ZW50XS5hcHBlbmQoaG9vaykKICAgICAgICBlbGlmIGhhc2F0dHIoaG9vaywgJ19faXRlcl9fJyk6CiAgICAgICAgICAgIHNlbGYuaG9va3NbZXZlbnRdLmV4dGVuZChoIGZvciBoIGluIGhvb2sgaWYgaXNpbnN0YW5jZShoLCBjb2xsZWN0aW9ucy5DYWxsYWJsZSkpCgogICAgZGVmIGRlcmVnaXN0ZXJfaG9vayhzZWxmLCBldmVudCwgaG9vayk6CiAgICAgICAgIiIiRGVyZWdpc3RlciBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBob29rLgogICAgICAgIFJldHVybnMgVHJ1ZSBpZiB0aGUgaG9vayBleGlzdGVkLCBGYWxzZSBpZiBub3QuCiAgICAgICAgIiIiCgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5ob29rc1tldmVudF0ucmVtb3ZlKGhvb2spCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKCmNsYXNzIFJlcXVlc3QoUmVxdWVzdEhvb2tzTWl4aW4pOgogICAgIiIiQSB1c2VyLWNyZWF0ZWQgOmNsYXNzOmBSZXF1ZXN0IDxSZXF1ZXN0PmAgb2JqZWN0LgoKICAgIFVzZWQgdG8gcHJlcGFyZSBhIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCwgd2hpY2ggaXMgc2VudCB0byB0aGUgc2VydmVyLgoKICAgIDpwYXJhbSBtZXRob2Q6IEhUVFAgbWV0aG9kIHRvIHVzZS4KICAgIDpwYXJhbSB1cmw6IFVSTCB0byBzZW5kLgogICAgOnBhcmFtIGhlYWRlcnM6IGRpY3Rpb25hcnkgb2YgaGVhZGVycyB0byBzZW5kLgogICAgOnBhcmFtIGZpbGVzOiBkaWN0aW9uYXJ5IG9mIHtmaWxlbmFtZTogZmlsZW9iamVjdH0gZmlsZXMgdG8gbXVsdGlwYXJ0IHVwbG9hZC4KICAgIDpwYXJhbSBkYXRhOiB0aGUgYm9keSB0byBhdHRhY2ggdG8gdGhlIHJlcXVlc3QuIElmIGEgZGljdGlvbmFyeSBpcyBwcm92aWRlZCwgZm9ybS1lbmNvZGluZyB3aWxsIHRha2UgcGxhY2UuCiAgICA6cGFyYW0ganNvbjoganNvbiBmb3IgdGhlIGJvZHkgdG8gYXR0YWNoIHRvIHRoZSByZXF1ZXN0IChpZiBmaWxlcyBvciBkYXRhIGlzIG5vdCBzcGVjaWZpZWQpLgogICAgOnBhcmFtIHBhcmFtczogZGljdGlvbmFyeSBvZiBVUkwgcGFyYW1ldGVycyB0byBhcHBlbmQgdG8gdGhlIFVSTC4KICAgIDpwYXJhbSBhdXRoOiBBdXRoIGhhbmRsZXIgb3IgKHVzZXIsIHBhc3MpIHR1cGxlLgogICAgOnBhcmFtIGNvb2tpZXM6IGRpY3Rpb25hcnkgb3IgQ29va2llSmFyIG9mIGNvb2tpZXMgdG8gYXR0YWNoIHRvIHRoaXMgcmVxdWVzdC4KICAgIDpwYXJhbSBob29rczogZGljdGlvbmFyeSBvZiBjYWxsYmFjayBob29rcywgZm9yIGludGVybmFsIHVzYWdlLgoKICAgIFVzYWdlOjoKCiAgICAgID4+PiBpbXBvcnQgcmVxdWVzdHMKICAgICAgPj4+IHJlcSA9IHJlcXVlc3RzLlJlcXVlc3QoJ0dFVCcsICdodHRwOi8vaHR0cGJpbi5vcmcvZ2V0JykKICAgICAgPj4+IHJlcS5wcmVwYXJlKCkKICAgICAgPFByZXBhcmVkUmVxdWVzdCBbR0VUXT4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICBtZXRob2Q9Tm9uZSwgdXJsPU5vbmUsIGhlYWRlcnM9Tm9uZSwgZmlsZXM9Tm9uZSwgZGF0YT1Ob25lLAogICAgICAgICAgICBwYXJhbXM9Tm9uZSwgYXV0aD1Ob25lLCBjb29raWVzPU5vbmUsIGhvb2tzPU5vbmUsIGpzb249Tm9uZSk6CgogICAgICAgICMgRGVmYXVsdCBlbXB0eSBkaWN0cyBmb3IgZGljdCBwYXJhbXMuCiAgICAgICAgZGF0YSA9IFtdIGlmIGRhdGEgaXMgTm9uZSBlbHNlIGRhdGEKICAgICAgICBmaWxlcyA9IFtdIGlmIGZpbGVzIGlzIE5vbmUgZWxzZSBmaWxlcwogICAgICAgIGhlYWRlcnMgPSB7fSBpZiBoZWFkZXJzIGlzIE5vbmUgZWxzZSBoZWFkZXJzCiAgICAgICAgcGFyYW1zID0ge30gaWYgcGFyYW1zIGlzIE5vbmUgZWxzZSBwYXJhbXMKICAgICAgICBob29rcyA9IHt9IGlmIGhvb2tzIGlzIE5vbmUgZWxzZSBob29rcwoKICAgICAgICBzZWxmLmhvb2tzID0gZGVmYXVsdF9ob29rcygpCiAgICAgICAgZm9yIChrLCB2KSBpbiBsaXN0KGhvb2tzLml0ZW1zKCkpOgogICAgICAgICAgICBzZWxmLnJlZ2lzdGVyX2hvb2soZXZlbnQ9aywgaG9vaz12KQoKICAgICAgICBzZWxmLm1ldGhvZCA9IG1ldGhvZAogICAgICAgIHNlbGYudXJsID0gdXJsCiAgICAgICAgc2VsZi5oZWFkZXJzID0gaGVhZGVycwogICAgICAgIHNlbGYuZmlsZXMgPSBmaWxlcwogICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKICAgICAgICBzZWxmLmpzb24gPSBqc29uCiAgICAgICAgc2VsZi5wYXJhbXMgPSBwYXJhbXMKICAgICAgICBzZWxmLmF1dGggPSBhdXRoCiAgICAgICAgc2VsZi5jb29raWVzID0gY29va2llcwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJzxSZXF1ZXN0IFslc10+JyAlIChzZWxmLm1ldGhvZCkKCiAgICBkZWYgcHJlcGFyZShzZWxmKToKICAgICAgICAiIiJDb25zdHJ1Y3RzIGEgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3QgPFByZXBhcmVkUmVxdWVzdD5gIGZvciB0cmFuc21pc3Npb24gYW5kIHJldHVybnMgaXQuIiIiCiAgICAgICAgcCA9IFByZXBhcmVkUmVxdWVzdCgpCiAgICAgICAgcC5wcmVwYXJlKAogICAgICAgICAgICBtZXRob2Q9c2VsZi5tZXRob2QsCiAgICAgICAgICAgIHVybD1zZWxmLnVybCwKICAgICAgICAgICAgaGVhZGVycz1zZWxmLmhlYWRlcnMsCiAgICAgICAgICAgIGZpbGVzPXNlbGYuZmlsZXMsCiAgICAgICAgICAgIGRhdGE9c2VsZi5kYXRhLAogICAgICAgICAgICBqc29uPXNlbGYuanNvbiwKICAgICAgICAgICAgcGFyYW1zPXNlbGYucGFyYW1zLAogICAgICAgICAgICBhdXRoPXNlbGYuYXV0aCwKICAgICAgICAgICAgY29va2llcz1zZWxmLmNvb2tpZXMsCiAgICAgICAgICAgIGhvb2tzPXNlbGYuaG9va3MsCiAgICAgICAgKQogICAgICAgIHJldHVybiBwCgoKY2xhc3MgUHJlcGFyZWRSZXF1ZXN0KFJlcXVlc3RFbmNvZGluZ01peGluLCBSZXF1ZXN0SG9va3NNaXhpbik6CiAgICAiIiJUaGUgZnVsbHkgbXV0YWJsZSA6Y2xhc3M6YFByZXBhcmVkUmVxdWVzdCA8UHJlcGFyZWRSZXF1ZXN0PmAgb2JqZWN0LAogICAgY29udGFpbmluZyB0aGUgZXhhY3QgYnl0ZXMgdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4KCiAgICBHZW5lcmF0ZWQgZnJvbSBlaXRoZXIgYSA6Y2xhc3M6YFJlcXVlc3QgPFJlcXVlc3Q+YCBvYmplY3Qgb3IgbWFudWFsbHkuCgogICAgVXNhZ2U6OgoKICAgICAgPj4+IGltcG9ydCByZXF1ZXN0cwogICAgICA+Pj4gcmVxID0gcmVxdWVzdHMuUmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9odHRwYmluLm9yZy9nZXQnKQogICAgICA+Pj4gciA9IHJlcS5wcmVwYXJlKCkKICAgICAgPFByZXBhcmVkUmVxdWVzdCBbR0VUXT4KCiAgICAgID4+PiBzID0gcmVxdWVzdHMuU2Vzc2lvbigpCiAgICAgID4+PiBzLnNlbmQocikKICAgICAgPFJlc3BvbnNlIFsyMDBdPgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICM6IEhUVFAgdmVyYiB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuCiAgICAgICAgc2VsZi5tZXRob2QgPSBOb25lCiAgICAgICAgIzogSFRUUCBVUkwgdG8gc2VuZCB0aGUgcmVxdWVzdCB0by4KICAgICAgICBzZWxmLnVybCA9IE5vbmUKICAgICAgICAjOiBkaWN0aW9uYXJ5IG9mIEhUVFAgaGVhZGVycy4KICAgICAgICBzZWxmLmhlYWRlcnMgPSBOb25lCiAgICAgICAgIyBUaGUgYENvb2tpZUphcmAgdXNlZCB0byBjcmVhdGUgdGhlIENvb2tpZSBoZWFkZXIgd2lsbCBiZSBzdG9yZWQgaGVyZQogICAgICAgICMgYWZ0ZXIgcHJlcGFyZV9jb29raWVzIGlzIGNhbGxlZAogICAgICAgIHNlbGYuX2Nvb2tpZXMgPSBOb25lCiAgICAgICAgIzogcmVxdWVzdCBib2R5IHRvIHNlbmQgdG8gdGhlIHNlcnZlci4KICAgICAgICBzZWxmLmJvZHkgPSBOb25lCiAgICAgICAgIzogZGljdGlvbmFyeSBvZiBjYWxsYmFjayBob29rcywgZm9yIGludGVybmFsIHVzYWdlLgogICAgICAgIHNlbGYuaG9va3MgPSBkZWZhdWx0X2hvb2tzKCkKICAgICAgICAjOiBpbnRlZ2VyIGRlbm90aW5nIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIGEgcmVhZGFibGUgZmlsZS1saWtlIGJvZHkuCiAgICAgICAgc2VsZi5fYm9keV9wb3NpdGlvbiA9IE5vbmUKCiAgICBkZWYgcHJlcGFyZShzZWxmLAogICAgICAgICAgICBtZXRob2Q9Tm9uZSwgdXJsPU5vbmUsIGhlYWRlcnM9Tm9uZSwgZmlsZXM9Tm9uZSwgZGF0YT1Ob25lLAogICAgICAgICAgICBwYXJhbXM9Tm9uZSwgYXV0aD1Ob25lLCBjb29raWVzPU5vbmUsIGhvb2tzPU5vbmUsIGpzb249Tm9uZSk6CiAgICAgICAgIiIiUHJlcGFyZXMgdGhlIGVudGlyZSByZXF1ZXN0IHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMuIiIiCgogICAgICAgIHNlbGYucHJlcGFyZV9tZXRob2QobWV0aG9kKQogICAgICAgIHNlbGYucHJlcGFyZV91cmwodXJsLCBwYXJhbXMpCiAgICAgICAgc2VsZi5wcmVwYXJlX2hlYWRlcnMoaGVhZGVycykKICAgICAgICBzZWxmLnByZXBhcmVfY29va2llcyhjb29raWVzKQogICAgICAgIHNlbGYucHJlcGFyZV9ib2R5KGRhdGEsIGZpbGVzLCBqc29uKQogICAgICAgIHNlbGYucHJlcGFyZV9hdXRoKGF1dGgsIHVybCkKCiAgICAgICAgIyBOb3RlIHRoYXQgcHJlcGFyZV9hdXRoIG11c3QgYmUgbGFzdCB0byBlbmFibGUgYXV0aGVudGljYXRpb24gc2NoZW1lcwogICAgICAgICMgc3VjaCBhcyBPQXV0aCB0byB3b3JrIG9uIGEgZnVsbHkgcHJlcGFyZWQgcmVxdWVzdC4KCiAgICAgICAgIyBUaGlzIE1VU1QgZ28gYWZ0ZXIgcHJlcGFyZV9hdXRoLiBBdXRoZW50aWNhdG9ycyBjb3VsZCBhZGQgYSBob29rCiAgICAgICAgc2VsZi5wcmVwYXJlX2hvb2tzKGhvb2tzKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJzxQcmVwYXJlZFJlcXVlc3QgWyVzXT4nICUgKHNlbGYubWV0aG9kKQoKICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgIHAgPSBQcmVwYXJlZFJlcXVlc3QoKQogICAgICAgIHAubWV0aG9kID0gc2VsZi5tZXRob2QKICAgICAgICBwLnVybCA9IHNlbGYudXJsCiAgICAgICAgcC5oZWFkZXJzID0gc2VsZi5oZWFkZXJzLmNvcHkoKSBpZiBzZWxmLmhlYWRlcnMgaXMgbm90IE5vbmUgZWxzZSBOb25lCiAgICAgICAgcC5fY29va2llcyA9IF9jb3B5X2Nvb2tpZV9qYXIoc2VsZi5fY29va2llcykKICAgICAgICBwLmJvZHkgPSBzZWxmLmJvZHkKICAgICAgICBwLmhvb2tzID0gc2VsZi5ob29rcwogICAgICAgIHAuX2JvZHlfcG9zaXRpb24gPSBzZWxmLl9ib2R5X3Bvc2l0aW9uCiAgICAgICAgcmV0dXJuIHAKCiAgICBkZWYgcHJlcGFyZV9tZXRob2Qoc2VsZiwgbWV0aG9kKToKICAgICAgICAiIiJQcmVwYXJlcyB0aGUgZ2l2ZW4gSFRUUCBtZXRob2QuIiIiCiAgICAgICAgc2VsZi5tZXRob2QgPSBtZXRob2QKICAgICAgICBpZiBzZWxmLm1ldGhvZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5tZXRob2QgPSB0b19uYXRpdmVfc3RyaW5nKHNlbGYubWV0aG9kLnVwcGVyKCkpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9nZXRfaWRuYV9lbmNvZGVkX2hvc3QoaG9zdCk6CiAgICAgICAgaW1wb3J0IGlkbmEKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBob3N0ID0gaWRuYS5lbmNvZGUoaG9zdCwgdXRzNDY9VHJ1ZSkuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgZXhjZXB0IGlkbmEuSUROQUVycm9yOgogICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IKICAgICAgICByZXR1cm4gaG9zdAoKICAgIGRlZiBwcmVwYXJlX3VybChzZWxmLCB1cmwsIHBhcmFtcyk6CiAgICAgICAgIiIiUHJlcGFyZXMgdGhlIGdpdmVuIEhUVFAgVVJMLiIiIgogICAgICAgICM6IEFjY2VwdCBvYmplY3RzIHRoYXQgaGF2ZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zLgogICAgICAgICM6IFdlJ3JlIHVuYWJsZSB0byBibGluZGx5IGNhbGwgdW5pY29kZS9zdHIgZnVuY3Rpb25zCiAgICAgICAgIzogYXMgdGhpcyB3aWxsIGluY2x1ZGUgdGhlIGJ5dGVzdHJpbmcgaW5kaWNhdG9yIChiJycpCiAgICAgICAgIzogb24gcHl0aG9uIDMueC4KICAgICAgICAjOiBodHRwczovL2dpdGh1Yi5jb20vcmVxdWVzdHMvcmVxdWVzdHMvcHVsbC8yMjM4CiAgICAgICAgaWYgaXNpbnN0YW5jZSh1cmwsIGJ5dGVzKToKICAgICAgICAgICAgdXJsID0gdXJsLmRlY29kZSgndXRmOCcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdXJsID0gdW5pY29kZSh1cmwpIGlmIGlzX3B5MiBlbHNlIHN0cih1cmwpCgogICAgICAgICMgUmVtb3ZlIGxlYWRpbmcgd2hpdGVzcGFjZXMgZnJvbSB1cmwKICAgICAgICB1cmwgPSB1cmwubHN0cmlwKCkKCiAgICAgICAgIyBEb24ndCBkbyBhbnkgVVJMIHByZXBhcmF0aW9uIGZvciBub24tSFRUUCBzY2hlbWVzIGxpa2UgYG1haWx0b2AsCiAgICAgICAgIyBgZGF0YWAgZXRjIHRvIHdvcmsgYXJvdW5kIGV4Y2VwdGlvbnMgZnJvbSBgdXJsX3BhcnNlYCwgd2hpY2gKICAgICAgICAjIGhhbmRsZXMgUkZDIDM5ODYgb25seS4KICAgICAgICBpZiAnOicgaW4gdXJsIGFuZCBub3QgdXJsLmxvd2VyKCkuc3RhcnRzd2l0aCgnaHR0cCcpOgogICAgICAgICAgICBzZWxmLnVybCA9IHVybAogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBTdXBwb3J0IGZvciB1bmljb2RlIGRvbWFpbiBuYW1lcyBhbmQgcGF0aHMuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzY2hlbWUsIGF1dGgsIGhvc3QsIHBvcnQsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCA9IHBhcnNlX3VybCh1cmwpCiAgICAgICAgZXhjZXB0IExvY2F0aW9uUGFyc2VFcnJvciBhcyBlOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkVVJMKCplLmFyZ3MpCgogICAgICAgIGlmIG5vdCBzY2hlbWU6CiAgICAgICAgICAgIGVycm9yID0gKCJJbnZhbGlkIFVSTCB7MCFyfTogTm8gc2NoZW1hIHN1cHBsaWVkLiBQZXJoYXBzIHlvdSBtZWFudCBodHRwOi8vezB9PyIpCiAgICAgICAgICAgIGVycm9yID0gZXJyb3IuZm9ybWF0KHRvX25hdGl2ZV9zdHJpbmcodXJsLCAndXRmOCcpKQoKICAgICAgICAgICAgcmFpc2UgTWlzc2luZ1NjaGVtYShlcnJvcikKCiAgICAgICAgaWYgbm90IGhvc3Q6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRVUkwoIkludmFsaWQgVVJMICVyOiBObyBob3N0IHN1cHBsaWVkIiAlIHVybCkKCiAgICAgICAgIyBJbiBnZW5lcmFsLCB3ZSB3YW50IHRvIHRyeSBJRE5BIGVuY29kaW5nIHRoZSBob3N0bmFtZSBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zCiAgICAgICAgIyBub24tQVNDSUkgY2hhcmFjdGVycy4gVGhpcyBhbGxvd3MgdXNlcnMgdG8gYXV0b21hdGljYWxseSBnZXQgdGhlIGNvcnJlY3QgSUROQQogICAgICAgICMgYmVoYXZpb3VyLiBGb3Igc3RyaW5ncyBjb250YWluaW5nIG9ubHkgQVNDSUkgY2hhcmFjdGVycywgd2UgbmVlZCB0byBhbHNvIHZlcmlmeQogICAgICAgICMgaXQgZG9lc24ndCBzdGFydCB3aXRoIGEgd2lsZGNhcmQgKCopLCBiZWZvcmUgYWxsb3dpbmcgdGhlIHVuZW5jb2RlZCBob3N0bmFtZS4KICAgICAgICBpZiBub3QgdW5pY29kZV9pc19hc2NpaShob3N0KToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaG9zdCA9IHNlbGYuX2dldF9pZG5hX2VuY29kZWRfaG9zdChob3N0KQogICAgICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZFVSTCgnVVJMIGhhcyBhbiBpbnZhbGlkIGxhYmVsLicpCiAgICAgICAgZWxpZiBob3N0LnN0YXJ0c3dpdGgodScqJyk6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRVUkwoJ1VSTCBoYXMgYW4gaW52YWxpZCBsYWJlbC4nKQoKICAgICAgICAjIENhcmVmdWxseSByZWNvbnN0cnVjdCB0aGUgbmV0d29yayBsb2NhdGlvbgogICAgICAgIG5ldGxvYyA9IGF1dGggb3IgJycKICAgICAgICBpZiBuZXRsb2M6CiAgICAgICAgICAgIG5ldGxvYyArPSAnQCcKICAgICAgICBuZXRsb2MgKz0gaG9zdAogICAgICAgIGlmIHBvcnQ6CiAgICAgICAgICAgIG5ldGxvYyArPSAnOicgKyBzdHIocG9ydCkKCiAgICAgICAgIyBCYXJlIGRvbWFpbnMgYXJlbid0IHZhbGlkIFVSTHMuCiAgICAgICAgaWYgbm90IHBhdGg6CiAgICAgICAgICAgIHBhdGggPSAnLycKCiAgICAgICAgaWYgaXNfcHkyOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNjaGVtZSwgc3RyKToKICAgICAgICAgICAgICAgIHNjaGVtZSA9IHNjaGVtZS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuZXRsb2MsIHN0cik6CiAgICAgICAgICAgICAgICBuZXRsb2MgPSBuZXRsb2MuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGF0aCwgc3RyKToKICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHF1ZXJ5LCBzdHIpOgogICAgICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmcmFnbWVudCwgc3RyKToKICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gZnJhZ21lbnQuZW5jb2RlKCd1dGYtOCcpCgogICAgICAgIGlmIGlzaW5zdGFuY2UocGFyYW1zLCAoc3RyLCBieXRlcykpOgogICAgICAgICAgICBwYXJhbXMgPSB0b19uYXRpdmVfc3RyaW5nKHBhcmFtcykKCiAgICAgICAgZW5jX3BhcmFtcyA9IHNlbGYuX2VuY29kZV9wYXJhbXMocGFyYW1zKQogICAgICAgIGlmIGVuY19wYXJhbXM6CiAgICAgICAgICAgIGlmIHF1ZXJ5OgogICAgICAgICAgICAgICAgcXVlcnkgPSAnJXMmJXMnICUgKHF1ZXJ5LCBlbmNfcGFyYW1zKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcXVlcnkgPSBlbmNfcGFyYW1zCgogICAgICAgIHVybCA9IHJlcXVvdGVfdXJpKHVybHVucGFyc2UoW3NjaGVtZSwgbmV0bG9jLCBwYXRoLCBOb25lLCBxdWVyeSwgZnJhZ21lbnRdKSkKICAgICAgICBzZWxmLnVybCA9IHVybAoKICAgIGRlZiBwcmVwYXJlX2hlYWRlcnMoc2VsZiwgaGVhZGVycyk6CiAgICAgICAgIiIiUHJlcGFyZXMgdGhlIGdpdmVuIEhUVFAgaGVhZGVycy4iIiIKCiAgICAgICAgc2VsZi5oZWFkZXJzID0gQ2FzZUluc2Vuc2l0aXZlRGljdCgpCiAgICAgICAgaWYgaGVhZGVyczoKICAgICAgICAgICAgZm9yIGhlYWRlciBpbiBoZWFkZXJzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAjIFJhaXNlIGV4Y2VwdGlvbiBvbiBpbnZhbGlkIGhlYWRlciB2YWx1ZS4KICAgICAgICAgICAgICAgIGNoZWNrX2hlYWRlcl92YWxpZGl0eShoZWFkZXIpCiAgICAgICAgICAgICAgICBuYW1lLCB2YWx1ZSA9IGhlYWRlcgogICAgICAgICAgICAgICAgc2VsZi5oZWFkZXJzW3RvX25hdGl2ZV9zdHJpbmcobmFtZSldID0gdmFsdWUKCiAgICBkZWYgcHJlcGFyZV9ib2R5KHNlbGYsIGRhdGEsIGZpbGVzLCBqc29uPU5vbmUpOgogICAgICAgICIiIlByZXBhcmVzIHRoZSBnaXZlbiBIVFRQIGJvZHkgZGF0YS4iIiIKCiAgICAgICAgIyBDaGVjayBpZiBmaWxlLCBmbywgZ2VuZXJhdG9yLCBpdGVyYXRvci4KICAgICAgICAjIElmIG5vdCwgcnVuIHRocm91Z2ggbm9ybWFsIHByb2Nlc3MuCgogICAgICAgICMgTm90dGluJyBvbiB5b3UuCiAgICAgICAgYm9keSA9IE5vbmUKICAgICAgICBjb250ZW50X3R5cGUgPSBOb25lCgogICAgICAgIGlmIG5vdCBkYXRhIGFuZCBqc29uIGlzIG5vdCBOb25lOgogICAgICAgICAgICAjIHVybGxpYjMgcmVxdWlyZXMgYSBieXRlcy1saWtlIGJvZHkuIFB5dGhvbiAyJ3MganNvbi5kdW1wcwogICAgICAgICAgICAjIHByb3ZpZGVzIHRoaXMgbmF0aXZlbHksIGJ1dCBQeXRob24gMyBnaXZlcyBhIFVuaWNvZGUgc3RyaW5nLgogICAgICAgICAgICBjb250ZW50X3R5cGUgPSAnYXBwbGljYXRpb24vanNvbicKICAgICAgICAgICAgYm9keSA9IGNvbXBsZXhqc29uLmR1bXBzKGpzb24pCiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGJvZHksIGJ5dGVzKToKICAgICAgICAgICAgICAgIGJvZHkgPSBib2R5LmVuY29kZSgndXRmLTgnKQoKICAgICAgICBpc19zdHJlYW0gPSBhbGwoWwogICAgICAgICAgICBoYXNhdHRyKGRhdGEsICdfX2l0ZXJfXycpLAogICAgICAgICAgICBub3QgaXNpbnN0YW5jZShkYXRhLCAoYmFzZXN0cmluZywgbGlzdCwgdHVwbGUsIGNvbGxlY3Rpb25zLk1hcHBpbmcpKQogICAgICAgIF0pCgogICAgICAgIHRyeToKICAgICAgICAgICAgbGVuZ3RoID0gc3VwZXJfbGVuKGRhdGEpCiAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yLCBVbnN1cHBvcnRlZE9wZXJhdGlvbik6CiAgICAgICAgICAgIGxlbmd0aCA9IE5vbmUKCiAgICAgICAgaWYgaXNfc3RyZWFtOgogICAgICAgICAgICBib2R5ID0gZGF0YQoKICAgICAgICAgICAgaWYgZ2V0YXR0cihib2R5LCAndGVsbCcsIE5vbmUpIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIyBSZWNvcmQgdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbiBiZWZvcmUgcmVhZGluZy4KICAgICAgICAgICAgICAgICMgVGhpcyB3aWxsIGFsbG93IHVzIHRvIHJld2luZCBhIGZpbGUgaW4gdGhlIGV2ZW50CiAgICAgICAgICAgICAgICAjIG9mIGEgcmVkaXJlY3QuCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fYm9keV9wb3NpdGlvbiA9IGJvZHkudGVsbCgpCiAgICAgICAgICAgICAgICBleGNlcHQgKElPRXJyb3IsIE9TRXJyb3IpOgogICAgICAgICAgICAgICAgICAgICMgVGhpcyBkaWZmZXJlbnRpYXRlcyBmcm9tIE5vbmUsIGFsbG93aW5nIHVzIHRvIGNhdGNoCiAgICAgICAgICAgICAgICAgICAgIyBhIGZhaWxlZCBgdGVsbCgpYCBsYXRlciB3aGVuIHRyeWluZyB0byByZXdpbmQgdGhlIGJvZHkKICAgICAgICAgICAgICAgICAgICBzZWxmLl9ib2R5X3Bvc2l0aW9uID0gb2JqZWN0KCkKCiAgICAgICAgICAgIGlmIGZpbGVzOgogICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignU3RyZWFtZWQgYm9kaWVzIGFuZCBmaWxlcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLicpCgogICAgICAgICAgICBpZiBsZW5ndGg6CiAgICAgICAgICAgICAgICBzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10gPSBidWlsdGluX3N0cihsZW5ndGgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLmhlYWRlcnNbJ1RyYW5zZmVyLUVuY29kaW5nJ10gPSAnY2h1bmtlZCcKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE11bHRpLXBhcnQgZmlsZSB1cGxvYWRzLgogICAgICAgICAgICBpZiBmaWxlczoKICAgICAgICAgICAgICAgIChib2R5LCBjb250ZW50X3R5cGUpID0gc2VsZi5fZW5jb2RlX2ZpbGVzKGZpbGVzLCBkYXRhKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgZGF0YToKICAgICAgICAgICAgICAgICAgICBib2R5ID0gc2VsZi5fZW5jb2RlX3BhcmFtcyhkYXRhKQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgYmFzZXN0cmluZykgb3IgaGFzYXR0cihkYXRhLCAncmVhZCcpOgogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcKCiAgICAgICAgICAgIHNlbGYucHJlcGFyZV9jb250ZW50X2xlbmd0aChib2R5KQoKICAgICAgICAgICAgIyBBZGQgY29udGVudC10eXBlIGlmIGl0IHdhc24ndCBleHBsaWNpdGx5IHByb3ZpZGVkLgogICAgICAgICAgICBpZiBjb250ZW50X3R5cGUgYW5kICgnY29udGVudC10eXBlJyBub3QgaW4gc2VsZi5oZWFkZXJzKToKICAgICAgICAgICAgICAgIHNlbGYuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSBjb250ZW50X3R5cGUKCiAgICAgICAgc2VsZi5ib2R5ID0gYm9keQoKICAgIGRlZiBwcmVwYXJlX2NvbnRlbnRfbGVuZ3RoKHNlbGYsIGJvZHkpOgogICAgICAgICIiIlByZXBhcmUgQ29udGVudC1MZW5ndGggaGVhZGVyIGJhc2VkIG9uIHJlcXVlc3QgbWV0aG9kIGFuZCBib2R5IiIiCiAgICAgICAgaWYgYm9keSBpcyBub3QgTm9uZToKICAgICAgICAgICAgbGVuZ3RoID0gc3VwZXJfbGVuKGJvZHkpCiAgICAgICAgICAgIGlmIGxlbmd0aDoKICAgICAgICAgICAgICAgICMgSWYgbGVuZ3RoIGV4aXN0cywgc2V0IGl0LiBPdGhlcndpc2UsIHdlIGZhbGxiYWNrCiAgICAgICAgICAgICAgICAjIHRvIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkLgogICAgICAgICAgICAgICAgc2VsZi5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gYnVpbHRpbl9zdHIobGVuZ3RoKQogICAgICAgIGVsaWYgc2VsZi5tZXRob2Qgbm90IGluICgnR0VUJywgJ0hFQUQnKSBhbmQgc2VsZi5oZWFkZXJzLmdldCgnQ29udGVudC1MZW5ndGgnKSBpcyBOb25lOgogICAgICAgICAgICAjIFNldCBDb250ZW50LUxlbmd0aCB0byAwIGZvciBtZXRob2RzIHRoYXQgY2FuIGhhdmUgYSBib2R5CiAgICAgICAgICAgICMgYnV0IGRvbid0IHByb3ZpZGUgb25lLiAoaS5lLiBub3QgR0VUIG9yIEhFQUQpCiAgICAgICAgICAgIHNlbGYuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9ICcwJwoKICAgIGRlZiBwcmVwYXJlX2F1dGgoc2VsZiwgYXV0aCwgdXJsPScnKToKICAgICAgICAiIiJQcmVwYXJlcyB0aGUgZ2l2ZW4gSFRUUCBhdXRoIGRhdGEuIiIiCgogICAgICAgICMgSWYgbm8gQXV0aCBpcyBleHBsaWNpdGx5IHByb3ZpZGVkLCBleHRyYWN0IGl0IGZyb20gdGhlIFVSTCBmaXJzdC4KICAgICAgICBpZiBhdXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHVybF9hdXRoID0gZ2V0X2F1dGhfZnJvbV91cmwoc2VsZi51cmwpCiAgICAgICAgICAgIGF1dGggPSB1cmxfYXV0aCBpZiBhbnkodXJsX2F1dGgpIGVsc2UgTm9uZQoKICAgICAgICBpZiBhdXRoOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGF1dGgsIHR1cGxlKSBhbmQgbGVuKGF1dGgpID09IDI6CiAgICAgICAgICAgICAgICAjIHNwZWNpYWwtY2FzZSBiYXNpYyBIVFRQIGF1dGgKICAgICAgICAgICAgICAgIGF1dGggPSBIVFRQQmFzaWNBdXRoKCphdXRoKQoKICAgICAgICAgICAgIyBBbGxvdyBhdXRoIHRvIG1ha2UgaXRzIGNoYW5nZXMuCiAgICAgICAgICAgIHIgPSBhdXRoKHNlbGYpCgogICAgICAgICAgICAjIFVwZGF0ZSBzZWxmIHRvIHJlZmxlY3QgdGhlIGF1dGggY2hhbmdlcy4KICAgICAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUoci5fX2RpY3RfXykKCiAgICAgICAgICAgICMgUmVjb21wdXRlIENvbnRlbnQtTGVuZ3RoCiAgICAgICAgICAgIHNlbGYucHJlcGFyZV9jb250ZW50X2xlbmd0aChzZWxmLmJvZHkpCgogICAgZGVmIHByZXBhcmVfY29va2llcyhzZWxmLCBjb29raWVzKToKICAgICAgICAiIiJQcmVwYXJlcyB0aGUgZ2l2ZW4gSFRUUCBjb29raWUgZGF0YS4KCiAgICAgICAgVGhpcyBmdW5jdGlvbiBldmVudHVhbGx5IGdlbmVyYXRlcyBhIGBgQ29va2llYGAgaGVhZGVyIGZyb20gdGhlCiAgICAgICAgZ2l2ZW4gY29va2llcyB1c2luZyBjb29raWVsaWIuIER1ZSB0byBjb29raWVsaWIncyBkZXNpZ24sIHRoZSBoZWFkZXIKICAgICAgICB3aWxsIG5vdCBiZSByZWdlbmVyYXRlZCBpZiBpdCBhbHJlYWR5IGV4aXN0cywgbWVhbmluZyB0aGlzIGZ1bmN0aW9uCiAgICAgICAgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UgZm9yIHRoZSBsaWZlIG9mIHRoZQogICAgICAgIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCBvYmplY3QuIEFueSBzdWJzZXF1ZW50IGNhbGxzCiAgICAgICAgdG8gYGBwcmVwYXJlX2Nvb2tpZXNgYCB3aWxsIGhhdmUgbm8gYWN0dWFsIGVmZmVjdCwgdW5sZXNzIHRoZSAiQ29va2llIgogICAgICAgIGhlYWRlciBpcyByZW1vdmVkIGJlZm9yZWhhbmQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShjb29raWVzLCBjb29raWVsaWIuQ29va2llSmFyKToKICAgICAgICAgICAgc2VsZi5fY29va2llcyA9IGNvb2tpZXMKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9jb29raWVzID0gY29va2llamFyX2Zyb21fZGljdChjb29raWVzKQoKICAgICAgICBjb29raWVfaGVhZGVyID0gZ2V0X2Nvb2tpZV9oZWFkZXIoc2VsZi5fY29va2llcywgc2VsZikKICAgICAgICBpZiBjb29raWVfaGVhZGVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmhlYWRlcnNbJ0Nvb2tpZSddID0gY29va2llX2hlYWRlcgoKICAgIGRlZiBwcmVwYXJlX2hvb2tzKHNlbGYsIGhvb2tzKToKICAgICAgICAiIiJQcmVwYXJlcyB0aGUgZ2l2ZW4gaG9va3MuIiIiCiAgICAgICAgIyBob29rcyBjYW4gYmUgcGFzc2VkIGFzIE5vbmUgdG8gdGhlIHByZXBhcmUgbWV0aG9kIGFuZCB0byB0aGlzCiAgICAgICAgIyBtZXRob2QuIFRvIHByZXZlbnQgaXRlcmF0aW5nIG92ZXIgTm9uZSwgc2ltcGx5IHVzZSBhbiBlbXB0eSBsaXN0CiAgICAgICAgIyBpZiBob29rcyBpcyBGYWxzZS15CiAgICAgICAgaG9va3MgPSBob29rcyBvciBbXQogICAgICAgIGZvciBldmVudCBpbiBob29rczoKICAgICAgICAgICAgc2VsZi5yZWdpc3Rlcl9ob29rKGV2ZW50LCBob29rc1tldmVudF0pCgoKY2xhc3MgUmVzcG9uc2Uob2JqZWN0KToKICAgICIiIlRoZSA6Y2xhc3M6YFJlc3BvbnNlIDxSZXNwb25zZT5gIG9iamVjdCwgd2hpY2ggY29udGFpbnMgYQogICAgc2VydmVyJ3MgcmVzcG9uc2UgdG8gYW4gSFRUUCByZXF1ZXN0LgogICAgIiIiCgogICAgX19hdHRyc19fID0gWwogICAgICAgICdfY29udGVudCcsICdzdGF0dXNfY29kZScsICdoZWFkZXJzJywgJ3VybCcsICdoaXN0b3J5JywKICAgICAgICAnZW5jb2RpbmcnLCAncmVhc29uJywgJ2Nvb2tpZXMnLCAnZWxhcHNlZCcsICdyZXF1ZXN0JwogICAgXQoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9jb250ZW50ID0gRmFsc2UKICAgICAgICBzZWxmLl9jb250ZW50X2NvbnN1bWVkID0gRmFsc2UKICAgICAgICBzZWxmLl9uZXh0ID0gTm9uZQoKICAgICAgICAjOiBJbnRlZ2VyIENvZGUgb2YgcmVzcG9uZGVkIEhUVFAgU3RhdHVzLCBlLmcuIDQwNCBvciAyMDAuCiAgICAgICAgc2VsZi5zdGF0dXNfY29kZSA9IE5vbmUKCiAgICAgICAgIzogQ2FzZS1pbnNlbnNpdGl2ZSBEaWN0aW9uYXJ5IG9mIFJlc3BvbnNlIEhlYWRlcnMuCiAgICAgICAgIzogRm9yIGV4YW1wbGUsIGBgaGVhZGVyc1snY29udGVudC1lbmNvZGluZyddYGAgd2lsbCByZXR1cm4gdGhlCiAgICAgICAgIzogdmFsdWUgb2YgYSBgYCdDb250ZW50LUVuY29kaW5nJ2BgIHJlc3BvbnNlIGhlYWRlci4KICAgICAgICBzZWxmLmhlYWRlcnMgPSBDYXNlSW5zZW5zaXRpdmVEaWN0KCkKCiAgICAgICAgIzogRmlsZS1saWtlIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiByZXNwb25zZSAoZm9yIGFkdmFuY2VkIHVzYWdlKS4KICAgICAgICAjOiBVc2Ugb2YgYGByYXdgYCByZXF1aXJlcyB0aGF0IGBgc3RyZWFtPVRydWVgYCBiZSBzZXQgb24gdGhlIHJlcXVlc3QuCiAgICAgICAgIyBUaGlzIHJlcXVpcmVtZW50IGRvZXMgbm90IGFwcGx5IGZvciB1c2UgaW50ZXJuYWxseSB0byBSZXF1ZXN0cy4KICAgICAgICBzZWxmLnJhdyA9IE5vbmUKCiAgICAgICAgIzogRmluYWwgVVJMIGxvY2F0aW9uIG9mIFJlc3BvbnNlLgogICAgICAgIHNlbGYudXJsID0gTm9uZQoKICAgICAgICAjOiBFbmNvZGluZyB0byBkZWNvZGUgd2l0aCB3aGVuIGFjY2Vzc2luZyByLnRleHQuCiAgICAgICAgc2VsZi5lbmNvZGluZyA9IE5vbmUKCiAgICAgICAgIzogQSBsaXN0IG9mIDpjbGFzczpgUmVzcG9uc2UgPFJlc3BvbnNlPmAgb2JqZWN0cyBmcm9tCiAgICAgICAgIzogdGhlIGhpc3Rvcnkgb2YgdGhlIFJlcXVlc3QuIEFueSByZWRpcmVjdCByZXNwb25zZXMgd2lsbCBlbmQKICAgICAgICAjOiB1cCBoZXJlLiBUaGUgbGlzdCBpcyBzb3J0ZWQgZnJvbSB0aGUgb2xkZXN0IHRvIHRoZSBtb3N0IHJlY2VudCByZXF1ZXN0LgogICAgICAgIHNlbGYuaGlzdG9yeSA9IFtdCgogICAgICAgICM6IFRleHR1YWwgcmVhc29uIG9mIHJlc3BvbmRlZCBIVFRQIFN0YXR1cywgZS5nLiAiTm90IEZvdW5kIiBvciAiT0siLgogICAgICAgIHNlbGYucmVhc29uID0gTm9uZQoKICAgICAgICAjOiBBIENvb2tpZUphciBvZiBDb29raWVzIHRoZSBzZXJ2ZXIgc2VudCBiYWNrLgogICAgICAgIHNlbGYuY29va2llcyA9IGNvb2tpZWphcl9mcm9tX2RpY3Qoe30pCgogICAgICAgICM6IFRoZSBhbW91bnQgb2YgdGltZSBlbGFwc2VkIGJldHdlZW4gc2VuZGluZyB0aGUgcmVxdWVzdAogICAgICAgICM6IGFuZCB0aGUgYXJyaXZhbCBvZiB0aGUgcmVzcG9uc2UgKGFzIGEgdGltZWRlbHRhKS4KICAgICAgICAjOiBUaGlzIHByb3BlcnR5IHNwZWNpZmljYWxseSBtZWFzdXJlcyB0aGUgdGltZSB0YWtlbiBiZXR3ZWVuIHNlbmRpbmcKICAgICAgICAjOiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmVxdWVzdCBhbmQgZmluaXNoaW5nIHBhcnNpbmcgdGhlIGhlYWRlcnMuIEl0CiAgICAgICAgIzogaXMgdGhlcmVmb3JlIHVuYWZmZWN0ZWQgYnkgY29uc3VtaW5nIHRoZSByZXNwb25zZSBjb250ZW50IG9yIHRoZQogICAgICAgICM6IHZhbHVlIG9mIHRoZSBgYHN0cmVhbWBgIGtleXdvcmQgYXJndW1lbnQuCiAgICAgICAgc2VsZi5lbGFwc2VkID0gZGF0ZXRpbWUudGltZWRlbHRhKDApCgogICAgICAgICM6IFRoZSA6Y2xhc3M6YFByZXBhcmVkUmVxdWVzdCA8UHJlcGFyZWRSZXF1ZXN0PmAgb2JqZWN0IHRvIHdoaWNoIHRoaXMKICAgICAgICAjOiBpcyBhIHJlc3BvbnNlLgogICAgICAgIHNlbGYucmVxdWVzdCA9IE5vbmUKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKICAgICAgICBzZWxmLmNsb3NlKCkKCiAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgogICAgICAgICMgQ29uc3VtZSBldmVyeXRoaW5nOyBhY2Nlc3NpbmcgdGhlIGNvbnRlbnQgYXR0cmlidXRlIG1ha2VzCiAgICAgICAgIyBzdXJlIHRoZSBjb250ZW50IGhhcyBiZWVuIGZ1bGx5IHJlYWQuCiAgICAgICAgaWYgbm90IHNlbGYuX2NvbnRlbnRfY29uc3VtZWQ6CiAgICAgICAgICAgIHNlbGYuY29udGVudAoKICAgICAgICByZXR1cm4gZGljdCgKICAgICAgICAgICAgKGF0dHIsIGdldGF0dHIoc2VsZiwgYXR0ciwgTm9uZSkpCiAgICAgICAgICAgIGZvciBhdHRyIGluIHNlbGYuX19hdHRyc19fCiAgICAgICAgKQoKICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgogICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBzdGF0ZS5pdGVtcygpOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIHZhbHVlKQoKICAgICAgICAjIHBpY2tsZWQgb2JqZWN0cyBkbyBub3QgaGF2ZSAucmF3CiAgICAgICAgc2V0YXR0cihzZWxmLCAnX2NvbnRlbnRfY29uc3VtZWQnLCBUcnVlKQogICAgICAgIHNldGF0dHIoc2VsZiwgJ3JhdycsIE5vbmUpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnPFJlc3BvbnNlIFslc10+JyAlIChzZWxmLnN0YXR1c19jb2RlKQoKICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToKICAgICAgICAiIiJSZXR1cm5zIFRydWUgaWYgOmF0dHI6YHN0YXR1c19jb2RlYCBpcyBsZXNzIHRoYW4gNDAwLgoKICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjaGVja3MgaWYgdGhlIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZSBpcyBiZXR3ZWVuCiAgICAgICAgNDAwIGFuZCA2MDAgdG8gc2VlIGlmIHRoZXJlIHdhcyBhIGNsaWVudCBlcnJvciBvciBhIHNlcnZlciBlcnJvci4gSWYKICAgICAgICB0aGUgc3RhdHVzIGNvZGUsIGlzIGJldHdlZW4gMjAwIGFuZCA0MDAsIHRoaXMgd2lsbCByZXR1cm4gVHJ1ZS4gVGhpcwogICAgICAgIGlzICoqbm90KiogYSBjaGVjayB0byBzZWUgaWYgdGhlIHJlc3BvbnNlIGNvZGUgaXMgYGAyMDAgT0tgYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5vawoKICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKICAgICAgICAiIiJSZXR1cm5zIFRydWUgaWYgOmF0dHI6YHN0YXR1c19jb2RlYCBpcyBsZXNzIHRoYW4gNDAwLgoKICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjaGVja3MgaWYgdGhlIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZSBpcyBiZXR3ZWVuCiAgICAgICAgNDAwIGFuZCA2MDAgdG8gc2VlIGlmIHRoZXJlIHdhcyBhIGNsaWVudCBlcnJvciBvciBhIHNlcnZlciBlcnJvci4gSWYKICAgICAgICB0aGUgc3RhdHVzIGNvZGUsIGlzIGJldHdlZW4gMjAwIGFuZCA0MDAsIHRoaXMgd2lsbCByZXR1cm4gVHJ1ZS4gVGhpcwogICAgICAgIGlzICoqbm90KiogYSBjaGVjayB0byBzZWUgaWYgdGhlIHJlc3BvbnNlIGNvZGUgaXMgYGAyMDAgT0tgYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5vawoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiJBbGxvd3MgeW91IHRvIHVzZSBhIHJlc3BvbnNlIGFzIGFuIGl0ZXJhdG9yLiIiIgogICAgICAgIHJldHVybiBzZWxmLml0ZXJfY29udGVudCgxMjgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgb2soc2VsZik6CiAgICAgICAgIiIiUmV0dXJucyBUcnVlIGlmIDphdHRyOmBzdGF0dXNfY29kZWAgaXMgbGVzcyB0aGFuIDQwMC4KCiAgICAgICAgVGhpcyBhdHRyaWJ1dGUgY2hlY2tzIGlmIHRoZSBzdGF0dXMgY29kZSBvZiB0aGUgcmVzcG9uc2UgaXMgYmV0d2VlbgogICAgICAgIDQwMCBhbmQgNjAwIHRvIHNlZSBpZiB0aGVyZSB3YXMgYSBjbGllbnQgZXJyb3Igb3IgYSBzZXJ2ZXIgZXJyb3IuIElmCiAgICAgICAgdGhlIHN0YXR1cyBjb2RlLCBpcyBiZXR3ZWVuIDIwMCBhbmQgNDAwLCB0aGlzIHdpbGwgcmV0dXJuIFRydWUuIFRoaXMKICAgICAgICBpcyAqKm5vdCoqIGEgY2hlY2sgdG8gc2VlIGlmIHRoZSByZXNwb25zZSBjb2RlIGlzIGBgMjAwIE9LYGAuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnJhaXNlX2Zvcl9zdGF0dXMoKQogICAgICAgIGV4Y2VwdCBIVFRQRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBUcnVlCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcmVkaXJlY3Qoc2VsZik6CiAgICAgICAgIiIiVHJ1ZSBpZiB0aGlzIFJlc3BvbnNlIGlzIGEgd2VsbC1mb3JtZWQgSFRUUCByZWRpcmVjdCB0aGF0IGNvdWxkIGhhdmUKICAgICAgICBiZWVuIHByb2Nlc3NlZCBhdXRvbWF0aWNhbGx5IChieSA6bWV0aDpgU2Vzc2lvbi5yZXNvbHZlX3JlZGlyZWN0c2ApLgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoJ2xvY2F0aW9uJyBpbiBzZWxmLmhlYWRlcnMgYW5kIHNlbGYuc3RhdHVzX2NvZGUgaW4gUkVESVJFQ1RfU1RBVEkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcGVybWFuZW50X3JlZGlyZWN0KHNlbGYpOgogICAgICAgICIiIlRydWUgaWYgdGhpcyBSZXNwb25zZSBvbmUgb2YgdGhlIHBlcm1hbmVudCB2ZXJzaW9ucyBvZiByZWRpcmVjdC4iIiIKICAgICAgICByZXR1cm4gKCdsb2NhdGlvbicgaW4gc2VsZi5oZWFkZXJzIGFuZCBzZWxmLnN0YXR1c19jb2RlIGluIChjb2Rlcy5tb3ZlZF9wZXJtYW5lbnRseSwgY29kZXMucGVybWFuZW50X3JlZGlyZWN0KSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBuZXh0KHNlbGYpOgogICAgICAgICIiIlJldHVybnMgYSBQcmVwYXJlZFJlcXVlc3QgZm9yIHRoZSBuZXh0IHJlcXVlc3QgaW4gYSByZWRpcmVjdCBjaGFpbiwgaWYgdGhlcmUgaXMgb25lLiIiIgogICAgICAgIHJldHVybiBzZWxmLl9uZXh0CgogICAgQHByb3BlcnR5CiAgICBkZWYgYXBwYXJlbnRfZW5jb2Rpbmcoc2VsZik6CiAgICAgICAgIiIiVGhlIGFwcGFyZW50IGVuY29kaW5nLCBwcm92aWRlZCBieSB0aGUgY2hhcmRldCBsaWJyYXJ5LiIiIgogICAgICAgIHJldHVybiBjaGFyZGV0LmRldGVjdChzZWxmLmNvbnRlbnQpWydlbmNvZGluZyddCgogICAgZGVmIGl0ZXJfY29udGVudChzZWxmLCBjaHVua19zaXplPTEsIGRlY29kZV91bmljb2RlPUZhbHNlKToKICAgICAgICAiIiJJdGVyYXRlcyBvdmVyIHRoZSByZXNwb25zZSBkYXRhLiAgV2hlbiBzdHJlYW09VHJ1ZSBpcyBzZXQgb24gdGhlCiAgICAgICAgcmVxdWVzdCwgdGhpcyBhdm9pZHMgcmVhZGluZyB0aGUgY29udGVudCBhdCBvbmNlIGludG8gbWVtb3J5IGZvcgogICAgICAgIGxhcmdlIHJlc3BvbnNlcy4gIFRoZSBjaHVuayBzaXplIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaXQgc2hvdWxkCiAgICAgICAgcmVhZCBpbnRvIG1lbW9yeS4gIFRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBsZW5ndGggb2YgZWFjaCBpdGVtCiAgICAgICAgcmV0dXJuZWQgYXMgZGVjb2RpbmcgY2FuIHRha2UgcGxhY2UuCgogICAgICAgIGNodW5rX3NpemUgbXVzdCBiZSBvZiB0eXBlIGludCBvciBOb25lLiBBIHZhbHVlIG9mIE5vbmUgd2lsbAogICAgICAgIGZ1bmN0aW9uIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgYHN0cmVhbWAuCiAgICAgICAgc3RyZWFtPVRydWUgd2lsbCByZWFkIGRhdGEgYXMgaXQgYXJyaXZlcyBpbiB3aGF0ZXZlciBzaXplIHRoZQogICAgICAgIGNodW5rcyBhcmUgcmVjZWl2ZWQuIElmIHN0cmVhbT1GYWxzZSwgZGF0YSBpcyByZXR1cm5lZCBhcwogICAgICAgIGEgc2luZ2xlIGNodW5rLgoKICAgICAgICBJZiBkZWNvZGVfdW5pY29kZSBpcyBUcnVlLCBjb250ZW50IHdpbGwgYmUgZGVjb2RlZCB1c2luZyB0aGUgYmVzdAogICAgICAgIGF2YWlsYWJsZSBlbmNvZGluZyBiYXNlZCBvbiB0aGUgcmVzcG9uc2UuCiAgICAgICAgIiIiCgogICAgICAgIGRlZiBnZW5lcmF0ZSgpOgogICAgICAgICAgICAjIFNwZWNpYWwgY2FzZSBmb3IgdXJsbGliMy4KICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLnJhdywgJ3N0cmVhbScpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGZvciBjaHVuayBpbiBzZWxmLnJhdy5zdHJlYW0oY2h1bmtfc2l6ZSwgZGVjb2RlX2NvbnRlbnQ9VHJ1ZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGNodW5rCiAgICAgICAgICAgICAgICBleGNlcHQgUHJvdG9jb2xFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIENodW5rZWRFbmNvZGluZ0Vycm9yKGUpCiAgICAgICAgICAgICAgICBleGNlcHQgRGVjb2RlRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBDb250ZW50RGVjb2RpbmdFcnJvcihlKQogICAgICAgICAgICAgICAgZXhjZXB0IFJlYWRUaW1lb3V0RXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBDb25uZWN0aW9uRXJyb3IoZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgU3RhbmRhcmQgZmlsZS1saWtlIG9iamVjdC4KICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSBzZWxmLnJhdy5yZWFkKGNodW5rX3NpemUpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNodW5rOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIHlpZWxkIGNodW5rCgogICAgICAgICAgICBzZWxmLl9jb250ZW50X2NvbnN1bWVkID0gVHJ1ZQoKICAgICAgICBpZiBzZWxmLl9jb250ZW50X2NvbnN1bWVkIGFuZCBpc2luc3RhbmNlKHNlbGYuX2NvbnRlbnQsIGJvb2wpOgogICAgICAgICAgICByYWlzZSBTdHJlYW1Db25zdW1lZEVycm9yKCkKICAgICAgICBlbGlmIGNodW5rX3NpemUgaXMgbm90IE5vbmUgYW5kIG5vdCBpc2luc3RhbmNlKGNodW5rX3NpemUsIGludCk6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY2h1bmtfc2l6ZSBtdXN0IGJlIGFuIGludCwgaXQgaXMgaW5zdGVhZCBhICVzLiIgJSB0eXBlKGNodW5rX3NpemUpKQogICAgICAgICMgc2ltdWxhdGUgcmVhZGluZyBzbWFsbCBjaHVua3Mgb2YgdGhlIGNvbnRlbnQKICAgICAgICByZXVzZWRfY2h1bmtzID0gaXRlcl9zbGljZXMoc2VsZi5fY29udGVudCwgY2h1bmtfc2l6ZSkKCiAgICAgICAgc3RyZWFtX2NodW5rcyA9IGdlbmVyYXRlKCkKCiAgICAgICAgY2h1bmtzID0gcmV1c2VkX2NodW5rcyBpZiBzZWxmLl9jb250ZW50X2NvbnN1bWVkIGVsc2Ugc3RyZWFtX2NodW5rcwoKICAgICAgICBpZiBkZWNvZGVfdW5pY29kZToKICAgICAgICAgICAgY2h1bmtzID0gc3RyZWFtX2RlY29kZV9yZXNwb25zZV91bmljb2RlKGNodW5rcywgc2VsZikKCiAgICAgICAgcmV0dXJuIGNodW5rcwoKICAgIGRlZiBpdGVyX2xpbmVzKHNlbGYsIGNodW5rX3NpemU9SVRFUl9DSFVOS19TSVpFLCBkZWNvZGVfdW5pY29kZT1Ob25lLCBkZWxpbWl0ZXI9Tm9uZSk6CiAgICAgICAgIiIiSXRlcmF0ZXMgb3ZlciB0aGUgcmVzcG9uc2UgZGF0YSwgb25lIGxpbmUgYXQgYSB0aW1lLiAgV2hlbgogICAgICAgIHN0cmVhbT1UcnVlIGlzIHNldCBvbiB0aGUgcmVxdWVzdCwgdGhpcyBhdm9pZHMgcmVhZGluZyB0aGUKICAgICAgICBjb250ZW50IGF0IG9uY2UgaW50byBtZW1vcnkgZm9yIGxhcmdlIHJlc3BvbnNlcy4KCiAgICAgICAgLi4gbm90ZTo6IFRoaXMgbWV0aG9kIGlzIG5vdCByZWVudHJhbnQgc2FmZS4KICAgICAgICAiIiIKCiAgICAgICAgcGVuZGluZyA9IE5vbmUKCiAgICAgICAgZm9yIGNodW5rIGluIHNlbGYuaXRlcl9jb250ZW50KGNodW5rX3NpemU9Y2h1bmtfc2l6ZSwgZGVjb2RlX3VuaWNvZGU9ZGVjb2RlX3VuaWNvZGUpOgoKICAgICAgICAgICAgaWYgcGVuZGluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGNodW5rID0gcGVuZGluZyArIGNodW5rCgogICAgICAgICAgICBpZiBkZWxpbWl0ZXI6CiAgICAgICAgICAgICAgICBsaW5lcyA9IGNodW5rLnNwbGl0KGRlbGltaXRlcikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxpbmVzID0gY2h1bmsuc3BsaXRsaW5lcygpCgogICAgICAgICAgICBpZiBsaW5lcyBhbmQgbGluZXNbLTFdIGFuZCBjaHVuayBhbmQgbGluZXNbLTFdWy0xXSA9PSBjaHVua1stMV06CiAgICAgICAgICAgICAgICBwZW5kaW5nID0gbGluZXMucG9wKCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBlbmRpbmcgPSBOb25lCgogICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKCiAgICAgICAgaWYgcGVuZGluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgeWllbGQgcGVuZGluZwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbnRlbnQoc2VsZik6CiAgICAgICAgIiIiQ29udGVudCBvZiB0aGUgcmVzcG9uc2UsIGluIGJ5dGVzLiIiIgoKICAgICAgICBpZiBzZWxmLl9jb250ZW50IGlzIEZhbHNlOgogICAgICAgICAgICAjIFJlYWQgdGhlIGNvbnRlbnRzLgogICAgICAgICAgICBpZiBzZWxmLl9jb250ZW50X2NvbnN1bWVkOgogICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAogICAgICAgICAgICAgICAgICAgICdUaGUgY29udGVudCBmb3IgdGhpcyByZXNwb25zZSB3YXMgYWxyZWFkeSBjb25zdW1lZCcpCgogICAgICAgICAgICBpZiBzZWxmLnN0YXR1c19jb2RlID09IDAgb3Igc2VsZi5yYXcgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbnRlbnQgPSBOb25lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb250ZW50ID0gYnl0ZXMoKS5qb2luKHNlbGYuaXRlcl9jb250ZW50KENPTlRFTlRfQ0hVTktfU0laRSkpIG9yIGJ5dGVzKCkKCiAgICAgICAgc2VsZi5fY29udGVudF9jb25zdW1lZCA9IFRydWUKICAgICAgICAjIGRvbid0IG5lZWQgdG8gcmVsZWFzZSB0aGUgY29ubmVjdGlvbjsgdGhhdCdzIGJlZW4gaGFuZGxlZCBieSB1cmxsaWIzCiAgICAgICAgIyBzaW5jZSB3ZSBleGhhdXN0ZWQgdGhlIGRhdGEuCiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRlbnQKCiAgICBAcHJvcGVydHkKICAgIGRlZiB0ZXh0KHNlbGYpOgogICAgICAgICIiIkNvbnRlbnQgb2YgdGhlIHJlc3BvbnNlLCBpbiB1bmljb2RlLgoKICAgICAgICBJZiBSZXNwb25zZS5lbmNvZGluZyBpcyBOb25lLCBlbmNvZGluZyB3aWxsIGJlIGd1ZXNzZWQgdXNpbmcKICAgICAgICBgYGNoYXJkZXRgYC4KCiAgICAgICAgVGhlIGVuY29kaW5nIG9mIHRoZSByZXNwb25zZSBjb250ZW50IGlzIGRldGVybWluZWQgYmFzZWQgc29sZWx5IG9uIEhUVFAKICAgICAgICBoZWFkZXJzLCBmb2xsb3dpbmcgUkZDIDI2MTYgdG8gdGhlIGxldHRlci4gSWYgeW91IGNhbiB0YWtlIGFkdmFudGFnZSBvZgogICAgICAgIG5vbi1IVFRQIGtub3dsZWRnZSB0byBtYWtlIGEgYmV0dGVyIGd1ZXNzIGF0IHRoZSBlbmNvZGluZywgeW91IHNob3VsZAogICAgICAgIHNldCBgYHIuZW5jb2RpbmdgYCBhcHByb3ByaWF0ZWx5IGJlZm9yZSBhY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eS4KICAgICAgICAiIiIKCiAgICAgICAgIyBUcnkgY2hhcnNldCBmcm9tIGNvbnRlbnQtdHlwZQogICAgICAgIGNvbnRlbnQgPSBOb25lCiAgICAgICAgZW5jb2RpbmcgPSBzZWxmLmVuY29kaW5nCgogICAgICAgIGlmIG5vdCBzZWxmLmNvbnRlbnQ6CiAgICAgICAgICAgIHJldHVybiBzdHIoJycpCgogICAgICAgICMgRmFsbGJhY2sgdG8gYXV0by1kZXRlY3RlZCBlbmNvZGluZy4KICAgICAgICBpZiBzZWxmLmVuY29kaW5nIGlzIE5vbmU6CiAgICAgICAgICAgIGVuY29kaW5nID0gc2VsZi5hcHBhcmVudF9lbmNvZGluZwoKICAgICAgICAjIERlY29kZSB1bmljb2RlIGZyb20gZ2l2ZW4gZW5jb2RpbmcuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb250ZW50ID0gc3RyKHNlbGYuY29udGVudCwgZW5jb2RpbmcsIGVycm9ycz0ncmVwbGFjZScpCiAgICAgICAgZXhjZXB0IChMb29rdXBFcnJvciwgVHlwZUVycm9yKToKICAgICAgICAgICAgIyBBIExvb2t1cEVycm9yIGlzIHJhaXNlZCBpZiB0aGUgZW5jb2Rpbmcgd2FzIG5vdCBmb3VuZCB3aGljaCBjb3VsZAogICAgICAgICAgICAjIGluZGljYXRlIGEgbWlzc3BlbGxpbmcgb3Igc2ltaWxhciBtaXN0YWtlLgogICAgICAgICAgICAjCiAgICAgICAgICAgICMgQSBUeXBlRXJyb3IgY2FuIGJlIHJhaXNlZCBpZiBlbmNvZGluZyBpcyBOb25lCiAgICAgICAgICAgICMKICAgICAgICAgICAgIyBTbyB3ZSB0cnkgYmxpbmRseSBlbmNvZGluZy4KICAgICAgICAgICAgY29udGVudCA9IHN0cihzZWxmLmNvbnRlbnQsIGVycm9ycz0ncmVwbGFjZScpCgogICAgICAgIHJldHVybiBjb250ZW50CgogICAgZGVmIGpzb24oc2VsZiwgKiprd2FyZ3MpOgogICAgICAgIHIiIiJSZXR1cm5zIHRoZSBqc29uLWVuY29kZWQgY29udGVudCBvZiBhIHJlc3BvbnNlLCBpZiBhbnkuCgogICAgICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYGpzb24ubG9hZHNgYCB0YWtlcy4KICAgICAgICA6cmFpc2VzIFZhbHVlRXJyb3I6IElmIHRoZSByZXNwb25zZSBib2R5IGRvZXMgbm90IGNvbnRhaW4gdmFsaWQganNvbi4KICAgICAgICAiIiIKCiAgICAgICAgaWYgbm90IHNlbGYuZW5jb2RpbmcgYW5kIHNlbGYuY29udGVudCBhbmQgbGVuKHNlbGYuY29udGVudCkgPiAzOgogICAgICAgICAgICAjIE5vIGVuY29kaW5nIHNldC4gSlNPTiBSRkMgNDYyNyBzZWN0aW9uIDMgc3RhdGVzIHdlIHNob3VsZCBleHBlY3QKICAgICAgICAgICAgIyBVVEYtOCwgLTE2IG9yIC0zMi4gRGV0ZWN0IHdoaWNoIG9uZSB0byB1c2U7IElmIHRoZSBkZXRlY3Rpb24gb3IKICAgICAgICAgICAgIyBkZWNvZGluZyBmYWlscywgZmFsbCBiYWNrIHRvIGBzZWxmLnRleHRgICh1c2luZyBjaGFyZGV0IHRvIG1ha2UKICAgICAgICAgICAgIyBhIGJlc3QgZ3Vlc3MpLgogICAgICAgICAgICBlbmNvZGluZyA9IGd1ZXNzX2pzb25fdXRmKHNlbGYuY29udGVudCkKICAgICAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXhqc29uLmxvYWRzKAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRlbnQuZGVjb2RlKGVuY29kaW5nKSwgKiprd2FyZ3MKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICAgICAgICAgICMgV3JvbmcgVVRGIGNvZGVjIGRldGVjdGVkOyB1c3VhbGx5IGJlY2F1c2UgaXQncyBub3QgVVRGLTgKICAgICAgICAgICAgICAgICAgICAjIGJ1dCBzb21lIG90aGVyIDgtYml0IGNvZGVjLiAgVGhpcyBpcyBhbiBSRkMgdmlvbGF0aW9uLAogICAgICAgICAgICAgICAgICAgICMgYW5kIHRoZSBzZXJ2ZXIgZGlkbid0IGJvdGhlciB0byB0ZWxsIHVzIHdoYXQgY29kZWMgKndhcyoKICAgICAgICAgICAgICAgICAgICAjIHVzZWQuCiAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiBjb21wbGV4anNvbi5sb2FkcyhzZWxmLnRleHQsICoqa3dhcmdzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxpbmtzKHNlbGYpOgogICAgICAgICIiIlJldHVybnMgdGhlIHBhcnNlZCBoZWFkZXIgbGlua3Mgb2YgdGhlIHJlc3BvbnNlLCBpZiBhbnkuIiIiCgogICAgICAgIGhlYWRlciA9IHNlbGYuaGVhZGVycy5nZXQoJ2xpbmsnKQoKICAgICAgICAjIGwgPSBNdWx0aURpY3QoKQogICAgICAgIGwgPSB7fQoKICAgICAgICBpZiBoZWFkZXI6CiAgICAgICAgICAgIGxpbmtzID0gcGFyc2VfaGVhZGVyX2xpbmtzKGhlYWRlcikKCiAgICAgICAgICAgIGZvciBsaW5rIGluIGxpbmtzOgogICAgICAgICAgICAgICAga2V5ID0gbGluay5nZXQoJ3JlbCcpIG9yIGxpbmsuZ2V0KCd1cmwnKQogICAgICAgICAgICAgICAgbFtrZXldID0gbGluawoKICAgICAgICByZXR1cm4gbAoKICAgIGRlZiByYWlzZV9mb3Jfc3RhdHVzKHNlbGYpOgogICAgICAgICIiIlJhaXNlcyBzdG9yZWQgOmNsYXNzOmBIVFRQRXJyb3JgLCBpZiBvbmUgb2NjdXJyZWQuIiIiCgogICAgICAgIGh0dHBfZXJyb3JfbXNnID0gJycKICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYucmVhc29uLCBieXRlcyk6CiAgICAgICAgICAgICMgV2UgYXR0ZW1wdCB0byBkZWNvZGUgdXRmLTggZmlyc3QgYmVjYXVzZSBzb21lIHNlcnZlcnMKICAgICAgICAgICAgIyBjaG9vc2UgdG8gbG9jYWxpemUgdGhlaXIgcmVhc29uIHN0cmluZ3MuIElmIHRoZSBzdHJpbmcKICAgICAgICAgICAgIyBpc24ndCB1dGYtOCwgd2UgZmFsbCBiYWNrIHRvIGlzby04ODU5LTEgZm9yIGFsbCBvdGhlcgogICAgICAgICAgICAjIGVuY29kaW5ncy4gKFNlZSBQUiAjMzUzOCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVhc29uID0gc2VsZi5yZWFzb24uZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgICAgICByZWFzb24gPSBzZWxmLnJlYXNvbi5kZWNvZGUoJ2lzby04ODU5LTEnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlYXNvbiA9IHNlbGYucmVhc29uCgogICAgICAgIGlmIDQwMCA8PSBzZWxmLnN0YXR1c19jb2RlIDwgNTAwOgogICAgICAgICAgICBodHRwX2Vycm9yX21zZyA9IHUnJXMgQ2xpZW50IEVycm9yOiAlcyBmb3IgdXJsOiAlcycgJSAoc2VsZi5zdGF0dXNfY29kZSwgcmVhc29uLCBzZWxmLnVybCkKCiAgICAgICAgZWxpZiA1MDAgPD0gc2VsZi5zdGF0dXNfY29kZSA8IDYwMDoKICAgICAgICAgICAgaHR0cF9lcnJvcl9tc2cgPSB1JyVzIFNlcnZlciBFcnJvcjogJXMgZm9yIHVybDogJXMnICUgKHNlbGYuc3RhdHVzX2NvZGUsIHJlYXNvbiwgc2VsZi51cmwpCgogICAgICAgIGlmIGh0dHBfZXJyb3JfbXNnOgogICAgICAgICAgICByYWlzZSBIVFRQRXJyb3IoaHR0cF9lcnJvcl9tc2csIHJlc3BvbnNlPXNlbGYpCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIlJlbGVhc2VzIHRoZSBjb25uZWN0aW9uIGJhY2sgdG8gdGhlIHBvb2wuIE9uY2UgdGhpcyBtZXRob2QgaGFzIGJlZW4KICAgICAgICBjYWxsZWQgdGhlIHVuZGVybHlpbmcgYGByYXdgYCBvYmplY3QgbXVzdCBub3QgYmUgYWNjZXNzZWQgYWdhaW4uCgogICAgICAgICpOb3RlOiBTaG91bGQgbm90IG5vcm1hbGx5IG5lZWQgdG8gYmUgY2FsbGVkIGV4cGxpY2l0bHkuKgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLl9jb250ZW50X2NvbnN1bWVkOgogICAgICAgICAgICBzZWxmLnJhdy5jbG9zZSgpCgogICAgICAgIHJlbGVhc2VfY29ubiA9IGdldGF0dHIoc2VsZi5yYXcsICdyZWxlYXNlX2Nvbm4nLCBOb25lKQogICAgICAgIGlmIHJlbGVhc2VfY29ubiBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmVsZWFzZV9jb25uKCkKUEsDBBQAAAAAAAAAIQASPN6BtwIAALcCAAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3BhY2thZ2VzLnB5aW1wb3J0IHN5cwoKIyBUaGlzIGNvZGUgZXhpc3RzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zLgojIEkgZG9uJ3QgbGlrZSBpdCBlaXRoZXIuIEp1c3QgbG9vayB0aGUgb3RoZXIgd2F5LiA6KQoKZm9yIHBhY2thZ2UgaW4gKCd1cmxsaWIzJywgJ2lkbmEnLCAnY2hhcmRldCcpOgogICAgdmVuZG9yZWRfcGFja2FnZSA9ICJwaXAuX3ZlbmRvci4iICsgcGFja2FnZQogICAgbG9jYWxzKClbcGFja2FnZV0gPSBfX2ltcG9ydF9fKHZlbmRvcmVkX3BhY2thZ2UpCiAgICAjIFRoaXMgdHJhdmVyc2FsIGlzIGFwcGFyZW50bHkgbmVjZXNzYXJ5IHN1Y2ggdGhhdCB0aGUgaWRlbnRpdGllcyBhcmUKICAgICMgcHJlc2VydmVkIChyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLiogaXMgdXJsbGliMy4qKQogICAgZm9yIG1vZCBpbiBsaXN0KHN5cy5tb2R1bGVzKToKICAgICAgICBpZiBtb2QgPT0gdmVuZG9yZWRfcGFja2FnZSBvciBtb2Quc3RhcnRzd2l0aCh2ZW5kb3JlZF9wYWNrYWdlICsgJy4nKToKICAgICAgICAgICAgdW5wcmVmaXhlZF9tb2QgPSBtb2RbbGVuKCJwaXAuX3ZlbmRvci4iKTpdCiAgICAgICAgICAgIHN5cy5tb2R1bGVzWydwaXAuX3ZlbmRvci5yZXF1ZXN0cy5wYWNrYWdlcy4nICsgdW5wcmVmaXhlZF9tb2RdID0gc3lzLm1vZHVsZXNbbW9kXQoKIyBLaW5kYSBjb29sLCB0aG91Z2gsIHJpZ2h0PwpQSwMEFAAAAAAAAAAhAF+fZpmaawAAmmsAADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvc2Vzc2lvbnMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLnNlc3Npb24Kfn5+fn5+fn5+fn5+fn5+fgoKVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBTZXNzaW9uIG9iamVjdCB0byBtYW5hZ2UgYW5kIHBlcnNpc3Qgc2V0dGluZ3MgYWNyb3NzCnJlcXVlc3RzIChjb29raWVzLCBhdXRoLCBwcm94aWVzKS4KIiIiCmltcG9ydCBvcwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHRpbWUKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgTWFwcGluZwpmcm9tIGRhdGV0aW1lIGltcG9ydCB0aW1lZGVsdGEKCmZyb20gLmF1dGggaW1wb3J0IF9iYXNpY19hdXRoX3N0cgpmcm9tIC5jb21wYXQgaW1wb3J0IGNvb2tpZWxpYiwgaXNfcHkzLCBPcmRlcmVkRGljdCwgdXJsam9pbiwgdXJscGFyc2UKZnJvbSAuY29va2llcyBpbXBvcnQgKAogICAgY29va2llamFyX2Zyb21fZGljdCwgZXh0cmFjdF9jb29raWVzX3RvX2phciwgUmVxdWVzdHNDb29raWVKYXIsIG1lcmdlX2Nvb2tpZXMpCmZyb20gLm1vZGVscyBpbXBvcnQgUmVxdWVzdCwgUHJlcGFyZWRSZXF1ZXN0LCBERUZBVUxUX1JFRElSRUNUX0xJTUlUCmZyb20gLmhvb2tzIGltcG9ydCBkZWZhdWx0X2hvb2tzLCBkaXNwYXRjaF9ob29rCmZyb20gLl9pbnRlcm5hbF91dGlscyBpbXBvcnQgdG9fbmF0aXZlX3N0cmluZwpmcm9tIC51dGlscyBpbXBvcnQgdG9fa2V5X3ZhbF9saXN0LCBkZWZhdWx0X2hlYWRlcnMKZnJvbSAuZXhjZXB0aW9ucyBpbXBvcnQgKAogICAgVG9vTWFueVJlZGlyZWN0cywgSW52YWxpZFNjaGVtYSwgQ2h1bmtlZEVuY29kaW5nRXJyb3IsIENvbnRlbnREZWNvZGluZ0Vycm9yKQoKZnJvbSAuc3RydWN0dXJlcyBpbXBvcnQgQ2FzZUluc2Vuc2l0aXZlRGljdApmcm9tIC5hZGFwdGVycyBpbXBvcnQgSFRUUEFkYXB0ZXIKCmZyb20gLnV0aWxzIGltcG9ydCAoCiAgICByZXF1b3RlX3VyaSwgZ2V0X2Vudmlyb25fcHJveGllcywgZ2V0X25ldHJjX2F1dGgsIHNob3VsZF9ieXBhc3NfcHJveGllcywKICAgIGdldF9hdXRoX2Zyb21fdXJsLCByZXdpbmRfYm9keQopCgpmcm9tIC5zdGF0dXNfY29kZXMgaW1wb3J0IGNvZGVzCgojIGZvcm1lcmx5IGRlZmluZWQgaGVyZSwgcmVleHBvc2VkIGhlcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKZnJvbSAubW9kZWxzIGltcG9ydCBSRURJUkVDVF9TVEFUSQoKIyBQcmVmZXJyZWQgY2xvY2ssIGJhc2VkIG9uIHdoaWNoIG9uZSBpcyBtb3JlIGFjY3VyYXRlIG9uIGEgZ2l2ZW4gc3lzdGVtLgppZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnV2luZG93cyc6CiAgICB0cnk6ICAjIFB5dGhvbiAzLjMrCiAgICAgICAgcHJlZmVycmVkX2Nsb2NrID0gdGltZS5wZXJmX2NvdW50ZXIKICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjogICMgRWFybGllciB0aGFuIFB5dGhvbiAzLgogICAgICAgIHByZWZlcnJlZF9jbG9jayA9IHRpbWUuY2xvY2sKZWxzZToKICAgIHByZWZlcnJlZF9jbG9jayA9IHRpbWUudGltZQoKCmRlZiBtZXJnZV9zZXR0aW5nKHJlcXVlc3Rfc2V0dGluZywgc2Vzc2lvbl9zZXR0aW5nLCBkaWN0X2NsYXNzPU9yZGVyZWREaWN0KToKICAgICIiIkRldGVybWluZXMgYXBwcm9wcmlhdGUgc2V0dGluZyBmb3IgYSBnaXZlbiByZXF1ZXN0LCB0YWtpbmcgaW50byBhY2NvdW50CiAgICB0aGUgZXhwbGljaXQgc2V0dGluZyBvbiB0aGF0IHJlcXVlc3QsIGFuZCB0aGUgc2V0dGluZyBpbiB0aGUgc2Vzc2lvbi4gSWYgYQogICAgc2V0dGluZyBpcyBhIGRpY3Rpb25hcnksIHRoZXkgd2lsbCBiZSBtZXJnZWQgdG9nZXRoZXIgdXNpbmcgYGRpY3RfY2xhc3NgCiAgICAiIiIKCiAgICBpZiBzZXNzaW9uX3NldHRpbmcgaXMgTm9uZToKICAgICAgICByZXR1cm4gcmVxdWVzdF9zZXR0aW5nCgogICAgaWYgcmVxdWVzdF9zZXR0aW5nIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIHNlc3Npb25fc2V0dGluZwoKICAgICMgQnlwYXNzIGlmIG5vdCBhIGRpY3Rpb25hcnkgKGUuZy4gdmVyaWZ5KQogICAgaWYgbm90ICgKICAgICAgICAgICAgaXNpbnN0YW5jZShzZXNzaW9uX3NldHRpbmcsIE1hcHBpbmcpIGFuZAogICAgICAgICAgICBpc2luc3RhbmNlKHJlcXVlc3Rfc2V0dGluZywgTWFwcGluZykKICAgICk6CiAgICAgICAgcmV0dXJuIHJlcXVlc3Rfc2V0dGluZwoKICAgIG1lcmdlZF9zZXR0aW5nID0gZGljdF9jbGFzcyh0b19rZXlfdmFsX2xpc3Qoc2Vzc2lvbl9zZXR0aW5nKSkKICAgIG1lcmdlZF9zZXR0aW5nLnVwZGF0ZSh0b19rZXlfdmFsX2xpc3QocmVxdWVzdF9zZXR0aW5nKSkKCiAgICAjIFJlbW92ZSBrZXlzIHRoYXQgYXJlIHNldCB0byBOb25lLiBFeHRyYWN0IGtleXMgZmlyc3QgdG8gYXZvaWQgYWx0ZXJpbmcKICAgICMgdGhlIGRpY3Rpb25hcnkgZHVyaW5nIGl0ZXJhdGlvbi4KICAgIG5vbmVfa2V5cyA9IFtrIGZvciAoaywgdikgaW4gbWVyZ2VkX3NldHRpbmcuaXRlbXMoKSBpZiB2IGlzIE5vbmVdCiAgICBmb3Iga2V5IGluIG5vbmVfa2V5czoKICAgICAgICBkZWwgbWVyZ2VkX3NldHRpbmdba2V5XQoKICAgIHJldHVybiBtZXJnZWRfc2V0dGluZwoKCmRlZiBtZXJnZV9ob29rcyhyZXF1ZXN0X2hvb2tzLCBzZXNzaW9uX2hvb2tzLCBkaWN0X2NsYXNzPU9yZGVyZWREaWN0KToKICAgICIiIlByb3Blcmx5IG1lcmdlcyBib3RoIHJlcXVlc3RzIGFuZCBzZXNzaW9uIGhvb2tzLgoKICAgIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2hlbiByZXF1ZXN0X2hvb2tzID09IHsncmVzcG9uc2UnOiBbXX0sIHRoZQogICAgbWVyZ2UgYnJlYWtzIFNlc3Npb24gaG9va3MgZW50aXJlbHkuCiAgICAiIiIKICAgIGlmIHNlc3Npb25faG9va3MgaXMgTm9uZSBvciBzZXNzaW9uX2hvb2tzLmdldCgncmVzcG9uc2UnKSA9PSBbXToKICAgICAgICByZXR1cm4gcmVxdWVzdF9ob29rcwoKICAgIGlmIHJlcXVlc3RfaG9va3MgaXMgTm9uZSBvciByZXF1ZXN0X2hvb2tzLmdldCgncmVzcG9uc2UnKSA9PSBbXToKICAgICAgICByZXR1cm4gc2Vzc2lvbl9ob29rcwoKICAgIHJldHVybiBtZXJnZV9zZXR0aW5nKHJlcXVlc3RfaG9va3MsIHNlc3Npb25faG9va3MsIGRpY3RfY2xhc3MpCgoKY2xhc3MgU2Vzc2lvblJlZGlyZWN0TWl4aW4ob2JqZWN0KToKCiAgICBkZWYgZ2V0X3JlZGlyZWN0X3RhcmdldChzZWxmLCByZXNwKToKICAgICAgICAiIiJSZWNlaXZlcyBhIFJlc3BvbnNlLiBSZXR1cm5zIGEgcmVkaXJlY3QgVVJJIG9yIGBgTm9uZWBgIiIiCiAgICAgICAgIyBEdWUgdG8gdGhlIG5hdHVyZSBvZiBob3cgcmVxdWVzdHMgcHJvY2Vzc2VzIHJlZGlyZWN0cyB0aGlzIG1ldGhvZCB3aWxsCiAgICAgICAgIyBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZSB1cG9uIHRoZSBvcmlnaW5hbCByZXNwb25zZSBhbmQgYXQgbGVhc3QgdHdpY2UKICAgICAgICAjIG9uIGVhY2ggc3Vic2VxdWVudCByZWRpcmVjdCByZXNwb25zZSAoaWYgYW55KS4KICAgICAgICAjIElmIGEgY3VzdG9tIG1peGluIGlzIHVzZWQgdG8gaGFuZGxlIHRoaXMgbG9naWMsIGl0IG1heSBiZSBhZHZhbnRhZ2VvdXMKICAgICAgICAjIHRvIGNhY2hlIHRoZSByZWRpcmVjdCBsb2NhdGlvbiBvbnRvIHRoZSByZXNwb25zZSBvYmplY3QgYXMgYSBwcml2YXRlCiAgICAgICAgIyBhdHRyaWJ1dGUuCiAgICAgICAgaWYgcmVzcC5pc19yZWRpcmVjdDoKICAgICAgICAgICAgbG9jYXRpb24gPSByZXNwLmhlYWRlcnNbJ2xvY2F0aW9uJ10KICAgICAgICAgICAgIyBDdXJyZW50bHkgdGhlIHVuZGVybHlpbmcgaHR0cCBtb2R1bGUgb24gcHkzIGRlY29kZSBoZWFkZXJzCiAgICAgICAgICAgICMgaW4gbGF0aW4xLCBidXQgZW1waXJpY2FsIGV2aWRlbmNlIHN1Z2dlc3RzIHRoYXQgbGF0aW4xIGlzIHZlcnkKICAgICAgICAgICAgIyByYXJlbHkgdXNlZCB3aXRoIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIEhUVFAgaGVhZGVycy4KICAgICAgICAgICAgIyBJdCBpcyBtb3JlIGxpa2VseSB0byBnZXQgVVRGOCBoZWFkZXIgcmF0aGVyIHRoYW4gbGF0aW4xLgogICAgICAgICAgICAjIFRoaXMgY2F1c2VzIGluY29ycmVjdCBoYW5kbGluZyBvZiBVVEY4IGVuY29kZWQgbG9jYXRpb24gaGVhZGVycy4KICAgICAgICAgICAgIyBUbyBzb2x2ZSB0aGlzLCB3ZSByZS1lbmNvZGUgdGhlIGxvY2F0aW9uIGluIGxhdGluMS4KICAgICAgICAgICAgaWYgaXNfcHkzOgogICAgICAgICAgICAgICAgbG9jYXRpb24gPSBsb2NhdGlvbi5lbmNvZGUoJ2xhdGluMScpCiAgICAgICAgICAgIHJldHVybiB0b19uYXRpdmVfc3RyaW5nKGxvY2F0aW9uLCAndXRmOCcpCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgcmVzb2x2ZV9yZWRpcmVjdHMoc2VsZiwgcmVzcCwgcmVxLCBzdHJlYW09RmFsc2UsIHRpbWVvdXQ9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJpZnk9VHJ1ZSwgY2VydD1Ob25lLCBwcm94aWVzPU5vbmUsIHlpZWxkX3JlcXVlc3RzPUZhbHNlLCAqKmFkYXB0ZXJfa3dhcmdzKToKICAgICAgICAiIiJSZWNlaXZlcyBhIFJlc3BvbnNlLiBSZXR1cm5zIGEgZ2VuZXJhdG9yIG9mIFJlc3BvbnNlcyBvciBSZXF1ZXN0cy4iIiIKCiAgICAgICAgaGlzdCA9IFtdICAjIGtlZXAgdHJhY2sgb2YgaGlzdG9yeQoKICAgICAgICB1cmwgPSBzZWxmLmdldF9yZWRpcmVjdF90YXJnZXQocmVzcCkKICAgICAgICB3aGlsZSB1cmw6CiAgICAgICAgICAgIHByZXBhcmVkX3JlcXVlc3QgPSByZXEuY29weSgpCgogICAgICAgICAgICAjIFVwZGF0ZSBoaXN0b3J5IGFuZCBrZWVwIHRyYWNrIG9mIHJlZGlyZWN0cy4KICAgICAgICAgICAgIyByZXNwLmhpc3RvcnkgbXVzdCBpZ25vcmUgdGhlIG9yaWdpbmFsIHJlcXVlc3QgaW4gdGhpcyBsb29wCiAgICAgICAgICAgIGhpc3QuYXBwZW5kKHJlc3ApCiAgICAgICAgICAgIHJlc3AuaGlzdG9yeSA9IGhpc3RbMTpdCgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXNwLmNvbnRlbnQgICMgQ29uc3VtZSBzb2NrZXQgc28gaXQgY2FuIGJlIHJlbGVhc2VkCiAgICAgICAgICAgIGV4Y2VwdCAoQ2h1bmtlZEVuY29kaW5nRXJyb3IsIENvbnRlbnREZWNvZGluZ0Vycm9yLCBSdW50aW1lRXJyb3IpOgogICAgICAgICAgICAgICAgcmVzcC5yYXcucmVhZChkZWNvZGVfY29udGVudD1GYWxzZSkKCiAgICAgICAgICAgIGlmIGxlbihyZXNwLmhpc3RvcnkpID49IHNlbGYubWF4X3JlZGlyZWN0czoKICAgICAgICAgICAgICAgIHJhaXNlIFRvb01hbnlSZWRpcmVjdHMoJ0V4Y2VlZGVkICVzIHJlZGlyZWN0cy4nICUgc2VsZi5tYXhfcmVkaXJlY3RzLCByZXNwb25zZT1yZXNwKQoKICAgICAgICAgICAgIyBSZWxlYXNlIHRoZSBjb25uZWN0aW9uIGJhY2sgaW50byB0aGUgcG9vbC4KICAgICAgICAgICAgcmVzcC5jbG9zZSgpCgogICAgICAgICAgICAjIEhhbmRsZSByZWRpcmVjdGlvbiB3aXRob3V0IHNjaGVtZSAoc2VlOiBSRkMgMTgwOCBTZWN0aW9uIDQpCiAgICAgICAgICAgIGlmIHVybC5zdGFydHN3aXRoKCcvLycpOgogICAgICAgICAgICAgICAgcGFyc2VkX3J1cmwgPSB1cmxwYXJzZShyZXNwLnVybCkKICAgICAgICAgICAgICAgIHVybCA9ICclczolcycgJSAodG9fbmF0aXZlX3N0cmluZyhwYXJzZWRfcnVybC5zY2hlbWUpLCB1cmwpCgogICAgICAgICAgICAjIFRoZSBzY2hlbWUgc2hvdWxkIGJlIGxvd2VyIGNhc2UuLi4KICAgICAgICAgICAgcGFyc2VkID0gdXJscGFyc2UodXJsKQogICAgICAgICAgICB1cmwgPSBwYXJzZWQuZ2V0dXJsKCkKCiAgICAgICAgICAgICMgRmFjaWxpdGF0ZSByZWxhdGl2ZSAnbG9jYXRpb24nIGhlYWRlcnMsIGFzIGFsbG93ZWQgYnkgUkZDIDcyMzEuCiAgICAgICAgICAgICMgKGUuZy4gJy9wYXRoL3RvL3Jlc291cmNlJyBpbnN0ZWFkIG9mICdodHRwOi8vZG9tYWluLnRsZC9wYXRoL3RvL3Jlc291cmNlJykKICAgICAgICAgICAgIyBDb21wbGlhbnQgd2l0aCBSRkMzOTg2LCB3ZSBwZXJjZW50IGVuY29kZSB0aGUgdXJsLgogICAgICAgICAgICBpZiBub3QgcGFyc2VkLm5ldGxvYzoKICAgICAgICAgICAgICAgIHVybCA9IHVybGpvaW4ocmVzcC51cmwsIHJlcXVvdGVfdXJpKHVybCkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB1cmwgPSByZXF1b3RlX3VyaSh1cmwpCgogICAgICAgICAgICBwcmVwYXJlZF9yZXF1ZXN0LnVybCA9IHRvX25hdGl2ZV9zdHJpbmcodXJsKQoKICAgICAgICAgICAgc2VsZi5yZWJ1aWxkX21ldGhvZChwcmVwYXJlZF9yZXF1ZXN0LCByZXNwKQoKICAgICAgICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vcmVxdWVzdHMvcmVxdWVzdHMvaXNzdWVzLzEwODQKICAgICAgICAgICAgaWYgcmVzcC5zdGF0dXNfY29kZSBub3QgaW4gKGNvZGVzLnRlbXBvcmFyeV9yZWRpcmVjdCwgY29kZXMucGVybWFuZW50X3JlZGlyZWN0KToKICAgICAgICAgICAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3JlcXVlc3RzL3JlcXVlc3RzL2lzc3Vlcy8zNDkwCiAgICAgICAgICAgICAgICBwdXJnZWRfaGVhZGVycyA9ICgnQ29udGVudC1MZW5ndGgnLCAnQ29udGVudC1UeXBlJywgJ1RyYW5zZmVyLUVuY29kaW5nJykKICAgICAgICAgICAgICAgIGZvciBoZWFkZXIgaW4gcHVyZ2VkX2hlYWRlcnM6CiAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRfcmVxdWVzdC5oZWFkZXJzLnBvcChoZWFkZXIsIE5vbmUpCiAgICAgICAgICAgICAgICBwcmVwYXJlZF9yZXF1ZXN0LmJvZHkgPSBOb25lCgogICAgICAgICAgICBoZWFkZXJzID0gcHJlcGFyZWRfcmVxdWVzdC5oZWFkZXJzCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGRlbCBoZWFkZXJzWydDb29raWUnXQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgICAgICAjIEV4dHJhY3QgYW55IGNvb2tpZXMgc2VudCBvbiB0aGUgcmVzcG9uc2UgdG8gdGhlIGNvb2tpZWphcgogICAgICAgICAgICAjIGluIHRoZSBuZXcgcmVxdWVzdC4gQmVjYXVzZSB3ZSd2ZSBtdXRhdGVkIG91ciBjb3BpZWQgcHJlcGFyZWQKICAgICAgICAgICAgIyByZXF1ZXN0LCB1c2UgdGhlIG9sZCBvbmUgdGhhdCB3ZSBoYXZlbid0IHlldCB0b3VjaGVkLgogICAgICAgICAgICBleHRyYWN0X2Nvb2tpZXNfdG9famFyKHByZXBhcmVkX3JlcXVlc3QuX2Nvb2tpZXMsIHJlcSwgcmVzcC5yYXcpCiAgICAgICAgICAgIG1lcmdlX2Nvb2tpZXMocHJlcGFyZWRfcmVxdWVzdC5fY29va2llcywgc2VsZi5jb29raWVzKQogICAgICAgICAgICBwcmVwYXJlZF9yZXF1ZXN0LnByZXBhcmVfY29va2llcyhwcmVwYXJlZF9yZXF1ZXN0Ll9jb29raWVzKQoKICAgICAgICAgICAgIyBSZWJ1aWxkIGF1dGggYW5kIHByb3h5IGluZm9ybWF0aW9uLgogICAgICAgICAgICBwcm94aWVzID0gc2VsZi5yZWJ1aWxkX3Byb3hpZXMocHJlcGFyZWRfcmVxdWVzdCwgcHJveGllcykKICAgICAgICAgICAgc2VsZi5yZWJ1aWxkX2F1dGgocHJlcGFyZWRfcmVxdWVzdCwgcmVzcCkKCiAgICAgICAgICAgICMgQSBmYWlsZWQgdGVsbCgpIHNldHMgYF9ib2R5X3Bvc2l0aW9uYCB0byBgb2JqZWN0KClgLiBUaGlzIG5vbi1Ob25lCiAgICAgICAgICAgICMgdmFsdWUgZW5zdXJlcyBgcmV3aW5kYWJsZWAgd2lsbCBiZSBUcnVlLCBhbGxvd2luZyB1cyB0byByYWlzZSBhbgogICAgICAgICAgICAjIFVucmV3aW5kYWJsZUJvZHlFcnJvciwgaW5zdGVhZCBvZiBoYW5naW5nIHRoZSBjb25uZWN0aW9uLgogICAgICAgICAgICByZXdpbmRhYmxlID0gKAogICAgICAgICAgICAgICAgcHJlcGFyZWRfcmVxdWVzdC5fYm9keV9wb3NpdGlvbiBpcyBub3QgTm9uZSBhbmQKICAgICAgICAgICAgICAgICgnQ29udGVudC1MZW5ndGgnIGluIGhlYWRlcnMgb3IgJ1RyYW5zZmVyLUVuY29kaW5nJyBpbiBoZWFkZXJzKQogICAgICAgICAgICApCgogICAgICAgICAgICAjIEF0dGVtcHQgdG8gcmV3aW5kIGNvbnN1bWVkIGZpbGUtbGlrZSBvYmplY3QuCiAgICAgICAgICAgIGlmIHJld2luZGFibGU6CiAgICAgICAgICAgICAgICByZXdpbmRfYm9keShwcmVwYXJlZF9yZXF1ZXN0KQoKICAgICAgICAgICAgIyBPdmVycmlkZSB0aGUgb3JpZ2luYWwgcmVxdWVzdC4KICAgICAgICAgICAgcmVxID0gcHJlcGFyZWRfcmVxdWVzdAoKICAgICAgICAgICAgaWYgeWllbGRfcmVxdWVzdHM6CiAgICAgICAgICAgICAgICB5aWVsZCByZXEKICAgICAgICAgICAgZWxzZToKCiAgICAgICAgICAgICAgICByZXNwID0gc2VsZi5zZW5kKAogICAgICAgICAgICAgICAgICAgIHJlcSwKICAgICAgICAgICAgICAgICAgICBzdHJlYW09c3RyZWFtLAogICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9dGltZW91dCwKICAgICAgICAgICAgICAgICAgICB2ZXJpZnk9dmVyaWZ5LAogICAgICAgICAgICAgICAgICAgIGNlcnQ9Y2VydCwKICAgICAgICAgICAgICAgICAgICBwcm94aWVzPXByb3hpZXMsCiAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVkaXJlY3RzPUZhbHNlLAogICAgICAgICAgICAgICAgICAgICoqYWRhcHRlcl9rd2FyZ3MKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBleHRyYWN0X2Nvb2tpZXNfdG9famFyKHNlbGYuY29va2llcywgcHJlcGFyZWRfcmVxdWVzdCwgcmVzcC5yYXcpCgogICAgICAgICAgICAgICAgIyBleHRyYWN0IHJlZGlyZWN0IHVybCwgaWYgYW55LCBmb3IgdGhlIG5leHQgbG9vcAogICAgICAgICAgICAgICAgdXJsID0gc2VsZi5nZXRfcmVkaXJlY3RfdGFyZ2V0KHJlc3ApCiAgICAgICAgICAgICAgICB5aWVsZCByZXNwCgogICAgZGVmIHJlYnVpbGRfYXV0aChzZWxmLCBwcmVwYXJlZF9yZXF1ZXN0LCByZXNwb25zZSk6CiAgICAgICAgIiIiV2hlbiBiZWluZyByZWRpcmVjdGVkIHdlIG1heSB3YW50IHRvIHN0cmlwIGF1dGhlbnRpY2F0aW9uIGZyb20gdGhlCiAgICAgICAgcmVxdWVzdCB0byBhdm9pZCBsZWFraW5nIGNyZWRlbnRpYWxzLiBUaGlzIG1ldGhvZCBpbnRlbGxpZ2VudGx5IHJlbW92ZXMKICAgICAgICBhbmQgcmVhcHBsaWVzIGF1dGhlbnRpY2F0aW9uIHdoZXJlIHBvc3NpYmxlIHRvIGF2b2lkIGNyZWRlbnRpYWwgbG9zcy4KICAgICAgICAiIiIKICAgICAgICBoZWFkZXJzID0gcHJlcGFyZWRfcmVxdWVzdC5oZWFkZXJzCiAgICAgICAgdXJsID0gcHJlcGFyZWRfcmVxdWVzdC51cmwKCiAgICAgICAgaWYgJ0F1dGhvcml6YXRpb24nIGluIGhlYWRlcnM6CiAgICAgICAgICAgICMgSWYgd2UgZ2V0IHJlZGlyZWN0ZWQgdG8gYSBuZXcgaG9zdCwgd2Ugc2hvdWxkIHN0cmlwIG91dCBhbnkKICAgICAgICAgICAgIyBhdXRoZW50aWNhdGlvbiBoZWFkZXJzLgogICAgICAgICAgICBvcmlnaW5hbF9wYXJzZWQgPSB1cmxwYXJzZShyZXNwb25zZS5yZXF1ZXN0LnVybCkKICAgICAgICAgICAgcmVkaXJlY3RfcGFyc2VkID0gdXJscGFyc2UodXJsKQoKICAgICAgICAgICAgaWYgKG9yaWdpbmFsX3BhcnNlZC5ob3N0bmFtZSAhPSByZWRpcmVjdF9wYXJzZWQuaG9zdG5hbWUpOgogICAgICAgICAgICAgICAgZGVsIGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXQoKICAgICAgICAjIC5uZXRyYyBtaWdodCBoYXZlIG1vcmUgYXV0aCBmb3IgdXMgb24gb3VyIG5ldyBob3N0LgogICAgICAgIG5ld19hdXRoID0gZ2V0X25ldHJjX2F1dGgodXJsKSBpZiBzZWxmLnRydXN0X2VudiBlbHNlIE5vbmUKICAgICAgICBpZiBuZXdfYXV0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcHJlcGFyZWRfcmVxdWVzdC5wcmVwYXJlX2F1dGgobmV3X2F1dGgpCgogICAgICAgIHJldHVybgoKICAgIGRlZiByZWJ1aWxkX3Byb3hpZXMoc2VsZiwgcHJlcGFyZWRfcmVxdWVzdCwgcHJveGllcyk6CiAgICAgICAgIiIiVGhpcyBtZXRob2QgcmUtZXZhbHVhdGVzIHRoZSBwcm94eSBjb25maWd1cmF0aW9uIGJ5IGNvbnNpZGVyaW5nIHRoZQogICAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlcy4gSWYgd2UgYXJlIHJlZGlyZWN0ZWQgdG8gYSBVUkwgY292ZXJlZCBieQogICAgICAgIE5PX1BST1hZLCB3ZSBzdHJpcCB0aGUgcHJveHkgY29uZmlndXJhdGlvbi4gT3RoZXJ3aXNlLCB3ZSBzZXQgbWlzc2luZwogICAgICAgIHByb3h5IGtleXMgZm9yIHRoaXMgVVJMIChpbiBjYXNlIHRoZXkgd2VyZSBzdHJpcHBlZCBieSBhIHByZXZpb3VzCiAgICAgICAgcmVkaXJlY3QpLgoKICAgICAgICBUaGlzIG1ldGhvZCBhbHNvIHJlcGxhY2VzIHRoZSBQcm94eS1BdXRob3JpemF0aW9uIGhlYWRlciB3aGVyZQogICAgICAgIG5lY2Vzc2FyeS4KCiAgICAgICAgOnJ0eXBlOiBkaWN0CiAgICAgICAgIiIiCiAgICAgICAgcHJveGllcyA9IHByb3hpZXMgaWYgcHJveGllcyBpcyBub3QgTm9uZSBlbHNlIHt9CiAgICAgICAgaGVhZGVycyA9IHByZXBhcmVkX3JlcXVlc3QuaGVhZGVycwogICAgICAgIHVybCA9IHByZXBhcmVkX3JlcXVlc3QudXJsCiAgICAgICAgc2NoZW1lID0gdXJscGFyc2UodXJsKS5zY2hlbWUKICAgICAgICBuZXdfcHJveGllcyA9IHByb3hpZXMuY29weSgpCiAgICAgICAgbm9fcHJveHkgPSBwcm94aWVzLmdldCgnbm9fcHJveHknKQoKICAgICAgICBieXBhc3NfcHJveHkgPSBzaG91bGRfYnlwYXNzX3Byb3hpZXModXJsLCBub19wcm94eT1ub19wcm94eSkKICAgICAgICBpZiBzZWxmLnRydXN0X2VudiBhbmQgbm90IGJ5cGFzc19wcm94eToKICAgICAgICAgICAgZW52aXJvbl9wcm94aWVzID0gZ2V0X2Vudmlyb25fcHJveGllcyh1cmwsIG5vX3Byb3h5PW5vX3Byb3h5KQoKICAgICAgICAgICAgcHJveHkgPSBlbnZpcm9uX3Byb3hpZXMuZ2V0KHNjaGVtZSwgZW52aXJvbl9wcm94aWVzLmdldCgnYWxsJykpCgogICAgICAgICAgICBpZiBwcm94eToKICAgICAgICAgICAgICAgIG5ld19wcm94aWVzLnNldGRlZmF1bHQoc2NoZW1lLCBwcm94eSkKCiAgICAgICAgaWYgJ1Byb3h5LUF1dGhvcml6YXRpb24nIGluIGhlYWRlcnM6CiAgICAgICAgICAgIGRlbCBoZWFkZXJzWydQcm94eS1BdXRob3JpemF0aW9uJ10KCiAgICAgICAgdHJ5OgogICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSBnZXRfYXV0aF9mcm9tX3VybChuZXdfcHJveGllc1tzY2hlbWVdKQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gTm9uZSwgTm9uZQoKICAgICAgICBpZiB1c2VybmFtZSBhbmQgcGFzc3dvcmQ6CiAgICAgICAgICAgIGhlYWRlcnNbJ1Byb3h5LUF1dGhvcml6YXRpb24nXSA9IF9iYXNpY19hdXRoX3N0cih1c2VybmFtZSwgcGFzc3dvcmQpCgogICAgICAgIHJldHVybiBuZXdfcHJveGllcwoKICAgIGRlZiByZWJ1aWxkX21ldGhvZChzZWxmLCBwcmVwYXJlZF9yZXF1ZXN0LCByZXNwb25zZSk6CiAgICAgICAgIiIiV2hlbiBiZWluZyByZWRpcmVjdGVkIHdlIG1heSB3YW50IHRvIGNoYW5nZSB0aGUgbWV0aG9kIG9mIHRoZSByZXF1ZXN0CiAgICAgICAgYmFzZWQgb24gY2VydGFpbiBzcGVjcyBvciBicm93c2VyIGJlaGF2aW9yLgogICAgICAgICIiIgogICAgICAgIG1ldGhvZCA9IHByZXBhcmVkX3JlcXVlc3QubWV0aG9kCgogICAgICAgICMgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNC40CiAgICAgICAgaWYgcmVzcG9uc2Uuc3RhdHVzX2NvZGUgPT0gY29kZXMuc2VlX290aGVyIGFuZCBtZXRob2QgIT0gJ0hFQUQnOgogICAgICAgICAgICBtZXRob2QgPSAnR0VUJwoKICAgICAgICAjIERvIHdoYXQgdGhlIGJyb3dzZXJzIGRvLCBkZXNwaXRlIHN0YW5kYXJkcy4uLgogICAgICAgICMgRmlyc3QsIHR1cm4gMzAycyBpbnRvIEdFVHMuCiAgICAgICAgaWYgcmVzcG9uc2Uuc3RhdHVzX2NvZGUgPT0gY29kZXMuZm91bmQgYW5kIG1ldGhvZCAhPSAnSEVBRCc6CiAgICAgICAgICAgIG1ldGhvZCA9ICdHRVQnCgogICAgICAgICMgU2Vjb25kLCBpZiBhIFBPU1QgaXMgcmVzcG9uZGVkIHRvIHdpdGggYSAzMDEsIHR1cm4gaXQgaW50byBhIEdFVC4KICAgICAgICAjIFRoaXMgYml6YXJyZSBiZWhhdmlvdXIgaXMgZXhwbGFpbmVkIGluIElzc3VlIDE3MDQuCiAgICAgICAgaWYgcmVzcG9uc2Uuc3RhdHVzX2NvZGUgPT0gY29kZXMubW92ZWQgYW5kIG1ldGhvZCA9PSAnUE9TVCc6CiAgICAgICAgICAgIG1ldGhvZCA9ICdHRVQnCgogICAgICAgIHByZXBhcmVkX3JlcXVlc3QubWV0aG9kID0gbWV0aG9kCgoKY2xhc3MgU2Vzc2lvbihTZXNzaW9uUmVkaXJlY3RNaXhpbik6CiAgICAiIiJBIFJlcXVlc3RzIHNlc3Npb24uCgogICAgUHJvdmlkZXMgY29va2llIHBlcnNpc3RlbmNlLCBjb25uZWN0aW9uLXBvb2xpbmcsIGFuZCBjb25maWd1cmF0aW9uLgoKICAgIEJhc2ljIFVzYWdlOjoKCiAgICAgID4+PiBpbXBvcnQgcmVxdWVzdHMKICAgICAgPj4+IHMgPSByZXF1ZXN0cy5TZXNzaW9uKCkKICAgICAgPj4+IHMuZ2V0KCdodHRwOi8vaHR0cGJpbi5vcmcvZ2V0JykKICAgICAgPFJlc3BvbnNlIFsyMDBdPgoKICAgIE9yIGFzIGEgY29udGV4dCBtYW5hZ2VyOjoKCiAgICAgID4+PiB3aXRoIHJlcXVlc3RzLlNlc3Npb24oKSBhcyBzOgogICAgICA+Pj4gICAgIHMuZ2V0KCdodHRwOi8vaHR0cGJpbi5vcmcvZ2V0JykKICAgICAgPFJlc3BvbnNlIFsyMDBdPgogICAgIiIiCgogICAgX19hdHRyc19fID0gWwogICAgICAgICdoZWFkZXJzJywgJ2Nvb2tpZXMnLCAnYXV0aCcsICdwcm94aWVzJywgJ2hvb2tzJywgJ3BhcmFtcycsICd2ZXJpZnknLAogICAgICAgICdjZXJ0JywgJ3ByZWZldGNoJywgJ2FkYXB0ZXJzJywgJ3N0cmVhbScsICd0cnVzdF9lbnYnLAogICAgICAgICdtYXhfcmVkaXJlY3RzJywKICAgIF0KCiAgICBkZWYgX19pbml0X18oc2VsZik6CgogICAgICAgICM6IEEgY2FzZS1pbnNlbnNpdGl2ZSBkaWN0aW9uYXJ5IG9mIGhlYWRlcnMgdG8gYmUgc2VudCBvbiBlYWNoCiAgICAgICAgIzogOmNsYXNzOmBSZXF1ZXN0IDxSZXF1ZXN0PmAgc2VudCBmcm9tIHRoaXMKICAgICAgICAjOiA6Y2xhc3M6YFNlc3Npb24gPFNlc3Npb24+YC4KICAgICAgICBzZWxmLmhlYWRlcnMgPSBkZWZhdWx0X2hlYWRlcnMoKQoKICAgICAgICAjOiBEZWZhdWx0IEF1dGhlbnRpY2F0aW9uIHR1cGxlIG9yIG9iamVjdCB0byBhdHRhY2ggdG8KICAgICAgICAjOiA6Y2xhc3M6YFJlcXVlc3QgPFJlcXVlc3Q+YC4KICAgICAgICBzZWxmLmF1dGggPSBOb25lCgogICAgICAgICM6IERpY3Rpb25hcnkgbWFwcGluZyBwcm90b2NvbCBvciBwcm90b2NvbCBhbmQgaG9zdCB0byB0aGUgVVJMIG9mIHRoZSBwcm94eQogICAgICAgICM6IChlLmcuIHsnaHR0cCc6ICdmb28uYmFyOjMxMjgnLCAnaHR0cDovL2hvc3QubmFtZSc6ICdmb28uYmFyOjQwMTInfSkgdG8KICAgICAgICAjOiBiZSB1c2VkIG9uIGVhY2ggOmNsYXNzOmBSZXF1ZXN0IDxSZXF1ZXN0PmAuCiAgICAgICAgc2VsZi5wcm94aWVzID0ge30KCiAgICAgICAgIzogRXZlbnQtaGFuZGxpbmcgaG9va3MuCiAgICAgICAgc2VsZi5ob29rcyA9IGRlZmF1bHRfaG9va3MoKQoKICAgICAgICAjOiBEaWN0aW9uYXJ5IG9mIHF1ZXJ5c3RyaW5nIGRhdGEgdG8gYXR0YWNoIHRvIGVhY2gKICAgICAgICAjOiA6Y2xhc3M6YFJlcXVlc3QgPFJlcXVlc3Q+YC4gVGhlIGRpY3Rpb25hcnkgdmFsdWVzIG1heSBiZSBsaXN0cyBmb3IKICAgICAgICAjOiByZXByZXNlbnRpbmcgbXVsdGl2YWx1ZWQgcXVlcnkgcGFyYW1ldGVycy4KICAgICAgICBzZWxmLnBhcmFtcyA9IHt9CgogICAgICAgICM6IFN0cmVhbSByZXNwb25zZSBjb250ZW50IGRlZmF1bHQuCiAgICAgICAgc2VsZi5zdHJlYW0gPSBGYWxzZQoKICAgICAgICAjOiBTU0wgVmVyaWZpY2F0aW9uIGRlZmF1bHQuCiAgICAgICAgc2VsZi52ZXJpZnkgPSBUcnVlCgogICAgICAgICM6IFNTTCBjbGllbnQgY2VydGlmaWNhdGUgZGVmYXVsdCwgaWYgU3RyaW5nLCBwYXRoIHRvIHNzbCBjbGllbnQKICAgICAgICAjOiBjZXJ0IGZpbGUgKC5wZW0pLiBJZiBUdXBsZSwgKCdjZXJ0JywgJ2tleScpIHBhaXIuCiAgICAgICAgc2VsZi5jZXJ0ID0gTm9uZQoKICAgICAgICAjOiBNYXhpbXVtIG51bWJlciBvZiByZWRpcmVjdHMgYWxsb3dlZC4gSWYgdGhlIHJlcXVlc3QgZXhjZWVkcyB0aGlzCiAgICAgICAgIzogbGltaXQsIGEgOmNsYXNzOmBUb29NYW55UmVkaXJlY3RzYCBleGNlcHRpb24gaXMgcmFpc2VkLgogICAgICAgICM6IFRoaXMgZGVmYXVsdHMgdG8gcmVxdWVzdHMubW9kZWxzLkRFRkFVTFRfUkVESVJFQ1RfTElNSVQsIHdoaWNoIGlzCiAgICAgICAgIzogMzAuCiAgICAgICAgc2VsZi5tYXhfcmVkaXJlY3RzID0gREVGQVVMVF9SRURJUkVDVF9MSU1JVAoKICAgICAgICAjOiBUcnVzdCBlbnZpcm9ubWVudCBzZXR0aW5ncyBmb3IgcHJveHkgY29uZmlndXJhdGlvbiwgZGVmYXVsdAogICAgICAgICM6IGF1dGhlbnRpY2F0aW9uIGFuZCBzaW1pbGFyLgogICAgICAgIHNlbGYudHJ1c3RfZW52ID0gVHJ1ZQoKICAgICAgICAjOiBBIENvb2tpZUphciBjb250YWluaW5nIGFsbCBjdXJyZW50bHkgb3V0c3RhbmRpbmcgY29va2llcyBzZXQgb24gdGhpcwogICAgICAgICM6IHNlc3Npb24uIEJ5IGRlZmF1bHQgaXQgaXMgYQogICAgICAgICM6IDpjbGFzczpgUmVxdWVzdHNDb29raWVKYXIgPHJlcXVlc3RzLmNvb2tpZXMuUmVxdWVzdHNDb29raWVKYXI+YCwgYnV0CiAgICAgICAgIzogbWF5IGJlIGFueSBvdGhlciBgYGNvb2tpZWxpYi5Db29raWVKYXJgYCBjb21wYXRpYmxlIG9iamVjdC4KICAgICAgICBzZWxmLmNvb2tpZXMgPSBjb29raWVqYXJfZnJvbV9kaWN0KHt9KQoKICAgICAgICAjIERlZmF1bHQgY29ubmVjdGlvbiBhZGFwdGVycy4KICAgICAgICBzZWxmLmFkYXB0ZXJzID0gT3JkZXJlZERpY3QoKQogICAgICAgIHNlbGYubW91bnQoJ2h0dHBzOi8vJywgSFRUUEFkYXB0ZXIoKSkKICAgICAgICBzZWxmLm1vdW50KCdodHRwOi8vJywgSFRUUEFkYXB0ZXIoKSkKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKICAgICAgICBzZWxmLmNsb3NlKCkKCiAgICBkZWYgcHJlcGFyZV9yZXF1ZXN0KHNlbGYsIHJlcXVlc3QpOgogICAgICAgICIiIkNvbnN0cnVjdHMgYSA6Y2xhc3M6YFByZXBhcmVkUmVxdWVzdCA8UHJlcGFyZWRSZXF1ZXN0PmAgZm9yCiAgICAgICAgdHJhbnNtaXNzaW9uIGFuZCByZXR1cm5zIGl0LiBUaGUgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3RgIGhhcyBzZXR0aW5ncwogICAgICAgIG1lcmdlZCBmcm9tIHRoZSA6Y2xhc3M6YFJlcXVlc3QgPFJlcXVlc3Q+YCBpbnN0YW5jZSBhbmQgdGhvc2Ugb2YgdGhlCiAgICAgICAgOmNsYXNzOmBTZXNzaW9uYC4KCiAgICAgICAgOnBhcmFtIHJlcXVlc3Q6IDpjbGFzczpgUmVxdWVzdGAgaW5zdGFuY2UgdG8gcHJlcGFyZSB3aXRoIHRoaXMKICAgICAgICAgICAgc2Vzc2lvbidzIHNldHRpbmdzLgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUHJlcGFyZWRSZXF1ZXN0CiAgICAgICAgIiIiCiAgICAgICAgY29va2llcyA9IHJlcXVlc3QuY29va2llcyBvciB7fQoKICAgICAgICAjIEJvb3RzdHJhcCBDb29raWVKYXIuCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY29va2llcywgY29va2llbGliLkNvb2tpZUphcik6CiAgICAgICAgICAgIGNvb2tpZXMgPSBjb29raWVqYXJfZnJvbV9kaWN0KGNvb2tpZXMpCgogICAgICAgICMgTWVyZ2Ugd2l0aCBzZXNzaW9uIGNvb2tpZXMKICAgICAgICBtZXJnZWRfY29va2llcyA9IG1lcmdlX2Nvb2tpZXMoCiAgICAgICAgICAgIG1lcmdlX2Nvb2tpZXMoUmVxdWVzdHNDb29raWVKYXIoKSwgc2VsZi5jb29raWVzKSwgY29va2llcykKCiAgICAgICAgIyBTZXQgZW52aXJvbm1lbnQncyBiYXNpYyBhdXRoZW50aWNhdGlvbiBpZiBub3QgZXhwbGljaXRseSBzZXQuCiAgICAgICAgYXV0aCA9IHJlcXVlc3QuYXV0aAogICAgICAgIGlmIHNlbGYudHJ1c3RfZW52IGFuZCBub3QgYXV0aCBhbmQgbm90IHNlbGYuYXV0aDoKICAgICAgICAgICAgYXV0aCA9IGdldF9uZXRyY19hdXRoKHJlcXVlc3QudXJsKQoKICAgICAgICBwID0gUHJlcGFyZWRSZXF1ZXN0KCkKICAgICAgICBwLnByZXBhcmUoCiAgICAgICAgICAgIG1ldGhvZD1yZXF1ZXN0Lm1ldGhvZC51cHBlcigpLAogICAgICAgICAgICB1cmw9cmVxdWVzdC51cmwsCiAgICAgICAgICAgIGZpbGVzPXJlcXVlc3QuZmlsZXMsCiAgICAgICAgICAgIGRhdGE9cmVxdWVzdC5kYXRhLAogICAgICAgICAgICBqc29uPXJlcXVlc3QuanNvbiwKICAgICAgICAgICAgaGVhZGVycz1tZXJnZV9zZXR0aW5nKHJlcXVlc3QuaGVhZGVycywgc2VsZi5oZWFkZXJzLCBkaWN0X2NsYXNzPUNhc2VJbnNlbnNpdGl2ZURpY3QpLAogICAgICAgICAgICBwYXJhbXM9bWVyZ2Vfc2V0dGluZyhyZXF1ZXN0LnBhcmFtcywgc2VsZi5wYXJhbXMpLAogICAgICAgICAgICBhdXRoPW1lcmdlX3NldHRpbmcoYXV0aCwgc2VsZi5hdXRoKSwKICAgICAgICAgICAgY29va2llcz1tZXJnZWRfY29va2llcywKICAgICAgICAgICAgaG9va3M9bWVyZ2VfaG9va3MocmVxdWVzdC5ob29rcywgc2VsZi5ob29rcyksCiAgICAgICAgKQogICAgICAgIHJldHVybiBwCgogICAgZGVmIHJlcXVlc3Qoc2VsZiwgbWV0aG9kLCB1cmwsCiAgICAgICAgICAgIHBhcmFtcz1Ob25lLCBkYXRhPU5vbmUsIGhlYWRlcnM9Tm9uZSwgY29va2llcz1Ob25lLCBmaWxlcz1Ob25lLAogICAgICAgICAgICBhdXRoPU5vbmUsIHRpbWVvdXQ9Tm9uZSwgYWxsb3dfcmVkaXJlY3RzPVRydWUsIHByb3hpZXM9Tm9uZSwKICAgICAgICAgICAgaG9va3M9Tm9uZSwgc3RyZWFtPU5vbmUsIHZlcmlmeT1Ob25lLCBjZXJ0PU5vbmUsIGpzb249Tm9uZSk6CiAgICAgICAgIiIiQ29uc3RydWN0cyBhIDpjbGFzczpgUmVxdWVzdCA8UmVxdWVzdD5gLCBwcmVwYXJlcyBpdCBhbmQgc2VuZHMgaXQuCiAgICAgICAgUmV0dXJucyA6Y2xhc3M6YFJlc3BvbnNlIDxSZXNwb25zZT5gIG9iamVjdC4KCiAgICAgICAgOnBhcmFtIG1ldGhvZDogbWV0aG9kIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgICAgICA6cGFyYW0gcGFyYW1zOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgb3IgYnl0ZXMgdG8gYmUgc2VudCBpbiB0aGUgcXVlcnkKICAgICAgICAgICAgc3RyaW5nIGZvciB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgICAgICA6cGFyYW0gZGF0YTogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5LCBieXRlcywgb3IgZmlsZS1saWtlIG9iamVjdCB0byBzZW5kCiAgICAgICAgICAgIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgICAgIDpwYXJhbSBqc29uOiAob3B0aW9uYWwpIGpzb24gdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUKICAgICAgICAgICAgOmNsYXNzOmBSZXF1ZXN0YC4KICAgICAgICA6cGFyYW0gaGVhZGVyczogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5IG9mIEhUVFAgSGVhZGVycyB0byBzZW5kIHdpdGggdGhlCiAgICAgICAgICAgIDpjbGFzczpgUmVxdWVzdGAuCiAgICAgICAgOnBhcmFtIGNvb2tpZXM6IChvcHRpb25hbCkgRGljdCBvciBDb29raWVKYXIgb2JqZWN0IHRvIHNlbmQgd2l0aCB0aGUKICAgICAgICAgICAgOmNsYXNzOmBSZXF1ZXN0YC4KICAgICAgICA6cGFyYW0gZmlsZXM6IChvcHRpb25hbCkgRGljdGlvbmFyeSBvZiBgYCdmaWxlbmFtZSc6IGZpbGUtbGlrZS1vYmplY3RzYGAKICAgICAgICAgICAgZm9yIG11bHRpcGFydCBlbmNvZGluZyB1cGxvYWQuCiAgICAgICAgOnBhcmFtIGF1dGg6IChvcHRpb25hbCkgQXV0aCB0dXBsZSBvciBjYWxsYWJsZSB0byBlbmFibGUKICAgICAgICAgICAgQmFzaWMvRGlnZXN0L0N1c3RvbSBIVFRQIEF1dGguCiAgICAgICAgOnBhcmFtIHRpbWVvdXQ6IChvcHRpb25hbCkgSG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIHNlcnZlciB0byBzZW5kCiAgICAgICAgICAgIGRhdGEgYmVmb3JlIGdpdmluZyB1cCwgYXMgYSBmbG9hdCwgb3IgYSA6cmVmOmAoY29ubmVjdCB0aW1lb3V0LAogICAgICAgICAgICByZWFkIHRpbWVvdXQpIDx0aW1lb3V0cz5gIHR1cGxlLgogICAgICAgIDp0eXBlIHRpbWVvdXQ6IGZsb2F0IG9yIHR1cGxlCiAgICAgICAgOnBhcmFtIGFsbG93X3JlZGlyZWN0czogKG9wdGlvbmFsKSBTZXQgdG8gVHJ1ZSBieSBkZWZhdWx0LgogICAgICAgIDp0eXBlIGFsbG93X3JlZGlyZWN0czogYm9vbAogICAgICAgIDpwYXJhbSBwcm94aWVzOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgbWFwcGluZyBwcm90b2NvbCBvciBwcm90b2NvbCBhbmQKICAgICAgICAgICAgaG9zdG5hbWUgdG8gdGhlIFVSTCBvZiB0aGUgcHJveHkuCiAgICAgICAgOnBhcmFtIHN0cmVhbTogKG9wdGlvbmFsKSB3aGV0aGVyIHRvIGltbWVkaWF0ZWx5IGRvd25sb2FkIHRoZSByZXNwb25zZQogICAgICAgICAgICBjb250ZW50LiBEZWZhdWx0cyB0byBgYEZhbHNlYGAuCiAgICAgICAgOnBhcmFtIHZlcmlmeTogKG9wdGlvbmFsKSBFaXRoZXIgYSBib29sZWFuLCBpbiB3aGljaCBjYXNlIGl0IGNvbnRyb2xzIHdoZXRoZXIgd2UgdmVyaWZ5CiAgICAgICAgICAgIHRoZSBzZXJ2ZXIncyBUTFMgY2VydGlmaWNhdGUsIG9yIGEgc3RyaW5nLCBpbiB3aGljaCBjYXNlIGl0IG11c3QgYmUgYSBwYXRoCiAgICAgICAgICAgIHRvIGEgQ0EgYnVuZGxlIHRvIHVzZS4gRGVmYXVsdHMgdG8gYGBUcnVlYGAuCiAgICAgICAgOnBhcmFtIGNlcnQ6IChvcHRpb25hbCkgaWYgU3RyaW5nLCBwYXRoIHRvIHNzbCBjbGllbnQgY2VydCBmaWxlICgucGVtKS4KICAgICAgICAgICAgSWYgVHVwbGUsICgnY2VydCcsICdrZXknKSBwYWlyLgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKICAgICAgICAjIENyZWF0ZSB0aGUgUmVxdWVzdC4KICAgICAgICByZXEgPSBSZXF1ZXN0KAogICAgICAgICAgICBtZXRob2Q9bWV0aG9kLnVwcGVyKCksCiAgICAgICAgICAgIHVybD11cmwsCiAgICAgICAgICAgIGhlYWRlcnM9aGVhZGVycywKICAgICAgICAgICAgZmlsZXM9ZmlsZXMsCiAgICAgICAgICAgIGRhdGE9ZGF0YSBvciB7fSwKICAgICAgICAgICAganNvbj1qc29uLAogICAgICAgICAgICBwYXJhbXM9cGFyYW1zIG9yIHt9LAogICAgICAgICAgICBhdXRoPWF1dGgsCiAgICAgICAgICAgIGNvb2tpZXM9Y29va2llcywKICAgICAgICAgICAgaG9va3M9aG9va3MsCiAgICAgICAgKQogICAgICAgIHByZXAgPSBzZWxmLnByZXBhcmVfcmVxdWVzdChyZXEpCgogICAgICAgIHByb3hpZXMgPSBwcm94aWVzIG9yIHt9CgogICAgICAgIHNldHRpbmdzID0gc2VsZi5tZXJnZV9lbnZpcm9ubWVudF9zZXR0aW5ncygKICAgICAgICAgICAgcHJlcC51cmwsIHByb3hpZXMsIHN0cmVhbSwgdmVyaWZ5LCBjZXJ0CiAgICAgICAgKQoKICAgICAgICAjIFNlbmQgdGhlIHJlcXVlc3QuCiAgICAgICAgc2VuZF9rd2FyZ3MgPSB7CiAgICAgICAgICAgICd0aW1lb3V0JzogdGltZW91dCwKICAgICAgICAgICAgJ2FsbG93X3JlZGlyZWN0cyc6IGFsbG93X3JlZGlyZWN0cywKICAgICAgICB9CiAgICAgICAgc2VuZF9rd2FyZ3MudXBkYXRlKHNldHRpbmdzKQogICAgICAgIHJlc3AgPSBzZWxmLnNlbmQocHJlcCwgKipzZW5kX2t3YXJncykKCiAgICAgICAgcmV0dXJuIHJlc3AKCiAgICBkZWYgZ2V0KHNlbGYsIHVybCwgKiprd2FyZ3MpOgogICAgICAgIHIiIiJTZW5kcyBhIEdFVCByZXF1ZXN0LiBSZXR1cm5zIDpjbGFzczpgUmVzcG9uc2VgIG9iamVjdC4KCiAgICAgICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCgogICAgICAgIGt3YXJncy5zZXRkZWZhdWx0KCdhbGxvd19yZWRpcmVjdHMnLCBUcnVlKQogICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3QoJ0dFVCcsIHVybCwgKiprd2FyZ3MpCgogICAgZGVmIG9wdGlvbnMoc2VsZiwgdXJsLCAqKmt3YXJncyk6CiAgICAgICAgciIiIlNlbmRzIGEgT1BUSU9OUyByZXF1ZXN0LiBSZXR1cm5zIDpjbGFzczpgUmVzcG9uc2VgIG9iamVjdC4KCiAgICAgICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCgogICAgICAgIGt3YXJncy5zZXRkZWZhdWx0KCdhbGxvd19yZWRpcmVjdHMnLCBUcnVlKQogICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3QoJ09QVElPTlMnLCB1cmwsICoqa3dhcmdzKQoKICAgIGRlZiBoZWFkKHNlbGYsIHVybCwgKiprd2FyZ3MpOgogICAgICAgIHIiIiJTZW5kcyBhIEhFQUQgcmVxdWVzdC4gUmV0dXJucyA6Y2xhc3M6YFJlc3BvbnNlYCBvYmplY3QuCgogICAgICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgICAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgoKICAgICAgICBrd2FyZ3Muc2V0ZGVmYXVsdCgnYWxsb3dfcmVkaXJlY3RzJywgRmFsc2UpCiAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdCgnSEVBRCcsIHVybCwgKiprd2FyZ3MpCgogICAgZGVmIHBvc3Qoc2VsZiwgdXJsLCBkYXRhPU5vbmUsIGpzb249Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgIHIiIiJTZW5kcyBhIFBPU1QgcmVxdWVzdC4gUmV0dXJucyA6Y2xhc3M6YFJlc3BvbnNlYCBvYmplY3QuCgogICAgICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgICAgICA6cGFyYW0gZGF0YTogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5LCBieXRlcywgb3IgZmlsZS1saWtlIG9iamVjdCB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgICAgIDpwYXJhbSBqc29uOiAob3B0aW9uYWwpIGpzb24gdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgICAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgoKICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0KCdQT1NUJywgdXJsLCBkYXRhPWRhdGEsIGpzb249anNvbiwgKiprd2FyZ3MpCgogICAgZGVmIHB1dChzZWxmLCB1cmwsIGRhdGE9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgIHIiIiJTZW5kcyBhIFBVVCByZXF1ZXN0LiBSZXR1cm5zIDpjbGFzczpgUmVzcG9uc2VgIG9iamVjdC4KCiAgICAgICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgICAgIDpwYXJhbSBkYXRhOiAob3B0aW9uYWwpIERpY3Rpb25hcnksIGJ5dGVzLCBvciBmaWxlLWxpa2Ugb2JqZWN0IHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICAgICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKCiAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdCgnUFVUJywgdXJsLCBkYXRhPWRhdGEsICoqa3dhcmdzKQoKICAgIGRlZiBwYXRjaChzZWxmLCB1cmwsIGRhdGE9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgIHIiIiJTZW5kcyBhIFBBVENIIHJlcXVlc3QuIFJldHVybnMgOmNsYXNzOmBSZXNwb25zZWAgb2JqZWN0LgoKICAgICAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICAgICAgOnBhcmFtIGRhdGE6IChvcHRpb25hbCkgRGljdGlvbmFyeSwgYnl0ZXMsIG9yIGZpbGUtbGlrZSBvYmplY3QgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgICAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgoKICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0KCdQQVRDSCcsIHVybCwgZGF0YT1kYXRhLCAqKmt3YXJncykKCiAgICBkZWYgZGVsZXRlKHNlbGYsIHVybCwgKiprd2FyZ3MpOgogICAgICAgIHIiIiJTZW5kcyBhIERFTEVURSByZXF1ZXN0LiBSZXR1cm5zIDpjbGFzczpgUmVzcG9uc2VgIG9iamVjdC4KCiAgICAgICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCgogICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3QoJ0RFTEVURScsIHVybCwgKiprd2FyZ3MpCgogICAgZGVmIHNlbmQoc2VsZiwgcmVxdWVzdCwgKiprd2FyZ3MpOgogICAgICAgICIiIlNlbmQgYSBnaXZlbiBQcmVwYXJlZFJlcXVlc3QuCgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKICAgICAgICAjIFNldCBkZWZhdWx0cyB0aGF0IHRoZSBob29rcyBjYW4gdXRpbGl6ZSB0byBlbnN1cmUgdGhleSBhbHdheXMgaGF2ZQogICAgICAgICMgdGhlIGNvcnJlY3QgcGFyYW1ldGVycyB0byByZXByb2R1Y2UgdGhlIHByZXZpb3VzIHJlcXVlc3QuCiAgICAgICAga3dhcmdzLnNldGRlZmF1bHQoJ3N0cmVhbScsIHNlbGYuc3RyZWFtKQogICAgICAgIGt3YXJncy5zZXRkZWZhdWx0KCd2ZXJpZnknLCBzZWxmLnZlcmlmeSkKICAgICAgICBrd2FyZ3Muc2V0ZGVmYXVsdCgnY2VydCcsIHNlbGYuY2VydCkKICAgICAgICBrd2FyZ3Muc2V0ZGVmYXVsdCgncHJveGllcycsIHNlbGYucHJveGllcykKCiAgICAgICAgIyBJdCdzIHBvc3NpYmxlIHRoYXQgdXNlcnMgbWlnaHQgYWNjaWRlbnRhbGx5IHNlbmQgYSBSZXF1ZXN0IG9iamVjdC4KICAgICAgICAjIEd1YXJkIGFnYWluc3QgdGhhdCBzcGVjaWZpYyBmYWlsdXJlIGNhc2UuCiAgICAgICAgaWYgaXNpbnN0YW5jZShyZXF1ZXN0LCBSZXF1ZXN0KToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignWW91IGNhbiBvbmx5IHNlbmQgUHJlcGFyZWRSZXF1ZXN0cy4nKQoKICAgICAgICAjIFNldCB1cCB2YXJpYWJsZXMgbmVlZGVkIGZvciByZXNvbHZlX3JlZGlyZWN0cyBhbmQgZGlzcGF0Y2hpbmcgb2YgaG9va3MKICAgICAgICBhbGxvd19yZWRpcmVjdHMgPSBrd2FyZ3MucG9wKCdhbGxvd19yZWRpcmVjdHMnLCBUcnVlKQogICAgICAgIHN0cmVhbSA9IGt3YXJncy5nZXQoJ3N0cmVhbScpCiAgICAgICAgaG9va3MgPSByZXF1ZXN0Lmhvb2tzCgogICAgICAgICMgR2V0IHRoZSBhcHByb3ByaWF0ZSBhZGFwdGVyIHRvIHVzZQogICAgICAgIGFkYXB0ZXIgPSBzZWxmLmdldF9hZGFwdGVyKHVybD1yZXF1ZXN0LnVybCkKCiAgICAgICAgIyBTdGFydCB0aW1lIChhcHByb3hpbWF0ZWx5KSBvZiB0aGUgcmVxdWVzdAogICAgICAgIHN0YXJ0ID0gcHJlZmVycmVkX2Nsb2NrKCkKCiAgICAgICAgIyBTZW5kIHRoZSByZXF1ZXN0CiAgICAgICAgciA9IGFkYXB0ZXIuc2VuZChyZXF1ZXN0LCAqKmt3YXJncykKCiAgICAgICAgIyBUb3RhbCBlbGFwc2VkIHRpbWUgb2YgdGhlIHJlcXVlc3QgKGFwcHJveGltYXRlbHkpCiAgICAgICAgZWxhcHNlZCA9IHByZWZlcnJlZF9jbG9jaygpIC0gc3RhcnQKICAgICAgICByLmVsYXBzZWQgPSB0aW1lZGVsdGEoc2Vjb25kcz1lbGFwc2VkKQoKICAgICAgICAjIFJlc3BvbnNlIG1hbmlwdWxhdGlvbiBob29rcwogICAgICAgIHIgPSBkaXNwYXRjaF9ob29rKCdyZXNwb25zZScsIGhvb2tzLCByLCAqKmt3YXJncykKCiAgICAgICAgIyBQZXJzaXN0IGNvb2tpZXMKICAgICAgICBpZiByLmhpc3Rvcnk6CgogICAgICAgICAgICAjIElmIHRoZSBob29rcyBjcmVhdGUgaGlzdG9yeSB0aGVuIHdlIHdhbnQgdGhvc2UgY29va2llcyB0b28KICAgICAgICAgICAgZm9yIHJlc3AgaW4gci5oaXN0b3J5OgogICAgICAgICAgICAgICAgZXh0cmFjdF9jb29raWVzX3RvX2phcihzZWxmLmNvb2tpZXMsIHJlc3AucmVxdWVzdCwgcmVzcC5yYXcpCgogICAgICAgIGV4dHJhY3RfY29va2llc190b19qYXIoc2VsZi5jb29raWVzLCByZXF1ZXN0LCByLnJhdykKCiAgICAgICAgIyBSZWRpcmVjdCByZXNvbHZpbmcgZ2VuZXJhdG9yLgogICAgICAgIGdlbiA9IHNlbGYucmVzb2x2ZV9yZWRpcmVjdHMociwgcmVxdWVzdCwgKiprd2FyZ3MpCgogICAgICAgICMgUmVzb2x2ZSByZWRpcmVjdHMgaWYgYWxsb3dlZC4KICAgICAgICBoaXN0b3J5ID0gW3Jlc3AgZm9yIHJlc3AgaW4gZ2VuXSBpZiBhbGxvd19yZWRpcmVjdHMgZWxzZSBbXQoKICAgICAgICAjIFNodWZmbGUgdGhpbmdzIGFyb3VuZCBpZiB0aGVyZSdzIGhpc3RvcnkuCiAgICAgICAgaWYgaGlzdG9yeToKICAgICAgICAgICAgIyBJbnNlcnQgdGhlIGZpcnN0IChvcmlnaW5hbCkgcmVxdWVzdCBhdCB0aGUgc3RhcnQKICAgICAgICAgICAgaGlzdG9yeS5pbnNlcnQoMCwgcikKICAgICAgICAgICAgIyBHZXQgdGhlIGxhc3QgcmVxdWVzdCBtYWRlCiAgICAgICAgICAgIHIgPSBoaXN0b3J5LnBvcCgpCiAgICAgICAgICAgIHIuaGlzdG9yeSA9IGhpc3RvcnkKCiAgICAgICAgIyBJZiByZWRpcmVjdHMgYXJlbid0IGJlaW5nIGZvbGxvd2VkLCBzdG9yZSB0aGUgcmVzcG9uc2Ugb24gdGhlIFJlcXVlc3QgZm9yIFJlc3BvbnNlLm5leHQoKS4KICAgICAgICBpZiBub3QgYWxsb3dfcmVkaXJlY3RzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByLl9uZXh0ID0gbmV4dChzZWxmLnJlc29sdmVfcmVkaXJlY3RzKHIsIHJlcXVlc3QsIHlpZWxkX3JlcXVlc3RzPVRydWUsICoqa3dhcmdzKSkKICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CiAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgIGlmIG5vdCBzdHJlYW06CiAgICAgICAgICAgIHIuY29udGVudAoKICAgICAgICByZXR1cm4gcgoKICAgIGRlZiBtZXJnZV9lbnZpcm9ubWVudF9zZXR0aW5ncyhzZWxmLCB1cmwsIHByb3hpZXMsIHN0cmVhbSwgdmVyaWZ5LCBjZXJ0KToKICAgICAgICAiIiIKICAgICAgICBDaGVjayB0aGUgZW52aXJvbm1lbnQgYW5kIG1lcmdlIGl0IHdpdGggc29tZSBzZXR0aW5ncy4KCiAgICAgICAgOnJ0eXBlOiBkaWN0CiAgICAgICAgIiIiCiAgICAgICAgIyBHYXRoZXIgY2x1ZXMgZnJvbSB0aGUgc3Vycm91bmRpbmcgZW52aXJvbm1lbnQuCiAgICAgICAgaWYgc2VsZi50cnVzdF9lbnY6CiAgICAgICAgICAgICMgU2V0IGVudmlyb25tZW50J3MgcHJveGllcy4KICAgICAgICAgICAgbm9fcHJveHkgPSBwcm94aWVzLmdldCgnbm9fcHJveHknKSBpZiBwcm94aWVzIGlzIG5vdCBOb25lIGVsc2UgTm9uZQogICAgICAgICAgICBlbnZfcHJveGllcyA9IGdldF9lbnZpcm9uX3Byb3hpZXModXJsLCBub19wcm94eT1ub19wcm94eSkKICAgICAgICAgICAgZm9yIChrLCB2KSBpbiBlbnZfcHJveGllcy5pdGVtcygpOgogICAgICAgICAgICAgICAgcHJveGllcy5zZXRkZWZhdWx0KGssIHYpCgogICAgICAgICAgICAjIExvb2sgZm9yIHJlcXVlc3RzIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24gYW5kIGJlIGNvbXBhdGlibGUKICAgICAgICAgICAgIyB3aXRoIGNVUkwuCiAgICAgICAgICAgIGlmIHZlcmlmeSBpcyBUcnVlIG9yIHZlcmlmeSBpcyBOb25lOgogICAgICAgICAgICAgICAgdmVyaWZ5ID0gKG9zLmVudmlyb24uZ2V0KCdSRVFVRVNUU19DQV9CVU5ETEUnKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmVudmlyb24uZ2V0KCdDVVJMX0NBX0JVTkRMRScpKQoKICAgICAgICAjIE1lcmdlIGFsbCB0aGUga3dhcmdzLgogICAgICAgIHByb3hpZXMgPSBtZXJnZV9zZXR0aW5nKHByb3hpZXMsIHNlbGYucHJveGllcykKICAgICAgICBzdHJlYW0gPSBtZXJnZV9zZXR0aW5nKHN0cmVhbSwgc2VsZi5zdHJlYW0pCiAgICAgICAgdmVyaWZ5ID0gbWVyZ2Vfc2V0dGluZyh2ZXJpZnksIHNlbGYudmVyaWZ5KQogICAgICAgIGNlcnQgPSBtZXJnZV9zZXR0aW5nKGNlcnQsIHNlbGYuY2VydCkKCiAgICAgICAgcmV0dXJuIHsndmVyaWZ5JzogdmVyaWZ5LCAncHJveGllcyc6IHByb3hpZXMsICdzdHJlYW0nOiBzdHJlYW0sCiAgICAgICAgICAgICAgICAnY2VydCc6IGNlcnR9CgogICAgZGVmIGdldF9hZGFwdGVyKHNlbGYsIHVybCk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgY29ubmVjdGlvbiBhZGFwdGVyIGZvciB0aGUgZ2l2ZW4gVVJMLgoKICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLmFkYXB0ZXJzLkJhc2VBZGFwdGVyCiAgICAgICAgIiIiCiAgICAgICAgZm9yIChwcmVmaXgsIGFkYXB0ZXIpIGluIHNlbGYuYWRhcHRlcnMuaXRlbXMoKToKCiAgICAgICAgICAgIGlmIHVybC5sb3dlcigpLnN0YXJ0c3dpdGgocHJlZml4KToKICAgICAgICAgICAgICAgIHJldHVybiBhZGFwdGVyCgogICAgICAgICMgTm90aGluZyBtYXRjaGVzIDotLwogICAgICAgIHJhaXNlIEludmFsaWRTY2hlbWEoIk5vIGNvbm5lY3Rpb24gYWRhcHRlcnMgd2VyZSBmb3VuZCBmb3IgJyVzJyIgJSB1cmwpCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIkNsb3NlcyBhbGwgYWRhcHRlcnMgYW5kIGFzIHN1Y2ggdGhlIHNlc3Npb24iIiIKICAgICAgICBmb3IgdiBpbiBzZWxmLmFkYXB0ZXJzLnZhbHVlcygpOgogICAgICAgICAgICB2LmNsb3NlKCkKCiAgICBkZWYgbW91bnQoc2VsZiwgcHJlZml4LCBhZGFwdGVyKToKICAgICAgICAiIiJSZWdpc3RlcnMgYSBjb25uZWN0aW9uIGFkYXB0ZXIgdG8gYSBwcmVmaXguCgogICAgICAgIEFkYXB0ZXJzIGFyZSBzb3J0ZWQgaW4gZGVzY2VuZGluZyBvcmRlciBieSBwcmVmaXggbGVuZ3RoLgogICAgICAgICIiIgogICAgICAgIHNlbGYuYWRhcHRlcnNbcHJlZml4XSA9IGFkYXB0ZXIKICAgICAgICBrZXlzX3RvX21vdmUgPSBbayBmb3IgayBpbiBzZWxmLmFkYXB0ZXJzIGlmIGxlbihrKSA8IGxlbihwcmVmaXgpXQoKICAgICAgICBmb3Iga2V5IGluIGtleXNfdG9fbW92ZToKICAgICAgICAgICAgc2VsZi5hZGFwdGVyc1trZXldID0gc2VsZi5hZGFwdGVycy5wb3Aoa2V5KQoKICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CiAgICAgICAgc3RhdGUgPSBkaWN0KChhdHRyLCBnZXRhdHRyKHNlbGYsIGF0dHIsIE5vbmUpKSBmb3IgYXR0ciBpbiBzZWxmLl9fYXR0cnNfXykKICAgICAgICByZXR1cm4gc3RhdGUKCiAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKICAgICAgICBmb3IgYXR0ciwgdmFsdWUgaW4gc3RhdGUuaXRlbXMoKToKICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWx1ZSkKCgpkZWYgc2Vzc2lvbigpOgogICAgIiIiCiAgICBSZXR1cm5zIGEgOmNsYXNzOmBTZXNzaW9uYCBmb3IgY29udGV4dC1tYW5hZ2VtZW50LgoKICAgIDpydHlwZTogU2Vzc2lvbgogICAgIiIiCgogICAgcmV0dXJuIFNlc3Npb24oKQpQSwMEFAAAAAAAAAAhAEE41+L7DAAA+wwAADQAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvc3RhdHVzX2NvZGVzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCmZyb20gLnN0cnVjdHVyZXMgaW1wb3J0IExvb2t1cERpY3QKCl9jb2RlcyA9IHsKCiAgICAjIEluZm9ybWF0aW9uYWwuCiAgICAxMDA6ICgnY29udGludWUnLCksCiAgICAxMDE6ICgnc3dpdGNoaW5nX3Byb3RvY29scycsKSwKICAgIDEwMjogKCdwcm9jZXNzaW5nJywpLAogICAgMTAzOiAoJ2NoZWNrcG9pbnQnLCksCiAgICAxMjI6ICgndXJpX3Rvb19sb25nJywgJ3JlcXVlc3RfdXJpX3Rvb19sb25nJyksCiAgICAyMDA6ICgnb2snLCAnb2theScsICdhbGxfb2snLCAnYWxsX29rYXknLCAnYWxsX2dvb2QnLCAnXFxvLycsICfinJMnKSwKICAgIDIwMTogKCdjcmVhdGVkJywpLAogICAgMjAyOiAoJ2FjY2VwdGVkJywpLAogICAgMjAzOiAoJ25vbl9hdXRob3JpdGF0aXZlX2luZm8nLCAnbm9uX2F1dGhvcml0YXRpdmVfaW5mb3JtYXRpb24nKSwKICAgIDIwNDogKCdub19jb250ZW50JywpLAogICAgMjA1OiAoJ3Jlc2V0X2NvbnRlbnQnLCAncmVzZXQnKSwKICAgIDIwNjogKCdwYXJ0aWFsX2NvbnRlbnQnLCAncGFydGlhbCcpLAogICAgMjA3OiAoJ211bHRpX3N0YXR1cycsICdtdWx0aXBsZV9zdGF0dXMnLCAnbXVsdGlfc3RhdGknLCAnbXVsdGlwbGVfc3RhdGknKSwKICAgIDIwODogKCdhbHJlYWR5X3JlcG9ydGVkJywpLAogICAgMjI2OiAoJ2ltX3VzZWQnLCksCgogICAgIyBSZWRpcmVjdGlvbi4KICAgIDMwMDogKCdtdWx0aXBsZV9jaG9pY2VzJywpLAogICAgMzAxOiAoJ21vdmVkX3Blcm1hbmVudGx5JywgJ21vdmVkJywgJ1xcby0nKSwKICAgIDMwMjogKCdmb3VuZCcsKSwKICAgIDMwMzogKCdzZWVfb3RoZXInLCAnb3RoZXInKSwKICAgIDMwNDogKCdub3RfbW9kaWZpZWQnLCksCiAgICAzMDU6ICgndXNlX3Byb3h5JywpLAogICAgMzA2OiAoJ3N3aXRjaF9wcm94eScsKSwKICAgIDMwNzogKCd0ZW1wb3JhcnlfcmVkaXJlY3QnLCAndGVtcG9yYXJ5X21vdmVkJywgJ3RlbXBvcmFyeScpLAogICAgMzA4OiAoJ3Blcm1hbmVudF9yZWRpcmVjdCcsCiAgICAgICAgICAncmVzdW1lX2luY29tcGxldGUnLCAncmVzdW1lJywpLCAgIyBUaGVzZSAyIHRvIGJlIHJlbW92ZWQgaW4gMy4wCgogICAgIyBDbGllbnQgRXJyb3IuCiAgICA0MDA6ICgnYmFkX3JlcXVlc3QnLCAnYmFkJyksCiAgICA0MDE6ICgndW5hdXRob3JpemVkJywpLAogICAgNDAyOiAoJ3BheW1lbnRfcmVxdWlyZWQnLCAncGF5bWVudCcpLAogICAgNDAzOiAoJ2ZvcmJpZGRlbicsKSwKICAgIDQwNDogKCdub3RfZm91bmQnLCAnLW8tJyksCiAgICA0MDU6ICgnbWV0aG9kX25vdF9hbGxvd2VkJywgJ25vdF9hbGxvd2VkJyksCiAgICA0MDY6ICgnbm90X2FjY2VwdGFibGUnLCksCiAgICA0MDc6ICgncHJveHlfYXV0aGVudGljYXRpb25fcmVxdWlyZWQnLCAncHJveHlfYXV0aCcsICdwcm94eV9hdXRoZW50aWNhdGlvbicpLAogICAgNDA4OiAoJ3JlcXVlc3RfdGltZW91dCcsICd0aW1lb3V0JyksCiAgICA0MDk6ICgnY29uZmxpY3QnLCksCiAgICA0MTA6ICgnZ29uZScsKSwKICAgIDQxMTogKCdsZW5ndGhfcmVxdWlyZWQnLCksCiAgICA0MTI6ICgncHJlY29uZGl0aW9uX2ZhaWxlZCcsICdwcmVjb25kaXRpb24nKSwKICAgIDQxMzogKCdyZXF1ZXN0X2VudGl0eV90b29fbGFyZ2UnLCksCiAgICA0MTQ6ICgncmVxdWVzdF91cmlfdG9vX2xhcmdlJywpLAogICAgNDE1OiAoJ3Vuc3VwcG9ydGVkX21lZGlhX3R5cGUnLCAndW5zdXBwb3J0ZWRfbWVkaWEnLCAnbWVkaWFfdHlwZScpLAogICAgNDE2OiAoJ3JlcXVlc3RlZF9yYW5nZV9ub3Rfc2F0aXNmaWFibGUnLCAncmVxdWVzdGVkX3JhbmdlJywgJ3JhbmdlX25vdF9zYXRpc2ZpYWJsZScpLAogICAgNDE3OiAoJ2V4cGVjdGF0aW9uX2ZhaWxlZCcsKSwKICAgIDQxODogKCdpbV9hX3RlYXBvdCcsICd0ZWFwb3QnLCAnaV9hbV9hX3RlYXBvdCcpLAogICAgNDIxOiAoJ21pc2RpcmVjdGVkX3JlcXVlc3QnLCksCiAgICA0MjI6ICgndW5wcm9jZXNzYWJsZV9lbnRpdHknLCAndW5wcm9jZXNzYWJsZScpLAogICAgNDIzOiAoJ2xvY2tlZCcsKSwKICAgIDQyNDogKCdmYWlsZWRfZGVwZW5kZW5jeScsICdkZXBlbmRlbmN5JyksCiAgICA0MjU6ICgndW5vcmRlcmVkX2NvbGxlY3Rpb24nLCAndW5vcmRlcmVkJyksCiAgICA0MjY6ICgndXBncmFkZV9yZXF1aXJlZCcsICd1cGdyYWRlJyksCiAgICA0Mjg6ICgncHJlY29uZGl0aW9uX3JlcXVpcmVkJywgJ3ByZWNvbmRpdGlvbicpLAogICAgNDI5OiAoJ3Rvb19tYW55X3JlcXVlc3RzJywgJ3Rvb19tYW55JyksCiAgICA0MzE6ICgnaGVhZGVyX2ZpZWxkc190b29fbGFyZ2UnLCAnZmllbGRzX3Rvb19sYXJnZScpLAogICAgNDQ0OiAoJ25vX3Jlc3BvbnNlJywgJ25vbmUnKSwKICAgIDQ0OTogKCdyZXRyeV93aXRoJywgJ3JldHJ5JyksCiAgICA0NTA6ICgnYmxvY2tlZF9ieV93aW5kb3dzX3BhcmVudGFsX2NvbnRyb2xzJywgJ3BhcmVudGFsX2NvbnRyb2xzJyksCiAgICA0NTE6ICgndW5hdmFpbGFibGVfZm9yX2xlZ2FsX3JlYXNvbnMnLCAnbGVnYWxfcmVhc29ucycpLAogICAgNDk5OiAoJ2NsaWVudF9jbG9zZWRfcmVxdWVzdCcsKSwKCiAgICAjIFNlcnZlciBFcnJvci4KICAgIDUwMDogKCdpbnRlcm5hbF9zZXJ2ZXJfZXJyb3InLCAnc2VydmVyX2Vycm9yJywgJy9vXFwnLCAn4pyXJyksCiAgICA1MDE6ICgnbm90X2ltcGxlbWVudGVkJywpLAogICAgNTAyOiAoJ2JhZF9nYXRld2F5JywpLAogICAgNTAzOiAoJ3NlcnZpY2VfdW5hdmFpbGFibGUnLCAndW5hdmFpbGFibGUnKSwKICAgIDUwNDogKCdnYXRld2F5X3RpbWVvdXQnLCksCiAgICA1MDU6ICgnaHR0cF92ZXJzaW9uX25vdF9zdXBwb3J0ZWQnLCAnaHR0cF92ZXJzaW9uJyksCiAgICA1MDY6ICgndmFyaWFudF9hbHNvX25lZ290aWF0ZXMnLCksCiAgICA1MDc6ICgnaW5zdWZmaWNpZW50X3N0b3JhZ2UnLCksCiAgICA1MDk6ICgnYmFuZHdpZHRoX2xpbWl0X2V4Y2VlZGVkJywgJ2JhbmR3aWR0aCcpLAogICAgNTEwOiAoJ25vdF9leHRlbmRlZCcsKSwKICAgIDUxMTogKCduZXR3b3JrX2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVkJywgJ25ldHdvcmtfYXV0aCcsICduZXR3b3JrX2F1dGhlbnRpY2F0aW9uJyksCn0KCmNvZGVzID0gTG9va3VwRGljdChuYW1lPSdzdGF0dXNfY29kZXMnKQoKZm9yIGNvZGUsIHRpdGxlcyBpbiBfY29kZXMuaXRlbXMoKToKICAgIGZvciB0aXRsZSBpbiB0aXRsZXM6CiAgICAgICAgc2V0YXR0cihjb2RlcywgdGl0bGUsIGNvZGUpCiAgICAgICAgaWYgbm90IHRpdGxlLnN0YXJ0c3dpdGgoKCdcXCcsICcvJykpOgogICAgICAgICAgICBzZXRhdHRyKGNvZGVzLCB0aXRsZS51cHBlcigpLCBjb2RlKQpQSwMEFAAAAAAAAAAhAOYgyg/ECwAAxAsAADIAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvc3RydWN0dXJlcy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMuc3RydWN0dXJlcwp+fn5+fn5+fn5+fn5+fn5+fn5+CgpEYXRhIHN0cnVjdHVyZXMgdGhhdCBwb3dlciBSZXF1ZXN0cy4KIiIiCgppbXBvcnQgY29sbGVjdGlvbnMKCmZyb20gLmNvbXBhdCBpbXBvcnQgT3JkZXJlZERpY3QKCgpjbGFzcyBDYXNlSW5zZW5zaXRpdmVEaWN0KGNvbGxlY3Rpb25zLk11dGFibGVNYXBwaW5nKToKICAgICIiIkEgY2FzZS1pbnNlbnNpdGl2ZSBgYGRpY3RgYC1saWtlIG9iamVjdC4KCiAgICBJbXBsZW1lbnRzIGFsbCBtZXRob2RzIGFuZCBvcGVyYXRpb25zIG9mCiAgICBgYGNvbGxlY3Rpb25zLk11dGFibGVNYXBwaW5nYGAgYXMgd2VsbCBhcyBkaWN0J3MgYGBjb3B5YGAuIEFsc28KICAgIHByb3ZpZGVzIGBgbG93ZXJfaXRlbXNgYC4KCiAgICBBbGwga2V5cyBhcmUgZXhwZWN0ZWQgdG8gYmUgc3RyaW5ncy4gVGhlIHN0cnVjdHVyZSByZW1lbWJlcnMgdGhlCiAgICBjYXNlIG9mIHRoZSBsYXN0IGtleSB0byBiZSBzZXQsIGFuZCBgYGl0ZXIoaW5zdGFuY2UpYGAsCiAgICBgYGtleXMoKWBgLCBgYGl0ZW1zKClgYCwgYGBpdGVya2V5cygpYGAsIGFuZCBgYGl0ZXJpdGVtcygpYGAKICAgIHdpbGwgY29udGFpbiBjYXNlLXNlbnNpdGl2ZSBrZXlzLiBIb3dldmVyLCBxdWVyeWluZyBhbmQgY29udGFpbnMKICAgIHRlc3RpbmcgaXMgY2FzZSBpbnNlbnNpdGl2ZTo6CgogICAgICAgIGNpZCA9IENhc2VJbnNlbnNpdGl2ZURpY3QoKQogICAgICAgIGNpZFsnQWNjZXB0J10gPSAnYXBwbGljYXRpb24vanNvbicKICAgICAgICBjaWRbJ2FDQ0VQVCddID09ICdhcHBsaWNhdGlvbi9qc29uJyAgIyBUcnVlCiAgICAgICAgbGlzdChjaWQpID09IFsnQWNjZXB0J10gICMgVHJ1ZQoKICAgIEZvciBleGFtcGxlLCBgYGhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXWBgIHdpbGwgcmV0dXJuIHRoZQogICAgdmFsdWUgb2YgYSBgYCdDb250ZW50LUVuY29kaW5nJ2BgIHJlc3BvbnNlIGhlYWRlciwgcmVnYXJkbGVzcwogICAgb2YgaG93IHRoZSBoZWFkZXIgbmFtZSB3YXMgb3JpZ2luYWxseSBzdG9yZWQuCgogICAgSWYgdGhlIGNvbnN0cnVjdG9yLCBgYC51cGRhdGVgYCwgb3IgZXF1YWxpdHkgY29tcGFyaXNvbgogICAgb3BlcmF0aW9ucyBhcmUgZ2l2ZW4ga2V5cyB0aGF0IGhhdmUgZXF1YWwgYGAubG93ZXIoKWBgcywgdGhlCiAgICBiZWhhdmlvciBpcyB1bmRlZmluZWQuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YT1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgc2VsZi5fc3RvcmUgPSBPcmRlcmVkRGljdCgpCiAgICAgICAgaWYgZGF0YSBpcyBOb25lOgogICAgICAgICAgICBkYXRhID0ge30KICAgICAgICBzZWxmLnVwZGF0ZShkYXRhLCAqKmt3YXJncykKCiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgIyBVc2UgdGhlIGxvd2VyY2FzZWQga2V5IGZvciBsb29rdXBzLCBidXQgc3RvcmUgdGhlIGFjdHVhbAogICAgICAgICMga2V5IGFsb25nc2lkZSB0aGUgdmFsdWUuCiAgICAgICAgc2VsZi5fc3RvcmVba2V5Lmxvd2VyKCldID0gKGtleSwgdmFsdWUpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX3N0b3JlW2tleS5sb3dlcigpXVsxXQoKICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIGRlbCBzZWxmLl9zdG9yZVtrZXkubG93ZXIoKV0KCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIChjYXNlZGtleSBmb3IgY2FzZWRrZXksIG1hcHBlZHZhbHVlIGluIHNlbGYuX3N0b3JlLnZhbHVlcygpKQoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgIHJldHVybiBsZW4oc2VsZi5fc3RvcmUpCgogICAgZGVmIGxvd2VyX2l0ZW1zKHNlbGYpOgogICAgICAgICIiIkxpa2UgaXRlcml0ZW1zKCksIGJ1dCB3aXRoIGFsbCBsb3dlcmNhc2Uga2V5cy4iIiIKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAobG93ZXJrZXksIGtleXZhbFsxXSkKICAgICAgICAgICAgZm9yIChsb3dlcmtleSwga2V5dmFsKQogICAgICAgICAgICBpbiBzZWxmLl9zdG9yZS5pdGVtcygpCiAgICAgICAgKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGNvbGxlY3Rpb25zLk1hcHBpbmcpOgogICAgICAgICAgICBvdGhlciA9IENhc2VJbnNlbnNpdGl2ZURpY3Qob3RoZXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgIyBDb21wYXJlIGluc2Vuc2l0aXZlbHkKICAgICAgICByZXR1cm4gZGljdChzZWxmLmxvd2VyX2l0ZW1zKCkpID09IGRpY3Qob3RoZXIubG93ZXJfaXRlbXMoKSkKCiAgICAjIENvcHkgaXMgcmVxdWlyZWQKICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgIHJldHVybiBDYXNlSW5zZW5zaXRpdmVEaWN0KHNlbGYuX3N0b3JlLnZhbHVlcygpKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKGRpY3Qoc2VsZi5pdGVtcygpKSkKCgpjbGFzcyBMb29rdXBEaWN0KGRpY3QpOgogICAgIiIiRGljdGlvbmFyeSBsb29rdXAgb2JqZWN0LiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPU5vbmUpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzdXBlcihMb29rdXBEaWN0LCBzZWxmKS5fX2luaXRfXygpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnPGxvb2t1cCBcJyVzXCc+JyAlIChzZWxmLm5hbWUpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgIyBXZSBhbGxvdyBmYWxsLXRocm91Z2ggaGVyZSwgc28gdmFsdWVzIGRlZmF1bHQgdG8gTm9uZQoKICAgICAgICByZXR1cm4gc2VsZi5fX2RpY3RfXy5nZXQoa2V5LCBOb25lKQoKICAgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgogICAgICAgIHJldHVybiBzZWxmLl9fZGljdF9fLmdldChrZXksIGRlZmF1bHQpClBLAwQUAAAAAAAAACEAR8HZVwRsAAAEbAAALQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy91dGlscy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMudXRpbHMKfn5+fn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIHByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWQgd2l0aGluIFJlcXVlc3RzCnRoYXQgYXJlIGFsc28gdXNlZnVsIGZvciBleHRlcm5hbCBjb25zdW1wdGlvbi4KIiIiCgppbXBvcnQgY2dpCmltcG9ydCBjb2RlY3MKaW1wb3J0IGNvbGxlY3Rpb25zCmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBpbwppbXBvcnQgb3MKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCByZQppbXBvcnQgc29ja2V0CmltcG9ydCBzdHJ1Y3QKaW1wb3J0IHdhcm5pbmdzCgpmcm9tIC5fX3ZlcnNpb25fXyBpbXBvcnQgX192ZXJzaW9uX18KZnJvbSAuIGltcG9ydCBjZXJ0cwojIHRvX25hdGl2ZV9zdHJpbmcgaXMgdW51c2VkIGhlcmUsIGJ1dCBpbXBvcnRlZCBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQpmcm9tIC5faW50ZXJuYWxfdXRpbHMgaW1wb3J0IHRvX25hdGl2ZV9zdHJpbmcKZnJvbSAuY29tcGF0IGltcG9ydCBwYXJzZV9odHRwX2xpc3QgYXMgX3BhcnNlX2xpc3RfaGVhZGVyCmZyb20gLmNvbXBhdCBpbXBvcnQgKAogICAgcXVvdGUsIHVybHBhcnNlLCBieXRlcywgc3RyLCBPcmRlcmVkRGljdCwgdW5xdW90ZSwgZ2V0cHJveGllcywKICAgIHByb3h5X2J5cGFzcywgdXJsdW5wYXJzZSwgYmFzZXN0cmluZywgaW50ZWdlcl90eXBlcywgaXNfcHkzLAogICAgcHJveHlfYnlwYXNzX2Vudmlyb25tZW50LCBnZXRwcm94aWVzX2Vudmlyb25tZW50KQpmcm9tIC5jb29raWVzIGltcG9ydCBjb29raWVqYXJfZnJvbV9kaWN0CmZyb20gLnN0cnVjdHVyZXMgaW1wb3J0IENhc2VJbnNlbnNpdGl2ZURpY3QKZnJvbSAuZXhjZXB0aW9ucyBpbXBvcnQgKAogICAgSW52YWxpZFVSTCwgSW52YWxpZEhlYWRlciwgRmlsZU1vZGVXYXJuaW5nLCBVbnJld2luZGFibGVCb2R5RXJyb3IpCgpORVRSQ19GSUxFUyA9ICgnLm5ldHJjJywgJ19uZXRyYycpCgpERUZBVUxUX0NBX0JVTkRMRV9QQVRIID0gY2VydHMud2hlcmUoKQoKCmlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKICAgICMgcHJvdmlkZSBhIHByb3h5X2J5cGFzcyB2ZXJzaW9uIG9uIFdpbmRvd3Mgd2l0aG91dCBETlMgbG9va3VwcwoKICAgIGRlZiBwcm94eV9ieXBhc3NfcmVnaXN0cnkoaG9zdCk6CiAgICAgICAgaWYgaXNfcHkzOgogICAgICAgICAgICBpbXBvcnQgd2lucmVnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaW1wb3J0IF93aW5yZWcgYXMgd2lucmVnCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpbnRlcm5ldFNldHRpbmdzID0gd2lucmVnLk9wZW5LZXkod2lucmVnLkhLRVlfQ1VSUkVOVF9VU0VSLAogICAgICAgICAgICAgICAgcidTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxJbnRlcm5ldCBTZXR0aW5ncycpCiAgICAgICAgICAgIHByb3h5RW5hYmxlID0gd2lucmVnLlF1ZXJ5VmFsdWVFeChpbnRlcm5ldFNldHRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Byb3h5RW5hYmxlJylbMF0KICAgICAgICAgICAgcHJveHlPdmVycmlkZSA9IHdpbnJlZy5RdWVyeVZhbHVlRXgoaW50ZXJuZXRTZXR0aW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Byb3h5T3ZlcnJpZGUnKVswXQogICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBpZiBub3QgcHJveHlFbmFibGUgb3Igbm90IHByb3h5T3ZlcnJpZGU6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIG1ha2UgYSBjaGVjayB2YWx1ZSBsaXN0IGZyb20gdGhlIHJlZ2lzdHJ5IGVudHJ5OiByZXBsYWNlIHRoZQogICAgICAgICMgJzxsb2NhbD4nIHN0cmluZyBieSB0aGUgbG9jYWxob3N0IGVudHJ5IGFuZCB0aGUgY29ycmVzcG9uZGluZwogICAgICAgICMgY2Fub25pY2FsIGVudHJ5LgogICAgICAgIHByb3h5T3ZlcnJpZGUgPSBwcm94eU92ZXJyaWRlLnNwbGl0KCc7JykKICAgICAgICAjIG5vdyBjaGVjayBpZiB3ZSBtYXRjaCBvbmUgb2YgdGhlIHJlZ2lzdHJ5IHZhbHVlcy4KICAgICAgICBmb3IgdGVzdCBpbiBwcm94eU92ZXJyaWRlOgogICAgICAgICAgICBpZiB0ZXN0ID09ICc8bG9jYWw+JzoKICAgICAgICAgICAgICAgIGlmICcuJyBub3QgaW4gaG9zdDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICB0ZXN0ID0gdGVzdC5yZXBsYWNlKCIuIiwgciJcLiIpICAgICAjIG1hc2sgZG90cwogICAgICAgICAgICB0ZXN0ID0gdGVzdC5yZXBsYWNlKCIqIiwgciIuKiIpICAgICAjIGNoYW5nZSBnbG9iIHNlcXVlbmNlCiAgICAgICAgICAgIHRlc3QgPSB0ZXN0LnJlcGxhY2UoIj8iLCByIi4iKSAgICAgICMgY2hhbmdlIGdsb2IgY2hhcgogICAgICAgICAgICBpZiByZS5tYXRjaCh0ZXN0LCBob3N0LCByZS5JKToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIHByb3h5X2J5cGFzcyhob3N0KTogICMgbm9xYQogICAgICAgICIiIlJldHVybiBUcnVlLCBpZiB0aGUgaG9zdCBzaG91bGQgYmUgYnlwYXNzZWQuCgogICAgICAgIENoZWNrcyBwcm94eSBzZXR0aW5ncyBnYXRoZXJlZCBmcm9tIHRoZSBlbnZpcm9ubWVudCwgaWYgc3BlY2lmaWVkLAogICAgICAgIG9yIHRoZSByZWdpc3RyeS4KICAgICAgICAiIiIKICAgICAgICBpZiBnZXRwcm94aWVzX2Vudmlyb25tZW50KCk6CiAgICAgICAgICAgIHJldHVybiBwcm94eV9ieXBhc3NfZW52aXJvbm1lbnQoaG9zdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gcHJveHlfYnlwYXNzX3JlZ2lzdHJ5KGhvc3QpCgoKZGVmIGRpY3RfdG9fc2VxdWVuY2UoZCk6CiAgICAiIiJSZXR1cm5zIGFuIGludGVybmFsIHNlcXVlbmNlIGRpY3Rpb25hcnkgdXBkYXRlLiIiIgoKICAgIGlmIGhhc2F0dHIoZCwgJ2l0ZW1zJyk6CiAgICAgICAgZCA9IGQuaXRlbXMoKQoKICAgIHJldHVybiBkCgoKZGVmIHN1cGVyX2xlbihvKToKICAgIHRvdGFsX2xlbmd0aCA9IE5vbmUKICAgIGN1cnJlbnRfcG9zaXRpb24gPSAwCgogICAgaWYgaGFzYXR0cihvLCAnX19sZW5fXycpOgogICAgICAgIHRvdGFsX2xlbmd0aCA9IGxlbihvKQoKICAgIGVsaWYgaGFzYXR0cihvLCAnbGVuJyk6CiAgICAgICAgdG90YWxfbGVuZ3RoID0gby5sZW4KCiAgICBlbGlmIGhhc2F0dHIobywgJ2ZpbGVubycpOgogICAgICAgIHRyeToKICAgICAgICAgICAgZmlsZW5vID0gby5maWxlbm8oKQogICAgICAgIGV4Y2VwdCBpby5VbnN1cHBvcnRlZE9wZXJhdGlvbjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRvdGFsX2xlbmd0aCA9IG9zLmZzdGF0KGZpbGVubykuc3Rfc2l6ZQoKICAgICAgICAgICAgIyBIYXZpbmcgdXNlZCBmc3RhdCB0byBkZXRlcm1pbmUgdGhlIGZpbGUgbGVuZ3RoLCB3ZSBuZWVkIHRvCiAgICAgICAgICAgICMgY29uZmlybSB0aGF0IHRoaXMgZmlsZSB3YXMgb3BlbmVkIHVwIGluIGJpbmFyeSBtb2RlLgogICAgICAgICAgICBpZiAnYicgbm90IGluIG8ubW9kZToKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oKAogICAgICAgICAgICAgICAgICAgICJSZXF1ZXN0cyBoYXMgZGV0ZXJtaW5lZCB0aGUgY29udGVudC1sZW5ndGggZm9yIHRoaXMgIgogICAgICAgICAgICAgICAgICAgICJyZXF1ZXN0IHVzaW5nIHRoZSBiaW5hcnkgc2l6ZSBvZiB0aGUgZmlsZTogaG93ZXZlciwgdGhlICIKICAgICAgICAgICAgICAgICAgICAiZmlsZSBoYXMgYmVlbiBvcGVuZWQgaW4gdGV4dCBtb2RlIChpLmUuIHdpdGhvdXQgdGhlICdiJyAiCiAgICAgICAgICAgICAgICAgICAgImZsYWcgaW4gdGhlIG1vZGUpLiBUaGlzIG1heSBsZWFkIHRvIGFuIGluY29ycmVjdCAiCiAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQtbGVuZ3RoLiBJbiBSZXF1ZXN0cyAzLjAsIHN1cHBvcnQgd2lsbCBiZSByZW1vdmVkICIKICAgICAgICAgICAgICAgICAgICAiZm9yIGZpbGVzIGluIHRleHQgbW9kZS4iKSwKICAgICAgICAgICAgICAgICAgICBGaWxlTW9kZVdhcm5pbmcKICAgICAgICAgICAgICAgICkKCiAgICBpZiBoYXNhdHRyKG8sICd0ZWxsJyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBjdXJyZW50X3Bvc2l0aW9uID0gby50ZWxsKCkKICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAjIFRoaXMgY2FuIGhhcHBlbiBpbiBzb21lIHdlaXJkIHNpdHVhdGlvbnMsIHN1Y2ggYXMgd2hlbiB0aGUgZmlsZQogICAgICAgICAgICAjIGlzIGFjdHVhbGx5IGEgc3BlY2lhbCBmaWxlIGRlc2NyaXB0b3IgbGlrZSBzdGRpbi4gSW4gdGhpcwogICAgICAgICAgICAjIGluc3RhbmNlLCB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIGxlbmd0aCBpcywgc28gc2V0IGl0IHRvIHplcm8gYW5kCiAgICAgICAgICAgICMgbGV0IHJlcXVlc3RzIGNodW5rIGl0IGluc3RlYWQuCiAgICAgICAgICAgIGlmIHRvdGFsX2xlbmd0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGN1cnJlbnRfcG9zaXRpb24gPSB0b3RhbF9sZW5ndGgKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBoYXNhdHRyKG8sICdzZWVrJykgYW5kIHRvdGFsX2xlbmd0aCBpcyBOb25lOgogICAgICAgICAgICAgICAgIyBTdHJpbmdJTyBhbmQgQnl0ZXNJTyBoYXZlIHNlZWsgYnV0IG5vIHVzZWFibGUgZmlsZW5vCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIyBzZWVrIHRvIGVuZCBvZiBmaWxlCiAgICAgICAgICAgICAgICAgICAgby5zZWVrKDAsIDIpCiAgICAgICAgICAgICAgICAgICAgdG90YWxfbGVuZ3RoID0gby50ZWxsKCkKCiAgICAgICAgICAgICAgICAgICAgIyBzZWVrIGJhY2sgdG8gY3VycmVudCBwb3NpdGlvbiB0byBzdXBwb3J0CiAgICAgICAgICAgICAgICAgICAgIyBwYXJ0aWFsbHkgcmVhZCBmaWxlLWxpa2Ugb2JqZWN0cwogICAgICAgICAgICAgICAgICAgIG8uc2VlayhjdXJyZW50X3Bvc2l0aW9uIG9yIDApCiAgICAgICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAgICAgICAgIHRvdGFsX2xlbmd0aCA9IDAKCiAgICBpZiB0b3RhbF9sZW5ndGggaXMgTm9uZToKICAgICAgICB0b3RhbF9sZW5ndGggPSAwCgogICAgcmV0dXJuIG1heCgwLCB0b3RhbF9sZW5ndGggLSBjdXJyZW50X3Bvc2l0aW9uKQoKCmRlZiBnZXRfbmV0cmNfYXV0aCh1cmwsIHJhaXNlX2Vycm9ycz1GYWxzZSk6CiAgICAiIiJSZXR1cm5zIHRoZSBSZXF1ZXN0cyB0dXBsZSBhdXRoIGZvciBhIGdpdmVuIHVybCBmcm9tIG5ldHJjLiIiIgoKICAgIHRyeToKICAgICAgICBmcm9tIG5ldHJjIGltcG9ydCBuZXRyYywgTmV0cmNQYXJzZUVycm9yCgogICAgICAgIG5ldHJjX3BhdGggPSBOb25lCgogICAgICAgIGZvciBmIGluIE5FVFJDX0ZJTEVTOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBsb2MgPSBvcy5wYXRoLmV4cGFuZHVzZXIoJ34vezB9Jy5mb3JtYXQoZikpCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgICMgb3MucGF0aC5leHBhbmR1c2VyIGNhbiBmYWlsIHdoZW4gJEhPTUUgaXMgdW5kZWZpbmVkIGFuZAogICAgICAgICAgICAgICAgIyBnZXRwd3VpZCBmYWlscy4gU2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyMDE2NCAmCiAgICAgICAgICAgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXF1ZXN0cy9yZXF1ZXN0cy9pc3N1ZXMvMTg0NgogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhsb2MpOgogICAgICAgICAgICAgICAgbmV0cmNfcGF0aCA9IGxvYwogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgIyBBYm9ydCBlYXJseSBpZiB0aGVyZSBpc24ndCBvbmUuCiAgICAgICAgaWYgbmV0cmNfcGF0aCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgcmkgPSB1cmxwYXJzZSh1cmwpCgogICAgICAgICMgU3RyaXAgcG9ydCBudW1iZXJzIGZyb20gbmV0bG9jLiBUaGlzIHdlaXJkIGBpZi4uLmVuY29kZWBgIGRhbmNlIGlzCiAgICAgICAgIyB1c2VkIGZvciBQeXRob24gMy4yLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgdW5pY29kZSBsaXRlcmFscy4KICAgICAgICBzcGxpdHN0ciA9IGInOicKICAgICAgICBpZiBpc2luc3RhbmNlKHVybCwgc3RyKToKICAgICAgICAgICAgc3BsaXRzdHIgPSBzcGxpdHN0ci5kZWNvZGUoJ2FzY2lpJykKICAgICAgICBob3N0ID0gcmkubmV0bG9jLnNwbGl0KHNwbGl0c3RyKVswXQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIF9uZXRyYyA9IG5ldHJjKG5ldHJjX3BhdGgpLmF1dGhlbnRpY2F0b3JzKGhvc3QpCiAgICAgICAgICAgIGlmIF9uZXRyYzoKICAgICAgICAgICAgICAgICMgUmV0dXJuIHdpdGggbG9naW4gLyBwYXNzd29yZAogICAgICAgICAgICAgICAgbG9naW5faSA9ICgwIGlmIF9uZXRyY1swXSBlbHNlIDEpCiAgICAgICAgICAgICAgICByZXR1cm4gKF9uZXRyY1tsb2dpbl9pXSwgX25ldHJjWzJdKQogICAgICAgIGV4Y2VwdCAoTmV0cmNQYXJzZUVycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgIyBJZiB0aGVyZSB3YXMgYSBwYXJzaW5nIGVycm9yIG9yIGEgcGVybWlzc2lvbnMgaXNzdWUgcmVhZGluZyB0aGUgZmlsZSwKICAgICAgICAgICAgIyB3ZSdsbCBqdXN0IHNraXAgbmV0cmMgYXV0aCB1bmxlc3MgZXhwbGljaXRseSBhc2tlZCB0byByYWlzZSBlcnJvcnMuCiAgICAgICAgICAgIGlmIHJhaXNlX2Vycm9yczoKICAgICAgICAgICAgICAgIHJhaXNlCgogICAgIyBBcHBFbmdpbmUgaGFja2luZXNzLgogICAgZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgogICAgICAgIHBhc3MKCgpkZWYgZ3Vlc3NfZmlsZW5hbWUob2JqKToKICAgICIiIlRyaWVzIHRvIGd1ZXNzIHRoZSBmaWxlbmFtZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LiIiIgogICAgbmFtZSA9IGdldGF0dHIob2JqLCAnbmFtZScsIE5vbmUpCiAgICBpZiAobmFtZSBhbmQgaXNpbnN0YW5jZShuYW1lLCBiYXNlc3RyaW5nKSBhbmQgbmFtZVswXSAhPSAnPCcgYW5kCiAgICAgICAgICAgIG5hbWVbLTFdICE9ICc+Jyk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguYmFzZW5hbWUobmFtZSkKCgpkZWYgZnJvbV9rZXlfdmFsX2xpc3QodmFsdWUpOgogICAgIiIiVGFrZSBhbiBvYmplY3QgYW5kIHRlc3QgdG8gc2VlIGlmIGl0IGNhbiBiZSByZXByZXNlbnRlZCBhcyBhCiAgICBkaWN0aW9uYXJ5LiBVbmxlc3MgaXQgY2FuIG5vdCBiZSByZXByZXNlbnRlZCBhcyBzdWNoLCByZXR1cm4gYW4KICAgIE9yZGVyZWREaWN0LCBlLmcuLAoKICAgIDo6CgogICAgICAgID4+PiBmcm9tX2tleV92YWxfbGlzdChbKCdrZXknLCAndmFsJyldKQogICAgICAgIE9yZGVyZWREaWN0KFsoJ2tleScsICd2YWwnKV0pCiAgICAgICAgPj4+IGZyb21fa2V5X3ZhbF9saXN0KCdzdHJpbmcnKQogICAgICAgIFZhbHVlRXJyb3I6IG5lZWQgbW9yZSB0aGFuIDEgdmFsdWUgdG8gdW5wYWNrCiAgICAgICAgPj4+IGZyb21fa2V5X3ZhbF9saXN0KHsna2V5JzogJ3ZhbCd9KQogICAgICAgIE9yZGVyZWREaWN0KFsoJ2tleScsICd2YWwnKV0pCgogICAgOnJ0eXBlOiBPcmRlcmVkRGljdAogICAgIiIiCiAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCgogICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKHN0ciwgYnl0ZXMsIGJvb2wsIGludCkpOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2Nhbm5vdCBlbmNvZGUgb2JqZWN0cyB0aGF0IGFyZSBub3QgMi10dXBsZXMnKQoKICAgIHJldHVybiBPcmRlcmVkRGljdCh2YWx1ZSkKCgpkZWYgdG9fa2V5X3ZhbF9saXN0KHZhbHVlKToKICAgICIiIlRha2UgYW4gb2JqZWN0IGFuZCB0ZXN0IHRvIHNlZSBpZiBpdCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYQogICAgZGljdGlvbmFyeS4gSWYgaXQgY2FuIGJlLCByZXR1cm4gYSBsaXN0IG9mIHR1cGxlcywgZS5nLiwKCiAgICA6OgoKICAgICAgICA+Pj4gdG9fa2V5X3ZhbF9saXN0KFsoJ2tleScsICd2YWwnKV0pCiAgICAgICAgWygna2V5JywgJ3ZhbCcpXQogICAgICAgID4+PiB0b19rZXlfdmFsX2xpc3QoeydrZXknOiAndmFsJ30pCiAgICAgICAgWygna2V5JywgJ3ZhbCcpXQogICAgICAgID4+PiB0b19rZXlfdmFsX2xpc3QoJ3N0cmluZycpCiAgICAgICAgVmFsdWVFcnJvcjogY2Fubm90IGVuY29kZSBvYmplY3RzIHRoYXQgYXJlIG5vdCAyLXR1cGxlcy4KCiAgICA6cnR5cGU6IGxpc3QKICAgICIiIgogICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIChzdHIsIGJ5dGVzLCBib29sLCBpbnQpKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdjYW5ub3QgZW5jb2RlIG9iamVjdHMgdGhhdCBhcmUgbm90IDItdHVwbGVzJykKCiAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBjb2xsZWN0aW9ucy5NYXBwaW5nKToKICAgICAgICB2YWx1ZSA9IHZhbHVlLml0ZW1zKCkKCiAgICByZXR1cm4gbGlzdCh2YWx1ZSkKCgojIEZyb20gbWl0c3VoaWtvL3dlcmt6ZXVnICh1c2VkIHdpdGggcGVybWlzc2lvbikuCmRlZiBwYXJzZV9saXN0X2hlYWRlcih2YWx1ZSk6CiAgICAiIiJQYXJzZSBsaXN0cyBhcyBkZXNjcmliZWQgYnkgUkZDIDIwNjggU2VjdGlvbiAyLgoKICAgIEluIHBhcnRpY3VsYXIsIHBhcnNlIGNvbW1hLXNlcGFyYXRlZCBsaXN0cyB3aGVyZSB0aGUgZWxlbWVudHMgb2YKICAgIHRoZSBsaXN0IG1heSBpbmNsdWRlIHF1b3RlZC1zdHJpbmdzLiAgQSBxdW90ZWQtc3RyaW5nIGNvdWxkCiAgICBjb250YWluIGEgY29tbWEuICBBIG5vbi1xdW90ZWQgc3RyaW5nIGNvdWxkIGhhdmUgcXVvdGVzIGluIHRoZQogICAgbWlkZGxlLiAgUXVvdGVzIGFyZSByZW1vdmVkIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgcGFyc2luZy4KCiAgICBJdCBiYXNpY2FsbHkgd29ya3MgbGlrZSA6ZnVuYzpgcGFyc2Vfc2V0X2hlYWRlcmAganVzdCB0aGF0IGl0ZW1zCiAgICBtYXkgYXBwZWFyIG11bHRpcGxlIHRpbWVzIGFuZCBjYXNlIHNlbnNpdGl2aXR5IGlzIHByZXNlcnZlZC4KCiAgICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgc3RhbmRhcmQgOmNsYXNzOmBsaXN0YDoKCiAgICA+Pj4gcGFyc2VfbGlzdF9oZWFkZXIoJ3Rva2VuLCAicXVvdGVkIHZhbHVlIicpCiAgICBbJ3Rva2VuJywgJ3F1b3RlZCB2YWx1ZSddCgogICAgVG8gY3JlYXRlIGEgaGVhZGVyIGZyb20gdGhlIDpjbGFzczpgbGlzdGAgYWdhaW4sIHVzZSB0aGUKICAgIDpmdW5jOmBkdW1wX2hlYWRlcmAgZnVuY3Rpb24uCgogICAgOnBhcmFtIHZhbHVlOiBhIHN0cmluZyB3aXRoIGEgbGlzdCBoZWFkZXIuCiAgICA6cmV0dXJuOiA6Y2xhc3M6YGxpc3RgCiAgICA6cnR5cGU6IGxpc3QKICAgICIiIgogICAgcmVzdWx0ID0gW10KICAgIGZvciBpdGVtIGluIF9wYXJzZV9saXN0X2hlYWRlcih2YWx1ZSk6CiAgICAgICAgaWYgaXRlbVs6MV0gPT0gaXRlbVstMTpdID09ICciJzoKICAgICAgICAgICAgaXRlbSA9IHVucXVvdGVfaGVhZGVyX3ZhbHVlKGl0ZW1bMTotMV0pCiAgICAgICAgcmVzdWx0LmFwcGVuZChpdGVtKQogICAgcmV0dXJuIHJlc3VsdAoKCiMgRnJvbSBtaXRzdWhpa28vd2Vya3pldWcgKHVzZWQgd2l0aCBwZXJtaXNzaW9uKS4KZGVmIHBhcnNlX2RpY3RfaGVhZGVyKHZhbHVlKToKICAgICIiIlBhcnNlIGxpc3RzIG9mIGtleSwgdmFsdWUgcGFpcnMgYXMgZGVzY3JpYmVkIGJ5IFJGQyAyMDY4IFNlY3Rpb24gMiBhbmQKICAgIGNvbnZlcnQgdGhlbSBpbnRvIGEgcHl0aG9uIGRpY3Q6CgogICAgPj4+IGQgPSBwYXJzZV9kaWN0X2hlYWRlcignZm9vPSJpcyBhIGZpc2giLCBiYXI9ImFzIHdlbGwiJykKICAgID4+PiB0eXBlKGQpIGlzIGRpY3QKICAgIFRydWUKICAgID4+PiBzb3J0ZWQoZC5pdGVtcygpKQogICAgWygnYmFyJywgJ2FzIHdlbGwnKSwgKCdmb28nLCAnaXMgYSBmaXNoJyldCgogICAgSWYgdGhlcmUgaXMgbm8gdmFsdWUgZm9yIGEga2V5IGl0IHdpbGwgYmUgYE5vbmVgOgoKICAgID4+PiBwYXJzZV9kaWN0X2hlYWRlcigna2V5X3dpdGhvdXRfdmFsdWUnKQogICAgeydrZXlfd2l0aG91dF92YWx1ZSc6IE5vbmV9CgogICAgVG8gY3JlYXRlIGEgaGVhZGVyIGZyb20gdGhlIDpjbGFzczpgZGljdGAgYWdhaW4sIHVzZSB0aGUKICAgIDpmdW5jOmBkdW1wX2hlYWRlcmAgZnVuY3Rpb24uCgogICAgOnBhcmFtIHZhbHVlOiBhIHN0cmluZyB3aXRoIGEgZGljdCBoZWFkZXIuCiAgICA6cmV0dXJuOiA6Y2xhc3M6YGRpY3RgCiAgICA6cnR5cGU6IGRpY3QKICAgICIiIgogICAgcmVzdWx0ID0ge30KICAgIGZvciBpdGVtIGluIF9wYXJzZV9saXN0X2hlYWRlcih2YWx1ZSk6CiAgICAgICAgaWYgJz0nIG5vdCBpbiBpdGVtOgogICAgICAgICAgICByZXN1bHRbaXRlbV0gPSBOb25lCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgbmFtZSwgdmFsdWUgPSBpdGVtLnNwbGl0KCc9JywgMSkKICAgICAgICBpZiB2YWx1ZVs6MV0gPT0gdmFsdWVbLTE6XSA9PSAnIic6CiAgICAgICAgICAgIHZhbHVlID0gdW5xdW90ZV9oZWFkZXJfdmFsdWUodmFsdWVbMTotMV0pCiAgICAgICAgcmVzdWx0W25hbWVdID0gdmFsdWUKICAgIHJldHVybiByZXN1bHQKCgojIEZyb20gbWl0c3VoaWtvL3dlcmt6ZXVnICh1c2VkIHdpdGggcGVybWlzc2lvbikuCmRlZiB1bnF1b3RlX2hlYWRlcl92YWx1ZSh2YWx1ZSwgaXNfZmlsZW5hbWU9RmFsc2UpOgogICAgciIiIlVucXVvdGVzIGEgaGVhZGVyIHZhbHVlLiAgKFJldmVyc2FsIG9mIDpmdW5jOmBxdW90ZV9oZWFkZXJfdmFsdWVgKS4KICAgIFRoaXMgZG9lcyBub3QgdXNlIHRoZSByZWFsIHVucXVvdGluZyBidXQgd2hhdCBicm93c2VycyBhcmUgYWN0dWFsbHkKICAgIHVzaW5nIGZvciBxdW90aW5nLgoKICAgIDpwYXJhbSB2YWx1ZTogdGhlIGhlYWRlciB2YWx1ZSB0byB1bnF1b3RlLgogICAgOnJ0eXBlOiBzdHIKICAgICIiIgogICAgaWYgdmFsdWUgYW5kIHZhbHVlWzBdID09IHZhbHVlWy0xXSA9PSAnIic6CiAgICAgICAgIyB0aGlzIGlzIG5vdCB0aGUgcmVhbCB1bnF1b3RpbmcsIGJ1dCBmaXhpbmcgdGhpcyBzbyB0aGF0IHRoZQogICAgICAgICMgUkZDIGlzIG1ldCB3aWxsIHJlc3VsdCBpbiBidWdzIHdpdGggaW50ZXJuZXQgZXhwbG9yZXIgYW5kCiAgICAgICAgIyBwcm9iYWJseSBzb21lIG90aGVyIGJyb3dzZXJzIGFzIHdlbGwuICBJRSBmb3IgZXhhbXBsZSBpcwogICAgICAgICMgdXBsb2FkaW5nIGZpbGVzIHdpdGggIkM6XGZvb1xiYXIudHh0IiBhcyBmaWxlbmFtZQogICAgICAgIHZhbHVlID0gdmFsdWVbMTotMV0KCiAgICAgICAgIyBpZiB0aGlzIGlzIGEgZmlsZW5hbWUgYW5kIHRoZSBzdGFydGluZyBjaGFyYWN0ZXJzIGxvb2sgbGlrZQogICAgICAgICMgYSBVTkMgcGF0aCwgdGhlbiBqdXN0IHJldHVybiB0aGUgdmFsdWUgd2l0aG91dCBxdW90ZXMuICBVc2luZyB0aGUKICAgICAgICAjIHJlcGxhY2Ugc2VxdWVuY2UgYmVsb3cgb24gYSBVTkMgcGF0aCBoYXMgdGhlIGVmZmVjdCBvZiB0dXJuaW5nCiAgICAgICAgIyB0aGUgbGVhZGluZyBkb3VibGUgc2xhc2ggaW50byBhIHNpbmdsZSBzbGFzaCBhbmQgdGhlbgogICAgICAgICMgX2ZpeF9pZV9maWxlbmFtZSgpIGRvZXNuJ3Qgd29yayBjb3JyZWN0bHkuICBTZWUgIzQ1OC4KICAgICAgICBpZiBub3QgaXNfZmlsZW5hbWUgb3IgdmFsdWVbOjJdICE9ICdcXFxcJzoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoJ1xcXFwnLCAnXFwnKS5yZXBsYWNlKCdcXCInLCAnIicpCiAgICByZXR1cm4gdmFsdWUKCgpkZWYgZGljdF9mcm9tX2Nvb2tpZWphcihjaik6CiAgICAiIiJSZXR1cm5zIGEga2V5L3ZhbHVlIGRpY3Rpb25hcnkgZnJvbSBhIENvb2tpZUphci4KCiAgICA6cGFyYW0gY2o6IENvb2tpZUphciBvYmplY3QgdG8gZXh0cmFjdCBjb29raWVzIGZyb20uCiAgICA6cnR5cGU6IGRpY3QKICAgICIiIgoKICAgIGNvb2tpZV9kaWN0ID0ge30KCiAgICBmb3IgY29va2llIGluIGNqOgogICAgICAgIGNvb2tpZV9kaWN0W2Nvb2tpZS5uYW1lXSA9IGNvb2tpZS52YWx1ZQoKICAgIHJldHVybiBjb29raWVfZGljdAoKCmRlZiBhZGRfZGljdF90b19jb29raWVqYXIoY2osIGNvb2tpZV9kaWN0KToKICAgICIiIlJldHVybnMgYSBDb29raWVKYXIgZnJvbSBhIGtleS92YWx1ZSBkaWN0aW9uYXJ5LgoKICAgIDpwYXJhbSBjajogQ29va2llSmFyIHRvIGluc2VydCBjb29raWVzIGludG8uCiAgICA6cGFyYW0gY29va2llX2RpY3Q6IERpY3Qgb2Yga2V5L3ZhbHVlcyB0byBpbnNlcnQgaW50byBDb29raWVKYXIuCiAgICA6cnR5cGU6IENvb2tpZUphcgogICAgIiIiCgogICAgcmV0dXJuIGNvb2tpZWphcl9mcm9tX2RpY3QoY29va2llX2RpY3QsIGNqKQoKCmRlZiBnZXRfZW5jb2RpbmdzX2Zyb21fY29udGVudChjb250ZW50KToKICAgICIiIlJldHVybnMgZW5jb2RpbmdzIGZyb20gZ2l2ZW4gY29udGVudCBzdHJpbmcuCgogICAgOnBhcmFtIGNvbnRlbnQ6IGJ5dGVzdHJpbmcgdG8gZXh0cmFjdCBlbmNvZGluZ3MgZnJvbS4KICAgICIiIgogICAgd2FybmluZ3Mud2FybigoCiAgICAgICAgJ0luIHJlcXVlc3RzIDMuMCwgZ2V0X2VuY29kaW5nc19mcm9tX2NvbnRlbnQgd2lsbCBiZSByZW1vdmVkLiBGb3IgJwogICAgICAgICdtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIHRoZSBkaXNjdXNzaW9uIG9uIGlzc3VlICMyMjY2LiAoVGhpcycKICAgICAgICAnIHdhcm5pbmcgc2hvdWxkIG9ubHkgYXBwZWFyIG9uY2UuKScpLAogICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKCiAgICBjaGFyc2V0X3JlID0gcmUuY29tcGlsZShyJzxtZXRhLio/Y2hhcnNldD1bIlwnXSooLis/KVsiXCc+XScsIGZsYWdzPXJlLkkpCiAgICBwcmFnbWFfcmUgPSByZS5jb21waWxlKHInPG1ldGEuKj9jb250ZW50PVsiXCddKjs/Y2hhcnNldD0oLis/KVsiXCc+XScsIGZsYWdzPXJlLkkpCiAgICB4bWxfcmUgPSByZS5jb21waWxlKHInXjxcP3htbC4qP2VuY29kaW5nPVsiXCddKiguKz8pWyJcJz5dJykKCiAgICByZXR1cm4gKGNoYXJzZXRfcmUuZmluZGFsbChjb250ZW50KSArCiAgICAgICAgICAgIHByYWdtYV9yZS5maW5kYWxsKGNvbnRlbnQpICsKICAgICAgICAgICAgeG1sX3JlLmZpbmRhbGwoY29udGVudCkpCgoKZGVmIGdldF9lbmNvZGluZ19mcm9tX2hlYWRlcnMoaGVhZGVycyk6CiAgICAiIiJSZXR1cm5zIGVuY29kaW5ncyBmcm9tIGdpdmVuIEhUVFAgSGVhZGVyIERpY3QuCgogICAgOnBhcmFtIGhlYWRlcnM6IGRpY3Rpb25hcnkgdG8gZXh0cmFjdCBlbmNvZGluZyBmcm9tLgogICAgOnJ0eXBlOiBzdHIKICAgICIiIgoKICAgIGNvbnRlbnRfdHlwZSA9IGhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKQoKICAgIGlmIG5vdCBjb250ZW50X3R5cGU6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBjb250ZW50X3R5cGUsIHBhcmFtcyA9IGNnaS5wYXJzZV9oZWFkZXIoY29udGVudF90eXBlKQoKICAgIGlmICdjaGFyc2V0JyBpbiBwYXJhbXM6CiAgICAgICAgcmV0dXJuIHBhcmFtc1snY2hhcnNldCddLnN0cmlwKCInXCIiKQoKICAgIGlmICd0ZXh0JyBpbiBjb250ZW50X3R5cGU6CiAgICAgICAgcmV0dXJuICdJU08tODg1OS0xJwoKCmRlZiBzdHJlYW1fZGVjb2RlX3Jlc3BvbnNlX3VuaWNvZGUoaXRlcmF0b3IsIHIpOgogICAgIiIiU3RyZWFtIGRlY29kZXMgYSBpdGVyYXRvci4iIiIKCiAgICBpZiByLmVuY29kaW5nIGlzIE5vbmU6CiAgICAgICAgZm9yIGl0ZW0gaW4gaXRlcmF0b3I6CiAgICAgICAgICAgIHlpZWxkIGl0ZW0KICAgICAgICByZXR1cm4KCiAgICBkZWNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZGVjb2RlcihyLmVuY29kaW5nKShlcnJvcnM9J3JlcGxhY2UnKQogICAgZm9yIGNodW5rIGluIGl0ZXJhdG9yOgogICAgICAgIHJ2ID0gZGVjb2Rlci5kZWNvZGUoY2h1bmspCiAgICAgICAgaWYgcnY6CiAgICAgICAgICAgIHlpZWxkIHJ2CiAgICBydiA9IGRlY29kZXIuZGVjb2RlKGInJywgZmluYWw9VHJ1ZSkKICAgIGlmIHJ2OgogICAgICAgIHlpZWxkIHJ2CgoKZGVmIGl0ZXJfc2xpY2VzKHN0cmluZywgc2xpY2VfbGVuZ3RoKToKICAgICIiIkl0ZXJhdGUgb3ZlciBzbGljZXMgb2YgYSBzdHJpbmcuIiIiCiAgICBwb3MgPSAwCiAgICBpZiBzbGljZV9sZW5ndGggaXMgTm9uZSBvciBzbGljZV9sZW5ndGggPD0gMDoKICAgICAgICBzbGljZV9sZW5ndGggPSBsZW4oc3RyaW5nKQogICAgd2hpbGUgcG9zIDwgbGVuKHN0cmluZyk6CiAgICAgICAgeWllbGQgc3RyaW5nW3Bvczpwb3MgKyBzbGljZV9sZW5ndGhdCiAgICAgICAgcG9zICs9IHNsaWNlX2xlbmd0aAoKCmRlZiBnZXRfdW5pY29kZV9mcm9tX3Jlc3BvbnNlKHIpOgogICAgIiIiUmV0dXJucyB0aGUgcmVxdWVzdGVkIGNvbnRlbnQgYmFjayBpbiB1bmljb2RlLgoKICAgIDpwYXJhbSByOiBSZXNwb25zZSBvYmplY3QgdG8gZ2V0IHVuaWNvZGUgY29udGVudCBmcm9tLgoKICAgIFRyaWVkOgoKICAgIDEuIGNoYXJzZXQgZnJvbSBjb250ZW50LXR5cGUKICAgIDIuIGZhbGwgYmFjayBhbmQgcmVwbGFjZSBhbGwgdW5pY29kZSBjaGFyYWN0ZXJzCgogICAgOnJ0eXBlOiBzdHIKICAgICIiIgogICAgd2FybmluZ3Mud2FybigoCiAgICAgICAgJ0luIHJlcXVlc3RzIDMuMCwgZ2V0X3VuaWNvZGVfZnJvbV9yZXNwb25zZSB3aWxsIGJlIHJlbW92ZWQuIEZvciAnCiAgICAgICAgJ21vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgdGhlIGRpc2N1c3Npb24gb24gaXNzdWUgIzIyNjYuIChUaGlzJwogICAgICAgICcgd2FybmluZyBzaG91bGQgb25seSBhcHBlYXIgb25jZS4pJyksCiAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQoKICAgIHRyaWVkX2VuY29kaW5ncyA9IFtdCgogICAgIyBUcnkgY2hhcnNldCBmcm9tIGNvbnRlbnQtdHlwZQogICAgZW5jb2RpbmcgPSBnZXRfZW5jb2RpbmdfZnJvbV9oZWFkZXJzKHIuaGVhZGVycykKCiAgICBpZiBlbmNvZGluZzoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdHIoci5jb250ZW50LCBlbmNvZGluZykKICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgICAgICB0cmllZF9lbmNvZGluZ3MuYXBwZW5kKGVuY29kaW5nKQoKICAgICMgRmFsbCBiYWNrOgogICAgdHJ5OgogICAgICAgIHJldHVybiBzdHIoci5jb250ZW50LCBlbmNvZGluZywgZXJyb3JzPSdyZXBsYWNlJykKICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgcmV0dXJuIHIuY29udGVudAoKCiMgVGhlIHVucmVzZXJ2ZWQgVVJJIGNoYXJhY3RlcnMgKFJGQyAzOTg2KQpVTlJFU0VSVkVEX1NFVCA9IGZyb3plbnNldCgKICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiArICIwMTIzNDU2Nzg5LS5ffiIpCgoKZGVmIHVucXVvdGVfdW5yZXNlcnZlZCh1cmkpOgogICAgIiIiVW4tZXNjYXBlIGFueSBwZXJjZW50LWVzY2FwZSBzZXF1ZW5jZXMgaW4gYSBVUkkgdGhhdCBhcmUgdW5yZXNlcnZlZAogICAgY2hhcmFjdGVycy4gVGhpcyBsZWF2ZXMgYWxsIHJlc2VydmVkLCBpbGxlZ2FsIGFuZCBub24tQVNDSUkgYnl0ZXMgZW5jb2RlZC4KCiAgICA6cnR5cGU6IHN0cgogICAgIiIiCiAgICBwYXJ0cyA9IHVyaS5zcGxpdCgnJScpCiAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4ocGFydHMpKToKICAgICAgICBoID0gcGFydHNbaV1bMDoyXQogICAgICAgIGlmIGxlbihoKSA9PSAyIGFuZCBoLmlzYWxudW0oKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgYyA9IGNocihpbnQoaCwgMTYpKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIEludmFsaWRVUkwoIkludmFsaWQgcGVyY2VudC1lc2NhcGUgc2VxdWVuY2U6ICclcyciICUgaCkKCiAgICAgICAgICAgIGlmIGMgaW4gVU5SRVNFUlZFRF9TRVQ6CiAgICAgICAgICAgICAgICBwYXJ0c1tpXSA9IGMgKyBwYXJ0c1tpXVsyOl0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhcnRzW2ldID0gJyUnICsgcGFydHNbaV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXJ0c1tpXSA9ICclJyArIHBhcnRzW2ldCiAgICByZXR1cm4gJycuam9pbihwYXJ0cykKCgpkZWYgcmVxdW90ZV91cmkodXJpKToKICAgICIiIlJlLXF1b3RlIHRoZSBnaXZlbiBVUkkuCgogICAgVGhpcyBmdW5jdGlvbiBwYXNzZXMgdGhlIGdpdmVuIFVSSSB0aHJvdWdoIGFuIHVucXVvdGUvcXVvdGUgY3ljbGUgdG8KICAgIGVuc3VyZSB0aGF0IGl0IGlzIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcXVvdGVkLgoKICAgIDpydHlwZTogc3RyCiAgICAiIiIKICAgIHNhZmVfd2l0aF9wZXJjZW50ID0gIiEjJCUmJygpKissLzo7PT9AW11+IgogICAgc2FmZV93aXRob3V0X3BlcmNlbnQgPSAiISMkJicoKSorLC86Oz0/QFtdfiIKICAgIHRyeToKICAgICAgICAjIFVucXVvdGUgb25seSB0aGUgdW5yZXNlcnZlZCBjaGFyYWN0ZXJzCiAgICAgICAgIyBUaGVuIHF1b3RlIG9ubHkgaWxsZWdhbCBjaGFyYWN0ZXJzIChkbyBub3QgcXVvdGUgcmVzZXJ2ZWQsCiAgICAgICAgIyB1bnJlc2VydmVkLCBvciAnJScpCiAgICAgICAgcmV0dXJuIHF1b3RlKHVucXVvdGVfdW5yZXNlcnZlZCh1cmkpLCBzYWZlPXNhZmVfd2l0aF9wZXJjZW50KQogICAgZXhjZXB0IEludmFsaWRVUkw6CiAgICAgICAgIyBXZSBjb3VsZG4ndCB1bnF1b3RlIHRoZSBnaXZlbiBVUkksIHNvIGxldCdzIHRyeSBxdW90aW5nIGl0LCBidXQKICAgICAgICAjIHRoZXJlIG1heSBiZSB1bnF1b3RlZCAnJSdzIGluIHRoZSBVUkkuIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZXkncmUKICAgICAgICAjIHByb3Blcmx5IHF1b3RlZCBzbyB0aGV5IGRvIG5vdCBjYXVzZSBpc3N1ZXMgZWxzZXdoZXJlLgogICAgICAgIHJldHVybiBxdW90ZSh1cmksIHNhZmU9c2FmZV93aXRob3V0X3BlcmNlbnQpCgoKZGVmIGFkZHJlc3NfaW5fbmV0d29yayhpcCwgbmV0KToKICAgICIiIlRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBjaGVjayBpZiBhbiBJUCBiZWxvbmdzIHRvIGEgbmV0d29yayBzdWJuZXQKCiAgICBFeGFtcGxlOiByZXR1cm5zIFRydWUgaWYgaXAgPSAxOTIuMTY4LjEuMSBhbmQgbmV0ID0gMTkyLjE2OC4xLjAvMjQKICAgICAgICAgICAgIHJldHVybnMgRmFsc2UgaWYgaXAgPSAxOTIuMTY4LjEuMSBhbmQgbmV0ID0gMTkyLjE2OC4xMDAuMC8yNAoKICAgIDpydHlwZTogYm9vbAogICAgIiIiCiAgICBpcGFkZHIgPSBzdHJ1Y3QudW5wYWNrKCc9TCcsIHNvY2tldC5pbmV0X2F0b24oaXApKVswXQogICAgbmV0YWRkciwgYml0cyA9IG5ldC5zcGxpdCgnLycpCiAgICBuZXRtYXNrID0gc3RydWN0LnVucGFjaygnPUwnLCBzb2NrZXQuaW5ldF9hdG9uKGRvdHRlZF9uZXRtYXNrKGludChiaXRzKSkpKVswXQogICAgbmV0d29yayA9IHN0cnVjdC51bnBhY2soJz1MJywgc29ja2V0LmluZXRfYXRvbihuZXRhZGRyKSlbMF0gJiBuZXRtYXNrCiAgICByZXR1cm4gKGlwYWRkciAmIG5ldG1hc2spID09IChuZXR3b3JrICYgbmV0bWFzaykKCgpkZWYgZG90dGVkX25ldG1hc2sobWFzayk6CiAgICAiIiJDb252ZXJ0cyBtYXNrIGZyb20gL3h4IGZvcm1hdCB0byB4eHgueHh4Lnh4eC54eHgKCiAgICBFeGFtcGxlOiBpZiBtYXNrIGlzIDI0IGZ1bmN0aW9uIHJldHVybnMgMjU1LjI1NS4yNTUuMAoKICAgIDpydHlwZTogc3RyCiAgICAiIiIKICAgIGJpdHMgPSAweGZmZmZmZmZmIF4gKDEgPDwgMzIgLSBtYXNrKSAtIDEKICAgIHJldHVybiBzb2NrZXQuaW5ldF9udG9hKHN0cnVjdC5wYWNrKCc+SScsIGJpdHMpKQoKCmRlZiBpc19pcHY0X2FkZHJlc3Moc3RyaW5nX2lwKToKICAgICIiIgogICAgOnJ0eXBlOiBib29sCiAgICAiIiIKICAgIHRyeToKICAgICAgICBzb2NrZXQuaW5ldF9hdG9uKHN0cmluZ19pcCkKICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gVHJ1ZQoKCmRlZiBpc192YWxpZF9jaWRyKHN0cmluZ19uZXR3b3JrKToKICAgICIiIgogICAgVmVyeSBzaW1wbGUgY2hlY2sgb2YgdGhlIGNpZHIgZm9ybWF0IGluIG5vX3Byb3h5IHZhcmlhYmxlLgoKICAgIDpydHlwZTogYm9vbAogICAgIiIiCiAgICBpZiBzdHJpbmdfbmV0d29yay5jb3VudCgnLycpID09IDE6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBtYXNrID0gaW50KHN0cmluZ19uZXR3b3JrLnNwbGl0KCcvJylbMV0pCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBpZiBtYXNrIDwgMSBvciBtYXNrID4gMzI6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNvY2tldC5pbmV0X2F0b24oc3RyaW5nX25ldHdvcmsuc3BsaXQoJy8nKVswXSkKICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gVHJ1ZQoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBzZXRfZW52aXJvbihlbnZfbmFtZSwgdmFsdWUpOgogICAgIiIiU2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAnZW52X25hbWUnIHRvICd2YWx1ZScKCiAgICBTYXZlIHByZXZpb3VzIHZhbHVlLCB5aWVsZCwgYW5kIHRoZW4gcmVzdG9yZSB0aGUgcHJldmlvdXMgdmFsdWUgc3RvcmVkIGluCiAgICB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJ2Vudl9uYW1lJy4KCiAgICBJZiAndmFsdWUnIGlzIE5vbmUsIGRvIG5vdGhpbmciIiIKICAgIHZhbHVlX2NoYW5nZWQgPSB2YWx1ZSBpcyBub3QgTm9uZQogICAgaWYgdmFsdWVfY2hhbmdlZDoKICAgICAgICBvbGRfdmFsdWUgPSBvcy5lbnZpcm9uLmdldChlbnZfbmFtZSkKICAgICAgICBvcy5lbnZpcm9uW2Vudl9uYW1lXSA9IHZhbHVlCiAgICB0cnk6CiAgICAgICAgeWllbGQKICAgIGZpbmFsbHk6CiAgICAgICAgaWYgdmFsdWVfY2hhbmdlZDoKICAgICAgICAgICAgaWYgb2xkX3ZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBkZWwgb3MuZW52aXJvbltlbnZfbmFtZV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG9zLmVudmlyb25bZW52X25hbWVdID0gb2xkX3ZhbHVlCgoKZGVmIHNob3VsZF9ieXBhc3NfcHJveGllcyh1cmwsIG5vX3Byb3h5KToKICAgICIiIgogICAgUmV0dXJucyB3aGV0aGVyIHdlIHNob3VsZCBieXBhc3MgcHJveGllcyBvciBub3QuCgogICAgOnJ0eXBlOiBib29sCiAgICAiIiIKICAgIGdldF9wcm94eSA9IGxhbWJkYSBrOiBvcy5lbnZpcm9uLmdldChrKSBvciBvcy5lbnZpcm9uLmdldChrLnVwcGVyKCkpCgogICAgIyBGaXJzdCBjaGVjayB3aGV0aGVyIG5vX3Byb3h5IGlzIGRlZmluZWQuIElmIGl0IGlzLCBjaGVjayB0aGF0IHRoZSBVUkwKICAgICMgd2UncmUgZ2V0dGluZyBpc24ndCBpbiB0aGUgbm9fcHJveHkgbGlzdC4KICAgIG5vX3Byb3h5X2FyZyA9IG5vX3Byb3h5CiAgICBpZiBub19wcm94eSBpcyBOb25lOgogICAgICAgIG5vX3Byb3h5ID0gZ2V0X3Byb3h5KCdub19wcm94eScpCiAgICBuZXRsb2MgPSB1cmxwYXJzZSh1cmwpLm5ldGxvYwoKICAgIGlmIG5vX3Byb3h5OgogICAgICAgICMgV2UgbmVlZCB0byBjaGVjayB3aGV0aGVyIHdlIG1hdGNoIGhlcmUuIFdlIG5lZWQgdG8gc2VlIGlmIHdlIG1hdGNoCiAgICAgICAgIyB0aGUgZW5kIG9mIHRoZSBuZXRsb2MsIGJvdGggd2l0aCBhbmQgd2l0aG91dCB0aGUgcG9ydC4KICAgICAgICBub19wcm94eSA9ICgKICAgICAgICAgICAgaG9zdCBmb3IgaG9zdCBpbiBub19wcm94eS5yZXBsYWNlKCcgJywgJycpLnNwbGl0KCcsJykgaWYgaG9zdAogICAgICAgICkKCiAgICAgICAgaXAgPSBuZXRsb2Muc3BsaXQoJzonKVswXQogICAgICAgIGlmIGlzX2lwdjRfYWRkcmVzcyhpcCk6CiAgICAgICAgICAgIGZvciBwcm94eV9pcCBpbiBub19wcm94eToKICAgICAgICAgICAgICAgIGlmIGlzX3ZhbGlkX2NpZHIocHJveHlfaXApOgogICAgICAgICAgICAgICAgICAgIGlmIGFkZHJlc3NfaW5fbmV0d29yayhpcCwgcHJveHlfaXApOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICAgICAgZWxpZiBpcCA9PSBwcm94eV9pcDoKICAgICAgICAgICAgICAgICAgICAjIElmIG5vX3Byb3h5IGlwIHdhcyBkZWZpbmVkIGluIHBsYWluIElQIG5vdGF0aW9uIGluc3RlYWQgb2YgY2lkciBub3RhdGlvbiAmCiAgICAgICAgICAgICAgICAgICAgIyBtYXRjaGVzIHRoZSBJUCBvZiB0aGUgaW5kZXgKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZvciBob3N0IGluIG5vX3Byb3h5OgogICAgICAgICAgICAgICAgaWYgbmV0bG9jLmVuZHN3aXRoKGhvc3QpIG9yIG5ldGxvYy5zcGxpdCgnOicpWzBdLmVuZHN3aXRoKGhvc3QpOgogICAgICAgICAgICAgICAgICAgICMgVGhlIFVSTCBkb2VzIG1hdGNoIHNvbWV0aGluZyBpbiBub19wcm94eSwgc28gd2UgZG9uJ3Qgd2FudAogICAgICAgICAgICAgICAgICAgICMgdG8gYXBwbHkgdGhlIHByb3hpZXMgb24gdGhpcyBVUkwuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAjIElmIHRoZSBzeXN0ZW0gcHJveHkgc2V0dGluZ3MgaW5kaWNhdGUgdGhhdCB0aGlzIFVSTCBzaG91bGQgYmUgYnlwYXNzZWQsCiAgICAjIGRvbid0IHByb3h5LgogICAgIyBUaGUgcHJveHlfYnlwYXNzIGZ1bmN0aW9uIGlzIGluY3JlZGlibHkgYnVnZ3kgb24gT1MgWCBpbiBlYXJseSB2ZXJzaW9ucwogICAgIyBvZiBQeXRob24gMi42LCBzbyBhbGxvdyB0aGlzIGNhbGwgdG8gZmFpbC4gT25seSBjYXRjaCB0aGUgc3BlY2lmaWMKICAgICMgZXhjZXB0aW9ucyB3ZSd2ZSBzZWVuLCB0aG91Z2g6IHRoaXMgY2FsbCBmYWlsaW5nIGluIG90aGVyIHdheXMgY2FuIHJldmVhbAogICAgIyBsZWdpdGltYXRlIHByb2JsZW1zLgogICAgd2l0aCBzZXRfZW52aXJvbignbm9fcHJveHknLCBub19wcm94eV9hcmcpOgogICAgICAgIHRyeToKICAgICAgICAgICAgYnlwYXNzID0gcHJveHlfYnlwYXNzKG5ldGxvYykKICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgc29ja2V0LmdhaWVycm9yKToKICAgICAgICAgICAgYnlwYXNzID0gRmFsc2UKCiAgICBpZiBieXBhc3M6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgZ2V0X2Vudmlyb25fcHJveGllcyh1cmwsIG5vX3Byb3h5PU5vbmUpOgogICAgIiIiCiAgICBSZXR1cm4gYSBkaWN0IG9mIGVudmlyb25tZW50IHByb3hpZXMuCgogICAgOnJ0eXBlOiBkaWN0CiAgICAiIiIKICAgIGlmIHNob3VsZF9ieXBhc3NfcHJveGllcyh1cmwsIG5vX3Byb3h5PW5vX3Byb3h5KToKICAgICAgICByZXR1cm4ge30KICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIGdldHByb3hpZXMoKQoKCmRlZiBzZWxlY3RfcHJveHkodXJsLCBwcm94aWVzKToKICAgICIiIlNlbGVjdCBhIHByb3h5IGZvciB0aGUgdXJsLCBpZiBhcHBsaWNhYmxlLgoKICAgIDpwYXJhbSB1cmw6IFRoZSB1cmwgYmVpbmcgZm9yIHRoZSByZXF1ZXN0CiAgICA6cGFyYW0gcHJveGllczogQSBkaWN0aW9uYXJ5IG9mIHNjaGVtZXMgb3Igc2NoZW1lcyBhbmQgaG9zdHMgdG8gcHJveHkgVVJMcwogICAgIiIiCiAgICBwcm94aWVzID0gcHJveGllcyBvciB7fQogICAgdXJscGFydHMgPSB1cmxwYXJzZSh1cmwpCiAgICBpZiB1cmxwYXJ0cy5ob3N0bmFtZSBpcyBOb25lOgogICAgICAgIHJldHVybiBwcm94aWVzLmdldCh1cmxwYXJ0cy5zY2hlbWUsIHByb3hpZXMuZ2V0KCdhbGwnKSkKCiAgICBwcm94eV9rZXlzID0gWwogICAgICAgIHVybHBhcnRzLnNjaGVtZSArICc6Ly8nICsgdXJscGFydHMuaG9zdG5hbWUsCiAgICAgICAgdXJscGFydHMuc2NoZW1lLAogICAgICAgICdhbGw6Ly8nICsgdXJscGFydHMuaG9zdG5hbWUsCiAgICAgICAgJ2FsbCcsCiAgICBdCiAgICBwcm94eSA9IE5vbmUKICAgIGZvciBwcm94eV9rZXkgaW4gcHJveHlfa2V5czoKICAgICAgICBpZiBwcm94eV9rZXkgaW4gcHJveGllczoKICAgICAgICAgICAgcHJveHkgPSBwcm94aWVzW3Byb3h5X2tleV0KICAgICAgICAgICAgYnJlYWsKCiAgICByZXR1cm4gcHJveHkKCgpkZWYgZGVmYXVsdF91c2VyX2FnZW50KG5hbWU9InB5dGhvbi1yZXF1ZXN0cyIpOgogICAgIiIiCiAgICBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IHVzZXIgYWdlbnQuCgogICAgOnJ0eXBlOiBzdHIKICAgICIiIgogICAgcmV0dXJuICclcy8lcycgJSAobmFtZSwgX192ZXJzaW9uX18pCgoKZGVmIGRlZmF1bHRfaGVhZGVycygpOgogICAgIiIiCiAgICA6cnR5cGU6IHJlcXVlc3RzLnN0cnVjdHVyZXMuQ2FzZUluc2Vuc2l0aXZlRGljdAogICAgIiIiCiAgICByZXR1cm4gQ2FzZUluc2Vuc2l0aXZlRGljdCh7CiAgICAgICAgJ1VzZXItQWdlbnQnOiBkZWZhdWx0X3VzZXJfYWdlbnQoKSwKICAgICAgICAnQWNjZXB0LUVuY29kaW5nJzogJywgJy5qb2luKCgnZ3ppcCcsICdkZWZsYXRlJykpLAogICAgICAgICdBY2NlcHQnOiAnKi8qJywKICAgICAgICAnQ29ubmVjdGlvbic6ICdrZWVwLWFsaXZlJywKICAgIH0pCgoKZGVmIHBhcnNlX2hlYWRlcl9saW5rcyh2YWx1ZSk6CiAgICAiIiJSZXR1cm4gYSBkaWN0IG9mIHBhcnNlZCBsaW5rIGhlYWRlcnMgcHJveGllcy4KCiAgICBpLmUuIExpbms6IDxodHRwOi8uLi4vZnJvbnQuanBlZz47IHJlbD1mcm9udDsgdHlwZT0iaW1hZ2UvanBlZyIsPGh0dHA6Ly8uLi4vYmFjay5qcGVnPjsgcmVsPWJhY2s7dHlwZT0iaW1hZ2UvanBlZyIKCiAgICA6cnR5cGU6IGxpc3QKICAgICIiIgoKICAgIGxpbmtzID0gW10KCiAgICByZXBsYWNlX2NoYXJzID0gJyBcJyInCgogICAgZm9yIHZhbCBpbiByZS5zcGxpdCgnLCAqPCcsIHZhbHVlKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHVybCwgcGFyYW1zID0gdmFsLnNwbGl0KCc7JywgMSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgdXJsLCBwYXJhbXMgPSB2YWwsICcnCgogICAgICAgIGxpbmsgPSB7J3VybCc6IHVybC5zdHJpcCgnPD4gXCciJyl9CgogICAgICAgIGZvciBwYXJhbSBpbiBwYXJhbXMuc3BsaXQoJzsnKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAga2V5LCB2YWx1ZSA9IHBhcmFtLnNwbGl0KCc9JykKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAgICAgbGlua1trZXkuc3RyaXAocmVwbGFjZV9jaGFycyldID0gdmFsdWUuc3RyaXAocmVwbGFjZV9jaGFycykKCiAgICAgICAgbGlua3MuYXBwZW5kKGxpbmspCgogICAgcmV0dXJuIGxpbmtzCgoKIyBOdWxsIGJ5dGVzOyBubyBuZWVkIHRvIHJlY3JlYXRlIHRoZXNlIG9uIGVhY2ggY2FsbCB0byBndWVzc19qc29uX3V0ZgpfbnVsbCA9ICdceDAwJy5lbmNvZGUoJ2FzY2lpJykgICMgZW5jb2RpbmcgdG8gQVNDSUkgZm9yIFB5dGhvbiAzCl9udWxsMiA9IF9udWxsICogMgpfbnVsbDMgPSBfbnVsbCAqIDMKCgpkZWYgZ3Vlc3NfanNvbl91dGYoZGF0YSk6CiAgICAiIiIKICAgIDpydHlwZTogc3RyCiAgICAiIiIKICAgICMgSlNPTiBhbHdheXMgc3RhcnRzIHdpdGggdHdvIEFTQ0lJIGNoYXJhY3RlcnMsIHNvIGRldGVjdGlvbiBpcyBhcwogICAgIyBlYXN5IGFzIGNvdW50aW5nIHRoZSBudWxscyBhbmQgZnJvbSB0aGVpciBsb2NhdGlvbiBhbmQgY291bnQKICAgICMgZGV0ZXJtaW5lIHRoZSBlbmNvZGluZy4gQWxzbyBkZXRlY3QgYSBCT00sIGlmIHByZXNlbnQuCiAgICBzYW1wbGUgPSBkYXRhWzo0XQogICAgaWYgc2FtcGxlIGluIChjb2RlY3MuQk9NX1VURjMyX0xFLCBjb2RlY3MuQk9NX1VURjMyX0JFKToKICAgICAgICByZXR1cm4gJ3V0Zi0zMicgICAgICMgQk9NIGluY2x1ZGVkCiAgICBpZiBzYW1wbGVbOjNdID09IGNvZGVjcy5CT01fVVRGODoKICAgICAgICByZXR1cm4gJ3V0Zi04LXNpZycgICMgQk9NIGluY2x1ZGVkLCBNUyBzdHlsZSAoZGlzY291cmFnZWQpCiAgICBpZiBzYW1wbGVbOjJdIGluIChjb2RlY3MuQk9NX1VURjE2X0xFLCBjb2RlY3MuQk9NX1VURjE2X0JFKToKICAgICAgICByZXR1cm4gJ3V0Zi0xNicgICAgICMgQk9NIGluY2x1ZGVkCiAgICBudWxsY291bnQgPSBzYW1wbGUuY291bnQoX251bGwpCiAgICBpZiBudWxsY291bnQgPT0gMDoKICAgICAgICByZXR1cm4gJ3V0Zi04JwogICAgaWYgbnVsbGNvdW50ID09IDI6CiAgICAgICAgaWYgc2FtcGxlWzo6Ml0gPT0gX251bGwyOiAgICMgMXN0IGFuZCAzcmQgYXJlIG51bGwKICAgICAgICAgICAgcmV0dXJuICd1dGYtMTYtYmUnCiAgICAgICAgaWYgc2FtcGxlWzE6OjJdID09IF9udWxsMjogICMgMm5kIGFuZCA0dGggYXJlIG51bGwKICAgICAgICAgICAgcmV0dXJuICd1dGYtMTYtbGUnCiAgICAgICAgIyBEaWQgbm90IGRldGVjdCAyIHZhbGlkIFVURi0xNiBhc2NpaS1yYW5nZSBjaGFyYWN0ZXJzCiAgICBpZiBudWxsY291bnQgPT0gMzoKICAgICAgICBpZiBzYW1wbGVbOjNdID09IF9udWxsMzoKICAgICAgICAgICAgcmV0dXJuICd1dGYtMzItYmUnCiAgICAgICAgaWYgc2FtcGxlWzE6XSA9PSBfbnVsbDM6CiAgICAgICAgICAgIHJldHVybiAndXRmLTMyLWxlJwogICAgICAgICMgRGlkIG5vdCBkZXRlY3QgYSB2YWxpZCBVVEYtMzIgYXNjaWktcmFuZ2UgY2hhcmFjdGVyCiAgICByZXR1cm4gTm9uZQoKCmRlZiBwcmVwZW5kX3NjaGVtZV9pZl9uZWVkZWQodXJsLCBuZXdfc2NoZW1lKToKICAgICIiIkdpdmVuIGEgVVJMIHRoYXQgbWF5IG9yIG1heSBub3QgaGF2ZSBhIHNjaGVtZSwgcHJlcGVuZCB0aGUgZ2l2ZW4gc2NoZW1lLgogICAgRG9lcyBub3QgcmVwbGFjZSBhIHByZXNlbnQgc2NoZW1lIHdpdGggdGhlIG9uZSBwcm92aWRlZCBhcyBhbiBhcmd1bWVudC4KCiAgICA6cnR5cGU6IHN0cgogICAgIiIiCiAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnQgPSB1cmxwYXJzZSh1cmwsIG5ld19zY2hlbWUpCgogICAgIyB1cmxwYXJzZSBpcyBhIGZpbmlja3kgYmVhc3QsIGFuZCBzb21ldGltZXMgZGVjaWRlcyB0aGF0IHRoZXJlIGlzbid0IGEKICAgICMgbmV0bG9jIHByZXNlbnQuIEFzc3VtZSB0aGF0IGl0J3MgYmVpbmcgb3Zlci1jYXV0aW91cywgYW5kIHN3aXRjaCBuZXRsb2MKICAgICMgYW5kIHBhdGggaWYgdXJscGFyc2UgZGVjaWRlZCB0aGVyZSB3YXMgbm8gbmV0bG9jLgogICAgaWYgbm90IG5ldGxvYzoKICAgICAgICBuZXRsb2MsIHBhdGggPSBwYXRoLCBuZXRsb2MKCiAgICByZXR1cm4gdXJsdW5wYXJzZSgoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50KSkKCgpkZWYgZ2V0X2F1dGhfZnJvbV91cmwodXJsKToKICAgICIiIkdpdmVuIGEgdXJsIHdpdGggYXV0aGVudGljYXRpb24gY29tcG9uZW50cywgZXh0cmFjdCB0aGVtIGludG8gYSB0dXBsZSBvZgogICAgdXNlcm5hbWUscGFzc3dvcmQuCgogICAgOnJ0eXBlOiAoc3RyLHN0cikKICAgICIiIgogICAgcGFyc2VkID0gdXJscGFyc2UodXJsKQoKICAgIHRyeToKICAgICAgICBhdXRoID0gKHVucXVvdGUocGFyc2VkLnVzZXJuYW1lKSwgdW5xdW90ZShwYXJzZWQucGFzc3dvcmQpKQogICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKToKICAgICAgICBhdXRoID0gKCcnLCAnJykKCiAgICByZXR1cm4gYXV0aAoKCiMgTW92ZWQgb3V0c2lkZSBvZiBmdW5jdGlvbiB0byBhdm9pZCByZWNvbXBpbGUgZXZlcnkgY2FsbApfQ0xFQU5fSEVBREVSX1JFR0VYX0JZVEUgPSByZS5jb21waWxlKGInXlxcU1teXFxyXFxuXSokfF4kJykKX0NMRUFOX0hFQURFUl9SRUdFWF9TVFIgPSByZS5jb21waWxlKHInXlxTW15cclxuXSokfF4kJykKCgpkZWYgY2hlY2tfaGVhZGVyX3ZhbGlkaXR5KGhlYWRlcik6CiAgICAiIiJWZXJpZmllcyB0aGF0IGhlYWRlciB2YWx1ZSBpcyBhIHN0cmluZyB3aGljaCBkb2Vzbid0IGNvbnRhaW4KICAgIGxlYWRpbmcgd2hpdGVzcGFjZSBvciByZXR1cm4gY2hhcmFjdGVycy4gVGhpcyBwcmV2ZW50cyB1bmludGVuZGVkCiAgICBoZWFkZXIgaW5qZWN0aW9uLgoKICAgIDpwYXJhbSBoZWFkZXI6IHR1cGxlLCBpbiB0aGUgZm9ybWF0IChuYW1lLCB2YWx1ZSkuCiAgICAiIiIKICAgIG5hbWUsIHZhbHVlID0gaGVhZGVyCgogICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYnl0ZXMpOgogICAgICAgIHBhdCA9IF9DTEVBTl9IRUFERVJfUkVHRVhfQllURQogICAgZWxzZToKICAgICAgICBwYXQgPSBfQ0xFQU5fSEVBREVSX1JFR0VYX1NUUgogICAgdHJ5OgogICAgICAgIGlmIG5vdCBwYXQubWF0Y2godmFsdWUpOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkSGVhZGVyKCJJbnZhbGlkIHJldHVybiBjaGFyYWN0ZXIgb3IgbGVhZGluZyBzcGFjZSBpbiBoZWFkZXI6ICVzIiAlIG5hbWUpCiAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgIHJhaXNlIEludmFsaWRIZWFkZXIoIlZhbHVlIGZvciBoZWFkZXIgeyVzOiAlc30gbXVzdCBiZSBvZiB0eXBlIHN0ciBvciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMsIG5vdCAlcyIgJSAobmFtZSwgdmFsdWUsIHR5cGUodmFsdWUpKSkKCgpkZWYgdXJsZGVmcmFnYXV0aCh1cmwpOgogICAgIiIiCiAgICBHaXZlbiBhIHVybCByZW1vdmUgdGhlIGZyYWdtZW50IGFuZCB0aGUgYXV0aGVudGljYXRpb24gcGFydC4KCiAgICA6cnR5cGU6IHN0cgogICAgIiIiCiAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnQgPSB1cmxwYXJzZSh1cmwpCgogICAgIyBzZWUgZnVuYzpgcHJlcGVuZF9zY2hlbWVfaWZfbmVlZGVkYAogICAgaWYgbm90IG5ldGxvYzoKICAgICAgICBuZXRsb2MsIHBhdGggPSBwYXRoLCBuZXRsb2MKCiAgICBuZXRsb2MgPSBuZXRsb2MucnNwbGl0KCdAJywgMSlbLTFdCgogICAgcmV0dXJuIHVybHVucGFyc2UoKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCAnJykpCgoKZGVmIHJld2luZF9ib2R5KHByZXBhcmVkX3JlcXVlc3QpOgogICAgIiIiTW92ZSBmaWxlIHBvaW50ZXIgYmFjayB0byBpdHMgcmVjb3JkZWQgc3RhcnRpbmcgcG9zaXRpb24KICAgIHNvIGl0IGNhbiBiZSByZWFkIGFnYWluIG9uIHJlZGlyZWN0LgogICAgIiIiCiAgICBib2R5X3NlZWsgPSBnZXRhdHRyKHByZXBhcmVkX3JlcXVlc3QuYm9keSwgJ3NlZWsnLCBOb25lKQogICAgaWYgYm9keV9zZWVrIGlzIG5vdCBOb25lIGFuZCBpc2luc3RhbmNlKHByZXBhcmVkX3JlcXVlc3QuX2JvZHlfcG9zaXRpb24sIGludGVnZXJfdHlwZXMpOgogICAgICAgIHRyeToKICAgICAgICAgICAgYm9keV9zZWVrKHByZXBhcmVkX3JlcXVlc3QuX2JvZHlfcG9zaXRpb24pCiAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBPU0Vycm9yKToKICAgICAgICAgICAgcmFpc2UgVW5yZXdpbmRhYmxlQm9keUVycm9yKCJBbiBlcnJvciBvY2N1cnJlZCB3aGVuIHJld2luZGluZyByZXF1ZXN0ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJib2R5IGZvciByZWRpcmVjdC4iKQogICAgZWxzZToKICAgICAgICByYWlzZSBVbnJld2luZGFibGVCb2R5RXJyb3IoIlVuYWJsZSB0byByZXdpbmQgcmVxdWVzdCBib2R5IGZvciByZWRpcmVjdC4iKQpQSwMEFAAAAAAAAAAhACF7vAr0JgAA9CYAACcAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmV0cnlpbmcucHkjIyBDb3B5cmlnaHQgMjAxMy0yMDE0IFJheSBIb2xkZXIKIyMKIyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiMjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMjCiMjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojIwojIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgojIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKaW1wb3J0IHJhbmRvbQpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBzaXgKaW1wb3J0IHN5cwppbXBvcnQgdGltZQppbXBvcnQgdHJhY2ViYWNrCgoKIyBzeXMubWF4aW50IC8gMiwgc2luY2UgUHl0aG9uIDMuMiBkb2Vzbid0IGhhdmUgYSBzeXMubWF4aW50Li4uCk1BWF9XQUlUID0gMTA3Mzc0MTgyMwoKCmRlZiByZXRyeSgqZGFyZ3MsICoqZGt3KToKICAgICIiIgogICAgRGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgaW5zdGFudGlhdGVzIHRoZSBSZXRyeWluZyBvYmplY3QKICAgIEBwYXJhbSAqZGFyZ3M6IHBvc2l0aW9uYWwgYXJndW1lbnRzIHBhc3NlZCB0byBSZXRyeWluZyBvYmplY3QKICAgIEBwYXJhbSAqKmRrdzoga2V5d29yZCBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBSZXRyeWluZyBvYmplY3QKICAgICIiIgogICAgIyBzdXBwb3J0IGJvdGggQHJldHJ5IGFuZCBAcmV0cnkoKSBhcyB2YWxpZCBzeW50YXgKICAgIGlmIGxlbihkYXJncykgPT0gMSBhbmQgY2FsbGFibGUoZGFyZ3NbMF0pOgogICAgICAgIGRlZiB3cmFwX3NpbXBsZShmKToKCiAgICAgICAgICAgIEBzaXgud3JhcHMoZikKICAgICAgICAgICAgZGVmIHdyYXBwZWRfZigqYXJncywgKiprdyk6CiAgICAgICAgICAgICAgICByZXR1cm4gUmV0cnlpbmcoKS5jYWxsKGYsICphcmdzLCAqKmt3KQoKICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRfZgoKICAgICAgICByZXR1cm4gd3JhcF9zaW1wbGUoZGFyZ3NbMF0pCgogICAgZWxzZToKICAgICAgICBkZWYgd3JhcChmKToKCiAgICAgICAgICAgIEBzaXgud3JhcHMoZikKICAgICAgICAgICAgZGVmIHdyYXBwZWRfZigqYXJncywgKiprdyk6CiAgICAgICAgICAgICAgICByZXR1cm4gUmV0cnlpbmcoKmRhcmdzLCAqKmRrdykuY2FsbChmLCAqYXJncywgKiprdykKCiAgICAgICAgICAgIHJldHVybiB3cmFwcGVkX2YKCiAgICAgICAgcmV0dXJuIHdyYXAKCgpjbGFzcyBSZXRyeWluZyhvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgIHN0b3A9Tm9uZSwgd2FpdD1Ob25lLAogICAgICAgICAgICAgICAgIHN0b3BfbWF4X2F0dGVtcHRfbnVtYmVyPU5vbmUsCiAgICAgICAgICAgICAgICAgc3RvcF9tYXhfZGVsYXk9Tm9uZSwKICAgICAgICAgICAgICAgICB3YWl0X2ZpeGVkPU5vbmUsCiAgICAgICAgICAgICAgICAgd2FpdF9yYW5kb21fbWluPU5vbmUsIHdhaXRfcmFuZG9tX21heD1Ob25lLAogICAgICAgICAgICAgICAgIHdhaXRfaW5jcmVtZW50aW5nX3N0YXJ0PU5vbmUsIHdhaXRfaW5jcmVtZW50aW5nX2luY3JlbWVudD1Ob25lLAogICAgICAgICAgICAgICAgIHdhaXRfZXhwb25lbnRpYWxfbXVsdGlwbGllcj1Ob25lLCB3YWl0X2V4cG9uZW50aWFsX21heD1Ob25lLAogICAgICAgICAgICAgICAgIHJldHJ5X29uX2V4Y2VwdGlvbj1Ob25lLAogICAgICAgICAgICAgICAgIHJldHJ5X29uX3Jlc3VsdD1Ob25lLAogICAgICAgICAgICAgICAgIHdyYXBfZXhjZXB0aW9uPUZhbHNlLAogICAgICAgICAgICAgICAgIHN0b3BfZnVuYz1Ob25lLAogICAgICAgICAgICAgICAgIHdhaXRfZnVuYz1Ob25lLAogICAgICAgICAgICAgICAgIHdhaXRfaml0dGVyX21heD1Ob25lKToKCiAgICAgICAgc2VsZi5fc3RvcF9tYXhfYXR0ZW1wdF9udW1iZXIgPSA1IGlmIHN0b3BfbWF4X2F0dGVtcHRfbnVtYmVyIGlzIE5vbmUgZWxzZSBzdG9wX21heF9hdHRlbXB0X251bWJlcgogICAgICAgIHNlbGYuX3N0b3BfbWF4X2RlbGF5ID0gMTAwIGlmIHN0b3BfbWF4X2RlbGF5IGlzIE5vbmUgZWxzZSBzdG9wX21heF9kZWxheQogICAgICAgIHNlbGYuX3dhaXRfZml4ZWQgPSAxMDAwIGlmIHdhaXRfZml4ZWQgaXMgTm9uZSBlbHNlIHdhaXRfZml4ZWQKICAgICAgICBzZWxmLl93YWl0X3JhbmRvbV9taW4gPSAwIGlmIHdhaXRfcmFuZG9tX21pbiBpcyBOb25lIGVsc2Ugd2FpdF9yYW5kb21fbWluCiAgICAgICAgc2VsZi5fd2FpdF9yYW5kb21fbWF4ID0gMTAwMCBpZiB3YWl0X3JhbmRvbV9tYXggaXMgTm9uZSBlbHNlIHdhaXRfcmFuZG9tX21heAogICAgICAgIHNlbGYuX3dhaXRfaW5jcmVtZW50aW5nX3N0YXJ0ID0gMCBpZiB3YWl0X2luY3JlbWVudGluZ19zdGFydCBpcyBOb25lIGVsc2Ugd2FpdF9pbmNyZW1lbnRpbmdfc3RhcnQKICAgICAgICBzZWxmLl93YWl0X2luY3JlbWVudGluZ19pbmNyZW1lbnQgPSAxMDAgaWYgd2FpdF9pbmNyZW1lbnRpbmdfaW5jcmVtZW50IGlzIE5vbmUgZWxzZSB3YWl0X2luY3JlbWVudGluZ19pbmNyZW1lbnQKICAgICAgICBzZWxmLl93YWl0X2V4cG9uZW50aWFsX211bHRpcGxpZXIgPSAxIGlmIHdhaXRfZXhwb25lbnRpYWxfbXVsdGlwbGllciBpcyBOb25lIGVsc2Ugd2FpdF9leHBvbmVudGlhbF9tdWx0aXBsaWVyCiAgICAgICAgc2VsZi5fd2FpdF9leHBvbmVudGlhbF9tYXggPSBNQVhfV0FJVCBpZiB3YWl0X2V4cG9uZW50aWFsX21heCBpcyBOb25lIGVsc2Ugd2FpdF9leHBvbmVudGlhbF9tYXgKICAgICAgICBzZWxmLl93YWl0X2ppdHRlcl9tYXggPSAwIGlmIHdhaXRfaml0dGVyX21heCBpcyBOb25lIGVsc2Ugd2FpdF9qaXR0ZXJfbWF4CgogICAgICAgICMgVE9ETyBhZGQgY2hhaW5pbmcgb2Ygc3RvcCBiZWhhdmlvcnMKICAgICAgICAjIHN0b3AgYmVoYXZpb3IKICAgICAgICBzdG9wX2Z1bmNzID0gW10KICAgICAgICBpZiBzdG9wX21heF9hdHRlbXB0X251bWJlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgc3RvcF9mdW5jcy5hcHBlbmQoc2VsZi5zdG9wX2FmdGVyX2F0dGVtcHQpCgogICAgICAgIGlmIHN0b3BfbWF4X2RlbGF5IGlzIG5vdCBOb25lOgogICAgICAgICAgICBzdG9wX2Z1bmNzLmFwcGVuZChzZWxmLnN0b3BfYWZ0ZXJfZGVsYXkpCgogICAgICAgIGlmIHN0b3BfZnVuYyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5zdG9wID0gc3RvcF9mdW5jCgogICAgICAgIGVsaWYgc3RvcCBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0b3AgPSBsYW1iZGEgYXR0ZW1wdHMsIGRlbGF5OiBhbnkoZihhdHRlbXB0cywgZGVsYXkpIGZvciBmIGluIHN0b3BfZnVuY3MpCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuc3RvcCA9IGdldGF0dHIoc2VsZiwgc3RvcCkKCiAgICAgICAgIyBUT0RPIGFkZCBjaGFpbmluZyBvZiB3YWl0IGJlaGF2aW9ycwogICAgICAgICMgd2FpdCBiZWhhdmlvcgogICAgICAgIHdhaXRfZnVuY3MgPSBbbGFtYmRhICphcmdzLCAqKmt3YXJnczogMF0KICAgICAgICBpZiB3YWl0X2ZpeGVkIGlzIG5vdCBOb25lOgogICAgICAgICAgICB3YWl0X2Z1bmNzLmFwcGVuZChzZWxmLmZpeGVkX3NsZWVwKQoKICAgICAgICBpZiB3YWl0X3JhbmRvbV9taW4gaXMgbm90IE5vbmUgb3Igd2FpdF9yYW5kb21fbWF4IGlzIG5vdCBOb25lOgogICAgICAgICAgICB3YWl0X2Z1bmNzLmFwcGVuZChzZWxmLnJhbmRvbV9zbGVlcCkKCiAgICAgICAgaWYgd2FpdF9pbmNyZW1lbnRpbmdfc3RhcnQgaXMgbm90IE5vbmUgb3Igd2FpdF9pbmNyZW1lbnRpbmdfaW5jcmVtZW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICB3YWl0X2Z1bmNzLmFwcGVuZChzZWxmLmluY3JlbWVudGluZ19zbGVlcCkKCiAgICAgICAgaWYgd2FpdF9leHBvbmVudGlhbF9tdWx0aXBsaWVyIGlzIG5vdCBOb25lIG9yIHdhaXRfZXhwb25lbnRpYWxfbWF4IGlzIG5vdCBOb25lOgogICAgICAgICAgICB3YWl0X2Z1bmNzLmFwcGVuZChzZWxmLmV4cG9uZW50aWFsX3NsZWVwKQoKICAgICAgICBpZiB3YWl0X2Z1bmMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYud2FpdCA9IHdhaXRfZnVuYwoKICAgICAgICBlbGlmIHdhaXQgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi53YWl0ID0gbGFtYmRhIGF0dGVtcHRzLCBkZWxheTogbWF4KGYoYXR0ZW1wdHMsIGRlbGF5KSBmb3IgZiBpbiB3YWl0X2Z1bmNzKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLndhaXQgPSBnZXRhdHRyKHNlbGYsIHdhaXQpCgogICAgICAgICMgcmV0cnkgb24gZXhjZXB0aW9uIGZpbHRlcgogICAgICAgIGlmIHJldHJ5X29uX2V4Y2VwdGlvbiBpcyBOb25lOgogICAgICAgICAgICBzZWxmLl9yZXRyeV9vbl9leGNlcHRpb24gPSBzZWxmLmFsd2F5c19yZWplY3QKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9yZXRyeV9vbl9leGNlcHRpb24gPSByZXRyeV9vbl9leGNlcHRpb24KCiAgICAgICAgIyBUT0RPIHNpbXBsaWZ5IHJldHJ5aW5nIGJ5IEV4Y2VwdGlvbiB0eXBlcwogICAgICAgICMgcmV0cnkgb24gcmVzdWx0IGZpbHRlcgogICAgICAgIGlmIHJldHJ5X29uX3Jlc3VsdCBpcyBOb25lOgogICAgICAgICAgICBzZWxmLl9yZXRyeV9vbl9yZXN1bHQgPSBzZWxmLm5ldmVyX3JlamVjdAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX3JldHJ5X29uX3Jlc3VsdCA9IHJldHJ5X29uX3Jlc3VsdAoKICAgICAgICBzZWxmLl93cmFwX2V4Y2VwdGlvbiA9IHdyYXBfZXhjZXB0aW9uCgogICAgZGVmIHN0b3BfYWZ0ZXJfYXR0ZW1wdChzZWxmLCBwcmV2aW91c19hdHRlbXB0X251bWJlciwgZGVsYXlfc2luY2VfZmlyc3RfYXR0ZW1wdF9tcyk6CiAgICAgICAgIiIiU3RvcCBhZnRlciB0aGUgcHJldmlvdXMgYXR0ZW1wdCA+PSBzdG9wX21heF9hdHRlbXB0X251bWJlci4iIiIKICAgICAgICByZXR1cm4gcHJldmlvdXNfYXR0ZW1wdF9udW1iZXIgPj0gc2VsZi5fc3RvcF9tYXhfYXR0ZW1wdF9udW1iZXIKCiAgICBkZWYgc3RvcF9hZnRlcl9kZWxheShzZWxmLCBwcmV2aW91c19hdHRlbXB0X251bWJlciwgZGVsYXlfc2luY2VfZmlyc3RfYXR0ZW1wdF9tcyk6CiAgICAgICAgIiIiU3RvcCBhZnRlciB0aGUgdGltZSBmcm9tIHRoZSBmaXJzdCBhdHRlbXB0ID49IHN0b3BfbWF4X2RlbGF5LiIiIgogICAgICAgIHJldHVybiBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zID49IHNlbGYuX3N0b3BfbWF4X2RlbGF5CgogICAgZGVmIG5vX3NsZWVwKHNlbGYsIHByZXZpb3VzX2F0dGVtcHRfbnVtYmVyLCBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zKToKICAgICAgICAiIiJEb24ndCBzbGVlcCBhdCBhbGwgYmVmb3JlIHJldHJ5aW5nLiIiIgogICAgICAgIHJldHVybiAwCgogICAgZGVmIGZpeGVkX3NsZWVwKHNlbGYsIHByZXZpb3VzX2F0dGVtcHRfbnVtYmVyLCBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zKToKICAgICAgICAiIiJTbGVlcCBhIGZpeGVkIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gZWFjaCByZXRyeS4iIiIKICAgICAgICByZXR1cm4gc2VsZi5fd2FpdF9maXhlZAoKICAgIGRlZiByYW5kb21fc2xlZXAoc2VsZiwgcHJldmlvdXNfYXR0ZW1wdF9udW1iZXIsIGRlbGF5X3NpbmNlX2ZpcnN0X2F0dGVtcHRfbXMpOgogICAgICAgICIiIlNsZWVwIGEgcmFuZG9tIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gd2FpdF9yYW5kb21fbWluIGFuZCB3YWl0X3JhbmRvbV9tYXgiIiIKICAgICAgICByZXR1cm4gcmFuZG9tLnJhbmRpbnQoc2VsZi5fd2FpdF9yYW5kb21fbWluLCBzZWxmLl93YWl0X3JhbmRvbV9tYXgpCgogICAgZGVmIGluY3JlbWVudGluZ19zbGVlcChzZWxmLCBwcmV2aW91c19hdHRlbXB0X251bWJlciwgZGVsYXlfc2luY2VfZmlyc3RfYXR0ZW1wdF9tcyk6CiAgICAgICAgIiIiCiAgICAgICAgU2xlZXAgYW4gaW5jcmVtZW50YWwgYW1vdW50IG9mIHRpbWUgYWZ0ZXIgZWFjaCBhdHRlbXB0LCBzdGFydGluZyBhdAogICAgICAgIHdhaXRfaW5jcmVtZW50aW5nX3N0YXJ0IGFuZCBpbmNyZW1lbnRpbmcgYnkgd2FpdF9pbmNyZW1lbnRpbmdfaW5jcmVtZW50CiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gc2VsZi5fd2FpdF9pbmNyZW1lbnRpbmdfc3RhcnQgKyAoc2VsZi5fd2FpdF9pbmNyZW1lbnRpbmdfaW5jcmVtZW50ICogKHByZXZpb3VzX2F0dGVtcHRfbnVtYmVyIC0gMSkpCiAgICAgICAgaWYgcmVzdWx0IDwgMDoKICAgICAgICAgICAgcmVzdWx0ID0gMAogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZXhwb25lbnRpYWxfc2xlZXAoc2VsZiwgcHJldmlvdXNfYXR0ZW1wdF9udW1iZXIsIGRlbGF5X3NpbmNlX2ZpcnN0X2F0dGVtcHRfbXMpOgogICAgICAgIGV4cCA9IDIgKiogcHJldmlvdXNfYXR0ZW1wdF9udW1iZXIKICAgICAgICByZXN1bHQgPSBzZWxmLl93YWl0X2V4cG9uZW50aWFsX211bHRpcGxpZXIgKiBleHAKICAgICAgICBpZiByZXN1bHQgPiBzZWxmLl93YWl0X2V4cG9uZW50aWFsX21heDoKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fd2FpdF9leHBvbmVudGlhbF9tYXgKICAgICAgICBpZiByZXN1bHQgPCAwOgogICAgICAgICAgICByZXN1bHQgPSAwCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBuZXZlcl9yZWplY3Qoc2VsZiwgcmVzdWx0KToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgYWx3YXlzX3JlamVjdChzZWxmLCByZXN1bHQpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNob3VsZF9yZWplY3Qoc2VsZiwgYXR0ZW1wdCk6CiAgICAgICAgcmVqZWN0ID0gRmFsc2UKICAgICAgICBpZiBhdHRlbXB0Lmhhc19leGNlcHRpb246CiAgICAgICAgICAgIHJlamVjdCB8PSBzZWxmLl9yZXRyeV9vbl9leGNlcHRpb24oYXR0ZW1wdC52YWx1ZVsxXSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZWplY3QgfD0gc2VsZi5fcmV0cnlfb25fcmVzdWx0KGF0dGVtcHQudmFsdWUpCgogICAgICAgIHJldHVybiByZWplY3QKCiAgICBkZWYgY2FsbChzZWxmLCBmbiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBzdGFydF90aW1lID0gaW50KHJvdW5kKHRpbWUudGltZSgpICogMTAwMCkpCiAgICAgICAgYXR0ZW1wdF9udW1iZXIgPSAxCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgYXR0ZW1wdCA9IEF0dGVtcHQoZm4oKmFyZ3MsICoqa3dhcmdzKSwgYXR0ZW1wdF9udW1iZXIsIEZhbHNlKQogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICB0YiA9IHN5cy5leGNfaW5mbygpCiAgICAgICAgICAgICAgICBhdHRlbXB0ID0gQXR0ZW1wdCh0YiwgYXR0ZW1wdF9udW1iZXIsIFRydWUpCgogICAgICAgICAgICBpZiBub3Qgc2VsZi5zaG91bGRfcmVqZWN0KGF0dGVtcHQpOgogICAgICAgICAgICAgICAgcmV0dXJuIGF0dGVtcHQuZ2V0KHNlbGYuX3dyYXBfZXhjZXB0aW9uKQoKICAgICAgICAgICAgZGVsYXlfc2luY2VfZmlyc3RfYXR0ZW1wdF9tcyA9IGludChyb3VuZCh0aW1lLnRpbWUoKSAqIDEwMDApKSAtIHN0YXJ0X3RpbWUKICAgICAgICAgICAgaWYgc2VsZi5zdG9wKGF0dGVtcHRfbnVtYmVyLCBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zKToKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl93cmFwX2V4Y2VwdGlvbiBhbmQgYXR0ZW1wdC5oYXNfZXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICMgZ2V0KCkgb24gYW4gYXR0ZW1wdCB3aXRoIGFuIGV4Y2VwdGlvbiBzaG91bGQgY2F1c2UgaXQgdG8gYmUgcmFpc2VkLCBidXQgcmFpc2UganVzdCBpbiBjYXNlCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgYXR0ZW1wdC5nZXQoKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBSZXRyeUVycm9yKGF0dGVtcHQpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzbGVlcCA9IHNlbGYud2FpdChhdHRlbXB0X251bWJlciwgZGVsYXlfc2luY2VfZmlyc3RfYXR0ZW1wdF9tcykKICAgICAgICAgICAgICAgIGlmIHNlbGYuX3dhaXRfaml0dGVyX21heDoKICAgICAgICAgICAgICAgICAgICBqaXR0ZXIgPSByYW5kb20ucmFuZG9tKCkgKiBzZWxmLl93YWl0X2ppdHRlcl9tYXgKICAgICAgICAgICAgICAgICAgICBzbGVlcCA9IHNsZWVwICsgbWF4KDAsIGppdHRlcikKICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoc2xlZXAgLyAxMDAwLjApCgogICAgICAgICAgICBhdHRlbXB0X251bWJlciArPSAxCgoKY2xhc3MgQXR0ZW1wdChvYmplY3QpOgogICAgIiIiCiAgICBBbiBBdHRlbXB0IGVuY2Fwc3VsYXRlcyBhIGNhbGwgdG8gYSB0YXJnZXQgZnVuY3Rpb24gdGhhdCBtYXkgZW5kIGFzIGEKICAgIG5vcm1hbCByZXR1cm4gdmFsdWUgZnJvbSB0aGUgZnVuY3Rpb24gb3IgYW4gRXhjZXB0aW9uIGRlcGVuZGluZyBvbiB3aGF0CiAgICBvY2N1cnJlZCBkdXJpbmcgdGhlIGV4ZWN1dGlvbi4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSwgYXR0ZW1wdF9udW1iZXIsIGhhc19leGNlcHRpb24pOgogICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQogICAgICAgIHNlbGYuYXR0ZW1wdF9udW1iZXIgPSBhdHRlbXB0X251bWJlcgogICAgICAgIHNlbGYuaGFzX2V4Y2VwdGlvbiA9IGhhc19leGNlcHRpb24KCiAgICBkZWYgZ2V0KHNlbGYsIHdyYXBfZXhjZXB0aW9uPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIEF0dGVtcHQgaW5zdGFuY2Ugb3IgcmFpc2UgYW4gRXhjZXB0aW9uLgogICAgICAgIElmIHdyYXBfZXhjZXB0aW9uIGlzIHRydWUsIHRoaXMgQXR0ZW1wdCBpcyB3cmFwcGVkIGluc2lkZSBvZiBhCiAgICAgICAgUmV0cnlFcnJvciBiZWZvcmUgYmVpbmcgcmFpc2VkLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuaGFzX2V4Y2VwdGlvbjoKICAgICAgICAgICAgaWYgd3JhcF9leGNlcHRpb246CiAgICAgICAgICAgICAgICByYWlzZSBSZXRyeUVycm9yKHNlbGYpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzaXgucmVyYWlzZShzZWxmLnZhbHVlWzBdLCBzZWxmLnZhbHVlWzFdLCBzZWxmLnZhbHVlWzJdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIGlmIHNlbGYuaGFzX2V4Y2VwdGlvbjoKICAgICAgICAgICAgcmV0dXJuICJBdHRlbXB0czogezB9LCBFcnJvcjpcbnsxfSIuZm9ybWF0KHNlbGYuYXR0ZW1wdF9udW1iZXIsICIiLmpvaW4odHJhY2ViYWNrLmZvcm1hdF90YihzZWxmLnZhbHVlWzJdKSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICJBdHRlbXB0czogezB9LCBWYWx1ZTogezF9Ii5mb3JtYXQoc2VsZi5hdHRlbXB0X251bWJlciwgc2VsZi52YWx1ZSkKCgpjbGFzcyBSZXRyeUVycm9yKEV4Y2VwdGlvbik6CiAgICAiIiIKICAgIEEgUmV0cnlFcnJvciBlbmNhcHN1bGF0ZXMgdGhlIGxhc3QgQXR0ZW1wdCBpbnN0YW5jZSByaWdodCBiZWZvcmUgZ2l2aW5nIHVwLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxhc3RfYXR0ZW1wdCk6CiAgICAgICAgc2VsZi5sYXN0X2F0dGVtcHQgPSBsYXN0X2F0dGVtcHQKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIlJldHJ5RXJyb3JbezB9XSIuZm9ybWF0KHNlbGYubGFzdF9hdHRlbXB0KQpQSwMEFAAAAAAAAAAhAJlYTVqSdQAAknUAACIAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivc2l4LnB5IiIiVXRpbGl0aWVzIGZvciB3cml0aW5nIGNvZGUgdGhhdCBydW5zIG9uIFB5dGhvbiAyIGFuZCAzIiIiCgojIENvcHlyaWdodCAoYykgMjAxMC0yMDE1IEJlbmphbWluIFBldGVyc29uCiMKIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiMgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKIyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCiMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAojIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwojIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiMKIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKIyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKIyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKIyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQojIFNPRlRXQVJFLgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IHN5cwppbXBvcnQgdHlwZXMKCl9fYXV0aG9yX18gPSAiQmVuamFtaW4gUGV0ZXJzb24gPGJlbmphbWluQHB5dGhvbi5vcmc+IgpfX3ZlcnNpb25fXyA9ICIxLjEwLjAiCgoKIyBVc2VmdWwgZm9yIHZlcnkgY29hcnNlIHZlcnNpb24gZGlmZmVyZW50aWF0aW9uLgpQWTIgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIKUFkzID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAzClBZMzQgPSBzeXMudmVyc2lvbl9pbmZvWzA6Ml0gPj0gKDMsIDQpCgppZiBQWTM6CiAgICBzdHJpbmdfdHlwZXMgPSBzdHIsCiAgICBpbnRlZ2VyX3R5cGVzID0gaW50LAogICAgY2xhc3NfdHlwZXMgPSB0eXBlLAogICAgdGV4dF90eXBlID0gc3RyCiAgICBiaW5hcnlfdHlwZSA9IGJ5dGVzCgogICAgTUFYU0laRSA9IHN5cy5tYXhzaXplCmVsc2U6CiAgICBzdHJpbmdfdHlwZXMgPSBiYXNlc3RyaW5nLAogICAgaW50ZWdlcl90eXBlcyA9IChpbnQsIGxvbmcpCiAgICBjbGFzc190eXBlcyA9ICh0eXBlLCB0eXBlcy5DbGFzc1R5cGUpCiAgICB0ZXh0X3R5cGUgPSB1bmljb2RlCiAgICBiaW5hcnlfdHlwZSA9IHN0cgoKICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJqYXZhIik6CiAgICAgICAgIyBKeXRob24gYWx3YXlzIHVzZXMgMzIgYml0cy4KICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDMxKSAtIDEpCiAgICBlbHNlOgogICAgICAgICMgSXQncyBwb3NzaWJsZSB0byBoYXZlIHNpemVvZihsb25nKSAhPSBzaXplb2YoUHlfc3NpemVfdCkuCiAgICAgICAgY2xhc3MgWChvYmplY3QpOgoKICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgICAgICAgICByZXR1cm4gMSA8PCAzMQogICAgICAgIHRyeToKICAgICAgICAgICAgbGVuKFgoKSkKICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKICAgICAgICAgICAgIyAzMi1iaXQKICAgICAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCAzMSkgLSAxKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgNjQtYml0CiAgICAgICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgNjMpIC0gMSkKICAgICAgICBkZWwgWAoKCmRlZiBfYWRkX2RvYyhmdW5jLCBkb2MpOgogICAgIiIiQWRkIGRvY3VtZW50YXRpb24gdG8gYSBmdW5jdGlvbi4iIiIKICAgIGZ1bmMuX19kb2NfXyA9IGRvYwoKCmRlZiBfaW1wb3J0X21vZHVsZShuYW1lKToKICAgICIiIkltcG9ydCBtb2R1bGUsIHJldHVybmluZyB0aGUgbW9kdWxlIGFmdGVyIHRoZSBsYXN0IGRvdC4iIiIKICAgIF9faW1wb3J0X18obmFtZSkKICAgIHJldHVybiBzeXMubW9kdWxlc1tuYW1lXQoKCmNsYXNzIF9MYXp5RGVzY3Iob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQoKICAgIGRlZiBfX2dldF9fKHNlbGYsIG9iaiwgdHApOgogICAgICAgIHJlc3VsdCA9IHNlbGYuX3Jlc29sdmUoKQogICAgICAgIHNldGF0dHIob2JqLCBzZWxmLm5hbWUsIHJlc3VsdCkgICMgSW52b2tlcyBfX3NldF9fLgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBUaGlzIGlzIGEgYml0IHVnbHksIGJ1dCBpdCBhdm9pZHMgcnVubmluZyB0aGlzIGFnYWluIGJ5CiAgICAgICAgICAgICMgcmVtb3ZpbmcgdGhpcyBkZXNjcmlwdG9yLgogICAgICAgICAgICBkZWxhdHRyKG9iai5fX2NsYXNzX18sIHNlbGYubmFtZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgTW92ZWRNb2R1bGUoX0xhenlEZXNjcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG9sZCwgbmV3PU5vbmUpOgogICAgICAgIHN1cGVyKE1vdmVkTW9kdWxlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIGlmIFBZMzoKICAgICAgICAgICAgaWYgbmV3IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBuZXcgPSBuYW1lCiAgICAgICAgICAgIHNlbGYubW9kID0gbmV3CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2QgPSBvbGQKCiAgICBkZWYgX3Jlc29sdmUoc2VsZik6CiAgICAgICAgcmV0dXJuIF9pbXBvcnRfbW9kdWxlKHNlbGYubW9kKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICBfbW9kdWxlID0gc2VsZi5fcmVzb2x2ZSgpCiAgICAgICAgdmFsdWUgPSBnZXRhdHRyKF9tb2R1bGUsIGF0dHIpCiAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWx1ZSkKICAgICAgICByZXR1cm4gdmFsdWUKCgpjbGFzcyBfTGF6eU1vZHVsZSh0eXBlcy5Nb2R1bGVUeXBlKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc3VwZXIoX0xhenlNb2R1bGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgc2VsZi5fX2RvY19fID0gc2VsZi5fX2NsYXNzX18uX19kb2NfXwoKICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgogICAgICAgIGF0dHJzID0gWyJfX2RvY19fIiwgIl9fbmFtZV9fIl0KICAgICAgICBhdHRycyArPSBbYXR0ci5uYW1lIGZvciBhdHRyIGluIHNlbGYuX21vdmVkX2F0dHJpYnV0ZXNdCiAgICAgICAgcmV0dXJuIGF0dHJzCgogICAgIyBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzCiAgICBfbW92ZWRfYXR0cmlidXRlcyA9IFtdCgoKY2xhc3MgTW92ZWRBdHRyaWJ1dGUoX0xhenlEZXNjcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG9sZF9tb2QsIG5ld19tb2QsIG9sZF9hdHRyPU5vbmUsIG5ld19hdHRyPU5vbmUpOgogICAgICAgIHN1cGVyKE1vdmVkQXR0cmlidXRlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIGlmIFBZMzoKICAgICAgICAgICAgaWYgbmV3X21vZCBpcyBOb25lOgogICAgICAgICAgICAgICAgbmV3X21vZCA9IG5hbWUKICAgICAgICAgICAgc2VsZi5tb2QgPSBuZXdfbW9kCiAgICAgICAgICAgIGlmIG5ld19hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpZiBvbGRfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIG5ld19hdHRyID0gbmFtZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuZXdfYXR0ciA9IG9sZF9hdHRyCiAgICAgICAgICAgIHNlbGYuYXR0ciA9IG5ld19hdHRyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2QgPSBvbGRfbW9kCiAgICAgICAgICAgIGlmIG9sZF9hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBvbGRfYXR0ciA9IG5hbWUKICAgICAgICAgICAgc2VsZi5hdHRyID0gb2xkX2F0dHIKCiAgICBkZWYgX3Jlc29sdmUoc2VsZik6CiAgICAgICAgbW9kdWxlID0gX2ltcG9ydF9tb2R1bGUoc2VsZi5tb2QpCiAgICAgICAgcmV0dXJuIGdldGF0dHIobW9kdWxlLCBzZWxmLmF0dHIpCgoKY2xhc3MgX1NpeE1ldGFQYXRoSW1wb3J0ZXIob2JqZWN0KToKCiAgICAiIiIKICAgIEEgbWV0YSBwYXRoIGltcG9ydGVyIHRvIGltcG9ydCBzaXgubW92ZXMgYW5kIGl0cyBzdWJtb2R1bGVzLgoKICAgIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIFBFUDMwMiBmaW5kZXIgYW5kIGxvYWRlci4gSXQgc2hvdWxkIGJlIGNvbXBhdGlibGUKICAgIHdpdGggUHl0aG9uIDIuNSBhbmQgYWxsIGV4aXN0aW5nIHZlcnNpb25zIG9mIFB5dGhvbjMKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXhfbW9kdWxlX25hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IHNpeF9tb2R1bGVfbmFtZQogICAgICAgIHNlbGYua25vd25fbW9kdWxlcyA9IHt9CgogICAgZGVmIF9hZGRfbW9kdWxlKHNlbGYsIG1vZCwgKmZ1bGxuYW1lcyk6CiAgICAgICAgZm9yIGZ1bGxuYW1lIGluIGZ1bGxuYW1lczoKICAgICAgICAgICAgc2VsZi5rbm93bl9tb2R1bGVzW3NlbGYubmFtZSArICIuIiArIGZ1bGxuYW1lXSA9IG1vZAoKICAgIGRlZiBfZ2V0X21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYua25vd25fbW9kdWxlc1tzZWxmLm5hbWUgKyAiLiIgKyBmdWxsbmFtZV0KCiAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CiAgICAgICAgaWYgZnVsbG5hbWUgaW4gc2VsZi5rbm93bl9tb2R1bGVzOgogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9fZ2V0X21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5rbm93bl9tb2R1bGVzW2Z1bGxuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIlRoaXMgbG9hZGVyIGRvZXMgbm90IGtub3cgbW9kdWxlICIgKyBmdWxsbmFtZSkKCiAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBpbiBjYXNlIG9mIGEgcmVsb2FkCiAgICAgICAgICAgIHJldHVybiBzeXMubW9kdWxlc1tmdWxsbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBtb2QgPSBzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSkKICAgICAgICBpZiBpc2luc3RhbmNlKG1vZCwgTW92ZWRNb2R1bGUpOgogICAgICAgICAgICBtb2QgPSBtb2QuX3Jlc29sdmUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1vZC5fX2xvYWRlcl9fID0gc2VsZgogICAgICAgIHN5cy5tb2R1bGVzW2Z1bGxuYW1lXSA9IG1vZAogICAgICAgIHJldHVybiBtb2QKCiAgICBkZWYgaXNfcGFja2FnZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRydWUsIGlmIHRoZSBuYW1lZCBtb2R1bGUgaXMgYSBwYWNrYWdlLgoKICAgICAgICBXZSBuZWVkIHRoaXMgbWV0aG9kIHRvIGdldCBjb3JyZWN0IHNwZWMgb2JqZWN0cyB3aXRoCiAgICAgICAgUHl0aG9uIDMuNCAoc2VlIFBFUDQ1MSkKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaGFzYXR0cihzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSksICJfX3BhdGhfXyIpCgogICAgZGVmIGdldF9jb2RlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICAiIiJSZXR1cm4gTm9uZQoKICAgICAgICBSZXF1aXJlZCwgaWYgaXNfcGFja2FnZSBpcyBpbXBsZW1lbnRlZCIiIgogICAgICAgIHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKSAgIyBldmVudHVhbGx5IHJhaXNlcyBJbXBvcnRFcnJvcgogICAgICAgIHJldHVybiBOb25lCiAgICBnZXRfc291cmNlID0gZ2V0X2NvZGUgICMgc2FtZSBhcyBnZXRfY29kZQoKX2ltcG9ydGVyID0gX1NpeE1ldGFQYXRoSW1wb3J0ZXIoX19uYW1lX18pCgoKY2xhc3MgX01vdmVkSXRlbXMoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIiIiCiAgICBfX3BhdGhfXyA9IFtdICAjIG1hcmsgYXMgcGFja2FnZQoKCl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoImNTdHJpbmdJTyIsICJjU3RyaW5nSU8iLCAiaW8iLCAiU3RyaW5nSU8iKSwKICAgIE1vdmVkQXR0cmlidXRlKCJmaWx0ZXIiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgImlmaWx0ZXIiLCAiZmlsdGVyIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZmlsdGVyZmFsc2UiLCAiaXRlcnRvb2xzIiwgIml0ZXJ0b29scyIsICJpZmlsdGVyZmFsc2UiLCAiZmlsdGVyZmFsc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnB1dCIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJyYXdfaW5wdXQiLCAiaW5wdXQiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnRlcm4iLCAiX19idWlsdGluX18iLCAic3lzIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgibWFwIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpbWFwIiwgIm1hcCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldGN3ZCIsICJvcyIsICJvcyIsICJnZXRjd2R1IiwgImdldGN3ZCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldGN3ZGIiLCAib3MiLCAib3MiLCAiZ2V0Y3dkIiwgImdldGN3ZGIiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyYW5nZSIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJ4cmFuZ2UiLCAicmFuZ2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyZWxvYWRfbW9kdWxlIiwgIl9fYnVpbHRpbl9fIiwgImltcG9ydGxpYiIgaWYgUFkzNCBlbHNlICJpbXAiLCAicmVsb2FkIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmVkdWNlIiwgIl9fYnVpbHRpbl9fIiwgImZ1bmN0b29scyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNobGV4X3F1b3RlIiwgInBpcGVzIiwgInNobGV4IiwgInF1b3RlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiU3RyaW5nSU8iLCAiU3RyaW5nSU8iLCAiaW8iKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyRGljdCIsICJVc2VyRGljdCIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJMaXN0IiwgIlVzZXJMaXN0IiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlclN0cmluZyIsICJVc2VyU3RyaW5nIiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgieHJhbmdlIiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInhyYW5nZSIsICJyYW5nZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInppcCIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaXppcCIsICJ6aXAiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ6aXBfbG9uZ2VzdCIsICJpdGVydG9vbHMiLCAiaXRlcnRvb2xzIiwgIml6aXBfbG9uZ2VzdCIsICJ6aXBfbG9uZ2VzdCIpLAogICAgTW92ZWRNb2R1bGUoImJ1aWx0aW5zIiwgIl9fYnVpbHRpbl9fIiksCiAgICBNb3ZlZE1vZHVsZSgiY29uZmlncGFyc2VyIiwgIkNvbmZpZ1BhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoImNvcHlyZWciLCAiY29weV9yZWciKSwKICAgIE1vdmVkTW9kdWxlKCJkYm1fZ251IiwgImdkYm0iLCAiZGJtLmdudSIpLAogICAgTW92ZWRNb2R1bGUoIl9kdW1teV90aHJlYWQiLCAiZHVtbXlfdGhyZWFkIiwgIl9kdW1teV90aHJlYWQiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2Nvb2tpZWphciIsICJjb29raWVsaWIiLCAiaHR0cC5jb29raWVqYXIiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2Nvb2tpZXMiLCAiQ29va2llIiwgImh0dHAuY29va2llcyIpLAogICAgTW92ZWRNb2R1bGUoImh0bWxfZW50aXRpZXMiLCAiaHRtbGVudGl0eWRlZnMiLCAiaHRtbC5lbnRpdGllcyIpLAogICAgTW92ZWRNb2R1bGUoImh0bWxfcGFyc2VyIiwgIkhUTUxQYXJzZXIiLCAiaHRtbC5wYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2NsaWVudCIsICJodHRwbGliIiwgImh0dHAuY2xpZW50IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9tdWx0aXBhcnQiLCAiZW1haWwuTUlNRU11bHRpcGFydCIsICJlbWFpbC5taW1lLm11bHRpcGFydCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfbm9ubXVsdGlwYXJ0IiwgImVtYWlsLk1JTUVOb25NdWx0aXBhcnQiLCAiZW1haWwubWltZS5ub25tdWx0aXBhcnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX3RleHQiLCAiZW1haWwuTUlNRVRleHQiLCAiZW1haWwubWltZS50ZXh0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9iYXNlIiwgImVtYWlsLk1JTUVCYXNlIiwgImVtYWlsLm1pbWUuYmFzZSIpLAogICAgTW92ZWRNb2R1bGUoIkJhc2VIVFRQU2VydmVyIiwgIkJhc2VIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiQ0dJSFRUUFNlcnZlciIsICJDR0lIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiU2ltcGxlSFRUUFNlcnZlciIsICJTaW1wbGVIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiY1BpY2tsZSIsICJjUGlja2xlIiwgInBpY2tsZSIpLAogICAgTW92ZWRNb2R1bGUoInF1ZXVlIiwgIlF1ZXVlIiksCiAgICBNb3ZlZE1vZHVsZSgicmVwcmxpYiIsICJyZXByIiksCiAgICBNb3ZlZE1vZHVsZSgic29ja2V0c2VydmVyIiwgIlNvY2tldFNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIl90aHJlYWQiLCAidGhyZWFkIiwgIl90aHJlYWQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyIiwgIlRraW50ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2RpYWxvZyIsICJEaWFsb2ciLCAidGtpbnRlci5kaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2ZpbGVkaWFsb2ciLCAiRmlsZURpYWxvZyIsICJ0a2ludGVyLmZpbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3Njcm9sbGVkdGV4dCIsICJTY3JvbGxlZFRleHQiLCAidGtpbnRlci5zY3JvbGxlZHRleHQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3NpbXBsZWRpYWxvZyIsICJTaW1wbGVEaWFsb2ciLCAidGtpbnRlci5zaW1wbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3RpeCIsICJUaXgiLCAidGtpbnRlci50aXgiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3R0ayIsICJ0dGsiLCAidGtpbnRlci50dGsiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbnN0YW50cyIsICJUa2NvbnN0YW50cyIsICJ0a2ludGVyLmNvbnN0YW50cyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZG5kIiwgIlRrZG5kIiwgInRraW50ZXIuZG5kIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb2xvcmNob29zZXIiLCAidGtDb2xvckNob29zZXIiLAogICAgICAgICAgICAgICAgInRraW50ZXIuY29sb3JjaG9vc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb21tb25kaWFsb2ciLCAidGtDb21tb25EaWFsb2ciLAogICAgICAgICAgICAgICAgInRraW50ZXIuY29tbW9uZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90a2ZpbGVkaWFsb2ciLCAidGtGaWxlRGlhbG9nIiwgInRraW50ZXIuZmlsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZm9udCIsICJ0a0ZvbnQiLCAidGtpbnRlci5mb250IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9tZXNzYWdlYm94IiwgInRrTWVzc2FnZUJveCIsICJ0a2ludGVyLm1lc3NhZ2Vib3giKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3Rrc2ltcGxlZGlhbG9nIiwgInRrU2ltcGxlRGlhbG9nIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLnNpbXBsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9wYXJzZSIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfcGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX2Vycm9yIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9lcnJvciIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWIiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9yb2JvdHBhcnNlciIsICJyb2JvdHBhcnNlciIsICJ1cmxsaWIucm9ib3RwYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ4bWxycGNfY2xpZW50IiwgInhtbHJwY2xpYiIsICJ4bWxycGMuY2xpZW50IiksCiAgICBNb3ZlZE1vZHVsZSgieG1scnBjX3NlcnZlciIsICJTaW1wbGVYTUxSUENTZXJ2ZXIiLCAieG1scnBjLnNlcnZlciIpLApdCiMgQWRkIHdpbmRvd3Mgc3BlY2lmaWMgbW9kdWxlcy4KaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CiAgICBfbW92ZWRfYXR0cmlidXRlcyArPSBbCiAgICAgICAgTW92ZWRNb2R1bGUoIndpbnJlZyIsICJfd2lucmVnIiksCiAgICBdCgpmb3IgYXR0ciBpbiBfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoX01vdmVkSXRlbXMsIGF0dHIubmFtZSwgYXR0cikKICAgIGlmIGlzaW5zdGFuY2UoYXR0ciwgTW92ZWRNb2R1bGUpOgogICAgICAgIF9pbXBvcnRlci5fYWRkX21vZHVsZShhdHRyLCAibW92ZXMuIiArIGF0dHIubmFtZSkKZGVsIGF0dHIKCl9Nb3ZlZEl0ZW1zLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX21vdmVkX2F0dHJpYnV0ZXMKCm1vdmVzID0gX01vdmVkSXRlbXMoX19uYW1lX18gKyAiLm1vdmVzIikKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKG1vdmVzLCAibW92ZXMiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3BhcnNlIiIiCgoKX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlBhcnNlUmVzdWx0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlNwbGl0UmVzdWx0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhcnNlX3FzIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhcnNlX3FzbCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxkZWZyYWciLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsam9pbiIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxwYXJzZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxzcGxpdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmx1bnBhcnNlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHVuc3BsaXQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicXVvdGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInF1b3RlX3BsdXMiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVucXVvdGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVucXVvdGVfcGx1cyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsZW5jb2RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHF1ZXJ5IiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHRhZyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXR1c2VyIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX2ZyYWdtZW50IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfbmV0bG9jIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcGFyYW1zIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcXVlcnkiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19yZWxhdGl2ZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZS5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfcGFyc2UiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcGFyc2UiLCAibW92ZXMudXJsbGliLnBhcnNlIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvcihfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9lcnJvciIiIgoKCl91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJVUkxFcnJvciIsICJ1cmxsaWIyIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBFcnJvciIsICJ1cmxsaWIyIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkNvbnRlbnRUb29TaG9ydEVycm9yIiwgInVybGxpYiIsICJ1cmxsaWIuZXJyb3IiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvci5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIuZXJyb3IiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfZXJyb3IiLCAibW92ZXMudXJsbGliLmVycm9yIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0KF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3JlcXVlc3QiIiIKCgpfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxvcGVuIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnN0YWxsX29wZW5lciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYnVpbGRfb3BlbmVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXRobmFtZTJ1cmwiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsMnBhdGhuYW1lIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldHByb3hpZXMiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUmVxdWVzdCIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiT3BlbmVyRGlyZWN0b3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBEZWZhdWx0RXJyb3JIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUmVkaXJlY3RIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQQ29va2llUHJvY2Vzc29yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkJhc2VIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUGFzc3dvcmRNZ3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBQYXNzd29yZE1ncldpdGhEZWZhdWx0UmVhbG0iLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkFic3RyYWN0QmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5QmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQWJzdHJhY3REaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUERpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eURpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFNIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGaWxlSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRlRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQ2FjaGVGVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVbmtub3duSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEVycm9yUHJvY2Vzc29yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxyZXRyaWV2ZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxjbGVhbnVwIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVSTG9wZW5lciIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGYW5jeVVSTG9wZW5lciIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwcm94eV9ieXBhc3MiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yZXF1ZXN0IiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3JlcXVlc3QiLCAibW92ZXMudXJsbGliLnJlcXVlc3QiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3Jlc3BvbnNlIiIiCgoKX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGJhc2UiLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGNsb3NlaG9vayIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkaW5mbyIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkaW5mb3VybCIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZSwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZShfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJlc3BvbnNlIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3Jlc3BvbnNlIiwgIm1vdmVzLnVybGxpYi5yZXNwb25zZSIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiIiIKCgpfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUm9ib3RGaWxlUGFyc2VyIiwgInJvYm90cGFyc2VyIiwgInVybGxpYi5yb2JvdHBhcnNlciIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yb2JvdHBhcnNlciIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIsICJtb3Zlcy51cmxsaWIucm9ib3RwYXJzZXIiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliKHR5cGVzLk1vZHVsZVR5cGUpOgoKICAgICIiIkNyZWF0ZSBhIHNpeC5tb3Zlcy51cmxsaWIgbmFtZXNwYWNlIHRoYXQgcmVzZW1ibGVzIHRoZSBQeXRob24gMyBuYW1lc3BhY2UiIiIKICAgIF9fcGF0aF9fID0gW10gICMgbWFyayBhcyBwYWNrYWdlCiAgICBwYXJzZSA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3BhcnNlIikKICAgIGVycm9yID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfZXJyb3IiKQogICAgcmVxdWVzdCA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3JlcXVlc3QiKQogICAgcmVzcG9uc2UgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yZXNwb25zZSIpCiAgICByb2JvdHBhcnNlciA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3JvYm90cGFyc2VyIikKCiAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gWydwYXJzZScsICdlcnJvcicsICdyZXF1ZXN0JywgJ3Jlc3BvbnNlJywgJ3JvYm90cGFyc2VyJ10KCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYihfX25hbWVfXyArICIubW92ZXMudXJsbGliIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliIikKCgpkZWYgYWRkX21vdmUobW92ZSk6CiAgICAiIiJBZGQgYW4gaXRlbSB0byBzaXgubW92ZXMuIiIiCiAgICBzZXRhdHRyKF9Nb3ZlZEl0ZW1zLCBtb3ZlLm5hbWUsIG1vdmUpCgoKZGVmIHJlbW92ZV9tb3ZlKG5hbWUpOgogICAgIiIiUmVtb3ZlIGl0ZW0gZnJvbSBzaXgubW92ZXMuIiIiCiAgICB0cnk6CiAgICAgICAgZGVsYXR0cihfTW92ZWRJdGVtcywgbmFtZSkKICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlbCBtb3Zlcy5fX2RpY3RfX1tuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoIm5vIHN1Y2ggbW92ZSwgJXIiICUgKG5hbWUsKSkKCgppZiBQWTM6CiAgICBfbWV0aF9mdW5jID0gIl9fZnVuY19fIgogICAgX21ldGhfc2VsZiA9ICJfX3NlbGZfXyIKCiAgICBfZnVuY19jbG9zdXJlID0gIl9fY2xvc3VyZV9fIgogICAgX2Z1bmNfY29kZSA9ICJfX2NvZGVfXyIKICAgIF9mdW5jX2RlZmF1bHRzID0gIl9fZGVmYXVsdHNfXyIKICAgIF9mdW5jX2dsb2JhbHMgPSAiX19nbG9iYWxzX18iCmVsc2U6CiAgICBfbWV0aF9mdW5jID0gImltX2Z1bmMiCiAgICBfbWV0aF9zZWxmID0gImltX3NlbGYiCgogICAgX2Z1bmNfY2xvc3VyZSA9ICJmdW5jX2Nsb3N1cmUiCiAgICBfZnVuY19jb2RlID0gImZ1bmNfY29kZSIKICAgIF9mdW5jX2RlZmF1bHRzID0gImZ1bmNfZGVmYXVsdHMiCiAgICBfZnVuY19nbG9iYWxzID0gImZ1bmNfZ2xvYmFscyIKCgp0cnk6CiAgICBhZHZhbmNlX2l0ZXJhdG9yID0gbmV4dApleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIGFkdmFuY2VfaXRlcmF0b3IoaXQpOgogICAgICAgIHJldHVybiBpdC5uZXh0KCkKbmV4dCA9IGFkdmFuY2VfaXRlcmF0b3IKCgp0cnk6CiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgY2FsbGFibGUob2JqKToKICAgICAgICByZXR1cm4gYW55KCJfX2NhbGxfXyIgaW4ga2xhc3MuX19kaWN0X18gZm9yIGtsYXNzIGluIHR5cGUob2JqKS5fX21yb19fKQoKCmlmIFBZMzoKICAgIGRlZiBnZXRfdW5ib3VuZF9mdW5jdGlvbih1bmJvdW5kKToKICAgICAgICByZXR1cm4gdW5ib3VuZAoKICAgIGNyZWF0ZV9ib3VuZF9tZXRob2QgPSB0eXBlcy5NZXRob2RUeXBlCgogICAgZGVmIGNyZWF0ZV91bmJvdW5kX21ldGhvZChmdW5jLCBjbHMpOgogICAgICAgIHJldHVybiBmdW5jCgogICAgSXRlcmF0b3IgPSBvYmplY3QKZWxzZToKICAgIGRlZiBnZXRfdW5ib3VuZF9mdW5jdGlvbih1bmJvdW5kKToKICAgICAgICByZXR1cm4gdW5ib3VuZC5pbV9mdW5jCgogICAgZGVmIGNyZWF0ZV9ib3VuZF9tZXRob2QoZnVuYywgb2JqKToKICAgICAgICByZXR1cm4gdHlwZXMuTWV0aG9kVHlwZShmdW5jLCBvYmosIG9iai5fX2NsYXNzX18pCgogICAgZGVmIGNyZWF0ZV91bmJvdW5kX21ldGhvZChmdW5jLCBjbHMpOgogICAgICAgIHJldHVybiB0eXBlcy5NZXRob2RUeXBlKGZ1bmMsIE5vbmUsIGNscykKCiAgICBjbGFzcyBJdGVyYXRvcihvYmplY3QpOgoKICAgICAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikuX19uZXh0X18oc2VsZikKCiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCl9hZGRfZG9jKGdldF91bmJvdW5kX2Z1bmN0aW9uLAogICAgICAgICAiIiJHZXQgdGhlIGZ1bmN0aW9uIG91dCBvZiBhIHBvc3NpYmx5IHVuYm91bmQgZnVuY3Rpb24iIiIpCgoKZ2V0X21ldGhvZF9mdW5jdGlvbiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX21ldGhfZnVuYykKZ2V0X21ldGhvZF9zZWxmID0gb3BlcmF0b3IuYXR0cmdldHRlcihfbWV0aF9zZWxmKQpnZXRfZnVuY3Rpb25fY2xvc3VyZSA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfY2xvc3VyZSkKZ2V0X2Z1bmN0aW9uX2NvZGUgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2NvZGUpCmdldF9mdW5jdGlvbl9kZWZhdWx0cyA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfZGVmYXVsdHMpCmdldF9mdW5jdGlvbl9nbG9iYWxzID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19nbG9iYWxzKQoKCmlmIFBZMzoKICAgIGRlZiBpdGVya2V5cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLmtleXMoKiprdykpCgogICAgZGVmIGl0ZXJ2YWx1ZXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC52YWx1ZXMoKiprdykpCgogICAgZGVmIGl0ZXJpdGVtcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLml0ZW1zKCoqa3cpKQoKICAgIGRlZiBpdGVybGlzdHMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5saXN0cygqKmt3KSkKCiAgICB2aWV3a2V5cyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigia2V5cyIpCgogICAgdmlld3ZhbHVlcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmFsdWVzIikKCiAgICB2aWV3aXRlbXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoIml0ZW1zIikKZWxzZToKICAgIGRlZiBpdGVya2V5cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVya2V5cygqKmt3KQoKICAgIGRlZiBpdGVydmFsdWVzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJ2YWx1ZXMoKiprdykKCiAgICBkZWYgaXRlcml0ZW1zKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJpdGVtcygqKmt3KQoKICAgIGRlZiBpdGVybGlzdHMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcmxpc3RzKCoqa3cpCgogICAgdmlld2tleXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXdrZXlzIikKCiAgICB2aWV3dmFsdWVzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3dmFsdWVzIikKCiAgICB2aWV3aXRlbXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXdpdGVtcyIpCgpfYWRkX2RvYyhpdGVya2V5cywgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVydmFsdWVzLCAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcml0ZW1zLAogICAgICAgICAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIHZhbHVlKSBwYWlycyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcmxpc3RzLAogICAgICAgICAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIFt2YWx1ZXNdKSBwYWlycyBvZiBhIGRpY3Rpb25hcnkuIikKCgppZiBQWTM6CiAgICBkZWYgYihzKToKICAgICAgICByZXR1cm4gcy5lbmNvZGUoImxhdGluLTEiKQoKICAgIGRlZiB1KHMpOgogICAgICAgIHJldHVybiBzCiAgICB1bmljaHIgPSBjaHIKICAgIGltcG9ydCBzdHJ1Y3QKICAgIGludDJieXRlID0gc3RydWN0LlN0cnVjdCgiPkIiKS5wYWNrCiAgICBkZWwgc3RydWN0CiAgICBieXRlMmludCA9IG9wZXJhdG9yLml0ZW1nZXR0ZXIoMCkKICAgIGluZGV4Ynl0ZXMgPSBvcGVyYXRvci5nZXRpdGVtCiAgICBpdGVyYnl0ZXMgPSBpdGVyCiAgICBpbXBvcnQgaW8KICAgIFN0cmluZ0lPID0gaW8uU3RyaW5nSU8KICAgIEJ5dGVzSU8gPSBpby5CeXRlc0lPCiAgICBfYXNzZXJ0Q291bnRFcXVhbCA9ICJhc3NlcnRDb3VudEVxdWFsIgogICAgaWYgc3lzLnZlcnNpb25faW5mb1sxXSA8PSAxOgogICAgICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleHAiCiAgICAgICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4cE1hdGNoZXMiCiAgICBlbHNlOgogICAgICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleCIKICAgICAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXgiCmVsc2U6CiAgICBkZWYgYihzKToKICAgICAgICByZXR1cm4gcwogICAgIyBXb3JrYXJvdW5kIGZvciBzdGFuZGFsb25lIGJhY2tzbGFzaAoKICAgIGRlZiB1KHMpOgogICAgICAgIHJldHVybiB1bmljb2RlKHMucmVwbGFjZShyJ1xcJywgcidcXFxcJyksICJ1bmljb2RlX2VzY2FwZSIpCiAgICB1bmljaHIgPSB1bmljaHIKICAgIGludDJieXRlID0gY2hyCgogICAgZGVmIGJ5dGUyaW50KGJzKToKICAgICAgICByZXR1cm4gb3JkKGJzWzBdKQoKICAgIGRlZiBpbmRleGJ5dGVzKGJ1ZiwgaSk6CiAgICAgICAgcmV0dXJuIG9yZChidWZbaV0pCiAgICBpdGVyYnl0ZXMgPSBmdW5jdG9vbHMucGFydGlhbChpdGVydG9vbHMuaW1hcCwgb3JkKQogICAgaW1wb3J0IFN0cmluZ0lPCiAgICBTdHJpbmdJTyA9IEJ5dGVzSU8gPSBTdHJpbmdJTy5TdHJpbmdJTwogICAgX2Fzc2VydENvdW50RXF1YWwgPSAiYXNzZXJ0SXRlbXNFcXVhbCIKICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleHAiCiAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXhwTWF0Y2hlcyIKX2FkZF9kb2MoYiwgIiIiQnl0ZSBsaXRlcmFsIiIiKQpfYWRkX2RvYyh1LCAiIiJUZXh0IGxpdGVyYWwiIiIpCgoKZGVmIGFzc2VydENvdW50RXF1YWwoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRDb3VudEVxdWFsKSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIGFzc2VydFJhaXNlc1JlZ2V4KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0UmFpc2VzUmVnZXgpKCphcmdzLCAqKmt3YXJncykKCgpkZWYgYXNzZXJ0UmVnZXgoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRSZWdleCkoKmFyZ3MsICoqa3dhcmdzKQoKCmlmIFBZMzoKICAgIGV4ZWNfID0gZ2V0YXR0cihtb3Zlcy5idWlsdGlucywgImV4ZWMiKQoKICAgIGRlZiByZXJhaXNlKHRwLCB2YWx1ZSwgdGI9Tm9uZSk6CiAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgdmFsdWUgPSB0cCgpCiAgICAgICAgaWYgdmFsdWUuX190cmFjZWJhY2tfXyBpcyBub3QgdGI6CiAgICAgICAgICAgIHJhaXNlIHZhbHVlLndpdGhfdHJhY2ViYWNrKHRiKQogICAgICAgIHJhaXNlIHZhbHVlCgplbHNlOgogICAgZGVmIGV4ZWNfKF9jb2RlXywgX2dsb2JzXz1Ob25lLCBfbG9jc189Tm9uZSk6CiAgICAgICAgIiIiRXhlY3V0ZSBjb2RlIGluIGEgbmFtZXNwYWNlLiIiIgogICAgICAgIGlmIF9nbG9ic18gaXMgTm9uZToKICAgICAgICAgICAgZnJhbWUgPSBzeXMuX2dldGZyYW1lKDEpCiAgICAgICAgICAgIF9nbG9ic18gPSBmcmFtZS5mX2dsb2JhbHMKICAgICAgICAgICAgaWYgX2xvY3NfIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBfbG9jc18gPSBmcmFtZS5mX2xvY2FscwogICAgICAgICAgICBkZWwgZnJhbWUKICAgICAgICBlbGlmIF9sb2NzXyBpcyBOb25lOgogICAgICAgICAgICBfbG9jc18gPSBfZ2xvYnNfCiAgICAgICAgZXhlYygiIiJleGVjIF9jb2RlXyBpbiBfZ2xvYnNfLCBfbG9jc18iIiIpCgogICAgZXhlY18oIiIiZGVmIHJlcmFpc2UodHAsIHZhbHVlLCB0Yj1Ob25lKToKICAgIHJhaXNlIHRwLCB2YWx1ZSwgdGIKIiIiKQoKCmlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID09ICgzLCAyKToKICAgIGV4ZWNfKCIiImRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgIGlmIGZyb21fdmFsdWUgaXMgTm9uZToKICAgICAgICByYWlzZSB2YWx1ZQogICAgcmFpc2UgdmFsdWUgZnJvbSBmcm9tX3ZhbHVlCiIiIikKZWxpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA+ICgzLCAyKToKICAgIGV4ZWNfKCIiImRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgIHJhaXNlIHZhbHVlIGZyb20gZnJvbV92YWx1ZQoiIiIpCmVsc2U6CiAgICBkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICAgICAgcmFpc2UgdmFsdWUKCgpwcmludF8gPSBnZXRhdHRyKG1vdmVzLmJ1aWx0aW5zLCAicHJpbnQiLCBOb25lKQppZiBwcmludF8gaXMgTm9uZToKICAgIGRlZiBwcmludF8oKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiJUaGUgbmV3LXN0eWxlIHByaW50IGZ1bmN0aW9uIGZvciBQeXRob24gMi40IGFuZCAyLjUuIiIiCiAgICAgICAgZnAgPSBrd2FyZ3MucG9wKCJmaWxlIiwgc3lzLnN0ZG91dCkKICAgICAgICBpZiBmcCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZGVmIHdyaXRlKGRhdGEpOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkYXRhLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgICAgIGRhdGEgPSBzdHIoZGF0YSkKICAgICAgICAgICAgIyBJZiB0aGUgZmlsZSBoYXMgYW4gZW5jb2RpbmcsIGVuY29kZSB1bmljb2RlIHdpdGggaXQuCiAgICAgICAgICAgIGlmIChpc2luc3RhbmNlKGZwLCBmaWxlKSBhbmQKICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGRhdGEsIHVuaWNvZGUpIGFuZAogICAgICAgICAgICAgICAgICAgIGZwLmVuY29kaW5nIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgICAgIGVycm9ycyA9IGdldGF0dHIoZnAsICJlcnJvcnMiLCBOb25lKQogICAgICAgICAgICAgICAgaWYgZXJyb3JzIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gInN0cmljdCIKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShmcC5lbmNvZGluZywgZXJyb3JzKQogICAgICAgICAgICBmcC53cml0ZShkYXRhKQogICAgICAgIHdhbnRfdW5pY29kZSA9IEZhbHNlCiAgICAgICAgc2VwID0ga3dhcmdzLnBvcCgic2VwIiwgTm9uZSkKICAgICAgICBpZiBzZXAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VwLCB1bmljb2RlKToKICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShzZXAsIHN0cik6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInNlcCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmciKQogICAgICAgIGVuZCA9IGt3YXJncy5wb3AoImVuZCIsIE5vbmUpCiAgICAgICAgaWYgZW5kIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVuZCwgdW5pY29kZSk6CiAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UoZW5kLCBzdHIpOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJlbmQgbXVzdCBiZSBOb25lIG9yIGEgc3RyaW5nIikKICAgICAgICBpZiBrd2FyZ3M6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50cyB0byBwcmludCgpIikKICAgICAgICBpZiBub3Qgd2FudF91bmljb2RlOgogICAgICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZywgdW5pY29kZSk6CiAgICAgICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgd2FudF91bmljb2RlOgogICAgICAgICAgICBuZXdsaW5lID0gdW5pY29kZSgiXG4iKQogICAgICAgICAgICBzcGFjZSA9IHVuaWNvZGUoIiAiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5ld2xpbmUgPSAiXG4iCiAgICAgICAgICAgIHNwYWNlID0gIiAiCiAgICAgICAgaWYgc2VwIGlzIE5vbmU6CiAgICAgICAgICAgIHNlcCA9IHNwYWNlCiAgICAgICAgaWYgZW5kIGlzIE5vbmU6CiAgICAgICAgICAgIGVuZCA9IG5ld2xpbmUKICAgICAgICBmb3IgaSwgYXJnIGluIGVudW1lcmF0ZShhcmdzKToKICAgICAgICAgICAgaWYgaToKICAgICAgICAgICAgICAgIHdyaXRlKHNlcCkKICAgICAgICAgICAgd3JpdGUoYXJnKQogICAgICAgIHdyaXRlKGVuZCkKaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPCAoMywgMyk6CiAgICBfcHJpbnQgPSBwcmludF8KCiAgICBkZWYgcHJpbnRfKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgZnAgPSBrd2FyZ3MuZ2V0KCJmaWxlIiwgc3lzLnN0ZG91dCkKICAgICAgICBmbHVzaCA9IGt3YXJncy5wb3AoImZsdXNoIiwgRmFsc2UpCiAgICAgICAgX3ByaW50KCphcmdzLCAqKmt3YXJncykKICAgICAgICBpZiBmbHVzaCBhbmQgZnAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZwLmZsdXNoKCkKCl9hZGRfZG9jKHJlcmFpc2UsICIiIlJlcmFpc2UgYW4gZXhjZXB0aW9uLiIiIikKCmlmIHN5cy52ZXJzaW9uX2luZm9bMDoyXSA8ICgzLCA0KToKICAgIGRlZiB3cmFwcyh3cmFwcGVkLCBhc3NpZ25lZD1mdW5jdG9vbHMuV1JBUFBFUl9BU1NJR05NRU5UUywKICAgICAgICAgICAgICB1cGRhdGVkPWZ1bmN0b29scy5XUkFQUEVSX1VQREFURVMpOgogICAgICAgIGRlZiB3cmFwcGVyKGYpOgogICAgICAgICAgICBmID0gZnVuY3Rvb2xzLndyYXBzKHdyYXBwZWQsIGFzc2lnbmVkLCB1cGRhdGVkKShmKQogICAgICAgICAgICBmLl9fd3JhcHBlZF9fID0gd3JhcHBlZAogICAgICAgICAgICByZXR1cm4gZgogICAgICAgIHJldHVybiB3cmFwcGVyCmVsc2U6CiAgICB3cmFwcyA9IGZ1bmN0b29scy53cmFwcwoKCmRlZiB3aXRoX21ldGFjbGFzcyhtZXRhLCAqYmFzZXMpOgogICAgIiIiQ3JlYXRlIGEgYmFzZSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLiIiIgogICAgIyBUaGlzIHJlcXVpcmVzIGEgYml0IG9mIGV4cGxhbmF0aW9uOiB0aGUgYmFzaWMgaWRlYSBpcyB0byBtYWtlIGEgZHVtbXkKICAgICMgbWV0YWNsYXNzIGZvciBvbmUgbGV2ZWwgb2YgY2xhc3MgaW5zdGFudGlhdGlvbiB0aGF0IHJlcGxhY2VzIGl0c2VsZiB3aXRoCiAgICAjIHRoZSBhY3R1YWwgbWV0YWNsYXNzLgogICAgY2xhc3MgbWV0YWNsYXNzKG1ldGEpOgoKICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIHRoaXNfYmFzZXMsIGQpOgogICAgICAgICAgICByZXR1cm4gbWV0YShuYW1lLCBiYXNlcywgZCkKICAgIHJldHVybiB0eXBlLl9fbmV3X18obWV0YWNsYXNzLCAndGVtcG9yYXJ5X2NsYXNzJywgKCksIHt9KQoKCmRlZiBhZGRfbWV0YWNsYXNzKG1ldGFjbGFzcyk6CiAgICAiIiJDbGFzcyBkZWNvcmF0b3IgZm9yIGNyZWF0aW5nIGEgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4iIiIKICAgIGRlZiB3cmFwcGVyKGNscyk6CiAgICAgICAgb3JpZ192YXJzID0gY2xzLl9fZGljdF9fLmNvcHkoKQogICAgICAgIHNsb3RzID0gb3JpZ192YXJzLmdldCgnX19zbG90c19fJykKICAgICAgICBpZiBzbG90cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzbG90cywgc3RyKToKICAgICAgICAgICAgICAgIHNsb3RzID0gW3Nsb3RzXQogICAgICAgICAgICBmb3Igc2xvdHNfdmFyIGluIHNsb3RzOgogICAgICAgICAgICAgICAgb3JpZ192YXJzLnBvcChzbG90c192YXIpCiAgICAgICAgb3JpZ192YXJzLnBvcCgnX19kaWN0X18nLCBOb25lKQogICAgICAgIG9yaWdfdmFycy5wb3AoJ19fd2Vha3JlZl9fJywgTm9uZSkKICAgICAgICByZXR1cm4gbWV0YWNsYXNzKGNscy5fX25hbWVfXywgY2xzLl9fYmFzZXNfXywgb3JpZ192YXJzKQogICAgcmV0dXJuIHdyYXBwZXIKCgpkZWYgcHl0aG9uXzJfdW5pY29kZV9jb21wYXRpYmxlKGtsYXNzKToKICAgICIiIgogICAgQSBkZWNvcmF0b3IgdGhhdCBkZWZpbmVzIF9fdW5pY29kZV9fIGFuZCBfX3N0cl9fIG1ldGhvZHMgdW5kZXIgUHl0aG9uIDIuCiAgICBVbmRlciBQeXRob24gMyBpdCBkb2VzIG5vdGhpbmcuCgogICAgVG8gc3VwcG9ydCBQeXRob24gMiBhbmQgMyB3aXRoIGEgc2luZ2xlIGNvZGUgYmFzZSwgZGVmaW5lIGEgX19zdHJfXyBtZXRob2QKICAgIHJldHVybmluZyB0ZXh0IGFuZCBhcHBseSB0aGlzIGRlY29yYXRvciB0byB0aGUgY2xhc3MuCiAgICAiIiIKICAgIGlmIFBZMjoKICAgICAgICBpZiAnX19zdHJfXycgbm90IGluIGtsYXNzLl9fZGljdF9fOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJAcHl0aG9uXzJfdW5pY29kZV9jb21wYXRpYmxlIGNhbm5vdCBiZSBhcHBsaWVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gJXMgYmVjYXVzZSBpdCBkb2Vzbid0IGRlZmluZSBfX3N0cl9fKCkuIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2xhc3MuX19uYW1lX18pCiAgICAgICAga2xhc3MuX191bmljb2RlX18gPSBrbGFzcy5fX3N0cl9fCiAgICAgICAga2xhc3MuX19zdHJfXyA9IGxhbWJkYSBzZWxmOiBzZWxmLl9fdW5pY29kZV9fKCkuZW5jb2RlKCd1dGYtOCcpCiAgICByZXR1cm4ga2xhc3MKCgojIENvbXBsZXRlIHRoZSBtb3ZlcyBpbXBsZW1lbnRhdGlvbi4KIyBUaGlzIGNvZGUgaXMgYXQgdGhlIGVuZCBvZiB0aGlzIG1vZHVsZSB0byBzcGVlZCB1cCBtb2R1bGUgbG9hZGluZy4KIyBUdXJuIHRoaXMgbW9kdWxlIGludG8gYSBwYWNrYWdlLgpfX3BhdGhfXyA9IFtdICAjIHJlcXVpcmVkIGZvciBQRVAgMzAyIGFuZCBQRVAgNDUxCl9fcGFja2FnZV9fID0gX19uYW1lX18gICMgc2VlIFBFUCAzNjYgQFJlc2VydmVkQXNzaWdubWVudAppZiBnbG9iYWxzKCkuZ2V0KCJfX3NwZWNfXyIpIGlzIG5vdCBOb25lOgogICAgX19zcGVjX18uc3VibW9kdWxlX3NlYXJjaF9sb2NhdGlvbnMgPSBbXSAgIyBQRVAgNDUxIEBVbmRlZmluZWRWYXJpYWJsZQojIFJlbW92ZSBvdGhlciBzaXggbWV0YSBwYXRoIGltcG9ydGVycywgc2luY2UgdGhleSBjYXVzZSBwcm9ibGVtcy4gVGhpcyBjYW4KIyBoYXBwZW4gaWYgc2l4IGlzIHJlbW92ZWQgZnJvbSBzeXMubW9kdWxlcyBhbmQgdGhlbiByZWxvYWRlZC4gKFNldHVwdG9vbHMgZG9lcwojIHRoaXMgZm9yIHNvbWUgcmVhc29uLikKaWYgc3lzLm1ldGFfcGF0aDoKICAgIGZvciBpLCBpbXBvcnRlciBpbiBlbnVtZXJhdGUoc3lzLm1ldGFfcGF0aCk6CiAgICAgICAgIyBIZXJlJ3Mgc29tZSByZWFsIG5hc3RpbmVzczogQW5vdGhlciAiaW5zdGFuY2UiIG9mIHRoZSBzaXggbW9kdWxlIG1pZ2h0CiAgICAgICAgIyBiZSBmbG9hdGluZyBhcm91bmQuIFRoZXJlZm9yZSwgd2UgY2FuJ3QgdXNlIGlzaW5zdGFuY2UoKSB0byBjaGVjayBmb3IKICAgICAgICAjIHRoZSBzaXggbWV0YSBwYXRoIGltcG9ydGVyLCBzaW5jZSB0aGUgb3RoZXIgc2l4IGluc3RhbmNlIHdpbGwgaGF2ZQogICAgICAgICMgaW5zZXJ0ZWQgYW4gaW1wb3J0ZXIgd2l0aCBkaWZmZXJlbnQgY2xhc3MuCiAgICAgICAgaWYgKHR5cGUoaW1wb3J0ZXIpLl9fbmFtZV9fID09ICJfU2l4TWV0YVBhdGhJbXBvcnRlciIgYW5kCiAgICAgICAgICAgICAgICBpbXBvcnRlci5uYW1lID09IF9fbmFtZV9fKToKICAgICAgICAgICAgZGVsIHN5cy5tZXRhX3BhdGhbaV0KICAgICAgICAgICAgYnJlYWsKICAgIGRlbCBpLCBpbXBvcnRlcgojIEZpbmFsbHksIGFkZCB0aGUgaW1wb3J0ZXIgdG8gdGhlIG1ldGEgcGF0aCBpbXBvcnQgaG9vay4Kc3lzLm1ldGFfcGF0aC5hcHBlbmQoX2ltcG9ydGVyKQpQSwMEFAAAAAAAAAAhAJI+9YclCwAAJQsAAC8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9fX2luaXRfXy5weSIiIgp1cmxsaWIzIC0gVGhyZWFkLXNhZmUgY29ubmVjdGlvbiBwb29saW5nIGFuZCByZS11c2luZy4KIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAppbXBvcnQgd2FybmluZ3MKCmZyb20gLmNvbm5lY3Rpb25wb29sIGltcG9ydCAoCiAgICBIVFRQQ29ubmVjdGlvblBvb2wsCiAgICBIVFRQU0Nvbm5lY3Rpb25Qb29sLAogICAgY29ubmVjdGlvbl9mcm9tX3VybAopCgpmcm9tIC4gaW1wb3J0IGV4Y2VwdGlvbnMKZnJvbSAuZmlsZXBvc3QgaW1wb3J0IGVuY29kZV9tdWx0aXBhcnRfZm9ybWRhdGEKZnJvbSAucG9vbG1hbmFnZXIgaW1wb3J0IFBvb2xNYW5hZ2VyLCBQcm94eU1hbmFnZXIsIHByb3h5X2Zyb21fdXJsCmZyb20gLnJlc3BvbnNlIGltcG9ydCBIVFRQUmVzcG9uc2UKZnJvbSAudXRpbC5yZXF1ZXN0IGltcG9ydCBtYWtlX2hlYWRlcnMKZnJvbSAudXRpbC51cmwgaW1wb3J0IGdldF9ob3N0CmZyb20gLnV0aWwudGltZW91dCBpbXBvcnQgVGltZW91dApmcm9tIC51dGlsLnJldHJ5IGltcG9ydCBSZXRyeQoKCiMgU2V0IGRlZmF1bHQgbG9nZ2luZyBoYW5kbGVyIHRvIGF2b2lkICJObyBoYW5kbGVyIGZvdW5kIiB3YXJuaW5ncy4KaW1wb3J0IGxvZ2dpbmcKdHJ5OiAgIyBQeXRob24gMi43KwogICAgZnJvbSBsb2dnaW5nIGltcG9ydCBOdWxsSGFuZGxlcgpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBjbGFzcyBOdWxsSGFuZGxlcihsb2dnaW5nLkhhbmRsZXIpOgogICAgICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CiAgICAgICAgICAgIHBhc3MKCl9fYXV0aG9yX18gPSAnQW5kcmV5IFBldHJvdiAoYW5kcmV5LnBldHJvdkBzaGF6b3cubmV0KScKX19saWNlbnNlX18gPSAnTUlUJwpfX3ZlcnNpb25fXyA9ICcxLjIyJwoKX19hbGxfXyA9ICgKICAgICdIVFRQQ29ubmVjdGlvblBvb2wnLAogICAgJ0hUVFBTQ29ubmVjdGlvblBvb2wnLAogICAgJ1Bvb2xNYW5hZ2VyJywKICAgICdQcm94eU1hbmFnZXInLAogICAgJ0hUVFBSZXNwb25zZScsCiAgICAnUmV0cnknLAogICAgJ1RpbWVvdXQnLAogICAgJ2FkZF9zdGRlcnJfbG9nZ2VyJywKICAgICdjb25uZWN0aW9uX2Zyb21fdXJsJywKICAgICdkaXNhYmxlX3dhcm5pbmdzJywKICAgICdlbmNvZGVfbXVsdGlwYXJ0X2Zvcm1kYXRhJywKICAgICdnZXRfaG9zdCcsCiAgICAnbWFrZV9oZWFkZXJzJywKICAgICdwcm94eV9mcm9tX3VybCcsCikKCmxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKS5hZGRIYW5kbGVyKE51bGxIYW5kbGVyKCkpCgoKZGVmIGFkZF9zdGRlcnJfbG9nZ2VyKGxldmVsPWxvZ2dpbmcuREVCVUcpOgogICAgIiIiCiAgICBIZWxwZXIgZm9yIHF1aWNrbHkgYWRkaW5nIGEgU3RyZWFtSGFuZGxlciB0byB0aGUgbG9nZ2VyLiBVc2VmdWwgZm9yCiAgICBkZWJ1Z2dpbmcuCgogICAgUmV0dXJucyB0aGUgaGFuZGxlciBhZnRlciBhZGRpbmcgaXQuCiAgICAiIiIKICAgICMgVGhpcyBtZXRob2QgbmVlZHMgdG8gYmUgaW4gdGhpcyBfX2luaXRfXy5weSB0byBnZXQgdGhlIF9fbmFtZV9fIGNvcnJlY3QKICAgICMgZXZlbiBpZiB1cmxsaWIzIGlzIHZlbmRvcmVkIHdpdGhpbiBhbm90aGVyIHBhY2thZ2UuCiAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKICAgIGhhbmRsZXIgPSBsb2dnaW5nLlN0cmVhbUhhbmRsZXIoKQogICAgaGFuZGxlci5zZXRGb3JtYXR0ZXIobG9nZ2luZy5Gb3JtYXR0ZXIoJyUoYXNjdGltZSlzICUobGV2ZWxuYW1lKXMgJShtZXNzYWdlKXMnKSkKICAgIGxvZ2dlci5hZGRIYW5kbGVyKGhhbmRsZXIpCiAgICBsb2dnZXIuc2V0TGV2ZWwobGV2ZWwpCiAgICBsb2dnZXIuZGVidWcoJ0FkZGVkIGEgc3RkZXJyIGxvZ2dpbmcgaGFuZGxlciB0byBsb2dnZXI6ICVzJywgX19uYW1lX18pCiAgICByZXR1cm4gaGFuZGxlcgoKCiMgLi4uIENsZWFuIHVwLgpkZWwgTnVsbEhhbmRsZXIKCgojIEFsbCB3YXJuaW5nIGZpbHRlcnMgKm11c3QqIGJlIGFwcGVuZGVkIHVubGVzcyB5b3UncmUgcmVhbGx5IGNlcnRhaW4gdGhhdCB0aGV5CiMgc2hvdWxkbid0IGJlOiBvdGhlcndpc2UsIGl0J3MgdmVyeSBoYXJkIGZvciB1c2VycyB0byB1c2UgbW9zdCBQeXRob24KIyBtZWNoYW5pc21zIHRvIHNpbGVuY2UgdGhlbS4KIyBTZWN1cml0eVdhcm5pbmcncyBhbHdheXMgZ28gb2ZmIGJ5IGRlZmF1bHQuCndhcm5pbmdzLnNpbXBsZWZpbHRlcignYWx3YXlzJywgZXhjZXB0aW9ucy5TZWN1cml0eVdhcm5pbmcsIGFwcGVuZD1UcnVlKQojIFN1YmplY3RBbHROYW1lV2FybmluZydzIHNob3VsZCBnbyBvZmYgb25jZSBwZXIgaG9zdAp3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2RlZmF1bHQnLCBleGNlcHRpb25zLlN1YmplY3RBbHROYW1lV2FybmluZywgYXBwZW5kPVRydWUpCiMgSW5zZWN1cmVQbGF0Zm9ybVdhcm5pbmcncyBkb24ndCB2YXJ5IGJldHdlZW4gcmVxdWVzdHMsIHNvIHdlIGtlZXAgaXQgZGVmYXVsdC4Kd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdkZWZhdWx0JywgZXhjZXB0aW9ucy5JbnNlY3VyZVBsYXRmb3JtV2FybmluZywKICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZD1UcnVlKQojIFNOSU1pc3NpbmdXYXJuaW5ncyBzaG91bGQgZ28gb2ZmIG9ubHkgb25jZS4Kd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdkZWZhdWx0JywgZXhjZXB0aW9ucy5TTklNaXNzaW5nV2FybmluZywgYXBwZW5kPVRydWUpCgoKZGVmIGRpc2FibGVfd2FybmluZ3MoY2F0ZWdvcnk9ZXhjZXB0aW9ucy5IVFRQV2FybmluZyk6CiAgICAiIiIKICAgIEhlbHBlciBmb3IgcXVpY2tseSBkaXNhYmxpbmcgYWxsIHVybGxpYjMgd2FybmluZ3MuCiAgICAiIiIKICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgY2F0ZWdvcnkpClBLAwQUAAAAAAAAACEAABnTlNwnAADcJwAAMwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL19jb2xsZWN0aW9ucy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE1hcHBpbmcsIE11dGFibGVNYXBwaW5nCnRyeToKICAgIGZyb20gdGhyZWFkaW5nIGltcG9ydCBSTG9jawpleGNlcHQgSW1wb3J0RXJyb3I6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBObyB0aHJlYWRzIGF2YWlsYWJsZQogICAgY2xhc3MgUkxvY2s6CiAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAgICAgcGFzcwoKICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKToKICAgICAgICAgICAgcGFzcwoKCnRyeTogICMgUHl0aG9uIDIuNysKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gLnBhY2thZ2VzLm9yZGVyZWRfZGljdCBpbXBvcnQgT3JkZXJlZERpY3QKZnJvbSAucGFja2FnZXMuc2l4IGltcG9ydCBpdGVya2V5cywgaXRlcnZhbHVlcywgUFkzCgoKX19hbGxfXyA9IFsnUmVjZW50bHlVc2VkQ29udGFpbmVyJywgJ0hUVFBIZWFkZXJEaWN0J10KCgpfTnVsbCA9IG9iamVjdCgpCgoKY2xhc3MgUmVjZW50bHlVc2VkQ29udGFpbmVyKE11dGFibGVNYXBwaW5nKToKICAgICIiIgogICAgUHJvdmlkZXMgYSB0aHJlYWQtc2FmZSBkaWN0LWxpa2UgY29udGFpbmVyIHdoaWNoIG1haW50YWlucyB1cCB0bwogICAgYGBtYXhzaXplYGAga2V5cyB3aGlsZSB0aHJvd2luZyBhd2F5IHRoZSBsZWFzdC1yZWNlbnRseS11c2VkIGtleXMgYmV5b25kCiAgICBgYG1heHNpemVgYC4KCiAgICA6cGFyYW0gbWF4c2l6ZToKICAgICAgICBNYXhpbXVtIG51bWJlciBvZiByZWNlbnQgZWxlbWVudHMgdG8gcmV0YWluLgoKICAgIDpwYXJhbSBkaXNwb3NlX2Z1bmM6CiAgICAgICAgRXZlcnkgdGltZSBhbiBpdGVtIGlzIGV2aWN0ZWQgZnJvbSB0aGUgY29udGFpbmVyLAogICAgICAgIGBgZGlzcG9zZV9mdW5jKHZhbHVlKWBgIGlzIGNhbGxlZC4gIENhbGxiYWNrIHdoaWNoIHdpbGwgZ2V0IGNhbGxlZAogICAgIiIiCgogICAgQ29udGFpbmVyQ2xzID0gT3JkZXJlZERpY3QKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWF4c2l6ZT0xMCwgZGlzcG9zZV9mdW5jPU5vbmUpOgogICAgICAgIHNlbGYuX21heHNpemUgPSBtYXhzaXplCiAgICAgICAgc2VsZi5kaXNwb3NlX2Z1bmMgPSBkaXNwb3NlX2Z1bmMKCiAgICAgICAgc2VsZi5fY29udGFpbmVyID0gc2VsZi5Db250YWluZXJDbHMoKQogICAgICAgIHNlbGYubG9jayA9IFJMb2NrKCkKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICAjIFJlLWluc2VydCB0aGUgaXRlbSwgbW92aW5nIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGV2aWN0aW9uIGxpbmUuCiAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgIGl0ZW0gPSBzZWxmLl9jb250YWluZXIucG9wKGtleSkKICAgICAgICAgICAgc2VsZi5fY29udGFpbmVyW2tleV0gPSBpdGVtCiAgICAgICAgICAgIHJldHVybiBpdGVtCgogICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgIGV2aWN0ZWRfdmFsdWUgPSBfTnVsbAogICAgICAgIHdpdGggc2VsZi5sb2NrOgogICAgICAgICAgICAjIFBvc3NpYmx5IGV2aWN0IHRoZSBleGlzdGluZyB2YWx1ZSBvZiAna2V5JwogICAgICAgICAgICBldmljdGVkX3ZhbHVlID0gc2VsZi5fY29udGFpbmVyLmdldChrZXksIF9OdWxsKQogICAgICAgICAgICBzZWxmLl9jb250YWluZXJba2V5XSA9IHZhbHVlCgogICAgICAgICAgICAjIElmIHdlIGRpZG4ndCBldmljdCBhbiBleGlzdGluZyB2YWx1ZSwgd2UgbWlnaHQgaGF2ZSB0byBldmljdCB0aGUKICAgICAgICAgICAgIyBsZWFzdCByZWNlbnRseSB1c2VkIGl0ZW0gZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250YWluZXIuCiAgICAgICAgICAgIGlmIGxlbihzZWxmLl9jb250YWluZXIpID4gc2VsZi5fbWF4c2l6ZToKICAgICAgICAgICAgICAgIF9rZXksIGV2aWN0ZWRfdmFsdWUgPSBzZWxmLl9jb250YWluZXIucG9waXRlbShsYXN0PUZhbHNlKQoKICAgICAgICBpZiBzZWxmLmRpc3Bvc2VfZnVuYyBhbmQgZXZpY3RlZF92YWx1ZSBpcyBub3QgX051bGw6CiAgICAgICAgICAgIHNlbGYuZGlzcG9zZV9mdW5jKGV2aWN0ZWRfdmFsdWUpCgogICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fY29udGFpbmVyLnBvcChrZXkpCgogICAgICAgIGlmIHNlbGYuZGlzcG9zZV9mdW5jOgogICAgICAgICAgICBzZWxmLmRpc3Bvc2VfZnVuYyh2YWx1ZSkKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9jb250YWluZXIpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ0l0ZXJhdGlvbiBvdmVyIHRoaXMgY2xhc3MgaXMgdW5saWtlbHkgdG8gYmUgdGhyZWFkc2FmZS4nKQoKICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgIyBDb3B5IHBvaW50ZXJzIHRvIGFsbCB2YWx1ZXMsIHRoZW4gd2lwZSB0aGUgbWFwcGluZwogICAgICAgICAgICB2YWx1ZXMgPSBsaXN0KGl0ZXJ2YWx1ZXMoc2VsZi5fY29udGFpbmVyKSkKICAgICAgICAgICAgc2VsZi5fY29udGFpbmVyLmNsZWFyKCkKCiAgICAgICAgaWYgc2VsZi5kaXNwb3NlX2Z1bmM6CiAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXM6CiAgICAgICAgICAgICAgICBzZWxmLmRpc3Bvc2VfZnVuYyh2YWx1ZSkKCiAgICBkZWYga2V5cyhzZWxmKToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgcmV0dXJuIGxpc3QoaXRlcmtleXMoc2VsZi5fY29udGFpbmVyKSkKCgpjbGFzcyBIVFRQSGVhZGVyRGljdChNdXRhYmxlTWFwcGluZyk6CiAgICAiIiIKICAgIDpwYXJhbSBoZWFkZXJzOgogICAgICAgIEFuIGl0ZXJhYmxlIG9mIGZpZWxkLXZhbHVlIHBhaXJzLiBNdXN0IG5vdCBjb250YWluIG11bHRpcGxlIGZpZWxkIG5hbWVzCiAgICAgICAgd2hlbiBjb21wYXJlZCBjYXNlLWluc2Vuc2l0aXZlbHkuCgogICAgOnBhcmFtIGt3YXJnczoKICAgICAgICBBZGRpdGlvbmFsIGZpZWxkLXZhbHVlIHBhaXJzIHRvIHBhc3MgaW4gdG8gYGBkaWN0LnVwZGF0ZWBgLgoKICAgIEEgYGBkaWN0YGAgbGlrZSBjb250YWluZXIgZm9yIHN0b3JpbmcgSFRUUCBIZWFkZXJzLgoKICAgIEZpZWxkIG5hbWVzIGFyZSBzdG9yZWQgYW5kIGNvbXBhcmVkIGNhc2UtaW5zZW5zaXRpdmVseSBpbiBjb21wbGlhbmNlIHdpdGgKICAgIFJGQyA3MjMwLiBJdGVyYXRpb24gcHJvdmlkZXMgdGhlIGZpcnN0IGNhc2Utc2Vuc2l0aXZlIGtleSBzZWVuIGZvciBlYWNoCiAgICBjYXNlLWluc2Vuc2l0aXZlIHBhaXIuCgogICAgVXNpbmcgYGBfX3NldGl0ZW1fX2BgIHN5bnRheCBvdmVyd3JpdGVzIGZpZWxkcyB0aGF0IGNvbXBhcmUgZXF1YWwKICAgIGNhc2UtaW5zZW5zaXRpdmVseSBpbiBvcmRlciB0byBtYWludGFpbiBgYGRpY3RgYCdzIGFwaS4gRm9yIGZpZWxkcyB0aGF0CiAgICBjb21wYXJlIGVxdWFsLCBpbnN0ZWFkIGNyZWF0ZSBhIG5ldyBgYEhUVFBIZWFkZXJEaWN0YGAgYW5kIHVzZSBgYC5hZGRgYAogICAgaW4gYSBsb29wLgoKICAgIElmIG11bHRpcGxlIGZpZWxkcyB0aGF0IGFyZSBlcXVhbCBjYXNlLWluc2Vuc2l0aXZlbHkgYXJlIHBhc3NlZCB0byB0aGUKICAgIGNvbnN0cnVjdG9yIG9yIGBgLnVwZGF0ZWBgLCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkIGFuZCBzb21lIHdpbGwgYmUKICAgIGxvc3QuCgogICAgPj4+IGhlYWRlcnMgPSBIVFRQSGVhZGVyRGljdCgpCiAgICA+Pj4gaGVhZGVycy5hZGQoJ1NldC1Db29raWUnLCAnZm9vPWJhcicpCiAgICA+Pj4gaGVhZGVycy5hZGQoJ3NldC1jb29raWUnLCAnYmF6PXF1eHgnKQogICAgPj4+IGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gPSAnNycKICAgID4+PiBoZWFkZXJzWydTRVQtY29va2llJ10KICAgICdmb289YmFyLCBiYXo9cXV4eCcKICAgID4+PiBoZWFkZXJzWydDb250ZW50LUxlbmd0aCddCiAgICAnNycKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoZWFkZXJzPU5vbmUsICoqa3dhcmdzKToKICAgICAgICBzdXBlcihIVFRQSGVhZGVyRGljdCwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX2NvbnRhaW5lciA9IE9yZGVyZWREaWN0KCkKICAgICAgICBpZiBoZWFkZXJzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGhlYWRlcnMsIEhUVFBIZWFkZXJEaWN0KToKICAgICAgICAgICAgICAgIHNlbGYuX2NvcHlfZnJvbShoZWFkZXJzKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5leHRlbmQoaGVhZGVycykKICAgICAgICBpZiBrd2FyZ3M6CiAgICAgICAgICAgIHNlbGYuZXh0ZW5kKGt3YXJncykKCiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWwpOgogICAgICAgIHNlbGYuX2NvbnRhaW5lcltrZXkubG93ZXIoKV0gPSBba2V5LCB2YWxdCiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRhaW5lcltrZXkubG93ZXIoKV0KCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICB2YWwgPSBzZWxmLl9jb250YWluZXJba2V5Lmxvd2VyKCldCiAgICAgICAgcmV0dXJuICcsICcuam9pbih2YWxbMTpdKQoKICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIGRlbCBzZWxmLl9jb250YWluZXJba2V5Lmxvd2VyKCldCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiBrZXkubG93ZXIoKSBpbiBzZWxmLl9jb250YWluZXIKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgTWFwcGluZykgYW5kIG5vdCBoYXNhdHRyKG90aGVyLCAna2V5cycpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgdHlwZShzZWxmKSk6CiAgICAgICAgICAgIG90aGVyID0gdHlwZShzZWxmKShvdGhlcikKICAgICAgICByZXR1cm4gKGRpY3QoKGsubG93ZXIoKSwgdikgZm9yIGssIHYgaW4gc2VsZi5pdGVybWVyZ2VkKCkpID09CiAgICAgICAgICAgICAgICBkaWN0KChrLmxvd2VyKCksIHYpIGZvciBrLCB2IGluIG90aGVyLml0ZXJtZXJnZWQoKSkpCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9fZXFfXyhvdGhlcikKCiAgICBpZiBub3QgUFkzOiAgIyBQeXRob24gMgogICAgICAgIGl0ZXJrZXlzID0gTXV0YWJsZU1hcHBpbmcuaXRlcmtleXMKICAgICAgICBpdGVydmFsdWVzID0gTXV0YWJsZU1hcHBpbmcuaXRlcnZhbHVlcwoKICAgIF9fbWFya2VyID0gb2JqZWN0KCkKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2NvbnRhaW5lcikKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIyBPbmx5IHByb3ZpZGUgdGhlIG9yaWdpbmFsbHkgY2FzZWQgbmFtZXMKICAgICAgICBmb3IgdmFscyBpbiBzZWxmLl9jb250YWluZXIudmFsdWVzKCk6CiAgICAgICAgICAgIHlpZWxkIHZhbHNbMF0KCiAgICBkZWYgcG9wKHNlbGYsIGtleSwgZGVmYXVsdD1fX21hcmtlcik6CiAgICAgICAgJycnRC5wb3Aoa1ssZF0pIC0+IHYsIHJlbW92ZSBzcGVjaWZpZWQga2V5IGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUuCiAgICAgICAgICBJZiBrZXkgaXMgbm90IGZvdW5kLCBkIGlzIHJldHVybmVkIGlmIGdpdmVuLCBvdGhlcndpc2UgS2V5RXJyb3IgaXMgcmFpc2VkLgogICAgICAgICcnJwogICAgICAgICMgVXNpbmcgdGhlIE11dGFibGVNYXBwaW5nIGZ1bmN0aW9uIGRpcmVjdGx5IGZhaWxzIGR1ZSB0byB0aGUgcHJpdmF0ZSBtYXJrZXIuCiAgICAgICAgIyBVc2luZyBvcmRpbmFyeSBkaWN0LnBvcCB3b3VsZCBleHBvc2UgdGhlIGludGVybmFsIHN0cnVjdHVyZXMuCiAgICAgICAgIyBTbyBsZXQncyByZWludmVudCB0aGUgd2hlZWwuCiAgICAgICAgdHJ5OgogICAgICAgICAgICB2YWx1ZSA9IHNlbGZba2V5XQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgaWYgZGVmYXVsdCBpcyBzZWxmLl9fbWFya2VyOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKICAgICAgICBlbHNlOgogICAgICAgICAgICBkZWwgc2VsZltrZXldCiAgICAgICAgICAgIHJldHVybiB2YWx1ZQoKICAgIGRlZiBkaXNjYXJkKHNlbGYsIGtleSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZWwgc2VsZltrZXldCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBwYXNzCgogICAgZGVmIGFkZChzZWxmLCBrZXksIHZhbCk6CiAgICAgICAgIiIiQWRkcyBhIChuYW1lLCB2YWx1ZSkgcGFpciwgZG9lc24ndCBvdmVyd3JpdGUgdGhlIHZhbHVlIGlmIGl0IGFscmVhZHkKICAgICAgICBleGlzdHMuCgogICAgICAgID4+PiBoZWFkZXJzID0gSFRUUEhlYWRlckRpY3QoZm9vPSdiYXInKQogICAgICAgID4+PiBoZWFkZXJzLmFkZCgnRm9vJywgJ2JheicpCiAgICAgICAgPj4+IGhlYWRlcnNbJ2ZvbyddCiAgICAgICAgJ2JhciwgYmF6JwogICAgICAgICIiIgogICAgICAgIGtleV9sb3dlciA9IGtleS5sb3dlcigpCiAgICAgICAgbmV3X3ZhbHMgPSBba2V5LCB2YWxdCiAgICAgICAgIyBLZWVwIHRoZSBjb21tb24gY2FzZSBha2Egbm8gaXRlbSBwcmVzZW50IGFzIGZhc3QgYXMgcG9zc2libGUKICAgICAgICB2YWxzID0gc2VsZi5fY29udGFpbmVyLnNldGRlZmF1bHQoa2V5X2xvd2VyLCBuZXdfdmFscykKICAgICAgICBpZiBuZXdfdmFscyBpcyBub3QgdmFsczoKICAgICAgICAgICAgdmFscy5hcHBlbmQodmFsKQoKICAgIGRlZiBleHRlbmQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiJHZW5lcmljIGltcG9ydCBmdW5jdGlvbiBmb3IgYW55IHR5cGUgb2YgaGVhZGVyLWxpa2Ugb2JqZWN0LgogICAgICAgIEFkYXB0ZWQgdmVyc2lvbiBvZiBNdXRhYmxlTWFwcGluZy51cGRhdGUgaW4gb3JkZXIgdG8gaW5zZXJ0IGl0ZW1zCiAgICAgICAgd2l0aCBzZWxmLmFkZCBpbnN0ZWFkIG9mIHNlbGYuX19zZXRpdGVtX18KICAgICAgICAiIiIKICAgICAgICBpZiBsZW4oYXJncykgPiAxOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImV4dGVuZCgpIHRha2VzIGF0IG1vc3QgMSBwb3NpdGlvbmFsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudHMgKHswfSBnaXZlbikiLmZvcm1hdChsZW4oYXJncykpKQogICAgICAgIG90aGVyID0gYXJnc1swXSBpZiBsZW4oYXJncykgPj0gMSBlbHNlICgpCgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIEhUVFBIZWFkZXJEaWN0KToKICAgICAgICAgICAgZm9yIGtleSwgdmFsIGluIG90aGVyLml0ZXJpdGVtcygpOgogICAgICAgICAgICAgICAgc2VsZi5hZGQoa2V5LCB2YWwpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBNYXBwaW5nKToKICAgICAgICAgICAgZm9yIGtleSBpbiBvdGhlcjoKICAgICAgICAgICAgICAgIHNlbGYuYWRkKGtleSwgb3RoZXJba2V5XSkKICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsICJrZXlzIik6CiAgICAgICAgICAgIGZvciBrZXkgaW4gb3RoZXIua2V5cygpOgogICAgICAgICAgICAgICAgc2VsZi5hZGQoa2V5LCBvdGhlcltrZXldKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG90aGVyOgogICAgICAgICAgICAgICAgc2VsZi5hZGQoa2V5LCB2YWx1ZSkKCiAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4ga3dhcmdzLml0ZW1zKCk6CiAgICAgICAgICAgIHNlbGYuYWRkKGtleSwgdmFsdWUpCgogICAgZGVmIGdldGxpc3Qoc2VsZiwga2V5LCBkZWZhdWx0PV9fbWFya2VyKToKICAgICAgICAiIiJSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIHZhbHVlcyBmb3IgdGhlIG5hbWVkIGZpZWxkLiBSZXR1cm5zIGFuCiAgICAgICAgZW1wdHkgbGlzdCBpZiB0aGUga2V5IGRvZXNuJ3QgZXhpc3QuIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICB2YWxzID0gc2VsZi5fY29udGFpbmVyW2tleS5sb3dlcigpXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgaWYgZGVmYXVsdCBpcyBzZWxmLl9fbWFya2VyOgogICAgICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHZhbHNbMTpdCgogICAgIyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgaHR0cGxpYgogICAgZ2V0aGVhZGVycyA9IGdldGxpc3QKICAgIGdldGFsbG1hdGNoaW5naGVhZGVycyA9IGdldGxpc3QKICAgIGlnZXQgPSBnZXRsaXN0CgogICAgIyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgaHR0cC5jb29raWVqYXIKICAgIGdldF9hbGwgPSBnZXRsaXN0CgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiJXMoJXMpIiAlICh0eXBlKHNlbGYpLl9fbmFtZV9fLCBkaWN0KHNlbGYuaXRlcm1lcmdlZCgpKSkKCiAgICBkZWYgX2NvcHlfZnJvbShzZWxmLCBvdGhlcik6CiAgICAgICAgZm9yIGtleSBpbiBvdGhlcjoKICAgICAgICAgICAgdmFsID0gb3RoZXIuZ2V0bGlzdChrZXkpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsLCBsaXN0KToKICAgICAgICAgICAgICAgICMgRG9uJ3QgbmVlZCB0byBjb252ZXJ0IHR1cGxlcwogICAgICAgICAgICAgICAgdmFsID0gbGlzdCh2YWwpCiAgICAgICAgICAgIHNlbGYuX2NvbnRhaW5lcltrZXkubG93ZXIoKV0gPSBba2V5XSArIHZhbAoKICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgIGNsb25lID0gdHlwZShzZWxmKSgpCiAgICAgICAgY2xvbmUuX2NvcHlfZnJvbShzZWxmKQogICAgICAgIHJldHVybiBjbG9uZQoKICAgIGRlZiBpdGVyaXRlbXMoc2VsZik6CiAgICAgICAgIiIiSXRlcmF0ZSBvdmVyIGFsbCBoZWFkZXIgbGluZXMsIGluY2x1ZGluZyBkdXBsaWNhdGUgb25lcy4iIiIKICAgICAgICBmb3Iga2V5IGluIHNlbGY6CiAgICAgICAgICAgIHZhbHMgPSBzZWxmLl9jb250YWluZXJba2V5Lmxvd2VyKCldCiAgICAgICAgICAgIGZvciB2YWwgaW4gdmFsc1sxOl06CiAgICAgICAgICAgICAgICB5aWVsZCB2YWxzWzBdLCB2YWwKCiAgICBkZWYgaXRlcm1lcmdlZChzZWxmKToKICAgICAgICAiIiJJdGVyYXRlIG92ZXIgYWxsIGhlYWRlcnMsIG1lcmdpbmcgZHVwbGljYXRlIG9uZXMgdG9nZXRoZXIuIiIiCiAgICAgICAgZm9yIGtleSBpbiBzZWxmOgogICAgICAgICAgICB2YWwgPSBzZWxmLl9jb250YWluZXJba2V5Lmxvd2VyKCldCiAgICAgICAgICAgIHlpZWxkIHZhbFswXSwgJywgJy5qb2luKHZhbFsxOl0pCgogICAgZGVmIGl0ZW1zKHNlbGYpOgogICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcml0ZW1zKCkpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9odHRwbGliKGNscywgbWVzc2FnZSk6ICAjIFB5dGhvbiAyCiAgICAgICAgIiIiUmVhZCBoZWFkZXJzIGZyb20gYSBQeXRob24gMiBodHRwbGliIG1lc3NhZ2Ugb2JqZWN0LiIiIgogICAgICAgICMgcHl0aG9uMi43IGRvZXMgbm90IGV4cG9zZSBhIHByb3BlciBBUEkgZm9yIGV4cG9ydGluZyBtdWx0aWhlYWRlcnMKICAgICAgICAjIGVmZmljaWVudGx5LiBUaGlzIGZ1bmN0aW9uIHJlLXJlYWRzIHJhdyBsaW5lcyBmcm9tIHRoZSBtZXNzYWdlCiAgICAgICAgIyBvYmplY3QgYW5kIGV4dHJhY3RzIHRoZSBtdWx0aWhlYWRlcnMgcHJvcGVybHkuCiAgICAgICAgaGVhZGVycyA9IFtdCgogICAgICAgIGZvciBsaW5lIGluIG1lc3NhZ2UuaGVhZGVyczoKICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCgnICcsICdcdCcpKToKICAgICAgICAgICAgICAgIGtleSwgdmFsdWUgPSBoZWFkZXJzWy0xXQogICAgICAgICAgICAgICAgaGVhZGVyc1stMV0gPSAoa2V5LCB2YWx1ZSArICdcclxuJyArIGxpbmUucnN0cmlwKCkpCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAga2V5LCB2YWx1ZSA9IGxpbmUuc3BsaXQoJzonLCAxKQogICAgICAgICAgICBoZWFkZXJzLmFwcGVuZCgoa2V5LCB2YWx1ZS5zdHJpcCgpKSkKCiAgICAgICAgcmV0dXJuIGNscyhoZWFkZXJzKQpQSwMEFAAAAAAAAAAhAGCErqfLMgAAyzIAADEAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb25uZWN0aW9uLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKaW1wb3J0IGRhdGV0aW1lCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBzb2NrZXQKZnJvbSBzb2NrZXQgaW1wb3J0IGVycm9yIGFzIFNvY2tldEVycm9yLCB0aW1lb3V0IGFzIFNvY2tldFRpbWVvdXQKaW1wb3J0IHdhcm5pbmdzCmZyb20gLnBhY2thZ2VzIGltcG9ydCBzaXgKZnJvbSAucGFja2FnZXMuc2l4Lm1vdmVzLmh0dHBfY2xpZW50IGltcG9ydCBIVFRQQ29ubmVjdGlvbiBhcyBfSFRUUENvbm5lY3Rpb24KZnJvbSAucGFja2FnZXMuc2l4Lm1vdmVzLmh0dHBfY2xpZW50IGltcG9ydCBIVFRQRXhjZXB0aW9uICAjIG5vcWE6IEY0MDEKCnRyeTogICMgQ29tcGlsZWQgd2l0aCBTU0w/CiAgICBpbXBvcnQgc3NsCiAgICBCYXNlU1NMRXJyb3IgPSBzc2wuU1NMRXJyb3IKZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogTm8gU1NMLgogICAgc3NsID0gTm9uZQoKICAgIGNsYXNzIEJhc2VTU0xFcnJvcihCYXNlRXhjZXB0aW9uKToKICAgICAgICBwYXNzCgoKdHJ5OiAgIyBQeXRob24gMzoKICAgICMgTm90IGEgbm8tb3AsIHdlJ3JlIGFkZGluZyB0aGlzIHRvIHRoZSBuYW1lc3BhY2Ugc28gaXQgY2FuIGJlIGltcG9ydGVkLgogICAgQ29ubmVjdGlvbkVycm9yID0gQ29ubmVjdGlvbkVycm9yCmV4Y2VwdCBOYW1lRXJyb3I6ICAjIFB5dGhvbiAyOgogICAgY2xhc3MgQ29ubmVjdGlvbkVycm9yKEV4Y2VwdGlvbik6CiAgICAgICAgcGFzcwoKCmZyb20gLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIE5ld0Nvbm5lY3Rpb25FcnJvciwKICAgIENvbm5lY3RUaW1lb3V0RXJyb3IsCiAgICBTdWJqZWN0QWx0TmFtZVdhcm5pbmcsCiAgICBTeXN0ZW1UaW1lV2FybmluZywKKQpmcm9tIC5wYWNrYWdlcy5zc2xfbWF0Y2hfaG9zdG5hbWUgaW1wb3J0IG1hdGNoX2hvc3RuYW1lLCBDZXJ0aWZpY2F0ZUVycm9yCgpmcm9tIC51dGlsLnNzbF8gaW1wb3J0ICgKICAgIHJlc29sdmVfY2VydF9yZXFzLAogICAgcmVzb2x2ZV9zc2xfdmVyc2lvbiwKICAgIGFzc2VydF9maW5nZXJwcmludCwKICAgIGNyZWF0ZV91cmxsaWIzX2NvbnRleHQsCiAgICBzc2xfd3JhcF9zb2NrZXQKKQoKCmZyb20gLnV0aWwgaW1wb3J0IGNvbm5lY3Rpb24KCmZyb20gLl9jb2xsZWN0aW9ucyBpbXBvcnQgSFRUUEhlYWRlckRpY3QKCmxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKcG9ydF9ieV9zY2hlbWUgPSB7CiAgICAnaHR0cCc6IDgwLAogICAgJ2h0dHBzJzogNDQzLAp9CgojIFdoZW4gdXBkYXRpbmcgUkVDRU5UX0RBVEUsIG1vdmUgaXQgdG8KIyB3aXRoaW4gdHdvIHllYXJzIG9mIHRoZSBjdXJyZW50IGRhdGUsIGFuZCBubwojIGVhcmxpZXIgdGhhbiA2IG1vbnRocyBhZ28uClJFQ0VOVF9EQVRFID0gZGF0ZXRpbWUuZGF0ZSgyMDE2LCAxLCAxKQoKCmNsYXNzIER1bW15Q29ubmVjdGlvbihvYmplY3QpOgogICAgIiIiVXNlZCB0byBkZXRlY3QgYSBmYWlsZWQgQ29ubmVjdGlvbkNscyBpbXBvcnQuIiIiCiAgICBwYXNzCgoKY2xhc3MgSFRUUENvbm5lY3Rpb24oX0hUVFBDb25uZWN0aW9uLCBvYmplY3QpOgogICAgIiIiCiAgICBCYXNlZCBvbiBodHRwbGliLkhUVFBDb25uZWN0aW9uIGJ1dCBwcm92aWRlcyBhbiBleHRyYSBjb25zdHJ1Y3RvcgogICAgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgbGF5ZXIgYmV0d2VlbiBvbGRlciBhbmQgbmV3ZXIgUHl0aG9ucy4KCiAgICBBZGRpdGlvbmFsIGtleXdvcmQgcGFyYW1ldGVycyBhcmUgdXNlZCB0byBjb25maWd1cmUgYXR0cmlidXRlcyBvZiB0aGUgY29ubmVjdGlvbi4KICAgIEFjY2VwdGVkIHBhcmFtZXRlcnMgaW5jbHVkZToKCiAgICAgIC0gYGBzdHJpY3RgYDogU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIDpjbGFzczpgdXJsbGliMy5jb25uZWN0aW9ucG9vbC5IVFRQQ29ubmVjdGlvblBvb2xgCiAgICAgIC0gYGBzb3VyY2VfYWRkcmVzc2BgOiBTZXQgdGhlIHNvdXJjZSBhZGRyZXNzIGZvciB0aGUgY3VycmVudCBjb25uZWN0aW9uLgoKICAgICAgICAuLiBub3RlOjogVGhpcyBpcyBpZ25vcmVkIGZvciBQeXRob24gMi42LiBJdCBpcyBvbmx5IGFwcGxpZWQgZm9yIDIuNyBhbmQgMy54CgogICAgICAtIGBgc29ja2V0X29wdGlvbnNgYDogU2V0IHNwZWNpZmljIG9wdGlvbnMgb24gdGhlIHVuZGVybHlpbmcgc29ja2V0LiBJZiBub3Qgc3BlY2lmaWVkLCB0aGVuCiAgICAgICAgZGVmYXVsdHMgYXJlIGxvYWRlZCBmcm9tIGBgSFRUUENvbm5lY3Rpb24uZGVmYXVsdF9zb2NrZXRfb3B0aW9uc2BgIHdoaWNoIGluY2x1ZGVzIGRpc2FibGluZwogICAgICAgIE5hZ2xlJ3MgYWxnb3JpdGhtIChzZXRzIFRDUF9OT0RFTEFZIHRvIDEpIHVubGVzcyB0aGUgY29ubmVjdGlvbiBpcyBiZWhpbmQgYSBwcm94eS4KCiAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3aXNoIHRvIGVuYWJsZSBUQ1AgS2VlcCBBbGl2ZSBpbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdHMsCiAgICAgICAgeW91IG1pZ2h0IHBhc3M6OgoKICAgICAgICAgICAgSFRUUENvbm5lY3Rpb24uZGVmYXVsdF9zb2NrZXRfb3B0aW9ucyArIFsKICAgICAgICAgICAgICAgIChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX0tFRVBBTElWRSwgMSksCiAgICAgICAgICAgIF0KCiAgICAgICAgT3IgeW91IG1heSB3YW50IHRvIGRpc2FibGUgdGhlIGRlZmF1bHRzIGJ5IHBhc3NpbmcgYW4gZW1wdHkgbGlzdCAoZS5nLiwgYGBbXWBgKS4KICAgICIiIgoKICAgIGRlZmF1bHRfcG9ydCA9IHBvcnRfYnlfc2NoZW1lWydodHRwJ10KCiAgICAjOiBEaXNhYmxlIE5hZ2xlJ3MgYWxnb3JpdGhtIGJ5IGRlZmF1bHQuCiAgICAjOiBgYFsoc29ja2V0LklQUFJPVE9fVENQLCBzb2NrZXQuVENQX05PREVMQVksIDEpXWBgCiAgICBkZWZhdWx0X3NvY2tldF9vcHRpb25zID0gWyhzb2NrZXQuSVBQUk9UT19UQ1AsIHNvY2tldC5UQ1BfTk9ERUxBWSwgMSldCgogICAgIzogV2hldGhlciB0aGlzIGNvbm5lY3Rpb24gdmVyaWZpZXMgdGhlIGhvc3QncyBjZXJ0aWZpY2F0ZS4KICAgIGlzX3ZlcmlmaWVkID0gRmFsc2UKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgIGlmIHNpeC5QWTM6ICAjIFB5dGhvbiAzCiAgICAgICAgICAgIGt3LnBvcCgnc3RyaWN0JywgTm9uZSkKCiAgICAgICAgIyBQcmUtc2V0IHNvdXJjZV9hZGRyZXNzIGluIGNhc2Ugd2UgaGF2ZSBhbiBvbGRlciBQeXRob24gbGlrZSAyLjYuCiAgICAgICAgc2VsZi5zb3VyY2VfYWRkcmVzcyA9IGt3LmdldCgnc291cmNlX2FkZHJlc3MnKQoKICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDcpOiAgIyBQeXRob24gMi42CiAgICAgICAgICAgICMgX0hUVFBDb25uZWN0aW9uIG9uIFB5dGhvbiAyLjYgd2lsbCBiYWxrIGF0IHRoaXMga2V5d29yZCBhcmcsIGJ1dAogICAgICAgICAgICAjIG5vdCBuZXdlciB2ZXJzaW9ucy4gV2UgY2FuIHN0aWxsIHVzZSBpdCB3aGVuIGNyZWF0aW5nIGEKICAgICAgICAgICAgIyBjb25uZWN0aW9uIHRob3VnaCwgc28gd2UgcG9wIGl0ICphZnRlciogd2UgaGF2ZSBzYXZlZCBpdCBhcwogICAgICAgICAgICAjIHNlbGYuc291cmNlX2FkZHJlc3MuCiAgICAgICAgICAgIGt3LnBvcCgnc291cmNlX2FkZHJlc3MnLCBOb25lKQoKICAgICAgICAjOiBUaGUgc29ja2V0IG9wdGlvbnMgcHJvdmlkZWQgYnkgdGhlIHVzZXIuIElmIG5vIG9wdGlvbnMgYXJlCiAgICAgICAgIzogcHJvdmlkZWQsIHdlIHVzZSB0aGUgZGVmYXVsdCBvcHRpb25zLgogICAgICAgIHNlbGYuc29ja2V0X29wdGlvbnMgPSBrdy5wb3AoJ3NvY2tldF9vcHRpb25zJywgc2VsZi5kZWZhdWx0X3NvY2tldF9vcHRpb25zKQoKICAgICAgICAjIFN1cGVyY2xhc3MgYWxzbyBzZXRzIHNlbGYuc291cmNlX2FkZHJlc3MgaW4gUHl0aG9uIDIuNysuCiAgICAgICAgX0hUVFBDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KQoKICAgIGRlZiBfbmV3X2Nvbm4oc2VsZik6CiAgICAgICAgIiIiIEVzdGFibGlzaCBhIHNvY2tldCBjb25uZWN0aW9uIGFuZCBzZXQgbm9kZWxheSBzZXR0aW5ncyBvbiBpdC4KCiAgICAgICAgOnJldHVybjogTmV3IHNvY2tldCBjb25uZWN0aW9uLgogICAgICAgICIiIgogICAgICAgIGV4dHJhX2t3ID0ge30KICAgICAgICBpZiBzZWxmLnNvdXJjZV9hZGRyZXNzOgogICAgICAgICAgICBleHRyYV9rd1snc291cmNlX2FkZHJlc3MnXSA9IHNlbGYuc291cmNlX2FkZHJlc3MKCiAgICAgICAgaWYgc2VsZi5zb2NrZXRfb3B0aW9uczoKICAgICAgICAgICAgZXh0cmFfa3dbJ3NvY2tldF9vcHRpb25zJ10gPSBzZWxmLnNvY2tldF9vcHRpb25zCgogICAgICAgIHRyeToKICAgICAgICAgICAgY29ubiA9IGNvbm5lY3Rpb24uY3JlYXRlX2Nvbm5lY3Rpb24oCiAgICAgICAgICAgICAgICAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpLCBzZWxmLnRpbWVvdXQsICoqZXh0cmFfa3cpCgogICAgICAgIGV4Y2VwdCBTb2NrZXRUaW1lb3V0IGFzIGU6CiAgICAgICAgICAgIHJhaXNlIENvbm5lY3RUaW1lb3V0RXJyb3IoCiAgICAgICAgICAgICAgICBzZWxmLCAiQ29ubmVjdGlvbiB0byAlcyB0aW1lZCBvdXQuIChjb25uZWN0IHRpbWVvdXQ9JXMpIiAlCiAgICAgICAgICAgICAgICAoc2VsZi5ob3N0LCBzZWxmLnRpbWVvdXQpKQoKICAgICAgICBleGNlcHQgU29ja2V0RXJyb3IgYXMgZToKICAgICAgICAgICAgcmFpc2UgTmV3Q29ubmVjdGlvbkVycm9yKAogICAgICAgICAgICAgICAgc2VsZiwgIkZhaWxlZCB0byBlc3RhYmxpc2ggYSBuZXcgY29ubmVjdGlvbjogJXMiICUgZSkKCiAgICAgICAgcmV0dXJuIGNvbm4KCiAgICBkZWYgX3ByZXBhcmVfY29ubihzZWxmLCBjb25uKToKICAgICAgICBzZWxmLnNvY2sgPSBjb25uCiAgICAgICAgIyB0aGUgX3R1bm5lbF9ob3N0IGF0dHJpYnV0ZSB3YXMgYWRkZWQgaW4gcHl0aG9uIDIuNi4zICh2aWEKICAgICAgICAjIGh0dHA6Ly9oZy5weXRob24ub3JnL2NweXRob24vcmV2LzBmNTdiMzBhMTUyZikgc28gcHl0aG9ucyAyLjYoMC0yKSBkbwogICAgICAgICMgbm90IGhhdmUgdGhlbS4KICAgICAgICBpZiBnZXRhdHRyKHNlbGYsICdfdHVubmVsX2hvc3QnLCBOb25lKToKICAgICAgICAgICAgIyBUT0RPOiBGaXggdHVubmVsIHNvIGl0IGRvZXNuJ3QgZGVwZW5kIG9uIHNlbGYuc29jayBzdGF0ZS4KICAgICAgICAgICAgc2VsZi5fdHVubmVsKCkKICAgICAgICAgICAgIyBNYXJrIHRoaXMgY29ubmVjdGlvbiBhcyBub3QgcmV1c2FibGUKICAgICAgICAgICAgc2VsZi5hdXRvX29wZW4gPSAwCgogICAgZGVmIGNvbm5lY3Qoc2VsZik6CiAgICAgICAgY29ubiA9IHNlbGYuX25ld19jb25uKCkKICAgICAgICBzZWxmLl9wcmVwYXJlX2Nvbm4oY29ubikKCiAgICBkZWYgcmVxdWVzdF9jaHVua2VkKHNlbGYsIG1ldGhvZCwgdXJsLCBib2R5PU5vbmUsIGhlYWRlcnM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgQWx0ZXJuYXRpdmUgdG8gdGhlIGNvbW1vbiByZXF1ZXN0IG1ldGhvZCwgd2hpY2ggc2VuZHMgdGhlCiAgICAgICAgYm9keSB3aXRoIGNodW5rZWQgZW5jb2RpbmcgYW5kIG5vdCBhcyBvbmUgYmxvY2sKICAgICAgICAiIiIKICAgICAgICBoZWFkZXJzID0gSFRUUEhlYWRlckRpY3QoaGVhZGVycyBpZiBoZWFkZXJzIGlzIG5vdCBOb25lIGVsc2Uge30pCiAgICAgICAgc2tpcF9hY2NlcHRfZW5jb2RpbmcgPSAnYWNjZXB0LWVuY29kaW5nJyBpbiBoZWFkZXJzCiAgICAgICAgc2tpcF9ob3N0ID0gJ2hvc3QnIGluIGhlYWRlcnMKICAgICAgICBzZWxmLnB1dHJlcXVlc3QoCiAgICAgICAgICAgIG1ldGhvZCwKICAgICAgICAgICAgdXJsLAogICAgICAgICAgICBza2lwX2FjY2VwdF9lbmNvZGluZz1za2lwX2FjY2VwdF9lbmNvZGluZywKICAgICAgICAgICAgc2tpcF9ob3N0PXNraXBfaG9zdAogICAgICAgICkKICAgICAgICBmb3IgaGVhZGVyLCB2YWx1ZSBpbiBoZWFkZXJzLml0ZW1zKCk6CiAgICAgICAgICAgIHNlbGYucHV0aGVhZGVyKGhlYWRlciwgdmFsdWUpCiAgICAgICAgaWYgJ3RyYW5zZmVyLWVuY29kaW5nJyBub3QgaW4gaGVhZGVyczoKICAgICAgICAgICAgc2VsZi5wdXRoZWFkZXIoJ1RyYW5zZmVyLUVuY29kaW5nJywgJ2NodW5rZWQnKQogICAgICAgIHNlbGYuZW5kaGVhZGVycygpCgogICAgICAgIGlmIGJvZHkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHN0cmluZ2lzaF90eXBlcyA9IHNpeC5zdHJpbmdfdHlwZXMgKyAoc2l4LmJpbmFyeV90eXBlLCkKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShib2R5LCBzdHJpbmdpc2hfdHlwZXMpOgogICAgICAgICAgICAgICAgYm9keSA9IChib2R5LCkKICAgICAgICAgICAgZm9yIGNodW5rIGluIGJvZHk6CiAgICAgICAgICAgICAgICBpZiBub3QgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNodW5rLCBzaXguYmluYXJ5X3R5cGUpOgogICAgICAgICAgICAgICAgICAgIGNodW5rID0gY2h1bmsuZW5jb2RlKCd1dGY4JykKICAgICAgICAgICAgICAgIGxlbl9zdHIgPSBoZXgobGVuKGNodW5rKSlbMjpdCiAgICAgICAgICAgICAgICBzZWxmLnNlbmQobGVuX3N0ci5lbmNvZGUoJ3V0Zi04JykpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmQoYidcclxuJykKICAgICAgICAgICAgICAgIHNlbGYuc2VuZChjaHVuaykKICAgICAgICAgICAgICAgIHNlbGYuc2VuZChiJ1xyXG4nKQoKICAgICAgICAjIEFmdGVyIHRoZSBpZiBjbGF1c2UsIHRvIGFsd2F5cyBoYXZlIGEgY2xvc2VkIGJvZHkKICAgICAgICBzZWxmLnNlbmQoYicwXHJcblxyXG4nKQoKCmNsYXNzIEhUVFBTQ29ubmVjdGlvbihIVFRQQ29ubmVjdGlvbik6CiAgICBkZWZhdWx0X3BvcnQgPSBwb3J0X2J5X3NjaGVtZVsnaHR0cHMnXQoKICAgIHNzbF92ZXJzaW9uID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0PU5vbmUsIGtleV9maWxlPU5vbmUsIGNlcnRfZmlsZT1Ob25lLAogICAgICAgICAgICAgICAgIHN0cmljdD1Ob25lLCB0aW1lb3V0PXNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVCwKICAgICAgICAgICAgICAgICBzc2xfY29udGV4dD1Ob25lLCAqKmt3KToKCiAgICAgICAgSFRUUENvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCwgc3RyaWN0PXN0cmljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXQsICoqa3cpCgogICAgICAgIHNlbGYua2V5X2ZpbGUgPSBrZXlfZmlsZQogICAgICAgIHNlbGYuY2VydF9maWxlID0gY2VydF9maWxlCiAgICAgICAgc2VsZi5zc2xfY29udGV4dCA9IHNzbF9jb250ZXh0CgogICAgICAgICMgUmVxdWlyZWQgcHJvcGVydHkgZm9yIEdvb2dsZSBBcHBFbmdpbmUgMS45LjAgd2hpY2ggb3RoZXJ3aXNlIGNhdXNlcwogICAgICAgICMgSFRUUFMgcmVxdWVzdHMgdG8gZ28gb3V0IGFzIEhUVFAuIChTZWUgSXNzdWUgIzM1NikKICAgICAgICBzZWxmLl9wcm90b2NvbCA9ICdodHRwcycKCiAgICBkZWYgY29ubmVjdChzZWxmKToKICAgICAgICBjb25uID0gc2VsZi5fbmV3X2Nvbm4oKQogICAgICAgIHNlbGYuX3ByZXBhcmVfY29ubihjb25uKQoKICAgICAgICBpZiBzZWxmLnNzbF9jb250ZXh0IGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3NsX2NvbnRleHQgPSBjcmVhdGVfdXJsbGliM19jb250ZXh0KAogICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249cmVzb2x2ZV9zc2xfdmVyc2lvbihOb25lKSwKICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1yZXNvbHZlX2NlcnRfcmVxcyhOb25lKSwKICAgICAgICAgICAgKQoKICAgICAgICBzZWxmLnNvY2sgPSBzc2xfd3JhcF9zb2NrZXQoCiAgICAgICAgICAgIHNvY2s9Y29ubiwKICAgICAgICAgICAga2V5ZmlsZT1zZWxmLmtleV9maWxlLAogICAgICAgICAgICBjZXJ0ZmlsZT1zZWxmLmNlcnRfZmlsZSwKICAgICAgICAgICAgc3NsX2NvbnRleHQ9c2VsZi5zc2xfY29udGV4dCwKICAgICAgICApCgoKY2xhc3MgVmVyaWZpZWRIVFRQU0Nvbm5lY3Rpb24oSFRUUFNDb25uZWN0aW9uKToKICAgICIiIgogICAgQmFzZWQgb24gaHR0cGxpYi5IVFRQU0Nvbm5lY3Rpb24gYnV0IHdyYXBzIHRoZSBzb2NrZXQgd2l0aAogICAgU1NMIGNlcnRpZmljYXRpb24uCiAgICAiIiIKICAgIGNlcnRfcmVxcyA9IE5vbmUKICAgIGNhX2NlcnRzID0gTm9uZQogICAgY2FfY2VydF9kaXIgPSBOb25lCiAgICBzc2xfdmVyc2lvbiA9IE5vbmUKICAgIGFzc2VydF9maW5nZXJwcmludCA9IE5vbmUKCiAgICBkZWYgc2V0X2NlcnQoc2VsZiwga2V5X2ZpbGU9Tm9uZSwgY2VydF9maWxlPU5vbmUsCiAgICAgICAgICAgICAgICAgY2VydF9yZXFzPU5vbmUsIGNhX2NlcnRzPU5vbmUsCiAgICAgICAgICAgICAgICAgYXNzZXJ0X2hvc3RuYW1lPU5vbmUsIGFzc2VydF9maW5nZXJwcmludD1Ob25lLAogICAgICAgICAgICAgICAgIGNhX2NlcnRfZGlyPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlLCBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gaXMgdXNlZC4KICAgICAgICAiIiIKICAgICAgICAjIElmIGNlcnRfcmVxcyBpcyBub3QgcHJvdmlkZWQsIHdlIGNhbiB0cnkgdG8gZ3Vlc3MuIElmIHRoZSB1c2VyIGdhdmUKICAgICAgICAjIHVzIGEgY2VydCBkYXRhYmFzZSwgd2UgYXNzdW1lIHRoZXkgd2FudCB0byB1c2UgaXQ6IG90aGVyd2lzZSwgaWYKICAgICAgICAjIHRoZXkgZ2F2ZSB1cyBhbiBTU0wgQ29udGV4dCBvYmplY3Qgd2Ugc2hvdWxkIHVzZSB3aGF0ZXZlciBpcyBzZXQgZm9yCiAgICAgICAgIyBpdC4KICAgICAgICBpZiBjZXJ0X3JlcXMgaXMgTm9uZToKICAgICAgICAgICAgaWYgY2FfY2VydHMgb3IgY2FfY2VydF9kaXI6CiAgICAgICAgICAgICAgICBjZXJ0X3JlcXMgPSAnQ0VSVF9SRVFVSVJFRCcKICAgICAgICAgICAgZWxpZiBzZWxmLnNzbF9jb250ZXh0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgY2VydF9yZXFzID0gc2VsZi5zc2xfY29udGV4dC52ZXJpZnlfbW9kZQoKICAgICAgICBzZWxmLmtleV9maWxlID0ga2V5X2ZpbGUKICAgICAgICBzZWxmLmNlcnRfZmlsZSA9IGNlcnRfZmlsZQogICAgICAgIHNlbGYuY2VydF9yZXFzID0gY2VydF9yZXFzCiAgICAgICAgc2VsZi5hc3NlcnRfaG9zdG5hbWUgPSBhc3NlcnRfaG9zdG5hbWUKICAgICAgICBzZWxmLmFzc2VydF9maW5nZXJwcmludCA9IGFzc2VydF9maW5nZXJwcmludAogICAgICAgIHNlbGYuY2FfY2VydHMgPSBjYV9jZXJ0cyBhbmQgb3MucGF0aC5leHBhbmR1c2VyKGNhX2NlcnRzKQogICAgICAgIHNlbGYuY2FfY2VydF9kaXIgPSBjYV9jZXJ0X2RpciBhbmQgb3MucGF0aC5leHBhbmR1c2VyKGNhX2NlcnRfZGlyKQoKICAgIGRlZiBjb25uZWN0KHNlbGYpOgogICAgICAgICMgQWRkIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbgogICAgICAgIGNvbm4gPSBzZWxmLl9uZXdfY29ubigpCgogICAgICAgIGhvc3RuYW1lID0gc2VsZi5ob3N0CiAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCAnX3R1bm5lbF9ob3N0JywgTm9uZSk6CiAgICAgICAgICAgICMgX3R1bm5lbF9ob3N0IHdhcyBhZGRlZCBpbiBQeXRob24gMi42LjMKICAgICAgICAgICAgIyAoU2VlOiBodHRwOi8vaGcucHl0aG9uLm9yZy9jcHl0aG9uL3Jldi8wZjU3YjMwYTE1MmYpCgogICAgICAgICAgICBzZWxmLnNvY2sgPSBjb25uCiAgICAgICAgICAgICMgQ2FsbHMgc2VsZi5fc2V0X2hvc3Rwb3J0KCksIHNvIHNlbGYuaG9zdCBpcwogICAgICAgICAgICAjIHNlbGYuX3R1bm5lbF9ob3N0IGJlbG93LgogICAgICAgICAgICBzZWxmLl90dW5uZWwoKQogICAgICAgICAgICAjIE1hcmsgdGhpcyBjb25uZWN0aW9uIGFzIG5vdCByZXVzYWJsZQogICAgICAgICAgICBzZWxmLmF1dG9fb3BlbiA9IDAKCiAgICAgICAgICAgICMgT3ZlcnJpZGUgdGhlIGhvc3Qgd2l0aCB0aGUgb25lIHdlJ3JlIHJlcXVlc3RpbmcgZGF0YSBmcm9tLgogICAgICAgICAgICBob3N0bmFtZSA9IHNlbGYuX3R1bm5lbF9ob3N0CgogICAgICAgIGlzX3RpbWVfb2ZmID0gZGF0ZXRpbWUuZGF0ZS50b2RheSgpIDwgUkVDRU5UX0RBVEUKICAgICAgICBpZiBpc190aW1lX29mZjoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigoCiAgICAgICAgICAgICAgICAnU3lzdGVtIHRpbWUgaXMgd2F5IG9mZiAoYmVmb3JlIHswfSkuIFRoaXMgd2lsbCBwcm9iYWJseSAnCiAgICAgICAgICAgICAgICAnbGVhZCB0byBTU0wgdmVyaWZpY2F0aW9uIGVycm9ycycpLmZvcm1hdChSRUNFTlRfREFURSksCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lV2FybmluZwogICAgICAgICAgICApCgogICAgICAgICMgV3JhcCBzb2NrZXQgdXNpbmcgdmVyaWZpY2F0aW9uIHdpdGggdGhlIHJvb3QgY2VydHMgaW4KICAgICAgICAjIHRydXN0ZWRfcm9vdF9jZXJ0cwogICAgICAgIGlmIHNlbGYuc3NsX2NvbnRleHQgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zc2xfY29udGV4dCA9IGNyZWF0ZV91cmxsaWIzX2NvbnRleHQoCiAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbj1yZXNvbHZlX3NzbF92ZXJzaW9uKHNlbGYuc3NsX3ZlcnNpb24pLAogICAgICAgICAgICAgICAgY2VydF9yZXFzPXJlc29sdmVfY2VydF9yZXFzKHNlbGYuY2VydF9yZXFzKSwKICAgICAgICAgICAgKQoKICAgICAgICBjb250ZXh0ID0gc2VsZi5zc2xfY29udGV4dAogICAgICAgIGNvbnRleHQudmVyaWZ5X21vZGUgPSByZXNvbHZlX2NlcnRfcmVxcyhzZWxmLmNlcnRfcmVxcykKICAgICAgICBzZWxmLnNvY2sgPSBzc2xfd3JhcF9zb2NrZXQoCiAgICAgICAgICAgIHNvY2s9Y29ubiwKICAgICAgICAgICAga2V5ZmlsZT1zZWxmLmtleV9maWxlLAogICAgICAgICAgICBjZXJ0ZmlsZT1zZWxmLmNlcnRfZmlsZSwKICAgICAgICAgICAgY2FfY2VydHM9c2VsZi5jYV9jZXJ0cywKICAgICAgICAgICAgY2FfY2VydF9kaXI9c2VsZi5jYV9jZXJ0X2RpciwKICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lPWhvc3RuYW1lLAogICAgICAgICAgICBzc2xfY29udGV4dD1jb250ZXh0KQoKICAgICAgICBpZiBzZWxmLmFzc2VydF9maW5nZXJwcmludDoKICAgICAgICAgICAgYXNzZXJ0X2ZpbmdlcnByaW50KHNlbGYuc29jay5nZXRwZWVyY2VydChiaW5hcnlfZm9ybT1UcnVlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2ZpbmdlcnByaW50KQogICAgICAgIGVsaWYgY29udGV4dC52ZXJpZnlfbW9kZSAhPSBzc2wuQ0VSVF9OT05FIFwKICAgICAgICAgICAgICAgIGFuZCBub3QgZ2V0YXR0cihjb250ZXh0LCAnY2hlY2tfaG9zdG5hbWUnLCBGYWxzZSkgXAogICAgICAgICAgICAgICAgYW5kIHNlbGYuYXNzZXJ0X2hvc3RuYW1lIGlzIG5vdCBGYWxzZToKICAgICAgICAgICAgIyBXaGlsZSB1cmxsaWIzIGF0dGVtcHRzIHRvIGFsd2F5cyB0dXJuIG9mZiBob3N0bmFtZSBtYXRjaGluZyBmcm9tCiAgICAgICAgICAgICMgdGhlIFRMUyBsaWJyYXJ5LCB0aGlzIGNhbm5vdCBhbHdheXMgYmUgZG9uZS4gU28gd2UgY2hlY2sgd2hldGhlcgogICAgICAgICAgICAjIHRoZSBUTFMgTGlicmFyeSBzdGlsbCB0aGlua3MgaXQncyBtYXRjaGluZyBob3N0bmFtZXMuCiAgICAgICAgICAgIGNlcnQgPSBzZWxmLnNvY2suZ2V0cGVlcmNlcnQoKQogICAgICAgICAgICBpZiBub3QgY2VydC5nZXQoJ3N1YmplY3RBbHROYW1lJywgKCkpOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigoCiAgICAgICAgICAgICAgICAgICAgJ0NlcnRpZmljYXRlIGZvciB7MH0gaGFzIG5vIGBzdWJqZWN0QWx0TmFtZWAsIGZhbGxpbmcgYmFjayB0byBjaGVjayBmb3IgYSAnCiAgICAgICAgICAgICAgICAgICAgJ2Bjb21tb25OYW1lYCBmb3Igbm93LiBUaGlzIGZlYXR1cmUgaXMgYmVpbmcgcmVtb3ZlZCBieSBtYWpvciBicm93c2VycyBhbmQgJwogICAgICAgICAgICAgICAgICAgICdkZXByZWNhdGVkIGJ5IFJGQyAyODE4LiAoU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zaGF6b3cvdXJsbGliMy9pc3N1ZXMvNDk3ICcKICAgICAgICAgICAgICAgICAgICAnZm9yIGRldGFpbHMuKScuZm9ybWF0KGhvc3RuYW1lKSksCiAgICAgICAgICAgICAgICAgICAgU3ViamVjdEFsdE5hbWVXYXJuaW5nCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIF9tYXRjaF9ob3N0bmFtZShjZXJ0LCBzZWxmLmFzc2VydF9ob3N0bmFtZSBvciBob3N0bmFtZSkKCiAgICAgICAgc2VsZi5pc192ZXJpZmllZCA9ICgKICAgICAgICAgICAgY29udGV4dC52ZXJpZnlfbW9kZSA9PSBzc2wuQ0VSVF9SRVFVSVJFRCBvcgogICAgICAgICAgICBzZWxmLmFzc2VydF9maW5nZXJwcmludCBpcyBub3QgTm9uZQogICAgICAgICkKCgpkZWYgX21hdGNoX2hvc3RuYW1lKGNlcnQsIGFzc2VydGVkX2hvc3RuYW1lKToKICAgIHRyeToKICAgICAgICBtYXRjaF9ob3N0bmFtZShjZXJ0LCBhc3NlcnRlZF9ob3N0bmFtZSkKICAgIGV4Y2VwdCBDZXJ0aWZpY2F0ZUVycm9yIGFzIGU6CiAgICAgICAgbG9nLmVycm9yKAogICAgICAgICAgICAnQ2VydGlmaWNhdGUgZGlkIG5vdCBtYXRjaCBleHBlY3RlZCBob3N0bmFtZTogJXMuICcKICAgICAgICAgICAgJ0NlcnRpZmljYXRlOiAlcycsIGFzc2VydGVkX2hvc3RuYW1lLCBjZXJ0CiAgICAgICAgKQogICAgICAgICMgQWRkIGNlcnQgdG8gZXhjZXB0aW9uIGFuZCByZXJhaXNlIHNvIGNsaWVudCBjb2RlIGNhbiBpbnNwZWN0CiAgICAgICAgIyB0aGUgY2VydCB3aGVuIGNhdGNoaW5nIHRoZSBleGNlcHRpb24sIGlmIHRoZXkgd2FudCB0bwogICAgICAgIGUuX3BlZXJfY2VydCA9IGNlcnQKICAgICAgICByYWlzZQoKCmlmIHNzbDoKICAgICMgTWFrZSBhIGNvcHkgZm9yIHRlc3RpbmcuCiAgICBVbnZlcmlmaWVkSFRUUFNDb25uZWN0aW9uID0gSFRUUFNDb25uZWN0aW9uCiAgICBIVFRQU0Nvbm5lY3Rpb24gPSBWZXJpZmllZEhUVFBTQ29ubmVjdGlvbgplbHNlOgogICAgSFRUUFNDb25uZWN0aW9uID0gRHVtbXlDb25uZWN0aW9uClBLAwQUAAAAAAAAACEAFxocbx6KAAAeigAANQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2Nvbm5lY3Rpb25wb29sLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKaW1wb3J0IGVycm5vCmltcG9ydCBsb2dnaW5nCmltcG9ydCBzeXMKaW1wb3J0IHdhcm5pbmdzCgpmcm9tIHNvY2tldCBpbXBvcnQgZXJyb3IgYXMgU29ja2V0RXJyb3IsIHRpbWVvdXQgYXMgU29ja2V0VGltZW91dAppbXBvcnQgc29ja2V0CgoKZnJvbSAuZXhjZXB0aW9ucyBpbXBvcnQgKAogICAgQ2xvc2VkUG9vbEVycm9yLAogICAgUHJvdG9jb2xFcnJvciwKICAgIEVtcHR5UG9vbEVycm9yLAogICAgSGVhZGVyUGFyc2luZ0Vycm9yLAogICAgSG9zdENoYW5nZWRFcnJvciwKICAgIExvY2F0aW9uVmFsdWVFcnJvciwKICAgIE1heFJldHJ5RXJyb3IsCiAgICBQcm94eUVycm9yLAogICAgUmVhZFRpbWVvdXRFcnJvciwKICAgIFNTTEVycm9yLAogICAgVGltZW91dEVycm9yLAogICAgSW5zZWN1cmVSZXF1ZXN0V2FybmluZywKICAgIE5ld0Nvbm5lY3Rpb25FcnJvciwKKQpmcm9tIC5wYWNrYWdlcy5zc2xfbWF0Y2hfaG9zdG5hbWUgaW1wb3J0IENlcnRpZmljYXRlRXJyb3IKZnJvbSAucGFja2FnZXMgaW1wb3J0IHNpeApmcm9tIC5wYWNrYWdlcy5zaXgubW92ZXMgaW1wb3J0IHF1ZXVlCmZyb20gLmNvbm5lY3Rpb24gaW1wb3J0ICgKICAgIHBvcnRfYnlfc2NoZW1lLAogICAgRHVtbXlDb25uZWN0aW9uLAogICAgSFRUUENvbm5lY3Rpb24sIEhUVFBTQ29ubmVjdGlvbiwgVmVyaWZpZWRIVFRQU0Nvbm5lY3Rpb24sCiAgICBIVFRQRXhjZXB0aW9uLCBCYXNlU1NMRXJyb3IsCikKZnJvbSAucmVxdWVzdCBpbXBvcnQgUmVxdWVzdE1ldGhvZHMKZnJvbSAucmVzcG9uc2UgaW1wb3J0IEhUVFBSZXNwb25zZQoKZnJvbSAudXRpbC5jb25uZWN0aW9uIGltcG9ydCBpc19jb25uZWN0aW9uX2Ryb3BwZWQKZnJvbSAudXRpbC5yZXF1ZXN0IGltcG9ydCBzZXRfZmlsZV9wb3NpdGlvbgpmcm9tIC51dGlsLnJlc3BvbnNlIGltcG9ydCBhc3NlcnRfaGVhZGVyX3BhcnNpbmcKZnJvbSAudXRpbC5yZXRyeSBpbXBvcnQgUmV0cnkKZnJvbSAudXRpbC50aW1lb3V0IGltcG9ydCBUaW1lb3V0CmZyb20gLnV0aWwudXJsIGltcG9ydCBnZXRfaG9zdCwgVXJsCgoKaWYgc2l4LlBZMjoKICAgICMgUXVldWUgaXMgaW1wb3J0ZWQgZm9yIHNpZGUgZWZmZWN0cyBvbiBNUyBXaW5kb3dzCiAgICBpbXBvcnQgUXVldWUgYXMgX3VudXNlZF9tb2R1bGVfUXVldWUgICMgbm9xYTogRjQwMQoKeHJhbmdlID0gc2l4Lm1vdmVzLnhyYW5nZQoKbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgpfRGVmYXVsdCA9IG9iamVjdCgpCgoKIyBQb29sIG9iamVjdHMKY2xhc3MgQ29ubmVjdGlvblBvb2wob2JqZWN0KToKICAgICIiIgogICAgQmFzZSBjbGFzcyBmb3IgYWxsIGNvbm5lY3Rpb24gcG9vbHMsIHN1Y2ggYXMKICAgIDpjbGFzczpgLkhUVFBDb25uZWN0aW9uUG9vbGAgYW5kIDpjbGFzczpgLkhUVFBTQ29ubmVjdGlvblBvb2xgLgogICAgIiIiCgogICAgc2NoZW1lID0gTm9uZQogICAgUXVldWVDbHMgPSBxdWV1ZS5MaWZvUXVldWUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydD1Ob25lKToKICAgICAgICBpZiBub3QgaG9zdDoKICAgICAgICAgICAgcmFpc2UgTG9jYXRpb25WYWx1ZUVycm9yKCJObyBob3N0IHNwZWNpZmllZC4iKQoKICAgICAgICBzZWxmLmhvc3QgPSBfaXB2Nl9ob3N0KGhvc3QpLmxvd2VyKCkKICAgICAgICBzZWxmLl9wcm94eV9ob3N0ID0gaG9zdC5sb3dlcigpCiAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMoaG9zdD0lciwgcG9ydD0lciknICUgKHR5cGUoc2VsZikuX19uYW1lX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ob3N0LCBzZWxmLnBvcnQpCgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbCwgZXhjX3RiKToKICAgICAgICBzZWxmLmNsb3NlKCkKICAgICAgICAjIFJldHVybiBGYWxzZSB0byByZS1yYWlzZSBhbnkgcG90ZW50aWFsIGV4Y2VwdGlvbnMKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ2xvc2UgYWxsIHBvb2xlZCBjb25uZWN0aW9ucyBhbmQgZGlzYWJsZSB0aGUgcG9vbC4KICAgICAgICAiIiIKICAgICAgICBwYXNzCgoKIyBUaGlzIGlzIHRha2VuIGZyb20gaHR0cDovL2hnLnB5dGhvbi5vcmcvY3B5dGhvbi9maWxlLzdhYWJhNzIxZWJjMC9MaWIvc29ja2V0LnB5I2wyNTIKX2Jsb2NraW5nX2Vycm5vcyA9IHNldChbZXJybm8uRUFHQUlOLCBlcnJuby5FV09VTERCTE9DS10pCgoKY2xhc3MgSFRUUENvbm5lY3Rpb25Qb29sKENvbm5lY3Rpb25Qb29sLCBSZXF1ZXN0TWV0aG9kcyk6CiAgICAiIiIKICAgIFRocmVhZC1zYWZlIGNvbm5lY3Rpb24gcG9vbCBmb3Igb25lIGhvc3QuCgogICAgOnBhcmFtIGhvc3Q6CiAgICAgICAgSG9zdCB1c2VkIGZvciB0aGlzIEhUVFAgQ29ubmVjdGlvbiAoZS5nLiAibG9jYWxob3N0IiksIHBhc3NlZCBpbnRvCiAgICAgICAgOmNsYXNzOmBodHRwbGliLkhUVFBDb25uZWN0aW9uYC4KCiAgICA6cGFyYW0gcG9ydDoKICAgICAgICBQb3J0IHVzZWQgZm9yIHRoaXMgSFRUUCBDb25uZWN0aW9uIChOb25lIGlzIGVxdWl2YWxlbnQgdG8gODApLCBwYXNzZWQKICAgICAgICBpbnRvIDpjbGFzczpgaHR0cGxpYi5IVFRQQ29ubmVjdGlvbmAuCgogICAgOnBhcmFtIHN0cmljdDoKICAgICAgICBDYXVzZXMgQmFkU3RhdHVzTGluZSB0byBiZSByYWlzZWQgaWYgdGhlIHN0YXR1cyBsaW5lIGNhbid0IGJlIHBhcnNlZAogICAgICAgIGFzIGEgdmFsaWQgSFRUUC8xLjAgb3IgMS4xIHN0YXR1cyBsaW5lLCBwYXNzZWQgaW50bwogICAgICAgIDpjbGFzczpgaHR0cGxpYi5IVFRQQ29ubmVjdGlvbmAuCgogICAgICAgIC4uIG5vdGU6OgogICAgICAgICAgIE9ubHkgd29ya3MgaW4gUHl0aG9uIDIuIFRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQgaW4gUHl0aG9uIDMuCgogICAgOnBhcmFtIHRpbWVvdXQ6CiAgICAgICAgU29ja2V0IHRpbWVvdXQgaW4gc2Vjb25kcyBmb3IgZWFjaCBpbmRpdmlkdWFsIGNvbm5lY3Rpb24uIFRoaXMgY2FuCiAgICAgICAgYmUgYSBmbG9hdCBvciBpbnRlZ2VyLCB3aGljaCBzZXRzIHRoZSB0aW1lb3V0IGZvciB0aGUgSFRUUCByZXF1ZXN0LAogICAgICAgIG9yIGFuIGluc3RhbmNlIG9mIDpjbGFzczpgdXJsbGliMy51dGlsLlRpbWVvdXRgIHdoaWNoIGdpdmVzIHlvdSBtb3JlCiAgICAgICAgZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlciByZXF1ZXN0IHRpbWVvdXRzLiBBZnRlciB0aGUgY29uc3RydWN0b3IgaGFzCiAgICAgICAgYmVlbiBwYXJzZWQsIHRoaXMgaXMgYWx3YXlzIGEgYHVybGxpYjMudXRpbC5UaW1lb3V0YCBvYmplY3QuCgogICAgOnBhcmFtIG1heHNpemU6CiAgICAgICAgTnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRvIHNhdmUgdGhhdCBjYW4gYmUgcmV1c2VkLiBNb3JlIHRoYW4gMSBpcyB1c2VmdWwKICAgICAgICBpbiBtdWx0aXRocmVhZGVkIHNpdHVhdGlvbnMuIElmIGBgYmxvY2tgYCBpcyBzZXQgdG8gRmFsc2UsIG1vcmUKICAgICAgICBjb25uZWN0aW9ucyB3aWxsIGJlIGNyZWF0ZWQgYnV0IHRoZXkgd2lsbCBub3QgYmUgc2F2ZWQgb25jZSB0aGV5J3ZlCiAgICAgICAgYmVlbiB1c2VkLgoKICAgIDpwYXJhbSBibG9jazoKICAgICAgICBJZiBzZXQgdG8gVHJ1ZSwgbm8gbW9yZSB0aGFuIGBgbWF4c2l6ZWBgIGNvbm5lY3Rpb25zIHdpbGwgYmUgdXNlZCBhdAogICAgICAgIGEgdGltZS4gV2hlbiBubyBmcmVlIGNvbm5lY3Rpb25zIGFyZSBhdmFpbGFibGUsIHRoZSBjYWxsIHdpbGwgYmxvY2sKICAgICAgICB1bnRpbCBhIGNvbm5lY3Rpb24gaGFzIGJlZW4gcmVsZWFzZWQuIFRoaXMgaXMgYSB1c2VmdWwgc2lkZSBlZmZlY3QgZm9yCiAgICAgICAgcGFydGljdWxhciBtdWx0aXRocmVhZGVkIHNpdHVhdGlvbnMgd2hlcmUgb25lIGRvZXMgbm90IHdhbnQgdG8gdXNlIG1vcmUKICAgICAgICB0aGFuIG1heHNpemUgY29ubmVjdGlvbnMgcGVyIGhvc3QgdG8gcHJldmVudCBmbG9vZGluZy4KCiAgICA6cGFyYW0gaGVhZGVyczoKICAgICAgICBIZWFkZXJzIHRvIGluY2x1ZGUgd2l0aCBhbGwgcmVxdWVzdHMsIHVubGVzcyBvdGhlciBoZWFkZXJzIGFyZSBnaXZlbgogICAgICAgIGV4cGxpY2l0bHkuCgogICAgOnBhcmFtIHJldHJpZXM6CiAgICAgICAgUmV0cnkgY29uZmlndXJhdGlvbiB0byB1c2UgYnkgZGVmYXVsdCB3aXRoIHJlcXVlc3RzIGluIHRoaXMgcG9vbC4KCiAgICA6cGFyYW0gX3Byb3h5OgogICAgICAgIFBhcnNlZCBwcm94eSBVUkwsIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseSwgaW5zdGVhZCwgc2VlCiAgICAgICAgOmNsYXNzOmB1cmxsaWIzLmNvbm5lY3Rpb25wb29sLlByb3h5TWFuYWdlcmAiCgogICAgOnBhcmFtIF9wcm94eV9oZWFkZXJzOgogICAgICAgIEEgZGljdGlvbmFyeSB3aXRoIHByb3h5IGhlYWRlcnMsIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseSwKICAgICAgICBpbnN0ZWFkLCBzZWUgOmNsYXNzOmB1cmxsaWIzLmNvbm5lY3Rpb25wb29sLlByb3h5TWFuYWdlcmAiCgogICAgOnBhcmFtIFxcKipjb25uX2t3OgogICAgICAgIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUgdXNlZCB0byBjcmVhdGUgZnJlc2ggOmNsYXNzOmB1cmxsaWIzLmNvbm5lY3Rpb24uSFRUUENvbm5lY3Rpb25gLAogICAgICAgIDpjbGFzczpgdXJsbGliMy5jb25uZWN0aW9uLkhUVFBTQ29ubmVjdGlvbmAgaW5zdGFuY2VzLgogICAgIiIiCgogICAgc2NoZW1lID0gJ2h0dHAnCiAgICBDb25uZWN0aW9uQ2xzID0gSFRUUENvbm5lY3Rpb24KICAgIFJlc3BvbnNlQ2xzID0gSFRUUFJlc3BvbnNlCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQ9Tm9uZSwgc3RyaWN0PUZhbHNlLAogICAgICAgICAgICAgICAgIHRpbWVvdXQ9VGltZW91dC5ERUZBVUxUX1RJTUVPVVQsIG1heHNpemU9MSwgYmxvY2s9RmFsc2UsCiAgICAgICAgICAgICAgICAgaGVhZGVycz1Ob25lLCByZXRyaWVzPU5vbmUsCiAgICAgICAgICAgICAgICAgX3Byb3h5PU5vbmUsIF9wcm94eV9oZWFkZXJzPU5vbmUsCiAgICAgICAgICAgICAgICAgKipjb25uX2t3KToKICAgICAgICBDb25uZWN0aW9uUG9vbC5fX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0KQogICAgICAgIFJlcXVlc3RNZXRob2RzLl9faW5pdF9fKHNlbGYsIGhlYWRlcnMpCgogICAgICAgIHNlbGYuc3RyaWN0ID0gc3RyaWN0CgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHRpbWVvdXQsIFRpbWVvdXQpOgogICAgICAgICAgICB0aW1lb3V0ID0gVGltZW91dC5mcm9tX2Zsb2F0KHRpbWVvdXQpCgogICAgICAgIGlmIHJldHJpZXMgaXMgTm9uZToKICAgICAgICAgICAgcmV0cmllcyA9IFJldHJ5LkRFRkFVTFQKCiAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAogICAgICAgIHNlbGYucmV0cmllcyA9IHJldHJpZXMKCiAgICAgICAgc2VsZi5wb29sID0gc2VsZi5RdWV1ZUNscyhtYXhzaXplKQogICAgICAgIHNlbGYuYmxvY2sgPSBibG9jawoKICAgICAgICBzZWxmLnByb3h5ID0gX3Byb3h5CiAgICAgICAgc2VsZi5wcm94eV9oZWFkZXJzID0gX3Byb3h5X2hlYWRlcnMgb3Ige30KCiAgICAgICAgIyBGaWxsIHRoZSBxdWV1ZSB1cCBzbyB0aGF0IGRvaW5nIGdldCgpIG9uIGl0IHdpbGwgYmxvY2sgcHJvcGVybHkKICAgICAgICBmb3IgXyBpbiB4cmFuZ2UobWF4c2l6ZSk6CiAgICAgICAgICAgIHNlbGYucG9vbC5wdXQoTm9uZSkKCiAgICAgICAgIyBUaGVzZSBhcmUgbW9zdGx5IGZvciB0ZXN0aW5nIGFuZCBkZWJ1Z2dpbmcgcHVycG9zZXMuCiAgICAgICAgc2VsZi5udW1fY29ubmVjdGlvbnMgPSAwCiAgICAgICAgc2VsZi5udW1fcmVxdWVzdHMgPSAwCiAgICAgICAgc2VsZi5jb25uX2t3ID0gY29ubl9rdwoKICAgICAgICBpZiBzZWxmLnByb3h5OgogICAgICAgICAgICAjIEVuYWJsZSBOYWdsZSdzIGFsZ29yaXRobSBmb3IgcHJveGllcywgdG8gYXZvaWQgcGFja2V0IGZyYWdtZW50YXRpb24uCiAgICAgICAgICAgICMgV2UgY2Fubm90IGtub3cgaWYgdGhlIHVzZXIgaGFzIGFkZGVkIGRlZmF1bHQgc29ja2V0IG9wdGlvbnMsIHNvIHdlIGNhbm5vdCByZXBsYWNlIHRoZQogICAgICAgICAgICAjIGxpc3QuCiAgICAgICAgICAgIHNlbGYuY29ubl9rdy5zZXRkZWZhdWx0KCdzb2NrZXRfb3B0aW9ucycsIFtdKQoKICAgIGRlZiBfbmV3X2Nvbm4oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgZnJlc2ggOmNsYXNzOmBIVFRQQ29ubmVjdGlvbmAuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5udW1fY29ubmVjdGlvbnMgKz0gMQogICAgICAgIGxvZy5kZWJ1ZygiU3RhcnRpbmcgbmV3IEhUVFAgY29ubmVjdGlvbiAoJWQpOiAlcyIsCiAgICAgICAgICAgICAgICAgIHNlbGYubnVtX2Nvbm5lY3Rpb25zLCBzZWxmLmhvc3QpCgogICAgICAgIGNvbm4gPSBzZWxmLkNvbm5lY3Rpb25DbHMoaG9zdD1zZWxmLmhvc3QsIHBvcnQ9c2VsZi5wb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD1zZWxmLnRpbWVvdXQuY29ubmVjdF90aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0PXNlbGYuc3RyaWN0LCAqKnNlbGYuY29ubl9rdykKICAgICAgICByZXR1cm4gY29ubgoKICAgIGRlZiBfZ2V0X2Nvbm4oc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBHZXQgYSBjb25uZWN0aW9uLiBXaWxsIHJldHVybiBhIHBvb2xlZCBjb25uZWN0aW9uIGlmIG9uZSBpcyBhdmFpbGFibGUuCgogICAgICAgIElmIG5vIGNvbm5lY3Rpb25zIGFyZSBhdmFpbGFibGUgYW5kIDpwcm9wOmAuYmxvY2tgIGlzIGBgRmFsc2VgYCwgdGhlbiBhCiAgICAgICAgZnJlc2ggY29ubmVjdGlvbiBpcyByZXR1cm5lZC4KCiAgICAgICAgOnBhcmFtIHRpbWVvdXQ6CiAgICAgICAgICAgIFNlY29uZHMgdG8gd2FpdCBiZWZvcmUgZ2l2aW5nIHVwIGFuZCByYWlzaW5nCiAgICAgICAgICAgIDpjbGFzczpgdXJsbGliMy5leGNlcHRpb25zLkVtcHR5UG9vbEVycm9yYCBpZiB0aGUgcG9vbCBpcyBlbXB0eSBhbmQKICAgICAgICAgICAgOnByb3A6YC5ibG9ja2AgaXMgYGBUcnVlYGAuCiAgICAgICAgIiIiCiAgICAgICAgY29ubiA9IE5vbmUKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbm4gPSBzZWxmLnBvb2wuZ2V0KGJsb2NrPXNlbGYuYmxvY2ssIHRpbWVvdXQ9dGltZW91dCkKCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOiAgIyBzZWxmLnBvb2wgaXMgTm9uZQogICAgICAgICAgICByYWlzZSBDbG9zZWRQb29sRXJyb3Ioc2VsZiwgIlBvb2wgaXMgY2xvc2VkLiIpCgogICAgICAgIGV4Y2VwdCBxdWV1ZS5FbXB0eToKICAgICAgICAgICAgaWYgc2VsZi5ibG9jazoKICAgICAgICAgICAgICAgIHJhaXNlIEVtcHR5UG9vbEVycm9yKHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9vbCByZWFjaGVkIG1heGltdW0gc2l6ZSBhbmQgbm8gbW9yZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29ubmVjdGlvbnMgYXJlIGFsbG93ZWQuIikKICAgICAgICAgICAgcGFzcyAgIyBPaCB3ZWxsLCB3ZSdsbCBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiB0aGVuCgogICAgICAgICMgSWYgdGhpcyBpcyBhIHBlcnNpc3RlbnQgY29ubmVjdGlvbiwgY2hlY2sgaWYgaXQgZ290IGRpc2Nvbm5lY3RlZAogICAgICAgIGlmIGNvbm4gYW5kIGlzX2Nvbm5lY3Rpb25fZHJvcHBlZChjb25uKToKICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXNldHRpbmcgZHJvcHBlZCBjb25uZWN0aW9uOiAlcyIsIHNlbGYuaG9zdCkKICAgICAgICAgICAgY29ubi5jbG9zZSgpCiAgICAgICAgICAgIGlmIGdldGF0dHIoY29ubiwgJ2F1dG9fb3BlbicsIDEpID09IDA6CiAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYSBwcm94aWVkIGNvbm5lY3Rpb24gdGhhdCBoYXMgYmVlbiBtdXRhdGVkIGJ5CiAgICAgICAgICAgICAgICAjIGh0dHBsaWIuX3R1bm5lbCgpIGFuZCBjYW5ub3QgYmUgcmV1c2VkIChzaW5jZSBpdCB3b3VsZAogICAgICAgICAgICAgICAgIyBhdHRlbXB0IHRvIGJ5cGFzcyB0aGUgcHJveHkpCiAgICAgICAgICAgICAgICBjb25uID0gTm9uZQoKICAgICAgICByZXR1cm4gY29ubiBvciBzZWxmLl9uZXdfY29ubigpCgogICAgZGVmIF9wdXRfY29ubihzZWxmLCBjb25uKToKICAgICAgICAiIiIKICAgICAgICBQdXQgYSBjb25uZWN0aW9uIGJhY2sgaW50byB0aGUgcG9vbC4KCiAgICAgICAgOnBhcmFtIGNvbm46CiAgICAgICAgICAgIENvbm5lY3Rpb24gb2JqZWN0IGZvciB0aGUgY3VycmVudCBob3N0IGFuZCBwb3J0IGFzIHJldHVybmVkIGJ5CiAgICAgICAgICAgIDptZXRoOmAuX25ld19jb25uYCBvciA6bWV0aDpgLl9nZXRfY29ubmAuCgogICAgICAgIElmIHRoZSBwb29sIGlzIGFscmVhZHkgZnVsbCwgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkIGFuZCBkaXNjYXJkZWQKICAgICAgICBiZWNhdXNlIHdlIGV4Y2VlZGVkIG1heHNpemUuIElmIGNvbm5lY3Rpb25zIGFyZSBkaXNjYXJkZWQgZnJlcXVlbnRseSwKICAgICAgICB0aGVuIG1heHNpemUgc2hvdWxkIGJlIGluY3JlYXNlZC4KCiAgICAgICAgSWYgdGhlIHBvb2wgaXMgY2xvc2VkLCB0aGVuIHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgY2xvc2VkIGFuZCBkaXNjYXJkZWQuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnBvb2wucHV0KGNvbm4sIGJsb2NrPUZhbHNlKQogICAgICAgICAgICByZXR1cm4gICMgRXZlcnl0aGluZyBpcyBkYW5keSwgZG9uZS4KICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICMgc2VsZi5wb29sIGlzIE5vbmUuCiAgICAgICAgICAgIHBhc3MKICAgICAgICBleGNlcHQgcXVldWUuRnVsbDoKICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gaWYgc2VsZi5ibG9jayA9PSBUcnVlCiAgICAgICAgICAgIGxvZy53YXJuaW5nKAogICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gcG9vbCBpcyBmdWxsLCBkaXNjYXJkaW5nIGNvbm5lY3Rpb246ICVzIiwKICAgICAgICAgICAgICAgIHNlbGYuaG9zdCkKCiAgICAgICAgIyBDb25uZWN0aW9uIG5ldmVyIGdvdCBwdXQgYmFjayBpbnRvIHRoZSBwb29sLCBjbG9zZSBpdC4KICAgICAgICBpZiBjb25uOgogICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICBkZWYgX3ZhbGlkYXRlX2Nvbm4oc2VsZiwgY29ubik6CiAgICAgICAgIiIiCiAgICAgICAgQ2FsbGVkIHJpZ2h0IGJlZm9yZSBhIHJlcXVlc3QgaXMgbWFkZSwgYWZ0ZXIgdGhlIHNvY2tldCBpcyBjcmVhdGVkLgogICAgICAgICIiIgogICAgICAgIHBhc3MKCiAgICBkZWYgX3ByZXBhcmVfcHJveHkoc2VsZiwgY29ubik6CiAgICAgICAgIyBOb3RoaW5nIHRvIGRvIGZvciBIVFRQIGNvbm5lY3Rpb25zLgogICAgICAgIHBhc3MKCiAgICBkZWYgX2dldF90aW1lb3V0KHNlbGYsIHRpbWVvdXQpOgogICAgICAgICIiIiBIZWxwZXIgdGhhdCBhbHdheXMgcmV0dXJucyBhIDpjbGFzczpgdXJsbGliMy51dGlsLlRpbWVvdXRgICIiIgogICAgICAgIGlmIHRpbWVvdXQgaXMgX0RlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnRpbWVvdXQuY2xvbmUoKQoKICAgICAgICBpZiBpc2luc3RhbmNlKHRpbWVvdXQsIFRpbWVvdXQpOgogICAgICAgICAgICByZXR1cm4gdGltZW91dC5jbG9uZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBVc2VyIHBhc3NlZCB1cyBhbiBpbnQvZmxvYXQuIFRoaXMgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LAogICAgICAgICAgICAjIGNhbiBiZSByZW1vdmVkIGxhdGVyCiAgICAgICAgICAgIHJldHVybiBUaW1lb3V0LmZyb21fZmxvYXQodGltZW91dCkKCiAgICBkZWYgX3JhaXNlX3RpbWVvdXQoc2VsZiwgZXJyLCB1cmwsIHRpbWVvdXRfdmFsdWUpOgogICAgICAgICIiIklzIHRoZSBlcnJvciBhY3R1YWxseSBhIHRpbWVvdXQ/IFdpbGwgcmFpc2UgYSBSZWFkVGltZW91dCBvciBwYXNzIiIiCgogICAgICAgIGlmIGlzaW5zdGFuY2UoZXJyLCBTb2NrZXRUaW1lb3V0KToKICAgICAgICAgICAgcmFpc2UgUmVhZFRpbWVvdXRFcnJvcihzZWxmLCB1cmwsICJSZWFkIHRpbWVkIG91dC4gKHJlYWQgdGltZW91dD0lcykiICUgdGltZW91dF92YWx1ZSkKCiAgICAgICAgIyBTZWUgdGhlIGFib3ZlIGNvbW1lbnQgYWJvdXQgRUFHQUlOIGluIFB5dGhvbiAzLiBJbiBQeXRob24gMiB3ZSBoYXZlCiAgICAgICAgIyB0byBzcGVjaWZpY2FsbHkgY2F0Y2ggaXQgYW5kIHRocm93IHRoZSB0aW1lb3V0IGVycm9yCiAgICAgICAgaWYgaGFzYXR0cihlcnIsICdlcnJubycpIGFuZCBlcnIuZXJybm8gaW4gX2Jsb2NraW5nX2Vycm5vczoKICAgICAgICAgICAgcmFpc2UgUmVhZFRpbWVvdXRFcnJvcihzZWxmLCB1cmwsICJSZWFkIHRpbWVkIG91dC4gKHJlYWQgdGltZW91dD0lcykiICUgdGltZW91dF92YWx1ZSkKCiAgICAgICAgIyBDYXRjaCBwb3NzaWJsZSByZWFkIHRpbWVvdXRzIHRocm93biBhcyBTU0wgZXJyb3JzLiBJZiBub3QgdGhlCiAgICAgICAgIyBjYXNlLCByZXRocm93IHRoZSBvcmlnaW5hbC4gV2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2Ugb2Y6CiAgICAgICAgIyBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTAyNzIKICAgICAgICBpZiAndGltZWQgb3V0JyBpbiBzdHIoZXJyKSBvciAnZGlkIG5vdCBjb21wbGV0ZSAocmVhZCknIGluIHN0cihlcnIpOiAgIyBQeXRob24gMi42CiAgICAgICAgICAgIHJhaXNlIFJlYWRUaW1lb3V0RXJyb3Ioc2VsZiwgdXJsLCAiUmVhZCB0aW1lZCBvdXQuIChyZWFkIHRpbWVvdXQ9JXMpIiAlIHRpbWVvdXRfdmFsdWUpCgogICAgZGVmIF9tYWtlX3JlcXVlc3Qoc2VsZiwgY29ubiwgbWV0aG9kLCB1cmwsIHRpbWVvdXQ9X0RlZmF1bHQsIGNodW5rZWQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAqKmh0dHBsaWJfcmVxdWVzdF9rdyk6CiAgICAgICAgIiIiCiAgICAgICAgUGVyZm9ybSBhIHJlcXVlc3Qgb24gYSBnaXZlbiB1cmxsaWIgY29ubmVjdGlvbiBvYmplY3QgdGFrZW4gZnJvbSBvdXIKICAgICAgICBwb29sLgoKICAgICAgICA6cGFyYW0gY29ubjoKICAgICAgICAgICAgYSBjb25uZWN0aW9uIGZyb20gb25lIG9mIG91ciBjb25uZWN0aW9uIHBvb2xzCgogICAgICAgIDpwYXJhbSB0aW1lb3V0OgogICAgICAgICAgICBTb2NrZXQgdGltZW91dCBpbiBzZWNvbmRzIGZvciB0aGUgcmVxdWVzdC4gVGhpcyBjYW4gYmUgYQogICAgICAgICAgICBmbG9hdCBvciBpbnRlZ2VyLCB3aGljaCB3aWxsIHNldCB0aGUgc2FtZSB0aW1lb3V0IHZhbHVlIGZvcgogICAgICAgICAgICB0aGUgc29ja2V0IGNvbm5lY3QgYW5kIHRoZSBzb2NrZXQgcmVhZCwgb3IgYW4gaW5zdGFuY2Ugb2YKICAgICAgICAgICAgOmNsYXNzOmB1cmxsaWIzLnV0aWwuVGltZW91dGAsIHdoaWNoIGdpdmVzIHlvdSBtb3JlIGZpbmUtZ3JhaW5lZAogICAgICAgICAgICBjb250cm9sIG92ZXIgeW91ciB0aW1lb3V0cy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLm51bV9yZXF1ZXN0cyArPSAxCgogICAgICAgIHRpbWVvdXRfb2JqID0gc2VsZi5fZ2V0X3RpbWVvdXQodGltZW91dCkKICAgICAgICB0aW1lb3V0X29iai5zdGFydF9jb25uZWN0KCkKICAgICAgICBjb25uLnRpbWVvdXQgPSB0aW1lb3V0X29iai5jb25uZWN0X3RpbWVvdXQKCiAgICAgICAgIyBUcmlnZ2VyIGFueSBleHRyYSB2YWxpZGF0aW9uIHdlIG5lZWQgdG8gZG8uCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl92YWxpZGF0ZV9jb25uKGNvbm4pCiAgICAgICAgZXhjZXB0IChTb2NrZXRUaW1lb3V0LCBCYXNlU1NMRXJyb3IpIGFzIGU6CiAgICAgICAgICAgICMgUHkyIHJhaXNlcyB0aGlzIGFzIGEgQmFzZVNTTEVycm9yLCBQeTMgcmFpc2VzIGl0IGFzIHNvY2tldCB0aW1lb3V0LgogICAgICAgICAgICBzZWxmLl9yYWlzZV90aW1lb3V0KGVycj1lLCB1cmw9dXJsLCB0aW1lb3V0X3ZhbHVlPWNvbm4udGltZW91dCkKICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgIyBjb25uLnJlcXVlc3QoKSBjYWxscyBodHRwbGliLioucmVxdWVzdCwgbm90IHRoZSBtZXRob2QgaW4KICAgICAgICAjIHVybGxpYjMucmVxdWVzdC4gSXQgYWxzbyBjYWxscyBtYWtlZmlsZSAocmVjdikgb24gdGhlIHNvY2tldC4KICAgICAgICBpZiBjaHVua2VkOgogICAgICAgICAgICBjb25uLnJlcXVlc3RfY2h1bmtlZChtZXRob2QsIHVybCwgKipodHRwbGliX3JlcXVlc3Rfa3cpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29ubi5yZXF1ZXN0KG1ldGhvZCwgdXJsLCAqKmh0dHBsaWJfcmVxdWVzdF9rdykKCiAgICAgICAgIyBSZXNldCB0aGUgdGltZW91dCBmb3IgdGhlIHJlY3YoKSBvbiB0aGUgc29ja2V0CiAgICAgICAgcmVhZF90aW1lb3V0ID0gdGltZW91dF9vYmoucmVhZF90aW1lb3V0CgogICAgICAgICMgQXBwIEVuZ2luZSBkb2Vzbid0IGhhdmUgYSBzb2NrIGF0dHIKICAgICAgICBpZiBnZXRhdHRyKGNvbm4sICdzb2NrJywgTm9uZSk6CiAgICAgICAgICAgICMgSW4gUHl0aG9uIDMgc29ja2V0LnB5IHdpbGwgY2F0Y2ggRUFHQUlOIGFuZCByZXR1cm4gTm9uZSB3aGVuIHlvdQogICAgICAgICAgICAjIHRyeSBhbmQgcmVhZCBpbnRvIHRoZSBmaWxlIHBvaW50ZXIgY3JlYXRlZCBieSBodHRwLmNsaWVudCwgd2hpY2gKICAgICAgICAgICAgIyBpbnN0ZWFkIHJhaXNlcyBhIEJhZFN0YXR1c0xpbmUgZXhjZXB0aW9uLiBJbnN0ZWFkIG9mIGNhdGNoaW5nCiAgICAgICAgICAgICMgdGhlIGV4Y2VwdGlvbiBhbmQgYXNzdW1pbmcgYWxsIEJhZFN0YXR1c0xpbmUgZXhjZXB0aW9ucyBhcmUgcmVhZAogICAgICAgICAgICAjIHRpbWVvdXRzLCBjaGVjayBmb3IgYSB6ZXJvIHRpbWVvdXQgYmVmb3JlIG1ha2luZyB0aGUgcmVxdWVzdC4KICAgICAgICAgICAgaWYgcmVhZF90aW1lb3V0ID09IDA6CiAgICAgICAgICAgICAgICByYWlzZSBSZWFkVGltZW91dEVycm9yKAogICAgICAgICAgICAgICAgICAgIHNlbGYsIHVybCwgIlJlYWQgdGltZWQgb3V0LiAocmVhZCB0aW1lb3V0PSVzKSIgJSByZWFkX3RpbWVvdXQpCiAgICAgICAgICAgIGlmIHJlYWRfdGltZW91dCBpcyBUaW1lb3V0LkRFRkFVTFRfVElNRU9VVDoKICAgICAgICAgICAgICAgIGNvbm4uc29jay5zZXR0aW1lb3V0KHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpKQogICAgICAgICAgICBlbHNlOiAgIyBOb25lIG9yIGEgdmFsdWUKICAgICAgICAgICAgICAgIGNvbm4uc29jay5zZXR0aW1lb3V0KHJlYWRfdGltZW91dCkKCiAgICAgICAgIyBSZWNlaXZlIHRoZSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHRyeTogICMgUHl0aG9uIDIuNywgdXNlIGJ1ZmZlcmluZyBvZiBIVFRQIHJlc3BvbnNlcwogICAgICAgICAgICAgICAgaHR0cGxpYl9yZXNwb25zZSA9IGNvbm4uZ2V0cmVzcG9uc2UoYnVmZmVyaW5nPVRydWUpCiAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6ICAjIFB5dGhvbiAyLjYgYW5kIG9sZGVyLCBQeXRob24gMwogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGh0dHBsaWJfcmVzcG9uc2UgPSBjb25uLmdldHJlc3BvbnNlKCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgICAgICAjIFJlbW92ZSB0aGUgVHlwZUVycm9yIGZyb20gdGhlIGV4Y2VwdGlvbiBjaGFpbiBpbiBQeXRob24gMzsKICAgICAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSBpdCBsb29rcyBsaWtlIGEgcHJvZ3JhbW1pbmcgZXJyb3Igd2FzIHRoZSBjYXVzZS4KICAgICAgICAgICAgICAgICAgICBzaXgucmFpc2VfZnJvbShlLCBOb25lKQogICAgICAgIGV4Y2VwdCAoU29ja2V0VGltZW91dCwgQmFzZVNTTEVycm9yLCBTb2NrZXRFcnJvcikgYXMgZToKICAgICAgICAgICAgc2VsZi5fcmFpc2VfdGltZW91dChlcnI9ZSwgdXJsPXVybCwgdGltZW91dF92YWx1ZT1yZWFkX3RpbWVvdXQpCiAgICAgICAgICAgIHJhaXNlCgogICAgICAgICMgQXBwRW5naW5lIGRvZXNuJ3QgaGF2ZSBhIHZlcnNpb24gYXR0ci4KICAgICAgICBodHRwX3ZlcnNpb24gPSBnZXRhdHRyKGNvbm4sICdfaHR0cF92c25fc3RyJywgJ0hUVFAvPycpCiAgICAgICAgbG9nLmRlYnVnKCIlczovLyVzOiVzIFwiJXMgJXMgJXNcIiAlcyAlcyIsIHNlbGYuc2NoZW1lLCBzZWxmLmhvc3QsIHNlbGYucG9ydCwKICAgICAgICAgICAgICAgICAgbWV0aG9kLCB1cmwsIGh0dHBfdmVyc2lvbiwgaHR0cGxpYl9yZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICAgICAgICAgIGh0dHBsaWJfcmVzcG9uc2UubGVuZ3RoKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGFzc2VydF9oZWFkZXJfcGFyc2luZyhodHRwbGliX3Jlc3BvbnNlLm1zZykKICAgICAgICBleGNlcHQgKEhlYWRlclBhcnNpbmdFcnJvciwgVHlwZUVycm9yKSBhcyBocGU6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMwogICAgICAgICAgICBsb2cud2FybmluZygKICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gcGFyc2UgaGVhZGVycyAodXJsPSVzKTogJXMnLAogICAgICAgICAgICAgICAgc2VsZi5fYWJzb2x1dGVfdXJsKHVybCksIGhwZSwgZXhjX2luZm89VHJ1ZSkKCiAgICAgICAgcmV0dXJuIGh0dHBsaWJfcmVzcG9uc2UKCiAgICBkZWYgX2Fic29sdXRlX3VybChzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gVXJsKHNjaGVtZT1zZWxmLnNjaGVtZSwgaG9zdD1zZWxmLmhvc3QsIHBvcnQ9c2VsZi5wb3J0LCBwYXRoPXBhdGgpLnVybAoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDbG9zZSBhbGwgcG9vbGVkIGNvbm5lY3Rpb25zIGFuZCBkaXNhYmxlIHRoZSBwb29sLgogICAgICAgICIiIgogICAgICAgICMgRGlzYWJsZSBhY2Nlc3MgdG8gdGhlIHBvb2wKICAgICAgICBvbGRfcG9vbCwgc2VsZi5wb29sID0gc2VsZi5wb29sLCBOb25lCgogICAgICAgIHRyeToKICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIGNvbm4gPSBvbGRfcG9vbC5nZXQoYmxvY2s9RmFsc2UpCiAgICAgICAgICAgICAgICBpZiBjb25uOgogICAgICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKQoKICAgICAgICBleGNlcHQgcXVldWUuRW1wdHk6CiAgICAgICAgICAgIHBhc3MgICMgRG9uZS4KCiAgICBkZWYgaXNfc2FtZV9ob3N0KHNlbGYsIHVybCk6CiAgICAgICAgIiIiCiAgICAgICAgQ2hlY2sgaWYgdGhlIGdpdmVuIGBgdXJsYGAgaXMgYSBtZW1iZXIgb2YgdGhlIHNhbWUgaG9zdCBhcyB0aGlzCiAgICAgICAgY29ubmVjdGlvbiBwb29sLgogICAgICAgICIiIgogICAgICAgIGlmIHVybC5zdGFydHN3aXRoKCcvJyk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgICMgVE9ETzogQWRkIG9wdGlvbmFsIHN1cHBvcnQgZm9yIHNvY2tldC5nZXRob3N0YnluYW1lIGNoZWNraW5nLgogICAgICAgIHNjaGVtZSwgaG9zdCwgcG9ydCA9IGdldF9ob3N0KHVybCkKCiAgICAgICAgaG9zdCA9IF9pcHY2X2hvc3QoaG9zdCkubG93ZXIoKQoKICAgICAgICAjIFVzZSBleHBsaWNpdCBkZWZhdWx0IHBvcnQgZm9yIGNvbXBhcmlzb24gd2hlbiBub25lIGlzIGdpdmVuCiAgICAgICAgaWYgc2VsZi5wb3J0IGFuZCBub3QgcG9ydDoKICAgICAgICAgICAgcG9ydCA9IHBvcnRfYnlfc2NoZW1lLmdldChzY2hlbWUpCiAgICAgICAgZWxpZiBub3Qgc2VsZi5wb3J0IGFuZCBwb3J0ID09IHBvcnRfYnlfc2NoZW1lLmdldChzY2hlbWUpOgogICAgICAgICAgICBwb3J0ID0gTm9uZQoKICAgICAgICByZXR1cm4gKHNjaGVtZSwgaG9zdCwgcG9ydCkgPT0gKHNlbGYuc2NoZW1lLCBzZWxmLmhvc3QsIHNlbGYucG9ydCkKCiAgICBkZWYgdXJsb3BlbihzZWxmLCBtZXRob2QsIHVybCwgYm9keT1Ob25lLCBoZWFkZXJzPU5vbmUsIHJldHJpZXM9Tm9uZSwKICAgICAgICAgICAgICAgIHJlZGlyZWN0PVRydWUsIGFzc2VydF9zYW1lX2hvc3Q9VHJ1ZSwgdGltZW91dD1fRGVmYXVsdCwKICAgICAgICAgICAgICAgIHBvb2xfdGltZW91dD1Ob25lLCByZWxlYXNlX2Nvbm49Tm9uZSwgY2h1bmtlZD1GYWxzZSwKICAgICAgICAgICAgICAgIGJvZHlfcG9zPU5vbmUsICoqcmVzcG9uc2Vfa3cpOgogICAgICAgICIiIgogICAgICAgIEdldCBhIGNvbm5lY3Rpb24gZnJvbSB0aGUgcG9vbCBhbmQgcGVyZm9ybSBhbiBIVFRQIHJlcXVlc3QuIFRoaXMgaXMgdGhlCiAgICAgICAgbG93ZXN0IGxldmVsIGNhbGwgZm9yIG1ha2luZyBhIHJlcXVlc3QsIHNvIHlvdSdsbCBuZWVkIHRvIHNwZWNpZnkgYWxsCiAgICAgICAgdGhlIHJhdyBkZXRhaWxzLgoKICAgICAgICAuLiBub3RlOjoKCiAgICAgICAgICAgTW9yZSBjb21tb25seSwgaXQncyBhcHByb3ByaWF0ZSB0byB1c2UgYSBjb252ZW5pZW5jZSBtZXRob2QgcHJvdmlkZWQKICAgICAgICAgICBieSA6Y2xhc3M6YC5SZXF1ZXN0TWV0aG9kc2AsIHN1Y2ggYXMgOm1ldGg6YHJlcXVlc3RgLgoKICAgICAgICAuLiBub3RlOjoKCiAgICAgICAgICAgYHJlbGVhc2VfY29ubmAgd2lsbCBvbmx5IGJlaGF2ZSBhcyBleHBlY3RlZCBpZgogICAgICAgICAgIGBwcmVsb2FkX2NvbnRlbnQ9RmFsc2VgIGJlY2F1c2Ugd2Ugd2FudCB0byBtYWtlCiAgICAgICAgICAgYHByZWxvYWRfY29udGVudD1GYWxzZWAgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIHNvbWVkYXkgc29vbiB3aXRob3V0CiAgICAgICAgICAgYnJlYWtpbmcgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCgogICAgICAgIDpwYXJhbSBtZXRob2Q6CiAgICAgICAgICAgIEhUVFAgcmVxdWVzdCBtZXRob2QgKHN1Y2ggYXMgR0VULCBQT1NULCBQVVQsIGV0Yy4pCgogICAgICAgIDpwYXJhbSBib2R5OgogICAgICAgICAgICBEYXRhIHRvIHNlbmQgaW4gdGhlIHJlcXVlc3QgYm9keSAodXNlZnVsIGZvciBjcmVhdGluZwogICAgICAgICAgICBQT1NUIHJlcXVlc3RzLCBzZWUgSFRUUENvbm5lY3Rpb25Qb29sLnBvc3RfdXJsIGZvcgogICAgICAgICAgICBtb3JlIGNvbnZlbmllbmNlKS4KCiAgICAgICAgOnBhcmFtIGhlYWRlcnM6CiAgICAgICAgICAgIERpY3Rpb25hcnkgb2YgY3VzdG9tIGhlYWRlcnMgdG8gc2VuZCwgc3VjaCBhcyBVc2VyLUFnZW50LAogICAgICAgICAgICBJZi1Ob25lLU1hdGNoLCBldGMuIElmIE5vbmUsIHBvb2wgaGVhZGVycyBhcmUgdXNlZC4gSWYgcHJvdmlkZWQsCiAgICAgICAgICAgIHRoZXNlIGhlYWRlcnMgY29tcGxldGVseSByZXBsYWNlIGFueSBwb29sLXNwZWNpZmljIGhlYWRlcnMuCgogICAgICAgIDpwYXJhbSByZXRyaWVzOgogICAgICAgICAgICBDb25maWd1cmUgdGhlIG51bWJlciBvZiByZXRyaWVzIHRvIGFsbG93IGJlZm9yZSByYWlzaW5nIGEKICAgICAgICAgICAgOmNsYXNzOmB+dXJsbGliMy5leGNlcHRpb25zLk1heFJldHJ5RXJyb3JgIGV4Y2VwdGlvbi4KCiAgICAgICAgICAgIFBhc3MgYGBOb25lYGAgdG8gcmV0cnkgdW50aWwgeW91IHJlY2VpdmUgYSByZXNwb25zZS4gUGFzcyBhCiAgICAgICAgICAgIDpjbGFzczpgfnVybGxpYjMudXRpbC5yZXRyeS5SZXRyeWAgb2JqZWN0IGZvciBmaW5lLWdyYWluZWQgY29udHJvbAogICAgICAgICAgICBvdmVyIGRpZmZlcmVudCB0eXBlcyBvZiByZXRyaWVzLgogICAgICAgICAgICBQYXNzIGFuIGludGVnZXIgbnVtYmVyIHRvIHJldHJ5IGNvbm5lY3Rpb24gZXJyb3JzIHRoYXQgbWFueSB0aW1lcywKICAgICAgICAgICAgYnV0IG5vIG90aGVyIHR5cGVzIG9mIGVycm9ycy4gUGFzcyB6ZXJvIHRvIG5ldmVyIHJldHJ5LgoKICAgICAgICAgICAgSWYgYGBGYWxzZWBgLCB0aGVuIHJldHJpZXMgYXJlIGRpc2FibGVkIGFuZCBhbnkgZXhjZXB0aW9uIGlzIHJhaXNlZAogICAgICAgICAgICBpbW1lZGlhdGVseS4gQWxzbywgaW5zdGVhZCBvZiByYWlzaW5nIGEgTWF4UmV0cnlFcnJvciBvbiByZWRpcmVjdHMsCiAgICAgICAgICAgIHRoZSByZWRpcmVjdCByZXNwb25zZSB3aWxsIGJlIHJldHVybmVkLgoKICAgICAgICA6dHlwZSByZXRyaWVzOiA6Y2xhc3M6YH51cmxsaWIzLnV0aWwucmV0cnkuUmV0cnlgLCBGYWxzZSwgb3IgYW4gaW50LgoKICAgICAgICA6cGFyYW0gcmVkaXJlY3Q6CiAgICAgICAgICAgIElmIFRydWUsIGF1dG9tYXRpY2FsbHkgaGFuZGxlIHJlZGlyZWN0cyAoc3RhdHVzIGNvZGVzIDMwMSwgMzAyLAogICAgICAgICAgICAzMDMsIDMwNywgMzA4KS4gRWFjaCByZWRpcmVjdCBjb3VudHMgYXMgYSByZXRyeS4gRGlzYWJsaW5nIHJldHJpZXMKICAgICAgICAgICAgd2lsbCBkaXNhYmxlIHJlZGlyZWN0LCB0b28uCgogICAgICAgIDpwYXJhbSBhc3NlcnRfc2FtZV9ob3N0OgogICAgICAgICAgICBJZiBgYFRydWVgYCwgd2lsbCBtYWtlIHN1cmUgdGhhdCB0aGUgaG9zdCBvZiB0aGUgcG9vbCByZXF1ZXN0cyBpcwogICAgICAgICAgICBjb25zaXN0ZW50IGVsc2Ugd2lsbCByYWlzZSBIb3N0Q2hhbmdlZEVycm9yLiBXaGVuIEZhbHNlLCB5b3UgY2FuCiAgICAgICAgICAgIHVzZSB0aGUgcG9vbCBvbiBhbiBIVFRQIHByb3h5IGFuZCByZXF1ZXN0IGZvcmVpZ24gaG9zdHMuCgogICAgICAgIDpwYXJhbSB0aW1lb3V0OgogICAgICAgICAgICBJZiBzcGVjaWZpZWQsIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCB0aW1lb3V0IGZvciB0aGlzIG9uZQogICAgICAgICAgICByZXF1ZXN0LiBJdCBtYXkgYmUgYSBmbG9hdCAoaW4gc2Vjb25kcykgb3IgYW4gaW5zdGFuY2Ugb2YKICAgICAgICAgICAgOmNsYXNzOmB1cmxsaWIzLnV0aWwuVGltZW91dGAuCgogICAgICAgIDpwYXJhbSBwb29sX3RpbWVvdXQ6CiAgICAgICAgICAgIElmIHNldCBhbmQgdGhlIHBvb2wgaXMgc2V0IHRvIGJsb2NrPVRydWUsIHRoZW4gdGhpcyBtZXRob2Qgd2lsbAogICAgICAgICAgICBibG9jayBmb3IgYGBwb29sX3RpbWVvdXRgYCBzZWNvbmRzIGFuZCByYWlzZSBFbXB0eVBvb2xFcnJvciBpZiBubwogICAgICAgICAgICBjb25uZWN0aW9uIGlzIGF2YWlsYWJsZSB3aXRoaW4gdGhlIHRpbWUgcGVyaW9kLgoKICAgICAgICA6cGFyYW0gcmVsZWFzZV9jb25uOgogICAgICAgICAgICBJZiBGYWxzZSwgdGhlbiB0aGUgdXJsb3BlbiBjYWxsIHdpbGwgbm90IHJlbGVhc2UgdGhlIGNvbm5lY3Rpb24KICAgICAgICAgICAgYmFjayBpbnRvIHRoZSBwb29sIG9uY2UgYSByZXNwb25zZSBpcyByZWNlaXZlZCAoYnV0IHdpbGwgcmVsZWFzZSBpZgogICAgICAgICAgICB5b3UgcmVhZCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSByZXNwb25zZSBzdWNoIGFzIHdoZW4KICAgICAgICAgICAgYHByZWxvYWRfY29udGVudD1UcnVlYCkuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSdyZSBub3QgcHJlbG9hZGluZwogICAgICAgICAgICB0aGUgcmVzcG9uc2UncyBjb250ZW50IGltbWVkaWF0ZWx5LiBZb3Ugd2lsbCBuZWVkIHRvIGNhbGwKICAgICAgICAgICAgYGByLnJlbGVhc2VfY29ubigpYGAgb24gdGhlIHJlc3BvbnNlIGBgcmBgIHRvIHJldHVybiB0aGUgY29ubmVjdGlvbgogICAgICAgICAgICBiYWNrIGludG8gdGhlIHBvb2wuIElmIE5vbmUsIGl0IHRha2VzIHRoZSB2YWx1ZSBvZgogICAgICAgICAgICBgYHJlc3BvbnNlX2t3LmdldCgncHJlbG9hZF9jb250ZW50JywgVHJ1ZSlgYC4KCiAgICAgICAgOnBhcmFtIGNodW5rZWQ6CiAgICAgICAgICAgIElmIFRydWUsIHVybGxpYjMgd2lsbCBzZW5kIHRoZSBib2R5IHVzaW5nIGNodW5rZWQgdHJhbnNmZXIKICAgICAgICAgICAgZW5jb2RpbmcuIE90aGVyd2lzZSwgdXJsbGliMyB3aWxsIHNlbmQgdGhlIGJvZHkgdXNpbmcgdGhlIHN0YW5kYXJkCiAgICAgICAgICAgIGNvbnRlbnQtbGVuZ3RoIGZvcm0uIERlZmF1bHRzIHRvIEZhbHNlLgoKICAgICAgICA6cGFyYW0gaW50IGJvZHlfcG9zOgogICAgICAgICAgICBQb3NpdGlvbiB0byBzZWVrIHRvIGluIGZpbGUtbGlrZSBib2R5IGluIHRoZSBldmVudCBvZiBhIHJldHJ5IG9yCiAgICAgICAgICAgIHJlZGlyZWN0LiBUeXBpY2FsbHkgdGhpcyB3b24ndCBuZWVkIHRvIGJlIHNldCBiZWNhdXNlIHVybGxpYjMgd2lsbAogICAgICAgICAgICBhdXRvLXBvcHVsYXRlIHRoZSB2YWx1ZSB3aGVuIG5lZWRlZC4KCiAgICAgICAgOnBhcmFtIFxcKipyZXNwb25zZV9rdzoKICAgICAgICAgICAgQWRkaXRpb25hbCBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdG8KICAgICAgICAgICAgOm1ldGg6YHVybGxpYjMucmVzcG9uc2UuSFRUUFJlc3BvbnNlLmZyb21faHR0cGxpYmAKICAgICAgICAiIiIKICAgICAgICBpZiBoZWFkZXJzIGlzIE5vbmU6CiAgICAgICAgICAgIGhlYWRlcnMgPSBzZWxmLmhlYWRlcnMKCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocmV0cmllcywgUmV0cnkpOgogICAgICAgICAgICByZXRyaWVzID0gUmV0cnkuZnJvbV9pbnQocmV0cmllcywgcmVkaXJlY3Q9cmVkaXJlY3QsIGRlZmF1bHQ9c2VsZi5yZXRyaWVzKQoKICAgICAgICBpZiByZWxlYXNlX2Nvbm4gaXMgTm9uZToKICAgICAgICAgICAgcmVsZWFzZV9jb25uID0gcmVzcG9uc2Vfa3cuZ2V0KCdwcmVsb2FkX2NvbnRlbnQnLCBUcnVlKQoKICAgICAgICAjIENoZWNrIGhvc3QKICAgICAgICBpZiBhc3NlcnRfc2FtZV9ob3N0IGFuZCBub3Qgc2VsZi5pc19zYW1lX2hvc3QodXJsKToKICAgICAgICAgICAgcmFpc2UgSG9zdENoYW5nZWRFcnJvcihzZWxmLCB1cmwsIHJldHJpZXMpCgogICAgICAgIGNvbm4gPSBOb25lCgogICAgICAgICMgVHJhY2sgd2hldGhlciBgY29ubmAgbmVlZHMgdG8gYmUgcmVsZWFzZWQgYmVmb3JlCiAgICAgICAgIyByZXR1cm5pbmcvcmFpc2luZy9yZWN1cnNpbmcuIFVwZGF0ZSB0aGlzIHZhcmlhYmxlIGlmIG5lY2Vzc2FyeSwgYW5kCiAgICAgICAgIyBsZWF2ZSBgcmVsZWFzZV9jb25uYCBjb25zdGFudCB0aHJvdWdob3V0IHRoZSBmdW5jdGlvbi4gVGhhdCB3YXksIGlmCiAgICAgICAgIyB0aGUgZnVuY3Rpb24gcmVjdXJzZXMsIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiBgcmVsZWFzZV9jb25uYCB3aWxsIGJlCiAgICAgICAgIyBwYXNzZWQgZG93biBpbnRvIHRoZSByZWN1cnNpdmUgY2FsbCwgYW5kIGl0cyB2YWx1ZSB3aWxsIGJlIHJlc3BlY3RlZC4KICAgICAgICAjCiAgICAgICAgIyBTZWUgaXNzdWUgIzY1MSBbMV0gZm9yIGRldGFpbHMuCiAgICAgICAgIwogICAgICAgICMgWzFdIDxodHRwczovL2dpdGh1Yi5jb20vc2hhem93L3VybGxpYjMvaXNzdWVzLzY1MT4KICAgICAgICByZWxlYXNlX3RoaXNfY29ubiA9IHJlbGVhc2VfY29ubgoKICAgICAgICAjIE1lcmdlIHRoZSBwcm94eSBoZWFkZXJzLiBPbmx5IGRvIHRoaXMgaW4gSFRUUC4gV2UgaGF2ZSB0byBjb3B5IHRoZQogICAgICAgICMgaGVhZGVycyBkaWN0IHNvIHdlIGNhbiBzYWZlbHkgY2hhbmdlIGl0IHdpdGhvdXQgdGhvc2UgY2hhbmdlcyBiZWluZwogICAgICAgICMgcmVmbGVjdGVkIGluIGFueW9uZSBlbHNlJ3MgY29weS4KICAgICAgICBpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cCc6CiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmNvcHkoKQogICAgICAgICAgICBoZWFkZXJzLnVwZGF0ZShzZWxmLnByb3h5X2hlYWRlcnMpCgogICAgICAgICMgTXVzdCBrZWVwIHRoZSBleGNlcHRpb24gYm91bmQgdG8gYSBzZXBhcmF0ZSB2YXJpYWJsZSBvciBlbHNlIFB5dGhvbiAzCiAgICAgICAgIyBjb21wbGFpbnMgYWJvdXQgVW5ib3VuZExvY2FsRXJyb3IuCiAgICAgICAgZXJyID0gTm9uZQoKICAgICAgICAjIEtlZXAgdHJhY2sgb2Ygd2hldGhlciB3ZSBjbGVhbmx5IGV4aXRlZCB0aGUgZXhjZXB0IGJsb2NrLiBUaGlzCiAgICAgICAgIyBlbnN1cmVzIHdlIGRvIHByb3BlciBjbGVhbnVwIGluIGZpbmFsbHkuCiAgICAgICAgY2xlYW5fZXhpdCA9IEZhbHNlCgogICAgICAgICMgUmV3aW5kIGJvZHkgcG9zaXRpb24sIGlmIG5lZWRlZC4gUmVjb3JkIGN1cnJlbnQgcG9zaXRpb24KICAgICAgICAjIGZvciBmdXR1cmUgcmV3aW5kcyBpbiB0aGUgZXZlbnQgb2YgYSByZWRpcmVjdC9yZXRyeS4KICAgICAgICBib2R5X3BvcyA9IHNldF9maWxlX3Bvc2l0aW9uKGJvZHksIGJvZHlfcG9zKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgUmVxdWVzdCBhIGNvbm5lY3Rpb24gZnJvbSB0aGUgcXVldWUuCiAgICAgICAgICAgIHRpbWVvdXRfb2JqID0gc2VsZi5fZ2V0X3RpbWVvdXQodGltZW91dCkKICAgICAgICAgICAgY29ubiA9IHNlbGYuX2dldF9jb25uKHRpbWVvdXQ9cG9vbF90aW1lb3V0KQoKICAgICAgICAgICAgY29ubi50aW1lb3V0ID0gdGltZW91dF9vYmouY29ubmVjdF90aW1lb3V0CgogICAgICAgICAgICBpc19uZXdfcHJveHlfY29ubiA9IHNlbGYucHJveHkgaXMgbm90IE5vbmUgYW5kIG5vdCBnZXRhdHRyKGNvbm4sICdzb2NrJywgTm9uZSkKICAgICAgICAgICAgaWYgaXNfbmV3X3Byb3h5X2Nvbm46CiAgICAgICAgICAgICAgICBzZWxmLl9wcmVwYXJlX3Byb3h5KGNvbm4pCgogICAgICAgICAgICAjIE1ha2UgdGhlIHJlcXVlc3Qgb24gdGhlIGh0dHBsaWIgY29ubmVjdGlvbiBvYmplY3QuCiAgICAgICAgICAgIGh0dHBsaWJfcmVzcG9uc2UgPSBzZWxmLl9tYWtlX3JlcXVlc3QoY29ubiwgbWV0aG9kLCB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD10aW1lb3V0X29iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5PWJvZHksIGhlYWRlcnM9aGVhZGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua2VkPWNodW5rZWQpCgogICAgICAgICAgICAjIElmIHdlJ3JlIGdvaW5nIHRvIHJlbGVhc2UgdGhlIGNvbm5lY3Rpb24gaW4gYGBmaW5hbGx5OmBgLCB0aGVuCiAgICAgICAgICAgICMgdGhlIHJlc3BvbnNlIGRvZXNuJ3QgbmVlZCB0byBrbm93IGFib3V0IHRoZSBjb25uZWN0aW9uLiBPdGhlcndpc2UKICAgICAgICAgICAgIyBpdCB3aWxsIGFsc28gdHJ5IHRvIHJlbGVhc2UgaXQgYW5kIHdlJ2xsIGhhdmUgYSBkb3VibGUtcmVsZWFzZQogICAgICAgICAgICAjIG1lc3MuCiAgICAgICAgICAgIHJlc3BvbnNlX2Nvbm4gPSBjb25uIGlmIG5vdCByZWxlYXNlX2Nvbm4gZWxzZSBOb25lCgogICAgICAgICAgICAjIFBhc3MgbWV0aG9kIHRvIFJlc3BvbnNlIGZvciBsZW5ndGggY2hlY2tpbmcKICAgICAgICAgICAgcmVzcG9uc2Vfa3dbJ3JlcXVlc3RfbWV0aG9kJ10gPSBtZXRob2QKCiAgICAgICAgICAgICMgSW1wb3J0IGh0dHBsaWIncyByZXNwb25zZSBpbnRvIG91ciBvd24gd3JhcHBlciBvYmplY3QKICAgICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLlJlc3BvbnNlQ2xzLmZyb21faHR0cGxpYihodHRwbGliX3Jlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2w9c2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uPXJlc3BvbnNlX2Nvbm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmllcz1yZXRyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmVzcG9uc2Vfa3cpCgogICAgICAgICAgICAjIEV2ZXJ5dGhpbmcgd2VudCBncmVhdCEKICAgICAgICAgICAgY2xlYW5fZXhpdCA9IFRydWUKCiAgICAgICAgZXhjZXB0IHF1ZXVlLkVtcHR5OgogICAgICAgICAgICAjIFRpbWVkIG91dCBieSBxdWV1ZS4KICAgICAgICAgICAgcmFpc2UgRW1wdHlQb29sRXJyb3Ioc2VsZiwgIk5vIHBvb2wgY29ubmVjdGlvbnMgYXJlIGF2YWlsYWJsZS4iKQoKICAgICAgICBleGNlcHQgKFRpbWVvdXRFcnJvciwgSFRUUEV4Y2VwdGlvbiwgU29ja2V0RXJyb3IsIFByb3RvY29sRXJyb3IsCiAgICAgICAgICAgICAgICBCYXNlU1NMRXJyb3IsIFNTTEVycm9yLCBDZXJ0aWZpY2F0ZUVycm9yKSBhcyBlOgogICAgICAgICAgICAjIERpc2NhcmQgdGhlIGNvbm5lY3Rpb24gZm9yIHRoZXNlIGV4Y2VwdGlvbnMuIEl0IHdpbGwgYmUKICAgICAgICAgICAgIyByZXBsYWNlZCBkdXJpbmcgdGhlIG5leHQgX2dldF9jb25uKCkgY2FsbC4KICAgICAgICAgICAgY2xlYW5fZXhpdCA9IEZhbHNlCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZSwgKEJhc2VTU0xFcnJvciwgQ2VydGlmaWNhdGVFcnJvcikpOgogICAgICAgICAgICAgICAgZSA9IFNTTEVycm9yKGUpCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShlLCAoU29ja2V0RXJyb3IsIE5ld0Nvbm5lY3Rpb25FcnJvcikpIGFuZCBzZWxmLnByb3h5OgogICAgICAgICAgICAgICAgZSA9IFByb3h5RXJyb3IoJ0Nhbm5vdCBjb25uZWN0IHRvIHByb3h5LicsIGUpCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShlLCAoU29ja2V0RXJyb3IsIEhUVFBFeGNlcHRpb24pKToKICAgICAgICAgICAgICAgIGUgPSBQcm90b2NvbEVycm9yKCdDb25uZWN0aW9uIGFib3J0ZWQuJywgZSkKCiAgICAgICAgICAgIHJldHJpZXMgPSByZXRyaWVzLmluY3JlbWVudChtZXRob2QsIHVybCwgZXJyb3I9ZSwgX3Bvb2w9c2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zdGFja3RyYWNlPXN5cy5leGNfaW5mbygpWzJdKQogICAgICAgICAgICByZXRyaWVzLnNsZWVwKCkKCiAgICAgICAgICAgICMgS2VlcCB0cmFjayBvZiB0aGUgZXJyb3IgZm9yIHRoZSByZXRyeSB3YXJuaW5nLgogICAgICAgICAgICBlcnIgPSBlCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGlmIG5vdCBjbGVhbl9leGl0OgogICAgICAgICAgICAgICAgIyBXZSBoaXQgc29tZSBraW5kIG9mIGV4Y2VwdGlvbiwgaGFuZGxlZCBvciBvdGhlcndpc2UuIFdlIG5lZWQKICAgICAgICAgICAgICAgICMgdG8gdGhyb3cgdGhlIGNvbm5lY3Rpb24gYXdheSB1bmxlc3MgZXhwbGljaXRseSB0b2xkIG5vdCB0by4KICAgICAgICAgICAgICAgICMgQ2xvc2UgdGhlIGNvbm5lY3Rpb24sIHNldCB0aGUgdmFyaWFibGUgdG8gTm9uZSwgYW5kIG1ha2Ugc3VyZQogICAgICAgICAgICAgICAgIyB3ZSBwdXQgdGhlIE5vbmUgYmFjayBpbiB0aGUgcG9vbCB0byBhdm9pZCBsZWFraW5nIGl0LgogICAgICAgICAgICAgICAgY29ubiA9IGNvbm4gYW5kIGNvbm4uY2xvc2UoKQogICAgICAgICAgICAgICAgcmVsZWFzZV90aGlzX2Nvbm4gPSBUcnVlCgogICAgICAgICAgICBpZiByZWxlYXNlX3RoaXNfY29ubjoKICAgICAgICAgICAgICAgICMgUHV0IHRoZSBjb25uZWN0aW9uIGJhY2sgdG8gYmUgcmV1c2VkLiBJZiB0aGUgY29ubmVjdGlvbiBpcwogICAgICAgICAgICAgICAgIyBleHBpcmVkIHRoZW4gaXQgd2lsbCBiZSBOb25lLCB3aGljaCB3aWxsIGdldCByZXBsYWNlZCB3aXRoIGEKICAgICAgICAgICAgICAgICMgZnJlc2ggY29ubmVjdGlvbiBkdXJpbmcgX2dldF9jb25uLgogICAgICAgICAgICAgICAgc2VsZi5fcHV0X2Nvbm4oY29ubikKCiAgICAgICAgaWYgbm90IGNvbm46CiAgICAgICAgICAgICMgVHJ5IGFnYWluCiAgICAgICAgICAgIGxvZy53YXJuaW5nKCJSZXRyeWluZyAoJXIpIGFmdGVyIGNvbm5lY3Rpb24gIgogICAgICAgICAgICAgICAgICAgICAgICAiYnJva2VuIGJ5ICclcic6ICVzIiwgcmV0cmllcywgZXJyLCB1cmwpCiAgICAgICAgICAgIHJldHVybiBzZWxmLnVybG9wZW4obWV0aG9kLCB1cmwsIGJvZHksIGhlYWRlcnMsIHJldHJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3QsIGFzc2VydF9zYW1lX2hvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD10aW1lb3V0LCBwb29sX3RpbWVvdXQ9cG9vbF90aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VfY29ubj1yZWxlYXNlX2Nvbm4sIGJvZHlfcG9zPWJvZHlfcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmVzcG9uc2Vfa3cpCgogICAgICAgIGRlZiBkcmFpbl9hbmRfcmVsZWFzZV9jb25uKHJlc3BvbnNlKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIyBkaXNjYXJkIGFueSByZW1haW5pbmcgcmVzcG9uc2UgYm9keSwgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZQogICAgICAgICAgICAgICAgIyByZWxlYXNlZCBiYWNrIHRvIHRoZSBwb29sIG9uY2UgdGhlIGVudGlyZSByZXNwb25zZSBpcyByZWFkCiAgICAgICAgICAgICAgICByZXNwb25zZS5yZWFkKCkKICAgICAgICAgICAgZXhjZXB0IChUaW1lb3V0RXJyb3IsIEhUVFBFeGNlcHRpb24sIFNvY2tldEVycm9yLCBQcm90b2NvbEVycm9yLAogICAgICAgICAgICAgICAgICAgIEJhc2VTU0xFcnJvciwgU1NMRXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgICMgSGFuZGxlIHJlZGlyZWN0PwogICAgICAgIHJlZGlyZWN0X2xvY2F0aW9uID0gcmVkaXJlY3QgYW5kIHJlc3BvbnNlLmdldF9yZWRpcmVjdF9sb2NhdGlvbigpCiAgICAgICAgaWYgcmVkaXJlY3RfbG9jYXRpb246CiAgICAgICAgICAgIGlmIHJlc3BvbnNlLnN0YXR1cyA9PSAzMDM6CiAgICAgICAgICAgICAgICBtZXRob2QgPSAnR0VUJwoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0cmllcyA9IHJldHJpZXMuaW5jcmVtZW50KG1ldGhvZCwgdXJsLCByZXNwb25zZT1yZXNwb25zZSwgX3Bvb2w9c2VsZikKICAgICAgICAgICAgZXhjZXB0IE1heFJldHJ5RXJyb3I6CiAgICAgICAgICAgICAgICBpZiByZXRyaWVzLnJhaXNlX29uX3JlZGlyZWN0OgogICAgICAgICAgICAgICAgICAgICMgRHJhaW4gYW5kIHJlbGVhc2UgdGhlIGNvbm5lY3Rpb24gZm9yIHRoaXMgcmVzcG9uc2UsIHNpbmNlCiAgICAgICAgICAgICAgICAgICAgIyB3ZSdyZSBub3QgcmV0dXJuaW5nIGl0IHRvIGJlIHJlbGVhc2VkIG1hbnVhbGx5LgogICAgICAgICAgICAgICAgICAgIGRyYWluX2FuZF9yZWxlYXNlX2Nvbm4ocmVzcG9uc2UpCiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZQoKICAgICAgICAgICAgIyBkcmFpbiBhbmQgcmV0dXJuIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBwb29sIGJlZm9yZSByZWN1cnNpbmcKICAgICAgICAgICAgZHJhaW5fYW5kX3JlbGVhc2VfY29ubihyZXNwb25zZSkKCiAgICAgICAgICAgIHJldHJpZXMuc2xlZXBfZm9yX3JldHJ5KHJlc3BvbnNlKQogICAgICAgICAgICBsb2cuZGVidWcoIlJlZGlyZWN0aW5nICVzIC0+ICVzIiwgdXJsLCByZWRpcmVjdF9sb2NhdGlvbikKICAgICAgICAgICAgcmV0dXJuIHNlbGYudXJsb3BlbigKICAgICAgICAgICAgICAgIG1ldGhvZCwgcmVkaXJlY3RfbG9jYXRpb24sIGJvZHksIGhlYWRlcnMsCiAgICAgICAgICAgICAgICByZXRyaWVzPXJldHJpZXMsIHJlZGlyZWN0PXJlZGlyZWN0LAogICAgICAgICAgICAgICAgYXNzZXJ0X3NhbWVfaG9zdD1hc3NlcnRfc2FtZV9ob3N0LAogICAgICAgICAgICAgICAgdGltZW91dD10aW1lb3V0LCBwb29sX3RpbWVvdXQ9cG9vbF90aW1lb3V0LAogICAgICAgICAgICAgICAgcmVsZWFzZV9jb25uPXJlbGVhc2VfY29ubiwgYm9keV9wb3M9Ym9keV9wb3MsCiAgICAgICAgICAgICAgICAqKnJlc3BvbnNlX2t3KQoKICAgICAgICAjIENoZWNrIGlmIHdlIHNob3VsZCByZXRyeSB0aGUgSFRUUCByZXNwb25zZS4KICAgICAgICBoYXNfcmV0cnlfYWZ0ZXIgPSBib29sKHJlc3BvbnNlLmdldGhlYWRlcignUmV0cnktQWZ0ZXInKSkKICAgICAgICBpZiByZXRyaWVzLmlzX3JldHJ5KG1ldGhvZCwgcmVzcG9uc2Uuc3RhdHVzLCBoYXNfcmV0cnlfYWZ0ZXIpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXRyaWVzID0gcmV0cmllcy5pbmNyZW1lbnQobWV0aG9kLCB1cmwsIHJlc3BvbnNlPXJlc3BvbnNlLCBfcG9vbD1zZWxmKQogICAgICAgICAgICBleGNlcHQgTWF4UmV0cnlFcnJvcjoKICAgICAgICAgICAgICAgIGlmIHJldHJpZXMucmFpc2Vfb25fc3RhdHVzOgogICAgICAgICAgICAgICAgICAgICMgRHJhaW4gYW5kIHJlbGVhc2UgdGhlIGNvbm5lY3Rpb24gZm9yIHRoaXMgcmVzcG9uc2UsIHNpbmNlCiAgICAgICAgICAgICAgICAgICAgIyB3ZSdyZSBub3QgcmV0dXJuaW5nIGl0IHRvIGJlIHJlbGVhc2VkIG1hbnVhbGx5LgogICAgICAgICAgICAgICAgICAgIGRyYWluX2FuZF9yZWxlYXNlX2Nvbm4ocmVzcG9uc2UpCiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZQoKICAgICAgICAgICAgIyBkcmFpbiBhbmQgcmV0dXJuIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBwb29sIGJlZm9yZSByZWN1cnNpbmcKICAgICAgICAgICAgZHJhaW5fYW5kX3JlbGVhc2VfY29ubihyZXNwb25zZSkKCiAgICAgICAgICAgIHJldHJpZXMuc2xlZXAocmVzcG9uc2UpCiAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmV0cnk6ICVzIiwgdXJsKQogICAgICAgICAgICByZXR1cm4gc2VsZi51cmxvcGVuKAogICAgICAgICAgICAgICAgbWV0aG9kLCB1cmwsIGJvZHksIGhlYWRlcnMsCiAgICAgICAgICAgICAgICByZXRyaWVzPXJldHJpZXMsIHJlZGlyZWN0PXJlZGlyZWN0LAogICAgICAgICAgICAgICAgYXNzZXJ0X3NhbWVfaG9zdD1hc3NlcnRfc2FtZV9ob3N0LAogICAgICAgICAgICAgICAgdGltZW91dD10aW1lb3V0LCBwb29sX3RpbWVvdXQ9cG9vbF90aW1lb3V0LAogICAgICAgICAgICAgICAgcmVsZWFzZV9jb25uPXJlbGVhc2VfY29ubiwKICAgICAgICAgICAgICAgIGJvZHlfcG9zPWJvZHlfcG9zLCAqKnJlc3BvbnNlX2t3KQoKICAgICAgICByZXR1cm4gcmVzcG9uc2UKCgpjbGFzcyBIVFRQU0Nvbm5lY3Rpb25Qb29sKEhUVFBDb25uZWN0aW9uUG9vbCk6CiAgICAiIiIKICAgIFNhbWUgYXMgOmNsYXNzOmAuSFRUUENvbm5lY3Rpb25Qb29sYCwgYnV0IEhUVFBTLgoKICAgIFdoZW4gUHl0aG9uIGlzIGNvbXBpbGVkIHdpdGggdGhlIDptb2Q6YHNzbGAgbW9kdWxlLCB0aGVuCiAgICA6Y2xhc3M6YC5WZXJpZmllZEhUVFBTQ29ubmVjdGlvbmAgaXMgdXNlZCwgd2hpY2ggKmNhbiogdmVyaWZ5IGNlcnRpZmljYXRlcywKICAgIGluc3RlYWQgb2YgOmNsYXNzOmAuSFRUUFNDb25uZWN0aW9uYC4KCiAgICA6Y2xhc3M6YC5WZXJpZmllZEhUVFBTQ29ubmVjdGlvbmAgdXNlcyBvbmUgb2YgYGBhc3NlcnRfZmluZ2VycHJpbnRgYCwKICAgIGBgYXNzZXJ0X2hvc3RuYW1lYGAgYW5kIGBgaG9zdGBgIGluIHRoaXMgb3JkZXIgdG8gdmVyaWZ5IGNvbm5lY3Rpb25zLgogICAgSWYgYGBhc3NlcnRfaG9zdG5hbWVgYCBpcyBGYWxzZSwgbm8gdmVyaWZpY2F0aW9uIGlzIGRvbmUuCgogICAgVGhlIGBga2V5X2ZpbGVgYCwgYGBjZXJ0X2ZpbGVgYCwgYGBjZXJ0X3JlcXNgYCwgYGBjYV9jZXJ0c2BgLAogICAgYGBjYV9jZXJ0X2RpcmBgLCBhbmQgYGBzc2xfdmVyc2lvbmBgIGFyZSBvbmx5IHVzZWQgaWYgOm1vZDpgc3NsYCBpcwogICAgYXZhaWxhYmxlIGFuZCBhcmUgZmVkIGludG8gOm1ldGg6YHVybGxpYjMudXRpbC5zc2xfd3JhcF9zb2NrZXRgIHRvIHVwZ3JhZGUKICAgIHRoZSBjb25uZWN0aW9uIHNvY2tldCBpbnRvIGFuIFNTTCBzb2NrZXQuCiAgICAiIiIKCiAgICBzY2hlbWUgPSAnaHR0cHMnCiAgICBDb25uZWN0aW9uQ2xzID0gSFRUUFNDb25uZWN0aW9uCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQ9Tm9uZSwKICAgICAgICAgICAgICAgICBzdHJpY3Q9RmFsc2UsIHRpbWVvdXQ9VGltZW91dC5ERUZBVUxUX1RJTUVPVVQsIG1heHNpemU9MSwKICAgICAgICAgICAgICAgICBibG9jaz1GYWxzZSwgaGVhZGVycz1Ob25lLCByZXRyaWVzPU5vbmUsCiAgICAgICAgICAgICAgICAgX3Byb3h5PU5vbmUsIF9wcm94eV9oZWFkZXJzPU5vbmUsCiAgICAgICAgICAgICAgICAga2V5X2ZpbGU9Tm9uZSwgY2VydF9maWxlPU5vbmUsIGNlcnRfcmVxcz1Ob25lLAogICAgICAgICAgICAgICAgIGNhX2NlcnRzPU5vbmUsIHNzbF92ZXJzaW9uPU5vbmUsCiAgICAgICAgICAgICAgICAgYXNzZXJ0X2hvc3RuYW1lPU5vbmUsIGFzc2VydF9maW5nZXJwcmludD1Ob25lLAogICAgICAgICAgICAgICAgIGNhX2NlcnRfZGlyPU5vbmUsICoqY29ubl9rdyk6CgogICAgICAgIEhUVFBDb25uZWN0aW9uUG9vbC5fX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0LCBzdHJpY3QsIHRpbWVvdXQsIG1heHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLCBoZWFkZXJzLCByZXRyaWVzLCBfcHJveHksIF9wcm94eV9oZWFkZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmNvbm5fa3cpCgogICAgICAgIGlmIGNhX2NlcnRzIGFuZCBjZXJ0X3JlcXMgaXMgTm9uZToKICAgICAgICAgICAgY2VydF9yZXFzID0gJ0NFUlRfUkVRVUlSRUQnCgogICAgICAgIHNlbGYua2V5X2ZpbGUgPSBrZXlfZmlsZQogICAgICAgIHNlbGYuY2VydF9maWxlID0gY2VydF9maWxlCiAgICAgICAgc2VsZi5jZXJ0X3JlcXMgPSBjZXJ0X3JlcXMKICAgICAgICBzZWxmLmNhX2NlcnRzID0gY2FfY2VydHMKICAgICAgICBzZWxmLmNhX2NlcnRfZGlyID0gY2FfY2VydF9kaXIKICAgICAgICBzZWxmLnNzbF92ZXJzaW9uID0gc3NsX3ZlcnNpb24KICAgICAgICBzZWxmLmFzc2VydF9ob3N0bmFtZSA9IGFzc2VydF9ob3N0bmFtZQogICAgICAgIHNlbGYuYXNzZXJ0X2ZpbmdlcnByaW50ID0gYXNzZXJ0X2ZpbmdlcnByaW50CgogICAgZGVmIF9wcmVwYXJlX2Nvbm4oc2VsZiwgY29ubik6CiAgICAgICAgIiIiCiAgICAgICAgUHJlcGFyZSB0aGUgYGBjb25uZWN0aW9uYGAgZm9yIDptZXRoOmB1cmxsaWIzLnV0aWwuc3NsX3dyYXBfc29ja2V0YAogICAgICAgIGFuZCBlc3RhYmxpc2ggdGhlIHR1bm5lbCBpZiBwcm94eSBpcyB1c2VkLgogICAgICAgICIiIgoKICAgICAgICBpZiBpc2luc3RhbmNlKGNvbm4sIFZlcmlmaWVkSFRUUFNDb25uZWN0aW9uKToKICAgICAgICAgICAgY29ubi5zZXRfY2VydChrZXlfZmlsZT1zZWxmLmtleV9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfZmlsZT1zZWxmLmNlcnRfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c2VsZi5jZXJ0X3JlcXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9c2VsZi5jYV9jZXJ0cywKICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0X2Rpcj1zZWxmLmNhX2NlcnRfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydF9ob3N0bmFtZT1zZWxmLmFzc2VydF9ob3N0bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRfZmluZ2VycHJpbnQ9c2VsZi5hc3NlcnRfZmluZ2VycHJpbnQpCiAgICAgICAgICAgIGNvbm4uc3NsX3ZlcnNpb24gPSBzZWxmLnNzbF92ZXJzaW9uCiAgICAgICAgcmV0dXJuIGNvbm4KCiAgICBkZWYgX3ByZXBhcmVfcHJveHkoc2VsZiwgY29ubik6CiAgICAgICAgIiIiCiAgICAgICAgRXN0YWJsaXNoIHR1bm5lbCBjb25uZWN0aW9uIGVhcmx5LCBiZWNhdXNlIG90aGVyd2lzZSBodHRwbGliCiAgICAgICAgd291bGQgaW1wcm9wZXJseSBzZXQgSG9zdDogaGVhZGVyIHRvIHByb3h5J3MgSVA6cG9ydC4KICAgICAgICAiIiIKICAgICAgICAjIFB5dGhvbiAyLjcrCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZXRfdHVubmVsID0gY29ubi5zZXRfdHVubmVsCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDIuNgogICAgICAgICAgICBzZXRfdHVubmVsID0gY29ubi5fc2V0X3R1bm5lbAoKICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDw9ICgyLCA2LCA0KSBhbmQgbm90IHNlbGYucHJveHlfaGVhZGVyczogICMgUHl0aG9uIDIuNi40IGFuZCBvbGRlcgogICAgICAgICAgICBzZXRfdHVubmVsKHNlbGYuX3Byb3h5X2hvc3QsIHNlbGYucG9ydCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZXRfdHVubmVsKHNlbGYuX3Byb3h5X2hvc3QsIHNlbGYucG9ydCwgc2VsZi5wcm94eV9oZWFkZXJzKQoKICAgICAgICBjb25uLmNvbm5lY3QoKQoKICAgIGRlZiBfbmV3X2Nvbm4oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgZnJlc2ggOmNsYXNzOmBodHRwbGliLkhUVFBTQ29ubmVjdGlvbmAuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5udW1fY29ubmVjdGlvbnMgKz0gMQogICAgICAgIGxvZy5kZWJ1ZygiU3RhcnRpbmcgbmV3IEhUVFBTIGNvbm5lY3Rpb24gKCVkKTogJXMiLAogICAgICAgICAgICAgICAgICBzZWxmLm51bV9jb25uZWN0aW9ucywgc2VsZi5ob3N0KQoKICAgICAgICBpZiBub3Qgc2VsZi5Db25uZWN0aW9uQ2xzIG9yIHNlbGYuQ29ubmVjdGlvbkNscyBpcyBEdW1teUNvbm5lY3Rpb246CiAgICAgICAgICAgIHJhaXNlIFNTTEVycm9yKCJDYW4ndCBjb25uZWN0IHRvIEhUVFBTIFVSTCBiZWNhdXNlIHRoZSBTU0wgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kdWxlIGlzIG5vdCBhdmFpbGFibGUuIikKCiAgICAgICAgYWN0dWFsX2hvc3QgPSBzZWxmLmhvc3QKICAgICAgICBhY3R1YWxfcG9ydCA9IHNlbGYucG9ydAogICAgICAgIGlmIHNlbGYucHJveHkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGFjdHVhbF9ob3N0ID0gc2VsZi5wcm94eS5ob3N0CiAgICAgICAgICAgIGFjdHVhbF9wb3J0ID0gc2VsZi5wcm94eS5wb3J0CgogICAgICAgIGNvbm4gPSBzZWxmLkNvbm5lY3Rpb25DbHMoaG9zdD1hY3R1YWxfaG9zdCwgcG9ydD1hY3R1YWxfcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9c2VsZi50aW1lb3V0LmNvbm5lY3RfdGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdD1zZWxmLnN0cmljdCwgKipzZWxmLmNvbm5fa3cpCgogICAgICAgIHJldHVybiBzZWxmLl9wcmVwYXJlX2Nvbm4oY29ubikKCiAgICBkZWYgX3ZhbGlkYXRlX2Nvbm4oc2VsZiwgY29ubik6CiAgICAgICAgIiIiCiAgICAgICAgQ2FsbGVkIHJpZ2h0IGJlZm9yZSBhIHJlcXVlc3QgaXMgbWFkZSwgYWZ0ZXIgdGhlIHNvY2tldCBpcyBjcmVhdGVkLgogICAgICAgICIiIgogICAgICAgIHN1cGVyKEhUVFBTQ29ubmVjdGlvblBvb2wsIHNlbGYpLl92YWxpZGF0ZV9jb25uKGNvbm4pCgogICAgICAgICMgRm9yY2UgY29ubmVjdCBlYXJseSB0byBhbGxvdyB1cyB0byB2YWxpZGF0ZSB0aGUgY29ubmVjdGlvbi4KICAgICAgICBpZiBub3QgZ2V0YXR0cihjb25uLCAnc29jaycsIE5vbmUpOiAgIyBBcHBFbmdpbmUgbWlnaHQgbm90IGhhdmUgIGAuc29ja2AKICAgICAgICAgICAgY29ubi5jb25uZWN0KCkKCiAgICAgICAgaWYgbm90IGNvbm4uaXNfdmVyaWZpZWQ6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oKAogICAgICAgICAgICAgICAgJ1VudmVyaWZpZWQgSFRUUFMgcmVxdWVzdCBpcyBiZWluZyBtYWRlLiAnCiAgICAgICAgICAgICAgICAnQWRkaW5nIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBpcyBzdHJvbmdseSBhZHZpc2VkLiBTZWU6ICcKICAgICAgICAgICAgICAgICdodHRwczovL3VybGxpYjMucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2FkdmFuY2VkLXVzYWdlLmh0bWwnCiAgICAgICAgICAgICAgICAnI3NzbC13YXJuaW5ncycpLAogICAgICAgICAgICAgICAgSW5zZWN1cmVSZXF1ZXN0V2FybmluZykKCgpkZWYgY29ubmVjdGlvbl9mcm9tX3VybCh1cmwsICoqa3cpOgogICAgIiIiCiAgICBHaXZlbiBhIHVybCwgcmV0dXJuIGFuIDpjbGFzczpgLkNvbm5lY3Rpb25Qb29sYCBpbnN0YW5jZSBvZiBpdHMgaG9zdC4KCiAgICBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yIG5vdCBoYXZpbmcgdG8gcGFyc2Ugb3V0IHRoZSBzY2hlbWUsIGhvc3QsIGFuZCBwb3J0CiAgICBvZiB0aGUgdXJsIGJlZm9yZSBjcmVhdGluZyBhbiA6Y2xhc3M6YC5Db25uZWN0aW9uUG9vbGAgaW5zdGFuY2UuCgogICAgOnBhcmFtIHVybDoKICAgICAgICBBYnNvbHV0ZSBVUkwgc3RyaW5nIHRoYXQgbXVzdCBpbmNsdWRlIHRoZSBzY2hlbWUuIFBvcnQgaXMgb3B0aW9uYWwuCgogICAgOnBhcmFtIFxcKiprdzoKICAgICAgICBQYXNzZXMgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgYXBwcm9wcmlhdGUKICAgICAgICA6Y2xhc3M6YC5Db25uZWN0aW9uUG9vbGAuIFVzZWZ1bCBmb3Igc3BlY2lmeWluZyB0aGluZ3MgbGlrZQogICAgICAgIHRpbWVvdXQsIG1heHNpemUsIGhlYWRlcnMsIGV0Yy4KCiAgICBFeGFtcGxlOjoKCiAgICAgICAgPj4+IGNvbm4gPSBjb25uZWN0aW9uX2Zyb21fdXJsKCdodHRwOi8vZ29vZ2xlLmNvbS8nKQogICAgICAgID4+PiByID0gY29ubi5yZXF1ZXN0KCdHRVQnLCAnLycpCiAgICAiIiIKICAgIHNjaGVtZSwgaG9zdCwgcG9ydCA9IGdldF9ob3N0KHVybCkKICAgIHBvcnQgPSBwb3J0IG9yIHBvcnRfYnlfc2NoZW1lLmdldChzY2hlbWUsIDgwKQogICAgaWYgc2NoZW1lID09ICdodHRwcyc6CiAgICAgICAgcmV0dXJuIEhUVFBTQ29ubmVjdGlvblBvb2woaG9zdCwgcG9ydD1wb3J0LCAqKmt3KQogICAgZWxzZToKICAgICAgICByZXR1cm4gSFRUUENvbm5lY3Rpb25Qb29sKGhvc3QsIHBvcnQ9cG9ydCwgKiprdykKCgpkZWYgX2lwdjZfaG9zdChob3N0KToKICAgICIiIgogICAgUHJvY2VzcyBJUHY2IGFkZHJlc3MgbGl0ZXJhbHMKICAgICIiIgoKICAgICMgaHR0cGxpYiBkb2Vzbid0IGxpa2UgaXQgd2hlbiB3ZSBpbmNsdWRlIGJyYWNrZXRzIGluIElQdjYgYWRkcmVzc2VzCiAgICAjIFNwZWNpZmljYWxseSwgaWYgd2UgaW5jbHVkZSBicmFja2V0cyBidXQgYWxzbyBwYXNzIHRoZSBwb3J0IHRoZW4KICAgICMgaHR0cGxpYiBjcmF6aWx5IGRvdWJsZXMgdXAgdGhlIHNxdWFyZSBicmFja2V0cyBvbiB0aGUgSG9zdCBoZWFkZXIuCiAgICAjIEluc3RlYWQsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIG5ldmVyIHBhc3MgYGBOb25lYGAgYXMgdGhlIHBvcnQuCiAgICAjIEhvd2V2ZXIsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2UgY2FuJ3QgYWN0dWFsbHkKICAgICMgKmFzc2VydCogdGhhdC4gIFNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjg1MzkKICAgICMKICAgICMgQWxzbyBpZiBhbiBJUHY2IGFkZHJlc3MgbGl0ZXJhbCBoYXMgYSB6b25lIGlkZW50aWZpZXIsIHRoZQogICAgIyBwZXJjZW50IHNpZ24gbWlnaHQgYmUgVVJJZW5jb2RlZCwgY29udmVydCBpdCBiYWNrIGludG8gQVNDSUkKICAgIGlmIGhvc3Quc3RhcnRzd2l0aCgnWycpIGFuZCBob3N0LmVuZHN3aXRoKCddJyk6CiAgICAgICAgaG9zdCA9IGhvc3QucmVwbGFjZSgnJTI1JywgJyUnKS5zdHJpcCgnW10nKQogICAgcmV0dXJuIGhvc3QKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAA3AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAASAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvX3NlY3VyZXRyYW5zcG9ydC9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAt1mLfZhEAACYRAAASAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvX3NlY3VyZXRyYW5zcG9ydC9iaW5kaW5ncy5weSIiIgpUaGlzIG1vZHVsZSB1c2VzIGN0eXBlcyB0byBiaW5kIGEgd2hvbGUgYnVuY2ggb2YgZnVuY3Rpb25zIGFuZCBjb25zdGFudHMgZnJvbQpTZWN1cmVUcmFuc3BvcnQuIFRoZSBnb2FsIGhlcmUgaXMgdG8gcHJvdmlkZSB0aGUgbG93LWxldmVsIEFQSSB0bwpTZWN1cmVUcmFuc3BvcnQuIFRoZXNlIGFyZSBlc3NlbnRpYWxseSB0aGUgQy1sZXZlbCBmdW5jdGlvbnMgYW5kIGNvbnN0YW50cywgYW5kCnRoZXkncmUgcHJldHR5IGdyb3NzIHRvIHdvcmsgd2l0aC4KClRoaXMgY29kZSBpcyBhIGJhc3RhcmRpc2VkIHZlcnNpb24gb2YgdGhlIGNvZGUgZm91bmQgaW4gV2lsbCBCb25kJ3Mgb3NjcnlwdG8KbGlicmFyeS4gQW4gZW5vcm1vdXMgZGVidCBpcyBvd2VkIHRvIGhpbSBmb3IgYmxhemluZyB0aGlzIHRyYWlsIGZvciB1cy4gRm9yCnRoYXQgcmVhc29uLCB0aGlzIGNvZGUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgY292ZXJlZCBib3RoIGJ5IHVybGxpYjMncwpsaWNlbnNlIGFuZCBieSBvc2NyeXB0bydzOgoKICAgIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IFdpbGwgQm9uZCA8d2lsbEB3Ym9uZC5uZXQ+CgogICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKICAgIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCiAgICB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAgICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKICAgIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQogICAgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCiAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgogICAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICAgIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiAgICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAgICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwogICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgogICAgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBwbGF0Zm9ybQpmcm9tIGN0eXBlcy51dGlsIGltcG9ydCBmaW5kX2xpYnJhcnkKZnJvbSBjdHlwZXMgaW1wb3J0ICgKICAgIGNfdm9pZF9wLCBjX2ludDMyLCBjX2NoYXJfcCwgY19zaXplX3QsIGNfYnl0ZSwgY191aW50MzIsIGNfdWxvbmcsIGNfbG9uZywKICAgIGNfYm9vbAopCmZyb20gY3R5cGVzIGltcG9ydCBDRExMLCBQT0lOVEVSLCBDRlVOQ1RZUEUKCgpzZWN1cml0eV9wYXRoID0gZmluZF9saWJyYXJ5KCdTZWN1cml0eScpCmlmIG5vdCBzZWN1cml0eV9wYXRoOgogICAgcmFpc2UgSW1wb3J0RXJyb3IoJ1RoZSBsaWJyYXJ5IFNlY3VyaXR5IGNvdWxkIG5vdCBiZSBmb3VuZCcpCgoKY29yZV9mb3VuZGF0aW9uX3BhdGggPSBmaW5kX2xpYnJhcnkoJ0NvcmVGb3VuZGF0aW9uJykKaWYgbm90IGNvcmVfZm91bmRhdGlvbl9wYXRoOgogICAgcmFpc2UgSW1wb3J0RXJyb3IoJ1RoZSBsaWJyYXJ5IENvcmVGb3VuZGF0aW9uIGNvdWxkIG5vdCBiZSBmb3VuZCcpCgoKdmVyc2lvbiA9IHBsYXRmb3JtLm1hY192ZXIoKVswXQp2ZXJzaW9uX2luZm8gPSB0dXBsZShtYXAoaW50LCB2ZXJzaW9uLnNwbGl0KCcuJykpKQppZiB2ZXJzaW9uX2luZm8gPCAoMTAsIDgpOgogICAgcmFpc2UgT1NFcnJvcigKICAgICAgICAnT25seSBPUyBYIDEwLjggYW5kIG5ld2VyIGFyZSBzdXBwb3J0ZWQsIG5vdCAlcy4lcycgJSAoCiAgICAgICAgICAgIHZlcnNpb25faW5mb1swXSwgdmVyc2lvbl9pbmZvWzFdCiAgICAgICAgKQogICAgKQoKU2VjdXJpdHkgPSBDRExMKHNlY3VyaXR5X3BhdGgsIHVzZV9lcnJubz1UcnVlKQpDb3JlRm91bmRhdGlvbiA9IENETEwoY29yZV9mb3VuZGF0aW9uX3BhdGgsIHVzZV9lcnJubz1UcnVlKQoKQm9vbGVhbiA9IGNfYm9vbApDRkluZGV4ID0gY19sb25nCkNGU3RyaW5nRW5jb2RpbmcgPSBjX3VpbnQzMgpDRkRhdGEgPSBjX3ZvaWRfcApDRlN0cmluZyA9IGNfdm9pZF9wCkNGQXJyYXkgPSBjX3ZvaWRfcApDRk11dGFibGVBcnJheSA9IGNfdm9pZF9wCkNGRGljdGlvbmFyeSA9IGNfdm9pZF9wCkNGRXJyb3IgPSBjX3ZvaWRfcApDRlR5cGUgPSBjX3ZvaWRfcApDRlR5cGVJRCA9IGNfdWxvbmcKCkNGVHlwZVJlZiA9IFBPSU5URVIoQ0ZUeXBlKQpDRkFsbG9jYXRvclJlZiA9IGNfdm9pZF9wCgpPU1N0YXR1cyA9IGNfaW50MzIKCkNGRGF0YVJlZiA9IFBPSU5URVIoQ0ZEYXRhKQpDRlN0cmluZ1JlZiA9IFBPSU5URVIoQ0ZTdHJpbmcpCkNGQXJyYXlSZWYgPSBQT0lOVEVSKENGQXJyYXkpCkNGTXV0YWJsZUFycmF5UmVmID0gUE9JTlRFUihDRk11dGFibGVBcnJheSkKQ0ZEaWN0aW9uYXJ5UmVmID0gUE9JTlRFUihDRkRpY3Rpb25hcnkpCkNGQXJyYXlDYWxsQmFja3MgPSBjX3ZvaWRfcApDRkRpY3Rpb25hcnlLZXlDYWxsQmFja3MgPSBjX3ZvaWRfcApDRkRpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcyA9IGNfdm9pZF9wCgpTZWNDZXJ0aWZpY2F0ZVJlZiA9IFBPSU5URVIoY192b2lkX3ApClNlY0V4dGVybmFsRm9ybWF0ID0gY191aW50MzIKU2VjRXh0ZXJuYWxJdGVtVHlwZSA9IGNfdWludDMyClNlY0lkZW50aXR5UmVmID0gUE9JTlRFUihjX3ZvaWRfcCkKU2VjSXRlbUltcG9ydEV4cG9ydEZsYWdzID0gY191aW50MzIKU2VjSXRlbUltcG9ydEV4cG9ydEtleVBhcmFtZXRlcnMgPSBjX3ZvaWRfcApTZWNLZXljaGFpblJlZiA9IFBPSU5URVIoY192b2lkX3ApClNTTFByb3RvY29sID0gY191aW50MzIKU1NMQ2lwaGVyU3VpdGUgPSBjX3VpbnQzMgpTU0xDb250ZXh0UmVmID0gUE9JTlRFUihjX3ZvaWRfcCkKU2VjVHJ1c3RSZWYgPSBQT0lOVEVSKGNfdm9pZF9wKQpTU0xDb25uZWN0aW9uUmVmID0gY191aW50MzIKU2VjVHJ1c3RSZXN1bHRUeXBlID0gY191aW50MzIKU2VjVHJ1c3RPcHRpb25GbGFncyA9IGNfdWludDMyClNTTFByb3RvY29sU2lkZSA9IGNfdWludDMyClNTTENvbm5lY3Rpb25UeXBlID0gY191aW50MzIKU1NMU2Vzc2lvbk9wdGlvbiA9IGNfdWludDMyCgoKdHJ5OgogICAgU2VjdXJpdHkuU2VjSXRlbUltcG9ydC5hcmd0eXBlcyA9IFsKICAgICAgICBDRkRhdGFSZWYsCiAgICAgICAgQ0ZTdHJpbmdSZWYsCiAgICAgICAgUE9JTlRFUihTZWNFeHRlcm5hbEZvcm1hdCksCiAgICAgICAgUE9JTlRFUihTZWNFeHRlcm5hbEl0ZW1UeXBlKSwKICAgICAgICBTZWNJdGVtSW1wb3J0RXhwb3J0RmxhZ3MsCiAgICAgICAgUE9JTlRFUihTZWNJdGVtSW1wb3J0RXhwb3J0S2V5UGFyYW1ldGVycyksCiAgICAgICAgU2VjS2V5Y2hhaW5SZWYsCiAgICAgICAgUE9JTlRFUihDRkFycmF5UmVmKSwKICAgIF0KICAgIFNlY3VyaXR5LlNlY0l0ZW1JbXBvcnQucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU2VjQ2VydGlmaWNhdGVHZXRUeXBlSUQuYXJndHlwZXMgPSBbXQogICAgU2VjdXJpdHkuU2VjQ2VydGlmaWNhdGVHZXRUeXBlSUQucmVzdHlwZSA9IENGVHlwZUlECgogICAgU2VjdXJpdHkuU2VjSWRlbnRpdHlHZXRUeXBlSUQuYXJndHlwZXMgPSBbXQogICAgU2VjdXJpdHkuU2VjSWRlbnRpdHlHZXRUeXBlSUQucmVzdHlwZSA9IENGVHlwZUlECgogICAgU2VjdXJpdHkuU2VjS2V5R2V0VHlwZUlELmFyZ3R5cGVzID0gW10KICAgIFNlY3VyaXR5LlNlY0tleUdldFR5cGVJRC5yZXN0eXBlID0gQ0ZUeXBlSUQKCiAgICBTZWN1cml0eS5TZWNDZXJ0aWZpY2F0ZUNyZWF0ZVdpdGhEYXRhLmFyZ3R5cGVzID0gWwogICAgICAgIENGQWxsb2NhdG9yUmVmLAogICAgICAgIENGRGF0YVJlZgogICAgXQogICAgU2VjdXJpdHkuU2VjQ2VydGlmaWNhdGVDcmVhdGVXaXRoRGF0YS5yZXN0eXBlID0gU2VjQ2VydGlmaWNhdGVSZWYKCiAgICBTZWN1cml0eS5TZWNDZXJ0aWZpY2F0ZUNvcHlEYXRhLmFyZ3R5cGVzID0gWwogICAgICAgIFNlY0NlcnRpZmljYXRlUmVmCiAgICBdCiAgICBTZWN1cml0eS5TZWNDZXJ0aWZpY2F0ZUNvcHlEYXRhLnJlc3R5cGUgPSBDRkRhdGFSZWYKCiAgICBTZWN1cml0eS5TZWNDb3B5RXJyb3JNZXNzYWdlU3RyaW5nLmFyZ3R5cGVzID0gWwogICAgICAgIE9TU3RhdHVzLAogICAgICAgIGNfdm9pZF9wCiAgICBdCiAgICBTZWN1cml0eS5TZWNDb3B5RXJyb3JNZXNzYWdlU3RyaW5nLnJlc3R5cGUgPSBDRlN0cmluZ1JlZgoKICAgIFNlY3VyaXR5LlNlY0lkZW50aXR5Q3JlYXRlV2l0aENlcnRpZmljYXRlLmFyZ3R5cGVzID0gWwogICAgICAgIENGVHlwZVJlZiwKICAgICAgICBTZWNDZXJ0aWZpY2F0ZVJlZiwKICAgICAgICBQT0lOVEVSKFNlY0lkZW50aXR5UmVmKQogICAgXQogICAgU2VjdXJpdHkuU2VjSWRlbnRpdHlDcmVhdGVXaXRoQ2VydGlmaWNhdGUucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU2VjS2V5Y2hhaW5DcmVhdGUuYXJndHlwZXMgPSBbCiAgICAgICAgY19jaGFyX3AsCiAgICAgICAgY191aW50MzIsCiAgICAgICAgY192b2lkX3AsCiAgICAgICAgQm9vbGVhbiwKICAgICAgICBjX3ZvaWRfcCwKICAgICAgICBQT0lOVEVSKFNlY0tleWNoYWluUmVmKQogICAgXQogICAgU2VjdXJpdHkuU2VjS2V5Y2hhaW5DcmVhdGUucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU2VjS2V5Y2hhaW5EZWxldGUuYXJndHlwZXMgPSBbCiAgICAgICAgU2VjS2V5Y2hhaW5SZWYKICAgIF0KICAgIFNlY3VyaXR5LlNlY0tleWNoYWluRGVsZXRlLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNlY1BLQ1MxMkltcG9ydC5hcmd0eXBlcyA9IFsKICAgICAgICBDRkRhdGFSZWYsCiAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmLAogICAgICAgIFBPSU5URVIoQ0ZBcnJheVJlZikKICAgIF0KICAgIFNlY3VyaXR5LlNlY1BLQ1MxMkltcG9ydC5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTU0xSZWFkRnVuYyA9IENGVU5DVFlQRShPU1N0YXR1cywgU1NMQ29ubmVjdGlvblJlZiwgY192b2lkX3AsIFBPSU5URVIoY19zaXplX3QpKQogICAgU1NMV3JpdGVGdW5jID0gQ0ZVTkNUWVBFKE9TU3RhdHVzLCBTU0xDb25uZWN0aW9uUmVmLCBQT0lOVEVSKGNfYnl0ZSksIFBPSU5URVIoY19zaXplX3QpKQoKICAgIFNlY3VyaXR5LlNTTFNldElPRnVuY3MuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBTU0xSZWFkRnVuYywKICAgICAgICBTU0xXcml0ZUZ1bmMKICAgIF0KICAgIFNlY3VyaXR5LlNTTFNldElPRnVuY3MucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMU2V0UGVlcklELmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgY19jaGFyX3AsCiAgICAgICAgY19zaXplX3QKICAgIF0KICAgIFNlY3VyaXR5LlNTTFNldFBlZXJJRC5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xTZXRDZXJ0aWZpY2F0ZS5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIENGQXJyYXlSZWYKICAgIF0KICAgIFNlY3VyaXR5LlNTTFNldENlcnRpZmljYXRlLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTFNldENlcnRpZmljYXRlQXV0aG9yaXRpZXMuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBDRlR5cGVSZWYsCiAgICAgICAgQm9vbGVhbgogICAgXQogICAgU2VjdXJpdHkuU1NMU2V0Q2VydGlmaWNhdGVBdXRob3JpdGllcy5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xTZXRDb25uZWN0aW9uLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgU1NMQ29ubmVjdGlvblJlZgogICAgXQogICAgU2VjdXJpdHkuU1NMU2V0Q29ubmVjdGlvbi5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xTZXRQZWVyRG9tYWluTmFtZS5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIGNfY2hhcl9wLAogICAgICAgIGNfc2l6ZV90CiAgICBdCiAgICBTZWN1cml0eS5TU0xTZXRQZWVyRG9tYWluTmFtZS5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xIYW5kc2hha2UuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZgogICAgXQogICAgU2VjdXJpdHkuU1NMSGFuZHNoYWtlLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTFJlYWQuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBjX2NoYXJfcCwKICAgICAgICBjX3NpemVfdCwKICAgICAgICBQT0lOVEVSKGNfc2l6ZV90KQogICAgXQogICAgU2VjdXJpdHkuU1NMUmVhZC5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xXcml0ZS5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIGNfY2hhcl9wLAogICAgICAgIGNfc2l6ZV90LAogICAgICAgIFBPSU5URVIoY19zaXplX3QpCiAgICBdCiAgICBTZWN1cml0eS5TU0xXcml0ZS5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xDbG9zZS5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmCiAgICBdCiAgICBTZWN1cml0eS5TU0xDbG9zZS5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xHZXROdW1iZXJTdXBwb3J0ZWRDaXBoZXJzLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgUE9JTlRFUihjX3NpemVfdCkKICAgIF0KICAgIFNlY3VyaXR5LlNTTEdldE51bWJlclN1cHBvcnRlZENpcGhlcnMucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMR2V0U3VwcG9ydGVkQ2lwaGVycy5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFBPSU5URVIoU1NMQ2lwaGVyU3VpdGUpLAogICAgICAgIFBPSU5URVIoY19zaXplX3QpCiAgICBdCiAgICBTZWN1cml0eS5TU0xHZXRTdXBwb3J0ZWRDaXBoZXJzLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTFNldEVuYWJsZWRDaXBoZXJzLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgUE9JTlRFUihTU0xDaXBoZXJTdWl0ZSksCiAgICAgICAgY19zaXplX3QKICAgIF0KICAgIFNlY3VyaXR5LlNTTFNldEVuYWJsZWRDaXBoZXJzLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTEdldE51bWJlckVuYWJsZWRDaXBoZXJzLmFyZ3R5cGUgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBQT0lOVEVSKGNfc2l6ZV90KQogICAgXQogICAgU2VjdXJpdHkuU1NMR2V0TnVtYmVyRW5hYmxlZENpcGhlcnMucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMR2V0RW5hYmxlZENpcGhlcnMuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBQT0lOVEVSKFNTTENpcGhlclN1aXRlKSwKICAgICAgICBQT0lOVEVSKGNfc2l6ZV90KQogICAgXQogICAgU2VjdXJpdHkuU1NMR2V0RW5hYmxlZENpcGhlcnMucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMR2V0TmVnb3RpYXRlZENpcGhlci5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFBPSU5URVIoU1NMQ2lwaGVyU3VpdGUpCiAgICBdCiAgICBTZWN1cml0eS5TU0xHZXROZWdvdGlhdGVkQ2lwaGVyLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTEdldE5lZ290aWF0ZWRQcm90b2NvbFZlcnNpb24uYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBQT0lOVEVSKFNTTFByb3RvY29sKQogICAgXQogICAgU2VjdXJpdHkuU1NMR2V0TmVnb3RpYXRlZFByb3RvY29sVmVyc2lvbi5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xDb3B5UGVlclRydXN0LmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgUE9JTlRFUihTZWNUcnVzdFJlZikKICAgIF0KICAgIFNlY3VyaXR5LlNTTENvcHlQZWVyVHJ1c3QucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU2VjVHJ1c3RTZXRBbmNob3JDZXJ0aWZpY2F0ZXMuYXJndHlwZXMgPSBbCiAgICAgICAgU2VjVHJ1c3RSZWYsCiAgICAgICAgQ0ZBcnJheVJlZgogICAgXQogICAgU2VjdXJpdHkuU2VjVHJ1c3RTZXRBbmNob3JDZXJ0aWZpY2F0ZXMucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU2VjVHJ1c3RTZXRBbmNob3JDZXJ0aWZpY2F0ZXNPbmx5LmFyZ3N0eXBlcyA9IFsKICAgICAgICBTZWNUcnVzdFJlZiwKICAgICAgICBCb29sZWFuCiAgICBdCiAgICBTZWN1cml0eS5TZWNUcnVzdFNldEFuY2hvckNlcnRpZmljYXRlc09ubHkucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU2VjVHJ1c3RFdmFsdWF0ZS5hcmd0eXBlcyA9IFsKICAgICAgICBTZWNUcnVzdFJlZiwKICAgICAgICBQT0lOVEVSKFNlY1RydXN0UmVzdWx0VHlwZSkKICAgIF0KICAgIFNlY3VyaXR5LlNlY1RydXN0RXZhbHVhdGUucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU2VjVHJ1c3RHZXRDZXJ0aWZpY2F0ZUNvdW50LmFyZ3R5cGVzID0gWwogICAgICAgIFNlY1RydXN0UmVmCiAgICBdCiAgICBTZWN1cml0eS5TZWNUcnVzdEdldENlcnRpZmljYXRlQ291bnQucmVzdHlwZSA9IENGSW5kZXgKCiAgICBTZWN1cml0eS5TZWNUcnVzdEdldENlcnRpZmljYXRlQXRJbmRleC5hcmd0eXBlcyA9IFsKICAgICAgICBTZWNUcnVzdFJlZiwKICAgICAgICBDRkluZGV4CiAgICBdCiAgICBTZWN1cml0eS5TZWNUcnVzdEdldENlcnRpZmljYXRlQXRJbmRleC5yZXN0eXBlID0gU2VjQ2VydGlmaWNhdGVSZWYKCiAgICBTZWN1cml0eS5TU0xDcmVhdGVDb250ZXh0LmFyZ3R5cGVzID0gWwogICAgICAgIENGQWxsb2NhdG9yUmVmLAogICAgICAgIFNTTFByb3RvY29sU2lkZSwKICAgICAgICBTU0xDb25uZWN0aW9uVHlwZQogICAgXQogICAgU2VjdXJpdHkuU1NMQ3JlYXRlQ29udGV4dC5yZXN0eXBlID0gU1NMQ29udGV4dFJlZgoKICAgIFNlY3VyaXR5LlNTTFNldFNlc3Npb25PcHRpb24uYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBTU0xTZXNzaW9uT3B0aW9uLAogICAgICAgIEJvb2xlYW4KICAgIF0KICAgIFNlY3VyaXR5LlNTTFNldFNlc3Npb25PcHRpb24ucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMU2V0UHJvdG9jb2xWZXJzaW9uTWluLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgU1NMUHJvdG9jb2wKICAgIF0KICAgIFNlY3VyaXR5LlNTTFNldFByb3RvY29sVmVyc2lvbk1pbi5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xTZXRQcm90b2NvbFZlcnNpb25NYXguYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBTU0xQcm90b2NvbAogICAgXQogICAgU2VjdXJpdHkuU1NMU2V0UHJvdG9jb2xWZXJzaW9uTWF4LnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNlY0NvcHlFcnJvck1lc3NhZ2VTdHJpbmcuYXJndHlwZXMgPSBbCiAgICAgICAgT1NTdGF0dXMsCiAgICAgICAgY192b2lkX3AKICAgIF0KICAgIFNlY3VyaXR5LlNlY0NvcHlFcnJvck1lc3NhZ2VTdHJpbmcucmVzdHlwZSA9IENGU3RyaW5nUmVmCgogICAgU2VjdXJpdHkuU1NMUmVhZEZ1bmMgPSBTU0xSZWFkRnVuYwogICAgU2VjdXJpdHkuU1NMV3JpdGVGdW5jID0gU1NMV3JpdGVGdW5jCiAgICBTZWN1cml0eS5TU0xDb250ZXh0UmVmID0gU1NMQ29udGV4dFJlZgogICAgU2VjdXJpdHkuU1NMUHJvdG9jb2wgPSBTU0xQcm90b2NvbAogICAgU2VjdXJpdHkuU1NMQ2lwaGVyU3VpdGUgPSBTU0xDaXBoZXJTdWl0ZQogICAgU2VjdXJpdHkuU2VjSWRlbnRpdHlSZWYgPSBTZWNJZGVudGl0eVJlZgogICAgU2VjdXJpdHkuU2VjS2V5Y2hhaW5SZWYgPSBTZWNLZXljaGFpblJlZgogICAgU2VjdXJpdHkuU2VjVHJ1c3RSZWYgPSBTZWNUcnVzdFJlZgogICAgU2VjdXJpdHkuU2VjVHJ1c3RSZXN1bHRUeXBlID0gU2VjVHJ1c3RSZXN1bHRUeXBlCiAgICBTZWN1cml0eS5TZWNFeHRlcm5hbEZvcm1hdCA9IFNlY0V4dGVybmFsRm9ybWF0CiAgICBTZWN1cml0eS5PU1N0YXR1cyA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkua1NlY0ltcG9ydEV4cG9ydFBhc3NwaHJhc2UgPSBDRlN0cmluZ1JlZi5pbl9kbGwoCiAgICAgICAgU2VjdXJpdHksICdrU2VjSW1wb3J0RXhwb3J0UGFzc3BocmFzZScKICAgICkKICAgIFNlY3VyaXR5LmtTZWNJbXBvcnRJdGVtSWRlbnRpdHkgPSBDRlN0cmluZ1JlZi5pbl9kbGwoCiAgICAgICAgU2VjdXJpdHksICdrU2VjSW1wb3J0SXRlbUlkZW50aXR5JwogICAgKQoKICAgICMgQ29yZUZvdW5kYXRpb24gdGltZSEKICAgIENvcmVGb3VuZGF0aW9uLkNGUmV0YWluLmFyZ3R5cGVzID0gWwogICAgICAgIENGVHlwZVJlZgogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZSZXRhaW4ucmVzdHlwZSA9IENGVHlwZVJlZgoKICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZS5hcmd0eXBlcyA9IFsKICAgICAgICBDRlR5cGVSZWYKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZS5yZXN0eXBlID0gTm9uZQoKICAgIENvcmVGb3VuZGF0aW9uLkNGR2V0VHlwZUlELmFyZ3R5cGVzID0gWwogICAgICAgIENGVHlwZVJlZgogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZHZXRUeXBlSUQucmVzdHlwZSA9IENGVHlwZUlECgogICAgQ29yZUZvdW5kYXRpb24uQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZy5hcmd0eXBlcyA9IFsKICAgICAgICBDRkFsbG9jYXRvclJlZiwKICAgICAgICBjX2NoYXJfcCwKICAgICAgICBDRlN0cmluZ0VuY29kaW5nCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nLnJlc3R5cGUgPSBDRlN0cmluZ1JlZgoKICAgIENvcmVGb3VuZGF0aW9uLkNGU3RyaW5nR2V0Q1N0cmluZ1B0ci5hcmd0eXBlcyA9IFsKICAgICAgICBDRlN0cmluZ1JlZiwKICAgICAgICBDRlN0cmluZ0VuY29kaW5nCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRlN0cmluZ0dldENTdHJpbmdQdHIucmVzdHlwZSA9IGNfY2hhcl9wCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZTdHJpbmdHZXRDU3RyaW5nLmFyZ3R5cGVzID0gWwogICAgICAgIENGU3RyaW5nUmVmLAogICAgICAgIGNfY2hhcl9wLAogICAgICAgIENGSW5kZXgsCiAgICAgICAgQ0ZTdHJpbmdFbmNvZGluZwogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZTdHJpbmdHZXRDU3RyaW5nLnJlc3R5cGUgPSBjX2Jvb2wKCiAgICBDb3JlRm91bmRhdGlvbi5DRkRhdGFDcmVhdGUuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZBbGxvY2F0b3JSZWYsCiAgICAgICAgY19jaGFyX3AsCiAgICAgICAgQ0ZJbmRleAogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZEYXRhQ3JlYXRlLnJlc3R5cGUgPSBDRkRhdGFSZWYKCiAgICBDb3JlRm91bmRhdGlvbi5DRkRhdGFHZXRMZW5ndGguYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZEYXRhUmVmCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRkRhdGFHZXRMZW5ndGgucmVzdHlwZSA9IENGSW5kZXgKCiAgICBDb3JlRm91bmRhdGlvbi5DRkRhdGFHZXRCeXRlUHRyLmFyZ3R5cGVzID0gWwogICAgICAgIENGRGF0YVJlZgogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZEYXRhR2V0Qnl0ZVB0ci5yZXN0eXBlID0gY192b2lkX3AKCiAgICBDb3JlRm91bmRhdGlvbi5DRkRpY3Rpb25hcnlDcmVhdGUuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZBbGxvY2F0b3JSZWYsCiAgICAgICAgUE9JTlRFUihDRlR5cGVSZWYpLAogICAgICAgIFBPSU5URVIoQ0ZUeXBlUmVmKSwKICAgICAgICBDRkluZGV4LAogICAgICAgIENGRGljdGlvbmFyeUtleUNhbGxCYWNrcywKICAgICAgICBDRkRpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcwogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZEaWN0aW9uYXJ5Q3JlYXRlLnJlc3R5cGUgPSBDRkRpY3Rpb25hcnlSZWYKCiAgICBDb3JlRm91bmRhdGlvbi5DRkRpY3Rpb25hcnlHZXRWYWx1ZS5hcmd0eXBlcyA9IFsKICAgICAgICBDRkRpY3Rpb25hcnlSZWYsCiAgICAgICAgQ0ZUeXBlUmVmCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRkRpY3Rpb25hcnlHZXRWYWx1ZS5yZXN0eXBlID0gQ0ZUeXBlUmVmCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUNyZWF0ZS5hcmd0eXBlcyA9IFsKICAgICAgICBDRkFsbG9jYXRvclJlZiwKICAgICAgICBQT0lOVEVSKENGVHlwZVJlZiksCiAgICAgICAgQ0ZJbmRleCwKICAgICAgICBDRkFycmF5Q2FsbEJhY2tzLAogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUNyZWF0ZS5yZXN0eXBlID0gQ0ZBcnJheVJlZgoKICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlDcmVhdGVNdXRhYmxlLmFyZ3R5cGVzID0gWwogICAgICAgIENGQWxsb2NhdG9yUmVmLAogICAgICAgIENGSW5kZXgsCiAgICAgICAgQ0ZBcnJheUNhbGxCYWNrcwogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUNyZWF0ZU11dGFibGUucmVzdHlwZSA9IENGTXV0YWJsZUFycmF5UmVmCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUFwcGVuZFZhbHVlLmFyZ3R5cGVzID0gWwogICAgICAgIENGTXV0YWJsZUFycmF5UmVmLAogICAgICAgIGNfdm9pZF9wCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5QXBwZW5kVmFsdWUucmVzdHlwZSA9IE5vbmUKCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5R2V0Q291bnQuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZBcnJheVJlZgogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUdldENvdW50LnJlc3R5cGUgPSBDRkluZGV4CgogICAgQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUdldFZhbHVlQXRJbmRleC5hcmd0eXBlcyA9IFsKICAgICAgICBDRkFycmF5UmVmLAogICAgICAgIENGSW5kZXgKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlHZXRWYWx1ZUF0SW5kZXgucmVzdHlwZSA9IGNfdm9pZF9wCgogICAgQ29yZUZvdW5kYXRpb24ua0NGQWxsb2NhdG9yRGVmYXVsdCA9IENGQWxsb2NhdG9yUmVmLmluX2RsbCgKICAgICAgICBDb3JlRm91bmRhdGlvbiwgJ2tDRkFsbG9jYXRvckRlZmF1bHQnCiAgICApCiAgICBDb3JlRm91bmRhdGlvbi5rQ0ZUeXBlQXJyYXlDYWxsQmFja3MgPSBjX3ZvaWRfcC5pbl9kbGwoQ29yZUZvdW5kYXRpb24sICdrQ0ZUeXBlQXJyYXlDYWxsQmFja3MnKQogICAgQ29yZUZvdW5kYXRpb24ua0NGVHlwZURpY3Rpb25hcnlLZXlDYWxsQmFja3MgPSBjX3ZvaWRfcC5pbl9kbGwoCiAgICAgICAgQ29yZUZvdW5kYXRpb24sICdrQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcycKICAgICkKICAgIENvcmVGb3VuZGF0aW9uLmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MgPSBjX3ZvaWRfcC5pbl9kbGwoCiAgICAgICAgQ29yZUZvdW5kYXRpb24sICdrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzJwogICAgKQoKICAgIENvcmVGb3VuZGF0aW9uLkNGVHlwZVJlZiA9IENGVHlwZVJlZgogICAgQ29yZUZvdW5kYXRpb24uQ0ZBcnJheVJlZiA9IENGQXJyYXlSZWYKICAgIENvcmVGb3VuZGF0aW9uLkNGU3RyaW5nUmVmID0gQ0ZTdHJpbmdSZWYKICAgIENvcmVGb3VuZGF0aW9uLkNGRGljdGlvbmFyeVJlZiA9IENGRGljdGlvbmFyeVJlZgoKZXhjZXB0IChBdHRyaWJ1dGVFcnJvcik6CiAgICByYWlzZSBJbXBvcnRFcnJvcignRXJyb3IgaW5pdGlhbGl6aW5nIGN0eXBlcycpCgoKY2xhc3MgQ0ZDb25zdChvYmplY3QpOgogICAgIiIiCiAgICBBIGNsYXNzIG9iamVjdCB0aGF0IGFjdHMgYXMgZXNzZW50aWFsbHkgYSBuYW1lc3BhY2UgZm9yIENvcmVGb3VuZGF0aW9uCiAgICBjb25zdGFudHMuCiAgICAiIiIKICAgIGtDRlN0cmluZ0VuY29kaW5nVVRGOCA9IENGU3RyaW5nRW5jb2RpbmcoMHgwODAwMDEwMCkKCgpjbGFzcyBTZWN1cml0eUNvbnN0KG9iamVjdCk6CiAgICAiIiIKICAgIEEgY2xhc3Mgb2JqZWN0IHRoYXQgYWN0cyBhcyBlc3NlbnRpYWxseSBhIG5hbWVzcGFjZSBmb3IgU2VjdXJpdHkgY29uc3RhbnRzLgogICAgIiIiCiAgICBrU1NMU2Vzc2lvbk9wdGlvbkJyZWFrT25TZXJ2ZXJBdXRoID0gMAoKICAgIGtTU0xQcm90b2NvbDIgPSAxCiAgICBrU1NMUHJvdG9jb2wzID0gMgogICAga1RMU1Byb3RvY29sMSA9IDQKICAgIGtUTFNQcm90b2NvbDExID0gNwogICAga1RMU1Byb3RvY29sMTIgPSA4CgogICAga1NTTENsaWVudFNpZGUgPSAxCiAgICBrU1NMU3RyZWFtVHlwZSA9IDAKCiAgICBrU2VjRm9ybWF0UEVNU2VxdWVuY2UgPSAxMAoKICAgIGtTZWNUcnVzdFJlc3VsdEludmFsaWQgPSAwCiAgICBrU2VjVHJ1c3RSZXN1bHRQcm9jZWVkID0gMQogICAgIyBUaGlzIGdhcCBpcyBwcmVzZW50IG9uIHB1cnBvc2U6IHRoaXMgd2FzIGtTZWNUcnVzdFJlc3VsdENvbmZpcm0sIHdoaWNoCiAgICAjIGlzIGRlcHJlY2F0ZWQuCiAgICBrU2VjVHJ1c3RSZXN1bHREZW55ID0gMwogICAga1NlY1RydXN0UmVzdWx0VW5zcGVjaWZpZWQgPSA0CiAgICBrU2VjVHJ1c3RSZXN1bHRSZWNvdmVyYWJsZVRydXN0RmFpbHVyZSA9IDUKICAgIGtTZWNUcnVzdFJlc3VsdEZhdGFsVHJ1c3RGYWlsdXJlID0gNgogICAga1NlY1RydXN0UmVzdWx0T3RoZXJFcnJvciA9IDcKCiAgICBlcnJTU0xQcm90b2NvbCA9IC05ODAwCiAgICBlcnJTU0xXb3VsZEJsb2NrID0gLTk4MDMKICAgIGVyclNTTENsb3NlZEdyYWNlZnVsID0gLTk4MDUKICAgIGVyclNTTENsb3NlZE5vTm90aWZ5ID0gLTk4MTYKICAgIGVyclNTTENsb3NlZEFib3J0ID0gLTk4MDYKCiAgICBlcnJTU0xYQ2VydENoYWluSW52YWxpZCA9IC05ODA3CiAgICBlcnJTU0xDcnlwdG8gPSAtOTgwOQogICAgZXJyU1NMSW50ZXJuYWwgPSAtOTgxMAogICAgZXJyU1NMQ2VydEV4cGlyZWQgPSAtOTgxNAogICAgZXJyU1NMQ2VydE5vdFlldFZhbGlkID0gLTk4MTUKICAgIGVyclNTTFVua25vd25Sb290Q2VydCA9IC05ODEyCiAgICBlcnJTU0xOb1Jvb3RDZXJ0ID0gLTk4MTMKICAgIGVyclNTTEhvc3ROYW1lTWlzbWF0Y2ggPSAtOTg0MwogICAgZXJyU1NMUGVlckhhbmRzaGFrZUZhaWwgPSAtOTgyNAogICAgZXJyU1NMUGVlclVzZXJDYW5jZWxsZWQgPSAtOTgzOQogICAgZXJyU1NMV2Vha1BlZXJFcGhlbWVyYWxESEtleSA9IC05ODUwCiAgICBlcnJTU0xTZXJ2ZXJBdXRoQ29tcGxldGVkID0gLTk4NDEKICAgIGVyclNTTFJlY29yZE92ZXJmbG93ID0gLTk4NDcKCiAgICBlcnJTZWNWZXJpZnlGYWlsZWQgPSAtNjc4MDgKICAgIGVyclNlY05vVHJ1c3RTZXR0aW5ncyA9IC0yNTI2MwogICAgZXJyU2VjSXRlbU5vdEZvdW5kID0gLTI1MzAwCiAgICBlcnJTZWNJbnZhbGlkVHJ1c3RTZXR0aW5ncyA9IC0yNTI2MgoKICAgICMgQ2lwaGVyIHN1aXRlcy4gV2Ugb25seSBwaWNrIHRoZSBvbmVzIG91ciBkZWZhdWx0IGNpcGhlciBzdHJpbmcgYWxsb3dzLgogICAgVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0ID0gMHhDMDJDCiAgICBUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0ID0gMHhDMDMwCiAgICBUTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYgPSAweEMwMkIKICAgIFRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYgPSAweEMwMkYKICAgIFRMU19ESEVfRFNTX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0ID0gMHgwMEEzCiAgICBUTFNfREhFX1JTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCA9IDB4MDA5RgogICAgVExTX0RIRV9EU1NfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYgPSAweDAwQTIKICAgIFRMU19ESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2ID0gMHgwMDlFCiAgICBUTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEzODQgPSAweEMwMjQKICAgIFRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEzODQgPSAweEMwMjgKICAgIFRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSA9IDB4QzAwQQogICAgVExTX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSA9IDB4QzAxNAogICAgVExTX0RIRV9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEyNTYgPSAweDAwNkIKICAgIFRMU19ESEVfRFNTX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMjU2ID0gMHgwMDZBCiAgICBUTFNfREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSA9IDB4MDAzOQogICAgVExTX0RIRV9EU1NfV0lUSF9BRVNfMjU2X0NCQ19TSEEgPSAweDAwMzgKICAgIFRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiA9IDB4QzAyMwogICAgVExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiA9IDB4QzAyNwogICAgVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBID0gMHhDMDA5CiAgICBUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBID0gMHhDMDEzCiAgICBUTFNfREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiA9IDB4MDA2NwogICAgVExTX0RIRV9EU1NfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYgPSAweDAwNDAKICAgIFRMU19ESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBID0gMHgwMDMzCiAgICBUTFNfREhFX0RTU19XSVRIX0FFU18xMjhfQ0JDX1NIQSA9IDB4MDAzMgogICAgVExTX1JTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCA9IDB4MDA5RAogICAgVExTX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiA9IDB4MDA5QwogICAgVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQTI1NiA9IDB4MDAzRAogICAgVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiA9IDB4MDAzQwogICAgVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSA9IDB4MDAzNQogICAgVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSA9IDB4MDAyRgogICAgVExTX0FFU18xMjhfR0NNX1NIQTI1NiA9IDB4MTMwMQogICAgVExTX0FFU18yNTZfR0NNX1NIQTM4NCA9IDB4MTMwMgogICAgVExTX0NIQUNIQTIwX1BPTFkxMzA1X1NIQTI1NiA9IDB4MTMwMwpQSwMEFAAAAAAAAAAhAASv3JAeLwAAHi8AAEkAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19zZWN1cmV0cmFuc3BvcnQvbG93X2xldmVsLnB5IiIiCkxvdy1sZXZlbCBoZWxwZXJzIGZvciB0aGUgU2VjdXJlVHJhbnNwb3J0IGJpbmRpbmdzLgoKVGhlc2UgYXJlIFB5dGhvbiBmdW5jdGlvbnMgdGhhdCBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIGhpZ2gtbGV2ZWwgQVBJcwpidXQgYXJlIG5lY2Vzc2FyeSB0byBnZXQgdGhlbSB0byB3b3JrLiBUaGV5IGluY2x1ZGUgYSB3aG9sZSBidW5jaCBvZiBsb3ctbGV2ZWwKQ29yZUZvdW5kYXRpb24gbWVzc2luZyBhYm91dCBhbmQgbWVtb3J5IG1hbmFnZW1lbnQuIFRoZSBjb25jZXJucyBpbiB0aGlzIG1vZHVsZQphcmUgYWxtb3N0IGVudGlyZWx5IGFib3V0IHRyeWluZyB0byBhdm9pZCBtZW1vcnkgbGVha3MgYW5kIHByb3ZpZGluZwphcHByb3ByaWF0ZSBhbmQgdXNlZnVsIGFzc2lzdGFuY2UgdG8gdGhlIGhpZ2hlci1sZXZlbCBjb2RlLgoiIiIKaW1wb3J0IGJhc2U2NAppbXBvcnQgY3R5cGVzCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHJlCmltcG9ydCBvcwppbXBvcnQgc3NsCmltcG9ydCB0ZW1wZmlsZQoKZnJvbSAuYmluZGluZ3MgaW1wb3J0IFNlY3VyaXR5LCBDb3JlRm91bmRhdGlvbiwgQ0ZDb25zdAoKCiMgVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gaXMgdXNlZCB0byBncmFiIFBFTSBkYXRhIG91dCBvZiBhIFBFTSBidW5kbGUuCl9QRU1fQ0VSVFNfUkUgPSByZS5jb21waWxlKAogICAgYiItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbiguKj8pXG4tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tIiwgcmUuRE9UQUxMCikKCgpkZWYgX2NmX2RhdGFfZnJvbV9ieXRlcyhieXRlc3RyaW5nKToKICAgICIiIgogICAgR2l2ZW4gYSBieXRlc3RyaW5nLCBjcmVhdGUgYSBDRkRhdGEgb2JqZWN0IGZyb20gaXQuIFRoaXMgQ0ZEYXRhIG9iamVjdCBtdXN0CiAgICBiZSBDRlJlbGVhc2VkIGJ5IHRoZSBjYWxsZXIuCiAgICAiIiIKICAgIHJldHVybiBDb3JlRm91bmRhdGlvbi5DRkRhdGFDcmVhdGUoCiAgICAgICAgQ29yZUZvdW5kYXRpb24ua0NGQWxsb2NhdG9yRGVmYXVsdCwgYnl0ZXN0cmluZywgbGVuKGJ5dGVzdHJpbmcpCiAgICApCgoKZGVmIF9jZl9kaWN0aW9uYXJ5X2Zyb21fdHVwbGVzKHR1cGxlcyk6CiAgICAiIiIKICAgIEdpdmVuIGEgbGlzdCBvZiBQeXRob24gdHVwbGVzLCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBDRkRpY3Rpb25hcnkuCiAgICAiIiIKICAgIGRpY3Rpb25hcnlfc2l6ZSA9IGxlbih0dXBsZXMpCgogICAgIyBXZSBuZWVkIHRvIGdldCB0aGUgZGljdGlvbmFyeSBrZXlzIGFuZCB2YWx1ZXMgb3V0IGluIHRoZSBzYW1lIG9yZGVyLgogICAga2V5cyA9ICh0WzBdIGZvciB0IGluIHR1cGxlcykKICAgIHZhbHVlcyA9ICh0WzFdIGZvciB0IGluIHR1cGxlcykKICAgIGNmX2tleXMgPSAoQ29yZUZvdW5kYXRpb24uQ0ZUeXBlUmVmICogZGljdGlvbmFyeV9zaXplKSgqa2V5cykKICAgIGNmX3ZhbHVlcyA9IChDb3JlRm91bmRhdGlvbi5DRlR5cGVSZWYgKiBkaWN0aW9uYXJ5X3NpemUpKCp2YWx1ZXMpCgogICAgcmV0dXJuIENvcmVGb3VuZGF0aW9uLkNGRGljdGlvbmFyeUNyZWF0ZSgKICAgICAgICBDb3JlRm91bmRhdGlvbi5rQ0ZBbGxvY2F0b3JEZWZhdWx0LAogICAgICAgIGNmX2tleXMsCiAgICAgICAgY2ZfdmFsdWVzLAogICAgICAgIGRpY3Rpb25hcnlfc2l6ZSwKICAgICAgICBDb3JlRm91bmRhdGlvbi5rQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcywKICAgICAgICBDb3JlRm91bmRhdGlvbi5rQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzLAogICAgKQoKCmRlZiBfY2Zfc3RyaW5nX3RvX3VuaWNvZGUodmFsdWUpOgogICAgIiIiCiAgICBDcmVhdGVzIGEgVW5pY29kZSBzdHJpbmcgZnJvbSBhIENGU3RyaW5nIG9iamVjdC4gVXNlZCBlbnRpcmVseSBmb3IgZXJyb3IKICAgIHJlcG9ydGluZy4KCiAgICBZZXMsIGl0IGFubm95cyBtZSBxdWl0ZSBhIGxvdCB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgdGhpcyBjb21wbGV4LgogICAgIiIiCiAgICB2YWx1ZV9hc192b2lkX3AgPSBjdHlwZXMuY2FzdCh2YWx1ZSwgY3R5cGVzLlBPSU5URVIoY3R5cGVzLmNfdm9pZF9wKSkKCiAgICBzdHJpbmcgPSBDb3JlRm91bmRhdGlvbi5DRlN0cmluZ0dldENTdHJpbmdQdHIoCiAgICAgICAgdmFsdWVfYXNfdm9pZF9wLAogICAgICAgIENGQ29uc3Qua0NGU3RyaW5nRW5jb2RpbmdVVEY4CiAgICApCiAgICBpZiBzdHJpbmcgaXMgTm9uZToKICAgICAgICBidWZmZXIgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIoMTAyNCkKICAgICAgICByZXN1bHQgPSBDb3JlRm91bmRhdGlvbi5DRlN0cmluZ0dldENTdHJpbmcoCiAgICAgICAgICAgIHZhbHVlX2FzX3ZvaWRfcCwKICAgICAgICAgICAgYnVmZmVyLAogICAgICAgICAgICAxMDI0LAogICAgICAgICAgICBDRkNvbnN0LmtDRlN0cmluZ0VuY29kaW5nVVRGOAogICAgICAgICkKICAgICAgICBpZiBub3QgcmVzdWx0OgogICAgICAgICAgICByYWlzZSBPU0Vycm9yKCdFcnJvciBjb3B5aW5nIEMgc3RyaW5nIGZyb20gQ0ZTdHJpbmdSZWYnKQogICAgICAgIHN0cmluZyA9IGJ1ZmZlci52YWx1ZQogICAgaWYgc3RyaW5nIGlzIG5vdCBOb25lOgogICAgICAgIHN0cmluZyA9IHN0cmluZy5kZWNvZGUoJ3V0Zi04JykKICAgIHJldHVybiBzdHJpbmcKCgpkZWYgX2Fzc2VydF9ub19lcnJvcihlcnJvciwgZXhjZXB0aW9uX2NsYXNzPU5vbmUpOgogICAgIiIiCiAgICBDaGVja3MgdGhlIHJldHVybiBjb2RlIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIHRvCiAgICByZXBvcnQKICAgICIiIgogICAgaWYgZXJyb3IgPT0gMDoKICAgICAgICByZXR1cm4KCiAgICBjZl9lcnJvcl9zdHJpbmcgPSBTZWN1cml0eS5TZWNDb3B5RXJyb3JNZXNzYWdlU3RyaW5nKGVycm9yLCBOb25lKQogICAgb3V0cHV0ID0gX2NmX3N0cmluZ190b191bmljb2RlKGNmX2Vycm9yX3N0cmluZykKICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShjZl9lcnJvcl9zdHJpbmcpCgogICAgaWYgb3V0cHV0IGlzIE5vbmUgb3Igb3V0cHV0ID09IHUnJzoKICAgICAgICBvdXRwdXQgPSB1J09TU3RhdHVzICVzJyAlIGVycm9yCgogICAgaWYgZXhjZXB0aW9uX2NsYXNzIGlzIE5vbmU6CiAgICAgICAgZXhjZXB0aW9uX2NsYXNzID0gc3NsLlNTTEVycm9yCgogICAgcmFpc2UgZXhjZXB0aW9uX2NsYXNzKG91dHB1dCkKCgpkZWYgX2NlcnRfYXJyYXlfZnJvbV9wZW0ocGVtX2J1bmRsZSk6CiAgICAiIiIKICAgIEdpdmVuIGEgYnVuZGxlIG9mIGNlcnRzIGluIFBFTSBmb3JtYXQsIHR1cm5zIHRoZW0gaW50byBhIENGQXJyYXkgb2YgY2VydHMKICAgIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgYSBjZXJ0IGNoYWluLgogICAgIiIiCiAgICBkZXJfY2VydHMgPSBbCiAgICAgICAgYmFzZTY0LmI2NGRlY29kZShtYXRjaC5ncm91cCgxKSkKICAgICAgICBmb3IgbWF0Y2ggaW4gX1BFTV9DRVJUU19SRS5maW5kaXRlcihwZW1fYnVuZGxlKQogICAgXQogICAgaWYgbm90IGRlcl9jZXJ0czoKICAgICAgICByYWlzZSBzc2wuU1NMRXJyb3IoIk5vIHJvb3QgY2VydGlmaWNhdGVzIHNwZWNpZmllZCIpCgogICAgY2VydF9hcnJheSA9IENvcmVGb3VuZGF0aW9uLkNGQXJyYXlDcmVhdGVNdXRhYmxlKAogICAgICAgIENvcmVGb3VuZGF0aW9uLmtDRkFsbG9jYXRvckRlZmF1bHQsCiAgICAgICAgMCwKICAgICAgICBjdHlwZXMuYnlyZWYoQ29yZUZvdW5kYXRpb24ua0NGVHlwZUFycmF5Q2FsbEJhY2tzKQogICAgKQogICAgaWYgbm90IGNlcnRfYXJyYXk6CiAgICAgICAgcmFpc2Ugc3NsLlNTTEVycm9yKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5ISIpCgogICAgdHJ5OgogICAgICAgIGZvciBkZXJfYnl0ZXMgaW4gZGVyX2NlcnRzOgogICAgICAgICAgICBjZXJ0ZGF0YSA9IF9jZl9kYXRhX2Zyb21fYnl0ZXMoZGVyX2J5dGVzKQogICAgICAgICAgICBpZiBub3QgY2VydGRhdGE6CiAgICAgICAgICAgICAgICByYWlzZSBzc2wuU1NMRXJyb3IoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkhIikKICAgICAgICAgICAgY2VydCA9IFNlY3VyaXR5LlNlY0NlcnRpZmljYXRlQ3JlYXRlV2l0aERhdGEoCiAgICAgICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5rQ0ZBbGxvY2F0b3JEZWZhdWx0LCBjZXJ0ZGF0YQogICAgICAgICAgICApCiAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShjZXJ0ZGF0YSkKICAgICAgICAgICAgaWYgbm90IGNlcnQ6CiAgICAgICAgICAgICAgICByYWlzZSBzc2wuU1NMRXJyb3IoIlVuYWJsZSB0byBidWlsZCBjZXJ0IG9iamVjdCEiKQoKICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUFwcGVuZFZhbHVlKGNlcnRfYXJyYXksIGNlcnQpCiAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShjZXJ0KQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAjIFdlIG5lZWQgdG8gZnJlZSB0aGUgYXJyYXkgYmVmb3JlIHRoZSBleGNlcHRpb24gYnViYmxlcyBmdXJ0aGVyLgogICAgICAgICMgV2Ugb25seSB3YW50IHRvIGRvIHRoYXQgaWYgYW4gZXJyb3Igb2NjdXJzOiBvdGhlcndpc2UsIHRoZSBjYWxsZXIKICAgICAgICAjIHNob3VsZCBmcmVlLgogICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShjZXJ0X2FycmF5KQoKICAgIHJldHVybiBjZXJ0X2FycmF5CgoKZGVmIF9pc19jZXJ0KGl0ZW0pOgogICAgIiIiCiAgICBSZXR1cm5zIFRydWUgaWYgYSBnaXZlbiBDRlR5cGVSZWYgaXMgYSBjZXJ0aWZpY2F0ZS4KICAgICIiIgogICAgZXhwZWN0ZWQgPSBTZWN1cml0eS5TZWNDZXJ0aWZpY2F0ZUdldFR5cGVJRCgpCiAgICByZXR1cm4gQ29yZUZvdW5kYXRpb24uQ0ZHZXRUeXBlSUQoaXRlbSkgPT0gZXhwZWN0ZWQKCgpkZWYgX2lzX2lkZW50aXR5KGl0ZW0pOgogICAgIiIiCiAgICBSZXR1cm5zIFRydWUgaWYgYSBnaXZlbiBDRlR5cGVSZWYgaXMgYW4gaWRlbnRpdHkuCiAgICAiIiIKICAgIGV4cGVjdGVkID0gU2VjdXJpdHkuU2VjSWRlbnRpdHlHZXRUeXBlSUQoKQogICAgcmV0dXJuIENvcmVGb3VuZGF0aW9uLkNGR2V0VHlwZUlEKGl0ZW0pID09IGV4cGVjdGVkCgoKZGVmIF90ZW1wb3Jhcnlfa2V5Y2hhaW4oKToKICAgICIiIgogICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgdGVtcG9yYXJ5IE1hYyBrZXljaGFpbiB0aGF0IHdlIGNhbiB1c2UgdG8gd29yayB3aXRoCiAgICBjcmVkZW50aWFscy4gVGhpcyBrZXljaGFpbiB1c2VzIGEgb25lLXRpbWUgcGFzc3dvcmQgYW5kIGEgdGVtcG9yYXJ5IGZpbGUgdG8KICAgIHN0b3JlIHRoZSBkYXRhLiBXZSBleHBlY3QgdG8gaGF2ZSBvbmUga2V5Y2hhaW4gcGVyIHNvY2tldC4gVGhlIHJldHVybmVkCiAgICBTZWNLZXljaGFpblJlZiBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIsIGluY2x1ZGluZyBjYWxsaW5nCiAgICBTZWNLZXljaGFpbkRlbGV0ZS4KCiAgICBSZXR1cm5zIGEgdHVwbGUgb2YgdGhlIFNlY0tleWNoYWluUmVmIGFuZCB0aGUgcGF0aCB0byB0aGUgdGVtcG9yYXJ5CiAgICBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBpdC4KICAgICIiIgogICAgIyBVbmZvcnR1bmF0ZWx5LCBTZWNLZXljaGFpbkNyZWF0ZSByZXF1aXJlcyBhIHBhdGggdG8gYSBrZXljaGFpbi4gVGhpcwogICAgIyBtZWFucyB3ZSBjYW5ub3QgdXNlIG1rc3RlbXAgdG8gdXNlIGEgZ2VuZXJpYyB0ZW1wb3JhcnkgZmlsZS4gSW5zdGVhZCwKICAgICMgd2UncmUgZ29pbmcgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBhbmQgYSBmaWxlbmFtZSB0byB1c2UgdGhlcmUuCiAgICAjIFRoaXMgZmlsZW5hbWUgd2lsbCBiZSA4IHJhbmRvbSBieXRlcyBleHBhbmRlZCBpbnRvIGJhc2U2NC4gV2UgYWxzbyBuZWVkCiAgICAjIHNvbWUgcmFuZG9tIGJ5dGVzIHRvIHBhc3N3b3JkLXByb3RlY3QgdGhlIGtleWNoYWluIHdlJ3JlIGNyZWF0aW5nLCBzbyB3ZQogICAgIyBhc2sgZm9yIDQwIHJhbmRvbSBieXRlcy4KICAgIHJhbmRvbV9ieXRlcyA9IG9zLnVyYW5kb20oNDApCiAgICBmaWxlbmFtZSA9IGJhc2U2NC5iNjRlbmNvZGUocmFuZG9tX2J5dGVzWzo4XSkuZGVjb2RlKCd1dGYtOCcpCiAgICBwYXNzd29yZCA9IGJhc2U2NC5iNjRlbmNvZGUocmFuZG9tX2J5dGVzWzg6XSkgICMgTXVzdCBiZSB2YWxpZCBVVEYtOAogICAgdGVtcGRpcmVjdG9yeSA9IHRlbXBmaWxlLm1rZHRlbXAoKQoKICAgIGtleWNoYWluX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcGRpcmVjdG9yeSwgZmlsZW5hbWUpLmVuY29kZSgndXRmLTgnKQoKICAgICMgV2Ugbm93IHdhbnQgdG8gY3JlYXRlIHRoZSBrZXljaGFpbiBpdHNlbGYuCiAgICBrZXljaGFpbiA9IFNlY3VyaXR5LlNlY0tleWNoYWluUmVmKCkKICAgIHN0YXR1cyA9IFNlY3VyaXR5LlNlY0tleWNoYWluQ3JlYXRlKAogICAgICAgIGtleWNoYWluX3BhdGgsCiAgICAgICAgbGVuKHBhc3N3b3JkKSwKICAgICAgICBwYXNzd29yZCwKICAgICAgICBGYWxzZSwKICAgICAgICBOb25lLAogICAgICAgIGN0eXBlcy5ieXJlZihrZXljaGFpbikKICAgICkKICAgIF9hc3NlcnRfbm9fZXJyb3Ioc3RhdHVzKQoKICAgICMgSGF2aW5nIGNyZWF0ZWQgdGhlIGtleWNoYWluLCB3ZSB3YW50IHRvIHBhc3MgaXQgb2ZmIHRvIHRoZSBjYWxsZXIuCiAgICByZXR1cm4ga2V5Y2hhaW4sIHRlbXBkaXJlY3RvcnkKCgpkZWYgX2xvYWRfaXRlbXNfZnJvbV9maWxlKGtleWNoYWluLCBwYXRoKToKICAgICIiIgogICAgR2l2ZW4gYSBzaW5nbGUgZmlsZSwgbG9hZHMgYWxsIHRoZSB0cnVzdCBvYmplY3RzIGZyb20gaXQgaW50byBhcnJheXMgYW5kCiAgICB0aGUga2V5Y2hhaW4uCiAgICBSZXR1cm5zIGEgdHVwbGUgb2YgbGlzdHM6IHRoZSBmaXJzdCBsaXN0IGlzIGEgbGlzdCBvZiBpZGVudGl0aWVzLCB0aGUKICAgIHNlY29uZCBhIGxpc3Qgb2YgY2VydHMuCiAgICAiIiIKICAgIGNlcnRpZmljYXRlcyA9IFtdCiAgICBpZGVudGl0aWVzID0gW10KICAgIHJlc3VsdF9hcnJheSA9IE5vbmUKCiAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgZjoKICAgICAgICByYXdfZmlsZWRhdGEgPSBmLnJlYWQoKQoKICAgIHRyeToKICAgICAgICBmaWxlZGF0YSA9IENvcmVGb3VuZGF0aW9uLkNGRGF0YUNyZWF0ZSgKICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24ua0NGQWxsb2NhdG9yRGVmYXVsdCwKICAgICAgICAgICAgcmF3X2ZpbGVkYXRhLAogICAgICAgICAgICBsZW4ocmF3X2ZpbGVkYXRhKQogICAgICAgICkKICAgICAgICByZXN1bHRfYXJyYXkgPSBDb3JlRm91bmRhdGlvbi5DRkFycmF5UmVmKCkKICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TZWNJdGVtSW1wb3J0KAogICAgICAgICAgICBmaWxlZGF0YSwgICMgY2VydCBkYXRhCiAgICAgICAgICAgIE5vbmUsICAjIEZpbGVuYW1lLCBsZWF2aW5nIGl0IG91dCBmb3Igbm93CiAgICAgICAgICAgIE5vbmUsICAjIFdoYXQgdGhlIHR5cGUgb2YgdGhlIGZpbGUgaXMsIHdlIGRvbid0IGNhcmUKICAgICAgICAgICAgTm9uZSwgICMgd2hhdCdzIGluIHRoZSBmaWxlLCB3ZSBkb24ndCBjYXJlCiAgICAgICAgICAgIDAsICAjIGltcG9ydCBmbGFncwogICAgICAgICAgICBOb25lLCAgIyBrZXkgcGFyYW1zLCBjYW4gaW5jbHVkZSBwYXNzcGhyYXNlIGluIHRoZSBmdXR1cmUKICAgICAgICAgICAga2V5Y2hhaW4sICAjIFRoZSBrZXljaGFpbiB0byBpbnNlcnQgaW50bwogICAgICAgICAgICBjdHlwZXMuYnlyZWYocmVzdWx0X2FycmF5KSAgIyBSZXN1bHRzCiAgICAgICAgKQogICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgICAgICAjIEEgQ0ZBcnJheSBpcyBub3QgdmVyeSB1c2VmdWwgdG8gdXMgYXMgYW4gaW50ZXJtZWRpYXJ5CiAgICAgICAgIyByZXByZXNlbnRhdGlvbiwgc28gd2UgYXJlIGdvaW5nIHRvIGV4dHJhY3QgdGhlIG9iamVjdHMgd2Ugd2FudAogICAgICAgICMgYW5kIHRoZW4gZnJlZSB0aGUgYXJyYXkuIFdlIGRvbid0IG5lZWQgdG8ga2VlcCBob2xkIG9mIGtleXM6IHRoZQogICAgICAgICMga2V5Y2hhaW4gYWxyZWFkeSBoYXMgdGhlbSEKICAgICAgICByZXN1bHRfY291bnQgPSBDb3JlRm91bmRhdGlvbi5DRkFycmF5R2V0Q291bnQocmVzdWx0X2FycmF5KQogICAgICAgIGZvciBpbmRleCBpbiByYW5nZShyZXN1bHRfY291bnQpOgogICAgICAgICAgICBpdGVtID0gQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUdldFZhbHVlQXRJbmRleCgKICAgICAgICAgICAgICAgIHJlc3VsdF9hcnJheSwgaW5kZXgKICAgICAgICAgICAgKQogICAgICAgICAgICBpdGVtID0gY3R5cGVzLmNhc3QoaXRlbSwgQ29yZUZvdW5kYXRpb24uQ0ZUeXBlUmVmKQoKICAgICAgICAgICAgaWYgX2lzX2NlcnQoaXRlbSk6CiAgICAgICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJldGFpbihpdGVtKQogICAgICAgICAgICAgICAgY2VydGlmaWNhdGVzLmFwcGVuZChpdGVtKQogICAgICAgICAgICBlbGlmIF9pc19pZGVudGl0eShpdGVtKToKICAgICAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmV0YWluKGl0ZW0pCiAgICAgICAgICAgICAgICBpZGVudGl0aWVzLmFwcGVuZChpdGVtKQogICAgZmluYWxseToKICAgICAgICBpZiByZXN1bHRfYXJyYXk6CiAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShyZXN1bHRfYXJyYXkpCgogICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShmaWxlZGF0YSkKCiAgICByZXR1cm4gKGlkZW50aXRpZXMsIGNlcnRpZmljYXRlcykKCgpkZWYgX2xvYWRfY2xpZW50X2NlcnRfY2hhaW4oa2V5Y2hhaW4sICpwYXRocyk6CiAgICAiIiIKICAgIExvYWQgY2VydGlmaWNhdGVzIGFuZCBtYXliZSBrZXlzIGZyb20gYSBudW1iZXIgb2YgZmlsZXMuIEhhcyB0aGUgZW5kIGdvYWwKICAgIG9mIHJldHVybmluZyBhIENGQXJyYXkgY29udGFpbmluZyBvbmUgU2VjSWRlbnRpdHlSZWYsIGFuZCB0aGVuIHplcm8gb3IgbW9yZQogICAgU2VjQ2VydGlmaWNhdGVSZWYgb2JqZWN0cywgc3VpdGFibGUgZm9yIHVzZSBhcyBhIGNsaWVudCBjZXJ0aWZpY2F0ZSB0cnVzdAogICAgY2hhaW4uCiAgICAiIiIKICAgICMgT2ssIHRoZSBzdHJhdGVneS4KICAgICMKICAgICMgVGhpcyByZWxpZXMgb24ga25vd2luZyB0aGF0IG1hY09TIHdpbGwgbm90IGdpdmUgeW91IGEgU2VjSWRlbnRpdHlSZWYKICAgICMgdW5sZXNzIHlvdSBoYXZlIGltcG9ydGVkIGEga2V5IGludG8gYSBrZXljaGFpbi4gVGhpcyBpcyBhIHNvbWV3aGF0CiAgICAjIGFydGlmaWNpYWwgbGltaXRhdGlvbiBvZiBtYWNPUyAoZm9yIGV4YW1wbGUsIGl0IGRvZXNuJ3QgbmVjZXNzYXJpbHkKICAgICMgYWZmZWN0IGlPUyksIGJ1dCB0aGVyZSBpcyBub3RoaW5nIGluc2lkZSBTZWN1cml0eS5mcmFtZXdvcmsgdGhhdCBsZXRzIHlvdQogICAgIyBnZXQgYSBTZWNJZGVudGl0eVJlZiB3aXRob3V0IGhhdmluZyBhIGtleSBpbiBhIGtleWNoYWluLgogICAgIwogICAgIyBTbyB0aGUgcG9saWN5IGhlcmUgaXMgd2UgdGFrZSBhbGwgdGhlIGZpbGVzIGFuZCBpdGVyYXRlIHRoZW0gaW4gb3JkZXIuCiAgICAjIEVhY2ggb25lIHdpbGwgdXNlIFNlY0l0ZW1JbXBvcnQgdG8gaGF2ZSBvbmUgb3IgbW9yZSBvYmplY3RzIGxvYWRlZCBmcm9tCiAgICAjIGl0LiBXZSB3aWxsIGFsc28gcG9pbnQgYXQgYSBrZXljaGFpbiB0aGF0IG1hY09TIGNhbiB1c2UgdG8gd29yayB3aXRoIHRoZQogICAgIyBwcml2YXRlIGtleS4KICAgICMKICAgICMgT25jZSB3ZSBoYXZlIGFsbCB0aGUgb2JqZWN0cywgd2UnbGwgY2hlY2sgd2hhdCB3ZSBhY3R1YWxseSBoYXZlLiBJZiB3ZQogICAgIyBhbHJlYWR5IGhhdmUgYSBTZWNJZGVudGl0eVJlZiBpbiBoYW5kLCBmYWI6IHdlJ2xsIHVzZSB0aGF0LiBPdGhlcndpc2UsCiAgICAjIHdlJ2xsIHRha2UgdGhlIGZpcnN0IGNlcnRpZmljYXRlICh3aGljaCB3ZSBhc3N1bWUgdG8gYmUgb3VyIGxlYWYpIGFuZAogICAgIyBhc2sgdGhlIGtleWNoYWluIHRvIGdpdmUgdXMgYSBTZWNJZGVudGl0eVJlZiB3aXRoIHRoYXQgY2VydCdzIGFzc29jaWF0ZWQKICAgICMga2V5LgogICAgIwogICAgIyBXZSdsbCB0aGVuIHJldHVybiBhIENGQXJyYXkgY29udGFpbmluZyB0aGUgdHJ1c3QgY2hhaW46IG9uZQogICAgIyBTZWNJZGVudGl0eVJlZiBhbmQgdGhlbiB6ZXJvLW9yLW1vcmUgU2VjQ2VydGlmaWNhdGVSZWYgb2JqZWN0cy4gVGhlCiAgICAjIHJlc3BvbnNpYmlsaXR5IGZvciBmcmVlaW5nIHRoaXMgQ0ZBcnJheSB3aWxsIGJlIHdpdGggdGhlIGNhbGxlci4gVGhpcwogICAgIyBDRkFycmF5IG11c3QgcmVtYWluIGFsaXZlIGZvciB0aGUgZW50aXJlIGNvbm5lY3Rpb24sIHNvIGluIHByYWN0aWNlIGl0CiAgICAjIHdpbGwgYmUgc3RvcmVkIHdpdGggYSBzaW5nbGUgU1NMU29ja2V0LCBhbG9uZyB3aXRoIHRoZSByZWZlcmVuY2UgdG8gdGhlCiAgICAjIGtleWNoYWluLgogICAgY2VydGlmaWNhdGVzID0gW10KICAgIGlkZW50aXRpZXMgPSBbXQoKICAgICMgRmlsdGVyIG91dCBiYWQgcGF0aHMuCiAgICBwYXRocyA9IChwYXRoIGZvciBwYXRoIGluIHBhdGhzIGlmIHBhdGgpCgogICAgdHJ5OgogICAgICAgIGZvciBmaWxlX3BhdGggaW4gcGF0aHM6CiAgICAgICAgICAgIG5ld19pZGVudGl0aWVzLCBuZXdfY2VydHMgPSBfbG9hZF9pdGVtc19mcm9tX2ZpbGUoCiAgICAgICAgICAgICAgICBrZXljaGFpbiwgZmlsZV9wYXRoCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWRlbnRpdGllcy5leHRlbmQobmV3X2lkZW50aXRpZXMpCiAgICAgICAgICAgIGNlcnRpZmljYXRlcy5leHRlbmQobmV3X2NlcnRzKQoKICAgICAgICAjIE9rLCB3ZSBoYXZlIGV2ZXJ5dGhpbmcuIFRoZSBxdWVzdGlvbiBpczogZG8gd2UgaGF2ZSBhbiBpZGVudGl0eT8gSWYKICAgICAgICAjIG5vdCwgd2Ugd2FudCB0byBncmFiIG9uZSBmcm9tIHRoZSBmaXJzdCBjZXJ0IHdlIGhhdmUuCiAgICAgICAgaWYgbm90IGlkZW50aXRpZXM6CiAgICAgICAgICAgIG5ld19pZGVudGl0eSA9IFNlY3VyaXR5LlNlY0lkZW50aXR5UmVmKCkKICAgICAgICAgICAgc3RhdHVzID0gU2VjdXJpdHkuU2VjSWRlbnRpdHlDcmVhdGVXaXRoQ2VydGlmaWNhdGUoCiAgICAgICAgICAgICAgICBrZXljaGFpbiwKICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlc1swXSwKICAgICAgICAgICAgICAgIGN0eXBlcy5ieXJlZihuZXdfaWRlbnRpdHkpCiAgICAgICAgICAgICkKICAgICAgICAgICAgX2Fzc2VydF9ub19lcnJvcihzdGF0dXMpCiAgICAgICAgICAgIGlkZW50aXRpZXMuYXBwZW5kKG5ld19pZGVudGl0eSkKCiAgICAgICAgICAgICMgV2Ugbm93IHdhbnQgdG8gcmVsZWFzZSB0aGUgb3JpZ2luYWwgY2VydGlmaWNhdGUsIGFzIHdlIG5vIGxvbmdlcgogICAgICAgICAgICAjIG5lZWQgaXQuCiAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShjZXJ0aWZpY2F0ZXMucG9wKDApKQoKICAgICAgICAjIFdlIG5vdyBuZWVkIHRvIGJ1aWxkIGEgbmV3IENGQXJyYXkgdGhhdCBob2xkcyB0aGUgdHJ1c3QgY2hhaW4uCiAgICAgICAgdHJ1c3RfY2hhaW4gPSBDb3JlRm91bmRhdGlvbi5DRkFycmF5Q3JlYXRlTXV0YWJsZSgKICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24ua0NGQWxsb2NhdG9yRGVmYXVsdCwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgY3R5cGVzLmJ5cmVmKENvcmVGb3VuZGF0aW9uLmtDRlR5cGVBcnJheUNhbGxCYWNrcyksCiAgICAgICAgKQogICAgICAgIGZvciBpdGVtIGluIGl0ZXJ0b29scy5jaGFpbihpZGVudGl0aWVzLCBjZXJ0aWZpY2F0ZXMpOgogICAgICAgICAgICAjIEFycmF5QXBwZW5kVmFsdWUgZG9lcyBhIENGUmV0YWluIG9uIHRoZSBpdGVtLiBUaGF0J3MgZmluZSwKICAgICAgICAgICAgIyBiZWNhdXNlIHRoZSBmaW5hbGx5IGJsb2NrIHdpbGwgcmVsZWFzZSBvdXIgb3RoZXIgcmVmcyB0byB0aGVtLgogICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5QXBwZW5kVmFsdWUodHJ1c3RfY2hhaW4sIGl0ZW0pCgogICAgICAgIHJldHVybiB0cnVzdF9jaGFpbgogICAgZmluYWxseToKICAgICAgICBmb3Igb2JqIGluIGl0ZXJ0b29scy5jaGFpbihpZGVudGl0aWVzLCBjZXJ0aWZpY2F0ZXMpOgogICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2Uob2JqKQpQSwMEFAAAAAAAAAAhABjDrZNxKgAAcSoAADgAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL2FwcGVuZ2luZS5weSIiIgpUaGlzIG1vZHVsZSBwcm92aWRlcyBhIHBvb2wgbWFuYWdlciB0aGF0IHVzZXMgR29vZ2xlIEFwcCBFbmdpbmUncwpgVVJMRmV0Y2ggU2VydmljZSA8aHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL2FwcGVuZ2luZS9kb2NzL3B5dGhvbi91cmxmZXRjaD5gXy4KCkV4YW1wbGUgdXNhZ2U6OgoKICAgIGZyb20gdXJsbGliMyBpbXBvcnQgUG9vbE1hbmFnZXIKICAgIGZyb20gdXJsbGliMy5jb250cmliLmFwcGVuZ2luZSBpbXBvcnQgQXBwRW5naW5lTWFuYWdlciwgaXNfYXBwZW5naW5lX3NhbmRib3gKCiAgICBpZiBpc19hcHBlbmdpbmVfc2FuZGJveCgpOgogICAgICAgICMgQXBwRW5naW5lTWFuYWdlciB1c2VzIEFwcEVuZ2luZSdzIFVSTEZldGNoIEFQSSBiZWhpbmQgdGhlIHNjZW5lcwogICAgICAgIGh0dHAgPSBBcHBFbmdpbmVNYW5hZ2VyKCkKICAgIGVsc2U6CiAgICAgICAgIyBQb29sTWFuYWdlciB1c2VzIGEgc29ja2V0LWxldmVsIEFQSSBiZWhpbmQgdGhlIHNjZW5lcwogICAgICAgIGh0dHAgPSBQb29sTWFuYWdlcigpCgogICAgciA9IGh0dHAucmVxdWVzdCgnR0VUJywgJ2h0dHBzOi8vZ29vZ2xlLmNvbS8nKQoKVGhlcmUgYXJlIGBsaW1pdGF0aW9ucyA8aHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL2FwcGVuZ2luZS9kb2NzL3B5dGhvbi9cCnVybGZldGNoLyNQeXRob25fUXVvdGFzX2FuZF9saW1pdHM+YF8gdG8gdGhlIFVSTEZldGNoIHNlcnZpY2UgYW5kIGl0IG1heSBub3QgYmUKdGhlIGJlc3QgY2hvaWNlIGZvciB5b3VyIGFwcGxpY2F0aW9uLiBUaGVyZSBhcmUgdGhyZWUgb3B0aW9ucyBmb3IgdXNpbmcKdXJsbGliMyBvbiBHb29nbGUgQXBwIEVuZ2luZToKCjEuIFlvdSBjYW4gdXNlIDpjbGFzczpgQXBwRW5naW5lTWFuYWdlcmAgd2l0aCBVUkxGZXRjaC4gVVJMRmV0Y2ggaXMKICAgY29zdC1lZmZlY3RpdmUgaW4gbWFueSBjaXJjdW1zdGFuY2VzIGFzIGxvbmcgYXMgeW91ciB1c2FnZSBpcyB3aXRoaW4gdGhlCiAgIGxpbWl0YXRpb25zLgoyLiBZb3UgY2FuIHVzZSBhIG5vcm1hbCA6Y2xhc3M6YH51cmxsaWIzLlBvb2xNYW5hZ2VyYCBieSBlbmFibGluZyBzb2NrZXRzLgogICBTb2NrZXRzIGFsc28gaGF2ZSBgbGltaXRhdGlvbnMgYW5kIHJlc3RyaWN0aW9ucwogICA8aHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL2FwcGVuZ2luZS9kb2NzL3B5dGhvbi9zb2NrZXRzL1wKICAgI2xpbWl0YXRpb25zLWFuZC1yZXN0cmljdGlvbnM+YF8gYW5kIGhhdmUgYSBsb3dlciBmcmVlIHF1b3RhIHRoYW4gVVJMRmV0Y2guCiAgIFRvIHVzZSBzb2NrZXRzLCBiZSBzdXJlIHRvIHNwZWNpZnkgdGhlIGZvbGxvd2luZyBpbiB5b3VyIGBgYXBwLnlhbWxgYDo6CgogICAgICAgIGVudl92YXJpYWJsZXM6CiAgICAgICAgICAgIEdBRV9VU0VfU09DS0VUU19IVFRQTElCIDogJ3RydWUnCgozLiBJZiB5b3UgYXJlIHVzaW5nIGBBcHAgRW5naW5lIEZsZXhpYmxlCjxodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vYXBwZW5naW5lL2RvY3MvZmxleGlibGUvPmBfLCB5b3UgY2FuIHVzZSB0aGUgc3RhbmRhcmQKOmNsYXNzOmBQb29sTWFuYWdlcmAgd2l0aG91dCBhbnkgY29uZmlndXJhdGlvbiBvciBzcGVjaWFsIGVudmlyb25tZW50IHZhcmlhYmxlcy4KIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHdhcm5pbmdzCmZyb20gLi5wYWNrYWdlcy5zaXgubW92ZXMudXJsbGliLnBhcnNlIGltcG9ydCB1cmxqb2luCgpmcm9tIC4uZXhjZXB0aW9ucyBpbXBvcnQgKAogICAgSFRUUEVycm9yLAogICAgSFRUUFdhcm5pbmcsCiAgICBNYXhSZXRyeUVycm9yLAogICAgUHJvdG9jb2xFcnJvciwKICAgIFRpbWVvdXRFcnJvciwKICAgIFNTTEVycm9yCikKCmZyb20gLi5wYWNrYWdlcy5zaXggaW1wb3J0IEJ5dGVzSU8KZnJvbSAuLnJlcXVlc3QgaW1wb3J0IFJlcXVlc3RNZXRob2RzCmZyb20gLi5yZXNwb25zZSBpbXBvcnQgSFRUUFJlc3BvbnNlCmZyb20gLi51dGlsLnRpbWVvdXQgaW1wb3J0IFRpbWVvdXQKZnJvbSAuLnV0aWwucmV0cnkgaW1wb3J0IFJldHJ5Cgp0cnk6CiAgICBmcm9tIGdvb2dsZS5hcHBlbmdpbmUuYXBpIGltcG9ydCB1cmxmZXRjaApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICB1cmxmZXRjaCA9IE5vbmUKCgpsb2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBBcHBFbmdpbmVQbGF0Zm9ybVdhcm5pbmcoSFRUUFdhcm5pbmcpOgogICAgcGFzcwoKCmNsYXNzIEFwcEVuZ2luZVBsYXRmb3JtRXJyb3IoSFRUUEVycm9yKToKICAgIHBhc3MKCgpjbGFzcyBBcHBFbmdpbmVNYW5hZ2VyKFJlcXVlc3RNZXRob2RzKToKICAgICIiIgogICAgQ29ubmVjdGlvbiBtYW5hZ2VyIGZvciBHb29nbGUgQXBwIEVuZ2luZSBzYW5kYm94IGFwcGxpY2F0aW9ucy4KCiAgICBUaGlzIG1hbmFnZXIgdXNlcyB0aGUgVVJMRmV0Y2ggc2VydmljZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nIHRoZQogICAgZW11bGF0ZWQgaHR0cGxpYiwgYW5kIGlzIHN1YmplY3QgdG8gVVJMRmV0Y2ggbGltaXRhdGlvbnMgYXMgZGVzY3JpYmVkIGluCiAgICB0aGUgQXBwIEVuZ2luZSBkb2N1bWVudGF0aW9uIGBoZXJlCiAgICA8aHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL2FwcGVuZ2luZS9kb2NzL3B5dGhvbi91cmxmZXRjaD5gXy4KCiAgICBOb3RhYmx5IGl0IHdpbGwgcmFpc2UgYW4gOmNsYXNzOmBBcHBFbmdpbmVQbGF0Zm9ybUVycm9yYCBpZjoKICAgICAgICAqIFVSTEZldGNoIGlzIG5vdCBhdmFpbGFibGUuCiAgICAgICAgKiBJZiB5b3UgYXR0ZW1wdCB0byB1c2UgdGhpcyBvbiBBcHAgRW5naW5lIEZsZXhpYmxlLCBhcyBmdWxsIHNvY2tldAogICAgICAgICAgc3VwcG9ydCBpcyBhdmFpbGFibGUuCiAgICAgICAgKiBJZiBhIHJlcXVlc3Qgc2l6ZSBpcyBtb3JlIHRoYW4gMTAgbWVnYWJ5dGVzLgogICAgICAgICogSWYgYSByZXNwb25zZSBzaXplIGlzIG1vcmUgdGhhbiAzMiBtZWdhYnR5ZXMuCiAgICAgICAgKiBJZiB5b3UgdXNlIGFuIHVuc3VwcG9ydGVkIHJlcXVlc3QgbWV0aG9kIHN1Y2ggYXMgT1BUSU9OUy4KCiAgICBCZXlvbmQgdGhvc2UgY2FzZXMsIGl0IHdpbGwgcmFpc2Ugbm9ybWFsIHVybGxpYjMgZXJyb3JzLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhlYWRlcnM9Tm9uZSwgcmV0cmllcz1Ob25lLCB2YWxpZGF0ZV9jZXJ0aWZpY2F0ZT1UcnVlLAogICAgICAgICAgICAgICAgIHVybGZldGNoX3JldHJpZXM9VHJ1ZSk6CiAgICAgICAgaWYgbm90IHVybGZldGNoOgogICAgICAgICAgICByYWlzZSBBcHBFbmdpbmVQbGF0Zm9ybUVycm9yKAogICAgICAgICAgICAgICAgIlVSTEZldGNoIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudC4iKQoKICAgICAgICBpZiBpc19wcm9kX2FwcGVuZ2luZV9tdm1zKCk6CiAgICAgICAgICAgIHJhaXNlIEFwcEVuZ2luZVBsYXRmb3JtRXJyb3IoCiAgICAgICAgICAgICAgICAiVXNlIG5vcm1hbCB1cmxsaWIzLlBvb2xNYW5hZ2VyIGluc3RlYWQgb2YgQXBwRW5naW5lTWFuYWdlciIKICAgICAgICAgICAgICAgICJvbiBNYW5hZ2VkIFZNcywgYXMgdXNpbmcgVVJMRmV0Y2ggaXMgbm90IG5lY2Vzc2FyeSBpbiAiCiAgICAgICAgICAgICAgICAidGhpcyBlbnZpcm9ubWVudC4iKQoKICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAidXJsbGliMyBpcyB1c2luZyBVUkxGZXRjaCBvbiBHb29nbGUgQXBwIEVuZ2luZSBzYW5kYm94IGluc3RlYWQgIgogICAgICAgICAgICAib2Ygc29ja2V0cy4gVG8gdXNlIHNvY2tldHMgZGlyZWN0bHkgaW5zdGVhZCBvZiBVUkxGZXRjaCBzZWUgIgogICAgICAgICAgICAiaHR0cHM6Ly91cmxsaWIzLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9yZWZlcmVuY2UvdXJsbGliMy5jb250cmliLmh0bWwuIiwKICAgICAgICAgICAgQXBwRW5naW5lUGxhdGZvcm1XYXJuaW5nKQoKICAgICAgICBSZXF1ZXN0TWV0aG9kcy5fX2luaXRfXyhzZWxmLCBoZWFkZXJzKQogICAgICAgIHNlbGYudmFsaWRhdGVfY2VydGlmaWNhdGUgPSB2YWxpZGF0ZV9jZXJ0aWZpY2F0ZQogICAgICAgIHNlbGYudXJsZmV0Y2hfcmV0cmllcyA9IHVybGZldGNoX3JldHJpZXMKCiAgICAgICAgc2VsZi5yZXRyaWVzID0gcmV0cmllcyBvciBSZXRyeS5ERUZBVUxUCgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbCwgZXhjX3RiKToKICAgICAgICAjIFJldHVybiBGYWxzZSB0byByZS1yYWlzZSBhbnkgcG90ZW50aWFsIGV4Y2VwdGlvbnMKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgdXJsb3BlbihzZWxmLCBtZXRob2QsIHVybCwgYm9keT1Ob25lLCBoZWFkZXJzPU5vbmUsCiAgICAgICAgICAgICAgICByZXRyaWVzPU5vbmUsIHJlZGlyZWN0PVRydWUsIHRpbWVvdXQ9VGltZW91dC5ERUZBVUxUX1RJTUVPVVQsCiAgICAgICAgICAgICAgICAqKnJlc3BvbnNlX2t3KToKCiAgICAgICAgcmV0cmllcyA9IHNlbGYuX2dldF9yZXRyaWVzKHJldHJpZXMsIHJlZGlyZWN0KQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZvbGxvd19yZWRpcmVjdHMgPSAoCiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3QgYW5kCiAgICAgICAgICAgICAgICAgICAgcmV0cmllcy5yZWRpcmVjdCAhPSAwIGFuZAogICAgICAgICAgICAgICAgICAgIHJldHJpZXMudG90YWwpCiAgICAgICAgICAgIHJlc3BvbnNlID0gdXJsZmV0Y2guZmV0Y2goCiAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICAgICBwYXlsb2FkPWJvZHksCiAgICAgICAgICAgICAgICBtZXRob2Q9bWV0aG9kLAogICAgICAgICAgICAgICAgaGVhZGVycz1oZWFkZXJzIG9yIHt9LAogICAgICAgICAgICAgICAgYWxsb3dfdHJ1bmNhdGVkPUZhbHNlLAogICAgICAgICAgICAgICAgZm9sbG93X3JlZGlyZWN0cz1zZWxmLnVybGZldGNoX3JldHJpZXMgYW5kIGZvbGxvd19yZWRpcmVjdHMsCiAgICAgICAgICAgICAgICBkZWFkbGluZT1zZWxmLl9nZXRfYWJzb2x1dGVfdGltZW91dCh0aW1lb3V0KSwKICAgICAgICAgICAgICAgIHZhbGlkYXRlX2NlcnRpZmljYXRlPXNlbGYudmFsaWRhdGVfY2VydGlmaWNhdGUsCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgdXJsZmV0Y2guRGVhZGxpbmVFeGNlZWRlZEVycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIFRpbWVvdXRFcnJvcihzZWxmLCBlKQoKICAgICAgICBleGNlcHQgdXJsZmV0Y2guSW52YWxpZFVSTEVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmICd0b28gbGFyZ2UnIGluIHN0cihlKToKICAgICAgICAgICAgICAgIHJhaXNlIEFwcEVuZ2luZVBsYXRmb3JtRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIlVSTEZldGNoIHJlcXVlc3QgdG9vIGxhcmdlLCBVUkxGZXRjaCBvbmx5ICIKICAgICAgICAgICAgICAgICAgICAic3VwcG9ydHMgcmVxdWVzdHMgdXAgdG8gMTBtYiBpbiBzaXplLiIsIGUpCiAgICAgICAgICAgIHJhaXNlIFByb3RvY29sRXJyb3IoZSkKCiAgICAgICAgZXhjZXB0IHVybGZldGNoLkRvd25sb2FkRXJyb3IgYXMgZToKICAgICAgICAgICAgaWYgJ1RvbyBtYW55IHJlZGlyZWN0cycgaW4gc3RyKGUpOgogICAgICAgICAgICAgICAgcmFpc2UgTWF4UmV0cnlFcnJvcihzZWxmLCB1cmwsIHJlYXNvbj1lKQogICAgICAgICAgICByYWlzZSBQcm90b2NvbEVycm9yKGUpCgogICAgICAgIGV4Y2VwdCB1cmxmZXRjaC5SZXNwb25zZVRvb0xhcmdlRXJyb3IgYXMgZToKICAgICAgICAgICAgcmFpc2UgQXBwRW5naW5lUGxhdGZvcm1FcnJvcigKICAgICAgICAgICAgICAgICJVUkxGZXRjaCByZXNwb25zZSB0b28gbGFyZ2UsIFVSTEZldGNoIG9ubHkgc3VwcG9ydHMiCiAgICAgICAgICAgICAgICAicmVzcG9uc2VzIHVwIHRvIDMybWIgaW4gc2l6ZS4iLCBlKQoKICAgICAgICBleGNlcHQgdXJsZmV0Y2guU1NMQ2VydGlmaWNhdGVFcnJvciBhcyBlOgogICAgICAgICAgICByYWlzZSBTU0xFcnJvcihlKQoKICAgICAgICBleGNlcHQgdXJsZmV0Y2guSW52YWxpZE1ldGhvZEVycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEFwcEVuZ2luZVBsYXRmb3JtRXJyb3IoCiAgICAgICAgICAgICAgICAiVVJMRmV0Y2ggZG9lcyBub3Qgc3VwcG9ydCBtZXRob2Q6ICVzIiAlIG1ldGhvZCwgZSkKCiAgICAgICAgaHR0cF9yZXNwb25zZSA9IHNlbGYuX3VybGZldGNoX3Jlc3BvbnNlX3RvX2h0dHBfcmVzcG9uc2UoCiAgICAgICAgICAgIHJlc3BvbnNlLCByZXRyaWVzPXJldHJpZXMsICoqcmVzcG9uc2Vfa3cpCgogICAgICAgICMgSGFuZGxlIHJlZGlyZWN0PwogICAgICAgIHJlZGlyZWN0X2xvY2F0aW9uID0gcmVkaXJlY3QgYW5kIGh0dHBfcmVzcG9uc2UuZ2V0X3JlZGlyZWN0X2xvY2F0aW9uKCkKICAgICAgICBpZiByZWRpcmVjdF9sb2NhdGlvbjoKICAgICAgICAgICAgIyBDaGVjayBmb3IgcmVkaXJlY3QgcmVzcG9uc2UKICAgICAgICAgICAgaWYgKHNlbGYudXJsZmV0Y2hfcmV0cmllcyBhbmQgcmV0cmllcy5yYWlzZV9vbl9yZWRpcmVjdCk6CiAgICAgICAgICAgICAgICByYWlzZSBNYXhSZXRyeUVycm9yKHNlbGYsIHVybCwgInRvbyBtYW55IHJlZGlyZWN0cyIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBodHRwX3Jlc3BvbnNlLnN0YXR1cyA9PSAzMDM6CiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ0dFVCcKCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmV0cmllcyA9IHJldHJpZXMuaW5jcmVtZW50KG1ldGhvZCwgdXJsLCByZXNwb25zZT1odHRwX3Jlc3BvbnNlLCBfcG9vbD1zZWxmKQogICAgICAgICAgICAgICAgZXhjZXB0IE1heFJldHJ5RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgaWYgcmV0cmllcy5yYWlzZV9vbl9yZWRpcmVjdDoKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgTWF4UmV0cnlFcnJvcihzZWxmLCB1cmwsICJ0b28gbWFueSByZWRpcmVjdHMiKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBodHRwX3Jlc3BvbnNlCgogICAgICAgICAgICAgICAgcmV0cmllcy5zbGVlcF9mb3JfcmV0cnkoaHR0cF9yZXNwb25zZSkKICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVkaXJlY3RpbmcgJXMgLT4gJXMiLCB1cmwsIHJlZGlyZWN0X2xvY2F0aW9uKQogICAgICAgICAgICAgICAgcmVkaXJlY3RfdXJsID0gdXJsam9pbih1cmwsIHJlZGlyZWN0X2xvY2F0aW9uKQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudXJsb3BlbigKICAgICAgICAgICAgICAgICAgICBtZXRob2QsIHJlZGlyZWN0X3VybCwgYm9keSwgaGVhZGVycywKICAgICAgICAgICAgICAgICAgICByZXRyaWVzPXJldHJpZXMsIHJlZGlyZWN0PXJlZGlyZWN0LAogICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9dGltZW91dCwgKipyZXNwb25zZV9rdykKCiAgICAgICAgIyBDaGVjayBpZiB3ZSBzaG91bGQgcmV0cnkgdGhlIEhUVFAgcmVzcG9uc2UuCiAgICAgICAgaGFzX3JldHJ5X2FmdGVyID0gYm9vbChodHRwX3Jlc3BvbnNlLmdldGhlYWRlcignUmV0cnktQWZ0ZXInKSkKICAgICAgICBpZiByZXRyaWVzLmlzX3JldHJ5KG1ldGhvZCwgaHR0cF9yZXNwb25zZS5zdGF0dXMsIGhhc19yZXRyeV9hZnRlcik6CiAgICAgICAgICAgIHJldHJpZXMgPSByZXRyaWVzLmluY3JlbWVudCgKICAgICAgICAgICAgICAgIG1ldGhvZCwgdXJsLCByZXNwb25zZT1odHRwX3Jlc3BvbnNlLCBfcG9vbD1zZWxmKQogICAgICAgICAgICBsb2cuZGVidWcoIlJldHJ5OiAlcyIsIHVybCkKICAgICAgICAgICAgcmV0cmllcy5zbGVlcChodHRwX3Jlc3BvbnNlKQogICAgICAgICAgICByZXR1cm4gc2VsZi51cmxvcGVuKAogICAgICAgICAgICAgICAgbWV0aG9kLCB1cmwsCiAgICAgICAgICAgICAgICBib2R5PWJvZHksIGhlYWRlcnM9aGVhZGVycywKICAgICAgICAgICAgICAgIHJldHJpZXM9cmV0cmllcywgcmVkaXJlY3Q9cmVkaXJlY3QsCiAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXQsICoqcmVzcG9uc2Vfa3cpCgogICAgICAgIHJldHVybiBodHRwX3Jlc3BvbnNlCgogICAgZGVmIF91cmxmZXRjaF9yZXNwb25zZV90b19odHRwX3Jlc3BvbnNlKHNlbGYsIHVybGZldGNoX3Jlc3AsICoqcmVzcG9uc2Vfa3cpOgoKICAgICAgICBpZiBpc19wcm9kX2FwcGVuZ2luZSgpOgogICAgICAgICAgICAjIFByb2R1Y3Rpb24gR0FFIGhhbmRsZXMgZGVmbGF0ZSBlbmNvZGluZyBhdXRvbWF0aWNhbGx5LCBidXQgZG9lcwogICAgICAgICAgICAjIG5vdCByZW1vdmUgdGhlIGVuY29kaW5nIGhlYWRlci4KICAgICAgICAgICAgY29udGVudF9lbmNvZGluZyA9IHVybGZldGNoX3Jlc3AuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZW5jb2RpbmcnKQoKICAgICAgICAgICAgaWYgY29udGVudF9lbmNvZGluZyA9PSAnZGVmbGF0ZSc6CiAgICAgICAgICAgICAgICBkZWwgdXJsZmV0Y2hfcmVzcC5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10KCiAgICAgICAgdHJhbnNmZXJfZW5jb2RpbmcgPSB1cmxmZXRjaF9yZXNwLmhlYWRlcnMuZ2V0KCd0cmFuc2Zlci1lbmNvZGluZycpCiAgICAgICAgIyBXZSBoYXZlIGEgZnVsbCByZXNwb25zZSdzIGNvbnRlbnQsCiAgICAgICAgIyBzbyBsZXQncyBtYWtlIHN1cmUgd2UgZG9uJ3QgcmVwb3J0IG91cnNlbHZlcyBhcyBjaHVua2VkIGRhdGEuCiAgICAgICAgaWYgdHJhbnNmZXJfZW5jb2RpbmcgPT0gJ2NodW5rZWQnOgogICAgICAgICAgICBlbmNvZGluZ3MgPSB0cmFuc2Zlcl9lbmNvZGluZy5zcGxpdCgiLCIpCiAgICAgICAgICAgIGVuY29kaW5ncy5yZW1vdmUoJ2NodW5rZWQnKQogICAgICAgICAgICB1cmxmZXRjaF9yZXNwLmhlYWRlcnNbJ3RyYW5zZmVyLWVuY29kaW5nJ10gPSAnLCcuam9pbihlbmNvZGluZ3MpCgogICAgICAgIHJldHVybiBIVFRQUmVzcG9uc2UoCiAgICAgICAgICAgICMgSW4gb3JkZXIgZm9yIGRlY29kaW5nIHRvIHdvcmssIHdlIG11c3QgcHJlc2VudCB0aGUgY29udGVudCBhcwogICAgICAgICAgICAjIGEgZmlsZS1saWtlIG9iamVjdC4KICAgICAgICAgICAgYm9keT1CeXRlc0lPKHVybGZldGNoX3Jlc3AuY29udGVudCksCiAgICAgICAgICAgIGhlYWRlcnM9dXJsZmV0Y2hfcmVzcC5oZWFkZXJzLAogICAgICAgICAgICBzdGF0dXM9dXJsZmV0Y2hfcmVzcC5zdGF0dXNfY29kZSwKICAgICAgICAgICAgKipyZXNwb25zZV9rdwogICAgICAgICkKCiAgICBkZWYgX2dldF9hYnNvbHV0ZV90aW1lb3V0KHNlbGYsIHRpbWVvdXQpOgogICAgICAgIGlmIHRpbWVvdXQgaXMgVGltZW91dC5ERUZBVUxUX1RJTUVPVVQ6CiAgICAgICAgICAgIHJldHVybiBOb25lICAjIERlZmVyIHRvIFVSTEZldGNoJ3MgZGVmYXVsdC4KICAgICAgICBpZiBpc2luc3RhbmNlKHRpbWVvdXQsIFRpbWVvdXQpOgogICAgICAgICAgICBpZiB0aW1lb3V0Ll9yZWFkIGlzIG5vdCBOb25lIG9yIHRpbWVvdXQuX2Nvbm5lY3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgICAgICJVUkxGZXRjaCBkb2VzIG5vdCBzdXBwb3J0IGdyYW51bGFyIHRpbWVvdXQgc2V0dGluZ3MsICIKICAgICAgICAgICAgICAgICAgICAicmV2ZXJ0aW5nIHRvIHRvdGFsIG9yIGRlZmF1bHQgVVJMRmV0Y2ggdGltZW91dC4iLAogICAgICAgICAgICAgICAgICAgIEFwcEVuZ2luZVBsYXRmb3JtV2FybmluZykKICAgICAgICAgICAgcmV0dXJuIHRpbWVvdXQudG90YWwKICAgICAgICByZXR1cm4gdGltZW91dAoKICAgIGRlZiBfZ2V0X3JldHJpZXMoc2VsZiwgcmV0cmllcywgcmVkaXJlY3QpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHJldHJpZXMsIFJldHJ5KToKICAgICAgICAgICAgcmV0cmllcyA9IFJldHJ5LmZyb21faW50KAogICAgICAgICAgICAgICAgcmV0cmllcywgcmVkaXJlY3Q9cmVkaXJlY3QsIGRlZmF1bHQ9c2VsZi5yZXRyaWVzKQoKICAgICAgICBpZiByZXRyaWVzLmNvbm5lY3Qgb3IgcmV0cmllcy5yZWFkIG9yIHJldHJpZXMucmVkaXJlY3Q6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiVVJMRmV0Y2ggb25seSBzdXBwb3J0cyB0b3RhbCByZXRyaWVzIGFuZCBkb2VzIG5vdCAiCiAgICAgICAgICAgICAgICAicmVjb2duaXplIGNvbm5lY3QsIHJlYWQsIG9yIHJlZGlyZWN0IHJldHJ5IHBhcmFtZXRlcnMuIiwKICAgICAgICAgICAgICAgIEFwcEVuZ2luZVBsYXRmb3JtV2FybmluZykKCiAgICAgICAgcmV0dXJuIHJldHJpZXMKCgpkZWYgaXNfYXBwZW5naW5lKCk6CiAgICByZXR1cm4gKGlzX2xvY2FsX2FwcGVuZ2luZSgpIG9yCiAgICAgICAgICAgIGlzX3Byb2RfYXBwZW5naW5lKCkgb3IKICAgICAgICAgICAgaXNfcHJvZF9hcHBlbmdpbmVfbXZtcygpKQoKCmRlZiBpc19hcHBlbmdpbmVfc2FuZGJveCgpOgogICAgcmV0dXJuIGlzX2FwcGVuZ2luZSgpIGFuZCBub3QgaXNfcHJvZF9hcHBlbmdpbmVfbXZtcygpCgoKZGVmIGlzX2xvY2FsX2FwcGVuZ2luZSgpOgogICAgcmV0dXJuICgnQVBQRU5HSU5FX1JVTlRJTUUnIGluIG9zLmVudmlyb24gYW5kCiAgICAgICAgICAgICdEZXZlbG9wbWVudC8nIGluIG9zLmVudmlyb25bJ1NFUlZFUl9TT0ZUV0FSRSddKQoKCmRlZiBpc19wcm9kX2FwcGVuZ2luZSgpOgogICAgcmV0dXJuICgnQVBQRU5HSU5FX1JVTlRJTUUnIGluIG9zLmVudmlyb24gYW5kCiAgICAgICAgICAgICdHb29nbGUgQXBwIEVuZ2luZS8nIGluIG9zLmVudmlyb25bJ1NFUlZFUl9TT0ZUV0FSRSddIGFuZAogICAgICAgICAgICBub3QgaXNfcHJvZF9hcHBlbmdpbmVfbXZtcygpKQoKCmRlZiBpc19wcm9kX2FwcGVuZ2luZV9tdm1zKCk6CiAgICByZXR1cm4gb3MuZW52aXJvbi5nZXQoJ0dBRV9WTScsIEZhbHNlKSA9PSAndHJ1ZScKUEsDBBQAAAAAAAAAIQAupXGNfhEAAH4RAAA3AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9udGxtcG9vbC5weSIiIgpOVExNIGF1dGhlbnRpY2F0aW5nIHBvb2wsIGNvbnRyaWJ1dGVkIGJ5IGVyaWtjZWRlcnN0cmFuCgpJc3N1ZSAjMTAsIHNlZTogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3VybGxpYjMvaXNzdWVzL2RldGFpbD9pZD0xMAoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gbG9nZ2luZyBpbXBvcnQgZ2V0TG9nZ2VyCmZyb20gbnRsbSBpbXBvcnQgbnRsbQoKZnJvbSAuLiBpbXBvcnQgSFRUUFNDb25uZWN0aW9uUG9vbApmcm9tIC4ucGFja2FnZXMuc2l4Lm1vdmVzLmh0dHBfY2xpZW50IGltcG9ydCBIVFRQU0Nvbm5lY3Rpb24KCgpsb2cgPSBnZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgTlRMTUNvbm5lY3Rpb25Qb29sKEhUVFBTQ29ubmVjdGlvblBvb2wpOgogICAgIiIiCiAgICBJbXBsZW1lbnRzIGFuIE5UTE0gYXV0aGVudGljYXRpb24gdmVyc2lvbiBvZiBhbiB1cmxsaWIzIGNvbm5lY3Rpb24gcG9vbAogICAgIiIiCgogICAgc2NoZW1lID0gJ2h0dHBzJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1c2VyLCBwdywgYXV0aHVybCwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBhdXRodXJsIGlzIGEgcmFuZG9tIFVSTCBvbiB0aGUgc2VydmVyIHRoYXQgaXMgcHJvdGVjdGVkIGJ5IE5UTE0uCiAgICAgICAgdXNlciBpcyB0aGUgV2luZG93cyB1c2VyLCBwcm9iYWJseSBpbiB0aGUgRE9NQUlOXFx1c2VybmFtZSBmb3JtYXQuCiAgICAgICAgcHcgaXMgdGhlIHBhc3N3b3JkIGZvciB0aGUgdXNlci4KICAgICAgICAiIiIKICAgICAgICBzdXBlcihOVExNQ29ubmVjdGlvblBvb2wsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKICAgICAgICBzZWxmLmF1dGh1cmwgPSBhdXRodXJsCiAgICAgICAgc2VsZi5yYXd1c2VyID0gdXNlcgogICAgICAgIHVzZXJfcGFydHMgPSB1c2VyLnNwbGl0KCdcXCcsIDEpCiAgICAgICAgc2VsZi5kb21haW4gPSB1c2VyX3BhcnRzWzBdLnVwcGVyKCkKICAgICAgICBzZWxmLnVzZXIgPSB1c2VyX3BhcnRzWzFdCiAgICAgICAgc2VsZi5wdyA9IHB3CgogICAgZGVmIF9uZXdfY29ubihzZWxmKToKICAgICAgICAjIFBlcmZvcm1zIHRoZSBOVExNIGhhbmRzaGFrZSB0aGF0IHNlY3VyZXMgdGhlIGNvbm5lY3Rpb24uIFRoZSBzb2NrZXQKICAgICAgICAjIG11c3QgYmUga2VwdCBvcGVuIHdoaWxlIHJlcXVlc3RzIGFyZSBwZXJmb3JtZWQuCiAgICAgICAgc2VsZi5udW1fY29ubmVjdGlvbnMgKz0gMQogICAgICAgIGxvZy5kZWJ1ZygnU3RhcnRpbmcgTlRMTSBIVFRQUyBjb25uZWN0aW9uIG5vLiAlZDogaHR0cHM6Ly8lcyVzJywKICAgICAgICAgICAgICAgICAgc2VsZi5udW1fY29ubmVjdGlvbnMsIHNlbGYuaG9zdCwgc2VsZi5hdXRodXJsKQoKICAgICAgICBoZWFkZXJzID0ge30KICAgICAgICBoZWFkZXJzWydDb25uZWN0aW9uJ10gPSAnS2VlcC1BbGl2ZScKICAgICAgICByZXFfaGVhZGVyID0gJ0F1dGhvcml6YXRpb24nCiAgICAgICAgcmVzcF9oZWFkZXIgPSAnd3d3LWF1dGhlbnRpY2F0ZScKCiAgICAgICAgY29ubiA9IEhUVFBTQ29ubmVjdGlvbihob3N0PXNlbGYuaG9zdCwgcG9ydD1zZWxmLnBvcnQpCgogICAgICAgICMgU2VuZCBuZWdvdGlhdGlvbiBtZXNzYWdlCiAgICAgICAgaGVhZGVyc1tyZXFfaGVhZGVyXSA9ICgKICAgICAgICAgICAgJ05UTE0gJXMnICUgbnRsbS5jcmVhdGVfTlRMTV9ORUdPVElBVEVfTUVTU0FHRShzZWxmLnJhd3VzZXIpKQogICAgICAgIGxvZy5kZWJ1ZygnUmVxdWVzdCBoZWFkZXJzOiAlcycsIGhlYWRlcnMpCiAgICAgICAgY29ubi5yZXF1ZXN0KCdHRVQnLCBzZWxmLmF1dGh1cmwsIE5vbmUsIGhlYWRlcnMpCiAgICAgICAgcmVzID0gY29ubi5nZXRyZXNwb25zZSgpCiAgICAgICAgcmVzaGRyID0gZGljdChyZXMuZ2V0aGVhZGVycygpKQogICAgICAgIGxvZy5kZWJ1ZygnUmVzcG9uc2Ugc3RhdHVzOiAlcyAlcycsIHJlcy5zdGF0dXMsIHJlcy5yZWFzb24pCiAgICAgICAgbG9nLmRlYnVnKCdSZXNwb25zZSBoZWFkZXJzOiAlcycsIHJlc2hkcikKICAgICAgICBsb2cuZGVidWcoJ1Jlc3BvbnNlIGRhdGE6ICVzIFsuLi5dJywgcmVzLnJlYWQoMTAwKSkKCiAgICAgICAgIyBSZW1vdmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgc29ja2V0LCBzbyB0aGF0IGl0IGNhbiBub3QgYmUgY2xvc2VkIGJ5CiAgICAgICAgIyB0aGUgcmVzcG9uc2Ugb2JqZWN0ICh3ZSB3YW50IHRvIGtlZXAgdGhlIHNvY2tldCBvcGVuKQogICAgICAgIHJlcy5mcCA9IE5vbmUKCiAgICAgICAgIyBTZXJ2ZXIgc2hvdWxkIHJlc3BvbmQgd2l0aCBhIGNoYWxsZW5nZSBtZXNzYWdlCiAgICAgICAgYXV0aF9oZWFkZXJfdmFsdWVzID0gcmVzaGRyW3Jlc3BfaGVhZGVyXS5zcGxpdCgnLCAnKQogICAgICAgIGF1dGhfaGVhZGVyX3ZhbHVlID0gTm9uZQogICAgICAgIGZvciBzIGluIGF1dGhfaGVhZGVyX3ZhbHVlczoKICAgICAgICAgICAgaWYgc1s6NV0gPT0gJ05UTE0gJzoKICAgICAgICAgICAgICAgIGF1dGhfaGVhZGVyX3ZhbHVlID0gc1s1Ol0KICAgICAgICBpZiBhdXRoX2hlYWRlcl92YWx1ZSBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ1VuZXhwZWN0ZWQgJXMgcmVzcG9uc2UgaGVhZGVyOiAlcycgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3BfaGVhZGVyLCByZXNoZHJbcmVzcF9oZWFkZXJdKSkKCiAgICAgICAgIyBTZW5kIGF1dGhlbnRpY2F0aW9uIG1lc3NhZ2UKICAgICAgICBTZXJ2ZXJDaGFsbGVuZ2UsIE5lZ290aWF0ZUZsYWdzID0gXAogICAgICAgICAgICBudGxtLnBhcnNlX05UTE1fQ0hBTExFTkdFX01FU1NBR0UoYXV0aF9oZWFkZXJfdmFsdWUpCiAgICAgICAgYXV0aF9tc2cgPSBudGxtLmNyZWF0ZV9OVExNX0FVVEhFTlRJQ0FURV9NRVNTQUdFKFNlcnZlckNoYWxsZW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51c2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRvbWFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVnb3RpYXRlRmxhZ3MpCiAgICAgICAgaGVhZGVyc1tyZXFfaGVhZGVyXSA9ICdOVExNICVzJyAlIGF1dGhfbXNnCiAgICAgICAgbG9nLmRlYnVnKCdSZXF1ZXN0IGhlYWRlcnM6ICVzJywgaGVhZGVycykKICAgICAgICBjb25uLnJlcXVlc3QoJ0dFVCcsIHNlbGYuYXV0aHVybCwgTm9uZSwgaGVhZGVycykKICAgICAgICByZXMgPSBjb25uLmdldHJlc3BvbnNlKCkKICAgICAgICBsb2cuZGVidWcoJ1Jlc3BvbnNlIHN0YXR1czogJXMgJXMnLCByZXMuc3RhdHVzLCByZXMucmVhc29uKQogICAgICAgIGxvZy5kZWJ1ZygnUmVzcG9uc2UgaGVhZGVyczogJXMnLCBkaWN0KHJlcy5nZXRoZWFkZXJzKCkpKQogICAgICAgIGxvZy5kZWJ1ZygnUmVzcG9uc2UgZGF0YTogJXMgWy4uLl0nLCByZXMucmVhZCgpWzoxMDBdKQogICAgICAgIGlmIHJlcy5zdGF0dXMgIT0gMjAwOgogICAgICAgICAgICBpZiByZXMuc3RhdHVzID09IDQwMToKICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignU2VydmVyIHJlamVjdGVkIHJlcXVlc3Q6IHdyb25nICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlcm5hbWUgb3IgcGFzc3dvcmQnKQogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ1dyb25nIHNlcnZlciByZXNwb25zZTogJXMgJXMnICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXMuc3RhdHVzLCByZXMucmVhc29uKSkKCiAgICAgICAgcmVzLmZwID0gTm9uZQogICAgICAgIGxvZy5kZWJ1ZygnQ29ubmVjdGlvbiBlc3RhYmxpc2hlZCcpCiAgICAgICAgcmV0dXJuIGNvbm4KCiAgICBkZWYgdXJsb3BlbihzZWxmLCBtZXRob2QsIHVybCwgYm9keT1Ob25lLCBoZWFkZXJzPU5vbmUsIHJldHJpZXM9MywKICAgICAgICAgICAgICAgIHJlZGlyZWN0PVRydWUsIGFzc2VydF9zYW1lX2hvc3Q9VHJ1ZSk6CiAgICAgICAgaWYgaGVhZGVycyBpcyBOb25lOgogICAgICAgICAgICBoZWFkZXJzID0ge30KICAgICAgICBoZWFkZXJzWydDb25uZWN0aW9uJ10gPSAnS2VlcC1BbGl2ZScKICAgICAgICByZXR1cm4gc3VwZXIoTlRMTUNvbm5lY3Rpb25Qb29sLCBzZWxmKS51cmxvcGVuKG1ldGhvZCwgdXJsLCBib2R5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycywgcmV0cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0X3NhbWVfaG9zdCkKUEsDBBQAAAAAAAAAIQDzKrZx+jsAAPo7AAA4AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9weW9wZW5zc2wucHkiIiIKU1NMIHdpdGggU05JXy1zdXBwb3J0IGZvciBQeXRob24gMi4gRm9sbG93IHRoZXNlIGluc3RydWN0aW9ucyBpZiB5b3Ugd291bGQKbGlrZSB0byB2ZXJpZnkgU1NMIGNlcnRpZmljYXRlcyBpbiBQeXRob24gMi4gTm90ZSwgdGhlIGRlZmF1bHQgbGlicmFyaWVzIGRvCipub3QqIGRvIGNlcnRpZmljYXRlIGNoZWNraW5nOyB5b3UgbmVlZCB0byBkbyBhZGRpdGlvbmFsIHdvcmsgdG8gdmFsaWRhdGUKY2VydGlmaWNhdGVzIHlvdXJzZWxmLgoKVGhpcyBuZWVkcyB0aGUgZm9sbG93aW5nIHBhY2thZ2VzIGluc3RhbGxlZDoKCiogcHlPcGVuU1NMICh0ZXN0ZWQgd2l0aCAxNi4wLjApCiogY3J5cHRvZ3JhcGh5IChtaW5pbXVtIDEuMy40LCBmcm9tIHB5b3BlbnNzbCkKKiBpZG5hIChtaW5pbXVtIDIuMCwgZnJvbSBjcnlwdG9ncmFwaHkpCgpIb3dldmVyLCBweW9wZW5zc2wgZGVwZW5kcyBvbiBjcnlwdG9ncmFwaHksIHdoaWNoIGRlcGVuZHMgb24gaWRuYSwgc28gd2hpbGUgd2UKdXNlIGFsbCB0aHJlZSBkaXJlY3RseSBoZXJlIHdlIGVuZCB1cCBoYXZpbmcgcmVsYXRpdmVseSBmZXcgcGFja2FnZXMgcmVxdWlyZWQuCgpZb3UgY2FuIGluc3RhbGwgdGhlbSB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKCiAgICBwaXAgaW5zdGFsbCBweW9wZW5zc2wgY3J5cHRvZ3JhcGh5IGlkbmEKClRvIGFjdGl2YXRlIGNlcnRpZmljYXRlIGNoZWNraW5nLCBjYWxsCjpmdW5jOmB+dXJsbGliMy5jb250cmliLnB5b3BlbnNzbC5pbmplY3RfaW50b191cmxsaWIzYCBmcm9tIHlvdXIgUHl0aG9uIGNvZGUKYmVmb3JlIHlvdSBiZWdpbiBtYWtpbmcgSFRUUCByZXF1ZXN0cy4gVGhpcyBjYW4gYmUgZG9uZSBpbiBhIGBgc2l0ZWN1c3RvbWl6ZWBgCm1vZHVsZSwgb3IgYXQgYW55IG90aGVyIHRpbWUgYmVmb3JlIHlvdXIgYXBwbGljYXRpb24gYmVnaW5zIHVzaW5nIGBgdXJsbGliM2BgLApsaWtlIHRoaXM6OgoKICAgIHRyeToKICAgICAgICBpbXBvcnQgdXJsbGliMy5jb250cmliLnB5b3BlbnNzbAogICAgICAgIHVybGxpYjMuY29udHJpYi5weW9wZW5zc2wuaW5qZWN0X2ludG9fdXJsbGliMygpCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcGFzcwoKTm93IHlvdSBjYW4gdXNlIDptb2Q6YHVybGxpYjNgIGFzIHlvdSBub3JtYWxseSB3b3VsZCwgYW5kIGl0IHdpbGwgc3VwcG9ydCBTTkkKd2hlbiB0aGUgcmVxdWlyZWQgbW9kdWxlcyBhcmUgaW5zdGFsbGVkLgoKQWN0aXZhdGluZyB0aGlzIG1vZHVsZSBhbHNvIGhhcyB0aGUgcG9zaXRpdmUgc2lkZSBlZmZlY3Qgb2YgZGlzYWJsaW5nIFNTTC9UTFMKY29tcHJlc3Npb24gaW4gUHl0aG9uIDIgKHNlZSBgQ1JJTUUgYXR0YWNrYF8pLgoKSWYgeW91IHdhbnQgdG8gY29uZmlndXJlIHRoZSBkZWZhdWx0IGxpc3Qgb2Ygc3VwcG9ydGVkIGNpcGhlciBzdWl0ZXMsIHlvdSBjYW4Kc2V0IHRoZSBgYHVybGxpYjMuY29udHJpYi5weW9wZW5zc2wuREVGQVVMVF9TU0xfQ0lQSEVSX0xJU1RgYCB2YXJpYWJsZS4KCi4uIF9zbmk6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NlcnZlcl9OYW1lX0luZGljYXRpb24KLi4gX2NyaW1lIGF0dGFjazogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ1JJTUVfKHNlY3VyaXR5X2V4cGxvaXQpCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IE9wZW5TU0wuU1NMCmZyb20gY3J5cHRvZ3JhcGh5IGltcG9ydCB4NTA5CmZyb20gY3J5cHRvZ3JhcGh5Lmhhem1hdC5iYWNrZW5kcy5vcGVuc3NsIGltcG9ydCBiYWNrZW5kIGFzIG9wZW5zc2xfYmFja2VuZApmcm9tIGNyeXB0b2dyYXBoeS5oYXptYXQuYmFja2VuZHMub3BlbnNzbC54NTA5IGltcG9ydCBfQ2VydGlmaWNhdGUKCmZyb20gc29ja2V0IGltcG9ydCB0aW1lb3V0LCBlcnJvciBhcyBTb2NrZXRFcnJvcgpmcm9tIGlvIGltcG9ydCBCeXRlc0lPCgp0cnk6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMgogICAgZnJvbSBzb2NrZXQgaW1wb3J0IF9maWxlb2JqZWN0CmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAzCiAgICBfZmlsZW9iamVjdCA9IE5vbmUKICAgIGZyb20gLi5wYWNrYWdlcy5iYWNrcG9ydHMubWFrZWZpbGUgaW1wb3J0IGJhY2twb3J0X21ha2VmaWxlCgppbXBvcnQgbG9nZ2luZwppbXBvcnQgc3NsCmZyb20gLi5wYWNrYWdlcyBpbXBvcnQgc2l4CmltcG9ydCBzeXMKCmZyb20gLi4gaW1wb3J0IHV0aWwKCl9fYWxsX18gPSBbJ2luamVjdF9pbnRvX3VybGxpYjMnLCAnZXh0cmFjdF9mcm9tX3VybGxpYjMnXQoKIyBTTkkgYWx3YXlzIHdvcmtzLgpIQVNfU05JID0gVHJ1ZQoKIyBNYXAgZnJvbSB1cmxsaWIzIHRvIFB5T3BlblNTTCBjb21wYXRpYmxlIHBhcmFtZXRlci12YWx1ZXMuCl9vcGVuc3NsX3ZlcnNpb25zID0gewogICAgc3NsLlBST1RPQ09MX1NTTHYyMzogT3BlblNTTC5TU0wuU1NMdjIzX01FVEhPRCwKICAgIHNzbC5QUk9UT0NPTF9UTFN2MTogT3BlblNTTC5TU0wuVExTdjFfTUVUSE9ELAp9CgppZiBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1RMU3YxXzEnKSBhbmQgaGFzYXR0cihPcGVuU1NMLlNTTCwgJ1RMU3YxXzFfTUVUSE9EJyk6CiAgICBfb3BlbnNzbF92ZXJzaW9uc1tzc2wuUFJPVE9DT0xfVExTdjFfMV0gPSBPcGVuU1NMLlNTTC5UTFN2MV8xX01FVEhPRAoKaWYgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9UTFN2MV8yJykgYW5kIGhhc2F0dHIoT3BlblNTTC5TU0wsICdUTFN2MV8yX01FVEhPRCcpOgogICAgX29wZW5zc2xfdmVyc2lvbnNbc3NsLlBST1RPQ09MX1RMU3YxXzJdID0gT3BlblNTTC5TU0wuVExTdjFfMl9NRVRIT0QKCnRyeToKICAgIF9vcGVuc3NsX3ZlcnNpb25zLnVwZGF0ZSh7c3NsLlBST1RPQ09MX1NTTHYzOiBPcGVuU1NMLlNTTC5TU0x2M19NRVRIT0R9KQpleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICBwYXNzCgpfc3RkbGliX3RvX29wZW5zc2xfdmVyaWZ5ID0gewogICAgc3NsLkNFUlRfTk9ORTogT3BlblNTTC5TU0wuVkVSSUZZX05PTkUsCiAgICBzc2wuQ0VSVF9PUFRJT05BTDogT3BlblNTTC5TU0wuVkVSSUZZX1BFRVIsCiAgICBzc2wuQ0VSVF9SRVFVSVJFRDoKICAgICAgICBPcGVuU1NMLlNTTC5WRVJJRllfUEVFUiArIE9wZW5TU0wuU1NMLlZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCwKfQpfb3BlbnNzbF90b19zdGRsaWJfdmVyaWZ5ID0gZGljdCgKICAgICh2LCBrKSBmb3IgaywgdiBpbiBfc3RkbGliX3RvX29wZW5zc2xfdmVyaWZ5Lml0ZW1zKCkKKQoKIyBPcGVuU1NMIHdpbGwgb25seSB3cml0ZSAxNksgYXQgYSB0aW1lClNTTF9XUklURV9CTE9DS1NJWkUgPSAxNjM4NAoKb3JpZ191dGlsX0hBU19TTkkgPSB1dGlsLkhBU19TTkkKb3JpZ191dGlsX1NTTENvbnRleHQgPSB1dGlsLnNzbF8uU1NMQ29udGV4dAoKCmxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmRlZiBpbmplY3RfaW50b191cmxsaWIzKCk6CiAgICAnTW9ua2V5LXBhdGNoIHVybGxpYjMgd2l0aCBQeU9wZW5TU0wtYmFja2VkIFNTTC1zdXBwb3J0LicKCiAgICBfdmFsaWRhdGVfZGVwZW5kZW5jaWVzX21ldCgpCgogICAgdXRpbC5zc2xfLlNTTENvbnRleHQgPSBQeU9wZW5TU0xDb250ZXh0CiAgICB1dGlsLkhBU19TTkkgPSBIQVNfU05JCiAgICB1dGlsLnNzbF8uSEFTX1NOSSA9IEhBU19TTkkKICAgIHV0aWwuSVNfUFlPUEVOU1NMID0gVHJ1ZQogICAgdXRpbC5zc2xfLklTX1BZT1BFTlNTTCA9IFRydWUKCgpkZWYgZXh0cmFjdF9mcm9tX3VybGxpYjMoKToKICAgICdVbmRvIG1vbmtleS1wYXRjaGluZyBieSA6ZnVuYzpgaW5qZWN0X2ludG9fdXJsbGliM2AuJwoKICAgIHV0aWwuc3NsXy5TU0xDb250ZXh0ID0gb3JpZ191dGlsX1NTTENvbnRleHQKICAgIHV0aWwuSEFTX1NOSSA9IG9yaWdfdXRpbF9IQVNfU05JCiAgICB1dGlsLnNzbF8uSEFTX1NOSSA9IG9yaWdfdXRpbF9IQVNfU05JCiAgICB1dGlsLklTX1BZT1BFTlNTTCA9IEZhbHNlCiAgICB1dGlsLnNzbF8uSVNfUFlPUEVOU1NMID0gRmFsc2UKCgpkZWYgX3ZhbGlkYXRlX2RlcGVuZGVuY2llc19tZXQoKToKICAgICIiIgogICAgVmVyaWZpZXMgdGhhdCBQeU9wZW5TU0wncyBwYWNrYWdlLWxldmVsIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gbWV0LgogICAgVGhyb3dzIGBJbXBvcnRFcnJvcmAgaWYgdGhleSBhcmUgbm90IG1ldC4KICAgICIiIgogICAgIyBNZXRob2QgYWRkZWQgaW4gYGNyeXB0b2dyYXBoeT09MS4xYDsgbm90IGF2YWlsYWJsZSBpbiBvbGRlciB2ZXJzaW9ucwogICAgZnJvbSBjcnlwdG9ncmFwaHkueDUwOS5leHRlbnNpb25zIGltcG9ydCBFeHRlbnNpb25zCiAgICBpZiBnZXRhdHRyKEV4dGVuc2lvbnMsICJnZXRfZXh0ZW5zaW9uX2Zvcl9jbGFzcyIsIE5vbmUpIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIidjcnlwdG9ncmFwaHknIG1vZHVsZSBtaXNzaW5nIHJlcXVpcmVkIGZ1bmN0aW9uYWxpdHkuICAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyeSB1cGdyYWRpbmcgdG8gdjEuMy40IG9yIG5ld2VyLiIpCgogICAgIyBweU9wZW5TU0wgMC4xNCBhbmQgYWJvdmUgdXNlIGNyeXB0b2dyYXBoeSBmb3IgT3BlblNTTCBiaW5kaW5ncy4gVGhlIF94NTA5CiAgICAjIGF0dHJpYnV0ZSBpcyBvbmx5IHByZXNlbnQgb24gdGhvc2UgdmVyc2lvbnMuCiAgICBmcm9tIE9wZW5TU0wuY3J5cHRvIGltcG9ydCBYNTA5CiAgICB4NTA5ID0gWDUwOSgpCiAgICBpZiBnZXRhdHRyKHg1MDksICJfeDUwOSIsIE5vbmUpIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIidweU9wZW5TU0wnIG1vZHVsZSBtaXNzaW5nIHJlcXVpcmVkIGZ1bmN0aW9uYWxpdHkuICIKICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJ5IHVwZ3JhZGluZyB0byB2MC4xNCBvciBuZXdlci4iKQoKCmRlZiBfZG5zbmFtZV90b19zdGRsaWIobmFtZSk6CiAgICAiIiIKICAgIENvbnZlcnRzIGEgZE5TTmFtZSBTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lIGZpZWxkIHRvIHRoZSBmb3JtIHVzZWQgYnkgdGhlCiAgICBzdGFuZGFyZCBsaWJyYXJ5IG9uIHRoZSBnaXZlbiBQeXRob24gdmVyc2lvbi4KCiAgICBDcnlwdG9ncmFwaHkgcHJvZHVjZXMgYSBkTlNOYW1lIGFzIGEgdW5pY29kZSBzdHJpbmcgdGhhdCB3YXMgaWRuYS1kZWNvZGVkCiAgICBmcm9tIEFTQ0lJIGJ5dGVzLiBXZSBuZWVkIHRvIGlkbmEtZW5jb2RlIHRoYXQgc3RyaW5nIHRvIGdldCBpdCBiYWNrLCBhbmQKICAgIHRoZW4gb24gUHl0aG9uIDMgd2UgYWxzbyBuZWVkIHRvIGNvbnZlcnQgdG8gdW5pY29kZSB2aWEgVVRGLTggKHRoZSBzdGRsaWIKICAgIHVzZXMgUHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplIG9uIGl0LCB3aGljaCBkZWNvZGVzIHZpYSBVVEYtOCkuCiAgICAiIiIKICAgIGRlZiBpZG5hX2VuY29kZShuYW1lKToKICAgICAgICAiIiIKICAgICAgICBCb3Jyb3dlZCB3aG9sZXNhbGUgZnJvbSB0aGUgUHl0aG9uIENyeXB0b2dyYXBoeSBQcm9qZWN0LiBJdCB0dXJucyBvdXQKICAgICAgICB0aGF0IHdlIGNhbid0IGp1c3Qgc2FmZWx5IGNhbGwgYGlkbmEuZW5jb2RlYDogaXQgY2FuIGV4cGxvZGUgZm9yCiAgICAgICAgd2lsZGNhcmQgbmFtZXMuIFRoaXMgYXZvaWRzIHRoYXQgcHJvYmxlbS4KICAgICAgICAiIiIKICAgICAgICBpbXBvcnQgaWRuYQoKICAgICAgICBmb3IgcHJlZml4IGluIFt1JyouJywgdScuJ106CiAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aChwcmVmaXgpOgogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWVbbGVuKHByZWZpeCk6XQogICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeC5lbmNvZGUoJ2FzY2lpJykgKyBpZG5hLmVuY29kZShuYW1lKQogICAgICAgIHJldHVybiBpZG5hLmVuY29kZShuYW1lKQoKICAgIG5hbWUgPSBpZG5hX2VuY29kZShuYW1lKQogICAgaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMywgMCk6CiAgICAgICAgbmFtZSA9IG5hbWUuZGVjb2RlKCd1dGYtOCcpCiAgICByZXR1cm4gbmFtZQoKCmRlZiBnZXRfc3Vial9hbHRfbmFtZShwZWVyX2NlcnQpOgogICAgIiIiCiAgICBHaXZlbiBhbiBQeU9wZW5TU0wgY2VydGlmaWNhdGUsIHByb3ZpZGVzIGFsbCB0aGUgc3ViamVjdCBhbHRlcm5hdGl2ZSBuYW1lcy4KICAgICIiIgogICAgIyBQYXNzIHRoZSBjZXJ0IHRvIGNyeXB0b2dyYXBoeSwgd2hpY2ggaGFzIG11Y2ggYmV0dGVyIEFQSXMgZm9yIHRoaXMuCiAgICBpZiBoYXNhdHRyKHBlZXJfY2VydCwgInRvX2NyeXB0b2dyYXBoeSIpOgogICAgICAgIGNlcnQgPSBwZWVyX2NlcnQudG9fY3J5cHRvZ3JhcGh5KCkKICAgIGVsc2U6CiAgICAgICAgIyBUaGlzIGlzIHRlY2huaWNhbGx5IHVzaW5nIHByaXZhdGUgQVBJcywgYnV0IHNob3VsZCB3b3JrIGFjcm9zcyBhbGwKICAgICAgICAjIHJlbGV2YW50IHZlcnNpb25zIGJlZm9yZSBQeU9wZW5TU0wgZ290IGEgcHJvcGVyIEFQSSBmb3IgdGhpcy4KICAgICAgICBjZXJ0ID0gX0NlcnRpZmljYXRlKG9wZW5zc2xfYmFja2VuZCwgcGVlcl9jZXJ0Ll94NTA5KQoKICAgICMgV2Ugd2FudCB0byBmaW5kIHRoZSBTQU4gZXh0ZW5zaW9uLiBBc2sgQ3J5cHRvZ3JhcGh5IHRvIGxvY2F0ZSBpdCAoaXQncwogICAgIyBmYXN0ZXIgdGhhbiBsb29waW5nIGluIFB5dGhvbikKICAgIHRyeToKICAgICAgICBleHQgPSBjZXJ0LmV4dGVuc2lvbnMuZ2V0X2V4dGVuc2lvbl9mb3JfY2xhc3MoCiAgICAgICAgICAgIHg1MDkuU3ViamVjdEFsdGVybmF0aXZlTmFtZQogICAgICAgICkudmFsdWUKICAgIGV4Y2VwdCB4NTA5LkV4dGVuc2lvbk5vdEZvdW5kOgogICAgICAgICMgTm8gc3VjaCBleHRlbnNpb24sIHJldHVybiB0aGUgZW1wdHkgbGlzdC4KICAgICAgICByZXR1cm4gW10KICAgIGV4Y2VwdCAoeDUwOS5EdXBsaWNhdGVFeHRlbnNpb24sIHg1MDkuVW5zdXBwb3J0ZWRFeHRlbnNpb24sCiAgICAgICAgICAgIHg1MDkuVW5zdXBwb3J0ZWRHZW5lcmFsTmFtZVR5cGUsIFVuaWNvZGVFcnJvcikgYXMgZToKICAgICAgICAjIEEgcHJvYmxlbSBoYXMgYmVlbiBmb3VuZCB3aXRoIHRoZSBxdWFsaXR5IG9mIHRoZSBjZXJ0aWZpY2F0ZS4gQXNzdW1lCiAgICAgICAgIyBubyBTQU4gZmllbGQgaXMgcHJlc2VudC4KICAgICAgICBsb2cud2FybmluZygKICAgICAgICAgICAgIkEgcHJvYmxlbSB3YXMgZW5jb3VudGVyZWQgd2l0aCB0aGUgY2VydGlmaWNhdGUgdGhhdCBwcmV2ZW50ZWQgIgogICAgICAgICAgICAidXJsbGliMyBmcm9tIGZpbmRpbmcgdGhlIFN1YmplY3RBbHRlcm5hdGl2ZU5hbWUgZmllbGQuIFRoaXMgY2FuICIKICAgICAgICAgICAgImFmZmVjdCBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uLiBUaGUgZXJyb3Igd2FzICVzIiwKICAgICAgICAgICAgZSwKICAgICAgICApCiAgICAgICAgcmV0dXJuIFtdCgogICAgIyBXZSB3YW50IHRvIHJldHVybiBkTlNOYW1lIGFuZCBpUEFkZHJlc3MgZmllbGRzLiBXZSBuZWVkIHRvIGNhc3QgdGhlIElQcwogICAgIyBiYWNrIHRvIHN0cmluZ3MgYmVjYXVzZSB0aGUgbWF0Y2hfaG9zdG5hbWUgZnVuY3Rpb24gd2FudHMgdGhlbSBhcwogICAgIyBzdHJpbmdzLgogICAgIyBTYWRseSB0aGUgRE5TIG5hbWVzIG5lZWQgdG8gYmUgaWRuYSBlbmNvZGVkIGFuZCB0aGVuLCBvbiBQeXRob24gMywgVVRGLTgKICAgICMgZGVjb2RlZC4gVGhpcyBpcyBwcmV0dHkgZnJ1c3RyYXRpbmcsIGJ1dCB0aGF0J3Mgd2hhdCB0aGUgc3RhbmRhcmQgbGlicmFyeQogICAgIyBkb2VzIHdpdGggY2VydGlmaWNhdGVzLCBhbmQgc28gd2UgbmVlZCB0byBhdHRlbXB0IHRvIGRvIHRoZSBzYW1lLgogICAgbmFtZXMgPSBbCiAgICAgICAgKCdETlMnLCBfZG5zbmFtZV90b19zdGRsaWIobmFtZSkpCiAgICAgICAgZm9yIG5hbWUgaW4gZXh0LmdldF92YWx1ZXNfZm9yX3R5cGUoeDUwOS5ETlNOYW1lKQogICAgXQogICAgbmFtZXMuZXh0ZW5kKAogICAgICAgICgnSVAgQWRkcmVzcycsIHN0cihuYW1lKSkKICAgICAgICBmb3IgbmFtZSBpbiBleHQuZ2V0X3ZhbHVlc19mb3JfdHlwZSh4NTA5LklQQWRkcmVzcykKICAgICkKCiAgICByZXR1cm4gbmFtZXMKCgpjbGFzcyBXcmFwcGVkU29ja2V0KG9iamVjdCk6CiAgICAnJydBUEktY29tcGF0aWJpbGl0eSB3cmFwcGVyIGZvciBQeXRob24gT3BlblNTTCdzIENvbm5lY3Rpb24tY2xhc3MuCgogICAgTm90ZTogX21ha2VmaWxlX3JlZnMsIF9kcm9wKCkgYW5kIF9yZXVzZSgpIGFyZSBuZWVkZWQgZm9yIHRoZSBnYXJiYWdlCiAgICBjb2xsZWN0b3Igb2YgcHlweS4KICAgICcnJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25uZWN0aW9uLCBzb2NrZXQsIHN1cHByZXNzX3JhZ2dlZF9lb2ZzPVRydWUpOgogICAgICAgIHNlbGYuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24KICAgICAgICBzZWxmLnNvY2tldCA9IHNvY2tldAogICAgICAgIHNlbGYuc3VwcHJlc3NfcmFnZ2VkX2VvZnMgPSBzdXBwcmVzc19yYWdnZWRfZW9mcwogICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgPSAwCiAgICAgICAgc2VsZi5fY2xvc2VkID0gRmFsc2UKCiAgICBkZWYgZmlsZW5vKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnNvY2tldC5maWxlbm8oKQoKICAgICMgQ29weS1wYXN0ZWQgZnJvbSBQeXRob24gMy41IHNvdXJjZSBjb2RlCiAgICBkZWYgX2RlY3JlZl9zb2NrZXRpb3Moc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbWFrZWZpbGVfcmVmcyA+IDA6CiAgICAgICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgLT0gMQogICAgICAgIGlmIHNlbGYuX2Nsb3NlZDoKICAgICAgICAgICAgc2VsZi5jbG9zZSgpCgogICAgZGVmIHJlY3Yoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRhdGEgPSBzZWxmLmNvbm5lY3Rpb24ucmVjdigqYXJncywgKiprd2FyZ3MpCiAgICAgICAgZXhjZXB0IE9wZW5TU0wuU1NMLlN5c0NhbGxFcnJvciBhcyBlOgogICAgICAgICAgICBpZiBzZWxmLnN1cHByZXNzX3JhZ2dlZF9lb2ZzIGFuZCBlLmFyZ3MgPT0gKC0xLCAnVW5leHBlY3RlZCBFT0YnKToKICAgICAgICAgICAgICAgIHJldHVybiBiJycKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFNvY2tldEVycm9yKHN0cihlKSkKICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuWmVyb1JldHVybkVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmIHNlbGYuY29ubmVjdGlvbi5nZXRfc2h1dGRvd24oKSA9PSBPcGVuU1NMLlNTTC5SRUNFSVZFRF9TSFVURE9XTjoKICAgICAgICAgICAgICAgIHJldHVybiBiJycKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgZXhjZXB0IE9wZW5TU0wuU1NMLldhbnRSZWFkRXJyb3I6CiAgICAgICAgICAgIHJkID0gdXRpbC53YWl0X2Zvcl9yZWFkKHNlbGYuc29ja2V0LCBzZWxmLnNvY2tldC5nZXR0aW1lb3V0KCkpCiAgICAgICAgICAgIGlmIG5vdCByZDoKICAgICAgICAgICAgICAgIHJhaXNlIHRpbWVvdXQoJ1RoZSByZWFkIG9wZXJhdGlvbiB0aW1lZCBvdXQnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVjdigqYXJncywgKiprd2FyZ3MpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBkZWYgcmVjdl9pbnRvKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0aW9uLnJlY3ZfaW50bygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgZXhjZXB0IE9wZW5TU0wuU1NMLlN5c0NhbGxFcnJvciBhcyBlOgogICAgICAgICAgICBpZiBzZWxmLnN1cHByZXNzX3JhZ2dlZF9lb2ZzIGFuZCBlLmFyZ3MgPT0gKC0xLCAnVW5leHBlY3RlZCBFT0YnKToKICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBTb2NrZXRFcnJvcihzdHIoZSkpCiAgICAgICAgZXhjZXB0IE9wZW5TU0wuU1NMLlplcm9SZXR1cm5FcnJvciBhcyBlOgogICAgICAgICAgICBpZiBzZWxmLmNvbm5lY3Rpb24uZ2V0X3NodXRkb3duKCkgPT0gT3BlblNTTC5TU0wuUkVDRUlWRURfU0hVVERPV046CiAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuV2FudFJlYWRFcnJvcjoKICAgICAgICAgICAgcmQgPSB1dGlsLndhaXRfZm9yX3JlYWQoc2VsZi5zb2NrZXQsIHNlbGYuc29ja2V0LmdldHRpbWVvdXQoKSkKICAgICAgICAgICAgaWYgbm90IHJkOgogICAgICAgICAgICAgICAgcmFpc2UgdGltZW91dCgnVGhlIHJlYWQgb3BlcmF0aW9uIHRpbWVkIG91dCcpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5yZWN2X2ludG8oKmFyZ3MsICoqa3dhcmdzKQoKICAgIGRlZiBzZXR0aW1lb3V0KHNlbGYsIHRpbWVvdXQpOgogICAgICAgIHJldHVybiBzZWxmLnNvY2tldC5zZXR0aW1lb3V0KHRpbWVvdXQpCgogICAgZGVmIF9zZW5kX3VudGlsX2RvbmUoc2VsZiwgZGF0YSk6CiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGlvbi5zZW5kKGRhdGEpCiAgICAgICAgICAgIGV4Y2VwdCBPcGVuU1NMLlNTTC5XYW50V3JpdGVFcnJvcjoKICAgICAgICAgICAgICAgIHdyID0gdXRpbC53YWl0X2Zvcl93cml0ZShzZWxmLnNvY2tldCwgc2VsZi5zb2NrZXQuZ2V0dGltZW91dCgpKQogICAgICAgICAgICAgICAgaWYgbm90IHdyOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIHRpbWVvdXQoKQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZXhjZXB0IE9wZW5TU0wuU1NMLlN5c0NhbGxFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgcmFpc2UgU29ja2V0RXJyb3Ioc3RyKGUpKQoKICAgIGRlZiBzZW5kYWxsKHNlbGYsIGRhdGEpOgogICAgICAgIHRvdGFsX3NlbnQgPSAwCiAgICAgICAgd2hpbGUgdG90YWxfc2VudCA8IGxlbihkYXRhKToKICAgICAgICAgICAgc2VudCA9IHNlbGYuX3NlbmRfdW50aWxfZG9uZShkYXRhW3RvdGFsX3NlbnQ6dG90YWxfc2VudCArIFNTTF9XUklURV9CTE9DS1NJWkVdKQogICAgICAgICAgICB0b3RhbF9zZW50ICs9IHNlbnQKCiAgICBkZWYgc2h1dGRvd24oc2VsZik6CiAgICAgICAgIyBGSVhNRSByZXRocm93IGNvbXBhdGlibGUgZXhjZXB0aW9ucyBzaG91bGQgd2UgZXZlciB1c2UgdGhpcwogICAgICAgIHNlbGYuY29ubmVjdGlvbi5zaHV0ZG93bigpCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX21ha2VmaWxlX3JlZnMgPCAxOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLl9jbG9zZWQgPSBUcnVlCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0aW9uLmNsb3NlKCkKICAgICAgICAgICAgZXhjZXB0IE9wZW5TU0wuU1NMLkVycm9yOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyAtPSAxCgogICAgZGVmIGdldHBlZXJjZXJ0KHNlbGYsIGJpbmFyeV9mb3JtPUZhbHNlKToKICAgICAgICB4NTA5ID0gc2VsZi5jb25uZWN0aW9uLmdldF9wZWVyX2NlcnRpZmljYXRlKCkKCiAgICAgICAgaWYgbm90IHg1MDk6CiAgICAgICAgICAgIHJldHVybiB4NTA5CgogICAgICAgIGlmIGJpbmFyeV9mb3JtOgogICAgICAgICAgICByZXR1cm4gT3BlblNTTC5jcnlwdG8uZHVtcF9jZXJ0aWZpY2F0ZSgKICAgICAgICAgICAgICAgIE9wZW5TU0wuY3J5cHRvLkZJTEVUWVBFX0FTTjEsCiAgICAgICAgICAgICAgICB4NTA5KQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAnc3ViamVjdCc6ICgKICAgICAgICAgICAgICAgICgoJ2NvbW1vbk5hbWUnLCB4NTA5LmdldF9zdWJqZWN0KCkuQ04pLCksCiAgICAgICAgICAgICksCiAgICAgICAgICAgICdzdWJqZWN0QWx0TmFtZSc6IGdldF9zdWJqX2FsdF9uYW1lKHg1MDkpCiAgICAgICAgfQoKICAgIGRlZiBfcmV1c2Uoc2VsZik6CiAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyArPSAxCgogICAgZGVmIF9kcm9wKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX21ha2VmaWxlX3JlZnMgPCAxOgogICAgICAgICAgICBzZWxmLmNsb3NlKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzIC09IDEKCgppZiBfZmlsZW9iamVjdDogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAyCiAgICBkZWYgbWFrZWZpbGUoc2VsZiwgbW9kZSwgYnVmc2l6ZT0tMSk6CiAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyArPSAxCiAgICAgICAgcmV0dXJuIF9maWxlb2JqZWN0KHNlbGYsIG1vZGUsIGJ1ZnNpemUsIGNsb3NlPVRydWUpCmVsc2U6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMwogICAgbWFrZWZpbGUgPSBiYWNrcG9ydF9tYWtlZmlsZQoKV3JhcHBlZFNvY2tldC5tYWtlZmlsZSA9IG1ha2VmaWxlCgoKY2xhc3MgUHlPcGVuU1NMQ29udGV4dChvYmplY3QpOgogICAgIiIiCiAgICBJIGFtIGEgd3JhcHBlciBjbGFzcyBmb3IgdGhlIFB5T3BlblNTTCBgYENvbnRleHRgYCBvYmplY3QuIEkgYW0gcmVzcG9uc2libGUKICAgIGZvciB0cmFuc2xhdGluZyB0aGUgaW50ZXJmYWNlIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGBgU1NMQ29udGV4dGBgIG9iamVjdAogICAgdG8gY2FsbHMgaW50byBQeU9wZW5TU0wuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6CiAgICAgICAgc2VsZi5wcm90b2NvbCA9IF9vcGVuc3NsX3ZlcnNpb25zW3Byb3RvY29sXQogICAgICAgIHNlbGYuX2N0eCA9IE9wZW5TU0wuU1NMLkNvbnRleHQoc2VsZi5wcm90b2NvbCkKICAgICAgICBzZWxmLl9vcHRpb25zID0gMAogICAgICAgIHNlbGYuY2hlY2tfaG9zdG5hbWUgPSBGYWxzZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG9wdGlvbnMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX29wdGlvbnMKCiAgICBAb3B0aW9ucy5zZXR0ZXIKICAgIGRlZiBvcHRpb25zKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9vcHRpb25zID0gdmFsdWUKICAgICAgICBzZWxmLl9jdHguc2V0X29wdGlvbnModmFsdWUpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmVyaWZ5X21vZGUoc2VsZik6CiAgICAgICAgcmV0dXJuIF9vcGVuc3NsX3RvX3N0ZGxpYl92ZXJpZnlbc2VsZi5fY3R4LmdldF92ZXJpZnlfbW9kZSgpXQoKICAgIEB2ZXJpZnlfbW9kZS5zZXR0ZXIKICAgIGRlZiB2ZXJpZnlfbW9kZShzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fY3R4LnNldF92ZXJpZnkoCiAgICAgICAgICAgIF9zdGRsaWJfdG9fb3BlbnNzbF92ZXJpZnlbdmFsdWVdLAogICAgICAgICAgICBfdmVyaWZ5X2NhbGxiYWNrCiAgICAgICAgKQoKICAgIGRlZiBzZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHMoc2VsZik6CiAgICAgICAgc2VsZi5fY3R4LnNldF9kZWZhdWx0X3ZlcmlmeV9wYXRocygpCgogICAgZGVmIHNldF9jaXBoZXJzKHNlbGYsIGNpcGhlcnMpOgogICAgICAgIGlmIGlzaW5zdGFuY2UoY2lwaGVycywgc2l4LnRleHRfdHlwZSk6CiAgICAgICAgICAgIGNpcGhlcnMgPSBjaXBoZXJzLmVuY29kZSgndXRmLTgnKQogICAgICAgIHNlbGYuX2N0eC5zZXRfY2lwaGVyX2xpc3QoY2lwaGVycykKCiAgICBkZWYgbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNlbGYsIGNhZmlsZT1Ob25lLCBjYXBhdGg9Tm9uZSwgY2FkYXRhPU5vbmUpOgogICAgICAgIGlmIGNhZmlsZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgY2FmaWxlID0gY2FmaWxlLmVuY29kZSgndXRmLTgnKQogICAgICAgIGlmIGNhcGF0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgY2FwYXRoID0gY2FwYXRoLmVuY29kZSgndXRmLTgnKQogICAgICAgIHNlbGYuX2N0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FmaWxlLCBjYXBhdGgpCiAgICAgICAgaWYgY2FkYXRhIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLl9jdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKEJ5dGVzSU8oY2FkYXRhKSkKCiAgICBkZWYgbG9hZF9jZXJ0X2NoYWluKHNlbGYsIGNlcnRmaWxlLCBrZXlmaWxlPU5vbmUsIHBhc3N3b3JkPU5vbmUpOgogICAgICAgIHNlbGYuX2N0eC51c2VfY2VydGlmaWNhdGVfZmlsZShjZXJ0ZmlsZSkKICAgICAgICBpZiBwYXNzd29yZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5fY3R4LnNldF9wYXNzd2RfY2IobGFtYmRhIG1heF9sZW5ndGgsIHByb21wdF90d2ljZSwgdXNlcmRhdGE6IHBhc3N3b3JkKQogICAgICAgIHNlbGYuX2N0eC51c2VfcHJpdmF0ZWtleV9maWxlKGtleWZpbGUgb3IgY2VydGZpbGUpCgogICAgZGVmIHdyYXBfc29ja2V0KHNlbGYsIHNvY2ssIHNlcnZlcl9zaWRlPUZhbHNlLAogICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PVRydWUsIHN1cHByZXNzX3JhZ2dlZF9lb2ZzPVRydWUsCiAgICAgICAgICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lPU5vbmUpOgogICAgICAgIGNueCA9IE9wZW5TU0wuU1NMLkNvbm5lY3Rpb24oc2VsZi5fY3R4LCBzb2NrKQoKICAgICAgICBpZiBpc2luc3RhbmNlKHNlcnZlcl9ob3N0bmFtZSwgc2l4LnRleHRfdHlwZSk6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMwogICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWUgPSBzZXJ2ZXJfaG9zdG5hbWUuZW5jb2RlKCd1dGYtOCcpCgogICAgICAgIGlmIHNlcnZlcl9ob3N0bmFtZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgY254LnNldF90bHNleHRfaG9zdF9uYW1lKHNlcnZlcl9ob3N0bmFtZSkKCiAgICAgICAgY254LnNldF9jb25uZWN0X3N0YXRlKCkKCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY254LmRvX2hhbmRzaGFrZSgpCiAgICAgICAgICAgIGV4Y2VwdCBPcGVuU1NMLlNTTC5XYW50UmVhZEVycm9yOgogICAgICAgICAgICAgICAgcmQgPSB1dGlsLndhaXRfZm9yX3JlYWQoc29jaywgc29jay5nZXR0aW1lb3V0KCkpCiAgICAgICAgICAgICAgICBpZiBub3QgcmQ6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgdGltZW91dCgnc2VsZWN0IHRpbWVkIG91dCcpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIHJhaXNlIHNzbC5TU0xFcnJvcignYmFkIGhhbmRzaGFrZTogJXInICUgZSkKICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgcmV0dXJuIFdyYXBwZWRTb2NrZXQoY254LCBzb2NrKQoKCmRlZiBfdmVyaWZ5X2NhbGxiYWNrKGNueCwgeDUwOSwgZXJyX25vLCBlcnJfZGVwdGgsIHJldHVybl9jb2RlKToKICAgIHJldHVybiBlcnJfbm8gPT0gMApQSwMEFAAAAAAAAAAhAOdTwPMldwAAJXcAAD4AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL3NlY3VyZXRyYW5zcG9ydC5weSIiIgpTZWN1cmVUcmFucG9ydCBzdXBwb3J0IGZvciB1cmxsaWIzIHZpYSBjdHlwZXMuCgpUaGlzIG1ha2VzIHBsYXRmb3JtLW5hdGl2ZSBUTFMgYXZhaWxhYmxlIHRvIHVybGxpYjMgdXNlcnMgb24gbWFjT1Mgd2l0aG91dCB0aGUKdXNlIG9mIGEgY29tcGlsZXIuIFRoaXMgaXMgYW4gaW1wb3J0YW50IGZlYXR1cmUgYmVjYXVzZSB0aGUgUHl0aG9uIFBhY2thZ2UKSW5kZXggaXMgbW92aW5nIHRvIGJlY29tZSBhIFRMU3YxLjItb3ItaGlnaGVyIHNlcnZlciwgYW5kIHRoZSBkZWZhdWx0IE9wZW5TU0wKdGhhdCBzaGlwcyB3aXRoIG1hY09TIGlzIG5vdCBjYXBhYmxlIG9mIGRvaW5nIFRMU3YxLjIuIFRoZSBvbmx5IHdheSB0byByZXNvbHZlCnRoaXMgaXMgdG8gZ2l2ZSBtYWNPUyB1c2VycyBhbiBhbHRlcm5hdGl2ZSBzb2x1dGlvbiB0byB0aGUgcHJvYmxlbSwgYW5kIHRoYXQKc29sdXRpb24gaXMgdG8gdXNlIFNlY3VyZVRyYW5zcG9ydC4KCldlIHVzZSBjdHlwZXMgaGVyZSBiZWNhdXNlIHRoaXMgc29sdXRpb24gbXVzdCBub3QgcmVxdWlyZSBhIGNvbXBpbGVyLiBUaGF0J3MKYmVjYXVzZSBwaXAgaXMgbm90IGFsbG93ZWQgdG8gcmVxdWlyZSBhIGNvbXBpbGVyIGVpdGhlci4KClRoaXMgaXMgbm90IGludGVuZGVkIHRvIGJlIGEgc2VyaW91c2x5IGxvbmctdGVybSBzb2x1dGlvbiB0byB0aGlzIHByb2JsZW0uClRoZSBob3BlIGlzIHRoYXQgUEVQIDU0MyB3aWxsIGV2ZW50dWFsbHkgc29sdmUgdGhpcyBpc3N1ZSBmb3IgdXMsIGF0IHdoaWNoCnBvaW50IHdlIGNhbiByZXRpcmUgdGhpcyBjb250cmliIG1vZHVsZS4gQnV0IGluIHRoZSBzaG9ydCB0ZXJtLCB3ZSBuZWVkIHRvCnNvbHZlIHRoZSBpbXBlbmRpbmcgdGlyZSBmaXJlIHRoYXQgaXMgUHl0aG9uIG9uIE1hYyB3aXRob3V0IHRoaXMga2luZCBvZgpjb250cmliIG1vZHVsZS4gU28uLi5oZXJlIHdlIGFyZS4KClRvIHVzZSB0aGlzIG1vZHVsZSwgc2ltcGx5IGltcG9ydCBhbmQgaW5qZWN0IGl0OjoKCiAgICBpbXBvcnQgdXJsbGliMy5jb250cmliLnNlY3VyZXRyYW5zcG9ydAogICAgdXJsbGliMy5jb250cmliLnNlY3VyZXRyYW5zcG9ydC5pbmplY3RfaW50b191cmxsaWIzKCkKCkhhcHB5IFRMU2luZyEKIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgY3R5cGVzCmltcG9ydCBlcnJubwppbXBvcnQgb3MucGF0aAppbXBvcnQgc2h1dGlsCmltcG9ydCBzb2NrZXQKaW1wb3J0IHNzbAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCB3ZWFrcmVmCgpmcm9tIC4uIGltcG9ydCB1dGlsCmZyb20gLl9zZWN1cmV0cmFuc3BvcnQuYmluZGluZ3MgaW1wb3J0ICgKICAgIFNlY3VyaXR5LCBTZWN1cml0eUNvbnN0LCBDb3JlRm91bmRhdGlvbgopCmZyb20gLl9zZWN1cmV0cmFuc3BvcnQubG93X2xldmVsIGltcG9ydCAoCiAgICBfYXNzZXJ0X25vX2Vycm9yLCBfY2VydF9hcnJheV9mcm9tX3BlbSwgX3RlbXBvcmFyeV9rZXljaGFpbiwKICAgIF9sb2FkX2NsaWVudF9jZXJ0X2NoYWluCikKCnRyeTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAyCiAgICBmcm9tIHNvY2tldCBpbXBvcnQgX2ZpbGVvYmplY3QKZXhjZXB0IEltcG9ydEVycm9yOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDMKICAgIF9maWxlb2JqZWN0ID0gTm9uZQogICAgZnJvbSAuLnBhY2thZ2VzLmJhY2twb3J0cy5tYWtlZmlsZSBpbXBvcnQgYmFja3BvcnRfbWFrZWZpbGUKCnRyeToKICAgIG1lbW9yeXZpZXcoYicnKQpleGNlcHQgTmFtZUVycm9yOgogICAgcmFpc2UgSW1wb3J0RXJyb3IoIlNlY3VyZVRyYW5zcG9ydCBvbmx5IHdvcmtzIG9uIFB5dGhvbnMgd2l0aCBtZW1vcnl2aWV3IikKCl9fYWxsX18gPSBbJ2luamVjdF9pbnRvX3VybGxpYjMnLCAnZXh0cmFjdF9mcm9tX3VybGxpYjMnXQoKIyBTTkkgYWx3YXlzIHdvcmtzCkhBU19TTkkgPSBUcnVlCgpvcmlnX3V0aWxfSEFTX1NOSSA9IHV0aWwuSEFTX1NOSQpvcmlnX3V0aWxfU1NMQ29udGV4dCA9IHV0aWwuc3NsXy5TU0xDb250ZXh0CgojIFRoaXMgZGljdGlvbmFyeSBpcyB1c2VkIGJ5IHRoZSByZWFkIGNhbGxiYWNrIHRvIG9idGFpbiBhIGhhbmRsZSB0byB0aGUKIyBjYWxsaW5nIHdyYXBwZWQgc29ja2V0LiBUaGlzIGlzIGEgcHJldHR5IHNpbGx5IGFwcHJvYWNoLCBidXQgZm9yIG5vdyBpdCdsbAojIGRvLiBJIGZlZWwgbGlrZSBJIHNob3VsZCBiZSBhYmxlIHRvIHNtdWdnbGUgYSBoYW5kbGUgdG8gdGhlIHdyYXBwZWQgc29ja2V0CiMgZGlyZWN0bHkgaW4gdGhlIFNTTENvbm5lY3Rpb25SZWYsIGJ1dCBmb3Igbm93IHRoaXMgYXBwcm9hY2ggd2lsbCB3b3JrIEkKIyBndWVzcy4KIwojIFdlIG5lZWQgdG8gbG9jayBhcm91bmQgdGhpcyBzdHJ1Y3R1cmUgZm9yIGluc2VydHMsIGJ1dCB3ZSBkb24ndCBkbyBpdCBmb3IKIyByZWFkcy93cml0ZXMgaW4gdGhlIGNhbGxiYWNrcy4gVGhlIHJlYXNvbmluZyBoZXJlIGdvZXMgYXMgZm9sbG93czoKIwojICAgIDEuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYWxsIGludG8gdGhlIGNhbGxiYWNrcyBiZWZvcmUgdGhlIGRpY3Rpb25hcnkgaXMKIyAgICAgICBwb3B1bGF0ZWQsIHNvIG9uY2UgaW4gdGhlIGNhbGxiYWNrIHRoZSBpZCBtdXN0IGJlIGluIHRoZSBkaWN0aW9uYXJ5LgojICAgIDIuIFRoZSBjYWxsYmFja3MgZG9uJ3QgbXV0YXRlIHRoZSBkaWN0aW9uYXJ5LCB0aGV5IG9ubHkgcmVhZCBmcm9tIGl0LCBhbmQKIyAgICAgICBzbyBjYW5ub3QgY29uZmxpY3Qgd2l0aCBhbnkgb2YgdGhlIGluc2VydGlvbnMuCiMKIyBUaGlzIGlzIGdvb2Q6IGlmIHdlIGhhZCB0byBsb2NrIGluIHRoZSBjYWxsYmFja3Mgd2UnZCBkcmFzdGljYWxseSBzbG93IGRvd24KIyB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhpcyBjb2RlLgpfY29ubmVjdGlvbl9yZWZzID0gd2Vha3JlZi5XZWFrVmFsdWVEaWN0aW9uYXJ5KCkKX2Nvbm5lY3Rpb25fcmVmX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCgojIExpbWl0IHdyaXRlcyB0byAxNmtCLiBUaGlzIGlzIE9wZW5TU0wncyBsaW1pdCwgYnV0IHdlJ2xsIGNhcmdvLWN1bHQgaXQgb3ZlcgojIGZvciBubyBiZXR0ZXIgcmVhc29uIHRoYW4gd2UgbmVlZCAqYSogbGltaXQsIGFuZCB0aGlzIG9uZSBpcyByaWdodCB0aGVyZS4KU1NMX1dSSVRFX0JMT0NLU0laRSA9IDE2Mzg0CgojIFRoaXMgaXMgb3VyIGVxdWl2YWxlbnQgb2YgdXRpbC5zc2xfLkRFRkFVTFRfQ0lQSEVSUywgYnV0IGV4cGFuZGVkIG91dCB0bwojIGluZGl2aWR1YWwgY2lwaGVyIHN1aXRlcy4gV2UgbmVlZCB0byBkbyB0aGlzIGJlY3Vhc2UgdGhpcyBpcyBob3cKIyBTZWN1cmVUcmFuc3BvcnQgd2FudHMgdGhlbS4KQ0lQSEVSX1NVSVRFUyA9IFsKICAgIFNlY3VyaXR5Q29uc3QuVExTX0FFU18yNTZfR0NNX1NIQTM4NCwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0NIQUNIQTIwX1BPTFkxMzA1X1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0FFU18xMjhfR0NNX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0LAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfUlNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0LAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfRFNTX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0LAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX1JTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9EU1NfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEzODQsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEzODQsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfRFNTX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9EU1NfV0lUSF9BRVNfMjU2X0NCQ19TSEEsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBLAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBLAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9EU1NfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBLAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX0RTU19XSVRIX0FFU18xMjhfQ0JDX1NIQSwKICAgIFNlY3VyaXR5Q29uc3QuVExTX1JTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCwKICAgIFNlY3VyaXR5Q29uc3QuVExTX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwKICAgIFNlY3VyaXR5Q29uc3QuVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSwKXQoKIyBCYXNpY2FsbHkgdGhpcyBpcyBzaW1wbGU6IGZvciBQUk9UT0NPTF9TU0x2MjMgd2UgdHVybiBpdCBpbnRvIGEgbG93IG9mCiMgVExTdjEgYW5kIGEgaGlnaCBvZiBUTFN2MS4yLiBGb3IgZXZlcnl0aGluZyBlbHNlLCB3ZSBwaW4gdG8gdGhhdCB2ZXJzaW9uLgpfcHJvdG9jb2xfdG9fbWluX21heCA9IHsKICAgIHNzbC5QUk9UT0NPTF9TU0x2MjM6IChTZWN1cml0eUNvbnN0LmtUTFNQcm90b2NvbDEsIFNlY3VyaXR5Q29uc3Qua1RMU1Byb3RvY29sMTIpLAp9CgppZiBoYXNhdHRyKHNzbCwgIlBST1RPQ09MX1NTTHYyIik6CiAgICBfcHJvdG9jb2xfdG9fbWluX21heFtzc2wuUFJPVE9DT0xfU1NMdjJdID0gKAogICAgICAgIFNlY3VyaXR5Q29uc3Qua1NTTFByb3RvY29sMiwgU2VjdXJpdHlDb25zdC5rU1NMUHJvdG9jb2wyCiAgICApCmlmIGhhc2F0dHIoc3NsLCAiUFJPVE9DT0xfU1NMdjMiKToKICAgIF9wcm90b2NvbF90b19taW5fbWF4W3NzbC5QUk9UT0NPTF9TU0x2M10gPSAoCiAgICAgICAgU2VjdXJpdHlDb25zdC5rU1NMUHJvdG9jb2wzLCBTZWN1cml0eUNvbnN0LmtTU0xQcm90b2NvbDMKICAgICkKaWYgaGFzYXR0cihzc2wsICJQUk9UT0NPTF9UTFN2MSIpOgogICAgX3Byb3RvY29sX3RvX21pbl9tYXhbc3NsLlBST1RPQ09MX1RMU3YxXSA9ICgKICAgICAgICBTZWN1cml0eUNvbnN0LmtUTFNQcm90b2NvbDEsIFNlY3VyaXR5Q29uc3Qua1RMU1Byb3RvY29sMQogICAgKQppZiBoYXNhdHRyKHNzbCwgIlBST1RPQ09MX1RMU3YxXzEiKToKICAgIF9wcm90b2NvbF90b19taW5fbWF4W3NzbC5QUk9UT0NPTF9UTFN2MV8xXSA9ICgKICAgICAgICBTZWN1cml0eUNvbnN0LmtUTFNQcm90b2NvbDExLCBTZWN1cml0eUNvbnN0LmtUTFNQcm90b2NvbDExCiAgICApCmlmIGhhc2F0dHIoc3NsLCAiUFJPVE9DT0xfVExTdjFfMiIpOgogICAgX3Byb3RvY29sX3RvX21pbl9tYXhbc3NsLlBST1RPQ09MX1RMU3YxXzJdID0gKAogICAgICAgIFNlY3VyaXR5Q29uc3Qua1RMU1Byb3RvY29sMTIsIFNlY3VyaXR5Q29uc3Qua1RMU1Byb3RvY29sMTIKICAgICkKaWYgaGFzYXR0cihzc2wsICJQUk9UT0NPTF9UTFMiKToKICAgIF9wcm90b2NvbF90b19taW5fbWF4W3NzbC5QUk9UT0NPTF9UTFNdID0gX3Byb3RvY29sX3RvX21pbl9tYXhbc3NsLlBST1RPQ09MX1NTTHYyM10KCgpkZWYgaW5qZWN0X2ludG9fdXJsbGliMygpOgogICAgIiIiCiAgICBNb25rZXktcGF0Y2ggdXJsbGliMyB3aXRoIFNlY3VyZVRyYW5zcG9ydC1iYWNrZWQgU1NMLXN1cHBvcnQuCiAgICAiIiIKICAgIHV0aWwuc3NsXy5TU0xDb250ZXh0ID0gU2VjdXJlVHJhbnNwb3J0Q29udGV4dAogICAgdXRpbC5IQVNfU05JID0gSEFTX1NOSQogICAgdXRpbC5zc2xfLkhBU19TTkkgPSBIQVNfU05JCiAgICB1dGlsLklTX1NFQ1VSRVRSQU5TUE9SVCA9IFRydWUKICAgIHV0aWwuc3NsXy5JU19TRUNVUkVUUkFOU1BPUlQgPSBUcnVlCgoKZGVmIGV4dHJhY3RfZnJvbV91cmxsaWIzKCk6CiAgICAiIiIKICAgIFVuZG8gbW9ua2V5LXBhdGNoaW5nIGJ5IDpmdW5jOmBpbmplY3RfaW50b191cmxsaWIzYC4KICAgICIiIgogICAgdXRpbC5zc2xfLlNTTENvbnRleHQgPSBvcmlnX3V0aWxfU1NMQ29udGV4dAogICAgdXRpbC5IQVNfU05JID0gb3JpZ191dGlsX0hBU19TTkkKICAgIHV0aWwuc3NsXy5IQVNfU05JID0gb3JpZ191dGlsX0hBU19TTkkKICAgIHV0aWwuSVNfU0VDVVJFVFJBTlNQT1JUID0gRmFsc2UKICAgIHV0aWwuc3NsXy5JU19TRUNVUkVUUkFOU1BPUlQgPSBGYWxzZQoKCmRlZiBfcmVhZF9jYWxsYmFjayhjb25uZWN0aW9uX2lkLCBkYXRhX2J1ZmZlciwgZGF0YV9sZW5ndGhfcG9pbnRlcik6CiAgICAiIiIKICAgIFNlY3VyZVRyYW5zcG9ydCByZWFkIGNhbGxiYWNrLiBUaGlzIGlzIGNhbGxlZCBieSBTVCB0byByZXF1ZXN0IHRoYXQgZGF0YQogICAgYmUgcmV0dXJuZWQgZnJvbSB0aGUgc29ja2V0LgogICAgIiIiCiAgICB3cmFwcGVkX3NvY2tldCA9IE5vbmUKICAgIHRyeToKICAgICAgICB3cmFwcGVkX3NvY2tldCA9IF9jb25uZWN0aW9uX3JlZnMuZ2V0KGNvbm5lY3Rpb25faWQpCiAgICAgICAgaWYgd3JhcHBlZF9zb2NrZXQgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5Q29uc3QuZXJyU1NMSW50ZXJuYWwKICAgICAgICBiYXNlX3NvY2tldCA9IHdyYXBwZWRfc29ja2V0LnNvY2tldAoKICAgICAgICByZXF1ZXN0ZWRfbGVuZ3RoID0gZGF0YV9sZW5ndGhfcG9pbnRlclswXQoKICAgICAgICB0aW1lb3V0ID0gd3JhcHBlZF9zb2NrZXQuZ2V0dGltZW91dCgpCiAgICAgICAgZXJyb3IgPSBOb25lCiAgICAgICAgcmVhZF9jb3VudCA9IDAKICAgICAgICBidWZmZXIgPSAoY3R5cGVzLmNfY2hhciAqIHJlcXVlc3RlZF9sZW5ndGgpLmZyb21fYWRkcmVzcyhkYXRhX2J1ZmZlcikKICAgICAgICBidWZmZXJfdmlldyA9IG1lbW9yeXZpZXcoYnVmZmVyKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdoaWxlIHJlYWRfY291bnQgPCByZXF1ZXN0ZWRfbGVuZ3RoOgogICAgICAgICAgICAgICAgaWYgdGltZW91dCBpcyBOb25lIG9yIHRpbWVvdXQgPj0gMDoKICAgICAgICAgICAgICAgICAgICByZWFkYWJsZXMgPSB1dGlsLndhaXRfZm9yX3JlYWQoW2Jhc2Vfc29ja2V0XSwgdGltZW91dCkKICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVhZGFibGVzOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBzb2NrZXQuZXJyb3IoZXJybm8uRUFHQUlOLCAndGltZWQgb3V0JykKCiAgICAgICAgICAgICAgICAjIFdlIG5lZWQgdG8gdGVsbCBjdHlwZXMgdGhhdCB3ZSBoYXZlIGEgYnVmZmVyIHRoYXQgY2FuIGJlCiAgICAgICAgICAgICAgICAjIHdyaXR0ZW4gdG8uIFVwc2V0dGluZ2x5LCB3ZSBkbyB0aGF0IGxpa2UgdGhpczoKICAgICAgICAgICAgICAgIGNodW5rX3NpemUgPSBiYXNlX3NvY2tldC5yZWN2X2ludG8oCiAgICAgICAgICAgICAgICAgICAgYnVmZmVyX3ZpZXdbcmVhZF9jb3VudDpyZXF1ZXN0ZWRfbGVuZ3RoXQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmVhZF9jb3VudCArPSBjaHVua19zaXplCiAgICAgICAgICAgICAgICBpZiBub3QgY2h1bmtfc2l6ZToKICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVhZF9jb3VudDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5Q29uc3QuZXJyU1NMQ2xvc2VkR3JhY2VmdWwKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGV4Y2VwdCAoc29ja2V0LmVycm9yKSBhcyBlOgogICAgICAgICAgICBlcnJvciA9IGUuZXJybm8KCiAgICAgICAgICAgIGlmIGVycm9yIGlzIG5vdCBOb25lIGFuZCBlcnJvciAhPSBlcnJuby5FQUdBSU46CiAgICAgICAgICAgICAgICBpZiBlcnJvciA9PSBlcnJuby5FQ09OTlJFU0VUOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUNvbnN0LmVyclNTTENsb3NlZEFib3J0CiAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICBkYXRhX2xlbmd0aF9wb2ludGVyWzBdID0gcmVhZF9jb3VudAoKICAgICAgICBpZiByZWFkX2NvdW50ICE9IHJlcXVlc3RlZF9sZW5ndGg6CiAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUNvbnN0LmVyclNTTFdvdWxkQmxvY2sKCiAgICAgICAgcmV0dXJuIDAKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBpZiB3cmFwcGVkX3NvY2tldCBpcyBub3QgTm9uZToKICAgICAgICAgICAgd3JhcHBlZF9zb2NrZXQuX2V4Y2VwdGlvbiA9IGUKICAgICAgICByZXR1cm4gU2VjdXJpdHlDb25zdC5lcnJTU0xJbnRlcm5hbAoKCmRlZiBfd3JpdGVfY2FsbGJhY2soY29ubmVjdGlvbl9pZCwgZGF0YV9idWZmZXIsIGRhdGFfbGVuZ3RoX3BvaW50ZXIpOgogICAgIiIiCiAgICBTZWN1cmVUcmFuc3BvcnQgd3JpdGUgY2FsbGJhY2suIFRoaXMgaXMgY2FsbGVkIGJ5IFNUIHRvIHJlcXVlc3QgdGhhdCBkYXRhCiAgICBhY3R1YWxseSBiZSBzZW50IG9uIHRoZSBuZXR3b3JrLgogICAgIiIiCiAgICB3cmFwcGVkX3NvY2tldCA9IE5vbmUKICAgIHRyeToKICAgICAgICB3cmFwcGVkX3NvY2tldCA9IF9jb25uZWN0aW9uX3JlZnMuZ2V0KGNvbm5lY3Rpb25faWQpCiAgICAgICAgaWYgd3JhcHBlZF9zb2NrZXQgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5Q29uc3QuZXJyU1NMSW50ZXJuYWwKICAgICAgICBiYXNlX3NvY2tldCA9IHdyYXBwZWRfc29ja2V0LnNvY2tldAoKICAgICAgICBieXRlc190b193cml0ZSA9IGRhdGFfbGVuZ3RoX3BvaW50ZXJbMF0KICAgICAgICBkYXRhID0gY3R5cGVzLnN0cmluZ19hdChkYXRhX2J1ZmZlciwgYnl0ZXNfdG9fd3JpdGUpCgogICAgICAgIHRpbWVvdXQgPSB3cmFwcGVkX3NvY2tldC5nZXR0aW1lb3V0KCkKICAgICAgICBlcnJvciA9IE5vbmUKICAgICAgICBzZW50ID0gMAoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdoaWxlIHNlbnQgPCBieXRlc190b193cml0ZToKICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgTm9uZSBvciB0aW1lb3V0ID49IDA6CiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGVzID0gdXRpbC53YWl0X2Zvcl93cml0ZShbYmFzZV9zb2NrZXRdLCB0aW1lb3V0KQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCB3cml0YWJsZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIHNvY2tldC5lcnJvcihlcnJuby5FQUdBSU4sICd0aW1lZCBvdXQnKQogICAgICAgICAgICAgICAgY2h1bmtfc2VudCA9IGJhc2Vfc29ja2V0LnNlbmQoZGF0YSkKICAgICAgICAgICAgICAgIHNlbnQgKz0gY2h1bmtfc2VudAoKICAgICAgICAgICAgICAgICMgVGhpcyBoYXMgc29tZSBuZWVkbGVzcyBjb3B5aW5nIGhlcmUsIGJ1dCBJJ20gbm90IHN1cmUgdGhlcmUncwogICAgICAgICAgICAgICAgIyBtdWNoIHZhbHVlIGluIG9wdGltaXNpbmcgdGhpcyBkYXRhIHBhdGguCiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YVtjaHVua19zZW50Ol0KICAgICAgICBleGNlcHQgKHNvY2tldC5lcnJvcikgYXMgZToKICAgICAgICAgICAgZXJyb3IgPSBlLmVycm5vCgogICAgICAgICAgICBpZiBlcnJvciBpcyBub3QgTm9uZSBhbmQgZXJyb3IgIT0gZXJybm8uRUFHQUlOOgogICAgICAgICAgICAgICAgaWYgZXJyb3IgPT0gZXJybm8uRUNPTk5SRVNFVDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlDb25zdC5lcnJTU0xDbG9zZWRBYm9ydAogICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgZGF0YV9sZW5ndGhfcG9pbnRlclswXSA9IHNlbnQKICAgICAgICBpZiBzZW50ICE9IGJ5dGVzX3RvX3dyaXRlOgogICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlDb25zdC5lcnJTU0xXb3VsZEJsb2NrCgogICAgICAgIHJldHVybiAwCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgaWYgd3JhcHBlZF9zb2NrZXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHdyYXBwZWRfc29ja2V0Ll9leGNlcHRpb24gPSBlCiAgICAgICAgcmV0dXJuIFNlY3VyaXR5Q29uc3QuZXJyU1NMSW50ZXJuYWwKCgojIFdlIG5lZWQgdG8ga2VlcCB0aGVzZSB0d28gb2JqZWN0cyByZWZlcmVuY2VzIGFsaXZlOiBpZiB0aGV5IGdldCBHQydkIHdoaWxlCiMgaW4gdXNlIHRoZW4gU2VjdXJlVHJhbnNwb3J0IGNvdWxkIGF0dGVtcHQgdG8gY2FsbCBhIGZ1bmN0aW9uIHRoYXQgaXMgaW4gZnJlZWQKIyBtZW1vcnkuIFRoYXQgd291bGQgYmUuLi51aC4uLmJhZC4gWWVhaCwgdGhhdCdzIHRoZSB3b3JkLiBCYWQuCl9yZWFkX2NhbGxiYWNrX3BvaW50ZXIgPSBTZWN1cml0eS5TU0xSZWFkRnVuYyhfcmVhZF9jYWxsYmFjaykKX3dyaXRlX2NhbGxiYWNrX3BvaW50ZXIgPSBTZWN1cml0eS5TU0xXcml0ZUZ1bmMoX3dyaXRlX2NhbGxiYWNrKQoKCmNsYXNzIFdyYXBwZWRTb2NrZXQob2JqZWN0KToKICAgICIiIgogICAgQVBJLWNvbXBhdGliaWxpdHkgd3JhcHBlciBmb3IgUHl0aG9uJ3MgT3BlblNTTCB3cmFwcGVkIHNvY2tldCBvYmplY3QuCgogICAgTm90ZTogX21ha2VmaWxlX3JlZnMsIF9kcm9wKCksIGFuZCBfcmV1c2UoKSBhcmUgbmVlZGVkIGZvciB0aGUgZ2FyYmFnZQogICAgY29sbGVjdG9yIG9mIFB5UHkuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb2NrZXQpOgogICAgICAgIHNlbGYuc29ja2V0ID0gc29ja2V0CiAgICAgICAgc2VsZi5jb250ZXh0ID0gTm9uZQogICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgPSAwCiAgICAgICAgc2VsZi5fY2xvc2VkID0gRmFsc2UKICAgICAgICBzZWxmLl9leGNlcHRpb24gPSBOb25lCiAgICAgICAgc2VsZi5fa2V5Y2hhaW4gPSBOb25lCiAgICAgICAgc2VsZi5fa2V5Y2hhaW5fZGlyID0gTm9uZQogICAgICAgIHNlbGYuX2NsaWVudF9jZXJ0X2NoYWluID0gTm9uZQoKICAgICAgICAjIFdlIHNhdmUgb2ZmIHRoZSBwcmV2aW91c2x5LWNvbmZpZ3VyZWQgdGltZW91dCBhbmQgdGhlbiBzZXQgaXQgdG8KICAgICAgICAjIHplcm8uIFRoaXMgaXMgZG9uZSBiZWNhdXNlIHdlIHVzZSBzZWxlY3QgYW5kIGZyaWVuZHMgdG8gaGFuZGxlIHRoZQogICAgICAgICMgdGltZW91dHMsIGJ1dCBpZiB3ZSBsZWF2ZSB0aGUgdGltZW91dCBzZXQgb24gdGhlIGxvd2VyIHNvY2tldCB0aGVuCiAgICAgICAgIyBQeXRob24gd2lsbCAia2luZGx5IiBjYWxsIHNlbGVjdCBvbiB0aGF0IHNvY2tldCBhZ2FpbiBmb3IgdXMuIEF2b2lkCiAgICAgICAgIyB0aGF0IGJ5IGZvcmNpbmcgdGhlIHRpbWVvdXQgdG8gemVyby4KICAgICAgICBzZWxmLl90aW1lb3V0ID0gc2VsZi5zb2NrZXQuZ2V0dGltZW91dCgpCiAgICAgICAgc2VsZi5zb2NrZXQuc2V0dGltZW91dCgwKQoKICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCiAgICBkZWYgX3JhaXNlX29uX2Vycm9yKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEEgY29udGV4dCBtYW5hZ2VyIHRoYXQgY2FuIGJlIHVzZWQgdG8gd3JhcCBjYWxscyB0aGF0IGRvIEkvTyBmcm9tCiAgICAgICAgU2VjdXJlVHJhbnNwb3J0LiBJZiBhbnkgb2YgdGhlIEkvTyBjYWxsYmFja3MgaGl0IGFuIGV4Y2VwdGlvbiwgdGhpcwogICAgICAgIGNvbnRleHQgbWFuYWdlciB3aWxsIGNvcnJlY3RseSBwcm9wYWdhdGUgdGhlIGV4Y2VwdGlvbiBhZnRlciB0aGUgZmFjdC4KICAgICAgICBUaGlzIGF2b2lkcyBzaWxlbnRseSBzd2FsbG93aW5nIHRob3NlIGV4Y2VwdGlvbnMuCgogICAgICAgIEl0IGFsc28gY29ycmVjdGx5IGZvcmNlcyB0aGUgc29ja2V0IGNsb3NlZC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9leGNlcHRpb24gPSBOb25lCgogICAgICAgICMgV2UgZXhwbGljaXRseSBkb24ndCBjYXRjaCBhcm91bmQgdGhpcyB5aWVsZCBiZWNhdXNlIGluIHRoZSB1bmxpa2VseQogICAgICAgICMgZXZlbnQgdGhhdCBhbiBleGNlcHRpb24gd2FzIGhpdCBpbiB0aGUgYmxvY2sgd2UgZG9uJ3Qgd2FudCB0byBzd2FsbG93CiAgICAgICAgIyBpdC4KICAgICAgICB5aWVsZAogICAgICAgIGlmIHNlbGYuX2V4Y2VwdGlvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgZXhjZXB0aW9uLCBzZWxmLl9leGNlcHRpb24gPSBzZWxmLl9leGNlcHRpb24sIE5vbmUKICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgICAgIHJhaXNlIGV4Y2VwdGlvbgoKICAgIGRlZiBfc2V0X2NpcGhlcnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2V0cyB1cCB0aGUgYWxsb3dlZCBjaXBoZXJzLiBCeSBkZWZhdWx0IHRoaXMgbWF0Y2hlcyB0aGUgc2V0IGluCiAgICAgICAgdXRpbC5zc2xfLkRFRkFVTFRfQ0lQSEVSUywgYXQgbGVhc3QgYXMgc3VwcG9ydGVkIGJ5IG1hY09TLiBUaGlzIGlzIGRvbmUKICAgICAgICBjdXN0b20gYW5kIGRvZXNuJ3QgYWxsb3cgY2hhbmdpbmcgYXQgdGhpcyB0aW1lLCBtb3N0bHkgYmVjYXVzZSBwYXJzaW5nCiAgICAgICAgT3BlblNTTCBjaXBoZXIgc3RyaW5ncyBpcyBnb2luZyB0byBiZSBhIGZyZWFraW5nIG5pZ2h0bWFyZS4KICAgICAgICAiIiIKICAgICAgICBjaXBoZXJzID0gKFNlY3VyaXR5LlNTTENpcGhlclN1aXRlICogbGVuKENJUEhFUl9TVUlURVMpKSgqQ0lQSEVSX1NVSVRFUykKICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xTZXRFbmFibGVkQ2lwaGVycygKICAgICAgICAgICAgc2VsZi5jb250ZXh0LCBjaXBoZXJzLCBsZW4oQ0lQSEVSX1NVSVRFUykKICAgICAgICApCiAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCgogICAgZGVmIF9jdXN0b21fdmFsaWRhdGUoc2VsZiwgdmVyaWZ5LCB0cnVzdF9idW5kbGUpOgogICAgICAgICIiIgogICAgICAgIENhbGxlZCB3aGVuIHdlIGhhdmUgc2V0IGN1c3RvbSB2YWxpZGF0aW9uLiBXZSBkbyB0aGlzIGluIHR3byBjYXNlczoKICAgICAgICBmaXJzdCwgd2hlbiBjZXJ0IHZhbGlkYXRpb24gaXMgZW50aXJlbHkgZGlzYWJsZWQ7IGFuZCBzZWNvbmQsIHdoZW4KICAgICAgICB1c2luZyBhIGN1c3RvbSB0cnVzdCBEQi4KICAgICAgICAiIiIKICAgICAgICAjIElmIHdlIGRpc2FibGVkIGNlcnQgdmFsaWRhdGlvbiwganVzdCBzYXk6IGNvb2wuCiAgICAgICAgaWYgbm90IHZlcmlmeToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgV2Ugd2FudCBkYXRhIGluIG1lbW9yeSwgc28gbG9hZCBpdCB1cC4KICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZSh0cnVzdF9idW5kbGUpOgogICAgICAgICAgICB3aXRoIG9wZW4odHJ1c3RfYnVuZGxlLCAncmInKSBhcyBmOgogICAgICAgICAgICAgICAgdHJ1c3RfYnVuZGxlID0gZi5yZWFkKCkKCiAgICAgICAgY2VydF9hcnJheSA9IE5vbmUKICAgICAgICB0cnVzdCA9IFNlY3VyaXR5LlNlY1RydXN0UmVmKCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIEdldCBhIENGQXJyYXkgdGhhdCBjb250YWlucyB0aGUgY2VydHMgd2Ugd2FudC4KICAgICAgICAgICAgY2VydF9hcnJheSA9IF9jZXJ0X2FycmF5X2Zyb21fcGVtKHRydXN0X2J1bmRsZSkKCiAgICAgICAgICAgICMgT2ssIG5vdyB0aGUgaGFyZCBwYXJ0LiBXZSB3YW50IHRvIGdldCB0aGUgU2VjVHJ1c3RSZWYgdGhhdCBTVCBoYXMKICAgICAgICAgICAgIyBjcmVhdGVkIGZvciB0aGlzIGNvbm5lY3Rpb24sIHNob3ZlIG91ciBDQXMgaW50byBpdCwgdGVsbCBTVCB0bwogICAgICAgICAgICAjIGlnbm9yZSBldmVyeXRoaW5nIGVsc2UgaXQga25vd3MsIGFuZCB0aGVuIGFzayBpZiBpdCBjYW4gYnVpbGQgYQogICAgICAgICAgICAjIGNoYWluLiBUaGlzIGlzIGEgYnV1dXVuY2ggb2YgY29kZS4KICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMQ29weVBlZXJUcnVzdCgKICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCwgY3R5cGVzLmJ5cmVmKHRydXN0KQogICAgICAgICAgICApCiAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQogICAgICAgICAgICBpZiBub3QgdHJ1c3Q6CiAgICAgICAgICAgICAgICByYWlzZSBzc2wuU1NMRXJyb3IoIkZhaWxlZCB0byBjb3B5IHRydXN0IHJlZmVyZW5jZSIpCgogICAgICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TZWNUcnVzdFNldEFuY2hvckNlcnRpZmljYXRlcyh0cnVzdCwgY2VydF9hcnJheSkKICAgICAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCgogICAgICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TZWNUcnVzdFNldEFuY2hvckNlcnRpZmljYXRlc09ubHkodHJ1c3QsIFRydWUpCiAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgICAgICAgICAgdHJ1c3RfcmVzdWx0ID0gU2VjdXJpdHkuU2VjVHJ1c3RSZXN1bHRUeXBlKCkKICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU2VjVHJ1c3RFdmFsdWF0ZSgKICAgICAgICAgICAgICAgIHRydXN0LCBjdHlwZXMuYnlyZWYodHJ1c3RfcmVzdWx0KQogICAgICAgICAgICApCiAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGlmIHRydXN0OgogICAgICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKHRydXN0KQoKICAgICAgICAgICAgaWYgY2VydF9hcnJheSBpcyBOb25lOgogICAgICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKGNlcnRfYXJyYXkpCgogICAgICAgICMgT2ssIG5vdyB3ZSBjYW4gbG9vayBhdCB3aGF0IHRoZSByZXN1bHQgd2FzLgogICAgICAgIHN1Y2Nlc3NlcyA9ICgKICAgICAgICAgICAgU2VjdXJpdHlDb25zdC5rU2VjVHJ1c3RSZXN1bHRVbnNwZWNpZmllZCwKICAgICAgICAgICAgU2VjdXJpdHlDb25zdC5rU2VjVHJ1c3RSZXN1bHRQcm9jZWVkCiAgICAgICAgKQogICAgICAgIGlmIHRydXN0X3Jlc3VsdC52YWx1ZSBub3QgaW4gc3VjY2Vzc2VzOgogICAgICAgICAgICByYWlzZSBzc2wuU1NMRXJyb3IoCiAgICAgICAgICAgICAgICAiY2VydGlmaWNhdGUgdmVyaWZ5IGZhaWxlZCwgZXJyb3IgY29kZTogJWQiICUKICAgICAgICAgICAgICAgIHRydXN0X3Jlc3VsdC52YWx1ZQogICAgICAgICAgICApCgogICAgZGVmIGhhbmRzaGFrZShzZWxmLAogICAgICAgICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgIHZlcmlmeSwKICAgICAgICAgICAgICAgICAgdHJ1c3RfYnVuZGxlLAogICAgICAgICAgICAgICAgICBtaW5fdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgbWF4X3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgIGNsaWVudF9jZXJ0LAogICAgICAgICAgICAgICAgICBjbGllbnRfa2V5LAogICAgICAgICAgICAgICAgICBjbGllbnRfa2V5X3Bhc3NwaHJhc2UpOgogICAgICAgICIiIgogICAgICAgIEFjdHVhbGx5IHBlcmZvcm1zIHRoZSBUTFMgaGFuZHNoYWtlLiBUaGlzIGlzIHJ1biBhdXRvbWF0aWNhbGx5IGJ5CiAgICAgICAgd3JhcHBlZCBzb2NrZXQsIGFuZCBzaG91bGRuJ3QgYmUgbmVlZGVkIGluIHVzZXIgY29kZS4KICAgICAgICAiIiIKICAgICAgICAjIEZpcnN0LCB3ZSBkbyB0aGUgaW5pdGlhbCBiaXRzIG9mIGNvbm5lY3Rpb24gc2V0dXAuIFdlIG5lZWQgdG8gY3JlYXRlCiAgICAgICAgIyBhIGNvbnRleHQsIHNldCBpdHMgSS9PIGZ1bmNzLCBhbmQgc2V0IHRoZSBjb25uZWN0aW9uIHJlZmVyZW5jZS4KICAgICAgICBzZWxmLmNvbnRleHQgPSBTZWN1cml0eS5TU0xDcmVhdGVDb250ZXh0KAogICAgICAgICAgICBOb25lLCBTZWN1cml0eUNvbnN0LmtTU0xDbGllbnRTaWRlLCBTZWN1cml0eUNvbnN0LmtTU0xTdHJlYW1UeXBlCiAgICAgICAgKQogICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTFNldElPRnVuY3MoCiAgICAgICAgICAgIHNlbGYuY29udGV4dCwgX3JlYWRfY2FsbGJhY2tfcG9pbnRlciwgX3dyaXRlX2NhbGxiYWNrX3BvaW50ZXIKICAgICAgICApCiAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCgogICAgICAgICMgSGVyZSB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIGhhbmRsZSB0byB1c2UuIFdlIGRvIHRoaXMgYnkgdGFraW5nIHRoZQogICAgICAgICMgaWQgb2Ygc2VsZiBtb2R1bG8gMioqMzEgLSAxLiBJZiB0aGlzIGlzIGFscmVhZHkgaW4gdGhlIGRpY3Rpb25hcnksIHdlCiAgICAgICAgIyBqdXN0IGtlZXAgaW5jcmVtZW50aW5nIGJ5IG9uZSB1bnRpbCB3ZSBmaW5kIGEgZnJlZSBzcGFjZS4KICAgICAgICB3aXRoIF9jb25uZWN0aW9uX3JlZl9sb2NrOgogICAgICAgICAgICBoYW5kbGUgPSBpZChzZWxmKSAlIDIxNDc0ODM2NDcKICAgICAgICAgICAgd2hpbGUgaGFuZGxlIGluIF9jb25uZWN0aW9uX3JlZnM6CiAgICAgICAgICAgICAgICBoYW5kbGUgPSAoaGFuZGxlICsgMSkgJSAyMTQ3NDgzNjQ3CiAgICAgICAgICAgIF9jb25uZWN0aW9uX3JlZnNbaGFuZGxlXSA9IHNlbGYKCiAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMU2V0Q29ubmVjdGlvbihzZWxmLmNvbnRleHQsIGhhbmRsZSkKICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICAgICAgIyBJZiB3ZSBoYXZlIGEgc2VydmVyIGhvc3RuYW1lLCB3ZSBzaG91bGQgc2V0IHRoYXQgdG9vLgogICAgICAgIGlmIHNlcnZlcl9ob3N0bmFtZToKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VydmVyX2hvc3RuYW1lLCBieXRlcyk6CiAgICAgICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWUgPSBzZXJ2ZXJfaG9zdG5hbWUuZW5jb2RlKCd1dGYtOCcpCgogICAgICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xTZXRQZWVyRG9tYWluTmFtZSgKICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCwgc2VydmVyX2hvc3RuYW1lLCBsZW4oc2VydmVyX2hvc3RuYW1lKQogICAgICAgICAgICApCiAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgICAgICAjIFNldHVwIHRoZSBjaXBoZXJzLgogICAgICAgIHNlbGYuX3NldF9jaXBoZXJzKCkKCiAgICAgICAgIyBTZXQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gVExTIHZlcnNpb25zLgogICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTFNldFByb3RvY29sVmVyc2lvbk1pbihzZWxmLmNvbnRleHQsIG1pbl92ZXJzaW9uKQogICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQogICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTFNldFByb3RvY29sVmVyc2lvbk1heChzZWxmLmNvbnRleHQsIG1heF92ZXJzaW9uKQogICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgICAgICAjIElmIHRoZXJlJ3MgYSB0cnVzdCBEQiwgd2UgbmVlZCB0byB1c2UgaXQuIFdlIGRvIHRoYXQgYnkgdGVsbGluZwogICAgICAgICMgU2VjdXJlVHJhbnNwb3J0IHRvIGJyZWFrIG9uIHNlcnZlciBhdXRoLiBXZSBhbHNvIGRvIHRoYXQgaWYgd2UgZG9uJ3QKICAgICAgICAjIHdhbnQgdG8gdmFsaWRhdGUgdGhlIGNlcnRzIGF0IGFsbDogd2UganVzdCB3b24ndCBhY3R1YWxseSBkbyBhbnkKICAgICAgICAjIGF1dGhpbmcgaW4gdGhhdCBjYXNlLgogICAgICAgIGlmIG5vdCB2ZXJpZnkgb3IgdHJ1c3RfYnVuZGxlIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xTZXRTZXNzaW9uT3B0aW9uKAogICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LAogICAgICAgICAgICAgICAgU2VjdXJpdHlDb25zdC5rU1NMU2Vzc2lvbk9wdGlvbkJyZWFrT25TZXJ2ZXJBdXRoLAogICAgICAgICAgICAgICAgVHJ1ZQogICAgICAgICAgICApCiAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgICAgICAjIElmIHRoZXJlJ3MgYSBjbGllbnQgY2VydCwgd2UgbmVlZCB0byB1c2UgaXQuCiAgICAgICAgaWYgY2xpZW50X2NlcnQ6CiAgICAgICAgICAgIHNlbGYuX2tleWNoYWluLCBzZWxmLl9rZXljaGFpbl9kaXIgPSBfdGVtcG9yYXJ5X2tleWNoYWluKCkKICAgICAgICAgICAgc2VsZi5fY2xpZW50X2NlcnRfY2hhaW4gPSBfbG9hZF9jbGllbnRfY2VydF9jaGFpbigKICAgICAgICAgICAgICAgIHNlbGYuX2tleWNoYWluLCBjbGllbnRfY2VydCwgY2xpZW50X2tleQogICAgICAgICAgICApCiAgICAgICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTFNldENlcnRpZmljYXRlKAogICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LCBzZWxmLl9jbGllbnRfY2VydF9jaGFpbgogICAgICAgICAgICApCiAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB3aXRoIHNlbGYuX3JhaXNlX29uX2Vycm9yKCk6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xIYW5kc2hha2Uoc2VsZi5jb250ZXh0KQoKICAgICAgICAgICAgICAgIGlmIHJlc3VsdCA9PSBTZWN1cml0eUNvbnN0LmVyclNTTFdvdWxkQmxvY2s6CiAgICAgICAgICAgICAgICAgICAgcmFpc2Ugc29ja2V0LnRpbWVvdXQoImhhbmRzaGFrZSB0aW1lZCBvdXQiKQogICAgICAgICAgICAgICAgZWxpZiByZXN1bHQgPT0gU2VjdXJpdHlDb25zdC5lcnJTU0xTZXJ2ZXJBdXRoQ29tcGxldGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2N1c3RvbV92YWxpZGF0ZSh2ZXJpZnksIHRydXN0X2J1bmRsZSkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgIGRlZiBmaWxlbm8oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuc29ja2V0LmZpbGVubygpCgogICAgIyBDb3B5LXBhc3RlZCBmcm9tIFB5dGhvbiAzLjUgc291cmNlIGNvZGUKICAgIGRlZiBfZGVjcmVmX3NvY2tldGlvcyhzZWxmKToKICAgICAgICBpZiBzZWxmLl9tYWtlZmlsZV9yZWZzID4gMDoKICAgICAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyAtPSAxCiAgICAgICAgaWYgc2VsZi5fY2xvc2VkOgogICAgICAgICAgICBzZWxmLmNsb3NlKCkKCiAgICBkZWYgcmVjdihzZWxmLCBidWZzaXopOgogICAgICAgIGJ1ZmZlciA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcihidWZzaXopCiAgICAgICAgYnl0ZXNfcmVhZCA9IHNlbGYucmVjdl9pbnRvKGJ1ZmZlciwgYnVmc2l6KQogICAgICAgIGRhdGEgPSBidWZmZXJbOmJ5dGVzX3JlYWRdCiAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBkZWYgcmVjdl9pbnRvKHNlbGYsIGJ1ZmZlciwgbmJ5dGVzPU5vbmUpOgogICAgICAgICMgUmVhZCBzaG9ydCBvbiBFT0YuCiAgICAgICAgaWYgc2VsZi5fY2xvc2VkOgogICAgICAgICAgICByZXR1cm4gMAoKICAgICAgICBpZiBuYnl0ZXMgaXMgTm9uZToKICAgICAgICAgICAgbmJ5dGVzID0gbGVuKGJ1ZmZlcikKCiAgICAgICAgYnVmZmVyID0gKGN0eXBlcy5jX2NoYXIgKiBuYnl0ZXMpLmZyb21fYnVmZmVyKGJ1ZmZlcikKICAgICAgICBwcm9jZXNzZWRfYnl0ZXMgPSBjdHlwZXMuY19zaXplX3QoMCkKCiAgICAgICAgd2l0aCBzZWxmLl9yYWlzZV9vbl9lcnJvcigpOgogICAgICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xSZWFkKAogICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LCBidWZmZXIsIG5ieXRlcywgY3R5cGVzLmJ5cmVmKHByb2Nlc3NlZF9ieXRlcykKICAgICAgICAgICAgKQoKICAgICAgICAjIFRoZXJlIGFyZSBzb21lIHJlc3VsdCBjb2RlcyB0aGF0IHdlIHdhbnQgdG8gdHJlYXQgYXMgIm5vdCBhbHdheXMKICAgICAgICAjIGVycm9ycyIuIFNwZWNpZmljYWxseSwgdGhvc2UgYXJlIGVyclNTTFdvdWxkQmxvY2ssCiAgICAgICAgIyBlcnJTU0xDbG9zZWRHcmFjZWZ1bCwgYW5kIGVyclNTTENsb3NlZE5vTm90aWZ5LgogICAgICAgIGlmIChyZXN1bHQgPT0gU2VjdXJpdHlDb25zdC5lcnJTU0xXb3VsZEJsb2NrKToKICAgICAgICAgICAgIyBJZiB3ZSBkaWRuJ3QgcHJvY2VzcyBhbnkgYnl0ZXMsIHRoZW4gdGhpcyB3YXMganVzdCBhIHRpbWUgb3V0LgogICAgICAgICAgICAjIEhvd2V2ZXIsIHdlIGNhbiBnZXQgZXJyU1NMV291bGRCbG9jayBpbiBzaXR1YXRpb25zIHdoZW4gd2UgKmRpZCoKICAgICAgICAgICAgIyByZWFkIHNvbWUgZGF0YSwgYW5kIGluIHRob3NlIGNhc2VzIHdlIHNob3VsZCBqdXN0IHJlYWQgInNob3J0IgogICAgICAgICAgICAjIGFuZCByZXR1cm4uCiAgICAgICAgICAgIGlmIHByb2Nlc3NlZF9ieXRlcy52YWx1ZSA9PSAwOgogICAgICAgICAgICAgICAgIyBUaW1lZCBvdXQsIG5vIGRhdGEgcmVhZC4KICAgICAgICAgICAgICAgIHJhaXNlIHNvY2tldC50aW1lb3V0KCJyZWN2IHRpbWVkIG91dCIpCiAgICAgICAgZWxpZiByZXN1bHQgaW4gKFNlY3VyaXR5Q29uc3QuZXJyU1NMQ2xvc2VkR3JhY2VmdWwsIFNlY3VyaXR5Q29uc3QuZXJyU1NMQ2xvc2VkTm9Ob3RpZnkpOgogICAgICAgICAgICAjIFRoZSByZW1vdGUgcGVlciBoYXMgY2xvc2VkIHRoaXMgY29ubmVjdGlvbi4gV2Ugc2hvdWxkIGRvIHNvIGFzCiAgICAgICAgICAgICMgd2VsbC4gTm90ZSB0aGF0IHdlIGRvbid0IGFjdHVhbGx5IHJldHVybiBoZXJlIGJlY2F1c2UgaW4KICAgICAgICAgICAgIyBwcmluY2lwbGUgdGhpcyBjb3VsZCBhY3R1YWxseSBiZSBmaXJlZCBhbG9uZyB3aXRoIHJldHVybiBkYXRhLgogICAgICAgICAgICAjIEl0J3MgdW5saWtlbHkgdGhvdWdoLgogICAgICAgICAgICBzZWxmLmNsb3NlKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICAgICAgIyBPaywgd2UgcmVhZCBhbmQgcHJvYmFibHkgc3VjY2VlZGVkLiBXZSBzaG91bGQgcmV0dXJuIHdoYXRldmVyIGRhdGEKICAgICAgICAjIHdhcyBhY3R1YWxseSByZWFkLgogICAgICAgIHJldHVybiBwcm9jZXNzZWRfYnl0ZXMudmFsdWUKCiAgICBkZWYgc2V0dGltZW91dChzZWxmLCB0aW1lb3V0KToKICAgICAgICBzZWxmLl90aW1lb3V0ID0gdGltZW91dAoKICAgIGRlZiBnZXR0aW1lb3V0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl90aW1lb3V0CgogICAgZGVmIHNlbmQoc2VsZiwgZGF0YSk6CiAgICAgICAgcHJvY2Vzc2VkX2J5dGVzID0gY3R5cGVzLmNfc2l6ZV90KDApCgogICAgICAgIHdpdGggc2VsZi5fcmFpc2Vfb25fZXJyb3IoKToKICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMV3JpdGUoCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQsIGRhdGEsIGxlbihkYXRhKSwgY3R5cGVzLmJ5cmVmKHByb2Nlc3NlZF9ieXRlcykKICAgICAgICAgICAgKQoKICAgICAgICBpZiByZXN1bHQgPT0gU2VjdXJpdHlDb25zdC5lcnJTU0xXb3VsZEJsb2NrIGFuZCBwcm9jZXNzZWRfYnl0ZXMudmFsdWUgPT0gMDoKICAgICAgICAgICAgIyBUaW1lZCBvdXQKICAgICAgICAgICAgcmFpc2Ugc29ja2V0LnRpbWVvdXQoInNlbmQgdGltZWQgb3V0IikKICAgICAgICBlbHNlOgogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICAgICAgIyBXZSBzZW50LCBhbmQgcHJvYmFibHkgc3VjY2VlZGVkLiBUZWxsIHRoZW0gaG93IG11Y2ggd2Ugc2VudC4KICAgICAgICByZXR1cm4gcHJvY2Vzc2VkX2J5dGVzLnZhbHVlCgogICAgZGVmIHNlbmRhbGwoc2VsZiwgZGF0YSk6CiAgICAgICAgdG90YWxfc2VudCA9IDAKICAgICAgICB3aGlsZSB0b3RhbF9zZW50IDwgbGVuKGRhdGEpOgogICAgICAgICAgICBzZW50ID0gc2VsZi5zZW5kKGRhdGFbdG90YWxfc2VudDp0b3RhbF9zZW50ICsgU1NMX1dSSVRFX0JMT0NLU0laRV0pCiAgICAgICAgICAgIHRvdGFsX3NlbnQgKz0gc2VudAoKICAgIGRlZiBzaHV0ZG93bihzZWxmKToKICAgICAgICB3aXRoIHNlbGYuX3JhaXNlX29uX2Vycm9yKCk6CiAgICAgICAgICAgIFNlY3VyaXR5LlNTTENsb3NlKHNlbGYuY29udGV4dCkKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIyBUT0RPOiBzaG91bGQgSSBkbyBjbGVhbiBzaHV0ZG93biBoZXJlPyBEbyBJIGhhdmUgdG8/CiAgICAgICAgaWYgc2VsZi5fbWFrZWZpbGVfcmVmcyA8IDE6CiAgICAgICAgICAgIHNlbGYuX2Nsb3NlZCA9IFRydWUKICAgICAgICAgICAgaWYgc2VsZi5jb250ZXh0OgogICAgICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKHNlbGYuY29udGV4dCkKICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCA9IE5vbmUKICAgICAgICAgICAgaWYgc2VsZi5fY2xpZW50X2NlcnRfY2hhaW46CiAgICAgICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2Uoc2VsZi5fY2xpZW50X2NlcnRfY2hhaW4pCiAgICAgICAgICAgICAgICBzZWxmLl9jbGllbnRfY2VydF9jaGFpbiA9IE5vbmUKICAgICAgICAgICAgaWYgc2VsZi5fa2V5Y2hhaW46CiAgICAgICAgICAgICAgICBTZWN1cml0eS5TZWNLZXljaGFpbkRlbGV0ZShzZWxmLl9rZXljaGFpbikKICAgICAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShzZWxmLl9rZXljaGFpbikKICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi5fa2V5Y2hhaW5fZGlyKQogICAgICAgICAgICAgICAgc2VsZi5fa2V5Y2hhaW4gPSBzZWxmLl9rZXljaGFpbl9kaXIgPSBOb25lCiAgICAgICAgICAgIHJldHVybiBzZWxmLnNvY2tldC5jbG9zZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyAtPSAxCgogICAgZGVmIGdldHBlZXJjZXJ0KHNlbGYsIGJpbmFyeV9mb3JtPUZhbHNlKToKICAgICAgICAjIFVyZ2gsIGFubm95aW5nLgogICAgICAgICMKICAgICAgICAjIEhlcmUncyBob3cgd2UgZG8gdGhpczoKICAgICAgICAjCiAgICAgICAgIyAxLiBDYWxsIFNTTENvcHlQZWVyVHJ1c3QgdG8gZ2V0IGhvbGQgb2YgdGhlIHRydXN0IG9iamVjdCBmb3IgdGhpcwogICAgICAgICMgICAgY29ubmVjdGlvbi4KICAgICAgICAjIDIuIENhbGwgU2VjVHJ1c3RHZXRDZXJ0aWZpY2F0ZUF0SW5kZXggZm9yIGluZGV4IDAgdG8gZ2V0IHRoZSBsZWFmLgogICAgICAgICMgMy4gVG8gZ2V0IHRoZSBDTiwgY2FsbCBTZWNDZXJ0aWZpY2F0ZUNvcHlDb21tb25OYW1lIGFuZCBwcm9jZXNzIHRoYXQKICAgICAgICAjICAgIHN0cmluZyBzbyB0aGF0IGl0J3Mgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUuCiAgICAgICAgIyA0LiBUbyBnZXQgdGhlIFNBTiwgd2UgbmVlZCB0byBkbyBzb21ldGhpbmcgYSBiaXQgbW9yZSBjb21wbGV4OgogICAgICAgICMgICAgYS4gQ2FsbCBTZWNDZXJ0aWZpY2F0ZUNvcHlWYWx1ZXMgdG8gZ2V0IHRoZSBkYXRhLCByZXF1ZXN0aW5nCiAgICAgICAgIyAgICAgICBrU2VjT0lEU3ViamVjdEFsdE5hbWUuCiAgICAgICAgIyAgICBiLiBNZXNzIGFib3V0IHdpdGggdGhpcyBkaWN0aW9uYXJ5IHRvIHRyeSB0byBnZXQgdGhlIFNBTnMgb3V0LgogICAgICAgICMKICAgICAgICAjIFRoaXMgaXMgZ3Jvc3MuIFJlYWxseSBncm9zcy4gSXQncyBnb2luZyB0byBiZSBhIGZldyBodW5kcmVkIExvQyBleHRyYQogICAgICAgICMganVzdCB0byByZXBlYXQgc29tZXRoaW5nIHRoYXQgU2VjdXJlVHJhbnNwb3J0IGNhbiAqYWxyZWFkeSBkbyouIFNvIG15CiAgICAgICAgIyBvcGVyYXRpbmcgYXNzdW1wdGlvbiBhdCB0aGlzIHRpbWUgaXMgdGhhdCB3aGF0IHdlIHdhbnQgdG8gZG8gaXMKICAgICAgICAjIGluc3RlYWQgdG8ganVzdCBmbGFnIHRvIHVybGxpYjMgdGhhdCBpdCBzaG91bGRuJ3QgZG8gaXRzIG93biBob3N0bmFtZQogICAgICAgICMgdmFsaWRhdGlvbiB3aGVuIHVzaW5nIFNlY3VyZVRyYW5zcG9ydC4KICAgICAgICBpZiBub3QgYmluYXJ5X2Zvcm06CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiU2VjdXJlVHJhbnNwb3J0IG9ubHkgc3VwcG9ydHMgZHVtcGluZyBiaW5hcnkgY2VydHMiCiAgICAgICAgICAgICkKICAgICAgICB0cnVzdCA9IFNlY3VyaXR5LlNlY1RydXN0UmVmKCkKICAgICAgICBjZXJ0ZGF0YSA9IE5vbmUKICAgICAgICBkZXJfYnl0ZXMgPSBOb25lCgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBHcmFiIHRoZSB0cnVzdCBzdG9yZS4KICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMQ29weVBlZXJUcnVzdCgKICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCwgY3R5cGVzLmJ5cmVmKHRydXN0KQogICAgICAgICAgICApCiAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQogICAgICAgICAgICBpZiBub3QgdHJ1c3Q6CiAgICAgICAgICAgICAgICAjIFByb2JhYmx5IHdlIGhhdmVuJ3QgZG9uZSB0aGUgaGFuZHNoYWtlIHlldC4gTm8gYmlnZ2llLgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgICAgIGNlcnRfY291bnQgPSBTZWN1cml0eS5TZWNUcnVzdEdldENlcnRpZmljYXRlQ291bnQodHJ1c3QpCiAgICAgICAgICAgIGlmIG5vdCBjZXJ0X2NvdW50OgogICAgICAgICAgICAgICAgIyBBbHNvIGEgY2FzZSB0aGF0IG1pZ2h0IGhhcHBlbiBpZiB3ZSBoYXZlbid0IGhhbmRzaGFrZWQuCiAgICAgICAgICAgICAgICAjIEhhbmRzaG9vaz8gSGFuZHNoYWtlbj8KICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICAgICBsZWFmID0gU2VjdXJpdHkuU2VjVHJ1c3RHZXRDZXJ0aWZpY2F0ZUF0SW5kZXgodHJ1c3QsIDApCiAgICAgICAgICAgIGFzc2VydCBsZWFmCgogICAgICAgICAgICAjIE9rLCBub3cgd2Ugd2FudCB0aGUgREVSIGJ5dGVzLgogICAgICAgICAgICBjZXJ0ZGF0YSA9IFNlY3VyaXR5LlNlY0NlcnRpZmljYXRlQ29weURhdGEobGVhZikKICAgICAgICAgICAgYXNzZXJ0IGNlcnRkYXRhCgogICAgICAgICAgICBkYXRhX2xlbmd0aCA9IENvcmVGb3VuZGF0aW9uLkNGRGF0YUdldExlbmd0aChjZXJ0ZGF0YSkKICAgICAgICAgICAgZGF0YV9idWZmZXIgPSBDb3JlRm91bmRhdGlvbi5DRkRhdGFHZXRCeXRlUHRyKGNlcnRkYXRhKQogICAgICAgICAgICBkZXJfYnl0ZXMgPSBjdHlwZXMuc3RyaW5nX2F0KGRhdGFfYnVmZmVyLCBkYXRhX2xlbmd0aCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBpZiBjZXJ0ZGF0YToKICAgICAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShjZXJ0ZGF0YSkKICAgICAgICAgICAgaWYgdHJ1c3Q6CiAgICAgICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2UodHJ1c3QpCgogICAgICAgIHJldHVybiBkZXJfYnl0ZXMKCiAgICBkZWYgX3JldXNlKHNlbGYpOgogICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgKz0gMQoKICAgIGRlZiBfZHJvcChzZWxmKToKICAgICAgICBpZiBzZWxmLl9tYWtlZmlsZV9yZWZzIDwgMToKICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyAtPSAxCgoKaWYgX2ZpbGVvYmplY3Q6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMgogICAgZGVmIG1ha2VmaWxlKHNlbGYsIG1vZGUsIGJ1ZnNpemU9LTEpOgogICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgKz0gMQogICAgICAgIHJldHVybiBfZmlsZW9iamVjdChzZWxmLCBtb2RlLCBidWZzaXplLCBjbG9zZT1UcnVlKQplbHNlOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDMKICAgIGRlZiBtYWtlZmlsZShzZWxmLCBtb2RlPSJyIiwgYnVmZmVyaW5nPU5vbmUsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIyBXZSBkaXNhYmxlIGJ1ZmZlcmluZyB3aXRoIFNlY3VyZVRyYW5zcG9ydCBiZWNhdXNlIGl0IGNvbmZsaWN0cyB3aXRoCiAgICAgICAgIyB0aGUgYnVmZmVyaW5nIHRoYXQgU1QgZG9lcyBpbnRlcm5hbGx5IChzZWUgaXNzdWUgIzExNTMgZm9yIG1vcmUpLgogICAgICAgIGJ1ZmZlcmluZyA9IDAKICAgICAgICByZXR1cm4gYmFja3BvcnRfbWFrZWZpbGUoc2VsZiwgbW9kZSwgYnVmZmVyaW5nLCAqYXJncywgKiprd2FyZ3MpCgpXcmFwcGVkU29ja2V0Lm1ha2VmaWxlID0gbWFrZWZpbGUKCgpjbGFzcyBTZWN1cmVUcmFuc3BvcnRDb250ZXh0KG9iamVjdCk6CiAgICAiIiIKICAgIEkgYW0gYSB3cmFwcGVyIGNsYXNzIGZvciB0aGUgU2VjdXJlVHJhbnNwb3J0IGxpYnJhcnksIHRvIHRyYW5zbGF0ZSB0aGUKICAgIGludGVyZmFjZSBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeSBgYFNTTENvbnRleHRgYCBvYmplY3QgdG8gY2FsbHMgaW50bwogICAgU2VjdXJlVHJhbnNwb3J0LgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wpOgogICAgICAgIHNlbGYuX21pbl92ZXJzaW9uLCBzZWxmLl9tYXhfdmVyc2lvbiA9IF9wcm90b2NvbF90b19taW5fbWF4W3Byb3RvY29sXQogICAgICAgIHNlbGYuX29wdGlvbnMgPSAwCiAgICAgICAgc2VsZi5fdmVyaWZ5ID0gRmFsc2UKICAgICAgICBzZWxmLl90cnVzdF9idW5kbGUgPSBOb25lCiAgICAgICAgc2VsZi5fY2xpZW50X2NlcnQgPSBOb25lCiAgICAgICAgc2VsZi5fY2xpZW50X2tleSA9IE5vbmUKICAgICAgICBzZWxmLl9jbGllbnRfa2V5X3Bhc3NwaHJhc2UgPSBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hlY2tfaG9zdG5hbWUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2VjdXJlVHJhbnNwb3J0IGNhbm5vdCBoYXZlIGl0cyBob3N0bmFtZSBjaGVja2luZyBkaXNhYmxlZC4gRm9yIG1vcmUsCiAgICAgICAgc2VlIHRoZSBjb21tZW50IG9uIGdldHBlZXJjZXJ0KCkgaW4gdGhpcyBmaWxlLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBUcnVlCgogICAgQGNoZWNrX2hvc3RuYW1lLnNldHRlcgogICAgZGVmIGNoZWNrX2hvc3RuYW1lKHNlbGYsIHZhbHVlKToKICAgICAgICAiIiIKICAgICAgICBTZWN1cmVUcmFuc3BvcnQgY2Fubm90IGhhdmUgaXRzIGhvc3RuYW1lIGNoZWNraW5nIGRpc2FibGVkLiBGb3IgbW9yZSwKICAgICAgICBzZWUgdGhlIGNvbW1lbnQgb24gZ2V0cGVlcmNlcnQoKSBpbiB0aGlzIGZpbGUuCiAgICAgICAgIiIiCiAgICAgICAgcGFzcwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG9wdGlvbnMoc2VsZik6CiAgICAgICAgIyBUT0RPOiBXZWxsLCBjcmFwLgogICAgICAgICMKICAgICAgICAjIFNvIHRoaXMgaXMgdGhlIGJpdCBvZiB0aGUgY29kZSB0aGF0IGlzIHRoZSBtb3N0IGxpa2VseSB0byBjYXVzZSB1cwogICAgICAgICMgdHJvdWJsZS4gRXNzZW50aWFsbHkgd2UgbmVlZCB0byBlbnVtZXJhdGUgYWxsIG9mIHRoZSBTU0wgb3B0aW9ucyB0aGF0CiAgICAgICAgIyB1c2VycyBtaWdodCB3YW50IHRvIHVzZSBhbmQgdHJ5IHRvIHNlZSBpZiB3ZSBjYW4gc2Vuc2libHkgdHJhbnNsYXRlCiAgICAgICAgIyB0aGVtLCBvciB3aGV0aGVyIHdlIHNob3VsZCBqdXN0IGlnbm9yZSB0aGVtLgogICAgICAgIHJldHVybiBzZWxmLl9vcHRpb25zCgogICAgQG9wdGlvbnMuc2V0dGVyCiAgICBkZWYgb3B0aW9ucyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgIyBUT0RPOiBVcGRhdGUgaW4gbGluZSB3aXRoIGFib3ZlLgogICAgICAgIHNlbGYuX29wdGlvbnMgPSB2YWx1ZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZlcmlmeV9tb2RlKHNlbGYpOgogICAgICAgIHJldHVybiBzc2wuQ0VSVF9SRVFVSVJFRCBpZiBzZWxmLl92ZXJpZnkgZWxzZSBzc2wuQ0VSVF9OT05FCgogICAgQHZlcmlmeV9tb2RlLnNldHRlcgogICAgZGVmIHZlcmlmeV9tb2RlKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl92ZXJpZnkgPSBUcnVlIGlmIHZhbHVlID09IHNzbC5DRVJUX1JFUVVJUkVEIGVsc2UgRmFsc2UKCiAgICBkZWYgc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKHNlbGYpOgogICAgICAgICMgU28sIHRoaXMgaGFzIHRvIGRvIHNvbWV0aGluZyBhIGJpdCB3ZWlyZC4gU3BlY2lmaWNhbGx5LCB3aGF0IGl0IGRvZXMKICAgICAgICAjIGlzIG5vdGhpbmcuCiAgICAgICAgIwogICAgICAgICMgVGhpcyBtZWFucyB0aGF0LCBpZiB3ZSBoYWQgcHJldmlvdXNseSBoYWQgbG9hZF92ZXJpZnlfbG9jYXRpb25zCiAgICAgICAgIyBjYWxsZWQsIHRoaXMgZG9lcyBub3QgdW5kbyB0aGF0LiBXZSBuZWVkIHRvIGRvIHRoYXQgYmVjYXVzZSBpdCB0dXJucwogICAgICAgICMgb3V0IHRoYXQgdGhlIHJlc3Qgb2YgdGhlIHVybGxpYjMgY29kZSB3aWxsIGF0dGVtcHQgdG8gbG9hZCB0aGUKICAgICAgICAjIGRlZmF1bHQgdmVyaWZ5IHBhdGhzIGlmIGl0IGhhc24ndCBiZWVuIHRvbGQgYWJvdXQgYW55IHBhdGhzLCBldmVuIGlmCiAgICAgICAgIyB0aGUgY29udGV4dCBpdHNlbGYgd2FzIHNvbWV0aW1lIGVhcmxpZXIuIFdlIHJlc29sdmUgdGhhdCBieSBqdXN0CiAgICAgICAgIyBpZ25vcmluZyBpdC4KICAgICAgICBwYXNzCgogICAgZGVmIGxvYWRfZGVmYXVsdF9jZXJ0cyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5zZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHMoKQoKICAgIGRlZiBzZXRfY2lwaGVycyhzZWxmLCBjaXBoZXJzKToKICAgICAgICAjIEZvciBub3csIHdlIGp1c3QgcmVxdWlyZSB0aGUgZGVmYXVsdCBjaXBoZXIgc3RyaW5nLgogICAgICAgIGlmIGNpcGhlcnMgIT0gdXRpbC5zc2xfLkRFRkFVTFRfQ0lQSEVSUzoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJTZWN1cmVUcmFuc3BvcnQgZG9lc24ndCBzdXBwb3J0IGN1c3RvbSBjaXBoZXIgc3RyaW5ncyIKICAgICAgICAgICAgKQoKICAgIGRlZiBsb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc2VsZiwgY2FmaWxlPU5vbmUsIGNhcGF0aD1Ob25lLCBjYWRhdGE9Tm9uZSk6CiAgICAgICAgIyBPSywgd2Ugb25seSByZWFsbHkgc3VwcG9ydCBjYWRhdGEgYW5kIGNhZmlsZS4KICAgICAgICBpZiBjYXBhdGggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiU2VjdXJlVHJhbnNwb3J0IGRvZXMgbm90IHN1cHBvcnQgY2VydCBkaXJlY3RvcmllcyIKICAgICAgICAgICAgKQoKICAgICAgICBzZWxmLl90cnVzdF9idW5kbGUgPSBjYWZpbGUgb3IgY2FkYXRhCgogICAgZGVmIGxvYWRfY2VydF9jaGFpbihzZWxmLCBjZXJ0ZmlsZSwga2V5ZmlsZT1Ob25lLCBwYXNzd29yZD1Ob25lKToKICAgICAgICBzZWxmLl9jbGllbnRfY2VydCA9IGNlcnRmaWxlCiAgICAgICAgc2VsZi5fY2xpZW50X2tleSA9IGtleWZpbGUKICAgICAgICBzZWxmLl9jbGllbnRfY2VydF9wYXNzcGhyYXNlID0gcGFzc3dvcmQKCiAgICBkZWYgd3JhcF9zb2NrZXQoc2VsZiwgc29jaywgc2VydmVyX3NpZGU9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q9VHJ1ZSwgc3VwcHJlc3NfcmFnZ2VkX2VvZnM9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWU9Tm9uZSk6CiAgICAgICAgIyBTbywgd2hhdCBkbyB3ZSBkbyBoZXJlPyBGaXJzdGx5LCB3ZSBhc3NlcnQgc29tZSBwcm9wZXJ0aWVzLiBUaGlzIGlzIGEKICAgICAgICAjIHN0cmlwcGVkIGRvd24gc2hpbSwgc28gdGhlcmUgaXMgc29tZSBmdW5jdGlvbmFsaXR5IHdlIGRvbid0IHN1cHBvcnQuCiAgICAgICAgIyBTZWUgUEVQIDU0MyBmb3IgdGhlIHJlYWwgZGVhbC4KICAgICAgICBhc3NlcnQgbm90IHNlcnZlcl9zaWRlCiAgICAgICAgYXNzZXJ0IGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0CiAgICAgICAgYXNzZXJ0IHN1cHByZXNzX3JhZ2dlZF9lb2ZzCgogICAgICAgICMgT2ssIHdlJ3JlIGdvb2QgdG8gZ28uIE5vdyB3ZSB3YW50IHRvIGNyZWF0ZSB0aGUgd3JhcHBlZCBzb2NrZXQgb2JqZWN0CiAgICAgICAgIyBhbmQgc3RvcmUgaXQgaW4gdGhlIGFwcHJvcHJpYXRlIHBsYWNlLgogICAgICAgIHdyYXBwZWRfc29ja2V0ID0gV3JhcHBlZFNvY2tldChzb2NrKQoKICAgICAgICAjIE5vdyB3ZSBjYW4gaGFuZHNoYWtlCiAgICAgICAgd3JhcHBlZF9zb2NrZXQuaGFuZHNoYWtlKAogICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWUsIHNlbGYuX3ZlcmlmeSwgc2VsZi5fdHJ1c3RfYnVuZGxlLAogICAgICAgICAgICBzZWxmLl9taW5fdmVyc2lvbiwgc2VsZi5fbWF4X3ZlcnNpb24sIHNlbGYuX2NsaWVudF9jZXJ0LAogICAgICAgICAgICBzZWxmLl9jbGllbnRfa2V5LCBzZWxmLl9jbGllbnRfa2V5X3Bhc3NwaHJhc2UKICAgICAgICApCiAgICAgICAgcmV0dXJuIHdyYXBwZWRfc29ja2V0ClBLAwQUAAAAAAAAACEA0FMpmTMYAAAzGAAANAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvc29ja3MucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoiIiIKVGhpcyBtb2R1bGUgY29udGFpbnMgcHJvdmlzaW9uYWwgc3VwcG9ydCBmb3IgU09DS1MgcHJveGllcyBmcm9tIHdpdGhpbgp1cmxsaWIzLiBUaGlzIG1vZHVsZSBzdXBwb3J0cyBTT0NLUzQgKHNwZWNpZmljYWxseSB0aGUgU09DS1M0QSB2YXJpYW50KSBhbmQKU09DS1M1LiBUbyBlbmFibGUgaXRzIGZ1bmN0aW9uYWxpdHksIGVpdGhlciBpbnN0YWxsIFB5U29ja3Mgb3IgaW5zdGFsbCB0aGlzCm1vZHVsZSB3aXRoIHRoZSBgYHNvY2tzYGAgZXh0cmEuCgpUaGUgU09DS1MgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgdGhlIGZ1bGwgcmFuZ2Ugb2YgdXJsbGliMyBmZWF0dXJlcy4gSXQgYWxzbwpzdXBwb3J0cyB0aGUgZm9sbG93aW5nIFNPQ0tTIGZlYXR1cmVzOgoKLSBTT0NLUzQKLSBTT0NLUzRhCi0gU09DS1M1Ci0gVXNlcm5hbWVzIGFuZCBwYXNzd29yZHMgZm9yIHRoZSBTT0NLUyBwcm94eQoKS25vd24gTGltaXRhdGlvbnM6CgotIEN1cnJlbnRseSBQeVNvY2tzIGRvZXMgbm90IHN1cHBvcnQgY29udGFjdGluZyByZW1vdGUgd2Vic2l0ZXMgdmlhIGxpdGVyYWwKICBJUHY2IGFkZHJlc3Nlcy4gQW55IHN1Y2ggY29ubmVjdGlvbiBhdHRlbXB0IHdpbGwgZmFpbC4gWW91IG11c3QgdXNlIGEgZG9tYWluCiAgbmFtZS4KLSBDdXJyZW50bHkgUHlTb2NrcyBkb2VzIG5vdCBzdXBwb3J0IElQdjYgY29ubmVjdGlvbnMgdG8gdGhlIFNPQ0tTIHByb3h5LiBBbnkKICBzdWNoIGNvbm5lY3Rpb24gYXR0ZW1wdCB3aWxsIGZhaWwuCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKdHJ5OgogICAgaW1wb3J0IHNvY2tzCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydCB3YXJuaW5ncwogICAgZnJvbSAuLmV4Y2VwdGlvbnMgaW1wb3J0IERlcGVuZGVuY3lXYXJuaW5nCgogICAgd2FybmluZ3Mud2FybigoCiAgICAgICAgJ1NPQ0tTIHN1cHBvcnQgaW4gdXJsbGliMyByZXF1aXJlcyB0aGUgaW5zdGFsbGF0aW9uIG9mIG9wdGlvbmFsICcKICAgICAgICAnZGVwZW5kZW5jaWVzOiBzcGVjaWZpY2FsbHksIFB5U29ja3MuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlICcKICAgICAgICAnaHR0cHM6Ly91cmxsaWIzLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9jb250cmliLmh0bWwjc29ja3MtcHJveGllcycKICAgICAgICApLAogICAgICAgIERlcGVuZGVuY3lXYXJuaW5nCiAgICApCiAgICByYWlzZQoKZnJvbSBzb2NrZXQgaW1wb3J0IGVycm9yIGFzIFNvY2tldEVycm9yLCB0aW1lb3V0IGFzIFNvY2tldFRpbWVvdXQKCmZyb20gLi5jb25uZWN0aW9uIGltcG9ydCAoCiAgICBIVFRQQ29ubmVjdGlvbiwgSFRUUFNDb25uZWN0aW9uCikKZnJvbSAuLmNvbm5lY3Rpb25wb29sIGltcG9ydCAoCiAgICBIVFRQQ29ubmVjdGlvblBvb2wsIEhUVFBTQ29ubmVjdGlvblBvb2wKKQpmcm9tIC4uZXhjZXB0aW9ucyBpbXBvcnQgQ29ubmVjdFRpbWVvdXRFcnJvciwgTmV3Q29ubmVjdGlvbkVycm9yCmZyb20gLi5wb29sbWFuYWdlciBpbXBvcnQgUG9vbE1hbmFnZXIKZnJvbSAuLnV0aWwudXJsIGltcG9ydCBwYXJzZV91cmwKCnRyeToKICAgIGltcG9ydCBzc2wKZXhjZXB0IEltcG9ydEVycm9yOgogICAgc3NsID0gTm9uZQoKCmNsYXNzIFNPQ0tTQ29ubmVjdGlvbihIVFRQQ29ubmVjdGlvbik6CiAgICAiIiIKICAgIEEgcGxhaW4tdGV4dCBIVFRQIGNvbm5lY3Rpb24gdGhhdCBjb25uZWN0cyB2aWEgYSBTT0NLUyBwcm94eS4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc2VsZi5fc29ja3Nfb3B0aW9ucyA9IGt3YXJncy5wb3AoJ19zb2Nrc19vcHRpb25zJykKICAgICAgICBzdXBlcihTT0NLU0Nvbm5lY3Rpb24sIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKCiAgICBkZWYgX25ld19jb25uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEVzdGFibGlzaCBhIG5ldyBjb25uZWN0aW9uIHZpYSB0aGUgU09DS1MgcHJveHkuCiAgICAgICAgIiIiCiAgICAgICAgZXh0cmFfa3cgPSB7fQogICAgICAgIGlmIHNlbGYuc291cmNlX2FkZHJlc3M6CiAgICAgICAgICAgIGV4dHJhX2t3Wydzb3VyY2VfYWRkcmVzcyddID0gc2VsZi5zb3VyY2VfYWRkcmVzcwoKICAgICAgICBpZiBzZWxmLnNvY2tldF9vcHRpb25zOgogICAgICAgICAgICBleHRyYV9rd1snc29ja2V0X29wdGlvbnMnXSA9IHNlbGYuc29ja2V0X29wdGlvbnMKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb25uID0gc29ja3MuY3JlYXRlX2Nvbm5lY3Rpb24oCiAgICAgICAgICAgICAgICAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpLAogICAgICAgICAgICAgICAgcHJveHlfdHlwZT1zZWxmLl9zb2Nrc19vcHRpb25zWydzb2Nrc192ZXJzaW9uJ10sCiAgICAgICAgICAgICAgICBwcm94eV9hZGRyPXNlbGYuX3NvY2tzX29wdGlvbnNbJ3Byb3h5X2hvc3QnXSwKICAgICAgICAgICAgICAgIHByb3h5X3BvcnQ9c2VsZi5fc29ja3Nfb3B0aW9uc1sncHJveHlfcG9ydCddLAogICAgICAgICAgICAgICAgcHJveHlfdXNlcm5hbWU9c2VsZi5fc29ja3Nfb3B0aW9uc1sndXNlcm5hbWUnXSwKICAgICAgICAgICAgICAgIHByb3h5X3Bhc3N3b3JkPXNlbGYuX3NvY2tzX29wdGlvbnNbJ3Bhc3N3b3JkJ10sCiAgICAgICAgICAgICAgICBwcm94eV9yZG5zPXNlbGYuX3NvY2tzX29wdGlvbnNbJ3JkbnMnXSwKICAgICAgICAgICAgICAgIHRpbWVvdXQ9c2VsZi50aW1lb3V0LAogICAgICAgICAgICAgICAgKipleHRyYV9rdwogICAgICAgICAgICApCgogICAgICAgIGV4Y2VwdCBTb2NrZXRUaW1lb3V0IGFzIGU6CiAgICAgICAgICAgIHJhaXNlIENvbm5lY3RUaW1lb3V0RXJyb3IoCiAgICAgICAgICAgICAgICBzZWxmLCAiQ29ubmVjdGlvbiB0byAlcyB0aW1lZCBvdXQuIChjb25uZWN0IHRpbWVvdXQ9JXMpIiAlCiAgICAgICAgICAgICAgICAoc2VsZi5ob3N0LCBzZWxmLnRpbWVvdXQpKQoKICAgICAgICBleGNlcHQgc29ja3MuUHJveHlFcnJvciBhcyBlOgogICAgICAgICAgICAjIFRoaXMgaXMgZnJhZ2lsZSBhcyBoZWxsLCBidXQgaXQgc2VlbXMgdG8gYmUgdGhlIG9ubHkgd2F5IHRvIHJhaXNlCiAgICAgICAgICAgICMgdXNlZnVsIGVycm9ycyBoZXJlLgogICAgICAgICAgICBpZiBlLnNvY2tldF9lcnI6CiAgICAgICAgICAgICAgICBlcnJvciA9IGUuc29ja2V0X2VycgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlcnJvciwgU29ja2V0VGltZW91dCk6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ29ubmVjdFRpbWVvdXRFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gdG8gJXMgdGltZWQgb3V0LiAoY29ubmVjdCB0aW1lb3V0PSVzKSIgJQogICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5ob3N0LCBzZWxmLnRpbWVvdXQpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBOZXdDb25uZWN0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZXN0YWJsaXNoIGEgbmV3IGNvbm5lY3Rpb246ICVzIiAlIGVycm9yCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgTmV3Q29ubmVjdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgIHNlbGYsCiAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBlc3RhYmxpc2ggYSBuZXcgY29ubmVjdGlvbjogJXMiICUgZQogICAgICAgICAgICAgICAgKQoKICAgICAgICBleGNlcHQgU29ja2V0RXJyb3IgYXMgZTogICMgRGVmZW5zaXZlOiBQeVNvY2tzIHNob3VsZCBjYXRjaCBhbGwgdGhlc2UuCiAgICAgICAgICAgIHJhaXNlIE5ld0Nvbm5lY3Rpb25FcnJvcigKICAgICAgICAgICAgICAgIHNlbGYsICJGYWlsZWQgdG8gZXN0YWJsaXNoIGEgbmV3IGNvbm5lY3Rpb246ICVzIiAlIGUpCgogICAgICAgIHJldHVybiBjb25uCgoKIyBXZSBkb24ndCBuZWVkIHRvIGR1cGxpY2F0ZSB0aGUgVmVyaWZpZWQvVW52ZXJpZmllZCBkaXN0aW5jdGlvbiBmcm9tCiMgdXJsbGliMy9jb25uZWN0aW9uLnB5IGhlcmUgYmVjYXVzZSB0aGUgSFRUUFNDb25uZWN0aW9uIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4KIyBjb3JyZWN0bHkgc2V0IHRvIGVpdGhlciB0aGUgVmVyaWZpZWQgb3IgVW52ZXJpZmllZCBmb3JtIGJ5IHRoYXQgbW9kdWxlLiBUaGlzCiMgbWVhbnMgdGhlIFNPQ0tTSFRUUFNDb25uZWN0aW9uIHdpbGwgYXV0b21hdGljYWxseSBiZSB0aGUgY29ycmVjdCB0eXBlLgpjbGFzcyBTT0NLU0hUVFBTQ29ubmVjdGlvbihTT0NLU0Nvbm5lY3Rpb24sIEhUVFBTQ29ubmVjdGlvbik6CiAgICBwYXNzCgoKY2xhc3MgU09DS1NIVFRQQ29ubmVjdGlvblBvb2woSFRUUENvbm5lY3Rpb25Qb29sKToKICAgIENvbm5lY3Rpb25DbHMgPSBTT0NLU0Nvbm5lY3Rpb24KCgpjbGFzcyBTT0NLU0hUVFBTQ29ubmVjdGlvblBvb2woSFRUUFNDb25uZWN0aW9uUG9vbCk6CiAgICBDb25uZWN0aW9uQ2xzID0gU09DS1NIVFRQU0Nvbm5lY3Rpb24KCgpjbGFzcyBTT0NLU1Byb3h5TWFuYWdlcihQb29sTWFuYWdlcik6CiAgICAiIiIKICAgIEEgdmVyc2lvbiBvZiB0aGUgdXJsbGliMyBQcm94eU1hbmFnZXIgdGhhdCByb3V0ZXMgY29ubmVjdGlvbnMgdmlhIHRoZQogICAgZGVmaW5lZCBTT0NLUyBwcm94eS4KICAgICIiIgogICAgcG9vbF9jbGFzc2VzX2J5X3NjaGVtZSA9IHsKICAgICAgICAnaHR0cCc6IFNPQ0tTSFRUUENvbm5lY3Rpb25Qb29sLAogICAgICAgICdodHRwcyc6IFNPQ0tTSFRUUFNDb25uZWN0aW9uUG9vbCwKICAgIH0KCiAgICBkZWYgX19pbml0X18oc2VsZiwgcHJveHlfdXJsLCB1c2VybmFtZT1Ob25lLCBwYXNzd29yZD1Ob25lLAogICAgICAgICAgICAgICAgIG51bV9wb29scz0xMCwgaGVhZGVycz1Ob25lLCAqKmNvbm5lY3Rpb25fcG9vbF9rdyk6CiAgICAgICAgcGFyc2VkID0gcGFyc2VfdXJsKHByb3h5X3VybCkKCiAgICAgICAgaWYgcGFyc2VkLnNjaGVtZSA9PSAnc29ja3M1JzoKICAgICAgICAgICAgc29ja3NfdmVyc2lvbiA9IHNvY2tzLlBST1hZX1RZUEVfU09DS1M1CiAgICAgICAgICAgIHJkbnMgPSBGYWxzZQogICAgICAgIGVsaWYgcGFyc2VkLnNjaGVtZSA9PSAnc29ja3M1aCc6CiAgICAgICAgICAgIHNvY2tzX3ZlcnNpb24gPSBzb2Nrcy5QUk9YWV9UWVBFX1NPQ0tTNQogICAgICAgICAgICByZG5zID0gVHJ1ZQogICAgICAgIGVsaWYgcGFyc2VkLnNjaGVtZSA9PSAnc29ja3M0JzoKICAgICAgICAgICAgc29ja3NfdmVyc2lvbiA9IHNvY2tzLlBST1hZX1RZUEVfU09DS1M0CiAgICAgICAgICAgIHJkbnMgPSBGYWxzZQogICAgICAgIGVsaWYgcGFyc2VkLnNjaGVtZSA9PSAnc29ja3M0YSc6CiAgICAgICAgICAgIHNvY2tzX3ZlcnNpb24gPSBzb2Nrcy5QUk9YWV9UWVBFX1NPQ0tTNAogICAgICAgICAgICByZG5zID0gVHJ1ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGRldGVybWluZSBTT0NLUyB2ZXJzaW9uIGZyb20gJXMiICUgcHJveHlfdXJsCiAgICAgICAgICAgICkKCiAgICAgICAgc2VsZi5wcm94eV91cmwgPSBwcm94eV91cmwKCiAgICAgICAgc29ja3Nfb3B0aW9ucyA9IHsKICAgICAgICAgICAgJ3NvY2tzX3ZlcnNpb24nOiBzb2Nrc192ZXJzaW9uLAogICAgICAgICAgICAncHJveHlfaG9zdCc6IHBhcnNlZC5ob3N0LAogICAgICAgICAgICAncHJveHlfcG9ydCc6IHBhcnNlZC5wb3J0LAogICAgICAgICAgICAndXNlcm5hbWUnOiB1c2VybmFtZSwKICAgICAgICAgICAgJ3Bhc3N3b3JkJzogcGFzc3dvcmQsCiAgICAgICAgICAgICdyZG5zJzogcmRucwogICAgICAgIH0KICAgICAgICBjb25uZWN0aW9uX3Bvb2xfa3dbJ19zb2Nrc19vcHRpb25zJ10gPSBzb2Nrc19vcHRpb25zCgogICAgICAgIHN1cGVyKFNPQ0tTUHJveHlNYW5hZ2VyLCBzZWxmKS5fX2luaXRfXygKICAgICAgICAgICAgbnVtX3Bvb2xzLCBoZWFkZXJzLCAqKmNvbm5lY3Rpb25fcG9vbF9rdwogICAgICAgICkKCiAgICAgICAgc2VsZi5wb29sX2NsYXNzZXNfYnlfc2NoZW1lID0gU09DS1NQcm94eU1hbmFnZXIucG9vbF9jbGFzc2VzX2J5X3NjaGVtZQpQSwMEFAAAAAAAAAAhAPKayQPLGQAAyxkAADEAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9leGNlcHRpb25zLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKZnJvbSAucGFja2FnZXMuc2l4Lm1vdmVzLmh0dHBfY2xpZW50IGltcG9ydCAoCiAgICBJbmNvbXBsZXRlUmVhZCBhcyBodHRwbGliX0luY29tcGxldGVSZWFkCikKIyBCYXNlIEV4Y2VwdGlvbnMKCgpjbGFzcyBIVFRQRXJyb3IoRXhjZXB0aW9uKToKICAgICJCYXNlIGV4Y2VwdGlvbiB1c2VkIGJ5IHRoaXMgbW9kdWxlLiIKICAgIHBhc3MKCgpjbGFzcyBIVFRQV2FybmluZyhXYXJuaW5nKToKICAgICJCYXNlIHdhcm5pbmcgdXNlZCBieSB0aGlzIG1vZHVsZS4iCiAgICBwYXNzCgoKY2xhc3MgUG9vbEVycm9yKEhUVFBFcnJvcik6CiAgICAiQmFzZSBleGNlcHRpb24gZm9yIGVycm9ycyBjYXVzZWQgd2l0aGluIGEgcG9vbC4iCiAgICBkZWYgX19pbml0X18oc2VsZiwgcG9vbCwgbWVzc2FnZSk6CiAgICAgICAgc2VsZi5wb29sID0gcG9vbAogICAgICAgIEhUVFBFcnJvci5fX2luaXRfXyhzZWxmLCAiJXM6ICVzIiAlIChwb29sLCBtZXNzYWdlKSkKCiAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKICAgICAgICAjIEZvciBwaWNrbGluZyBwdXJwb3Nlcy4KICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18sIChOb25lLCBOb25lKQoKCmNsYXNzIFJlcXVlc3RFcnJvcihQb29sRXJyb3IpOgogICAgIkJhc2UgZXhjZXB0aW9uIGZvciBQb29sRXJyb3JzIHRoYXQgaGF2ZSBhc3NvY2lhdGVkIFVSTHMuIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvb2wsIHVybCwgbWVzc2FnZSk6CiAgICAgICAgc2VsZi51cmwgPSB1cmwKICAgICAgICBQb29sRXJyb3IuX19pbml0X18oc2VsZiwgcG9vbCwgbWVzc2FnZSkKCiAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKICAgICAgICAjIEZvciBwaWNrbGluZyBwdXJwb3Nlcy4KICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18sIChOb25lLCBzZWxmLnVybCwgTm9uZSkKCgpjbGFzcyBTU0xFcnJvcihIVFRQRXJyb3IpOgogICAgIlJhaXNlZCB3aGVuIFNTTCBjZXJ0aWZpY2F0ZSBmYWlscyBpbiBhbiBIVFRQUyBjb25uZWN0aW9uLiIKICAgIHBhc3MKCgpjbGFzcyBQcm94eUVycm9yKEhUVFBFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gdGhlIGNvbm5lY3Rpb24gdG8gYSBwcm94eSBmYWlscy4iCiAgICBwYXNzCgoKY2xhc3MgRGVjb2RlRXJyb3IoSFRUUEVycm9yKToKICAgICJSYWlzZWQgd2hlbiBhdXRvbWF0aWMgZGVjb2RpbmcgYmFzZWQgb24gQ29udGVudC1UeXBlIGZhaWxzLiIKICAgIHBhc3MKCgpjbGFzcyBQcm90b2NvbEVycm9yKEhUVFBFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVucyBtaWQtcmVxdWVzdC9yZXNwb25zZS4iCiAgICBwYXNzCgoKIzogUmVuYW1lZCB0byBQcm90b2NvbEVycm9yIGJ1dCBhbGlhc2VkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KQ29ubmVjdGlvbkVycm9yID0gUHJvdG9jb2xFcnJvcgoKCiMgTGVhZiBFeGNlcHRpb25zCgpjbGFzcyBNYXhSZXRyeUVycm9yKFJlcXVlc3RFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBpcyBleGNlZWRlZC4KCiAgICA6cGFyYW0gcG9vbDogVGhlIGNvbm5lY3Rpb24gcG9vbAogICAgOnR5cGUgcG9vbDogOmNsYXNzOmB+dXJsbGliMy5jb25uZWN0aW9ucG9vbC5IVFRQQ29ubmVjdGlvblBvb2xgCiAgICA6cGFyYW0gc3RyaW5nIHVybDogVGhlIHJlcXVlc3RlZCBVcmwKICAgIDpwYXJhbSBleGNlcHRpb25zLkV4Y2VwdGlvbiByZWFzb246IFRoZSB1bmRlcmx5aW5nIGVycm9yCgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvb2wsIHVybCwgcmVhc29uPU5vbmUpOgogICAgICAgIHNlbGYucmVhc29uID0gcmVhc29uCgogICAgICAgIG1lc3NhZ2UgPSAiTWF4IHJldHJpZXMgZXhjZWVkZWQgd2l0aCB1cmw6ICVzIChDYXVzZWQgYnkgJXIpIiAlICgKICAgICAgICAgICAgdXJsLCByZWFzb24pCgogICAgICAgIFJlcXVlc3RFcnJvci5fX2luaXRfXyhzZWxmLCBwb29sLCB1cmwsIG1lc3NhZ2UpCgoKY2xhc3MgSG9zdENoYW5nZWRFcnJvcihSZXF1ZXN0RXJyb3IpOgogICAgIlJhaXNlZCB3aGVuIGFuIGV4aXN0aW5nIHBvb2wgZ2V0cyBhIHJlcXVlc3QgZm9yIGEgZm9yZWlnbiBob3N0LiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcG9vbCwgdXJsLCByZXRyaWVzPTMpOgogICAgICAgIG1lc3NhZ2UgPSAiVHJpZWQgdG8gb3BlbiBhIGZvcmVpZ24gaG9zdCB3aXRoIHVybDogJXMiICUgdXJsCiAgICAgICAgUmVxdWVzdEVycm9yLl9faW5pdF9fKHNlbGYsIHBvb2wsIHVybCwgbWVzc2FnZSkKICAgICAgICBzZWxmLnJldHJpZXMgPSByZXRyaWVzCgoKY2xhc3MgVGltZW91dFN0YXRlRXJyb3IoSFRUUEVycm9yKToKICAgICIiIiBSYWlzZWQgd2hlbiBwYXNzaW5nIGFuIGludmFsaWQgc3RhdGUgdG8gYSB0aW1lb3V0ICIiIgogICAgcGFzcwoKCmNsYXNzIFRpbWVvdXRFcnJvcihIVFRQRXJyb3IpOgogICAgIiIiIFJhaXNlZCB3aGVuIGEgc29ja2V0IHRpbWVvdXQgZXJyb3Igb2NjdXJzLgoKICAgIENhdGNoaW5nIHRoaXMgZXJyb3Igd2lsbCBjYXRjaCBib3RoIDpleGM6YFJlYWRUaW1lb3V0RXJyb3JzCiAgICA8UmVhZFRpbWVvdXRFcnJvcj5gIGFuZCA6ZXhjOmBDb25uZWN0VGltZW91dEVycm9ycyA8Q29ubmVjdFRpbWVvdXRFcnJvcj5gLgogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgUmVhZFRpbWVvdXRFcnJvcihUaW1lb3V0RXJyb3IsIFJlcXVlc3RFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gYSBzb2NrZXQgdGltZW91dCBvY2N1cnMgd2hpbGUgcmVjZWl2aW5nIGRhdGEgZnJvbSBhIHNlcnZlciIKICAgIHBhc3MKCgojIFRoaXMgdGltZW91dCBlcnJvciBkb2VzIG5vdCBoYXZlIGEgVVJMIGF0dGFjaGVkIGFuZCBuZWVkcyB0byBpbmhlcml0IGZyb20gdGhlCiMgYmFzZSBIVFRQRXJyb3IKY2xhc3MgQ29ubmVjdFRpbWVvdXRFcnJvcihUaW1lb3V0RXJyb3IpOgogICAgIlJhaXNlZCB3aGVuIGEgc29ja2V0IHRpbWVvdXQgb2NjdXJzIHdoaWxlIGNvbm5lY3RpbmcgdG8gYSBzZXJ2ZXIiCiAgICBwYXNzCgoKY2xhc3MgTmV3Q29ubmVjdGlvbkVycm9yKENvbm5lY3RUaW1lb3V0RXJyb3IsIFBvb2xFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gd2UgZmFpbCB0byBlc3RhYmxpc2ggYSBuZXcgY29ubmVjdGlvbi4gVXN1YWxseSBFQ09OTlJFRlVTRUQuIgogICAgcGFzcwoKCmNsYXNzIEVtcHR5UG9vbEVycm9yKFBvb2xFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gYSBwb29sIHJ1bnMgb3V0IG9mIGNvbm5lY3Rpb25zIGFuZCBubyBtb3JlIGFyZSBhbGxvd2VkLiIKICAgIHBhc3MKCgpjbGFzcyBDbG9zZWRQb29sRXJyb3IoUG9vbEVycm9yKToKICAgICJSYWlzZWQgd2hlbiBhIHJlcXVlc3QgZW50ZXJzIGEgcG9vbCBhZnRlciB0aGUgcG9vbCBoYXMgYmVlbiBjbG9zZWQuIgogICAgcGFzcwoKCmNsYXNzIExvY2F0aW9uVmFsdWVFcnJvcihWYWx1ZUVycm9yLCBIVFRQRXJyb3IpOgogICAgIlJhaXNlZCB3aGVuIHRoZXJlIGlzIHNvbWV0aGluZyB3cm9uZyB3aXRoIGEgZ2l2ZW4gVVJMIGlucHV0LiIKICAgIHBhc3MKCgpjbGFzcyBMb2NhdGlvblBhcnNlRXJyb3IoTG9jYXRpb25WYWx1ZUVycm9yKToKICAgICJSYWlzZWQgd2hlbiBnZXRfaG9zdCBvciBzaW1pbGFyIGZhaWxzIHRvIHBhcnNlIHRoZSBVUkwgaW5wdXQuIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgbWVzc2FnZSA9ICJGYWlsZWQgdG8gcGFyc2U6ICVzIiAlIGxvY2F0aW9uCiAgICAgICAgSFRUUEVycm9yLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCgogICAgICAgIHNlbGYubG9jYXRpb24gPSBsb2NhdGlvbgoKCmNsYXNzIFJlc3BvbnNlRXJyb3IoSFRUUEVycm9yKToKICAgICJVc2VkIGFzIGEgY29udGFpbmVyIGZvciBhbiBlcnJvciByZWFzb24gc3VwcGxpZWQgaW4gYSBNYXhSZXRyeUVycm9yLiIKICAgIEdFTkVSSUNfRVJST1IgPSAndG9vIG1hbnkgZXJyb3IgcmVzcG9uc2VzJwogICAgU1BFQ0lGSUNfRVJST1IgPSAndG9vIG1hbnkge3N0YXR1c19jb2RlfSBlcnJvciByZXNwb25zZXMnCgoKY2xhc3MgU2VjdXJpdHlXYXJuaW5nKEhUVFBXYXJuaW5nKToKICAgICJXYXJuZWQgd2hlbiBwZXJmb21pbmcgc2VjdXJpdHkgcmVkdWNpbmcgYWN0aW9ucyIKICAgIHBhc3MKCgpjbGFzcyBTdWJqZWN0QWx0TmFtZVdhcm5pbmcoU2VjdXJpdHlXYXJuaW5nKToKICAgICJXYXJuZWQgd2hlbiBjb25uZWN0aW5nIHRvIGEgaG9zdCB3aXRoIGEgY2VydGlmaWNhdGUgbWlzc2luZyBhIFNBTi4iCiAgICBwYXNzCgoKY2xhc3MgSW5zZWN1cmVSZXF1ZXN0V2FybmluZyhTZWN1cml0eVdhcm5pbmcpOgogICAgIldhcm5lZCB3aGVuIG1ha2luZyBhbiB1bnZlcmlmaWVkIEhUVFBTIHJlcXVlc3QuIgogICAgcGFzcwoKCmNsYXNzIFN5c3RlbVRpbWVXYXJuaW5nKFNlY3VyaXR5V2FybmluZyk6CiAgICAiV2FybmVkIHdoZW4gc3lzdGVtIHRpbWUgaXMgc3VzcGVjdGVkIHRvIGJlIHdyb25nIgogICAgcGFzcwoKCmNsYXNzIEluc2VjdXJlUGxhdGZvcm1XYXJuaW5nKFNlY3VyaXR5V2FybmluZyk6CiAgICAiV2FybmVkIHdoZW4gY2VydGFpbiBTU0wgY29uZmlndXJhdGlvbiBpcyBub3QgYXZhaWxhYmxlIG9uIGEgcGxhdGZvcm0uIgogICAgcGFzcwoKCmNsYXNzIFNOSU1pc3NpbmdXYXJuaW5nKEhUVFBXYXJuaW5nKToKICAgICJXYXJuZWQgd2hlbiBtYWtpbmcgYSBIVFRQUyByZXF1ZXN0IHdpdGhvdXQgU05JIGF2YWlsYWJsZS4iCiAgICBwYXNzCgoKY2xhc3MgRGVwZW5kZW5jeVdhcm5pbmcoSFRUUFdhcm5pbmcpOgogICAgIiIiCiAgICBXYXJuZWQgd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gaW1wb3J0IGEgbW9kdWxlIHdpdGggbWlzc2luZyBvcHRpb25hbAogICAgZGVwZW5kZW5jaWVzLgogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgUmVzcG9uc2VOb3RDaHVua2VkKFByb3RvY29sRXJyb3IsIFZhbHVlRXJyb3IpOgogICAgIlJlc3BvbnNlIG5lZWRzIHRvIGJlIGNodW5rZWQgaW4gb3JkZXIgdG8gcmVhZCBpdCBhcyBjaHVua3MuIgogICAgcGFzcwoKCmNsYXNzIEJvZHlOb3RIdHRwbGliQ29tcGF0aWJsZShIVFRQRXJyb3IpOgogICAgIiIiCiAgICBCb2R5IHNob3VsZCBiZSBodHRwbGliLkhUVFBSZXNwb25zZSBsaWtlIChoYXZlIGFuIGZwIGF0dHJpYnV0ZSB3aGljaAogICAgcmV0dXJucyByYXcgY2h1bmtzKSBmb3IgcmVhZF9jaHVua2VkKCkuCiAgICAiIiIKICAgIHBhc3MKCgpjbGFzcyBJbmNvbXBsZXRlUmVhZChIVFRQRXJyb3IsIGh0dHBsaWJfSW5jb21wbGV0ZVJlYWQpOgogICAgIiIiCiAgICBSZXNwb25zZSBsZW5ndGggZG9lc24ndCBtYXRjaCBleHBlY3RlZCBDb250ZW50LUxlbmd0aAoKICAgIFN1YmNsYXNzIG9mIGh0dHBfY2xpZW50LkluY29tcGxldGVSZWFkIHRvIGFsbG93IGludCB2YWx1ZQogICAgZm9yIGBwYXJ0aWFsYCB0byBhdm9pZCBjcmVhdGluZyBsYXJnZSBvYmplY3RzIG9uIHN0cmVhbWVkCiAgICByZWFkcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnRpYWwsIGV4cGVjdGVkKToKICAgICAgICBzdXBlcihJbmNvbXBsZXRlUmVhZCwgc2VsZikuX19pbml0X18ocGFydGlhbCwgZXhwZWN0ZWQpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAoJ0luY29tcGxldGVSZWFkKCVpIGJ5dGVzIHJlYWQsICcKICAgICAgICAgICAgICAgICclaSBtb3JlIGV4cGVjdGVkKScgJSAoc2VsZi5wYXJ0aWFsLCBzZWxmLmV4cGVjdGVkKSkKCgpjbGFzcyBJbnZhbGlkSGVhZGVyKEhUVFBFcnJvcik6CiAgICAiVGhlIGhlYWRlciBwcm92aWRlZCB3YXMgc29tZWhvdyBpbnZhbGlkLiIKICAgIHBhc3MKCgpjbGFzcyBQcm94eVNjaGVtZVVua25vd24oQXNzZXJ0aW9uRXJyb3IsIFZhbHVlRXJyb3IpOgogICAgIlByb3h5TWFuYWdlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzdXBwbGllZCBzY2hlbWUiCiAgICAjIFRPRE8odC04Y2gpOiBTdG9wIGluaGVyaXRpbmcgZnJvbSBBc3NlcnRpb25FcnJvciBpbiB2Mi4wLgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzY2hlbWUpOgogICAgICAgIG1lc3NhZ2UgPSAiTm90IHN1cHBvcnRlZCBwcm94eSBzY2hlbWUgJXMiICUgc2NoZW1lCiAgICAgICAgc3VwZXIoUHJveHlTY2hlbWVVbmtub3duLCBzZWxmKS5fX2luaXRfXyhtZXNzYWdlKQoKCmNsYXNzIEhlYWRlclBhcnNpbmdFcnJvcihIVFRQRXJyb3IpOgogICAgIlJhaXNlZCBieSBhc3NlcnRfaGVhZGVyX3BhcnNpbmcsIGJ1dCB3ZSBjb252ZXJ0IGl0IHRvIGEgbG9nLndhcm5pbmcgc3RhdGVtZW50LiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZWZlY3RzLCB1bnBhcnNlZF9kYXRhKToKICAgICAgICBtZXNzYWdlID0gJyVzLCB1bnBhcnNlZCBkYXRhOiAlcicgJSAoZGVmZWN0cyBvciAnVW5rbm93bicsIHVucGFyc2VkX2RhdGEpCiAgICAgICAgc3VwZXIoSGVhZGVyUGFyc2luZ0Vycm9yLCBzZWxmKS5fX2luaXRfXyhtZXNzYWdlKQoKCmNsYXNzIFVucmV3aW5kYWJsZUJvZHlFcnJvcihIVFRQRXJyb3IpOgogICAgInVybGxpYjMgZW5jb3VudGVyZWQgYW4gZXJyb3Igd2hlbiB0cnlpbmcgdG8gcmV3aW5kIGEgYm9keSIKICAgIHBhc3MKUEsDBBQAAAAAAAAAIQABOYyyNxcAADcXAAAtAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvZmllbGRzLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKaW1wb3J0IGVtYWlsLnV0aWxzCmltcG9ydCBtaW1ldHlwZXMKCmZyb20gLnBhY2thZ2VzIGltcG9ydCBzaXgKCgpkZWYgZ3Vlc3NfY29udGVudF90eXBlKGZpbGVuYW1lLCBkZWZhdWx0PSdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKToKICAgICIiIgogICAgR3Vlc3MgdGhlICJDb250ZW50LVR5cGUiIG9mIGEgZmlsZS4KCiAgICA6cGFyYW0gZmlsZW5hbWU6CiAgICAgICAgVGhlIGZpbGVuYW1lIHRvIGd1ZXNzIHRoZSAiQ29udGVudC1UeXBlIiBvZiB1c2luZyA6bW9kOmBtaW1ldHlwZXNgLgogICAgOnBhcmFtIGRlZmF1bHQ6CiAgICAgICAgSWYgbm8gIkNvbnRlbnQtVHlwZSIgY2FuIGJlIGd1ZXNzZWQsIGRlZmF1bHQgdG8gYGRlZmF1bHRgLgogICAgIiIiCiAgICBpZiBmaWxlbmFtZToKICAgICAgICByZXR1cm4gbWltZXR5cGVzLmd1ZXNzX3R5cGUoZmlsZW5hbWUpWzBdIG9yIGRlZmF1bHQKICAgIHJldHVybiBkZWZhdWx0CgoKZGVmIGZvcm1hdF9oZWFkZXJfcGFyYW0obmFtZSwgdmFsdWUpOgogICAgIiIiCiAgICBIZWxwZXIgZnVuY3Rpb24gdG8gZm9ybWF0IGFuZCBxdW90ZSBhIHNpbmdsZSBoZWFkZXIgcGFyYW1ldGVyLgoKICAgIFBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGhlYWRlciBwYXJhbWV0ZXJzIHdoaWNoIG1pZ2h0IGNvbnRhaW4KICAgIG5vbi1BU0NJSSB2YWx1ZXMsIGxpa2UgZmlsZSBuYW1lcy4gVGhpcyBmb2xsb3dzIFJGQyAyMjMxLCBhcwogICAgc3VnZ2VzdGVkIGJ5IFJGQyAyMzg4IFNlY3Rpb24gNC40LgoKICAgIDpwYXJhbSBuYW1lOgogICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIsIGEgc3RyaW5nIGV4cGVjdGVkIHRvIGJlIEFTQ0lJIG9ubHkuCiAgICA6cGFyYW0gdmFsdWU6CiAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIsIHByb3ZpZGVkIGFzIGEgdW5pY29kZSBzdHJpbmcuCiAgICAiIiIKICAgIGlmIG5vdCBhbnkoY2ggaW4gdmFsdWUgZm9yIGNoIGluICciXFxcclxuJyk6CiAgICAgICAgcmVzdWx0ID0gJyVzPSIlcyInICUgKG5hbWUsIHZhbHVlKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmVzdWx0LmVuY29kZSgnYXNjaWknKQogICAgICAgIGV4Y2VwdCAoVW5pY29kZUVuY29kZUVycm9yLCBVbmljb2RlRGVjb2RlRXJyb3IpOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAogICAgaWYgbm90IHNpeC5QWTMgYW5kIGlzaW5zdGFuY2UodmFsdWUsIHNpeC50ZXh0X3R5cGUpOiAgIyBQeXRob24gMjoKICAgICAgICB2YWx1ZSA9IHZhbHVlLmVuY29kZSgndXRmLTgnKQogICAgdmFsdWUgPSBlbWFpbC51dGlscy5lbmNvZGVfcmZjMjIzMSh2YWx1ZSwgJ3V0Zi04JykKICAgIHZhbHVlID0gJyVzKj0lcycgJSAobmFtZSwgdmFsdWUpCiAgICByZXR1cm4gdmFsdWUKCgpjbGFzcyBSZXF1ZXN0RmllbGQob2JqZWN0KToKICAgICIiIgogICAgQSBkYXRhIGNvbnRhaW5lciBmb3IgcmVxdWVzdCBib2R5IHBhcmFtZXRlcnMuCgogICAgOnBhcmFtIG5hbWU6CiAgICAgICAgVGhlIG5hbWUgb2YgdGhpcyByZXF1ZXN0IGZpZWxkLgogICAgOnBhcmFtIGRhdGE6CiAgICAgICAgVGhlIGRhdGEvdmFsdWUgYm9keS4KICAgIDpwYXJhbSBmaWxlbmFtZToKICAgICAgICBBbiBvcHRpb25hbCBmaWxlbmFtZSBvZiB0aGUgcmVxdWVzdCBmaWVsZC4KICAgIDpwYXJhbSBoZWFkZXJzOgogICAgICAgIEFuIG9wdGlvbmFsIGRpY3QtbGlrZSBvYmplY3Qgb2YgaGVhZGVycyB0byBpbml0aWFsbHkgdXNlIGZvciB0aGUgZmllbGQuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBkYXRhLCBmaWxlbmFtZT1Ob25lLCBoZWFkZXJzPU5vbmUpOgogICAgICAgIHNlbGYuX25hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5fZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKICAgICAgICBzZWxmLmhlYWRlcnMgPSB7fQogICAgICAgIGlmIGhlYWRlcnM6CiAgICAgICAgICAgIHNlbGYuaGVhZGVycyA9IGRpY3QoaGVhZGVycykKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX3R1cGxlcyhjbHMsIGZpZWxkbmFtZSwgdmFsdWUpOgogICAgICAgICIiIgogICAgICAgIEEgOmNsYXNzOmB+dXJsbGliMy5maWVsZHMuUmVxdWVzdEZpZWxkYCBmYWN0b3J5IGZyb20gb2xkLXN0eWxlIHR1cGxlIHBhcmFtZXRlcnMuCgogICAgICAgIFN1cHBvcnRzIGNvbnN0cnVjdGluZyA6Y2xhc3M6YH51cmxsaWIzLmZpZWxkcy5SZXF1ZXN0RmllbGRgIGZyb20KICAgICAgICBwYXJhbWV0ZXIgb2Yga2V5L3ZhbHVlIHN0cmluZ3MgQU5EIGtleS9maWxldHVwbGUuIEEgZmlsZXR1cGxlIGlzIGEKICAgICAgICAoZmlsZW5hbWUsIGRhdGEsIE1JTUUgdHlwZSkgdHVwbGUgd2hlcmUgdGhlIE1JTUUgdHlwZSBpcyBvcHRpb25hbC4KICAgICAgICBGb3IgZXhhbXBsZTo6CgogICAgICAgICAgICAnZm9vJzogJ2JhcicsCiAgICAgICAgICAgICdmYWtlZmlsZSc6ICgnZm9vZmlsZS50eHQnLCAnY29udGVudHMgb2YgZm9vZmlsZScpLAogICAgICAgICAgICAncmVhbGZpbGUnOiAoJ2JhcmZpbGUudHh0Jywgb3BlbigncmVhbGZpbGUnKS5yZWFkKCkpLAogICAgICAgICAgICAndHlwZWRmaWxlJzogKCdiYXpmaWxlLmJpbicsIG9wZW4oJ2JhemZpbGUnKS5yZWFkKCksICdpbWFnZS9qcGVnJyksCiAgICAgICAgICAgICdub25hbWVmaWxlJzogJ2NvbnRlbnRzIG9mIG5vbmFtZWZpbGUgZmllbGQnLAoKICAgICAgICBGaWVsZCBuYW1lcyBhbmQgZmlsZW5hbWVzIG11c3QgYmUgdW5pY29kZS4KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCB0dXBsZSk6CiAgICAgICAgICAgIGlmIGxlbih2YWx1ZSkgPT0gMzoKICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBkYXRhLCBjb250ZW50X3R5cGUgPSB2YWx1ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZmlsZW5hbWUsIGRhdGEgPSB2YWx1ZQogICAgICAgICAgICAgICAgY29udGVudF90eXBlID0gZ3Vlc3NfY29udGVudF90eXBlKGZpbGVuYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZpbGVuYW1lID0gTm9uZQogICAgICAgICAgICBjb250ZW50X3R5cGUgPSBOb25lCiAgICAgICAgICAgIGRhdGEgPSB2YWx1ZQoKICAgICAgICByZXF1ZXN0X3BhcmFtID0gY2xzKGZpZWxkbmFtZSwgZGF0YSwgZmlsZW5hbWU9ZmlsZW5hbWUpCiAgICAgICAgcmVxdWVzdF9wYXJhbS5tYWtlX211bHRpcGFydChjb250ZW50X3R5cGU9Y29udGVudF90eXBlKQoKICAgICAgICByZXR1cm4gcmVxdWVzdF9wYXJhbQoKICAgIGRlZiBfcmVuZGVyX3BhcnQoc2VsZiwgbmFtZSwgdmFsdWUpOgogICAgICAgICIiIgogICAgICAgIE92ZXJyaWRhYmxlIGhlbHBlciBmdW5jdGlvbiB0byBmb3JtYXQgYSBzaW5nbGUgaGVhZGVyIHBhcmFtZXRlci4KCiAgICAgICAgOnBhcmFtIG5hbWU6CiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIsIGEgc3RyaW5nIGV4cGVjdGVkIHRvIGJlIEFTQ0lJIG9ubHkuCiAgICAgICAgOnBhcmFtIHZhbHVlOgogICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciwgcHJvdmlkZWQgYXMgYSB1bmljb2RlIHN0cmluZy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gZm9ybWF0X2hlYWRlcl9wYXJhbShuYW1lLCB2YWx1ZSkKCiAgICBkZWYgX3JlbmRlcl9wYXJ0cyhzZWxmLCBoZWFkZXJfcGFydHMpOgogICAgICAgICIiIgogICAgICAgIEhlbHBlciBmdW5jdGlvbiB0byBmb3JtYXQgYW5kIHF1b3RlIGEgc2luZ2xlIGhlYWRlci4KCiAgICAgICAgVXNlZnVsIGZvciBzaW5nbGUgaGVhZGVycyB0aGF0IGFyZSBjb21wb3NlZCBvZiBtdWx0aXBsZSBpdGVtcy4gRS5nLiwKICAgICAgICAnQ29udGVudC1EaXNwb3NpdGlvbicgZmllbGRzLgoKICAgICAgICA6cGFyYW0gaGVhZGVyX3BhcnRzOgogICAgICAgICAgICBBIHNlcXVlbmNlIG9mIChrLCB2KSB0eXBsZXMgb3IgYSA6Y2xhc3M6YGRpY3RgIG9mIChrLCB2KSB0byBmb3JtYXQKICAgICAgICAgICAgYXMgYGsxPSJ2MSI7IGsyPSJ2MiI7IC4uLmAuCiAgICAgICAgIiIiCiAgICAgICAgcGFydHMgPSBbXQogICAgICAgIGl0ZXJhYmxlID0gaGVhZGVyX3BhcnRzCiAgICAgICAgaWYgaXNpbnN0YW5jZShoZWFkZXJfcGFydHMsIGRpY3QpOgogICAgICAgICAgICBpdGVyYWJsZSA9IGhlYWRlcl9wYXJ0cy5pdGVtcygpCgogICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBpdGVyYWJsZToKICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoc2VsZi5fcmVuZGVyX3BhcnQobmFtZSwgdmFsdWUpKQoKICAgICAgICByZXR1cm4gJzsgJy5qb2luKHBhcnRzKQoKICAgIGRlZiByZW5kZXJfaGVhZGVycyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZW5kZXJzIHRoZSBoZWFkZXJzIGZvciB0aGlzIHJlcXVlc3QgZmllbGQuCiAgICAgICAgIiIiCiAgICAgICAgbGluZXMgPSBbXQoKICAgICAgICBzb3J0X2tleXMgPSBbJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnQ29udGVudC1UeXBlJywgJ0NvbnRlbnQtTG9jYXRpb24nXQogICAgICAgIGZvciBzb3J0X2tleSBpbiBzb3J0X2tleXM6CiAgICAgICAgICAgIGlmIHNlbGYuaGVhZGVycy5nZXQoc29ydF9rZXksIEZhbHNlKToKICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgnJXM6ICVzJyAlIChzb3J0X2tleSwgc2VsZi5oZWFkZXJzW3NvcnRfa2V5XSkpCgogICAgICAgIGZvciBoZWFkZXJfbmFtZSwgaGVhZGVyX3ZhbHVlIGluIHNlbGYuaGVhZGVycy5pdGVtcygpOgogICAgICAgICAgICBpZiBoZWFkZXJfbmFtZSBub3QgaW4gc29ydF9rZXlzOgogICAgICAgICAgICAgICAgaWYgaGVhZGVyX3ZhbHVlOgogICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgnJXM6ICVzJyAlIChoZWFkZXJfbmFtZSwgaGVhZGVyX3ZhbHVlKSkKCiAgICAgICAgbGluZXMuYXBwZW5kKCdcclxuJykKICAgICAgICByZXR1cm4gJ1xyXG4nLmpvaW4obGluZXMpCgogICAgZGVmIG1ha2VfbXVsdGlwYXJ0KHNlbGYsIGNvbnRlbnRfZGlzcG9zaXRpb249Tm9uZSwgY29udGVudF90eXBlPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF9sb2NhdGlvbj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBNYWtlcyB0aGlzIHJlcXVlc3QgZmllbGQgaW50byBhIG11bHRpcGFydCByZXF1ZXN0IGZpZWxkLgoKICAgICAgICBUaGlzIG1ldGhvZCBvdmVycmlkZXMgIkNvbnRlbnQtRGlzcG9zaXRpb24iLCAiQ29udGVudC1UeXBlIiBhbmQKICAgICAgICAiQ29udGVudC1Mb2NhdGlvbiIgaGVhZGVycyB0byB0aGUgcmVxdWVzdCBwYXJhbWV0ZXIuCgogICAgICAgIDpwYXJhbSBjb250ZW50X3R5cGU6CiAgICAgICAgICAgIFRoZSAnQ29udGVudC1UeXBlJyBvZiB0aGUgcmVxdWVzdCBib2R5LgogICAgICAgIDpwYXJhbSBjb250ZW50X2xvY2F0aW9uOgogICAgICAgICAgICBUaGUgJ0NvbnRlbnQtTG9jYXRpb24nIG9mIHRoZSByZXF1ZXN0IGJvZHkuCgogICAgICAgICIiIgogICAgICAgIHNlbGYuaGVhZGVyc1snQ29udGVudC1EaXNwb3NpdGlvbiddID0gY29udGVudF9kaXNwb3NpdGlvbiBvciAnZm9ybS1kYXRhJwogICAgICAgIHNlbGYuaGVhZGVyc1snQ29udGVudC1EaXNwb3NpdGlvbiddICs9ICc7ICcuam9pbihbCiAgICAgICAgICAgICcnLCBzZWxmLl9yZW5kZXJfcGFydHMoCiAgICAgICAgICAgICAgICAoKCduYW1lJywgc2VsZi5fbmFtZSksICgnZmlsZW5hbWUnLCBzZWxmLl9maWxlbmFtZSkpCiAgICAgICAgICAgICkKICAgICAgICBdKQogICAgICAgIHNlbGYuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSBjb250ZW50X3R5cGUKICAgICAgICBzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtTG9jYXRpb24nXSA9IGNvbnRlbnRfbG9jYXRpb24KUEsDBBQAAAAAAAAAIQDXXdAXEQkAABEJAAAvAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvZmlsZXBvc3QucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAppbXBvcnQgY29kZWNzCgpmcm9tIHV1aWQgaW1wb3J0IHV1aWQ0CmZyb20gaW8gaW1wb3J0IEJ5dGVzSU8KCmZyb20gLnBhY2thZ2VzIGltcG9ydCBzaXgKZnJvbSAucGFja2FnZXMuc2l4IGltcG9ydCBiCmZyb20gLmZpZWxkcyBpbXBvcnQgUmVxdWVzdEZpZWxkCgp3cml0ZXIgPSBjb2RlY3MubG9va3VwKCd1dGYtOCcpWzNdCgoKZGVmIGNob29zZV9ib3VuZGFyeSgpOgogICAgIiIiCiAgICBPdXIgZW1iYXJyYXNzaW5nbHktc2ltcGxlIHJlcGxhY2VtZW50IGZvciBtaW1ldG9vbHMuY2hvb3NlX2JvdW5kYXJ5LgogICAgIiIiCiAgICByZXR1cm4gdXVpZDQoKS5oZXgKCgpkZWYgaXRlcl9maWVsZF9vYmplY3RzKGZpZWxkcyk6CiAgICAiIiIKICAgIEl0ZXJhdGUgb3ZlciBmaWVsZHMuCgogICAgU3VwcG9ydHMgbGlzdCBvZiAoaywgdikgdHVwbGVzIGFuZCBkaWN0cywgYW5kIGxpc3RzIG9mCiAgICA6Y2xhc3M6YH51cmxsaWIzLmZpZWxkcy5SZXF1ZXN0RmllbGRgLgoKICAgICIiIgogICAgaWYgaXNpbnN0YW5jZShmaWVsZHMsIGRpY3QpOgogICAgICAgIGkgPSBzaXguaXRlcml0ZW1zKGZpZWxkcykKICAgIGVsc2U6CiAgICAgICAgaSA9IGl0ZXIoZmllbGRzKQoKICAgIGZvciBmaWVsZCBpbiBpOgogICAgICAgIGlmIGlzaW5zdGFuY2UoZmllbGQsIFJlcXVlc3RGaWVsZCk6CiAgICAgICAgICAgIHlpZWxkIGZpZWxkCiAgICAgICAgZWxzZToKICAgICAgICAgICAgeWllbGQgUmVxdWVzdEZpZWxkLmZyb21fdHVwbGVzKCpmaWVsZCkKCgpkZWYgaXRlcl9maWVsZHMoZmllbGRzKToKICAgICIiIgogICAgLi4gZGVwcmVjYXRlZDo6IDEuNgoKICAgIEl0ZXJhdGUgb3ZlciBmaWVsZHMuCgogICAgVGhlIGFkZGl0aW9uIG9mIDpjbGFzczpgfnVybGxpYjMuZmllbGRzLlJlcXVlc3RGaWVsZGAgbWFrZXMgdGhpcyBmdW5jdGlvbgogICAgb2Jzb2xldGUuIEluc3RlYWQsIHVzZSA6ZnVuYzpgaXRlcl9maWVsZF9vYmplY3RzYCwgd2hpY2ggcmV0dXJucwogICAgOmNsYXNzOmB+dXJsbGliMy5maWVsZHMuUmVxdWVzdEZpZWxkYCBvYmplY3RzLgoKICAgIFN1cHBvcnRzIGxpc3Qgb2YgKGssIHYpIHR1cGxlcyBhbmQgZGljdHMuCiAgICAiIiIKICAgIGlmIGlzaW5zdGFuY2UoZmllbGRzLCBkaWN0KToKICAgICAgICByZXR1cm4gKChrLCB2KSBmb3IgaywgdiBpbiBzaXguaXRlcml0ZW1zKGZpZWxkcykpCgogICAgcmV0dXJuICgoaywgdikgZm9yIGssIHYgaW4gZmllbGRzKQoKCmRlZiBlbmNvZGVfbXVsdGlwYXJ0X2Zvcm1kYXRhKGZpZWxkcywgYm91bmRhcnk9Tm9uZSk6CiAgICAiIiIKICAgIEVuY29kZSBhIGRpY3Rpb25hcnkgb2YgYGBmaWVsZHNgYCB1c2luZyB0aGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YSBNSU1FIGZvcm1hdC4KCiAgICA6cGFyYW0gZmllbGRzOgogICAgICAgIERpY3Rpb25hcnkgb2YgZmllbGRzIG9yIGxpc3Qgb2YgKGtleSwgOmNsYXNzOmB+dXJsbGliMy5maWVsZHMuUmVxdWVzdEZpZWxkYCkuCgogICAgOnBhcmFtIGJvdW5kYXJ5OgogICAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoZW4gYSByYW5kb20gYm91bmRhcnkgd2lsbCBiZSBnZW5lcmF0ZWQgdXNpbmcKICAgICAgICA6ZnVuYzpgbWltZXRvb2xzLmNob29zZV9ib3VuZGFyeWAuCiAgICAiIiIKICAgIGJvZHkgPSBCeXRlc0lPKCkKICAgIGlmIGJvdW5kYXJ5IGlzIE5vbmU6CiAgICAgICAgYm91bmRhcnkgPSBjaG9vc2VfYm91bmRhcnkoKQoKICAgIGZvciBmaWVsZCBpbiBpdGVyX2ZpZWxkX29iamVjdHMoZmllbGRzKToKICAgICAgICBib2R5LndyaXRlKGIoJy0tJXNcclxuJyAlIChib3VuZGFyeSkpKQoKICAgICAgICB3cml0ZXIoYm9keSkud3JpdGUoZmllbGQucmVuZGVyX2hlYWRlcnMoKSkKICAgICAgICBkYXRhID0gZmllbGQuZGF0YQoKICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIGludCk6CiAgICAgICAgICAgIGRhdGEgPSBzdHIoZGF0YSkgICMgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkKCiAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBzaXgudGV4dF90eXBlKToKICAgICAgICAgICAgd3JpdGVyKGJvZHkpLndyaXRlKGRhdGEpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYm9keS53cml0ZShkYXRhKQoKICAgICAgICBib2R5LndyaXRlKGInXHJcbicpCgogICAgYm9keS53cml0ZShiKCctLSVzLS1cclxuJyAlIChib3VuZGFyeSkpKQoKICAgIGNvbnRlbnRfdHlwZSA9IHN0cignbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JXMnICUgYm91bmRhcnkpCgogICAgcmV0dXJuIGJvZHkuZ2V0dmFsdWUoKSwgY29udGVudF90eXBlClBLAwQUAAAAAAAAACEAj12gfG0AAABtAAAAOAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL19faW5pdF9fLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gLiBpbXBvcnQgc3NsX21hdGNoX2hvc3RuYW1lCgpfX2FsbF9fID0gKCdzc2xfbWF0Y2hfaG9zdG5hbWUnLCApClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAQgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL2JhY2twb3J0cy9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAUlccubUFAAC1BQAAQgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL2JhY2twb3J0cy9tYWtlZmlsZS5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiIiIgpiYWNrcG9ydHMubWFrZWZpbGUKfn5+fn5+fn5+fn5+fn5+fn5+CgpCYWNrcG9ydHMgdGhlIFB5dGhvbiAzIGBgc29ja2V0Lm1ha2VmaWxlYGAgbWV0aG9kIGZvciB1c2Ugd2l0aCBhbnl0aGluZyB0aGF0CndhbnRzIHRvIGNyZWF0ZSBhICJmYWtlIiBzb2NrZXQgb2JqZWN0LgoiIiIKaW1wb3J0IGlvCgpmcm9tIHNvY2tldCBpbXBvcnQgU29ja2V0SU8KCgpkZWYgYmFja3BvcnRfbWFrZWZpbGUoc2VsZiwgbW9kZT0iciIsIGJ1ZmZlcmluZz1Ob25lLCBlbmNvZGluZz1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgZXJyb3JzPU5vbmUsIG5ld2xpbmU9Tm9uZSk6CiAgICAiIiIKICAgIEJhY2twb3J0IG9mIGBgc29ja2V0Lm1ha2VmaWxlYGAgZnJvbSBQeXRob24gMy41LgogICAgIiIiCiAgICBpZiBub3Qgc2V0KG1vZGUpIDw9IHNldChbInIiLCAidyIsICJiIl0pOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICJpbnZhbGlkIG1vZGUgJXIgKG9ubHkgciwgdywgYiBhbGxvd2VkKSIgJSAobW9kZSwpCiAgICAgICAgKQogICAgd3JpdGluZyA9ICJ3IiBpbiBtb2RlCiAgICByZWFkaW5nID0gInIiIGluIG1vZGUgb3Igbm90IHdyaXRpbmcKICAgIGFzc2VydCByZWFkaW5nIG9yIHdyaXRpbmcKICAgIGJpbmFyeSA9ICJiIiBpbiBtb2RlCiAgICByYXdtb2RlID0gIiIKICAgIGlmIHJlYWRpbmc6CiAgICAgICAgcmF3bW9kZSArPSAiciIKICAgIGlmIHdyaXRpbmc6CiAgICAgICAgcmF3bW9kZSArPSAidyIKICAgIHJhdyA9IFNvY2tldElPKHNlbGYsIHJhd21vZGUpCiAgICBzZWxmLl9tYWtlZmlsZV9yZWZzICs9IDEKICAgIGlmIGJ1ZmZlcmluZyBpcyBOb25lOgogICAgICAgIGJ1ZmZlcmluZyA9IC0xCiAgICBpZiBidWZmZXJpbmcgPCAwOgogICAgICAgIGJ1ZmZlcmluZyA9IGlvLkRFRkFVTFRfQlVGRkVSX1NJWkUKICAgIGlmIGJ1ZmZlcmluZyA9PSAwOgogICAgICAgIGlmIG5vdCBiaW5hcnk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVuYnVmZmVyZWQgc3RyZWFtcyBtdXN0IGJlIGJpbmFyeSIpCiAgICAgICAgcmV0dXJuIHJhdwogICAgaWYgcmVhZGluZyBhbmQgd3JpdGluZzoKICAgICAgICBidWZmZXIgPSBpby5CdWZmZXJlZFJXUGFpcihyYXcsIHJhdywgYnVmZmVyaW5nKQogICAgZWxpZiByZWFkaW5nOgogICAgICAgIGJ1ZmZlciA9IGlvLkJ1ZmZlcmVkUmVhZGVyKHJhdywgYnVmZmVyaW5nKQogICAgZWxzZToKICAgICAgICBhc3NlcnQgd3JpdGluZwogICAgICAgIGJ1ZmZlciA9IGlvLkJ1ZmZlcmVkV3JpdGVyKHJhdywgYnVmZmVyaW5nKQogICAgaWYgYmluYXJ5OgogICAgICAgIHJldHVybiBidWZmZXIKICAgIHRleHQgPSBpby5UZXh0SU9XcmFwcGVyKGJ1ZmZlciwgZW5jb2RpbmcsIGVycm9ycywgbmV3bGluZSkKICAgIHRleHQubW9kZSA9IG1vZGUKICAgIHJldHVybiB0ZXh0ClBLAwQUAAAAAAAAACEARsGmZ+ciAADnIgAAPAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL29yZGVyZWRfZGljdC5weSMgQmFja3BvcnQgb2YgT3JkZXJlZERpY3QoKSBjbGFzcyB0aGF0IHJ1bnMgb24gUHl0aG9uIDIuNCwgMi41LCAyLjYsIDIuNyBhbmQgcHlweS4KIyBQYXNzZXMgUHl0aG9uMi43J3MgdGVzdCBzdWl0ZSBhbmQgaW5jb3Jwb3JhdGVzIGFsbCB0aGUgbGF0ZXN0IHVwZGF0ZXMuCiMgQ29weXJpZ2h0IDIwMDkgUmF5bW9uZCBIZXR0aW5nZXIsIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KIyBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy81NzY2OTMvCnRyeToKICAgIGZyb20gdGhyZWFkIGltcG9ydCBnZXRfaWRlbnQgYXMgX2dldF9pZGVudApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIGR1bW15X3RocmVhZCBpbXBvcnQgZ2V0X2lkZW50IGFzIF9nZXRfaWRlbnQKCnRyeToKICAgIGZyb20gX2FiY29sbCBpbXBvcnQgS2V5c1ZpZXcsIFZhbHVlc1ZpZXcsIEl0ZW1zVmlldwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBwYXNzCgoKY2xhc3MgT3JkZXJlZERpY3QoZGljdCk6CiAgICAnRGljdGlvbmFyeSB0aGF0IHJlbWVtYmVycyBpbnNlcnRpb24gb3JkZXInCiAgICAjIEFuIGluaGVyaXRlZCBkaWN0IG1hcHMga2V5cyB0byB2YWx1ZXMuCiAgICAjIFRoZSBpbmhlcml0ZWQgZGljdCBwcm92aWRlcyBfX2dldGl0ZW1fXywgX19sZW5fXywgX19jb250YWluc19fLCBhbmQgZ2V0LgogICAgIyBUaGUgcmVtYWluaW5nIG1ldGhvZHMgYXJlIG9yZGVyLWF3YXJlLgogICAgIyBCaWctTyBydW5uaW5nIHRpbWVzIGZvciBhbGwgbWV0aG9kcyBhcmUgdGhlIHNhbWUgYXMgZm9yIHJlZ3VsYXIgZGljdGlvbmFyaWVzLgoKICAgICMgVGhlIGludGVybmFsIHNlbGYuX19tYXAgZGljdGlvbmFyeSBtYXBzIGtleXMgdG8gbGlua3MgaW4gYSBkb3VibHkgbGlua2VkIGxpc3QuCiAgICAjIFRoZSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3Qgc3RhcnRzIGFuZCBlbmRzIHdpdGggYSBzZW50aW5lbCBlbGVtZW50LgogICAgIyBUaGUgc2VudGluZWwgZWxlbWVudCBuZXZlciBnZXRzIGRlbGV0ZWQgKHRoaXMgc2ltcGxpZmllcyB0aGUgYWxnb3JpdGhtKS4KICAgICMgRWFjaCBsaW5rIGlzIHN0b3JlZCBhcyBhIGxpc3Qgb2YgbGVuZ3RoIHRocmVlOiAgW1BSRVYsIE5FWFQsIEtFWV0uCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3ZHMpOgogICAgICAgICcnJ0luaXRpYWxpemUgYW4gb3JkZXJlZCBkaWN0aW9uYXJ5LiAgU2lnbmF0dXJlIGlzIHRoZSBzYW1lIGFzIGZvcgogICAgICAgIHJlZ3VsYXIgZGljdGlvbmFyaWVzLCBidXQga2V5d29yZCBhcmd1bWVudHMgYXJlIG5vdCByZWNvbW1lbmRlZAogICAgICAgIGJlY2F1c2UgdGhlaXIgaW5zZXJ0aW9uIG9yZGVyIGlzIGFyYml0cmFyeS4KCiAgICAgICAgJycnCiAgICAgICAgaWYgbGVuKGFyZ3MpID4gMToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdleHBlY3RlZCBhdCBtb3N0IDEgYXJndW1lbnRzLCBnb3QgJWQnICUgbGVuKGFyZ3MpKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5fX3Jvb3QKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHNlbGYuX19yb290ID0gcm9vdCA9IFtdICAgICAgICAgICAgICAgICAgICAgIyBzZW50aW5lbCBub2RlCiAgICAgICAgICAgIHJvb3RbOl0gPSBbcm9vdCwgcm9vdCwgTm9uZV0KICAgICAgICAgICAgc2VsZi5fX21hcCA9IHt9CiAgICAgICAgc2VsZi5fX3VwZGF0ZSgqYXJncywgKiprd2RzKQoKICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlLCBkaWN0X3NldGl0ZW09ZGljdC5fX3NldGl0ZW1fXyk6CiAgICAgICAgJ29kLl9fc2V0aXRlbV9fKGksIHkpIDw9PT4gb2RbaV09eScKICAgICAgICAjIFNldHRpbmcgYSBuZXcgaXRlbSBjcmVhdGVzIGEgbmV3IGxpbmsgd2hpY2ggZ29lcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5rZWQKICAgICAgICAjIGxpc3QsIGFuZCB0aGUgaW5oZXJpdGVkIGRpY3Rpb25hcnkgaXMgdXBkYXRlZCB3aXRoIHRoZSBuZXcga2V5L3ZhbHVlIHBhaXIuCiAgICAgICAgaWYga2V5IG5vdCBpbiBzZWxmOgogICAgICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKICAgICAgICAgICAgbGFzdCA9IHJvb3RbMF0KICAgICAgICAgICAgbGFzdFsxXSA9IHJvb3RbMF0gPSBzZWxmLl9fbWFwW2tleV0gPSBbbGFzdCwgcm9vdCwga2V5XQogICAgICAgIGRpY3Rfc2V0aXRlbShzZWxmLCBrZXksIHZhbHVlKQoKICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXksIGRpY3RfZGVsaXRlbT1kaWN0Ll9fZGVsaXRlbV9fKToKICAgICAgICAnb2QuX19kZWxpdGVtX18oeSkgPD09PiBkZWwgb2RbeV0nCiAgICAgICAgIyBEZWxldGluZyBhbiBleGlzdGluZyBpdGVtIHVzZXMgc2VsZi5fX21hcCB0byBmaW5kIHRoZSBsaW5rIHdoaWNoIGlzCiAgICAgICAgIyB0aGVuIHJlbW92ZWQgYnkgdXBkYXRpbmcgdGhlIGxpbmtzIGluIHRoZSBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIG5vZGVzLgogICAgICAgIGRpY3RfZGVsaXRlbShzZWxmLCBrZXkpCiAgICAgICAgbGlua19wcmV2LCBsaW5rX25leHQsIGtleSA9IHNlbGYuX19tYXAucG9wKGtleSkKICAgICAgICBsaW5rX3ByZXZbMV0gPSBsaW5rX25leHQKICAgICAgICBsaW5rX25leHRbMF0gPSBsaW5rX3ByZXYKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgJ29kLl9faXRlcl9fKCkgPD09PiBpdGVyKG9kKScKICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKICAgICAgICBjdXJyID0gcm9vdFsxXQogICAgICAgIHdoaWxlIGN1cnIgaXMgbm90IHJvb3Q6CiAgICAgICAgICAgIHlpZWxkIGN1cnJbMl0KICAgICAgICAgICAgY3VyciA9IGN1cnJbMV0KCiAgICBkZWYgX19yZXZlcnNlZF9fKHNlbGYpOgogICAgICAgICdvZC5fX3JldmVyc2VkX18oKSA8PT0+IHJldmVyc2VkKG9kKScKICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKICAgICAgICBjdXJyID0gcm9vdFswXQogICAgICAgIHdoaWxlIGN1cnIgaXMgbm90IHJvb3Q6CiAgICAgICAgICAgIHlpZWxkIGN1cnJbMl0KICAgICAgICAgICAgY3VyciA9IGN1cnJbMF0KCiAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgJ29kLmNsZWFyKCkgLT4gTm9uZS4gIFJlbW92ZSBhbGwgaXRlbXMgZnJvbSBvZC4nCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLl9fbWFwLml0ZXJ2YWx1ZXMoKToKICAgICAgICAgICAgICAgIGRlbCBub2RlWzpdCiAgICAgICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAogICAgICAgICAgICByb290WzpdID0gW3Jvb3QsIHJvb3QsIE5vbmVdCiAgICAgICAgICAgIHNlbGYuX19tYXAuY2xlYXIoKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGRpY3QuY2xlYXIoc2VsZikKCiAgICBkZWYgcG9waXRlbShzZWxmLCBsYXN0PVRydWUpOgogICAgICAgICcnJ29kLnBvcGl0ZW0oKSAtPiAoaywgdiksIHJldHVybiBhbmQgcmVtb3ZlIGEgKGtleSwgdmFsdWUpIHBhaXIuCiAgICAgICAgUGFpcnMgYXJlIHJldHVybmVkIGluIExJRk8gb3JkZXIgaWYgbGFzdCBpcyB0cnVlIG9yIEZJRk8gb3JkZXIgaWYgZmFsc2UuCgogICAgICAgICcnJwogICAgICAgIGlmIG5vdCBzZWxmOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcignZGljdGlvbmFyeSBpcyBlbXB0eScpCiAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CiAgICAgICAgaWYgbGFzdDoKICAgICAgICAgICAgbGluayA9IHJvb3RbMF0KICAgICAgICAgICAgbGlua19wcmV2ID0gbGlua1swXQogICAgICAgICAgICBsaW5rX3ByZXZbMV0gPSByb290CiAgICAgICAgICAgIHJvb3RbMF0gPSBsaW5rX3ByZXYKICAgICAgICBlbHNlOgogICAgICAgICAgICBsaW5rID0gcm9vdFsxXQogICAgICAgICAgICBsaW5rX25leHQgPSBsaW5rWzFdCiAgICAgICAgICAgIHJvb3RbMV0gPSBsaW5rX25leHQKICAgICAgICAgICAgbGlua19uZXh0WzBdID0gcm9vdAogICAgICAgIGtleSA9IGxpbmtbMl0KICAgICAgICBkZWwgc2VsZi5fX21hcFtrZXldCiAgICAgICAgdmFsdWUgPSBkaWN0LnBvcChzZWxmLCBrZXkpCiAgICAgICAgcmV0dXJuIGtleSwgdmFsdWUKCiAgICAjIC0tIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBkbyBub3QgZGVwZW5kIG9uIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgLS0KCiAgICBkZWYga2V5cyhzZWxmKToKICAgICAgICAnb2Qua2V5cygpIC0+IGxpc3Qgb2Yga2V5cyBpbiBvZCcKICAgICAgICByZXR1cm4gbGlzdChzZWxmKQoKICAgIGRlZiB2YWx1ZXMoc2VsZik6CiAgICAgICAgJ29kLnZhbHVlcygpIC0+IGxpc3Qgb2YgdmFsdWVzIGluIG9kJwogICAgICAgIHJldHVybiBbc2VsZltrZXldIGZvciBrZXkgaW4gc2VsZl0KCiAgICBkZWYgaXRlbXMoc2VsZik6CiAgICAgICAgJ29kLml0ZW1zKCkgLT4gbGlzdCBvZiAoa2V5LCB2YWx1ZSkgcGFpcnMgaW4gb2QnCiAgICAgICAgcmV0dXJuIFsoa2V5LCBzZWxmW2tleV0pIGZvciBrZXkgaW4gc2VsZl0KCiAgICBkZWYgaXRlcmtleXMoc2VsZik6CiAgICAgICAgJ29kLml0ZXJrZXlzKCkgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBpbiBvZCcKICAgICAgICByZXR1cm4gaXRlcihzZWxmKQoKICAgIGRlZiBpdGVydmFsdWVzKHNlbGYpOgogICAgICAgICdvZC5pdGVydmFsdWVzIC0+IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBpbiBvZCcKICAgICAgICBmb3IgayBpbiBzZWxmOgogICAgICAgICAgICB5aWVsZCBzZWxmW2tdCgogICAgZGVmIGl0ZXJpdGVtcyhzZWxmKToKICAgICAgICAnb2QuaXRlcml0ZW1zIC0+IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIHZhbHVlKSBpdGVtcyBpbiBvZCcKICAgICAgICBmb3IgayBpbiBzZWxmOgogICAgICAgICAgICB5aWVsZCAoaywgc2VsZltrXSkKCiAgICBkZWYgdXBkYXRlKCphcmdzLCAqKmt3ZHMpOgogICAgICAgICcnJ29kLnVwZGF0ZShFLCAqKkYpIC0+IE5vbmUuICBVcGRhdGUgb2QgZnJvbSBkaWN0L2l0ZXJhYmxlIEUgYW5kIEYuCgogICAgICAgIElmIEUgaXMgYSBkaWN0IGluc3RhbmNlLCBkb2VzOiAgICAgICAgICAgZm9yIGsgaW4gRTogb2Rba10gPSBFW2tdCiAgICAgICAgSWYgRSBoYXMgYSAua2V5cygpIG1ldGhvZCwgZG9lczogICAgICAgICBmb3IgayBpbiBFLmtleXMoKTogb2Rba10gPSBFW2tdCiAgICAgICAgT3IgaWYgRSBpcyBhbiBpdGVyYWJsZSBvZiBpdGVtcywgZG9lczogICBmb3IgaywgdiBpbiBFOiBvZFtrXSA9IHYKICAgICAgICBJbiBlaXRoZXIgY2FzZSwgdGhpcyBpcyBmb2xsb3dlZCBieTogICAgIGZvciBrLCB2IGluIEYuaXRlbXMoKTogb2Rba10gPSB2CgogICAgICAgICcnJwogICAgICAgIGlmIGxlbihhcmdzKSA+IDI6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigndXBkYXRlKCkgdGFrZXMgYXQgbW9zdCAyIHBvc2l0aW9uYWwgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50cyAoJWQgZ2l2ZW4pJyAlIChsZW4oYXJncyksKSkKICAgICAgICBlbGlmIG5vdCBhcmdzOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ3VwZGF0ZSgpIHRha2VzIGF0IGxlYXN0IDEgYXJndW1lbnQgKDAgZ2l2ZW4pJykKICAgICAgICBzZWxmID0gYXJnc1swXQogICAgICAgICMgTWFrZSBwcm9ncmVzc2l2ZWx5IHdlYWtlciBhc3N1bXB0aW9ucyBhYm91dCAib3RoZXIiCiAgICAgICAgb3RoZXIgPSAoKQogICAgICAgIGlmIGxlbihhcmdzKSA9PSAyOgogICAgICAgICAgICBvdGhlciA9IGFyZ3NbMV0KICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkaWN0KToKICAgICAgICAgICAgZm9yIGtleSBpbiBvdGhlcjoKICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IG90aGVyW2tleV0KICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsICdrZXlzJyk6CiAgICAgICAgICAgIGZvciBrZXkgaW4gb3RoZXIua2V5cygpOgogICAgICAgICAgICAgICAgc2VsZltrZXldID0gb3RoZXJba2V5XQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG90aGVyOgogICAgICAgICAgICAgICAgc2VsZltrZXldID0gdmFsdWUKICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBrd2RzLml0ZW1zKCk6CiAgICAgICAgICAgIHNlbGZba2V5XSA9IHZhbHVlCgogICAgX191cGRhdGUgPSB1cGRhdGUgICMgbGV0IHN1YmNsYXNzZXMgb3ZlcnJpZGUgdXBkYXRlIHdpdGhvdXQgYnJlYWtpbmcgX19pbml0X18KCiAgICBfX21hcmtlciA9IG9iamVjdCgpCgogICAgZGVmIHBvcChzZWxmLCBrZXksIGRlZmF1bHQ9X19tYXJrZXIpOgogICAgICAgICcnJ29kLnBvcChrWyxkXSkgLT4gdiwgcmVtb3ZlIHNwZWNpZmllZCBrZXkgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS4KICAgICAgICBJZiBrZXkgaXMgbm90IGZvdW5kLCBkIGlzIHJldHVybmVkIGlmIGdpdmVuLCBvdGhlcndpc2UgS2V5RXJyb3IgaXMgcmFpc2VkLgoKICAgICAgICAnJycKICAgICAgICBpZiBrZXkgaW4gc2VsZjoKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltrZXldCiAgICAgICAgICAgIGRlbCBzZWxmW2tleV0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAogICAgICAgIGlmIGRlZmF1bHQgaXMgc2VsZi5fX21hcmtlcjoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3Ioa2V5KQogICAgICAgIHJldHVybiBkZWZhdWx0CgogICAgZGVmIHNldGRlZmF1bHQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgogICAgICAgICdvZC5zZXRkZWZhdWx0KGtbLGRdKSAtPiBvZC5nZXQoayxkKSwgYWxzbyBzZXQgb2Rba109ZCBpZiBrIG5vdCBpbiBvZCcKICAgICAgICBpZiBrZXkgaW4gc2VsZjoKICAgICAgICAgICAgcmV0dXJuIHNlbGZba2V5XQogICAgICAgIHNlbGZba2V5XSA9IGRlZmF1bHQKICAgICAgICByZXR1cm4gZGVmYXVsdAoKICAgIGRlZiBfX3JlcHJfXyhzZWxmLCBfcmVwcl9ydW5uaW5nPXt9KToKICAgICAgICAnb2QuX19yZXByX18oKSA8PT0+IHJlcHIob2QpJwogICAgICAgIGNhbGxfa2V5ID0gaWQoc2VsZiksIF9nZXRfaWRlbnQoKQogICAgICAgIGlmIGNhbGxfa2V5IGluIF9yZXByX3J1bm5pbmc6CiAgICAgICAgICAgIHJldHVybiAnLi4uJwogICAgICAgIF9yZXByX3J1bm5pbmdbY2FsbF9rZXldID0gMQogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgbm90IHNlbGY6CiAgICAgICAgICAgICAgICByZXR1cm4gJyVzKCknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCkKICAgICAgICAgICAgcmV0dXJuICclcyglciknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLml0ZW1zKCkpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZGVsIF9yZXByX3J1bm5pbmdbY2FsbF9rZXldCgogICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CiAgICAgICAgJ1JldHVybiBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgcGlja2xpbmcnCiAgICAgICAgaXRlbXMgPSBbW2ssIHNlbGZba11dIGZvciBrIGluIHNlbGZdCiAgICAgICAgaW5zdF9kaWN0ID0gdmFycyhzZWxmKS5jb3B5KCkKICAgICAgICBmb3IgayBpbiB2YXJzKE9yZGVyZWREaWN0KCkpOgogICAgICAgICAgICBpbnN0X2RpY3QucG9wKGssIE5vbmUpCiAgICAgICAgaWYgaW5zdF9kaWN0OgogICAgICAgICAgICByZXR1cm4gKHNlbGYuX19jbGFzc19fLCAoaXRlbXMsKSwgaW5zdF9kaWN0KQogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXywgKGl0ZW1zLCkKCiAgICBkZWYgY29weShzZWxmKToKICAgICAgICAnb2QuY29weSgpIC0+IGEgc2hhbGxvdyBjb3B5IG9mIG9kJwogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21rZXlzKGNscywgaXRlcmFibGUsIHZhbHVlPU5vbmUpOgogICAgICAgICcnJ09ELmZyb21rZXlzKFNbLCB2XSkgLT4gTmV3IG9yZGVyZWQgZGljdGlvbmFyeSB3aXRoIGtleXMgZnJvbSBTCiAgICAgICAgYW5kIHZhbHVlcyBlcXVhbCB0byB2ICh3aGljaCBkZWZhdWx0cyB0byBOb25lKS4KCiAgICAgICAgJycnCiAgICAgICAgZCA9IGNscygpCiAgICAgICAgZm9yIGtleSBpbiBpdGVyYWJsZToKICAgICAgICAgICAgZFtrZXldID0gdmFsdWUKICAgICAgICByZXR1cm4gZAoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgICcnJ29kLl9fZXFfXyh5KSA8PT0+IG9kPT15LiAgQ29tcGFyaXNvbiB0byBhbm90aGVyIE9EIGlzIG9yZGVyLXNlbnNpdGl2ZQogICAgICAgIHdoaWxlIGNvbXBhcmlzb24gdG8gYSByZWd1bGFyIG1hcHBpbmcgaXMgb3JkZXItaW5zZW5zaXRpdmUuCgogICAgICAgICcnJwogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIE9yZGVyZWREaWN0KToKICAgICAgICAgICAgcmV0dXJuIGxlbihzZWxmKT09bGVuKG90aGVyKSBhbmQgc2VsZi5pdGVtcygpID09IG90aGVyLml0ZW1zKCkKICAgICAgICByZXR1cm4gZGljdC5fX2VxX18oc2VsZiwgb3RoZXIpCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCgogICAgIyAtLSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIG9ubHkgdXNlZCBpbiBQeXRob24gMi43IC0tCgogICAgZGVmIHZpZXdrZXlzKHNlbGYpOgogICAgICAgICJvZC52aWV3a2V5cygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gb2QncyBrZXlzIgogICAgICAgIHJldHVybiBLZXlzVmlldyhzZWxmKQoKICAgIGRlZiB2aWV3dmFsdWVzKHNlbGYpOgogICAgICAgICJvZC52aWV3dmFsdWVzKCkgLT4gYW4gb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gb2QncyB2YWx1ZXMiCiAgICAgICAgcmV0dXJuIFZhbHVlc1ZpZXcoc2VsZikKCiAgICBkZWYgdmlld2l0ZW1zKHNlbGYpOgogICAgICAgICJvZC52aWV3aXRlbXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIG9kJ3MgaXRlbXMiCiAgICAgICAgcmV0dXJuIEl0ZW1zVmlldyhzZWxmKQpQSwMEFAAAAAAAAAAhAJlYTVqSdQAAknUAADMAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9zaXgucHkiIiJVdGlsaXRpZXMgZm9yIHdyaXRpbmcgY29kZSB0aGF0IHJ1bnMgb24gUHl0aG9uIDIgYW5kIDMiIiIKCiMgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTUgQmVuamFtaW4gUGV0ZXJzb24KIwojIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAojIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKIyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCiMgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIwojIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAojIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiMKIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgojIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAojIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQojIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKIyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAojIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiMgU09GVFdBUkUuCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgc3lzCmltcG9ydCB0eXBlcwoKX19hdXRob3JfXyA9ICJCZW5qYW1pbiBQZXRlcnNvbiA8YmVuamFtaW5AcHl0aG9uLm9yZz4iCl9fdmVyc2lvbl9fID0gIjEuMTAuMCIKCgojIFVzZWZ1bCBmb3IgdmVyeSBjb2Fyc2UgdmVyc2lvbiBkaWZmZXJlbnRpYXRpb24uClBZMiA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMgpQWTMgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDMKUFkzNCA9IHN5cy52ZXJzaW9uX2luZm9bMDoyXSA+PSAoMywgNCkKCmlmIFBZMzoKICAgIHN0cmluZ190eXBlcyA9IHN0ciwKICAgIGludGVnZXJfdHlwZXMgPSBpbnQsCiAgICBjbGFzc190eXBlcyA9IHR5cGUsCiAgICB0ZXh0X3R5cGUgPSBzdHIKICAgIGJpbmFyeV90eXBlID0gYnl0ZXMKCiAgICBNQVhTSVpFID0gc3lzLm1heHNpemUKZWxzZToKICAgIHN0cmluZ190eXBlcyA9IGJhc2VzdHJpbmcsCiAgICBpbnRlZ2VyX3R5cGVzID0gKGludCwgbG9uZykKICAgIGNsYXNzX3R5cGVzID0gKHR5cGUsIHR5cGVzLkNsYXNzVHlwZSkKICAgIHRleHRfdHlwZSA9IHVuaWNvZGUKICAgIGJpbmFyeV90eXBlID0gc3RyCgogICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoImphdmEiKToKICAgICAgICAjIEp5dGhvbiBhbHdheXMgdXNlcyAzMiBiaXRzLgogICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgMzEpIC0gMSkKICAgIGVsc2U6CiAgICAgICAgIyBJdCdzIHBvc3NpYmxlIHRvIGhhdmUgc2l6ZW9mKGxvbmcpICE9IHNpemVvZihQeV9zc2l6ZV90KS4KICAgICAgICBjbGFzcyBYKG9iamVjdCk6CgogICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICAgICAgICAgIHJldHVybiAxIDw8IDMxCiAgICAgICAgdHJ5OgogICAgICAgICAgICBsZW4oWCgpKQogICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgogICAgICAgICAgICAjIDMyLWJpdAogICAgICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDMxKSAtIDEpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyA2NC1iaXQKICAgICAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCA2MykgLSAxKQogICAgICAgIGRlbCBYCgoKZGVmIF9hZGRfZG9jKGZ1bmMsIGRvYyk6CiAgICAiIiJBZGQgZG9jdW1lbnRhdGlvbiB0byBhIGZ1bmN0aW9uLiIiIgogICAgZnVuYy5fX2RvY19fID0gZG9jCgoKZGVmIF9pbXBvcnRfbW9kdWxlKG5hbWUpOgogICAgIiIiSW1wb3J0IG1vZHVsZSwgcmV0dXJuaW5nIHRoZSBtb2R1bGUgYWZ0ZXIgdGhlIGxhc3QgZG90LiIiIgogICAgX19pbXBvcnRfXyhuYW1lKQogICAgcmV0dXJuIHN5cy5tb2R1bGVzW25hbWVdCgoKY2xhc3MgX0xhenlEZXNjcihvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCgogICAgZGVmIF9fZ2V0X18oc2VsZiwgb2JqLCB0cCk6CiAgICAgICAgcmVzdWx0ID0gc2VsZi5fcmVzb2x2ZSgpCiAgICAgICAgc2V0YXR0cihvYmosIHNlbGYubmFtZSwgcmVzdWx0KSAgIyBJbnZva2VzIF9fc2V0X18uCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFRoaXMgaXMgYSBiaXQgdWdseSwgYnV0IGl0IGF2b2lkcyBydW5uaW5nIHRoaXMgYWdhaW4gYnkKICAgICAgICAgICAgIyByZW1vdmluZyB0aGlzIGRlc2NyaXB0b3IuCiAgICAgICAgICAgIGRlbGF0dHIob2JqLl9fY2xhc3NfXywgc2VsZi5uYW1lKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBNb3ZlZE1vZHVsZShfTGF6eURlc2NyKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgb2xkLCBuZXc9Tm9uZSk6CiAgICAgICAgc3VwZXIoTW92ZWRNb2R1bGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgaWYgUFkzOgogICAgICAgICAgICBpZiBuZXcgaXMgTm9uZToKICAgICAgICAgICAgICAgIG5ldyA9IG5hbWUKICAgICAgICAgICAgc2VsZi5tb2QgPSBuZXcKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1vZCA9IG9sZAoKICAgIGRlZiBfcmVzb2x2ZShzZWxmKToKICAgICAgICByZXR1cm4gX2ltcG9ydF9tb2R1bGUoc2VsZi5tb2QpCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgogICAgICAgIF9tb2R1bGUgPSBzZWxmLl9yZXNvbHZlKCkKICAgICAgICB2YWx1ZSA9IGdldGF0dHIoX21vZHVsZSwgYXR0cikKICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbHVlKQogICAgICAgIHJldHVybiB2YWx1ZQoKCmNsYXNzIF9MYXp5TW9kdWxlKHR5cGVzLk1vZHVsZVR5cGUpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKICAgICAgICBzdXBlcihfTGF6eU1vZHVsZSwgc2VsZikuX19pbml0X18obmFtZSkKICAgICAgICBzZWxmLl9fZG9jX18gPSBzZWxmLl9fY2xhc3NfXy5fX2RvY19fCgogICAgZGVmIF9fZGlyX18oc2VsZik6CiAgICAgICAgYXR0cnMgPSBbIl9fZG9jX18iLCAiX19uYW1lX18iXQogICAgICAgIGF0dHJzICs9IFthdHRyLm5hbWUgZm9yIGF0dHIgaW4gc2VsZi5fbW92ZWRfYXR0cmlidXRlc10KICAgICAgICByZXR1cm4gYXR0cnMKCiAgICAjIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMKICAgIF9tb3ZlZF9hdHRyaWJ1dGVzID0gW10KCgpjbGFzcyBNb3ZlZEF0dHJpYnV0ZShfTGF6eURlc2NyKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgb2xkX21vZCwgbmV3X21vZCwgb2xkX2F0dHI9Tm9uZSwgbmV3X2F0dHI9Tm9uZSk6CiAgICAgICAgc3VwZXIoTW92ZWRBdHRyaWJ1dGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgaWYgUFkzOgogICAgICAgICAgICBpZiBuZXdfbW9kIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBuZXdfbW9kID0gbmFtZQogICAgICAgICAgICBzZWxmLm1vZCA9IG5ld19tb2QKICAgICAgICAgICAgaWYgbmV3X2F0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIGlmIG9sZF9hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbmV3X2F0dHIgPSBuYW1lCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5ld19hdHRyID0gb2xkX2F0dHIKICAgICAgICAgICAgc2VsZi5hdHRyID0gbmV3X2F0dHIKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1vZCA9IG9sZF9tb2QKICAgICAgICAgICAgaWYgb2xkX2F0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgIG9sZF9hdHRyID0gbmFtZQogICAgICAgICAgICBzZWxmLmF0dHIgPSBvbGRfYXR0cgoKICAgIGRlZiBfcmVzb2x2ZShzZWxmKToKICAgICAgICBtb2R1bGUgPSBfaW1wb3J0X21vZHVsZShzZWxmLm1vZCkKICAgICAgICByZXR1cm4gZ2V0YXR0cihtb2R1bGUsIHNlbGYuYXR0cikKCgpjbGFzcyBfU2l4TWV0YVBhdGhJbXBvcnRlcihvYmplY3QpOgoKICAgICIiIgogICAgQSBtZXRhIHBhdGggaW1wb3J0ZXIgdG8gaW1wb3J0IHNpeC5tb3ZlcyBhbmQgaXRzIHN1Ym1vZHVsZXMuCgogICAgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgUEVQMzAyIGZpbmRlciBhbmQgbG9hZGVyLiBJdCBzaG91bGQgYmUgY29tcGF0aWJsZQogICAgd2l0aCBQeXRob24gMi41IGFuZCBhbGwgZXhpc3RpbmcgdmVyc2lvbnMgb2YgUHl0aG9uMwogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpeF9tb2R1bGVfbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gc2l4X21vZHVsZV9uYW1lCiAgICAgICAgc2VsZi5rbm93bl9tb2R1bGVzID0ge30KCiAgICBkZWYgX2FkZF9tb2R1bGUoc2VsZiwgbW9kLCAqZnVsbG5hbWVzKToKICAgICAgICBmb3IgZnVsbG5hbWUgaW4gZnVsbG5hbWVzOgogICAgICAgICAgICBzZWxmLmtub3duX21vZHVsZXNbc2VsZi5uYW1lICsgIi4iICsgZnVsbG5hbWVdID0gbW9kCgogICAgZGVmIF9nZXRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5rbm93bl9tb2R1bGVzW3NlbGYubmFtZSArICIuIiArIGZ1bGxuYW1lXQoKICAgIGRlZiBmaW5kX21vZHVsZShzZWxmLCBmdWxsbmFtZSwgcGF0aD1Ob25lKToKICAgICAgICBpZiBmdWxsbmFtZSBpbiBzZWxmLmtub3duX21vZHVsZXM6CiAgICAgICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgX19nZXRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmtub3duX21vZHVsZXNbZnVsbG5hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiVGhpcyBsb2FkZXIgZG9lcyBub3Qga25vdyBtb2R1bGUgIiArIGZ1bGxuYW1lKQoKICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIGluIGNhc2Ugb2YgYSByZWxvYWQKICAgICAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzW2Z1bGxuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIG1vZCA9IHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKQogICAgICAgIGlmIGlzaW5zdGFuY2UobW9kLCBNb3ZlZE1vZHVsZSk6CiAgICAgICAgICAgIG1vZCA9IG1vZC5fcmVzb2x2ZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbW9kLl9fbG9hZGVyX18gPSBzZWxmCiAgICAgICAgc3lzLm1vZHVsZXNbZnVsbG5hbWVdID0gbW9kCiAgICAgICAgcmV0dXJuIG1vZAoKICAgIGRlZiBpc19wYWNrYWdlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdHJ1ZSwgaWYgdGhlIG5hbWVkIG1vZHVsZSBpcyBhIHBhY2thZ2UuCgogICAgICAgIFdlIG5lZWQgdGhpcyBtZXRob2QgdG8gZ2V0IGNvcnJlY3Qgc3BlYyBvYmplY3RzIHdpdGgKICAgICAgICBQeXRob24gMy40IChzZWUgUEVQNDUxKQogICAgICAgICIiIgogICAgICAgIHJldHVybiBoYXNhdHRyKHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKSwgIl9fcGF0aF9fIikKCiAgICBkZWYgZ2V0X2NvZGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgICIiIlJldHVybiBOb25lCgogICAgICAgIFJlcXVpcmVkLCBpZiBpc19wYWNrYWdlIGlzIGltcGxlbWVudGVkIiIiCiAgICAgICAgc2VsZi5fX2dldF9tb2R1bGUoZnVsbG5hbWUpICAjIGV2ZW50dWFsbHkgcmFpc2VzIEltcG9ydEVycm9yCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGdldF9zb3VyY2UgPSBnZXRfY29kZSAgIyBzYW1lIGFzIGdldF9jb2RlCgpfaW1wb3J0ZXIgPSBfU2l4TWV0YVBhdGhJbXBvcnRlcihfX25hbWVfXykKCgpjbGFzcyBfTW92ZWRJdGVtcyhfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMiIiIKICAgIF9fcGF0aF9fID0gW10gICMgbWFyayBhcyBwYWNrYWdlCgoKX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiY1N0cmluZ0lPIiwgImNTdHJpbmdJTyIsICJpbyIsICJTdHJpbmdJTyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImZpbHRlciIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaWZpbHRlciIsICJmaWx0ZXIiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJmaWx0ZXJmYWxzZSIsICJpdGVydG9vbHMiLCAiaXRlcnRvb2xzIiwgImlmaWx0ZXJmYWxzZSIsICJmaWx0ZXJmYWxzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImlucHV0IiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInJhd19pbnB1dCIsICJpbnB1dCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImludGVybiIsICJfX2J1aWx0aW5fXyIsICJzeXMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJtYXAiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgImltYXAiLCAibWFwIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZ2V0Y3dkIiwgIm9zIiwgIm9zIiwgImdldGN3ZHUiLCAiZ2V0Y3dkIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZ2V0Y3dkYiIsICJvcyIsICJvcyIsICJnZXRjd2QiLCAiZ2V0Y3dkYiIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInJhbmdlIiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInhyYW5nZSIsICJyYW5nZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInJlbG9hZF9tb2R1bGUiLCAiX19idWlsdGluX18iLCAiaW1wb3J0bGliIiBpZiBQWTM0IGVsc2UgImltcCIsICJyZWxvYWQiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyZWR1Y2UiLCAiX19idWlsdGluX18iLCAiZnVuY3Rvb2xzIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic2hsZXhfcXVvdGUiLCAicGlwZXMiLCAic2hsZXgiLCAicXVvdGUiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJTdHJpbmdJTyIsICJTdHJpbmdJTyIsICJpbyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJEaWN0IiwgIlVzZXJEaWN0IiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlckxpc3QiLCAiVXNlckxpc3QiLCAiY29sbGVjdGlvbnMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyU3RyaW5nIiwgIlVzZXJTdHJpbmciLCAiY29sbGVjdGlvbnMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ4cmFuZ2UiLCAiX19idWlsdGluX18iLCAiYnVpbHRpbnMiLCAieHJhbmdlIiwgInJhbmdlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiemlwIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpemlwIiwgInppcCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInppcF9sb25nZXN0IiwgIml0ZXJ0b29scyIsICJpdGVydG9vbHMiLCAiaXppcF9sb25nZXN0IiwgInppcF9sb25nZXN0IiksCiAgICBNb3ZlZE1vZHVsZSgiYnVpbHRpbnMiLCAiX19idWlsdGluX18iKSwKICAgIE1vdmVkTW9kdWxlKCJjb25maWdwYXJzZXIiLCAiQ29uZmlnUGFyc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgiY29weXJlZyIsICJjb3B5X3JlZyIpLAogICAgTW92ZWRNb2R1bGUoImRibV9nbnUiLCAiZ2RibSIsICJkYm0uZ251IiksCiAgICBNb3ZlZE1vZHVsZSgiX2R1bW15X3RocmVhZCIsICJkdW1teV90aHJlYWQiLCAiX2R1bW15X3RocmVhZCIpLAogICAgTW92ZWRNb2R1bGUoImh0dHBfY29va2llamFyIiwgImNvb2tpZWxpYiIsICJodHRwLmNvb2tpZWphciIpLAogICAgTW92ZWRNb2R1bGUoImh0dHBfY29va2llcyIsICJDb29raWUiLCAiaHR0cC5jb29raWVzIiksCiAgICBNb3ZlZE1vZHVsZSgiaHRtbF9lbnRpdGllcyIsICJodG1sZW50aXR5ZGVmcyIsICJodG1sLmVudGl0aWVzIiksCiAgICBNb3ZlZE1vZHVsZSgiaHRtbF9wYXJzZXIiLCAiSFRNTFBhcnNlciIsICJodG1sLnBhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoImh0dHBfY2xpZW50IiwgImh0dHBsaWIiLCAiaHR0cC5jbGllbnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX211bHRpcGFydCIsICJlbWFpbC5NSU1FTXVsdGlwYXJ0IiwgImVtYWlsLm1pbWUubXVsdGlwYXJ0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9ub25tdWx0aXBhcnQiLCAiZW1haWwuTUlNRU5vbk11bHRpcGFydCIsICJlbWFpbC5taW1lLm5vbm11bHRpcGFydCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfdGV4dCIsICJlbWFpbC5NSU1FVGV4dCIsICJlbWFpbC5taW1lLnRleHQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX2Jhc2UiLCAiZW1haWwuTUlNRUJhc2UiLCAiZW1haWwubWltZS5iYXNlIiksCiAgICBNb3ZlZE1vZHVsZSgiQmFzZUhUVFBTZXJ2ZXIiLCAiQmFzZUhUVFBTZXJ2ZXIiLCAiaHR0cC5zZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJDR0lIVFRQU2VydmVyIiwgIkNHSUhUVFBTZXJ2ZXIiLCAiaHR0cC5zZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJTaW1wbGVIVFRQU2VydmVyIiwgIlNpbXBsZUhUVFBTZXJ2ZXIiLCAiaHR0cC5zZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJjUGlja2xlIiwgImNQaWNrbGUiLCAicGlja2xlIiksCiAgICBNb3ZlZE1vZHVsZSgicXVldWUiLCAiUXVldWUiKSwKICAgIE1vdmVkTW9kdWxlKCJyZXBybGliIiwgInJlcHIiKSwKICAgIE1vdmVkTW9kdWxlKCJzb2NrZXRzZXJ2ZXIiLCAiU29ja2V0U2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiX3RocmVhZCIsICJ0aHJlYWQiLCAiX3RocmVhZCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXIiLCAiVGtpbnRlciIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZGlhbG9nIiwgIkRpYWxvZyIsICJ0a2ludGVyLmRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZmlsZWRpYWxvZyIsICJGaWxlRGlhbG9nIiwgInRraW50ZXIuZmlsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfc2Nyb2xsZWR0ZXh0IiwgIlNjcm9sbGVkVGV4dCIsICJ0a2ludGVyLnNjcm9sbGVkdGV4dCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfc2ltcGxlZGlhbG9nIiwgIlNpbXBsZURpYWxvZyIsICJ0a2ludGVyLnNpbXBsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdGl4IiwgIlRpeCIsICJ0a2ludGVyLnRpeCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdHRrIiwgInR0ayIsICJ0a2ludGVyLnR0ayIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfY29uc3RhbnRzIiwgIlRrY29uc3RhbnRzIiwgInRraW50ZXIuY29uc3RhbnRzIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9kbmQiLCAiVGtkbmQiLCAidGtpbnRlci5kbmQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbG9yY2hvb3NlciIsICJ0a0NvbG9yQ2hvb3NlciIsCiAgICAgICAgICAgICAgICAidGtpbnRlci5jb2xvcmNob29zZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbW1vbmRpYWxvZyIsICJ0a0NvbW1vbkRpYWxvZyIsCiAgICAgICAgICAgICAgICAidGtpbnRlci5jb21tb25kaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3RrZmlsZWRpYWxvZyIsICJ0a0ZpbGVEaWFsb2ciLCAidGtpbnRlci5maWxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9mb250IiwgInRrRm9udCIsICJ0a2ludGVyLmZvbnQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX21lc3NhZ2Vib3giLCAidGtNZXNzYWdlQm94IiwgInRraW50ZXIubWVzc2FnZWJveCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdGtzaW1wbGVkaWFsb2ciLCAidGtTaW1wbGVEaWFsb2ciLAogICAgICAgICAgICAgICAgInRraW50ZXIuc2ltcGxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX3BhcnNlIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9wYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWJfZXJyb3IiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliX2Vycm9yIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYiIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX3JvYm90cGFyc2VyIiwgInJvYm90cGFyc2VyIiwgInVybGxpYi5yb2JvdHBhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoInhtbHJwY19jbGllbnQiLCAieG1scnBjbGliIiwgInhtbHJwYy5jbGllbnQiKSwKICAgIE1vdmVkTW9kdWxlKCJ4bWxycGNfc2VydmVyIiwgIlNpbXBsZVhNTFJQQ1NlcnZlciIsICJ4bWxycGMuc2VydmVyIiksCl0KIyBBZGQgd2luZG93cyBzcGVjaWZpYyBtb2R1bGVzLgppZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKICAgIF9tb3ZlZF9hdHRyaWJ1dGVzICs9IFsKICAgICAgICBNb3ZlZE1vZHVsZSgid2lucmVnIiwgIl93aW5yZWciKSwKICAgIF0KCmZvciBhdHRyIGluIF9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihfTW92ZWRJdGVtcywgYXR0ci5uYW1lLCBhdHRyKQogICAgaWYgaXNpbnN0YW5jZShhdHRyLCBNb3ZlZE1vZHVsZSk6CiAgICAgICAgX2ltcG9ydGVyLl9hZGRfbW9kdWxlKGF0dHIsICJtb3Zlcy4iICsgYXR0ci5uYW1lKQpkZWwgYXR0cgoKX01vdmVkSXRlbXMuX21vdmVkX2F0dHJpYnV0ZXMgPSBfbW92ZWRfYXR0cmlidXRlcwoKbW92ZXMgPSBfTW92ZWRJdGVtcyhfX25hbWVfXyArICIubW92ZXMiKQpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUobW92ZXMsICJtb3ZlcyIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcGFyc2UiIiIKCgpfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUGFyc2VSZXN1bHQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiU3BsaXRSZXN1bHQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicGFyc2VfcXMiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicGFyc2VfcXNsIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGRlZnJhZyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxqb2luIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHBhcnNlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHNwbGl0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHVucGFyc2UiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsdW5zcGxpdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJxdW90ZSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicXVvdGVfcGx1cyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidW5xdW90ZSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidW5xdW90ZV9wbHVzIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxlbmNvZGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNwbGl0cXVlcnkiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNwbGl0dGFnIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHVzZXIiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfZnJhZ21lbnQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19uZXRsb2MiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19wYXJhbXMiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19xdWVyeSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX3JlbGF0aXZlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9wYXJzZSIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9wYXJzZSIsICJtb3Zlcy51cmxsaWIucGFyc2UiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX2Vycm9yIiIiCgoKX3VybGxpYl9lcnJvcl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlVSTEVycm9yIiwgInVybGxpYjIiLCAidXJsbGliLmVycm9yIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEVycm9yIiwgInVybGxpYjIiLCAidXJsbGliLmVycm9yIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQ29udGVudFRvb1Nob3J0RXJyb3IiLCAidXJsbGliIiwgInVybGxpYi5lcnJvciIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9lcnJvcl9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5lcnJvciIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9lcnJvciIsICJtb3Zlcy51cmxsaWIuZXJyb3IiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcmVxdWVzdCIiIgoKCl91cmxsaWJfcmVxdWVzdF9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoInVybG9wZW4iLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImluc3RhbGxfb3BlbmVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJidWlsZF9vcGVuZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhdGhuYW1lMnVybCIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmwycGF0aG5hbWUiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZ2V0cHJveGllcyIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJSZXF1ZXN0IiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJPcGVuZXJEaXJlY3RvciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUERlZmF1bHRFcnJvckhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBSZWRpcmVjdEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBDb29raWVQcm9jZXNzb3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5SGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQmFzZUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBQYXNzd29yZE1nciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFBhc3N3b3JkTWdyV2l0aERlZmF1bHRSZWFsbSIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQWJzdHJhY3RCYXNpY0F1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQQmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUHJveHlCYXNpY0F1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJBYnN0cmFjdERpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRGlnZXN0QXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5RGlnZXN0QXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQU0hhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkZpbGVIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJDYWNoZUZUUEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVua25vd25IYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRXJyb3JQcm9jZXNzb3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHJldHJpZXZlIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGNsZWFudXAiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVVJMb3BlbmVyIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkZhbmN5VVJMb3BlbmVyIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInByb3h5X2J5cGFzcyIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdCwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdC5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcmVxdWVzdF9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdChfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJlcXVlc3QiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcmVxdWVzdCIsICJtb3Zlcy51cmxsaWIucmVxdWVzdCIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcmVzcG9uc2UiIiIKCgpfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkYmFzZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkY2xvc2Vob29rIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRpbmZvIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRpbmZvdXJsIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZS5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcmVzcG9uc2VfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIucmVzcG9uc2UiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcmVzcG9uc2UiLCAibW92ZXMudXJsbGliLnJlc3BvbnNlIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlcihfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIiIgoKCl91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJSb2JvdEZpbGVQYXJzZXIiLCAicm9ib3RwYXJzZXIiLCAidXJsbGliLnJvYm90cGFyc2VyIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlciwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlcihfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJvYm90cGFyc2VyIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3JvYm90cGFyc2VyIiwgIm1vdmVzLnVybGxpYi5yb2JvdHBhcnNlciIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWIodHlwZXMuTW9kdWxlVHlwZSk6CgogICAgIiIiQ3JlYXRlIGEgc2l4Lm1vdmVzLnVybGxpYiBuYW1lc3BhY2UgdGhhdCByZXNlbWJsZXMgdGhlIFB5dGhvbiAzIG5hbWVzcGFjZSIiIgogICAgX19wYXRoX18gPSBbXSAgIyBtYXJrIGFzIHBhY2thZ2UKICAgIHBhcnNlID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcGFyc2UiKQogICAgZXJyb3IgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9lcnJvciIpCiAgICByZXF1ZXN0ID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcmVxdWVzdCIpCiAgICByZXNwb25zZSA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3Jlc3BvbnNlIikKICAgIHJvYm90cGFyc2VyID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiKQoKICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBbJ3BhcnNlJywgJ2Vycm9yJywgJ3JlcXVlc3QnLCAncmVzcG9uc2UnLCAncm9ib3RwYXJzZXInXQoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWIiKQoKCmRlZiBhZGRfbW92ZShtb3ZlKToKICAgICIiIkFkZCBhbiBpdGVtIHRvIHNpeC5tb3Zlcy4iIiIKICAgIHNldGF0dHIoX01vdmVkSXRlbXMsIG1vdmUubmFtZSwgbW92ZSkKCgpkZWYgcmVtb3ZlX21vdmUobmFtZSk6CiAgICAiIiJSZW1vdmUgaXRlbSBmcm9tIHNpeC5tb3Zlcy4iIiIKICAgIHRyeToKICAgICAgICBkZWxhdHRyKF9Nb3ZlZEl0ZW1zLCBuYW1lKQogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHRyeToKICAgICAgICAgICAgZGVsIG1vdmVzLl9fZGljdF9fW25hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigibm8gc3VjaCBtb3ZlLCAlciIgJSAobmFtZSwpKQoKCmlmIFBZMzoKICAgIF9tZXRoX2Z1bmMgPSAiX19mdW5jX18iCiAgICBfbWV0aF9zZWxmID0gIl9fc2VsZl9fIgoKICAgIF9mdW5jX2Nsb3N1cmUgPSAiX19jbG9zdXJlX18iCiAgICBfZnVuY19jb2RlID0gIl9fY29kZV9fIgogICAgX2Z1bmNfZGVmYXVsdHMgPSAiX19kZWZhdWx0c19fIgogICAgX2Z1bmNfZ2xvYmFscyA9ICJfX2dsb2JhbHNfXyIKZWxzZToKICAgIF9tZXRoX2Z1bmMgPSAiaW1fZnVuYyIKICAgIF9tZXRoX3NlbGYgPSAiaW1fc2VsZiIKCiAgICBfZnVuY19jbG9zdXJlID0gImZ1bmNfY2xvc3VyZSIKICAgIF9mdW5jX2NvZGUgPSAiZnVuY19jb2RlIgogICAgX2Z1bmNfZGVmYXVsdHMgPSAiZnVuY19kZWZhdWx0cyIKICAgIF9mdW5jX2dsb2JhbHMgPSAiZnVuY19nbG9iYWxzIgoKCnRyeToKICAgIGFkdmFuY2VfaXRlcmF0b3IgPSBuZXh0CmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgYWR2YW5jZV9pdGVyYXRvcihpdCk6CiAgICAgICAgcmV0dXJuIGl0Lm5leHQoKQpuZXh0ID0gYWR2YW5jZV9pdGVyYXRvcgoKCnRyeToKICAgIGNhbGxhYmxlID0gY2FsbGFibGUKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiBjYWxsYWJsZShvYmopOgogICAgICAgIHJldHVybiBhbnkoIl9fY2FsbF9fIiBpbiBrbGFzcy5fX2RpY3RfXyBmb3Iga2xhc3MgaW4gdHlwZShvYmopLl9fbXJvX18pCgoKaWYgUFkzOgogICAgZGVmIGdldF91bmJvdW5kX2Z1bmN0aW9uKHVuYm91bmQpOgogICAgICAgIHJldHVybiB1bmJvdW5kCgogICAgY3JlYXRlX2JvdW5kX21ldGhvZCA9IHR5cGVzLk1ldGhvZFR5cGUKCiAgICBkZWYgY3JlYXRlX3VuYm91bmRfbWV0aG9kKGZ1bmMsIGNscyk6CiAgICAgICAgcmV0dXJuIGZ1bmMKCiAgICBJdGVyYXRvciA9IG9iamVjdAplbHNlOgogICAgZGVmIGdldF91bmJvdW5kX2Z1bmN0aW9uKHVuYm91bmQpOgogICAgICAgIHJldHVybiB1bmJvdW5kLmltX2Z1bmMKCiAgICBkZWYgY3JlYXRlX2JvdW5kX21ldGhvZChmdW5jLCBvYmopOgogICAgICAgIHJldHVybiB0eXBlcy5NZXRob2RUeXBlKGZ1bmMsIG9iaiwgb2JqLl9fY2xhc3NfXykKCiAgICBkZWYgY3JlYXRlX3VuYm91bmRfbWV0aG9kKGZ1bmMsIGNscyk6CiAgICAgICAgcmV0dXJuIHR5cGVzLk1ldGhvZFR5cGUoZnVuYywgTm9uZSwgY2xzKQoKICAgIGNsYXNzIEl0ZXJhdG9yKG9iamVjdCk6CgogICAgICAgIGRlZiBuZXh0KHNlbGYpOgogICAgICAgICAgICByZXR1cm4gdHlwZShzZWxmKS5fX25leHRfXyhzZWxmKQoKICAgIGNhbGxhYmxlID0gY2FsbGFibGUKX2FkZF9kb2MoZ2V0X3VuYm91bmRfZnVuY3Rpb24sCiAgICAgICAgICIiIkdldCB0aGUgZnVuY3Rpb24gb3V0IG9mIGEgcG9zc2libHkgdW5ib3VuZCBmdW5jdGlvbiIiIikKCgpnZXRfbWV0aG9kX2Z1bmN0aW9uID0gb3BlcmF0b3IuYXR0cmdldHRlcihfbWV0aF9mdW5jKQpnZXRfbWV0aG9kX3NlbGYgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9tZXRoX3NlbGYpCmdldF9mdW5jdGlvbl9jbG9zdXJlID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19jbG9zdXJlKQpnZXRfZnVuY3Rpb25fY29kZSA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfY29kZSkKZ2V0X2Z1bmN0aW9uX2RlZmF1bHRzID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19kZWZhdWx0cykKZ2V0X2Z1bmN0aW9uX2dsb2JhbHMgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2dsb2JhbHMpCgoKaWYgUFkzOgogICAgZGVmIGl0ZXJrZXlzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQua2V5cygqKmt3KSkKCiAgICBkZWYgaXRlcnZhbHVlcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLnZhbHVlcygqKmt3KSkKCiAgICBkZWYgaXRlcml0ZW1zKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQuaXRlbXMoKiprdykpCgogICAgZGVmIGl0ZXJsaXN0cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLmxpc3RzKCoqa3cpKQoKICAgIHZpZXdrZXlzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJrZXlzIikKCiAgICB2aWV3dmFsdWVzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2YWx1ZXMiKQoKICAgIHZpZXdpdGVtcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigiaXRlbXMiKQplbHNlOgogICAgZGVmIGl0ZXJrZXlzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJrZXlzKCoqa3cpCgogICAgZGVmIGl0ZXJ2YWx1ZXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcnZhbHVlcygqKmt3KQoKICAgIGRlZiBpdGVyaXRlbXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcml0ZW1zKCoqa3cpCgogICAgZGVmIGl0ZXJsaXN0cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVybGlzdHMoKiprdykKCiAgICB2aWV3a2V5cyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmlld2tleXMiKQoKICAgIHZpZXd2YWx1ZXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXd2YWx1ZXMiKQoKICAgIHZpZXdpdGVtcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmlld2l0ZW1zIikKCl9hZGRfZG9jKGl0ZXJrZXlzLCAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMgb2YgYSBkaWN0aW9uYXJ5LiIpCl9hZGRfZG9jKGl0ZXJ2YWx1ZXMsICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgdmFsdWVzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVyaXRlbXMsCiAgICAgICAgICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgdmFsdWUpIHBhaXJzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVybGlzdHMsCiAgICAgICAgICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgW3ZhbHVlc10pIHBhaXJzIG9mIGEgZGljdGlvbmFyeS4iKQoKCmlmIFBZMzoKICAgIGRlZiBiKHMpOgogICAgICAgIHJldHVybiBzLmVuY29kZSgibGF0aW4tMSIpCgogICAgZGVmIHUocyk6CiAgICAgICAgcmV0dXJuIHMKICAgIHVuaWNociA9IGNocgogICAgaW1wb3J0IHN0cnVjdAogICAgaW50MmJ5dGUgPSBzdHJ1Y3QuU3RydWN0KCI+QiIpLnBhY2sKICAgIGRlbCBzdHJ1Y3QKICAgIGJ5dGUyaW50ID0gb3BlcmF0b3IuaXRlbWdldHRlcigwKQogICAgaW5kZXhieXRlcyA9IG9wZXJhdG9yLmdldGl0ZW0KICAgIGl0ZXJieXRlcyA9IGl0ZXIKICAgIGltcG9ydCBpbwogICAgU3RyaW5nSU8gPSBpby5TdHJpbmdJTwogICAgQnl0ZXNJTyA9IGlvLkJ5dGVzSU8KICAgIF9hc3NlcnRDb3VudEVxdWFsID0gImFzc2VydENvdW50RXF1YWwiCiAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzFdIDw9IDE6CiAgICAgICAgX2Fzc2VydFJhaXNlc1JlZ2V4ID0gImFzc2VydFJhaXNlc1JlZ2V4cCIKICAgICAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXhwTWF0Y2hlcyIKICAgIGVsc2U6CiAgICAgICAgX2Fzc2VydFJhaXNlc1JlZ2V4ID0gImFzc2VydFJhaXNlc1JlZ2V4IgogICAgICAgIF9hc3NlcnRSZWdleCA9ICJhc3NlcnRSZWdleCIKZWxzZToKICAgIGRlZiBiKHMpOgogICAgICAgIHJldHVybiBzCiAgICAjIFdvcmthcm91bmQgZm9yIHN0YW5kYWxvbmUgYmFja3NsYXNoCgogICAgZGVmIHUocyk6CiAgICAgICAgcmV0dXJuIHVuaWNvZGUocy5yZXBsYWNlKHInXFwnLCByJ1xcXFwnKSwgInVuaWNvZGVfZXNjYXBlIikKICAgIHVuaWNociA9IHVuaWNocgogICAgaW50MmJ5dGUgPSBjaHIKCiAgICBkZWYgYnl0ZTJpbnQoYnMpOgogICAgICAgIHJldHVybiBvcmQoYnNbMF0pCgogICAgZGVmIGluZGV4Ynl0ZXMoYnVmLCBpKToKICAgICAgICByZXR1cm4gb3JkKGJ1ZltpXSkKICAgIGl0ZXJieXRlcyA9IGZ1bmN0b29scy5wYXJ0aWFsKGl0ZXJ0b29scy5pbWFwLCBvcmQpCiAgICBpbXBvcnQgU3RyaW5nSU8KICAgIFN0cmluZ0lPID0gQnl0ZXNJTyA9IFN0cmluZ0lPLlN0cmluZ0lPCiAgICBfYXNzZXJ0Q291bnRFcXVhbCA9ICJhc3NlcnRJdGVtc0VxdWFsIgogICAgX2Fzc2VydFJhaXNlc1JlZ2V4ID0gImFzc2VydFJhaXNlc1JlZ2V4cCIKICAgIF9hc3NlcnRSZWdleCA9ICJhc3NlcnRSZWdleHBNYXRjaGVzIgpfYWRkX2RvYyhiLCAiIiJCeXRlIGxpdGVyYWwiIiIpCl9hZGRfZG9jKHUsICIiIlRleHQgbGl0ZXJhbCIiIikKCgpkZWYgYXNzZXJ0Q291bnRFcXVhbChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgX2Fzc2VydENvdW50RXF1YWwpKCphcmdzLCAqKmt3YXJncykKCgpkZWYgYXNzZXJ0UmFpc2VzUmVnZXgoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRSYWlzZXNSZWdleCkoKmFyZ3MsICoqa3dhcmdzKQoKCmRlZiBhc3NlcnRSZWdleChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgX2Fzc2VydFJlZ2V4KSgqYXJncywgKiprd2FyZ3MpCgoKaWYgUFkzOgogICAgZXhlY18gPSBnZXRhdHRyKG1vdmVzLmJ1aWx0aW5zLCAiZXhlYyIpCgogICAgZGVmIHJlcmFpc2UodHAsIHZhbHVlLCB0Yj1Ob25lKToKICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgICAgICB2YWx1ZSA9IHRwKCkKICAgICAgICBpZiB2YWx1ZS5fX3RyYWNlYmFja19fIGlzIG5vdCB0YjoKICAgICAgICAgICAgcmFpc2UgdmFsdWUud2l0aF90cmFjZWJhY2sodGIpCiAgICAgICAgcmFpc2UgdmFsdWUKCmVsc2U6CiAgICBkZWYgZXhlY18oX2NvZGVfLCBfZ2xvYnNfPU5vbmUsIF9sb2NzXz1Ob25lKToKICAgICAgICAiIiJFeGVjdXRlIGNvZGUgaW4gYSBuYW1lc3BhY2UuIiIiCiAgICAgICAgaWYgX2dsb2JzXyBpcyBOb25lOgogICAgICAgICAgICBmcmFtZSA9IHN5cy5fZ2V0ZnJhbWUoMSkKICAgICAgICAgICAgX2dsb2JzXyA9IGZyYW1lLmZfZ2xvYmFscwogICAgICAgICAgICBpZiBfbG9jc18gaXMgTm9uZToKICAgICAgICAgICAgICAgIF9sb2NzXyA9IGZyYW1lLmZfbG9jYWxzCiAgICAgICAgICAgIGRlbCBmcmFtZQogICAgICAgIGVsaWYgX2xvY3NfIGlzIE5vbmU6CiAgICAgICAgICAgIF9sb2NzXyA9IF9nbG9ic18KICAgICAgICBleGVjKCIiImV4ZWMgX2NvZGVfIGluIF9nbG9ic18sIF9sb2NzXyIiIikKCiAgICBleGVjXygiIiJkZWYgcmVyYWlzZSh0cCwgdmFsdWUsIHRiPU5vbmUpOgogICAgcmFpc2UgdHAsIHZhbHVlLCB0YgoiIiIpCgoKaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPT0gKDMsIDIpOgogICAgZXhlY18oIiIiZGVmIHJhaXNlX2Zyb20odmFsdWUsIGZyb21fdmFsdWUpOgogICAgaWYgZnJvbV92YWx1ZSBpcyBOb25lOgogICAgICAgIHJhaXNlIHZhbHVlCiAgICByYWlzZSB2YWx1ZSBmcm9tIGZyb21fdmFsdWUKIiIiKQplbGlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID4gKDMsIDIpOgogICAgZXhlY18oIiIiZGVmIHJhaXNlX2Zyb20odmFsdWUsIGZyb21fdmFsdWUpOgogICAgcmFpc2UgdmFsdWUgZnJvbSBmcm9tX3ZhbHVlCiIiIikKZWxzZToKICAgIGRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgICAgICByYWlzZSB2YWx1ZQoKCnByaW50XyA9IGdldGF0dHIobW92ZXMuYnVpbHRpbnMsICJwcmludCIsIE5vbmUpCmlmIHByaW50XyBpcyBOb25lOgogICAgZGVmIHByaW50XygqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIlRoZSBuZXctc3R5bGUgcHJpbnQgZnVuY3Rpb24gZm9yIFB5dGhvbiAyLjQgYW5kIDIuNS4iIiIKICAgICAgICBmcCA9IGt3YXJncy5wb3AoImZpbGUiLCBzeXMuc3Rkb3V0KQogICAgICAgIGlmIGZwIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBkZWYgd3JpdGUoZGF0YSk6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRhdGEsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICAgICAgZGF0YSA9IHN0cihkYXRhKQogICAgICAgICAgICAjIElmIHRoZSBmaWxlIGhhcyBhbiBlbmNvZGluZywgZW5jb2RlIHVuaWNvZGUgd2l0aCBpdC4KICAgICAgICAgICAgaWYgKGlzaW5zdGFuY2UoZnAsIGZpbGUpIGFuZAogICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoZGF0YSwgdW5pY29kZSkgYW5kCiAgICAgICAgICAgICAgICAgICAgZnAuZW5jb2RpbmcgaXMgbm90IE5vbmUpOgogICAgICAgICAgICAgICAgZXJyb3JzID0gZ2V0YXR0cihmcCwgImVycm9ycyIsIE5vbmUpCiAgICAgICAgICAgICAgICBpZiBlcnJvcnMgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSAic3RyaWN0IgogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKGZwLmVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgICAgIGZwLndyaXRlKGRhdGEpCiAgICAgICAgd2FudF91bmljb2RlID0gRmFsc2UKICAgICAgICBzZXAgPSBrd2FyZ3MucG9wKCJzZXAiLCBOb25lKQogICAgICAgIGlmIHNlcCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZXAsIHVuaWNvZGUpOgogICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHNlcCwgc3RyKToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigic2VwIG11c3QgYmUgTm9uZSBvciBhIHN0cmluZyIpCiAgICAgICAgZW5kID0ga3dhcmdzLnBvcCgiZW5kIiwgTm9uZSkKICAgICAgICBpZiBlbmQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZW5kLCB1bmljb2RlKToKICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShlbmQsIHN0cik6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImVuZCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmciKQogICAgICAgIGlmIGt3YXJnczoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJpbnZhbGlkIGtleXdvcmQgYXJndW1lbnRzIHRvIHByaW50KCkiKQogICAgICAgIGlmIG5vdCB3YW50X3VuaWNvZGU6CiAgICAgICAgICAgIGZvciBhcmcgaW4gYXJnczoKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnLCB1bmljb2RlKToKICAgICAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiB3YW50X3VuaWNvZGU6CiAgICAgICAgICAgIG5ld2xpbmUgPSB1bmljb2RlKCJcbiIpCiAgICAgICAgICAgIHNwYWNlID0gdW5pY29kZSgiICIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmV3bGluZSA9ICJcbiIKICAgICAgICAgICAgc3BhY2UgPSAiICIKICAgICAgICBpZiBzZXAgaXMgTm9uZToKICAgICAgICAgICAgc2VwID0gc3BhY2UKICAgICAgICBpZiBlbmQgaXMgTm9uZToKICAgICAgICAgICAgZW5kID0gbmV3bGluZQogICAgICAgIGZvciBpLCBhcmcgaW4gZW51bWVyYXRlKGFyZ3MpOgogICAgICAgICAgICBpZiBpOgogICAgICAgICAgICAgICAgd3JpdGUoc2VwKQogICAgICAgICAgICB3cml0ZShhcmcpCiAgICAgICAgd3JpdGUoZW5kKQppZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA8ICgzLCAzKToKICAgIF9wcmludCA9IHByaW50XwoKICAgIGRlZiBwcmludF8oKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBmcCA9IGt3YXJncy5nZXQoImZpbGUiLCBzeXMuc3Rkb3V0KQogICAgICAgIGZsdXNoID0ga3dhcmdzLnBvcCgiZmx1c2giLCBGYWxzZSkKICAgICAgICBfcHJpbnQoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGlmIGZsdXNoIGFuZCBmcCBpcyBub3QgTm9uZToKICAgICAgICAgICAgZnAuZmx1c2goKQoKX2FkZF9kb2MocmVyYWlzZSwgIiIiUmVyYWlzZSBhbiBleGNlcHRpb24uIiIiKQoKaWYgc3lzLnZlcnNpb25faW5mb1swOjJdIDwgKDMsIDQpOgogICAgZGVmIHdyYXBzKHdyYXBwZWQsIGFzc2lnbmVkPWZ1bmN0b29scy5XUkFQUEVSX0FTU0lHTk1FTlRTLAogICAgICAgICAgICAgIHVwZGF0ZWQ9ZnVuY3Rvb2xzLldSQVBQRVJfVVBEQVRFUyk6CiAgICAgICAgZGVmIHdyYXBwZXIoZik6CiAgICAgICAgICAgIGYgPSBmdW5jdG9vbHMud3JhcHMod3JhcHBlZCwgYXNzaWduZWQsIHVwZGF0ZWQpKGYpCiAgICAgICAgICAgIGYuX193cmFwcGVkX18gPSB3cmFwcGVkCiAgICAgICAgICAgIHJldHVybiBmCiAgICAgICAgcmV0dXJuIHdyYXBwZXIKZWxzZToKICAgIHdyYXBzID0gZnVuY3Rvb2xzLndyYXBzCgoKZGVmIHdpdGhfbWV0YWNsYXNzKG1ldGEsICpiYXNlcyk6CiAgICAiIiJDcmVhdGUgYSBiYXNlIGNsYXNzIHdpdGggYSBtZXRhY2xhc3MuIiIiCiAgICAjIFRoaXMgcmVxdWlyZXMgYSBiaXQgb2YgZXhwbGFuYXRpb246IHRoZSBiYXNpYyBpZGVhIGlzIHRvIG1ha2UgYSBkdW1teQogICAgIyBtZXRhY2xhc3MgZm9yIG9uZSBsZXZlbCBvZiBjbGFzcyBpbnN0YW50aWF0aW9uIHRoYXQgcmVwbGFjZXMgaXRzZWxmIHdpdGgKICAgICMgdGhlIGFjdHVhbCBtZXRhY2xhc3MuCiAgICBjbGFzcyBtZXRhY2xhc3MobWV0YSk6CgogICAgICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgdGhpc19iYXNlcywgZCk6CiAgICAgICAgICAgIHJldHVybiBtZXRhKG5hbWUsIGJhc2VzLCBkKQogICAgcmV0dXJuIHR5cGUuX19uZXdfXyhtZXRhY2xhc3MsICd0ZW1wb3JhcnlfY2xhc3MnLCAoKSwge30pCgoKZGVmIGFkZF9tZXRhY2xhc3MobWV0YWNsYXNzKToKICAgICIiIkNsYXNzIGRlY29yYXRvciBmb3IgY3JlYXRpbmcgYSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLiIiIgogICAgZGVmIHdyYXBwZXIoY2xzKToKICAgICAgICBvcmlnX3ZhcnMgPSBjbHMuX19kaWN0X18uY29weSgpCiAgICAgICAgc2xvdHMgPSBvcmlnX3ZhcnMuZ2V0KCdfX3Nsb3RzX18nKQogICAgICAgIGlmIHNsb3RzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNsb3RzLCBzdHIpOgogICAgICAgICAgICAgICAgc2xvdHMgPSBbc2xvdHNdCiAgICAgICAgICAgIGZvciBzbG90c192YXIgaW4gc2xvdHM6CiAgICAgICAgICAgICAgICBvcmlnX3ZhcnMucG9wKHNsb3RzX3ZhcikKICAgICAgICBvcmlnX3ZhcnMucG9wKCdfX2RpY3RfXycsIE5vbmUpCiAgICAgICAgb3JpZ192YXJzLnBvcCgnX193ZWFrcmVmX18nLCBOb25lKQogICAgICAgIHJldHVybiBtZXRhY2xhc3MoY2xzLl9fbmFtZV9fLCBjbHMuX19iYXNlc19fLCBvcmlnX3ZhcnMpCiAgICByZXR1cm4gd3JhcHBlcgoKCmRlZiBweXRob25fMl91bmljb2RlX2NvbXBhdGlibGUoa2xhc3MpOgogICAgIiIiCiAgICBBIGRlY29yYXRvciB0aGF0IGRlZmluZXMgX191bmljb2RlX18gYW5kIF9fc3RyX18gbWV0aG9kcyB1bmRlciBQeXRob24gMi4KICAgIFVuZGVyIFB5dGhvbiAzIGl0IGRvZXMgbm90aGluZy4KCiAgICBUbyBzdXBwb3J0IFB5dGhvbiAyIGFuZCAzIHdpdGggYSBzaW5nbGUgY29kZSBiYXNlLCBkZWZpbmUgYSBfX3N0cl9fIG1ldGhvZAogICAgcmV0dXJuaW5nIHRleHQgYW5kIGFwcGx5IHRoaXMgZGVjb3JhdG9yIHRvIHRoZSBjbGFzcy4KICAgICIiIgogICAgaWYgUFkyOgogICAgICAgIGlmICdfX3N0cl9fJyBub3QgaW4ga2xhc3MuX19kaWN0X186CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkBweXRob25fMl91bmljb2RlX2NvbXBhdGlibGUgY2Fubm90IGJlIGFwcGxpZWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byAlcyBiZWNhdXNlIGl0IGRvZXNuJ3QgZGVmaW5lIF9fc3RyX18oKS4iICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbGFzcy5fX25hbWVfXykKICAgICAgICBrbGFzcy5fX3VuaWNvZGVfXyA9IGtsYXNzLl9fc3RyX18KICAgICAgICBrbGFzcy5fX3N0cl9fID0gbGFtYmRhIHNlbGY6IHNlbGYuX191bmljb2RlX18oKS5lbmNvZGUoJ3V0Zi04JykKICAgIHJldHVybiBrbGFzcwoKCiMgQ29tcGxldGUgdGhlIG1vdmVzIGltcGxlbWVudGF0aW9uLgojIFRoaXMgY29kZSBpcyBhdCB0aGUgZW5kIG9mIHRoaXMgbW9kdWxlIHRvIHNwZWVkIHVwIG1vZHVsZSBsb2FkaW5nLgojIFR1cm4gdGhpcyBtb2R1bGUgaW50byBhIHBhY2thZ2UuCl9fcGF0aF9fID0gW10gICMgcmVxdWlyZWQgZm9yIFBFUCAzMDIgYW5kIFBFUCA0NTEKX19wYWNrYWdlX18gPSBfX25hbWVfXyAgIyBzZWUgUEVQIDM2NiBAUmVzZXJ2ZWRBc3NpZ25tZW50CmlmIGdsb2JhbHMoKS5nZXQoIl9fc3BlY19fIikgaXMgbm90IE5vbmU6CiAgICBfX3NwZWNfXy5zdWJtb2R1bGVfc2VhcmNoX2xvY2F0aW9ucyA9IFtdICAjIFBFUCA0NTEgQFVuZGVmaW5lZFZhcmlhYmxlCiMgUmVtb3ZlIG90aGVyIHNpeCBtZXRhIHBhdGggaW1wb3J0ZXJzLCBzaW5jZSB0aGV5IGNhdXNlIHByb2JsZW1zLiBUaGlzIGNhbgojIGhhcHBlbiBpZiBzaXggaXMgcmVtb3ZlZCBmcm9tIHN5cy5tb2R1bGVzIGFuZCB0aGVuIHJlbG9hZGVkLiAoU2V0dXB0b29scyBkb2VzCiMgdGhpcyBmb3Igc29tZSByZWFzb24uKQppZiBzeXMubWV0YV9wYXRoOgogICAgZm9yIGksIGltcG9ydGVyIGluIGVudW1lcmF0ZShzeXMubWV0YV9wYXRoKToKICAgICAgICAjIEhlcmUncyBzb21lIHJlYWwgbmFzdGluZXNzOiBBbm90aGVyICJpbnN0YW5jZSIgb2YgdGhlIHNpeCBtb2R1bGUgbWlnaHQKICAgICAgICAjIGJlIGZsb2F0aW5nIGFyb3VuZC4gVGhlcmVmb3JlLCB3ZSBjYW4ndCB1c2UgaXNpbnN0YW5jZSgpIHRvIGNoZWNrIGZvcgogICAgICAgICMgdGhlIHNpeCBtZXRhIHBhdGggaW1wb3J0ZXIsIHNpbmNlIHRoZSBvdGhlciBzaXggaW5zdGFuY2Ugd2lsbCBoYXZlCiAgICAgICAgIyBpbnNlcnRlZCBhbiBpbXBvcnRlciB3aXRoIGRpZmZlcmVudCBjbGFzcy4KICAgICAgICBpZiAodHlwZShpbXBvcnRlcikuX19uYW1lX18gPT0gIl9TaXhNZXRhUGF0aEltcG9ydGVyIiBhbmQKICAgICAgICAgICAgICAgIGltcG9ydGVyLm5hbWUgPT0gX19uYW1lX18pOgogICAgICAgICAgICBkZWwgc3lzLm1ldGFfcGF0aFtpXQogICAgICAgICAgICBicmVhawogICAgZGVsIGksIGltcG9ydGVyCiMgRmluYWxseSwgYWRkIHRoZSBpbXBvcnRlciB0byB0aGUgbWV0YSBwYXRoIGltcG9ydCBob29rLgpzeXMubWV0YV9wYXRoLmFwcGVuZChfaW1wb3J0ZXIpClBLAwQUAAAAAAAAACEA+23K5bACAACwAgAASwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL3NzbF9tYXRjaF9ob3N0bmFtZS9fX2luaXRfXy5weWltcG9ydCBzeXMKCnRyeToKICAgICMgT3VyIG1hdGNoX2hvc3RuYW1lIGZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFzIDMuNSdzLCBzbyB3ZSBvbmx5IHdhbnQgdG8KICAgICMgaW1wb3J0IHRoZSBtYXRjaF9ob3N0bmFtZSBmdW5jdGlvbiBpZiBpdCdzIGF0IGxlYXN0IHRoYXQgZ29vZC4KICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgNSk6CiAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkZhbGxiYWNrIHRvIHZlbmRvcmVkIGNvZGUiKQoKICAgIGZyb20gc3NsIGltcG9ydCBDZXJ0aWZpY2F0ZUVycm9yLCBtYXRjaF9ob3N0bmFtZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICB0cnk6CiAgICAgICAgIyBCYWNrcG9ydCBvZiB0aGUgZnVuY3Rpb24gZnJvbSBhIHB5cGkgbW9kdWxlCiAgICAgICAgZnJvbSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIGltcG9ydCBDZXJ0aWZpY2F0ZUVycm9yLCBtYXRjaF9ob3N0bmFtZQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICMgT3VyIHZlbmRvcmVkIGNvcHkKICAgICAgICBmcm9tIC5faW1wbGVtZW50YXRpb24gaW1wb3J0IENlcnRpZmljYXRlRXJyb3IsIG1hdGNoX2hvc3RuYW1lCgojIE5vdCBuZWVkZWQsIGJ1dCBkb2N1bWVudGluZyB3aGF0IHdlIHByb3ZpZGUuCl9fYWxsX18gPSAoJ0NlcnRpZmljYXRlRXJyb3InLCAnbWF0Y2hfaG9zdG5hbWUnKQpQSwMEFAAAAAAAAAAhALU6jytGFgAARhYAAFIAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9zc2xfbWF0Y2hfaG9zdG5hbWUvX2ltcGxlbWVudGF0aW9uLnB5IiIiVGhlIG1hdGNoX2hvc3RuYW1lKCkgZnVuY3Rpb24gZnJvbSBQeXRob24gMy4zLjMsIGVzc2VudGlhbCB3aGVuIHVzaW5nIFNTTC4iIiIKCiMgTm90ZTogVGhpcyBmaWxlIGlzIHVuZGVyIHRoZSBQU0YgbGljZW5zZSBhcyB0aGUgY29kZSBjb21lcyBmcm9tIHRoZSBweXRob24KIyBzdGRsaWIuICAgaHR0cDovL2RvY3MucHl0aG9uLm9yZy8zL2xpY2Vuc2UuaHRtbAoKaW1wb3J0IHJlCmltcG9ydCBzeXMKCiMgaXBhZGRyZXNzIGhhcyBiZWVuIGJhY2twb3J0ZWQgdG8gMi42KyBpbiBweXBpLiAgSWYgaXQgaXMgaW5zdGFsbGVkIG9uIHRoZQojIHN5c3RlbSwgdXNlIGl0IHRvIGhhbmRsZSBJUEFkZHJlc3MgU2VydmVyQWx0bmFtZXMgKHRoaXMgd2FzIGFkZGVkIGluCiMgcHl0aG9uLTMuNSkgb3RoZXJ3aXNlIG9ubHkgZG8gRE5TIG1hdGNoaW5nLiAgVGhpcyBhbGxvd3MKIyBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIHRvIGNvbnRpbnVlIHRvIGJlIHVzZWQgYWxsIHRoZSB3YXkgYmFjayB0bwojIHB5dGhvbi0yLjQuCnRyeToKICAgIGltcG9ydCBpcGFkZHJlc3MKZXhjZXB0IEltcG9ydEVycm9yOgogICAgaXBhZGRyZXNzID0gTm9uZQoKX192ZXJzaW9uX18gPSAnMy41LjAuMScKCgpjbGFzcyBDZXJ0aWZpY2F0ZUVycm9yKFZhbHVlRXJyb3IpOgogICAgcGFzcwoKCmRlZiBfZG5zbmFtZV9tYXRjaChkbiwgaG9zdG5hbWUsIG1heF93aWxkY2FyZHM9MSk6CiAgICAiIiJNYXRjaGluZyBhY2NvcmRpbmcgdG8gUkZDIDYxMjUsIHNlY3Rpb24gNi40LjMKCiAgICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MTI1I3NlY3Rpb24tNi40LjMKICAgICIiIgogICAgcGF0cyA9IFtdCiAgICBpZiBub3QgZG46CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgIyBQb3J0ZWQgZnJvbSBweXRob24zLXN5bnRheDoKICAgICMgbGVmdG1vc3QsICpyZW1haW5kZXIgPSBkbi5zcGxpdChyJy4nKQogICAgcGFydHMgPSBkbi5zcGxpdChyJy4nKQogICAgbGVmdG1vc3QgPSBwYXJ0c1swXQogICAgcmVtYWluZGVyID0gcGFydHNbMTpdCgogICAgd2lsZGNhcmRzID0gbGVmdG1vc3QuY291bnQoJyonKQogICAgaWYgd2lsZGNhcmRzID4gbWF4X3dpbGRjYXJkczoKICAgICAgICAjIElzc3VlICMxNzk4MDogYXZvaWQgZGVuaWFscyBvZiBzZXJ2aWNlIGJ5IHJlZnVzaW5nIG1vcmUKICAgICAgICAjIHRoYW4gb25lIHdpbGRjYXJkIHBlciBmcmFnbWVudC4gIEEgc3VydmV5IG9mIGVzdGFibGlzaGVkCiAgICAgICAgIyBwb2xpY3kgYW1vbmcgU1NMIGltcGxlbWVudGF0aW9ucyBzaG93ZWQgaXQgdG8gYmUgYQogICAgICAgICMgcmVhc29uYWJsZSBjaG9pY2UuCiAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigKICAgICAgICAgICAgInRvbyBtYW55IHdpbGRjYXJkcyBpbiBjZXJ0aWZpY2F0ZSBETlMgbmFtZTogIiArIHJlcHIoZG4pKQoKICAgICMgc3BlZWQgdXAgY29tbW9uIGNhc2Ugdy9vIHdpbGRjYXJkcwogICAgaWYgbm90IHdpbGRjYXJkczoKICAgICAgICByZXR1cm4gZG4ubG93ZXIoKSA9PSBob3N0bmFtZS5sb3dlcigpCgogICAgIyBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMywgc3ViaXRlbSAxLgogICAgIyBUaGUgY2xpZW50IFNIT1VMRCBOT1QgYXR0ZW1wdCB0byBtYXRjaCBhIHByZXNlbnRlZCBpZGVudGlmaWVyIGluIHdoaWNoCiAgICAjIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgY29tcHJpc2VzIGEgbGFiZWwgb3RoZXIgdGhhbiB0aGUgbGVmdC1tb3N0IGxhYmVsLgogICAgaWYgbGVmdG1vc3QgPT0gJyonOgogICAgICAgICMgV2hlbiAnKicgaXMgYSBmcmFnbWVudCBieSBpdHNlbGYsIGl0IG1hdGNoZXMgYSBub24tZW1wdHkgZG90bGVzcwogICAgICAgICMgZnJhZ21lbnQuCiAgICAgICAgcGF0cy5hcHBlbmQoJ1teLl0rJykKICAgIGVsaWYgbGVmdG1vc3Quc3RhcnRzd2l0aCgneG4tLScpIG9yIGhvc3RuYW1lLnN0YXJ0c3dpdGgoJ3huLS0nKToKICAgICAgICAjIFJGQyA2MTI1LCBzZWN0aW9uIDYuNC4zLCBzdWJpdGVtIDMuCiAgICAgICAgIyBUaGUgY2xpZW50IFNIT1VMRCBOT1QgYXR0ZW1wdCB0byBtYXRjaCBhIHByZXNlbnRlZCBpZGVudGlmaWVyCiAgICAgICAgIyB3aGVyZSB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyIGlzIGVtYmVkZGVkIHdpdGhpbiBhbiBBLWxhYmVsIG9yCiAgICAgICAgIyBVLWxhYmVsIG9mIGFuIGludGVybmF0aW9uYWxpemVkIGRvbWFpbiBuYW1lLgogICAgICAgIHBhdHMuYXBwZW5kKHJlLmVzY2FwZShsZWZ0bW9zdCkpCiAgICBlbHNlOgogICAgICAgICMgT3RoZXJ3aXNlLCAnKicgbWF0Y2hlcyBhbnkgZG90bGVzcyBzdHJpbmcsIGUuZy4gd3d3KgogICAgICAgIHBhdHMuYXBwZW5kKHJlLmVzY2FwZShsZWZ0bW9zdCkucmVwbGFjZShyJ1wqJywgJ1teLl0qJykpCgogICAgIyBhZGQgdGhlIHJlbWFpbmluZyBmcmFnbWVudHMsIGlnbm9yZSBhbnkgd2lsZGNhcmRzCiAgICBmb3IgZnJhZyBpbiByZW1haW5kZXI6CiAgICAgICAgcGF0cy5hcHBlbmQocmUuZXNjYXBlKGZyYWcpKQoKICAgIHBhdCA9IHJlLmNvbXBpbGUocidcQScgKyByJ1wuJy5qb2luKHBhdHMpICsgcidcWicsIHJlLklHTk9SRUNBU0UpCiAgICByZXR1cm4gcGF0Lm1hdGNoKGhvc3RuYW1lKQoKCmRlZiBfdG9fdW5pY29kZShvYmopOgogICAgaWYgaXNpbnN0YW5jZShvYmosIHN0cikgYW5kIHN5cy52ZXJzaW9uX2luZm8gPCAoMywpOgogICAgICAgIG9iaiA9IHVuaWNvZGUob2JqLCBlbmNvZGluZz0nYXNjaWknLCBlcnJvcnM9J3N0cmljdCcpCiAgICByZXR1cm4gb2JqCgpkZWYgX2lwYWRkcmVzc19tYXRjaChpcG5hbWUsIGhvc3RfaXApOgogICAgIiIiRXhhY3QgbWF0Y2hpbmcgb2YgSVAgYWRkcmVzc2VzLgoKICAgIFJGQyA2MTI1IGV4cGxpY2l0bHkgZG9lc24ndCBkZWZpbmUgYW4gYWxnb3JpdGhtIGZvciB0aGlzCiAgICAoc2VjdGlvbiAxLjcuMiAtICJPdXQgb2YgU2NvcGUiKS4KICAgICIiIgogICAgIyBPcGVuU1NMIG1heSBhZGQgYSB0cmFpbGluZyBuZXdsaW5lIHRvIGEgc3ViamVjdEFsdE5hbWUncyBJUCBhZGRyZXNzCiAgICAjIERpdmVyZ2VuY2UgZnJvbSB1cHN0cmVhbTogaXBhZGRyZXNzIGNhbid0IGhhbmRsZSBieXRlIHN0cgogICAgaXAgPSBpcGFkZHJlc3MuaXBfYWRkcmVzcyhfdG9fdW5pY29kZShpcG5hbWUpLnJzdHJpcCgpKQogICAgcmV0dXJuIGlwID09IGhvc3RfaXAKCgpkZWYgbWF0Y2hfaG9zdG5hbWUoY2VydCwgaG9zdG5hbWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgKmNlcnQqIChpbiBkZWNvZGVkIGZvcm1hdCBhcyByZXR1cm5lZCBieQogICAgU1NMU29ja2V0LmdldHBlZXJjZXJ0KCkpIG1hdGNoZXMgdGhlICpob3N0bmFtZSouICBSRkMgMjgxOCBhbmQgUkZDIDYxMjUKICAgIHJ1bGVzIGFyZSBmb2xsb3dlZCwgYnV0IElQIGFkZHJlc3NlcyBhcmUgbm90IGFjY2VwdGVkIGZvciAqaG9zdG5hbWUqLgoKICAgIENlcnRpZmljYXRlRXJyb3IgaXMgcmFpc2VkIG9uIGZhaWx1cmUuIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbgogICAgcmV0dXJucyBub3RoaW5nLgogICAgIiIiCiAgICBpZiBub3QgY2VydDoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJlbXB0eSBvciBubyBjZXJ0aWZpY2F0ZSwgbWF0Y2hfaG9zdG5hbWUgbmVlZHMgYSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAiU1NMIHNvY2tldCBvciBTU0wgY29udGV4dCB3aXRoIGVpdGhlciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAiQ0VSVF9PUFRJT05BTCBvciBDRVJUX1JFUVVJUkVEIikKICAgIHRyeToKICAgICAgICAjIERpdmVyZ2VuY2UgZnJvbSB1cHN0cmVhbTogaXBhZGRyZXNzIGNhbid0IGhhbmRsZSBieXRlIHN0cgogICAgICAgIGhvc3RfaXAgPSBpcGFkZHJlc3MuaXBfYWRkcmVzcyhfdG9fdW5pY29kZShob3N0bmFtZSkpCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAjIE5vdCBhbiBJUCBhZGRyZXNzIChjb21tb24gY2FzZSkKICAgICAgICBob3N0X2lwID0gTm9uZQogICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKICAgICAgICAjIERpdmVyZ2VuY2UgZnJvbSB1cHN0cmVhbTogSGF2ZSB0byBkZWFsIHdpdGggaXBhZGRyZXNzIG5vdCB0YWtpbmcKICAgICAgICAjIGJ5dGUgc3RyaW5ncy4gIGFkZHJlc3NlcyBzaG91bGQgYmUgYWxsIGFzY2lpLCBzbyB3ZSBjb25zaWRlciBpdCBub3QKICAgICAgICAjIGFuIGlwYWRkcmVzcyBpbiB0aGlzIGNhc2UKICAgICAgICBob3N0X2lwID0gTm9uZQogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICMgRGl2ZXJnZW5jZSBmcm9tIHVwc3RyZWFtOiBNYWtlIGlwYWRkcmVzcyBsaWJyYXJ5IG9wdGlvbmFsCiAgICAgICAgaWYgaXBhZGRyZXNzIGlzIE5vbmU6CiAgICAgICAgICAgIGhvc3RfaXAgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UKICAgIGRuc25hbWVzID0gW10KICAgIHNhbiA9IGNlcnQuZ2V0KCdzdWJqZWN0QWx0TmFtZScsICgpKQogICAgZm9yIGtleSwgdmFsdWUgaW4gc2FuOgogICAgICAgIGlmIGtleSA9PSAnRE5TJzoKICAgICAgICAgICAgaWYgaG9zdF9pcCBpcyBOb25lIGFuZCBfZG5zbmFtZV9tYXRjaCh2YWx1ZSwgaG9zdG5hbWUpOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGRuc25hbWVzLmFwcGVuZCh2YWx1ZSkKICAgICAgICBlbGlmIGtleSA9PSAnSVAgQWRkcmVzcyc6CiAgICAgICAgICAgIGlmIGhvc3RfaXAgaXMgbm90IE5vbmUgYW5kIF9pcGFkZHJlc3NfbWF0Y2godmFsdWUsIGhvc3RfaXApOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGRuc25hbWVzLmFwcGVuZCh2YWx1ZSkKICAgIGlmIG5vdCBkbnNuYW1lczoKICAgICAgICAjIFRoZSBzdWJqZWN0IGlzIG9ubHkgY2hlY2tlZCB3aGVuIHRoZXJlIGlzIG5vIGROU05hbWUgZW50cnkKICAgICAgICAjIGluIHN1YmplY3RBbHROYW1lCiAgICAgICAgZm9yIHN1YiBpbiBjZXJ0LmdldCgnc3ViamVjdCcsICgpKToKICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc3ViOgogICAgICAgICAgICAgICAgIyBYWFggYWNjb3JkaW5nIHRvIFJGQyAyODE4LCB0aGUgbW9zdCBzcGVjaWZpYyBDb21tb24gTmFtZQogICAgICAgICAgICAgICAgIyBtdXN0IGJlIHVzZWQuCiAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ2NvbW1vbk5hbWUnOgogICAgICAgICAgICAgICAgICAgIGlmIF9kbnNuYW1lX21hdGNoKHZhbHVlLCBob3N0bmFtZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgICAgIGRuc25hbWVzLmFwcGVuZCh2YWx1ZSkKICAgIGlmIGxlbihkbnNuYW1lcykgPiAxOgogICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoImhvc3RuYW1lICVyICIKICAgICAgICAgICAgImRvZXNuJ3QgbWF0Y2ggZWl0aGVyIG9mICVzIgogICAgICAgICAgICAlIChob3N0bmFtZSwgJywgJy5qb2luKG1hcChyZXByLCBkbnNuYW1lcykpKSkKICAgIGVsaWYgbGVuKGRuc25hbWVzKSA9PSAxOgogICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoImhvc3RuYW1lICVyICIKICAgICAgICAgICAgImRvZXNuJ3QgbWF0Y2ggJXIiCiAgICAgICAgICAgICUgKGhvc3RuYW1lLCBkbnNuYW1lc1swXSkpCiAgICBlbHNlOgogICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoIm5vIGFwcHJvcHJpYXRlIGNvbW1vbk5hbWUgb3IgIgogICAgICAgICAgICAic3ViamVjdEFsdE5hbWUgZmllbGRzIHdlcmUgZm91bmQiKQpQSwMEFAAAAAAAAAAhAPCuGJLZPwAA2T8AADIAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wb29sbWFuYWdlci5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBsb2dnaW5nCgpmcm9tIC5fY29sbGVjdGlvbnMgaW1wb3J0IFJlY2VudGx5VXNlZENvbnRhaW5lcgpmcm9tIC5jb25uZWN0aW9ucG9vbCBpbXBvcnQgSFRUUENvbm5lY3Rpb25Qb29sLCBIVFRQU0Nvbm5lY3Rpb25Qb29sCmZyb20gLmNvbm5lY3Rpb25wb29sIGltcG9ydCBwb3J0X2J5X3NjaGVtZQpmcm9tIC5leGNlcHRpb25zIGltcG9ydCBMb2NhdGlvblZhbHVlRXJyb3IsIE1heFJldHJ5RXJyb3IsIFByb3h5U2NoZW1lVW5rbm93bgpmcm9tIC5wYWNrYWdlcy5zaXgubW92ZXMudXJsbGliLnBhcnNlIGltcG9ydCB1cmxqb2luCmZyb20gLnJlcXVlc3QgaW1wb3J0IFJlcXVlc3RNZXRob2RzCmZyb20gLnV0aWwudXJsIGltcG9ydCBwYXJzZV91cmwKZnJvbSAudXRpbC5yZXRyeSBpbXBvcnQgUmV0cnkKCgpfX2FsbF9fID0gWydQb29sTWFuYWdlcicsICdQcm94eU1hbmFnZXInLCAncHJveHlfZnJvbV91cmwnXQoKCmxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKU1NMX0tFWVdPUkRTID0gKCdrZXlfZmlsZScsICdjZXJ0X2ZpbGUnLCAnY2VydF9yZXFzJywgJ2NhX2NlcnRzJywKICAgICAgICAgICAgICAgICdzc2xfdmVyc2lvbicsICdjYV9jZXJ0X2RpcicsICdzc2xfY29udGV4dCcpCgojIEFsbCBrbm93biBrZXl3b3JkIGFyZ3VtZW50cyB0aGF0IGNvdWxkIGJlIHByb3ZpZGVkIHRvIHRoZSBwb29sIG1hbmFnZXIsIGl0cwojIHBvb2xzLCBvciB0aGUgdW5kZXJseWluZyBjb25uZWN0aW9ucy4gVGhpcyBpcyB1c2VkIHRvIGNvbnN0cnVjdCBhIHBvb2wga2V5Lgpfa2V5X2ZpZWxkcyA9ICgKICAgICdrZXlfc2NoZW1lJywgICMgc3RyCiAgICAna2V5X2hvc3QnLCAgIyBzdHIKICAgICdrZXlfcG9ydCcsICAjIGludAogICAgJ2tleV90aW1lb3V0JywgICMgaW50IG9yIGZsb2F0IG9yIFRpbWVvdXQKICAgICdrZXlfcmV0cmllcycsICAjIGludCBvciBSZXRyeQogICAgJ2tleV9zdHJpY3QnLCAgIyBib29sCiAgICAna2V5X2Jsb2NrJywgICMgYm9vbAogICAgJ2tleV9zb3VyY2VfYWRkcmVzcycsICAjIHN0cgogICAgJ2tleV9rZXlfZmlsZScsICAjIHN0cgogICAgJ2tleV9jZXJ0X2ZpbGUnLCAgIyBzdHIKICAgICdrZXlfY2VydF9yZXFzJywgICMgc3RyCiAgICAna2V5X2NhX2NlcnRzJywgICMgc3RyCiAgICAna2V5X3NzbF92ZXJzaW9uJywgICMgc3RyCiAgICAna2V5X2NhX2NlcnRfZGlyJywgICMgc3RyCiAgICAna2V5X3NzbF9jb250ZXh0JywgICMgaW5zdGFuY2Ugb2Ygc3NsLlNTTENvbnRleHQgb3IgdXJsbGliMy51dGlsLnNzbF8uU1NMQ29udGV4dAogICAgJ2tleV9tYXhzaXplJywgICMgaW50CiAgICAna2V5X2hlYWRlcnMnLCAgIyBkaWN0CiAgICAna2V5X19wcm94eScsICAjIHBhcnNlZCBwcm94eSB1cmwKICAgICdrZXlfX3Byb3h5X2hlYWRlcnMnLCAgIyBkaWN0CiAgICAna2V5X3NvY2tldF9vcHRpb25zJywgICMgbGlzdCBvZiAobGV2ZWwgKGludCksIG9wdG5hbWUgKGludCksIHZhbHVlIChpbnQgb3Igc3RyKSkgdHVwbGVzCiAgICAna2V5X19zb2Nrc19vcHRpb25zJywgICMgZGljdAogICAgJ2tleV9hc3NlcnRfaG9zdG5hbWUnLCAgIyBib29sIG9yIHN0cmluZwogICAgJ2tleV9hc3NlcnRfZmluZ2VycHJpbnQnLCAgIyBzdHIKKQoKIzogVGhlIG5hbWVkdHVwbGUgY2xhc3MgdXNlZCB0byBjb25zdHJ1Y3Qga2V5cyBmb3IgdGhlIGNvbm5lY3Rpb24gcG9vbC4KIzogQWxsIGN1c3RvbSBrZXkgc2NoZW1lcyBzaG91bGQgaW5jbHVkZSB0aGUgZmllbGRzIGluIHRoaXMga2V5IGF0IGEgbWluaW11bS4KUG9vbEtleSA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoJ1Bvb2xLZXknLCBfa2V5X2ZpZWxkcykKCgpkZWYgX2RlZmF1bHRfa2V5X25vcm1hbGl6ZXIoa2V5X2NsYXNzLCByZXF1ZXN0X2NvbnRleHQpOgogICAgIiIiCiAgICBDcmVhdGUgYSBwb29sIGtleSBvdXQgb2YgYSByZXF1ZXN0IGNvbnRleHQgZGljdGlvbmFyeS4KCiAgICBBY2NvcmRpbmcgdG8gUkZDIDM5ODYsIGJvdGggdGhlIHNjaGVtZSBhbmQgaG9zdCBhcmUgY2FzZS1pbnNlbnNpdGl2ZS4KICAgIFRoZXJlZm9yZSwgdGhpcyBmdW5jdGlvbiBub3JtYWxpemVzIGJvdGggYmVmb3JlIGNvbnN0cnVjdGluZyB0aGUgcG9vbAogICAga2V5IGZvciBhbiBIVFRQUyByZXF1ZXN0LiBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhpcyBiZWhhdmlvdXIsIHByb3ZpZGUKICAgIGFsdGVybmF0ZSBjYWxsYWJsZXMgdG8gYGBrZXlfZm5fYnlfc2NoZW1lYGAuCgogICAgOnBhcmFtIGtleV9jbGFzczoKICAgICAgICBUaGUgY2xhc3MgdG8gdXNlIHdoZW4gY29uc3RydWN0aW5nIHRoZSBrZXkuIFRoaXMgc2hvdWxkIGJlIGEgbmFtZWR0dXBsZQogICAgICAgIHdpdGggdGhlIGBgc2NoZW1lYGAgYW5kIGBgaG9zdGBgIGtleXMgYXQgYSBtaW5pbXVtLgogICAgOnR5cGUgIGtleV9jbGFzczogbmFtZWR0dXBsZQogICAgOnBhcmFtIHJlcXVlc3RfY29udGV4dDoKICAgICAgICBBIGRpY3Rpb25hcnktbGlrZSBvYmplY3QgdGhhdCBjb250YWluIHRoZSBjb250ZXh0IGZvciBhIHJlcXVlc3QuCiAgICA6dHlwZSAgcmVxdWVzdF9jb250ZXh0OiBkaWN0CgogICAgOnJldHVybjogQSBuYW1lZHR1cGxlIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBjb25uZWN0aW9uIHBvb2wga2V5LgogICAgOnJ0eXBlOiAgUG9vbEtleQogICAgIiIiCiAgICAjIFNpbmNlIHdlIG11dGF0ZSB0aGUgZGljdGlvbmFyeSwgbWFrZSBhIGNvcHkgZmlyc3QKICAgIGNvbnRleHQgPSByZXF1ZXN0X2NvbnRleHQuY29weSgpCiAgICBjb250ZXh0WydzY2hlbWUnXSA9IGNvbnRleHRbJ3NjaGVtZSddLmxvd2VyKCkKICAgIGNvbnRleHRbJ2hvc3QnXSA9IGNvbnRleHRbJ2hvc3QnXS5sb3dlcigpCgogICAgIyBUaGVzZSBhcmUgYm90aCBkaWN0aW9uYXJpZXMgYW5kIG5lZWQgdG8gYmUgdHJhbnNmb3JtZWQgaW50byBmcm96ZW5zZXRzCiAgICBmb3Iga2V5IGluICgnaGVhZGVycycsICdfcHJveHlfaGVhZGVycycsICdfc29ja3Nfb3B0aW9ucycpOgogICAgICAgIGlmIGtleSBpbiBjb250ZXh0IGFuZCBjb250ZXh0W2tleV0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNvbnRleHRba2V5XSA9IGZyb3plbnNldChjb250ZXh0W2tleV0uaXRlbXMoKSkKCiAgICAjIFRoZSBzb2NrZXRfb3B0aW9ucyBrZXkgbWF5IGJlIGEgbGlzdCBhbmQgbmVlZHMgdG8gYmUgdHJhbnNmb3JtZWQgaW50byBhCiAgICAjIHR1cGxlLgogICAgc29ja2V0X29wdHMgPSBjb250ZXh0LmdldCgnc29ja2V0X29wdGlvbnMnKQogICAgaWYgc29ja2V0X29wdHMgaXMgbm90IE5vbmU6CiAgICAgICAgY29udGV4dFsnc29ja2V0X29wdGlvbnMnXSA9IHR1cGxlKHNvY2tldF9vcHRzKQoKICAgICMgTWFwIHRoZSBrd2FyZ3MgdG8gdGhlIG5hbWVzIGluIHRoZSBuYW1lZHR1cGxlIC0gdGhpcyBpcyBuZWNlc3Nhcnkgc2luY2UKICAgICMgbmFtZWR0dXBsZXMgY2FuJ3QgaGF2ZSBmaWVsZHMgc3RhcnRpbmcgd2l0aCAnXycuCiAgICBmb3Iga2V5IGluIGxpc3QoY29udGV4dC5rZXlzKCkpOgogICAgICAgIGNvbnRleHRbJ2tleV8nICsga2V5XSA9IGNvbnRleHQucG9wKGtleSkKCiAgICAjIERlZmF1bHQgdG8gYGBOb25lYGAgZm9yIGtleXMgbWlzc2luZyBmcm9tIHRoZSBjb250ZXh0CiAgICBmb3IgZmllbGQgaW4ga2V5X2NsYXNzLl9maWVsZHM6CiAgICAgICAgaWYgZmllbGQgbm90IGluIGNvbnRleHQ6CiAgICAgICAgICAgIGNvbnRleHRbZmllbGRdID0gTm9uZQoKICAgIHJldHVybiBrZXlfY2xhc3MoKipjb250ZXh0KQoKCiM6IEEgZGljdGlvbmFyeSB0aGF0IG1hcHMgYSBzY2hlbWUgdG8gYSBjYWxsYWJsZSB0aGF0IGNyZWF0ZXMgYSBwb29sIGtleS4KIzogVGhpcyBjYW4gYmUgdXNlZCB0byBhbHRlciB0aGUgd2F5IHBvb2wga2V5cyBhcmUgY29uc3RydWN0ZWQsIGlmIGRlc2lyZWQuCiM6IEVhY2ggUG9vbE1hbmFnZXIgbWFrZXMgYSBjb3B5IG9mIHRoaXMgZGljdGlvbmFyeSBzbyB0aGV5IGNhbiBiZSBjb25maWd1cmVkCiM6IGdsb2JhbGx5IGhlcmUsIG9yIGluZGl2aWR1YWxseSBvbiB0aGUgaW5zdGFuY2UuCmtleV9mbl9ieV9zY2hlbWUgPSB7CiAgICAnaHR0cCc6IGZ1bmN0b29scy5wYXJ0aWFsKF9kZWZhdWx0X2tleV9ub3JtYWxpemVyLCBQb29sS2V5KSwKICAgICdodHRwcyc6IGZ1bmN0b29scy5wYXJ0aWFsKF9kZWZhdWx0X2tleV9ub3JtYWxpemVyLCBQb29sS2V5KSwKfQoKcG9vbF9jbGFzc2VzX2J5X3NjaGVtZSA9IHsKICAgICdodHRwJzogSFRUUENvbm5lY3Rpb25Qb29sLAogICAgJ2h0dHBzJzogSFRUUFNDb25uZWN0aW9uUG9vbCwKfQoKCmNsYXNzIFBvb2xNYW5hZ2VyKFJlcXVlc3RNZXRob2RzKToKICAgICIiIgogICAgQWxsb3dzIGZvciBhcmJpdHJhcnkgcmVxdWVzdHMgd2hpbGUgdHJhbnNwYXJlbnRseSBrZWVwaW5nIHRyYWNrIG9mCiAgICBuZWNlc3NhcnkgY29ubmVjdGlvbiBwb29scyBmb3IgeW91LgoKICAgIDpwYXJhbSBudW1fcG9vbHM6CiAgICAgICAgTnVtYmVyIG9mIGNvbm5lY3Rpb24gcG9vbHMgdG8gY2FjaGUgYmVmb3JlIGRpc2NhcmRpbmcgdGhlIGxlYXN0CiAgICAgICAgcmVjZW50bHkgdXNlZCBwb29sLgoKICAgIDpwYXJhbSBoZWFkZXJzOgogICAgICAgIEhlYWRlcnMgdG8gaW5jbHVkZSB3aXRoIGFsbCByZXF1ZXN0cywgdW5sZXNzIG90aGVyIGhlYWRlcnMgYXJlIGdpdmVuCiAgICAgICAgZXhwbGljaXRseS4KCiAgICA6cGFyYW0gXFwqKmNvbm5lY3Rpb25fcG9vbF9rdzoKICAgICAgICBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHVzZWQgdG8gY3JlYXRlIGZyZXNoCiAgICAgICAgOmNsYXNzOmB1cmxsaWIzLmNvbm5lY3Rpb25wb29sLkNvbm5lY3Rpb25Qb29sYCBpbnN0YW5jZXMuCgogICAgRXhhbXBsZTo6CgogICAgICAgID4+PiBtYW5hZ2VyID0gUG9vbE1hbmFnZXIobnVtX3Bvb2xzPTIpCiAgICAgICAgPj4+IHIgPSBtYW5hZ2VyLnJlcXVlc3QoJ0dFVCcsICdodHRwOi8vZ29vZ2xlLmNvbS8nKQogICAgICAgID4+PiByID0gbWFuYWdlci5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2dvb2dsZS5jb20vbWFpbCcpCiAgICAgICAgPj4+IHIgPSBtYW5hZ2VyLnJlcXVlc3QoJ0dFVCcsICdodHRwOi8veWFob28uY29tLycpCiAgICAgICAgPj4+IGxlbihtYW5hZ2VyLnBvb2xzKQogICAgICAgIDIKCiAgICAiIiIKCiAgICBwcm94eSA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbnVtX3Bvb2xzPTEwLCBoZWFkZXJzPU5vbmUsICoqY29ubmVjdGlvbl9wb29sX2t3KToKICAgICAgICBSZXF1ZXN0TWV0aG9kcy5fX2luaXRfXyhzZWxmLCBoZWFkZXJzKQogICAgICAgIHNlbGYuY29ubmVjdGlvbl9wb29sX2t3ID0gY29ubmVjdGlvbl9wb29sX2t3CiAgICAgICAgc2VsZi5wb29scyA9IFJlY2VudGx5VXNlZENvbnRhaW5lcihudW1fcG9vbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwb3NlX2Z1bmM9bGFtYmRhIHA6IHAuY2xvc2UoKSkKCiAgICAgICAgIyBMb2NhbGx5IHNldCB0aGUgcG9vbCBjbGFzc2VzIGFuZCBrZXlzIHNvIG90aGVyIFBvb2xNYW5hZ2VycyBjYW4KICAgICAgICAjIG92ZXJyaWRlIHRoZW0uCiAgICAgICAgc2VsZi5wb29sX2NsYXNzZXNfYnlfc2NoZW1lID0gcG9vbF9jbGFzc2VzX2J5X3NjaGVtZQogICAgICAgIHNlbGYua2V5X2ZuX2J5X3NjaGVtZSA9IGtleV9mbl9ieV9zY2hlbWUuY29weSgpCgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbCwgZXhjX3RiKToKICAgICAgICBzZWxmLmNsZWFyKCkKICAgICAgICAjIFJldHVybiBGYWxzZSB0byByZS1yYWlzZSBhbnkgcG90ZW50aWFsIGV4Y2VwdGlvbnMKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX25ld19wb29sKHNlbGYsIHNjaGVtZSwgaG9zdCwgcG9ydCwgcmVxdWVzdF9jb250ZXh0PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIENyZWF0ZSBhIG5ldyA6Y2xhc3M6YENvbm5lY3Rpb25Qb29sYCBiYXNlZCBvbiBob3N0LCBwb3J0LCBzY2hlbWUsIGFuZAogICAgICAgIGFueSBhZGRpdGlvbmFsIHBvb2wga2V5d29yZCBhcmd1bWVudHMuCgogICAgICAgIElmIGBgcmVxdWVzdF9jb250ZXh0YGAgaXMgcHJvdmlkZWQsIGl0IGlzIHByb3ZpZGVkIGFzIGtleXdvcmQgYXJndW1lbnRzCiAgICAgICAgdG8gdGhlIHBvb2wgY2xhc3MgdXNlZC4gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBhY3R1YWxseSBjcmVhdGUgdGhlCiAgICAgICAgY29ubmVjdGlvbiBwb29scyBoYW5kZWQgb3V0IGJ5IDptZXRoOmBjb25uZWN0aW9uX2Zyb21fdXJsYCBhbmQKICAgICAgICBjb21wYW5pb24gbWV0aG9kcy4gSXQgaXMgaW50ZW5kZWQgdG8gYmUgb3ZlcnJpZGRlbiBmb3IgY3VzdG9taXphdGlvbi4KICAgICAgICAiIiIKICAgICAgICBwb29sX2NscyA9IHNlbGYucG9vbF9jbGFzc2VzX2J5X3NjaGVtZVtzY2hlbWVdCiAgICAgICAgaWYgcmVxdWVzdF9jb250ZXh0IGlzIE5vbmU6CiAgICAgICAgICAgIHJlcXVlc3RfY29udGV4dCA9IHNlbGYuY29ubmVjdGlvbl9wb29sX2t3LmNvcHkoKQoKICAgICAgICAjIEFsdGhvdWdoIHRoZSBjb250ZXh0IGhhcyBldmVyeXRoaW5nIG5lY2Vzc2FyeSB0byBjcmVhdGUgdGhlIHBvb2wsCiAgICAgICAgIyB0aGlzIGZ1bmN0aW9uIGhhcyBoaXN0b3JpY2FsbHkgb25seSB1c2VkIHRoZSBzY2hlbWUsIGhvc3QsIGFuZCBwb3J0CiAgICAgICAgIyBpbiB0aGUgcG9zaXRpb25hbCBhcmdzLiBXaGVuIGFuIEFQSSBjaGFuZ2UgaXMgYWNjZXB0YWJsZSB0aGVzZSBjYW4KICAgICAgICAjIGJlIHJlbW92ZWQuCiAgICAgICAgZm9yIGtleSBpbiAoJ3NjaGVtZScsICdob3N0JywgJ3BvcnQnKToKICAgICAgICAgICAgcmVxdWVzdF9jb250ZXh0LnBvcChrZXksIE5vbmUpCgogICAgICAgIGlmIHNjaGVtZSA9PSAnaHR0cCc6CiAgICAgICAgICAgIGZvciBrdyBpbiBTU0xfS0VZV09SRFM6CiAgICAgICAgICAgICAgICByZXF1ZXN0X2NvbnRleHQucG9wKGt3LCBOb25lKQoKICAgICAgICByZXR1cm4gcG9vbF9jbHMoaG9zdCwgcG9ydCwgKipyZXF1ZXN0X2NvbnRleHQpCgogICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEVtcHR5IG91ciBzdG9yZSBvZiBwb29scyBhbmQgZGlyZWN0IHRoZW0gYWxsIHRvIGNsb3NlLgoKICAgICAgICBUaGlzIHdpbGwgbm90IGFmZmVjdCBpbi1mbGlnaHQgY29ubmVjdGlvbnMsIGJ1dCB0aGV5IHdpbGwgbm90IGJlCiAgICAgICAgcmUtdXNlZCBhZnRlciBjb21wbGV0aW9uLgogICAgICAgICIiIgogICAgICAgIHNlbGYucG9vbHMuY2xlYXIoKQoKICAgIGRlZiBjb25uZWN0aW9uX2Zyb21faG9zdChzZWxmLCBob3N0LCBwb3J0PU5vbmUsIHNjaGVtZT0naHR0cCcsIHBvb2xfa3dhcmdzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEdldCBhIDpjbGFzczpgQ29ubmVjdGlvblBvb2xgIGJhc2VkIG9uIHRoZSBob3N0LCBwb3J0LCBhbmQgc2NoZW1lLgoKICAgICAgICBJZiBgYHBvcnRgYCBpc24ndCBnaXZlbiwgaXQgd2lsbCBiZSBkZXJpdmVkIGZyb20gdGhlIGBgc2NoZW1lYGAgdXNpbmcKICAgICAgICBgYHVybGxpYjMuY29ubmVjdGlvbnBvb2wucG9ydF9ieV9zY2hlbWVgYC4gSWYgYGBwb29sX2t3YXJnc2BgIGlzCiAgICAgICAgcHJvdmlkZWQsIGl0IGlzIG1lcmdlZCB3aXRoIHRoZSBpbnN0YW5jZSdzIGBgY29ubmVjdGlvbl9wb29sX2t3YGAKICAgICAgICB2YXJpYWJsZSBhbmQgdXNlZCB0byBjcmVhdGUgdGhlIG5ldyBjb25uZWN0aW9uIHBvb2wsIGlmIG9uZSBpcwogICAgICAgIG5lZWRlZC4KICAgICAgICAiIiIKCiAgICAgICAgaWYgbm90IGhvc3Q6CiAgICAgICAgICAgIHJhaXNlIExvY2F0aW9uVmFsdWVFcnJvcigiTm8gaG9zdCBzcGVjaWZpZWQuIikKCiAgICAgICAgcmVxdWVzdF9jb250ZXh0ID0gc2VsZi5fbWVyZ2VfcG9vbF9rd2FyZ3MocG9vbF9rd2FyZ3MpCiAgICAgICAgcmVxdWVzdF9jb250ZXh0WydzY2hlbWUnXSA9IHNjaGVtZSBvciAnaHR0cCcKICAgICAgICBpZiBub3QgcG9ydDoKICAgICAgICAgICAgcG9ydCA9IHBvcnRfYnlfc2NoZW1lLmdldChyZXF1ZXN0X2NvbnRleHRbJ3NjaGVtZSddLmxvd2VyKCksIDgwKQogICAgICAgIHJlcXVlc3RfY29udGV4dFsncG9ydCddID0gcG9ydAogICAgICAgIHJlcXVlc3RfY29udGV4dFsnaG9zdCddID0gaG9zdAoKICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0aW9uX2Zyb21fY29udGV4dChyZXF1ZXN0X2NvbnRleHQpCgogICAgZGVmIGNvbm5lY3Rpb25fZnJvbV9jb250ZXh0KHNlbGYsIHJlcXVlc3RfY29udGV4dCk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IGEgOmNsYXNzOmBDb25uZWN0aW9uUG9vbGAgYmFzZWQgb24gdGhlIHJlcXVlc3QgY29udGV4dC4KCiAgICAgICAgYGByZXF1ZXN0X2NvbnRleHRgYCBtdXN0IGF0IGxlYXN0IGNvbnRhaW4gdGhlIGBgc2NoZW1lYGAga2V5IGFuZCBpdHMKICAgICAgICB2YWx1ZSBtdXN0IGJlIGEga2V5IGluIGBga2V5X2ZuX2J5X3NjaGVtZWBgIGluc3RhbmNlIHZhcmlhYmxlLgogICAgICAgICIiIgogICAgICAgIHNjaGVtZSA9IHJlcXVlc3RfY29udGV4dFsnc2NoZW1lJ10ubG93ZXIoKQogICAgICAgIHBvb2xfa2V5X2NvbnN0cnVjdG9yID0gc2VsZi5rZXlfZm5fYnlfc2NoZW1lW3NjaGVtZV0KICAgICAgICBwb29sX2tleSA9IHBvb2xfa2V5X2NvbnN0cnVjdG9yKHJlcXVlc3RfY29udGV4dCkKCiAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGlvbl9mcm9tX3Bvb2xfa2V5KHBvb2xfa2V5LCByZXF1ZXN0X2NvbnRleHQ9cmVxdWVzdF9jb250ZXh0KQoKICAgIGRlZiBjb25uZWN0aW9uX2Zyb21fcG9vbF9rZXkoc2VsZiwgcG9vbF9rZXksIHJlcXVlc3RfY29udGV4dD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBHZXQgYSA6Y2xhc3M6YENvbm5lY3Rpb25Qb29sYCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcG9vbCBrZXkuCgogICAgICAgIGBgcG9vbF9rZXlgYCBzaG91bGQgYmUgYSBuYW1lZHR1cGxlIHRoYXQgb25seSBjb250YWlucyBpbW11dGFibGUKICAgICAgICBvYmplY3RzLiBBdCBhIG1pbmltdW0gaXQgbXVzdCBoYXZlIHRoZSBgYHNjaGVtZWBgLCBgYGhvc3RgYCwgYW5kCiAgICAgICAgYGBwb3J0YGAgZmllbGRzLgogICAgICAgICIiIgogICAgICAgIHdpdGggc2VsZi5wb29scy5sb2NrOgogICAgICAgICAgICAjIElmIHRoZSBzY2hlbWUsIGhvc3QsIG9yIHBvcnQgZG9lc24ndCBtYXRjaCBleGlzdGluZyBvcGVuCiAgICAgICAgICAgICMgY29ubmVjdGlvbnMsIG9wZW4gYSBuZXcgQ29ubmVjdGlvblBvb2wuCiAgICAgICAgICAgIHBvb2wgPSBzZWxmLnBvb2xzLmdldChwb29sX2tleSkKICAgICAgICAgICAgaWYgcG9vbDoKICAgICAgICAgICAgICAgIHJldHVybiBwb29sCgogICAgICAgICAgICAjIE1ha2UgYSBmcmVzaCBDb25uZWN0aW9uUG9vbCBvZiB0aGUgZGVzaXJlZCB0eXBlCiAgICAgICAgICAgIHNjaGVtZSA9IHJlcXVlc3RfY29udGV4dFsnc2NoZW1lJ10KICAgICAgICAgICAgaG9zdCA9IHJlcXVlc3RfY29udGV4dFsnaG9zdCddCiAgICAgICAgICAgIHBvcnQgPSByZXF1ZXN0X2NvbnRleHRbJ3BvcnQnXQogICAgICAgICAgICBwb29sID0gc2VsZi5fbmV3X3Bvb2woc2NoZW1lLCBob3N0LCBwb3J0LCByZXF1ZXN0X2NvbnRleHQ9cmVxdWVzdF9jb250ZXh0KQogICAgICAgICAgICBzZWxmLnBvb2xzW3Bvb2xfa2V5XSA9IHBvb2wKCiAgICAgICAgcmV0dXJuIHBvb2wKCiAgICBkZWYgY29ubmVjdGlvbl9mcm9tX3VybChzZWxmLCB1cmwsIHBvb2xfa3dhcmdzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFNpbWlsYXIgdG8gOmZ1bmM6YHVybGxpYjMuY29ubmVjdGlvbnBvb2wuY29ubmVjdGlvbl9mcm9tX3VybGAuCgogICAgICAgIElmIGBgcG9vbF9rd2FyZ3NgYCBpcyBub3QgcHJvdmlkZWQgYW5kIGEgbmV3IHBvb2wgbmVlZHMgdG8gYmUKICAgICAgICBjb25zdHJ1Y3RlZCwgYGBzZWxmLmNvbm5lY3Rpb25fcG9vbF9rd2BgIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZQogICAgICAgIHRoZSA6Y2xhc3M6YHVybGxpYjMuY29ubmVjdGlvbnBvb2wuQ29ubmVjdGlvblBvb2xgLiBJZiBgYHBvb2xfa3dhcmdzYGAKICAgICAgICBpcyBwcm92aWRlZCwgaXQgaXMgdXNlZCBpbnN0ZWFkLiBOb3RlIHRoYXQgaWYgYSBuZXcgcG9vbCBkb2VzIG5vdAogICAgICAgIG5lZWQgdG8gYmUgY3JlYXRlZCBmb3IgdGhlIHJlcXVlc3QsIHRoZSBwcm92aWRlZCBgYHBvb2xfa3dhcmdzYGAgYXJlCiAgICAgICAgbm90IHVzZWQuCiAgICAgICAgIiIiCiAgICAgICAgdSA9IHBhcnNlX3VybCh1cmwpCiAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGlvbl9mcm9tX2hvc3QodS5ob3N0LCBwb3J0PXUucG9ydCwgc2NoZW1lPXUuc2NoZW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xfa3dhcmdzPXBvb2xfa3dhcmdzKQoKICAgIGRlZiBfbWVyZ2VfcG9vbF9rd2FyZ3Moc2VsZiwgb3ZlcnJpZGUpOgogICAgICAgICIiIgogICAgICAgIE1lcmdlIGEgZGljdGlvbmFyeSBvZiBvdmVycmlkZSB2YWx1ZXMgZm9yIHNlbGYuY29ubmVjdGlvbl9wb29sX2t3LgoKICAgICAgICBUaGlzIGRvZXMgbm90IG1vZGlmeSBzZWxmLmNvbm5lY3Rpb25fcG9vbF9rdyBhbmQgcmV0dXJucyBhIG5ldyBkaWN0LgogICAgICAgIEFueSBrZXlzIGluIHRoZSBvdmVycmlkZSBkaWN0aW9uYXJ5IHdpdGggYSB2YWx1ZSBvZiBgYE5vbmVgYCBhcmUKICAgICAgICByZW1vdmVkIGZyb20gdGhlIG1lcmdlZCBkaWN0aW9uYXJ5LgogICAgICAgICIiIgogICAgICAgIGJhc2VfcG9vbF9rd2FyZ3MgPSBzZWxmLmNvbm5lY3Rpb25fcG9vbF9rdy5jb3B5KCkKICAgICAgICBpZiBvdmVycmlkZToKICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gb3ZlcnJpZGUuaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBkZWwgYmFzZV9wb29sX2t3YXJnc1trZXldCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGJhc2VfcG9vbF9rd2FyZ3Nba2V5XSA9IHZhbHVlCiAgICAgICAgcmV0dXJuIGJhc2VfcG9vbF9rd2FyZ3MKCiAgICBkZWYgdXJsb3BlbihzZWxmLCBtZXRob2QsIHVybCwgcmVkaXJlY3Q9VHJ1ZSwgKiprdyk6CiAgICAgICAgIiIiCiAgICAgICAgU2FtZSBhcyA6bWV0aDpgdXJsbGliMy5jb25uZWN0aW9ucG9vbC5IVFRQQ29ubmVjdGlvblBvb2wudXJsb3BlbmAKICAgICAgICB3aXRoIGN1c3RvbSBjcm9zcy1ob3N0IHJlZGlyZWN0IGxvZ2ljIGFuZCBvbmx5IHNlbmRzIHRoZSByZXF1ZXN0LXVyaQogICAgICAgIHBvcnRpb24gb2YgdGhlIGBgdXJsYGAuCgogICAgICAgIFRoZSBnaXZlbiBgYHVybGBgIHBhcmFtZXRlciBtdXN0IGJlIGFic29sdXRlLCBzdWNoIHRoYXQgYW4gYXBwcm9wcmlhdGUKICAgICAgICA6Y2xhc3M6YHVybGxpYjMuY29ubmVjdGlvbnBvb2wuQ29ubmVjdGlvblBvb2xgIGNhbiBiZSBjaG9zZW4gZm9yIGl0LgogICAgICAgICIiIgogICAgICAgIHUgPSBwYXJzZV91cmwodXJsKQogICAgICAgIGNvbm4gPSBzZWxmLmNvbm5lY3Rpb25fZnJvbV9ob3N0KHUuaG9zdCwgcG9ydD11LnBvcnQsIHNjaGVtZT11LnNjaGVtZSkKCiAgICAgICAga3dbJ2Fzc2VydF9zYW1lX2hvc3QnXSA9IEZhbHNlCiAgICAgICAga3dbJ3JlZGlyZWN0J10gPSBGYWxzZQogICAgICAgIGlmICdoZWFkZXJzJyBub3QgaW4ga3c6CiAgICAgICAgICAgIGt3WydoZWFkZXJzJ10gPSBzZWxmLmhlYWRlcnMKCiAgICAgICAgaWYgc2VsZi5wcm94eSBpcyBub3QgTm9uZSBhbmQgdS5zY2hlbWUgPT0gImh0dHAiOgogICAgICAgICAgICByZXNwb25zZSA9IGNvbm4udXJsb3BlbihtZXRob2QsIHVybCwgKiprdykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXNwb25zZSA9IGNvbm4udXJsb3BlbihtZXRob2QsIHUucmVxdWVzdF91cmksICoqa3cpCgogICAgICAgIHJlZGlyZWN0X2xvY2F0aW9uID0gcmVkaXJlY3QgYW5kIHJlc3BvbnNlLmdldF9yZWRpcmVjdF9sb2NhdGlvbigpCiAgICAgICAgaWYgbm90IHJlZGlyZWN0X2xvY2F0aW9uOgogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UKCiAgICAgICAgIyBTdXBwb3J0IHJlbGF0aXZlIFVSTHMgZm9yIHJlZGlyZWN0aW5nLgogICAgICAgIHJlZGlyZWN0X2xvY2F0aW9uID0gdXJsam9pbih1cmwsIHJlZGlyZWN0X2xvY2F0aW9uKQoKICAgICAgICAjIFJGQyA3MjMxLCBTZWN0aW9uIDYuNC40CiAgICAgICAgaWYgcmVzcG9uc2Uuc3RhdHVzID09IDMwMzoKICAgICAgICAgICAgbWV0aG9kID0gJ0dFVCcKCiAgICAgICAgcmV0cmllcyA9IGt3LmdldCgncmV0cmllcycpCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocmV0cmllcywgUmV0cnkpOgogICAgICAgICAgICByZXRyaWVzID0gUmV0cnkuZnJvbV9pbnQocmV0cmllcywgcmVkaXJlY3Q9cmVkaXJlY3QpCgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0cmllcyA9IHJldHJpZXMuaW5jcmVtZW50KG1ldGhvZCwgdXJsLCByZXNwb25zZT1yZXNwb25zZSwgX3Bvb2w9Y29ubikKICAgICAgICBleGNlcHQgTWF4UmV0cnlFcnJvcjoKICAgICAgICAgICAgaWYgcmV0cmllcy5yYWlzZV9vbl9yZWRpcmVjdDoKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIHJldHVybiByZXNwb25zZQoKICAgICAgICBrd1sncmV0cmllcyddID0gcmV0cmllcwogICAgICAgIGt3WydyZWRpcmVjdCddID0gcmVkaXJlY3QKCiAgICAgICAgbG9nLmluZm8oIlJlZGlyZWN0aW5nICVzIC0+ICVzIiwgdXJsLCByZWRpcmVjdF9sb2NhdGlvbikKICAgICAgICByZXR1cm4gc2VsZi51cmxvcGVuKG1ldGhvZCwgcmVkaXJlY3RfbG9jYXRpb24sICoqa3cpCgoKY2xhc3MgUHJveHlNYW5hZ2VyKFBvb2xNYW5hZ2VyKToKICAgICIiIgogICAgQmVoYXZlcyBqdXN0IGxpa2UgOmNsYXNzOmBQb29sTWFuYWdlcmAsIGJ1dCBzZW5kcyBhbGwgcmVxdWVzdHMgdGhyb3VnaAogICAgdGhlIGRlZmluZWQgcHJveHksIHVzaW5nIHRoZSBDT05ORUNUIG1ldGhvZCBmb3IgSFRUUFMgVVJMcy4KCiAgICA6cGFyYW0gcHJveHlfdXJsOgogICAgICAgIFRoZSBVUkwgb2YgdGhlIHByb3h5IHRvIGJlIHVzZWQuCgogICAgOnBhcmFtIHByb3h5X2hlYWRlcnM6CiAgICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhbmluZyBoZWFkZXJzIHRoYXQgd2lsbCBiZSBzZW50IHRvIHRoZSBwcm94eS4gSW4gY2FzZQogICAgICAgIG9mIEhUVFAgdGhleSBhcmUgYmVpbmcgc2VudCB3aXRoIGVhY2ggcmVxdWVzdCwgd2hpbGUgaW4gdGhlCiAgICAgICAgSFRUUFMvQ09OTkVDVCBjYXNlIHRoZXkgYXJlIHNlbnQgb25seSBvbmNlLiBDb3VsZCBiZSB1c2VkIGZvciBwcm94eQogICAgICAgIGF1dGhlbnRpY2F0aW9uLgoKICAgIEV4YW1wbGU6CiAgICAgICAgPj4+IHByb3h5ID0gdXJsbGliMy5Qcm94eU1hbmFnZXIoJ2h0dHA6Ly9sb2NhbGhvc3Q6MzEyOC8nKQogICAgICAgID4+PiByMSA9IHByb3h5LnJlcXVlc3QoJ0dFVCcsICdodHRwOi8vZ29vZ2xlLmNvbS8nKQogICAgICAgID4+PiByMiA9IHByb3h5LnJlcXVlc3QoJ0dFVCcsICdodHRwOi8vaHR0cGJpbi5vcmcvJykKICAgICAgICA+Pj4gbGVuKHByb3h5LnBvb2xzKQogICAgICAgIDEKICAgICAgICA+Pj4gcjMgPSBwcm94eS5yZXF1ZXN0KCdHRVQnLCAnaHR0cHM6Ly9odHRwYmluLm9yZy8nKQogICAgICAgID4+PiByNCA9IHByb3h5LnJlcXVlc3QoJ0dFVCcsICdodHRwczovL3R3aXR0ZXIuY29tLycpCiAgICAgICAgPj4+IGxlbihwcm94eS5wb29scykKICAgICAgICAzCgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3h5X3VybCwgbnVtX3Bvb2xzPTEwLCBoZWFkZXJzPU5vbmUsCiAgICAgICAgICAgICAgICAgcHJveHlfaGVhZGVycz1Ob25lLCAqKmNvbm5lY3Rpb25fcG9vbF9rdyk6CgogICAgICAgIGlmIGlzaW5zdGFuY2UocHJveHlfdXJsLCBIVFRQQ29ubmVjdGlvblBvb2wpOgogICAgICAgICAgICBwcm94eV91cmwgPSAnJXM6Ly8lczolaScgJSAocHJveHlfdXJsLnNjaGVtZSwgcHJveHlfdXJsLmhvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV91cmwucG9ydCkKICAgICAgICBwcm94eSA9IHBhcnNlX3VybChwcm94eV91cmwpCiAgICAgICAgaWYgbm90IHByb3h5LnBvcnQ6CiAgICAgICAgICAgIHBvcnQgPSBwb3J0X2J5X3NjaGVtZS5nZXQocHJveHkuc2NoZW1lLCA4MCkKICAgICAgICAgICAgcHJveHkgPSBwcm94eS5fcmVwbGFjZShwb3J0PXBvcnQpCgogICAgICAgIGlmIHByb3h5LnNjaGVtZSBub3QgaW4gKCJodHRwIiwgImh0dHBzIik6CiAgICAgICAgICAgIHJhaXNlIFByb3h5U2NoZW1lVW5rbm93bihwcm94eS5zY2hlbWUpCgogICAgICAgIHNlbGYucHJveHkgPSBwcm94eQogICAgICAgIHNlbGYucHJveHlfaGVhZGVycyA9IHByb3h5X2hlYWRlcnMgb3Ige30KCiAgICAgICAgY29ubmVjdGlvbl9wb29sX2t3WydfcHJveHknXSA9IHNlbGYucHJveHkKICAgICAgICBjb25uZWN0aW9uX3Bvb2xfa3dbJ19wcm94eV9oZWFkZXJzJ10gPSBzZWxmLnByb3h5X2hlYWRlcnMKCiAgICAgICAgc3VwZXIoUHJveHlNYW5hZ2VyLCBzZWxmKS5fX2luaXRfXygKICAgICAgICAgICAgbnVtX3Bvb2xzLCBoZWFkZXJzLCAqKmNvbm5lY3Rpb25fcG9vbF9rdykKCiAgICBkZWYgY29ubmVjdGlvbl9mcm9tX2hvc3Qoc2VsZiwgaG9zdCwgcG9ydD1Ob25lLCBzY2hlbWU9J2h0dHAnLCBwb29sX2t3YXJncz1Ob25lKToKICAgICAgICBpZiBzY2hlbWUgPT0gImh0dHBzIjoKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFByb3h5TWFuYWdlciwgc2VsZikuY29ubmVjdGlvbl9mcm9tX2hvc3QoCiAgICAgICAgICAgICAgICBob3N0LCBwb3J0LCBzY2hlbWUsIHBvb2xfa3dhcmdzPXBvb2xfa3dhcmdzKQoKICAgICAgICByZXR1cm4gc3VwZXIoUHJveHlNYW5hZ2VyLCBzZWxmKS5jb25uZWN0aW9uX2Zyb21faG9zdCgKICAgICAgICAgICAgc2VsZi5wcm94eS5ob3N0LCBzZWxmLnByb3h5LnBvcnQsIHNlbGYucHJveHkuc2NoZW1lLCBwb29sX2t3YXJncz1wb29sX2t3YXJncykKCiAgICBkZWYgX3NldF9wcm94eV9oZWFkZXJzKHNlbGYsIHVybCwgaGVhZGVycz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBTZXRzIGhlYWRlcnMgbmVlZGVkIGJ5IHByb3hpZXM6IHNwZWNpZmljYWxseSwgdGhlIEFjY2VwdCBhbmQgSG9zdAogICAgICAgIGhlYWRlcnMuIE9ubHkgc2V0cyBoZWFkZXJzIG5vdCBwcm92aWRlZCBieSB0aGUgdXNlci4KICAgICAgICAiIiIKICAgICAgICBoZWFkZXJzXyA9IHsnQWNjZXB0JzogJyovKid9CgogICAgICAgIG5ldGxvYyA9IHBhcnNlX3VybCh1cmwpLm5ldGxvYwogICAgICAgIGlmIG5ldGxvYzoKICAgICAgICAgICAgaGVhZGVyc19bJ0hvc3QnXSA9IG5ldGxvYwoKICAgICAgICBpZiBoZWFkZXJzOgogICAgICAgICAgICBoZWFkZXJzXy51cGRhdGUoaGVhZGVycykKICAgICAgICByZXR1cm4gaGVhZGVyc18KCiAgICBkZWYgdXJsb3BlbihzZWxmLCBtZXRob2QsIHVybCwgcmVkaXJlY3Q9VHJ1ZSwgKiprdyk6CiAgICAgICAgIlNhbWUgYXMgSFRUUChTKUNvbm5lY3Rpb25Qb29sLnVybG9wZW4sIGBgdXJsYGAgbXVzdCBiZSBhYnNvbHV0ZS4iCiAgICAgICAgdSA9IHBhcnNlX3VybCh1cmwpCgogICAgICAgIGlmIHUuc2NoZW1lID09ICJodHRwIjoKICAgICAgICAgICAgIyBGb3IgcHJveGllZCBIVFRQUyByZXF1ZXN0cywgaHR0cGxpYiBzZXRzIHRoZSBuZWNlc3NhcnkgaGVhZGVycwogICAgICAgICAgICAjIG9uIHRoZSBDT05ORUNUIHRvIHRoZSBwcm94eS4gRm9yIEhUVFAsIHdlJ2xsIGRlZmluaXRlbHkKICAgICAgICAgICAgIyBuZWVkIHRvIHNldCAnSG9zdCcgYXQgdGhlIHZlcnkgbGVhc3QuCiAgICAgICAgICAgIGhlYWRlcnMgPSBrdy5nZXQoJ2hlYWRlcnMnLCBzZWxmLmhlYWRlcnMpCiAgICAgICAgICAgIGt3WydoZWFkZXJzJ10gPSBzZWxmLl9zZXRfcHJveHlfaGVhZGVycyh1cmwsIGhlYWRlcnMpCgogICAgICAgIHJldHVybiBzdXBlcihQcm94eU1hbmFnZXIsIHNlbGYpLnVybG9wZW4obWV0aG9kLCB1cmwsIHJlZGlyZWN0PXJlZGlyZWN0LCAqKmt3KQoKCmRlZiBwcm94eV9mcm9tX3VybCh1cmwsICoqa3cpOgogICAgcmV0dXJuIFByb3h5TWFuYWdlcihwcm94eV91cmw9dXJsLCAqKmt3KQpQSwMEFAAAAAAAAAAhAMox5MQ6FwAAOhcAAC4AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9yZXF1ZXN0LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gLmZpbGVwb3N0IGltcG9ydCBlbmNvZGVfbXVsdGlwYXJ0X2Zvcm1kYXRhCmZyb20gLnBhY2thZ2VzLnNpeC5tb3Zlcy51cmxsaWIucGFyc2UgaW1wb3J0IHVybGVuY29kZQoKCl9fYWxsX18gPSBbJ1JlcXVlc3RNZXRob2RzJ10KCgpjbGFzcyBSZXF1ZXN0TWV0aG9kcyhvYmplY3QpOgogICAgIiIiCiAgICBDb252ZW5pZW5jZSBtaXhpbiBmb3IgY2xhc3NlcyB3aG8gaW1wbGVtZW50IGEgOm1ldGg6YHVybG9wZW5gIG1ldGhvZCwgc3VjaAogICAgYXMgOmNsYXNzOmB+dXJsbGliMy5jb25uZWN0aW9ucG9vbC5IVFRQQ29ubmVjdGlvblBvb2xgIGFuZAogICAgOmNsYXNzOmB+dXJsbGliMy5wb29sbWFuYWdlci5Qb29sTWFuYWdlcmAuCgogICAgUHJvdmlkZXMgYmVoYXZpb3IgZm9yIG1ha2luZyBjb21tb24gdHlwZXMgb2YgSFRUUCByZXF1ZXN0IG1ldGhvZHMgYW5kCiAgICBkZWNpZGVzIHdoaWNoIHR5cGUgb2YgcmVxdWVzdCBmaWVsZCBlbmNvZGluZyB0byB1c2UuCgogICAgU3BlY2lmaWNhbGx5LAoKICAgIDptZXRoOmAucmVxdWVzdF9lbmNvZGVfdXJsYCBpcyBmb3Igc2VuZGluZyByZXF1ZXN0cyB3aG9zZSBmaWVsZHMgYXJlCiAgICBlbmNvZGVkIGluIHRoZSBVUkwgKHN1Y2ggYXMgR0VULCBIRUFELCBERUxFVEUpLgoKICAgIDptZXRoOmAucmVxdWVzdF9lbmNvZGVfYm9keWAgaXMgZm9yIHNlbmRpbmcgcmVxdWVzdHMgd2hvc2UgZmllbGRzIGFyZQogICAgZW5jb2RlZCBpbiB0aGUgKmJvZHkqIG9mIHRoZSByZXF1ZXN0IHVzaW5nIG11bHRpcGFydCBvciB3d3ctZm9ybS11cmxlbmNvZGVkCiAgICAoc3VjaCBhcyBmb3IgUE9TVCwgUFVULCBQQVRDSCkuCgogICAgOm1ldGg6YC5yZXF1ZXN0YCBpcyBmb3IgbWFraW5nIGFueSBraW5kIG9mIHJlcXVlc3QsIGl0IHdpbGwgbG9vayB1cCB0aGUKICAgIGFwcHJvcHJpYXRlIGVuY29kaW5nIGZvcm1hdCBhbmQgdXNlIG9uZSBvZiB0aGUgYWJvdmUgdHdvIG1ldGhvZHMgdG8gbWFrZQogICAgdGhlIHJlcXVlc3QuCgogICAgSW5pdGlhbGl6ZXIgcGFyYW1ldGVyczoKCiAgICA6cGFyYW0gaGVhZGVyczoKICAgICAgICBIZWFkZXJzIHRvIGluY2x1ZGUgd2l0aCBhbGwgcmVxdWVzdHMsIHVubGVzcyBvdGhlciBoZWFkZXJzIGFyZSBnaXZlbgogICAgICAgIGV4cGxpY2l0bHkuCiAgICAiIiIKCiAgICBfZW5jb2RlX3VybF9tZXRob2RzID0gc2V0KFsnREVMRVRFJywgJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnXSkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaGVhZGVycz1Ob25lKToKICAgICAgICBzZWxmLmhlYWRlcnMgPSBoZWFkZXJzIG9yIHt9CgogICAgZGVmIHVybG9wZW4oc2VsZiwgbWV0aG9kLCB1cmwsIGJvZHk9Tm9uZSwgaGVhZGVycz1Ob25lLAogICAgICAgICAgICAgICAgZW5jb2RlX211bHRpcGFydD1UcnVlLCBtdWx0aXBhcnRfYm91bmRhcnk9Tm9uZSwKICAgICAgICAgICAgICAgICoqa3cpOiAgIyBBYnN0cmFjdAogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkKCJDbGFzc2VzIGV4dGVuZGluZyBSZXF1ZXN0TWV0aG9kcyBtdXN0IGltcGxlbWVudCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZWlyIG93biBgYHVybG9wZW5gYCBtZXRob2QuIikKCiAgICBkZWYgcmVxdWVzdChzZWxmLCBtZXRob2QsIHVybCwgZmllbGRzPU5vbmUsIGhlYWRlcnM9Tm9uZSwgKip1cmxvcGVuX2t3KToKICAgICAgICAiIiIKICAgICAgICBNYWtlIGEgcmVxdWVzdCB1c2luZyA6bWV0aDpgdXJsb3BlbmAgd2l0aCB0aGUgYXBwcm9wcmlhdGUgZW5jb2Rpbmcgb2YKICAgICAgICBgYGZpZWxkc2BgIGJhc2VkIG9uIHRoZSBgYG1ldGhvZGBgIHVzZWQuCgogICAgICAgIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCByZXF1aXJlcyB0aGUgbGVhc3QgYW1vdW50IG9mIG1hbnVhbAogICAgICAgIGVmZm9ydC4gSXQgY2FuIGJlIHVzZWQgaW4gbW9zdCBzaXR1YXRpb25zLCB3aGlsZSBzdGlsbCBoYXZpbmcgdGhlCiAgICAgICAgb3B0aW9uIHRvIGRyb3AgZG93biB0byBtb3JlIHNwZWNpZmljIG1ldGhvZHMgd2hlbiBuZWNlc3NhcnksIHN1Y2ggYXMKICAgICAgICA6bWV0aDpgcmVxdWVzdF9lbmNvZGVfdXJsYCwgOm1ldGg6YHJlcXVlc3RfZW5jb2RlX2JvZHlgLAogICAgICAgIG9yIGV2ZW4gdGhlIGxvd2VzdCBsZXZlbCA6bWV0aDpgdXJsb3BlbmAuCiAgICAgICAgIiIiCiAgICAgICAgbWV0aG9kID0gbWV0aG9kLnVwcGVyKCkKCiAgICAgICAgaWYgbWV0aG9kIGluIHNlbGYuX2VuY29kZV91cmxfbWV0aG9kczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdF9lbmNvZGVfdXJsKG1ldGhvZCwgdXJsLCBmaWVsZHM9ZmllbGRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz1oZWFkZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKip1cmxvcGVuX2t3KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RfZW5jb2RlX2JvZHkobWV0aG9kLCB1cmwsIGZpZWxkcz1maWVsZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz1oZWFkZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqdXJsb3Blbl9rdykKCiAgICBkZWYgcmVxdWVzdF9lbmNvZGVfdXJsKHNlbGYsIG1ldGhvZCwgdXJsLCBmaWVsZHM9Tm9uZSwgaGVhZGVycz1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAqKnVybG9wZW5fa3cpOgogICAgICAgICIiIgogICAgICAgIE1ha2UgYSByZXF1ZXN0IHVzaW5nIDptZXRoOmB1cmxvcGVuYCB3aXRoIHRoZSBgYGZpZWxkc2BgIGVuY29kZWQgaW4KICAgICAgICB0aGUgdXJsLiBUaGlzIGlzIHVzZWZ1bCBmb3IgcmVxdWVzdCBtZXRob2RzIGxpa2UgR0VULCBIRUFELCBERUxFVEUsIGV0Yy4KICAgICAgICAiIiIKICAgICAgICBpZiBoZWFkZXJzIGlzIE5vbmU6CiAgICAgICAgICAgIGhlYWRlcnMgPSBzZWxmLmhlYWRlcnMKCiAgICAgICAgZXh0cmFfa3cgPSB7J2hlYWRlcnMnOiBoZWFkZXJzfQogICAgICAgIGV4dHJhX2t3LnVwZGF0ZSh1cmxvcGVuX2t3KQoKICAgICAgICBpZiBmaWVsZHM6CiAgICAgICAgICAgIHVybCArPSAnPycgKyB1cmxlbmNvZGUoZmllbGRzKQoKICAgICAgICByZXR1cm4gc2VsZi51cmxvcGVuKG1ldGhvZCwgdXJsLCAqKmV4dHJhX2t3KQoKICAgIGRlZiByZXF1ZXN0X2VuY29kZV9ib2R5KHNlbGYsIG1ldGhvZCwgdXJsLCBmaWVsZHM9Tm9uZSwgaGVhZGVycz1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlX211bHRpcGFydD1UcnVlLCBtdWx0aXBhcnRfYm91bmRhcnk9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqdXJsb3Blbl9rdyk6CiAgICAgICAgIiIiCiAgICAgICAgTWFrZSBhIHJlcXVlc3QgdXNpbmcgOm1ldGg6YHVybG9wZW5gIHdpdGggdGhlIGBgZmllbGRzYGAgZW5jb2RlZCBpbgogICAgICAgIHRoZSBib2R5LiBUaGlzIGlzIHVzZWZ1bCBmb3IgcmVxdWVzdCBtZXRob2RzIGxpa2UgUE9TVCwgUFVULCBQQVRDSCwgZXRjLgoKICAgICAgICBXaGVuIGBgZW5jb2RlX211bHRpcGFydD1UcnVlYGAgKGRlZmF1bHQpLCB0aGVuCiAgICAgICAgOm1ldGg6YHVybGxpYjMuZmlsZXBvc3QuZW5jb2RlX211bHRpcGFydF9mb3JtZGF0YWAgaXMgdXNlZCB0byBlbmNvZGUKICAgICAgICB0aGUgcGF5bG9hZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb250ZW50IHR5cGUuIE90aGVyd2lzZQogICAgICAgIDptZXRoOmB1cmxsaWIudXJsZW5jb2RlYCBpcyB1c2VkIHdpdGggdGhlCiAgICAgICAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgY29udGVudCB0eXBlLgoKICAgICAgICBNdWx0aXBhcnQgZW5jb2RpbmcgbXVzdCBiZSB1c2VkIHdoZW4gcG9zdGluZyBmaWxlcywgYW5kIGl0J3MgcmVhc29uYWJseQogICAgICAgIHNhZmUgdG8gdXNlIGl0IGluIG90aGVyIHRpbWVzIHRvby4gSG93ZXZlciwgaXQgbWF5IGJyZWFrIHJlcXVlc3QKICAgICAgICBzaWduaW5nLCBzdWNoIGFzIHdpdGggT0F1dGguCgogICAgICAgIFN1cHBvcnRzIGFuIG9wdGlvbmFsIGBgZmllbGRzYGAgcGFyYW1ldGVyIG9mIGtleS92YWx1ZSBzdHJpbmdzIEFORAogICAgICAgIGtleS9maWxldHVwbGUuIEEgZmlsZXR1cGxlIGlzIGEgKGZpbGVuYW1lLCBkYXRhLCBNSU1FIHR5cGUpIHR1cGxlIHdoZXJlCiAgICAgICAgdGhlIE1JTUUgdHlwZSBpcyBvcHRpb25hbC4gRm9yIGV4YW1wbGU6OgoKICAgICAgICAgICAgZmllbGRzID0gewogICAgICAgICAgICAgICAgJ2Zvbyc6ICdiYXInLAogICAgICAgICAgICAgICAgJ2Zha2VmaWxlJzogKCdmb29maWxlLnR4dCcsICdjb250ZW50cyBvZiBmb29maWxlJyksCiAgICAgICAgICAgICAgICAncmVhbGZpbGUnOiAoJ2JhcmZpbGUudHh0Jywgb3BlbigncmVhbGZpbGUnKS5yZWFkKCkpLAogICAgICAgICAgICAgICAgJ3R5cGVkZmlsZSc6ICgnYmF6ZmlsZS5iaW4nLCBvcGVuKCdiYXpmaWxlJykucmVhZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1hZ2UvanBlZycpLAogICAgICAgICAgICAgICAgJ25vbmFtZWZpbGUnOiAnY29udGVudHMgb2Ygbm9uYW1lZmlsZSBmaWVsZCcsCiAgICAgICAgICAgIH0KCiAgICAgICAgV2hlbiB1cGxvYWRpbmcgYSBmaWxlLCBwcm92aWRpbmcgYSBmaWxlbmFtZSAodGhlIGZpcnN0IHBhcmFtZXRlciBvZiB0aGUKICAgICAgICB0dXBsZSkgaXMgb3B0aW9uYWwgYnV0IHJlY29tbWVuZGVkIHRvIGJlc3QgbWltaWNrIGJlaGF2aW9yIG9mIGJyb3dzZXJzLgoKICAgICAgICBOb3RlIHRoYXQgaWYgYGBoZWFkZXJzYGAgYXJlIHN1cHBsaWVkLCB0aGUgJ0NvbnRlbnQtVHlwZScgaGVhZGVyIHdpbGwKICAgICAgICBiZSBvdmVyd3JpdHRlbiBiZWNhdXNlIGl0IGRlcGVuZHMgb24gdGhlIGR5bmFtaWMgcmFuZG9tIGJvdW5kYXJ5IHN0cmluZwogICAgICAgIHdoaWNoIGlzIHVzZWQgdG8gY29tcG9zZSB0aGUgYm9keSBvZiB0aGUgcmVxdWVzdC4gVGhlIHJhbmRvbSBib3VuZGFyeQogICAgICAgIHN0cmluZyBjYW4gYmUgZXhwbGljaXRseSBzZXQgd2l0aCB0aGUgYGBtdWx0aXBhcnRfYm91bmRhcnlgYCBwYXJhbWV0ZXIuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaGVhZGVycyBpcyBOb25lOgogICAgICAgICAgICBoZWFkZXJzID0gc2VsZi5oZWFkZXJzCgogICAgICAgIGV4dHJhX2t3ID0geydoZWFkZXJzJzoge319CgogICAgICAgIGlmIGZpZWxkczoKICAgICAgICAgICAgaWYgJ2JvZHknIGluIHVybG9wZW5fa3c6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgInJlcXVlc3QgZ290IHZhbHVlcyBmb3IgYm90aCAnZmllbGRzJyBhbmQgJ2JvZHknLCBjYW4gb25seSBzcGVjaWZ5IG9uZS4iKQoKICAgICAgICAgICAgaWYgZW5jb2RlX211bHRpcGFydDoKICAgICAgICAgICAgICAgIGJvZHksIGNvbnRlbnRfdHlwZSA9IGVuY29kZV9tdWx0aXBhcnRfZm9ybWRhdGEoZmllbGRzLCBib3VuZGFyeT1tdWx0aXBhcnRfYm91bmRhcnkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBib2R5LCBjb250ZW50X3R5cGUgPSB1cmxlbmNvZGUoZmllbGRzKSwgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcKCiAgICAgICAgICAgIGV4dHJhX2t3Wydib2R5J10gPSBib2R5CiAgICAgICAgICAgIGV4dHJhX2t3WydoZWFkZXJzJ10gPSB7J0NvbnRlbnQtVHlwZSc6IGNvbnRlbnRfdHlwZX0KCiAgICAgICAgZXh0cmFfa3dbJ2hlYWRlcnMnXS51cGRhdGUoaGVhZGVycykKICAgICAgICBleHRyYV9rdy51cGRhdGUodXJsb3Blbl9rdykKCiAgICAgICAgcmV0dXJuIHNlbGYudXJsb3BlbihtZXRob2QsIHVybCwgKipleHRyYV9rdykKUEsDBBQAAAAAAAAAIQA/SoJhd1kAAHdZAAAvAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcmVzcG9uc2UucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydApmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyCmltcG9ydCB6bGliCmltcG9ydCBpbwppbXBvcnQgbG9nZ2luZwpmcm9tIHNvY2tldCBpbXBvcnQgdGltZW91dCBhcyBTb2NrZXRUaW1lb3V0CmZyb20gc29ja2V0IGltcG9ydCBlcnJvciBhcyBTb2NrZXRFcnJvcgoKZnJvbSAuX2NvbGxlY3Rpb25zIGltcG9ydCBIVFRQSGVhZGVyRGljdApmcm9tIC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBCb2R5Tm90SHR0cGxpYkNvbXBhdGlibGUsIFByb3RvY29sRXJyb3IsIERlY29kZUVycm9yLCBSZWFkVGltZW91dEVycm9yLAogICAgUmVzcG9uc2VOb3RDaHVua2VkLCBJbmNvbXBsZXRlUmVhZCwgSW52YWxpZEhlYWRlcgopCmZyb20gLnBhY2thZ2VzLnNpeCBpbXBvcnQgc3RyaW5nX3R5cGVzIGFzIGJhc2VzdHJpbmcsIGJpbmFyeV90eXBlLCBQWTMKZnJvbSAucGFja2FnZXMuc2l4Lm1vdmVzIGltcG9ydCBodHRwX2NsaWVudCBhcyBodHRwbGliCmZyb20gLmNvbm5lY3Rpb24gaW1wb3J0IEhUVFBFeGNlcHRpb24sIEJhc2VTU0xFcnJvcgpmcm9tIC51dGlsLnJlc3BvbnNlIGltcG9ydCBpc19mcF9jbG9zZWQsIGlzX3Jlc3BvbnNlX3RvX2hlYWQKCmxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIERlZmxhdGVEZWNvZGVyKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuX2ZpcnN0X3RyeSA9IFRydWUKICAgICAgICBzZWxmLl9kYXRhID0gYmluYXJ5X3R5cGUoKQogICAgICAgIHNlbGYuX29iaiA9IHpsaWIuZGVjb21wcmVzc29iaigpCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX29iaiwgbmFtZSkKCiAgICBkZWYgZGVjb21wcmVzcyhzZWxmLCBkYXRhKToKICAgICAgICBpZiBub3QgZGF0YToKICAgICAgICAgICAgcmV0dXJuIGRhdGEKCiAgICAgICAgaWYgbm90IHNlbGYuX2ZpcnN0X3RyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29iai5kZWNvbXByZXNzKGRhdGEpCgogICAgICAgIHNlbGYuX2RhdGEgKz0gZGF0YQogICAgICAgIHRyeToKICAgICAgICAgICAgZGVjb21wcmVzc2VkID0gc2VsZi5fb2JqLmRlY29tcHJlc3MoZGF0YSkKICAgICAgICAgICAgaWYgZGVjb21wcmVzc2VkOgogICAgICAgICAgICAgICAgc2VsZi5fZmlyc3RfdHJ5ID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuX2RhdGEgPSBOb25lCiAgICAgICAgICAgIHJldHVybiBkZWNvbXByZXNzZWQKICAgICAgICBleGNlcHQgemxpYi5lcnJvcjoKICAgICAgICAgICAgc2VsZi5fZmlyc3RfdHJ5ID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5fb2JqID0gemxpYi5kZWNvbXByZXNzb2JqKC16bGliLk1BWF9XQklUUykKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVjb21wcmVzcyhzZWxmLl9kYXRhKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgc2VsZi5fZGF0YSA9IE5vbmUKCgpjbGFzcyBHemlwRGVjb2RlcihvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9vYmogPSB6bGliLmRlY29tcHJlc3NvYmooMTYgKyB6bGliLk1BWF9XQklUUykKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fb2JqLCBuYW1lKQoKICAgIGRlZiBkZWNvbXByZXNzKHNlbGYsIGRhdGEpOgogICAgICAgIGlmIG5vdCBkYXRhOgogICAgICAgICAgICByZXR1cm4gZGF0YQogICAgICAgIHJldHVybiBzZWxmLl9vYmouZGVjb21wcmVzcyhkYXRhKQoKCmRlZiBfZ2V0X2RlY29kZXIobW9kZSk6CiAgICBpZiBtb2RlID09ICdnemlwJzoKICAgICAgICByZXR1cm4gR3ppcERlY29kZXIoKQoKICAgIHJldHVybiBEZWZsYXRlRGVjb2RlcigpCgoKY2xhc3MgSFRUUFJlc3BvbnNlKGlvLklPQmFzZSk6CiAgICAiIiIKICAgIEhUVFAgUmVzcG9uc2UgY29udGFpbmVyLgoKICAgIEJhY2t3YXJkcy1jb21wYXRpYmxlIHRvIGh0dHBsaWIncyBIVFRQUmVzcG9uc2UgYnV0IHRoZSByZXNwb25zZSBgYGJvZHlgYCBpcwogICAgbG9hZGVkIGFuZCBkZWNvZGVkIG9uLWRlbWFuZCB3aGVuIHRoZSBgYGRhdGFgYCBwcm9wZXJ0eSBpcyBhY2Nlc3NlZC4gIFRoaXMKICAgIGNsYXNzIGlzIGFsc28gY29tcGF0aWJsZSB3aXRoIHRoZSBQeXRob24gc3RhbmRhcmQgbGlicmFyeSdzIDptb2Q6YGlvYAogICAgbW9kdWxlLCBhbmQgY2FuIGhlbmNlIGJlIHRyZWF0ZWQgYXMgYSByZWFkYWJsZSBvYmplY3QgaW4gdGhlIGNvbnRleHQgb2YgdGhhdAogICAgZnJhbWV3b3JrLgoKICAgIEV4dHJhIHBhcmFtZXRlcnMgZm9yIGJlaGF2aW91ciBub3QgcHJlc2VudCBpbiBodHRwbGliLkhUVFBSZXNwb25zZToKCiAgICA6cGFyYW0gcHJlbG9hZF9jb250ZW50OgogICAgICAgIElmIFRydWUsIHRoZSByZXNwb25zZSdzIGJvZHkgd2lsbCBiZSBwcmVsb2FkZWQgZHVyaW5nIGNvbnN0cnVjdGlvbi4KCiAgICA6cGFyYW0gZGVjb2RlX2NvbnRlbnQ6CiAgICAgICAgSWYgVHJ1ZSwgYXR0ZW1wdHMgdG8gZGVjb2RlIHNwZWNpZmljIGNvbnRlbnQtZW5jb2RpbmcncyBiYXNlZCBvbiBoZWFkZXJzCiAgICAgICAgKGxpa2UgJ2d6aXAnIGFuZCAnZGVmbGF0ZScpIHdpbGwgYmUgc2tpcHBlZCBhbmQgcmF3IGRhdGEgd2lsbCBiZSB1c2VkCiAgICAgICAgaW5zdGVhZC4KCiAgICA6cGFyYW0gb3JpZ2luYWxfcmVzcG9uc2U6CiAgICAgICAgV2hlbiB0aGlzIEhUVFBSZXNwb25zZSB3cmFwcGVyIGlzIGdlbmVyYXRlZCBmcm9tIGFuIGh0dHBsaWIuSFRUUFJlc3BvbnNlCiAgICAgICAgb2JqZWN0LCBpdCdzIGNvbnZlbmllbnQgdG8gaW5jbHVkZSB0aGUgb3JpZ2luYWwgZm9yIGRlYnVnIHB1cnBvc2VzLiBJdCdzCiAgICAgICAgb3RoZXJ3aXNlIHVudXNlZC4KCiAgICA6cGFyYW0gcmV0cmllczoKICAgICAgICBUaGUgcmV0cmllcyBjb250YWlucyB0aGUgbGFzdCA6Y2xhc3M6YH51cmxsaWIzLnV0aWwucmV0cnkuUmV0cnlgIHRoYXQKICAgICAgICB3YXMgdXNlZCBkdXJpbmcgdGhlIHJlcXVlc3QuCgogICAgOnBhcmFtIGVuZm9yY2VfY29udGVudF9sZW5ndGg6CiAgICAgICAgRW5mb3JjZSBjb250ZW50IGxlbmd0aCBjaGVja2luZy4gQm9keSByZXR1cm5lZCBieSBzZXJ2ZXIgbXVzdCBtYXRjaAogICAgICAgIHZhbHVlIG9mIENvbnRlbnQtTGVuZ3RoIGhlYWRlciwgaWYgcHJlc2VudC4gT3RoZXJ3aXNlLCByYWlzZSBlcnJvci4KICAgICIiIgoKICAgIENPTlRFTlRfREVDT0RFUlMgPSBbJ2d6aXAnLCAnZGVmbGF0ZSddCiAgICBSRURJUkVDVF9TVEFUVVNFUyA9IFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF0KCiAgICBkZWYgX19pbml0X18oc2VsZiwgYm9keT0nJywgaGVhZGVycz1Ob25lLCBzdGF0dXM9MCwgdmVyc2lvbj0wLCByZWFzb249Tm9uZSwKICAgICAgICAgICAgICAgICBzdHJpY3Q9MCwgcHJlbG9hZF9jb250ZW50PVRydWUsIGRlY29kZV9jb250ZW50PVRydWUsCiAgICAgICAgICAgICAgICAgb3JpZ2luYWxfcmVzcG9uc2U9Tm9uZSwgcG9vbD1Ob25lLCBjb25uZWN0aW9uPU5vbmUsCiAgICAgICAgICAgICAgICAgcmV0cmllcz1Ob25lLCBlbmZvcmNlX2NvbnRlbnRfbGVuZ3RoPUZhbHNlLCByZXF1ZXN0X21ldGhvZD1Ob25lKToKCiAgICAgICAgaWYgaXNpbnN0YW5jZShoZWFkZXJzLCBIVFRQSGVhZGVyRGljdCk6CiAgICAgICAgICAgIHNlbGYuaGVhZGVycyA9IGhlYWRlcnMKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmhlYWRlcnMgPSBIVFRQSGVhZGVyRGljdChoZWFkZXJzKQogICAgICAgIHNlbGYuc3RhdHVzID0gc3RhdHVzCiAgICAgICAgc2VsZi52ZXJzaW9uID0gdmVyc2lvbgogICAgICAgIHNlbGYucmVhc29uID0gcmVhc29uCiAgICAgICAgc2VsZi5zdHJpY3QgPSBzdHJpY3QKICAgICAgICBzZWxmLmRlY29kZV9jb250ZW50ID0gZGVjb2RlX2NvbnRlbnQKICAgICAgICBzZWxmLnJldHJpZXMgPSByZXRyaWVzCiAgICAgICAgc2VsZi5lbmZvcmNlX2NvbnRlbnRfbGVuZ3RoID0gZW5mb3JjZV9jb250ZW50X2xlbmd0aAoKICAgICAgICBzZWxmLl9kZWNvZGVyID0gTm9uZQogICAgICAgIHNlbGYuX2JvZHkgPSBOb25lCiAgICAgICAgc2VsZi5fZnAgPSBOb25lCiAgICAgICAgc2VsZi5fb3JpZ2luYWxfcmVzcG9uc2UgPSBvcmlnaW5hbF9yZXNwb25zZQogICAgICAgIHNlbGYuX2ZwX2J5dGVzX3JlYWQgPSAwCgogICAgICAgIGlmIGJvZHkgYW5kIGlzaW5zdGFuY2UoYm9keSwgKGJhc2VzdHJpbmcsIGJpbmFyeV90eXBlKSk6CiAgICAgICAgICAgIHNlbGYuX2JvZHkgPSBib2R5CgogICAgICAgIHNlbGYuX3Bvb2wgPSBwb29sCiAgICAgICAgc2VsZi5fY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24KCiAgICAgICAgaWYgaGFzYXR0cihib2R5LCAncmVhZCcpOgogICAgICAgICAgICBzZWxmLl9mcCA9IGJvZHkKCiAgICAgICAgIyBBcmUgd2UgdXNpbmcgdGhlIGNodW5rZWQtc3R5bGUgb2YgdHJhbnNmZXIgZW5jb2Rpbmc/CiAgICAgICAgc2VsZi5jaHVua2VkID0gRmFsc2UKICAgICAgICBzZWxmLmNodW5rX2xlZnQgPSBOb25lCiAgICAgICAgdHJfZW5jID0gc2VsZi5oZWFkZXJzLmdldCgndHJhbnNmZXItZW5jb2RpbmcnLCAnJykubG93ZXIoKQogICAgICAgICMgRG9uJ3QgaW5jdXIgdGhlIHBlbmFsdHkgb2YgY3JlYXRpbmcgYSBsaXN0IGFuZCB0aGVuIGRpc2NhcmRpbmcgaXQKICAgICAgICBlbmNvZGluZ3MgPSAoZW5jLnN0cmlwKCkgZm9yIGVuYyBpbiB0cl9lbmMuc3BsaXQoIiwiKSkKICAgICAgICBpZiAiY2h1bmtlZCIgaW4gZW5jb2RpbmdzOgogICAgICAgICAgICBzZWxmLmNodW5rZWQgPSBUcnVlCgogICAgICAgICMgRGV0ZXJtaW5lIGxlbmd0aCBvZiByZXNwb25zZQogICAgICAgIHNlbGYubGVuZ3RoX3JlbWFpbmluZyA9IHNlbGYuX2luaXRfbGVuZ3RoKHJlcXVlc3RfbWV0aG9kKQoKICAgICAgICAjIElmIHJlcXVlc3RlZCwgcHJlbG9hZCB0aGUgYm9keS4KICAgICAgICBpZiBwcmVsb2FkX2NvbnRlbnQgYW5kIG5vdCBzZWxmLl9ib2R5OgogICAgICAgICAgICBzZWxmLl9ib2R5ID0gc2VsZi5yZWFkKGRlY29kZV9jb250ZW50PWRlY29kZV9jb250ZW50KQoKICAgIGRlZiBnZXRfcmVkaXJlY3RfbG9jYXRpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2hvdWxkIHdlIHJlZGlyZWN0IGFuZCB3aGVyZSB0bz8KCiAgICAgICAgOnJldHVybnM6IFRydXRoeSByZWRpcmVjdCBsb2NhdGlvbiBzdHJpbmcgaWYgd2UgZ290IGEgcmVkaXJlY3Qgc3RhdHVzCiAgICAgICAgICAgIGNvZGUgYW5kIHZhbGlkIGxvY2F0aW9uLiBgYE5vbmVgYCBpZiByZWRpcmVjdCBzdGF0dXMgYW5kIG5vCiAgICAgICAgICAgIGxvY2F0aW9uLiBgYEZhbHNlYGAgaWYgbm90IGEgcmVkaXJlY3Qgc3RhdHVzIGNvZGUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5zdGF0dXMgaW4gc2VsZi5SRURJUkVDVF9TVEFUVVNFUzoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuaGVhZGVycy5nZXQoJ2xvY2F0aW9uJykKCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIHJlbGVhc2VfY29ubihzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5fcG9vbCBvciBub3Qgc2VsZi5fY29ubmVjdGlvbjoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuX3Bvb2wuX3B1dF9jb25uKHNlbGYuX2Nvbm5lY3Rpb24pCiAgICAgICAgc2VsZi5fY29ubmVjdGlvbiA9IE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkYXRhKHNlbGYpOgogICAgICAgICMgRm9yIGJhY2t3b3Jkcy1jb21wYXQgd2l0aCBlYXJsaWVyIHVybGxpYjMgMC40IGFuZCBlYXJsaWVyLgogICAgICAgIGlmIHNlbGYuX2JvZHk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9ib2R5CgogICAgICAgIGlmIHNlbGYuX2ZwOgogICAgICAgICAgICByZXR1cm4gc2VsZi5yZWFkKGNhY2hlX2NvbnRlbnQ9VHJ1ZSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb25uZWN0aW9uKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9jb25uZWN0aW9uCgogICAgZGVmIHRlbGwoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgT2J0YWluIHRoZSBudW1iZXIgb2YgYnl0ZXMgcHVsbGVkIG92ZXIgdGhlIHdpcmUgc28gZmFyLiBNYXkgZGlmZmVyIGZyb20KICAgICAgICB0aGUgYW1vdW50IG9mIGNvbnRlbnQgcmV0dXJuZWQgYnkgOm1ldGg6YGBIVFRQUmVzcG9uc2UucmVhZGBgIGlmIGJ5dGVzCiAgICAgICAgYXJlIGVuY29kZWQgb24gdGhlIHdpcmUgKGUuZywgY29tcHJlc3NlZCkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2ZwX2J5dGVzX3JlYWQKCiAgICBkZWYgX2luaXRfbGVuZ3RoKHNlbGYsIHJlcXVlc3RfbWV0aG9kKToKICAgICAgICAiIiIKICAgICAgICBTZXQgaW5pdGlhbCBsZW5ndGggdmFsdWUgZm9yIFJlc3BvbnNlIGNvbnRlbnQgaWYgYXZhaWxhYmxlLgogICAgICAgICIiIgogICAgICAgIGxlbmd0aCA9IHNlbGYuaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJykKCiAgICAgICAgaWYgbGVuZ3RoIGlzIG5vdCBOb25lIGFuZCBzZWxmLmNodW5rZWQ6CiAgICAgICAgICAgICMgVGhpcyBSZXNwb25zZSB3aWxsIGZhaWwgd2l0aCBhbiBJbmNvbXBsZXRlUmVhZCBpZiBpdCBjYW4ndCBiZQogICAgICAgICAgICAjIHJlY2VpdmVkIGFzIGNodW5rZWQuIFRoaXMgbWV0aG9kIGZhbGxzIGJhY2sgdG8gYXR0ZW1wdCByZWFkaW5nCiAgICAgICAgICAgICMgdGhlIHJlc3BvbnNlIGJlZm9yZSByYWlzaW5nIGFuIGV4Y2VwdGlvbi4KICAgICAgICAgICAgbG9nLndhcm5pbmcoIlJlY2VpdmVkIHJlc3BvbnNlIHdpdGggYm90aCBDb250ZW50LUxlbmd0aCBhbmQgIgogICAgICAgICAgICAgICAgICAgICAgICAiVHJhbnNmZXItRW5jb2Rpbmcgc2V0LiBUaGlzIGlzIGV4cHJlc3NseSBmb3JiaWRkZW4gIgogICAgICAgICAgICAgICAgICAgICAgICAiYnkgUkZDIDcyMzAgc2VjIDMuMy4yLiBJZ25vcmluZyBDb250ZW50LUxlbmd0aCBhbmQgIgogICAgICAgICAgICAgICAgICAgICAgICAiYXR0ZW1wdGluZyB0byBwcm9jZXNzIHJlc3BvbnNlIGFzIFRyYW5zZmVyLUVuY29kaW5nOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICJjaHVua2VkLiIpCiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIGVsaWYgbGVuZ3RoIGlzIG5vdCBOb25lOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAjIFJGQyA3MjMwIHNlY3Rpb24gMy4zLjIgc3BlY2lmaWVzIG11bHRpcGxlIGNvbnRlbnQgbGVuZ3RocyBjYW4KICAgICAgICAgICAgICAgICMgYmUgc2VudCBpbiBhIHNpbmdsZSBDb250ZW50LUxlbmd0aCBoZWFkZXIKICAgICAgICAgICAgICAgICMgKGUuZy4gQ29udGVudC1MZW5ndGg6IDQyLCA0MikuIFRoaXMgbGluZSBlbnN1cmVzIHRoZSB2YWx1ZXMKICAgICAgICAgICAgICAgICMgYXJlIGFsbCB2YWxpZCBpbnRzIGFuZCB0aGF0IGFzIGxvbmcgYXMgdGhlIGBzZXRgIGxlbmd0aCBpcyAxLAogICAgICAgICAgICAgICAgIyBhbGwgdmFsdWVzIGFyZSB0aGUgc2FtZS4gT3RoZXJ3aXNlLCB0aGUgaGVhZGVyIGlzIGludmFsaWQuCiAgICAgICAgICAgICAgICBsZW5ndGhzID0gc2V0KFtpbnQodmFsKSBmb3IgdmFsIGluIGxlbmd0aC5zcGxpdCgnLCcpXSkKICAgICAgICAgICAgICAgIGlmIGxlbihsZW5ndGhzKSA+IDE6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZEhlYWRlcigiQ29udGVudC1MZW5ndGggY29udGFpbmVkIG11bHRpcGxlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bm1hdGNoaW5nIHZhbHVlcyAoJXMpIiAlIGxlbmd0aCkKICAgICAgICAgICAgICAgIGxlbmd0aCA9IGxlbmd0aHMucG9wKCkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICBsZW5ndGggPSBOb25lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBsZW5ndGggPCAwOgogICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IE5vbmUKCiAgICAgICAgIyBDb252ZXJ0IHN0YXR1cyB0byBpbnQgZm9yIGNvbXBhcmlzb24KICAgICAgICAjIEluIHNvbWUgY2FzZXMsIGh0dHBsaWIgcmV0dXJucyBhIHN0YXR1cyBvZiAiX1VOS05PV04iCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdGF0dXMgPSBpbnQoc2VsZi5zdGF0dXMpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHN0YXR1cyA9IDAKCiAgICAgICAgIyBDaGVjayBmb3IgcmVzcG9uc2VzIHRoYXQgc2hvdWxkbid0IGluY2x1ZGUgYSBib2R5CiAgICAgICAgaWYgc3RhdHVzIGluICgyMDQsIDMwNCkgb3IgMTAwIDw9IHN0YXR1cyA8IDIwMCBvciByZXF1ZXN0X21ldGhvZCA9PSAnSEVBRCc6CiAgICAgICAgICAgIGxlbmd0aCA9IDAKCiAgICAgICAgcmV0dXJuIGxlbmd0aAoKICAgIGRlZiBfaW5pdF9kZWNvZGVyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFNldC11cCB0aGUgX2RlY29kZXIgYXR0cmlidXRlIGlmIG5lY2Vzc2FyeS4KICAgICAgICAiIiIKICAgICAgICAjIE5vdGU6IGNvbnRlbnQtZW5jb2RpbmcgdmFsdWUgc2hvdWxkIGJlIGNhc2UtaW5zZW5zaXRpdmUsIHBlciBSRkMgNzIzMAogICAgICAgICMgU2VjdGlvbiAzLjIKICAgICAgICBjb250ZW50X2VuY29kaW5nID0gc2VsZi5oZWFkZXJzLmdldCgnY29udGVudC1lbmNvZGluZycsICcnKS5sb3dlcigpCiAgICAgICAgaWYgc2VsZi5fZGVjb2RlciBpcyBOb25lIGFuZCBjb250ZW50X2VuY29kaW5nIGluIHNlbGYuQ09OVEVOVF9ERUNPREVSUzoKICAgICAgICAgICAgc2VsZi5fZGVjb2RlciA9IF9nZXRfZGVjb2Rlcihjb250ZW50X2VuY29kaW5nKQoKICAgIGRlZiBfZGVjb2RlKHNlbGYsIGRhdGEsIGRlY29kZV9jb250ZW50LCBmbHVzaF9kZWNvZGVyKToKICAgICAgICAiIiIKICAgICAgICBEZWNvZGUgdGhlIGRhdGEgcGFzc2VkIGluIGFuZCBwb3RlbnRpYWxseSBmbHVzaCB0aGUgZGVjb2Rlci4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIGRlY29kZV9jb250ZW50IGFuZCBzZWxmLl9kZWNvZGVyOgogICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2RlY29kZXIuZGVjb21wcmVzcyhkYXRhKQogICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgemxpYi5lcnJvcikgYXMgZToKICAgICAgICAgICAgY29udGVudF9lbmNvZGluZyA9IHNlbGYuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZW5jb2RpbmcnLCAnJykubG93ZXIoKQogICAgICAgICAgICByYWlzZSBEZWNvZGVFcnJvcigKICAgICAgICAgICAgICAgICJSZWNlaXZlZCByZXNwb25zZSB3aXRoIGNvbnRlbnQtZW5jb2Rpbmc6ICVzLCBidXQgIgogICAgICAgICAgICAgICAgImZhaWxlZCB0byBkZWNvZGUgaXQuIiAlIGNvbnRlbnRfZW5jb2RpbmcsIGUpCgogICAgICAgIGlmIGZsdXNoX2RlY29kZXIgYW5kIGRlY29kZV9jb250ZW50OgogICAgICAgICAgICBkYXRhICs9IHNlbGYuX2ZsdXNoX2RlY29kZXIoKQoKICAgICAgICByZXR1cm4gZGF0YQoKICAgIGRlZiBfZmx1c2hfZGVjb2RlcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBGbHVzaGVzIHRoZSBkZWNvZGVyLiBTaG91bGQgb25seSBiZSBjYWxsZWQgaWYgdGhlIGRlY29kZXIgaXMgYWN0dWFsbHkKICAgICAgICBiZWluZyB1c2VkLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuX2RlY29kZXI6CiAgICAgICAgICAgIGJ1ZiA9IHNlbGYuX2RlY29kZXIuZGVjb21wcmVzcyhiJycpCiAgICAgICAgICAgIHJldHVybiBidWYgKyBzZWxmLl9kZWNvZGVyLmZsdXNoKCkKCiAgICAgICAgcmV0dXJuIGInJwoKICAgIEBjb250ZXh0bWFuYWdlcgogICAgZGVmIF9lcnJvcl9jYXRjaGVyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENhdGNoIGxvdy1sZXZlbCBweXRob24gZXhjZXB0aW9ucywgaW5zdGVhZCByZS1yYWlzaW5nIHVybGxpYjMKICAgICAgICB2YXJpYW50cywgc28gdGhhdCBsb3ctbGV2ZWwgZXhjZXB0aW9ucyBhcmUgbm90IGxlYWtlZCBpbiB0aGUKICAgICAgICBoaWdoLWxldmVsIGFwaS4KCiAgICAgICAgT24gZXhpdCwgcmVsZWFzZSB0aGUgY29ubmVjdGlvbiBiYWNrIHRvIHRoZSBwb29sLgogICAgICAgICIiIgogICAgICAgIGNsZWFuX2V4aXQgPSBGYWxzZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHlpZWxkCgogICAgICAgICAgICBleGNlcHQgU29ja2V0VGltZW91dDoKICAgICAgICAgICAgICAgICMgRklYTUU6IElkZWFsbHkgd2UnZCBsaWtlIHRvIGluY2x1ZGUgdGhlIHVybCBpbiB0aGUgUmVhZFRpbWVvdXRFcnJvciBidXQKICAgICAgICAgICAgICAgICMgdGhlcmUgaXMgeWV0IG5vIGNsZWFuIHdheSB0byBnZXQgYXQgaXQgZnJvbSB0aGlzIGNvbnRleHQuCiAgICAgICAgICAgICAgICByYWlzZSBSZWFkVGltZW91dEVycm9yKHNlbGYuX3Bvb2wsIE5vbmUsICdSZWFkIHRpbWVkIG91dC4nKQoKICAgICAgICAgICAgZXhjZXB0IEJhc2VTU0xFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgIyBGSVhNRTogSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBTU0xFcnJvcnM/CiAgICAgICAgICAgICAgICBpZiAncmVhZCBvcGVyYXRpb24gdGltZWQgb3V0JyBub3QgaW4gc3RyKGUpOiAgIyBEZWZlbnNpdmU6CiAgICAgICAgICAgICAgICAgICAgIyBUaGlzIHNob3VsZG4ndCBoYXBwZW4gYnV0IGp1c3QgaW4gY2FzZSB3ZSdyZSBtaXNzaW5nIGFuIGVkZ2UKICAgICAgICAgICAgICAgICAgICAjIGNhc2UsIGxldCdzIGF2b2lkIHN3YWxsb3dpbmcgU1NMIGVycm9ycy4KICAgICAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRUaW1lb3V0RXJyb3Ioc2VsZi5fcG9vbCwgTm9uZSwgJ1JlYWQgdGltZWQgb3V0LicpCgogICAgICAgICAgICBleGNlcHQgKEhUVFBFeGNlcHRpb24sIFNvY2tldEVycm9yKSBhcyBlOgogICAgICAgICAgICAgICAgIyBUaGlzIGluY2x1ZGVzIEluY29tcGxldGVSZWFkLgogICAgICAgICAgICAgICAgcmFpc2UgUHJvdG9jb2xFcnJvcignQ29ubmVjdGlvbiBicm9rZW46ICVyJyAlIGUsIGUpCgogICAgICAgICAgICAjIElmIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHdlIHNob3VsZCBhdm9pZCBjbGVhbmluZyB1cAogICAgICAgICAgICAjIHVubmVjZXNzYXJpbHkuCiAgICAgICAgICAgIGNsZWFuX2V4aXQgPSBUcnVlCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIyBJZiB3ZSBkaWRuJ3QgdGVybWluYXRlIGNsZWFubHksIHdlIG5lZWQgdG8gdGhyb3cgYXdheSBvdXIKICAgICAgICAgICAgIyBjb25uZWN0aW9uLgogICAgICAgICAgICBpZiBub3QgY2xlYW5fZXhpdDoKICAgICAgICAgICAgICAgICMgVGhlIHJlc3BvbnNlIG1heSBub3QgYmUgY2xvc2VkIGJ1dCB3ZSdyZSBub3QgZ29pbmcgdG8gdXNlIGl0CiAgICAgICAgICAgICAgICAjIGFueW1vcmUgc28gY2xvc2UgaXQgbm93IHRvIGVuc3VyZSB0aGF0IHRoZSBjb25uZWN0aW9uIGlzCiAgICAgICAgICAgICAgICAjIHJlbGVhc2VkIGJhY2sgdG8gdGhlIHBvb2wuCiAgICAgICAgICAgICAgICBpZiBzZWxmLl9vcmlnaW5hbF9yZXNwb25zZToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9vcmlnaW5hbF9yZXNwb25zZS5jbG9zZSgpCgogICAgICAgICAgICAgICAgIyBDbG9zaW5nIHRoZSByZXNwb25zZSBtYXkgbm90IGFjdHVhbGx5IGJlIHN1ZmZpY2llbnQgdG8gY2xvc2UKICAgICAgICAgICAgICAgICMgZXZlcnl0aGluZywgc28gaWYgd2UgaGF2ZSBhIGhvbGQgb2YgdGhlIGNvbm5lY3Rpb24gY2xvc2UgdGhhdAogICAgICAgICAgICAgICAgIyB0b28uCiAgICAgICAgICAgICAgICBpZiBzZWxmLl9jb25uZWN0aW9uOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24uY2xvc2UoKQoKICAgICAgICAgICAgIyBJZiB3ZSBob2xkIHRoZSBvcmlnaW5hbCByZXNwb25zZSBidXQgaXQncyBjbG9zZWQgbm93LCB3ZSBzaG91bGQKICAgICAgICAgICAgIyByZXR1cm4gdGhlIGNvbm5lY3Rpb24gYmFjayB0byB0aGUgcG9vbC4KICAgICAgICAgICAgaWYgc2VsZi5fb3JpZ2luYWxfcmVzcG9uc2UgYW5kIHNlbGYuX29yaWdpbmFsX3Jlc3BvbnNlLmlzY2xvc2VkKCk6CiAgICAgICAgICAgICAgICBzZWxmLnJlbGVhc2VfY29ubigpCgogICAgZGVmIHJlYWQoc2VsZiwgYW10PU5vbmUsIGRlY29kZV9jb250ZW50PU5vbmUsIGNhY2hlX2NvbnRlbnQ9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFNpbWlsYXIgdG8gOm1ldGg6YGh0dHBsaWIuSFRUUFJlc3BvbnNlLnJlYWRgLCBidXQgd2l0aCB0d28gYWRkaXRpb25hbAogICAgICAgIHBhcmFtZXRlcnM6IGBgZGVjb2RlX2NvbnRlbnRgYCBhbmQgYGBjYWNoZV9jb250ZW50YGAuCgogICAgICAgIDpwYXJhbSBhbXQ6CiAgICAgICAgICAgIEhvdyBtdWNoIG9mIHRoZSBjb250ZW50IHRvIHJlYWQuIElmIHNwZWNpZmllZCwgY2FjaGluZyBpcyBza2lwcGVkCiAgICAgICAgICAgIGJlY2F1c2UgaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIGNhY2hlIHBhcnRpYWwgY29udGVudCBhcyB0aGUgZnVsbAogICAgICAgICAgICByZXNwb25zZS4KCiAgICAgICAgOnBhcmFtIGRlY29kZV9jb250ZW50OgogICAgICAgICAgICBJZiBUcnVlLCB3aWxsIGF0dGVtcHQgdG8gZGVjb2RlIHRoZSBib2R5IGJhc2VkIG9uIHRoZQogICAgICAgICAgICAnY29udGVudC1lbmNvZGluZycgaGVhZGVyLgoKICAgICAgICA6cGFyYW0gY2FjaGVfY29udGVudDoKICAgICAgICAgICAgSWYgVHJ1ZSwgd2lsbCBzYXZlIHRoZSByZXR1cm5lZCBkYXRhIHN1Y2ggdGhhdCB0aGUgc2FtZSByZXN1bHQgaXMKICAgICAgICAgICAgcmV0dXJuZWQgZGVzcGl0ZSBvZiB0aGUgc3RhdGUgb2YgdGhlIHVuZGVybHlpbmcgZmlsZSBvYmplY3QuIFRoaXMKICAgICAgICAgICAgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRoZSBgYC5kYXRhYGAgcHJvcGVydHkgdG8gY29udGludWUgd29ya2luZwogICAgICAgICAgICBhZnRlciBoYXZpbmcgYGAucmVhZCgpYGAgdGhlIGZpbGUgb2JqZWN0LiAoT3ZlcnJpZGRlbiBpZiBgYGFtdGBgIGlzCiAgICAgICAgICAgIHNldC4pCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5faW5pdF9kZWNvZGVyKCkKICAgICAgICBpZiBkZWNvZGVfY29udGVudCBpcyBOb25lOgogICAgICAgICAgICBkZWNvZGVfY29udGVudCA9IHNlbGYuZGVjb2RlX2NvbnRlbnQKCiAgICAgICAgaWYgc2VsZi5fZnAgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGZsdXNoX2RlY29kZXIgPSBGYWxzZQogICAgICAgIGRhdGEgPSBOb25lCgogICAgICAgIHdpdGggc2VsZi5fZXJyb3JfY2F0Y2hlcigpOgogICAgICAgICAgICBpZiBhbXQgaXMgTm9uZToKICAgICAgICAgICAgICAgICMgY1N0cmluZ0lPIGRvZXNuJ3QgbGlrZSBhbXQ9Tm9uZQogICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2ZwLnJlYWQoKQogICAgICAgICAgICAgICAgZmx1c2hfZGVjb2RlciA9IFRydWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNhY2hlX2NvbnRlbnQgPSBGYWxzZQogICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2ZwLnJlYWQoYW10KQogICAgICAgICAgICAgICAgaWYgYW10ICE9IDAgYW5kIG5vdCBkYXRhOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogQnVnZ3kgdmVyc2lvbnMgb2YgUHl0aG9uLgogICAgICAgICAgICAgICAgICAgICMgQ2xvc2UgdGhlIGNvbm5lY3Rpb24gd2hlbiBubyBkYXRhIGlzIHJldHVybmVkCiAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyByZWR1bmRhbnQgdG8gd2hhdCBodHRwbGliL2h0dHAuY2xpZW50IF9zaG91bGRfCiAgICAgICAgICAgICAgICAgICAgIyBhbHJlYWR5IGRvLiAgSG93ZXZlciwgdmVyc2lvbnMgb2YgcHl0aG9uIHJlbGVhc2VkIGJlZm9yZQogICAgICAgICAgICAgICAgICAgICMgRGVjZW1iZXIgMTUsIDIwMTIgKGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxNjI5OCkgZG8KICAgICAgICAgICAgICAgICAgICAjIG5vdCBwcm9wZXJseSBjbG9zZSB0aGUgY29ubmVjdGlvbiBpbiBhbGwgY2FzZXMuIFRoZXJlIGlzCiAgICAgICAgICAgICAgICAgICAgIyBubyBoYXJtIGluIHJlZHVuZGFudGx5IGNhbGxpbmcgY2xvc2UuCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZnAuY2xvc2UoKQogICAgICAgICAgICAgICAgICAgIGZsdXNoX2RlY29kZXIgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5lbmZvcmNlX2NvbnRlbnRfbGVuZ3RoIGFuZCBzZWxmLmxlbmd0aF9yZW1haW5pbmcgbm90IGluICgwLCBOb25lKToKICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGFuIGVkZ2UgY2FzZSB0aGF0IGh0dHBsaWIgZmFpbGVkIHRvIGNvdmVyIGR1ZQogICAgICAgICAgICAgICAgICAgICAgICAjIHRvIGNvbmNlcm5zIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFdlJ3JlCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkcmVzc2luZyBpdCBoZXJlIHRvIG1ha2Ugc3VyZSBJbmNvbXBsZXRlUmVhZCBpcwogICAgICAgICAgICAgICAgICAgICAgICAjIHJhaXNlZCBkdXJpbmcgc3RyZWFtaW5nLCBzbyBhbGwgY2FsbHMgd2l0aCBpbmNvcnJlY3QKICAgICAgICAgICAgICAgICAgICAgICAgIyBDb250ZW50LUxlbmd0aCBhcmUgY2F1Z2h0LgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBJbmNvbXBsZXRlUmVhZChzZWxmLl9mcF9ieXRlc19yZWFkLCBzZWxmLmxlbmd0aF9yZW1haW5pbmcpCgogICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgIHNlbGYuX2ZwX2J5dGVzX3JlYWQgKz0gbGVuKGRhdGEpCiAgICAgICAgICAgIGlmIHNlbGYubGVuZ3RoX3JlbWFpbmluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYubGVuZ3RoX3JlbWFpbmluZyAtPSBsZW4oZGF0YSkKCiAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9kZWNvZGUoZGF0YSwgZGVjb2RlX2NvbnRlbnQsIGZsdXNoX2RlY29kZXIpCgogICAgICAgICAgICBpZiBjYWNoZV9jb250ZW50OgogICAgICAgICAgICAgICAgc2VsZi5fYm9keSA9IGRhdGEKCiAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBkZWYgc3RyZWFtKHNlbGYsIGFtdD0yKioxNiwgZGVjb2RlX2NvbnRlbnQ9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgQSBnZW5lcmF0b3Igd3JhcHBlciBmb3IgdGhlIHJlYWQoKSBtZXRob2QuIEEgY2FsbCB3aWxsIGJsb2NrIHVudGlsCiAgICAgICAgYGBhbXRgYCBieXRlcyBoYXZlIGJlZW4gcmVhZCBmcm9tIHRoZSBjb25uZWN0aW9uIG9yIHVudGlsIHRoZQogICAgICAgIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgoKICAgICAgICA6cGFyYW0gYW10OgogICAgICAgICAgICBIb3cgbXVjaCBvZiB0aGUgY29udGVudCB0byByZWFkLiBUaGUgZ2VuZXJhdG9yIHdpbGwgcmV0dXJuIHVwIHRvCiAgICAgICAgICAgIG11Y2ggZGF0YSBwZXIgaXRlcmF0aW9uLCBidXQgbWF5IHJldHVybiBsZXNzLiBUaGlzIGlzIHBhcnRpY3VsYXJseQogICAgICAgICAgICBsaWtlbHkgd2hlbiB1c2luZyBjb21wcmVzc2VkIGRhdGEuIEhvd2V2ZXIsIHRoZSBlbXB0eSBzdHJpbmcgd2lsbAogICAgICAgICAgICBuZXZlciBiZSByZXR1cm5lZC4KCiAgICAgICAgOnBhcmFtIGRlY29kZV9jb250ZW50OgogICAgICAgICAgICBJZiBUcnVlLCB3aWxsIGF0dGVtcHQgdG8gZGVjb2RlIHRoZSBib2R5IGJhc2VkIG9uIHRoZQogICAgICAgICAgICAnY29udGVudC1lbmNvZGluZycgaGVhZGVyLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2h1bmtlZCBhbmQgc2VsZi5zdXBwb3J0c19jaHVua2VkX3JlYWRzKCk6CiAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYucmVhZF9jaHVua2VkKGFtdCwgZGVjb2RlX2NvbnRlbnQ9ZGVjb2RlX2NvbnRlbnQpOgogICAgICAgICAgICAgICAgeWllbGQgbGluZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHdoaWxlIG5vdCBpc19mcF9jbG9zZWQoc2VsZi5fZnApOgogICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYucmVhZChhbXQ9YW10LCBkZWNvZGVfY29udGVudD1kZWNvZGVfY29udGVudCkKCiAgICAgICAgICAgICAgICBpZiBkYXRhOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIGRhdGEKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2h0dHBsaWIoUmVzcG9uc2VDbHMsIHIsICoqcmVzcG9uc2Vfa3cpOgogICAgICAgICIiIgogICAgICAgIEdpdmVuIGFuIDpjbGFzczpgaHR0cGxpYi5IVFRQUmVzcG9uc2VgIGluc3RhbmNlIGBgcmBgLCByZXR1cm4gYQogICAgICAgIGNvcnJlc3BvbmRpbmcgOmNsYXNzOmB1cmxsaWIzLnJlc3BvbnNlLkhUVFBSZXNwb25zZWAgb2JqZWN0LgoKICAgICAgICBSZW1haW5pbmcgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRvIHRoZSBIVFRQUmVzcG9uc2UgY29uc3RydWN0b3IsIGFsb25nCiAgICAgICAgd2l0aCBgYG9yaWdpbmFsX3Jlc3BvbnNlPXJgYC4KICAgICAgICAiIiIKICAgICAgICBoZWFkZXJzID0gci5tc2cKCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaGVhZGVycywgSFRUUEhlYWRlckRpY3QpOgogICAgICAgICAgICBpZiBQWTM6ICAjIFB5dGhvbiAzCiAgICAgICAgICAgICAgICBoZWFkZXJzID0gSFRUUEhlYWRlckRpY3QoaGVhZGVycy5pdGVtcygpKQogICAgICAgICAgICBlbHNlOiAgIyBQeXRob24gMgogICAgICAgICAgICAgICAgaGVhZGVycyA9IEhUVFBIZWFkZXJEaWN0LmZyb21faHR0cGxpYihoZWFkZXJzKQoKICAgICAgICAjIEhUVFBSZXNwb25zZSBvYmplY3RzIGluIFB5dGhvbiAzIGRvbid0IGhhdmUgYSAuc3RyaWN0IGF0dHJpYnV0ZQogICAgICAgIHN0cmljdCA9IGdldGF0dHIociwgJ3N0cmljdCcsIDApCiAgICAgICAgcmVzcCA9IFJlc3BvbnNlQ2xzKGJvZHk9ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz1oZWFkZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM9ci5zdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249ci52ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb249ci5yZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdD1zdHJpY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsX3Jlc3BvbnNlPXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmVzcG9uc2Vfa3cpCiAgICAgICAgcmV0dXJuIHJlc3AKCiAgICAjIEJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IG1ldGhvZHMgZm9yIGh0dHBsaWIuSFRUUFJlc3BvbnNlCiAgICBkZWYgZ2V0aGVhZGVycyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5oZWFkZXJzCgogICAgZGVmIGdldGhlYWRlcihzZWxmLCBuYW1lLCBkZWZhdWx0PU5vbmUpOgogICAgICAgIHJldHVybiBzZWxmLmhlYWRlcnMuZ2V0KG5hbWUsIGRlZmF1bHQpCgogICAgIyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgaHR0cC5jb29raWVqYXIKICAgIGRlZiBpbmZvKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmhlYWRlcnMKCiAgICAjIE92ZXJyaWRlcyBmcm9tIGlvLklPQmFzZQogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgc2VsZi5fZnAuY2xvc2UoKQoKICAgICAgICBpZiBzZWxmLl9jb25uZWN0aW9uOgogICAgICAgICAgICBzZWxmLl9jb25uZWN0aW9uLmNsb3NlKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjbG9zZWQoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fZnAgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBlbGlmIGhhc2F0dHIoc2VsZi5fZnAsICdpc2Nsb3NlZCcpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZnAuaXNjbG9zZWQoKQogICAgICAgIGVsaWYgaGFzYXR0cihzZWxmLl9mcCwgJ2Nsb3NlZCcpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZnAuY2xvc2VkCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgZmlsZW5vKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX2ZwIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIkhUVFBSZXNwb25zZSBoYXMgbm8gZmlsZSB0byBnZXQgYSBmaWxlbm8gZnJvbSIpCiAgICAgICAgZWxpZiBoYXNhdHRyKHNlbGYuX2ZwLCAiZmlsZW5vIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9mcC5maWxlbm8oKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIlRoZSBmaWxlLWxpa2Ugb2JqZWN0IHRoaXMgSFRUUFJlc3BvbnNlIGlzIHdyYXBwZWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICJhcm91bmQgaGFzIG5vIGZpbGUgZGVzY3JpcHRvciIpCgogICAgZGVmIGZsdXNoKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX2ZwIGlzIG5vdCBOb25lIGFuZCBoYXNhdHRyKHNlbGYuX2ZwLCAnZmx1c2gnKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZwLmZsdXNoKCkKCiAgICBkZWYgcmVhZGFibGUoc2VsZik6CiAgICAgICAgIyBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCBmb3IgYGlvYCBtb2R1bGUgY29tcGF0aWJpbGl0eS4KICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiByZWFkaW50byhzZWxmLCBiKToKICAgICAgICAjIFRoaXMgbWV0aG9kIGlzIHJlcXVpcmVkIGZvciBgaW9gIG1vZHVsZSBjb21wYXRpYmlsaXR5LgogICAgICAgIHRlbXAgPSBzZWxmLnJlYWQobGVuKGIpKQogICAgICAgIGlmIGxlbih0ZW1wKSA9PSAwOgogICAgICAgICAgICByZXR1cm4gMAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJbOmxlbih0ZW1wKV0gPSB0ZW1wCiAgICAgICAgICAgIHJldHVybiBsZW4odGVtcCkKCiAgICBkZWYgc3VwcG9ydHNfY2h1bmtlZF9yZWFkcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDaGVja3MgaWYgdGhlIHVuZGVybHlpbmcgZmlsZS1saWtlIG9iamVjdCBsb29rcyBsaWtlIGEKICAgICAgICBodHRwbGliLkhUVFBSZXNwb25zZSBvYmplY3QuIFdlIGRvIHRoaXMgYnkgdGVzdGluZyBmb3IgdGhlIGZwCiAgICAgICAgYXR0cmlidXRlLiBJZiBpdCBpcyBwcmVzZW50IHdlIGFzc3VtZSBpdCByZXR1cm5zIHJhdyBjaHVua3MgYXMKICAgICAgICBwcm9jZXNzZWQgYnkgcmVhZF9jaHVua2VkKCkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGhhc2F0dHIoc2VsZi5fZnAsICdmcCcpCgogICAgZGVmIF91cGRhdGVfY2h1bmtfbGVuZ3RoKHNlbGYpOgogICAgICAgICMgRmlyc3QsIHdlJ2xsIGZpZ3VyZSBvdXQgbGVuZ3RoIG9mIGEgY2h1bmsgYW5kIHRoZW4KICAgICAgICAjIHdlJ2xsIHRyeSB0byByZWFkIGl0IGZyb20gc29ja2V0LgogICAgICAgIGlmIHNlbGYuY2h1bmtfbGVmdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbGluZSA9IHNlbGYuX2ZwLmZwLnJlYWRsaW5lKCkKICAgICAgICBsaW5lID0gbGluZS5zcGxpdChiJzsnLCAxKVswXQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jaHVua19sZWZ0ID0gaW50KGxpbmUsIDE2KQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAjIEludmFsaWQgY2h1bmtlZCBwcm90b2NvbCByZXNwb25zZSwgYWJvcnQuCiAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgICAgICByYWlzZSBodHRwbGliLkluY29tcGxldGVSZWFkKGxpbmUpCgogICAgZGVmIF9oYW5kbGVfY2h1bmsoc2VsZiwgYW10KToKICAgICAgICByZXR1cm5lZF9jaHVuayA9IE5vbmUKICAgICAgICBpZiBhbXQgaXMgTm9uZToKICAgICAgICAgICAgY2h1bmsgPSBzZWxmLl9mcC5fc2FmZV9yZWFkKHNlbGYuY2h1bmtfbGVmdCkKICAgICAgICAgICAgcmV0dXJuZWRfY2h1bmsgPSBjaHVuawogICAgICAgICAgICBzZWxmLl9mcC5fc2FmZV9yZWFkKDIpICAjIFRvc3MgdGhlIENSTEYgYXQgdGhlIGVuZCBvZiB0aGUgY2h1bmsuCiAgICAgICAgICAgIHNlbGYuY2h1bmtfbGVmdCA9IE5vbmUKICAgICAgICBlbGlmIGFtdCA8IHNlbGYuY2h1bmtfbGVmdDoKICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9mcC5fc2FmZV9yZWFkKGFtdCkKICAgICAgICAgICAgc2VsZi5jaHVua19sZWZ0ID0gc2VsZi5jaHVua19sZWZ0IC0gYW10CiAgICAgICAgICAgIHJldHVybmVkX2NodW5rID0gdmFsdWUKICAgICAgICBlbGlmIGFtdCA9PSBzZWxmLmNodW5rX2xlZnQ6CiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fZnAuX3NhZmVfcmVhZChhbXQpCiAgICAgICAgICAgIHNlbGYuX2ZwLl9zYWZlX3JlYWQoMikgICMgVG9zcyB0aGUgQ1JMRiBhdCB0aGUgZW5kIG9mIHRoZSBjaHVuay4KICAgICAgICAgICAgc2VsZi5jaHVua19sZWZ0ID0gTm9uZQogICAgICAgICAgICByZXR1cm5lZF9jaHVuayA9IHZhbHVlCiAgICAgICAgZWxzZTogICMgYW10ID4gc2VsZi5jaHVua19sZWZ0CiAgICAgICAgICAgIHJldHVybmVkX2NodW5rID0gc2VsZi5fZnAuX3NhZmVfcmVhZChzZWxmLmNodW5rX2xlZnQpCiAgICAgICAgICAgIHNlbGYuX2ZwLl9zYWZlX3JlYWQoMikgICMgVG9zcyB0aGUgQ1JMRiBhdCB0aGUgZW5kIG9mIHRoZSBjaHVuay4KICAgICAgICAgICAgc2VsZi5jaHVua19sZWZ0ID0gTm9uZQogICAgICAgIHJldHVybiByZXR1cm5lZF9jaHVuawoKICAgIGRlZiByZWFkX2NodW5rZWQoc2VsZiwgYW10PU5vbmUsIGRlY29kZV9jb250ZW50PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFNpbWlsYXIgdG8gOm1ldGg6YEhUVFBSZXNwb25zZS5yZWFkYCwgYnV0IHdpdGggYW4gYWRkaXRpb25hbAogICAgICAgIHBhcmFtZXRlcjogYGBkZWNvZGVfY29udGVudGBgLgoKICAgICAgICA6cGFyYW0gZGVjb2RlX2NvbnRlbnQ6CiAgICAgICAgICAgIElmIFRydWUsIHdpbGwgYXR0ZW1wdCB0byBkZWNvZGUgdGhlIGJvZHkgYmFzZWQgb24gdGhlCiAgICAgICAgICAgICdjb250ZW50LWVuY29kaW5nJyBoZWFkZXIuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5faW5pdF9kZWNvZGVyKCkKICAgICAgICAjIEZJWE1FOiBSZXdyaXRlIHRoaXMgbWV0aG9kIGFuZCBtYWtlIGl0IGEgY2xhc3Mgd2l0aCBhIGJldHRlciBzdHJ1Y3R1cmVkIGxvZ2ljLgogICAgICAgIGlmIG5vdCBzZWxmLmNodW5rZWQ6CiAgICAgICAgICAgIHJhaXNlIFJlc3BvbnNlTm90Q2h1bmtlZCgKICAgICAgICAgICAgICAgICJSZXNwb25zZSBpcyBub3QgY2h1bmtlZC4gIgogICAgICAgICAgICAgICAgIkhlYWRlciAndHJhbnNmZXItZW5jb2Rpbmc6IGNodW5rZWQnIGlzIG1pc3NpbmcuIikKICAgICAgICBpZiBub3Qgc2VsZi5zdXBwb3J0c19jaHVua2VkX3JlYWRzKCk6CiAgICAgICAgICAgIHJhaXNlIEJvZHlOb3RIdHRwbGliQ29tcGF0aWJsZSgKICAgICAgICAgICAgICAgICJCb2R5IHNob3VsZCBiZSBodHRwbGliLkhUVFBSZXNwb25zZSBsaWtlLiAiCiAgICAgICAgICAgICAgICAiSXQgc2hvdWxkIGhhdmUgaGF2ZSBhbiBmcCBhdHRyaWJ1dGUgd2hpY2ggcmV0dXJucyByYXcgY2h1bmtzLiIpCgogICAgICAgICMgRG9uJ3QgYm90aGVyIHJlYWRpbmcgdGhlIGJvZHkgb2YgYSBIRUFEIHJlcXVlc3QuCiAgICAgICAgaWYgc2VsZi5fb3JpZ2luYWxfcmVzcG9uc2UgYW5kIGlzX3Jlc3BvbnNlX3RvX2hlYWQoc2VsZi5fb3JpZ2luYWxfcmVzcG9uc2UpOgogICAgICAgICAgICBzZWxmLl9vcmlnaW5hbF9yZXNwb25zZS5jbG9zZSgpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB3aXRoIHNlbGYuX2Vycm9yX2NhdGNoZXIoKToKICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIHNlbGYuX3VwZGF0ZV9jaHVua19sZW5ndGgoKQogICAgICAgICAgICAgICAgaWYgc2VsZi5jaHVua19sZWZ0ID09IDA6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGNodW5rID0gc2VsZi5faGFuZGxlX2NodW5rKGFtdCkKICAgICAgICAgICAgICAgIGRlY29kZWQgPSBzZWxmLl9kZWNvZGUoY2h1bmssIGRlY29kZV9jb250ZW50PWRlY29kZV9jb250ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaF9kZWNvZGVyPUZhbHNlKQogICAgICAgICAgICAgICAgaWYgZGVjb2RlZDoKICAgICAgICAgICAgICAgICAgICB5aWVsZCBkZWNvZGVkCgogICAgICAgICAgICBpZiBkZWNvZGVfY29udGVudDoKICAgICAgICAgICAgICAgICMgT24gQ1B5dGhvbiBhbmQgUHlQeSwgd2Ugc2hvdWxkIG5ldmVyIG5lZWQgdG8gZmx1c2ggdGhlCiAgICAgICAgICAgICAgICAjIGRlY29kZXIuIEhvd2V2ZXIsIG9uIEp5dGhvbiB3ZSAqbWlnaHQqIG5lZWQgdG8sIHNvCiAgICAgICAgICAgICAgICAjIGxldHMgZGVmZW5zaXZlbHkgZG8gaXQgYW55d2F5LgogICAgICAgICAgICAgICAgZGVjb2RlZCA9IHNlbGYuX2ZsdXNoX2RlY29kZXIoKQogICAgICAgICAgICAgICAgaWYgZGVjb2RlZDogICMgUGxhdGZvcm0tc3BlY2lmaWM6IEp5dGhvbi4KICAgICAgICAgICAgICAgICAgICB5aWVsZCBkZWNvZGVkCgogICAgICAgICAgICAjIENodW5rIGNvbnRlbnQgZW5kcyB3aXRoIFxyXG46IGRpc2NhcmQgaXQuCiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5fZnAuZnAucmVhZGxpbmUoKQogICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6CiAgICAgICAgICAgICAgICAgICAgIyBTb21lIHNpdGVzIG1heSBub3QgZW5kIHdpdGggJ1xyXG4nLgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBpZiBsaW5lID09IGInXHJcbic6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgICAgICMgV2UgcmVhZCBldmVyeXRoaW5nOyBjbG9zZSB0aGUgImZpbGUiLgogICAgICAgICAgICBpZiBzZWxmLl9vcmlnaW5hbF9yZXNwb25zZToKICAgICAgICAgICAgICAgIHNlbGYuX29yaWdpbmFsX3Jlc3BvbnNlLmNsb3NlKCkKUEsDBBQAAAAAAAAAIQBSdeG/FAQAABQEAAA0AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9fX2luaXRfXy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CiMgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBwcm92aWRlIGltcG9ydHMgdGhhdCB1c2VkIHRvIGJlIGhlcmUuCmZyb20gLmNvbm5lY3Rpb24gaW1wb3J0IGlzX2Nvbm5lY3Rpb25fZHJvcHBlZApmcm9tIC5yZXF1ZXN0IGltcG9ydCBtYWtlX2hlYWRlcnMKZnJvbSAucmVzcG9uc2UgaW1wb3J0IGlzX2ZwX2Nsb3NlZApmcm9tIC5zc2xfIGltcG9ydCAoCiAgICBTU0xDb250ZXh0LAogICAgSEFTX1NOSSwKICAgIElTX1BZT1BFTlNTTCwKICAgIElTX1NFQ1VSRVRSQU5TUE9SVCwKICAgIGFzc2VydF9maW5nZXJwcmludCwKICAgIHJlc29sdmVfY2VydF9yZXFzLAogICAgcmVzb2x2ZV9zc2xfdmVyc2lvbiwKICAgIHNzbF93cmFwX3NvY2tldCwKKQpmcm9tIC50aW1lb3V0IGltcG9ydCAoCiAgICBjdXJyZW50X3RpbWUsCiAgICBUaW1lb3V0LAopCgpmcm9tIC5yZXRyeSBpbXBvcnQgUmV0cnkKZnJvbSAudXJsIGltcG9ydCAoCiAgICBnZXRfaG9zdCwKICAgIHBhcnNlX3VybCwKICAgIHNwbGl0X2ZpcnN0LAogICAgVXJsLAopCmZyb20gLndhaXQgaW1wb3J0ICgKICAgIHdhaXRfZm9yX3JlYWQsCiAgICB3YWl0X2Zvcl93cml0ZQopCgpfX2FsbF9fID0gKAogICAgJ0hBU19TTkknLAogICAgJ0lTX1BZT1BFTlNTTCcsCiAgICAnSVNfU0VDVVJFVFJBTlNQT1JUJywKICAgICdTU0xDb250ZXh0JywKICAgICdSZXRyeScsCiAgICAnVGltZW91dCcsCiAgICAnVXJsJywKICAgICdhc3NlcnRfZmluZ2VycHJpbnQnLAogICAgJ2N1cnJlbnRfdGltZScsCiAgICAnaXNfY29ubmVjdGlvbl9kcm9wcGVkJywKICAgICdpc19mcF9jbG9zZWQnLAogICAgJ2dldF9ob3N0JywKICAgICdwYXJzZV91cmwnLAogICAgJ21ha2VfaGVhZGVycycsCiAgICAncmVzb2x2ZV9jZXJ0X3JlcXMnLAogICAgJ3Jlc29sdmVfc3NsX3ZlcnNpb24nLAogICAgJ3NwbGl0X2ZpcnN0JywKICAgICdzc2xfd3JhcF9zb2NrZXQnLAogICAgJ3dhaXRfZm9yX3JlYWQnLAogICAgJ3dhaXRfZm9yX3dyaXRlJwopClBLAwQUAAAAAAAAACEAq59fPY0QAACNEAAANgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvY29ubmVjdGlvbi5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmltcG9ydCBzb2NrZXQKZnJvbSAud2FpdCBpbXBvcnQgd2FpdF9mb3JfcmVhZApmcm9tIC5zZWxlY3RvcnMgaW1wb3J0IEhBU19TRUxFQ1QsIFNlbGVjdG9yRXJyb3IKCgpkZWYgaXNfY29ubmVjdGlvbl9kcm9wcGVkKGNvbm4pOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYwogICAgIiIiCiAgICBSZXR1cm5zIFRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgZHJvcHBlZCBhbmQgc2hvdWxkIGJlIGNsb3NlZC4KCiAgICA6cGFyYW0gY29ubjoKICAgICAgICA6Y2xhc3M6YGh0dHBsaWIuSFRUUENvbm5lY3Rpb25gIG9iamVjdC4KCiAgICBOb3RlOiBGb3IgcGxhdGZvcm1zIGxpa2UgQXBwRW5naW5lLCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiBgYEZhbHNlYGAgdG8KICAgIGxldCB0aGUgcGxhdGZvcm0gaGFuZGxlIGNvbm5lY3Rpb24gcmVjeWNsaW5nIHRyYW5zcGFyZW50bHkgZm9yIHVzLgogICAgIiIiCiAgICBzb2NrID0gZ2V0YXR0cihjb25uLCAnc29jaycsIEZhbHNlKQogICAgaWYgc29jayBpcyBGYWxzZTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IEFwcEVuZ2luZQogICAgICAgIHJldHVybiBGYWxzZQogICAgaWYgc29jayBpcyBOb25lOiAgIyBDb25uZWN0aW9uIGFscmVhZHkgY2xvc2VkIChzdWNoIGFzIGJ5IGh0dHBsaWIpLgogICAgICAgIHJldHVybiBUcnVlCgogICAgaWYgbm90IEhBU19TRUxFQ1Q6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgdHJ5OgogICAgICAgIHJldHVybiBib29sKHdhaXRfZm9yX3JlYWQoc29jaywgdGltZW91dD0wLjApKQogICAgZXhjZXB0IFNlbGVjdG9yRXJyb3I6CiAgICAgICAgcmV0dXJuIFRydWUKCgojIFRoaXMgZnVuY3Rpb24gaXMgY29waWVkIGZyb20gc29ja2V0LnB5IGluIHRoZSBQeXRob24gMi43IHN0YW5kYXJkCiMgbGlicmFyeSB0ZXN0IHN1aXRlLiBBZGRlZCB0byBpdHMgc2lnbmF0dXJlIGlzIG9ubHkgYHNvY2tldF9vcHRpb25zYC4KIyBPbmUgYWRkaXRpb25hbCBtb2RpZmljYXRpb24gaXMgdGhhdCB3ZSBhdm9pZCBiaW5kaW5nIHRvIElQdjYgc2VydmVycwojIGRpc2NvdmVyZWQgaW4gRE5TIGlmIHRoZSBzeXN0ZW0gZG9lc24ndCBoYXZlIElQdjYgZnVuY3Rpb25hbGl0eS4KZGVmIGNyZWF0ZV9jb25uZWN0aW9uKGFkZHJlc3MsIHRpbWVvdXQ9c29ja2V0Ll9HTE9CQUxfREVGQVVMVF9USU1FT1VULAogICAgICAgICAgICAgICAgICAgICAgc291cmNlX2FkZHJlc3M9Tm9uZSwgc29ja2V0X29wdGlvbnM9Tm9uZSk6CiAgICAiIiJDb25uZWN0IHRvICphZGRyZXNzKiBhbmQgcmV0dXJuIHRoZSBzb2NrZXQgb2JqZWN0LgoKICAgIENvbnZlbmllbmNlIGZ1bmN0aW9uLiAgQ29ubmVjdCB0byAqYWRkcmVzcyogKGEgMi10dXBsZSBgYChob3N0LAogICAgcG9ydClgYCkgYW5kIHJldHVybiB0aGUgc29ja2V0IG9iamVjdC4gIFBhc3NpbmcgdGhlIG9wdGlvbmFsCiAgICAqdGltZW91dCogcGFyYW1ldGVyIHdpbGwgc2V0IHRoZSB0aW1lb3V0IG9uIHRoZSBzb2NrZXQgaW5zdGFuY2UKICAgIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGNvbm5lY3QuICBJZiBubyAqdGltZW91dCogaXMgc3VwcGxpZWQsIHRoZQogICAgZ2xvYmFsIGRlZmF1bHQgdGltZW91dCBzZXR0aW5nIHJldHVybmVkIGJ5IDpmdW5jOmBnZXRkZWZhdWx0dGltZW91dGAKICAgIGlzIHVzZWQuICBJZiAqc291cmNlX2FkZHJlc3MqIGlzIHNldCBpdCBtdXN0IGJlIGEgdHVwbGUgb2YgKGhvc3QsIHBvcnQpCiAgICBmb3IgdGhlIHNvY2tldCB0byBiaW5kIGFzIGEgc291cmNlIGFkZHJlc3MgYmVmb3JlIG1ha2luZyB0aGUgY29ubmVjdGlvbi4KICAgIEFuIGhvc3Qgb2YgJycgb3IgcG9ydCAwIHRlbGxzIHRoZSBPUyB0byB1c2UgdGhlIGRlZmF1bHQuCiAgICAiIiIKCiAgICBob3N0LCBwb3J0ID0gYWRkcmVzcwogICAgaWYgaG9zdC5zdGFydHN3aXRoKCdbJyk6CiAgICAgICAgaG9zdCA9IGhvc3Quc3RyaXAoJ1tdJykKICAgIGVyciA9IE5vbmUKCiAgICAjIFVzaW5nIHRoZSB2YWx1ZSBmcm9tIGFsbG93ZWRfZ2FpX2ZhbWlseSgpIGluIHRoZSBjb250ZXh0IG9mIGdldGFkZHJpbmZvIGxldHMKICAgICMgdXMgc2VsZWN0IHdoZXRoZXIgdG8gd29yayB3aXRoIElQdjQgRE5TIHJlY29yZHMsIElQdjYgcmVjb3Jkcywgb3IgYm90aC4KICAgICMgVGhlIG9yaWdpbmFsIGNyZWF0ZV9jb25uZWN0aW9uIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIGFsbCByZWNvcmRzLgogICAgZmFtaWx5ID0gYWxsb3dlZF9nYWlfZmFtaWx5KCkKCiAgICBmb3IgcmVzIGluIHNvY2tldC5nZXRhZGRyaW5mbyhob3N0LCBwb3J0LCBmYW1pbHksIHNvY2tldC5TT0NLX1NUUkVBTSk6CiAgICAgICAgYWYsIHNvY2t0eXBlLCBwcm90bywgY2Fub25uYW1lLCBzYSA9IHJlcwogICAgICAgIHNvY2sgPSBOb25lCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChhZiwgc29ja3R5cGUsIHByb3RvKQoKICAgICAgICAgICAgIyBJZiBwcm92aWRlZCwgc2V0IHNvY2tldCBsZXZlbCBvcHRpb25zIGJlZm9yZSBjb25uZWN0aW5nLgogICAgICAgICAgICBfc2V0X3NvY2tldF9vcHRpb25zKHNvY2ssIHNvY2tldF9vcHRpb25zKQoKICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3Qgc29ja2V0Ll9HTE9CQUxfREVGQVVMVF9USU1FT1VUOgogICAgICAgICAgICAgICAgc29jay5zZXR0aW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgIGlmIHNvdXJjZV9hZGRyZXNzOgogICAgICAgICAgICAgICAgc29jay5iaW5kKHNvdXJjZV9hZGRyZXNzKQogICAgICAgICAgICBzb2NrLmNvbm5lY3Qoc2EpCiAgICAgICAgICAgIHJldHVybiBzb2NrCgogICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZToKICAgICAgICAgICAgZXJyID0gZQogICAgICAgICAgICBpZiBzb2NrIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc29jay5jbG9zZSgpCiAgICAgICAgICAgICAgICBzb2NrID0gTm9uZQoKICAgIGlmIGVyciBpcyBub3QgTm9uZToKICAgICAgICByYWlzZSBlcnIKCiAgICByYWlzZSBzb2NrZXQuZXJyb3IoImdldGFkZHJpbmZvIHJldHVybnMgYW4gZW1wdHkgbGlzdCIpCgoKZGVmIF9zZXRfc29ja2V0X29wdGlvbnMoc29jaywgb3B0aW9ucyk6CiAgICBpZiBvcHRpb25zIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuCgogICAgZm9yIG9wdCBpbiBvcHRpb25zOgogICAgICAgIHNvY2suc2V0c29ja29wdCgqb3B0KQoKCmRlZiBhbGxvd2VkX2dhaV9mYW1pbHkoKToKICAgICIiIlRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gd29yayBpbiB0aGUgY29udGV4dCBvZgogICAgZ2V0YWRkcmluZm8sIHdoZXJlIGZhbWlseT1zb2NrZXQuQUZfVU5TUEVDIGlzIHRoZSBkZWZhdWx0IGFuZAogICAgd2lsbCBwZXJmb3JtIGEgRE5TIHNlYXJjaCBmb3IgYm90aCBJUHY2IGFuZCBJUHY0IHJlY29yZHMuIiIiCgogICAgZmFtaWx5ID0gc29ja2V0LkFGX0lORVQKICAgIGlmIEhBU19JUFY2OgogICAgICAgIGZhbWlseSA9IHNvY2tldC5BRl9VTlNQRUMKICAgIHJldHVybiBmYW1pbHkKCgpkZWYgX2hhc19pcHY2KGhvc3QpOgogICAgIiIiIFJldHVybnMgVHJ1ZSBpZiB0aGUgc3lzdGVtIGNhbiBiaW5kIGFuIElQdjYgYWRkcmVzcy4gIiIiCiAgICBzb2NrID0gTm9uZQogICAgaGFzX2lwdjYgPSBGYWxzZQoKICAgIGlmIHNvY2tldC5oYXNfaXB2NjoKICAgICAgICAjIGhhc19pcHY2IHJldHVybnMgdHJ1ZSBpZiBjUHl0aG9uIHdhcyBjb21waWxlZCB3aXRoIElQdjYgc3VwcG9ydC4KICAgICAgICAjIEl0IGRvZXMgbm90IHRlbGwgdXMgaWYgdGhlIHN5c3RlbSBoYXMgSVB2NiBzdXBwb3J0IGVuYWJsZWQuIFRvCiAgICAgICAgIyBkZXRlcm1pbmUgdGhhdCB3ZSBtdXN0IGJpbmQgdG8gYW4gSVB2NiBhZGRyZXNzLgogICAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3NoYXpvdy91cmxsaWIzL3B1bGwvNjExCiAgICAgICAgIyBodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTY1ODMyNwogICAgICAgIHRyeToKICAgICAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQ2KQogICAgICAgICAgICBzb2NrLmJpbmQoKGhvc3QsIDApKQogICAgICAgICAgICBoYXNfaXB2NiA9IFRydWUKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgogICAgaWYgc29jazoKICAgICAgICBzb2NrLmNsb3NlKCkKICAgIHJldHVybiBoYXNfaXB2NgoKCkhBU19JUFY2ID0gX2hhc19pcHY2KCc6OjEnKQpQSwMEFAAAAAAAAAAhAEFhkNd5DgAAeQ4AADMAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3JlcXVlc3QucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydApmcm9tIGJhc2U2NCBpbXBvcnQgYjY0ZW5jb2RlCgpmcm9tIC4ucGFja2FnZXMuc2l4IGltcG9ydCBiLCBpbnRlZ2VyX3R5cGVzCmZyb20gLi5leGNlcHRpb25zIGltcG9ydCBVbnJld2luZGFibGVCb2R5RXJyb3IKCkFDQ0VQVF9FTkNPRElORyA9ICdnemlwLGRlZmxhdGUnCl9GQUlMRURURUxMID0gb2JqZWN0KCkKCgpkZWYgbWFrZV9oZWFkZXJzKGtlZXBfYWxpdmU9Tm9uZSwgYWNjZXB0X2VuY29kaW5nPU5vbmUsIHVzZXJfYWdlbnQ9Tm9uZSwKICAgICAgICAgICAgICAgICBiYXNpY19hdXRoPU5vbmUsIHByb3h5X2Jhc2ljX2F1dGg9Tm9uZSwgZGlzYWJsZV9jYWNoZT1Ob25lKToKICAgICIiIgogICAgU2hvcnRjdXRzIGZvciBnZW5lcmF0aW5nIHJlcXVlc3QgaGVhZGVycy4KCiAgICA6cGFyYW0ga2VlcF9hbGl2ZToKICAgICAgICBJZiBgYFRydWVgYCwgYWRkcyAnY29ubmVjdGlvbjoga2VlcC1hbGl2ZScgaGVhZGVyLgoKICAgIDpwYXJhbSBhY2NlcHRfZW5jb2Rpbmc6CiAgICAgICAgQ2FuIGJlIGEgYm9vbGVhbiwgbGlzdCwgb3Igc3RyaW5nLgogICAgICAgIGBgVHJ1ZWBgIHRyYW5zbGF0ZXMgdG8gJ2d6aXAsZGVmbGF0ZScuCiAgICAgICAgTGlzdCB3aWxsIGdldCBqb2luZWQgYnkgY29tbWEuCiAgICAgICAgU3RyaW5nIHdpbGwgYmUgdXNlZCBhcyBwcm92aWRlZC4KCiAgICA6cGFyYW0gdXNlcl9hZ2VudDoKICAgICAgICBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB1c2VyLWFnZW50IHlvdSB3YW50LCBzdWNoIGFzCiAgICAgICAgInB5dGhvbi11cmxsaWIzLzAuNiIKCiAgICA6cGFyYW0gYmFzaWNfYXV0aDoKICAgICAgICBDb2xvbi1zZXBhcmF0ZWQgdXNlcm5hbWU6cGFzc3dvcmQgc3RyaW5nIGZvciAnYXV0aG9yaXphdGlvbjogYmFzaWMgLi4uJwogICAgICAgIGF1dGggaGVhZGVyLgoKICAgIDpwYXJhbSBwcm94eV9iYXNpY19hdXRoOgogICAgICAgIENvbG9uLXNlcGFyYXRlZCB1c2VybmFtZTpwYXNzd29yZCBzdHJpbmcgZm9yICdwcm94eS1hdXRob3JpemF0aW9uOiBiYXNpYyAuLi4nCiAgICAgICAgYXV0aCBoZWFkZXIuCgogICAgOnBhcmFtIGRpc2FibGVfY2FjaGU6CiAgICAgICAgSWYgYGBUcnVlYGAsIGFkZHMgJ2NhY2hlLWNvbnRyb2w6IG5vLWNhY2hlJyBoZWFkZXIuCgogICAgRXhhbXBsZTo6CgogICAgICAgID4+PiBtYWtlX2hlYWRlcnMoa2VlcF9hbGl2ZT1UcnVlLCB1c2VyX2FnZW50PSJCYXRtYW4vMS4wIikKICAgICAgICB7J2Nvbm5lY3Rpb24nOiAna2VlcC1hbGl2ZScsICd1c2VyLWFnZW50JzogJ0JhdG1hbi8xLjAnfQogICAgICAgID4+PiBtYWtlX2hlYWRlcnMoYWNjZXB0X2VuY29kaW5nPVRydWUpCiAgICAgICAgeydhY2NlcHQtZW5jb2RpbmcnOiAnZ3ppcCxkZWZsYXRlJ30KICAgICIiIgogICAgaGVhZGVycyA9IHt9CiAgICBpZiBhY2NlcHRfZW5jb2Rpbmc6CiAgICAgICAgaWYgaXNpbnN0YW5jZShhY2NlcHRfZW5jb2RpbmcsIHN0cik6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbGlmIGlzaW5zdGFuY2UoYWNjZXB0X2VuY29kaW5nLCBsaXN0KToKICAgICAgICAgICAgYWNjZXB0X2VuY29kaW5nID0gJywnLmpvaW4oYWNjZXB0X2VuY29kaW5nKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFjY2VwdF9lbmNvZGluZyA9IEFDQ0VQVF9FTkNPRElORwogICAgICAgIGhlYWRlcnNbJ2FjY2VwdC1lbmNvZGluZyddID0gYWNjZXB0X2VuY29kaW5nCgogICAgaWYgdXNlcl9hZ2VudDoKICAgICAgICBoZWFkZXJzWyd1c2VyLWFnZW50J10gPSB1c2VyX2FnZW50CgogICAgaWYga2VlcF9hbGl2ZToKICAgICAgICBoZWFkZXJzWydjb25uZWN0aW9uJ10gPSAna2VlcC1hbGl2ZScKCiAgICBpZiBiYXNpY19hdXRoOgogICAgICAgIGhlYWRlcnNbJ2F1dGhvcml6YXRpb24nXSA9ICdCYXNpYyAnICsgXAogICAgICAgICAgICBiNjRlbmNvZGUoYihiYXNpY19hdXRoKSkuZGVjb2RlKCd1dGYtOCcpCgogICAgaWYgcHJveHlfYmFzaWNfYXV0aDoKICAgICAgICBoZWFkZXJzWydwcm94eS1hdXRob3JpemF0aW9uJ10gPSAnQmFzaWMgJyArIFwKICAgICAgICAgICAgYjY0ZW5jb2RlKGIocHJveHlfYmFzaWNfYXV0aCkpLmRlY29kZSgndXRmLTgnKQoKICAgIGlmIGRpc2FibGVfY2FjaGU6CiAgICAgICAgaGVhZGVyc1snY2FjaGUtY29udHJvbCddID0gJ25vLWNhY2hlJwoKICAgIHJldHVybiBoZWFkZXJzCgoKZGVmIHNldF9maWxlX3Bvc2l0aW9uKGJvZHksIHBvcyk6CiAgICAiIiIKICAgIElmIGEgcG9zaXRpb24gaXMgcHJvdmlkZWQsIG1vdmUgZmlsZSB0byB0aGF0IHBvaW50LgogICAgT3RoZXJ3aXNlLCB3ZSdsbCBhdHRlbXB0IHRvIHJlY29yZCBhIHBvc2l0aW9uIGZvciBmdXR1cmUgdXNlLgogICAgIiIiCiAgICBpZiBwb3MgaXMgbm90IE5vbmU6CiAgICAgICAgcmV3aW5kX2JvZHkoYm9keSwgcG9zKQogICAgZWxpZiBnZXRhdHRyKGJvZHksICd0ZWxsJywgTm9uZSkgaXMgbm90IE5vbmU6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBwb3MgPSBib2R5LnRlbGwoKQogICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgT1NFcnJvcik6CiAgICAgICAgICAgICMgVGhpcyBkaWZmZXJlbnRpYXRlcyBmcm9tIE5vbmUsIGFsbG93aW5nIHVzIHRvIGNhdGNoCiAgICAgICAgICAgICMgYSBmYWlsZWQgYHRlbGwoKWAgbGF0ZXIgd2hlbiB0cnlpbmcgdG8gcmV3aW5kIHRoZSBib2R5LgogICAgICAgICAgICBwb3MgPSBfRkFJTEVEVEVMTAoKICAgIHJldHVybiBwb3MKCgpkZWYgcmV3aW5kX2JvZHkoYm9keSwgYm9keV9wb3MpOgogICAgIiIiCiAgICBBdHRlbXB0IHRvIHJld2luZCBib2R5IHRvIGEgY2VydGFpbiBwb3NpdGlvbi4KICAgIFByaW1hcmlseSB1c2VkIGZvciByZXF1ZXN0IHJlZGlyZWN0cyBhbmQgcmV0cmllcy4KCiAgICA6cGFyYW0gYm9keToKICAgICAgICBGaWxlLWxpa2Ugb2JqZWN0IHRoYXQgc3VwcG9ydHMgc2Vlay4KCiAgICA6cGFyYW0gaW50IHBvczoKICAgICAgICBQb3NpdGlvbiB0byBzZWVrIHRvIGluIGZpbGUuCiAgICAiIiIKICAgIGJvZHlfc2VlayA9IGdldGF0dHIoYm9keSwgJ3NlZWsnLCBOb25lKQogICAgaWYgYm9keV9zZWVrIGlzIG5vdCBOb25lIGFuZCBpc2luc3RhbmNlKGJvZHlfcG9zLCBpbnRlZ2VyX3R5cGVzKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGJvZHlfc2Vlayhib2R5X3BvcykKICAgICAgICBleGNlcHQgKElPRXJyb3IsIE9TRXJyb3IpOgogICAgICAgICAgICByYWlzZSBVbnJld2luZGFibGVCb2R5RXJyb3IoIkFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmV3aW5kaW5nIHJlcXVlc3QgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvZHkgZm9yIHJlZGlyZWN0L3JldHJ5LiIpCiAgICBlbGlmIGJvZHlfcG9zIGlzIF9GQUlMRURURUxMOgogICAgICAgIHJhaXNlIFVucmV3aW5kYWJsZUJvZHlFcnJvcigiVW5hYmxlIHRvIHJlY29yZCBmaWxlIHBvc2l0aW9uIGZvciByZXdpbmRpbmcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWVzdCBib2R5IGR1cmluZyBhIHJlZGlyZWN0L3JldHJ5LiIpCiAgICBlbHNlOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImJvZHlfcG9zIG11c3QgYmUgb2YgdHlwZSBpbnRlZ2VyLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGVhZCBpdCB3YXMgJXMuIiAlIHR5cGUoYm9keV9wb3MpKQpQSwMEFAAAAAAAAAAhAPQ5HJ8nCQAAJwkAADQAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3Jlc3BvbnNlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKZnJvbSAuLnBhY2thZ2VzLnNpeC5tb3ZlcyBpbXBvcnQgaHR0cF9jbGllbnQgYXMgaHR0cGxpYgoKZnJvbSAuLmV4Y2VwdGlvbnMgaW1wb3J0IEhlYWRlclBhcnNpbmdFcnJvcgoKCmRlZiBpc19mcF9jbG9zZWQob2JqKToKICAgICIiIgogICAgQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBmaWxlLWxpa2Ugb2JqZWN0IGlzIGNsb3NlZC4KCiAgICA6cGFyYW0gb2JqOgogICAgICAgIFRoZSBmaWxlLWxpa2Ugb2JqZWN0IHRvIGNoZWNrLgogICAgIiIiCgogICAgdHJ5OgogICAgICAgICMgQ2hlY2sgYGlzY2xvc2VkKClgIGZpcnN0LCBpbiBjYXNlIFB5dGhvbjMgZG9lc24ndCBzZXQgYGNsb3NlZGAuCiAgICAgICAgIyBHSCBJc3N1ZSAjOTI4CiAgICAgICAgcmV0dXJuIG9iai5pc2Nsb3NlZCgpCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgcGFzcwoKICAgIHRyeToKICAgICAgICAjIENoZWNrIHZpYSB0aGUgb2ZmaWNpYWwgZmlsZS1saWtlLW9iamVjdCB3YXkuCiAgICAgICAgcmV0dXJuIG9iai5jbG9zZWQKICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICBwYXNzCgogICAgdHJ5OgogICAgICAgICMgQ2hlY2sgaWYgdGhlIG9iamVjdCBpcyBhIGNvbnRhaW5lciBmb3IgYW5vdGhlciBmaWxlLWxpa2Ugb2JqZWN0IHRoYXQKICAgICAgICAjIGdldHMgcmVsZWFzZWQgb24gZXhoYXVzdGlvbiAoZS5nLiBIVFRQUmVzcG9uc2UpLgogICAgICAgIHJldHVybiBvYmouZnAgaXMgTm9uZQogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHBhc3MKCiAgICByYWlzZSBWYWx1ZUVycm9yKCJVbmFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgZnAgaXMgY2xvc2VkLiIpCgoKZGVmIGFzc2VydF9oZWFkZXJfcGFyc2luZyhoZWFkZXJzKToKICAgICIiIgogICAgQXNzZXJ0cyB3aGV0aGVyIGFsbCBoZWFkZXJzIGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgcGFyc2VkLgogICAgRXh0cmFjdHMgZW5jb3VudGVyZWQgZXJyb3JzIGZyb20gdGhlIHJlc3VsdCBvZiBwYXJzaW5nIGhlYWRlcnMuCgogICAgT25seSB3b3JrcyBvbiBQeXRob24gMy4KCiAgICA6cGFyYW0gaGVhZGVyczogSGVhZGVycyB0byB2ZXJpZnkuCiAgICA6dHlwZSBoZWFkZXJzOiBgaHR0cGxpYi5IVFRQTWVzc2FnZWAuCgogICAgOnJhaXNlcyB1cmxsaWIzLmV4Y2VwdGlvbnMuSGVhZGVyUGFyc2luZ0Vycm9yOgogICAgICAgIElmIHBhcnNpbmcgZXJyb3JzIGFyZSBmb3VuZC4KICAgICIiIgoKICAgICMgVGhpcyB3aWxsIGZhaWwgc2lsZW50bHkgaWYgd2UgcGFzcyBpbiB0aGUgd3Jvbmcga2luZCBvZiBwYXJhbWV0ZXIuCiAgICAjIFRvIG1ha2UgZGVidWdnaW5nIGVhc2llciBhZGQgYW4gZXhwbGljaXQgY2hlY2suCiAgICBpZiBub3QgaXNpbnN0YW5jZShoZWFkZXJzLCBodHRwbGliLkhUVFBNZXNzYWdlKToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2V4cGVjdGVkIGh0dHBsaWIuTWVzc2FnZSwgZ290IHswfS4nLmZvcm1hdCgKICAgICAgICAgICAgdHlwZShoZWFkZXJzKSkpCgogICAgZGVmZWN0cyA9IGdldGF0dHIoaGVhZGVycywgJ2RlZmVjdHMnLCBOb25lKQogICAgZ2V0X3BheWxvYWQgPSBnZXRhdHRyKGhlYWRlcnMsICdnZXRfcGF5bG9hZCcsIE5vbmUpCgogICAgdW5wYXJzZWRfZGF0YSA9IE5vbmUKICAgIGlmIGdldF9wYXlsb2FkOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDMuCiAgICAgICAgdW5wYXJzZWRfZGF0YSA9IGdldF9wYXlsb2FkKCkKCiAgICBpZiBkZWZlY3RzIG9yIHVucGFyc2VkX2RhdGE6CiAgICAgICAgcmFpc2UgSGVhZGVyUGFyc2luZ0Vycm9yKGRlZmVjdHM9ZGVmZWN0cywgdW5wYXJzZWRfZGF0YT11bnBhcnNlZF9kYXRhKQoKCmRlZiBpc19yZXNwb25zZV90b19oZWFkKHJlc3BvbnNlKToKICAgICIiIgogICAgQ2hlY2tzIHdoZXRoZXIgdGhlIHJlcXVlc3Qgb2YgYSByZXNwb25zZSBoYXMgYmVlbiBhIEhFQUQtcmVxdWVzdC4KICAgIEhhbmRsZXMgdGhlIHF1aXJrcyBvZiBBcHBFbmdpbmUuCgogICAgOnBhcmFtIGNvbm46CiAgICA6dHlwZSBjb25uOiA6Y2xhc3M6YGh0dHBsaWIuSFRUUFJlc3BvbnNlYAogICAgIiIiCiAgICAjIEZJWE1FOiBDYW4gd2UgZG8gdGhpcyBzb21laG93IHdpdGhvdXQgYWNjZXNzaW5nIHByaXZhdGUgaHR0cGxpYiBfbWV0aG9kPwogICAgbWV0aG9kID0gcmVzcG9uc2UuX21ldGhvZAogICAgaWYgaXNpbnN0YW5jZShtZXRob2QsIGludCk6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBBcHBlbmdpbmUKICAgICAgICByZXR1cm4gbWV0aG9kID09IDMKICAgIHJldHVybiBtZXRob2QudXBwZXIoKSA9PSAnSEVBRCcKUEsDBBQAAAAAAAAAIQA9Ye/bCTkAAAk5AAAxAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9yZXRyeS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmltcG9ydCB0aW1lCmltcG9ydCBsb2dnaW5nCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKZnJvbSBpdGVydG9vbHMgaW1wb3J0IHRha2V3aGlsZQppbXBvcnQgZW1haWwKaW1wb3J0IHJlCgpmcm9tIC4uZXhjZXB0aW9ucyBpbXBvcnQgKAogICAgQ29ubmVjdFRpbWVvdXRFcnJvciwKICAgIE1heFJldHJ5RXJyb3IsCiAgICBQcm90b2NvbEVycm9yLAogICAgUmVhZFRpbWVvdXRFcnJvciwKICAgIFJlc3BvbnNlRXJyb3IsCiAgICBJbnZhbGlkSGVhZGVyLAopCmZyb20gLi5wYWNrYWdlcyBpbXBvcnQgc2l4CgoKbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgojIERhdGEgc3RydWN0dXJlIGZvciByZXByZXNlbnRpbmcgdGhlIG1ldGFkYXRhIG9mIHJlcXVlc3RzIHRoYXQgcmVzdWx0IGluIGEgcmV0cnkuClJlcXVlc3RIaXN0b3J5ID0gbmFtZWR0dXBsZSgnUmVxdWVzdEhpc3RvcnknLCBbIm1ldGhvZCIsICJ1cmwiLCAiZXJyb3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0dXMiLCAicmVkaXJlY3RfbG9jYXRpb24iXSkKCgpjbGFzcyBSZXRyeShvYmplY3QpOgogICAgIiIiIFJldHJ5IGNvbmZpZ3VyYXRpb24uCgogICAgRWFjaCByZXRyeSBhdHRlbXB0IHdpbGwgY3JlYXRlIGEgbmV3IFJldHJ5IG9iamVjdCB3aXRoIHVwZGF0ZWQgdmFsdWVzLCBzbwogICAgdGhleSBjYW4gYmUgc2FmZWx5IHJldXNlZC4KCiAgICBSZXRyaWVzIGNhbiBiZSBkZWZpbmVkIGFzIGEgZGVmYXVsdCBmb3IgYSBwb29sOjoKCiAgICAgICAgcmV0cmllcyA9IFJldHJ5KGNvbm5lY3Q9NSwgcmVhZD0yLCByZWRpcmVjdD01KQogICAgICAgIGh0dHAgPSBQb29sTWFuYWdlcihyZXRyaWVzPXJldHJpZXMpCiAgICAgICAgcmVzcG9uc2UgPSBodHRwLnJlcXVlc3QoJ0dFVCcsICdodHRwOi8vZXhhbXBsZS5jb20vJykKCiAgICBPciBwZXItcmVxdWVzdCAod2hpY2ggb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGZvciB0aGUgcG9vbCk6OgoKICAgICAgICByZXNwb25zZSA9IGh0dHAucmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9leGFtcGxlLmNvbS8nLCByZXRyaWVzPVJldHJ5KDEwKSkKCiAgICBSZXRyaWVzIGNhbiBiZSBkaXNhYmxlZCBieSBwYXNzaW5nIGBgRmFsc2VgYDo6CgogICAgICAgIHJlc3BvbnNlID0gaHR0cC5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2V4YW1wbGUuY29tLycsIHJldHJpZXM9RmFsc2UpCgogICAgRXJyb3JzIHdpbGwgYmUgd3JhcHBlZCBpbiA6Y2xhc3M6YH51cmxsaWIzLmV4Y2VwdGlvbnMuTWF4UmV0cnlFcnJvcmAgdW5sZXNzCiAgICByZXRyaWVzIGFyZSBkaXNhYmxlZCwgaW4gd2hpY2ggY2FzZSB0aGUgY2F1c2luZyBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQuCgogICAgOnBhcmFtIGludCB0b3RhbDoKICAgICAgICBUb3RhbCBudW1iZXIgb2YgcmV0cmllcyB0byBhbGxvdy4gVGFrZXMgcHJlY2VkZW5jZSBvdmVyIG90aGVyIGNvdW50cy4KCiAgICAgICAgU2V0IHRvIGBgTm9uZWBgIHRvIHJlbW92ZSB0aGlzIGNvbnN0cmFpbnQgYW5kIGZhbGwgYmFjayBvbiBvdGhlcgogICAgICAgIGNvdW50cy4gSXQncyBhIGdvb2QgaWRlYSB0byBzZXQgdGhpcyB0byBzb21lIHNlbnNpYmx5LWhpZ2ggdmFsdWUgdG8KICAgICAgICBhY2NvdW50IGZvciB1bmV4cGVjdGVkIGVkZ2UgY2FzZXMgYW5kIGF2b2lkIGluZmluaXRlIHJldHJ5IGxvb3BzLgoKICAgICAgICBTZXQgdG8gYGAwYGAgdG8gZmFpbCBvbiB0aGUgZmlyc3QgcmV0cnkuCgogICAgICAgIFNldCB0byBgYEZhbHNlYGAgdG8gZGlzYWJsZSBhbmQgaW1wbHkgYGByYWlzZV9vbl9yZWRpcmVjdD1GYWxzZWBgLgoKICAgIDpwYXJhbSBpbnQgY29ubmVjdDoKICAgICAgICBIb3cgbWFueSBjb25uZWN0aW9uLXJlbGF0ZWQgZXJyb3JzIHRvIHJldHJ5IG9uLgoKICAgICAgICBUaGVzZSBhcmUgZXJyb3JzIHJhaXNlZCBiZWZvcmUgdGhlIHJlcXVlc3QgaXMgc2VudCB0byB0aGUgcmVtb3RlIHNlcnZlciwKICAgICAgICB3aGljaCB3ZSBhc3N1bWUgaGFzIG5vdCB0cmlnZ2VyZWQgdGhlIHNlcnZlciB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LgoKICAgICAgICBTZXQgdG8gYGAwYGAgdG8gZmFpbCBvbiB0aGUgZmlyc3QgcmV0cnkgb2YgdGhpcyB0eXBlLgoKICAgIDpwYXJhbSBpbnQgcmVhZDoKICAgICAgICBIb3cgbWFueSB0aW1lcyB0byByZXRyeSBvbiByZWFkIGVycm9ycy4KCiAgICAgICAgVGhlc2UgZXJyb3JzIGFyZSByYWlzZWQgYWZ0ZXIgdGhlIHJlcXVlc3Qgd2FzIHNlbnQgdG8gdGhlIHNlcnZlciwgc28gdGhlCiAgICAgICAgcmVxdWVzdCBtYXkgaGF2ZSBzaWRlLWVmZmVjdHMuCgogICAgICAgIFNldCB0byBgYDBgYCB0byBmYWlsIG9uIHRoZSBmaXJzdCByZXRyeSBvZiB0aGlzIHR5cGUuCgogICAgOnBhcmFtIGludCByZWRpcmVjdDoKICAgICAgICBIb3cgbWFueSByZWRpcmVjdHMgdG8gcGVyZm9ybS4gTGltaXQgdGhpcyB0byBhdm9pZCBpbmZpbml0ZSByZWRpcmVjdAogICAgICAgIGxvb3BzLgoKICAgICAgICBBIHJlZGlyZWN0IGlzIGEgSFRUUCByZXNwb25zZSB3aXRoIGEgc3RhdHVzIGNvZGUgMzAxLCAzMDIsIDMwMywgMzA3IG9yCiAgICAgICAgMzA4LgoKICAgICAgICBTZXQgdG8gYGAwYGAgdG8gZmFpbCBvbiB0aGUgZmlyc3QgcmV0cnkgb2YgdGhpcyB0eXBlLgoKICAgICAgICBTZXQgdG8gYGBGYWxzZWBgIHRvIGRpc2FibGUgYW5kIGltcGx5IGBgcmFpc2Vfb25fcmVkaXJlY3Q9RmFsc2VgYC4KCiAgICA6cGFyYW0gaW50IHN0YXR1czoKICAgICAgICBIb3cgbWFueSB0aW1lcyB0byByZXRyeSBvbiBiYWQgc3RhdHVzIGNvZGVzLgoKICAgICAgICBUaGVzZSBhcmUgcmV0cmllcyBtYWRlIG9uIHJlc3BvbnNlcywgd2hlcmUgc3RhdHVzIGNvZGUgbWF0Y2hlcwogICAgICAgIGBgc3RhdHVzX2ZvcmNlbGlzdGBgLgoKICAgICAgICBTZXQgdG8gYGAwYGAgdG8gZmFpbCBvbiB0aGUgZmlyc3QgcmV0cnkgb2YgdGhpcyB0eXBlLgoKICAgIDpwYXJhbSBpdGVyYWJsZSBtZXRob2Rfd2hpdGVsaXN0OgogICAgICAgIFNldCBvZiB1cHBlcmNhc2VkIEhUVFAgbWV0aG9kIHZlcmJzIHRoYXQgd2Ugc2hvdWxkIHJldHJ5IG9uLgoKICAgICAgICBCeSBkZWZhdWx0LCB3ZSBvbmx5IHJldHJ5IG9uIG1ldGhvZHMgd2hpY2ggYXJlIGNvbnNpZGVyZWQgdG8gYmUKICAgICAgICBpZGVtcG90ZW50IChtdWx0aXBsZSByZXF1ZXN0cyB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgZW5kIHdpdGggdGhlCiAgICAgICAgc2FtZSBzdGF0ZSkuIFNlZSA6YXR0cjpgUmV0cnkuREVGQVVMVF9NRVRIT0RfV0hJVEVMSVNUYC4KCiAgICAgICAgU2V0IHRvIGEgYGBGYWxzZWBgIHZhbHVlIHRvIHJldHJ5IG9uIGFueSB2ZXJiLgoKICAgIDpwYXJhbSBpdGVyYWJsZSBzdGF0dXNfZm9yY2VsaXN0OgogICAgICAgIEEgc2V0IG9mIGludGVnZXIgSFRUUCBzdGF0dXMgY29kZXMgdGhhdCB3ZSBzaG91bGQgZm9yY2UgYSByZXRyeSBvbi4KICAgICAgICBBIHJldHJ5IGlzIGluaXRpYXRlZCBpZiB0aGUgcmVxdWVzdCBtZXRob2QgaXMgaW4gYGBtZXRob2Rfd2hpdGVsaXN0YGAKICAgICAgICBhbmQgdGhlIHJlc3BvbnNlIHN0YXR1cyBjb2RlIGlzIGluIGBgc3RhdHVzX2ZvcmNlbGlzdGBgLgoKICAgICAgICBCeSBkZWZhdWx0LCB0aGlzIGlzIGRpc2FibGVkIHdpdGggYGBOb25lYGAuCgogICAgOnBhcmFtIGZsb2F0IGJhY2tvZmZfZmFjdG9yOgogICAgICAgIEEgYmFja29mZiBmYWN0b3IgdG8gYXBwbHkgYmV0d2VlbiBhdHRlbXB0cyBhZnRlciB0aGUgc2Vjb25kIHRyeQogICAgICAgIChtb3N0IGVycm9ycyBhcmUgcmVzb2x2ZWQgaW1tZWRpYXRlbHkgYnkgYSBzZWNvbmQgdHJ5IHdpdGhvdXQgYQogICAgICAgIGRlbGF5KS4gdXJsbGliMyB3aWxsIHNsZWVwIGZvcjo6CgogICAgICAgICAgICB7YmFja29mZiBmYWN0b3J9ICogKDIgXiAoe251bWJlciBvZiB0b3RhbCByZXRyaWVzfSAtIDEpKQoKICAgICAgICBzZWNvbmRzLiBJZiB0aGUgYmFja29mZl9mYWN0b3IgaXMgMC4xLCB0aGVuIDpmdW5jOmAuc2xlZXBgIHdpbGwgc2xlZXAKICAgICAgICBmb3IgWzAuMHMsIDAuMnMsIDAuNHMsIC4uLl0gYmV0d2VlbiByZXRyaWVzLiBJdCB3aWxsIG5ldmVyIGJlIGxvbmdlcgogICAgICAgIHRoYW4gOmF0dHI6YFJldHJ5LkJBQ0tPRkZfTUFYYC4KCiAgICAgICAgQnkgZGVmYXVsdCwgYmFja29mZiBpcyBkaXNhYmxlZCAoc2V0IHRvIDApLgoKICAgIDpwYXJhbSBib29sIHJhaXNlX29uX3JlZGlyZWN0OiBXaGV0aGVyLCBpZiB0aGUgbnVtYmVyIG9mIHJlZGlyZWN0cyBpcwogICAgICAgIGV4aGF1c3RlZCwgdG8gcmFpc2UgYSBNYXhSZXRyeUVycm9yLCBvciB0byByZXR1cm4gYSByZXNwb25zZSB3aXRoIGEKICAgICAgICByZXNwb25zZSBjb2RlIGluIHRoZSAzeHggcmFuZ2UuCgogICAgOnBhcmFtIGJvb2wgcmFpc2Vfb25fc3RhdHVzOiBTaW1pbGFyIG1lYW5pbmcgdG8gYGByYWlzZV9vbl9yZWRpcmVjdGBgOgogICAgICAgIHdoZXRoZXIgd2Ugc2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiwgb3IgcmV0dXJuIGEgcmVzcG9uc2UsCiAgICAgICAgaWYgc3RhdHVzIGZhbGxzIGluIGBgc3RhdHVzX2ZvcmNlbGlzdGBgIHJhbmdlIGFuZCByZXRyaWVzIGhhdmUKICAgICAgICBiZWVuIGV4aGF1c3RlZC4KCiAgICA6cGFyYW0gdHVwbGUgaGlzdG9yeTogVGhlIGhpc3Rvcnkgb2YgdGhlIHJlcXVlc3QgZW5jb3VudGVyZWQgZHVyaW5nCiAgICAgICAgZWFjaCBjYWxsIHRvIDptZXRoOmB+UmV0cnkuaW5jcmVtZW50YC4gVGhlIGxpc3QgaXMgaW4gdGhlIG9yZGVyCiAgICAgICAgdGhlIHJlcXVlc3RzIG9jY3VycmVkLiBFYWNoIGxpc3QgaXRlbSBpcyBvZiBjbGFzcyA6Y2xhc3M6YFJlcXVlc3RIaXN0b3J5YC4KCiAgICA6cGFyYW0gYm9vbCByZXNwZWN0X3JldHJ5X2FmdGVyX2hlYWRlcjoKICAgICAgICBXaGV0aGVyIHRvIHJlc3BlY3QgUmV0cnktQWZ0ZXIgaGVhZGVyIG9uIHN0YXR1cyBjb2RlcyBkZWZpbmVkIGFzCiAgICAgICAgOmF0dHI6YFJldHJ5LlJFVFJZX0FGVEVSX1NUQVRVU19DT0RFU2Agb3Igbm90LgoKICAgICIiIgoKICAgIERFRkFVTFRfTUVUSE9EX1dISVRFTElTVCA9IGZyb3plbnNldChbCiAgICAgICAgJ0hFQUQnLCAnR0VUJywgJ1BVVCcsICdERUxFVEUnLCAnT1BUSU9OUycsICdUUkFDRSddKQoKICAgIFJFVFJZX0FGVEVSX1NUQVRVU19DT0RFUyA9IGZyb3plbnNldChbNDEzLCA0MjksIDUwM10pCgogICAgIzogTWF4aW11bSBiYWNrb2ZmIHRpbWUuCiAgICBCQUNLT0ZGX01BWCA9IDEyMAoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0b3RhbD0xMCwgY29ubmVjdD1Ob25lLCByZWFkPU5vbmUsIHJlZGlyZWN0PU5vbmUsIHN0YXR1cz1Ob25lLAogICAgICAgICAgICAgICAgIG1ldGhvZF93aGl0ZWxpc3Q9REVGQVVMVF9NRVRIT0RfV0hJVEVMSVNULCBzdGF0dXNfZm9yY2VsaXN0PU5vbmUsCiAgICAgICAgICAgICAgICAgYmFja29mZl9mYWN0b3I9MCwgcmFpc2Vfb25fcmVkaXJlY3Q9VHJ1ZSwgcmFpc2Vfb25fc3RhdHVzPVRydWUsCiAgICAgICAgICAgICAgICAgaGlzdG9yeT1Ob25lLCByZXNwZWN0X3JldHJ5X2FmdGVyX2hlYWRlcj1UcnVlKToKCiAgICAgICAgc2VsZi50b3RhbCA9IHRvdGFsCiAgICAgICAgc2VsZi5jb25uZWN0ID0gY29ubmVjdAogICAgICAgIHNlbGYucmVhZCA9IHJlYWQKICAgICAgICBzZWxmLnN0YXR1cyA9IHN0YXR1cwoKICAgICAgICBpZiByZWRpcmVjdCBpcyBGYWxzZSBvciB0b3RhbCBpcyBGYWxzZToKICAgICAgICAgICAgcmVkaXJlY3QgPSAwCiAgICAgICAgICAgIHJhaXNlX29uX3JlZGlyZWN0ID0gRmFsc2UKCiAgICAgICAgc2VsZi5yZWRpcmVjdCA9IHJlZGlyZWN0CiAgICAgICAgc2VsZi5zdGF0dXNfZm9yY2VsaXN0ID0gc3RhdHVzX2ZvcmNlbGlzdCBvciBzZXQoKQogICAgICAgIHNlbGYubWV0aG9kX3doaXRlbGlzdCA9IG1ldGhvZF93aGl0ZWxpc3QKICAgICAgICBzZWxmLmJhY2tvZmZfZmFjdG9yID0gYmFja29mZl9mYWN0b3IKICAgICAgICBzZWxmLnJhaXNlX29uX3JlZGlyZWN0ID0gcmFpc2Vfb25fcmVkaXJlY3QKICAgICAgICBzZWxmLnJhaXNlX29uX3N0YXR1cyA9IHJhaXNlX29uX3N0YXR1cwogICAgICAgIHNlbGYuaGlzdG9yeSA9IGhpc3Rvcnkgb3IgdHVwbGUoKQogICAgICAgIHNlbGYucmVzcGVjdF9yZXRyeV9hZnRlcl9oZWFkZXIgPSByZXNwZWN0X3JldHJ5X2FmdGVyX2hlYWRlcgoKICAgIGRlZiBuZXcoc2VsZiwgKiprdyk6CiAgICAgICAgcGFyYW1zID0gZGljdCgKICAgICAgICAgICAgdG90YWw9c2VsZi50b3RhbCwKICAgICAgICAgICAgY29ubmVjdD1zZWxmLmNvbm5lY3QsIHJlYWQ9c2VsZi5yZWFkLCByZWRpcmVjdD1zZWxmLnJlZGlyZWN0LCBzdGF0dXM9c2VsZi5zdGF0dXMsCiAgICAgICAgICAgIG1ldGhvZF93aGl0ZWxpc3Q9c2VsZi5tZXRob2Rfd2hpdGVsaXN0LAogICAgICAgICAgICBzdGF0dXNfZm9yY2VsaXN0PXNlbGYuc3RhdHVzX2ZvcmNlbGlzdCwKICAgICAgICAgICAgYmFja29mZl9mYWN0b3I9c2VsZi5iYWNrb2ZmX2ZhY3RvciwKICAgICAgICAgICAgcmFpc2Vfb25fcmVkaXJlY3Q9c2VsZi5yYWlzZV9vbl9yZWRpcmVjdCwKICAgICAgICAgICAgcmFpc2Vfb25fc3RhdHVzPXNlbGYucmFpc2Vfb25fc3RhdHVzLAogICAgICAgICAgICBoaXN0b3J5PXNlbGYuaGlzdG9yeSwKICAgICAgICApCiAgICAgICAgcGFyYW1zLnVwZGF0ZShrdykKICAgICAgICByZXR1cm4gdHlwZShzZWxmKSgqKnBhcmFtcykKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2ludChjbHMsIHJldHJpZXMsIHJlZGlyZWN0PVRydWUsIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgIiIiIEJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGZvciB0aGUgb2xkIHJldHJpZXMgZm9ybWF0LiIiIgogICAgICAgIGlmIHJldHJpZXMgaXMgTm9uZToKICAgICAgICAgICAgcmV0cmllcyA9IGRlZmF1bHQgaWYgZGVmYXVsdCBpcyBub3QgTm9uZSBlbHNlIGNscy5ERUZBVUxUCgogICAgICAgIGlmIGlzaW5zdGFuY2UocmV0cmllcywgUmV0cnkpOgogICAgICAgICAgICByZXR1cm4gcmV0cmllcwoKICAgICAgICByZWRpcmVjdCA9IGJvb2wocmVkaXJlY3QpIGFuZCBOb25lCiAgICAgICAgbmV3X3JldHJpZXMgPSBjbHMocmV0cmllcywgcmVkaXJlY3Q9cmVkaXJlY3QpCiAgICAgICAgbG9nLmRlYnVnKCJDb252ZXJ0ZWQgcmV0cmllcyB2YWx1ZTogJXIgLT4gJXIiLCByZXRyaWVzLCBuZXdfcmV0cmllcykKICAgICAgICByZXR1cm4gbmV3X3JldHJpZXMKCiAgICBkZWYgZ2V0X2JhY2tvZmZfdGltZShzZWxmKToKICAgICAgICAiIiIgRm9ybXVsYSBmb3IgY29tcHV0aW5nIHRoZSBjdXJyZW50IGJhY2tvZmYKCiAgICAgICAgOnJ0eXBlOiBmbG9hdAogICAgICAgICIiIgogICAgICAgICMgV2Ugd2FudCB0byBjb25zaWRlciBvbmx5IHRoZSBsYXN0IGNvbnNlY3V0aXZlIGVycm9ycyBzZXF1ZW5jZSAoSWdub3JlIHJlZGlyZWN0cykuCiAgICAgICAgY29uc2VjdXRpdmVfZXJyb3JzX2xlbiA9IGxlbihsaXN0KHRha2V3aGlsZShsYW1iZGEgeDogeC5yZWRpcmVjdF9sb2NhdGlvbiBpcyBOb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZWQoc2VsZi5oaXN0b3J5KSkpKQogICAgICAgIGlmIGNvbnNlY3V0aXZlX2Vycm9yc19sZW4gPD0gMToKICAgICAgICAgICAgcmV0dXJuIDAKCiAgICAgICAgYmFja29mZl92YWx1ZSA9IHNlbGYuYmFja29mZl9mYWN0b3IgKiAoMiAqKiAoY29uc2VjdXRpdmVfZXJyb3JzX2xlbiAtIDEpKQogICAgICAgIHJldHVybiBtaW4oc2VsZi5CQUNLT0ZGX01BWCwgYmFja29mZl92YWx1ZSkKCiAgICBkZWYgcGFyc2VfcmV0cnlfYWZ0ZXIoc2VsZiwgcmV0cnlfYWZ0ZXIpOgogICAgICAgICMgV2hpdGVzcGFjZTogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjIuNAogICAgICAgIGlmIHJlLm1hdGNoKHIiXlxzKlswLTldK1xzKiQiLCByZXRyeV9hZnRlcik6CiAgICAgICAgICAgIHNlY29uZHMgPSBpbnQocmV0cnlfYWZ0ZXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0cnlfZGF0ZV90dXBsZSA9IGVtYWlsLnV0aWxzLnBhcnNlZGF0ZShyZXRyeV9hZnRlcikKICAgICAgICAgICAgaWYgcmV0cnlfZGF0ZV90dXBsZSBpcyBOb25lOgogICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZEhlYWRlcigiSW52YWxpZCBSZXRyeS1BZnRlciBoZWFkZXI6ICVzIiAlIHJldHJ5X2FmdGVyKQogICAgICAgICAgICByZXRyeV9kYXRlID0gdGltZS5ta3RpbWUocmV0cnlfZGF0ZV90dXBsZSkKICAgICAgICAgICAgc2Vjb25kcyA9IHJldHJ5X2RhdGUgLSB0aW1lLnRpbWUoKQoKICAgICAgICBpZiBzZWNvbmRzIDwgMDoKICAgICAgICAgICAgc2Vjb25kcyA9IDAKCiAgICAgICAgcmV0dXJuIHNlY29uZHMKCiAgICBkZWYgZ2V0X3JldHJ5X2FmdGVyKHNlbGYsIHJlc3BvbnNlKToKICAgICAgICAiIiIgR2V0IHRoZSB2YWx1ZSBvZiBSZXRyeS1BZnRlciBpbiBzZWNvbmRzLiAiIiIKCiAgICAgICAgcmV0cnlfYWZ0ZXIgPSByZXNwb25zZS5nZXRoZWFkZXIoIlJldHJ5LUFmdGVyIikKCiAgICAgICAgaWYgcmV0cnlfYWZ0ZXIgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VfcmV0cnlfYWZ0ZXIocmV0cnlfYWZ0ZXIpCgogICAgZGVmIHNsZWVwX2Zvcl9yZXRyeShzZWxmLCByZXNwb25zZT1Ob25lKToKICAgICAgICByZXRyeV9hZnRlciA9IHNlbGYuZ2V0X3JldHJ5X2FmdGVyKHJlc3BvbnNlKQogICAgICAgIGlmIHJldHJ5X2FmdGVyOgogICAgICAgICAgICB0aW1lLnNsZWVwKHJldHJ5X2FmdGVyKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX3NsZWVwX2JhY2tvZmYoc2VsZik6CiAgICAgICAgYmFja29mZiA9IHNlbGYuZ2V0X2JhY2tvZmZfdGltZSgpCiAgICAgICAgaWYgYmFja29mZiA8PSAwOgogICAgICAgICAgICByZXR1cm4KICAgICAgICB0aW1lLnNsZWVwKGJhY2tvZmYpCgogICAgZGVmIHNsZWVwKHNlbGYsIHJlc3BvbnNlPU5vbmUpOgogICAgICAgICIiIiBTbGVlcCBiZXR3ZWVuIHJldHJ5IGF0dGVtcHRzLgoKICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIHJlc3BlY3QgYSBzZXJ2ZXIncyBgYFJldHJ5LUFmdGVyYGAgcmVzcG9uc2UgaGVhZGVyCiAgICAgICAgYW5kIHNsZWVwIHRoZSBkdXJhdGlvbiBvZiB0aGUgdGltZSByZXF1ZXN0ZWQuIElmIHRoYXQgaXMgbm90IHByZXNlbnQsIGl0CiAgICAgICAgd2lsbCB1c2UgYW4gZXhwb25lbnRpYWwgYmFja29mZi4gQnkgZGVmYXVsdCwgdGhlIGJhY2tvZmYgZmFjdG9yIGlzIDAgYW5kCiAgICAgICAgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkuCiAgICAgICAgIiIiCgogICAgICAgIGlmIHJlc3BvbnNlOgogICAgICAgICAgICBzbGVwdCA9IHNlbGYuc2xlZXBfZm9yX3JldHJ5KHJlc3BvbnNlKQogICAgICAgICAgICBpZiBzbGVwdDoKICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZWxmLl9zbGVlcF9iYWNrb2ZmKCkKCiAgICBkZWYgX2lzX2Nvbm5lY3Rpb25fZXJyb3Ioc2VsZiwgZXJyKToKICAgICAgICAiIiIgRXJyb3JzIHdoZW4gd2UncmUgZmFpcmx5IHN1cmUgdGhhdCB0aGUgc2VydmVyIGRpZCBub3QgcmVjZWl2ZSB0aGUKICAgICAgICByZXF1ZXN0LCBzbyBpdCBzaG91bGQgYmUgc2FmZSB0byByZXRyeS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShlcnIsIENvbm5lY3RUaW1lb3V0RXJyb3IpCgogICAgZGVmIF9pc19yZWFkX2Vycm9yKHNlbGYsIGVycik6CiAgICAgICAgIiIiIEVycm9ycyB0aGF0IG9jY3VyIGFmdGVyIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHN0YXJ0ZWQsIHNvIHdlIHNob3VsZAogICAgICAgIGFzc3VtZSB0aGF0IHRoZSBzZXJ2ZXIgYmVnYW4gcHJvY2Vzc2luZyBpdC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShlcnIsIChSZWFkVGltZW91dEVycm9yLCBQcm90b2NvbEVycm9yKSkKCiAgICBkZWYgX2lzX21ldGhvZF9yZXRyeWFibGUoc2VsZiwgbWV0aG9kKToKICAgICAgICAiIiIgQ2hlY2tzIGlmIGEgZ2l2ZW4gSFRUUCBtZXRob2Qgc2hvdWxkIGJlIHJldHJpZWQgdXBvbiwgZGVwZW5kaW5nIGlmCiAgICAgICAgaXQgaXMgaW5jbHVkZWQgb24gdGhlIG1ldGhvZCB3aGl0ZWxpc3QuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5tZXRob2Rfd2hpdGVsaXN0IGFuZCBtZXRob2QudXBwZXIoKSBub3QgaW4gc2VsZi5tZXRob2Rfd2hpdGVsaXN0OgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgaXNfcmV0cnkoc2VsZiwgbWV0aG9kLCBzdGF0dXNfY29kZSwgaGFzX3JldHJ5X2FmdGVyPUZhbHNlKToKICAgICAgICAiIiIgSXMgdGhpcyBtZXRob2Qvc3RhdHVzIGNvZGUgcmV0cnlhYmxlPyAoQmFzZWQgb24gd2hpdGVsaXN0cyBhbmQgY29udHJvbAogICAgICAgIHZhcmlhYmxlcyBzdWNoIGFzIHRoZSBudW1iZXIgb2YgdG90YWwgcmV0cmllcyB0byBhbGxvdywgd2hldGhlciB0bwogICAgICAgIHJlc3BlY3QgdGhlIFJldHJ5LUFmdGVyIGhlYWRlciwgd2hldGhlciB0aGlzIGhlYWRlciBpcyBwcmVzZW50LCBhbmQKICAgICAgICB3aGV0aGVyIHRoZSByZXR1cm5lZCBzdGF0dXMgY29kZSBpcyBvbiB0aGUgbGlzdCBvZiBzdGF0dXMgY29kZXMgdG8KICAgICAgICBiZSByZXRyaWVkIHVwb24gb24gdGhlIHByZXNlbmNlIG9mIHRoZSBhZm9yZW1lbnRpb25lZCBoZWFkZXIpCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuX2lzX21ldGhvZF9yZXRyeWFibGUobWV0aG9kKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGlmIHNlbGYuc3RhdHVzX2ZvcmNlbGlzdCBhbmQgc3RhdHVzX2NvZGUgaW4gc2VsZi5zdGF0dXNfZm9yY2VsaXN0OgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICByZXR1cm4gKHNlbGYudG90YWwgYW5kIHNlbGYucmVzcGVjdF9yZXRyeV9hZnRlcl9oZWFkZXIgYW5kCiAgICAgICAgICAgICAgICBoYXNfcmV0cnlfYWZ0ZXIgYW5kIChzdGF0dXNfY29kZSBpbiBzZWxmLlJFVFJZX0FGVEVSX1NUQVRVU19DT0RFUykpCgogICAgZGVmIGlzX2V4aGF1c3RlZChzZWxmKToKICAgICAgICAiIiIgQXJlIHdlIG91dCBvZiByZXRyaWVzPyAiIiIKICAgICAgICByZXRyeV9jb3VudHMgPSAoc2VsZi50b3RhbCwgc2VsZi5jb25uZWN0LCBzZWxmLnJlYWQsIHNlbGYucmVkaXJlY3QsIHNlbGYuc3RhdHVzKQogICAgICAgIHJldHJ5X2NvdW50cyA9IGxpc3QoZmlsdGVyKE5vbmUsIHJldHJ5X2NvdW50cykpCiAgICAgICAgaWYgbm90IHJldHJ5X2NvdW50czoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHJldHVybiBtaW4ocmV0cnlfY291bnRzKSA8IDAKCiAgICBkZWYgaW5jcmVtZW50KHNlbGYsIG1ldGhvZD1Ob25lLCB1cmw9Tm9uZSwgcmVzcG9uc2U9Tm9uZSwgZXJyb3I9Tm9uZSwKICAgICAgICAgICAgICAgICAgX3Bvb2w9Tm9uZSwgX3N0YWNrdHJhY2U9Tm9uZSk6CiAgICAgICAgIiIiIFJldHVybiBhIG5ldyBSZXRyeSBvYmplY3Qgd2l0aCBpbmNyZW1lbnRlZCByZXRyeSBjb3VudGVycy4KCiAgICAgICAgOnBhcmFtIHJlc3BvbnNlOiBBIHJlc3BvbnNlIG9iamVjdCwgb3IgTm9uZSwgaWYgdGhlIHNlcnZlciBkaWQgbm90CiAgICAgICAgICAgIHJldHVybiBhIHJlc3BvbnNlLgogICAgICAgIDp0eXBlIHJlc3BvbnNlOiA6Y2xhc3M6YH51cmxsaWIzLnJlc3BvbnNlLkhUVFBSZXNwb25zZWAKICAgICAgICA6cGFyYW0gRXhjZXB0aW9uIGVycm9yOiBBbiBlcnJvciBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIHJlcXVlc3QsIG9yCiAgICAgICAgICAgIE5vbmUgaWYgdGhlIHJlc3BvbnNlIHdhcyByZWNlaXZlZCBzdWNjZXNzZnVsbHkuCgogICAgICAgIDpyZXR1cm46IEEgbmV3IGBgUmV0cnlgYCBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi50b3RhbCBpcyBGYWxzZSBhbmQgZXJyb3I6CiAgICAgICAgICAgICMgRGlzYWJsZWQsIGluZGljYXRlIHRvIHJlLXJhaXNlIHRoZSBlcnJvci4KICAgICAgICAgICAgcmFpc2Ugc2l4LnJlcmFpc2UodHlwZShlcnJvciksIGVycm9yLCBfc3RhY2t0cmFjZSkKCiAgICAgICAgdG90YWwgPSBzZWxmLnRvdGFsCiAgICAgICAgaWYgdG90YWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHRvdGFsIC09IDEKCiAgICAgICAgY29ubmVjdCA9IHNlbGYuY29ubmVjdAogICAgICAgIHJlYWQgPSBzZWxmLnJlYWQKICAgICAgICByZWRpcmVjdCA9IHNlbGYucmVkaXJlY3QKICAgICAgICBzdGF0dXNfY291bnQgPSBzZWxmLnN0YXR1cwogICAgICAgIGNhdXNlID0gJ3Vua25vd24nCiAgICAgICAgc3RhdHVzID0gTm9uZQogICAgICAgIHJlZGlyZWN0X2xvY2F0aW9uID0gTm9uZQoKICAgICAgICBpZiBlcnJvciBhbmQgc2VsZi5faXNfY29ubmVjdGlvbl9lcnJvcihlcnJvcik6CiAgICAgICAgICAgICMgQ29ubmVjdCByZXRyeT8KICAgICAgICAgICAgaWYgY29ubmVjdCBpcyBGYWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIHNpeC5yZXJhaXNlKHR5cGUoZXJyb3IpLCBlcnJvciwgX3N0YWNrdHJhY2UpCiAgICAgICAgICAgIGVsaWYgY29ubmVjdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGNvbm5lY3QgLT0gMQoKICAgICAgICBlbGlmIGVycm9yIGFuZCBzZWxmLl9pc19yZWFkX2Vycm9yKGVycm9yKToKICAgICAgICAgICAgIyBSZWFkIHJldHJ5PwogICAgICAgICAgICBpZiByZWFkIGlzIEZhbHNlIG9yIG5vdCBzZWxmLl9pc19tZXRob2RfcmV0cnlhYmxlKG1ldGhvZCk6CiAgICAgICAgICAgICAgICByYWlzZSBzaXgucmVyYWlzZSh0eXBlKGVycm9yKSwgZXJyb3IsIF9zdGFja3RyYWNlKQogICAgICAgICAgICBlbGlmIHJlYWQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICByZWFkIC09IDEKCiAgICAgICAgZWxpZiByZXNwb25zZSBhbmQgcmVzcG9uc2UuZ2V0X3JlZGlyZWN0X2xvY2F0aW9uKCk6CiAgICAgICAgICAgICMgUmVkaXJlY3QgcmV0cnk/CiAgICAgICAgICAgIGlmIHJlZGlyZWN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcmVkaXJlY3QgLT0gMQogICAgICAgICAgICBjYXVzZSA9ICd0b28gbWFueSByZWRpcmVjdHMnCiAgICAgICAgICAgIHJlZGlyZWN0X2xvY2F0aW9uID0gcmVzcG9uc2UuZ2V0X3JlZGlyZWN0X2xvY2F0aW9uKCkKICAgICAgICAgICAgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgSW5jcmVtZW50aW5nIGJlY2F1c2Ugb2YgYSBzZXJ2ZXIgZXJyb3IgbGlrZSBhIDUwMCBpbgogICAgICAgICAgICAjIHN0YXR1c19mb3JjZWxpc3QgYW5kIGEgdGhlIGdpdmVuIG1ldGhvZCBpcyBpbiB0aGUgd2hpdGVsaXN0CiAgICAgICAgICAgIGNhdXNlID0gUmVzcG9uc2VFcnJvci5HRU5FUklDX0VSUk9SCiAgICAgICAgICAgIGlmIHJlc3BvbnNlIGFuZCByZXNwb25zZS5zdGF0dXM6CiAgICAgICAgICAgICAgICBpZiBzdGF0dXNfY291bnQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2NvdW50IC09IDEKICAgICAgICAgICAgICAgIGNhdXNlID0gUmVzcG9uc2VFcnJvci5TUEVDSUZJQ19FUlJPUi5mb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2NvZGU9cmVzcG9uc2Uuc3RhdHVzKQogICAgICAgICAgICAgICAgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzCgogICAgICAgIGhpc3RvcnkgPSBzZWxmLmhpc3RvcnkgKyAoUmVxdWVzdEhpc3RvcnkobWV0aG9kLCB1cmwsIGVycm9yLCBzdGF0dXMsIHJlZGlyZWN0X2xvY2F0aW9uKSwpCgogICAgICAgIG5ld19yZXRyeSA9IHNlbGYubmV3KAogICAgICAgICAgICB0b3RhbD10b3RhbCwKICAgICAgICAgICAgY29ubmVjdD1jb25uZWN0LCByZWFkPXJlYWQsIHJlZGlyZWN0PXJlZGlyZWN0LCBzdGF0dXM9c3RhdHVzX2NvdW50LAogICAgICAgICAgICBoaXN0b3J5PWhpc3RvcnkpCgogICAgICAgIGlmIG5ld19yZXRyeS5pc19leGhhdXN0ZWQoKToKICAgICAgICAgICAgcmFpc2UgTWF4UmV0cnlFcnJvcihfcG9vbCwgdXJsLCBlcnJvciBvciBSZXNwb25zZUVycm9yKGNhdXNlKSkKCiAgICAgICAgbG9nLmRlYnVnKCJJbmNyZW1lbnRlZCBSZXRyeSBmb3IgKHVybD0nJXMnKTogJXIiLCB1cmwsIG5ld19yZXRyeSkKCiAgICAgICAgcmV0dXJuIG5ld19yZXRyeQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gKCd7Y2xzLl9fbmFtZV9ffSh0b3RhbD17c2VsZi50b3RhbH0sIGNvbm5lY3Q9e3NlbGYuY29ubmVjdH0sICcKICAgICAgICAgICAgICAgICdyZWFkPXtzZWxmLnJlYWR9LCByZWRpcmVjdD17c2VsZi5yZWRpcmVjdH0sIHN0YXR1cz17c2VsZi5zdGF0dXN9KScpLmZvcm1hdCgKICAgICAgICAgICAgICAgICAgICBjbHM9dHlwZShzZWxmKSwgc2VsZj1zZWxmKQoKCiMgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IChlcXVpdmFsZW50IHRvIHByZS12MS45KToKUmV0cnkuREVGQVVMVCA9IFJldHJ5KDMpClBLAwQUAAAAAAAAACEAfc87PZtSAACbUgAANQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvc2VsZWN0b3JzLnB5IyBCYWNrcG9ydCBvZiBzZWxlY3RvcnMucHkgZnJvbSBQeXRob24gMy41KyB0byBzdXBwb3J0IFB5dGhvbiA8IDMuNAojIEFsc28gaGFzIHRoZSBiZWhhdmlvciBzcGVjaWZpZWQgaW4gUEVQIDQ3NSB3aGljaCBpcyB0byByZXRyeSBzeXNjYWxscwojIGluIHRoZSBjYXNlIG9mIGFuIEVJTlRSIGVycm9yLiBUaGlzIG1vZHVsZSBpcyByZXF1aXJlZCBiZWNhdXNlIHNlbGVjdG9yczM0CiMgZG9lcyBub3QgZm9sbG93IHRoaXMgYmVoYXZpb3IgYW5kIGluc3RlYWQgcmV0dXJucyB0aGF0IG5vIGRpbGUgZGVzY3JpcHRvcgojIGV2ZW50cyBoYXZlIG9jY3VycmVkIHJhdGhlciB0aGFuIHJldHJ5IHRoZSBzeXNjYWxsLiBUaGUgZGVjaXNpb24gdG8gZHJvcAojIHN1cHBvcnQgZm9yIHNlbGVjdC5kZXZwb2xsIGlzIG1hZGUgdG8gbWFpbnRhaW4gMTAwJSB0ZXN0IGNvdmVyYWdlLgoKaW1wb3J0IGVycm5vCmltcG9ydCBtYXRoCmltcG9ydCBzZWxlY3QKaW1wb3J0IHNvY2tldAppbXBvcnQgc3lzCmltcG9ydCB0aW1lCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUsIE1hcHBpbmcKCnRyeToKICAgIG1vbm90b25pYyA9IHRpbWUubW9ub3RvbmljCmV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIEltcG9ydEVycm9yKTogICMgUHl0aG9uIDMuMzwKICAgIG1vbm90b25pYyA9IHRpbWUudGltZQoKRVZFTlRfUkVBRCA9ICgxIDw8IDApCkVWRU5UX1dSSVRFID0gKDEgPDwgMSkKCkhBU19TRUxFQ1QgPSBUcnVlICAjIFZhcmlhYmxlIHRoYXQgc2hvd3Mgd2hldGhlciB0aGUgcGxhdGZvcm0gaGFzIGEgc2VsZWN0b3IuCl9TWVNDQUxMX1NFTlRJTkVMID0gb2JqZWN0KCkgICMgU2VudGluZWwgaW4gY2FzZSBhIHN5c3RlbSBjYWxsIHJldHVybnMgTm9uZS4KX0RFRkFVTFRfU0VMRUNUT1IgPSBOb25lCgoKY2xhc3MgU2VsZWN0b3JFcnJvcihFeGNlcHRpb24pOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGVycmNvZGUpOgogICAgICAgIHN1cGVyKFNlbGVjdG9yRXJyb3IsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmVycm5vID0gZXJyY29kZQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxTZWxlY3RvckVycm9yIGVycm5vPXswfT4iLmZvcm1hdChzZWxmLmVycm5vKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9fcmVwcl9fKCkKCgpkZWYgX2ZpbGVvYmpfdG9fZmQoZmlsZW9iaik6CiAgICAiIiIgUmV0dXJuIGEgZmlsZSBkZXNjcmlwdG9yIGZyb20gYSBmaWxlIG9iamVjdC4gSWYKICAgIGdpdmVuIGFuIGludGVnZXIgd2lsbCBzaW1wbHkgcmV0dXJuIHRoYXQgaW50ZWdlciBiYWNrLiAiIiIKICAgIGlmIGlzaW5zdGFuY2UoZmlsZW9iaiwgaW50KToKICAgICAgICBmZCA9IGZpbGVvYmoKICAgIGVsc2U6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmZCA9IGludChmaWxlb2JqLmZpbGVubygpKQogICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvciwgVmFsdWVFcnJvcik6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgZmlsZSBvYmplY3Q6IHswIXJ9Ii5mb3JtYXQoZmlsZW9iaikpCiAgICBpZiBmZCA8IDA6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBmaWxlIGRlc2NyaXB0b3I6IHswfSIuZm9ybWF0KGZkKSkKICAgIHJldHVybiBmZAoKCiMgRGV0ZXJtaW5lIHdoaWNoIGZ1bmN0aW9uIHRvIHVzZSB0byB3cmFwIHN5c3RlbSBjYWxscyBiZWNhdXNlIFB5dGhvbiAzLjUrCiMgYWxyZWFkeSBoYW5kbGVzIHRoZSBjYXNlIHdoZW4gc3lzdGVtIGNhbGxzIGFyZSBpbnRlcnJ1cHRlZC4KaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMywgNSk6CiAgICBkZWYgX3N5c2NhbGxfd3JhcHBlcihmdW5jLCBfLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIiBUaGlzIGlzIHRoZSBzaG9ydC1jaXJjdWl0IHZlcnNpb24gb2YgdGhlIGJlbG93IGxvZ2ljCiAgICAgICAgYmVjYXVzZSBpbiBQeXRob24gMy41KyBhbGwgc3lzdGVtIGNhbGxzIGF1dG9tYXRpY2FsbHkgcmVzdGFydAogICAgICAgIGFuZCByZWNhbGN1bGF0ZSB0aGVpciB0aW1lb3V0cy4gIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yLCBzZWxlY3QuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgIGVycmNvZGUgPSBOb25lCiAgICAgICAgICAgIGlmIGhhc2F0dHIoZSwgImVycm5vIik6CiAgICAgICAgICAgICAgICBlcnJjb2RlID0gZS5lcnJubwogICAgICAgICAgICByYWlzZSBTZWxlY3RvckVycm9yKGVycmNvZGUpCmVsc2U6CiAgICBkZWYgX3N5c2NhbGxfd3JhcHBlcihmdW5jLCByZWNhbGNfdGltZW91dCwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiIgV3JhcHBlciBmdW5jdGlvbiBmb3Igc3lzY2FsbHMgdGhhdCBjb3VsZCBmYWlsIGR1ZSB0byBFSU5UUi4KICAgICAgICBBbGwgZnVuY3Rpb25zIHNob3VsZCBiZSByZXRyaWVkIGlmIHRoZXJlIGlzIHRpbWUgbGVmdCBpbiB0aGUgdGltZW91dAogICAgICAgIGluIGFjY29yZGFuY2Ugd2l0aCBQRVAgNDc1LiAiIiIKICAgICAgICB0aW1lb3V0ID0ga3dhcmdzLmdldCgidGltZW91dCIsIE5vbmUpCiAgICAgICAgaWYgdGltZW91dCBpcyBOb25lOgogICAgICAgICAgICBleHBpcmVzID0gTm9uZQogICAgICAgICAgICByZWNhbGNfdGltZW91dCA9IEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdGltZW91dCA9IGZsb2F0KHRpbWVvdXQpCiAgICAgICAgICAgIGlmIHRpbWVvdXQgPCAwLjA6ICAjIFRpbWVvdXQgbGVzcyB0aGFuIDAgdHJlYXRlZCBhcyBubyB0aW1lb3V0LgogICAgICAgICAgICAgICAgZXhwaXJlcyA9IE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGV4cGlyZXMgPSBtb25vdG9uaWMoKSArIHRpbWVvdXQKCiAgICAgICAgYXJncyA9IGxpc3QoYXJncykKICAgICAgICBpZiByZWNhbGNfdGltZW91dCBhbmQgInRpbWVvdXQiIG5vdCBpbiBrd2FyZ3M6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiVGltZW91dCBtdXN0IGJlIGluIGFyZ3Mgb3Iga3dhcmdzIHRvIGJlIHJlY2FsY3VsYXRlZCIpCgogICAgICAgIHJlc3VsdCA9IF9TWVNDQUxMX1NFTlRJTkVMCiAgICAgICAgd2hpbGUgcmVzdWx0IGlzIF9TWVNDQUxMX1NFTlRJTkVMOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBmdW5jKCphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgIyBPU0Vycm9yIGlzIHRocm93biBieSBzZWxlY3Quc2VsZWN0CiAgICAgICAgICAgICMgSU9FcnJvciBpcyB0aHJvd24gYnkgc2VsZWN0LmVwb2xsLnBvbGwKICAgICAgICAgICAgIyBzZWxlY3QuZXJyb3IgaXMgdGhyb3duIGJ5IHNlbGVjdC5wb2xsLnBvbGwKICAgICAgICAgICAgIyBBcmVuJ3Qgd2UgdGhhbmtmdWwgZm9yIFB5dGhvbiAzLnggcmV3b3JrIGZvciBleGNlcHRpb25zPwogICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IsIHNlbGVjdC5lcnJvcikgYXMgZToKICAgICAgICAgICAgICAgICMgc2VsZWN0LmVycm9yIHdhc24ndCBhIHN1YmNsYXNzIG9mIE9TRXJyb3IgaW4gdGhlIHBhc3QuCiAgICAgICAgICAgICAgICBlcnJjb2RlID0gTm9uZQogICAgICAgICAgICAgICAgaWYgaGFzYXR0cihlLCAiZXJybm8iKToKICAgICAgICAgICAgICAgICAgICBlcnJjb2RlID0gZS5lcnJubwogICAgICAgICAgICAgICAgZWxpZiBoYXNhdHRyKGUsICJhcmdzIik6CiAgICAgICAgICAgICAgICAgICAgZXJyY29kZSA9IGUuYXJnc1swXQoKICAgICAgICAgICAgICAgICMgQWxzbyB0ZXN0IGZvciB0aGUgV2luZG93cyBlcXVpdmFsZW50IG9mIEVJTlRSLgogICAgICAgICAgICAgICAgaXNfaW50ZXJydXB0ID0gKGVycmNvZGUgPT0gZXJybm8uRUlOVFIgb3IgKGhhc2F0dHIoZXJybm8sICJXU0FFSU5UUiIpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycmNvZGUgPT0gZXJybm8uV1NBRUlOVFIpKQoKICAgICAgICAgICAgICAgIGlmIGlzX2ludGVycnVwdDoKICAgICAgICAgICAgICAgICAgICBpZiBleHBpcmVzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3RpbWUgPSBtb25vdG9uaWMoKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBjdXJyZW50X3RpbWUgPiBleHBpcmVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgT1NFcnJvcihlcnJubz1lcnJuby5FVElNRURPVVQpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHJlY2FsY190aW1lb3V0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgInRpbWVvdXQiIGluIGt3YXJnczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2FyZ3NbInRpbWVvdXQiXSA9IGV4cGlyZXMgLSBjdXJyZW50X3RpbWUKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgZXJyY29kZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBTZWxlY3RvckVycm9yKGVycmNvZGUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKClNlbGVjdG9yS2V5ID0gbmFtZWR0dXBsZSgnU2VsZWN0b3JLZXknLCBbJ2ZpbGVvYmonLCAnZmQnLCAnZXZlbnRzJywgJ2RhdGEnXSkKCgpjbGFzcyBfU2VsZWN0b3JNYXBwaW5nKE1hcHBpbmcpOgogICAgIiIiIE1hcHBpbmcgb2YgZmlsZSBvYmplY3RzIHRvIHNlbGVjdG9yIGtleXMgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlbGVjdG9yKToKICAgICAgICBzZWxmLl9zZWxlY3RvciA9IHNlbGVjdG9yCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9zZWxlY3Rvci5fZmRfdG9fa2V5KQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBmaWxlb2JqKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZkID0gc2VsZi5fc2VsZWN0b3IuX2ZpbGVvYmpfbG9va3VwKGZpbGVvYmopCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9zZWxlY3Rvci5fZmRfdG9fa2V5W2ZkXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoInswIXJ9IGlzIG5vdCByZWdpc3RlcmVkLiIuZm9ybWF0KGZpbGVvYmopKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9zZWxlY3Rvci5fZmRfdG9fa2V5KQoKCmNsYXNzIEJhc2VTZWxlY3RvcihvYmplY3QpOgogICAgIiIiIEFic3RyYWN0IFNlbGVjdG9yIGNsYXNzCgogICAgQSBzZWxlY3RvciBzdXBwb3J0cyByZWdpc3RlcmluZyBmaWxlIG9iamVjdHMgdG8gYmUgbW9uaXRvcmVkCiAgICBmb3Igc3BlY2lmaWMgSS9PIGV2ZW50cy4KCiAgICBBIGZpbGUgb2JqZWN0IGlzIGEgZmlsZSBkZXNjcmlwdG9yIG9yIGFueSBvYmplY3Qgd2l0aCBhCiAgICBgZmlsZW5vKClgIG1ldGhvZC4gQW4gYXJiaXRyYXJ5IG9iamVjdCBjYW4gYmUgYXR0YWNoZWQgdG8gdGhlCiAgICBmaWxlIG9iamVjdCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZXhhbXBsZSB0byBzdG9yZSBjb250ZXh0IGluZm8sCiAgICBhIGNhbGxiYWNrLCBldGMuCgogICAgQSBzZWxlY3RvciBjYW4gdXNlIHZhcmlvdXMgaW1wbGVtZW50YXRpb25zIChzZWxlY3QoKSwgcG9sbCgpLCBlcG9sbCgpLAogICAgYW5kIGtxdWV1ZSgpKSBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLiBUaGUgJ0RlZmF1bHRTZWxlY3RvcicgY2xhc3MgdXNlcwogICAgdGhlIG1vc3QgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICMgTWFwcyBmaWxlIGRlc2NyaXB0b3JzIHRvIGtleXMuCiAgICAgICAgc2VsZi5fZmRfdG9fa2V5ID0ge30KCiAgICAgICAgIyBSZWFkLW9ubHkgbWFwcGluZyByZXR1cm5lZCBieSBnZXRfbWFwKCkKICAgICAgICBzZWxmLl9tYXAgPSBfU2VsZWN0b3JNYXBwaW5nKHNlbGYpCgogICAgZGVmIF9maWxlb2JqX2xvb2t1cChzZWxmLCBmaWxlb2JqKToKICAgICAgICAiIiIgUmV0dXJuIGEgZmlsZSBkZXNjcmlwdG9yIGZyb20gYSBmaWxlIG9iamVjdC4KICAgICAgICBUaGlzIHdyYXBzIF9maWxlb2JqX3RvX2ZkKCkgdG8gZG8gYW4gZXhoYXVzdGl2ZQogICAgICAgIHNlYXJjaCBpbiBjYXNlIHRoZSBvYmplY3QgaXMgaW52YWxpZCBidXQgd2Ugc3RpbGwKICAgICAgICBoYXZlIGl0IGluIG91ciBtYXAuIFVzZWQgYnkgdW5yZWdpc3RlcigpIHNvIHdlIGNhbgogICAgICAgIHVucmVnaXN0ZXIgYW4gb2JqZWN0IHRoYXQgd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZAogICAgICAgIGV2ZW4gaWYgaXQgaXMgY2xvc2VkLiBJdCBpcyBhbHNvIHVzZWQgYnkgX1NlbGVjdG9yTWFwcGluZwogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIF9maWxlb2JqX3RvX2ZkKGZpbGVvYmopCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CgogICAgICAgICAgICAjIFNlYXJjaCB0aHJvdWdoIGFsbCBvdXIgbWFwcGVkIGtleXMuCiAgICAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5fZmRfdG9fa2V5LnZhbHVlcygpOgogICAgICAgICAgICAgICAgaWYga2V5LmZpbGVvYmogaXMgZmlsZW9iajoKICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5LmZkCgogICAgICAgICAgICAjIFJhaXNlIFZhbHVlRXJyb3IgYWZ0ZXIgYWxsLgogICAgICAgICAgICByYWlzZQoKICAgIGRlZiByZWdpc3RlcihzZWxmLCBmaWxlb2JqLCBldmVudHMsIGRhdGE9Tm9uZSk6CiAgICAgICAgIiIiIFJlZ2lzdGVyIGEgZmlsZSBvYmplY3QgZm9yIGEgc2V0IG9mIGV2ZW50cyB0byBtb25pdG9yLiAiIiIKICAgICAgICBpZiAobm90IGV2ZW50cykgb3IgKGV2ZW50cyAmIH4oRVZFTlRfUkVBRCB8IEVWRU5UX1dSSVRFKSk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgZXZlbnRzOiB7MCFyfSIuZm9ybWF0KGV2ZW50cykpCgogICAgICAgIGtleSA9IFNlbGVjdG9yS2V5KGZpbGVvYmosIHNlbGYuX2ZpbGVvYmpfbG9va3VwKGZpbGVvYmopLCBldmVudHMsIGRhdGEpCgogICAgICAgIGlmIGtleS5mZCBpbiBzZWxmLl9mZF90b19rZXk6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJ7MCFyfSAoRkQgezF9KSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoZmlsZW9iaiwga2V5LmZkKSkKCiAgICAgICAgc2VsZi5fZmRfdG9fa2V5W2tleS5mZF0gPSBrZXkKICAgICAgICByZXR1cm4ga2V5CgogICAgZGVmIHVucmVnaXN0ZXIoc2VsZiwgZmlsZW9iaik6CiAgICAgICAgIiIiIFVucmVnaXN0ZXIgYSBmaWxlIG9iamVjdCBmcm9tIGJlaW5nIG1vbml0b3JlZC4gIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBrZXkgPSBzZWxmLl9mZF90b19rZXkucG9wKHNlbGYuX2ZpbGVvYmpfbG9va3VwKGZpbGVvYmopKQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoInswIXJ9IGlzIG5vdCByZWdpc3RlcmVkIi5mb3JtYXQoZmlsZW9iaikpCgogICAgICAgICMgR2V0dGluZyB0aGUgZmlsZW5vIG9mIGEgY2xvc2VkIHNvY2tldCBvbiBXaW5kb3dzIGVycm9ycyB3aXRoIEVCQURGLgogICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFdpbmRvd3MuCiAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUJBREY6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9mZF90b19rZXkudmFsdWVzKCk6CiAgICAgICAgICAgICAgICAgICAgaWYga2V5LmZpbGVvYmogaXMgZmlsZW9iajoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmRfdG9fa2V5LnBvcChrZXkuZmQpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJ7MCFyfSBpcyBub3QgcmVnaXN0ZXJlZCIuZm9ybWF0KGZpbGVvYmopKQogICAgICAgIHJldHVybiBrZXkKCiAgICBkZWYgbW9kaWZ5KHNlbGYsIGZpbGVvYmosIGV2ZW50cywgZGF0YT1Ob25lKToKICAgICAgICAiIiIgQ2hhbmdlIGEgcmVnaXN0ZXJlZCBmaWxlIG9iamVjdCBtb25pdG9yZWQgZXZlbnRzIGFuZCBkYXRhLiAiIiIKICAgICAgICAjIE5PVEU6IFNvbWUgc3ViY2xhc3NlcyBvcHRpbWl6ZSB0aGlzIG9wZXJhdGlvbiBldmVuIGZ1cnRoZXIuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBrZXkgPSBzZWxmLl9mZF90b19rZXlbc2VsZi5fZmlsZW9ial9sb29rdXAoZmlsZW9iaildCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiezAhcn0gaXMgbm90IHJlZ2lzdGVyZWQiLmZvcm1hdChmaWxlb2JqKSkKCiAgICAgICAgaWYgZXZlbnRzICE9IGtleS5ldmVudHM6CiAgICAgICAgICAgIHNlbGYudW5yZWdpc3RlcihmaWxlb2JqKQogICAgICAgICAgICBrZXkgPSBzZWxmLnJlZ2lzdGVyKGZpbGVvYmosIGV2ZW50cywgZGF0YSkKCiAgICAgICAgZWxpZiBkYXRhICE9IGtleS5kYXRhOgogICAgICAgICAgICAjIFVzZSBhIHNob3J0Y3V0IHRvIHVwZGF0ZSB0aGUgZGF0YS4KICAgICAgICAgICAga2V5ID0ga2V5Ll9yZXBsYWNlKGRhdGE9ZGF0YSkKICAgICAgICAgICAgc2VsZi5fZmRfdG9fa2V5W2tleS5mZF0gPSBrZXkKCiAgICAgICAgcmV0dXJuIGtleQoKICAgIGRlZiBzZWxlY3Qoc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICAiIiIgUGVyZm9ybSB0aGUgYWN0dWFsIHNlbGVjdGlvbiB1bnRpbCBzb21lIG1vbml0b3JlZCBmaWxlIG9iamVjdHMKICAgICAgICBhcmUgcmVhZHkgb3IgdGhlIHRpbWVvdXQgZXhwaXJlcy4gIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIiBDbG9zZSB0aGUgc2VsZWN0b3IuIFRoaXMgbXVzdCBiZSBjYWxsZWQgdG8gZW5zdXJlIHRoYXQgYWxsCiAgICAgICAgdW5kZXJseWluZyByZXNvdXJjZXMgYXJlIGZyZWVkLiAiIiIKICAgICAgICBzZWxmLl9mZF90b19rZXkuY2xlYXIoKQogICAgICAgIHNlbGYuX21hcCA9IE5vbmUKCiAgICBkZWYgZ2V0X2tleShzZWxmLCBmaWxlb2JqKToKICAgICAgICAiIiIgUmV0dXJuIHRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIGEgcmVnaXN0ZXJlZCBmaWxlIG9iamVjdC4gIiIiCiAgICAgICAgbWFwcGluZyA9IHNlbGYuZ2V0X21hcCgpCiAgICAgICAgaWYgbWFwcGluZyBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlNlbGVjdG9yIGlzIGNsb3NlZCIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gbWFwcGluZ1tmaWxlb2JqXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoInswIXJ9IGlzIG5vdCByZWdpc3RlcmVkIi5mb3JtYXQoZmlsZW9iaikpCgogICAgZGVmIGdldF9tYXAoc2VsZik6CiAgICAgICAgIiIiIFJldHVybiBhIG1hcHBpbmcgb2YgZmlsZSBvYmplY3RzIHRvIHNlbGVjdG9yIGtleXMgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX21hcAoKICAgIGRlZiBfa2V5X2Zyb21fZmQoc2VsZiwgZmQpOgogICAgICAgICIiIiBSZXR1cm4gdGhlIGtleSBhc3NvY2lhdGVkIHRvIGEgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCiAgICAgICAgIFJldHVybiBOb25lIGlmIGl0IGlzIG5vdCBmb3VuZC4gIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZmRfdG9fa2V5W2ZkXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKICAgICAgICBzZWxmLmNsb3NlKCkKCgojIEFsbW9zdCBhbGwgcGxhdGZvcm1zIGhhdmUgc2VsZWN0LnNlbGVjdCgpCmlmIGhhc2F0dHIoc2VsZWN0LCAic2VsZWN0Iik6CiAgICBjbGFzcyBTZWxlY3RTZWxlY3RvcihCYXNlU2VsZWN0b3IpOgogICAgICAgICIiIiBTZWxlY3QtYmFzZWQgc2VsZWN0b3IuICIiIgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgc3VwZXIoU2VsZWN0U2VsZWN0b3IsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICAgICAgc2VsZi5fcmVhZGVycyA9IHNldCgpCiAgICAgICAgICAgIHNlbGYuX3dyaXRlcnMgPSBzZXQoKQoKICAgICAgICBkZWYgcmVnaXN0ZXIoc2VsZiwgZmlsZW9iaiwgZXZlbnRzLCBkYXRhPU5vbmUpOgogICAgICAgICAgICBrZXkgPSBzdXBlcihTZWxlY3RTZWxlY3Rvciwgc2VsZikucmVnaXN0ZXIoZmlsZW9iaiwgZXZlbnRzLCBkYXRhKQogICAgICAgICAgICBpZiBldmVudHMgJiBFVkVOVF9SRUFEOgogICAgICAgICAgICAgICAgc2VsZi5fcmVhZGVycy5hZGQoa2V5LmZkKQogICAgICAgICAgICBpZiBldmVudHMgJiBFVkVOVF9XUklURToKICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlcnMuYWRkKGtleS5mZCkKICAgICAgICAgICAgcmV0dXJuIGtleQoKICAgICAgICBkZWYgdW5yZWdpc3RlcihzZWxmLCBmaWxlb2JqKToKICAgICAgICAgICAga2V5ID0gc3VwZXIoU2VsZWN0U2VsZWN0b3IsIHNlbGYpLnVucmVnaXN0ZXIoZmlsZW9iaikKICAgICAgICAgICAgc2VsZi5fcmVhZGVycy5kaXNjYXJkKGtleS5mZCkKICAgICAgICAgICAgc2VsZi5fd3JpdGVycy5kaXNjYXJkKGtleS5mZCkKICAgICAgICAgICAgcmV0dXJuIGtleQoKICAgICAgICBkZWYgX3NlbGVjdChzZWxmLCByLCB3LCB0aW1lb3V0PU5vbmUpOgogICAgICAgICAgICAiIiIgV3JhcHBlciBmb3Igc2VsZWN0LnNlbGVjdCBiZWNhdXNlIHRpbWVvdXQgaXMgYSBwb3NpdGlvbmFsIGFyZyAiIiIKICAgICAgICAgICAgcmV0dXJuIHNlbGVjdC5zZWxlY3QociwgdywgW10sIHRpbWVvdXQpCgogICAgICAgIGRlZiBzZWxlY3Qoc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICAgICAgIyBTZWxlY3Rpbmcgb24gZW1wdHkgbGlzdHMgb24gV2luZG93cyBlcnJvcnMgb3V0LgogICAgICAgICAgICBpZiBub3QgbGVuKHNlbGYuX3JlYWRlcnMpIGFuZCBub3QgbGVuKHNlbGYuX3dyaXRlcnMpOgogICAgICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgICAgICB0aW1lb3V0ID0gTm9uZSBpZiB0aW1lb3V0IGlzIE5vbmUgZWxzZSBtYXgodGltZW91dCwgMC4wKQogICAgICAgICAgICByZWFkeSA9IFtdCiAgICAgICAgICAgIHIsIHcsIF8gPSBfc3lzY2FsbF93cmFwcGVyKHNlbGYuX3NlbGVjdCwgVHJ1ZSwgc2VsZi5fcmVhZGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVycywgdGltZW91dCkKICAgICAgICAgICAgciA9IHNldChyKQogICAgICAgICAgICB3ID0gc2V0KHcpCiAgICAgICAgICAgIGZvciBmZCBpbiByIHwgdzoKICAgICAgICAgICAgICAgIGV2ZW50cyA9IDAKICAgICAgICAgICAgICAgIGlmIGZkIGluIHI6CiAgICAgICAgICAgICAgICAgICAgZXZlbnRzIHw9IEVWRU5UX1JFQUQKICAgICAgICAgICAgICAgIGlmIGZkIGluIHc6CiAgICAgICAgICAgICAgICAgICAgZXZlbnRzIHw9IEVWRU5UX1dSSVRFCgogICAgICAgICAgICAgICAga2V5ID0gc2VsZi5fa2V5X2Zyb21fZmQoZmQpCiAgICAgICAgICAgICAgICBpZiBrZXk6CiAgICAgICAgICAgICAgICAgICAgcmVhZHkuYXBwZW5kKChrZXksIGV2ZW50cyAmIGtleS5ldmVudHMpKQogICAgICAgICAgICByZXR1cm4gcmVhZHkKCgppZiBoYXNhdHRyKHNlbGVjdCwgInBvbGwiKToKICAgIGNsYXNzIFBvbGxTZWxlY3RvcihCYXNlU2VsZWN0b3IpOgogICAgICAgICIiIiBQb2xsLWJhc2VkIHNlbGVjdG9yICIiIgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgc3VwZXIoUG9sbFNlbGVjdG9yLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgICAgIHNlbGYuX3BvbGwgPSBzZWxlY3QucG9sbCgpCgogICAgICAgIGRlZiByZWdpc3RlcihzZWxmLCBmaWxlb2JqLCBldmVudHMsIGRhdGE9Tm9uZSk6CiAgICAgICAgICAgIGtleSA9IHN1cGVyKFBvbGxTZWxlY3Rvciwgc2VsZikucmVnaXN0ZXIoZmlsZW9iaiwgZXZlbnRzLCBkYXRhKQogICAgICAgICAgICBldmVudF9tYXNrID0gMAogICAgICAgICAgICBpZiBldmVudHMgJiBFVkVOVF9SRUFEOgogICAgICAgICAgICAgICAgZXZlbnRfbWFzayB8PSBzZWxlY3QuUE9MTElOCiAgICAgICAgICAgIGlmIGV2ZW50cyAmIEVWRU5UX1dSSVRFOgogICAgICAgICAgICAgICAgZXZlbnRfbWFzayB8PSBzZWxlY3QuUE9MTE9VVAogICAgICAgICAgICBzZWxmLl9wb2xsLnJlZ2lzdGVyKGtleS5mZCwgZXZlbnRfbWFzaykKICAgICAgICAgICAgcmV0dXJuIGtleQoKICAgICAgICBkZWYgdW5yZWdpc3RlcihzZWxmLCBmaWxlb2JqKToKICAgICAgICAgICAga2V5ID0gc3VwZXIoUG9sbFNlbGVjdG9yLCBzZWxmKS51bnJlZ2lzdGVyKGZpbGVvYmopCiAgICAgICAgICAgIHNlbGYuX3BvbGwudW5yZWdpc3RlcihrZXkuZmQpCiAgICAgICAgICAgIHJldHVybiBrZXkKCiAgICAgICAgZGVmIF93cmFwX3BvbGwoc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICAgICAgIiIiIFdyYXBwZXIgZnVuY3Rpb24gZm9yIHNlbGVjdC5wb2xsLnBvbGwoKSBzbyB0aGF0CiAgICAgICAgICAgIF9zeXNjYWxsX3dyYXBwZXIgY2FuIHdvcmsgd2l0aCBvbmx5IHNlY29uZHMuICIiIgogICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgaWYgdGltZW91dCA8PSAwOgogICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSAwCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgc2VsZWN0LnBvbGwucG9sbCgpIGhhcyBhIHJlc29sdXRpb24gb2YgMSBtaWxsaXNlY29uZCwKICAgICAgICAgICAgICAgICAgICAjIHJvdW5kIGF3YXkgZnJvbSB6ZXJvIHRvIHdhaXQgKmF0IGxlYXN0KiB0aW1lb3V0IHNlY29uZHMuCiAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IG1hdGguY2VpbCh0aW1lb3V0ICogMWUzKQoKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fcG9sbC5wb2xsKHRpbWVvdXQpCiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICAgICAgZGVmIHNlbGVjdChzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICAgICByZWFkeSA9IFtdCiAgICAgICAgICAgIGZkX2V2ZW50cyA9IF9zeXNjYWxsX3dyYXBwZXIoc2VsZi5fd3JhcF9wb2xsLCBUcnVlLCB0aW1lb3V0PXRpbWVvdXQpCiAgICAgICAgICAgIGZvciBmZCwgZXZlbnRfbWFzayBpbiBmZF9ldmVudHM6CiAgICAgICAgICAgICAgICBldmVudHMgPSAwCiAgICAgICAgICAgICAgICBpZiBldmVudF9tYXNrICYgfnNlbGVjdC5QT0xMSU46CiAgICAgICAgICAgICAgICAgICAgZXZlbnRzIHw9IEVWRU5UX1dSSVRFCiAgICAgICAgICAgICAgICBpZiBldmVudF9tYXNrICYgfnNlbGVjdC5QT0xMT1VUOgogICAgICAgICAgICAgICAgICAgIGV2ZW50cyB8PSBFVkVOVF9SRUFECgogICAgICAgICAgICAgICAga2V5ID0gc2VsZi5fa2V5X2Zyb21fZmQoZmQpCiAgICAgICAgICAgICAgICBpZiBrZXk6CiAgICAgICAgICAgICAgICAgICAgcmVhZHkuYXBwZW5kKChrZXksIGV2ZW50cyAmIGtleS5ldmVudHMpKQoKICAgICAgICAgICAgcmV0dXJuIHJlYWR5CgoKaWYgaGFzYXR0cihzZWxlY3QsICJlcG9sbCIpOgogICAgY2xhc3MgRXBvbGxTZWxlY3RvcihCYXNlU2VsZWN0b3IpOgogICAgICAgICIiIiBFcG9sbC1iYXNlZCBzZWxlY3RvciAiIiIKICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgICAgIHN1cGVyKEVwb2xsU2VsZWN0b3IsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICAgICAgc2VsZi5fZXBvbGwgPSBzZWxlY3QuZXBvbGwoKQoKICAgICAgICBkZWYgZmlsZW5vKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZXBvbGwuZmlsZW5vKCkKCiAgICAgICAgZGVmIHJlZ2lzdGVyKHNlbGYsIGZpbGVvYmosIGV2ZW50cywgZGF0YT1Ob25lKToKICAgICAgICAgICAga2V5ID0gc3VwZXIoRXBvbGxTZWxlY3Rvciwgc2VsZikucmVnaXN0ZXIoZmlsZW9iaiwgZXZlbnRzLCBkYXRhKQogICAgICAgICAgICBldmVudHNfbWFzayA9IDAKICAgICAgICAgICAgaWYgZXZlbnRzICYgRVZFTlRfUkVBRDoKICAgICAgICAgICAgICAgIGV2ZW50c19tYXNrIHw9IHNlbGVjdC5FUE9MTElOCiAgICAgICAgICAgIGlmIGV2ZW50cyAmIEVWRU5UX1dSSVRFOgogICAgICAgICAgICAgICAgZXZlbnRzX21hc2sgfD0gc2VsZWN0LkVQT0xMT1VUCiAgICAgICAgICAgIF9zeXNjYWxsX3dyYXBwZXIoc2VsZi5fZXBvbGwucmVnaXN0ZXIsIEZhbHNlLCBrZXkuZmQsIGV2ZW50c19tYXNrKQogICAgICAgICAgICByZXR1cm4ga2V5CgogICAgICAgIGRlZiB1bnJlZ2lzdGVyKHNlbGYsIGZpbGVvYmopOgogICAgICAgICAgICBrZXkgPSBzdXBlcihFcG9sbFNlbGVjdG9yLCBzZWxmKS51bnJlZ2lzdGVyKGZpbGVvYmopCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIF9zeXNjYWxsX3dyYXBwZXIoc2VsZi5fZXBvbGwudW5yZWdpc3RlciwgRmFsc2UsIGtleS5mZCkKICAgICAgICAgICAgZXhjZXB0IFNlbGVjdG9yRXJyb3I6CiAgICAgICAgICAgICAgICAjIFRoaXMgY2FuIG9jY3VyIHdoZW4gdGhlIGZkIHdhcyBjbG9zZWQgc2luY2UgcmVnaXN0cnkuCiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIHJldHVybiBrZXkKCiAgICAgICAgZGVmIHNlbGVjdChzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgaWYgdGltZW91dCA8PSAwOgogICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSAwLjAKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBzZWxlY3QuZXBvbGwucG9sbCgpIGhhcyBhIHJlc29sdXRpb24gb2YgMSBtaWxsaXNlY29uZAogICAgICAgICAgICAgICAgICAgICMgYnV0IGx1Y2tpbHkgdGFrZXMgc2Vjb25kcyBzbyB3ZSBkb24ndCBuZWVkIGEgd3JhcHBlcgogICAgICAgICAgICAgICAgICAgICMgbGlrZSBQb2xsU2VsZWN0b3IuIEp1c3QgZm9yIGJldHRlciByb3VuZGluZy4KICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gbWF0aC5jZWlsKHRpbWVvdXQgKiAxZTMpICogMWUtMwogICAgICAgICAgICAgICAgdGltZW91dCA9IGZsb2F0KHRpbWVvdXQpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB0aW1lb3V0ID0gLTEuMCAgIyBlcG9sbC5wb2xsKCkgbXVzdCBoYXZlIGEgZmxvYXQuCgogICAgICAgICAgICAjIFdlIGFsd2F5cyB3YW50IGF0IGxlYXN0IDEgdG8gZW5zdXJlIHRoYXQgc2VsZWN0IGNhbiBiZSBjYWxsZWQKICAgICAgICAgICAgIyB3aXRoIG5vIGZpbGUgZGVzY3JpcHRvcnMgcmVnaXN0ZXJlZC4gT3RoZXJ3aXNlIHdpbGwgZmFpbC4KICAgICAgICAgICAgbWF4X2V2ZW50cyA9IG1heChsZW4oc2VsZi5fZmRfdG9fa2V5KSwgMSkKCiAgICAgICAgICAgIHJlYWR5ID0gW10KICAgICAgICAgICAgZmRfZXZlbnRzID0gX3N5c2NhbGxfd3JhcHBlcihzZWxmLl9lcG9sbC5wb2xsLCBUcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9dGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhldmVudHM9bWF4X2V2ZW50cykKICAgICAgICAgICAgZm9yIGZkLCBldmVudF9tYXNrIGluIGZkX2V2ZW50czoKICAgICAgICAgICAgICAgIGV2ZW50cyA9IDAKICAgICAgICAgICAgICAgIGlmIGV2ZW50X21hc2sgJiB+c2VsZWN0LkVQT0xMSU46CiAgICAgICAgICAgICAgICAgICAgZXZlbnRzIHw9IEVWRU5UX1dSSVRFCiAgICAgICAgICAgICAgICBpZiBldmVudF9tYXNrICYgfnNlbGVjdC5FUE9MTE9VVDoKICAgICAgICAgICAgICAgICAgICBldmVudHMgfD0gRVZFTlRfUkVBRAoKICAgICAgICAgICAgICAgIGtleSA9IHNlbGYuX2tleV9mcm9tX2ZkKGZkKQogICAgICAgICAgICAgICAgaWYga2V5OgogICAgICAgICAgICAgICAgICAgIHJlYWR5LmFwcGVuZCgoa2V5LCBldmVudHMgJiBrZXkuZXZlbnRzKSkKICAgICAgICAgICAgcmV0dXJuIHJlYWR5CgogICAgICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgICAgc2VsZi5fZXBvbGwuY2xvc2UoKQogICAgICAgICAgICBzdXBlcihFcG9sbFNlbGVjdG9yLCBzZWxmKS5jbG9zZSgpCgoKaWYgaGFzYXR0cihzZWxlY3QsICJrcXVldWUiKToKICAgIGNsYXNzIEtxdWV1ZVNlbGVjdG9yKEJhc2VTZWxlY3Rvcik6CiAgICAgICAgIiIiIEtxdWV1ZSAvIEtldmVudC1iYXNlZCBzZWxlY3RvciAiIiIKICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgICAgIHN1cGVyKEtxdWV1ZVNlbGVjdG9yLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgICAgIHNlbGYuX2txdWV1ZSA9IHNlbGVjdC5rcXVldWUoKQoKICAgICAgICBkZWYgZmlsZW5vKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fa3F1ZXVlLmZpbGVubygpCgogICAgICAgIGRlZiByZWdpc3RlcihzZWxmLCBmaWxlb2JqLCBldmVudHMsIGRhdGE9Tm9uZSk6CiAgICAgICAgICAgIGtleSA9IHN1cGVyKEtxdWV1ZVNlbGVjdG9yLCBzZWxmKS5yZWdpc3RlcihmaWxlb2JqLCBldmVudHMsIGRhdGEpCiAgICAgICAgICAgIGlmIGV2ZW50cyAmIEVWRU5UX1JFQUQ6CiAgICAgICAgICAgICAgICBrZXZlbnQgPSBzZWxlY3Qua2V2ZW50KGtleS5mZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0ZJTFRFUl9SRUFELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuS1FfRVZfQUREKQoKICAgICAgICAgICAgICAgIF9zeXNjYWxsX3dyYXBwZXIoc2VsZi5fa3F1ZXVlLmNvbnRyb2wsIEZhbHNlLCBba2V2ZW50XSwgMCwgMCkKCiAgICAgICAgICAgIGlmIGV2ZW50cyAmIEVWRU5UX1dSSVRFOgogICAgICAgICAgICAgICAga2V2ZW50ID0gc2VsZWN0LmtldmVudChrZXkuZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9GSUxURVJfV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9FVl9BREQpCgogICAgICAgICAgICAgICAgX3N5c2NhbGxfd3JhcHBlcihzZWxmLl9rcXVldWUuY29udHJvbCwgRmFsc2UsIFtrZXZlbnRdLCAwLCAwKQoKICAgICAgICAgICAgcmV0dXJuIGtleQoKICAgICAgICBkZWYgdW5yZWdpc3RlcihzZWxmLCBmaWxlb2JqKToKICAgICAgICAgICAga2V5ID0gc3VwZXIoS3F1ZXVlU2VsZWN0b3IsIHNlbGYpLnVucmVnaXN0ZXIoZmlsZW9iaikKICAgICAgICAgICAgaWYga2V5LmV2ZW50cyAmIEVWRU5UX1JFQUQ6CiAgICAgICAgICAgICAgICBrZXZlbnQgPSBzZWxlY3Qua2V2ZW50KGtleS5mZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0ZJTFRFUl9SRUFELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuS1FfRVZfREVMRVRFKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIF9zeXNjYWxsX3dyYXBwZXIoc2VsZi5fa3F1ZXVlLmNvbnRyb2wsIEZhbHNlLCBba2V2ZW50XSwgMCwgMCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBTZWxlY3RvckVycm9yOgogICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgaWYga2V5LmV2ZW50cyAmIEVWRU5UX1dSSVRFOgogICAgICAgICAgICAgICAga2V2ZW50ID0gc2VsZWN0LmtldmVudChrZXkuZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9GSUxURVJfV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9FVl9ERUxFVEUpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgX3N5c2NhbGxfd3JhcHBlcihzZWxmLl9rcXVldWUuY29udHJvbCwgRmFsc2UsIFtrZXZlbnRdLCAwLCAwKQogICAgICAgICAgICAgICAgZXhjZXB0IFNlbGVjdG9yRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICAgICAgcmV0dXJuIGtleQoKICAgICAgICBkZWYgc2VsZWN0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICB0aW1lb3V0ID0gbWF4KHRpbWVvdXQsIDApCgogICAgICAgICAgICBtYXhfZXZlbnRzID0gbGVuKHNlbGYuX2ZkX3RvX2tleSkgKiAyCiAgICAgICAgICAgIHJlYWR5X2ZkcyA9IHt9CgogICAgICAgICAgICBrZXZlbnRfbGlzdCA9IF9zeXNjYWxsX3dyYXBwZXIoc2VsZi5fa3F1ZXVlLmNvbnRyb2wsIFRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCBtYXhfZXZlbnRzLCB0aW1lb3V0KQoKICAgICAgICAgICAgZm9yIGtldmVudCBpbiBrZXZlbnRfbGlzdDoKICAgICAgICAgICAgICAgIGZkID0ga2V2ZW50LmlkZW50CiAgICAgICAgICAgICAgICBldmVudF9tYXNrID0ga2V2ZW50LmZpbHRlcgogICAgICAgICAgICAgICAgZXZlbnRzID0gMAogICAgICAgICAgICAgICAgaWYgZXZlbnRfbWFzayA9PSBzZWxlY3QuS1FfRklMVEVSX1JFQUQ6CiAgICAgICAgICAgICAgICAgICAgZXZlbnRzIHw9IEVWRU5UX1JFQUQKICAgICAgICAgICAgICAgIGlmIGV2ZW50X21hc2sgPT0gc2VsZWN0LktRX0ZJTFRFUl9XUklURToKICAgICAgICAgICAgICAgICAgICBldmVudHMgfD0gRVZFTlRfV1JJVEUKCiAgICAgICAgICAgICAgICBrZXkgPSBzZWxmLl9rZXlfZnJvbV9mZChmZCkKICAgICAgICAgICAgICAgIGlmIGtleToKICAgICAgICAgICAgICAgICAgICBpZiBrZXkuZmQgbm90IGluIHJlYWR5X2ZkczoKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHlfZmRzW2tleS5mZF0gPSAoa2V5LCBldmVudHMgJiBrZXkuZXZlbnRzKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9ldmVudHMgPSByZWFkeV9mZHNba2V5LmZkXVsxXQogICAgICAgICAgICAgICAgICAgICAgICByZWFkeV9mZHNba2V5LmZkXSA9IChrZXksIChldmVudHMgfCBvbGRfZXZlbnRzKSAmIGtleS5ldmVudHMpCgogICAgICAgICAgICByZXR1cm4gbGlzdChyZWFkeV9mZHMudmFsdWVzKCkpCgogICAgICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgICAgc2VsZi5fa3F1ZXVlLmNsb3NlKCkKICAgICAgICAgICAgc3VwZXIoS3F1ZXVlU2VsZWN0b3IsIHNlbGYpLmNsb3NlKCkKCgppZiBub3QgaGFzYXR0cihzZWxlY3QsICdzZWxlY3QnKTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IEFwcEVuZ2luZQogICAgSEFTX1NFTEVDVCA9IEZhbHNlCgoKZGVmIF9jYW5fYWxsb2NhdGUoc3RydWN0KToKICAgICIiIiBDaGVja3MgdGhhdCBzZWxlY3Qgc3RydWN0cyBjYW4gYmUgYWxsb2NhdGVkIGJ5IHRoZSB1bmRlcmx5aW5nCiAgICBvcGVyYXRpbmcgc3lzdGVtLCBub3QganVzdCBhZHZlcnRpc2VkIGJ5IHRoZSBzZWxlY3QgbW9kdWxlLiBXZSBkb24ndAogICAgY2hlY2sgc2VsZWN0KCkgYmVjYXVzZSB3ZSdsbCBiZSBob3BlZnVsIHRoYXQgbW9zdCBwbGF0Zm9ybXMgdGhhdAogICAgZG9uJ3QgaGF2ZSBpdCBhdmFpbGFibGUgd2lsbCBub3QgYWR2ZXJ0aXNlIGl0LiAoaWU6IEdBRSkgIiIiCiAgICB0cnk6CiAgICAgICAgIyBzZWxlY3QucG9sbCgpIG9iamVjdHMgd29uJ3QgZmFpbCB1bnRpbCB1c2VkLgogICAgICAgIGlmIHN0cnVjdCA9PSAncG9sbCc6CiAgICAgICAgICAgIHAgPSBzZWxlY3QucG9sbCgpCiAgICAgICAgICAgIHAucG9sbCgwKQoKICAgICAgICAjIEFsbCBvdGhlcnMgd2lsbCBmYWlsIG9uIGFsbG9jYXRpb24uCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZ2V0YXR0cihzZWxlY3QsIHN0cnVjdCkoKS5jbG9zZSgpCiAgICAgICAgcmV0dXJuIFRydWUKICAgIGV4Y2VwdCAoT1NFcnJvciwgQXR0cmlidXRlRXJyb3IpIGFzIGU6CiAgICAgICAgcmV0dXJuIEZhbHNlCgoKIyBDaG9vc2UgdGhlIGJlc3QgaW1wbGVtZW50YXRpb24sIHJvdWdobHk6CiMga3F1ZXVlID09IGVwb2xsID4gcG9sbCA+IHNlbGVjdC4gRGV2cG9sbCBub3Qgc3VwcG9ydGVkLiAoU2VlIGFib3ZlKQojIHNlbGVjdCgpIGFsc28gY2FuJ3QgYWNjZXB0IGEgRkQgPiBGRF9TRVRTSVpFICh1c3VhbGx5IGFyb3VuZCAxMDI0KQpkZWYgRGVmYXVsdFNlbGVjdG9yKCk6CiAgICAiIiIgVGhpcyBmdW5jdGlvbiBzZXJ2ZXMgYXMgYSBmaXJzdCBjYWxsIGZvciBEZWZhdWx0U2VsZWN0b3IgdG8KICAgIGRldGVjdCBpZiB0aGUgc2VsZWN0IG1vZHVsZSBpcyBiZWluZyBtb25rZXktcGF0Y2hlZCBpbmNvcnJlY3RseQogICAgYnkgZXZlbnRsZXQsIGdyZWVubGV0LCBhbmQgcHJlc2VydmUgcHJvcGVyIGJlaGF2aW9yLiAiIiIKICAgIGdsb2JhbCBfREVGQVVMVF9TRUxFQ1RPUgogICAgaWYgX0RFRkFVTFRfU0VMRUNUT1IgaXMgTm9uZToKICAgICAgICBpZiBfY2FuX2FsbG9jYXRlKCdrcXVldWUnKToKICAgICAgICAgICAgX0RFRkFVTFRfU0VMRUNUT1IgPSBLcXVldWVTZWxlY3RvcgogICAgICAgIGVsaWYgX2Nhbl9hbGxvY2F0ZSgnZXBvbGwnKToKICAgICAgICAgICAgX0RFRkFVTFRfU0VMRUNUT1IgPSBFcG9sbFNlbGVjdG9yCiAgICAgICAgZWxpZiBfY2FuX2FsbG9jYXRlKCdwb2xsJyk6CiAgICAgICAgICAgIF9ERUZBVUxUX1NFTEVDVE9SID0gUG9sbFNlbGVjdG9yCiAgICAgICAgZWxpZiBoYXNhdHRyKHNlbGVjdCwgJ3NlbGVjdCcpOgogICAgICAgICAgICBfREVGQVVMVF9TRUxFQ1RPUiA9IFNlbGVjdFNlbGVjdG9yCiAgICAgICAgZWxzZTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IEFwcEVuZ2luZQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdQbGF0Zm9ybSBkb2VzIG5vdCBoYXZlIGEgc2VsZWN0b3InKQogICAgcmV0dXJuIF9ERUZBVUxUX1NFTEVDVE9SKCkKUEsDBBQAAAAAAAAAIQDV78iisC8AALAvAAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9zc2xfLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKaW1wb3J0IGVycm5vCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgaG1hYwoKZnJvbSBiaW5hc2NpaSBpbXBvcnQgaGV4bGlmeSwgdW5oZXhsaWZ5CmZyb20gaGFzaGxpYiBpbXBvcnQgbWQ1LCBzaGExLCBzaGEyNTYKCmZyb20gLi5leGNlcHRpb25zIGltcG9ydCBTU0xFcnJvciwgSW5zZWN1cmVQbGF0Zm9ybVdhcm5pbmcsIFNOSU1pc3NpbmdXYXJuaW5nCgoKU1NMQ29udGV4dCA9IE5vbmUKSEFTX1NOSSA9IEZhbHNlCklTX1BZT1BFTlNTTCA9IEZhbHNlCklTX1NFQ1VSRVRSQU5TUE9SVCA9IEZhbHNlCgojIE1hcHMgdGhlIGxlbmd0aCBvZiBhIGRpZ2VzdCB0byBhIHBvc3NpYmxlIGhhc2ggZnVuY3Rpb24gcHJvZHVjaW5nIHRoaXMgZGlnZXN0CkhBU0hGVU5DX01BUCA9IHsKICAgIDMyOiBtZDUsCiAgICA0MDogc2hhMSwKICAgIDY0OiBzaGEyNTYsCn0KCgpkZWYgX2NvbnN0X2NvbXBhcmVfZGlnZXN0X2JhY2twb3J0KGEsIGIpOgogICAgIiIiCiAgICBDb21wYXJlIHR3byBkaWdlc3RzIG9mIGVxdWFsIGxlbmd0aCBpbiBjb25zdGFudCB0aW1lLgoKICAgIFRoZSBkaWdlc3RzIG11c3QgYmUgb2YgdHlwZSBzdHIvYnl0ZXMuCiAgICBSZXR1cm5zIFRydWUgaWYgdGhlIGRpZ2VzdHMgbWF0Y2gsIGFuZCBGYWxzZSBvdGhlcndpc2UuCiAgICAiIiIKICAgIHJlc3VsdCA9IGFicyhsZW4oYSkgLSBsZW4oYikpCiAgICBmb3IgbCwgciBpbiB6aXAoYnl0ZWFycmF5KGEpLCBieXRlYXJyYXkoYikpOgogICAgICAgIHJlc3VsdCB8PSBsIF4gcgogICAgcmV0dXJuIHJlc3VsdCA9PSAwCgoKX2NvbnN0X2NvbXBhcmVfZGlnZXN0ID0gZ2V0YXR0cihobWFjLCAnY29tcGFyZV9kaWdlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb25zdF9jb21wYXJlX2RpZ2VzdF9iYWNrcG9ydCkKCgp0cnk6ICAjIFRlc3QgZm9yIFNTTCBmZWF0dXJlcwogICAgaW1wb3J0IHNzbAogICAgZnJvbSBzc2wgaW1wb3J0IHdyYXBfc29ja2V0LCBDRVJUX05PTkUsIFBST1RPQ09MX1NTTHYyMwogICAgZnJvbSBzc2wgaW1wb3J0IEhBU19TTkkgICMgSGFzIFNOST8KZXhjZXB0IEltcG9ydEVycm9yOgogICAgcGFzcwoKCnRyeToKICAgIGZyb20gc3NsIGltcG9ydCBPUF9OT19TU0x2MiwgT1BfTk9fU1NMdjMsIE9QX05PX0NPTVBSRVNTSU9OCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIE9QX05PX1NTTHYyLCBPUF9OT19TU0x2MyA9IDB4MTAwMDAwMCwgMHgyMDAwMDAwCiAgICBPUF9OT19DT01QUkVTU0lPTiA9IDB4MjAwMDAKCiMgQSBzZWN1cmUgZGVmYXVsdC4KIyBTb3VyY2VzIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRMUyBjaXBoZXJzOgojCiMgLSBodHRwczovL3dpa2kubW96aWxsYS5vcmcvU2VjdXJpdHkvU2VydmVyX1NpZGVfVExTCiMgLSBodHRwczovL3d3dy5zc2xsYWJzLmNvbS9wcm9qZWN0cy9iZXN0LXByYWN0aWNlcy9pbmRleC5odG1sCiMgLSBodHRwczovL2h5bmVrLm1lL2FydGljbGVzL2hhcmRlbmluZy15b3VyLXdlYi1zZXJ2ZXJzLXNzbC1jaXBoZXJzLwojCiMgVGhlIGdlbmVyYWwgaW50ZW50IGlzOgojIC0gUHJlZmVyIFRMUyAxLjMgY2lwaGVyIHN1aXRlcwojIC0gcHJlZmVyIGNpcGhlciBzdWl0ZXMgdGhhdCBvZmZlciBwZXJmZWN0IGZvcndhcmQgc2VjcmVjeSAoREhFL0VDREhFKSwKIyAtIHByZWZlciBFQ0RIRSBvdmVyIERIRSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLAojIC0gcHJlZmVyIGFueSBBRVMtR0NNIGFuZCBDaGFDaGEyMCBvdmVyIGFueSBBRVMtQ0JDIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kCiMgICBzZWN1cml0eSwKIyAtIHByZWZlciBBRVMtR0NNIG92ZXIgQ2hhQ2hhMjAgYmVjYXVzZSBoYXJkd2FyZS1hY2NlbGVyYXRlZCBBRVMgaXMgY29tbW9uLAojIC0gZGlzYWJsZSBOVUxMIGF1dGhlbnRpY2F0aW9uLCBNRDUgTUFDcyBhbmQgRFNTIGZvciBzZWN1cml0eSByZWFzb25zLgpERUZBVUxUX0NJUEhFUlMgPSAnOicuam9pbihbCiAgICAnVExTMTMtQUVTLTI1Ni1HQ00tU0hBMzg0JywKICAgICdUTFMxMy1DSEFDSEEyMC1QT0xZMTMwNS1TSEEyNTYnLAogICAgJ1RMUzEzLUFFUy0xMjgtR0NNLVNIQTI1NicsCiAgICAnRUNESCtBRVNHQ00nLAogICAgJ0VDREgrQ0hBQ0hBMjAnLAogICAgJ0RIK0FFU0dDTScsCiAgICAnREgrQ0hBQ0hBMjAnLAogICAgJ0VDREgrQUVTMjU2JywKICAgICdESCtBRVMyNTYnLAogICAgJ0VDREgrQUVTMTI4JywKICAgICdESCtBRVMnLAogICAgJ1JTQStBRVNHQ00nLAogICAgJ1JTQStBRVMnLAogICAgJyFhTlVMTCcsCiAgICAnIWVOVUxMJywKICAgICchTUQ1JywKXSkKCnRyeToKICAgIGZyb20gc3NsIGltcG9ydCBTU0xDb250ZXh0ICAjIE1vZGVybiBTU0w/CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydCBzeXMKCiAgICBjbGFzcyBTU0xDb250ZXh0KG9iamVjdCk6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMiAmIDMuMQogICAgICAgIHN1cHBvcnRzX3NldF9jaXBoZXJzID0gKCgyLCA3KSA8PSBzeXMudmVyc2lvbl9pbmZvIDwgKDMsKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzLCAyKSA8PSBzeXMudmVyc2lvbl9pbmZvKQoKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2xfdmVyc2lvbik6CiAgICAgICAgICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbF92ZXJzaW9uCiAgICAgICAgICAgICMgVXNlIGRlZmF1bHQgdmFsdWVzIGZyb20gYSByZWFsIFNTTENvbnRleHQKICAgICAgICAgICAgc2VsZi5jaGVja19ob3N0bmFtZSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9OT05FCiAgICAgICAgICAgIHNlbGYuY2FfY2VydHMgPSBOb25lCiAgICAgICAgICAgIHNlbGYub3B0aW9ucyA9IDAKICAgICAgICAgICAgc2VsZi5jZXJ0ZmlsZSA9IE5vbmUKICAgICAgICAgICAgc2VsZi5rZXlmaWxlID0gTm9uZQogICAgICAgICAgICBzZWxmLmNpcGhlcnMgPSBOb25lCgogICAgICAgIGRlZiBsb2FkX2NlcnRfY2hhaW4oc2VsZiwgY2VydGZpbGUsIGtleWZpbGUpOgogICAgICAgICAgICBzZWxmLmNlcnRmaWxlID0gY2VydGZpbGUKICAgICAgICAgICAgc2VsZi5rZXlmaWxlID0ga2V5ZmlsZQoKICAgICAgICBkZWYgbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNlbGYsIGNhZmlsZT1Ob25lLCBjYXBhdGg9Tm9uZSk6CiAgICAgICAgICAgIHNlbGYuY2FfY2VydHMgPSBjYWZpbGUKCiAgICAgICAgICAgIGlmIGNhcGF0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHJhaXNlIFNTTEVycm9yKCJDQSBkaXJlY3RvcmllcyBub3Qgc3VwcG9ydGVkIGluIG9sZGVyIFB5dGhvbnMiKQoKICAgICAgICBkZWYgc2V0X2NpcGhlcnMoc2VsZiwgY2lwaGVyX3N1aXRlKToKICAgICAgICAgICAgaWYgbm90IHNlbGYuc3VwcG9ydHNfc2V0X2NpcGhlcnM6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ1lvdXIgdmVyc2lvbiBvZiBQeXRob24gZG9lcyBub3Qgc3VwcG9ydCBzZXR0aW5nICcKICAgICAgICAgICAgICAgICAgICAnYSBjdXN0b20gY2lwaGVyIHN1aXRlLiBQbGVhc2UgdXBncmFkZSB0byBQeXRob24gJwogICAgICAgICAgICAgICAgICAgICcyLjcsIDMuMiwgb3IgbGF0ZXIgaWYgeW91IG5lZWQgdGhpcyBmdW5jdGlvbmFsaXR5LicKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5jaXBoZXJzID0gY2lwaGVyX3N1aXRlCgogICAgICAgIGRlZiB3cmFwX3NvY2tldChzZWxmLCBzb2NrZXQsIHNlcnZlcl9ob3N0bmFtZT1Ob25lLCBzZXJ2ZXJfc2lkZT1GYWxzZSk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAnQSB0cnVlIFNTTENvbnRleHQgb2JqZWN0IGlzIG5vdCBhdmFpbGFibGUuIFRoaXMgcHJldmVudHMgJwogICAgICAgICAgICAgICAgJ3VybGxpYjMgZnJvbSBjb25maWd1cmluZyBTU0wgYXBwcm9wcmlhdGVseSBhbmQgbWF5IGNhdXNlICcKICAgICAgICAgICAgICAgICdjZXJ0YWluIFNTTCBjb25uZWN0aW9ucyB0byBmYWlsLiBZb3UgY2FuIHVwZ3JhZGUgdG8gYSBuZXdlciAnCiAgICAgICAgICAgICAgICAndmVyc2lvbiBvZiBQeXRob24gdG8gc29sdmUgdGhpcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAnCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly91cmxsaWIzLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9hZHZhbmNlZC11c2FnZS5odG1sJwogICAgICAgICAgICAgICAgJyNzc2wtd2FybmluZ3MnLAogICAgICAgICAgICAgICAgSW5zZWN1cmVQbGF0Zm9ybVdhcm5pbmcKICAgICAgICAgICAgKQogICAgICAgICAgICBrd2FyZ3MgPSB7CiAgICAgICAgICAgICAgICAna2V5ZmlsZSc6IHNlbGYua2V5ZmlsZSwKICAgICAgICAgICAgICAgICdjZXJ0ZmlsZSc6IHNlbGYuY2VydGZpbGUsCiAgICAgICAgICAgICAgICAnY2FfY2VydHMnOiBzZWxmLmNhX2NlcnRzLAogICAgICAgICAgICAgICAgJ2NlcnRfcmVxcyc6IHNlbGYudmVyaWZ5X21vZGUsCiAgICAgICAgICAgICAgICAnc3NsX3ZlcnNpb24nOiBzZWxmLnByb3RvY29sLAogICAgICAgICAgICAgICAgJ3NlcnZlcl9zaWRlJzogc2VydmVyX3NpZGUsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgc2VsZi5zdXBwb3J0c19zZXRfY2lwaGVyczogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAyLjcrCiAgICAgICAgICAgICAgICByZXR1cm4gd3JhcF9zb2NrZXQoc29ja2V0LCBjaXBoZXJzPXNlbGYuY2lwaGVycywgKiprd2FyZ3MpCiAgICAgICAgICAgIGVsc2U6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMi42CiAgICAgICAgICAgICAgICByZXR1cm4gd3JhcF9zb2NrZXQoc29ja2V0LCAqKmt3YXJncykKCgpkZWYgYXNzZXJ0X2ZpbmdlcnByaW50KGNlcnQsIGZpbmdlcnByaW50KToKICAgICIiIgogICAgQ2hlY2tzIGlmIGdpdmVuIGZpbmdlcnByaW50IG1hdGNoZXMgdGhlIHN1cHBsaWVkIGNlcnRpZmljYXRlLgoKICAgIDpwYXJhbSBjZXJ0OgogICAgICAgIENlcnRpZmljYXRlIGFzIGJ5dGVzIG9iamVjdC4KICAgIDpwYXJhbSBmaW5nZXJwcmludDoKICAgICAgICBGaW5nZXJwcmludCBhcyBzdHJpbmcgb2YgaGV4ZGlnaXRzLCBjYW4gYmUgaW50ZXJzcGVyc2VkIGJ5IGNvbG9ucy4KICAgICIiIgoKICAgIGZpbmdlcnByaW50ID0gZmluZ2VycHJpbnQucmVwbGFjZSgnOicsICcnKS5sb3dlcigpCiAgICBkaWdlc3RfbGVuZ3RoID0gbGVuKGZpbmdlcnByaW50KQogICAgaGFzaGZ1bmMgPSBIQVNIRlVOQ19NQVAuZ2V0KGRpZ2VzdF9sZW5ndGgpCiAgICBpZiBub3QgaGFzaGZ1bmM6CiAgICAgICAgcmFpc2UgU1NMRXJyb3IoCiAgICAgICAgICAgICdGaW5nZXJwcmludCBvZiBpbnZhbGlkIGxlbmd0aDogezB9Jy5mb3JtYXQoZmluZ2VycHJpbnQpKQoKICAgICMgV2UgbmVlZCBlbmNvZGUoKSBoZXJlIGZvciBweTMyOyB3b3JrcyBvbiBweTIgYW5kIHAzMy4KICAgIGZpbmdlcnByaW50X2J5dGVzID0gdW5oZXhsaWZ5KGZpbmdlcnByaW50LmVuY29kZSgpKQoKICAgIGNlcnRfZGlnZXN0ID0gaGFzaGZ1bmMoY2VydCkuZGlnZXN0KCkKCiAgICBpZiBub3QgX2NvbnN0X2NvbXBhcmVfZGlnZXN0KGNlcnRfZGlnZXN0LCBmaW5nZXJwcmludF9ieXRlcyk6CiAgICAgICAgcmFpc2UgU1NMRXJyb3IoJ0ZpbmdlcnByaW50cyBkaWQgbm90IG1hdGNoLiBFeHBlY3RlZCAiezB9IiwgZ290ICJ7MX0iLicKICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KGZpbmdlcnByaW50LCBoZXhsaWZ5KGNlcnRfZGlnZXN0KSkpCgoKZGVmIHJlc29sdmVfY2VydF9yZXFzKGNhbmRpZGF0ZSk6CiAgICAiIiIKICAgIFJlc29sdmVzIHRoZSBhcmd1bWVudCB0byBhIG51bWVyaWMgY29uc3RhbnQsIHdoaWNoIGNhbiBiZSBwYXNzZWQgdG8KICAgIHRoZSB3cmFwX3NvY2tldCBmdW5jdGlvbi9tZXRob2QgZnJvbSB0aGUgc3NsIG1vZHVsZS4KICAgIERlZmF1bHRzIHRvIDpkYXRhOmBzc2wuQ0VSVF9OT05FYC4KICAgIElmIGdpdmVuIGEgc3RyaW5nIGl0IGlzIGFzc3VtZWQgdG8gYmUgdGhlIG5hbWUgb2YgdGhlIGNvbnN0YW50IGluIHRoZQogICAgOm1vZDpgc3NsYCBtb2R1bGUgb3IgaXRzIGFiYnJldmF0aW9uLgogICAgKFNvIHlvdSBjYW4gc3BlY2lmeSBgUkVRVUlSRURgIGluc3RlYWQgb2YgYENFUlRfUkVRVUlSRURgLgogICAgSWYgaXQncyBuZWl0aGVyIGBOb25lYCBub3IgYSBzdHJpbmcgd2UgYXNzdW1lIGl0IGlzIGFscmVhZHkgdGhlIG51bWVyaWMKICAgIGNvbnN0YW50IHdoaWNoIGNhbiBkaXJlY3RseSBiZSBwYXNzZWQgdG8gd3JhcF9zb2NrZXQuCiAgICAiIiIKICAgIGlmIGNhbmRpZGF0ZSBpcyBOb25lOgogICAgICAgIHJldHVybiBDRVJUX05PTkUKCiAgICBpZiBpc2luc3RhbmNlKGNhbmRpZGF0ZSwgc3RyKToKICAgICAgICByZXMgPSBnZXRhdHRyKHNzbCwgY2FuZGlkYXRlLCBOb25lKQogICAgICAgIGlmIHJlcyBpcyBOb25lOgogICAgICAgICAgICByZXMgPSBnZXRhdHRyKHNzbCwgJ0NFUlRfJyArIGNhbmRpZGF0ZSkKICAgICAgICByZXR1cm4gcmVzCgogICAgcmV0dXJuIGNhbmRpZGF0ZQoKCmRlZiByZXNvbHZlX3NzbF92ZXJzaW9uKGNhbmRpZGF0ZSk6CiAgICAiIiIKICAgIGxpa2UgcmVzb2x2ZV9jZXJ0X3JlcXMKICAgICIiIgogICAgaWYgY2FuZGlkYXRlIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIFBST1RPQ09MX1NTTHYyMwoKICAgIGlmIGlzaW5zdGFuY2UoY2FuZGlkYXRlLCBzdHIpOgogICAgICAgIHJlcyA9IGdldGF0dHIoc3NsLCBjYW5kaWRhdGUsIE5vbmUpCiAgICAgICAgaWYgcmVzIGlzIE5vbmU6CiAgICAgICAgICAgIHJlcyA9IGdldGF0dHIoc3NsLCAnUFJPVE9DT0xfJyArIGNhbmRpZGF0ZSkKICAgICAgICByZXR1cm4gcmVzCgogICAgcmV0dXJuIGNhbmRpZGF0ZQoKCmRlZiBjcmVhdGVfdXJsbGliM19jb250ZXh0KHNzbF92ZXJzaW9uPU5vbmUsIGNlcnRfcmVxcz1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPU5vbmUsIGNpcGhlcnM9Tm9uZSk6CiAgICAiIiJBbGwgYXJndW1lbnRzIGhhdmUgdGhlIHNhbWUgbWVhbmluZyBhcyBgYHNzbF93cmFwX3NvY2tldGBgLgoKICAgIEJ5IGRlZmF1bHQsIHRoaXMgZnVuY3Rpb24gZG9lcyBhIGxvdCBvZiB0aGUgc2FtZSB3b3JrIHRoYXQKICAgIGBgc3NsLmNyZWF0ZV9kZWZhdWx0X2NvbnRleHRgYCBkb2VzIG9uIFB5dGhvbiAzLjQrLiBJdDoKCiAgICAtIERpc2FibGVzIFNTTHYyLCBTU0x2MywgYW5kIGNvbXByZXNzaW9uCiAgICAtIFNldHMgYSByZXN0cmljdGVkIHNldCBvZiBzZXJ2ZXIgY2lwaGVycwoKICAgIElmIHlvdSB3aXNoIHRvIGVuYWJsZSBTU0x2MywgeW91IGNhbiBkbzo6CgogICAgICAgIGZyb20gdXJsbGliMy51dGlsIGltcG9ydCBzc2xfCiAgICAgICAgY29udGV4dCA9IHNzbF8uY3JlYXRlX3VybGxpYjNfY29udGV4dCgpCiAgICAgICAgY29udGV4dC5vcHRpb25zICY9IH5zc2xfLk9QX05PX1NTTHYzCgogICAgWW91IGNhbiBkbyB0aGUgc2FtZSB0byBlbmFibGUgY29tcHJlc3Npb24gKHN1YnN0aXR1dGluZyBgYENPTVBSRVNTSU9OYGAKICAgIGZvciBgYFNTTHYzYGAgaW4gdGhlIGxhc3QgbGluZSBhYm92ZSkuCgogICAgOnBhcmFtIHNzbF92ZXJzaW9uOgogICAgICAgIFRoZSBkZXNpcmVkIHByb3RvY29sIHZlcnNpb24gdG8gdXNlLiBUaGlzIHdpbGwgZGVmYXVsdCB0bwogICAgICAgIFBST1RPQ09MX1NTTHYyMyB3aGljaCB3aWxsIG5lZ290aWF0ZSB0aGUgaGlnaGVzdCBwcm90b2NvbCB0aGF0IGJvdGgKICAgICAgICB0aGUgc2VydmVyIGFuZCB5b3VyIGluc3RhbGxhdGlvbiBvZiBPcGVuU1NMIHN1cHBvcnQuCiAgICA6cGFyYW0gY2VydF9yZXFzOgogICAgICAgIFdoZXRoZXIgdG8gcmVxdWlyZSB0aGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uLiBUaGlzIGRlZmF1bHRzIHRvCiAgICAgICAgYGBzc2wuQ0VSVF9SRVFVSVJFRGBgLgogICAgOnBhcmFtIG9wdGlvbnM6CiAgICAgICAgU3BlY2lmaWMgT3BlblNTTCBvcHRpb25zLiBUaGVzZSBkZWZhdWx0IHRvIGBgc3NsLk9QX05PX1NTTHYyYGAsCiAgICAgICAgYGBzc2wuT1BfTk9fU1NMdjNgYCwgYGBzc2wuT1BfTk9fQ09NUFJFU1NJT05gYC4KICAgIDpwYXJhbSBjaXBoZXJzOgogICAgICAgIFdoaWNoIGNpcGhlciBzdWl0ZXMgdG8gYWxsb3cgdGhlIHNlcnZlciB0byBzZWxlY3QuCiAgICA6cmV0dXJuczoKICAgICAgICBDb25zdHJ1Y3RlZCBTU0xDb250ZXh0IG9iamVjdCB3aXRoIHNwZWNpZmllZCBvcHRpb25zCiAgICA6cnR5cGU6IFNTTENvbnRleHQKICAgICIiIgogICAgY29udGV4dCA9IFNTTENvbnRleHQoc3NsX3ZlcnNpb24gb3Igc3NsLlBST1RPQ09MX1NTTHYyMykKCiAgICAjIFNldHRpbmcgdGhlIGRlZmF1bHQgaGVyZSwgYXMgd2UgbWF5IGhhdmUgbm8gc3NsIG1vZHVsZSBvbiBpbXBvcnQKICAgIGNlcnRfcmVxcyA9IHNzbC5DRVJUX1JFUVVJUkVEIGlmIGNlcnRfcmVxcyBpcyBOb25lIGVsc2UgY2VydF9yZXFzCgogICAgaWYgb3B0aW9ucyBpcyBOb25lOgogICAgICAgIG9wdGlvbnMgPSAwCiAgICAgICAgIyBTU0x2MiBpcyBlYXNpbHkgYnJva2VuIGFuZCBpcyBjb25zaWRlcmVkIGhhcm1mdWwgYW5kIGRhbmdlcm91cwogICAgICAgIG9wdGlvbnMgfD0gT1BfTk9fU1NMdjIKICAgICAgICAjIFNTTHYzIGhhcyBzZXZlcmFsIHByb2JsZW1zIGFuZCBpcyBub3cgZGFuZ2Vyb3VzCiAgICAgICAgb3B0aW9ucyB8PSBPUF9OT19TU0x2MwogICAgICAgICMgRGlzYWJsZSBjb21wcmVzc2lvbiB0byBwcmV2ZW50IENSSU1FIGF0dGFja3MgZm9yIE9wZW5TU0wgMS4wKwogICAgICAgICMgKGlzc3VlICMzMDkpCiAgICAgICAgb3B0aW9ucyB8PSBPUF9OT19DT01QUkVTU0lPTgoKICAgIGNvbnRleHQub3B0aW9ucyB8PSBvcHRpb25zCgogICAgaWYgZ2V0YXR0cihjb250ZXh0LCAnc3VwcG9ydHNfc2V0X2NpcGhlcnMnLCBUcnVlKTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAyLjYKICAgICAgICBjb250ZXh0LnNldF9jaXBoZXJzKGNpcGhlcnMgb3IgREVGQVVMVF9DSVBIRVJTKQoKICAgIGNvbnRleHQudmVyaWZ5X21vZGUgPSBjZXJ0X3JlcXMKICAgIGlmIGdldGF0dHIoY29udGV4dCwgJ2NoZWNrX2hvc3RuYW1lJywgTm9uZSkgaXMgbm90IE5vbmU6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMy4yCiAgICAgICAgIyBXZSBkbyBvdXIgb3duIHZlcmlmaWNhdGlvbiwgaW5jbHVkaW5nIGZpbmdlcnByaW50cyBhbmQgYWx0ZXJuYXRpdmUKICAgICAgICAjIGhvc3RuYW1lcy4gU28gZGlzYWJsZSBpdCBoZXJlCiAgICAgICAgY29udGV4dC5jaGVja19ob3N0bmFtZSA9IEZhbHNlCiAgICByZXR1cm4gY29udGV4dAoKCmRlZiBzc2xfd3JhcF9zb2NrZXQoc29jaywga2V5ZmlsZT1Ob25lLCBjZXJ0ZmlsZT1Ob25lLCBjZXJ0X3JlcXM9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1Ob25lLCBzZXJ2ZXJfaG9zdG5hbWU9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbj1Ob25lLCBjaXBoZXJzPU5vbmUsIHNzbF9jb250ZXh0PU5vbmUsCiAgICAgICAgICAgICAgICAgICAgY2FfY2VydF9kaXI9Tm9uZSk6CiAgICAiIiIKICAgIEFsbCBhcmd1bWVudHMgZXhjZXB0IGZvciBzZXJ2ZXJfaG9zdG5hbWUsIHNzbF9jb250ZXh0LCBhbmQgY2FfY2VydF9kaXIgaGF2ZQogICAgdGhlIHNhbWUgbWVhbmluZyBhcyB0aGV5IGRvIHdoZW4gdXNpbmcgOmZ1bmM6YHNzbC53cmFwX3NvY2tldGAuCgogICAgOnBhcmFtIHNlcnZlcl9ob3N0bmFtZToKICAgICAgICBXaGVuIFNOSSBpcyBzdXBwb3J0ZWQsIHRoZSBleHBlY3RlZCBob3N0bmFtZSBvZiB0aGUgY2VydGlmaWNhdGUKICAgIDpwYXJhbSBzc2xfY29udGV4dDoKICAgICAgICBBIHByZS1tYWRlIDpjbGFzczpgU1NMQ29udGV4dGAgb2JqZWN0LiBJZiBub25lIGlzIHByb3ZpZGVkLCBvbmUgd2lsbAogICAgICAgIGJlIGNyZWF0ZWQgdXNpbmcgOmZ1bmM6YGNyZWF0ZV91cmxsaWIzX2NvbnRleHRgLgogICAgOnBhcmFtIGNpcGhlcnM6CiAgICAgICAgQSBzdHJpbmcgb2YgY2lwaGVycyB3ZSB3aXNoIHRoZSBjbGllbnQgdG8gc3VwcG9ydC4gVGhpcyBpcyBub3QKICAgICAgICBzdXBwb3J0ZWQgb24gUHl0aG9uIDIuNiBhcyB0aGUgc3NsIG1vZHVsZSBkb2VzIG5vdCBzdXBwb3J0IGl0LgogICAgOnBhcmFtIGNhX2NlcnRfZGlyOgogICAgICAgIEEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgQ0EgY2VydGlmaWNhdGVzIGluIG11bHRpcGxlIHNlcGFyYXRlIGZpbGVzLCBhcwogICAgICAgIHN1cHBvcnRlZCBieSBPcGVuU1NMJ3MgLUNBcGF0aCBmbGFnIG9yIHRoZSBjYXBhdGggYXJndW1lbnQgdG8KICAgICAgICBTU0xDb250ZXh0LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucygpLgogICAgIiIiCiAgICBjb250ZXh0ID0gc3NsX2NvbnRleHQKICAgIGlmIGNvbnRleHQgaXMgTm9uZToKICAgICAgICAjIE5vdGU6IFRoaXMgYnJhbmNoIG9mIGNvZGUgYW5kIGFsbCB0aGUgdmFyaWFibGVzIGluIGl0IGFyZSBubyBsb25nZXIKICAgICAgICAjIHVzZWQgYnkgdXJsbGliMyBpdHNlbGYuIFdlIHNob3VsZCBjb25zaWRlciBkZXByZWNhdGluZyBhbmQgcmVtb3ZpbmcKICAgICAgICAjIHRoaXMgY29kZS4KICAgICAgICBjb250ZXh0ID0gY3JlYXRlX3VybGxpYjNfY29udGV4dChzc2xfdmVyc2lvbiwgY2VydF9yZXFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcGhlcnM9Y2lwaGVycykKCiAgICBpZiBjYV9jZXJ0cyBvciBjYV9jZXJ0X2RpcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbnRleHQubG9hZF92ZXJpZnlfbG9jYXRpb25zKGNhX2NlcnRzLCBjYV9jZXJ0X2RpcikKICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDIuNiwgMi43LCAzLjIKICAgICAgICAgICAgcmFpc2UgU1NMRXJyb3IoZSkKICAgICAgICAjIFB5MzMgcmFpc2VzIEZpbGVOb3RGb3VuZEVycm9yIHdoaWNoIHN1YmNsYXNzZXMgT1NFcnJvcgogICAgICAgICMgVGhlc2UgYXJlIG5vdCBlcXVpdmFsZW50IHVubGVzcyB3ZSBjaGVjayB0aGUgZXJybm8gYXR0cmlidXRlCiAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAzLjMgYW5kIGJleW9uZAogICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVOT0VOVDoKICAgICAgICAgICAgICAgIHJhaXNlIFNTTEVycm9yKGUpCiAgICAgICAgICAgIHJhaXNlCiAgICBlbGlmIGdldGF0dHIoY29udGV4dCwgJ2xvYWRfZGVmYXVsdF9jZXJ0cycsIE5vbmUpIGlzIG5vdCBOb25lOgogICAgICAgICMgdHJ5IHRvIGxvYWQgT1MgZGVmYXVsdCBjZXJ0czsgd29ya3Mgd2VsbCBvbiBXaW5kb3dzIChyZXF1aXJlIFB5dGhvbjMuNCspCiAgICAgICAgY29udGV4dC5sb2FkX2RlZmF1bHRfY2VydHMoKQoKICAgIGlmIGNlcnRmaWxlOgogICAgICAgIGNvbnRleHQubG9hZF9jZXJ0X2NoYWluKGNlcnRmaWxlLCBrZXlmaWxlKQogICAgaWYgSEFTX1NOSTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IE9wZW5TU0wgd2l0aCBlbmFibGVkIFNOSQogICAgICAgIHJldHVybiBjb250ZXh0LndyYXBfc29ja2V0KHNvY2ssIHNlcnZlcl9ob3N0bmFtZT1zZXJ2ZXJfaG9zdG5hbWUpCgogICAgd2FybmluZ3Mud2FybigKICAgICAgICAnQW4gSFRUUFMgcmVxdWVzdCBoYXMgYmVlbiBtYWRlLCBidXQgdGhlIFNOSSAoU3ViamVjdCBOYW1lICcKICAgICAgICAnSW5kaWNhdGlvbikgZXh0ZW5zaW9uIHRvIFRMUyBpcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0uICcKICAgICAgICAnVGhpcyBtYXkgY2F1c2UgdGhlIHNlcnZlciB0byBwcmVzZW50IGFuIGluY29ycmVjdCBUTFMgJwogICAgICAgICdjZXJ0aWZpY2F0ZSwgd2hpY2ggY2FuIGNhdXNlIHZhbGlkYXRpb24gZmFpbHVyZXMuIFlvdSBjYW4gdXBncmFkZSB0byAnCiAgICAgICAgJ2EgbmV3ZXIgdmVyc2lvbiBvZiBQeXRob24gdG8gc29sdmUgdGhpcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAnCiAgICAgICAgJ2h0dHBzOi8vdXJsbGliMy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvYWR2YW5jZWQtdXNhZ2UuaHRtbCcKICAgICAgICAnI3NzbC13YXJuaW5ncycsCiAgICAgICAgU05JTWlzc2luZ1dhcm5pbmcKICAgICkKICAgIHJldHVybiBjb250ZXh0LndyYXBfc29ja2V0KHNvY2spClBLAwQUAAAAAAAAACEAVVLOIB0mAAAdJgAAMwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvdGltZW91dC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CiMgVGhlIGRlZmF1bHQgc29ja2V0IHRpbWVvdXQsIHVzZWQgYnkgaHR0cGxpYiB0byBpbmRpY2F0ZSB0aGF0IG5vIHRpbWVvdXQgd2FzCiMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyCmZyb20gc29ja2V0IGltcG9ydCBfR0xPQkFMX0RFRkFVTFRfVElNRU9VVAppbXBvcnQgdGltZQoKZnJvbSAuLmV4Y2VwdGlvbnMgaW1wb3J0IFRpbWVvdXRTdGF0ZUVycm9yCgojIEEgc2VudGluZWwgdmFsdWUgdG8gaW5kaWNhdGUgdGhhdCBubyB0aW1lb3V0IHdhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgaW4KIyB1cmxsaWIzCl9EZWZhdWx0ID0gb2JqZWN0KCkKCgojIFVzZSB0aW1lLm1vbm90b25pYyBpZiBhdmFpbGFibGUuCmN1cnJlbnRfdGltZSA9IGdldGF0dHIodGltZSwgIm1vbm90b25pYyIsIHRpbWUudGltZSkKCgpjbGFzcyBUaW1lb3V0KG9iamVjdCk6CiAgICAiIiIgVGltZW91dCBjb25maWd1cmF0aW9uLgoKICAgIFRpbWVvdXRzIGNhbiBiZSBkZWZpbmVkIGFzIGEgZGVmYXVsdCBmb3IgYSBwb29sOjoKCiAgICAgICAgdGltZW91dCA9IFRpbWVvdXQoY29ubmVjdD0yLjAsIHJlYWQ9Ny4wKQogICAgICAgIGh0dHAgPSBQb29sTWFuYWdlcih0aW1lb3V0PXRpbWVvdXQpCiAgICAgICAgcmVzcG9uc2UgPSBodHRwLnJlcXVlc3QoJ0dFVCcsICdodHRwOi8vZXhhbXBsZS5jb20vJykKCiAgICBPciBwZXItcmVxdWVzdCAod2hpY2ggb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGZvciB0aGUgcG9vbCk6OgoKICAgICAgICByZXNwb25zZSA9IGh0dHAucmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9leGFtcGxlLmNvbS8nLCB0aW1lb3V0PVRpbWVvdXQoMTApKQoKICAgIFRpbWVvdXRzIGNhbiBiZSBkaXNhYmxlZCBieSBzZXR0aW5nIGFsbCB0aGUgcGFyYW1ldGVycyB0byBgYE5vbmVgYDo6CgogICAgICAgIG5vX3RpbWVvdXQgPSBUaW1lb3V0KGNvbm5lY3Q9Tm9uZSwgcmVhZD1Ob25lKQogICAgICAgIHJlc3BvbnNlID0gaHR0cC5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2V4YW1wbGUuY29tLywgdGltZW91dD1ub190aW1lb3V0KQoKCiAgICA6cGFyYW0gdG90YWw6CiAgICAgICAgVGhpcyBjb21iaW5lcyB0aGUgY29ubmVjdCBhbmQgcmVhZCB0aW1lb3V0cyBpbnRvIG9uZTsgdGhlIHJlYWQgdGltZW91dAogICAgICAgIHdpbGwgYmUgc2V0IHRvIHRoZSB0aW1lIGxlZnRvdmVyIGZyb20gdGhlIGNvbm5lY3QgYXR0ZW1wdC4gSW4gdGhlCiAgICAgICAgZXZlbnQgdGhhdCBib3RoIGEgY29ubmVjdCB0aW1lb3V0IGFuZCBhIHRvdGFsIGFyZSBzcGVjaWZpZWQsIG9yIGEgcmVhZAogICAgICAgIHRpbWVvdXQgYW5kIGEgdG90YWwgYXJlIHNwZWNpZmllZCwgdGhlIHNob3J0ZXIgdGltZW91dCB3aWxsIGJlIGFwcGxpZWQuCgogICAgICAgIERlZmF1bHRzIHRvIE5vbmUuCgogICAgOnR5cGUgdG90YWw6IGludGVnZXIsIGZsb2F0LCBvciBOb25lCgogICAgOnBhcmFtIGNvbm5lY3Q6CiAgICAgICAgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBmb3IgYSBjb25uZWN0aW9uIGF0dGVtcHQgdG8gYSBzZXJ2ZXIKICAgICAgICB0byBzdWNjZWVkLiBPbWl0dGluZyB0aGUgcGFyYW1ldGVyIHdpbGwgZGVmYXVsdCB0aGUgY29ubmVjdCB0aW1lb3V0IHRvCiAgICAgICAgdGhlIHN5c3RlbSBkZWZhdWx0LCBwcm9iYWJseSBgdGhlIGdsb2JhbCBkZWZhdWx0IHRpbWVvdXQgaW4gc29ja2V0LnB5CiAgICAgICAgPGh0dHA6Ly9oZy5weXRob24ub3JnL2NweXRob24vZmlsZS82MDNiNGQ1OTM3NTgvTGliL3NvY2tldC5weSNsNTM1PmBfLgogICAgICAgIE5vbmUgd2lsbCBzZXQgYW4gaW5maW5pdGUgdGltZW91dCBmb3IgY29ubmVjdGlvbiBhdHRlbXB0cy4KCiAgICA6dHlwZSBjb25uZWN0OiBpbnRlZ2VyLCBmbG9hdCwgb3IgTm9uZQoKICAgIDpwYXJhbSByZWFkOgogICAgICAgIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgYmV0d2VlbiBjb25zZWN1dGl2ZQogICAgICAgIHJlYWQgb3BlcmF0aW9ucyBmb3IgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuIE9taXR0aW5nCiAgICAgICAgdGhlIHBhcmFtZXRlciB3aWxsIGRlZmF1bHQgdGhlIHJlYWQgdGltZW91dCB0byB0aGUgc3lzdGVtCiAgICAgICAgZGVmYXVsdCwgcHJvYmFibHkgYHRoZSBnbG9iYWwgZGVmYXVsdCB0aW1lb3V0IGluIHNvY2tldC5weQogICAgICAgIDxodHRwOi8vaGcucHl0aG9uLm9yZy9jcHl0aG9uL2ZpbGUvNjAzYjRkNTkzNzU4L0xpYi9zb2NrZXQucHkjbDUzNT5gXy4KICAgICAgICBOb25lIHdpbGwgc2V0IGFuIGluZmluaXRlIHRpbWVvdXQuCgogICAgOnR5cGUgcmVhZDogaW50ZWdlciwgZmxvYXQsIG9yIE5vbmUKCiAgICAuLiBub3RlOjoKCiAgICAgICAgTWFueSBmYWN0b3JzIGNhbiBhZmZlY3QgdGhlIHRvdGFsIGFtb3VudCBvZiB0aW1lIGZvciB1cmxsaWIzIHRvIHJldHVybgogICAgICAgIGFuIEhUVFAgcmVzcG9uc2UuCgogICAgICAgIEZvciBleGFtcGxlLCBQeXRob24ncyBETlMgcmVzb2x2ZXIgZG9lcyBub3Qgb2JleSB0aGUgdGltZW91dCBzcGVjaWZpZWQKICAgICAgICBvbiB0aGUgc29ja2V0LiBPdGhlciBmYWN0b3JzIHRoYXQgY2FuIGFmZmVjdCB0b3RhbCByZXF1ZXN0IHRpbWUgaW5jbHVkZQogICAgICAgIGhpZ2ggQ1BVIGxvYWQsIGhpZ2ggc3dhcCwgdGhlIHByb2dyYW0gcnVubmluZyBhdCBhIGxvdyBwcmlvcml0eSBsZXZlbCwKICAgICAgICBvciBvdGhlciBiZWhhdmlvcnMuCgogICAgICAgIEluIGFkZGl0aW9uLCB0aGUgcmVhZCBhbmQgdG90YWwgdGltZW91dHMgb25seSBtZWFzdXJlIHRoZSB0aW1lIGJldHdlZW4KICAgICAgICByZWFkIG9wZXJhdGlvbnMgb24gdGhlIHNvY2tldCBjb25uZWN0aW5nIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIsCiAgICAgICAgbm90IHRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSBmb3IgdGhlIHJlcXVlc3QgdG8gcmV0dXJuIGEgY29tcGxldGUKICAgICAgICByZXNwb25zZS4gRm9yIG1vc3QgcmVxdWVzdHMsIHRoZSB0aW1lb3V0IGlzIHJhaXNlZCBiZWNhdXNlIHRoZSBzZXJ2ZXIKICAgICAgICBoYXMgbm90IHNlbnQgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIHNwZWNpZmllZCB0aW1lLiBUaGlzIGlzIG5vdCBhbHdheXMKICAgICAgICB0aGUgY2FzZTsgaWYgYSBzZXJ2ZXIgc3RyZWFtcyBvbmUgYnl0ZSBldmVyeSBmaWZ0ZWVuIHNlY29uZHMsIGEgdGltZW91dAogICAgICAgIG9mIDIwIHNlY29uZHMgd2lsbCBub3QgdHJpZ2dlciwgZXZlbiB0aG91Z2ggdGhlIHJlcXVlc3Qgd2lsbCB0YWtlCiAgICAgICAgc2V2ZXJhbCBtaW51dGVzIHRvIGNvbXBsZXRlLgoKICAgICAgICBJZiB5b3VyIGdvYWwgaXMgdG8gY3V0IG9mZiBhbnkgcmVxdWVzdCBhZnRlciBhIHNldCBhbW91bnQgb2Ygd2FsbCBjbG9jawogICAgICAgIHRpbWUsIGNvbnNpZGVyIGhhdmluZyBhIHNlY29uZCAid2F0Y2hlciIgdGhyZWFkIHRvIGN1dCBvZmYgYSBzbG93CiAgICAgICAgcmVxdWVzdC4KICAgICIiIgoKICAgICM6IEEgc2VudGluZWwgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCB0aW1lb3V0IHZhbHVlCiAgICBERUZBVUxUX1RJTUVPVVQgPSBfR0xPQkFMX0RFRkFVTFRfVElNRU9VVAoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0b3RhbD1Ob25lLCBjb25uZWN0PV9EZWZhdWx0LCByZWFkPV9EZWZhdWx0KToKICAgICAgICBzZWxmLl9jb25uZWN0ID0gc2VsZi5fdmFsaWRhdGVfdGltZW91dChjb25uZWN0LCAnY29ubmVjdCcpCiAgICAgICAgc2VsZi5fcmVhZCA9IHNlbGYuX3ZhbGlkYXRlX3RpbWVvdXQocmVhZCwgJ3JlYWQnKQogICAgICAgIHNlbGYudG90YWwgPSBzZWxmLl92YWxpZGF0ZV90aW1lb3V0KHRvdGFsLCAndG90YWwnKQogICAgICAgIHNlbGYuX3N0YXJ0X2Nvbm5lY3QgPSBOb25lCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICclcyhjb25uZWN0PSVyLCByZWFkPSVyLCB0b3RhbD0lciknICUgKAogICAgICAgICAgICB0eXBlKHNlbGYpLl9fbmFtZV9fLCBzZWxmLl9jb25uZWN0LCBzZWxmLl9yZWFkLCBzZWxmLnRvdGFsKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF92YWxpZGF0ZV90aW1lb3V0KGNscywgdmFsdWUsIG5hbWUpOgogICAgICAgICIiIiBDaGVjayB0aGF0IGEgdGltZW91dCBhdHRyaWJ1dGUgaXMgdmFsaWQuCgogICAgICAgIDpwYXJhbSB2YWx1ZTogVGhlIHRpbWVvdXQgdmFsdWUgdG8gdmFsaWRhdGUKICAgICAgICA6cGFyYW0gbmFtZTogVGhlIG5hbWUgb2YgdGhlIHRpbWVvdXQgYXR0cmlidXRlIHRvIHZhbGlkYXRlLiBUaGlzIGlzCiAgICAgICAgICAgIHVzZWQgdG8gc3BlY2lmeSBpbiBlcnJvciBtZXNzYWdlcy4KICAgICAgICA6cmV0dXJuOiBUaGUgdmFsaWRhdGVkIGFuZCBjYXN0ZWQgdmVyc2lvbiBvZiB0aGUgZ2l2ZW4gdmFsdWUuCiAgICAgICAgOnJhaXNlcyBWYWx1ZUVycm9yOiBJZiBpdCBpcyBhIG51bWVyaWMgdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvCiAgICAgICAgICAgIHplcm8sIG9yIHRoZSB0eXBlIGlzIG5vdCBhbiBpbnRlZ2VyLCBmbG9hdCwgb3IgTm9uZS4KICAgICAgICAiIiIKICAgICAgICBpZiB2YWx1ZSBpcyBfRGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIGNscy5ERUZBVUxUX1RJTUVPVVQKCiAgICAgICAgaWYgdmFsdWUgaXMgTm9uZSBvciB2YWx1ZSBpcyBjbHMuREVGQVVMVF9USU1FT1VUOgogICAgICAgICAgICByZXR1cm4gdmFsdWUKCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYm9vbCk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRpbWVvdXQgY2Fubm90IGJlIGEgYm9vbGVhbiB2YWx1ZS4gSXQgbXVzdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlIGFuIGludCwgZmxvYXQgb3IgTm9uZS4iKQogICAgICAgIHRyeToKICAgICAgICAgICAgZmxvYXQodmFsdWUpCiAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJUaW1lb3V0IHZhbHVlICVzIHdhcyAlcywgYnV0IGl0IG11c3QgYmUgYW4gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQsIGZsb2F0IG9yIE5vbmUuIiAlIChuYW1lLCB2YWx1ZSkpCgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgdmFsdWUgPD0gMDoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkF0dGVtcHRlZCB0byBzZXQgJXMgdGltZW91dCB0byAlcywgYnV0IHRoZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lb3V0IGNhbm5vdCBiZSBzZXQgdG8gYSB2YWx1ZSBsZXNzICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoYW4gb3IgZXF1YWwgdG8gMC4iICUgKG5hbWUsIHZhbHVlKSkKICAgICAgICBleGNlcHQgVHlwZUVycm9yOiAgIyBQeXRob24gMwogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJUaW1lb3V0IHZhbHVlICVzIHdhcyAlcywgYnV0IGl0IG11c3QgYmUgYW4gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQsIGZsb2F0IG9yIE5vbmUuIiAlIChuYW1lLCB2YWx1ZSkpCgogICAgICAgIHJldHVybiB2YWx1ZQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fZmxvYXQoY2xzLCB0aW1lb3V0KToKICAgICAgICAiIiIgQ3JlYXRlIGEgbmV3IFRpbWVvdXQgZnJvbSBhIGxlZ2FjeSB0aW1lb3V0IHZhbHVlLgoKICAgICAgICBUaGUgdGltZW91dCB2YWx1ZSB1c2VkIGJ5IGh0dHBsaWIucHkgc2V0cyB0aGUgc2FtZSB0aW1lb3V0IG9uIHRoZQogICAgICAgIGNvbm5lY3QoKSwgYW5kIHJlY3YoKSBzb2NrZXQgcmVxdWVzdHMuIFRoaXMgY3JlYXRlcyBhIDpjbGFzczpgVGltZW91dGAKICAgICAgICBvYmplY3QgdGhhdCBzZXRzIHRoZSBpbmRpdmlkdWFsIHRpbWVvdXRzIHRvIHRoZSBgYHRpbWVvdXRgYCB2YWx1ZQogICAgICAgIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uLgoKICAgICAgICA6cGFyYW0gdGltZW91dDogVGhlIGxlZ2FjeSB0aW1lb3V0IHZhbHVlLgogICAgICAgIDp0eXBlIHRpbWVvdXQ6IGludGVnZXIsIGZsb2F0LCBzZW50aW5lbCBkZWZhdWx0IG9iamVjdCwgb3IgTm9uZQogICAgICAgIDpyZXR1cm46IFRpbWVvdXQgb2JqZWN0CiAgICAgICAgOnJ0eXBlOiA6Y2xhc3M6YFRpbWVvdXRgCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFRpbWVvdXQocmVhZD10aW1lb3V0LCBjb25uZWN0PXRpbWVvdXQpCgogICAgZGVmIGNsb25lKHNlbGYpOgogICAgICAgICIiIiBDcmVhdGUgYSBjb3B5IG9mIHRoZSB0aW1lb3V0IG9iamVjdAoKICAgICAgICBUaW1lb3V0IHByb3BlcnRpZXMgYXJlIHN0b3JlZCBwZXItcG9vbCBidXQgZWFjaCByZXF1ZXN0IG5lZWRzIGEgZnJlc2gKICAgICAgICBUaW1lb3V0IG9iamVjdCB0byBlbnN1cmUgZWFjaCBvbmUgaGFzIGl0cyBvd24gc3RhcnQvc3RvcCBjb25maWd1cmVkLgoKICAgICAgICA6cmV0dXJuOiBhIGNvcHkgb2YgdGhlIHRpbWVvdXQgb2JqZWN0CiAgICAgICAgOnJ0eXBlOiA6Y2xhc3M6YFRpbWVvdXRgCiAgICAgICAgIiIiCiAgICAgICAgIyBXZSBjYW4ndCB1c2UgY29weS5kZWVwY29weSBiZWNhdXNlIHRoYXQgd2lsbCBhbHNvIGNyZWF0ZSBhIG5ldyBvYmplY3QKICAgICAgICAjIGZvciBfR0xPQkFMX0RFRkFVTFRfVElNRU9VVCwgd2hpY2ggc29ja2V0LnB5IHVzZXMgYXMgYSBzZW50aW5lbCB0bwogICAgICAgICMgZGV0ZWN0IHRoZSB1c2VyIGRlZmF1bHQuCiAgICAgICAgcmV0dXJuIFRpbWVvdXQoY29ubmVjdD1zZWxmLl9jb25uZWN0LCByZWFkPXNlbGYuX3JlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgdG90YWw9c2VsZi50b3RhbCkKCiAgICBkZWYgc3RhcnRfY29ubmVjdChzZWxmKToKICAgICAgICAiIiIgU3RhcnQgdGhlIHRpbWVvdXQgY2xvY2ssIHVzZWQgZHVyaW5nIGEgY29ubmVjdCgpIGF0dGVtcHQKCiAgICAgICAgOnJhaXNlcyB1cmxsaWIzLmV4Y2VwdGlvbnMuVGltZW91dFN0YXRlRXJyb3I6IGlmIHlvdSBhdHRlbXB0CiAgICAgICAgICAgIHRvIHN0YXJ0IGEgdGltZXIgdGhhdCBoYXMgYmVlbiBzdGFydGVkIGFscmVhZHkuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5fc3RhcnRfY29ubmVjdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmFpc2UgVGltZW91dFN0YXRlRXJyb3IoIlRpbWVvdXQgdGltZXIgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkLiIpCiAgICAgICAgc2VsZi5fc3RhcnRfY29ubmVjdCA9IGN1cnJlbnRfdGltZSgpCiAgICAgICAgcmV0dXJuIHNlbGYuX3N0YXJ0X2Nvbm5lY3QKCiAgICBkZWYgZ2V0X2Nvbm5lY3RfZHVyYXRpb24oc2VsZik6CiAgICAgICAgIiIiIEdldHMgdGhlIHRpbWUgZWxhcHNlZCBzaW5jZSB0aGUgY2FsbCB0byA6bWV0aDpgc3RhcnRfY29ubmVjdGAuCgogICAgICAgIDpyZXR1cm46IEVsYXBzZWQgdGltZS4KICAgICAgICA6cnR5cGU6IGZsb2F0CiAgICAgICAgOnJhaXNlcyB1cmxsaWIzLmV4Y2VwdGlvbnMuVGltZW91dFN0YXRlRXJyb3I6IGlmIHlvdSBhdHRlbXB0CiAgICAgICAgICAgIHRvIGdldCBkdXJhdGlvbiBmb3IgYSB0aW1lciB0aGF0IGhhc24ndCBiZWVuIHN0YXJ0ZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5fc3RhcnRfY29ubmVjdCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBUaW1lb3V0U3RhdGVFcnJvcigiQ2FuJ3QgZ2V0IGNvbm5lY3QgZHVyYXRpb24gZm9yIHRpbWVyICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoYXQgaGFzIG5vdCBzdGFydGVkLiIpCiAgICAgICAgcmV0dXJuIGN1cnJlbnRfdGltZSgpIC0gc2VsZi5fc3RhcnRfY29ubmVjdAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbm5lY3RfdGltZW91dChzZWxmKToKICAgICAgICAiIiIgR2V0IHRoZSB2YWx1ZSB0byB1c2Ugd2hlbiBzZXR0aW5nIGEgY29ubmVjdGlvbiB0aW1lb3V0LgoKICAgICAgICBUaGlzIHdpbGwgYmUgYSBwb3NpdGl2ZSBmbG9hdCBvciBpbnRlZ2VyLCB0aGUgdmFsdWUgTm9uZQogICAgICAgIChuZXZlciB0aW1lb3V0KSwgb3IgdGhlIGRlZmF1bHQgc3lzdGVtIHRpbWVvdXQuCgogICAgICAgIDpyZXR1cm46IENvbm5lY3QgdGltZW91dC4KICAgICAgICA6cnR5cGU6IGludCwgZmxvYXQsIDphdHRyOmBUaW1lb3V0LkRFRkFVTFRfVElNRU9VVGAgb3IgTm9uZQogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudG90YWwgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Nvbm5lY3QKCiAgICAgICAgaWYgc2VsZi5fY29ubmVjdCBpcyBOb25lIG9yIHNlbGYuX2Nvbm5lY3QgaXMgc2VsZi5ERUZBVUxUX1RJTUVPVVQ6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnRvdGFsCgogICAgICAgIHJldHVybiBtaW4oc2VsZi5fY29ubmVjdCwgc2VsZi50b3RhbCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiByZWFkX3RpbWVvdXQoc2VsZik6CiAgICAgICAgIiIiIEdldCB0aGUgdmFsdWUgZm9yIHRoZSByZWFkIHRpbWVvdXQuCgogICAgICAgIFRoaXMgYXNzdW1lcyBzb21lIHRpbWUgaGFzIGVsYXBzZWQgaW4gdGhlIGNvbm5lY3Rpb24gdGltZW91dCBhbmQKICAgICAgICBjb21wdXRlcyB0aGUgcmVhZCB0aW1lb3V0IGFwcHJvcHJpYXRlbHkuCgogICAgICAgIElmIHNlbGYudG90YWwgaXMgc2V0LCB0aGUgcmVhZCB0aW1lb3V0IGlzIGRlcGVuZGVudCBvbiB0aGUgYW1vdW50IG9mCiAgICAgICAgdGltZSB0YWtlbiBieSB0aGUgY29ubmVjdCB0aW1lb3V0LiBJZiB0aGUgY29ubmVjdGlvbiB0aW1lIGhhcyBub3QgYmVlbgogICAgICAgIGVzdGFibGlzaGVkLCBhIDpleGM6YH51cmxsaWIzLmV4Y2VwdGlvbnMuVGltZW91dFN0YXRlRXJyb3JgIHdpbGwgYmUKICAgICAgICByYWlzZWQuCgogICAgICAgIDpyZXR1cm46IFZhbHVlIHRvIHVzZSBmb3IgdGhlIHJlYWQgdGltZW91dC4KICAgICAgICA6cnR5cGU6IGludCwgZmxvYXQsIDphdHRyOmBUaW1lb3V0LkRFRkFVTFRfVElNRU9VVGAgb3IgTm9uZQogICAgICAgIDpyYWlzZXMgdXJsbGliMy5leGNlcHRpb25zLlRpbWVvdXRTdGF0ZUVycm9yOiBJZiA6bWV0aDpgc3RhcnRfY29ubmVjdGAKICAgICAgICAgICAgaGFzIG5vdCB5ZXQgYmVlbiBjYWxsZWQgb24gdGhpcyBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgaWYgKHNlbGYudG90YWwgaXMgbm90IE5vbmUgYW5kCiAgICAgICAgICAgICAgICBzZWxmLnRvdGFsIGlzIG5vdCBzZWxmLkRFRkFVTFRfVElNRU9VVCBhbmQKICAgICAgICAgICAgICAgIHNlbGYuX3JlYWQgaXMgbm90IE5vbmUgYW5kCiAgICAgICAgICAgICAgICBzZWxmLl9yZWFkIGlzIG5vdCBzZWxmLkRFRkFVTFRfVElNRU9VVCk6CiAgICAgICAgICAgICMgSW4gY2FzZSB0aGUgY29ubmVjdCB0aW1lb3V0IGhhcyBub3QgeWV0IGJlZW4gZXN0YWJsaXNoZWQuCiAgICAgICAgICAgIGlmIHNlbGYuX3N0YXJ0X2Nvbm5lY3QgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZWFkCiAgICAgICAgICAgIHJldHVybiBtYXgoMCwgbWluKHNlbGYudG90YWwgLSBzZWxmLmdldF9jb25uZWN0X2R1cmF0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlYWQpKQogICAgICAgIGVsaWYgc2VsZi50b3RhbCBpcyBub3QgTm9uZSBhbmQgc2VsZi50b3RhbCBpcyBub3Qgc2VsZi5ERUZBVUxUX1RJTUVPVVQ6CiAgICAgICAgICAgIHJldHVybiBtYXgoMCwgc2VsZi50b3RhbCAtIHNlbGYuZ2V0X2Nvbm5lY3RfZHVyYXRpb24oKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVhZApQSwMEFAAAAAAAAAAhAMMebRFXGQAAVxkAAC8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3VybC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKCmZyb20gLi5leGNlcHRpb25zIGltcG9ydCBMb2NhdGlvblBhcnNlRXJyb3IKCgp1cmxfYXR0cnMgPSBbJ3NjaGVtZScsICdhdXRoJywgJ2hvc3QnLCAncG9ydCcsICdwYXRoJywgJ3F1ZXJ5JywgJ2ZyYWdtZW50J10KCiMgV2Ugb25seSB3YW50IHRvIG5vcm1hbGl6ZSB1cmxzIHdpdGggYW4gSFRUUChTKSBzY2hlbWUuCiMgdXJsbGliMyBpbmZlcnMgVVJMcyB3aXRob3V0IGEgc2NoZW1lIChOb25lKSB0byBiZSBodHRwLgpOT1JNQUxJWkFCTEVfU0NIRU1FUyA9ICgnaHR0cCcsICdodHRwcycsIE5vbmUpCgoKY2xhc3MgVXJsKG5hbWVkdHVwbGUoJ1VybCcsIHVybF9hdHRycykpOgogICAgIiIiCiAgICBEYXRhc3RydWN0dXJlIGZvciByZXByZXNlbnRpbmcgYW4gSFRUUCBVUkwuIFVzZWQgYXMgYSByZXR1cm4gdmFsdWUgZm9yCiAgICA6ZnVuYzpgcGFyc2VfdXJsYC4gQm90aCB0aGUgc2NoZW1lIGFuZCBob3N0IGFyZSBub3JtYWxpemVkIGFzIHRoZXkgYXJlCiAgICBib3RoIGNhc2UtaW5zZW5zaXRpdmUgYWNjb3JkaW5nIHRvIFJGQyAzOTg2LgogICAgIiIiCiAgICBfX3Nsb3RzX18gPSAoKQoKICAgIGRlZiBfX25ld19fKGNscywgc2NoZW1lPU5vbmUsIGF1dGg9Tm9uZSwgaG9zdD1Ob25lLCBwb3J0PU5vbmUsIHBhdGg9Tm9uZSwKICAgICAgICAgICAgICAgIHF1ZXJ5PU5vbmUsIGZyYWdtZW50PU5vbmUpOgogICAgICAgIGlmIHBhdGggYW5kIG5vdCBwYXRoLnN0YXJ0c3dpdGgoJy8nKToKICAgICAgICAgICAgcGF0aCA9ICcvJyArIHBhdGgKICAgICAgICBpZiBzY2hlbWU6CiAgICAgICAgICAgIHNjaGVtZSA9IHNjaGVtZS5sb3dlcigpCiAgICAgICAgaWYgaG9zdCBhbmQgc2NoZW1lIGluIE5PUk1BTElaQUJMRV9TQ0hFTUVTOgogICAgICAgICAgICBob3N0ID0gaG9zdC5sb3dlcigpCiAgICAgICAgcmV0dXJuIHN1cGVyKFVybCwgY2xzKS5fX25ld19fKGNscywgc2NoZW1lLCBhdXRoLCBob3N0LCBwb3J0LCBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSwgZnJhZ21lbnQpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaG9zdG5hbWUoc2VsZik6CiAgICAgICAgIiIiRm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHdpdGggdXJscGFyc2UuIFdlJ3JlIG5pY2UgbGlrZSB0aGF0LiIiIgogICAgICAgIHJldHVybiBzZWxmLmhvc3QKCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXF1ZXN0X3VyaShzZWxmKToKICAgICAgICAiIiJBYnNvbHV0ZSBwYXRoIGluY2x1ZGluZyB0aGUgcXVlcnkgc3RyaW5nLiIiIgogICAgICAgIHVyaSA9IHNlbGYucGF0aCBvciAnLycKCiAgICAgICAgaWYgc2VsZi5xdWVyeSBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJpICs9ICc/JyArIHNlbGYucXVlcnkKCiAgICAgICAgcmV0dXJuIHVyaQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG5ldGxvYyhzZWxmKToKICAgICAgICAiIiJOZXR3b3JrIGxvY2F0aW9uIGluY2x1ZGluZyBob3N0IGFuZCBwb3J0IiIiCiAgICAgICAgaWYgc2VsZi5wb3J0OgogICAgICAgICAgICByZXR1cm4gJyVzOiVkJyAlIChzZWxmLmhvc3QsIHNlbGYucG9ydCkKICAgICAgICByZXR1cm4gc2VsZi5ob3N0CgogICAgQHByb3BlcnR5CiAgICBkZWYgdXJsKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENvbnZlcnQgc2VsZiBpbnRvIGEgdXJsCgogICAgICAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG1vcmUgb3IgbGVzcyByb3VuZC10cmlwIHdpdGggOmZ1bmM6YC5wYXJzZV91cmxgLiBUaGUKICAgICAgICByZXR1cm5lZCB1cmwgbWF5IG5vdCBiZSBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSB1cmwgaW5wdXR0ZWQgdG8KICAgICAgICA6ZnVuYzpgLnBhcnNlX3VybGAsIGJ1dCBpdCBzaG91bGQgYmUgZXF1aXZhbGVudCBieSB0aGUgUkZDIChlLmcuLCB1cmxzCiAgICAgICAgd2l0aCBhIGJsYW5rIHBvcnQgd2lsbCBoYXZlIDogcmVtb3ZlZCkuCgogICAgICAgIEV4YW1wbGU6IDo6CgogICAgICAgICAgICA+Pj4gVSA9IHBhcnNlX3VybCgnaHR0cDovL2dvb2dsZS5jb20vbWFpbC8nKQogICAgICAgICAgICA+Pj4gVS51cmwKICAgICAgICAgICAgJ2h0dHA6Ly9nb29nbGUuY29tL21haWwvJwogICAgICAgICAgICA+Pj4gVXJsKCdodHRwJywgJ3VzZXJuYW1lOnBhc3N3b3JkJywgJ2hvc3QuY29tJywgODAsCiAgICAgICAgICAgIC4uLiAnL3BhdGgnLCAncXVlcnknLCAnZnJhZ21lbnQnKS51cmwKICAgICAgICAgICAgJ2h0dHA6Ly91c2VybmFtZTpwYXNzd29yZEBob3N0LmNvbTo4MC9wYXRoP3F1ZXJ5I2ZyYWdtZW50JwogICAgICAgICIiIgogICAgICAgIHNjaGVtZSwgYXV0aCwgaG9zdCwgcG9ydCwgcGF0aCwgcXVlcnksIGZyYWdtZW50ID0gc2VsZgogICAgICAgIHVybCA9ICcnCgogICAgICAgICMgV2UgdXNlICJpcyBub3QgTm9uZSIgd2Ugd2FudCB0aGluZ3MgdG8gaGFwcGVuIHdpdGggZW1wdHkgc3RyaW5ncyAob3IgMCBwb3J0KQogICAgICAgIGlmIHNjaGVtZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJsICs9IHNjaGVtZSArICc6Ly8nCiAgICAgICAgaWYgYXV0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJsICs9IGF1dGggKyAnQCcKICAgICAgICBpZiBob3N0IGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gaG9zdAogICAgICAgIGlmIHBvcnQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVybCArPSAnOicgKyBzdHIocG9ydCkKICAgICAgICBpZiBwYXRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gcGF0aAogICAgICAgIGlmIHF1ZXJ5IGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gJz8nICsgcXVlcnkKICAgICAgICBpZiBmcmFnbWVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJsICs9ICcjJyArIGZyYWdtZW50CgogICAgICAgIHJldHVybiB1cmwKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi51cmwKCgpkZWYgc3BsaXRfZmlyc3QocywgZGVsaW1zKToKICAgICIiIgogICAgR2l2ZW4gYSBzdHJpbmcgYW5kIGFuIGl0ZXJhYmxlIG9mIGRlbGltaXRlcnMsIHNwbGl0IG9uIHRoZSBmaXJzdCBmb3VuZAogICAgZGVsaW1pdGVyLiBSZXR1cm4gdHdvIHNwbGl0IHBhcnRzIGFuZCB0aGUgbWF0Y2hlZCBkZWxpbWl0ZXIuCgogICAgSWYgbm90IGZvdW5kLCB0aGVuIHRoZSBmaXJzdCBwYXJ0IGlzIHRoZSBmdWxsIGlucHV0IHN0cmluZy4KCiAgICBFeGFtcGxlOjoKCiAgICAgICAgPj4+IHNwbGl0X2ZpcnN0KCdmb28vYmFyP2JheicsICc/Lz0nKQogICAgICAgICgnZm9vJywgJ2Jhcj9iYXonLCAnLycpCiAgICAgICAgPj4+IHNwbGl0X2ZpcnN0KCdmb28vYmFyP2JheicsICcxMjMnKQogICAgICAgICgnZm9vL2Jhcj9iYXonLCAnJywgTm9uZSkKCiAgICBTY2FsZXMgbGluZWFybHkgd2l0aCBudW1iZXIgb2YgZGVsaW1zLiBOb3QgaWRlYWwgZm9yIGxhcmdlIG51bWJlciBvZiBkZWxpbXMuCiAgICAiIiIKICAgIG1pbl9pZHggPSBOb25lCiAgICBtaW5fZGVsaW0gPSBOb25lCiAgICBmb3IgZCBpbiBkZWxpbXM6CiAgICAgICAgaWR4ID0gcy5maW5kKGQpCiAgICAgICAgaWYgaWR4IDwgMDoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgbWluX2lkeCBpcyBOb25lIG9yIGlkeCA8IG1pbl9pZHg6CiAgICAgICAgICAgIG1pbl9pZHggPSBpZHgKICAgICAgICAgICAgbWluX2RlbGltID0gZAoKICAgIGlmIG1pbl9pZHggaXMgTm9uZSBvciBtaW5faWR4IDwgMDoKICAgICAgICByZXR1cm4gcywgJycsIE5vbmUKCiAgICByZXR1cm4gc1s6bWluX2lkeF0sIHNbbWluX2lkeCArIDE6XSwgbWluX2RlbGltCgoKZGVmIHBhcnNlX3VybCh1cmwpOgogICAgIiIiCiAgICBHaXZlbiBhIHVybCwgcmV0dXJuIGEgcGFyc2VkIDpjbGFzczpgLlVybGAgbmFtZWR0dXBsZS4gQmVzdC1lZmZvcnQgaXMKICAgIHBlcmZvcm1lZCB0byBwYXJzZSBpbmNvbXBsZXRlIHVybHMuIEZpZWxkcyBub3QgcHJvdmlkZWQgd2lsbCBiZSBOb25lLgoKICAgIFBhcnRseSBiYWNrd2FyZHMtY29tcGF0aWJsZSB3aXRoIDptb2Q6YHVybHBhcnNlYC4KCiAgICBFeGFtcGxlOjoKCiAgICAgICAgPj4+IHBhcnNlX3VybCgnaHR0cDovL2dvb2dsZS5jb20vbWFpbC8nKQogICAgICAgIFVybChzY2hlbWU9J2h0dHAnLCBob3N0PSdnb29nbGUuY29tJywgcG9ydD1Ob25lLCBwYXRoPScvbWFpbC8nLCAuLi4pCiAgICAgICAgPj4+IHBhcnNlX3VybCgnZ29vZ2xlLmNvbTo4MCcpCiAgICAgICAgVXJsKHNjaGVtZT1Ob25lLCBob3N0PSdnb29nbGUuY29tJywgcG9ydD04MCwgcGF0aD1Ob25lLCAuLi4pCiAgICAgICAgPj4+IHBhcnNlX3VybCgnL2Zvbz9iYXInKQogICAgICAgIFVybChzY2hlbWU9Tm9uZSwgaG9zdD1Ob25lLCBwb3J0PU5vbmUsIHBhdGg9Jy9mb28nLCBxdWVyeT0nYmFyJywgLi4uKQogICAgIiIiCgogICAgIyBXaGlsZSB0aGlzIGNvZGUgaGFzIG92ZXJsYXAgd2l0aCBzdGRsaWIncyB1cmxwYXJzZSwgaXQgaXMgbXVjaAogICAgIyBzaW1wbGlmaWVkIGZvciBvdXIgbmVlZHMgYW5kIGxlc3MgYW5ub3lpbmcuCiAgICAjIEFkZGl0aW9uYWxseSwgdGhpcyBpbXBsZW1lbnRhdGlvbnMgZG9lcyBzaWxseSB0aGluZ3MgdG8gYmUgb3B0aW1hbAogICAgIyBvbiBDUHl0aG9uLgoKICAgIGlmIG5vdCB1cmw6CiAgICAgICAgIyBFbXB0eQogICAgICAgIHJldHVybiBVcmwoKQoKICAgIHNjaGVtZSA9IE5vbmUKICAgIGF1dGggPSBOb25lCiAgICBob3N0ID0gTm9uZQogICAgcG9ydCA9IE5vbmUKICAgIHBhdGggPSBOb25lCiAgICBmcmFnbWVudCA9IE5vbmUKICAgIHF1ZXJ5ID0gTm9uZQoKICAgICMgU2NoZW1lCiAgICBpZiAnOi8vJyBpbiB1cmw6CiAgICAgICAgc2NoZW1lLCB1cmwgPSB1cmwuc3BsaXQoJzovLycsIDEpCgogICAgIyBGaW5kIHRoZSBlYXJsaWVzdCBBdXRob3JpdHkgVGVybWluYXRvcgogICAgIyAoaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTMuMikKICAgIHVybCwgcGF0aF8sIGRlbGltID0gc3BsaXRfZmlyc3QodXJsLCBbJy8nLCAnPycsICcjJ10pCgogICAgaWYgZGVsaW06CiAgICAgICAgIyBSZWFzc2VtYmxlIHRoZSBwYXRoCiAgICAgICAgcGF0aCA9IGRlbGltICsgcGF0aF8KCiAgICAjIEF1dGgKICAgIGlmICdAJyBpbiB1cmw6CiAgICAgICAgIyBMYXN0ICdAJyBkZW5vdGVzIGVuZCBvZiBhdXRoIHBhcnQKICAgICAgICBhdXRoLCB1cmwgPSB1cmwucnNwbGl0KCdAJywgMSkKCiAgICAjIElQdjYKICAgIGlmIHVybCBhbmQgdXJsWzBdID09ICdbJzoKICAgICAgICBob3N0LCB1cmwgPSB1cmwuc3BsaXQoJ10nLCAxKQogICAgICAgIGhvc3QgKz0gJ10nCgogICAgIyBQb3J0CiAgICBpZiAnOicgaW4gdXJsOgogICAgICAgIF9ob3N0LCBwb3J0ID0gdXJsLnNwbGl0KCc6JywgMSkKCiAgICAgICAgaWYgbm90IGhvc3Q6CiAgICAgICAgICAgIGhvc3QgPSBfaG9zdAoKICAgICAgICBpZiBwb3J0OgogICAgICAgICAgICAjIElmIGdpdmVuLCBwb3J0cyBtdXN0IGJlIGludGVnZXJzLiBObyB3aGl0ZXNwYWNlLCBubyBwbHVzIG9yCiAgICAgICAgICAgICMgbWludXMgcHJlZml4ZXMsIG5vIG5vbi1pbnRlZ2VyIGRpZ2l0cyBzdWNoIGFzIF4yIChzdXBlcnNjcmlwdCkuCiAgICAgICAgICAgIGlmIG5vdCBwb3J0LmlzZGlnaXQoKToKICAgICAgICAgICAgICAgIHJhaXNlIExvY2F0aW9uUGFyc2VFcnJvcih1cmwpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQocG9ydCkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBMb2NhdGlvblBhcnNlRXJyb3IodXJsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgQmxhbmsgcG9ydHMgYXJlIGNvb2wsIHRvby4gKHJmYzM5ODYjc2VjdGlvbi0zLjIuMykKICAgICAgICAgICAgcG9ydCA9IE5vbmUKCiAgICBlbGlmIG5vdCBob3N0IGFuZCB1cmw6CiAgICAgICAgaG9zdCA9IHVybAoKICAgIGlmIG5vdCBwYXRoOgogICAgICAgIHJldHVybiBVcmwoc2NoZW1lLCBhdXRoLCBob3N0LCBwb3J0LCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpCgogICAgIyBGcmFnbWVudAogICAgaWYgJyMnIGluIHBhdGg6CiAgICAgICAgcGF0aCwgZnJhZ21lbnQgPSBwYXRoLnNwbGl0KCcjJywgMSkKCiAgICAjIFF1ZXJ5CiAgICBpZiAnPycgaW4gcGF0aDoKICAgICAgICBwYXRoLCBxdWVyeSA9IHBhdGguc3BsaXQoJz8nLCAxKQoKICAgIHJldHVybiBVcmwoc2NoZW1lLCBhdXRoLCBob3N0LCBwb3J0LCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpCgoKZGVmIGdldF9ob3N0KHVybCk6CiAgICAiIiIKICAgIERlcHJlY2F0ZWQuIFVzZSA6ZnVuYzpgcGFyc2VfdXJsYCBpbnN0ZWFkLgogICAgIiIiCiAgICBwID0gcGFyc2VfdXJsKHVybCkKICAgIHJldHVybiBwLnNjaGVtZSBvciAnaHR0cCcsIHAuaG9zdG5hbWUsIHAucG9ydApQSwMEFAAAAAAAAAAhALY8I/yrBQAAqwUAADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3dhaXQucHlmcm9tIC5zZWxlY3RvcnMgaW1wb3J0ICgKICAgIEhBU19TRUxFQ1QsCiAgICBEZWZhdWx0U2VsZWN0b3IsCiAgICBFVkVOVF9SRUFELAogICAgRVZFTlRfV1JJVEUKKQoKCmRlZiBfd2FpdF9mb3JfaW9fZXZlbnRzKHNvY2tzLCBldmVudHMsIHRpbWVvdXQ9Tm9uZSk6CiAgICAiIiIgV2FpdHMgZm9yIElPIGV2ZW50cyB0byBiZSBhdmFpbGFibGUgZnJvbSBhIGxpc3Qgb2Ygc29ja2V0cwogICAgb3Igb3B0aW9uYWxseSBhIHNpbmdsZSBzb2NrZXQgaWYgcGFzc2VkIGluLiBSZXR1cm5zIGEgbGlzdCBvZgogICAgc29ja2V0cyB0aGF0IGNhbiBiZSBpbnRlcmFjdGVkIHdpdGggaW1tZWRpYXRlbHkuICIiIgogICAgaWYgbm90IEhBU19TRUxFQ1Q6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignUGxhdGZvcm0gZG9lcyBub3QgaGF2ZSBhIHNlbGVjdG9yJykKICAgIGlmIG5vdCBpc2luc3RhbmNlKHNvY2tzLCBsaXN0KToKICAgICAgICAjIFByb2JhYmx5IGp1c3QgYSBzaW5nbGUgc29ja2V0LgogICAgICAgIGlmIGhhc2F0dHIoc29ja3MsICJmaWxlbm8iKToKICAgICAgICAgICAgc29ja3MgPSBbc29ja3NdCiAgICAgICAgIyBPdGhlcndpc2UgaXQgbWlnaHQgYmUgYSBub24tbGlzdCBpdGVyYWJsZS4KICAgICAgICBlbHNlOgogICAgICAgICAgICBzb2NrcyA9IGxpc3Qoc29ja3MpCiAgICB3aXRoIERlZmF1bHRTZWxlY3RvcigpIGFzIHNlbGVjdG9yOgogICAgICAgIGZvciBzb2NrIGluIHNvY2tzOgogICAgICAgICAgICBzZWxlY3Rvci5yZWdpc3Rlcihzb2NrLCBldmVudHMpCiAgICAgICAgcmV0dXJuIFtrZXlbMF0uZmlsZW9iaiBmb3Iga2V5IGluCiAgICAgICAgICAgICAgICBzZWxlY3Rvci5zZWxlY3QodGltZW91dCkgaWYga2V5WzFdICYgZXZlbnRzXQoKCmRlZiB3YWl0X2Zvcl9yZWFkKHNvY2tzLCB0aW1lb3V0PU5vbmUpOgogICAgIiIiIFdhaXRzIGZvciByZWFkaW5nIHRvIGJlIGF2YWlsYWJsZSBmcm9tIGEgbGlzdCBvZiBzb2NrZXRzCiAgICBvciBvcHRpb25hbGx5IGEgc2luZ2xlIHNvY2tldCBpZiBwYXNzZWQgaW4uIFJldHVybnMgYSBsaXN0IG9mCiAgICBzb2NrZXRzIHRoYXQgY2FuIGJlIHJlYWQgZnJvbSBpbW1lZGlhdGVseS4gIiIiCiAgICByZXR1cm4gX3dhaXRfZm9yX2lvX2V2ZW50cyhzb2NrcywgRVZFTlRfUkVBRCwgdGltZW91dCkKCgpkZWYgd2FpdF9mb3Jfd3JpdGUoc29ja3MsIHRpbWVvdXQ9Tm9uZSk6CiAgICAiIiIgV2FpdHMgZm9yIHdyaXRpbmcgdG8gYmUgYXZhaWxhYmxlIGZyb20gYSBsaXN0IG9mIHNvY2tldHMKICAgIG9yIG9wdGlvbmFsbHkgYSBzaW5nbGUgc29ja2V0IGlmIHBhc3NlZCBpbi4gUmV0dXJucyBhIGxpc3Qgb2YKICAgIHNvY2tldHMgdGhhdCBjYW4gYmUgd3JpdHRlbiB0byBpbW1lZGlhdGVseS4gIiIiCiAgICByZXR1cm4gX3dhaXRfZm9yX2lvX2V2ZW50cyhzb2NrcywgRVZFTlRfV1JJVEUsIHRpbWVvdXQpClBLAwQUAAAAAAAAACEAb8GhOFApAABQKQAANAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MvX19pbml0X18ucHkjIGNvZGluZzogdXRmOAoiIiIKCiAgICB3ZWJlbmNvZGluZ3MKICAgIH5+fn5+fn5+fn5+fgoKICAgIFRoaXMgaXMgYSBQeXRob24gaW1wbGVtZW50YXRpb24gb2YgdGhlIGBXSEFUV0cgRW5jb2Rpbmcgc3RhbmRhcmQKICAgIDxodHRwOi8vZW5jb2Rpbmcuc3BlYy53aGF0d2cub3JnLz5gLiBTZWUgUkVBRE1FIGZvciBkZXRhaWxzLgoKICAgIDpjb3B5cmlnaHQ6IENvcHlyaWdodCAyMDEyIGJ5IFNpbW9uIFNhcGluCiAgICA6bGljZW5zZTogQlNELCBzZWUgTElDRU5TRSBmb3IgZGV0YWlscy4KCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCgppbXBvcnQgY29kZWNzCgpmcm9tIC5sYWJlbHMgaW1wb3J0IExBQkVMUwoKClZFUlNJT04gPSAnMC41JwoKCiMgU29tZSBuYW1lcyBpbiBFbmNvZGluZyBhcmUgbm90IHZhbGlkIFB5dGhvbiBhbGlhc2VzLiBSZW1hcCB0aGVzZS4KUFlUSE9OX05BTUVTID0gewogICAgJ2lzby04ODU5LTgtaSc6ICdpc28tODg1OS04JywKICAgICd4LW1hYy1jeXJpbGxpYyc6ICdtYWMtY3lyaWxsaWMnLAogICAgJ21hY2ludG9zaCc6ICdtYWMtcm9tYW4nLAogICAgJ3dpbmRvd3MtODc0JzogJ2NwODc0J30KCkNBQ0hFID0ge30KCgpkZWYgYXNjaWlfbG93ZXIoc3RyaW5nKToKICAgIHIiIiJUcmFuc2Zvcm0gKG9ubHkpIEFTQ0lJIGxldHRlcnMgdG8gbG93ZXIgY2FzZTogQS1aIGlzIG1hcHBlZCB0byBhLXouCgogICAgOnBhcmFtIHN0cmluZzogQW4gVW5pY29kZSBzdHJpbmcuCiAgICA6cmV0dXJuczogQSBuZXcgVW5pY29kZSBzdHJpbmcuCgogICAgVGhpcyBpcyB1c2VkIGZvciBgQVNDSUkgY2FzZS1pbnNlbnNpdGl2ZQogICAgPGh0dHA6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2FzY2lpLWNhc2UtaW5zZW5zaXRpdmU+YF8KICAgIG1hdGNoaW5nIG9mIGVuY29kaW5nIGxhYmVscy4KICAgIFRoZSBzYW1lIG1hdGNoaW5nIGlzIGFsc28gdXNlZCwgYW1vbmcgb3RoZXIgdGhpbmdzLAogICAgZm9yIGBDU1Mga2V5d29yZHMgPGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzcy12YWx1ZXMvI2tleXdvcmRzPmBfLgoKICAgIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIDptZXRoOmB+cHk6c3RyLmxvd2VyYCBtZXRob2Qgb2YgVW5pY29kZSBzdHJpbmdzCiAgICB3aGljaCBhbHNvIGFmZmVjdCBub24tQVNDSUkgY2hhcmFjdGVycywKICAgIHNvbWV0aW1lcyBtYXBwaW5nIHRoZW0gaW50byB0aGUgQVNDSUkgcmFuZ2U6CgogICAgICAgID4+PiBrZXl3b3JkID0gdSdCYWNcTntLRUxWSU4gU0lHTn1ncm91bmQnCiAgICAgICAgPj4+IGFzc2VydCBrZXl3b3JkLmxvd2VyKCkgPT0gdSdiYWNrZ3JvdW5kJwogICAgICAgID4+PiBhc3NlcnQgYXNjaWlfbG93ZXIoa2V5d29yZCkgIT0ga2V5d29yZC5sb3dlcigpCiAgICAgICAgPj4+IGFzc2VydCBhc2NpaV9sb3dlcihrZXl3b3JkKSA9PSB1J2JhY1xOe0tFTFZJTiBTSUdOfWdyb3VuZCcKCiAgICAiIiIKICAgICMgVGhpcyB0dXJucyBvdXQgdG8gYmUgZmFzdGVyIHRoYW4gdW5pY29kZS50cmFuc2xhdGUoKQogICAgcmV0dXJuIHN0cmluZy5lbmNvZGUoJ3V0ZjgnKS5sb3dlcigpLmRlY29kZSgndXRmOCcpCgoKZGVmIGxvb2t1cChsYWJlbCk6CiAgICAiIiIKICAgIExvb2sgZm9yIGFuIGVuY29kaW5nIGJ5IGl0cyBsYWJlbC4KICAgIFRoaXMgaXMgdGhlIHNwZWPigJlzIGBnZXQgYW4gZW5jb2RpbmcKICAgIDxodHRwOi8vZW5jb2Rpbmcuc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWVuY29kaW5nLWdldD5gXyBhbGdvcml0aG0uCiAgICBTdXBwb3J0ZWQgbGFiZWxzIGFyZSBsaXN0ZWQgdGhlcmUuCgogICAgOnBhcmFtIGxhYmVsOiBBIHN0cmluZy4KICAgIDpyZXR1cm5zOgogICAgICAgIEFuIDpjbGFzczpgRW5jb2RpbmdgIG9iamVjdCwgb3IgOm9iajpgTm9uZWAgZm9yIGFuIHVua25vd24gbGFiZWwuCgogICAgIiIiCiAgICAjIE9ubHkgc3RyaXAgQVNDSUkgd2hpdGVzcGFjZTogVSswMDA5LCBVKzAwMEEsIFUrMDAwQywgVSswMDBELCBhbmQgVSswMDIwLgogICAgbGFiZWwgPSBhc2NpaV9sb3dlcihsYWJlbC5zdHJpcCgnXHRcblxmXHIgJykpCiAgICBuYW1lID0gTEFCRUxTLmdldChsYWJlbCkKICAgIGlmIG5hbWUgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQogICAgZW5jb2RpbmcgPSBDQUNIRS5nZXQobmFtZSkKICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CiAgICAgICAgaWYgbmFtZSA9PSAneC11c2VyLWRlZmluZWQnOgogICAgICAgICAgICBmcm9tIC54X3VzZXJfZGVmaW5lZCBpbXBvcnQgY29kZWNfaW5mbwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHB5dGhvbl9uYW1lID0gUFlUSE9OX05BTUVTLmdldChuYW1lLCBuYW1lKQogICAgICAgICAgICAjIEFueSBweXRob25fbmFtZSB2YWx1ZSB0aGF0IGdldHMgdG8gaGVyZSBzaG91bGQgYmUgdmFsaWQuCiAgICAgICAgICAgIGNvZGVjX2luZm8gPSBjb2RlY3MubG9va3VwKHB5dGhvbl9uYW1lKQogICAgICAgIGVuY29kaW5nID0gRW5jb2RpbmcobmFtZSwgY29kZWNfaW5mbykKICAgICAgICBDQUNIRVtuYW1lXSA9IGVuY29kaW5nCiAgICByZXR1cm4gZW5jb2RpbmcKCgpkZWYgX2dldF9lbmNvZGluZyhlbmNvZGluZ19vcl9sYWJlbCk6CiAgICAiIiIKICAgIEFjY2VwdCBlaXRoZXIgYW4gZW5jb2Rpbmcgb2JqZWN0IG9yIGxhYmVsLgoKICAgIDpwYXJhbSBlbmNvZGluZzogQW4gOmNsYXNzOmBFbmNvZGluZ2Agb2JqZWN0IG9yIGEgbGFiZWwgc3RyaW5nLgogICAgOnJldHVybnM6IEFuIDpjbGFzczpgRW5jb2RpbmdgIG9iamVjdC4KICAgIDpyYWlzZXM6IDpleGM6YH5leGNlcHRpb25zLkxvb2t1cEVycm9yYCBmb3IgYW4gdW5rbm93biBsYWJlbC4KCiAgICAiIiIKICAgIGlmIGhhc2F0dHIoZW5jb2Rpbmdfb3JfbGFiZWwsICdjb2RlY19pbmZvJyk6CiAgICAgICAgcmV0dXJuIGVuY29kaW5nX29yX2xhYmVsCgogICAgZW5jb2RpbmcgPSBsb29rdXAoZW5jb2Rpbmdfb3JfbGFiZWwpCiAgICBpZiBlbmNvZGluZyBpcyBOb25lOgogICAgICAgIHJhaXNlIExvb2t1cEVycm9yKCdVbmtub3duIGVuY29kaW5nIGxhYmVsOiAlcicgJSBlbmNvZGluZ19vcl9sYWJlbCkKICAgIHJldHVybiBlbmNvZGluZwoKCmNsYXNzIEVuY29kaW5nKG9iamVjdCk6CiAgICAiIiJSZXJlc2VudHMgYSBjaGFyYWN0ZXIgZW5jb2Rpbmcgc3VjaCBhcyBVVEYtOCwKICAgIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGRlY29kaW5nIG9yIGVuY29kaW5nLgoKICAgIC4uIGF0dHJpYnV0ZTo6IG5hbWUKCiAgICAgICAgQ2Fub25pY2FsIG5hbWUgb2YgdGhlIGVuY29kaW5nCgogICAgLi4gYXR0cmlidXRlOjogY29kZWNfaW5mbwoKICAgICAgICBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBlbmNvZGluZywKICAgICAgICBhIHN0ZGxpYiA6Y2xhc3M6YH5jb2RlY3MuQ29kZWNJbmZvYCBvYmplY3QuCiAgICAgICAgU2VlIDpmdW5jOmBjb2RlY3MucmVnaXN0ZXJgLgoKICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGNvZGVjX2luZm8pOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLmNvZGVjX2luZm8gPSBjb2RlY19pbmZvCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnPEVuY29kaW5nICVzPicgJSBzZWxmLm5hbWUKCgojOiBUaGUgVVRGLTggZW5jb2RpbmcuIFNob3VsZCBiZSB1c2VkIGZvciBuZXcgY29udGVudCBhbmQgZm9ybWF0cy4KVVRGOCA9IGxvb2t1cCgndXRmLTgnKQoKX1VURjE2TEUgPSBsb29rdXAoJ3V0Zi0xNmxlJykKX1VURjE2QkUgPSBsb29rdXAoJ3V0Zi0xNmJlJykKCgpkZWYgZGVjb2RlKGlucHV0LCBmYWxsYmFja19lbmNvZGluZywgZXJyb3JzPSdyZXBsYWNlJyk6CiAgICAiIiIKICAgIERlY29kZSBhIHNpbmdsZSBzdHJpbmcuCgogICAgOnBhcmFtIGlucHV0OiBBIGJ5dGUgc3RyaW5nCiAgICA6cGFyYW0gZmFsbGJhY2tfZW5jb2Rpbmc6CiAgICAgICAgQW4gOmNsYXNzOmBFbmNvZGluZ2Agb2JqZWN0IG9yIGEgbGFiZWwgc3RyaW5nLgogICAgICAgIFRoZSBlbmNvZGluZyB0byB1c2UgaWYgOm9iajpgaW5wdXRgIGRvZXMgbm90ZSBoYXZlIGEgQk9NLgogICAgOnBhcmFtIGVycm9yczogVHlwZSBvZiBlcnJvciBoYW5kbGluZy4gU2VlIDpmdW5jOmBjb2RlY3MucmVnaXN0ZXJgLgogICAgOnJhaXNlczogOmV4YzpgfmV4Y2VwdGlvbnMuTG9va3VwRXJyb3JgIGZvciBhbiB1bmtub3duIGVuY29kaW5nIGxhYmVsLgogICAgOnJldHVybjoKICAgICAgICBBIGBgKG91dHB1dCwgZW5jb2RpbmcpYGAgdHVwbGUgb2YgYW4gVW5pY29kZSBzdHJpbmcKICAgICAgICBhbmQgYW4gOm9iajpgRW5jb2RpbmdgLgoKICAgICIiIgogICAgIyBGYWlsIGVhcmx5IGlmIGBlbmNvZGluZ2AgaXMgYW4gaW52YWxpZCBsYWJlbC4KICAgIGZhbGxiYWNrX2VuY29kaW5nID0gX2dldF9lbmNvZGluZyhmYWxsYmFja19lbmNvZGluZykKICAgIGJvbV9lbmNvZGluZywgaW5wdXQgPSBfZGV0ZWN0X2JvbShpbnB1dCkKICAgIGVuY29kaW5nID0gYm9tX2VuY29kaW5nIG9yIGZhbGxiYWNrX2VuY29kaW5nCiAgICByZXR1cm4gZW5jb2RpbmcuY29kZWNfaW5mby5kZWNvZGUoaW5wdXQsIGVycm9ycylbMF0sIGVuY29kaW5nCgoKZGVmIF9kZXRlY3RfYm9tKGlucHV0KToKICAgICIiIlJldHVybiAoYm9tX2VuY29kaW5nLCBpbnB1dCksIHdpdGggYW55IEJPTSByZW1vdmVkIGZyb20gdGhlIGlucHV0LiIiIgogICAgaWYgaW5wdXQuc3RhcnRzd2l0aChiJ1x4RkZceEZFJyk6CiAgICAgICAgcmV0dXJuIF9VVEYxNkxFLCBpbnB1dFsyOl0KICAgIGlmIGlucHV0LnN0YXJ0c3dpdGgoYidceEZFXHhGRicpOgogICAgICAgIHJldHVybiBfVVRGMTZCRSwgaW5wdXRbMjpdCiAgICBpZiBpbnB1dC5zdGFydHN3aXRoKGInXHhFRlx4QkJceEJGJyk6CiAgICAgICAgcmV0dXJuIFVURjgsIGlucHV0WzM6XQogICAgcmV0dXJuIE5vbmUsIGlucHV0CgoKZGVmIGVuY29kZShpbnB1dCwgZW5jb2Rpbmc9VVRGOCwgZXJyb3JzPSdzdHJpY3QnKToKICAgICIiIgogICAgRW5jb2RlIGEgc2luZ2xlIHN0cmluZy4KCiAgICA6cGFyYW0gaW5wdXQ6IEFuIFVuaWNvZGUgc3RyaW5nLgogICAgOnBhcmFtIGVuY29kaW5nOiBBbiA6Y2xhc3M6YEVuY29kaW5nYCBvYmplY3Qgb3IgYSBsYWJlbCBzdHJpbmcuCiAgICA6cGFyYW0gZXJyb3JzOiBUeXBlIG9mIGVycm9yIGhhbmRsaW5nLiBTZWUgOmZ1bmM6YGNvZGVjcy5yZWdpc3RlcmAuCiAgICA6cmFpc2VzOiA6ZXhjOmB+ZXhjZXB0aW9ucy5Mb29rdXBFcnJvcmAgZm9yIGFuIHVua25vd24gZW5jb2RpbmcgbGFiZWwuCiAgICA6cmV0dXJuOiBBIGJ5dGUgc3RyaW5nLgoKICAgICIiIgogICAgcmV0dXJuIF9nZXRfZW5jb2RpbmcoZW5jb2RpbmcpLmNvZGVjX2luZm8uZW5jb2RlKGlucHV0LCBlcnJvcnMpWzBdCgoKZGVmIGl0ZXJfZGVjb2RlKGlucHV0LCBmYWxsYmFja19lbmNvZGluZywgZXJyb3JzPSdyZXBsYWNlJyk6CiAgICAiIiIKICAgICJQdWxsIi1iYXNlZCBkZWNvZGVyLgoKICAgIDpwYXJhbSBpbnB1dDoKICAgICAgICBBbiBpdGVyYWJsZSBvZiBieXRlIHN0cmluZ3MuCgogICAgICAgIFRoZSBpbnB1dCBpcyBmaXJzdCBjb25zdW1lZCBqdXN0IGVub3VnaCB0byBkZXRlcm1pbmUgdGhlIGVuY29kaW5nCiAgICAgICAgYmFzZWQgb24gdGhlIHByZWNlbnNlIG9mIGEgQk9NLAogICAgICAgIHRoZW4gY29uc3VtZWQgb24gZGVtYW5kIHdoZW4gdGhlIHJldHVybiB2YWx1ZSBpcy4KICAgIDpwYXJhbSBmYWxsYmFja19lbmNvZGluZzoKICAgICAgICBBbiA6Y2xhc3M6YEVuY29kaW5nYCBvYmplY3Qgb3IgYSBsYWJlbCBzdHJpbmcuCiAgICAgICAgVGhlIGVuY29kaW5nIHRvIHVzZSBpZiA6b2JqOmBpbnB1dGAgZG9lcyBub3RlIGhhdmUgYSBCT00uCiAgICA6cGFyYW0gZXJyb3JzOiBUeXBlIG9mIGVycm9yIGhhbmRsaW5nLiBTZWUgOmZ1bmM6YGNvZGVjcy5yZWdpc3RlcmAuCiAgICA6cmFpc2VzOiA6ZXhjOmB+ZXhjZXB0aW9ucy5Mb29rdXBFcnJvcmAgZm9yIGFuIHVua25vd24gZW5jb2RpbmcgbGFiZWwuCiAgICA6cmV0dXJuczoKICAgICAgICBBbiBgYChvdXRwdXQsIGVuY29kaW5nKWBgIHR1cGxlLgogICAgICAgIDpvYmo6YG91dHB1dGAgaXMgYW4gaXRlcmFibGUgb2YgVW5pY29kZSBzdHJpbmdzLAogICAgICAgIDpvYmo6YGVuY29kaW5nYCBpcyB0aGUgOm9iajpgRW5jb2RpbmdgIHRoYXQgaXMgYmVpbmcgdXNlZC4KCiAgICAiIiIKCiAgICBkZWNvZGVyID0gSW5jcmVtZW50YWxEZWNvZGVyKGZhbGxiYWNrX2VuY29kaW5nLCBlcnJvcnMpCiAgICBnZW5lcmF0b3IgPSBfaXRlcl9kZWNvZGVfZ2VuZXJhdG9yKGlucHV0LCBkZWNvZGVyKQogICAgZW5jb2RpbmcgPSBuZXh0KGdlbmVyYXRvcikKICAgIHJldHVybiBnZW5lcmF0b3IsIGVuY29kaW5nCgoKZGVmIF9pdGVyX2RlY29kZV9nZW5lcmF0b3IoaW5wdXQsIGRlY29kZXIpOgogICAgIiIiUmV0dXJuIGEgZ2VuZXJhdG9yIHRoYXQgZmlyc3QgeWllbGRzIHRoZSA6b2JqOmBFbmNvZGluZ2AsCiAgICB0aGVuIHlpZWxkcyBvdXRwdXQgY2h1a25zIGFzIFVuaWNvZGUgc3RyaW5ncy4KCiAgICAiIiIKICAgIGRlY29kZSA9IGRlY29kZXIuZGVjb2RlCiAgICBpbnB1dCA9IGl0ZXIoaW5wdXQpCiAgICBmb3IgY2h1bmNrIGluIGlucHV0OgogICAgICAgIG91dHB1dCA9IGRlY29kZShjaHVuY2spCiAgICAgICAgaWYgb3V0cHV0OgogICAgICAgICAgICBhc3NlcnQgZGVjb2Rlci5lbmNvZGluZyBpcyBub3QgTm9uZQogICAgICAgICAgICB5aWVsZCBkZWNvZGVyLmVuY29kaW5nCiAgICAgICAgICAgIHlpZWxkIG91dHB1dAogICAgICAgICAgICBicmVhawogICAgZWxzZToKICAgICAgICAjIElucHV0IGV4aGF1c3RlZCB3aXRob3V0IGRldGVybWluaW5nIHRoZSBlbmNvZGluZwogICAgICAgIG91dHB1dCA9IGRlY29kZShiJycsIGZpbmFsPVRydWUpCiAgICAgICAgYXNzZXJ0IGRlY29kZXIuZW5jb2RpbmcgaXMgbm90IE5vbmUKICAgICAgICB5aWVsZCBkZWNvZGVyLmVuY29kaW5nCiAgICAgICAgaWYgb3V0cHV0OgogICAgICAgICAgICB5aWVsZCBvdXRwdXQKICAgICAgICByZXR1cm4KCiAgICBmb3IgY2h1bmNrIGluIGlucHV0OgogICAgICAgIG91dHB1dCA9IGRlY29kZShjaHVuY2spCiAgICAgICAgaWYgb3V0cHV0OgogICAgICAgICAgICB5aWVsZCBvdXRwdXQKICAgIG91dHB1dCA9IGRlY29kZShiJycsIGZpbmFsPVRydWUpCiAgICBpZiBvdXRwdXQ6CiAgICAgICAgeWllbGQgb3V0cHV0CgoKZGVmIGl0ZXJfZW5jb2RlKGlucHV0LCBlbmNvZGluZz1VVEY4LCBlcnJvcnM9J3N0cmljdCcpOgogICAgIiIiCiAgICDigJxQdWxs4oCdLWJhc2VkIGVuY29kZXIuCgogICAgOnBhcmFtIGlucHV0OiBBbiBpdGVyYWJsZSBvZiBVbmljb2RlIHN0cmluZ3MuCiAgICA6cGFyYW0gZW5jb2Rpbmc6IEFuIDpjbGFzczpgRW5jb2RpbmdgIG9iamVjdCBvciBhIGxhYmVsIHN0cmluZy4KICAgIDpwYXJhbSBlcnJvcnM6IFR5cGUgb2YgZXJyb3IgaGFuZGxpbmcuIFNlZSA6ZnVuYzpgY29kZWNzLnJlZ2lzdGVyYC4KICAgIDpyYWlzZXM6IDpleGM6YH5leGNlcHRpb25zLkxvb2t1cEVycm9yYCBmb3IgYW4gdW5rbm93biBlbmNvZGluZyBsYWJlbC4KICAgIDpyZXR1cm5zOiBBbiBpdGVyYWJsZSBvZiBieXRlIHN0cmluZ3MuCgogICAgIiIiCiAgICAjIEZhaWwgZWFybHkgaWYgYGVuY29kaW5nYCBpcyBhbiBpbnZhbGlkIGxhYmVsLgogICAgZW5jb2RlID0gSW5jcmVtZW50YWxFbmNvZGVyKGVuY29kaW5nLCBlcnJvcnMpLmVuY29kZQogICAgcmV0dXJuIF9pdGVyX2VuY29kZV9nZW5lcmF0b3IoaW5wdXQsIGVuY29kZSkKCgpkZWYgX2l0ZXJfZW5jb2RlX2dlbmVyYXRvcihpbnB1dCwgZW5jb2RlKToKICAgIGZvciBjaHVuY2sgaW4gaW5wdXQ6CiAgICAgICAgb3V0cHV0ID0gZW5jb2RlKGNodW5jaykKICAgICAgICBpZiBvdXRwdXQ6CiAgICAgICAgICAgIHlpZWxkIG91dHB1dAogICAgb3V0cHV0ID0gZW5jb2RlKCcnLCBmaW5hbD1UcnVlKQogICAgaWYgb3V0cHV0OgogICAgICAgIHlpZWxkIG91dHB1dAoKCmNsYXNzIEluY3JlbWVudGFsRGVjb2RlcihvYmplY3QpOgogICAgIiIiCiAgICDigJxQdXNo4oCdLWJhc2VkIGRlY29kZXIuCgogICAgOnBhcmFtIGZhbGxiYWNrX2VuY29kaW5nOgogICAgICAgIEFuIDpjbGFzczpgRW5jb2RpbmdgIG9iamVjdCBvciBhIGxhYmVsIHN0cmluZy4KICAgICAgICBUaGUgZW5jb2RpbmcgdG8gdXNlIGlmIDpvYmo6YGlucHV0YCBkb2VzIG5vdGUgaGF2ZSBhIEJPTS4KICAgIDpwYXJhbSBlcnJvcnM6IFR5cGUgb2YgZXJyb3IgaGFuZGxpbmcuIFNlZSA6ZnVuYzpgY29kZWNzLnJlZ2lzdGVyYC4KICAgIDpyYWlzZXM6IDpleGM6YH5leGNlcHRpb25zLkxvb2t1cEVycm9yYCBmb3IgYW4gdW5rbm93biBlbmNvZGluZyBsYWJlbC4KCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmYWxsYmFja19lbmNvZGluZywgZXJyb3JzPSdyZXBsYWNlJyk6CiAgICAgICAgIyBGYWlsIGVhcmx5IGlmIGBlbmNvZGluZ2AgaXMgYW4gaW52YWxpZCBsYWJlbC4KICAgICAgICBzZWxmLl9mYWxsYmFja19lbmNvZGluZyA9IF9nZXRfZW5jb2RpbmcoZmFsbGJhY2tfZW5jb2RpbmcpCiAgICAgICAgc2VsZi5fZXJyb3JzID0gZXJyb3JzCiAgICAgICAgc2VsZi5fYnVmZmVyID0gYicnCiAgICAgICAgc2VsZi5fZGVjb2RlciA9IE5vbmUKICAgICAgICAjOiBUaGUgYWN0dWFsIDpjbGFzczpgRW5jb2RpbmdgIHRoYXQgaXMgYmVpbmcgdXNlZCwKICAgICAgICAjOiBvciA6b2JqOmBOb25lYCBpZiB0aGF0IGlzIG5vdCBkZXRlcm1pbmVkIHlldC4KICAgICAgICAjOiAoSWUuIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggaW5wdXQgeWV0IHRvIGRldGVybWluZQogICAgICAgICM6IGlmIHRoZXJlIGlzIGEgQk9NLikKICAgICAgICBzZWxmLmVuY29kaW5nID0gTm9uZSAgIyBOb3Qga25vd24geWV0LgoKICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKICAgICAgICAiIiJEZWNvZGUgb25lIGNodW5rIG9mIHRoZSBpbnB1dC4KCiAgICAgICAgOnBhcmFtIGlucHV0OiBBIGJ5dGUgc3RyaW5nLgogICAgICAgIDpwYXJhbSBmaW5hbDoKICAgICAgICAgICAgSW5kaWNhdGUgdGhhdCBubyBtb3JlIGlucHV0IGlzIGF2YWlsYWJsZS4KICAgICAgICAgICAgTXVzdCBiZSA6b2JqOmBUcnVlYCBpZiB0aGlzIGlzIHRoZSBsYXN0IGNhbGwuCiAgICAgICAgOnJldHVybnM6IEFuIFVuaWNvZGUgc3RyaW5nLgoKICAgICAgICAiIiIKICAgICAgICBkZWNvZGVyID0gc2VsZi5fZGVjb2RlcgogICAgICAgIGlmIGRlY29kZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBkZWNvZGVyKGlucHV0LCBmaW5hbCkKCiAgICAgICAgaW5wdXQgPSBzZWxmLl9idWZmZXIgKyBpbnB1dAogICAgICAgIGVuY29kaW5nLCBpbnB1dCA9IF9kZXRlY3RfYm9tKGlucHV0KQogICAgICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIGxlbihpbnB1dCkgPCAzIGFuZCBub3QgZmluYWw6ICAjIE5vdCBlbm91Z2ggZGF0YSB5ZXQuCiAgICAgICAgICAgICAgICBzZWxmLl9idWZmZXIgPSBpbnB1dAogICAgICAgICAgICAgICAgcmV0dXJuICcnCiAgICAgICAgICAgIGVsc2U6ICAjIE5vIEJPTQogICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBzZWxmLl9mYWxsYmFja19lbmNvZGluZwogICAgICAgIGRlY29kZXIgPSBlbmNvZGluZy5jb2RlY19pbmZvLmluY3JlbWVudGFsZGVjb2RlcihzZWxmLl9lcnJvcnMpLmRlY29kZQogICAgICAgIHNlbGYuX2RlY29kZXIgPSBkZWNvZGVyCiAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCiAgICAgICAgcmV0dXJuIGRlY29kZXIoaW5wdXQsIGZpbmFsKQoKCmNsYXNzIEluY3JlbWVudGFsRW5jb2RlcihvYmplY3QpOgogICAgIiIiCiAgICDigJxQdXNo4oCdLWJhc2VkIGVuY29kZXIuCgogICAgOnBhcmFtIGVuY29kaW5nOiBBbiA6Y2xhc3M6YEVuY29kaW5nYCBvYmplY3Qgb3IgYSBsYWJlbCBzdHJpbmcuCiAgICA6cGFyYW0gZXJyb3JzOiBUeXBlIG9mIGVycm9yIGhhbmRsaW5nLiBTZWUgOmZ1bmM6YGNvZGVjcy5yZWdpc3RlcmAuCiAgICA6cmFpc2VzOiA6ZXhjOmB+ZXhjZXB0aW9ucy5Mb29rdXBFcnJvcmAgZm9yIGFuIHVua25vd24gZW5jb2RpbmcgbGFiZWwuCgogICAgLi4gbWV0aG9kOjogZW5jb2RlKGlucHV0LCBmaW5hbD1GYWxzZSkKCiAgICAgICAgOnBhcmFtIGlucHV0OiBBbiBVbmljb2RlIHN0cmluZy4KICAgICAgICA6cGFyYW0gZmluYWw6CiAgICAgICAgICAgIEluZGljYXRlIHRoYXQgbm8gbW9yZSBpbnB1dCBpcyBhdmFpbGFibGUuCiAgICAgICAgICAgIE11c3QgYmUgOm9iajpgVHJ1ZWAgaWYgdGhpcyBpcyB0aGUgbGFzdCBjYWxsLgogICAgICAgIDpyZXR1cm5zOiBBIGJ5dGUgc3RyaW5nLgoKICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGVuY29kaW5nPVVURjgsIGVycm9ycz0nc3RyaWN0Jyk6CiAgICAgICAgZW5jb2RpbmcgPSBfZ2V0X2VuY29kaW5nKGVuY29kaW5nKQogICAgICAgIHNlbGYuZW5jb2RlID0gZW5jb2RpbmcuY29kZWNfaW5mby5pbmNyZW1lbnRhbGVuY29kZXIoZXJyb3JzKS5lbmNvZGUKUEsDBBQAAAAAAAAAIQDHrQiLEyMAABMjAAAyAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy9sYWJlbHMucHkiIiIKCiAgICB3ZWJlbmNvZGluZ3MubGFiZWxzCiAgICB+fn5+fn5+fn5+fn5+fn5+fn5+CgogICAgTWFwIGVuY29kaW5nIGxhYmVscyB0byB0aGVpciBuYW1lLgoKICAgIDpjb3B5cmlnaHQ6IENvcHlyaWdodCAyMDEyIGJ5IFNpbW9uIFNhcGluCiAgICA6bGljZW5zZTogQlNELCBzZWUgTElDRU5TRSBmb3IgZGV0YWlscy4KCiIiIgoKIyBYWFggRG8gbm90IGVkaXQhCiMgVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IG1rbGFiZWxzLnB5CgpMQUJFTFMgPSB7CiAgICAndW5pY29kZS0xLTEtdXRmLTgnOiAgICd1dGYtOCcsCiAgICAndXRmLTgnOiAgICAgICAgICAgICAgICd1dGYtOCcsCiAgICAndXRmOCc6ICAgICAgICAgICAgICAgICd1dGYtOCcsCiAgICAnODY2JzogICAgICAgICAgICAgICAgICdpYm04NjYnLAogICAgJ2NwODY2JzogICAgICAgICAgICAgICAnaWJtODY2JywKICAgICdjc2libTg2Nic6ICAgICAgICAgICAgJ2libTg2NicsCiAgICAnaWJtODY2JzogICAgICAgICAgICAgICdpYm04NjYnLAogICAgJ2NzaXNvbGF0aW4yJzogICAgICAgICAnaXNvLTg4NTktMicsCiAgICAnaXNvLTg4NTktMic6ICAgICAgICAgICdpc28tODg1OS0yJywKICAgICdpc28taXItMTAxJzogICAgICAgICAgJ2lzby04ODU5LTInLAogICAgJ2lzbzg4NTktMic6ICAgICAgICAgICAnaXNvLTg4NTktMicsCiAgICAnaXNvODg1OTInOiAgICAgICAgICAgICdpc28tODg1OS0yJywKICAgICdpc29fODg1OS0yJzogICAgICAgICAgJ2lzby04ODU5LTInLAogICAgJ2lzb184ODU5LTI6MTk4Nyc6ICAgICAnaXNvLTg4NTktMicsCiAgICAnbDInOiAgICAgICAgICAgICAgICAgICdpc28tODg1OS0yJywKICAgICdsYXRpbjInOiAgICAgICAgICAgICAgJ2lzby04ODU5LTInLAogICAgJ2NzaXNvbGF0aW4zJzogICAgICAgICAnaXNvLTg4NTktMycsCiAgICAnaXNvLTg4NTktMyc6ICAgICAgICAgICdpc28tODg1OS0zJywKICAgICdpc28taXItMTA5JzogICAgICAgICAgJ2lzby04ODU5LTMnLAogICAgJ2lzbzg4NTktMyc6ICAgICAgICAgICAnaXNvLTg4NTktMycsCiAgICAnaXNvODg1OTMnOiAgICAgICAgICAgICdpc28tODg1OS0zJywKICAgICdpc29fODg1OS0zJzogICAgICAgICAgJ2lzby04ODU5LTMnLAogICAgJ2lzb184ODU5LTM6MTk4OCc6ICAgICAnaXNvLTg4NTktMycsCiAgICAnbDMnOiAgICAgICAgICAgICAgICAgICdpc28tODg1OS0zJywKICAgICdsYXRpbjMnOiAgICAgICAgICAgICAgJ2lzby04ODU5LTMnLAogICAgJ2NzaXNvbGF0aW40JzogICAgICAgICAnaXNvLTg4NTktNCcsCiAgICAnaXNvLTg4NTktNCc6ICAgICAgICAgICdpc28tODg1OS00JywKICAgICdpc28taXItMTEwJzogICAgICAgICAgJ2lzby04ODU5LTQnLAogICAgJ2lzbzg4NTktNCc6ICAgICAgICAgICAnaXNvLTg4NTktNCcsCiAgICAnaXNvODg1OTQnOiAgICAgICAgICAgICdpc28tODg1OS00JywKICAgICdpc29fODg1OS00JzogICAgICAgICAgJ2lzby04ODU5LTQnLAogICAgJ2lzb184ODU5LTQ6MTk4OCc6ICAgICAnaXNvLTg4NTktNCcsCiAgICAnbDQnOiAgICAgICAgICAgICAgICAgICdpc28tODg1OS00JywKICAgICdsYXRpbjQnOiAgICAgICAgICAgICAgJ2lzby04ODU5LTQnLAogICAgJ2NzaXNvbGF0aW5jeXJpbGxpYyc6ICAnaXNvLTg4NTktNScsCiAgICAnY3lyaWxsaWMnOiAgICAgICAgICAgICdpc28tODg1OS01JywKICAgICdpc28tODg1OS01JzogICAgICAgICAgJ2lzby04ODU5LTUnLAogICAgJ2lzby1pci0xNDQnOiAgICAgICAgICAnaXNvLTg4NTktNScsCiAgICAnaXNvODg1OS01JzogICAgICAgICAgICdpc28tODg1OS01JywKICAgICdpc284ODU5NSc6ICAgICAgICAgICAgJ2lzby04ODU5LTUnLAogICAgJ2lzb184ODU5LTUnOiAgICAgICAgICAnaXNvLTg4NTktNScsCiAgICAnaXNvXzg4NTktNToxOTg4JzogICAgICdpc28tODg1OS01JywKICAgICdhcmFiaWMnOiAgICAgICAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2FzbW8tNzA4JzogICAgICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnY3Npc284ODU5NmUnOiAgICAgICAgICdpc28tODg1OS02JywKICAgICdjc2lzbzg4NTk2aSc6ICAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2NzaXNvbGF0aW5hcmFiaWMnOiAgICAnaXNvLTg4NTktNicsCiAgICAnZWNtYS0xMTQnOiAgICAgICAgICAgICdpc28tODg1OS02JywKICAgICdpc28tODg1OS02JzogICAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2lzby04ODU5LTYtZSc6ICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnaXNvLTg4NTktNi1pJzogICAgICAgICdpc28tODg1OS02JywKICAgICdpc28taXItMTI3JzogICAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2lzbzg4NTktNic6ICAgICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnaXNvODg1OTYnOiAgICAgICAgICAgICdpc28tODg1OS02JywKICAgICdpc29fODg1OS02JzogICAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2lzb184ODU5LTY6MTk4Nyc6ICAgICAnaXNvLTg4NTktNicsCiAgICAnY3Npc29sYXRpbmdyZWVrJzogICAgICdpc28tODg1OS03JywKICAgICdlY21hLTExOCc6ICAgICAgICAgICAgJ2lzby04ODU5LTcnLAogICAgJ2Vsb3RfOTI4JzogICAgICAgICAgICAnaXNvLTg4NTktNycsCiAgICAnZ3JlZWsnOiAgICAgICAgICAgICAgICdpc28tODg1OS03JywKICAgICdncmVlazgnOiAgICAgICAgICAgICAgJ2lzby04ODU5LTcnLAogICAgJ2lzby04ODU5LTcnOiAgICAgICAgICAnaXNvLTg4NTktNycsCiAgICAnaXNvLWlyLTEyNic6ICAgICAgICAgICdpc28tODg1OS03JywKICAgICdpc284ODU5LTcnOiAgICAgICAgICAgJ2lzby04ODU5LTcnLAogICAgJ2lzbzg4NTk3JzogICAgICAgICAgICAnaXNvLTg4NTktNycsCiAgICAnaXNvXzg4NTktNyc6ICAgICAgICAgICdpc28tODg1OS03JywKICAgICdpc29fODg1OS03OjE5ODcnOiAgICAgJ2lzby04ODU5LTcnLAogICAgJ3N1bl9ldV9ncmVlayc6ICAgICAgICAnaXNvLTg4NTktNycsCiAgICAnY3Npc284ODU5OGUnOiAgICAgICAgICdpc28tODg1OS04JywKICAgICdjc2lzb2xhdGluaGVicmV3JzogICAgJ2lzby04ODU5LTgnLAogICAgJ2hlYnJldyc6ICAgICAgICAgICAgICAnaXNvLTg4NTktOCcsCiAgICAnaXNvLTg4NTktOCc6ICAgICAgICAgICdpc28tODg1OS04JywKICAgICdpc28tODg1OS04LWUnOiAgICAgICAgJ2lzby04ODU5LTgnLAogICAgJ2lzby1pci0xMzgnOiAgICAgICAgICAnaXNvLTg4NTktOCcsCiAgICAnaXNvODg1OS04JzogICAgICAgICAgICdpc28tODg1OS04JywKICAgICdpc284ODU5OCc6ICAgICAgICAgICAgJ2lzby04ODU5LTgnLAogICAgJ2lzb184ODU5LTgnOiAgICAgICAgICAnaXNvLTg4NTktOCcsCiAgICAnaXNvXzg4NTktODoxOTg4JzogICAgICdpc28tODg1OS04JywKICAgICd2aXN1YWwnOiAgICAgICAgICAgICAgJ2lzby04ODU5LTgnLAogICAgJ2NzaXNvODg1OThpJzogICAgICAgICAnaXNvLTg4NTktOC1pJywKICAgICdpc28tODg1OS04LWknOiAgICAgICAgJ2lzby04ODU5LTgtaScsCiAgICAnbG9naWNhbCc6ICAgICAgICAgICAgICdpc28tODg1OS04LWknLAogICAgJ2NzaXNvbGF0aW42JzogICAgICAgICAnaXNvLTg4NTktMTAnLAogICAgJ2lzby04ODU5LTEwJzogICAgICAgICAnaXNvLTg4NTktMTAnLAogICAgJ2lzby1pci0xNTcnOiAgICAgICAgICAnaXNvLTg4NTktMTAnLAogICAgJ2lzbzg4NTktMTAnOiAgICAgICAgICAnaXNvLTg4NTktMTAnLAogICAgJ2lzbzg4NTkxMCc6ICAgICAgICAgICAnaXNvLTg4NTktMTAnLAogICAgJ2w2JzogICAgICAgICAgICAgICAgICAnaXNvLTg4NTktMTAnLAogICAgJ2xhdGluNic6ICAgICAgICAgICAgICAnaXNvLTg4NTktMTAnLAogICAgJ2lzby04ODU5LTEzJzogICAgICAgICAnaXNvLTg4NTktMTMnLAogICAgJ2lzbzg4NTktMTMnOiAgICAgICAgICAnaXNvLTg4NTktMTMnLAogICAgJ2lzbzg4NTkxMyc6ICAgICAgICAgICAnaXNvLTg4NTktMTMnLAogICAgJ2lzby04ODU5LTE0JzogICAgICAgICAnaXNvLTg4NTktMTQnLAogICAgJ2lzbzg4NTktMTQnOiAgICAgICAgICAnaXNvLTg4NTktMTQnLAogICAgJ2lzbzg4NTkxNCc6ICAgICAgICAgICAnaXNvLTg4NTktMTQnLAogICAgJ2NzaXNvbGF0aW45JzogICAgICAgICAnaXNvLTg4NTktMTUnLAogICAgJ2lzby04ODU5LTE1JzogICAgICAgICAnaXNvLTg4NTktMTUnLAogICAgJ2lzbzg4NTktMTUnOiAgICAgICAgICAnaXNvLTg4NTktMTUnLAogICAgJ2lzbzg4NTkxNSc6ICAgICAgICAgICAnaXNvLTg4NTktMTUnLAogICAgJ2lzb184ODU5LTE1JzogICAgICAgICAnaXNvLTg4NTktMTUnLAogICAgJ2w5JzogICAgICAgICAgICAgICAgICAnaXNvLTg4NTktMTUnLAogICAgJ2lzby04ODU5LTE2JzogICAgICAgICAnaXNvLTg4NTktMTYnLAogICAgJ2Nza29pOHInOiAgICAgICAgICAgICAna29pOC1yJywKICAgICdrb2knOiAgICAgICAgICAgICAgICAgJ2tvaTgtcicsCiAgICAna29pOCc6ICAgICAgICAgICAgICAgICdrb2k4LXInLAogICAgJ2tvaTgtcic6ICAgICAgICAgICAgICAna29pOC1yJywKICAgICdrb2k4X3InOiAgICAgICAgICAgICAgJ2tvaTgtcicsCiAgICAna29pOC11JzogICAgICAgICAgICAgICdrb2k4LXUnLAogICAgJ2NzbWFjaW50b3NoJzogICAgICAgICAnbWFjaW50b3NoJywKICAgICdtYWMnOiAgICAgICAgICAgICAgICAgJ21hY2ludG9zaCcsCiAgICAnbWFjaW50b3NoJzogICAgICAgICAgICdtYWNpbnRvc2gnLAogICAgJ3gtbWFjLXJvbWFuJzogICAgICAgICAnbWFjaW50b3NoJywKICAgICdkb3MtODc0JzogICAgICAgICAgICAgJ3dpbmRvd3MtODc0JywKICAgICdpc28tODg1OS0xMSc6ICAgICAgICAgJ3dpbmRvd3MtODc0JywKICAgICdpc284ODU5LTExJzogICAgICAgICAgJ3dpbmRvd3MtODc0JywKICAgICdpc284ODU5MTEnOiAgICAgICAgICAgJ3dpbmRvd3MtODc0JywKICAgICd0aXMtNjIwJzogICAgICAgICAgICAgJ3dpbmRvd3MtODc0JywKICAgICd3aW5kb3dzLTg3NCc6ICAgICAgICAgJ3dpbmRvd3MtODc0JywKICAgICdjcDEyNTAnOiAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MCcsCiAgICAnd2luZG93cy0xMjUwJzogICAgICAgICd3aW5kb3dzLTEyNTAnLAogICAgJ3gtY3AxMjUwJzogICAgICAgICAgICAnd2luZG93cy0xMjUwJywKICAgICdjcDEyNTEnOiAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MScsCiAgICAnd2luZG93cy0xMjUxJzogICAgICAgICd3aW5kb3dzLTEyNTEnLAogICAgJ3gtY3AxMjUxJzogICAgICAgICAgICAnd2luZG93cy0xMjUxJywKICAgICdhbnNpX3gzLjQtMTk2OCc6ICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnYXNjaWknOiAgICAgICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2NwMTI1Mic6ICAgICAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICdjcDgxOSc6ICAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnY3Npc29sYXRpbjEnOiAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2libTgxOSc6ICAgICAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICdpc28tODg1OS0xJzogICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnaXNvLWlyLTEwMCc6ICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2lzbzg4NTktMSc6ICAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICdpc284ODU5MSc6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnaXNvXzg4NTktMSc6ICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2lzb184ODU5LTE6MTk4Nyc6ICAgICAnd2luZG93cy0xMjUyJywKICAgICdsMSc6ICAgICAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnbGF0aW4xJzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ3VzLWFzY2lpJzogICAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICd3aW5kb3dzLTEyNTInOiAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAneC1jcDEyNTInOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2NwMTI1Myc6ICAgICAgICAgICAgICAnd2luZG93cy0xMjUzJywKICAgICd3aW5kb3dzLTEyNTMnOiAgICAgICAgJ3dpbmRvd3MtMTI1MycsCiAgICAneC1jcDEyNTMnOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTMnLAogICAgJ2NwMTI1NCc6ICAgICAgICAgICAgICAnd2luZG93cy0xMjU0JywKICAgICdjc2lzb2xhdGluNSc6ICAgICAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAnaXNvLTg4NTktOSc6ICAgICAgICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ2lzby1pci0xNDgnOiAgICAgICAgICAnd2luZG93cy0xMjU0JywKICAgICdpc284ODU5LTknOiAgICAgICAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAnaXNvODg1OTknOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ2lzb184ODU5LTknOiAgICAgICAgICAnd2luZG93cy0xMjU0JywKICAgICdpc29fODg1OS05OjE5ODknOiAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAnbDUnOiAgICAgICAgICAgICAgICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ2xhdGluNSc6ICAgICAgICAgICAgICAnd2luZG93cy0xMjU0JywKICAgICd3aW5kb3dzLTEyNTQnOiAgICAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAneC1jcDEyNTQnOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ2NwMTI1NSc6ICAgICAgICAgICAgICAnd2luZG93cy0xMjU1JywKICAgICd3aW5kb3dzLTEyNTUnOiAgICAgICAgJ3dpbmRvd3MtMTI1NScsCiAgICAneC1jcDEyNTUnOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTUnLAogICAgJ2NwMTI1Nic6ICAgICAgICAgICAgICAnd2luZG93cy0xMjU2JywKICAgICd3aW5kb3dzLTEyNTYnOiAgICAgICAgJ3dpbmRvd3MtMTI1NicsCiAgICAneC1jcDEyNTYnOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTYnLAogICAgJ2NwMTI1Nyc6ICAgICAgICAgICAgICAnd2luZG93cy0xMjU3JywKICAgICd3aW5kb3dzLTEyNTcnOiAgICAgICAgJ3dpbmRvd3MtMTI1NycsCiAgICAneC1jcDEyNTcnOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTcnLAogICAgJ2NwMTI1OCc6ICAgICAgICAgICAgICAnd2luZG93cy0xMjU4JywKICAgICd3aW5kb3dzLTEyNTgnOiAgICAgICAgJ3dpbmRvd3MtMTI1OCcsCiAgICAneC1jcDEyNTgnOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTgnLAogICAgJ3gtbWFjLWN5cmlsbGljJzogICAgICAneC1tYWMtY3lyaWxsaWMnLAogICAgJ3gtbWFjLXVrcmFpbmlhbic6ICAgICAneC1tYWMtY3lyaWxsaWMnLAogICAgJ2NoaW5lc2UnOiAgICAgICAgICAgICAnZ2JrJywKICAgICdjc2diMjMxMic6ICAgICAgICAgICAgJ2diaycsCiAgICAnY3Npc281OGdiMjMxMjgwJzogICAgICdnYmsnLAogICAgJ2diMjMxMic6ICAgICAgICAgICAgICAnZ2JrJywKICAgICdnYl8yMzEyJzogICAgICAgICAgICAgJ2diaycsCiAgICAnZ2JfMjMxMi04MCc6ICAgICAgICAgICdnYmsnLAogICAgJ2diayc6ICAgICAgICAgICAgICAgICAnZ2JrJywKICAgICdpc28taXItNTgnOiAgICAgICAgICAgJ2diaycsCiAgICAneC1nYmsnOiAgICAgICAgICAgICAgICdnYmsnLAogICAgJ2diMTgwMzAnOiAgICAgICAgICAgICAnZ2IxODAzMCcsCiAgICAnaHotZ2ItMjMxMic6ICAgICAgICAgICdoei1nYi0yMzEyJywKICAgICdiaWc1JzogICAgICAgICAgICAgICAgJ2JpZzUnLAogICAgJ2JpZzUtaGtzY3MnOiAgICAgICAgICAnYmlnNScsCiAgICAnY24tYmlnNSc6ICAgICAgICAgICAgICdiaWc1JywKICAgICdjc2JpZzUnOiAgICAgICAgICAgICAgJ2JpZzUnLAogICAgJ3gteC1iaWc1JzogICAgICAgICAgICAnYmlnNScsCiAgICAnY3NldWNwa2RmbXRqYXBhbmVzZSc6ICdldWMtanAnLAogICAgJ2V1Yy1qcCc6ICAgICAgICAgICAgICAnZXVjLWpwJywKICAgICd4LWV1Yy1qcCc6ICAgICAgICAgICAgJ2V1Yy1qcCcsCiAgICAnY3Npc28yMDIyanAnOiAgICAgICAgICdpc28tMjAyMi1qcCcsCiAgICAnaXNvLTIwMjItanAnOiAgICAgICAgICdpc28tMjAyMi1qcCcsCiAgICAnY3NzaGlmdGppcyc6ICAgICAgICAgICdzaGlmdF9qaXMnLAogICAgJ21zX2thbmppJzogICAgICAgICAgICAnc2hpZnRfamlzJywKICAgICdzaGlmdC1qaXMnOiAgICAgICAgICAgJ3NoaWZ0X2ppcycsCiAgICAnc2hpZnRfamlzJzogICAgICAgICAgICdzaGlmdF9qaXMnLAogICAgJ3NqaXMnOiAgICAgICAgICAgICAgICAnc2hpZnRfamlzJywKICAgICd3aW5kb3dzLTMxaic6ICAgICAgICAgJ3NoaWZ0X2ppcycsCiAgICAneC1zamlzJzogICAgICAgICAgICAgICdzaGlmdF9qaXMnLAogICAgJ2NzZXVja3InOiAgICAgICAgICAgICAnZXVjLWtyJywKICAgICdjc2tzYzU2MDExOTg3JzogICAgICAgJ2V1Yy1rcicsCiAgICAnZXVjLWtyJzogICAgICAgICAgICAgICdldWMta3InLAogICAgJ2lzby1pci0xNDknOiAgICAgICAgICAnZXVjLWtyJywKICAgICdrb3JlYW4nOiAgICAgICAgICAgICAgJ2V1Yy1rcicsCiAgICAna3NfY181NjAxLTE5ODcnOiAgICAgICdldWMta3InLAogICAgJ2tzX2NfNTYwMS0xOTg5JzogICAgICAnZXVjLWtyJywKICAgICdrc2M1NjAxJzogICAgICAgICAgICAgJ2V1Yy1rcicsCiAgICAna3NjXzU2MDEnOiAgICAgICAgICAgICdldWMta3InLAogICAgJ3dpbmRvd3MtOTQ5JzogICAgICAgICAnZXVjLWtyJywKICAgICdjc2lzbzIwMjJrcic6ICAgICAgICAgJ2lzby0yMDIyLWtyJywKICAgICdpc28tMjAyMi1rcic6ICAgICAgICAgJ2lzby0yMDIyLWtyJywKICAgICd1dGYtMTZiZSc6ICAgICAgICAgICAgJ3V0Zi0xNmJlJywKICAgICd1dGYtMTYnOiAgICAgICAgICAgICAgJ3V0Zi0xNmxlJywKICAgICd1dGYtMTZsZSc6ICAgICAgICAgICAgJ3V0Zi0xNmxlJywKICAgICd4LXVzZXItZGVmaW5lZCc6ICAgICAgJ3gtdXNlci1kZWZpbmVkJywKfQpQSwMEFAAAAAAAAAAhAFB/MR8ZBQAAGQUAADQAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL21rbGFiZWxzLnB5IiIiCgogICAgd2ViZW5jb2RpbmdzLm1rbGFiZWxzCiAgICB+fn5+fn5+fn5+fn5+fn5+fn5+fn4KCiAgICBSZWdlbmFyYXRlIHRoZSB3ZWJlbmNvZGluZ3MubGFiZWxzIG1vZHVsZS4KCiAgICA6Y29weXJpZ2h0OiBDb3B5cmlnaHQgMjAxMiBieSBTaW1vbiBTYXBpbgogICAgOmxpY2Vuc2U6IEJTRCwgc2VlIExJQ0VOU0UgZm9yIGRldGFpbHMuCgoiIiIKCmltcG9ydCBqc29uCnRyeToKICAgIGZyb20gdXJsbGliIGltcG9ydCB1cmxvcGVuCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IHVybG9wZW4KCgpkZWYgYXNzZXJ0X2xvd2VyKHN0cmluZyk6CiAgICBhc3NlcnQgc3RyaW5nID09IHN0cmluZy5sb3dlcigpCiAgICByZXR1cm4gc3RyaW5nCgoKZGVmIGdlbmVyYXRlKHVybCk6CiAgICBwYXJ0cyA9IFsnJydcCiIiIgoKICAgIHdlYmVuY29kaW5ncy5sYWJlbHMKICAgIH5+fn5+fn5+fn5+fn5+fn5+fn4KCiAgICBNYXAgZW5jb2RpbmcgbGFiZWxzIHRvIHRoZWlyIG5hbWUuCgogICAgOmNvcHlyaWdodDogQ29weXJpZ2h0IDIwMTIgYnkgU2ltb24gU2FwaW4KICAgIDpsaWNlbnNlOiBCU0QsIHNlZSBMSUNFTlNFIGZvciBkZXRhaWxzLgoKIiIiCgojIFhYWCBEbyBub3QgZWRpdCEKIyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgbWtsYWJlbHMucHkKCkxBQkVMUyA9IHsKJycnXQogICAgbGFiZWxzID0gWwogICAgICAgIChyZXByKGFzc2VydF9sb3dlcihsYWJlbCkpLmxzdHJpcCgndScpLAogICAgICAgICByZXByKGVuY29kaW5nWyduYW1lJ10pLmxzdHJpcCgndScpKQogICAgICAgIGZvciBjYXRlZ29yeSBpbiBqc29uLmxvYWRzKHVybG9wZW4odXJsKS5yZWFkKCkuZGVjb2RlKCdhc2NpaScpKQogICAgICAgIGZvciBlbmNvZGluZyBpbiBjYXRlZ29yeVsnZW5jb2RpbmdzJ10KICAgICAgICBmb3IgbGFiZWwgaW4gZW5jb2RpbmdbJ2xhYmVscyddXQogICAgbWF4X2xlbiA9IG1heChsZW4obGFiZWwpIGZvciBsYWJlbCwgbmFtZSBpbiBsYWJlbHMpCiAgICBwYXJ0cy5leHRlbmQoCiAgICAgICAgJyAgICAlczolcyAlcyxcbicgJSAobGFiZWwsICcgJyAqIChtYXhfbGVuIC0gbGVuKGxhYmVsKSksIG5hbWUpCiAgICAgICAgZm9yIGxhYmVsLCBuYW1lIGluIGxhYmVscykKICAgIHBhcnRzLmFwcGVuZCgnfScpCiAgICByZXR1cm4gJycuam9pbihwYXJ0cykKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgcHJpbnQoZ2VuZXJhdGUoJ2h0dHA6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvZW5jb2RpbmdzLmpzb24nKSkKUEsDBBQAAAAAAAAAIQAWmz4dohkAAKIZAAAxAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy90ZXN0cy5weSMgY29kaW5nOiB1dGY4CiIiIgoKICAgIHdlYmVuY29kaW5ncy50ZXN0cwogICAgfn5+fn5+fn5+fn5+fn5+fn5+CgogICAgQSBiYXNpYyB0ZXN0IHN1aXRlIGZvciBFbmNvZGluZy4KCiAgICA6Y29weXJpZ2h0OiBDb3B5cmlnaHQgMjAxMiBieSBTaW1vbiBTYXBpbgogICAgOmxpY2Vuc2U6IEJTRCwgc2VlIExJQ0VOU0UgZm9yIGRldGFpbHMuCgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscwoKZnJvbSAuIGltcG9ydCAobG9va3VwLCBMQUJFTFMsIGRlY29kZSwgZW5jb2RlLCBpdGVyX2RlY29kZSwgaXRlcl9lbmNvZGUsCiAgICAgICAgICAgICAgIEluY3JlbWVudGFsRGVjb2RlciwgSW5jcmVtZW50YWxFbmNvZGVyLCBVVEY4KQoKCmRlZiBhc3NlcnRfcmFpc2VzKGV4Y2VwdGlvbiwgZnVuY3Rpb24sICphcmdzLCAqKmt3YXJncyk6CiAgICB0cnk6CiAgICAgICAgZnVuY3Rpb24oKmFyZ3MsICoqa3dhcmdzKQogICAgZXhjZXB0IGV4Y2VwdGlvbjoKICAgICAgICByZXR1cm4KICAgIGVsc2U6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignRGlkIG5vdCByYWlzZSAlcy4nICUgZXhjZXB0aW9uKQoKCmRlZiB0ZXN0X2xhYmVscygpOgogICAgYXNzZXJ0IGxvb2t1cCgndXRmLTgnKS5uYW1lID09ICd1dGYtOCcKICAgIGFzc2VydCBsb29rdXAoJ1V0Zi04JykubmFtZSA9PSAndXRmLTgnCiAgICBhc3NlcnQgbG9va3VwKCdVVEYtOCcpLm5hbWUgPT0gJ3V0Zi04JwogICAgYXNzZXJ0IGxvb2t1cCgndXRmOCcpLm5hbWUgPT0gJ3V0Zi04JwogICAgYXNzZXJ0IGxvb2t1cCgndXRmOCcpLm5hbWUgPT0gJ3V0Zi04JwogICAgYXNzZXJ0IGxvb2t1cCgndXRmOCAnKS5uYW1lID09ICd1dGYtOCcKICAgIGFzc2VydCBsb29rdXAoJyBcclxudXRmOFx0JykubmFtZSA9PSAndXRmLTgnCiAgICBhc3NlcnQgbG9va3VwKCd1OCcpIGlzIE5vbmUgICMgUHl0aG9uIGxhYmVsLgogICAgYXNzZXJ0IGxvb2t1cCgndXRmLTjCoCcpIGlzIE5vbmUgICMgTm9uLUFTQ0lJIHdoaXRlIHNwYWNlLgoKICAgIGFzc2VydCBsb29rdXAoJ1VTLUFTQ0lJJykubmFtZSA9PSAnd2luZG93cy0xMjUyJwogICAgYXNzZXJ0IGxvb2t1cCgnaXNvLTg4NTktMScpLm5hbWUgPT0gJ3dpbmRvd3MtMTI1MicKICAgIGFzc2VydCBsb29rdXAoJ2xhdGluMScpLm5hbWUgPT0gJ3dpbmRvd3MtMTI1MicKICAgIGFzc2VydCBsb29rdXAoJ0xBVElOMScpLm5hbWUgPT0gJ3dpbmRvd3MtMTI1MicKICAgIGFzc2VydCBsb29rdXAoJ2xhdGluLTEnKSBpcyBOb25lCiAgICBhc3NlcnQgbG9va3VwKCdMQVTEsE4xJykgaXMgTm9uZSAgIyBBU0NJSS1vbmx5IGNhc2UgaW5zZW5zaXRpdml0eS4KCgpkZWYgdGVzdF9hbGxfbGFiZWxzKCk6CiAgICBmb3IgbGFiZWwgaW4gTEFCRUxTOgogICAgICAgIGFzc2VydCBkZWNvZGUoYicnLCBsYWJlbCkgPT0gKCcnLCBsb29rdXAobGFiZWwpKQogICAgICAgIGFzc2VydCBlbmNvZGUoJycsIGxhYmVsKSA9PSBiJycKICAgICAgICBmb3IgcmVwZWF0IGluIFswLCAxLCAxMl06CiAgICAgICAgICAgIG91dHB1dCwgXyA9IGl0ZXJfZGVjb2RlKFtiJyddICogcmVwZWF0LCBsYWJlbCkKICAgICAgICAgICAgYXNzZXJ0IGxpc3Qob3V0cHV0KSA9PSBbXQogICAgICAgICAgICBhc3NlcnQgbGlzdChpdGVyX2VuY29kZShbJyddICogcmVwZWF0LCBsYWJlbCkpID09IFtdCiAgICAgICAgZGVjb2RlciA9IEluY3JlbWVudGFsRGVjb2RlcihsYWJlbCkKICAgICAgICBhc3NlcnQgZGVjb2Rlci5kZWNvZGUoYicnKSA9PSAnJwogICAgICAgIGFzc2VydCBkZWNvZGVyLmRlY29kZShiJycsIGZpbmFsPVRydWUpID09ICcnCiAgICAgICAgZW5jb2RlciA9IEluY3JlbWVudGFsRW5jb2RlcihsYWJlbCkKICAgICAgICBhc3NlcnQgZW5jb2Rlci5lbmNvZGUoJycpID09IGInJwogICAgICAgIGFzc2VydCBlbmNvZGVyLmVuY29kZSgnJywgZmluYWw9VHJ1ZSkgPT0gYicnCiAgICAjIEFsbCBlbmNvZGluZyBuYW1lcyBhcmUgdmFsaWQgbGFiZWxzIHRvbzoKICAgIGZvciBuYW1lIGluIHNldChMQUJFTFMudmFsdWVzKCkpOgogICAgICAgIGFzc2VydCBsb29rdXAobmFtZSkubmFtZSA9PSBuYW1lCgoKZGVmIHRlc3RfaW52YWxpZF9sYWJlbCgpOgogICAgYXNzZXJ0X3JhaXNlcyhMb29rdXBFcnJvciwgZGVjb2RlLCBiJ1x4RUZceEJCXHhCRlx4YzNceGE5JywgJ2ludmFsaWQnKQogICAgYXNzZXJ0X3JhaXNlcyhMb29rdXBFcnJvciwgZW5jb2RlLCAnw6knLCAnaW52YWxpZCcpCiAgICBhc3NlcnRfcmFpc2VzKExvb2t1cEVycm9yLCBpdGVyX2RlY29kZSwgW10sICdpbnZhbGlkJykKICAgIGFzc2VydF9yYWlzZXMoTG9va3VwRXJyb3IsIGl0ZXJfZW5jb2RlLCBbXSwgJ2ludmFsaWQnKQogICAgYXNzZXJ0X3JhaXNlcyhMb29rdXBFcnJvciwgSW5jcmVtZW50YWxEZWNvZGVyLCAnaW52YWxpZCcpCiAgICBhc3NlcnRfcmFpc2VzKExvb2t1cEVycm9yLCBJbmNyZW1lbnRhbEVuY29kZXIsICdpbnZhbGlkJykKCgpkZWYgdGVzdF9kZWNvZGUoKToKICAgIGFzc2VydCBkZWNvZGUoYidceDgwJywgJ2xhdGluMScpID09ICgn4oKsJywgbG9va3VwKCdsYXRpbjEnKSkKICAgIGFzc2VydCBkZWNvZGUoYidceDgwJywgbG9va3VwKCdsYXRpbjEnKSkgPT0gKCfigqwnLCBsb29rdXAoJ2xhdGluMScpKQogICAgYXNzZXJ0IGRlY29kZShiJ1x4YzNceGE5JywgJ3V0ZjgnKSA9PSAoJ8OpJywgbG9va3VwKCd1dGY4JykpCiAgICBhc3NlcnQgZGVjb2RlKGInXHhjM1x4YTknLCBVVEY4KSA9PSAoJ8OpJywgbG9va3VwKCd1dGY4JykpCiAgICBhc3NlcnQgZGVjb2RlKGInXHhjM1x4YTknLCAnYXNjaWknKSA9PSAoJ8ODwqknLCBsb29rdXAoJ2FzY2lpJykpCiAgICBhc3NlcnQgZGVjb2RlKGInXHhFRlx4QkJceEJGXHhjM1x4YTknLCAnYXNjaWknKSA9PSAoJ8OpJywgbG9va3VwKCd1dGY4JykpICAjIFVURi04IHdpdGggQk9NCgogICAgYXNzZXJ0IGRlY29kZShiJ1x4RkVceEZGXHgwMFx4ZTknLCAnYXNjaWknKSA9PSAoJ8OpJywgbG9va3VwKCd1dGYtMTZiZScpKSAgIyBVVEYtMTYtQkUgd2l0aCBCT00KICAgIGFzc2VydCBkZWNvZGUoYidceEZGXHhGRVx4ZTlceDAwJywgJ2FzY2lpJykgPT0gKCfDqScsIGxvb2t1cCgndXRmLTE2bGUnKSkgICMgVVRGLTE2LUxFIHdpdGggQk9NCiAgICBhc3NlcnQgZGVjb2RlKGInXHhGRVx4RkZceGU5XHgwMCcsICdhc2NpaScpID09ICgnXHVlOTAwJywgbG9va3VwKCd1dGYtMTZiZScpKQogICAgYXNzZXJ0IGRlY29kZShiJ1x4RkZceEZFXHgwMFx4ZTknLCAnYXNjaWknKSA9PSAoJ1x1ZTkwMCcsIGxvb2t1cCgndXRmLTE2bGUnKSkKCiAgICBhc3NlcnQgZGVjb2RlKGInXHgwMFx4ZTknLCAnVVRGLTE2QkUnKSA9PSAoJ8OpJywgbG9va3VwKCd1dGYtMTZiZScpKQogICAgYXNzZXJ0IGRlY29kZShiJ1x4ZTlceDAwJywgJ1VURi0xNkxFJykgPT0gKCfDqScsIGxvb2t1cCgndXRmLTE2bGUnKSkKICAgIGFzc2VydCBkZWNvZGUoYidceGU5XHgwMCcsICdVVEYtMTYnKSA9PSAoJ8OpJywgbG9va3VwKCd1dGYtMTZsZScpKQoKICAgIGFzc2VydCBkZWNvZGUoYidceGU5XHgwMCcsICdVVEYtMTZCRScpID09ICgnXHVlOTAwJywgbG9va3VwKCd1dGYtMTZiZScpKQogICAgYXNzZXJ0IGRlY29kZShiJ1x4MDBceGU5JywgJ1VURi0xNkxFJykgPT0gKCdcdWU5MDAnLCBsb29rdXAoJ3V0Zi0xNmxlJykpCiAgICBhc3NlcnQgZGVjb2RlKGInXHgwMFx4ZTknLCAnVVRGLTE2JykgPT0gKCdcdWU5MDAnLCBsb29rdXAoJ3V0Zi0xNmxlJykpCgoKZGVmIHRlc3RfZW5jb2RlKCk6CiAgICBhc3NlcnQgZW5jb2RlKCfDqScsICdsYXRpbjEnKSA9PSBiJ1x4ZTknCiAgICBhc3NlcnQgZW5jb2RlKCfDqScsICd1dGY4JykgPT0gYidceGMzXHhhOScKICAgIGFzc2VydCBlbmNvZGUoJ8OpJywgJ3V0ZjgnKSA9PSBiJ1x4YzNceGE5JwogICAgYXNzZXJ0IGVuY29kZSgnw6knLCAndXRmLTE2JykgPT0gYidceGU5XHgwMCcKICAgIGFzc2VydCBlbmNvZGUoJ8OpJywgJ3V0Zi0xNmxlJykgPT0gYidceGU5XHgwMCcKICAgIGFzc2VydCBlbmNvZGUoJ8OpJywgJ3V0Zi0xNmJlJykgPT0gYidceDAwXHhlOScKCgpkZWYgdGVzdF9pdGVyX2RlY29kZSgpOgogICAgZGVmIGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhpbnB1dCwgZmFsbGJhY2tfZW5jb2RpbmcpOgogICAgICAgIG91dHB1dCwgX2VuY29kaW5nID0gaXRlcl9kZWNvZGUoaW5wdXQsIGZhbGxiYWNrX2VuY29kaW5nKQogICAgICAgIHJldHVybiAnJy5qb2luKG91dHB1dCkKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoW10sICdsYXRpbjEnKSA9PSAnJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbYicnXSwgJ2xhdGluMScpID09ICcnCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtiJ1x4ZTknXSwgJ2xhdGluMScpID09ICfDqScKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoW2InaGVsbG8nXSwgJ2xhdGluMScpID09ICdoZWxsbycKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoW2InaGUnLCBiJ2xsbyddLCAnbGF0aW4xJykgPT0gJ2hlbGxvJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbYidoZWxsJywgYidvJ10sICdsYXRpbjEnKSA9PSAnaGVsbG8nCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtiJ1x4YzNceGE5J10sICdsYXRpbjEnKSA9PSAnw4PCqScKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoW2InXHhFRlx4QkJceEJGXHhjM1x4YTknXSwgJ2xhdGluMScpID09ICfDqScKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoWwogICAgICAgIGInXHhFRlx4QkJceEJGJywgYidceGMzJywgYidceGE5J10sICdsYXRpbjEnKSA9PSAnw6knCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFsKICAgICAgICBiJ1x4RUZceEJCXHhCRicsIGInYScsIGInXHhjMyddLCAnbGF0aW4xJykgPT0gJ2FcdUZGRkQnCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFsKICAgICAgICBiJycsIGInXHhFRicsIGInJywgYicnLCBiJ1x4QkJceEJGXHhjMycsIGInXHhhOSddLCAnbGF0aW4xJykgPT0gJ8OpJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbYidceEVGXHhCQlx4QkYnXSwgJ2xhdGluMScpID09ICcnCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtiJ1x4RUZceEJCJ10sICdsYXRpbjEnKSA9PSAnw6/CuycKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoW2InXHhGRVx4RkZceDAwXHhlOSddLCAnbGF0aW4xJykgPT0gJ8OpJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbYidceEZGXHhGRVx4ZTlceDAwJ10sICdsYXRpbjEnKSA9PSAnw6knCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFsKICAgICAgICBiJycsIGInXHhGRicsIGInJywgYicnLCBiJ1x4RkVceGU5JywgYidceDAwJ10sICdsYXRpbjEnKSA9PSAnw6knCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFsKICAgICAgICBiJycsIGInaFx4ZTknLCBiJ2xsbyddLCAneC11c2VyLWRlZmluZWQnKSA9PSAnaFx1RjdFOWxsbycKCgpkZWYgdGVzdF9pdGVyX2VuY29kZSgpOgogICAgYXNzZXJ0IGInJy5qb2luKGl0ZXJfZW5jb2RlKFtdLCAnbGF0aW4xJykpID09IGInJwogICAgYXNzZXJ0IGInJy5qb2luKGl0ZXJfZW5jb2RlKFsnJ10sICdsYXRpbjEnKSkgPT0gYicnCiAgICBhc3NlcnQgYicnLmpvaW4oaXRlcl9lbmNvZGUoWyfDqSddLCAnbGF0aW4xJykpID09IGInXHhlOScKICAgIGFzc2VydCBiJycuam9pbihpdGVyX2VuY29kZShbJycsICfDqScsICcnLCAnJ10sICdsYXRpbjEnKSkgPT0gYidceGU5JwogICAgYXNzZXJ0IGInJy5qb2luKGl0ZXJfZW5jb2RlKFsnJywgJ8OpJywgJycsICcnXSwgJ3V0Zi0xNicpKSA9PSBiJ1x4ZTlceDAwJwogICAgYXNzZXJ0IGInJy5qb2luKGl0ZXJfZW5jb2RlKFsnJywgJ8OpJywgJycsICcnXSwgJ3V0Zi0xNmxlJykpID09IGInXHhlOVx4MDAnCiAgICBhc3NlcnQgYicnLmpvaW4oaXRlcl9lbmNvZGUoWycnLCAnw6knLCAnJywgJyddLCAndXRmLTE2YmUnKSkgPT0gYidceDAwXHhlOScKICAgIGFzc2VydCBiJycuam9pbihpdGVyX2VuY29kZShbCiAgICAgICAgJycsICdoXHVGN0U5JywgJycsICdsbG8nXSwgJ3gtdXNlci1kZWZpbmVkJykpID09IGInaFx4ZTlsbG8nCgoKZGVmIHRlc3RfeF91c2VyX2RlZmluZWQoKToKICAgIGVuY29kZWQgPSBiJzIsXHgwY1x4MGJceDFhT1x4ZDkjXHhjYlx4MGZceGM5XHhiYnRceGNmXHhhOFx4Y2EnCiAgICBkZWNvZGVkID0gJzIsXHgwY1x4MGJceDFhT1x1ZjdkOSNcdWY3Y2JceDBmXHVmN2M5XHVmN2JidFx1ZjdjZlx1ZjdhOFx1ZjdjYScKICAgIGVuY29kZWQgPSBiJ2FhJwogICAgZGVjb2RlZCA9ICdhYScKICAgIGFzc2VydCBkZWNvZGUoZW5jb2RlZCwgJ3gtdXNlci1kZWZpbmVkJykgPT0gKGRlY29kZWQsIGxvb2t1cCgneC11c2VyLWRlZmluZWQnKSkKICAgIGFzc2VydCBlbmNvZGUoZGVjb2RlZCwgJ3gtdXNlci1kZWZpbmVkJykgPT0gZW5jb2RlZApQSwMEFAAAAAAAAAAhAEhvRb7SEAAA0hAAADoAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL3hfdXNlcl9kZWZpbmVkLnB5IyBjb2Rpbmc6IHV0ZjgKIiIiCgogICAgd2ViZW5jb2RpbmdzLnhfdXNlcl9kZWZpbmVkCiAgICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KCiAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgeC11c2VyLWRlZmluZWQgZW5jb2RpbmcuCgogICAgOmNvcHlyaWdodDogQ29weXJpZ2h0IDIwMTIgYnkgU2ltb24gU2FwaW4KICAgIDpsaWNlbnNlOiBCU0QsIHNlZSBMSUNFTlNFIGZvciBkZXRhaWxzLgoKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCBjb2RlY3MKCgojIyMgQ29kZWMgQVBJcwoKY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKCiAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgogICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsIGVycm9ycywgZW5jb2RpbmdfdGFibGUpCgogICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LCBlcnJvcnMsIGRlY29kaW5nX3RhYmxlKQoKCmNsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycywgZW5jb2RpbmdfdGFibGUpWzBdCgoKY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgogICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgogICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzLCBkZWNvZGluZ190YWJsZSlbMF0KCgpjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgogICAgcGFzcwoKCmNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6CiAgICBwYXNzCgoKIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCgpjb2RlY19pbmZvID0gY29kZWNzLkNvZGVjSW5mbygKICAgIG5hbWU9J3gtdXNlci1kZWZpbmVkJywKICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCiAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAogICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCikKCgojIyMgRGVjb2RpbmcgVGFibGUKCiMgUHl0aG9uIDM6CiMgZm9yIGMgaW4gcmFuZ2UoMjU2KTogcHJpbnQoJyAgICAlcicgJSBjaHIoYyBpZiBjIDwgMTI4IGVsc2UgYyArIDB4RjcwMCkpCmRlY29kaW5nX3RhYmxlID0gKAogICAgJ1x4MDAnCiAgICAnXHgwMScKICAgICdceDAyJwogICAgJ1x4MDMnCiAgICAnXHgwNCcKICAgICdceDA1JwogICAgJ1x4MDYnCiAgICAnXHgwNycKICAgICdceDA4JwogICAgJ1x0JwogICAgJ1xuJwogICAgJ1x4MGInCiAgICAnXHgwYycKICAgICdccicKICAgICdceDBlJwogICAgJ1x4MGYnCiAgICAnXHgxMCcKICAgICdceDExJwogICAgJ1x4MTInCiAgICAnXHgxMycKICAgICdceDE0JwogICAgJ1x4MTUnCiAgICAnXHgxNicKICAgICdceDE3JwogICAgJ1x4MTgnCiAgICAnXHgxOScKICAgICdceDFhJwogICAgJ1x4MWInCiAgICAnXHgxYycKICAgICdceDFkJwogICAgJ1x4MWUnCiAgICAnXHgxZicKICAgICcgJwogICAgJyEnCiAgICAnIicKICAgICcjJwogICAgJyQnCiAgICAnJScKICAgICcmJwogICAgIiciCiAgICAnKCcKICAgICcpJwogICAgJyonCiAgICAnKycKICAgICcsJwogICAgJy0nCiAgICAnLicKICAgICcvJwogICAgJzAnCiAgICAnMScKICAgICcyJwogICAgJzMnCiAgICAnNCcKICAgICc1JwogICAgJzYnCiAgICAnNycKICAgICc4JwogICAgJzknCiAgICAnOicKICAgICc7JwogICAgJzwnCiAgICAnPScKICAgICc+JwogICAgJz8nCiAgICAnQCcKICAgICdBJwogICAgJ0InCiAgICAnQycKICAgICdEJwogICAgJ0UnCiAgICAnRicKICAgICdHJwogICAgJ0gnCiAgICAnSScKICAgICdKJwogICAgJ0snCiAgICAnTCcKICAgICdNJwogICAgJ04nCiAgICAnTycKICAgICdQJwogICAgJ1EnCiAgICAnUicKICAgICdTJwogICAgJ1QnCiAgICAnVScKICAgICdWJwogICAgJ1cnCiAgICAnWCcKICAgICdZJwogICAgJ1onCiAgICAnWycKICAgICdcXCcKICAgICddJwogICAgJ14nCiAgICAnXycKICAgICdgJwogICAgJ2EnCiAgICAnYicKICAgICdjJwogICAgJ2QnCiAgICAnZScKICAgICdmJwogICAgJ2cnCiAgICAnaCcKICAgICdpJwogICAgJ2onCiAgICAnaycKICAgICdsJwogICAgJ20nCiAgICAnbicKICAgICdvJwogICAgJ3AnCiAgICAncScKICAgICdyJwogICAgJ3MnCiAgICAndCcKICAgICd1JwogICAgJ3YnCiAgICAndycKICAgICd4JwogICAgJ3knCiAgICAneicKICAgICd7JwogICAgJ3wnCiAgICAnfScKICAgICd+JwogICAgJ1x4N2YnCiAgICAnXHVmNzgwJwogICAgJ1x1Zjc4MScKICAgICdcdWY3ODInCiAgICAnXHVmNzgzJwogICAgJ1x1Zjc4NCcKICAgICdcdWY3ODUnCiAgICAnXHVmNzg2JwogICAgJ1x1Zjc4NycKICAgICdcdWY3ODgnCiAgICAnXHVmNzg5JwogICAgJ1x1Zjc4YScKICAgICdcdWY3OGInCiAgICAnXHVmNzhjJwogICAgJ1x1Zjc4ZCcKICAgICdcdWY3OGUnCiAgICAnXHVmNzhmJwogICAgJ1x1Zjc5MCcKICAgICdcdWY3OTEnCiAgICAnXHVmNzkyJwogICAgJ1x1Zjc5MycKICAgICdcdWY3OTQnCiAgICAnXHVmNzk1JwogICAgJ1x1Zjc5NicKICAgICdcdWY3OTcnCiAgICAnXHVmNzk4JwogICAgJ1x1Zjc5OScKICAgICdcdWY3OWEnCiAgICAnXHVmNzliJwogICAgJ1x1Zjc5YycKICAgICdcdWY3OWQnCiAgICAnXHVmNzllJwogICAgJ1x1Zjc5ZicKICAgICdcdWY3YTAnCiAgICAnXHVmN2ExJwogICAgJ1x1ZjdhMicKICAgICdcdWY3YTMnCiAgICAnXHVmN2E0JwogICAgJ1x1ZjdhNScKICAgICdcdWY3YTYnCiAgICAnXHVmN2E3JwogICAgJ1x1ZjdhOCcKICAgICdcdWY3YTknCiAgICAnXHVmN2FhJwogICAgJ1x1ZjdhYicKICAgICdcdWY3YWMnCiAgICAnXHVmN2FkJwogICAgJ1x1ZjdhZScKICAgICdcdWY3YWYnCiAgICAnXHVmN2IwJwogICAgJ1x1ZjdiMScKICAgICdcdWY3YjInCiAgICAnXHVmN2IzJwogICAgJ1x1ZjdiNCcKICAgICdcdWY3YjUnCiAgICAnXHVmN2I2JwogICAgJ1x1ZjdiNycKICAgICdcdWY3YjgnCiAgICAnXHVmN2I5JwogICAgJ1x1ZjdiYScKICAgICdcdWY3YmInCiAgICAnXHVmN2JjJwogICAgJ1x1ZjdiZCcKICAgICdcdWY3YmUnCiAgICAnXHVmN2JmJwogICAgJ1x1ZjdjMCcKICAgICdcdWY3YzEnCiAgICAnXHVmN2MyJwogICAgJ1x1ZjdjMycKICAgICdcdWY3YzQnCiAgICAnXHVmN2M1JwogICAgJ1x1ZjdjNicKICAgICdcdWY3YzcnCiAgICAnXHVmN2M4JwogICAgJ1x1ZjdjOScKICAgICdcdWY3Y2EnCiAgICAnXHVmN2NiJwogICAgJ1x1ZjdjYycKICAgICdcdWY3Y2QnCiAgICAnXHVmN2NlJwogICAgJ1x1ZjdjZicKICAgICdcdWY3ZDAnCiAgICAnXHVmN2QxJwogICAgJ1x1ZjdkMicKICAgICdcdWY3ZDMnCiAgICAnXHVmN2Q0JwogICAgJ1x1ZjdkNScKICAgICdcdWY3ZDYnCiAgICAnXHVmN2Q3JwogICAgJ1x1ZjdkOCcKICAgICdcdWY3ZDknCiAgICAnXHVmN2RhJwogICAgJ1x1ZjdkYicKICAgICdcdWY3ZGMnCiAgICAnXHVmN2RkJwogICAgJ1x1ZjdkZScKICAgICdcdWY3ZGYnCiAgICAnXHVmN2UwJwogICAgJ1x1ZjdlMScKICAgICdcdWY3ZTInCiAgICAnXHVmN2UzJwogICAgJ1x1ZjdlNCcKICAgICdcdWY3ZTUnCiAgICAnXHVmN2U2JwogICAgJ1x1ZjdlNycKICAgICdcdWY3ZTgnCiAgICAnXHVmN2U5JwogICAgJ1x1ZjdlYScKICAgICdcdWY3ZWInCiAgICAnXHVmN2VjJwogICAgJ1x1ZjdlZCcKICAgICdcdWY3ZWUnCiAgICAnXHVmN2VmJwogICAgJ1x1ZjdmMCcKICAgICdcdWY3ZjEnCiAgICAnXHVmN2YyJwogICAgJ1x1ZjdmMycKICAgICdcdWY3ZjQnCiAgICAnXHVmN2Y1JwogICAgJ1x1ZjdmNicKICAgICdcdWY3ZjcnCiAgICAnXHVmN2Y4JwogICAgJ1x1ZjdmOScKICAgICdcdWY3ZmEnCiAgICAnXHVmN2ZiJwogICAgJ1x1ZjdmYycKICAgICdcdWY3ZmQnCiAgICAnXHVmN2ZlJwogICAgJ1x1ZjdmZicKKQoKIyMjIEVuY29kaW5nIHRhYmxlCmVuY29kaW5nX3RhYmxlID0gY29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpClBLAwQUAAAAAAAAACEAghiL9YYuAACGLgAAIgAAAHB5cGlfX3BpcF85XzBfMy9waXAvYmFzZWNvbW1hbmQucHkiIiJCYXNlIENvbW1hbmQgY2xhc3MsIGFuZCByZWxhdGVkIHJvdXRpbmVzIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgb3B0cGFyc2UKaW1wb3J0IHdhcm5pbmdzCgpmcm9tIHBpcCBpbXBvcnQgY21kb3B0aW9ucwpmcm9tIHBpcC5pbmRleCBpbXBvcnQgUGFja2FnZUZpbmRlcgpmcm9tIHBpcC5sb2NhdGlvbnMgaW1wb3J0IHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudgpmcm9tIHBpcC5kb3dubG9hZCBpbXBvcnQgUGlwU2Vzc2lvbgpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCAoQmFkQ29tbWFuZCwgSW5zdGFsbGF0aW9uRXJyb3IsIFVuaW5zdGFsbGF0aW9uRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kRXJyb3IsIFByZXZpb3VzQnVpbGREaXJFcnJvcikKCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgbG9nZ2luZ19kaWN0Q29uZmlnCmZyb20gcGlwLmJhc2VwYXJzZXIgaW1wb3J0IENvbmZpZ09wdGlvblBhcnNlciwgVXBkYXRpbmdEZWZhdWx0c0hlbHBGb3JtYXR0ZXIKZnJvbSBwaXAucmVxIGltcG9ydCBJbnN0YWxsUmVxdWlyZW1lbnQsIHBhcnNlX3JlcXVpcmVtZW50cwpmcm9tIHBpcC5zdGF0dXNfY29kZXMgaW1wb3J0ICgKICAgIFNVQ0NFU1MsIEVSUk9SLCBVTktOT1dOX0VSUk9SLCBWSVJUVUFMRU5WX05PVF9GT1VORCwKICAgIFBSRVZJT1VTX0JVSUxEX0RJUl9FUlJPUiwKKQpmcm9tIHBpcC51dGlscyBpbXBvcnQgZGVwcmVjYXRpb24sIGdldF9wcm9nLCBub3JtYWxpemVfcGF0aApmcm9tIHBpcC51dGlscy5sb2dnaW5nIGltcG9ydCBJbmRlbnRpbmdGb3JtYXR0ZXIKZnJvbSBwaXAudXRpbHMub3V0ZGF0ZWQgaW1wb3J0IHBpcF92ZXJzaW9uX2NoZWNrCgoKX19hbGxfXyA9IFsnQ29tbWFuZCddCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgQ29tbWFuZChvYmplY3QpOgogICAgbmFtZSA9IE5vbmUKICAgIHVzYWdlID0gTm9uZQogICAgaGlkZGVuID0gRmFsc2UKICAgIGxvZ19zdHJlYW1zID0gKCJleHQ6Ly9zeXMuc3Rkb3V0IiwgImV4dDovL3N5cy5zdGRlcnIiKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpc29sYXRlZD1GYWxzZSk6CiAgICAgICAgcGFyc2VyX2t3ID0gewogICAgICAgICAgICAndXNhZ2UnOiBzZWxmLnVzYWdlLAogICAgICAgICAgICAncHJvZyc6ICclcyAlcycgJSAoZ2V0X3Byb2coKSwgc2VsZi5uYW1lKSwKICAgICAgICAgICAgJ2Zvcm1hdHRlcic6IFVwZGF0aW5nRGVmYXVsdHNIZWxwRm9ybWF0dGVyKCksCiAgICAgICAgICAgICdhZGRfaGVscF9vcHRpb24nOiBGYWxzZSwKICAgICAgICAgICAgJ25hbWUnOiBzZWxmLm5hbWUsCiAgICAgICAgICAgICdkZXNjcmlwdGlvbic6IHNlbGYuX19kb2NfXywKICAgICAgICAgICAgJ2lzb2xhdGVkJzogaXNvbGF0ZWQsCiAgICAgICAgfQoKICAgICAgICBzZWxmLnBhcnNlciA9IENvbmZpZ09wdGlvblBhcnNlcigqKnBhcnNlcl9rdykKCiAgICAgICAgIyBDb21tYW5kcyBzaG91bGQgYWRkIG9wdGlvbnMgdG8gdGhpcyBvcHRpb24gZ3JvdXAKICAgICAgICBvcHRncm91cF9uYW1lID0gJyVzIE9wdGlvbnMnICUgc2VsZi5uYW1lLmNhcGl0YWxpemUoKQogICAgICAgIHNlbGYuY21kX29wdHMgPSBvcHRwYXJzZS5PcHRpb25Hcm91cChzZWxmLnBhcnNlciwgb3B0Z3JvdXBfbmFtZSkKCiAgICAgICAgIyBBZGQgdGhlIGdlbmVyYWwgb3B0aW9ucwogICAgICAgIGdlbl9vcHRzID0gY21kb3B0aW9ucy5tYWtlX29wdGlvbl9ncm91cCgKICAgICAgICAgICAgY21kb3B0aW9ucy5nZW5lcmFsX2dyb3VwLAogICAgICAgICAgICBzZWxmLnBhcnNlciwKICAgICAgICApCiAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbl9ncm91cChnZW5fb3B0cykKCiAgICBkZWYgX2J1aWxkX3Nlc3Npb24oc2VsZiwgb3B0aW9ucywgcmV0cmllcz1Ob25lLCB0aW1lb3V0PU5vbmUpOgogICAgICAgIHNlc3Npb24gPSBQaXBTZXNzaW9uKAogICAgICAgICAgICBjYWNoZT0oCiAgICAgICAgICAgICAgICBub3JtYWxpemVfcGF0aChvcy5wYXRoLmpvaW4ob3B0aW9ucy5jYWNoZV9kaXIsICJodHRwIikpCiAgICAgICAgICAgICAgICBpZiBvcHRpb25zLmNhY2hlX2RpciBlbHNlIE5vbmUKICAgICAgICAgICAgKSwKICAgICAgICAgICAgcmV0cmllcz1yZXRyaWVzIGlmIHJldHJpZXMgaXMgbm90IE5vbmUgZWxzZSBvcHRpb25zLnJldHJpZXMsCiAgICAgICAgICAgIGluc2VjdXJlX2hvc3RzPW9wdGlvbnMudHJ1c3RlZF9ob3N0cywKICAgICAgICApCgogICAgICAgICMgSGFuZGxlIGN1c3RvbSBjYS1idW5kbGVzIGZyb20gdGhlIHVzZXIKICAgICAgICBpZiBvcHRpb25zLmNlcnQ6CiAgICAgICAgICAgIHNlc3Npb24udmVyaWZ5ID0gb3B0aW9ucy5jZXJ0CgogICAgICAgICMgSGFuZGxlIFNTTCBjbGllbnQgY2VydGlmaWNhdGUKICAgICAgICBpZiBvcHRpb25zLmNsaWVudF9jZXJ0OgogICAgICAgICAgICBzZXNzaW9uLmNlcnQgPSBvcHRpb25zLmNsaWVudF9jZXJ0CgogICAgICAgICMgSGFuZGxlIHRpbWVvdXRzCiAgICAgICAgaWYgb3B0aW9ucy50aW1lb3V0IG9yIHRpbWVvdXQ6CiAgICAgICAgICAgIHNlc3Npb24udGltZW91dCA9ICgKICAgICAgICAgICAgICAgIHRpbWVvdXQgaWYgdGltZW91dCBpcyBub3QgTm9uZSBlbHNlIG9wdGlvbnMudGltZW91dAogICAgICAgICAgICApCgogICAgICAgICMgSGFuZGxlIGNvbmZpZ3VyZWQgcHJveGllcwogICAgICAgIGlmIG9wdGlvbnMucHJveHk6CiAgICAgICAgICAgIHNlc3Npb24ucHJveGllcyA9IHsKICAgICAgICAgICAgICAgICJodHRwIjogb3B0aW9ucy5wcm94eSwKICAgICAgICAgICAgICAgICJodHRwcyI6IG9wdGlvbnMucHJveHksCiAgICAgICAgICAgIH0KCiAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2UgY2FuIHByb21wdCB0aGUgdXNlciBmb3IgYXV0aGVudGljYXRpb24gb3Igbm90CiAgICAgICAgc2Vzc2lvbi5hdXRoLnByb21wdGluZyA9IG5vdCBvcHRpb25zLm5vX2lucHV0CgogICAgICAgIHJldHVybiBzZXNzaW9uCgogICAgZGVmIHBhcnNlX2FyZ3Moc2VsZiwgYXJncyk6CiAgICAgICAgIyBmYWN0b3JlZCBvdXQgZm9yIHRlc3RhYmlsaXR5CiAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBhcnNlX2FyZ3MoYXJncykKCiAgICBkZWYgbWFpbihzZWxmLCBhcmdzKToKICAgICAgICBvcHRpb25zLCBhcmdzID0gc2VsZi5wYXJzZV9hcmdzKGFyZ3MpCgogICAgICAgIGlmIG9wdGlvbnMucXVpZXQ6CiAgICAgICAgICAgIGlmIG9wdGlvbnMucXVpZXQgPT0gMToKICAgICAgICAgICAgICAgIGxldmVsID0gIldBUk5JTkciCiAgICAgICAgICAgIGlmIG9wdGlvbnMucXVpZXQgPT0gMjoKICAgICAgICAgICAgICAgIGxldmVsID0gIkVSUk9SIgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGV2ZWwgPSAiQ1JJVElDQUwiCiAgICAgICAgZWxpZiBvcHRpb25zLnZlcmJvc2U6CiAgICAgICAgICAgIGxldmVsID0gIkRFQlVHIgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxldmVsID0gIklORk8iCgogICAgICAgICMgVGhlIHJvb3QgbG9nZ2VyIHNob3VsZCBtYXRjaCB0aGUgImNvbnNvbGUiIGxldmVsICp1bmxlc3MqIHdlCiAgICAgICAgIyBzcGVjaWZpZWQgIi0tbG9nIiB0byBzZW5kIGRlYnVnIGxvZ3MgdG8gYSBmaWxlLgogICAgICAgIHJvb3RfbGV2ZWwgPSBsZXZlbAogICAgICAgIGlmIG9wdGlvbnMubG9nOgogICAgICAgICAgICByb290X2xldmVsID0gIkRFQlVHIgoKICAgICAgICBsb2dnaW5nX2RpY3RDb25maWcoewogICAgICAgICAgICAidmVyc2lvbiI6IDEsCiAgICAgICAgICAgICJkaXNhYmxlX2V4aXN0aW5nX2xvZ2dlcnMiOiBGYWxzZSwKICAgICAgICAgICAgImZpbHRlcnMiOiB7CiAgICAgICAgICAgICAgICAiZXhjbHVkZV93YXJuaW5ncyI6IHsKICAgICAgICAgICAgICAgICAgICAiKCkiOiAicGlwLnV0aWxzLmxvZ2dpbmcuTWF4TGV2ZWxGaWx0ZXIiLAogICAgICAgICAgICAgICAgICAgICJsZXZlbCI6IGxvZ2dpbmcuV0FSTklORywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmb3JtYXR0ZXJzIjogewogICAgICAgICAgICAgICAgImluZGVudCI6IHsKICAgICAgICAgICAgICAgICAgICAiKCkiOiBJbmRlbnRpbmdGb3JtYXR0ZXIsCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6ICIlKG1lc3NhZ2UpcyIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICAiaGFuZGxlcnMiOiB7CiAgICAgICAgICAgICAgICAiY29uc29sZSI6IHsKICAgICAgICAgICAgICAgICAgICAibGV2ZWwiOiBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAiY2xhc3MiOiAicGlwLnV0aWxzLmxvZ2dpbmcuQ29sb3JpemVkU3RyZWFtSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgInN0cmVhbSI6IHNlbGYubG9nX3N0cmVhbXNbMF0sCiAgICAgICAgICAgICAgICAgICAgImZpbHRlcnMiOiBbImV4Y2x1ZGVfd2FybmluZ3MiXSwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0dGVyIjogImluZGVudCIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNvbnNvbGVfZXJyb3JzIjogewogICAgICAgICAgICAgICAgICAgICJsZXZlbCI6ICJXQVJOSU5HIiwKICAgICAgICAgICAgICAgICAgICAiY2xhc3MiOiAicGlwLnV0aWxzLmxvZ2dpbmcuQ29sb3JpemVkU3RyZWFtSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgInN0cmVhbSI6IHNlbGYubG9nX3N0cmVhbXNbMV0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdHRlciI6ICJpbmRlbnQiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ1c2VyX2xvZyI6IHsKICAgICAgICAgICAgICAgICAgICAibGV2ZWwiOiAiREVCVUciLAogICAgICAgICAgICAgICAgICAgICJjbGFzcyI6ICJwaXAudXRpbHMubG9nZ2luZy5CZXR0ZXJSb3RhdGluZ0ZpbGVIYW5kbGVyIiwKICAgICAgICAgICAgICAgICAgICAiZmlsZW5hbWUiOiBvcHRpb25zLmxvZyBvciAiL2Rldi9udWxsIiwKICAgICAgICAgICAgICAgICAgICAiZGVsYXkiOiBUcnVlLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXR0ZXIiOiAiaW5kZW50IiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyb290IjogewogICAgICAgICAgICAgICAgImxldmVsIjogcm9vdF9sZXZlbCwKICAgICAgICAgICAgICAgICJoYW5kbGVycyI6IGxpc3QoZmlsdGVyKE5vbmUsIFsKICAgICAgICAgICAgICAgICAgICAiY29uc29sZSIsCiAgICAgICAgICAgICAgICAgICAgImNvbnNvbGVfZXJyb3JzIiwKICAgICAgICAgICAgICAgICAgICAidXNlcl9sb2ciIGlmIG9wdGlvbnMubG9nIGVsc2UgTm9uZSwKICAgICAgICAgICAgICAgIF0pKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIyBEaXNhYmxlIGFueSBsb2dnaW5nIGJlc2lkZXMgV0FSTklORyB1bmxlc3Mgd2UgaGF2ZSBERUJVRyBsZXZlbAogICAgICAgICAgICAjIGxvZ2dpbmcgZW5hYmxlZC4gVGhlc2UgdXNlIGJvdGggcGlwLl92ZW5kb3IgYW5kIHRoZSBiYXJlIG5hbWVzCiAgICAgICAgICAgICMgZm9yIHRoZSBjYXNlIHdoZXJlIHNvbWVvbmUgdW5idW5kbGVzIG91ciBsaWJyYXJpZXMuCiAgICAgICAgICAgICJsb2dnZXJzIjogZGljdCgKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImxldmVsIjogKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIldBUk5JTkciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZXZlbCBpbiBbIklORk8iLCAiRVJST1IiXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAiREVCVUciCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIFsicGlwLl92ZW5kb3IiLCAiZGlzdGxpYiIsICJyZXF1ZXN0cyIsICJ1cmxsaWIzIl0KICAgICAgICAgICAgKSwKICAgICAgICB9KQoKICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA9PSAoMiwgNik6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiUHl0aG9uIDIuNiBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IHRoZSBQeXRob24gY29yZSB0ZWFtLCAiCiAgICAgICAgICAgICAgICAicGxlYXNlIHVwZ3JhZGUgeW91ciBQeXRob24uIEEgZnV0dXJlIHZlcnNpb24gb2YgcGlwIHdpbGwgIgogICAgICAgICAgICAgICAgImRyb3Agc3VwcG9ydCBmb3IgUHl0aG9uIDIuNiIsCiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbi5QeXRob24yNkRlcHJlY2F0aW9uV2FybmluZwogICAgICAgICAgICApCgogICAgICAgICMgVE9ETzogdHJ5IHRvIGdldCB0aGVzZSBwYXNzaW5nIGRvd24gZnJvbSB0aGUgY29tbWFuZD8KICAgICAgICAjICAgICAgd2l0aG91dCByZXNvcnRpbmcgdG8gb3MuZW52aXJvbiB0byBob2xkIHRoZXNlLgoKICAgICAgICBpZiBvcHRpb25zLm5vX2lucHV0OgogICAgICAgICAgICBvcy5lbnZpcm9uWydQSVBfTk9fSU5QVVQnXSA9ICcxJwoKICAgICAgICBpZiBvcHRpb25zLmV4aXN0c19hY3Rpb246CiAgICAgICAgICAgIG9zLmVudmlyb25bJ1BJUF9FWElTVFNfQUNUSU9OJ10gPSAnICcuam9pbihvcHRpb25zLmV4aXN0c19hY3Rpb24pCgogICAgICAgIGlmIG9wdGlvbnMucmVxdWlyZV92ZW52OgogICAgICAgICAgICAjIElmIGEgdmVudiBpcyByZXF1aXJlZCBjaGVjayBpZiBpdCBjYW4gcmVhbGx5IGJlIGZvdW5kCiAgICAgICAgICAgIGlmIG5vdCBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYoKToKICAgICAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbCgKICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IGZpbmQgYW4gYWN0aXZhdGVkIHZpcnR1YWxlbnYgKHJlcXVpcmVkKS4nCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBzeXMuZXhpdChWSVJUVUFMRU5WX05PVF9GT1VORCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdGF0dXMgPSBzZWxmLnJ1bihvcHRpb25zLCBhcmdzKQogICAgICAgICAgICAjIEZJWE1FOiBhbGwgY29tbWFuZHMgc2hvdWxkIHJldHVybiBhbiBleGl0IHN0YXR1cwogICAgICAgICAgICAjIGFuZCB3aGVuIGl0IGlzIGRvbmUsIGlzaW5zdGFuY2UgaXMgbm90IG5lZWRlZCBhbnltb3JlCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc3RhdHVzLCBpbnQpOgogICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1cwogICAgICAgIGV4Y2VwdCBQcmV2aW91c0J1aWxkRGlyRXJyb3IgYXMgZXhjOgogICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoc3RyKGV4YykpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRXhjZXB0aW9uIGluZm9ybWF0aW9uOicsIGV4Y19pbmZvPVRydWUpCgogICAgICAgICAgICByZXR1cm4gUFJFVklPVVNfQlVJTERfRElSX0VSUk9SCiAgICAgICAgZXhjZXB0IChJbnN0YWxsYXRpb25FcnJvciwgVW5pbnN0YWxsYXRpb25FcnJvciwgQmFkQ29tbWFuZCkgYXMgZXhjOgogICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoc3RyKGV4YykpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRXhjZXB0aW9uIGluZm9ybWF0aW9uOicsIGV4Y19pbmZvPVRydWUpCgogICAgICAgICAgICByZXR1cm4gRVJST1IKICAgICAgICBleGNlcHQgQ29tbWFuZEVycm9yIGFzIGV4YzoKICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKCdFUlJPUjogJXMnLCBleGMpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRXhjZXB0aW9uIGluZm9ybWF0aW9uOicsIGV4Y19pbmZvPVRydWUpCgogICAgICAgICAgICByZXR1cm4gRVJST1IKICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CiAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbCgnT3BlcmF0aW9uIGNhbmNlbGxlZCBieSB1c2VyJykKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdFeGNlcHRpb24gaW5mb3JtYXRpb246JywgZXhjX2luZm89VHJ1ZSkKCiAgICAgICAgICAgIHJldHVybiBFUlJPUgogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKCdFeGNlcHRpb246JywgZXhjX2luZm89VHJ1ZSkKCiAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIyBDaGVjayBpZiB3ZSdyZSB1c2luZyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgcGlwIGF2YWlsYWJsZQogICAgICAgICAgICBpZiAobm90IG9wdGlvbnMuZGlzYWJsZV9waXBfdmVyc2lvbl9jaGVjayBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihvcHRpb25zLCAibm9faW5kZXgiLCBGYWxzZSkpOgogICAgICAgICAgICAgICAgd2l0aCBzZWxmLl9idWlsZF9zZXNzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVzPTAsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9bWluKDUsIG9wdGlvbnMudGltZW91dCkpIGFzIHNlc3Npb246CiAgICAgICAgICAgICAgICAgICAgcGlwX3ZlcnNpb25fY2hlY2soc2Vzc2lvbikKCiAgICAgICAgcmV0dXJuIFNVQ0NFU1MKCgpjbGFzcyBSZXF1aXJlbWVudENvbW1hbmQoQ29tbWFuZCk6CgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHBvcHVsYXRlX3JlcXVpcmVtZW50X3NldChyZXF1aXJlbWVudF9zZXQsIGFyZ3MsIG9wdGlvbnMsIGZpbmRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiwgbmFtZSwgd2hlZWxfY2FjaGUpOgogICAgICAgICIiIgogICAgICAgIE1hcnNoYWwgY21kIGxpbmUgYXJncyBpbnRvIGEgcmVxdWlyZW1lbnQgc2V0LgogICAgICAgICIiIgogICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcHRpb25zLmNvbnN0cmFpbnRzOgogICAgICAgICAgICBmb3IgcmVxIGluIHBhcnNlX3JlcXVpcmVtZW50cygKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50PVRydWUsIGZpbmRlcj1maW5kZXIsIG9wdGlvbnM9b3B0aW9ucywKICAgICAgICAgICAgICAgICAgICBzZXNzaW9uPXNlc3Npb24sIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlKToKICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5hZGRfcmVxdWlyZW1lbnQocmVxKQoKICAgICAgICBmb3IgcmVxIGluIGFyZ3M6CiAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5hZGRfcmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICBJbnN0YWxsUmVxdWlyZW1lbnQuZnJvbV9saW5lKAogICAgICAgICAgICAgICAgICAgIHJlcSwgTm9uZSwgaXNvbGF0ZWQ9b3B0aW9ucy5pc29sYXRlZF9tb2RlLAogICAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKCiAgICAgICAgZm9yIHJlcSBpbiBvcHRpb25zLmVkaXRhYmxlczoKICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LmFkZF9yZXF1aXJlbWVudCgKICAgICAgICAgICAgICAgIEluc3RhbGxSZXF1aXJlbWVudC5mcm9tX2VkaXRhYmxlKAogICAgICAgICAgICAgICAgICAgIHJlcSwKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X3Zjcz1vcHRpb25zLmRlZmF1bHRfdmNzLAogICAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPW9wdGlvbnMuaXNvbGF0ZWRfbW9kZSwKICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCgogICAgICAgIGZvdW5kX3JlcV9pbl9maWxlID0gRmFsc2UKICAgICAgICBmb3IgZmlsZW5hbWUgaW4gb3B0aW9ucy5yZXF1aXJlbWVudHM6CiAgICAgICAgICAgIGZvciByZXEgaW4gcGFyc2VfcmVxdWlyZW1lbnRzKAogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgIGZpbmRlcj1maW5kZXIsIG9wdGlvbnM9b3B0aW9ucywgc2Vzc2lvbj1zZXNzaW9uLAogICAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlKToKICAgICAgICAgICAgICAgIGZvdW5kX3JlcV9pbl9maWxlID0gVHJ1ZQogICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LmFkZF9yZXF1aXJlbWVudChyZXEpCiAgICAgICAgIyBJZiAtLXJlcXVpcmUtaGFzaGVzIHdhcyBhIGxpbmUgaW4gYSByZXF1aXJlbWVudHMgZmlsZSwgdGVsbAogICAgICAgICMgUmVxdWlyZW1lbnRTZXQgYWJvdXQgaXQ6CiAgICAgICAgcmVxdWlyZW1lbnRfc2V0LnJlcXVpcmVfaGFzaGVzID0gb3B0aW9ucy5yZXF1aXJlX2hhc2hlcwoKICAgICAgICBpZiBub3QgKGFyZ3Mgb3Igb3B0aW9ucy5lZGl0YWJsZXMgb3IgZm91bmRfcmVxX2luX2ZpbGUpOgogICAgICAgICAgICBvcHRzID0geyduYW1lJzogbmFtZX0KICAgICAgICAgICAgaWYgb3B0aW9ucy5maW5kX2xpbmtzOgogICAgICAgICAgICAgICAgbXNnID0gKCdZb3UgbXVzdCBnaXZlIGF0IGxlYXN0IG9uZSByZXF1aXJlbWVudCB0byAnCiAgICAgICAgICAgICAgICAgICAgICAgJyUobmFtZSlzIChtYXliZSB5b3UgbWVhbnQgInBpcCAlKG5hbWUpcyAnCiAgICAgICAgICAgICAgICAgICAgICAgJyUobGlua3MpcyI/KScgJQogICAgICAgICAgICAgICAgICAgICAgIGRpY3Qob3B0cywgbGlua3M9JyAnLmpvaW4ob3B0aW9ucy5maW5kX2xpbmtzKSkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBtc2cgPSAoJ1lvdSBtdXN0IGdpdmUgYXQgbGVhc3Qgb25lIHJlcXVpcmVtZW50ICcKICAgICAgICAgICAgICAgICAgICAgICAndG8gJShuYW1lKXMgKHNlZSAicGlwIGhlbHAgJShuYW1lKXMiKScgJSBvcHRzKQogICAgICAgICAgICBsb2dnZXIud2FybmluZyhtc2cpCgogICAgZGVmIF9idWlsZF9wYWNrYWdlX2ZpbmRlcihzZWxmLCBvcHRpb25zLCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybT1Ob25lLCBweXRob25fdmVyc2lvbnM9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJpPU5vbmUsIGltcGxlbWVudGF0aW9uPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIENyZWF0ZSBhIHBhY2thZ2UgZmluZGVyIGFwcHJvcHJpYXRlIHRvIHRoaXMgcmVxdWlyZW1lbnQgY29tbWFuZC4KICAgICAgICAiIiIKICAgICAgICBpbmRleF91cmxzID0gW29wdGlvbnMuaW5kZXhfdXJsXSArIG9wdGlvbnMuZXh0cmFfaW5kZXhfdXJscwogICAgICAgIGlmIG9wdGlvbnMubm9faW5kZXg6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnSWdub3JpbmcgaW5kZXhlczogJXMnLCAnLCcuam9pbihpbmRleF91cmxzKSkKICAgICAgICAgICAgaW5kZXhfdXJscyA9IFtdCgogICAgICAgIHJldHVybiBQYWNrYWdlRmluZGVyKAogICAgICAgICAgICBmaW5kX2xpbmtzPW9wdGlvbnMuZmluZF9saW5rcywKICAgICAgICAgICAgZm9ybWF0X2NvbnRyb2w9b3B0aW9ucy5mb3JtYXRfY29udHJvbCwKICAgICAgICAgICAgaW5kZXhfdXJscz1pbmRleF91cmxzLAogICAgICAgICAgICB0cnVzdGVkX2hvc3RzPW9wdGlvbnMudHJ1c3RlZF9ob3N0cywKICAgICAgICAgICAgYWxsb3dfYWxsX3ByZXJlbGVhc2VzPW9wdGlvbnMucHJlLAogICAgICAgICAgICBwcm9jZXNzX2RlcGVuZGVuY3lfbGlua3M9b3B0aW9ucy5wcm9jZXNzX2RlcGVuZGVuY3lfbGlua3MsCiAgICAgICAgICAgIHNlc3Npb249c2Vzc2lvbiwKICAgICAgICAgICAgcGxhdGZvcm09cGxhdGZvcm0sCiAgICAgICAgICAgIHZlcnNpb25zPXB5dGhvbl92ZXJzaW9ucywKICAgICAgICAgICAgYWJpPWFiaSwKICAgICAgICAgICAgaW1wbGVtZW50YXRpb249aW1wbGVtZW50YXRpb24sCiAgICAgICAgKQpQSwMEFAAAAAAAAAAhAKur/jvhKAAA4SgAACEAAABweXBpX19waXBfOV8wXzMvcGlwL2Jhc2VwYXJzZXIucHkiIiJCYXNlIG9wdGlvbiBwYXJzZXIgc2V0dXAiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBzeXMKaW1wb3J0IG9wdHBhcnNlCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHRleHR3cmFwCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IHN0cnRvYm9vbAoKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHN0cmluZ190eXBlcwpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3ZlcyBpbXBvcnQgY29uZmlncGFyc2VyCmZyb20gcGlwLmxvY2F0aW9ucyBpbXBvcnQgKAogICAgbGVnYWN5X2NvbmZpZ19maWxlLCBjb25maWdfYmFzZW5hbWUsIHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudiwKICAgIHNpdGVfY29uZmlnX2ZpbGVzCikKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGFwcGRpcnMsIGdldF90ZXJtaW5hbF9zaXplCgoKX2Vudmlyb25fcHJlZml4X3JlID0gcmUuY29tcGlsZShyIl5QSVBfIiwgcmUuSSkKCgpjbGFzcyBQcmV0dHlIZWxwRm9ybWF0dGVyKG9wdHBhcnNlLkluZGVudGVkSGVscEZvcm1hdHRlcik6CiAgICAiIiJBIHByZXR0aWVyL2xlc3MgdmVyYm9zZSBoZWxwIGZvcm1hdHRlciBmb3Igb3B0cGFyc2UuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIyBoZWxwIHBvc2l0aW9uIG11c3QgYmUgYWxpZ25lZCB3aXRoIF9faW5pdF9fLnBhcnNlb3B0cy5kZXNjcmlwdGlvbgogICAgICAgIGt3YXJnc1snbWF4X2hlbHBfcG9zaXRpb24nXSA9IDMwCiAgICAgICAga3dhcmdzWydpbmRlbnRfaW5jcmVtZW50J10gPSAxCiAgICAgICAga3dhcmdzWyd3aWR0aCddID0gZ2V0X3Rlcm1pbmFsX3NpemUoKVswXSAtIDIKICAgICAgICBvcHRwYXJzZS5JbmRlbnRlZEhlbHBGb3JtYXR0ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQoKICAgIGRlZiBmb3JtYXRfb3B0aW9uX3N0cmluZ3Moc2VsZiwgb3B0aW9uKToKICAgICAgICByZXR1cm4gc2VsZi5fZm9ybWF0X29wdGlvbl9zdHJpbmdzKG9wdGlvbiwgJyA8JXM+JywgJywgJykKCiAgICBkZWYgX2Zvcm1hdF9vcHRpb25fc3RyaW5ncyhzZWxmLCBvcHRpb24sIG12YXJmbXQ9JyA8JXM+Jywgb3B0c2VwPScsICcpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG9wdGlvbiBzdHJpbmdzIGFuZCBtZXRhdmFycy4KCiAgICAgICAgOnBhcmFtIG9wdGlvbjogIHR1cGxlIG9mIChzaG9ydCBvcHQsIGxvbmcgb3B0KSwgZS5nOiAoJy1mJywgJy0tZm9ybWF0JykKICAgICAgICA6cGFyYW0gbXZhcmZtdDogbWV0YXZhciBmb3JtYXQgc3RyaW5nIC0gZXZhbHVhdGVkIGFzIG12YXJmbXQgJSBtZXRhdmFyCiAgICAgICAgOnBhcmFtIG9wdHNlcDogIHNlcGFyYXRvcgogICAgICAgICIiIgogICAgICAgIG9wdHMgPSBbXQoKICAgICAgICBpZiBvcHRpb24uX3Nob3J0X29wdHM6CiAgICAgICAgICAgIG9wdHMuYXBwZW5kKG9wdGlvbi5fc2hvcnRfb3B0c1swXSkKICAgICAgICBpZiBvcHRpb24uX2xvbmdfb3B0czoKICAgICAgICAgICAgb3B0cy5hcHBlbmQob3B0aW9uLl9sb25nX29wdHNbMF0pCiAgICAgICAgaWYgbGVuKG9wdHMpID4gMToKICAgICAgICAgICAgb3B0cy5pbnNlcnQoMSwgb3B0c2VwKQoKICAgICAgICBpZiBvcHRpb24udGFrZXNfdmFsdWUoKToKICAgICAgICAgICAgbWV0YXZhciA9IG9wdGlvbi5tZXRhdmFyIG9yIG9wdGlvbi5kZXN0Lmxvd2VyKCkKICAgICAgICAgICAgb3B0cy5hcHBlbmQobXZhcmZtdCAlIG1ldGF2YXIubG93ZXIoKSkKCiAgICAgICAgcmV0dXJuICcnLmpvaW4ob3B0cykKCiAgICBkZWYgZm9ybWF0X2hlYWRpbmcoc2VsZiwgaGVhZGluZyk6CiAgICAgICAgaWYgaGVhZGluZyA9PSAnT3B0aW9ucyc6CiAgICAgICAgICAgIHJldHVybiAnJwogICAgICAgIHJldHVybiBoZWFkaW5nICsgJzpcbicKCiAgICBkZWYgZm9ybWF0X3VzYWdlKHNlbGYsIHVzYWdlKToKICAgICAgICAiIiIKICAgICAgICBFbnN1cmUgdGhlcmUgaXMgb25seSBvbmUgbmV3bGluZSBiZXR3ZWVuIHVzYWdlIGFuZCB0aGUgZmlyc3QgaGVhZGluZwogICAgICAgIGlmIHRoZXJlIGlzIG5vIGRlc2NyaXB0aW9uLgogICAgICAgICIiIgogICAgICAgIG1zZyA9ICdcblVzYWdlOiAlc1xuJyAlIHNlbGYuaW5kZW50X2xpbmVzKHRleHR3cmFwLmRlZGVudCh1c2FnZSksICIgICIpCiAgICAgICAgcmV0dXJuIG1zZwoKICAgIGRlZiBmb3JtYXRfZGVzY3JpcHRpb24oc2VsZiwgZGVzY3JpcHRpb24pOgogICAgICAgICMgbGVhdmUgZnVsbCBjb250cm9sIG92ZXIgZGVzY3JpcHRpb24gdG8gdXMKICAgICAgICBpZiBkZXNjcmlwdGlvbjoKICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLnBhcnNlciwgJ21haW4nKToKICAgICAgICAgICAgICAgIGxhYmVsID0gJ0NvbW1hbmRzJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGFiZWwgPSAnRGVzY3JpcHRpb24nCiAgICAgICAgICAgICMgc29tZSBkb2Mgc3RyaW5ncyBoYXZlIGluaXRpYWwgbmV3bGluZXMsIHNvbWUgZG9uJ3QKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5sc3RyaXAoJ1xuJykKICAgICAgICAgICAgIyBzb21lIGRvYyBzdHJpbmdzIGhhdmUgZmluYWwgbmV3bGluZXMgYW5kIHNwYWNlcywgc29tZSBkb24ndAogICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLnJzdHJpcCgpCiAgICAgICAgICAgICMgZGVkZW50LCB0aGVuIHJlaW5kZW50CiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gc2VsZi5pbmRlbnRfbGluZXModGV4dHdyYXAuZGVkZW50KGRlc2NyaXB0aW9uKSwgIiAgIikKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAnJXM6XG4lc1xuJyAlIChsYWJlbCwgZGVzY3JpcHRpb24pCiAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAnJwoKICAgIGRlZiBmb3JtYXRfZXBpbG9nKHNlbGYsIGVwaWxvZyk6CiAgICAgICAgIyBsZWF2ZSBmdWxsIGNvbnRyb2wgb3ZlciBlcGlsb2cgdG8gdXMKICAgICAgICBpZiBlcGlsb2c6CiAgICAgICAgICAgIHJldHVybiBlcGlsb2cKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gJycKCiAgICBkZWYgaW5kZW50X2xpbmVzKHNlbGYsIHRleHQsIGluZGVudCk6CiAgICAgICAgbmV3X2xpbmVzID0gW2luZGVudCArIGxpbmUgZm9yIGxpbmUgaW4gdGV4dC5zcGxpdCgnXG4nKV0KICAgICAgICByZXR1cm4gIlxuIi5qb2luKG5ld19saW5lcykKCgpjbGFzcyBVcGRhdGluZ0RlZmF1bHRzSGVscEZvcm1hdHRlcihQcmV0dHlIZWxwRm9ybWF0dGVyKToKICAgICIiIkN1c3RvbSBoZWxwIGZvcm1hdHRlciBmb3IgdXNlIGluIENvbmZpZ09wdGlvblBhcnNlci4KCiAgICBUaGlzIGlzIHVwZGF0ZXMgdGhlIGRlZmF1bHRzIGJlZm9yZSBleHBhbmRpbmcgdGhlbSwgYWxsb3dpbmcKICAgIHRoZW0gdG8gc2hvdyB1cCBjb3JyZWN0bHkgaW4gdGhlIGhlbHAgbGlzdGluZy4KICAgICIiIgoKICAgIGRlZiBleHBhbmRfZGVmYXVsdChzZWxmLCBvcHRpb24pOgogICAgICAgIGlmIHNlbGYucGFyc2VyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnBhcnNlci5fdXBkYXRlX2RlZmF1bHRzKHNlbGYucGFyc2VyLmRlZmF1bHRzKQogICAgICAgIHJldHVybiBvcHRwYXJzZS5JbmRlbnRlZEhlbHBGb3JtYXR0ZXIuZXhwYW5kX2RlZmF1bHQoc2VsZiwgb3B0aW9uKQoKCmNsYXNzIEN1c3RvbU9wdGlvblBhcnNlcihvcHRwYXJzZS5PcHRpb25QYXJzZXIpOgoKICAgIGRlZiBpbnNlcnRfb3B0aW9uX2dyb3VwKHNlbGYsIGlkeCwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiJJbnNlcnQgYW4gT3B0aW9uR3JvdXAgYXQgYSBnaXZlbiBwb3NpdGlvbi4iIiIKICAgICAgICBncm91cCA9IHNlbGYuYWRkX29wdGlvbl9ncm91cCgqYXJncywgKiprd2FyZ3MpCgogICAgICAgIHNlbGYub3B0aW9uX2dyb3Vwcy5wb3AoKQogICAgICAgIHNlbGYub3B0aW9uX2dyb3Vwcy5pbnNlcnQoaWR4LCBncm91cCkKCiAgICAgICAgcmV0dXJuIGdyb3VwCgogICAgQHByb3BlcnR5CiAgICBkZWYgb3B0aW9uX2xpc3RfYWxsKHNlbGYpOgogICAgICAgICIiIkdldCBhIGxpc3Qgb2YgYWxsIG9wdGlvbnMsIGluY2x1ZGluZyB0aG9zZSBpbiBvcHRpb24gZ3JvdXBzLiIiIgogICAgICAgIHJlcyA9IHNlbGYub3B0aW9uX2xpc3RbOl0KICAgICAgICBmb3IgaSBpbiBzZWxmLm9wdGlvbl9ncm91cHM6CiAgICAgICAgICAgIHJlcy5leHRlbmQoaS5vcHRpb25fbGlzdCkKCiAgICAgICAgcmV0dXJuIHJlcwoKCmNsYXNzIENvbmZpZ09wdGlvblBhcnNlcihDdXN0b21PcHRpb25QYXJzZXIpOgogICAgIiIiQ3VzdG9tIG9wdGlvbiBwYXJzZXIgd2hpY2ggdXBkYXRlcyBpdHMgZGVmYXVsdHMgYnkgY2hlY2tpbmcgdGhlCiAgICBjb25maWd1cmF0aW9uIGZpbGVzIGFuZCBlbnZpcm9ubWVudGFsIHZhcmlhYmxlcyIiIgoKICAgIGlzb2xhdGVkID0gRmFsc2UKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZ3BhcnNlci5SYXdDb25maWdQYXJzZXIoKQogICAgICAgIHNlbGYubmFtZSA9IGt3YXJncy5wb3AoJ25hbWUnKQogICAgICAgIHNlbGYuaXNvbGF0ZWQgPSBrd2FyZ3MucG9wKCJpc29sYXRlZCIsIEZhbHNlKQogICAgICAgIHNlbGYuZmlsZXMgPSBzZWxmLmdldF9jb25maWdfZmlsZXMoKQogICAgICAgIGlmIHNlbGYuZmlsZXM6CiAgICAgICAgICAgIHNlbGYuY29uZmlnLnJlYWQoc2VsZi5maWxlcykKICAgICAgICBhc3NlcnQgc2VsZi5uYW1lCiAgICAgICAgb3B0cGFyc2UuT3B0aW9uUGFyc2VyLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncykKCiAgICBkZWYgZ2V0X2NvbmZpZ19maWxlcyhzZWxmKToKICAgICAgICAjIHRoZSBmaWxlcyByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCB3aWxsIGJlIHBhcnNlZCBpbiBvcmRlciB3aXRoIHRoZQogICAgICAgICMgZmlyc3QgZmlsZXMgbGlzdGVkIGJlaW5nIG92ZXJyaWRkZW4gYnkgbGF0ZXIgZmlsZXMgaW4gc3RhbmRhcmQKICAgICAgICAjIENvbmZpZ1BhcnNlciBmYXNoaW9uCiAgICAgICAgY29uZmlnX2ZpbGUgPSBvcy5lbnZpcm9uLmdldCgnUElQX0NPTkZJR19GSUxFJywgRmFsc2UpCiAgICAgICAgaWYgY29uZmlnX2ZpbGUgPT0gb3MuZGV2bnVsbDoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgICMgYXQgdGhlIGJhc2Ugd2UgaGF2ZSBhbnkgc2l0ZS13aWRlIGNvbmZpZ3VyYXRpb24KICAgICAgICBmaWxlcyA9IGxpc3Qoc2l0ZV9jb25maWdfZmlsZXMpCgogICAgICAgICMgcGVyLXVzZXIgY29uZmlndXJhdGlvbiBuZXh0CiAgICAgICAgaWYgbm90IHNlbGYuaXNvbGF0ZWQ6CiAgICAgICAgICAgIGlmIGNvbmZpZ19maWxlIGFuZCBvcy5wYXRoLmV4aXN0cyhjb25maWdfZmlsZSk6CiAgICAgICAgICAgICAgICBmaWxlcy5hcHBlbmQoY29uZmlnX2ZpbGUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIFRoaXMgaXMgdGhlIGxlZ2FjeSBjb25maWcgZmlsZSwgd2UgY29uc2lkZXIgaXQgdG8gYmUgYSBsb3dlcgogICAgICAgICAgICAgICAgIyBwcmlvcml0eSB0aGFuIHRoZSBuZXcgZmlsZSBsb2NhdGlvbi4KICAgICAgICAgICAgICAgIGZpbGVzLmFwcGVuZChsZWdhY3lfY29uZmlnX2ZpbGUpCgogICAgICAgICAgICAgICAgIyBUaGlzIGlzIHRoZSBuZXcgY29uZmlnIGZpbGUsIHdlIGNvbnNpZGVyIGl0IHRvIGJlIGEgaGlnaGVyCiAgICAgICAgICAgICAgICAjIHByaW9yaXR5IHRoYW4gdGhlIGxlZ2FjeSBmaWxlLgogICAgICAgICAgICAgICAgZmlsZXMuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZGlycy51c2VyX2NvbmZpZ19kaXIoInBpcCIpLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfYmFzZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQoKICAgICAgICAjIGZpbmFsbHkgdmlydHVhbGVudiBjb25maWd1cmF0aW9uIGZpcnN0IHRydW1waW5nIG90aGVycwogICAgICAgIGlmIHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudigpOgogICAgICAgICAgICB2ZW52X2NvbmZpZ19maWxlID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgc3lzLnByZWZpeCwKICAgICAgICAgICAgICAgIGNvbmZpZ19iYXNlbmFtZSwKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh2ZW52X2NvbmZpZ19maWxlKToKICAgICAgICAgICAgICAgIGZpbGVzLmFwcGVuZCh2ZW52X2NvbmZpZ19maWxlKQoKICAgICAgICByZXR1cm4gZmlsZXMKCiAgICBkZWYgY2hlY2tfZGVmYXVsdChzZWxmLCBvcHRpb24sIGtleSwgdmFsKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBvcHRpb24uY2hlY2tfdmFsdWUoa2V5LCB2YWwpCiAgICAgICAgZXhjZXB0IG9wdHBhcnNlLk9wdGlvblZhbHVlRXJyb3IgYXMgZXhjOgogICAgICAgICAgICBwcmludCgiQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGNvbmZpZ3VyYXRpb246ICVzIiAlIGV4YykKICAgICAgICAgICAgc3lzLmV4aXQoMykKCiAgICBkZWYgX3VwZGF0ZV9kZWZhdWx0cyhzZWxmLCBkZWZhdWx0cyk6CiAgICAgICAgIiIiVXBkYXRlcyB0aGUgZ2l2ZW4gZGVmYXVsdHMgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgY29uZmlnIGZpbGVzIGFuZAogICAgICAgIHRoZSBlbnZpcm9uLiBEb2VzIGEgbGl0dGxlIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGNlcnRhaW4gdHlwZXMgb2YKICAgICAgICBvcHRpb25zIChsaXN0cykuIiIiCiAgICAgICAgIyBUaGVuIGdvIGFuZCBsb29rIGZvciB0aGUgb3RoZXIgc291cmNlcyBvZiBjb25maWd1cmF0aW9uOgogICAgICAgIGNvbmZpZyA9IHt9CiAgICAgICAgIyAxLiBjb25maWcgZmlsZXMKICAgICAgICBmb3Igc2VjdGlvbiBpbiAoJ2dsb2JhbCcsIHNlbGYubmFtZSk6CiAgICAgICAgICAgIGNvbmZpZy51cGRhdGUoCiAgICAgICAgICAgICAgICBzZWxmLm5vcm1hbGl6ZV9rZXlzKHNlbGYuZ2V0X2NvbmZpZ19zZWN0aW9uKHNlY3Rpb24pKQogICAgICAgICAgICApCiAgICAgICAgIyAyLiBlbnZpcm9ubWVudGFsIHZhcmlhYmxlcwogICAgICAgIGlmIG5vdCBzZWxmLmlzb2xhdGVkOgogICAgICAgICAgICBjb25maWcudXBkYXRlKHNlbGYubm9ybWFsaXplX2tleXMoc2VsZi5nZXRfZW52aXJvbl92YXJzKCkpKQogICAgICAgICMgQWNjdW11bGF0ZSBjb21wbGV4IGRlZmF1bHQgc3RhdGUuCiAgICAgICAgc2VsZi52YWx1ZXMgPSBvcHRwYXJzZS5WYWx1ZXMoc2VsZi5kZWZhdWx0cykKICAgICAgICBsYXRlX2V2YWwgPSBzZXQoKQogICAgICAgICMgVGhlbiBzZXQgdGhlIG9wdGlvbnMgd2l0aCB0aG9zZSB2YWx1ZXMKICAgICAgICBmb3Iga2V5LCB2YWwgaW4gY29uZmlnLml0ZW1zKCk6CiAgICAgICAgICAgICMgaWdub3JlIGVtcHR5IHZhbHVlcwogICAgICAgICAgICBpZiBub3QgdmFsOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIG9wdGlvbiA9IHNlbGYuZ2V0X29wdGlvbihrZXkpCiAgICAgICAgICAgICMgSWdub3JlIG9wdGlvbnMgbm90IHByZXNlbnQgaW4gdGhpcyBwYXJzZXIuIEUuZy4gbm9uLWdsb2JhbHMgcHV0CiAgICAgICAgICAgICMgaW4gW2dsb2JhbF0gYnkgdXNlcnMgdGhhdCB3YW50IHRoZW0gdG8gYXBwbHkgdG8gYWxsIGFwcGxpY2FibGUKICAgICAgICAgICAgIyBjb21tYW5kcy4KICAgICAgICAgICAgaWYgb3B0aW9uIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgaWYgb3B0aW9uLmFjdGlvbiBpbiAoJ3N0b3JlX3RydWUnLCAnc3RvcmVfZmFsc2UnLCAnY291bnQnKToKICAgICAgICAgICAgICAgIHZhbCA9IHN0cnRvYm9vbCh2YWwpCiAgICAgICAgICAgIGVsaWYgb3B0aW9uLmFjdGlvbiA9PSAnYXBwZW5kJzoKICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zcGxpdCgpCiAgICAgICAgICAgICAgICB2YWwgPSBbc2VsZi5jaGVja19kZWZhdWx0KG9wdGlvbiwga2V5LCB2KSBmb3IgdiBpbiB2YWxdCiAgICAgICAgICAgIGVsaWYgb3B0aW9uLmFjdGlvbiA9PSAnY2FsbGJhY2snOgogICAgICAgICAgICAgICAgbGF0ZV9ldmFsLmFkZChvcHRpb24uZGVzdCkKICAgICAgICAgICAgICAgIG9wdF9zdHIgPSBvcHRpb24uZ2V0X29wdF9zdHJpbmcoKQogICAgICAgICAgICAgICAgdmFsID0gb3B0aW9uLmNvbnZlcnRfdmFsdWUob3B0X3N0ciwgdmFsKQogICAgICAgICAgICAgICAgIyBGcm9tIHRha2VfYWN0aW9uCiAgICAgICAgICAgICAgICBhcmdzID0gb3B0aW9uLmNhbGxiYWNrX2FyZ3Mgb3IgKCkKICAgICAgICAgICAgICAgIGt3YXJncyA9IG9wdGlvbi5jYWxsYmFja19rd2FyZ3Mgb3Ige30KICAgICAgICAgICAgICAgIG9wdGlvbi5jYWxsYmFjayhvcHRpb24sIG9wdF9zdHIsIHZhbCwgc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmFsID0gc2VsZi5jaGVja19kZWZhdWx0KG9wdGlvbiwga2V5LCB2YWwpCgogICAgICAgICAgICBkZWZhdWx0c1tvcHRpb24uZGVzdF0gPSB2YWwKCiAgICAgICAgZm9yIGtleSBpbiBsYXRlX2V2YWw6CiAgICAgICAgICAgIGRlZmF1bHRzW2tleV0gPSBnZXRhdHRyKHNlbGYudmFsdWVzLCBrZXkpCiAgICAgICAgc2VsZi52YWx1ZXMgPSBOb25lCiAgICAgICAgcmV0dXJuIGRlZmF1bHRzCgogICAgZGVmIG5vcm1hbGl6ZV9rZXlzKHNlbGYsIGl0ZW1zKToKICAgICAgICAiIiJSZXR1cm4gYSBjb25maWcgZGljdGlvbmFyeSB3aXRoIG5vcm1hbGl6ZWQga2V5cyByZWdhcmRsZXNzIG9mCiAgICAgICAgd2hldGhlciB0aGUga2V5cyB3ZXJlIHNwZWNpZmllZCBpbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgaW4gY29uZmlnCiAgICAgICAgZmlsZXMiIiIKICAgICAgICBub3JtYWxpemVkID0ge30KICAgICAgICBmb3Iga2V5LCB2YWwgaW4gaXRlbXM6CiAgICAgICAgICAgIGtleSA9IGtleS5yZXBsYWNlKCdfJywgJy0nKQogICAgICAgICAgICBpZiBub3Qga2V5LnN0YXJ0c3dpdGgoJy0tJyk6CiAgICAgICAgICAgICAgICBrZXkgPSAnLS0lcycgJSBrZXkgICMgb25seSBwcmVmZXIgbG9uZyBvcHRzCiAgICAgICAgICAgIG5vcm1hbGl6ZWRba2V5XSA9IHZhbAogICAgICAgIHJldHVybiBub3JtYWxpemVkCgogICAgZGVmIGdldF9jb25maWdfc2VjdGlvbihzZWxmLCBuYW1lKToKICAgICAgICAiIiJHZXQgYSBzZWN0aW9uIG9mIGEgY29uZmlndXJhdGlvbiIiIgogICAgICAgIGlmIHNlbGYuY29uZmlnLmhhc19zZWN0aW9uKG5hbWUpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5jb25maWcuaXRlbXMobmFtZSkKICAgICAgICByZXR1cm4gW10KCiAgICBkZWYgZ2V0X2Vudmlyb25fdmFycyhzZWxmKToKICAgICAgICAiIiJSZXR1cm5zIGEgZ2VuZXJhdG9yIHdpdGggYWxsIGVudmlyb25tZW50YWwgdmFycyB3aXRoIHByZWZpeCBQSVBfIiIiCiAgICAgICAgZm9yIGtleSwgdmFsIGluIG9zLmVudmlyb24uaXRlbXMoKToKICAgICAgICAgICAgaWYgX2Vudmlyb25fcHJlZml4X3JlLnNlYXJjaChrZXkpOgogICAgICAgICAgICAgICAgeWllbGQgKF9lbnZpcm9uX3ByZWZpeF9yZS5zdWIoIiIsIGtleSkubG93ZXIoKSwgdmFsKQoKICAgIGRlZiBnZXRfZGVmYXVsdF92YWx1ZXMoc2VsZik6CiAgICAgICAgIiIiT3ZlcnJpZGluZyB0byBtYWtlIHVwZGF0aW5nIHRoZSBkZWZhdWx0cyBhZnRlciBpbnN0YW50aWF0aW9uIG9mCiAgICAgICAgdGhlIG9wdGlvbiBwYXJzZXIgcG9zc2libGUsIF91cGRhdGVfZGVmYXVsdHMoKSBkb2VzIHRoZSBkaXJ0eSB3b3JrLiIiIgogICAgICAgIGlmIG5vdCBzZWxmLnByb2Nlc3NfZGVmYXVsdF92YWx1ZXM6CiAgICAgICAgICAgICMgT2xkLCBwcmUtT3B0aWsgMS41IGJlaGF2aW91ci4KICAgICAgICAgICAgcmV0dXJuIG9wdHBhcnNlLlZhbHVlcyhzZWxmLmRlZmF1bHRzKQoKICAgICAgICBkZWZhdWx0cyA9IHNlbGYuX3VwZGF0ZV9kZWZhdWx0cyhzZWxmLmRlZmF1bHRzLmNvcHkoKSkgICMgb3VycwogICAgICAgIGZvciBvcHRpb24gaW4gc2VsZi5fZ2V0X2FsbF9vcHRpb25zKCk6CiAgICAgICAgICAgIGRlZmF1bHQgPSBkZWZhdWx0cy5nZXQob3B0aW9uLmRlc3QpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGVmYXVsdCwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgICAgIG9wdF9zdHIgPSBvcHRpb24uZ2V0X29wdF9zdHJpbmcoKQogICAgICAgICAgICAgICAgZGVmYXVsdHNbb3B0aW9uLmRlc3RdID0gb3B0aW9uLmNoZWNrX3ZhbHVlKG9wdF9zdHIsIGRlZmF1bHQpCiAgICAgICAgcmV0dXJuIG9wdHBhcnNlLlZhbHVlcyhkZWZhdWx0cykKCiAgICBkZWYgZXJyb3Ioc2VsZiwgbXNnKToKICAgICAgICBzZWxmLnByaW50X3VzYWdlKHN5cy5zdGRlcnIpCiAgICAgICAgc2VsZi5leGl0KDIsICIlc1xuIiAlIG1zZykKUEsDBBQAAAAAAAAAIQBLmTIhWkAAAFpAAAAhAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9jbWRvcHRpb25zLnB5IiIiCnNoYXJlZCBvcHRpb25zIGFuZCBncm91cHMKClRoZSBwcmluY2lwbGUgaGVyZSBpcyB0byBkZWZpbmUgb3B0aW9ucyBvbmNlLCBidXQgKm5vdCogaW5zdGFudGlhdGUgdGhlbQpnbG9iYWxseS4gT25lIHJlYXNvbiBiZWluZyB0aGF0IG9wdGlvbnMgd2l0aCBhY3Rpb249J2FwcGVuZCcgY2FuIGNhcnJ5IHN0YXRlCmJldHdlZW4gcGFyc2VzLiBwaXAgcGFyc2VzIGdlbmVyYWwgb3B0aW9ucyB0d2ljZSBpbnRlcm5hbGx5LCBhbmQgc2hvdWxkbid0CnBhc3Mgb24gc3RhdGUuIFRvIGJlIGNvbnNpc3RlbnQsIGFsbCBvcHRpb25zIHdpbGwgZm9sbG93IHRoaXMgZGVzaWduLgoKIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgpmcm9tIGZ1bmN0b29scyBpbXBvcnQgcGFydGlhbApmcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25Hcm91cCwgU1VQUFJFU1NfSEVMUCwgT3B0aW9uCmltcG9ydCB3YXJuaW5ncwoKZnJvbSBwaXAuaW5kZXggaW1wb3J0ICgKICAgIEZvcm1hdENvbnRyb2wsIGZtdF9jdGxfaGFuZGxlX211dHVhbF9leGNsdWRlLCBmbXRfY3RsX25vX2JpbmFyeSwKICAgIGZtdF9jdGxfbm9fdXNlX3doZWVsKQpmcm9tIHBpcC5tb2RlbHMgaW1wb3J0IFB5UEkKZnJvbSBwaXAubG9jYXRpb25zIGltcG9ydCBVU0VSX0NBQ0hFX0RJUiwgc3JjX3ByZWZpeApmcm9tIHBpcC51dGlscy5oYXNoZXMgaW1wb3J0IFNUUk9OR19IQVNIRVMKCgpkZWYgbWFrZV9vcHRpb25fZ3JvdXAoZ3JvdXAsIHBhcnNlcik6CiAgICAiIiIKICAgIFJldHVybiBhbiBPcHRpb25Hcm91cCBvYmplY3QKICAgIGdyb3VwICAtLSBhc3N1bWVkIHRvIGJlIGRpY3Qgd2l0aCAnbmFtZScgYW5kICdvcHRpb25zJyBrZXlzCiAgICBwYXJzZXIgLS0gYW4gb3B0cGFyc2UgUGFyc2VyCiAgICAiIiIKICAgIG9wdGlvbl9ncm91cCA9IE9wdGlvbkdyb3VwKHBhcnNlciwgZ3JvdXBbJ25hbWUnXSkKICAgIGZvciBvcHRpb24gaW4gZ3JvdXBbJ29wdGlvbnMnXToKICAgICAgICBvcHRpb25fZ3JvdXAuYWRkX29wdGlvbihvcHRpb24oKSkKICAgIHJldHVybiBvcHRpb25fZ3JvdXAKCgpkZWYgcmVzb2x2ZV93aGVlbF9ub191c2VfYmluYXJ5KG9wdGlvbnMpOgogICAgaWYgbm90IG9wdGlvbnMudXNlX3doZWVsOgogICAgICAgIGNvbnRyb2wgPSBvcHRpb25zLmZvcm1hdF9jb250cm9sCiAgICAgICAgZm10X2N0bF9ub191c2Vfd2hlZWwoY29udHJvbCkKCgpkZWYgY2hlY2tfaW5zdGFsbF9idWlsZF9nbG9iYWwob3B0aW9ucywgY2hlY2tfb3B0aW9ucz1Ob25lKToKICAgICIiIkRpc2FibGUgd2hlZWxzIGlmIHBlci1zZXR1cC5weSBjYWxsIG9wdGlvbnMgYXJlIHNldC4KCiAgICA6cGFyYW0gb3B0aW9uczogVGhlIE9wdGlvblBhcnNlciBvcHRpb25zIHRvIHVwZGF0ZS4KICAgIDpwYXJhbSBjaGVja19vcHRpb25zOiBUaGUgb3B0aW9ucyB0byBjaGVjaywgaWYgbm90IHN1cHBsaWVkIGRlZmF1bHRzIHRvCiAgICAgICAgb3B0aW9ucy4KICAgICIiIgogICAgaWYgY2hlY2tfb3B0aW9ucyBpcyBOb25lOgogICAgICAgIGNoZWNrX29wdGlvbnMgPSBvcHRpb25zCgogICAgZGVmIGdldG5hbWUobik6CiAgICAgICAgcmV0dXJuIGdldGF0dHIoY2hlY2tfb3B0aW9ucywgbiwgTm9uZSkKICAgIG5hbWVzID0gWyJidWlsZF9vcHRpb25zIiwgImdsb2JhbF9vcHRpb25zIiwgImluc3RhbGxfb3B0aW9ucyJdCiAgICBpZiBhbnkobWFwKGdldG5hbWUsIG5hbWVzKSk6CiAgICAgICAgY29udHJvbCA9IG9wdGlvbnMuZm9ybWF0X2NvbnRyb2wKICAgICAgICBmbXRfY3RsX25vX2JpbmFyeShjb250cm9sKQogICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICdEaXNhYmxpbmcgYWxsIHVzZSBvZiB3aGVlbHMgZHVlIHRvIHRoZSB1c2Ugb2YgLS1idWlsZC1vcHRpb25zICcKICAgICAgICAgICAgJy8gLS1nbG9iYWwtb3B0aW9ucyAvIC0taW5zdGFsbC1vcHRpb25zLicsIHN0YWNrbGV2ZWw9MikKCgojIyMjIyMjIyMjIwojIG9wdGlvbnMgIwojIyMjIyMjIyMjIwoKaGVscF8gPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy1oJywgJy0taGVscCcsCiAgICBkZXN0PSdoZWxwJywKICAgIGFjdGlvbj0naGVscCcsCiAgICBoZWxwPSdTaG93IGhlbHAuJykKCmlzb2xhdGVkX21vZGUgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIi0taXNvbGF0ZWQiLAogICAgZGVzdD0iaXNvbGF0ZWRfbW9kZSIsCiAgICBhY3Rpb249InN0b3JlX3RydWUiLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9KAogICAgICAgICJSdW4gcGlwIGluIGFuIGlzb2xhdGVkIG1vZGUsIGlnbm9yaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgdXNlciAiCiAgICAgICAgImNvbmZpZ3VyYXRpb24uIgogICAgKSwKKQoKcmVxdWlyZV92aXJ0dWFsZW52ID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICMgUnVuIG9ubHkgaWYgaW5zaWRlIGEgdmlydHVhbGVudiwgYmFpbCBpZiBub3QuCiAgICAnLS1yZXF1aXJlLXZpcnR1YWxlbnYnLCAnLS1yZXF1aXJlLXZlbnYnLAogICAgZGVzdD0ncmVxdWlyZV92ZW52JywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD1TVVBQUkVTU19IRUxQKQoKdmVyYm9zZSA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLXYnLCAnLS12ZXJib3NlJywKICAgIGRlc3Q9J3ZlcmJvc2UnLAogICAgYWN0aW9uPSdjb3VudCcsCiAgICBkZWZhdWx0PTAsCiAgICBoZWxwPSdHaXZlIG1vcmUgb3V0cHV0LiBPcHRpb24gaXMgYWRkaXRpdmUsIGFuZCBjYW4gYmUgdXNlZCB1cCB0byAzIHRpbWVzLicKKQoKdmVyc2lvbiA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLVYnLCAnLS12ZXJzaW9uJywKICAgIGRlc3Q9J3ZlcnNpb24nLAogICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgIGhlbHA9J1Nob3cgdmVyc2lvbiBhbmQgZXhpdC4nKQoKcXVpZXQgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy1xJywgJy0tcXVpZXQnLAogICAgZGVzdD0ncXVpZXQnLAogICAgYWN0aW9uPSdjb3VudCcsCiAgICBkZWZhdWx0PTAsCiAgICBoZWxwPSgnR2l2ZSBsZXNzIG91dHB1dC4gT3B0aW9uIGlzIGFkZGl0aXZlLCBhbmQgY2FuIGJlIHVzZWQgdXAgdG8gMycKICAgICAgICAgICcgdGltZXMgKGNvcnJlc3BvbmRpbmcgdG8gV0FSTklORywgRVJST1IsIGFuZCBDUklUSUNBTCBsb2dnaW5nJwogICAgICAgICAgJyBsZXZlbHMpLicpCikKCmxvZyA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAiLS1sb2ciLCAiLS1sb2ctZmlsZSIsICItLWxvY2FsLWxvZyIsCiAgICBkZXN0PSJsb2ciLAogICAgbWV0YXZhcj0icGF0aCIsCiAgICBoZWxwPSJQYXRoIHRvIGEgdmVyYm9zZSBhcHBlbmRpbmcgbG9nLiIKKQoKbm9faW5wdXQgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIyBEb24ndCBhc2sgZm9yIGlucHV0CiAgICAnLS1uby1pbnB1dCcsCiAgICBkZXN0PSdub19pbnB1dCcsCiAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9U1VQUFJFU1NfSEVMUCkKCnByb3h5ID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLXByb3h5JywKICAgIGRlc3Q9J3Byb3h5JywKICAgIHR5cGU9J3N0cicsCiAgICBkZWZhdWx0PScnLAogICAgaGVscD0iU3BlY2lmeSBhIHByb3h5IGluIHRoZSBmb3JtIFt1c2VyOnBhc3N3ZEBdcHJveHkuc2VydmVyOnBvcnQuIikKCnJldHJpZXMgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tcmV0cmllcycsCiAgICBkZXN0PSdyZXRyaWVzJywKICAgIHR5cGU9J2ludCcsCiAgICBkZWZhdWx0PTUsCiAgICBoZWxwPSJNYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGVhY2ggY29ubmVjdGlvbiBzaG91bGQgYXR0ZW1wdCAiCiAgICAgICAgICIoZGVmYXVsdCAlZGVmYXVsdCB0aW1lcykuIikKCnRpbWVvdXQgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tdGltZW91dCcsICctLWRlZmF1bHQtdGltZW91dCcsCiAgICBtZXRhdmFyPSdzZWMnLAogICAgZGVzdD0ndGltZW91dCcsCiAgICB0eXBlPSdmbG9hdCcsCiAgICBkZWZhdWx0PTE1LAogICAgaGVscD0nU2V0IHRoZSBzb2NrZXQgdGltZW91dCAoZGVmYXVsdCAlZGVmYXVsdCBzZWNvbmRzKS4nKQoKZGVmYXVsdF92Y3MgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIyBUaGUgZGVmYXVsdCB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIGZvciBlZGl0YWJsZXMsIGUuZy4gJ3N2bicKICAgICctLWRlZmF1bHQtdmNzJywKICAgIGRlc3Q9J2RlZmF1bHRfdmNzJywKICAgIHR5cGU9J3N0cicsCiAgICBkZWZhdWx0PScnLAogICAgaGVscD1TVVBQUkVTU19IRUxQKQoKc2tpcF9yZXF1aXJlbWVudHNfcmVnZXggPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIyBBIHJlZ2V4IHRvIGJlIHVzZWQgdG8gc2tpcCByZXF1aXJlbWVudHMKICAgICctLXNraXAtcmVxdWlyZW1lbnRzLXJlZ2V4JywKICAgIGRlc3Q9J3NraXBfcmVxdWlyZW1lbnRzX3JlZ2V4JywKICAgIHR5cGU9J3N0cicsCiAgICBkZWZhdWx0PScnLAogICAgaGVscD1TVVBQUkVTU19IRUxQKQoKCmRlZiBleGlzdHNfYWN0aW9uKCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICMgT3B0aW9uIHdoZW4gcGF0aCBhbHJlYWR5IGV4aXN0CiAgICAgICAgJy0tZXhpc3RzLWFjdGlvbicsCiAgICAgICAgZGVzdD0nZXhpc3RzX2FjdGlvbicsCiAgICAgICAgdHlwZT0nY2hvaWNlJywKICAgICAgICBjaG9pY2VzPVsncycsICdpJywgJ3cnLCAnYicsICdhJ10sCiAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgbWV0YXZhcj0nYWN0aW9uJywKICAgICAgICBoZWxwPSJEZWZhdWx0IGFjdGlvbiB3aGVuIGEgcGF0aCBhbHJlYWR5IGV4aXN0czogIgogICAgICAgICIocyl3aXRjaCwgKGkpZ25vcmUsICh3KWlwZSwgKGIpYWNrdXAsIChhKWJvcnQuIikKCgpjZXJ0ID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLWNlcnQnLAogICAgZGVzdD0nY2VydCcsCiAgICB0eXBlPSdzdHInLAogICAgbWV0YXZhcj0ncGF0aCcsCiAgICBoZWxwPSJQYXRoIHRvIGFsdGVybmF0ZSBDQSBidW5kbGUuIikKCmNsaWVudF9jZXJ0ID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLWNsaWVudC1jZXJ0JywKICAgIGRlc3Q9J2NsaWVudF9jZXJ0JywKICAgIHR5cGU9J3N0cicsCiAgICBkZWZhdWx0PU5vbmUsCiAgICBtZXRhdmFyPSdwYXRoJywKICAgIGhlbHA9IlBhdGggdG8gU1NMIGNsaWVudCBjZXJ0aWZpY2F0ZSwgYSBzaW5nbGUgZmlsZSBjb250YWluaW5nIHRoZSAiCiAgICAgICAgICJwcml2YXRlIGtleSBhbmQgdGhlIGNlcnRpZmljYXRlIGluIFBFTSBmb3JtYXQuIikKCmluZGV4X3VybCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLWknLCAnLS1pbmRleC11cmwnLCAnLS1weXBpLXVybCcsCiAgICBkZXN0PSdpbmRleF91cmwnLAogICAgbWV0YXZhcj0nVVJMJywKICAgIGRlZmF1bHQ9UHlQSS5zaW1wbGVfdXJsLAogICAgaGVscD0iQmFzZSBVUkwgb2YgUHl0aG9uIFBhY2thZ2UgSW5kZXggKGRlZmF1bHQgJWRlZmF1bHQpLiAiCiAgICAgICAgICJUaGlzIHNob3VsZCBwb2ludCB0byBhIHJlcG9zaXRvcnkgY29tcGxpYW50IHdpdGggUEVQIDUwMyAiCiAgICAgICAgICIodGhlIHNpbXBsZSByZXBvc2l0b3J5IEFQSSkgb3IgYSBsb2NhbCBkaXJlY3RvcnkgbGFpZCBvdXQgIgogICAgICAgICAiaW4gdGhlIHNhbWUgZm9ybWF0LiIpCgoKZGVmIGV4dHJhX2luZGV4X3VybCgpOgogICAgcmV0dXJuIE9wdGlvbigKICAgICAgICAnLS1leHRyYS1pbmRleC11cmwnLAogICAgICAgIGRlc3Q9J2V4dHJhX2luZGV4X3VybHMnLAogICAgICAgIG1ldGF2YXI9J1VSTCcsCiAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgIGRlZmF1bHQ9W10sCiAgICAgICAgaGVscD0iRXh0cmEgVVJMcyBvZiBwYWNrYWdlIGluZGV4ZXMgdG8gdXNlIGluIGFkZGl0aW9uIHRvICIKICAgICAgICAgICAgICItLWluZGV4LXVybC4gU2hvdWxkIGZvbGxvdyB0aGUgc2FtZSBydWxlcyBhcyAiCiAgICAgICAgICAgICAiLS1pbmRleC11cmwuIgogICAgKQoKCm5vX2luZGV4ID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLW5vLWluZGV4JywKICAgIGRlc3Q9J25vX2luZGV4JywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD0nSWdub3JlIHBhY2thZ2UgaW5kZXggKG9ubHkgbG9va2luZyBhdCAtLWZpbmQtbGlua3MgVVJMcyBpbnN0ZWFkKS4nKQoKCmRlZiBmaW5kX2xpbmtzKCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICctZicsICctLWZpbmQtbGlua3MnLAogICAgICAgIGRlc3Q9J2ZpbmRfbGlua3MnLAogICAgICAgIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgIG1ldGF2YXI9J3VybCcsCiAgICAgICAgaGVscD0iSWYgYSB1cmwgb3IgcGF0aCB0byBhbiBodG1sIGZpbGUsIHRoZW4gcGFyc2UgZm9yIGxpbmtzIHRvICIKICAgICAgICAgICAgICJhcmNoaXZlcy4gSWYgYSBsb2NhbCBwYXRoIG9yIGZpbGU6Ly8gdXJsIHRoYXQncyBhIGRpcmVjdG9yeSwgIgogICAgICAgICAgICAgInRoZW4gbG9vayBmb3IgYXJjaGl2ZXMgaW4gdGhlIGRpcmVjdG9yeSBsaXN0aW5nLiIpCgoKZGVmIGFsbG93X2V4dGVybmFsKCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICItLWFsbG93LWV4dGVybmFsIiwKICAgICAgICBkZXN0PSJhbGxvd19leHRlcm5hbCIsCiAgICAgICAgYWN0aW9uPSJhcHBlbmQiLAogICAgICAgIGRlZmF1bHQ9W10sCiAgICAgICAgbWV0YXZhcj0iUEFDS0FHRSIsCiAgICAgICAgaGVscD1TVVBQUkVTU19IRUxQLAogICAgKQoKCmFsbG93X2FsbF9leHRlcm5hbCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAiLS1hbGxvdy1hbGwtZXh0ZXJuYWwiLAogICAgZGVzdD0iYWxsb3dfYWxsX2V4dGVybmFsIiwKICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD1TVVBQUkVTU19IRUxQLAopCgoKZGVmIHRydXN0ZWRfaG9zdCgpOgogICAgcmV0dXJuIE9wdGlvbigKICAgICAgICAiLS10cnVzdGVkLWhvc3QiLAogICAgICAgIGRlc3Q9InRydXN0ZWRfaG9zdHMiLAogICAgICAgIGFjdGlvbj0iYXBwZW5kIiwKICAgICAgICBtZXRhdmFyPSJIT1NUTkFNRSIsCiAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICBoZWxwPSJNYXJrIHRoaXMgaG9zdCBhcyB0cnVzdGVkLCBldmVuIHRob3VnaCBpdCBkb2VzIG5vdCBoYXZlIHZhbGlkICIKICAgICAgICAgICAgICJvciBhbnkgSFRUUFMuIiwKICAgICkKCgojIFJlbW92ZSBhZnRlciA3LjAKbm9fYWxsb3dfZXh0ZXJuYWwgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIi0tbm8tYWxsb3ctZXh0ZXJuYWwiLAogICAgZGVzdD0iYWxsb3dfYWxsX2V4dGVybmFsIiwKICAgIGFjdGlvbj0ic3RvcmVfZmFsc2UiLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9U1VQUFJFU1NfSEVMUCwKKQoKCiMgUmVtb3ZlIC0tYWxsb3ctaW5zZWN1cmUgYWZ0ZXIgNy4wCmRlZiBhbGxvd191bnNhZmUoKToKICAgIHJldHVybiBPcHRpb24oCiAgICAgICAgIi0tYWxsb3ctdW52ZXJpZmllZCIsICItLWFsbG93LWluc2VjdXJlIiwKICAgICAgICBkZXN0PSJhbGxvd191bnZlcmlmaWVkIiwKICAgICAgICBhY3Rpb249ImFwcGVuZCIsCiAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICBtZXRhdmFyPSJQQUNLQUdFIiwKICAgICAgICBoZWxwPVNVUFBSRVNTX0hFTFAsCiAgICApCgojIFJlbW92ZSBhZnRlciA3LjAKbm9fYWxsb3dfdW5zYWZlID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICItLW5vLWFsbG93LWluc2VjdXJlIiwKICAgIGRlc3Q9ImFsbG93X2FsbF9pbnNlY3VyZSIsCiAgICBhY3Rpb249InN0b3JlX2ZhbHNlIiwKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPVNVUFBSRVNTX0hFTFAKKQoKIyBSZW1vdmUgYWZ0ZXIgMS41CnByb2Nlc3NfZGVwZW5kZW5jeV9saW5rcyA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAiLS1wcm9jZXNzLWRlcGVuZGVuY3ktbGlua3MiLAogICAgZGVzdD0icHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzIiwKICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD0iRW5hYmxlIHRoZSBwcm9jZXNzaW5nIG9mIGRlcGVuZGVuY3kgbGlua3MuIiwKKQoKCmRlZiBjb25zdHJhaW50cygpOgogICAgcmV0dXJuIE9wdGlvbigKICAgICAgICAnLWMnLCAnLS1jb25zdHJhaW50JywKICAgICAgICBkZXN0PSdjb25zdHJhaW50cycsCiAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgIGRlZmF1bHQ9W10sCiAgICAgICAgbWV0YXZhcj0nZmlsZScsCiAgICAgICAgaGVscD0nQ29uc3RyYWluIHZlcnNpb25zIHVzaW5nIHRoZSBnaXZlbiBjb25zdHJhaW50cyBmaWxlLiAnCiAgICAgICAgJ1RoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIG11bHRpcGxlIHRpbWVzLicpCgoKZGVmIHJlcXVpcmVtZW50cygpOgogICAgcmV0dXJuIE9wdGlvbigKICAgICAgICAnLXInLCAnLS1yZXF1aXJlbWVudCcsCiAgICAgICAgZGVzdD0ncmVxdWlyZW1lbnRzJywKICAgICAgICBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICBtZXRhdmFyPSdmaWxlJywKICAgICAgICBoZWxwPSdJbnN0YWxsIGZyb20gdGhlIGdpdmVuIHJlcXVpcmVtZW50cyBmaWxlLiAnCiAgICAgICAgJ1RoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIG11bHRpcGxlIHRpbWVzLicpCgoKZGVmIGVkaXRhYmxlKCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICctZScsICctLWVkaXRhYmxlJywKICAgICAgICBkZXN0PSdlZGl0YWJsZXMnLAogICAgICAgIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgIG1ldGF2YXI9J3BhdGgvdXJsJywKICAgICAgICBoZWxwPSgnSW5zdGFsbCBhIHByb2plY3QgaW4gZWRpdGFibGUgbW9kZSAoaS5lLiBzZXR1cHRvb2xzICcKICAgICAgICAgICAgICAnImRldmVsb3AgbW9kZSIpIGZyb20gYSBsb2NhbCBwcm9qZWN0IHBhdGggb3IgYSBWQ1MgdXJsLicpLAogICAgKQoKc3JjID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLXNyYycsICctLXNvdXJjZScsICctLXNvdXJjZS1kaXInLCAnLS1zb3VyY2UtZGlyZWN0b3J5JywKICAgIGRlc3Q9J3NyY19kaXInLAogICAgbWV0YXZhcj0nZGlyJywKICAgIGRlZmF1bHQ9c3JjX3ByZWZpeCwKICAgIGhlbHA9J0RpcmVjdG9yeSB0byBjaGVjayBvdXQgZWRpdGFibGUgcHJvamVjdHMgaW50by4gJwogICAgJ1RoZSBkZWZhdWx0IGluIGEgdmlydHVhbGVudiBpcyAiPHZlbnYgcGF0aD4vc3JjIi4gJwogICAgJ1RoZSBkZWZhdWx0IGZvciBnbG9iYWwgaW5zdGFsbHMgaXMgIjxjdXJyZW50IGRpcj4vc3JjIi4nCikKCiMgWFhYOiBkZXByZWNhdGVkLCByZW1vdmUgaW4gOS4wCnVzZV93aGVlbCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS11c2Utd2hlZWwnLAogICAgZGVzdD0ndXNlX3doZWVsJywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBkZWZhdWx0PVRydWUsCiAgICBoZWxwPVNVUFBSRVNTX0hFTFAsCikKCiMgWFhYOiBkZXByZWNhdGVkLCByZW1vdmUgaW4gOS4wCm5vX3VzZV93aGVlbCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1uby11c2Utd2hlZWwnLAogICAgZGVzdD0ndXNlX3doZWVsJywKICAgIGFjdGlvbj0nc3RvcmVfZmFsc2UnLAogICAgZGVmYXVsdD1UcnVlLAogICAgaGVscD0oJ0RvIG5vdCBGaW5kIGFuZCBwcmVmZXIgd2hlZWwgYXJjaGl2ZXMgd2hlbiBzZWFyY2hpbmcgaW5kZXhlcyBhbmQgJwogICAgICAgICAgJ2ZpbmQtbGlua3MgbG9jYXRpb25zLiBERVBSRUNBVEVEIGluIGZhdm91ciBvZiAtLW5vLWJpbmFyeS4nKSwKKQoKCmRlZiBfZ2V0X2Zvcm1hdF9jb250cm9sKHZhbHVlcywgb3B0aW9uKToKICAgICIiIkdldCBhIGZvcm1hdF9jb250cm9sIG9iamVjdC4iIiIKICAgIHJldHVybiBnZXRhdHRyKHZhbHVlcywgb3B0aW9uLmRlc3QpCgoKZGVmIF9oYW5kbGVfbm9fYmluYXJ5KG9wdGlvbiwgb3B0X3N0ciwgdmFsdWUsIHBhcnNlcik6CiAgICBleGlzdGluZyA9IGdldGF0dHIocGFyc2VyLnZhbHVlcywgb3B0aW9uLmRlc3QpCiAgICBmbXRfY3RsX2hhbmRsZV9tdXR1YWxfZXhjbHVkZSgKICAgICAgICB2YWx1ZSwgZXhpc3Rpbmcubm9fYmluYXJ5LCBleGlzdGluZy5vbmx5X2JpbmFyeSkKCgpkZWYgX2hhbmRsZV9vbmx5X2JpbmFyeShvcHRpb24sIG9wdF9zdHIsIHZhbHVlLCBwYXJzZXIpOgogICAgZXhpc3RpbmcgPSBnZXRhdHRyKHBhcnNlci52YWx1ZXMsIG9wdGlvbi5kZXN0KQogICAgZm10X2N0bF9oYW5kbGVfbXV0dWFsX2V4Y2x1ZGUoCiAgICAgICAgdmFsdWUsIGV4aXN0aW5nLm9ubHlfYmluYXJ5LCBleGlzdGluZy5ub19iaW5hcnkpCgoKZGVmIG5vX2JpbmFyeSgpOgogICAgcmV0dXJuIE9wdGlvbigKICAgICAgICAiLS1uby1iaW5hcnkiLCBkZXN0PSJmb3JtYXRfY29udHJvbCIsIGFjdGlvbj0iY2FsbGJhY2siLAogICAgICAgIGNhbGxiYWNrPV9oYW5kbGVfbm9fYmluYXJ5LCB0eXBlPSJzdHIiLAogICAgICAgIGRlZmF1bHQ9Rm9ybWF0Q29udHJvbChzZXQoKSwgc2V0KCkpLAogICAgICAgIGhlbHA9IkRvIG5vdCB1c2UgYmluYXJ5IHBhY2thZ2VzLiBDYW4gYmUgc3VwcGxpZWQgbXVsdGlwbGUgdGltZXMsIGFuZCAiCiAgICAgICAgICAgICAiZWFjaCB0aW1lIGFkZHMgdG8gdGhlIGV4aXN0aW5nIHZhbHVlLiBBY2NlcHRzIGVpdGhlciA6YWxsOiB0byAiCiAgICAgICAgICAgICAiZGlzYWJsZSBhbGwgYmluYXJ5IHBhY2thZ2VzLCA6bm9uZTogdG8gZW1wdHkgdGhlIHNldCwgb3Igb25lIG9yICIKICAgICAgICAgICAgICJtb3JlIHBhY2thZ2UgbmFtZXMgd2l0aCBjb21tYXMgYmV0d2VlbiB0aGVtLiBOb3RlIHRoYXQgc29tZSAiCiAgICAgICAgICAgICAicGFja2FnZXMgYXJlIHRyaWNreSB0byBjb21waWxlIGFuZCBtYXkgZmFpbCB0byBpbnN0YWxsIHdoZW4gIgogICAgICAgICAgICAgInRoaXMgb3B0aW9uIGlzIHVzZWQgb24gdGhlbS4iKQoKCmRlZiBvbmx5X2JpbmFyeSgpOgogICAgcmV0dXJuIE9wdGlvbigKICAgICAgICAiLS1vbmx5LWJpbmFyeSIsIGRlc3Q9ImZvcm1hdF9jb250cm9sIiwgYWN0aW9uPSJjYWxsYmFjayIsCiAgICAgICAgY2FsbGJhY2s9X2hhbmRsZV9vbmx5X2JpbmFyeSwgdHlwZT0ic3RyIiwKICAgICAgICBkZWZhdWx0PUZvcm1hdENvbnRyb2woc2V0KCksIHNldCgpKSwKICAgICAgICBoZWxwPSJEbyBub3QgdXNlIHNvdXJjZSBwYWNrYWdlcy4gQ2FuIGJlIHN1cHBsaWVkIG11bHRpcGxlIHRpbWVzLCBhbmQgIgogICAgICAgICAgICAgImVhY2ggdGltZSBhZGRzIHRvIHRoZSBleGlzdGluZyB2YWx1ZS4gQWNjZXB0cyBlaXRoZXIgOmFsbDogdG8gIgogICAgICAgICAgICAgImRpc2FibGUgYWxsIHNvdXJjZSBwYWNrYWdlcywgOm5vbmU6IHRvIGVtcHR5IHRoZSBzZXQsIG9yIG9uZSBvciAiCiAgICAgICAgICAgICAibW9yZSBwYWNrYWdlIG5hbWVzIHdpdGggY29tbWFzIGJldHdlZW4gdGhlbS4gUGFja2FnZXMgd2l0aG91dCAiCiAgICAgICAgICAgICAiYmluYXJ5IGRpc3RyaWJ1dGlvbnMgd2lsbCBmYWlsIHRvIGluc3RhbGwgd2hlbiB0aGlzIG9wdGlvbiBpcyAiCiAgICAgICAgICAgICAidXNlZCBvbiB0aGVtLiIpCgoKY2FjaGVfZGlyID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICItLWNhY2hlLWRpciIsCiAgICBkZXN0PSJjYWNoZV9kaXIiLAogICAgZGVmYXVsdD1VU0VSX0NBQ0hFX0RJUiwKICAgIG1ldGF2YXI9ImRpciIsCiAgICBoZWxwPSJTdG9yZSB0aGUgY2FjaGUgZGF0YSBpbiA8ZGlyPi4iCikKCm5vX2NhY2hlID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICItLW5vLWNhY2hlLWRpciIsCiAgICBkZXN0PSJjYWNoZV9kaXIiLAogICAgYWN0aW9uPSJzdG9yZV9mYWxzZSIsCiAgICBoZWxwPSJEaXNhYmxlIHRoZSBjYWNoZS4iLAopCgpub19kZXBzID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLW5vLWRlcHMnLCAnLS1uby1kZXBlbmRlbmNpZXMnLAogICAgZGVzdD0naWdub3JlX2RlcGVuZGVuY2llcycsCiAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9IkRvbid0IGluc3RhbGwgcGFja2FnZSBkZXBlbmRlbmNpZXMuIikKCmJ1aWxkX2RpciA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLWInLCAnLS1idWlsZCcsICctLWJ1aWxkLWRpcicsICctLWJ1aWxkLWRpcmVjdG9yeScsCiAgICBkZXN0PSdidWlsZF9kaXInLAogICAgbWV0YXZhcj0nZGlyJywKICAgIGhlbHA9J0RpcmVjdG9yeSB0byB1bnBhY2sgcGFja2FnZXMgaW50byBhbmQgYnVpbGQgaW4uJwopCgppZ25vcmVfcmVxdWlyZXNfcHl0aG9uID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLWlnbm9yZS1yZXF1aXJlcy1weXRob24nLAogICAgZGVzdD0naWdub3JlX3JlcXVpcmVzX3B5dGhvbicsCiAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgaGVscD0nSWdub3JlIHRoZSBSZXF1aXJlcy1QeXRob24gaW5mb3JtYXRpb24uJykKCmluc3RhbGxfb3B0aW9ucyA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1pbnN0YWxsLW9wdGlvbicsCiAgICBkZXN0PSdpbnN0YWxsX29wdGlvbnMnLAogICAgYWN0aW9uPSdhcHBlbmQnLAogICAgbWV0YXZhcj0nb3B0aW9ucycsCiAgICBoZWxwPSJFeHRyYSBhcmd1bWVudHMgdG8gYmUgc3VwcGxpZWQgdG8gdGhlIHNldHVwLnB5IGluc3RhbGwgIgogICAgICAgICAiY29tbWFuZCAodXNlIGxpa2UgLS1pbnN0YWxsLW9wdGlvbj1cIi0taW5zdGFsbC1zY3JpcHRzPS91c3IvbG9jYWwvIgogICAgICAgICAiYmluXCIpLiBVc2UgbXVsdGlwbGUgLS1pbnN0YWxsLW9wdGlvbiBvcHRpb25zIHRvIHBhc3MgbXVsdGlwbGUgIgogICAgICAgICAib3B0aW9ucyB0byBzZXR1cC5weSBpbnN0YWxsLiBJZiB5b3UgYXJlIHVzaW5nIGFuIG9wdGlvbiB3aXRoIGEgIgogICAgICAgICAiZGlyZWN0b3J5IHBhdGgsIGJlIHN1cmUgdG8gdXNlIGFic29sdXRlIHBhdGguIikKCmdsb2JhbF9vcHRpb25zID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLWdsb2JhbC1vcHRpb24nLAogICAgZGVzdD0nZ2xvYmFsX29wdGlvbnMnLAogICAgYWN0aW9uPSdhcHBlbmQnLAogICAgbWV0YXZhcj0nb3B0aW9ucycsCiAgICBoZWxwPSJFeHRyYSBnbG9iYWwgb3B0aW9ucyB0byBiZSBzdXBwbGllZCB0byB0aGUgc2V0dXAucHkgIgogICAgICAgICAiY2FsbCBiZWZvcmUgdGhlIGluc3RhbGwgY29tbWFuZC4iKQoKbm9fY2xlYW4gPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tbm8tY2xlYW4nLAogICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPSJEb24ndCBjbGVhbiB1cCBidWlsZCBkaXJlY3Rvcmllcy4iKQoKcHJlID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLXByZScsCiAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9IkluY2x1ZGUgcHJlLXJlbGVhc2UgYW5kIGRldmVsb3BtZW50IHZlcnNpb25zLiBCeSBkZWZhdWx0LCAiCiAgICAgICAgICJwaXAgb25seSBmaW5kcyBzdGFibGUgdmVyc2lvbnMuIikKCmRpc2FibGVfcGlwX3ZlcnNpb25fY2hlY2sgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIi0tZGlzYWJsZS1waXAtdmVyc2lvbi1jaGVjayIsCiAgICBkZXN0PSJkaXNhYmxlX3BpcF92ZXJzaW9uX2NoZWNrIiwKICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD0iRG9uJ3QgcGVyaW9kaWNhbGx5IGNoZWNrIFB5UEkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBuZXcgdmVyc2lvbiAiCiAgICAgICAgICJvZiBwaXAgaXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZC4gSW1wbGllZCB3aXRoIC0tbm8taW5kZXguIikKCiMgRGVwcmVjYXRlZCwgUmVtb3ZlIGxhdGVyCmFsd2F5c191bnppcCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLVonLCAnLS1hbHdheXMtdW56aXAnLAogICAgZGVzdD0nYWx3YXlzX3VuemlwJywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBoZWxwPVNVUFBSRVNTX0hFTFAsCikKCgpkZWYgX21lcmdlX2hhc2gob3B0aW9uLCBvcHRfc3RyLCB2YWx1ZSwgcGFyc2VyKToKICAgICIiIkdpdmVuIGEgdmFsdWUgc3BlbGxlZCAiYWxnbzpkaWdlc3QiLCBhcHBlbmQgdGhlIGRpZ2VzdCB0byBhIGxpc3QKICAgIHBvaW50ZWQgdG8gaW4gYSBkaWN0IGJ5IHRoZSBhbGdvIG5hbWUuIiIiCiAgICBpZiBub3QgcGFyc2VyLnZhbHVlcy5oYXNoZXM6CiAgICAgICAgcGFyc2VyLnZhbHVlcy5oYXNoZXMgPSB7fQogICAgdHJ5OgogICAgICAgIGFsZ28sIGRpZ2VzdCA9IHZhbHVlLnNwbGl0KCc6JywgMSkKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHBhcnNlci5lcnJvcignQXJndW1lbnRzIHRvICVzIG11c3QgYmUgYSBoYXNoIG5hbWUgJwogICAgICAgICAgICAgICAgICAgICAnZm9sbG93ZWQgYnkgYSB2YWx1ZSwgbGlrZSAtLWhhc2g9c2hhMjU2OmFiY2RlLi4uJyAlCiAgICAgICAgICAgICAgICAgICAgIG9wdF9zdHIpCiAgICBpZiBhbGdvIG5vdCBpbiBTVFJPTkdfSEFTSEVTOgogICAgICAgIHBhcnNlci5lcnJvcignQWxsb3dlZCBoYXNoIGFsZ29yaXRobXMgZm9yICVzIGFyZSAlcy4nICUKICAgICAgICAgICAgICAgICAgICAgKG9wdF9zdHIsICcsICcuam9pbihTVFJPTkdfSEFTSEVTKSkpCiAgICBwYXJzZXIudmFsdWVzLmhhc2hlcy5zZXRkZWZhdWx0KGFsZ28sIFtdKS5hcHBlbmQoZGlnZXN0KQoKCmhhc2ggPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0taGFzaCcsCiAgICAjIEhhc2ggdmFsdWVzIGV2ZW50dWFsbHkgZW5kIHVwIGluIEluc3RhbGxSZXF1aXJlbWVudC5oYXNoZXMgZHVlIHRvCiAgICAjIF9fZGljdF9fIGNvcHlpbmcgaW4gcHJvY2Vzc19saW5lKCkuCiAgICBkZXN0PSdoYXNoZXMnLAogICAgYWN0aW9uPSdjYWxsYmFjaycsCiAgICBjYWxsYmFjaz1fbWVyZ2VfaGFzaCwKICAgIHR5cGU9J3N0cmluZycsCiAgICBoZWxwPSJWZXJpZnkgdGhhdCB0aGUgcGFja2FnZSdzIGFyY2hpdmUgbWF0Y2hlcyB0aGlzICIKICAgICAgICAgJ2hhc2ggYmVmb3JlIGluc3RhbGxpbmcuIEV4YW1wbGU6IC0taGFzaD1zaGEyNTY6YWJjZGVmLi4uJykKCgpyZXF1aXJlX2hhc2hlcyA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1yZXF1aXJlLWhhc2hlcycsCiAgICBkZXN0PSdyZXF1aXJlX2hhc2hlcycsCiAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9J1JlcXVpcmUgYSBoYXNoIHRvIGNoZWNrIGVhY2ggcmVxdWlyZW1lbnQgYWdhaW5zdCwgZm9yICcKICAgICAgICAgJ3JlcGVhdGFibGUgaW5zdGFsbHMuIFRoaXMgb3B0aW9uIGlzIGltcGxpZWQgd2hlbiBhbnkgcGFja2FnZSBpbiBhICcKICAgICAgICAgJ3JlcXVpcmVtZW50cyBmaWxlIGhhcyBhIC0taGFzaCBvcHRpb24uJykKCgojIyMjIyMjIyMjCiMgZ3JvdXBzICMKIyMjIyMjIyMjIwoKZ2VuZXJhbF9ncm91cCA9IHsKICAgICduYW1lJzogJ0dlbmVyYWwgT3B0aW9ucycsCiAgICAnb3B0aW9ucyc6IFsKICAgICAgICBoZWxwXywKICAgICAgICBpc29sYXRlZF9tb2RlLAogICAgICAgIHJlcXVpcmVfdmlydHVhbGVudiwKICAgICAgICB2ZXJib3NlLAogICAgICAgIHZlcnNpb24sCiAgICAgICAgcXVpZXQsCiAgICAgICAgbG9nLAogICAgICAgIG5vX2lucHV0LAogICAgICAgIHByb3h5LAogICAgICAgIHJldHJpZXMsCiAgICAgICAgdGltZW91dCwKICAgICAgICBkZWZhdWx0X3ZjcywKICAgICAgICBza2lwX3JlcXVpcmVtZW50c19yZWdleCwKICAgICAgICBleGlzdHNfYWN0aW9uLAogICAgICAgIHRydXN0ZWRfaG9zdCwKICAgICAgICBjZXJ0LAogICAgICAgIGNsaWVudF9jZXJ0LAogICAgICAgIGNhY2hlX2RpciwKICAgICAgICBub19jYWNoZSwKICAgICAgICBkaXNhYmxlX3BpcF92ZXJzaW9uX2NoZWNrLAogICAgXQp9Cgpub25fZGVwcmVjYXRlZF9pbmRleF9ncm91cCA9IHsKICAgICduYW1lJzogJ1BhY2thZ2UgSW5kZXggT3B0aW9ucycsCiAgICAnb3B0aW9ucyc6IFsKICAgICAgICBpbmRleF91cmwsCiAgICAgICAgZXh0cmFfaW5kZXhfdXJsLAogICAgICAgIG5vX2luZGV4LAogICAgICAgIGZpbmRfbGlua3MsCiAgICAgICAgcHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzLAogICAgXQp9CgppbmRleF9ncm91cCA9IHsKICAgICduYW1lJzogJ1BhY2thZ2UgSW5kZXggT3B0aW9ucyAoaW5jbHVkaW5nIGRlcHJlY2F0ZWQgb3B0aW9ucyknLAogICAgJ29wdGlvbnMnOiBub25fZGVwcmVjYXRlZF9pbmRleF9ncm91cFsnb3B0aW9ucyddICsgWwogICAgICAgIGFsbG93X2V4dGVybmFsLAogICAgICAgIGFsbG93X2FsbF9leHRlcm5hbCwKICAgICAgICBub19hbGxvd19leHRlcm5hbCwKICAgICAgICBhbGxvd191bnNhZmUsCiAgICAgICAgbm9fYWxsb3dfdW5zYWZlLAogICAgXQp9ClBLAwQUAAAAAAAAACEAkA2HQ8QIAADECAAAKAAAAHB5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvX19pbml0X18ucHkiIiIKUGFja2FnZSBjb250YWluaW5nIGFsbCBwaXAgY29tbWFuZHMKIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgpmcm9tIHBpcC5jb21tYW5kcy5jb21wbGV0aW9uIGltcG9ydCBDb21wbGV0aW9uQ29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy5kb3dubG9hZCBpbXBvcnQgRG93bmxvYWRDb21tYW5kCmZyb20gcGlwLmNvbW1hbmRzLmZyZWV6ZSBpbXBvcnQgRnJlZXplQ29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy5oYXNoIGltcG9ydCBIYXNoQ29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy5oZWxwIGltcG9ydCBIZWxwQ29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy5saXN0IGltcG9ydCBMaXN0Q29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy5jaGVjayBpbXBvcnQgQ2hlY2tDb21tYW5kCmZyb20gcGlwLmNvbW1hbmRzLnNlYXJjaCBpbXBvcnQgU2VhcmNoQ29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy5zaG93IGltcG9ydCBTaG93Q29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy5pbnN0YWxsIGltcG9ydCBJbnN0YWxsQ29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy51bmluc3RhbGwgaW1wb3J0IFVuaW5zdGFsbENvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMud2hlZWwgaW1wb3J0IFdoZWVsQ29tbWFuZAoKCmNvbW1hbmRzX2RpY3QgPSB7CiAgICBDb21wbGV0aW9uQ29tbWFuZC5uYW1lOiBDb21wbGV0aW9uQ29tbWFuZCwKICAgIEZyZWV6ZUNvbW1hbmQubmFtZTogRnJlZXplQ29tbWFuZCwKICAgIEhhc2hDb21tYW5kLm5hbWU6IEhhc2hDb21tYW5kLAogICAgSGVscENvbW1hbmQubmFtZTogSGVscENvbW1hbmQsCiAgICBTZWFyY2hDb21tYW5kLm5hbWU6IFNlYXJjaENvbW1hbmQsCiAgICBTaG93Q29tbWFuZC5uYW1lOiBTaG93Q29tbWFuZCwKICAgIEluc3RhbGxDb21tYW5kLm5hbWU6IEluc3RhbGxDb21tYW5kLAogICAgVW5pbnN0YWxsQ29tbWFuZC5uYW1lOiBVbmluc3RhbGxDb21tYW5kLAogICAgRG93bmxvYWRDb21tYW5kLm5hbWU6IERvd25sb2FkQ29tbWFuZCwKICAgIExpc3RDb21tYW5kLm5hbWU6IExpc3RDb21tYW5kLAogICAgQ2hlY2tDb21tYW5kLm5hbWU6IENoZWNrQ29tbWFuZCwKICAgIFdoZWVsQ29tbWFuZC5uYW1lOiBXaGVlbENvbW1hbmQsCn0KCgpjb21tYW5kc19vcmRlciA9IFsKICAgIEluc3RhbGxDb21tYW5kLAogICAgRG93bmxvYWRDb21tYW5kLAogICAgVW5pbnN0YWxsQ29tbWFuZCwKICAgIEZyZWV6ZUNvbW1hbmQsCiAgICBMaXN0Q29tbWFuZCwKICAgIFNob3dDb21tYW5kLAogICAgQ2hlY2tDb21tYW5kLAogICAgU2VhcmNoQ29tbWFuZCwKICAgIFdoZWVsQ29tbWFuZCwKICAgIEhhc2hDb21tYW5kLAogICAgQ29tcGxldGlvbkNvbW1hbmQsCiAgICBIZWxwQ29tbWFuZCwKXQoKCmRlZiBnZXRfc3VtbWFyaWVzKG9yZGVyZWQ9VHJ1ZSk6CiAgICAiIiJZaWVsZHMgc29ydGVkIChjb21tYW5kIG5hbWUsIGNvbW1hbmQgc3VtbWFyeSkgdHVwbGVzLiIiIgoKICAgIGlmIG9yZGVyZWQ6CiAgICAgICAgY21kaXRlbXMgPSBfc29ydF9jb21tYW5kcyhjb21tYW5kc19kaWN0LCBjb21tYW5kc19vcmRlcikKICAgIGVsc2U6CiAgICAgICAgY21kaXRlbXMgPSBjb21tYW5kc19kaWN0Lml0ZW1zKCkKCiAgICBmb3IgbmFtZSwgY29tbWFuZF9jbGFzcyBpbiBjbWRpdGVtczoKICAgICAgICB5aWVsZCAobmFtZSwgY29tbWFuZF9jbGFzcy5zdW1tYXJ5KQoKCmRlZiBnZXRfc2ltaWxhcl9jb21tYW5kcyhuYW1lKToKICAgICIiIkNvbW1hbmQgbmFtZSBhdXRvLWNvcnJlY3QuIiIiCiAgICBmcm9tIGRpZmZsaWIgaW1wb3J0IGdldF9jbG9zZV9tYXRjaGVzCgogICAgbmFtZSA9IG5hbWUubG93ZXIoKQoKICAgIGNsb3NlX2NvbW1hbmRzID0gZ2V0X2Nsb3NlX21hdGNoZXMobmFtZSwgY29tbWFuZHNfZGljdC5rZXlzKCkpCgogICAgaWYgY2xvc2VfY29tbWFuZHM6CiAgICAgICAgcmV0dXJuIGNsb3NlX2NvbW1hbmRzWzBdCiAgICBlbHNlOgogICAgICAgIHJldHVybiBGYWxzZQoKCmRlZiBfc29ydF9jb21tYW5kcyhjbWRkaWN0LCBvcmRlcik6CiAgICBkZWYga2V5Zm4oa2V5KToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBvcmRlci5pbmRleChrZXlbMV0pCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICMgdW5vcmRlcmVkIGl0ZW1zIHNob3VsZCBjb21lIGxhc3QKICAgICAgICAgICAgcmV0dXJuIDB4ZmYKCiAgICByZXR1cm4gc29ydGVkKGNtZGRpY3QuaXRlbXMoKSwga2V5PWtleWZuKQpQSwMEFAAAAAAAAAAhAB1hO19mBQAAZgUAACUAAABweXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2NoZWNrLnB5aW1wb3J0IGxvZ2dpbmcKCmZyb20gcGlwLmJhc2Vjb21tYW5kIGltcG9ydCBDb21tYW5kCmZyb20gcGlwLm9wZXJhdGlvbnMuY2hlY2sgaW1wb3J0IGNoZWNrX3JlcXVpcmVtZW50cwpmcm9tIHBpcC51dGlscyBpbXBvcnQgZ2V0X2luc3RhbGxlZF9kaXN0cmlidXRpb25zCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgQ2hlY2tDb21tYW5kKENvbW1hbmQpOgogICAgIiIiVmVyaWZ5IGluc3RhbGxlZCBwYWNrYWdlcyBoYXZlIGNvbXBhdGlibGUgZGVwZW5kZW5jaWVzLiIiIgogICAgbmFtZSA9ICdjaGVjaycKICAgIHVzYWdlID0gIiIiCiAgICAgICVwcm9nIFtvcHRpb25zXSIiIgogICAgc3VtbWFyeSA9ICdWZXJpZnkgaW5zdGFsbGVkIHBhY2thZ2VzIGhhdmUgY29tcGF0aWJsZSBkZXBlbmRlbmNpZXMuJwoKICAgIGRlZiBydW4oc2VsZiwgb3B0aW9ucywgYXJncyk6CiAgICAgICAgZGlzdHMgPSBnZXRfaW5zdGFsbGVkX2Rpc3RyaWJ1dGlvbnMobG9jYWxfb25seT1GYWxzZSwgc2tpcD0oKSkKICAgICAgICBtaXNzaW5nX3JlcXNfZGljdCwgaW5jb21wYXRpYmxlX3JlcXNfZGljdCA9IGNoZWNrX3JlcXVpcmVtZW50cyhkaXN0cykKCiAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgICAgIGtleSA9ICclcz09JXMnICUgKGRpc3QucHJvamVjdF9uYW1lLCBkaXN0LnZlcnNpb24pCgogICAgICAgICAgICBmb3IgcmVxdWlyZW1lbnQgaW4gbWlzc2luZ19yZXFzX2RpY3QuZ2V0KGtleSwgW10pOgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgIiVzICVzIHJlcXVpcmVzICVzLCB3aGljaCBpcyBub3QgaW5zdGFsbGVkLiIsCiAgICAgICAgICAgICAgICAgICAgZGlzdC5wcm9qZWN0X25hbWUsIGRpc3QudmVyc2lvbiwgcmVxdWlyZW1lbnQucHJvamVjdF9uYW1lKQoKICAgICAgICAgICAgZm9yIHJlcXVpcmVtZW50LCBhY3R1YWwgaW4gaW5jb21wYXRpYmxlX3JlcXNfZGljdC5nZXQoa2V5LCBbXSk6CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAiJXMgJXMgaGFzIHJlcXVpcmVtZW50ICVzLCBidXQgeW91IGhhdmUgJXMgJXMuIiwKICAgICAgICAgICAgICAgICAgICBkaXN0LnByb2plY3RfbmFtZSwgZGlzdC52ZXJzaW9uLCByZXF1aXJlbWVudCwKICAgICAgICAgICAgICAgICAgICBhY3R1YWwucHJvamVjdF9uYW1lLCBhY3R1YWwudmVyc2lvbikKCiAgICAgICAgaWYgbWlzc2luZ19yZXFzX2RpY3Qgb3IgaW5jb21wYXRpYmxlX3JlcXNfZGljdDoKICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICBlbHNlOgogICAgICAgICAgICBsb2dnZXIuaW5mbygiTm8gYnJva2VuIHJlcXVpcmVtZW50cyBmb3VuZC4iKQpQSwMEFAAAAAAAAAAhADDBzLOVCQAAlQkAACoAAABweXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2NvbXBsZXRpb24ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHN5cwpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgQ29tbWFuZAoKQkFTRV9DT01QTEVUSU9OID0gIiIiCiMgcGlwICUoc2hlbGwpcyBjb21wbGV0aW9uIHN0YXJ0JShzY3JpcHQpcyMgcGlwICUoc2hlbGwpcyBjb21wbGV0aW9uIGVuZAoiIiIKCkNPTVBMRVRJT05fU0NSSVBUUyA9IHsKICAgICdiYXNoJzogIiIiCl9waXBfY29tcGxldGlvbigpCnsKICAgIENPTVBSRVBMWT0oICQoIENPTVBfV09SRFM9IiR7Q09NUF9XT1JEU1sqXX0iIFxcCiAgICAgICAgICAgICAgICAgICBDT01QX0NXT1JEPSRDT01QX0NXT1JEIFxcCiAgICAgICAgICAgICAgICAgICBQSVBfQVVUT19DT01QTEVURT0xICQxICkgKQp9CmNvbXBsZXRlIC1vIGRlZmF1bHQgLUYgX3BpcF9jb21wbGV0aW9uIHBpcAoiIiIsICd6c2gnOiAiIiIKZnVuY3Rpb24gX3BpcF9jb21wbGV0aW9uIHsKICBsb2NhbCB3b3JkcyBjd29yZAogIHJlYWQgLUFjIHdvcmRzCiAgcmVhZCAtY24gY3dvcmQKICByZXBseT0oICQoIENPTVBfV09SRFM9IiR3b3Jkc1sqXSIgXFwKICAgICAgICAgICAgIENPTVBfQ1dPUkQ9JCgoIGN3b3JkLTEgKSkgXFwKICAgICAgICAgICAgIFBJUF9BVVRPX0NPTVBMRVRFPTEgJHdvcmRzWzFdICkgKQp9CmNvbXBjdGwgLUsgX3BpcF9jb21wbGV0aW9uIHBpcAoiIiIsICdmaXNoJzogIiIiCmZ1bmN0aW9uIF9fZmlzaF9jb21wbGV0ZV9waXAKICAgIHNldCAtbHggQ09NUF9XT1JEUyAoY29tbWFuZGxpbmUgLW8pICIiCiAgICBzZXQgLWx4IENPTVBfQ1dPUkQgKG1hdGggKGNvbnRhaW5zIC1pIC0tIChjb21tYW5kbGluZSAtdCkgJENPTVBfV09SRFMpLTEpCiAgICBzZXQgLWx4IFBJUF9BVVRPX0NPTVBMRVRFIDEKICAgIHN0cmluZyBzcGxpdCBcICAtLSAoZXZhbCAkQ09NUF9XT1JEU1sxXSkKZW5kCmNvbXBsZXRlIC1mYSAiKF9fZmlzaF9jb21wbGV0ZV9waXApIiAtYyBwaXAKIiIifQoKCmNsYXNzIENvbXBsZXRpb25Db21tYW5kKENvbW1hbmQpOgogICAgIiIiQSBoZWxwZXIgY29tbWFuZCB0byBiZSB1c2VkIGZvciBjb21tYW5kIGNvbXBsZXRpb24uIiIiCiAgICBuYW1lID0gJ2NvbXBsZXRpb24nCiAgICBzdW1tYXJ5ID0gJ0EgaGVscGVyIGNvbW1hbmQgdXNlZCBmb3IgY29tbWFuZCBjb21wbGV0aW9uLicKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgIHN1cGVyKENvbXBsZXRpb25Db21tYW5kLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprdykKCiAgICAgICAgY21kX29wdHMgPSBzZWxmLmNtZF9vcHRzCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLWJhc2gnLCAnLWInLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX2NvbnN0JywKICAgICAgICAgICAgY29uc3Q9J2Jhc2gnLAogICAgICAgICAgICBkZXN0PSdzaGVsbCcsCiAgICAgICAgICAgIGhlbHA9J0VtaXQgY29tcGxldGlvbiBjb2RlIGZvciBiYXNoJykKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS16c2gnLCAnLXonLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX2NvbnN0JywKICAgICAgICAgICAgY29uc3Q9J3pzaCcsCiAgICAgICAgICAgIGRlc3Q9J3NoZWxsJywKICAgICAgICAgICAgaGVscD0nRW1pdCBjb21wbGV0aW9uIGNvZGUgZm9yIHpzaCcpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tZmlzaCcsICctZicsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfY29uc3QnLAogICAgICAgICAgICBjb25zdD0nZmlzaCcsCiAgICAgICAgICAgIGRlc3Q9J3NoZWxsJywKICAgICAgICAgICAgaGVscD0nRW1pdCBjb21wbGV0aW9uIGNvZGUgZm9yIGZpc2gnKQoKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIGNtZF9vcHRzKQoKICAgIGRlZiBydW4oc2VsZiwgb3B0aW9ucywgYXJncyk6CiAgICAgICAgIiIiUHJpbnRzIHRoZSBjb21wbGV0aW9uIGNvZGUgb2YgdGhlIGdpdmVuIHNoZWxsIiIiCiAgICAgICAgc2hlbGxzID0gQ09NUExFVElPTl9TQ1JJUFRTLmtleXMoKQogICAgICAgIHNoZWxsX29wdGlvbnMgPSBbJy0tJyArIHNoZWxsIGZvciBzaGVsbCBpbiBzb3J0ZWQoc2hlbGxzKV0KICAgICAgICBpZiBvcHRpb25zLnNoZWxsIGluIHNoZWxsczoKICAgICAgICAgICAgc2NyaXB0ID0gQ09NUExFVElPTl9TQ1JJUFRTLmdldChvcHRpb25zLnNoZWxsLCAnJykKICAgICAgICAgICAgcHJpbnQoQkFTRV9DT01QTEVUSU9OICUgeydzY3JpcHQnOiBzY3JpcHQsICdzaGVsbCc6IG9wdGlvbnMuc2hlbGx9KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoCiAgICAgICAgICAgICAgICAnRVJST1I6IFlvdSBtdXN0IHBhc3MgJXNcbicgJSAnIG9yICcuam9pbihzaGVsbF9vcHRpb25zKQogICAgICAgICAgICApClBLAwQUAAAAAAAAACEA2R6ZpoIeAACCHgAAKAAAAHB5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvZG93bmxvYWQucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCgpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBDb21tYW5kRXJyb3IKZnJvbSBwaXAuaW5kZXggaW1wb3J0IEZvcm1hdENvbnRyb2wKZnJvbSBwaXAucmVxIGltcG9ydCBSZXF1aXJlbWVudFNldApmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgUmVxdWlyZW1lbnRDb21tYW5kCmZyb20gcGlwIGltcG9ydCBjbWRvcHRpb25zCmZyb20gcGlwLnV0aWxzIGltcG9ydCBlbnN1cmVfZGlyLCBub3JtYWxpemVfcGF0aApmcm9tIHBpcC51dGlscy5idWlsZCBpbXBvcnQgQnVpbGREaXJlY3RvcnkKZnJvbSBwaXAudXRpbHMuZmlsZXN5c3RlbSBpbXBvcnQgY2hlY2tfcGF0aF9vd25lcgoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIERvd25sb2FkQ29tbWFuZChSZXF1aXJlbWVudENvbW1hbmQpOgogICAgIiIiCiAgICBEb3dubG9hZCBwYWNrYWdlcyBmcm9tOgoKICAgIC0gUHlQSSAoYW5kIG90aGVyIGluZGV4ZXMpIHVzaW5nIHJlcXVpcmVtZW50IHNwZWNpZmllcnMuCiAgICAtIFZDUyBwcm9qZWN0IHVybHMuCiAgICAtIExvY2FsIHByb2plY3QgZGlyZWN0b3JpZXMuCiAgICAtIExvY2FsIG9yIHJlbW90ZSBzb3VyY2UgYXJjaGl2ZXMuCgogICAgcGlwIGFsc28gc3VwcG9ydHMgZG93bmxvYWRpbmcgZnJvbSAicmVxdWlyZW1lbnRzIGZpbGVzIiwgd2hpY2ggcHJvdmlkZQogICAgYW4gZWFzeSB3YXkgdG8gc3BlY2lmeSBhIHdob2xlIGVudmlyb25tZW50IHRvIGJlIGRvd25sb2FkZWQuCiAgICAiIiIKICAgIG5hbWUgPSAnZG93bmxvYWQnCgogICAgdXNhZ2UgPSAiIiIKICAgICAgJXByb2cgW29wdGlvbnNdIDxyZXF1aXJlbWVudCBzcGVjaWZpZXI+IFtwYWNrYWdlLWluZGV4LW9wdGlvbnNdIC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gLXIgPHJlcXVpcmVtZW50cyBmaWxlPiBbcGFja2FnZS1pbmRleC1vcHRpb25zXSAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIFstZV0gPHZjcyBwcm9qZWN0IHVybD4gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSBbLWVdIDxsb2NhbCBwcm9qZWN0IHBhdGg+IC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gPGFyY2hpdmUgdXJsL3BhdGg+IC4uLiIiIgoKICAgIHN1bW1hcnkgPSAnRG93bmxvYWQgcGFja2FnZXMuJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgc3VwZXIoRG93bmxvYWRDb21tYW5kLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprdykKCiAgICAgICAgY21kX29wdHMgPSBzZWxmLmNtZF9vcHRzCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5jb25zdHJhaW50cygpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5lZGl0YWJsZSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5yZXF1aXJlbWVudHMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuYnVpbGRfZGlyKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm5vX2RlcHMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuZ2xvYmFsX29wdGlvbnMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fYmluYXJ5KCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm9ubHlfYmluYXJ5KCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnNyYygpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5wcmUoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fY2xlYW4oKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMucmVxdWlyZV9oYXNoZXMoKSkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1kJywgJy0tZGVzdCcsICctLWRlc3RpbmF0aW9uLWRpcicsICctLWRlc3RpbmF0aW9uLWRpcmVjdG9yeScsCiAgICAgICAgICAgIGRlc3Q9J2Rvd25sb2FkX2RpcicsCiAgICAgICAgICAgIG1ldGF2YXI9J2RpcicsCiAgICAgICAgICAgIGRlZmF1bHQ9b3MuY3VyZGlyLAogICAgICAgICAgICBoZWxwPSgiRG93bmxvYWQgcGFja2FnZXMgaW50byA8ZGlyPi4iKSwKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLXBsYXRmb3JtJywKICAgICAgICAgICAgZGVzdD0ncGxhdGZvcm0nLAogICAgICAgICAgICBtZXRhdmFyPSdwbGF0Zm9ybScsCiAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgICAgaGVscD0oIk9ubHkgZG93bmxvYWQgd2hlZWxzIGNvbXBhdGlibGUgd2l0aCA8cGxhdGZvcm0+LiAiCiAgICAgICAgICAgICAgICAgICJEZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0gb2YgdGhlIHJ1bm5pbmcgc3lzdGVtLiIpLAogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tcHl0aG9uLXZlcnNpb24nLAogICAgICAgICAgICBkZXN0PSdweXRob25fdmVyc2lvbicsCiAgICAgICAgICAgIG1ldGF2YXI9J3B5dGhvbl92ZXJzaW9uJywKICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAogICAgICAgICAgICBoZWxwPSgiT25seSBkb3dubG9hZCB3aGVlbHMgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAiCiAgICAgICAgICAgICAgICAgICJpbnRlcnByZXRlciB2ZXJzaW9uIDx2ZXJzaW9uPi4gSWYgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgIgogICAgICAgICAgICAgICAgICAiY3VycmVudCBzeXN0ZW0gaW50ZXJwcmV0ZXIgbWlub3IgdmVyc2lvbiBpcyB1c2VkLiBBIG1ham9yICIKICAgICAgICAgICAgICAgICAgInZlcnNpb24gKGUuZy4gJzInKSBjYW4gYmUgc3BlY2lmaWVkIHRvIG1hdGNoIGFsbCAiCiAgICAgICAgICAgICAgICAgICJtaW5vciByZXZzIG9mIHRoYXQgbWFqb3IgdmVyc2lvbi4gIEEgbWlub3IgdmVyc2lvbiAiCiAgICAgICAgICAgICAgICAgICIoZS5nLiAnMzQnKSBjYW4gYWxzbyBiZSBzcGVjaWZpZWQuIiksCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1pbXBsZW1lbnRhdGlvbicsCiAgICAgICAgICAgIGRlc3Q9J2ltcGxlbWVudGF0aW9uJywKICAgICAgICAgICAgbWV0YXZhcj0naW1wbGVtZW50YXRpb24nLAogICAgICAgICAgICBkZWZhdWx0PU5vbmUsCiAgICAgICAgICAgIGhlbHA9KCJPbmx5IGRvd25sb2FkIHdoZWVscyBjb21wYXRpYmxlIHdpdGggUHl0aG9uICIKICAgICAgICAgICAgICAgICAgImltcGxlbWVudGF0aW9uIDxpbXBsZW1lbnRhdGlvbj4sIGUuZy4gJ3BwJywgJ2p5JywgJ2NwJywgIgogICAgICAgICAgICAgICAgICAiIG9yICdpcCcuIElmIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlIGN1cnJlbnQgIgogICAgICAgICAgICAgICAgICAiaW50ZXJwcmV0ZXIgaW1wbGVtZW50YXRpb24gaXMgdXNlZC4gIFVzZSAncHknIHRvIGZvcmNlICIKICAgICAgICAgICAgICAgICAgImltcGxlbWVudGF0aW9uLWFnbm9zdGljIHdoZWVscy4iKSwKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLWFiaScsCiAgICAgICAgICAgIGRlc3Q9J2FiaScsCiAgICAgICAgICAgIG1ldGF2YXI9J2FiaScsCiAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgICAgaGVscD0oIk9ubHkgZG93bmxvYWQgd2hlZWxzIGNvbXBhdGlibGUgd2l0aCBQeXRob24gIgogICAgICAgICAgICAgICAgICAiYWJpIDxhYmk+LCBlLmcuICdweXB5XzQxJy4gIElmIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlICIKICAgICAgICAgICAgICAgICAgImN1cnJlbnQgaW50ZXJwcmV0ZXIgYWJpIHRhZyBpcyB1c2VkLiAgR2VuZXJhbGx5ICIKICAgICAgICAgICAgICAgICAgInlvdSB3aWxsIG5lZWQgdG8gc3BlY2lmeSAtLWltcGxlbWVudGF0aW9uLCAiCiAgICAgICAgICAgICAgICAgICItLXBsYXRmb3JtLCBhbmQgLS1weXRob24tdmVyc2lvbiB3aGVuIHVzaW5nICIKICAgICAgICAgICAgICAgICAgInRoaXMgb3B0aW9uLiIpLAogICAgICAgICkKCiAgICAgICAgaW5kZXhfb3B0cyA9IGNtZG9wdGlvbnMubWFrZV9vcHRpb25fZ3JvdXAoCiAgICAgICAgICAgIGNtZG9wdGlvbnMubm9uX2RlcHJlY2F0ZWRfaW5kZXhfZ3JvdXAsCiAgICAgICAgICAgIHNlbGYucGFyc2VyLAogICAgICAgICkKCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBpbmRleF9vcHRzKQogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgY21kX29wdHMpCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICBvcHRpb25zLmlnbm9yZV9pbnN0YWxsZWQgPSBUcnVlCgogICAgICAgIGlmIG9wdGlvbnMucHl0aG9uX3ZlcnNpb246CiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9ucyA9IFtvcHRpb25zLnB5dGhvbl92ZXJzaW9uXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9ucyA9IE5vbmUKCiAgICAgICAgZGlzdF9yZXN0cmljdGlvbl9zZXQgPSBhbnkoWwogICAgICAgICAgICBvcHRpb25zLnB5dGhvbl92ZXJzaW9uLAogICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtLAogICAgICAgICAgICBvcHRpb25zLmFiaSwKICAgICAgICAgICAgb3B0aW9ucy5pbXBsZW1lbnRhdGlvbiwKICAgICAgICBdKQogICAgICAgIGJpbmFyeV9vbmx5ID0gRm9ybWF0Q29udHJvbChzZXQoKSwgc2V0KFsnOmFsbDonXSkpCiAgICAgICAgaWYgZGlzdF9yZXN0cmljdGlvbl9zZXQgYW5kIG9wdGlvbnMuZm9ybWF0X2NvbnRyb2wgIT0gYmluYXJ5X29ubHk6CiAgICAgICAgICAgIHJhaXNlIENvbW1hbmRFcnJvcigKICAgICAgICAgICAgICAgICItLW9ubHktYmluYXJ5PTphbGw6IG11c3QgYmUgc2V0IGFuZCAtLW5vLWJpbmFyeSBtdXN0IG5vdCAiCiAgICAgICAgICAgICAgICAiYmUgc2V0IChvciBtdXN0IGJlIHNldCB0byA6bm9uZTopIHdoZW4gcmVzdHJpY3RpbmcgcGxhdGZvcm0gIgogICAgICAgICAgICAgICAgImFuZCBpbnRlcnByZXRlciBjb25zdHJhaW50cyB1c2luZyAtLXB5dGhvbi12ZXJzaW9uLCAiCiAgICAgICAgICAgICAgICAiLS1wbGF0Zm9ybSwgLS1hYmksIG9yIC0taW1wbGVtZW50YXRpb24uIgogICAgICAgICAgICApCgogICAgICAgIG9wdGlvbnMuc3JjX2RpciA9IG9zLnBhdGguYWJzcGF0aChvcHRpb25zLnNyY19kaXIpCiAgICAgICAgb3B0aW9ucy5kb3dubG9hZF9kaXIgPSBub3JtYWxpemVfcGF0aChvcHRpb25zLmRvd25sb2FkX2RpcikKCiAgICAgICAgZW5zdXJlX2RpcihvcHRpb25zLmRvd25sb2FkX2RpcikKCiAgICAgICAgd2l0aCBzZWxmLl9idWlsZF9zZXNzaW9uKG9wdGlvbnMpIGFzIHNlc3Npb246CiAgICAgICAgICAgIGZpbmRlciA9IHNlbGYuX2J1aWxkX3BhY2thZ2VfZmluZGVyKAogICAgICAgICAgICAgICAgb3B0aW9ucz1vcHRpb25zLAogICAgICAgICAgICAgICAgc2Vzc2lvbj1zZXNzaW9uLAogICAgICAgICAgICAgICAgcGxhdGZvcm09b3B0aW9ucy5wbGF0Zm9ybSwKICAgICAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9ucz1weXRob25fdmVyc2lvbnMsCiAgICAgICAgICAgICAgICBhYmk9b3B0aW9ucy5hYmksCiAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbj1vcHRpb25zLmltcGxlbWVudGF0aW9uLAogICAgICAgICAgICApCiAgICAgICAgICAgIGJ1aWxkX2RlbGV0ZSA9IChub3QgKG9wdGlvbnMubm9fY2xlYW4gb3Igb3B0aW9ucy5idWlsZF9kaXIpKQogICAgICAgICAgICBpZiBvcHRpb25zLmNhY2hlX2RpciBhbmQgbm90IGNoZWNrX3BhdGhfb3duZXIob3B0aW9ucy5jYWNoZV9kaXIpOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgIlRoZSBkaXJlY3RvcnkgJyVzJyBvciBpdHMgcGFyZW50IGRpcmVjdG9yeSBpcyBub3Qgb3duZWQgIgogICAgICAgICAgICAgICAgICAgICJieSB0aGUgY3VycmVudCB1c2VyIGFuZCBjYWNoaW5nIHdoZWVscyBoYXMgYmVlbiAiCiAgICAgICAgICAgICAgICAgICAgImRpc2FibGVkLiBjaGVjayB0aGUgcGVybWlzc2lvbnMgYW5kIG93bmVyIG9mIHRoYXQgIgogICAgICAgICAgICAgICAgICAgICJkaXJlY3RvcnkuIElmIGV4ZWN1dGluZyBwaXAgd2l0aCBzdWRvLCB5b3UgbWF5IHdhbnQgIgogICAgICAgICAgICAgICAgICAgICJzdWRvJ3MgLUggZmxhZy4iLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FjaGVfZGlyLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgb3B0aW9ucy5jYWNoZV9kaXIgPSBOb25lCgogICAgICAgICAgICB3aXRoIEJ1aWxkRGlyZWN0b3J5KG9wdGlvbnMuYnVpbGRfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZT1idWlsZF9kZWxldGUpIGFzIGJ1aWxkX2RpcjoKCiAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQgPSBSZXF1aXJlbWVudFNldCgKICAgICAgICAgICAgICAgICAgICBidWlsZF9kaXI9YnVpbGRfZGlyLAogICAgICAgICAgICAgICAgICAgIHNyY19kaXI9b3B0aW9ucy5zcmNfZGlyLAogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2Rpcj1vcHRpb25zLmRvd25sb2FkX2RpciwKICAgICAgICAgICAgICAgICAgICBpZ25vcmVfaW5zdGFsbGVkPVRydWUsCiAgICAgICAgICAgICAgICAgICAgaWdub3JlX2RlcGVuZGVuY2llcz1vcHRpb25zLmlnbm9yZV9kZXBlbmRlbmNpZXMsCiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbj1zZXNzaW9uLAogICAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPW9wdGlvbnMuaXNvbGF0ZWRfbW9kZSwKICAgICAgICAgICAgICAgICAgICByZXF1aXJlX2hhc2hlcz1vcHRpb25zLnJlcXVpcmVfaGFzaGVzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBzZWxmLnBvcHVsYXRlX3JlcXVpcmVtZW50X3NldCgKICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQsCiAgICAgICAgICAgICAgICAgICAgYXJncywKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLAogICAgICAgICAgICAgICAgICAgIGZpbmRlciwKICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZSwKICAgICAgICAgICAgICAgICAgICBOb25lCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgaWYgbm90IHJlcXVpcmVtZW50X3NldC5oYXNfcmVxdWlyZW1lbnRzOgogICAgICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5wcmVwYXJlX2ZpbGVzKGZpbmRlcikKCiAgICAgICAgICAgICAgICBkb3dubG9hZGVkID0gJyAnLmpvaW4oWwogICAgICAgICAgICAgICAgICAgIHJlcS5uYW1lIGZvciByZXEgaW4gcmVxdWlyZW1lbnRfc2V0LnN1Y2Nlc3NmdWxseV9kb3dubG9hZGVkCiAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICAgICAgaWYgZG93bmxvYWRlZDoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgJ1N1Y2Nlc3NmdWxseSBkb3dubG9hZGVkICVzJywgZG93bmxvYWRlZAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAjIENsZWFuIHVwCiAgICAgICAgICAgICAgICBpZiBub3Qgb3B0aW9ucy5ub19jbGVhbjoKICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQuY2xlYW51cF9maWxlcygpCgogICAgICAgIHJldHVybiByZXF1aXJlbWVudF9zZXQKUEsDBBQAAAAAAAAAIQDD9vNgEwsAABMLAAAmAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9mcmVlemUucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHN5cwoKaW1wb3J0IHBpcApmcm9tIHBpcC5jb21wYXQgaW1wb3J0IHN0ZGxpYl9wa2dzCmZyb20gcGlwLmJhc2Vjb21tYW5kIGltcG9ydCBDb21tYW5kCmZyb20gcGlwLm9wZXJhdGlvbnMuZnJlZXplIGltcG9ydCBmcmVlemUKZnJvbSBwaXAud2hlZWwgaW1wb3J0IFdoZWVsQ2FjaGUKCgpERVZfUEtHUyA9ICgncGlwJywgJ3NldHVwdG9vbHMnLCAnZGlzdHJpYnV0ZScsICd3aGVlbCcpCgoKY2xhc3MgRnJlZXplQ29tbWFuZChDb21tYW5kKToKICAgICIiIgogICAgT3V0cHV0IGluc3RhbGxlZCBwYWNrYWdlcyBpbiByZXF1aXJlbWVudHMgZm9ybWF0LgoKICAgIHBhY2thZ2VzIGFyZSBsaXN0ZWQgaW4gYSBjYXNlLWluc2Vuc2l0aXZlIHNvcnRlZCBvcmRlci4KICAgICIiIgogICAgbmFtZSA9ICdmcmVlemUnCiAgICB1c2FnZSA9ICIiIgogICAgICAlcHJvZyBbb3B0aW9uc10iIiIKICAgIHN1bW1hcnkgPSAnT3V0cHV0IGluc3RhbGxlZCBwYWNrYWdlcyBpbiByZXF1aXJlbWVudHMgZm9ybWF0LicKICAgIGxvZ19zdHJlYW1zID0gKCJleHQ6Ly9zeXMuc3RkZXJyIiwgImV4dDovL3N5cy5zdGRlcnIiKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgc3VwZXIoRnJlZXplQ29tbWFuZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCgogICAgICAgIHNlbGYuY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1yJywgJy0tcmVxdWlyZW1lbnQnLAogICAgICAgICAgICBkZXN0PSdyZXF1aXJlbWVudHMnLAogICAgICAgICAgICBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgICAgIGRlZmF1bHQ9W10sCiAgICAgICAgICAgIG1ldGF2YXI9J2ZpbGUnLAogICAgICAgICAgICBoZWxwPSJVc2UgdGhlIG9yZGVyIGluIHRoZSBnaXZlbiByZXF1aXJlbWVudHMgZmlsZSBhbmQgaXRzICIKICAgICAgICAgICAgICAgICAiY29tbWVudHMgd2hlbiBnZW5lcmF0aW5nIG91dHB1dC4gVGhpcyBvcHRpb24gY2FuIGJlICIKICAgICAgICAgICAgICAgICAidXNlZCBtdWx0aXBsZSB0aW1lcy4iKQogICAgICAgIHNlbGYuY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1mJywgJy0tZmluZC1saW5rcycsCiAgICAgICAgICAgIGRlc3Q9J2ZpbmRfbGlua3MnLAogICAgICAgICAgICBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgICAgIGRlZmF1bHQ9W10sCiAgICAgICAgICAgIG1ldGF2YXI9J1VSTCcsCiAgICAgICAgICAgIGhlbHA9J1VSTCBmb3IgZmluZGluZyBwYWNrYWdlcywgd2hpY2ggd2lsbCBiZSBhZGRlZCB0byB0aGUgJwogICAgICAgICAgICAgICAgICdvdXRwdXQuJykKICAgICAgICBzZWxmLmNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctbCcsICctLWxvY2FsJywKICAgICAgICAgICAgZGVzdD0nbG9jYWwnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICBoZWxwPSdJZiBpbiBhIHZpcnR1YWxlbnYgdGhhdCBoYXMgZ2xvYmFsIGFjY2VzcywgZG8gbm90IG91dHB1dCAnCiAgICAgICAgICAgICAgICAgJ2dsb2JhbGx5LWluc3RhbGxlZCBwYWNrYWdlcy4nKQogICAgICAgIHNlbGYuY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tdXNlcicsCiAgICAgICAgICAgIGRlc3Q9J3VzZXInLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICBoZWxwPSdPbmx5IG91dHB1dCBwYWNrYWdlcyBpbnN0YWxsZWQgaW4gdXNlci1zaXRlLicpCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1hbGwnLAogICAgICAgICAgICBkZXN0PSdmcmVlemVfYWxsJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgaGVscD0nRG8gbm90IHNraXAgdGhlc2UgcGFja2FnZXMgaW4gdGhlIG91dHB1dDonCiAgICAgICAgICAgICAgICAgJyAlcycgJSAnLCAnLmpvaW4oREVWX1BLR1MpKQoKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIHNlbGYuY21kX29wdHMpCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICBmb3JtYXRfY29udHJvbCA9IHBpcC5pbmRleC5Gb3JtYXRDb250cm9sKHNldCgpLCBzZXQoKSkKICAgICAgICB3aGVlbF9jYWNoZSA9IFdoZWVsQ2FjaGUob3B0aW9ucy5jYWNoZV9kaXIsIGZvcm1hdF9jb250cm9sKQogICAgICAgIHNraXAgPSBzZXQoc3RkbGliX3BrZ3MpCiAgICAgICAgaWYgbm90IG9wdGlvbnMuZnJlZXplX2FsbDoKICAgICAgICAgICAgc2tpcC51cGRhdGUoREVWX1BLR1MpCgogICAgICAgIGZyZWV6ZV9rd2FyZ3MgPSBkaWN0KAogICAgICAgICAgICByZXF1aXJlbWVudD1vcHRpb25zLnJlcXVpcmVtZW50cywKICAgICAgICAgICAgZmluZF9saW5rcz1vcHRpb25zLmZpbmRfbGlua3MsCiAgICAgICAgICAgIGxvY2FsX29ubHk9b3B0aW9ucy5sb2NhbCwKICAgICAgICAgICAgdXNlcl9vbmx5PW9wdGlvbnMudXNlciwKICAgICAgICAgICAgc2tpcF9yZWdleD1vcHRpb25zLnNraXBfcmVxdWlyZW1lbnRzX3JlZ2V4LAogICAgICAgICAgICBpc29sYXRlZD1vcHRpb25zLmlzb2xhdGVkX21vZGUsCiAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlLAogICAgICAgICAgICBza2lwPXNraXApCgogICAgICAgIGZvciBsaW5lIGluIGZyZWV6ZSgqKmZyZWV6ZV9rd2FyZ3MpOgogICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGxpbmUgKyAnXG4nKQpQSwMEFAAAAAAAAAAhAPiJ7KQ9BgAAPQYAACQAAABweXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2hhc2gucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHN5cwoKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IENvbW1hbmQKZnJvbSBwaXAuc3RhdHVzX2NvZGVzIGltcG9ydCBFUlJPUgpmcm9tIHBpcC51dGlscyBpbXBvcnQgcmVhZF9jaHVua3MKZnJvbSBwaXAudXRpbHMuaGFzaGVzIGltcG9ydCBGQVZPUklURV9IQVNILCBTVFJPTkdfSEFTSEVTCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgSGFzaENvbW1hbmQoQ29tbWFuZCk6CiAgICAiIiIKICAgIENvbXB1dGUgYSBoYXNoIG9mIGEgbG9jYWwgcGFja2FnZSBhcmNoaXZlLgoKICAgIFRoZXNlIGNhbiBiZSB1c2VkIHdpdGggLS1oYXNoIGluIGEgcmVxdWlyZW1lbnRzIGZpbGUgdG8gZG8gcmVwZWF0YWJsZQogICAgaW5zdGFsbHMuCgogICAgIiIiCiAgICBuYW1lID0gJ2hhc2gnCiAgICB1c2FnZSA9ICclcHJvZyBbb3B0aW9uc10gPGZpbGU+IC4uLicKICAgIHN1bW1hcnkgPSAnQ29tcHV0ZSBoYXNoZXMgb2YgcGFja2FnZSBhcmNoaXZlcy4nCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICBzdXBlcihIYXNoQ29tbWFuZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLWEnLCAnLS1hbGdvcml0aG0nLAogICAgICAgICAgICBkZXN0PSdhbGdvcml0aG0nLAogICAgICAgICAgICBjaG9pY2VzPVNUUk9OR19IQVNIRVMsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICBkZWZhdWx0PUZBVk9SSVRFX0hBU0gsCiAgICAgICAgICAgIGhlbHA9J1RoZSBoYXNoIGFsZ29yaXRobSB0byB1c2U6IG9uZSBvZiAlcycgJQogICAgICAgICAgICAgICAgICcsICcuam9pbihTVFJPTkdfSEFTSEVTKSkKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIHNlbGYuY21kX29wdHMpCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICBpZiBub3QgYXJnczoKICAgICAgICAgICAgc2VsZi5wYXJzZXIucHJpbnRfdXNhZ2Uoc3lzLnN0ZGVycikKICAgICAgICAgICAgcmV0dXJuIEVSUk9SCgogICAgICAgIGFsZ29yaXRobSA9IG9wdGlvbnMuYWxnb3JpdGhtCiAgICAgICAgZm9yIHBhdGggaW4gYXJnczoKICAgICAgICAgICAgbG9nZ2VyLmluZm8oJyVzOlxuLS1oYXNoPSVzOiVzJywKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgYWxnb3JpdGhtLCBfaGFzaF9vZl9maWxlKHBhdGgsIGFsZ29yaXRobSkpCgoKZGVmIF9oYXNoX29mX2ZpbGUocGF0aCwgYWxnb3JpdGhtKToKICAgICIiIlJldHVybiB0aGUgaGFzaCBkaWdlc3Qgb2YgYSBmaWxlLiIiIgogICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIGFyY2hpdmU6CiAgICAgICAgaGFzaCA9IGhhc2hsaWIubmV3KGFsZ29yaXRobSkKICAgICAgICBmb3IgY2h1bmsgaW4gcmVhZF9jaHVua3MoYXJjaGl2ZSk6CiAgICAgICAgICAgIGhhc2gudXBkYXRlKGNodW5rKQogICAgcmV0dXJuIGhhc2guaGV4ZGlnZXN0KCkKUEsDBBQAAAAAAAAAIQAeFtCd1gMAANYDAAAkAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9oZWxwLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gcGlwLmJhc2Vjb21tYW5kIGltcG9ydCBDb21tYW5kLCBTVUNDRVNTCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IENvbW1hbmRFcnJvcgoKCmNsYXNzIEhlbHBDb21tYW5kKENvbW1hbmQpOgogICAgIiIiU2hvdyBoZWxwIGZvciBjb21tYW5kcyIiIgogICAgbmFtZSA9ICdoZWxwJwogICAgdXNhZ2UgPSAiIiIKICAgICAgJXByb2cgPGNvbW1hbmQ+IiIiCiAgICBzdW1tYXJ5ID0gJ1Nob3cgaGVscCBmb3IgY29tbWFuZHMuJwoKICAgIGRlZiBydW4oc2VsZiwgb3B0aW9ucywgYXJncyk6CiAgICAgICAgZnJvbSBwaXAuY29tbWFuZHMgaW1wb3J0IGNvbW1hbmRzX2RpY3QsIGdldF9zaW1pbGFyX2NvbW1hbmRzCgogICAgICAgIHRyeToKICAgICAgICAgICAgIyAncGlwIGhlbHAnIHdpdGggbm8gYXJncyBpcyBoYW5kbGVkIGJ5IHBpcC5fX2luaXRfXy5wYXJzZW9wdCgpCiAgICAgICAgICAgIGNtZF9uYW1lID0gYXJnc1swXSAgIyB0aGUgY29tbWFuZCB3ZSBuZWVkIGhlbHAgZm9yCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgIHJldHVybiBTVUNDRVNTCgogICAgICAgIGlmIGNtZF9uYW1lIG5vdCBpbiBjb21tYW5kc19kaWN0OgogICAgICAgICAgICBndWVzcyA9IGdldF9zaW1pbGFyX2NvbW1hbmRzKGNtZF9uYW1lKQoKICAgICAgICAgICAgbXNnID0gWyd1bmtub3duIGNvbW1hbmQgIiVzIicgJSBjbWRfbmFtZV0KICAgICAgICAgICAgaWYgZ3Vlc3M6CiAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKCdtYXliZSB5b3UgbWVhbnQgIiVzIicgJSBndWVzcykKCiAgICAgICAgICAgIHJhaXNlIENvbW1hbmRFcnJvcignIC0gJy5qb2luKG1zZykpCgogICAgICAgIGNvbW1hbmQgPSBjb21tYW5kc19kaWN0W2NtZF9uYW1lXSgpCiAgICAgICAgY29tbWFuZC5wYXJzZXIucHJpbnRfaGVscCgpCgogICAgICAgIHJldHVybiBTVUNDRVNTClBLAwQUAAAAAAAAACEASyWGFgREAAAERAAAJwAAAHB5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvaW5zdGFsbC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IG9zCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgc2h1dGlsCmltcG9ydCB3YXJuaW5ncwp0cnk6CiAgICBpbXBvcnQgd2hlZWwKZXhjZXB0IEltcG9ydEVycm9yOgogICAgd2hlZWwgPSBOb25lCgpmcm9tIHBpcC5yZXEgaW1wb3J0IFJlcXVpcmVtZW50U2V0CmZyb20gcGlwLmJhc2Vjb21tYW5kIGltcG9ydCBSZXF1aXJlbWVudENvbW1hbmQKZnJvbSBwaXAubG9jYXRpb25zIGltcG9ydCB2aXJ0dWFsZW52X25vX2dsb2JhbCwgZGlzdHV0aWxzX3NjaGVtZQpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBJbnN0YWxsYXRpb25FcnJvciwgQ29tbWFuZEVycm9yLCBQcmV2aW91c0J1aWxkRGlyRXJyb3IsCikKZnJvbSBwaXAgaW1wb3J0IGNtZG9wdGlvbnMKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGVuc3VyZV9kaXIsIGdldF9pbnN0YWxsZWRfdmVyc2lvbgpmcm9tIHBpcC51dGlscy5idWlsZCBpbXBvcnQgQnVpbGREaXJlY3RvcnkKZnJvbSBwaXAudXRpbHMuZGVwcmVjYXRpb24gaW1wb3J0IFJlbW92ZWRJblBpcDEwV2FybmluZwpmcm9tIHBpcC51dGlscy5maWxlc3lzdGVtIGltcG9ydCBjaGVja19wYXRoX293bmVyCmZyb20gcGlwLndoZWVsIGltcG9ydCBXaGVlbENhY2hlLCBXaGVlbEJ1aWxkZXIKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBJbnN0YWxsQ29tbWFuZChSZXF1aXJlbWVudENvbW1hbmQpOgogICAgIiIiCiAgICBJbnN0YWxsIHBhY2thZ2VzIGZyb206CgogICAgLSBQeVBJIChhbmQgb3RoZXIgaW5kZXhlcykgdXNpbmcgcmVxdWlyZW1lbnQgc3BlY2lmaWVycy4KICAgIC0gVkNTIHByb2plY3QgdXJscy4KICAgIC0gTG9jYWwgcHJvamVjdCBkaXJlY3Rvcmllcy4KICAgIC0gTG9jYWwgb3IgcmVtb3RlIHNvdXJjZSBhcmNoaXZlcy4KCiAgICBwaXAgYWxzbyBzdXBwb3J0cyBpbnN0YWxsaW5nIGZyb20gInJlcXVpcmVtZW50cyBmaWxlcyIsIHdoaWNoIHByb3ZpZGUKICAgIGFuIGVhc3kgd2F5IHRvIHNwZWNpZnkgYSB3aG9sZSBlbnZpcm9ubWVudCB0byBiZSBpbnN0YWxsZWQuCiAgICAiIiIKICAgIG5hbWUgPSAnaW5zdGFsbCcKCiAgICB1c2FnZSA9ICIiIgogICAgICAlcHJvZyBbb3B0aW9uc10gPHJlcXVpcmVtZW50IHNwZWNpZmllcj4gW3BhY2thZ2UtaW5kZXgtb3B0aW9uc10gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSAtciA8cmVxdWlyZW1lbnRzIGZpbGU+IFtwYWNrYWdlLWluZGV4LW9wdGlvbnNdIC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gWy1lXSA8dmNzIHByb2plY3QgdXJsPiAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIFstZV0gPGxvY2FsIHByb2plY3QgcGF0aD4gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSA8YXJjaGl2ZSB1cmwvcGF0aD4gLi4uIiIiCgogICAgc3VtbWFyeSA9ICdJbnN0YWxsIHBhY2thZ2VzLicKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgIHN1cGVyKEluc3RhbGxDb21tYW5kLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprdykKCiAgICAgICAgY21kX29wdHMgPSBzZWxmLmNtZF9vcHRzCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5jb25zdHJhaW50cygpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5lZGl0YWJsZSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5yZXF1aXJlbWVudHMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuYnVpbGRfZGlyKCkpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctdCcsICctLXRhcmdldCcsCiAgICAgICAgICAgIGRlc3Q9J3RhcmdldF9kaXInLAogICAgICAgICAgICBtZXRhdmFyPSdkaXInLAogICAgICAgICAgICBkZWZhdWx0PU5vbmUsCiAgICAgICAgICAgIGhlbHA9J0luc3RhbGwgcGFja2FnZXMgaW50byA8ZGlyPi4gJwogICAgICAgICAgICAgICAgICdCeSBkZWZhdWx0IHRoaXMgd2lsbCBub3QgcmVwbGFjZSBleGlzdGluZyBmaWxlcy9mb2xkZXJzIGluICcKICAgICAgICAgICAgICAgICAnPGRpcj4uIFVzZSAtLXVwZ3JhZGUgdG8gcmVwbGFjZSBleGlzdGluZyBwYWNrYWdlcyBpbiA8ZGlyPiAnCiAgICAgICAgICAgICAgICAgJ3dpdGggbmV3IHZlcnNpb25zLicKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctZCcsICctLWRvd25sb2FkJywgJy0tZG93bmxvYWQtZGlyJywgJy0tZG93bmxvYWQtZGlyZWN0b3J5JywKICAgICAgICAgICAgZGVzdD0nZG93bmxvYWRfZGlyJywKICAgICAgICAgICAgbWV0YXZhcj0nZGlyJywKICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAogICAgICAgICAgICBoZWxwPSgiRG93bmxvYWQgcGFja2FnZXMgaW50byA8ZGlyPiBpbnN0ZWFkIG9mIGluc3RhbGxpbmcgdGhlbSwgIgogICAgICAgICAgICAgICAgICAicmVnYXJkbGVzcyBvZiB3aGF0J3MgYWxyZWFkeSBpbnN0YWxsZWQuIiksCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuc3JjKCkpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctVScsICctLXVwZ3JhZGUnLAogICAgICAgICAgICBkZXN0PSd1cGdyYWRlJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgaGVscD0nVXBncmFkZSBhbGwgc3BlY2lmaWVkIHBhY2thZ2VzIHRvIHRoZSBuZXdlc3QgYXZhaWxhYmxlICcKICAgICAgICAgICAgICAgICAndmVyc2lvbi4gVGhlIGhhbmRsaW5nIG9mIGRlcGVuZGVuY2llcyBkZXBlbmRzIG9uIHRoZSAnCiAgICAgICAgICAgICAgICAgJ3VwZ3JhZGUtc3RyYXRlZ3kgdXNlZC4nCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS11cGdyYWRlLXN0cmF0ZWd5JywKICAgICAgICAgICAgZGVzdD0ndXBncmFkZV9zdHJhdGVneScsCiAgICAgICAgICAgIGRlZmF1bHQ9J2VhZ2VyJywKICAgICAgICAgICAgY2hvaWNlcz1bJ29ubHktaWYtbmVlZGVkJywgJ2VhZ2VyJ10sCiAgICAgICAgICAgIGhlbHA9J0RldGVybWluZXMgaG93IGRlcGVuZGVuY3kgdXBncmFkaW5nIHNob3VsZCBiZSBoYW5kbGVkLiAnCiAgICAgICAgICAgICAgICAgJyJlYWdlciIgLSBkZXBlbmRlbmNpZXMgYXJlIHVwZ3JhZGVkIHJlZ2FyZGxlc3Mgb2YgJwogICAgICAgICAgICAgICAgICd3aGV0aGVyIHRoZSBjdXJyZW50bHkgaW5zdGFsbGVkIHZlcnNpb24gc2F0aXNmaWVzIHRoZSAnCiAgICAgICAgICAgICAgICAgJ3JlcXVpcmVtZW50cyBvZiB0aGUgdXBncmFkZWQgcGFja2FnZShzKS4gJwogICAgICAgICAgICAgICAgICcib25seS1pZi1uZWVkZWQiIC0gIGFyZSB1cGdyYWRlZCBvbmx5IHdoZW4gdGhleSBkbyBub3QgJwogICAgICAgICAgICAgICAgICdzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIHVwZ3JhZGVkIHBhY2thZ2UocykuJwogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tZm9yY2UtcmVpbnN0YWxsJywKICAgICAgICAgICAgZGVzdD0nZm9yY2VfcmVpbnN0YWxsJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgaGVscD0nV2hlbiB1cGdyYWRpbmcsIHJlaW5zdGFsbCBhbGwgcGFja2FnZXMgZXZlbiBpZiB0aGV5IGFyZSAnCiAgICAgICAgICAgICAgICAgJ2FscmVhZHkgdXAtdG8tZGF0ZS4nKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLUknLCAnLS1pZ25vcmUtaW5zdGFsbGVkJywKICAgICAgICAgICAgZGVzdD0naWdub3JlX2luc3RhbGxlZCcsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGhlbHA9J0lnbm9yZSB0aGUgaW5zdGFsbGVkIHBhY2thZ2VzIChyZWluc3RhbGxpbmcgaW5zdGVhZCkuJykKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmlnbm9yZV9yZXF1aXJlc19weXRob24oKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fZGVwcygpKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuaW5zdGFsbF9vcHRpb25zKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmdsb2JhbF9vcHRpb25zKCkpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLXVzZXInLAogICAgICAgICAgICBkZXN0PSd1c2VfdXNlcl9zaXRlJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgaGVscD0iSW5zdGFsbCB0byB0aGUgUHl0aG9uIHVzZXIgaW5zdGFsbCBkaXJlY3RvcnkgZm9yIHlvdXIgIgogICAgICAgICAgICAgICAgICJwbGF0Zm9ybS4gVHlwaWNhbGx5IH4vLmxvY2FsLywgb3IgJUFQUERBVEElXFB5dGhvbiBvbiAiCiAgICAgICAgICAgICAgICAgIldpbmRvd3MuIChTZWUgdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uIGZvciBzaXRlLlVTRVJfQkFTRSAiCiAgICAgICAgICAgICAgICAgImZvciBmdWxsIGRldGFpbHMuKSIpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLWVnZycsCiAgICAgICAgICAgIGRlc3Q9J2FzX2VnZycsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGhlbHA9Ikluc3RhbGwgcGFja2FnZXMgYXMgZWdncywgbm90ICdmbGF0JywgbGlrZSBwaXAgbm9ybWFsbHkgIgogICAgICAgICAgICAgICAgICJkb2VzLiBUaGlzIG9wdGlvbiBpcyBub3QgYWJvdXQgaW5zdGFsbGluZyAqZnJvbSogZWdncy4gIgogICAgICAgICAgICAgICAgICIoV0FSTklORzogQmVjYXVzZSB0aGlzIG9wdGlvbiBvdmVycmlkZXMgcGlwJ3Mgbm9ybWFsIGluc3RhbGwiCiAgICAgICAgICAgICAgICAgIiBsb2dpYywgcmVxdWlyZW1lbnRzIGZpbGVzIG1heSBub3QgYmVoYXZlIGFzIGV4cGVjdGVkLikiKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1yb290JywKICAgICAgICAgICAgZGVzdD0ncm9vdF9wYXRoJywKICAgICAgICAgICAgbWV0YXZhcj0nZGlyJywKICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAogICAgICAgICAgICBoZWxwPSJJbnN0YWxsIGV2ZXJ5dGhpbmcgcmVsYXRpdmUgdG8gdGhpcyBhbHRlcm5hdGUgcm9vdCAiCiAgICAgICAgICAgICAgICAgImRpcmVjdG9yeS4iKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1wcmVmaXgnLAogICAgICAgICAgICBkZXN0PSdwcmVmaXhfcGF0aCcsCiAgICAgICAgICAgIG1ldGF2YXI9J2RpcicsCiAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgICAgaGVscD0iSW5zdGFsbGF0aW9uIHByZWZpeCB3aGVyZSBsaWIsIGJpbiBhbmQgb3RoZXIgdG9wLWxldmVsICIKICAgICAgICAgICAgICAgICAiZm9sZGVycyBhcmUgcGxhY2VkIikKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgIi0tY29tcGlsZSIsCiAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCiAgICAgICAgICAgIGRlc3Q9ImNvbXBpbGUiLAogICAgICAgICAgICBkZWZhdWx0PVRydWUsCiAgICAgICAgICAgIGhlbHA9IkNvbXBpbGUgcHkgZmlsZXMgdG8gcHljIiwKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICItLW5vLWNvbXBpbGUiLAogICAgICAgICAgICBhY3Rpb249InN0b3JlX2ZhbHNlIiwKICAgICAgICAgICAgZGVzdD0iY29tcGlsZSIsCiAgICAgICAgICAgIGhlbHA9IkRvIG5vdCBjb21waWxlIHB5IGZpbGVzIHRvIHB5YyIsCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMudXNlX3doZWVsKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm5vX3VzZV93aGVlbCgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5ub19iaW5hcnkoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMub25seV9iaW5hcnkoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMucHJlKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm5vX2NsZWFuKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnJlcXVpcmVfaGFzaGVzKCkpCgogICAgICAgIGluZGV4X29wdHMgPSBjbWRvcHRpb25zLm1ha2Vfb3B0aW9uX2dyb3VwKAogICAgICAgICAgICBjbWRvcHRpb25zLmluZGV4X2dyb3VwLAogICAgICAgICAgICBzZWxmLnBhcnNlciwKICAgICAgICApCgogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgaW5kZXhfb3B0cykKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIGNtZF9vcHRzKQoKICAgIGRlZiBydW4oc2VsZiwgb3B0aW9ucywgYXJncyk6CiAgICAgICAgY21kb3B0aW9ucy5yZXNvbHZlX3doZWVsX25vX3VzZV9iaW5hcnkob3B0aW9ucykKICAgICAgICBjbWRvcHRpb25zLmNoZWNrX2luc3RhbGxfYnVpbGRfZ2xvYmFsKG9wdGlvbnMpCgogICAgICAgIGlmIG9wdGlvbnMuYXNfZWdnOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tZWdnIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiAiCiAgICAgICAgICAgICAgICAiVGhpcyBmbGFnIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGxhcmdlIHBhcnRzIG9mIHBpcCwgYW5kICIKICAgICAgICAgICAgICAgICJhY3R1YWxseSB1c2luZyBpdCBpbnZhbGlkYXRlcyBwaXAncyBhYmlsaXR5IHRvIG1hbmFnZSB0aGUgIgogICAgICAgICAgICAgICAgImluc3RhbGxhdGlvbiBwcm9jZXNzLiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgb3B0aW9ucy5hbGxvd19leHRlcm5hbDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWFsbG93LWV4dGVybmFsIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAiCiAgICAgICAgICAgICAgICAidGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0IG5vICIKICAgICAgICAgICAgICAgICJsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRpb25zLmFsbG93X2FsbF9leHRlcm5hbDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWFsbG93LWFsbC1leHRlcm5hbCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgIgogICAgICAgICAgICAgICAgImluIHRoZSBmdXR1cmUuIER1ZSB0byBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IHByb3RvY29sLCBpdCAiCiAgICAgICAgICAgICAgICAibm8gbG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgb3B0aW9ucy5hbGxvd191bnZlcmlmaWVkOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctdW52ZXJpZmllZCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgIgogICAgICAgICAgICAgICAgImluIHRoZSBmdXR1cmUuIER1ZSB0byBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IHByb3RvY29sLCBpdCAiCiAgICAgICAgICAgICAgICAibm8gbG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgb3B0aW9ucy5kb3dubG9hZF9kaXI6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAicGlwIGluc3RhbGwgLS1kb3dubG9hZCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlICIKICAgICAgICAgICAgICAgICJyZW1vdmVkIGluIHRoZSBmdXR1cmUuIFBpcCBub3cgaGFzIGEgZG93bmxvYWQgY29tbWFuZCB0aGF0ICIKICAgICAgICAgICAgICAgICJzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKICAgICAgICAgICAgb3B0aW9ucy5pZ25vcmVfaW5zdGFsbGVkID0gVHJ1ZQoKICAgICAgICBpZiBvcHRpb25zLmJ1aWxkX2RpcjoKICAgICAgICAgICAgb3B0aW9ucy5idWlsZF9kaXIgPSBvcy5wYXRoLmFic3BhdGgob3B0aW9ucy5idWlsZF9kaXIpCgogICAgICAgIG9wdGlvbnMuc3JjX2RpciA9IG9zLnBhdGguYWJzcGF0aChvcHRpb25zLnNyY19kaXIpCiAgICAgICAgaW5zdGFsbF9vcHRpb25zID0gb3B0aW9ucy5pbnN0YWxsX29wdGlvbnMgb3IgW10KICAgICAgICBpZiBvcHRpb25zLnVzZV91c2VyX3NpdGU6CiAgICAgICAgICAgIGlmIG9wdGlvbnMucHJlZml4X3BhdGg6CiAgICAgICAgICAgICAgICByYWlzZSBDb21tYW5kRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIkNhbiBub3QgY29tYmluZSAnLS11c2VyJyBhbmQgJy0tcHJlZml4JyBhcyB0aGV5IGltcGx5ICIKICAgICAgICAgICAgICAgICAgICAiZGlmZmVyZW50IGluc3RhbGxhdGlvbiBsb2NhdGlvbnMiCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGlmIHZpcnR1YWxlbnZfbm9fZ2xvYmFsKCk6CiAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAiQ2FuIG5vdCBwZXJmb3JtIGEgJy0tdXNlcicgaW5zdGFsbC4gVXNlciBzaXRlLXBhY2thZ2VzICIKICAgICAgICAgICAgICAgICAgICAiYXJlIG5vdCB2aXNpYmxlIGluIHRoaXMgdmlydHVhbGVudi4iCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGluc3RhbGxfb3B0aW9ucy5hcHBlbmQoJy0tdXNlcicpCiAgICAgICAgICAgIGluc3RhbGxfb3B0aW9ucy5hcHBlbmQoJy0tcHJlZml4PScpCgogICAgICAgIHRlbXBfdGFyZ2V0X2RpciA9IE5vbmUKICAgICAgICBpZiBvcHRpb25zLnRhcmdldF9kaXI6CiAgICAgICAgICAgIG9wdGlvbnMuaWdub3JlX2luc3RhbGxlZCA9IFRydWUKICAgICAgICAgICAgdGVtcF90YXJnZXRfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICAgICAgICAgIG9wdGlvbnMudGFyZ2V0X2RpciA9IG9zLnBhdGguYWJzcGF0aChvcHRpb25zLnRhcmdldF9kaXIpCiAgICAgICAgICAgIGlmIChvcy5wYXRoLmV4aXN0cyhvcHRpb25zLnRhcmdldF9kaXIpIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmlzZGlyKG9wdGlvbnMudGFyZ2V0X2RpcikpOgogICAgICAgICAgICAgICAgcmFpc2UgQ29tbWFuZEVycm9yKAogICAgICAgICAgICAgICAgICAgICJUYXJnZXQgcGF0aCBleGlzdHMgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeSwgd2lsbCBub3QgIgogICAgICAgICAgICAgICAgICAgICJjb250aW51ZS4iCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGluc3RhbGxfb3B0aW9ucy5hcHBlbmQoJy0taG9tZT0nICsgdGVtcF90YXJnZXRfZGlyKQoKICAgICAgICBnbG9iYWxfb3B0aW9ucyA9IG9wdGlvbnMuZ2xvYmFsX29wdGlvbnMgb3IgW10KCiAgICAgICAgd2l0aCBzZWxmLl9idWlsZF9zZXNzaW9uKG9wdGlvbnMpIGFzIHNlc3Npb246CgogICAgICAgICAgICBmaW5kZXIgPSBzZWxmLl9idWlsZF9wYWNrYWdlX2ZpbmRlcihvcHRpb25zLCBzZXNzaW9uKQogICAgICAgICAgICBidWlsZF9kZWxldGUgPSAobm90IChvcHRpb25zLm5vX2NsZWFuIG9yIG9wdGlvbnMuYnVpbGRfZGlyKSkKICAgICAgICAgICAgd2hlZWxfY2FjaGUgPSBXaGVlbENhY2hlKG9wdGlvbnMuY2FjaGVfZGlyLCBvcHRpb25zLmZvcm1hdF9jb250cm9sKQogICAgICAgICAgICBpZiBvcHRpb25zLmNhY2hlX2RpciBhbmQgbm90IGNoZWNrX3BhdGhfb3duZXIob3B0aW9ucy5jYWNoZV9kaXIpOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgIlRoZSBkaXJlY3RvcnkgJyVzJyBvciBpdHMgcGFyZW50IGRpcmVjdG9yeSBpcyBub3Qgb3duZWQgIgogICAgICAgICAgICAgICAgICAgICJieSB0aGUgY3VycmVudCB1c2VyIGFuZCBjYWNoaW5nIHdoZWVscyBoYXMgYmVlbiAiCiAgICAgICAgICAgICAgICAgICAgImRpc2FibGVkLiBjaGVjayB0aGUgcGVybWlzc2lvbnMgYW5kIG93bmVyIG9mIHRoYXQgIgogICAgICAgICAgICAgICAgICAgICJkaXJlY3RvcnkuIElmIGV4ZWN1dGluZyBwaXAgd2l0aCBzdWRvLCB5b3UgbWF5IHdhbnQgIgogICAgICAgICAgICAgICAgICAgICJzdWRvJ3MgLUggZmxhZy4iLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FjaGVfZGlyLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgb3B0aW9ucy5jYWNoZV9kaXIgPSBOb25lCgogICAgICAgICAgICB3aXRoIEJ1aWxkRGlyZWN0b3J5KG9wdGlvbnMuYnVpbGRfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZT1idWlsZF9kZWxldGUpIGFzIGJ1aWxkX2RpcjoKICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldCA9IFJlcXVpcmVtZW50U2V0KAogICAgICAgICAgICAgICAgICAgIGJ1aWxkX2Rpcj1idWlsZF9kaXIsCiAgICAgICAgICAgICAgICAgICAgc3JjX2Rpcj1vcHRpb25zLnNyY19kaXIsCiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfZGlyPW9wdGlvbnMuZG93bmxvYWRfZGlyLAogICAgICAgICAgICAgICAgICAgIHVwZ3JhZGU9b3B0aW9ucy51cGdyYWRlLAogICAgICAgICAgICAgICAgICAgIHVwZ3JhZGVfc3RyYXRlZ3k9b3B0aW9ucy51cGdyYWRlX3N0cmF0ZWd5LAogICAgICAgICAgICAgICAgICAgIGFzX2VnZz1vcHRpb25zLmFzX2VnZywKICAgICAgICAgICAgICAgICAgICBpZ25vcmVfaW5zdGFsbGVkPW9wdGlvbnMuaWdub3JlX2luc3RhbGxlZCwKICAgICAgICAgICAgICAgICAgICBpZ25vcmVfZGVwZW5kZW5jaWVzPW9wdGlvbnMuaWdub3JlX2RlcGVuZGVuY2llcywKICAgICAgICAgICAgICAgICAgICBpZ25vcmVfcmVxdWlyZXNfcHl0aG9uPW9wdGlvbnMuaWdub3JlX3JlcXVpcmVzX3B5dGhvbiwKICAgICAgICAgICAgICAgICAgICBmb3JjZV9yZWluc3RhbGw9b3B0aW9ucy5mb3JjZV9yZWluc3RhbGwsCiAgICAgICAgICAgICAgICAgICAgdXNlX3VzZXJfc2l0ZT1vcHRpb25zLnVzZV91c2VyX3NpdGUsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2Rpcj10ZW1wX3RhcmdldF9kaXIsCiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbj1zZXNzaW9uLAogICAgICAgICAgICAgICAgICAgIHB5Y29tcGlsZT1vcHRpb25zLmNvbXBpbGUsCiAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZWQ9b3B0aW9ucy5pc29sYXRlZF9tb2RlLAogICAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlLAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfaGFzaGVzPW9wdGlvbnMucmVxdWlyZV9oYXNoZXMsCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgc2VsZi5wb3B1bGF0ZV9yZXF1aXJlbWVudF9zZXQoCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LCBhcmdzLCBvcHRpb25zLCBmaW5kZXIsIHNlc3Npb24sIHNlbGYubmFtZSwKICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZQogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIGlmIG5vdCByZXF1aXJlbWVudF9zZXQuaGFzX3JlcXVpcmVtZW50czoKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZG93bmxvYWRfZGlyIG9yIG5vdCB3aGVlbCBvciBub3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FjaGVfZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgIyBvbiAtZCBkb24ndCBkbyBjb21wbGV4IHRoaW5ncyBsaWtlIGJ1aWxkaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICMgd2hlZWxzLCBhbmQgZG9uJ3QgdHJ5IHRvIGJ1aWxkIHdoZWVscyB3aGVuIHdoZWVsIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICMgbm90IGluc3RhbGxlZC4KICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LnByZXBhcmVfZmlsZXMoZmluZGVyKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICMgYnVpbGQgd2hlZWxzIGJlZm9yZSBpbnN0YWxsLgogICAgICAgICAgICAgICAgICAgICAgICB3YiA9IFdoZWVsQnVpbGRlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkX29wdGlvbnM9W10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfb3B0aW9ucz1bXSwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAjIElnbm9yZSB0aGUgcmVzdWx0OiBhIGZhaWxlZCB3aGVlbCB3aWxsIGJlCiAgICAgICAgICAgICAgICAgICAgICAgICMgaW5zdGFsbGVkIGZyb20gdGhlIHNkaXN0L3ZjcyB3aGF0ZXZlci4KICAgICAgICAgICAgICAgICAgICAgICAgd2IuYnVpbGQoYXV0b2J1aWxkaW5nPVRydWUpCgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcHRpb25zLmRvd25sb2FkX2RpcjoKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0Lmluc3RhbGwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsX29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Q9b3B0aW9ucy5yb290X3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9b3B0aW9ucy5wcmVmaXhfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVfbGliX2xvY2F0aW9ucyA9IGdldF9saWJfbG9jYXRpb25fZ3Vlc3NlcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXI9b3B0aW9ucy51c2VfdXNlcl9zaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9tZT10ZW1wX3RhcmdldF9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290PW9wdGlvbnMucm9vdF9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4PW9wdGlvbnMucHJlZml4X3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc29sYXRlZD1vcHRpb25zLmlzb2xhdGVkX21vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgcmVxcyA9IHNvcnRlZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5zdWNjZXNzZnVsbHlfaW5zdGFsbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PW9wZXJhdG9yLmF0dHJnZXR0ZXIoJ25hbWUnKSkKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMgPSBbXQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgcmVxIGluIHJlcXM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gcmVxLm5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWRfdmVyc2lvbiA9IGdldF9pbnN0YWxsZWRfdmVyc2lvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLm5hbWUsIHBvc3NpYmxlX2xpYl9sb2NhdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaW5zdGFsbGVkX3ZlcnNpb246CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gKz0gJy0nICsgaW5zdGFsbGVkX3ZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuYXBwZW5kKGl0ZW0pCiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZCA9ICcgJy5qb2luKGl0ZW1zKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBpbnN0YWxsZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnU3VjY2Vzc2Z1bGx5IGluc3RhbGxlZCAlcycsIGluc3RhbGxlZCkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZGVkID0gJyAnLmpvaW4oWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLm5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciByZXEgaW4gcmVxdWlyZW1lbnRfc2V0LnN1Y2Nlc3NmdWxseV9kb3dubG9hZGVkCiAgICAgICAgICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRvd25sb2FkZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU3VjY2Vzc2Z1bGx5IGRvd25sb2FkZWQgJXMnLCBkb3dubG9hZGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBleGNlcHQgUHJldmlvdXNCdWlsZERpckVycm9yOgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMubm9fY2xlYW4gPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgICAgIyBDbGVhbiB1cAogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcHRpb25zLm5vX2NsZWFuOgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQuY2xlYW51cF9maWxlcygpCgogICAgICAgIGlmIG9wdGlvbnMudGFyZ2V0X2RpcjoKICAgICAgICAgICAgZW5zdXJlX2RpcihvcHRpb25zLnRhcmdldF9kaXIpCgogICAgICAgICAgICAjIENoZWNraW5nIGJvdGggcHVyZWxpYiBhbmQgcGxhdGxpYiBkaXJlY3RvcmllcyBmb3IgaW5zdGFsbGVkCiAgICAgICAgICAgICMgcGFja2FnZXMgdG8gYmUgbW92ZWQgdG8gdGFyZ2V0IGRpcmVjdG9yeQogICAgICAgICAgICBsaWJfZGlyX2xpc3QgPSBbXQoKICAgICAgICAgICAgcHVyZWxpYl9kaXIgPSBkaXN0dXRpbHNfc2NoZW1lKCcnLCBob21lPXRlbXBfdGFyZ2V0X2RpcilbJ3B1cmVsaWInXQogICAgICAgICAgICBwbGF0bGliX2RpciA9IGRpc3R1dGlsc19zY2hlbWUoJycsIGhvbWU9dGVtcF90YXJnZXRfZGlyKVsncGxhdGxpYiddCgogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwdXJlbGliX2Rpcik6CiAgICAgICAgICAgICAgICBsaWJfZGlyX2xpc3QuYXBwZW5kKHB1cmVsaWJfZGlyKQogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwbGF0bGliX2RpcikgYW5kIHBsYXRsaWJfZGlyICE9IHB1cmVsaWJfZGlyOgogICAgICAgICAgICAgICAgbGliX2Rpcl9saXN0LmFwcGVuZChwbGF0bGliX2RpcikKCiAgICAgICAgICAgIGZvciBsaWJfZGlyIGluIGxpYl9kaXJfbGlzdDoKICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIG9zLmxpc3RkaXIobGliX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2l0ZW1fZGlyID0gb3MucGF0aC5qb2luKG9wdGlvbnMudGFyZ2V0X2RpciwgaXRlbSkKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh0YXJnZXRfaXRlbV9kaXIpOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3B0aW9ucy51cGdyYWRlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RhcmdldCBkaXJlY3RvcnkgJXMgYWxyZWFkeSBleGlzdHMuIFNwZWNpZnkgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLXVwZ3JhZGUgdG8gZm9yY2UgcmVwbGFjZW1lbnQuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfaXRlbV9kaXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNsaW5rKHRhcmdldF9pdGVtX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGFyZ2V0IGRpcmVjdG9yeSAlcyBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhIGxpbmsuIFBpcCB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IHJlcGxhY2UgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rcywgcGxlYXNlIHJlbW92ZSBpZiByZXBsYWNlbWVudCBpcyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rlc2lyZWQuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfaXRlbV9kaXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIodGFyZ2V0X2l0ZW1fZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodGFyZ2V0X2l0ZW1fZGlyKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRhcmdldF9pdGVtX2RpcikKCiAgICAgICAgICAgICAgICAgICAgc2h1dGlsLm1vdmUoCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihsaWJfZGlyLCBpdGVtKSwKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2l0ZW1fZGlyCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBfdGFyZ2V0X2RpcikKICAgICAgICByZXR1cm4gcmVxdWlyZW1lbnRfc2V0CgoKZGVmIGdldF9saWJfbG9jYXRpb25fZ3Vlc3NlcygqYXJncywgKiprd2FyZ3MpOgogICAgc2NoZW1lID0gZGlzdHV0aWxzX3NjaGVtZSgnJywgKmFyZ3MsICoqa3dhcmdzKQogICAgcmV0dXJuIFtzY2hlbWVbJ3B1cmVsaWInXSwgc2NoZW1lWydwbGF0bGliJ11dClBLAwQUAAAAAAAAACEAD0vHOGksAABpLAAAJAAAAHB5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvbGlzdC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQganNvbgppbXBvcnQgbG9nZ2luZwppbXBvcnQgd2FybmluZ3MKdHJ5OgogICAgZnJvbSBpdGVydG9vbHMgaW1wb3J0IHppcF9sb25nZXN0CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gaXRlcnRvb2xzIGltcG9ydCBpemlwX2xvbmdlc3QgYXMgemlwX2xvbmdlc3QKCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHNpeAoKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IENvbW1hbmQKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgQ29tbWFuZEVycm9yCmZyb20gcGlwLmluZGV4IGltcG9ydCBQYWNrYWdlRmluZGVyCmZyb20gcGlwLnV0aWxzIGltcG9ydCAoCiAgICBnZXRfaW5zdGFsbGVkX2Rpc3RyaWJ1dGlvbnMsIGRpc3RfaXNfZWRpdGFibGUpCmZyb20gcGlwLnV0aWxzLmRlcHJlY2F0aW9uIGltcG9ydCBSZW1vdmVkSW5QaXAxMFdhcm5pbmcKZnJvbSBwaXAuY21kb3B0aW9ucyBpbXBvcnQgbWFrZV9vcHRpb25fZ3JvdXAsIGluZGV4X2dyb3VwCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBMaXN0Q29tbWFuZChDb21tYW5kKToKICAgICIiIgogICAgTGlzdCBpbnN0YWxsZWQgcGFja2FnZXMsIGluY2x1ZGluZyBlZGl0YWJsZXMuCgogICAgUGFja2FnZXMgYXJlIGxpc3RlZCBpbiBhIGNhc2UtaW5zZW5zaXRpdmUgc29ydGVkIG9yZGVyLgogICAgIiIiCiAgICBuYW1lID0gJ2xpc3QnCiAgICB1c2FnZSA9ICIiIgogICAgICAlcHJvZyBbb3B0aW9uc10iIiIKICAgIHN1bW1hcnkgPSAnTGlzdCBpbnN0YWxsZWQgcGFja2FnZXMuJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgc3VwZXIoTGlzdENvbW1hbmQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3KQoKICAgICAgICBjbWRfb3B0cyA9IHNlbGYuY21kX29wdHMKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1vJywgJy0tb3V0ZGF0ZWQnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICBoZWxwPSdMaXN0IG91dGRhdGVkIHBhY2thZ2VzJykKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLXUnLCAnLS11cHRvZGF0ZScsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgIGhlbHA9J0xpc3QgdXB0b2RhdGUgcGFja2FnZXMnKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctZScsICctLWVkaXRhYmxlJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgaGVscD0nTGlzdCBlZGl0YWJsZSBwcm9qZWN0cy4nKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctbCcsICctLWxvY2FsJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgaGVscD0oJ0lmIGluIGEgdmlydHVhbGVudiB0aGF0IGhhcyBnbG9iYWwgYWNjZXNzLCBkbyBub3QgbGlzdCAnCiAgICAgICAgICAgICAgICAgICdnbG9iYWxseS1pbnN0YWxsZWQgcGFja2FnZXMuJyksCiAgICAgICAgKQogICAgICAgIHNlbGYuY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tdXNlcicsCiAgICAgICAgICAgIGRlc3Q9J3VzZXInLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICBoZWxwPSdPbmx5IG91dHB1dCBwYWNrYWdlcyBpbnN0YWxsZWQgaW4gdXNlci1zaXRlLicpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLXByZScsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgIGhlbHA9KCJJbmNsdWRlIHByZS1yZWxlYXNlIGFuZCBkZXZlbG9wbWVudCB2ZXJzaW9ucy4gQnkgZGVmYXVsdCwgIgogICAgICAgICAgICAgICAgICAicGlwIG9ubHkgZmluZHMgc3RhYmxlIHZlcnNpb25zLiIpLAogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tZm9ybWF0JywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgIGRlc3Q9J2xpc3RfZm9ybWF0JywKICAgICAgICAgICAgY2hvaWNlcz0oJ2xlZ2FjeScsICdjb2x1bW5zJywgJ2ZyZWV6ZScsICdqc29uJyksCiAgICAgICAgICAgIGhlbHA9IlNlbGVjdCB0aGUgb3V0cHV0IGZvcm1hdCBhbW9uZzogbGVnYWN5IChkZWZhdWx0KSwgY29sdW1ucywgIgogICAgICAgICAgICAgICAgICJmcmVlemUgb3IganNvbi4iLAogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tbm90LXJlcXVpcmVkJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVzdD0nbm90X3JlcXVpcmVkJywKICAgICAgICAgICAgaGVscD0iTGlzdCBwYWNrYWdlcyB0aGF0IGFyZSBub3QgZGVwZW5kZW5jaWVzIG9mICIKICAgICAgICAgICAgICAgICAiaW5zdGFsbGVkIHBhY2thZ2VzLiIsCiAgICAgICAgKQoKICAgICAgICBpbmRleF9vcHRzID0gbWFrZV9vcHRpb25fZ3JvdXAoaW5kZXhfZ3JvdXAsIHNlbGYucGFyc2VyKQoKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIGluZGV4X29wdHMpCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBjbWRfb3B0cykKCiAgICBkZWYgX2J1aWxkX3BhY2thZ2VfZmluZGVyKHNlbGYsIG9wdGlvbnMsIGluZGV4X3VybHMsIHNlc3Npb24pOgogICAgICAgICIiIgogICAgICAgIENyZWF0ZSBhIHBhY2thZ2UgZmluZGVyIGFwcHJvcHJpYXRlIHRvIHRoaXMgbGlzdCBjb21tYW5kLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBQYWNrYWdlRmluZGVyKAogICAgICAgICAgICBmaW5kX2xpbmtzPW9wdGlvbnMuZmluZF9saW5rcywKICAgICAgICAgICAgaW5kZXhfdXJscz1pbmRleF91cmxzLAogICAgICAgICAgICBhbGxvd19hbGxfcHJlcmVsZWFzZXM9b3B0aW9ucy5wcmUsCiAgICAgICAgICAgIHRydXN0ZWRfaG9zdHM9b3B0aW9ucy50cnVzdGVkX2hvc3RzLAogICAgICAgICAgICBwcm9jZXNzX2RlcGVuZGVuY3lfbGlua3M9b3B0aW9ucy5wcm9jZXNzX2RlcGVuZGVuY3lfbGlua3MsCiAgICAgICAgICAgIHNlc3Npb249c2Vzc2lvbiwKICAgICAgICApCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICBpZiBvcHRpb25zLmFsbG93X2V4dGVybmFsOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctZXh0ZXJuYWwgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICJ0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgbm8gIgogICAgICAgICAgICAgICAgImxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMuYWxsb3dfYWxsX2V4dGVybmFsOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctYWxsLWV4dGVybmFsIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCAiCiAgICAgICAgICAgICAgICAiaW4gdGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0ICIKICAgICAgICAgICAgICAgICJubyBsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRpb25zLmFsbG93X3VudmVyaWZpZWQ6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy11bnZlcmlmaWVkIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCAiCiAgICAgICAgICAgICAgICAiaW4gdGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0ICIKICAgICAgICAgICAgICAgICJubyBsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRpb25zLmxpc3RfZm9ybWF0IGlzIE5vbmU6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiVGhlIGRlZmF1bHQgZm9ybWF0IHdpbGwgc3dpdGNoIHRvIGNvbHVtbnMgaW4gdGhlIGZ1dHVyZS4gIgogICAgICAgICAgICAgICAgIllvdSBjYW4gdXNlIC0tZm9ybWF0PShsZWdhY3l8Y29sdW1ucykgKG9yIGRlZmluZSBhICIKICAgICAgICAgICAgICAgICJmb3JtYXQ9KGxlZ2FjeXxjb2x1bW5zKSBpbiB5b3VyIHBpcC5jb25mIHVuZGVyIHRoZSBbbGlzdF0gIgogICAgICAgICAgICAgICAgInNlY3Rpb24pIHRvIGRpc2FibGUgdGhpcyB3YXJuaW5nLiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgb3B0aW9ucy5vdXRkYXRlZCBhbmQgb3B0aW9ucy51cHRvZGF0ZToKICAgICAgICAgICAgcmFpc2UgQ29tbWFuZEVycm9yKAogICAgICAgICAgICAgICAgIk9wdGlvbnMgLS1vdXRkYXRlZCBhbmQgLS11cHRvZGF0ZSBjYW5ub3QgYmUgY29tYmluZWQuIikKCiAgICAgICAgcGFja2FnZXMgPSBnZXRfaW5zdGFsbGVkX2Rpc3RyaWJ1dGlvbnMoCiAgICAgICAgICAgIGxvY2FsX29ubHk9b3B0aW9ucy5sb2NhbCwKICAgICAgICAgICAgdXNlcl9vbmx5PW9wdGlvbnMudXNlciwKICAgICAgICAgICAgZWRpdGFibGVzX29ubHk9b3B0aW9ucy5lZGl0YWJsZSwKICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMub3V0ZGF0ZWQ6CiAgICAgICAgICAgIHBhY2thZ2VzID0gc2VsZi5nZXRfb3V0ZGF0ZWQocGFja2FnZXMsIG9wdGlvbnMpCiAgICAgICAgZWxpZiBvcHRpb25zLnVwdG9kYXRlOgogICAgICAgICAgICBwYWNrYWdlcyA9IHNlbGYuZ2V0X3VwdG9kYXRlKHBhY2thZ2VzLCBvcHRpb25zKQoKICAgICAgICBpZiBvcHRpb25zLm5vdF9yZXF1aXJlZDoKICAgICAgICAgICAgcGFja2FnZXMgPSBzZWxmLmdldF9ub3RfcmVxdWlyZWQocGFja2FnZXMsIG9wdGlvbnMpCgogICAgICAgIHNlbGYub3V0cHV0X3BhY2thZ2VfbGlzdGluZyhwYWNrYWdlcywgb3B0aW9ucykKCiAgICBkZWYgZ2V0X291dGRhdGVkKHNlbGYsIHBhY2thZ2VzLCBvcHRpb25zKToKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICBkaXN0IGZvciBkaXN0IGluIHNlbGYuaXRlcl9wYWNrYWdlc19sYXRlc3RfaW5mb3MocGFja2FnZXMsIG9wdGlvbnMpCiAgICAgICAgICAgIGlmIGRpc3QubGF0ZXN0X3ZlcnNpb24gPiBkaXN0LnBhcnNlZF92ZXJzaW9uCiAgICAgICAgXQoKICAgIGRlZiBnZXRfdXB0b2RhdGUoc2VsZiwgcGFja2FnZXMsIG9wdGlvbnMpOgogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIGRpc3QgZm9yIGRpc3QgaW4gc2VsZi5pdGVyX3BhY2thZ2VzX2xhdGVzdF9pbmZvcyhwYWNrYWdlcywgb3B0aW9ucykKICAgICAgICAgICAgaWYgZGlzdC5sYXRlc3RfdmVyc2lvbiA9PSBkaXN0LnBhcnNlZF92ZXJzaW9uCiAgICAgICAgXQoKICAgIGRlZiBnZXRfbm90X3JlcXVpcmVkKHNlbGYsIHBhY2thZ2VzLCBvcHRpb25zKToKICAgICAgICBkZXBfa2V5cyA9IHNldCgpCiAgICAgICAgZm9yIGRpc3QgaW4gcGFja2FnZXM6CiAgICAgICAgICAgIGRlcF9rZXlzLnVwZGF0ZShyZXF1aXJlbWVudC5rZXkgZm9yIHJlcXVpcmVtZW50IGluIGRpc3QucmVxdWlyZXMoKSkKICAgICAgICByZXR1cm4gc2V0KHBrZyBmb3IgcGtnIGluIHBhY2thZ2VzIGlmIHBrZy5rZXkgbm90IGluIGRlcF9rZXlzKQoKICAgIGRlZiBpdGVyX3BhY2thZ2VzX2xhdGVzdF9pbmZvcyhzZWxmLCBwYWNrYWdlcywgb3B0aW9ucyk6CiAgICAgICAgaW5kZXhfdXJscyA9IFtvcHRpb25zLmluZGV4X3VybF0gKyBvcHRpb25zLmV4dHJhX2luZGV4X3VybHMKICAgICAgICBpZiBvcHRpb25zLm5vX2luZGV4OgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0lnbm9yaW5nIGluZGV4ZXM6ICVzJywgJywnLmpvaW4oaW5kZXhfdXJscykpCiAgICAgICAgICAgIGluZGV4X3VybHMgPSBbXQoKICAgICAgICBkZXBlbmRlbmN5X2xpbmtzID0gW10KICAgICAgICBmb3IgZGlzdCBpbiBwYWNrYWdlczoKICAgICAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ2RlcGVuZGVuY3lfbGlua3MudHh0Jyk6CiAgICAgICAgICAgICAgICBkZXBlbmRlbmN5X2xpbmtzLmV4dGVuZCgKICAgICAgICAgICAgICAgICAgICBkaXN0LmdldF9tZXRhZGF0YV9saW5lcygnZGVwZW5kZW5jeV9saW5rcy50eHQnKSwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgd2l0aCBzZWxmLl9idWlsZF9zZXNzaW9uKG9wdGlvbnMpIGFzIHNlc3Npb246CiAgICAgICAgICAgIGZpbmRlciA9IHNlbGYuX2J1aWxkX3BhY2thZ2VfZmluZGVyKG9wdGlvbnMsIGluZGV4X3VybHMsIHNlc3Npb24pCiAgICAgICAgICAgIGZpbmRlci5hZGRfZGVwZW5kZW5jeV9saW5rcyhkZXBlbmRlbmN5X2xpbmtzKQoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gcGFja2FnZXM6CiAgICAgICAgICAgICAgICB0eXAgPSAndW5rbm93bicKICAgICAgICAgICAgICAgIGFsbF9jYW5kaWRhdGVzID0gZmluZGVyLmZpbmRfYWxsX2NhbmRpZGF0ZXMoZGlzdC5rZXkpCiAgICAgICAgICAgICAgICBpZiBub3Qgb3B0aW9ucy5wcmU6CiAgICAgICAgICAgICAgICAgICAgIyBSZW1vdmUgcHJlcmVsZWFzZXMKICAgICAgICAgICAgICAgICAgICBhbGxfY2FuZGlkYXRlcyA9IFtjYW5kaWRhdGUgZm9yIGNhbmRpZGF0ZSBpbiBhbGxfY2FuZGlkYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjYW5kaWRhdGUudmVyc2lvbi5pc19wcmVyZWxlYXNlXQoKICAgICAgICAgICAgICAgIGlmIG5vdCBhbGxfY2FuZGlkYXRlczoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgYmVzdF9jYW5kaWRhdGUgPSBtYXgoYWxsX2NhbmRpZGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9ZmluZGVyLl9jYW5kaWRhdGVfc29ydF9rZXkpCiAgICAgICAgICAgICAgICByZW1vdGVfdmVyc2lvbiA9IGJlc3RfY2FuZGlkYXRlLnZlcnNpb24KICAgICAgICAgICAgICAgIGlmIGJlc3RfY2FuZGlkYXRlLmxvY2F0aW9uLmlzX3doZWVsOgogICAgICAgICAgICAgICAgICAgIHR5cCA9ICd3aGVlbCcKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgdHlwID0gJ3NkaXN0JwogICAgICAgICAgICAgICAgIyBUaGlzIGlzIGRpcnR5IGJ1dCBtYWtlcyB0aGUgcmVzdCBvZiB0aGUgY29kZSBtdWNoIGNsZWFuZXIKICAgICAgICAgICAgICAgIGRpc3QubGF0ZXN0X3ZlcnNpb24gPSByZW1vdGVfdmVyc2lvbgogICAgICAgICAgICAgICAgZGlzdC5sYXRlc3RfZmlsZXR5cGUgPSB0eXAKICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKCiAgICBkZWYgb3V0cHV0X2xlZ2FjeShzZWxmLCBkaXN0KToKICAgICAgICBpZiBkaXN0X2lzX2VkaXRhYmxlKGRpc3QpOgogICAgICAgICAgICByZXR1cm4gJyVzICglcywgJXMpJyAlICgKICAgICAgICAgICAgICAgIGRpc3QucHJvamVjdF9uYW1lLAogICAgICAgICAgICAgICAgZGlzdC52ZXJzaW9uLAogICAgICAgICAgICAgICAgZGlzdC5sb2NhdGlvbiwKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAnJXMgKCVzKScgJSAoZGlzdC5wcm9qZWN0X25hbWUsIGRpc3QudmVyc2lvbikKCiAgICBkZWYgb3V0cHV0X2xlZ2FjeV9sYXRlc3Qoc2VsZiwgZGlzdCk6CiAgICAgICAgcmV0dXJuICclcyAtIExhdGVzdDogJXMgWyVzXScgJSAoCiAgICAgICAgICAgIHNlbGYub3V0cHV0X2xlZ2FjeShkaXN0KSwKICAgICAgICAgICAgZGlzdC5sYXRlc3RfdmVyc2lvbiwKICAgICAgICAgICAgZGlzdC5sYXRlc3RfZmlsZXR5cGUsCiAgICAgICAgKQoKICAgIGRlZiBvdXRwdXRfcGFja2FnZV9saXN0aW5nKHNlbGYsIHBhY2thZ2VzLCBvcHRpb25zKToKICAgICAgICBwYWNrYWdlcyA9IHNvcnRlZCgKICAgICAgICAgICAgcGFja2FnZXMsCiAgICAgICAgICAgIGtleT1sYW1iZGEgZGlzdDogZGlzdC5wcm9qZWN0X25hbWUubG93ZXIoKSwKICAgICAgICApCiAgICAgICAgaWYgb3B0aW9ucy5saXN0X2Zvcm1hdCA9PSAnY29sdW1ucycgYW5kIHBhY2thZ2VzOgogICAgICAgICAgICBkYXRhLCBoZWFkZXIgPSBmb3JtYXRfZm9yX2NvbHVtbnMocGFja2FnZXMsIG9wdGlvbnMpCiAgICAgICAgICAgIHNlbGYub3V0cHV0X3BhY2thZ2VfbGlzdGluZ19jb2x1bW5zKGRhdGEsIGhlYWRlcikKICAgICAgICBlbGlmIG9wdGlvbnMubGlzdF9mb3JtYXQgPT0gJ2ZyZWV6ZSc6CiAgICAgICAgICAgIGZvciBkaXN0IGluIHBhY2thZ2VzOgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIiVzPT0lcyIsIGRpc3QucHJvamVjdF9uYW1lLCBkaXN0LnZlcnNpb24pCiAgICAgICAgZWxpZiBvcHRpb25zLmxpc3RfZm9ybWF0ID09ICdqc29uJzoKICAgICAgICAgICAgbG9nZ2VyLmluZm8oZm9ybWF0X2Zvcl9qc29uKHBhY2thZ2VzLCBvcHRpb25zKSkKICAgICAgICBlbHNlOiAgIyBsZWdhY3kKICAgICAgICAgICAgZm9yIGRpc3QgaW4gcGFja2FnZXM6CiAgICAgICAgICAgICAgICBpZiBvcHRpb25zLm91dGRhdGVkOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKHNlbGYub3V0cHV0X2xlZ2FjeV9sYXRlc3QoZGlzdCkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKHNlbGYub3V0cHV0X2xlZ2FjeShkaXN0KSkKCiAgICBkZWYgb3V0cHV0X3BhY2thZ2VfbGlzdGluZ19jb2x1bW5zKHNlbGYsIGRhdGEsIGhlYWRlcik6CiAgICAgICAgIyBpbnNlcnQgdGhlIGhlYWRlciBmaXJzdDogd2UgbmVlZCB0byBrbm93IHRoZSBzaXplIG9mIGNvbHVtbiBuYW1lcwogICAgICAgIGlmIGxlbihkYXRhKSA+IDA6CiAgICAgICAgICAgIGRhdGEuaW5zZXJ0KDAsIGhlYWRlcikKCiAgICAgICAgcGtnX3N0cmluZ3MsIHNpemVzID0gdGFidWxhdGUoZGF0YSkKCiAgICAgICAgIyBDcmVhdGUgYW5kIGFkZCBhIHNlcGFyYXRvci4KICAgICAgICBpZiBsZW4oZGF0YSkgPiAwOgogICAgICAgICAgICBwa2dfc3RyaW5ncy5pbnNlcnQoMSwgIiAiLmpvaW4obWFwKGxhbWJkYSB4OiAnLScgKiB4LCBzaXplcykpKQoKICAgICAgICBmb3IgdmFsIGluIHBrZ19zdHJpbmdzOgogICAgICAgICAgICBsb2dnZXIuaW5mbyh2YWwpCgoKZGVmIHRhYnVsYXRlKHZhbHMpOgogICAgIyBGcm9tIHBmbW9vcmUgb24gR2l0SHViOgogICAgIyBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzM2NTEjaXNzdWVjb21tZW50LTIxNjkzMjU2NAogICAgYXNzZXJ0IGxlbih2YWxzKSA+IDAKCiAgICBzaXplcyA9IFswXSAqIG1heChsZW4oeCkgZm9yIHggaW4gdmFscykKICAgIGZvciByb3cgaW4gdmFsczoKICAgICAgICBzaXplcyA9IFttYXgocywgbGVuKHN0cihjKSkpIGZvciBzLCBjIGluIHppcF9sb25nZXN0KHNpemVzLCByb3cpXQoKICAgIHJlc3VsdCA9IFtdCiAgICBmb3Igcm93IGluIHZhbHM6CiAgICAgICAgZGlzcGxheSA9ICIgIi5qb2luKFtzdHIoYykubGp1c3QocykgaWYgYyBpcyBub3QgTm9uZSBlbHNlICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcywgYyBpbiB6aXBfbG9uZ2VzdChzaXplcywgcm93KV0pCiAgICAgICAgcmVzdWx0LmFwcGVuZChkaXNwbGF5KQoKICAgIHJldHVybiByZXN1bHQsIHNpemVzCgoKZGVmIGZvcm1hdF9mb3JfY29sdW1ucyhwa2dzLCBvcHRpb25zKToKICAgICIiIgogICAgQ29udmVydCB0aGUgcGFja2FnZSBkYXRhIGludG8gc29tZXRoaW5nIHVzYWJsZQogICAgYnkgb3V0cHV0X3BhY2thZ2VfbGlzdGluZ19jb2x1bW5zLgogICAgIiIiCiAgICBydW5uaW5nX291dGRhdGVkID0gb3B0aW9ucy5vdXRkYXRlZAogICAgIyBBZGp1c3QgdGhlIGhlYWRlciBmb3IgdGhlIGBwaXAgbGlzdCAtLW91dGRhdGVkYCBjYXNlLgogICAgaWYgcnVubmluZ19vdXRkYXRlZDoKICAgICAgICBoZWFkZXIgPSBbIlBhY2thZ2UiLCAiVmVyc2lvbiIsICJMYXRlc3QiLCAiVHlwZSJdCiAgICBlbHNlOgogICAgICAgIGhlYWRlciA9IFsiUGFja2FnZSIsICJWZXJzaW9uIl0KCiAgICBkYXRhID0gW10KICAgIGlmIGFueShkaXN0X2lzX2VkaXRhYmxlKHgpIGZvciB4IGluIHBrZ3MpOgogICAgICAgIGhlYWRlci5hcHBlbmQoIkxvY2F0aW9uIikKCiAgICBmb3IgcHJvaiBpbiBwa2dzOgogICAgICAgICMgaWYgd2UncmUgd29ya2luZyBvbiB0aGUgJ291dGRhdGVkJyBsaXN0LCBzZXBhcmF0ZSBvdXQgdGhlCiAgICAgICAgIyBsYXRlc3RfdmVyc2lvbiBhbmQgdHlwZQogICAgICAgIHJvdyA9IFtwcm9qLnByb2plY3RfbmFtZSwgcHJvai52ZXJzaW9uXQoKICAgICAgICBpZiBydW5uaW5nX291dGRhdGVkOgogICAgICAgICAgICByb3cuYXBwZW5kKHByb2oubGF0ZXN0X3ZlcnNpb24pCiAgICAgICAgICAgIHJvdy5hcHBlbmQocHJvai5sYXRlc3RfZmlsZXR5cGUpCgogICAgICAgIGlmIGRpc3RfaXNfZWRpdGFibGUocHJvaik6CiAgICAgICAgICAgIHJvdy5hcHBlbmQocHJvai5sb2NhdGlvbikKCiAgICAgICAgZGF0YS5hcHBlbmQocm93KQoKICAgIHJldHVybiBkYXRhLCBoZWFkZXIKCgpkZWYgZm9ybWF0X2Zvcl9qc29uKHBhY2thZ2VzLCBvcHRpb25zKToKICAgIGRhdGEgPSBbXQogICAgZm9yIGRpc3QgaW4gcGFja2FnZXM6CiAgICAgICAgaW5mbyA9IHsKICAgICAgICAgICAgJ25hbWUnOiBkaXN0LnByb2plY3RfbmFtZSwKICAgICAgICAgICAgJ3ZlcnNpb24nOiBzaXgudGV4dF90eXBlKGRpc3QudmVyc2lvbiksCiAgICAgICAgfQogICAgICAgIGlmIG9wdGlvbnMub3V0ZGF0ZWQ6CiAgICAgICAgICAgIGluZm9bJ2xhdGVzdF92ZXJzaW9uJ10gPSBzaXgudGV4dF90eXBlKGRpc3QubGF0ZXN0X3ZlcnNpb24pCiAgICAgICAgICAgIGluZm9bJ2xhdGVzdF9maWxldHlwZSddID0gZGlzdC5sYXRlc3RfZmlsZXR5cGUKICAgICAgICBkYXRhLmFwcGVuZChpbmZvKQogICAgcmV0dXJuIGpzb24uZHVtcHMoZGF0YSkKUEsDBBQAAAAAAAAAIQCuQoTclhEAAJYRAAAmAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9zZWFyY2gucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHN5cwppbXBvcnQgdGV4dHdyYXAKCmZyb20gcGlwLmJhc2Vjb21tYW5kIGltcG9ydCBDb21tYW5kLCBTVUNDRVNTCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgT3JkZXJlZERpY3QKZnJvbSBwaXAuZG93bmxvYWQgaW1wb3J0IFBpcFhtbHJwY1RyYW5zcG9ydApmcm9tIHBpcC5tb2RlbHMgaW1wb3J0IFB5UEkKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGdldF90ZXJtaW5hbF9zaXplCmZyb20gcGlwLnV0aWxzLmxvZ2dpbmcgaW1wb3J0IGluZGVudF9sb2cKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgQ29tbWFuZEVycm9yCmZyb20gcGlwLnN0YXR1c19jb2RlcyBpbXBvcnQgTk9fTUFUQ0hFU19GT1VORApmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZy52ZXJzaW9uIGltcG9ydCBwYXJzZSBhcyBwYXJzZV92ZXJzaW9uCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHBrZ19yZXNvdXJjZXMKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMgaW1wb3J0IHhtbHJwY19jbGllbnQKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBTZWFyY2hDb21tYW5kKENvbW1hbmQpOgogICAgIiIiU2VhcmNoIGZvciBQeVBJIHBhY2thZ2VzIHdob3NlIG5hbWUgb3Igc3VtbWFyeSBjb250YWlucyA8cXVlcnk+LiIiIgogICAgbmFtZSA9ICdzZWFyY2gnCiAgICB1c2FnZSA9ICIiIgogICAgICAlcHJvZyBbb3B0aW9uc10gPHF1ZXJ5PiIiIgogICAgc3VtbWFyeSA9ICdTZWFyY2ggUHlQSSBmb3IgcGFja2FnZXMuJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgc3VwZXIoU2VhcmNoQ29tbWFuZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLWknLCAnLS1pbmRleCcsCiAgICAgICAgICAgIGRlc3Q9J2luZGV4JywKICAgICAgICAgICAgbWV0YXZhcj0nVVJMJywKICAgICAgICAgICAgZGVmYXVsdD1QeVBJLnB5cGlfdXJsLAogICAgICAgICAgICBoZWxwPSdCYXNlIFVSTCBvZiBQeXRob24gUGFja2FnZSBJbmRleCAoZGVmYXVsdCAlZGVmYXVsdCknKQoKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIHNlbGYuY21kX29wdHMpCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICBpZiBub3QgYXJnczoKICAgICAgICAgICAgcmFpc2UgQ29tbWFuZEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50IChzZWFyY2ggcXVlcnkpLicpCiAgICAgICAgcXVlcnkgPSBhcmdzCiAgICAgICAgcHlwaV9oaXRzID0gc2VsZi5zZWFyY2gocXVlcnksIG9wdGlvbnMpCiAgICAgICAgaGl0cyA9IHRyYW5zZm9ybV9oaXRzKHB5cGlfaGl0cykKCiAgICAgICAgdGVybWluYWxfd2lkdGggPSBOb25lCiAgICAgICAgaWYgc3lzLnN0ZG91dC5pc2F0dHkoKToKICAgICAgICAgICAgdGVybWluYWxfd2lkdGggPSBnZXRfdGVybWluYWxfc2l6ZSgpWzBdCgogICAgICAgIHByaW50X3Jlc3VsdHMoaGl0cywgdGVybWluYWxfd2lkdGg9dGVybWluYWxfd2lkdGgpCiAgICAgICAgaWYgcHlwaV9oaXRzOgogICAgICAgICAgICByZXR1cm4gU1VDQ0VTUwogICAgICAgIHJldHVybiBOT19NQVRDSEVTX0ZPVU5ECgogICAgZGVmIHNlYXJjaChzZWxmLCBxdWVyeSwgb3B0aW9ucyk6CiAgICAgICAgaW5kZXhfdXJsID0gb3B0aW9ucy5pbmRleAogICAgICAgIHdpdGggc2VsZi5fYnVpbGRfc2Vzc2lvbihvcHRpb25zKSBhcyBzZXNzaW9uOgogICAgICAgICAgICB0cmFuc3BvcnQgPSBQaXBYbWxycGNUcmFuc3BvcnQoaW5kZXhfdXJsLCBzZXNzaW9uKQogICAgICAgICAgICBweXBpID0geG1scnBjX2NsaWVudC5TZXJ2ZXJQcm94eShpbmRleF91cmwsIHRyYW5zcG9ydCkKICAgICAgICAgICAgaGl0cyA9IHB5cGkuc2VhcmNoKHsnbmFtZSc6IHF1ZXJ5LCAnc3VtbWFyeSc6IHF1ZXJ5fSwgJ29yJykKICAgICAgICAgICAgcmV0dXJuIGhpdHMKCgpkZWYgdHJhbnNmb3JtX2hpdHMoaGl0cyk6CiAgICAiIiIKICAgIFRoZSBsaXN0IGZyb20gcHlwaSBpcyByZWFsbHkgYSBsaXN0IG9mIHZlcnNpb25zLiBXZSB3YW50IGEgbGlzdCBvZgogICAgcGFja2FnZXMgd2l0aCB0aGUgbGlzdCBvZiB2ZXJzaW9ucyBzdG9yZWQgaW5saW5lLiBUaGlzIGNvbnZlcnRzIHRoZQogICAgbGlzdCBmcm9tIHB5cGkgaW50byBvbmUgd2UgY2FuIHVzZS4KICAgICIiIgogICAgcGFja2FnZXMgPSBPcmRlcmVkRGljdCgpCiAgICBmb3IgaGl0IGluIGhpdHM6CiAgICAgICAgbmFtZSA9IGhpdFsnbmFtZSddCiAgICAgICAgc3VtbWFyeSA9IGhpdFsnc3VtbWFyeSddCiAgICAgICAgdmVyc2lvbiA9IGhpdFsndmVyc2lvbiddCgogICAgICAgIGlmIG5hbWUgbm90IGluIHBhY2thZ2VzLmtleXMoKToKICAgICAgICAgICAgcGFja2FnZXNbbmFtZV0gPSB7CiAgICAgICAgICAgICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICAgICAgICAgICAnc3VtbWFyeSc6IHN1bW1hcnksCiAgICAgICAgICAgICAgICAndmVyc2lvbnMnOiBbdmVyc2lvbl0sCiAgICAgICAgICAgIH0KICAgICAgICBlbHNlOgogICAgICAgICAgICBwYWNrYWdlc1tuYW1lXVsndmVyc2lvbnMnXS5hcHBlbmQodmVyc2lvbikKCiAgICAgICAgICAgICMgaWYgdGhpcyBpcyB0aGUgaGlnaGVzdCB2ZXJzaW9uLCByZXBsYWNlIHN1bW1hcnkgYW5kIHNjb3JlCiAgICAgICAgICAgIGlmIHZlcnNpb24gPT0gaGlnaGVzdF92ZXJzaW9uKHBhY2thZ2VzW25hbWVdWyd2ZXJzaW9ucyddKToKICAgICAgICAgICAgICAgIHBhY2thZ2VzW25hbWVdWydzdW1tYXJ5J10gPSBzdW1tYXJ5CgogICAgcmV0dXJuIGxpc3QocGFja2FnZXMudmFsdWVzKCkpCgoKZGVmIHByaW50X3Jlc3VsdHMoaGl0cywgbmFtZV9jb2x1bW5fd2lkdGg9Tm9uZSwgdGVybWluYWxfd2lkdGg9Tm9uZSk6CiAgICBpZiBub3QgaGl0czoKICAgICAgICByZXR1cm4KICAgIGlmIG5hbWVfY29sdW1uX3dpZHRoIGlzIE5vbmU6CiAgICAgICAgbmFtZV9jb2x1bW5fd2lkdGggPSBtYXgoWwogICAgICAgICAgICBsZW4oaGl0WyduYW1lJ10pICsgbGVuKGhpdC5nZXQoJ3ZlcnNpb25zJywgWyctJ10pWy0xXSkKICAgICAgICAgICAgZm9yIGhpdCBpbiBoaXRzCiAgICAgICAgXSkgKyA0CgogICAgaW5zdGFsbGVkX3BhY2thZ2VzID0gW3AucHJvamVjdF9uYW1lIGZvciBwIGluIHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXRdCiAgICBmb3IgaGl0IGluIGhpdHM6CiAgICAgICAgbmFtZSA9IGhpdFsnbmFtZSddCiAgICAgICAgc3VtbWFyeSA9IGhpdFsnc3VtbWFyeSddIG9yICcnCiAgICAgICAgdmVyc2lvbiA9IGhpdC5nZXQoJ3ZlcnNpb25zJywgWyctJ10pWy0xXQogICAgICAgIGlmIHRlcm1pbmFsX3dpZHRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICB0YXJnZXRfd2lkdGggPSB0ZXJtaW5hbF93aWR0aCAtIG5hbWVfY29sdW1uX3dpZHRoIC0gNQogICAgICAgICAgICBpZiB0YXJnZXRfd2lkdGggPiAxMDoKICAgICAgICAgICAgICAgICMgd3JhcCBhbmQgaW5kZW50IHN1bW1hcnkgdG8gZml0IHRlcm1pbmFsCiAgICAgICAgICAgICAgICBzdW1tYXJ5ID0gdGV4dHdyYXAud3JhcChzdW1tYXJ5LCB0YXJnZXRfd2lkdGgpCiAgICAgICAgICAgICAgICBzdW1tYXJ5ID0gKCdcbicgKyAnICcgKiAobmFtZV9jb2x1bW5fd2lkdGggKyAzKSkuam9pbihzdW1tYXJ5KQoKICAgICAgICBsaW5lID0gJyUtKnMgLSAlcycgJSAobmFtZV9jb2x1bW5fd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcyAoJXMpJyAlIChuYW1lLCB2ZXJzaW9uKSwgc3VtbWFyeSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGxpbmUpCiAgICAgICAgICAgIGlmIG5hbWUgaW4gaW5zdGFsbGVkX3BhY2thZ2VzOgogICAgICAgICAgICAgICAgZGlzdCA9IHBrZ19yZXNvdXJjZXMuZ2V0X2Rpc3RyaWJ1dGlvbihuYW1lKQogICAgICAgICAgICAgICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgICAgICAgICAgICAgbGF0ZXN0ID0gaGlnaGVzdF92ZXJzaW9uKGhpdFsndmVyc2lvbnMnXSkKICAgICAgICAgICAgICAgICAgICBpZiBkaXN0LnZlcnNpb24gPT0gbGF0ZXN0OgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnSU5TVEFMTEVEOiAlcyAobGF0ZXN0KScsIGRpc3QudmVyc2lvbikKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnSU5TVEFMTEVEOiAlcycsIGRpc3QudmVyc2lvbikKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0xBVEVTVDogICAgJXMnLCBsYXRlc3QpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICAgICAgcGFzcwoKCmRlZiBoaWdoZXN0X3ZlcnNpb24odmVyc2lvbnMpOgogICAgcmV0dXJuIG1heCh2ZXJzaW9ucywga2V5PXBhcnNlX3ZlcnNpb24pClBLAwQUAAAAAAAAACEADFMfJAMXAAADFwAAJAAAAHB5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvc2hvdy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgpmcm9tIGVtYWlsLnBhcnNlciBpbXBvcnQgRmVlZFBhcnNlcgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKCmZyb20gcGlwLmJhc2Vjb21tYW5kIGltcG9ydCBDb21tYW5kCmZyb20gcGlwLnN0YXR1c19jb2RlcyBpbXBvcnQgU1VDQ0VTUywgRVJST1IKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgcGtnX3Jlc291cmNlcwpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZy51dGlscyBpbXBvcnQgY2Fub25pY2FsaXplX25hbWUKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBTaG93Q29tbWFuZChDb21tYW5kKToKICAgICIiIlNob3cgaW5mb3JtYXRpb24gYWJvdXQgb25lIG9yIG1vcmUgaW5zdGFsbGVkIHBhY2thZ2VzLiIiIgogICAgbmFtZSA9ICdzaG93JwogICAgdXNhZ2UgPSAiIiIKICAgICAgJXByb2cgW29wdGlvbnNdIDxwYWNrYWdlPiAuLi4iIiIKICAgIHN1bW1hcnkgPSAnU2hvdyBpbmZvcm1hdGlvbiBhYm91dCBpbnN0YWxsZWQgcGFja2FnZXMuJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgc3VwZXIoU2hvd0NvbW1hbmQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3KQogICAgICAgIHNlbGYuY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1mJywgJy0tZmlsZXMnLAogICAgICAgICAgICBkZXN0PSdmaWxlcycsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgIGhlbHA9J1Nob3cgdGhlIGZ1bGwgbGlzdCBvZiBpbnN0YWxsZWQgZmlsZXMgZm9yIGVhY2ggcGFja2FnZS4nKQoKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIHNlbGYuY21kX29wdHMpCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICBpZiBub3QgYXJnczoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0VSUk9SOiBQbGVhc2UgcHJvdmlkZSBhIHBhY2thZ2UgbmFtZSBvciBuYW1lcy4nKQogICAgICAgICAgICByZXR1cm4gRVJST1IKICAgICAgICBxdWVyeSA9IGFyZ3MKCiAgICAgICAgcmVzdWx0cyA9IHNlYXJjaF9wYWNrYWdlc19pbmZvKHF1ZXJ5KQogICAgICAgIGlmIG5vdCBwcmludF9yZXN1bHRzKAogICAgICAgICAgICAgICAgcmVzdWx0cywgbGlzdF9maWxlcz1vcHRpb25zLmZpbGVzLCB2ZXJib3NlPW9wdGlvbnMudmVyYm9zZSk6CiAgICAgICAgICAgIHJldHVybiBFUlJPUgogICAgICAgIHJldHVybiBTVUNDRVNTCgoKZGVmIHNlYXJjaF9wYWNrYWdlc19pbmZvKHF1ZXJ5KToKICAgICIiIgogICAgR2F0aGVyIGRldGFpbHMgZnJvbSBpbnN0YWxsZWQgZGlzdHJpYnV0aW9ucy4gUHJpbnQgZGlzdHJpYnV0aW9uIG5hbWUsCiAgICB2ZXJzaW9uLCBsb2NhdGlvbiwgYW5kIGluc3RhbGxlZCBmaWxlcy4gSW5zdGFsbGVkIGZpbGVzIHJlcXVpcmVzIGEKICAgIHBpcCBnZW5lcmF0ZWQgJ2luc3RhbGxlZC1maWxlcy50eHQnIGluIHRoZSBkaXN0cmlidXRpb25zICcuZWdnLWluZm8nCiAgICBkaXJlY3RvcnkuCiAgICAiIiIKICAgIGluc3RhbGxlZCA9IHt9CiAgICBmb3IgcCBpbiBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0OgogICAgICAgIGluc3RhbGxlZFtjYW5vbmljYWxpemVfbmFtZShwLnByb2plY3RfbmFtZSldID0gcAoKICAgIHF1ZXJ5X25hbWVzID0gW2Nhbm9uaWNhbGl6ZV9uYW1lKG5hbWUpIGZvciBuYW1lIGluIHF1ZXJ5XQoKICAgIGZvciBkaXN0IGluIFtpbnN0YWxsZWRbcGtnXSBmb3IgcGtnIGluIHF1ZXJ5X25hbWVzIGlmIHBrZyBpbiBpbnN0YWxsZWRdOgogICAgICAgIHBhY2thZ2UgPSB7CiAgICAgICAgICAgICduYW1lJzogZGlzdC5wcm9qZWN0X25hbWUsCiAgICAgICAgICAgICd2ZXJzaW9uJzogZGlzdC52ZXJzaW9uLAogICAgICAgICAgICAnbG9jYXRpb24nOiBkaXN0LmxvY2F0aW9uLAogICAgICAgICAgICAncmVxdWlyZXMnOiBbZGVwLnByb2plY3RfbmFtZSBmb3IgZGVwIGluIGRpc3QucmVxdWlyZXMoKV0sCiAgICAgICAgfQogICAgICAgIGZpbGVfbGlzdCA9IE5vbmUKICAgICAgICBtZXRhZGF0YSA9IE5vbmUKICAgICAgICBpZiBpc2luc3RhbmNlKGRpc3QsIHBrZ19yZXNvdXJjZXMuRGlzdEluZm9EaXN0cmlidXRpb24pOgogICAgICAgICAgICAjIFJFQ09SRHMgc2hvdWxkIGJlIHBhcnQgb2YgLmRpc3QtaW5mbyBtZXRhZGF0YXMKICAgICAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ1JFQ09SRCcpOgogICAgICAgICAgICAgICAgbGluZXMgPSBkaXN0LmdldF9tZXRhZGF0YV9saW5lcygnUkVDT1JEJykKICAgICAgICAgICAgICAgIHBhdGhzID0gW2wuc3BsaXQoJywnKVswXSBmb3IgbCBpbiBsaW5lc10KICAgICAgICAgICAgICAgIHBhdGhzID0gW29zLnBhdGguam9pbihkaXN0LmxvY2F0aW9uLCBwKSBmb3IgcCBpbiBwYXRoc10KICAgICAgICAgICAgICAgIGZpbGVfbGlzdCA9IFtvcy5wYXRoLnJlbHBhdGgocCwgZGlzdC5sb2NhdGlvbikgZm9yIHAgaW4gcGF0aHNdCgogICAgICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnTUVUQURBVEEnKToKICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gZGlzdC5nZXRfbWV0YWRhdGEoJ01FVEFEQVRBJykKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE90aGVyd2lzZSB1c2UgcGlwJ3MgbG9nIGZvciAuZWdnLWluZm8ncwogICAgICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnaW5zdGFsbGVkLWZpbGVzLnR4dCcpOgogICAgICAgICAgICAgICAgcGF0aHMgPSBkaXN0LmdldF9tZXRhZGF0YV9saW5lcygnaW5zdGFsbGVkLWZpbGVzLnR4dCcpCiAgICAgICAgICAgICAgICBwYXRocyA9IFtvcy5wYXRoLmpvaW4oZGlzdC5lZ2dfaW5mbywgcCkgZm9yIHAgaW4gcGF0aHNdCiAgICAgICAgICAgICAgICBmaWxlX2xpc3QgPSBbb3MucGF0aC5yZWxwYXRoKHAsIGRpc3QubG9jYXRpb24pIGZvciBwIGluIHBhdGhzXQoKICAgICAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ1BLRy1JTkZPJyk6CiAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IGRpc3QuZ2V0X21ldGFkYXRhKCdQS0ctSU5GTycpCgogICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdlbnRyeV9wb2ludHMudHh0Jyk6CiAgICAgICAgICAgIGVudHJ5X3BvaW50cyA9IGRpc3QuZ2V0X21ldGFkYXRhX2xpbmVzKCdlbnRyeV9wb2ludHMudHh0JykKICAgICAgICAgICAgcGFja2FnZVsnZW50cnlfcG9pbnRzJ10gPSBlbnRyeV9wb2ludHMKCiAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ0lOU1RBTExFUicpOgogICAgICAgICAgICBmb3IgbGluZSBpbiBkaXN0LmdldF9tZXRhZGF0YV9saW5lcygnSU5TVEFMTEVSJyk6CiAgICAgICAgICAgICAgICBpZiBsaW5lLnN0cmlwKCk6CiAgICAgICAgICAgICAgICAgICAgcGFja2FnZVsnaW5zdGFsbGVyJ10gPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAjIEB0b2RvOiBTaG91bGQgcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24gaGF2ZSBhCiAgICAgICAgIyBgZ2V0X3BrZ19pbmZvYCBtZXRob2Q/CiAgICAgICAgZmVlZF9wYXJzZXIgPSBGZWVkUGFyc2VyKCkKICAgICAgICBmZWVkX3BhcnNlci5mZWVkKG1ldGFkYXRhKQogICAgICAgIHBrZ19pbmZvX2RpY3QgPSBmZWVkX3BhcnNlci5jbG9zZSgpCiAgICAgICAgZm9yIGtleSBpbiAoJ21ldGFkYXRhLXZlcnNpb24nLCAnc3VtbWFyeScsCiAgICAgICAgICAgICAgICAgICAgJ2hvbWUtcGFnZScsICdhdXRob3InLCAnYXV0aG9yLWVtYWlsJywgJ2xpY2Vuc2UnKToKICAgICAgICAgICAgcGFja2FnZVtrZXldID0gcGtnX2luZm9fZGljdC5nZXQoa2V5KQoKICAgICAgICAjIEl0IGxvb2tzIGxpa2UgRmVlZFBhcnNlciBjYW5ub3QgZGVhbCB3aXRoIHJlcGVhdGVkIGhlYWRlcnMKICAgICAgICBjbGFzc2lmaWVycyA9IFtdCiAgICAgICAgZm9yIGxpbmUgaW4gbWV0YWRhdGEuc3BsaXRsaW5lcygpOgogICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJ0NsYXNzaWZpZXI6ICcpOgogICAgICAgICAgICAgICAgY2xhc3NpZmllcnMuYXBwZW5kKGxpbmVbbGVuKCdDbGFzc2lmaWVyOiAnKTpdKQogICAgICAgIHBhY2thZ2VbJ2NsYXNzaWZpZXJzJ10gPSBjbGFzc2lmaWVycwoKICAgICAgICBpZiBmaWxlX2xpc3Q6CiAgICAgICAgICAgIHBhY2thZ2VbJ2ZpbGVzJ10gPSBzb3J0ZWQoZmlsZV9saXN0KQogICAgICAgIHlpZWxkIHBhY2thZ2UKCgpkZWYgcHJpbnRfcmVzdWx0cyhkaXN0cmlidXRpb25zLCBsaXN0X2ZpbGVzPUZhbHNlLCB2ZXJib3NlPUZhbHNlKToKICAgICIiIgogICAgUHJpbnQgdGhlIGluZm9ybWF0aW9ucyBmcm9tIGluc3RhbGxlZCBkaXN0cmlidXRpb25zIGZvdW5kLgogICAgIiIiCiAgICByZXN1bHRzX3ByaW50ZWQgPSBGYWxzZQogICAgZm9yIGksIGRpc3QgaW4gZW51bWVyYXRlKGRpc3RyaWJ1dGlvbnMpOgogICAgICAgIHJlc3VsdHNfcHJpbnRlZCA9IFRydWUKICAgICAgICBpZiBpID4gMDoKICAgICAgICAgICAgbG9nZ2VyLmluZm8oIi0tLSIpCiAgICAgICAgbG9nZ2VyLmluZm8oIk5hbWU6ICVzIiwgZGlzdC5nZXQoJ25hbWUnLCAnJykpCiAgICAgICAgbG9nZ2VyLmluZm8oIlZlcnNpb246ICVzIiwgZGlzdC5nZXQoJ3ZlcnNpb24nLCAnJykpCiAgICAgICAgbG9nZ2VyLmluZm8oIlN1bW1hcnk6ICVzIiwgZGlzdC5nZXQoJ3N1bW1hcnknLCAnJykpCiAgICAgICAgbG9nZ2VyLmluZm8oIkhvbWUtcGFnZTogJXMiLCBkaXN0LmdldCgnaG9tZS1wYWdlJywgJycpKQogICAgICAgIGxvZ2dlci5pbmZvKCJBdXRob3I6ICVzIiwgZGlzdC5nZXQoJ2F1dGhvcicsICcnKSkKICAgICAgICBsb2dnZXIuaW5mbygiQXV0aG9yLWVtYWlsOiAlcyIsIGRpc3QuZ2V0KCdhdXRob3ItZW1haWwnLCAnJykpCiAgICAgICAgbG9nZ2VyLmluZm8oIkxpY2Vuc2U6ICVzIiwgZGlzdC5nZXQoJ2xpY2Vuc2UnLCAnJykpCiAgICAgICAgbG9nZ2VyLmluZm8oIkxvY2F0aW9uOiAlcyIsIGRpc3QuZ2V0KCdsb2NhdGlvbicsICcnKSkKICAgICAgICBsb2dnZXIuaW5mbygiUmVxdWlyZXM6ICVzIiwgJywgJy5qb2luKGRpc3QuZ2V0KCdyZXF1aXJlcycsIFtdKSkpCiAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oIk1ldGFkYXRhLVZlcnNpb246ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdC5nZXQoJ21ldGFkYXRhLXZlcnNpb24nLCAnJykpCiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJJbnN0YWxsZXI6ICVzIiwgZGlzdC5nZXQoJ2luc3RhbGxlcicsICcnKSkKICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkNsYXNzaWZpZXJzOiIpCiAgICAgICAgICAgIGZvciBjbGFzc2lmaWVyIGluIGRpc3QuZ2V0KCdjbGFzc2lmaWVycycsIFtdKToKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCIgICVzIiwgY2xhc3NpZmllcikKICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkVudHJ5LXBvaW50czoiKQogICAgICAgICAgICBmb3IgZW50cnkgaW4gZGlzdC5nZXQoJ2VudHJ5X3BvaW50cycsIFtdKToKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCIgICVzIiwgZW50cnkuc3RyaXAoKSkKICAgICAgICBpZiBsaXN0X2ZpbGVzOgogICAgICAgICAgICBsb2dnZXIuaW5mbygiRmlsZXM6IikKICAgICAgICAgICAgZm9yIGxpbmUgaW4gZGlzdC5nZXQoJ2ZpbGVzJywgW10pOgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIiAgJXMiLCBsaW5lLnN0cmlwKCkpCiAgICAgICAgICAgIGlmICJmaWxlcyIgbm90IGluIGRpc3Q6CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiQ2Fubm90IGxvY2F0ZSBpbnN0YWxsZWQtZmlsZXMudHh0IikKICAgIHJldHVybiByZXN1bHRzX3ByaW50ZWQKUEsDBBQAAAAAAAAAIQCriRk/RAsAAEQLAAApAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy91bmluc3RhbGwucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHBpcApmcm9tIHBpcC53aGVlbCBpbXBvcnQgV2hlZWxDYWNoZQpmcm9tIHBpcC5yZXEgaW1wb3J0IEluc3RhbGxSZXF1aXJlbWVudCwgUmVxdWlyZW1lbnRTZXQsIHBhcnNlX3JlcXVpcmVtZW50cwpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgQ29tbWFuZApmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBJbnN0YWxsYXRpb25FcnJvcgoKCmNsYXNzIFVuaW5zdGFsbENvbW1hbmQoQ29tbWFuZCk6CiAgICAiIiIKICAgIFVuaW5zdGFsbCBwYWNrYWdlcy4KCiAgICBwaXAgaXMgYWJsZSB0byB1bmluc3RhbGwgbW9zdCBpbnN0YWxsZWQgcGFja2FnZXMuIEtub3duIGV4Y2VwdGlvbnMgYXJlOgoKICAgIC0gUHVyZSBkaXN0dXRpbHMgcGFja2FnZXMgaW5zdGFsbGVkIHdpdGggYGBweXRob24gc2V0dXAucHkgaW5zdGFsbGBgLCB3aGljaAogICAgICBsZWF2ZSBiZWhpbmQgbm8gbWV0YWRhdGEgdG8gZGV0ZXJtaW5lIHdoYXQgZmlsZXMgd2VyZSBpbnN0YWxsZWQuCiAgICAtIFNjcmlwdCB3cmFwcGVycyBpbnN0YWxsZWQgYnkgYGBweXRob24gc2V0dXAucHkgZGV2ZWxvcGBgLgogICAgIiIiCiAgICBuYW1lID0gJ3VuaW5zdGFsbCcKICAgIHVzYWdlID0gIiIiCiAgICAgICVwcm9nIFtvcHRpb25zXSA8cGFja2FnZT4gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSAtciA8cmVxdWlyZW1lbnRzIGZpbGU+IC4uLiIiIgogICAgc3VtbWFyeSA9ICdVbmluc3RhbGwgcGFja2FnZXMuJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgc3VwZXIoVW5pbnN0YWxsQ29tbWFuZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLXInLCAnLS1yZXF1aXJlbWVudCcsCiAgICAgICAgICAgIGRlc3Q9J3JlcXVpcmVtZW50cycsCiAgICAgICAgICAgIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICAgICAgbWV0YXZhcj0nZmlsZScsCiAgICAgICAgICAgIGhlbHA9J1VuaW5zdGFsbCBhbGwgdGhlIHBhY2thZ2VzIGxpc3RlZCBpbiB0aGUgZ2l2ZW4gcmVxdWlyZW1lbnRzICcKICAgICAgICAgICAgICAgICAnZmlsZS4gIFRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIG11bHRpcGxlIHRpbWVzLicsCiAgICAgICAgKQogICAgICAgIHNlbGYuY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy15JywgJy0teWVzJywKICAgICAgICAgICAgZGVzdD0neWVzJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgaGVscD0iRG9uJ3QgYXNrIGZvciBjb25maXJtYXRpb24gb2YgdW5pbnN0YWxsIGRlbGV0aW9ucy4iKQoKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIHNlbGYuY21kX29wdHMpCgogICAgZGVmIHJ1bihzZWxmLCBvcHRpb25zLCBhcmdzKToKICAgICAgICB3aXRoIHNlbGYuX2J1aWxkX3Nlc3Npb24ob3B0aW9ucykgYXMgc2Vzc2lvbjoKICAgICAgICAgICAgZm9ybWF0X2NvbnRyb2wgPSBwaXAuaW5kZXguRm9ybWF0Q29udHJvbChzZXQoKSwgc2V0KCkpCiAgICAgICAgICAgIHdoZWVsX2NhY2hlID0gV2hlZWxDYWNoZShvcHRpb25zLmNhY2hlX2RpciwgZm9ybWF0X2NvbnRyb2wpCiAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldCA9IFJlcXVpcmVtZW50U2V0KAogICAgICAgICAgICAgICAgYnVpbGRfZGlyPU5vbmUsCiAgICAgICAgICAgICAgICBzcmNfZGlyPU5vbmUsCiAgICAgICAgICAgICAgICBkb3dubG9hZF9kaXI9Tm9uZSwKICAgICAgICAgICAgICAgIGlzb2xhdGVkPW9wdGlvbnMuaXNvbGF0ZWRfbW9kZSwKICAgICAgICAgICAgICAgIHNlc3Npb249c2Vzc2lvbiwKICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlLAogICAgICAgICAgICApCiAgICAgICAgICAgIGZvciBuYW1lIGluIGFyZ3M6CiAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQuYWRkX3JlcXVpcmVtZW50KAogICAgICAgICAgICAgICAgICAgIEluc3RhbGxSZXF1aXJlbWVudC5mcm9tX2xpbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGlzb2xhdGVkPW9wdGlvbnMuaXNvbGF0ZWRfbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcHRpb25zLnJlcXVpcmVtZW50czoKICAgICAgICAgICAgICAgIGZvciByZXEgaW4gcGFyc2VfcmVxdWlyZW1lbnRzKAogICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz1vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uPXNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlKToKICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQuYWRkX3JlcXVpcmVtZW50KHJlcSkKICAgICAgICAgICAgaWYgbm90IHJlcXVpcmVtZW50X3NldC5oYXNfcmVxdWlyZW1lbnRzOgogICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ1lvdSBtdXN0IGdpdmUgYXQgbGVhc3Qgb25lIHJlcXVpcmVtZW50IHRvICUobmFtZSlzIChzZWUgJwogICAgICAgICAgICAgICAgICAgICcicGlwIGhlbHAgJShuYW1lKXMiKScgJSBkaWN0KG5hbWU9c2VsZi5uYW1lKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICByZXF1aXJlbWVudF9zZXQudW5pbnN0YWxsKGF1dG9fY29uZmlybT1vcHRpb25zLnllcykKUEsDBBQAAAAAAAAAIQCXN3PmMR4AADEeAAAlAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy93aGVlbC5weSMgLSotIGNvZGluZzogdXRmLTggLSotCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHdhcm5pbmdzCgpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgUmVxdWlyZW1lbnRDb21tYW5kCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IENvbW1hbmRFcnJvciwgUHJldmlvdXNCdWlsZERpckVycm9yCmZyb20gcGlwLnJlcSBpbXBvcnQgUmVxdWlyZW1lbnRTZXQKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGltcG9ydF9vcl9yYWlzZQpmcm9tIHBpcC51dGlscy5idWlsZCBpbXBvcnQgQnVpbGREaXJlY3RvcnkKZnJvbSBwaXAudXRpbHMuZGVwcmVjYXRpb24gaW1wb3J0IFJlbW92ZWRJblBpcDEwV2FybmluZwpmcm9tIHBpcC53aGVlbCBpbXBvcnQgV2hlZWxDYWNoZSwgV2hlZWxCdWlsZGVyCmZyb20gcGlwIGltcG9ydCBjbWRvcHRpb25zCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgV2hlZWxDb21tYW5kKFJlcXVpcmVtZW50Q29tbWFuZCk6CiAgICAiIiIKICAgIEJ1aWxkIFdoZWVsIGFyY2hpdmVzIGZvciB5b3VyIHJlcXVpcmVtZW50cyBhbmQgZGVwZW5kZW5jaWVzLgoKICAgIFdoZWVsIGlzIGEgYnVpbHQtcGFja2FnZSBmb3JtYXQsIGFuZCBvZmZlcnMgdGhlIGFkdmFudGFnZSBvZiBub3QKICAgIHJlY29tcGlsaW5nIHlvdXIgc29mdHdhcmUgZHVyaW5nIGV2ZXJ5IGluc3RhbGwuIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUKICAgIHdoZWVsIGRvY3M6IGh0dHBzOi8vd2hlZWwucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0LwoKICAgIFJlcXVpcmVtZW50czogc2V0dXB0b29scz49MC44LCBhbmQgd2hlZWwuCgogICAgJ3BpcCB3aGVlbCcgdXNlcyB0aGUgYmRpc3Rfd2hlZWwgc2V0dXB0b29scyBleHRlbnNpb24gZnJvbSB0aGUgd2hlZWwKICAgIHBhY2thZ2UgdG8gYnVpbGQgaW5kaXZpZHVhbCB3aGVlbHMuCgogICAgIiIiCgogICAgbmFtZSA9ICd3aGVlbCcKICAgIHVzYWdlID0gIiIiCiAgICAgICVwcm9nIFtvcHRpb25zXSA8cmVxdWlyZW1lbnQgc3BlY2lmaWVyPiAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIC1yIDxyZXF1aXJlbWVudHMgZmlsZT4gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSBbLWVdIDx2Y3MgcHJvamVjdCB1cmw+IC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gWy1lXSA8bG9jYWwgcHJvamVjdCBwYXRoPiAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIDxhcmNoaXZlIHVybC9wYXRoPiAuLi4iIiIKCiAgICBzdW1tYXJ5ID0gJ0J1aWxkIHdoZWVscyBmcm9tIHlvdXIgcmVxdWlyZW1lbnRzLicKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgIHN1cGVyKFdoZWVsQ29tbWFuZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCgogICAgICAgIGNtZF9vcHRzID0gc2VsZi5jbWRfb3B0cwoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLXcnLCAnLS13aGVlbC1kaXInLAogICAgICAgICAgICBkZXN0PSd3aGVlbF9kaXInLAogICAgICAgICAgICBtZXRhdmFyPSdkaXInLAogICAgICAgICAgICBkZWZhdWx0PW9zLmN1cmRpciwKICAgICAgICAgICAgaGVscD0oIkJ1aWxkIHdoZWVscyBpbnRvIDxkaXI+LCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgIgogICAgICAgICAgICAgICAgICAiY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4iKSwKICAgICAgICApCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnVzZV93aGVlbCgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5ub191c2Vfd2hlZWwoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fYmluYXJ5KCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm9ubHlfYmluYXJ5KCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tYnVpbGQtb3B0aW9uJywKICAgICAgICAgICAgZGVzdD0nYnVpbGRfb3B0aW9ucycsCiAgICAgICAgICAgIG1ldGF2YXI9J29wdGlvbnMnLAogICAgICAgICAgICBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgICAgIGhlbHA9IkV4dHJhIGFyZ3VtZW50cyB0byBiZSBzdXBwbGllZCB0byAnc2V0dXAucHkgYmRpc3Rfd2hlZWwnLiIpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmNvbnN0cmFpbnRzKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmVkaXRhYmxlKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnJlcXVpcmVtZW50cygpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5zcmMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuaWdub3JlX3JlcXVpcmVzX3B5dGhvbigpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5ub19kZXBzKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmJ1aWxkX2RpcigpKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1nbG9iYWwtb3B0aW9uJywKICAgICAgICAgICAgZGVzdD0nZ2xvYmFsX29wdGlvbnMnLAogICAgICAgICAgICBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgICAgIG1ldGF2YXI9J29wdGlvbnMnLAogICAgICAgICAgICBoZWxwPSJFeHRyYSBnbG9iYWwgb3B0aW9ucyB0byBiZSBzdXBwbGllZCB0byB0aGUgc2V0dXAucHkgIgogICAgICAgICAgICAiY2FsbCBiZWZvcmUgdGhlICdiZGlzdF93aGVlbCcgY29tbWFuZC4iKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1wcmUnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICBoZWxwPSgiSW5jbHVkZSBwcmUtcmVsZWFzZSBhbmQgZGV2ZWxvcG1lbnQgdmVyc2lvbnMuIEJ5IGRlZmF1bHQsICIKICAgICAgICAgICAgICAgICAgInBpcCBvbmx5IGZpbmRzIHN0YWJsZSB2ZXJzaW9ucy4iKSwKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5ub19jbGVhbigpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5yZXF1aXJlX2hhc2hlcygpKQoKICAgICAgICBpbmRleF9vcHRzID0gY21kb3B0aW9ucy5tYWtlX29wdGlvbl9ncm91cCgKICAgICAgICAgICAgY21kb3B0aW9ucy5pbmRleF9ncm91cCwKICAgICAgICAgICAgc2VsZi5wYXJzZXIsCiAgICAgICAgKQoKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIGluZGV4X29wdHMpCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBjbWRfb3B0cykKCiAgICBkZWYgY2hlY2tfcmVxdWlyZWRfcGFja2FnZXMoc2VsZik6CiAgICAgICAgaW1wb3J0X29yX3JhaXNlKAogICAgICAgICAgICAnd2hlZWwuYmRpc3Rfd2hlZWwnLAogICAgICAgICAgICBDb21tYW5kRXJyb3IsCiAgICAgICAgICAgICIncGlwIHdoZWVsJyByZXF1aXJlcyB0aGUgJ3doZWVsJyBwYWNrYWdlLiBUbyBmaXggdGhpcywgcnVuOiAiCiAgICAgICAgICAgICJwaXAgaW5zdGFsbCB3aGVlbCIKICAgICAgICApCiAgICAgICAgcGtnX3Jlc291cmNlcyA9IGltcG9ydF9vcl9yYWlzZSgKICAgICAgICAgICAgJ3BrZ19yZXNvdXJjZXMnLAogICAgICAgICAgICBDb21tYW5kRXJyb3IsCiAgICAgICAgICAgICIncGlwIHdoZWVsJyByZXF1aXJlcyBzZXR1cHRvb2xzID49IDAuOCBmb3IgZGlzdC1pbmZvIHN1cHBvcnQuIgogICAgICAgICAgICAiIFRvIGZpeCB0aGlzLCBydW46IHBpcCBpbnN0YWxsIC0tdXBncmFkZSBzZXR1cHRvb2xzIgogICAgICAgICkKICAgICAgICBpZiBub3QgaGFzYXR0cihwa2dfcmVzb3VyY2VzLCAnRGlzdEluZm9EaXN0cmlidXRpb24nKToKICAgICAgICAgICAgcmFpc2UgQ29tbWFuZEVycm9yKAogICAgICAgICAgICAgICAgIidwaXAgd2hlZWwnIHJlcXVpcmVzIHNldHVwdG9vbHMgPj0gMC44IGZvciBkaXN0LWluZm8gIgogICAgICAgICAgICAgICAgInN1cHBvcnQuIFRvIGZpeCB0aGlzLCBydW46IHBpcCBpbnN0YWxsIC0tdXBncmFkZSAiCiAgICAgICAgICAgICAgICAic2V0dXB0b29scyIKICAgICAgICAgICAgKQoKICAgIGRlZiBydW4oc2VsZiwgb3B0aW9ucywgYXJncyk6CiAgICAgICAgc2VsZi5jaGVja19yZXF1aXJlZF9wYWNrYWdlcygpCiAgICAgICAgY21kb3B0aW9ucy5yZXNvbHZlX3doZWVsX25vX3VzZV9iaW5hcnkob3B0aW9ucykKICAgICAgICBjbWRvcHRpb25zLmNoZWNrX2luc3RhbGxfYnVpbGRfZ2xvYmFsKG9wdGlvbnMpCgogICAgICAgIGlmIG9wdGlvbnMuYWxsb3dfZXh0ZXJuYWw6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy1leHRlcm5hbCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gIgogICAgICAgICAgICAgICAgInRoZSBmdXR1cmUuIER1ZSB0byBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IHByb3RvY29sLCBpdCBubyAiCiAgICAgICAgICAgICAgICAibG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgb3B0aW9ucy5hbGxvd19hbGxfZXh0ZXJuYWw6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy1hbGwtZXh0ZXJuYWwgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkICIKICAgICAgICAgICAgICAgICJpbiB0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgIgogICAgICAgICAgICAgICAgIm5vIGxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMuYWxsb3dfdW52ZXJpZmllZDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWFsbG93LXVudmVyaWZpZWQgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkICIKICAgICAgICAgICAgICAgICJpbiB0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgIgogICAgICAgICAgICAgICAgIm5vIGxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGluZGV4X3VybHMgPSBbb3B0aW9ucy5pbmRleF91cmxdICsgb3B0aW9ucy5leHRyYV9pbmRleF91cmxzCiAgICAgICAgaWYgb3B0aW9ucy5ub19pbmRleDoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdJZ25vcmluZyBpbmRleGVzOiAlcycsICcsJy5qb2luKGluZGV4X3VybHMpKQogICAgICAgICAgICBpbmRleF91cmxzID0gW10KCiAgICAgICAgaWYgb3B0aW9ucy5idWlsZF9kaXI6CiAgICAgICAgICAgIG9wdGlvbnMuYnVpbGRfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9wdGlvbnMuYnVpbGRfZGlyKQoKICAgICAgICBvcHRpb25zLnNyY19kaXIgPSBvcy5wYXRoLmFic3BhdGgob3B0aW9ucy5zcmNfZGlyKQoKICAgICAgICB3aXRoIHNlbGYuX2J1aWxkX3Nlc3Npb24ob3B0aW9ucykgYXMgc2Vzc2lvbjoKICAgICAgICAgICAgZmluZGVyID0gc2VsZi5fYnVpbGRfcGFja2FnZV9maW5kZXIob3B0aW9ucywgc2Vzc2lvbikKICAgICAgICAgICAgYnVpbGRfZGVsZXRlID0gKG5vdCAob3B0aW9ucy5ub19jbGVhbiBvciBvcHRpb25zLmJ1aWxkX2RpcikpCiAgICAgICAgICAgIHdoZWVsX2NhY2hlID0gV2hlZWxDYWNoZShvcHRpb25zLmNhY2hlX2Rpciwgb3B0aW9ucy5mb3JtYXRfY29udHJvbCkKICAgICAgICAgICAgd2l0aCBCdWlsZERpcmVjdG9yeShvcHRpb25zLmJ1aWxkX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGU9YnVpbGRfZGVsZXRlKSBhcyBidWlsZF9kaXI6CiAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQgPSBSZXF1aXJlbWVudFNldCgKICAgICAgICAgICAgICAgICAgICBidWlsZF9kaXI9YnVpbGRfZGlyLAogICAgICAgICAgICAgICAgICAgIHNyY19kaXI9b3B0aW9ucy5zcmNfZGlyLAogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2Rpcj1Ob25lLAogICAgICAgICAgICAgICAgICAgIGlnbm9yZV9kZXBlbmRlbmNpZXM9b3B0aW9ucy5pZ25vcmVfZGVwZW5kZW5jaWVzLAogICAgICAgICAgICAgICAgICAgIGlnbm9yZV9pbnN0YWxsZWQ9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICBpZ25vcmVfcmVxdWlyZXNfcHl0aG9uPW9wdGlvbnMuaWdub3JlX3JlcXVpcmVzX3B5dGhvbiwKICAgICAgICAgICAgICAgICAgICBpc29sYXRlZD1vcHRpb25zLmlzb2xhdGVkX21vZGUsCiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbj1zZXNzaW9uLAogICAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlLAogICAgICAgICAgICAgICAgICAgIHdoZWVsX2Rvd25sb2FkX2Rpcj1vcHRpb25zLndoZWVsX2RpciwKICAgICAgICAgICAgICAgICAgICByZXF1aXJlX2hhc2hlcz1vcHRpb25zLnJlcXVpcmVfaGFzaGVzCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgc2VsZi5wb3B1bGF0ZV9yZXF1aXJlbWVudF9zZXQoCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LCBhcmdzLCBvcHRpb25zLCBmaW5kZXIsIHNlc3Npb24sIHNlbGYubmFtZSwKICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZQogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIGlmIG5vdCByZXF1aXJlbWVudF9zZXQuaGFzX3JlcXVpcmVtZW50czoKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIyBidWlsZCB3aGVlbHMKICAgICAgICAgICAgICAgICAgICB3YiA9IFdoZWVsQnVpbGRlcigKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LAogICAgICAgICAgICAgICAgICAgICAgICBmaW5kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkX29wdGlvbnM9b3B0aW9ucy5idWlsZF9vcHRpb25zIG9yIFtdLAogICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfb3B0aW9ucz1vcHRpb25zLmdsb2JhbF9vcHRpb25zIG9yIFtdLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgd2IuYnVpbGQoKToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ29tbWFuZEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBidWlsZCBvbmUgb3IgbW9yZSB3aGVlbHMiCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBQcmV2aW91c0J1aWxkRGlyRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ub19jbGVhbiA9IFRydWUKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3B0aW9ucy5ub19jbGVhbjoKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LmNsZWFudXBfZmlsZXMoKQpQSwMEFAAAAAAAAAAhAJknqXFAEgAAQBIAACYAAABweXBpX19waXBfOV8wXzMvcGlwL2NvbXBhdC9fX2luaXRfXy5weSIiIlN0dWZmIHRoYXQgZGlmZmVycyBpbiBkaWZmZXJlbnQgUHl0aG9uIHZlcnNpb25zIGFuZCBwbGF0Zm9ybQpkaXN0cmlidXRpb25zLiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24KCmltcG9ydCBvcwppbXBvcnQgc3lzCgpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgdGV4dF90eXBlCgp0cnk6CiAgICBmcm9tIGxvZ2dpbmcuY29uZmlnIGltcG9ydCBkaWN0Q29uZmlnIGFzIGxvZ2dpbmdfZGljdENvbmZpZwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIHBpcC5jb21wYXQuZGljdGNvbmZpZyBpbXBvcnQgZGljdENvbmZpZyBhcyBsb2dnaW5nX2RpY3RDb25maWcKCnRyeToKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gcGlwLl92ZW5kb3Iub3JkZXJlZGRpY3QgaW1wb3J0IE9yZGVyZWREaWN0Cgp0cnk6CiAgICBpbXBvcnQgaXBhZGRyZXNzCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHRyeToKICAgICAgICBmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBpcGFkZHJlc3MKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBpbXBvcnQgaXBhZGRyIGFzIGlwYWRkcmVzcwogICAgICAgIGlwYWRkcmVzcy5pcF9hZGRyZXNzID0gaXBhZGRyZXNzLklQQWRkcmVzcwogICAgICAgIGlwYWRkcmVzcy5pcF9uZXR3b3JrID0gaXBhZGRyZXNzLklQTmV0d29yawoKCnRyeToKICAgIGltcG9ydCBzeXNjb25maWcKCiAgICBkZWYgZ2V0X3N0ZGxpYigpOgogICAgICAgIHBhdGhzID0gWwogICAgICAgICAgICBzeXNjb25maWcuZ2V0X3BhdGgoInN0ZGxpYiIpLAogICAgICAgICAgICBzeXNjb25maWcuZ2V0X3BhdGgoInBsYXRzdGRsaWIiKSwKICAgICAgICBdCiAgICAgICAgcmV0dXJuIHNldChmaWx0ZXIoYm9vbCwgcGF0aHMpKQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCgogICAgZGVmIGdldF9zdGRsaWIoKToKICAgICAgICBwYXRocyA9IFsKICAgICAgICAgICAgc3lzY29uZmlnLmdldF9weXRob25fbGliKHN0YW5kYXJkX2xpYj1UcnVlKSwKICAgICAgICAgICAgc3lzY29uZmlnLmdldF9weXRob25fbGliKHN0YW5kYXJkX2xpYj1UcnVlLCBwbGF0X3NwZWNpZmljPVRydWUpLAogICAgICAgIF0KICAgICAgICByZXR1cm4gc2V0KGZpbHRlcihib29sLCBwYXRocykpCgoKX19hbGxfXyA9IFsKICAgICJsb2dnaW5nX2RpY3RDb25maWciLCAiaXBhZGRyZXNzIiwgInVzZXNfcHljYWNoZSIsICJjb25zb2xlX3RvX3N0ciIsCiAgICAibmF0aXZlX3N0ciIsICJnZXRfcGF0aF91aWQiLCAic3RkbGliX3BrZ3MiLCAiV0lORE9XUyIsICJzYW1lZmlsZSIsCiAgICAiT3JkZXJlZERpY3QiLApdCgoKaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMywgNCk6CiAgICB1c2VzX3B5Y2FjaGUgPSBUcnVlCiAgICBmcm9tIGltcG9ydGxpYi51dGlsIGltcG9ydCBjYWNoZV9mcm9tX3NvdXJjZQplbHNlOgogICAgaW1wb3J0IGltcAogICAgdXNlc19weWNhY2hlID0gaGFzYXR0cihpbXAsICdjYWNoZV9mcm9tX3NvdXJjZScpCiAgICBpZiB1c2VzX3B5Y2FjaGU6CiAgICAgICAgY2FjaGVfZnJvbV9zb3VyY2UgPSBpbXAuY2FjaGVfZnJvbV9zb3VyY2UKICAgIGVsc2U6CiAgICAgICAgY2FjaGVfZnJvbV9zb3VyY2UgPSBOb25lCgoKaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMywpOgogICAgZGVmIGNvbnNvbGVfdG9fc3RyKHMpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHMuZGVjb2RlKHN5cy5fX3N0ZG91dF9fLmVuY29kaW5nKQogICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBzLmRlY29kZSgndXRmXzgnKQoKICAgIGRlZiBuYXRpdmVfc3RyKHMsIHJlcGxhY2U9RmFsc2UpOgogICAgICAgIGlmIGlzaW5zdGFuY2UocywgYnl0ZXMpOgogICAgICAgICAgICByZXR1cm4gcy5kZWNvZGUoJ3V0Zi04JywgJ3JlcGxhY2UnIGlmIHJlcGxhY2UgZWxzZSAnc3RyaWN0JykKICAgICAgICByZXR1cm4gcwoKZWxzZToKICAgIGRlZiBjb25zb2xlX3RvX3N0cihzKToKICAgICAgICByZXR1cm4gcwoKICAgIGRlZiBuYXRpdmVfc3RyKHMsIHJlcGxhY2U9RmFsc2UpOgogICAgICAgICMgUmVwbGFjZSBpcyBpZ25vcmVkIC0tIHVuaWNvZGUgdG8gVVRGLTggY2FuJ3QgZmFpbAogICAgICAgIGlmIGlzaW5zdGFuY2UocywgdGV4dF90eXBlKToKICAgICAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgcmV0dXJuIHMKCgpkZWYgdG90YWxfc2Vjb25kcyh0ZCk6CiAgICBpZiBoYXNhdHRyKHRkLCAidG90YWxfc2Vjb25kcyIpOgogICAgICAgIHJldHVybiB0ZC50b3RhbF9zZWNvbmRzKCkKICAgIGVsc2U6CiAgICAgICAgdmFsID0gdGQubWljcm9zZWNvbmRzICsgKHRkLnNlY29uZHMgKyB0ZC5kYXlzICogMjQgKiAzNjAwKSAqIDEwICoqIDYKICAgICAgICByZXR1cm4gdmFsIC8gMTAgKiogNgoKCmRlZiBnZXRfcGF0aF91aWQocGF0aCk6CiAgICAiIiIKICAgIFJldHVybiBwYXRoJ3MgdWlkLgoKICAgIERvZXMgbm90IGZvbGxvdyBzeW1saW5rczoKICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvcHVsbC85MzUjZGlzY3Vzc2lvbl9yNTMwNzAwMwoKICAgIFBsYWNlZCB0aGlzIGZ1bmN0aW9uIGluIGNvbXBhdCBkdWUgdG8gZGlmZmVyZW5jZXMgb24gQUlYIGFuZAogICAgSnl0aG9uLCB0aGF0IHNob3VsZCBldmVudHVhbGx5IGdvIGF3YXkuCgogICAgOnJhaXNlcyBPU0Vycm9yOiBXaGVuIHBhdGggaXMgYSBzeW1saW5rIG9yIGNhbid0IGJlIHJlYWQuCiAgICAiIiIKICAgIGlmIGhhc2F0dHIob3MsICdPX05PRk9MTE9XJyk6CiAgICAgICAgZmQgPSBvcy5vcGVuKHBhdGgsIG9zLk9fUkRPTkxZIHwgb3MuT19OT0ZPTExPVykKICAgICAgICBmaWxlX3VpZCA9IG9zLmZzdGF0KGZkKS5zdF91aWQKICAgICAgICBvcy5jbG9zZShmZCkKICAgIGVsc2U6ICAjIEFJWCBhbmQgSnl0aG9uCiAgICAgICAgIyBXQVJOSU5HOiB0aW1lIG9mIGNoZWNrIHZ1bG5lcmFiaWxpdHksIGJ1dCBiZXN0IHdlIGNhbiBkbyB3L28gTk9GT0xMT1cKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2xpbmsocGF0aCk6CiAgICAgICAgICAgICMgb2xkZXIgdmVyc2lvbnMgb2YgSnl0aG9uIGRvbid0IGhhdmUgYG9zLmZzdGF0YAogICAgICAgICAgICBmaWxlX3VpZCA9IG9zLnN0YXQocGF0aCkuc3RfdWlkCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyByYWlzZSBPU0Vycm9yIGZvciBwYXJpdHkgd2l0aCBvcy5PX05PRk9MTE9XIGFib3ZlCiAgICAgICAgICAgIHJhaXNlIE9TRXJyb3IoCiAgICAgICAgICAgICAgICAiJXMgaXMgYSBzeW1saW5rOyBXaWxsIG5vdCByZXR1cm4gdWlkIGZvciBzeW1saW5rcyIgJSBwYXRoCiAgICAgICAgICAgICkKICAgIHJldHVybiBmaWxlX3VpZAoKCmRlZiBleHBhbmR1c2VyKHBhdGgpOgogICAgIiIiCiAgICBFeHBhbmQgfiBhbmQgfnVzZXIgY29uc3RydWN0aW9ucy4KCiAgICBJbmNsdWRlcyBhIHdvcmthcm91bmQgZm9yIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxNDc2OAogICAgIiIiCiAgICBleHBhbmRlZCA9IG9zLnBhdGguZXhwYW5kdXNlcihwYXRoKQogICAgaWYgcGF0aC5zdGFydHN3aXRoKCd+LycpIGFuZCBleHBhbmRlZC5zdGFydHN3aXRoKCcvLycpOgogICAgICAgIGV4cGFuZGVkID0gZXhwYW5kZWRbMTpdCiAgICByZXR1cm4gZXhwYW5kZWQKCgojIHBhY2thZ2VzIGluIHRoZSBzdGRsaWIgdGhhdCBtYXkgaGF2ZSBpbnN0YWxsYXRpb24gbWV0YWRhdGEsIGJ1dCBzaG91bGQgbm90IGJlCiMgY29uc2lkZXJlZCAnaW5zdGFsbGVkJy4gIHRoaXMgdGhlb3JldGljYWxseSBjb3VsZCBiZSBkZXRlcm1pbmVkIGJhc2VkIG9uCiMgZGlzdC5sb2NhdGlvbiAocHkyNzpgc3lzY29uZmlnLmdldF9wYXRocygpWydzdGRsaWInXWAsCiMgcHkyNjpzeXNjb25maWcuZ2V0X2NvbmZpZ192YXJzKCdMSUJERVNUJykpLCBidXQgZmVhciBwbGF0Zm9ybSB2YXJpYXRpb24gbWF5CiMgbWFrZSB0aGlzIGluZWZmZWN0aXZlLCBzbyBoYXJkLWNvZGluZwpzdGRsaWJfcGtncyA9ICgncHl0aG9uJywgJ3dzZ2lyZWYnKQppZiBzeXMudmVyc2lvbl9pbmZvID49ICgyLCA3KToKICAgIHN0ZGxpYl9wa2dzICs9ICgnYXJncGFyc2UnLCkKCgojIHdpbmRvd3MgZGV0ZWN0aW9uLCBjb3ZlcnMgY3B5dGhvbiBhbmQgaXJvbnB5dGhvbgpXSU5ET1dTID0gKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJ3aW4iKSBvcgogICAgICAgICAgIChzeXMucGxhdGZvcm0gPT0gJ2NsaScgYW5kIG9zLm5hbWUgPT0gJ250JykpCgoKZGVmIHNhbWVmaWxlKGZpbGUxLCBmaWxlMik6CiAgICAiIiJQcm92aWRlIGFuIGFsdGVybmF0aXZlIGZvciBvcy5wYXRoLnNhbWVmaWxlIG9uIFdpbmRvd3MvUHl0aG9uMiIiIgogICAgaWYgaGFzYXR0cihvcy5wYXRoLCAnc2FtZWZpbGUnKToKICAgICAgICByZXR1cm4gb3MucGF0aC5zYW1lZmlsZShmaWxlMSwgZmlsZTIpCiAgICBlbHNlOgogICAgICAgIHBhdGgxID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLmFic3BhdGgoZmlsZTEpKQogICAgICAgIHBhdGgyID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLmFic3BhdGgoZmlsZTIpKQogICAgICAgIHJldHVybiBwYXRoMSA9PSBwYXRoMgpQSwMEFAAAAAAAAAAhAIKipZc4WgAAOFoAACgAAABweXBpX19waXBfOV8wXzMvcGlwL2NvbXBhdC9kaWN0Y29uZmlnLnB5IyBUaGlzIGlzIGEgY29weSBvZiB0aGUgUHl0aG9uIGxvZ2dpbmcuY29uZmlnLmRpY3Rjb25maWcgbW9kdWxlLAojIHJlcHJvZHVjZWQgd2l0aCBwZXJtaXNzaW9uLiBJdCBpcyBwcm92aWRlZCBoZXJlIGZvciBiYWNrd2FyZHMKIyBjb21wYXRpYmlsaXR5IGZvciBQeXRob24gdmVyc2lvbnMgcHJpb3IgdG8gMi43LgojCiMgQ29weXJpZ2h0IDIwMDktMjAxMCBieSBWaW5heSBTYWppcC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cwojIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKIyBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CiMgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCiMgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBWaW5heSBTYWppcAojIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbgojIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCiMgVklOQVkgU0FKSVAgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwojIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTAojIFZJTkFZIFNBSklQIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgojIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUgojIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCiMgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nLmhhbmRsZXJzCmltcG9ydCByZQppbXBvcnQgc3lzCmltcG9ydCB0eXBlcwoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgc2l4CgojIGZsYWtlODogbm9xYQoKSURFTlRJRklFUiA9IHJlLmNvbXBpbGUoJ15bYS16X11bYS16MC05X10qJCcsIHJlLkkpCgoKZGVmIHZhbGlkX2lkZW50KHMpOgogICAgbSA9IElERU5USUZJRVIubWF0Y2gocykKICAgIGlmIG5vdCBtOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ05vdCBhIHZhbGlkIFB5dGhvbiBpZGVudGlmaWVyOiAlcicgJSBzKQogICAgcmV0dXJuIFRydWUKCiMKIyBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW4gbG9nZ2luZyBvbmx5IGluIHJlY2VudCB2ZXJzaW9ucyBvZiBQeXRob24KIwp0cnk6CiAgICBmcm9tIGxvZ2dpbmcgaW1wb3J0IF9jaGVja0xldmVsCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGRlZiBfY2hlY2tMZXZlbChsZXZlbCk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShsZXZlbCwgaW50KToKICAgICAgICAgICAgcnYgPSBsZXZlbAogICAgICAgIGVsaWYgc3RyKGxldmVsKSA9PSBsZXZlbDoKICAgICAgICAgICAgaWYgbGV2ZWwgbm90IGluIGxvZ2dpbmcuX2xldmVsTmFtZXM6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmtub3duIGxldmVsOiAlcicgJSBsZXZlbCkKICAgICAgICAgICAgcnYgPSBsb2dnaW5nLl9sZXZlbE5hbWVzW2xldmVsXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignTGV2ZWwgbm90IGFuIGludGVnZXIgb3IgYSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsaWQgc3RyaW5nOiAlcicgJSBsZXZlbCkKICAgICAgICByZXR1cm4gcnYKCiMgVGhlIENvbnZlcnRpbmdYWFggY2xhc3NlcyBhcmUgd3JhcHBlcnMgYXJvdW5kIHN0YW5kYXJkIFB5dGhvbiBjb250YWluZXJzLAojIGFuZCB0aGV5IHNlcnZlIHRvIGNvbnZlcnQgYW55IHN1aXRhYmxlIHZhbHVlcyBpbiB0aGUgY29udGFpbmVyLiBUaGUKIyBjb252ZXJzaW9uIGNvbnZlcnRzIGJhc2UgZGljdHMsIGxpc3RzIGFuZCB0dXBsZXMgdG8gdGhlaXIgd3JhcHBlZAojIGVxdWl2YWxlbnRzLCB3aGVyZWFzIHN0cmluZ3Mgd2hpY2ggbWF0Y2ggYSBjb252ZXJzaW9uIGZvcm1hdCBhcmUgY29udmVydGVkCiMgYXBwcm9wcmlhdGVseS4KIwojIEVhY2ggd3JhcHBlciBzaG91bGQgaGF2ZSBhIGNvbmZpZ3VyYXRvciBhdHRyaWJ1dGUgaG9sZGluZyB0aGUgYWN0dWFsCiMgY29uZmlndXJhdG9yIHRvIHVzZSBmb3IgY29udmVyc2lvbi4KCgpjbGFzcyBDb252ZXJ0aW5nRGljdChkaWN0KToKICAgICIiIkEgY29udmVydGluZyBkaWN0aW9uYXJ5IHdyYXBwZXIuIiIiCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgdmFsdWUgPSBkaWN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQogICAgICAgICMgSWYgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBkaWZmZXJlbnQsIHNhdmUgZm9yIG5leHQgdGltZQogICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIHNlbGZba2V5XSA9IHJlc3VsdAogICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgdmFsdWUgPSBkaWN0LmdldChzZWxmLCBrZXksIGRlZmF1bHQpCiAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICAjIElmIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaXMgZGlmZmVyZW50LCBzYXZlIGZvciBuZXh0IHRpbWUKICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgogICAgICAgICAgICBzZWxmW2tleV0gPSByZXN1bHQKICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBwb3Aoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgogICAgICAgIHZhbHVlID0gZGljdC5wb3Aoc2VsZiwga2V5LCBkZWZhdWx0KQogICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIENvbnZlcnRpbmdMaXN0KGxpc3QpOgogICAgIiIiQSBjb252ZXJ0aW5nIGxpc3Qgd3JhcHBlci4iIiIKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHZhbHVlID0gbGlzdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCiAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICAjIElmIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaXMgZGlmZmVyZW50LCBzYXZlIGZvciBuZXh0IHRpbWUKICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgogICAgICAgICAgICBzZWxmW2tleV0gPSByZXN1bHQKICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBwb3Aoc2VsZiwgaWR4PS0xKToKICAgICAgICB2YWx1ZSA9IGxpc3QucG9wKHNlbGYsIGlkeCkKICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQogICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CiAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBDb252ZXJ0aW5nVHVwbGUodHVwbGUpOgogICAgIiIiQSBjb252ZXJ0aW5nIHR1cGxlIHdyYXBwZXIuIiIiCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICB2YWx1ZSA9IHR1cGxlLl9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQogICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CiAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgogICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBCYXNlQ29uZmlndXJhdG9yKG9iamVjdCk6CiAgICAiIiIKICAgIFRoZSBjb25maWd1cmF0b3IgYmFzZSBjbGFzcyB3aGljaCBkZWZpbmVzIHNvbWUgdXNlZnVsIGRlZmF1bHRzLgogICAgIiIiCgogICAgQ09OVkVSVF9QQVRURVJOID0gcmUuY29tcGlsZShyJ14oP1A8cHJlZml4PlthLXpdKyk6Ly8oP1A8c3VmZml4Pi4qKSQnKQoKICAgIFdPUkRfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideXHMqKFx3KylccyonKQogICAgRE9UX1BBVFRFUk4gPSByZS5jb21waWxlKHInXlwuXHMqKFx3KylccyonKQogICAgSU5ERVhfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideXFtccyooXHcrKVxzKlxdXHMqJykKICAgIERJR0lUX1BBVFRFUk4gPSByZS5jb21waWxlKHInXlxkKyQnKQoKICAgIHZhbHVlX2NvbnZlcnRlcnMgPSB7CiAgICAgICAgJ2V4dCcgOiAnZXh0X2NvbnZlcnQnLAogICAgICAgICdjZmcnIDogJ2NmZ19jb252ZXJ0JywKICAgIH0KCiAgICAjIFdlIG1pZ2h0IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG9uZSwgZS5nLiBpbXBvcnRsaWIKICAgIGltcG9ydGVyID0gX19pbXBvcnRfXwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWcpOgogICAgICAgIHNlbGYuY29uZmlnID0gQ29udmVydGluZ0RpY3QoY29uZmlnKQogICAgICAgIHNlbGYuY29uZmlnLmNvbmZpZ3VyYXRvciA9IHNlbGYKCiAgICBkZWYgcmVzb2x2ZShzZWxmLCBzKToKICAgICAgICAiIiIKICAgICAgICBSZXNvbHZlIHN0cmluZ3MgdG8gb2JqZWN0cyB1c2luZyBzdGFuZGFyZCBpbXBvcnQgYW5kIGF0dHJpYnV0ZQogICAgICAgIHN5bnRheC4KICAgICAgICAiIiIKICAgICAgICBuYW1lID0gcy5zcGxpdCgnLicpCiAgICAgICAgdXNlZCA9IG5hbWUucG9wKDApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmb3VuZCA9IHNlbGYuaW1wb3J0ZXIodXNlZCkKICAgICAgICAgICAgZm9yIGZyYWcgaW4gbmFtZToKICAgICAgICAgICAgICAgIHVzZWQgKz0gJy4nICsgZnJhZwogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZ2V0YXR0cihmb3VuZCwgZnJhZykKICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgICAgICAgICBzZWxmLmltcG9ydGVyKHVzZWQpCiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBnZXRhdHRyKGZvdW5kLCBmcmFnKQogICAgICAgICAgICByZXR1cm4gZm91bmQKICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgIGUsIHRiID0gc3lzLmV4Y19pbmZvKClbMTpdCiAgICAgICAgICAgIHYgPSBWYWx1ZUVycm9yKCdDYW5ub3QgcmVzb2x2ZSAlcjogJXMnICUgKHMsIGUpKQogICAgICAgICAgICB2Ll9fY2F1c2VfXywgdi5fX3RyYWNlYmFja19fID0gZSwgdGIKICAgICAgICAgICAgcmFpc2UgdgoKICAgIGRlZiBleHRfY29udmVydChzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiRGVmYXVsdCBjb252ZXJ0ZXIgZm9yIHRoZSBleHQ6Ly8gcHJvdG9jb2wuIiIiCiAgICAgICAgcmV0dXJuIHNlbGYucmVzb2x2ZSh2YWx1ZSkKCiAgICBkZWYgY2ZnX2NvbnZlcnQoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIkRlZmF1bHQgY29udmVydGVyIGZvciB0aGUgY2ZnOi8vIHByb3RvY29sLiIiIgogICAgICAgIHJlc3QgPSB2YWx1ZQogICAgICAgIG0gPSBzZWxmLldPUkRfUEFUVEVSTi5tYXRjaChyZXN0KQogICAgICAgIGlmIG0gaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5hYmxlIHRvIGNvbnZlcnQgJXIiICUgdmFsdWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdCA9IHJlc3RbbS5lbmQoKTpdCiAgICAgICAgICAgIGQgPSBzZWxmLmNvbmZpZ1ttLmdyb3VwcygpWzBdXQogICAgICAgICAgICAjIHByaW50IGQsIHJlc3QKICAgICAgICAgICAgd2hpbGUgcmVzdDoKICAgICAgICAgICAgICAgIG0gPSBzZWxmLkRPVF9QQVRURVJOLm1hdGNoKHJlc3QpCiAgICAgICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgICAgIGQgPSBkW20uZ3JvdXBzKClbMF1dCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG0gPSBzZWxmLklOREVYX1BBVFRFUk4ubWF0Y2gocmVzdCkKICAgICAgICAgICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgICAgICAgICBpZHggPSBtLmdyb3VwcygpWzBdCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLkRJR0lUX1BBVFRFUk4ubWF0Y2goaWR4KToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkW2lkeF0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gaW50KGlkeCkgICMgdHJ5IGFzIG51bWJlciBmaXJzdCAobW9zdCBsaWtlbHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGRbbl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGRbaWR4XQogICAgICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgICAgICByZXN0ID0gcmVzdFttLmVuZCgpOl0KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbnZlcnQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyIGF0ICVyJyAlICh2YWx1ZSwgcmVzdCkpCiAgICAgICAgIyByZXN0IHNob3VsZCBiZSBlbXB0eQogICAgICAgIHJldHVybiBkCgogICAgZGVmIGNvbnZlcnQoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIgogICAgICAgIENvbnZlcnQgdmFsdWVzIHRvIGFuIGFwcHJvcHJpYXRlIHR5cGUuIGRpY3RzLCBsaXN0cyBhbmQgdHVwbGVzIGFyZQogICAgICAgIHJlcGxhY2VkIGJ5IHRoZWlyIGNvbnZlcnRpbmcgYWx0ZXJuYXRpdmVzLiBTdHJpbmdzIGFyZSBjaGVja2VkIHRvCiAgICAgICAgc2VlIGlmIHRoZXkgaGF2ZSBhIGNvbnZlcnNpb24gZm9ybWF0IGFuZCBhcmUgY29udmVydGVkIGlmIHRoZXkgZG8uCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIENvbnZlcnRpbmdEaWN0KSBhbmQgaXNpbnN0YW5jZSh2YWx1ZSwgZGljdCk6CiAgICAgICAgICAgIHZhbHVlID0gQ29udmVydGluZ0RpY3QodmFsdWUpCiAgICAgICAgICAgIHZhbHVlLmNvbmZpZ3VyYXRvciA9IHNlbGYKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBDb252ZXJ0aW5nTGlzdCkgYW5kIGlzaW5zdGFuY2UodmFsdWUsIGxpc3QpOgogICAgICAgICAgICB2YWx1ZSA9IENvbnZlcnRpbmdMaXN0KHZhbHVlKQogICAgICAgICAgICB2YWx1ZS5jb25maWd1cmF0b3IgPSBzZWxmCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgQ29udmVydGluZ1R1cGxlKSBhbmRcCiAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpOgogICAgICAgICAgICB2YWx1ZSA9IENvbnZlcnRpbmdUdXBsZSh2YWx1ZSkKICAgICAgICAgICAgdmFsdWUuY29uZmlndXJhdG9yID0gc2VsZgogICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc2l4LnN0cmluZ190eXBlcyk6ICAjIHN0ciBmb3IgcHkzawogICAgICAgICAgICBtID0gc2VsZi5DT05WRVJUX1BBVFRFUk4ubWF0Y2godmFsdWUpCiAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICBkID0gbS5ncm91cGRpY3QoKQogICAgICAgICAgICAgICAgcHJlZml4ID0gZFsncHJlZml4J10KICAgICAgICAgICAgICAgIGNvbnZlcnRlciA9IHNlbGYudmFsdWVfY29udmVydGVycy5nZXQocHJlZml4LCBOb25lKQogICAgICAgICAgICAgICAgaWYgY29udmVydGVyOgogICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IGRbJ3N1ZmZpeCddCiAgICAgICAgICAgICAgICAgICAgY29udmVydGVyID0gZ2V0YXR0cihzZWxmLCBjb252ZXJ0ZXIpCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb252ZXJ0ZXIoc3VmZml4KQogICAgICAgIHJldHVybiB2YWx1ZQoKICAgIGRlZiBjb25maWd1cmVfY3VzdG9tKHNlbGYsIGNvbmZpZyk6CiAgICAgICAgIiIiQ29uZmlndXJlIGFuIG9iamVjdCB3aXRoIGEgdXNlci1zdXBwbGllZCBmYWN0b3J5LiIiIgogICAgICAgIGMgPSBjb25maWcucG9wKCcoKScpCiAgICAgICAgaWYgbm90IGhhc2F0dHIoYywgJ19fY2FsbF9fJykgYW5kIGhhc2F0dHIodHlwZXMsICdDbGFzc1R5cGUnKSBhbmQgdHlwZShjKSAhPSB0eXBlcy5DbGFzc1R5cGU6CiAgICAgICAgICAgIGMgPSBzZWxmLnJlc29sdmUoYykKICAgICAgICBwcm9wcyA9IGNvbmZpZy5wb3AoJy4nLCBOb25lKQogICAgICAgICMgQ2hlY2sgZm9yIHZhbGlkIGlkZW50aWZpZXJzCiAgICAgICAga3dhcmdzID0gZGljdCgoaywgY29uZmlnW2tdKSBmb3IgayBpbiBjb25maWcgaWYgdmFsaWRfaWRlbnQoaykpCiAgICAgICAgcmVzdWx0ID0gYygqKmt3YXJncykKICAgICAgICBpZiBwcm9wczoKICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHByb3BzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBzZXRhdHRyKHJlc3VsdCwgbmFtZSwgdmFsdWUpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBhc190dXBsZShzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiVXRpbGl0eSBmdW5jdGlvbiB3aGljaCBjb252ZXJ0cyBsaXN0cyB0byB0dXBsZXMuIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6CiAgICAgICAgICAgIHZhbHVlID0gdHVwbGUodmFsdWUpCiAgICAgICAgcmV0dXJuIHZhbHVlCgoKY2xhc3MgRGljdENvbmZpZ3VyYXRvcihCYXNlQ29uZmlndXJhdG9yKToKICAgICIiIgogICAgQ29uZmlndXJlIGxvZ2dpbmcgdXNpbmcgYSBkaWN0aW9uYXJ5LWxpa2Ugb2JqZWN0IHRvIGRlc2NyaWJlIHRoZQogICAgY29uZmlndXJhdGlvbi4KICAgICIiIgoKICAgIGRlZiBjb25maWd1cmUoc2VsZik6CiAgICAgICAgIiIiRG8gdGhlIGNvbmZpZ3VyYXRpb24uIiIiCgogICAgICAgIGNvbmZpZyA9IHNlbGYuY29uZmlnCiAgICAgICAgaWYgJ3ZlcnNpb24nIG5vdCBpbiBjb25maWc6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImRpY3Rpb25hcnkgZG9lc24ndCBzcGVjaWZ5IGEgdmVyc2lvbiIpCiAgICAgICAgaWYgY29uZmlnWyd2ZXJzaW9uJ10gIT0gMToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5zdXBwb3J0ZWQgdmVyc2lvbjogJXMiICUgY29uZmlnWyd2ZXJzaW9uJ10pCiAgICAgICAgaW5jcmVtZW50YWwgPSBjb25maWcucG9wKCdpbmNyZW1lbnRhbCcsIEZhbHNlKQogICAgICAgIEVNUFRZX0RJQ1QgPSB7fQogICAgICAgIGxvZ2dpbmcuX2FjcXVpcmVMb2NrKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIGluY3JlbWVudGFsOgogICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBjb25maWcuZ2V0KCdoYW5kbGVycycsIEVNUFRZX0RJQ1QpCiAgICAgICAgICAgICAgICAjIGluY3JlbWVudGFsIGhhbmRsZXIgY29uZmlnIG9ubHkgaWYgaGFuZGxlciBuYW1lCiAgICAgICAgICAgICAgICAjIHRpZXMgaW4gdG8gbG9nZ2luZy5faGFuZGxlcnMgKFB5dGhvbiAyLjcpCiAgICAgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA9PSAoMiwgNyk6CiAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gaGFuZGxlcnM6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIGxvZ2dpbmcuX2hhbmRsZXJzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTm8gaGFuZGxlciBmb3VuZCB3aXRoICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUgJXInICAlIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IGxvZ2dpbmcuX2hhbmRsZXJzW25hbWVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcl9jb25maWcgPSBoYW5kbGVyc1tuYW1lXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gaGFuZGxlcl9jb25maWcuZ2V0KCdsZXZlbCcsIE5vbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGV2ZWw6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuc2V0TGV2ZWwoX2NoZWNrTGV2ZWwobGV2ZWwpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlIGhhbmRsZXIgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyOiAlcycgJSAobmFtZSwgZSkpCiAgICAgICAgICAgICAgICBsb2dnZXJzID0gY29uZmlnLmdldCgnbG9nZ2VycycsIEVNUFRZX0RJQ1QpCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBsb2dnZXJzOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25maWd1cmVfbG9nZ2VyKG5hbWUsIGxvZ2dlcnNbbmFtZV0sIFRydWUpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSBsb2dnZXIgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcjogJXMnICUgKG5hbWUsIGUpKQogICAgICAgICAgICAgICAgcm9vdCA9IGNvbmZpZy5nZXQoJ3Jvb3QnLCBOb25lKQogICAgICAgICAgICAgICAgaWYgcm9vdDoKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29uZmlndXJlX3Jvb3Qocm9vdCwgVHJ1ZSkKICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlIHJvb3QgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsb2dnZXI6ICVzJyAlIGUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBkaXNhYmxlX2V4aXN0aW5nID0gY29uZmlnLnBvcCgnZGlzYWJsZV9leGlzdGluZ19sb2dnZXJzJywgVHJ1ZSkKCiAgICAgICAgICAgICAgICBsb2dnaW5nLl9oYW5kbGVycy5jbGVhcigpCiAgICAgICAgICAgICAgICBkZWwgbG9nZ2luZy5faGFuZGxlckxpc3RbOl0KCiAgICAgICAgICAgICAgICAjIERvIGZvcm1hdHRlcnMgZmlyc3QgLSB0aGV5IGRvbid0IHJlZmVyIHRvIGFueXRoaW5nIGVsc2UKICAgICAgICAgICAgICAgIGZvcm1hdHRlcnMgPSBjb25maWcuZ2V0KCdmb3JtYXR0ZXJzJywgRU1QVFlfRElDVCkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGZvcm1hdHRlcnM6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXJzW25hbWVdID0gc2VsZi5jb25maWd1cmVfZm9ybWF0dGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXJzW25hbWVdKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb25maWd1cmUgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb3JtYXR0ZXIgJXI6ICVzJyAlIChuYW1lLCBlKSkKICAgICAgICAgICAgICAgICMgTmV4dCwgZG8gZmlsdGVycyAtIHRoZXkgZG9uJ3QgcmVmZXIgdG8gYW55dGhpbmcgZWxzZSwgZWl0aGVyCiAgICAgICAgICAgICAgICBmaWx0ZXJzID0gY29uZmlnLmdldCgnZmlsdGVycycsIEVNUFRZX0RJQ1QpCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWx0ZXJzOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyc1tuYW1lXSA9IHNlbGYuY29uZmlndXJlX2ZpbHRlcihmaWx0ZXJzW25hbWVdKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb25maWd1cmUgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWx0ZXIgJXI6ICVzJyAlIChuYW1lLCBlKSkKCiAgICAgICAgICAgICAgICAjIE5leHQsIGRvIGhhbmRsZXJzIC0gdGhleSByZWZlciB0byBmb3JtYXR0ZXJzIGFuZCBmaWx0ZXJzCiAgICAgICAgICAgICAgICAjIEFzIGhhbmRsZXJzIGNhbiByZWZlciB0byBvdGhlciBoYW5kbGVycywgc29ydCB0aGUga2V5cwogICAgICAgICAgICAgICAgIyB0byBhbGxvdyBhIGRldGVybWluaXN0aWMgb3JkZXIgb2YgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBjb25maWcuZ2V0KCdoYW5kbGVycycsIEVNUFRZX0RJQ1QpCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBzb3J0ZWQoaGFuZGxlcnMpOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IHNlbGYuY29uZmlndXJlX2hhbmRsZXIoaGFuZGxlcnNbbmFtZV0pCiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIubmFtZSA9IG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnNbbmFtZV0gPSBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSBoYW5kbGVyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXI6ICVzJyAlIChuYW1lLCBlKSkKICAgICAgICAgICAgICAgICMgTmV4dCwgZG8gbG9nZ2VycyAtIHRoZXkgcmVmZXIgdG8gaGFuZGxlcnMgYW5kIGZpbHRlcnMKCiAgICAgICAgICAgICAgICAjIHdlIGRvbid0IHdhbnQgdG8gbG9zZSB0aGUgZXhpc3RpbmcgbG9nZ2VycywKICAgICAgICAgICAgICAgICMgc2luY2Ugb3RoZXIgdGhyZWFkcyBtYXkgaGF2ZSBwb2ludGVycyB0byB0aGVtLgogICAgICAgICAgICAgICAgIyBleGlzdGluZyBpcyBzZXQgdG8gY29udGFpbiBhbGwgZXhpc3RpbmcgbG9nZ2VycywKICAgICAgICAgICAgICAgICMgYW5kIGFzIHdlIGdvIHRocm91Z2ggdGhlIG5ldyBjb25maWd1cmF0aW9uIHdlCiAgICAgICAgICAgICAgICAjIHJlbW92ZSBhbnkgd2hpY2ggYXJlIGNvbmZpZ3VyZWQuIEF0IHRoZSBlbmQsCiAgICAgICAgICAgICAgICAjIHdoYXQncyBsZWZ0IGluIGV4aXN0aW5nIGlzIHRoZSBzZXQgb2YgbG9nZ2VycwogICAgICAgICAgICAgICAgIyB3aGljaCB3ZXJlIGluIHRoZSBwcmV2aW91cyBjb25maWd1cmF0aW9uIGJ1dAogICAgICAgICAgICAgICAgIyB3aGljaCBhcmUgbm90IGluIHRoZSBuZXcgY29uZmlndXJhdGlvbi4KICAgICAgICAgICAgICAgIHJvb3QgPSBsb2dnaW5nLnJvb3QKICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gbGlzdChyb290Lm1hbmFnZXIubG9nZ2VyRGljdCkKICAgICAgICAgICAgICAgICMgVGhlIGxpc3QgbmVlZHMgdG8gYmUgc29ydGVkIHNvIHRoYXQgd2UgY2FuCiAgICAgICAgICAgICAgICAjIGF2b2lkIGRpc2FibGluZyBjaGlsZCBsb2dnZXJzIG9mIGV4cGxpY2l0bHkKICAgICAgICAgICAgICAgICMgbmFtZWQgbG9nZ2Vycy4gV2l0aCBhIHNvcnRlZCBsaXN0IGl0IGlzIGVhc2llcgogICAgICAgICAgICAgICAgIyB0byBmaW5kIHRoZSBjaGlsZCBsb2dnZXJzLgogICAgICAgICAgICAgICAgZXhpc3Rpbmcuc29ydCgpCiAgICAgICAgICAgICAgICAjIFdlJ2xsIGtlZXAgdGhlIGxpc3Qgb2YgZXhpc3RpbmcgbG9nZ2VycwogICAgICAgICAgICAgICAgIyB3aGljaCBhcmUgY2hpbGRyZW4gb2YgbmFtZWQgbG9nZ2VycyBoZXJlLi4uCiAgICAgICAgICAgICAgICBjaGlsZF9sb2dnZXJzID0gW10KICAgICAgICAgICAgICAgICMgbm93IHNldCB1cCB0aGUgbmV3IG9uZXMuLi4KICAgICAgICAgICAgICAgIGxvZ2dlcnMgPSBjb25maWcuZ2V0KCdsb2dnZXJzJywgRU1QVFlfRElDVCkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGxvZ2dlcnM6CiAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSBpbiBleGlzdGluZzoKICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGV4aXN0aW5nLmluZGV4KG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeGVkID0gbmFtZSArICIuIgogICAgICAgICAgICAgICAgICAgICAgICBwZmxlbiA9IGxlbihwcmVmaXhlZCkKICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2V4aXN0aW5nID0gbGVuKGV4aXN0aW5nKQogICAgICAgICAgICAgICAgICAgICAgICBpID0gaSArIDEgICMgbG9vayBhdCB0aGUgZW50cnkgYWZ0ZXIgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IG51bV9leGlzdGluZykgYW5kXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhpc3RpbmdbaV1bOnBmbGVuXSA9PSBwcmVmaXhlZCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF9sb2dnZXJzLmFwcGVuZChleGlzdGluZ1tpXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMQogICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5yZW1vdmUobmFtZSkKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29uZmlndXJlX2xvZ2dlcihuYW1lLCBsb2dnZXJzW25hbWVdKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb25maWd1cmUgbG9nZ2VyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXI6ICVzJyAlIChuYW1lLCBlKSkKCiAgICAgICAgICAgICAgICAjIERpc2FibGUgYW55IG9sZCBsb2dnZXJzLiBUaGVyZSdzIG5vIHBvaW50IGRlbGV0aW5nCiAgICAgICAgICAgICAgICAjIHRoZW0gYXMgb3RoZXIgdGhyZWFkcyBtYXkgY29udGludWUgdG8gaG9sZCByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICAjIGFuZCBieSBkaXNhYmxpbmcgdGhlbSwgeW91IHN0b3AgdGhlbSBkb2luZyBhbnkgbG9nZ2luZy4KICAgICAgICAgICAgICAgICMgSG93ZXZlciwgZG9uJ3QgZGlzYWJsZSBjaGlsZHJlbiBvZiBuYW1lZCBsb2dnZXJzLCBhcyB0aGF0J3MKICAgICAgICAgICAgICAgICMgcHJvYmFibHkgbm90IHdoYXQgd2FzIGludGVuZGVkIGJ5IHRoZSB1c2VyLgogICAgICAgICAgICAgICAgZm9yIGxvZyBpbiBleGlzdGluZzoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIgPSByb290Lm1hbmFnZXIubG9nZ2VyRGljdFtsb2ddCiAgICAgICAgICAgICAgICAgICAgaWYgbG9nIGluIGNoaWxkX2xvZ2dlcnM6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5sZXZlbCA9IGxvZ2dpbmcuTk9UU0VUCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5oYW5kbGVycyA9IFtdCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5wcm9wYWdhdGUgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgZWxpZiBkaXNhYmxlX2V4aXN0aW5nOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGlzYWJsZWQgPSBUcnVlCgogICAgICAgICAgICAgICAgIyBBbmQgZmluYWxseSwgZG8gdGhlIHJvb3QgbG9nZ2VyCiAgICAgICAgICAgICAgICByb290ID0gY29uZmlnLmdldCgncm9vdCcsIE5vbmUpCiAgICAgICAgICAgICAgICBpZiByb290OgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25maWd1cmVfcm9vdChyb290KQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb25maWd1cmUgcm9vdCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvZ2dlcjogJXMnICUgZSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBsb2dnaW5nLl9yZWxlYXNlTG9jaygpCgogICAgZGVmIGNvbmZpZ3VyZV9mb3JtYXR0ZXIoc2VsZiwgY29uZmlnKToKICAgICAgICAiIiJDb25maWd1cmUgYSBmb3JtYXR0ZXIgZnJvbSBhIGRpY3Rpb25hcnkuIiIiCiAgICAgICAgaWYgJygpJyBpbiBjb25maWc6CiAgICAgICAgICAgIGZhY3RvcnkgPSBjb25maWdbJygpJ10gICMgZm9yIHVzZSBpbiBleGNlcHRpb24gaGFuZGxlcgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyZV9jdXN0b20oY29uZmlnKQogICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIHRlOgogICAgICAgICAgICAgICAgaWYgIidmb3JtYXQnIiBub3QgaW4gc3RyKHRlKToKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgIyBOYW1lIG9mIHBhcmFtZXRlciBjaGFuZ2VkIGZyb20gZm10IHRvIGZvcm1hdC4KICAgICAgICAgICAgICAgICMgUmV0cnkgd2l0aCBvbGQgbmFtZS4KICAgICAgICAgICAgICAgICMgVGhpcyBpcyBzbyB0aGF0IGNvZGUgY2FuIGJlIHVzZWQgd2l0aCBvbGRlciBQeXRob24gdmVyc2lvbnMKICAgICAgICAgICAgICAgICMoZS5nLiBieSBEamFuZ28pCiAgICAgICAgICAgICAgICBjb25maWdbJ2ZtdCddID0gY29uZmlnLnBvcCgnZm9ybWF0JykKICAgICAgICAgICAgICAgIGNvbmZpZ1snKCknXSA9IGZhY3RvcnkKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJlX2N1c3RvbShjb25maWcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm10ID0gY29uZmlnLmdldCgnZm9ybWF0JywgTm9uZSkKICAgICAgICAgICAgZGZtdCA9IGNvbmZpZy5nZXQoJ2RhdGVmbXQnLCBOb25lKQogICAgICAgICAgICByZXN1bHQgPSBsb2dnaW5nLkZvcm1hdHRlcihmbXQsIGRmbXQpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBjb25maWd1cmVfZmlsdGVyKHNlbGYsIGNvbmZpZyk6CiAgICAgICAgIiIiQ29uZmlndXJlIGEgZmlsdGVyIGZyb20gYSBkaWN0aW9uYXJ5LiIiIgogICAgICAgIGlmICcoKScgaW4gY29uZmlnOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyZV9jdXN0b20oY29uZmlnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5hbWUgPSBjb25maWcuZ2V0KCduYW1lJywgJycpCiAgICAgICAgICAgIHJlc3VsdCA9IGxvZ2dpbmcuRmlsdGVyKG5hbWUpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBhZGRfZmlsdGVycyhzZWxmLCBmaWx0ZXJlciwgZmlsdGVycyk6CiAgICAgICAgIiIiQWRkIGZpbHRlcnMgdG8gYSBmaWx0ZXJlciBmcm9tIGEgbGlzdCBvZiBuYW1lcy4iIiIKICAgICAgICBmb3IgZiBpbiBmaWx0ZXJzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmaWx0ZXJlci5hZGRGaWx0ZXIoc2VsZi5jb25maWdbJ2ZpbHRlcnMnXVtmXSkKICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBhZGQgZmlsdGVyICVyOiAlcycgJSAoZiwgZSkpCgogICAgZGVmIGNvbmZpZ3VyZV9oYW5kbGVyKHNlbGYsIGNvbmZpZyk6CiAgICAgICAgIiIiQ29uZmlndXJlIGEgaGFuZGxlciBmcm9tIGEgZGljdGlvbmFyeS4iIiIKICAgICAgICBmb3JtYXR0ZXIgPSBjb25maWcucG9wKCdmb3JtYXR0ZXInLCBOb25lKQogICAgICAgIGlmIGZvcm1hdHRlcjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gc2VsZi5jb25maWdbJ2Zvcm1hdHRlcnMnXVtmb3JtYXR0ZXJdCiAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gc2V0IGZvcm1hdHRlciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcjogJXMnICUgKGZvcm1hdHRlciwgZSkpCiAgICAgICAgbGV2ZWwgPSBjb25maWcucG9wKCdsZXZlbCcsIE5vbmUpCiAgICAgICAgZmlsdGVycyA9IGNvbmZpZy5wb3AoJ2ZpbHRlcnMnLCBOb25lKQogICAgICAgIGlmICcoKScgaW4gY29uZmlnOgogICAgICAgICAgICBjID0gY29uZmlnLnBvcCgnKCknKQogICAgICAgICAgICBpZiBub3QgaGFzYXR0cihjLCAnX19jYWxsX18nKSBhbmQgaGFzYXR0cih0eXBlcywgJ0NsYXNzVHlwZScpIGFuZCB0eXBlKGMpICE9IHR5cGVzLkNsYXNzVHlwZToKICAgICAgICAgICAgICAgIGMgPSBzZWxmLnJlc29sdmUoYykKICAgICAgICAgICAgZmFjdG9yeSA9IGMKICAgICAgICBlbHNlOgogICAgICAgICAgICBrbGFzcyA9IHNlbGYucmVzb2x2ZShjb25maWcucG9wKCdjbGFzcycpKQogICAgICAgICAgICAjIFNwZWNpYWwgY2FzZSBmb3IgaGFuZGxlciB3aGljaCByZWZlcnMgdG8gYW5vdGhlciBoYW5kbGVyCiAgICAgICAgICAgIGlmIGlzc3ViY2xhc3Moa2xhc3MsIGxvZ2dpbmcuaGFuZGxlcnMuTWVtb3J5SGFuZGxlcikgYW5kXAogICAgICAgICAgICAgICAgJ3RhcmdldCcgaW4gY29uZmlnOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGNvbmZpZ1sndGFyZ2V0J10gPSBzZWxmLmNvbmZpZ1snaGFuZGxlcnMnXVtjb25maWdbJ3RhcmdldCddXQogICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gc2V0IHRhcmdldCBoYW5kbGVyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcjogJXMnICUgKGNvbmZpZ1sndGFyZ2V0J10sIGUpKQogICAgICAgICAgICBlbGlmIGlzc3ViY2xhc3Moa2xhc3MsIGxvZ2dpbmcuaGFuZGxlcnMuU01UUEhhbmRsZXIpIGFuZFwKICAgICAgICAgICAgICAgICdtYWlsaG9zdCcgaW4gY29uZmlnOgogICAgICAgICAgICAgICAgY29uZmlnWydtYWlsaG9zdCddID0gc2VsZi5hc190dXBsZShjb25maWdbJ21haWxob3N0J10pCiAgICAgICAgICAgIGVsaWYgaXNzdWJjbGFzcyhrbGFzcywgbG9nZ2luZy5oYW5kbGVycy5TeXNMb2dIYW5kbGVyKSBhbmRcCiAgICAgICAgICAgICAgICAnYWRkcmVzcycgaW4gY29uZmlnOgogICAgICAgICAgICAgICAgY29uZmlnWydhZGRyZXNzJ10gPSBzZWxmLmFzX3R1cGxlKGNvbmZpZ1snYWRkcmVzcyddKQogICAgICAgICAgICBmYWN0b3J5ID0ga2xhc3MKICAgICAgICBrd2FyZ3MgPSBkaWN0KChrLCBjb25maWdba10pIGZvciBrIGluIGNvbmZpZyBpZiB2YWxpZF9pZGVudChrKSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlc3VsdCA9IGZhY3RvcnkoKiprd2FyZ3MpCiAgICAgICAgZXhjZXB0IFR5cGVFcnJvciBhcyB0ZToKICAgICAgICAgICAgaWYgIidzdHJlYW0nIiBub3QgaW4gc3RyKHRlKToKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICMgVGhlIGFyZ3VtZW50IG5hbWUgY2hhbmdlZCBmcm9tIHN0cm0gdG8gc3RyZWFtCiAgICAgICAgICAgICMgUmV0cnkgd2l0aCBvbGQgbmFtZS4KICAgICAgICAgICAgIyBUaGlzIGlzIHNvIHRoYXQgY29kZSBjYW4gYmUgdXNlZCB3aXRoIG9sZGVyIFB5dGhvbiB2ZXJzaW9ucwogICAgICAgICAgICAjKGUuZy4gYnkgRGphbmdvKQogICAgICAgICAgICBrd2FyZ3NbJ3N0cm0nXSA9IGt3YXJncy5wb3AoJ3N0cmVhbScpCiAgICAgICAgICAgIHJlc3VsdCA9IGZhY3RvcnkoKiprd2FyZ3MpCiAgICAgICAgaWYgZm9ybWF0dGVyOgogICAgICAgICAgICByZXN1bHQuc2V0Rm9ybWF0dGVyKGZvcm1hdHRlcikKICAgICAgICBpZiBsZXZlbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmVzdWx0LnNldExldmVsKF9jaGVja0xldmVsKGxldmVsKSkKICAgICAgICBpZiBmaWx0ZXJzOgogICAgICAgICAgICBzZWxmLmFkZF9maWx0ZXJzKHJlc3VsdCwgZmlsdGVycykKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGFkZF9oYW5kbGVycyhzZWxmLCBsb2dnZXIsIGhhbmRsZXJzKToKICAgICAgICAiIiJBZGQgaGFuZGxlcnMgdG8gYSBsb2dnZXIgZnJvbSBhIGxpc3Qgb2YgbmFtZXMuIiIiCiAgICAgICAgZm9yIGggaW4gaGFuZGxlcnM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGxvZ2dlci5hZGRIYW5kbGVyKHNlbGYuY29uZmlnWydoYW5kbGVycyddW2hdKQogICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGFkZCBoYW5kbGVyICVyOiAlcycgJSAoaCwgZSkpCgogICAgZGVmIGNvbW1vbl9sb2dnZXJfY29uZmlnKHNlbGYsIGxvZ2dlciwgY29uZmlnLCBpbmNyZW1lbnRhbD1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgUGVyZm9ybSBjb25maWd1cmF0aW9uIHdoaWNoIGlzIGNvbW1vbiB0byByb290IGFuZCBub24tcm9vdCBsb2dnZXJzLgogICAgICAgICIiIgogICAgICAgIGxldmVsID0gY29uZmlnLmdldCgnbGV2ZWwnLCBOb25lKQogICAgICAgIGlmIGxldmVsIGlzIG5vdCBOb25lOgogICAgICAgICAgICBsb2dnZXIuc2V0TGV2ZWwoX2NoZWNrTGV2ZWwobGV2ZWwpKQogICAgICAgIGlmIG5vdCBpbmNyZW1lbnRhbDoKICAgICAgICAgICAgIyBSZW1vdmUgYW55IGV4aXN0aW5nIGhhbmRsZXJzCiAgICAgICAgICAgIGZvciBoIGluIGxvZ2dlci5oYW5kbGVyc1s6XToKICAgICAgICAgICAgICAgIGxvZ2dlci5yZW1vdmVIYW5kbGVyKGgpCiAgICAgICAgICAgIGhhbmRsZXJzID0gY29uZmlnLmdldCgnaGFuZGxlcnMnLCBOb25lKQogICAgICAgICAgICBpZiBoYW5kbGVyczoKICAgICAgICAgICAgICAgIHNlbGYuYWRkX2hhbmRsZXJzKGxvZ2dlciwgaGFuZGxlcnMpCiAgICAgICAgICAgIGZpbHRlcnMgPSBjb25maWcuZ2V0KCdmaWx0ZXJzJywgTm9uZSkKICAgICAgICAgICAgaWYgZmlsdGVyczoKICAgICAgICAgICAgICAgIHNlbGYuYWRkX2ZpbHRlcnMobG9nZ2VyLCBmaWx0ZXJzKQoKICAgIGRlZiBjb25maWd1cmVfbG9nZ2VyKHNlbGYsIG5hbWUsIGNvbmZpZywgaW5jcmVtZW50YWw9RmFsc2UpOgogICAgICAgICIiIkNvbmZpZ3VyZSBhIG5vbi1yb290IGxvZ2dlciBmcm9tIGEgZGljdGlvbmFyeS4iIiIKICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihuYW1lKQogICAgICAgIHNlbGYuY29tbW9uX2xvZ2dlcl9jb25maWcobG9nZ2VyLCBjb25maWcsIGluY3JlbWVudGFsKQogICAgICAgIHByb3BhZ2F0ZSA9IGNvbmZpZy5nZXQoJ3Byb3BhZ2F0ZScsIE5vbmUpCiAgICAgICAgaWYgcHJvcGFnYXRlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBsb2dnZXIucHJvcGFnYXRlID0gcHJvcGFnYXRlCgogICAgZGVmIGNvbmZpZ3VyZV9yb290KHNlbGYsIGNvbmZpZywgaW5jcmVtZW50YWw9RmFsc2UpOgogICAgICAgICIiIkNvbmZpZ3VyZSBhIHJvb3QgbG9nZ2VyIGZyb20gYSBkaWN0aW9uYXJ5LiIiIgogICAgICAgIHJvb3QgPSBsb2dnaW5nLmdldExvZ2dlcigpCiAgICAgICAgc2VsZi5jb21tb25fbG9nZ2VyX2NvbmZpZyhyb290LCBjb25maWcsIGluY3JlbWVudGFsKQoKZGljdENvbmZpZ0NsYXNzID0gRGljdENvbmZpZ3VyYXRvcgoKCmRlZiBkaWN0Q29uZmlnKGNvbmZpZyk6CiAgICAiIiJDb25maWd1cmUgbG9nZ2luZyB1c2luZyBhIGRpY3Rpb25hcnkuIiIiCiAgICBkaWN0Q29uZmlnQ2xhc3MoY29uZmlnKS5jb25maWd1cmUoKQpQSwMEFAAAAAAAAAAhAP0/KVGZfQAAmX0AAB8AAABweXBpX19waXBfOV8wXzMvcGlwL2Rvd25sb2FkLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBjZ2kKaW1wb3J0IGVtYWlsLnV0aWxzCmltcG9ydCBnZXRwYXNzCmltcG9ydCBqc29uCmltcG9ydCBsb2dnaW5nCmltcG9ydCBtaW1ldHlwZXMKaW1wb3J0IG9zCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgcmUKaW1wb3J0IHNodXRpbAppbXBvcnQgc3lzCmltcG9ydCB0ZW1wZmlsZQoKdHJ5OgogICAgaW1wb3J0IHNzbCAgIyBub3FhCiAgICBIQVNfVExTID0gVHJ1ZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBIQVNfVExTID0gRmFsc2UKCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJsbGliX3BhcnNlCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcmVxdWVzdCBhcyB1cmxsaWJfcmVxdWVzdAoKaW1wb3J0IHBpcAoKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgSW5zdGFsbGF0aW9uRXJyb3IsIEhhc2hNaXNtYXRjaApmcm9tIHBpcC5tb2RlbHMgaW1wb3J0IFB5UEkKZnJvbSBwaXAudXRpbHMgaW1wb3J0IChzcGxpdGV4dCwgcm10cmVlLCBmb3JtYXRfc2l6ZSwgZGlzcGxheV9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cF9kaXIsIGFza19wYXRoX2V4aXN0cywgdW5wYWNrX2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgQVJDSElWRV9FWFRFTlNJT05TLCBjb25zdW1lLCBjYWxsX3N1YnByb2Nlc3MpCmZyb20gcGlwLnV0aWxzLmVuY29kaW5nIGltcG9ydCBhdXRvX2RlY29kZQpmcm9tIHBpcC51dGlscy5maWxlc3lzdGVtIGltcG9ydCBjaGVja19wYXRoX293bmVyCmZyb20gcGlwLnV0aWxzLmxvZ2dpbmcgaW1wb3J0IGluZGVudF9sb2cKZnJvbSBwaXAudXRpbHMuc2V0dXB0b29sc19idWlsZCBpbXBvcnQgU0VUVVBUT09MU19TSElNCmZyb20gcGlwLnV0aWxzLmdsaWJjIGltcG9ydCBsaWJjX3Zlcgpmcm9tIHBpcC51dGlscy51aSBpbXBvcnQgRG93bmxvYWRQcm9ncmVzc0JhciwgRG93bmxvYWRQcm9ncmVzc1NwaW5uZXIKZnJvbSBwaXAubG9jYXRpb25zIGltcG9ydCB3cml0ZV9kZWxldGVfbWFya2VyX2ZpbGUKZnJvbSBwaXAudmNzIGltcG9ydCB2Y3MKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgcmVxdWVzdHMsIHNpeApmcm9tIHBpcC5fdmVuZG9yLnJlcXVlc3RzLmFkYXB0ZXJzIGltcG9ydCBCYXNlQWRhcHRlciwgSFRUUEFkYXB0ZXIKZnJvbSBwaXAuX3ZlbmRvci5yZXF1ZXN0cy5hdXRoIGltcG9ydCBBdXRoQmFzZSwgSFRUUEJhc2ljQXV0aApmcm9tIHBpcC5fdmVuZG9yLnJlcXVlc3RzLm1vZGVscyBpbXBvcnQgQ09OVEVOVF9DSFVOS19TSVpFLCBSZXNwb25zZQpmcm9tIHBpcC5fdmVuZG9yLnJlcXVlc3RzLnV0aWxzIGltcG9ydCBnZXRfbmV0cmNfYXV0aApmcm9tIHBpcC5fdmVuZG9yLnJlcXVlc3RzLnN0cnVjdHVyZXMgaW1wb3J0IENhc2VJbnNlbnNpdGl2ZURpY3QKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgdXJsbGliMwpmcm9tIHBpcC5fdmVuZG9yLmNhY2hlY29udHJvbCBpbXBvcnQgQ2FjaGVDb250cm9sQWRhcHRlcgpmcm9tIHBpcC5fdmVuZG9yLmNhY2hlY29udHJvbC5jYWNoZXMgaW1wb3J0IEZpbGVDYWNoZQpmcm9tIHBpcC5fdmVuZG9yLmxvY2tmaWxlIGltcG9ydCBMb2NrRXJyb3IKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMgaW1wb3J0IHhtbHJwY19jbGllbnQKCgpfX2FsbF9fID0gWydnZXRfZmlsZV9jb250ZW50JywKICAgICAgICAgICAnaXNfdXJsJywgJ3VybF90b19wYXRoJywgJ3BhdGhfdG9fdXJsJywKICAgICAgICAgICAnaXNfYXJjaGl2ZV9maWxlJywgJ3VucGFja192Y3NfbGluaycsCiAgICAgICAgICAgJ3VucGFja19maWxlX3VybCcsICdpc192Y3NfdXJsJywgJ2lzX2ZpbGVfdXJsJywKICAgICAgICAgICAndW5wYWNrX2h0dHBfdXJsJywgJ3VucGFja191cmwnXQoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmRlZiB1c2VyX2FnZW50KCk6CiAgICAiIiIKICAgIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHVzZXIgYWdlbnQuCiAgICAiIiIKICAgIGRhdGEgPSB7CiAgICAgICAgImluc3RhbGxlciI6IHsibmFtZSI6ICJwaXAiLCAidmVyc2lvbiI6IHBpcC5fX3ZlcnNpb25fX30sCiAgICAgICAgInB5dGhvbiI6IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCksCiAgICAgICAgImltcGxlbWVudGF0aW9uIjogewogICAgICAgICAgICAibmFtZSI6IHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpLAogICAgICAgIH0sCiAgICB9CgogICAgaWYgZGF0YVsiaW1wbGVtZW50YXRpb24iXVsibmFtZSJdID09ICdDUHl0aG9uJzoKICAgICAgICBkYXRhWyJpbXBsZW1lbnRhdGlvbiJdWyJ2ZXJzaW9uIl0gPSBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpCiAgICBlbGlmIGRhdGFbImltcGxlbWVudGF0aW9uIl1bIm5hbWUiXSA9PSAnUHlQeSc6CiAgICAgICAgaWYgc3lzLnB5cHlfdmVyc2lvbl9pbmZvLnJlbGVhc2VsZXZlbCA9PSAnZmluYWwnOgogICAgICAgICAgICBweXB5X3ZlcnNpb25faW5mbyA9IHN5cy5weXB5X3ZlcnNpb25faW5mb1s6M10KICAgICAgICBlbHNlOgogICAgICAgICAgICBweXB5X3ZlcnNpb25faW5mbyA9IHN5cy5weXB5X3ZlcnNpb25faW5mbwogICAgICAgIGRhdGFbImltcGxlbWVudGF0aW9uIl1bInZlcnNpb24iXSA9ICIuIi5qb2luKAogICAgICAgICAgICBbc3RyKHgpIGZvciB4IGluIHB5cHlfdmVyc2lvbl9pbmZvXQogICAgICAgICkKICAgIGVsaWYgZGF0YVsiaW1wbGVtZW50YXRpb24iXVsibmFtZSJdID09ICdKeXRob24nOgogICAgICAgICMgQ29tcGxldGUgR3Vlc3MKICAgICAgICBkYXRhWyJpbXBsZW1lbnRhdGlvbiJdWyJ2ZXJzaW9uIl0gPSBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpCiAgICBlbGlmIGRhdGFbImltcGxlbWVudGF0aW9uIl1bIm5hbWUiXSA9PSAnSXJvblB5dGhvbic6CiAgICAgICAgIyBDb21wbGV0ZSBHdWVzcwogICAgICAgIGRhdGFbImltcGxlbWVudGF0aW9uIl1bInZlcnNpb24iXSA9IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCkKCiAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgibGludXgiKToKICAgICAgICBmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBkaXN0cm8KICAgICAgICBkaXN0cm9faW5mb3MgPSBkaWN0KGZpbHRlcigKICAgICAgICAgICAgbGFtYmRhIHg6IHhbMV0sCiAgICAgICAgICAgIHppcChbIm5hbWUiLCAidmVyc2lvbiIsICJpZCJdLCBkaXN0cm8ubGludXhfZGlzdHJpYnV0aW9uKCkpLAogICAgICAgICkpCiAgICAgICAgbGliYyA9IGRpY3QoZmlsdGVyKAogICAgICAgICAgICBsYW1iZGEgeDogeFsxXSwKICAgICAgICAgICAgemlwKFsibGliIiwgInZlcnNpb24iXSwgbGliY192ZXIoKSksCiAgICAgICAgKSkKICAgICAgICBpZiBsaWJjOgogICAgICAgICAgICBkaXN0cm9faW5mb3NbImxpYmMiXSA9IGxpYmMKICAgICAgICBpZiBkaXN0cm9faW5mb3M6CiAgICAgICAgICAgIGRhdGFbImRpc3RybyJdID0gZGlzdHJvX2luZm9zCgogICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoImRhcndpbiIpIGFuZCBwbGF0Zm9ybS5tYWNfdmVyKClbMF06CiAgICAgICAgZGF0YVsiZGlzdHJvIl0gPSB7Im5hbWUiOiAibWFjT1MiLCAidmVyc2lvbiI6IHBsYXRmb3JtLm1hY192ZXIoKVswXX0KCiAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKToKICAgICAgICBkYXRhLnNldGRlZmF1bHQoInN5c3RlbSIsIHt9KVsibmFtZSJdID0gcGxhdGZvcm0uc3lzdGVtKCkKCiAgICBpZiBwbGF0Zm9ybS5yZWxlYXNlKCk6CiAgICAgICAgZGF0YS5zZXRkZWZhdWx0KCJzeXN0ZW0iLCB7fSlbInJlbGVhc2UiXSA9IHBsYXRmb3JtLnJlbGVhc2UoKQoKICAgIGlmIHBsYXRmb3JtLm1hY2hpbmUoKToKICAgICAgICBkYXRhWyJjcHUiXSA9IHBsYXRmb3JtLm1hY2hpbmUoKQoKICAgICMgUHl0aG9uIDIuNiBkb2Vzbid0IGhhdmUgc3NsLk9QRU5TU0xfVkVSU0lPTi4KICAgIGlmIEhBU19UTFMgYW5kIHN5cy52ZXJzaW9uX2luZm9bOjJdID4gKDIsIDYpOgogICAgICAgIGRhdGFbIm9wZW5zc2xfdmVyc2lvbiJdID0gc3NsLk9QRU5TU0xfVkVSU0lPTgoKICAgIHJldHVybiAie2RhdGFbaW5zdGFsbGVyXVtuYW1lXX0ve2RhdGFbaW5zdGFsbGVyXVt2ZXJzaW9uXX0ge2pzb259Ii5mb3JtYXQoCiAgICAgICAgZGF0YT1kYXRhLAogICAgICAgIGpzb249anNvbi5kdW1wcyhkYXRhLCBzZXBhcmF0b3JzPSgiLCIsICI6IiksIHNvcnRfa2V5cz1UcnVlKSwKICAgICkKCgpjbGFzcyBNdWx0aURvbWFpbkJhc2ljQXV0aChBdXRoQmFzZSk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb21wdGluZz1UcnVlKToKICAgICAgICBzZWxmLnByb21wdGluZyA9IHByb21wdGluZwogICAgICAgIHNlbGYucGFzc3dvcmRzID0ge30KCiAgICBkZWYgX19jYWxsX18oc2VsZiwgcmVxKToKICAgICAgICBwYXJzZWQgPSB1cmxsaWJfcGFyc2UudXJscGFyc2UocmVxLnVybCkKCiAgICAgICAgIyBHZXQgdGhlIG5ldGxvYyB3aXRob3V0IGFueSBlbWJlZGRlZCBjcmVkZW50aWFscwogICAgICAgIG5ldGxvYyA9IHBhcnNlZC5uZXRsb2MucnNwbGl0KCJAIiwgMSlbLTFdCgogICAgICAgICMgU2V0IHRoZSB1cmwgb2YgdGhlIHJlcXVlc3QgdG8gdGhlIHVybCB3aXRob3V0IGFueSBjcmVkZW50aWFscwogICAgICAgIHJlcS51cmwgPSB1cmxsaWJfcGFyc2UudXJsdW5wYXJzZShwYXJzZWRbOjFdICsgKG5ldGxvYywpICsgcGFyc2VkWzI6XSkKCiAgICAgICAgIyBVc2UgYW55IHN0b3JlZCBjcmVkZW50aWFscyB0aGF0IHdlIGhhdmUgZm9yIHRoaXMgbmV0bG9jCiAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gc2VsZi5wYXNzd29yZHMuZ2V0KG5ldGxvYywgKE5vbmUsIE5vbmUpKQoKICAgICAgICAjIEV4dHJhY3QgY3JlZGVudGlhbHMgZW1iZWRkZWQgaW4gdGhlIHVybCBpZiB3ZSBoYXZlIG5vbmUgc3RvcmVkCiAgICAgICAgaWYgdXNlcm5hbWUgaXMgTm9uZToKICAgICAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gc2VsZi5wYXJzZV9jcmVkZW50aWFscyhwYXJzZWQubmV0bG9jKQoKICAgICAgICAjIEdldCBjcmVkcyBmcm9tIG5ldHJjIGlmIHdlIHN0aWxsIGRvbid0IGhhdmUgdGhlbQogICAgICAgIGlmIHVzZXJuYW1lIGlzIE5vbmUgYW5kIHBhc3N3b3JkIGlzIE5vbmU6CiAgICAgICAgICAgIG5ldHJjX2F1dGggPSBnZXRfbmV0cmNfYXV0aChyZXEudXJsKQogICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSBuZXRyY19hdXRoIGlmIG5ldHJjX2F1dGggZWxzZSAoTm9uZSwgTm9uZSkKCiAgICAgICAgaWYgdXNlcm5hbWUgb3IgcGFzc3dvcmQ6CiAgICAgICAgICAgICMgU3RvcmUgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZAogICAgICAgICAgICBzZWxmLnBhc3N3b3Jkc1tuZXRsb2NdID0gKHVzZXJuYW1lLCBwYXNzd29yZCkKCiAgICAgICAgICAgICMgU2VuZCB0aGUgYmFzaWMgYXV0aCB3aXRoIHRoaXMgcmVxdWVzdAogICAgICAgICAgICByZXEgPSBIVFRQQmFzaWNBdXRoKHVzZXJuYW1lIG9yICIiLCBwYXNzd29yZCBvciAiIikocmVxKQoKICAgICAgICAjIEF0dGFjaCBhIGhvb2sgdG8gaGFuZGxlIDQwMSByZXNwb25zZXMKICAgICAgICByZXEucmVnaXN0ZXJfaG9vaygicmVzcG9uc2UiLCBzZWxmLmhhbmRsZV80MDEpCgogICAgICAgIHJldHVybiByZXEKCiAgICBkZWYgaGFuZGxlXzQwMShzZWxmLCByZXNwLCAqKmt3YXJncyk6CiAgICAgICAgIyBXZSBvbmx5IGNhcmUgYWJvdXQgNDAxIHJlc3BvbnNlcywgYW55dGhpbmcgZWxzZSB3ZSB3YW50IHRvIGp1c3QKICAgICAgICAjICAgcGFzcyB0aHJvdWdoIHRoZSBhY3R1YWwgcmVzcG9uc2UKICAgICAgICBpZiByZXNwLnN0YXR1c19jb2RlICE9IDQwMToKICAgICAgICAgICAgcmV0dXJuIHJlc3AKCiAgICAgICAgIyBXZSBhcmUgbm90IGFibGUgdG8gcHJvbXB0IHRoZSB1c2VyIHNvIHNpbXBseSByZXR1cm4gdGhlIHJlc3BvbnNlCiAgICAgICAgaWYgbm90IHNlbGYucHJvbXB0aW5nOgogICAgICAgICAgICByZXR1cm4gcmVzcAoKICAgICAgICBwYXJzZWQgPSB1cmxsaWJfcGFyc2UudXJscGFyc2UocmVzcC51cmwpCgogICAgICAgICMgUHJvbXB0IHRoZSB1c2VyIGZvciBhIG5ldyB1c2VybmFtZSBhbmQgcGFzc3dvcmQKICAgICAgICB1c2VybmFtZSA9IHNpeC5tb3Zlcy5pbnB1dCgiVXNlciBmb3IgJXM6ICIgJSBwYXJzZWQubmV0bG9jKQogICAgICAgIHBhc3N3b3JkID0gZ2V0cGFzcy5nZXRwYXNzKCJQYXNzd29yZDogIikKCiAgICAgICAgIyBTdG9yZSB0aGUgbmV3IHVzZXJuYW1lIGFuZCBwYXNzd29yZCB0byB1c2UgZm9yIGZ1dHVyZSByZXF1ZXN0cwogICAgICAgIGlmIHVzZXJuYW1lIG9yIHBhc3N3b3JkOgogICAgICAgICAgICBzZWxmLnBhc3N3b3Jkc1twYXJzZWQubmV0bG9jXSA9ICh1c2VybmFtZSwgcGFzc3dvcmQpCgogICAgICAgICMgQ29uc3VtZSBjb250ZW50IGFuZCByZWxlYXNlIHRoZSBvcmlnaW5hbCBjb25uZWN0aW9uIHRvIGFsbG93IG91ciBuZXcKICAgICAgICAjICAgcmVxdWVzdCB0byByZXVzZSB0aGUgc2FtZSBvbmUuCiAgICAgICAgcmVzcC5jb250ZW50CiAgICAgICAgcmVzcC5yYXcucmVsZWFzZV9jb25uKCkKCiAgICAgICAgIyBBZGQgb3VyIG5ldyB1c2VybmFtZSBhbmQgcGFzc3dvcmQgdG8gdGhlIHJlcXVlc3QKICAgICAgICByZXEgPSBIVFRQQmFzaWNBdXRoKHVzZXJuYW1lIG9yICIiLCBwYXNzd29yZCBvciAiIikocmVzcC5yZXF1ZXN0KQoKICAgICAgICAjIFNlbmQgb3VyIG5ldyByZXF1ZXN0CiAgICAgICAgbmV3X3Jlc3AgPSByZXNwLmNvbm5lY3Rpb24uc2VuZChyZXEsICoqa3dhcmdzKQogICAgICAgIG5ld19yZXNwLmhpc3RvcnkuYXBwZW5kKHJlc3ApCgogICAgICAgIHJldHVybiBuZXdfcmVzcAoKICAgIGRlZiBwYXJzZV9jcmVkZW50aWFscyhzZWxmLCBuZXRsb2MpOgogICAgICAgIGlmICJAIiBpbiBuZXRsb2M6CiAgICAgICAgICAgIHVzZXJpbmZvID0gbmV0bG9jLnJzcGxpdCgiQCIsIDEpWzBdCiAgICAgICAgICAgIGlmICI6IiBpbiB1c2VyaW5mbzoKICAgICAgICAgICAgICAgIHJldHVybiB1c2VyaW5mby5zcGxpdCgiOiIsIDEpCiAgICAgICAgICAgIHJldHVybiB1c2VyaW5mbywgTm9uZQogICAgICAgIHJldHVybiBOb25lLCBOb25lCgoKY2xhc3MgTG9jYWxGU0FkYXB0ZXIoQmFzZUFkYXB0ZXIpOgoKICAgIGRlZiBzZW5kKHNlbGYsIHJlcXVlc3QsIHN0cmVhbT1Ob25lLCB0aW1lb3V0PU5vbmUsIHZlcmlmeT1Ob25lLCBjZXJ0PU5vbmUsCiAgICAgICAgICAgICBwcm94aWVzPU5vbmUpOgogICAgICAgIHBhdGhuYW1lID0gdXJsX3RvX3BhdGgocmVxdWVzdC51cmwpCgogICAgICAgIHJlc3AgPSBSZXNwb25zZSgpCiAgICAgICAgcmVzcC5zdGF0dXNfY29kZSA9IDIwMAogICAgICAgIHJlc3AudXJsID0gcmVxdWVzdC51cmwKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdGF0cyA9IG9zLnN0YXQocGF0aG5hbWUpCiAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXhjOgogICAgICAgICAgICByZXNwLnN0YXR1c19jb2RlID0gNDA0CiAgICAgICAgICAgIHJlc3AucmF3ID0gZXhjCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbW9kaWZpZWQgPSBlbWFpbC51dGlscy5mb3JtYXRkYXRlKHN0YXRzLnN0X210aW1lLCB1c2VnbXQ9VHJ1ZSkKICAgICAgICAgICAgY29udGVudF90eXBlID0gbWltZXR5cGVzLmd1ZXNzX3R5cGUocGF0aG5hbWUpWzBdIG9yICJ0ZXh0L3BsYWluIgogICAgICAgICAgICByZXNwLmhlYWRlcnMgPSBDYXNlSW5zZW5zaXRpdmVEaWN0KHsKICAgICAgICAgICAgICAgICJDb250ZW50LVR5cGUiOiBjb250ZW50X3R5cGUsCiAgICAgICAgICAgICAgICAiQ29udGVudC1MZW5ndGgiOiBzdGF0cy5zdF9zaXplLAogICAgICAgICAgICAgICAgIkxhc3QtTW9kaWZpZWQiOiBtb2RpZmllZCwKICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIHJlc3AucmF3ID0gb3BlbihwYXRobmFtZSwgInJiIikKICAgICAgICAgICAgcmVzcC5jbG9zZSA9IHJlc3AucmF3LmNsb3NlCgogICAgICAgIHJldHVybiByZXNwCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgIHBhc3MKCgpjbGFzcyBTYWZlRmlsZUNhY2hlKEZpbGVDYWNoZSk6CiAgICAiIiIKICAgIEEgZmlsZSBiYXNlZCBjYWNoZSB3aGljaCBpcyBzYWZlIHRvIHVzZSBldmVuIHdoZW4gdGhlIHRhcmdldCBkaXJlY3RvcnkgbWF5CiAgICBub3QgYmUgYWNjZXNzaWJsZSBvciB3cml0YWJsZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKFNhZmVGaWxlQ2FjaGUsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKCiAgICAgICAgIyBDaGVjayB0byBlbnN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgb3VyIGNhY2hlIGRpcmVjdG9yeQogICAgICAgICMgaXMgb3duZWQgYnkgdGhlIHVzZXIgY3VycmVudCBleGVjdXRpbmcgcGlwLiBJZiBpdCBkb2VzIG5vdCBleGlzdAogICAgICAgICMgd2Ugd2lsbCBjaGVjayB0aGUgcGFyZW50IGRpcmVjdG9yeSB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0IGRvZXMgZXhpc3QuCiAgICAgICAgIyBJZiBpdCBpcyBub3Qgb3duZWQgYnkgdGhlIHVzZXIgZXhlY3V0aW5nIHBpcCB0aGVuIHdlIHdpbGwgZGlzYWJsZQogICAgICAgICMgdGhlIGNhY2hlIGFuZCBsb2cgYSB3YXJuaW5nLgogICAgICAgIGlmIG5vdCBjaGVja19wYXRoX293bmVyKHNlbGYuZGlyZWN0b3J5KToKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAiVGhlIGRpcmVjdG9yeSAnJXMnIG9yIGl0cyBwYXJlbnQgZGlyZWN0b3J5IGlzIG5vdCBvd25lZCBieSAiCiAgICAgICAgICAgICAgICAidGhlIGN1cnJlbnQgdXNlciBhbmQgdGhlIGNhY2hlIGhhcyBiZWVuIGRpc2FibGVkLiBQbGVhc2UgIgogICAgICAgICAgICAgICAgImNoZWNrIHRoZSBwZXJtaXNzaW9ucyBhbmQgb3duZXIgb2YgdGhhdCBkaXJlY3RvcnkuIElmICIKICAgICAgICAgICAgICAgICJleGVjdXRpbmcgcGlwIHdpdGggc3VkbywgeW91IG1heSB3YW50IHN1ZG8ncyAtSCBmbGFnLiIsCiAgICAgICAgICAgICAgICBzZWxmLmRpcmVjdG9yeSwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgIyBTZXQgb3VyIGRpcmVjdG9yeSB0byBOb25lIHRvIGRpc2FibGUgdGhlIENhY2hlCiAgICAgICAgICAgIHNlbGYuZGlyZWN0b3J5ID0gTm9uZQoKICAgIGRlZiBnZXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAjIElmIHdlIGRvbid0IGhhdmUgYSBkaXJlY3RvcnksIHRoZW4gdGhlIGNhY2hlIHNob3VsZCBiZSBhIG5vLW9wLgogICAgICAgIGlmIHNlbGYuZGlyZWN0b3J5IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihTYWZlRmlsZUNhY2hlLCBzZWxmKS5nZXQoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGV4Y2VwdCAoTG9ja0Vycm9yLCBPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgIyBXZSBpbnRlbnRpb25hbGx5IHNpbGVuY2UgdGhpcyBlcnJvciwgaWYgd2UgY2FuJ3QgYWNjZXNzIHRoZSBjYWNoZQogICAgICAgICAgICAjIHRoZW4gd2UgY2FuIGp1c3Qgc2tpcCBjYWNoaW5nIGFuZCBwcm9jZXNzIHRoZSByZXF1ZXN0IGFzIGlmCiAgICAgICAgICAgICMgY2FjaGluZyB3YXNuJ3QgZW5hYmxlZC4KICAgICAgICAgICAgcGFzcwoKICAgIGRlZiBzZXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAjIElmIHdlIGRvbid0IGhhdmUgYSBkaXJlY3RvcnksIHRoZW4gdGhlIGNhY2hlIHNob3VsZCBiZSBhIG5vLW9wLgogICAgICAgIGlmIHNlbGYuZGlyZWN0b3J5IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihTYWZlRmlsZUNhY2hlLCBzZWxmKS5zZXQoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGV4Y2VwdCAoTG9ja0Vycm9yLCBPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgIyBXZSBpbnRlbnRpb25hbGx5IHNpbGVuY2UgdGhpcyBlcnJvciwgaWYgd2UgY2FuJ3QgYWNjZXNzIHRoZSBjYWNoZQogICAgICAgICAgICAjIHRoZW4gd2UgY2FuIGp1c3Qgc2tpcCBjYWNoaW5nIGFuZCBwcm9jZXNzIHRoZSByZXF1ZXN0IGFzIGlmCiAgICAgICAgICAgICMgY2FjaGluZyB3YXNuJ3QgZW5hYmxlZC4KICAgICAgICAgICAgcGFzcwoKICAgIGRlZiBkZWxldGUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAjIElmIHdlIGRvbid0IGhhdmUgYSBkaXJlY3RvcnksIHRoZW4gdGhlIGNhY2hlIHNob3VsZCBiZSBhIG5vLW9wLgogICAgICAgIGlmIHNlbGYuZGlyZWN0b3J5IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihTYWZlRmlsZUNhY2hlLCBzZWxmKS5kZWxldGUoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGV4Y2VwdCAoTG9ja0Vycm9yLCBPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgIyBXZSBpbnRlbnRpb25hbGx5IHNpbGVuY2UgdGhpcyBlcnJvciwgaWYgd2UgY2FuJ3QgYWNjZXNzIHRoZSBjYWNoZQogICAgICAgICAgICAjIHRoZW4gd2UgY2FuIGp1c3Qgc2tpcCBjYWNoaW5nIGFuZCBwcm9jZXNzIHRoZSByZXF1ZXN0IGFzIGlmCiAgICAgICAgICAgICMgY2FjaGluZyB3YXNuJ3QgZW5hYmxlZC4KICAgICAgICAgICAgcGFzcwoKCmNsYXNzIEluc2VjdXJlSFRUUEFkYXB0ZXIoSFRUUEFkYXB0ZXIpOgoKICAgIGRlZiBjZXJ0X3ZlcmlmeShzZWxmLCBjb25uLCB1cmwsIHZlcmlmeSwgY2VydCk6CiAgICAgICAgY29ubi5jZXJ0X3JlcXMgPSAnQ0VSVF9OT05FJwogICAgICAgIGNvbm4uY2FfY2VydHMgPSBOb25lCgoKY2xhc3MgUGlwU2Vzc2lvbihyZXF1ZXN0cy5TZXNzaW9uKToKCiAgICB0aW1lb3V0ID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHJldHJpZXMgPSBrd2FyZ3MucG9wKCJyZXRyaWVzIiwgMCkKICAgICAgICBjYWNoZSA9IGt3YXJncy5wb3AoImNhY2hlIiwgTm9uZSkKICAgICAgICBpbnNlY3VyZV9ob3N0cyA9IGt3YXJncy5wb3AoImluc2VjdXJlX2hvc3RzIiwgW10pCgogICAgICAgIHN1cGVyKFBpcFNlc3Npb24sIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKCiAgICAgICAgIyBBdHRhY2ggb3VyIFVzZXIgQWdlbnQgdG8gdGhlIHJlcXVlc3QKICAgICAgICBzZWxmLmhlYWRlcnNbIlVzZXItQWdlbnQiXSA9IHVzZXJfYWdlbnQoKQoKICAgICAgICAjIEF0dGFjaCBvdXIgQXV0aGVudGljYXRpb24gaGFuZGxlciB0byB0aGUgc2Vzc2lvbgogICAgICAgIHNlbGYuYXV0aCA9IE11bHRpRG9tYWluQmFzaWNBdXRoKCkKCiAgICAgICAgIyBDcmVhdGUgb3VyIHVybGxpYjMuUmV0cnkgaW5zdGFuY2Ugd2hpY2ggd2lsbCBhbGxvdyB1cyB0byBjdXN0b21pemUKICAgICAgICAjIGhvdyB3ZSBoYW5kbGUgcmV0cmllcy4KICAgICAgICByZXRyaWVzID0gdXJsbGliMy5SZXRyeSgKICAgICAgICAgICAgIyBTZXQgdGhlIHRvdGFsIG51bWJlciBvZiByZXRyaWVzIHRoYXQgYSBwYXJ0aWN1bGFyIHJlcXVlc3QgY2FuCiAgICAgICAgICAgICMgaGF2ZS4KICAgICAgICAgICAgdG90YWw9cmV0cmllcywKCiAgICAgICAgICAgICMgQSA1MDMgZXJyb3IgZnJvbSBQeVBJIHR5cGljYWxseSBtZWFucyB0aGF0IHRoZSBGYXN0bHkgLT4gT3JpZ2luCiAgICAgICAgICAgICMgY29ubmVjdGlvbiBnb3QgaW50ZXJydXB0ZWQgaW4gc29tZSB3YXkuIEEgNTAzIGVycm9yIGluIGdlbmVyYWwKICAgICAgICAgICAgIyBpcyB0eXBpY2FsbHkgY29uc2lkZXJlZCBhIHRyYW5zaWVudCBlcnJvciBzbyB3ZSdsbCBnbyBhaGVhZCBhbmQKICAgICAgICAgICAgIyByZXRyeSBpdC4KICAgICAgICAgICAgc3RhdHVzX2ZvcmNlbGlzdD1bNTAzXSwKCiAgICAgICAgICAgICMgQWRkIGEgc21hbGwgYW1vdW50IG9mIGJhY2sgb2ZmIGJldHdlZW4gZmFpbGVkIHJlcXVlc3RzIGluCiAgICAgICAgICAgICMgb3JkZXIgdG8gcHJldmVudCBoYW1tZXJpbmcgdGhlIHNlcnZpY2UuCiAgICAgICAgICAgIGJhY2tvZmZfZmFjdG9yPTAuMjUsCiAgICAgICAgKQoKICAgICAgICAjIFdlIHdhbnQgdG8gX29ubHlfIGNhY2hlIHJlc3BvbnNlcyBvbiBzZWN1cmVseSBmZXRjaGVkIG9yaWdpbnMuIFdlIGRvCiAgICAgICAgIyB0aGlzIGJlY2F1c2Ugd2UgY2FuJ3QgdmFsaWRhdGUgdGhlIHJlc3BvbnNlIG9mIGFuIGluc2VjdXJlbHkgZmV0Y2hlZAogICAgICAgICMgb3JpZ2luLCBhbmQgd2UgZG9uJ3Qgd2FudCBzb21lb25lIHRvIGJlIGFibGUgdG8gcG9pc29uIHRoZSBjYWNoZSBhbmQKICAgICAgICAjIHJlcXVpcmUgbWFudWFsIGV2aWN0aW9uIGZyb20gdGhlIGNhY2hlIHRvIGZpeCBpdC4KICAgICAgICBpZiBjYWNoZToKICAgICAgICAgICAgc2VjdXJlX2FkYXB0ZXIgPSBDYWNoZUNvbnRyb2xBZGFwdGVyKAogICAgICAgICAgICAgICAgY2FjaGU9U2FmZUZpbGVDYWNoZShjYWNoZSwgdXNlX2Rpcl9sb2NrPVRydWUpLAogICAgICAgICAgICAgICAgbWF4X3JldHJpZXM9cmV0cmllcywKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlY3VyZV9hZGFwdGVyID0gSFRUUEFkYXB0ZXIobWF4X3JldHJpZXM9cmV0cmllcykKCiAgICAgICAgIyBPdXIgSW5zZWN1cmUgSFRUUEFkYXB0ZXIgZGlzYWJsZXMgSFRUUFMgdmFsaWRhdGlvbi4gSXQgZG9lcyBub3QKICAgICAgICAjIHN1cHBvcnQgY2FjaGluZyAoc2VlIGFib3ZlKSBzbyB3ZSdsbCB1c2UgaXQgZm9yIGFsbCBodHRwOi8vIFVSTHMgYXMKICAgICAgICAjIHdlbGwgYXMgYW55IGh0dHBzOi8vIGhvc3QgdGhhdCB3ZSd2ZSBtYXJrZWQgYXMgaWdub3JpbmcgVExTIGVycm9ycwogICAgICAgICMgZm9yLgogICAgICAgIGluc2VjdXJlX2FkYXB0ZXIgPSBJbnNlY3VyZUhUVFBBZGFwdGVyKG1heF9yZXRyaWVzPXJldHJpZXMpCgogICAgICAgIHNlbGYubW91bnQoImh0dHBzOi8vIiwgc2VjdXJlX2FkYXB0ZXIpCiAgICAgICAgc2VsZi5tb3VudCgiaHR0cDovLyIsIGluc2VjdXJlX2FkYXB0ZXIpCgogICAgICAgICMgRW5hYmxlIGZpbGU6Ly8gdXJscwogICAgICAgIHNlbGYubW91bnQoImZpbGU6Ly8iLCBMb2NhbEZTQWRhcHRlcigpKQoKICAgICAgICAjIFdlIHdhbnQgdG8gdXNlIGEgbm9uLXZhbGlkYXRpbmcgYWRhcHRlciBmb3IgYW55IHJlcXVlc3RzIHdoaWNoIGFyZQogICAgICAgICMgZGVlbWVkIGluc2VjdXJlLgogICAgICAgIGZvciBob3N0IGluIGluc2VjdXJlX2hvc3RzOgogICAgICAgICAgICBzZWxmLm1vdW50KCJodHRwczovL3swfS8iLmZvcm1hdChob3N0KSwgaW5zZWN1cmVfYWRhcHRlcikKCiAgICBkZWYgcmVxdWVzdChzZWxmLCBtZXRob2QsIHVybCwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAjIEFsbG93IHNldHRpbmcgYSBkZWZhdWx0IHRpbWVvdXQgb24gYSBzZXNzaW9uCiAgICAgICAga3dhcmdzLnNldGRlZmF1bHQoInRpbWVvdXQiLCBzZWxmLnRpbWVvdXQpCgogICAgICAgICMgRGlzcGF0Y2ggdGhlIGFjdHVhbCByZXF1ZXN0CiAgICAgICAgcmV0dXJuIHN1cGVyKFBpcFNlc3Npb24sIHNlbGYpLnJlcXVlc3QobWV0aG9kLCB1cmwsICphcmdzLCAqKmt3YXJncykKCgpkZWYgZ2V0X2ZpbGVfY29udGVudCh1cmwsIGNvbWVzX2Zyb209Tm9uZSwgc2Vzc2lvbj1Ob25lKToKICAgICIiIkdldHMgdGhlIGNvbnRlbnQgb2YgYSBmaWxlOyBpdCBtYXkgYmUgYSBmaWxlbmFtZSwgZmlsZTogVVJMLCBvcgogICAgaHR0cDogVVJMLiAgUmV0dXJucyAobG9jYXRpb24sIGNvbnRlbnQpLiAgQ29udGVudCBpcyB1bmljb2RlLiIiIgogICAgaWYgc2Vzc2lvbiBpcyBOb25lOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgImdldF9maWxlX2NvbnRlbnQoKSBtaXNzaW5nIDEgcmVxdWlyZWQga2V5d29yZCBhcmd1bWVudDogJ3Nlc3Npb24nIgogICAgICAgICkKCiAgICBtYXRjaCA9IF9zY2hlbWVfcmUuc2VhcmNoKHVybCkKICAgIGlmIG1hdGNoOgogICAgICAgIHNjaGVtZSA9IG1hdGNoLmdyb3VwKDEpLmxvd2VyKCkKICAgICAgICBpZiAoc2NoZW1lID09ICdmaWxlJyBhbmQgY29tZXNfZnJvbSBhbmQKICAgICAgICAgICAgICAgIGNvbWVzX2Zyb20uc3RhcnRzd2l0aCgnaHR0cCcpKToKICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAnUmVxdWlyZW1lbnRzIGZpbGUgJXMgcmVmZXJlbmNlcyBVUkwgJXMsIHdoaWNoIGlzIGxvY2FsJwogICAgICAgICAgICAgICAgJSAoY29tZXNfZnJvbSwgdXJsKSkKICAgICAgICBpZiBzY2hlbWUgPT0gJ2ZpbGUnOgogICAgICAgICAgICBwYXRoID0gdXJsLnNwbGl0KCc6JywgMSlbMV0KICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgnXFwnLCAnLycpCiAgICAgICAgICAgIG1hdGNoID0gX3VybF9zbGFzaF9kcml2ZV9yZS5tYXRjaChwYXRoKQogICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgIHBhdGggPSBtYXRjaC5ncm91cCgxKSArICc6JyArIHBhdGguc3BsaXQoJ3wnLCAxKVsxXQogICAgICAgICAgICBwYXRoID0gdXJsbGliX3BhcnNlLnVucXVvdGUocGF0aCkKICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKCcvJyk6CiAgICAgICAgICAgICAgICBwYXRoID0gJy8nICsgcGF0aC5sc3RyaXAoJy8nKQogICAgICAgICAgICB1cmwgPSBwYXRoCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBGSVhNRTogY2F0Y2ggc29tZSBlcnJvcnMKICAgICAgICAgICAgcmVzcCA9IHNlc3Npb24uZ2V0KHVybCkKICAgICAgICAgICAgcmVzcC5yYWlzZV9mb3Jfc3RhdHVzKCkKICAgICAgICAgICAgcmV0dXJuIHJlc3AudXJsLCByZXNwLnRleHQKICAgIHRyeToKICAgICAgICB3aXRoIG9wZW4odXJsLCAncmInKSBhcyBmOgogICAgICAgICAgICBjb250ZW50ID0gYXV0b19kZWNvZGUoZi5yZWFkKCkpCiAgICBleGNlcHQgSU9FcnJvciBhcyBleGM6CiAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICdDb3VsZCBub3Qgb3BlbiByZXF1aXJlbWVudHMgZmlsZTogJXMnICUgc3RyKGV4YykKICAgICAgICApCiAgICByZXR1cm4gdXJsLCBjb250ZW50CgoKX3NjaGVtZV9yZSA9IHJlLmNvbXBpbGUocideKGh0dHB8aHR0cHN8ZmlsZSk6JywgcmUuSSkKX3VybF9zbGFzaF9kcml2ZV9yZSA9IHJlLmNvbXBpbGUocicvKihbYS16XSlcfCcsIHJlLkkpCgoKZGVmIGlzX3VybChuYW1lKToKICAgICIiIlJldHVybnMgdHJ1ZSBpZiB0aGUgbmFtZSBsb29rcyBsaWtlIGEgVVJMIiIiCiAgICBpZiAnOicgbm90IGluIG5hbWU6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBzY2hlbWUgPSBuYW1lLnNwbGl0KCc6JywgMSlbMF0ubG93ZXIoKQogICAgcmV0dXJuIHNjaGVtZSBpbiBbJ2h0dHAnLCAnaHR0cHMnLCAnZmlsZScsICdmdHAnXSArIHZjcy5hbGxfc2NoZW1lcwoKCmRlZiB1cmxfdG9fcGF0aCh1cmwpOgogICAgIiIiCiAgICBDb252ZXJ0IGEgZmlsZTogVVJMIHRvIGEgcGF0aC4KICAgICIiIgogICAgYXNzZXJ0IHVybC5zdGFydHN3aXRoKCdmaWxlOicpLCAoCiAgICAgICAgIllvdSBjYW4gb25seSB0dXJuIGZpbGU6IHVybHMgaW50byBmaWxlbmFtZXMgKG5vdCAlcikiICUgdXJsKQoKICAgIF8sIG5ldGxvYywgcGF0aCwgXywgXyA9IHVybGxpYl9wYXJzZS51cmxzcGxpdCh1cmwpCgogICAgIyBpZiB3ZSBoYXZlIGEgVU5DIHBhdGgsIHByZXBlbmQgVU5DIHNoYXJlIG5vdGF0aW9uCiAgICBpZiBuZXRsb2M6CiAgICAgICAgbmV0bG9jID0gJ1xcXFwnICsgbmV0bG9jCgogICAgcGF0aCA9IHVybGxpYl9yZXF1ZXN0LnVybDJwYXRobmFtZShuZXRsb2MgKyBwYXRoKQogICAgcmV0dXJuIHBhdGgKCgpkZWYgcGF0aF90b191cmwocGF0aCk6CiAgICAiIiIKICAgIENvbnZlcnQgYSBwYXRoIHRvIGEgZmlsZTogVVJMLiAgVGhlIHBhdGggd2lsbCBiZSBtYWRlIGFic29sdXRlIGFuZCBoYXZlCiAgICBxdW90ZWQgcGF0aCBwYXJ0cy4KICAgICIiIgogICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5hYnNwYXRoKHBhdGgpKQogICAgdXJsID0gdXJsbGliX3BhcnNlLnVybGpvaW4oJ2ZpbGU6JywgdXJsbGliX3JlcXVlc3QucGF0aG5hbWUydXJsKHBhdGgpKQogICAgcmV0dXJuIHVybAoKCmRlZiBpc19hcmNoaXZlX2ZpbGUobmFtZSk6CiAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBgbmFtZWAgaXMgYSBjb25zaWRlcmVkIGFzIGFuIGFyY2hpdmUgZmlsZS4iIiIKICAgIGV4dCA9IHNwbGl0ZXh0KG5hbWUpWzFdLmxvd2VyKCkKICAgIGlmIGV4dCBpbiBBUkNISVZFX0VYVEVOU0lPTlM6CiAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQoKCmRlZiB1bnBhY2tfdmNzX2xpbmsobGluaywgbG9jYXRpb24pOgogICAgdmNzX2JhY2tlbmQgPSBfZ2V0X3VzZWRfdmNzX2JhY2tlbmQobGluaykKICAgIHZjc19iYWNrZW5kLnVucGFjayhsb2NhdGlvbikKCgpkZWYgX2dldF91c2VkX3Zjc19iYWNrZW5kKGxpbmspOgogICAgZm9yIGJhY2tlbmQgaW4gdmNzLmJhY2tlbmRzOgogICAgICAgIGlmIGxpbmsuc2NoZW1lIGluIGJhY2tlbmQuc2NoZW1lczoKICAgICAgICAgICAgdmNzX2JhY2tlbmQgPSBiYWNrZW5kKGxpbmsudXJsKQogICAgICAgICAgICByZXR1cm4gdmNzX2JhY2tlbmQKCgpkZWYgaXNfdmNzX3VybChsaW5rKToKICAgIHJldHVybiBib29sKF9nZXRfdXNlZF92Y3NfYmFja2VuZChsaW5rKSkKCgpkZWYgaXNfZmlsZV91cmwobGluayk6CiAgICByZXR1cm4gbGluay51cmwubG93ZXIoKS5zdGFydHN3aXRoKCdmaWxlOicpCgoKZGVmIGlzX2Rpcl91cmwobGluayk6CiAgICAiIiJSZXR1cm4gd2hldGhlciBhIGZpbGU6Ly8gTGluayBwb2ludHMgdG8gYSBkaXJlY3RvcnkuCgogICAgYGBsaW5rYGAgbXVzdCBub3QgaGF2ZSBhbnkgb3RoZXIgc2NoZW1lIGJ1dCBmaWxlOi8vLiBDYWxsIGlzX2ZpbGVfdXJsKCkKICAgIGZpcnN0LgoKICAgICIiIgogICAgbGlua19wYXRoID0gdXJsX3RvX3BhdGgobGluay51cmxfd2l0aG91dF9mcmFnbWVudCkKICAgIHJldHVybiBvcy5wYXRoLmlzZGlyKGxpbmtfcGF0aCkKCgpkZWYgX3Byb2dyZXNzX2luZGljYXRvcihpdGVyYWJsZSwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBpdGVyYWJsZQoKCmRlZiBfZG93bmxvYWRfdXJsKHJlc3AsIGxpbmssIGNvbnRlbnRfZmlsZSwgaGFzaGVzKToKICAgIHRyeToKICAgICAgICB0b3RhbF9sZW5ndGggPSBpbnQocmVzcC5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddKQogICAgZXhjZXB0IChWYWx1ZUVycm9yLCBLZXlFcnJvciwgVHlwZUVycm9yKToKICAgICAgICB0b3RhbF9sZW5ndGggPSAwCgogICAgY2FjaGVkX3Jlc3AgPSBnZXRhdHRyKHJlc3AsICJmcm9tX2NhY2hlIiwgRmFsc2UpCgogICAgaWYgbG9nZ2VyLmdldEVmZmVjdGl2ZUxldmVsKCkgPiBsb2dnaW5nLklORk86CiAgICAgICAgc2hvd19wcm9ncmVzcyA9IEZhbHNlCiAgICBlbGlmIGNhY2hlZF9yZXNwOgogICAgICAgIHNob3dfcHJvZ3Jlc3MgPSBGYWxzZQogICAgZWxpZiB0b3RhbF9sZW5ndGggPiAoNDAgKiAxMDAwKToKICAgICAgICBzaG93X3Byb2dyZXNzID0gVHJ1ZQogICAgZWxpZiBub3QgdG90YWxfbGVuZ3RoOgogICAgICAgIHNob3dfcHJvZ3Jlc3MgPSBUcnVlCiAgICBlbHNlOgogICAgICAgIHNob3dfcHJvZ3Jlc3MgPSBGYWxzZQoKICAgIHNob3dfdXJsID0gbGluay5zaG93X3VybAoKICAgIGRlZiByZXNwX3JlYWQoY2h1bmtfc2l6ZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFNwZWNpYWwgY2FzZSBmb3IgdXJsbGliMy4KICAgICAgICAgICAgZm9yIGNodW5rIGluIHJlc3AucmF3LnN0cmVhbSgKICAgICAgICAgICAgICAgICAgICBjaHVua19zaXplLAogICAgICAgICAgICAgICAgICAgICMgV2UgdXNlIGRlY29kZV9jb250ZW50PUZhbHNlIGhlcmUgYmVjYXVzZSB3ZSBkb24ndAogICAgICAgICAgICAgICAgICAgICMgd2FudCB1cmxsaWIzIHRvIG1lc3Mgd2l0aCB0aGUgcmF3IGJ5dGVzIHdlIGdldAogICAgICAgICAgICAgICAgICAgICMgZnJvbSB0aGUgc2VydmVyLiBJZiB3ZSBkZWNvbXByZXNzIGluc2lkZSBvZgogICAgICAgICAgICAgICAgICAgICMgdXJsbGliMyB0aGVuIHdlIGNhbm5vdCB2ZXJpZnkgdGhlIGNoZWNrc3VtCiAgICAgICAgICAgICAgICAgICAgIyBiZWNhdXNlIHRoZSBjaGVja3N1bSB3aWxsIGJlIG9mIHRoZSBjb21wcmVzc2VkCiAgICAgICAgICAgICAgICAgICAgIyBmaWxlLiBUaGlzIGJyZWFrYWdlIHdpbGwgb25seSBvY2N1ciBpZiB0aGUKICAgICAgICAgICAgICAgICAgICAjIHNlcnZlciBhZGRzIGEgQ29udGVudC1FbmNvZGluZyBoZWFkZXIsIHdoaWNoCiAgICAgICAgICAgICAgICAgICAgIyBkZXBlbmRzIG9uIGhvdyB0aGUgc2VydmVyIHdhcyBjb25maWd1cmVkOgogICAgICAgICAgICAgICAgICAgICMgLSBTb21lIHNlcnZlcnMgd2lsbCBub3RpY2UgdGhhdCB0aGUgZmlsZSBpc24ndCBhCiAgICAgICAgICAgICAgICAgICAgIyAgIGNvbXByZXNzaWJsZSBmaWxlIGFuZCB3aWxsIGxlYXZlIHRoZSBmaWxlIGFsb25lCiAgICAgICAgICAgICAgICAgICAgIyAgIGFuZCB3aXRoIGFuIGVtcHR5IENvbnRlbnQtRW5jb2RpbmcKICAgICAgICAgICAgICAgICAgICAjIC0gU29tZSBzZXJ2ZXJzIHdpbGwgbm90aWNlIHRoYXQgdGhlIGZpbGUgaXMKICAgICAgICAgICAgICAgICAgICAjICAgYWxyZWFkeSBjb21wcmVzc2VkIGFuZCB3aWxsIGxlYXZlIHRoZSBmaWxlCiAgICAgICAgICAgICAgICAgICAgIyAgIGFsb25lIGFuZCB3aWxsIGFkZCBhIENvbnRlbnQtRW5jb2Rpbmc6IGd6aXAKICAgICAgICAgICAgICAgICAgICAjICAgaGVhZGVyCiAgICAgICAgICAgICAgICAgICAgIyAtIFNvbWUgc2VydmVycyB3b24ndCBub3RpY2UgYW55dGhpbmcgYXQgYWxsIGFuZAogICAgICAgICAgICAgICAgICAgICMgICB3aWxsIHRha2UgYSBmaWxlIHRoYXQncyBhbHJlYWR5IGJlZW4gY29tcHJlc3NlZAogICAgICAgICAgICAgICAgICAgICMgICBhbmQgY29tcHJlc3MgaXQgYWdhaW4gYW5kIHNldCB0aGUKICAgICAgICAgICAgICAgICAgICAjICAgQ29udGVudC1FbmNvZGluZzogZ3ppcCBoZWFkZXIKICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICAgICAgIyBCeSBzZXR0aW5nIHRoaXMgbm90IHRvIGRlY29kZSBhdXRvbWF0aWNhbGx5IHdlCiAgICAgICAgICAgICAgICAgICAgIyBob3BlIHRvIGVsaW1pbmF0ZSBwcm9ibGVtcyB3aXRoIHRoZSBzZWNvbmQgY2FzZS4KICAgICAgICAgICAgICAgICAgICBkZWNvZGVfY29udGVudD1GYWxzZSk6CiAgICAgICAgICAgICAgICB5aWVsZCBjaHVuawogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIyBTdGFuZGFyZCBmaWxlLWxpa2Ugb2JqZWN0LgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgY2h1bmsgPSByZXNwLnJhdy5yZWFkKGNodW5rX3NpemUpCiAgICAgICAgICAgICAgICBpZiBub3QgY2h1bms6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIHlpZWxkIGNodW5rCgogICAgZGVmIHdyaXR0ZW5fY2h1bmtzKGNodW5rcyk6CiAgICAgICAgZm9yIGNodW5rIGluIGNodW5rczoKICAgICAgICAgICAgY29udGVudF9maWxlLndyaXRlKGNodW5rKQogICAgICAgICAgICB5aWVsZCBjaHVuawoKICAgIHByb2dyZXNzX2luZGljYXRvciA9IF9wcm9ncmVzc19pbmRpY2F0b3IKCiAgICBpZiBsaW5rLm5ldGxvYyA9PSBQeVBJLm5ldGxvYzoKICAgICAgICB1cmwgPSBzaG93X3VybAogICAgZWxzZToKICAgICAgICB1cmwgPSBsaW5rLnVybF93aXRob3V0X2ZyYWdtZW50CgogICAgaWYgc2hvd19wcm9ncmVzczogICMgV2UgZG9uJ3Qgc2hvdyBwcm9ncmVzcyBvbiBjYWNoZWQgcmVzcG9uc2VzCiAgICAgICAgaWYgdG90YWxfbGVuZ3RoOgogICAgICAgICAgICBsb2dnZXIuaW5mbygiRG93bmxvYWRpbmcgJXMgKCVzKSIsIHVybCwgZm9ybWF0X3NpemUodG90YWxfbGVuZ3RoKSkKICAgICAgICAgICAgcHJvZ3Jlc3NfaW5kaWNhdG9yID0gRG93bmxvYWRQcm9ncmVzc0JhcihtYXg9dG90YWxfbGVuZ3RoKS5pdGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkRvd25sb2FkaW5nICVzIiwgdXJsKQogICAgICAgICAgICBwcm9ncmVzc19pbmRpY2F0b3IgPSBEb3dubG9hZFByb2dyZXNzU3Bpbm5lcigpLml0ZXIKICAgIGVsaWYgY2FjaGVkX3Jlc3A6CiAgICAgICAgbG9nZ2VyLmluZm8oIlVzaW5nIGNhY2hlZCAlcyIsIHVybCkKICAgIGVsc2U6CiAgICAgICAgbG9nZ2VyLmluZm8oIkRvd25sb2FkaW5nICVzIiwgdXJsKQoKICAgIGxvZ2dlci5kZWJ1ZygnRG93bmxvYWRpbmcgZnJvbSBVUkwgJXMnLCBsaW5rKQoKICAgIGRvd25sb2FkZWRfY2h1bmtzID0gd3JpdHRlbl9jaHVua3MoCiAgICAgICAgcHJvZ3Jlc3NfaW5kaWNhdG9yKAogICAgICAgICAgICByZXNwX3JlYWQoQ09OVEVOVF9DSFVOS19TSVpFKSwKICAgICAgICAgICAgQ09OVEVOVF9DSFVOS19TSVpFCiAgICAgICAgKQogICAgKQogICAgaWYgaGFzaGVzOgogICAgICAgIGhhc2hlcy5jaGVja19hZ2FpbnN0X2NodW5rcyhkb3dubG9hZGVkX2NodW5rcykKICAgIGVsc2U6CiAgICAgICAgY29uc3VtZShkb3dubG9hZGVkX2NodW5rcykKCgpkZWYgX2NvcHlfZmlsZShmaWxlbmFtZSwgbG9jYXRpb24sIGxpbmspOgogICAgY29weSA9IFRydWUKICAgIGRvd25sb2FkX2xvY2F0aW9uID0gb3MucGF0aC5qb2luKGxvY2F0aW9uLCBsaW5rLmZpbGVuYW1lKQogICAgaWYgb3MucGF0aC5leGlzdHMoZG93bmxvYWRfbG9jYXRpb24pOgogICAgICAgIHJlc3BvbnNlID0gYXNrX3BhdGhfZXhpc3RzKAogICAgICAgICAgICAnVGhlIGZpbGUgJXMgZXhpc3RzLiAoaSlnbm9yZSwgKHcpaXBlLCAoYilhY2t1cCwgKGEpYWJvcnQnICUKICAgICAgICAgICAgZGlzcGxheV9wYXRoKGRvd25sb2FkX2xvY2F0aW9uKSwgKCdpJywgJ3cnLCAnYicsICdhJykpCiAgICAgICAgaWYgcmVzcG9uc2UgPT0gJ2knOgogICAgICAgICAgICBjb3B5ID0gRmFsc2UKICAgICAgICBlbGlmIHJlc3BvbnNlID09ICd3JzoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0RlbGV0aW5nICVzJywgZGlzcGxheV9wYXRoKGRvd25sb2FkX2xvY2F0aW9uKSkKICAgICAgICAgICAgb3MucmVtb3ZlKGRvd25sb2FkX2xvY2F0aW9uKQogICAgICAgIGVsaWYgcmVzcG9uc2UgPT0gJ2InOgogICAgICAgICAgICBkZXN0X2ZpbGUgPSBiYWNrdXBfZGlyKGRvd25sb2FkX2xvY2F0aW9uKQogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICdCYWNraW5nIHVwICVzIHRvICVzJywKICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChkb3dubG9hZF9sb2NhdGlvbiksCiAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoZGVzdF9maWxlKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBzaHV0aWwubW92ZShkb3dubG9hZF9sb2NhdGlvbiwgZGVzdF9maWxlKQogICAgICAgIGVsaWYgcmVzcG9uc2UgPT0gJ2EnOgogICAgICAgICAgICBzeXMuZXhpdCgtMSkKICAgIGlmIGNvcHk6CiAgICAgICAgc2h1dGlsLmNvcHkoZmlsZW5hbWUsIGRvd25sb2FkX2xvY2F0aW9uKQogICAgICAgIGxvZ2dlci5pbmZvKCdTYXZlZCAlcycsIGRpc3BsYXlfcGF0aChkb3dubG9hZF9sb2NhdGlvbikpCgoKZGVmIHVucGFja19odHRwX3VybChsaW5rLCBsb2NhdGlvbiwgZG93bmxvYWRfZGlyPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbj1Ob25lLCBoYXNoZXM9Tm9uZSk6CiAgICBpZiBzZXNzaW9uIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKAogICAgICAgICAgICAidW5wYWNrX2h0dHBfdXJsKCkgbWlzc2luZyAxIHJlcXVpcmVkIGtleXdvcmQgYXJndW1lbnQ6ICdzZXNzaW9uJyIKICAgICAgICApCgogICAgdGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCctdW5wYWNrJywgJ3BpcC0nKQoKICAgICMgSWYgYSBkb3dubG9hZCBkaXIgaXMgc3BlY2lmaWVkLCBpcyB0aGUgZmlsZSBhbHJlYWR5IGRvd25sb2FkZWQgdGhlcmU/CiAgICBhbHJlYWR5X2Rvd25sb2FkZWRfcGF0aCA9IE5vbmUKICAgIGlmIGRvd25sb2FkX2RpcjoKICAgICAgICBhbHJlYWR5X2Rvd25sb2FkZWRfcGF0aCA9IF9jaGVja19kb3dubG9hZF9kaXIobGluaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXMpCgogICAgaWYgYWxyZWFkeV9kb3dubG9hZGVkX3BhdGg6CiAgICAgICAgZnJvbV9wYXRoID0gYWxyZWFkeV9kb3dubG9hZGVkX3BhdGgKICAgICAgICBjb250ZW50X3R5cGUgPSBtaW1ldHlwZXMuZ3Vlc3NfdHlwZShmcm9tX3BhdGgpWzBdCiAgICBlbHNlOgogICAgICAgICMgbGV0J3MgZG93bmxvYWQgdG8gYSB0bXAgZGlyCiAgICAgICAgZnJvbV9wYXRoLCBjb250ZW50X3R5cGUgPSBfZG93bmxvYWRfaHR0cF91cmwobGluaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hlcykKCiAgICAjIHVucGFjayB0aGUgYXJjaGl2ZSB0byB0aGUgYnVpbGQgZGlyIGxvY2F0aW9uLiBldmVuIHdoZW4gb25seSBkb3dubG9hZGluZwogICAgIyBhcmNoaXZlcywgdGhleSBoYXZlIHRvIGJlIHVucGFja2VkIHRvIHBhcnNlIGRlcGVuZGVuY2llcwogICAgdW5wYWNrX2ZpbGUoZnJvbV9wYXRoLCBsb2NhdGlvbiwgY29udGVudF90eXBlLCBsaW5rKQoKICAgICMgYSBkb3dubG9hZCBkaXIgaXMgc3BlY2lmaWVkOyBsZXQncyBjb3B5IHRoZSBhcmNoaXZlIHRoZXJlCiAgICBpZiBkb3dubG9hZF9kaXIgYW5kIG5vdCBhbHJlYWR5X2Rvd25sb2FkZWRfcGF0aDoKICAgICAgICBfY29weV9maWxlKGZyb21fcGF0aCwgZG93bmxvYWRfZGlyLCBsaW5rKQoKICAgIGlmIG5vdCBhbHJlYWR5X2Rvd25sb2FkZWRfcGF0aDoKICAgICAgICBvcy51bmxpbmsoZnJvbV9wYXRoKQogICAgcm10cmVlKHRlbXBfZGlyKQoKCmRlZiB1bnBhY2tfZmlsZV91cmwobGluaywgbG9jYXRpb24sIGRvd25sb2FkX2Rpcj1Ob25lLCBoYXNoZXM9Tm9uZSk6CiAgICAiIiJVbnBhY2sgbGluayBpbnRvIGxvY2F0aW9uLgoKICAgIElmIGRvd25sb2FkX2RpciBpcyBwcm92aWRlZCBhbmQgbGluayBwb2ludHMgdG8gYSBmaWxlLCBtYWtlIGEgY29weQogICAgb2YgdGhlIGxpbmsgZmlsZSBpbnNpZGUgZG93bmxvYWRfZGlyLgogICAgIiIiCiAgICBsaW5rX3BhdGggPSB1cmxfdG9fcGF0aChsaW5rLnVybF93aXRob3V0X2ZyYWdtZW50KQoKICAgICMgSWYgaXQncyBhIHVybCB0byBhIGxvY2FsIGRpcmVjdG9yeQogICAgaWYgaXNfZGlyX3VybChsaW5rKToKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGxvY2F0aW9uKToKICAgICAgICAgICAgcm10cmVlKGxvY2F0aW9uKQogICAgICAgIHNodXRpbC5jb3B5dHJlZShsaW5rX3BhdGgsIGxvY2F0aW9uLCBzeW1saW5rcz1UcnVlKQogICAgICAgIGlmIGRvd25sb2FkX2RpcjoKICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0xpbmsgaXMgYSBkaXJlY3RvcnksIGlnbm9yaW5nIGRvd25sb2FkX2RpcicpCiAgICAgICAgcmV0dXJuCgogICAgIyBJZiAtLXJlcXVpcmUtaGFzaGVzIGlzIG9mZiwgYGhhc2hlc2AgaXMgZWl0aGVyIGVtcHR5LCB0aGUKICAgICMgbGluaydzIGVtYmVkZGVkIGhhc2gsIG9yIE1pc3NpbmdIYXNoZXM7IGl0IGlzIHJlcXVpcmVkIHRvCiAgICAjIG1hdGNoLiBJZiAtLXJlcXVpcmUtaGFzaGVzIGlzIG9uLCB3ZSBhcmUgc2F0aXNmaWVkIGJ5IGFueQogICAgIyBoYXNoIGluIGBoYXNoZXNgIG1hdGNoaW5nOiBhIFVSTC1iYXNlZCBvciBhbiBvcHRpb24tYmFzZWQKICAgICMgb25lOyBubyBpbnRlcm5ldC1zb3VyY2VkIGhhc2ggd2lsbCBiZSBpbiBgaGFzaGVzYC4KICAgIGlmIGhhc2hlczoKICAgICAgICBoYXNoZXMuY2hlY2tfYWdhaW5zdF9wYXRoKGxpbmtfcGF0aCkKCiAgICAjIElmIGEgZG93bmxvYWQgZGlyIGlzIHNwZWNpZmllZCwgaXMgdGhlIGZpbGUgYWxyZWFkeSB0aGVyZSBhbmQgdmFsaWQ/CiAgICBhbHJlYWR5X2Rvd25sb2FkZWRfcGF0aCA9IE5vbmUKICAgIGlmIGRvd25sb2FkX2RpcjoKICAgICAgICBhbHJlYWR5X2Rvd25sb2FkZWRfcGF0aCA9IF9jaGVja19kb3dubG9hZF9kaXIobGluaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXMpCgogICAgaWYgYWxyZWFkeV9kb3dubG9hZGVkX3BhdGg6CiAgICAgICAgZnJvbV9wYXRoID0gYWxyZWFkeV9kb3dubG9hZGVkX3BhdGgKICAgIGVsc2U6CiAgICAgICAgZnJvbV9wYXRoID0gbGlua19wYXRoCgogICAgY29udGVudF90eXBlID0gbWltZXR5cGVzLmd1ZXNzX3R5cGUoZnJvbV9wYXRoKVswXQoKICAgICMgdW5wYWNrIHRoZSBhcmNoaXZlIHRvIHRoZSBidWlsZCBkaXIgbG9jYXRpb24uIGV2ZW4gd2hlbiBvbmx5IGRvd25sb2FkaW5nCiAgICAjIGFyY2hpdmVzLCB0aGV5IGhhdmUgdG8gYmUgdW5wYWNrZWQgdG8gcGFyc2UgZGVwZW5kZW5jaWVzCiAgICB1bnBhY2tfZmlsZShmcm9tX3BhdGgsIGxvY2F0aW9uLCBjb250ZW50X3R5cGUsIGxpbmspCgogICAgIyBhIGRvd25sb2FkIGRpciBpcyBzcGVjaWZpZWQgYW5kIG5vdCBhbHJlYWR5IGRvd25sb2FkZWQKICAgIGlmIGRvd25sb2FkX2RpciBhbmQgbm90IGFscmVhZHlfZG93bmxvYWRlZF9wYXRoOgogICAgICAgIF9jb3B5X2ZpbGUoZnJvbV9wYXRoLCBkb3dubG9hZF9kaXIsIGxpbmspCgoKZGVmIF9jb3B5X2Rpc3RfZnJvbV9kaXIobGlua19wYXRoLCBsb2NhdGlvbik6CiAgICAiIiJDb3B5IGRpc3RyaWJ1dGlvbiBmaWxlcyBpbiBgbGlua19wYXRoYCB0byBgbG9jYXRpb25gLgoKICAgIEludm9rZWQgd2hlbiB1c2VyIHJlcXVlc3RzIHRvIGluc3RhbGwgYSBsb2NhbCBkaXJlY3RvcnkuIEUuZy46CgogICAgICAgIHBpcCBpbnN0YWxsIC4KICAgICAgICBwaXAgaW5zdGFsbCB+L2Rldi9naXQtcmVwb3MvcHl0aG9uLXByb21wdC10b29sa2l0CgogICAgIiIiCgogICAgIyBOb3RlOiBUaGlzIGlzIGN1cnJlbnRseSBWRVJZIFNMT1cgaWYgeW91IGhhdmUgYSBsb3Qgb2YgZGF0YSBpbiB0aGUKICAgICMgZGlyZWN0b3J5LCBiZWNhdXNlIGl0IGNvcGllcyBldmVyeXRoaW5nIHdpdGggYHNodXRpbC5jb3B5dHJlZWAuCiAgICAjIFdoYXQgaXQgc2hvdWxkIHJlYWxseSBkbyBpcyBidWlsZCBhbiBzZGlzdCBhbmQgaW5zdGFsbCB0aGF0LgogICAgIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8yMTk1CgogICAgaWYgb3MucGF0aC5pc2Rpcihsb2NhdGlvbik6CiAgICAgICAgcm10cmVlKGxvY2F0aW9uKQoKICAgICMgYnVpbGQgYW4gc2Rpc3QKICAgIHNldHVwX3B5ID0gJ3NldHVwLnB5JwogICAgc2Rpc3RfYXJncyA9IFtzeXMuZXhlY3V0YWJsZV0KICAgIHNkaXN0X2FyZ3MuYXBwZW5kKCctYycpCiAgICBzZGlzdF9hcmdzLmFwcGVuZChTRVRVUFRPT0xTX1NISU0gJSBzZXR1cF9weSkKICAgIHNkaXN0X2FyZ3MuYXBwZW5kKCdzZGlzdCcpCiAgICBzZGlzdF9hcmdzICs9IFsnLS1kaXN0LWRpcicsIGxvY2F0aW9uXQogICAgbG9nZ2VyLmluZm8oJ1J1bm5pbmcgc2V0dXAucHkgc2Rpc3QgZm9yICVzJywgbGlua19wYXRoKQoKICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgIGNhbGxfc3VicHJvY2VzcyhzZGlzdF9hcmdzLCBjd2Q9bGlua19wYXRoLCBzaG93X3N0ZG91dD1GYWxzZSkKCiAgICAjIHVucGFjayBzZGlzdCBpbnRvIGBsb2NhdGlvbmAKICAgIHNkaXN0ID0gb3MucGF0aC5qb2luKGxvY2F0aW9uLCBvcy5saXN0ZGlyKGxvY2F0aW9uKVswXSkKICAgIGxvZ2dlci5pbmZvKCdVbnBhY2tpbmcgc2Rpc3QgJXMgaW50byAlcycsIHNkaXN0LCBsb2NhdGlvbikKICAgIHVucGFja19maWxlKHNkaXN0LCBsb2NhdGlvbiwgY29udGVudF90eXBlPU5vbmUsIGxpbms9Tm9uZSkKCgpjbGFzcyBQaXBYbWxycGNUcmFuc3BvcnQoeG1scnBjX2NsaWVudC5UcmFuc3BvcnQpOgogICAgIiIiUHJvdmlkZSBhIGB4bWxycGNsaWIuVHJhbnNwb3J0YCBpbXBsZW1lbnRhdGlvbiB2aWEgYSBgUGlwU2Vzc2lvbmAKICAgIG9iamVjdC4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmRleF91cmwsIHNlc3Npb24sIHVzZV9kYXRldGltZT1GYWxzZSk6CiAgICAgICAgeG1scnBjX2NsaWVudC5UcmFuc3BvcnQuX19pbml0X18oc2VsZiwgdXNlX2RhdGV0aW1lKQogICAgICAgIGluZGV4X3BhcnRzID0gdXJsbGliX3BhcnNlLnVybHBhcnNlKGluZGV4X3VybCkKICAgICAgICBzZWxmLl9zY2hlbWUgPSBpbmRleF9wYXJ0cy5zY2hlbWUKICAgICAgICBzZWxmLl9zZXNzaW9uID0gc2Vzc2lvbgoKICAgIGRlZiByZXF1ZXN0KHNlbGYsIGhvc3QsIGhhbmRsZXIsIHJlcXVlc3RfYm9keSwgdmVyYm9zZT1GYWxzZSk6CiAgICAgICAgcGFydHMgPSAoc2VsZi5fc2NoZW1lLCBob3N0LCBoYW5kbGVyLCBOb25lLCBOb25lLCBOb25lKQogICAgICAgIHVybCA9IHVybGxpYl9wYXJzZS51cmx1bnBhcnNlKHBhcnRzKQogICAgICAgIHRyeToKICAgICAgICAgICAgaGVhZGVycyA9IHsnQ29udGVudC1UeXBlJzogJ3RleHQveG1sJ30KICAgICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9zZXNzaW9uLnBvc3QodXJsLCBkYXRhPXJlcXVlc3RfYm9keSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz1oZWFkZXJzLCBzdHJlYW09VHJ1ZSkKICAgICAgICAgICAgcmVzcG9uc2UucmFpc2VfZm9yX3N0YXR1cygpCiAgICAgICAgICAgIHNlbGYudmVyYm9zZSA9IHZlcmJvc2UKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VfcmVzcG9uc2UocmVzcG9uc2UucmF3KQogICAgICAgIGV4Y2VwdCByZXF1ZXN0cy5IVFRQRXJyb3IgYXMgZXhjOgogICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoCiAgICAgICAgICAgICAgICAiSFRUUCBlcnJvciAlcyB3aGlsZSBnZXR0aW5nICVzIiwKICAgICAgICAgICAgICAgIGV4Yy5yZXNwb25zZS5zdGF0dXNfY29kZSwgdXJsLAogICAgICAgICAgICApCiAgICAgICAgICAgIHJhaXNlCgoKZGVmIHVucGFja191cmwobGluaywgbG9jYXRpb24sIGRvd25sb2FkX2Rpcj1Ob25lLAogICAgICAgICAgICAgICBvbmx5X2Rvd25sb2FkPUZhbHNlLCBzZXNzaW9uPU5vbmUsIGhhc2hlcz1Ob25lKToKICAgICIiIlVucGFjayBsaW5rLgogICAgICAgSWYgbGluayBpcyBhIFZDUyBsaW5rOgogICAgICAgICBpZiBvbmx5X2Rvd25sb2FkLCBleHBvcnQgaW50byBkb3dubG9hZF9kaXIgYW5kIGlnbm9yZSBsb2NhdGlvbgogICAgICAgICAgZWxzZSB1bnBhY2sgaW50byBsb2NhdGlvbgogICAgICAgZm9yIG90aGVyIHR5cGVzIG9mIGxpbms6CiAgICAgICAgIC0gdW5wYWNrIGludG8gbG9jYXRpb24KICAgICAgICAgLSBpZiBkb3dubG9hZF9kaXIsIGNvcHkgdGhlIGZpbGUgaW50byBkb3dubG9hZF9kaXIKICAgICAgICAgLSBpZiBvbmx5X2Rvd25sb2FkLCBtYXJrIGxvY2F0aW9uIGZvciBkZWxldGlvbgoKICAgIDpwYXJhbSBoYXNoZXM6IEEgSGFzaGVzIG9iamVjdCwgb25lIG9mIHdob3NlIGVtYmVkZGVkIGhhc2hlcyBtdXN0IG1hdGNoLAogICAgICAgIG9yIEhhc2hNaXNtYXRjaCB3aWxsIGJlIHJhaXNlZC4gSWYgdGhlIEhhc2hlcyBpcyBlbXB0eSwgbm8gbWF0Y2hlcyBhcmUKICAgICAgICByZXF1aXJlZCwgYW5kIHVuaGFzaGFibGUgdHlwZXMgb2YgcmVxdWlyZW1lbnRzIChsaWtlIFZDUyBvbmVzLCB3aGljaAogICAgICAgIHdvdWxkIG9yZGluYXJpbHkgcmFpc2UgSGFzaFVuc3VwcG9ydGVkKSBhcmUgYWxsb3dlZC4KICAgICIiIgogICAgIyBub24tZWRpdGFibGUgdmNzIHVybHMKICAgIGlmIGlzX3Zjc191cmwobGluayk6CiAgICAgICAgdW5wYWNrX3Zjc19saW5rKGxpbmssIGxvY2F0aW9uKQoKICAgICMgZmlsZSB1cmxzCiAgICBlbGlmIGlzX2ZpbGVfdXJsKGxpbmspOgogICAgICAgIHVucGFja19maWxlX3VybChsaW5rLCBsb2NhdGlvbiwgZG93bmxvYWRfZGlyLCBoYXNoZXM9aGFzaGVzKQoKICAgICMgaHR0cCB1cmxzCiAgICBlbHNlOgogICAgICAgIGlmIHNlc3Npb24gaXMgTm9uZToKICAgICAgICAgICAgc2Vzc2lvbiA9IFBpcFNlc3Npb24oKQoKICAgICAgICB1bnBhY2tfaHR0cF91cmwoCiAgICAgICAgICAgIGxpbmssCiAgICAgICAgICAgIGxvY2F0aW9uLAogICAgICAgICAgICBkb3dubG9hZF9kaXIsCiAgICAgICAgICAgIHNlc3Npb24sCiAgICAgICAgICAgIGhhc2hlcz1oYXNoZXMKICAgICAgICApCiAgICBpZiBvbmx5X2Rvd25sb2FkOgogICAgICAgIHdyaXRlX2RlbGV0ZV9tYXJrZXJfZmlsZShsb2NhdGlvbikKCgpkZWYgX2Rvd25sb2FkX2h0dHBfdXJsKGxpbmssIHNlc3Npb24sIHRlbXBfZGlyLCBoYXNoZXMpOgogICAgIiIiRG93bmxvYWQgbGluayB1cmwgaW50byB0ZW1wX2RpciB1c2luZyBwcm92aWRlZCBzZXNzaW9uIiIiCiAgICB0YXJnZXRfdXJsID0gbGluay51cmwuc3BsaXQoJyMnLCAxKVswXQogICAgdHJ5OgogICAgICAgIHJlc3AgPSBzZXNzaW9uLmdldCgKICAgICAgICAgICAgdGFyZ2V0X3VybCwKICAgICAgICAgICAgIyBXZSB1c2UgQWNjZXB0LUVuY29kaW5nOiBpZGVudGl0eSBoZXJlIGJlY2F1c2UgcmVxdWVzdHMKICAgICAgICAgICAgIyBkZWZhdWx0cyB0byBhY2NlcHRpbmcgY29tcHJlc3NlZCByZXNwb25zZXMuIFRoaXMgYnJlYWtzIGluCiAgICAgICAgICAgICMgYSB2YXJpZXR5IG9mIHdheXMgZGVwZW5kaW5nIG9uIGhvdyB0aGUgc2VydmVyIGlzIGNvbmZpZ3VyZWQuCiAgICAgICAgICAgICMgLSBTb21lIHNlcnZlcnMgd2lsbCBub3RpY2UgdGhhdCB0aGUgZmlsZSBpc24ndCBhIGNvbXByZXNzaWJsZQogICAgICAgICAgICAjICAgZmlsZSBhbmQgd2lsbCBsZWF2ZSB0aGUgZmlsZSBhbG9uZSBhbmQgd2l0aCBhbiBlbXB0eQogICAgICAgICAgICAjICAgQ29udGVudC1FbmNvZGluZwogICAgICAgICAgICAjIC0gU29tZSBzZXJ2ZXJzIHdpbGwgbm90aWNlIHRoYXQgdGhlIGZpbGUgaXMgYWxyZWFkeQogICAgICAgICAgICAjICAgY29tcHJlc3NlZCBhbmQgd2lsbCBsZWF2ZSB0aGUgZmlsZSBhbG9uZSBhbmQgd2lsbCBhZGQgYQogICAgICAgICAgICAjICAgQ29udGVudC1FbmNvZGluZzogZ3ppcCBoZWFkZXIKICAgICAgICAgICAgIyAtIFNvbWUgc2VydmVycyB3b24ndCBub3RpY2UgYW55dGhpbmcgYXQgYWxsIGFuZCB3aWxsIHRha2UKICAgICAgICAgICAgIyAgIGEgZmlsZSB0aGF0J3MgYWxyZWFkeSBiZWVuIGNvbXByZXNzZWQgYW5kIGNvbXByZXNzIGl0IGFnYWluCiAgICAgICAgICAgICMgICBhbmQgc2V0IHRoZSBDb250ZW50LUVuY29kaW5nOiBnemlwIGhlYWRlcgogICAgICAgICAgICAjIEJ5IHNldHRpbmcgdGhpcyB0byByZXF1ZXN0IG9ubHkgdGhlIGlkZW50aXR5IGVuY29kaW5nIFdlJ3JlCiAgICAgICAgICAgICMgaG9waW5nIHRvIGVsaW1pbmF0ZSB0aGUgdGhpcmQgY2FzZS4gSG9wZWZ1bGx5IHRoZXJlIGRvZXMgbm90CiAgICAgICAgICAgICMgZXhpc3QgYSBzZXJ2ZXIgd2hpY2ggd2hlbiBnaXZlbiBhIGZpbGUgd2lsbCBub3RpY2UgaXQgaXMKICAgICAgICAgICAgIyBhbHJlYWR5IGNvbXByZXNzZWQgYW5kIHRoYXQgeW91J3JlIG5vdCBhc2tpbmcgZm9yIGEKICAgICAgICAgICAgIyBjb21wcmVzc2VkIGZpbGUgYW5kIHdpbGwgdGhlbiBkZWNvbXByZXNzIGl0IGJlZm9yZSBzZW5kaW5nCiAgICAgICAgICAgICMgYmVjYXVzZSBpZiB0aGF0J3MgdGhlIGNhc2UgSSBkb24ndCB0aGluayBpdCdsbCBldmVyIGJlCiAgICAgICAgICAgICMgcG9zc2libGUgdG8gbWFrZSB0aGlzIHdvcmsuCiAgICAgICAgICAgIGhlYWRlcnM9eyJBY2NlcHQtRW5jb2RpbmciOiAiaWRlbnRpdHkifSwKICAgICAgICAgICAgc3RyZWFtPVRydWUsCiAgICAgICAgKQogICAgICAgIHJlc3AucmFpc2VfZm9yX3N0YXR1cygpCiAgICBleGNlcHQgcmVxdWVzdHMuSFRUUEVycm9yIGFzIGV4YzoKICAgICAgICBsb2dnZXIuY3JpdGljYWwoCiAgICAgICAgICAgICJIVFRQIGVycm9yICVzIHdoaWxlIGdldHRpbmcgJXMiLCBleGMucmVzcG9uc2Uuc3RhdHVzX2NvZGUsIGxpbmssCiAgICAgICAgKQogICAgICAgIHJhaXNlCgogICAgY29udGVudF90eXBlID0gcmVzcC5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJywgJycpCiAgICBmaWxlbmFtZSA9IGxpbmsuZmlsZW5hbWUgICMgZmFsbGJhY2sKICAgICMgSGF2ZSBhIGxvb2sgYXQgdGhlIENvbnRlbnQtRGlzcG9zaXRpb24gaGVhZGVyIGZvciBhIGJldHRlciBndWVzcwogICAgY29udGVudF9kaXNwb3NpdGlvbiA9IHJlc3AuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKQogICAgaWYgY29udGVudF9kaXNwb3NpdGlvbjoKICAgICAgICB0eXBlLCBwYXJhbXMgPSBjZ2kucGFyc2VfaGVhZGVyKGNvbnRlbnRfZGlzcG9zaXRpb24pCiAgICAgICAgIyBXZSB1c2UgYGBvcmBgIGhlcmUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHVzZSBhbiAiZW1wdHkiIHZhbHVlCiAgICAgICAgIyBmcm9tIHRoZSBmaWxlbmFtZSBwYXJhbS4KICAgICAgICBmaWxlbmFtZSA9IHBhcmFtcy5nZXQoJ2ZpbGVuYW1lJykgb3IgZmlsZW5hbWUKICAgIGV4dCA9IHNwbGl0ZXh0KGZpbGVuYW1lKVsxXQogICAgaWYgbm90IGV4dDoKICAgICAgICBleHQgPSBtaW1ldHlwZXMuZ3Vlc3NfZXh0ZW5zaW9uKGNvbnRlbnRfdHlwZSkKICAgICAgICBpZiBleHQ6CiAgICAgICAgICAgIGZpbGVuYW1lICs9IGV4dAogICAgaWYgbm90IGV4dCBhbmQgbGluay51cmwgIT0gcmVzcC51cmw6CiAgICAgICAgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChyZXNwLnVybClbMV0KICAgICAgICBpZiBleHQ6CiAgICAgICAgICAgIGZpbGVuYW1lICs9IGV4dAogICAgZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCBmaWxlbmFtZSkKICAgIHdpdGggb3BlbihmaWxlX3BhdGgsICd3YicpIGFzIGNvbnRlbnRfZmlsZToKICAgICAgICBfZG93bmxvYWRfdXJsKHJlc3AsIGxpbmssIGNvbnRlbnRfZmlsZSwgaGFzaGVzKQogICAgcmV0dXJuIGZpbGVfcGF0aCwgY29udGVudF90eXBlCgoKZGVmIF9jaGVja19kb3dubG9hZF9kaXIobGluaywgZG93bmxvYWRfZGlyLCBoYXNoZXMpOgogICAgIiIiIENoZWNrIGRvd25sb2FkX2RpciBmb3IgcHJldmlvdXNseSBkb3dubG9hZGVkIGZpbGUgd2l0aCBjb3JyZWN0IGhhc2gKICAgICAgICBJZiBhIGNvcnJlY3QgZmlsZSBpcyBmb3VuZCByZXR1cm4gaXRzIHBhdGggZWxzZSBOb25lCiAgICAiIiIKICAgIGRvd25sb2FkX3BhdGggPSBvcy5wYXRoLmpvaW4oZG93bmxvYWRfZGlyLCBsaW5rLmZpbGVuYW1lKQogICAgaWYgb3MucGF0aC5leGlzdHMoZG93bmxvYWRfcGF0aCk6CiAgICAgICAgIyBJZiBhbHJlYWR5IGRvd25sb2FkZWQsIGRvZXMgaXRzIGhhc2ggbWF0Y2g/CiAgICAgICAgbG9nZ2VyLmluZm8oJ0ZpbGUgd2FzIGFscmVhZHkgZG93bmxvYWRlZCAlcycsIGRvd25sb2FkX3BhdGgpCiAgICAgICAgaWYgaGFzaGVzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBoYXNoZXMuY2hlY2tfYWdhaW5zdF9wYXRoKGRvd25sb2FkX3BhdGgpCiAgICAgICAgICAgIGV4Y2VwdCBIYXNoTWlzbWF0Y2g6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAnUHJldmlvdXNseS1kb3dubG9hZGVkIGZpbGUgJXMgaGFzIGJhZCBoYXNoLiAnCiAgICAgICAgICAgICAgICAgICAgJ1JlLWRvd25sb2FkaW5nLicsCiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfcGF0aAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgb3MudW5saW5rKGRvd25sb2FkX3BhdGgpCiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBkb3dubG9hZF9wYXRoCiAgICByZXR1cm4gTm9uZQpQSwMEFAAAAAAAAAAhAL56lpi5HwAAuR8AACEAAABweXBpX19waXBfOV8wXzMvcGlwL2V4Y2VwdGlvbnMucHkiIiJFeGNlcHRpb25zIHVzZWQgdGhyb3VnaG91dCBwYWNrYWdlIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgpmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4sIGdyb3VwYnksIHJlcGVhdAoKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IGl0ZXJpdGVtcwoKCmNsYXNzIFBpcEVycm9yKEV4Y2VwdGlvbik6CiAgICAiIiJCYXNlIHBpcCBleGNlcHRpb24iIiIKCgpjbGFzcyBJbnN0YWxsYXRpb25FcnJvcihQaXBFcnJvcik6CiAgICAiIiJHZW5lcmFsIGV4Y2VwdGlvbiBkdXJpbmcgaW5zdGFsbGF0aW9uIiIiCgoKY2xhc3MgVW5pbnN0YWxsYXRpb25FcnJvcihQaXBFcnJvcik6CiAgICAiIiJHZW5lcmFsIGV4Y2VwdGlvbiBkdXJpbmcgdW5pbnN0YWxsYXRpb24iIiIKCgpjbGFzcyBEaXN0cmlidXRpb25Ob3RGb3VuZChJbnN0YWxsYXRpb25FcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiBhIGRpc3RyaWJ1dGlvbiBjYW5ub3QgYmUgZm91bmQgdG8gc2F0aXNmeSBhIHJlcXVpcmVtZW50IiIiCgoKY2xhc3MgUmVxdWlyZW1lbnRzRmlsZVBhcnNlRXJyb3IoSW5zdGFsbGF0aW9uRXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gYSBnZW5lcmFsIGVycm9yIG9jY3VycyBwYXJzaW5nIGEgcmVxdWlyZW1lbnRzIGZpbGUgbGluZS4iIiIKCgpjbGFzcyBCZXN0VmVyc2lvbkFscmVhZHlJbnN0YWxsZWQoUGlwRXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gdGhlIG1vc3QgdXAtdG8tZGF0ZSB2ZXJzaW9uIG9mIGEgcGFja2FnZSBpcyBhbHJlYWR5CiAgICBpbnN0YWxsZWQuIiIiCgoKY2xhc3MgQmFkQ29tbWFuZChQaXBFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiB2aXJ0dWFsZW52IG9yIGEgY29tbWFuZCBpcyBub3QgZm91bmQiIiIKCgpjbGFzcyBDb21tYW5kRXJyb3IoUGlwRXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gY29tbWFuZC1saW5lIGFyZ3VtZW50cyIiIgoKCmNsYXNzIFByZXZpb3VzQnVpbGREaXJFcnJvcihQaXBFcnJvcik6CiAgICAiIiJSYWlzZWQgd2hlbiB0aGVyZSdzIGEgcHJldmlvdXMgY29uZmxpY3RpbmcgYnVpbGQgZGlyZWN0b3J5IiIiCgoKY2xhc3MgSW52YWxpZFdoZWVsRmlsZW5hbWUoSW5zdGFsbGF0aW9uRXJyb3IpOgogICAgIiIiSW52YWxpZCB3aGVlbCBmaWxlbmFtZS4iIiIKCgpjbGFzcyBVbnN1cHBvcnRlZFdoZWVsKEluc3RhbGxhdGlvbkVycm9yKToKICAgICIiIlVuc3VwcG9ydGVkIHdoZWVsLiIiIgoKCmNsYXNzIEhhc2hFcnJvcnMoSW5zdGFsbGF0aW9uRXJyb3IpOgogICAgIiIiTXVsdGlwbGUgSGFzaEVycm9yIGluc3RhbmNlcyByb2xsZWQgaW50byBvbmUgZm9yIHJlcG9ydGluZyIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLmVycm9ycyA9IFtdCgogICAgZGVmIGFwcGVuZChzZWxmLCBlcnJvcik6CiAgICAgICAgc2VsZi5lcnJvcnMuYXBwZW5kKGVycm9yKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIGxpbmVzID0gW10KICAgICAgICBzZWxmLmVycm9ycy5zb3J0KGtleT1sYW1iZGEgZTogZS5vcmRlcikKICAgICAgICBmb3IgY2xzLCBlcnJvcnNfb2ZfY2xzIGluIGdyb3VwYnkoc2VsZi5lcnJvcnMsIGxhbWJkYSBlOiBlLl9fY2xhc3NfXyk6CiAgICAgICAgICAgIGxpbmVzLmFwcGVuZChjbHMuaGVhZCkKICAgICAgICAgICAgbGluZXMuZXh0ZW5kKGUuYm9keSgpIGZvciBlIGluIGVycm9yc19vZl9jbHMpCiAgICAgICAgaWYgbGluZXM6CiAgICAgICAgICAgIHJldHVybiAnXG4nLmpvaW4obGluZXMpCgogICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgogICAgICAgIHJldHVybiBib29sKHNlbGYuZXJyb3JzKQoKICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fX25vbnplcm9fXygpCgoKY2xhc3MgSGFzaEVycm9yKEluc3RhbGxhdGlvbkVycm9yKToKICAgICIiIgogICAgQSBmYWlsdXJlIHRvIHZlcmlmeSBhIHBhY2thZ2UgYWdhaW5zdCBrbm93bi1nb29kIGhhc2hlcwoKICAgIDpjdmFyIG9yZGVyOiBBbiBpbnQgc29ydGluZyBoYXNoIGV4Y2VwdGlvbiBjbGFzc2VzIGJ5IGRpZmZpY3VsdHkgb2YKICAgICAgICByZWNvdmVyeSAobG93ZXIgYmVpbmcgaGFyZGVyKSwgc28gdGhlIHVzZXIgZG9lc24ndCBib3RoZXIgZnJldHRpbmcKICAgICAgICBhYm91dCB1bnBpbm5lZCBwYWNrYWdlcyB3aGVuIGhlIGhhcyBkZWVwZXIgaXNzdWVzLCBsaWtlIFZDUwogICAgICAgIGRlcGVuZGVuY2llcywgdG8gZGVhbCB3aXRoLiBBbHNvIGtlZXBzIGVycm9yIHJlcG9ydHMgaW4gYQogICAgICAgIGRldGVybWluaXN0aWMgb3JkZXIuCiAgICA6Y3ZhciBoZWFkOiBBIHNlY3Rpb24gaGVhZGluZyBmb3IgZGlzcGxheSBhYm92ZSBwb3RlbnRpYWxseSBtYW55CiAgICAgICAgZXhjZXB0aW9ucyBvZiB0aGlzIGtpbmQKICAgIDppdmFyIHJlcTogVGhlIEluc3RhbGxSZXF1aXJlbWVudCB0aGF0IHRyaWdnZXJlZCB0aGlzIGVycm9yLiBUaGlzIGlzCiAgICAgICAgcGFzdGVkIG9uIGFmdGVyIHRoZSBleGNlcHRpb24gaXMgaW5zdGFudGlhdGVkLCBiZWNhdXNlIGl0J3Mgbm90CiAgICAgICAgdHlwaWNhbGx5IGF2YWlsYWJsZSBlYXJsaWVyLgoKICAgICIiIgogICAgcmVxID0gTm9uZQogICAgaGVhZCA9ICcnCgogICAgZGVmIGJvZHkoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgc3VtbWFyeSBvZiBtZSBmb3IgZGlzcGxheSB1bmRlciB0aGUgaGVhZGluZy4KCiAgICAgICAgVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBwcmludHMgYSBkZXNjcmlwdGlvbiBvZiB0aGUKICAgICAgICB0cmlnZ2VyaW5nIHJlcXVpcmVtZW50LgoKICAgICAgICA6cGFyYW0gcmVxOiBUaGUgSW5zdGFsbFJlcXVpcmVtZW50IHRoYXQgcHJvdm9rZWQgdGhpcyBlcnJvciwgd2l0aAogICAgICAgICAgICBwb3B1bGF0ZV9saW5rKCkgaGF2aW5nIGFscmVhZHkgYmVlbiBjYWxsZWQKCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICcgICAgJXMnICUgc2VsZi5fcmVxdWlyZW1lbnRfbmFtZSgpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICclc1xuJXMnICUgKHNlbGYuaGVhZCwgc2VsZi5ib2R5KCkpCgogICAgZGVmIF9yZXF1aXJlbWVudF9uYW1lKHNlbGYpOgogICAgICAgICIiIlJldHVybiBhIGRlc2NyaXB0aW9uIG9mIHRoZSByZXF1aXJlbWVudCB0aGF0IHRyaWdnZXJlZCBtZS4KCiAgICAgICAgVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbG9uZyBkZXNjcmlwdGlvbiBvZiB0aGUgcmVxLCB3aXRoCiAgICAgICAgbGluZSBudW1iZXJzCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzdHIoc2VsZi5yZXEpIGlmIHNlbGYucmVxIGVsc2UgJ3Vua25vd24gcGFja2FnZScKCgpjbGFzcyBWY3NIYXNoVW5zdXBwb3J0ZWQoSGFzaEVycm9yKToKICAgICIiIkEgaGFzaCB3YXMgcHJvdmlkZWQgZm9yIGEgdmVyc2lvbi1jb250cm9sLXN5c3RlbS1iYXNlZCByZXF1aXJlbWVudCwgYnV0CiAgICB3ZSBkb24ndCBoYXZlIGEgbWV0aG9kIGZvciBoYXNoaW5nIHRob3NlLiIiIgoKICAgIG9yZGVyID0gMAogICAgaGVhZCA9ICgiQ2FuJ3QgdmVyaWZ5IGhhc2hlcyBmb3IgdGhlc2UgcmVxdWlyZW1lbnRzIGJlY2F1c2Ugd2UgZG9uJ3QgIgogICAgICAgICAgICAiaGF2ZSBhIHdheSB0byBoYXNoIHZlcnNpb24gY29udHJvbCByZXBvc2l0b3JpZXM6IikKCgpjbGFzcyBEaXJlY3RvcnlVcmxIYXNoVW5zdXBwb3J0ZWQoSGFzaEVycm9yKToKICAgICIiIkEgaGFzaCB3YXMgcHJvdmlkZWQgZm9yIGEgdmVyc2lvbi1jb250cm9sLXN5c3RlbS1iYXNlZCByZXF1aXJlbWVudCwgYnV0CiAgICB3ZSBkb24ndCBoYXZlIGEgbWV0aG9kIGZvciBoYXNoaW5nIHRob3NlLiIiIgoKICAgIG9yZGVyID0gMQogICAgaGVhZCA9ICgiQ2FuJ3QgdmVyaWZ5IGhhc2hlcyBmb3IgdGhlc2UgZmlsZTovLyByZXF1aXJlbWVudHMgYmVjYXVzZSB0aGV5ICIKICAgICAgICAgICAgInBvaW50IHRvIGRpcmVjdG9yaWVzOiIpCgoKY2xhc3MgSGFzaE1pc3NpbmcoSGFzaEVycm9yKToKICAgICIiIkEgaGFzaCB3YXMgbmVlZGVkIGZvciBhIHJlcXVpcmVtZW50IGJ1dCBpcyBhYnNlbnQuIiIiCgogICAgb3JkZXIgPSAyCiAgICBoZWFkID0gKCdIYXNoZXMgYXJlIHJlcXVpcmVkIGluIC0tcmVxdWlyZS1oYXNoZXMgbW9kZSwgYnV0IHRoZXkgYXJlICcKICAgICAgICAgICAgJ21pc3NpbmcgZnJvbSBzb21lIHJlcXVpcmVtZW50cy4gSGVyZSBpcyBhIGxpc3Qgb2YgdGhvc2UgJwogICAgICAgICAgICAncmVxdWlyZW1lbnRzIGFsb25nIHdpdGggdGhlIGhhc2hlcyB0aGVpciBkb3dubG9hZGVkIGFyY2hpdmVzICcKICAgICAgICAgICAgJ2FjdHVhbGx5IGhhZC4gQWRkIGxpbmVzIGxpa2UgdGhlc2UgdG8geW91ciByZXF1aXJlbWVudHMgZmlsZXMgdG8gJwogICAgICAgICAgICAncHJldmVudCB0YW1wZXJpbmcuIChJZiB5b3UgZGlkIG5vdCBlbmFibGUgLS1yZXF1aXJlLWhhc2hlcyAnCiAgICAgICAgICAgICdtYW51YWxseSwgbm90ZSB0aGF0IGl0IHR1cm5zIG9uIGF1dG9tYXRpY2FsbHkgd2hlbiBhbnkgcGFja2FnZSAnCiAgICAgICAgICAgICdoYXMgYSBoYXNoLiknKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBnb3R0ZW5faGFzaCk6CiAgICAgICAgIiIiCiAgICAgICAgOnBhcmFtIGdvdHRlbl9oYXNoOiBUaGUgaGFzaCBvZiB0aGUgKHBvc3NpYmx5IG1hbGljaW91cykgYXJjaGl2ZSB3ZQogICAgICAgICAgICBqdXN0IGRvd25sb2FkZWQKICAgICAgICAiIiIKICAgICAgICBzZWxmLmdvdHRlbl9oYXNoID0gZ290dGVuX2hhc2gKCiAgICBkZWYgYm9keShzZWxmKToKICAgICAgICBmcm9tIHBpcC51dGlscy5oYXNoZXMgaW1wb3J0IEZBVk9SSVRFX0hBU0ggICMgRG9kZ2UgY2lyY3VsYXIgaW1wb3J0LgoKICAgICAgICBwYWNrYWdlID0gTm9uZQogICAgICAgIGlmIHNlbGYucmVxOgogICAgICAgICAgICAjIEluIHRoZSBjYXNlIG9mIFVSTC1iYXNlZCByZXF1aXJlbWVudHMsIGRpc3BsYXkgdGhlIG9yaWdpbmFsIFVSTAogICAgICAgICAgICAjIHNlZW4gaW4gdGhlIHJlcXVpcmVtZW50cyBmaWxlIHJhdGhlciB0aGFuIHRoZSBwYWNrYWdlIG5hbWUsCiAgICAgICAgICAgICMgc28gdGhlIG91dHB1dCBjYW4gYmUgZGlyZWN0bHkgY29waWVkIGludG8gdGhlIHJlcXVpcmVtZW50cyBmaWxlLgogICAgICAgICAgICBwYWNrYWdlID0gKHNlbGYucmVxLm9yaWdpbmFsX2xpbmsgaWYgc2VsZi5yZXEub3JpZ2luYWxfbGluawogICAgICAgICAgICAgICAgICAgICAgICMgSW4gY2FzZSBzb21lb25lIGZlZWRzIHNvbWV0aGluZyBkb3ducmlnaHQgc3R1cGlkCiAgICAgICAgICAgICAgICAgICAgICAgIyB0byBJbnN0YWxsUmVxdWlyZW1lbnQncyBjb25zdHJ1Y3Rvci4KICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGdldGF0dHIoc2VsZi5yZXEsICdyZXEnLCBOb25lKSkKICAgICAgICByZXR1cm4gJyAgICAlcyAtLWhhc2g9JXM6JXMnICUgKHBhY2thZ2Ugb3IgJ3Vua25vd24gcGFja2FnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVZPUklURV9IQVNILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nb3R0ZW5faGFzaCkKCgpjbGFzcyBIYXNoVW5waW5uZWQoSGFzaEVycm9yKToKICAgICIiIkEgcmVxdWlyZW1lbnQgaGFkIGEgaGFzaCBzcGVjaWZpZWQgYnV0IHdhcyBub3QgcGlubmVkIHRvIGEgc3BlY2lmaWMKICAgIHZlcnNpb24uIiIiCgogICAgb3JkZXIgPSAzCiAgICBoZWFkID0gKCdJbiAtLXJlcXVpcmUtaGFzaGVzIG1vZGUsIGFsbCByZXF1aXJlbWVudHMgbXVzdCBoYXZlIHRoZWlyICcKICAgICAgICAgICAgJ3ZlcnNpb25zIHBpbm5lZCB3aXRoID09LiBUaGVzZSBkbyBub3Q6JykKCgpjbGFzcyBIYXNoTWlzbWF0Y2goSGFzaEVycm9yKToKICAgICIiIgogICAgRGlzdHJpYnV0aW9uIGZpbGUgaGFzaCB2YWx1ZXMgZG9uJ3QgbWF0Y2guCgogICAgOml2YXIgcGFja2FnZV9uYW1lOiBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0aGF0IHRyaWdnZXJlZCB0aGUgaGFzaAogICAgICAgIG1pc21hdGNoLiBGZWVsIGZyZWUgdG8gd3JpdGUgdG8gdGhpcyBhZnRlciB0aGUgZXhjZXB0aW9uIGlzIHJhaXNlIHRvCiAgICAgICAgaW1wcm92ZSBpdHMgZXJyb3IgbWVzc2FnZS4KCiAgICAiIiIKICAgIG9yZGVyID0gNAogICAgaGVhZCA9ICgnVEhFU0UgUEFDS0FHRVMgRE8gTk9UIE1BVENIIFRIRSBIQVNIRVMgRlJPTSBUSEUgUkVRVUlSRU1FTlRTICcKICAgICAgICAgICAgJ0ZJTEUuIElmIHlvdSBoYXZlIHVwZGF0ZWQgdGhlIHBhY2thZ2UgdmVyc2lvbnMsIHBsZWFzZSB1cGRhdGUgJwogICAgICAgICAgICAndGhlIGhhc2hlcy4gT3RoZXJ3aXNlLCBleGFtaW5lIHRoZSBwYWNrYWdlIGNvbnRlbnRzIGNhcmVmdWxseTsgJwogICAgICAgICAgICAnc29tZW9uZSBtYXkgaGF2ZSB0YW1wZXJlZCB3aXRoIHRoZW0uJykKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYWxsb3dlZCwgZ290cyk6CiAgICAgICAgIiIiCiAgICAgICAgOnBhcmFtIGFsbG93ZWQ6IEEgZGljdCBvZiBhbGdvcml0aG0gbmFtZXMgcG9pbnRpbmcgdG8gbGlzdHMgb2YgYWxsb3dlZAogICAgICAgICAgICBoZXggZGlnZXN0cwogICAgICAgIDpwYXJhbSBnb3RzOiBBIGRpY3Qgb2YgYWxnb3JpdGhtIG5hbWVzIHBvaW50aW5nIHRvIGhhc2hlcyB3ZQogICAgICAgICAgICBhY3R1YWxseSBnb3QgZnJvbSB0aGUgZmlsZXMgdW5kZXIgc3VzcGljaW9uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5hbGxvd2VkID0gYWxsb3dlZAogICAgICAgIHNlbGYuZ290cyA9IGdvdHMKCiAgICBkZWYgYm9keShzZWxmKToKICAgICAgICByZXR1cm4gJyAgICAlczpcbiVzJyAlIChzZWxmLl9yZXF1aXJlbWVudF9uYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFzaF9jb21wYXJpc29uKCkpCgogICAgZGVmIF9oYXNoX2NvbXBhcmlzb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgY29tcGFyaXNvbiBvZiBhY3R1YWwgYW5kIGV4cGVjdGVkIGhhc2ggdmFsdWVzLgoKICAgICAgICBFeGFtcGxlOjoKCiAgICAgICAgICAgICAgIEV4cGVjdGVkIHNoYTI1NiBhYmNkZWFiY2RlYWJjZGVhYmNkZWFiY2RlYWJjZGVhYmNkZWFiY2RlYWJjZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIDEyMzQ1MTIzNDUxMjM0NTEyMzQ1MTIzNDUxMjM0NTEyMzQ1MTIzNDUxMjM0NQogICAgICAgICAgICAgICAgICAgIEdvdCAgICAgICAgYmNkZWZiY2RlZmJjZGVmYmNkZWZiY2RlZmJjZGVmYmNkZWZiY2RlZmJjZGVmCgogICAgICAgICIiIgogICAgICAgIGRlZiBoYXNoX3RoZW5fb3IoaGFzaF9uYW1lKToKICAgICAgICAgICAgIyBGb3Igbm93LCBhbGwgdGhlIGRlY2VudCBoYXNoZXMgaGF2ZSA2LWNoYXIgbmFtZXMsIHNvIHdlIGNhbiBnZXQKICAgICAgICAgICAgIyBhd2F5IHdpdGggaGFyZC1jb2Rpbmcgc3BhY2UgbGl0ZXJhbHMuCiAgICAgICAgICAgIHJldHVybiBjaGFpbihbaGFzaF9uYW1lXSwgcmVwZWF0KCcgICAgb3InKSkKCiAgICAgICAgbGluZXMgPSBbXQogICAgICAgIGZvciBoYXNoX25hbWUsIGV4cGVjdGVkcyBpbiBpdGVyaXRlbXMoc2VsZi5hbGxvd2VkKToKICAgICAgICAgICAgcHJlZml4ID0gaGFzaF90aGVuX29yKGhhc2hfbmFtZSkKICAgICAgICAgICAgbGluZXMuZXh0ZW5kKCgnICAgICAgICBFeHBlY3RlZCAlcyAlcycgJSAobmV4dChwcmVmaXgpLCBlKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBlIGluIGV4cGVjdGVkcykKICAgICAgICAgICAgbGluZXMuYXBwZW5kKCcgICAgICAgICAgICAgR290ICAgICAgICAlc1xuJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdvdHNbaGFzaF9uYW1lXS5oZXhkaWdlc3QoKSkKICAgICAgICAgICAgcHJlZml4ID0gJyAgICBvcicKICAgICAgICByZXR1cm4gJ1xuJy5qb2luKGxpbmVzKQoKCmNsYXNzIFVuc3VwcG9ydGVkUHl0aG9uVmVyc2lvbihJbnN0YWxsYXRpb25FcnJvcik6CiAgICAiIiJVbnN1cHBvcnRlZCBweXRob24gdmVyc2lvbiBhY2NvcmRpbmcgdG8gUmVxdWlyZXMtUHl0aG9uIHBhY2thZ2UKICAgIG1ldGFkYXRhLiIiIgpQSwMEFAAAAAAAAAAhADb4Jf8OnAAADpwAABwAAABweXBpX19waXBfOV8wXzMvcGlwL2luZGV4LnB5IiIiUm91dGluZXMgcmVsYXRlZCB0byBQeVBJLCBpbmRleGVzIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgY2dpCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgc3lzCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IG1pbWV0eXBlcwppbXBvcnQgcG9zaXhwYXRoCmltcG9ydCB3YXJuaW5ncwoKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMudXJsbGliIGltcG9ydCBwYXJzZSBhcyB1cmxsaWJfcGFyc2UKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMudXJsbGliIGltcG9ydCByZXF1ZXN0IGFzIHVybGxpYl9yZXF1ZXN0Cgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IGlwYWRkcmVzcwpmcm9tIHBpcC51dGlscyBpbXBvcnQgKAogICAgY2FjaGVkX3Byb3BlcnR5LCBzcGxpdGV4dCwgbm9ybWFsaXplX3BhdGgsCiAgICBBUkNISVZFX0VYVEVOU0lPTlMsIFNVUFBPUlRFRF9FWFRFTlNJT05TLAopCmZyb20gcGlwLnV0aWxzLmRlcHJlY2F0aW9uIGltcG9ydCBSZW1vdmVkSW5QaXAxMFdhcm5pbmcKZnJvbSBwaXAudXRpbHMubG9nZ2luZyBpbXBvcnQgaW5kZW50X2xvZwpmcm9tIHBpcC51dGlscy5wYWNrYWdpbmcgaW1wb3J0IGNoZWNrX3JlcXVpcmVzX3B5dGhvbgpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBEaXN0cmlidXRpb25Ob3RGb3VuZCwgQmVzdFZlcnNpb25BbHJlYWR5SW5zdGFsbGVkLCBJbnZhbGlkV2hlZWxGaWxlbmFtZSwKICAgIFVuc3VwcG9ydGVkV2hlZWwsCikKZnJvbSBwaXAuZG93bmxvYWQgaW1wb3J0IEhBU19UTFMsIGlzX3VybCwgcGF0aF90b191cmwsIHVybF90b19wYXRoCmZyb20gcGlwLndoZWVsIGltcG9ydCBXaGVlbCwgd2hlZWxfZXh0CmZyb20gcGlwLnBlcDQyNXRhZ3MgaW1wb3J0IGdldF9zdXBwb3J0ZWQKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgaHRtbDVsaWIsIHJlcXVlc3RzLCBzaXgKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcudmVyc2lvbiBpbXBvcnQgcGFyc2UgYXMgcGFyc2VfdmVyc2lvbgpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZy51dGlscyBpbXBvcnQgY2Fub25pY2FsaXplX25hbWUKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcgaW1wb3J0IHNwZWNpZmllcnMKZnJvbSBwaXAuX3ZlbmRvci5yZXF1ZXN0cy5leGNlcHRpb25zIGltcG9ydCBTU0xFcnJvcgpmcm9tIHBpcC5fdmVuZG9yLmRpc3RsaWIuY29tcGF0IGltcG9ydCB1bmVzY2FwZQoKCl9fYWxsX18gPSBbJ0Zvcm1hdENvbnRyb2wnLCAnZm10X2N0bF9oYW5kbGVfbXV0dWFsX2V4Y2x1ZGUnLCAnUGFja2FnZUZpbmRlciddCgoKU0VDVVJFX09SSUdJTlMgPSBbCiAgICAjIHByb3RvY29sLCBob3N0bmFtZSwgcG9ydAogICAgIyBUYWtlbiBmcm9tIENocm9tZSdzIGxpc3Qgb2Ygc2VjdXJlIG9yaWdpbnMgKFNlZTogaHR0cDovL2JpdC5seS8xcXJ5U0tDKQogICAgKCJodHRwcyIsICIqIiwgIioiKSwKICAgICgiKiIsICJsb2NhbGhvc3QiLCAiKiIpLAogICAgKCIqIiwgIjEyNy4wLjAuMC84IiwgIioiKSwKICAgICgiKiIsICI6OjEvMTI4IiwgIioiKSwKICAgICgiZmlsZSIsICIqIiwgTm9uZSksCiAgICAjIHNzaCBpcyBhbHdheXMgc2VjdXJlLgogICAgKCJzc2giLCAiKiIsICIqIiksCl0KCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBJbnN0YWxsYXRpb25DYW5kaWRhdGUob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvamVjdCwgdmVyc2lvbiwgbG9jYXRpb24pOgogICAgICAgIHNlbGYucHJvamVjdCA9IHByb2plY3QKICAgICAgICBzZWxmLnZlcnNpb24gPSBwYXJzZV92ZXJzaW9uKHZlcnNpb24pCiAgICAgICAgc2VsZi5sb2NhdGlvbiA9IGxvY2F0aW9uCiAgICAgICAgc2VsZi5fa2V5ID0gKHNlbGYucHJvamVjdCwgc2VsZi52ZXJzaW9uLCBzZWxmLmxvY2F0aW9uKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxJbnN0YWxsYXRpb25DYW5kaWRhdGUoezAhcn0sIHsxIXJ9LCB7MiFyfSk+Ii5mb3JtYXQoCiAgICAgICAgICAgIHNlbGYucHJvamVjdCwgc2VsZi52ZXJzaW9uLCBzZWxmLmxvY2F0aW9uLAogICAgICAgICkKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fa2V5KQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA8IG8pCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzIDw9IG8pCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzID09IG8pCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzID49IG8pCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzID4gbykKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgIT0gbykKCiAgICBkZWYgX2NvbXBhcmUoc2VsZiwgb3RoZXIsIG1ldGhvZCk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIEluc3RhbGxhdGlvbkNhbmRpZGF0ZSk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gbWV0aG9kKHNlbGYuX2tleSwgb3RoZXIuX2tleSkKCgpjbGFzcyBQYWNrYWdlRmluZGVyKG9iamVjdCk6CiAgICAiIiJUaGlzIGZpbmRzIHBhY2thZ2VzLgoKICAgIFRoaXMgaXMgbWVhbnQgdG8gbWF0Y2ggZWFzeV9pbnN0YWxsJ3MgdGVjaG5pcXVlIGZvciBsb29raW5nIGZvcgogICAgcGFja2FnZXMsIGJ5IHJlYWRpbmcgcGFnZXMgYW5kIGxvb2tpbmcgZm9yIGFwcHJvcHJpYXRlIGxpbmtzLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbmRfbGlua3MsIGluZGV4X3VybHMsIGFsbG93X2FsbF9wcmVyZWxlYXNlcz1GYWxzZSwKICAgICAgICAgICAgICAgICB0cnVzdGVkX2hvc3RzPU5vbmUsIHByb2Nlc3NfZGVwZW5kZW5jeV9saW5rcz1GYWxzZSwKICAgICAgICAgICAgICAgICBzZXNzaW9uPU5vbmUsIGZvcm1hdF9jb250cm9sPU5vbmUsIHBsYXRmb3JtPU5vbmUsCiAgICAgICAgICAgICAgICAgdmVyc2lvbnM9Tm9uZSwgYWJpPU5vbmUsIGltcGxlbWVudGF0aW9uPU5vbmUpOgogICAgICAgICIiIkNyZWF0ZSBhIFBhY2thZ2VGaW5kZXIuCgogICAgICAgIDpwYXJhbSBmb3JtYXRfY29udHJvbDogQSBGb3JtYXRDb250cm9sIG9iamVjdCBvciBOb25lLiBVc2VkIHRvIGNvbnRyb2wKICAgICAgICAgICAgdGhlIHNlbGVjdGlvbiBvZiBzb3VyY2UgcGFja2FnZXMgLyBiaW5hcnkgcGFja2FnZXMgd2hlbiBjb25zdWx0aW5nCiAgICAgICAgICAgIHRoZSBpbmRleCBhbmQgbGlua3MuCiAgICAgICAgOnBhcmFtIHBsYXRmb3JtOiBBIHN0cmluZyBvciBOb25lLiBJZiBOb25lLCBzZWFyY2hlcyBmb3IgcGFja2FnZXMKICAgICAgICAgICAgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IHN5c3RlbS4gT3RoZXJ3aXNlLCB3aWxsIGZpbmQKICAgICAgICAgICAgcGFja2FnZXMgdGhhdCBjYW4gYmUgYnVpbHQgb24gdGhlIHBsYXRmb3JtIHBhc3NlZCBpbi4gVGhlc2UKICAgICAgICAgICAgcGFja2FnZXMgd2lsbCBvbmx5IGJlIGRvd25sb2FkZWQgZm9yIGRpc3RyaWJ1dGlvbjogdGhleSB3aWxsCiAgICAgICAgICAgIG5vdCBiZSBidWlsdCBsb2NhbGx5LgogICAgICAgIDpwYXJhbSB2ZXJzaW9uczogQSBsaXN0IG9mIHN0cmluZ3Mgb3IgTm9uZS4gVGhpcyBpcyBwYXNzZWQgZGlyZWN0bHkKICAgICAgICAgICAgdG8gcGVwNDI1dGFncy5weSBpbiB0aGUgZ2V0X3N1cHBvcnRlZCgpIG1ldGhvZC4KICAgICAgICA6cGFyYW0gYWJpOiBBIHN0cmluZyBvciBOb25lLiBUaGlzIGlzIHBhc3NlZCBkaXJlY3RseQogICAgICAgICAgICB0byBwZXA0MjV0YWdzLnB5IGluIHRoZSBnZXRfc3VwcG9ydGVkKCkgbWV0aG9kLgogICAgICAgIDpwYXJhbSBpbXBsZW1lbnRhdGlvbjogQSBzdHJpbmcgb3IgTm9uZS4gVGhpcyBpcyBwYXNzZWQgZGlyZWN0bHkKICAgICAgICAgICAgdG8gcGVwNDI1dGFncy5weSBpbiB0aGUgZ2V0X3N1cHBvcnRlZCgpIG1ldGhvZC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZXNzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgICAgICJQYWNrYWdlRmluZGVyKCkgbWlzc2luZyAxIHJlcXVpcmVkIGtleXdvcmQgYXJndW1lbnQ6ICIKICAgICAgICAgICAgICAgICInc2Vzc2lvbiciCiAgICAgICAgICAgICkKCiAgICAgICAgIyBCdWlsZCBmaW5kX2xpbmtzLiBJZiBhbiBhcmd1bWVudCBzdGFydHMgd2l0aCB+LCBpdCBtYXkgYmUKICAgICAgICAjIGEgbG9jYWwgZmlsZSByZWxhdGl2ZSB0byBhIGhvbWUgZGlyZWN0b3J5LiBTbyB0cnkgbm9ybWFsaXppbmcKICAgICAgICAjIGl0IGFuZCBpZiBpdCBleGlzdHMsIHVzZSB0aGUgbm9ybWFsaXplZCB2ZXJzaW9uLgogICAgICAgICMgVGhpcyBpcyBkZWxpYmVyYXRlbHkgY29uc2VydmF0aXZlIC0gaXQgbWlnaHQgYmUgZmluZSBqdXN0IHRvCiAgICAgICAgIyBibGluZGx5IG5vcm1hbGl6ZSBhbnl0aGluZyBzdGFydGluZyB3aXRoIGEgfi4uLgogICAgICAgIHNlbGYuZmluZF9saW5rcyA9IFtdCiAgICAgICAgZm9yIGxpbmsgaW4gZmluZF9saW5rczoKICAgICAgICAgICAgaWYgbGluay5zdGFydHN3aXRoKCd+Jyk6CiAgICAgICAgICAgICAgICBuZXdfbGluayA9IG5vcm1hbGl6ZV9wYXRoKGxpbmspCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhuZXdfbGluayk6CiAgICAgICAgICAgICAgICAgICAgbGluayA9IG5ld19saW5rCiAgICAgICAgICAgIHNlbGYuZmluZF9saW5rcy5hcHBlbmQobGluaykKCiAgICAgICAgc2VsZi5pbmRleF91cmxzID0gaW5kZXhfdXJscwogICAgICAgIHNlbGYuZGVwZW5kZW5jeV9saW5rcyA9IFtdCgogICAgICAgICMgVGhlc2UgYXJlIGJvcmluZyBsaW5rcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGxvZ2dlZCBzb21laG93OgogICAgICAgIHNlbGYubG9nZ2VkX2xpbmtzID0gc2V0KCkKCiAgICAgICAgc2VsZi5mb3JtYXRfY29udHJvbCA9IGZvcm1hdF9jb250cm9sIG9yIEZvcm1hdENvbnRyb2woc2V0KCksIHNldCgpKQoKICAgICAgICAjIERvbWFpbnMgdGhhdCB3ZSB3b24ndCBlbWl0IHdhcm5pbmdzIGZvciB3aGVuIG5vdCB1c2luZyBIVFRQUwogICAgICAgIHNlbGYuc2VjdXJlX29yaWdpbnMgPSBbCiAgICAgICAgICAgICgiKiIsIGhvc3QsICIqIikKICAgICAgICAgICAgZm9yIGhvc3QgaW4gKHRydXN0ZWRfaG9zdHMgaWYgdHJ1c3RlZF9ob3N0cyBlbHNlIFtdKQogICAgICAgIF0KCiAgICAgICAgIyBEbyB3ZSB3YW50IHRvIGFsbG93IF9hbGxfIHByZS1yZWxlYXNlcz8KICAgICAgICBzZWxmLmFsbG93X2FsbF9wcmVyZWxlYXNlcyA9IGFsbG93X2FsbF9wcmVyZWxlYXNlcwoKICAgICAgICAjIERvIHdlIHByb2Nlc3MgZGVwZW5kZW5jeSBsaW5rcz8KICAgICAgICBzZWxmLnByb2Nlc3NfZGVwZW5kZW5jeV9saW5rcyA9IHByb2Nlc3NfZGVwZW5kZW5jeV9saW5rcwoKICAgICAgICAjIFRoZSBTZXNzaW9uIHdlJ2xsIHVzZSB0byBtYWtlIHJlcXVlc3RzCiAgICAgICAgc2VsZi5zZXNzaW9uID0gc2Vzc2lvbgoKICAgICAgICAjIFRoZSB2YWxpZCB0YWdzIHRvIGNoZWNrIHBvdGVudGlhbCBmb3VuZCB3aGVlbCBjYW5kaWRhdGVzIGFnYWluc3QKICAgICAgICBzZWxmLnZhbGlkX3RhZ3MgPSBnZXRfc3VwcG9ydGVkKAogICAgICAgICAgICB2ZXJzaW9ucz12ZXJzaW9ucywKICAgICAgICAgICAgcGxhdGZvcm09cGxhdGZvcm0sCiAgICAgICAgICAgIGFiaT1hYmksCiAgICAgICAgICAgIGltcGw9aW1wbGVtZW50YXRpb24sCiAgICAgICAgKQoKICAgICAgICAjIElmIHdlIGRvbid0IGhhdmUgVExTIGVuYWJsZWQsIHRoZW4gV0FSTiBpZiBhbnlwbGFjZSB3ZSdyZSBsb29raW5nCiAgICAgICAgIyByZWxpZXMgb24gVExTLgogICAgICAgIGlmIG5vdCBIQVNfVExTOgogICAgICAgICAgICBmb3IgbGluayBpbiBpdGVydG9vbHMuY2hhaW4oc2VsZi5pbmRleF91cmxzLCBzZWxmLmZpbmRfbGlua3MpOgogICAgICAgICAgICAgICAgcGFyc2VkID0gdXJsbGliX3BhcnNlLnVybHBhcnNlKGxpbmspCiAgICAgICAgICAgICAgICBpZiBwYXJzZWQuc2NoZW1lID09ICJodHRwcyI6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICJwaXAgaXMgY29uZmlndXJlZCB3aXRoIGxvY2F0aW9ucyB0aGF0IHJlcXVpcmUgIgogICAgICAgICAgICAgICAgICAgICAgICAiVExTL1NTTCwgaG93ZXZlciB0aGUgc3NsIG1vZHVsZSBpbiBQeXRob24gaXMgbm90ICIKICAgICAgICAgICAgICAgICAgICAgICAgImF2YWlsYWJsZS4iCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgZGVmIGFkZF9kZXBlbmRlbmN5X2xpbmtzKHNlbGYsIGxpbmtzKToKICAgICAgICAjICMgRklYTUU6IHRoaXMgc2hvdWxkbid0IGJlIGdsb2JhbCBsaXN0IHRoaXMsIGl0IHNob3VsZCBvbmx5CiAgICAgICAgIyAjIGFwcGx5IHRvIHJlcXVpcmVtZW50cyBvZiB0aGUgcGFja2FnZSB0aGF0IHNwZWNpZmllcyB0aGUKICAgICAgICAjICMgZGVwZW5kZW5jeV9saW5rcyB2YWx1ZQogICAgICAgICMgIyBGSVhNRTogYWxzbywgd2Ugc2hvdWxkIHRyYWNrIGNvbWVzX2Zyb20gKGkuZS4sIHVzZSBMaW5rKQogICAgICAgIGlmIHNlbGYucHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIkRlcGVuZGVuY3kgTGlua3MgcHJvY2Vzc2luZyBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlICIKICAgICAgICAgICAgICAgICJyZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLmRlcGVuZGVuY3lfbGlua3MuZXh0ZW5kKGxpbmtzKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfc29ydF9sb2NhdGlvbnMobG9jYXRpb25zLCBleHBhbmRfZGlyPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBTb3J0IGxvY2F0aW9ucyBpbnRvICJmaWxlcyIgKGFyY2hpdmVzKSBhbmQgInVybHMiLCBhbmQgcmV0dXJuCiAgICAgICAgYSBwYWlyIG9mIGxpc3RzIChmaWxlcyx1cmxzKQogICAgICAgICIiIgogICAgICAgIGZpbGVzID0gW10KICAgICAgICB1cmxzID0gW10KCiAgICAgICAgIyBwdXRzIHRoZSB1cmwgZm9yIHRoZSBnaXZlbiBmaWxlIHBhdGggaW50byB0aGUgYXBwcm9wcmlhdGUgbGlzdAogICAgICAgIGRlZiBzb3J0X3BhdGgocGF0aCk6CiAgICAgICAgICAgIHVybCA9IHBhdGhfdG9fdXJsKHBhdGgpCiAgICAgICAgICAgIGlmIG1pbWV0eXBlcy5ndWVzc190eXBlKHVybCwgc3RyaWN0PUZhbHNlKVswXSA9PSAndGV4dC9odG1sJzoKICAgICAgICAgICAgICAgIHVybHMuYXBwZW5kKHVybCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZpbGVzLmFwcGVuZCh1cmwpCgogICAgICAgIGZvciB1cmwgaW4gbG9jYXRpb25zOgoKICAgICAgICAgICAgaXNfbG9jYWxfcGF0aCA9IG9zLnBhdGguZXhpc3RzKHVybCkKICAgICAgICAgICAgaXNfZmlsZV91cmwgPSB1cmwuc3RhcnRzd2l0aCgnZmlsZTonKQoKICAgICAgICAgICAgaWYgaXNfbG9jYWxfcGF0aCBvciBpc19maWxlX3VybDoKICAgICAgICAgICAgICAgIGlmIGlzX2xvY2FsX3BhdGg6CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHVybAogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBwYXRoID0gdXJsX3RvX3BhdGgodXJsKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKToKICAgICAgICAgICAgICAgICAgICBpZiBleHBhbmRfZGlyOgogICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5yZWFscGF0aChwYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBvcy5saXN0ZGlyKHBhdGgpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydF9wYXRoKG9zLnBhdGguam9pbihwYXRoLCBpdGVtKSkKICAgICAgICAgICAgICAgICAgICBlbGlmIGlzX2ZpbGVfdXJsOgogICAgICAgICAgICAgICAgICAgICAgICB1cmxzLmFwcGVuZCh1cmwpCiAgICAgICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgogICAgICAgICAgICAgICAgICAgIHNvcnRfcGF0aChwYXRoKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIlVybCAnJXMnIGlzIGlnbm9yZWQ6IGl0IGlzIG5laXRoZXIgYSBmaWxlICIKICAgICAgICAgICAgICAgICAgICAgICAgIm5vciBhIGRpcmVjdG9yeS4iLCB1cmwpCiAgICAgICAgICAgIGVsaWYgaXNfdXJsKHVybCk6CiAgICAgICAgICAgICAgICAjIE9ubHkgYWRkIHVybCB3aXRoIGNsZWFyIHNjaGVtZQogICAgICAgICAgICAgICAgdXJscy5hcHBlbmQodXJsKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgIlVybCAnJXMnIGlzIGlnbm9yZWQuIEl0IGlzIGVpdGhlciBhIG5vbi1leGlzdGluZyAiCiAgICAgICAgICAgICAgICAgICAgInBhdGggb3IgbGFja3MgYSBzcGVjaWZpYyBzY2hlbWUuIiwgdXJsKQoKICAgICAgICByZXR1cm4gZmlsZXMsIHVybHMKCiAgICBkZWYgX2NhbmRpZGF0ZV9zb3J0X2tleShzZWxmLCBjYW5kaWRhdGUpOgogICAgICAgICIiIgogICAgICAgIEZ1bmN0aW9uIHVzZWQgdG8gZ2VuZXJhdGUgbGluayBzb3J0IGtleSBmb3IgbGluayB0dXBsZXMuCiAgICAgICAgVGhlIGdyZWF0ZXIgdGhlIHJldHVybiB2YWx1ZSwgdGhlIG1vcmUgcHJlZmVycmVkIGl0IGlzLgogICAgICAgIElmIG5vdCBmaW5kaW5nIHdoZWVscywgdGhlbiBzb3J0ZWQgYnkgdmVyc2lvbiBvbmx5LgogICAgICAgIElmIGZpbmRpbmcgd2hlZWxzLCB0aGVuIHRoZSBzb3J0IG9yZGVyIGlzIGJ5IHZlcnNpb24sIHRoZW46CiAgICAgICAgICAxLiBleGlzdGluZyBpbnN0YWxscwogICAgICAgICAgMi4gd2hlZWxzIG9yZGVyZWQgdmlhIFdoZWVsLnN1cHBvcnRfaW5kZXhfbWluKHNlbGYudmFsaWRfdGFncykKICAgICAgICAgIDMuIHNvdXJjZSBhcmNoaXZlcwogICAgICAgIE5vdGU6IGl0IHdhcyBjb25zaWRlcmVkIHRvIGVtYmVkIHRoaXMgbG9naWMgaW50byB0aGUgTGluawogICAgICAgICAgICAgIGNvbXBhcmlzb24gb3BlcmF0b3JzLCBidXQgdGhlbiBkaWZmZXJlbnQgc2Rpc3QgbGlua3MKICAgICAgICAgICAgICB3aXRoIHRoZSBzYW1lIHZlcnNpb24sIHdvdWxkIGhhdmUgdG8gYmUgY29uc2lkZXJlZCBlcXVhbAogICAgICAgICIiIgogICAgICAgIHN1cHBvcnRfbnVtID0gbGVuKHNlbGYudmFsaWRfdGFncykKICAgICAgICBpZiBjYW5kaWRhdGUubG9jYXRpb24uaXNfd2hlZWw6CiAgICAgICAgICAgICMgY2FuIHJhaXNlIEludmFsaWRXaGVlbEZpbGVuYW1lCiAgICAgICAgICAgIHdoZWVsID0gV2hlZWwoY2FuZGlkYXRlLmxvY2F0aW9uLmZpbGVuYW1lKQogICAgICAgICAgICBpZiBub3Qgd2hlZWwuc3VwcG9ydGVkKHNlbGYudmFsaWRfdGFncyk6CiAgICAgICAgICAgICAgICByYWlzZSBVbnN1cHBvcnRlZFdoZWVsKAogICAgICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdXBwb3J0ZWQgd2hlZWwgZm9yIHRoaXMgcGxhdGZvcm0uIEl0ICIKICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgYmUgc29ydGVkLiIgJSB3aGVlbC5maWxlbmFtZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBwcmkgPSAtKHdoZWVsLnN1cHBvcnRfaW5kZXhfbWluKHNlbGYudmFsaWRfdGFncykpCiAgICAgICAgZWxzZTogICMgc2Rpc3QKICAgICAgICAgICAgcHJpID0gLShzdXBwb3J0X251bSkKICAgICAgICByZXR1cm4gKGNhbmRpZGF0ZS52ZXJzaW9uLCBwcmkpCgogICAgZGVmIF92YWxpZGF0ZV9zZWN1cmVfb3JpZ2luKHNlbGYsIGxvZ2dlciwgbG9jYXRpb24pOgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHRoaXMgdXJsIHVzZWQgYSBzZWN1cmUgdHJhbnNwb3J0IG1lY2hhbmlzbQogICAgICAgIHBhcnNlZCA9IHVybGxpYl9wYXJzZS51cmxwYXJzZShzdHIobG9jYXRpb24pKQogICAgICAgIG9yaWdpbiA9IChwYXJzZWQuc2NoZW1lLCBwYXJzZWQuaG9zdG5hbWUsIHBhcnNlZC5wb3J0KQoKICAgICAgICAjIFRoZSBwcm90b2NvbCB0byB1c2UgdG8gc2VlIGlmIHRoZSBwcm90b2NvbCBtYXRjaGVzLgogICAgICAgICMgRG9uJ3QgY291bnQgdGhlIHJlcG9zaXRvcnkgdHlwZSBhcyBwYXJ0IG9mIHRoZSBwcm90b2NvbDogaW4KICAgICAgICAjIGNhc2VzIHN1Y2ggYXMgImdpdCtzc2giLCBvbmx5IHVzZSAic3NoIi4gKEkuZS4sIE9ubHkgdmVyaWZ5IGFnYWluc3QKICAgICAgICAjIHRoZSBsYXN0IHNjaGVtZS4pCiAgICAgICAgcHJvdG9jb2wgPSBvcmlnaW5bMF0ucnNwbGl0KCcrJywgMSlbLTFdCgogICAgICAgICMgRGV0ZXJtaW5lIGlmIG91ciBvcmlnaW4gaXMgYSBzZWN1cmUgb3JpZ2luIGJ5IGxvb2tpbmcgdGhyb3VnaCBvdXIKICAgICAgICAjIGhhcmRjb2RlZCBsaXN0IG9mIHNlY3VyZSBvcmlnaW5zLCBhcyB3ZWxsIGFzIGFueSBhZGRpdGlvbmFsIG9uZXMKICAgICAgICAjIGNvbmZpZ3VyZWQgb24gdGhpcyBQYWNrYWdlRmluZGVyIGluc3RhbmNlLgogICAgICAgIGZvciBzZWN1cmVfb3JpZ2luIGluIChTRUNVUkVfT1JJR0lOUyArIHNlbGYuc2VjdXJlX29yaWdpbnMpOgogICAgICAgICAgICBpZiBwcm90b2NvbCAhPSBzZWN1cmVfb3JpZ2luWzBdIGFuZCBzZWN1cmVfb3JpZ2luWzBdICE9ICIqIjoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAjIFdlIG5lZWQgdG8gZG8gdGhpcyBkZWNvZGUgZGFuY2UgdG8gZW5zdXJlIHRoYXQgd2UgaGF2ZSBhCiAgICAgICAgICAgICAgICAjIHVuaWNvZGUgb2JqZWN0LCBldmVuIG9uIFB5dGhvbiAyLnguCiAgICAgICAgICAgICAgICBhZGRyID0gaXBhZGRyZXNzLmlwX2FkZHJlc3MoCiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWzFdCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKG9yaWdpblsxXSwgc2l4LnRleHRfdHlwZSkgb3IKICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luWzFdIGlzIE5vbmUKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgZWxzZSBvcmlnaW5bMV0uZGVjb2RlKCJ1dGY4IikKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIG5ldHdvcmsgPSBpcGFkZHJlc3MuaXBfbmV0d29yaygKICAgICAgICAgICAgICAgICAgICBzZWN1cmVfb3JpZ2luWzFdCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWN1cmVfb3JpZ2luWzFdLCBzaXgudGV4dF90eXBlKQogICAgICAgICAgICAgICAgICAgIGVsc2Ugc2VjdXJlX29yaWdpblsxXS5kZWNvZGUoInV0ZjgiKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICMgV2UgZG9uJ3QgaGF2ZSBib3RoIGEgdmFsaWQgYWRkcmVzcyBvciBhIHZhbGlkIG5ldHdvcmssIHNvCiAgICAgICAgICAgICAgICAjIHdlJ2xsIGNoZWNrIHRoaXMgb3JpZ2luIGFnYWluc3QgaG9zdG5hbWVzLgogICAgICAgICAgICAgICAgaWYgKG9yaWdpblsxXSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luWzFdLmxvd2VyKCkgIT0gc2VjdXJlX29yaWdpblsxXS5sb3dlcigpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBzZWN1cmVfb3JpZ2luWzFdICE9ICIqIik6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgV2UgaGF2ZSBhIHZhbGlkIGFkZHJlc3MgYW5kIG5ldHdvcmssIHNvIHNlZSBpZiB0aGUgYWRkcmVzcwogICAgICAgICAgICAgICAgIyBpcyBjb250YWluZWQgd2l0aGluIHRoZSBuZXR3b3JrLgogICAgICAgICAgICAgICAgaWYgYWRkciBub3QgaW4gbmV0d29yazoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHBvcnQgcGF0Y2hlcwogICAgICAgICAgICBpZiAob3JpZ2luWzJdICE9IHNlY3VyZV9vcmlnaW5bMl0gYW5kCiAgICAgICAgICAgICAgICAgICAgc2VjdXJlX29yaWdpblsyXSAhPSAiKiIgYW5kCiAgICAgICAgICAgICAgICAgICAgc2VjdXJlX29yaWdpblsyXSBpcyBub3QgTm9uZSk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgIyBJZiB3ZSd2ZSBnb3R0ZW4gaGVyZSwgdGhlbiB0aGlzIG9yaWdpbiBtYXRjaGVzIHRoZSBjdXJyZW50CiAgICAgICAgICAgICMgc2VjdXJlIG9yaWdpbiBhbmQgd2Ugc2hvdWxkIHJldHVybiBUcnVlCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgICMgSWYgd2UndmUgZ290dGVuIHRvIHRoaXMgcG9pbnQsIHRoZW4gdGhlIG9yaWdpbiBpc24ndCBzZWN1cmUgYW5kIHdlCiAgICAgICAgIyB3aWxsIG5vdCBhY2NlcHQgaXQgYXMgYSB2YWxpZCBsb2NhdGlvbiB0byBzZWFyY2guIFdlIHdpbGwgaG93ZXZlcgogICAgICAgICMgbG9nIGEgd2FybmluZyB0aGF0IHdlIGFyZSBpZ25vcmluZyBpdC4KICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgIlRoZSByZXBvc2l0b3J5IGxvY2F0ZWQgYXQgJXMgaXMgbm90IGEgdHJ1c3RlZCBvciBzZWN1cmUgaG9zdCBhbmQgIgogICAgICAgICAgICAiaXMgYmVpbmcgaWdub3JlZC4gSWYgdGhpcyByZXBvc2l0b3J5IGlzIGF2YWlsYWJsZSB2aWEgSFRUUFMgaXQgIgogICAgICAgICAgICAiaXMgcmVjb21tZW5kZWQgdG8gdXNlIEhUVFBTIGluc3RlYWQsIG90aGVyd2lzZSB5b3UgbWF5IHNpbGVuY2UgIgogICAgICAgICAgICAidGhpcyB3YXJuaW5nIGFuZCBhbGxvdyBpdCBhbnl3YXlzIHdpdGggJy0tdHJ1c3RlZC1ob3N0ICVzJy4iLAogICAgICAgICAgICBwYXJzZWQuaG9zdG5hbWUsCiAgICAgICAgICAgIHBhcnNlZC5ob3N0bmFtZSwKICAgICAgICApCgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfZ2V0X2luZGV4X3VybHNfbG9jYXRpb25zKHNlbGYsIHByb2plY3RfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJucyB0aGUgbG9jYXRpb25zIGZvdW5kIHZpYSBzZWxmLmluZGV4X3VybHMKCiAgICAgICAgQ2hlY2tzIHRoZSB1cmxfbmFtZSBvbiB0aGUgbWFpbiAoZmlyc3QgaW4gdGhlIGxpc3QpIGluZGV4IGFuZAogICAgICAgIHVzZSB0aGlzIHVybF9uYW1lIHRvIHByb2R1Y2UgYWxsIGxvY2F0aW9ucwogICAgICAgICIiIgoKICAgICAgICBkZWYgbWt1cmxfcHlwaV91cmwodXJsKToKICAgICAgICAgICAgbG9jID0gcG9zaXhwYXRoLmpvaW4oCiAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICAgICB1cmxsaWJfcGFyc2UucXVvdGUoY2Fub25pY2FsaXplX25hbWUocHJvamVjdF9uYW1lKSkpCiAgICAgICAgICAgICMgRm9yIG1heGltdW0gY29tcGF0aWJpbGl0eSB3aXRoIGVhc3lfaW5zdGFsbCwgZW5zdXJlIHRoZSBwYXRoCiAgICAgICAgICAgICMgZW5kcyBpbiBhIHRyYWlsaW5nIHNsYXNoLiAgQWx0aG91Z2ggdGhpcyBpc24ndCBpbiB0aGUgc3BlYwogICAgICAgICAgICAjIChhbmQgUHlQSSBjYW4gaGFuZGxlIGl0IHdpdGhvdXQgdGhlIHNsYXNoKSBzb21lIG90aGVyIGluZGV4CiAgICAgICAgICAgICMgaW1wbGVtZW50YXRpb25zIG1pZ2h0IGJyZWFrIGlmIHRoZXkgcmVsaWVkIG9uIGVhc3lfaW5zdGFsbCdzCiAgICAgICAgICAgICMgYmVoYXZpb3IuCiAgICAgICAgICAgIGlmIG5vdCBsb2MuZW5kc3dpdGgoJy8nKToKICAgICAgICAgICAgICAgIGxvYyA9IGxvYyArICcvJwogICAgICAgICAgICByZXR1cm4gbG9jCgogICAgICAgIHJldHVybiBbbWt1cmxfcHlwaV91cmwodXJsKSBmb3IgdXJsIGluIHNlbGYuaW5kZXhfdXJsc10KCiAgICBkZWYgZmluZF9hbGxfY2FuZGlkYXRlcyhzZWxmLCBwcm9qZWN0X25hbWUpOgogICAgICAgICIiIkZpbmQgYWxsIGF2YWlsYWJsZSBJbnN0YWxsYXRpb25DYW5kaWRhdGUgZm9yIHByb2plY3RfbmFtZQoKICAgICAgICBUaGlzIGNoZWNrcyBpbmRleF91cmxzLCBmaW5kX2xpbmtzIGFuZCBkZXBlbmRlbmN5X2xpbmtzLgogICAgICAgIEFsbCB2ZXJzaW9ucyBmb3VuZCBhcmUgcmV0dXJuZWQgYXMgYW4gSW5zdGFsbGF0aW9uQ2FuZGlkYXRlIGxpc3QuCgogICAgICAgIFNlZSBfbGlua19wYWNrYWdlX3ZlcnNpb25zIGZvciBkZXRhaWxzIG9uIHdoaWNoIGZpbGVzIGFyZSBhY2NlcHRlZAogICAgICAgICIiIgogICAgICAgIGluZGV4X2xvY2F0aW9ucyA9IHNlbGYuX2dldF9pbmRleF91cmxzX2xvY2F0aW9ucyhwcm9qZWN0X25hbWUpCiAgICAgICAgaW5kZXhfZmlsZV9sb2MsIGluZGV4X3VybF9sb2MgPSBzZWxmLl9zb3J0X2xvY2F0aW9ucyhpbmRleF9sb2NhdGlvbnMpCiAgICAgICAgZmxfZmlsZV9sb2MsIGZsX3VybF9sb2MgPSBzZWxmLl9zb3J0X2xvY2F0aW9ucygKICAgICAgICAgICAgc2VsZi5maW5kX2xpbmtzLCBleHBhbmRfZGlyPVRydWUpCiAgICAgICAgZGVwX2ZpbGVfbG9jLCBkZXBfdXJsX2xvYyA9IHNlbGYuX3NvcnRfbG9jYXRpb25zKHNlbGYuZGVwZW5kZW5jeV9saW5rcykKCiAgICAgICAgZmlsZV9sb2NhdGlvbnMgPSAoCiAgICAgICAgICAgIExpbmsodXJsKSBmb3IgdXJsIGluIGl0ZXJ0b29scy5jaGFpbigKICAgICAgICAgICAgICAgIGluZGV4X2ZpbGVfbG9jLCBmbF9maWxlX2xvYywgZGVwX2ZpbGVfbG9jKQogICAgICAgICkKCiAgICAgICAgIyBXZSB0cnVzdCBldmVyeSB1cmwgdGhhdCB0aGUgdXNlciBoYXMgZ2l2ZW4gdXMgd2hldGhlciBpdCB3YXMgZ2l2ZW4KICAgICAgICAjICAgdmlhIC0taW5kZXgtdXJsIG9yIC0tZmluZC1saW5rcwogICAgICAgICMgV2UgZXhwbGljaXRseSBkbyBub3QgdHJ1c3QgbGlua3MgdGhhdCBjYW1lIGZyb20gZGVwZW5kZW5jeV9saW5rcwogICAgICAgICMgV2Ugd2FudCB0byBmaWx0ZXIgb3V0IGFueSB0aGluZyB3aGljaCBkb2VzIG5vdCBoYXZlIGEgc2VjdXJlIG9yaWdpbi4KICAgICAgICB1cmxfbG9jYXRpb25zID0gWwogICAgICAgICAgICBsaW5rIGZvciBsaW5rIGluIGl0ZXJ0b29scy5jaGFpbigKICAgICAgICAgICAgICAgIChMaW5rKHVybCkgZm9yIHVybCBpbiBpbmRleF91cmxfbG9jKSwKICAgICAgICAgICAgICAgIChMaW5rKHVybCkgZm9yIHVybCBpbiBmbF91cmxfbG9jKSwKICAgICAgICAgICAgICAgIChMaW5rKHVybCkgZm9yIHVybCBpbiBkZXBfdXJsX2xvYyksCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgc2VsZi5fdmFsaWRhdGVfc2VjdXJlX29yaWdpbihsb2dnZXIsIGxpbmspCiAgICAgICAgXQoKICAgICAgICBsb2dnZXIuZGVidWcoJyVkIGxvY2F0aW9uKHMpIHRvIHNlYXJjaCBmb3IgdmVyc2lvbnMgb2YgJXM6JywKICAgICAgICAgICAgICAgICAgICAgbGVuKHVybF9sb2NhdGlvbnMpLCBwcm9qZWN0X25hbWUpCgogICAgICAgIGZvciBsb2NhdGlvbiBpbiB1cmxfbG9jYXRpb25zOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJyogJXMnLCBsb2NhdGlvbikKCiAgICAgICAgY2Fub25pY2FsX25hbWUgPSBjYW5vbmljYWxpemVfbmFtZShwcm9qZWN0X25hbWUpCiAgICAgICAgZm9ybWF0cyA9IGZtdF9jdGxfZm9ybWF0cyhzZWxmLmZvcm1hdF9jb250cm9sLCBjYW5vbmljYWxfbmFtZSkKICAgICAgICBzZWFyY2ggPSBTZWFyY2gocHJvamVjdF9uYW1lLCBjYW5vbmljYWxfbmFtZSwgZm9ybWF0cykKICAgICAgICBmaW5kX2xpbmtzX3ZlcnNpb25zID0gc2VsZi5fcGFja2FnZV92ZXJzaW9ucygKICAgICAgICAgICAgIyBXZSB0cnVzdCBldmVyeSBkaXJlY3RseSBsaW5rZWQgYXJjaGl2ZSBpbiBmaW5kX2xpbmtzCiAgICAgICAgICAgIChMaW5rKHVybCwgJy1mJykgZm9yIHVybCBpbiBzZWxmLmZpbmRfbGlua3MpLAogICAgICAgICAgICBzZWFyY2gKICAgICAgICApCgogICAgICAgIHBhZ2VfdmVyc2lvbnMgPSBbXQogICAgICAgIGZvciBwYWdlIGluIHNlbGYuX2dldF9wYWdlcyh1cmxfbG9jYXRpb25zLCBwcm9qZWN0X25hbWUpOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0FuYWx5emluZyBsaW5rcyBmcm9tIHBhZ2UgJXMnLCBwYWdlLnVybCkKICAgICAgICAgICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgICAgICAgICBwYWdlX3ZlcnNpb25zLmV4dGVuZCgKICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYWNrYWdlX3ZlcnNpb25zKHBhZ2UubGlua3MsIHNlYXJjaCkKICAgICAgICAgICAgICAgICkKCiAgICAgICAgZGVwZW5kZW5jeV92ZXJzaW9ucyA9IHNlbGYuX3BhY2thZ2VfdmVyc2lvbnMoCiAgICAgICAgICAgIChMaW5rKHVybCkgZm9yIHVybCBpbiBzZWxmLmRlcGVuZGVuY3lfbGlua3MpLCBzZWFyY2gKICAgICAgICApCiAgICAgICAgaWYgZGVwZW5kZW5jeV92ZXJzaW9uczoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgJ2RlcGVuZGVuY3lfbGlua3MgZm91bmQ6ICVzJywKICAgICAgICAgICAgICAgICcsICcuam9pbihbCiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi5sb2NhdGlvbi51cmwgZm9yIHZlcnNpb24gaW4gZGVwZW5kZW5jeV92ZXJzaW9ucwogICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgKQoKICAgICAgICBmaWxlX3ZlcnNpb25zID0gc2VsZi5fcGFja2FnZV92ZXJzaW9ucyhmaWxlX2xvY2F0aW9ucywgc2VhcmNoKQogICAgICAgIGlmIGZpbGVfdmVyc2lvbnM6CiAgICAgICAgICAgIGZpbGVfdmVyc2lvbnMuc29ydChyZXZlcnNlPVRydWUpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICdMb2NhbCBmaWxlcyBmb3VuZDogJXMnLAogICAgICAgICAgICAgICAgJywgJy5qb2luKFsKICAgICAgICAgICAgICAgICAgICB1cmxfdG9fcGF0aChjYW5kaWRhdGUubG9jYXRpb24udXJsKQogICAgICAgICAgICAgICAgICAgIGZvciBjYW5kaWRhdGUgaW4gZmlsZV92ZXJzaW9ucwogICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgKQoKICAgICAgICAjIFRoaXMgaXMgYW4gaW50ZW50aW9uYWwgcHJpb3JpdHkgb3JkZXJpbmcKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBmaWxlX3ZlcnNpb25zICsgZmluZF9saW5rc192ZXJzaW9ucyArIHBhZ2VfdmVyc2lvbnMgKwogICAgICAgICAgICBkZXBlbmRlbmN5X3ZlcnNpb25zCiAgICAgICAgKQoKICAgIGRlZiBmaW5kX3JlcXVpcmVtZW50KHNlbGYsIHJlcSwgdXBncmFkZSk6CiAgICAgICAgIiIiVHJ5IHRvIGZpbmQgYSBMaW5rIG1hdGNoaW5nIHJlcQoKICAgICAgICBFeHBlY3RzIHJlcSwgYW4gSW5zdGFsbFJlcXVpcmVtZW50IGFuZCB1cGdyYWRlLCBhIGJvb2xlYW4KICAgICAgICBSZXR1cm5zIGEgTGluayBpZiBmb3VuZCwKICAgICAgICBSYWlzZXMgRGlzdHJpYnV0aW9uTm90Rm91bmQgb3IgQmVzdFZlcnNpb25BbHJlYWR5SW5zdGFsbGVkIG90aGVyd2lzZQogICAgICAgICIiIgogICAgICAgIGFsbF9jYW5kaWRhdGVzID0gc2VsZi5maW5kX2FsbF9jYW5kaWRhdGVzKHJlcS5uYW1lKQoKICAgICAgICAjIEZpbHRlciBvdXQgYW55dGhpbmcgd2hpY2ggZG9lc24ndCBtYXRjaCBvdXIgc3BlY2lmaWVyCiAgICAgICAgY29tcGF0aWJsZV92ZXJzaW9ucyA9IHNldCgKICAgICAgICAgICAgcmVxLnNwZWNpZmllci5maWx0ZXIoCiAgICAgICAgICAgICAgICAjIFdlIHR1cm4gdGhlIHZlcnNpb24gb2JqZWN0IGludG8gYSBzdHIgaGVyZSBiZWNhdXNlIG90aGVyd2lzZQogICAgICAgICAgICAgICAgIyB3aGVuIHdlJ3JlIGRlYnVuZGxlZCBidXQgc2V0dXB0b29scyBpc24ndCwgUHl0aG9uIHdpbGwgc2VlCiAgICAgICAgICAgICAgICAjIHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24gYW5kCiAgICAgICAgICAgICAgICAjIHBrZ19yZXNvdXJjZXMuX3ZlbmRvci5wYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uIGFzIGRpZmZlcmVudAogICAgICAgICAgICAgICAgIyB0eXBlcy4gVGhpcyB3YXkgd2UnbGwgdXNlIGEgc3RyIGFzIGEgY29tbW9uIGRhdGEgaW50ZXJjaGFuZ2UKICAgICAgICAgICAgICAgICMgZm9ybWF0LiBJZiB3ZSBzdG9wIHVzaW5nIHRoZSBwa2dfcmVzb3VyY2VzIHByb3ZpZGVkIHNwZWNpZmllcgogICAgICAgICAgICAgICAgIyBhbmQgc3RhcnQgdXNpbmcgb3VyIG93biwgd2UgY2FuIGRyb3AgdGhlIGNhc3QgdG8gc3RyKCkuCiAgICAgICAgICAgICAgICBbc3RyKGMudmVyc2lvbikgZm9yIGMgaW4gYWxsX2NhbmRpZGF0ZXNdLAogICAgICAgICAgICAgICAgcHJlcmVsZWFzZXM9KAogICAgICAgICAgICAgICAgICAgIHNlbGYuYWxsb3dfYWxsX3ByZXJlbGVhc2VzCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5hbGxvd19hbGxfcHJlcmVsZWFzZXMgZWxzZSBOb25lCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgIGFwcGxpY2FibGVfY2FuZGlkYXRlcyA9IFsKICAgICAgICAgICAgIyBBZ2FpbiwgY29udmVydGluZyB0byBzdHIgdG8gZGVhbCB3aXRoIGRlYnVuZGxpbmcuCiAgICAgICAgICAgIGMgZm9yIGMgaW4gYWxsX2NhbmRpZGF0ZXMgaWYgc3RyKGMudmVyc2lvbikgaW4gY29tcGF0aWJsZV92ZXJzaW9ucwogICAgICAgIF0KCiAgICAgICAgaWYgYXBwbGljYWJsZV9jYW5kaWRhdGVzOgogICAgICAgICAgICBiZXN0X2NhbmRpZGF0ZSA9IG1heChhcHBsaWNhYmxlX2NhbmRpZGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT1zZWxmLl9jYW5kaWRhdGVfc29ydF9rZXkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYmVzdF9jYW5kaWRhdGUgPSBOb25lCgogICAgICAgIGlmIHJlcS5zYXRpc2ZpZWRfYnkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGluc3RhbGxlZF92ZXJzaW9uID0gcGFyc2VfdmVyc2lvbihyZXEuc2F0aXNmaWVkX2J5LnZlcnNpb24pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaW5zdGFsbGVkX3ZlcnNpb24gPSBOb25lCgogICAgICAgIGlmIGluc3RhbGxlZF92ZXJzaW9uIGlzIE5vbmUgYW5kIGJlc3RfY2FuZGlkYXRlIGlzIE5vbmU6CiAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbCgKICAgICAgICAgICAgICAgICdDb3VsZCBub3QgZmluZCBhIHZlcnNpb24gdGhhdCBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50ICVzICcKICAgICAgICAgICAgICAgICcoZnJvbSB2ZXJzaW9uczogJXMpJywKICAgICAgICAgICAgICAgIHJlcSwKICAgICAgICAgICAgICAgICcsICcuam9pbigKICAgICAgICAgICAgICAgICAgICBzb3J0ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgIHNldChzdHIoYy52ZXJzaW9uKSBmb3IgYyBpbiBhbGxfY2FuZGlkYXRlcyksCiAgICAgICAgICAgICAgICAgICAgICAgIGtleT1wYXJzZV92ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmFpc2UgRGlzdHJpYnV0aW9uTm90Rm91bmQoCiAgICAgICAgICAgICAgICAnTm8gbWF0Y2hpbmcgZGlzdHJpYnV0aW9uIGZvdW5kIGZvciAlcycgJSByZXEKICAgICAgICAgICAgKQoKICAgICAgICBiZXN0X2luc3RhbGxlZCA9IEZhbHNlCiAgICAgICAgaWYgaW5zdGFsbGVkX3ZlcnNpb24gYW5kICgKICAgICAgICAgICAgICAgIGJlc3RfY2FuZGlkYXRlIGlzIE5vbmUgb3IKICAgICAgICAgICAgICAgIGJlc3RfY2FuZGlkYXRlLnZlcnNpb24gPD0gaW5zdGFsbGVkX3ZlcnNpb24pOgogICAgICAgICAgICBiZXN0X2luc3RhbGxlZCA9IFRydWUKCiAgICAgICAgaWYgbm90IHVwZ3JhZGUgYW5kIGluc3RhbGxlZF92ZXJzaW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBiZXN0X2luc3RhbGxlZDoKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAnRXhpc3RpbmcgaW5zdGFsbGVkIHZlcnNpb24gKCVzKSBpcyBtb3N0IHVwLXRvLWRhdGUgYW5kICcKICAgICAgICAgICAgICAgICAgICAnc2F0aXNmaWVzIHJlcXVpcmVtZW50JywKICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWRfdmVyc2lvbiwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAnRXhpc3RpbmcgaW5zdGFsbGVkIHZlcnNpb24gKCVzKSBzYXRpc2ZpZXMgcmVxdWlyZW1lbnQgJwogICAgICAgICAgICAgICAgICAgICcobW9zdCB1cC10by1kYXRlIHZlcnNpb24gaXMgJXMpJywKICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWRfdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICBiZXN0X2NhbmRpZGF0ZS52ZXJzaW9uLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBpZiBiZXN0X2luc3RhbGxlZDoKICAgICAgICAgICAgIyBXZSBoYXZlIGFuIGV4aXN0aW5nIHZlcnNpb24sIGFuZCBpdHMgdGhlIGJlc3QgdmVyc2lvbgogICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAnSW5zdGFsbGVkIHZlcnNpb24gKCVzKSBpcyBtb3N0IHVwLXRvLWRhdGUgKHBhc3QgdmVyc2lvbnM6ICcKICAgICAgICAgICAgICAgICclcyknLAogICAgICAgICAgICAgICAgaW5zdGFsbGVkX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAnLCAnLmpvaW4oc29ydGVkKGNvbXBhdGlibGVfdmVyc2lvbnMsIGtleT1wYXJzZV92ZXJzaW9uKSkgb3IKICAgICAgICAgICAgICAgICJub25lIiwKICAgICAgICAgICAgKQogICAgICAgICAgICByYWlzZSBCZXN0VmVyc2lvbkFscmVhZHlJbnN0YWxsZWQKCiAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAnVXNpbmcgdmVyc2lvbiAlcyAobmV3ZXN0IG9mIHZlcnNpb25zOiAlcyknLAogICAgICAgICAgICBiZXN0X2NhbmRpZGF0ZS52ZXJzaW9uLAogICAgICAgICAgICAnLCAnLmpvaW4oc29ydGVkKGNvbXBhdGlibGVfdmVyc2lvbnMsIGtleT1wYXJzZV92ZXJzaW9uKSkKICAgICAgICApCiAgICAgICAgcmV0dXJuIGJlc3RfY2FuZGlkYXRlLmxvY2F0aW9uCgogICAgZGVmIF9nZXRfcGFnZXMoc2VsZiwgbG9jYXRpb25zLCBwcm9qZWN0X25hbWUpOgogICAgICAgICIiIgogICAgICAgIFlpZWxkcyAocGFnZSwgcGFnZV91cmwpIGZyb20gdGhlIGdpdmVuIGxvY2F0aW9ucywgc2tpcHBpbmcKICAgICAgICBsb2NhdGlvbnMgdGhhdCBoYXZlIGVycm9ycy4KICAgICAgICAiIiIKICAgICAgICBzZWVuID0gc2V0KCkKICAgICAgICBmb3IgbG9jYXRpb24gaW4gbG9jYXRpb25zOgogICAgICAgICAgICBpZiBsb2NhdGlvbiBpbiBzZWVuOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgc2Vlbi5hZGQobG9jYXRpb24pCgogICAgICAgICAgICBwYWdlID0gc2VsZi5fZ2V0X3BhZ2UobG9jYXRpb24pCiAgICAgICAgICAgIGlmIHBhZ2UgaXMgTm9uZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICB5aWVsZCBwYWdlCgogICAgX3B5X3ZlcnNpb25fcmUgPSByZS5jb21waWxlKHInLXB5KFsxMjNdXC4/WzAtOV0/KSQnKQoKICAgIGRlZiBfc29ydF9saW5rcyhzZWxmLCBsaW5rcyk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBlbGVtZW50cyBvZiBsaW5rcyBpbiBvcmRlciwgbm9uLWVnZyBsaW5rcyBmaXJzdCwgZWdnIGxpbmtzCiAgICAgICAgc2Vjb25kLCB3aGlsZSBlbGltaW5hdGluZyBkdXBsaWNhdGVzCiAgICAgICAgIiIiCiAgICAgICAgZWdncywgbm9fZWdncyA9IFtdLCBbXQogICAgICAgIHNlZW4gPSBzZXQoKQogICAgICAgIGZvciBsaW5rIGluIGxpbmtzOgogICAgICAgICAgICBpZiBsaW5rIG5vdCBpbiBzZWVuOgogICAgICAgICAgICAgICAgc2Vlbi5hZGQobGluaykKICAgICAgICAgICAgICAgIGlmIGxpbmsuZWdnX2ZyYWdtZW50OgogICAgICAgICAgICAgICAgICAgIGVnZ3MuYXBwZW5kKGxpbmspCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5vX2VnZ3MuYXBwZW5kKGxpbmspCiAgICAgICAgcmV0dXJuIG5vX2VnZ3MgKyBlZ2dzCgogICAgZGVmIF9wYWNrYWdlX3ZlcnNpb25zKHNlbGYsIGxpbmtzLCBzZWFyY2gpOgogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgZm9yIGxpbmsgaW4gc2VsZi5fc29ydF9saW5rcyhsaW5rcyk6CiAgICAgICAgICAgIHYgPSBzZWxmLl9saW5rX3BhY2thZ2VfdmVyc2lvbnMobGluaywgc2VhcmNoKQogICAgICAgICAgICBpZiB2IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh2KQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX2xvZ19za2lwcGVkX2xpbmsoc2VsZiwgbGluaywgcmVhc29uKToKICAgICAgICBpZiBsaW5rIG5vdCBpbiBzZWxmLmxvZ2dlZF9saW5rczoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTa2lwcGluZyBsaW5rICVzOyAlcycsIGxpbmssIHJlYXNvbikKICAgICAgICAgICAgc2VsZi5sb2dnZWRfbGlua3MuYWRkKGxpbmspCgogICAgZGVmIF9saW5rX3BhY2thZ2VfdmVyc2lvbnMoc2VsZiwgbGluaywgc2VhcmNoKToKICAgICAgICAiIiJSZXR1cm4gYW4gSW5zdGFsbGF0aW9uQ2FuZGlkYXRlIG9yIE5vbmUiIiIKICAgICAgICB2ZXJzaW9uID0gTm9uZQogICAgICAgIGlmIGxpbmsuZWdnX2ZyYWdtZW50OgogICAgICAgICAgICBlZ2dfaW5mbyA9IGxpbmsuZWdnX2ZyYWdtZW50CiAgICAgICAgICAgIGV4dCA9IGxpbmsuZXh0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgZWdnX2luZm8sIGV4dCA9IGxpbmsuc3BsaXRleHQoKQogICAgICAgICAgICBpZiBub3QgZXh0OgogICAgICAgICAgICAgICAgc2VsZi5fbG9nX3NraXBwZWRfbGluayhsaW5rLCAnbm90IGEgZmlsZScpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgaWYgZXh0IG5vdCBpbiBTVVBQT1JURURfRVhURU5TSU9OUzoKICAgICAgICAgICAgICAgIHNlbGYuX2xvZ19za2lwcGVkX2xpbmsoCiAgICAgICAgICAgICAgICAgICAgbGluaywgJ3Vuc3VwcG9ydGVkIGFyY2hpdmUgZm9ybWF0OiAlcycgJSBleHQpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgaWYgImJpbmFyeSIgbm90IGluIHNlYXJjaC5mb3JtYXRzIGFuZCBleHQgPT0gd2hlZWxfZXh0OgogICAgICAgICAgICAgICAgc2VsZi5fbG9nX3NraXBwZWRfbGluaygKICAgICAgICAgICAgICAgICAgICBsaW5rLCAnTm8gYmluYXJpZXMgcGVybWl0dGVkIGZvciAlcycgJSBzZWFyY2guc3VwcGxpZWQpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgaWYgIm1hY29zeDEwIiBpbiBsaW5rLnBhdGggYW5kIGV4dCA9PSAnLnppcCc6CiAgICAgICAgICAgICAgICBzZWxmLl9sb2dfc2tpcHBlZF9saW5rKGxpbmssICdtYWNvc3gxMCBvbmUnKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGlmIGV4dCA9PSB3aGVlbF9leHQ6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgd2hlZWwgPSBXaGVlbChsaW5rLmZpbGVuYW1lKQogICAgICAgICAgICAgICAgZXhjZXB0IEludmFsaWRXaGVlbEZpbGVuYW1lOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZ19za2lwcGVkX2xpbmsobGluaywgJ2ludmFsaWQgd2hlZWwgZmlsZW5hbWUnKQogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgaWYgY2Fub25pY2FsaXplX25hbWUod2hlZWwubmFtZSkgIT0gc2VhcmNoLmNhbm9uaWNhbDoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2dfc2tpcHBlZF9saW5rKAogICAgICAgICAgICAgICAgICAgICAgICBsaW5rLCAnd3JvbmcgcHJvamVjdCBuYW1lIChub3QgJXMpJyAlIHNlYXJjaC5zdXBwbGllZCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgICAgICBpZiBub3Qgd2hlZWwuc3VwcG9ydGVkKHNlbGYudmFsaWRfdGFncyk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9nX3NraXBwZWRfbGluaygKICAgICAgICAgICAgICAgICAgICAgICAgbGluaywgJ2l0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyBQeXRob24nKQogICAgICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgICAgIHZlcnNpb24gPSB3aGVlbC52ZXJzaW9uCgogICAgICAgICMgVGhpcyBzaG91bGQgYmUgdXAgYnkgdGhlIHNlYXJjaC5va19iaW5hcnkgY2hlY2ssIGJ1dCBzZWUgaXNzdWUgMjcwMC4KICAgICAgICBpZiAic291cmNlIiBub3QgaW4gc2VhcmNoLmZvcm1hdHMgYW5kIGV4dCAhPSB3aGVlbF9leHQ6CiAgICAgICAgICAgIHNlbGYuX2xvZ19za2lwcGVkX2xpbmsoCiAgICAgICAgICAgICAgICBsaW5rLCAnTm8gc291cmNlcyBwZXJtaXR0ZWQgZm9yICVzJyAlIHNlYXJjaC5zdXBwbGllZCkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIG5vdCB2ZXJzaW9uOgogICAgICAgICAgICB2ZXJzaW9uID0gZWdnX2luZm9fbWF0Y2hlcyhlZ2dfaW5mbywgc2VhcmNoLnN1cHBsaWVkLCBsaW5rKQogICAgICAgIGlmIHZlcnNpb24gaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5fbG9nX3NraXBwZWRfbGluaygKICAgICAgICAgICAgICAgIGxpbmssICd3cm9uZyBwcm9qZWN0IG5hbWUgKG5vdCAlcyknICUgc2VhcmNoLnN1cHBsaWVkKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgbWF0Y2ggPSBzZWxmLl9weV92ZXJzaW9uX3JlLnNlYXJjaCh2ZXJzaW9uKQogICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbls6bWF0Y2guc3RhcnQoKV0KICAgICAgICAgICAgcHlfdmVyc2lvbiA9IG1hdGNoLmdyb3VwKDEpCiAgICAgICAgICAgIGlmIHB5X3ZlcnNpb24gIT0gc3lzLnZlcnNpb25bOjNdOgogICAgICAgICAgICAgICAgc2VsZi5fbG9nX3NraXBwZWRfbGluaygKICAgICAgICAgICAgICAgICAgICBsaW5rLCAnUHl0aG9uIHZlcnNpb24gaXMgaW5jb3JyZWN0JykKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgIHRyeToKICAgICAgICAgICAgc3VwcG9ydF90aGlzX3B5dGhvbiA9IGNoZWNrX3JlcXVpcmVzX3B5dGhvbihsaW5rLnJlcXVpcmVzX3B5dGhvbikKICAgICAgICBleGNlcHQgc3BlY2lmaWVycy5JbnZhbGlkU3BlY2lmaWVyOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoIlBhY2thZ2UgJXMgaGFzIGFuIGludmFsaWQgUmVxdWlyZXMtUHl0aG9uIGVudHJ5OiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLmZpbGVuYW1lLCBsaW5rLnJlcXVpcmVzX3B5dGhvbikKICAgICAgICAgICAgc3VwcG9ydF90aGlzX3B5dGhvbiA9IFRydWUKCiAgICAgICAgaWYgbm90IHN1cHBvcnRfdGhpc19weXRob246CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiVGhlIHBhY2thZ2UgJXMgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIHB5dGhvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIGluIHVzZS4gQWNjZXB0YWJsZSBweXRob24gdmVyc2lvbnMgYXJlOiVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmssIGxpbmsucmVxdWlyZXNfcHl0aG9uKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kIGxpbmsgJXMsIHZlcnNpb246ICVzJywgbGluaywgdmVyc2lvbikKCiAgICAgICAgcmV0dXJuIEluc3RhbGxhdGlvbkNhbmRpZGF0ZShzZWFyY2guc3VwcGxpZWQsIHZlcnNpb24sIGxpbmspCgogICAgZGVmIF9nZXRfcGFnZShzZWxmLCBsaW5rKToKICAgICAgICByZXR1cm4gSFRNTFBhZ2UuZ2V0X3BhZ2UobGluaywgc2Vzc2lvbj1zZWxmLnNlc3Npb24pCgoKZGVmIGVnZ19pbmZvX21hdGNoZXMoCiAgICAgICAgZWdnX2luZm8sIHNlYXJjaF9uYW1lLCBsaW5rLAogICAgICAgIF9lZ2dfaW5mb19yZT1yZS5jb21waWxlKHInKFthLXowLTlfLl0rKS0oW2EtejAtOV8uISstXSspJywgcmUuSSkpOgogICAgIiIiUHVsbCB0aGUgdmVyc2lvbiBwYXJ0IG91dCBvZiBhIHN0cmluZy4KCiAgICA6cGFyYW0gZWdnX2luZm86IFRoZSBzdHJpbmcgdG8gcGFyc2UuIEUuZy4gZm9vLTIuMQogICAgOnBhcmFtIHNlYXJjaF9uYW1lOiBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0aGlzIGJlbG9uZ3MgdG8uIE5vbmUgdG8KICAgICAgICBpbmZlciB0aGUgbmFtZS4gTm90ZSB0aGF0IHRoaXMgY2Fubm90IHVuYW1iaWd1b3VzbHkgcGFyc2Ugc3RyaW5ncwogICAgICAgIGxpa2UgZm9vLTItMiB3aGljaCBtaWdodCBiZSBmb28sIDItMiBvciBmb28tMiwgMi4KICAgIDpwYXJhbSBsaW5rOiBUaGUgbGluayB0aGUgc3RyaW5nIGNhbWUgZnJvbSwgZm9yIGxvZ2dpbmcgb24gZmFpbHVyZS4KICAgICIiIgogICAgbWF0Y2ggPSBfZWdnX2luZm9fcmUuc2VhcmNoKGVnZ19pbmZvKQogICAgaWYgbm90IG1hdGNoOgogICAgICAgIGxvZ2dlci5kZWJ1ZygnQ291bGQgbm90IHBhcnNlIHZlcnNpb24gZnJvbSBsaW5rOiAlcycsIGxpbmspCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGlmIHNlYXJjaF9uYW1lIGlzIE5vbmU6CiAgICAgICAgZnVsbF9tYXRjaCA9IG1hdGNoLmdyb3VwKDApCiAgICAgICAgcmV0dXJuIGZ1bGxfbWF0Y2hbZnVsbF9tYXRjaC5pbmRleCgnLScpOl0KICAgIG5hbWUgPSBtYXRjaC5ncm91cCgwKS5sb3dlcigpCiAgICAjIFRvIG1hdGNoIHRoZSAic2FmZSIgbmFtZSB0aGF0IHBrZ19yZXNvdXJjZXMgY3JlYXRlczoKICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJ18nLCAnLScpCiAgICAjIHByb2plY3QgbmFtZSBhbmQgdmVyc2lvbiBtdXN0IGJlIHNlcGFyYXRlZCBieSBhIGRhc2gKICAgIGxvb2tfZm9yID0gc2VhcmNoX25hbWUubG93ZXIoKSArICItIgogICAgaWYgbmFtZS5zdGFydHN3aXRoKGxvb2tfZm9yKToKICAgICAgICByZXR1cm4gbWF0Y2guZ3JvdXAoMClbbGVuKGxvb2tfZm9yKTpdCiAgICBlbHNlOgogICAgICAgIHJldHVybiBOb25lCgoKY2xhc3MgSFRNTFBhZ2Uob2JqZWN0KToKICAgICIiIlJlcHJlc2VudHMgb25lIHBhZ2UsIGFsb25nIHdpdGggaXRzIFVSTCIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb250ZW50LCB1cmwsIGhlYWRlcnM9Tm9uZSk6CiAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2UgaGF2ZSBhbnkgZW5jb2RpbmcgaW5mb3JtYXRpb24gaW4gb3VyIGhlYWRlcnMKICAgICAgICBlbmNvZGluZyA9IE5vbmUKICAgICAgICBpZiBoZWFkZXJzIGFuZCAiQ29udGVudC1UeXBlIiBpbiBoZWFkZXJzOgogICAgICAgICAgICBjb250ZW50X3R5cGUsIHBhcmFtcyA9IGNnaS5wYXJzZV9oZWFkZXIoaGVhZGVyc1siQ29udGVudC1UeXBlIl0pCgogICAgICAgICAgICBpZiAiY2hhcnNldCIgaW4gcGFyYW1zOgogICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBwYXJhbXNbJ2NoYXJzZXQnXQoKICAgICAgICBzZWxmLmNvbnRlbnQgPSBjb250ZW50CiAgICAgICAgc2VsZi5wYXJzZWQgPSBodG1sNWxpYi5wYXJzZSgKICAgICAgICAgICAgc2VsZi5jb250ZW50LAogICAgICAgICAgICB0cmFuc3BvcnRfZW5jb2Rpbmc9ZW5jb2RpbmcsCiAgICAgICAgICAgIG5hbWVzcGFjZUhUTUxFbGVtZW50cz1GYWxzZSwKICAgICAgICApCiAgICAgICAgc2VsZi51cmwgPSB1cmwKICAgICAgICBzZWxmLmhlYWRlcnMgPSBoZWFkZXJzCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudXJsCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X3BhZ2UoY2xzLCBsaW5rLCBza2lwX2FyY2hpdmVzPVRydWUsIHNlc3Npb249Tm9uZSk6CiAgICAgICAgaWYgc2Vzc2lvbiBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoCiAgICAgICAgICAgICAgICAiZ2V0X3BhZ2UoKSBtaXNzaW5nIDEgcmVxdWlyZWQga2V5d29yZCBhcmd1bWVudDogJ3Nlc3Npb24nIgogICAgICAgICAgICApCgogICAgICAgIHVybCA9IGxpbmsudXJsCiAgICAgICAgdXJsID0gdXJsLnNwbGl0KCcjJywgMSlbMF0KCiAgICAgICAgIyBDaGVjayBmb3IgVkNTIHNjaGVtZXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBsb29rdXAgYXMgd2ViIHBhZ2VzLgogICAgICAgIGZyb20gcGlwLnZjcyBpbXBvcnQgVmNzU3VwcG9ydAogICAgICAgIGZvciBzY2hlbWUgaW4gVmNzU3VwcG9ydC5zY2hlbWVzOgogICAgICAgICAgICBpZiB1cmwubG93ZXIoKS5zdGFydHN3aXRoKHNjaGVtZSkgYW5kIHVybFtsZW4oc2NoZW1lKV0gaW4gJys6JzoKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQ2Fubm90IGxvb2sgYXQgJXMgVVJMICVzJywgc2NoZW1lLCBsaW5rKQogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBza2lwX2FyY2hpdmVzOgogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBsaW5rLmZpbGVuYW1lCiAgICAgICAgICAgICAgICBmb3IgYmFkX2V4dCBpbiBBUkNISVZFX0VYVEVOU0lPTlM6CiAgICAgICAgICAgICAgICAgICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoYmFkX2V4dCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9IGNscy5fZ2V0X2NvbnRlbnRfdHlwZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCwgc2Vzc2lvbj1zZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvbnRlbnRfdHlwZS5sb3dlcigpLnN0YXJ0c3dpdGgoJ3RleHQvaHRtbCcpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2tpcHBpbmcgcGFnZSAlcyBiZWNhdXNlIG9mIENvbnRlbnQtVHlwZTogJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0dldHRpbmcgcGFnZSAlcycsIHVybCkKCiAgICAgICAgICAgICMgVGFjayBpbmRleC5odG1sIG9udG8gZmlsZTovLyBVUkxzIHRoYXQgcG9pbnQgdG8gZGlyZWN0b3JpZXMKICAgICAgICAgICAgKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCkgPSBcCiAgICAgICAgICAgICAgICB1cmxsaWJfcGFyc2UudXJscGFyc2UodXJsKQogICAgICAgICAgICBpZiAoc2NoZW1lID09ICdmaWxlJyBhbmQKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmlzZGlyKHVybGxpYl9yZXF1ZXN0LnVybDJwYXRobmFtZShwYXRoKSkpOgogICAgICAgICAgICAgICAgIyBhZGQgdHJhaWxpbmcgc2xhc2ggaWYgbm90IHByZXNlbnQgc28gdXJsam9pbiBkb2Vzbid0IHRyaW0KICAgICAgICAgICAgICAgICMgZmluYWwgc2VnbWVudAogICAgICAgICAgICAgICAgaWYgbm90IHVybC5lbmRzd2l0aCgnLycpOgogICAgICAgICAgICAgICAgICAgIHVybCArPSAnLycKICAgICAgICAgICAgICAgIHVybCA9IHVybGxpYl9wYXJzZS51cmxqb2luKHVybCwgJ2luZGV4Lmh0bWwnKQogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCcgZmlsZTogVVJMIGlzIGRpcmVjdG9yeSwgZ2V0dGluZyAlcycsIHVybCkKCiAgICAgICAgICAgIHJlc3AgPSBzZXNzaW9uLmdldCgKICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgICAgIGhlYWRlcnM9ewogICAgICAgICAgICAgICAgICAgICJBY2NlcHQiOiAidGV4dC9odG1sIiwKICAgICAgICAgICAgICAgICAgICAiQ2FjaGUtQ29udHJvbCI6ICJtYXgtYWdlPTYwMCIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApCiAgICAgICAgICAgIHJlc3AucmFpc2VfZm9yX3N0YXR1cygpCgogICAgICAgICAgICAjIFRoZSBjaGVjayBmb3IgYXJjaGl2ZXMgYWJvdmUgb25seSB3b3JrcyBpZiB0aGUgdXJsIGVuZHMgd2l0aAogICAgICAgICAgICAjIHNvbWV0aGluZyB0aGF0IGxvb2tzIGxpa2UgYW4gYXJjaGl2ZS4gSG93ZXZlciB0aGF0IGlzIG5vdCBhCiAgICAgICAgICAgICMgcmVxdWlyZW1lbnQgb2YgYW4gdXJsLiBVbmxlc3Mgd2UgaXNzdWUgYSBIRUFEIHJlcXVlc3Qgb24gZXZlcnkKICAgICAgICAgICAgIyB1cmwgd2UgY2Fubm90IGtub3cgYWhlYWQgb2YgdGltZSBmb3Igc3VyZSBpZiBzb21ldGhpbmcgaXMgSFRNTAogICAgICAgICAgICAjIG9yIG5vdC4gSG93ZXZlciB3ZSBjYW4gY2hlY2sgYWZ0ZXIgd2UndmUgZG93bmxvYWRlZCBpdC4KICAgICAgICAgICAgY29udGVudF90eXBlID0gcmVzcC5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJywgJ3Vua25vd24nKQogICAgICAgICAgICBpZiBub3QgY29udGVudF90eXBlLmxvd2VyKCkuc3RhcnRzd2l0aCgidGV4dC9odG1sIik6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAgICAgJ1NraXBwaW5nIHBhZ2UgJXMgYmVjYXVzZSBvZiBDb250ZW50LVR5cGU6ICVzJywKICAgICAgICAgICAgICAgICAgICBsaW5rLAogICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgaW5zdCA9IGNscyhyZXNwLmNvbnRlbnQsIHJlc3AudXJsLCByZXNwLmhlYWRlcnMpCiAgICAgICAgZXhjZXB0IHJlcXVlc3RzLkhUVFBFcnJvciBhcyBleGM6CiAgICAgICAgICAgIGNscy5faGFuZGxlX2ZhaWwobGluaywgZXhjLCB1cmwpCiAgICAgICAgZXhjZXB0IFNTTEVycm9yIGFzIGV4YzoKICAgICAgICAgICAgcmVhc29uID0gKCJUaGVyZSB3YXMgYSBwcm9ibGVtIGNvbmZpcm1pbmcgdGhlIHNzbCBjZXJ0aWZpY2F0ZTogIgogICAgICAgICAgICAgICAgICAgICAgIiVzIiAlIGV4YykKICAgICAgICAgICAgY2xzLl9oYW5kbGVfZmFpbChsaW5rLCByZWFzb24sIHVybCwgbWV0aD1sb2dnZXIuaW5mbykKICAgICAgICBleGNlcHQgcmVxdWVzdHMuQ29ubmVjdGlvbkVycm9yIGFzIGV4YzoKICAgICAgICAgICAgY2xzLl9oYW5kbGVfZmFpbChsaW5rLCAiY29ubmVjdGlvbiBlcnJvcjogJXMiICUgZXhjLCB1cmwpCiAgICAgICAgZXhjZXB0IHJlcXVlc3RzLlRpbWVvdXQ6CiAgICAgICAgICAgIGNscy5faGFuZGxlX2ZhaWwobGluaywgInRpbWVkIG91dCIsIHVybCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gaW5zdAoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfaGFuZGxlX2ZhaWwobGluaywgcmVhc29uLCB1cmwsIG1ldGg9Tm9uZSk6CiAgICAgICAgaWYgbWV0aCBpcyBOb25lOgogICAgICAgICAgICBtZXRoID0gbG9nZ2VyLmRlYnVnCgogICAgICAgIG1ldGgoIkNvdWxkIG5vdCBmZXRjaCBVUkwgJXM6ICVzIC0gc2tpcHBpbmciLCBsaW5rLCByZWFzb24pCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9nZXRfY29udGVudF90eXBlKHVybCwgc2Vzc2lvbik6CiAgICAgICAgIiIiR2V0IHRoZSBDb250ZW50LVR5cGUgb2YgdGhlIGdpdmVuIHVybCwgdXNpbmcgYSBIRUFEIHJlcXVlc3QiIiIKICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksIGZyYWdtZW50ID0gdXJsbGliX3BhcnNlLnVybHNwbGl0KHVybCkKICAgICAgICBpZiBzY2hlbWUgbm90IGluICgnaHR0cCcsICdodHRwcycpOgogICAgICAgICAgICAjIEZJWE1FOiBzb21lIHdhcm5pbmcgb3Igc29tZXRoaW5nPwogICAgICAgICAgICAjIGFzc2VydGlvbiBlcnJvcj8KICAgICAgICAgICAgcmV0dXJuICcnCgogICAgICAgIHJlc3AgPSBzZXNzaW9uLmhlYWQodXJsLCBhbGxvd19yZWRpcmVjdHM9VHJ1ZSkKICAgICAgICByZXNwLnJhaXNlX2Zvcl9zdGF0dXMoKQoKICAgICAgICByZXR1cm4gcmVzcC5oZWFkZXJzLmdldCgiQ29udGVudC1UeXBlIiwgIiIpCgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIGJhc2VfdXJsKHNlbGYpOgogICAgICAgIGJhc2VzID0gWwogICAgICAgICAgICB4IGZvciB4IGluIHNlbGYucGFyc2VkLmZpbmRhbGwoIi4vL2Jhc2UiKQogICAgICAgICAgICBpZiB4LmdldCgiaHJlZiIpIGlzIG5vdCBOb25lCiAgICAgICAgXQogICAgICAgIGlmIGJhc2VzIGFuZCBiYXNlc1swXS5nZXQoImhyZWYiKToKICAgICAgICAgICAgcmV0dXJuIGJhc2VzWzBdLmdldCgiaHJlZiIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYudXJsCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGlua3Moc2VsZik6CiAgICAgICAgIiIiWWllbGRzIGFsbCBsaW5rcyBpbiB0aGUgcGFnZSIiIgogICAgICAgIGZvciBhbmNob3IgaW4gc2VsZi5wYXJzZWQuZmluZGFsbCgiLi8vYSIpOgogICAgICAgICAgICBpZiBhbmNob3IuZ2V0KCJocmVmIik6CiAgICAgICAgICAgICAgICBocmVmID0gYW5jaG9yLmdldCgiaHJlZiIpCiAgICAgICAgICAgICAgICB1cmwgPSBzZWxmLmNsZWFuX2xpbmsoCiAgICAgICAgICAgICAgICAgICAgdXJsbGliX3BhcnNlLnVybGpvaW4oc2VsZi5iYXNlX3VybCwgaHJlZikKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHB5cmVxdWlyZSA9IGFuY2hvci5nZXQoJ2RhdGEtcmVxdWlyZXMtcHl0aG9uJykKICAgICAgICAgICAgICAgIHB5cmVxdWlyZSA9IHVuZXNjYXBlKHB5cmVxdWlyZSkgaWYgcHlyZXF1aXJlIGVsc2UgTm9uZQogICAgICAgICAgICAgICAgeWllbGQgTGluayh1cmwsIHNlbGYsIHJlcXVpcmVzX3B5dGhvbj1weXJlcXVpcmUpCgogICAgX2NsZWFuX3JlID0gcmUuY29tcGlsZShyJ1teYS16MC05JCYrLC86Oz0/QC4jJV9cXHwtXScsIHJlLkkpCgogICAgZGVmIGNsZWFuX2xpbmsoc2VsZiwgdXJsKToKICAgICAgICAiIiJNYWtlcyBzdXJlIGEgbGluayBpcyBmdWxseSBlbmNvZGVkLiAgVGhhdCBpcywgaWYgYSAnICcgc2hvd3MgdXAgaW4KICAgICAgICB0aGUgbGluaywgaXQgd2lsbCBiZSByZXdyaXR0ZW4gdG8gJTIwICh3aGlsZSBub3Qgb3Zlci1xdW90aW5nCiAgICAgICAgJSBvciBvdGhlciBjaGFyYWN0ZXJzKS4iIiIKICAgICAgICByZXR1cm4gc2VsZi5fY2xlYW5fcmUuc3ViKAogICAgICAgICAgICBsYW1iZGEgbWF0Y2g6ICclJSUyeCcgJSBvcmQobWF0Y2guZ3JvdXAoMCkpLCB1cmwpCgoKY2xhc3MgTGluayhvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwsIGNvbWVzX2Zyb209Tm9uZSwgcmVxdWlyZXNfcHl0aG9uPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIE9iamVjdCByZXByZXNlbnRpbmcgYSBwYXJzZWQgbGluayBmcm9tIGh0dHBzOi8vcHlwaS5weXRob24ub3JnL3NpbXBsZS8qCgogICAgICAgIHVybDoKICAgICAgICAgICAgdXJsIG9mIHRoZSByZXNvdXJjZSBwb2ludGVkIHRvIChocmVmIG9mIHRoZSBsaW5rKQogICAgICAgIGNvbWVzX2Zyb206CiAgICAgICAgICAgIGluc3RhbmNlIG9mIEhUTUxQYWdlIHdoZXJlIHRoZSBsaW5rIHdhcyBmb3VuZCwgb3Igc3RyaW5nLgogICAgICAgIHJlcXVpcmVzX3B5dGhvbjoKICAgICAgICAgICAgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGBSZXF1aXJlcy1QeXRob25gIG1ldGFkYXRhIGZpZWxkLCBzcGVjaWZpZWQKICAgICAgICAgICAgaW4gUEVQIDM0NS4gVGhpcyBtYXkgYmUgc3BlY2lmaWVkIGJ5IGEgZGF0YS1yZXF1aXJlcy1weXRob24KICAgICAgICAgICAgYXR0cmlidXRlIGluIHRoZSBIVE1MIGxpbmsgdGFnLCBhcyBkZXNjcmliZWQgaW4gUEVQIDUwMy4KICAgICAgICAiIiIKCiAgICAgICAgIyB1cmwgY2FuIGJlIGEgVU5DIHdpbmRvd3Mgc2hhcmUKICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aCgnXFxcXCcpOgogICAgICAgICAgICB1cmwgPSBwYXRoX3RvX3VybCh1cmwpCgogICAgICAgIHNlbGYudXJsID0gdXJsCiAgICAgICAgc2VsZi5jb21lc19mcm9tID0gY29tZXNfZnJvbQogICAgICAgIHNlbGYucmVxdWlyZXNfcHl0aG9uID0gcmVxdWlyZXNfcHl0aG9uIGlmIHJlcXVpcmVzX3B5dGhvbiBlbHNlIE5vbmUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBpZiBzZWxmLnJlcXVpcmVzX3B5dGhvbjoKICAgICAgICAgICAgcnAgPSAnIChyZXF1aXJlcy1weXRob246JXMpJyAlIHNlbGYucmVxdWlyZXNfcHl0aG9uCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcnAgPSAnJwogICAgICAgIGlmIHNlbGYuY29tZXNfZnJvbToKICAgICAgICAgICAgcmV0dXJuICclcyAoZnJvbSAlcyklcycgJSAoc2VsZi51cmwsIHNlbGYuY29tZXNfZnJvbSwgcnApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmLnVybCkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICc8TGluayAlcz4nICUgc2VsZgoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBMaW5rKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgcmV0dXJuIHNlbGYudXJsID09IG90aGVyLnVybAoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBMaW5rKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgcmV0dXJuIHNlbGYudXJsICE9IG90aGVyLnVybAoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBMaW5rKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgcmV0dXJuIHNlbGYudXJsIDwgb3RoZXIudXJsCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIExpbmspOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICByZXR1cm4gc2VsZi51cmwgPD0gb3RoZXIudXJsCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIExpbmspOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICByZXR1cm4gc2VsZi51cmwgPiBvdGhlci51cmwKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgTGluayk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIHJldHVybiBzZWxmLnVybCA+PSBvdGhlci51cmwKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi51cmwpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZmlsZW5hbWUoc2VsZik6CiAgICAgICAgXywgbmV0bG9jLCBwYXRoLCBfLCBfID0gdXJsbGliX3BhcnNlLnVybHNwbGl0KHNlbGYudXJsKQogICAgICAgIG5hbWUgPSBwb3NpeHBhdGguYmFzZW5hbWUocGF0aC5yc3RyaXAoJy8nKSkgb3IgbmV0bG9jCiAgICAgICAgbmFtZSA9IHVybGxpYl9wYXJzZS51bnF1b3RlKG5hbWUpCiAgICAgICAgYXNzZXJ0IG5hbWUsICgnVVJMICVyIHByb2R1Y2VkIG5vIGZpbGVuYW1lJyAlIHNlbGYudXJsKQogICAgICAgIHJldHVybiBuYW1lCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2NoZW1lKHNlbGYpOgogICAgICAgIHJldHVybiB1cmxsaWJfcGFyc2UudXJsc3BsaXQoc2VsZi51cmwpWzBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgbmV0bG9jKHNlbGYpOgogICAgICAgIHJldHVybiB1cmxsaWJfcGFyc2UudXJsc3BsaXQoc2VsZi51cmwpWzFdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcGF0aChzZWxmKToKICAgICAgICByZXR1cm4gdXJsbGliX3BhcnNlLnVucXVvdGUodXJsbGliX3BhcnNlLnVybHNwbGl0KHNlbGYudXJsKVsyXSkKCiAgICBkZWYgc3BsaXRleHQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNwbGl0ZXh0KHBvc2l4cGF0aC5iYXNlbmFtZShzZWxmLnBhdGgucnN0cmlwKCcvJykpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGV4dChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5zcGxpdGV4dCgpWzFdCgogICAgQHByb3BlcnR5CiAgICBkZWYgdXJsX3dpdGhvdXRfZnJhZ21lbnQoc2VsZik6CiAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCA9IHVybGxpYl9wYXJzZS51cmxzcGxpdChzZWxmLnVybCkKICAgICAgICByZXR1cm4gdXJsbGliX3BhcnNlLnVybHVuc3BsaXQoKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgTm9uZSkpCgogICAgX2VnZ19mcmFnbWVudF9yZSA9IHJlLmNvbXBpbGUocidbIyZdZWdnPShbXiZdKiknKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGVnZ19mcmFnbWVudChzZWxmKToKICAgICAgICBtYXRjaCA9IHNlbGYuX2VnZ19mcmFnbWVudF9yZS5zZWFyY2goc2VsZi51cmwpCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBtYXRjaC5ncm91cCgxKQoKICAgIF9zdWJkaXJlY3RvcnlfZnJhZ21lbnRfcmUgPSByZS5jb21waWxlKHInWyMmXXN1YmRpcmVjdG9yeT0oW14mXSopJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzdWJkaXJlY3RvcnlfZnJhZ21lbnQoc2VsZik6CiAgICAgICAgbWF0Y2ggPSBzZWxmLl9zdWJkaXJlY3RvcnlfZnJhZ21lbnRfcmUuc2VhcmNoKHNlbGYudXJsKQogICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gbWF0Y2guZ3JvdXAoMSkKCiAgICBfaGFzaF9yZSA9IHJlLmNvbXBpbGUoCiAgICAgICAgcicoc2hhMXxzaGEyMjR8c2hhMzg0fHNoYTI1NnxzaGE1MTJ8bWQ1KT0oW2EtZjAtOV0rKScKICAgICkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBoYXNoKHNlbGYpOgogICAgICAgIG1hdGNoID0gc2VsZi5faGFzaF9yZS5zZWFyY2goc2VsZi51cmwpCiAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgIHJldHVybiBtYXRjaC5ncm91cCgyKQogICAgICAgIHJldHVybiBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgaGFzaF9uYW1lKHNlbGYpOgogICAgICAgIG1hdGNoID0gc2VsZi5faGFzaF9yZS5zZWFyY2goc2VsZi51cmwpCiAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgIHJldHVybiBtYXRjaC5ncm91cCgxKQogICAgICAgIHJldHVybiBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2hvd191cmwoc2VsZik6CiAgICAgICAgcmV0dXJuIHBvc2l4cGF0aC5iYXNlbmFtZShzZWxmLnVybC5zcGxpdCgnIycsIDEpWzBdLnNwbGl0KCc/JywgMSlbMF0pCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfd2hlZWwoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZXh0ID09IHdoZWVsX2V4dAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2FydGlmYWN0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIERldGVybWluZXMgaWYgdGhpcyBwb2ludHMgdG8gYW4gYWN0dWFsIGFydGlmYWN0IChlLmcuIGEgdGFyYmFsbCkgb3IgaWYKICAgICAgICBpdCBwb2ludHMgdG8gYW4gImFic3RyYWN0IiB0aGluZyBsaWtlIGEgcGF0aCBvciBhIFZDUyBsb2NhdGlvbi4KICAgICAgICAiIiIKICAgICAgICBmcm9tIHBpcC52Y3MgaW1wb3J0IHZjcwoKICAgICAgICBpZiBzZWxmLnNjaGVtZSBpbiB2Y3MuYWxsX3NjaGVtZXM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICByZXR1cm4gVHJ1ZQoKCkZvcm1hdENvbnRyb2wgPSBuYW1lZHR1cGxlKCdGb3JtYXRDb250cm9sJywgJ25vX2JpbmFyeSBvbmx5X2JpbmFyeScpCiIiIlRoaXMgb2JqZWN0IGhhcyB0d28gZmllbGRzLCBub19iaW5hcnkgYW5kIG9ubHlfYmluYXJ5LgoKSWYgYSBmaWVsZCBpcyBmYWxzeSwgaXQgaXNuJ3Qgc2V0LiBJZiBpdCBpcyB7JzphbGw6J30sIGl0IHNob3VsZCBtYXRjaCBhbGwKcGFja2FnZXMgZXhjZXB0IHRob3NlIGxpc3RlZCBpbiB0aGUgb3RoZXIgZmllbGQuIE9ubHkgb25lIGZpZWxkIGNhbiBiZSBzZXQKdG8geyc6YWxsOid9IGF0IGEgdGltZS4gVGhlIHJlc3Qgb2YgdGhlIHRpbWUgZXhhY3QgcGFja2FnZSBuYW1lIG1hdGNoZXMKYXJlIGxpc3RlZCwgd2l0aCBhbnkgZ2l2ZW4gcGFja2FnZSBvbmx5IHNob3dpbmcgdXAgaW4gb25lIGZpZWxkIGF0IGEgdGltZS4KIiIiCgoKZGVmIGZtdF9jdGxfaGFuZGxlX211dHVhbF9leGNsdWRlKHZhbHVlLCB0YXJnZXQsIG90aGVyKToKICAgIG5ldyA9IHZhbHVlLnNwbGl0KCcsJykKICAgIHdoaWxlICc6YWxsOicgaW4gbmV3OgogICAgICAgIG90aGVyLmNsZWFyKCkKICAgICAgICB0YXJnZXQuY2xlYXIoKQogICAgICAgIHRhcmdldC5hZGQoJzphbGw6JykKICAgICAgICBkZWwgbmV3WzpuZXcuaW5kZXgoJzphbGw6JykgKyAxXQogICAgICAgIGlmICc6bm9uZTonIG5vdCBpbiBuZXc6CiAgICAgICAgICAgICMgV2l0aG91dCBhIG5vbmUsIHdlIHdhbnQgdG8gZGlzY2FyZCBldmVyeXRoaW5nIGFzIDphbGw6IGNvdmVycyBpdAogICAgICAgICAgICByZXR1cm4KICAgIGZvciBuYW1lIGluIG5ldzoKICAgICAgICBpZiBuYW1lID09ICc6bm9uZTonOgogICAgICAgICAgICB0YXJnZXQuY2xlYXIoKQogICAgICAgICAgICBjb250aW51ZQogICAgICAgIG5hbWUgPSBjYW5vbmljYWxpemVfbmFtZShuYW1lKQogICAgICAgIG90aGVyLmRpc2NhcmQobmFtZSkKICAgICAgICB0YXJnZXQuYWRkKG5hbWUpCgoKZGVmIGZtdF9jdGxfZm9ybWF0cyhmbXRfY3RsLCBjYW5vbmljYWxfbmFtZSk6CiAgICByZXN1bHQgPSBzZXQoWyJiaW5hcnkiLCAic291cmNlIl0pCiAgICBpZiBjYW5vbmljYWxfbmFtZSBpbiBmbXRfY3RsLm9ubHlfYmluYXJ5OgogICAgICAgIHJlc3VsdC5kaXNjYXJkKCdzb3VyY2UnKQogICAgZWxpZiBjYW5vbmljYWxfbmFtZSBpbiBmbXRfY3RsLm5vX2JpbmFyeToKICAgICAgICByZXN1bHQuZGlzY2FyZCgnYmluYXJ5JykKICAgIGVsaWYgJzphbGw6JyBpbiBmbXRfY3RsLm9ubHlfYmluYXJ5OgogICAgICAgIHJlc3VsdC5kaXNjYXJkKCdzb3VyY2UnKQogICAgZWxpZiAnOmFsbDonIGluIGZtdF9jdGwubm9fYmluYXJ5OgogICAgICAgIHJlc3VsdC5kaXNjYXJkKCdiaW5hcnknKQogICAgcmV0dXJuIGZyb3plbnNldChyZXN1bHQpCgoKZGVmIGZtdF9jdGxfbm9fYmluYXJ5KGZtdF9jdGwpOgogICAgZm10X2N0bF9oYW5kbGVfbXV0dWFsX2V4Y2x1ZGUoCiAgICAgICAgJzphbGw6JywgZm10X2N0bC5ub19iaW5hcnksIGZtdF9jdGwub25seV9iaW5hcnkpCgoKZGVmIGZtdF9jdGxfbm9fdXNlX3doZWVsKGZtdF9jdGwpOgogICAgZm10X2N0bF9ub19iaW5hcnkoZm10X2N0bCkKICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgJy0tbm8tdXNlLXdoZWVsIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiAnCiAgICAgICAgJyBQbGVhc2UgdXNlIC0tbm8tYmluYXJ5IDphbGw6IGluc3RlYWQuJywgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgIHN0YWNrbGV2ZWw9MikKCgpTZWFyY2ggPSBuYW1lZHR1cGxlKCdTZWFyY2gnLCAnc3VwcGxpZWQgY2Fub25pY2FsIGZvcm1hdHMnKQoiIiJDYXB0dXJlIGtleSBhc3BlY3RzIG9mIGEgc2VhcmNoLgoKOmF0dHJpYnV0ZSBzdXBwbGllZDogVGhlIHVzZXIgc3VwcGxpZWQgcGFja2FnZS4KOmF0dHJpYnV0ZSBjYW5vbmljYWw6IFRoZSBjYW5vbmljYWwgcGFja2FnZSBuYW1lLgo6YXR0cmlidXRlIGZvcm1hdHM6IFRoZSBmb3JtYXRzIGFsbG93ZWQgZm9yIHRoaXMgcGFja2FnZS4gU2hvdWxkIGJlIGEgc2V0CiAgICB3aXRoICdiaW5hcnknIG9yICdzb3VyY2UnIG9yIGJvdGggaW4gaXQuCiIiIgpQSwMEFAAAAAAAAAAhALcPd5n6FQAA+hUAACAAAABweXBpX19waXBfOV8wXzMvcGlwL2xvY2F0aW9ucy5weSIiIkxvY2F0aW9ucyB3aGVyZSB3ZSBsb29rIGZvciBjb25maWdzLCBpbnN0YWxsIHN0dWZmLCBldGMiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBvcwppbXBvcnQgb3MucGF0aAppbXBvcnQgc2l0ZQppbXBvcnQgc3lzCgpmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCmZyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbCBpbXBvcnQgaW5zdGFsbCwgU0NIRU1FX0tFWVMgICMgbm9xYQoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBXSU5ET1dTLCBleHBhbmR1c2VyCmZyb20gcGlwLnV0aWxzIGltcG9ydCBhcHBkaXJzCgoKIyBBcHBsaWNhdGlvbiBEaXJlY3RvcmllcwpVU0VSX0NBQ0hFX0RJUiA9IGFwcGRpcnMudXNlcl9jYWNoZV9kaXIoInBpcCIpCgoKREVMRVRFX01BUktFUl9NRVNTQUdFID0gJycnXApUaGlzIGZpbGUgaXMgcGxhY2VkIGhlcmUgYnkgcGlwIHRvIGluZGljYXRlIHRoZSBzb3VyY2Ugd2FzIHB1dApoZXJlIGJ5IHBpcC4KCk9uY2UgdGhpcyBwYWNrYWdlIGlzIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgdGhpcyBzb3VyY2UgY29kZSB3aWxsIGJlCmRlbGV0ZWQgKHVubGVzcyB5b3UgcmVtb3ZlIHRoaXMgZmlsZSkuCicnJwpQSVBfREVMRVRFX01BUktFUl9GSUxFTkFNRSA9ICdwaXAtZGVsZXRlLXRoaXMtZGlyZWN0b3J5LnR4dCcKCgpkZWYgd3JpdGVfZGVsZXRlX21hcmtlcl9maWxlKGRpcmVjdG9yeSk6CiAgICAiIiIKICAgIFdyaXRlIHRoZSBwaXAgZGVsZXRlIG1hcmtlciBmaWxlIGludG8gdGhpcyBkaXJlY3RvcnkuCiAgICAiIiIKICAgIGZpbGVwYXRoID0gb3MucGF0aC5qb2luKGRpcmVjdG9yeSwgUElQX0RFTEVURV9NQVJLRVJfRklMRU5BTUUpCiAgICB3aXRoIG9wZW4oZmlsZXBhdGgsICd3JykgYXMgbWFya2VyX2ZwOgogICAgICAgIG1hcmtlcl9mcC53cml0ZShERUxFVEVfTUFSS0VSX01FU1NBR0UpCgoKZGVmIHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudigpOgogICAgIiIiCiAgICBSZXR1cm4gVHJ1ZSBpZiB3ZSdyZSBydW5uaW5nIGluc2lkZSBhIHZpcnR1YWxlbnYsIEZhbHNlIG90aGVyd2lzZS4KCiAgICAiIiIKICAgIGlmIGhhc2F0dHIoc3lzLCAncmVhbF9wcmVmaXgnKToKICAgICAgICByZXR1cm4gVHJ1ZQogICAgZWxpZiBzeXMucHJlZml4ICE9IGdldGF0dHIoc3lzLCAiYmFzZV9wcmVmaXgiLCBzeXMucHJlZml4KToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIHJldHVybiBGYWxzZQoKCmRlZiB2aXJ0dWFsZW52X25vX2dsb2JhbCgpOgogICAgIiIiCiAgICBSZXR1cm4gVHJ1ZSBpZiBpbiBhIHZlbnYgYW5kIG5vIHN5c3RlbSBzaXRlIHBhY2thZ2VzLgogICAgIiIiCiAgICAjIHRoaXMgbWlycm9ycyB0aGUgbG9naWMgaW4gdmlydHVhbGVudi5weSBmb3IgbG9jYXRpbmcgdGhlCiAgICAjIG5vLWdsb2JhbC1zaXRlLXBhY2thZ2VzLnR4dCBmaWxlCiAgICBzaXRlX21vZF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKHNpdGUuX19maWxlX18pKQogICAgbm9fZ2xvYmFsX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2l0ZV9tb2RfZGlyLCAnbm8tZ2xvYmFsLXNpdGUtcGFja2FnZXMudHh0JykKICAgIGlmIHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudigpIGFuZCBvcy5wYXRoLmlzZmlsZShub19nbG9iYWxfZmlsZSk6CiAgICAgICAgcmV0dXJuIFRydWUKCgppZiBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYoKToKICAgIHNyY19wcmVmaXggPSBvcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgJ3NyYycpCmVsc2U6CiAgICAjIEZJWE1FOiBrZWVwIHNyYyBpbiBjd2QgZm9yIG5vdyAoaXQgaXMgbm90IGEgdGVtcG9yYXJ5IGZvbGRlcikKICAgIHRyeToKICAgICAgICBzcmNfcHJlZml4ID0gb3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCAnc3JjJykKICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICMgSW4gY2FzZSB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBoYXMgYmVlbiByZW5hbWVkIG9yIGRlbGV0ZWQKICAgICAgICBzeXMuZXhpdCgKICAgICAgICAgICAgIlRoZSBmb2xkZXIgeW91IGFyZSBleGVjdXRpbmcgcGlwIGZyb20gY2FuIG5vIGxvbmdlciBiZSBmb3VuZC4iCiAgICAgICAgKQoKIyB1bmRlciBtYWNPUyArIHZpcnR1YWxlbnYgc3lzLnByZWZpeCBpcyBub3QgcHJvcGVybHkgcmVzb2x2ZWQKIyBpdCBpcyBzb21ldGhpbmcgbGlrZSAvcGF0aC90by9weXRob24vYmluLy4uCiMgTm90ZTogdXNpbmcgcmVhbHBhdGggZHVlIHRvIHRtcCBkaXJzIG9uIE9TWCBiZWluZyBzeW1saW5rcwpzcmNfcHJlZml4ID0gb3MucGF0aC5hYnNwYXRoKHNyY19wcmVmaXgpCgojIEZJWE1FIGRvZXNuJ3QgYWNjb3VudCBmb3IgdmVudiBsaW5rZWQgdG8gZ2xvYmFsIHNpdGUtcGFja2FnZXMKCnNpdGVfcGFja2FnZXMgPSBzeXNjb25maWcuZ2V0X3B5dGhvbl9saWIoKQp1c2VyX3NpdGUgPSBzaXRlLlVTRVJfU0lURQp1c2VyX2RpciA9IGV4cGFuZHVzZXIoJ34nKQppZiBXSU5ET1dTOgogICAgYmluX3B5ID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICdTY3JpcHRzJykKICAgIGJpbl91c2VyID0gb3MucGF0aC5qb2luKHVzZXJfc2l0ZSwgJ1NjcmlwdHMnKQogICAgIyBidWlsZG91dCB1c2VzICdiaW4nIG9uIFdpbmRvd3MgdG9vPwogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGJpbl9weSk6CiAgICAgICAgYmluX3B5ID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICdiaW4nKQogICAgICAgIGJpbl91c2VyID0gb3MucGF0aC5qb2luKHVzZXJfc2l0ZSwgJ2JpbicpCgogICAgY29uZmlnX2Jhc2VuYW1lID0gJ3BpcC5pbmknCgogICAgbGVnYWN5X3N0b3JhZ2VfZGlyID0gb3MucGF0aC5qb2luKHVzZXJfZGlyLCAncGlwJykKICAgIGxlZ2FjeV9jb25maWdfZmlsZSA9IG9zLnBhdGguam9pbigKICAgICAgICBsZWdhY3lfc3RvcmFnZV9kaXIsCiAgICAgICAgY29uZmlnX2Jhc2VuYW1lLAogICAgKQplbHNlOgogICAgYmluX3B5ID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICdiaW4nKQogICAgYmluX3VzZXIgPSBvcy5wYXRoLmpvaW4odXNlcl9zaXRlLCAnYmluJykKCiAgICBjb25maWdfYmFzZW5hbWUgPSAncGlwLmNvbmYnCgogICAgbGVnYWN5X3N0b3JhZ2VfZGlyID0gb3MucGF0aC5qb2luKHVzZXJfZGlyLCAnLnBpcCcpCiAgICBsZWdhY3lfY29uZmlnX2ZpbGUgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgbGVnYWN5X3N0b3JhZ2VfZGlyLAogICAgICAgIGNvbmZpZ19iYXNlbmFtZSwKICAgICkKCiAgICAjIEZvcmNpbmcgdG8gdXNlIC91c3IvbG9jYWwvYmluIGZvciBzdGFuZGFyZCBtYWNPUyBmcmFtZXdvcmsgaW5zdGFsbHMKICAgICMgQWxzbyBsb2cgdG8gfi9MaWJyYXJ5L0xvZ3MvIGZvciB1c2Ugd2l0aCB0aGUgQ29uc29sZS5hcHAgbG9nIHZpZXdlcgogICAgaWYgc3lzLnBsYXRmb3JtWzo2XSA9PSAnZGFyd2luJyBhbmQgc3lzLnByZWZpeFs6MTZdID09ICcvU3lzdGVtL0xpYnJhcnkvJzoKICAgICAgICBiaW5fcHkgPSAnL3Vzci9sb2NhbC9iaW4nCgpzaXRlX2NvbmZpZ19maWxlcyA9IFsKICAgIG9zLnBhdGguam9pbihwYXRoLCBjb25maWdfYmFzZW5hbWUpCiAgICBmb3IgcGF0aCBpbiBhcHBkaXJzLnNpdGVfY29uZmlnX2RpcnMoJ3BpcCcpCl0KCgpkZWYgZGlzdHV0aWxzX3NjaGVtZShkaXN0X25hbWUsIHVzZXI9RmFsc2UsIGhvbWU9Tm9uZSwgcm9vdD1Ob25lLAogICAgICAgICAgICAgICAgICAgICBpc29sYXRlZD1GYWxzZSwgcHJlZml4PU5vbmUpOgogICAgIiIiCiAgICBSZXR1cm4gYSBkaXN0dXRpbHMgaW5zdGFsbCBzY2hlbWUKICAgICIiIgogICAgZnJvbSBkaXN0dXRpbHMuZGlzdCBpbXBvcnQgRGlzdHJpYnV0aW9uCgogICAgc2NoZW1lID0ge30KCiAgICBpZiBpc29sYXRlZDoKICAgICAgICBleHRyYV9kaXN0X2FyZ3MgPSB7InNjcmlwdF9hcmdzIjogWyItLW5vLXVzZXItY2ZnIl19CiAgICBlbHNlOgogICAgICAgIGV4dHJhX2Rpc3RfYXJncyA9IHt9CiAgICBkaXN0X2FyZ3MgPSB7J25hbWUnOiBkaXN0X25hbWV9CiAgICBkaXN0X2FyZ3MudXBkYXRlKGV4dHJhX2Rpc3RfYXJncykKCiAgICBkID0gRGlzdHJpYnV0aW9uKGRpc3RfYXJncykKICAgIGQucGFyc2VfY29uZmlnX2ZpbGVzKCkKICAgIGkgPSBkLmdldF9jb21tYW5kX29iaignaW5zdGFsbCcsIGNyZWF0ZT1UcnVlKQogICAgIyBOT1RFOiBzZXR0aW5nIHVzZXIgb3IgaG9tZSBoYXMgdGhlIHNpZGUtZWZmZWN0IG9mIGNyZWF0aW5nIHRoZSBob21lIGRpcgogICAgIyBvciB1c2VyIGJhc2UgZm9yIGluc3RhbGxhdGlvbnMgZHVyaW5nIGZpbmFsaXplX29wdGlvbnMoKQogICAgIyBpZGVhbGx5LCB3ZSdkIHByZWZlciBhIHNjaGVtZSBjbGFzcyB0aGF0IGhhcyBubyBzaWRlLWVmZmVjdHMuCiAgICBhc3NlcnQgbm90ICh1c2VyIGFuZCBwcmVmaXgpLCAidXNlcj17MH0gcHJlZml4PXsxfSIuZm9ybWF0KHVzZXIsIHByZWZpeCkKICAgIGkudXNlciA9IHVzZXIgb3IgaS51c2VyCiAgICBpZiB1c2VyOgogICAgICAgIGkucHJlZml4ID0gIiIKICAgIGkucHJlZml4ID0gcHJlZml4IG9yIGkucHJlZml4CiAgICBpLmhvbWUgPSBob21lIG9yIGkuaG9tZQogICAgaS5yb290ID0gcm9vdCBvciBpLnJvb3QKICAgIGkuZmluYWxpemVfb3B0aW9ucygpCiAgICBmb3Iga2V5IGluIFNDSEVNRV9LRVlTOgogICAgICAgIHNjaGVtZVtrZXldID0gZ2V0YXR0cihpLCAnaW5zdGFsbF8nICsga2V5KQoKICAgICMgaW5zdGFsbF9saWIgc3BlY2lmaWVkIGluIHNldHVwLmNmZyBzaG91bGQgaW5zdGFsbCAqZXZlcnl0aGluZyoKICAgICMgaW50byB0aGVyZSAoaS5lLiBpdCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYm90aCBwdXJlbGliIGFuZAogICAgIyBwbGF0bGliKS4gIE5vdGUsIGkuaW5zdGFsbF9saWIgaXMgKmFsd2F5cyogc2V0IGFmdGVyCiAgICAjIGZpbmFsaXplX29wdGlvbnMoKTsgd2Ugb25seSB3YW50IHRvIG92ZXJyaWRlIGhlcmUgaWYgdGhlIHVzZXIKICAgICMgaGFzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGl0IGhlbmNlIGdvaW5nIGJhY2sgdG8gdGhlIGNvbmZpZwogICAgaWYgJ2luc3RhbGxfbGliJyBpbiBkLmdldF9vcHRpb25fZGljdCgnaW5zdGFsbCcpOgogICAgICAgIHNjaGVtZS51cGRhdGUoZGljdChwdXJlbGliPWkuaW5zdGFsbF9saWIsIHBsYXRsaWI9aS5pbnN0YWxsX2xpYikpCgogICAgaWYgcnVubmluZ191bmRlcl92aXJ0dWFsZW52KCk6CiAgICAgICAgc2NoZW1lWydoZWFkZXJzJ10gPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIHN5cy5wcmVmaXgsCiAgICAgICAgICAgICdpbmNsdWRlJywKICAgICAgICAgICAgJ3NpdGUnLAogICAgICAgICAgICAncHl0aG9uJyArIHN5cy52ZXJzaW9uWzozXSwKICAgICAgICAgICAgZGlzdF9uYW1lLAogICAgICAgICkKCiAgICAgICAgaWYgcm9vdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGF0aF9ub19kcml2ZSA9IG9zLnBhdGguc3BsaXRkcml2ZSgKICAgICAgICAgICAgICAgIG9zLnBhdGguYWJzcGF0aChzY2hlbWVbImhlYWRlcnMiXSkpWzFdCiAgICAgICAgICAgIHNjaGVtZVsiaGVhZGVycyJdID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgcm9vdCwKICAgICAgICAgICAgICAgIHBhdGhfbm9fZHJpdmVbMTpdLAogICAgICAgICAgICApCgogICAgcmV0dXJuIHNjaGVtZQpQSwMEFAAAAAAAAAAhAKoaZ7xHAAAARwAAACYAAABweXBpX19waXBfOV8wXzMvcGlwL21vZGVscy9fX2luaXRfXy5weWZyb20gcGlwLm1vZGVscy5pbmRleCBpbXBvcnQgSW5kZXgsIFB5UEkKCgpfX2FsbF9fID0gWyJJbmRleCIsICJQeVBJIl0KUEsDBBQAAAAAAAAAIQBoTjJt5wEAAOcBAAAjAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9tb2RlbHMvaW5kZXgucHlmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybGxpYl9wYXJzZQoKCmNsYXNzIEluZGV4KG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsKToKICAgICAgICBzZWxmLnVybCA9IHVybAogICAgICAgIHNlbGYubmV0bG9jID0gdXJsbGliX3BhcnNlLnVybHNwbGl0KHVybCkubmV0bG9jCiAgICAgICAgc2VsZi5zaW1wbGVfdXJsID0gc2VsZi51cmxfdG9fcGF0aCgnc2ltcGxlJykKICAgICAgICBzZWxmLnB5cGlfdXJsID0gc2VsZi51cmxfdG9fcGF0aCgncHlwaScpCiAgICAgICAgc2VsZi5waXBfanNvbl91cmwgPSBzZWxmLnVybF90b19wYXRoKCdweXBpL3BpcC9qc29uJykKCiAgICBkZWYgdXJsX3RvX3BhdGgoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIHVybGxpYl9wYXJzZS51cmxqb2luKHNlbGYudXJsLCBwYXRoKQoKClB5UEkgPSBJbmRleCgnaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvJykKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAAqAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9vcGVyYXRpb25zL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQDPZWKoNgYAADYGAAAnAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9vcGVyYXRpb25zL2NoZWNrLnB5CgpkZWYgY2hlY2tfcmVxdWlyZW1lbnRzKGluc3RhbGxlZF9kaXN0cyk6CiAgICBtaXNzaW5nX3JlcXNfZGljdCA9IHt9CiAgICBpbmNvbXBhdGlibGVfcmVxc19kaWN0ID0ge30KCiAgICBmb3IgZGlzdCBpbiBpbnN0YWxsZWRfZGlzdHM6CiAgICAgICAga2V5ID0gJyVzPT0lcycgJSAoZGlzdC5wcm9qZWN0X25hbWUsIGRpc3QudmVyc2lvbikKCiAgICAgICAgbWlzc2luZ19yZXFzID0gbGlzdChnZXRfbWlzc2luZ19yZXFzKGRpc3QsIGluc3RhbGxlZF9kaXN0cykpCiAgICAgICAgaWYgbWlzc2luZ19yZXFzOgogICAgICAgICAgICBtaXNzaW5nX3JlcXNfZGljdFtrZXldID0gbWlzc2luZ19yZXFzCgogICAgICAgIGluY29tcGF0aWJsZV9yZXFzID0gbGlzdChnZXRfaW5jb21wYXRpYmxlX3JlcXMoCiAgICAgICAgICAgIGRpc3QsIGluc3RhbGxlZF9kaXN0cykpCiAgICAgICAgaWYgaW5jb21wYXRpYmxlX3JlcXM6CiAgICAgICAgICAgIGluY29tcGF0aWJsZV9yZXFzX2RpY3Rba2V5XSA9IGluY29tcGF0aWJsZV9yZXFzCgogICAgcmV0dXJuIChtaXNzaW5nX3JlcXNfZGljdCwgaW5jb21wYXRpYmxlX3JlcXNfZGljdCkKCgpkZWYgZ2V0X21pc3NpbmdfcmVxcyhkaXN0LCBpbnN0YWxsZWRfZGlzdHMpOgogICAgIiIiUmV0dXJuIGFsbCBvZiB0aGUgcmVxdWlyZW1lbnRzIG9mIGBkaXN0YCB0aGF0IGFyZW4ndCBwcmVzZW50IGluCiAgICBgaW5zdGFsbGVkX2Rpc3RzYC4KCiAgICAiIiIKICAgIGluc3RhbGxlZF9uYW1lcyA9IHNldChkLnByb2plY3RfbmFtZS5sb3dlcigpIGZvciBkIGluIGluc3RhbGxlZF9kaXN0cykKICAgIG1pc3NpbmdfcmVxdWlyZW1lbnRzID0gc2V0KCkKCiAgICBmb3IgcmVxdWlyZW1lbnQgaW4gZGlzdC5yZXF1aXJlcygpOgogICAgICAgIGlmIHJlcXVpcmVtZW50LnByb2plY3RfbmFtZS5sb3dlcigpIG5vdCBpbiBpbnN0YWxsZWRfbmFtZXM6CiAgICAgICAgICAgIG1pc3NpbmdfcmVxdWlyZW1lbnRzLmFkZChyZXF1aXJlbWVudCkKICAgICAgICAgICAgeWllbGQgcmVxdWlyZW1lbnQKCgpkZWYgZ2V0X2luY29tcGF0aWJsZV9yZXFzKGRpc3QsIGluc3RhbGxlZF9kaXN0cyk6CiAgICAiIiJSZXR1cm4gYWxsIG9mIHRoZSByZXF1aXJlbWVudHMgb2YgYGRpc3RgIHRoYXQgYXJlIHByZXNlbnQgaW4KICAgIGBpbnN0YWxsZWRfZGlzdHNgLCBidXQgaGF2ZSBpbmNvbXBhdGlibGUgdmVyc2lvbnMuCgogICAgIiIiCiAgICBpbnN0YWxsZWRfZGlzdHNfYnlfbmFtZSA9IHt9CiAgICBmb3IgaW5zdGFsbGVkX2Rpc3QgaW4gaW5zdGFsbGVkX2Rpc3RzOgogICAgICAgIGluc3RhbGxlZF9kaXN0c19ieV9uYW1lW2luc3RhbGxlZF9kaXN0LnByb2plY3RfbmFtZV0gPSBpbnN0YWxsZWRfZGlzdAoKICAgIGZvciByZXF1aXJlbWVudCBpbiBkaXN0LnJlcXVpcmVzKCk6CiAgICAgICAgcHJlc2VudF9kaXN0ID0gaW5zdGFsbGVkX2Rpc3RzX2J5X25hbWUuZ2V0KHJlcXVpcmVtZW50LnByb2plY3RfbmFtZSkKCiAgICAgICAgaWYgcHJlc2VudF9kaXN0IGFuZCBwcmVzZW50X2Rpc3Qgbm90IGluIHJlcXVpcmVtZW50OgogICAgICAgICAgICB5aWVsZCAocmVxdWlyZW1lbnQsIHByZXNlbnRfZGlzdCkKUEsDBBQAAAAAAAAAIQD5IjMzShQAAEoUAAAoAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9vcGVyYXRpb25zL2ZyZWV6ZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgcmUKCmltcG9ydCBwaXAKZnJvbSBwaXAucmVxIGltcG9ydCBJbnN0YWxsUmVxdWlyZW1lbnQKZnJvbSBwaXAucmVxLnJlcV9maWxlIGltcG9ydCBDT01NRU5UX1JFCmZyb20gcGlwLnV0aWxzIGltcG9ydCBnZXRfaW5zdGFsbGVkX2Rpc3RyaWJ1dGlvbnMKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgcGtnX3Jlc291cmNlcwpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZy51dGlscyBpbXBvcnQgY2Fub25pY2FsaXplX25hbWUKZnJvbSBwaXAuX3ZlbmRvci5wa2dfcmVzb3VyY2VzIGltcG9ydCBSZXF1aXJlbWVudFBhcnNlRXJyb3IKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpkZWYgZnJlZXplKAogICAgICAgIHJlcXVpcmVtZW50PU5vbmUsCiAgICAgICAgZmluZF9saW5rcz1Ob25lLCBsb2NhbF9vbmx5PU5vbmUsIHVzZXJfb25seT1Ob25lLCBza2lwX3JlZ2V4PU5vbmUsCiAgICAgICAgZGVmYXVsdF92Y3M9Tm9uZSwKICAgICAgICBpc29sYXRlZD1GYWxzZSwKICAgICAgICB3aGVlbF9jYWNoZT1Ob25lLAogICAgICAgIHNraXA9KCkpOgogICAgZmluZF9saW5rcyA9IGZpbmRfbGlua3Mgb3IgW10KICAgIHNraXBfbWF0Y2ggPSBOb25lCgogICAgaWYgc2tpcF9yZWdleDoKICAgICAgICBza2lwX21hdGNoID0gcmUuY29tcGlsZShza2lwX3JlZ2V4KS5zZWFyY2gKCiAgICBkZXBlbmRlbmN5X2xpbmtzID0gW10KCiAgICBmb3IgZGlzdCBpbiBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0OgogICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdkZXBlbmRlbmN5X2xpbmtzLnR4dCcpOgogICAgICAgICAgICBkZXBlbmRlbmN5X2xpbmtzLmV4dGVuZCgKICAgICAgICAgICAgICAgIGRpc3QuZ2V0X21ldGFkYXRhX2xpbmVzKCdkZXBlbmRlbmN5X2xpbmtzLnR4dCcpCiAgICAgICAgICAgICkKICAgIGZvciBsaW5rIGluIGZpbmRfbGlua3M6CiAgICAgICAgaWYgJyNlZ2c9JyBpbiBsaW5rOgogICAgICAgICAgICBkZXBlbmRlbmN5X2xpbmtzLmFwcGVuZChsaW5rKQogICAgZm9yIGxpbmsgaW4gZmluZF9saW5rczoKICAgICAgICB5aWVsZCAnLWYgJXMnICUgbGluawogICAgaW5zdGFsbGF0aW9ucyA9IHt9CiAgICBmb3IgZGlzdCBpbiBnZXRfaW5zdGFsbGVkX2Rpc3RyaWJ1dGlvbnMobG9jYWxfb25seT1sb2NhbF9vbmx5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA9KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9vbmx5PXVzZXJfb25seSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXEgPSBwaXAuRnJvemVuUmVxdWlyZW1lbnQuZnJvbV9kaXN0KAogICAgICAgICAgICAgICAgZGlzdCwKICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lfbGlua3MKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBSZXF1aXJlbWVudFBhcnNlRXJyb3I6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBwYXJzZSByZXF1aXJlbWVudDogJXMiLAogICAgICAgICAgICAgICAgZGlzdC5wcm9qZWN0X25hbWUKICAgICAgICAgICAgKQogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGluc3RhbGxhdGlvbnNbcmVxLm5hbWVdID0gcmVxCgogICAgaWYgcmVxdWlyZW1lbnQ6CiAgICAgICAgIyB0aGUgb3B0aW9ucyB0aGF0IGRvbid0IGdldCB0dXJuZWQgaW50byBhbiBJbnN0YWxsUmVxdWlyZW1lbnQKICAgICAgICAjIHNob3VsZCBvbmx5IGJlIGVtaXR0ZWQgb25jZSwgZXZlbiBpZiB0aGUgc2FtZSBvcHRpb24gaXMgaW4gbXVsdGlwbGUKICAgICAgICAjIHJlcXVpcmVtZW50cyBmaWxlcywgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHdoYXQgaGFzIGJlZW4gZW1pdHRlZAogICAgICAgICMgc28gdGhhdCB3ZSBkb24ndCBlbWl0IGl0IGFnYWluIGlmIGl0J3Mgc2VlbiBhZ2FpbgogICAgICAgIGVtaXR0ZWRfb3B0aW9ucyA9IHNldCgpCiAgICAgICAgZm9yIHJlcV9maWxlX3BhdGggaW4gcmVxdWlyZW1lbnQ6CiAgICAgICAgICAgIHdpdGggb3BlbihyZXFfZmlsZV9wYXRoKSBhcyByZXFfZmlsZToKICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHJlcV9maWxlOgogICAgICAgICAgICAgICAgICAgIGlmIChub3QgbGluZS5zdHJpcCgpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnN0cmlwKCkuc3RhcnRzd2l0aCgnIycpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2tpcF9tYXRjaCBhbmQgc2tpcF9tYXRjaChsaW5lKSkgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuc3RhcnRzd2l0aCgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1yJywgJy0tcmVxdWlyZW1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctWicsICctLWFsd2F5cy11bnppcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1mJywgJy0tZmluZC1saW5rcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1pJywgJy0taW5kZXgtdXJsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS1wcmUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLXRydXN0ZWQtaG9zdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tcHJvY2Vzcy1kZXBlbmRlbmN5LWxpbmtzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS1leHRyYS1pbmRleC11cmwnKSkpOgogICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5yc3RyaXAoKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lIG5vdCBpbiBlbWl0dGVkX29wdGlvbnM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0dGVkX29wdGlvbnMuYWRkKGxpbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnLWUnKSBvciBsaW5lLnN0YXJ0c3dpdGgoJy0tZWRpdGFibGUnKToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCctZScpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbMjpdLnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lW2xlbignLS1lZGl0YWJsZScpOl0uc3RyaXAoKS5sc3RyaXAoJz0nKQogICAgICAgICAgICAgICAgICAgICAgICBsaW5lX3JlcSA9IEluc3RhbGxSZXF1aXJlbWVudC5mcm9tX2VkaXRhYmxlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfdmNzPWRlZmF1bHRfdmNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZWQ9aXNvbGF0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZSwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfcmVxID0gSW5zdGFsbFJlcXVpcmVtZW50LmZyb21fbGluZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1FTlRfUkUuc3ViKCcnLCBsaW5lKS5zdHJpcCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZWQ9aXNvbGF0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZSwKICAgICAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgICAgICBpZiBub3QgbGluZV9yZXEubmFtZToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2tpcHBpbmcgbGluZSBpbiByZXF1aXJlbWVudCBmaWxlIFslc10gYmVjYXVzZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXQncyBub3QgY2xlYXIgd2hhdCBpdCB3b3VsZCBpbnN0YWxsOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfZmlsZV9wYXRoLCBsaW5lLnN0cmlwKCksCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAoYWRkICNlZ2c9UGFja2FnZU5hbWUgdG8gdGhlIFVSTCB0byBhdm9pZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdGhpcyB3YXJuaW5nKSIKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGVsaWYgbGluZV9yZXEubmFtZSBub3QgaW4gaW5zdGFsbGF0aW9uczoKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVxdWlyZW1lbnQgZmlsZSBbJXNdIGNvbnRhaW5zICVzLCBidXQgdGhhdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBpcyBub3QgaW5zdGFsbGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV9maWxlX3BhdGgsIENPTU1FTlRfUkUuc3ViKCcnLCBsaW5lKS5zdHJpcCgpLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgc3RyKGluc3RhbGxhdGlvbnNbbGluZV9yZXEubmFtZV0pLnJzdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBpbnN0YWxsYXRpb25zW2xpbmVfcmVxLm5hbWVdCgogICAgICAgIHlpZWxkKAogICAgICAgICAgICAnIyMgVGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgd2VyZSBhZGRlZCBieSAnCiAgICAgICAgICAgICdwaXAgZnJlZXplOicKICAgICAgICApCiAgICBmb3IgaW5zdGFsbGF0aW9uIGluIHNvcnRlZCgKICAgICAgICAgICAgaW5zdGFsbGF0aW9ucy52YWx1ZXMoKSwga2V5PWxhbWJkYSB4OiB4Lm5hbWUubG93ZXIoKSk6CiAgICAgICAgaWYgY2Fub25pY2FsaXplX25hbWUoaW5zdGFsbGF0aW9uLm5hbWUpIG5vdCBpbiBza2lwOgogICAgICAgICAgICB5aWVsZCBzdHIoaW5zdGFsbGF0aW9uKS5yc3RyaXAoKQpQSwMEFAAAAAAAAAAhAPoohLXkKgAA5CoAACEAAABweXBpX19waXBfOV8wXzMvcGlwL3BlcDQyNXRhZ3MucHkiIiJHZW5lcmF0ZSBhbmQgd29yayB3aXRoIFBFUCA0MjUgQ29tcGF0aWJpbGl0eSBUYWdzLiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHJlCmltcG9ydCBzeXMKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgbG9nZ2luZwoKdHJ5OgogICAgaW1wb3J0IHN5c2NvbmZpZwpleGNlcHQgSW1wb3J0RXJyb3I6ICAjIHByYWdtYSBub2NvdmVyCiAgICAjIFB5dGhvbiA8IDIuNwogICAgaW1wb3J0IGRpc3R1dGlscy5zeXNjb25maWcgYXMgc3lzY29uZmlnCmltcG9ydCBkaXN0dXRpbHMudXRpbAoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBPcmRlcmVkRGljdAppbXBvcnQgcGlwLnV0aWxzLmdsaWJjCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCl9vc3hfYXJjaF9wYXQgPSByZS5jb21waWxlKHInKC4rKV8oXGQrKV8oXGQrKV8oLispJykKCgpkZWYgZ2V0X2NvbmZpZ192YXIodmFyKToKICAgIHRyeToKICAgICAgICByZXR1cm4gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKHZhcikKICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6ICAjIElzc3VlICMxMDc0CiAgICAgICAgd2FybmluZ3Mud2FybigiezB9Ii5mb3JtYXQoZSksIFJ1bnRpbWVXYXJuaW5nKQogICAgICAgIHJldHVybiBOb25lCgoKZGVmIGdldF9hYmJyX2ltcGwoKToKICAgICIiIlJldHVybiBhYmJyZXZpYXRlZCBpbXBsZW1lbnRhdGlvbiBuYW1lLiIiIgogICAgaWYgaGFzYXR0cihzeXMsICdweXB5X3ZlcnNpb25faW5mbycpOgogICAgICAgIHB5aW1wbCA9ICdwcCcKICAgIGVsaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKICAgICAgICBweWltcGwgPSAnanknCiAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAnY2xpJzoKICAgICAgICBweWltcGwgPSAnaXAnCiAgICBlbHNlOgogICAgICAgIHB5aW1wbCA9ICdjcCcKICAgIHJldHVybiBweWltcGwKCgpkZWYgZ2V0X2ltcGxfdmVyKCk6CiAgICAiIiJSZXR1cm4gaW1wbGVtZW50YXRpb24gdmVyc2lvbi4iIiIKICAgIGltcGxfdmVyID0gZ2V0X2NvbmZpZ192YXIoInB5X3ZlcnNpb25fbm9kb3QiKQogICAgaWYgbm90IGltcGxfdmVyIG9yIGdldF9hYmJyX2ltcGwoKSA9PSAncHAnOgogICAgICAgIGltcGxfdmVyID0gJycuam9pbihtYXAoc3RyLCBnZXRfaW1wbF92ZXJzaW9uX2luZm8oKSkpCiAgICByZXR1cm4gaW1wbF92ZXIKCgpkZWYgZ2V0X2ltcGxfdmVyc2lvbl9pbmZvKCk6CiAgICAiIiJSZXR1cm4gc3lzLnZlcnNpb25faW5mby1saWtlIHR1cGxlIGZvciB1c2UgaW4gZGVjcmVtZW50aW5nIHRoZSBtaW5vcgogICAgdmVyc2lvbi4iIiIKICAgIGlmIGdldF9hYmJyX2ltcGwoKSA9PSAncHAnOgogICAgICAgICMgYXMgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMjg4MgogICAgICAgIHJldHVybiAoc3lzLnZlcnNpb25faW5mb1swXSwgc3lzLnB5cHlfdmVyc2lvbl9pbmZvLm1ham9yLAogICAgICAgICAgICAgICAgc3lzLnB5cHlfdmVyc2lvbl9pbmZvLm1pbm9yKQogICAgZWxzZToKICAgICAgICByZXR1cm4gc3lzLnZlcnNpb25faW5mb1swXSwgc3lzLnZlcnNpb25faW5mb1sxXQoKCmRlZiBnZXRfaW1wbF90YWcoKToKICAgICIiIgogICAgUmV0dXJucyB0aGUgVGFnIGZvciB0aGlzIHNwZWNpZmljIGltcGxlbWVudGF0aW9uLgogICAgIiIiCiAgICByZXR1cm4gInswfXsxfSIuZm9ybWF0KGdldF9hYmJyX2ltcGwoKSwgZ2V0X2ltcGxfdmVyKCkpCgoKZGVmIGdldF9mbGFnKHZhciwgZmFsbGJhY2ssIGV4cGVjdGVkPVRydWUsIHdhcm49VHJ1ZSk6CiAgICAiIiJVc2UgYSBmYWxsYmFjayBtZXRob2QgZm9yIGRldGVybWluaW5nIFNPQUJJIGZsYWdzIGlmIHRoZSBuZWVkZWQgY29uZmlnCiAgICB2YXIgaXMgdW5zZXQgb3IgdW5hdmFpbGFibGUuIiIiCiAgICB2YWwgPSBnZXRfY29uZmlnX3Zhcih2YXIpCiAgICBpZiB2YWwgaXMgTm9uZToKICAgICAgICBpZiB3YXJuOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoIkNvbmZpZyB2YXJpYWJsZSAnJXMnIGlzIHVuc2V0LCBQeXRob24gQUJJIHRhZyBtYXkgIgogICAgICAgICAgICAgICAgICAgICAgICAgImJlIGluY29ycmVjdCIsIHZhcikKICAgICAgICByZXR1cm4gZmFsbGJhY2soKQogICAgcmV0dXJuIHZhbCA9PSBleHBlY3RlZAoKCmRlZiBnZXRfYWJpX3RhZygpOgogICAgIiIiUmV0dXJuIHRoZSBBQkkgdGFnIGJhc2VkIG9uIFNPQUJJIChpZiBhdmFpbGFibGUpIG9yIGVtdWxhdGUgU09BQkkKICAgIChDUHl0aG9uIDIsIFB5UHkpLiIiIgogICAgc29hYmkgPSBnZXRfY29uZmlnX3ZhcignU09BQkknKQogICAgaW1wbCA9IGdldF9hYmJyX2ltcGwoKQogICAgaWYgbm90IHNvYWJpIGFuZCBpbXBsIGluICgnY3AnLCAncHAnKSBhbmQgaGFzYXR0cihzeXMsICdtYXh1bmljb2RlJyk6CiAgICAgICAgZCA9ICcnCiAgICAgICAgbSA9ICcnCiAgICAgICAgdSA9ICcnCiAgICAgICAgaWYgZ2V0X2ZsYWcoJ1B5X0RFQlVHJywKICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IGhhc2F0dHIoc3lzLCAnZ2V0dG90YWxyZWZjb3VudCcpLAogICAgICAgICAgICAgICAgICAgIHdhcm49KGltcGwgPT0gJ2NwJykpOgogICAgICAgICAgICBkID0gJ2QnCiAgICAgICAgaWYgZ2V0X2ZsYWcoJ1dJVEhfUFlNQUxMT0MnLAogICAgICAgICAgICAgICAgICAgIGxhbWJkYTogaW1wbCA9PSAnY3AnLAogICAgICAgICAgICAgICAgICAgIHdhcm49KGltcGwgPT0gJ2NwJykpOgogICAgICAgICAgICBtID0gJ20nCiAgICAgICAgaWYgZ2V0X2ZsYWcoJ1B5X1VOSUNPREVfU0laRScsCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBzeXMubWF4dW5pY29kZSA9PSAweDEwZmZmZiwKICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD00LAogICAgICAgICAgICAgICAgICAgIHdhcm49KGltcGwgPT0gJ2NwJyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDMpKSkgXAogICAgICAgICAgICAgICAgYW5kIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMyk6CiAgICAgICAgICAgIHUgPSAndScKICAgICAgICBhYmkgPSAnJXMlcyVzJXMlcycgJSAoaW1wbCwgZ2V0X2ltcGxfdmVyKCksIGQsIG0sIHUpCiAgICBlbGlmIHNvYWJpIGFuZCBzb2FiaS5zdGFydHN3aXRoKCdjcHl0aG9uLScpOgogICAgICAgIGFiaSA9ICdjcCcgKyBzb2FiaS5zcGxpdCgnLScpWzFdCiAgICBlbGlmIHNvYWJpOgogICAgICAgIGFiaSA9IHNvYWJpLnJlcGxhY2UoJy4nLCAnXycpLnJlcGxhY2UoJy0nLCAnXycpCiAgICBlbHNlOgogICAgICAgIGFiaSA9IE5vbmUKICAgIHJldHVybiBhYmkKCgpkZWYgX2lzX3J1bm5pbmdfMzJiaXQoKToKICAgIHJldHVybiBzeXMubWF4c2l6ZSA9PSAyMTQ3NDgzNjQ3CgoKZGVmIGdldF9wbGF0Zm9ybSgpOgogICAgIiIiUmV0dXJuIG91ciBwbGF0Zm9ybSBuYW1lICd3aW4zMicsICdsaW51eF94ODZfNjQnIiIiCiAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CiAgICAgICAgIyBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKSByZXR1cm5zIHRoZSByZWxlYXNlIGJhc2VkIG9uIHRoZSB2YWx1ZQogICAgICAgICMgb2YgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUIG9uIHdoaWNoIFB5dGhvbiB3YXMgYnVpbHQsIHdoaWNoIG1heQogICAgICAgICMgYmUgc2lnbmlmaWNhbnRseSBvbGRlciB0aGFuIHRoZSB1c2VyJ3MgY3VycmVudCBtYWNoaW5lLgogICAgICAgIHJlbGVhc2UsIF8sIG1hY2hpbmUgPSBwbGF0Zm9ybS5tYWNfdmVyKCkKICAgICAgICBzcGxpdF92ZXIgPSByZWxlYXNlLnNwbGl0KCcuJykKCiAgICAgICAgaWYgbWFjaGluZSA9PSAieDg2XzY0IiBhbmQgX2lzX3J1bm5pbmdfMzJiaXQoKToKICAgICAgICAgICAgbWFjaGluZSA9ICJpMzg2IgogICAgICAgIGVsaWYgbWFjaGluZSA9PSAicHBjNjQiIGFuZCBfaXNfcnVubmluZ18zMmJpdCgpOgogICAgICAgICAgICBtYWNoaW5lID0gInBwYyIKCiAgICAgICAgcmV0dXJuICdtYWNvc3hfezB9X3sxfV97Mn0nLmZvcm1hdChzcGxpdF92ZXJbMF0sIHNwbGl0X3ZlclsxXSwgbWFjaGluZSkKCiAgICAjIFhYWCByZW1vdmUgZGlzdHV0aWxzIGRlcGVuZGVuY3kKICAgIHJlc3VsdCA9IGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpLnJlcGxhY2UoJy4nLCAnXycpLnJlcGxhY2UoJy0nLCAnXycpCiAgICBpZiByZXN1bHQgPT0gImxpbnV4X3g4Nl82NCIgYW5kIF9pc19ydW5uaW5nXzMyYml0KCk6CiAgICAgICAgIyAzMiBiaXQgUHl0aG9uIHByb2dyYW0gKHJ1bm5pbmcgb24gYSA2NCBiaXQgTGludXgpOiBwaXAgc2hvdWxkIG9ubHkKICAgICAgICAjIGluc3RhbGwgYW5kIHJ1biAzMiBiaXQgY29tcGlsZWQgZXh0ZW5zaW9ucyBpbiB0aGF0IGNhc2UuCiAgICAgICAgcmVzdWx0ID0gImxpbnV4X2k2ODYiCgogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBpc19tYW55bGludXgxX2NvbXBhdGlibGUoKToKICAgICMgT25seSBMaW51eCwgYW5kIG9ubHkgeDg2LTY0IC8gaTY4NgogICAgaWYgZ2V0X3BsYXRmb3JtKCkgbm90IGluICgibGludXhfeDg2XzY0IiwgImxpbnV4X2k2ODYiKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAjIENoZWNrIGZvciBwcmVzZW5jZSBvZiBfbWFueWxpbnV4IG1vZHVsZQogICAgdHJ5OgogICAgICAgIGltcG9ydCBfbWFueWxpbnV4CiAgICAgICAgcmV0dXJuIGJvb2woX21hbnlsaW51eC5tYW55bGludXgxX2NvbXBhdGlibGUpCiAgICBleGNlcHQgKEltcG9ydEVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CiAgICAgICAgIyBGYWxsIHRocm91Z2ggdG8gaGV1cmlzdGljIGNoZWNrIGJlbG93CiAgICAgICAgcGFzcwoKICAgICMgQ2hlY2sgZ2xpYmMgdmVyc2lvbi4gQ2VudE9TIDUgdXNlcyBnbGliYyAyLjUuCiAgICByZXR1cm4gcGlwLnV0aWxzLmdsaWJjLmhhdmVfY29tcGF0aWJsZV9nbGliYygyLCA1KQoKCmRlZiBnZXRfZGFyd2luX2FyY2hlcyhtYWpvciwgbWlub3IsIG1hY2hpbmUpOgogICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBzdXBwb3J0ZWQgYXJjaGVzIChpbmNsdWRpbmcgZ3JvdXAgYXJjaGVzKSBmb3IKICAgIHRoZSBnaXZlbiBtYWpvciwgbWlub3IgYW5kIG1hY2hpbmUgYXJjaGl0ZWN0dXJlIG9mIGFuIG1hY09TIG1hY2hpbmUuCiAgICAiIiIKICAgIGFyY2hlcyA9IFtdCgogICAgZGVmIF9zdXBwb3J0c19hcmNoKG1ham9yLCBtaW5vciwgYXJjaCk6CiAgICAgICAgIyBMb29raW5nIGF0IHRoZSBhcHBsaWNhdGlvbiBzdXBwb3J0IGZvciBtYWNPUyB2ZXJzaW9ucyBpbiB0aGUgY2hhcnQKICAgICAgICAjIHByb3ZpZGVkIGJ5IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09TX1gjVmVyc2lvbnMgaXQgYXBwZWFycwogICAgICAgICMgb3VyIHRpbWVsaW5lIGxvb2tzIHJvdWdobHkgbGlrZToKICAgICAgICAjCiAgICAgICAgIyAxMC4wIC0gSW50cm9kdWNlcyBwcGMgc3VwcG9ydC4KICAgICAgICAjIDEwLjQgLSBJbnRyb2R1Y2VzIHBwYzY0LCBpMzg2LCBhbmQgeDg2XzY0IHN1cHBvcnQsIGhvd2V2ZXIgdGhlIHBwYzY0CiAgICAgICAgIyAgICAgICAgYW5kIHg4Nl82NCBzdXBwb3J0IGlzIENMSSBvbmx5LCBhbmQgY2Fubm90IGJlIHVzZWQgZm9yIEdVSQogICAgICAgICMgICAgICAgIGFwcGxpY2F0aW9ucy4KICAgICAgICAjIDEwLjUgLSBFeHRlbmRzIHBwYzY0IGFuZCB4ODZfNjQgc3VwcG9ydCB0byBjb3ZlciBHVUkgYXBwbGljYXRpb25zLgogICAgICAgICMgMTAuNiAtIERyb3BzIHN1cHBvcnQgZm9yIHBwYzY0CiAgICAgICAgIyAxMC43IC0gRHJvcHMgc3VwcG9ydCBmb3IgcHBjCiAgICAgICAgIwogICAgICAgICMgR2l2ZW4gdGhhdCB3ZSBkbyBub3Qga25vdyBpZiB3ZSdyZSBpbnN0YWxsaW5nIGEgQ0xJIG9yIGEgR1VJCiAgICAgICAgIyBhcHBsaWNhdGlvbiwgd2UgbXVzdCBiZSBjb25zZXJ2YXRpdmUgYW5kIGFzc3VtZSBpdCBtaWdodCBiZSBhIEdVSQogICAgICAgICMgYXBwbGljYXRpb24gYW5kIGJlaGF2ZSBhcyBpZiBwcGM2NCBhbmQgeDg2XzY0IHN1cHBvcnQgZGlkIG5vdCBvY2N1cgogICAgICAgICMgdW50aWwgMTAuNS4KICAgICAgICAjCiAgICAgICAgIyBOb3RlOiBUaGUgYWJvdmUgaW5mb3JtYXRpb24gaXMgdGFrZW4gZnJvbSB0aGUgIkFwcGxpY2F0aW9uIHN1cHBvcnQiCiAgICAgICAgIyAgICAgICBjb2x1bW4gaW4gdGhlIGNoYXJ0IG5vdCB0aGUgIlByb2Nlc3NvciBzdXBwb3J0IiBzaW5jZSBJIGJlbGlldmUKICAgICAgICAjICAgICAgIHRoYXQgd2UgY2FyZSBhYm91dCB3aGF0IGluc3RydWN0aW9uIHNldHMgYW4gYXBwbGljYXRpb24gY2FuIHVzZQogICAgICAgICMgICAgICAgbm90IHdoaWNoIHByb2Nlc3NvcnMgdGhlIE9TIHN1cHBvcnRzLgogICAgICAgIGlmIGFyY2ggPT0gJ3BwYyc6CiAgICAgICAgICAgIHJldHVybiAobWFqb3IsIG1pbm9yKSA8PSAoMTAsIDUpCiAgICAgICAgaWYgYXJjaCA9PSAncHBjNjQnOgogICAgICAgICAgICByZXR1cm4gKG1ham9yLCBtaW5vcikgPT0gKDEwLCA1KQogICAgICAgIGlmIGFyY2ggPT0gJ2kzODYnOgogICAgICAgICAgICByZXR1cm4gKG1ham9yLCBtaW5vcikgPj0gKDEwLCA0KQogICAgICAgIGlmIGFyY2ggPT0gJ3g4Nl82NCc6CiAgICAgICAgICAgIHJldHVybiAobWFqb3IsIG1pbm9yKSA+PSAoMTAsIDUpCiAgICAgICAgaWYgYXJjaCBpbiBncm91cHM6CiAgICAgICAgICAgIGZvciBnYXJjaCBpbiBncm91cHNbYXJjaF06CiAgICAgICAgICAgICAgICBpZiBfc3VwcG9ydHNfYXJjaChtYWpvciwgbWlub3IsIGdhcmNoKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGdyb3VwcyA9IE9yZGVyZWREaWN0KFsKICAgICAgICAoImZhdCIsICgiaTM4NiIsICJwcGMiKSksCiAgICAgICAgKCJpbnRlbCIsICgieDg2XzY0IiwgImkzODYiKSksCiAgICAgICAgKCJmYXQ2NCIsICgieDg2XzY0IiwgInBwYzY0IikpLAogICAgICAgICgiZmF0MzIiLCAoIng4Nl82NCIsICJpMzg2IiwgInBwYyIpKSwKICAgIF0pCgogICAgaWYgX3N1cHBvcnRzX2FyY2gobWFqb3IsIG1pbm9yLCBtYWNoaW5lKToKICAgICAgICBhcmNoZXMuYXBwZW5kKG1hY2hpbmUpCgogICAgZm9yIGdhcmNoIGluIGdyb3VwczoKICAgICAgICBpZiBtYWNoaW5lIGluIGdyb3Vwc1tnYXJjaF0gYW5kIF9zdXBwb3J0c19hcmNoKG1ham9yLCBtaW5vciwgZ2FyY2gpOgogICAgICAgICAgICBhcmNoZXMuYXBwZW5kKGdhcmNoKQoKICAgIGFyY2hlcy5hcHBlbmQoJ3VuaXZlcnNhbCcpCgogICAgcmV0dXJuIGFyY2hlcwoKCmRlZiBnZXRfc3VwcG9ydGVkKHZlcnNpb25zPU5vbmUsIG5vYXJjaD1GYWxzZSwgcGxhdGZvcm09Tm9uZSwKICAgICAgICAgICAgICAgICAgaW1wbD1Ob25lLCBhYmk9Tm9uZSk6CiAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHN1cHBvcnRlZCB0YWdzIGZvciBlYWNoIHZlcnNpb24gc3BlY2lmaWVkIGluCiAgICBgdmVyc2lvbnNgLgoKICAgIDpwYXJhbSB2ZXJzaW9uczogYSBsaXN0IG9mIHN0cmluZyB2ZXJzaW9ucywgb2YgdGhlIGZvcm0gWyIzMyIsICIzMiJdLAogICAgICAgIG9yIE5vbmUuIFRoZSBmaXJzdCB2ZXJzaW9uIHdpbGwgYmUgYXNzdW1lZCB0byBzdXBwb3J0IG91ciBBQkkuCiAgICA6cGFyYW0gcGxhdGZvcm06IHNwZWNpZnkgdGhlIGV4YWN0IHBsYXRmb3JtIHlvdSB3YW50IHZhbGlkCiAgICAgICAgdGFncyBmb3IsIG9yIE5vbmUuIElmIE5vbmUsIHVzZSB0aGUgbG9jYWwgc3lzdGVtIHBsYXRmb3JtLgogICAgOnBhcmFtIGltcGw6IHNwZWNpZnkgdGhlIGV4YWN0IGltcGxlbWVudGF0aW9uIHlvdSB3YW50IHZhbGlkCiAgICAgICAgdGFncyBmb3IsIG9yIE5vbmUuIElmIE5vbmUsIHVzZSB0aGUgbG9jYWwgaW50ZXJwcmV0ZXIgaW1wbC4KICAgIDpwYXJhbSBhYmk6IHNwZWNpZnkgdGhlIGV4YWN0IGFiaSB5b3Ugd2FudCB2YWxpZAogICAgICAgIHRhZ3MgZm9yLCBvciBOb25lLiBJZiBOb25lLCB1c2UgdGhlIGxvY2FsIGludGVycHJldGVyIGFiaS4KICAgICIiIgogICAgc3VwcG9ydGVkID0gW10KCiAgICAjIFZlcnNpb25zIG11c3QgYmUgZ2l2ZW4gd2l0aCByZXNwZWN0IHRvIHRoZSBwcmVmZXJlbmNlCiAgICBpZiB2ZXJzaW9ucyBpcyBOb25lOgogICAgICAgIHZlcnNpb25zID0gW10KICAgICAgICB2ZXJzaW9uX2luZm8gPSBnZXRfaW1wbF92ZXJzaW9uX2luZm8oKQogICAgICAgIG1ham9yID0gdmVyc2lvbl9pbmZvWzotMV0KICAgICAgICAjIFN1cHBvcnQgYWxsIHByZXZpb3VzIG1pbm9yIFB5dGhvbiB2ZXJzaW9ucy4KICAgICAgICBmb3IgbWlub3IgaW4gcmFuZ2UodmVyc2lvbl9pbmZvWy0xXSwgLTEsIC0xKToKICAgICAgICAgICAgdmVyc2lvbnMuYXBwZW5kKCcnLmpvaW4obWFwKHN0ciwgbWFqb3IgKyAobWlub3IsKSkpKQoKICAgIGltcGwgPSBpbXBsIG9yIGdldF9hYmJyX2ltcGwoKQoKICAgIGFiaXMgPSBbXQoKICAgIGFiaSA9IGFiaSBvciBnZXRfYWJpX3RhZygpCiAgICBpZiBhYmk6CiAgICAgICAgYWJpc1swOjBdID0gW2FiaV0KCiAgICBhYmkzcyA9IHNldCgpCiAgICBpbXBvcnQgaW1wCiAgICBmb3Igc3VmZml4IGluIGltcC5nZXRfc3VmZml4ZXMoKToKICAgICAgICBpZiBzdWZmaXhbMF0uc3RhcnRzd2l0aCgnLmFiaScpOgogICAgICAgICAgICBhYmkzcy5hZGQoc3VmZml4WzBdLnNwbGl0KCcuJywgMilbMV0pCgogICAgYWJpcy5leHRlbmQoc29ydGVkKGxpc3QoYWJpM3MpKSkKCiAgICBhYmlzLmFwcGVuZCgnbm9uZScpCgogICAgaWYgbm90IG5vYXJjaDoKICAgICAgICBhcmNoID0gcGxhdGZvcm0gb3IgZ2V0X3BsYXRmb3JtKCkKICAgICAgICBpZiBhcmNoLnN0YXJ0c3dpdGgoJ21hY29zeCcpOgogICAgICAgICAgICAjIHN1cHBvcnQgbWFjb3N4LTEwLjYtaW50ZWwgb24gbWFjb3N4LTEwLjkteDg2XzY0CiAgICAgICAgICAgIG1hdGNoID0gX29zeF9hcmNoX3BhdC5tYXRjaChhcmNoKQogICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgIG5hbWUsIG1ham9yLCBtaW5vciwgYWN0dWFsX2FyY2ggPSBtYXRjaC5ncm91cHMoKQogICAgICAgICAgICAgICAgdHBsID0gJ3swfV97MX1fJWlfJXMnLmZvcm1hdChuYW1lLCBtYWpvcikKICAgICAgICAgICAgICAgIGFyY2hlcyA9IFtdCiAgICAgICAgICAgICAgICBmb3IgbSBpbiByZXZlcnNlZChyYW5nZShpbnQobWlub3IpICsgMSkpOgogICAgICAgICAgICAgICAgICAgIGZvciBhIGluIGdldF9kYXJ3aW5fYXJjaGVzKGludChtYWpvciksIG0sIGFjdHVhbF9hcmNoKToKICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGVzLmFwcGVuZCh0cGwgJSAobSwgYSkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGFyY2ggcGF0dGVybiBkaWRuJ3QgbWF0Y2ggKD8hKQogICAgICAgICAgICAgICAgYXJjaGVzID0gW2FyY2hdCiAgICAgICAgZWxpZiBwbGF0Zm9ybSBpcyBOb25lIGFuZCBpc19tYW55bGludXgxX2NvbXBhdGlibGUoKToKICAgICAgICAgICAgYXJjaGVzID0gW2FyY2gucmVwbGFjZSgnbGludXgnLCAnbWFueWxpbnV4MScpLCBhcmNoXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFyY2hlcyA9IFthcmNoXQoKICAgICAgICAjIEN1cnJlbnQgdmVyc2lvbiwgY3VycmVudCBBUEkgKGJ1aWx0IHNwZWNpZmljYWxseSBmb3Igb3VyIFB5dGhvbik6CiAgICAgICAgZm9yIGFiaSBpbiBhYmlzOgogICAgICAgICAgICBmb3IgYXJjaCBpbiBhcmNoZXM6CiAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgnJXMlcycgJSAoaW1wbCwgdmVyc2lvbnNbMF0pLCBhYmksIGFyY2gpKQoKICAgICAgICAjIGFiaTMgbW9kdWxlcyBjb21wYXRpYmxlIHdpdGggb2xkZXIgdmVyc2lvbiBvZiBQeXRob24KICAgICAgICBmb3IgdmVyc2lvbiBpbiB2ZXJzaW9uc1sxOl06CiAgICAgICAgICAgICMgYWJpMyB3YXMgaW50cm9kdWNlZCBpbiBQeXRob24gMy4yCiAgICAgICAgICAgIGlmIHZlcnNpb24gaW4gKCczMScsICczMCcpOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZm9yIGFiaSBpbiBhYmkzczogICAjIGVtcHR5IHNldCBpZiBub3QgUHl0aG9uIDMKICAgICAgICAgICAgICAgIGZvciBhcmNoIGluIGFyY2hlczoKICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgiJXMlcyIgJSAoaW1wbCwgdmVyc2lvbiksIGFiaSwgYXJjaCkpCgogICAgICAgICMgSGFzIGJpbmFyaWVzLCBkb2VzIG5vdCB1c2UgdGhlIFB5dGhvbiBBUEk6CiAgICAgICAgZm9yIGFyY2ggaW4gYXJjaGVzOgogICAgICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgncHklcycgJSAodmVyc2lvbnNbMF1bMF0pLCAnbm9uZScsIGFyY2gpKQoKICAgICMgTm8gYWJpIC8gYXJjaCwgYnV0IHJlcXVpcmVzIG91ciBpbXBsZW1lbnRhdGlvbjoKICAgIHN1cHBvcnRlZC5hcHBlbmQoKCclcyVzJyAlIChpbXBsLCB2ZXJzaW9uc1swXSksICdub25lJywgJ2FueScpKQogICAgIyBUYWdnZWQgc3BlY2lmaWNhbGx5IGFzIGJlaW5nIGNyb3NzLXZlcnNpb24gY29tcGF0aWJsZQogICAgIyAod2l0aCBqdXN0IHRoZSBtYWpvciB2ZXJzaW9uIHNwZWNpZmllZCkKICAgIHN1cHBvcnRlZC5hcHBlbmQoKCclcyVzJyAlIChpbXBsLCB2ZXJzaW9uc1swXVswXSksICdub25lJywgJ2FueScpKQoKICAgICMgTm8gYWJpIC8gYXJjaCwgZ2VuZXJpYyBQeXRob24KICAgIGZvciBpLCB2ZXJzaW9uIGluIGVudW1lcmF0ZSh2ZXJzaW9ucyk6CiAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJ3B5JXMnICUgKHZlcnNpb24sKSwgJ25vbmUnLCAnYW55JykpCiAgICAgICAgaWYgaSA9PSAwOgogICAgICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgncHklcycgJSAodmVyc2lvblswXSksICdub25lJywgJ2FueScpKQoKICAgIHJldHVybiBzdXBwb3J0ZWQKCnN1cHBvcnRlZF90YWdzID0gZ2V0X3N1cHBvcnRlZCgpCnN1cHBvcnRlZF90YWdzX25vYXJjaCA9IGdldF9zdXBwb3J0ZWQobm9hcmNoPVRydWUpCgppbXBsZW1lbnRhdGlvbl90YWcgPSBnZXRfaW1wbF90YWcoKQpQSwMEFAAAAAAAAAAhAFxp0hkUAQAAFAEAACMAAABweXBpX19waXBfOV8wXzMvcGlwL3JlcS9fX2luaXRfXy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgpmcm9tIC5yZXFfaW5zdGFsbCBpbXBvcnQgSW5zdGFsbFJlcXVpcmVtZW50CmZyb20gLnJlcV9zZXQgaW1wb3J0IFJlcXVpcmVtZW50U2V0LCBSZXF1aXJlbWVudHMKZnJvbSAucmVxX2ZpbGUgaW1wb3J0IHBhcnNlX3JlcXVpcmVtZW50cwoKX19hbGxfXyA9IFsKICAgICJSZXF1aXJlbWVudFNldCIsICJSZXF1aXJlbWVudHMiLCAiSW5zdGFsbFJlcXVpcmVtZW50IiwKICAgICJwYXJzZV9yZXF1aXJlbWVudHMiLApdClBLAwQUAAAAAAAAACEAHOCMCpYuAACWLgAAIwAAAHB5cGlfX3BpcF85XzBfMy9waXAvcmVxL3JlcV9maWxlLnB5IiIiClJlcXVpcmVtZW50cyBmaWxlIHBhcnNpbmcKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgc2hsZXgKaW1wb3J0IHN5cwppbXBvcnQgb3B0cGFyc2UKaW1wb3J0IHdhcm5pbmdzCgpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybGxpYl9wYXJzZQpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3ZlcyBpbXBvcnQgZmlsdGVyZmFsc2UKCmltcG9ydCBwaXAKZnJvbSBwaXAuZG93bmxvYWQgaW1wb3J0IGdldF9maWxlX2NvbnRlbnQKZnJvbSBwaXAucmVxLnJlcV9pbnN0YWxsIGltcG9ydCBJbnN0YWxsUmVxdWlyZW1lbnQKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgKFJlcXVpcmVtZW50c0ZpbGVQYXJzZUVycm9yKQpmcm9tIHBpcC51dGlscy5kZXByZWNhdGlvbiBpbXBvcnQgUmVtb3ZlZEluUGlwMTBXYXJuaW5nCmZyb20gcGlwIGltcG9ydCBjbWRvcHRpb25zCgpfX2FsbF9fID0gWydwYXJzZV9yZXF1aXJlbWVudHMnXQoKU0NIRU1FX1JFID0gcmUuY29tcGlsZShyJ14oaHR0cHxodHRwc3xmaWxlKTonLCByZS5JKQpDT01NRU5UX1JFID0gcmUuY29tcGlsZShyJyhefFxzKSsjLiokJykKClNVUFBPUlRFRF9PUFRJT05TID0gWwogICAgY21kb3B0aW9ucy5jb25zdHJhaW50cywKICAgIGNtZG9wdGlvbnMuZWRpdGFibGUsCiAgICBjbWRvcHRpb25zLnJlcXVpcmVtZW50cywKICAgIGNtZG9wdGlvbnMubm9faW5kZXgsCiAgICBjbWRvcHRpb25zLmluZGV4X3VybCwKICAgIGNtZG9wdGlvbnMuZmluZF9saW5rcywKICAgIGNtZG9wdGlvbnMuZXh0cmFfaW5kZXhfdXJsLAogICAgY21kb3B0aW9ucy5hbGxvd19leHRlcm5hbCwKICAgIGNtZG9wdGlvbnMuYWxsb3dfYWxsX2V4dGVybmFsLAogICAgY21kb3B0aW9ucy5ub19hbGxvd19leHRlcm5hbCwKICAgIGNtZG9wdGlvbnMuYWxsb3dfdW5zYWZlLAogICAgY21kb3B0aW9ucy5ub19hbGxvd191bnNhZmUsCiAgICBjbWRvcHRpb25zLnVzZV93aGVlbCwKICAgIGNtZG9wdGlvbnMubm9fdXNlX3doZWVsLAogICAgY21kb3B0aW9ucy5hbHdheXNfdW56aXAsCiAgICBjbWRvcHRpb25zLm5vX2JpbmFyeSwKICAgIGNtZG9wdGlvbnMub25seV9iaW5hcnksCiAgICBjbWRvcHRpb25zLnByZSwKICAgIGNtZG9wdGlvbnMucHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzLAogICAgY21kb3B0aW9ucy50cnVzdGVkX2hvc3QsCiAgICBjbWRvcHRpb25zLnJlcXVpcmVfaGFzaGVzLApdCgojIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRvIHJlcXVpcmVtZW50cwpTVVBQT1JURURfT1BUSU9OU19SRVEgPSBbCiAgICBjbWRvcHRpb25zLmluc3RhbGxfb3B0aW9ucywKICAgIGNtZG9wdGlvbnMuZ2xvYmFsX29wdGlvbnMsCiAgICBjbWRvcHRpb25zLmhhc2gsCl0KCiMgdGhlICdkZXN0JyBzdHJpbmcgdmFsdWVzClNVUFBPUlRFRF9PUFRJT05TX1JFUV9ERVNUID0gW28oKS5kZXN0IGZvciBvIGluIFNVUFBPUlRFRF9PUFRJT05TX1JFUV0KCgpkZWYgcGFyc2VfcmVxdWlyZW1lbnRzKGZpbGVuYW1lLCBmaW5kZXI9Tm9uZSwgY29tZXNfZnJvbT1Ob25lLCBvcHRpb25zPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbj1Ob25lLCBjb25zdHJhaW50PUZhbHNlLCB3aGVlbF9jYWNoZT1Ob25lKToKICAgICIiIlBhcnNlIGEgcmVxdWlyZW1lbnRzIGZpbGUgYW5kIHlpZWxkIEluc3RhbGxSZXF1aXJlbWVudCBpbnN0YW5jZXMuCgogICAgOnBhcmFtIGZpbGVuYW1lOiAgICBQYXRoIG9yIHVybCBvZiByZXF1aXJlbWVudHMgZmlsZS4KICAgIDpwYXJhbSBmaW5kZXI6ICAgICAgSW5zdGFuY2Ugb2YgcGlwLmluZGV4LlBhY2thZ2VGaW5kZXIuCiAgICA6cGFyYW0gY29tZXNfZnJvbTogIE9yaWdpbiBkZXNjcmlwdGlvbiBvZiByZXF1aXJlbWVudHMuCiAgICA6cGFyYW0gb3B0aW9uczogICAgIGNsaSBvcHRpb25zLgogICAgOnBhcmFtIHNlc3Npb246ICAgICBJbnN0YW5jZSBvZiBwaXAuZG93bmxvYWQuUGlwU2Vzc2lvbi4KICAgIDpwYXJhbSBjb25zdHJhaW50OiAgSWYgdHJ1ZSwgcGFyc2luZyBhIGNvbnN0cmFpbnQgZmlsZSByYXRoZXIgdGhhbgogICAgICAgIHJlcXVpcmVtZW50cyBmaWxlLgogICAgOnBhcmFtIHdoZWVsX2NhY2hlOiBJbnN0YW5jZSBvZiBwaXAud2hlZWwuV2hlZWxDYWNoZQogICAgIiIiCiAgICBpZiBzZXNzaW9uIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKAogICAgICAgICAgICAicGFyc2VfcmVxdWlyZW1lbnRzKCkgbWlzc2luZyAxIHJlcXVpcmVkIGtleXdvcmQgYXJndW1lbnQ6ICIKICAgICAgICAgICAgIidzZXNzaW9uJyIKICAgICAgICApCgogICAgXywgY29udGVudCA9IGdldF9maWxlX2NvbnRlbnQoCiAgICAgICAgZmlsZW5hbWUsIGNvbWVzX2Zyb209Y29tZXNfZnJvbSwgc2Vzc2lvbj1zZXNzaW9uCiAgICApCgogICAgbGluZXNfZW51bSA9IHByZXByb2Nlc3MoY29udGVudCwgb3B0aW9ucykKCiAgICBmb3IgbGluZV9udW1iZXIsIGxpbmUgaW4gbGluZXNfZW51bToKICAgICAgICByZXFfaXRlciA9IHByb2Nlc3NfbGluZShsaW5lLCBmaWxlbmFtZSwgbGluZV9udW1iZXIsIGZpbmRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21lc19mcm9tLCBvcHRpb25zLCBzZXNzaW9uLCB3aGVlbF9jYWNoZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50PWNvbnN0cmFpbnQpCiAgICAgICAgZm9yIHJlcSBpbiByZXFfaXRlcjoKICAgICAgICAgICAgeWllbGQgcmVxCgoKZGVmIHByZXByb2Nlc3MoY29udGVudCwgb3B0aW9ucyk6CiAgICAiIiJTcGxpdCwgZmlsdGVyLCBhbmQgam9pbiBsaW5lcywgYW5kIHJldHVybiBhIGxpbmUgaXRlcmF0b3IKCiAgICA6cGFyYW0gY29udGVudDogdGhlIGNvbnRlbnQgb2YgdGhlIHJlcXVpcmVtZW50cyBmaWxlCiAgICA6cGFyYW0gb3B0aW9uczogY2xpIG9wdGlvbnMKICAgICIiIgogICAgbGluZXNfZW51bSA9IGVudW1lcmF0ZShjb250ZW50LnNwbGl0bGluZXMoKSwgc3RhcnQ9MSkKICAgIGxpbmVzX2VudW0gPSBqb2luX2xpbmVzKGxpbmVzX2VudW0pCiAgICBsaW5lc19lbnVtID0gaWdub3JlX2NvbW1lbnRzKGxpbmVzX2VudW0pCiAgICBsaW5lc19lbnVtID0gc2tpcF9yZWdleChsaW5lc19lbnVtLCBvcHRpb25zKQogICAgcmV0dXJuIGxpbmVzX2VudW0KCgpkZWYgcHJvY2Vzc19saW5lKGxpbmUsIGZpbGVuYW1lLCBsaW5lX251bWJlciwgZmluZGVyPU5vbmUsIGNvbWVzX2Zyb209Tm9uZSwKICAgICAgICAgICAgICAgICBvcHRpb25zPU5vbmUsIHNlc3Npb249Tm9uZSwgd2hlZWxfY2FjaGU9Tm9uZSwKICAgICAgICAgICAgICAgICBjb25zdHJhaW50PUZhbHNlKToKICAgICIiIlByb2Nlc3MgYSBzaW5nbGUgcmVxdWlyZW1lbnRzIGxpbmU7IFRoaXMgY2FuIHJlc3VsdCBpbiBjcmVhdGluZy95aWVsZGluZwogICAgcmVxdWlyZW1lbnRzLCBvciB1cGRhdGluZyB0aGUgZmluZGVyLgoKICAgIEZvciBsaW5lcyB0aGF0IGNvbnRhaW4gcmVxdWlyZW1lbnRzLCB0aGUgb25seSBvcHRpb25zIHRoYXQgaGF2ZSBhbiBlZmZlY3QKICAgIGFyZSBmcm9tIFNVUFBPUlRFRF9PUFRJT05TX1JFUSwgYW5kIHRoZXkgYXJlIHNjb3BlZCB0byB0aGUKICAgIHJlcXVpcmVtZW50LiBPdGhlciBvcHRpb25zIGZyb20gU1VQUE9SVEVEX09QVElPTlMgbWF5IGJlIHByZXNlbnQsIGJ1dCBhcmUKICAgIGlnbm9yZWQuCgogICAgRm9yIGxpbmVzIHRoYXQgZG8gbm90IGNvbnRhaW4gcmVxdWlyZW1lbnRzLCB0aGUgb25seSBvcHRpb25zIHRoYXQgaGF2ZSBhbgogICAgZWZmZWN0IGFyZSBmcm9tIFNVUFBPUlRFRF9PUFRJT05TLiBPcHRpb25zIGZyb20gU1VQUE9SVEVEX09QVElPTlNfUkVRIG1heQogICAgYmUgcHJlc2VudCwgYnV0IGFyZSBpZ25vcmVkLiBUaGVzZSBsaW5lcyBtYXkgY29udGFpbiBtdWx0aXBsZSBvcHRpb25zCiAgICAoYWx0aG91Z2ggb3VyIGRvY3MgaW1wbHkgb25seSBvbmUgaXMgc3VwcG9ydGVkKSwgYW5kIGFsbCBvdXIgcGFyc2VkIGFuZAogICAgYWZmZWN0IHRoZSBmaW5kZXIuCgogICAgOnBhcmFtIGNvbnN0cmFpbnQ6IElmIFRydWUsIHBhcnNpbmcgYSBjb25zdHJhaW50cyBmaWxlLgogICAgOnBhcmFtIG9wdGlvbnM6IE9wdGlvblBhcnNlciBvcHRpb25zIHRoYXQgd2UgbWF5IHVwZGF0ZQogICAgIiIiCiAgICBwYXJzZXIgPSBidWlsZF9wYXJzZXIoKQogICAgZGVmYXVsdHMgPSBwYXJzZXIuZ2V0X2RlZmF1bHRfdmFsdWVzKCkKICAgIGRlZmF1bHRzLmluZGV4X3VybCA9IE5vbmUKICAgIGlmIGZpbmRlcjoKICAgICAgICAjIGBmaW5kZXIuZm9ybWF0X2NvbnRyb2xgIHdpbGwgYmUgdXBkYXRlZCBkdXJpbmcgcGFyc2luZwogICAgICAgIGRlZmF1bHRzLmZvcm1hdF9jb250cm9sID0gZmluZGVyLmZvcm1hdF9jb250cm9sCiAgICBhcmdzX3N0ciwgb3B0aW9uc19zdHIgPSBicmVha19hcmdzX29wdGlvbnMobGluZSkKICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNywgMyk6CiAgICAgICAgIyBQcmlvciB0byAyLjcuMywgc2hsZXggY2Fubm90IGRlYWwgd2l0aCB1bmljb2RlIGVudHJpZXMKICAgICAgICBvcHRpb25zX3N0ciA9IG9wdGlvbnNfc3RyLmVuY29kZSgndXRmOCcpCiAgICBvcHRzLCBfID0gcGFyc2VyLnBhcnNlX2FyZ3Moc2hsZXguc3BsaXQob3B0aW9uc19zdHIpLCBkZWZhdWx0cykKCiAgICAjIHByZXNlcnZlIGZvciB0aGUgbmVzdGVkIGNvZGUgcGF0aAogICAgbGluZV9jb21lc19mcm9tID0gJyVzICVzIChsaW5lICVzKScgJSAoCiAgICAgICAgJy1jJyBpZiBjb25zdHJhaW50IGVsc2UgJy1yJywgZmlsZW5hbWUsIGxpbmVfbnVtYmVyKQoKICAgICMgeWllbGQgYSBsaW5lIHJlcXVpcmVtZW50CiAgICBpZiBhcmdzX3N0cjoKICAgICAgICBpc29sYXRlZCA9IG9wdGlvbnMuaXNvbGF0ZWRfbW9kZSBpZiBvcHRpb25zIGVsc2UgRmFsc2UKICAgICAgICBpZiBvcHRpb25zOgogICAgICAgICAgICBjbWRvcHRpb25zLmNoZWNrX2luc3RhbGxfYnVpbGRfZ2xvYmFsKG9wdGlvbnMsIG9wdHMpCiAgICAgICAgIyBnZXQgdGhlIG9wdGlvbnMgdGhhdCBhcHBseSB0byByZXF1aXJlbWVudHMKICAgICAgICByZXFfb3B0aW9ucyA9IHt9CiAgICAgICAgZm9yIGRlc3QgaW4gU1VQUE9SVEVEX09QVElPTlNfUkVRX0RFU1Q6CiAgICAgICAgICAgIGlmIGRlc3QgaW4gb3B0cy5fX2RpY3RfXyBhbmQgb3B0cy5fX2RpY3RfX1tkZXN0XToKICAgICAgICAgICAgICAgIHJlcV9vcHRpb25zW2Rlc3RdID0gb3B0cy5fX2RpY3RfX1tkZXN0XQogICAgICAgIHlpZWxkIEluc3RhbGxSZXF1aXJlbWVudC5mcm9tX2xpbmUoCiAgICAgICAgICAgIGFyZ3Nfc3RyLCBsaW5lX2NvbWVzX2Zyb20sIGNvbnN0cmFpbnQ9Y29uc3RyYWludCwKICAgICAgICAgICAgaXNvbGF0ZWQ9aXNvbGF0ZWQsIG9wdGlvbnM9cmVxX29wdGlvbnMsIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlCiAgICAgICAgKQoKICAgICMgeWllbGQgYW4gZWRpdGFibGUgcmVxdWlyZW1lbnQKICAgIGVsaWYgb3B0cy5lZGl0YWJsZXM6CiAgICAgICAgaXNvbGF0ZWQgPSBvcHRpb25zLmlzb2xhdGVkX21vZGUgaWYgb3B0aW9ucyBlbHNlIEZhbHNlCiAgICAgICAgZGVmYXVsdF92Y3MgPSBvcHRpb25zLmRlZmF1bHRfdmNzIGlmIG9wdGlvbnMgZWxzZSBOb25lCiAgICAgICAgeWllbGQgSW5zdGFsbFJlcXVpcmVtZW50LmZyb21fZWRpdGFibGUoCiAgICAgICAgICAgIG9wdHMuZWRpdGFibGVzWzBdLCBjb21lc19mcm9tPWxpbmVfY29tZXNfZnJvbSwKICAgICAgICAgICAgY29uc3RyYWludD1jb25zdHJhaW50LCBkZWZhdWx0X3Zjcz1kZWZhdWx0X3ZjcywgaXNvbGF0ZWQ9aXNvbGF0ZWQsCiAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlCiAgICAgICAgKQoKICAgICMgcGFyc2UgYSBuZXN0ZWQgcmVxdWlyZW1lbnRzIGZpbGUKICAgIGVsaWYgb3B0cy5yZXF1aXJlbWVudHMgb3Igb3B0cy5jb25zdHJhaW50czoKICAgICAgICBpZiBvcHRzLnJlcXVpcmVtZW50czoKICAgICAgICAgICAgcmVxX3BhdGggPSBvcHRzLnJlcXVpcmVtZW50c1swXQogICAgICAgICAgICBuZXN0ZWRfY29uc3RyYWludCA9IEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVxX3BhdGggPSBvcHRzLmNvbnN0cmFpbnRzWzBdCiAgICAgICAgICAgIG5lc3RlZF9jb25zdHJhaW50ID0gVHJ1ZQogICAgICAgICMgb3JpZ2luYWwgZmlsZSBpcyBvdmVyIGh0dHAKICAgICAgICBpZiBTQ0hFTUVfUkUuc2VhcmNoKGZpbGVuYW1lKToKICAgICAgICAgICAgIyBkbyBhIHVybCBqb2luIHNvIHJlbGF0aXZlIHBhdGhzIHdvcmsKICAgICAgICAgICAgcmVxX3BhdGggPSB1cmxsaWJfcGFyc2UudXJsam9pbihmaWxlbmFtZSwgcmVxX3BhdGgpCiAgICAgICAgIyBvcmlnaW5hbCBmaWxlIGFuZCBuZXN0ZWQgZmlsZSBhcmUgcGF0aHMKICAgICAgICBlbGlmIG5vdCBTQ0hFTUVfUkUuc2VhcmNoKHJlcV9wYXRoKToKICAgICAgICAgICAgIyBkbyBhIGpvaW4gc28gcmVsYXRpdmUgcGF0aHMgd29yawogICAgICAgICAgICByZXFfcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoZmlsZW5hbWUpLCByZXFfcGF0aCkKICAgICAgICAjIFRPRE86IFdoeSBub3QgdXNlIGBjb21lc19mcm9tPSctciB7fSAobGluZSB7fSknYCBoZXJlIGFzIHdlbGw/CiAgICAgICAgcGFyc2VyID0gcGFyc2VfcmVxdWlyZW1lbnRzKAogICAgICAgICAgICByZXFfcGF0aCwgZmluZGVyLCBjb21lc19mcm9tLCBvcHRpb25zLCBzZXNzaW9uLAogICAgICAgICAgICBjb25zdHJhaW50PW5lc3RlZF9jb25zdHJhaW50LCB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZQogICAgICAgICkKICAgICAgICBmb3IgcmVxIGluIHBhcnNlcjoKICAgICAgICAgICAgeWllbGQgcmVxCgogICAgIyBwZXJjb2xhdGUgaGFzaC1jaGVja2luZyBvcHRpb24gdXB3YXJkCiAgICBlbGlmIG9wdHMucmVxdWlyZV9oYXNoZXM6CiAgICAgICAgb3B0aW9ucy5yZXF1aXJlX2hhc2hlcyA9IG9wdHMucmVxdWlyZV9oYXNoZXMKCiAgICAjIHNldCBmaW5kZXIgb3B0aW9ucwogICAgZWxpZiBmaW5kZXI6CiAgICAgICAgaWYgb3B0cy5hbGxvd19leHRlcm5hbDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWFsbG93LWV4dGVybmFsIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAiCiAgICAgICAgICAgICAgICAidGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0IG5vICIKICAgICAgICAgICAgICAgICJsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRzLmFsbG93X2FsbF9leHRlcm5hbDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWFsbG93LWFsbC1leHRlcm5hbCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgIgogICAgICAgICAgICAgICAgImluIHRoZSBmdXR1cmUuIER1ZSB0byBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IHByb3RvY29sLCBpdCAiCiAgICAgICAgICAgICAgICAibm8gbG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgb3B0cy5hbGxvd191bnZlcmlmaWVkOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctdW52ZXJpZmllZCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgIgogICAgICAgICAgICAgICAgImluIHRoZSBmdXR1cmUuIER1ZSB0byBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IHByb3RvY29sLCBpdCAiCiAgICAgICAgICAgICAgICAibm8gbG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgb3B0cy5pbmRleF91cmw6CiAgICAgICAgICAgIGZpbmRlci5pbmRleF91cmxzID0gW29wdHMuaW5kZXhfdXJsXQogICAgICAgIGlmIG9wdHMudXNlX3doZWVsIGlzIEZhbHNlOgogICAgICAgICAgICBmaW5kZXIudXNlX3doZWVsID0gRmFsc2UKICAgICAgICAgICAgcGlwLmluZGV4LmZtdF9jdGxfbm9fdXNlX3doZWVsKGZpbmRlci5mb3JtYXRfY29udHJvbCkKICAgICAgICBpZiBvcHRzLm5vX2luZGV4IGlzIFRydWU6CiAgICAgICAgICAgIGZpbmRlci5pbmRleF91cmxzID0gW10KICAgICAgICBpZiBvcHRzLmV4dHJhX2luZGV4X3VybHM6CiAgICAgICAgICAgIGZpbmRlci5pbmRleF91cmxzLmV4dGVuZChvcHRzLmV4dHJhX2luZGV4X3VybHMpCiAgICAgICAgaWYgb3B0cy5maW5kX2xpbmtzOgogICAgICAgICAgICAjIEZJWE1FOiBpdCB3b3VsZCBiZSBuaWNlIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHNvdXJjZQogICAgICAgICAgICAjIG9mIHRoZSBmaW5kX2xpbmtzOiBzdXBwb3J0IGEgZmluZC1saW5rcyBsb2NhbCBwYXRoCiAgICAgICAgICAgICMgcmVsYXRpdmUgdG8gYSByZXF1aXJlbWVudHMgZmlsZS4KICAgICAgICAgICAgdmFsdWUgPSBvcHRzLmZpbmRfbGlua3NbMF0KICAgICAgICAgICAgcmVxX2RpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoZmlsZW5hbWUpKQogICAgICAgICAgICByZWxhdGl2ZV90b19yZXFzX2ZpbGUgPSBvcy5wYXRoLmpvaW4ocmVxX2RpciwgdmFsdWUpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJlbGF0aXZlX3RvX3JlcXNfZmlsZSk6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlbGF0aXZlX3RvX3JlcXNfZmlsZQogICAgICAgICAgICBmaW5kZXIuZmluZF9saW5rcy5hcHBlbmQodmFsdWUpCiAgICAgICAgaWYgb3B0cy5wcmU6CiAgICAgICAgICAgIGZpbmRlci5hbGxvd19hbGxfcHJlcmVsZWFzZXMgPSBUcnVlCiAgICAgICAgaWYgb3B0cy5wcm9jZXNzX2RlcGVuZGVuY3lfbGlua3M6CiAgICAgICAgICAgIGZpbmRlci5wcm9jZXNzX2RlcGVuZGVuY3lfbGlua3MgPSBUcnVlCiAgICAgICAgaWYgb3B0cy50cnVzdGVkX2hvc3RzOgogICAgICAgICAgICBmaW5kZXIuc2VjdXJlX29yaWdpbnMuZXh0ZW5kKAogICAgICAgICAgICAgICAgKCIqIiwgaG9zdCwgIioiKSBmb3IgaG9zdCBpbiBvcHRzLnRydXN0ZWRfaG9zdHMpCgoKZGVmIGJyZWFrX2FyZ3Nfb3B0aW9ucyhsaW5lKToKICAgICIiIkJyZWFrIHVwIHRoZSBsaW5lIGludG8gYW4gYXJncyBhbmQgb3B0aW9ucyBzdHJpbmcuICBXZSBvbmx5IHdhbnQgdG8gc2hsZXgKICAgIChhbmQgdGhlbiBvcHRwYXJzZSkgdGhlIG9wdGlvbnMsIG5vdCB0aGUgYXJncy4gIGFyZ3MgY2FuIGNvbnRhaW4gbWFya2VycwogICAgd2hpY2ggYXJlIGNvcnJ1cHRlZCBieSBzaGxleC4KICAgICIiIgogICAgdG9rZW5zID0gbGluZS5zcGxpdCgnICcpCiAgICBhcmdzID0gW10KICAgIG9wdGlvbnMgPSB0b2tlbnNbOl0KICAgIGZvciB0b2tlbiBpbiB0b2tlbnM6CiAgICAgICAgaWYgdG9rZW4uc3RhcnRzd2l0aCgnLScpIG9yIHRva2VuLnN0YXJ0c3dpdGgoJy0tJyk6CiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXJncy5hcHBlbmQodG9rZW4pCiAgICAgICAgICAgIG9wdGlvbnMucG9wKDApCiAgICByZXR1cm4gJyAnLmpvaW4oYXJncyksICcgJy5qb2luKG9wdGlvbnMpCgoKZGVmIGJ1aWxkX3BhcnNlcigpOgogICAgIiIiCiAgICBSZXR1cm4gYSBwYXJzZXIgZm9yIHBhcnNpbmcgcmVxdWlyZW1lbnQgbGluZXMKICAgICIiIgogICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKGFkZF9oZWxwX29wdGlvbj1GYWxzZSkKCiAgICBvcHRpb25fZmFjdG9yaWVzID0gU1VQUE9SVEVEX09QVElPTlMgKyBTVVBQT1JURURfT1BUSU9OU19SRVEKICAgIGZvciBvcHRpb25fZmFjdG9yeSBpbiBvcHRpb25fZmFjdG9yaWVzOgogICAgICAgIG9wdGlvbiA9IG9wdGlvbl9mYWN0b3J5KCkKICAgICAgICBwYXJzZXIuYWRkX29wdGlvbihvcHRpb24pCgogICAgIyBCeSBkZWZhdWx0IG9wdHBhcnNlIHN5cy5leGl0cyBvbiBwYXJzaW5nIGVycm9ycy4gV2Ugd2FudCB0byB3cmFwCiAgICAjIHRoYXQgaW4gb3VyIG93biBleGNlcHRpb24uCiAgICBkZWYgcGFyc2VyX2V4aXQoc2VsZiwgbXNnKToKICAgICAgICByYWlzZSBSZXF1aXJlbWVudHNGaWxlUGFyc2VFcnJvcihtc2cpCiAgICBwYXJzZXIuZXhpdCA9IHBhcnNlcl9leGl0CgogICAgcmV0dXJuIHBhcnNlcgoKCmRlZiBqb2luX2xpbmVzKGxpbmVzX2VudW0pOgogICAgIiIiSm9pbnMgYSBsaW5lIGVuZGluZyBpbiAnXCcgd2l0aCB0aGUgcHJldmlvdXMgbGluZSAoZXhjZXB0IHdoZW4gZm9sbG93aW5nCiAgICBjb21tZW50cykuICBUaGUgam9pbmVkIGxpbmUgdGFrZXMgb24gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBsaW5lLgogICAgIiIiCiAgICBwcmltYXJ5X2xpbmVfbnVtYmVyID0gTm9uZQogICAgbmV3X2xpbmUgPSBbXQogICAgZm9yIGxpbmVfbnVtYmVyLCBsaW5lIGluIGxpbmVzX2VudW06CiAgICAgICAgaWYgbm90IGxpbmUuZW5kc3dpdGgoJ1xcJykgb3IgQ09NTUVOVF9SRS5tYXRjaChsaW5lKToKICAgICAgICAgICAgaWYgQ09NTUVOVF9SRS5tYXRjaChsaW5lKToKICAgICAgICAgICAgICAgICMgdGhpcyBlbnN1cmVzIGNvbW1lbnRzIGFyZSBhbHdheXMgbWF0Y2hlZCBsYXRlcgogICAgICAgICAgICAgICAgbGluZSA9ICcgJyArIGxpbmUKICAgICAgICAgICAgaWYgbmV3X2xpbmU6CiAgICAgICAgICAgICAgICBuZXdfbGluZS5hcHBlbmQobGluZSkKICAgICAgICAgICAgICAgIHlpZWxkIHByaW1hcnlfbGluZV9udW1iZXIsICcnLmpvaW4obmV3X2xpbmUpCiAgICAgICAgICAgICAgICBuZXdfbGluZSA9IFtdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB5aWVsZCBsaW5lX251bWJlciwgbGluZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG5vdCBuZXdfbGluZToKICAgICAgICAgICAgICAgIHByaW1hcnlfbGluZV9udW1iZXIgPSBsaW5lX251bWJlcgogICAgICAgICAgICBuZXdfbGluZS5hcHBlbmQobGluZS5zdHJpcCgnXFwnKSkKCiAgICAjIGxhc3QgbGluZSBjb250YWlucyBcCiAgICBpZiBuZXdfbGluZToKICAgICAgICB5aWVsZCBwcmltYXJ5X2xpbmVfbnVtYmVyLCAnJy5qb2luKG5ld19saW5lKQoKICAgICMgVE9ETzogaGFuZGxlIHNwYWNlIGFmdGVyICdcJy4KCgpkZWYgaWdub3JlX2NvbW1lbnRzKGxpbmVzX2VudW0pOgogICAgIiIiCiAgICBTdHJpcHMgY29tbWVudHMgYW5kIGZpbHRlciBlbXB0eSBsaW5lcy4KICAgICIiIgogICAgZm9yIGxpbmVfbnVtYmVyLCBsaW5lIGluIGxpbmVzX2VudW06CiAgICAgICAgbGluZSA9IENPTU1FTlRfUkUuc3ViKCcnLCBsaW5lKQogICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICBpZiBsaW5lOgogICAgICAgICAgICB5aWVsZCBsaW5lX251bWJlciwgbGluZQoKCmRlZiBza2lwX3JlZ2V4KGxpbmVzX2VudW0sIG9wdGlvbnMpOgogICAgIiIiCiAgICBTa2lwIGxpbmVzIHRoYXQgbWF0Y2ggJy0tc2tpcC1yZXF1aXJlbWVudHMtcmVnZXgnIHBhdHRlcm4KCiAgICBOb3RlOiB0aGUgcmVnZXggcGF0dGVybiBpcyBvbmx5IGJ1aWx0IG9uY2UKICAgICIiIgogICAgc2tpcF9yZWdleCA9IG9wdGlvbnMuc2tpcF9yZXF1aXJlbWVudHNfcmVnZXggaWYgb3B0aW9ucyBlbHNlIE5vbmUKICAgIGlmIHNraXBfcmVnZXg6CiAgICAgICAgcGF0dGVybiA9IHJlLmNvbXBpbGUoc2tpcF9yZWdleCkKICAgICAgICBsaW5lc19lbnVtID0gZmlsdGVyZmFsc2UoCiAgICAgICAgICAgIGxhbWJkYSBlOiBwYXR0ZXJuLnNlYXJjaChlWzFdKSwKICAgICAgICAgICAgbGluZXNfZW51bSkKICAgIHJldHVybiBsaW5lc19lbnVtClBLAwQUAAAAAAAAACEAgW1Vw5e1AACXtQAAJgAAAHB5cGlfX3BpcF85XzBfMy9waXAvcmVxL3JlcV9pbnN0YWxsLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHNodXRpbAppbXBvcnQgc3lzCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgdHJhY2ViYWNrCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgemlwZmlsZQoKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZwpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjaGFuZ2Vfcm9vdApmcm9tIGVtYWlsLnBhcnNlciBpbXBvcnQgRmVlZFBhcnNlcgoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgcGtnX3Jlc291cmNlcywgc2l4CmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nIGltcG9ydCBzcGVjaWZpZXJzCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nLm1hcmtlcnMgaW1wb3J0IE1hcmtlcgpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZy5yZXF1aXJlbWVudHMgaW1wb3J0IEludmFsaWRSZXF1aXJlbWVudCwgUmVxdWlyZW1lbnQKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcudXRpbHMgaW1wb3J0IGNhbm9uaWNhbGl6ZV9uYW1lCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nLnZlcnNpb24gaW1wb3J0IFZlcnNpb24sIHBhcnNlIGFzIHBhcnNlX3ZlcnNpb24KZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMgaW1wb3J0IGNvbmZpZ3BhcnNlcgoKaW1wb3J0IHBpcC53aGVlbAoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBuYXRpdmVfc3RyLCBnZXRfc3RkbGliLCBXSU5ET1dTCmZyb20gcGlwLmRvd25sb2FkIGltcG9ydCBpc191cmwsIHVybF90b19wYXRoLCBwYXRoX3RvX3VybCwgaXNfYXJjaGl2ZV9maWxlCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIEluc3RhbGxhdGlvbkVycm9yLCBVbmluc3RhbGxhdGlvbkVycm9yLAopCmZyb20gcGlwLmxvY2F0aW9ucyBpbXBvcnQgKAogICAgYmluX3B5LCBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYsIFBJUF9ERUxFVEVfTUFSS0VSX0ZJTEVOQU1FLCBiaW5fdXNlciwKKQpmcm9tIHBpcC51dGlscyBpbXBvcnQgKAogICAgZGlzcGxheV9wYXRoLCBybXRyZWUsIGFza19wYXRoX2V4aXN0cywgYmFja3VwX2RpciwgaXNfaW5zdGFsbGFibGVfZGlyLAogICAgZGlzdF9pbl91c2Vyc2l0ZSwgZGlzdF9pbl9zaXRlX3BhY2thZ2VzLCBlZ2dfbGlua19wYXRoLAogICAgY2FsbF9zdWJwcm9jZXNzLCByZWFkX3RleHRfZmlsZSwgRmFrZUZpbGUsIF9tYWtlX2J1aWxkX2RpciwgZW5zdXJlX2RpciwKICAgIGdldF9pbnN0YWxsZWRfdmVyc2lvbiwgbm9ybWFsaXplX3BhdGgsIGRpc3RfaXNfbG9jYWwsCikKCmZyb20gcGlwLnV0aWxzLmhhc2hlcyBpbXBvcnQgSGFzaGVzCmZyb20gcGlwLnV0aWxzLmRlcHJlY2F0aW9uIGltcG9ydCBSZW1vdmVkSW5QaXAxMFdhcm5pbmcKZnJvbSBwaXAudXRpbHMubG9nZ2luZyBpbXBvcnQgaW5kZW50X2xvZwpmcm9tIHBpcC51dGlscy5zZXR1cHRvb2xzX2J1aWxkIGltcG9ydCBTRVRVUFRPT0xTX1NISU0KZnJvbSBwaXAudXRpbHMudWkgaW1wb3J0IG9wZW5fc3Bpbm5lcgpmcm9tIHBpcC5yZXEucmVxX3VuaW5zdGFsbCBpbXBvcnQgVW5pbnN0YWxsUGF0aFNldApmcm9tIHBpcC52Y3MgaW1wb3J0IHZjcwpmcm9tIHBpcC53aGVlbCBpbXBvcnQgbW92ZV93aGVlbF9maWxlcywgV2hlZWwKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCm9wZXJhdG9ycyA9IHNwZWNpZmllcnMuU3BlY2lmaWVyLl9vcGVyYXRvcnMua2V5cygpCgoKZGVmIF9zdHJpcF9leHRyYXMocGF0aCk6CiAgICBtID0gcmUubWF0Y2gocideKC4rKShcW1teXF1dK1xdKSQnLCBwYXRoKQogICAgZXh0cmFzID0gTm9uZQogICAgaWYgbToKICAgICAgICBwYXRoX25vX2V4dHJhcyA9IG0uZ3JvdXAoMSkKICAgICAgICBleHRyYXMgPSBtLmdyb3VwKDIpCiAgICBlbHNlOgogICAgICAgIHBhdGhfbm9fZXh0cmFzID0gcGF0aAoKICAgIHJldHVybiBwYXRoX25vX2V4dHJhcywgZXh0cmFzCgoKZGVmIF9zYWZlX2V4dHJhcyhleHRyYXMpOgogICAgcmV0dXJuIHNldChwa2dfcmVzb3VyY2VzLnNhZmVfZXh0cmEoZXh0cmEpIGZvciBleHRyYSBpbiBleHRyYXMpCgoKY2xhc3MgSW5zdGFsbFJlcXVpcmVtZW50KG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcSwgY29tZXNfZnJvbSwgc291cmNlX2Rpcj1Ob25lLCBlZGl0YWJsZT1GYWxzZSwKICAgICAgICAgICAgICAgICBsaW5rPU5vbmUsIGFzX2VnZz1GYWxzZSwgdXBkYXRlPVRydWUsCiAgICAgICAgICAgICAgICAgcHljb21waWxlPVRydWUsIG1hcmtlcnM9Tm9uZSwgaXNvbGF0ZWQ9RmFsc2UsIG9wdGlvbnM9Tm9uZSwKICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT1Ob25lLCBjb25zdHJhaW50PUZhbHNlKToKICAgICAgICBzZWxmLmV4dHJhcyA9ICgpCiAgICAgICAgaWYgaXNpbnN0YW5jZShyZXEsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXEgPSBSZXF1aXJlbWVudChyZXEpCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkUmVxdWlyZW1lbnQ6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLnNlcCBpbiByZXE6CiAgICAgICAgICAgICAgICAgICAgYWRkX21zZyA9ICJJdCBsb29rcyBsaWtlIGEgcGF0aC4gRG9lcyBpdCBleGlzdCA/IgogICAgICAgICAgICAgICAgZWxpZiAnPScgaW4gcmVxIGFuZCBub3QgYW55KG9wIGluIHJlcSBmb3Igb3AgaW4gb3BlcmF0b3JzKToKICAgICAgICAgICAgICAgICAgICBhZGRfbXNnID0gIj0gaXMgbm90IGEgdmFsaWQgb3BlcmF0b3IuIERpZCB5b3UgbWVhbiA9PSA/IgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBhZGRfbXNnID0gdHJhY2ViYWNrLmZvcm1hdF9leGMoKQogICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgcmVxdWlyZW1lbnQ6ICclcydcbiVzIiAlIChyZXEsIGFkZF9tc2cpKQogICAgICAgICAgICBzZWxmLmV4dHJhcyA9IF9zYWZlX2V4dHJhcyhyZXEuZXh0cmFzKQoKICAgICAgICBzZWxmLnJlcSA9IHJlcQogICAgICAgIHNlbGYuY29tZXNfZnJvbSA9IGNvbWVzX2Zyb20KICAgICAgICBzZWxmLmNvbnN0cmFpbnQgPSBjb25zdHJhaW50CiAgICAgICAgc2VsZi5zb3VyY2VfZGlyID0gc291cmNlX2RpcgogICAgICAgIHNlbGYuZWRpdGFibGUgPSBlZGl0YWJsZQoKICAgICAgICBzZWxmLl93aGVlbF9jYWNoZSA9IHdoZWVsX2NhY2hlCiAgICAgICAgc2VsZi5saW5rID0gc2VsZi5vcmlnaW5hbF9saW5rID0gbGluawogICAgICAgIHNlbGYuYXNfZWdnID0gYXNfZWdnCiAgICAgICAgaWYgbWFya2VycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5tYXJrZXJzID0gbWFya2VycwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubWFya2VycyA9IHJlcSBhbmQgcmVxLm1hcmtlcgogICAgICAgIHNlbGYuX2VnZ19pbmZvX3BhdGggPSBOb25lCiAgICAgICAgIyBUaGlzIGhvbGRzIHRoZSBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbiBvYmplY3QgaWYgdGhpcyByZXF1aXJlbWVudAogICAgICAgICMgaXMgYWxyZWFkeSBhdmFpbGFibGU6CiAgICAgICAgc2VsZi5zYXRpc2ZpZWRfYnkgPSBOb25lCiAgICAgICAgIyBUaGlzIGhvbGQgdGhlIHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uIG9iamVjdCBpZiB0aGlzIHJlcXVpcmVtZW50CiAgICAgICAgIyBjb25mbGljdHMgd2l0aCBhbm90aGVyIGluc3RhbGxlZCBkaXN0cmlidXRpb246CiAgICAgICAgc2VsZi5jb25mbGljdHNfd2l0aCA9IE5vbmUKICAgICAgICAjIFRlbXBvcmFyeSBidWlsZCBsb2NhdGlvbgogICAgICAgIHNlbGYuX3RlbXBfYnVpbGRfZGlyID0gTm9uZQogICAgICAgICMgVXNlZCB0byBzdG9yZSB0aGUgZ2xvYmFsIGRpcmVjdG9yeSB3aGVyZSB0aGUgX3RlbXBfYnVpbGRfZGlyIHNob3VsZAogICAgICAgICMgaGF2ZSBiZWVuIGNyZWF0ZWQuIENmIF9jb3JyZWN0X2J1aWxkX2xvY2F0aW9uIG1ldGhvZC4KICAgICAgICBzZWxmLl9pZGVhbF9idWlsZF9kaXIgPSBOb25lCiAgICAgICAgIyBUcnVlIGlmIHRoZSBlZGl0YWJsZSBzaG91bGQgYmUgdXBkYXRlZDoKICAgICAgICBzZWxmLnVwZGF0ZSA9IHVwZGF0ZQogICAgICAgICMgU2V0IHRvIFRydWUgYWZ0ZXIgc3VjY2Vzc2Z1bCBpbnN0YWxsYXRpb24KICAgICAgICBzZWxmLmluc3RhbGxfc3VjY2VlZGVkID0gTm9uZQogICAgICAgICMgVW5pbnN0YWxsUGF0aFNldCBvZiB1bmluc3RhbGxlZCBkaXN0cmlidXRpb24gKGZvciBwb3NzaWJsZSByb2xsYmFjaykKICAgICAgICBzZWxmLnVuaW5zdGFsbGVkID0gTm9uZQogICAgICAgICMgU2V0IFRydWUgaWYgYSBsZWdpdGltYXRlIGRvLW5vdGhpbmctb24tdW5pbnN0YWxsIGhhcyBoYXBwZW5lZCAtIGUuZy4KICAgICAgICAjIHN5c3RlbSBzaXRlIHBhY2thZ2VzLCBzdGRsaWIgcGFja2FnZXMuCiAgICAgICAgc2VsZi5ub3RoaW5nX3RvX3VuaW5zdGFsbCA9IEZhbHNlCiAgICAgICAgc2VsZi51c2VfdXNlcl9zaXRlID0gRmFsc2UKICAgICAgICBzZWxmLnRhcmdldF9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5vcHRpb25zID0gb3B0aW9ucyBpZiBvcHRpb25zIGVsc2Uge30KICAgICAgICBzZWxmLnB5Y29tcGlsZSA9IHB5Y29tcGlsZQogICAgICAgICMgU2V0IHRvIFRydWUgYWZ0ZXIgc3VjY2Vzc2Z1bCBwcmVwYXJhdGlvbiBvZiB0aGlzIHJlcXVpcmVtZW50CiAgICAgICAgc2VsZi5wcmVwYXJlZCA9IEZhbHNlCgogICAgICAgIHNlbGYuaXNvbGF0ZWQgPSBpc29sYXRlZAoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fZWRpdGFibGUoY2xzLCBlZGl0YWJsZV9yZXEsIGNvbWVzX2Zyb209Tm9uZSwgZGVmYXVsdF92Y3M9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPUZhbHNlLCBvcHRpb25zPU5vbmUsIHdoZWVsX2NhY2hlPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50PUZhbHNlKToKICAgICAgICBmcm9tIHBpcC5pbmRleCBpbXBvcnQgTGluawoKICAgICAgICBuYW1lLCB1cmwsIGV4dHJhc19vdmVycmlkZSA9IHBhcnNlX2VkaXRhYmxlKAogICAgICAgICAgICBlZGl0YWJsZV9yZXEsIGRlZmF1bHRfdmNzKQogICAgICAgIGlmIHVybC5zdGFydHN3aXRoKCdmaWxlOicpOgogICAgICAgICAgICBzb3VyY2VfZGlyID0gdXJsX3RvX3BhdGgodXJsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNvdXJjZV9kaXIgPSBOb25lCgogICAgICAgIHJlcyA9IGNscyhuYW1lLCBjb21lc19mcm9tLCBzb3VyY2VfZGlyPXNvdXJjZV9kaXIsCiAgICAgICAgICAgICAgICAgIGVkaXRhYmxlPVRydWUsCiAgICAgICAgICAgICAgICAgIGxpbms9TGluayh1cmwpLAogICAgICAgICAgICAgICAgICBjb25zdHJhaW50PWNvbnN0cmFpbnQsCiAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPWlzb2xhdGVkLAogICAgICAgICAgICAgICAgICBvcHRpb25zPW9wdGlvbnMgaWYgb3B0aW9ucyBlbHNlIHt9LAogICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZSkKCiAgICAgICAgaWYgZXh0cmFzX292ZXJyaWRlIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXMuZXh0cmFzID0gX3NhZmVfZXh0cmFzKGV4dHJhc19vdmVycmlkZSkKCiAgICAgICAgcmV0dXJuIHJlcwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fbGluZSgKICAgICAgICAgICAgY2xzLCBuYW1lLCBjb21lc19mcm9tPU5vbmUsIGlzb2xhdGVkPUZhbHNlLCBvcHRpb25zPU5vbmUsCiAgICAgICAgICAgIHdoZWVsX2NhY2hlPU5vbmUsIGNvbnN0cmFpbnQ9RmFsc2UpOgogICAgICAgICIiIkNyZWF0ZXMgYW4gSW5zdGFsbFJlcXVpcmVtZW50IGZyb20gYSBuYW1lLCB3aGljaCBtaWdodCBiZSBhCiAgICAgICAgcmVxdWlyZW1lbnQsIGRpcmVjdG9yeSBjb250YWluaW5nICdzZXR1cC5weScsIGZpbGVuYW1lLCBvciBVUkwuCiAgICAgICAgIiIiCiAgICAgICAgZnJvbSBwaXAuaW5kZXggaW1wb3J0IExpbmsKCiAgICAgICAgaWYgaXNfdXJsKG5hbWUpOgogICAgICAgICAgICBtYXJrZXJfc2VwID0gJzsgJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1hcmtlcl9zZXAgPSAnOycKICAgICAgICBpZiBtYXJrZXJfc2VwIGluIG5hbWU6CiAgICAgICAgICAgIG5hbWUsIG1hcmtlcnMgPSBuYW1lLnNwbGl0KG1hcmtlcl9zZXAsIDEpCiAgICAgICAgICAgIG1hcmtlcnMgPSBtYXJrZXJzLnN0cmlwKCkKICAgICAgICAgICAgaWYgbm90IG1hcmtlcnM6CiAgICAgICAgICAgICAgICBtYXJrZXJzID0gTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbWFya2VycyA9IE1hcmtlcihtYXJrZXJzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1hcmtlcnMgPSBOb25lCiAgICAgICAgbmFtZSA9IG5hbWUuc3RyaXAoKQogICAgICAgIHJlcSA9IE5vbmUKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmFic3BhdGgobmFtZSkpCiAgICAgICAgbGluayA9IE5vbmUKICAgICAgICBleHRyYXMgPSBOb25lCgogICAgICAgIGlmIGlzX3VybChuYW1lKToKICAgICAgICAgICAgbGluayA9IExpbmsobmFtZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwLCBleHRyYXMgPSBfc3RyaXBfZXh0cmFzKHBhdGgpCiAgICAgICAgICAgIGlmIChvcy5wYXRoLmlzZGlyKHApIGFuZAogICAgICAgICAgICAgICAgICAgIChvcy5wYXRoLnNlcCBpbiBuYW1lIG9yIG5hbWUuc3RhcnRzd2l0aCgnLicpKSk6CgogICAgICAgICAgICAgICAgaWYgbm90IGlzX2luc3RhbGxhYmxlX2RpcihwKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgIkRpcmVjdG9yeSAlciBpcyBub3QgaW5zdGFsbGFibGUuIEZpbGUgJ3NldHVwLnB5JyAiCiAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZm91bmQuIiAlIG5hbWUKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBsaW5rID0gTGluayhwYXRoX3RvX3VybChwKSkKICAgICAgICAgICAgZWxpZiBpc19hcmNoaXZlX2ZpbGUocCk6CiAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUocCk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICdSZXF1aXJlbWVudCAlciBsb29rcyBsaWtlIGEgZmlsZW5hbWUsIGJ1dCB0aGUgJwogICAgICAgICAgICAgICAgICAgICAgICAnZmlsZSBkb2VzIG5vdCBleGlzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBsaW5rID0gTGluayhwYXRoX3RvX3VybChwKSkKCiAgICAgICAgIyBpdCdzIGEgbG9jYWwgZmlsZSwgZGlyLCBvciB1cmwKICAgICAgICBpZiBsaW5rOgogICAgICAgICAgICAjIEhhbmRsZSByZWxhdGl2ZSBmaWxlIFVSTHMKICAgICAgICAgICAgaWYgbGluay5zY2hlbWUgPT0gJ2ZpbGUnIGFuZCByZS5zZWFyY2gocidcLlwuLycsIGxpbmsudXJsKToKICAgICAgICAgICAgICAgIGxpbmsgPSBMaW5rKAogICAgICAgICAgICAgICAgICAgIHBhdGhfdG9fdXJsKG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5hYnNwYXRoKGxpbmsucGF0aCkpKSkKICAgICAgICAgICAgIyB3aGVlbCBmaWxlCiAgICAgICAgICAgIGlmIGxpbmsuaXNfd2hlZWw6CiAgICAgICAgICAgICAgICB3aGVlbCA9IFdoZWVsKGxpbmsuZmlsZW5hbWUpICAjIGNhbiByYWlzZSBJbnZhbGlkV2hlZWxGaWxlbmFtZQogICAgICAgICAgICAgICAgcmVxID0gIiVzPT0lcyIgJSAod2hlZWwubmFtZSwgd2hlZWwudmVyc2lvbikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgc2V0IHRoZSByZXEgdG8gdGhlIGVnZyBmcmFnbWVudC4gIHdoZW4gaXQncyBub3QgdGhlcmUsIHRoaXMKICAgICAgICAgICAgICAgICMgd2lsbCBiZWNvbWUgYW4gJ3VubmFtZWQnIHJlcXVpcmVtZW50CiAgICAgICAgICAgICAgICByZXEgPSBsaW5rLmVnZ19mcmFnbWVudAoKICAgICAgICAjIGEgcmVxdWlyZW1lbnQgc3BlY2lmaWVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVxID0gbmFtZQoKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyBpZiBvcHRpb25zIGVsc2Uge30KICAgICAgICByZXMgPSBjbHMocmVxLCBjb21lc19mcm9tLCBsaW5rPWxpbmssIG1hcmtlcnM9bWFya2VycywKICAgICAgICAgICAgICAgICAgaXNvbGF0ZWQ9aXNvbGF0ZWQsIG9wdGlvbnM9b3B0aW9ucywKICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUsIGNvbnN0cmFpbnQ9Y29uc3RyYWludCkKCiAgICAgICAgaWYgZXh0cmFzOgogICAgICAgICAgICByZXMuZXh0cmFzID0gX3NhZmVfZXh0cmFzKAogICAgICAgICAgICAgICAgUmVxdWlyZW1lbnQoJ3BsYWNlaG9sZGVyJyArIGV4dHJhcykuZXh0cmFzKQoKICAgICAgICByZXR1cm4gcmVzCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgaWYgc2VsZi5yZXE6CiAgICAgICAgICAgIHMgPSBzdHIoc2VsZi5yZXEpCiAgICAgICAgICAgIGlmIHNlbGYubGluazoKICAgICAgICAgICAgICAgIHMgKz0gJyBmcm9tICVzJyAlIHNlbGYubGluay51cmwKICAgICAgICBlbHNlOgogICAgICAgICAgICBzID0gc2VsZi5saW5rLnVybCBpZiBzZWxmLmxpbmsgZWxzZSBOb25lCiAgICAgICAgaWYgc2VsZi5zYXRpc2ZpZWRfYnkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHMgKz0gJyBpbiAlcycgJSBkaXNwbGF5X3BhdGgoc2VsZi5zYXRpc2ZpZWRfYnkubG9jYXRpb24pCiAgICAgICAgaWYgc2VsZi5jb21lc19mcm9tOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuY29tZXNfZnJvbSwgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICBjb21lc19mcm9tID0gc2VsZi5jb21lc19mcm9tCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBjb21lc19mcm9tID0gc2VsZi5jb21lc19mcm9tLmZyb21fcGF0aCgpCiAgICAgICAgICAgIGlmIGNvbWVzX2Zyb206CiAgICAgICAgICAgICAgICBzICs9ICcgKGZyb20gJXMpJyAlIGNvbWVzX2Zyb20KICAgICAgICByZXR1cm4gcwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJzwlcyBvYmplY3Q6ICVzIGVkaXRhYmxlPSVyPicgJSAoCiAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoc2VsZiksIHNlbGYuZWRpdGFibGUpCgogICAgZGVmIHBvcHVsYXRlX2xpbmsoc2VsZiwgZmluZGVyLCB1cGdyYWRlLCByZXF1aXJlX2hhc2hlcyk6CiAgICAgICAgIiIiRW5zdXJlIHRoYXQgaWYgYSBsaW5rIGNhbiBiZSBmb3VuZCBmb3IgdGhpcywgdGhhdCBpdCBpcyBmb3VuZC4KCiAgICAgICAgTm90ZSB0aGF0IHNlbGYubGluayBtYXkgc3RpbGwgYmUgTm9uZSAtIGlmIFVwZ3JhZGUgaXMgRmFsc2UgYW5kIHRoZQogICAgICAgIHJlcXVpcmVtZW50IGlzIGFscmVhZHkgaW5zdGFsbGVkLgoKICAgICAgICBJZiByZXF1aXJlX2hhc2hlcyBpcyBUcnVlLCBkb24ndCB1c2UgdGhlIHdoZWVsIGNhY2hlLCBiZWNhdXNlIGNhY2hlZAogICAgICAgIHdoZWVscywgYWx3YXlzIGJ1aWx0IGxvY2FsbHksIGhhdmUgZGlmZmVyZW50IGhhc2hlcyB0aGFuIHRoZSBmaWxlcwogICAgICAgIGRvd25sb2FkZWQgZnJvbSB0aGUgaW5kZXggc2VydmVyIGFuZCB0aHVzIHRocm93IGZhbHNlIGhhc2ggbWlzbWF0Y2hlcy4KICAgICAgICBGdXJ0aGVybW9yZSwgY2FjaGVkIHdoZWVscyBhdCBwcmVzZW50IGhhdmUgdW5kZXRlcm1pbmlzdGljIGNvbnRlbnRzIGR1ZQogICAgICAgIHRvIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYubGluayBpcyBOb25lOgogICAgICAgICAgICBzZWxmLmxpbmsgPSBmaW5kZXIuZmluZF9yZXF1aXJlbWVudChzZWxmLCB1cGdyYWRlKQogICAgICAgIGlmIHNlbGYuX3doZWVsX2NhY2hlIGlzIG5vdCBOb25lIGFuZCBub3QgcmVxdWlyZV9oYXNoZXM6CiAgICAgICAgICAgIG9sZF9saW5rID0gc2VsZi5saW5rCiAgICAgICAgICAgIHNlbGYubGluayA9IHNlbGYuX3doZWVsX2NhY2hlLmNhY2hlZF93aGVlbChzZWxmLmxpbmssIHNlbGYubmFtZSkKICAgICAgICAgICAgaWYgb2xkX2xpbmsgIT0gc2VsZi5saW5rOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdVc2luZyBjYWNoZWQgd2hlZWwgbGluazogJXMnLCBzZWxmLmxpbmspCgogICAgQHByb3BlcnR5CiAgICBkZWYgc3BlY2lmaWVyKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnJlcS5zcGVjaWZpZXIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19waW5uZWQoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHdoZXRoZXIgSSBhbSBwaW5uZWQgdG8gYW4gZXhhY3QgdmVyc2lvbi4KCiAgICAgICAgRm9yIGV4YW1wbGUsIHNvbWUtcGFja2FnZT09MS4yIGlzIHBpbm5lZDsgc29tZS1wYWNrYWdlPjEuMiBpcyBub3QuCiAgICAgICAgIiIiCiAgICAgICAgc3BlY2lmaWVycyA9IHNlbGYuc3BlY2lmaWVyCiAgICAgICAgcmV0dXJuIChsZW4oc3BlY2lmaWVycykgPT0gMSBhbmQKICAgICAgICAgICAgICAgIG5leHQoaXRlcihzcGVjaWZpZXJzKSkub3BlcmF0b3IgaW4gKCc9PScsICc9PT0nKSkKCiAgICBkZWYgZnJvbV9wYXRoKHNlbGYpOgogICAgICAgIGlmIHNlbGYucmVxIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcyA9IHN0cihzZWxmLnJlcSkKICAgICAgICBpZiBzZWxmLmNvbWVzX2Zyb206CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5jb21lc19mcm9tLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgICAgIGNvbWVzX2Zyb20gPSBzZWxmLmNvbWVzX2Zyb20KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNvbWVzX2Zyb20gPSBzZWxmLmNvbWVzX2Zyb20uZnJvbV9wYXRoKCkKICAgICAgICAgICAgaWYgY29tZXNfZnJvbToKICAgICAgICAgICAgICAgIHMgKz0gJy0+JyArIGNvbWVzX2Zyb20KICAgICAgICByZXR1cm4gcwoKICAgIGRlZiBidWlsZF9sb2NhdGlvbihzZWxmLCBidWlsZF9kaXIpOgogICAgICAgIGlmIHNlbGYuX3RlbXBfYnVpbGRfZGlyIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fdGVtcF9idWlsZF9kaXIKICAgICAgICBpZiBzZWxmLnJlcSBpcyBOb25lOgogICAgICAgICAgICAjIGZvciByZXF1aXJlbWVudCB2aWEgYSBwYXRoIHRvIGEgZGlyZWN0b3J5OiB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgIyBwYWNrYWdlIGlzIG5vdCBhdmFpbGFibGUgeWV0IHNvIHdlIGNyZWF0ZSBhIHRlbXAgZGlyZWN0b3J5CiAgICAgICAgICAgICMgT25jZSBydW5fZWdnX2luZm8gd2lsbCBoYXZlIHJ1biwgd2UnbGwgYmUgYWJsZQogICAgICAgICAgICAjIHRvIGZpeCBpdCB2aWEgX2NvcnJlY3RfYnVpbGRfbG9jYXRpb24KICAgICAgICAgICAgIyBTb21lIHN5c3RlbXMgaGF2ZSAvdG1wIGFzIGEgc3ltbGluayB3aGljaCBjb25mdXNlcyBjdXN0b20KICAgICAgICAgICAgIyBidWlsZHMgKHN1Y2ggYXMgbnVtcHkpLiBUaHVzLCB3ZSBlbnN1cmUgdGhhdCB0aGUgcmVhbCBwYXRoCiAgICAgICAgICAgICMgaXMgcmV0dXJuZWQuCiAgICAgICAgICAgIHNlbGYuX3RlbXBfYnVpbGRfZGlyID0gb3MucGF0aC5yZWFscGF0aCgKICAgICAgICAgICAgICAgIHRlbXBmaWxlLm1rZHRlbXAoJy1idWlsZCcsICdwaXAtJykKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLl9pZGVhbF9idWlsZF9kaXIgPSBidWlsZF9kaXIKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RlbXBfYnVpbGRfZGlyCiAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgbmFtZSA9IHNlbGYubmFtZS5sb3dlcigpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmFtZSA9IHNlbGYubmFtZQogICAgICAgICMgRklYTUU6IElzIHRoZXJlIGEgYmV0dGVyIHBsYWNlIHRvIGNyZWF0ZSB0aGUgYnVpbGRfZGlyPyAoaGcgYW5kIGJ6cgogICAgICAgICMgbmVlZCB0aGlzKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhidWlsZF9kaXIpOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0NyZWF0aW5nIGRpcmVjdG9yeSAlcycsIGJ1aWxkX2RpcikKICAgICAgICAgICAgX21ha2VfYnVpbGRfZGlyKGJ1aWxkX2RpcikKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgbmFtZSkKCiAgICBkZWYgX2NvcnJlY3RfYnVpbGRfbG9jYXRpb24oc2VsZik6CiAgICAgICAgIiIiTW92ZSBzZWxmLl90ZW1wX2J1aWxkX2RpciB0byBzZWxmLl9pZGVhbF9idWlsZF9kaXIvc2VsZi5yZXEubmFtZQoKICAgICAgICBGb3Igc29tZSByZXF1aXJlbWVudHMgKGUuZy4gYSBwYXRoIHRvIGEgZGlyZWN0b3J5KSwgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgcGFja2FnZSBpcyBub3QgYXZhaWxhYmxlIHVudGlsIHdlIHJ1biBlZ2dfaW5mbywgc28gdGhlIGJ1aWxkX2xvY2F0aW9uCiAgICAgICAgd2lsbCByZXR1cm4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGFuZCBzdG9yZSB0aGUgX2lkZWFsX2J1aWxkX2Rpci4KCiAgICAgICAgVGhpcyBpcyBvbmx5IGNhbGxlZCBieSBzZWxmLmVnZ19pbmZvX3BhdGggdG8gZml4IHRoZSB0ZW1wb3JhcnkgYnVpbGQKICAgICAgICBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5zb3VyY2VfZGlyIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBhc3NlcnQgc2VsZi5yZXEgaXMgbm90IE5vbmUKICAgICAgICBhc3NlcnQgc2VsZi5fdGVtcF9idWlsZF9kaXIKICAgICAgICBhc3NlcnQgc2VsZi5faWRlYWxfYnVpbGRfZGlyCiAgICAgICAgb2xkX2xvY2F0aW9uID0gc2VsZi5fdGVtcF9idWlsZF9kaXIKICAgICAgICBzZWxmLl90ZW1wX2J1aWxkX2RpciA9IE5vbmUKICAgICAgICBuZXdfbG9jYXRpb24gPSBzZWxmLmJ1aWxkX2xvY2F0aW9uKHNlbGYuX2lkZWFsX2J1aWxkX2RpcikKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhuZXdfbG9jYXRpb24pOgogICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICdBIHBhY2thZ2UgYWxyZWFkeSBleGlzdHMgaW4gJXM7IHBsZWFzZSByZW1vdmUgaXQgdG8gY29udGludWUnCiAgICAgICAgICAgICAgICAlIGRpc3BsYXlfcGF0aChuZXdfbG9jYXRpb24pKQogICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgJ01vdmluZyBwYWNrYWdlICVzIGZyb20gJXMgdG8gbmV3IGxvY2F0aW9uICVzJywKICAgICAgICAgICAgc2VsZiwgZGlzcGxheV9wYXRoKG9sZF9sb2NhdGlvbiksIGRpc3BsYXlfcGF0aChuZXdfbG9jYXRpb24pLAogICAgICAgICkKICAgICAgICBzaHV0aWwubW92ZShvbGRfbG9jYXRpb24sIG5ld19sb2NhdGlvbikKICAgICAgICBzZWxmLl90ZW1wX2J1aWxkX2RpciA9IG5ld19sb2NhdGlvbgogICAgICAgIHNlbGYuX2lkZWFsX2J1aWxkX2RpciA9IE5vbmUKICAgICAgICBzZWxmLnNvdXJjZV9kaXIgPSBuZXdfbG9jYXRpb24KICAgICAgICBzZWxmLl9lZ2dfaW5mb19wYXRoID0gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG5hbWUoc2VsZik6CiAgICAgICAgaWYgc2VsZi5yZXEgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gbmF0aXZlX3N0cihwa2dfcmVzb3VyY2VzLnNhZmVfbmFtZShzZWxmLnJlcS5uYW1lKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzZXR1cF9weV9kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbigKICAgICAgICAgICAgc2VsZi5zb3VyY2VfZGlyLAogICAgICAgICAgICBzZWxmLmxpbmsgYW5kIHNlbGYubGluay5zdWJkaXJlY3RvcnlfZnJhZ21lbnQgb3IgJycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2V0dXBfcHkoc2VsZik6CiAgICAgICAgYXNzZXJ0IHNlbGYuc291cmNlX2RpciwgIk5vIHNvdXJjZSBkaXIgZm9yICVzIiAlIHNlbGYKICAgICAgICB0cnk6CiAgICAgICAgICAgIGltcG9ydCBzZXR1cHRvb2xzICAjIG5vcWEKICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgIGlmIGdldF9pbnN0YWxsZWRfdmVyc2lvbignc2V0dXB0b29scycpIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBhZGRfbXNnID0gIlBsZWFzZSBpbnN0YWxsIHNldHVwdG9vbHMuIgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYWRkX21zZyA9IHRyYWNlYmFjay5mb3JtYXRfZXhjKCkKICAgICAgICAgICAgIyBTZXR1cHRvb2xzIGlzIG5vdCBhdmFpbGFibGUKICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiQ291bGQgbm90IGltcG9ydCBzZXR1cHRvb2xzIHdoaWNoIGlzIHJlcXVpcmVkIHRvICIKICAgICAgICAgICAgICAgICJpbnN0YWxsIGZyb20gYSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuJXMiICUgYWRkX21zZwogICAgICAgICAgICApCgogICAgICAgIHNldHVwX3B5ID0gb3MucGF0aC5qb2luKHNlbGYuc2V0dXBfcHlfZGlyLCAnc2V0dXAucHknKQoKICAgICAgICAjIFB5dGhvbjIgX19maWxlX18gc2hvdWxkIG5vdCBiZSB1bmljb2RlCiAgICAgICAgaWYgc2l4LlBZMiBhbmQgaXNpbnN0YW5jZShzZXR1cF9weSwgc2l4LnRleHRfdHlwZSk6CiAgICAgICAgICAgIHNldHVwX3B5ID0gc2V0dXBfcHkuZW5jb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKCiAgICAgICAgcmV0dXJuIHNldHVwX3B5CgogICAgZGVmIHJ1bl9lZ2dfaW5mbyhzZWxmKToKICAgICAgICBhc3NlcnQgc2VsZi5zb3VyY2VfZGlyCiAgICAgICAgaWYgc2VsZi5uYW1lOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAnUnVubmluZyBzZXR1cC5weSAocGF0aDolcykgZWdnX2luZm8gZm9yIHBhY2thZ2UgJXMnLAogICAgICAgICAgICAgICAgc2VsZi5zZXR1cF9weSwgc2VsZi5uYW1lLAogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgJ1J1bm5pbmcgc2V0dXAucHkgKHBhdGg6JXMpIGVnZ19pbmZvIGZvciBwYWNrYWdlIGZyb20gJXMnLAogICAgICAgICAgICAgICAgc2VsZi5zZXR1cF9weSwgc2VsZi5saW5rLAogICAgICAgICAgICApCgogICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICBzY3JpcHQgPSBTRVRVUFRPT0xTX1NISU0gJSBzZWxmLnNldHVwX3B5CiAgICAgICAgICAgIGJhc2VfY21kID0gW3N5cy5leGVjdXRhYmxlLCAnLWMnLCBzY3JpcHRdCiAgICAgICAgICAgIGlmIHNlbGYuaXNvbGF0ZWQ6CiAgICAgICAgICAgICAgICBiYXNlX2NtZCArPSBbIi0tbm8tdXNlci1jZmciXQogICAgICAgICAgICBlZ2dfaW5mb19jbWQgPSBiYXNlX2NtZCArIFsnZWdnX2luZm8nXQogICAgICAgICAgICAjIFdlIGNhbid0IHB1dCB0aGUgLmVnZy1pbmZvIGZpbGVzIGF0IHRoZSByb290LCBiZWNhdXNlIHRoZW4gdGhlCiAgICAgICAgICAgICMgc291cmNlIGNvZGUgd2lsbCBiZSBtaXN0YWtlbiBmb3IgYW4gaW5zdGFsbGVkIGVnZywgY2F1c2luZwogICAgICAgICAgICAjIHByb2JsZW1zCiAgICAgICAgICAgIGlmIHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgICAgICBlZ2dfYmFzZV9vcHRpb24gPSBbXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZWdnX2luZm9fZGlyID0gb3MucGF0aC5qb2luKHNlbGYuc2V0dXBfcHlfZGlyLCAncGlwLWVnZy1pbmZvJykKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXIoZWdnX2luZm9fZGlyKQogICAgICAgICAgICAgICAgZWdnX2Jhc2Vfb3B0aW9uID0gWyctLWVnZy1iYXNlJywgJ3BpcC1lZ2ctaW5mbyddCiAgICAgICAgICAgIGNhbGxfc3VicHJvY2VzcygKICAgICAgICAgICAgICAgIGVnZ19pbmZvX2NtZCArIGVnZ19iYXNlX29wdGlvbiwKICAgICAgICAgICAgICAgIGN3ZD1zZWxmLnNldHVwX3B5X2RpciwKICAgICAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLAogICAgICAgICAgICAgICAgY29tbWFuZF9kZXNjPSdweXRob24gc2V0dXAucHkgZWdnX2luZm8nKQoKICAgICAgICBpZiBub3Qgc2VsZi5yZXE6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGFyc2VfdmVyc2lvbihzZWxmLnBrZ19pbmZvKClbIlZlcnNpb24iXSksIFZlcnNpb24pOgogICAgICAgICAgICAgICAgb3AgPSAiPT0iCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBvcCA9ICI9PT0iCiAgICAgICAgICAgIHNlbGYucmVxID0gUmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICAiIi5qb2luKFsKICAgICAgICAgICAgICAgICAgICBzZWxmLnBrZ19pbmZvKClbIk5hbWUiXSwKICAgICAgICAgICAgICAgICAgICBvcCwKICAgICAgICAgICAgICAgICAgICBzZWxmLnBrZ19pbmZvKClbIlZlcnNpb24iXSwKICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5fY29ycmVjdF9idWlsZF9sb2NhdGlvbigpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWV0YWRhdGFfbmFtZSA9IGNhbm9uaWNhbGl6ZV9uYW1lKHNlbGYucGtnX2luZm8oKVsiTmFtZSJdKQogICAgICAgICAgICBpZiBjYW5vbmljYWxpemVfbmFtZShzZWxmLnJlcS5uYW1lKSAhPSBtZXRhZGF0YV9uYW1lOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgJ1J1bm5pbmcgc2V0dXAucHkgKHBhdGg6JXMpIGVnZ19pbmZvIGZvciBwYWNrYWdlICVzICcKICAgICAgICAgICAgICAgICAgICAncHJvZHVjZWQgbWV0YWRhdGEgZm9yIHByb2plY3QgbmFtZSAlcy4gRml4IHlvdXIgJwogICAgICAgICAgICAgICAgICAgICcjZWdnPSVzIGZyYWdtZW50cy4nLAogICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0dXBfcHksIHNlbGYubmFtZSwgbWV0YWRhdGFfbmFtZSwgc2VsZi5uYW1lCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBzZWxmLnJlcSA9IFJlcXVpcmVtZW50KG1ldGFkYXRhX25hbWUpCgogICAgZGVmIGVnZ19pbmZvX2RhdGEoc2VsZiwgZmlsZW5hbWUpOgogICAgICAgIGlmIHNlbGYuc2F0aXNmaWVkX2J5IGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5zYXRpc2ZpZWRfYnkuaGFzX21ldGFkYXRhKGZpbGVuYW1lKToKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIHJldHVybiBzZWxmLnNhdGlzZmllZF9ieS5nZXRfbWV0YWRhdGEoZmlsZW5hbWUpCiAgICAgICAgYXNzZXJ0IHNlbGYuc291cmNlX2RpcgogICAgICAgIGZpbGVuYW1lID0gc2VsZi5lZ2dfaW5mb19wYXRoKGZpbGVuYW1lKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgZGF0YSA9IHJlYWRfdGV4dF9maWxlKGZpbGVuYW1lKQogICAgICAgIHJldHVybiBkYXRhCgogICAgZGVmIGVnZ19pbmZvX3BhdGgoc2VsZiwgZmlsZW5hbWUpOgogICAgICAgIGlmIHNlbGYuX2VnZ19pbmZvX3BhdGggaXMgTm9uZToKICAgICAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgICAgIGJhc2UgPSBzZWxmLnNvdXJjZV9kaXIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJhc2UgPSBvcy5wYXRoLmpvaW4oc2VsZi5zZXR1cF9weV9kaXIsICdwaXAtZWdnLWluZm8nKQogICAgICAgICAgICBmaWxlbmFtZXMgPSBvcy5saXN0ZGlyKGJhc2UpCiAgICAgICAgICAgIGlmIHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgICAgICBmaWxlbmFtZXMgPSBbXQogICAgICAgICAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoYmFzZSk6CiAgICAgICAgICAgICAgICAgICAgZm9yIGRpciBpbiB2Y3MuZGlybmFtZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRpciBpbiBkaXJzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlycy5yZW1vdmUoZGlyKQogICAgICAgICAgICAgICAgICAgICMgSXRlcmF0ZSBvdmVyIGEgY29weSBvZiBgYGRpcnNgYCwgc2luY2UgbXV0YXRpbmcKICAgICAgICAgICAgICAgICAgICAjIGEgbGlzdCB3aGlsZSBpdGVyYXRpbmcgb3ZlciBpdCBjYW4gY2F1c2UgdHJvdWJsZS4KICAgICAgICAgICAgICAgICAgICAjIChTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL3B1bGwvNDYyLikKICAgICAgICAgICAgICAgICAgICBmb3IgZGlyIGluIGxpc3QoZGlycyk6CiAgICAgICAgICAgICAgICAgICAgICAgICMgRG9uJ3Qgc2VhcmNoIGluIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIHZpcnR1YWxlbnYKICAgICAgICAgICAgICAgICAgICAgICAgIyBlbnZpcm9ubWVudAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5sZXhpc3RzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4ocm9vdCwgZGlyLCAnYmluJywgJ3B5dGhvbicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguZXhpc3RzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290LCBkaXIsICdTY3JpcHRzJywgJ1B5dGhvbi5leGUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnMucmVtb3ZlKGRpcikKICAgICAgICAgICAgICAgICAgICAgICAgIyBBbHNvIGRvbid0IHNlYXJjaCB0aHJvdWdoIHRlc3RzCiAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgZGlyID09ICd0ZXN0JyBvciBkaXIgPT0gJ3Rlc3RzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnMucmVtb3ZlKGRpcikKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZXMuZXh0ZW5kKFtvcy5wYXRoLmpvaW4ocm9vdCwgZGlyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGRpciBpbiBkaXJzXSkKICAgICAgICAgICAgICAgIGZpbGVuYW1lcyA9IFtmIGZvciBmIGluIGZpbGVuYW1lcyBpZiBmLmVuZHN3aXRoKCcuZWdnLWluZm8nKV0KCiAgICAgICAgICAgIGlmIG5vdCBmaWxlbmFtZXM6CiAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAnTm8gZmlsZXMvZGlyZWN0b3JpZXMgaW4gJXMgKGZyb20gJXMpJyAlIChiYXNlLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgYXNzZXJ0IGZpbGVuYW1lcywgXAogICAgICAgICAgICAgICAgIk5vIGZpbGVzL2RpcmVjdG9yaWVzIGluICVzIChmcm9tICVzKSIgJSAoYmFzZSwgZmlsZW5hbWUpCgogICAgICAgICAgICAjIGlmIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSBtYXRjaCwgd2UgcGljayB0aGUgdG9wbGV2ZWwgb25lLiAgVGhpcwogICAgICAgICAgICAjIGNhbiBlYXNpbHkgYmUgdGhlIGNhc2UgaWYgdGhlcmUgaXMgYSBkaXN0IGZvbGRlciB3aGljaCBjb250YWlucwogICAgICAgICAgICAjIGFuIGV4dHJhY3RlZCB0YXJiYWxsIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgogICAgICAgICAgICBpZiBsZW4oZmlsZW5hbWVzKSA+IDE6CiAgICAgICAgICAgICAgICBmaWxlbmFtZXMuc29ydCgKICAgICAgICAgICAgICAgICAgICBrZXk9bGFtYmRhIHg6IHguY291bnQob3MucGF0aC5zZXApICsKICAgICAgICAgICAgICAgICAgICAob3MucGF0aC5hbHRzZXAgYW5kIHguY291bnQob3MucGF0aC5hbHRzZXApIG9yIDApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuX2VnZ19pbmZvX3BhdGggPSBvcy5wYXRoLmpvaW4oYmFzZSwgZmlsZW5hbWVzWzBdKQogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5fZWdnX2luZm9fcGF0aCwgZmlsZW5hbWUpCgogICAgZGVmIHBrZ19pbmZvKHNlbGYpOgogICAgICAgIHAgPSBGZWVkUGFyc2VyKCkKICAgICAgICBkYXRhID0gc2VsZi5lZ2dfaW5mb19kYXRhKCdQS0ctSU5GTycpCiAgICAgICAgaWYgbm90IGRhdGE6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgJ05vIFBLRy1JTkZPIGZpbGUgZm91bmQgaW4gJXMnLAogICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKHNlbGYuZWdnX2luZm9fcGF0aCgnUEtHLUlORk8nKSksCiAgICAgICAgICAgICkKICAgICAgICBwLmZlZWQoZGF0YSBvciAnJykKICAgICAgICByZXR1cm4gcC5jbG9zZSgpCgogICAgX3JlcXVpcmVtZW50c19zZWN0aW9uX3JlID0gcmUuY29tcGlsZShyJ1xbKC4qPylcXScpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaW5zdGFsbGVkX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIGdldF9pbnN0YWxsZWRfdmVyc2lvbihzZWxmLm5hbWUpCgogICAgZGVmIGFzc2VydF9zb3VyY2VfbWF0Y2hlc192ZXJzaW9uKHNlbGYpOgogICAgICAgIGFzc2VydCBzZWxmLnNvdXJjZV9kaXIKICAgICAgICB2ZXJzaW9uID0gc2VsZi5wa2dfaW5mbygpWyd2ZXJzaW9uJ10KICAgICAgICBpZiBzZWxmLnJlcS5zcGVjaWZpZXIgYW5kIHZlcnNpb24gbm90IGluIHNlbGYucmVxLnNwZWNpZmllcjoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAnUmVxdWVzdGVkICVzLCBidXQgaW5zdGFsbGluZyB2ZXJzaW9uICVzJywKICAgICAgICAgICAgICAgIHNlbGYsCiAgICAgICAgICAgICAgICBzZWxmLmluc3RhbGxlZF92ZXJzaW9uLAogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgJ1NvdXJjZSBpbiAlcyBoYXMgdmVyc2lvbiAlcywgd2hpY2ggc2F0aXNmaWVzIHJlcXVpcmVtZW50ICVzJywKICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChzZWxmLnNvdXJjZV9kaXIpLAogICAgICAgICAgICAgICAgdmVyc2lvbiwKICAgICAgICAgICAgICAgIHNlbGYsCiAgICAgICAgICAgICkKCiAgICBkZWYgdXBkYXRlX2VkaXRhYmxlKHNlbGYsIG9idGFpbj1UcnVlKToKICAgICAgICBpZiBub3Qgc2VsZi5saW5rOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAiQ2Fubm90IHVwZGF0ZSByZXBvc2l0b3J5IGF0ICVzOyByZXBvc2l0b3J5IGxvY2F0aW9uIGlzICIKICAgICAgICAgICAgICAgICJ1bmtub3duIiwKICAgICAgICAgICAgICAgIHNlbGYuc291cmNlX2RpciwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBhc3NlcnQgc2VsZi5lZGl0YWJsZQogICAgICAgIGFzc2VydCBzZWxmLnNvdXJjZV9kaXIKICAgICAgICBpZiBzZWxmLmxpbmsuc2NoZW1lID09ICdmaWxlJzoKICAgICAgICAgICAgIyBTdGF0aWMgcGF0aHMgZG9uJ3QgZ2V0IHVwZGF0ZWQKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgYXNzZXJ0ICcrJyBpbiBzZWxmLmxpbmsudXJsLCAiYmFkIHVybDogJXIiICUgc2VsZi5saW5rLnVybAogICAgICAgIGlmIG5vdCBzZWxmLnVwZGF0ZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgdmNfdHlwZSwgdXJsID0gc2VsZi5saW5rLnVybC5zcGxpdCgnKycsIDEpCiAgICAgICAgYmFja2VuZCA9IHZjcy5nZXRfYmFja2VuZCh2Y190eXBlKQogICAgICAgIGlmIGJhY2tlbmQ6CiAgICAgICAgICAgIHZjc19iYWNrZW5kID0gYmFja2VuZChzZWxmLmxpbmsudXJsKQogICAgICAgICAgICBpZiBvYnRhaW46CiAgICAgICAgICAgICAgICB2Y3NfYmFja2VuZC5vYnRhaW4oc2VsZi5zb3VyY2VfZGlyKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmNzX2JhY2tlbmQuZXhwb3J0KHNlbGYuc291cmNlX2RpcikKICAgICAgICBlbHNlOgogICAgICAgICAgICBhc3NlcnQgMCwgKAogICAgICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgdmVyc2lvbiBjb250cm9sIHR5cGUgKGluICVzKTogJXMnCiAgICAgICAgICAgICAgICAlIChzZWxmLmxpbmssIHZjX3R5cGUpKQoKICAgIGRlZiB1bmluc3RhbGwoc2VsZiwgYXV0b19jb25maXJtPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBVbmluc3RhbGwgdGhlIGRpc3RyaWJ1dGlvbiBjdXJyZW50bHkgc2F0aXNmeWluZyB0aGlzIHJlcXVpcmVtZW50LgoKICAgICAgICBQcm9tcHRzIGJlZm9yZSByZW1vdmluZyBvciBtb2RpZnlpbmcgZmlsZXMgdW5sZXNzCiAgICAgICAgYGBhdXRvX2NvbmZpcm1gYCBpcyBUcnVlLgoKICAgICAgICBSZWZ1c2VzIHRvIGRlbGV0ZSBvciBtb2RpZnkgZmlsZXMgb3V0c2lkZSBvZiBgYHN5cy5wcmVmaXhgYCAtCiAgICAgICAgdGh1cyB1bmluc3RhbGxhdGlvbiB3aXRoaW4gYSB2aXJ0dWFsIGVudmlyb25tZW50IGNhbiBvbmx5CiAgICAgICAgbW9kaWZ5IHRoYXQgdmlydHVhbCBlbnZpcm9ubWVudCwgZXZlbiBpZiB0aGUgdmlydHVhbGVudiBpcwogICAgICAgIGxpbmtlZCB0byBnbG9iYWwgc2l0ZS1wYWNrYWdlcy4KCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfaWZfZXhpc3RzKCk6CiAgICAgICAgICAgIHJhaXNlIFVuaW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiQ2Fubm90IHVuaW5zdGFsbCByZXF1aXJlbWVudCAlcywgbm90IGluc3RhbGxlZCIgJSAoc2VsZi5uYW1lLCkKICAgICAgICAgICAgKQogICAgICAgIGRpc3QgPSBzZWxmLnNhdGlzZmllZF9ieSBvciBzZWxmLmNvbmZsaWN0c193aXRoCgogICAgICAgIGRpc3RfcGF0aCA9IG5vcm1hbGl6ZV9wYXRoKGRpc3QubG9jYXRpb24pCiAgICAgICAgaWYgbm90IGRpc3RfaXNfbG9jYWwoZGlzdCk6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgIk5vdCB1bmluc3RhbGxpbmcgJXMgYXQgJXMsIG91dHNpZGUgZW52aXJvbm1lbnQgJXMiLAogICAgICAgICAgICAgICAgZGlzdC5rZXksCiAgICAgICAgICAgICAgICBkaXN0X3BhdGgsCiAgICAgICAgICAgICAgICBzeXMucHJlZml4LAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYubm90aGluZ190b191bmluc3RhbGwgPSBUcnVlCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBkaXN0X3BhdGggaW4gZ2V0X3N0ZGxpYigpOgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICJOb3QgdW5pbnN0YWxsaW5nICVzIGF0ICVzLCBhcyBpdCBpcyBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeS4iLAogICAgICAgICAgICAgICAgZGlzdC5rZXksCiAgICAgICAgICAgICAgICBkaXN0X3BhdGgsCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5ub3RoaW5nX3RvX3VuaW5zdGFsbCA9IFRydWUKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHBhdGhzX3RvX3JlbW92ZSA9IFVuaW5zdGFsbFBhdGhTZXQoZGlzdCkKICAgICAgICBkZXZlbG9wX2VnZ19saW5rID0gZWdnX2xpbmtfcGF0aChkaXN0KQogICAgICAgIGRldmVsb3BfZWdnX2xpbmtfZWdnX2luZm8gPSAnezB9LmVnZy1pbmZvJy5mb3JtYXQoCiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMudG9fZmlsZW5hbWUoZGlzdC5wcm9qZWN0X25hbWUpKQogICAgICAgIGVnZ19pbmZvX2V4aXN0cyA9IGRpc3QuZWdnX2luZm8gYW5kIG9zLnBhdGguZXhpc3RzKGRpc3QuZWdnX2luZm8pCiAgICAgICAgIyBTcGVjaWFsIGNhc2UgZm9yIGRpc3R1dGlscyBpbnN0YWxsZWQgcGFja2FnZQogICAgICAgIGRpc3R1dGlsc19lZ2dfaW5mbyA9IGdldGF0dHIoZGlzdC5fcHJvdmlkZXIsICdwYXRoJywgTm9uZSkKCiAgICAgICAgIyBVbmluc3RhbGwgY2FzZXMgb3JkZXIgZG8gbWF0dGVyIGFzIGluIHRoZSBjYXNlIG9mIDIgaW5zdGFsbHMgb2YgdGhlCiAgICAgICAgIyBzYW1lIHBhY2thZ2UsIHBpcCBuZWVkcyB0byB1bmluc3RhbGwgdGhlIGN1cnJlbnRseSBkZXRlY3RlZCB2ZXJzaW9uCiAgICAgICAgaWYgKGVnZ19pbmZvX2V4aXN0cyBhbmQgZGlzdC5lZ2dfaW5mby5lbmRzd2l0aCgnLmVnZy1pbmZvJykgYW5kCiAgICAgICAgICAgICAgICBub3QgZGlzdC5lZ2dfaW5mby5lbmRzd2l0aChkZXZlbG9wX2VnZ19saW5rX2VnZ19pbmZvKSk6CiAgICAgICAgICAgICMgaWYgZGlzdC5lZ2dfaW5mby5lbmRzd2l0aChkZXZlbG9wX2VnZ19saW5rX2VnZ19pbmZvKSwgd2UKICAgICAgICAgICAgIyBhcmUgaW4gZmFjdCBpbiB0aGUgZGV2ZWxvcF9lZ2dfbGluayBjYXNlCiAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQoZGlzdC5lZ2dfaW5mbykKICAgICAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ2luc3RhbGxlZC1maWxlcy50eHQnKToKICAgICAgICAgICAgICAgIGZvciBpbnN0YWxsZWRfZmlsZSBpbiBkaXN0LmdldF9tZXRhZGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgJ2luc3RhbGxlZC1maWxlcy50eHQnKS5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgoCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihkaXN0LmVnZ19pbmZvLCBpbnN0YWxsZWRfZmlsZSkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChwYXRoKQogICAgICAgICAgICAjIEZJWE1FOiBuZWVkIGEgdGVzdCBmb3IgdGhpcyBlbGlmIGJsb2NrCiAgICAgICAgICAgICMgb2NjdXJzIHdpdGggLS1zaW5nbGUtdmVyc2lvbi1leHRlcm5hbGx5LW1hbmFnZWQvLS1yZWNvcmQgb3V0c2lkZQogICAgICAgICAgICAjIG9mIHBpcAogICAgICAgICAgICBlbGlmIGRpc3QuaGFzX21ldGFkYXRhKCd0b3BfbGV2ZWwudHh0Jyk6CiAgICAgICAgICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpOgogICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZXMgPSBkaXN0LmdldF9tZXRhZGF0YSgnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZXMgPSBbXQogICAgICAgICAgICAgICAgZm9yIHRvcF9sZXZlbF9wa2cgaW4gWwogICAgICAgICAgICAgICAgICAgICAgICBwIGZvciBwCiAgICAgICAgICAgICAgICAgICAgICAgIGluIGRpc3QuZ2V0X21ldGFkYXRhKCd0b3BfbGV2ZWwudHh0Jykuc3BsaXRsaW5lcygpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHAgYW5kIHAgbm90IGluIG5hbWVzcGFjZXNdOgogICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlzdC5sb2NhdGlvbiwgdG9wX2xldmVsX3BrZykKICAgICAgICAgICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKHBhdGgpCiAgICAgICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChwYXRoICsgJy5weScpCiAgICAgICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChwYXRoICsgJy5weWMnKQogICAgICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQocGF0aCArICcucHlvJykKCiAgICAgICAgZWxpZiBkaXN0dXRpbHNfZWdnX2luZm86CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiVW5pbnN0YWxsaW5nIGEgZGlzdHV0aWxzIGluc3RhbGxlZCBwcm9qZWN0ICh7MH0pIGhhcyBiZWVuICIKICAgICAgICAgICAgICAgICJkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4gVGhpcyBpcyAiCiAgICAgICAgICAgICAgICAiZHVlIHRvIHRoZSBmYWN0IHRoYXQgdW5pbnN0YWxsaW5nIGEgZGlzdHV0aWxzIHByb2plY3Qgd2lsbCAiCiAgICAgICAgICAgICAgICAib25seSBwYXJ0aWFsbHkgdW5pbnN0YWxsIHRoZSBwcm9qZWN0LiIuZm9ybWF0KHNlbGYubmFtZSksCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChkaXN0dXRpbHNfZWdnX2luZm8pCgogICAgICAgIGVsaWYgZGlzdC5sb2NhdGlvbi5lbmRzd2l0aCgnLmVnZycpOgogICAgICAgICAgICAjIHBhY2thZ2UgaW5zdGFsbGVkIGJ5IGVhc3lfaW5zdGFsbAogICAgICAgICAgICAjIFdlIGNhbm5vdCBtYXRjaCBvbiBkaXN0LmVnZ19uYW1lIGJlY2F1c2UgaXQgY2FuIHNsaWdodGx5IHZhcnkKICAgICAgICAgICAgIyBpLmUuIHNldHVwdG9vbHMtMC42YzExLXB5Mi42LmVnZyB2cyBzZXR1cHRvb2xzLTAuNnJjMTEtcHkyLjYuZWdnCiAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQoZGlzdC5sb2NhdGlvbikKICAgICAgICAgICAgZWFzeV9pbnN0YWxsX2VnZyA9IG9zLnBhdGguc3BsaXQoZGlzdC5sb2NhdGlvbilbMV0KICAgICAgICAgICAgZWFzeV9pbnN0YWxsX3B0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoZGlzdC5sb2NhdGlvbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vhc3ktaW5zdGFsbC5wdGgnKQogICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkX3B0aChlYXN5X2luc3RhbGxfcHRoLCAnLi8nICsgZWFzeV9pbnN0YWxsX2VnZykKCiAgICAgICAgZWxpZiBlZ2dfaW5mb19leGlzdHMgYW5kIGRpc3QuZWdnX2luZm8uZW5kc3dpdGgoJy5kaXN0LWluZm8nKToKICAgICAgICAgICAgZm9yIHBhdGggaW4gcGlwLndoZWVsLnVuaW5zdGFsbGF0aW9uX3BhdGhzKGRpc3QpOgogICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChwYXRoKQoKICAgICAgICBlbGlmIGRldmVsb3BfZWdnX2xpbms6CiAgICAgICAgICAgICMgZGV2ZWxvcCBlZ2cKICAgICAgICAgICAgd2l0aCBvcGVuKGRldmVsb3BfZWdnX2xpbmssICdyJykgYXMgZmg6CiAgICAgICAgICAgICAgICBsaW5rX3BvaW50ZXIgPSBvcy5wYXRoLm5vcm1jYXNlKGZoLnJlYWRsaW5lKCkuc3RyaXAoKSkKICAgICAgICAgICAgYXNzZXJ0IChsaW5rX3BvaW50ZXIgPT0gZGlzdC5sb2NhdGlvbiksICgKICAgICAgICAgICAgICAgICdFZ2ctbGluayAlcyBkb2VzIG5vdCBtYXRjaCBpbnN0YWxsZWQgbG9jYXRpb24gb2YgJXMgJwogICAgICAgICAgICAgICAgJyhhdCAlcyknICUgKGxpbmtfcG9pbnRlciwgc2VsZi5uYW1lLCBkaXN0LmxvY2F0aW9uKQogICAgICAgICAgICApCiAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQoZGV2ZWxvcF9lZ2dfbGluaykKICAgICAgICAgICAgZWFzeV9pbnN0YWxsX3B0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoZGV2ZWxvcF9lZ2dfbGluayksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vhc3ktaW5zdGFsbC5wdGgnKQogICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkX3B0aChlYXN5X2luc3RhbGxfcHRoLCBkaXN0LmxvY2F0aW9uKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAnTm90IHN1cmUgaG93IHRvIHVuaW5zdGFsbDogJXMgLSBDaGVjazogJXMnLAogICAgICAgICAgICAgICAgZGlzdCwgZGlzdC5sb2NhdGlvbikKCiAgICAgICAgIyBmaW5kIGRpc3R1dGlscyBzY3JpcHRzPSBzY3JpcHRzCiAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ3NjcmlwdHMnKSBhbmQgZGlzdC5tZXRhZGF0YV9pc2Rpcignc2NyaXB0cycpOgogICAgICAgICAgICBmb3Igc2NyaXB0IGluIGRpc3QubWV0YWRhdGFfbGlzdGRpcignc2NyaXB0cycpOgogICAgICAgICAgICAgICAgaWYgZGlzdF9pbl91c2Vyc2l0ZShkaXN0KToKICAgICAgICAgICAgICAgICAgICBiaW5fZGlyID0gYmluX3VzZXIKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgYmluX2RpciA9IGJpbl9weQogICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChvcy5wYXRoLmpvaW4oYmluX2Rpciwgc2NyaXB0KSkKICAgICAgICAgICAgICAgIGlmIFdJTkRPV1M6CiAgICAgICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChvcy5wYXRoLmpvaW4oYmluX2Rpciwgc2NyaXB0KSArICcuYmF0JykKCiAgICAgICAgIyBmaW5kIGNvbnNvbGVfc2NyaXB0cwogICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdlbnRyeV9wb2ludHMudHh0Jyk6CiAgICAgICAgICAgIGlmIHNpeC5QWTI6CiAgICAgICAgICAgICAgICBvcHRpb25zID0ge30KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7ImRlbGltaXRlcnMiOiAoJz0nLCApfQogICAgICAgICAgICBjb25maWcgPSBjb25maWdwYXJzZXIuU2FmZUNvbmZpZ1BhcnNlcigqKm9wdGlvbnMpCiAgICAgICAgICAgIGNvbmZpZy5yZWFkZnAoCiAgICAgICAgICAgICAgICBGYWtlRmlsZShkaXN0LmdldF9tZXRhZGF0YV9saW5lcygnZW50cnlfcG9pbnRzLnR4dCcpKQogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIGNvbmZpZy5oYXNfc2VjdGlvbignY29uc29sZV9zY3JpcHRzJyk6CiAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gY29uZmlnLml0ZW1zKCdjb25zb2xlX3NjcmlwdHMnKToKICAgICAgICAgICAgICAgICAgICBpZiBkaXN0X2luX3VzZXJzaXRlKGRpc3QpOgogICAgICAgICAgICAgICAgICAgICAgICBiaW5fZGlyID0gYmluX3VzZXIKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBiaW5fZGlyID0gYmluX3B5CiAgICAgICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChvcy5wYXRoLmpvaW4oYmluX2RpciwgbmFtZSkpCiAgICAgICAgICAgICAgICAgICAgaWYgV0lORE9XUzoKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihiaW5fZGlyLCBuYW1lKSArICcuZXhlJwogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oYmluX2RpciwgbmFtZSkgKyAnLmV4ZS5tYW5pZmVzdCcKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGJpbl9kaXIsIG5hbWUpICsgJy1zY3JpcHQucHknCiAgICAgICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLnJlbW92ZShhdXRvX2NvbmZpcm0pCiAgICAgICAgc2VsZi51bmluc3RhbGxlZCA9IHBhdGhzX3RvX3JlbW92ZQoKICAgIGRlZiByb2xsYmFja191bmluc3RhbGwoc2VsZik6CiAgICAgICAgaWYgc2VsZi51bmluc3RhbGxlZDoKICAgICAgICAgICAgc2VsZi51bmluc3RhbGxlZC5yb2xsYmFjaygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IHJvbGxiYWNrICVzLCBub3RoaW5nIHVuaW5zdGFsbGVkLiIsIHNlbGYubmFtZSwKICAgICAgICAgICAgKQoKICAgIGRlZiBjb21taXRfdW5pbnN0YWxsKHNlbGYpOgogICAgICAgIGlmIHNlbGYudW5pbnN0YWxsZWQ6CiAgICAgICAgICAgIHNlbGYudW5pbnN0YWxsZWQuY29tbWl0KCkKICAgICAgICBlbGlmIG5vdCBzZWxmLm5vdGhpbmdfdG9fdW5pbnN0YWxsOgogICAgICAgICAgICBsb2dnZXIuZXJyb3IoCiAgICAgICAgICAgICAgICAiQ2FuJ3QgY29tbWl0ICVzLCBub3RoaW5nIHVuaW5zdGFsbGVkLiIsIHNlbGYubmFtZSwKICAgICAgICAgICAgKQoKICAgIGRlZiBhcmNoaXZlKHNlbGYsIGJ1aWxkX2Rpcik6CiAgICAgICAgYXNzZXJ0IHNlbGYuc291cmNlX2RpcgogICAgICAgIGNyZWF0ZV9hcmNoaXZlID0gVHJ1ZQogICAgICAgIGFyY2hpdmVfbmFtZSA9ICclcy0lcy56aXAnICUgKHNlbGYubmFtZSwgc2VsZi5wa2dfaW5mbygpWyJ2ZXJzaW9uIl0pCiAgICAgICAgYXJjaGl2ZV9wYXRoID0gb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgYXJjaGl2ZV9uYW1lKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGFyY2hpdmVfcGF0aCk6CiAgICAgICAgICAgIHJlc3BvbnNlID0gYXNrX3BhdGhfZXhpc3RzKAogICAgICAgICAgICAgICAgJ1RoZSBmaWxlICVzIGV4aXN0cy4gKGkpZ25vcmUsICh3KWlwZSwgKGIpYWNrdXAsIChhKWJvcnQgJyAlCiAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoYXJjaGl2ZV9wYXRoKSwgKCdpJywgJ3cnLCAnYicsICdhJykpCiAgICAgICAgICAgIGlmIHJlc3BvbnNlID09ICdpJzoKICAgICAgICAgICAgICAgIGNyZWF0ZV9hcmNoaXZlID0gRmFsc2UKICAgICAgICAgICAgZWxpZiByZXNwb25zZSA9PSAndyc6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnRGVsZXRpbmcgJXMnLCBkaXNwbGF5X3BhdGgoYXJjaGl2ZV9wYXRoKSkKICAgICAgICAgICAgICAgIG9zLnJlbW92ZShhcmNoaXZlX3BhdGgpCiAgICAgICAgICAgIGVsaWYgcmVzcG9uc2UgPT0gJ2InOgogICAgICAgICAgICAgICAgZGVzdF9maWxlID0gYmFja3VwX2RpcihhcmNoaXZlX3BhdGgpCiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAnQmFja2luZyB1cCAlcyB0byAlcycsCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGFyY2hpdmVfcGF0aCksCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGRlc3RfZmlsZSksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBzaHV0aWwubW92ZShhcmNoaXZlX3BhdGgsIGRlc3RfZmlsZSkKICAgICAgICAgICAgZWxpZiByZXNwb25zZSA9PSAnYSc6CiAgICAgICAgICAgICAgICBzeXMuZXhpdCgtMSkKICAgICAgICBpZiBjcmVhdGVfYXJjaGl2ZToKICAgICAgICAgICAgemlwID0gemlwZmlsZS5aaXBGaWxlKAogICAgICAgICAgICAgICAgYXJjaGl2ZV9wYXRoLCAndycsIHppcGZpbGUuWklQX0RFRkxBVEVELAogICAgICAgICAgICAgICAgYWxsb3daaXA2ND1UcnVlCiAgICAgICAgICAgICkKICAgICAgICAgICAgZGlyID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLmFic3BhdGgoc2VsZi5zZXR1cF9weV9kaXIpKQogICAgICAgICAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKGRpcik6CiAgICAgICAgICAgICAgICBpZiAncGlwLWVnZy1pbmZvJyBpbiBkaXJuYW1lczoKICAgICAgICAgICAgICAgICAgICBkaXJuYW1lcy5yZW1vdmUoJ3BpcC1lZ2ctaW5mbycpCiAgICAgICAgICAgICAgICBmb3IgZGlybmFtZSBpbiBkaXJuYW1lczoKICAgICAgICAgICAgICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5qb2luKGRpcnBhdGgsIGRpcm5hbWUpCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHNlbGYuX2NsZWFuX3ppcF9uYW1lKGRpcm5hbWUsIGRpcikKICAgICAgICAgICAgICAgICAgICB6aXBkaXIgPSB6aXBmaWxlLlppcEluZm8oc2VsZi5uYW1lICsgJy8nICsgbmFtZSArICcvJykKICAgICAgICAgICAgICAgICAgICB6aXBkaXIuZXh0ZXJuYWxfYXR0ciA9IDB4MUVEIDw8IDE2ICAjIDBvNzU1CiAgICAgICAgICAgICAgICAgICAgemlwLndyaXRlc3RyKHppcGRpciwgJycpCiAgICAgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lID09IFBJUF9ERUxFVEVfTUFSS0VSX0ZJTEVOQU1FOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKGRpcnBhdGgsIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBzZWxmLl9jbGVhbl96aXBfbmFtZShmaWxlbmFtZSwgZGlyKQogICAgICAgICAgICAgICAgICAgIHppcC53cml0ZShmaWxlbmFtZSwgc2VsZi5uYW1lICsgJy8nICsgbmFtZSkKICAgICAgICAgICAgemlwLmNsb3NlKCkKICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1NhdmVkICVzJywgZGlzcGxheV9wYXRoKGFyY2hpdmVfcGF0aCkpCgogICAgZGVmIF9jbGVhbl96aXBfbmFtZShzZWxmLCBuYW1lLCBwcmVmaXgpOgogICAgICAgIGFzc2VydCBuYW1lLnN0YXJ0c3dpdGgocHJlZml4ICsgb3MucGF0aC5zZXApLCAoCiAgICAgICAgICAgICJuYW1lICVyIGRvZXNuJ3Qgc3RhcnQgd2l0aCBwcmVmaXggJXIiICUgKG5hbWUsIHByZWZpeCkKICAgICAgICApCiAgICAgICAgbmFtZSA9IG5hbWVbbGVuKHByZWZpeCkgKyAxOl0KICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKG9zLnBhdGguc2VwLCAnLycpCiAgICAgICAgcmV0dXJuIG5hbWUKCiAgICBkZWYgbWF0Y2hfbWFya2VycyhzZWxmLCBleHRyYXNfcmVxdWVzdGVkPU5vbmUpOgogICAgICAgIGlmIG5vdCBleHRyYXNfcmVxdWVzdGVkOgogICAgICAgICAgICAjIFByb3ZpZGUgYW4gZXh0cmEgdG8gc2FmZWx5IGV2YWx1YXRlIHRoZSBtYXJrZXJzCiAgICAgICAgICAgICMgd2l0aG91dCBtYXRjaGluZyBhbnkgZXh0cmEKICAgICAgICAgICAgZXh0cmFzX3JlcXVlc3RlZCA9ICgnJywpCiAgICAgICAgaWYgc2VsZi5tYXJrZXJzIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gYW55KAogICAgICAgICAgICAgICAgc2VsZi5tYXJrZXJzLmV2YWx1YXRlKHsnZXh0cmEnOiBleHRyYX0pCiAgICAgICAgICAgICAgICBmb3IgZXh0cmEgaW4gZXh0cmFzX3JlcXVlc3RlZCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBpbnN0YWxsKHNlbGYsIGluc3RhbGxfb3B0aW9ucywgZ2xvYmFsX29wdGlvbnM9W10sIHJvb3Q9Tm9uZSwKICAgICAgICAgICAgICAgIHByZWZpeD1Ob25lKToKICAgICAgICBpZiBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICBzZWxmLmluc3RhbGxfZWRpdGFibGUoCiAgICAgICAgICAgICAgICBpbnN0YWxsX29wdGlvbnMsIGdsb2JhbF9vcHRpb25zLCBwcmVmaXg9cHJlZml4KQogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBzZWxmLmlzX3doZWVsOgogICAgICAgICAgICB2ZXJzaW9uID0gcGlwLndoZWVsLndoZWVsX3ZlcnNpb24oc2VsZi5zb3VyY2VfZGlyKQogICAgICAgICAgICBwaXAud2hlZWwuY2hlY2tfY29tcGF0aWJpbGl0eSh2ZXJzaW9uLCBzZWxmLm5hbWUpCgogICAgICAgICAgICBzZWxmLm1vdmVfd2hlZWxfZmlsZXMoc2VsZi5zb3VyY2VfZGlyLCByb290PXJvb3QsIHByZWZpeD1wcmVmaXgpCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zdWNjZWVkZWQgPSBUcnVlCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIEV4dGVuZCB0aGUgbGlzdCBvZiBnbG9iYWwgYW5kIGluc3RhbGwgb3B0aW9ucyBwYXNzZWQgb24gdG8KICAgICAgICAjIHRoZSBzZXR1cC5weSBjYWxsIHdpdGggdGhlIG9uZXMgZnJvbSB0aGUgcmVxdWlyZW1lbnRzIGZpbGUuCiAgICAgICAgIyBPcHRpb25zIHNwZWNpZmllZCBpbiByZXF1aXJlbWVudHMgZmlsZSBvdmVycmlkZSB0aG9zZQogICAgICAgICMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIHNpbmNlIHRoZSBsYXN0IG9wdGlvbiBnaXZlbgogICAgICAgICMgdG8gc2V0dXAucHkgaXMgdGhlIG9uZSB0aGF0IGlzIHVzZWQuCiAgICAgICAgZ2xvYmFsX29wdGlvbnMgKz0gc2VsZi5vcHRpb25zLmdldCgnZ2xvYmFsX29wdGlvbnMnLCBbXSkKICAgICAgICBpbnN0YWxsX29wdGlvbnMgKz0gc2VsZi5vcHRpb25zLmdldCgnaW5zdGFsbF9vcHRpb25zJywgW10pCgogICAgICAgIGlmIHNlbGYuaXNvbGF0ZWQ6CiAgICAgICAgICAgIGdsb2JhbF9vcHRpb25zID0gbGlzdChnbG9iYWxfb3B0aW9ucykgKyBbIi0tbm8tdXNlci1jZmciXQoKICAgICAgICB0ZW1wX2xvY2F0aW9uID0gdGVtcGZpbGUubWtkdGVtcCgnLXJlY29yZCcsICdwaXAtJykKICAgICAgICByZWNvcmRfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4odGVtcF9sb2NhdGlvbiwgJ2luc3RhbGwtcmVjb3JkLnR4dCcpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpbnN0YWxsX2FyZ3MgPSBzZWxmLmdldF9pbnN0YWxsX2FyZ3MoCiAgICAgICAgICAgICAgICBnbG9iYWxfb3B0aW9ucywgcmVjb3JkX2ZpbGVuYW1lLCByb290LCBwcmVmaXgpCiAgICAgICAgICAgIG1zZyA9ICdSdW5uaW5nIHNldHVwLnB5IGluc3RhbGwgZm9yICVzJyAlIChzZWxmLm5hbWUsKQogICAgICAgICAgICB3aXRoIG9wZW5fc3Bpbm5lcihtc2cpIGFzIHNwaW5uZXI6CiAgICAgICAgICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgICAgICAgICBjYWxsX3N1YnByb2Nlc3MoCiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxfYXJncyArIGluc3RhbGxfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgY3dkPXNlbGYuc2V0dXBfcHlfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbm5lcj1zcGlubmVyLAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhyZWNvcmRfZmlsZW5hbWUpOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZWNvcmQgZmlsZSAlcyBub3QgZm91bmQnLCByZWNvcmRfZmlsZW5hbWUpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3N1Y2NlZWRlZCA9IFRydWUKICAgICAgICAgICAgaWYgc2VsZi5hc19lZ2c6CiAgICAgICAgICAgICAgICAjIHRoZXJlJ3Mgbm8gLS1hbHdheXMtdW56aXAgb3B0aW9uIHdlIGNhbiBwYXNzIHRvIGluc3RhbGwKICAgICAgICAgICAgICAgICMgY29tbWFuZCBzbyB3ZSB1bmFibGUgdG8gc2F2ZSB0aGUgaW5zdGFsbGVkLWZpbGVzLnR4dAogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICBkZWYgcHJlcGVuZF9yb290KHBhdGgpOgogICAgICAgICAgICAgICAgaWYgcm9vdCBpcyBOb25lIG9yIG5vdCBvcy5wYXRoLmlzYWJzKHBhdGgpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2Vfcm9vdChyb290LCBwYXRoKQoKICAgICAgICAgICAgd2l0aCBvcGVuKHJlY29yZF9maWxlbmFtZSkgYXMgZjoKICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CiAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gb3MucGF0aC5kaXJuYW1lKGxpbmUpCiAgICAgICAgICAgICAgICAgICAgaWYgZGlyZWN0b3J5LmVuZHN3aXRoKCcuZWdnLWluZm8nKToKICAgICAgICAgICAgICAgICAgICAgICAgZWdnX2luZm9fZGlyID0gcHJlcGVuZF9yb290KGRpcmVjdG9yeSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3QgZmluZCAuZWdnLWluZm8gZGlyZWN0b3J5IGluIGluc3RhbGwgcmVjb3JkJwogICAgICAgICAgICAgICAgICAgICAgICAnIGZvciAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICMgRklYTUU6IHB1dCB0aGUgcmVjb3JkIHNvbWV3aGVyZQogICAgICAgICAgICAgICAgICAgICMgRklYTUU6IHNob3VsZCB0aGlzIGJlIGFuIGVycm9yPwogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBuZXdfbGluZXMgPSBbXQogICAgICAgICAgICB3aXRoIG9wZW4ocmVjb3JkX2ZpbGVuYW1lKSBhcyBmOgogICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZmlsZW5hbWUpOgogICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSArPSBvcy5wYXRoLnNlcAogICAgICAgICAgICAgICAgICAgIG5ld19saW5lcy5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGgucmVscGF0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmRfcm9vdChmaWxlbmFtZSksIGVnZ19pbmZvX2RpcikKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGluc3RfZmlsZXNfcGF0aCA9IG9zLnBhdGguam9pbihlZ2dfaW5mb19kaXIsICdpbnN0YWxsZWQtZmlsZXMudHh0JykKICAgICAgICAgICAgd2l0aCBvcGVuKGluc3RfZmlsZXNfcGF0aCwgJ3cnKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZSgnXG4nLmpvaW4obmV3X2xpbmVzKSArICdcbicpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmVjb3JkX2ZpbGVuYW1lKToKICAgICAgICAgICAgICAgIG9zLnJlbW92ZShyZWNvcmRfZmlsZW5hbWUpCiAgICAgICAgICAgIHJtdHJlZSh0ZW1wX2xvY2F0aW9uKQoKICAgIGRlZiBlbnN1cmVfaGFzX3NvdXJjZV9kaXIoc2VsZiwgcGFyZW50X2Rpcik6CiAgICAgICAgIiIiRW5zdXJlIHRoYXQgYSBzb3VyY2VfZGlyIGlzIHNldC4KCiAgICAgICAgVGhpcyB3aWxsIGNyZWF0ZSBhIHRlbXBvcmFyeSBidWlsZCBkaXIgaWYgdGhlIG5hbWUgb2YgdGhlIHJlcXVpcmVtZW50CiAgICAgICAgaXNuJ3Qga25vd24geWV0LgoKICAgICAgICA6cGFyYW0gcGFyZW50X2RpcjogVGhlIGlkZWFsIHBpcCBwYXJlbnRfZGlyIGZvciB0aGUgc291cmNlX2Rpci4KICAgICAgICAgICAgR2VuZXJhbGx5IHNyY19kaXIgZm9yIGVkaXRhYmxlcyBhbmQgYnVpbGRfZGlyIGZvciBzZGlzdHMuCiAgICAgICAgOnJldHVybjogc2VsZi5zb3VyY2VfZGlyCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5zb3VyY2VfZGlyIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc291cmNlX2RpciA9IHNlbGYuYnVpbGRfbG9jYXRpb24ocGFyZW50X2RpcikKICAgICAgICByZXR1cm4gc2VsZi5zb3VyY2VfZGlyCgogICAgZGVmIGdldF9pbnN0YWxsX2FyZ3Moc2VsZiwgZ2xvYmFsX29wdGlvbnMsIHJlY29yZF9maWxlbmFtZSwgcm9vdCwgcHJlZml4KToKICAgICAgICBpbnN0YWxsX2FyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsICItdSJdCiAgICAgICAgaW5zdGFsbF9hcmdzLmFwcGVuZCgnLWMnKQogICAgICAgIGluc3RhbGxfYXJncy5hcHBlbmQoU0VUVVBUT09MU19TSElNICUgc2VsZi5zZXR1cF9weSkKICAgICAgICBpbnN0YWxsX2FyZ3MgKz0gbGlzdChnbG9iYWxfb3B0aW9ucykgKyBcCiAgICAgICAgICAgIFsnaW5zdGFsbCcsICctLXJlY29yZCcsIHJlY29yZF9maWxlbmFtZV0KCiAgICAgICAgaWYgbm90IHNlbGYuYXNfZWdnOgogICAgICAgICAgICBpbnN0YWxsX2FyZ3MgKz0gWyctLXNpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZCddCgogICAgICAgIGlmIHJvb3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGluc3RhbGxfYXJncyArPSBbJy0tcm9vdCcsIHJvb3RdCiAgICAgICAgaWYgcHJlZml4IGlzIG5vdCBOb25lOgogICAgICAgICAgICBpbnN0YWxsX2FyZ3MgKz0gWyctLXByZWZpeCcsIHByZWZpeF0KCiAgICAgICAgaWYgc2VsZi5weWNvbXBpbGU6CiAgICAgICAgICAgIGluc3RhbGxfYXJncyArPSBbIi0tY29tcGlsZSJdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaW5zdGFsbF9hcmdzICs9IFsiLS1uby1jb21waWxlIl0KCiAgICAgICAgaWYgcnVubmluZ191bmRlcl92aXJ0dWFsZW52KCk6CiAgICAgICAgICAgIHB5X3Zlcl9zdHIgPSAncHl0aG9uJyArIHN5c2NvbmZpZy5nZXRfcHl0aG9uX3ZlcnNpb24oKQogICAgICAgICAgICBpbnN0YWxsX2FyZ3MgKz0gWyctLWluc3RhbGwtaGVhZGVycycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICdpbmNsdWRlJywgJ3NpdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweV92ZXJfc3RyLCBzZWxmLm5hbWUpXQoKICAgICAgICByZXR1cm4gaW5zdGFsbF9hcmdzCgogICAgZGVmIHJlbW92ZV90ZW1wb3Jhcnlfc291cmNlKHNlbGYpOgogICAgICAgICIiIlJlbW92ZSB0aGUgc291cmNlIGZpbGVzIGZyb20gdGhpcyByZXF1aXJlbWVudCwgaWYgdGhleSBhcmUgbWFya2VkCiAgICAgICAgZm9yIGRlbGV0aW9uIiIiCiAgICAgICAgaWYgc2VsZi5zb3VyY2VfZGlyIGFuZCBvcy5wYXRoLmV4aXN0cygKICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLnNvdXJjZV9kaXIsIFBJUF9ERUxFVEVfTUFSS0VSX0ZJTEVOQU1FKSk6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVtb3Zpbmcgc291cmNlIGluICVzJywgc2VsZi5zb3VyY2VfZGlyKQogICAgICAgICAgICBybXRyZWUoc2VsZi5zb3VyY2VfZGlyKQogICAgICAgIHNlbGYuc291cmNlX2RpciA9IE5vbmUKICAgICAgICBpZiBzZWxmLl90ZW1wX2J1aWxkX2RpciBhbmQgb3MucGF0aC5leGlzdHMoc2VsZi5fdGVtcF9idWlsZF9kaXIpOgogICAgICAgICAgICBybXRyZWUoc2VsZi5fdGVtcF9idWlsZF9kaXIpCiAgICAgICAgc2VsZi5fdGVtcF9idWlsZF9kaXIgPSBOb25lCgogICAgZGVmIGluc3RhbGxfZWRpdGFibGUoc2VsZiwgaW5zdGFsbF9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX29wdGlvbnM9KCksIHByZWZpeD1Ob25lKToKICAgICAgICBsb2dnZXIuaW5mbygnUnVubmluZyBzZXR1cC5weSBkZXZlbG9wIGZvciAlcycsIHNlbGYubmFtZSkKCiAgICAgICAgaWYgc2VsZi5pc29sYXRlZDoKICAgICAgICAgICAgZ2xvYmFsX29wdGlvbnMgPSBsaXN0KGdsb2JhbF9vcHRpb25zKSArIFsiLS1uby11c2VyLWNmZyJdCgogICAgICAgIGlmIHByZWZpeDoKICAgICAgICAgICAgcHJlZml4X3BhcmFtID0gWyctLXByZWZpeD17MH0nLmZvcm1hdChwcmVmaXgpXQogICAgICAgICAgICBpbnN0YWxsX29wdGlvbnMgPSBsaXN0KGluc3RhbGxfb3B0aW9ucykgKyBwcmVmaXhfcGFyYW0KCiAgICAgICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgICAgICMgRklYTUU6IHNob3VsZCB3ZSBkbyAtLWluc3RhbGwtaGVhZGVycyBoZXJlIHRvbz8KICAgICAgICAgICAgY2FsbF9zdWJwcm9jZXNzKAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHN5cy5leGVjdXRhYmxlLAogICAgICAgICAgICAgICAgICAgICctYycsCiAgICAgICAgICAgICAgICAgICAgU0VUVVBUT09MU19TSElNICUgc2VsZi5zZXR1cF9weQogICAgICAgICAgICAgICAgXSArCiAgICAgICAgICAgICAgICBsaXN0KGdsb2JhbF9vcHRpb25zKSArCiAgICAgICAgICAgICAgICBbJ2RldmVsb3AnLCAnLS1uby1kZXBzJ10gKwogICAgICAgICAgICAgICAgbGlzdChpbnN0YWxsX29wdGlvbnMpLAoKICAgICAgICAgICAgICAgIGN3ZD1zZWxmLnNldHVwX3B5X2RpciwKICAgICAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlKQoKICAgICAgICBzZWxmLmluc3RhbGxfc3VjY2VlZGVkID0gVHJ1ZQoKICAgIGRlZiBjaGVja19pZl9leGlzdHMoc2VsZik6CiAgICAgICAgIiIiRmluZCBhbiBpbnN0YWxsZWQgZGlzdHJpYnV0aW9uIHRoYXQgc2F0aXNmaWVzIG9yIGNvbmZsaWN0cwogICAgICAgIHdpdGggdGhpcyByZXF1aXJlbWVudCwgYW5kIHNldCBzZWxmLnNhdGlzZmllZF9ieSBvcgogICAgICAgIHNlbGYuY29uZmxpY3RzX3dpdGggYXBwcm9wcmlhdGVseS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnJlcSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgZ2V0X2Rpc3RyaWJ1dGlvbigpIHdpbGwgcmVzb2x2ZSB0aGUgZW50aXJlIGxpc3Qgb2YgcmVxdWlyZW1lbnRzCiAgICAgICAgICAgICMgYW55d2F5LCBhbmQgd2UndmUgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQgd2UgbmVlZCB0aGUgcmVxdWlyZW1lbnQKICAgICAgICAgICAgIyBpbiBxdWVzdGlvbiwgc28gc3RyaXAgdGhlIG1hcmtlciBzbyB0aGF0IHdlIGRvbid0IHRyeSB0bwogICAgICAgICAgICAjIGV2YWx1YXRlIGl0LgogICAgICAgICAgICBub19tYXJrZXIgPSBSZXF1aXJlbWVudChzdHIoc2VsZi5yZXEpKQogICAgICAgICAgICBub19tYXJrZXIubWFya2VyID0gTm9uZQogICAgICAgICAgICBzZWxmLnNhdGlzZmllZF9ieSA9IHBrZ19yZXNvdXJjZXMuZ2V0X2Rpc3RyaWJ1dGlvbihzdHIobm9fbWFya2VyKSkKICAgICAgICAgICAgaWYgc2VsZi5lZGl0YWJsZSBhbmQgc2VsZi5zYXRpc2ZpZWRfYnk6CiAgICAgICAgICAgICAgICBzZWxmLmNvbmZsaWN0c193aXRoID0gc2VsZi5zYXRpc2ZpZWRfYnkKICAgICAgICAgICAgICAgICMgd2hlbiBpbnN0YWxsaW5nIGVkaXRhYmxlcywgbm90aGluZyBwcmUtZXhpc3Rpbmcgc2hvdWxkIGV2ZXIKICAgICAgICAgICAgICAgICMgc2F0aXNmeQogICAgICAgICAgICAgICAgc2VsZi5zYXRpc2ZpZWRfYnkgPSBOb25lCiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGV4Y2VwdCBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbk5vdEZvdW5kOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBleGNlcHQgcGtnX3Jlc291cmNlcy5WZXJzaW9uQ29uZmxpY3Q6CiAgICAgICAgICAgIGV4aXN0aW5nX2Rpc3QgPSBwa2dfcmVzb3VyY2VzLmdldF9kaXN0cmlidXRpb24oCiAgICAgICAgICAgICAgICBzZWxmLnJlcS5uYW1lCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgc2VsZi51c2VfdXNlcl9zaXRlOgogICAgICAgICAgICAgICAgaWYgZGlzdF9pbl91c2Vyc2l0ZShleGlzdGluZ19kaXN0KToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZsaWN0c193aXRoID0gZXhpc3RpbmdfZGlzdAogICAgICAgICAgICAgICAgZWxpZiAocnVubmluZ191bmRlcl92aXJ0dWFsZW52KCkgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RfaW5fc2l0ZV9wYWNrYWdlcyhleGlzdGluZ19kaXN0KSk6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICJXaWxsIG5vdCBpbnN0YWxsIHRvIHRoZSB1c2VyIHNpdGUgYmVjYXVzZSBpdCB3aWxsICIKICAgICAgICAgICAgICAgICAgICAgICAgImxhY2sgc3lzLnBhdGggcHJlY2VkZW5jZSB0byAlcyBpbiAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAoZXhpc3RpbmdfZGlzdC5wcm9qZWN0X25hbWUsIGV4aXN0aW5nX2Rpc3QubG9jYXRpb24pCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5jb25mbGljdHNfd2l0aCA9IGV4aXN0aW5nX2Rpc3QKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3doZWVsKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmxpbmsgYW5kIHNlbGYubGluay5pc193aGVlbAoKICAgIGRlZiBtb3ZlX3doZWVsX2ZpbGVzKHNlbGYsIHdoZWVsZGlyLCByb290PU5vbmUsIHByZWZpeD1Ob25lKToKICAgICAgICBtb3ZlX3doZWVsX2ZpbGVzKAogICAgICAgICAgICBzZWxmLm5hbWUsIHNlbGYucmVxLCB3aGVlbGRpciwKICAgICAgICAgICAgdXNlcj1zZWxmLnVzZV91c2VyX3NpdGUsCiAgICAgICAgICAgIGhvbWU9c2VsZi50YXJnZXRfZGlyLAogICAgICAgICAgICByb290PXJvb3QsCiAgICAgICAgICAgIHByZWZpeD1wcmVmaXgsCiAgICAgICAgICAgIHB5Y29tcGlsZT1zZWxmLnB5Y29tcGlsZSwKICAgICAgICAgICAgaXNvbGF0ZWQ9c2VsZi5pc29sYXRlZCwKICAgICAgICApCgogICAgZGVmIGdldF9kaXN0KHNlbGYpOgogICAgICAgICIiIlJldHVybiBhIHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uIGJ1aWx0IGZyb20gc2VsZi5lZ2dfaW5mb19wYXRoIiIiCiAgICAgICAgZWdnX2luZm8gPSBzZWxmLmVnZ19pbmZvX3BhdGgoJycpLnJzdHJpcCgnLycpCiAgICAgICAgYmFzZV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoZWdnX2luZm8pCiAgICAgICAgbWV0YWRhdGEgPSBwa2dfcmVzb3VyY2VzLlBhdGhNZXRhZGF0YShiYXNlX2RpciwgZWdnX2luZm8pCiAgICAgICAgZGlzdF9uYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGVnZ19pbmZvKSlbMF0KICAgICAgICByZXR1cm4gcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24oCiAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShlZ2dfaW5mbyksCiAgICAgICAgICAgIHByb2plY3RfbmFtZT1kaXN0X25hbWUsCiAgICAgICAgICAgIG1ldGFkYXRhPW1ldGFkYXRhKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGhhc19oYXNoX29wdGlvbnMoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHdoZXRoZXIgYW55IGtub3duLWdvb2QgaGFzaGVzIGFyZSBzcGVjaWZpZWQgYXMgb3B0aW9ucy4KCiAgICAgICAgVGhlc2UgYWN0aXZhdGUgLS1yZXF1aXJlLWhhc2hlcyBtb2RlOyBoYXNoZXMgc3BlY2lmaWVkIGFzIHBhcnQgb2YgYQogICAgICAgIFVSTCBkbyBub3QuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBib29sKHNlbGYub3B0aW9ucy5nZXQoJ2hhc2hlcycsIHt9KSkKCiAgICBkZWYgaGFzaGVzKHNlbGYsIHRydXN0X2ludGVybmV0PVRydWUpOgogICAgICAgICIiIlJldHVybiBhIGhhc2gtY29tcGFyZXIgdGhhdCBjb25zaWRlcnMgbXkgb3B0aW9uLSBhbmQgVVJMLWJhc2VkCiAgICAgICAgaGFzaGVzIHRvIGJlIGtub3duLWdvb2QuCgogICAgICAgIEhhc2hlcyBpbiBVUkxzLS1vbmVzIGVtYmVkZGVkIGluIHRoZSByZXF1aXJlbWVudHMgZmlsZSwgbm90IG9uZXMKICAgICAgICBkb3dubG9hZGVkIGZyb20gYW4gaW5kZXggc2VydmVyLS1hcmUgYWxtb3N0IHBlZXJzIHdpdGggb25lcyBmcm9tCiAgICAgICAgZmxhZ3MuIFRoZXkgc2F0aXNmeSAtLXJlcXVpcmUtaGFzaGVzICh3aGV0aGVyIGl0IHdhcyBpbXBsaWNpdGx5IG9yCiAgICAgICAgZXhwbGljaXRseSBhY3RpdmF0ZWQpIGJ1dCBkbyBub3QgYWN0aXZhdGUgaXQuIG1kNSBhbmQgc2hhMjI0IGFyZSBub3QKICAgICAgICBhbGxvd2VkIGluIGZsYWdzLCB3aGljaCBzaG91bGQgbnVkZ2UgcGVvcGxlIHRvd2FyZCBnb29kIGFsZ29zLiBXZQogICAgICAgIGFsd2F5cyBPUiBhbGwgaGFzaGVzIHRvZ2V0aGVyLCBldmVuIG9uZXMgZnJvbSBVUkxzLgoKICAgICAgICA6cGFyYW0gdHJ1c3RfaW50ZXJuZXQ6IFdoZXRoZXIgdG8gdHJ1c3QgVVJMLWJhc2VkICgjbWQ1PS4uLikgaGFzaGVzCiAgICAgICAgICAgIGRvd25sb2FkZWQgZnJvbSB0aGUgaW50ZXJuZXQsIGFzIGJ5IHBvcHVsYXRlX2xpbmsoKQoKICAgICAgICAiIiIKICAgICAgICBnb29kX2hhc2hlcyA9IHNlbGYub3B0aW9ucy5nZXQoJ2hhc2hlcycsIHt9KS5jb3B5KCkKICAgICAgICBsaW5rID0gc2VsZi5saW5rIGlmIHRydXN0X2ludGVybmV0IGVsc2Ugc2VsZi5vcmlnaW5hbF9saW5rCiAgICAgICAgaWYgbGluayBhbmQgbGluay5oYXNoOgogICAgICAgICAgICBnb29kX2hhc2hlcy5zZXRkZWZhdWx0KGxpbmsuaGFzaF9uYW1lLCBbXSkuYXBwZW5kKGxpbmsuaGFzaCkKICAgICAgICByZXR1cm4gSGFzaGVzKGdvb2RfaGFzaGVzKQoKCmRlZiBfc3RyaXBfcG9zdGZpeChyZXEpOgogICAgIiIiCiAgICAgICAgU3RyaXAgcmVxIHBvc3RmaXggKCAtZGV2LCAwLjIsIGV0YyApCiAgICAiIiIKICAgICMgRklYTUU6IHVzZSBwYWNrYWdlX3RvX3JlcXVpcmVtZW50PwogICAgbWF0Y2ggPSByZS5zZWFyY2gocideKC4qPykoPzotZGV2fC1cZC4qKSQnLCByZXEpCiAgICBpZiBtYXRjaDoKICAgICAgICAjIFN0cmlwIG9mZiAtZGV2LCAtMC4yLCBldGMuCiAgICAgICAgcmVxID0gbWF0Y2guZ3JvdXAoMSkKICAgIHJldHVybiByZXEKCgpkZWYgcGFyc2VfZWRpdGFibGUoZWRpdGFibGVfcmVxLCBkZWZhdWx0X3Zjcz1Ob25lKToKICAgICIiIlBhcnNlcyBhbiBlZGl0YWJsZSByZXF1aXJlbWVudCBpbnRvOgogICAgICAgIC0gYSByZXF1aXJlbWVudCBuYW1lCiAgICAgICAgLSBhbiBVUkwKICAgICAgICAtIGV4dHJhcwogICAgICAgIC0gZWRpdGFibGUgb3B0aW9ucwogICAgQWNjZXB0ZWQgcmVxdWlyZW1lbnRzOgogICAgICAgIHN2bitodHRwOi8vYmxhaGJsYWhAcmV2I2VnZz1Gb29iYXJbYmF6XSZzdWJkaXJlY3Rvcnk9dmVyc2lvbl9zdWJkaXIKICAgICAgICAuW3NvbWVfZXh0cmFdCiAgICAiIiIKCiAgICBmcm9tIHBpcC5pbmRleCBpbXBvcnQgTGluawoKICAgIHVybCA9IGVkaXRhYmxlX3JlcQogICAgZXh0cmFzID0gTm9uZQoKICAgICMgSWYgYSBmaWxlIHBhdGggaXMgc3BlY2lmaWVkIHdpdGggZXh0cmFzLCBzdHJpcCBvZmYgdGhlIGV4dHJhcy4KICAgIG0gPSByZS5tYXRjaChyJ14oLispKFxbW15cXV0rXF0pJCcsIHVybCkKICAgIGlmIG06CiAgICAgICAgdXJsX25vX2V4dHJhcyA9IG0uZ3JvdXAoMSkKICAgICAgICBleHRyYXMgPSBtLmdyb3VwKDIpCiAgICBlbHNlOgogICAgICAgIHVybF9ub19leHRyYXMgPSB1cmwKCiAgICBpZiBvcy5wYXRoLmlzZGlyKHVybF9ub19leHRyYXMpOgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4odXJsX25vX2V4dHJhcywgJ3NldHVwLnB5JykpOgogICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICJEaXJlY3RvcnkgJXIgaXMgbm90IGluc3RhbGxhYmxlLiBGaWxlICdzZXR1cC5weScgbm90IGZvdW5kLiIgJQogICAgICAgICAgICAgICAgdXJsX25vX2V4dHJhcwogICAgICAgICAgICApCiAgICAgICAgIyBUcmVhdGluZyBpdCBhcyBjb2RlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIG91dAogICAgICAgIHVybF9ub19leHRyYXMgPSBwYXRoX3RvX3VybCh1cmxfbm9fZXh0cmFzKQoKICAgIGlmIHVybF9ub19leHRyYXMubG93ZXIoKS5zdGFydHN3aXRoKCdmaWxlOicpOgogICAgICAgIHBhY2thZ2VfbmFtZSA9IExpbmsodXJsX25vX2V4dHJhcykuZWdnX2ZyYWdtZW50CiAgICAgICAgaWYgZXh0cmFzOgogICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgICAgcGFja2FnZV9uYW1lLAogICAgICAgICAgICAgICAgdXJsX25vX2V4dHJhcywKICAgICAgICAgICAgICAgIFJlcXVpcmVtZW50KCJwbGFjZWhvbGRlciIgKyBleHRyYXMubG93ZXIoKSkuZXh0cmFzLAogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VfbmFtZSwgdXJsX25vX2V4dHJhcywgTm9uZQoKICAgIGZvciB2ZXJzaW9uX2NvbnRyb2wgaW4gdmNzOgogICAgICAgIGlmIHVybC5sb3dlcigpLnN0YXJ0c3dpdGgoJyVzOicgJSB2ZXJzaW9uX2NvbnRyb2wpOgogICAgICAgICAgICB1cmwgPSAnJXMrJXMnICUgKHZlcnNpb25fY29udHJvbCwgdXJsKQogICAgICAgICAgICBicmVhawoKICAgIGlmICcrJyBub3QgaW4gdXJsOgogICAgICAgIGlmIGRlZmF1bHRfdmNzOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tZGVmYXVsdC12Y3MgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICJ0aGUgZnV0dXJlLiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKICAgICAgICAgICAgdXJsID0gZGVmYXVsdF92Y3MgKyAnKycgKyB1cmwKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICclcyBzaG91bGQgZWl0aGVyIGJlIGEgcGF0aCB0byBhIGxvY2FsIHByb2plY3Qgb3IgYSBWQ1MgdXJsICcKICAgICAgICAgICAgICAgICdiZWdpbm5pbmcgd2l0aCBzdm4rLCBnaXQrLCBoZyssIG9yIGJ6cisnICUKICAgICAgICAgICAgICAgIGVkaXRhYmxlX3JlcQogICAgICAgICAgICApCgogICAgdmNfdHlwZSA9IHVybC5zcGxpdCgnKycsIDEpWzBdLmxvd2VyKCkKCiAgICBpZiBub3QgdmNzLmdldF9iYWNrZW5kKHZjX3R5cGUpOgogICAgICAgIGVycm9yX21lc3NhZ2UgPSAnRm9yIC0tZWRpdGFibGU9JXMgb25seSAnICUgZWRpdGFibGVfcmVxICsgXAogICAgICAgICAgICAnLCAnLmpvaW4oW2JhY2tlbmQubmFtZSArICcrVVJMJyBmb3IgYmFja2VuZCBpbiB2Y3MuYmFja2VuZHNdKSArIFwKICAgICAgICAgICAgJyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkJwogICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKGVycm9yX21lc3NhZ2UpCgogICAgcGFja2FnZV9uYW1lID0gTGluayh1cmwpLmVnZ19mcmFnbWVudAogICAgaWYgbm90IHBhY2thZ2VfbmFtZToKICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgIkNvdWxkIG5vdCBkZXRlY3QgcmVxdWlyZW1lbnQgbmFtZSwgcGxlYXNlIHNwZWNpZnkgb25lIHdpdGggI2VnZz0iCiAgICAgICAgKQogICAgaWYgbm90IHBhY2thZ2VfbmFtZToKICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgJy0tZWRpdGFibGU9JXMgaXMgbm90IHRoZSByaWdodCBmb3JtYXQ7IGl0IG11c3QgaGF2ZSAnCiAgICAgICAgICAgICcjZWdnPVBhY2thZ2UnICUgZWRpdGFibGVfcmVxCiAgICAgICAgKQogICAgcmV0dXJuIF9zdHJpcF9wb3N0Zml4KHBhY2thZ2VfbmFtZSksIHVybCwgTm9uZQpQSwMEFAAAAAAAAAAhABLdknaehgAAnoYAACIAAABweXBpX19waXBfOV8wXzMvcGlwL3JlcS9yZXFfc2V0LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CmZyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHBrZ19yZXNvdXJjZXMKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgcmVxdWVzdHMKCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgZXhwYW5kdXNlcgpmcm9tIHBpcC5kb3dubG9hZCBpbXBvcnQgKGlzX2ZpbGVfdXJsLCBpc19kaXJfdXJsLCBpc192Y3NfdXJsLCB1cmxfdG9fcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tfdXJsKQpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCAoSW5zdGFsbGF0aW9uRXJyb3IsIEJlc3RWZXJzaW9uQWxyZWFkeUluc3RhbGxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3RyaWJ1dGlvbk5vdEZvdW5kLCBQcmV2aW91c0J1aWxkRGlyRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNoRXJyb3IsIEhhc2hFcnJvcnMsIEhhc2hVbnBpbm5lZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeVVybEhhc2hVbnN1cHBvcnRlZCwgVmNzSGFzaFVuc3VwcG9ydGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5zdXBwb3J0ZWRQeXRob25WZXJzaW9uKQpmcm9tIHBpcC5yZXEucmVxX2luc3RhbGwgaW1wb3J0IEluc3RhbGxSZXF1aXJlbWVudApmcm9tIHBpcC51dGlscyBpbXBvcnQgKAogICAgZGlzcGxheV9wYXRoLCBkaXN0X2luX3VzZXJzaXRlLCBlbnN1cmVfZGlyLCBub3JtYWxpemVfcGF0aCkKZnJvbSBwaXAudXRpbHMuaGFzaGVzIGltcG9ydCBNaXNzaW5nSGFzaGVzCmZyb20gcGlwLnV0aWxzLmxvZ2dpbmcgaW1wb3J0IGluZGVudF9sb2cKZnJvbSBwaXAudXRpbHMucGFja2FnaW5nIGltcG9ydCBjaGVja19kaXN0X3JlcXVpcmVzX3B5dGhvbgpmcm9tIHBpcC52Y3MgaW1wb3J0IHZjcwpmcm9tIHBpcC53aGVlbCBpbXBvcnQgV2hlZWwKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIFJlcXVpcmVtZW50cyhvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9rZXlzID0gW10KICAgICAgICBzZWxmLl9kaWN0ID0ge30KCiAgICBkZWYga2V5cyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fa2V5cwoKICAgIGRlZiB2YWx1ZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIFtzZWxmLl9kaWN0W2tleV0gZm9yIGtleSBpbiBzZWxmLl9rZXlzXQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6CiAgICAgICAgcmV0dXJuIGl0ZW0gaW4gc2VsZi5fa2V5cwoKICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICBpZiBrZXkgbm90IGluIHNlbGYuX2tleXM6CiAgICAgICAgICAgIHNlbGYuX2tleXMuYXBwZW5kKGtleSkKICAgICAgICBzZWxmLl9kaWN0W2tleV0gPSB2YWx1ZQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiBzZWxmLl9kaWN0W2tleV0KCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgdmFsdWVzID0gWyclczogJXMnICUgKHJlcHIoayksIHJlcHIoc2VsZltrXSkpIGZvciBrIGluIHNlbGYua2V5cygpXQogICAgICAgIHJldHVybiAnUmVxdWlyZW1lbnRzKHslc30pJyAlICcsICcuam9pbih2YWx1ZXMpCgoKY2xhc3MgRGlzdEFic3RyYWN0aW9uKG9iamVjdCk6CiAgICAiIiJBYnN0cmFjdHMgb3V0IHRoZSB3aGVlbCB2cyBub24td2hlZWwgcHJlcGFyZV9maWxlcyBsb2dpYy4KCiAgICBUaGUgcmVxdWlyZW1lbnRzIGZvciBhbnl0aGluZyBpbnN0YWxsYWJsZSBhcmUgYXMgZm9sbG93czoKICAgICAtIHdlIG11c3QgYmUgYWJsZSB0byBkZXRlcm1pbmUgdGhlIHJlcXVpcmVtZW50IG5hbWUKICAgICAgIChvciB3ZSBjYW4ndCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBub24tdXBncmFkZSBjYXNlKS4KICAgICAtIHdlIG11c3QgYmUgYWJsZSB0byBnZW5lcmF0ZSBhIGxpc3Qgb2YgcnVuLXRpbWUgZGVwZW5kZW5jaWVzCiAgICAgICB3aXRob3V0IGluc3RhbGxpbmcgYW55IGFkZGl0aW9uYWwgcGFja2FnZXMgKG9yIHdlIHdvdWxkCiAgICAgICBoYXZlIHRvIGVpdGhlciBidXJuIHRpbWUgYnkgZG9pbmcgdGVtcG9yYXJ5IGlzb2xhdGVkIGluc3RhbGxzCiAgICAgICBvciBhbHRlcm5hdGl2ZWx5IHZpb2xhdGUgcGlwcyAnZG9uJ3Qgc3RhcnQgaW5zdGFsbGluZyB1bmxlc3MKICAgICAgIGFsbCByZXF1aXJlbWVudHMgYXJlIGF2YWlsYWJsZScgcnVsZSAtIG5laXRoZXIgb2Ygd2hpY2ggYXJlCiAgICAgICBkZXNpcmFibGUpLgogICAgIC0gZm9yIHBhY2thZ2VzIHdpdGggc2V0dXAgcmVxdWlyZW1lbnRzLCB3ZSBtdXN0IGFsc28gYmUgYWJsZQogICAgICAgdG8gZGV0ZXJtaW5lIHRoZWlyIHJlcXVpcmVtZW50cyB3aXRob3V0IGluc3RhbGxpbmcgYWRkaXRpb25hbAogICAgICAgcGFja2FnZXMgKGZvciB0aGUgc2FtZSByZWFzb24gYXMgcnVuLXRpbWUgZGVwZW5kZW5jaWVzKQogICAgIC0gd2UgbXVzdCBiZSBhYmxlIHRvIGNyZWF0ZSBhIERpc3RyaWJ1dGlvbiBvYmplY3QgZXhwb3NpbmcgdGhlCiAgICAgICBhYm92ZSBtZXRhZGF0YS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXFfdG9faW5zdGFsbCk6CiAgICAgICAgc2VsZi5yZXFfdG9faW5zdGFsbCA9IHJlcV90b19pbnN0YWxsCgogICAgZGVmIGRpc3Qoc2VsZiwgZmluZGVyKToKICAgICAgICAiIiJSZXR1cm4gYSBzZXR1cHRvb2xzIERpc3Qgb2JqZWN0LiIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3Ioc2VsZi5kaXN0KQoKICAgIGRlZiBwcmVwX2Zvcl9kaXN0KHNlbGYpOgogICAgICAgICIiIkVuc3VyZSB0aGF0IHdlIGNhbiBnZXQgYSBEaXN0IGZvciB0aGlzIHJlcXVpcmVtZW50LiIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3Ioc2VsZi5kaXN0KQoKCmRlZiBtYWtlX2Fic3RyYWN0X2Rpc3QocmVxX3RvX2luc3RhbGwpOgogICAgIiIiRmFjdG9yeSB0byBtYWtlIGFuIGFic3RyYWN0IGRpc3Qgb2JqZWN0LgoKICAgIFByZWNvbmRpdGlvbnM6IEVpdGhlciBhbiBlZGl0YWJsZSByZXEgd2l0aCBhIHNvdXJjZV9kaXIsIG9yIHNhdGlzZmllZF9ieSBvcgogICAgYSB3aGVlbCBsaW5rLCBvciBhIG5vbi1lZGl0YWJsZSByZXEgd2l0aCBhIHNvdXJjZV9kaXIuCgogICAgOnJldHVybjogQSBjb25jcmV0ZSBEaXN0QWJzdHJhY3Rpb24uCiAgICAiIiIKICAgIGlmIHJlcV90b19pbnN0YWxsLmVkaXRhYmxlOgogICAgICAgIHJldHVybiBJc1NEaXN0KHJlcV90b19pbnN0YWxsKQogICAgZWxpZiByZXFfdG9faW5zdGFsbC5saW5rIGFuZCByZXFfdG9faW5zdGFsbC5saW5rLmlzX3doZWVsOgogICAgICAgIHJldHVybiBJc1doZWVsKHJlcV90b19pbnN0YWxsKQogICAgZWxzZToKICAgICAgICByZXR1cm4gSXNTRGlzdChyZXFfdG9faW5zdGFsbCkKCgpjbGFzcyBJc1doZWVsKERpc3RBYnN0cmFjdGlvbik6CgogICAgZGVmIGRpc3Qoc2VsZiwgZmluZGVyKToKICAgICAgICByZXR1cm4gbGlzdChwa2dfcmVzb3VyY2VzLmZpbmRfZGlzdHJpYnV0aW9ucygKICAgICAgICAgICAgc2VsZi5yZXFfdG9faW5zdGFsbC5zb3VyY2VfZGlyKSlbMF0KCiAgICBkZWYgcHJlcF9mb3JfZGlzdChzZWxmKToKICAgICAgICAjIEZJWE1FOmh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMTExMgogICAgICAgIHBhc3MKCgpjbGFzcyBJc1NEaXN0KERpc3RBYnN0cmFjdGlvbik6CgogICAgZGVmIGRpc3Qoc2VsZiwgZmluZGVyKToKICAgICAgICBkaXN0ID0gc2VsZi5yZXFfdG9faW5zdGFsbC5nZXRfZGlzdCgpCiAgICAgICAgIyBGSVhNRTogc2hvdWxkbid0IGJlIGdsb2JhbGx5IGFkZGVkOgogICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdkZXBlbmRlbmN5X2xpbmtzLnR4dCcpOgogICAgICAgICAgICBmaW5kZXIuYWRkX2RlcGVuZGVuY3lfbGlua3MoCiAgICAgICAgICAgICAgICBkaXN0LmdldF9tZXRhZGF0YV9saW5lcygnZGVwZW5kZW5jeV9saW5rcy50eHQnKQogICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGRpc3QKCiAgICBkZWYgcHJlcF9mb3JfZGlzdChzZWxmKToKICAgICAgICBzZWxmLnJlcV90b19pbnN0YWxsLnJ1bl9lZ2dfaW5mbygpCiAgICAgICAgc2VsZi5yZXFfdG9faW5zdGFsbC5hc3NlcnRfc291cmNlX21hdGNoZXNfdmVyc2lvbigpCgoKY2xhc3MgSW5zdGFsbGVkKERpc3RBYnN0cmFjdGlvbik6CgogICAgZGVmIGRpc3Qoc2VsZiwgZmluZGVyKToKICAgICAgICByZXR1cm4gc2VsZi5yZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnkKCiAgICBkZWYgcHJlcF9mb3JfZGlzdChzZWxmKToKICAgICAgICBwYXNzCgoKY2xhc3MgUmVxdWlyZW1lbnRTZXQob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYnVpbGRfZGlyLCBzcmNfZGlyLCBkb3dubG9hZF9kaXIsIHVwZ3JhZGU9RmFsc2UsCiAgICAgICAgICAgICAgICAgdXBncmFkZV9zdHJhdGVneT1Ob25lLCBpZ25vcmVfaW5zdGFsbGVkPUZhbHNlLCBhc19lZ2c9RmFsc2UsCiAgICAgICAgICAgICAgICAgdGFyZ2V0X2Rpcj1Ob25lLCBpZ25vcmVfZGVwZW5kZW5jaWVzPUZhbHNlLAogICAgICAgICAgICAgICAgIGZvcmNlX3JlaW5zdGFsbD1GYWxzZSwgdXNlX3VzZXJfc2l0ZT1GYWxzZSwgc2Vzc2lvbj1Ob25lLAogICAgICAgICAgICAgICAgIHB5Y29tcGlsZT1UcnVlLCBpc29sYXRlZD1GYWxzZSwgd2hlZWxfZG93bmxvYWRfZGlyPU5vbmUsCiAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9Tm9uZSwgcmVxdWlyZV9oYXNoZXM9RmFsc2UsCiAgICAgICAgICAgICAgICAgaWdub3JlX3JlcXVpcmVzX3B5dGhvbj1GYWxzZSk6CiAgICAgICAgIiIiQ3JlYXRlIGEgUmVxdWlyZW1lbnRTZXQuCgogICAgICAgIDpwYXJhbSB3aGVlbF9kb3dubG9hZF9kaXI6IFdoZXJlIHN0aWxsLXBhY2tlZCAud2hsIGZpbGVzIHNob3VsZCBiZQogICAgICAgICAgICB3cml0dGVuIHRvLiBJZiBOb25lIHRoZXkgYXJlIHdyaXR0ZW4gdG8gdGhlIGRvd25sb2FkX2RpciBwYXJhbWV0ZXIuCiAgICAgICAgICAgIFNlcGFyYXRlIHRvIGRvd25sb2FkX2RpciB0byBwZXJtaXQgb25seSBrZWVwaW5nIHdoZWVsIGFyY2hpdmVzIGZvcgogICAgICAgICAgICBwaXAgd2hlZWwuCiAgICAgICAgOnBhcmFtIGRvd25sb2FkX2RpcjogV2hlcmUgc3RpbGwgcGFja2VkIGFyY2hpdmVzIHNob3VsZCBiZSB3cml0dGVuIHRvLgogICAgICAgICAgICBJZiBOb25lIHRoZXkgYXJlIG5vdCBzYXZlZCwgYW5kIGFyZSBkZWxldGVkIGltbWVkaWF0ZWx5IGFmdGVyCiAgICAgICAgICAgIHVucGFja2luZy4KICAgICAgICA6cGFyYW0gd2hlZWxfY2FjaGU6IFRoZSBwaXAgd2hlZWwgY2FjaGUsIGZvciBwYXNzaW5nIHRvCiAgICAgICAgICAgIEluc3RhbGxSZXF1aXJlbWVudC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZXNzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgICAgICJSZXF1aXJlbWVudFNldCgpIG1pc3NpbmcgMSByZXF1aXJlZCBrZXl3b3JkIGFyZ3VtZW50OiAiCiAgICAgICAgICAgICAgICAiJ3Nlc3Npb24nIgogICAgICAgICAgICApCgogICAgICAgIHNlbGYuYnVpbGRfZGlyID0gYnVpbGRfZGlyCiAgICAgICAgc2VsZi5zcmNfZGlyID0gc3JjX2RpcgogICAgICAgICMgWFhYOiBkb3dubG9hZF9kaXIgYW5kIHdoZWVsX2Rvd25sb2FkX2RpciBvdmVybGFwIHNlbWFudGljYWxseSBhbmQgbWF5CiAgICAgICAgIyBiZSBjb21iaW5lZCBpZiB3ZSdyZSB3aWxsaW5nIHRvIGhhdmUgbm9uLXdoZWVsIGFyY2hpdmVzIHByZXNlbnQgaW4KICAgICAgICAjIHRoZSB3aGVlbGhvdXNlIG91dHB1dCBieSAncGlwIHdoZWVsJy4KICAgICAgICBzZWxmLmRvd25sb2FkX2RpciA9IGRvd25sb2FkX2RpcgogICAgICAgIHNlbGYudXBncmFkZSA9IHVwZ3JhZGUKICAgICAgICBzZWxmLnVwZ3JhZGVfc3RyYXRlZ3kgPSB1cGdyYWRlX3N0cmF0ZWd5CiAgICAgICAgc2VsZi5pZ25vcmVfaW5zdGFsbGVkID0gaWdub3JlX2luc3RhbGxlZAogICAgICAgIHNlbGYuZm9yY2VfcmVpbnN0YWxsID0gZm9yY2VfcmVpbnN0YWxsCiAgICAgICAgc2VsZi5yZXF1aXJlbWVudHMgPSBSZXF1aXJlbWVudHMoKQogICAgICAgICMgTWFwcGluZyBvZiBhbGlhczogcmVhbF9uYW1lCiAgICAgICAgc2VsZi5yZXF1aXJlbWVudF9hbGlhc2VzID0ge30KICAgICAgICBzZWxmLnVubmFtZWRfcmVxdWlyZW1lbnRzID0gW10KICAgICAgICBzZWxmLmlnbm9yZV9kZXBlbmRlbmNpZXMgPSBpZ25vcmVfZGVwZW5kZW5jaWVzCiAgICAgICAgc2VsZi5pZ25vcmVfcmVxdWlyZXNfcHl0aG9uID0gaWdub3JlX3JlcXVpcmVzX3B5dGhvbgogICAgICAgIHNlbGYuc3VjY2Vzc2Z1bGx5X2Rvd25sb2FkZWQgPSBbXQogICAgICAgIHNlbGYuc3VjY2Vzc2Z1bGx5X2luc3RhbGxlZCA9IFtdCiAgICAgICAgc2VsZi5yZXFzX3RvX2NsZWFudXAgPSBbXQogICAgICAgIHNlbGYuYXNfZWdnID0gYXNfZWdnCiAgICAgICAgc2VsZi51c2VfdXNlcl9zaXRlID0gdXNlX3VzZXJfc2l0ZQogICAgICAgIHNlbGYudGFyZ2V0X2RpciA9IHRhcmdldF9kaXIgICMgc2V0IGZyb20gLS10YXJnZXQgb3B0aW9uCiAgICAgICAgc2VsZi5zZXNzaW9uID0gc2Vzc2lvbgogICAgICAgIHNlbGYucHljb21waWxlID0gcHljb21waWxlCiAgICAgICAgc2VsZi5pc29sYXRlZCA9IGlzb2xhdGVkCiAgICAgICAgaWYgd2hlZWxfZG93bmxvYWRfZGlyOgogICAgICAgICAgICB3aGVlbF9kb3dubG9hZF9kaXIgPSBub3JtYWxpemVfcGF0aCh3aGVlbF9kb3dubG9hZF9kaXIpCiAgICAgICAgc2VsZi53aGVlbF9kb3dubG9hZF9kaXIgPSB3aGVlbF9kb3dubG9hZF9kaXIKICAgICAgICBzZWxmLl93aGVlbF9jYWNoZSA9IHdoZWVsX2NhY2hlCiAgICAgICAgc2VsZi5yZXF1aXJlX2hhc2hlcyA9IHJlcXVpcmVfaGFzaGVzCiAgICAgICAgIyBNYXBzIGZyb20gaW5zdGFsbF9yZXEgLT4gZGVwZW5kZW5jaWVzX29mX2luc3RhbGxfcmVxCiAgICAgICAgc2VsZi5fZGVwZW5kZW5jaWVzID0gZGVmYXVsdGRpY3QobGlzdCkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXFzID0gW3JlcSBmb3IgcmVxIGluIHNlbGYucmVxdWlyZW1lbnRzLnZhbHVlcygpCiAgICAgICAgICAgICAgICBpZiBub3QgcmVxLmNvbWVzX2Zyb21dCiAgICAgICAgcmVxcy5zb3J0KGtleT1sYW1iZGEgcmVxOiByZXEubmFtZS5sb3dlcigpKQogICAgICAgIHJldHVybiAnICcuam9pbihbc3RyKHJlcS5yZXEpIGZvciByZXEgaW4gcmVxc10pCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJlcXMgPSBbcmVxIGZvciByZXEgaW4gc2VsZi5yZXF1aXJlbWVudHMudmFsdWVzKCldCiAgICAgICAgcmVxcy5zb3J0KGtleT1sYW1iZGEgcmVxOiByZXEubmFtZS5sb3dlcigpKQogICAgICAgIHJlcXNfc3RyID0gJywgJy5qb2luKFtzdHIocmVxLnJlcSkgZm9yIHJlcSBpbiByZXFzXSkKICAgICAgICByZXR1cm4gKCc8JXMgb2JqZWN0OyAlZCByZXF1aXJlbWVudChzKTogJXM+JwogICAgICAgICAgICAgICAgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIGxlbihyZXFzKSwgcmVxc19zdHIpKQoKICAgIGRlZiBhZGRfcmVxdWlyZW1lbnQoc2VsZiwgaW5zdGFsbF9yZXEsIHBhcmVudF9yZXFfbmFtZT1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICBleHRyYXNfcmVxdWVzdGVkPU5vbmUpOgogICAgICAgICIiIkFkZCBpbnN0YWxsX3JlcSBhcyBhIHJlcXVpcmVtZW50IHRvIGluc3RhbGwuCgogICAgICAgIDpwYXJhbSBwYXJlbnRfcmVxX25hbWU6IFRoZSBuYW1lIG9mIHRoZSByZXF1aXJlbWVudCB0aGF0IG5lZWRlZCB0aGlzCiAgICAgICAgICAgIGFkZGVkLiBUaGUgbmFtZSBpcyB1c2VkIGJlY2F1c2Ugd2hlbiBtdWx0aXBsZSB1bm5hbWVkIHJlcXVpcmVtZW50cwogICAgICAgICAgICByZXNvbHZlIHRvIHRoZSBzYW1lIG5hbWUsIHdlIGNvdWxkIG90aGVyd2lzZSBlbmQgdXAgd2l0aCBkZXBlbmRlbmN5CiAgICAgICAgICAgIGxpbmtzIHRoYXQgcG9pbnQgb3V0c2lkZSB0aGUgUmVxdWlyZW1lbnRzIHNldC4gcGFyZW50X3JlcSBtdXN0CiAgICAgICAgICAgIGFscmVhZHkgYmUgYWRkZWQuIE5vdGUgdGhhdCBOb25lIGltcGxpZXMgdGhhdCB0aGlzIGlzIGEgdXNlcgogICAgICAgICAgICBzdXBwbGllZCByZXF1aXJlbWVudCwgdnMgYW4gaW5mZXJyZWQgb25lLgogICAgICAgIDpwYXJhbSBleHRyYXNfcmVxdWVzdGVkOiBhbiBpdGVyYWJsZSBvZiBleHRyYXMgdXNlZCB0byBldmFsdWF0ZSB0aGUKICAgICAgICAgICAgZW52aXJvbmVtZW50IG1hcmtlcnMuCiAgICAgICAgOnJldHVybjogQWRkaXRpb25hbCByZXF1aXJlbWVudHMgdG8gc2Nhbi4gVGhhdCBpcyBlaXRoZXIgW10gaWYKICAgICAgICAgICAgdGhlIHJlcXVpcmVtZW50IGlzIG5vdCBhcHBsaWNhYmxlLCBvciBbaW5zdGFsbF9yZXFdIGlmIHRoZQogICAgICAgICAgICByZXF1aXJlbWVudCBpcyBhcHBsaWNhYmxlIGFuZCBoYXMganVzdCBiZWVuIGFkZGVkLgogICAgICAgICIiIgogICAgICAgIG5hbWUgPSBpbnN0YWxsX3JlcS5uYW1lCiAgICAgICAgaWYgbm90IGluc3RhbGxfcmVxLm1hdGNoX21hcmtlcnMoZXh0cmFzX3JlcXVlc3RlZCk6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCJJZ25vcmluZyAlczogbWFya2VycyAnJXMnIGRvbid0IG1hdGNoIHlvdXIgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAiZW52aXJvbm1lbnQiLCBpbnN0YWxsX3JlcS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsX3JlcS5tYXJrZXJzKQogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgIyBUaGlzIGNoZWNrIGhhcyB0byBjb21lIGFmdGVyIHdlIGZpbHRlciByZXF1aXJlbWVudHMgd2l0aCB0aGUKICAgICAgICAjIGVudmlyb25tZW50IG1hcmtlcnMuCiAgICAgICAgaWYgaW5zdGFsbF9yZXEubGluayBhbmQgaW5zdGFsbF9yZXEubGluay5pc193aGVlbDoKICAgICAgICAgICAgd2hlZWwgPSBXaGVlbChpbnN0YWxsX3JlcS5saW5rLmZpbGVuYW1lKQogICAgICAgICAgICBpZiBub3Qgd2hlZWwuc3VwcG9ydGVkKCk6CiAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGEgc3VwcG9ydGVkIHdoZWVsIG9uIHRoaXMgcGxhdGZvcm0uIiAlCiAgICAgICAgICAgICAgICAgICAgd2hlZWwuZmlsZW5hbWUKICAgICAgICAgICAgICAgICkKCiAgICAgICAgaW5zdGFsbF9yZXEuYXNfZWdnID0gc2VsZi5hc19lZ2cKICAgICAgICBpbnN0YWxsX3JlcS51c2VfdXNlcl9zaXRlID0gc2VsZi51c2VfdXNlcl9zaXRlCiAgICAgICAgaW5zdGFsbF9yZXEudGFyZ2V0X2RpciA9IHNlbGYudGFyZ2V0X2RpcgogICAgICAgIGluc3RhbGxfcmVxLnB5Y29tcGlsZSA9IHNlbGYucHljb21waWxlCiAgICAgICAgaW5zdGFsbF9yZXEuaXNfZGlyZWN0ID0gKHBhcmVudF9yZXFfbmFtZSBpcyBOb25lKQoKICAgICAgICBpZiBub3QgbmFtZToKICAgICAgICAgICAgIyB1cmwgb3IgcGF0aCByZXF1aXJlbWVudCB3L28gYW4gZWdnIGZyYWdtZW50CiAgICAgICAgICAgIHNlbGYudW5uYW1lZF9yZXF1aXJlbWVudHMuYXBwZW5kKGluc3RhbGxfcmVxKQogICAgICAgICAgICByZXR1cm4gW2luc3RhbGxfcmVxXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGV4aXN0aW5nX3JlcSA9IHNlbGYuZ2V0X3JlcXVpcmVtZW50KG5hbWUpCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIGV4aXN0aW5nX3JlcSA9IE5vbmUKICAgICAgICAgICAgaWYgKHBhcmVudF9yZXFfbmFtZSBpcyBOb25lIGFuZCBleGlzdGluZ19yZXEgYW5kIG5vdAogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nX3JlcS5jb25zdHJhaW50IGFuZAogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nX3JlcS5leHRyYXMgPT0gaW5zdGFsbF9yZXEuZXh0cmFzIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ19yZXEucmVxLnNwZWNpZmllciA9PSBpbnN0YWxsX3JlcS5yZXEuc3BlY2lmaWVyKToKICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICdEb3VibGUgcmVxdWlyZW1lbnQgZ2l2ZW46ICVzIChhbHJlYWR5IGluICVzLCBuYW1lPSVyKScKICAgICAgICAgICAgICAgICAgICAlIChpbnN0YWxsX3JlcSwgZXhpc3RpbmdfcmVxLCBuYW1lKSkKICAgICAgICAgICAgaWYgbm90IGV4aXN0aW5nX3JlcToKICAgICAgICAgICAgICAgICMgQWRkIHJlcXVpcmVtZW50CiAgICAgICAgICAgICAgICBzZWxmLnJlcXVpcmVtZW50c1tuYW1lXSA9IGluc3RhbGxfcmVxCiAgICAgICAgICAgICAgICAjIEZJWE1FOiB3aGF0IGFib3V0IG90aGVyIG5vcm1hbGl6YXRpb25zPyAgRS5nLiwgXyB2cy4gLT8KICAgICAgICAgICAgICAgIGlmIG5hbWUubG93ZXIoKSAhPSBuYW1lOgogICAgICAgICAgICAgICAgICAgIHNlbGYucmVxdWlyZW1lbnRfYWxpYXNlc1tuYW1lLmxvd2VyKCldID0gbmFtZQogICAgICAgICAgICAgICAgcmVzdWx0ID0gW2luc3RhbGxfcmVxXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBBc3N1bWUgdGhlcmUncyBubyBuZWVkIHRvIHNjYW4sIGFuZCB0aGF0IHdlJ3ZlIGFscmVhZHkKICAgICAgICAgICAgICAgICMgZW5jb3VudGVyZWQgdGhpcyBmb3Igc2Nhbm5pbmcuCiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXQogICAgICAgICAgICAgICAgaWYgbm90IGluc3RhbGxfcmVxLmNvbnN0cmFpbnQgYW5kIGV4aXN0aW5nX3JlcS5jb25zdHJhaW50OgogICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YWxsX3JlcS5saW5rIGFuZCBub3QgKGV4aXN0aW5nX3JlcS5saW5rIGFuZAogICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxfcmVxLmxpbmsucGF0aCA9PSBleGlzdGluZ19yZXEubGluay5wYXRoKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVxc190b19jbGVhbnVwLmFwcGVuZChpbnN0YWxsX3JlcSkKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNhdGlzZnkgY29uc3RyYWludHMgZm9yICclcyc6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0YWxsYXRpb24gZnJvbSBwYXRoIG9yIHVybCBjYW5ub3QgYmUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN0cmFpbmVkIHRvIGEgdmVyc2lvbiIgJSBuYW1lKQogICAgICAgICAgICAgICAgICAgICMgSWYgd2UncmUgbm93IGluc3RhbGxpbmcgYSBjb25zdHJhaW50LCBtYXJrIHRoZSBleGlzdGluZwogICAgICAgICAgICAgICAgICAgICMgb2JqZWN0IGZvciByZWFsIGluc3RhbGxhdGlvbi4KICAgICAgICAgICAgICAgICAgICBleGlzdGluZ19yZXEuY29uc3RyYWludCA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdfcmVxLmV4dHJhcyA9IHR1cGxlKAogICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWQoc2V0KGV4aXN0aW5nX3JlcS5leHRyYXMpLnVuaW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0KGluc3RhbGxfcmVxLmV4dHJhcykpKSkKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIlNldHRpbmcgJXMgZXh0cmFzIHRvOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nX3JlcSwgZXhpc3RpbmdfcmVxLmV4dHJhcykKICAgICAgICAgICAgICAgICAgICAjIEFuZCBub3cgd2UgbmVlZCB0byBzY2FuIHRoaXMuCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW2V4aXN0aW5nX3JlcV0KICAgICAgICAgICAgICAgICMgQ2Fub25pY2FsaXNlIHRvIHRoZSBhbHJlYWR5LWFkZGVkIG9iamVjdCBmb3IgdGhlIGJhY2tyZWYKICAgICAgICAgICAgICAgICMgY2hlY2sgYmVsb3cuCiAgICAgICAgICAgICAgICBpbnN0YWxsX3JlcSA9IGV4aXN0aW5nX3JlcQogICAgICAgICAgICBpZiBwYXJlbnRfcmVxX25hbWU6CiAgICAgICAgICAgICAgICBwYXJlbnRfcmVxID0gc2VsZi5nZXRfcmVxdWlyZW1lbnQocGFyZW50X3JlcV9uYW1lKQogICAgICAgICAgICAgICAgc2VsZi5fZGVwZW5kZW5jaWVzW3BhcmVudF9yZXFdLmFwcGVuZChpbnN0YWxsX3JlcSkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBoYXNfcmVxdWlyZW1lbnQoc2VsZiwgcHJvamVjdF9uYW1lKToKICAgICAgICBuYW1lID0gcHJvamVjdF9uYW1lLmxvd2VyKCkKICAgICAgICBpZiAobmFtZSBpbiBzZWxmLnJlcXVpcmVtZW50cyBhbmQKICAgICAgICAgICBub3Qgc2VsZi5yZXF1aXJlbWVudHNbbmFtZV0uY29uc3RyYWludCBvcgogICAgICAgICAgIG5hbWUgaW4gc2VsZi5yZXF1aXJlbWVudF9hbGlhc2VzIGFuZAogICAgICAgICAgIG5vdCBzZWxmLnJlcXVpcmVtZW50c1tzZWxmLnJlcXVpcmVtZW50X2FsaWFzZXNbbmFtZV1dLmNvbnN0cmFpbnQpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGhhc19yZXF1aXJlbWVudHMoc2VsZik6CiAgICAgICAgcmV0dXJuIGxpc3QocmVxIGZvciByZXEgaW4gc2VsZi5yZXF1aXJlbWVudHMudmFsdWVzKCkgaWYgbm90CiAgICAgICAgICAgICAgICAgICAgcmVxLmNvbnN0cmFpbnQpIG9yIHNlbGYudW5uYW1lZF9yZXF1aXJlbWVudHMKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19kb3dubG9hZChzZWxmKToKICAgICAgICBpZiBzZWxmLmRvd25sb2FkX2RpcjoKICAgICAgICAgICAgc2VsZi5kb3dubG9hZF9kaXIgPSBleHBhbmR1c2VyKHNlbGYuZG93bmxvYWRfZGlyKQogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmRvd25sb2FkX2Rpcik6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKCdDb3VsZCBub3QgZmluZCBkb3dubG9hZCBkaXJlY3RvcnknKQogICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBmaW5kIG9yIGFjY2VzcyBkb3dubG9hZCBkaXJlY3RvcnkgJyVzJyIKICAgICAgICAgICAgICAgICAgICAlIGRpc3BsYXlfcGF0aChzZWxmLmRvd25sb2FkX2RpcikpCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIGdldF9yZXF1aXJlbWVudChzZWxmLCBwcm9qZWN0X25hbWUpOgogICAgICAgIGZvciBuYW1lIGluIHByb2plY3RfbmFtZSwgcHJvamVjdF9uYW1lLmxvd2VyKCk6CiAgICAgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5yZXF1aXJlbWVudHM6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXF1aXJlbWVudHNbbmFtZV0KICAgICAgICAgICAgaWYgbmFtZSBpbiBzZWxmLnJlcXVpcmVtZW50X2FsaWFzZXM6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXF1aXJlbWVudHNbc2VsZi5yZXF1aXJlbWVudF9hbGlhc2VzW25hbWVdXQogICAgICAgIHJhaXNlIEtleUVycm9yKCJObyBwcm9qZWN0IHdpdGggdGhlIG5hbWUgJXIiICUgcHJvamVjdF9uYW1lKQoKICAgIGRlZiB1bmluc3RhbGwoc2VsZiwgYXV0b19jb25maXJtPUZhbHNlKToKICAgICAgICBmb3IgcmVxIGluIHNlbGYucmVxdWlyZW1lbnRzLnZhbHVlcygpOgogICAgICAgICAgICBpZiByZXEuY29uc3RyYWludDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHJlcS51bmluc3RhbGwoYXV0b19jb25maXJtPWF1dG9fY29uZmlybSkKICAgICAgICAgICAgcmVxLmNvbW1pdF91bmluc3RhbGwoKQoKICAgIGRlZiBwcmVwYXJlX2ZpbGVzKHNlbGYsIGZpbmRlcik6CiAgICAgICAgIiIiCiAgICAgICAgUHJlcGFyZSBwcm9jZXNzLiBDcmVhdGUgdGVtcCBkaXJlY3RvcmllcywgZG93bmxvYWQgYW5kL29yIHVucGFjayBmaWxlcy4KICAgICAgICAiIiIKICAgICAgICAjIG1ha2UgdGhlIHdoZWVsaG91c2UKICAgICAgICBpZiBzZWxmLndoZWVsX2Rvd25sb2FkX2RpcjoKICAgICAgICAgICAgZW5zdXJlX2RpcihzZWxmLndoZWVsX2Rvd25sb2FkX2RpcikKCiAgICAgICAgIyBJZiBhbnkgdG9wLWxldmVsIHJlcXVpcmVtZW50IGhhcyBhIGhhc2ggc3BlY2lmaWVkLCBlbnRlcgogICAgICAgICMgaGFzaC1jaGVja2luZyBtb2RlLCB3aGljaCByZXF1aXJlcyBoYXNoZXMgZnJvbSBhbGwuCiAgICAgICAgcm9vdF9yZXFzID0gc2VsZi51bm5hbWVkX3JlcXVpcmVtZW50cyArIHNlbGYucmVxdWlyZW1lbnRzLnZhbHVlcygpCiAgICAgICAgcmVxdWlyZV9oYXNoZXMgPSAoc2VsZi5yZXF1aXJlX2hhc2hlcyBvcgogICAgICAgICAgICAgICAgICAgICAgICAgIGFueShyZXEuaGFzX2hhc2hfb3B0aW9ucyBmb3IgcmVxIGluIHJvb3RfcmVxcykpCiAgICAgICAgaWYgcmVxdWlyZV9oYXNoZXMgYW5kIHNlbGYuYXNfZWdnOgogICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICctLWVnZyBpcyBub3QgYWxsb3dlZCB3aXRoIC0tcmVxdWlyZS1oYXNoZXMgbW9kZSwgc2luY2UgaXQgJwogICAgICAgICAgICAgICAgJ2RlbGVnYXRlcyBkZXBlbmRlbmN5IHJlc29sdXRpb24gdG8gc2V0dXB0b29scyBhbmQgY291bGQgdGh1cyAnCiAgICAgICAgICAgICAgICAncmVzdWx0IGluIGluc3RhbGxhdGlvbiBvZiB1bmhhc2hlZCBwYWNrYWdlcy4nKQoKICAgICAgICAjIEFjdHVhbGx5IHByZXBhcmUgdGhlIGZpbGVzLCBhbmQgY29sbGVjdCBhbnkgZXhjZXB0aW9ucy4gTW9zdCBoYXNoCiAgICAgICAgIyBleGNlcHRpb25zIGNhbm5vdCBiZSBjaGVja2VkIGFoZWFkIG9mIHRpbWUsIGJlY2F1c2UKICAgICAgICAjIHJlcS5wb3B1bGF0ZV9saW5rKCkgbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSB3ZSBjYW4gbWFrZSBkZWNpc2lvbnMKICAgICAgICAjIGJhc2VkIG9uIGxpbmsgdHlwZS4KICAgICAgICBkaXNjb3ZlcmVkX3JlcXMgPSBbXQogICAgICAgIGhhc2hfZXJyb3JzID0gSGFzaEVycm9ycygpCiAgICAgICAgZm9yIHJlcSBpbiBjaGFpbihyb290X3JlcXMsIGRpc2NvdmVyZWRfcmVxcyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGRpc2NvdmVyZWRfcmVxcy5leHRlbmQoc2VsZi5fcHJlcGFyZV9maWxlKAogICAgICAgICAgICAgICAgICAgIGZpbmRlciwKICAgICAgICAgICAgICAgICAgICByZXEsCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9oYXNoZXM9cmVxdWlyZV9oYXNoZXMsCiAgICAgICAgICAgICAgICAgICAgaWdub3JlX2RlcGVuZGVuY2llcz1zZWxmLmlnbm9yZV9kZXBlbmRlbmNpZXMpKQogICAgICAgICAgICBleGNlcHQgSGFzaEVycm9yIGFzIGV4YzoKICAgICAgICAgICAgICAgIGV4Yy5yZXEgPSByZXEKICAgICAgICAgICAgICAgIGhhc2hfZXJyb3JzLmFwcGVuZChleGMpCgogICAgICAgIGlmIGhhc2hfZXJyb3JzOgogICAgICAgICAgICByYWlzZSBoYXNoX2Vycm9ycwoKICAgIGRlZiBfaXNfdXBncmFkZV9hbGxvd2VkKHNlbGYsIHJlcSk6CiAgICAgICAgcmV0dXJuIHNlbGYudXBncmFkZSBhbmQgKAogICAgICAgICAgICBzZWxmLnVwZ3JhZGVfc3RyYXRlZ3kgPT0gImVhZ2VyIiBvciAoCiAgICAgICAgICAgICAgICBzZWxmLnVwZ3JhZGVfc3RyYXRlZ3kgPT0gIm9ubHktaWYtbmVlZGVkIiBhbmQgcmVxLmlzX2RpcmVjdAogICAgICAgICAgICApCiAgICAgICAgKQoKICAgIGRlZiBfY2hlY2tfc2tpcF9pbnN0YWxsZWQoc2VsZiwgcmVxX3RvX2luc3RhbGwsIGZpbmRlcik6CiAgICAgICAgIiIiQ2hlY2sgaWYgcmVxX3RvX2luc3RhbGwgc2hvdWxkIGJlIHNraXBwZWQuCgogICAgICAgIFRoaXMgd2lsbCBjaGVjayBpZiB0aGUgcmVxIGlzIGluc3RhbGxlZCwgYW5kIHdoZXRoZXIgd2Ugc2hvdWxkIHVwZ3JhZGUKICAgICAgICBvciByZWluc3RhbGwgaXQsIHRha2luZyBpbnRvIGFjY291bnQgYWxsIHRoZSByZWxldmFudCB1c2VyIG9wdGlvbnMuCgogICAgICAgIEFmdGVyIGNhbGxpbmcgdGhpcyByZXFfdG9faW5zdGFsbCB3aWxsIG9ubHkgaGF2ZSBzYXRpc2ZpZWRfYnkgc2V0IHRvCiAgICAgICAgTm9uZSBpZiB0aGUgcmVxX3RvX2luc3RhbGwgaXMgdG8gYmUgdXBncmFkZWQvcmVpbnN0YWxsZWQgZXRjLiBBbnkKICAgICAgICBvdGhlciB2YWx1ZSB3aWxsIGJlIGEgZGlzdCByZWNvcmRpbmcgdGhlIGN1cnJlbnQgdGhpbmcgaW5zdGFsbGVkIHRoYXQKICAgICAgICBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50LgoKICAgICAgICBOb3RlIHRoYXQgZm9yIHZjcyB1cmxzIGFuZCB0aGUgbGlrZSB3ZSBjYW4ndCBhc3Nlc3Mgc2tpcHBpbmcgaW4gdGhpcwogICAgICAgIHJvdXRpbmUgLSB3ZSBzaW1wbHkgaWRlbnRpZnkgdGhhdCB3ZSBuZWVkIHRvIHB1bGwgdGhlIHRoaW5nIGRvd24sCiAgICAgICAgdGhlbiBsYXRlciBvbiBpdCBpcyBwdWxsZWQgZG93biBhbmQgaW50cm9zcGVjdGVkIHRvIGFzc2VzcyB1cGdyYWRlLwogICAgICAgIHJlaW5zdGFsbHMgZXRjLgoKICAgICAgICA6cmV0dXJuOiBBIHRleHQgcmVhc29uIGZvciB3aHkgaXQgd2FzIHNraXBwZWQsIG9yIE5vbmUuCiAgICAgICAgIiIiCiAgICAgICAgIyBDaGVjayB3aGV0aGVyIHRvIHVwZ3JhZGUvcmVpbnN0YWxsIHRoaXMgcmVxIG9yIG5vdC4KICAgICAgICByZXFfdG9faW5zdGFsbC5jaGVja19pZl9leGlzdHMoKQogICAgICAgIGlmIHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieToKICAgICAgICAgICAgdXBncmFkZV9hbGxvd2VkID0gc2VsZi5faXNfdXBncmFkZV9hbGxvd2VkKHJlcV90b19pbnN0YWxsKQoKICAgICAgICAgICAgIyBJcyB0aGUgYmVzdCB2ZXJzaW9uIGlzIGluc3RhbGxlZC4KICAgICAgICAgICAgYmVzdF9pbnN0YWxsZWQgPSBGYWxzZQoKICAgICAgICAgICAgaWYgdXBncmFkZV9hbGxvd2VkOgogICAgICAgICAgICAgICAgIyBGb3IgbGluayBiYXNlZCByZXF1aXJlbWVudHMgd2UgaGF2ZSB0byBwdWxsIHRoZQogICAgICAgICAgICAgICAgIyB0cmVlIGRvd24gYW5kIGluc3BlY3QgdG8gYXNzZXNzIHRoZSB2ZXJzaW9uICMsIHNvCiAgICAgICAgICAgICAgICAjIGl0cyBoYW5kbGVkIHdheSBkb3duLgogICAgICAgICAgICAgICAgaWYgbm90IChzZWxmLmZvcmNlX3JlaW5zdGFsbCBvciByZXFfdG9faW5zdGFsbC5saW5rKToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRlci5maW5kX3JlcXVpcmVtZW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwsIHVwZ3JhZGVfYWxsb3dlZCkKICAgICAgICAgICAgICAgICAgICBleGNlcHQgQmVzdFZlcnNpb25BbHJlYWR5SW5zdGFsbGVkOgogICAgICAgICAgICAgICAgICAgICAgICBiZXN0X2luc3RhbGxlZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICBleGNlcHQgRGlzdHJpYnV0aW9uTm90Rm91bmQ6CiAgICAgICAgICAgICAgICAgICAgICAgICMgTm8gZGlzdHJpYnV0aW9uIGZvdW5kLCBzbyB3ZSBzcXVhc2ggdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICMgZXJyb3IgLSBpdCB3aWxsIGJlIHJhaXNlZCBsYXRlciB3aGVuIHdlCiAgICAgICAgICAgICAgICAgICAgICAgICMgcmUtdHJ5IGxhdGVyIHRvIGRvIHRoZSBpbnN0YWxsLgogICAgICAgICAgICAgICAgICAgICAgICAjIFdoeSBkb24ndCB3ZSBqdXN0IHJhaXNlIGhlcmU/CiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgICAgICAgICBpZiBub3QgYmVzdF9pbnN0YWxsZWQ6CiAgICAgICAgICAgICAgICAgICAgIyBkb24ndCB1bmluc3RhbGwgY29uZmxpY3QgaWYgdXNlciBpbnN0YWxsIGFuZAogICAgICAgICAgICAgICAgICAgICMgY29uZmxpY3QgaXMgbm90IHVzZXIgaW5zdGFsbAogICAgICAgICAgICAgICAgICAgIGlmIG5vdCAoc2VsZi51c2VfdXNlcl9zaXRlIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RfaW5fdXNlcnNpdGUocmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5KSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLmNvbmZsaWN0c193aXRoID0gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5CiAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5ID0gTm9uZQoKICAgICAgICAgICAgIyBGaWd1cmUgb3V0IGEgbmljZSBtZXNzYWdlIHRvIHNheSB3aHkgd2UncmUgc2tpcHBpbmcgdGhpcy4KICAgICAgICAgICAgaWYgYmVzdF9pbnN0YWxsZWQ6CiAgICAgICAgICAgICAgICBza2lwX3JlYXNvbiA9ICdhbHJlYWR5IHVwLXRvLWRhdGUnCiAgICAgICAgICAgIGVsaWYgc2VsZi51cGdyYWRlX3N0cmF0ZWd5ID09ICJvbmx5LWlmLW5lZWRlZCI6CiAgICAgICAgICAgICAgICBza2lwX3JlYXNvbiA9ICdub3QgdXBncmFkZWQgYXMgbm90IGRpcmVjdGx5IHJlcXVpcmVkJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2tpcF9yZWFzb24gPSAnYWxyZWFkeSBzYXRpc2ZpZWQnCgogICAgICAgICAgICByZXR1cm4gc2tpcF9yZWFzb24KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBfcHJlcGFyZV9maWxlKHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICBmaW5kZXIsCiAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbCwKICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfaGFzaGVzPUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgaWdub3JlX2RlcGVuZGVuY2llcz1GYWxzZSk6CiAgICAgICAgIiIiUHJlcGFyZSBhIHNpbmdsZSByZXF1aXJlbWVudHMgZmlsZS4KCiAgICAgICAgOnJldHVybjogQSBsaXN0IG9mIGFkZGl0aW9uYWwgSW5zdGFsbFJlcXVpcmVtZW50cyB0byBhbHNvIGluc3RhbGwuCiAgICAgICAgIiIiCiAgICAgICAgIyBUZWxsIHVzZXIgd2hhdCB3ZSBhcmUgZG9pbmcgZm9yIHRoaXMgcmVxdWlyZW1lbnQ6CiAgICAgICAgIyBvYnRhaW4gKGVkaXRhYmxlKSwgc2tpcHBpbmcsIHByb2Nlc3NpbmcgKGxvY2FsIHVybCksIGNvbGxlY3RpbmcKICAgICAgICAjIChyZW1vdGUgdXJsIG9yIHBhY2thZ2UgbmFtZSkKICAgICAgICBpZiByZXFfdG9faW5zdGFsbC5jb25zdHJhaW50IG9yIHJlcV90b19pbnN0YWxsLnByZXBhcmVkOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgcmVxX3RvX2luc3RhbGwucHJlcGFyZWQgPSBUcnVlCgogICAgICAgICMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAjCiAgICAgICAgIyAjIHByaW50IGxvZyBtZXNzYWdlcyAjICMKICAgICAgICAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIwogICAgICAgIGlmIHJlcV90b19pbnN0YWxsLmVkaXRhYmxlOgogICAgICAgICAgICBsb2dnZXIuaW5mbygnT2J0YWluaW5nICVzJywgcmVxX3RvX2luc3RhbGwpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBzYXRpc2ZpZWRfYnkgaXMgb25seSBldmFsdWF0ZWQgYnkgY2FsbGluZyBfY2hlY2tfc2tpcF9pbnN0YWxsZWQsCiAgICAgICAgICAgICMgc28gaXQgbXVzdCBiZSBOb25lIGhlcmUuCiAgICAgICAgICAgIGFzc2VydCByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnkgaXMgTm9uZQogICAgICAgICAgICBpZiBub3Qgc2VsZi5pZ25vcmVfaW5zdGFsbGVkOgogICAgICAgICAgICAgICAgc2tpcF9yZWFzb24gPSBzZWxmLl9jaGVja19za2lwX2luc3RhbGxlZCgKICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbCwgZmluZGVyKQoKICAgICAgICAgICAgaWYgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5OgogICAgICAgICAgICAgICAgYXNzZXJ0IHNraXBfcmVhc29uIGlzIG5vdCBOb25lLCAoCiAgICAgICAgICAgICAgICAgICAgJ19jaGVja19za2lwX2luc3RhbGxlZCByZXR1cm5lZCBOb25lIGJ1dCAnCiAgICAgICAgICAgICAgICAgICAgJ3JlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieSBpcyBzZXQgdG8gJXInCiAgICAgICAgICAgICAgICAgICAgJSAocmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5LCkpCiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAnUmVxdWlyZW1lbnQgJXM6ICVzJywgc2tpcF9yZWFzb24sCiAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiAocmVxX3RvX2luc3RhbGwubGluayBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwubGluay5zY2hlbWUgPT0gJ2ZpbGUnKToKICAgICAgICAgICAgICAgICAgICBwYXRoID0gdXJsX3RvX3BhdGgocmVxX3RvX2luc3RhbGwubGluay51cmwpCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1Byb2Nlc3NpbmcgJXMnLCBkaXNwbGF5X3BhdGgocGF0aCkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdDb2xsZWN0aW5nICVzJywgcmVxX3RvX2luc3RhbGwpCgogICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICMKICAgICAgICAgICAgIyAjIHZjcyB1cGRhdGUgb3IgdW5wYWNrIGFyY2hpdmUgIyAjCiAgICAgICAgICAgICMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIwogICAgICAgICAgICBpZiByZXFfdG9faW5zdGFsbC5lZGl0YWJsZToKICAgICAgICAgICAgICAgIGlmIHJlcXVpcmVfaGFzaGVzOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAnVGhlIGVkaXRhYmxlIHJlcXVpcmVtZW50ICVzIGNhbm5vdCBiZSBpbnN0YWxsZWQgd2hlbiAnCiAgICAgICAgICAgICAgICAgICAgICAgICdyZXF1aXJpbmcgaGFzaGVzLCBiZWNhdXNlIHRoZXJlIGlzIG5vIHNpbmdsZSBmaWxlIHRvICcKICAgICAgICAgICAgICAgICAgICAgICAgJ2hhc2guJyAlIHJlcV90b19pbnN0YWxsKQogICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuZW5zdXJlX2hhc19zb3VyY2VfZGlyKHNlbGYuc3JjX2RpcikKICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLnVwZGF0ZV9lZGl0YWJsZShub3Qgc2VsZi5pc19kb3dubG9hZCkKICAgICAgICAgICAgICAgIGFic3RyYWN0X2Rpc3QgPSBtYWtlX2Fic3RyYWN0X2Rpc3QocmVxX3RvX2luc3RhbGwpCiAgICAgICAgICAgICAgICBhYnN0cmFjdF9kaXN0LnByZXBfZm9yX2Rpc3QoKQogICAgICAgICAgICAgICAgaWYgc2VsZi5pc19kb3dubG9hZDoKICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5hcmNoaXZlKHNlbGYuZG93bmxvYWRfZGlyKQogICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuY2hlY2tfaWZfZXhpc3RzKCkKICAgICAgICAgICAgZWxpZiByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnk6CiAgICAgICAgICAgICAgICBpZiByZXF1aXJlX2hhc2hlczoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAgICAgICAgICdTaW5jZSBpdCBpcyBhbHJlYWR5IGluc3RhbGxlZCwgd2UgYXJlIHRydXN0aW5nIHRoaXMgJwogICAgICAgICAgICAgICAgICAgICAgICAncGFja2FnZSB3aXRob3V0IGNoZWNraW5nIGl0cyBoYXNoLiBUbyBlbnN1cmUgYSAnCiAgICAgICAgICAgICAgICAgICAgICAgICdjb21wbGV0ZWx5IHJlcGVhdGFibGUgZW52aXJvbm1lbnQsIGluc3RhbGwgaW50byBhbiAnCiAgICAgICAgICAgICAgICAgICAgICAgICdlbXB0eSB2aXJ0dWFsZW52LicpCiAgICAgICAgICAgICAgICBhYnN0cmFjdF9kaXN0ID0gSW5zdGFsbGVkKHJlcV90b19pbnN0YWxsKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBAQCBpZiBmaWxlc3lzdGVtIHBhY2thZ2VzIGFyZSBub3QgbWFya2VkCiAgICAgICAgICAgICAgICAjIGVkaXRhYmxlIGluIGEgcmVxLCBhIG5vbiBkZXRlcm1pbmlzdGljIGVycm9yCiAgICAgICAgICAgICAgICAjIG9jY3VycyB3aGVuIHRoZSBzY3JpcHQgYXR0ZW1wdHMgdG8gdW5wYWNrIHRoZQogICAgICAgICAgICAgICAgIyBidWlsZCBkaXJlY3RvcnkKICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLmVuc3VyZV9oYXNfc291cmNlX2RpcihzZWxmLmJ1aWxkX2RpcikKICAgICAgICAgICAgICAgICMgSWYgYSBjaGVja291dCBleGlzdHMsIGl0J3MgdW53aXNlIHRvIGtlZXAgZ29pbmcuICB2ZXJzaW9uCiAgICAgICAgICAgICAgICAjIGluY29uc2lzdGVuY2llcyBhcmUgbG9nZ2VkIGxhdGVyLCBidXQgZG8gbm90IGZhaWwgdGhlCiAgICAgICAgICAgICAgICAjIGluc3RhbGxhdGlvbi4KICAgICAgICAgICAgICAgICMgRklYTUU6IHRoaXMgd29uJ3QgdXBncmFkZSB3aGVuIHRoZXJlJ3MgYW4gZXhpc3RpbmcKICAgICAgICAgICAgICAgICMgcGFja2FnZSB1bnBhY2tlZCBpbiBgcmVxX3RvX2luc3RhbGwuc291cmNlX2RpcmAKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4ocmVxX3RvX2luc3RhbGwuc291cmNlX2RpciwgJ3NldHVwLnB5JykpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFByZXZpb3VzQnVpbGREaXJFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgInBpcCBjYW4ndCBwcm9jZWVkIHdpdGggcmVxdWlyZW1lbnRzICclcycgZHVlIHRvIGEiCiAgICAgICAgICAgICAgICAgICAgICAgICIgcHJlLWV4aXN0aW5nIGJ1aWxkIGRpcmVjdG9yeSAoJXMpLiBUaGlzIGlzICIKICAgICAgICAgICAgICAgICAgICAgICAgImxpa2VseSBkdWUgdG8gYSBwcmV2aW91cyBpbnN0YWxsYXRpb24gdGhhdCBmYWlsZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICIuIHBpcCBpcyBiZWluZyByZXNwb25zaWJsZSBhbmQgbm90IGFzc3VtaW5nIGl0ICIKICAgICAgICAgICAgICAgICAgICAgICAgImNhbiBkZWxldGUgdGhpcy4gUGxlYXNlIGRlbGV0ZSBpdCBhbmQgdHJ5IGFnYWluLiIKICAgICAgICAgICAgICAgICAgICAgICAgJSAocmVxX3RvX2luc3RhbGwsIHJlcV90b19pbnN0YWxsLnNvdXJjZV9kaXIpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwucG9wdWxhdGVfbGluaygKICAgICAgICAgICAgICAgICAgICBmaW5kZXIsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5faXNfdXBncmFkZV9hbGxvd2VkKHJlcV90b19pbnN0YWxsKSwKICAgICAgICAgICAgICAgICAgICByZXF1aXJlX2hhc2hlcwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgIyBXZSBjYW4ndCBoaXQgdGhpcyBzcG90IGFuZCBoYXZlIHBvcHVsYXRlX2xpbmsgcmV0dXJuIE5vbmUuCiAgICAgICAgICAgICAgICAjIHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieSBpcyBOb25lIGhlcmUgKGJlY2F1c2Ugd2UncmUKICAgICAgICAgICAgICAgICMgZ3VhcmRlZCkgYW5kIHVwZ3JhZGUgaGFzIG5vIGltcGFjdCBleGNlcHQgd2hlbiBzYXRpc2ZpZWRfYnkKICAgICAgICAgICAgICAgICMgaXMgbm90IE5vbmUuCiAgICAgICAgICAgICAgICAjIFRoZW4gaW5zaWRlIGZpbmRfcmVxdWlyZW1lbnQgZXhpc3RpbmdfYXBwbGljYWJsZSAtPiBGYWxzZQogICAgICAgICAgICAgICAgIyBJZiBubyBuZXcgdmVyc2lvbnMgYXJlIGZvdW5kLCBEaXN0cmlidXRpb25Ob3RGb3VuZCBpcyByYWlzZWQsCiAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSBhIHJlc3VsdCBpcyBndWFyYW50ZWVkLgogICAgICAgICAgICAgICAgYXNzZXJ0IHJlcV90b19pbnN0YWxsLmxpbmsKICAgICAgICAgICAgICAgIGxpbmsgPSByZXFfdG9faW5zdGFsbC5saW5rCgogICAgICAgICAgICAgICAgIyBOb3cgdGhhdCB3ZSBoYXZlIHRoZSByZWFsIGxpbmssIHdlIGNhbiB0ZWxsIHdoYXQga2luZCBvZgogICAgICAgICAgICAgICAgIyByZXF1aXJlbWVudHMgd2UgaGF2ZSBhbmQgcmFpc2Ugc29tZSBtb3JlIGluZm9ybWF0aXZlIGVycm9ycwogICAgICAgICAgICAgICAgIyB0aGFuIG90aGVyd2lzZS4gKEZvciBleGFtcGxlLCB3ZSBjYW4gcmFpc2UgVmNzSGFzaFVuc3VwcG9ydGVkCiAgICAgICAgICAgICAgICAjIGZvciBhIFZDUyBVUkwgcmF0aGVyIHRoYW4gSGFzaE1pc3NpbmcuKQogICAgICAgICAgICAgICAgaWYgcmVxdWlyZV9oYXNoZXM6CiAgICAgICAgICAgICAgICAgICAgIyBXZSBjb3VsZCBjaGVjayB0aGVzZSBmaXJzdCAyIGNvbmRpdGlvbnMgaW5zaWRlCiAgICAgICAgICAgICAgICAgICAgIyB1bnBhY2tfdXJsIGFuZCBzYXZlIHJlcGV0aXRpb24gb2YgY29uZGl0aW9ucywgYnV0IHRoZW4KICAgICAgICAgICAgICAgICAgICAjIHdlIHdvdWxkIHJlcG9ydCBsZXNzLXVzZWZ1bCBlcnJvciBtZXNzYWdlcyBmb3IKICAgICAgICAgICAgICAgICAgICAjIHVuaGFzaGFibGUgcmVxdWlyZW1lbnRzLCBjb21wbGFpbmluZyB0aGF0IHRoZXJlJ3Mgbm8KICAgICAgICAgICAgICAgICAgICAjIGhhc2ggcHJvdmlkZWQuCiAgICAgICAgICAgICAgICAgICAgaWYgaXNfdmNzX3VybChsaW5rKToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmNzSGFzaFVuc3VwcG9ydGVkKCkKICAgICAgICAgICAgICAgICAgICBlbGlmIGlzX2ZpbGVfdXJsKGxpbmspIGFuZCBpc19kaXJfdXJsKGxpbmspOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXJlY3RvcnlVcmxIYXNoVW5zdXBwb3J0ZWQoKQogICAgICAgICAgICAgICAgICAgIGlmIChub3QgcmVxX3RvX2luc3RhbGwub3JpZ2luYWxfbGluayBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCByZXFfdG9faW5zdGFsbC5pc19waW5uZWQpOgogICAgICAgICAgICAgICAgICAgICAgICAjIFVucGlubmVkIHBhY2thZ2VzIGFyZSBhc2tpbmcgZm9yIHRyb3VibGUgd2hlbiBhIG5ldwogICAgICAgICAgICAgICAgICAgICAgICAjIHZlcnNpb24gaXMgdXBsb2FkZWQuIFRoaXMgaXNuJ3QgYSBzZWN1cml0eSBjaGVjaywgYnV0CiAgICAgICAgICAgICAgICAgICAgICAgICMgaXQgc2F2ZXMgdXNlcnMgYSBzdXJwcmlzaW5nIGhhc2ggbWlzbWF0Y2ggaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICMgZnV0dXJlLgogICAgICAgICAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICAgICAgICAgICMgZmlsZTovLy8gVVJMcyBhcmVuJ3QgcGlubmFibGUsIHNvIGRvbid0IGNvbXBsYWluCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWJvdXQgdGhlbSBub3QgYmVpbmcgcGlubmVkLgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBIYXNoVW5waW5uZWQoKQogICAgICAgICAgICAgICAgaGFzaGVzID0gcmVxX3RvX2luc3RhbGwuaGFzaGVzKAogICAgICAgICAgICAgICAgICAgIHRydXN0X2ludGVybmV0PW5vdCByZXF1aXJlX2hhc2hlcykKICAgICAgICAgICAgICAgIGlmIHJlcXVpcmVfaGFzaGVzIGFuZCBub3QgaGFzaGVzOgogICAgICAgICAgICAgICAgICAgICMgS25vd24tZ29vZCBoYXNoZXMgYXJlIG1pc3NpbmcgZm9yIHRoaXMgcmVxdWlyZW1lbnQsIHNvCiAgICAgICAgICAgICAgICAgICAgIyBzaGltIGl0IHdpdGggYSBmYWNhZGUgb2JqZWN0IHRoYXQgd2lsbCBwcm92b2tlIGhhc2gKICAgICAgICAgICAgICAgICAgICAjIGNvbXB1dGF0aW9uIGFuZCB0aGVuIHJhaXNlIGEgSGFzaE1pc3NpbmcgZXhjZXB0aW9uCiAgICAgICAgICAgICAgICAgICAgIyBzaG93aW5nIHRoZSB1c2VyIHdoYXQgdGhlIGhhc2ggc2hvdWxkIGJlLgogICAgICAgICAgICAgICAgICAgIGhhc2hlcyA9IE1pc3NpbmdIYXNoZXMoKQoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9kaXIgPSBzZWxmLmRvd25sb2FkX2RpcgogICAgICAgICAgICAgICAgICAgICMgV2UgYWx3YXlzIGRlbGV0ZSB1bnBhY2tlZCBzZGlzdHMgYWZ0ZXIgcGlwIHJhbi4KICAgICAgICAgICAgICAgICAgICBhdXRvZGVsZXRlX3VucGFja2VkID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGlmIHJlcV90b19pbnN0YWxsLmxpbmsuaXNfd2hlZWwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNlbGYud2hlZWxfZG93bmxvYWRfZGlyOgogICAgICAgICAgICAgICAgICAgICAgICAjIHdoZW4gZG9pbmcgJ3BpcCB3aGVlbGAgd2UgZG93bmxvYWQgd2hlZWxzIHRvIGEKICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWRpY2F0ZWQgZGlyLgogICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9kaXIgPSBzZWxmLndoZWVsX2Rvd25sb2FkX2RpcgogICAgICAgICAgICAgICAgICAgIGlmIHJlcV90b19pbnN0YWxsLmxpbmsuaXNfd2hlZWw6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRvd25sb2FkX2RpcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgV2hlbiBkb3dubG9hZGluZywgd2Ugb25seSB1bnBhY2sgd2hlZWxzIHRvIGdldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtZXRhZGF0YS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9kZWxldGVfdW5wYWNrZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdoZW4gaW5zdGFsbGluZyBhIHdoZWVsLCB3ZSB1c2UgdGhlIHVucGFja2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdoZWVsLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2RlbGV0ZV91bnBhY2tlZCA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgdW5wYWNrX3VybCgKICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwubGluaywgcmVxX3RvX2luc3RhbGwuc291cmNlX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfZGlyLCBhdXRvZGVsZXRlX3VucGFja2VkLAogICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uPXNlbGYuc2Vzc2lvbiwgaGFzaGVzPWhhc2hlcykKICAgICAgICAgICAgICAgIGV4Y2VwdCByZXF1ZXN0cy5IVFRQRXJyb3IgYXMgZXhjOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbCgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBpbnN0YWxsIHJlcXVpcmVtZW50ICVzIGJlY2F1c2UgJwogICAgICAgICAgICAgICAgICAgICAgICAnb2YgZXJyb3IgJXMnLAogICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbCwKICAgICAgICAgICAgICAgICAgICAgICAgZXhjLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBpbnN0YWxsIHJlcXVpcmVtZW50ICVzIGJlY2F1c2UgJwogICAgICAgICAgICAgICAgICAgICAgICAnb2YgSFRUUCBlcnJvciAlcyBmb3IgVVJMICVzJyAlCiAgICAgICAgICAgICAgICAgICAgICAgIChyZXFfdG9faW5zdGFsbCwgZXhjLCByZXFfdG9faW5zdGFsbC5saW5rKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGFic3RyYWN0X2Rpc3QgPSBtYWtlX2Fic3RyYWN0X2Rpc3QocmVxX3RvX2luc3RhbGwpCiAgICAgICAgICAgICAgICBhYnN0cmFjdF9kaXN0LnByZXBfZm9yX2Rpc3QoKQogICAgICAgICAgICAgICAgaWYgc2VsZi5pc19kb3dubG9hZDoKICAgICAgICAgICAgICAgICAgICAjIE1ha2UgYSAuemlwIG9mIHRoZSBzb3VyY2VfZGlyIHdlIGFscmVhZHkgY3JlYXRlZC4KICAgICAgICAgICAgICAgICAgICBpZiByZXFfdG9faW5zdGFsbC5saW5rLnNjaGVtZSBpbiB2Y3MuYWxsX3NjaGVtZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLmFyY2hpdmUoc2VsZi5kb3dubG9hZF9kaXIpCiAgICAgICAgICAgICAgICAjIHJlcV90b19pbnN0YWxsLnJlcSBpcyBvbmx5IGF2YWlsIGFmdGVyIHVucGFjayBmb3IgVVJMCiAgICAgICAgICAgICAgICAjIHBrZ3MgcmVwZWF0IGNoZWNrX2lmX2V4aXN0cyB0byB1bmluc3RhbGwtb24tdXBncmFkZQogICAgICAgICAgICAgICAgIyAoIzE0KQogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaWdub3JlX2luc3RhbGxlZDoKICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5jaGVja19pZl9leGlzdHMoKQogICAgICAgICAgICAgICAgaWYgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5OgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudXBncmFkZSBvciBzZWxmLmlnbm9yZV9pbnN0YWxsZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICMgZG9uJ3QgdW5pbnN0YWxsIGNvbmZsaWN0IGlmIHVzZXIgaW5zdGFsbCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb25mbGljdCBpcyBub3QgdXNlciBpbnN0YWxsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCAoc2VsZi51c2VfdXNlcl9zaXRlIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0X2luX3VzZXJzaXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnkpKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLmNvbmZsaWN0c193aXRoID0gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieQogICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnkgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUmVxdWlyZW1lbnQgYWxyZWFkeSBzYXRpc2ZpZWQgKHVzZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS11cGdyYWRlIHRvIHVwZ3JhZGUpOiAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbCwKICAgICAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICMKICAgICAgICAgICAgIyAjIHBhcnNlIGRlcGVuZGVuY2llcyAjICMKICAgICAgICAgICAgIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICMKICAgICAgICAgICAgZGlzdCA9IGFic3RyYWN0X2Rpc3QuZGlzdChmaW5kZXIpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGNoZWNrX2Rpc3RfcmVxdWlyZXNfcHl0aG9uKGRpc3QpCiAgICAgICAgICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFB5dGhvblZlcnNpb24gYXMgZToKICAgICAgICAgICAgICAgIGlmIHNlbGYuaWdub3JlX3JlcXVpcmVzX3B5dGhvbjoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZyhlLmFyZ3NbMF0pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLnJlbW92ZV90ZW1wb3Jhcnlfc291cmNlKCkKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBtb3JlX3JlcXMgPSBbXQoKICAgICAgICAgICAgZGVmIGFkZF9yZXEoc3VicmVxLCBleHRyYXNfcmVxdWVzdGVkKToKICAgICAgICAgICAgICAgIHN1Yl9pbnN0YWxsX3JlcSA9IEluc3RhbGxSZXF1aXJlbWVudCgKICAgICAgICAgICAgICAgICAgICBzdHIoc3VicmVxKSwKICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbCwKICAgICAgICAgICAgICAgICAgICBpc29sYXRlZD1zZWxmLmlzb2xhdGVkLAogICAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXNlbGYuX3doZWVsX2NhY2hlLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgbW9yZV9yZXFzLmV4dGVuZChzZWxmLmFkZF9yZXF1aXJlbWVudCgKICAgICAgICAgICAgICAgICAgICBzdWJfaW5zdGFsbF9yZXEsIHJlcV90b19pbnN0YWxsLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFzX3JlcXVlc3RlZD1leHRyYXNfcmVxdWVzdGVkKSkKCiAgICAgICAgICAgICMgV2UgYWRkIHJlcV90b19pbnN0YWxsIGJlZm9yZSBpdHMgZGVwZW5kZW5jaWVzLCBzbyB0aGF0IHdlCiAgICAgICAgICAgICMgY2FuIHJlZmVyIHRvIGl0IHdoZW4gYWRkaW5nIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgaWYgbm90IHNlbGYuaGFzX3JlcXVpcmVtZW50KHJlcV90b19pbnN0YWxsLm5hbWUpOgogICAgICAgICAgICAgICAgIyAndW5uYW1lZCcgcmVxdWlyZW1lbnRzIHdpbGwgZ2V0IGFkZGVkIGhlcmUKICAgICAgICAgICAgICAgIHNlbGYuYWRkX3JlcXVpcmVtZW50KHJlcV90b19pbnN0YWxsLCBOb25lKQoKICAgICAgICAgICAgaWYgbm90IGlnbm9yZV9kZXBlbmRlbmNpZXM6CiAgICAgICAgICAgICAgICBpZiAocmVxX3RvX2luc3RhbGwuZXh0cmFzKToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAgICAgICAgICJJbnN0YWxsaW5nIGV4dHJhIHJlcXVpcmVtZW50czogJXIiLAogICAgICAgICAgICAgICAgICAgICAgICAnLCcuam9pbihyZXFfdG9faW5zdGFsbC5leHRyYXMpLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIG1pc3NpbmdfcmVxdWVzdGVkID0gc29ydGVkKAogICAgICAgICAgICAgICAgICAgIHNldChyZXFfdG9faW5zdGFsbC5leHRyYXMpIC0gc2V0KGRpc3QuZXh0cmFzKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZm9yIG1pc3NpbmcgaW4gbWlzc2luZ19yZXF1ZXN0ZWQ6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICclcyBkb2VzIG5vdCBwcm92aWRlIHRoZSBleHRyYSBcJyVzXCcnLAogICAgICAgICAgICAgICAgICAgICAgICBkaXN0LCBtaXNzaW5nCiAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9yZXF1ZXN0ZWQgPSBzb3J0ZWQoCiAgICAgICAgICAgICAgICAgICAgc2V0KGRpc3QuZXh0cmFzKSAmIHNldChyZXFfdG9faW5zdGFsbC5leHRyYXMpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBmb3Igc3VicmVxIGluIGRpc3QucmVxdWlyZXMoYXZhaWxhYmxlX3JlcXVlc3RlZCk6CiAgICAgICAgICAgICAgICAgICAgYWRkX3JlcShzdWJyZXEsIGV4dHJhc19yZXF1ZXN0ZWQ9YXZhaWxhYmxlX3JlcXVlc3RlZCkKCiAgICAgICAgICAgICMgY2xlYW51cCB0bXAgc3JjCiAgICAgICAgICAgIHNlbGYucmVxc190b19jbGVhbnVwLmFwcGVuZChyZXFfdG9faW5zdGFsbCkKCiAgICAgICAgICAgIGlmIG5vdCByZXFfdG9faW5zdGFsbC5lZGl0YWJsZSBhbmQgbm90IHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieToKICAgICAgICAgICAgICAgICMgWFhYOiAtLW5vLWluc3RhbGwgbGVhZHMgdGhpcyB0byByZXBvcnQgJ1N1Y2Nlc3NmdWxseQogICAgICAgICAgICAgICAgIyBkb3dubG9hZGVkJyBmb3Igb25seSBub24tZWRpdGFibGUgcmVxcywgZXZlbiB0aG91Z2ggd2UgdG9vawogICAgICAgICAgICAgICAgIyBhY3Rpb24gb24gdGhlbS4KICAgICAgICAgICAgICAgIHNlbGYuc3VjY2Vzc2Z1bGx5X2Rvd25sb2FkZWQuYXBwZW5kKHJlcV90b19pbnN0YWxsKQoKICAgICAgICByZXR1cm4gbW9yZV9yZXFzCgogICAgZGVmIGNsZWFudXBfZmlsZXMoc2VsZik6CiAgICAgICAgIiIiQ2xlYW4gdXAgZmlsZXMsIHJlbW92ZSBidWlsZHMuIiIiCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdDbGVhbmluZyB1cC4uLicpCiAgICAgICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgICAgIGZvciByZXEgaW4gc2VsZi5yZXFzX3RvX2NsZWFudXA6CiAgICAgICAgICAgICAgICByZXEucmVtb3ZlX3RlbXBvcmFyeV9zb3VyY2UoKQoKICAgIGRlZiBfdG9faW5zdGFsbChzZWxmKToKICAgICAgICAiIiJDcmVhdGUgdGhlIGluc3RhbGxhdGlvbiBvcmRlci4KCiAgICAgICAgVGhlIGluc3RhbGxhdGlvbiBvcmRlciBpcyB0b3BvbG9naWNhbCAtIHJlcXVpcmVtZW50cyBhcmUgaW5zdGFsbGVkCiAgICAgICAgYmVmb3JlIHRoZSByZXF1aXJpbmcgdGhpbmcuIFdlIGJyZWFrIGN5Y2xlcyBhdCBhbiBhcmJpdHJhcnkgcG9pbnQsCiAgICAgICAgYW5kIG1ha2Ugbm8gb3RoZXIgZ3VhcmFudGVlcy4KICAgICAgICAiIiIKICAgICAgICAjIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB3aGljaCB3ZSBtYXkgY2hhbmdlIGF0IGFueSBwb2ludAogICAgICAgICMgaW5zdGFsbHMgdGhlIHVzZXIgc3BlY2lmaWVkIHRoaW5ncyBpbiB0aGUgb3JkZXIgZ2l2ZW4sIGV4Y2VwdCB3aGVuCiAgICAgICAgIyBkZXBlbmRlbmNpZXMgbXVzdCBjb21lIGVhcmxpZXIgdG8gYWNoaWV2ZSB0b3BvbG9naWNhbCBvcmRlci4KICAgICAgICBvcmRlciA9IFtdCiAgICAgICAgb3JkZXJlZF9yZXFzID0gc2V0KCkKCiAgICAgICAgZGVmIHNjaGVkdWxlKHJlcSk6CiAgICAgICAgICAgIGlmIHJlcS5zYXRpc2ZpZWRfYnkgb3IgcmVxIGluIG9yZGVyZWRfcmVxczoKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBpZiByZXEuY29uc3RyYWludDoKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBvcmRlcmVkX3JlcXMuYWRkKHJlcSkKICAgICAgICAgICAgZm9yIGRlcCBpbiBzZWxmLl9kZXBlbmRlbmNpZXNbcmVxXToKICAgICAgICAgICAgICAgIHNjaGVkdWxlKGRlcCkKICAgICAgICAgICAgb3JkZXIuYXBwZW5kKHJlcSkKICAgICAgICBmb3IgaW5zdGFsbF9yZXEgaW4gc2VsZi5yZXF1aXJlbWVudHMudmFsdWVzKCk6CiAgICAgICAgICAgIHNjaGVkdWxlKGluc3RhbGxfcmVxKQogICAgICAgIHJldHVybiBvcmRlcgoKICAgIGRlZiBpbnN0YWxsKHNlbGYsIGluc3RhbGxfb3B0aW9ucywgZ2xvYmFsX29wdGlvbnM9KCksICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgSW5zdGFsbCBldmVyeXRoaW5nIGluIHRoaXMgc2V0IChhZnRlciBoYXZpbmcgZG93bmxvYWRlZCBhbmQgdW5wYWNrZWQKICAgICAgICB0aGUgcGFja2FnZXMpCiAgICAgICAgIiIiCiAgICAgICAgdG9faW5zdGFsbCA9IHNlbGYuX3RvX2luc3RhbGwoKQoKICAgICAgICBpZiB0b19pbnN0YWxsOgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICdJbnN0YWxsaW5nIGNvbGxlY3RlZCBwYWNrYWdlczogJXMnLAogICAgICAgICAgICAgICAgJywgJy5qb2luKFtyZXEubmFtZSBmb3IgcmVxIGluIHRvX2luc3RhbGxdKSwKICAgICAgICAgICAgKQoKICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgZm9yIHJlcXVpcmVtZW50IGluIHRvX2luc3RhbGw6CiAgICAgICAgICAgICAgICBpZiByZXF1aXJlbWVudC5jb25mbGljdHNfd2l0aDoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgJ0ZvdW5kIGV4aXN0aW5nIGluc3RhbGxhdGlvbjogJXMnLAogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudC5jb25mbGljdHNfd2l0aCwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50LnVuaW5zdGFsbChhdXRvX2NvbmZpcm09VHJ1ZSkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudC5pbnN0YWxsKAogICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsX29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAqYXJncywKICAgICAgICAgICAgICAgICAgICAgICAgKiprd2FyZ3MKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICAgICAgIyBpZiBpbnN0YWxsIGRpZCBub3Qgc3VjY2VlZCwgcm9sbGJhY2sgcHJldmlvdXMgdW5pbnN0YWxsCiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVtZW50LmNvbmZsaWN0c193aXRoIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50Lmluc3RhbGxfc3VjY2VlZGVkKToKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQucm9sbGJhY2tfdW5pbnN0YWxsKCkKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZW1lbnQuY29uZmxpY3RzX3dpdGggYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudC5pbnN0YWxsX3N1Y2NlZWRlZCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50LmNvbW1pdF91bmluc3RhbGwoKQogICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQucmVtb3ZlX3RlbXBvcmFyeV9zb3VyY2UoKQoKICAgICAgICBzZWxmLnN1Y2Nlc3NmdWxseV9pbnN0YWxsZWQgPSB0b19pbnN0YWxsClBLAwQUAAAAAAAAACEABUbEcPEaAADxGgAAKAAAAHB5cGlfX3BpcF85XzBfMy9waXAvcmVxL3JlcV91bmluc3RhbGwucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCB0ZW1wZmlsZQoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCB1c2VzX3B5Y2FjaGUsIFdJTkRPV1MsIGNhY2hlX2Zyb21fc291cmNlCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IFVuaW5zdGFsbGF0aW9uRXJyb3IKZnJvbSBwaXAudXRpbHMgaW1wb3J0IHJtdHJlZSwgYXNrLCBpc19sb2NhbCwgcmVuYW1lcywgbm9ybWFsaXplX3BhdGgKZnJvbSBwaXAudXRpbHMubG9nZ2luZyBpbXBvcnQgaW5kZW50X2xvZwoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIFVuaW5zdGFsbFBhdGhTZXQob2JqZWN0KToKICAgICIiIkEgc2V0IG9mIGZpbGUgcGF0aHMgdG8gYmUgcmVtb3ZlZCBpbiB0aGUgdW5pbnN0YWxsYXRpb24gb2YgYQogICAgcmVxdWlyZW1lbnQuIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGlzdCk6CiAgICAgICAgc2VsZi5wYXRocyA9IHNldCgpCiAgICAgICAgc2VsZi5fcmVmdXNlID0gc2V0KCkKICAgICAgICBzZWxmLnB0aCA9IHt9CiAgICAgICAgc2VsZi5kaXN0ID0gZGlzdAogICAgICAgIHNlbGYuc2F2ZV9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5fbW92ZWRfcGF0aHMgPSBbXQoKICAgIGRlZiBfcGVybWl0dGVkKHNlbGYsIHBhdGgpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBUcnVlIGlmIHRoZSBnaXZlbiBwYXRoIGlzIG9uZSB3ZSBhcmUgcGVybWl0dGVkIHRvCiAgICAgICAgcmVtb3ZlL21vZGlmeSwgRmFsc2Ugb3RoZXJ3aXNlLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaXNfbG9jYWwocGF0aCkKCiAgICBkZWYgYWRkKHNlbGYsIHBhdGgpOgogICAgICAgIGhlYWQsIHRhaWwgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCgogICAgICAgICMgd2Ugbm9ybWFsaXplIHRoZSBoZWFkIHRvIHJlc29sdmUgcGFyZW50IGRpcmVjdG9yeSBzeW1saW5rcywgYnV0IG5vdAogICAgICAgICMgdGhlIHRhaWwsIHNpbmNlIHdlIG9ubHkgd2FudCB0byB1bmluc3RhbGwgc3ltbGlua3MsIG5vdCB0aGVpciB0YXJnZXRzCiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihub3JtYWxpemVfcGF0aChoZWFkKSwgb3MucGF0aC5ub3JtY2FzZSh0YWlsKSkKCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBzZWxmLl9wZXJtaXR0ZWQocGF0aCk6CiAgICAgICAgICAgIHNlbGYucGF0aHMuYWRkKHBhdGgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fcmVmdXNlLmFkZChwYXRoKQoKICAgICAgICAjIF9fcHljYWNoZV9fIGZpbGVzIGNhbiBzaG93IHVwIGFmdGVyICdpbnN0YWxsZWQtZmlsZXMudHh0JyBpcyBjcmVhdGVkLAogICAgICAgICMgZHVlIHRvIGltcG9ydHMKICAgICAgICBpZiBvcy5wYXRoLnNwbGl0ZXh0KHBhdGgpWzFdID09ICcucHknIGFuZCB1c2VzX3B5Y2FjaGU6CiAgICAgICAgICAgIHNlbGYuYWRkKGNhY2hlX2Zyb21fc291cmNlKHBhdGgpKQoKICAgIGRlZiBhZGRfcHRoKHNlbGYsIHB0aF9maWxlLCBlbnRyeSk6CiAgICAgICAgcHRoX2ZpbGUgPSBub3JtYWxpemVfcGF0aChwdGhfZmlsZSkKICAgICAgICBpZiBzZWxmLl9wZXJtaXR0ZWQocHRoX2ZpbGUpOgogICAgICAgICAgICBpZiBwdGhfZmlsZSBub3QgaW4gc2VsZi5wdGg6CiAgICAgICAgICAgICAgICBzZWxmLnB0aFtwdGhfZmlsZV0gPSBVbmluc3RhbGxQdGhFbnRyaWVzKHB0aF9maWxlKQogICAgICAgICAgICBzZWxmLnB0aFtwdGhfZmlsZV0uYWRkKGVudHJ5KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX3JlZnVzZS5hZGQocHRoX2ZpbGUpCgogICAgZGVmIGNvbXBhY3Qoc2VsZiwgcGF0aHMpOgogICAgICAgICIiIkNvbXBhY3QgYSBwYXRoIHNldCB0byBjb250YWluIHRoZSBtaW5pbWFsIG51bWJlciBvZiBwYXRocwogICAgICAgIG5lY2Vzc2FyeSB0byBjb250YWluIGFsbCBwYXRocyBpbiB0aGUgc2V0LiBJZiAvYS9wYXRoLyBhbmQKICAgICAgICAvYS9wYXRoL3RvL2EvZmlsZS50eHQgYXJlIGJvdGggaW4gdGhlIHNldCwgbGVhdmUgb25seSB0aGUKICAgICAgICBzaG9ydGVyIHBhdGguIiIiCiAgICAgICAgc2hvcnRfcGF0aHMgPSBzZXQoKQogICAgICAgIGZvciBwYXRoIGluIHNvcnRlZChwYXRocywga2V5PWxlbik6CiAgICAgICAgICAgIGlmIG5vdCBhbnkoWwogICAgICAgICAgICAgICAgICAgIChwYXRoLnN0YXJ0c3dpdGgoc2hvcnRwYXRoKSBhbmQKICAgICAgICAgICAgICAgICAgICAgcGF0aFtsZW4oc2hvcnRwYXRoLnJzdHJpcChvcy5wYXRoLnNlcCkpXSA9PSBvcy5wYXRoLnNlcCkKICAgICAgICAgICAgICAgICAgICBmb3Igc2hvcnRwYXRoIGluIHNob3J0X3BhdGhzXSk6CiAgICAgICAgICAgICAgICBzaG9ydF9wYXRocy5hZGQocGF0aCkKICAgICAgICByZXR1cm4gc2hvcnRfcGF0aHMKCiAgICBkZWYgX3N0YXNoKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIHNlbGYuc2F2ZV9kaXIsIG9zLnBhdGguc3BsaXRkcml2ZShwYXRoKVsxXS5sc3RyaXAob3MucGF0aC5zZXApKQoKICAgIGRlZiByZW1vdmUoc2VsZiwgYXV0b19jb25maXJtPUZhbHNlKToKICAgICAgICAiIiJSZW1vdmUgcGF0aHMgaW4gYGBzZWxmLnBhdGhzYGAgd2l0aCBjb25maXJtYXRpb24gKHVubGVzcwogICAgICAgIGBgYXV0b19jb25maXJtYGAgaXMgVHJ1ZSkuIiIiCiAgICAgICAgaWYgbm90IHNlbGYucGF0aHM6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgIkNhbid0IHVuaW5zdGFsbCAnJXMnLiBObyBmaWxlcyB3ZXJlIGZvdW5kIHRvIHVuaW5zdGFsbC4iLAogICAgICAgICAgICAgICAgc2VsZi5kaXN0LnByb2plY3RfbmFtZSwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgJ1VuaW5zdGFsbGluZyAlcy0lczonLAogICAgICAgICAgICBzZWxmLmRpc3QucHJvamVjdF9uYW1lLCBzZWxmLmRpc3QudmVyc2lvbgogICAgICAgICkKCiAgICAgICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgICAgIHBhdGhzID0gc29ydGVkKHNlbGYuY29tcGFjdChzZWxmLnBhdGhzKSkKCiAgICAgICAgICAgIGlmIGF1dG9fY29uZmlybToKICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gJ3knCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmb3IgcGF0aCBpbiBwYXRoczoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhwYXRoKQogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhc2soJ1Byb2NlZWQgKHkvbik/ICcsICgneScsICduJykpCiAgICAgICAgICAgIGlmIHNlbGYuX3JlZnVzZToKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdOb3QgcmVtb3Zpbmcgb3IgbW9kaWZ5aW5nIChvdXRzaWRlIG9mIHByZWZpeCk6JykKICAgICAgICAgICAgICAgIGZvciBwYXRoIGluIHNlbGYuY29tcGFjdChzZWxmLl9yZWZ1c2UpOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKHBhdGgpCiAgICAgICAgICAgIGlmIHJlc3BvbnNlID09ICd5JzoKICAgICAgICAgICAgICAgIHNlbGYuc2F2ZV9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHN1ZmZpeD0nLXVuaW5zdGFsbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9J3BpcC0nKQogICAgICAgICAgICAgICAgZm9yIHBhdGggaW4gcGF0aHM6CiAgICAgICAgICAgICAgICAgICAgbmV3X3BhdGggPSBzZWxmLl9zdGFzaChwYXRoKQogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVtb3ZpbmcgZmlsZSBvciBkaXJlY3RvcnkgJXMnLCBwYXRoKQogICAgICAgICAgICAgICAgICAgIHNlbGYuX21vdmVkX3BhdGhzLmFwcGVuZChwYXRoKQogICAgICAgICAgICAgICAgICAgIHJlbmFtZXMocGF0aCwgbmV3X3BhdGgpCiAgICAgICAgICAgICAgICBmb3IgcHRoIGluIHNlbGYucHRoLnZhbHVlcygpOgogICAgICAgICAgICAgICAgICAgIHB0aC5yZW1vdmUoKQogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgJ1N1Y2Nlc3NmdWxseSB1bmluc3RhbGxlZCAlcy0lcycsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXN0LnByb2plY3RfbmFtZSwgc2VsZi5kaXN0LnZlcnNpb24KICAgICAgICAgICAgICAgICkKCiAgICBkZWYgcm9sbGJhY2soc2VsZik6CiAgICAgICAgIiIiUm9sbGJhY2sgdGhlIGNoYW5nZXMgcHJldmlvdXNseSBtYWRlIGJ5IHJlbW92ZSgpLiIiIgogICAgICAgIGlmIHNlbGYuc2F2ZV9kaXIgaXMgTm9uZToKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IHJvbGwgYmFjayAlczsgd2FzIG5vdCB1bmluc3RhbGxlZCIsCiAgICAgICAgICAgICAgICBzZWxmLmRpc3QucHJvamVjdF9uYW1lLAogICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGxvZ2dlci5pbmZvKCdSb2xsaW5nIGJhY2sgdW5pbnN0YWxsIG9mICVzJywgc2VsZi5kaXN0LnByb2plY3RfbmFtZSkKICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLl9tb3ZlZF9wYXRoczoKICAgICAgICAgICAgdG1wX3BhdGggPSBzZWxmLl9zdGFzaChwYXRoKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlcGxhY2luZyAlcycsIHBhdGgpCiAgICAgICAgICAgIHJlbmFtZXModG1wX3BhdGgsIHBhdGgpCiAgICAgICAgZm9yIHB0aCBpbiBzZWxmLnB0aC52YWx1ZXMoKToKICAgICAgICAgICAgcHRoLnJvbGxiYWNrKCkKCiAgICBkZWYgY29tbWl0KHNlbGYpOgogICAgICAgICIiIlJlbW92ZSB0ZW1wb3Jhcnkgc2F2ZSBkaXI6IHJvbGxiYWNrIHdpbGwgbm8gbG9uZ2VyIGJlIHBvc3NpYmxlLiIiIgogICAgICAgIGlmIHNlbGYuc2F2ZV9kaXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJtdHJlZShzZWxmLnNhdmVfZGlyKQogICAgICAgICAgICBzZWxmLnNhdmVfZGlyID0gTm9uZQogICAgICAgICAgICBzZWxmLl9tb3ZlZF9wYXRocyA9IFtdCgoKY2xhc3MgVW5pbnN0YWxsUHRoRW50cmllcyhvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHB0aF9maWxlKToKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUocHRoX2ZpbGUpOgogICAgICAgICAgICByYWlzZSBVbmluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIkNhbm5vdCByZW1vdmUgZW50cmllcyBmcm9tIG5vbmV4aXN0ZW50IGZpbGUgJXMiICUgcHRoX2ZpbGUKICAgICAgICAgICAgKQogICAgICAgIHNlbGYuZmlsZSA9IHB0aF9maWxlCiAgICAgICAgc2VsZi5lbnRyaWVzID0gc2V0KCkKICAgICAgICBzZWxmLl9zYXZlZF9saW5lcyA9IE5vbmUKCiAgICBkZWYgYWRkKHNlbGYsIGVudHJ5KToKICAgICAgICBlbnRyeSA9IG9zLnBhdGgubm9ybWNhc2UoZW50cnkpCiAgICAgICAgIyBPbiBXaW5kb3dzLCBvcy5wYXRoLm5vcm1jYXNlIGNvbnZlcnRzIHRoZSBlbnRyeSB0byB1c2UKICAgICAgICAjIGJhY2tzbGFzaGVzLiAgVGhpcyBpcyBjb3JyZWN0IGZvciBlbnRyaWVzIHRoYXQgZGVzY3JpYmUgYWJzb2x1dGUKICAgICAgICAjIHBhdGhzIG91dHNpZGUgb2Ygc2l0ZS1wYWNrYWdlcywgYnV0IGFsbCB0aGUgb3RoZXJzIHVzZSBmb3J3YXJkCiAgICAgICAgIyBzbGFzaGVzLgogICAgICAgIGlmIFdJTkRPV1MgYW5kIG5vdCBvcy5wYXRoLnNwbGl0ZHJpdmUoZW50cnkpWzBdOgogICAgICAgICAgICBlbnRyeSA9IGVudHJ5LnJlcGxhY2UoJ1xcJywgJy8nKQogICAgICAgIHNlbGYuZW50cmllcy5hZGQoZW50cnkpCgogICAgZGVmIHJlbW92ZShzZWxmKToKICAgICAgICBsb2dnZXIuZGVidWcoJ1JlbW92aW5nIHB0aCBlbnRyaWVzIGZyb20gJXM6Jywgc2VsZi5maWxlKQogICAgICAgIHdpdGggb3BlbihzZWxmLmZpbGUsICdyYicpIGFzIGZoOgogICAgICAgICAgICAjIHdpbmRvd3MgdXNlcyAnXHJcbicgd2l0aCBweTNrLCBidXQgdXNlcyAnXG4nIHdpdGggcHkyLngKICAgICAgICAgICAgbGluZXMgPSBmaC5yZWFkbGluZXMoKQogICAgICAgICAgICBzZWxmLl9zYXZlZF9saW5lcyA9IGxpbmVzCiAgICAgICAgaWYgYW55KGInXHJcbicgaW4gbGluZSBmb3IgbGluZSBpbiBsaW5lcyk6CiAgICAgICAgICAgIGVuZGxpbmUgPSAnXHJcbicKICAgICAgICBlbHNlOgogICAgICAgICAgICBlbmRsaW5lID0gJ1xuJwogICAgICAgIGZvciBlbnRyeSBpbiBzZWxmLmVudHJpZXM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVtb3ZpbmcgZW50cnk6ICVzJywgZW50cnkpCiAgICAgICAgICAgICAgICBsaW5lcy5yZW1vdmUoKGVudHJ5ICsgZW5kbGluZSkuZW5jb2RlKCJ1dGYtOCIpKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICB3aXRoIG9wZW4oc2VsZi5maWxlLCAnd2InKSBhcyBmaDoKICAgICAgICAgICAgZmgud3JpdGVsaW5lcyhsaW5lcykKCiAgICBkZWYgcm9sbGJhY2soc2VsZik6CiAgICAgICAgaWYgc2VsZi5fc2F2ZWRfbGluZXMgaXMgTm9uZToKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKAogICAgICAgICAgICAgICAgJ0Nhbm5vdCByb2xsIGJhY2sgY2hhbmdlcyB0byAlcywgbm9uZSB3ZXJlIG1hZGUnLCBzZWxmLmZpbGUKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBsb2dnZXIuZGVidWcoJ1JvbGxpbmcgJXMgYmFjayB0byBwcmV2aW91cyBzdGF0ZScsIHNlbGYuZmlsZSkKICAgICAgICB3aXRoIG9wZW4oc2VsZi5maWxlLCAnd2InKSBhcyBmaDoKICAgICAgICAgICAgZmgud3JpdGVsaW5lcyhzZWxmLl9zYXZlZF9saW5lcykKICAgICAgICByZXR1cm4gVHJ1ZQpQSwMEFAAAAAAAAAAhANusd/acAAAAnAAAACMAAABweXBpX19waXBfOV8wXzMvcGlwL3N0YXR1c19jb2Rlcy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgpTVUNDRVNTID0gMApFUlJPUiA9IDEKVU5LTk9XTl9FUlJPUiA9IDIKVklSVFVBTEVOVl9OT1RfRk9VTkQgPSAzClBSRVZJT1VTX0JVSUxEX0RJUl9FUlJPUiA9IDQKTk9fTUFUQ0hFU19GT1VORCA9IDIzClBLAwQUAAAAAAAAACEA4Fq0vjNqAAAzagAAJQAAAHB5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvX19pbml0X18ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IGVycm5vCmltcG9ydCBpbwppbXBvcnQgbG9jYWxlCiMgd2UgaGF2ZSBhIHN1Ym1vZHVsZSBuYW1lZCAnbG9nZ2luZycgd2hpY2ggd291bGQgc2hhZG93IHRoaXMgaWYgd2UgdXNlZCB0aGUKIyByZWd1bGFyIG5hbWU6CmltcG9ydCBsb2dnaW5nIGFzIHN0ZF9sb2dnaW5nCmltcG9ydCByZQppbXBvcnQgb3MKaW1wb3J0IHBvc2l4cGF0aAppbXBvcnQgc2h1dGlsCmltcG9ydCBzdGF0CmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCBzeXMKaW1wb3J0IHRhcmZpbGUKaW1wb3J0IHppcGZpbGUKCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IEluc3RhbGxhdGlvbkVycm9yCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgY29uc29sZV90b19zdHIsIGV4cGFuZHVzZXIsIHN0ZGxpYl9wa2dzCmZyb20gcGlwLmxvY2F0aW9ucyBpbXBvcnQgKAogICAgc2l0ZV9wYWNrYWdlcywgdXNlcl9zaXRlLCBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYsIHZpcnR1YWxlbnZfbm9fZ2xvYmFsLAogICAgd3JpdGVfZGVsZXRlX21hcmtlcl9maWxlLAopCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHBrZ19yZXNvdXJjZXMKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMgaW1wb3J0IGlucHV0CmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCBQWTIKZnJvbSBwaXAuX3ZlbmRvci5yZXRyeWluZyBpbXBvcnQgcmV0cnkKCmlmIFBZMjoKICAgIGZyb20gaW8gaW1wb3J0IEJ5dGVzSU8gYXMgU3RyaW5nSU8KZWxzZToKICAgIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCgpfX2FsbF9fID0gWydybXRyZWUnLCAnZGlzcGxheV9wYXRoJywgJ2JhY2t1cF9kaXInLAogICAgICAgICAgICdhc2snLCAnc3BsaXRleHQnLAogICAgICAgICAgICdmb3JtYXRfc2l6ZScsICdpc19pbnN0YWxsYWJsZV9kaXInLAogICAgICAgICAgICdpc19zdm5fcGFnZScsICdmaWxlX2NvbnRlbnRzJywKICAgICAgICAgICAnc3BsaXRfbGVhZGluZ19kaXInLCAnaGFzX2xlYWRpbmdfZGlyJywKICAgICAgICAgICAnbm9ybWFsaXplX3BhdGgnLAogICAgICAgICAgICdyZW5hbWVzJywgJ2dldF90ZXJtaW5hbF9zaXplJywgJ2dldF9wcm9nJywKICAgICAgICAgICAndW56aXBfZmlsZScsICd1bnRhcl9maWxlJywgJ3VucGFja19maWxlJywgJ2NhbGxfc3VicHJvY2VzcycsCiAgICAgICAgICAgJ2NhcHR1cmVkX3N0ZG91dCcsICdlbnN1cmVfZGlyJywKICAgICAgICAgICAnQVJDSElWRV9FWFRFTlNJT05TJywgJ1NVUFBPUlRFRF9FWFRFTlNJT05TJywKICAgICAgICAgICAnZ2V0X2luc3RhbGxlZF92ZXJzaW9uJ10KCgpsb2dnZXIgPSBzdGRfbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgpCWjJfRVhURU5TSU9OUyA9ICgnLnRhci5iejInLCAnLnRieicpClhaX0VYVEVOU0lPTlMgPSAoJy50YXIueHonLCAnLnR4eicsICcudGx6JywgJy50YXIubHonLCAnLnRhci5sem1hJykKWklQX0VYVEVOU0lPTlMgPSAoJy56aXAnLCAnLndobCcpClRBUl9FWFRFTlNJT05TID0gKCcudGFyLmd6JywgJy50Z3onLCAnLnRhcicpCkFSQ0hJVkVfRVhURU5TSU9OUyA9ICgKICAgIFpJUF9FWFRFTlNJT05TICsgQloyX0VYVEVOU0lPTlMgKyBUQVJfRVhURU5TSU9OUyArIFhaX0VYVEVOU0lPTlMpClNVUFBPUlRFRF9FWFRFTlNJT05TID0gWklQX0VYVEVOU0lPTlMgKyBUQVJfRVhURU5TSU9OUwp0cnk6CiAgICBpbXBvcnQgYnoyICAjIG5vcWEKICAgIFNVUFBPUlRFRF9FWFRFTlNJT05TICs9IEJaMl9FWFRFTlNJT05TCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGxvZ2dlci5kZWJ1ZygnYnoyIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlJykKCnRyeToKICAgICMgT25seSBmb3IgUHl0aG9uIDMuMysKICAgIGltcG9ydCBsem1hICAjIG5vcWEKICAgIFNVUFBPUlRFRF9FWFRFTlNJT05TICs9IFhaX0VYVEVOU0lPTlMKZXhjZXB0IEltcG9ydEVycm9yOgogICAgbG9nZ2VyLmRlYnVnKCdsem1hIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlJykKCgpkZWYgaW1wb3J0X29yX3JhaXNlKHBrZ19vcl9tb2R1bGVfc3RyaW5nLCBFeGNlcHRpb25UeXBlLCAqYXJncywgKiprd2FyZ3MpOgogICAgdHJ5OgogICAgICAgIHJldHVybiBfX2ltcG9ydF9fKHBrZ19vcl9tb2R1bGVfc3RyaW5nKQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHJhaXNlIEV4Y2VwdGlvblR5cGUoKmFyZ3MsICoqa3dhcmdzKQoKCmRlZiBlbnN1cmVfZGlyKHBhdGgpOgogICAgIiIib3MucGF0aC5tYWtlZGlycyB3aXRob3V0IEVFWElTVC4iIiIKICAgIHRyeToKICAgICAgICBvcy5tYWtlZGlycyhwYXRoKQogICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVFWElTVDoKICAgICAgICAgICAgcmFpc2UKCgpkZWYgZ2V0X3Byb2coKToKICAgIHRyeToKICAgICAgICBpZiBvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKSBpbiAoJ19fbWFpbl9fLnB5JywgJy1jJyk6CiAgICAgICAgICAgIHJldHVybiAiJXMgLW0gcGlwIiAlIHN5cy5leGVjdXRhYmxlCiAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IsIEluZGV4RXJyb3IpOgogICAgICAgIHBhc3MKICAgIHJldHVybiAncGlwJwoKCiMgUmV0cnkgZXZlcnkgaGFsZiBzZWNvbmQgZm9yIHVwIHRvIDMgc2Vjb25kcwpAcmV0cnkoc3RvcF9tYXhfZGVsYXk9MzAwMCwgd2FpdF9maXhlZD01MDApCmRlZiBybXRyZWUoZGlyLCBpZ25vcmVfZXJyb3JzPUZhbHNlKToKICAgIHNodXRpbC5ybXRyZWUoZGlyLCBpZ25vcmVfZXJyb3JzPWlnbm9yZV9lcnJvcnMsCiAgICAgICAgICAgICAgICAgIG9uZXJyb3I9cm10cmVlX2Vycm9yaGFuZGxlcikKCgpkZWYgcm10cmVlX2Vycm9yaGFuZGxlcihmdW5jLCBwYXRoLCBleGNfaW5mbyk6CiAgICAiIiJPbiBXaW5kb3dzLCB0aGUgZmlsZXMgaW4gLnN2biBhcmUgcmVhZC1vbmx5LCBzbyB3aGVuIHJtdHJlZSgpIHRyaWVzIHRvCiAgICByZW1vdmUgdGhlbSwgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4gIFdlIGNhdGNoIHRoYXQgaGVyZSwgcmVtb3ZlIHRoZQogICAgcmVhZC1vbmx5IGF0dHJpYnV0ZSwgYW5kIGhvcGVmdWxseSBjb250aW51ZSB3aXRob3V0IHByb2JsZW1zLiIiIgogICAgIyBpZiBmaWxlIHR5cGUgY3VycmVudGx5IHJlYWQgb25seQogICAgaWYgb3Muc3RhdChwYXRoKS5zdF9tb2RlICYgc3RhdC5TX0lSRUFEOgogICAgICAgICMgY29udmVydCB0byByZWFkL3dyaXRlCiAgICAgICAgb3MuY2htb2QocGF0aCwgc3RhdC5TX0lXUklURSkKICAgICAgICAjIHVzZSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gdG8gcmVwZWF0IHRoZSBvcGVyYXRpb24KICAgICAgICBmdW5jKHBhdGgpCiAgICAgICAgcmV0dXJuCiAgICBlbHNlOgogICAgICAgIHJhaXNlCgoKZGVmIGRpc3BsYXlfcGF0aChwYXRoKToKICAgICIiIkdpdmVzIHRoZSBkaXNwbGF5IHZhbHVlIGZvciBhIGdpdmVuIHBhdGgsIG1ha2luZyBpdCByZWxhdGl2ZSB0byBjd2QKICAgIGlmIHBvc3NpYmxlLiIiIgogICAgcGF0aCA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5hYnNwYXRoKHBhdGgpKQogICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA9PSAyOgogICAgICAgIHBhdGggPSBwYXRoLmRlY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCksICdyZXBsYWNlJykKICAgICAgICBwYXRoID0gcGF0aC5lbmNvZGUoc3lzLmdldGRlZmF1bHRlbmNvZGluZygpLCAncmVwbGFjZScpCiAgICBpZiBwYXRoLnN0YXJ0c3dpdGgob3MuZ2V0Y3dkKCkgKyBvcy5wYXRoLnNlcCk6CiAgICAgICAgcGF0aCA9ICcuJyArIHBhdGhbbGVuKG9zLmdldGN3ZCgpKTpdCiAgICByZXR1cm4gcGF0aAoKCmRlZiBiYWNrdXBfZGlyKGRpciwgZXh0PScuYmFrJyk6CiAgICAiIiJGaWd1cmUgb3V0IHRoZSBuYW1lIG9mIGEgZGlyZWN0b3J5IHRvIGJhY2sgdXAgdGhlIGdpdmVuIGRpciB0bwogICAgKGFkZGluZyAuYmFrLCAuYmFrMiwgZXRjKSIiIgogICAgbiA9IDEKICAgIGV4dGVuc2lvbiA9IGV4dAogICAgd2hpbGUgb3MucGF0aC5leGlzdHMoZGlyICsgZXh0ZW5zaW9uKToKICAgICAgICBuICs9IDEKICAgICAgICBleHRlbnNpb24gPSBleHQgKyBzdHIobikKICAgIHJldHVybiBkaXIgKyBleHRlbnNpb24KCgpkZWYgYXNrX3BhdGhfZXhpc3RzKG1lc3NhZ2UsIG9wdGlvbnMpOgogICAgZm9yIGFjdGlvbiBpbiBvcy5lbnZpcm9uLmdldCgnUElQX0VYSVNUU19BQ1RJT04nLCAnJykuc3BsaXQoKToKICAgICAgICBpZiBhY3Rpb24gaW4gb3B0aW9uczoKICAgICAgICAgICAgcmV0dXJuIGFjdGlvbgogICAgcmV0dXJuIGFzayhtZXNzYWdlLCBvcHRpb25zKQoKCmRlZiBhc2sobWVzc2FnZSwgb3B0aW9ucyk6CiAgICAiIiJBc2sgdGhlIG1lc3NhZ2UgaW50ZXJhY3RpdmVseSwgd2l0aCB0aGUgZ2l2ZW4gcG9zc2libGUgcmVzcG9uc2VzIiIiCiAgICB3aGlsZSAxOgogICAgICAgIGlmIG9zLmVudmlyb24uZ2V0KCdQSVBfTk9fSU5QVVQnKToKICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgJ05vIGlucHV0IHdhcyBleHBlY3RlZCAoJFBJUF9OT19JTlBVVCBzZXQpOyBxdWVzdGlvbjogJXMnICUKICAgICAgICAgICAgICAgIG1lc3NhZ2UKICAgICAgICAgICAgKQogICAgICAgIHJlc3BvbnNlID0gaW5wdXQobWVzc2FnZSkKICAgICAgICByZXNwb25zZSA9IHJlc3BvbnNlLnN0cmlwKCkubG93ZXIoKQogICAgICAgIGlmIHJlc3BvbnNlIG5vdCBpbiBvcHRpb25zOgogICAgICAgICAgICBwcmludCgKICAgICAgICAgICAgICAgICdZb3VyIHJlc3BvbnNlICglcikgd2FzIG5vdCBvbmUgb2YgdGhlIGV4cGVjdGVkIHJlc3BvbnNlczogJwogICAgICAgICAgICAgICAgJyVzJyAlIChyZXNwb25zZSwgJywgJy5qb2luKG9wdGlvbnMpKQogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlCgoKZGVmIGZvcm1hdF9zaXplKGJ5dGVzKToKICAgIGlmIGJ5dGVzID4gMTAwMCAqIDEwMDA6CiAgICAgICAgcmV0dXJuICclLjFmTUInICUgKGJ5dGVzIC8gMTAwMC4wIC8gMTAwMCkKICAgIGVsaWYgYnl0ZXMgPiAxMCAqIDEwMDA6CiAgICAgICAgcmV0dXJuICclaWtCJyAlIChieXRlcyAvIDEwMDApCiAgICBlbGlmIGJ5dGVzID4gMTAwMDoKICAgICAgICByZXR1cm4gJyUuMWZrQicgJSAoYnl0ZXMgLyAxMDAwLjApCiAgICBlbHNlOgogICAgICAgIHJldHVybiAnJWlieXRlcycgJSBieXRlcwoKCmRlZiBpc19pbnN0YWxsYWJsZV9kaXIocGF0aCk6CiAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBgcGF0aGAgaXMgYSBkaXJlY3RvcnkgY29udGFpbmluZyBhIHNldHVwLnB5IGZpbGUuIiIiCiAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihwYXRoKToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHNldHVwX3B5ID0gb3MucGF0aC5qb2luKHBhdGgsICdzZXR1cC5weScpCiAgICBpZiBvcy5wYXRoLmlzZmlsZShzZXR1cF9weSk6CiAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQoKCmRlZiBpc19zdm5fcGFnZShodG1sKToKICAgICIiIgogICAgUmV0dXJucyB0cnVlIGlmIHRoZSBwYWdlIGFwcGVhcnMgdG8gYmUgdGhlIGluZGV4IHBhZ2Ugb2YgYW4gc3ZuIHJlcG9zaXRvcnkKICAgICIiIgogICAgcmV0dXJuIChyZS5zZWFyY2gocic8dGl0bGU+W148XSpSZXZpc2lvbiBcZCs6JywgaHRtbCkgYW5kCiAgICAgICAgICAgIHJlLnNlYXJjaChyJ1Bvd2VyZWQgYnkgKD86PGFbXj5dKj8+KT9TdWJ2ZXJzaW9uJywgaHRtbCwgcmUuSSkpCgoKZGVmIGZpbGVfY29udGVudHMoZmlsZW5hbWUpOgogICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAncmInKSBhcyBmcDoKICAgICAgICByZXR1cm4gZnAucmVhZCgpLmRlY29kZSgndXRmLTgnKQoKCmRlZiByZWFkX2NodW5rcyhmaWxlLCBzaXplPWlvLkRFRkFVTFRfQlVGRkVSX1NJWkUpOgogICAgIiIiWWllbGQgcGllY2VzIG9mIGRhdGEgZnJvbSBhIGZpbGUtbGlrZSBvYmplY3QgdW50aWwgRU9GLiIiIgogICAgd2hpbGUgVHJ1ZToKICAgICAgICBjaHVuayA9IGZpbGUucmVhZChzaXplKQogICAgICAgIGlmIG5vdCBjaHVuazoKICAgICAgICAgICAgYnJlYWsKICAgICAgICB5aWVsZCBjaHVuawoKCmRlZiBzcGxpdF9sZWFkaW5nX2RpcihwYXRoKToKICAgIHBhdGggPSBwYXRoLmxzdHJpcCgnLycpLmxzdHJpcCgnXFwnKQogICAgaWYgJy8nIGluIHBhdGggYW5kICgoJ1xcJyBpbiBwYXRoIGFuZCBwYXRoLmZpbmQoJy8nKSA8IHBhdGguZmluZCgnXFwnKSkgb3IKICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJyBub3QgaW4gcGF0aCk6CiAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoJy8nLCAxKQogICAgZWxpZiAnXFwnIGluIHBhdGg6CiAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoJ1xcJywgMSkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHBhdGgsICcnCgoKZGVmIGhhc19sZWFkaW5nX2RpcihwYXRocyk6CiAgICAiIiJSZXR1cm5zIHRydWUgaWYgYWxsIHRoZSBwYXRocyBoYXZlIHRoZSBzYW1lIGxlYWRpbmcgcGF0aCBuYW1lCiAgICAoaS5lLiwgZXZlcnl0aGluZyBpcyBpbiBvbmUgc3ViZGlyZWN0b3J5IGluIGFuIGFyY2hpdmUpIiIiCiAgICBjb21tb25fcHJlZml4ID0gTm9uZQogICAgZm9yIHBhdGggaW4gcGF0aHM6CiAgICAgICAgcHJlZml4LCByZXN0ID0gc3BsaXRfbGVhZGluZ19kaXIocGF0aCkKICAgICAgICBpZiBub3QgcHJlZml4OgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBlbGlmIGNvbW1vbl9wcmVmaXggaXMgTm9uZToKICAgICAgICAgICAgY29tbW9uX3ByZWZpeCA9IHByZWZpeAogICAgICAgIGVsaWYgcHJlZml4ICE9IGNvbW1vbl9wcmVmaXg6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIFRydWUKCgpkZWYgbm9ybWFsaXplX3BhdGgocGF0aCwgcmVzb2x2ZV9zeW1saW5rcz1UcnVlKToKICAgICIiIgogICAgQ29udmVydCBhIHBhdGggdG8gaXRzIGNhbm9uaWNhbCwgY2FzZS1ub3JtYWxpemVkLCBhYnNvbHV0ZSB2ZXJzaW9uLgoKICAgICIiIgogICAgcGF0aCA9IGV4cGFuZHVzZXIocGF0aCkKICAgIGlmIHJlc29sdmVfc3ltbGlua3M6CiAgICAgICAgcGF0aCA9IG9zLnBhdGgucmVhbHBhdGgocGF0aCkKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguYWJzcGF0aChwYXRoKQogICAgcmV0dXJuIG9zLnBhdGgubm9ybWNhc2UocGF0aCkKCgpkZWYgc3BsaXRleHQocGF0aCk6CiAgICAiIiJMaWtlIG9zLnBhdGguc3BsaXRleHQsIGJ1dCB0YWtlIG9mZiAudGFyIHRvbyIiIgogICAgYmFzZSwgZXh0ID0gcG9zaXhwYXRoLnNwbGl0ZXh0KHBhdGgpCiAgICBpZiBiYXNlLmxvd2VyKCkuZW5kc3dpdGgoJy50YXInKToKICAgICAgICBleHQgPSBiYXNlWy00Ol0gKyBleHQKICAgICAgICBiYXNlID0gYmFzZVs6LTRdCiAgICByZXR1cm4gYmFzZSwgZXh0CgoKZGVmIHJlbmFtZXMob2xkLCBuZXcpOgogICAgIiIiTGlrZSBvcy5yZW5hbWVzKCksIGJ1dCBoYW5kbGVzIHJlbmFtaW5nIGFjcm9zcyBkZXZpY2VzLiIiIgogICAgIyBJbXBsZW1lbnRhdGlvbiBib3Jyb3dlZCBmcm9tIG9zLnJlbmFtZXMoKS4KICAgIGhlYWQsIHRhaWwgPSBvcy5wYXRoLnNwbGl0KG5ldykKICAgIGlmIGhlYWQgYW5kIHRhaWwgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhoZWFkKToKICAgICAgICBvcy5tYWtlZGlycyhoZWFkKQoKICAgIHNodXRpbC5tb3ZlKG9sZCwgbmV3KQoKICAgIGhlYWQsIHRhaWwgPSBvcy5wYXRoLnNwbGl0KG9sZCkKICAgIGlmIGhlYWQgYW5kIHRhaWw6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcy5yZW1vdmVkaXJzKGhlYWQpCiAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCgpkZWYgaXNfbG9jYWwocGF0aCk6CiAgICAiIiIKICAgIFJldHVybiBUcnVlIGlmIHBhdGggaXMgd2l0aGluIHN5cy5wcmVmaXgsIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aXJ0dWFsZW52LgoKICAgIElmIHdlJ3JlIG5vdCBpbiBhIHZpcnR1YWxlbnYsIGFsbCBwYXRocyBhcmUgY29uc2lkZXJlZCAibG9jYWwuIgoKICAgICIiIgogICAgaWYgbm90IHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudigpOgogICAgICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gbm9ybWFsaXplX3BhdGgocGF0aCkuc3RhcnRzd2l0aChub3JtYWxpemVfcGF0aChzeXMucHJlZml4KSkKCgpkZWYgZGlzdF9pc19sb2NhbChkaXN0KToKICAgICIiIgogICAgUmV0dXJuIFRydWUgaWYgZ2l2ZW4gRGlzdHJpYnV0aW9uIG9iamVjdCBpcyBpbnN0YWxsZWQgbG9jYWxseQogICAgKGkuZS4gd2l0aGluIGN1cnJlbnQgdmlydHVhbGVudikuCgogICAgQWx3YXlzIFRydWUgaWYgd2UncmUgbm90IGluIGEgdmlydHVhbGVudi4KCiAgICAiIiIKICAgIHJldHVybiBpc19sb2NhbChkaXN0X2xvY2F0aW9uKGRpc3QpKQoKCmRlZiBkaXN0X2luX3VzZXJzaXRlKGRpc3QpOgogICAgIiIiCiAgICBSZXR1cm4gVHJ1ZSBpZiBnaXZlbiBEaXN0cmlidXRpb24gaXMgaW5zdGFsbGVkIGluIHVzZXIgc2l0ZS4KICAgICIiIgogICAgbm9ybV9wYXRoID0gbm9ybWFsaXplX3BhdGgoZGlzdF9sb2NhdGlvbihkaXN0KSkKICAgIHJldHVybiBub3JtX3BhdGguc3RhcnRzd2l0aChub3JtYWxpemVfcGF0aCh1c2VyX3NpdGUpKQoKCmRlZiBkaXN0X2luX3NpdGVfcGFja2FnZXMoZGlzdCk6CiAgICAiIiIKICAgIFJldHVybiBUcnVlIGlmIGdpdmVuIERpc3RyaWJ1dGlvbiBpcyBpbnN0YWxsZWQgaW4KICAgIGRpc3R1dGlscy5zeXNjb25maWcuZ2V0X3B5dGhvbl9saWIoKS4KICAgICIiIgogICAgcmV0dXJuIG5vcm1hbGl6ZV9wYXRoKAogICAgICAgIGRpc3RfbG9jYXRpb24oZGlzdCkKICAgICkuc3RhcnRzd2l0aChub3JtYWxpemVfcGF0aChzaXRlX3BhY2thZ2VzKSkKCgpkZWYgZGlzdF9pc19lZGl0YWJsZShkaXN0KToKICAgICIiIklzIGRpc3RyaWJ1dGlvbiBhbiBlZGl0YWJsZSBpbnN0YWxsPyIiIgogICAgZm9yIHBhdGhfaXRlbSBpbiBzeXMucGF0aDoKICAgICAgICBlZ2dfbGluayA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIGRpc3QucHJvamVjdF9uYW1lICsgJy5lZ2ctbGluaycpCiAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZWdnX2xpbmspOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlCgoKZGVmIGdldF9pbnN0YWxsZWRfZGlzdHJpYnV0aW9ucyhsb2NhbF9vbmx5PVRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcD1zdGRsaWJfcGtncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2VkaXRhYmxlcz1UcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlc19vbmx5PUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfb25seT1GYWxzZSk6CiAgICAiIiIKICAgIFJldHVybiBhIGxpc3Qgb2YgaW5zdGFsbGVkIERpc3RyaWJ1dGlvbiBvYmplY3RzLgoKICAgIElmIGBgbG9jYWxfb25seWBgIGlzIFRydWUgKGRlZmF1bHQpLCBvbmx5IHJldHVybiBpbnN0YWxsYXRpb25zCiAgICBsb2NhbCB0byB0aGUgY3VycmVudCB2aXJ0dWFsZW52LCBpZiBpbiBhIHZpcnR1YWxlbnYuCgogICAgYGBza2lwYGAgYXJndW1lbnQgaXMgYW4gaXRlcmFibGUgb2YgbG93ZXItY2FzZSBwcm9qZWN0IG5hbWVzIHRvCiAgICBpZ25vcmU7IGRlZmF1bHRzIHRvIHN0ZGxpYl9wa2dzCgogICAgSWYgYGBlZGl0YWJsZXNgYCBpcyBGYWxzZSwgZG9uJ3QgcmVwb3J0IGVkaXRhYmxlcy4KCiAgICBJZiBgYGVkaXRhYmxlc19vbmx5YGAgaXMgVHJ1ZSAsIG9ubHkgcmVwb3J0IGVkaXRhYmxlcy4KCiAgICBJZiBgYHVzZXJfb25seWBgIGlzIFRydWUgLCBvbmx5IHJlcG9ydCBpbnN0YWxsYXRpb25zIGluIHRoZSB1c2VyCiAgICBzaXRlIGRpcmVjdG9yeS4KCiAgICAiIiIKICAgIGlmIGxvY2FsX29ubHk6CiAgICAgICAgbG9jYWxfdGVzdCA9IGRpc3RfaXNfbG9jYWwKICAgIGVsc2U6CiAgICAgICAgZGVmIGxvY2FsX3Rlc3QoZCk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgaWYgaW5jbHVkZV9lZGl0YWJsZXM6CiAgICAgICAgZGVmIGVkaXRhYmxlX3Rlc3QoZCk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICBlbHNlOgogICAgICAgIGRlZiBlZGl0YWJsZV90ZXN0KGQpOgogICAgICAgICAgICByZXR1cm4gbm90IGRpc3RfaXNfZWRpdGFibGUoZCkKCiAgICBpZiBlZGl0YWJsZXNfb25seToKICAgICAgICBkZWYgZWRpdGFibGVzX29ubHlfdGVzdChkKToKICAgICAgICAgICAgcmV0dXJuIGRpc3RfaXNfZWRpdGFibGUoZCkKICAgIGVsc2U6CiAgICAgICAgZGVmIGVkaXRhYmxlc19vbmx5X3Rlc3QoZCk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgaWYgdXNlcl9vbmx5OgogICAgICAgIHVzZXJfdGVzdCA9IGRpc3RfaW5fdXNlcnNpdGUKICAgIGVsc2U6CiAgICAgICAgZGVmIHVzZXJfdGVzdChkKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICByZXR1cm4gW2QgZm9yIGQgaW4gcGtnX3Jlc291cmNlcy53b3JraW5nX3NldAogICAgICAgICAgICBpZiBsb2NhbF90ZXN0KGQpIGFuZAogICAgICAgICAgICBkLmtleSBub3QgaW4gc2tpcCBhbmQKICAgICAgICAgICAgZWRpdGFibGVfdGVzdChkKSBhbmQKICAgICAgICAgICAgZWRpdGFibGVzX29ubHlfdGVzdChkKSBhbmQKICAgICAgICAgICAgdXNlcl90ZXN0KGQpCiAgICAgICAgICAgIF0KCgpkZWYgZWdnX2xpbmtfcGF0aChkaXN0KToKICAgICIiIgogICAgUmV0dXJuIHRoZSBwYXRoIGZvciB0aGUgLmVnZy1saW5rIGZpbGUgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UsIE5vbmUuCgogICAgVGhlcmUncyAzIHNjZW5hcmlvczoKICAgIDEpIG5vdCBpbiBhIHZpcnR1YWxlbnYKICAgICAgIHRyeSB0byBmaW5kIGluIHNpdGUuVVNFUl9TSVRFLCB0aGVuIHNpdGVfcGFja2FnZXMKICAgIDIpIGluIGEgbm8tZ2xvYmFsIHZpcnR1YWxlbnYKICAgICAgIHRyeSB0byBmaW5kIGluIHNpdGVfcGFja2FnZXMKICAgIDMpIGluIGEgeWVzLWdsb2JhbCB2aXJ0dWFsZW52CiAgICAgICB0cnkgdG8gZmluZCBpbiBzaXRlX3BhY2thZ2VzLCB0aGVuIHNpdGUuVVNFUl9TSVRFCiAgICAgICAoZG9uJ3QgbG9vayBpbiBnbG9iYWwgbG9jYXRpb24pCgogICAgRm9yICMxIGFuZCAjMywgdGhlcmUgY291bGQgYmUgb2RkIGNhc2VzLCB3aGVyZSB0aGVyZSdzIGFuIGVnZy1saW5rIGluIDIKICAgIGxvY2F0aW9ucy4KCiAgICBUaGlzIG1ldGhvZCB3aWxsIGp1c3QgcmV0dXJuIHRoZSBmaXJzdCBvbmUgZm91bmQuCiAgICAiIiIKICAgIHNpdGVzID0gW10KICAgIGlmIHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudigpOgogICAgICAgIGlmIHZpcnR1YWxlbnZfbm9fZ2xvYmFsKCk6CiAgICAgICAgICAgIHNpdGVzLmFwcGVuZChzaXRlX3BhY2thZ2VzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNpdGVzLmFwcGVuZChzaXRlX3BhY2thZ2VzKQogICAgICAgICAgICBpZiB1c2VyX3NpdGU6CiAgICAgICAgICAgICAgICBzaXRlcy5hcHBlbmQodXNlcl9zaXRlKQogICAgZWxzZToKICAgICAgICBpZiB1c2VyX3NpdGU6CiAgICAgICAgICAgIHNpdGVzLmFwcGVuZCh1c2VyX3NpdGUpCiAgICAgICAgc2l0ZXMuYXBwZW5kKHNpdGVfcGFja2FnZXMpCgogICAgZm9yIHNpdGUgaW4gc2l0ZXM6CiAgICAgICAgZWdnbGluayA9IG9zLnBhdGguam9pbihzaXRlLCBkaXN0LnByb2plY3RfbmFtZSkgKyAnLmVnZy1saW5rJwogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGVnZ2xpbmspOgogICAgICAgICAgICByZXR1cm4gZWdnbGluawoKCmRlZiBkaXN0X2xvY2F0aW9uKGRpc3QpOgogICAgIiIiCiAgICBHZXQgdGhlIHNpdGUtcGFja2FnZXMgbG9jYXRpb24gb2YgdGhpcyBkaXN0cmlidXRpb24uIEdlbmVyYWxseQogICAgdGhpcyBpcyBkaXN0LmxvY2F0aW9uLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2YgZGV2ZWxvcC1pbnN0YWxsZWQKICAgIHBhY2thZ2VzLCB3aGVyZSBkaXN0LmxvY2F0aW9uIGlzIHRoZSBzb3VyY2UgY29kZSBsb2NhdGlvbiwgYW5kIHdlCiAgICB3YW50IHRvIGtub3cgd2hlcmUgdGhlIGVnZy1saW5rIGZpbGUgaXMuCgogICAgIiIiCiAgICBlZ2dfbGluayA9IGVnZ19saW5rX3BhdGgoZGlzdCkKICAgIGlmIGVnZ19saW5rOgogICAgICAgIHJldHVybiBlZ2dfbGluawogICAgcmV0dXJuIGRpc3QubG9jYXRpb24KCgpkZWYgZ2V0X3Rlcm1pbmFsX3NpemUoKToKICAgICIiIlJldHVybnMgYSB0dXBsZSAoeCwgeSkgcmVwcmVzZW50aW5nIHRoZSB3aWR0aCh4KSBhbmQgdGhlIGhlaWdodCh4KQogICAgaW4gY2hhcmFjdGVycyBvZiB0aGUgdGVybWluYWwgd2luZG93LiIiIgogICAgZGVmIGlvY3RsX0dXSU5TWihmZCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBpbXBvcnQgZmNudGwKICAgICAgICAgICAgaW1wb3J0IHRlcm1pb3MKICAgICAgICAgICAgaW1wb3J0IHN0cnVjdAogICAgICAgICAgICBjciA9IHN0cnVjdC51bnBhY2soCiAgICAgICAgICAgICAgICAnaGgnLAogICAgICAgICAgICAgICAgZmNudGwuaW9jdGwoZmQsIHRlcm1pb3MuVElPQ0dXSU5TWiwgJzEyMzQnKQogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGlmIGNyID09ICgwLCAwKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gY3IKICAgIGNyID0gaW9jdGxfR1dJTlNaKDApIG9yIGlvY3RsX0dXSU5TWigxKSBvciBpb2N0bF9HV0lOU1ooMikKICAgIGlmIG5vdCBjcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZkID0gb3Mub3Blbihvcy5jdGVybWlkKCksIG9zLk9fUkRPTkxZKQogICAgICAgICAgICBjciA9IGlvY3RsX0dXSU5TWihmZCkKICAgICAgICAgICAgb3MuY2xvc2UoZmQpCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBwYXNzCiAgICBpZiBub3QgY3I6CiAgICAgICAgY3IgPSAob3MuZW52aXJvbi5nZXQoJ0xJTkVTJywgMjUpLCBvcy5lbnZpcm9uLmdldCgnQ09MVU1OUycsIDgwKSkKICAgIHJldHVybiBpbnQoY3JbMV0pLCBpbnQoY3JbMF0pCgoKZGVmIGN1cnJlbnRfdW1hc2soKToKICAgICIiIkdldCB0aGUgY3VycmVudCB1bWFzayB3aGljaCBpbnZvbHZlcyBoYXZpbmcgdG8gc2V0IGl0IHRlbXBvcmFyaWx5LiIiIgogICAgbWFzayA9IG9zLnVtYXNrKDApCiAgICBvcy51bWFzayhtYXNrKQogICAgcmV0dXJuIG1hc2sKCgpkZWYgdW56aXBfZmlsZShmaWxlbmFtZSwgbG9jYXRpb24sIGZsYXR0ZW49VHJ1ZSk6CiAgICAiIiIKICAgIFVuemlwIHRoZSBmaWxlICh3aXRoIHBhdGggYGZpbGVuYW1lYCkgdG8gdGhlIGRlc3RpbmF0aW9uIGBsb2NhdGlvbmAuICBBbGwKICAgIGZpbGVzIGFyZSB3cml0dGVuIGJhc2VkIG9uIHN5c3RlbSBkZWZhdWx0cyBhbmQgdW1hc2sgKGkuZS4gcGVybWlzc2lvbnMgYXJlCiAgICBub3QgcHJlc2VydmVkKSwgZXhjZXB0IHRoYXQgcmVndWxhciBmaWxlIG1lbWJlcnMgd2l0aCBhbnkgZXhlY3V0ZQogICAgcGVybWlzc2lvbnMgKHVzZXIsIGdyb3VwLCBvciB3b3JsZCkgaGF2ZSAiY2htb2QgK3giIGFwcGxpZWQgYWZ0ZXIgYmVpbmcKICAgIHdyaXR0ZW4uIE5vdGUgdGhhdCBmb3Igd2luZG93cywgYW55IGV4ZWN1dGUgY2hhbmdlcyB1c2luZyBvcy5jaG1vZCBhcmUKICAgIG5vLW9wcyBwZXIgdGhlIHB5dGhvbiBkb2NzLgogICAgIiIiCiAgICBlbnN1cmVfZGlyKGxvY2F0aW9uKQogICAgemlwZnAgPSBvcGVuKGZpbGVuYW1lLCAncmInKQogICAgdHJ5OgogICAgICAgIHppcCA9IHppcGZpbGUuWmlwRmlsZSh6aXBmcCwgYWxsb3daaXA2ND1UcnVlKQogICAgICAgIGxlYWRpbmcgPSBoYXNfbGVhZGluZ19kaXIoemlwLm5hbWVsaXN0KCkpIGFuZCBmbGF0dGVuCiAgICAgICAgZm9yIGluZm8gaW4gemlwLmluZm9saXN0KCk6CiAgICAgICAgICAgIG5hbWUgPSBpbmZvLmZpbGVuYW1lCiAgICAgICAgICAgIGRhdGEgPSB6aXAucmVhZChuYW1lKQogICAgICAgICAgICBmbiA9IG5hbWUKICAgICAgICAgICAgaWYgbGVhZGluZzoKICAgICAgICAgICAgICAgIGZuID0gc3BsaXRfbGVhZGluZ19kaXIobmFtZSlbMV0KICAgICAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4obG9jYXRpb24sIGZuKQogICAgICAgICAgICBkaXIgPSBvcy5wYXRoLmRpcm5hbWUoZm4pCiAgICAgICAgICAgIGlmIGZuLmVuZHN3aXRoKCcvJykgb3IgZm4uZW5kc3dpdGgoJ1xcJyk6CiAgICAgICAgICAgICAgICAjIEEgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyKGZuKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZW5zdXJlX2RpcihkaXIpCiAgICAgICAgICAgICAgICBmcCA9IG9wZW4oZm4sICd3YicpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgZnAud3JpdGUoZGF0YSkKICAgICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQogICAgICAgICAgICAgICAgICAgIG1vZGUgPSBpbmZvLmV4dGVybmFsX2F0dHIgPj4gMTYKICAgICAgICAgICAgICAgICAgICAjIGlmIG1vZGUgYW5kIHJlZ3VsYXIgZmlsZSBhbmQgYW55IGV4ZWN1dGUgcGVybWlzc2lvbnMgZm9yCiAgICAgICAgICAgICAgICAgICAgIyB1c2VyL2dyb3VwL3dvcmxkPwogICAgICAgICAgICAgICAgICAgIGlmIG1vZGUgYW5kIHN0YXQuU19JU1JFRyhtb2RlKSBhbmQgbW9kZSAmIDBvMTExOgogICAgICAgICAgICAgICAgICAgICAgICAjIG1ha2UgZGVzdCBmaWxlIGhhdmUgZXhlY3V0ZSBmb3IgdXNlci9ncm91cC93b3JsZAogICAgICAgICAgICAgICAgICAgICAgICAjIChjaG1vZCAreCkgbm8tb3Agb24gd2luZG93cyBwZXIgcHl0aG9uIGRvY3MKICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2htb2QoZm4sICgwbzc3NyAtIGN1cnJlbnRfdW1hc2soKSB8IDBvMTExKSkKICAgIGZpbmFsbHk6CiAgICAgICAgemlwZnAuY2xvc2UoKQoKCmRlZiB1bnRhcl9maWxlKGZpbGVuYW1lLCBsb2NhdGlvbik6CiAgICAiIiIKICAgIFVudGFyIHRoZSBmaWxlICh3aXRoIHBhdGggYGZpbGVuYW1lYCkgdG8gdGhlIGRlc3RpbmF0aW9uIGBsb2NhdGlvbmAuCiAgICBBbGwgZmlsZXMgYXJlIHdyaXR0ZW4gYmFzZWQgb24gc3lzdGVtIGRlZmF1bHRzIGFuZCB1bWFzayAoaS5lLiBwZXJtaXNzaW9ucwogICAgYXJlIG5vdCBwcmVzZXJ2ZWQpLCBleGNlcHQgdGhhdCByZWd1bGFyIGZpbGUgbWVtYmVycyB3aXRoIGFueSBleGVjdXRlCiAgICBwZXJtaXNzaW9ucyAodXNlciwgZ3JvdXAsIG9yIHdvcmxkKSBoYXZlICJjaG1vZCAreCIgYXBwbGllZCBhZnRlciBiZWluZwogICAgd3JpdHRlbi4gIE5vdGUgdGhhdCBmb3Igd2luZG93cywgYW55IGV4ZWN1dGUgY2hhbmdlcyB1c2luZyBvcy5jaG1vZCBhcmUKICAgIG5vLW9wcyBwZXIgdGhlIHB5dGhvbiBkb2NzLgogICAgIiIiCiAgICBlbnN1cmVfZGlyKGxvY2F0aW9uKQogICAgaWYgZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLmd6Jykgb3IgZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLnRneicpOgogICAgICAgIG1vZGUgPSAncjpneicKICAgIGVsaWYgZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aChCWjJfRVhURU5TSU9OUyk6CiAgICAgICAgbW9kZSA9ICdyOmJ6MicKICAgIGVsaWYgZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aChYWl9FWFRFTlNJT05TKToKICAgICAgICBtb2RlID0gJ3I6eHonCiAgICBlbGlmIGZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoJy50YXInKToKICAgICAgICBtb2RlID0gJ3InCiAgICBlbHNlOgogICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAnQ2Fubm90IGRldGVybWluZSBjb21wcmVzc2lvbiB0eXBlIGZvciBmaWxlICVzJywgZmlsZW5hbWUsCiAgICAgICAgKQogICAgICAgIG1vZGUgPSAncjoqJwogICAgdGFyID0gdGFyZmlsZS5vcGVuKGZpbGVuYW1lLCBtb2RlKQogICAgdHJ5OgogICAgICAgICMgbm90ZTogcHl0aG9uPD0yLjUgZG9lc24ndCBzZWVtIHRvIGtub3cgYWJvdXQgcGF4IGhlYWRlcnMsIGZpbHRlciB0aGVtCiAgICAgICAgbGVhZGluZyA9IGhhc19sZWFkaW5nX2RpcihbCiAgICAgICAgICAgIG1lbWJlci5uYW1lIGZvciBtZW1iZXIgaW4gdGFyLmdldG1lbWJlcnMoKQogICAgICAgICAgICBpZiBtZW1iZXIubmFtZSAhPSAncGF4X2dsb2JhbF9oZWFkZXInCiAgICAgICAgXSkKICAgICAgICBmb3IgbWVtYmVyIGluIHRhci5nZXRtZW1iZXJzKCk6CiAgICAgICAgICAgIGZuID0gbWVtYmVyLm5hbWUKICAgICAgICAgICAgaWYgZm4gPT0gJ3BheF9nbG9iYWxfaGVhZGVyJzoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGxlYWRpbmc6CiAgICAgICAgICAgICAgICBmbiA9IHNwbGl0X2xlYWRpbmdfZGlyKGZuKVsxXQogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGxvY2F0aW9uLCBmbikKICAgICAgICAgICAgaWYgbWVtYmVyLmlzZGlyKCk6CiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyKHBhdGgpCiAgICAgICAgICAgIGVsaWYgbWVtYmVyLmlzc3ltKCk6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgdGFyLl9leHRyYWN0X21lbWJlcihtZW1iZXIsIHBhdGgpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgICAgICAgICAjIFNvbWUgY29ycnVwdCB0YXIgZmlsZXMgc2VlbSB0byBwcm9kdWNlIHRoaXMKICAgICAgICAgICAgICAgICAgICAjIChzcGVjaWZpY2FsbHkgYmFkIHN5bWxpbmtzKQogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAnSW4gdGhlIHRhciBmaWxlICVzIHRoZSBtZW1iZXIgJXMgaXMgaW52YWxpZDogJXMnLAogICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbWVtYmVyLm5hbWUsIGV4YywKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBmcCA9IHRhci5leHRyYWN0ZmlsZShtZW1iZXIpCiAgICAgICAgICAgICAgICBleGNlcHQgKEtleUVycm9yLCBBdHRyaWJ1dGVFcnJvcikgYXMgZXhjOgogICAgICAgICAgICAgICAgICAgICMgU29tZSBjb3JydXB0IHRhciBmaWxlcyBzZWVtIHRvIHByb2R1Y2UgdGhpcwogICAgICAgICAgICAgICAgICAgICMgKHNwZWNpZmljYWxseSBiYWQgc3ltbGlua3MpCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICdJbiB0aGUgdGFyIGZpbGUgJXMgdGhlIG1lbWJlciAlcyBpcyBpbnZhbGlkOiAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBtZW1iZXIubmFtZSwgZXhjLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZW5zdXJlX2Rpcihvcy5wYXRoLmRpcm5hbWUocGF0aCkpCiAgICAgICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3diJykgYXMgZGVzdGZwOgogICAgICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZW9iaihmcCwgZGVzdGZwKQogICAgICAgICAgICAgICAgZnAuY2xvc2UoKQogICAgICAgICAgICAgICAgIyBVcGRhdGUgdGhlIHRpbWVzdGFtcCAodXNlZnVsIGZvciBjeXRob24gY29tcGlsZWQgZmlsZXMpCiAgICAgICAgICAgICAgICB0YXIudXRpbWUobWVtYmVyLCBwYXRoKQogICAgICAgICAgICAgICAgIyBtZW1iZXIgaGF2ZSBhbnkgZXhlY3V0ZSBwZXJtaXNzaW9ucyBmb3IgdXNlci9ncm91cC93b3JsZD8KICAgICAgICAgICAgICAgIGlmIG1lbWJlci5tb2RlICYgMG8xMTE6CiAgICAgICAgICAgICAgICAgICAgIyBtYWtlIGRlc3QgZmlsZSBoYXZlIGV4ZWN1dGUgZm9yIHVzZXIvZ3JvdXAvd29ybGQKICAgICAgICAgICAgICAgICAgICAjIG5vLW9wIG9uIHdpbmRvd3MgcGVyIHB5dGhvbiBkb2NzCiAgICAgICAgICAgICAgICAgICAgb3MuY2htb2QocGF0aCwgKDBvNzc3IC0gY3VycmVudF91bWFzaygpIHwgMG8xMTEpKQogICAgZmluYWxseToKICAgICAgICB0YXIuY2xvc2UoKQoKCmRlZiB1bnBhY2tfZmlsZShmaWxlbmFtZSwgbG9jYXRpb24sIGNvbnRlbnRfdHlwZSwgbGluayk6CiAgICBmaWxlbmFtZSA9IG9zLnBhdGgucmVhbHBhdGgoZmlsZW5hbWUpCiAgICBpZiAoY29udGVudF90eXBlID09ICdhcHBsaWNhdGlvbi96aXAnIG9yCiAgICAgICAgICAgIGZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoWklQX0VYVEVOU0lPTlMpIG9yCiAgICAgICAgICAgIHppcGZpbGUuaXNfemlwZmlsZShmaWxlbmFtZSkpOgogICAgICAgIHVuemlwX2ZpbGUoCiAgICAgICAgICAgIGZpbGVuYW1lLAogICAgICAgICAgICBsb2NhdGlvbiwKICAgICAgICAgICAgZmxhdHRlbj1ub3QgZmlsZW5hbWUuZW5kc3dpdGgoJy53aGwnKQogICAgICAgICkKICAgIGVsaWYgKGNvbnRlbnRfdHlwZSA9PSAnYXBwbGljYXRpb24veC1nemlwJyBvcgogICAgICAgICAgICB0YXJmaWxlLmlzX3RhcmZpbGUoZmlsZW5hbWUpIG9yCiAgICAgICAgICAgIGZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoCiAgICAgICAgICAgICAgICBUQVJfRVhURU5TSU9OUyArIEJaMl9FWFRFTlNJT05TICsgWFpfRVhURU5TSU9OUykpOgogICAgICAgIHVudGFyX2ZpbGUoZmlsZW5hbWUsIGxvY2F0aW9uKQogICAgZWxpZiAoY29udGVudF90eXBlIGFuZCBjb250ZW50X3R5cGUuc3RhcnRzd2l0aCgndGV4dC9odG1sJykgYW5kCiAgICAgICAgICAgIGlzX3N2bl9wYWdlKGZpbGVfY29udGVudHMoZmlsZW5hbWUpKSk6CiAgICAgICAgIyBXZSBkb24ndCByZWFsbHkgY2FyZSBhYm91dCB0aGlzCiAgICAgICAgZnJvbSBwaXAudmNzLnN1YnZlcnNpb24gaW1wb3J0IFN1YnZlcnNpb24KICAgICAgICBTdWJ2ZXJzaW9uKCdzdm4rJyArIGxpbmsudXJsKS51bnBhY2sobG9jYXRpb24pCiAgICBlbHNlOgogICAgICAgICMgRklYTUU6IGhhbmRsZT8KICAgICAgICAjIEZJWE1FOiBtYWdpYyBzaWduYXR1cmVzPwogICAgICAgIGxvZ2dlci5jcml0aWNhbCgKICAgICAgICAgICAgJ0Nhbm5vdCB1bnBhY2sgZmlsZSAlcyAoZG93bmxvYWRlZCBmcm9tICVzLCBjb250ZW50LXR5cGU6ICVzKTsgJwogICAgICAgICAgICAnY2Fubm90IGRldGVjdCBhcmNoaXZlIGZvcm1hdCcsCiAgICAgICAgICAgIGZpbGVuYW1lLCBsb2NhdGlvbiwgY29udGVudF90eXBlLAogICAgICAgICkKICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgJ0Nhbm5vdCBkZXRlcm1pbmUgYXJjaGl2ZSBmb3JtYXQgb2YgJXMnICUgbG9jYXRpb24KICAgICAgICApCgoKZGVmIGNhbGxfc3VicHJvY2VzcyhjbWQsIHNob3dfc3Rkb3V0PVRydWUsIGN3ZD1Ob25lLAogICAgICAgICAgICAgICAgICAgIG9uX3JldHVybmNvZGU9J3JhaXNlJywKICAgICAgICAgICAgICAgICAgICBjb21tYW5kX2Rlc2M9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBleHRyYV9lbnZpcm9uPU5vbmUsIHNwaW5uZXI9Tm9uZSk6CiAgICAjIFRoaXMgZnVuY3Rpb24ncyBoYW5kbGluZyBvZiBzdWJwcm9jZXNzIG91dHB1dCBpcyBjb25mdXNpbmcgYW5kIEkKICAgICMgcHJldmlvdXNseSBicm9rZSBpdCB0ZXJyaWJseSwgc28gYXMgcGVuYW5jZSBJIHdpbGwgd3JpdGUgYSBsb25nIGNvbW1lbnQKICAgICMgZXhwbGFpbmluZyB0aGluZ3MuCiAgICAjCiAgICAjIFRoZSBvYnZpb3VzIHRoaW5nIHRoYXQgYWZmZWN0cyBvdXRwdXQgaXMgdGhlIHNob3dfc3Rkb3V0PQogICAgIyBrd2FyZy4gc2hvd19zdGRvdXQ9VHJ1ZSBtZWFucywgbGV0IHRoZSBzdWJwcm9jZXNzIHdyaXRlIGRpcmVjdGx5IHRvIG91cgogICAgIyBzdGRvdXQuIEV2ZW4gdGhvdWdoIGl0IGlzIG5vbWluYWxseSB0aGUgZGVmYXVsdCwgaXQgaXMgYWxtb3N0IG5ldmVyIHVzZWQKICAgICMgaW5zaWRlIHBpcCAoYW5kIHNob3VsZCBub3QgYmUgdXNlZCBpbiBuZXcgY29kZSB3aXRob3V0IGEgdmVyeSBnb29kCiAgICAjIHJlYXNvbik7IGFzIG9mIDIwMTYtMDItMjIgaXQgaXMgb25seSB1c2VkIGluIGEgZmV3IHBsYWNlcyBpbnNpZGUgdGhlIFZDUwogICAgIyB3cmFwcGVyIGNvZGUuIElkZWFsbHkgd2Ugc2hvdWxkIGdldCByaWQgb2YgaXQgZW50aXJlbHksIGJlY2F1c2UgaXQKICAgICMgY3JlYXRlcyBhIGxvdCBvZiBjb21wbGV4aXR5IGhlcmUgZm9yIGEgcmFyZWx5IHVzZWQgZmVhdHVyZS4KICAgICMKICAgICMgTW9zdCBwbGFjZXMgaW4gcGlwIHNldCBzaG93X3N0ZG91dD1GYWxzZS4gV2hhdCB0aGlzIG1lYW5zIGlzOgogICAgIyAtIFdlIGNvbm5lY3QgdGhlIGNoaWxkIHN0ZG91dCB0byBhIHBpcGUsIHdoaWNoIHdlIHJlYWQuCiAgICAjIC0gQnkgZGVmYXVsdCwgd2UgaGlkZSB0aGUgb3V0cHV0IGJ1dCBzaG93IGEgc3Bpbm5lciAtLSB1bmxlc3MgdGhlCiAgICAjICAgc3VicHJvY2VzcyBleGl0cyB3aXRoIGFuIGVycm9yLCBpbiB3aGljaCBjYXNlIHdlIHNob3cgdGhlIG91dHB1dC4KICAgICMgLSBJZiB0aGUgLS12ZXJib3NlIG9wdGlvbiB3YXMgcGFzc2VkICg9IGxvZ2xldmVsIGlzIERFQlVHKSwgdGhlbiB3ZSBzaG93CiAgICAjICAgdGhlIG91dHB1dCB1bmNvbmRpdGlvbmFsbHkuIChCdXQgaW4gdGhpcyBjYXNlIHdlIGRvbid0IHdhbnQgdG8gc2hvdwogICAgIyAgIHRoZSBvdXRwdXQgYSBzZWNvbmQgdGltZSBpZiBpdCB0dXJucyBvdXQgdGhhdCB0aGVyZSB3YXMgYW4gZXJyb3IuKQogICAgIwogICAgIyBzdGRlcnIgaXMgYWx3YXlzIG1lcmdlZCB3aXRoIHN0ZG91dCAoZXZlbiBpZiBzaG93X3N0ZG91dD1UcnVlKS4KICAgIGlmIHNob3dfc3Rkb3V0OgogICAgICAgIHN0ZG91dCA9IE5vbmUKICAgIGVsc2U6CiAgICAgICAgc3Rkb3V0ID0gc3VicHJvY2Vzcy5QSVBFCiAgICBpZiBjb21tYW5kX2Rlc2MgaXMgTm9uZToKICAgICAgICBjbWRfcGFydHMgPSBbXQogICAgICAgIGZvciBwYXJ0IGluIGNtZDoKICAgICAgICAgICAgaWYgJyAnIGluIHBhcnQgb3IgJ1xuJyBpbiBwYXJ0IG9yICciJyBpbiBwYXJ0IG9yICInIiBpbiBwYXJ0OgogICAgICAgICAgICAgICAgcGFydCA9ICciJXMiJyAlIHBhcnQucmVwbGFjZSgnIicsICdcXCInKQogICAgICAgICAgICBjbWRfcGFydHMuYXBwZW5kKHBhcnQpCiAgICAgICAgY29tbWFuZF9kZXNjID0gJyAnLmpvaW4oY21kX3BhcnRzKQogICAgbG9nZ2VyLmRlYnVnKCJSdW5uaW5nIGNvbW1hbmQgJXMiLCBjb21tYW5kX2Rlc2MpCiAgICBlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQogICAgaWYgZXh0cmFfZW52aXJvbjoKICAgICAgICBlbnYudXBkYXRlKGV4dHJhX2Vudmlyb24pCiAgICB0cnk6CiAgICAgICAgcHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oCiAgICAgICAgICAgIGNtZCwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULCBzdGRpbj1Ob25lLCBzdGRvdXQ9c3Rkb3V0LAogICAgICAgICAgICBjd2Q9Y3dkLCBlbnY9ZW52KQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKAogICAgICAgICAgICAiRXJyb3IgJXMgd2hpbGUgZXhlY3V0aW5nIGNvbW1hbmQgJXMiLCBleGMsIGNvbW1hbmRfZGVzYywKICAgICAgICApCiAgICAgICAgcmFpc2UKICAgIGlmIHN0ZG91dCBpcyBub3QgTm9uZToKICAgICAgICBhbGxfb3V0cHV0ID0gW10KICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBsaW5lID0gY29uc29sZV90b19zdHIocHJvYy5zdGRvdXQucmVhZGxpbmUoKSkKICAgICAgICAgICAgaWYgbm90IGxpbmU6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBsaW5lID0gbGluZS5yc3RyaXAoKQogICAgICAgICAgICBhbGxfb3V0cHV0LmFwcGVuZChsaW5lICsgJ1xuJykKICAgICAgICAgICAgaWYgbG9nZ2VyLmdldEVmZmVjdGl2ZUxldmVsKCkgPD0gc3RkX2xvZ2dpbmcuREVCVUc6CiAgICAgICAgICAgICAgICAjIFNob3cgdGhlIGxpbmUgaW1tZWRpYXRlbHkKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhsaW5lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBVcGRhdGUgdGhlIHNwaW5uZXIKICAgICAgICAgICAgICAgIGlmIHNwaW5uZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgc3Bpbm5lci5zcGluKCkKICAgIHByb2Mud2FpdCgpCiAgICBpZiBzcGlubmVyIGlzIG5vdCBOb25lOgogICAgICAgIGlmIHByb2MucmV0dXJuY29kZToKICAgICAgICAgICAgc3Bpbm5lci5maW5pc2goImVycm9yIikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzcGlubmVyLmZpbmlzaCgiZG9uZSIpCiAgICBpZiBwcm9jLnJldHVybmNvZGU6CiAgICAgICAgaWYgb25fcmV0dXJuY29kZSA9PSAncmFpc2UnOgogICAgICAgICAgICBpZiAobG9nZ2VyLmdldEVmZmVjdGl2ZUxldmVsKCkgPiBzdGRfbG9nZ2luZy5ERUJVRyBhbmQKICAgICAgICAgICAgICAgICAgICBub3Qgc2hvd19zdGRvdXQpOgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgJ0NvbXBsZXRlIG91dHB1dCBmcm9tIGNvbW1hbmQgJXM6JywgY29tbWFuZF9kZXNjLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgJycuam9pbihhbGxfb3V0cHV0KSArCiAgICAgICAgICAgICAgICAgICAgJ1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAnQ29tbWFuZCAiJXMiIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJXMgaW4gJXMnCiAgICAgICAgICAgICAgICAlIChjb21tYW5kX2Rlc2MsIHByb2MucmV0dXJuY29kZSwgY3dkKSkKICAgICAgICBlbGlmIG9uX3JldHVybmNvZGUgPT0gJ3dhcm4nOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICdDb21tYW5kICIlcyIgaGFkIGVycm9yIGNvZGUgJXMgaW4gJXMnLAogICAgICAgICAgICAgICAgY29tbWFuZF9kZXNjLCBwcm9jLnJldHVybmNvZGUsIGN3ZCwKICAgICAgICAgICAgKQogICAgICAgIGVsaWYgb25fcmV0dXJuY29kZSA9PSAnaWdub3JlJzoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0ludmFsaWQgdmFsdWU6IG9uX3JldHVybmNvZGU9JXMnICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByKG9uX3JldHVybmNvZGUpKQogICAgaWYgbm90IHNob3dfc3Rkb3V0OgogICAgICAgIHJldHVybiAnJy5qb2luKGFsbF9vdXRwdXQpCgoKZGVmIHJlYWRfdGV4dF9maWxlKGZpbGVuYW1lKToKICAgICIiIlJldHVybiB0aGUgY29udGVudHMgb2YgKmZpbGVuYW1lKi4KCiAgICBUcnkgdG8gZGVjb2RlIHRoZSBmaWxlIGNvbnRlbnRzIHdpdGggdXRmLTgsIHRoZSBwcmVmZXJyZWQgc3lzdGVtIGVuY29kaW5nCiAgICAoZS5nLiwgY3AxMjUyIG9uIHNvbWUgV2luZG93cyBtYWNoaW5lcyksIGFuZCBsYXRpbjEsIGluIHRoYXQgb3JkZXIuCiAgICBEZWNvZGluZyBhIGJ5dGUgc3RyaW5nIHdpdGggbGF0aW4xIHdpbGwgbmV2ZXIgcmFpc2UgYW4gZXJyb3IuIEluIHRoZSB3b3JzdAogICAgY2FzZSwgdGhlIHJldHVybmVkIHN0cmluZyB3aWxsIGNvbnRhaW4gc29tZSBnYXJiYWdlIGNoYXJhY3RlcnMuCgogICAgIiIiCiAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyYicpIGFzIGZwOgogICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKCiAgICBlbmNvZGluZ3MgPSBbJ3V0Zi04JywgbG9jYWxlLmdldHByZWZlcnJlZGVuY29kaW5nKEZhbHNlKSwgJ2xhdGluMSddCiAgICBmb3IgZW5jIGluIGVuY29kaW5nczoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRhdGEgPSBkYXRhLmRlY29kZShlbmMpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBicmVhawoKICAgIGFzc2VydCB0eXBlKGRhdGEpICE9IGJ5dGVzICAjIExhdGluMSBzaG91bGQgaGF2ZSB3b3JrZWQuCiAgICByZXR1cm4gZGF0YQoKCmRlZiBfbWFrZV9idWlsZF9kaXIoYnVpbGRfZGlyKToKICAgIG9zLm1ha2VkaXJzKGJ1aWxkX2RpcikKICAgIHdyaXRlX2RlbGV0ZV9tYXJrZXJfZmlsZShidWlsZF9kaXIpCgoKY2xhc3MgRmFrZUZpbGUob2JqZWN0KToKICAgICIiIldyYXAgYSBsaXN0IG9mIGxpbmVzIGluIGFuIG9iamVjdCB3aXRoIHJlYWRsaW5lKCkgdG8gbWFrZQogICAgQ29uZmlnUGFyc2VyIGhhcHB5LiIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbmVzKToKICAgICAgICBzZWxmLl9nZW4gPSAobCBmb3IgbCBpbiBsaW5lcykKCiAgICBkZWYgcmVhZGxpbmUoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dChzZWxmLl9nZW4pCiAgICAgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2VuLm5leHQoKQogICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgogICAgICAgICAgICByZXR1cm4gJycKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2dlbgoKCmNsYXNzIFN0cmVhbVdyYXBwZXIoU3RyaW5nSU8pOgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fc3RyZWFtKGNscywgb3JpZ19zdHJlYW0pOgogICAgICAgIGNscy5vcmlnX3N0cmVhbSA9IG9yaWdfc3RyZWFtCiAgICAgICAgcmV0dXJuIGNscygpCgogICAgIyBjb21waWxlYWxsLmNvbXBpbGVfZGlyKCkgbmVlZHMgc3Rkb3V0LmVuY29kaW5nIHRvIHByaW50IHRvIHN0ZG91dAogICAgQHByb3BlcnR5CiAgICBkZWYgZW5jb2Rpbmcoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYub3JpZ19zdHJlYW0uZW5jb2RpbmcKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgY2FwdHVyZWRfb3V0cHV0KHN0cmVhbV9uYW1lKToKICAgICIiIlJldHVybiBhIGNvbnRleHQgbWFuYWdlciB1c2VkIGJ5IGNhcHR1cmVkX3N0ZG91dC9zdGRpbi9zdGRlcnIKICAgIHRoYXQgdGVtcG9yYXJpbHkgcmVwbGFjZXMgdGhlIHN5cyBzdHJlYW0gKnN0cmVhbV9uYW1lKiB3aXRoIGEgU3RyaW5nSU8uCgogICAgVGFrZW4gZnJvbSBMaWIvc3VwcG9ydC9fX2luaXRfXy5weSBpbiB0aGUgQ1B5dGhvbiByZXBvLgogICAgIiIiCiAgICBvcmlnX3N0ZG91dCA9IGdldGF0dHIoc3lzLCBzdHJlYW1fbmFtZSkKICAgIHNldGF0dHIoc3lzLCBzdHJlYW1fbmFtZSwgU3RyZWFtV3JhcHBlci5mcm9tX3N0cmVhbShvcmlnX3N0ZG91dCkpCiAgICB0cnk6CiAgICAgICAgeWllbGQgZ2V0YXR0cihzeXMsIHN0cmVhbV9uYW1lKQogICAgZmluYWxseToKICAgICAgICBzZXRhdHRyKHN5cywgc3RyZWFtX25hbWUsIG9yaWdfc3Rkb3V0KQoKCmRlZiBjYXB0dXJlZF9zdGRvdXQoKToKICAgICIiIkNhcHR1cmUgdGhlIG91dHB1dCBvZiBzeXMuc3Rkb3V0OgoKICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgc3Rkb3V0OgogICAgICAgICAgIHByaW50KCdoZWxsbycpCiAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZG91dC5nZXR2YWx1ZSgpLCAnaGVsbG9cbicpCgogICAgVGFrZW4gZnJvbSBMaWIvc3VwcG9ydC9fX2luaXRfXy5weSBpbiB0aGUgQ1B5dGhvbiByZXBvLgogICAgIiIiCiAgICByZXR1cm4gY2FwdHVyZWRfb3V0cHV0KCdzdGRvdXQnKQoKCmNsYXNzIGNhY2hlZF9wcm9wZXJ0eShvYmplY3QpOgogICAgIiIiQSBwcm9wZXJ0eSB0aGF0IGlzIG9ubHkgY29tcHV0ZWQgb25jZSBwZXIgaW5zdGFuY2UgYW5kIHRoZW4gcmVwbGFjZXMKICAgICAgIGl0c2VsZiB3aXRoIGFuIG9yZGluYXJ5IGF0dHJpYnV0ZS4gRGVsZXRpbmcgdGhlIGF0dHJpYnV0ZSByZXNldHMgdGhlCiAgICAgICBwcm9wZXJ0eS4KCiAgICAgICBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9ib3R0bGVweS9ib3R0bGUvYmxvYi8wLjExLjUvYm90dGxlLnB5I0wxNzUKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmdW5jKToKICAgICAgICBzZWxmLl9fZG9jX18gPSBnZXRhdHRyKGZ1bmMsICdfX2RvY19fJykKICAgICAgICBzZWxmLmZ1bmMgPSBmdW5jCgogICAgZGVmIF9fZ2V0X18oc2VsZiwgb2JqLCBjbHMpOgogICAgICAgIGlmIG9iaiBpcyBOb25lOgogICAgICAgICAgICAjIFdlJ3JlIGJlaW5nIGFjY2Vzc2VkIGZyb20gdGhlIGNsYXNzIGl0c2VsZiwgbm90IGZyb20gYW4gb2JqZWN0CiAgICAgICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgdmFsdWUgPSBvYmouX19kaWN0X19bc2VsZi5mdW5jLl9fbmFtZV9fXSA9IHNlbGYuZnVuYyhvYmopCiAgICAgICAgcmV0dXJuIHZhbHVlCgoKZGVmIGdldF9pbnN0YWxsZWRfdmVyc2lvbihkaXN0X25hbWUsIGxvb2t1cF9kaXJzPU5vbmUpOgogICAgIiIiR2V0IHRoZSBpbnN0YWxsZWQgdmVyc2lvbiBvZiBkaXN0X25hbWUgYXZvaWRpbmcgcGtnX3Jlc291cmNlcyBjYWNoZSIiIgogICAgIyBDcmVhdGUgYSByZXF1aXJlbWVudCB0aGF0IHdlJ2xsIGxvb2sgZm9yIGluc2lkZSBvZiBzZXR1cHRvb2xzLgogICAgcmVxID0gcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZShkaXN0X25hbWUpCgogICAgIyBXZSB3YW50IHRvIGF2b2lkIGhhdmluZyB0aGlzIGNhY2hlZCwgc28gd2UgbmVlZCB0byBjb25zdHJ1Y3QgYSBuZXcKICAgICMgd29ya2luZyBzZXQgZWFjaCB0aW1lLgogICAgaWYgbG9va3VwX2RpcnMgaXMgTm9uZToKICAgICAgICB3b3JraW5nX3NldCA9IHBrZ19yZXNvdXJjZXMuV29ya2luZ1NldCgpCiAgICBlbHNlOgogICAgICAgIHdvcmtpbmdfc2V0ID0gcGtnX3Jlc291cmNlcy5Xb3JraW5nU2V0KGxvb2t1cF9kaXJzKQoKICAgICMgR2V0IHRoZSBpbnN0YWxsZWQgZGlzdHJpYnV0aW9uIGZyb20gb3VyIHdvcmtpbmcgc2V0CiAgICBkaXN0ID0gd29ya2luZ19zZXQuZmluZChyZXEpCgogICAgIyBDaGVjayB0byBzZWUgaWYgd2UgZ290IGFuIGluc3RhbGxlZCBkaXN0cmlidXRpb24gb3Igbm90LCBpZiB3ZSBkaWQKICAgICMgd2Ugd2FudCB0byByZXR1cm4gaXQncyB2ZXJzaW9uLgogICAgcmV0dXJuIGRpc3QudmVyc2lvbiBpZiBkaXN0IGVsc2UgTm9uZQoKCmRlZiBjb25zdW1lKGl0ZXJhdG9yKToKICAgICIiIkNvbnN1bWUgYW4gaXRlcmFibGUgYXQgQyBzcGVlZC4iIiIKICAgIGRlcXVlKGl0ZXJhdG9yLCBtYXhsZW49MCkKUEsDBBQAAAAAAAAAIQA1Ct47ayIAAGsiAAAkAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9hcHBkaXJzLnB5IiIiClRoaXMgY29kZSB3YXMgdGFrZW4gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vQWN0aXZlU3RhdGUvYXBwZGlycyBhbmQgbW9kaWZpZWQKdG8gc3VpdCBvdXIgcHVycG9zZXMuCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IG9zCmltcG9ydCBzeXMKCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgV0lORE9XUywgZXhwYW5kdXNlcgpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgUFkyLCB0ZXh0X3R5cGUKCgpkZWYgdXNlcl9jYWNoZV9kaXIoYXBwbmFtZSk6CiAgICByIiIiCiAgICBSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGNhY2hlIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgoKICAgIFR5cGljYWwgdXNlciBjYWNoZSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgbWFjT1M6ICAgICAgfi9MaWJyYXJ5L0NhY2hlcy88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICB+Ly5jYWNoZS88QXBwTmFtZT4gKFhERyBkZWZhdWx0KQogICAgICAgIFdpbmRvd3M6ICAgIEM6XFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxMb2NhbFw8QXBwTmFtZT5cQ2FjaGUKCiAgICBPbiBXaW5kb3dzIHRoZSBvbmx5IHN1Z2dlc3Rpb24gaW4gdGhlIE1TRE4gZG9jcyBpcyB0aGF0IGxvY2FsIHNldHRpbmdzIGdvCiAgICBpbiB0aGUgYENTSURMX0xPQ0FMX0FQUERBVEFgIGRpcmVjdG9yeS4gVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlCiAgICBub24tcm9hbWluZyBhcHAgZGF0YSBkaXIgKHRoZSBkZWZhdWx0IHJldHVybmVkIGJ5IGB1c2VyX2RhdGFfZGlyYCkuIEFwcHMKICAgIHR5cGljYWxseSBwdXQgY2FjaGUgZGF0YSBzb21ld2hlcmUgKnVuZGVyKiB0aGUgZ2l2ZW4gZGlyIGhlcmUuIFNvbWUKICAgIGV4YW1wbGVzOgogICAgICAgIC4uLlxNb3ppbGxhXEZpcmVmb3hcUHJvZmlsZXNcPFByb2ZpbGVOYW1lPlxDYWNoZQogICAgICAgIC4uLlxBY21lXFN1cGVyQXBwXENhY2hlXDEuMAoKICAgIE9QSU5JT046IFRoaXMgZnVuY3Rpb24gYXBwZW5kcyAiQ2FjaGUiIHRvIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAgdmFsdWUuCiAgICAiIiIKICAgIGlmIFdJTkRPV1M6CiAgICAgICAgIyBHZXQgdGhlIGJhc2UgcGF0aAogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKF9nZXRfd2luX2ZvbGRlcigiQ1NJRExfTE9DQUxfQVBQREFUQSIpKQoKICAgICAgICAjIFdoZW4gdXNpbmcgUHl0aG9uIDIsIHJldHVybiBwYXRocyBhcyBieXRlcyBvbiBXaW5kb3dzIGxpa2Ugd2UgZG8gb24KICAgICAgICAjIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLiBTZWUgaGVscGVyIGZ1bmN0aW9uIGRvY3MgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICBpZiBQWTIgYW5kIGlzaW5zdGFuY2UocGF0aCwgdGV4dF90eXBlKToKICAgICAgICAgICAgcGF0aCA9IF93aW5fcGF0aF90b19ieXRlcyhwYXRoKQoKICAgICAgICAjIEFkZCBvdXIgYXBwIG5hbWUgYW5kIENhY2hlIGRpcmVjdG9yeSB0byBpdAogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSwgIkNhY2hlIikKICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgICAgICMgR2V0IHRoZSBiYXNlIHBhdGgKICAgICAgICBwYXRoID0gZXhwYW5kdXNlcigifi9MaWJyYXJ5L0NhY2hlcyIpCgogICAgICAgICMgQWRkIG91ciBhcHAgbmFtZSB0byBpdAogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsc2U6CiAgICAgICAgIyBHZXQgdGhlIGJhc2UgcGF0aAogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoIlhER19DQUNIRV9IT01FIiwgZXhwYW5kdXNlcigifi8uY2FjaGUiKSkKCiAgICAgICAgIyBBZGQgb3VyIGFwcCBuYW1lIHRvIGl0CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQoKICAgIHJldHVybiBwYXRoCgoKZGVmIHVzZXJfZGF0YV9kaXIoYXBwbmFtZSwgcm9hbWluZz1GYWxzZSk6CiAgICAiIiIKICAgIFJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgZGF0YSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAicm9hbWluZyIgKGJvb2xlYW4sIGRlZmF1bHQgRmFsc2UpIGNhbiBiZSBzZXQgVHJ1ZSB0byB1c2UgdGhlIFdpbmRvd3MKICAgICAgICAgICAgcm9hbWluZyBhcHBkYXRhIGRpcmVjdG9yeS4gVGhhdCBtZWFucyB0aGF0IGZvciB1c2VycyBvbiBhIFdpbmRvd3MKICAgICAgICAgICAgbmV0d29yayBzZXR1cCBmb3Igcm9hbWluZyBwcm9maWxlcywgdGhpcyB1c2VyIGRhdGEgd2lsbCBiZQogICAgICAgICAgICBzeW5jJ2Qgb24gbG9naW4uIFNlZQogICAgICAgICAgICA8aHR0cDovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2NjNzY2NDg5KFdTLjEwKS5hc3B4PgogICAgICAgICAgICBmb3IgYSBkaXNjdXNzaW9uIG9mIGlzc3Vlcy4KCiAgICBUeXBpY2FsIHVzZXIgZGF0YSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgbWFjT1M6ICAgICAgICAgICAgICAgICAgfi9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvPEFwcE5hbWU+CiAgICAgICAgVW5peDogICAgICAgICAgICAgICAgICAgfi8ubG9jYWwvc2hhcmUvPEFwcE5hbWU+ICAgICMgb3IgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkWERHX0RBVEFfSE9NRSwgaWYgZGVmaW5lZAogICAgICAgIFdpbiBYUCAobm90IHJvYW1pbmcpOiAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlwgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXBwbGljYXRpb24gRGF0YVw8QXBwTmFtZT4KICAgICAgICBXaW4gWFAgKHJvYW1pbmcpOiAgICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXDx1c2VybmFtZT5cTG9jYWwgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uU2V0dGluZ3NcQXBwbGljYXRpb24gRGF0YVw8QXBwTmFtZT4KICAgICAgICBXaW4gNyAgKG5vdCByb2FtaW5nKTogICBDOlxcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXExvY2FsXDxBcHBOYW1lPgogICAgICAgIFdpbiA3ICAocm9hbWluZyk6ICAgICAgIEM6XFxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcUm9hbWluZ1w8QXBwTmFtZT4KCiAgICBGb3IgVW5peCwgd2UgZm9sbG93IHRoZSBYREcgc3BlYyBhbmQgc3VwcG9ydCAkWERHX0RBVEFfSE9NRS4KICAgIFRoYXQgbWVhbnMsIGJ5IGRlZmF1bHQgIn4vLmxvY2FsL3NoYXJlLzxBcHBOYW1lPiIuCiAgICAiIiIKICAgIGlmIFdJTkRPV1M6CiAgICAgICAgY29uc3QgPSByb2FtaW5nIGFuZCAiQ1NJRExfQVBQREFUQSIgb3IgIkNTSURMX0xPQ0FMX0FQUERBVEEiCiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLm5vcm1wYXRoKF9nZXRfd2luX2ZvbGRlcihjb25zdCkpLCBhcHBuYW1lKQogICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgZXhwYW5kdXNlcignfi9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvJyksCiAgICAgICAgICAgIGFwcG5hbWUsCiAgICAgICAgKQogICAgZWxzZToKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICBvcy5nZXRlbnYoJ1hER19EQVRBX0hPTUUnLCBleHBhbmR1c2VyKCJ+Ly5sb2NhbC9zaGFyZSIpKSwKICAgICAgICAgICAgYXBwbmFtZSwKICAgICAgICApCgogICAgcmV0dXJuIHBhdGgKCgpkZWYgdXNlcl9jb25maWdfZGlyKGFwcG5hbWUsIHJvYW1pbmc9VHJ1ZSk6CiAgICAiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGNvbmZpZyBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAicm9hbWluZyIgKGJvb2xlYW4sIGRlZmF1bHQgVHJ1ZSkgY2FuIGJlIHNldCBGYWxzZSB0byBub3QgdXNlIHRoZQogICAgICAgICAgICBXaW5kb3dzIHJvYW1pbmcgYXBwZGF0YSBkaXJlY3RvcnkuIFRoYXQgbWVhbnMgdGhhdCBmb3IgdXNlcnMgb24gYQogICAgICAgICAgICBXaW5kb3dzIG5ldHdvcmsgc2V0dXAgZm9yIHJvYW1pbmcgcHJvZmlsZXMsIHRoaXMgdXNlciBkYXRhIHdpbGwgYmUKICAgICAgICAgICAgc3luYydkIG9uIGxvZ2luLiBTZWUKICAgICAgICAgICAgPGh0dHA6Ly90ZWNobmV0Lm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9jYzc2NjQ4OShXUy4xMCkuYXNweD4KICAgICAgICAgICAgZm9yIGEgZGlzY3Vzc2lvbiBvZiBpc3N1ZXMuCgogICAgVHlwaWNhbCB1c2VyIGRhdGEgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIG1hY09TOiAgICAgICAgICAgICAgICAgIHNhbWUgYXMgdXNlcl9kYXRhX2RpcgogICAgICAgIFVuaXg6ICAgICAgICAgICAgICAgICAgIH4vLmNvbmZpZy88QXBwTmFtZT4KICAgICAgICBXaW4gKjogICAgICAgICAgICAgICAgICBzYW1lIGFzIHVzZXJfZGF0YV9kaXIKCiAgICBGb3IgVW5peCwgd2UgZm9sbG93IHRoZSBYREcgc3BlYyBhbmQgc3VwcG9ydCAkWERHX0NPTkZJR19IT01FLgogICAgVGhhdCBtZWFucywgYnkgZGVmYXVsdCAifi8uY29uZmlnLzxBcHBOYW1lPiIuCiAgICAiIiIKICAgIGlmIFdJTkRPV1M6CiAgICAgICAgcGF0aCA9IHVzZXJfZGF0YV9kaXIoYXBwbmFtZSwgcm9hbWluZz1yb2FtaW5nKQogICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICAgICAgcGF0aCA9IHVzZXJfZGF0YV9kaXIoYXBwbmFtZSkKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0NPTkZJR19IT01FJywgZXhwYW5kdXNlcigifi8uY29uZmlnIikpCiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQoKICAgIHJldHVybiBwYXRoCgoKIyBmb3IgdGhlIGRpc2N1c3Npb24gcmVnYXJkaW5nIHNpdGVfY29uZmlnX2RpcnMgbG9jYXRpb25zCiMgc2VlIDxodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzE3MzM+CmRlZiBzaXRlX2NvbmZpZ19kaXJzKGFwcG5hbWUpOgogICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBwb3RlbnRpYWwgdXNlci1zaGFyZWQgY29uZmlnIGRpcnMgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KCiAgICBUeXBpY2FsIHVzZXIgY29uZmlnIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBtYWNPUzogICAgICAvTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0LzxBcHBOYW1lPi8KICAgICAgICBVbml4OiAgICAgICAvZXRjIG9yICRYREdfQ09ORklHX0RJUlNbaV0vPEFwcE5hbWU+LyBmb3IgZWFjaCB2YWx1ZSBpbgogICAgICAgICAgICAgICAgICAgICRYREdfQ09ORklHX0RJUlMKICAgICAgICBXaW4gWFA6ICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXEFsbCBVc2Vyc1xBcHBsaWNhdGlvbiAuLi4KICAgICAgICAgICAgICAgICAgICAuLi5EYXRhXDxBcHBOYW1lPlwKICAgICAgICBWaXN0YTogICAgICAoRmFpbCEgIkM6XFByb2dyYW1EYXRhIiBpcyBhIGhpZGRlbiAqc3lzdGVtKiBkaXJlY3RvcnkKICAgICAgICAgICAgICAgICAgICBvbiBWaXN0YS4pCiAgICAgICAgV2luIDc6ICAgICAgSGlkZGVuLCBidXQgd3JpdGVhYmxlIG9uIFdpbiA3OgogICAgICAgICAgICAgICAgICAgIEM6XFByb2dyYW1EYXRhXDxBcHBOYW1lPlwKICAgICIiIgogICAgaWYgV0lORE9XUzoKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChfZ2V0X3dpbl9mb2xkZXIoIkNTSURMX0NPTU1PTl9BUFBEQVRBIikpCiAgICAgICAgcGF0aGxpc3QgPSBbb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpXQogICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CiAgICAgICAgcGF0aGxpc3QgPSBbb3MucGF0aC5qb2luKCcvTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0JywgYXBwbmFtZSldCiAgICBlbHNlOgogICAgICAgICMgdHJ5IGxvb2tpbmcgaW4gJFhER19DT05GSUdfRElSUwogICAgICAgIHhkZ19jb25maWdfZGlycyA9IG9zLmdldGVudignWERHX0NPTkZJR19ESVJTJywgJy9ldGMveGRnJykKICAgICAgICBpZiB4ZGdfY29uZmlnX2RpcnM6CiAgICAgICAgICAgIHBhdGhsaXN0ID0gWwogICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGV4cGFuZHVzZXIoeCksIGFwcG5hbWUpCiAgICAgICAgICAgICAgICBmb3IgeCBpbiB4ZGdfY29uZmlnX2RpcnMuc3BsaXQob3MucGF0aHNlcCkKICAgICAgICAgICAgXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhdGhsaXN0ID0gW10KCiAgICAgICAgIyBhbHdheXMgbG9vayBpbiAvZXRjIGRpcmVjdGx5IGFzIHdlbGwKICAgICAgICBwYXRobGlzdC5hcHBlbmQoJy9ldGMnKQoKICAgIHJldHVybiBwYXRobGlzdAoKCiMgLS0gV2luZG93cyBzdXBwb3J0IGZ1bmN0aW9ucyAtLQoKZGVmIF9nZXRfd2luX2ZvbGRlcl9mcm9tX3JlZ2lzdHJ5KGNzaWRsX25hbWUpOgogICAgIiIiCiAgICBUaGlzIGlzIGEgZmFsbGJhY2sgdGVjaG5pcXVlIGF0IGJlc3QuIEknbSBub3Qgc3VyZSBpZiB1c2luZyB0aGUKICAgIHJlZ2lzdHJ5IGZvciB0aGlzIGd1YXJhbnRlZXMgdXMgdGhlIGNvcnJlY3QgYW5zd2VyIGZvciBhbGwgQ1NJRExfKgogICAgbmFtZXMuCiAgICAiIiIKICAgIGltcG9ydCBfd2lucmVnCgogICAgc2hlbGxfZm9sZGVyX25hbWUgPSB7CiAgICAgICAgIkNTSURMX0FQUERBVEEiOiAiQXBwRGF0YSIsCiAgICAgICAgIkNTSURMX0NPTU1PTl9BUFBEQVRBIjogIkNvbW1vbiBBcHBEYXRhIiwKICAgICAgICAiQ1NJRExfTE9DQUxfQVBQREFUQSI6ICJMb2NhbCBBcHBEYXRhIiwKICAgIH1bY3NpZGxfbmFtZV0KCiAgICBrZXkgPSBfd2lucmVnLk9wZW5LZXkoCiAgICAgICAgX3dpbnJlZy5IS0VZX0NVUlJFTlRfVVNFUiwKICAgICAgICByIlNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEV4cGxvcmVyXFNoZWxsIEZvbGRlcnMiCiAgICApCiAgICBkaXJlY3RvcnksIF90eXBlID0gX3dpbnJlZy5RdWVyeVZhbHVlRXgoa2V5LCBzaGVsbF9mb2xkZXJfbmFtZSkKICAgIHJldHVybiBkaXJlY3RvcnkKCgpkZWYgX2dldF93aW5fZm9sZGVyX3dpdGhfY3R5cGVzKGNzaWRsX25hbWUpOgogICAgY3NpZGxfY29uc3QgPSB7CiAgICAgICAgIkNTSURMX0FQUERBVEEiOiAyNiwKICAgICAgICAiQ1NJRExfQ09NTU9OX0FQUERBVEEiOiAzNSwKICAgICAgICAiQ1NJRExfTE9DQUxfQVBQREFUQSI6IDI4LAogICAgfVtjc2lkbF9uYW1lXQoKICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoMTAyNCkKICAgIGN0eXBlcy53aW5kbGwuc2hlbGwzMi5TSEdldEZvbGRlclBhdGhXKE5vbmUsIGNzaWRsX2NvbnN0LCBOb25lLCAwLCBidWYpCgogICAgIyBEb3duZ3JhZGUgdG8gc2hvcnQgcGF0aCBuYW1lIGlmIGhhdmUgaGlnaGJpdCBjaGFycy4gU2VlCiAgICAjIDxodHRwOi8vYnVncy5hY3RpdmVzdGF0ZS5jb20vc2hvd19idWcuY2dpP2lkPTg1MDk5Pi4KICAgIGhhc19oaWdoX2NoYXIgPSBGYWxzZQogICAgZm9yIGMgaW4gYnVmOgogICAgICAgIGlmIG9yZChjKSA+IDI1NToKICAgICAgICAgICAgaGFzX2hpZ2hfY2hhciA9IFRydWUKICAgICAgICAgICAgYnJlYWsKICAgIGlmIGhhc19oaWdoX2NoYXI6CiAgICAgICAgYnVmMiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoMTAyNCkKICAgICAgICBpZiBjdHlwZXMud2luZGxsLmtlcm5lbDMyLkdldFNob3J0UGF0aE5hbWVXKGJ1Zi52YWx1ZSwgYnVmMiwgMTAyNCk6CiAgICAgICAgICAgIGJ1ZiA9IGJ1ZjIKCiAgICByZXR1cm4gYnVmLnZhbHVlCgppZiBXSU5ET1dTOgogICAgdHJ5OgogICAgICAgIGltcG9ydCBjdHlwZXMKICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9jdHlwZXMKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfZnJvbV9yZWdpc3RyeQoKCmRlZiBfd2luX3BhdGhfdG9fYnl0ZXMocGF0aCk6CiAgICAiIiJFbmNvZGUgV2luZG93cyBwYXRocyB0byBieXRlcy4gT25seSB1c2VkIG9uIFB5dGhvbiAyLgoKICAgIE1vdGl2YXRpb24gaXMgdG8gYmUgY29uc2lzdGVudCB3aXRoIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIHdoZXJlIHBhdGhzCiAgICBhcmUgYWxzbyByZXR1cm5lZCBhcyBieXRlcy4gVGhpcyBhdm9pZHMgcHJvYmxlbXMgbWl4aW5nIGJ5dGVzIGFuZCBVbmljb2RlCiAgICBlbHNld2hlcmUgaW4gdGhlIGNvZGViYXNlLiBGb3IgbW9yZSBkZXRhaWxzIGFuZCBkaXNjdXNzaW9uIHNlZQogICAgPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMzQ2Mz4uCgogICAgSWYgZW5jb2RpbmcgdXNpbmcgQVNDSUkgYW5kIE1CQ1MgZmFpbHMsIHJldHVybiB0aGUgb3JpZ2luYWwgVW5pY29kZSBwYXRoLgogICAgIiIiCiAgICBmb3IgZW5jb2RpbmcgaW4gKCdBU0NJSScsICdNQkNTJyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gcGF0aC5lbmNvZGUoZW5jb2RpbmcpCiAgICAgICAgZXhjZXB0IChVbmljb2RlRW5jb2RlRXJyb3IsIExvb2t1cEVycm9yKToKICAgICAgICAgICAgcGFzcwogICAgcmV0dXJuIHBhdGgKUEsDBBQAAAAAAAAAIQDNDE0uIAUAACAFAAAiAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9idWlsZC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgb3MucGF0aAppbXBvcnQgdGVtcGZpbGUKCmZyb20gcGlwLnV0aWxzIGltcG9ydCBybXRyZWUKCgpjbGFzcyBCdWlsZERpcmVjdG9yeShvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPU5vbmUsIGRlbGV0ZT1Ob25lKToKICAgICAgICAjIElmIHdlIHdlcmUgbm90IGdpdmVuIGFuIGV4cGxpY2l0IGRpcmVjdG9yeSwgYW5kIHdlIHdlcmUgbm90IGdpdmVuIGFuCiAgICAgICAgIyBleHBsaWNpdCBkZWxldGUgb3B0aW9uLCB0aGVuIHdlJ2xsIGRlZmF1bHQgdG8gZGVsZXRpbmcuCiAgICAgICAgaWYgbmFtZSBpcyBOb25lIGFuZCBkZWxldGUgaXMgTm9uZToKICAgICAgICAgICAgZGVsZXRlID0gVHJ1ZQoKICAgICAgICBpZiBuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgICMgV2UgcmVhbHBhdGggaGVyZSBiZWNhdXNlIHNvbWUgc3lzdGVtcyBoYXZlIHRoZWlyIGRlZmF1bHQgdG1wZGlyCiAgICAgICAgICAgICMgc3ltbGlua2VkIHRvIGFub3RoZXIgZGlyZWN0b3J5LiAgVGhpcyB0ZW5kcyB0byBjb25mdXNlIGJ1aWxkCiAgICAgICAgICAgICMgc2NyaXB0cywgc28gd2UgY2Fub25pY2FsaXplIHRoZSBwYXRoIGJ5IHRyYXZlcnNpbmcgcG90ZW50aWFsCiAgICAgICAgICAgICMgc3ltbGlua3MgaGVyZS4KICAgICAgICAgICAgbmFtZSA9IG9zLnBhdGgucmVhbHBhdGgodGVtcGZpbGUubWtkdGVtcChwcmVmaXg9InBpcC1idWlsZC0iKSkKICAgICAgICAgICAgIyBJZiB3ZSB3ZXJlIG5vdCBnaXZlbiBhbiBleHBsaWNpdCBkaXJlY3RvcnksIGFuZCB3ZSB3ZXJlIG5vdCBnaXZlbgogICAgICAgICAgICAjIGFuIGV4cGxpY2l0IGRlbGV0ZSBvcHRpb24sIHRoZW4gd2UnbGwgZGVmYXVsdCB0byBkZWxldGluZy4KICAgICAgICAgICAgaWYgZGVsZXRlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBkZWxldGUgPSBUcnVlCgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLmRlbGV0ZSA9IGRlbGV0ZQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjx7fSB7IXJ9PiIuZm9ybWF0KHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLm5hbWUpCgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4YywgdmFsdWUsIHRiKToKICAgICAgICBzZWxmLmNsZWFudXAoKQoKICAgIGRlZiBjbGVhbnVwKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZGVsZXRlOgogICAgICAgICAgICBybXRyZWUoc2VsZi5uYW1lKQpQSwMEFAAAAAAAAAAhAHEeaiS4CAAAuAgAACgAAABweXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL2RlcHJlY2F0aW9uLnB5IiIiCkEgbW9kdWxlIHRoYXQgaW1wbGVtZW50cyB0b29saW5nIHRvIGVuYWJsZSBlYXN5IHdhcm5pbmdzIGFib3V0IGRlcHJlY2F0aW9ucy4KIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgd2FybmluZ3MKCgpjbGFzcyBQaXBEZXByZWNhdGlvbldhcm5pbmcoV2FybmluZyk6CiAgICBwYXNzCgoKY2xhc3MgUGVuZGluZyhvYmplY3QpOgogICAgcGFzcwoKCmNsYXNzIFJlbW92ZWRJblBpcDEwV2FybmluZyhQaXBEZXByZWNhdGlvbldhcm5pbmcpOgogICAgcGFzcwoKCmNsYXNzIFJlbW92ZWRJblBpcDExV2FybmluZyhQaXBEZXByZWNhdGlvbldhcm5pbmcsIFBlbmRpbmcpOgogICAgcGFzcwoKCmNsYXNzIFB5dGhvbjI2RGVwcmVjYXRpb25XYXJuaW5nKFBpcERlcHJlY2F0aW9uV2FybmluZyk6CiAgICBwYXNzCgoKIyBXYXJuaW5ncyA8LT4gTG9nZ2luZyBJbnRlZ3JhdGlvbgoKCl93YXJuaW5nc19zaG93d2FybmluZyA9IE5vbmUKCgpkZWYgX3Nob3d3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBmaWxlPU5vbmUsIGxpbmU9Tm9uZSk6CiAgICBpZiBmaWxlIGlzIG5vdCBOb25lOgogICAgICAgIGlmIF93YXJuaW5nc19zaG93d2FybmluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgX3dhcm5pbmdzX3Nob3d3YXJuaW5nKAogICAgICAgICAgICAgICAgbWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGUsIGxpbmUsCiAgICAgICAgICAgICkKICAgIGVsc2U6CiAgICAgICAgaWYgaXNzdWJjbGFzcyhjYXRlZ29yeSwgUGlwRGVwcmVjYXRpb25XYXJuaW5nKToKICAgICAgICAgICAgIyBXZSB1c2UgYSBzcGVjaWFsbHkgbmFtZWQgbG9nZ2VyIHdoaWNoIHdpbGwgaGFuZGxlIGFsbCBvZiB0aGUKICAgICAgICAgICAgIyBkZXByZWNhdGlvbiBtZXNzYWdlcyBmb3IgcGlwLgogICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigicGlwLmRlcHJlY2F0aW9ucyIpCgogICAgICAgICAgICAjIFRoaXMgaXMgcHVycG9zZWx5IHVzaW5nIHRoZSAlIGZvcm1hdHRlciBoZXJlIGluc3RlYWQgb2YgbGV0dGluZwogICAgICAgICAgICAjIHRoZSBsb2dnaW5nIG1vZHVsZSBoYW5kbGUgdGhlIGludGVycG9sYXRpb24uIFRoaXMgaXMgYmVjYXVzZSB3ZQogICAgICAgICAgICAjIHdhbnQgaXQgdG8gYXBwZWFyIGFzIGlmIHNvbWVvbmUgdHlwZWQgdGhpcyBlbnRpcmUgbWVzc2FnZSBvdXQuCiAgICAgICAgICAgIGxvZ19tZXNzYWdlID0gIkRFUFJFQ0FUSU9OOiAlcyIgJSBtZXNzYWdlCgogICAgICAgICAgICAjIFBpcERlcHJlY2F0aW9uV2FybmluZ3MgdGhhdCBhcmUgUGVuZGluZyBzdGlsbCBoYXZlIGF0IGxlYXN0IDIKICAgICAgICAgICAgIyB2ZXJzaW9ucyB0byBnbyB1bnRpbCB0aGV5IGFyZSByZW1vdmVkIHNvIHRoZXkgY2FuIGp1c3QgYmUKICAgICAgICAgICAgIyB3YXJuaW5ncy4gIE90aGVyd2lzZSwgdGhleSB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIHZlcnkgbmV4dAogICAgICAgICAgICAjIHZlcnNpb24gb2YgcGlwLiBXZSB3YW50IHRoZXNlIHRvIGJlIG1vcmUgb2J2aW91cyBzbyB3ZSB1c2UgdGhlCiAgICAgICAgICAgICMgRVJST1IgbG9nZ2luZyBsZXZlbC4KICAgICAgICAgICAgaWYgaXNzdWJjbGFzcyhjYXRlZ29yeSwgUGVuZGluZyk6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZyhsb2dfbWVzc2FnZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihsb2dfbWVzc2FnZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBfd2FybmluZ3Nfc2hvd3dhcm5pbmcoCiAgICAgICAgICAgICAgICBtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZSwgbGluZSwKICAgICAgICAgICAgKQoKCmRlZiBpbnN0YWxsX3dhcm5pbmdfbG9nZ2VyKCk6CiAgICAjIEVuYWJsZSBvdXIgRGVwcmVjYXRpb24gV2FybmluZ3MKICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiZGVmYXVsdCIsIFBpcERlcHJlY2F0aW9uV2FybmluZywgYXBwZW5kPVRydWUpCgogICAgZ2xvYmFsIF93YXJuaW5nc19zaG93d2FybmluZwoKICAgIGlmIF93YXJuaW5nc19zaG93d2FybmluZyBpcyBOb25lOgogICAgICAgIF93YXJuaW5nc19zaG93d2FybmluZyA9IHdhcm5pbmdzLnNob3d3YXJuaW5nCiAgICAgICAgd2FybmluZ3Muc2hvd3dhcm5pbmcgPSBfc2hvd3dhcm5pbmcKUEsDBBQAAAAAAAAAIQC9Wj+wywMAAMsDAAAlAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9lbmNvZGluZy5weWltcG9ydCBjb2RlY3MKaW1wb3J0IGxvY2FsZQppbXBvcnQgcmUKCgpCT01TID0gWwogICAgKGNvZGVjcy5CT01fVVRGOCwgJ3V0ZjgnKSwKICAgIChjb2RlY3MuQk9NX1VURjE2LCAndXRmMTYnKSwKICAgIChjb2RlY3MuQk9NX1VURjE2X0JFLCAndXRmMTYtYmUnKSwKICAgIChjb2RlY3MuQk9NX1VURjE2X0xFLCAndXRmMTYtbGUnKSwKICAgIChjb2RlY3MuQk9NX1VURjMyLCAndXRmMzInKSwKICAgIChjb2RlY3MuQk9NX1VURjMyX0JFLCAndXRmMzItYmUnKSwKICAgIChjb2RlY3MuQk9NX1VURjMyX0xFLCAndXRmMzItbGUnKSwKXQoKRU5DT0RJTkdfUkUgPSByZS5jb21waWxlKGInY29kaW5nWzo9XVxzKihbLVx3Ll0rKScpCgoKZGVmIGF1dG9fZGVjb2RlKGRhdGEpOgogICAgIiIiQ2hlY2sgYSBieXRlcyBzdHJpbmcgZm9yIGEgQk9NIHRvIGNvcnJlY3RseSBkZXRlY3QgdGhlIGVuY29kaW5nCgogICAgRmFsbGJhY2sgdG8gbG9jYWxlLmdldHByZWZlcnJlZGVuY29kaW5nKEZhbHNlKSBsaWtlIG9wZW4oKSBvbiBQeXRob24zIiIiCiAgICBmb3IgYm9tLCBlbmNvZGluZyBpbiBCT01TOgogICAgICAgIGlmIGRhdGEuc3RhcnRzd2l0aChib20pOgogICAgICAgICAgICByZXR1cm4gZGF0YVtsZW4oYm9tKTpdLmRlY29kZShlbmNvZGluZykKICAgICMgTGV0cyBjaGVjayB0aGUgZmlyc3QgdHdvIGxpbmVzIGFzIGluIFBFUDI2MwogICAgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdChiJ1xuJylbOjJdOgogICAgICAgIGlmIGxpbmVbMDoxXSA9PSBiJyMnIGFuZCBFTkNPRElOR19SRS5zZWFyY2gobGluZSk6CiAgICAgICAgICAgIGVuY29kaW5nID0gRU5DT0RJTkdfUkUuc2VhcmNoKGxpbmUpLmdyb3VwcygpWzBdLmRlY29kZSgnYXNjaWknKQogICAgICAgICAgICByZXR1cm4gZGF0YS5kZWNvZGUoZW5jb2RpbmcpCiAgICByZXR1cm4gZGF0YS5kZWNvZGUobG9jYWxlLmdldHByZWZlcnJlZGVuY29kaW5nKEZhbHNlKSkKUEsDBBQAAAAAAAAAIQDyQ+3AgwMAAIMDAAAnAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9maWxlc3lzdGVtLnB5aW1wb3J0IG9zCmltcG9ydCBvcy5wYXRoCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IGdldF9wYXRoX3VpZAoKCmRlZiBjaGVja19wYXRoX293bmVyKHBhdGgpOgogICAgIyBJZiB3ZSBkb24ndCBoYXZlIGEgd2F5IHRvIGNoZWNrIHRoZSBlZmZlY3RpdmUgdWlkIG9mIHRoaXMgcHJvY2VzcywgdGhlbgogICAgIyB3ZSdsbCBqdXN0IGFzc3VtZSB0aGF0IHdlIG93biB0aGUgZGlyZWN0b3J5LgogICAgaWYgbm90IGhhc2F0dHIob3MsICJnZXRldWlkIik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBwcmV2aW91cyA9IE5vbmUKICAgIHdoaWxlIHBhdGggIT0gcHJldmlvdXM6CiAgICAgICAgaWYgb3MucGF0aC5sZXhpc3RzKHBhdGgpOgogICAgICAgICAgICAjIENoZWNrIGlmIHBhdGggaXMgd3JpdGFibGUgYnkgY3VycmVudCB1c2VyLgogICAgICAgICAgICBpZiBvcy5nZXRldWlkKCkgPT0gMDoKICAgICAgICAgICAgICAgICMgU3BlY2lhbCBoYW5kbGluZyBmb3Igcm9vdCB1c2VyIGluIG9yZGVyIHRvIGhhbmRsZSBwcm9wZXJseQogICAgICAgICAgICAgICAgIyBjYXNlcyB3aGVyZSB1c2VycyB1c2Ugc3VkbyB3aXRob3V0IC1IIGZsYWcuCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcGF0aF91aWQgPSBnZXRfcGF0aF91aWQocGF0aCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIHBhdGhfdWlkID09IDAKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBvcy5hY2Nlc3MocGF0aCwgb3MuV19PSykKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmV2aW91cywgcGF0aCA9IHBhdGgsIG9zLnBhdGguZGlybmFtZShwYXRoKQpQSwMEFAAAAAAAAAAhACA3BXR7CwAAewsAACIAAABweXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL2dsaWJjLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCByZQppbXBvcnQgY3R5cGVzCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgd2FybmluZ3MKCgpkZWYgZ2xpYmNfdmVyc2lvbl9zdHJpbmcoKToKICAgICJSZXR1cm5zIGdsaWJjIHZlcnNpb24gc3RyaW5nLCBvciBOb25lIGlmIG5vdCB1c2luZyBnbGliYy4iCgogICAgIyBjdHlwZXMuQ0RMTChOb25lKSBpbnRlcm5hbGx5IGNhbGxzIGRsb3BlbihOVUxMKSwgYW5kIGFzIHRoZSBkbG9wZW4KICAgICMgbWFucGFnZSBzYXlzLCAiSWYgZmlsZW5hbWUgaXMgTlVMTCwgdGhlbiB0aGUgcmV0dXJuZWQgaGFuZGxlIGlzIGZvciB0aGUKICAgICMgbWFpbiBwcm9ncmFtIi4gVGhpcyB3YXkgd2UgY2FuIGxldCB0aGUgbGlua2VyIGRvIHRoZSB3b3JrIHRvIGZpZ3VyZSBvdXQKICAgICMgd2hpY2ggbGliYyBvdXIgcHJvY2VzcyBpcyBhY3R1YWxseSB1c2luZy4KICAgIHByb2Nlc3NfbmFtZXNwYWNlID0gY3R5cGVzLkNETEwoTm9uZSkKICAgIHRyeToKICAgICAgICBnbnVfZ2V0X2xpYmNfdmVyc2lvbiA9IHByb2Nlc3NfbmFtZXNwYWNlLmdudV9nZXRfbGliY192ZXJzaW9uCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgIyBTeW1ib2wgZG9lc24ndCBleGlzdCAtPiB0aGVyZWZvcmUsIHdlIGFyZSBub3QgbGlua2VkIHRvCiAgICAgICAgIyBnbGliYy4KICAgICAgICByZXR1cm4gTm9uZQoKICAgICMgQ2FsbCBnbnVfZ2V0X2xpYmNfdmVyc2lvbiwgd2hpY2ggcmV0dXJucyBhIHN0cmluZyBsaWtlICIyLjUiCiAgICBnbnVfZ2V0X2xpYmNfdmVyc2lvbi5yZXN0eXBlID0gY3R5cGVzLmNfY2hhcl9wCiAgICB2ZXJzaW9uX3N0ciA9IGdudV9nZXRfbGliY192ZXJzaW9uKCkKICAgICMgcHkyIC8gcHkzIGNvbXBhdGliaWxpdHk6CiAgICBpZiBub3QgaXNpbnN0YW5jZSh2ZXJzaW9uX3N0ciwgc3RyKToKICAgICAgICB2ZXJzaW9uX3N0ciA9IHZlcnNpb25fc3RyLmRlY29kZSgiYXNjaWkiKQoKICAgIHJldHVybiB2ZXJzaW9uX3N0cgoKCiMgU2VwYXJhdGVkIG91dCBmcm9tIGhhdmVfY29tcGF0aWJsZV9nbGliYyBmb3IgZWFzaWVyIHVuaXQgdGVzdGluZwpkZWYgY2hlY2tfZ2xpYmNfdmVyc2lvbih2ZXJzaW9uX3N0ciwgcmVxdWlyZWRfbWFqb3IsIG1pbmltdW1fbWlub3IpOgogICAgIyBQYXJzZSBzdHJpbmcgYW5kIGNoZWNrIGFnYWluc3QgcmVxdWVzdGVkIHZlcnNpb24uCiAgICAjCiAgICAjIFdlIHVzZSBhIHJlZ2V4cCBpbnN0ZWFkIG9mIHN0ci5zcGxpdCBiZWNhdXNlIHdlIHdhbnQgdG8gZGlzY2FyZCBhbnkKICAgICMgcmFuZG9tIGp1bmsgdGhhdCBtaWdodCBjb21lIGFmdGVyIHRoZSBtaW5vciB2ZXJzaW9uIC0tIHRoaXMgbWlnaHQgaGFwcGVuCiAgICAjIGluIHBhdGNoZWQvZm9ya2VkIHZlcnNpb25zIG9mIGdsaWJjIChlLmcuIExpbmFybydzIHZlcnNpb24gb2YgZ2xpYmMKICAgICMgdXNlcyB2ZXJzaW9uIHN0cmluZ3MgbGlrZSAiMi4yMC0yMDE0LjExIikuIFNlZSBnaC0zNTg4LgogICAgbSA9IHJlLm1hdGNoKHIiKD9QPG1ham9yPlswLTldKylcLig/UDxtaW5vcj5bMC05XSspIiwgdmVyc2lvbl9zdHIpCiAgICBpZiBub3QgbToKICAgICAgICB3YXJuaW5ncy53YXJuKCJFeHBlY3RlZCBnbGliYyB2ZXJzaW9uIHdpdGggMiBjb21wb25lbnRzIG1ham9yLm1pbm9yLCIKICAgICAgICAgICAgICAgICAgICAgICIgZ290OiAlcyIgJSB2ZXJzaW9uX3N0ciwgUnVudGltZVdhcm5pbmcpCiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gKGludChtLmdyb3VwKCJtYWpvciIpKSA9PSByZXF1aXJlZF9tYWpvciBhbmQKICAgICAgICAgICAgaW50KG0uZ3JvdXAoIm1pbm9yIikpID49IG1pbmltdW1fbWlub3IpCgoKZGVmIGhhdmVfY29tcGF0aWJsZV9nbGliYyhyZXF1aXJlZF9tYWpvciwgbWluaW11bV9taW5vcik6CiAgICB2ZXJzaW9uX3N0ciA9IGdsaWJjX3ZlcnNpb25fc3RyaW5nKCkKICAgIGlmIHZlcnNpb25fc3RyIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gY2hlY2tfZ2xpYmNfdmVyc2lvbih2ZXJzaW9uX3N0ciwgcmVxdWlyZWRfbWFqb3IsIG1pbmltdW1fbWlub3IpCgoKIyBwbGF0Zm9ybS5saWJjX3ZlciByZWd1bGFybHkgcmV0dXJucyBjb21wbGV0ZWx5IG5vbnNlbnNpY2FsIGdsaWJjCiMgdmVyc2lvbnMuIEUuZy4gb24gbXkgY29tcHV0ZXIsIHBsYXRmb3JtIHNheXM6CiMKIyAgIH4kIHB5dGhvbjIuNyAtYyAnaW1wb3J0IHBsYXRmb3JtOyBwcmludChwbGF0Zm9ybS5saWJjX3ZlcigpKScKIyAgICgnZ2xpYmMnLCAnMi43JykKIyAgIH4kIHB5dGhvbjMuNSAtYyAnaW1wb3J0IHBsYXRmb3JtOyBwcmludChwbGF0Zm9ybS5saWJjX3ZlcigpKScKIyAgICgnZ2xpYmMnLCAnMi45JykKIwojIEJ1dCB0aGUgdHJ1dGggaXM6CiMKIyAgIH4kIGxkZCAtLXZlcnNpb24KIyAgIGxkZCAoRGViaWFuIEdMSUJDIDIuMjItMTEpIDIuMjIKIwojIFRoaXMgaXMgdW5mb3J0dW5hdGUsIGJlY2F1c2UgaXQgbWVhbnMgdGhhdCB0aGUgbGluZWhhdWwgZGF0YSBvbiBsaWJjCiMgdmVyc2lvbnMgdGhhdCB3YXMgZ2VuZXJhdGVkIGJ5IHBpcCA4LjEuMiBhbmQgZWFybGllciBpcyB1c2VsZXNzIGFuZAojIG1pc2xlYWRpbmcuIFNvbHV0aW9uOiBpbnN0ZWFkIG9mIHVzaW5nIHBsYXRmb3JtLCB1c2Ugb3VyIGNvZGUgdGhhdCBhY3R1YWxseQojIHdvcmtzLgpkZWYgbGliY192ZXIoKToKICAgIGdsaWJjX3ZlcnNpb24gPSBnbGliY192ZXJzaW9uX3N0cmluZygpCiAgICBpZiBnbGliY192ZXJzaW9uIGlzIE5vbmU6CiAgICAgICAgIyBGb3Igbm9uLWdsaWJjIHBsYXRmb3JtcywgZmFsbCBiYWNrIG9uIHBsYXRmb3JtLmxpYmNfdmVyCiAgICAgICAgcmV0dXJuIHBsYXRmb3JtLmxpYmNfdmVyKCkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuICgiZ2xpYmMiLCBnbGliY192ZXJzaW9uKQpQSwMEFAAAAAAAAAAhAKk06QQyCwAAMgsAACMAAABweXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL2hhc2hlcy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgaGFzaGxpYgoKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgSGFzaE1pc21hdGNoLCBIYXNoTWlzc2luZywgSW5zdGFsbGF0aW9uRXJyb3IKZnJvbSBwaXAudXRpbHMgaW1wb3J0IHJlYWRfY2h1bmtzCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCBpdGVyaXRlbXMsIGl0ZXJrZXlzLCBpdGVydmFsdWVzCgoKIyBUaGUgcmVjb21tZW5kZWQgaGFzaCBhbGdvIG9mIHRoZSBtb21lbnQuIENoYW5nZSB0aGlzIHdoZW5ldmVyIHRoZSBzdGF0ZSBvZgojIHRoZSBhcnQgY2hhbmdlczsgaXQgd29uJ3QgaHVydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgpGQVZPUklURV9IQVNIID0gJ3NoYTI1NicKCgojIE5hbWVzIG9mIGhhc2hsaWIgYWxnb3JpdGhtcyBhbGxvd2VkIGJ5IHRoZSAtLWhhc2ggb3B0aW9uIGFuZCBgYHBpcCBoYXNoYGAKIyBDdXJyZW50bHksIHRob3NlIGFyZSB0aGUgb25lcyBhdCBsZWFzdCBhcyBjb2xsaXNpb24tcmVzaXN0YW50IGFzIHNoYTI1Ni4KU1RST05HX0hBU0hFUyA9IFsnc2hhMjU2JywgJ3NoYTM4NCcsICdzaGE1MTInXQoKCmNsYXNzIEhhc2hlcyhvYmplY3QpOgogICAgIiIiQSB3cmFwcGVyIHRoYXQgYnVpbGRzIG11bHRpcGxlIGhhc2hlcyBhdCBvbmNlIGFuZCBjaGVja3MgdGhlbSBhZ2FpbnN0CiAgICBrbm93bi1nb29kIHZhbHVlcwoKICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhhc2hlcz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICA6cGFyYW0gaGFzaGVzOiBBIGRpY3Qgb2YgYWxnb3JpdGhtIG5hbWVzIHBvaW50aW5nIHRvIGxpc3RzIG9mIGFsbG93ZWQKICAgICAgICAgICAgaGV4IGRpZ2VzdHMKICAgICAgICAiIiIKICAgICAgICBzZWxmLl9hbGxvd2VkID0ge30gaWYgaGFzaGVzIGlzIE5vbmUgZWxzZSBoYXNoZXMKCiAgICBkZWYgY2hlY2tfYWdhaW5zdF9jaHVua3Moc2VsZiwgY2h1bmtzKToKICAgICAgICAiIiJDaGVjayBnb29kIGhhc2hlcyBhZ2FpbnN0IG9uZXMgYnVpbHQgZnJvbSBpdGVyYWJsZSBvZiBjaHVua3Mgb2YKICAgICAgICBkYXRhLgoKICAgICAgICBSYWlzZSBIYXNoTWlzbWF0Y2ggaWYgbm9uZSBtYXRjaC4KCiAgICAgICAgIiIiCiAgICAgICAgZ290cyA9IHt9CiAgICAgICAgZm9yIGhhc2hfbmFtZSBpbiBpdGVya2V5cyhzZWxmLl9hbGxvd2VkKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZ290c1toYXNoX25hbWVdID0gaGFzaGxpYi5uZXcoaGFzaF9uYW1lKQogICAgICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIFR5cGVFcnJvcik6CiAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcignVW5rbm93biBoYXNoIG5hbWU6ICVzJyAlIGhhc2hfbmFtZSkKCiAgICAgICAgZm9yIGNodW5rIGluIGNodW5rczoKICAgICAgICAgICAgZm9yIGhhc2ggaW4gaXRlcnZhbHVlcyhnb3RzKToKICAgICAgICAgICAgICAgIGhhc2gudXBkYXRlKGNodW5rKQoKICAgICAgICBmb3IgaGFzaF9uYW1lLCBnb3QgaW4gaXRlcml0ZW1zKGdvdHMpOgogICAgICAgICAgICBpZiBnb3QuaGV4ZGlnZXN0KCkgaW4gc2VsZi5fYWxsb3dlZFtoYXNoX25hbWVdOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5fcmFpc2UoZ290cykKCiAgICBkZWYgX3JhaXNlKHNlbGYsIGdvdHMpOgogICAgICAgIHJhaXNlIEhhc2hNaXNtYXRjaChzZWxmLl9hbGxvd2VkLCBnb3RzKQoKICAgIGRlZiBjaGVja19hZ2FpbnN0X2ZpbGUoc2VsZiwgZmlsZSk6CiAgICAgICAgIiIiQ2hlY2sgZ29vZCBoYXNoZXMgYWdhaW5zdCBhIGZpbGUtbGlrZSBvYmplY3QKCiAgICAgICAgUmFpc2UgSGFzaE1pc21hdGNoIGlmIG5vbmUgbWF0Y2guCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLmNoZWNrX2FnYWluc3RfY2h1bmtzKHJlYWRfY2h1bmtzKGZpbGUpKQoKICAgIGRlZiBjaGVja19hZ2FpbnN0X3BhdGgoc2VsZiwgcGF0aCk6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIGZpbGU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNoZWNrX2FnYWluc3RfZmlsZShmaWxlKQoKICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gd2hldGhlciBJIGtub3cgYW55IGtub3duLWdvb2QgaGFzaGVzLiIiIgogICAgICAgIHJldHVybiBib29sKHNlbGYuX2FsbG93ZWQpCgogICAgZGVmIF9fYm9vbF9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9fbm9uemVyb19fKCkKCgpjbGFzcyBNaXNzaW5nSGFzaGVzKEhhc2hlcyk6CiAgICAiIiJBIHdvcmthbGlrZSBmb3IgSGFzaGVzIHVzZWQgd2hlbiB3ZSdyZSBtaXNzaW5nIGEgaGFzaCBmb3IgYSByZXF1aXJlbWVudAoKICAgIEl0IGNvbXB1dGVzIHRoZSBhY3R1YWwgaGFzaCBvZiB0aGUgcmVxdWlyZW1lbnQgYW5kIHJhaXNlcyBhIEhhc2hNaXNzaW5nCiAgICBleGNlcHRpb24gc2hvd2luZyBpdCB0byB0aGUgdXNlci4KCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAiIiJEb24ndCBvZmZlciB0aGUgYGBoYXNoZXNgYCBrd2FyZy4iIiIKICAgICAgICAjIFBhc3Mgb3VyIGZhdm9yaXRlIGhhc2ggaW4gdG8gZ2VuZXJhdGUgYSAiZ290dGVuIGhhc2giLiBXaXRoIHRoZQogICAgICAgICMgZW1wdHkgbGlzdCwgaXQgd2lsbCBuZXZlciBtYXRjaCwgc28gYW4gZXJyb3Igd2lsbCBhbHdheXMgcmFpc2UuCiAgICAgICAgc3VwZXIoTWlzc2luZ0hhc2hlcywgc2VsZikuX19pbml0X18oaGFzaGVzPXtGQVZPUklURV9IQVNIOiBbXX0pCgogICAgZGVmIF9yYWlzZShzZWxmLCBnb3RzKToKICAgICAgICByYWlzZSBIYXNoTWlzc2luZyhnb3RzW0ZBVk9SSVRFX0hBU0hdLmhleGRpZ2VzdCgpKQpQSwMEFAAAAAAAAAAhAGcm13j/DAAA/wwAACQAAABweXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL2xvZ2dpbmcucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IGxvZ2dpbmcuaGFuZGxlcnMKaW1wb3J0IG9zCgp0cnk6CiAgICBpbXBvcnQgdGhyZWFkaW5nCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydCBkdW1teV90aHJlYWRpbmcgYXMgdGhyZWFkaW5nCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IFdJTkRPV1MKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGVuc3VyZV9kaXIKCnRyeToKICAgIGZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IGNvbG9yYW1hCiMgTG90cyBvZiBkaWZmZXJlbnQgZXJyb3JzIGNhbiBjb21lIGZyb20gdGhpcywgaW5jbHVkaW5nIFN5c3RlbUVycm9yIGFuZAojIEltcG9ydEVycm9yLgpleGNlcHQgRXhjZXB0aW9uOgogICAgY29sb3JhbWEgPSBOb25lCgoKX2xvZ19zdGF0ZSA9IHRocmVhZGluZy5sb2NhbCgpCl9sb2dfc3RhdGUuaW5kZW50YXRpb24gPSAwCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIGluZGVudF9sb2cobnVtPTIpOgogICAgIiIiCiAgICBBIGNvbnRleHQgbWFuYWdlciB3aGljaCB3aWxsIGNhdXNlIHRoZSBsb2cgb3V0cHV0IHRvIGJlIGluZGVudGVkIGZvciBhbnkKICAgIGxvZyBtZXNzYWdlcyBlbWl0dGVkIGluc2lkZSBpdC4KICAgICIiIgogICAgX2xvZ19zdGF0ZS5pbmRlbnRhdGlvbiArPSBudW0KICAgIHRyeToKICAgICAgICB5aWVsZAogICAgZmluYWxseToKICAgICAgICBfbG9nX3N0YXRlLmluZGVudGF0aW9uIC09IG51bQoKCmRlZiBnZXRfaW5kZW50YXRpb24oKToKICAgIHJldHVybiBnZXRhdHRyKF9sb2dfc3RhdGUsICdpbmRlbnRhdGlvbicsIDApCgoKY2xhc3MgSW5kZW50aW5nRm9ybWF0dGVyKGxvZ2dpbmcuRm9ybWF0dGVyKToKCiAgICBkZWYgZm9ybWF0KHNlbGYsIHJlY29yZCk6CiAgICAgICAgIiIiCiAgICAgICAgQ2FsbHMgdGhlIHN0YW5kYXJkIGZvcm1hdHRlciwgYnV0IHdpbGwgaW5kZW50IGFsbCBvZiB0aGUgbG9nIG1lc3NhZ2VzCiAgICAgICAgYnkgb3VyIGN1cnJlbnQgaW5kZW50YXRpb24gbGV2ZWwuCiAgICAgICAgIiIiCiAgICAgICAgZm9ybWF0dGVkID0gbG9nZ2luZy5Gb3JtYXR0ZXIuZm9ybWF0KHNlbGYsIHJlY29yZCkKICAgICAgICBmb3JtYXR0ZWQgPSAiIi5qb2luKFsKICAgICAgICAgICAgKCIgIiAqIGdldF9pbmRlbnRhdGlvbigpKSArIGxpbmUKICAgICAgICAgICAgZm9yIGxpbmUgaW4gZm9ybWF0dGVkLnNwbGl0bGluZXMoVHJ1ZSkKICAgICAgICBdKQogICAgICAgIHJldHVybiBmb3JtYXR0ZWQKCgpkZWYgX2NvbG9yX3dyYXAoKmNvbG9ycyk6CiAgICBkZWYgd3JhcHBlZChpbnApOgogICAgICAgIHJldHVybiAiIi5qb2luKGxpc3QoY29sb3JzKSArIFtpbnAsIGNvbG9yYW1hLlN0eWxlLlJFU0VUX0FMTF0pCiAgICByZXR1cm4gd3JhcHBlZAoKCmNsYXNzIENvbG9yaXplZFN0cmVhbUhhbmRsZXIobG9nZ2luZy5TdHJlYW1IYW5kbGVyKToKCiAgICAjIERvbid0IGJ1aWxkIHVwIGEgbGlzdCBvZiBjb2xvcnMgaWYgd2UgZG9uJ3QgaGF2ZSBjb2xvcmFtYQogICAgaWYgY29sb3JhbWE6CiAgICAgICAgQ09MT1JTID0gWwogICAgICAgICAgICAjIFRoaXMgbmVlZHMgdG8gYmUgaW4gb3JkZXIgZnJvbSBoaWdoZXN0IGxvZ2dpbmcgbGV2ZWwgdG8gbG93ZXN0LgogICAgICAgICAgICAobG9nZ2luZy5FUlJPUiwgX2NvbG9yX3dyYXAoY29sb3JhbWEuRm9yZS5SRUQpKSwKICAgICAgICAgICAgKGxvZ2dpbmcuV0FSTklORywgX2NvbG9yX3dyYXAoY29sb3JhbWEuRm9yZS5ZRUxMT1cpKSwKICAgICAgICBdCiAgICBlbHNlOgogICAgICAgIENPTE9SUyA9IFtdCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbT1Ob25lKToKICAgICAgICBsb2dnaW5nLlN0cmVhbUhhbmRsZXIuX19pbml0X18oc2VsZiwgc3RyZWFtKQoKICAgICAgICBpZiBXSU5ET1dTIGFuZCBjb2xvcmFtYToKICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBjb2xvcmFtYS5BbnNpVG9XaW4zMihzZWxmLnN0cmVhbSkKCiAgICBkZWYgc2hvdWxkX2NvbG9yKHNlbGYpOgogICAgICAgICMgRG9uJ3QgY29sb3JpemUgdGhpbmdzIGlmIHdlIGRvIG5vdCBoYXZlIGNvbG9yYW1hCiAgICAgICAgaWYgbm90IGNvbG9yYW1hOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcmVhbF9zdHJlYW0gPSAoCiAgICAgICAgICAgIHNlbGYuc3RyZWFtIGlmIG5vdCBpc2luc3RhbmNlKHNlbGYuc3RyZWFtLCBjb2xvcmFtYS5BbnNpVG9XaW4zMikKICAgICAgICAgICAgZWxzZSBzZWxmLnN0cmVhbS53cmFwcGVkCiAgICAgICAgKQoKICAgICAgICAjIElmIHRoZSBzdHJlYW0gaXMgYSB0dHkgd2Ugc2hvdWxkIGNvbG9yIGl0CiAgICAgICAgaWYgaGFzYXR0cihyZWFsX3N0cmVhbSwgImlzYXR0eSIpIGFuZCByZWFsX3N0cmVhbS5pc2F0dHkoKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgIyBJZiB3ZSBoYXZlIGFuIEFTTkkgdGVybSB3ZSBzaG91bGQgY29sb3IgaXQKICAgICAgICBpZiBvcy5lbnZpcm9uLmdldCgiVEVSTSIpID09ICJBTlNJIjoKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgIyBJZiBhbnl0aGluZyBlbHNlIHdlIHNob3VsZCBub3QgY29sb3IgaXQKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgZm9ybWF0KHNlbGYsIHJlY29yZCk6CiAgICAgICAgbXNnID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyLmZvcm1hdChzZWxmLCByZWNvcmQpCgogICAgICAgIGlmIHNlbGYuc2hvdWxkX2NvbG9yKCk6CiAgICAgICAgICAgIGZvciBsZXZlbCwgY29sb3IgaW4gc2VsZi5DT0xPUlM6CiAgICAgICAgICAgICAgICBpZiByZWNvcmQubGV2ZWxubyA+PSBsZXZlbDoKICAgICAgICAgICAgICAgICAgICBtc2cgPSBjb2xvcihtc2cpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgcmV0dXJuIG1zZwoKCmNsYXNzIEJldHRlclJvdGF0aW5nRmlsZUhhbmRsZXIobG9nZ2luZy5oYW5kbGVycy5Sb3RhdGluZ0ZpbGVIYW5kbGVyKToKCiAgICBkZWYgX29wZW4oc2VsZik6CiAgICAgICAgZW5zdXJlX2Rpcihvcy5wYXRoLmRpcm5hbWUoc2VsZi5iYXNlRmlsZW5hbWUpKQogICAgICAgIHJldHVybiBsb2dnaW5nLmhhbmRsZXJzLlJvdGF0aW5nRmlsZUhhbmRsZXIuX29wZW4oc2VsZikKCgpjbGFzcyBNYXhMZXZlbEZpbHRlcihsb2dnaW5nLkZpbHRlcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxldmVsKToKICAgICAgICBzZWxmLmxldmVsID0gbGV2ZWwKCiAgICBkZWYgZmlsdGVyKHNlbGYsIHJlY29yZCk6CiAgICAgICAgcmV0dXJuIHJlY29yZC5sZXZlbG5vIDwgc2VsZi5sZXZlbApQSwMEFAAAAAAAAAAhAEhU2OpPFQAATxUAACUAAABweXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL291dGRhdGVkLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBkYXRldGltZQppbXBvcnQganNvbgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MucGF0aAppbXBvcnQgc3lzCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBsb2NrZmlsZQpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZyBpbXBvcnQgdmVyc2lvbiBhcyBwYWNrYWdpbmdfdmVyc2lvbgoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCB0b3RhbF9zZWNvbmRzLCBXSU5ET1dTCmZyb20gcGlwLm1vZGVscyBpbXBvcnQgUHlQSQpmcm9tIHBpcC5sb2NhdGlvbnMgaW1wb3J0IFVTRVJfQ0FDSEVfRElSLCBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGVuc3VyZV9kaXIsIGdldF9pbnN0YWxsZWRfdmVyc2lvbgpmcm9tIHBpcC51dGlscy5maWxlc3lzdGVtIGltcG9ydCBjaGVja19wYXRoX293bmVyCgoKU0VMRkNIRUNLX0RBVEVfRk1UID0gIiVZLSVtLSVkVCVIOiVNOiVTWiIKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBWaXJ0dWFsZW52U2VsZkNoZWNrU3RhdGUob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLnN0YXRlZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICJwaXAtc2VsZmNoZWNrLmpzb24iKQoKICAgICAgICAjIExvYWQgdGhlIGV4aXN0aW5nIHN0YXRlCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5zdGF0ZWZpbGVfcGF0aCkgYXMgc3RhdGVmaWxlOgogICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IGpzb24ubG9hZChzdGF0ZWZpbGUpCiAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBWYWx1ZUVycm9yKToKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHt9CgogICAgZGVmIHNhdmUoc2VsZiwgcHlwaV92ZXJzaW9uLCBjdXJyZW50X3RpbWUpOgogICAgICAgICMgQXR0ZW1wdCB0byB3cml0ZSBvdXQgb3VyIHZlcnNpb24gY2hlY2sgZmlsZQogICAgICAgIHdpdGggb3BlbihzZWxmLnN0YXRlZmlsZV9wYXRoLCAidyIpIGFzIHN0YXRlZmlsZToKICAgICAgICAgICAganNvbi5kdW1wKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJsYXN0X2NoZWNrIjogY3VycmVudF90aW1lLnN0cmZ0aW1lKFNFTEZDSEVDS19EQVRFX0ZNVCksCiAgICAgICAgICAgICAgICAgICAgInB5cGlfdmVyc2lvbiI6IHB5cGlfdmVyc2lvbiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzdGF0ZWZpbGUsCiAgICAgICAgICAgICAgICBzb3J0X2tleXM9VHJ1ZSwKICAgICAgICAgICAgICAgIHNlcGFyYXRvcnM9KCIsIiwgIjoiKQogICAgICAgICAgICApCgoKY2xhc3MgR2xvYmFsU2VsZkNoZWNrU3RhdGUob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLnN0YXRlZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKFVTRVJfQ0FDSEVfRElSLCAic2VsZmNoZWNrLmpzb24iKQoKICAgICAgICAjIExvYWQgdGhlIGV4aXN0aW5nIHN0YXRlCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5zdGF0ZWZpbGVfcGF0aCkgYXMgc3RhdGVmaWxlOgogICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IGpzb24ubG9hZChzdGF0ZWZpbGUpW3N5cy5wcmVmaXhdCiAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBWYWx1ZUVycm9yLCBLZXlFcnJvcik6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSB7fQoKICAgIGRlZiBzYXZlKHNlbGYsIHB5cGlfdmVyc2lvbiwgY3VycmVudF90aW1lKToKICAgICAgICAjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIG93biB0aGUgZGlyZWN0b3J5CiAgICAgICAgaWYgbm90IGNoZWNrX3BhdGhfb3duZXIob3MucGF0aC5kaXJuYW1lKHNlbGYuc3RhdGVmaWxlX3BhdGgpKToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgTm93IHRoYXQgd2UndmUgZW5zdXJlZCB0aGUgZGlyZWN0b3J5IGlzIG93bmVkIGJ5IHRoaXMgdXNlciwgd2UnbGwgZ28KICAgICAgICAjIGFoZWFkIGFuZCBtYWtlIHN1cmUgdGhhdCBhbGwgb3VyIGRpcmVjdG9yaWVzIGFyZSBjcmVhdGVkLgogICAgICAgIGVuc3VyZV9kaXIob3MucGF0aC5kaXJuYW1lKHNlbGYuc3RhdGVmaWxlX3BhdGgpKQoKICAgICAgICAjIEF0dGVtcHQgdG8gd3JpdGUgb3V0IG91ciB2ZXJzaW9uIGNoZWNrIGZpbGUKICAgICAgICB3aXRoIGxvY2tmaWxlLkxvY2tGaWxlKHNlbGYuc3RhdGVmaWxlX3BhdGgpOgogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnN0YXRlZmlsZV9wYXRoKToKICAgICAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLnN0YXRlZmlsZV9wYXRoKSBhcyBzdGF0ZWZpbGU6CiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBqc29uLmxvYWQoc3RhdGVmaWxlKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc3RhdGUgPSB7fQoKICAgICAgICAgICAgc3RhdGVbc3lzLnByZWZpeF0gPSB7CiAgICAgICAgICAgICAgICAibGFzdF9jaGVjayI6IGN1cnJlbnRfdGltZS5zdHJmdGltZShTRUxGQ0hFQ0tfREFURV9GTVQpLAogICAgICAgICAgICAgICAgInB5cGlfdmVyc2lvbiI6IHB5cGlfdmVyc2lvbiwKICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYuc3RhdGVmaWxlX3BhdGgsICJ3IikgYXMgc3RhdGVmaWxlOgogICAgICAgICAgICAgICAganNvbi5kdW1wKHN0YXRlLCBzdGF0ZWZpbGUsIHNvcnRfa2V5cz1UcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvcnM9KCIsIiwgIjoiKSkKCgpkZWYgbG9hZF9zZWxmY2hlY2tfc3RhdGVmaWxlKCk6CiAgICBpZiBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYoKToKICAgICAgICByZXR1cm4gVmlydHVhbGVudlNlbGZDaGVja1N0YXRlKCkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIEdsb2JhbFNlbGZDaGVja1N0YXRlKCkKCgpkZWYgcGlwX3ZlcnNpb25fY2hlY2soc2Vzc2lvbik6CiAgICAiIiJDaGVjayBmb3IgYW4gdXBkYXRlIGZvciBwaXAuCgogICAgTGltaXQgdGhlIGZyZXF1ZW5jeSBvZiBjaGVja3MgdG8gb25jZSBwZXIgd2Vlay4gU3RhdGUgaXMgc3RvcmVkIGVpdGhlciBpbgogICAgdGhlIGFjdGl2ZSB2aXJ0dWFsZW52IG9yIGluIHRoZSB1c2VyJ3MgVVNFUl9DQUNIRV9ESVIga2V5ZWQgb2ZmIHRoZSBwcmVmaXgKICAgIG9mIHRoZSBwaXAgc2NyaXB0IHBhdGguCiAgICAiIiIKICAgIGluc3RhbGxlZF92ZXJzaW9uID0gZ2V0X2luc3RhbGxlZF92ZXJzaW9uKCJwaXAiKQogICAgaWYgaW5zdGFsbGVkX3ZlcnNpb24gaXMgTm9uZToKICAgICAgICByZXR1cm4KCiAgICBwaXBfdmVyc2lvbiA9IHBhY2thZ2luZ192ZXJzaW9uLnBhcnNlKGluc3RhbGxlZF92ZXJzaW9uKQogICAgcHlwaV92ZXJzaW9uID0gTm9uZQoKICAgIHRyeToKICAgICAgICBzdGF0ZSA9IGxvYWRfc2VsZmNoZWNrX3N0YXRlZmlsZSgpCgogICAgICAgIGN1cnJlbnRfdGltZSA9IGRhdGV0aW1lLmRhdGV0aW1lLnV0Y25vdygpCiAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2UgbmVlZCB0byByZWZyZXNoIHRoZSBzdGF0ZQogICAgICAgIGlmICJsYXN0X2NoZWNrIiBpbiBzdGF0ZS5zdGF0ZSBhbmQgInB5cGlfdmVyc2lvbiIgaW4gc3RhdGUuc3RhdGU6CiAgICAgICAgICAgIGxhc3RfY2hlY2sgPSBkYXRldGltZS5kYXRldGltZS5zdHJwdGltZSgKICAgICAgICAgICAgICAgIHN0YXRlLnN0YXRlWyJsYXN0X2NoZWNrIl0sCiAgICAgICAgICAgICAgICBTRUxGQ0hFQ0tfREFURV9GTVQKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiB0b3RhbF9zZWNvbmRzKGN1cnJlbnRfdGltZSAtIGxhc3RfY2hlY2spIDwgNyAqIDI0ICogNjAgKiA2MDoKICAgICAgICAgICAgICAgIHB5cGlfdmVyc2lvbiA9IHN0YXRlLnN0YXRlWyJweXBpX3ZlcnNpb24iXQoKICAgICAgICAjIFJlZnJlc2ggdGhlIHZlcnNpb24gaWYgd2UgbmVlZCB0byBvciBqdXN0IHNlZSBpZiB3ZSBuZWVkIHRvIHdhcm4KICAgICAgICBpZiBweXBpX3ZlcnNpb24gaXMgTm9uZToKICAgICAgICAgICAgcmVzcCA9IHNlc3Npb24uZ2V0KAogICAgICAgICAgICAgICAgUHlQSS5waXBfanNvbl91cmwsCiAgICAgICAgICAgICAgICBoZWFkZXJzPXsiQWNjZXB0IjogImFwcGxpY2F0aW9uL2pzb24ifSwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXNwLnJhaXNlX2Zvcl9zdGF0dXMoKQogICAgICAgICAgICBweXBpX3ZlcnNpb24gPSBbCiAgICAgICAgICAgICAgICB2IGZvciB2IGluIHNvcnRlZCgKICAgICAgICAgICAgICAgICAgICBsaXN0KHJlc3AuanNvbigpWyJyZWxlYXNlcyJdKSwKICAgICAgICAgICAgICAgICAgICBrZXk9cGFja2FnaW5nX3ZlcnNpb24ucGFyc2UsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBpZiBub3QgcGFja2FnaW5nX3ZlcnNpb24ucGFyc2UodikuaXNfcHJlcmVsZWFzZQogICAgICAgICAgICBdWy0xXQoKICAgICAgICAgICAgIyBzYXZlIHRoYXQgd2UndmUgcGVyZm9ybWVkIGEgY2hlY2sKICAgICAgICAgICAgc3RhdGUuc2F2ZShweXBpX3ZlcnNpb24sIGN1cnJlbnRfdGltZSkKCiAgICAgICAgcmVtb3RlX3ZlcnNpb24gPSBwYWNrYWdpbmdfdmVyc2lvbi5wYXJzZShweXBpX3ZlcnNpb24pCgogICAgICAgICMgRGV0ZXJtaW5lIGlmIG91ciBweXBpX3ZlcnNpb24gaXMgb2xkZXIKICAgICAgICBpZiAocGlwX3ZlcnNpb24gPCByZW1vdGVfdmVyc2lvbiBhbmQKICAgICAgICAgICAgICAgIHBpcF92ZXJzaW9uLmJhc2VfdmVyc2lvbiAhPSByZW1vdGVfdmVyc2lvbi5iYXNlX3ZlcnNpb24pOgogICAgICAgICAgICAjIEFkdmlzZSAicHl0aG9uIC1tIHBpcCIgb24gV2luZG93cyB0byBhdm9pZCBpc3N1ZXMKICAgICAgICAgICAgIyB3aXRoIG92ZXJ3cml0aW5nIHBpcC5leGUuCiAgICAgICAgICAgIGlmIFdJTkRPV1M6CiAgICAgICAgICAgICAgICBwaXBfY21kID0gInB5dGhvbiAtbSBwaXAiCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwaXBfY21kID0gInBpcCIKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAiWW91IGFyZSB1c2luZyBwaXAgdmVyc2lvbiAlcywgaG93ZXZlciB2ZXJzaW9uICVzIGlzICIKICAgICAgICAgICAgICAgICJhdmFpbGFibGUuXG5Zb3Ugc2hvdWxkIGNvbnNpZGVyIHVwZ3JhZGluZyB2aWEgdGhlICIKICAgICAgICAgICAgICAgICInJXMgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJyBjb21tYW5kLiIsCiAgICAgICAgICAgICAgICBwaXBfdmVyc2lvbiwgcHlwaV92ZXJzaW9uLCBwaXBfY21kCiAgICAgICAgICAgICkKCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgIlRoZXJlIHdhcyBhbiBlcnJvciBjaGVja2luZyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgcGlwIiwKICAgICAgICAgICAgZXhjX2luZm89VHJ1ZSwKICAgICAgICApClBLAwQUAAAAAAAAACEADeaSuCAIAAAgCAAAJgAAAHB5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvcGFja2FnaW5nLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gZW1haWwucGFyc2VyIGltcG9ydCBGZWVkUGFyc2VyCgppbXBvcnQgbG9nZ2luZwppbXBvcnQgc3lzCgpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZyBpbXBvcnQgc3BlY2lmaWVycwpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZyBpbXBvcnQgdmVyc2lvbgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBwa2dfcmVzb3VyY2VzCgpmcm9tIHBpcCBpbXBvcnQgZXhjZXB0aW9ucwoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKZGVmIGNoZWNrX3JlcXVpcmVzX3B5dGhvbihyZXF1aXJlc19weXRob24pOgogICAgIiIiCiAgICBDaGVjayBpZiB0aGUgcHl0aG9uIHZlcnNpb24gaW4gdXNlIG1hdGNoIHRoZSBgcmVxdWlyZXNfcHl0aG9uYCBzcGVjaWZpZXIuCgogICAgUmV0dXJucyBgVHJ1ZWAgaWYgdGhlIHZlcnNpb24gb2YgcHl0aG9uIGluIHVzZSBtYXRjaGVzIHRoZSByZXF1aXJlbWVudC4KICAgIFJldHVybnMgYEZhbHNlYCBpZiB0aGUgdmVyc2lvbiBvZiBweXRob24gaW4gdXNlIGRvZXMgbm90IG1hdGNoZXMgdGhlCiAgICByZXF1aXJlbWVudC4KCiAgICBSYWlzZXMgYW4gSW52YWxpZFNwZWNpZmllciBpZiBgcmVxdWlyZXNfcHl0aG9uYCBoYXZlIGFuIGludmFsaWQgZm9ybWF0LgogICAgIiIiCiAgICBpZiByZXF1aXJlc19weXRob24gaXMgTm9uZToKICAgICAgICAjIFRoZSBwYWNrYWdlIHByb3ZpZGVzIG5vIGluZm9ybWF0aW9uCiAgICAgICAgcmV0dXJuIFRydWUKICAgIHJlcXVpcmVzX3B5dGhvbl9zcGVjaWZpZXIgPSBzcGVjaWZpZXJzLlNwZWNpZmllclNldChyZXF1aXJlc19weXRob24pCgogICAgIyBXZSBvbmx5IHVzZSBtYWpvci5taW5vci5taWNybwogICAgcHl0aG9uX3ZlcnNpb24gPSB2ZXJzaW9uLnBhcnNlKCcuJy5qb2luKG1hcChzdHIsIHN5cy52ZXJzaW9uX2luZm9bOjNdKSkpCiAgICByZXR1cm4gcHl0aG9uX3ZlcnNpb24gaW4gcmVxdWlyZXNfcHl0aG9uX3NwZWNpZmllcgoKCmRlZiBnZXRfbWV0YWRhdGEoZGlzdCk6CiAgICBpZiAoaXNpbnN0YW5jZShkaXN0LCBwa2dfcmVzb3VyY2VzLkRpc3RJbmZvRGlzdHJpYnV0aW9uKSBhbmQKICAgICAgICAgICAgZGlzdC5oYXNfbWV0YWRhdGEoJ01FVEFEQVRBJykpOgogICAgICAgIHJldHVybiBkaXN0LmdldF9tZXRhZGF0YSgnTUVUQURBVEEnKQogICAgZWxpZiBkaXN0Lmhhc19tZXRhZGF0YSgnUEtHLUlORk8nKToKICAgICAgICByZXR1cm4gZGlzdC5nZXRfbWV0YWRhdGEoJ1BLRy1JTkZPJykKCgpkZWYgY2hlY2tfZGlzdF9yZXF1aXJlc19weXRob24oZGlzdCk6CiAgICBtZXRhZGF0YSA9IGdldF9tZXRhZGF0YShkaXN0KQogICAgZmVlZF9wYXJzZXIgPSBGZWVkUGFyc2VyKCkKICAgIGZlZWRfcGFyc2VyLmZlZWQobWV0YWRhdGEpCiAgICBwa2dfaW5mb19kaWN0ID0gZmVlZF9wYXJzZXIuY2xvc2UoKQogICAgcmVxdWlyZXNfcHl0aG9uID0gcGtnX2luZm9fZGljdC5nZXQoJ1JlcXVpcmVzLVB5dGhvbicpCiAgICB0cnk6CiAgICAgICAgaWYgbm90IGNoZWNrX3JlcXVpcmVzX3B5dGhvbihyZXF1aXJlc19weXRob24pOgogICAgICAgICAgICByYWlzZSBleGNlcHRpb25zLlVuc3VwcG9ydGVkUHl0aG9uVmVyc2lvbigKICAgICAgICAgICAgICAgICIlcyByZXF1aXJlcyBQeXRob24gJyVzJyBidXQgdGhlIHJ1bm5pbmcgUHl0aG9uIGlzICVzIiAlICgKICAgICAgICAgICAgICAgICAgICBkaXN0LnByb2plY3RfbmFtZSwKICAgICAgICAgICAgICAgICAgICByZXF1aXJlc19weXRob24sCiAgICAgICAgICAgICAgICAgICAgJy4nLmpvaW4obWFwKHN0ciwgc3lzLnZlcnNpb25faW5mb1s6M10pKSwpCiAgICAgICAgICAgICkKICAgIGV4Y2VwdCBzcGVjaWZpZXJzLkludmFsaWRTcGVjaWZpZXIgYXMgZToKICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgIlBhY2thZ2UgJXMgaGFzIGFuIGludmFsaWQgUmVxdWlyZXMtUHl0aG9uIGVudHJ5ICVzIC0gJXMiICUgKAogICAgICAgICAgICAgICAgZGlzdC5wcm9qZWN0X25hbWUsIHJlcXVpcmVzX3B5dGhvbiwgZSkpCiAgICAgICAgcmV0dXJuClBLAwQUAAAAAAAAACEAFqLyShYBAAAWAQAALQAAAHB5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvc2V0dXB0b29sc19idWlsZC5weSMgU2hpbSB0byB3cmFwIHNldHVwLnB5IGludm9jYXRpb24gd2l0aCBzZXR1cHRvb2xzClNFVFVQVE9PTFNfU0hJTSA9ICgKICAgICJpbXBvcnQgc2V0dXB0b29scywgdG9rZW5pemU7X19maWxlX189JXI7IgogICAgImY9Z2V0YXR0cih0b2tlbml6ZSwgJ29wZW4nLCBvcGVuKShfX2ZpbGVfXyk7IgogICAgImNvZGU9Zi5yZWFkKCkucmVwbGFjZSgnXFxyXFxuJywgJ1xcbicpOyIKICAgICJmLmNsb3NlKCk7IgogICAgImV4ZWMoY29tcGlsZShjb2RlLCBfX2ZpbGVfXywgJ2V4ZWMnKSkiCikKUEsDBBQAAAAAAAAAIQDl4pCVTS0AAE0tAAAfAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy91aS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHN5cwpmcm9tIHNpZ25hbCBpbXBvcnQgc2lnbmFsLCBTSUdJTlQsIGRlZmF1bHRfaW50X2hhbmRsZXIKaW1wb3J0IHRpbWUKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IGxvZ2dpbmcKCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgV0lORE9XUwpmcm9tIHBpcC51dGlscyBpbXBvcnQgZm9ybWF0X3NpemUKZnJvbSBwaXAudXRpbHMubG9nZ2luZyBpbXBvcnQgZ2V0X2luZGVudGF0aW9uCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHNpeApmcm9tIHBpcC5fdmVuZG9yLnByb2dyZXNzLmJhciBpbXBvcnQgQmFyLCBJbmNyZW1lbnRhbEJhcgpmcm9tIHBpcC5fdmVuZG9yLnByb2dyZXNzLmhlbHBlcnMgaW1wb3J0IChXcml0ZWxuTWl4aW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhJREVfQ1VSU09SLCBTSE9XX0NVUlNPUikKZnJvbSBwaXAuX3ZlbmRvci5wcm9ncmVzcy5zcGlubmVyIGltcG9ydCBTcGlubmVyCgp0cnk6CiAgICBmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBjb2xvcmFtYQojIExvdHMgb2YgZGlmZmVyZW50IGVycm9ycyBjYW4gY29tZSBmcm9tIHRoaXMsIGluY2x1ZGluZyBTeXN0ZW1FcnJvciBhbmQKIyBJbXBvcnRFcnJvci4KZXhjZXB0IEV4Y2VwdGlvbjoKICAgIGNvbG9yYW1hID0gTm9uZQoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKZGVmIF9zZWxlY3RfcHJvZ3Jlc3NfY2xhc3MocHJlZmVycmVkLCBmYWxsYmFjayk6CiAgICBlbmNvZGluZyA9IGdldGF0dHIocHJlZmVycmVkLmZpbGUsICJlbmNvZGluZyIsIE5vbmUpCgogICAgIyBJZiB3ZSBkb24ndCBrbm93IHdoYXQgZW5jb2RpbmcgdGhpcyBmaWxlIGlzIGluLCB0aGVuIHdlJ2xsIGp1c3QgYXNzdW1lCiAgICAjIHRoYXQgaXQgZG9lc24ndCBzdXBwb3J0IHVuaWNvZGUgYW5kIHVzZSB0aGUgQVNDSUkgYmFyLgogICAgaWYgbm90IGVuY29kaW5nOgogICAgICAgIHJldHVybiBmYWxsYmFjawoKICAgICMgQ29sbGVjdCBhbGwgb2YgdGhlIHBvc3NpYmxlIGNoYXJhY3RlcnMgd2Ugd2FudCB0byB1c2Ugd2l0aCB0aGUgcHJlZmVycmVkCiAgICAjIGJhci4KICAgIGNoYXJhY3RlcnMgPSBbCiAgICAgICAgZ2V0YXR0cihwcmVmZXJyZWQsICJlbXB0eV9maWxsIiwgc2l4LnRleHRfdHlwZSgpKSwKICAgICAgICBnZXRhdHRyKHByZWZlcnJlZCwgImZpbGwiLCBzaXgudGV4dF90eXBlKCkpLAogICAgXQogICAgY2hhcmFjdGVycyArPSBsaXN0KGdldGF0dHIocHJlZmVycmVkLCAicGhhc2VzIiwgW10pKQoKICAgICMgVHJ5IHRvIGRlY29kZSB0aGUgY2hhcmFjdGVycyB3ZSdyZSB1c2luZyBmb3IgdGhlIGJhciB1c2luZyB0aGUgZW5jb2RpbmcKICAgICMgb2YgdGhlIGdpdmVuIGZpbGUsIGlmIHRoaXMgd29ya3MgdGhlbiB3ZSdsbCBhc3N1bWUgdGhhdCB3ZSBjYW4gdXNlIHRoZQogICAgIyBmYW5jaWVyIGJhciBhbmQgaWYgbm90IHdlJ2xsIGZhbGwgYmFjayB0byB0aGUgcGxhaW50ZXh0IGJhci4KICAgIHRyeToKICAgICAgICBzaXgudGV4dF90eXBlKCkuam9pbihjaGFyYWN0ZXJzKS5lbmNvZGUoZW5jb2RpbmcpCiAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgIHJldHVybiBmYWxsYmFjawogICAgZWxzZToKICAgICAgICByZXR1cm4gcHJlZmVycmVkCgoKX0Jhc2VCYXIgPSBfc2VsZWN0X3Byb2dyZXNzX2NsYXNzKEluY3JlbWVudGFsQmFyLCBCYXIpCgoKY2xhc3MgSW50ZXJydXB0aWJsZU1peGluKG9iamVjdCk6CiAgICAiIiIKICAgIEhlbHBlciB0byBlbnN1cmUgdGhhdCBzZWxmLmZpbmlzaCgpIGdldHMgY2FsbGVkIG9uIGtleWJvYXJkIGludGVycnVwdC4KCiAgICBUaGlzIGFsbG93cyBkb3dubG9hZHMgdG8gYmUgaW50ZXJydXB0ZWQgd2l0aG91dCBsZWF2aW5nIHRlbXBvcmFyeSBzdGF0ZQogICAgKGxpa2UgaGlkZGVuIGN1cnNvcnMpIGJlaGluZC4KCiAgICBUaGlzIGNsYXNzIGlzIHNpbWlsYXIgdG8gdGhlIHByb2dyZXNzIGxpYnJhcnkncyBleGlzdGluZyBTaWdJbnRNaXhpbgogICAgaGVscGVyLCBidXQgYXMgb2YgdmVyc2lvbiAxLjIsIHRoYXQgaGVscGVyIGhhcyB0aGUgZm9sbG93aW5nIHByb2JsZW1zOgoKICAgIDEuIEl0IGNhbGxzIHN5cy5leGl0KCkuCiAgICAyLiBJdCBkaXNjYXJkcyB0aGUgZXhpc3RpbmcgU0lHSU5UIGhhbmRsZXIgY29tcGxldGVseS4KICAgIDMuIEl0IGxlYXZlcyBpdHMgb3duIGhhbmRsZXIgaW4gcGxhY2UgZXZlbiBhZnRlciBhbiB1bmludGVycnVwdGVkIGZpbmlzaCwKICAgICAgIHdoaWNoIHdpbGwgaGF2ZSB1bmV4cGVjdGVkIGRlbGF5ZWQgZWZmZWN0cyBpZiB0aGUgdXNlciB0cmlnZ2VycyBhbgogICAgICAgdW5yZWxhdGVkIGtleWJvYXJkIGludGVycnVwdCBzb21lIHRpbWUgYWZ0ZXIgYSBwcm9ncmVzcy1kaXNwbGF5aW5nCiAgICAgICBkb3dubG9hZCBoYXMgYWxyZWFkeSBjb21wbGV0ZWQsIGZvciBleGFtcGxlLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgU2F2ZSB0aGUgb3JpZ2luYWwgU0lHSU5UIGhhbmRsZXIgZm9yIGxhdGVyLgogICAgICAgICIiIgogICAgICAgIHN1cGVyKEludGVycnVwdGlibGVNaXhpbiwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQoKICAgICAgICBzZWxmLm9yaWdpbmFsX2hhbmRsZXIgPSBzaWduYWwoU0lHSU5ULCBzZWxmLmhhbmRsZV9zaWdpbnQpCgogICAgICAgICMgSWYgc2lnbmFsKCkgcmV0dXJucyBOb25lLCB0aGUgcHJldmlvdXMgaGFuZGxlciB3YXMgbm90IGluc3RhbGxlZCBmcm9tCiAgICAgICAgIyBQeXRob24sIGFuZCB3ZSBjYW5ub3QgcmVzdG9yZSBpdC4gVGhpcyBwcm9iYWJseSBzaG91bGQgbm90IGhhcHBlbiwKICAgICAgICAjIGJ1dCBpZiBpdCBkb2VzLCB3ZSBtdXN0IHJlc3RvcmUgc29tZXRoaW5nIHNlbnNpYmxlIGluc3RlYWQsIGF0IGxlYXN0LgogICAgICAgICMgVGhlIGxlYXN0IGJhZCBvcHRpb24gc2hvdWxkIGJlIFB5dGhvbidzIGRlZmF1bHQgU0lHSU5UIGhhbmRsZXIsIHdoaWNoCiAgICAgICAgIyBqdXN0IHJhaXNlcyBLZXlib2FyZEludGVycnVwdC4KICAgICAgICBpZiBzZWxmLm9yaWdpbmFsX2hhbmRsZXIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5vcmlnaW5hbF9oYW5kbGVyID0gZGVmYXVsdF9pbnRfaGFuZGxlcgoKICAgIGRlZiBmaW5pc2goc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVzdG9yZSB0aGUgb3JpZ2luYWwgU0lHSU5UIGhhbmRsZXIgYWZ0ZXIgZmluaXNoaW5nLgoKICAgICAgICBUaGlzIHNob3VsZCBoYXBwZW4gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBwcm9ncmVzcyBkaXNwbGF5IGZpbmlzaGVzCiAgICAgICAgbm9ybWFsbHksIG9yIGdldHMgaW50ZXJydXB0ZWQuCiAgICAgICAgIiIiCiAgICAgICAgc3VwZXIoSW50ZXJydXB0aWJsZU1peGluLCBzZWxmKS5maW5pc2goKQogICAgICAgIHNpZ25hbChTSUdJTlQsIHNlbGYub3JpZ2luYWxfaGFuZGxlcikKCiAgICBkZWYgaGFuZGxlX3NpZ2ludChzZWxmLCBzaWdudW0sIGZyYW1lKToKICAgICAgICAiIiIKICAgICAgICBDYWxsIHNlbGYuZmluaXNoKCkgYmVmb3JlIGRlbGVnYXRpbmcgdG8gdGhlIG9yaWdpbmFsIFNJR0lOVCBoYW5kbGVyLgoKICAgICAgICBUaGlzIGhhbmRsZXIgc2hvdWxkIG9ubHkgYmUgaW4gcGxhY2Ugd2hpbGUgdGhlIHByb2dyZXNzIGRpc3BsYXkgaXMKICAgICAgICBhY3RpdmUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5maW5pc2goKQogICAgICAgIHNlbGYub3JpZ2luYWxfaGFuZGxlcihzaWdudW0sIGZyYW1lKQoKCmNsYXNzIERvd25sb2FkUHJvZ3Jlc3NNaXhpbihvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKERvd25sb2FkUHJvZ3Jlc3NNaXhpbiwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHNlbGYubWVzc2FnZSA9ICgiICIgKiAoZ2V0X2luZGVudGF0aW9uKCkgKyAyKSkgKyBzZWxmLm1lc3NhZ2UKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkb3dubG9hZGVkKHNlbGYpOgogICAgICAgIHJldHVybiBmb3JtYXRfc2l6ZShzZWxmLmluZGV4KQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRvd25sb2FkX3NwZWVkKHNlbGYpOgogICAgICAgICMgQXZvaWQgemVybyBkaXZpc2lvbiBlcnJvcnMuLi4KICAgICAgICBpZiBzZWxmLmF2ZyA9PSAwLjA6CiAgICAgICAgICAgIHJldHVybiAiLi4uIgogICAgICAgIHJldHVybiBmb3JtYXRfc2l6ZSgxIC8gc2VsZi5hdmcpICsgIi9zIgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByZXR0eV9ldGEoc2VsZik6CiAgICAgICAgaWYgc2VsZi5ldGE6CiAgICAgICAgICAgIHJldHVybiAiZXRhICVzIiAlIHNlbGYuZXRhX3RkCiAgICAgICAgcmV0dXJuICIiCgogICAgZGVmIGl0ZXIoc2VsZiwgaXQsIG49MSk6CiAgICAgICAgZm9yIHggaW4gaXQ6CiAgICAgICAgICAgIHlpZWxkIHgKICAgICAgICAgICAgc2VsZi5uZXh0KG4pCiAgICAgICAgc2VsZi5maW5pc2goKQoKCmNsYXNzIFdpbmRvd3NNaXhpbihvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICMgVGhlIFdpbmRvd3MgdGVybWluYWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgaGlkZS9zaG93IGN1cnNvciBBTlNJIGNvZGVzCiAgICAgICAgIyBldmVuIHdpdGggY29sb3JhbWEuIFNvIHdlJ2xsIGVuc3VyZSB0aGF0IGhpZGVfY3Vyc29yIGlzIEZhbHNlIG9uCiAgICAgICAgIyBXaW5kb3dzLgogICAgICAgICMgVGhpcyBjYWxsIG5lZHMgdG8gZ28gYmVmb3JlIHRoZSBzdXBlcigpIGNhbGwsIHNvIHRoYXQgaGlkZV9jdXJzb3IKICAgICAgICAjIGlzIHNldCBpbiB0aW1lLiBUaGUgYmFzZSBwcm9ncmVzcyBiYXIgY2xhc3Mgd3JpdGVzIHRoZSAiaGlkZSBjdXJzb3IiCiAgICAgICAgIyBjb2RlIHRvIHRoZSB0ZXJtaW5hbCBpbiBpdHMgaW5pdCwgc28gaWYgd2UgZG9uJ3Qgc2V0IHRoaXMgc29vbgogICAgICAgICMgZW5vdWdoLCB3ZSBnZXQgYSAiaGlkZSIgd2l0aCBubyBjb3JyZXNwb25kaW5nICJzaG93Ii4uLgogICAgICAgIGlmIFdJTkRPV1MgYW5kIHNlbGYuaGlkZV9jdXJzb3I6CiAgICAgICAgICAgIHNlbGYuaGlkZV9jdXJzb3IgPSBGYWxzZQoKICAgICAgICBzdXBlcihXaW5kb3dzTWl4aW4sIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKCiAgICAgICAgIyBDaGVjayBpZiB3ZSBhcmUgcnVubmluZyBvbiBXaW5kb3dzIGFuZCB3ZSBoYXZlIHRoZSBjb2xvcmFtYSBtb2R1bGUsCiAgICAgICAgIyBpZiB3ZSBkbyB0aGVuIHdyYXAgb3VyIGZpbGUgd2l0aCBpdC4KICAgICAgICBpZiBXSU5ET1dTIGFuZCBjb2xvcmFtYToKICAgICAgICAgICAgc2VsZi5maWxlID0gY29sb3JhbWEuQW5zaVRvV2luMzIoc2VsZi5maWxlKQogICAgICAgICAgICAjIFRoZSBwcm9ncmVzcyBjb2RlIGV4cGVjdHMgdG8gYmUgYWJsZSB0byBjYWxsIHNlbGYuZmlsZS5pc2F0dHkoKQogICAgICAgICAgICAjIGJ1dCB0aGUgY29sb3JhbWEuQW5zaVRvV2luMzIoKSBvYmplY3QgZG9lc24ndCBoYXZlIHRoYXQsIHNvIHdlJ2xsCiAgICAgICAgICAgICMgYWRkIGl0LgogICAgICAgICAgICBzZWxmLmZpbGUuaXNhdHR5ID0gbGFtYmRhOiBzZWxmLmZpbGUud3JhcHBlZC5pc2F0dHkoKQogICAgICAgICAgICAjIFRoZSBwcm9ncmVzcyBjb2RlIGV4cGVjdHMgdG8gYmUgYWJsZSB0byBjYWxsIHNlbGYuZmlsZS5mbHVzaCgpCiAgICAgICAgICAgICMgYnV0IHRoZSBjb2xvcmFtYS5BbnNpVG9XaW4zMigpIG9iamVjdCBkb2Vzbid0IGhhdmUgdGhhdCwgc28gd2UnbGwKICAgICAgICAgICAgIyBhZGQgaXQuCiAgICAgICAgICAgIHNlbGYuZmlsZS5mbHVzaCA9IGxhbWJkYTogc2VsZi5maWxlLndyYXBwZWQuZmx1c2goKQoKCmNsYXNzIERvd25sb2FkUHJvZ3Jlc3NCYXIoV2luZG93c01peGluLCBJbnRlcnJ1cHRpYmxlTWl4aW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgRG93bmxvYWRQcm9ncmVzc01peGluLCBfQmFzZUJhcik6CgogICAgZmlsZSA9IHN5cy5zdGRvdXQKICAgIG1lc3NhZ2UgPSAiJShwZXJjZW50KWQlJSIKICAgIHN1ZmZpeCA9ICIlKGRvd25sb2FkZWQpcyAlKGRvd25sb2FkX3NwZWVkKXMgJShwcmV0dHlfZXRhKXMiCgoKY2xhc3MgRG93bmxvYWRQcm9ncmVzc1NwaW5uZXIoV2luZG93c01peGluLCBJbnRlcnJ1cHRpYmxlTWl4aW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvd25sb2FkUHJvZ3Jlc3NNaXhpbiwgV3JpdGVsbk1peGluLCBTcGlubmVyKToKCiAgICBmaWxlID0gc3lzLnN0ZG91dAogICAgc3VmZml4ID0gIiUoZG93bmxvYWRlZClzICUoZG93bmxvYWRfc3BlZWQpcyIKCiAgICBkZWYgbmV4dF9waGFzZShzZWxmKToKICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAiX3BoYXNlciIpOgogICAgICAgICAgICBzZWxmLl9waGFzZXIgPSBpdGVydG9vbHMuY3ljbGUoc2VsZi5waGFzZXMpCiAgICAgICAgcmV0dXJuIG5leHQoc2VsZi5fcGhhc2VyKQoKICAgIGRlZiB1cGRhdGUoc2VsZik6CiAgICAgICAgbWVzc2FnZSA9IHNlbGYubWVzc2FnZSAlIHNlbGYKICAgICAgICBwaGFzZSA9IHNlbGYubmV4dF9waGFzZSgpCiAgICAgICAgc3VmZml4ID0gc2VsZi5zdWZmaXggJSBzZWxmCiAgICAgICAgbGluZSA9ICcnLmpvaW4oWwogICAgICAgICAgICBtZXNzYWdlLAogICAgICAgICAgICAiICIgaWYgbWVzc2FnZSBlbHNlICIiLAogICAgICAgICAgICBwaGFzZSwKICAgICAgICAgICAgIiAiIGlmIHN1ZmZpeCBlbHNlICIiLAogICAgICAgICAgICBzdWZmaXgsCiAgICAgICAgXSkKCiAgICAgICAgc2VsZi53cml0ZWxuKGxpbmUpCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIEdlbmVyaWMgInNvbWV0aGluZyBpcyBoYXBwZW5pbmciIHNwaW5uZXJzCiMKIyBXZSBkb24ndCBldmVuIHRyeSB1c2luZyBwcm9ncmVzcy5zcGlubmVyLlNwaW5uZXIgaGVyZSBiZWNhdXNlIGl0J3MgYWN0dWFsbHkKIyBzaW1wbGVyIHRvIHJlaW1wbGVtZW50IGZyb20gc2NyYXRjaCB0aGFuIHRvIGNvZXJjZSB0aGVpciBjb2RlIGludG8gZG9pbmcKIyB3aGF0IHdlIG5lZWQuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBoaWRkZW5fY3Vyc29yKGZpbGUpOgogICAgIyBUaGUgV2luZG93cyB0ZXJtaW5hbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBoaWRlL3Nob3cgY3Vyc29yIEFOU0kgY29kZXMsCiAgICAjIGV2ZW4gdmlhIGNvbG9yYW1hLiBTbyBkb24ndCBldmVuIHRyeS4KICAgIGlmIFdJTkRPV1M6CiAgICAgICAgeWllbGQKICAgICMgV2UgZG9uJ3Qgd2FudCB0byBjbHV0dGVyIHRoZSBvdXRwdXQgd2l0aCBjb250cm9sIGNoYXJhY3RlcnMgaWYgd2UncmUKICAgICMgd3JpdGluZyB0byBhIGZpbGUsIG9yIGlmIHRoZSB1c2VyIGlzIHJ1bm5pbmcgd2l0aCAtLXF1aWV0LgogICAgIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8zNDE4CiAgICBlbGlmIG5vdCBmaWxlLmlzYXR0eSgpIG9yIGxvZ2dlci5nZXRFZmZlY3RpdmVMZXZlbCgpID4gbG9nZ2luZy5JTkZPOgogICAgICAgIHlpZWxkCiAgICBlbHNlOgogICAgICAgIGZpbGUud3JpdGUoSElERV9DVVJTT1IpCiAgICAgICAgdHJ5OgogICAgICAgICAgICB5aWVsZAogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGZpbGUud3JpdGUoU0hPV19DVVJTT1IpCgoKY2xhc3MgUmF0ZUxpbWl0ZXIob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtaW5fdXBkYXRlX2ludGVydmFsX3NlY29uZHMpOgogICAgICAgIHNlbGYuX21pbl91cGRhdGVfaW50ZXJ2YWxfc2Vjb25kcyA9IG1pbl91cGRhdGVfaW50ZXJ2YWxfc2Vjb25kcwogICAgICAgIHNlbGYuX2xhc3RfdXBkYXRlID0gMAoKICAgIGRlZiByZWFkeShzZWxmKToKICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQogICAgICAgIGRlbHRhID0gbm93IC0gc2VsZi5fbGFzdF91cGRhdGUKICAgICAgICByZXR1cm4gZGVsdGEgPj0gc2VsZi5fbWluX3VwZGF0ZV9pbnRlcnZhbF9zZWNvbmRzCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHNlbGYuX2xhc3RfdXBkYXRlID0gdGltZS50aW1lKCkKCgpjbGFzcyBJbnRlcmFjdGl2ZVNwaW5uZXIob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlLCBmaWxlPU5vbmUsIHNwaW5fY2hhcnM9Ii1cXHwvIiwKICAgICAgICAgICAgICAgICAjIEVtcGlyaWNhbGx5LCA4IHVwZGF0ZXMvc2Vjb25kIGxvb2tzIG5pY2UKICAgICAgICAgICAgICAgICBtaW5fdXBkYXRlX2ludGVydmFsX3NlY29uZHM9MC4xMjUpOgogICAgICAgIHNlbGYuX21lc3NhZ2UgPSBtZXNzYWdlCiAgICAgICAgaWYgZmlsZSBpcyBOb25lOgogICAgICAgICAgICBmaWxlID0gc3lzLnN0ZG91dAogICAgICAgIHNlbGYuX2ZpbGUgPSBmaWxlCiAgICAgICAgc2VsZi5fcmF0ZV9saW1pdGVyID0gUmF0ZUxpbWl0ZXIobWluX3VwZGF0ZV9pbnRlcnZhbF9zZWNvbmRzKQogICAgICAgIHNlbGYuX2ZpbmlzaGVkID0gRmFsc2UKCiAgICAgICAgc2VsZi5fc3Bpbl9jeWNsZSA9IGl0ZXJ0b29scy5jeWNsZShzcGluX2NoYXJzKQoKICAgICAgICBzZWxmLl9maWxlLndyaXRlKCIgIiAqIGdldF9pbmRlbnRhdGlvbigpICsgc2VsZi5fbWVzc2FnZSArICIgLi4uICIpCiAgICAgICAgc2VsZi5fd2lkdGggPSAwCgogICAgZGVmIF93cml0ZShzZWxmLCBzdGF0dXMpOgogICAgICAgIGFzc2VydCBub3Qgc2VsZi5fZmluaXNoZWQKICAgICAgICAjIEVyYXNlIHdoYXQgd2Ugd3JvdGUgYmVmb3JlIGJ5IGJhY2tzcGFjaW5nIHRvIHRoZSBiZWdpbm5pbmcsIHdyaXRpbmcKICAgICAgICAjIHNwYWNlcyB0byBvdmVyd3JpdGUgdGhlIG9sZCB0ZXh0LCBhbmQgdGhlbiBiYWNrc3BhY2luZyBhZ2FpbgogICAgICAgIGJhY2t1cCA9ICJcYiIgKiBzZWxmLl93aWR0aAogICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoYmFja3VwICsgIiAiICogc2VsZi5fd2lkdGggKyBiYWNrdXApCiAgICAgICAgIyBOb3cgd2UgaGF2ZSBhIGJsYW5rIHNsYXRlIHRvIGFkZCBvdXIgc3RhdHVzCiAgICAgICAgc2VsZi5fZmlsZS53cml0ZShzdGF0dXMpCiAgICAgICAgc2VsZi5fd2lkdGggPSBsZW4oc3RhdHVzKQogICAgICAgIHNlbGYuX2ZpbGUuZmx1c2goKQogICAgICAgIHNlbGYuX3JhdGVfbGltaXRlci5yZXNldCgpCgogICAgZGVmIHNwaW4oc2VsZik6CiAgICAgICAgaWYgc2VsZi5fZmluaXNoZWQ6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIG5vdCBzZWxmLl9yYXRlX2xpbWl0ZXIucmVhZHkoKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5fd3JpdGUobmV4dChzZWxmLl9zcGluX2N5Y2xlKSkKCiAgICBkZWYgZmluaXNoKHNlbGYsIGZpbmFsX3N0YXR1cyk6CiAgICAgICAgaWYgc2VsZi5fZmluaXNoZWQ6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuX3dyaXRlKGZpbmFsX3N0YXR1cykKICAgICAgICBzZWxmLl9maWxlLndyaXRlKCJcbiIpCiAgICAgICAgc2VsZi5fZmlsZS5mbHVzaCgpCiAgICAgICAgc2VsZi5fZmluaXNoZWQgPSBUcnVlCgoKIyBVc2VkIGZvciBkdW1iIHRlcm1pbmFscywgbm9uLWludGVyYWN0aXZlIGluc3RhbGxzIChubyB0dHkpLCBldGMuCiMgV2Ugc3RpbGwgcHJpbnQgdXBkYXRlcyBvY2Nhc2lvbmFsbHkgKG9uY2UgZXZlcnkgNjAgc2Vjb25kcyBieSBkZWZhdWx0KSB0bwojIGFjdCBhcyBhIGtlZXAtYWxpdmUgZm9yIHN5c3RlbXMgbGlrZSBUcmF2aXMtQ0kgdGhhdCB0YWtlIGxhY2stb2Ytb3V0cHV0IGFzCiMgYW4gaW5kaWNhdGlvbiB0aGF0IGEgdGFzayBoYXMgZnJvemVuLgpjbGFzcyBOb25JbnRlcmFjdGl2ZVNwaW5uZXIob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlLCBtaW5fdXBkYXRlX2ludGVydmFsX3NlY29uZHM9NjApOgogICAgICAgIHNlbGYuX21lc3NhZ2UgPSBtZXNzYWdlCiAgICAgICAgc2VsZi5fZmluaXNoZWQgPSBGYWxzZQogICAgICAgIHNlbGYuX3JhdGVfbGltaXRlciA9IFJhdGVMaW1pdGVyKG1pbl91cGRhdGVfaW50ZXJ2YWxfc2Vjb25kcykKICAgICAgICBzZWxmLl91cGRhdGUoInN0YXJ0ZWQiKQoKICAgIGRlZiBfdXBkYXRlKHNlbGYsIHN0YXR1cyk6CiAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLl9maW5pc2hlZAogICAgICAgIHNlbGYuX3JhdGVfbGltaXRlci5yZXNldCgpCiAgICAgICAgbG9nZ2VyLmluZm8oIiVzOiAlcyIsIHNlbGYuX21lc3NhZ2UsIHN0YXR1cykKCiAgICBkZWYgc3BpbihzZWxmKToKICAgICAgICBpZiBzZWxmLl9maW5pc2hlZDoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgbm90IHNlbGYuX3JhdGVfbGltaXRlci5yZWFkeSgpOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLl91cGRhdGUoInN0aWxsIHJ1bm5pbmcuLi4iKQoKICAgIGRlZiBmaW5pc2goc2VsZiwgZmluYWxfc3RhdHVzKToKICAgICAgICBpZiBzZWxmLl9maW5pc2hlZDoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5fdXBkYXRlKCJmaW5pc2hlZCB3aXRoIHN0YXR1cyAnJXMnIiAlIChmaW5hbF9zdGF0dXMsKSkKICAgICAgICBzZWxmLl9maW5pc2hlZCA9IFRydWUKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgb3Blbl9zcGlubmVyKG1lc3NhZ2UpOgogICAgIyBJbnRlcmFjdGl2ZSBzcGlubmVyIGdvZXMgZGlyZWN0bHkgdG8gc3lzLnN0ZG91dCByYXRoZXIgdGhhbiBiZWluZyByb3V0ZWQKICAgICMgdGhyb3VnaCB0aGUgbG9nZ2luZyBzeXN0ZW0sIGJ1dCBpdCBhY3RzIGxpa2UgaXQgaGFzIGxldmVsIElORk8sCiAgICAjIGkuZS4gaXQncyBvbmx5IGRpc3BsYXllZCBpZiB3ZSdyZSBhdCBsZXZlbCBJTkZPIG9yIGJldHRlci4KICAgICMgTm9uLWludGVyYWN0aXZlIHNwaW5uZXIgZ29lcyB0aHJvdWdoIHRoZSBsb2dnaW5nIHN5c3RlbSwgc28gaXQgaXMgYWx3YXlzCiAgICAjIGluIHN5bmMgd2l0aCBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uCiAgICBpZiBzeXMuc3Rkb3V0LmlzYXR0eSgpIGFuZCBsb2dnZXIuZ2V0RWZmZWN0aXZlTGV2ZWwoKSA8PSBsb2dnaW5nLklORk86CiAgICAgICAgc3Bpbm5lciA9IEludGVyYWN0aXZlU3Bpbm5lcihtZXNzYWdlKQogICAgZWxzZToKICAgICAgICBzcGlubmVyID0gTm9uSW50ZXJhY3RpdmVTcGlubmVyKG1lc3NhZ2UpCiAgICB0cnk6CiAgICAgICAgd2l0aCBoaWRkZW5fY3Vyc29yKHN5cy5zdGRvdXQpOgogICAgICAgICAgICB5aWVsZCBzcGlubmVyCiAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CiAgICAgICAgc3Bpbm5lci5maW5pc2goImNhbmNlbGVkIikKICAgICAgICByYWlzZQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBzcGlubmVyLmZpbmlzaCgiZXJyb3IiKQogICAgICAgIHJhaXNlCiAgICBlbHNlOgogICAgICAgIHNwaW5uZXIuZmluaXNoKCJkb25lIikKUEsDBBQAAAAAAAAAIQDIVsVLVjAAAFYwAAAjAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC92Y3MvX19pbml0X18ucHkiIiJIYW5kbGVzIGFsbCBWQ1MgKHZlcnNpb24gY29udHJvbCkgc3VwcG9ydCIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGVycm5vCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgc2h1dGlsCmltcG9ydCBzeXMKCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJsbGliX3BhcnNlCgpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBCYWRDb21tYW5kCmZyb20gcGlwLnV0aWxzIGltcG9ydCAoZGlzcGxheV9wYXRoLCBiYWNrdXBfZGlyLCBjYWxsX3N1YnByb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgcm10cmVlLCBhc2tfcGF0aF9leGlzdHMpCgoKX19hbGxfXyA9IFsndmNzJywgJ2dldF9zcmNfcmVxdWlyZW1lbnQnXQoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIFZjc1N1cHBvcnQob2JqZWN0KToKICAgIF9yZWdpc3RyeSA9IHt9CiAgICBzY2hlbWVzID0gWydzc2gnLCAnZ2l0JywgJ2hnJywgJ2J6cicsICdzZnRwJywgJ3N2biddCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICMgUmVnaXN0ZXIgbW9yZSBzY2hlbWVzIHdpdGggdXJscGFyc2UgZm9yIHZhcmlvdXMgdmVyc2lvbiBjb250cm9sCiAgICAgICAgIyBzeXN0ZW1zCiAgICAgICAgdXJsbGliX3BhcnNlLnVzZXNfbmV0bG9jLmV4dGVuZChzZWxmLnNjaGVtZXMpCiAgICAgICAgIyBQeXRob24gPj0gMi43LjQsIDMuMyBkb2Vzbid0IGhhdmUgdXNlc19mcmFnbWVudAogICAgICAgIGlmIGdldGF0dHIodXJsbGliX3BhcnNlLCAndXNlc19mcmFnbWVudCcsIE5vbmUpOgogICAgICAgICAgICB1cmxsaWJfcGFyc2UudXNlc19mcmFnbWVudC5leHRlbmQoc2VsZi5zY2hlbWVzKQogICAgICAgIHN1cGVyKFZjc1N1cHBvcnQsIHNlbGYpLl9faW5pdF9fKCkKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3JlZ2lzdHJ5Ll9faXRlcl9fKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBiYWNrZW5kcyhzZWxmKToKICAgICAgICByZXR1cm4gbGlzdChzZWxmLl9yZWdpc3RyeS52YWx1ZXMoKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkaXJuYW1lcyhzZWxmKToKICAgICAgICByZXR1cm4gW2JhY2tlbmQuZGlybmFtZSBmb3IgYmFja2VuZCBpbiBzZWxmLmJhY2tlbmRzXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGFsbF9zY2hlbWVzKHNlbGYpOgogICAgICAgIHNjaGVtZXMgPSBbXQogICAgICAgIGZvciBiYWNrZW5kIGluIHNlbGYuYmFja2VuZHM6CiAgICAgICAgICAgIHNjaGVtZXMuZXh0ZW5kKGJhY2tlbmQuc2NoZW1lcykKICAgICAgICByZXR1cm4gc2NoZW1lcwoKICAgIGRlZiByZWdpc3RlcihzZWxmLCBjbHMpOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKGNscywgJ25hbWUnKToKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0Nhbm5vdCByZWdpc3RlciBWQ1MgJXMnLCBjbHMuX19uYW1lX18pCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIGNscy5uYW1lIG5vdCBpbiBzZWxmLl9yZWdpc3RyeToKICAgICAgICAgICAgc2VsZi5fcmVnaXN0cnlbY2xzLm5hbWVdID0gY2xzCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVnaXN0ZXJlZCBWQ1MgYmFja2VuZDogJXMnLCBjbHMubmFtZSkKCiAgICBkZWYgdW5yZWdpc3RlcihzZWxmLCBjbHM9Tm9uZSwgbmFtZT1Ob25lKToKICAgICAgICBpZiBuYW1lIGluIHNlbGYuX3JlZ2lzdHJ5OgogICAgICAgICAgICBkZWwgc2VsZi5fcmVnaXN0cnlbbmFtZV0KICAgICAgICBlbGlmIGNscyBpbiBzZWxmLl9yZWdpc3RyeS52YWx1ZXMoKToKICAgICAgICAgICAgZGVsIHNlbGYuX3JlZ2lzdHJ5W2Nscy5uYW1lXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdDYW5ub3QgdW5yZWdpc3RlciBiZWNhdXNlIG5vIGNsYXNzIG9yIG5hbWUgZ2l2ZW4nKQoKICAgIGRlZiBnZXRfYmFja2VuZF9uYW1lKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHZlcnNpb24gY29udHJvbCBiYWNrZW5kIGlmIGZvdW5kIGF0IGdpdmVuCiAgICAgICAgbG9jYXRpb24sIGUuZy4gdmNzLmdldF9iYWNrZW5kX25hbWUoJy9wYXRoL3RvL3Zjcy9jaGVja291dCcpCiAgICAgICAgIiIiCiAgICAgICAgZm9yIHZjX3R5cGUgaW4gc2VsZi5fcmVnaXN0cnkudmFsdWVzKCk6CiAgICAgICAgICAgIGlmIHZjX3R5cGUuY29udHJvbHNfbG9jYXRpb24obG9jYXRpb24pOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdEZXRlcm1pbmUgdGhhdCAlcyB1c2VzIFZDUzogJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLCB2Y190eXBlLm5hbWUpCiAgICAgICAgICAgICAgICByZXR1cm4gdmNfdHlwZS5uYW1lCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgZ2V0X2JhY2tlbmQoc2VsZiwgbmFtZSk6CiAgICAgICAgbmFtZSA9IG5hbWUubG93ZXIoKQogICAgICAgIGlmIG5hbWUgaW4gc2VsZi5fcmVnaXN0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZWdpc3RyeVtuYW1lXQoKICAgIGRlZiBnZXRfYmFja2VuZF9mcm9tX2xvY2F0aW9uKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICB2Y190eXBlID0gc2VsZi5nZXRfYmFja2VuZF9uYW1lKGxvY2F0aW9uKQogICAgICAgIGlmIHZjX3R5cGU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmdldF9iYWNrZW5kKHZjX3R5cGUpCiAgICAgICAgcmV0dXJuIE5vbmUKCgp2Y3MgPSBWY3NTdXBwb3J0KCkKCgpjbGFzcyBWZXJzaW9uQ29udHJvbChvYmplY3QpOgogICAgbmFtZSA9ICcnCiAgICBkaXJuYW1lID0gJycKICAgICMgTGlzdCBvZiBzdXBwb3J0ZWQgc2NoZW1lcyBmb3IgdGhpcyBWZXJzaW9uIENvbnRyb2wKICAgIHNjaGVtZXMgPSAoKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmw9Tm9uZSwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBzZWxmLnVybCA9IHVybAogICAgICAgIHN1cGVyKFZlcnNpb25Db250cm9sLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCgogICAgZGVmIF9pc19sb2NhbF9yZXBvc2l0b3J5KHNlbGYsIHJlcG8pOgogICAgICAgICIiIgogICAgICAgICAgIHBvc2l4IGFic29sdXRlIHBhdGhzIHN0YXJ0IHdpdGggb3MucGF0aC5zZXAsCiAgICAgICAgICAgd2luMzIgb25lcyBzdGFydCB3aXRoIGRyaXZlIChsaWtlIGM6XFxmb2xkZXIpCiAgICAgICAgIiIiCiAgICAgICAgZHJpdmUsIHRhaWwgPSBvcy5wYXRoLnNwbGl0ZHJpdmUocmVwbykKICAgICAgICByZXR1cm4gcmVwby5zdGFydHN3aXRoKG9zLnBhdGguc2VwKSBvciBkcml2ZQoKICAgICMgU2VlIGlzc3VlICMxMDgzIGZvciB3aHkgdGhpcyBtZXRob2Qgd2FzIGludHJvZHVjZWQ6CiAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMTA4MwogICAgZGVmIHRyYW5zbGF0ZV9lZ2dfc3VybmFtZShzZWxmLCBzdXJuYW1lKToKICAgICAgICAjIEZvciBleGFtcGxlLCBEamFuZ28gaGFzIGJyYW5jaGVzIG9mIHRoZSBmb3JtICJzdGFibGUvMS43LngiLgogICAgICAgIHJldHVybiBzdXJuYW1lLnJlcGxhY2UoJy8nLCAnXycpCgogICAgZGVmIGV4cG9ydChzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiCiAgICAgICAgRXhwb3J0IHRoZSByZXBvc2l0b3J5IGF0IHRoZSB1cmwgdG8gdGhlIGRlc3RpbmF0aW9uIGxvY2F0aW9uCiAgICAgICAgaS5lLiBvbmx5IGRvd25sb2FkIHRoZSBmaWxlcywgd2l0aG91dCB2Y3MgaW5mb3JtYXRpb25zCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBnZXRfdXJsX3JldihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHRoZSBjb3JyZWN0IHJlcG9zaXRvcnkgVVJMIGFuZCByZXZpc2lvbiBieSBwYXJzaW5nIHRoZSBnaXZlbgogICAgICAgIHJlcG9zaXRvcnkgVVJMCiAgICAgICAgIiIiCiAgICAgICAgZXJyb3JfbWVzc2FnZSA9ICgKICAgICAgICAgICAgIlNvcnJ5LCAnJXMnIGlzIGEgbWFsZm9ybWVkIFZDUyB1cmwuICIKICAgICAgICAgICAgIlRoZSBmb3JtYXQgaXMgPHZjcz4rPHByb3RvY29sPjovLzx1cmw+LCAiCiAgICAgICAgICAgICJlLmcuIHN2bitodHRwOi8vbXlyZXBvL3N2bi9NeUFwcCNlZ2c9TXlBcHAiCiAgICAgICAgKQogICAgICAgIGFzc2VydCAnKycgaW4gc2VsZi51cmwsIGVycm9yX21lc3NhZ2UgJSBzZWxmLnVybAogICAgICAgIHVybCA9IHNlbGYudXJsLnNwbGl0KCcrJywgMSlbMV0KICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksIGZyYWcgPSB1cmxsaWJfcGFyc2UudXJsc3BsaXQodXJsKQogICAgICAgIHJldiA9IE5vbmUKICAgICAgICBpZiAnQCcgaW4gcGF0aDoKICAgICAgICAgICAgcGF0aCwgcmV2ID0gcGF0aC5yc3BsaXQoJ0AnLCAxKQogICAgICAgIHVybCA9IHVybGxpYl9wYXJzZS51cmx1bnNwbGl0KChzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksICcnKSkKICAgICAgICByZXR1cm4gdXJsLCByZXYKCiAgICBkZWYgZ2V0X2luZm8oc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgKHVybCwgcmV2aXNpb24pLCB3aGVyZSBib3RoIGFyZSBzdHJpbmdzCiAgICAgICAgIiIiCiAgICAgICAgYXNzZXJ0IG5vdCBsb2NhdGlvbi5yc3RyaXAoJy8nKS5lbmRzd2l0aChzZWxmLmRpcm5hbWUpLCBcCiAgICAgICAgICAgICdCYWQgZGlyZWN0b3J5OiAlcycgJSBsb2NhdGlvbgogICAgICAgIHJldHVybiBzZWxmLmdldF91cmwobG9jYXRpb24pLCBzZWxmLmdldF9yZXZpc2lvbihsb2NhdGlvbikKCiAgICBkZWYgbm9ybWFsaXplX3VybChzZWxmLCB1cmwpOgogICAgICAgICIiIgogICAgICAgIE5vcm1hbGl6ZSBhIFVSTCBmb3IgY29tcGFyaXNvbiBieSB1bnF1b3RpbmcgaXQgYW5kIHJlbW92aW5nIGFueQogICAgICAgIHRyYWlsaW5nIHNsYXNoLgogICAgICAgICIiIgogICAgICAgIHJldHVybiB1cmxsaWJfcGFyc2UudW5xdW90ZSh1cmwpLnJzdHJpcCgnLycpCgogICAgZGVmIGNvbXBhcmVfdXJscyhzZWxmLCB1cmwxLCB1cmwyKToKICAgICAgICAiIiIKICAgICAgICBDb21wYXJlIHR3byByZXBvIFVSTHMgZm9yIGlkZW50aXR5LCBpZ25vcmluZyBpbmNpZGVudGFsIGRpZmZlcmVuY2VzLgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoc2VsZi5ub3JtYWxpemVfdXJsKHVybDEpID09IHNlbGYubm9ybWFsaXplX3VybCh1cmwyKSkKCiAgICBkZWYgb2J0YWluKHNlbGYsIGRlc3QpOgogICAgICAgICIiIgogICAgICAgIENhbGxlZCB3aGVuIGluc3RhbGxpbmcgb3IgdXBkYXRpbmcgYW4gZWRpdGFibGUgcGFja2FnZSwgdGFrZXMgdGhlCiAgICAgICAgc291cmNlIHBhdGggb2YgdGhlIGNoZWNrb3V0LgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgc3dpdGNoKHNlbGYsIGRlc3QsIHVybCwgcmV2X29wdGlvbnMpOgogICAgICAgICIiIgogICAgICAgIFN3aXRjaCB0aGUgcmVwbyBhdCBgYGRlc3RgYCB0byBwb2ludCB0byBgYFVSTGBgLgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgdXBkYXRlKHNlbGYsIGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICAiIiIKICAgICAgICBVcGRhdGUgYW4gYWxyZWFkeS1leGlzdGluZyByZXBvIHRvIHRoZSBnaXZlbiBgYHJldl9vcHRpb25zYGAuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBjaGVja192ZXJzaW9uKHNlbGYsIGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gVHJ1ZSBpZiB0aGUgdmVyc2lvbiBpcyBpZGVudGljYWwgdG8gd2hhdCBleGlzdHMgYW5kCiAgICAgICAgZG9lc24ndCBuZWVkIHRvIGJlIHVwZGF0ZWQuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBjaGVja19kZXN0aW5hdGlvbihzZWxmLCBkZXN0LCB1cmwsIHJldl9vcHRpb25zLCByZXZfZGlzcGxheSk6CiAgICAgICAgIiIiCiAgICAgICAgUHJlcGFyZSBhIGxvY2F0aW9uIHRvIHJlY2VpdmUgYSBjaGVja291dC9jbG9uZS4KCiAgICAgICAgUmV0dXJuIFRydWUgaWYgdGhlIGxvY2F0aW9uIGlzIHJlYWR5IGZvciAoYW5kIHJlcXVpcmVzKSBhCiAgICAgICAgY2hlY2tvdXQvY2xvbmUsIEZhbHNlIG90aGVyd2lzZS4KICAgICAgICAiIiIKICAgICAgICBjaGVja291dCA9IFRydWUKICAgICAgICBwcm9tcHQgPSBGYWxzZQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRlc3QpOgogICAgICAgICAgICBjaGVja291dCA9IEZhbHNlCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihkZXN0LCBzZWxmLmRpcm5hbWUpKToKICAgICAgICAgICAgICAgIGV4aXN0aW5nX3VybCA9IHNlbGYuZ2V0X3VybChkZXN0KQogICAgICAgICAgICAgICAgaWYgc2VsZi5jb21wYXJlX3VybHMoZXhpc3RpbmdfdXJsLCB1cmwpOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAgICAgJyVzIGluICVzIGV4aXN0cywgYW5kIGhhcyBjb3JyZWN0IFVSTCAoJXMpJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvX25hbWUudGl0bGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGRlc3QpLAogICAgICAgICAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNoZWNrX3ZlcnNpb24oZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVcGRhdGluZyAlcyAlcyVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChkZXN0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2X2Rpc3BsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGUoZGVzdCwgcmV2X29wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2tpcHBpbmcgYmVjYXVzZSBhbHJlYWR5IHVwLXRvLWRhdGUuJykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICclcyAlcyBpbiAlcyBleGlzdHMgd2l0aCBVUkwgJXMnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoZGVzdCksCiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nX3VybCwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgcHJvbXB0ID0gKCcocyl3aXRjaCwgKGkpZ25vcmUsICh3KWlwZSwgKGIpYWNrdXAgJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdzJywgJ2knLCAndycsICdiJykpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAnRGlyZWN0b3J5ICVzIGFscmVhZHkgZXhpc3RzLCBhbmQgaXMgbm90IGEgJXMgJXMuJywKICAgICAgICAgICAgICAgICAgICBkZXN0LAogICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZSwKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcG9fbmFtZSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHByb21wdCA9ICgnKGkpZ25vcmUsICh3KWlwZSwgKGIpYWNrdXAgJywgKCdpJywgJ3cnLCAnYicpKQogICAgICAgIGlmIHByb21wdDoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAnVGhlIHBsYW4gaXMgdG8gaW5zdGFsbCB0aGUgJXMgcmVwb3NpdG9yeSAlcycsCiAgICAgICAgICAgICAgICBzZWxmLm5hbWUsCiAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVzcG9uc2UgPSBhc2tfcGF0aF9leGlzdHMoJ1doYXQgdG8gZG8/ICAlcycgJSBwcm9tcHRbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21wdFsxXSkKCiAgICAgICAgICAgIGlmIHJlc3BvbnNlID09ICdzJzoKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICdTd2l0Y2hpbmcgJXMgJXMgdG8gJXMlcycsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvX25hbWUsCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGRlc3QpLAogICAgICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgICAgICAgICByZXZfZGlzcGxheSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHNlbGYuc3dpdGNoKGRlc3QsIHVybCwgcmV2X29wdGlvbnMpCiAgICAgICAgICAgIGVsaWYgcmVzcG9uc2UgPT0gJ2knOgogICAgICAgICAgICAgICAgIyBkbyBub3RoaW5nCiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIGVsaWYgcmVzcG9uc2UgPT0gJ3cnOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0RlbGV0aW5nICVzJywgZGlzcGxheV9wYXRoKGRlc3QpKQogICAgICAgICAgICAgICAgcm10cmVlKGRlc3QpCiAgICAgICAgICAgICAgICBjaGVja291dCA9IFRydWUKICAgICAgICAgICAgZWxpZiByZXNwb25zZSA9PSAnYic6CiAgICAgICAgICAgICAgICBkZXN0X2RpciA9IGJhY2t1cF9kaXIoZGVzdCkKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICdCYWNraW5nIHVwICVzIHRvICVzJywgZGlzcGxheV9wYXRoKGRlc3QpLCBkZXN0X2RpciwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHNodXRpbC5tb3ZlKGRlc3QsIGRlc3RfZGlyKQogICAgICAgICAgICAgICAgY2hlY2tvdXQgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgcmVzcG9uc2UgPT0gJ2EnOgogICAgICAgICAgICAgICAgc3lzLmV4aXQoLTEpCiAgICAgICAgcmV0dXJuIGNoZWNrb3V0CgogICAgZGVmIHVucGFjayhzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiCiAgICAgICAgQ2xlYW4gdXAgY3VycmVudCBsb2NhdGlvbiBhbmQgZG93bmxvYWQgdGhlIHVybCByZXBvc2l0b3J5CiAgICAgICAgKGFuZCB2Y3MgaW5mb3MpIGludG8gbG9jYXRpb24KICAgICAgICAiIiIKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhsb2NhdGlvbik6CiAgICAgICAgICAgIHJtdHJlZShsb2NhdGlvbikKICAgICAgICBzZWxmLm9idGFpbihsb2NhdGlvbikKCiAgICBkZWYgZ2V0X3NyY19yZXF1aXJlbWVudChzZWxmLCBkaXN0LCBsb2NhdGlvbik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcmVxdWlyZW1lbnQgbmVlZGVkIHRvCiAgICAgICAgcmVkb3dubG9hZCB0aGUgZmlsZXMgY3VycmVudGx5IHByZXNlbnQgaW4gbG9jYXRpb24sIHNvbWV0aGluZwogICAgICAgIGxpa2U6CiAgICAgICAgICB7cmVwb3NpdG9yeV91cmx9QHtyZXZpc2lvbn0jZWdnPXtwcm9qZWN0X25hbWV9LXt2ZXJzaW9uX2lkZW50aWZpZXJ9CiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBnZXRfdXJsKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIHVybCB1c2VkIGF0IGxvY2F0aW9uCiAgICAgICAgVXNlZCBpbiBnZXRfaW5mbyBvciBjaGVja19kZXN0aW5hdGlvbgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgZ2V0X3JldmlzaW9uKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIGN1cnJlbnQgcmV2aXNpb24gb2YgdGhlIGZpbGVzIGF0IGxvY2F0aW9uCiAgICAgICAgVXNlZCBpbiBnZXRfaW5mbwogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgcnVuX2NvbW1hbmQoc2VsZiwgY21kLCBzaG93X3N0ZG91dD1UcnVlLCBjd2Q9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBvbl9yZXR1cm5jb2RlPSdyYWlzZScsCiAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9kZXNjPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFfZW52aXJvbj1Ob25lLCBzcGlubmVyPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFJ1biBhIFZDUyBzdWJjb21tYW5kCiAgICAgICAgVGhpcyBpcyBzaW1wbHkgYSB3cmFwcGVyIGFyb3VuZCBjYWxsX3N1YnByb2Nlc3MgdGhhdCBhZGRzIHRoZSBWQ1MKICAgICAgICBjb21tYW5kIG5hbWUsIGFuZCBjaGVja3MgdGhhdCB0aGUgVkNTIGlzIGF2YWlsYWJsZQogICAgICAgICIiIgogICAgICAgIGNtZCA9IFtzZWxmLm5hbWVdICsgY21kCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gY2FsbF9zdWJwcm9jZXNzKGNtZCwgc2hvd19zdGRvdXQsIGN3ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbl9yZXR1cm5jb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRfZGVzYywgZXh0cmFfZW52aXJvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGlubmVyKQogICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CiAgICAgICAgICAgICMgZXJybm8uRU5PRU5UID0gbm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQogICAgICAgICAgICAjIEluIG90aGVyIHdvcmRzLCB0aGUgVkNTIGV4ZWN1dGFibGUgaXNuJ3QgYXZhaWxhYmxlCiAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5PRU5UOgogICAgICAgICAgICAgICAgcmFpc2UgQmFkQ29tbWFuZCgnQ2Fubm90IGZpbmQgY29tbWFuZCAlcicgJSBzZWxmLm5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSAgIyByZS1yYWlzZSBleGNlcHRpb24gaWYgYSBkaWZmZXJlbnQgZXJyb3Igb2NjdXJyZWQKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBjb250cm9sc19sb2NhdGlvbihjbHMsIGxvY2F0aW9uKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayBpZiBhIGxvY2F0aW9uIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHZjcy4KICAgICAgICBJdCBpcyBtZWFudCB0byBiZSBvdmVycmlkZGVuIHRvIGltcGxlbWVudCBzbWFydGVyIGRldGVjdGlvbgogICAgICAgIG1lY2hhbmlzbXMgZm9yIHNwZWNpZmljIHZjcy4KICAgICAgICAiIiIKICAgICAgICBsb2dnZXIuZGVidWcoJ0NoZWNraW5nIGluICVzIGZvciAlcyAoJXMpLi4uJywKICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIGNscy5kaXJuYW1lLCBjbHMubmFtZSkKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGxvY2F0aW9uLCBjbHMuZGlybmFtZSkKICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMocGF0aCkKCgpkZWYgZ2V0X3NyY19yZXF1aXJlbWVudChkaXN0LCBsb2NhdGlvbik6CiAgICB2ZXJzaW9uX2NvbnRyb2wgPSB2Y3MuZ2V0X2JhY2tlbmRfZnJvbV9sb2NhdGlvbihsb2NhdGlvbikKICAgIGlmIHZlcnNpb25fY29udHJvbDoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uX2NvbnRyb2woKS5nZXRfc3JjX3JlcXVpcmVtZW50KGRpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKQogICAgICAgIGV4Y2VwdCBCYWRDb21tYW5kOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICdjYW5ub3QgZGV0ZXJtaW5lIHZlcnNpb24gb2YgZWRpdGFibGUgc291cmNlIGluICVzICcKICAgICAgICAgICAgICAgICcoJXMgY29tbWFuZCBub3QgZm91bmQgaW4gcGF0aCknLAogICAgICAgICAgICAgICAgbG9jYXRpb24sCiAgICAgICAgICAgICAgICB2ZXJzaW9uX2NvbnRyb2wubmFtZSwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gZGlzdC5hc19yZXF1aXJlbWVudCgpCiAgICBsb2dnZXIud2FybmluZygKICAgICAgICAnY2Fubm90IGRldGVybWluZSB2ZXJzaW9uIG9mIGVkaXRhYmxlIHNvdXJjZSBpbiAlcyAoaXMgbm90IFNWTiAnCiAgICAgICAgJ2NoZWNrb3V0LCBHaXQgY2xvbmUsIE1lcmN1cmlhbCBjbG9uZSBvciBCYXphYXIgYnJhbmNoKScsCiAgICAgICAgbG9jYXRpb24sCiAgICApCiAgICByZXR1cm4gZGlzdC5hc19yZXF1aXJlbWVudCgpClBLAwQUAAAAAAAAACEA+8DMxdsOAADbDgAAIQAAAHB5cGlfX3BpcF85XzBfMy9waXAvdmNzL2JhemFhci5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHRlbXBmaWxlCgojIFRPRE86IEdldCB0aGlzIGludG8gc2l4Lm1vdmVzLnVybGxpYi5wYXJzZQp0cnk6CiAgICBmcm9tIHVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJsbGliX3BhcnNlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydCB1cmxwYXJzZSBhcyB1cmxsaWJfcGFyc2UKCmZyb20gcGlwLnV0aWxzIGltcG9ydCBybXRyZWUsIGRpc3BsYXlfcGF0aApmcm9tIHBpcC52Y3MgaW1wb3J0IHZjcywgVmVyc2lvbkNvbnRyb2wKZnJvbSBwaXAuZG93bmxvYWQgaW1wb3J0IHBhdGhfdG9fdXJsCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgQmF6YWFyKFZlcnNpb25Db250cm9sKToKICAgIG5hbWUgPSAnYnpyJwogICAgZGlybmFtZSA9ICcuYnpyJwogICAgcmVwb19uYW1lID0gJ2JyYW5jaCcKICAgIHNjaGVtZXMgPSAoCiAgICAgICAgJ2J6cicsICdienIraHR0cCcsICdienIraHR0cHMnLCAnYnpyK3NzaCcsICdienIrc2Z0cCcsICdienIrZnRwJywKICAgICAgICAnYnpyK2xwJywKICAgICkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsPU5vbmUsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc3VwZXIoQmF6YWFyLCBzZWxmKS5fX2luaXRfXyh1cmwsICphcmdzLCAqKmt3YXJncykKICAgICAgICAjIFB5dGhvbiA+PSAyLjcuNCwgMy4zIGRvZXNuJ3QgaGF2ZSB1c2VzX2ZyYWdtZW50IG9yIG5vbl9oaWVyYXJjaGljYWwKICAgICAgICAjIFJlZ2lzdGVyIGxwIGJ1dCBkbyBub3QgZXhwb3NlIGFzIGEgc2NoZW1lIHRvIHN1cHBvcnQgYnpyK2xwLgogICAgICAgIGlmIGdldGF0dHIodXJsbGliX3BhcnNlLCAndXNlc19mcmFnbWVudCcsIE5vbmUpOgogICAgICAgICAgICB1cmxsaWJfcGFyc2UudXNlc19mcmFnbWVudC5leHRlbmQoWydscCddKQogICAgICAgICAgICB1cmxsaWJfcGFyc2Uubm9uX2hpZXJhcmNoaWNhbC5leHRlbmQoWydscCddKQoKICAgIGRlZiBleHBvcnQoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIgogICAgICAgIEV4cG9ydCB0aGUgQmF6YWFyIHJlcG9zaXRvcnkgYXQgdGhlIHVybCB0byB0aGUgZGVzdGluYXRpb24gbG9jYXRpb24KICAgICAgICAiIiIKICAgICAgICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoJy1leHBvcnQnLCAncGlwLScpCiAgICAgICAgc2VsZi51bnBhY2sodGVtcF9kaXIpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobG9jYXRpb24pOgogICAgICAgICAgICAjIFJlbW92ZSB0aGUgbG9jYXRpb24gdG8gbWFrZSBzdXJlIEJhemFhciBjYW4gZXhwb3J0IGl0IGNvcnJlY3RseQogICAgICAgICAgICBybXRyZWUobG9jYXRpb24pCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsnZXhwb3J0JywgbG9jYXRpb25dLCBjd2Q9dGVtcF9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgcm10cmVlKHRlbXBfZGlyKQoKICAgIGRlZiBzd2l0Y2goc2VsZiwgZGVzdCwgdXJsLCByZXZfb3B0aW9ucyk6CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ3N3aXRjaCcsIHVybF0sIGN3ZD1kZXN0KQoKICAgIGRlZiB1cGRhdGUoc2VsZiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydwdWxsJywgJy1xJ10gKyByZXZfb3B0aW9ucywgY3dkPWRlc3QpCgogICAgZGVmIG9idGFpbihzZWxmLCBkZXN0KToKICAgICAgICB1cmwsIHJldiA9IHNlbGYuZ2V0X3VybF9yZXYoKQogICAgICAgIGlmIHJldjoKICAgICAgICAgICAgcmV2X29wdGlvbnMgPSBbJy1yJywgcmV2XQogICAgICAgICAgICByZXZfZGlzcGxheSA9ICcgKHRvIHJldmlzaW9uICVzKScgJSByZXYKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXZfb3B0aW9ucyA9IFtdCiAgICAgICAgICAgIHJldl9kaXNwbGF5ID0gJycKICAgICAgICBpZiBzZWxmLmNoZWNrX2Rlc3RpbmF0aW9uKGRlc3QsIHVybCwgcmV2X29wdGlvbnMsIHJldl9kaXNwbGF5KToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAnQ2hlY2tpbmcgb3V0ICVzJXMgdG8gJXMnLAogICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAgICAgcmV2X2Rpc3BsYXksCiAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoZGVzdCksCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ2JyYW5jaCcsICctcSddICsgcmV2X29wdGlvbnMgKyBbdXJsLCBkZXN0XSkKCiAgICBkZWYgZ2V0X3VybF9yZXYoc2VsZik6CiAgICAgICAgIyBob3RmaXggdGhlIFVSTCBzY2hlbWUgYWZ0ZXIgcmVtb3ZpbmcgYnpyKyBmcm9tIGJ6citzc2g6Ly8gcmVhZGQgaXQKICAgICAgICB1cmwsIHJldiA9IHN1cGVyKEJhemFhciwgc2VsZikuZ2V0X3VybF9yZXYoKQogICAgICAgIGlmIHVybC5zdGFydHN3aXRoKCdzc2g6Ly8nKToKICAgICAgICAgICAgdXJsID0gJ2J6cisnICsgdXJsCiAgICAgICAgcmV0dXJuIHVybCwgcmV2CgogICAgZGVmIGdldF91cmwoc2VsZiwgbG9jYXRpb24pOgogICAgICAgIHVybHMgPSBzZWxmLnJ1bl9jb21tYW5kKFsnaW5mbyddLCBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPWxvY2F0aW9uKQogICAgICAgIGZvciBsaW5lIGluIHVybHMuc3BsaXRsaW5lcygpOgogICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgIGZvciB4IGluICgnY2hlY2tvdXQgb2YgYnJhbmNoOiAnLAogICAgICAgICAgICAgICAgICAgICAgJ3BhcmVudCBicmFuY2g6ICcpOgogICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKHgpOgogICAgICAgICAgICAgICAgICAgIHJlcG8gPSBsaW5lLnNwbGl0KHgpWzFdCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5faXNfbG9jYWxfcmVwb3NpdG9yeShyZXBvKToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGhfdG9fdXJsKHJlcG8pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcG8KICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBnZXRfcmV2aXNpb24oc2VsZiwgbG9jYXRpb24pOgogICAgICAgIHJldmlzaW9uID0gc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgWydyZXZubyddLCBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPWxvY2F0aW9uKQogICAgICAgIHJldHVybiByZXZpc2lvbi5zcGxpdGxpbmVzKClbLTFdCgogICAgZGVmIGdldF9zcmNfcmVxdWlyZW1lbnQoc2VsZiwgZGlzdCwgbG9jYXRpb24pOgogICAgICAgIHJlcG8gPSBzZWxmLmdldF91cmwobG9jYXRpb24pCiAgICAgICAgaWYgbm90IHJlcG86CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgaWYgbm90IHJlcG8ubG93ZXIoKS5zdGFydHN3aXRoKCdienI6Jyk6CiAgICAgICAgICAgIHJlcG8gPSAnYnpyKycgKyByZXBvCiAgICAgICAgZWdnX3Byb2plY3RfbmFtZSA9IGRpc3QuZWdnX25hbWUoKS5zcGxpdCgnLScsIDEpWzBdCiAgICAgICAgY3VycmVudF9yZXYgPSBzZWxmLmdldF9yZXZpc2lvbihsb2NhdGlvbikKICAgICAgICByZXR1cm4gJyVzQCVzI2VnZz0lcycgJSAocmVwbywgY3VycmVudF9yZXYsIGVnZ19wcm9qZWN0X25hbWUpCgogICAgZGVmIGNoZWNrX3ZlcnNpb24oc2VsZiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgICIiIkFsd2F5cyBhc3N1bWUgdGhlIHZlcnNpb25zIGRvbid0IG1hdGNoIiIiCiAgICAgICAgcmV0dXJuIEZhbHNlCgoKdmNzLnJlZ2lzdGVyKEJhemFhcikKUEsDBBQAAAAAAAAAIQAovt4wvSsAAL0rAAAeAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC92Y3MvZ2l0LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgb3MucGF0aAoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBzYW1lZmlsZQpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBCYWRDb21tYW5kCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJsbGliX3BhcnNlCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcmVxdWVzdCBhcyB1cmxsaWJfcmVxdWVzdApmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZy52ZXJzaW9uIGltcG9ydCBwYXJzZSBhcyBwYXJzZV92ZXJzaW9uCgpmcm9tIHBpcC51dGlscyBpbXBvcnQgZGlzcGxheV9wYXRoLCBybXRyZWUKZnJvbSBwaXAudmNzIGltcG9ydCB2Y3MsIFZlcnNpb25Db250cm9sCgoKdXJsc3BsaXQgPSB1cmxsaWJfcGFyc2UudXJsc3BsaXQKdXJsdW5zcGxpdCA9IHVybGxpYl9wYXJzZS51cmx1bnNwbGl0CgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgR2l0KFZlcnNpb25Db250cm9sKToKICAgIG5hbWUgPSAnZ2l0JwogICAgZGlybmFtZSA9ICcuZ2l0JwogICAgcmVwb19uYW1lID0gJ2Nsb25lJwogICAgc2NoZW1lcyA9ICgKICAgICAgICAnZ2l0JywgJ2dpdCtodHRwJywgJ2dpdCtodHRwcycsICdnaXQrc3NoJywgJ2dpdCtnaXQnLCAnZ2l0K2ZpbGUnLAogICAgKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmw9Tm9uZSwgKmFyZ3MsICoqa3dhcmdzKToKCiAgICAgICAgIyBXb3JrcyBhcm91bmQgYW4gYXBwYXJlbnQgR2l0IGJ1ZwogICAgICAgICMgKHNlZSBodHRwOi8vYXJ0aWNsZS5nbWFuZS5vcmcvZ21hbmUuY29tcC52ZXJzaW9uLWNvbnRyb2wuZ2l0LzE0NjUwMCkKICAgICAgICBpZiB1cmw6CiAgICAgICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQgPSB1cmxzcGxpdCh1cmwpCiAgICAgICAgICAgIGlmIHNjaGVtZS5lbmRzd2l0aCgnZmlsZScpOgogICAgICAgICAgICAgICAgaW5pdGlhbF9zbGFzaGVzID0gcGF0aFs6LWxlbihwYXRoLmxzdHJpcCgnLycpKV0KICAgICAgICAgICAgICAgIG5ld3BhdGggPSAoCiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF9zbGFzaGVzICsKICAgICAgICAgICAgICAgICAgICB1cmxsaWJfcmVxdWVzdC51cmwycGF0aG5hbWUocGF0aCkKICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnXFwnLCAnLycpLmxzdHJpcCgnLycpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB1cmwgPSB1cmx1bnNwbGl0KChzY2hlbWUsIG5ldGxvYywgbmV3cGF0aCwgcXVlcnksIGZyYWdtZW50KSkKICAgICAgICAgICAgICAgIGFmdGVyX3BsdXMgPSBzY2hlbWUuZmluZCgnKycpICsgMQogICAgICAgICAgICAgICAgdXJsID0gc2NoZW1lWzphZnRlcl9wbHVzXSArIHVybHVuc3BsaXQoCiAgICAgICAgICAgICAgICAgICAgKHNjaGVtZVthZnRlcl9wbHVzOl0sIG5ldGxvYywgbmV3cGF0aCwgcXVlcnksIGZyYWdtZW50KSwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgc3VwZXIoR2l0LCBzZWxmKS5fX2luaXRfXyh1cmwsICphcmdzLCAqKmt3YXJncykKCiAgICBkZWYgZ2V0X2dpdF92ZXJzaW9uKHNlbGYpOgogICAgICAgIFZFUlNJT05fUEZYID0gJ2dpdCB2ZXJzaW9uICcKICAgICAgICB2ZXJzaW9uID0gc2VsZi5ydW5fY29tbWFuZChbJ3ZlcnNpb24nXSwgc2hvd19zdGRvdXQ9RmFsc2UpCiAgICAgICAgaWYgdmVyc2lvbi5zdGFydHN3aXRoKFZFUlNJT05fUEZYKToKICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb25bbGVuKFZFUlNJT05fUEZYKTpdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdmVyc2lvbiA9ICcnCiAgICAgICAgIyBnZXQgZmlyc3QgMyBwb3NpdGlvbnMgb2YgdGhlIGdpdCB2ZXJzaW9uIGJlY2FzdWUKICAgICAgICAjIG9uIHdpbmRvd3MgaXQgaXMgeC55Lnoud2luZG93cy50LCBhbmQgdGhpcyBwYXJzZXMgYXMKICAgICAgICAjIExlZ2FjeVZlcnNpb24gd2hpY2ggYWx3YXlzIHNtYWxsZXIgdGhhbiBhIFZlcnNpb24uCiAgICAgICAgdmVyc2lvbiA9ICcuJy5qb2luKHZlcnNpb24uc3BsaXQoJy4nKVs6M10pCiAgICAgICAgcmV0dXJuIHBhcnNlX3ZlcnNpb24odmVyc2lvbikKCiAgICBkZWYgZXhwb3J0KHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiJFeHBvcnQgdGhlIEdpdCByZXBvc2l0b3J5IGF0IHRoZSB1cmwgdG8gdGhlIGRlc3RpbmF0aW9uIGxvY2F0aW9uIiIiCiAgICAgICAgdGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCctZXhwb3J0JywgJ3BpcC0nKQogICAgICAgIHNlbGYudW5wYWNrKHRlbXBfZGlyKQogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgbm90IGxvY2F0aW9uLmVuZHN3aXRoKCcvJyk6CiAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IGxvY2F0aW9uICsgJy8nCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgICAgICBbJ2NoZWNrb3V0LWluZGV4JywgJy1hJywgJy1mJywgJy0tcHJlZml4JywgbG9jYXRpb25dLAogICAgICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UsIGN3ZD10ZW1wX2RpcikKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBybXRyZWUodGVtcF9kaXIpCgogICAgZGVmIGNoZWNrX3Jldl9vcHRpb25zKHNlbGYsIHJldiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgICIiIkNoZWNrIHRoZSByZXZpc2lvbiBvcHRpb25zIGJlZm9yZSBjaGVja291dCB0byBjb21wZW5zYXRlIHRoYXQgdGFncwogICAgICAgIGFuZCBicmFuY2hlcyBtYXkgbmVlZCBvcmlnaW4vIGFzIGEgcHJlZml4LgogICAgICAgIFJldHVybnMgdGhlIFNIQTEgb2YgdGhlIGJyYW5jaCBvciB0YWcgaWYgZm91bmQuCiAgICAgICAgIiIiCiAgICAgICAgcmV2aXNpb25zID0gc2VsZi5nZXRfc2hvcnRfcmVmcyhkZXN0KQoKICAgICAgICBvcmlnaW5fcmV2ID0gJ29yaWdpbi8lcycgJSByZXYKICAgICAgICBpZiBvcmlnaW5fcmV2IGluIHJldmlzaW9uczoKICAgICAgICAgICAgIyByZW1vdGUgYnJhbmNoCiAgICAgICAgICAgIHJldHVybiBbcmV2aXNpb25zW29yaWdpbl9yZXZdXQogICAgICAgIGVsaWYgcmV2IGluIHJldmlzaW9uczoKICAgICAgICAgICAgIyBhIGxvY2FsIHRhZyBvciBicmFuY2ggbmFtZQogICAgICAgICAgICByZXR1cm4gW3JldmlzaW9uc1tyZXZdXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBmaW5kIGEgdGFnIG9yIGJyYW5jaCAnJXMnLCBhc3N1bWluZyBjb21taXQuIiwgcmV2LAogICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybiByZXZfb3B0aW9ucwoKICAgIGRlZiBjaGVja192ZXJzaW9uKHNlbGYsIGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICAiIiIKICAgICAgICBDb21wYXJlIHRoZSBjdXJyZW50IHNoYSB0byB0aGUgcmVmLiByZWYgbWF5IGJlIGEgYnJhbmNoIG9yIHRhZyBuYW1lLAogICAgICAgIGJ1dCBjdXJyZW50IHJldiB3aWxsIGFsd2F5cyBwb2ludCB0byBhIHNoYS4gVGhpcyBtZWFucyB0aGF0IGEgYnJhbmNoCiAgICAgICAgb3IgdGFnIHdpbGwgbmV2ZXIgY29tcGFyZSBhcyBUcnVlLiBTbyB0aGlzIHVsdGltYXRlbHkgb25seSBtYXRjaGVzCiAgICAgICAgYWdhaW5zdCBleGFjdCBzaGFzLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLmdldF9yZXZpc2lvbihkZXN0KS5zdGFydHN3aXRoKHJldl9vcHRpb25zWzBdKQoKICAgIGRlZiBzd2l0Y2goc2VsZiwgZGVzdCwgdXJsLCByZXZfb3B0aW9ucyk6CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ2NvbmZpZycsICdyZW1vdGUub3JpZ2luLnVybCcsIHVybF0sIGN3ZD1kZXN0KQogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydjaGVja291dCcsICctcSddICsgcmV2X29wdGlvbnMsIGN3ZD1kZXN0KQoKICAgICAgICBzZWxmLnVwZGF0ZV9zdWJtb2R1bGVzKGRlc3QpCgogICAgZGVmIHVwZGF0ZShzZWxmLCBkZXN0LCByZXZfb3B0aW9ucyk6CiAgICAgICAgIyBGaXJzdCBmZXRjaCBjaGFuZ2VzIGZyb20gdGhlIGRlZmF1bHQgcmVtb3RlCiAgICAgICAgaWYgc2VsZi5nZXRfZ2l0X3ZlcnNpb24oKSA+PSBwYXJzZV92ZXJzaW9uKCcxLjkuMCcpOgogICAgICAgICAgICAjIGZldGNoIHRhZ3MgaW4gYWRkaXRpb24gdG8gZXZlcnl0aGluZyBlbHNlCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydmZXRjaCcsICctcScsICctLXRhZ3MnXSwgY3dkPWRlc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ2ZldGNoJywgJy1xJ10sIGN3ZD1kZXN0KQogICAgICAgICMgVGhlbiByZXNldCB0byB3YW50ZWQgcmV2aXNpb24gKG1heWJlIGV2ZW4gb3JpZ2luL21hc3RlcikKICAgICAgICBpZiByZXZfb3B0aW9uczoKICAgICAgICAgICAgcmV2X29wdGlvbnMgPSBzZWxmLmNoZWNrX3Jldl9vcHRpb25zKAogICAgICAgICAgICAgICAgcmV2X29wdGlvbnNbMF0sIGRlc3QsIHJldl9vcHRpb25zLAogICAgICAgICAgICApCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ3Jlc2V0JywgJy0taGFyZCcsICctcSddICsgcmV2X29wdGlvbnMsIGN3ZD1kZXN0KQogICAgICAgICM6IHVwZGF0ZSBzdWJtb2R1bGVzCiAgICAgICAgc2VsZi51cGRhdGVfc3VibW9kdWxlcyhkZXN0KQoKICAgIGRlZiBvYnRhaW4oc2VsZiwgZGVzdCk6CiAgICAgICAgdXJsLCByZXYgPSBzZWxmLmdldF91cmxfcmV2KCkKICAgICAgICBpZiByZXY6CiAgICAgICAgICAgIHJldl9vcHRpb25zID0gW3Jldl0KICAgICAgICAgICAgcmV2X2Rpc3BsYXkgPSAnICh0byAlcyknICUgcmV2CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV2X29wdGlvbnMgPSBbJ29yaWdpbi9tYXN0ZXInXQogICAgICAgICAgICByZXZfZGlzcGxheSA9ICcnCiAgICAgICAgaWYgc2VsZi5jaGVja19kZXN0aW5hdGlvbihkZXN0LCB1cmwsIHJldl9vcHRpb25zLCByZXZfZGlzcGxheSk6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgJ0Nsb25pbmcgJXMlcyB0byAlcycsIHVybCwgcmV2X2Rpc3BsYXksIGRpc3BsYXlfcGF0aChkZXN0KSwKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsnY2xvbmUnLCAnLXEnLCB1cmwsIGRlc3RdKQoKICAgICAgICAgICAgaWYgcmV2OgogICAgICAgICAgICAgICAgcmV2X29wdGlvbnMgPSBzZWxmLmNoZWNrX3Jldl9vcHRpb25zKHJldiwgZGVzdCwgcmV2X29wdGlvbnMpCiAgICAgICAgICAgICAgICAjIE9ubHkgZG8gYSBjaGVja291dCBpZiByZXZfb3B0aW9ucyBkaWZmZXJzIGZyb20gSEVBRAogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfdmVyc2lvbihkZXN0LCByZXZfb3B0aW9ucyk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgICAgICAgICAgICAgWydjaGVja291dCcsICctcSddICsgcmV2X29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGN3ZD1kZXN0LAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgIzogcmVwbyBtYXkgY29udGFpbiBzdWJtb2R1bGVzCiAgICAgICAgICAgIHNlbGYudXBkYXRlX3N1Ym1vZHVsZXMoZGVzdCkKCiAgICBkZWYgZ2V0X3VybChzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiUmV0dXJuIFVSTCBvZiB0aGUgZmlyc3QgcmVtb3RlIGVuY291bnRlcmVkLiIiIgogICAgICAgIHJlbW90ZXMgPSBzZWxmLnJ1bl9jb21tYW5kKAogICAgICAgICAgICBbJ2NvbmZpZycsICctLWdldC1yZWdleHAnLCAncmVtb3RlXC4uKlwudXJsJ10sCiAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLCBjd2Q9bG9jYXRpb24pCiAgICAgICAgcmVtb3RlcyA9IHJlbW90ZXMuc3BsaXRsaW5lcygpCiAgICAgICAgZm91bmRfcmVtb3RlID0gcmVtb3Rlc1swXQogICAgICAgIGZvciByZW1vdGUgaW4gcmVtb3RlczoKICAgICAgICAgICAgaWYgcmVtb3RlLnN0YXJ0c3dpdGgoJ3JlbW90ZS5vcmlnaW4udXJsICcpOgogICAgICAgICAgICAgICAgZm91bmRfcmVtb3RlID0gcmVtb3RlCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHVybCA9IGZvdW5kX3JlbW90ZS5zcGxpdCgnICcpWzFdCiAgICAgICAgcmV0dXJuIHVybC5zdHJpcCgpCgogICAgZGVmIGdldF9yZXZpc2lvbihzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgY3VycmVudF9yZXYgPSBzZWxmLnJ1bl9jb21tYW5kKAogICAgICAgICAgICBbJ3Jldi1wYXJzZScsICdIRUFEJ10sIHNob3dfc3Rkb3V0PUZhbHNlLCBjd2Q9bG9jYXRpb24pCiAgICAgICAgcmV0dXJuIGN1cnJlbnRfcmV2LnN0cmlwKCkKCiAgICBkZWYgZ2V0X2Z1bGxfcmVmcyhzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiWWllbGRzIHR1cGxlcyBvZiAoY29tbWl0LCByZWYpIGZvciBicmFuY2hlcyBhbmQgdGFncyIiIgogICAgICAgIG91dHB1dCA9IHNlbGYucnVuX2NvbW1hbmQoWydzaG93LXJlZiddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UsIGN3ZD1sb2NhdGlvbikKICAgICAgICBmb3IgbGluZSBpbiBvdXRwdXQuc3RyaXAoKS5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgIGNvbW1pdCwgcmVmID0gbGluZS5zcGxpdCgnICcsIDEpCiAgICAgICAgICAgIHlpZWxkIGNvbW1pdC5zdHJpcCgpLCByZWYuc3RyaXAoKQoKICAgIGRlZiBpc19yZWZfcmVtb3RlKHNlbGYsIHJlZik6CiAgICAgICAgcmV0dXJuIHJlZi5zdGFydHN3aXRoKCdyZWZzL3JlbW90ZXMvJykKCiAgICBkZWYgaXNfcmVmX2JyYW5jaChzZWxmLCByZWYpOgogICAgICAgIHJldHVybiByZWYuc3RhcnRzd2l0aCgncmVmcy9oZWFkcy8nKQoKICAgIGRlZiBpc19yZWZfdGFnKHNlbGYsIHJlZik6CiAgICAgICAgcmV0dXJuIHJlZi5zdGFydHN3aXRoKCdyZWZzL3RhZ3MvJykKCiAgICBkZWYgaXNfcmVmX2NvbW1pdChzZWxmLCByZWYpOgogICAgICAgICIiIkEgcmVmIGlzIGEgY29tbWl0IHNoYSBpZiBpdCBpcyBub3QgYW55dGhpbmcgZWxzZSIiIgogICAgICAgIHJldHVybiBub3QgYW55KCgKICAgICAgICAgICAgc2VsZi5pc19yZWZfcmVtb3RlKHJlZiksCiAgICAgICAgICAgIHNlbGYuaXNfcmVmX2JyYW5jaChyZWYpLAogICAgICAgICAgICBzZWxmLmlzX3JlZl90YWcocmVmKSwKICAgICAgICApKQoKICAgICMgU2hvdWxkIGRlcHJlY2F0ZSBgZ2V0X3JlZnNgIHNpbmNlIGl0J3MgYW1iaWd1b3VzCiAgICBkZWYgZ2V0X3JlZnMoc2VsZiwgbG9jYXRpb24pOgogICAgICAgIHJldHVybiBzZWxmLmdldF9zaG9ydF9yZWZzKGxvY2F0aW9uKQoKICAgIGRlZiBnZXRfc2hvcnRfcmVmcyhzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiUmV0dXJuIG1hcCBvZiBuYW1lZCByZWZzIChicmFuY2hlcyBvciB0YWdzKSB0byBjb21taXQgaGFzaGVzLiIiIgogICAgICAgIHJ2ID0ge30KICAgICAgICBmb3IgY29tbWl0LCByZWYgaW4gc2VsZi5nZXRfZnVsbF9yZWZzKGxvY2F0aW9uKToKICAgICAgICAgICAgcmVmX25hbWUgPSBOb25lCiAgICAgICAgICAgIGlmIHNlbGYuaXNfcmVmX3JlbW90ZShyZWYpOgogICAgICAgICAgICAgICAgcmVmX25hbWUgPSByZWZbbGVuKCdyZWZzL3JlbW90ZXMvJyk6XQogICAgICAgICAgICBlbGlmIHNlbGYuaXNfcmVmX2JyYW5jaChyZWYpOgogICAgICAgICAgICAgICAgcmVmX25hbWUgPSByZWZbbGVuKCdyZWZzL2hlYWRzLycpOl0KICAgICAgICAgICAgZWxpZiBzZWxmLmlzX3JlZl90YWcocmVmKToKICAgICAgICAgICAgICAgIHJlZl9uYW1lID0gcmVmW2xlbigncmVmcy90YWdzLycpOl0KICAgICAgICAgICAgaWYgcmVmX25hbWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBydltyZWZfbmFtZV0gPSBjb21taXQKICAgICAgICByZXR1cm4gcnYKCiAgICBkZWYgX2dldF9zdWJkaXJlY3Rvcnkoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIlJldHVybiB0aGUgcmVsYXRpdmUgcGF0aCBvZiBzZXR1cC5weSB0byB0aGUgZ2l0IHJlcG8gcm9vdC4iIiIKICAgICAgICAjIGZpbmQgdGhlIHJlcG8gcm9vdAogICAgICAgIGdpdF9kaXIgPSBzZWxmLnJ1bl9jb21tYW5kKFsncmV2LXBhcnNlJywgJy0tZ2l0LWRpciddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLCBjd2Q9bG9jYXRpb24pLnN0cmlwKCkKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2FicyhnaXRfZGlyKToKICAgICAgICAgICAgZ2l0X2RpciA9IG9zLnBhdGguam9pbihsb2NhdGlvbiwgZ2l0X2RpcikKICAgICAgICByb290X2RpciA9IG9zLnBhdGguam9pbihnaXRfZGlyLCAnLi4nKQogICAgICAgICMgZmluZCBzZXR1cC5weQogICAgICAgIG9yaWdfbG9jYXRpb24gPSBsb2NhdGlvbgogICAgICAgIHdoaWxlIG5vdCBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4obG9jYXRpb24sICdzZXR1cC5weScpKToKICAgICAgICAgICAgbGFzdF9sb2NhdGlvbiA9IGxvY2F0aW9uCiAgICAgICAgICAgIGxvY2F0aW9uID0gb3MucGF0aC5kaXJuYW1lKGxvY2F0aW9uKQogICAgICAgICAgICBpZiBsb2NhdGlvbiA9PSBsYXN0X2xvY2F0aW9uOgogICAgICAgICAgICAgICAgIyBXZSd2ZSB0cmF2ZXJzZWQgdXAgdG8gdGhlIHJvb3Qgb2YgdGhlIGZpbGVzeXN0ZW0gd2l0aG91dAogICAgICAgICAgICAgICAgIyBmaW5kaW5nIHNldHVwLnB5CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgc2V0dXAucHkgZm9yIGRpcmVjdG9yeSAlcyAodHJpZWQgYWxsICIKICAgICAgICAgICAgICAgICAgICAicGFyZW50IGRpcmVjdG9yaWVzKSIsCiAgICAgICAgICAgICAgICAgICAgb3JpZ19sb2NhdGlvbiwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgIyByZWxhdGl2ZSBwYXRoIG9mIHNldHVwLnB5IHRvIHJlcG8gcm9vdAogICAgICAgIGlmIHNhbWVmaWxlKHJvb3RfZGlyLCBsb2NhdGlvbik6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIG9zLnBhdGgucmVscGF0aChsb2NhdGlvbiwgcm9vdF9kaXIpCgogICAgZGVmIGdldF9zcmNfcmVxdWlyZW1lbnQoc2VsZiwgZGlzdCwgbG9jYXRpb24pOgogICAgICAgIHJlcG8gPSBzZWxmLmdldF91cmwobG9jYXRpb24pCiAgICAgICAgaWYgbm90IHJlcG8ubG93ZXIoKS5zdGFydHN3aXRoKCdnaXQ6Jyk6CiAgICAgICAgICAgIHJlcG8gPSAnZ2l0KycgKyByZXBvCiAgICAgICAgZWdnX3Byb2plY3RfbmFtZSA9IGRpc3QuZWdnX25hbWUoKS5zcGxpdCgnLScsIDEpWzBdCiAgICAgICAgaWYgbm90IHJlcG86CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgY3VycmVudF9yZXYgPSBzZWxmLmdldF9yZXZpc2lvbihsb2NhdGlvbikKICAgICAgICByZXEgPSAnJXNAJXMjZWdnPSVzJyAlIChyZXBvLCBjdXJyZW50X3JldiwgZWdnX3Byb2plY3RfbmFtZSkKICAgICAgICBzdWJkaXJlY3RvcnkgPSBzZWxmLl9nZXRfc3ViZGlyZWN0b3J5KGxvY2F0aW9uKQogICAgICAgIGlmIHN1YmRpcmVjdG9yeToKICAgICAgICAgICAgcmVxICs9ICcmc3ViZGlyZWN0b3J5PScgKyBzdWJkaXJlY3RvcnkKICAgICAgICByZXR1cm4gcmVxCgogICAgZGVmIGdldF91cmxfcmV2KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFByZWZpeGVzIHN0dWIgVVJMcyBsaWtlICd1c2VyQGhvc3RuYW1lOnVzZXIvcmVwby5naXQnIHdpdGggJ3NzaDovLycuCiAgICAgICAgVGhhdCdzIHJlcXVpcmVkIGJlY2F1c2UgYWx0aG91Z2ggdGhleSB1c2UgU1NIIHRoZXkgc29tZXRpbWVzIGRvZXNuJ3QKICAgICAgICB3b3JrIHdpdGggYSBzc2g6Ly8gc2NoZW1lIChlLmcuIEdpdGh1YikuIEJ1dCB3ZSBuZWVkIGEgc2NoZW1lIGZvcgogICAgICAgIHBhcnNpbmcuIEhlbmNlIHdlIHJlbW92ZSBpdCBhZ2FpbiBhZnRlcndhcmRzIGFuZCByZXR1cm4gaXQgYXMgYSBzdHViLgogICAgICAgICIiIgogICAgICAgIGlmICc6Ly8nIG5vdCBpbiBzZWxmLnVybDoKICAgICAgICAgICAgYXNzZXJ0ICdmaWxlOicgbm90IGluIHNlbGYudXJsCiAgICAgICAgICAgIHNlbGYudXJsID0gc2VsZi51cmwucmVwbGFjZSgnZ2l0KycsICdnaXQrc3NoOi8vJykKICAgICAgICAgICAgdXJsLCByZXYgPSBzdXBlcihHaXQsIHNlbGYpLmdldF91cmxfcmV2KCkKICAgICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoJ3NzaDovLycsICcnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHVybCwgcmV2ID0gc3VwZXIoR2l0LCBzZWxmKS5nZXRfdXJsX3JldigpCgogICAgICAgIHJldHVybiB1cmwsIHJldgoKICAgIGRlZiB1cGRhdGVfc3VibW9kdWxlcyhzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihsb2NhdGlvbiwgJy5naXRtb2R1bGVzJykpOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKAogICAgICAgICAgICBbJ3N1Ym1vZHVsZScsICd1cGRhdGUnLCAnLS1pbml0JywgJy0tcmVjdXJzaXZlJywgJy1xJ10sCiAgICAgICAgICAgIGN3ZD1sb2NhdGlvbiwKICAgICAgICApCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgY29udHJvbHNfbG9jYXRpb24oY2xzLCBsb2NhdGlvbik6CiAgICAgICAgaWYgc3VwZXIoR2l0LCBjbHMpLmNvbnRyb2xzX2xvY2F0aW9uKGxvY2F0aW9uKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICB0cnk6CiAgICAgICAgICAgIHIgPSBjbHMoKS5ydW5fY29tbWFuZChbJ3Jldi1wYXJzZSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dkPWxvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbl9yZXR1cm5jb2RlPSdpZ25vcmUnKQogICAgICAgICAgICByZXR1cm4gbm90IHIKICAgICAgICBleGNlcHQgQmFkQ29tbWFuZDoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJjb3VsZCBub3QgZGV0ZXJtaW5lIGlmICVzIGlzIHVuZGVyIGdpdCBjb250cm9sICIKICAgICAgICAgICAgICAgICAgICAgICAgICJiZWNhdXNlIGdpdCBpcyBub3QgYXZhaWxhYmxlIiwgbG9jYXRpb24pCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKCnZjcy5yZWdpc3RlcihHaXQpClBLAwQUAAAAAAAAACEAeWJqHZANAACQDQAAJAAAAHB5cGlfX3BpcF85XzBfMy9waXAvdmNzL21lcmN1cmlhbC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHRlbXBmaWxlCgpmcm9tIHBpcC51dGlscyBpbXBvcnQgZGlzcGxheV9wYXRoLCBybXRyZWUKZnJvbSBwaXAudmNzIGltcG9ydCB2Y3MsIFZlcnNpb25Db250cm9sCmZyb20gcGlwLmRvd25sb2FkIGltcG9ydCBwYXRoX3RvX3VybApmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3ZlcyBpbXBvcnQgY29uZmlncGFyc2VyCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgTWVyY3VyaWFsKFZlcnNpb25Db250cm9sKToKICAgIG5hbWUgPSAnaGcnCiAgICBkaXJuYW1lID0gJy5oZycKICAgIHJlcG9fbmFtZSA9ICdjbG9uZScKICAgIHNjaGVtZXMgPSAoJ2hnJywgJ2hnK2h0dHAnLCAnaGcraHR0cHMnLCAnaGcrc3NoJywgJ2hnK3N0YXRpYy1odHRwJykKCiAgICBkZWYgZXhwb3J0KHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiJFeHBvcnQgdGhlIEhnIHJlcG9zaXRvcnkgYXQgdGhlIHVybCB0byB0aGUgZGVzdGluYXRpb24gbG9jYXRpb24iIiIKICAgICAgICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoJy1leHBvcnQnLCAncGlwLScpCiAgICAgICAgc2VsZi51bnBhY2sodGVtcF9kaXIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKAogICAgICAgICAgICAgICAgWydhcmNoaXZlJywgbG9jYXRpb25dLCBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPXRlbXBfZGlyKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHJtdHJlZSh0ZW1wX2RpcikKCiAgICBkZWYgc3dpdGNoKHNlbGYsIGRlc3QsIHVybCwgcmV2X29wdGlvbnMpOgogICAgICAgIHJlcG9fY29uZmlnID0gb3MucGF0aC5qb2luKGRlc3QsIHNlbGYuZGlybmFtZSwgJ2hncmMnKQogICAgICAgIGNvbmZpZyA9IGNvbmZpZ3BhcnNlci5TYWZlQ29uZmlnUGFyc2VyKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbmZpZy5yZWFkKHJlcG9fY29uZmlnKQogICAgICAgICAgICBjb25maWcuc2V0KCdwYXRocycsICdkZWZhdWx0JywgdXJsKQogICAgICAgICAgICB3aXRoIG9wZW4ocmVwb19jb25maWcsICd3JykgYXMgY29uZmlnX2ZpbGU6CiAgICAgICAgICAgICAgICBjb25maWcud3JpdGUoY29uZmlnX2ZpbGUpCiAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBjb25maWdwYXJzZXIuTm9TZWN0aW9uRXJyb3IpIGFzIGV4YzoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAnQ291bGQgbm90IHN3aXRjaCBNZXJjdXJpYWwgcmVwb3NpdG9yeSB0byAlczogJXMnLCB1cmwsIGV4YywKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWyd1cGRhdGUnLCAnLXEnXSArIHJldl9vcHRpb25zLCBjd2Q9ZGVzdCkKCiAgICBkZWYgdXBkYXRlKHNlbGYsIGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsncHVsbCcsICctcSddLCBjd2Q9ZGVzdCkKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsndXBkYXRlJywgJy1xJ10gKyByZXZfb3B0aW9ucywgY3dkPWRlc3QpCgogICAgZGVmIG9idGFpbihzZWxmLCBkZXN0KToKICAgICAgICB1cmwsIHJldiA9IHNlbGYuZ2V0X3VybF9yZXYoKQogICAgICAgIGlmIHJldjoKICAgICAgICAgICAgcmV2X29wdGlvbnMgPSBbcmV2XQogICAgICAgICAgICByZXZfZGlzcGxheSA9ICcgKHRvIHJldmlzaW9uICVzKScgJSByZXYKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXZfb3B0aW9ucyA9IFtdCiAgICAgICAgICAgIHJldl9kaXNwbGF5ID0gJycKICAgICAgICBpZiBzZWxmLmNoZWNrX2Rlc3RpbmF0aW9uKGRlc3QsIHVybCwgcmV2X29wdGlvbnMsIHJldl9kaXNwbGF5KToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAnQ2xvbmluZyBoZyAlcyVzIHRvICVzJywKICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgICAgIHJldl9kaXNwbGF5LAogICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGRlc3QpLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydjbG9uZScsICctLW5vdXBkYXRlJywgJy1xJywgdXJsLCBkZXN0XSkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ3VwZGF0ZScsICctcSddICsgcmV2X29wdGlvbnMsIGN3ZD1kZXN0KQoKICAgIGRlZiBnZXRfdXJsKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICB1cmwgPSBzZWxmLnJ1bl9jb21tYW5kKAogICAgICAgICAgICBbJ3Nob3djb25maWcnLCAncGF0aHMuZGVmYXVsdCddLAogICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPWxvY2F0aW9uKS5zdHJpcCgpCiAgICAgICAgaWYgc2VsZi5faXNfbG9jYWxfcmVwb3NpdG9yeSh1cmwpOgogICAgICAgICAgICB1cmwgPSBwYXRoX3RvX3VybCh1cmwpCiAgICAgICAgcmV0dXJuIHVybC5zdHJpcCgpCgogICAgZGVmIGdldF9yZXZpc2lvbihzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgY3VycmVudF9yZXZpc2lvbiA9IHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgIFsncGFyZW50cycsICctLXRlbXBsYXRlPXtyZXZ9J10sCiAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLCBjd2Q9bG9jYXRpb24pLnN0cmlwKCkKICAgICAgICByZXR1cm4gY3VycmVudF9yZXZpc2lvbgoKICAgIGRlZiBnZXRfcmV2aXNpb25faGFzaChzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgY3VycmVudF9yZXZfaGFzaCA9IHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgIFsncGFyZW50cycsICctLXRlbXBsYXRlPXtub2RlfSddLAogICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPWxvY2F0aW9uKS5zdHJpcCgpCiAgICAgICAgcmV0dXJuIGN1cnJlbnRfcmV2X2hhc2gKCiAgICBkZWYgZ2V0X3NyY19yZXF1aXJlbWVudChzZWxmLCBkaXN0LCBsb2NhdGlvbik6CiAgICAgICAgcmVwbyA9IHNlbGYuZ2V0X3VybChsb2NhdGlvbikKICAgICAgICBpZiBub3QgcmVwby5sb3dlcigpLnN0YXJ0c3dpdGgoJ2hnOicpOgogICAgICAgICAgICByZXBvID0gJ2hnKycgKyByZXBvCiAgICAgICAgZWdnX3Byb2plY3RfbmFtZSA9IGRpc3QuZWdnX25hbWUoKS5zcGxpdCgnLScsIDEpWzBdCiAgICAgICAgaWYgbm90IHJlcG86CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgY3VycmVudF9yZXZfaGFzaCA9IHNlbGYuZ2V0X3JldmlzaW9uX2hhc2gobG9jYXRpb24pCiAgICAgICAgcmV0dXJuICclc0AlcyNlZ2c9JXMnICUgKHJlcG8sIGN1cnJlbnRfcmV2X2hhc2gsIGVnZ19wcm9qZWN0X25hbWUpCgogICAgZGVmIGNoZWNrX3ZlcnNpb24oc2VsZiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgICIiIkFsd2F5cyBhc3N1bWUgdGhlIHZlcnNpb25zIGRvbid0IG1hdGNoIiIiCiAgICAgICAgcmV0dXJuIEZhbHNlCgp2Y3MucmVnaXN0ZXIoTWVyY3VyaWFsKQpQSwMEFAAAAAAAAAAhAG40lUGGJAAAhiQAACUAAABweXBpX19waXBfOV8wXzMvcGlwL3Zjcy9zdWJ2ZXJzaW9uLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgcmUKCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJsbGliX3BhcnNlCgpmcm9tIHBpcC5pbmRleCBpbXBvcnQgTGluawpmcm9tIHBpcC51dGlscyBpbXBvcnQgcm10cmVlLCBkaXNwbGF5X3BhdGgKZnJvbSBwaXAudXRpbHMubG9nZ2luZyBpbXBvcnQgaW5kZW50X2xvZwpmcm9tIHBpcC52Y3MgaW1wb3J0IHZjcywgVmVyc2lvbkNvbnRyb2wKCl9zdm5feG1sX3VybF9yZSA9IHJlLmNvbXBpbGUoJ3VybD0iKFteIl0rKSInKQpfc3ZuX3Jldl9yZSA9IHJlLmNvbXBpbGUoJ2NvbW1pdHRlZC1yZXY9IihcZCspIicpCl9zdm5fdXJsX3JlID0gcmUuY29tcGlsZShyJ1VSTDogKC4rKScpCl9zdm5fcmV2aXNpb25fcmUgPSByZS5jb21waWxlKHInUmV2aXNpb246ICguKyknKQpfc3ZuX2luZm9feG1sX3Jldl9yZSA9IHJlLmNvbXBpbGUocidccypyZXZpc2lvbj0iKFxkKykiJykKX3N2bl9pbmZvX3htbF91cmxfcmUgPSByZS5jb21waWxlKHInPHVybD4oLiopPC91cmw+JykKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBTdWJ2ZXJzaW9uKFZlcnNpb25Db250cm9sKToKICAgIG5hbWUgPSAnc3ZuJwogICAgZGlybmFtZSA9ICcuc3ZuJwogICAgcmVwb19uYW1lID0gJ2NoZWNrb3V0JwogICAgc2NoZW1lcyA9ICgnc3ZuJywgJ3N2bitzc2gnLCAnc3ZuK2h0dHAnLCAnc3ZuK2h0dHBzJywgJ3N2bitzdm4nKQoKICAgIGRlZiBnZXRfaW5mbyhzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiUmV0dXJucyAodXJsLCByZXZpc2lvbiksIHdoZXJlIGJvdGggYXJlIHN0cmluZ3MiIiIKICAgICAgICBhc3NlcnQgbm90IGxvY2F0aW9uLnJzdHJpcCgnLycpLmVuZHN3aXRoKHNlbGYuZGlybmFtZSksIFwKICAgICAgICAgICAgJ0JhZCBkaXJlY3Rvcnk6ICVzJyAlIGxvY2F0aW9uCiAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgWydpbmZvJywgbG9jYXRpb25dLAogICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwKICAgICAgICAgICAgZXh0cmFfZW52aXJvbj17J0xBTkcnOiAnQyd9LAogICAgICAgICkKICAgICAgICBtYXRjaCA9IF9zdm5fdXJsX3JlLnNlYXJjaChvdXRwdXQpCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICdDYW5ub3QgZGV0ZXJtaW5lIFVSTCBvZiBzdm4gY2hlY2tvdXQgJXMnLAogICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGxvY2F0aW9uKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ091dHB1dCB0aGF0IGNhbm5vdCBiZSBwYXJzZWQ6IFxuJXMnLCBvdXRwdXQpCiAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCiAgICAgICAgdXJsID0gbWF0Y2guZ3JvdXAoMSkuc3RyaXAoKQogICAgICAgIG1hdGNoID0gX3N2bl9yZXZpc2lvbl9yZS5zZWFyY2gob3V0cHV0KQogICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAnQ2Fubm90IGRldGVybWluZSByZXZpc2lvbiBvZiBzdm4gY2hlY2tvdXQgJXMnLAogICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGxvY2F0aW9uKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ091dHB1dCB0aGF0IGNhbm5vdCBiZSBwYXJzZWQ6IFxuJXMnLCBvdXRwdXQpCiAgICAgICAgICAgIHJldHVybiB1cmwsIE5vbmUKICAgICAgICByZXR1cm4gdXJsLCBtYXRjaC5ncm91cCgxKQoKICAgIGRlZiBleHBvcnQoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIkV4cG9ydCB0aGUgc3ZuIHJlcG9zaXRvcnkgYXQgdGhlIHVybCB0byB0aGUgZGVzdGluYXRpb24gbG9jYXRpb24iIiIKICAgICAgICB1cmwsIHJldiA9IHNlbGYuZ2V0X3VybF9yZXYoKQogICAgICAgIHJldl9vcHRpb25zID0gZ2V0X3Jldl9vcHRpb25zKHVybCwgcmV2KQogICAgICAgIHVybCA9IHNlbGYucmVtb3ZlX2F1dGhfZnJvbV91cmwodXJsKQogICAgICAgIGxvZ2dlci5pbmZvKCdFeHBvcnRpbmcgc3ZuIHJlcG9zaXRvcnkgJXMgdG8gJXMnLCB1cmwsIGxvY2F0aW9uKQogICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhsb2NhdGlvbik6CiAgICAgICAgICAgICAgICAjIFN1YnZlcnNpb24gZG9lc24ndCBsaWtlIHRvIGNoZWNrIG91dCBvdmVyIGFuIGV4aXN0aW5nCiAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeSAtLWZvcmNlIGZpeGVzIHRoaXMsIGJ1dCB3YXMgb25seSBhZGRlZCBpbiBzdm4gMS41CiAgICAgICAgICAgICAgICBybXRyZWUobG9jYXRpb24pCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgICAgICBbJ2V4cG9ydCddICsgcmV2X29wdGlvbnMgKyBbdXJsLCBsb2NhdGlvbl0sCiAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSkKCiAgICBkZWYgc3dpdGNoKHNlbGYsIGRlc3QsIHVybCwgcmV2X29wdGlvbnMpOgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydzd2l0Y2gnXSArIHJldl9vcHRpb25zICsgW3VybCwgZGVzdF0pCgogICAgZGVmIHVwZGF0ZShzZWxmLCBkZXN0LCByZXZfb3B0aW9ucyk6CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ3VwZGF0ZSddICsgcmV2X29wdGlvbnMgKyBbZGVzdF0pCgogICAgZGVmIG9idGFpbihzZWxmLCBkZXN0KToKICAgICAgICB1cmwsIHJldiA9IHNlbGYuZ2V0X3VybF9yZXYoKQogICAgICAgIHJldl9vcHRpb25zID0gZ2V0X3Jldl9vcHRpb25zKHVybCwgcmV2KQogICAgICAgIHVybCA9IHNlbGYucmVtb3ZlX2F1dGhfZnJvbV91cmwodXJsKQogICAgICAgIGlmIHJldjoKICAgICAgICAgICAgcmV2X2Rpc3BsYXkgPSAnICh0byByZXZpc2lvbiAlcyknICUgcmV2CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV2X2Rpc3BsYXkgPSAnJwogICAgICAgIGlmIHNlbGYuY2hlY2tfZGVzdGluYXRpb24oZGVzdCwgdXJsLCByZXZfb3B0aW9ucywgcmV2X2Rpc3BsYXkpOgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICdDaGVja2luZyBvdXQgJXMlcyB0byAlcycsCiAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICAgICByZXZfZGlzcGxheSwKICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChkZXN0KSwKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsnY2hlY2tvdXQnLCAnLXEnXSArIHJldl9vcHRpb25zICsgW3VybCwgZGVzdF0pCgogICAgZGVmIGdldF9sb2NhdGlvbihzZWxmLCBkaXN0LCBkZXBlbmRlbmN5X2xpbmtzKToKICAgICAgICBmb3IgdXJsIGluIGRlcGVuZGVuY3lfbGlua3M6CiAgICAgICAgICAgIGVnZ19mcmFnbWVudCA9IExpbmsodXJsKS5lZ2dfZnJhZ21lbnQKICAgICAgICAgICAgaWYgbm90IGVnZ19mcmFnbWVudDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmICctJyBpbiBlZ2dfZnJhZ21lbnQ6CiAgICAgICAgICAgICAgICAjIEZJWE1FOiB3aWxsIHRoaXMgd29yayB3aGVuIGEgcGFja2FnZSBoYXMgLSBpbiB0aGUgbmFtZT8KICAgICAgICAgICAgICAgIGtleSA9ICctJy5qb2luKGVnZ19mcmFnbWVudC5zcGxpdCgnLScpWzotMV0pLmxvd2VyKCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGtleSA9IGVnZ19mcmFnbWVudAogICAgICAgICAgICBpZiBrZXkgPT0gZGlzdC5rZXk6CiAgICAgICAgICAgICAgICByZXR1cm4gdXJsLnNwbGl0KCcjJywgMSlbMF0KICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBnZXRfcmV2aXNpb24oc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgbWF4aW11bSByZXZpc2lvbiBmb3IgYWxsIGZpbGVzIHVuZGVyIGEgZ2l2ZW4gbG9jYXRpb24KICAgICAgICAiIiIKICAgICAgICAjIE5vdGU6IHRha2VuIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvCiAgICAgICAgcmV2aXNpb24gPSAwCgogICAgICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKGxvY2F0aW9uKToKICAgICAgICAgICAgaWYgc2VsZi5kaXJuYW1lIG5vdCBpbiBkaXJzOgogICAgICAgICAgICAgICAgZGlyc1s6XSA9IFtdCiAgICAgICAgICAgICAgICBjb250aW51ZSAgICAjIG5vIHNlbnNlIHdhbGtpbmcgdW5jb250cm9sbGVkIHN1YmRpcnMKICAgICAgICAgICAgZGlycy5yZW1vdmUoc2VsZi5kaXJuYW1lKQogICAgICAgICAgICBlbnRyaWVzX2ZuID0gb3MucGF0aC5qb2luKGJhc2UsIHNlbGYuZGlybmFtZSwgJ2VudHJpZXMnKQogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZW50cmllc19mbik6CiAgICAgICAgICAgICAgICAjIEZJWE1FOiBzaG91bGQgd2Ugd2Fybj8KICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBkaXJ1cmwsIGxvY2FscmV2ID0gc2VsZi5fZ2V0X3N2bl91cmxfcmV2KGJhc2UpCgogICAgICAgICAgICBpZiBiYXNlID09IGxvY2F0aW9uOgogICAgICAgICAgICAgICAgYmFzZV91cmwgPSBkaXJ1cmwgKyAnLycgICAjIHNhdmUgdGhlIHJvb3QgdXJsCiAgICAgICAgICAgIGVsaWYgbm90IGRpcnVybCBvciBub3QgZGlydXJsLnN0YXJ0c3dpdGgoYmFzZV91cmwpOgogICAgICAgICAgICAgICAgZGlyc1s6XSA9IFtdCiAgICAgICAgICAgICAgICBjb250aW51ZSAgICAjIG5vdCBwYXJ0IG9mIHRoZSBzYW1lIHN2biB0cmVlLCBza2lwIGl0CiAgICAgICAgICAgIHJldmlzaW9uID0gbWF4KHJldmlzaW9uLCBsb2NhbHJldikKICAgICAgICByZXR1cm4gcmV2aXNpb24KCiAgICBkZWYgZ2V0X3VybF9yZXYoc2VsZik6CiAgICAgICAgIyBob3RmaXggdGhlIFVSTCBzY2hlbWUgYWZ0ZXIgcmVtb3Zpbmcgc3ZuKyBmcm9tIHN2bitzc2g6Ly8gcmVhZGQgaXQKICAgICAgICB1cmwsIHJldiA9IHN1cGVyKFN1YnZlcnNpb24sIHNlbGYpLmdldF91cmxfcmV2KCkKICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aCgnc3NoOi8vJyk6CiAgICAgICAgICAgIHVybCA9ICdzdm4rJyArIHVybAogICAgICAgIHJldHVybiB1cmwsIHJldgoKICAgIGRlZiBnZXRfdXJsKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAjIEluIGNhc2VzIHdoZXJlIHRoZSBzb3VyY2UgaXMgaW4gYSBzdWJkaXJlY3RvcnksIG5vdCBhbG9uZ3NpZGUKICAgICAgICAjIHNldHVwLnB5IHdlIGhhdmUgdG8gbG9vayB1cCBpbiB0aGUgbG9jYXRpb24gdW50aWwgd2UgZmluZCBhIHJlYWwKICAgICAgICAjIHNldHVwLnB5CiAgICAgICAgb3JpZ19sb2NhdGlvbiA9IGxvY2F0aW9uCiAgICAgICAgd2hpbGUgbm90IG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihsb2NhdGlvbiwgJ3NldHVwLnB5JykpOgogICAgICAgICAgICBsYXN0X2xvY2F0aW9uID0gbG9jYXRpb24KICAgICAgICAgICAgbG9jYXRpb24gPSBvcy5wYXRoLmRpcm5hbWUobG9jYXRpb24pCiAgICAgICAgICAgIGlmIGxvY2F0aW9uID09IGxhc3RfbG9jYXRpb246CiAgICAgICAgICAgICAgICAjIFdlJ3ZlIHRyYXZlcnNlZCB1cCB0byB0aGUgcm9vdCBvZiB0aGUgZmlsZXN5c3RlbSB3aXRob3V0CiAgICAgICAgICAgICAgICAjIGZpbmRpbmcgc2V0dXAucHkKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBzZXR1cC5weSBmb3IgZGlyZWN0b3J5ICVzICh0cmllZCBhbGwgIgogICAgICAgICAgICAgICAgICAgICJwYXJlbnQgZGlyZWN0b3JpZXMpIiwKICAgICAgICAgICAgICAgICAgICBvcmlnX2xvY2F0aW9uLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9zdm5fdXJsX3Jldihsb2NhdGlvbilbMF0KCiAgICBkZWYgX2dldF9zdm5fdXJsX3JldihzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgSW5zdGFsbGF0aW9uRXJyb3IKCiAgICAgICAgZW50cmllc19wYXRoID0gb3MucGF0aC5qb2luKGxvY2F0aW9uLCBzZWxmLmRpcm5hbWUsICdlbnRyaWVzJykKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhlbnRyaWVzX3BhdGgpOgogICAgICAgICAgICB3aXRoIG9wZW4oZW50cmllc19wYXRoKSBhcyBmOgogICAgICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCiAgICAgICAgZWxzZTogICMgc3VidmVyc2lvbiA+PSAxLjcgZG9lcyBub3QgaGF2ZSB0aGUgJ2VudHJpZXMnIGZpbGUKICAgICAgICAgICAgZGF0YSA9ICcnCgogICAgICAgIGlmIChkYXRhLnN0YXJ0c3dpdGgoJzgnKSBvcgogICAgICAgICAgICAgICAgZGF0YS5zdGFydHN3aXRoKCc5Jykgb3IKICAgICAgICAgICAgICAgIGRhdGEuc3RhcnRzd2l0aCgnMTAnKSk6CiAgICAgICAgICAgIGRhdGEgPSBsaXN0KG1hcChzdHIuc3BsaXRsaW5lcywgZGF0YS5zcGxpdCgnXG5ceDBjXG4nKSkpCiAgICAgICAgICAgIGRlbCBkYXRhWzBdWzBdICAjIGdldCByaWQgb2YgdGhlICc4JwogICAgICAgICAgICB1cmwgPSBkYXRhWzBdWzNdCiAgICAgICAgICAgIHJldnMgPSBbaW50KGRbOV0pIGZvciBkIGluIGRhdGEgaWYgbGVuKGQpID4gOSBhbmQgZFs5XV0gKyBbMF0KICAgICAgICBlbGlmIGRhdGEuc3RhcnRzd2l0aCgnPD94bWwnKToKICAgICAgICAgICAgbWF0Y2ggPSBfc3ZuX3htbF91cmxfcmUuc2VhcmNoKGRhdGEpCiAgICAgICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0JhZGx5IGZvcm1hdHRlZCBkYXRhOiAlcicgJSBkYXRhKQogICAgICAgICAgICB1cmwgPSBtYXRjaC5ncm91cCgxKSAgICAjIGdldCByZXBvc2l0b3J5IFVSTAogICAgICAgICAgICByZXZzID0gW2ludChtLmdyb3VwKDEpKSBmb3IgbSBpbiBfc3ZuX3Jldl9yZS5maW5kaXRlcihkYXRhKV0gKyBbMF0KICAgICAgICBlbHNlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAjIHN1YnZlcnNpb24gPj0gMS43CiAgICAgICAgICAgICAgICB4bWwgPSBzZWxmLnJ1bl9jb21tYW5kKAogICAgICAgICAgICAgICAgICAgIFsnaW5mbycsICctLXhtbCcsIGxvY2F0aW9uXSwKICAgICAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHVybCA9IF9zdm5faW5mb194bWxfdXJsX3JlLnNlYXJjaCh4bWwpLmdyb3VwKDEpCiAgICAgICAgICAgICAgICByZXZzID0gWwogICAgICAgICAgICAgICAgICAgIGludChtLmdyb3VwKDEpKSBmb3IgbSBpbiBfc3ZuX2luZm9feG1sX3Jldl9yZS5maW5kaXRlcih4bWwpCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIGV4Y2VwdCBJbnN0YWxsYXRpb25FcnJvcjoKICAgICAgICAgICAgICAgIHVybCwgcmV2cyA9IE5vbmUsIFtdCgogICAgICAgIGlmIHJldnM6CiAgICAgICAgICAgIHJldiA9IG1heChyZXZzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldiA9IDAKCiAgICAgICAgcmV0dXJuIHVybCwgcmV2CgogICAgZGVmIGdldF9zcmNfcmVxdWlyZW1lbnQoc2VsZiwgZGlzdCwgbG9jYXRpb24pOgogICAgICAgIHJlcG8gPSBzZWxmLmdldF91cmwobG9jYXRpb24pCiAgICAgICAgaWYgcmVwbyBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICMgRklYTUU6IHdoeSBub3QgcHJvamVjdCBuYW1lPwogICAgICAgIGVnZ19wcm9qZWN0X25hbWUgPSBkaXN0LmVnZ19uYW1lKCkuc3BsaXQoJy0nLCAxKVswXQogICAgICAgIHJldiA9IHNlbGYuZ2V0X3JldmlzaW9uKGxvY2F0aW9uKQogICAgICAgIHJldHVybiAnc3ZuKyVzQCVzI2VnZz0lcycgJSAocmVwbywgcmV2LCBlZ2dfcHJvamVjdF9uYW1lKQoKICAgIGRlZiBjaGVja192ZXJzaW9uKHNlbGYsIGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICAiIiJBbHdheXMgYXNzdW1lIHRoZSB2ZXJzaW9ucyBkb24ndCBtYXRjaCIiIgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiByZW1vdmVfYXV0aF9mcm9tX3VybCh1cmwpOgogICAgICAgICMgUmV0dXJuIGEgY29weSBvZiB1cmwgd2l0aCAndXNlcm5hbWU6cGFzc3dvcmRAJyByZW1vdmVkLgogICAgICAgICMgdXNlcm5hbWUvcGFzcyBwYXJhbXMgYXJlIHBhc3NlZCB0byBzdWJ2ZXJzaW9uIHRocm91Z2ggZmxhZ3MKICAgICAgICAjIGFuZCBhcmUgbm90IHJlY29nbml6ZWQgaW4gdGhlIHVybC4KCiAgICAgICAgIyBwYXJzZWQgdXJsCiAgICAgICAgcHVybCA9IHVybGxpYl9wYXJzZS51cmxzcGxpdCh1cmwpCiAgICAgICAgc3RyaXBwZWRfbmV0bG9jID0gXAogICAgICAgICAgICBwdXJsLm5ldGxvYy5zcGxpdCgnQCcpWy0xXQoKICAgICAgICAjIHN0cmlwcGVkIHVybAogICAgICAgIHVybF9waWVjZXMgPSAoCiAgICAgICAgICAgIHB1cmwuc2NoZW1lLCBzdHJpcHBlZF9uZXRsb2MsIHB1cmwucGF0aCwgcHVybC5xdWVyeSwgcHVybC5mcmFnbWVudAogICAgICAgICkKICAgICAgICBzdXJsID0gdXJsbGliX3BhcnNlLnVybHVuc3BsaXQodXJsX3BpZWNlcykKICAgICAgICByZXR1cm4gc3VybAoKCmRlZiBnZXRfcmV2X29wdGlvbnModXJsLCByZXYpOgogICAgaWYgcmV2OgogICAgICAgIHJldl9vcHRpb25zID0gWyctcicsIHJldl0KICAgIGVsc2U6CiAgICAgICAgcmV2X29wdGlvbnMgPSBbXQoKICAgIHIgPSB1cmxsaWJfcGFyc2UudXJsc3BsaXQodXJsKQogICAgaWYgaGFzYXR0cihyLCAndXNlcm5hbWUnKToKICAgICAgICAjID49IFB5dGhvbi0yLjUKICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSByLnVzZXJuYW1lLCByLnBhc3N3b3JkCiAgICBlbHNlOgogICAgICAgIG5ldGxvYyA9IHJbMV0KICAgICAgICBpZiAnQCcgaW4gbmV0bG9jOgogICAgICAgICAgICBhdXRoID0gbmV0bG9jLnNwbGl0KCdAJylbMF0KICAgICAgICAgICAgaWYgJzonIGluIGF1dGg6CiAgICAgICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSBhdXRoLnNwbGl0KCc6JywgMSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCA9IGF1dGgsIE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSBOb25lLCBOb25lCgogICAgaWYgdXNlcm5hbWU6CiAgICAgICAgcmV2X29wdGlvbnMgKz0gWyctLXVzZXJuYW1lJywgdXNlcm5hbWVdCiAgICBpZiBwYXNzd29yZDoKICAgICAgICByZXZfb3B0aW9ucyArPSBbJy0tcGFzc3dvcmQnLCBwYXNzd29yZF0KICAgIHJldHVybiByZXZfb3B0aW9ucwoKCnZjcy5yZWdpc3RlcihTdWJ2ZXJzaW9uKQpQSwMEFAAAAAAAAAAhAH2ZIDsKfQAACn0AABwAAABweXBpX19waXBfOV8wXzMvcGlwL3doZWVsLnB5IiIiClN1cHBvcnQgZm9yIGluc3RhbGxpbmcgYW5kIGJ1aWxkaW5nIHRoZSAid2hlZWwiIGJpbmFyeSBwYWNrYWdlIGZvcm1hdC4KIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgY29tcGlsZWFsbAppbXBvcnQgY3N2CmltcG9ydCBlcnJubwppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBoYXNobGliCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgb3MucGF0aAppbXBvcnQgcmUKaW1wb3J0IHNodXRpbAppbXBvcnQgc3RhdAppbXBvcnQgc3lzCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgd2FybmluZ3MKCmZyb20gYmFzZTY0IGltcG9ydCB1cmxzYWZlX2I2NGVuY29kZQpmcm9tIGVtYWlsLnBhcnNlciBpbXBvcnQgUGFyc2VyCgpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgU3RyaW5nSU8KCmltcG9ydCBwaXAKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBleHBhbmR1c2VyCmZyb20gcGlwLmRvd25sb2FkIGltcG9ydCBwYXRoX3RvX3VybCwgdW5wYWNrX3VybApmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBJbnN0YWxsYXRpb25FcnJvciwgSW52YWxpZFdoZWVsRmlsZW5hbWUsIFVuc3VwcG9ydGVkV2hlZWwpCmZyb20gcGlwLmxvY2F0aW9ucyBpbXBvcnQgZGlzdHV0aWxzX3NjaGVtZSwgUElQX0RFTEVURV9NQVJLRVJfRklMRU5BTUUKZnJvbSBwaXAgaW1wb3J0IHBlcDQyNXRhZ3MKZnJvbSBwaXAudXRpbHMgaW1wb3J0ICgKICAgIGNhbGxfc3VicHJvY2VzcywgZW5zdXJlX2RpciwgY2FwdHVyZWRfc3Rkb3V0LCBybXRyZWUsIHJlYWRfY2h1bmtzLAopCmZyb20gcGlwLnV0aWxzLnVpIGltcG9ydCBvcGVuX3NwaW5uZXIKZnJvbSBwaXAudXRpbHMubG9nZ2luZyBpbXBvcnQgaW5kZW50X2xvZwpmcm9tIHBpcC51dGlscy5zZXR1cHRvb2xzX2J1aWxkIGltcG9ydCBTRVRVUFRPT0xTX1NISU0KZnJvbSBwaXAuX3ZlbmRvci5kaXN0bGliLnNjcmlwdHMgaW1wb3J0IFNjcmlwdE1ha2VyCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHBrZ19yZXNvdXJjZXMKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcudXRpbHMgaW1wb3J0IGNhbm9uaWNhbGl6ZV9uYW1lCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCBjb25maWdwYXJzZXIKCgp3aGVlbF9leHQgPSAnLndobCcKClZFUlNJT05fQ09NUEFUSUJMRSA9ICgxLCAwKQoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIFdoZWVsQ2FjaGUob2JqZWN0KToKICAgICIiIkEgY2FjaGUgb2Ygd2hlZWxzIGZvciBmdXR1cmUgaW5zdGFsbHMuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhY2hlX2RpciwgZm9ybWF0X2NvbnRyb2wpOgogICAgICAgICIiIkNyZWF0ZSBhIHdoZWVsIGNhY2hlLgoKICAgICAgICA6cGFyYW0gY2FjaGVfZGlyOiBUaGUgcm9vdCBvZiB0aGUgY2FjaGUuCiAgICAgICAgOnBhcmFtIGZvcm1hdF9jb250cm9sOiBBIHBpcC5pbmRleC5Gb3JtYXRDb250cm9sIG9iamVjdCB0byBsaW1pdAogICAgICAgICAgICBiaW5hcmllcyBiZWluZyByZWFkIGZyb20gdGhlIGNhY2hlLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NhY2hlX2RpciA9IGV4cGFuZHVzZXIoY2FjaGVfZGlyKSBpZiBjYWNoZV9kaXIgZWxzZSBOb25lCiAgICAgICAgc2VsZi5fZm9ybWF0X2NvbnRyb2wgPSBmb3JtYXRfY29udHJvbAoKICAgIGRlZiBjYWNoZWRfd2hlZWwoc2VsZiwgbGluaywgcGFja2FnZV9uYW1lKToKICAgICAgICByZXR1cm4gY2FjaGVkX3doZWVsKAogICAgICAgICAgICBzZWxmLl9jYWNoZV9kaXIsIGxpbmssIHNlbGYuX2Zvcm1hdF9jb250cm9sLCBwYWNrYWdlX25hbWUpCgoKZGVmIF9jYWNoZV9mb3JfbGluayhjYWNoZV9kaXIsIGxpbmspOgogICAgIiIiCiAgICBSZXR1cm4gYSBkaXJlY3RvcnkgdG8gc3RvcmUgY2FjaGVkIHdoZWVscyBpbiBmb3IgbGluay4KCiAgICBCZWNhdXNlIHRoZXJlIGFyZSBNIHdoZWVscyBmb3IgYW55IG9uZSBzZGlzdCwgd2UgcHJvdmlkZSBhIGRpcmVjdG9yeQogICAgdG8gY2FjaGUgdGhlbSBpbiwgYW5kIHRoZW4gY29uc3VsdCB0aGF0IGRpcmVjdG9yeSB3aGVuIGxvb2tpbmcgdXAKICAgIGNhY2hlIGhpdHMuCgogICAgV2Ugb25seSBpbnNlcnQgdGhpbmdzIGludG8gdGhlIGNhY2hlIGlmIHRoZXkgaGF2ZSBwbGF1c2libGUgdmVyc2lvbgogICAgbnVtYmVycywgc28gdGhhdCB3ZSBkb24ndCBjb250YW1pbmF0ZSB0aGUgY2FjaGUgd2l0aCB0aGluZ3MgdGhhdCB3ZXJlIG5vdAogICAgdW5pcXVlLiBFLmcuIC4vcGFja2FnZSBtaWdodCBoYXZlIGRvemVucyBvZiBpbnN0YWxscyBkb25lIGZvciBpdCBhbmQgYnVpbGQKICAgIGEgdmVyc2lvbiBvZiAwLjAuLi5hbmQgaWYgd2UgYnVpbHQgYW5kIGNhY2hlZCBhIHdoZWVsLCB3ZSdkIGVuZCB1cCB1c2luZwogICAgdGhlIHNhbWUgd2hlZWwgZXZlbiBpZiB0aGUgc291cmNlIGhhcyBiZWVuIGVkaXRlZC4KCiAgICA6cGFyYW0gY2FjaGVfZGlyOiBUaGUgY2FjaGVfZGlyIGJlaW5nIHVzZWQgYnkgcGlwLgogICAgOnBhcmFtIGxpbms6IFRoZSBsaW5rIG9mIHRoZSBzZGlzdCBmb3Igd2hpY2ggdGhpcyB3aWxsIGNhY2hlIHdoZWVscy4KICAgICIiIgoKICAgICMgV2Ugd2FudCB0byBnZW5lcmF0ZSBhbiB1cmwgdG8gdXNlIGFzIG91ciBjYWNoZSBrZXksIHdlIGRvbid0IHdhbnQgdG8ganVzdAogICAgIyByZS11c2UgdGhlIFVSTCBiZWNhdXNlIGl0IG1pZ2h0IGhhdmUgb3RoZXIgaXRlbXMgaW4gdGhlIGZyYWdtZW50IGFuZCB3ZQogICAgIyBkb24ndCBjYXJlIGFib3V0IHRob3NlLgogICAga2V5X3BhcnRzID0gW2xpbmsudXJsX3dpdGhvdXRfZnJhZ21lbnRdCiAgICBpZiBsaW5rLmhhc2hfbmFtZSBpcyBub3QgTm9uZSBhbmQgbGluay5oYXNoIGlzIG5vdCBOb25lOgogICAgICAgIGtleV9wYXJ0cy5hcHBlbmQoIj0iLmpvaW4oW2xpbmsuaGFzaF9uYW1lLCBsaW5rLmhhc2hdKSkKICAgIGtleV91cmwgPSAiIyIuam9pbihrZXlfcGFydHMpCgogICAgIyBFbmNvZGUgb3VyIGtleSB1cmwgd2l0aCBzaGEyMjQsIHdlJ2xsIHVzZSB0aGlzIGJlY2F1c2UgaXQgaGFzIHNpbWlsYXIKICAgICMgc2VjdXJpdHkgcHJvcGVydGllcyB0byBzaGEyNTYsIGJ1dCB3aXRoIGEgc2hvcnRlciB0b3RhbCBvdXRwdXQgKGFuZCB0aHVzCiAgICAjIGxlc3Mgc2VjdXJlKS4gSG93ZXZlciB0aGUgZGlmZmVyZW5jZXMgZG9uJ3QgbWFrZSBhIGxvdCBvZiBkaWZmZXJlbmNlIGZvcgogICAgIyBvdXIgdXNlIGNhc2UgaGVyZS4KICAgIGhhc2hlZCA9IGhhc2hsaWIuc2hhMjI0KGtleV91cmwuZW5jb2RlKCkpLmhleGRpZ2VzdCgpCgogICAgIyBXZSB3YW50IHRvIG5lc3QgdGhlIGRpcmVjdG9yaWVzIHNvbWUgdG8gcHJldmVudCBoYXZpbmcgYSB0b24gb2YgdG9wIGxldmVsCiAgICAjIGRpcmVjdG9yaWVzIHdoZXJlIHdlIG1pZ2h0IHJ1biBvdXQgb2Ygc3ViIGRpcmVjdG9yaWVzIG9uIHNvbWUgRlMuCiAgICBwYXJ0cyA9IFtoYXNoZWRbOjJdLCBoYXNoZWRbMjo0XSwgaGFzaGVkWzQ6Nl0sIGhhc2hlZFs2Ol1dCgogICAgIyBJbnNpZGUgb2YgdGhlIGJhc2UgbG9jYXRpb24gZm9yIGNhY2hlZCB3aGVlbHMsIGV4cGFuZCBvdXIgcGFydHMgYW5kIGpvaW4KICAgICMgdGhlbSBhbGwgdG9nZXRoZXIuCiAgICByZXR1cm4gb3MucGF0aC5qb2luKGNhY2hlX2RpciwgIndoZWVscyIsICpwYXJ0cykKCgpkZWYgY2FjaGVkX3doZWVsKGNhY2hlX2RpciwgbGluaywgZm9ybWF0X2NvbnRyb2wsIHBhY2thZ2VfbmFtZSk6CiAgICBpZiBub3QgY2FjaGVfZGlyOgogICAgICAgIHJldHVybiBsaW5rCiAgICBpZiBub3QgbGluazoKICAgICAgICByZXR1cm4gbGluawogICAgaWYgbGluay5pc193aGVlbDoKICAgICAgICByZXR1cm4gbGluawogICAgaWYgbm90IGxpbmsuaXNfYXJ0aWZhY3Q6CiAgICAgICAgcmV0dXJuIGxpbmsKICAgIGlmIG5vdCBwYWNrYWdlX25hbWU6CiAgICAgICAgcmV0dXJuIGxpbmsKICAgIGNhbm9uaWNhbF9uYW1lID0gY2Fub25pY2FsaXplX25hbWUocGFja2FnZV9uYW1lKQogICAgZm9ybWF0cyA9IHBpcC5pbmRleC5mbXRfY3RsX2Zvcm1hdHMoZm9ybWF0X2NvbnRyb2wsIGNhbm9uaWNhbF9uYW1lKQogICAgaWYgImJpbmFyeSIgbm90IGluIGZvcm1hdHM6CiAgICAgICAgcmV0dXJuIGxpbmsKICAgIHJvb3QgPSBfY2FjaGVfZm9yX2xpbmsoY2FjaGVfZGlyLCBsaW5rKQogICAgdHJ5OgogICAgICAgIHdoZWVsX25hbWVzID0gb3MubGlzdGRpcihyb290KQogICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKICAgICAgICBpZiBlLmVycm5vIGluIChlcnJuby5FTk9FTlQsIGVycm5vLkVOT1RESVIpOgogICAgICAgICAgICByZXR1cm4gbGluawogICAgICAgIHJhaXNlCiAgICBjYW5kaWRhdGVzID0gW10KICAgIGZvciB3aGVlbF9uYW1lIGluIHdoZWVsX25hbWVzOgogICAgICAgIHRyeToKICAgICAgICAgICAgd2hlZWwgPSBXaGVlbCh3aGVlbF9uYW1lKQogICAgICAgIGV4Y2VwdCBJbnZhbGlkV2hlZWxGaWxlbmFtZToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiBub3Qgd2hlZWwuc3VwcG9ydGVkKCk6CiAgICAgICAgICAgICMgQnVpbHQgZm9yIGEgZGlmZmVyZW50IHB5dGhvbi9hcmNoL2V0YwogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGNhbmRpZGF0ZXMuYXBwZW5kKCh3aGVlbC5zdXBwb3J0X2luZGV4X21pbigpLCB3aGVlbF9uYW1lKSkKICAgIGlmIG5vdCBjYW5kaWRhdGVzOgogICAgICAgIHJldHVybiBsaW5rCiAgICBjYW5kaWRhdGVzLnNvcnQoKQogICAgcGF0aCA9IG9zLnBhdGguam9pbihyb290LCBjYW5kaWRhdGVzWzBdWzFdKQogICAgcmV0dXJuIHBpcC5pbmRleC5MaW5rKHBhdGhfdG9fdXJsKHBhdGgpKQoKCmRlZiByZWhhc2gocGF0aCwgYWxnbz0nc2hhMjU2JywgYmxvY2tzaXplPTEgPDwgMjApOgogICAgIiIiUmV0dXJuIChoYXNoLCBsZW5ndGgpIGZvciBwYXRoIHVzaW5nIGhhc2hsaWIubmV3KGFsZ28pIiIiCiAgICBoID0gaGFzaGxpYi5uZXcoYWxnbykKICAgIGxlbmd0aCA9IDAKICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBmOgogICAgICAgIGZvciBibG9jayBpbiByZWFkX2NodW5rcyhmLCBzaXplPWJsb2Nrc2l6ZSk6CiAgICAgICAgICAgIGxlbmd0aCArPSBsZW4oYmxvY2spCiAgICAgICAgICAgIGgudXBkYXRlKGJsb2NrKQogICAgZGlnZXN0ID0gJ3NoYTI1Nj0nICsgdXJsc2FmZV9iNjRlbmNvZGUoCiAgICAgICAgaC5kaWdlc3QoKQogICAgKS5kZWNvZGUoJ2xhdGluMScpLnJzdHJpcCgnPScpCiAgICByZXR1cm4gKGRpZ2VzdCwgbGVuZ3RoKQoKCmRlZiBvcGVuX2Zvcl9jc3YobmFtZSwgbW9kZSk6CiAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKICAgICAgICBubCA9IHt9CiAgICAgICAgYmluID0gJ2InCiAgICBlbHNlOgogICAgICAgIG5sID0geyduZXdsaW5lJzogJyd9CiAgICAgICAgYmluID0gJycKICAgIHJldHVybiBvcGVuKG5hbWUsIG1vZGUgKyBiaW4sICoqbmwpCgoKZGVmIGZpeF9zY3JpcHQocGF0aCk6CiAgICAiIiJSZXBsYWNlICMhcHl0aG9uIHdpdGggIyEvcGF0aC90by9weXRob24KICAgIFJldHVybiBUcnVlIGlmIGZpbGUgd2FzIGNoYW5nZWQuIiIiCiAgICAjIFhYWCBSRUNPUkQgaGFzaGVzIHdpbGwgbmVlZCB0byBiZSB1cGRhdGVkCiAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgc2NyaXB0OgogICAgICAgICAgICBmaXJzdGxpbmUgPSBzY3JpcHQucmVhZGxpbmUoKQogICAgICAgICAgICBpZiBub3QgZmlyc3RsaW5lLnN0YXJ0c3dpdGgoYicjIXB5dGhvbicpOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGV4ZW5hbWUgPSBzeXMuZXhlY3V0YWJsZS5lbmNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQogICAgICAgICAgICBmaXJzdGxpbmUgPSBiJyMhJyArIGV4ZW5hbWUgKyBvcy5saW5lc2VwLmVuY29kZSgiYXNjaWkiKQogICAgICAgICAgICByZXN0ID0gc2NyaXB0LnJlYWQoKQogICAgICAgIHdpdGggb3BlbihwYXRoLCAnd2InKSBhcyBzY3JpcHQ6CiAgICAgICAgICAgIHNjcmlwdC53cml0ZShmaXJzdGxpbmUpCiAgICAgICAgICAgIHNjcmlwdC53cml0ZShyZXN0KQogICAgICAgIHJldHVybiBUcnVlCgpkaXN0X2luZm9fcmUgPSByZS5jb21waWxlKHIiIiJeKD9QPG5hbWV2ZXI+KD9QPG5hbWU+Lis/KSgtKD9QPHZlcj5cZC4rPykpPykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcLmRpc3QtaW5mbyQiIiIsIHJlLlZFUkJPU0UpCgoKZGVmIHJvb3RfaXNfcHVyZWxpYihuYW1lLCB3aGVlbGRpcik6CiAgICAiIiIKICAgIFJldHVybiBUcnVlIGlmIHRoZSBleHRyYWN0ZWQgd2hlZWwgaW4gd2hlZWxkaXIgc2hvdWxkIGdvIGludG8gcHVyZWxpYi4KICAgICIiIgogICAgbmFtZV9mb2xkZWQgPSBuYW1lLnJlcGxhY2UoIi0iLCAiXyIpCiAgICBmb3IgaXRlbSBpbiBvcy5saXN0ZGlyKHdoZWVsZGlyKToKICAgICAgICBtYXRjaCA9IGRpc3RfaW5mb19yZS5tYXRjaChpdGVtKQogICAgICAgIGlmIG1hdGNoIGFuZCBtYXRjaC5ncm91cCgnbmFtZScpID09IG5hbWVfZm9sZGVkOgogICAgICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHdoZWVsZGlyLCBpdGVtLCAnV0hFRUwnKSkgYXMgd2hlZWw6CiAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiB3aGVlbDoKICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5sb3dlcigpLnJzdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgaWYgbGluZSA9PSAicm9vdC1pcy1wdXJlbGliOiB0cnVlIjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQoKCmRlZiBnZXRfZW50cnlwb2ludHMoZmlsZW5hbWUpOgogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICByZXR1cm4ge30sIHt9CgogICAgIyBUaGlzIGlzIGRvbmUgYmVjYXVzZSB5b3UgY2FuIHBhc3MgYSBzdHJpbmcgdG8gZW50cnlfcG9pbnRzIHdyYXBwZXJzIHdoaWNoCiAgICAjIG1lYW5zIHRoYXQgdGhleSBtYXkgb3IgbWF5IG5vdCBiZSB2YWxpZCBJTkkgZmlsZXMuIFRoZSBhdHRlbXB0IGhlcmUgaXMgdG8KICAgICMgc3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpbiBvcmRlciB0byBtYWtlIHRoZW0gdmFsaWQgSU5JCiAgICAjIGZpbGVzLgogICAgd2l0aCBvcGVuKGZpbGVuYW1lKSBhcyBmcDoKICAgICAgICBkYXRhID0gU3RyaW5nSU8oKQogICAgICAgIGZvciBsaW5lIGluIGZwOgogICAgICAgICAgICBkYXRhLndyaXRlKGxpbmUuc3RyaXAoKSkKICAgICAgICAgICAgZGF0YS53cml0ZSgiXG4iKQogICAgICAgIGRhdGEuc2VlaygwKQoKICAgIGNwID0gY29uZmlncGFyc2VyLlJhd0NvbmZpZ1BhcnNlcigpCiAgICBjcC5vcHRpb254Zm9ybSA9IGxhbWJkYSBvcHRpb246IG9wdGlvbgogICAgY3AucmVhZGZwKGRhdGEpCgogICAgY29uc29sZSA9IHt9CiAgICBndWkgPSB7fQogICAgaWYgY3AuaGFzX3NlY3Rpb24oJ2NvbnNvbGVfc2NyaXB0cycpOgogICAgICAgIGNvbnNvbGUgPSBkaWN0KGNwLml0ZW1zKCdjb25zb2xlX3NjcmlwdHMnKSkKICAgIGlmIGNwLmhhc19zZWN0aW9uKCdndWlfc2NyaXB0cycpOgogICAgICAgIGd1aSA9IGRpY3QoY3AuaXRlbXMoJ2d1aV9zY3JpcHRzJykpCiAgICByZXR1cm4gY29uc29sZSwgZ3VpCgoKZGVmIG1vdmVfd2hlZWxfZmlsZXMobmFtZSwgcmVxLCB3aGVlbGRpciwgdXNlcj1GYWxzZSwgaG9tZT1Ob25lLCByb290PU5vbmUsCiAgICAgICAgICAgICAgICAgICAgIHB5Y29tcGlsZT1UcnVlLCBzY2hlbWU9Tm9uZSwgaXNvbGF0ZWQ9RmFsc2UsIHByZWZpeD1Ob25lKToKICAgICIiIkluc3RhbGwgYSB3aGVlbCIiIgoKICAgIGlmIG5vdCBzY2hlbWU6CiAgICAgICAgc2NoZW1lID0gZGlzdHV0aWxzX3NjaGVtZSgKICAgICAgICAgICAgbmFtZSwgdXNlcj11c2VyLCBob21lPWhvbWUsIHJvb3Q9cm9vdCwgaXNvbGF0ZWQ9aXNvbGF0ZWQsCiAgICAgICAgICAgIHByZWZpeD1wcmVmaXgsCiAgICAgICAgKQoKICAgIGlmIHJvb3RfaXNfcHVyZWxpYihuYW1lLCB3aGVlbGRpcik6CiAgICAgICAgbGliX2RpciA9IHNjaGVtZVsncHVyZWxpYiddCiAgICBlbHNlOgogICAgICAgIGxpYl9kaXIgPSBzY2hlbWVbJ3BsYXRsaWInXQoKICAgIGluZm9fZGlyID0gW10KICAgIGRhdGFfZGlycyA9IFtdCiAgICBzb3VyY2UgPSB3aGVlbGRpci5yc3RyaXAob3MucGF0aC5zZXApICsgb3MucGF0aC5zZXAKCiAgICAjIFJlY29yZCBkZXRhaWxzIG9mIHRoZSBmaWxlcyBtb3ZlZAogICAgIyAgIGluc3RhbGxlZCA9IGZpbGVzIGNvcGllZCBmcm9tIHRoZSB3aGVlbCB0byB0aGUgZGVzdGluYXRpb24KICAgICMgICBjaGFuZ2VkID0gZmlsZXMgY2hhbmdlZCB3aGlsZSBpbnN0YWxsaW5nIChzY3JpcHRzICMhIGxpbmUgdHlwaWNhbGx5KQogICAgIyAgIGdlbmVyYXRlZCA9IGZpbGVzIG5ld2x5IGdlbmVyYXRlZCBkdXJpbmcgdGhlIGluc3RhbGwgKHNjcmlwdCB3cmFwcGVycykKICAgIGluc3RhbGxlZCA9IHt9CiAgICBjaGFuZ2VkID0gc2V0KCkKICAgIGdlbmVyYXRlZCA9IFtdCgogICAgIyBDb21waWxlIGFsbCBvZiB0aGUgcHljIGZpbGVzIHRoYXQgd2UncmUgZ29pbmcgdG8gYmUgaW5zdGFsbGluZwogICAgaWYgcHljb21waWxlOgogICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgc3Rkb3V0OgogICAgICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CiAgICAgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnaWdub3JlJykKICAgICAgICAgICAgICAgIGNvbXBpbGVhbGwuY29tcGlsZV9kaXIoc291cmNlLCBmb3JjZT1UcnVlLCBxdWlldD1UcnVlKQogICAgICAgIGxvZ2dlci5kZWJ1ZyhzdGRvdXQuZ2V0dmFsdWUoKSkKCiAgICBkZWYgbm9ybXBhdGgoc3JjLCBwKToKICAgICAgICByZXR1cm4gb3MucGF0aC5yZWxwYXRoKHNyYywgcCkucmVwbGFjZShvcy5wYXRoLnNlcCwgJy8nKQoKICAgIGRlZiByZWNvcmRfaW5zdGFsbGVkKHNyY2ZpbGUsIGRlc3RmaWxlLCBtb2RpZmllZD1GYWxzZSk6CiAgICAgICAgIiIiTWFwIGFyY2hpdmUgUkVDT1JEIHBhdGhzIHRvIGluc3RhbGxhdGlvbiBSRUNPUkQgcGF0aHMuIiIiCiAgICAgICAgb2xkcGF0aCA9IG5vcm1wYXRoKHNyY2ZpbGUsIHdoZWVsZGlyKQogICAgICAgIG5ld3BhdGggPSBub3JtcGF0aChkZXN0ZmlsZSwgbGliX2RpcikKICAgICAgICBpbnN0YWxsZWRbb2xkcGF0aF0gPSBuZXdwYXRoCiAgICAgICAgaWYgbW9kaWZpZWQ6CiAgICAgICAgICAgIGNoYW5nZWQuYWRkKGRlc3RmaWxlKQoKICAgIGRlZiBjbG9iYmVyKHNvdXJjZSwgZGVzdCwgaXNfYmFzZSwgZml4ZXI9Tm9uZSwgZmlsdGVyPU5vbmUpOgogICAgICAgIGVuc3VyZV9kaXIoZGVzdCkgICMgY29tbW9uIGZvciB0aGUgJ2luY2x1ZGUnIHBhdGgKCiAgICAgICAgZm9yIGRpciwgc3ViZGlycywgZmlsZXMgaW4gb3Mud2Fsayhzb3VyY2UpOgogICAgICAgICAgICBiYXNlZGlyID0gZGlyW2xlbihzb3VyY2UpOl0ubHN0cmlwKG9zLnBhdGguc2VwKQogICAgICAgICAgICBkZXN0ZGlyID0gb3MucGF0aC5qb2luKGRlc3QsIGJhc2VkaXIpCiAgICAgICAgICAgIGlmIGlzX2Jhc2UgYW5kIGJhc2VkaXIuc3BsaXQob3MucGF0aC5zZXAsIDEpWzBdLmVuZHN3aXRoKCcuZGF0YScpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZm9yIHMgaW4gc3ViZGlyczoKICAgICAgICAgICAgICAgIGRlc3RzdWJkaXIgPSBvcy5wYXRoLmpvaW4oZGVzdCwgYmFzZWRpciwgcykKICAgICAgICAgICAgICAgIGlmIGlzX2Jhc2UgYW5kIGJhc2VkaXIgPT0gJycgYW5kIGRlc3RzdWJkaXIuZW5kc3dpdGgoJy5kYXRhJyk6CiAgICAgICAgICAgICAgICAgICAgZGF0YV9kaXJzLmFwcGVuZChzKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBlbGlmIChpc19iYXNlIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBzLmVuZHN3aXRoKCcuZGlzdC1pbmZvJykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbGl6ZV9uYW1lKHMpLnN0YXJ0c3dpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5vbmljYWxpemVfbmFtZShyZXEubmFtZSkpKToKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbm90IGluZm9fZGlyLCAoJ011bHRpcGxlIC5kaXN0LWluZm8gZGlyZWN0b3JpZXM6ICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0c3ViZGlyICsgJywgJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsICcuam9pbihpbmZvX2RpcikpCiAgICAgICAgICAgICAgICAgICAgaW5mb19kaXIuYXBwZW5kKGRlc3RzdWJkaXIpCiAgICAgICAgICAgIGZvciBmIGluIGZpbGVzOgogICAgICAgICAgICAgICAgIyBTa2lwIHVud2FudGVkIGZpbGVzCiAgICAgICAgICAgICAgICBpZiBmaWx0ZXIgYW5kIGZpbHRlcihmKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgc3JjZmlsZSA9IG9zLnBhdGguam9pbihkaXIsIGYpCiAgICAgICAgICAgICAgICBkZXN0ZmlsZSA9IG9zLnBhdGguam9pbihkZXN0LCBiYXNlZGlyLCBmKQogICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkgY3JlYXRpb24gaXMgbGF6eSBhbmQgYWZ0ZXIgdGhlIGZpbGUgZmlsdGVyaW5nIGFib3ZlCiAgICAgICAgICAgICAgICAjIHRvIGVuc3VyZSB3ZSBkb24ndCBpbnN0YWxsIGVtcHR5IGRpcnM7IGVtcHR5IGRpcnMgY2FuJ3QgYmUKICAgICAgICAgICAgICAgICMgdW5pbnN0YWxsZWQuCiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyKGRlc3RkaXIpCgogICAgICAgICAgICAgICAgIyBXZSB1c2UgY29weWZpbGUgKG5vdCBtb3ZlLCBjb3B5LCBvciBjb3B5MikgdG8gYmUgZXh0cmEgc3VyZQogICAgICAgICAgICAgICAgIyB0aGF0IHdlIGFyZSBub3QgbW92aW5nIGRpcmVjdG9yaWVzIG92ZXIgKGNvcHlmaWxlIGZhaWxzIGZvcgogICAgICAgICAgICAgICAgIyBkaXJlY3RvcmllcykgYXMgd2VsbCBhcyB0byBlbnN1cmUgdGhhdCB3ZSBhcmUgbm90IGNvcHlpbmcKICAgICAgICAgICAgICAgICMgb3ZlciBhbnkgbWV0YWRhdGEgYmVjYXVzZSB3ZSB3YW50IG1vcmUgY29udHJvbCBvdmVyIHdoYXQKICAgICAgICAgICAgICAgICMgbWV0YWRhdGEgd2UgYWN0dWFsbHkgY29weSBvdmVyLgogICAgICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlKHNyY2ZpbGUsIGRlc3RmaWxlKQoKICAgICAgICAgICAgICAgICMgQ29weSBvdmVyIHRoZSBtZXRhZGF0YSBmb3IgdGhlIGZpbGUsIGN1cnJlbnRseSB0aGlzIG9ubHkKICAgICAgICAgICAgICAgICMgaW5jbHVkZXMgdGhlIGF0aW1lIGFuZCBtdGltZS4KICAgICAgICAgICAgICAgIHN0ID0gb3Muc3RhdChzcmNmaWxlKQogICAgICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgInV0aW1lIik6CiAgICAgICAgICAgICAgICAgICAgb3MudXRpbWUoZGVzdGZpbGUsIChzdC5zdF9hdGltZSwgc3Quc3RfbXRpbWUpKQoKICAgICAgICAgICAgICAgICMgSWYgb3VyIGZpbGUgaXMgZXhlY3V0YWJsZSwgdGhlbiBtYWtlIG91ciBkZXN0aW5hdGlvbiBmaWxlCiAgICAgICAgICAgICAgICAjIGV4ZWN1dGFibGUuCiAgICAgICAgICAgICAgICBpZiBvcy5hY2Nlc3Moc3JjZmlsZSwgb3MuWF9PSyk6CiAgICAgICAgICAgICAgICAgICAgc3QgPSBvcy5zdGF0KHNyY2ZpbGUpCiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgPSAoCiAgICAgICAgICAgICAgICAgICAgICAgIHN0LnN0X21vZGUgfCBzdGF0LlNfSVhVU1IgfCBzdGF0LlNfSVhHUlAgfCBzdGF0LlNfSVhPVEgKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgb3MuY2htb2QoZGVzdGZpbGUsIHBlcm1pc3Npb25zKQoKICAgICAgICAgICAgICAgIGNoYW5nZWQgPSBGYWxzZQogICAgICAgICAgICAgICAgaWYgZml4ZXI6CiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IGZpeGVyKGRlc3RmaWxlKQogICAgICAgICAgICAgICAgcmVjb3JkX2luc3RhbGxlZChzcmNmaWxlLCBkZXN0ZmlsZSwgY2hhbmdlZCkKCiAgICBjbG9iYmVyKHNvdXJjZSwgbGliX2RpciwgVHJ1ZSkKCiAgICBhc3NlcnQgaW5mb19kaXIsICIlcyAuZGlzdC1pbmZvIGRpcmVjdG9yeSBub3QgZm91bmQiICUgcmVxCgogICAgIyBHZXQgdGhlIGRlZmluZWQgZW50cnkgcG9pbnRzCiAgICBlcF9maWxlID0gb3MucGF0aC5qb2luKGluZm9fZGlyWzBdLCAnZW50cnlfcG9pbnRzLnR4dCcpCiAgICBjb25zb2xlLCBndWkgPSBnZXRfZW50cnlwb2ludHMoZXBfZmlsZSkKCiAgICBkZWYgaXNfZW50cnlwb2ludF93cmFwcGVyKG5hbWUpOgogICAgICAgICMgRVAsIEVQLmV4ZSBhbmQgRVAtc2NyaXB0LnB5IGFyZSBzY3JpcHRzIGdlbmVyYXRlZCBmb3IKICAgICAgICAjIGVudHJ5IHBvaW50IEVQIGJ5IHNldHVwdG9vbHMKICAgICAgICBpZiBuYW1lLmxvd2VyKCkuZW5kc3dpdGgoJy5leGUnKToKICAgICAgICAgICAgbWF0Y2huYW1lID0gbmFtZVs6LTRdCiAgICAgICAgZWxpZiBuYW1lLmxvd2VyKCkuZW5kc3dpdGgoJy1zY3JpcHQucHknKToKICAgICAgICAgICAgbWF0Y2huYW1lID0gbmFtZVs6LTEwXQogICAgICAgIGVsaWYgbmFtZS5sb3dlcigpLmVuZHN3aXRoKCIucHlhIik6CiAgICAgICAgICAgIG1hdGNobmFtZSA9IG5hbWVbOi00XQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1hdGNobmFtZSA9IG5hbWUKICAgICAgICAjIElnbm9yZSBzZXR1cHRvb2xzLWdlbmVyYXRlZCBzY3JpcHRzCiAgICAgICAgcmV0dXJuIChtYXRjaG5hbWUgaW4gY29uc29sZSBvciBtYXRjaG5hbWUgaW4gZ3VpKQoKICAgIGZvciBkYXRhZGlyIGluIGRhdGFfZGlyczoKICAgICAgICBmaXhlciA9IE5vbmUKICAgICAgICBmaWx0ZXIgPSBOb25lCiAgICAgICAgZm9yIHN1YmRpciBpbiBvcy5saXN0ZGlyKG9zLnBhdGguam9pbih3aGVlbGRpciwgZGF0YWRpcikpOgogICAgICAgICAgICBmaXhlciA9IE5vbmUKICAgICAgICAgICAgaWYgc3ViZGlyID09ICdzY3JpcHRzJzoKICAgICAgICAgICAgICAgIGZpeGVyID0gZml4X3NjcmlwdAogICAgICAgICAgICAgICAgZmlsdGVyID0gaXNfZW50cnlwb2ludF93cmFwcGVyCiAgICAgICAgICAgIHNvdXJjZSA9IG9zLnBhdGguam9pbih3aGVlbGRpciwgZGF0YWRpciwgc3ViZGlyKQogICAgICAgICAgICBkZXN0ID0gc2NoZW1lW3N1YmRpcl0KICAgICAgICAgICAgY2xvYmJlcihzb3VyY2UsIGRlc3QsIEZhbHNlLCBmaXhlcj1maXhlciwgZmlsdGVyPWZpbHRlcikKCiAgICBtYWtlciA9IFNjcmlwdE1ha2VyKE5vbmUsIHNjaGVtZVsnc2NyaXB0cyddKQoKICAgICMgRW5zdXJlIG9sZCBzY3JpcHRzIGFyZSBvdmVyd3JpdHRlbi4KICAgICMgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMTgwMAogICAgbWFrZXIuY2xvYmJlciA9IFRydWUKCiAgICAjIEVuc3VyZSB3ZSBkb24ndCBnZW5lcmF0ZSBhbnkgdmFyaWFudHMgZm9yIHNjcmlwdHMgYmVjYXVzZSB0aGlzIGlzIGFsbW9zdAogICAgIyBuZXZlciB3aGF0IHNvbWVib2R5IHdhbnRzLgogICAgIyBTZWUgaHR0cHM6Ly9iaXRidWNrZXQub3JnL3B5cGEvZGlzdGxpYi9pc3N1ZS8zNS8KICAgIG1ha2VyLnZhcmlhbnRzID0gc2V0KCgnJywgKSkKCiAgICAjIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBvdGhlcndpc2UgZGlzdGxpYiBjcmVhdGVzIHNjcmlwdHMgdGhhdCBhcmUgbm90CiAgICAjIGV4ZWN1dGFibGUuCiAgICAjIFNlZSBodHRwczovL2JpdGJ1Y2tldC5vcmcvcHlwYS9kaXN0bGliL2lzc3VlLzMyLwogICAgbWFrZXIuc2V0X21vZGUgPSBUcnVlCgogICAgIyBTaW1wbGlmeSB0aGUgc2NyaXB0IGFuZCBmaXggdGhlIGZhY3QgdGhhdCB0aGUgZGVmYXVsdCBzY3JpcHQgc3dhbGxvd3MKICAgICMgZXZlcnkgc2luZ2xlIHN0YWNrIHRyYWNlLgogICAgIyBTZWUgaHR0cHM6Ly9iaXRidWNrZXQub3JnL3B5cGEvZGlzdGxpYi9pc3N1ZS8zNC8KICAgICMgU2VlIGh0dHBzOi8vYml0YnVja2V0Lm9yZy9weXBhL2Rpc3RsaWIvaXNzdWUvMzMvCiAgICBkZWYgX2dldF9zY3JpcHRfdGV4dChlbnRyeSk6CiAgICAgICAgaWYgZW50cnkuc3VmZml4IGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIkludmFsaWQgc2NyaXB0IGVudHJ5IHBvaW50OiAlcyBmb3IgcmVxOiAlcyAtIEEgY2FsbGFibGUgIgogICAgICAgICAgICAgICAgInN1ZmZpeCBpcyByZXF1aXJlZC4gQ2YgaHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi8iCiAgICAgICAgICAgICAgICAibGF0ZXN0L2Rpc3RyaWJ1dGluZy5odG1sI2NvbnNvbGUtc2NyaXB0cyBmb3IgbW9yZSAiCiAgICAgICAgICAgICAgICAiaW5mb3JtYXRpb24uIiAlIChlbnRyeSwgcmVxKQogICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIG1ha2VyLnNjcmlwdF90ZW1wbGF0ZSAlIHsKICAgICAgICAgICAgIm1vZHVsZSI6IGVudHJ5LnByZWZpeCwKICAgICAgICAgICAgImltcG9ydF9uYW1lIjogZW50cnkuc3VmZml4LnNwbGl0KCIuIilbMF0sCiAgICAgICAgICAgICJmdW5jIjogZW50cnkuc3VmZml4LAogICAgICAgIH0KCiAgICBtYWtlci5fZ2V0X3NjcmlwdF90ZXh0ID0gX2dldF9zY3JpcHRfdGV4dAogICAgbWFrZXIuc2NyaXB0X3RlbXBsYXRlID0gIiIiIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KaW1wb3J0IHJlCmltcG9ydCBzeXMKCmZyb20gJShtb2R1bGUpcyBpbXBvcnQgJShpbXBvcnRfbmFtZSlzCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgc3lzLmFyZ3ZbMF0gPSByZS5zdWIocicoLXNjcmlwdFwucHl3P3xcLmV4ZSk/JCcsICcnLCBzeXMuYXJndlswXSkKICAgIHN5cy5leGl0KCUoZnVuYylzKCkpCiIiIgoKICAgICMgU3BlY2lhbCBjYXNlIHBpcCBhbmQgc2V0dXB0b29scyB0byBnZW5lcmF0ZSB2ZXJzaW9uZWQgd3JhcHBlcnMKICAgICMKICAgICMgVGhlIGlzc3VlIGlzIHRoYXQgc29tZSBwcm9qZWN0cyAoc3BlY2lmaWNhbGx5LCBwaXAgYW5kIHNldHVwdG9vbHMpIHVzZQogICAgIyBjb2RlIGluIHNldHVwLnB5IHRvIGNyZWF0ZSAidmVyc2lvbmVkIiBlbnRyeSBwb2ludHMgLSBwaXAyLjcgb24gUHl0aG9uCiAgICAjIDIuNywgcGlwMy4zIG9uIFB5dGhvbiAzLjMsIGV0Yy4gQnV0IHRoZXNlIGVudHJ5IHBvaW50cyBhcmUgYmFrZWQgaW50bwogICAgIyB0aGUgd2hlZWwgbWV0YWRhdGEgYXQgYnVpbGQgdGltZSwgYW5kIHNvIGlmIHRoZSB3aGVlbCBpcyBpbnN0YWxsZWQgd2l0aAogICAgIyBhICpkaWZmZXJlbnQqIHZlcnNpb24gb2YgUHl0aG9uIHRoZSBlbnRyeSBwb2ludHMgd2lsbCBiZSB3cm9uZy4gVGhlCiAgICAjIGNvcnJlY3QgZml4IGZvciB0aGlzIGlzIHRvIGVuaGFuY2UgdGhlIG1ldGFkYXRhIHRvIGJlIGFibGUgdG8gZGVzY3JpYmUKICAgICMgc3VjaCB2ZXJzaW9uZWQgZW50cnkgcG9pbnRzLCBidXQgdGhhdCB3b24ndCBoYXBwZW4gdGlsbCBNZXRhZGF0YSAyLjAgaXMKICAgICMgYXZhaWxhYmxlLgogICAgIyBJbiB0aGUgbWVhbnRpbWUsIHByb2plY3RzIHVzaW5nIHZlcnNpb25lZCBlbnRyeSBwb2ludHMgd2lsbCBlaXRoZXIgaGF2ZQogICAgIyBpbmNvcnJlY3QgdmVyc2lvbmVkIGVudHJ5IHBvaW50cywgb3IgdGhleSB3aWxsIG5vdCBiZSBhYmxlIHRvIGRpc3RyaWJ1dGUKICAgICMgInVuaXZlcnNhbCIgd2hlZWxzIChpLmUuLCB0aGV5IHdpbGwgbmVlZCBhIHdoZWVsIHBlciBQeXRob24gdmVyc2lvbikuCiAgICAjCiAgICAjIEJlY2F1c2Ugc2V0dXB0b29scyBhbmQgcGlwIGFyZSBidW5kbGVkIHdpdGggX2Vuc3VyZXBpcCBhbmQgdmlydHVhbGVudiwKICAgICMgd2UgbmVlZCB0byB1c2UgdW5pdmVyc2FsIHdoZWVscy4gU28sIGFzIGEgc3RvcGdhcCB1bnRpbCBNZXRhZGF0YSAyLjAsIHdlCiAgICAjIG92ZXJyaWRlIHRoZSB2ZXJzaW9uZWQgZW50cnkgcG9pbnRzIGluIHRoZSB3aGVlbCBhbmQgZ2VuZXJhdGUgdGhlCiAgICAjIGNvcnJlY3Qgb25lcy4gVGhpcyBjb2RlIGlzIHB1cmVseSBhIHNob3J0LXRlcm0gbWVhc3VyZSB1bnRpbCBNZXRhZGF0YSAyLjAKICAgICMgaXMgYXZhaWxhYmxlLgogICAgIwogICAgIyBUbyBhZGQgdGhlIGxldmVsIG9mIGhhY2sgaW4gdGhpcyBzZWN0aW9uIG9mIGNvZGUsIGluIG9yZGVyIHRvIHN1cHBvcnQKICAgICMgZW5zdXJlcGlwIHRoaXMgY29kZSB3aWxsIGxvb2sgZm9yIGFuIGBgRU5TVVJFUElQX09QVElPTlNgYCBlbnZpcm9ubWVudAogICAgIyB2YXJpYWJsZSB3aGljaCB3aWxsIGNvbnRyb2wgd2hpY2ggdmVyc2lvbiBzY3JpcHRzIGdldCBpbnN0YWxsZWQuCiAgICAjCiAgICAjIEVOU1VSRVBJUF9PUFRJT05TPWFsdGluc3RhbGwKICAgICMgICAtIE9ubHkgcGlwWC5ZIGFuZCBlYXN5X2luc3RhbGwtWC5ZIHdpbGwgYmUgZ2VuZXJhdGVkIGFuZCBpbnN0YWxsZWQKICAgICMgRU5TVVJFUElQX09QVElPTlM9aW5zdGFsbAogICAgIyAgIC0gcGlwWC5ZLCBwaXBYLCBlYXN5X2luc3RhbGwtWC5ZIHdpbGwgYmUgZ2VuZXJhdGVkIGFuZCBpbnN0YWxsZWQuIE5vdGUKICAgICMgICAgIHRoYXQgdGhpcyBvcHRpb24gaXMgdGVjaG5pY2FsbHkgaWYgRU5TVVJFUElQX09QVElPTlMgaXMgc2V0IGFuZCBpcwogICAgIyAgICAgbm90IGFsdGluc3RhbGwKICAgICMgREVGQVVMVAogICAgIyAgIC0gVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gaW5zdGFsbCBwaXAsIHBpcFgsIHBpcFguWSwgZWFzeV9pbnN0YWxsCiAgICAjICAgICBhbmQgZWFzeV9pbnN0YWxsLVguWS4KICAgIHBpcF9zY3JpcHQgPSBjb25zb2xlLnBvcCgncGlwJywgTm9uZSkKICAgIGlmIHBpcF9zY3JpcHQ6CiAgICAgICAgaWYgIkVOU1VSRVBJUF9PUFRJT05TIiBub3QgaW4gb3MuZW52aXJvbjoKICAgICAgICAgICAgc3BlYyA9ICdwaXAgPSAnICsgcGlwX3NjcmlwdAogICAgICAgICAgICBnZW5lcmF0ZWQuZXh0ZW5kKG1ha2VyLm1ha2Uoc3BlYykpCgogICAgICAgIGlmIG9zLmVudmlyb24uZ2V0KCJFTlNVUkVQSVBfT1BUSU9OUyIsICIiKSAhPSAiYWx0aW5zdGFsbCI6CiAgICAgICAgICAgIHNwZWMgPSAncGlwJXMgPSAlcycgJSAoc3lzLnZlcnNpb25bOjFdLCBwaXBfc2NyaXB0KQogICAgICAgICAgICBnZW5lcmF0ZWQuZXh0ZW5kKG1ha2VyLm1ha2Uoc3BlYykpCgogICAgICAgIHNwZWMgPSAncGlwJXMgPSAlcycgJSAoc3lzLnZlcnNpb25bOjNdLCBwaXBfc2NyaXB0KQogICAgICAgIGdlbmVyYXRlZC5leHRlbmQobWFrZXIubWFrZShzcGVjKSkKICAgICAgICAjIERlbGV0ZSBhbnkgb3RoZXIgdmVyc2lvbmVkIHBpcCBlbnRyeSBwb2ludHMKICAgICAgICBwaXBfZXAgPSBbayBmb3IgayBpbiBjb25zb2xlIGlmIHJlLm1hdGNoKHIncGlwKFxkKFwuXGQpPyk/JCcsIGspXQogICAgICAgIGZvciBrIGluIHBpcF9lcDoKICAgICAgICAgICAgZGVsIGNvbnNvbGVba10KICAgIGVhc3lfaW5zdGFsbF9zY3JpcHQgPSBjb25zb2xlLnBvcCgnZWFzeV9pbnN0YWxsJywgTm9uZSkKICAgIGlmIGVhc3lfaW5zdGFsbF9zY3JpcHQ6CiAgICAgICAgaWYgIkVOU1VSRVBJUF9PUFRJT05TIiBub3QgaW4gb3MuZW52aXJvbjoKICAgICAgICAgICAgc3BlYyA9ICdlYXN5X2luc3RhbGwgPSAnICsgZWFzeV9pbnN0YWxsX3NjcmlwdAogICAgICAgICAgICBnZW5lcmF0ZWQuZXh0ZW5kKG1ha2VyLm1ha2Uoc3BlYykpCgogICAgICAgIHNwZWMgPSAnZWFzeV9pbnN0YWxsLSVzID0gJXMnICUgKHN5cy52ZXJzaW9uWzozXSwgZWFzeV9pbnN0YWxsX3NjcmlwdCkKICAgICAgICBnZW5lcmF0ZWQuZXh0ZW5kKG1ha2VyLm1ha2Uoc3BlYykpCiAgICAgICAgIyBEZWxldGUgYW55IG90aGVyIHZlcnNpb25lZCBlYXN5X2luc3RhbGwgZW50cnkgcG9pbnRzCiAgICAgICAgZWFzeV9pbnN0YWxsX2VwID0gWwogICAgICAgICAgICBrIGZvciBrIGluIGNvbnNvbGUgaWYgcmUubWF0Y2gocidlYXN5X2luc3RhbGwoLVxkXC5cZCk/JCcsIGspCiAgICAgICAgXQogICAgICAgIGZvciBrIGluIGVhc3lfaW5zdGFsbF9lcDoKICAgICAgICAgICAgZGVsIGNvbnNvbGVba10KCiAgICAjIEdlbmVyYXRlIHRoZSBjb25zb2xlIGFuZCBHVUkgZW50cnkgcG9pbnRzIHNwZWNpZmllZCBpbiB0aGUgd2hlZWwKICAgIGlmIGxlbihjb25zb2xlKSA+IDA6CiAgICAgICAgZ2VuZXJhdGVkLmV4dGVuZCgKICAgICAgICAgICAgbWFrZXIubWFrZV9tdWx0aXBsZShbJyVzID0gJXMnICUga3YgZm9yIGt2IGluIGNvbnNvbGUuaXRlbXMoKV0pCiAgICAgICAgKQogICAgaWYgbGVuKGd1aSkgPiAwOgogICAgICAgIGdlbmVyYXRlZC5leHRlbmQoCiAgICAgICAgICAgIG1ha2VyLm1ha2VfbXVsdGlwbGUoCiAgICAgICAgICAgICAgICBbJyVzID0gJXMnICUga3YgZm9yIGt2IGluIGd1aS5pdGVtcygpXSwKICAgICAgICAgICAgICAgIHsnZ3VpJzogVHJ1ZX0KICAgICAgICAgICAgKQogICAgICAgICkKCiAgICAjIFJlY29yZCBwaXAgYXMgdGhlIGluc3RhbGxlcgogICAgaW5zdGFsbGVyID0gb3MucGF0aC5qb2luKGluZm9fZGlyWzBdLCAnSU5TVEFMTEVSJykKICAgIHRlbXBfaW5zdGFsbGVyID0gb3MucGF0aC5qb2luKGluZm9fZGlyWzBdLCAnSU5TVEFMTEVSLnBpcCcpCiAgICB3aXRoIG9wZW4odGVtcF9pbnN0YWxsZXIsICd3YicpIGFzIGluc3RhbGxlcl9maWxlOgogICAgICAgIGluc3RhbGxlcl9maWxlLndyaXRlKGIncGlwXG4nKQogICAgc2h1dGlsLm1vdmUodGVtcF9pbnN0YWxsZXIsIGluc3RhbGxlcikKICAgIGdlbmVyYXRlZC5hcHBlbmQoaW5zdGFsbGVyKQoKICAgICMgUmVjb3JkIGRldGFpbHMgb2YgYWxsIGZpbGVzIGluc3RhbGxlZAogICAgcmVjb3JkID0gb3MucGF0aC5qb2luKGluZm9fZGlyWzBdLCAnUkVDT1JEJykKICAgIHRlbXBfcmVjb3JkID0gb3MucGF0aC5qb2luKGluZm9fZGlyWzBdLCAnUkVDT1JELnBpcCcpCiAgICB3aXRoIG9wZW5fZm9yX2NzdihyZWNvcmQsICdyJykgYXMgcmVjb3JkX2luOgogICAgICAgIHdpdGggb3Blbl9mb3JfY3N2KHRlbXBfcmVjb3JkLCAndysnKSBhcyByZWNvcmRfb3V0OgogICAgICAgICAgICByZWFkZXIgPSBjc3YucmVhZGVyKHJlY29yZF9pbikKICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihyZWNvcmRfb3V0KQogICAgICAgICAgICBmb3Igcm93IGluIHJlYWRlcjoKICAgICAgICAgICAgICAgIHJvd1swXSA9IGluc3RhbGxlZC5wb3Aocm93WzBdLCByb3dbMF0pCiAgICAgICAgICAgICAgICBpZiByb3dbMF0gaW4gY2hhbmdlZDoKICAgICAgICAgICAgICAgICAgICByb3dbMV0sIHJvd1syXSA9IHJlaGFzaChyb3dbMF0pCiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3cocm93KQogICAgICAgICAgICBmb3IgZiBpbiBnZW5lcmF0ZWQ6CiAgICAgICAgICAgICAgICBoLCBsID0gcmVoYXNoKGYpCiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coKG5vcm1wYXRoKGYsIGxpYl9kaXIpLCBoLCBsKSkKICAgICAgICAgICAgZm9yIGYgaW4gaW5zdGFsbGVkOgogICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KChpbnN0YWxsZWRbZl0sICcnLCAnJykpCiAgICBzaHV0aWwubW92ZSh0ZW1wX3JlY29yZCwgcmVjb3JkKQoKCmRlZiBfdW5pcXVlKGZuKToKICAgIEBmdW5jdG9vbHMud3JhcHMoZm4pCiAgICBkZWYgdW5pcXVlKCphcmdzLCAqKmt3KToKICAgICAgICBzZWVuID0gc2V0KCkKICAgICAgICBmb3IgaXRlbSBpbiBmbigqYXJncywgKiprdyk6CiAgICAgICAgICAgIGlmIGl0ZW0gbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICBzZWVuLmFkZChpdGVtKQogICAgICAgICAgICAgICAgeWllbGQgaXRlbQogICAgcmV0dXJuIHVuaXF1ZQoKCiMgVE9ETzogdGhpcyBnb2VzIHNvbWV3aGVyZSBiZXNpZGVzIHRoZSB3aGVlbCBtb2R1bGUKQF91bmlxdWUKZGVmIHVuaW5zdGFsbGF0aW9uX3BhdGhzKGRpc3QpOgogICAgIiIiCiAgICBZaWVsZCBhbGwgdGhlIHVuaW5zdGFsbGF0aW9uIHBhdGhzIGZvciBkaXN0IGJhc2VkIG9uIFJFQ09SRC13aXRob3V0LS5weWMKCiAgICBZaWVsZCBwYXRocyB0byBhbGwgdGhlIGZpbGVzIGluIFJFQ09SRC4gRm9yIGVhY2ggLnB5IGZpbGUgaW4gUkVDT1JELCBhZGQKICAgIHRoZSAucHljIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KCiAgICBVbmluc3RhbGxQYXRoU2V0LmFkZCgpIHRha2VzIGNhcmUgb2YgdGhlIF9fcHljYWNoZV9fIC5weWMuCiAgICAiIiIKICAgIGZyb20gcGlwLnV0aWxzIGltcG9ydCBGYWtlRmlsZSAgIyBjaXJjdWxhciBpbXBvcnQKICAgIHIgPSBjc3YucmVhZGVyKEZha2VGaWxlKGRpc3QuZ2V0X21ldGFkYXRhX2xpbmVzKCdSRUNPUkQnKSkpCiAgICBmb3Igcm93IGluIHI6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihkaXN0LmxvY2F0aW9uLCByb3dbMF0pCiAgICAgICAgeWllbGQgcGF0aAogICAgICAgIGlmIHBhdGguZW5kc3dpdGgoJy5weScpOgogICAgICAgICAgICBkbiwgZm4gPSBvcy5wYXRoLnNwbGl0KHBhdGgpCiAgICAgICAgICAgIGJhc2UgPSBmbls6LTNdCiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZG4sIGJhc2UgKyAnLnB5YycpCiAgICAgICAgICAgIHlpZWxkIHBhdGgKCgpkZWYgd2hlZWxfdmVyc2lvbihzb3VyY2VfZGlyKToKICAgICIiIgogICAgUmV0dXJuIHRoZSBXaGVlbC1WZXJzaW9uIG9mIGFuIGV4dHJhY3RlZCB3aGVlbCwgaWYgcG9zc2libGUuCgogICAgT3RoZXJ3aXNlLCByZXR1cm4gRmFsc2UgaWYgd2UgY291bGRuJ3QgcGFyc2UgLyBleHRyYWN0IGl0LgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgZGlzdCA9IFtkIGZvciBkIGluIHBrZ19yZXNvdXJjZXMuZmluZF9vbl9wYXRoKE5vbmUsIHNvdXJjZV9kaXIpXVswXQoKICAgICAgICB3aGVlbF9kYXRhID0gZGlzdC5nZXRfbWV0YWRhdGEoJ1dIRUVMJykKICAgICAgICB3aGVlbF9kYXRhID0gUGFyc2VyKCkucGFyc2VzdHIod2hlZWxfZGF0YSkKCiAgICAgICAgdmVyc2lvbiA9IHdoZWVsX2RhdGFbJ1doZWVsLVZlcnNpb24nXS5zdHJpcCgpCiAgICAgICAgdmVyc2lvbiA9IHR1cGxlKG1hcChpbnQsIHZlcnNpb24uc3BsaXQoJy4nKSkpCiAgICAgICAgcmV0dXJuIHZlcnNpb24KICAgIGV4Y2VwdDoKICAgICAgICByZXR1cm4gRmFsc2UKCgpkZWYgY2hlY2tfY29tcGF0aWJpbGl0eSh2ZXJzaW9uLCBuYW1lKToKICAgICIiIgogICAgUmFpc2VzIGVycm9ycyBvciB3YXJucyBpZiBjYWxsZWQgd2l0aCBhbiBpbmNvbXBhdGlibGUgV2hlZWwtVmVyc2lvbi4KCiAgICBQaXAgc2hvdWxkIHJlZnVzZSB0byBpbnN0YWxsIGEgV2hlZWwtVmVyc2lvbiB0aGF0J3MgYSBtYWpvciBzZXJpZXMKICAgIGFoZWFkIG9mIHdoYXQgaXQncyBjb21wYXRpYmxlIHdpdGggKGUuZyAyLjAgPiAxLjEpOyBhbmQgd2FybiB3aGVuCiAgICBpbnN0YWxsaW5nIGEgdmVyc2lvbiBvbmx5IG1pbm9yIHZlcnNpb24gYWhlYWQgKGUuZyAxLjIgPiAxLjEpLgoKICAgIHZlcnNpb246IGEgMi10dXBsZSByZXByZXNlbnRpbmcgYSBXaGVlbC1WZXJzaW9uIChNYWpvciwgTWlub3IpCiAgICBuYW1lOiBuYW1lIG9mIHdoZWVsIG9yIHBhY2thZ2UgdG8gcmFpc2UgZXhjZXB0aW9uIGFib3V0CgogICAgOnJhaXNlcyBVbnN1cHBvcnRlZFdoZWVsOiB3aGVuIGFuIGluY29tcGF0aWJsZSBXaGVlbC1WZXJzaW9uIGlzIGdpdmVuCiAgICAiIiIKICAgIGlmIG5vdCB2ZXJzaW9uOgogICAgICAgIHJhaXNlIFVuc3VwcG9ydGVkV2hlZWwoCiAgICAgICAgICAgICIlcyBpcyBpbiBhbiB1bnN1cHBvcnRlZCBvciBpbnZhbGlkIHdoZWVsIiAlIG5hbWUKICAgICAgICApCiAgICBpZiB2ZXJzaW9uWzBdID4gVkVSU0lPTl9DT01QQVRJQkxFWzBdOgogICAgICAgIHJhaXNlIFVuc3VwcG9ydGVkV2hlZWwoCiAgICAgICAgICAgICIlcydzIFdoZWVsLVZlcnNpb24gKCVzKSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgdmVyc2lvbiAiCiAgICAgICAgICAgICJvZiBwaXAiICUgKG5hbWUsICcuJy5qb2luKG1hcChzdHIsIHZlcnNpb24pKSkKICAgICAgICApCiAgICBlbGlmIHZlcnNpb24gPiBWRVJTSU9OX0NPTVBBVElCTEU6CiAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICdJbnN0YWxsaW5nIGZyb20gYSBuZXdlciBXaGVlbC1WZXJzaW9uICglcyknLAogICAgICAgICAgICAnLicuam9pbihtYXAoc3RyLCB2ZXJzaW9uKSksCiAgICAgICAgKQoKCmNsYXNzIFdoZWVsKG9iamVjdCk6CiAgICAiIiJBIHdoZWVsIGZpbGUiIiIKCiAgICAjIFRPRE86IG1heWJlIG1vdmUgdGhlIGluc3RhbGwgY29kZSBpbnRvIHRoaXMgY2xhc3MKCiAgICB3aGVlbF9maWxlX3JlID0gcmUuY29tcGlsZSgKICAgICAgICByIiIiXig/UDxuYW1ldmVyPig/UDxuYW1lPi4rPyktKD9QPHZlcj5cZC4qPykpCiAgICAgICAgKCgtKD9QPGJ1aWxkPlxkLio/KSk/LSg/UDxweXZlcj4uKz8pLSg/UDxhYmk+Lis/KS0oP1A8cGxhdD4uKz8pCiAgICAgICAgXC53aGx8XC5kaXN0LWluZm8pJCIiIiwKICAgICAgICByZS5WRVJCT1NFCiAgICApCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICAiIiIKICAgICAgICA6cmFpc2VzIEludmFsaWRXaGVlbEZpbGVuYW1lOiB3aGVuIHRoZSBmaWxlbmFtZSBpcyBpbnZhbGlkIGZvciBhIHdoZWVsCiAgICAgICAgIiIiCiAgICAgICAgd2hlZWxfaW5mbyA9IHNlbGYud2hlZWxfZmlsZV9yZS5tYXRjaChmaWxlbmFtZSkKICAgICAgICBpZiBub3Qgd2hlZWxfaW5mbzoKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFdoZWVsRmlsZW5hbWUoCiAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGEgdmFsaWQgd2hlZWwgZmlsZW5hbWUuIiAlIGZpbGVuYW1lCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKICAgICAgICBzZWxmLm5hbWUgPSB3aGVlbF9pbmZvLmdyb3VwKCduYW1lJykucmVwbGFjZSgnXycsICctJykKICAgICAgICAjIHdlJ2xsIGFzc3VtZSAiXyIgbWVhbnMgIi0iIGR1ZSB0byB3aGVlbCBuYW1pbmcgc2NoZW1lCiAgICAgICAgIyAoaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8xMTUwKQogICAgICAgIHNlbGYudmVyc2lvbiA9IHdoZWVsX2luZm8uZ3JvdXAoJ3ZlcicpLnJlcGxhY2UoJ18nLCAnLScpCiAgICAgICAgc2VsZi5weXZlcnNpb25zID0gd2hlZWxfaW5mby5ncm91cCgncHl2ZXInKS5zcGxpdCgnLicpCiAgICAgICAgc2VsZi5hYmlzID0gd2hlZWxfaW5mby5ncm91cCgnYWJpJykuc3BsaXQoJy4nKQogICAgICAgIHNlbGYucGxhdHMgPSB3aGVlbF9pbmZvLmdyb3VwKCdwbGF0Jykuc3BsaXQoJy4nKQoKICAgICAgICAjIEFsbCB0aGUgdGFnIGNvbWJpbmF0aW9ucyBmcm9tIHRoaXMgZmlsZQogICAgICAgIHNlbGYuZmlsZV90YWdzID0gc2V0KAogICAgICAgICAgICAoeCwgeSwgeikgZm9yIHggaW4gc2VsZi5weXZlcnNpb25zCiAgICAgICAgICAgIGZvciB5IGluIHNlbGYuYWJpcyBmb3IgeiBpbiBzZWxmLnBsYXRzCiAgICAgICAgKQoKICAgIGRlZiBzdXBwb3J0X2luZGV4X21pbihzZWxmLCB0YWdzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgbG93ZXN0IGluZGV4IHRoYXQgb25lIG9mIHRoZSB3aGVlbCdzIGZpbGVfdGFnIGNvbWJpbmF0aW9ucwogICAgICAgIGFjaGlldmVzIGluIHRoZSBzdXBwb3J0ZWRfdGFncyBsaXN0IGUuZy4gaWYgdGhlcmUgYXJlIDggc3VwcG9ydGVkIHRhZ3MsCiAgICAgICAgYW5kIG9uZSBvZiB0aGUgZmlsZSB0YWdzIGlzIGZpcnN0IGluIHRoZSBsaXN0LCB0aGVuIHJldHVybiAwLiAgUmV0dXJucwogICAgICAgIE5vbmUgaXMgdGhlIHdoZWVsIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgdGFncyBpcyBOb25lOiAgIyBmb3IgbW9jawogICAgICAgICAgICB0YWdzID0gcGVwNDI1dGFncy5zdXBwb3J0ZWRfdGFncwogICAgICAgIGluZGV4ZXMgPSBbdGFncy5pbmRleChjKSBmb3IgYyBpbiBzZWxmLmZpbGVfdGFncyBpZiBjIGluIHRhZ3NdCiAgICAgICAgcmV0dXJuIG1pbihpbmRleGVzKSBpZiBpbmRleGVzIGVsc2UgTm9uZQoKICAgIGRlZiBzdXBwb3J0ZWQoc2VsZiwgdGFncz1Ob25lKToKICAgICAgICAiIiJJcyB0aGlzIHdoZWVsIHN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbT8iIiIKICAgICAgICBpZiB0YWdzIGlzIE5vbmU6ICAjIGZvciBtb2NrCiAgICAgICAgICAgIHRhZ3MgPSBwZXA0MjV0YWdzLnN1cHBvcnRlZF90YWdzCiAgICAgICAgcmV0dXJuIGJvb2woc2V0KHRhZ3MpLmludGVyc2VjdGlvbihzZWxmLmZpbGVfdGFncykpCgoKY2xhc3MgV2hlZWxCdWlsZGVyKG9iamVjdCk6CiAgICAiIiJCdWlsZCB3aGVlbHMgZnJvbSBhIFJlcXVpcmVtZW50U2V0LiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXF1aXJlbWVudF9zZXQsIGZpbmRlciwgYnVpbGRfb3B0aW9ucz1Ob25lLAogICAgICAgICAgICAgICAgIGdsb2JhbF9vcHRpb25zPU5vbmUpOgogICAgICAgIHNlbGYucmVxdWlyZW1lbnRfc2V0ID0gcmVxdWlyZW1lbnRfc2V0CiAgICAgICAgc2VsZi5maW5kZXIgPSBmaW5kZXIKICAgICAgICBzZWxmLl9jYWNoZV9yb290ID0gcmVxdWlyZW1lbnRfc2V0Ll93aGVlbF9jYWNoZS5fY2FjaGVfZGlyCiAgICAgICAgc2VsZi5fd2hlZWxfZGlyID0gcmVxdWlyZW1lbnRfc2V0LndoZWVsX2Rvd25sb2FkX2RpcgogICAgICAgIHNlbGYuYnVpbGRfb3B0aW9ucyA9IGJ1aWxkX29wdGlvbnMgb3IgW10KICAgICAgICBzZWxmLmdsb2JhbF9vcHRpb25zID0gZ2xvYmFsX29wdGlvbnMgb3IgW10KCiAgICBkZWYgX2J1aWxkX29uZShzZWxmLCByZXEsIG91dHB1dF9kaXIsIHB5dGhvbl90YWc9Tm9uZSk6CiAgICAgICAgIiIiQnVpbGQgb25lIHdoZWVsLgoKICAgICAgICA6cmV0dXJuOiBUaGUgZmlsZW5hbWUgb2YgdGhlIGJ1aWx0IHdoZWVsLCBvciBOb25lIGlmIHRoZSBidWlsZCBmYWlsZWQuCiAgICAgICAgIiIiCiAgICAgICAgdGVtcGQgPSB0ZW1wZmlsZS5ta2R0ZW1wKCdwaXAtd2hlZWwtJykKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIHNlbGYuX19idWlsZF9vbmUocmVxLCB0ZW1wZCwgcHl0aG9uX3RhZz1weXRob25fdGFnKToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICB3aGVlbF9uYW1lID0gb3MubGlzdGRpcih0ZW1wZClbMF0KICAgICAgICAgICAgICAgICAgICB3aGVlbF9wYXRoID0gb3MucGF0aC5qb2luKG91dHB1dF9kaXIsIHdoZWVsX25hbWUpCiAgICAgICAgICAgICAgICAgICAgc2h1dGlsLm1vdmUob3MucGF0aC5qb2luKHRlbXBkLCB3aGVlbF9uYW1lKSwgd2hlZWxfcGF0aCkKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnU3RvcmVkIGluIGRpcmVjdG9yeTogJXMnLCBvdXRwdXRfZGlyKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB3aGVlbF9wYXRoCiAgICAgICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAjIElnbm9yZSByZXR1cm4sIHdlIGNhbid0IGRvIGFueXRoaW5nIGVsc2UgdXNlZnVsLgogICAgICAgICAgICBzZWxmLl9jbGVhbl9vbmUocmVxKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHJtdHJlZSh0ZW1wZCkKCiAgICBkZWYgX2Jhc2Vfc2V0dXBfYXJncyhzZWxmLCByZXEpOgogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIHN5cy5leGVjdXRhYmxlLCAiLXUiLCAnLWMnLAogICAgICAgICAgICBTRVRVUFRPT0xTX1NISU0gJSByZXEuc2V0dXBfcHkKICAgICAgICBdICsgbGlzdChzZWxmLmdsb2JhbF9vcHRpb25zKQoKICAgIGRlZiBfX2J1aWxkX29uZShzZWxmLCByZXEsIHRlbXBkLCBweXRob25fdGFnPU5vbmUpOgogICAgICAgIGJhc2VfYXJncyA9IHNlbGYuX2Jhc2Vfc2V0dXBfYXJncyhyZXEpCgogICAgICAgIHNwaW5fbWVzc2FnZSA9ICdSdW5uaW5nIHNldHVwLnB5IGJkaXN0X3doZWVsIGZvciAlcycgJSAocmVxLm5hbWUsKQogICAgICAgIHdpdGggb3Blbl9zcGlubmVyKHNwaW5fbWVzc2FnZSkgYXMgc3Bpbm5lcjoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdEZXN0aW5hdGlvbiBkaXJlY3Rvcnk6ICVzJywgdGVtcGQpCiAgICAgICAgICAgIHdoZWVsX2FyZ3MgPSBiYXNlX2FyZ3MgKyBbJ2JkaXN0X3doZWVsJywgJy1kJywgdGVtcGRdIFwKICAgICAgICAgICAgICAgICsgc2VsZi5idWlsZF9vcHRpb25zCgogICAgICAgICAgICBpZiBweXRob25fdGFnIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgd2hlZWxfYXJncyArPSBbIi0tcHl0aG9uLXRhZyIsIHB5dGhvbl90YWddCgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjYWxsX3N1YnByb2Nlc3Mod2hlZWxfYXJncywgY3dkPXJlcS5zZXR1cF9weV9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UsIHNwaW5uZXI9c3Bpbm5lcikKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgIHNwaW5uZXIuZmluaXNoKCJlcnJvciIpCiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCBidWlsZGluZyB3aGVlbCBmb3IgJXMnLCByZXEubmFtZSkKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfY2xlYW5fb25lKHNlbGYsIHJlcSk6CiAgICAgICAgYmFzZV9hcmdzID0gc2VsZi5fYmFzZV9zZXR1cF9hcmdzKHJlcSkKCiAgICAgICAgbG9nZ2VyLmluZm8oJ1J1bm5pbmcgc2V0dXAucHkgY2xlYW4gZm9yICVzJywgcmVxLm5hbWUpCiAgICAgICAgY2xlYW5fYXJncyA9IGJhc2VfYXJncyArIFsnY2xlYW4nLCAnLS1hbGwnXQogICAgICAgIHRyeToKICAgICAgICAgICAgY2FsbF9zdWJwcm9jZXNzKGNsZWFuX2FyZ3MsIGN3ZD1yZXEuc291cmNlX2Rpciwgc2hvd19zdGRvdXQ9RmFsc2UpCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCBjbGVhbmluZyBidWlsZCBkaXIgZm9yICVzJywgcmVxLm5hbWUpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBidWlsZChzZWxmLCBhdXRvYnVpbGRpbmc9RmFsc2UpOgogICAgICAgICIiIkJ1aWxkIHdoZWVscy4KCiAgICAgICAgOnBhcmFtIHVucGFjazogSWYgVHJ1ZSwgcmVwbGFjZSB0aGUgc2Rpc3Qgd2UgYnVpbHQgZnJvbSB3aXRoIHRoZQogICAgICAgICAgICBuZXdseSBidWlsdCB3aGVlbCwgaW4gcHJlcGFyYXRpb24gZm9yIGluc3RhbGxhdGlvbi4KICAgICAgICA6cmV0dXJuOiBUcnVlIGlmIGFsbCB0aGUgd2hlZWxzIGJ1aWx0IGNvcnJlY3RseS4KICAgICAgICAiIiIKICAgICAgICBhc3NlcnQgc2VsZi5fd2hlZWxfZGlyIG9yIChhdXRvYnVpbGRpbmcgYW5kIHNlbGYuX2NhY2hlX3Jvb3QpCiAgICAgICAgIyB1bnBhY2sgc2Rpc3RzIGFuZCBjb25zdHJ1Y3RzIHJlcSBzZXQKICAgICAgICBzZWxmLnJlcXVpcmVtZW50X3NldC5wcmVwYXJlX2ZpbGVzKHNlbGYuZmluZGVyKQoKICAgICAgICByZXFzZXQgPSBzZWxmLnJlcXVpcmVtZW50X3NldC5yZXF1aXJlbWVudHMudmFsdWVzKCkKCiAgICAgICAgYnVpbGRzZXQgPSBbXQogICAgICAgIGZvciByZXEgaW4gcmVxc2V0OgogICAgICAgICAgICBpZiByZXEuY29uc3RyYWludDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIHJlcS5pc193aGVlbDoKICAgICAgICAgICAgICAgIGlmIG5vdCBhdXRvYnVpbGRpbmc6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICdTa2lwcGluZyAlcywgZHVlIHRvIGFscmVhZHkgYmVpbmcgd2hlZWwuJywgcmVxLm5hbWUpCiAgICAgICAgICAgIGVsaWYgYXV0b2J1aWxkaW5nIGFuZCByZXEuZWRpdGFibGU6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIGVsaWYgYXV0b2J1aWxkaW5nIGFuZCByZXEubGluayBhbmQgbm90IHJlcS5saW5rLmlzX2FydGlmYWN0OgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBlbGlmIGF1dG9idWlsZGluZyBhbmQgbm90IHJlcS5zb3VyY2VfZGlyOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgYXV0b2J1aWxkaW5nOgogICAgICAgICAgICAgICAgICAgIGxpbmsgPSByZXEubGluawogICAgICAgICAgICAgICAgICAgIGJhc2UsIGV4dCA9IGxpbmsuc3BsaXRleHQoKQogICAgICAgICAgICAgICAgICAgIGlmIHBpcC5pbmRleC5lZ2dfaW5mb19tYXRjaGVzKGJhc2UsIE5vbmUsIGxpbmspIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICMgRG9lc24ndCBsb29rIGxpa2UgYSBwYWNrYWdlIC0gZG9uJ3QgYXV0b2J1aWxkIGEgd2hlZWwKICAgICAgICAgICAgICAgICAgICAgICAgIyBiZWNhdXNlIHdlJ2xsIGhhdmUgbm8gd2F5IHRvIGxvb2t1cCB0aGUgcmVzdWx0IHNhbmVseQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGlmICJiaW5hcnkiIG5vdCBpbiBwaXAuaW5kZXguZm10X2N0bF9mb3JtYXRzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maW5kZXIuZm9ybWF0X2NvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5vbmljYWxpemVfbmFtZShyZXEubmFtZSkpOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTa2lwcGluZyBiZGlzdF93aGVlbCBmb3IgJXMsIGR1ZSB0byBiaW5hcmllcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVpbmcgZGlzYWJsZWQgZm9yIGl0LiIsIHJlcS5uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgYnVpbGRzZXQuYXBwZW5kKHJlcSkKCiAgICAgICAgaWYgbm90IGJ1aWxkc2V0OgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICAjIEJ1aWxkIHRoZSB3aGVlbHMuCiAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICdCdWlsZGluZyB3aGVlbHMgZm9yIGNvbGxlY3RlZCBwYWNrYWdlczogJXMnLAogICAgICAgICAgICAnLCAnLmpvaW4oW3JlcS5uYW1lIGZvciByZXEgaW4gYnVpbGRzZXRdKSwKICAgICAgICApCiAgICAgICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgICAgIGJ1aWxkX3N1Y2Nlc3MsIGJ1aWxkX2ZhaWx1cmUgPSBbXSwgW10KICAgICAgICAgICAgZm9yIHJlcSBpbiBidWlsZHNldDoKICAgICAgICAgICAgICAgIHB5dGhvbl90YWcgPSBOb25lCiAgICAgICAgICAgICAgICBpZiBhdXRvYnVpbGRpbmc6CiAgICAgICAgICAgICAgICAgICAgcHl0aG9uX3RhZyA9IHBlcDQyNXRhZ3MuaW1wbGVtZW50YXRpb25fdGFnCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2RpciA9IF9jYWNoZV9mb3JfbGluayhzZWxmLl9jYWNoZV9yb290LCByZXEubGluaykKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZV9kaXIob3V0cHV0X2RpcikKICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygiQnVpbGRpbmcgd2hlZWwgZm9yICVzIGZhaWxlZDogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEubmFtZSwgZSkKICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRfZmFpbHVyZS5hcHBlbmQocmVxKQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyID0gc2VsZi5fd2hlZWxfZGlyCiAgICAgICAgICAgICAgICB3aGVlbF9maWxlID0gc2VsZi5fYnVpbGRfb25lKAogICAgICAgICAgICAgICAgICAgIHJlcSwgb3V0cHV0X2RpciwKICAgICAgICAgICAgICAgICAgICBweXRob25fdGFnPXB5dGhvbl90YWcsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBpZiB3aGVlbF9maWxlOgogICAgICAgICAgICAgICAgICAgIGJ1aWxkX3N1Y2Nlc3MuYXBwZW5kKHJlcSkKICAgICAgICAgICAgICAgICAgICBpZiBhdXRvYnVpbGRpbmc6CiAgICAgICAgICAgICAgICAgICAgICAgICMgWFhYOiBUaGlzIGlzIG1pbGRseSBkdXBsaWNhdGl2ZSB3aXRoIHByZXBhcmVfZmlsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICMgYnV0IG5vdCBjbG9zZSBlbm91Z2ggdG8gcHVsbCBvdXQgdG8gYSBzaW5nbGUgY29tbW9uCiAgICAgICAgICAgICAgICAgICAgICAgICMgbWV0aG9kLgogICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBjb2RlIGJlbG93IGFzc3VtZXMgdGVtcG9yYXJ5IHNvdXJjZSBkaXJzIC0KICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmV2ZW50IGl0IGRvaW5nIGJhZCB0aGluZ3MuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHJlcS5zb3VyY2VfZGlyIGFuZCBub3Qgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5zb3VyY2VfZGlyLCBQSVBfREVMRVRFX01BUktFUl9GSUxFTkFNRSkpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhZCBzb3VyY2UgZGlyIC0gbWlzc2luZyBtYXJrZXIiKQogICAgICAgICAgICAgICAgICAgICAgICAjIERlbGV0ZSB0aGUgc291cmNlIHdlIGJ1aWx0IHRoZSB3aGVlbCBmcm9tCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5yZW1vdmVfdGVtcG9yYXJ5X3NvdXJjZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICMgc2V0IHRoZSBidWlsZCBkaXJlY3RvcnkgYWdhaW4gLSBuYW1lIGlzIGtub3duIGZyb20KICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgd29yayBwcmVwYXJlX2ZpbGVzIGRpZC4KICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnNvdXJjZV9kaXIgPSByZXEuYnVpbGRfbG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcXVpcmVtZW50X3NldC5idWlsZF9kaXIpCiAgICAgICAgICAgICAgICAgICAgICAgICMgVXBkYXRlIHRoZSBsaW5rIGZvciB0aGlzLgogICAgICAgICAgICAgICAgICAgICAgICByZXEubGluayA9IHBpcC5pbmRleC5MaW5rKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF90b191cmwod2hlZWxfZmlsZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCByZXEubGluay5pc193aGVlbAogICAgICAgICAgICAgICAgICAgICAgICAjIGV4dHJhY3QgdGhlIHdoZWVsIGludG8gdGhlIGRpcgogICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tfdXJsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmxpbmssIHJlcS5zb3VyY2VfZGlyLCBOb25lLCBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb249c2VsZi5yZXF1aXJlbWVudF9zZXQuc2Vzc2lvbikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgYnVpbGRfZmFpbHVyZS5hcHBlbmQocmVxKQoKICAgICAgICAjIG5vdGlmeSBzdWNjZXNzL2ZhaWx1cmUKICAgICAgICBpZiBidWlsZF9zdWNjZXNzOgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICdTdWNjZXNzZnVsbHkgYnVpbHQgJXMnLAogICAgICAgICAgICAgICAgJyAnLmpvaW4oW3JlcS5uYW1lIGZvciByZXEgaW4gYnVpbGRfc3VjY2Vzc10pLAogICAgICAgICAgICApCiAgICAgICAgaWYgYnVpbGRfZmFpbHVyZToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIGJ1aWxkICVzJywKICAgICAgICAgICAgICAgICcgJy5qb2luKFtyZXEubmFtZSBmb3IgcmVxIGluIGJ1aWxkX2ZhaWx1cmVdKSwKICAgICAgICAgICAgKQogICAgICAgICMgUmV0dXJuIFRydWUgaWYgYWxsIGJ1aWxkcyB3ZXJlIHN1Y2Nlc3NmdWwKICAgICAgICByZXR1cm4gbGVuKGJ1aWxkX2ZhaWx1cmUpID09IDAKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAAjAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAFxPukV+AAAAfgAAACcAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9lYXN5X2luc3RhbGwucHkiIiJSdW4gdGhlIEVhc3lJbnN0YWxsIGNvbW1hbmQiIiIKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IG1haW4KICAgIG1haW4oKQpQSwMEFAAAAAAAAAAhABdEnikHngEAB54BADEAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL19faW5pdF9fLnB5IyBjb2Rpbmc6IHV0Zi04CiIiIgpQYWNrYWdlIHJlc291cmNlIEFQSQotLS0tLS0tLS0tLS0tLS0tLS0tLQoKQSByZXNvdXJjZSBpcyBhIGxvZ2ljYWwgZmlsZSBjb250YWluZWQgd2l0aGluIGEgcGFja2FnZSwgb3IgYSBsb2dpY2FsCnN1YmRpcmVjdG9yeSB0aGVyZW9mLiAgVGhlIHBhY2thZ2UgcmVzb3VyY2UgQVBJIGV4cGVjdHMgcmVzb3VyY2UgbmFtZXMKdG8gaGF2ZSB0aGVpciBwYXRoIHBhcnRzIHNlcGFyYXRlZCB3aXRoIGBgL2BgLCAqbm90KiB3aGF0ZXZlciB0aGUgbG9jYWwKcGF0aCBzZXBhcmF0b3IgaXMuICBEbyBub3QgdXNlIG9zLnBhdGggb3BlcmF0aW9ucyB0byBtYW5pcHVsYXRlIHJlc291cmNlCm5hbWVzIGJlaW5nIHBhc3NlZCBpbnRvIHRoZSBBUEkuCgpUaGUgcGFja2FnZSByZXNvdXJjZSBBUEkgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIG5vcm1hbCBmaWxlc3lzdGVtIHBhY2thZ2VzLAouZWdnIGZpbGVzLCBhbmQgdW5wYWNrZWQgLmVnZyBmaWxlcy4gIEl0IGNhbiBhbHNvIHdvcmsgaW4gYSBsaW1pdGVkIHdheSB3aXRoCi56aXAgZmlsZXMgYW5kIHdpdGggY3VzdG9tIFBFUCAzMDIgbG9hZGVycyB0aGF0IHN1cHBvcnQgdGhlIGBgZ2V0X2RhdGEoKWBgCm1ldGhvZC4KIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IHN5cwppbXBvcnQgb3MKaW1wb3J0IGlvCmltcG9ydCB0aW1lCmltcG9ydCByZQppbXBvcnQgdHlwZXMKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHppcGltcG9ydAppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHN0YXQKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgcGtndXRpbAppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgcGxpc3RsaWIKaW1wb3J0IGVtYWlsLnBhcnNlcgppbXBvcnQgZXJybm8KaW1wb3J0IHRlbXBmaWxlCmltcG9ydCB0ZXh0d3JhcAppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBpbnNwZWN0CmZyb20gcGtndXRpbCBpbXBvcnQgZ2V0X2ltcG9ydGVyCgp0cnk6CiAgICBpbXBvcnQgX2ltcApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAjIFB5dGhvbiAzLjIgY29tcGF0aWJpbGl0eQogICAgaW1wb3J0IGltcCBhcyBfaW1wCgpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IHVybGxpYiwgbWFwLCBmaWx0ZXIKCiMgY2FwdHVyZSB0aGVzZSB0byBieXBhc3Mgc2FuZGJveGluZwpmcm9tIG9zIGltcG9ydCB1dGltZQp0cnk6CiAgICBmcm9tIG9zIGltcG9ydCBta2RpciwgcmVuYW1lLCB1bmxpbmsKICAgIFdSSVRFX1NVUFBPUlQgPSBUcnVlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICMgbm8gd3JpdGUgc3VwcG9ydCwgcHJvYmFibHkgdW5kZXIgR0FFCiAgICBXUklURV9TVVBQT1JUID0gRmFsc2UKCmZyb20gb3MgaW1wb3J0IG9wZW4gYXMgb3Nfb3Blbgpmcm9tIG9zLnBhdGggaW1wb3J0IGlzZGlyLCBzcGxpdAoKdHJ5OgogICAgaW1wb3J0IGltcG9ydGxpYi5tYWNoaW5lcnkgYXMgaW1wb3J0bGliX21hY2hpbmVyeQogICAgIyBhY2Nlc3MgYXR0cmlidXRlIHRvIGZvcmNlIGltcG9ydCB1bmRlciBkZWxheWVkIGltcG9ydCBtZWNoYW5pc21zLgogICAgaW1wb3J0bGliX21hY2hpbmVyeS5fX25hbWVfXwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnRsaWJfbWFjaGluZXJ5ID0gTm9uZQoKZnJvbSAuIGltcG9ydCBweTMxY29tcGF0CmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4gaW1wb3J0IGFwcGRpcnMKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybiBpbXBvcnQgcGFja2FnaW5nCl9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMuZXh0ZXJuLnBhY2thZ2luZy52ZXJzaW9uJykKX19pbXBvcnRfXygncGtnX3Jlc291cmNlcy5leHRlcm4ucGFja2FnaW5nLnNwZWNpZmllcnMnKQpfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzLmV4dGVybi5wYWNrYWdpbmcucmVxdWlyZW1lbnRzJykKX19pbXBvcnRfXygncGtnX3Jlc291cmNlcy5leHRlcm4ucGFja2FnaW5nLm1hcmtlcnMnKQoKCmlmICgzLCAwKSA8IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMyk6CiAgICByYWlzZSBSdW50aW1lRXJyb3IoIlB5dGhvbiAzLjMgb3IgbGF0ZXIgaXMgcmVxdWlyZWQiKQoKaWYgc2l4LlBZMjoKICAgICMgVGhvc2UgYnVpbHRpbiBleGNlcHRpb25zIGFyZSBvbmx5IGRlZmluZWQgaW4gUHl0aG9uIDMKICAgIFBlcm1pc3Npb25FcnJvciA9IE5vbmUKICAgIE5vdEFEaXJlY3RvcnlFcnJvciA9IE5vbmUKCiMgZGVjbGFyZSBzb21lIGdsb2JhbHMgdGhhdCB3aWxsIGJlIGRlZmluZWQgbGF0ZXIgdG8KIyBzYXRpc2Z5IHRoZSBsaW50ZXJzLgpyZXF1aXJlID0gTm9uZQp3b3JraW5nX3NldCA9IE5vbmUKCgpjbGFzcyBQRVA0NDBXYXJuaW5nKFJ1bnRpbWVXYXJuaW5nKToKICAgICIiIgogICAgVXNlZCB3aGVuIHRoZXJlIGlzIGFuIGlzc3VlIHdpdGggYSB2ZXJzaW9uIG9yIHNwZWNpZmllciBub3QgY29tcGx5aW5nIHdpdGgKICAgIFBFUCA0NDAuCiAgICAiIiIKCgpjbGFzcyBfU2V0dXB0b29sc1ZlcnNpb25NaXhpbihvYmplY3QpOgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19oYXNoX18oKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpIDwgb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fbHRfXyhvdGhlcikKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSA8PSBvdGhlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19sZV9fKG90aGVyKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpID09IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2VxX18ob3RoZXIpCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgPj0gb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fZ2VfXyhvdGhlcikKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSA+IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2d0X18ob3RoZXIpCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgIT0gb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fbmVfXyhvdGhlcikKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4gdHVwbGUoc2VsZilba2V5XQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBjb21wb25lbnRfcmUgPSByZS5jb21waWxlKHInKFxkKyB8IFthLXpdKyB8IFwufCAtKScsIHJlLlZFUkJPU0UpCiAgICAgICAgcmVwbGFjZSA9IHsKICAgICAgICAgICAgJ3ByZSc6ICdjJywKICAgICAgICAgICAgJ3ByZXZpZXcnOiAnYycsCiAgICAgICAgICAgICctJzogJ2ZpbmFsLScsCiAgICAgICAgICAgICdyYyc6ICdjJywKICAgICAgICAgICAgJ2Rldic6ICdAJywKICAgICAgICB9LmdldAoKICAgICAgICBkZWYgX3BhcnNlX3ZlcnNpb25fcGFydHMocyk6CiAgICAgICAgICAgIGZvciBwYXJ0IGluIGNvbXBvbmVudF9yZS5zcGxpdChzKToKICAgICAgICAgICAgICAgIHBhcnQgPSByZXBsYWNlKHBhcnQsIHBhcnQpCiAgICAgICAgICAgICAgICBpZiBub3QgcGFydCBvciBwYXJ0ID09ICcuJzoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgcGFydFs6MV0gaW4gJzAxMjM0NTY3ODknOgogICAgICAgICAgICAgICAgICAgICMgcGFkIGZvciBudW1lcmljIGNvbXBhcmlzb24KICAgICAgICAgICAgICAgICAgICB5aWVsZCBwYXJ0LnpmaWxsKDgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHlpZWxkICcqJyArIHBhcnQKCiAgICAgICAgICAgICMgZW5zdXJlIHRoYXQgYWxwaGEvYmV0YS9jYW5kaWRhdGUgYXJlIGJlZm9yZSBmaW5hbAogICAgICAgICAgICB5aWVsZCAnKmZpbmFsJwoKICAgICAgICBkZWYgb2xkX3BhcnNlX3ZlcnNpb24ocyk6CiAgICAgICAgICAgIHBhcnRzID0gW10KICAgICAgICAgICAgZm9yIHBhcnQgaW4gX3BhcnNlX3ZlcnNpb25fcGFydHMocy5sb3dlcigpKToKICAgICAgICAgICAgICAgIGlmIHBhcnQuc3RhcnRzd2l0aCgnKicpOgogICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlICctJyBiZWZvcmUgYSBwcmVyZWxlYXNlIHRhZwogICAgICAgICAgICAgICAgICAgIGlmIHBhcnQgPCAnKmZpbmFsJzoKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXSA9PSAnKmZpbmFsLSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQogICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nIHplcm9zIGZyb20gZWFjaCBzZXJpZXMgb2YgbnVtZXJpYyBwYXJ0cwogICAgICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV0gPT0gJzAwMDAwMDAwJzoKICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMucG9wKCkKICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChwYXJ0KQogICAgICAgICAgICByZXR1cm4gdHVwbGUocGFydHMpCgogICAgICAgICMgV2FybiBmb3IgdXNlIG9mIHRoaXMgZnVuY3Rpb24KICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAiWW91IGhhdmUgaXRlcmF0ZWQgb3ZlciB0aGUgcmVzdWx0IG9mICIKICAgICAgICAgICAgInBrZ19yZXNvdXJjZXMucGFyc2VfdmVyc2lvbi4gVGhpcyBpcyBhIGxlZ2FjeSBiZWhhdmlvciB3aGljaCBpcyAiCiAgICAgICAgICAgICJpbmNvbnNpc3RlbnQgd2l0aCB0aGUgbmV3IHZlcnNpb24gY2xhc3MgaW50cm9kdWNlZCBpbiBzZXR1cHRvb2xzICIKICAgICAgICAgICAgIjguMC4gSW4gbW9zdCBjYXNlcywgY29udmVyc2lvbiB0byBhIHR1cGxlIGlzIHVubmVjZXNzYXJ5LiBGb3IgIgogICAgICAgICAgICAiY29tcGFyaXNvbiBvZiB2ZXJzaW9ucywgc29ydCB0aGUgVmVyc2lvbiBpbnN0YW5jZXMgZGlyZWN0bHkuIElmICIKICAgICAgICAgICAgInlvdSBoYXZlIGFub3RoZXIgdXNlIGNhc2UgcmVxdWlyaW5nIHRoZSB0dXBsZSwgcGxlYXNlIGZpbGUgYSAiCiAgICAgICAgICAgICJidWcgd2l0aCB0aGUgc2V0dXB0b29scyBwcm9qZWN0IGRlc2NyaWJpbmcgdGhhdCBuZWVkLiIsCiAgICAgICAgICAgIFJ1bnRpbWVXYXJuaW5nLAogICAgICAgICAgICBzdGFja2xldmVsPTEsCiAgICAgICAgKQoKICAgICAgICBmb3IgcGFydCBpbiBvbGRfcGFyc2VfdmVyc2lvbihzdHIoc2VsZikpOgogICAgICAgICAgICB5aWVsZCBwYXJ0CgoKY2xhc3MgU2V0dXB0b29sc1ZlcnNpb24oX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24pOgogICAgcGFzcwoKCmNsYXNzIFNldHVwdG9vbHNMZWdhY3lWZXJzaW9uKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdpbmcudmVyc2lvbi5MZWdhY3lWZXJzaW9uKToKICAgIHBhc3MKCgpkZWYgcGFyc2VfdmVyc2lvbih2KToKICAgIHRyeToKICAgICAgICByZXR1cm4gU2V0dXB0b29sc1ZlcnNpb24odikKICAgIGV4Y2VwdCBwYWNrYWdpbmcudmVyc2lvbi5JbnZhbGlkVmVyc2lvbjoKICAgICAgICByZXR1cm4gU2V0dXB0b29sc0xlZ2FjeVZlcnNpb24odikKCgpfc3RhdGVfdmFycyA9IHt9CgoKZGVmIF9kZWNsYXJlX3N0YXRlKHZhcnR5cGUsICoqa3cpOgogICAgZ2xvYmFscygpLnVwZGF0ZShrdykKICAgIF9zdGF0ZV92YXJzLnVwZGF0ZShkaWN0LmZyb21rZXlzKGt3LCB2YXJ0eXBlKSkKCgpkZWYgX19nZXRzdGF0ZV9fKCk6CiAgICBzdGF0ZSA9IHt9CiAgICBnID0gZ2xvYmFscygpCiAgICBmb3IgaywgdiBpbiBfc3RhdGVfdmFycy5pdGVtcygpOgogICAgICAgIHN0YXRlW2tdID0gZ1snX3NnZXRfJyArIHZdKGdba10pCiAgICByZXR1cm4gc3RhdGUKCgpkZWYgX19zZXRzdGF0ZV9fKHN0YXRlKToKICAgIGcgPSBnbG9iYWxzKCkKICAgIGZvciBrLCB2IGluIHN0YXRlLml0ZW1zKCk6CiAgICAgICAgZ1snX3NzZXRfJyArIF9zdGF0ZV92YXJzW2tdXShrLCBnW2tdLCB2KQogICAgcmV0dXJuIHN0YXRlCgoKZGVmIF9zZ2V0X2RpY3QodmFsKToKICAgIHJldHVybiB2YWwuY29weSgpCgoKZGVmIF9zc2V0X2RpY3Qoa2V5LCBvYiwgc3RhdGUpOgogICAgb2IuY2xlYXIoKQogICAgb2IudXBkYXRlKHN0YXRlKQoKCmRlZiBfc2dldF9vYmplY3QodmFsKToKICAgIHJldHVybiB2YWwuX19nZXRzdGF0ZV9fKCkKCgpkZWYgX3NzZXRfb2JqZWN0KGtleSwgb2IsIHN0YXRlKToKICAgIG9iLl9fc2V0c3RhdGVfXyhzdGF0ZSkKCgpfc2dldF9ub25lID0gX3NzZXRfbm9uZSA9IGxhbWJkYSAqYXJnczogTm9uZQoKCmRlZiBnZXRfc3VwcG9ydGVkX3BsYXRmb3JtKCk6CiAgICAiIiJSZXR1cm4gdGhpcyBwbGF0Zm9ybSdzIG1heGltdW0gY29tcGF0aWJsZSB2ZXJzaW9uLgoKICAgIGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpIG5vcm1hbGx5IHJlcG9ydHMgdGhlIG1pbmltdW0gdmVyc2lvbgogICAgb2YgTWFjIE9TIFggdGhhdCB3b3VsZCBiZSByZXF1aXJlZCB0byAqdXNlKiBleHRlbnNpb25zIHByb2R1Y2VkIGJ5CiAgICBkaXN0dXRpbHMuICBCdXQgd2hhdCB3ZSB3YW50IHdoZW4gY2hlY2tpbmcgY29tcGF0aWJpbGl0eSBpcyB0byBrbm93IHRoZQogICAgdmVyc2lvbiBvZiBNYWMgT1MgWCB0aGF0IHdlIGFyZSAqcnVubmluZyouICBUbyBhbGxvdyB1c2FnZSBvZiBwYWNrYWdlcyB0aGF0CiAgICBleHBsaWNpdGx5IHJlcXVpcmUgYSBuZXdlciB2ZXJzaW9uIG9mIE1hYyBPUyBYLCB3ZSBtdXN0IGFsc28ga25vdyB0aGUKICAgIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgT1MuCgogICAgSWYgdGhpcyBjb25kaXRpb24gb2NjdXJzIGZvciBhbnkgb3RoZXIgcGxhdGZvcm0gd2l0aCBhIHZlcnNpb24gaW4gaXRzCiAgICBwbGF0Zm9ybSBzdHJpbmdzLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBleHRlbmRlZCBhY2NvcmRpbmdseS4KICAgICIiIgogICAgcGxhdCA9IGdldF9idWlsZF9wbGF0Zm9ybSgpCiAgICBtID0gbWFjb3NWZXJzaW9uU3RyaW5nLm1hdGNoKHBsYXQpCiAgICBpZiBtIGlzIG5vdCBOb25lIGFuZCBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBwbGF0ID0gJ21hY29zeC0lcy0lcycgJSAoJy4nLmpvaW4oX21hY29zeF92ZXJzKClbOjJdKSwgbS5ncm91cCgzKSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIyBub3QgTWFjIE9TIFgKICAgICAgICAgICAgcGFzcwogICAgcmV0dXJuIHBsYXQKCgpfX2FsbF9fID0gWwogICAgIyBCYXNpYyByZXNvdXJjZSBhY2Nlc3MgYW5kIGRpc3RyaWJ1dGlvbi9lbnRyeSBwb2ludCBkaXNjb3ZlcnkKICAgICdyZXF1aXJlJywgJ3J1bl9zY3JpcHQnLCAnZ2V0X3Byb3ZpZGVyJywgJ2dldF9kaXN0cmlidXRpb24nLAogICAgJ2xvYWRfZW50cnlfcG9pbnQnLCAnZ2V0X2VudHJ5X21hcCcsICdnZXRfZW50cnlfaW5mbycsCiAgICAnaXRlcl9lbnRyeV9wb2ludHMnLAogICAgJ3Jlc291cmNlX3N0cmluZycsICdyZXNvdXJjZV9zdHJlYW0nLCAncmVzb3VyY2VfZmlsZW5hbWUnLAogICAgJ3Jlc291cmNlX2xpc3RkaXInLCAncmVzb3VyY2VfZXhpc3RzJywgJ3Jlc291cmNlX2lzZGlyJywKCiAgICAjIEVudmlyb25tZW50YWwgY29udHJvbAogICAgJ2RlY2xhcmVfbmFtZXNwYWNlJywgJ3dvcmtpbmdfc2V0JywgJ2FkZF9hY3RpdmF0aW9uX2xpc3RlbmVyJywKICAgICdmaW5kX2Rpc3RyaWJ1dGlvbnMnLCAnc2V0X2V4dHJhY3Rpb25fcGF0aCcsICdjbGVhbnVwX3Jlc291cmNlcycsCiAgICAnZ2V0X2RlZmF1bHRfY2FjaGUnLAoKICAgICMgUHJpbWFyeSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzCiAgICAnRW52aXJvbm1lbnQnLCAnV29ya2luZ1NldCcsICdSZXNvdXJjZU1hbmFnZXInLAogICAgJ0Rpc3RyaWJ1dGlvbicsICdSZXF1aXJlbWVudCcsICdFbnRyeVBvaW50JywKCiAgICAjIEV4Y2VwdGlvbnMKICAgICdSZXNvbHV0aW9uRXJyb3InLCAnVmVyc2lvbkNvbmZsaWN0JywgJ0Rpc3RyaWJ1dGlvbk5vdEZvdW5kJywKICAgICdVbmtub3duRXh0cmEnLCAnRXh0cmFjdGlvbkVycm9yJywKCiAgICAjIFdhcm5pbmdzCiAgICAnUEVQNDQwV2FybmluZycsCgogICAgIyBQYXJzaW5nIGZ1bmN0aW9ucyBhbmQgc3RyaW5nIHV0aWxpdGllcwogICAgJ3BhcnNlX3JlcXVpcmVtZW50cycsICdwYXJzZV92ZXJzaW9uJywgJ3NhZmVfbmFtZScsICdzYWZlX3ZlcnNpb24nLAogICAgJ2dldF9wbGF0Zm9ybScsICdjb21wYXRpYmxlX3BsYXRmb3JtcycsICd5aWVsZF9saW5lcycsICdzcGxpdF9zZWN0aW9ucycsCiAgICAnc2FmZV9leHRyYScsICd0b19maWxlbmFtZScsICdpbnZhbGlkX21hcmtlcicsICdldmFsdWF0ZV9tYXJrZXInLAoKICAgICMgZmlsZXN5c3RlbSB1dGlsaXRpZXMKICAgICdlbnN1cmVfZGlyZWN0b3J5JywgJ25vcm1hbGl6ZV9wYXRoJywKCiAgICAjIERpc3RyaWJ1dGlvbiAicHJlY2VkZW5jZSIgY29uc3RhbnRzCiAgICAnRUdHX0RJU1QnLCAnQklOQVJZX0RJU1QnLCAnU09VUkNFX0RJU1QnLCAnQ0hFQ0tPVVRfRElTVCcsICdERVZFTE9QX0RJU1QnLAoKICAgICMgIlByb3ZpZGVyIiBpbnRlcmZhY2VzLCBpbXBsZW1lbnRhdGlvbnMsIGFuZCByZWdpc3RyYXRpb24vbG9va3VwIEFQSXMKICAgICdJTWV0YWRhdGFQcm92aWRlcicsICdJUmVzb3VyY2VQcm92aWRlcicsICdGaWxlTWV0YWRhdGEnLAogICAgJ1BhdGhNZXRhZGF0YScsICdFZ2dNZXRhZGF0YScsICdFbXB0eVByb3ZpZGVyJywgJ2VtcHR5X3Byb3ZpZGVyJywKICAgICdOdWxsUHJvdmlkZXInLCAnRWdnUHJvdmlkZXInLCAnRGVmYXVsdFByb3ZpZGVyJywgJ1ppcFByb3ZpZGVyJywKICAgICdyZWdpc3Rlcl9maW5kZXInLCAncmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXInLCAncmVnaXN0ZXJfbG9hZGVyX3R5cGUnLAogICAgJ2ZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcycsICdnZXRfaW1wb3J0ZXInLAoKICAgICMgRGVwcmVjYXRlZC9iYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9ubHkKICAgICdydW5fbWFpbicsICdBdmFpbGFibGVEaXN0cmlidXRpb25zJywKXQoKCmNsYXNzIFJlc29sdXRpb25FcnJvcihFeGNlcHRpb24pOgogICAgIiIiQWJzdHJhY3QgYmFzZSBmb3IgZGVwZW5kZW5jeSByZXNvbHV0aW9uIGVycm9ycyIiIgoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyByZXByKHNlbGYuYXJncykKCgpjbGFzcyBWZXJzaW9uQ29uZmxpY3QoUmVzb2x1dGlvbkVycm9yKToKICAgICIiIgogICAgQW4gYWxyZWFkeS1pbnN0YWxsZWQgdmVyc2lvbiBjb25mbGljdHMgd2l0aCB0aGUgcmVxdWVzdGVkIHZlcnNpb24uCgogICAgU2hvdWxkIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGluc3RhbGxlZCBEaXN0cmlidXRpb24gYW5kIHRoZSByZXF1ZXN0ZWQKICAgIFJlcXVpcmVtZW50LgogICAgIiIiCgogICAgX3RlbXBsYXRlID0gIntzZWxmLmRpc3R9IGlzIGluc3RhbGxlZCBidXQge3NlbGYucmVxfSBpcyByZXF1aXJlZCIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkaXN0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXEoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1sxXQoKICAgIGRlZiByZXBvcnQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3RlbXBsYXRlLmZvcm1hdCgqKmxvY2FscygpKQoKICAgIGRlZiB3aXRoX2NvbnRleHQoc2VsZiwgcmVxdWlyZWRfYnkpOgogICAgICAgICIiIgogICAgICAgIElmIHJlcXVpcmVkX2J5IGlzIG5vbi1lbXB0eSwgcmV0dXJuIGEgdmVyc2lvbiBvZiBzZWxmIHRoYXQgaXMgYQogICAgICAgIENvbnRleHR1YWxWZXJzaW9uQ29uZmxpY3QuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHJlcXVpcmVkX2J5OgogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIGFyZ3MgPSBzZWxmLmFyZ3MgKyAocmVxdWlyZWRfYnksKQogICAgICAgIHJldHVybiBDb250ZXh0dWFsVmVyc2lvbkNvbmZsaWN0KCphcmdzKQoKCmNsYXNzIENvbnRleHR1YWxWZXJzaW9uQ29uZmxpY3QoVmVyc2lvbkNvbmZsaWN0KToKICAgICIiIgogICAgQSBWZXJzaW9uQ29uZmxpY3QgdGhhdCBhY2NlcHRzIGEgdGhpcmQgcGFyYW1ldGVyLCB0aGUgc2V0IG9mIHRoZQogICAgcmVxdWlyZW1lbnRzIHRoYXQgcmVxdWlyZWQgdGhlIGluc3RhbGxlZCBEaXN0cmlidXRpb24uCiAgICAiIiIKCiAgICBfdGVtcGxhdGUgPSBWZXJzaW9uQ29uZmxpY3QuX3RlbXBsYXRlICsgJyBieSB7c2VsZi5yZXF1aXJlZF9ieX0nCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxdWlyZWRfYnkoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1syXQoKCmNsYXNzIERpc3RyaWJ1dGlvbk5vdEZvdW5kKFJlc29sdXRpb25FcnJvcik6CiAgICAiIiJBIHJlcXVlc3RlZCBkaXN0cmlidXRpb24gd2FzIG5vdCBmb3VuZCIiIgoKICAgIF90ZW1wbGF0ZSA9ICgiVGhlICd7c2VsZi5yZXF9JyBkaXN0cmlidXRpb24gd2FzIG5vdCBmb3VuZCAiCiAgICAgICAgICAgICAgICAgImFuZCBpcyByZXF1aXJlZCBieSB7c2VsZi5yZXF1aXJlcnNfc3RyfSIpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXF1aXJlcnMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1sxXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcXVpcmVyc19zdHIoc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYucmVxdWlyZXJzOgogICAgICAgICAgICByZXR1cm4gJ3RoZSBhcHBsaWNhdGlvbicKICAgICAgICByZXR1cm4gJywgJy5qb2luKHNlbGYucmVxdWlyZXJzKQoKICAgIGRlZiByZXBvcnQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3RlbXBsYXRlLmZvcm1hdCgqKmxvY2FscygpKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnJlcG9ydCgpCgoKY2xhc3MgVW5rbm93bkV4dHJhKFJlc29sdXRpb25FcnJvcik6CiAgICAiIiJEaXN0cmlidXRpb24gZG9lc24ndCBoYXZlIGFuICJleHRyYSBmZWF0dXJlIiBvZiB0aGUgZ2l2ZW4gbmFtZSIiIgoKCl9wcm92aWRlcl9mYWN0b3JpZXMgPSB7fQoKUFlfTUFKT1IgPSBzeXMudmVyc2lvbls6M10KRUdHX0RJU1QgPSAzCkJJTkFSWV9ESVNUID0gMgpTT1VSQ0VfRElTVCA9IDEKQ0hFQ0tPVVRfRElTVCA9IDAKREVWRUxPUF9ESVNUID0gLTEKCgpkZWYgcmVnaXN0ZXJfbG9hZGVyX3R5cGUobG9hZGVyX3R5cGUsIHByb3ZpZGVyX2ZhY3RvcnkpOgogICAgIiIiUmVnaXN0ZXIgYHByb3ZpZGVyX2ZhY3RvcnlgIHRvIG1ha2UgcHJvdmlkZXJzIGZvciBgbG9hZGVyX3R5cGVgCgogICAgYGxvYWRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgYGBtb2R1bGUuX19sb2FkZXJfX2BgLAogICAgYW5kIGBwcm92aWRlcl9mYWN0b3J5YCBpcyBhIGZ1bmN0aW9uIHRoYXQsIHBhc3NlZCBhICptb2R1bGUqIG9iamVjdCwKICAgIHJldHVybnMgYW4gYGBJUmVzb3VyY2VQcm92aWRlcmBgIGZvciB0aGF0IG1vZHVsZS4KICAgICIiIgogICAgX3Byb3ZpZGVyX2ZhY3Rvcmllc1tsb2FkZXJfdHlwZV0gPSBwcm92aWRlcl9mYWN0b3J5CgoKZGVmIGdldF9wcm92aWRlcihtb2R1bGVPclJlcSk6CiAgICAiIiJSZXR1cm4gYW4gSVJlc291cmNlUHJvdmlkZXIgZm9yIHRoZSBuYW1lZCBtb2R1bGUgb3IgcmVxdWlyZW1lbnQiIiIKICAgIGlmIGlzaW5zdGFuY2UobW9kdWxlT3JSZXEsIFJlcXVpcmVtZW50KToKICAgICAgICByZXR1cm4gd29ya2luZ19zZXQuZmluZChtb2R1bGVPclJlcSkgb3IgcmVxdWlyZShzdHIobW9kdWxlT3JSZXEpKVswXQogICAgdHJ5OgogICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZHVsZU9yUmVxXQogICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgIF9faW1wb3J0X18obW9kdWxlT3JSZXEpCiAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbbW9kdWxlT3JSZXFdCiAgICBsb2FkZXIgPSBnZXRhdHRyKG1vZHVsZSwgJ19fbG9hZGVyX18nLCBOb25lKQogICAgcmV0dXJuIF9maW5kX2FkYXB0ZXIoX3Byb3ZpZGVyX2ZhY3RvcmllcywgbG9hZGVyKShtb2R1bGUpCgoKZGVmIF9tYWNvc3hfdmVycyhfY2FjaGU9W10pOgogICAgaWYgbm90IF9jYWNoZToKICAgICAgICB2ZXJzaW9uID0gcGxhdGZvcm0ubWFjX3ZlcigpWzBdCiAgICAgICAgIyBmYWxsYmFjayBmb3IgTWFjUG9ydHMKICAgICAgICBpZiB2ZXJzaW9uID09ICcnOgogICAgICAgICAgICBwbGlzdCA9ICcvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL1N5c3RlbVZlcnNpb24ucGxpc3QnCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBsaXN0KToKICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIocGxpc3RsaWIsICdyZWFkUGxpc3QnKToKICAgICAgICAgICAgICAgICAgICBwbGlzdF9jb250ZW50ID0gcGxpc3RsaWIucmVhZFBsaXN0KHBsaXN0KQogICAgICAgICAgICAgICAgICAgIGlmICdQcm9kdWN0VmVyc2lvbicgaW4gcGxpc3RfY29udGVudDoKICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHBsaXN0X2NvbnRlbnRbJ1Byb2R1Y3RWZXJzaW9uJ10KCiAgICAgICAgX2NhY2hlLmFwcGVuZCh2ZXJzaW9uLnNwbGl0KCcuJykpCiAgICByZXR1cm4gX2NhY2hlWzBdCgoKZGVmIF9tYWNvc3hfYXJjaChtYWNoaW5lKToKICAgIHJldHVybiB7J1Bvd2VyUEMnOiAncHBjJywgJ1Bvd2VyX01hY2ludG9zaCc6ICdwcGMnfS5nZXQobWFjaGluZSwgbWFjaGluZSkKCgpkZWYgZ2V0X2J1aWxkX3BsYXRmb3JtKCk6CiAgICAiIiJSZXR1cm4gdGhpcyBwbGF0Zm9ybSdzIHN0cmluZyBmb3IgcGxhdGZvcm0tc3BlY2lmaWMgZGlzdHJpYnV0aW9ucwoKICAgIFhYWCBDdXJyZW50bHkgdGhpcyBpcyB0aGUgc2FtZSBhcyBgYGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpYGAsIGJ1dCBpdAogICAgbmVlZHMgc29tZSBoYWNrcyBmb3IgTGludXggYW5kIE1hYyBPUyBYLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgIyBQeXRob24gMi43IG9yID49My4yCiAgICAgICAgZnJvbSBzeXNjb25maWcgaW1wb3J0IGdldF9wbGF0Zm9ybQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdldF9wbGF0Zm9ybQoKICAgIHBsYXQgPSBnZXRfcGxhdGZvcm0oKQogICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iIGFuZCBub3QgcGxhdC5zdGFydHN3aXRoKCdtYWNvc3gtJyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB2ZXJzaW9uID0gX21hY29zeF92ZXJzKCkKICAgICAgICAgICAgbWFjaGluZSA9IG9zLnVuYW1lKClbNF0ucmVwbGFjZSgiICIsICJfIikKICAgICAgICAgICAgcmV0dXJuICJtYWNvc3gtJWQuJWQtJXMiICUgKAogICAgICAgICAgICAgICAgaW50KHZlcnNpb25bMF0pLCBpbnQodmVyc2lvblsxXSksCiAgICAgICAgICAgICAgICBfbWFjb3N4X2FyY2gobWFjaGluZSksCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIyBpZiBzb21lb25lIGlzIHJ1bm5pbmcgYSBub24tTWFjIGRhcndpbiBzeXN0ZW0sIHRoaXMgd2lsbCBmYWxsCiAgICAgICAgICAgICMgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICBwYXNzCiAgICByZXR1cm4gcGxhdAoKCm1hY29zVmVyc2lvblN0cmluZyA9IHJlLmNvbXBpbGUociJtYWNvc3gtKFxkKylcLihcZCspLSguKikiKQpkYXJ3aW5WZXJzaW9uU3RyaW5nID0gcmUuY29tcGlsZShyImRhcndpbi0oXGQrKVwuKFxkKylcLihcZCspLSguKikiKQojIFhYWCBiYWNrd2FyZCBjb21wYXQKZ2V0X3BsYXRmb3JtID0gZ2V0X2J1aWxkX3BsYXRmb3JtCgoKZGVmIGNvbXBhdGlibGVfcGxhdGZvcm1zKHByb3ZpZGVkLCByZXF1aXJlZCk6CiAgICAiIiJDYW4gY29kZSBmb3IgdGhlIGBwcm92aWRlZGAgcGxhdGZvcm0gcnVuIG9uIHRoZSBgcmVxdWlyZWRgIHBsYXRmb3JtPwoKICAgIFJldHVybnMgdHJ1ZSBpZiBlaXRoZXIgcGxhdGZvcm0gaXMgYGBOb25lYGAsIG9yIHRoZSBwbGF0Zm9ybXMgYXJlIGVxdWFsLgoKICAgIFhYWCBOZWVkcyBjb21wYXRpYmlsaXR5IGNoZWNrcyBmb3IgTGludXggYW5kIG90aGVyIHVuaXh5IE9TZXMuCiAgICAiIiIKICAgIGlmIHByb3ZpZGVkIGlzIE5vbmUgb3IgcmVxdWlyZWQgaXMgTm9uZSBvciBwcm92aWRlZCA9PSByZXF1aXJlZDoKICAgICAgICAjIGVhc3kgY2FzZQogICAgICAgIHJldHVybiBUcnVlCgogICAgIyBNYWMgT1MgWCBzcGVjaWFsIGNhc2VzCiAgICByZXFNYWMgPSBtYWNvc1ZlcnNpb25TdHJpbmcubWF0Y2gocmVxdWlyZWQpCiAgICBpZiByZXFNYWM6CiAgICAgICAgcHJvdk1hYyA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChwcm92aWRlZCkKCiAgICAgICAgIyBpcyB0aGlzIGEgTWFjIHBhY2thZ2U/CiAgICAgICAgaWYgbm90IHByb3ZNYWM6CiAgICAgICAgICAgICMgdGhpcyBpcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgcGFja2FnZXMgYnVpbHQgYmVmb3JlCiAgICAgICAgICAgICMgc2V0dXB0b29scyAwLjYuIEFsbCBwYWNrYWdlcyBidWlsdCBhZnRlciB0aGlzIHBvaW50IHdpbGwKICAgICAgICAgICAgIyB1c2UgdGhlIG5ldyBtYWNvc3ggZGVzaWduYXRpb24uCiAgICAgICAgICAgIHByb3ZEYXJ3aW4gPSBkYXJ3aW5WZXJzaW9uU3RyaW5nLm1hdGNoKHByb3ZpZGVkKQogICAgICAgICAgICBpZiBwcm92RGFyd2luOgogICAgICAgICAgICAgICAgZHZlcnNpb24gPSBpbnQocHJvdkRhcndpbi5ncm91cCgxKSkKICAgICAgICAgICAgICAgIG1hY29zdmVyc2lvbiA9ICIlcy4lcyIgJSAocmVxTWFjLmdyb3VwKDEpLCByZXFNYWMuZ3JvdXAoMikpCiAgICAgICAgICAgICAgICBpZiBkdmVyc2lvbiA9PSA3IGFuZCBtYWNvc3ZlcnNpb24gPj0gIjEwLjMiIG9yIFwKICAgICAgICAgICAgICAgICAgICAgICAgZHZlcnNpb24gPT0gOCBhbmQgbWFjb3N2ZXJzaW9uID49ICIxMC40IjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICAjIGVnZyBpc24ndCBtYWNvc3ggb3IgbGVnYWN5IGRhcndpbgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBhcmUgdGhleSB0aGUgc2FtZSBtYWpvciB2ZXJzaW9uIGFuZCBtYWNoaW5lIHR5cGU/CiAgICAgICAgaWYgcHJvdk1hYy5ncm91cCgxKSAhPSByZXFNYWMuZ3JvdXAoMSkgb3IgXAogICAgICAgICAgICAgICAgcHJvdk1hYy5ncm91cCgzKSAhPSByZXFNYWMuZ3JvdXAoMyk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIGlzIHRoZSByZXF1aXJlZCBPUyBtYWpvciB1cGRhdGUgPj0gdGhlIHByb3ZpZGVkIG9uZT8KICAgICAgICBpZiBpbnQocHJvdk1hYy5ncm91cCgyKSkgPiBpbnQocmVxTWFjLmdyb3VwKDIpKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHJldHVybiBUcnVlCgogICAgIyBYWFggTGludXggYW5kIG90aGVyIHBsYXRmb3Jtcycgc3BlY2lhbCBjYXNlcyBzaG91bGQgZ28gaGVyZQogICAgcmV0dXJuIEZhbHNlCgoKZGVmIHJ1bl9zY3JpcHQoZGlzdF9zcGVjLCBzY3JpcHRfbmFtZSk6CiAgICAiIiJMb2NhdGUgZGlzdHJpYnV0aW9uIGBkaXN0X3NwZWNgIGFuZCBydW4gaXRzIGBzY3JpcHRfbmFtZWAgc2NyaXB0IiIiCiAgICBucyA9IHN5cy5fZ2V0ZnJhbWUoMSkuZl9nbG9iYWxzCiAgICBuYW1lID0gbnNbJ19fbmFtZV9fJ10KICAgIG5zLmNsZWFyKCkKICAgIG5zWydfX25hbWVfXyddID0gbmFtZQogICAgcmVxdWlyZShkaXN0X3NwZWMpWzBdLnJ1bl9zY3JpcHQoc2NyaXB0X25hbWUsIG5zKQoKCiMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQpydW5fbWFpbiA9IHJ1bl9zY3JpcHQKCgpkZWYgZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KToKICAgICIiIlJldHVybiBhIGN1cnJlbnQgZGlzdHJpYnV0aW9uIG9iamVjdCBmb3IgYSBSZXF1aXJlbWVudCBvciBzdHJpbmciIiIKICAgIGlmIGlzaW5zdGFuY2UoZGlzdCwgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgZGlzdCA9IFJlcXVpcmVtZW50LnBhcnNlKGRpc3QpCiAgICBpZiBpc2luc3RhbmNlKGRpc3QsIFJlcXVpcmVtZW50KToKICAgICAgICBkaXN0ID0gZ2V0X3Byb3ZpZGVyKGRpc3QpCiAgICBpZiBub3QgaXNpbnN0YW5jZShkaXN0LCBEaXN0cmlidXRpb24pOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcigiRXhwZWN0ZWQgc3RyaW5nLCBSZXF1aXJlbWVudCwgb3IgRGlzdHJpYnV0aW9uIiwgZGlzdCkKICAgIHJldHVybiBkaXN0CgoKZGVmIGxvYWRfZW50cnlfcG9pbnQoZGlzdCwgZ3JvdXAsIG5hbWUpOgogICAgIiIiUmV0dXJuIGBuYW1lYCBlbnRyeSBwb2ludCBvZiBgZ3JvdXBgIGZvciBgZGlzdGAgb3IgcmFpc2UgSW1wb3J0RXJyb3IiIiIKICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmxvYWRfZW50cnlfcG9pbnQoZ3JvdXAsIG5hbWUpCgoKZGVmIGdldF9lbnRyeV9tYXAoZGlzdCwgZ3JvdXA9Tm9uZSk6CiAgICAiIiJSZXR1cm4gdGhlIGVudHJ5IHBvaW50IG1hcCBmb3IgYGdyb3VwYCwgb3IgdGhlIGZ1bGwgZW50cnkgbWFwIiIiCiAgICByZXR1cm4gZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KS5nZXRfZW50cnlfbWFwKGdyb3VwKQoKCmRlZiBnZXRfZW50cnlfaW5mbyhkaXN0LCBncm91cCwgbmFtZSk6CiAgICAiIiJSZXR1cm4gdGhlIEVudHJ5UG9pbnQgb2JqZWN0IGZvciBgZ3JvdXBgK2BuYW1lYCwgb3IgYGBOb25lYGAiIiIKICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmdldF9lbnRyeV9pbmZvKGdyb3VwLCBuYW1lKQoKCmNsYXNzIElNZXRhZGF0YVByb3ZpZGVyOgogICAgZGVmIGhhc19tZXRhZGF0YShuYW1lKToKICAgICAgICAiIiJEb2VzIHRoZSBwYWNrYWdlJ3MgZGlzdHJpYnV0aW9uIGNvbnRhaW4gdGhlIG5hbWVkIG1ldGFkYXRhPyIiIgoKICAgIGRlZiBnZXRfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgIiIiVGhlIG5hbWVkIG1ldGFkYXRhIHJlc291cmNlIGFzIGEgc3RyaW5nIiIiCgogICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhuYW1lKToKICAgICAgICAiIiJZaWVsZCBuYW1lZCBtZXRhZGF0YSByZXNvdXJjZSBhcyBsaXN0IG9mIG5vbi1ibGFuayBub24tY29tbWVudCBsaW5lcwoKICAgICAgIExlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgc3RyaXBwZWQgZnJvbSBlYWNoIGxpbmUsIGFuZCBsaW5lcwogICAgICAgd2l0aCBgYCNgYCBhcyB0aGUgZmlyc3Qgbm9uLWJsYW5rIGNoYXJhY3RlciBhcmUgb21pdHRlZC4iIiIKCiAgICBkZWYgbWV0YWRhdGFfaXNkaXIobmFtZSk6CiAgICAgICAgIiIiSXMgdGhlIG5hbWVkIG1ldGFkYXRhIGEgZGlyZWN0b3J5PyAgKGxpa2UgYGBvcy5wYXRoLmlzZGlyKClgYCkiIiIKCiAgICBkZWYgbWV0YWRhdGFfbGlzdGRpcihuYW1lKToKICAgICAgICAiIiJMaXN0IG9mIG1ldGFkYXRhIG5hbWVzIGluIHRoZSBkaXJlY3RvcnkgKGxpa2UgYGBvcy5saXN0ZGlyKClgYCkiIiIKCiAgICBkZWYgcnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbmFtZXNwYWNlKToKICAgICAgICAiIiJFeGVjdXRlIHRoZSBuYW1lZCBzY3JpcHQgaW4gdGhlIHN1cHBsaWVkIG5hbWVzcGFjZSBkaWN0aW9uYXJ5IiIiCgoKY2xhc3MgSVJlc291cmNlUHJvdmlkZXIoSU1ldGFkYXRhUHJvdmlkZXIpOgogICAgIiIiQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHBhY2thZ2UgcmVzb3VyY2VzIiIiCgogICAgZGVmIGdldF9yZXNvdXJjZV9maWxlbmFtZShtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSB0cnVlIGZpbGVzeXN0ZW0gcGF0aCBmb3IgYHJlc291cmNlX25hbWVgCgogICAgICAgIGBtYW5hZ2VyYCBtdXN0IGJlIGFuIGBgSVJlc291cmNlTWFuYWdlcmBgIiIiCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJlYW0obWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgcmVhZGFibGUgZmlsZS1saWtlIG9iamVjdCBmb3IgYHJlc291cmNlX25hbWVgCgogICAgICAgIGBtYW5hZ2VyYCBtdXN0IGJlIGFuIGBgSVJlc291cmNlTWFuYWdlcmBgIiIiCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJpbmcobWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIGByZXNvdXJjZV9uYW1lYAoKICAgICAgICBgbWFuYWdlcmAgbXVzdCBiZSBhbiBgYElSZXNvdXJjZU1hbmFnZXJgYCIiIgoKICAgIGRlZiBoYXNfcmVzb3VyY2UocmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiRG9lcyB0aGUgcGFja2FnZSBjb250YWluIHRoZSBuYW1lZCByZXNvdXJjZT8iIiIKCiAgICBkZWYgcmVzb3VyY2VfaXNkaXIocmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiSXMgdGhlIG5hbWVkIHJlc291cmNlIGEgZGlyZWN0b3J5PyAgKGxpa2UgYGBvcy5wYXRoLmlzZGlyKClgYCkiIiIKCiAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihyZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJMaXN0IG9mIHJlc291cmNlIG5hbWVzIGluIHRoZSBkaXJlY3RvcnkgKGxpa2UgYGBvcy5saXN0ZGlyKClgYCkiIiIKCgpjbGFzcyBXb3JraW5nU2V0KG9iamVjdCk6CiAgICAiIiJBIGNvbGxlY3Rpb24gb2YgYWN0aXZlIGRpc3RyaWJ1dGlvbnMgb24gc3lzLnBhdGggKG9yIGEgc2ltaWxhciBsaXN0KSIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbnRyaWVzPU5vbmUpOgogICAgICAgICIiIkNyZWF0ZSB3b3JraW5nIHNldCBmcm9tIGxpc3Qgb2YgcGF0aCBlbnRyaWVzIChkZWZhdWx0PXN5cy5wYXRoKSIiIgogICAgICAgIHNlbGYuZW50cmllcyA9IFtdCiAgICAgICAgc2VsZi5lbnRyeV9rZXlzID0ge30KICAgICAgICBzZWxmLmJ5X2tleSA9IHt9CiAgICAgICAgc2VsZi5jYWxsYmFja3MgPSBbXQoKICAgICAgICBpZiBlbnRyaWVzIGlzIE5vbmU6CiAgICAgICAgICAgIGVudHJpZXMgPSBzeXMucGF0aAoKICAgICAgICBmb3IgZW50cnkgaW4gZW50cmllczoKICAgICAgICAgICAgc2VsZi5hZGRfZW50cnkoZW50cnkpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2J1aWxkX21hc3RlcihjbHMpOgogICAgICAgICIiIgogICAgICAgIFByZXBhcmUgdGhlIG1hc3RlciB3b3JraW5nIHNldC4KICAgICAgICAiIiIKICAgICAgICB3cyA9IGNscygpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIF9fbWFpbl9fIGltcG9ydCBfX3JlcXVpcmVzX18KICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICMgVGhlIG1haW4gcHJvZ3JhbSBkb2VzIG5vdCBsaXN0IGFueSByZXF1aXJlbWVudHMKICAgICAgICAgICAgcmV0dXJuIHdzCgogICAgICAgICMgZW5zdXJlIHRoZSByZXF1aXJlbWVudHMgYXJlIG1ldAogICAgICAgIHRyeToKICAgICAgICAgICAgd3MucmVxdWlyZShfX3JlcXVpcmVzX18pCiAgICAgICAgZXhjZXB0IFZlcnNpb25Db25mbGljdDoKICAgICAgICAgICAgcmV0dXJuIGNscy5fYnVpbGRfZnJvbV9yZXF1aXJlbWVudHMoX19yZXF1aXJlc19fKQoKICAgICAgICByZXR1cm4gd3MKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfYnVpbGRfZnJvbV9yZXF1aXJlbWVudHMoY2xzLCByZXFfc3BlYyk6CiAgICAgICAgIiIiCiAgICAgICAgQnVpbGQgYSB3b3JraW5nIHNldCBmcm9tIGEgcmVxdWlyZW1lbnQgc3BlYy4gUmV3cml0ZXMgc3lzLnBhdGguCiAgICAgICAgIiIiCiAgICAgICAgIyB0cnkgaXQgd2l0aG91dCBkZWZhdWx0cyBhbHJlYWR5IG9uIHN5cy5wYXRoCiAgICAgICAgIyBieSBzdGFydGluZyB3aXRoIGFuIGVtcHR5IHBhdGgKICAgICAgICB3cyA9IGNscyhbXSkKICAgICAgICByZXFzID0gcGFyc2VfcmVxdWlyZW1lbnRzKHJlcV9zcGVjKQogICAgICAgIGRpc3RzID0gd3MucmVzb2x2ZShyZXFzLCBFbnZpcm9ubWVudCgpKQogICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgICAgICB3cy5hZGQoZGlzdCkKCiAgICAgICAgIyBhZGQgYW55IG1pc3NpbmcgZW50cmllcyBmcm9tIHN5cy5wYXRoCiAgICAgICAgZm9yIGVudHJ5IGluIHN5cy5wYXRoOgogICAgICAgICAgICBpZiBlbnRyeSBub3QgaW4gd3MuZW50cmllczoKICAgICAgICAgICAgICAgIHdzLmFkZF9lbnRyeShlbnRyeSkKCiAgICAgICAgIyB0aGVuIGNvcHkgYmFjayB0byBzeXMucGF0aAogICAgICAgIHN5cy5wYXRoWzpdID0gd3MuZW50cmllcwogICAgICAgIHJldHVybiB3cwoKICAgIGRlZiBhZGRfZW50cnkoc2VsZiwgZW50cnkpOgogICAgICAgICIiIkFkZCBhIHBhdGggaXRlbSB0byBgYC5lbnRyaWVzYGAsIGZpbmRpbmcgYW55IGRpc3RyaWJ1dGlvbnMgb24gaXQKCiAgICAgICAgYGBmaW5kX2Rpc3RyaWJ1dGlvbnMoZW50cnksIFRydWUpYGAgaXMgdXNlZCB0byBmaW5kIGRpc3RyaWJ1dGlvbnMKICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXRoIGVudHJ5LCBhbmQgdGhleSBhcmUgYWRkZWQuICBgZW50cnlgIGlzCiAgICAgICAgYWx3YXlzIGFwcGVuZGVkIHRvIGBgLmVudHJpZXNgYCwgZXZlbiBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQuCiAgICAgICAgKFRoaXMgaXMgYmVjYXVzZSBgYHN5cy5wYXRoYGAgY2FuIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWUgbW9yZSB0aGFuCiAgICAgICAgb25jZSwgYW5kIHRoZSBgYC5lbnRyaWVzYGAgb2YgdGhlIGBgc3lzLnBhdGhgYCBXb3JraW5nU2V0IHNob3VsZCBhbHdheXMKICAgICAgICBlcXVhbCBgYHN5cy5wYXRoYGAuKQogICAgICAgICIiIgogICAgICAgIHNlbGYuZW50cnlfa2V5cy5zZXRkZWZhdWx0KGVudHJ5LCBbXSkKICAgICAgICBzZWxmLmVudHJpZXMuYXBwZW5kKGVudHJ5KQogICAgICAgIGZvciBkaXN0IGluIGZpbmRfZGlzdHJpYnV0aW9ucyhlbnRyeSwgVHJ1ZSk6CiAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QsIGVudHJ5LCBGYWxzZSkKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGRpc3QpOgogICAgICAgICIiIlRydWUgaWYgYGRpc3RgIGlzIHRoZSBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciBpdHMgcHJvamVjdCIiIgogICAgICAgIHJldHVybiBzZWxmLmJ5X2tleS5nZXQoZGlzdC5rZXkpID09IGRpc3QKCiAgICBkZWYgZmluZChzZWxmLCByZXEpOgogICAgICAgICIiIkZpbmQgYSBkaXN0cmlidXRpb24gbWF0Y2hpbmcgcmVxdWlyZW1lbnQgYHJlcWAKCiAgICAgICAgSWYgdGhlcmUgaXMgYW4gYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBwcm9qZWN0LCB0aGlzCiAgICAgICAgcmV0dXJucyBpdCBhcyBsb25nIGFzIGl0IG1lZXRzIHRoZSB2ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWNpZmllZCBieQogICAgICAgIGByZXFgLiAgQnV0LCBpZiB0aGVyZSBpcyBhbiBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgcHJvamVjdCBhbmQgaXQKICAgICAgICBkb2VzICpub3QqIG1lZXQgdGhlIGByZXFgIHJlcXVpcmVtZW50LCBgYFZlcnNpb25Db25mbGljdGBgIGlzIHJhaXNlZC4KICAgICAgICBJZiB0aGVyZSBpcyBubyBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgcmVxdWVzdGVkIHByb2plY3QsIGBgTm9uZWBgCiAgICAgICAgaXMgcmV0dXJuZWQuCiAgICAgICAgIiIiCiAgICAgICAgZGlzdCA9IHNlbGYuYnlfa2V5LmdldChyZXEua2V5KQogICAgICAgIGlmIGRpc3QgaXMgbm90IE5vbmUgYW5kIGRpc3Qgbm90IGluIHJlcToKICAgICAgICAgICAgIyBYWFggYWRkIG1vcmUgaW5mbwogICAgICAgICAgICByYWlzZSBWZXJzaW9uQ29uZmxpY3QoZGlzdCwgcmVxKQogICAgICAgIHJldHVybiBkaXN0CgogICAgZGVmIGl0ZXJfZW50cnlfcG9pbnRzKHNlbGYsIGdyb3VwLCBuYW1lPU5vbmUpOgogICAgICAgICIiIllpZWxkIGVudHJ5IHBvaW50IG9iamVjdHMgZnJvbSBgZ3JvdXBgIG1hdGNoaW5nIGBuYW1lYAoKICAgICAgICBJZiBgbmFtZWAgaXMgTm9uZSwgeWllbGRzIGFsbCBlbnRyeSBwb2ludHMgaW4gYGdyb3VwYCBmcm9tIGFsbAogICAgICAgIGRpc3RyaWJ1dGlvbnMgaW4gdGhlIHdvcmtpbmcgc2V0LCBvdGhlcndpc2Ugb25seSBvbmVzIG1hdGNoaW5nCiAgICAgICAgYm90aCBgZ3JvdXBgIGFuZCBgbmFtZWAgYXJlIHlpZWxkZWQgKGluIGRpc3RyaWJ1dGlvbiBvcmRlcikuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGRpc3QgaW4gc2VsZjoKICAgICAgICAgICAgZW50cmllcyA9IGRpc3QuZ2V0X2VudHJ5X21hcChncm91cCkKICAgICAgICAgICAgaWYgbmFtZSBpcyBOb25lOgogICAgICAgICAgICAgICAgZm9yIGVwIGluIGVudHJpZXMudmFsdWVzKCk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgZXAKICAgICAgICAgICAgZWxpZiBuYW1lIGluIGVudHJpZXM6CiAgICAgICAgICAgICAgICB5aWVsZCBlbnRyaWVzW25hbWVdCgogICAgZGVmIHJ1bl9zY3JpcHQoc2VsZiwgcmVxdWlyZXMsIHNjcmlwdF9uYW1lKToKICAgICAgICAiIiJMb2NhdGUgZGlzdHJpYnV0aW9uIGZvciBgcmVxdWlyZXNgIGFuZCBydW4gYHNjcmlwdF9uYW1lYCBzY3JpcHQiIiIKICAgICAgICBucyA9IHN5cy5fZ2V0ZnJhbWUoMSkuZl9nbG9iYWxzCiAgICAgICAgbmFtZSA9IG5zWydfX25hbWVfXyddCiAgICAgICAgbnMuY2xlYXIoKQogICAgICAgIG5zWydfX25hbWVfXyddID0gbmFtZQogICAgICAgIHNlbGYucmVxdWlyZShyZXF1aXJlcylbMF0ucnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbnMpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIllpZWxkIGRpc3RyaWJ1dGlvbnMgZm9yIG5vbi1kdXBsaWNhdGUgcHJvamVjdHMgaW4gdGhlIHdvcmtpbmcgc2V0CgogICAgICAgIFRoZSB5aWVsZCBvcmRlciBpcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGl0ZW1zJyBwYXRoIGVudHJpZXMgd2VyZQogICAgICAgIGFkZGVkIHRvIHRoZSB3b3JraW5nIHNldC4KICAgICAgICAiIiIKICAgICAgICBzZWVuID0ge30KICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLmVudHJpZXM6CiAgICAgICAgICAgIGlmIGl0ZW0gbm90IGluIHNlbGYuZW50cnlfa2V5czoKICAgICAgICAgICAgICAgICMgd29ya2Fyb3VuZCBhIGNhY2hlIGlzc3VlCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgZm9yIGtleSBpbiBzZWxmLmVudHJ5X2tleXNbaXRlbV06CiAgICAgICAgICAgICAgICBpZiBrZXkgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICAgICAgc2VlbltrZXldID0gMQogICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuYnlfa2V5W2tleV0KCiAgICBkZWYgYWRkKHNlbGYsIGRpc3QsIGVudHJ5PU5vbmUsIGluc2VydD1UcnVlLCByZXBsYWNlPUZhbHNlKToKICAgICAgICAiIiJBZGQgYGRpc3RgIHRvIHdvcmtpbmcgc2V0LCBhc3NvY2lhdGVkIHdpdGggYGVudHJ5YAoKICAgICAgICBJZiBgZW50cnlgIGlzIHVuc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB0aGUgYGAubG9jYXRpb25gYCBvZiBgZGlzdGAuCiAgICAgICAgT24gZXhpdCBmcm9tIHRoaXMgcm91dGluZSwgYGVudHJ5YCBpcyBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSB3b3JraW5nCiAgICAgICAgc2V0J3MgYGAuZW50cmllc2BgIChpZiBpdCB3YXNuJ3QgYWxyZWFkeSBwcmVzZW50KS4KCiAgICAgICAgYGRpc3RgIGlzIG9ubHkgYWRkZWQgdG8gdGhlIHdvcmtpbmcgc2V0IGlmIGl0J3MgZm9yIGEgcHJvamVjdCB0aGF0CiAgICAgICAgZG9lc24ndCBhbHJlYWR5IGhhdmUgYSBkaXN0cmlidXRpb24gaW4gdGhlIHNldCwgdW5sZXNzIGByZXBsYWNlPVRydWVgLgogICAgICAgIElmIGl0J3MgYWRkZWQsIGFueSBjYWxsYmFja3MgcmVnaXN0ZXJlZCB3aXRoIHRoZSBgYHN1YnNjcmliZSgpYGAgbWV0aG9kCiAgICAgICAgd2lsbCBiZSBjYWxsZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaW5zZXJ0OgogICAgICAgICAgICBkaXN0Lmluc2VydF9vbihzZWxmLmVudHJpZXMsIGVudHJ5LCByZXBsYWNlPXJlcGxhY2UpCgogICAgICAgIGlmIGVudHJ5IGlzIE5vbmU6CiAgICAgICAgICAgIGVudHJ5ID0gZGlzdC5sb2NhdGlvbgogICAgICAgIGtleXMgPSBzZWxmLmVudHJ5X2tleXMuc2V0ZGVmYXVsdChlbnRyeSwgW10pCiAgICAgICAga2V5czIgPSBzZWxmLmVudHJ5X2tleXMuc2V0ZGVmYXVsdChkaXN0LmxvY2F0aW9uLCBbXSkKICAgICAgICBpZiBub3QgcmVwbGFjZSBhbmQgZGlzdC5rZXkgaW4gc2VsZi5ieV9rZXk6CiAgICAgICAgICAgICMgaWdub3JlIGhpZGRlbiBkaXN0cm9zCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZWxmLmJ5X2tleVtkaXN0LmtleV0gPSBkaXN0CiAgICAgICAgaWYgZGlzdC5rZXkgbm90IGluIGtleXM6CiAgICAgICAgICAgIGtleXMuYXBwZW5kKGRpc3Qua2V5KQogICAgICAgIGlmIGRpc3Qua2V5IG5vdCBpbiBrZXlzMjoKICAgICAgICAgICAga2V5czIuYXBwZW5kKGRpc3Qua2V5KQogICAgICAgIHNlbGYuX2FkZGVkX25ldyhkaXN0KQoKICAgIGRlZiByZXNvbHZlKHNlbGYsIHJlcXVpcmVtZW50cywgZW52PU5vbmUsIGluc3RhbGxlcj1Ob25lLAogICAgICAgICAgICAgICAgcmVwbGFjZV9jb25mbGljdGluZz1GYWxzZSwgZXh0cmFzPU5vbmUpOgogICAgICAgICIiIkxpc3QgYWxsIGRpc3RyaWJ1dGlvbnMgbmVlZGVkIHRvIChyZWN1cnNpdmVseSkgbWVldCBgcmVxdWlyZW1lbnRzYAoKICAgICAgICBgcmVxdWlyZW1lbnRzYCBtdXN0IGJlIGEgc2VxdWVuY2Ugb2YgYGBSZXF1aXJlbWVudGBgIG9iamVjdHMuICBgZW52YCwKICAgICAgICBpZiBzdXBwbGllZCwgc2hvdWxkIGJlIGFuIGBgRW52aXJvbm1lbnRgYCBpbnN0YW5jZS4gIElmCiAgICAgICAgbm90IHN1cHBsaWVkLCBpdCBkZWZhdWx0cyB0byBhbGwgZGlzdHJpYnV0aW9ucyBhdmFpbGFibGUgd2l0aGluIGFueQogICAgICAgIGVudHJ5IG9yIGRpc3RyaWJ1dGlvbiBpbiB0aGUgd29ya2luZyBzZXQuICBgaW5zdGFsbGVyYCwgaWYgc3VwcGxpZWQsCiAgICAgICAgd2lsbCBiZSBpbnZva2VkIHdpdGggZWFjaCByZXF1aXJlbWVudCB0aGF0IGNhbm5vdCBiZSBtZXQgYnkgYW4KICAgICAgICBhbHJlYWR5LWluc3RhbGxlZCBkaXN0cmlidXRpb247IGl0IHNob3VsZCByZXR1cm4gYSBgYERpc3RyaWJ1dGlvbmBgIG9yCiAgICAgICAgYGBOb25lYGAuCgogICAgICAgIFVubGVzcyBgcmVwbGFjZV9jb25mbGljdGluZz1UcnVlYCwgcmFpc2VzIGEgVmVyc2lvbkNvbmZsaWN0IGV4Y2VwdGlvbgogICAgICAgIGlmCiAgICAgICAgYW55IHJlcXVpcmVtZW50cyBhcmUgZm91bmQgb24gdGhlIHBhdGggdGhhdCBoYXZlIHRoZSBjb3JyZWN0IG5hbWUgYnV0CiAgICAgICAgdGhlIHdyb25nIHZlcnNpb24uICBPdGhlcndpc2UsIGlmIGFuIGBpbnN0YWxsZXJgIGlzIHN1cHBsaWVkIGl0IHdpbGwgYmUKICAgICAgICBpbnZva2VkIHRvIG9idGFpbiB0aGUgY29ycmVjdCB2ZXJzaW9uIG9mIHRoZSByZXF1aXJlbWVudCBhbmQgYWN0aXZhdGUKICAgICAgICBpdC4KCiAgICAgICAgYGV4dHJhc2AgaXMgYSBsaXN0IG9mIHRoZSBleHRyYXMgdG8gYmUgdXNlZCB3aXRoIHRoZXNlIHJlcXVpcmVtZW50cy4KICAgICAgICBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGV4dHJhIHJlcXVpcmVtZW50cyBtYXkgbG9vayBsaWtlIGBteV9yZXE7CiAgICAgICAgZXh0cmEgPSAibXlfZXh0cmEiYCwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGJlIGludGVycHJldGVkIGFzIGEgcHVyZWx5CiAgICAgICAgb3B0aW9uYWwgcmVxdWlyZW1lbnQuICBJbnN0ZWFkLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gYXNzZXJ0IHRoYXQgdGhlc2UKICAgICAgICByZXF1aXJlbWVudHMgYXJlIHRydWx5IHJlcXVpcmVkLgogICAgICAgICIiIgoKICAgICAgICAjIHNldCB1cCB0aGUgc3RhY2sKICAgICAgICByZXF1aXJlbWVudHMgPSBsaXN0KHJlcXVpcmVtZW50cylbOjotMV0KICAgICAgICAjIHNldCBvZiBwcm9jZXNzZWQgcmVxdWlyZW1lbnRzCiAgICAgICAgcHJvY2Vzc2VkID0ge30KICAgICAgICAjIGtleSAtPiBkaXN0CiAgICAgICAgYmVzdCA9IHt9CiAgICAgICAgdG9fYWN0aXZhdGUgPSBbXQoKICAgICAgICByZXFfZXh0cmFzID0gX1JlcUV4dHJhcygpCgogICAgICAgICMgTWFwcGluZyBvZiByZXF1aXJlbWVudCB0byBzZXQgb2YgZGlzdHJpYnV0aW9ucyB0aGF0IHJlcXVpcmVkIGl0OwogICAgICAgICMgdXNlZnVsIGZvciByZXBvcnRpbmcgaW5mbyBhYm91dCBjb25mbGljdHMuCiAgICAgICAgcmVxdWlyZWRfYnkgPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChzZXQpCgogICAgICAgIHdoaWxlIHJlcXVpcmVtZW50czoKICAgICAgICAgICAgIyBwcm9jZXNzIGRlcGVuZGVuY2llcyBicmVhZHRoLWZpcnN0CiAgICAgICAgICAgIHJlcSA9IHJlcXVpcmVtZW50cy5wb3AoMCkKICAgICAgICAgICAgaWYgcmVxIGluIHByb2Nlc3NlZDoKICAgICAgICAgICAgICAgICMgSWdub3JlIGN5Y2xpYyBvciByZWR1bmRhbnQgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgaWYgbm90IHJlcV9leHRyYXMubWFya2Vyc19wYXNzKHJlcSwgZXh0cmFzKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBkaXN0ID0gYmVzdC5nZXQocmVxLmtleSkKICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgIyBGaW5kIHRoZSBiZXN0IGRpc3RyaWJ1dGlvbiBhbmQgYWRkIGl0IHRvIHRoZSBtYXAKICAgICAgICAgICAgICAgIGRpc3QgPSBzZWxmLmJ5X2tleS5nZXQocmVxLmtleSkKICAgICAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZSBvciAoZGlzdCBub3QgaW4gcmVxIGFuZCByZXBsYWNlX2NvbmZsaWN0aW5nKToKICAgICAgICAgICAgICAgICAgICB3cyA9IHNlbGYKICAgICAgICAgICAgICAgICAgICBpZiBlbnYgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gRW52aXJvbm1lbnQoc2VsZi5lbnRyaWVzKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2UgYW4gZW1wdHkgZW52aXJvbm1lbnQgYW5kIHdvcmtpbmdzZXQgdG8gYXZvaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYW55IGZ1cnRoZXIgY29uZmxpY3RzIHdpdGggdGhlIGNvbmZsaWN0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRpc3RyaWJ1dGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gRW52aXJvbm1lbnQoW10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cyA9IFdvcmtpbmdTZXQoW10pCiAgICAgICAgICAgICAgICAgICAgZGlzdCA9IGJlc3RbcmVxLmtleV0gPSBlbnYuYmVzdF9tYXRjaCgKICAgICAgICAgICAgICAgICAgICAgICAgcmVxLCB3cywgaW5zdGFsbGVyLAogICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlX2NvbmZsaWN0aW5nPXJlcGxhY2VfY29uZmxpY3RpbmcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlcnMgPSByZXF1aXJlZF9ieS5nZXQocmVxLCBOb25lKQogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0cmlidXRpb25Ob3RGb3VuZChyZXEsIHJlcXVpcmVycykKICAgICAgICAgICAgICAgIHRvX2FjdGl2YXRlLmFwcGVuZChkaXN0KQogICAgICAgICAgICBpZiBkaXN0IG5vdCBpbiByZXE6CiAgICAgICAgICAgICAgICAjIE9vcHMsIHRoZSAiYmVzdCIgc28gZmFyIGNvbmZsaWN0cyB3aXRoIGEgZGVwZW5kZW5jeQogICAgICAgICAgICAgICAgZGVwZW5kZW50X3JlcSA9IHJlcXVpcmVkX2J5W3JlcV0KICAgICAgICAgICAgICAgIHJhaXNlIFZlcnNpb25Db25mbGljdChkaXN0LCByZXEpLndpdGhfY29udGV4dChkZXBlbmRlbnRfcmVxKQoKICAgICAgICAgICAgIyBwdXNoIHRoZSBuZXcgcmVxdWlyZW1lbnRzIG9udG8gdGhlIHN0YWNrCiAgICAgICAgICAgIG5ld19yZXF1aXJlbWVudHMgPSBkaXN0LnJlcXVpcmVzKHJlcS5leHRyYXMpWzo6LTFdCiAgICAgICAgICAgIHJlcXVpcmVtZW50cy5leHRlbmQobmV3X3JlcXVpcmVtZW50cykKCiAgICAgICAgICAgICMgUmVnaXN0ZXIgdGhlIG5ldyByZXF1aXJlbWVudHMgbmVlZGVkIGJ5IHJlcQogICAgICAgICAgICBmb3IgbmV3X3JlcXVpcmVtZW50IGluIG5ld19yZXF1aXJlbWVudHM6CiAgICAgICAgICAgICAgICByZXF1aXJlZF9ieVtuZXdfcmVxdWlyZW1lbnRdLmFkZChyZXEucHJvamVjdF9uYW1lKQogICAgICAgICAgICAgICAgcmVxX2V4dHJhc1tuZXdfcmVxdWlyZW1lbnRdID0gcmVxLmV4dHJhcwoKICAgICAgICAgICAgcHJvY2Vzc2VkW3JlcV0gPSBUcnVlCgogICAgICAgICMgcmV0dXJuIGxpc3Qgb2YgZGlzdHJvcyB0byBhY3RpdmF0ZQogICAgICAgIHJldHVybiB0b19hY3RpdmF0ZQoKICAgIGRlZiBmaW5kX3BsdWdpbnMoCiAgICAgICAgICAgIHNlbGYsIHBsdWdpbl9lbnYsIGZ1bGxfZW52PU5vbmUsIGluc3RhbGxlcj1Ob25lLCBmYWxsYmFjaz1UcnVlKToKICAgICAgICAiIiJGaW5kIGFsbCBhY3RpdmF0YWJsZSBkaXN0cmlidXRpb25zIGluIGBwbHVnaW5fZW52YAoKICAgICAgICBFeGFtcGxlIHVzYWdlOjoKCiAgICAgICAgICAgIGRpc3RyaWJ1dGlvbnMsIGVycm9ycyA9IHdvcmtpbmdfc2V0LmZpbmRfcGx1Z2lucygKICAgICAgICAgICAgICAgIEVudmlyb25tZW50KHBsdWdpbl9kaXJsaXN0KQogICAgICAgICAgICApCiAgICAgICAgICAgICMgYWRkIHBsdWdpbnMrbGlicyB0byBzeXMucGF0aAogICAgICAgICAgICBtYXAod29ya2luZ19zZXQuYWRkLCBkaXN0cmlidXRpb25zKQogICAgICAgICAgICAjIGRpc3BsYXkgZXJyb3JzCiAgICAgICAgICAgIHByaW50KCdDb3VsZCBub3QgbG9hZCcsIGVycm9ycykKCiAgICAgICAgVGhlIGBwbHVnaW5fZW52YCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgIGluc3RhbmNlIHRoYXQgY29udGFpbnMKICAgICAgICBvbmx5IGRpc3RyaWJ1dGlvbnMgdGhhdCBhcmUgaW4gdGhlIHByb2plY3QncyAicGx1Z2luIGRpcmVjdG9yeSIgb3IKICAgICAgICBkaXJlY3Rvcmllcy4gVGhlIGBmdWxsX2VudmAsIGlmIHN1cHBsaWVkLCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgCiAgICAgICAgY29udGFpbnMgYWxsIGN1cnJlbnRseS1hdmFpbGFibGUgZGlzdHJpYnV0aW9ucy4gIElmIGBmdWxsX2VudmAgaXMgbm90CiAgICAgICAgc3VwcGxpZWQsIG9uZSBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgYGBXb3JraW5nU2V0YGAgdGhpcwogICAgICAgIG1ldGhvZCBpcyBjYWxsZWQgb24sIHdoaWNoIHdpbGwgdHlwaWNhbGx5IG1lYW4gdGhhdCBldmVyeSBkaXJlY3Rvcnkgb24KICAgICAgICBgYHN5cy5wYXRoYGAgd2lsbCBiZSBzY2FubmVkIGZvciBkaXN0cmlidXRpb25zLgoKICAgICAgICBgaW5zdGFsbGVyYCBpcyBhIHN0YW5kYXJkIGluc3RhbGxlciBjYWxsYmFjayBhcyB1c2VkIGJ5IHRoZQogICAgICAgIGBgcmVzb2x2ZSgpYGAgbWV0aG9kLiBUaGUgYGZhbGxiYWNrYCBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZAogICAgICAgIGF0dGVtcHQgdG8gcmVzb2x2ZSBvbGRlciB2ZXJzaW9ucyBvZiBhIHBsdWdpbiBpZiB0aGUgbmV3ZXN0IHZlcnNpb24KICAgICAgICBjYW5ub3QgYmUgcmVzb2x2ZWQuCgogICAgICAgIFRoaXMgbWV0aG9kIHJldHVybnMgYSAyLXR1cGxlOiAoYGRpc3RyaWJ1dGlvbnNgLCBgZXJyb3JfaW5mb2ApLCB3aGVyZQogICAgICAgIGBkaXN0cmlidXRpb25zYCBpcyBhIGxpc3Qgb2YgdGhlIGRpc3RyaWJ1dGlvbnMgZm91bmQgaW4gYHBsdWdpbl9lbnZgCiAgICAgICAgdGhhdCB3ZXJlIGxvYWRhYmxlLCBhbG9uZyB3aXRoIGFueSBvdGhlciBkaXN0cmlidXRpb25zIHRoYXQgYXJlIG5lZWRlZAogICAgICAgIHRvIHJlc29sdmUgdGhlaXIgZGVwZW5kZW5jaWVzLiAgYGVycm9yX2luZm9gIGlzIGEgZGljdGlvbmFyeSBtYXBwaW5nCiAgICAgICAgdW5sb2FkYWJsZSBwbHVnaW4gZGlzdHJpYnV0aW9ucyB0byBhbiBleGNlcHRpb24gaW5zdGFuY2UgZGVzY3JpYmluZyB0aGUKICAgICAgICBlcnJvciB0aGF0IG9jY3VycmVkLiBVc3VhbGx5IHRoaXMgd2lsbCBiZSBhIGBgRGlzdHJpYnV0aW9uTm90Rm91bmRgYCBvcgogICAgICAgIGBgVmVyc2lvbkNvbmZsaWN0YGAgaW5zdGFuY2UuCiAgICAgICAgIiIiCgogICAgICAgIHBsdWdpbl9wcm9qZWN0cyA9IGxpc3QocGx1Z2luX2VudikKICAgICAgICAjIHNjYW4gcHJvamVjdCBuYW1lcyBpbiBhbHBoYWJldGljIG9yZGVyCiAgICAgICAgcGx1Z2luX3Byb2plY3RzLnNvcnQoKQoKICAgICAgICBlcnJvcl9pbmZvID0ge30KICAgICAgICBkaXN0cmlidXRpb25zID0ge30KCiAgICAgICAgaWYgZnVsbF9lbnYgaXMgTm9uZToKICAgICAgICAgICAgZW52ID0gRW52aXJvbm1lbnQoc2VsZi5lbnRyaWVzKQogICAgICAgICAgICBlbnYgKz0gcGx1Z2luX2VudgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGVudiA9IGZ1bGxfZW52ICsgcGx1Z2luX2VudgoKICAgICAgICBzaGFkb3dfc2V0ID0gc2VsZi5fX2NsYXNzX18oW10pCiAgICAgICAgIyBwdXQgYWxsIG91ciBlbnRyaWVzIGluIHNoYWRvd19zZXQKICAgICAgICBsaXN0KG1hcChzaGFkb3dfc2V0LmFkZCwgc2VsZikpCgogICAgICAgIGZvciBwcm9qZWN0X25hbWUgaW4gcGx1Z2luX3Byb2plY3RzOgoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gcGx1Z2luX2Vudltwcm9qZWN0X25hbWVdOgoKICAgICAgICAgICAgICAgIHJlcSA9IFtkaXN0LmFzX3JlcXVpcmVtZW50KCldCgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJlc29sdmVlcyA9IHNoYWRvd19zZXQucmVzb2x2ZShyZXEsIGVudiwgaW5zdGFsbGVyKQoKICAgICAgICAgICAgICAgIGV4Y2VwdCBSZXNvbHV0aW9uRXJyb3IgYXMgdjoKICAgICAgICAgICAgICAgICAgICAjIHNhdmUgZXJyb3IgaW5mbwogICAgICAgICAgICAgICAgICAgIGVycm9yX2luZm9bZGlzdF0gPSB2CiAgICAgICAgICAgICAgICAgICAgaWYgZmFsbGJhY2s6CiAgICAgICAgICAgICAgICAgICAgICAgICMgdHJ5IHRoZSBuZXh0IG9sZGVyIHZlcnNpb24gb2YgcHJvamVjdAogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICMgZ2l2ZSB1cCBvbiB0aGlzIHByb2plY3QsIGtlZXAgZ29pbmcKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGxpc3QobWFwKHNoYWRvd19zZXQuYWRkLCByZXNvbHZlZXMpKQogICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbnMudXBkYXRlKGRpY3QuZnJvbWtleXMocmVzb2x2ZWVzKSkKCiAgICAgICAgICAgICAgICAgICAgIyBzdWNjZXNzLCBubyBuZWVkIHRvIHRyeSBhbnkgbW9yZSB2ZXJzaW9ucyBvZiB0aGlzIHByb2plY3QKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICBkaXN0cmlidXRpb25zID0gbGlzdChkaXN0cmlidXRpb25zKQogICAgICAgIGRpc3RyaWJ1dGlvbnMuc29ydCgpCgogICAgICAgIHJldHVybiBkaXN0cmlidXRpb25zLCBlcnJvcl9pbmZvCgogICAgZGVmIHJlcXVpcmUoc2VsZiwgKnJlcXVpcmVtZW50cyk6CiAgICAgICAgIiIiRW5zdXJlIHRoYXQgZGlzdHJpYnV0aW9ucyBtYXRjaGluZyBgcmVxdWlyZW1lbnRzYCBhcmUgYWN0aXZhdGVkCgogICAgICAgIGByZXF1aXJlbWVudHNgIG11c3QgYmUgYSBzdHJpbmcgb3IgYSAocG9zc2libHktbmVzdGVkKSBzZXF1ZW5jZQogICAgICAgIHRoZXJlb2YsIHNwZWNpZnlpbmcgdGhlIGRpc3RyaWJ1dGlvbnMgYW5kIHZlcnNpb25zIHJlcXVpcmVkLiAgVGhlCiAgICAgICAgcmV0dXJuIHZhbHVlIGlzIGEgc2VxdWVuY2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbnMgdGhhdCBuZWVkZWQgdG8gYmUKICAgICAgICBhY3RpdmF0ZWQgdG8gZnVsZmlsbCB0aGUgcmVxdWlyZW1lbnRzOyBhbGwgcmVsZXZhbnQgZGlzdHJpYnV0aW9ucyBhcmUKICAgICAgICBpbmNsdWRlZCwgZXZlbiBpZiB0aGV5IHdlcmUgYWxyZWFkeSBhY3RpdmF0ZWQgaW4gdGhpcyB3b3JraW5nIHNldC4KICAgICAgICAiIiIKICAgICAgICBuZWVkZWQgPSBzZWxmLnJlc29sdmUocGFyc2VfcmVxdWlyZW1lbnRzKHJlcXVpcmVtZW50cykpCgogICAgICAgIGZvciBkaXN0IGluIG5lZWRlZDoKICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKCiAgICAgICAgcmV0dXJuIG5lZWRlZAoKICAgIGRlZiBzdWJzY3JpYmUoc2VsZiwgY2FsbGJhY2ssIGV4aXN0aW5nPVRydWUpOgogICAgICAgICIiIkludm9rZSBgY2FsbGJhY2tgIGZvciBhbGwgZGlzdHJpYnV0aW9ucwoKICAgICAgICBJZiBgZXhpc3Rpbmc9VHJ1ZWAgKGRlZmF1bHQpLAogICAgICAgIGNhbGwgb24gYWxsIGV4aXN0aW5nIG9uZXMsIGFzIHdlbGwuCiAgICAgICAgIiIiCiAgICAgICAgaWYgY2FsbGJhY2sgaW4gc2VsZi5jYWxsYmFja3M6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuY2FsbGJhY2tzLmFwcGVuZChjYWxsYmFjaykKICAgICAgICBpZiBub3QgZXhpc3Rpbmc6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGZvciBkaXN0IGluIHNlbGY6CiAgICAgICAgICAgIGNhbGxiYWNrKGRpc3QpCgogICAgZGVmIF9hZGRlZF9uZXcoc2VsZiwgZGlzdCk6CiAgICAgICAgZm9yIGNhbGxiYWNrIGluIHNlbGYuY2FsbGJhY2tzOgogICAgICAgICAgICBjYWxsYmFjayhkaXN0KQoKICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgc2VsZi5lbnRyaWVzWzpdLCBzZWxmLmVudHJ5X2tleXMuY29weSgpLCBzZWxmLmJ5X2tleS5jb3B5KCksCiAgICAgICAgICAgIHNlbGYuY2FsbGJhY2tzWzpdCiAgICAgICAgKQoKICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgZV9rX2JfYyk6CiAgICAgICAgZW50cmllcywga2V5cywgYnlfa2V5LCBjYWxsYmFja3MgPSBlX2tfYl9jCiAgICAgICAgc2VsZi5lbnRyaWVzID0gZW50cmllc1s6XQogICAgICAgIHNlbGYuZW50cnlfa2V5cyA9IGtleXMuY29weSgpCiAgICAgICAgc2VsZi5ieV9rZXkgPSBieV9rZXkuY29weSgpCiAgICAgICAgc2VsZi5jYWxsYmFja3MgPSBjYWxsYmFja3NbOl0KCgpjbGFzcyBfUmVxRXh0cmFzKGRpY3QpOgogICAgIiIiCiAgICBNYXAgZWFjaCByZXF1aXJlbWVudCB0byB0aGUgZXh0cmFzIHRoYXQgZGVtYW5kZWQgaXQuCiAgICAiIiIKCiAgICBkZWYgbWFya2Vyc19wYXNzKHNlbGYsIHJlcSwgZXh0cmFzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEV2YWx1YXRlIG1hcmtlcnMgZm9yIHJlcSBhZ2FpbnN0IGVhY2ggZXh0cmEgdGhhdAogICAgICAgIGRlbWFuZGVkIGl0LgoKICAgICAgICBSZXR1cm4gRmFsc2UgaWYgdGhlIHJlcSBoYXMgYSBtYXJrZXIgYW5kIGZhaWxzCiAgICAgICAgZXZhbHVhdGlvbi4gT3RoZXJ3aXNlLCByZXR1cm4gVHJ1ZS4KICAgICAgICAiIiIKICAgICAgICBleHRyYV9ldmFscyA9ICgKICAgICAgICAgICAgcmVxLm1hcmtlci5ldmFsdWF0ZSh7J2V4dHJhJzogZXh0cmF9KQogICAgICAgICAgICBmb3IgZXh0cmEgaW4gc2VsZi5nZXQocmVxLCAoKSkgKyAoZXh0cmFzIG9yIChOb25lLCkpCiAgICAgICAgKQogICAgICAgIHJldHVybiBub3QgcmVxLm1hcmtlciBvciBhbnkoZXh0cmFfZXZhbHMpCgoKY2xhc3MgRW52aXJvbm1lbnQob2JqZWN0KToKICAgICIiIlNlYXJjaGFibGUgc25hcHNob3Qgb2YgZGlzdHJpYnV0aW9ucyBvbiBhIHNlYXJjaCBwYXRoIiIiCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgICAgICBzZWxmLCBzZWFyY2hfcGF0aD1Ob25lLCBwbGF0Zm9ybT1nZXRfc3VwcG9ydGVkX3BsYXRmb3JtKCksCiAgICAgICAgICAgIHB5dGhvbj1QWV9NQUpPUik6CiAgICAgICAgIiIiU25hcHNob3QgZGlzdHJpYnV0aW9ucyBhdmFpbGFibGUgb24gYSBzZWFyY2ggcGF0aAoKICAgICAgICBBbnkgZGlzdHJpYnV0aW9ucyBmb3VuZCBvbiBgc2VhcmNoX3BhdGhgIGFyZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQuCiAgICAgICAgYHNlYXJjaF9wYXRoYCBzaG91bGQgYmUgYSBzZXF1ZW5jZSBvZiBgYHN5cy5wYXRoYGAgaXRlbXMuICBJZiBub3QKICAgICAgICBzdXBwbGllZCwgYGBzeXMucGF0aGBgIGlzIHVzZWQuCgogICAgICAgIGBwbGF0Zm9ybWAgaXMgYW4gb3B0aW9uYWwgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIG5hbWUgb2YgdGhlIHBsYXRmb3JtCiAgICAgICAgdGhhdCBwbGF0Zm9ybS1zcGVjaWZpYyBkaXN0cmlidXRpb25zIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoLiAgSWYKICAgICAgICB1bnNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcGxhdGZvcm0uICBgcHl0aG9uYCBpcyBhbgogICAgICAgIG9wdGlvbmFsIHN0cmluZyBuYW1pbmcgdGhlIGRlc2lyZWQgdmVyc2lvbiBvZiBQeXRob24gKGUuZy4gYGAnMy4zJ2BgKTsKICAgICAgICBpdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB2ZXJzaW9uLgoKICAgICAgICBZb3UgbWF5IGV4cGxpY2l0bHkgc2V0IGBwbGF0Zm9ybWAgKGFuZC9vciBgcHl0aG9uYCkgdG8gYGBOb25lYGAgaWYgeW91CiAgICAgICAgd2lzaCB0byBtYXAgKmFsbCogZGlzdHJpYnV0aW9ucywgbm90IGp1c3QgdGhvc2UgY29tcGF0aWJsZSB3aXRoIHRoZQogICAgICAgIHJ1bm5pbmcgcGxhdGZvcm0gb3IgUHl0aG9uIHZlcnNpb24uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fZGlzdG1hcCA9IHt9CiAgICAgICAgc2VsZi5wbGF0Zm9ybSA9IHBsYXRmb3JtCiAgICAgICAgc2VsZi5weXRob24gPSBweXRob24KICAgICAgICBzZWxmLnNjYW4oc2VhcmNoX3BhdGgpCgogICAgZGVmIGNhbl9hZGQoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiSXMgZGlzdHJpYnV0aW9uIGBkaXN0YCBhY2NlcHRhYmxlIGZvciB0aGlzIGVudmlyb25tZW50PwoKICAgICAgICBUaGUgZGlzdHJpYnV0aW9uIG11c3QgbWF0Y2ggdGhlIHBsYXRmb3JtIGFuZCBweXRob24gdmVyc2lvbgogICAgICAgIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgd2hlbiB0aGlzIGVudmlyb25tZW50IHdhcyBjcmVhdGVkLCBvciBGYWxzZQogICAgICAgIGlzIHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoc2VsZi5weXRob24gaXMgTm9uZSBvciBkaXN0LnB5X3ZlcnNpb24gaXMgTm9uZQogICAgICAgICAgICBvciBkaXN0LnB5X3ZlcnNpb24gPT0gc2VsZi5weXRob24pIFwKICAgICAgICAgICAgYW5kIGNvbXBhdGlibGVfcGxhdGZvcm1zKGRpc3QucGxhdGZvcm0sIHNlbGYucGxhdGZvcm0pCgogICAgZGVmIHJlbW92ZShzZWxmLCBkaXN0KToKICAgICAgICAiIiJSZW1vdmUgYGRpc3RgIGZyb20gdGhlIGVudmlyb25tZW50IiIiCiAgICAgICAgc2VsZi5fZGlzdG1hcFtkaXN0LmtleV0ucmVtb3ZlKGRpc3QpCgogICAgZGVmIHNjYW4oc2VsZiwgc2VhcmNoX3BhdGg9Tm9uZSk6CiAgICAgICAgIiIiU2NhbiBgc2VhcmNoX3BhdGhgIGZvciBkaXN0cmlidXRpb25zIHVzYWJsZSBpbiB0aGlzIGVudmlyb25tZW50CgogICAgICAgIEFueSBkaXN0cmlidXRpb25zIGZvdW5kIGFyZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQuCiAgICAgICAgYHNlYXJjaF9wYXRoYCBzaG91bGQgYmUgYSBzZXF1ZW5jZSBvZiBgYHN5cy5wYXRoYGAgaXRlbXMuICBJZiBub3QKICAgICAgICBzdXBwbGllZCwgYGBzeXMucGF0aGBgIGlzIHVzZWQuICBPbmx5IGRpc3RyaWJ1dGlvbnMgY29uZm9ybWluZyB0bwogICAgICAgIHRoZSBwbGF0Zm9ybS9weXRob24gdmVyc2lvbiBkZWZpbmVkIGF0IGluaXRpYWxpemF0aW9uIGFyZSBhZGRlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWFyY2hfcGF0aCBpcyBOb25lOgogICAgICAgICAgICBzZWFyY2hfcGF0aCA9IHN5cy5wYXRoCgogICAgICAgIGZvciBpdGVtIGluIHNlYXJjaF9wYXRoOgogICAgICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RyaWJ1dGlvbnMoaXRlbSk6CiAgICAgICAgICAgICAgICBzZWxmLmFkZChkaXN0KQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBwcm9qZWN0X25hbWUpOgogICAgICAgICIiIlJldHVybiBhIG5ld2VzdC10by1vbGRlc3QgbGlzdCBvZiBkaXN0cmlidXRpb25zIGZvciBgcHJvamVjdF9uYW1lYAoKICAgICAgICBVc2VzIGNhc2UtaW5zZW5zaXRpdmUgYHByb2plY3RfbmFtZWAgY29tcGFyaXNvbiwgYXNzdW1pbmcgYWxsIHRoZQogICAgICAgIHByb2plY3QncyBkaXN0cmlidXRpb25zIHVzZSB0aGVpciBwcm9qZWN0J3MgbmFtZSBjb252ZXJ0ZWQgdG8gYWxsCiAgICAgICAgbG93ZXJjYXNlIGFzIHRoZWlyIGtleS4KCiAgICAgICAgIiIiCiAgICAgICAgZGlzdHJpYnV0aW9uX2tleSA9IHByb2plY3RfbmFtZS5sb3dlcigpCiAgICAgICAgcmV0dXJuIHNlbGYuX2Rpc3RtYXAuZ2V0KGRpc3RyaWJ1dGlvbl9rZXksIFtdKQoKICAgIGRlZiBhZGQoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiQWRkIGBkaXN0YCBpZiB3ZSBgYGNhbl9hZGQoKWBgIGl0IGFuZCBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhZGRlZAogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2FuX2FkZChkaXN0KSBhbmQgZGlzdC5oYXNfdmVyc2lvbigpOgogICAgICAgICAgICBkaXN0cyA9IHNlbGYuX2Rpc3RtYXAuc2V0ZGVmYXVsdChkaXN0LmtleSwgW10pCiAgICAgICAgICAgIGlmIGRpc3Qgbm90IGluIGRpc3RzOgogICAgICAgICAgICAgICAgZGlzdHMuYXBwZW5kKGRpc3QpCiAgICAgICAgICAgICAgICBkaXN0cy5zb3J0KGtleT1vcGVyYXRvci5hdHRyZ2V0dGVyKCdoYXNoY21wJyksIHJldmVyc2U9VHJ1ZSkKCiAgICBkZWYgYmVzdF9tYXRjaCgKICAgICAgICAgICAgc2VsZiwgcmVxLCB3b3JraW5nX3NldCwgaW5zdGFsbGVyPU5vbmUsIHJlcGxhY2VfY29uZmxpY3Rpbmc9RmFsc2UpOgogICAgICAgICIiIkZpbmQgZGlzdHJpYnV0aW9uIGJlc3QgbWF0Y2hpbmcgYHJlcWAgYW5kIHVzYWJsZSBvbiBgd29ya2luZ19zZXRgCgogICAgICAgIFRoaXMgY2FsbHMgdGhlIGBgZmluZChyZXEpYGAgbWV0aG9kIG9mIHRoZSBgd29ya2luZ19zZXRgIHRvIHNlZSBpZiBhCiAgICAgICAgc3VpdGFibGUgZGlzdHJpYnV0aW9uIGlzIGFscmVhZHkgYWN0aXZlLiAgKFRoaXMgbWF5IHJhaXNlCiAgICAgICAgYGBWZXJzaW9uQ29uZmxpY3RgYCBpZiBhbiB1bnN1aXRhYmxlIHZlcnNpb24gb2YgdGhlIHByb2plY3QgaXMgYWxyZWFkeQogICAgICAgIGFjdGl2ZSBpbiB0aGUgc3BlY2lmaWVkIGB3b3JraW5nX3NldGAuKSAgSWYgYSBzdWl0YWJsZSBkaXN0cmlidXRpb24KICAgICAgICBpc24ndCBhY3RpdmUsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5ld2VzdCBkaXN0cmlidXRpb24gaW4gdGhlCiAgICAgICAgZW52aXJvbm1lbnQgdGhhdCBtZWV0cyB0aGUgYGBSZXF1aXJlbWVudGBgIGluIGByZXFgLiAgSWYgbm8gc3VpdGFibGUKICAgICAgICBkaXN0cmlidXRpb24gaXMgZm91bmQsIGFuZCBgaW5zdGFsbGVyYCBpcyBzdXBwbGllZCwgdGhlbiB0aGUgcmVzdWx0IG9mCiAgICAgICAgY2FsbGluZyB0aGUgZW52aXJvbm1lbnQncyBgYG9idGFpbihyZXEsIGluc3RhbGxlcilgYCBtZXRob2Qgd2lsbCBiZQogICAgICAgIHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgZGlzdCA9IHdvcmtpbmdfc2V0LmZpbmQocmVxKQogICAgICAgIGV4Y2VwdCBWZXJzaW9uQ29uZmxpY3Q6CiAgICAgICAgICAgIGlmIG5vdCByZXBsYWNlX2NvbmZsaWN0aW5nOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZGlzdCA9IE5vbmUKICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gZGlzdAogICAgICAgIGZvciBkaXN0IGluIHNlbGZbcmVxLmtleV06CiAgICAgICAgICAgIGlmIGRpc3QgaW4gcmVxOgogICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKICAgICAgICAjIHRyeSB0byBkb3dubG9hZC9pbnN0YWxsCiAgICAgICAgcmV0dXJuIHNlbGYub2J0YWluKHJlcSwgaW5zdGFsbGVyKQoKICAgIGRlZiBvYnRhaW4oc2VsZiwgcmVxdWlyZW1lbnQsIGluc3RhbGxlcj1Ob25lKToKICAgICAgICAiIiJPYnRhaW4gYSBkaXN0cmlidXRpb24gbWF0Y2hpbmcgYHJlcXVpcmVtZW50YCAoZS5nLiB2aWEgZG93bmxvYWQpCgogICAgICAgIE9idGFpbiBhIGRpc3RybyB0aGF0IG1hdGNoZXMgcmVxdWlyZW1lbnQgKGUuZy4gdmlhIGRvd25sb2FkKS4gIEluIHRoZQogICAgICAgIGJhc2UgYGBFbnZpcm9ubWVudGBgIGNsYXNzLCB0aGlzIHJvdXRpbmUganVzdCByZXR1cm5zCiAgICAgICAgYGBpbnN0YWxsZXIocmVxdWlyZW1lbnQpYGAsIHVubGVzcyBgaW5zdGFsbGVyYCBpcyBOb25lLCBpbiB3aGljaCBjYXNlCiAgICAgICAgTm9uZSBpcyByZXR1cm5lZCBpbnN0ZWFkLiAgVGhpcyBtZXRob2QgaXMgYSBob29rIHRoYXQgYWxsb3dzIHN1YmNsYXNzZXMKICAgICAgICB0byBhdHRlbXB0IG90aGVyIHdheXMgb2Ygb2J0YWluaW5nIGEgZGlzdHJpYnV0aW9uIGJlZm9yZSBmYWxsaW5nIGJhY2sKICAgICAgICB0byB0aGUgYGluc3RhbGxlcmAgYXJndW1lbnQuIiIiCiAgICAgICAgaWYgaW5zdGFsbGVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gaW5zdGFsbGVyKHJlcXVpcmVtZW50KQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiJZaWVsZCB0aGUgdW5pcXVlIHByb2plY3QgbmFtZXMgb2YgdGhlIGF2YWlsYWJsZSBkaXN0cmlidXRpb25zIiIiCiAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9kaXN0bWFwLmtleXMoKToKICAgICAgICAgICAgaWYgc2VsZltrZXldOgogICAgICAgICAgICAgICAgeWllbGQga2V5CgogICAgZGVmIF9faWFkZF9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiJJbi1wbGFjZSBhZGRpdGlvbiBvZiBhIGRpc3RyaWJ1dGlvbiBvciBlbnZpcm9ubWVudCIiIgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIERpc3RyaWJ1dGlvbik6CiAgICAgICAgICAgIHNlbGYuYWRkKG90aGVyKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgRW52aXJvbm1lbnQpOgogICAgICAgICAgICBmb3IgcHJvamVjdCBpbiBvdGhlcjoKICAgICAgICAgICAgICAgIGZvciBkaXN0IGluIG90aGVyW3Byb2plY3RdOgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW4ndCBhZGQgJXIgdG8gZW52aXJvbm1lbnQiICUgKG90aGVyLCkpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiQWRkIGFuIGVudmlyb25tZW50IG9yIGRpc3RyaWJ1dGlvbiB0byBhbiBlbnZpcm9ubWVudCIiIgogICAgICAgIG5ldyA9IHNlbGYuX19jbGFzc19fKFtdLCBwbGF0Zm9ybT1Ob25lLCBweXRob249Tm9uZSkKICAgICAgICBmb3IgZW52IGluIHNlbGYsIG90aGVyOgogICAgICAgICAgICBuZXcgKz0gZW52CiAgICAgICAgcmV0dXJuIG5ldwoKCiMgWFhYIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKQXZhaWxhYmxlRGlzdHJpYnV0aW9ucyA9IEVudmlyb25tZW50CgoKY2xhc3MgRXh0cmFjdGlvbkVycm9yKFJ1bnRpbWVFcnJvcik6CiAgICAiIiJBbiBlcnJvciBvY2N1cnJlZCBleHRyYWN0aW5nIGEgcmVzb3VyY2UKCiAgICBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGF2YWlsYWJsZSBmcm9tIGluc3RhbmNlcyBvZiB0aGlzIGV4Y2VwdGlvbjoKCiAgICBtYW5hZ2VyCiAgICAgICAgVGhlIHJlc291cmNlIG1hbmFnZXIgdGhhdCByYWlzZWQgdGhpcyBleGNlcHRpb24KCiAgICBjYWNoZV9wYXRoCiAgICAgICAgVGhlIGJhc2UgZGlyZWN0b3J5IGZvciByZXNvdXJjZSBleHRyYWN0aW9uCgogICAgb3JpZ2luYWxfZXJyb3IKICAgICAgICBUaGUgZXhjZXB0aW9uIGluc3RhbmNlIHRoYXQgY2F1c2VkIGV4dHJhY3Rpb24gdG8gZmFpbAogICAgIiIiCgoKY2xhc3MgUmVzb3VyY2VNYW5hZ2VyOgogICAgIiIiTWFuYWdlIHJlc291cmNlIGV4dHJhY3Rpb24gYW5kIHBhY2thZ2VzIiIiCiAgICBleHRyYWN0aW9uX3BhdGggPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuY2FjaGVkX2ZpbGVzID0ge30KCiAgICBkZWYgcmVzb3VyY2VfZXhpc3RzKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIkRvZXMgdGhlIG5hbWVkIHJlc291cmNlIGV4aXN0PyIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuaGFzX3Jlc291cmNlKHJlc291cmNlX25hbWUpCgogICAgZGVmIHJlc291cmNlX2lzZGlyKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIklzIHRoZSBuYW1lZCByZXNvdXJjZSBhbiBleGlzdGluZyBkaXJlY3Rvcnk/IiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5yZXNvdXJjZV9pc2RpcigKICAgICAgICAgICAgcmVzb3VyY2VfbmFtZQogICAgICAgICkKCiAgICBkZWYgcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgdHJ1ZSBmaWxlc3lzdGVtIHBhdGggZm9yIHNwZWNpZmllZCByZXNvdXJjZSIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKAogICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9zdHJlYW0oc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgcmVhZGFibGUgZmlsZS1saWtlIG9iamVjdCBmb3Igc3BlY2lmaWVkIHJlc291cmNlIiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5nZXRfcmVzb3VyY2Vfc3RyZWFtKAogICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiByZXNvdXJjZV9zdHJpbmcoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIHNwZWNpZmllZCByZXNvdXJjZSBhcyBhIHN0cmluZyIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuZ2V0X3Jlc291cmNlX3N0cmluZygKICAgICAgICAgICAgc2VsZiwgcmVzb3VyY2VfbmFtZQogICAgICAgICkKCiAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJMaXN0IHRoZSBjb250ZW50cyBvZiB0aGUgbmFtZWQgcmVzb3VyY2UgZGlyZWN0b3J5IiIiCiAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5yZXNvdXJjZV9saXN0ZGlyKAogICAgICAgICAgICByZXNvdXJjZV9uYW1lCiAgICAgICAgKQoKICAgIGRlZiBleHRyYWN0aW9uX2Vycm9yKHNlbGYpOgogICAgICAgICIiIkdpdmUgYW4gZXJyb3IgbWVzc2FnZSBmb3IgcHJvYmxlbXMgZXh0cmFjdGluZyBmaWxlKHMpIiIiCgogICAgICAgIG9sZF9leGMgPSBzeXMuZXhjX2luZm8oKVsxXQogICAgICAgIGNhY2hlX3BhdGggPSBzZWxmLmV4dHJhY3Rpb25fcGF0aCBvciBnZXRfZGVmYXVsdF9jYWNoZSgpCgogICAgICAgIHRtcGwgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgICAgIENhbid0IGV4dHJhY3QgZmlsZShzKSB0byBlZ2cgY2FjaGUKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGV4dHJhY3QgZmlsZShzKQogICAgICAgICAgICB0byB0aGUgUHl0aG9uIGVnZyBjYWNoZToKCiAgICAgICAgICAgICAge29sZF9leGN9CgogICAgICAgICAgICBUaGUgUHl0aG9uIGVnZyBjYWNoZSBkaXJlY3RvcnkgaXMgY3VycmVudGx5IHNldCB0bzoKCiAgICAgICAgICAgICAge2NhY2hlX3BhdGh9CgogICAgICAgICAgICBQZXJoYXBzIHlvdXIgYWNjb3VudCBkb2VzIG5vdCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGRpcmVjdG9yeT8KICAgICAgICAgICAgWW91IGNhbiBjaGFuZ2UgdGhlIGNhY2hlIGRpcmVjdG9yeSBieSBzZXR0aW5nIHRoZSBQWVRIT05fRUdHX0NBQ0hFCiAgICAgICAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHBvaW50IHRvIGFuIGFjY2Vzc2libGUgZGlyZWN0b3J5LgogICAgICAgICAgICAiIiIpLmxzdHJpcCgpCiAgICAgICAgZXJyID0gRXh0cmFjdGlvbkVycm9yKHRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpKQogICAgICAgIGVyci5tYW5hZ2VyID0gc2VsZgogICAgICAgIGVyci5jYWNoZV9wYXRoID0gY2FjaGVfcGF0aAogICAgICAgIGVyci5vcmlnaW5hbF9lcnJvciA9IG9sZF9leGMKICAgICAgICByYWlzZSBlcnIKCiAgICBkZWYgZ2V0X2NhY2hlX3BhdGgoc2VsZiwgYXJjaGl2ZV9uYW1lLCBuYW1lcz0oKSk6CiAgICAgICAgIiIiUmV0dXJuIGFic29sdXRlIGxvY2F0aW9uIGluIGNhY2hlIGZvciBgYXJjaGl2ZV9uYW1lYCBhbmQgYG5hbWVzYAoKICAgICAgICBUaGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgcmVzdWx0aW5nIHBhdGggd2lsbCBiZSBjcmVhdGVkIGlmIGl0IGRvZXMKICAgICAgICBub3QgYWxyZWFkeSBleGlzdC4gIGBhcmNoaXZlX25hbWVgIHNob3VsZCBiZSB0aGUgYmFzZSBmaWxlbmFtZSBvZiB0aGUKICAgICAgICBlbmNsb3NpbmcgZWdnICh3aGljaCBtYXkgbm90IGJlIHRoZSBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgemlwZmlsZSEpLAogICAgICAgIGluY2x1ZGluZyBpdHMgIi5lZ2ciIGV4dGVuc2lvbi4gIGBuYW1lc2AsIGlmIHByb3ZpZGVkLCBzaG91bGQgYmUgYQogICAgICAgIHNlcXVlbmNlIG9mIHBhdGggbmFtZSBwYXJ0cyAidW5kZXIiIHRoZSBlZ2cncyBleHRyYWN0aW9uIGxvY2F0aW9uLgoKICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgcmVzb3VyY2UgcHJvdmlkZXJzIHRoYXQgbmVlZCB0bwogICAgICAgIG9idGFpbiBhbiBleHRyYWN0aW9uIGxvY2F0aW9uLCBhbmQgb25seSBmb3IgbmFtZXMgdGhleSBpbnRlbmQgdG8KICAgICAgICBleHRyYWN0LCBhcyBpdCB0cmFja3MgdGhlIGdlbmVyYXRlZCBuYW1lcyBmb3IgcG9zc2libGUgY2xlYW51cCBsYXRlci4KICAgICAgICAiIiIKICAgICAgICBleHRyYWN0X3BhdGggPSBzZWxmLmV4dHJhY3Rpb25fcGF0aCBvciBnZXRfZGVmYXVsdF9jYWNoZSgpCiAgICAgICAgdGFyZ2V0X3BhdGggPSBvcy5wYXRoLmpvaW4oZXh0cmFjdF9wYXRoLCBhcmNoaXZlX25hbWUgKyAnLXRtcCcsICpuYW1lcykKICAgICAgICB0cnk6CiAgICAgICAgICAgIF9ieXBhc3NfZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXRfcGF0aCkKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHNlbGYuZXh0cmFjdGlvbl9lcnJvcigpCgogICAgICAgIHNlbGYuX3dhcm5fdW5zYWZlX2V4dHJhY3Rpb25fcGF0aChleHRyYWN0X3BhdGgpCgogICAgICAgIHNlbGYuY2FjaGVkX2ZpbGVzW3RhcmdldF9wYXRoXSA9IDEKICAgICAgICByZXR1cm4gdGFyZ2V0X3BhdGgKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3dhcm5fdW5zYWZlX2V4dHJhY3Rpb25fcGF0aChwYXRoKToKICAgICAgICAiIiIKICAgICAgICBJZiB0aGUgZGVmYXVsdCBleHRyYWN0aW9uIHBhdGggaXMgb3ZlcnJpZGRlbiBhbmQgc2V0IHRvIGFuIGluc2VjdXJlCiAgICAgICAgbG9jYXRpb24sIHN1Y2ggYXMgL3RtcCwgaXQgb3BlbnMgdXAgYW4gb3Bwb3J0dW5pdHkgZm9yIGFuIGF0dGFja2VyIHRvCiAgICAgICAgcmVwbGFjZSBhbiBleHRyYWN0ZWQgZmlsZSB3aXRoIGFuIHVuYXV0aG9yaXplZCBwYXlsb2FkLiBXYXJuIHRoZSB1c2VyCiAgICAgICAgaWYgYSBrbm93biBpbnNlY3VyZSBsb2NhdGlvbiBpcyB1c2VkLgoKICAgICAgICBTZWUgRGlzdHJpYnV0ZSAjMzc1IGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnIGFuZCBub3QgcGF0aC5zdGFydHN3aXRoKG9zLmVudmlyb25bJ3dpbmRpciddKToKICAgICAgICAgICAgIyBPbiBXaW5kb3dzLCBwZXJtaXNzaW9ucyBhcmUgZ2VuZXJhbGx5IHJlc3RyaWN0aXZlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgIyAgYW5kIHRlbXAgZGlyZWN0b3JpZXMgYXJlIG5vdCB3cml0YWJsZSBieSBvdGhlciB1c2Vycywgc28KICAgICAgICAgICAgIyAgYnlwYXNzIHRoZSB3YXJuaW5nLgogICAgICAgICAgICByZXR1cm4KICAgICAgICBtb2RlID0gb3Muc3RhdChwYXRoKS5zdF9tb2RlCiAgICAgICAgaWYgbW9kZSAmIHN0YXQuU19JV09USCBvciBtb2RlICYgc3RhdC5TX0lXR1JQOgogICAgICAgICAgICBtc2cgPSAoCiAgICAgICAgICAgICAgICAiJXMgaXMgd3JpdGFibGUgYnkgZ3JvdXAvb3RoZXJzIGFuZCB2dWxuZXJhYmxlIHRvIGF0dGFjayAiCiAgICAgICAgICAgICAgICAid2hlbiAiCiAgICAgICAgICAgICAgICAidXNlZCB3aXRoIGdldF9yZXNvdXJjZV9maWxlbmFtZS4gQ29uc2lkZXIgYSBtb3JlIHNlY3VyZSAiCiAgICAgICAgICAgICAgICAibG9jYXRpb24gKHNldCB3aXRoIC5zZXRfZXh0cmFjdGlvbl9wYXRoIG9yIHRoZSAiCiAgICAgICAgICAgICAgICAiUFlUSE9OX0VHR19DQUNIRSBlbnZpcm9ubWVudCB2YXJpYWJsZSkuIiAlIHBhdGgKICAgICAgICAgICAgKQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZywgVXNlcldhcm5pbmcpCgogICAgZGVmIHBvc3Rwcm9jZXNzKHNlbGYsIHRlbXBuYW1lLCBmaWxlbmFtZSk6CiAgICAgICAgIiIiUGVyZm9ybSBhbnkgcGxhdGZvcm0tc3BlY2lmaWMgcG9zdHByb2Nlc3Npbmcgb2YgYHRlbXBuYW1lYAoKICAgICAgICBUaGlzIGlzIHdoZXJlIE1hYyBoZWFkZXIgcmV3cml0ZXMgc2hvdWxkIGJlIGRvbmU7IG90aGVyIHBsYXRmb3JtcyBkb24ndAogICAgICAgIGhhdmUgYW55dGhpbmcgc3BlY2lhbCB0aGV5IHNob3VsZCBkby4KCiAgICAgICAgUmVzb3VyY2UgcHJvdmlkZXJzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIE9OTFkgYWZ0ZXIgc3VjY2Vzc2Z1bGx5CiAgICAgICAgZXh0cmFjdGluZyBhIGNvbXByZXNzZWQgcmVzb3VyY2UuICBUaGV5IG11c3QgTk9UIGNhbGwgaXQgb24gcmVzb3VyY2VzCiAgICAgICAgdGhhdCBhcmUgYWxyZWFkeSBpbiB0aGUgZmlsZXN5c3RlbS4KCiAgICAgICAgYHRlbXBuYW1lYCBpcyB0aGUgY3VycmVudCAodGVtcG9yYXJ5KSBuYW1lIG9mIHRoZSBmaWxlLCBhbmQgYGZpbGVuYW1lYAogICAgICAgIGlzIHRoZSBuYW1lIGl0IHdpbGwgYmUgcmVuYW1lZCB0byBieSB0aGUgY2FsbGVyIGFmdGVyIHRoaXMgcm91dGluZQogICAgICAgIHJldHVybnMuCiAgICAgICAgIiIiCgogICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKICAgICAgICAgICAgIyBNYWtlIHRoZSByZXNvdXJjZSBleGVjdXRhYmxlCiAgICAgICAgICAgIG1vZGUgPSAoKG9zLnN0YXQodGVtcG5hbWUpLnN0X21vZGUpIHwgMG81NTUpICYgMG83Nzc3CiAgICAgICAgICAgIG9zLmNobW9kKHRlbXBuYW1lLCBtb2RlKQoKICAgIGRlZiBzZXRfZXh0cmFjdGlvbl9wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgICIiIlNldCB0aGUgYmFzZSBwYXRoIHdoZXJlIHJlc291cmNlcyB3aWxsIGJlIGV4dHJhY3RlZCB0bywgaWYgbmVlZGVkLgoKICAgICAgICBJZiB5b3UgZG8gbm90IGNhbGwgdGhpcyByb3V0aW5lIGJlZm9yZSBhbnkgZXh0cmFjdGlvbnMgdGFrZSBwbGFjZSwgdGhlCiAgICAgICAgcGF0aCBkZWZhdWx0cyB0byB0aGUgcmV0dXJuIHZhbHVlIG9mIGBgZ2V0X2RlZmF1bHRfY2FjaGUoKWBgLiAgKFdoaWNoCiAgICAgICAgaXMgYmFzZWQgb24gdGhlIGBgUFlUSE9OX0VHR19DQUNIRWBgIGVudmlyb25tZW50IHZhcmlhYmxlLCB3aXRoIHZhcmlvdXMKICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBmYWxsYmFja3MuICBTZWUgdGhhdCByb3V0aW5lJ3MgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZQogICAgICAgIGRldGFpbHMuKQoKICAgICAgICBSZXNvdXJjZXMgYXJlIGV4dHJhY3RlZCB0byBzdWJkaXJlY3RvcmllcyBvZiB0aGlzIHBhdGggYmFzZWQgdXBvbgogICAgICAgIGluZm9ybWF0aW9uIGdpdmVuIGJ5IHRoZSBgYElSZXNvdXJjZVByb3ZpZGVyYGAuICBZb3UgbWF5IHNldCB0aGlzIHRvIGEKICAgICAgICB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBidXQgdGhlbiB5b3UgbXVzdCBjYWxsIGBgY2xlYW51cF9yZXNvdXJjZXMoKWBgIHRvCiAgICAgICAgZGVsZXRlIHRoZSBleHRyYWN0ZWQgZmlsZXMgd2hlbiBkb25lLiAgVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQKICAgICAgICBgYGNsZWFudXBfcmVzb3VyY2VzKClgYCB3aWxsIGJlIGFibGUgdG8gcmVtb3ZlIGFsbCBleHRyYWN0ZWQgZmlsZXMuCgogICAgICAgIChOb3RlOiB5b3UgbWF5IG5vdCBjaGFuZ2UgdGhlIGV4dHJhY3Rpb24gcGF0aCBmb3IgYSBnaXZlbiByZXNvdXJjZQogICAgICAgIG1hbmFnZXIgb25jZSByZXNvdXJjZXMgaGF2ZSBiZWVuIGV4dHJhY3RlZCwgdW5sZXNzIHlvdSBmaXJzdCBjYWxsCiAgICAgICAgYGBjbGVhbnVwX3Jlc291cmNlcygpYGAuKQogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2FjaGVkX2ZpbGVzOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IGNoYW5nZSBleHRyYWN0aW9uIHBhdGgsIGZpbGVzIGFscmVhZHkgZXh0cmFjdGVkIgogICAgICAgICAgICApCgogICAgICAgIHNlbGYuZXh0cmFjdGlvbl9wYXRoID0gcGF0aAoKICAgIGRlZiBjbGVhbnVwX3Jlc291cmNlcyhzZWxmLCBmb3JjZT1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgRGVsZXRlIGFsbCBleHRyYWN0ZWQgcmVzb3VyY2UgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLCByZXR1cm5pbmcgYSBsaXN0CiAgICAgICAgb2YgdGhlIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcyB0aGF0IGNvdWxkIG5vdCBiZSBzdWNjZXNzZnVsbHkgcmVtb3ZlZC4KICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYW55IGNvbmN1cnJlbmN5IHByb3RlY3Rpb24sIHNvIGl0IHNob3VsZAogICAgICAgIGdlbmVyYWxseSBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBleHRyYWN0aW9uIHBhdGggaXMgYSB0ZW1wb3JhcnkKICAgICAgICBkaXJlY3RvcnkgZXhjbHVzaXZlIHRvIGEgc2luZ2xlIHByb2Nlc3MuICBUaGlzIG1ldGhvZCBpcyBub3QKICAgICAgICBhdXRvbWF0aWNhbGx5IGNhbGxlZDsgeW91IG11c3QgY2FsbCBpdCBleHBsaWNpdGx5IG9yIHJlZ2lzdGVyIGl0IGFzIGFuCiAgICAgICAgYGBhdGV4aXRgYCBmdW5jdGlvbiBpZiB5b3Ugd2lzaCB0byBlbnN1cmUgY2xlYW51cCBvZiBhIHRlbXBvcmFyeQogICAgICAgIGRpcmVjdG9yeSB1c2VkIGZvciBleHRyYWN0aW9ucy4KICAgICAgICAiIiIKICAgICAgICAjIFhYWAoKCmRlZiBnZXRfZGVmYXVsdF9jYWNoZSgpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIGBgUFlUSE9OX0VHR19DQUNIRWBgIGVudmlyb25tZW50IHZhcmlhYmxlCiAgICBvciBhIHBsYXRmb3JtLXJlbGV2YW50IHVzZXIgY2FjaGUgZGlyIGZvciBhbiBhcHAKICAgIG5hbWVkICJQeXRob24tRWdncyIuCiAgICAiIiIKICAgIHJldHVybiAoCiAgICAgICAgb3MuZW52aXJvbi5nZXQoJ1BZVEhPTl9FR0dfQ0FDSEUnKQogICAgICAgIG9yIGFwcGRpcnMudXNlcl9jYWNoZV9kaXIoYXBwbmFtZT0nUHl0aG9uLUVnZ3MnKQogICAgKQoKCmRlZiBzYWZlX25hbWUobmFtZSk6CiAgICAiIiJDb252ZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgdG8gYSBzdGFuZGFyZCBkaXN0cmlidXRpb24gbmFtZQoKICAgIEFueSBydW5zIG9mIG5vbi1hbHBoYW51bWVyaWMvLiBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlICctJy4KICAgICIiIgogICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuXSsnLCAnLScsIG5hbWUpCgoKZGVmIHNhZmVfdmVyc2lvbih2ZXJzaW9uKToKICAgICIiIgogICAgQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgdmVyc2lvbiBzdHJpbmcKICAgICIiIgogICAgdHJ5OgogICAgICAgICMgbm9ybWFsaXplIHRoZSB2ZXJzaW9uCiAgICAgICAgcmV0dXJuIHN0cihwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uKHZlcnNpb24pKQogICAgZXhjZXB0IHBhY2thZ2luZy52ZXJzaW9uLkludmFsaWRWZXJzaW9uOgogICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uLnJlcGxhY2UoJyAnLCAnLicpCiAgICAgICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuXSsnLCAnLScsIHZlcnNpb24pCgoKZGVmIHNhZmVfZXh0cmEoZXh0cmEpOgogICAgIiIiQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgJ2V4dHJhJyBuYW1lCgogICAgQW55IHJ1bnMgb2Ygbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlICdfJywKICAgIGFuZCB0aGUgcmVzdWx0IGlzIGFsd2F5cyBsb3dlcmNhc2VkLgogICAgIiIiCiAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS4tXSsnLCAnXycsIGV4dHJhKS5sb3dlcigpCgoKZGVmIHRvX2ZpbGVuYW1lKG5hbWUpOgogICAgIiIiQ29udmVydCBhIHByb2plY3Qgb3IgdmVyc2lvbiBuYW1lIHRvIGl0cyBmaWxlbmFtZS1lc2NhcGVkIGZvcm0KCiAgICBBbnkgJy0nIGNoYXJhY3RlcnMgYXJlIGN1cnJlbnRseSByZXBsYWNlZCB3aXRoICdfJy4KICAgICIiIgogICAgcmV0dXJuIG5hbWUucmVwbGFjZSgnLScsICdfJykKCgpkZWYgaW52YWxpZF9tYXJrZXIodGV4dCk6CiAgICAiIiIKICAgIFZhbGlkYXRlIHRleHQgYXMgYSBQRVAgNTA4IGVudmlyb25tZW50IG1hcmtlcjsgcmV0dXJuIGFuIGV4Y2VwdGlvbgogICAgaWYgaW52YWxpZCBvciBGYWxzZSBvdGhlcndpc2UuCiAgICAiIiIKICAgIHRyeToKICAgICAgICBldmFsdWF0ZV9tYXJrZXIodGV4dCkKICAgIGV4Y2VwdCBTeW50YXhFcnJvciBhcyBlOgogICAgICAgIGUuZmlsZW5hbWUgPSBOb25lCiAgICAgICAgZS5saW5lbm8gPSBOb25lCiAgICAgICAgcmV0dXJuIGUKICAgIHJldHVybiBGYWxzZQoKCmRlZiBldmFsdWF0ZV9tYXJrZXIodGV4dCwgZXh0cmE9Tm9uZSk6CiAgICAiIiIKICAgIEV2YWx1YXRlIGEgUEVQIDUwOCBlbnZpcm9ubWVudCBtYXJrZXIuCiAgICBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgdGhlIG1hcmtlciByZXN1bHQgaW4gdGhpcyBlbnZpcm9ubWVudC4KICAgIFJhaXNlIFN5bnRheEVycm9yIGlmIG1hcmtlciBpcyBpbnZhbGlkLgoKICAgIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgJ3B5cGFyc2luZycgbW9kdWxlLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgbWFya2VyID0gcGFja2FnaW5nLm1hcmtlcnMuTWFya2VyKHRleHQpCiAgICAgICAgcmV0dXJuIG1hcmtlci5ldmFsdWF0ZSgpCiAgICBleGNlcHQgcGFja2FnaW5nLm1hcmtlcnMuSW52YWxpZE1hcmtlciBhcyBlOgogICAgICAgIHJhaXNlIFN5bnRheEVycm9yKGUpCgoKY2xhc3MgTnVsbFByb3ZpZGVyOgogICAgIiIiVHJ5IHRvIGltcGxlbWVudCByZXNvdXJjZXMgYW5kIG1ldGFkYXRhIGZvciBhcmJpdHJhcnkgUEVQIDMwMiBsb2FkZXJzIiIiCgogICAgZWdnX25hbWUgPSBOb25lCiAgICBlZ2dfaW5mbyA9IE5vbmUKICAgIGxvYWRlciA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKICAgICAgICBzZWxmLmxvYWRlciA9IGdldGF0dHIobW9kdWxlLCAnX19sb2FkZXJfXycsIE5vbmUpCiAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IG9zLnBhdGguZGlybmFtZShnZXRhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJywgJycpKQoKICAgIGRlZiBnZXRfcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJlYW0oc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIGlvLkJ5dGVzSU8oc2VsZi5nZXRfcmVzb3VyY2Vfc3RyaW5nKG1hbmFnZXIsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyaW5nKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9nZXQoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIGhhc19yZXNvdXJjZShzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5faGFzKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBoYXNfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2luZm8gYW5kIHNlbGYuX2hhcyhzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBuYW1lKSkKCiAgICBkZWYgZ2V0X21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIG5vdCBzZWxmLmVnZ19pbmZvOgogICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICB2YWx1ZSA9IHNlbGYuX2dldChzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBuYW1lKSkKICAgICAgICByZXR1cm4gdmFsdWUuZGVjb2RlKCd1dGYtOCcpIGlmIHNpeC5QWTMgZWxzZSB2YWx1ZQoKICAgIGRlZiBnZXRfbWV0YWRhdGFfbGluZXMoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHlpZWxkX2xpbmVzKHNlbGYuZ2V0X21ldGFkYXRhKG5hbWUpKQoKICAgIGRlZiByZXNvdXJjZV9pc2RpcihzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5faXNkaXIoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIG1ldGFkYXRhX2lzZGlyKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLmVnZ19pbmZvIGFuZCBzZWxmLl9pc2RpcihzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBuYW1lKSkKCiAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5fbGlzdGRpcihzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgbWV0YWRhdGFfbGlzdGRpcihzZWxmLCBuYW1lKToKICAgICAgICBpZiBzZWxmLmVnZ19pbmZvOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fbGlzdGRpcihzZWxmLl9mbihzZWxmLmVnZ19pbmZvLCBuYW1lKSkKICAgICAgICByZXR1cm4gW10KCiAgICBkZWYgcnVuX3NjcmlwdChzZWxmLCBzY3JpcHRfbmFtZSwgbmFtZXNwYWNlKToKICAgICAgICBzY3JpcHQgPSAnc2NyaXB0cy8nICsgc2NyaXB0X25hbWUKICAgICAgICBpZiBub3Qgc2VsZi5oYXNfbWV0YWRhdGEoc2NyaXB0KToKICAgICAgICAgICAgcmFpc2UgUmVzb2x1dGlvbkVycm9yKAogICAgICAgICAgICAgICAgIlNjcmlwdCB7c2NyaXB0IXJ9IG5vdCBmb3VuZCBpbiBtZXRhZGF0YSBhdCB7c2VsZi5lZ2dfaW5mbyFyfSIKICAgICAgICAgICAgICAgIC5mb3JtYXQoKipsb2NhbHMoKSksCiAgICAgICAgICAgICkKICAgICAgICBzY3JpcHRfdGV4dCA9IHNlbGYuZ2V0X21ldGFkYXRhKHNjcmlwdCkucmVwbGFjZSgnXHJcbicsICdcbicpCiAgICAgICAgc2NyaXB0X3RleHQgPSBzY3JpcHRfdGV4dC5yZXBsYWNlKCdccicsICdcbicpCiAgICAgICAgc2NyaXB0X2ZpbGVuYW1lID0gc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbywgc2NyaXB0KQogICAgICAgIG5hbWVzcGFjZVsnX19maWxlX18nXSA9IHNjcmlwdF9maWxlbmFtZQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNjcmlwdF9maWxlbmFtZSk6CiAgICAgICAgICAgIHNvdXJjZSA9IG9wZW4oc2NyaXB0X2ZpbGVuYW1lKS5yZWFkKCkKICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoc291cmNlLCBzY3JpcHRfZmlsZW5hbWUsICdleGVjJykKICAgICAgICAgICAgZXhlYyhjb2RlLCBuYW1lc3BhY2UsIG5hbWVzcGFjZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmcm9tIGxpbmVjYWNoZSBpbXBvcnQgY2FjaGUKICAgICAgICAgICAgY2FjaGVbc2NyaXB0X2ZpbGVuYW1lXSA9ICgKICAgICAgICAgICAgICAgIGxlbihzY3JpcHRfdGV4dCksIDAsIHNjcmlwdF90ZXh0LnNwbGl0KCdcbicpLCBzY3JpcHRfZmlsZW5hbWUKICAgICAgICAgICAgKQogICAgICAgICAgICBzY3JpcHRfY29kZSA9IGNvbXBpbGUoc2NyaXB0X3RleHQsIHNjcmlwdF9maWxlbmFtZSwgJ2V4ZWMnKQogICAgICAgICAgICBleGVjKHNjcmlwdF9jb2RlLCBuYW1lc3BhY2UsIG5hbWVzcGFjZSkKCiAgICBkZWYgX2hhcyhzZWxmLCBwYXRoKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgdW5yZWdpc3RlcmVkIGxvYWRlciB0eXBlIgogICAgICAgICkKCiAgICBkZWYgX2lzZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciB1bnJlZ2lzdGVyZWQgbG9hZGVyIHR5cGUiCiAgICAgICAgKQoKICAgIGRlZiBfbGlzdGRpcihzZWxmLCBwYXRoKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgdW5yZWdpc3RlcmVkIGxvYWRlciB0eXBlIgogICAgICAgICkKCiAgICBkZWYgX2ZuKHNlbGYsIGJhc2UsIHJlc291cmNlX25hbWUpOgogICAgICAgIGlmIHJlc291cmNlX25hbWU6CiAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oYmFzZSwgKnJlc291cmNlX25hbWUuc3BsaXQoJy8nKSkKICAgICAgICByZXR1cm4gYmFzZQoKICAgIGRlZiBfZ2V0KHNlbGYsIHBhdGgpOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZi5sb2FkZXIsICdnZXRfZGF0YScpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkZXIuZ2V0X2RhdGEocGF0aCkKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgbG9hZGVycyB3aXRob3V0ICdnZXRfZGF0YSgpJyIKICAgICAgICApCgoKcmVnaXN0ZXJfbG9hZGVyX3R5cGUob2JqZWN0LCBOdWxsUHJvdmlkZXIpCgoKY2xhc3MgRWdnUHJvdmlkZXIoTnVsbFByb3ZpZGVyKToKICAgICIiIlByb3ZpZGVyIGJhc2VkIG9uIGEgdmlydHVhbCBmaWxlc3lzdGVtIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgTnVsbFByb3ZpZGVyLl9faW5pdF9fKHNlbGYsIG1vZHVsZSkKICAgICAgICBzZWxmLl9zZXR1cF9wcmVmaXgoKQoKICAgIGRlZiBfc2V0dXBfcHJlZml4KHNlbGYpOgogICAgICAgICMgd2UgYXNzdW1lIGhlcmUgdGhhdCBvdXIgbWV0YWRhdGEgbWF5IGJlIG5lc3RlZCBpbnNpZGUgYSAiYmFza2V0IgogICAgICAgICMgb2YgbXVsdGlwbGUgZWdnczsgdGhhdCdzIHdoeSB3ZSB1c2UgbW9kdWxlX3BhdGggaW5zdGVhZCBvZiAuYXJjaGl2ZQogICAgICAgIHBhdGggPSBzZWxmLm1vZHVsZV9wYXRoCiAgICAgICAgb2xkID0gTm9uZQogICAgICAgIHdoaWxlIHBhdGggIT0gb2xkOgogICAgICAgICAgICBpZiBfaXNfZWdnX3BhdGgocGF0aCk6CiAgICAgICAgICAgICAgICBzZWxmLmVnZ19uYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQogICAgICAgICAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IG9zLnBhdGguam9pbihwYXRoLCAnRUdHLUlORk8nKQogICAgICAgICAgICAgICAgc2VsZi5lZ2dfcm9vdCA9IHBhdGgKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIG9sZCA9IHBhdGgKICAgICAgICAgICAgcGF0aCwgYmFzZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKCgpjbGFzcyBEZWZhdWx0UHJvdmlkZXIoRWdnUHJvdmlkZXIpOgogICAgIiIiUHJvdmlkZXMgYWNjZXNzIHRvIHBhY2thZ2UgcmVzb3VyY2VzIGluIHRoZSBmaWxlc3lzdGVtIiIiCgogICAgZGVmIF9oYXMoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKHBhdGgpCgogICAgZGVmIF9pc2RpcihzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MucGF0aC5pc2RpcihwYXRoKQoKICAgIGRlZiBfbGlzdGRpcihzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MubGlzdGRpcihwYXRoKQoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyZWFtKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBvcGVuKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpLCAncmInKQoKICAgIGRlZiBfZ2V0KHNlbGYsIHBhdGgpOgogICAgICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBzdHJlYW06CiAgICAgICAgICAgIHJldHVybiBzdHJlYW0ucmVhZCgpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3JlZ2lzdGVyKGNscyk6CiAgICAgICAgbG9hZGVyX2NscyA9IGdldGF0dHIoCiAgICAgICAgICAgIGltcG9ydGxpYl9tYWNoaW5lcnksCiAgICAgICAgICAgICdTb3VyY2VGaWxlTG9hZGVyJywKICAgICAgICAgICAgdHlwZShOb25lKSwKICAgICAgICApCiAgICAgICAgcmVnaXN0ZXJfbG9hZGVyX3R5cGUobG9hZGVyX2NscywgY2xzKQoKCkRlZmF1bHRQcm92aWRlci5fcmVnaXN0ZXIoKQoKCmNsYXNzIEVtcHR5UHJvdmlkZXIoTnVsbFByb3ZpZGVyKToKICAgICIiIlByb3ZpZGVyIHRoYXQgcmV0dXJucyBub3RoaW5nIGZvciBhbGwgcmVxdWVzdHMiIiIKCiAgICBfaXNkaXIgPSBfaGFzID0gbGFtYmRhIHNlbGYsIHBhdGg6IEZhbHNlCiAgICBfZ2V0ID0gbGFtYmRhIHNlbGYsIHBhdGg6ICcnCiAgICBfbGlzdGRpciA9IGxhbWJkYSBzZWxmLCBwYXRoOiBbXQogICAgbW9kdWxlX3BhdGggPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHBhc3MKCgplbXB0eV9wcm92aWRlciA9IEVtcHR5UHJvdmlkZXIoKQoKCmNsYXNzIFppcE1hbmlmZXN0cyhkaWN0KToKICAgICIiIgogICAgemlwIG1hbmlmZXN0IGJ1aWxkZXIKICAgICIiIgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGJ1aWxkKGNscywgcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgQnVpbGQgYSBkaWN0aW9uYXJ5IHNpbWlsYXIgdG8gdGhlIHppcGltcG9ydCBkaXJlY3RvcnkKICAgICAgICBjYWNoZXMsIGV4Y2VwdCBpbnN0ZWFkIG9mIHR1cGxlcywgc3RvcmUgWmlwSW5mbyBvYmplY3RzLgoKICAgICAgICBVc2UgYSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoIHNlcGFyYXRvciAob3Muc2VwKSBmb3IgdGhlIHBhdGgga2V5cwogICAgICAgIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHlweSBvbiBXaW5kb3dzLgogICAgICAgICIiIgogICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHBhdGgpIGFzIHpmaWxlOgogICAgICAgICAgICBpdGVtcyA9ICgKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICBuYW1lLnJlcGxhY2UoJy8nLCBvcy5zZXApLAogICAgICAgICAgICAgICAgICAgIHpmaWxlLmdldGluZm8obmFtZSksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiB6ZmlsZS5uYW1lbGlzdCgpCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIGRpY3QoaXRlbXMpCgogICAgbG9hZCA9IGJ1aWxkCgoKY2xhc3MgTWVtb2l6ZWRaaXBNYW5pZmVzdHMoWmlwTWFuaWZlc3RzKToKICAgICIiIgogICAgTWVtb2l6ZWQgemlwZmlsZSBtYW5pZmVzdHMuCiAgICAiIiIKICAgIG1hbmlmZXN0X21vZCA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoJ21hbmlmZXN0X21vZCcsICdtYW5pZmVzdCBtdGltZScpCgogICAgZGVmIGxvYWQoc2VsZiwgcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgTG9hZCBhIG1hbmlmZXN0IGF0IHBhdGggb3IgcmV0dXJuIGEgc3VpdGFibGUgbWFuaWZlc3QgYWxyZWFkeSBsb2FkZWQuCiAgICAgICAgIiIiCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgocGF0aCkKICAgICAgICBtdGltZSA9IG9zLnN0YXQocGF0aCkuc3RfbXRpbWUKCiAgICAgICAgaWYgcGF0aCBub3QgaW4gc2VsZiBvciBzZWxmW3BhdGhdLm10aW1lICE9IG10aW1lOgogICAgICAgICAgICBtYW5pZmVzdCA9IHNlbGYuYnVpbGQocGF0aCkKICAgICAgICAgICAgc2VsZltwYXRoXSA9IHNlbGYubWFuaWZlc3RfbW9kKG1hbmlmZXN0LCBtdGltZSkKCiAgICAgICAgcmV0dXJuIHNlbGZbcGF0aF0ubWFuaWZlc3QKCgpjbGFzcyBaaXBQcm92aWRlcihFZ2dQcm92aWRlcik6CiAgICAiIiJSZXNvdXJjZSBzdXBwb3J0IGZvciB6aXBzIGFuZCBlZ2dzIiIiCgogICAgZWFnZXJzID0gTm9uZQogICAgX3ppcF9tYW5pZmVzdHMgPSBNZW1vaXplZFppcE1hbmlmZXN0cygpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgRWdnUHJvdmlkZXIuX19pbml0X18oc2VsZiwgbW9kdWxlKQogICAgICAgIHNlbGYuemlwX3ByZSA9IHNlbGYubG9hZGVyLmFyY2hpdmUgKyBvcy5zZXAKCiAgICBkZWYgX3ppcGluZm9fbmFtZShzZWxmLCBmc3BhdGgpOgogICAgICAgICMgQ29udmVydCBhIHZpcnR1YWwgZmlsZW5hbWUgKGZ1bGwgcGF0aCB0byBmaWxlKSBpbnRvIGEgemlwZmlsZSBzdWJwYXRoCiAgICAgICAgIyB1c2FibGUgd2l0aCB0aGUgemlwaW1wb3J0IGRpcmVjdG9yeSBjYWNoZSBmb3Igb3VyIHRhcmdldCBhcmNoaXZlCiAgICAgICAgaWYgZnNwYXRoLnN0YXJ0c3dpdGgoc2VsZi56aXBfcHJlKToKICAgICAgICAgICAgcmV0dXJuIGZzcGF0aFtsZW4oc2VsZi56aXBfcHJlKTpdCiAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdWJwYXRoIG9mICVzIiAlIChmc3BhdGgsIHNlbGYuemlwX3ByZSkKICAgICAgICApCgogICAgZGVmIF9wYXJ0cyhzZWxmLCB6aXBfcGF0aCk6CiAgICAgICAgIyBDb252ZXJ0IGEgemlwZmlsZSBzdWJwYXRoIGludG8gYW4gZWdnLXJlbGF0aXZlIHBhdGggcGFydCBsaXN0LgogICAgICAgICMgcHNldWRvLWZzIHBhdGgKICAgICAgICBmc3BhdGggPSBzZWxmLnppcF9wcmUgKyB6aXBfcGF0aAogICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuZWdnX3Jvb3QgKyBvcy5zZXApOgogICAgICAgICAgICByZXR1cm4gZnNwYXRoW2xlbihzZWxmLmVnZ19yb290KSArIDE6XS5zcGxpdChvcy5zZXApCiAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdWJwYXRoIG9mICVzIiAlIChmc3BhdGgsIHNlbGYuZWdnX3Jvb3QpCiAgICAgICAgKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHppcGluZm8oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ppcF9tYW5pZmVzdHMubG9hZChzZWxmLmxvYWRlci5hcmNoaXZlKQoKICAgIGRlZiBnZXRfcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgaWYgbm90IHNlbGYuZWdnX25hbWU6CiAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICAgICAicmVzb3VyY2VfZmlsZW5hbWUoKSBvbmx5IHN1cHBvcnRlZCBmb3IgLmVnZywgbm90IC56aXAiCiAgICAgICAgICAgICkKICAgICAgICAjIG5vIG5lZWQgdG8gbG9jayBmb3IgZXh0cmFjdGlvbiwgc2luY2Ugd2UgdXNlIHRlbXAgbmFtZXMKICAgICAgICB6aXBfcGF0aCA9IHNlbGYuX3Jlc291cmNlX3RvX3ppcChyZXNvdXJjZV9uYW1lKQogICAgICAgIGVhZ2VycyA9IHNlbGYuX2dldF9lYWdlcl9yZXNvdXJjZXMoKQogICAgICAgIGlmICcvJy5qb2luKHNlbGYuX3BhcnRzKHppcF9wYXRoKSkgaW4gZWFnZXJzOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBlYWdlcnM6CiAgICAgICAgICAgICAgICBzZWxmLl9leHRyYWN0X3Jlc291cmNlKG1hbmFnZXIsIHNlbGYuX2VhZ2VyX3RvX3ppcChuYW1lKSkKICAgICAgICByZXR1cm4gc2VsZi5fZXh0cmFjdF9yZXNvdXJjZShtYW5hZ2VyLCB6aXBfcGF0aCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2dldF9kYXRlX2FuZF9zaXplKHppcF9zdGF0KToKICAgICAgICBzaXplID0gemlwX3N0YXQuZmlsZV9zaXplCiAgICAgICAgIyB5bWRobXMrd2RheSwgeWRheSwgZHN0CiAgICAgICAgZGF0ZV90aW1lID0gemlwX3N0YXQuZGF0ZV90aW1lICsgKDAsIDAsIC0xKQogICAgICAgICMgMTk4MCBvZmZzZXQgYWxyZWFkeSBkb25lCiAgICAgICAgdGltZXN0YW1wID0gdGltZS5ta3RpbWUoZGF0ZV90aW1lKQogICAgICAgIHJldHVybiB0aW1lc3RhbXAsIHNpemUKCiAgICBkZWYgX2V4dHJhY3RfcmVzb3VyY2Uoc2VsZiwgbWFuYWdlciwgemlwX3BhdGgpOgoKICAgICAgICBpZiB6aXBfcGF0aCBpbiBzZWxmLl9pbmRleCgpOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLl9pbmRleCgpW3ppcF9wYXRoXToKICAgICAgICAgICAgICAgIGxhc3QgPSBzZWxmLl9leHRyYWN0X3Jlc291cmNlKAogICAgICAgICAgICAgICAgICAgIG1hbmFnZXIsIG9zLnBhdGguam9pbih6aXBfcGF0aCwgbmFtZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgIyByZXR1cm4gdGhlIGV4dHJhY3RlZCBkaXJlY3RvcnkgbmFtZQogICAgICAgICAgICByZXR1cm4gb3MucGF0aC5kaXJuYW1lKGxhc3QpCgogICAgICAgIHRpbWVzdGFtcCwgc2l6ZSA9IHNlbGYuX2dldF9kYXRlX2FuZF9zaXplKHNlbGYuemlwaW5mb1t6aXBfcGF0aF0pCgogICAgICAgIGlmIG5vdCBXUklURV9TVVBQT1JUOgogICAgICAgICAgICByYWlzZSBJT0Vycm9yKCcib3MucmVuYW1lIiBhbmQgIm9zLnVubGluayIgYXJlIG5vdCBzdXBwb3J0ZWQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICdvbiB0aGlzIHBsYXRmb3JtJykKICAgICAgICB0cnk6CgogICAgICAgICAgICByZWFsX3BhdGggPSBtYW5hZ2VyLmdldF9jYWNoZV9wYXRoKAogICAgICAgICAgICAgICAgc2VsZi5lZ2dfbmFtZSwgc2VsZi5fcGFydHMoemlwX3BhdGgpCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmIHNlbGYuX2lzX2N1cnJlbnQocmVhbF9wYXRoLCB6aXBfcGF0aCk6CiAgICAgICAgICAgICAgICByZXR1cm4gcmVhbF9wYXRoCgogICAgICAgICAgICBvdXRmLCB0bXBuYW0gPSBfbWtzdGVtcCgKICAgICAgICAgICAgICAgICIuJGV4dHJhY3QiLAogICAgICAgICAgICAgICAgZGlyPW9zLnBhdGguZGlybmFtZShyZWFsX3BhdGgpLAogICAgICAgICAgICApCiAgICAgICAgICAgIG9zLndyaXRlKG91dGYsIHNlbGYubG9hZGVyLmdldF9kYXRhKHppcF9wYXRoKSkKICAgICAgICAgICAgb3MuY2xvc2Uob3V0ZikKICAgICAgICAgICAgdXRpbWUodG1wbmFtLCAodGltZXN0YW1wLCB0aW1lc3RhbXApKQogICAgICAgICAgICBtYW5hZ2VyLnBvc3Rwcm9jZXNzKHRtcG5hbSwgcmVhbF9wYXRoKQoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVuYW1lKHRtcG5hbSwgcmVhbF9wYXRoKQoKICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocmVhbF9wYXRoKToKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9pc19jdXJyZW50KHJlYWxfcGF0aCwgemlwX3BhdGgpOgogICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBmaWxlIGJlY2FtZSBjdXJyZW50IHNpbmNlIGl0IHdhcyBjaGVja2VkIGFib3ZlLAogICAgICAgICAgICAgICAgICAgICAgICAjICBzbyBwcm9jZWVkLgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbF9wYXRoCiAgICAgICAgICAgICAgICAgICAgIyBXaW5kb3dzLCBkZWwgb2xkIGZpbGUgYW5kIHJldHJ5CiAgICAgICAgICAgICAgICAgICAgZWxpZiBvcy5uYW1lID09ICdudCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHVubGluayhyZWFsX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZSh0bXBuYW0sIHJlYWxfcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAogICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgZXhjZXB0IG9zLmVycm9yOgogICAgICAgICAgICAjIHJlcG9ydCBhIHVzZXItZnJpZW5kbHkgZXJyb3IKICAgICAgICAgICAgbWFuYWdlci5leHRyYWN0aW9uX2Vycm9yKCkKCiAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAoKICAgIGRlZiBfaXNfY3VycmVudChzZWxmLCBmaWxlX3BhdGgsIHppcF9wYXRoKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gVHJ1ZSBpZiB0aGUgZmlsZV9wYXRoIGlzIGN1cnJlbnQgZm9yIHRoaXMgemlwX3BhdGgKICAgICAgICAiIiIKICAgICAgICB0aW1lc3RhbXAsIHNpemUgPSBzZWxmLl9nZXRfZGF0ZV9hbmRfc2l6ZShzZWxmLnppcGluZm9bemlwX3BhdGhdKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShmaWxlX3BhdGgpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBzdGF0ID0gb3Muc3RhdChmaWxlX3BhdGgpCiAgICAgICAgaWYgc3RhdC5zdF9zaXplICE9IHNpemUgb3Igc3RhdC5zdF9tdGltZSAhPSB0aW1lc3RhbXA6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICMgY2hlY2sgdGhhdCB0aGUgY29udGVudHMgbWF0Y2gKICAgICAgICB6aXBfY29udGVudHMgPSBzZWxmLmxvYWRlci5nZXRfZGF0YSh6aXBfcGF0aCkKICAgICAgICB3aXRoIG9wZW4oZmlsZV9wYXRoLCAncmInKSBhcyBmOgogICAgICAgICAgICBmaWxlX2NvbnRlbnRzID0gZi5yZWFkKCkKICAgICAgICByZXR1cm4gemlwX2NvbnRlbnRzID09IGZpbGVfY29udGVudHMKCiAgICBkZWYgX2dldF9lYWdlcl9yZXNvdXJjZXMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5lYWdlcnMgaXMgTm9uZToKICAgICAgICAgICAgZWFnZXJzID0gW10KICAgICAgICAgICAgZm9yIG5hbWUgaW4gKCduYXRpdmVfbGlicy50eHQnLCAnZWFnZXJfcmVzb3VyY2VzLnR4dCcpOgogICAgICAgICAgICAgICAgaWYgc2VsZi5oYXNfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgICAgICAgICAgICAgZWFnZXJzLmV4dGVuZChzZWxmLmdldF9tZXRhZGF0YV9saW5lcyhuYW1lKSkKICAgICAgICAgICAgc2VsZi5lYWdlcnMgPSBlYWdlcnMKICAgICAgICByZXR1cm4gc2VsZi5lYWdlcnMKCiAgICBkZWYgX2luZGV4KHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RpcmluZGV4CiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBpbmQgPSB7fQogICAgICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLnppcGluZm86CiAgICAgICAgICAgICAgICBwYXJ0cyA9IHBhdGguc3BsaXQob3Muc2VwKQogICAgICAgICAgICAgICAgd2hpbGUgcGFydHM6CiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gb3Muc2VwLmpvaW4ocGFydHNbOi0xXSkKICAgICAgICAgICAgICAgICAgICBpZiBwYXJlbnQgaW4gaW5kOgogICAgICAgICAgICAgICAgICAgICAgICBpbmRbcGFyZW50XS5hcHBlbmQocGFydHNbLTFdKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGluZFtwYXJlbnRdID0gW3BhcnRzLnBvcCgpXQogICAgICAgICAgICBzZWxmLl9kaXJpbmRleCA9IGluZAogICAgICAgICAgICByZXR1cm4gaW5kCgogICAgZGVmIF9oYXMoc2VsZiwgZnNwYXRoKToKICAgICAgICB6aXBfcGF0aCA9IHNlbGYuX3ppcGluZm9fbmFtZShmc3BhdGgpCiAgICAgICAgcmV0dXJuIHppcF9wYXRoIGluIHNlbGYuemlwaW5mbyBvciB6aXBfcGF0aCBpbiBzZWxmLl9pbmRleCgpCgogICAgZGVmIF9pc2RpcihzZWxmLCBmc3BhdGgpOgogICAgICAgIHJldHVybiBzZWxmLl96aXBpbmZvX25hbWUoZnNwYXRoKSBpbiBzZWxmLl9pbmRleCgpCgogICAgZGVmIF9saXN0ZGlyKHNlbGYsIGZzcGF0aCk6CiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5faW5kZXgoKS5nZXQoc2VsZi5femlwaW5mb19uYW1lKGZzcGF0aCksICgpKSkKCiAgICBkZWYgX2VhZ2VyX3RvX3ppcChzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5femlwaW5mb19uYW1lKHNlbGYuX2ZuKHNlbGYuZWdnX3Jvb3QsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBfcmVzb3VyY2VfdG9femlwKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl96aXBpbmZvX25hbWUoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgoKcmVnaXN0ZXJfbG9hZGVyX3R5cGUoemlwaW1wb3J0LnppcGltcG9ydGVyLCBaaXBQcm92aWRlcikKCgpjbGFzcyBGaWxlTWV0YWRhdGEoRW1wdHlQcm92aWRlcik6CiAgICAiIiJNZXRhZGF0YSBoYW5kbGVyIGZvciBzdGFuZGFsb25lIFBLRy1JTkZPIGZpbGVzCgogICAgVXNhZ2U6OgoKICAgICAgICBtZXRhZGF0YSA9IEZpbGVNZXRhZGF0YSgiL3BhdGgvdG8vUEtHLUlORk8iKQoKICAgIFRoaXMgcHJvdmlkZXIgcmVqZWN0cyBhbGwgZGF0YSBhbmQgbWV0YWRhdGEgcmVxdWVzdHMgZXhjZXB0IGZvciBQS0ctSU5GTywKICAgIHdoaWNoIGlzIHRyZWF0ZWQgYXMgZXhpc3RpbmcsIGFuZCB3aWxsIGJlIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhdAogICAgdGhlIHByb3ZpZGVkIGxvY2F0aW9uLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgogICAgICAgIHNlbGYucGF0aCA9IHBhdGgKCiAgICBkZWYgaGFzX21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBuYW1lID09ICdQS0ctSU5GTycgYW5kIG9zLnBhdGguaXNmaWxlKHNlbGYucGF0aCkKCiAgICBkZWYgZ2V0X21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIG5hbWUgIT0gJ1BLRy1JTkZPJzoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoIk5vIG1ldGFkYXRhIGV4Y2VwdCBQS0ctSU5GTyBpcyBhdmFpbGFibGUiKQoKICAgICAgICB3aXRoIGlvLm9wZW4oc2VsZi5wYXRoLCBlbmNvZGluZz0ndXRmLTgnLCBlcnJvcnM9InJlcGxhY2UiKSBhcyBmOgogICAgICAgICAgICBtZXRhZGF0YSA9IGYucmVhZCgpCiAgICAgICAgc2VsZi5fd2Fybl9vbl9yZXBsYWNlbWVudChtZXRhZGF0YSkKICAgICAgICByZXR1cm4gbWV0YWRhdGEKCiAgICBkZWYgX3dhcm5fb25fcmVwbGFjZW1lbnQoc2VsZiwgbWV0YWRhdGEpOgogICAgICAgICMgUHl0aG9uIDIuNyBjb21wYXQgZm9yOiByZXBsYWNlbWVudF9jaGFyID0gJ++/vScKICAgICAgICByZXBsYWNlbWVudF9jaGFyID0gYidceGVmXHhiZlx4YmQnLmRlY29kZSgndXRmLTgnKQogICAgICAgIGlmIHJlcGxhY2VtZW50X2NoYXIgaW4gbWV0YWRhdGE6CiAgICAgICAgICAgIHRtcGwgPSAie3NlbGYucGF0aH0gY291bGQgbm90IGJlIHByb3Blcmx5IGRlY29kZWQgaW4gVVRGLTgiCiAgICAgICAgICAgIG1zZyA9IHRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnKQoKICAgIGRlZiBnZXRfbWV0YWRhdGFfbGluZXMoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHlpZWxkX2xpbmVzKHNlbGYuZ2V0X21ldGFkYXRhKG5hbWUpKQoKCmNsYXNzIFBhdGhNZXRhZGF0YShEZWZhdWx0UHJvdmlkZXIpOgogICAgIiIiTWV0YWRhdGEgcHJvdmlkZXIgZm9yIGVnZyBkaXJlY3RvcmllcwoKICAgIFVzYWdlOjoKCiAgICAgICAgIyBEZXZlbG9wbWVudCBlZ2dzOgoKICAgICAgICBlZ2dfaW5mbyA9ICIvcGF0aC90by9QYWNrYWdlTmFtZS5lZ2ctaW5mbyIKICAgICAgICBiYXNlX2RpciA9IG9zLnBhdGguZGlybmFtZShlZ2dfaW5mbykKICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShiYXNlX2RpciwgZWdnX2luZm8pCiAgICAgICAgZGlzdF9uYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGVnZ19pbmZvKSlbMF0KICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKGJhc2VkaXIsIHByb2plY3RfbmFtZT1kaXN0X25hbWUsIG1ldGFkYXRhPW1ldGFkYXRhKQoKICAgICAgICAjIFVucGFja2VkIGVnZyBkaXJlY3RvcmllczoKCiAgICAgICAgZWdnX3BhdGggPSAiL3BhdGgvdG8vUGFja2FnZU5hbWUtdmVyLXB5dmVyLWV0Yy5lZ2ciCiAgICAgICAgbWV0YWRhdGEgPSBQYXRoTWV0YWRhdGEoZWdnX3BhdGgsIG9zLnBhdGguam9pbihlZ2dfcGF0aCwnRUdHLUlORk8nKSkKICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoZWdnX3BhdGgsIG1ldGFkYXRhPW1ldGFkYXRhKQogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIGVnZ19pbmZvKToKICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gcGF0aAogICAgICAgIHNlbGYuZWdnX2luZm8gPSBlZ2dfaW5mbwoKCmNsYXNzIEVnZ01ldGFkYXRhKFppcFByb3ZpZGVyKToKICAgICIiIk1ldGFkYXRhIHByb3ZpZGVyIGZvciAuZWdnIGZpbGVzIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGltcG9ydGVyKToKICAgICAgICAiIiJDcmVhdGUgYSBtZXRhZGF0YSBwcm92aWRlciBmcm9tIGEgemlwaW1wb3J0ZXIiIiIKCiAgICAgICAgc2VsZi56aXBfcHJlID0gaW1wb3J0ZXIuYXJjaGl2ZSArIG9zLnNlcAogICAgICAgIHNlbGYubG9hZGVyID0gaW1wb3J0ZXIKICAgICAgICBpZiBpbXBvcnRlci5wcmVmaXg6CiAgICAgICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBvcy5wYXRoLmpvaW4oaW1wb3J0ZXIuYXJjaGl2ZSwgaW1wb3J0ZXIucHJlZml4KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBpbXBvcnRlci5hcmNoaXZlCiAgICAgICAgc2VsZi5fc2V0dXBfcHJlZml4KCkKCgpfZGVjbGFyZV9zdGF0ZSgnZGljdCcsIF9kaXN0cmlidXRpb25fZmluZGVycz17fSkKCgpkZWYgcmVnaXN0ZXJfZmluZGVyKGltcG9ydGVyX3R5cGUsIGRpc3RyaWJ1dGlvbl9maW5kZXIpOgogICAgIiIiUmVnaXN0ZXIgYGRpc3RyaWJ1dGlvbl9maW5kZXJgIHRvIGZpbmQgZGlzdHJpYnV0aW9ucyBpbiBzeXMucGF0aCBpdGVtcwoKICAgIGBpbXBvcnRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgIkltcG9ydGVyIiAoc3lzLnBhdGggaXRlbQogICAgaGFuZGxlciksIGFuZCBgZGlzdHJpYnV0aW9uX2ZpbmRlcmAgaXMgYSBjYWxsYWJsZSB0aGF0LCBwYXNzZWQgYSBwYXRoCiAgICBpdGVtIGFuZCB0aGUgaW1wb3J0ZXIgaW5zdGFuY2UsIHlpZWxkcyBgYERpc3RyaWJ1dGlvbmBgIGluc3RhbmNlcyBmb3VuZCBvbgogICAgdGhhdCBwYXRoIGl0ZW0uICBTZWUgYGBwa2dfcmVzb3VyY2VzLmZpbmRfb25fcGF0aGBgIGZvciBhbiBleGFtcGxlLiIiIgogICAgX2Rpc3RyaWJ1dGlvbl9maW5kZXJzW2ltcG9ydGVyX3R5cGVdID0gZGlzdHJpYnV0aW9uX2ZpbmRlcgoKCmRlZiBmaW5kX2Rpc3RyaWJ1dGlvbnMocGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgICIiIllpZWxkIGRpc3RyaWJ1dGlvbnMgYWNjZXNzaWJsZSB2aWEgYHBhdGhfaXRlbWAiIiIKICAgIGltcG9ydGVyID0gZ2V0X2ltcG9ydGVyKHBhdGhfaXRlbSkKICAgIGZpbmRlciA9IF9maW5kX2FkYXB0ZXIoX2Rpc3RyaWJ1dGlvbl9maW5kZXJzLCBpbXBvcnRlcikKICAgIHJldHVybiBmaW5kZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seSkKCgpkZWYgZmluZF9lZ2dzX2luX3ppcChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgICIiIgogICAgRmluZCBlZ2dzIGluIHppcCBmaWxlczsgcG9zc2libHkgbXVsdGlwbGUgbmVzdGVkIGVnZ3MuCiAgICAiIiIKICAgIGlmIGltcG9ydGVyLmFyY2hpdmUuZW5kc3dpdGgoJy53aGwnKToKICAgICAgICAjIHdoZWVscyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIHRoaXMgZmluZGVyCiAgICAgICAgIyB0aGV5IGRvbid0IGhhdmUgUEtHLUlORk8gbWV0YWRhdGEsIGFuZCB3b24ndCBldmVyIGNvbnRhaW4gZWdncwogICAgICAgIHJldHVybgogICAgbWV0YWRhdGEgPSBFZ2dNZXRhZGF0YShpbXBvcnRlcikKICAgIGlmIG1ldGFkYXRhLmhhc19tZXRhZGF0YSgnUEtHLUlORk8nKToKICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShwYXRoX2l0ZW0sIG1ldGFkYXRhPW1ldGFkYXRhKQogICAgaWYgb25seToKICAgICAgICAjIGRvbid0IHlpZWxkIG5lc3RlZCBkaXN0cm9zCiAgICAgICAgcmV0dXJuCiAgICBmb3Igc3ViaXRlbSBpbiBtZXRhZGF0YS5yZXNvdXJjZV9saXN0ZGlyKCcvJyk6CiAgICAgICAgaWYgX2lzX2VnZ19wYXRoKHN1Yml0ZW0pOgogICAgICAgICAgICBzdWJwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgc3ViaXRlbSkKICAgICAgICAgICAgZGlzdHMgPSBmaW5kX2VnZ3NfaW5femlwKHppcGltcG9ydC56aXBpbXBvcnRlcihzdWJwYXRoKSwgc3VicGF0aCkKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CiAgICAgICAgZWxpZiBzdWJpdGVtLmxvd2VyKCkuZW5kc3dpdGgoJy5kaXN0LWluZm8nKToKICAgICAgICAgICAgc3VicGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIHN1Yml0ZW0pCiAgICAgICAgICAgIHN1Ym1ldGEgPSBFZ2dNZXRhZGF0YSh6aXBpbXBvcnQuemlwaW1wb3J0ZXIoc3VicGF0aCkpCiAgICAgICAgICAgIHN1Ym1ldGEuZWdnX2luZm8gPSBzdWJwYXRoCiAgICAgICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2xvY2F0aW9uKHBhdGhfaXRlbSwgc3ViaXRlbSwgc3VibWV0YSkKCgpyZWdpc3Rlcl9maW5kZXIoemlwaW1wb3J0LnppcGltcG9ydGVyLCBmaW5kX2VnZ3NfaW5femlwKQoKCmRlZiBmaW5kX25vdGhpbmcoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CiAgICByZXR1cm4gKCkKCgpyZWdpc3Rlcl9maW5kZXIob2JqZWN0LCBmaW5kX25vdGhpbmcpCgoKZGVmIF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpOgogICAgIiIiCiAgICBHaXZlbiBhIGxpc3Qgb2YgZmlsZW5hbWVzLCByZXR1cm4gdGhlbSBpbiBkZXNjZW5kaW5nIG9yZGVyCiAgICBieSB2ZXJzaW9uIG51bWJlci4KCiAgICA+Pj4gbmFtZXMgPSAnYmFyJywgJ2ZvbycsICdQeXRob24tMi43LjEwLmVnZycsICdQeXRob24tMi43LjIuZWdnJwogICAgPj4+IF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpCiAgICBbJ1B5dGhvbi0yLjcuMTAuZWdnJywgJ1B5dGhvbi0yLjcuMi5lZ2cnLCAnZm9vJywgJ2JhciddCiAgICA+Pj4gbmFtZXMgPSAnU2V0dXB0b29scy0xLjIuM2IxLmVnZycsICdTZXR1cHRvb2xzLTEuMi4zLmVnZycKICAgID4+PiBfYnlfdmVyc2lvbl9kZXNjZW5kaW5nKG5hbWVzKQogICAgWydTZXR1cHRvb2xzLTEuMi4zLmVnZycsICdTZXR1cHRvb2xzLTEuMi4zYjEuZWdnJ10KICAgID4+PiBuYW1lcyA9ICdTZXR1cHRvb2xzLTEuMi4zYjEuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjMucG9zdDEuZWdnJwogICAgPj4+IF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcobmFtZXMpCiAgICBbJ1NldHVwdG9vbHMtMS4yLjMucG9zdDEuZWdnJywgJ1NldHVwdG9vbHMtMS4yLjNiMS5lZ2cnXQogICAgIiIiCiAgICBkZWYgX2J5X3ZlcnNpb24obmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUGFyc2UgZWFjaCBjb21wb25lbnQgb2YgdGhlIGZpbGVuYW1lCiAgICAgICAgIiIiCiAgICAgICAgbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQogICAgICAgIHBhcnRzID0gaXRlcnRvb2xzLmNoYWluKG5hbWUuc3BsaXQoJy0nKSwgW2V4dF0pCiAgICAgICAgcmV0dXJuIFtwYWNrYWdpbmcudmVyc2lvbi5wYXJzZShwYXJ0KSBmb3IgcGFydCBpbiBwYXJ0c10KCiAgICByZXR1cm4gc29ydGVkKG5hbWVzLCBrZXk9X2J5X3ZlcnNpb24sIHJldmVyc2U9VHJ1ZSkKCgpkZWYgZmluZF9vbl9wYXRoKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBhY2Nlc3NpYmxlIG9uIGEgc3lzLnBhdGggZGlyZWN0b3J5IiIiCiAgICBwYXRoX2l0ZW0gPSBfbm9ybWFsaXplX2NhY2hlZChwYXRoX2l0ZW0pCgogICAgaWYgX2lzX3VucGFja2VkX2VnZyhwYXRoX2l0ZW0pOgogICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKAogICAgICAgICAgICBwYXRoX2l0ZW0sIG1ldGFkYXRhPVBhdGhNZXRhZGF0YSgKICAgICAgICAgICAgICAgIHBhdGhfaXRlbSwgb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgJ0VHRy1JTkZPJykKICAgICAgICAgICAgKQogICAgICAgICkKICAgICAgICByZXR1cm4KCiAgICBlbnRyaWVzID0gc2FmZV9saXN0ZGlyKHBhdGhfaXRlbSkKCiAgICAjIGZvciBwZXJmb3JtYW5jZSwgYmVmb3JlIHNvcnRpbmcgYnkgdmVyc2lvbiwKICAgICMgc2NyZWVuIGVudHJpZXMgZm9yIG9ubHkgdGhvc2UgdGhhdCB3aWxsIHlpZWxkCiAgICAjIGRpc3RyaWJ1dGlvbnMKICAgIGZpbHRlcmVkID0gKAogICAgICAgIGVudHJ5CiAgICAgICAgZm9yIGVudHJ5IGluIGVudHJpZXMKICAgICAgICBpZiBkaXN0X2ZhY3RvcnkocGF0aF9pdGVtLCBlbnRyeSwgb25seSkKICAgICkKCiAgICAjIHNjYW4gZm9yIC5lZ2cgYW5kIC5lZ2ctaW5mbyBpbiBkaXJlY3RvcnkKICAgIHBhdGhfaXRlbV9lbnRyaWVzID0gX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhmaWx0ZXJlZCkKICAgIGZvciBlbnRyeSBpbiBwYXRoX2l0ZW1fZW50cmllczoKICAgICAgICBmdWxscGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIGVudHJ5KQogICAgICAgIGZhY3RvcnkgPSBkaXN0X2ZhY3RvcnkocGF0aF9pdGVtLCBlbnRyeSwgb25seSkKICAgICAgICBmb3IgZGlzdCBpbiBmYWN0b3J5KGZ1bGxwYXRoKToKICAgICAgICAgICAgeWllbGQgZGlzdAoKCmRlZiBkaXN0X2ZhY3RvcnkocGF0aF9pdGVtLCBlbnRyeSwgb25seSk6CiAgICAiIiIKICAgIFJldHVybiBhIGRpc3RfZmFjdG9yeSBmb3IgYSBwYXRoX2l0ZW0gYW5kIGVudHJ5CiAgICAiIiIKICAgIGxvd2VyID0gZW50cnkubG93ZXIoKQogICAgaXNfbWV0YSA9IGFueShtYXAobG93ZXIuZW5kc3dpdGgsICgnLmVnZy1pbmZvJywgJy5kaXN0LWluZm8nKSkpCiAgICByZXR1cm4gKAogICAgICAgIGRpc3RyaWJ1dGlvbnNfZnJvbV9tZXRhZGF0YQogICAgICAgIGlmIGlzX21ldGEgZWxzZQogICAgICAgIGZpbmRfZGlzdHJpYnV0aW9ucwogICAgICAgIGlmIG5vdCBvbmx5IGFuZCBfaXNfZWdnX3BhdGgoZW50cnkpIGVsc2UKICAgICAgICByZXNvbHZlX2VnZ19saW5rCiAgICAgICAgaWYgbm90IG9ubHkgYW5kIGxvd2VyLmVuZHN3aXRoKCcuZWdnLWxpbmsnKSBlbHNlCiAgICAgICAgTm9EaXN0cygpCiAgICApCgoKY2xhc3MgTm9EaXN0czoKICAgICIiIgogICAgPj4+IGJvb2woTm9EaXN0cygpKQogICAgRmFsc2UKCiAgICA+Pj4gbGlzdChOb0Rpc3RzKCkoJ2FueXRoaW5nJykpCiAgICBbXQogICAgIiIiCiAgICBkZWYgX19ib29sX18oc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBpZiBzaXguUFkyOgogICAgICAgIF9fbm9uemVyb19fID0gX19ib29sX18KCiAgICBkZWYgX19jYWxsX18oc2VsZiwgZnVsbHBhdGgpOgogICAgICAgIHJldHVybiBpdGVyKCgpKQoKCmRlZiBzYWZlX2xpc3RkaXIocGF0aCk6CiAgICAiIiIKICAgIEF0dGVtcHQgdG8gbGlzdCBjb250ZW50cyBvZiBwYXRoLCBidXQgc3VwcHJlc3Mgc29tZSBleGNlcHRpb25zLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIG9zLmxpc3RkaXIocGF0aCkKICAgIGV4Y2VwdCAoUGVybWlzc2lvbkVycm9yLCBOb3RBRGlyZWN0b3J5RXJyb3IpOgogICAgICAgIHBhc3MKICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CiAgICAgICAgIyBJZ25vcmUgdGhlIGRpcmVjdG9yeSBpZiBkb2VzIG5vdCBleGlzdCwgbm90IGEgZGlyZWN0b3J5IG9yCiAgICAgICAgIyBwZXJtaXNzaW9uIGRlbmllZAogICAgICAgIGlnbm9yYWJsZSA9ICgKICAgICAgICAgICAgZS5lcnJubyBpbiAoZXJybm8uRU5PVERJUiwgZXJybm8uRUFDQ0VTLCBlcnJuby5FTk9FTlQpCiAgICAgICAgICAgICMgUHl0aG9uIDIgb24gV2luZG93cyBuZWVkcyB0byBiZSBoYW5kbGVkIHRoaXMgd2F5IDooCiAgICAgICAgICAgIG9yIGdldGF0dHIoZSwgIndpbmVycm9yIiwgTm9uZSkgPT0gMjY3CiAgICAgICAgKQogICAgICAgIGlmIG5vdCBpZ25vcmFibGU6CiAgICAgICAgICAgIHJhaXNlCiAgICByZXR1cm4gKCkKCgpkZWYgZGlzdHJpYnV0aW9uc19mcm9tX21ldGFkYXRhKHBhdGgpOgogICAgcm9vdCA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKToKICAgICAgICBpZiBsZW4ob3MubGlzdGRpcihwYXRoKSkgPT0gMDoKICAgICAgICAgICAgIyBlbXB0eSBtZXRhZGF0YSBkaXI7IHNraXAKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbWV0YWRhdGEgPSBQYXRoTWV0YWRhdGEocm9vdCwgcGF0aCkKICAgIGVsc2U6CiAgICAgICAgbWV0YWRhdGEgPSBGaWxlTWV0YWRhdGEocGF0aCkKICAgIGVudHJ5ID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQogICAgeWllbGQgRGlzdHJpYnV0aW9uLmZyb21fbG9jYXRpb24oCiAgICAgICAgcm9vdCwgZW50cnksIG1ldGFkYXRhLCBwcmVjZWRlbmNlPURFVkVMT1BfRElTVCwKICAgICkKCgpkZWYgbm9uX2VtcHR5X2xpbmVzKHBhdGgpOgogICAgIiIiCiAgICBZaWVsZCBub24tZW1wdHkgbGluZXMgZnJvbSBmaWxlIGF0IHBhdGgKICAgICIiIgogICAgd2l0aCBvcGVuKHBhdGgpIGFzIGY6CiAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICBpZiBsaW5lOgogICAgICAgICAgICAgICAgeWllbGQgbGluZQoKCmRlZiByZXNvbHZlX2VnZ19saW5rKHBhdGgpOgogICAgIiIiCiAgICBHaXZlbiBhIHBhdGggdG8gYW4gLmVnZy1saW5rLCByZXNvbHZlIGRpc3RyaWJ1dGlvbnMKICAgIHByZXNlbnQgaW4gdGhlIHJlZmVyZW5jZWQgcGF0aC4KICAgICIiIgogICAgcmVmZXJlbmNlZF9wYXRocyA9IG5vbl9lbXB0eV9saW5lcyhwYXRoKQogICAgcmVzb2x2ZWRfcGF0aHMgPSAoCiAgICAgICAgb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShwYXRoKSwgcmVmKQogICAgICAgIGZvciByZWYgaW4gcmVmZXJlbmNlZF9wYXRocwogICAgKQogICAgZGlzdF9ncm91cHMgPSBtYXAoZmluZF9kaXN0cmlidXRpb25zLCByZXNvbHZlZF9wYXRocykKICAgIHJldHVybiBuZXh0KGRpc3RfZ3JvdXBzLCAoKSkKCgpyZWdpc3Rlcl9maW5kZXIocGtndXRpbC5JbXBJbXBvcnRlciwgZmluZF9vbl9wYXRoKQoKaWYgaGFzYXR0cihpbXBvcnRsaWJfbWFjaGluZXJ5LCAnRmlsZUZpbmRlcicpOgogICAgcmVnaXN0ZXJfZmluZGVyKGltcG9ydGxpYl9tYWNoaW5lcnkuRmlsZUZpbmRlciwgZmluZF9vbl9wYXRoKQoKX2RlY2xhcmVfc3RhdGUoJ2RpY3QnLCBfbmFtZXNwYWNlX2hhbmRsZXJzPXt9KQpfZGVjbGFyZV9zdGF0ZSgnZGljdCcsIF9uYW1lc3BhY2VfcGFja2FnZXM9e30pCgoKZGVmIHJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKGltcG9ydGVyX3R5cGUsIG5hbWVzcGFjZV9oYW5kbGVyKToKICAgICIiIlJlZ2lzdGVyIGBuYW1lc3BhY2VfaGFuZGxlcmAgdG8gZGVjbGFyZSBuYW1lc3BhY2UgcGFja2FnZXMKCiAgICBgaW1wb3J0ZXJfdHlwZWAgaXMgdGhlIHR5cGUgb3IgY2xhc3Mgb2YgYSBQRVAgMzAyICJJbXBvcnRlciIgKHN5cy5wYXRoIGl0ZW0KICAgIGhhbmRsZXIpLCBhbmQgYG5hbWVzcGFjZV9oYW5kbGVyYCBpcyBhIGNhbGxhYmxlIGxpa2UgdGhpczo6CgogICAgICAgIGRlZiBuYW1lc3BhY2VfaGFuZGxlcihpbXBvcnRlciwgcGF0aF9lbnRyeSwgbW9kdWxlTmFtZSwgbW9kdWxlKToKICAgICAgICAgICAgIyByZXR1cm4gYSBwYXRoX2VudHJ5IHRvIHVzZSBmb3IgY2hpbGQgcGFja2FnZXMKCiAgICBOYW1lc3BhY2UgaGFuZGxlcnMgYXJlIG9ubHkgY2FsbGVkIGlmIHRoZSBpbXBvcnRlciBvYmplY3QgaGFzIGFscmVhZHkKICAgIGFncmVlZCB0aGF0IGl0IGNhbiBoYW5kbGUgdGhlIHJlbGV2YW50IHBhdGggaXRlbSwgYW5kIHRoZXkgc2hvdWxkIG9ubHkKICAgIHJldHVybiBhIHN1YnBhdGggaWYgdGhlIG1vZHVsZSBfX3BhdGhfXyBkb2VzIG5vdCBhbHJlYWR5IGNvbnRhaW4gYW4KICAgIGVxdWl2YWxlbnQgc3VicGF0aC4gIEZvciBhbiBleGFtcGxlIG5hbWVzcGFjZSBoYW5kbGVyLCBzZWUKICAgIGBgcGtnX3Jlc291cmNlcy5maWxlX25zX2hhbmRsZXJgYC4KICAgICIiIgogICAgX25hbWVzcGFjZV9oYW5kbGVyc1tpbXBvcnRlcl90eXBlXSA9IG5hbWVzcGFjZV9oYW5kbGVyCgoKZGVmIF9oYW5kbGVfbnMocGFja2FnZU5hbWUsIHBhdGhfaXRlbSk6CiAgICAiIiJFbnN1cmUgdGhhdCBuYW1lZCBwYWNrYWdlIGluY2x1ZGVzIGEgc3VicGF0aCBvZiBwYXRoX2l0ZW0gKGlmIG5lZWRlZCkiIiIKCiAgICBpbXBvcnRlciA9IGdldF9pbXBvcnRlcihwYXRoX2l0ZW0pCiAgICBpZiBpbXBvcnRlciBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCiAgICBsb2FkZXIgPSBpbXBvcnRlci5maW5kX21vZHVsZShwYWNrYWdlTmFtZSkKICAgIGlmIGxvYWRlciBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCiAgICBtb2R1bGUgPSBzeXMubW9kdWxlcy5nZXQocGFja2FnZU5hbWUpCiAgICBpZiBtb2R1bGUgaXMgTm9uZToKICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1twYWNrYWdlTmFtZV0gPSB0eXBlcy5Nb2R1bGVUeXBlKHBhY2thZ2VOYW1lKQogICAgICAgIG1vZHVsZS5fX3BhdGhfXyA9IFtdCiAgICAgICAgX3NldF9wYXJlbnRfbnMocGFja2FnZU5hbWUpCiAgICBlbGlmIG5vdCBoYXNhdHRyKG1vZHVsZSwgJ19fcGF0aF9fJyk6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJOb3QgYSBwYWNrYWdlOiIsIHBhY2thZ2VOYW1lKQogICAgaGFuZGxlciA9IF9maW5kX2FkYXB0ZXIoX25hbWVzcGFjZV9oYW5kbGVycywgaW1wb3J0ZXIpCiAgICBzdWJwYXRoID0gaGFuZGxlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBwYWNrYWdlTmFtZSwgbW9kdWxlKQogICAgaWYgc3VicGF0aCBpcyBub3QgTm9uZToKICAgICAgICBwYXRoID0gbW9kdWxlLl9fcGF0aF9fCiAgICAgICAgcGF0aC5hcHBlbmQoc3VicGF0aCkKICAgICAgICBsb2FkZXIubG9hZF9tb2R1bGUocGFja2FnZU5hbWUpCiAgICAgICAgX3JlYnVpbGRfbW9kX3BhdGgocGF0aCwgcGFja2FnZU5hbWUsIG1vZHVsZSkKICAgIHJldHVybiBzdWJwYXRoCgoKZGVmIF9yZWJ1aWxkX21vZF9wYXRoKG9yaWdfcGF0aCwgcGFja2FnZV9uYW1lLCBtb2R1bGUpOgogICAgIiIiCiAgICBSZWJ1aWxkIG1vZHVsZS5fX3BhdGhfXyBlbnN1cmluZyB0aGF0IGFsbCBlbnRyaWVzIGFyZSBvcmRlcmVkCiAgICBjb3JyZXNwb25kaW5nIHRvIHRoZWlyIHN5cy5wYXRoIG9yZGVyCiAgICAiIiIKICAgIHN5c19wYXRoID0gW19ub3JtYWxpemVfY2FjaGVkKHApIGZvciBwIGluIHN5cy5wYXRoXQoKICAgIGRlZiBzYWZlX3N5c19wYXRoX2luZGV4KGVudHJ5KToKICAgICAgICAiIiIKICAgICAgICBXb3JrYXJvdW5kIGZvciAjNTIwIGFuZCAjNTEzLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN5c19wYXRoLmluZGV4KGVudHJ5KQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByZXR1cm4gZmxvYXQoJ2luZicpCgogICAgZGVmIHBvc2l0aW9uX2luX3N5c19wYXRoKHBhdGgpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgb3JkaW5hbCBvZiB0aGUgcGF0aCBiYXNlZCBvbiBpdHMgcG9zaXRpb24gaW4gc3lzLnBhdGgKICAgICAgICAiIiIKICAgICAgICBwYXRoX3BhcnRzID0gcGF0aC5zcGxpdChvcy5zZXApCiAgICAgICAgbW9kdWxlX3BhcnRzID0gcGFja2FnZV9uYW1lLmNvdW50KCcuJykgKyAxCiAgICAgICAgcGFydHMgPSBwYXRoX3BhcnRzWzotbW9kdWxlX3BhcnRzXQogICAgICAgIHJldHVybiBzYWZlX3N5c19wYXRoX2luZGV4KF9ub3JtYWxpemVfY2FjaGVkKG9zLnNlcC5qb2luKHBhcnRzKSkpCgogICAgaWYgbm90IGlzaW5zdGFuY2Uob3JpZ19wYXRoLCBsaXN0KToKICAgICAgICAjIElzIHRoaXMgYmVoYXZpb3IgdXNlZnVsIHdoZW4gbW9kdWxlLl9fcGF0aF9fIGlzIG5vdCBhIGxpc3Q/CiAgICAgICAgcmV0dXJuCgogICAgb3JpZ19wYXRoLnNvcnQoa2V5PXBvc2l0aW9uX2luX3N5c19wYXRoKQogICAgbW9kdWxlLl9fcGF0aF9fWzpdID0gW19ub3JtYWxpemVfY2FjaGVkKHApIGZvciBwIGluIG9yaWdfcGF0aF0KCgpkZWYgZGVjbGFyZV9uYW1lc3BhY2UocGFja2FnZU5hbWUpOgogICAgIiIiRGVjbGFyZSB0aGF0IHBhY2thZ2UgJ3BhY2thZ2VOYW1lJyBpcyBhIG5hbWVzcGFjZSBwYWNrYWdlIiIiCgogICAgX2ltcC5hY3F1aXJlX2xvY2soKQogICAgdHJ5OgogICAgICAgIGlmIHBhY2thZ2VOYW1lIGluIF9uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBwYXRoLCBwYXJlbnQgPSBzeXMucGF0aCwgTm9uZQogICAgICAgIGlmICcuJyBpbiBwYWNrYWdlTmFtZToKICAgICAgICAgICAgcGFyZW50ID0gJy4nLmpvaW4ocGFja2FnZU5hbWUuc3BsaXQoJy4nKVs6LTFdKQogICAgICAgICAgICBkZWNsYXJlX25hbWVzcGFjZShwYXJlbnQpCiAgICAgICAgICAgIGlmIHBhcmVudCBub3QgaW4gX25hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgICAgIF9faW1wb3J0X18ocGFyZW50KQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBwYXRoID0gc3lzLm1vZHVsZXNbcGFyZW50XS5fX3BhdGhfXwogICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk5vdCBhIHBhY2thZ2U6IiwgcGFyZW50KQoKICAgICAgICAjIFRyYWNrIHdoYXQgcGFja2FnZXMgYXJlIG5hbWVzcGFjZXMsIHNvIHdoZW4gbmV3IHBhdGggaXRlbXMgYXJlIGFkZGVkLAogICAgICAgICMgdGhleSBjYW4gYmUgdXBkYXRlZAogICAgICAgIF9uYW1lc3BhY2VfcGFja2FnZXMuc2V0ZGVmYXVsdChwYXJlbnQsIFtdKS5hcHBlbmQocGFja2FnZU5hbWUpCiAgICAgICAgX25hbWVzcGFjZV9wYWNrYWdlcy5zZXRkZWZhdWx0KHBhY2thZ2VOYW1lLCBbXSkKCiAgICAgICAgZm9yIHBhdGhfaXRlbSBpbiBwYXRoOgogICAgICAgICAgICAjIEVuc3VyZSBhbGwgdGhlIHBhcmVudCdzIHBhdGggaXRlbXMgYXJlIHJlZmxlY3RlZCBpbiB0aGUgY2hpbGQsCiAgICAgICAgICAgICMgaWYgdGhleSBhcHBseQogICAgICAgICAgICBfaGFuZGxlX25zKHBhY2thZ2VOYW1lLCBwYXRoX2l0ZW0pCgogICAgZmluYWxseToKICAgICAgICBfaW1wLnJlbGVhc2VfbG9jaygpCgoKZGVmIGZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcyhwYXRoX2l0ZW0sIHBhcmVudD1Ob25lKToKICAgICIiIkVuc3VyZSB0aGF0IHByZXZpb3VzbHktZGVjbGFyZWQgbmFtZXNwYWNlIHBhY2thZ2VzIGluY2x1ZGUgcGF0aF9pdGVtIiIiCiAgICBfaW1wLmFjcXVpcmVfbG9jaygpCiAgICB0cnk6CiAgICAgICAgZm9yIHBhY2thZ2UgaW4gX25hbWVzcGFjZV9wYWNrYWdlcy5nZXQocGFyZW50LCAoKSk6CiAgICAgICAgICAgIHN1YnBhdGggPSBfaGFuZGxlX25zKHBhY2thZ2UsIHBhdGhfaXRlbSkKICAgICAgICAgICAgaWYgc3VicGF0aDoKICAgICAgICAgICAgICAgIGZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcyhzdWJwYXRoLCBwYWNrYWdlKQogICAgZmluYWxseToKICAgICAgICBfaW1wLnJlbGVhc2VfbG9jaygpCgoKZGVmIGZpbGVfbnNfaGFuZGxlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBwYWNrYWdlTmFtZSwgbW9kdWxlKToKICAgICIiIkNvbXB1dGUgYW4gbnMtcGFja2FnZSBzdWJwYXRoIGZvciBhIGZpbGVzeXN0ZW0gb3IgemlwZmlsZSBpbXBvcnRlciIiIgoKICAgIHN1YnBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBwYWNrYWdlTmFtZS5zcGxpdCgnLicpWy0xXSkKICAgIG5vcm1hbGl6ZWQgPSBfbm9ybWFsaXplX2NhY2hlZChzdWJwYXRoKQogICAgZm9yIGl0ZW0gaW4gbW9kdWxlLl9fcGF0aF9fOgogICAgICAgIGlmIF9ub3JtYWxpemVfY2FjaGVkKGl0ZW0pID09IG5vcm1hbGl6ZWQ6CiAgICAgICAgICAgIGJyZWFrCiAgICBlbHNlOgogICAgICAgICMgT25seSByZXR1cm4gdGhlIHBhdGggaWYgaXQncyBub3QgYWxyZWFkeSB0aGVyZQogICAgICAgIHJldHVybiBzdWJwYXRoCgoKcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIocGtndXRpbC5JbXBJbXBvcnRlciwgZmlsZV9uc19oYW5kbGVyKQpyZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcih6aXBpbXBvcnQuemlwaW1wb3J0ZXIsIGZpbGVfbnNfaGFuZGxlcikKCmlmIGhhc2F0dHIoaW1wb3J0bGliX21hY2hpbmVyeSwgJ0ZpbGVGaW5kZXInKToKICAgIHJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKGltcG9ydGxpYl9tYWNoaW5lcnkuRmlsZUZpbmRlciwgZmlsZV9uc19oYW5kbGVyKQoKCmRlZiBudWxsX25zX2hhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgcGFja2FnZU5hbWUsIG1vZHVsZSk6CiAgICByZXR1cm4gTm9uZQoKCnJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKG9iamVjdCwgbnVsbF9uc19oYW5kbGVyKQoKCmRlZiBub3JtYWxpemVfcGF0aChmaWxlbmFtZSk6CiAgICAiIiJOb3JtYWxpemUgYSBmaWxlL2RpciBuYW1lIGZvciBjb21wYXJpc29uIHB1cnBvc2VzIiIiCiAgICByZXR1cm4gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKGZpbGVuYW1lKSkKCgpkZWYgX25vcm1hbGl6ZV9jYWNoZWQoZmlsZW5hbWUsIF9jYWNoZT17fSk6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIF9jYWNoZVtmaWxlbmFtZV0KICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICBfY2FjaGVbZmlsZW5hbWVdID0gcmVzdWx0ID0gbm9ybWFsaXplX3BhdGgoZmlsZW5hbWUpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBfaXNfZWdnX3BhdGgocGF0aCk6CiAgICAiIiIKICAgIERldGVybWluZSBpZiBnaXZlbiBwYXRoIGFwcGVhcnMgdG8gYmUgYW4gZWdnLgogICAgIiIiCiAgICByZXR1cm4gcGF0aC5sb3dlcigpLmVuZHN3aXRoKCcuZWdnJykKCgpkZWYgX2lzX3VucGFja2VkX2VnZyhwYXRoKToKICAgICIiIgogICAgRGV0ZXJtaW5lIGlmIGdpdmVuIHBhdGggYXBwZWFycyB0byBiZSBhbiB1bnBhY2tlZCBlZ2cuCiAgICAiIiIKICAgIHJldHVybiAoCiAgICAgICAgX2lzX2VnZ19wYXRoKHBhdGgpIGFuZAogICAgICAgIG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihwYXRoLCAnRUdHLUlORk8nLCAnUEtHLUlORk8nKSkKICAgICkKCgpkZWYgX3NldF9wYXJlbnRfbnMocGFja2FnZU5hbWUpOgogICAgcGFydHMgPSBwYWNrYWdlTmFtZS5zcGxpdCgnLicpCiAgICBuYW1lID0gcGFydHMucG9wKCkKICAgIGlmIHBhcnRzOgogICAgICAgIHBhcmVudCA9ICcuJy5qb2luKHBhcnRzKQogICAgICAgIHNldGF0dHIoc3lzLm1vZHVsZXNbcGFyZW50XSwgbmFtZSwgc3lzLm1vZHVsZXNbcGFja2FnZU5hbWVdKQoKCmRlZiB5aWVsZF9saW5lcyhzdHJzKToKICAgICIiIllpZWxkIG5vbi1lbXB0eS9ub24tY29tbWVudCBsaW5lcyBvZiBhIHN0cmluZyBvciBzZXF1ZW5jZSIiIgogICAgaWYgaXNpbnN0YW5jZShzdHJzLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICBmb3IgcyBpbiBzdHJzLnNwbGl0bGluZXMoKToKICAgICAgICAgICAgcyA9IHMuc3RyaXAoKQogICAgICAgICAgICAjIHNraXAgYmxhbmsgbGluZXMvY29tbWVudHMKICAgICAgICAgICAgaWYgcyBhbmQgbm90IHMuc3RhcnRzd2l0aCgnIycpOgogICAgICAgICAgICAgICAgeWllbGQgcwogICAgZWxzZToKICAgICAgICBmb3Igc3MgaW4gc3RyczoKICAgICAgICAgICAgZm9yIHMgaW4geWllbGRfbGluZXMoc3MpOgogICAgICAgICAgICAgICAgeWllbGQgcwoKCk1PRFVMRSA9IHJlLmNvbXBpbGUociJcdysoXC5cdyspKiQiKS5tYXRjaApFR0dfTkFNRSA9IHJlLmNvbXBpbGUoCiAgICByIiIiCiAgICAoP1A8bmFtZT5bXi1dKykgKAogICAgICAgIC0oP1A8dmVyPlteLV0rKSAoCiAgICAgICAgICAgIC1weSg/UDxweXZlcj5bXi1dKykgKAogICAgICAgICAgICAgICAgLSg/UDxwbGF0Pi4rKQogICAgICAgICAgICApPwogICAgICAgICk/CiAgICApPwogICAgIiIiLAogICAgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UsCikubWF0Y2gKCgpjbGFzcyBFbnRyeVBvaW50KG9iamVjdCk6CiAgICAiIiJPYmplY3QgcmVwcmVzZW50aW5nIGFuIGFkdmVydGlzZWQgaW1wb3J0YWJsZSBvYmplY3QiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbW9kdWxlX25hbWUsIGF0dHJzPSgpLCBleHRyYXM9KCksIGRpc3Q9Tm9uZSk6CiAgICAgICAgaWYgbm90IE1PRFVMRShtb2R1bGVfbmFtZSk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgbW9kdWxlIG5hbWUiLCBtb2R1bGVfbmFtZSkKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5tb2R1bGVfbmFtZSA9IG1vZHVsZV9uYW1lCiAgICAgICAgc2VsZi5hdHRycyA9IHR1cGxlKGF0dHJzKQogICAgICAgIHNlbGYuZXh0cmFzID0gdHVwbGUoZXh0cmFzKQogICAgICAgIHNlbGYuZGlzdCA9IGRpc3QKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBzID0gIiVzID0gJXMiICUgKHNlbGYubmFtZSwgc2VsZi5tb2R1bGVfbmFtZSkKICAgICAgICBpZiBzZWxmLmF0dHJzOgogICAgICAgICAgICBzICs9ICc6JyArICcuJy5qb2luKHNlbGYuYXR0cnMpCiAgICAgICAgaWYgc2VsZi5leHRyYXM6CiAgICAgICAgICAgIHMgKz0gJyBbJXNdJyAlICcsJy5qb2luKHNlbGYuZXh0cmFzKQogICAgICAgIHJldHVybiBzCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiRW50cnlQb2ludC5wYXJzZSglcikiICUgc3RyKHNlbGYpCgogICAgZGVmIGxvYWQoc2VsZiwgcmVxdWlyZT1UcnVlLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIFJlcXVpcmUgcGFja2FnZXMgZm9yIHRoaXMgRW50cnlQb2ludCwgdGhlbiByZXNvbHZlIGl0LgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCByZXF1aXJlIG9yIGFyZ3Mgb3Iga3dhcmdzOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIlBhcmFtZXRlcnMgdG8gbG9hZCBhcmUgZGVwcmVjYXRlZC4gIENhbGwgLnJlc29sdmUgYW5kICIKICAgICAgICAgICAgICAgICIucmVxdWlyZSBzZXBhcmF0ZWx5LiIsCiAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsCiAgICAgICAgICAgICAgICBzdGFja2xldmVsPTIsCiAgICAgICAgICAgICkKICAgICAgICBpZiByZXF1aXJlOgogICAgICAgICAgICBzZWxmLnJlcXVpcmUoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHJldHVybiBzZWxmLnJlc29sdmUoKQoKICAgIGRlZiByZXNvbHZlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlc29sdmUgdGhlIGVudHJ5IHBvaW50IGZyb20gaXRzIG1vZHVsZSBhbmQgYXR0cnMuCiAgICAgICAgIiIiCiAgICAgICAgbW9kdWxlID0gX19pbXBvcnRfXyhzZWxmLm1vZHVsZV9uYW1lLCBmcm9tbGlzdD1bJ19fbmFtZV9fJ10sIGxldmVsPTApCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gZnVuY3Rvb2xzLnJlZHVjZShnZXRhdHRyLCBzZWxmLmF0dHJzLCBtb2R1bGUpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yIGFzIGV4YzoKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3Ioc3RyKGV4YykpCgogICAgZGVmIHJlcXVpcmUoc2VsZiwgZW52PU5vbmUsIGluc3RhbGxlcj1Ob25lKToKICAgICAgICBpZiBzZWxmLmV4dHJhcyBhbmQgbm90IHNlbGYuZGlzdDoKICAgICAgICAgICAgcmFpc2UgVW5rbm93bkV4dHJhKCJDYW4ndCByZXF1aXJlKCkgd2l0aG91dCBhIGRpc3RyaWJ1dGlvbiIsIHNlbGYpCgogICAgICAgICMgR2V0IHRoZSByZXF1aXJlbWVudHMgZm9yIHRoaXMgZW50cnkgcG9pbnQgd2l0aCBhbGwgaXRzIGV4dHJhcyBhbmQKICAgICAgICAjIHRoZW4gcmVzb2x2ZSB0aGVtLiBXZSBoYXZlIHRvIHBhc3MgYGV4dHJhc2AgYWxvbmcgd2hlbiByZXNvbHZpbmcgc28KICAgICAgICAjIHRoYXQgdGhlIHdvcmtpbmcgc2V0IGtub3dzIHdoYXQgZXh0cmFzIHdlIHdhbnQuIE90aGVyd2lzZSwgZm9yCiAgICAgICAgIyBkaXN0LWluZm8gZGlzdHJpYnV0aW9ucywgdGhlIHdvcmtpbmcgc2V0IHdpbGwgYXNzdW1lIHRoYXQgdGhlCiAgICAgICAgIyByZXF1aXJlbWVudHMgZm9yIHRoYXQgZXh0cmEgYXJlIHB1cmVseSBvcHRpb25hbCBhbmQgc2tpcCBvdmVyIHRoZW0uCiAgICAgICAgcmVxcyA9IHNlbGYuZGlzdC5yZXF1aXJlcyhzZWxmLmV4dHJhcykKICAgICAgICBpdGVtcyA9IHdvcmtpbmdfc2V0LnJlc29sdmUocmVxcywgZW52LCBpbnN0YWxsZXIsIGV4dHJhcz1zZWxmLmV4dHJhcykKICAgICAgICBsaXN0KG1hcCh3b3JraW5nX3NldC5hZGQsIGl0ZW1zKSkKCiAgICBwYXR0ZXJuID0gcmUuY29tcGlsZSgKICAgICAgICByJ1xzKicKICAgICAgICByJyg/UDxuYW1lPi4rPylccyonCiAgICAgICAgcic9XHMqJwogICAgICAgIHInKD9QPG1vZHVsZT5bXHcuXSspXHMqJwogICAgICAgIHInKDpccyooP1A8YXR0cj5bXHcuXSspKT9ccyonCiAgICAgICAgcicoP1A8ZXh0cmFzPlxbLipcXSk/XHMqJCcKICAgICkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBwYXJzZShjbHMsIHNyYywgZGlzdD1Ob25lKToKICAgICAgICAiIiJQYXJzZSBhIHNpbmdsZSBlbnRyeSBwb2ludCBmcm9tIHN0cmluZyBgc3JjYAoKICAgICAgICBFbnRyeSBwb2ludCBzeW50YXggZm9sbG93cyB0aGUgZm9ybTo6CgogICAgICAgICAgICBuYW1lID0gc29tZS5tb2R1bGU6c29tZS5hdHRyIFtleHRyYTEsIGV4dHJhMl0KCiAgICAgICAgVGhlIGVudHJ5IG5hbWUgYW5kIG1vZHVsZSBuYW1lIGFyZSByZXF1aXJlZCwgYnV0IHRoZSBgYDphdHRyc2BgIGFuZAogICAgICAgIGBgW2V4dHJhc11gYCBwYXJ0cyBhcmUgb3B0aW9uYWwKICAgICAgICAiIiIKICAgICAgICBtID0gY2xzLnBhdHRlcm4ubWF0Y2goc3JjKQogICAgICAgIGlmIG5vdCBtOgogICAgICAgICAgICBtc2cgPSAiRW50cnlQb2ludCBtdXN0IGJlIGluICduYW1lPW1vZHVsZTphdHRycyBbZXh0cmFzXScgZm9ybWF0IgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZywgc3JjKQogICAgICAgIHJlcyA9IG0uZ3JvdXBkaWN0KCkKICAgICAgICBleHRyYXMgPSBjbHMuX3BhcnNlX2V4dHJhcyhyZXNbJ2V4dHJhcyddKQogICAgICAgIGF0dHJzID0gcmVzWydhdHRyJ10uc3BsaXQoJy4nKSBpZiByZXNbJ2F0dHInXSBlbHNlICgpCiAgICAgICAgcmV0dXJuIGNscyhyZXNbJ25hbWUnXSwgcmVzWydtb2R1bGUnXSwgYXR0cnMsIGV4dHJhcywgZGlzdCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2VfZXh0cmFzKGNscywgZXh0cmFzX3NwZWMpOgogICAgICAgIGlmIG5vdCBleHRyYXNfc3BlYzoKICAgICAgICAgICAgcmV0dXJuICgpCiAgICAgICAgcmVxID0gUmVxdWlyZW1lbnQucGFyc2UoJ3gnICsgZXh0cmFzX3NwZWMpCiAgICAgICAgaWYgcmVxLnNwZWNzOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCkKICAgICAgICByZXR1cm4gcmVxLmV4dHJhcwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHBhcnNlX2dyb3VwKGNscywgZ3JvdXAsIGxpbmVzLCBkaXN0PU5vbmUpOgogICAgICAgICIiIlBhcnNlIGFuIGVudHJ5IHBvaW50IGdyb3VwIiIiCiAgICAgICAgaWYgbm90IE1PRFVMRShncm91cCk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgZ3JvdXAgbmFtZSIsIGdyb3VwKQogICAgICAgIHRoaXMgPSB7fQogICAgICAgIGZvciBsaW5lIGluIHlpZWxkX2xpbmVzKGxpbmVzKToKICAgICAgICAgICAgZXAgPSBjbHMucGFyc2UobGluZSwgZGlzdCkKICAgICAgICAgICAgaWYgZXAubmFtZSBpbiB0aGlzOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRHVwbGljYXRlIGVudHJ5IHBvaW50IiwgZ3JvdXAsIGVwLm5hbWUpCiAgICAgICAgICAgIHRoaXNbZXAubmFtZV0gPSBlcAogICAgICAgIHJldHVybiB0aGlzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgcGFyc2VfbWFwKGNscywgZGF0YSwgZGlzdD1Ob25lKToKICAgICAgICAiIiJQYXJzZSBhIG1hcCBvZiBlbnRyeSBwb2ludCBncm91cHMiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIGRpY3QpOgogICAgICAgICAgICBkYXRhID0gZGF0YS5pdGVtcygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGF0YSA9IHNwbGl0X3NlY3Rpb25zKGRhdGEpCiAgICAgICAgbWFwcyA9IHt9CiAgICAgICAgZm9yIGdyb3VwLCBsaW5lcyBpbiBkYXRhOgogICAgICAgICAgICBpZiBncm91cCBpcyBOb25lOgogICAgICAgICAgICAgICAgaWYgbm90IGxpbmVzOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJFbnRyeSBwb2ludHMgbXVzdCBiZSBsaXN0ZWQgaW4gZ3JvdXBzIikKICAgICAgICAgICAgZ3JvdXAgPSBncm91cC5zdHJpcCgpCiAgICAgICAgICAgIGlmIGdyb3VwIGluIG1hcHM6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEdXBsaWNhdGUgZ3JvdXAgbmFtZSIsIGdyb3VwKQogICAgICAgICAgICBtYXBzW2dyb3VwXSA9IGNscy5wYXJzZV9ncm91cChncm91cCwgbGluZXMsIGRpc3QpCiAgICAgICAgcmV0dXJuIG1hcHMKCgpkZWYgX3JlbW92ZV9tZDVfZnJhZ21lbnQobG9jYXRpb24pOgogICAgaWYgbm90IGxvY2F0aW9uOgogICAgICAgIHJldHVybiAnJwogICAgcGFyc2VkID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKGxvY2F0aW9uKQogICAgaWYgcGFyc2VkWy0xXS5zdGFydHN3aXRoKCdtZDU9Jyk6CiAgICAgICAgcmV0dXJuIHVybGxpYi5wYXJzZS51cmx1bnBhcnNlKHBhcnNlZFs6LTFdICsgKCcnLCkpCiAgICByZXR1cm4gbG9jYXRpb24KCgpkZWYgX3ZlcnNpb25fZnJvbV9maWxlKGxpbmVzKToKICAgICIiIgogICAgR2l2ZW4gYW4gaXRlcmFibGUgb2YgbGluZXMgZnJvbSBhIE1ldGFkYXRhIGZpbGUsIHJldHVybgogICAgdGhlIHZhbHVlIG9mIHRoZSBWZXJzaW9uIGZpZWxkLCBpZiBwcmVzZW50LCBvciBOb25lIG90aGVyd2lzZS4KICAgICIiIgogICAgaXNfdmVyc2lvbl9saW5lID0gbGFtYmRhIGxpbmU6IGxpbmUubG93ZXIoKS5zdGFydHN3aXRoKCd2ZXJzaW9uOicpCiAgICB2ZXJzaW9uX2xpbmVzID0gZmlsdGVyKGlzX3ZlcnNpb25fbGluZSwgbGluZXMpCiAgICBsaW5lID0gbmV4dChpdGVyKHZlcnNpb25fbGluZXMpLCAnJykKICAgIF8sIF8sIHZhbHVlID0gbGluZS5wYXJ0aXRpb24oJzonKQogICAgcmV0dXJuIHNhZmVfdmVyc2lvbih2YWx1ZS5zdHJpcCgpKSBvciBOb25lCgoKY2xhc3MgRGlzdHJpYnV0aW9uKG9iamVjdCk6CiAgICAiIiJXcmFwIGFuIGFjdHVhbCBvciBwb3RlbnRpYWwgc3lzLnBhdGggZW50cnkgdy9tZXRhZGF0YSIiIgogICAgUEtHX0lORk8gPSAnUEtHLUlORk8nCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgICAgICBzZWxmLCBsb2NhdGlvbj1Ob25lLCBtZXRhZGF0YT1Ob25lLCBwcm9qZWN0X25hbWU9Tm9uZSwKICAgICAgICAgICAgdmVyc2lvbj1Ob25lLCBweV92ZXJzaW9uPVBZX01BSk9SLCBwbGF0Zm9ybT1Ob25lLAogICAgICAgICAgICBwcmVjZWRlbmNlPUVHR19ESVNUKToKICAgICAgICBzZWxmLnByb2plY3RfbmFtZSA9IHNhZmVfbmFtZShwcm9qZWN0X25hbWUgb3IgJ1Vua25vd24nKQogICAgICAgIGlmIHZlcnNpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24gPSBzYWZlX3ZlcnNpb24odmVyc2lvbikKICAgICAgICBzZWxmLnB5X3ZlcnNpb24gPSBweV92ZXJzaW9uCiAgICAgICAgc2VsZi5wbGF0Zm9ybSA9IHBsYXRmb3JtCiAgICAgICAgc2VsZi5sb2NhdGlvbiA9IGxvY2F0aW9uCiAgICAgICAgc2VsZi5wcmVjZWRlbmNlID0gcHJlY2VkZW5jZQogICAgICAgIHNlbGYuX3Byb3ZpZGVyID0gbWV0YWRhdGEgb3IgZW1wdHlfcHJvdmlkZXIKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2xvY2F0aW9uKGNscywgbG9jYXRpb24sIGJhc2VuYW1lLCBtZXRhZGF0YT1Ob25lLCAqKmt3KToKICAgICAgICBwcm9qZWN0X25hbWUsIHZlcnNpb24sIHB5X3ZlcnNpb24sIHBsYXRmb3JtID0gW05vbmVdICogNAogICAgICAgIGJhc2VuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGJhc2VuYW1lKQogICAgICAgIGlmIGV4dC5sb3dlcigpIGluIF9kaXN0cmlidXRpb25JbXBsOgogICAgICAgICAgICBjbHMgPSBfZGlzdHJpYnV0aW9uSW1wbFtleHQubG93ZXIoKV0KCiAgICAgICAgICAgIG1hdGNoID0gRUdHX05BTUUoYmFzZW5hbWUpCiAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgcHJvamVjdF9uYW1lLCB2ZXJzaW9uLCBweV92ZXJzaW9uLCBwbGF0Zm9ybSA9IG1hdGNoLmdyb3VwKAogICAgICAgICAgICAgICAgICAgICduYW1lJywgJ3ZlcicsICdweXZlcicsICdwbGF0JwogICAgICAgICAgICAgICAgKQogICAgICAgIHJldHVybiBjbHMoCiAgICAgICAgICAgIGxvY2F0aW9uLCBtZXRhZGF0YSwgcHJvamVjdF9uYW1lPXByb2plY3RfbmFtZSwgdmVyc2lvbj12ZXJzaW9uLAogICAgICAgICAgICBweV92ZXJzaW9uPXB5X3ZlcnNpb24sIHBsYXRmb3JtPXBsYXRmb3JtLCAqKmt3CiAgICAgICAgKS5fcmVsb2FkX3ZlcnNpb24oKQoKICAgIGRlZiBfcmVsb2FkX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBAcHJvcGVydHkKICAgIGRlZiBoYXNoY21wKHNlbGYpOgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIHNlbGYucGFyc2VkX3ZlcnNpb24sCiAgICAgICAgICAgIHNlbGYucHJlY2VkZW5jZSwKICAgICAgICAgICAgc2VsZi5rZXksCiAgICAgICAgICAgIF9yZW1vdmVfbWQ1X2ZyYWdtZW50KHNlbGYubG9jYXRpb24pLAogICAgICAgICAgICBzZWxmLnB5X3ZlcnNpb24gb3IgJycsCiAgICAgICAgICAgIHNlbGYucGxhdGZvcm0gb3IgJycsCiAgICAgICAgKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLmhhc2hjbXApCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA8IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wIDw9IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wID4gb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPj0gb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CiAgICAgICAgICAgICMgSXQncyBub3QgYSBEaXN0cmlidXRpb24sIHNvIHRoZXkgYXJlIG5vdCBlcXVhbAogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wID09IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKCiAgICAjIFRoZXNlIHByb3BlcnRpZXMgaGF2ZSB0byBiZSBsYXp5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBsb2FkIGFueQogICAgIyBtZXRhZGF0YSB1bnRpbC91bmxlc3MgaXQncyBhY3R1YWxseSBuZWVkZWQuICAoaS5lLiwgc29tZSBkaXN0cmlidXRpb25zCiAgICAjIG1heSBub3Qga25vdyB0aGVpciBuYW1lIG9yIHZlcnNpb24gd2l0aG91dCBsb2FkaW5nIFBLRy1JTkZPKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGtleShzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9rZXkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHNlbGYuX2tleSA9IGtleSA9IHNlbGYucHJvamVjdF9uYW1lLmxvd2VyKCkKICAgICAgICAgICAgcmV0dXJuIGtleQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhcnNlZF92ZXJzaW9uKHNlbGYpOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICJfcGFyc2VkX3ZlcnNpb24iKToKICAgICAgICAgICAgc2VsZi5fcGFyc2VkX3ZlcnNpb24gPSBwYXJzZV92ZXJzaW9uKHNlbGYudmVyc2lvbikKCiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlZF92ZXJzaW9uCgogICAgZGVmIF93YXJuX2xlZ2FjeV92ZXJzaW9uKHNlbGYpOgogICAgICAgIExWID0gcGFja2FnaW5nLnZlcnNpb24uTGVnYWN5VmVyc2lvbgogICAgICAgIGlzX2xlZ2FjeSA9IGlzaW5zdGFuY2Uoc2VsZi5fcGFyc2VkX3ZlcnNpb24sIExWKQogICAgICAgIGlmIG5vdCBpc19sZWdhY3k6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFdoaWxlIGFuIGVtcHR5IHZlcnNpb24gaXMgdGVjaG5pY2FsbHkgYSBsZWdhY3kgdmVyc2lvbiBhbmQKICAgICAgICAjIGlzIG5vdCBhIHZhbGlkIFBFUCA0NDAgdmVyc2lvbiwgaXQncyBhbHNvIHVubGlrZWx5IHRvCiAgICAgICAgIyBhY3R1YWxseSBjb21lIGZyb20gc29tZW9uZSBhbmQgaW5zdGVhZCBpdCBpcyBtb3JlIGxpa2VseSB0aGF0CiAgICAgICAgIyBpdCBjb21lcyBmcm9tIHNldHVwdG9vbHMgYXR0ZW1wdGluZyB0byBwYXJzZSBhIGZpbGVuYW1lIGFuZAogICAgICAgICMgaW5jbHVkaW5nIGl0IGluIHRoZSBsaXN0LiBTbyBmb3IgdGhhdCB3ZSdsbCBnYXRlIHRoaXMgd2FybmluZwogICAgICAgICMgb24gaWYgdGhlIHZlcnNpb24gaXMgYW55dGhpbmcgYXQgYWxsIG9yIG5vdC4KICAgICAgICBpZiBub3Qgc2VsZi52ZXJzaW9uOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgdG1wbCA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICAgICAgJ3twcm9qZWN0X25hbWV9ICh7dmVyc2lvbn0pJyBpcyBiZWluZyBwYXJzZWQgYXMgYSBsZWdhY3ksCiAgICAgICAgICAgIG5vbiBQRVAgNDQwLAogICAgICAgICAgICB2ZXJzaW9uLiBZb3UgbWF5IGZpbmQgb2RkIGJlaGF2aW9yIGFuZCBzb3J0IG9yZGVyLgogICAgICAgICAgICBJbiBwYXJ0aWN1bGFyIGl0IHdpbGwgYmUgc29ydGVkIGFzIGxlc3MgdGhhbiAwLjAuIEl0CiAgICAgICAgICAgIGlzIHJlY29tbWVuZGVkIHRvIG1pZ3JhdGUgdG8gUEVQIDQ0MCBjb21wYXRpYmxlCiAgICAgICAgICAgIHZlcnNpb25zLgogICAgICAgICAgICAiIiIpLnN0cmlwKCkucmVwbGFjZSgnXG4nLCAnICcpCgogICAgICAgIHdhcm5pbmdzLndhcm4odG1wbC5mb3JtYXQoKip2YXJzKHNlbGYpKSwgUEVQNDQwV2FybmluZykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2ZXJzaW9uKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHZlcnNpb24gPSBfdmVyc2lvbl9mcm9tX2ZpbGUoc2VsZi5fZ2V0X21ldGFkYXRhKHNlbGYuUEtHX0lORk8pKQogICAgICAgICAgICBpZiB2ZXJzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgICAgICB0bXBsID0gIk1pc3NpbmcgJ1ZlcnNpb246JyBoZWFkZXIgYW5kL29yICVzIGZpbGUiCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKHRtcGwgJSBzZWxmLlBLR19JTkZPLCBzZWxmKQogICAgICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9kZXBfbWFwKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kZXBfbWFwCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBkbSA9IHNlbGYuX19kZXBfbWFwID0ge05vbmU6IFtdfQogICAgICAgICAgICBmb3IgbmFtZSBpbiAncmVxdWlyZXMudHh0JywgJ2RlcGVuZHMudHh0JzoKICAgICAgICAgICAgICAgIGZvciBleHRyYSwgcmVxcyBpbiBzcGxpdF9zZWN0aW9ucyhzZWxmLl9nZXRfbWV0YWRhdGEobmFtZSkpOgogICAgICAgICAgICAgICAgICAgIGlmIGV4dHJhOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAnOicgaW4gZXh0cmE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYSwgbWFya2VyID0gZXh0cmEuc3BsaXQoJzonLCAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaW52YWxpZF9tYXJrZXIobWFya2VyKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFhYWCB3YXJuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxcyA9IFtdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIG5vdCBldmFsdWF0ZV9tYXJrZXIobWFya2VyKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFzID0gW10KICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEgPSBzYWZlX2V4dHJhKGV4dHJhKSBvciBOb25lCiAgICAgICAgICAgICAgICAgICAgZG0uc2V0ZGVmYXVsdChleHRyYSwgW10pLmV4dGVuZChwYXJzZV9yZXF1aXJlbWVudHMocmVxcykpCiAgICAgICAgICAgIHJldHVybiBkbQoKICAgIGRlZiByZXF1aXJlcyhzZWxmLCBleHRyYXM9KCkpOgogICAgICAgICIiIkxpc3Qgb2YgUmVxdWlyZW1lbnRzIG5lZWRlZCBmb3IgdGhpcyBkaXN0cm8gaWYgYGV4dHJhc2AgYXJlIHVzZWQiIiIKICAgICAgICBkbSA9IHNlbGYuX2RlcF9tYXAKICAgICAgICBkZXBzID0gW10KICAgICAgICBkZXBzLmV4dGVuZChkbS5nZXQoTm9uZSwgKCkpKQogICAgICAgIGZvciBleHQgaW4gZXh0cmFzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBkZXBzLmV4dGVuZChkbVtzYWZlX2V4dHJhKGV4dCldKQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBVbmtub3duRXh0cmEoCiAgICAgICAgICAgICAgICAgICAgIiVzIGhhcyBubyBzdWNoIGV4dHJhIGZlYXR1cmUgJXIiICUgKHNlbGYsIGV4dCkKICAgICAgICAgICAgICAgICkKICAgICAgICByZXR1cm4gZGVwcwoKICAgIGRlZiBfZ2V0X21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIHNlbGYuaGFzX21ldGFkYXRhKG5hbWUpOgogICAgICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmdldF9tZXRhZGF0YV9saW5lcyhuYW1lKToKICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKCiAgICBkZWYgYWN0aXZhdGUoc2VsZiwgcGF0aD1Ob25lLCByZXBsYWNlPUZhbHNlKToKICAgICAgICAiIiJFbnN1cmUgZGlzdHJpYnV0aW9uIGlzIGltcG9ydGFibGUgb24gYHBhdGhgIChkZWZhdWx0PXN5cy5wYXRoKSIiIgogICAgICAgIGlmIHBhdGggaXMgTm9uZToKICAgICAgICAgICAgcGF0aCA9IHN5cy5wYXRoCiAgICAgICAgc2VsZi5pbnNlcnRfb24ocGF0aCwgcmVwbGFjZT1yZXBsYWNlKQogICAgICAgIGlmIHBhdGggaXMgc3lzLnBhdGg6CiAgICAgICAgICAgIGZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcyhzZWxmLmxvY2F0aW9uKQogICAgICAgICAgICBmb3IgcGtnIGluIHNlbGYuX2dldF9tZXRhZGF0YSgnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpOgogICAgICAgICAgICAgICAgaWYgcGtnIGluIHN5cy5tb2R1bGVzOgogICAgICAgICAgICAgICAgICAgIGRlY2xhcmVfbmFtZXNwYWNlKHBrZykKCiAgICBkZWYgZWdnX25hbWUoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHdoYXQgdGhpcyBkaXN0cmlidXRpb24ncyBzdGFuZGFyZCAuZWdnIGZpbGVuYW1lIHNob3VsZCBiZSIiIgogICAgICAgIGZpbGVuYW1lID0gIiVzLSVzLXB5JXMiICUgKAogICAgICAgICAgICB0b19maWxlbmFtZShzZWxmLnByb2plY3RfbmFtZSksIHRvX2ZpbGVuYW1lKHNlbGYudmVyc2lvbiksCiAgICAgICAgICAgIHNlbGYucHlfdmVyc2lvbiBvciBQWV9NQUpPUgogICAgICAgICkKCiAgICAgICAgaWYgc2VsZi5wbGF0Zm9ybToKICAgICAgICAgICAgZmlsZW5hbWUgKz0gJy0nICsgc2VsZi5wbGF0Zm9ybQogICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICBpZiBzZWxmLmxvY2F0aW9uOgogICAgICAgICAgICByZXR1cm4gIiVzICglcykiICUgKHNlbGYsIHNlbGYubG9jYXRpb24pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgdmVyc2lvbiA9IGdldGF0dHIoc2VsZiwgJ3ZlcnNpb24nLCBOb25lKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICB2ZXJzaW9uID0gTm9uZQogICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uIG9yICJbdW5rbm93biB2ZXJzaW9uXSIKICAgICAgICByZXR1cm4gIiVzICVzIiAlIChzZWxmLnByb2plY3RfbmFtZSwgdmVyc2lvbikKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CiAgICAgICAgIiIiRGVsZWdhdGUgYWxsIHVucmVjb2duaXplZCBwdWJsaWMgYXR0cmlidXRlcyB0byAubWV0YWRhdGEgcHJvdmlkZXIiIiIKICAgICAgICBpZiBhdHRyLnN0YXJ0c3dpdGgoJ18nKToKICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoYXR0cikKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9wcm92aWRlciwgYXR0cikKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2ZpbGVuYW1lKGNscywgZmlsZW5hbWUsIG1ldGFkYXRhPU5vbmUsICoqa3cpOgogICAgICAgIHJldHVybiBjbHMuZnJvbV9sb2NhdGlvbigKICAgICAgICAgICAgX25vcm1hbGl6ZV9jYWNoZWQoZmlsZW5hbWUpLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSwgbWV0YWRhdGEsCiAgICAgICAgICAgICoqa3cKICAgICAgICApCgogICAgZGVmIGFzX3JlcXVpcmVtZW50KHNlbGYpOgogICAgICAgICIiIlJldHVybiBhIGBgUmVxdWlyZW1lbnRgYCB0aGF0IG1hdGNoZXMgdGhpcyBkaXN0cmlidXRpb24gZXhhY3RseSIiIgogICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5wYXJzZWRfdmVyc2lvbiwgcGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbik6CiAgICAgICAgICAgIHNwZWMgPSAiJXM9PSVzIiAlIChzZWxmLnByb2plY3RfbmFtZSwgc2VsZi5wYXJzZWRfdmVyc2lvbikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzcGVjID0gIiVzPT09JXMiICUgKHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLnBhcnNlZF92ZXJzaW9uKQoKICAgICAgICByZXR1cm4gUmVxdWlyZW1lbnQucGFyc2Uoc3BlYykKCiAgICBkZWYgbG9hZF9lbnRyeV9wb2ludChzZWxmLCBncm91cCwgbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBgbmFtZWAgZW50cnkgcG9pbnQgb2YgYGdyb3VwYCBvciByYWlzZSBJbXBvcnRFcnJvciIiIgogICAgICAgIGVwID0gc2VsZi5nZXRfZW50cnlfaW5mbyhncm91cCwgbmFtZSkKICAgICAgICBpZiBlcCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiRW50cnkgcG9pbnQgJXIgbm90IGZvdW5kIiAlICgoZ3JvdXAsIG5hbWUpLCkpCiAgICAgICAgcmV0dXJuIGVwLmxvYWQoKQoKICAgIGRlZiBnZXRfZW50cnlfbWFwKHNlbGYsIGdyb3VwPU5vbmUpOgogICAgICAgICIiIlJldHVybiB0aGUgZW50cnkgcG9pbnQgbWFwIGZvciBgZ3JvdXBgLCBvciB0aGUgZnVsbCBlbnRyeSBtYXAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGVwX21hcCA9IHNlbGYuX2VwX21hcAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgZXBfbWFwID0gc2VsZi5fZXBfbWFwID0gRW50cnlQb2ludC5wYXJzZV9tYXAoCiAgICAgICAgICAgICAgICBzZWxmLl9nZXRfbWV0YWRhdGEoJ2VudHJ5X3BvaW50cy50eHQnKSwgc2VsZgogICAgICAgICAgICApCiAgICAgICAgaWYgZ3JvdXAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBlcF9tYXAuZ2V0KGdyb3VwLCB7fSkKICAgICAgICByZXR1cm4gZXBfbWFwCgogICAgZGVmIGdldF9lbnRyeV9pbmZvKHNlbGYsIGdyb3VwLCBuYW1lKToKICAgICAgICAiIiJSZXR1cm4gdGhlIEVudHJ5UG9pbnQgb2JqZWN0IGZvciBgZ3JvdXBgK2BuYW1lYCwgb3IgYGBOb25lYGAiIiIKICAgICAgICByZXR1cm4gc2VsZi5nZXRfZW50cnlfbWFwKGdyb3VwKS5nZXQobmFtZSkKCiAgICBkZWYgaW5zZXJ0X29uKHNlbGYsIHBhdGgsIGxvYz1Ob25lLCByZXBsYWNlPUZhbHNlKToKICAgICAgICAiIiJFbnN1cmUgc2VsZi5sb2NhdGlvbiBpcyBvbiBwYXRoCgogICAgICAgIElmIHJlcGxhY2U9RmFsc2UgKGRlZmF1bHQpOgogICAgICAgICAgICAtIElmIGxvY2F0aW9uIGlzIGFscmVhZHkgaW4gcGF0aCBhbnl3aGVyZSwgZG8gbm90aGluZy4KICAgICAgICAgICAgLSBFbHNlOgogICAgICAgICAgICAgIC0gSWYgaXQncyBhbiBlZ2cgYW5kIGl0cyBwYXJlbnQgZGlyZWN0b3J5IGlzIG9uIHBhdGgsCiAgICAgICAgICAgICAgICBpbnNlcnQganVzdCBhaGVhZCBvZiB0aGUgcGFyZW50LgogICAgICAgICAgICAgIC0gRWxzZTogYWRkIHRvIHRoZSBlbmQgb2YgcGF0aC4KICAgICAgICBJZiByZXBsYWNlPVRydWU6CiAgICAgICAgICAgIC0gSWYgbG9jYXRpb24gaXMgYWxyZWFkeSBvbiBwYXRoIGFueXdoZXJlIChub3QgZWdncykKICAgICAgICAgICAgICBvciBoaWdoZXIgcHJpb3JpdHkgdGhhbiBpdHMgcGFyZW50IChlZ2dzKQogICAgICAgICAgICAgIGRvIG5vdGhpbmcuCiAgICAgICAgICAgIC0gRWxzZToKICAgICAgICAgICAgICAtIElmIGl0J3MgYW4gZWdnIGFuZCBpdHMgcGFyZW50IGRpcmVjdG9yeSBpcyBvbiBwYXRoLAogICAgICAgICAgICAgICAgaW5zZXJ0IGp1c3QgYWhlYWQgb2YgdGhlIHBhcmVudCwKICAgICAgICAgICAgICAgIHJlbW92aW5nIGFueSBsb3dlci1wcmlvcml0eSBlbnRyaWVzLgogICAgICAgICAgICAgIC0gRWxzZTogYWRkIGl0IHRvIHRoZSBmcm9udCBvZiBwYXRoLgogICAgICAgICIiIgoKICAgICAgICBsb2MgPSBsb2Mgb3Igc2VsZi5sb2NhdGlvbgogICAgICAgIGlmIG5vdCBsb2M6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBubG9jID0gX25vcm1hbGl6ZV9jYWNoZWQobG9jKQogICAgICAgIGJkaXIgPSBvcy5wYXRoLmRpcm5hbWUobmxvYykKICAgICAgICBucGF0aCA9IFsocCBhbmQgX25vcm1hbGl6ZV9jYWNoZWQocCkgb3IgcCkgZm9yIHAgaW4gcGF0aF0KCiAgICAgICAgZm9yIHAsIGl0ZW0gaW4gZW51bWVyYXRlKG5wYXRoKToKICAgICAgICAgICAgaWYgaXRlbSA9PSBubG9jOgogICAgICAgICAgICAgICAgaWYgcmVwbGFjZToKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIGRvbid0IG1vZGlmeSBwYXRoIChldmVuIHJlbW92aW5nIGR1cGxpY2F0ZXMpIGlmCiAgICAgICAgICAgICAgICAgICAgIyBmb3VuZCBhbmQgbm90IHJlcGxhY2UKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZWxpZiBpdGVtID09IGJkaXIgYW5kIHNlbGYucHJlY2VkZW5jZSA9PSBFR0dfRElTVDoKICAgICAgICAgICAgICAgICMgaWYgaXQncyBhbiAuZWdnLCBnaXZlIGl0IHByZWNlZGVuY2Ugb3ZlciBpdHMgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAjIFVOTEVTUyBpdCdzIGFscmVhZHkgYmVlbiBhZGRlZCB0byBzeXMucGF0aCBhbmQgcmVwbGFjZT1GYWxzZQogICAgICAgICAgICAgICAgaWYgKG5vdCByZXBsYWNlKSBhbmQgbmxvYyBpbiBucGF0aFtwOl06CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiBwYXRoIGlzIHN5cy5wYXRoOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl9jb25mbGljdCgpCiAgICAgICAgICAgICAgICBwYXRoLmluc2VydChwLCBsb2MpCiAgICAgICAgICAgICAgICBucGF0aC5pbnNlcnQocCwgbmxvYykKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgcGF0aCBpcyBzeXMucGF0aDoKICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl9jb25mbGljdCgpCiAgICAgICAgICAgIGlmIHJlcGxhY2U6CiAgICAgICAgICAgICAgICBwYXRoLmluc2VydCgwLCBsb2MpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZChsb2MpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIHAgaXMgdGhlIHNwb3Qgd2hlcmUgd2UgZm91bmQgb3IgaW5zZXJ0ZWQgbG9jOyBub3cgcmVtb3ZlIGR1cGxpY2F0ZXMKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBucCA9IG5wYXRoLmluZGV4KG5sb2MsIHAgKyAxKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBkZWwgbnBhdGhbbnBdLCBwYXRoW25wXQogICAgICAgICAgICAgICAgIyBoYSEKICAgICAgICAgICAgICAgIHAgPSBucAoKICAgICAgICByZXR1cm4KCiAgICBkZWYgY2hlY2tfdmVyc2lvbl9jb25mbGljdChzZWxmKToKICAgICAgICBpZiBzZWxmLmtleSA9PSAnc2V0dXB0b29scyc6CiAgICAgICAgICAgICMgaWdub3JlIHRoZSBpbmV2aXRhYmxlIHNldHVwdG9vbHMgc2VsZi1jb25mbGljdHMgIDooCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBuc3AgPSBkaWN0LmZyb21rZXlzKHNlbGYuX2dldF9tZXRhZGF0YSgnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpKQogICAgICAgIGxvYyA9IG5vcm1hbGl6ZV9wYXRoKHNlbGYubG9jYXRpb24pCiAgICAgICAgZm9yIG1vZG5hbWUgaW4gc2VsZi5fZ2V0X21ldGFkYXRhKCd0b3BfbGV2ZWwudHh0Jyk6CiAgICAgICAgICAgIGlmIChtb2RuYW1lIG5vdCBpbiBzeXMubW9kdWxlcyBvciBtb2RuYW1lIGluIG5zcAogICAgICAgICAgICAgICAgICAgIG9yIG1vZG5hbWUgaW4gX25hbWVzcGFjZV9wYWNrYWdlcyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBtb2RuYW1lIGluICgncGtnX3Jlc291cmNlcycsICdzZXR1cHRvb2xzJywgJ3NpdGUnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGZuID0gZ2V0YXR0cihzeXMubW9kdWxlc1ttb2RuYW1lXSwgJ19fZmlsZV9fJywgTm9uZSkKICAgICAgICAgICAgaWYgZm4gYW5kIChub3JtYWxpemVfcGF0aChmbikuc3RhcnRzd2l0aChsb2MpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgZm4uc3RhcnRzd2l0aChzZWxmLmxvY2F0aW9uKSk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpc3N1ZV93YXJuaW5nKAogICAgICAgICAgICAgICAgIk1vZHVsZSAlcyB3YXMgYWxyZWFkeSBpbXBvcnRlZCBmcm9tICVzLCBidXQgJXMgaXMgYmVpbmcgYWRkZWQiCiAgICAgICAgICAgICAgICAiIHRvIHN5cy5wYXRoIiAlIChtb2RuYW1lLCBmbiwgc2VsZi5sb2NhdGlvbiksCiAgICAgICAgICAgICkKCiAgICBkZWYgaGFzX3ZlcnNpb24oc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnZlcnNpb24KICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgaXNzdWVfd2FybmluZygiVW5idWlsdCBlZ2cgZm9yICIgKyByZXByKHNlbGYpKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjbG9uZShzZWxmLCAqKmt3KToKICAgICAgICAiIiJDb3B5IHRoaXMgZGlzdHJpYnV0aW9uLCBzdWJzdGl0dXRpbmcgaW4gYW55IGNoYW5nZWQga2V5d29yZCBhcmdzIiIiCiAgICAgICAgbmFtZXMgPSAncHJvamVjdF9uYW1lIHZlcnNpb24gcHlfdmVyc2lvbiBwbGF0Zm9ybSBsb2NhdGlvbiBwcmVjZWRlbmNlJwogICAgICAgIGZvciBhdHRyIGluIG5hbWVzLnNwbGl0KCk6CiAgICAgICAgICAgIGt3LnNldGRlZmF1bHQoYXR0ciwgZ2V0YXR0cihzZWxmLCBhdHRyLCBOb25lKSkKICAgICAgICBrdy5zZXRkZWZhdWx0KCdtZXRhZGF0YScsIHNlbGYuX3Byb3ZpZGVyKQogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXygqKmt3KQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGV4dHJhcyhzZWxmKToKICAgICAgICByZXR1cm4gW2RlcCBmb3IgZGVwIGluIHNlbGYuX2RlcF9tYXAgaWYgZGVwXQoKCmNsYXNzIEVnZ0luZm9EaXN0cmlidXRpb24oRGlzdHJpYnV0aW9uKToKICAgIGRlZiBfcmVsb2FkX3ZlcnNpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUGFja2FnZXMgaW5zdGFsbGVkIGJ5IGRpc3R1dGlscyAoZS5nLiBudW1weSBvciBzY2lweSksCiAgICAgICAgd2hpY2ggdXNlcyBhbiBvbGQgc2FmZV92ZXJzaW9uLCBhbmQgc28KICAgICAgICB0aGVpciB2ZXJzaW9uIG51bWJlcnMgY2FuIGdldCBtYW5nbGVkIHdoZW4KICAgICAgICBjb252ZXJ0ZWQgdG8gZmlsZW5hbWVzIChlLmcuLCAxLjExLjAuZGV2MCsyMzI5ZWFlIHRvCiAgICAgICAgMS4xMS4wLmRldjBfMjMyOWVhZSkuIFRoZXNlIGRpc3RyaWJ1dGlvbnMgd2lsbCBub3QgYmUKICAgICAgICBwYXJzZWQgcHJvcGVybHkKICAgICAgICBkb3duc3RyZWFtIGJ5IERpc3RyaWJ1dGlvbiBhbmQgc2FmZV92ZXJzaW9uLCBzbwogICAgICAgIHRha2UgYW4gZXh0cmEgc3RlcCBhbmQgdHJ5IHRvIGdldCB0aGUgdmVyc2lvbiBudW1iZXIgZnJvbQogICAgICAgIHRoZSBtZXRhZGF0YSBmaWxlIGl0c2VsZiBpbnN0ZWFkIG9mIHRoZSBmaWxlbmFtZS4KICAgICAgICAiIiIKICAgICAgICBtZF92ZXJzaW9uID0gX3ZlcnNpb25fZnJvbV9maWxlKHNlbGYuX2dldF9tZXRhZGF0YShzZWxmLlBLR19JTkZPKSkKICAgICAgICBpZiBtZF92ZXJzaW9uOgogICAgICAgICAgICBzZWxmLl92ZXJzaW9uID0gbWRfdmVyc2lvbgogICAgICAgIHJldHVybiBzZWxmCgoKY2xhc3MgRGlzdEluZm9EaXN0cmlidXRpb24oRGlzdHJpYnV0aW9uKToKICAgICIiIgogICAgV3JhcCBhbiBhY3R1YWwgb3IgcG90ZW50aWFsIHN5cy5wYXRoIGVudHJ5CiAgICB3L21ldGFkYXRhLCAuZGlzdC1pbmZvIHN0eWxlLgogICAgIiIiCiAgICBQS0dfSU5GTyA9ICdNRVRBREFUQScKICAgIEVRRVEgPSByZS5jb21waWxlKHIiKFtcKCxdKVxzKihcZC4qPylccyooWyxcKV0pIikKCiAgICBAcHJvcGVydHkKICAgIGRlZiBfcGFyc2VkX3BrZ19pbmZvKHNlbGYpOgogICAgICAgICIiIlBhcnNlIGFuZCBjYWNoZSBtZXRhZGF0YSIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BrZ19pbmZvCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBtZXRhZGF0YSA9IHNlbGYuZ2V0X21ldGFkYXRhKHNlbGYuUEtHX0lORk8pCiAgICAgICAgICAgIHNlbGYuX3BrZ19pbmZvID0gZW1haWwucGFyc2VyLlBhcnNlcigpLnBhcnNlc3RyKG1ldGFkYXRhKQogICAgICAgICAgICByZXR1cm4gc2VsZi5fcGtnX2luZm8KCiAgICBAcHJvcGVydHkKICAgIGRlZiBfZGVwX21hcChzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZGVwX21hcAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgc2VsZi5fX2RlcF9tYXAgPSBzZWxmLl9jb21wdXRlX2RlcGVuZGVuY2llcygpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZGVwX21hcAoKICAgIGRlZiBfY29tcHV0ZV9kZXBlbmRlbmNpZXMoc2VsZik6CiAgICAgICAgIiIiUmVjb21wdXRlIHRoaXMgZGlzdHJpYnV0aW9uJ3MgZGVwZW5kZW5jaWVzLiIiIgogICAgICAgIGRtID0gc2VsZi5fX2RlcF9tYXAgPSB7Tm9uZTogW119CgogICAgICAgIHJlcXMgPSBbXQogICAgICAgICMgSW5jbHVkaW5nIGFueSBjb25kaXRpb24gZXhwcmVzc2lvbnMKICAgICAgICBmb3IgcmVxIGluIHNlbGYuX3BhcnNlZF9wa2dfaW5mby5nZXRfYWxsKCdSZXF1aXJlcy1EaXN0Jykgb3IgW106CiAgICAgICAgICAgIHJlcXMuZXh0ZW5kKHBhcnNlX3JlcXVpcmVtZW50cyhyZXEpKQoKICAgICAgICBkZWYgcmVxc19mb3JfZXh0cmEoZXh0cmEpOgogICAgICAgICAgICBmb3IgcmVxIGluIHJlcXM6CiAgICAgICAgICAgICAgICBpZiBub3QgcmVxLm1hcmtlciBvciByZXEubWFya2VyLmV2YWx1YXRlKHsnZXh0cmEnOiBleHRyYX0pOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHJlcQoKICAgICAgICBjb21tb24gPSBmcm96ZW5zZXQocmVxc19mb3JfZXh0cmEoTm9uZSkpCiAgICAgICAgZG1bTm9uZV0uZXh0ZW5kKGNvbW1vbikKCiAgICAgICAgZm9yIGV4dHJhIGluIHNlbGYuX3BhcnNlZF9wa2dfaW5mby5nZXRfYWxsKCdQcm92aWRlcy1FeHRyYScpIG9yIFtdOgogICAgICAgICAgICBzX2V4dHJhID0gc2FmZV9leHRyYShleHRyYS5zdHJpcCgpKQogICAgICAgICAgICBkbVtzX2V4dHJhXSA9IGxpc3QoZnJvemVuc2V0KHJlcXNfZm9yX2V4dHJhKGV4dHJhKSkgLSBjb21tb24pCgogICAgICAgIHJldHVybiBkbQoKCl9kaXN0cmlidXRpb25JbXBsID0gewogICAgJy5lZ2cnOiBEaXN0cmlidXRpb24sCiAgICAnLmVnZy1pbmZvJzogRWdnSW5mb0Rpc3RyaWJ1dGlvbiwKICAgICcuZGlzdC1pbmZvJzogRGlzdEluZm9EaXN0cmlidXRpb24sCn0KCgpkZWYgaXNzdWVfd2FybmluZygqYXJncywgKiprdyk6CiAgICBsZXZlbCA9IDEKICAgIGcgPSBnbG9iYWxzKCkKICAgIHRyeToKICAgICAgICAjIGZpbmQgdGhlIGZpcnN0IHN0YWNrIGZyYW1lIHRoYXQgaXMgKm5vdCogY29kZSBpbgogICAgICAgICMgdGhlIHBrZ19yZXNvdXJjZXMgbW9kdWxlLCB0byB1c2UgZm9yIHRoZSB3YXJuaW5nCiAgICAgICAgd2hpbGUgc3lzLl9nZXRmcmFtZShsZXZlbCkuZl9nbG9iYWxzIGlzIGc6CiAgICAgICAgICAgIGxldmVsICs9IDEKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHBhc3MKICAgIHdhcm5pbmdzLndhcm4oc3RhY2tsZXZlbD1sZXZlbCArIDEsICphcmdzLCAqKmt3KQoKCmNsYXNzIFJlcXVpcmVtZW50UGFyc2VFcnJvcihWYWx1ZUVycm9yKToKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnICcuam9pbihzZWxmLmFyZ3MpCgoKZGVmIHBhcnNlX3JlcXVpcmVtZW50cyhzdHJzKToKICAgICIiIllpZWxkIGBgUmVxdWlyZW1lbnRgYCBvYmplY3RzIGZvciBlYWNoIHNwZWNpZmljYXRpb24gaW4gYHN0cnNgCgogICAgYHN0cnNgIG11c3QgYmUgYSBzdHJpbmcsIG9yIGEgKHBvc3NpYmx5LW5lc3RlZCkgaXRlcmFibGUgdGhlcmVvZi4KICAgICIiIgogICAgIyBjcmVhdGUgYSBzdGVwcGFibGUgaXRlcmF0b3IsIHNvIHdlIGNhbiBoYW5kbGUgXC1jb250aW51YXRpb25zCiAgICBsaW5lcyA9IGl0ZXIoeWllbGRfbGluZXMoc3RycykpCgogICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgIyBEcm9wIGNvbW1lbnRzIC0tIGEgaGFzaCB3aXRob3V0IGEgc3BhY2UgbWF5IGJlIGluIGEgVVJMLgogICAgICAgIGlmICcgIycgaW4gbGluZToKICAgICAgICAgICAgbGluZSA9IGxpbmVbOmxpbmUuZmluZCgnICMnKV0KICAgICAgICAjIElmIHRoZXJlIGlzIGEgbGluZSBjb250aW51YXRpb24sIGRyb3AgaXQsIGFuZCBhcHBlbmQgdGhlIG5leHQgbGluZS4KICAgICAgICBpZiBsaW5lLmVuZHN3aXRoKCdcXCcpOgogICAgICAgICAgICBsaW5lID0gbGluZVs6LTJdLnN0cmlwKCkKICAgICAgICAgICAgbGluZSArPSBuZXh0KGxpbmVzKQogICAgICAgIHlpZWxkIFJlcXVpcmVtZW50KGxpbmUpCgoKY2xhc3MgUmVxdWlyZW1lbnQocGFja2FnaW5nLnJlcXVpcmVtZW50cy5SZXF1aXJlbWVudCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgcmVxdWlyZW1lbnRfc3RyaW5nKToKICAgICAgICAiIiJETyBOT1QgQ0FMTCBUSElTIFVORE9DVU1FTlRFRCBNRVRIT0Q7IHVzZSBSZXF1aXJlbWVudC5wYXJzZSgpISIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgc3VwZXIoUmVxdWlyZW1lbnQsIHNlbGYpLl9faW5pdF9fKHJlcXVpcmVtZW50X3N0cmluZykKICAgICAgICBleGNlcHQgcGFja2FnaW5nLnJlcXVpcmVtZW50cy5JbnZhbGlkUmVxdWlyZW1lbnQgYXMgZToKICAgICAgICAgICAgcmFpc2UgUmVxdWlyZW1lbnRQYXJzZUVycm9yKHN0cihlKSkKICAgICAgICBzZWxmLnVuc2FmZV9uYW1lID0gc2VsZi5uYW1lCiAgICAgICAgcHJvamVjdF9uYW1lID0gc2FmZV9uYW1lKHNlbGYubmFtZSkKICAgICAgICBzZWxmLnByb2plY3RfbmFtZSwgc2VsZi5rZXkgPSBwcm9qZWN0X25hbWUsIHByb2plY3RfbmFtZS5sb3dlcigpCiAgICAgICAgc2VsZi5zcGVjcyA9IFsKICAgICAgICAgICAgKHNwZWMub3BlcmF0b3IsIHNwZWMudmVyc2lvbikgZm9yIHNwZWMgaW4gc2VsZi5zcGVjaWZpZXJdCiAgICAgICAgc2VsZi5leHRyYXMgPSB0dXBsZShtYXAoc2FmZV9leHRyYSwgc2VsZi5leHRyYXMpKQogICAgICAgIHNlbGYuaGFzaENtcCA9ICgKICAgICAgICAgICAgc2VsZi5rZXksCiAgICAgICAgICAgIHNlbGYuc3BlY2lmaWVyLAogICAgICAgICAgICBmcm96ZW5zZXQoc2VsZi5leHRyYXMpLAogICAgICAgICAgICBzdHIoc2VsZi5tYXJrZXIpIGlmIHNlbGYubWFya2VyIGVsc2UgTm9uZSwKICAgICAgICApCiAgICAgICAgc2VsZi5fX2hhc2ggPSBoYXNoKHNlbGYuaGFzaENtcCkKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBpc2luc3RhbmNlKG90aGVyLCBSZXF1aXJlbWVudCkgYW5kCiAgICAgICAgICAgIHNlbGYuaGFzaENtcCA9PSBvdGhlci5oYXNoQ21wCiAgICAgICAgKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCBEaXN0cmlidXRpb24pOgogICAgICAgICAgICBpZiBpdGVtLmtleSAhPSBzZWxmLmtleToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAgICAgaXRlbSA9IGl0ZW0udmVyc2lvbgoKICAgICAgICAjIEFsbG93IHByZXJlbGVhc2VzIGFsd2F5cyBpbiBvcmRlciB0byBtYXRjaCB0aGUgcHJldmlvdXMgYmVoYXZpb3Igb2YKICAgICAgICAjIHRoaXMgbWV0aG9kLiBJbiB0aGUgZnV0dXJlIHRoaXMgc2hvdWxkIGJlIHNtYXJ0ZXIgYW5kIGZvbGxvdyBQRVAgNDQwCiAgICAgICAgIyBtb3JlIGFjY3VyYXRlbHkuCiAgICAgICAgcmV0dXJuIHNlbGYuc3BlY2lmaWVyLmNvbnRhaW5zKGl0ZW0sIHByZXJlbGVhc2VzPVRydWUpCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9faGFzaAoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIlJlcXVpcmVtZW50LnBhcnNlKCVyKSIgJSBzdHIoc2VsZikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgcGFyc2Uocyk6CiAgICAgICAgcmVxLCA9IHBhcnNlX3JlcXVpcmVtZW50cyhzKQogICAgICAgIHJldHVybiByZXEKCgpkZWYgX2Fsd2F5c19vYmplY3QoY2xhc3Nlcyk6CiAgICAiIiIKICAgIEVuc3VyZSBvYmplY3QgYXBwZWFycyBpbiB0aGUgbXJvIGV2ZW4KICAgIGZvciBvbGQtc3R5bGUgY2xhc3Nlcy4KICAgICIiIgogICAgaWYgb2JqZWN0IG5vdCBpbiBjbGFzc2VzOgogICAgICAgIHJldHVybiBjbGFzc2VzICsgKG9iamVjdCwpCiAgICByZXR1cm4gY2xhc3NlcwoKCmRlZiBfZmluZF9hZGFwdGVyKHJlZ2lzdHJ5LCBvYik6CiAgICAiIiJSZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciBgb2JgIGZyb20gYHJlZ2lzdHJ5YCIiIgogICAgdHlwZXMgPSBfYWx3YXlzX29iamVjdChpbnNwZWN0LmdldG1ybyhnZXRhdHRyKG9iLCAnX19jbGFzc19fJywgdHlwZShvYikpKSkKICAgIGZvciB0IGluIHR5cGVzOgogICAgICAgIGlmIHQgaW4gcmVnaXN0cnk6CiAgICAgICAgICAgIHJldHVybiByZWdpc3RyeVt0XQoKCmRlZiBlbnN1cmVfZGlyZWN0b3J5KHBhdGgpOgogICAgIiIiRW5zdXJlIHRoYXQgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgYHBhdGhgIGV4aXN0cyIiIgogICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgcHkzMWNvbXBhdC5tYWtlZGlycyhkaXJuYW1lLCBleGlzdF9vaz1UcnVlKQoKCmRlZiBfYnlwYXNzX2Vuc3VyZV9kaXJlY3RvcnkocGF0aCk6CiAgICAiIiJTYW5kYm94LWJ5cGFzc2luZyB2ZXJzaW9uIG9mIGVuc3VyZV9kaXJlY3RvcnkoKSIiIgogICAgaWYgbm90IFdSSVRFX1NVUFBPUlQ6CiAgICAgICAgcmFpc2UgSU9FcnJvcignIm9zLm1rZGlyIiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0uJykKICAgIGRpcm5hbWUsIGZpbGVuYW1lID0gc3BsaXQocGF0aCkKICAgIGlmIGRpcm5hbWUgYW5kIGZpbGVuYW1lIGFuZCBub3QgaXNkaXIoZGlybmFtZSk6CiAgICAgICAgX2J5cGFzc19lbnN1cmVfZGlyZWN0b3J5KGRpcm5hbWUpCiAgICAgICAgbWtkaXIoZGlybmFtZSwgMG83NTUpCgoKZGVmIHNwbGl0X3NlY3Rpb25zKHMpOgogICAgIiIiU3BsaXQgYSBzdHJpbmcgb3IgaXRlcmFibGUgdGhlcmVvZiBpbnRvIChzZWN0aW9uLCBjb250ZW50KSBwYWlycwoKICAgIEVhY2ggYGBzZWN0aW9uYGAgaXMgYSBzdHJpcHBlZCB2ZXJzaW9uIG9mIHRoZSBzZWN0aW9uIGhlYWRlciAoIltzZWN0aW9uXSIpCiAgICBhbmQgZWFjaCBgYGNvbnRlbnRgYCBpcyBhIGxpc3Qgb2Ygc3RyaXBwZWQgbGluZXMgZXhjbHVkaW5nIGJsYW5rIGxpbmVzIGFuZAogICAgY29tbWVudC1vbmx5IGxpbmVzLiAgSWYgdGhlcmUgYXJlIGFueSBzdWNoIGxpbmVzIGJlZm9yZSB0aGUgZmlyc3Qgc2VjdGlvbgogICAgaGVhZGVyLCB0aGV5J3JlIHJldHVybmVkIGluIGEgZmlyc3QgYGBzZWN0aW9uYGAgb2YgYGBOb25lYGAuCiAgICAiIiIKICAgIHNlY3Rpb24gPSBOb25lCiAgICBjb250ZW50ID0gW10KICAgIGZvciBsaW5lIGluIHlpZWxkX2xpbmVzKHMpOgogICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiWyIpOgogICAgICAgICAgICBpZiBsaW5lLmVuZHN3aXRoKCJdIik6CiAgICAgICAgICAgICAgICBpZiBzZWN0aW9uIG9yIGNvbnRlbnQ6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VjdGlvbiwgY29udGVudAogICAgICAgICAgICAgICAgc2VjdGlvbiA9IGxpbmVbMTotMV0uc3RyaXAoKQogICAgICAgICAgICAgICAgY29udGVudCA9IFtdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIHNlY3Rpb24gaGVhZGluZyIsIGxpbmUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29udGVudC5hcHBlbmQobGluZSkKCiAgICAjIHdyYXAgdXAgbGFzdCBzZWdtZW50CiAgICB5aWVsZCBzZWN0aW9uLCBjb250ZW50CgoKZGVmIF9ta3N0ZW1wKCphcmdzLCAqKmt3KToKICAgIG9sZF9vcGVuID0gb3Mub3BlbgogICAgdHJ5OgogICAgICAgICMgdGVtcG9yYXJpbHkgYnlwYXNzIHNhbmRib3hpbmcKICAgICAgICBvcy5vcGVuID0gb3Nfb3BlbgogICAgICAgIHJldHVybiB0ZW1wZmlsZS5ta3N0ZW1wKCphcmdzLCAqKmt3KQogICAgZmluYWxseToKICAgICAgICAjIGFuZCB0aGVuIHB1dCBpdCBiYWNrCiAgICAgICAgb3Mub3BlbiA9IG9sZF9vcGVuCgoKIyBTaWxlbmNlIHRoZSBQRVA0NDBXYXJuaW5nIGJ5IGRlZmF1bHQsIHNvIHRoYXQgZW5kIHVzZXJzIGRvbid0IGdldCBoaXQgYnkgaXQKIyByYW5kb21seSBqdXN0IGJlY2F1c2UgdGhleSB1c2UgcGtnX3Jlc291cmNlcy4gV2Ugd2FudCB0byBhcHBlbmQgdGhlIHJ1bGUKIyBiZWNhdXNlIHdlIHdhbnQgZWFybGllciB1c2VzIG9mIGZpbHRlcndhcm5pbmdzIHRvIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoaXMKIyBvbmUuCndhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCBjYXRlZ29yeT1QRVA0NDBXYXJuaW5nLCBhcHBlbmQ9VHJ1ZSkKCgojIGZyb20gamFyYWNvLmZ1bmN0b29scyAxLjMKZGVmIF9jYWxsX2FzaWRlKGYsICphcmdzLCAqKmt3YXJncyk6CiAgICBmKCphcmdzLCAqKmt3YXJncykKICAgIHJldHVybiBmCgoKQF9jYWxsX2FzaWRlCmRlZiBfaW5pdGlhbGl6ZShnPWdsb2JhbHMoKSk6CiAgICAiU2V0IHVwIGdsb2JhbCByZXNvdXJjZSBtYW5hZ2VyIChkZWxpYmVyYXRlbHkgbm90IHN0YXRlLXNhdmVkKSIKICAgIG1hbmFnZXIgPSBSZXNvdXJjZU1hbmFnZXIoKQogICAgZ1snX21hbmFnZXInXSA9IG1hbmFnZXIKICAgIGcudXBkYXRlKAogICAgICAgIChuYW1lLCBnZXRhdHRyKG1hbmFnZXIsIG5hbWUpKQogICAgICAgIGZvciBuYW1lIGluIGRpcihtYW5hZ2VyKQogICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJ18nKQogICAgKQoKCkBfY2FsbF9hc2lkZQpkZWYgX2luaXRpYWxpemVfbWFzdGVyX3dvcmtpbmdfc2V0KCk6CiAgICAiIiIKICAgIFByZXBhcmUgdGhlIG1hc3RlciB3b3JraW5nIHNldCBhbmQgbWFrZSB0aGUgYGByZXF1aXJlKClgYAogICAgQVBJIGF2YWlsYWJsZS4KCiAgICBUaGlzIGZ1bmN0aW9uIGhhcyBleHBsaWNpdCBlZmZlY3RzIG9uIHRoZSBnbG9iYWwgc3RhdGUKICAgIG9mIHBrZ19yZXNvdXJjZXMuIEl0IGlzIGludGVuZGVkIHRvIGJlIGludm9rZWQgb25jZSBhdAogICAgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoaXMgbW9kdWxlLgoKICAgIEludm9jYXRpb24gYnkgb3RoZXIgcGFja2FnZXMgaXMgdW5zdXBwb3J0ZWQgYW5kIGRvbmUKICAgIGF0IHRoZWlyIG93biByaXNrLgogICAgIiIiCiAgICB3b3JraW5nX3NldCA9IFdvcmtpbmdTZXQuX2J1aWxkX21hc3RlcigpCiAgICBfZGVjbGFyZV9zdGF0ZSgnb2JqZWN0Jywgd29ya2luZ19zZXQ9d29ya2luZ19zZXQpCgogICAgcmVxdWlyZSA9IHdvcmtpbmdfc2V0LnJlcXVpcmUKICAgIGl0ZXJfZW50cnlfcG9pbnRzID0gd29ya2luZ19zZXQuaXRlcl9lbnRyeV9wb2ludHMKICAgIGFkZF9hY3RpdmF0aW9uX2xpc3RlbmVyID0gd29ya2luZ19zZXQuc3Vic2NyaWJlCiAgICBydW5fc2NyaXB0ID0gd29ya2luZ19zZXQucnVuX3NjcmlwdAogICAgIyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICBydW5fbWFpbiA9IHJ1bl9zY3JpcHQKICAgICMgQWN0aXZhdGUgYWxsIGRpc3RyaWJ1dGlvbnMgYWxyZWFkeSBvbiBzeXMucGF0aCB3aXRoIHJlcGxhY2U9RmFsc2UgYW5kCiAgICAjIGVuc3VyZSB0aGF0IGFsbCBkaXN0cmlidXRpb25zIGFkZGVkIHRvIHRoZSB3b3JraW5nIHNldCBpbiB0aGUgZnV0dXJlCiAgICAjIChlLmcuIGJ5IGNhbGxpbmcgYGByZXF1aXJlKClgYCkgd2lsbCBnZXQgYWN0aXZhdGVkIGFzIHdlbGwsCiAgICAjIHdpdGggaGlnaGVyIHByaW9yaXR5IChyZXBsYWNlPVRydWUpLgogICAgdHVwbGUoCiAgICAgICAgZGlzdC5hY3RpdmF0ZShyZXBsYWNlPUZhbHNlKQogICAgICAgIGZvciBkaXN0IGluIHdvcmtpbmdfc2V0CiAgICApCiAgICBhZGRfYWN0aXZhdGlvbl9saXN0ZW5lcigKICAgICAgICBsYW1iZGEgZGlzdDogZGlzdC5hY3RpdmF0ZShyZXBsYWNlPVRydWUpLAogICAgICAgIGV4aXN0aW5nPUZhbHNlLAogICAgKQogICAgd29ya2luZ19zZXQuZW50cmllcyA9IFtdCiAgICAjIG1hdGNoIG9yZGVyCiAgICBsaXN0KG1hcCh3b3JraW5nX3NldC5hZGRfZW50cnksIHN5cy5wYXRoKSkKICAgIGdsb2JhbHMoKS51cGRhdGUobG9jYWxzKCkpClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAOQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAQ6uwJmZXAABmVwAAOAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9hcHBkaXJzLnB5IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogdXRmLTggLSotCiMgQ29weXJpZ2h0IChjKSAyMDA1LTIwMTAgQWN0aXZlU3RhdGUgU29mdHdhcmUgSW5jLgojIENvcHlyaWdodCAoYykgMjAxMyBFZGR5IFBldHJpyJlvcgoKIiIiVXRpbGl0aWVzIGZvciBkZXRlcm1pbmluZyBhcHBsaWNhdGlvbi1zcGVjaWZpYyBkaXJzLgoKU2VlIDxodHRwOi8vZ2l0aHViLmNvbS9BY3RpdmVTdGF0ZS9hcHBkaXJzPiBmb3IgZGV0YWlscyBhbmQgdXNhZ2UuCiIiIgojIERldiBOb3RlczoKIyAtIE1TRE4gb24gd2hlcmUgdG8gc3RvcmUgYXBwIGRhdGEgZmlsZXM6CiMgICBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2RlZmF1bHQuYXNweD9zY2lkPWtiO2VuLXVzOzMxMDI5NCNYU0xUSDMxOTQxMjExMjMxMjAxMjExMjAxMjAKIyAtIE1hYyBPUyBYOiBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL01hY09TWC9Db25jZXB0dWFsL0JQRmlsZVN5c3RlbS9pbmRleC5odG1sCiMgLSBYREcgc3BlYyBmb3IgVW4qeDogaHR0cDovL3N0YW5kYXJkcy5mcmVlZGVza3RvcC5vcmcvYmFzZWRpci1zcGVjL2Jhc2VkaXItc3BlYy1sYXRlc3QuaHRtbAoKX192ZXJzaW9uX2luZm9fXyA9ICgxLCA0LCAwKQpfX3ZlcnNpb25fXyA9ICcuJy5qb2luKG1hcChzdHIsIF9fdmVyc2lvbl9pbmZvX18pKQoKCmltcG9ydCBzeXMKaW1wb3J0IG9zCgpQWTMgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDMKCmlmIFBZMzoKICAgIHVuaWNvZGUgPSBzdHIKCmlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CiAgICBpbXBvcnQgcGxhdGZvcm0KICAgIG9zX25hbWUgPSBwbGF0Zm9ybS5qYXZhX3ZlcigpWzNdWzBdCiAgICBpZiBvc19uYW1lLnN0YXJ0c3dpdGgoJ1dpbmRvd3MnKTogIyAiV2luZG93cyBYUCIsICJXaW5kb3dzIDciLCBldGMuCiAgICAgICAgc3lzdGVtID0gJ3dpbjMyJwogICAgZWxpZiBvc19uYW1lLnN0YXJ0c3dpdGgoJ01hYycpOiAjICJNYWMgT1MgWCIsIGV0Yy4KICAgICAgICBzeXN0ZW0gPSAnZGFyd2luJwogICAgZWxzZTogIyAiTGludXgiLCAiU3VuT1MiLCAiRnJlZUJTRCIsIGV0Yy4KICAgICAgICAjIFNldHRpbmcgdGhpcyB0byAibGludXgyIiBpcyBub3QgaWRlYWwsIGJ1dCBvbmx5IFdpbmRvd3Mgb3IgTWFjCiAgICAgICAgIyBhcmUgYWN0dWFsbHkgY2hlY2tlZCBmb3IgYW5kIHRoZSByZXN0IG9mIHRoZSBtb2R1bGUgZXhwZWN0cwogICAgICAgICMgKnN5cy5wbGF0Zm9ybSogc3R5bGUgc3RyaW5ncy4KICAgICAgICBzeXN0ZW0gPSAnbGludXgyJwplbHNlOgogICAgc3lzdGVtID0gc3lzLnBsYXRmb3JtCgoKCmRlZiB1c2VyX2RhdGFfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgcm9hbWluZz1GYWxzZSk6CiAgICByIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBkYXRhIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAicm9hbWluZyIgKGJvb2xlYW4sIGRlZmF1bHQgRmFsc2UpIGNhbiBiZSBzZXQgVHJ1ZSB0byB1c2UgdGhlIFdpbmRvd3MKICAgICAgICAgICAgcm9hbWluZyBhcHBkYXRhIGRpcmVjdG9yeS4gVGhhdCBtZWFucyB0aGF0IGZvciB1c2VycyBvbiBhIFdpbmRvd3MKICAgICAgICAgICAgbmV0d29yayBzZXR1cCBmb3Igcm9hbWluZyBwcm9maWxlcywgdGhpcyB1c2VyIGRhdGEgd2lsbCBiZQogICAgICAgICAgICBzeW5jJ2Qgb24gbG9naW4uIFNlZQogICAgICAgICAgICA8aHR0cDovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2NjNzY2NDg5KFdTLjEwKS5hc3B4PgogICAgICAgICAgICBmb3IgYSBkaXNjdXNzaW9uIG9mIGlzc3Vlcy4KCiAgICBUeXBpY2FsIHVzZXIgZGF0YSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgTWFjIE9TIFg6ICAgICAgICAgICAgICAgfi9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvPEFwcE5hbWU+CiAgICAgICAgVW5peDogICAgICAgICAgICAgICAgICAgfi8ubG9jYWwvc2hhcmUvPEFwcE5hbWU+ICAgICMgb3IgaW4gJFhER19EQVRBX0hPTUUsIGlmIGRlZmluZWQKICAgICAgICBXaW4gWFAgKG5vdCByb2FtaW5nKTogICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXDx1c2VybmFtZT5cQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT4KICAgICAgICBXaW4gWFAgKHJvYW1pbmcpOiAgICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXDx1c2VybmFtZT5cTG9jYWwgU2V0dGluZ3NcQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT4KICAgICAgICBXaW4gNyAgKG5vdCByb2FtaW5nKTogICBDOlxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcTG9jYWxcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CiAgICAgICAgV2luIDcgIChyb2FtaW5nKTogICAgICAgQzpcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXFJvYW1pbmdcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CgogICAgRm9yIFVuaXgsIHdlIGZvbGxvdyB0aGUgWERHIHNwZWMgYW5kIHN1cHBvcnQgJFhER19EQVRBX0hPTUUuCiAgICBUaGF0IG1lYW5zLCBieSBkZWZhdWx0ICJ+Ly5sb2NhbC9zaGFyZS88QXBwTmFtZT4iLgogICAgIiIiCiAgICBpZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgICAgICBpZiBhcHBhdXRob3IgaXMgTm9uZToKICAgICAgICAgICAgYXBwYXV0aG9yID0gYXBwbmFtZQogICAgICAgIGNvbnN0ID0gcm9hbWluZyBhbmQgIkNTSURMX0FQUERBVEEiIG9yICJDU0lETF9MT0NBTF9BUFBEQVRBIgogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKF9nZXRfd2luX2ZvbGRlcihjb25zdCkpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgYXBwYXV0aG9yIGlzIG5vdCBGYWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwYXV0aG9yLCBhcHBuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxpZiBzeXN0ZW0gPT0gJ2Rhcndpbic6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguZXhwYW5kdXNlcignfi9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvJykKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19EQVRBX0hPTUUnLCBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vLmxvY2FsL3NoYXJlIikpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmRlZiBzaXRlX2RhdGFfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgbXVsdGlwYXRoPUZhbHNlKToKICAgICIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc2hhcmVkIGRhdGEgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJtdWx0aXBhdGgiIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBvbmx5IGFwcGxpY2FibGUgdG8gKm5peAogICAgICAgICAgICB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50aXJlIGxpc3Qgb2YgZGF0YSBkaXJzIHNob3VsZCBiZQogICAgICAgICAgICByZXR1cm5lZC4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGl0ZW0gZnJvbSBYREdfREFUQV9ESVJTIGlzCiAgICAgICAgICAgIHJldHVybmVkLCBvciAnL3Vzci9sb2NhbC9zaGFyZS88QXBwTmFtZT4nLAogICAgICAgICAgICBpZiBYREdfREFUQV9ESVJTIGlzIG5vdCBzZXQKCiAgICBUeXBpY2FsIHVzZXIgZGF0YSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgTWFjIE9TIFg6ICAgL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICAvdXNyL2xvY2FsL3NoYXJlLzxBcHBOYW1lPiBvciAvdXNyL3NoYXJlLzxBcHBOYW1lPgogICAgICAgIFdpbiBYUDogICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcQWxsIFVzZXJzXEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CiAgICAgICAgVmlzdGE6ICAgICAgKEZhaWwhICJDOlxQcm9ncmFtRGF0YSIgaXMgYSBoaWRkZW4gKnN5c3RlbSogZGlyZWN0b3J5IG9uIFZpc3RhLikKICAgICAgICBXaW4gNzogICAgICBDOlxQcm9ncmFtRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT4gICAjIEhpZGRlbiwgYnV0IHdyaXRlYWJsZSBvbiBXaW4gNy4KCiAgICBGb3IgVW5peCwgdGhpcyBpcyB1c2luZyB0aGUgJFhER19EQVRBX0RJUlNbMF0gZGVmYXVsdC4KCiAgICBXQVJOSU5HOiBEbyBub3QgdXNlIHRoaXMgb24gV2luZG93cy4gU2VlIHRoZSBWaXN0YS1GYWlsIG5vdGUgYWJvdmUgZm9yIHdoeS4KICAgICIiIgogICAgaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICAgICAgaWYgYXBwYXV0aG9yIGlzIE5vbmU6CiAgICAgICAgICAgIGFwcGF1dGhvciA9IGFwcG5hbWUKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChfZ2V0X3dpbl9mb2xkZXIoIkNTSURMX0NPTU1PTl9BUFBEQVRBIikpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgYXBwYXV0aG9yIGlzIG5vdCBGYWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwYXV0aG9yLCBhcHBuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxpZiBzeXN0ZW0gPT0gJ2Rhcndpbic6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguZXhwYW5kdXNlcignL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydCcpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxzZToKICAgICAgICAjIFhERyBkZWZhdWx0IGZvciAkWERHX0RBVEFfRElSUwogICAgICAgICMgb25seSBmaXJzdCwgaWYgbXVsdGlwYXRoIGlzIEZhbHNlCiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0RBVEFfRElSUycsCiAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoc2VwLmpvaW4oWycvdXNyL2xvY2FsL3NoYXJlJywgJy91c3Ivc2hhcmUnXSkpCiAgICAgICAgcGF0aGxpc3QgPSBbb3MucGF0aC5leHBhbmR1c2VyKHgucnN0cmlwKG9zLnNlcCkpIGZvciB4IGluIHBhdGguc3BsaXQob3MucGF0aHNlcCldCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgdmVyc2lvbjoKICAgICAgICAgICAgICAgIGFwcG5hbWUgPSBvcy5wYXRoLmpvaW4oYXBwbmFtZSwgdmVyc2lvbikKICAgICAgICAgICAgcGF0aGxpc3QgPSBbb3Muc2VwLmpvaW4oW3gsIGFwcG5hbWVdKSBmb3IgeCBpbiBwYXRobGlzdF0KCiAgICAgICAgaWYgbXVsdGlwYXRoOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aHNlcC5qb2luKHBhdGhsaXN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhdGggPSBwYXRobGlzdFswXQogICAgICAgIHJldHVybiBwYXRoCgogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmRlZiB1c2VyX2NvbmZpZ19kaXIoYXBwbmFtZT1Ob25lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCByb2FtaW5nPUZhbHNlKToKICAgIHIiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGNvbmZpZyBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgInJvYW1pbmciIChib29sZWFuLCBkZWZhdWx0IEZhbHNlKSBjYW4gYmUgc2V0IFRydWUgdG8gdXNlIHRoZSBXaW5kb3dzCiAgICAgICAgICAgIHJvYW1pbmcgYXBwZGF0YSBkaXJlY3RvcnkuIFRoYXQgbWVhbnMgdGhhdCBmb3IgdXNlcnMgb24gYSBXaW5kb3dzCiAgICAgICAgICAgIG5ldHdvcmsgc2V0dXAgZm9yIHJvYW1pbmcgcHJvZmlsZXMsIHRoaXMgdXNlciBkYXRhIHdpbGwgYmUKICAgICAgICAgICAgc3luYydkIG9uIGxvZ2luLiBTZWUKICAgICAgICAgICAgPGh0dHA6Ly90ZWNobmV0Lm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9jYzc2NjQ4OShXUy4xMCkuYXNweD4KICAgICAgICAgICAgZm9yIGEgZGlzY3Vzc2lvbiBvZiBpc3N1ZXMuCgogICAgVHlwaWNhbCB1c2VyIGRhdGEgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIE1hYyBPUyBYOiAgICAgICAgICAgICAgIHNhbWUgYXMgdXNlcl9kYXRhX2RpcgogICAgICAgIFVuaXg6ICAgICAgICAgICAgICAgICAgIH4vLmNvbmZpZy88QXBwTmFtZT4gICAgICMgb3IgaW4gJFhER19DT05GSUdfSE9NRSwgaWYgZGVmaW5lZAogICAgICAgIFdpbiAqOiAgICAgICAgICAgICAgICAgIHNhbWUgYXMgdXNlcl9kYXRhX2RpcgoKICAgIEZvciBVbml4LCB3ZSBmb2xsb3cgdGhlIFhERyBzcGVjIGFuZCBzdXBwb3J0ICRYREdfQ09ORklHX0hPTUUuCiAgICBUaGF0IG1lYW5zLCBieSBkZWFmdWx0ICJ+Ly5jb25maWcvPEFwcE5hbWU+Ii4KICAgICIiIgogICAgaWYgc3lzdGVtIGluIFsid2luMzIiLCAiZGFyd2luIl06CiAgICAgICAgcGF0aCA9IHVzZXJfZGF0YV9kaXIoYXBwbmFtZSwgYXBwYXV0aG9yLCBOb25lLCByb2FtaW5nKQogICAgZWxzZToKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfQ09ORklHX0hPTUUnLCBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vLmNvbmZpZyIpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpkZWYgc2l0ZV9jb25maWdfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgbXVsdGlwYXRoPUZhbHNlKToKICAgICIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc2hhcmVkIGRhdGEgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJtdWx0aXBhdGgiIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBvbmx5IGFwcGxpY2FibGUgdG8gKm5peAogICAgICAgICAgICB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50aXJlIGxpc3Qgb2YgY29uZmlnIGRpcnMgc2hvdWxkIGJlCiAgICAgICAgICAgIHJldHVybmVkLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgaXRlbSBmcm9tIFhER19DT05GSUdfRElSUyBpcwogICAgICAgICAgICByZXR1cm5lZCwgb3IgJy9ldGMveGRnLzxBcHBOYW1lPicsIGlmIFhER19DT05GSUdfRElSUyBpcyBub3Qgc2V0CgogICAgVHlwaWNhbCB1c2VyIGRhdGEgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIE1hYyBPUyBYOiAgIHNhbWUgYXMgc2l0ZV9kYXRhX2RpcgogICAgICAgIFVuaXg6ICAgICAgIC9ldGMveGRnLzxBcHBOYW1lPiBvciAkWERHX0NPTkZJR19ESVJTW2ldLzxBcHBOYW1lPiBmb3IgZWFjaCB2YWx1ZSBpbgogICAgICAgICAgICAgICAgICAgICRYREdfQ09ORklHX0RJUlMKICAgICAgICBXaW4gKjogICAgICBzYW1lIGFzIHNpdGVfZGF0YV9kaXIKICAgICAgICBWaXN0YTogICAgICAoRmFpbCEgIkM6XFByb2dyYW1EYXRhIiBpcyBhIGhpZGRlbiAqc3lzdGVtKiBkaXJlY3Rvcnkgb24gVmlzdGEuKQoKICAgIEZvciBVbml4LCB0aGlzIGlzIHVzaW5nIHRoZSAkWERHX0NPTkZJR19ESVJTWzBdIGRlZmF1bHQsIGlmIG11bHRpcGF0aD1GYWxzZQoKICAgIFdBUk5JTkc6IERvIG5vdCB1c2UgdGhpcyBvbiBXaW5kb3dzLiBTZWUgdGhlIFZpc3RhLUZhaWwgbm90ZSBhYm92ZSBmb3Igd2h5LgogICAgIiIiCiAgICBpZiBzeXN0ZW0gaW4gWyJ3aW4zMiIsICJkYXJ3aW4iXToKICAgICAgICBwYXRoID0gc2l0ZV9kYXRhX2RpcihhcHBuYW1lLCBhcHBhdXRob3IpCiAgICAgICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgZWxzZToKICAgICAgICAjIFhERyBkZWZhdWx0IGZvciAkWERHX0NPTkZJR19ESVJTCiAgICAgICAgIyBvbmx5IGZpcnN0LCBpZiBtdWx0aXBhdGggaXMgRmFsc2UKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfQ09ORklHX0RJUlMnLCAnL2V0Yy94ZGcnKQogICAgICAgIHBhdGhsaXN0ID0gW29zLnBhdGguZXhwYW5kdXNlcih4LnJzdHJpcChvcy5zZXApKSBmb3IgeCBpbiBwYXRoLnNwbGl0KG9zLnBhdGhzZXApXQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIHZlcnNpb246CiAgICAgICAgICAgICAgICBhcHBuYW1lID0gb3MucGF0aC5qb2luKGFwcG5hbWUsIHZlcnNpb24pCiAgICAgICAgICAgIHBhdGhsaXN0ID0gW29zLnNlcC5qb2luKFt4LCBhcHBuYW1lXSkgZm9yIHggaW4gcGF0aGxpc3RdCgogICAgICAgIGlmIG11bHRpcGF0aDoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGhzZXAuam9pbihwYXRobGlzdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXRoID0gcGF0aGxpc3RbMF0KICAgIHJldHVybiBwYXRoCgoKZGVmIHVzZXJfY2FjaGVfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgb3Bpbmlvbj1UcnVlKToKICAgIHIiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGNhY2hlIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAib3BpbmlvbiIgKGJvb2xlYW4pIGNhbiBiZSBGYWxzZSB0byBkaXNhYmxlIHRoZSBhcHBlbmRpbmcgb2YKICAgICAgICAgICAgIkNhY2hlIiB0byB0aGUgYmFzZSBhcHAgZGF0YSBkaXIgZm9yIFdpbmRvd3MuIFNlZQogICAgICAgICAgICBkaXNjdXNzaW9uIGJlbG93LgoKICAgIFR5cGljYWwgdXNlciBjYWNoZSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgTWFjIE9TIFg6ICAgfi9MaWJyYXJ5L0NhY2hlcy88QXBwTmFtZT4KICAgICAgICBVbml4OiAgICAgICB+Ly5jYWNoZS88QXBwTmFtZT4gKFhERyBkZWZhdWx0KQogICAgICAgIFdpbiBYUDogICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlxMb2NhbCBTZXR0aW5nc1xBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPlxDYWNoZQogICAgICAgIFZpc3RhOiAgICAgIEM6XFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxMb2NhbFw8QXBwQXV0aG9yPlw8QXBwTmFtZT5cQ2FjaGUKCiAgICBPbiBXaW5kb3dzIHRoZSBvbmx5IHN1Z2dlc3Rpb24gaW4gdGhlIE1TRE4gZG9jcyBpcyB0aGF0IGxvY2FsIHNldHRpbmdzIGdvIGluCiAgICB0aGUgYENTSURMX0xPQ0FMX0FQUERBVEFgIGRpcmVjdG9yeS4gVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIG5vbi1yb2FtaW5nCiAgICBhcHAgZGF0YSBkaXIgKHRoZSBkZWZhdWx0IHJldHVybmVkIGJ5IGB1c2VyX2RhdGFfZGlyYCBhYm92ZSkuIEFwcHMgdHlwaWNhbGx5CiAgICBwdXQgY2FjaGUgZGF0YSBzb21ld2hlcmUgKnVuZGVyKiB0aGUgZ2l2ZW4gZGlyIGhlcmUuIFNvbWUgZXhhbXBsZXM6CiAgICAgICAgLi4uXE1vemlsbGFcRmlyZWZveFxQcm9maWxlc1w8UHJvZmlsZU5hbWU+XENhY2hlCiAgICAgICAgLi4uXEFjbWVcU3VwZXJBcHBcQ2FjaGVcMS4wCiAgICBPUElOSU9OOiBUaGlzIGZ1bmN0aW9uIGFwcGVuZHMgIkNhY2hlIiB0byB0aGUgYENTSURMX0xPQ0FMX0FQUERBVEFgIHZhbHVlLgogICAgVGhpcyBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUgYG9waW5pb249RmFsc2VgIG9wdGlvbi4KICAgICIiIgogICAgaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICAgICAgaWYgYXBwYXV0aG9yIGlzIE5vbmU6CiAgICAgICAgICAgIGFwcGF1dGhvciA9IGFwcG5hbWUKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChfZ2V0X3dpbl9mb2xkZXIoIkNTSURMX0xPQ0FMX0FQUERBVEEiKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiBhcHBhdXRob3IgaXMgbm90IEZhbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBhdXRob3IsIGFwcG5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICAgICAgICAgIGlmIG9waW5pb246CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICJDYWNoZSIpCiAgICBlbGlmIHN5c3RlbSA9PSAnZGFyd2luJzoKICAgICAgICBwYXRoID0gb3MucGF0aC5leHBhbmR1c2VyKCd+L0xpYnJhcnkvQ2FjaGVzJykKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19DQUNIRV9IT01FJywgb3MucGF0aC5leHBhbmR1c2VyKCd+Ly5jYWNoZScpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpkZWYgdXNlcl9sb2dfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgb3Bpbmlvbj1UcnVlKToKICAgIHIiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGxvZyBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgIm9waW5pb24iIChib29sZWFuKSBjYW4gYmUgRmFsc2UgdG8gZGlzYWJsZSB0aGUgYXBwZW5kaW5nIG9mCiAgICAgICAgICAgICJMb2dzIiB0byB0aGUgYmFzZSBhcHAgZGF0YSBkaXIgZm9yIFdpbmRvd3MsIGFuZCAibG9nIiB0byB0aGUKICAgICAgICAgICAgYmFzZSBjYWNoZSBkaXIgZm9yIFVuaXguIFNlZSBkaXNjdXNzaW9uIGJlbG93LgoKICAgIFR5cGljYWwgdXNlciBjYWNoZSBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgTWFjIE9TIFg6ICAgfi9MaWJyYXJ5L0xvZ3MvPEFwcE5hbWU+CiAgICAgICAgVW5peDogICAgICAgfi8uY2FjaGUvPEFwcE5hbWU+L2xvZyAgIyBvciB1bmRlciAkWERHX0NBQ0hFX0hPTUUgaWYgZGVmaW5lZAogICAgICAgIFdpbiBYUDogICAgIEM6XERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlxMb2NhbCBTZXR0aW5nc1xBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPlxMb2dzCiAgICAgICAgVmlzdGE6ICAgICAgQzpcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXExvY2FsXDxBcHBBdXRob3I+XDxBcHBOYW1lPlxMb2dzCgogICAgT24gV2luZG93cyB0aGUgb25seSBzdWdnZXN0aW9uIGluIHRoZSBNU0ROIGRvY3MgaXMgdGhhdCBsb2NhbCBzZXR0aW5ncwogICAgZ28gaW4gdGhlIGBDU0lETF9MT0NBTF9BUFBEQVRBYCBkaXJlY3RvcnkuIChOb3RlOiBJJ20gaW50ZXJlc3RlZCBpbgogICAgZXhhbXBsZXMgb2Ygd2hhdCBzb21lIHdpbmRvd3MgYXBwcyB1c2UgZm9yIGEgbG9ncyBkaXIuKQoKICAgIE9QSU5JT046IFRoaXMgZnVuY3Rpb24gYXBwZW5kcyAiTG9ncyIgdG8gdGhlIGBDU0lETF9MT0NBTF9BUFBEQVRBYAogICAgdmFsdWUgZm9yIFdpbmRvd3MgYW5kIGFwcGVuZHMgImxvZyIgdG8gdGhlIHVzZXIgY2FjaGUgZGlyIGZvciBVbml4LgogICAgVGhpcyBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUgYG9waW5pb249RmFsc2VgIG9wdGlvbi4KICAgICIiIgogICAgaWYgc3lzdGVtID09ICJkYXJ3aW4iOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIG9zLnBhdGguZXhwYW5kdXNlcignfi9MaWJyYXJ5L0xvZ3MnKSwKICAgICAgICAgICAgYXBwbmFtZSkKICAgIGVsaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICAgICAgcGF0aCA9IHVzZXJfZGF0YV9kaXIoYXBwbmFtZSwgYXBwYXV0aG9yLCB2ZXJzaW9uKQogICAgICAgIHZlcnNpb24gPSBGYWxzZQogICAgICAgIGlmIG9waW5pb246CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgIkxvZ3MiKQogICAgZWxzZToKICAgICAgICBwYXRoID0gdXNlcl9jYWNoZV9kaXIoYXBwbmFtZSwgYXBwYXV0aG9yLCB2ZXJzaW9uKQogICAgICAgIHZlcnNpb24gPSBGYWxzZQogICAgICAgIGlmIG9waW5pb246CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgImxvZyIpCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKY2xhc3MgQXBwRGlycyhvYmplY3QpOgogICAgIiIiQ29udmVuaWVuY2Ugd3JhcHBlciBmb3IgZ2V0dGluZyBhcHBsaWNhdGlvbiBkaXJzLiIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFwcG5hbWUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIHJvYW1pbmc9RmFsc2UsCiAgICAgICAgICAgICAgICAgbXVsdGlwYXRoPUZhbHNlKToKICAgICAgICBzZWxmLmFwcG5hbWUgPSBhcHBuYW1lCiAgICAgICAgc2VsZi5hcHBhdXRob3IgPSBhcHBhdXRob3IKICAgICAgICBzZWxmLnZlcnNpb24gPSB2ZXJzaW9uCiAgICAgICAgc2VsZi5yb2FtaW5nID0gcm9hbWluZwogICAgICAgIHNlbGYubXVsdGlwYXRoID0gbXVsdGlwYXRoCgogICAgQHByb3BlcnR5CiAgICBkZWYgdXNlcl9kYXRhX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gdXNlcl9kYXRhX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uLCByb2FtaW5nPXNlbGYucm9hbWluZykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzaXRlX2RhdGFfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiBzaXRlX2RhdGFfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24sIG11bHRpcGF0aD1zZWxmLm11bHRpcGF0aCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1c2VyX2NvbmZpZ19kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHVzZXJfY29uZmlnX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24sIHJvYW1pbmc9c2VsZi5yb2FtaW5nKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNpdGVfY29uZmlnX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gc2l0ZV9jb25maWdfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24sIG11bHRpcGF0aD1zZWxmLm11bHRpcGF0aCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB1c2VyX2NhY2hlX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gdXNlcl9jYWNoZV9kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1zZWxmLnZlcnNpb24pCgogICAgQHByb3BlcnR5CiAgICBkZWYgdXNlcl9sb2dfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiB1c2VyX2xvZ19kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uKQoKCiMtLS0tIGludGVybmFsIHN1cHBvcnQgc3R1ZmYKCmRlZiBfZ2V0X3dpbl9mb2xkZXJfZnJvbV9yZWdpc3RyeShjc2lkbF9uYW1lKToKICAgICIiIlRoaXMgaXMgYSBmYWxsYmFjayB0ZWNobmlxdWUgYXQgYmVzdC4gSSdtIG5vdCBzdXJlIGlmIHVzaW5nIHRoZQogICAgcmVnaXN0cnkgZm9yIHRoaXMgZ3VhcmFudGVlcyB1cyB0aGUgY29ycmVjdCBhbnN3ZXIgZm9yIGFsbCBDU0lETF8qCiAgICBuYW1lcy4KICAgICIiIgogICAgaW1wb3J0IF93aW5yZWcKCiAgICBzaGVsbF9mb2xkZXJfbmFtZSA9IHsKICAgICAgICAiQ1NJRExfQVBQREFUQSI6ICJBcHBEYXRhIiwKICAgICAgICAiQ1NJRExfQ09NTU9OX0FQUERBVEEiOiAiQ29tbW9uIEFwcERhdGEiLAogICAgICAgICJDU0lETF9MT0NBTF9BUFBEQVRBIjogIkxvY2FsIEFwcERhdGEiLAogICAgfVtjc2lkbF9uYW1lXQoKICAgIGtleSA9IF93aW5yZWcuT3BlbktleSgKICAgICAgICBfd2lucmVnLkhLRVlfQ1VSUkVOVF9VU0VSLAogICAgICAgIHIiU29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cRXhwbG9yZXJcU2hlbGwgRm9sZGVycyIKICAgICkKICAgIGRpciwgdHlwZSA9IF93aW5yZWcuUXVlcnlWYWx1ZUV4KGtleSwgc2hlbGxfZm9sZGVyX25hbWUpCiAgICByZXR1cm4gZGlyCgoKZGVmIF9nZXRfd2luX2ZvbGRlcl93aXRoX3B5d2luMzIoY3NpZGxfbmFtZSk6CiAgICBmcm9tIHdpbjMyY29tLnNoZWxsIGltcG9ydCBzaGVsbGNvbiwgc2hlbGwKICAgIGRpciA9IHNoZWxsLlNIR2V0Rm9sZGVyUGF0aCgwLCBnZXRhdHRyKHNoZWxsY29uLCBjc2lkbF9uYW1lKSwgMCwgMCkKICAgICMgVHJ5IHRvIG1ha2UgdGhpcyBhIHVuaWNvZGUgcGF0aCBiZWNhdXNlIFNIR2V0Rm9sZGVyUGF0aCBkb2VzCiAgICAjIG5vdCByZXR1cm4gdW5pY29kZSBzdHJpbmdzIHdoZW4gdGhlcmUgaXMgdW5pY29kZSBkYXRhIGluIHRoZQogICAgIyBwYXRoLgogICAgdHJ5OgogICAgICAgIGRpciA9IHVuaWNvZGUoZGlyKQoKICAgICAgICAjIERvd25ncmFkZSB0byBzaG9ydCBwYXRoIG5hbWUgaWYgaGF2ZSBoaWdoYml0IGNoYXJzLiBTZWUKICAgICAgICAjIDxodHRwOi8vYnVncy5hY3RpdmVzdGF0ZS5jb20vc2hvd19idWcuY2dpP2lkPTg1MDk5Pi4KICAgICAgICBoYXNfaGlnaF9jaGFyID0gRmFsc2UKICAgICAgICBmb3IgYyBpbiBkaXI6CiAgICAgICAgICAgIGlmIG9yZChjKSA+IDI1NToKICAgICAgICAgICAgICAgIGhhc19oaWdoX2NoYXIgPSBUcnVlCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIGhhc19oaWdoX2NoYXI6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGltcG9ydCB3aW4zMmFwaQogICAgICAgICAgICAgICAgZGlyID0gd2luMzJhcGkuR2V0U2hvcnRQYXRoTmFtZShkaXIpCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CiAgICAgICAgcGFzcwogICAgcmV0dXJuIGRpcgoKCmRlZiBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9jdHlwZXMoY3NpZGxfbmFtZSk6CiAgICBpbXBvcnQgY3R5cGVzCgogICAgY3NpZGxfY29uc3QgPSB7CiAgICAgICAgIkNTSURMX0FQUERBVEEiOiAyNiwKICAgICAgICAiQ1NJRExfQ09NTU9OX0FQUERBVEEiOiAzNSwKICAgICAgICAiQ1NJRExfTE9DQUxfQVBQREFUQSI6IDI4LAogICAgfVtjc2lkbF9uYW1lXQoKICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoMTAyNCkKICAgIGN0eXBlcy53aW5kbGwuc2hlbGwzMi5TSEdldEZvbGRlclBhdGhXKE5vbmUsIGNzaWRsX2NvbnN0LCBOb25lLCAwLCBidWYpCgogICAgIyBEb3duZ3JhZGUgdG8gc2hvcnQgcGF0aCBuYW1lIGlmIGhhdmUgaGlnaGJpdCBjaGFycy4gU2VlCiAgICAjIDxodHRwOi8vYnVncy5hY3RpdmVzdGF0ZS5jb20vc2hvd19idWcuY2dpP2lkPTg1MDk5Pi4KICAgIGhhc19oaWdoX2NoYXIgPSBGYWxzZQogICAgZm9yIGMgaW4gYnVmOgogICAgICAgIGlmIG9yZChjKSA+IDI1NToKICAgICAgICAgICAgaGFzX2hpZ2hfY2hhciA9IFRydWUKICAgICAgICAgICAgYnJlYWsKICAgIGlmIGhhc19oaWdoX2NoYXI6CiAgICAgICAgYnVmMiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoMTAyNCkKICAgICAgICBpZiBjdHlwZXMud2luZGxsLmtlcm5lbDMyLkdldFNob3J0UGF0aE5hbWVXKGJ1Zi52YWx1ZSwgYnVmMiwgMTAyNCk6CiAgICAgICAgICAgIGJ1ZiA9IGJ1ZjIKCiAgICByZXR1cm4gYnVmLnZhbHVlCgpkZWYgX2dldF93aW5fZm9sZGVyX3dpdGhfam5hKGNzaWRsX25hbWUpOgogICAgaW1wb3J0IGFycmF5CiAgICBmcm9tIGNvbS5zdW4gaW1wb3J0IGpuYQogICAgZnJvbSBjb20uc3VuLmpuYS5wbGF0Zm9ybSBpbXBvcnQgd2luMzIKCiAgICBidWZfc2l6ZSA9IHdpbjMyLldpbkRlZi5NQVhfUEFUSCAqIDIKICAgIGJ1ZiA9IGFycmF5Lnplcm9zKCdjJywgYnVmX3NpemUpCiAgICBzaGVsbCA9IHdpbjMyLlNoZWxsMzIuSU5TVEFOQ0UKICAgIHNoZWxsLlNIR2V0Rm9sZGVyUGF0aChOb25lLCBnZXRhdHRyKHdpbjMyLlNobE9iaiwgY3NpZGxfbmFtZSksIE5vbmUsIHdpbjMyLlNobE9iai5TSEdGUF9UWVBFX0NVUlJFTlQsIGJ1ZikKICAgIGRpciA9IGpuYS5OYXRpdmUudG9TdHJpbmcoYnVmLnRvc3RyaW5nKCkpLnJzdHJpcCgiXDAiKQoKICAgICMgRG93bmdyYWRlIHRvIHNob3J0IHBhdGggbmFtZSBpZiBoYXZlIGhpZ2hiaXQgY2hhcnMuIFNlZQogICAgIyA8aHR0cDovL2J1Z3MuYWN0aXZlc3RhdGUuY29tL3Nob3dfYnVnLmNnaT9pZD04NTA5OT4uCiAgICBoYXNfaGlnaF9jaGFyID0gRmFsc2UKICAgIGZvciBjIGluIGRpcjoKICAgICAgICBpZiBvcmQoYykgPiAyNTU6CiAgICAgICAgICAgIGhhc19oaWdoX2NoYXIgPSBUcnVlCiAgICAgICAgICAgIGJyZWFrCiAgICBpZiBoYXNfaGlnaF9jaGFyOgogICAgICAgIGJ1ZiA9IGFycmF5Lnplcm9zKCdjJywgYnVmX3NpemUpCiAgICAgICAga2VybmVsID0gd2luMzIuS2VybmVsMzIuSU5TVEFOQ0UKICAgICAgICBpZiBrZXJuYWwuR2V0U2hvcnRQYXRoTmFtZShkaXIsIGJ1ZiwgYnVmX3NpemUpOgogICAgICAgICAgICBkaXIgPSBqbmEuTmF0aXZlLnRvU3RyaW5nKGJ1Zi50b3N0cmluZygpKS5yc3RyaXAoIlwwIikKCiAgICByZXR1cm4gZGlyCgppZiBzeXN0ZW0gPT0gIndpbjMyIjoKICAgIHRyeToKICAgICAgICBpbXBvcnQgd2luMzJjb20uc2hlbGwKICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9weXdpbjMyCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgd2luZGxsCiAgICAgICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl93aXRoX2N0eXBlcwogICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaW1wb3J0IGNvbS5zdW4uam5hCiAgICAgICAgICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9qbmEKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX2Zyb21fcmVnaXN0cnkKCgojLS0tLSBzZWxmIHRlc3QgY29kZQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIGFwcG5hbWUgPSAiTXlBcHAiCiAgICBhcHBhdXRob3IgPSAiTXlDb21wYW55IgoKICAgIHByb3BzID0gKCJ1c2VyX2RhdGFfZGlyIiwgInNpdGVfZGF0YV9kaXIiLAogICAgICAgICAgICAgInVzZXJfY29uZmlnX2RpciIsICJzaXRlX2NvbmZpZ19kaXIiLAogICAgICAgICAgICAgInVzZXJfY2FjaGVfZGlyIiwgInVzZXJfbG9nX2RpciIpCgogICAgcHJpbnQoIi0tIGFwcCBkaXJzICh3aXRoIG9wdGlvbmFsICd2ZXJzaW9uJykiKQogICAgZGlycyA9IEFwcERpcnMoYXBwbmFtZSwgYXBwYXV0aG9yLCB2ZXJzaW9uPSIxLjAiKQogICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAocHJvcCwgZ2V0YXR0cihkaXJzLCBwcm9wKSkpCgogICAgcHJpbnQoIlxuLS0gYXBwIGRpcnMgKHdpdGhvdXQgb3B0aW9uYWwgJ3ZlcnNpb24nKSIpCiAgICBkaXJzID0gQXBwRGlycyhhcHBuYW1lLCBhcHBhdXRob3IpCiAgICBmb3IgcHJvcCBpbiBwcm9wczoKICAgICAgICBwcmludCgiJXM6ICVzIiAlIChwcm9wLCBnZXRhdHRyKGRpcnMsIHByb3ApKSkKCiAgICBwcmludCgiXG4tLSBhcHAgZGlycyAod2l0aG91dCBvcHRpb25hbCAnYXBwYXV0aG9yJykiKQogICAgZGlycyA9IEFwcERpcnMoYXBwbmFtZSkKICAgIGZvciBwcm9wIGluIHByb3BzOgogICAgICAgIHByaW50KCIlczogJXMiICUgKHByb3AsIGdldGF0dHIoZGlycywgcHJvcCkpKQoKICAgIHByaW50KCJcbi0tIGFwcCBkaXJzICh3aXRoIGRpc2FibGVkICdhcHBhdXRob3InKSIpCiAgICBkaXJzID0gQXBwRGlycyhhcHBuYW1lLCBhcHBhdXRob3I9RmFsc2UpCiAgICBmb3IgcHJvcCBpbiBwcm9wczoKICAgICAgICBwcmludCgiJXM6ICVzIiAlIChwcm9wLCBnZXRhdHRyKGRpcnMsIHByb3ApKSkKUEsDBBQAAAAAAAAAIQA8KVjG0AIAANACAABEAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fX2Fib3V0X18ucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgpfX2FsbF9fID0gWwogICAgIl9fdGl0bGVfXyIsICJfX3N1bW1hcnlfXyIsICJfX3VyaV9fIiwgIl9fdmVyc2lvbl9fIiwgIl9fYXV0aG9yX18iLAogICAgIl9fZW1haWxfXyIsICJfX2xpY2Vuc2VfXyIsICJfX2NvcHlyaWdodF9fIiwKXQoKX190aXRsZV9fID0gInBhY2thZ2luZyIKX19zdW1tYXJ5X18gPSAiQ29yZSB1dGlsaXRpZXMgZm9yIFB5dGhvbiBwYWNrYWdlcyIKX191cmlfXyA9ICJodHRwczovL2dpdGh1Yi5jb20vcHlwYS9wYWNrYWdpbmciCgpfX3ZlcnNpb25fXyA9ICIxNi44IgoKX19hdXRob3JfXyA9ICJEb25hbGQgU3R1ZmZ0IGFuZCBpbmRpdmlkdWFsIGNvbnRyaWJ1dG9ycyIKX19lbWFpbF9fID0gImRvbmFsZEBzdHVmZnQuaW8iCgpfX2xpY2Vuc2VfXyA9ICJCU0Qgb3IgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIgpfX2NvcHlyaWdodF9fID0gIkNvcHlyaWdodCAyMDE0LTIwMTYgJXMiICUgX19hdXRob3JfXwpQSwMEFAAAAAAAAAAhAIF2lsoBAgAAAQIAAEMAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19faW5pdF9fLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKZnJvbSAuX19hYm91dF9fIGltcG9ydCAoCiAgICBfX2F1dGhvcl9fLCBfX2NvcHlyaWdodF9fLCBfX2VtYWlsX18sIF9fbGljZW5zZV9fLCBfX3N1bW1hcnlfXywgX190aXRsZV9fLAogICAgX191cmlfXywgX192ZXJzaW9uX18KKQoKX19hbGxfXyA9IFsKICAgICJfX3RpdGxlX18iLCAiX19zdW1tYXJ5X18iLCAiX191cmlfXyIsICJfX3ZlcnNpb25fXyIsICJfX2F1dGhvcl9fIiwKICAgICJfX2VtYWlsX18iLCAiX19saWNlbnNlX18iLCAiX19jb3B5cmlnaHRfXyIsCl0KUEsDBBQAAAAAAAAAIQDmaUrjXAMAAFwDAABCAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fY29tcGF0LnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IHN5cwoKClBZMiA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMgpQWTMgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDMKCiMgZmxha2U4OiBub3FhCgppZiBQWTM6CiAgICBzdHJpbmdfdHlwZXMgPSBzdHIsCmVsc2U6CiAgICBzdHJpbmdfdHlwZXMgPSBiYXNlc3RyaW5nLAoKCmRlZiB3aXRoX21ldGFjbGFzcyhtZXRhLCAqYmFzZXMpOgogICAgIiIiCiAgICBDcmVhdGUgYSBiYXNlIGNsYXNzIHdpdGggYSBtZXRhY2xhc3MuCiAgICAiIiIKICAgICMgVGhpcyByZXF1aXJlcyBhIGJpdCBvZiBleHBsYW5hdGlvbjogdGhlIGJhc2ljIGlkZWEgaXMgdG8gbWFrZSBhIGR1bW15CiAgICAjIG1ldGFjbGFzcyBmb3Igb25lIGxldmVsIG9mIGNsYXNzIGluc3RhbnRpYXRpb24gdGhhdCByZXBsYWNlcyBpdHNlbGYgd2l0aAogICAgIyB0aGUgYWN0dWFsIG1ldGFjbGFzcy4KICAgIGNsYXNzIG1ldGFjbGFzcyhtZXRhKToKICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIHRoaXNfYmFzZXMsIGQpOgogICAgICAgICAgICByZXR1cm4gbWV0YShuYW1lLCBiYXNlcywgZCkKICAgIHJldHVybiB0eXBlLl9fbmV3X18obWV0YWNsYXNzLCAndGVtcG9yYXJ5X2NsYXNzJywgKCksIHt9KQpQSwMEFAAAAAAAAAAhAPr9pBKIBQAAiAUAAEYAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19zdHJ1Y3R1cmVzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKCmNsYXNzIEluZmluaXR5KG9iamVjdCk6CgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiSW5maW5pdHkiCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHJlcHIoc2VsZikpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX25lZ19fKHNlbGYpOgogICAgICAgIHJldHVybiBOZWdhdGl2ZUluZmluaXR5CgpJbmZpbml0eSA9IEluZmluaXR5KCkKCgpjbGFzcyBOZWdhdGl2ZUluZmluaXR5KG9iamVjdCk6CgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiLUluZmluaXR5IgoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChyZXByKHNlbGYpKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19uZWdfXyhzZWxmKToKICAgICAgICByZXR1cm4gSW5maW5pdHkKCk5lZ2F0aXZlSW5maW5pdHkgPSBOZWdhdGl2ZUluZmluaXR5KCkKUEsDBBQAAAAAAAAAIQAw+BPcOCAAADggAABCAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBvcwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHN5cwoKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IFBhcnNlRXhjZXB0aW9uLCBQYXJzZVJlc3VsdHMsIHN0cmluZ1N0YXJ0LCBzdHJpbmdFbmQKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IFplcm9Pck1vcmUsIEdyb3VwLCBGb3J3YXJkLCBRdW90ZWRTdHJpbmcKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IExpdGVyYWwgYXMgTCAgIyBub3FhCgpmcm9tIC5fY29tcGF0IGltcG9ydCBzdHJpbmdfdHlwZXMKZnJvbSAuc3BlY2lmaWVycyBpbXBvcnQgU3BlY2lmaWVyLCBJbnZhbGlkU3BlY2lmaWVyCgoKX19hbGxfXyA9IFsKICAgICJJbnZhbGlkTWFya2VyIiwgIlVuZGVmaW5lZENvbXBhcmlzb24iLCAiVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lIiwKICAgICJNYXJrZXIiLCAiZGVmYXVsdF9lbnZpcm9ubWVudCIsCl0KCgpjbGFzcyBJbnZhbGlkTWFya2VyKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIG1hcmtlciB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNTA4LgogICAgIiIiCgoKY2xhc3MgVW5kZWZpbmVkQ29tcGFyaXNvbihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIHZhbHVlIHRoYXQgZG9lc24ndCBzdXBwb3J0IGl0LgogICAgIiIiCgoKY2xhc3MgVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBIG5hbWUgd2FzIGF0dGVtcHRlZCB0byBiZSB1c2VkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW5zaWRlIG9mIHRoZQogICAgZW52aXJvbm1lbnQuCiAgICAiIiIKCgpjbGFzcyBOb2RlKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYudmFsdWUpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPHswfSh7MSFyfSk+Ii5mb3JtYXQoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHN0cihzZWxmKSkKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCgpjbGFzcyBWYXJpYWJsZShOb2RlKToKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikKCgpjbGFzcyBWYWx1ZShOb2RlKToKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiAnInswfSInLmZvcm1hdChzZWxmKQoKCmNsYXNzIE9wKE5vZGUpOgoKICAgIGRlZiBzZXJpYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmKQoKClZBUklBQkxFID0gKAogICAgTCgiaW1wbGVtZW50YXRpb25fdmVyc2lvbiIpIHwKICAgIEwoInBsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbiIpIHwKICAgIEwoImltcGxlbWVudGF0aW9uX25hbWUiKSB8CiAgICBMKCJweXRob25fZnVsbF92ZXJzaW9uIikgfAogICAgTCgicGxhdGZvcm1fcmVsZWFzZSIpIHwKICAgIEwoInBsYXRmb3JtX3ZlcnNpb24iKSB8CiAgICBMKCJwbGF0Zm9ybV9tYWNoaW5lIikgfAogICAgTCgicGxhdGZvcm1fc3lzdGVtIikgfAogICAgTCgicHl0aG9uX3ZlcnNpb24iKSB8CiAgICBMKCJzeXNfcGxhdGZvcm0iKSB8CiAgICBMKCJvc19uYW1lIikgfAogICAgTCgib3MubmFtZSIpIHwgICMgUEVQLTM0NQogICAgTCgic3lzLnBsYXRmb3JtIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJwbGF0Zm9ybS52ZXJzaW9uIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJwbGF0Zm9ybS5tYWNoaW5lIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24iKSB8ICAjIFBFUC0zNDUKICAgIEwoInB5dGhvbl9pbXBsZW1lbnRhdGlvbiIpIHwgICMgdW5kb2N1bWVudGVkIHNldHVwdG9vbHMgbGVnYWN5CiAgICBMKCJleHRyYSIpCikKQUxJQVNFUyA9IHsKICAgICdvcy5uYW1lJzogJ29zX25hbWUnLAogICAgJ3N5cy5wbGF0Zm9ybSc6ICdzeXNfcGxhdGZvcm0nLAogICAgJ3BsYXRmb3JtLnZlcnNpb24nOiAncGxhdGZvcm1fdmVyc2lvbicsCiAgICAncGxhdGZvcm0ubWFjaGluZSc6ICdwbGF0Zm9ybV9tYWNoaW5lJywKICAgICdwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24nOiAncGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uJywKICAgICdweXRob25faW1wbGVtZW50YXRpb24nOiAncGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uJwp9ClZBUklBQkxFLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiBWYXJpYWJsZShBTElBU0VTLmdldCh0WzBdLCB0WzBdKSkpCgpWRVJTSU9OX0NNUCA9ICgKICAgIEwoIj09PSIpIHwKICAgIEwoIj09IikgfAogICAgTCgiPj0iKSB8CiAgICBMKCI8PSIpIHwKICAgIEwoIiE9IikgfAogICAgTCgifj0iKSB8CiAgICBMKCI+IikgfAogICAgTCgiPCIpCikKCk1BUktFUl9PUCA9IFZFUlNJT05fQ01QIHwgTCgibm90IGluIikgfCBMKCJpbiIpCk1BUktFUl9PUC5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogT3AodFswXSkpCgpNQVJLRVJfVkFMVUUgPSBRdW90ZWRTdHJpbmcoIiciKSB8IFF1b3RlZFN0cmluZygnIicpCk1BUktFUl9WQUxVRS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogVmFsdWUodFswXSkpCgpCT09MT1AgPSBMKCJhbmQiKSB8IEwoIm9yIikKCk1BUktFUl9WQVIgPSBWQVJJQUJMRSB8IE1BUktFUl9WQUxVRQoKTUFSS0VSX0lURU0gPSBHcm91cChNQVJLRVJfVkFSICsgTUFSS0VSX09QICsgTUFSS0VSX1ZBUikKTUFSS0VSX0lURU0uc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IHR1cGxlKHRbMF0pKQoKTFBBUkVOID0gTCgiKCIpLnN1cHByZXNzKCkKUlBBUkVOID0gTCgiKSIpLnN1cHByZXNzKCkKCk1BUktFUl9FWFBSID0gRm9yd2FyZCgpCk1BUktFUl9BVE9NID0gTUFSS0VSX0lURU0gfCBHcm91cChMUEFSRU4gKyBNQVJLRVJfRVhQUiArIFJQQVJFTikKTUFSS0VSX0VYUFIgPDwgTUFSS0VSX0FUT00gKyBaZXJvT3JNb3JlKEJPT0xPUCArIE1BUktFUl9FWFBSKQoKTUFSS0VSID0gc3RyaW5nU3RhcnQgKyBNQVJLRVJfRVhQUiArIHN0cmluZ0VuZAoKCmRlZiBfY29lcmNlX3BhcnNlX3Jlc3VsdChyZXN1bHRzKToKICAgIGlmIGlzaW5zdGFuY2UocmVzdWx0cywgUGFyc2VSZXN1bHRzKToKICAgICAgICByZXR1cm4gW19jb2VyY2VfcGFyc2VfcmVzdWx0KGkpIGZvciBpIGluIHJlc3VsdHNdCiAgICBlbHNlOgogICAgICAgIHJldHVybiByZXN1bHRzCgoKZGVmIF9mb3JtYXRfbWFya2VyKG1hcmtlciwgZmlyc3Q9VHJ1ZSk6CiAgICBhc3NlcnQgaXNpbnN0YW5jZShtYXJrZXIsIChsaXN0LCB0dXBsZSwgc3RyaW5nX3R5cGVzKSkKCiAgICAjIFNvbWV0aW1lcyB3ZSBoYXZlIGEgc3RydWN0dXJlIGxpa2UgW1suLi5dXSB3aGljaCBpcyBhIHNpbmdsZSBpdGVtIGxpc3QKICAgICMgd2hlcmUgdGhlIHNpbmdsZSBpdGVtIGlzIGl0c2VsZiBpdCdzIG93biBsaXN0LiBJbiB0aGF0IGNhc2Ugd2Ugd2FudCBza2lwCiAgICAjIHRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gc28gdGhhdCB3ZSBkb24ndCBnZXQgZXh0cmFuZW91cyAoKSBvbiB0aGUKICAgICMgb3V0c2lkZS4KICAgIGlmIChpc2luc3RhbmNlKG1hcmtlciwgbGlzdCkgYW5kIGxlbihtYXJrZXIpID09IDEgYW5kCiAgICAgICAgICAgIGlzaW5zdGFuY2UobWFya2VyWzBdLCAobGlzdCwgdHVwbGUpKSk6CiAgICAgICAgcmV0dXJuIF9mb3JtYXRfbWFya2VyKG1hcmtlclswXSkKCiAgICBpZiBpc2luc3RhbmNlKG1hcmtlciwgbGlzdCk6CiAgICAgICAgaW5uZXIgPSAoX2Zvcm1hdF9tYXJrZXIobSwgZmlyc3Q9RmFsc2UpIGZvciBtIGluIG1hcmtlcikKICAgICAgICBpZiBmaXJzdDoKICAgICAgICAgICAgcmV0dXJuICIgIi5qb2luKGlubmVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAiKCIgKyAiICIuam9pbihpbm5lcikgKyAiKSIKICAgIGVsaWYgaXNpbnN0YW5jZShtYXJrZXIsIHR1cGxlKToKICAgICAgICByZXR1cm4gIiAiLmpvaW4oW20uc2VyaWFsaXplKCkgZm9yIG0gaW4gbWFya2VyXSkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIG1hcmtlcgoKCl9vcGVyYXRvcnMgPSB7CiAgICAiaW4iOiBsYW1iZGEgbGhzLCByaHM6IGxocyBpbiByaHMsCiAgICAibm90IGluIjogbGFtYmRhIGxocywgcmhzOiBsaHMgbm90IGluIHJocywKICAgICI8Ijogb3BlcmF0b3IubHQsCiAgICAiPD0iOiBvcGVyYXRvci5sZSwKICAgICI9PSI6IG9wZXJhdG9yLmVxLAogICAgIiE9Ijogb3BlcmF0b3IubmUsCiAgICAiPj0iOiBvcGVyYXRvci5nZSwKICAgICI+Ijogb3BlcmF0b3IuZ3QsCn0KCgpkZWYgX2V2YWxfb3AobGhzLCBvcCwgcmhzKToKICAgIHRyeToKICAgICAgICBzcGVjID0gU3BlY2lmaWVyKCIiLmpvaW4oW29wLnNlcmlhbGl6ZSgpLCByaHNdKSkKICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHNwZWMuY29udGFpbnMobGhzKQoKICAgIG9wZXIgPSBfb3BlcmF0b3JzLmdldChvcC5zZXJpYWxpemUoKSkKICAgIGlmIG9wZXIgaXMgTm9uZToKICAgICAgICByYWlzZSBVbmRlZmluZWRDb21wYXJpc29uKAogICAgICAgICAgICAiVW5kZWZpbmVkIHswIXJ9IG9uIHsxIXJ9IGFuZCB7MiFyfS4iLmZvcm1hdChvcCwgbGhzLCByaHMpCiAgICAgICAgKQoKICAgIHJldHVybiBvcGVyKGxocywgcmhzKQoKCl91bmRlZmluZWQgPSBvYmplY3QoKQoKCmRlZiBfZ2V0X2VudihlbnZpcm9ubWVudCwgbmFtZSk6CiAgICB2YWx1ZSA9IGVudmlyb25tZW50LmdldChuYW1lLCBfdW5kZWZpbmVkKQoKICAgIGlmIHZhbHVlIGlzIF91bmRlZmluZWQ6CiAgICAgICAgcmFpc2UgVW5kZWZpbmVkRW52aXJvbm1lbnROYW1lKAogICAgICAgICAgICAiezAhcn0gZG9lcyBub3QgZXhpc3QgaW4gZXZhbHVhdGlvbiBlbnZpcm9ubWVudC4iLmZvcm1hdChuYW1lKQogICAgICAgICkKCiAgICByZXR1cm4gdmFsdWUKCgpkZWYgX2V2YWx1YXRlX21hcmtlcnMobWFya2VycywgZW52aXJvbm1lbnQpOgogICAgZ3JvdXBzID0gW1tdXQoKICAgIGZvciBtYXJrZXIgaW4gbWFya2VyczoKICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShtYXJrZXIsIChsaXN0LCB0dXBsZSwgc3RyaW5nX3R5cGVzKSkKCiAgICAgICAgaWYgaXNpbnN0YW5jZShtYXJrZXIsIGxpc3QpOgogICAgICAgICAgICBncm91cHNbLTFdLmFwcGVuZChfZXZhbHVhdGVfbWFya2VycyhtYXJrZXIsIGVudmlyb25tZW50KSkKICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWFya2VyLCB0dXBsZSk6CiAgICAgICAgICAgIGxocywgb3AsIHJocyA9IG1hcmtlcgoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShsaHMsIFZhcmlhYmxlKToKICAgICAgICAgICAgICAgIGxoc192YWx1ZSA9IF9nZXRfZW52KGVudmlyb25tZW50LCBsaHMudmFsdWUpCiAgICAgICAgICAgICAgICByaHNfdmFsdWUgPSByaHMudmFsdWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxoc192YWx1ZSA9IGxocy52YWx1ZQogICAgICAgICAgICAgICAgcmhzX3ZhbHVlID0gX2dldF9lbnYoZW52aXJvbm1lbnQsIHJocy52YWx1ZSkKCiAgICAgICAgICAgIGdyb3Vwc1stMV0uYXBwZW5kKF9ldmFsX29wKGxoc192YWx1ZSwgb3AsIHJoc192YWx1ZSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXNzZXJ0IG1hcmtlciBpbiBbImFuZCIsICJvciJdCiAgICAgICAgICAgIGlmIG1hcmtlciA9PSAib3IiOgogICAgICAgICAgICAgICAgZ3JvdXBzLmFwcGVuZChbXSkKCiAgICByZXR1cm4gYW55KGFsbChpdGVtKSBmb3IgaXRlbSBpbiBncm91cHMpCgoKZGVmIGZvcm1hdF9mdWxsX3ZlcnNpb24oaW5mbyk6CiAgICB2ZXJzaW9uID0gJ3swLm1ham9yfS57MC5taW5vcn0uezAubWljcm99Jy5mb3JtYXQoaW5mbykKICAgIGtpbmQgPSBpbmZvLnJlbGVhc2VsZXZlbAogICAgaWYga2luZCAhPSAnZmluYWwnOgogICAgICAgIHZlcnNpb24gKz0ga2luZFswXSArIHN0cihpbmZvLnNlcmlhbCkKICAgIHJldHVybiB2ZXJzaW9uCgoKZGVmIGRlZmF1bHRfZW52aXJvbm1lbnQoKToKICAgIGlmIGhhc2F0dHIoc3lzLCAnaW1wbGVtZW50YXRpb24nKToKICAgICAgICBpdmVyID0gZm9ybWF0X2Z1bGxfdmVyc2lvbihzeXMuaW1wbGVtZW50YXRpb24udmVyc2lvbikKICAgICAgICBpbXBsZW1lbnRhdGlvbl9uYW1lID0gc3lzLmltcGxlbWVudGF0aW9uLm5hbWUKICAgIGVsc2U6CiAgICAgICAgaXZlciA9ICcwJwogICAgICAgIGltcGxlbWVudGF0aW9uX25hbWUgPSAnJwoKICAgIHJldHVybiB7CiAgICAgICAgImltcGxlbWVudGF0aW9uX25hbWUiOiBpbXBsZW1lbnRhdGlvbl9uYW1lLAogICAgICAgICJpbXBsZW1lbnRhdGlvbl92ZXJzaW9uIjogaXZlciwKICAgICAgICAib3NfbmFtZSI6IG9zLm5hbWUsCiAgICAgICAgInBsYXRmb3JtX21hY2hpbmUiOiBwbGF0Zm9ybS5tYWNoaW5lKCksCiAgICAgICAgInBsYXRmb3JtX3JlbGVhc2UiOiBwbGF0Zm9ybS5yZWxlYXNlKCksCiAgICAgICAgInBsYXRmb3JtX3N5c3RlbSI6IHBsYXRmb3JtLnN5c3RlbSgpLAogICAgICAgICJwbGF0Zm9ybV92ZXJzaW9uIjogcGxhdGZvcm0udmVyc2lvbigpLAogICAgICAgICJweXRob25fZnVsbF92ZXJzaW9uIjogcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKSwKICAgICAgICAicGxhdGZvcm1fcHl0aG9uX2ltcGxlbWVudGF0aW9uIjogcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCksCiAgICAgICAgInB5dGhvbl92ZXJzaW9uIjogcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKVs6M10sCiAgICAgICAgInN5c19wbGF0Zm9ybSI6IHN5cy5wbGF0Zm9ybSwKICAgIH0KCgpjbGFzcyBNYXJrZXIob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWFya2VyKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX21hcmtlcnMgPSBfY29lcmNlX3BhcnNlX3Jlc3VsdChNQVJLRVIucGFyc2VTdHJpbmcobWFya2VyKSkKICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgZXJyX3N0ciA9ICJJbnZhbGlkIG1hcmtlcjogezAhcn0sIHBhcnNlIGVycm9yIGF0IHsxIXJ9Ii5mb3JtYXQoCiAgICAgICAgICAgICAgICBtYXJrZXIsIG1hcmtlcltlLmxvYzplLmxvYyArIDhdKQogICAgICAgICAgICByYWlzZSBJbnZhbGlkTWFya2VyKGVycl9zdHIpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIF9mb3JtYXRfbWFya2VyKHNlbGYuX21hcmtlcnMpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPE1hcmtlcih7MCFyfSk+Ii5mb3JtYXQoc3RyKHNlbGYpKQoKICAgIGRlZiBldmFsdWF0ZShzZWxmLCBlbnZpcm9ubWVudD1Ob25lKToKICAgICAgICAiIiJFdmFsdWF0ZSBhIG1hcmtlci4KCiAgICAgICAgUmV0dXJuIHRoZSBib29sZWFuIGZyb20gZXZhbHVhdGluZyB0aGUgZ2l2ZW4gbWFya2VyIGFnYWluc3QgdGhlCiAgICAgICAgZW52aXJvbm1lbnQuIGVudmlyb25tZW50IGlzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRvIG92ZXJyaWRlIGFsbCBvcgogICAgICAgIHBhcnQgb2YgdGhlIGRldGVybWluZWQgZW52aXJvbm1lbnQuCgogICAgICAgIFRoZSBlbnZpcm9ubWVudCBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGN1cnJlbnQgUHl0aG9uIHByb2Nlc3MuCiAgICAgICAgIiIiCiAgICAgICAgY3VycmVudF9lbnZpcm9ubWVudCA9IGRlZmF1bHRfZW52aXJvbm1lbnQoKQogICAgICAgIGlmIGVudmlyb25tZW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICBjdXJyZW50X2Vudmlyb25tZW50LnVwZGF0ZShlbnZpcm9ubWVudCkKCiAgICAgICAgcmV0dXJuIF9ldmFsdWF0ZV9tYXJrZXJzKHNlbGYuX21hcmtlcnMsIGN1cnJlbnRfZW52aXJvbm1lbnQpClBLAwQUAAAAAAAAACEApYYd2wMRAAADEQAARwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvcmVxdWlyZW1lbnRzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IHN0cmluZwppbXBvcnQgcmUKCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBzdHJpbmdTdGFydCwgc3RyaW5nRW5kLCBvcmlnaW5hbFRleHRGb3IsIFBhcnNlRXhjZXB0aW9uCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBaZXJvT3JNb3JlLCBXb3JkLCBPcHRpb25hbCwgUmVnZXgsIENvbWJpbmUKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5weXBhcnNpbmcgaW1wb3J0IExpdGVyYWwgYXMgTCAgIyBub3FhCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4uc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJscGFyc2UKCmZyb20gLm1hcmtlcnMgaW1wb3J0IE1BUktFUl9FWFBSLCBNYXJrZXIKZnJvbSAuc3BlY2lmaWVycyBpbXBvcnQgTGVnYWN5U3BlY2lmaWVyLCBTcGVjaWZpZXIsIFNwZWNpZmllclNldAoKCmNsYXNzIEludmFsaWRSZXF1aXJlbWVudChWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCByZXF1aXJlbWVudCB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNTA4LgogICAgIiIiCgoKQUxQSEFOVU0gPSBXb3JkKHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cykKCkxCUkFDS0VUID0gTCgiWyIpLnN1cHByZXNzKCkKUkJSQUNLRVQgPSBMKCJdIikuc3VwcHJlc3MoKQpMUEFSRU4gPSBMKCIoIikuc3VwcHJlc3MoKQpSUEFSRU4gPSBMKCIpIikuc3VwcHJlc3MoKQpDT01NQSA9IEwoIiwiKS5zdXBwcmVzcygpClNFTUlDT0xPTiA9IEwoIjsiKS5zdXBwcmVzcygpCkFUID0gTCgiQCIpLnN1cHByZXNzKCkKClBVTkNUVUFUSU9OID0gV29yZCgiLV8uIikKSURFTlRJRklFUl9FTkQgPSBBTFBIQU5VTSB8IChaZXJvT3JNb3JlKFBVTkNUVUFUSU9OKSArIEFMUEhBTlVNKQpJREVOVElGSUVSID0gQ29tYmluZShBTFBIQU5VTSArIFplcm9Pck1vcmUoSURFTlRJRklFUl9FTkQpKQoKTkFNRSA9IElERU5USUZJRVIoIm5hbWUiKQpFWFRSQSA9IElERU5USUZJRVIKClVSSSA9IFJlZ2V4KHInW14gXSsnKSgidXJsIikKVVJMID0gKEFUICsgVVJJKQoKRVhUUkFTX0xJU1QgPSBFWFRSQSArIFplcm9Pck1vcmUoQ09NTUEgKyBFWFRSQSkKRVhUUkFTID0gKExCUkFDS0VUICsgT3B0aW9uYWwoRVhUUkFTX0xJU1QpICsgUkJSQUNLRVQpKCJleHRyYXMiKQoKVkVSU0lPTl9QRVA0NDAgPSBSZWdleChTcGVjaWZpZXIuX3JlZ2V4X3N0ciwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpClZFUlNJT05fTEVHQUNZID0gUmVnZXgoTGVnYWN5U3BlY2lmaWVyLl9yZWdleF9zdHIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQoKVkVSU0lPTl9PTkUgPSBWRVJTSU9OX1BFUDQ0MCBeIFZFUlNJT05fTEVHQUNZClZFUlNJT05fTUFOWSA9IENvbWJpbmUoVkVSU0lPTl9PTkUgKyBaZXJvT3JNb3JlKENPTU1BICsgVkVSU0lPTl9PTkUpLAogICAgICAgICAgICAgICAgICAgICAgIGpvaW5TdHJpbmc9IiwiLCBhZGphY2VudD1GYWxzZSkoIl9yYXdfc3BlYyIpCl9WRVJTSU9OX1NQRUMgPSBPcHRpb25hbCgoKExQQVJFTiArIFZFUlNJT05fTUFOWSArIFJQQVJFTikgfCBWRVJTSU9OX01BTlkpKQpfVkVSU0lPTl9TUEVDLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiB0Ll9yYXdfc3BlYyBvciAnJykKClZFUlNJT05fU1BFQyA9IG9yaWdpbmFsVGV4dEZvcihfVkVSU0lPTl9TUEVDKSgic3BlY2lmaWVyIikKVkVSU0lPTl9TUEVDLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiB0WzFdKQoKTUFSS0VSX0VYUFIgPSBvcmlnaW5hbFRleHRGb3IoTUFSS0VSX0VYUFIoKSkoIm1hcmtlciIpCk1BUktFUl9FWFBSLnNldFBhcnNlQWN0aW9uKAogICAgbGFtYmRhIHMsIGwsIHQ6IE1hcmtlcihzW3QuX29yaWdpbmFsX3N0YXJ0OnQuX29yaWdpbmFsX2VuZF0pCikKTUFSS0VSX1NFUEVSQVRPUiA9IFNFTUlDT0xPTgpNQVJLRVIgPSBNQVJLRVJfU0VQRVJBVE9SICsgTUFSS0VSX0VYUFIKClZFUlNJT05fQU5EX01BUktFUiA9IFZFUlNJT05fU1BFQyArIE9wdGlvbmFsKE1BUktFUikKVVJMX0FORF9NQVJLRVIgPSBVUkwgKyBPcHRpb25hbChNQVJLRVIpCgpOQU1FRF9SRVFVSVJFTUVOVCA9IFwKICAgIE5BTUUgKyBPcHRpb25hbChFWFRSQVMpICsgKFVSTF9BTkRfTUFSS0VSIHwgVkVSU0lPTl9BTkRfTUFSS0VSKQoKUkVRVUlSRU1FTlQgPSBzdHJpbmdTdGFydCArIE5BTUVEX1JFUVVJUkVNRU5UICsgc3RyaW5nRW5kCgoKY2xhc3MgUmVxdWlyZW1lbnQob2JqZWN0KToKICAgICIiIlBhcnNlIGEgcmVxdWlyZW1lbnQuCgogICAgUGFyc2UgYSBnaXZlbiByZXF1aXJlbWVudCBzdHJpbmcgaW50byBpdHMgcGFydHMsIHN1Y2ggYXMgbmFtZSwgc3BlY2lmaWVyLAogICAgVVJMLCBhbmQgZXh0cmFzLiBSYWlzZXMgSW52YWxpZFJlcXVpcmVtZW50IG9uIGEgYmFkbHktZm9ybWVkIHJlcXVpcmVtZW50CiAgICBzdHJpbmcuCiAgICAiIiIKCiAgICAjIFRPRE86IENhbiB3ZSB0ZXN0IHdoZXRoZXIgc29tZXRoaW5nIGlzIGNvbnRhaW5lZCB3aXRoaW4gYSByZXF1aXJlbWVudD8KICAgICMgICAgICAgSWYgc28gaG93IGRvIHdlIGRvIHRoYXQ/IERvIHdlIG5lZWQgdG8gdGVzdCBhZ2FpbnN0IHRoZSBfbmFtZV8gb2YKICAgICMgICAgICAgdGhlIHRoaW5nIGFzIHdlbGwgYXMgdGhlIHZlcnNpb24/IFdoYXQgYWJvdXQgdGhlIG1hcmtlcnM/CiAgICAjIFRPRE86IENhbiB3ZSBub3JtYWxpemUgdGhlIG5hbWUgYW5kIGV4dHJhIG5hbWU/CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcXVpcmVtZW50X3N0cmluZyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXEgPSBSRVFVSVJFTUVOVC5wYXJzZVN0cmluZyhyZXF1aXJlbWVudF9zdHJpbmcpCiAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRSZXF1aXJlbWVudCgKICAgICAgICAgICAgICAgICJJbnZhbGlkIHJlcXVpcmVtZW50LCBwYXJzZSBlcnJvciBhdCBcInswIXJ9XCIiLmZvcm1hdCgKICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zdHJpbmdbZS5sb2M6ZS5sb2MgKyA4XSkpCgogICAgICAgIHNlbGYubmFtZSA9IHJlcS5uYW1lCiAgICAgICAgaWYgcmVxLnVybDoKICAgICAgICAgICAgcGFyc2VkX3VybCA9IHVybHBhcnNlLnVybHBhcnNlKHJlcS51cmwpCiAgICAgICAgICAgIGlmIG5vdCAocGFyc2VkX3VybC5zY2hlbWUgYW5kIHBhcnNlZF91cmwubmV0bG9jKSBvciAoCiAgICAgICAgICAgICAgICAgICAgbm90IHBhcnNlZF91cmwuc2NoZW1lIGFuZCBub3QgcGFyc2VkX3VybC5uZXRsb2MpOgogICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZFJlcXVpcmVtZW50KCJJbnZhbGlkIFVSTCBnaXZlbiIpCiAgICAgICAgICAgIHNlbGYudXJsID0gcmVxLnVybAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudXJsID0gTm9uZQogICAgICAgIHNlbGYuZXh0cmFzID0gc2V0KHJlcS5leHRyYXMuYXNMaXN0KCkgaWYgcmVxLmV4dHJhcyBlbHNlIFtdKQogICAgICAgIHNlbGYuc3BlY2lmaWVyID0gU3BlY2lmaWVyU2V0KHJlcS5zcGVjaWZpZXIpCiAgICAgICAgc2VsZi5tYXJrZXIgPSByZXEubWFya2VyIGlmIHJlcS5tYXJrZXIgZWxzZSBOb25lCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcGFydHMgPSBbc2VsZi5uYW1lXQoKICAgICAgICBpZiBzZWxmLmV4dHJhczoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJbezB9XSIuZm9ybWF0KCIsIi5qb2luKHNvcnRlZChzZWxmLmV4dHJhcykpKSkKCiAgICAgICAgaWYgc2VsZi5zcGVjaWZpZXI6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZChzdHIoc2VsZi5zcGVjaWZpZXIpKQoKICAgICAgICBpZiBzZWxmLnVybDoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJAIHswfSIuZm9ybWF0KHNlbGYudXJsKSkKCiAgICAgICAgaWYgc2VsZi5tYXJrZXI6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiOyB7MH0iLmZvcm1hdChzZWxmLm1hcmtlcikpCgogICAgICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxSZXF1aXJlbWVudCh7MCFyfSk+Ii5mb3JtYXQoc3RyKHNlbGYpKQpQSwMEFAAAAAAAAAAhAHxFg4x5bQAAeW0AAEUAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3NwZWNpZmllcnMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgYWJjCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgcmUKCmZyb20gLl9jb21wYXQgaW1wb3J0IHN0cmluZ190eXBlcywgd2l0aF9tZXRhY2xhc3MKZnJvbSAudmVyc2lvbiBpbXBvcnQgVmVyc2lvbiwgTGVnYWN5VmVyc2lvbiwgcGFyc2UKCgpjbGFzcyBJbnZhbGlkU3BlY2lmaWVyKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIHNwZWNpZmllciB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNDQwLgogICAgIiIiCgoKY2xhc3MgQmFzZVNwZWNpZmllcih3aXRoX21ldGFjbGFzcyhhYmMuQUJDTWV0YSwgb2JqZWN0KSk6CgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB0aGUgc3RyIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgU3BlY2lmaWVyIGxpa2Ugb2JqZWN0LiBUaGlzCiAgICAgICAgc2hvdWxkIGJlIHJlcHJlc2VudGF0aXZlIG9mIHRoZSBTcGVjaWZpZXIgaXRzZWxmLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgaGFzaCB2YWx1ZSBmb3IgdGhpcyBTcGVjaWZpZXIgbGlrZSBvYmplY3QuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIGJvb2xlYW4gcmVwcmVzZW50aW5nIHdoZXRoZXIgb3Igbm90IHRoZSB0d28gU3BlY2lmaWVyIGxpa2UKICAgICAgICBvYmplY3RzIGFyZSBlcXVhbC4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgYm9vbGVhbiByZXByZXNlbnRpbmcgd2hldGhlciBvciBub3QgdGhlIHR3byBTcGVjaWZpZXIgbGlrZQogICAgICAgIG9iamVjdHMgYXJlIG5vdCBlcXVhbC4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0cHJvcGVydHkKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHByZS1yZWxlYXNlcyBhcyBhIHdob2xlIGFyZSBhbGxvd2VkIGJ5IHRoaXMKICAgICAgICBzcGVjaWZpZXIuCiAgICAgICAgIiIiCgogICAgQHByZXJlbGVhc2VzLnNldHRlcgogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYsIHZhbHVlKToKICAgICAgICAiIiIKICAgICAgICBTZXRzIHdoZXRoZXIgb3Igbm90IHByZS1yZWxlYXNlcyBhcyBhIHdob2xlIGFyZSBhbGxvd2VkIGJ5IHRoaXMKICAgICAgICBzcGVjaWZpZXIuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIGNvbnRhaW5zKHNlbGYsIGl0ZW0sIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIERldGVybWluZXMgaWYgdGhlIGdpdmVuIGl0ZW0gaXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIHNwZWNpZmllci4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgZmlsdGVyKHNlbGYsIGl0ZXJhYmxlLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBUYWtlcyBhbiBpdGVyYWJsZSBvZiBpdGVtcyBhbmQgZmlsdGVycyB0aGVtIHNvIHRoYXQgb25seSBpdGVtcyB3aGljaAogICAgICAgIGFyZSBjb250YWluZWQgd2l0aGluIHRoaXMgc3BlY2lmaWVyIGFyZSBhbGxvd2VkIGluIGl0LgogICAgICAgICIiIgoKCmNsYXNzIF9JbmRpdmlkdWFsU3BlY2lmaWVyKEJhc2VTcGVjaWZpZXIpOgoKICAgIF9vcGVyYXRvcnMgPSB7fQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcGVjPSIiLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICBtYXRjaCA9IHNlbGYuX3JlZ2V4LnNlYXJjaChzcGVjKQogICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFNwZWNpZmllcigiSW52YWxpZCBzcGVjaWZpZXI6ICd7MH0nIi5mb3JtYXQoc3BlYykpCgogICAgICAgIHNlbGYuX3NwZWMgPSAoCiAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJvcGVyYXRvciIpLnN0cmlwKCksCiAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJ2ZXJzaW9uIikuc3RyaXAoKSwKICAgICAgICApCgogICAgICAgICMgU3RvcmUgd2hldGhlciBvciBub3QgdGhpcyBTcGVjaWZpZXIgc2hvdWxkIGFjY2VwdCBwcmVyZWxlYXNlcwogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gcHJlcmVsZWFzZXMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcHJlID0gKAogICAgICAgICAgICAiLCBwcmVyZWxlYXNlcz17MCFyfSIuZm9ybWF0KHNlbGYucHJlcmVsZWFzZXMpCiAgICAgICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lCiAgICAgICAgICAgIGVsc2UgIiIKICAgICAgICApCgogICAgICAgIHJldHVybiAiPHswfSh7MSFyfXsyfSk+Ii5mb3JtYXQoCiAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLAogICAgICAgICAgICBzdHIoc2VsZiksCiAgICAgICAgICAgIHByZSwKICAgICAgICApCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJ7MH17MX0iLmZvcm1hdCgqc2VsZi5fc3BlYykKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fc3BlYykKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvdGhlciA9IHNlbGYuX19jbGFzc19fKG90aGVyKQogICAgICAgICAgICBleGNlcHQgSW52YWxpZFNwZWNpZmllcjoKICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjID09IG90aGVyLl9zcGVjCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3RoZXIgPSBzZWxmLl9fY2xhc3NfXyhvdGhlcikKICAgICAgICAgICAgZXhjZXB0IEludmFsaWRTcGVjaWZpZXI6CiAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gc2VsZi5fc3BlYyAhPSBvdGhlci5fc3BlYwoKICAgIGRlZiBfZ2V0X29wZXJhdG9yKHNlbGYsIG9wKToKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCAiX2NvbXBhcmVfezB9Ii5mb3JtYXQoc2VsZi5fb3BlcmF0b3JzW29wXSkpCgogICAgZGVmIF9jb2VyY2VfdmVyc2lvbihzZWxmLCB2ZXJzaW9uKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2ZXJzaW9uLCAoTGVnYWN5VmVyc2lvbiwgVmVyc2lvbikpOgogICAgICAgICAgICB2ZXJzaW9uID0gcGFyc2UodmVyc2lvbikKICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG9wZXJhdG9yKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjWzBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fc3BlY1sxXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9wcmVyZWxlYXNlcwoKICAgIEBwcmVyZWxlYXNlcy5zZXR0ZXIKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSB2YWx1ZQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6CiAgICAgICAgcmV0dXJuIHNlbGYuY29udGFpbnMoaXRlbSkKCiAgICBkZWYgY29udGFpbnMoc2VsZiwgaXRlbSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIyBEZXRlcm1pbmUgaWYgcHJlcmVsZWFzZXMgYXJlIHRvIGJlIGFsbG93ZWQgb3Igbm90LgogICAgICAgIGlmIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHByZXJlbGVhc2VzID0gc2VsZi5wcmVyZWxlYXNlcwoKICAgICAgICAjIE5vcm1hbGl6ZSBpdGVtIHRvIGEgVmVyc2lvbiBvciBMZWdhY3lWZXJzaW9uLCB0aGlzIGFsbG93cyB1cyB0byBoYXZlCiAgICAgICAgIyBhIHNob3J0Y3V0IGZvciBgYCIyLjAiIGluIFNwZWNpZmllcigiPj0yIikKICAgICAgICBpdGVtID0gc2VsZi5fY29lcmNlX3ZlcnNpb24oaXRlbSkKCiAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGJlIHN1cHBvcnRpbmcgcHJlcmVsZWFzZXMgaW4gdGhpcyBzcGVjaWZpZXIKICAgICAgICAjIG9yIG5vdCwgaWYgd2UgZG8gbm90IHN1cHBvcnQgcHJlcmVsZWFzZXMgdGhhbiB3ZSBjYW4gc2hvcnQgY2lyY3VpdAogICAgICAgICMgbG9naWMgaWYgdGhpcyB2ZXJzaW9uIGlzIGEgcHJlcmVsZWFzZXMuCiAgICAgICAgaWYgaXRlbS5pc19wcmVyZWxlYXNlIGFuZCBub3QgcHJlcmVsZWFzZXM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIEFjdHVhbGx5IGRvIHRoZSBjb21wYXJpc29uIHRvIGRldGVybWluZSBpZiB0aGlzIGl0ZW0gaXMgY29udGFpbmVkCiAgICAgICAgIyB3aXRoaW4gdGhpcyBTcGVjaWZpZXIgb3Igbm90LgogICAgICAgIHJldHVybiBzZWxmLl9nZXRfb3BlcmF0b3Ioc2VsZi5vcGVyYXRvcikoaXRlbSwgc2VsZi52ZXJzaW9uKQoKICAgIGRlZiBmaWx0ZXIoc2VsZiwgaXRlcmFibGUsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgIHlpZWxkZWQgPSBGYWxzZQogICAgICAgIGZvdW5kX3ByZXJlbGVhc2VzID0gW10KCiAgICAgICAga3cgPSB7InByZXJlbGVhc2VzIjogcHJlcmVsZWFzZXMgaWYgcHJlcmVsZWFzZXMgaXMgbm90IE5vbmUgZWxzZSBUcnVlfQoKICAgICAgICAjIEF0dGVtcHQgdG8gaXRlcmF0ZSBvdmVyIGFsbCB0aGUgdmFsdWVzIGluIHRoZSBpdGVyYWJsZSBhbmQgaWYgYW55IG9mCiAgICAgICAgIyB0aGVtIG1hdGNoLCB5aWVsZCB0aGVtLgogICAgICAgIGZvciB2ZXJzaW9uIGluIGl0ZXJhYmxlOgogICAgICAgICAgICBwYXJzZWRfdmVyc2lvbiA9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHZlcnNpb24pCgogICAgICAgICAgICBpZiBzZWxmLmNvbnRhaW5zKHBhcnNlZF92ZXJzaW9uLCAqKmt3KToKICAgICAgICAgICAgICAgICMgSWYgb3VyIHZlcnNpb24gaXMgYSBwcmVyZWxlYXNlLCBhbmQgd2Ugd2VyZSBub3Qgc2V0IHRvIGFsbG93CiAgICAgICAgICAgICAgICAjIHByZXJlbGVhc2VzLCB0aGVuIHdlJ2xsIHN0b3JlIGl0IGZvciBsYXRlciBpbmNhc2Ugbm90aGluZwogICAgICAgICAgICAgICAgIyBlbHNlIG1hdGNoZXMgdGhpcyBzcGVjaWZpZXIuCiAgICAgICAgICAgICAgICBpZiAocGFyc2VkX3ZlcnNpb24uaXNfcHJlcmVsZWFzZSBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgICAgIChwcmVyZWxlYXNlcyBvciBzZWxmLnByZXJlbGVhc2VzKSk6CiAgICAgICAgICAgICAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMuYXBwZW5kKHZlcnNpb24pCiAgICAgICAgICAgICAgICAjIEVpdGhlciB0aGlzIGlzIG5vdCBhIHByZXJlbGVhc2UsIG9yIHdlIHNob3VsZCBoYXZlIGJlZW4KICAgICAgICAgICAgICAgICMgYWNjZXB0aW5nIHByZXJlbGVhc2VzIGZyb20gdGhlIGJlZ2luaW5nLgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB5aWVsZGVkID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIHlpZWxkIHZlcnNpb24KCiAgICAgICAgIyBOb3cgdGhhdCB3ZSd2ZSBpdGVyYXRlZCBvdmVyIGV2ZXJ5dGhpbmcsIGRldGVybWluZSBpZiB3ZSd2ZSB5aWVsZGVkCiAgICAgICAgIyBhbnkgdmFsdWVzLCBhbmQgaWYgd2UgaGF2ZSBub3QgYW5kIHdlIGhhdmUgYW55IHByZXJlbGVhc2VzIHN0b3JlZCB1cAogICAgICAgICMgdGhlbiB3ZSB3aWxsIGdvIGFoZWFkIGFuZCB5aWVsZCB0aGUgcHJlcmVsZWFzZXMuCiAgICAgICAgaWYgbm90IHlpZWxkZWQgYW5kIGZvdW5kX3ByZXJlbGVhc2VzOgogICAgICAgICAgICBmb3IgdmVyc2lvbiBpbiBmb3VuZF9wcmVyZWxlYXNlczoKICAgICAgICAgICAgICAgIHlpZWxkIHZlcnNpb24KCgpjbGFzcyBMZWdhY3lTcGVjaWZpZXIoX0luZGl2aWR1YWxTcGVjaWZpZXIpOgoKICAgIF9yZWdleF9zdHIgPSAoCiAgICAgICAgciIiIgogICAgICAgICg/UDxvcGVyYXRvcj4oPT18IT18PD18Pj18PHw+KSkKICAgICAgICBccyoKICAgICAgICAoP1A8dmVyc2lvbj4KICAgICAgICAgICAgW14sO1xzKV0qICMgU2luY2UgdGhpcyBpcyBhICJsZWdhY3kiIHNwZWNpZmllciwgYW5kIHRoZSB2ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAjIHN0cmluZyBjYW4gYmUganVzdCBhYm91dCBhbnl0aGluZywgd2UgbWF0Y2ggZXZlcnl0aGluZwogICAgICAgICAgICAgICAgICAgICAgIyBleGNlcHQgZm9yIHdoaXRlc3BhY2UsIGEgc2VtaS1jb2xvbiBmb3IgbWFya2VyIHN1cHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAjIGEgY2xvc2luZyBwYXJlbiBzaW5jZSB2ZXJzaW9ucyBjYW4gYmUgZW5jbG9zZWQgaW4KICAgICAgICAgICAgICAgICAgICAgICMgdGhlbSwgYW5kIGEgY29tbWEgc2luY2UgaXQncyBhIHZlcnNpb24gc2VwYXJhdG9yLgogICAgICAgICkKICAgICAgICAiIiIKICAgICkKCiAgICBfcmVnZXggPSByZS5jb21waWxlKAogICAgICAgIHIiXlxzKiIgKyBfcmVnZXhfc3RyICsgciJccyokIiwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpCgogICAgX29wZXJhdG9ycyA9IHsKICAgICAgICAiPT0iOiAiZXF1YWwiLAogICAgICAgICIhPSI6ICJub3RfZXF1YWwiLAogICAgICAgICI8PSI6ICJsZXNzX3RoYW5fZXF1YWwiLAogICAgICAgICI+PSI6ICJncmVhdGVyX3RoYW5fZXF1YWwiLAogICAgICAgICI8IjogImxlc3NfdGhhbiIsCiAgICAgICAgIj4iOiAiZ3JlYXRlcl90aGFuIiwKICAgIH0KCiAgICBkZWYgX2NvZXJjZV92ZXJzaW9uKHNlbGYsIHZlcnNpb24pOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZlcnNpb24sIExlZ2FjeVZlcnNpb24pOgogICAgICAgICAgICB2ZXJzaW9uID0gTGVnYWN5VmVyc2lvbihzdHIodmVyc2lvbikpCiAgICAgICAgcmV0dXJuIHZlcnNpb24KCiAgICBkZWYgX2NvbXBhcmVfZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA9PSBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9ub3RfZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSAhPSBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9sZXNzX3RoYW5fZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA8PSBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9ncmVhdGVyX3RoYW5fZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA+PSBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9sZXNzX3RoYW4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA8IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2dyZWF0ZXJfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID4gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCgpkZWYgX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlKGZuKToKICAgIEBmdW5jdG9vbHMud3JhcHMoZm4pCiAgICBkZWYgd3JhcHBlZChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocHJvc3BlY3RpdmUsIFZlcnNpb24pOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gZm4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpCiAgICByZXR1cm4gd3JhcHBlZAoKCmNsYXNzIFNwZWNpZmllcihfSW5kaXZpZHVhbFNwZWNpZmllcik6CgogICAgX3JlZ2V4X3N0ciA9ICgKICAgICAgICByIiIiCiAgICAgICAgKD9QPG9wZXJhdG9yPih+PXw9PXwhPXw8PXw+PXw8fD58PT09KSkKICAgICAgICAoP1A8dmVyc2lvbj4KICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAjIFRoZSBpZGVudGl0eSBvcGVyYXRvcnMgYWxsb3cgZm9yIGFuIGVzY2FwZSBoYXRjaCB0aGF0IHdpbGwKICAgICAgICAgICAgICAgICMgZG8gYW4gZXhhY3Qgc3RyaW5nIG1hdGNoIG9mIHRoZSB2ZXJzaW9uIHlvdSB3aXNoIHRvIGluc3RhbGwuCiAgICAgICAgICAgICAgICAjIFRoaXMgd2lsbCBub3QgYmUgcGFyc2VkIGJ5IFBFUCA0NDAgYW5kIHdlIGNhbm5vdCBkZXRlcm1pbmUKICAgICAgICAgICAgICAgICMgYW55IHNlbWFudGljIG1lYW5pbmcgZnJvbSBpdC4gVGhpcyBvcGVyYXRvciBpcyBkaXNjb3VyYWdlZAogICAgICAgICAgICAgICAgIyBidXQgaW5jbHVkZWQgZW50aXJlbHkgYXMgYW4gZXNjYXBlIGhhdGNoLgogICAgICAgICAgICAgICAgKD88PT09PSkgICMgT25seSBtYXRjaCBmb3IgdGhlIGlkZW50aXR5IG9wZXJhdG9yCiAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgIFteXHNdKiAgICAjIFdlIGp1c3QgbWF0Y2ggZXZlcnl0aGluZywgZXhjZXB0IGZvciB3aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzaW5jZSB3ZSBhcmUgb25seSB0ZXN0aW5nIGZvciBzdHJpY3QgaWRlbnRpdHkuCiAgICAgICAgICAgICkKICAgICAgICAgICAgfAogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgVGhlIChub24pZXF1YWxpdHkgb3BlcmF0b3JzIGFsbG93IGZvciB3aWxkIGNhcmQgYW5kIGxvY2FsCiAgICAgICAgICAgICAgICAjIHZlcnNpb25zIHRvIGJlIHNwZWNpZmllZCBzbyB3ZSBoYXZlIHRvIGRlZmluZSB0aGVzZSB0d28KICAgICAgICAgICAgICAgICMgb3BlcmF0b3JzIHNlcGFyYXRlbHkgdG8gZW5hYmxlIHRoYXQuCiAgICAgICAgICAgICAgICAoPzw9PT18IT0pICAgICAgICAgICAgIyBPbmx5IG1hdGNoIGZvciBlcXVhbHMgYW5kIG5vdCBlcXVhbHMKCiAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgIHY/CiAgICAgICAgICAgICAgICAoPzpbMC05XSshKT8gICAgICAgICAgIyBlcG9jaAogICAgICAgICAgICAgICAgWzAtOV0rKD86XC5bMC05XSspKiAgICMgcmVsZWFzZQogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcHJlIHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgKGF8YnxjfHJjfGFscGhhfGJldGF8cHJlfHByZXZpZXcpCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIFswLTldKgogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAjIHBvc3QgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgICg/Oi1bMC05XSspfCg/OlstX1wuXT8ocG9zdHxyZXZ8cilbLV9cLl0/WzAtOV0qKQogICAgICAgICAgICAgICAgKT8KCiAgICAgICAgICAgICAgICAjIFlvdSBjYW5ub3QgdXNlIGEgd2lsZCBjYXJkIGFuZCBhIGRldiBvciBsb2NhbCB2ZXJzaW9uCiAgICAgICAgICAgICAgICAjIHRvZ2V0aGVyIHNvIGdyb3VwIHRoZW0gd2l0aCBhIHwgYW5kIG1ha2UgdGhlbSBvcHRpb25hbC4KICAgICAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgICAgICg/OlstX1wuXT9kZXZbLV9cLl0/WzAtOV0qKT8gICAgICAgICAjIGRldiByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgKD86XCtbYS16MC05XSsoPzpbLV9cLl1bYS16MC05XSspKik/ICMgbG9jYWwKICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgXC5cKiAgIyBXaWxkIGNhcmQgc3ludGF4IG9mIC4qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICApCiAgICAgICAgICAgIHwKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAjIFRoZSBjb21wYXRpYmxlIG9wZXJhdG9yIHJlcXVpcmVzIGF0IGxlYXN0IHR3byBkaWdpdHMgaW4gdGhlCiAgICAgICAgICAgICAgICAjIHJlbGVhc2Ugc2VnbWVudC4KICAgICAgICAgICAgICAgICg/PD1+PSkgICAgICAgICAgICAgICAjIE9ubHkgbWF0Y2ggZm9yIHRoZSBjb21wYXRpYmxlIG9wZXJhdG9yCgogICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICB2PwogICAgICAgICAgICAgICAgKD86WzAtOV0rISk/ICAgICAgICAgICMgZXBvY2gKICAgICAgICAgICAgICAgIFswLTldKyg/OlwuWzAtOV0rKSsgICAjIHJlbGVhc2UgIChXZSBoYXZlIGEgKyBpbnN0ZWFkIG9mIGEgKikKICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAjIHByZSByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIChhfGJ8Y3xyY3xhbHBoYXxiZXRhfHByZXxwcmV2aWV3KQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICBbMC05XSoKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgKD86LVswLTldKyl8KD86Wy1fXC5dPyhwb3N0fHJldnxyKVstX1wuXT9bMC05XSopCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86Wy1fXC5dP2RldlstX1wuXT9bMC05XSopPyAgICAgICAgICAjIGRldiByZWxlYXNlCiAgICAgICAgICAgICkKICAgICAgICAgICAgfAogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgQWxsIG90aGVyIG9wZXJhdG9ycyBvbmx5IGFsbG93IGEgc3ViIHNldCBvZiB3aGF0IHRoZQogICAgICAgICAgICAgICAgIyAobm9uKWVxdWFsaXR5IG9wZXJhdG9ycyBkby4gU3BlY2lmaWNhbGx5IHRoZXkgZG8gbm90IGFsbG93CiAgICAgICAgICAgICAgICAjIGxvY2FsIHZlcnNpb25zIHRvIGJlIHNwZWNpZmllZCBub3IgZG8gdGhleSBhbGxvdyB0aGUgcHJlZml4CiAgICAgICAgICAgICAgICAjIG1hdGNoaW5nIHdpbGQgY2FyZHMuCiAgICAgICAgICAgICAgICAoPzwhPT18IT18fj0pICAgICAgICAgIyBXZSBoYXZlIHNwZWNpYWwgY2FzZXMgZm9yIHRoZXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcGVyYXRvcnMgc28gd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZG9uJ3QgbWF0Y2ggaGVyZS4KCiAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgIHY/CiAgICAgICAgICAgICAgICAoPzpbMC05XSshKT8gICAgICAgICAgIyBlcG9jaAogICAgICAgICAgICAgICAgWzAtOV0rKD86XC5bMC05XSspKiAgICMgcmVsZWFzZQogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcHJlIHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgKGF8YnxjfHJjfGFscGhhfGJldGF8cHJlfHByZXZpZXcpCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIFswLTldKgogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzotWzAtOV0rKXwoPzpbLV9cLl0/KHBvc3R8cmV2fHIpWy1fXC5dP1swLTldKikKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzpbLV9cLl0/ZGV2Wy1fXC5dP1swLTldKik/ICAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgKQogICAgICAgICkKICAgICAgICAiIiIKICAgICkKCiAgICBfcmVnZXggPSByZS5jb21waWxlKAogICAgICAgIHIiXlxzKiIgKyBfcmVnZXhfc3RyICsgciJccyokIiwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpCgogICAgX29wZXJhdG9ycyA9IHsKICAgICAgICAifj0iOiAiY29tcGF0aWJsZSIsCiAgICAgICAgIj09IjogImVxdWFsIiwKICAgICAgICAiIT0iOiAibm90X2VxdWFsIiwKICAgICAgICAiPD0iOiAibGVzc190aGFuX2VxdWFsIiwKICAgICAgICAiPj0iOiAiZ3JlYXRlcl90aGFuX2VxdWFsIiwKICAgICAgICAiPCI6ICJsZXNzX3RoYW4iLAogICAgICAgICI+IjogImdyZWF0ZXJfdGhhbiIsCiAgICAgICAgIj09PSI6ICJhcmJpdHJhcnkiLAogICAgfQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9jb21wYXRpYmxlKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICAjIENvbXBhdGlibGUgcmVsZWFzZXMgaGF2ZSBhbiBlcXVpdmFsZW50IGNvbWJpbmF0aW9uIG9mID49IGFuZCA9PS4gVGhhdAogICAgICAgICMgaXMgdGhhdCB+PTIuMiBpcyBlcXVpdmFsZW50IHRvID49Mi4yLD09Mi4qLiBUaGlzIGFsbG93cyB1cyB0bwogICAgICAgICMgaW1wbGVtZW50IHRoaXMgaW4gdGVybXMgb2YgdGhlIG90aGVyIHNwZWNpZmllcnMgaW5zdGVhZCBvZgogICAgICAgICMgaW1wbGVtZW50aW5nIGl0IG91cnNlbHZlcy4gVGhlIG9ubHkgdGhpbmcgd2UgbmVlZCB0byBkbyBpcyBjb25zdHJ1Y3QKICAgICAgICAjIHRoZSBvdGhlciBzcGVjaWZpZXJzLgoKICAgICAgICAjIFdlIHdhbnQgZXZlcnl0aGluZyBidXQgdGhlIGxhc3QgaXRlbSBpbiB0aGUgdmVyc2lvbiwgYnV0IHdlIHdhbnQgdG8KICAgICAgICAjIGlnbm9yZSBwb3N0IGFuZCBkZXYgcmVsZWFzZXMgYW5kIHdlIHdhbnQgdG8gdHJlYXQgdGhlIHByZS1yZWxlYXNlIGFzCiAgICAgICAgIyBpdCdzIG93biBzZXBhcmF0ZSBzZWdtZW50LgogICAgICAgIHByZWZpeCA9ICIuIi5qb2luKAogICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAgaXRlcnRvb2xzLnRha2V3aGlsZSgKICAgICAgICAgICAgICAgICAgICBsYW1iZGEgeDogKG5vdCB4LnN0YXJ0c3dpdGgoInBvc3QiKSBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LnN0YXJ0c3dpdGgoImRldiIpKSwKICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbl9zcGxpdChzcGVjKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKVs6LTFdCiAgICAgICAgKQoKICAgICAgICAjIEFkZCB0aGUgcHJlZml4IG5vdGF0aW9uIHRvIHRoZSBlbmQgb2Ygb3VyIHN0cmluZwogICAgICAgIHByZWZpeCArPSAiLioiCgogICAgICAgIHJldHVybiAoc2VsZi5fZ2V0X29wZXJhdG9yKCI+PSIpKHByb3NwZWN0aXZlLCBzcGVjKSBhbmQKICAgICAgICAgICAgICAgIHNlbGYuX2dldF9vcGVyYXRvcigiPT0iKShwcm9zcGVjdGl2ZSwgcHJlZml4KSkKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgICMgV2UgbmVlZCBzcGVjaWFsIGxvZ2ljIHRvIGhhbmRsZSBwcmVmaXggbWF0Y2hpbmcKICAgICAgICBpZiBzcGVjLmVuZHN3aXRoKCIuKiIpOgogICAgICAgICAgICAjIEluIHRoZSBjYXNlIG9mIHByZWZpeCBtYXRjaGluZyB3ZSB3YW50IHRvIGlnbm9yZSBsb2NhbCBzZWdtZW50LgogICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IFZlcnNpb24ocHJvc3BlY3RpdmUucHVibGljKQogICAgICAgICAgICAjIFNwbGl0IHRoZSBzcGVjIG91dCBieSBkb3RzLCBhbmQgcHJldGVuZCB0aGF0IHRoZXJlIGlzIGFuIGltcGxpY2l0CiAgICAgICAgICAgICMgZG90IGluIGJldHdlZW4gYSByZWxlYXNlIHNlZ21lbnQgYW5kIGEgcHJlLXJlbGVhc2Ugc2VnbWVudC4KICAgICAgICAgICAgc3BlYyA9IF92ZXJzaW9uX3NwbGl0KHNwZWNbOi0yXSkgICMgUmVtb3ZlIHRoZSB0cmFpbGluZyAuKgoKICAgICAgICAgICAgIyBTcGxpdCB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiBvdXQgYnkgZG90cywgYW5kIHByZXRlbmQgdGhhdCB0aGVyZQogICAgICAgICAgICAjIGlzIGFuIGltcGxpY2l0IGRvdCBpbiBiZXR3ZWVuIGEgcmVsZWFzZSBzZWdtZW50IGFuZCBhIHByZS1yZWxlYXNlCiAgICAgICAgICAgICMgc2VnbWVudC4KICAgICAgICAgICAgcHJvc3BlY3RpdmUgPSBfdmVyc2lvbl9zcGxpdChzdHIocHJvc3BlY3RpdmUpKQoKICAgICAgICAgICAgIyBTaG9ydGVuIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIHRvIGJlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc3BlYwogICAgICAgICAgICAjIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSBpZiB0aGUgc3BlY2lmaWVyIGlzIGEgcHJlZml4IG9mIHRoZQogICAgICAgICAgICAjIHByb3NwZWN0aXZlIHZlcnNpb24gb3Igbm90LgogICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IHByb3NwZWN0aXZlWzpsZW4oc3BlYyldCgogICAgICAgICAgICAjIFBhZCBvdXQgb3VyIHR3byBzaWRlcyB3aXRoIHplcm9zIHNvIHRoYXQgdGhleSBib3RoIGVxdWFsIHRoZSBzYW1lCiAgICAgICAgICAgICMgbGVuZ3RoLgogICAgICAgICAgICBzcGVjLCBwcm9zcGVjdGl2ZSA9IF9wYWRfdmVyc2lvbihzcGVjLCBwcm9zcGVjdGl2ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIENvbnZlcnQgb3VyIHNwZWMgc3RyaW5nIGludG8gYSBWZXJzaW9uCiAgICAgICAgICAgIHNwZWMgPSBWZXJzaW9uKHNwZWMpCgogICAgICAgICAgICAjIElmIHRoZSBzcGVjaWZpZXIgZG9lcyBub3QgaGF2ZSBhIGxvY2FsIHNlZ21lbnQsIHRoZW4gd2Ugd2FudCB0bwogICAgICAgICAgICAjIGFjdCBhcyBpZiB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiBhbHNvIGRvZXMgbm90IGhhdmUgYSBsb2NhbAogICAgICAgICAgICAjIHNlZ21lbnQuCiAgICAgICAgICAgIGlmIG5vdCBzcGVjLmxvY2FsOgogICAgICAgICAgICAgICAgcHJvc3BlY3RpdmUgPSBWZXJzaW9uKHByb3NwZWN0aXZlLnB1YmxpYykKCiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID09IHNwZWMKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfbm90X2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gbm90IHNlbGYuX2NvbXBhcmVfZXF1YWwocHJvc3BlY3RpdmUsIHNwZWMpCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlIDw9IFZlcnNpb24oc3BlYykKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPj0gVmVyc2lvbihzcGVjKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9sZXNzX3RoYW4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgICMgQ29udmVydCBvdXIgc3BlYyB0byBhIFZlcnNpb24gaW5zdGFuY2UsIHNpbmNlIHdlJ2xsIHdhbnQgdG8gd29yayB3aXRoCiAgICAgICAgIyBpdCBhcyBhIHZlcnNpb24uCiAgICAgICAgc3BlYyA9IFZlcnNpb24oc3BlYykKCiAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gaXMgbGVzcyB0aGFuIHRoZSBzcGVjCiAgICAgICAgIyB2ZXJzaW9uLiBJZiBpdCdzIG5vdCB3ZSBjYW4gc2hvcnQgY2lyY3VpdCBhbmQganVzdCByZXR1cm4gRmFsc2Ugbm93CiAgICAgICAgIyBpbnN0ZWFkIG9mIGRvaW5nIGV4dHJhIHVubmVlZGVkIHdvcmsuCiAgICAgICAgaWYgbm90IHByb3NwZWN0aXZlIDwgc3BlYzoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgVGhpcyBzcGVjaWFsIGNhc2UgaXMgaGVyZSBzbyB0aGF0LCB1bmxlc3MgdGhlIHNwZWNpZmllciBpdHNlbGYKICAgICAgICAjIGluY2x1ZGVzIGlzIGEgcHJlLXJlbGVhc2UgdmVyc2lvbiwgdGhhdCB3ZSBkbyBub3QgYWNjZXB0IHByZS1yZWxlYXNlCiAgICAgICAgIyB2ZXJzaW9ucyBmb3IgdGhlIHZlcnNpb24gbWVudGlvbmVkIGluIHRoZSBzcGVjaWZpZXIgKGUuZy4gPDMuMSBzaG91bGQKICAgICAgICAjIG5vdCBtYXRjaCAzLjEuZGV2MCwgYnV0IHNob3VsZCBtYXRjaCAzLjAuZGV2MCkuCiAgICAgICAgaWYgbm90IHNwZWMuaXNfcHJlcmVsZWFzZSBhbmQgcHJvc3BlY3RpdmUuaXNfcHJlcmVsZWFzZToKICAgICAgICAgICAgaWYgVmVyc2lvbihwcm9zcGVjdGl2ZS5iYXNlX3ZlcnNpb24pID09IFZlcnNpb24oc3BlYy5iYXNlX3ZlcnNpb24pOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgSWYgd2UndmUgZ290dGVuIHRvIGhlcmUsIGl0IG1lYW5zIHRoYXQgcHJvc3BlY3RpdmUgdmVyc2lvbiBpcyBib3RoCiAgICAgICAgIyBsZXNzIHRoYW4gdGhlIHNwZWMgdmVyc2lvbiAqYW5kKiBpdCdzIG5vdCBhIHByZS1yZWxlYXNlIG9mIHRoZSBzYW1lCiAgICAgICAgIyB2ZXJzaW9uIGluIHRoZSBzcGVjLgogICAgICAgIHJldHVybiBUcnVlCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2dyZWF0ZXJfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBDb252ZXJ0IG91ciBzcGVjIHRvIGEgVmVyc2lvbiBpbnN0YW5jZSwgc2luY2Ugd2UnbGwgd2FudCB0byB3b3JrIHdpdGgKICAgICAgICAjIGl0IGFzIGEgdmVyc2lvbi4KICAgICAgICBzcGVjID0gVmVyc2lvbihzcGVjKQoKICAgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWMKICAgICAgICAjIHZlcnNpb24uIElmIGl0J3Mgbm90IHdlIGNhbiBzaG9ydCBjaXJjdWl0IGFuZCBqdXN0IHJldHVybiBGYWxzZSBub3cKICAgICAgICAjIGluc3RlYWQgb2YgZG9pbmcgZXh0cmEgdW5uZWVkZWQgd29yay4KICAgICAgICBpZiBub3QgcHJvc3BlY3RpdmUgPiBzcGVjOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBUaGlzIHNwZWNpYWwgY2FzZSBpcyBoZXJlIHNvIHRoYXQsIHVubGVzcyB0aGUgc3BlY2lmaWVyIGl0c2VsZgogICAgICAgICMgaW5jbHVkZXMgaXMgYSBwb3N0LXJlbGVhc2UgdmVyc2lvbiwgdGhhdCB3ZSBkbyBub3QgYWNjZXB0CiAgICAgICAgIyBwb3N0LXJlbGVhc2UgdmVyc2lvbnMgZm9yIHRoZSB2ZXJzaW9uIG1lbnRpb25lZCBpbiB0aGUgc3BlY2lmaWVyCiAgICAgICAgIyAoZS5nLiA+My4xIHNob3VsZCBub3QgbWF0Y2ggMy4wLnBvc3QwLCBidXQgc2hvdWxkIG1hdGNoIDMuMi5wb3N0MCkuCiAgICAgICAgaWYgbm90IHNwZWMuaXNfcG9zdHJlbGVhc2UgYW5kIHByb3NwZWN0aXZlLmlzX3Bvc3RyZWxlYXNlOgogICAgICAgICAgICBpZiBWZXJzaW9uKHByb3NwZWN0aXZlLmJhc2VfdmVyc2lvbikgPT0gVmVyc2lvbihzcGVjLmJhc2VfdmVyc2lvbik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBFbnN1cmUgdGhhdCB3ZSBkbyBub3QgYWxsb3cgYSBsb2NhbCB2ZXJzaW9uIG9mIHRoZSB2ZXJzaW9uIG1lbnRpb25lZAogICAgICAgICMgaW4gdGhlIHNwZWNpZmllciwgd2hpY2ggaXMgdGVjaGluY2FsbHkgZ3JlYXRlciB0aGFuLCB0byBtYXRjaC4KICAgICAgICBpZiBwcm9zcGVjdGl2ZS5sb2NhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgVmVyc2lvbihwcm9zcGVjdGl2ZS5iYXNlX3ZlcnNpb24pID09IFZlcnNpb24oc3BlYy5iYXNlX3ZlcnNpb24pOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgSWYgd2UndmUgZ290dGVuIHRvIGhlcmUsIGl0IG1lYW5zIHRoYXQgcHJvc3BlY3RpdmUgdmVyc2lvbiBpcyBib3RoCiAgICAgICAgIyBncmVhdGVyIHRoYW4gdGhlIHNwZWMgdmVyc2lvbiAqYW5kKiBpdCdzIG5vdCBhIHByZS1yZWxlYXNlIG9mIHRoZQogICAgICAgICMgc2FtZSB2ZXJzaW9uIGluIHRoZSBzcGVjLgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9jb21wYXJlX2FyYml0cmFyeShzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHN0cihwcm9zcGVjdGl2ZSkubG93ZXIoKSA9PSBzdHIoc3BlYykubG93ZXIoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYpOgogICAgICAgICMgSWYgdGhlcmUgaXMgYW4gZXhwbGljaXQgcHJlcmVsZWFzZXMgc2V0IGZvciB0aGlzLCB0aGVuIHdlJ2xsIGp1c3QKICAgICAgICAjIGJsaW5kbHkgdXNlIHRoYXQuCiAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcmVyZWxlYXNlcwoKICAgICAgICAjIExvb2sgYXQgYWxsIG9mIG91ciBzcGVjaWZpZXJzIGFuZCBkZXRlcm1pbmUgaWYgdGhleSBhcmUgaW5jbHVzaXZlCiAgICAgICAgIyBvcGVyYXRvcnMsIGFuZCBpZiB0aGV5IGFyZSBpZiB0aGV5IGFyZSBpbmNsdWRpbmcgYW4gZXhwbGljaXQKICAgICAgICAjIHByZXJlbGVhc2UuCiAgICAgICAgb3BlcmF0b3IsIHZlcnNpb24gPSBzZWxmLl9zcGVjCiAgICAgICAgaWYgb3BlcmF0b3IgaW4gWyI9PSIsICI+PSIsICI8PSIsICJ+PSIsICI9PT0iXToKICAgICAgICAgICAgIyBUaGUgPT0gc3BlY2lmaWVyIGNhbiBpbmNsdWRlIGEgdHJhaWxpbmcgLiosIGlmIGl0IGRvZXMgd2UKICAgICAgICAgICAgIyB3YW50IHRvIHJlbW92ZSBiZWZvcmUgcGFyc2luZy4KICAgICAgICAgICAgaWYgb3BlcmF0b3IgPT0gIj09IiBhbmQgdmVyc2lvbi5lbmRzd2l0aCgiLioiKToKICAgICAgICAgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uWzotMl0KCiAgICAgICAgICAgICMgUGFyc2UgdGhlIHZlcnNpb24sIGFuZCBpZiBpdCBpcyBhIHByZS1yZWxlYXNlIHRoYW4gdGhpcwogICAgICAgICAgICAjIHNwZWNpZmllciBhbGxvd3MgcHJlLXJlbGVhc2VzLgogICAgICAgICAgICBpZiBwYXJzZSh2ZXJzaW9uKS5pc19wcmVyZWxlYXNlOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgQHByZXJlbGVhc2VzLnNldHRlcgogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHZhbHVlCgoKX3ByZWZpeF9yZWdleCA9IHJlLmNvbXBpbGUociJeKFswLTldKykoKD86YXxifGN8cmMpWzAtOV0rKSQiKQoKCmRlZiBfdmVyc2lvbl9zcGxpdCh2ZXJzaW9uKToKICAgIHJlc3VsdCA9IFtdCiAgICBmb3IgaXRlbSBpbiB2ZXJzaW9uLnNwbGl0KCIuIik6CiAgICAgICAgbWF0Y2ggPSBfcHJlZml4X3JlZ2V4LnNlYXJjaChpdGVtKQogICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICByZXN1bHQuZXh0ZW5kKG1hdGNoLmdyb3VwcygpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaXRlbSkKICAgIHJldHVybiByZXN1bHQKCgpkZWYgX3BhZF92ZXJzaW9uKGxlZnQsIHJpZ2h0KToKICAgIGxlZnRfc3BsaXQsIHJpZ2h0X3NwbGl0ID0gW10sIFtdCgogICAgIyBHZXQgdGhlIHJlbGVhc2Ugc2VnbWVudCBvZiBvdXIgdmVyc2lvbnMKICAgIGxlZnRfc3BsaXQuYXBwZW5kKGxpc3QoaXRlcnRvb2xzLnRha2V3aGlsZShsYW1iZGEgeDogeC5pc2RpZ2l0KCksIGxlZnQpKSkKICAgIHJpZ2h0X3NwbGl0LmFwcGVuZChsaXN0KGl0ZXJ0b29scy50YWtld2hpbGUobGFtYmRhIHg6IHguaXNkaWdpdCgpLCByaWdodCkpKQoKICAgICMgR2V0IHRoZSByZXN0IG9mIG91ciB2ZXJzaW9ucwogICAgbGVmdF9zcGxpdC5hcHBlbmQobGVmdFtsZW4obGVmdF9zcGxpdFswXSk6XSkKICAgIHJpZ2h0X3NwbGl0LmFwcGVuZChyaWdodFtsZW4ocmlnaHRfc3BsaXRbMF0pOl0pCgogICAgIyBJbnNlcnQgb3VyIHBhZGRpbmcKICAgIGxlZnRfc3BsaXQuaW5zZXJ0KAogICAgICAgIDEsCiAgICAgICAgWyIwIl0gKiBtYXgoMCwgbGVuKHJpZ2h0X3NwbGl0WzBdKSAtIGxlbihsZWZ0X3NwbGl0WzBdKSksCiAgICApCiAgICByaWdodF9zcGxpdC5pbnNlcnQoCiAgICAgICAgMSwKICAgICAgICBbIjAiXSAqIG1heCgwLCBsZW4obGVmdF9zcGxpdFswXSkgLSBsZW4ocmlnaHRfc3BsaXRbMF0pKSwKICAgICkKCiAgICByZXR1cm4gKAogICAgICAgIGxpc3QoaXRlcnRvb2xzLmNoYWluKCpsZWZ0X3NwbGl0KSksCiAgICAgICAgbGlzdChpdGVydG9vbHMuY2hhaW4oKnJpZ2h0X3NwbGl0KSksCiAgICApCgoKY2xhc3MgU3BlY2lmaWVyU2V0KEJhc2VTcGVjaWZpZXIpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcGVjaWZpZXJzPSIiLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAjIFNwbGl0IG9uICwgdG8gYnJlYWsgZWFjaCBpbmRpZGl2dWFsIHNwZWNpZmllciBpbnRvIGl0J3Mgb3duIGl0ZW0sIGFuZAogICAgICAgICMgc3RyaXAgZWFjaCBpdGVtIHRvIHJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UuCiAgICAgICAgc3BlY2lmaWVycyA9IFtzLnN0cmlwKCkgZm9yIHMgaW4gc3BlY2lmaWVycy5zcGxpdCgiLCIpIGlmIHMuc3RyaXAoKV0KCiAgICAgICAgIyBQYXJzZWQgZWFjaCBpbmRpdmlkdWFsIHNwZWNpZmllciwgYXR0ZW1wdGluZyBmaXJzdCB0byBtYWtlIGl0IGEKICAgICAgICAjIFNwZWNpZmllciBhbmQgZmFsbGluZyBiYWNrIHRvIGEgTGVnYWN5U3BlY2lmaWVyLgogICAgICAgIHBhcnNlZCA9IHNldCgpCiAgICAgICAgZm9yIHNwZWNpZmllciBpbiBzcGVjaWZpZXJzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBwYXJzZWQuYWRkKFNwZWNpZmllcihzcGVjaWZpZXIpKQogICAgICAgICAgICBleGNlcHQgSW52YWxpZFNwZWNpZmllcjoKICAgICAgICAgICAgICAgIHBhcnNlZC5hZGQoTGVnYWN5U3BlY2lmaWVyKHNwZWNpZmllcikpCgogICAgICAgICMgVHVybiBvdXIgcGFyc2VkIHNwZWNpZmllcnMgaW50byBhIGZyb3plbiBzZXQgYW5kIHNhdmUgdGhlbSBmb3IgbGF0ZXIuCiAgICAgICAgc2VsZi5fc3BlY3MgPSBmcm96ZW5zZXQocGFyc2VkKQoKICAgICAgICAjIFN0b3JlIG91ciBwcmVyZWxlYXNlcyB2YWx1ZSBzbyB3ZSBjYW4gdXNlIGl0IGxhdGVyIHRvIGRldGVybWluZSBpZgogICAgICAgICMgd2UgYWNjZXB0IHByZXJlbGVhc2VzIG9yIG5vdC4KICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHByZXJlbGVhc2VzCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHByZSA9ICgKICAgICAgICAgICAgIiwgcHJlcmVsZWFzZXM9ezAhcn0iLmZvcm1hdChzZWxmLnByZXJlbGVhc2VzKQogICAgICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZQogICAgICAgICAgICBlbHNlICIiCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gIjxTcGVjaWZpZXJTZXQoezAhcn17MX0pPiIuZm9ybWF0KHN0cihzZWxmKSwgcHJlKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiLCIuam9pbihzb3J0ZWQoc3RyKHMpIGZvciBzIGluIHNlbGYuX3NwZWNzKSkKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fc3BlY3MpCgogICAgZGVmIF9fYW5kX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KG90aGVyKQogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNwZWNpZmllclNldCk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICBzcGVjaWZpZXIgPSBTcGVjaWZpZXJTZXQoKQogICAgICAgIHNwZWNpZmllci5fc3BlY3MgPSBmcm96ZW5zZXQoc2VsZi5fc3BlY3MgfCBvdGhlci5fc3BlY3MpCgogICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIE5vbmUgYW5kIG90aGVyLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc3BlY2lmaWVyLl9wcmVyZWxlYXNlcyA9IG90aGVyLl9wcmVyZWxlYXNlcwogICAgICAgIGVsaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmUgYW5kIG90aGVyLl9wcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICBzcGVjaWZpZXIuX3ByZXJlbGVhc2VzID0gc2VsZi5fcHJlcmVsZWFzZXMKICAgICAgICBlbGlmIHNlbGYuX3ByZXJlbGVhc2VzID09IG90aGVyLl9wcmVyZWxlYXNlczoKICAgICAgICAgICAgc3BlY2lmaWVyLl9wcmVyZWxlYXNlcyA9IHNlbGYuX3ByZXJlbGVhc2VzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJDYW5ub3QgY29tYmluZSBTcGVjaWZpZXJTZXRzIHdpdGggVHJ1ZSBhbmQgRmFsc2UgcHJlcmVsZWFzZSAiCiAgICAgICAgICAgICAgICAib3ZlcnJpZGVzLiIKICAgICAgICAgICAgKQoKICAgICAgICByZXR1cm4gc3BlY2lmaWVyCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQob3RoZXIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBfSW5kaXZpZHVhbFNwZWNpZmllcik6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KHN0cihvdGhlcikpCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU3BlY2lmaWVyU2V0KToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjcyA9PSBvdGhlci5fc3BlY3MKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChvdGhlcikKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQoc3RyKG90aGVyKSkKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTcGVjaWZpZXJTZXQpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNzICE9IG90aGVyLl9zcGVjcwoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgIHJldHVybiBsZW4oc2VsZi5fc3BlY3MpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBpdGVyKHNlbGYuX3NwZWNzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYpOgogICAgICAgICMgSWYgd2UgaGF2ZSBiZWVuIGdpdmVuIGFuIGV4cGxpY2l0IHByZXJlbGVhc2UgbW9kaWZpZXIsIHRoZW4gd2UnbGwKICAgICAgICAjIHBhc3MgdGhhdCB0aHJvdWdoIGhlcmUuCiAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcmVyZWxlYXNlcwoKICAgICAgICAjIElmIHdlIGRvbid0IGhhdmUgYW55IHNwZWNpZmllcnMsIGFuZCB3ZSBkb24ndCBoYXZlIGEgZm9yY2VkIHZhbHVlLAogICAgICAgICMgdGhlbiB3ZSdsbCBqdXN0IHJldHVybiBOb25lIHNpbmNlIHdlIGRvbid0IGtub3cgaWYgdGhpcyBzaG91bGQgaGF2ZQogICAgICAgICMgcHJlLXJlbGVhc2VzIG9yIG5vdC4KICAgICAgICBpZiBub3Qgc2VsZi5fc3BlY3M6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICMgT3RoZXJ3aXNlIHdlJ2xsIHNlZSBpZiBhbnkgb2YgdGhlIGdpdmVuIHNwZWNpZmllcnMgYWNjZXB0CiAgICAgICAgIyBwcmVyZWxlYXNlcywgaWYgYW55IG9mIHRoZW0gZG8gd2UnbGwgcmV0dXJuIFRydWUsIG90aGVyd2lzZSBGYWxzZS4KICAgICAgICByZXR1cm4gYW55KHMucHJlcmVsZWFzZXMgZm9yIHMgaW4gc2VsZi5fc3BlY3MpCgogICAgQHByZXJlbGVhc2VzLnNldHRlcgogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHZhbHVlCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKICAgICAgICByZXR1cm4gc2VsZi5jb250YWlucyhpdGVtKQoKICAgIGRlZiBjb250YWlucyhzZWxmLCBpdGVtLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAjIEVuc3VyZSB0aGF0IG91ciBpdGVtIGlzIGEgVmVyc2lvbiBvciBMZWdhY3lWZXJzaW9uIGluc3RhbmNlLgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGl0ZW0sIChMZWdhY3lWZXJzaW9uLCBWZXJzaW9uKSk6CiAgICAgICAgICAgIGl0ZW0gPSBwYXJzZShpdGVtKQoKICAgICAgICAjIERldGVybWluZSBpZiB3ZSdyZSBmb3JjaW5nIGEgcHJlcmVsZWFzZSBvciBub3QsIGlmIHdlJ3JlIG5vdCBmb3JjaW5nCiAgICAgICAgIyBvbmUgZm9yIHRoaXMgcGFydGljdWxhciBmaWx0ZXIgY2FsbCwgdGhlbiB3ZSdsbCB1c2Ugd2hhdGV2ZXIgdGhlCiAgICAgICAgIyBTcGVjaWZpZXJTZXQgdGhpbmtzIGZvciB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgc3VwcG9ydCBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICBwcmVyZWxlYXNlcyA9IHNlbGYucHJlcmVsZWFzZXMKCiAgICAgICAgIyBXZSBjYW4gZGV0ZXJtaW5lIGlmIHdlJ3JlIGdvaW5nIHRvIGFsbG93IHByZS1yZWxlYXNlcyBieSBsb29raW5nIHRvCiAgICAgICAgIyBzZWUgaWYgYW55IG9mIHRoZSB1bmRlcmx5aW5nIGl0ZW1zIHN1cHBvcnRzIHRoZW0uIElmIG5vbmUgb2YgdGhlbSBkbwogICAgICAgICMgYW5kIHRoaXMgaXRlbSBpcyBhIHByZS1yZWxlYXNlIHRoZW4gd2UgZG8gbm90IGFsbG93IGl0IGFuZCB3ZSBjYW4KICAgICAgICAjIHNob3J0IGNpcmN1aXQgdGhhdCBoZXJlLgogICAgICAgICMgTm90ZTogVGhpcyBtZWFucyB0aGF0IDEuMC5kZXYxIHdvdWxkIG5vdCBiZSBjb250YWluZWQgaW4gc29tZXRoaW5nCiAgICAgICAgIyAgICAgICBsaWtlID49MS4wLmRldmFiYyBob3dldmVyIGl0IHdvdWxkIGJlIGluID49MS4wLmRlYmFiYyw+MC4wLmRldjAKICAgICAgICBpZiBub3QgcHJlcmVsZWFzZXMgYW5kIGl0ZW0uaXNfcHJlcmVsZWFzZToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgV2Ugc2ltcGx5IGRpc3BhdGNoIHRvIHRoZSB1bmRlcmx5aW5nIHNwZWNzIGhlcmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCiAgICAgICAgIyBnaXZlbiB2ZXJzaW9uIGlzIGNvbnRhaW5lZCB3aXRoaW4gYWxsIG9mIHRoZW0uCiAgICAgICAgIyBOb3RlOiBUaGlzIHVzZSBvZiBhbGwoKSBoZXJlIG1lYW5zIHRoYXQgYW4gZW1wdHkgc2V0IG9mIHNwZWNpZmllcnMKICAgICAgICAjICAgICAgIHdpbGwgYWx3YXlzIHJldHVybiBUcnVlLCB0aGlzIGlzIGFuIGV4cGxpY2l0IGRlc2lnbiBkZWNpc2lvbi4KICAgICAgICByZXR1cm4gYWxsKAogICAgICAgICAgICBzLmNvbnRhaW5zKGl0ZW0sIHByZXJlbGVhc2VzPXByZXJlbGVhc2VzKQogICAgICAgICAgICBmb3IgcyBpbiBzZWxmLl9zcGVjcwogICAgICAgICkKCiAgICBkZWYgZmlsdGVyKHNlbGYsIGl0ZXJhYmxlLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAjIERldGVybWluZSBpZiB3ZSdyZSBmb3JjaW5nIGEgcHJlcmVsZWFzZSBvciBub3QsIGlmIHdlJ3JlIG5vdCBmb3JjaW5nCiAgICAgICAgIyBvbmUgZm9yIHRoaXMgcGFydGljdWxhciBmaWx0ZXIgY2FsbCwgdGhlbiB3ZSdsbCB1c2Ugd2hhdGV2ZXIgdGhlCiAgICAgICAgIyBTcGVjaWZpZXJTZXQgdGhpbmtzIGZvciB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgc3VwcG9ydCBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICBwcmVyZWxlYXNlcyA9IHNlbGYucHJlcmVsZWFzZXMKCiAgICAgICAgIyBJZiB3ZSBoYXZlIGFueSBzcGVjaWZpZXJzLCB0aGVuIHdlIHdhbnQgdG8gd3JhcCBvdXIgaXRlcmFibGUgaW4gdGhlCiAgICAgICAgIyBmaWx0ZXIgbWV0aG9kIGZvciBlYWNoIG9uZSwgdGhpcyB3aWxsIGFjdCBhcyBhIGxvZ2ljYWwgQU5EIGFtb25nc3QKICAgICAgICAjIGVhY2ggc3BlY2lmaWVyLgogICAgICAgIGlmIHNlbGYuX3NwZWNzOgogICAgICAgICAgICBmb3Igc3BlYyBpbiBzZWxmLl9zcGVjczoKICAgICAgICAgICAgICAgIGl0ZXJhYmxlID0gc3BlYy5maWx0ZXIoaXRlcmFibGUsIHByZXJlbGVhc2VzPWJvb2wocHJlcmVsZWFzZXMpKQogICAgICAgICAgICByZXR1cm4gaXRlcmFibGUKICAgICAgICAjIElmIHdlIGRvIG5vdCBoYXZlIGFueSBzcGVjaWZpZXJzLCB0aGVuIHdlIG5lZWQgdG8gaGF2ZSBhIHJvdWdoIGZpbHRlcgogICAgICAgICMgd2hpY2ggd2lsbCBmaWx0ZXIgb3V0IGFueSBwcmUtcmVsZWFzZXMsIHVubGVzcyB0aGVyZSBhcmUgbm8gZmluYWwKICAgICAgICAjIHJlbGVhc2VzLCBhbmQgd2hpY2ggd2lsbCBmaWx0ZXIgb3V0IExlZ2FjeVZlcnNpb24gaW4gZ2VuZXJhbC4KICAgICAgICBlbHNlOgogICAgICAgICAgICBmaWx0ZXJlZCA9IFtdCiAgICAgICAgICAgIGZvdW5kX3ByZXJlbGVhc2VzID0gW10KCiAgICAgICAgICAgIGZvciBpdGVtIGluIGl0ZXJhYmxlOgogICAgICAgICAgICAgICAgIyBFbnN1cmUgdGhhdCB3ZSBzb21lIGtpbmQgb2YgVmVyc2lvbiBjbGFzcyBmb3IgdGhpcyBpdGVtLgogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlbSwgKExlZ2FjeVZlcnNpb24sIFZlcnNpb24pKToKICAgICAgICAgICAgICAgICAgICBwYXJzZWRfdmVyc2lvbiA9IHBhcnNlKGl0ZW0pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHBhcnNlZF92ZXJzaW9uID0gaXRlbQoKICAgICAgICAgICAgICAgICMgRmlsdGVyIG91dCBhbnkgaXRlbSB3aGljaCBpcyBwYXJzZWQgYXMgYSBMZWdhY3lWZXJzaW9uCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBhcnNlZF92ZXJzaW9uLCBMZWdhY3lWZXJzaW9uKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgICMgU3RvcmUgYW55IGl0ZW0gd2hpY2ggaXMgYSBwcmUtcmVsZWFzZSBmb3IgbGF0ZXIgdW5sZXNzIHdlJ3ZlCiAgICAgICAgICAgICAgICAjIGFscmVhZHkgZm91bmQgYSBmaW5hbCB2ZXJzaW9uIG9yIHdlIGFyZSBhY2NlcHRpbmcgcHJlcmVsZWFzZXMKICAgICAgICAgICAgICAgIGlmIHBhcnNlZF92ZXJzaW9uLmlzX3ByZXJlbGVhc2UgYW5kIG5vdCBwcmVyZWxlYXNlczoKICAgICAgICAgICAgICAgICAgICBpZiBub3QgZmlsdGVyZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX3ByZXJlbGVhc2VzLmFwcGVuZChpdGVtKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZC5hcHBlbmQoaXRlbSkKCiAgICAgICAgICAgICMgSWYgd2UndmUgZm91bmQgbm8gaXRlbXMgZXhjZXB0IGZvciBwcmUtcmVsZWFzZXMsIHRoZW4gd2UnbGwgZ28KICAgICAgICAgICAgIyBhaGVhZCBhbmQgdXNlIHRoZSBwcmUtcmVsZWFzZXMKICAgICAgICAgICAgaWYgbm90IGZpbHRlcmVkIGFuZCBmb3VuZF9wcmVyZWxlYXNlcyBhbmQgcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZF9wcmVyZWxlYXNlcwoKICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkClBLAwQUAAAAAAAAACEAxeonD6UBAAClAQAAQAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvdXRpbHMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgcmUKCgpfY2Fub25pY2FsaXplX3JlZ2V4ID0gcmUuY29tcGlsZShyIlstXy5dKyIpCgoKZGVmIGNhbm9uaWNhbGl6ZV9uYW1lKG5hbWUpOgogICAgIyBUaGlzIGlzIHRha2VuIGZyb20gUEVQIDUwMy4KICAgIHJldHVybiBfY2Fub25pY2FsaXplX3JlZ2V4LnN1YigiLSIsIG5hbWUpLmxvd2VyKCkKUEsDBBQAAAAAAAAAIQAO78ahJC0AACQtAABCAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy92ZXJzaW9uLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IGNvbGxlY3Rpb25zCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHJlCgpmcm9tIC5fc3RydWN0dXJlcyBpbXBvcnQgSW5maW5pdHkKCgpfX2FsbF9fID0gWwogICAgInBhcnNlIiwgIlZlcnNpb24iLCAiTGVnYWN5VmVyc2lvbiIsICJJbnZhbGlkVmVyc2lvbiIsICJWRVJTSU9OX1BBVFRFUk4iCl0KCgpfVmVyc2lvbiA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoCiAgICAiX1ZlcnNpb24iLAogICAgWyJlcG9jaCIsICJyZWxlYXNlIiwgImRldiIsICJwcmUiLCAicG9zdCIsICJsb2NhbCJdLAopCgoKZGVmIHBhcnNlKHZlcnNpb24pOgogICAgIiIiCiAgICBQYXJzZSB0aGUgZ2l2ZW4gdmVyc2lvbiBzdHJpbmcgYW5kIHJldHVybiBlaXRoZXIgYSA6Y2xhc3M6YFZlcnNpb25gIG9iamVjdAogICAgb3IgYSA6Y2xhc3M6YExlZ2FjeVZlcnNpb25gIG9iamVjdCBkZXBlbmRpbmcgb24gaWYgdGhlIGdpdmVuIHZlcnNpb24gaXMKICAgIGEgdmFsaWQgUEVQIDQ0MCB2ZXJzaW9uIG9yIGEgbGVnYWN5IHZlcnNpb24uCiAgICAiIiIKICAgIHRyeToKICAgICAgICByZXR1cm4gVmVyc2lvbih2ZXJzaW9uKQogICAgZXhjZXB0IEludmFsaWRWZXJzaW9uOgogICAgICAgIHJldHVybiBMZWdhY3lWZXJzaW9uKHZlcnNpb24pCgoKY2xhc3MgSW52YWxpZFZlcnNpb24oVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgdmVyc2lvbiB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNDQwLgogICAgIiIiCgoKY2xhc3MgX0Jhc2VWZXJzaW9uKG9iamVjdCk6CgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuX2tleSkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPCBvKQoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA8PSBvKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA9PSBvKQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA+PSBvKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA+IG8pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzICE9IG8pCgogICAgZGVmIF9jb21wYXJlKHNlbGYsIG90aGVyLCBtZXRob2QpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBfQmFzZVZlcnNpb24pOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIG1ldGhvZChzZWxmLl9rZXksIG90aGVyLl9rZXkpCgoKY2xhc3MgTGVnYWN5VmVyc2lvbihfQmFzZVZlcnNpb24pOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJzaW9uKToKICAgICAgICBzZWxmLl92ZXJzaW9uID0gc3RyKHZlcnNpb24pCiAgICAgICAgc2VsZi5fa2V5ID0gX2xlZ2FjeV9jbXBrZXkoc2VsZi5fdmVyc2lvbikKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxMZWdhY3lWZXJzaW9uKHswfSk+Ii5mb3JtYXQocmVwcihzdHIoc2VsZikpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHB1YmxpYyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGJhc2VfdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxvY2FsKHNlbGYpOgogICAgICAgIHJldHVybiBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wb3N0cmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gRmFsc2UKCgpfbGVnYWN5X3ZlcnNpb25fY29tcG9uZW50X3JlID0gcmUuY29tcGlsZSgKICAgIHIiKFxkKyB8IFthLXpdKyB8IFwufCAtKSIsIHJlLlZFUkJPU0UsCikKCl9sZWdhY3lfdmVyc2lvbl9yZXBsYWNlbWVudF9tYXAgPSB7CiAgICAicHJlIjogImMiLCAicHJldmlldyI6ICJjIiwgIi0iOiAiZmluYWwtIiwgInJjIjogImMiLCAiZGV2IjogIkAiLAp9CgoKZGVmIF9wYXJzZV92ZXJzaW9uX3BhcnRzKHMpOgogICAgZm9yIHBhcnQgaW4gX2xlZ2FjeV92ZXJzaW9uX2NvbXBvbmVudF9yZS5zcGxpdChzKToKICAgICAgICBwYXJ0ID0gX2xlZ2FjeV92ZXJzaW9uX3JlcGxhY2VtZW50X21hcC5nZXQocGFydCwgcGFydCkKCiAgICAgICAgaWYgbm90IHBhcnQgb3IgcGFydCA9PSAiLiI6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIHBhcnRbOjFdIGluICIwMTIzNDU2Nzg5IjoKICAgICAgICAgICAgIyBwYWQgZm9yIG51bWVyaWMgY29tcGFyaXNvbgogICAgICAgICAgICB5aWVsZCBwYXJ0LnpmaWxsKDgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgeWllbGQgIioiICsgcGFydAoKICAgICMgZW5zdXJlIHRoYXQgYWxwaGEvYmV0YS9jYW5kaWRhdGUgYXJlIGJlZm9yZSBmaW5hbAogICAgeWllbGQgIipmaW5hbCIKCgpkZWYgX2xlZ2FjeV9jbXBrZXkodmVyc2lvbik6CiAgICAjIFdlIGhhcmRjb2RlIGFuIGVwb2NoIG9mIC0xIGhlcmUuIEEgUEVQIDQ0MCB2ZXJzaW9uIGNhbiBvbmx5IGhhdmUgYSBlcG9jaAogICAgIyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC4gVGhpcyB3aWxsIGVmZmVjdGl2ZWx5IHB1dCB0aGUgTGVnYWN5VmVyc2lvbiwKICAgICMgd2hpY2ggdXNlcyB0aGUgZGVmYWN0byBzdGFuZGFyZCBvcmlnaW5hbGx5IGltcGxlbWVudGVkIGJ5IHNldHVwdG9vbHMsCiAgICAjIGFzIGJlZm9yZSBhbGwgUEVQIDQ0MCB2ZXJzaW9ucy4KICAgIGVwb2NoID0gLTEKCiAgICAjIFRoaXMgc2NoZW1lIGlzIHRha2VuIGZyb20gcGtnX3Jlc291cmNlcy5wYXJzZV92ZXJzaW9uIHNldHVwdG9vbHMgcHJpb3IgdG8KICAgICMgaXQncyBhZG9wdGlvbiBvZiB0aGUgcGFja2FnaW5nIGxpYnJhcnkuCiAgICBwYXJ0cyA9IFtdCiAgICBmb3IgcGFydCBpbiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyh2ZXJzaW9uLmxvd2VyKCkpOgogICAgICAgIGlmIHBhcnQuc3RhcnRzd2l0aCgiKiIpOgogICAgICAgICAgICAjIHJlbW92ZSAiLSIgYmVmb3JlIGEgcHJlcmVsZWFzZSB0YWcKICAgICAgICAgICAgaWYgcGFydCA8ICIqZmluYWwiOgogICAgICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXSA9PSAiKmZpbmFsLSI6CiAgICAgICAgICAgICAgICAgICAgcGFydHMucG9wKCkKCiAgICAgICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nIHplcm9zIGZyb20gZWFjaCBzZXJpZXMgb2YgbnVtZXJpYyBwYXJ0cwogICAgICAgICAgICB3aGlsZSBwYXJ0cyBhbmQgcGFydHNbLTFdID09ICIwMDAwMDAwMCI6CiAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQoKICAgICAgICBwYXJ0cy5hcHBlbmQocGFydCkKICAgIHBhcnRzID0gdHVwbGUocGFydHMpCgogICAgcmV0dXJuIGVwb2NoLCBwYXJ0cwoKIyBEZWxpYmVyYXRlbHkgbm90IGFuY2hvcmVkIHRvIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzdHJpbmcsIHRvIG1ha2UgaXQKIyBlYXNpZXIgZm9yIDNyZCBwYXJ0eSBjb2RlIHRvIHJldXNlClZFUlNJT05fUEFUVEVSTiA9IHIiIiIKICAgIHY/CiAgICAoPzoKICAgICAgICAoPzooP1A8ZXBvY2g+WzAtOV0rKSEpPyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZXBvY2gKICAgICAgICAoP1A8cmVsZWFzZT5bMC05XSsoPzpcLlswLTldKykqKSAgICAgICAgICAgICAgICAgICMgcmVsZWFzZSBzZWdtZW50CiAgICAgICAgKD9QPHByZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHByZS1yZWxlYXNlCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPHByZV9sPihhfGJ8Y3xyY3xhbHBoYXxiZXRhfHByZXxwcmV2aWV3KSkKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8cHJlX24+WzAtOV0rKT8KICAgICAgICApPwogICAgICAgICg/UDxwb3N0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgKD86LSg/UDxwb3N0X24xPlswLTldKykpCiAgICAgICAgICAgIHwKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAoP1A8cG9zdF9sPnBvc3R8cmV2fHIpCiAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAoP1A8cG9zdF9uMj5bMC05XSspPwogICAgICAgICAgICApCiAgICAgICAgKT8KICAgICAgICAoP1A8ZGV2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8ZGV2X2w+ZGV2KQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxkZXZfbj5bMC05XSspPwogICAgICAgICk/CiAgICApCiAgICAoPzpcKyg/UDxsb2NhbD5bYS16MC05XSsoPzpbLV9cLl1bYS16MC05XSspKikpPyAgICAgICAjIGxvY2FsIHZlcnNpb24KIiIiCgoKY2xhc3MgVmVyc2lvbihfQmFzZVZlcnNpb24pOgoKICAgIF9yZWdleCA9IHJlLmNvbXBpbGUoCiAgICAgICAgciJeXHMqIiArIFZFUlNJT05fUEFUVEVSTiArIHIiXHMqJCIsCiAgICAgICAgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UsCiAgICApCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcnNpb24pOgogICAgICAgICMgVmFsaWRhdGUgdGhlIHZlcnNpb24gYW5kIHBhcnNlIGl0IGludG8gcGllY2VzCiAgICAgICAgbWF0Y2ggPSBzZWxmLl9yZWdleC5zZWFyY2godmVyc2lvbikKICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRWZXJzaW9uKCJJbnZhbGlkIHZlcnNpb246ICd7MH0nIi5mb3JtYXQodmVyc2lvbikpCgogICAgICAgICMgU3RvcmUgdGhlIHBhcnNlZCBvdXQgcGllY2VzIG9mIHRoZSB2ZXJzaW9uCiAgICAgICAgc2VsZi5fdmVyc2lvbiA9IF9WZXJzaW9uKAogICAgICAgICAgICBlcG9jaD1pbnQobWF0Y2guZ3JvdXAoImVwb2NoIikpIGlmIG1hdGNoLmdyb3VwKCJlcG9jaCIpIGVsc2UgMCwKICAgICAgICAgICAgcmVsZWFzZT10dXBsZShpbnQoaSkgZm9yIGkgaW4gbWF0Y2guZ3JvdXAoInJlbGVhc2UiKS5zcGxpdCgiLiIpKSwKICAgICAgICAgICAgcHJlPV9wYXJzZV9sZXR0ZXJfdmVyc2lvbigKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwcmVfbCIpLAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInByZV9uIiksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHBvc3Q9X3BhcnNlX2xldHRlcl92ZXJzaW9uKAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInBvc3RfbCIpLAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInBvc3RfbjEiKSBvciBtYXRjaC5ncm91cCgicG9zdF9uMiIpLAogICAgICAgICAgICApLAogICAgICAgICAgICBkZXY9X3BhcnNlX2xldHRlcl92ZXJzaW9uKAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoImRldl9sIiksCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgiZGV2X24iKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgbG9jYWw9X3BhcnNlX2xvY2FsX3ZlcnNpb24obWF0Y2guZ3JvdXAoImxvY2FsIikpLAogICAgICAgICkKCiAgICAgICAgIyBHZW5lcmF0ZSBhIGtleSB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHNvcnRpbmcKICAgICAgICBzZWxmLl9rZXkgPSBfY21wa2V5KAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLmVwb2NoLAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLnJlbGVhc2UsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24ucHJlLAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLnBvc3QsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24uZGV2LAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLmxvY2FsLAogICAgICAgICkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8VmVyc2lvbih7MH0pPiIuZm9ybWF0KHJlcHIoc3RyKHNlbGYpKSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBwYXJ0cyA9IFtdCgogICAgICAgICMgRXBvY2gKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLmVwb2NoICE9IDA6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiezB9ISIuZm9ybWF0KHNlbGYuX3ZlcnNpb24uZXBvY2gpKQoKICAgICAgICAjIFJlbGVhc2Ugc2VnbWVudAogICAgICAgIHBhcnRzLmFwcGVuZCgiLiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5yZWxlYXNlKSkKCiAgICAgICAgIyBQcmUtcmVsZWFzZQogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24ucHJlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5wcmUpKQoKICAgICAgICAjIFBvc3QtcmVsZWFzZQogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24ucG9zdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIucG9zdHswfSIuZm9ybWF0KHNlbGYuX3ZlcnNpb24ucG9zdFsxXSkpCgogICAgICAgICMgRGV2ZWxvcG1lbnQgcmVsZWFzZQogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24uZGV2IGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIi5kZXZ7MH0iLmZvcm1hdChzZWxmLl92ZXJzaW9uLmRldlsxXSkpCgogICAgICAgICMgTG9jYWwgdmVyc2lvbiBzZWdtZW50CiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5sb2NhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKAogICAgICAgICAgICAgICAgIit7MH0iLmZvcm1hdCgiLiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5sb2NhbCkpCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuICIiLmpvaW4ocGFydHMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHVibGljKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikuc3BsaXQoIisiLCAxKVswXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGJhc2VfdmVyc2lvbihzZWxmKToKICAgICAgICBwYXJ0cyA9IFtdCgogICAgICAgICMgRXBvY2gKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLmVwb2NoICE9IDA6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiezB9ISIuZm9ybWF0KHNlbGYuX3ZlcnNpb24uZXBvY2gpKQoKICAgICAgICAjIFJlbGVhc2Ugc2VnbWVudAogICAgICAgIHBhcnRzLmFwcGVuZCgiLiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5yZWxlYXNlKSkKCiAgICAgICAgcmV0dXJuICIiLmpvaW4ocGFydHMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgbG9jYWwoc2VsZik6CiAgICAgICAgdmVyc2lvbl9zdHJpbmcgPSBzdHIoc2VsZikKICAgICAgICBpZiAiKyIgaW4gdmVyc2lvbl9zdHJpbmc6CiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uX3N0cmluZy5zcGxpdCgiKyIsIDEpWzFdCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gYm9vbChzZWxmLl92ZXJzaW9uLmRldiBvciBzZWxmLl92ZXJzaW9uLnByZSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wb3N0cmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gYm9vbChzZWxmLl92ZXJzaW9uLnBvc3QpCgoKZGVmIF9wYXJzZV9sZXR0ZXJfdmVyc2lvbihsZXR0ZXIsIG51bWJlcik6CiAgICBpZiBsZXR0ZXI6CiAgICAgICAgIyBXZSBjb25zaWRlciB0aGVyZSB0byBiZSBhbiBpbXBsaWNpdCAwIGluIGEgcHJlLXJlbGVhc2UgaWYgdGhlcmUgaXMKICAgICAgICAjIG5vdCBhIG51bWVyYWwgYXNzb2NpYXRlZCB3aXRoIGl0LgogICAgICAgIGlmIG51bWJlciBpcyBOb25lOgogICAgICAgICAgICBudW1iZXIgPSAwCgogICAgICAgICMgV2Ugbm9ybWFsaXplIGFueSBsZXR0ZXJzIHRvIHRoZWlyIGxvd2VyIGNhc2UgZm9ybQogICAgICAgIGxldHRlciA9IGxldHRlci5sb3dlcigpCgogICAgICAgICMgV2UgY29uc2lkZXIgc29tZSB3b3JkcyB0byBiZSBhbHRlcm5hdGUgc3BlbGxpbmdzIG9mIG90aGVyIHdvcmRzIGFuZAogICAgICAgICMgaW4gdGhvc2UgY2FzZXMgd2Ugd2FudCB0byBub3JtYWxpemUgdGhlIHNwZWxsaW5ncyB0byBvdXIgcHJlZmVycmVkCiAgICAgICAgIyBzcGVsbGluZy4KICAgICAgICBpZiBsZXR0ZXIgPT0gImFscGhhIjoKICAgICAgICAgICAgbGV0dGVyID0gImEiCiAgICAgICAgZWxpZiBsZXR0ZXIgPT0gImJldGEiOgogICAgICAgICAgICBsZXR0ZXIgPSAiYiIKICAgICAgICBlbGlmIGxldHRlciBpbiBbImMiLCAicHJlIiwgInByZXZpZXciXToKICAgICAgICAgICAgbGV0dGVyID0gInJjIgogICAgICAgIGVsaWYgbGV0dGVyIGluIFsicmV2IiwgInIiXToKICAgICAgICAgICAgbGV0dGVyID0gInBvc3QiCgogICAgICAgIHJldHVybiBsZXR0ZXIsIGludChudW1iZXIpCiAgICBpZiBub3QgbGV0dGVyIGFuZCBudW1iZXI6CiAgICAgICAgIyBXZSBhc3N1bWUgaWYgd2UgYXJlIGdpdmVuIGEgbnVtYmVyLCBidXQgd2UgYXJlIG5vdCBnaXZlbiBhIGxldHRlcgogICAgICAgICMgdGhlbiB0aGlzIGlzIHVzaW5nIHRoZSBpbXBsaWNpdCBwb3N0IHJlbGVhc2Ugc3ludGF4IChlLmcuIDEuMC0xKQogICAgICAgIGxldHRlciA9ICJwb3N0IgoKICAgICAgICByZXR1cm4gbGV0dGVyLCBpbnQobnVtYmVyKQoKCl9sb2NhbF92ZXJzaW9uX3NlcGVyYXRvcnMgPSByZS5jb21waWxlKHIiW1wuXy1dIikKCgpkZWYgX3BhcnNlX2xvY2FsX3ZlcnNpb24obG9jYWwpOgogICAgIiIiCiAgICBUYWtlcyBhIHN0cmluZyBsaWtlIGFiYy4xLnR3ZWx2ZSBhbmQgdHVybnMgaXQgaW50byAoImFiYyIsIDEsICJ0d2VsdmUiKS4KICAgICIiIgogICAgaWYgbG9jYWwgaXMgbm90IE5vbmU6CiAgICAgICAgcmV0dXJuIHR1cGxlKAogICAgICAgICAgICBwYXJ0Lmxvd2VyKCkgaWYgbm90IHBhcnQuaXNkaWdpdCgpIGVsc2UgaW50KHBhcnQpCiAgICAgICAgICAgIGZvciBwYXJ0IGluIF9sb2NhbF92ZXJzaW9uX3NlcGVyYXRvcnMuc3BsaXQobG9jYWwpCiAgICAgICAgKQoKCmRlZiBfY21wa2V5KGVwb2NoLCByZWxlYXNlLCBwcmUsIHBvc3QsIGRldiwgbG9jYWwpOgogICAgIyBXaGVuIHdlIGNvbXBhcmUgYSByZWxlYXNlIHZlcnNpb24sIHdlIHdhbnQgdG8gY29tcGFyZSBpdCB3aXRoIGFsbCBvZiB0aGUKICAgICMgdHJhaWxpbmcgemVyb3MgcmVtb3ZlZC4gU28gd2UnbGwgdXNlIGEgcmV2ZXJzZSB0aGUgbGlzdCwgZHJvcCBhbGwgdGhlIG5vdwogICAgIyBsZWFkaW5nIHplcm9zIHVudGlsIHdlIGNvbWUgdG8gc29tZXRoaW5nIG5vbiB6ZXJvLCB0aGVuIHRha2UgdGhlIHJlc3QKICAgICMgcmUtcmV2ZXJzZSBpdCBiYWNrIGludG8gdGhlIGNvcnJlY3Qgb3JkZXIgYW5kIG1ha2UgaXQgYSB0dXBsZSBhbmQgdXNlCiAgICAjIHRoYXQgZm9yIG91ciBzb3J0aW5nIGtleS4KICAgIHJlbGVhc2UgPSB0dXBsZSgKICAgICAgICByZXZlcnNlZChsaXN0KAogICAgICAgICAgICBpdGVydG9vbHMuZHJvcHdoaWxlKAogICAgICAgICAgICAgICAgbGFtYmRhIHg6IHggPT0gMCwKICAgICAgICAgICAgICAgIHJldmVyc2VkKHJlbGVhc2UpLAogICAgICAgICAgICApCiAgICAgICAgKSkKICAgICkKCiAgICAjIFdlIG5lZWQgdG8gInRyaWNrIiB0aGUgc29ydGluZyBhbGdvcml0aG0gdG8gcHV0IDEuMC5kZXYwIGJlZm9yZSAxLjBhMC4KICAgICMgV2UnbGwgZG8gdGhpcyBieSBhYnVzaW5nIHRoZSBwcmUgc2VnbWVudCwgYnV0IHdlIF9vbmx5XyB3YW50IHRvIGRvIHRoaXMKICAgICMgaWYgdGhlcmUgaXMgbm90IGEgcHJlIG9yIGEgcG9zdCBzZWdtZW50LiBJZiB3ZSBoYXZlIG9uZSBvZiB0aG9zZSB0aGVuCiAgICAjIHRoZSBub3JtYWwgc29ydGluZyBydWxlcyB3aWxsIGhhbmRsZSB0aGlzIGNhc2UgY29ycmVjdGx5LgogICAgaWYgcHJlIGlzIE5vbmUgYW5kIHBvc3QgaXMgTm9uZSBhbmQgZGV2IGlzIG5vdCBOb25lOgogICAgICAgIHByZSA9IC1JbmZpbml0eQogICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgcHJlLXJlbGVhc2UgKGV4Y2VwdCBhcyBub3RlZCBhYm92ZSkgc2hvdWxkIHNvcnQgYWZ0ZXIKICAgICMgdGhvc2Ugd2l0aCBvbmUuCiAgICBlbGlmIHByZSBpcyBOb25lOgogICAgICAgIHByZSA9IEluZmluaXR5CgogICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgcG9zdCBzZWdtZW50IHNob3VsZCBzb3J0IGJlZm9yZSB0aG9zZSB3aXRoIG9uZS4KICAgIGlmIHBvc3QgaXMgTm9uZToKICAgICAgICBwb3N0ID0gLUluZmluaXR5CgogICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgZGV2ZWxvcG1lbnQgc2VnbWVudCBzaG91bGQgc29ydCBhZnRlciB0aG9zZSB3aXRoIG9uZS4KICAgIGlmIGRldiBpcyBOb25lOgogICAgICAgIGRldiA9IEluZmluaXR5CgogICAgaWYgbG9jYWwgaXMgTm9uZToKICAgICAgICAjIFZlcnNpb25zIHdpdGhvdXQgYSBsb2NhbCBzZWdtZW50IHNob3VsZCBzb3J0IGJlZm9yZSB0aG9zZSB3aXRoIG9uZS4KICAgICAgICBsb2NhbCA9IC1JbmZpbml0eQogICAgZWxzZToKICAgICAgICAjIFZlcnNpb25zIHdpdGggYSBsb2NhbCBzZWdtZW50IG5lZWQgdGhhdCBzZWdtZW50IHBhcnNlZCB0byBpbXBsZW1lbnQKICAgICAgICAjIHRoZSBzb3J0aW5nIHJ1bGVzIGluIFBFUDQ0MC4KICAgICAgICAjIC0gQWxwaGEgbnVtZXJpYyBzZWdtZW50cyBzb3J0IGJlZm9yZSBudW1lcmljIHNlZ21lbnRzCiAgICAgICAgIyAtIEFscGhhIG51bWVyaWMgc2VnbWVudHMgc29ydCBsZXhpY29ncmFwaGljYWxseQogICAgICAgICMgLSBOdW1lcmljIHNlZ21lbnRzIHNvcnQgbnVtZXJpY2FsbHkKICAgICAgICAjIC0gU2hvcnRlciB2ZXJzaW9ucyBzb3J0IGJlZm9yZSBsb25nZXIgdmVyc2lvbnMgd2hlbiB0aGUgcHJlZml4ZXMKICAgICAgICAjICAgbWF0Y2ggZXhhY3RseQogICAgICAgIGxvY2FsID0gdHVwbGUoCiAgICAgICAgICAgIChpLCAiIikgaWYgaXNpbnN0YW5jZShpLCBpbnQpIGVsc2UgKC1JbmZpbml0eSwgaSkKICAgICAgICAgICAgZm9yIGkgaW4gbG9jYWwKICAgICAgICApCgogICAgcmV0dXJuIGVwb2NoLCByZWxlYXNlLCBwcmUsIHBvc3QsIGRldiwgbG9jYWwKUEsDBBQAAAAAAAAAIQB4KBTD64EDAOuBAwA6AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3B5cGFyc2luZy5weSMgbW9kdWxlIHB5cGFyc2luZy5weQ0KIw0KIyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNiAgUGF1bCBULiBNY0d1aXJlDQojDQojIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZw0KIyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUNCiMgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZw0KIyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsDQojIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bw0KIyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8NCiMgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KIw0KIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQ0KIyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCiMNCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsDQojIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRg0KIyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuDQojIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZDQojIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsDQojIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFDQojIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLg0KIw0KDQpfX2RvY19fID0gXA0KIiIiDQpweXBhcnNpbmcgbW9kdWxlIC0gQ2xhc3NlcyBhbmQgbWV0aG9kcyB0byBkZWZpbmUgYW5kIGV4ZWN1dGUgcGFyc2luZyBncmFtbWFycw0KDQpUaGUgcHlwYXJzaW5nIG1vZHVsZSBpcyBhbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCB0byBjcmVhdGluZyBhbmQgZXhlY3V0aW5nIHNpbXBsZSBncmFtbWFycywNCnZzLiB0aGUgdHJhZGl0aW9uYWwgbGV4L3lhY2MgYXBwcm9hY2gsIG9yIHRoZSB1c2Ugb2YgcmVndWxhciBleHByZXNzaW9ucy4gIFdpdGggcHlwYXJzaW5nLCB5b3UNCmRvbid0IG5lZWQgdG8gbGVhcm4gYSBuZXcgc3ludGF4IGZvciBkZWZpbmluZyBncmFtbWFycyBvciBtYXRjaGluZyBleHByZXNzaW9ucyAtIHRoZSBwYXJzaW5nIG1vZHVsZQ0KcHJvdmlkZXMgYSBsaWJyYXJ5IG9mIGNsYXNzZXMgdGhhdCB5b3UgdXNlIHRvIGNvbnN0cnVjdCB0aGUgZ3JhbW1hciBkaXJlY3RseSBpbiBQeXRob24uDQoNCkhlcmUgaXMgYSBwcm9ncmFtIHRvIHBhcnNlICJIZWxsbywgV29ybGQhIiAob3IgYW55IGdyZWV0aW5nIG9mIHRoZSBmb3JtIA0KQ3siPHNhbHV0YXRpb24+LCA8YWRkcmVzc2VlPiEifSksIGJ1aWx0IHVwIHVzaW5nIEx7V29yZH0sIEx7TGl0ZXJhbH0sIGFuZCBMe0FuZH0gZWxlbWVudHMgDQooTHsnKyc8UGFyc2VyRWxlbWVudC5fX2FkZF9fPn0gb3BlcmF0b3IgZ2l2ZXMgTHtBbmR9IGV4cHJlc3Npb25zLCBzdHJpbmdzIGFyZSBhdXRvLWNvbnZlcnRlZCB0bw0KTHtMaXRlcmFsfSBleHByZXNzaW9ucyk6Og0KDQogICAgZnJvbSBweXBhcnNpbmcgaW1wb3J0IFdvcmQsIGFscGhhcw0KDQogICAgIyBkZWZpbmUgZ3JhbW1hciBvZiBhIGdyZWV0aW5nDQogICAgZ3JlZXQgPSBXb3JkKGFscGhhcykgKyAiLCIgKyBXb3JkKGFscGhhcykgKyAiISINCg0KICAgIGhlbGxvID0gIkhlbGxvLCBXb3JsZCEiDQogICAgcHJpbnQgKGhlbGxvLCAiLT4iLCBncmVldC5wYXJzZVN0cmluZyhoZWxsbykpDQoNClRoZSBwcm9ncmFtIG91dHB1dHMgdGhlIGZvbGxvd2luZzo6DQoNCiAgICBIZWxsbywgV29ybGQhIC0+IFsnSGVsbG8nLCAnLCcsICdXb3JsZCcsICchJ10NCg0KVGhlIFB5dGhvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ3JhbW1hciBpcyBxdWl0ZSByZWFkYWJsZSwgb3dpbmcgdG8gdGhlIHNlbGYtZXhwbGFuYXRvcnkNCmNsYXNzIG5hbWVzLCBhbmQgdGhlIHVzZSBvZiAnKycsICd8JyBhbmQgJ14nIG9wZXJhdG9ycy4NCg0KVGhlIEx7UGFyc2VSZXN1bHRzfSBvYmplY3QgcmV0dXJuZWQgZnJvbSBMe1BhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc8UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZz59IGNhbiBiZSBhY2Nlc3NlZCBhcyBhIG5lc3RlZCBsaXN0LCBhIGRpY3Rpb25hcnksIG9yIGFuDQpvYmplY3Qgd2l0aCBuYW1lZCBhdHRyaWJ1dGVzLg0KDQpUaGUgcHlwYXJzaW5nIG1vZHVsZSBoYW5kbGVzIHNvbWUgb2YgdGhlIHByb2JsZW1zIHRoYXQgYXJlIHR5cGljYWxseSB2ZXhpbmcgd2hlbiB3cml0aW5nIHRleHQgcGFyc2VyczoNCiAtIGV4dHJhIG9yIG1pc3Npbmcgd2hpdGVzcGFjZSAodGhlIGFib3ZlIHByb2dyYW0gd2lsbCBhbHNvIGhhbmRsZSAiSGVsbG8sV29ybGQhIiwgIkhlbGxvICAsICBXb3JsZCAgISIsIGV0Yy4pDQogLSBxdW90ZWQgc3RyaW5ncw0KIC0gZW1iZWRkZWQgY29tbWVudHMNCiIiIg0KDQpfX3ZlcnNpb25fXyA9ICIyLjEuMTAiDQpfX3ZlcnNpb25UaW1lX18gPSAiMDcgT2N0IDIwMTYgMDE6MzEgVVRDIg0KX19hdXRob3JfXyA9ICJQYXVsIE1jR3VpcmUgPHB0bWNnQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iDQoNCmltcG9ydCBzdHJpbmcNCmZyb20gd2Vha3JlZiBpbXBvcnQgcmVmIGFzIHdrcmVmDQppbXBvcnQgY29weQ0KaW1wb3J0IHN5cw0KaW1wb3J0IHdhcm5pbmdzDQppbXBvcnQgcmUNCmltcG9ydCBzcmVfY29uc3RhbnRzDQppbXBvcnQgY29sbGVjdGlvbnMNCmltcG9ydCBwcHJpbnQNCmltcG9ydCB0cmFjZWJhY2sNCmltcG9ydCB0eXBlcw0KZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUNCg0KdHJ5Og0KICAgIGZyb20gX3RocmVhZCBpbXBvcnQgUkxvY2sNCmV4Y2VwdCBJbXBvcnRFcnJvcjoNCiAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgUkxvY2sNCg0KdHJ5Og0KICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0IGFzIF9PcmRlcmVkRGljdA0KZXhjZXB0IEltcG9ydEVycm9yOg0KICAgIHRyeToNCiAgICAgICAgZnJvbSBvcmRlcmVkZGljdCBpbXBvcnQgT3JkZXJlZERpY3QgYXMgX09yZGVyZWREaWN0DQogICAgZXhjZXB0IEltcG9ydEVycm9yOg0KICAgICAgICBfT3JkZXJlZERpY3QgPSBOb25lDQoNCiN+IHN5cy5zdGRlcnIud3JpdGUoICJ0ZXN0aW5nIHB5cGFyc2luZyBtb2R1bGUsIHZlcnNpb24gJXMsICVzXG4iICUgKF9fdmVyc2lvbl9fLF9fdmVyc2lvblRpbWVfXyApICkNCg0KX19hbGxfXyA9IFsNCidBbmQnLCAnQ2FzZWxlc3NLZXl3b3JkJywgJ0Nhc2VsZXNzTGl0ZXJhbCcsICdDaGFyc05vdEluJywgJ0NvbWJpbmUnLCAnRGljdCcsICdFYWNoJywgJ0VtcHR5JywNCidGb2xsb3dlZEJ5JywgJ0ZvcndhcmQnLCAnR29Ub0NvbHVtbicsICdHcm91cCcsICdLZXl3b3JkJywgJ0xpbmVFbmQnLCAnTGluZVN0YXJ0JywgJ0xpdGVyYWwnLA0KJ01hdGNoRmlyc3QnLCAnTm9NYXRjaCcsICdOb3RBbnknLCAnT25lT3JNb3JlJywgJ09ubHlPbmNlJywgJ09wdGlvbmFsJywgJ09yJywNCidQYXJzZUJhc2VFeGNlcHRpb24nLCAnUGFyc2VFbGVtZW50RW5oYW5jZScsICdQYXJzZUV4Y2VwdGlvbicsICdQYXJzZUV4cHJlc3Npb24nLCAnUGFyc2VGYXRhbEV4Y2VwdGlvbicsDQonUGFyc2VSZXN1bHRzJywgJ1BhcnNlU3ludGF4RXhjZXB0aW9uJywgJ1BhcnNlckVsZW1lbnQnLCAnUXVvdGVkU3RyaW5nJywgJ1JlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb24nLA0KJ1JlZ2V4JywgJ1NraXBUbycsICdTdHJpbmdFbmQnLCAnU3RyaW5nU3RhcnQnLCAnU3VwcHJlc3MnLCAnVG9rZW4nLCAnVG9rZW5Db252ZXJ0ZXInLCANCidXaGl0ZScsICdXb3JkJywgJ1dvcmRFbmQnLCAnV29yZFN0YXJ0JywgJ1plcm9Pck1vcmUnLA0KJ2FscGhhbnVtcycsICdhbHBoYXMnLCAnYWxwaGFzOGJpdCcsICdhbnlDbG9zZVRhZycsICdhbnlPcGVuVGFnJywgJ2NTdHlsZUNvbW1lbnQnLCAnY29sJywNCidjb21tYVNlcGFyYXRlZExpc3QnLCAnY29tbW9uSFRNTEVudGl0eScsICdjb3VudGVkQXJyYXknLCAnY3BwU3R5bGVDb21tZW50JywgJ2RibFF1b3RlZFN0cmluZycsDQonZGJsU2xhc2hDb21tZW50JywgJ2RlbGltaXRlZExpc3QnLCAnZGljdE9mJywgJ2Rvd25jYXNlVG9rZW5zJywgJ2VtcHR5JywgJ2hleG51bXMnLA0KJ2h0bWxDb21tZW50JywgJ2phdmFTdHlsZUNvbW1lbnQnLCAnbGluZScsICdsaW5lRW5kJywgJ2xpbmVTdGFydCcsICdsaW5lbm8nLA0KJ21ha2VIVE1MVGFncycsICdtYWtlWE1MVGFncycsICdtYXRjaE9ubHlBdENvbCcsICdtYXRjaFByZXZpb3VzRXhwcicsICdtYXRjaFByZXZpb3VzTGl0ZXJhbCcsDQonbmVzdGVkRXhwcicsICdudWxsRGVidWdBY3Rpb24nLCAnbnVtcycsICdvbmVPZicsICdvcEFzc29jJywgJ29wZXJhdG9yUHJlY2VkZW5jZScsICdwcmludGFibGVzJywNCidwdW5jOGJpdCcsICdweXRob25TdHlsZUNvbW1lbnQnLCAncXVvdGVkU3RyaW5nJywgJ3JlbW92ZVF1b3RlcycsICdyZXBsYWNlSFRNTEVudGl0eScsIA0KJ3JlcGxhY2VXaXRoJywgJ3Jlc3RPZkxpbmUnLCAnc2dsUXVvdGVkU3RyaW5nJywgJ3NyYW5nZScsICdzdHJpbmdFbmQnLA0KJ3N0cmluZ1N0YXJ0JywgJ3RyYWNlUGFyc2VBY3Rpb24nLCAndW5pY29kZVN0cmluZycsICd1cGNhc2VUb2tlbnMnLCAnd2l0aEF0dHJpYnV0ZScsDQonaW5kZW50ZWRCbG9jaycsICdvcmlnaW5hbFRleHRGb3InLCAndW5ncm91cCcsICdpbmZpeE5vdGF0aW9uJywnbG9jYXRlZEV4cHInLCAnd2l0aENsYXNzJywNCidDbG9zZU1hdGNoJywgJ3Rva2VuTWFwJywgJ3B5cGFyc2luZ19jb21tb24nLA0KXQ0KDQpzeXN0ZW1fdmVyc2lvbiA9IHR1cGxlKHN5cy52ZXJzaW9uX2luZm8pWzozXQ0KUFlfMyA9IHN5c3RlbV92ZXJzaW9uWzBdID09IDMNCmlmIFBZXzM6DQogICAgX01BWF9JTlQgPSBzeXMubWF4c2l6ZQ0KICAgIGJhc2VzdHJpbmcgPSBzdHINCiAgICB1bmljaHIgPSBjaHINCiAgICBfdXN0ciA9IHN0cg0KDQogICAgIyBidWlsZCBsaXN0IG9mIHNpbmdsZSBhcmcgYnVpbHRpbnMsIHRoYXQgY2FuIGJlIHVzZWQgYXMgcGFyc2UgYWN0aW9ucw0KICAgIHNpbmdsZUFyZ0J1aWx0aW5zID0gW3N1bSwgbGVuLCBzb3J0ZWQsIHJldmVyc2VkLCBsaXN0LCB0dXBsZSwgc2V0LCBhbnksIGFsbCwgbWluLCBtYXhdDQoNCmVsc2U6DQogICAgX01BWF9JTlQgPSBzeXMubWF4aW50DQogICAgcmFuZ2UgPSB4cmFuZ2UNCg0KICAgIGRlZiBfdXN0cihvYmopOg0KICAgICAgICAiIiJEcm9wLWluIHJlcGxhY2VtZW50IGZvciBzdHIob2JqKSB0aGF0IHRyaWVzIHRvIGJlIFVuaWNvZGUgZnJpZW5kbHkuIEl0IGZpcnN0IHRyaWVzDQogICAgICAgICAgIHN0cihvYmopLiBJZiB0aGF0IGZhaWxzIHdpdGggYSBVbmljb2RlRW5jb2RlRXJyb3IsIHRoZW4gaXQgdHJpZXMgdW5pY29kZShvYmopLiBJdA0KICAgICAgICAgICB0aGVuIDwgcmV0dXJucyB0aGUgdW5pY29kZSBvYmplY3QgfCBlbmNvZGVzIGl0IHdpdGggdGhlIGRlZmF1bHQgZW5jb2RpbmcgfCAuLi4gPi4NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLHVuaWNvZGUpOg0KICAgICAgICAgICAgcmV0dXJuIG9iag0KDQogICAgICAgIHRyeToNCiAgICAgICAgICAgICMgSWYgdGhpcyB3b3JrcywgdGhlbiBfdXN0cihvYmopIGhhcyB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgc3RyKG9iaiksIHNvDQogICAgICAgICAgICAjIGl0IHdvbid0IGJyZWFrIGFueSBleGlzdGluZyBjb2RlLg0KICAgICAgICAgICAgcmV0dXJuIHN0cihvYmopDQoNCiAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoNCiAgICAgICAgICAgICMgRWxzZSBlbmNvZGUgaXQNCiAgICAgICAgICAgIHJldCA9IHVuaWNvZGUob2JqKS5lbmNvZGUoc3lzLmdldGRlZmF1bHRlbmNvZGluZygpLCAneG1sY2hhcnJlZnJlcGxhY2UnKQ0KICAgICAgICAgICAgeG1sY2hhcnJlZiA9IFJlZ2V4KCcmI1xkKzsnKQ0KICAgICAgICAgICAgeG1sY2hhcnJlZi5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDogJ1xcdScgKyBoZXgoaW50KHRbMF1bMjotMV0pKVsyOl0pDQogICAgICAgICAgICByZXR1cm4geG1sY2hhcnJlZi50cmFuc2Zvcm1TdHJpbmcocmV0KQ0KDQogICAgIyBidWlsZCBsaXN0IG9mIHNpbmdsZSBhcmcgYnVpbHRpbnMsIHRvbGVyYW50IG9mIFB5dGhvbiB2ZXJzaW9uLCB0aGF0IGNhbiBiZSB1c2VkIGFzIHBhcnNlIGFjdGlvbnMNCiAgICBzaW5nbGVBcmdCdWlsdGlucyA9IFtdDQogICAgaW1wb3J0IF9fYnVpbHRpbl9fDQogICAgZm9yIGZuYW1lIGluICJzdW0gbGVuIHNvcnRlZCByZXZlcnNlZCBsaXN0IHR1cGxlIHNldCBhbnkgYWxsIG1pbiBtYXgiLnNwbGl0KCk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNpbmdsZUFyZ0J1aWx0aW5zLmFwcGVuZChnZXRhdHRyKF9fYnVpbHRpbl9fLGZuYW1lKSkNCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOg0KICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIA0KX2dlbmVyYXRvclR5cGUgPSB0eXBlKCh5IGZvciB5IGluIHJhbmdlKDEpKSkNCiANCmRlZiBfeG1sX2VzY2FwZShkYXRhKToNCiAgICAiIiJFc2NhcGUgJiwgPCwgPiwgIiwgJywgZXRjLiBpbiBhIHN0cmluZyBvZiBkYXRhLiIiIg0KDQogICAgIyBhbXBlcnNhbmQgbXVzdCBiZSByZXBsYWNlZCBmaXJzdA0KICAgIGZyb21fc3ltYm9scyA9ICcmPjwiXCcnDQogICAgdG9fc3ltYm9scyA9ICgnJicrcysnOycgZm9yIHMgaW4gImFtcCBndCBsdCBxdW90IGFwb3MiLnNwbGl0KCkpDQogICAgZm9yIGZyb21fLHRvXyBpbiB6aXAoZnJvbV9zeW1ib2xzLCB0b19zeW1ib2xzKToNCiAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZShmcm9tXywgdG9fKQ0KICAgIHJldHVybiBkYXRhDQoNCmNsYXNzIF9Db25zdGFudHMob2JqZWN0KToNCiAgICBwYXNzDQoNCmFscGhhcyAgICAgPSBzdHJpbmcuYXNjaWlfdXBwZXJjYXNlICsgc3RyaW5nLmFzY2lpX2xvd2VyY2FzZQ0KbnVtcyAgICAgICA9ICIwMTIzNDU2Nzg5Ig0KaGV4bnVtcyAgICA9IG51bXMgKyAiQUJDREVGYWJjZGVmIg0KYWxwaGFudW1zICA9IGFscGhhcyArIG51bXMNCl9ic2xhc2ggICAgPSBjaHIoOTIpDQpwcmludGFibGVzID0gIiIuam9pbihjIGZvciBjIGluIHN0cmluZy5wcmludGFibGUgaWYgYyBub3QgaW4gc3RyaW5nLndoaXRlc3BhY2UpDQoNCmNsYXNzIFBhcnNlQmFzZUV4Y2VwdGlvbihFeGNlcHRpb24pOg0KICAgICIiImJhc2UgZXhjZXB0aW9uIGNsYXNzIGZvciBhbGwgcGFyc2luZyBydW50aW1lIGV4Y2VwdGlvbnMiIiINCiAgICAjIFBlcmZvcm1hbmNlIHR1bmluZzogd2UgY29uc3RydWN0IGEgKmxvdCogb2YgdGhlc2UsIHNvIGtlZXAgdGhpcw0KICAgICMgY29uc3RydWN0b3IgYXMgc21hbGwgYW5kIGZhc3QgYXMgcG9zc2libGUNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHBzdHIsIGxvYz0wLCBtc2c9Tm9uZSwgZWxlbT1Ob25lICk6DQogICAgICAgIHNlbGYubG9jID0gbG9jDQogICAgICAgIGlmIG1zZyBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5tc2cgPSBwc3RyDQogICAgICAgICAgICBzZWxmLnBzdHIgPSAiIg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tc2cgPSBtc2cNCiAgICAgICAgICAgIHNlbGYucHN0ciA9IHBzdHINCiAgICAgICAgc2VsZi5wYXJzZXJFbGVtZW50ID0gZWxlbQ0KICAgICAgICBzZWxmLmFyZ3MgPSAocHN0ciwgbG9jLCBtc2cpDQoNCiAgICBAY2xhc3NtZXRob2QNCiAgICBkZWYgX2Zyb21fZXhjZXB0aW9uKGNscywgcGUpOg0KICAgICAgICAiIiINCiAgICAgICAgaW50ZXJuYWwgZmFjdG9yeSBtZXRob2QgdG8gc2ltcGxpZnkgY3JlYXRpbmcgb25lIHR5cGUgb2YgUGFyc2VFeGNlcHRpb24gDQogICAgICAgIGZyb20gYW5vdGhlciAtIGF2b2lkcyBoYXZpbmcgX19pbml0X18gc2lnbmF0dXJlIGNvbmZsaWN0cyBhbW9uZyBzdWJjbGFzc2VzDQogICAgICAgICIiIg0KICAgICAgICByZXR1cm4gY2xzKHBlLnBzdHIsIHBlLmxvYywgcGUubXNnLCBwZS5wYXJzZXJFbGVtZW50KQ0KDQogICAgZGVmIF9fZ2V0YXR0cl9fKCBzZWxmLCBhbmFtZSApOg0KICAgICAgICAiIiJzdXBwb3J0ZWQgYXR0cmlidXRlcyBieSBuYW1lIGFyZToNCiAgICAgICAgICAgIC0gbGluZW5vIC0gcmV0dXJucyB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgICAgICAgICAtIGNvbCAtIHJldHVybnMgdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgICAgICAgICAtIGxpbmUgLSByZXR1cm5zIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgICAgICIiIg0KICAgICAgICBpZiggYW5hbWUgPT0gImxpbmVubyIgKToNCiAgICAgICAgICAgIHJldHVybiBsaW5lbm8oIHNlbGYubG9jLCBzZWxmLnBzdHIgKQ0KICAgICAgICBlbGlmKCBhbmFtZSBpbiAoImNvbCIsICJjb2x1bW4iKSApOg0KICAgICAgICAgICAgcmV0dXJuIGNvbCggc2VsZi5sb2MsIHNlbGYucHN0ciApDQogICAgICAgIGVsaWYoIGFuYW1lID09ICJsaW5lIiApOg0KICAgICAgICAgICAgcmV0dXJuIGxpbmUoIHNlbGYubG9jLCBzZWxmLnBzdHIgKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoYW5hbWUpDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gIiVzIChhdCBjaGFyICVkKSwgKGxpbmU6JWQsIGNvbDolZCkiICUgXA0KICAgICAgICAgICAgICAgICggc2VsZi5tc2csIHNlbGYubG9jLCBzZWxmLmxpbmVubywgc2VsZi5jb2x1bW4gKQ0KICAgIGRlZiBfX3JlcHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gX3VzdHIoc2VsZikNCiAgICBkZWYgbWFya0lucHV0bGluZSggc2VsZiwgbWFya2VyU3RyaW5nID0gIj4hPCIgKToNCiAgICAgICAgIiIiRXh0cmFjdHMgdGhlIGV4Y2VwdGlvbiBsaW5lIGZyb20gdGhlIGlucHV0IHN0cmluZywgYW5kIG1hcmtzDQogICAgICAgICAgIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXhjZXB0aW9uIHdpdGggYSBzcGVjaWFsIHN5bWJvbC4NCiAgICAgICAgIiIiDQogICAgICAgIGxpbmVfc3RyID0gc2VsZi5saW5lDQogICAgICAgIGxpbmVfY29sdW1uID0gc2VsZi5jb2x1bW4gLSAxDQogICAgICAgIGlmIG1hcmtlclN0cmluZzoNCiAgICAgICAgICAgIGxpbmVfc3RyID0gIiIuam9pbigobGluZV9zdHJbOmxpbmVfY29sdW1uXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyU3RyaW5nLCBsaW5lX3N0cltsaW5lX2NvbHVtbjpdKSkNCiAgICAgICAgcmV0dXJuIGxpbmVfc3RyLnN0cmlwKCkNCiAgICBkZWYgX19kaXJfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuICJsaW5lbm8gY29sIGxpbmUiLnNwbGl0KCkgKyBkaXIodHlwZShzZWxmKSkNCg0KY2xhc3MgUGFyc2VFeGNlcHRpb24oUGFyc2VCYXNlRXhjZXB0aW9uKToNCiAgICAiIiINCiAgICBFeGNlcHRpb24gdGhyb3duIHdoZW4gcGFyc2UgZXhwcmVzc2lvbnMgZG9uJ3QgbWF0Y2ggY2xhc3M7DQogICAgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgYnkgbmFtZSBhcmU6DQogICAgIC0gbGluZW5vIC0gcmV0dXJucyB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgIC0gY29sIC0gcmV0dXJucyB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgLSBsaW5lIC0gcmV0dXJucyB0aGUgbGluZSBjb250YWluaW5nIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAgICANCiAgICBFeGFtcGxlOjoNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgV29yZChudW1zKS5zZXROYW1lKCJpbnRlZ2VyIikucGFyc2VTdHJpbmcoIkFCQyIpDQogICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBwZToNCiAgICAgICAgICAgIHByaW50KHBlKQ0KICAgICAgICAgICAgcHJpbnQoImNvbHVtbjoge30iLmZvcm1hdChwZS5jb2wpKQ0KICAgICAgICAgICAgDQogICAgcHJpbnRzOjoNCiAgICAgICBFeHBlY3RlZCBpbnRlZ2VyIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCiAgICAgICAgY29sdW1uOiAxDQogICAgIiIiDQogICAgcGFzcw0KDQpjbGFzcyBQYXJzZUZhdGFsRXhjZXB0aW9uKFBhcnNlQmFzZUV4Y2VwdGlvbik6DQogICAgIiIidXNlci10aHJvd2FibGUgZXhjZXB0aW9uIHRocm93biB3aGVuIGluY29uc2lzdGVudCBwYXJzZSBjb250ZW50DQogICAgICAgaXMgZm91bmQ7IHN0b3BzIGFsbCBwYXJzaW5nIGltbWVkaWF0ZWx5IiIiDQogICAgcGFzcw0KDQpjbGFzcyBQYXJzZVN5bnRheEV4Y2VwdGlvbihQYXJzZUZhdGFsRXhjZXB0aW9uKToNCiAgICAiIiJqdXN0IGxpa2UgTHtQYXJzZUZhdGFsRXhjZXB0aW9ufSwgYnV0IHRocm93biBpbnRlcm5hbGx5IHdoZW4gYW4NCiAgICAgICBMe0Vycm9yU3RvcDxBbmQuX0Vycm9yU3RvcD59ICgnLScgb3BlcmF0b3IpIGluZGljYXRlcyB0aGF0IHBhcnNpbmcgaXMgdG8gc3RvcCANCiAgICAgICBpbW1lZGlhdGVseSBiZWNhdXNlIGFuIHVuYmFja3RyYWNrYWJsZSBzeW50YXggZXJyb3IgaGFzIGJlZW4gZm91bmQiIiINCiAgICBwYXNzDQoNCiN+IGNsYXNzIFJlcGFyc2VFeGNlcHRpb24oUGFyc2VCYXNlRXhjZXB0aW9uKToNCiAgICAjfiAiIiJFeHBlcmltZW50YWwgY2xhc3MgLSBwYXJzZSBhY3Rpb25zIGNhbiByYWlzZSB0aGlzIGV4Y2VwdGlvbiB0byBjYXVzZQ0KICAgICAgICN+IHB5cGFyc2luZyB0byByZXBhcnNlIHRoZSBpbnB1dCBzdHJpbmc6DQogICAgICAgICN+IC0gd2l0aCBhIG1vZGlmaWVkIGlucHV0IHN0cmluZywgYW5kL29yDQogICAgICAgICN+IC0gd2l0aCBhIG1vZGlmaWVkIHN0YXJ0IGxvY2F0aW9uDQogICAgICAgI34gU2V0IHRoZSB2YWx1ZXMgb2YgdGhlIFJlcGFyc2VFeGNlcHRpb24gaW4gdGhlIGNvbnN0cnVjdG9yLCBhbmQgcmFpc2UgdGhlDQogICAgICAgI34gZXhjZXB0aW9uIGluIGEgcGFyc2UgYWN0aW9uIHRvIGNhdXNlIHB5cGFyc2luZyB0byB1c2UgdGhlIG5ldyBzdHJpbmcvbG9jYXRpb24uDQogICAgICAgI34gU2V0dGluZyB0aGUgdmFsdWVzIGFzIE5vbmUgY2F1c2VzIG5vIGNoYW5nZSB0byBiZSBtYWRlLg0KICAgICAgICN+ICIiIg0KICAgICN+IGRlZiBfX2luaXRfKCBzZWxmLCBuZXdzdHJpbmcsIHJlc3RhcnRMb2MgKToNCiAgICAgICAgI34gc2VsZi5uZXdQYXJzZVRleHQgPSBuZXdzdHJpbmcNCiAgICAgICAgI34gc2VsZi5yZXBhcnNlTG9jID0gcmVzdGFydExvYw0KDQpjbGFzcyBSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uKEV4Y2VwdGlvbik6DQogICAgIiIiZXhjZXB0aW9uIHRocm93biBieSBMe1BhcnNlckVsZW1lbnQudmFsaWRhdGV9IGlmIHRoZSBncmFtbWFyIGNvdWxkIGJlIGltcHJvcGVybHkgcmVjdXJzaXZlIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHNlbGYucGFyc2VFbGVtZW50VHJhY2UgPSBwYXJzZUVsZW1lbnRMaXN0DQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gIlJlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb246ICVzIiAlIHNlbGYucGFyc2VFbGVtZW50VHJhY2UNCg0KY2xhc3MgX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQob2JqZWN0KToNCiAgICBkZWYgX19pbml0X18oc2VsZixwMSxwMik6DQogICAgICAgIHNlbGYudHVwID0gKHAxLHAyKQ0KICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLGkpOg0KICAgICAgICByZXR1cm4gc2VsZi50dXBbaV0NCiAgICBkZWYgX19yZXByX18oc2VsZik6DQogICAgICAgIHJldHVybiByZXByKHNlbGYudHVwWzBdKQ0KICAgIGRlZiBzZXRPZmZzZXQoc2VsZixpKToNCiAgICAgICAgc2VsZi50dXAgPSAoc2VsZi50dXBbMF0saSkNCg0KY2xhc3MgUGFyc2VSZXN1bHRzKG9iamVjdCk6DQogICAgIiIiDQogICAgU3RydWN0dXJlZCBwYXJzZSByZXN1bHRzLCB0byBwcm92aWRlIG11bHRpcGxlIG1lYW5zIG9mIGFjY2VzcyB0byB0aGUgcGFyc2VkIGRhdGE6DQogICAgICAgLSBhcyBhIGxpc3QgKEN7bGVuKHJlc3VsdHMpfSkNCiAgICAgICAtIGJ5IGxpc3QgaW5kZXggKEN7cmVzdWx0c1swXSwgcmVzdWx0c1sxXX0sIGV0Yy4pDQogICAgICAgLSBieSBhdHRyaWJ1dGUgKEN7cmVzdWx0cy48cmVzdWx0c05hbWU+fSAtIHNlZSBMe1BhcnNlckVsZW1lbnQuc2V0UmVzdWx0c05hbWV9KQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgIGRhdGVfc3RyID0gKGludGVnZXIuc2V0UmVzdWx0c05hbWUoInllYXIiKSArICcvJyANCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgibW9udGgiKSArICcvJyANCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgiZGF5IikpDQogICAgICAgICMgZXF1aXZhbGVudCBmb3JtOg0KICAgICAgICAjIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpDQoNCiAgICAgICAgIyBwYXJzZVN0cmluZyByZXR1cm5zIGEgUGFyc2VSZXN1bHRzIG9iamVjdA0KICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpDQoNCiAgICAgICAgZGVmIHRlc3QocywgZm49cmVwcik6DQogICAgICAgICAgICBwcmludCgiJXMgLT4gJXMiICUgKHMsIGZuKGV2YWwocykpKSkNCiAgICAgICAgdGVzdCgibGlzdChyZXN1bHQpIikNCiAgICAgICAgdGVzdCgicmVzdWx0WzBdIikNCiAgICAgICAgdGVzdCgicmVzdWx0Wydtb250aCddIikNCiAgICAgICAgdGVzdCgicmVzdWx0LmRheSIpDQogICAgICAgIHRlc3QoIidtb250aCcgaW4gcmVzdWx0IikNCiAgICAgICAgdGVzdCgiJ21pbnV0ZXMnIGluIHJlc3VsdCIpDQogICAgICAgIHRlc3QoInJlc3VsdC5kdW1wKCkiLCBzdHIpDQogICAgcHJpbnRzOjoNCiAgICAgICAgbGlzdChyZXN1bHQpIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQ0KICAgICAgICByZXN1bHRbMF0gLT4gJzE5OTknDQogICAgICAgIHJlc3VsdFsnbW9udGgnXSAtPiAnMTInDQogICAgICAgIHJlc3VsdC5kYXkgLT4gJzMxJw0KICAgICAgICAnbW9udGgnIGluIHJlc3VsdCAtPiBUcnVlDQogICAgICAgICdtaW51dGVzJyBpbiByZXN1bHQgLT4gRmFsc2UNCiAgICAgICAgcmVzdWx0LmR1bXAoKSAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10NCiAgICAgICAgLSBkYXk6IDMxDQogICAgICAgIC0gbW9udGg6IDEyDQogICAgICAgIC0geWVhcjogMTk5OQ0KICAgICIiIg0KICAgIGRlZiBfX25ld19fKGNscywgdG9rbGlzdD1Ob25lLCBuYW1lPU5vbmUsIGFzTGlzdD1UcnVlLCBtb2RhbD1UcnVlICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCwgY2xzKToNCiAgICAgICAgICAgIHJldHVybiB0b2tsaXN0DQogICAgICAgIHJldG9iaiA9IG9iamVjdC5fX25ld19fKGNscykNCiAgICAgICAgcmV0b2JqLl9fZG9pbml0ID0gVHJ1ZQ0KICAgICAgICByZXR1cm4gcmV0b2JqDQoNCiAgICAjIFBlcmZvcm1hbmNlIHR1bmluZzogd2UgY29uc3RydWN0IGEgKmxvdCogb2YgdGhlc2UsIHNvIGtlZXAgdGhpcw0KICAgICMgY29uc3RydWN0b3IgYXMgc21hbGwgYW5kIGZhc3QgYXMgcG9zc2libGUNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHRva2xpc3Q9Tm9uZSwgbmFtZT1Ob25lLCBhc0xpc3Q9VHJ1ZSwgbW9kYWw9VHJ1ZSwgaXNpbnN0YW5jZT1pc2luc3RhbmNlICk6DQogICAgICAgIGlmIHNlbGYuX19kb2luaXQ6DQogICAgICAgICAgICBzZWxmLl9fZG9pbml0ID0gRmFsc2UNCiAgICAgICAgICAgIHNlbGYuX19uYW1lID0gTm9uZQ0KICAgICAgICAgICAgc2VsZi5fX3BhcmVudCA9IE5vbmUNCiAgICAgICAgICAgIHNlbGYuX19hY2N1bU5hbWVzID0ge30NCiAgICAgICAgICAgIHNlbGYuX19hc0xpc3QgPSBhc0xpc3QNCiAgICAgICAgICAgIHNlbGYuX19tb2RhbCA9IG1vZGFsDQogICAgICAgICAgICBpZiB0b2tsaXN0IGlzIE5vbmU6DQogICAgICAgICAgICAgICAgdG9rbGlzdCA9IFtdDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsIGxpc3QpOg0KICAgICAgICAgICAgICAgIHNlbGYuX190b2tsaXN0ID0gdG9rbGlzdFs6XQ0KICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHRva2xpc3QsIF9nZW5lcmF0b3JUeXBlKToNCiAgICAgICAgICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IGxpc3QodG9rbGlzdCkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSBbdG9rbGlzdF0NCiAgICAgICAgICAgIHNlbGYuX190b2tkaWN0ID0gZGljdCgpDQoNCiAgICAgICAgaWYgbmFtZSBpcyBub3QgTm9uZSBhbmQgbmFtZToNCiAgICAgICAgICAgIGlmIG5vdCBtb2RhbDoNCiAgICAgICAgICAgICAgICBzZWxmLl9fYWNjdW1OYW1lc1tuYW1lXSA9IDANCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSxpbnQpOg0KICAgICAgICAgICAgICAgIG5hbWUgPSBfdXN0cihuYW1lKSAjIHdpbGwgYWx3YXlzIHJldHVybiBhIHN0ciwgYnV0IHVzZSBfdXN0ciBmb3IgY29uc2lzdGVuY3kNCiAgICAgICAgICAgIHNlbGYuX19uYW1lID0gbmFtZQ0KICAgICAgICAgICAgaWYgbm90IChpc2luc3RhbmNlKHRva2xpc3QsICh0eXBlKE5vbmUpLCBiYXNlc3RyaW5nLCBsaXN0KSkgYW5kIHRva2xpc3QgaW4gKE5vbmUsJycsW10pKToNCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsYmFzZXN0cmluZyk6DQogICAgICAgICAgICAgICAgICAgIHRva2xpc3QgPSBbIHRva2xpc3QgXQ0KICAgICAgICAgICAgICAgIGlmIGFzTGlzdDoNCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodG9rbGlzdC5jb3B5KCksMCkNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChQYXJzZVJlc3VsdHModG9rbGlzdFswXSksMCkNCiAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXS5fX25hbWUgPSBuYW1lDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IHRva2xpc3RbMF0NCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChLZXlFcnJvcixUeXBlRXJyb3IsSW5kZXhFcnJvcik6DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gdG9rbGlzdA0KDQogICAgZGVmIF9fZ2V0aXRlbV9fKCBzZWxmLCBpICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIGksIChpbnQsc2xpY2UpICk6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2xpc3RbaV0NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIGkgbm90IGluIHNlbGYuX19hY2N1bU5hbWVzOg0KICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rZGljdFtpXVstMV1bMF0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlUmVzdWx0cyhbIHZbMF0gZm9yIHYgaW4gc2VsZi5fX3Rva2RpY3RbaV0gXSkNCg0KICAgIGRlZiBfX3NldGl0ZW1fXyggc2VsZiwgaywgdiwgaXNpbnN0YW5jZT1pc2luc3RhbmNlICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UodixfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCk6DQogICAgICAgICAgICBzZWxmLl9fdG9rZGljdFtrXSA9IHNlbGYuX190b2tkaWN0LmdldChrLGxpc3QoKSkgKyBbdl0NCiAgICAgICAgICAgIHN1YiA9IHZbMF0NCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGssKGludCxzbGljZSkpOg0KICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3Rba10gPSB2DQogICAgICAgICAgICBzdWIgPSB2DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLl9fdG9rZGljdFtrXSA9IHNlbGYuX190b2tkaWN0LmdldChrLGxpc3QoKSkgKyBbX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodiwwKV0NCiAgICAgICAgICAgIHN1YiA9IHYNCiAgICAgICAgaWYgaXNpbnN0YW5jZShzdWIsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgIHN1Yi5fX3BhcmVudCA9IHdrcmVmKHNlbGYpDQoNCiAgICBkZWYgX19kZWxpdGVtX18oIHNlbGYsIGkgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZShpLChpbnQsc2xpY2UpKToNCiAgICAgICAgICAgIG15bGVuID0gbGVuKCBzZWxmLl9fdG9rbGlzdCApDQogICAgICAgICAgICBkZWwgc2VsZi5fX3Rva2xpc3RbaV0NCg0KICAgICAgICAgICAgIyBjb252ZXJ0IGludCB0byBzbGljZQ0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpLCBpbnQpOg0KICAgICAgICAgICAgICAgIGlmIGkgPCAwOg0KICAgICAgICAgICAgICAgICAgICBpICs9IG15bGVuDQogICAgICAgICAgICAgICAgaSA9IHNsaWNlKGksIGkrMSkNCiAgICAgICAgICAgICMgZ2V0IHJlbW92ZWQgaW5kaWNlcw0KICAgICAgICAgICAgcmVtb3ZlZCA9IGxpc3QocmFuZ2UoKmkuaW5kaWNlcyhteWxlbikpKQ0KICAgICAgICAgICAgcmVtb3ZlZC5yZXZlcnNlKCkNCiAgICAgICAgICAgICMgZml4dXAgaW5kaWNlcyBpbiB0b2tlbiBkaWN0aW9uYXJ5DQogICAgICAgICAgICBmb3IgbmFtZSxvY2N1cnJlbmNlcyBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpOg0KICAgICAgICAgICAgICAgIGZvciBqIGluIHJlbW92ZWQ6DQogICAgICAgICAgICAgICAgICAgIGZvciBrLCAodmFsdWUsIHBvc2l0aW9uKSBpbiBlbnVtZXJhdGUob2NjdXJyZW5jZXMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZW5jZXNba10gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2YWx1ZSwgcG9zaXRpb24gLSAocG9zaXRpb24gPiBqKSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGRlbCBzZWxmLl9fdG9rZGljdFtpXQ0KDQogICAgZGVmIF9fY29udGFpbnNfXyggc2VsZiwgayApOg0KICAgICAgICByZXR1cm4gayBpbiBzZWxmLl9fdG9rZGljdA0KDQogICAgZGVmIF9fbGVuX18oIHNlbGYgKTogcmV0dXJuIGxlbiggc2VsZi5fX3Rva2xpc3QgKQ0KICAgIGRlZiBfX2Jvb2xfXyhzZWxmKTogcmV0dXJuICggbm90IG5vdCBzZWxmLl9fdG9rbGlzdCApDQogICAgX19ub256ZXJvX18gPSBfX2Jvb2xfXw0KICAgIGRlZiBfX2l0ZXJfXyggc2VsZiApOiByZXR1cm4gaXRlciggc2VsZi5fX3Rva2xpc3QgKQ0KICAgIGRlZiBfX3JldmVyc2VkX18oIHNlbGYgKTogcmV0dXJuIGl0ZXIoIHNlbGYuX190b2tsaXN0Wzo6LTFdICkNCiAgICBkZWYgX2l0ZXJrZXlzKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZi5fX3Rva2RpY3QsICJpdGVya2V5cyIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tkaWN0Lml0ZXJrZXlzKCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBpdGVyKHNlbGYuX190b2tkaWN0KQ0KDQogICAgZGVmIF9pdGVydmFsdWVzKCBzZWxmICk6DQogICAgICAgIHJldHVybiAoc2VsZltrXSBmb3IgayBpbiBzZWxmLl9pdGVya2V5cygpKQ0KICAgICAgICAgICAgDQogICAgZGVmIF9pdGVyaXRlbXMoIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICgoaywgc2VsZltrXSkgZm9yIGsgaW4gc2VsZi5faXRlcmtleXMoKSkNCg0KICAgIGlmIFBZXzM6DQogICAgICAgIGtleXMgPSBfaXRlcmtleXMgICAgICAgDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXlzIChQeXRob24gMy54IG9ubHkpLiIiIg0KDQogICAgICAgIHZhbHVlcyA9IF9pdGVydmFsdWVzDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCB2YWx1ZXMgKFB5dGhvbiAzLnggb25seSkuIiIiDQoNCiAgICAgICAgaXRlbXMgPSBfaXRlcml0ZW1zDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXktdmFsdWUgdHVwbGVzIChQeXRob24gMy54IG9ubHkpLiIiIg0KDQogICAgZWxzZToNCiAgICAgICAgaXRlcmtleXMgPSBfaXRlcmtleXMNCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleXMgKFB5dGhvbiAyLnggb25seSkuIiIiDQoNCiAgICAgICAgaXRlcnZhbHVlcyA9IF9pdGVydmFsdWVzDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCB2YWx1ZXMgKFB5dGhvbiAyLnggb25seSkuIiIiDQoNCiAgICAgICAgaXRlcml0ZW1zID0gX2l0ZXJpdGVtcw0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5LXZhbHVlIHR1cGxlcyAoUHl0aG9uIDIueCBvbmx5KS4iIiINCg0KICAgICAgICBkZWYga2V5cyggc2VsZiApOg0KICAgICAgICAgICAgIiIiUmV0dXJucyBhbGwgbmFtZWQgcmVzdWx0IGtleXMgKGFzIGEgbGlzdCBpbiBQeXRob24gMi54LCBhcyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy54KS4iIiINCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcmtleXMoKSkNCg0KICAgICAgICBkZWYgdmFsdWVzKCBzZWxmICk6DQogICAgICAgICAgICAiIiJSZXR1cm5zIGFsbCBuYW1lZCByZXN1bHQgdmFsdWVzIChhcyBhIGxpc3QgaW4gUHl0aG9uIDIueCwgYXMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMueCkuIiIiDQogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJ2YWx1ZXMoKSkNCiAgICAgICAgICAgICAgICANCiAgICAgICAgZGVmIGl0ZW1zKCBzZWxmICk6DQogICAgICAgICAgICAiIiJSZXR1cm5zIGFsbCBuYW1lZCByZXN1bHQga2V5LXZhbHVlcyAoYXMgYSBsaXN0IG9mIHR1cGxlcyBpbiBQeXRob24gMi54LCBhcyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy54KS4iIiINCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcml0ZW1zKCkpDQoNCiAgICBkZWYgaGFza2V5cyggc2VsZiApOg0KICAgICAgICAiIiJTaW5jZSBrZXlzKCkgcmV0dXJucyBhbiBpdGVyYXRvciwgdGhpcyBtZXRob2QgaXMgaGVscGZ1bCBpbiBieXBhc3NpbmcNCiAgICAgICAgICAgY29kZSB0aGF0IGxvb2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFueSBkZWZpbmVkIHJlc3VsdHMgbmFtZXMuIiIiDQogICAgICAgIHJldHVybiBib29sKHNlbGYuX190b2tkaWN0KQ0KICAgICAgICANCiAgICBkZWYgcG9wKCBzZWxmLCAqYXJncywgKiprd2FyZ3MpOg0KICAgICAgICAiIiINCiAgICAgICAgUmVtb3ZlcyBhbmQgcmV0dXJucyBpdGVtIGF0IHNwZWNpZmllZCBpbmRleCAoZGVmYXVsdD1De2xhc3R9KS4NCiAgICAgICAgU3VwcG9ydHMgYm90aCBDe2xpc3R9IGFuZCBDe2RpY3R9IHNlbWFudGljcyBmb3IgQ3twb3AoKX0uIElmIHBhc3NlZCBubw0KICAgICAgICBhcmd1bWVudCBvciBhbiBpbnRlZ2VyIGFyZ3VtZW50LCBpdCB3aWxsIHVzZSBDe2xpc3R9IHNlbWFudGljcw0KICAgICAgICBhbmQgcG9wIHRva2VucyBmcm9tIHRoZSBsaXN0IG9mIHBhcnNlZCB0b2tlbnMuIElmIHBhc3NlZCBhIA0KICAgICAgICBub24taW50ZWdlciBhcmd1bWVudCAobW9zdCBsaWtlbHkgYSBzdHJpbmcpLCBpdCB3aWxsIHVzZSBDe2RpY3R9DQogICAgICAgIHNlbWFudGljcyBhbmQgcG9wIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGZyb20gYW55IGRlZmluZWQgDQogICAgICAgIHJlc3VsdHMgbmFtZXMuIEEgc2Vjb25kIGRlZmF1bHQgcmV0dXJuIHZhbHVlIGFyZ3VtZW50IGlzIA0KICAgICAgICBzdXBwb3J0ZWQsIGp1c3QgYXMgaW4gQ3tkaWN0LnBvcCgpfS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGRlZiByZW1vdmVfZmlyc3QodG9rZW5zKToNCiAgICAgICAgICAgICAgICB0b2tlbnMucG9wKDApDQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJ10NCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5hZGRQYXJzZUFjdGlvbihyZW1vdmVfZmlyc3QpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzEyMycsICczMjEnXQ0KDQogICAgICAgICAgICBsYWJlbCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICAgICAgcGF0dCA9IGxhYmVsKCJMQUJFTCIpICsgT25lT3JNb3JlKFdvcmQobnVtcykpDQogICAgICAgICAgICBwcmludChwYXR0LnBhcnNlU3RyaW5nKCJBQUIgMTIzIDMyMSIpLmR1bXAoKSkNCg0KICAgICAgICAgICAgIyBVc2UgcG9wKCkgaW4gYSBwYXJzZSBhY3Rpb24gdG8gcmVtb3ZlIG5hbWVkIHJlc3VsdCAobm90ZSB0aGF0IGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMgbm90DQogICAgICAgICAgICAjIHJlbW92ZWQgZnJvbSBsaXN0IGZvcm0gb2YgcmVzdWx0cykNCiAgICAgICAgICAgIGRlZiByZW1vdmVfTEFCRUwodG9rZW5zKToNCiAgICAgICAgICAgICAgICB0b2tlbnMucG9wKCJMQUJFTCIpDQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2Vucw0KICAgICAgICAgICAgcGF0dC5hZGRQYXJzZUFjdGlvbihyZW1vdmVfTEFCRUwpDQogICAgICAgICAgICBwcmludChwYXR0LnBhcnNlU3RyaW5nKCJBQUIgMTIzIDMyMSIpLmR1bXAoKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFsnQUFCJywgJzEyMycsICczMjEnXQ0KICAgICAgICAgICAgLSBMQUJFTDogQUFCDQoNCiAgICAgICAgICAgIFsnQUFCJywgJzEyMycsICczMjEnXQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgbm90IGFyZ3M6DQogICAgICAgICAgICBhcmdzID0gWy0xXQ0KICAgICAgICBmb3Igayx2IGluIGt3YXJncy5pdGVtcygpOg0KICAgICAgICAgICAgaWYgayA9PSAnZGVmYXVsdCc6DQogICAgICAgICAgICAgICAgYXJncyA9IChhcmdzWzBdLCB2KQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInBvcCgpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJyVzJyIgJSBrKQ0KICAgICAgICBpZiAoaXNpbnN0YW5jZShhcmdzWzBdLCBpbnQpIG9yIA0KICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGFyZ3MpID09IDEgb3IgDQogICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzBdIGluIHNlbGYpOg0KICAgICAgICAgICAgaW5kZXggPSBhcmdzWzBdDQogICAgICAgICAgICByZXQgPSBzZWxmW2luZGV4XQ0KICAgICAgICAgICAgZGVsIHNlbGZbaW5kZXhdDQogICAgICAgICAgICByZXR1cm4gcmV0DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBkZWZhdWx0dmFsdWUgPSBhcmdzWzFdDQogICAgICAgICAgICByZXR1cm4gZGVmYXVsdHZhbHVlDQoNCiAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdFZhbHVlPU5vbmUpOg0KICAgICAgICAiIiINCiAgICAgICAgUmV0dXJucyBuYW1lZCByZXN1bHQgbWF0Y2hpbmcgdGhlIGdpdmVuIGtleSwgb3IgaWYgdGhlcmUgaXMgbm8NCiAgICAgICAgc3VjaCBuYW1lLCB0aGVuIHJldHVybnMgdGhlIGdpdmVuIEN7ZGVmYXVsdFZhbHVlfSBvciBDe05vbmV9IGlmIG5vDQogICAgICAgIEN7ZGVmYXVsdFZhbHVlfSBpcyBzcGVjaWZpZWQuDQoNCiAgICAgICAgU2ltaWxhciB0byBDe2RpY3QuZ2V0KCl9Lg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikgICAgICAgICAgIA0KDQogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpDQogICAgICAgICAgICBwcmludChyZXN1bHQuZ2V0KCJ5ZWFyIikpICMgLT4gJzE5OTknDQogICAgICAgICAgICBwcmludChyZXN1bHQuZ2V0KCJob3VyIiwgIm5vdCBzcGVjaWZpZWQiKSkgIyAtPiAnbm90IHNwZWNpZmllZCcNCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5nZXQoImhvdXIiKSkgIyAtPiBOb25lDQogICAgICAgICIiIg0KICAgICAgICBpZiBrZXkgaW4gc2VsZjoNCiAgICAgICAgICAgIHJldHVybiBzZWxmW2tleV0NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWUNCg0KICAgIGRlZiBpbnNlcnQoIHNlbGYsIGluZGV4LCBpbnNTdHIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEluc2VydHMgbmV3IGVsZW1lbnQgYXQgbG9jYXRpb24gaW5kZXggaW4gdGhlIGxpc3Qgb2YgcGFyc2VkIHRva2Vucy4NCiAgICAgICAgDQogICAgICAgIFNpbWlsYXIgdG8gQ3tsaXN0Lmluc2VydCgpfS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnXQ0KDQogICAgICAgICAgICAjIHVzZSBhIHBhcnNlIGFjdGlvbiB0byBpbnNlcnQgdGhlIHBhcnNlIGxvY2F0aW9uIGluIHRoZSBmcm9udCBvZiB0aGUgcGFyc2VkIHJlc3VsdHMNCiAgICAgICAgICAgIGRlZiBpbnNlcnRfbG9jbihsb2NuLCB0b2tlbnMpOg0KICAgICAgICAgICAgICAgIHRva2Vucy5pbnNlcnQoMCwgbG9jbikNCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5hZGRQYXJzZUFjdGlvbihpbnNlcnRfbG9jbikucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFswLCAnMCcsICcxMjMnLCAnMzIxJ10NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuX190b2tsaXN0Lmluc2VydChpbmRleCwgaW5zU3RyKQ0KICAgICAgICAjIGZpeHVwIGluZGljZXMgaW4gdG9rZW4gZGljdGlvbmFyeQ0KICAgICAgICBmb3IgbmFtZSxvY2N1cnJlbmNlcyBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpOg0KICAgICAgICAgICAgZm9yIGssICh2YWx1ZSwgcG9zaXRpb24pIGluIGVudW1lcmF0ZShvY2N1cnJlbmNlcyk6DQogICAgICAgICAgICAgICAgb2NjdXJyZW5jZXNba10gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2YWx1ZSwgcG9zaXRpb24gKyAocG9zaXRpb24gPiBpbmRleCkpDQoNCiAgICBkZWYgYXBwZW5kKCBzZWxmLCBpdGVtICk6DQogICAgICAgICIiIg0KICAgICAgICBBZGQgc2luZ2xlIGVsZW1lbnQgdG8gZW5kIG9mIFBhcnNlUmVzdWx0cyBsaXN0IG9mIGVsZW1lbnRzLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMSddDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgdXNlIGEgcGFyc2UgYWN0aW9uIHRvIGNvbXB1dGUgdGhlIHN1bSBvZiB0aGUgcGFyc2VkIGludGVnZXJzLCBhbmQgYWRkIGl0IHRvIHRoZSBlbmQNCiAgICAgICAgICAgIGRlZiBhcHBlbmRfc3VtKHRva2Vucyk6DQogICAgICAgICAgICAgICAgdG9rZW5zLmFwcGVuZChzdW0obWFwKGludCwgdG9rZW5zKSkpDQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkuYWRkUGFyc2VBY3Rpb24oYXBwZW5kX3N1bSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJywgNDQ0XQ0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5fX3Rva2xpc3QuYXBwZW5kKGl0ZW0pDQoNCiAgICBkZWYgZXh0ZW5kKCBzZWxmLCBpdGVtc2VxICk6DQogICAgICAgICIiIg0KICAgICAgICBBZGQgc2VxdWVuY2Ugb2YgZWxlbWVudHMgdG8gZW5kIG9mIFBhcnNlUmVzdWx0cyBsaXN0IG9mIGVsZW1lbnRzLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgcGF0dCA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgdXNlIGEgcGFyc2UgYWN0aW9uIHRvIGFwcGVuZCB0aGUgcmV2ZXJzZSBvZiB0aGUgbWF0Y2hlZCBzdHJpbmdzLCB0byBtYWtlIGEgcGFsaW5kcm9tZQ0KICAgICAgICAgICAgZGVmIG1ha2VfcGFsaW5kcm9tZSh0b2tlbnMpOg0KICAgICAgICAgICAgICAgIHRva2Vucy5leHRlbmQocmV2ZXJzZWQoW3RbOjotMV0gZm9yIHQgaW4gdG9rZW5zXSkpDQogICAgICAgICAgICAgICAgcmV0dXJuICcnLmpvaW4odG9rZW5zKQ0KICAgICAgICAgICAgcHJpbnQocGF0dC5hZGRQYXJzZUFjdGlvbihtYWtlX3BhbGluZHJvbWUpLnBhcnNlU3RyaW5nKCJsc2tkaiBzZGxramYgbGtzZCIpKSAjIC0+ICdsc2tkanNkbGtqZmxrc2Rkc2tsZmprbGRzamRrc2wnDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW1zZXEsIFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICBzZWxmICs9IGl0ZW1zZXENCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuX190b2tsaXN0LmV4dGVuZChpdGVtc2VxKQ0KDQogICAgZGVmIGNsZWFyKCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBDbGVhciBhbGwgZWxlbWVudHMgYW5kIHJlc3VsdHMgbmFtZXMuDQogICAgICAgICIiIg0KICAgICAgICBkZWwgc2VsZi5fX3Rva2xpc3RbOl0NCiAgICAgICAgc2VsZi5fX3Rva2RpY3QuY2xlYXIoKQ0KDQogICAgZGVmIF9fZ2V0YXR0cl9fKCBzZWxmLCBuYW1lICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzZWxmW25hbWVdDQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoNCiAgICAgICAgICAgIHJldHVybiAiIg0KICAgICAgICAgICAgDQogICAgICAgIGlmIG5hbWUgaW4gc2VsZi5fX3Rva2RpY3Q6DQogICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLl9fYWNjdW1OYW1lczoNCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2RpY3RbbmFtZV1bLTFdWzBdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVJlc3VsdHMoWyB2WzBdIGZvciB2IGluIHNlbGYuX190b2tkaWN0W25hbWVdIF0pDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gIiINCg0KICAgIGRlZiBfX2FkZF9fKCBzZWxmLCBvdGhlciApOg0KICAgICAgICByZXQgPSBzZWxmLmNvcHkoKQ0KICAgICAgICByZXQgKz0gb3RoZXINCiAgICAgICAgcmV0dXJuIHJldA0KDQogICAgZGVmIF9faWFkZF9fKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBvdGhlci5fX3Rva2RpY3Q6DQogICAgICAgICAgICBvZmZzZXQgPSBsZW4oc2VsZi5fX3Rva2xpc3QpDQogICAgICAgICAgICBhZGRvZmZzZXQgPSBsYW1iZGEgYTogb2Zmc2V0IGlmIGE8MCBlbHNlIGErb2Zmc2V0DQogICAgICAgICAgICBvdGhlcml0ZW1zID0gb3RoZXIuX190b2tkaWN0Lml0ZW1zKCkNCiAgICAgICAgICAgIG90aGVyZGljdGl0ZW1zID0gWyhrLCBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2WzBdLGFkZG9mZnNldCh2WzFdKSkgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGssdmxpc3QpIGluIG90aGVyaXRlbXMgZm9yIHYgaW4gdmxpc3RdDQogICAgICAgICAgICBmb3Igayx2IGluIG90aGVyZGljdGl0ZW1zOg0KICAgICAgICAgICAgICAgIHNlbGZba10gPSB2DQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2WzBdLFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgICAgIHZbMF0uX19wYXJlbnQgPSB3a3JlZihzZWxmKQ0KICAgICAgICAgICAgDQogICAgICAgIHNlbGYuX190b2tsaXN0ICs9IG90aGVyLl9fdG9rbGlzdA0KICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcy51cGRhdGUoIG90aGVyLl9fYWNjdW1OYW1lcyApDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIpOg0KICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLGludCkgYW5kIG90aGVyID09IDA6DQogICAgICAgICAgICAjIHVzZWZ1bCBmb3IgbWVyZ2luZyBtYW55IFBhcnNlUmVzdWx0cyB1c2luZyBzdW0oKSBidWlsdGluDQogICAgICAgICAgICByZXR1cm4gc2VsZi5jb3B5KCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgICMgdGhpcyBtYXkgcmFpc2UgYSBUeXBlRXJyb3IgLSBzbyBiZSBpdA0KICAgICAgICAgICAgcmV0dXJuIG90aGVyICsgc2VsZg0KICAgICAgICANCiAgICBkZWYgX19yZXByX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICIoJXMsICVzKSIgJSAoIHJlcHIoIHNlbGYuX190b2tsaXN0ICksIHJlcHIoIHNlbGYuX190b2tkaWN0ICkgKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICdbJyArICcsICcuam9pbihfdXN0cihpKSBpZiBpc2luc3RhbmNlKGksIFBhcnNlUmVzdWx0cykgZWxzZSByZXByKGkpIGZvciBpIGluIHNlbGYuX190b2tsaXN0KSArICddJw0KDQogICAgZGVmIF9hc1N0cmluZ0xpc3QoIHNlbGYsIHNlcD0nJyApOg0KICAgICAgICBvdXQgPSBbXQ0KICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLl9fdG9rbGlzdDoNCiAgICAgICAgICAgIGlmIG91dCBhbmQgc2VwOg0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoc2VwKQ0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSggaXRlbSwgUGFyc2VSZXN1bHRzICk6DQogICAgICAgICAgICAgICAgb3V0ICs9IGl0ZW0uX2FzU3RyaW5nTGlzdCgpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIF91c3RyKGl0ZW0pICkNCiAgICAgICAgcmV0dXJuIG91dA0KDQogICAgZGVmIGFzTGlzdCggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgUmV0dXJucyB0aGUgcGFyc2UgcmVzdWx0cyBhcyBhIG5lc3RlZCBsaXN0IG9mIG1hdGNoaW5nIHRva2VucywgYWxsIGNvbnZlcnRlZCB0byBzdHJpbmdzLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgcGF0dCA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpDQogICAgICAgICAgICByZXN1bHQgPSBwYXR0LnBhcnNlU3RyaW5nKCJzbGRraiBsc2RraiBzbGRraiIpDQogICAgICAgICAgICAjIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgcHJpbnRzIGluIHN0cmluZy1saWtlIGZvcm0sIGl0IGlzIGFjdHVhbGx5IGEgcHlwYXJzaW5nIFBhcnNlUmVzdWx0cw0KICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHQpLCByZXN1bHQpICMgLT4gPGNsYXNzICdweXBhcnNpbmcuUGFyc2VSZXN1bHRzJz4gWydzbGRraicsICdsc2RraicsICdzbGRraiddDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgVXNlIGFzTGlzdCgpIHRvIGNyZWF0ZSBhbiBhY3R1YWwgbGlzdA0KICAgICAgICAgICAgcmVzdWx0X2xpc3QgPSByZXN1bHQuYXNMaXN0KCkNCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0X2xpc3QpLCByZXN1bHRfbGlzdCkgIyAtPiA8Y2xhc3MgJ2xpc3QnPiBbJ3NsZGtqJywgJ2xzZGtqJywgJ3NsZGtqJ10NCiAgICAgICAgIiIiDQogICAgICAgIHJldHVybiBbcmVzLmFzTGlzdCgpIGlmIGlzaW5zdGFuY2UocmVzLFBhcnNlUmVzdWx0cykgZWxzZSByZXMgZm9yIHJlcyBpbiBzZWxmLl9fdG9rbGlzdF0NCg0KICAgIGRlZiBhc0RpY3QoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIFJldHVybnMgdGhlIG5hbWVkIHBhcnNlIHJlc3VsdHMgYXMgYSBuZXN0ZWQgZGljdGlvbmFyeS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygnMTIvMzEvMTk5OScpDQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdCksIHJlcHIocmVzdWx0KSkgIyAtPiA8Y2xhc3MgJ3B5cGFyc2luZy5QYXJzZVJlc3VsdHMnPiAoWycxMicsICcvJywgJzMxJywgJy8nLCAnMTk5OSddLCB7J2RheSc6IFsoJzE5OTknLCA0KV0sICd5ZWFyJzogWygnMTInLCAwKV0sICdtb250aCc6IFsoJzMxJywgMildfSkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmVzdWx0X2RpY3QgPSByZXN1bHQuYXNEaWN0KCkNCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0X2RpY3QpLCByZXByKHJlc3VsdF9kaWN0KSkgIyAtPiA8Y2xhc3MgJ2RpY3QnPiB7J2RheSc6ICcxOTk5JywgJ3llYXInOiAnMTInLCAnbW9udGgnOiAnMzEnfQ0KDQogICAgICAgICAgICAjIGV2ZW4gdGhvdWdoIGEgUGFyc2VSZXN1bHRzIHN1cHBvcnRzIGRpY3QtbGlrZSBhY2Nlc3MsIHNvbWV0aW1lIHlvdSBqdXN0IG5lZWQgdG8gaGF2ZSBhIGRpY3QNCiAgICAgICAgICAgIGltcG9ydCBqc29uDQogICAgICAgICAgICBwcmludChqc29uLmR1bXBzKHJlc3VsdCkpICMgLT4gRXhjZXB0aW9uOiBUeXBlRXJyb3I6IC4uLiBpcyBub3QgSlNPTiBzZXJpYWxpemFibGUNCiAgICAgICAgICAgIHByaW50KGpzb24uZHVtcHMocmVzdWx0LmFzRGljdCgpKSkgIyAtPiB7Im1vbnRoIjogIjMxIiwgImRheSI6ICIxOTk5IiwgInllYXIiOiAiMTIifQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgUFlfMzoNCiAgICAgICAgICAgIGl0ZW1fZm4gPSBzZWxmLml0ZW1zDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpdGVtX2ZuID0gc2VsZi5pdGVyaXRlbXMNCiAgICAgICAgICAgIA0KICAgICAgICBkZWYgdG9JdGVtKG9iaik6DQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICBpZiBvYmouaGFza2V5cygpOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqLmFzRGljdCgpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt0b0l0ZW0odikgZm9yIHYgaW4gb2JqXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXR1cm4gb2JqDQogICAgICAgICAgICAgICAgDQogICAgICAgIHJldHVybiBkaWN0KChrLHRvSXRlbSh2KSkgZm9yIGssdiBpbiBpdGVtX2ZuKCkpDQoNCiAgICBkZWYgY29weSggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgUmV0dXJucyBhIG5ldyBjb3B5IG9mIGEgQ3tQYXJzZVJlc3VsdHN9IG9iamVjdC4NCiAgICAgICAgIiIiDQogICAgICAgIHJldCA9IFBhcnNlUmVzdWx0cyggc2VsZi5fX3Rva2xpc3QgKQ0KICAgICAgICByZXQuX190b2tkaWN0ID0gc2VsZi5fX3Rva2RpY3QuY29weSgpDQogICAgICAgIHJldC5fX3BhcmVudCA9IHNlbGYuX19wYXJlbnQNCiAgICAgICAgcmV0Ll9fYWNjdW1OYW1lcy51cGRhdGUoIHNlbGYuX19hY2N1bU5hbWVzICkNCiAgICAgICAgcmV0Ll9fbmFtZSA9IHNlbGYuX19uYW1lDQogICAgICAgIHJldHVybiByZXQNCg0KICAgIGRlZiBhc1hNTCggc2VsZiwgZG9jdGFnPU5vbmUsIG5hbWVkSXRlbXNPbmx5PUZhbHNlLCBpbmRlbnQ9IiIsIGZvcm1hdHRlZD1UcnVlICk6DQogICAgICAgICIiIg0KICAgICAgICAoRGVwcmVjYXRlZCkgUmV0dXJucyB0aGUgcGFyc2UgcmVzdWx0cyBhcyBYTUwuIFRhZ3MgYXJlIGNyZWF0ZWQgZm9yIHRva2VucyBhbmQgbGlzdHMgdGhhdCBoYXZlIGRlZmluZWQgcmVzdWx0cyBuYW1lcy4NCiAgICAgICAgIiIiDQogICAgICAgIG5sID0gIlxuIg0KICAgICAgICBvdXQgPSBbXQ0KICAgICAgICBuYW1lZEl0ZW1zID0gZGljdCgodlsxXSxrKSBmb3IgKGssdmxpc3QpIGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB2IGluIHZsaXN0KQ0KICAgICAgICBuZXh0TGV2ZWxJbmRlbnQgPSBpbmRlbnQgKyAiICAiDQoNCiAgICAgICAgIyBjb2xsYXBzZSBvdXQgaW5kZW50cyBpZiBmb3JtYXR0aW5nIGlzIG5vdCBkZXNpcmVkDQogICAgICAgIGlmIG5vdCBmb3JtYXR0ZWQ6DQogICAgICAgICAgICBpbmRlbnQgPSAiIg0KICAgICAgICAgICAgbmV4dExldmVsSW5kZW50ID0gIiINCiAgICAgICAgICAgIG5sID0gIiINCg0KICAgICAgICBzZWxmVGFnID0gTm9uZQ0KICAgICAgICBpZiBkb2N0YWcgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmVGFnID0gZG9jdGFnDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBzZWxmLl9fbmFtZToNCiAgICAgICAgICAgICAgICBzZWxmVGFnID0gc2VsZi5fX25hbWUNCg0KICAgICAgICBpZiBub3Qgc2VsZlRhZzoNCiAgICAgICAgICAgIGlmIG5hbWVkSXRlbXNPbmx5Og0KICAgICAgICAgICAgICAgIHJldHVybiAiIg0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmVGFnID0gIklURU0iDQoNCiAgICAgICAgb3V0ICs9IFsgbmwsIGluZGVudCwgIjwiLCBzZWxmVGFnLCAiPiIgXQ0KDQogICAgICAgIGZvciBpLHJlcyBpbiBlbnVtZXJhdGUoc2VsZi5fX3Rva2xpc3QpOg0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXMsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICBpZiBpIGluIG5hbWVkSXRlbXM6DQogICAgICAgICAgICAgICAgICAgIG91dCArPSBbIHJlcy5hc1hNTChuYW1lZEl0ZW1zW2ldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkSXRlbXNPbmx5IGFuZCBkb2N0YWcgaXMgTm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGV2ZWxJbmRlbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkKV0NCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBvdXQgKz0gWyByZXMuYXNYTUwoTm9uZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lZEl0ZW1zT25seSBhbmQgZG9jdGFnIGlzIE5vbmUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExldmVsSW5kZW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCldDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgaW5kaXZpZHVhbCB0b2tlbiwgc2VlIGlmIHRoZXJlIGlzIGEgbmFtZSBmb3IgaXQNCiAgICAgICAgICAgICAgICByZXNUYWcgPSBOb25lDQogICAgICAgICAgICAgICAgaWYgaSBpbiBuYW1lZEl0ZW1zOg0KICAgICAgICAgICAgICAgICAgICByZXNUYWcgPSBuYW1lZEl0ZW1zW2ldDQogICAgICAgICAgICAgICAgaWYgbm90IHJlc1RhZzoNCiAgICAgICAgICAgICAgICAgICAgaWYgbmFtZWRJdGVtc09ubHk6DQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzVGFnID0gIklURU0iDQogICAgICAgICAgICAgICAgeG1sQm9keVRleHQgPSBfeG1sX2VzY2FwZShfdXN0cihyZXMpKQ0KICAgICAgICAgICAgICAgIG91dCArPSBbIG5sLCBuZXh0TGV2ZWxJbmRlbnQsICI8IiwgcmVzVGFnLCAiPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxCb2R5VGV4dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8LyIsIHJlc1RhZywgIj4iIF0NCg0KICAgICAgICBvdXQgKz0gWyBubCwgaW5kZW50LCAiPC8iLCBzZWxmVGFnLCAiPiIgXQ0KICAgICAgICByZXR1cm4gIiIuam9pbihvdXQpDQoNCiAgICBkZWYgX19sb29rdXAoc2VsZixzdWIpOg0KICAgICAgICBmb3Igayx2bGlzdCBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpOg0KICAgICAgICAgICAgZm9yIHYsbG9jIGluIHZsaXN0Og0KICAgICAgICAgICAgICAgIGlmIHN1YiBpcyB2Og0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gaw0KICAgICAgICByZXR1cm4gTm9uZQ0KDQogICAgZGVmIGdldE5hbWUoc2VsZik6DQogICAgICAgICIiIg0KICAgICAgICBSZXR1cm5zIHRoZSByZXN1bHRzIG5hbWUgZm9yIHRoaXMgdG9rZW4gZXhwcmVzc2lvbi4gVXNlZnVsIHdoZW4gc2V2ZXJhbCANCiAgICAgICAgZGlmZmVyZW50IGV4cHJlc3Npb25zIG1pZ2h0IG1hdGNoIGF0IGEgcGFydGljdWxhciBsb2NhdGlvbi4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBzc25fZXhwciA9IFJlZ2V4KHIiXGRcZFxkLVxkXGQtXGRcZFxkXGQiKQ0KICAgICAgICAgICAgaG91c2VfbnVtYmVyX2V4cHIgPSBTdXBwcmVzcygnIycpICsgV29yZChudW1zLCBhbHBoYW51bXMpDQogICAgICAgICAgICB1c2VyX2RhdGEgPSAoR3JvdXAoaG91c2VfbnVtYmVyX2V4cHIpKCJob3VzZV9udW1iZXIiKSANCiAgICAgICAgICAgICAgICAgICAgICAgIHwgR3JvdXAoc3NuX2V4cHIpKCJzc24iKQ0KICAgICAgICAgICAgICAgICAgICAgICAgfCBHcm91cChpbnRlZ2VyKSgiYWdlIikpDQogICAgICAgICAgICB1c2VyX2luZm8gPSBPbmVPck1vcmUodXNlcl9kYXRhKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXN1bHQgPSB1c2VyX2luZm8ucGFyc2VTdHJpbmcoIjIyIDExMS0yMi0zMzMzICMyMjFCIikNCiAgICAgICAgICAgIGZvciBpdGVtIGluIHJlc3VsdDoNCiAgICAgICAgICAgICAgICBwcmludChpdGVtLmdldE5hbWUoKSwgJzonLCBpdGVtWzBdKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgYWdlIDogMjINCiAgICAgICAgICAgIHNzbiA6IDExMS0yMi0zMzMzDQogICAgICAgICAgICBob3VzZV9udW1iZXIgOiAyMjFCDQogICAgICAgICIiIg0KICAgICAgICBpZiBzZWxmLl9fbmFtZToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fbmFtZQ0KICAgICAgICBlbGlmIHNlbGYuX19wYXJlbnQ6DQogICAgICAgICAgICBwYXIgPSBzZWxmLl9fcGFyZW50KCkNCiAgICAgICAgICAgIGlmIHBhcjoNCiAgICAgICAgICAgICAgICByZXR1cm4gcGFyLl9fbG9va3VwKHNlbGYpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIGVsaWYgKGxlbihzZWxmKSA9PSAxIGFuZA0KICAgICAgICAgICAgICAgbGVuKHNlbGYuX190b2tkaWN0KSA9PSAxIGFuZA0KICAgICAgICAgICAgICAgbmV4dChpdGVyKHNlbGYuX190b2tkaWN0LnZhbHVlcygpKSlbMF1bMV0gaW4gKDAsLTEpKToNCiAgICAgICAgICAgIHJldHVybiBuZXh0KGl0ZXIoc2VsZi5fX3Rva2RpY3Qua2V5cygpKSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBOb25lDQoNCiAgICBkZWYgZHVtcChzZWxmLCBpbmRlbnQ9JycsIGRlcHRoPTAsIGZ1bGw9VHJ1ZSk6DQogICAgICAgICIiIg0KICAgICAgICBEaWFnbm9zdGljIG1ldGhvZCBmb3IgbGlzdGluZyBvdXQgdGhlIGNvbnRlbnRzIG9mIGEgQ3tQYXJzZVJlc3VsdHN9Lg0KICAgICAgICBBY2NlcHRzIGFuIG9wdGlvbmFsIEN7aW5kZW50fSBhcmd1bWVudCBzbyB0aGF0IHRoaXMgc3RyaW5nIGNhbiBiZSBlbWJlZGRlZA0KICAgICAgICBpbiBhIG5lc3RlZCBkaXNwbGF5IG9mIG90aGVyIGRhdGEuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoJzEyLzMxLzE5OTknKQ0KICAgICAgICAgICAgcHJpbnQocmVzdWx0LmR1bXAoKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFsnMTInLCAnLycsICczMScsICcvJywgJzE5OTknXQ0KICAgICAgICAgICAgLSBkYXk6IDE5OTkNCiAgICAgICAgICAgIC0gbW9udGg6IDMxDQogICAgICAgICAgICAtIHllYXI6IDEyDQogICAgICAgICIiIg0KICAgICAgICBvdXQgPSBbXQ0KICAgICAgICBOTCA9ICdcbicNCiAgICAgICAgb3V0LmFwcGVuZCggaW5kZW50K191c3RyKHNlbGYuYXNMaXN0KCkpICkNCiAgICAgICAgaWYgZnVsbDoNCiAgICAgICAgICAgIGlmIHNlbGYuaGFza2V5cygpOg0KICAgICAgICAgICAgICAgIGl0ZW1zID0gc29ydGVkKChzdHIoayksIHYpIGZvciBrLHYgaW4gc2VsZi5pdGVtcygpKQ0KICAgICAgICAgICAgICAgIGZvciBrLHYgaW4gaXRlbXM6DQogICAgICAgICAgICAgICAgICAgIGlmIG91dDoNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoTkwpDQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoICIlcyVzLSAlczogIiAlIChpbmRlbnQsKCcgICcqZGVwdGgpLCBrKSApDQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodixQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgdjoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCB2LmR1bXAoaW5kZW50LGRlcHRoKzEpICkNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChfdXN0cih2KSkNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQocmVwcih2KSkNCiAgICAgICAgICAgIGVsaWYgYW55KGlzaW5zdGFuY2UodnYsUGFyc2VSZXN1bHRzKSBmb3IgdnYgaW4gc2VsZik6DQogICAgICAgICAgICAgICAgdiA9IHNlbGYNCiAgICAgICAgICAgICAgICBmb3IgaSx2diBpbiBlbnVtZXJhdGUodik6DQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodnYsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIlxuJXMlc1slZF06XG4lcyVzJXMiICUgKGluZGVudCwoJyAgJyooZGVwdGgpKSxpLGluZGVudCwoJyAgJyooZGVwdGgrMSkpLHZ2LmR1bXAoaW5kZW50LGRlcHRoKzEpICkpDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJcbiVzJXNbJWRdOlxuJXMlcyVzIiAlIChpbmRlbnQsKCcgICcqKGRlcHRoKSksaSxpbmRlbnQsKCcgICcqKGRlcHRoKzEpKSxfdXN0cih2dikpKQ0KICAgICAgICAgICAgDQogICAgICAgIHJldHVybiAiIi5qb2luKG91dCkNCg0KICAgIGRlZiBwcHJpbnQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToNCiAgICAgICAgIiIiDQogICAgICAgIFByZXR0eS1wcmludGVyIGZvciBwYXJzZWQgcmVzdWx0cyBhcyBhIGxpc3QsIHVzaW5nIHRoZSBDe3BwcmludH0gbW9kdWxlLg0KICAgICAgICBBY2NlcHRzIGFkZGl0aW9uYWwgcG9zaXRpb25hbCBvciBrZXl3b3JkIGFyZ3MgYXMgZGVmaW5lZCBmb3IgdGhlIA0KICAgICAgICBDe3BwcmludC5wcHJpbnR9IG1ldGhvZC4gKFV7aHR0cDovL2RvY3MucHl0aG9uLm9yZy8zL2xpYnJhcnkvcHByaW50Lmh0bWwjcHByaW50LnBwcmludH0pDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpZGVudCA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMpDQogICAgICAgICAgICBudW0gPSBXb3JkKG51bXMpDQogICAgICAgICAgICBmdW5jID0gRm9yd2FyZCgpDQogICAgICAgICAgICB0ZXJtID0gaWRlbnQgfCBudW0gfCBHcm91cCgnKCcgKyBmdW5jICsgJyknKQ0KICAgICAgICAgICAgZnVuYyA8PD0gaWRlbnQgKyBHcm91cChPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHRlcm0pKSkNCiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMucGFyc2VTdHJpbmcoImZuYSBhLGIsKGZuYiBjLGQsMjAwKSwxMDAiKQ0KICAgICAgICAgICAgcmVzdWx0LnBwcmludCh3aWR0aD00MCkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFsnZm5hJywNCiAgICAgICAgICAgICBbJ2EnLA0KICAgICAgICAgICAgICAnYicsDQogICAgICAgICAgICAgIFsnKCcsICdmbmInLCBbJ2MnLCAnZCcsICcyMDAnXSwgJyknXSwNCiAgICAgICAgICAgICAgJzEwMCddXQ0KICAgICAgICAiIiINCiAgICAgICAgcHByaW50LnBwcmludChzZWxmLmFzTGlzdCgpLCAqYXJncywgKiprd2FyZ3MpDQoNCiAgICAjIGFkZCBzdXBwb3J0IGZvciBwaWNrbGUgcHJvdG9jb2wNCiAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gKCBzZWxmLl9fdG9rbGlzdCwNCiAgICAgICAgICAgICAgICAgKCBzZWxmLl9fdG9rZGljdC5jb3B5KCksDQogICAgICAgICAgICAgICAgICAgc2VsZi5fX3BhcmVudCBpcyBub3QgTm9uZSBhbmQgc2VsZi5fX3BhcmVudCgpIG9yIE5vbmUsDQogICAgICAgICAgICAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMsDQogICAgICAgICAgICAgICAgICAgc2VsZi5fX25hbWUgKSApDQoNCiAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsc3RhdGUpOg0KICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IHN0YXRlWzBdDQogICAgICAgIChzZWxmLl9fdG9rZGljdCwNCiAgICAgICAgIHBhciwNCiAgICAgICAgIGluQWNjdW1OYW1lcywNCiAgICAgICAgIHNlbGYuX19uYW1lKSA9IHN0YXRlWzFdDQogICAgICAgIHNlbGYuX19hY2N1bU5hbWVzID0ge30NCiAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMudXBkYXRlKGluQWNjdW1OYW1lcykNCiAgICAgICAgaWYgcGFyIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5fX3BhcmVudCA9IHdrcmVmKHBhcikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuX19wYXJlbnQgPSBOb25lDQoNCiAgICBkZWYgX19nZXRuZXdhcmdzX18oc2VsZik6DQogICAgICAgIHJldHVybiBzZWxmLl9fdG9rbGlzdCwgc2VsZi5fX25hbWUsIHNlbGYuX19hc0xpc3QsIHNlbGYuX19tb2RhbA0KDQogICAgZGVmIF9fZGlyX18oc2VsZik6DQogICAgICAgIHJldHVybiAoZGlyKHR5cGUoc2VsZikpICsgbGlzdChzZWxmLmtleXMoKSkpDQoNCmNvbGxlY3Rpb25zLk11dGFibGVNYXBwaW5nLnJlZ2lzdGVyKFBhcnNlUmVzdWx0cykNCg0KZGVmIGNvbCAobG9jLHN0cmcpOg0KICAgICIiIlJldHVybnMgY3VycmVudCBjb2x1bW4gd2l0aGluIGEgc3RyaW5nLCBjb3VudGluZyBuZXdsaW5lcyBhcyBsaW5lIHNlcGFyYXRvcnMuDQogICBUaGUgZmlyc3QgY29sdW1uIGlzIG51bWJlciAxLg0KDQogICBOb3RlOiB0aGUgZGVmYXVsdCBwYXJzaW5nIGJlaGF2aW9yIGlzIHRvIGV4cGFuZCB0YWJzIGluIHRoZSBpbnB1dCBzdHJpbmcNCiAgIGJlZm9yZSBzdGFydGluZyB0aGUgcGFyc2luZyBwcm9jZXNzLiAgU2VlIEx7SXtQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nfTxQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24NCiAgIG9uIHBhcnNpbmcgc3RyaW5ncyBjb250YWluaW5nIEN7PFRBQj59cywgYW5kIHN1Z2dlc3RlZCBtZXRob2RzIHRvIG1haW50YWluIGENCiAgIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgcGFyc2VkIHN0cmluZywgdGhlIHBhcnNlIGxvY2F0aW9uLCBhbmQgbGluZSBhbmQgY29sdW1uDQogICBwb3NpdGlvbnMgd2l0aGluIHRoZSBwYXJzZWQgc3RyaW5nLg0KICAgIiIiDQogICAgcyA9IHN0cmcNCiAgICByZXR1cm4gMSBpZiAwPGxvYzxsZW4ocykgYW5kIHNbbG9jLTFdID09ICdcbicgZWxzZSBsb2MgLSBzLnJmaW5kKCJcbiIsIDAsIGxvYykNCg0KZGVmIGxpbmVubyhsb2Msc3RyZyk6DQogICAgIiIiUmV0dXJucyBjdXJyZW50IGxpbmUgbnVtYmVyIHdpdGhpbiBhIHN0cmluZywgY291bnRpbmcgbmV3bGluZXMgYXMgbGluZSBzZXBhcmF0b3JzLg0KICAgVGhlIGZpcnN0IGxpbmUgaXMgbnVtYmVyIDEuDQoNCiAgIE5vdGU6IHRoZSBkZWZhdWx0IHBhcnNpbmcgYmVoYXZpb3IgaXMgdG8gZXhwYW5kIHRhYnMgaW4gdGhlIGlucHV0IHN0cmluZw0KICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuICBTZWUgTHtJe1BhcnNlckVsZW1lbnQucGFyc2VTdHJpbmd9PFBhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbg0KICAgb24gcGFyc2luZyBzdHJpbmdzIGNvbnRhaW5pbmcgQ3s8VEFCPn1zLCBhbmQgc3VnZ2VzdGVkIG1ldGhvZHMgdG8gbWFpbnRhaW4gYQ0KICAgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBwYXJzZWQgc3RyaW5nLCB0aGUgcGFyc2UgbG9jYXRpb24sIGFuZCBsaW5lIGFuZCBjb2x1bW4NCiAgIHBvc2l0aW9ucyB3aXRoaW4gdGhlIHBhcnNlZCBzdHJpbmcuDQogICAiIiINCiAgICByZXR1cm4gc3RyZy5jb3VudCgiXG4iLDAsbG9jKSArIDENCg0KZGVmIGxpbmUoIGxvYywgc3RyZyApOg0KICAgICIiIlJldHVybnMgdGhlIGxpbmUgb2YgdGV4dCBjb250YWluaW5nIGxvYyB3aXRoaW4gYSBzdHJpbmcsIGNvdW50aW5nIG5ld2xpbmVzIGFzIGxpbmUgc2VwYXJhdG9ycy4NCiAgICAgICAiIiINCiAgICBsYXN0Q1IgPSBzdHJnLnJmaW5kKCJcbiIsIDAsIGxvYykNCiAgICBuZXh0Q1IgPSBzdHJnLmZpbmQoIlxuIiwgbG9jKQ0KICAgIGlmIG5leHRDUiA+PSAwOg0KICAgICAgICByZXR1cm4gc3RyZ1tsYXN0Q1IrMTpuZXh0Q1JdDQogICAgZWxzZToNCiAgICAgICAgcmV0dXJuIHN0cmdbbGFzdENSKzE6XQ0KDQpkZWYgX2RlZmF1bHRTdGFydERlYnVnQWN0aW9uKCBpbnN0cmluZywgbG9jLCBleHByICk6DQogICAgcHJpbnQgKCgiTWF0Y2ggIiArIF91c3RyKGV4cHIpICsgIiBhdCBsb2MgIiArIF91c3RyKGxvYykgKyAiKCVkLCVkKSIgJSAoIGxpbmVubyhsb2MsaW5zdHJpbmcpLCBjb2wobG9jLGluc3RyaW5nKSApKSkNCg0KZGVmIF9kZWZhdWx0U3VjY2Vzc0RlYnVnQWN0aW9uKCBpbnN0cmluZywgc3RhcnRsb2MsIGVuZGxvYywgZXhwciwgdG9rcyApOg0KICAgIHByaW50ICgiTWF0Y2hlZCAiICsgX3VzdHIoZXhwcikgKyAiIC0+ICIgKyBzdHIodG9rcy5hc0xpc3QoKSkpDQoNCmRlZiBfZGVmYXVsdEV4Y2VwdGlvbkRlYnVnQWN0aW9uKCBpbnN0cmluZywgbG9jLCBleHByLCBleGMgKToNCiAgICBwcmludCAoIkV4Y2VwdGlvbiByYWlzZWQ6IiArIF91c3RyKGV4YykpDQoNCmRlZiBudWxsRGVidWdBY3Rpb24oKmFyZ3MpOg0KICAgICIiIidEby1ub3RoaW5nJyBkZWJ1ZyBhY3Rpb24sIHRvIHN1cHByZXNzIGRlYnVnZ2luZyBvdXRwdXQgZHVyaW5nIHBhcnNpbmcuIiIiDQogICAgcGFzcw0KDQojIE9ubHkgd29ya3Mgb24gUHl0aG9uIDMueCAtIG5vbmxvY2FsIGlzIHRveGljIHRvIFB5dGhvbiAyIGluc3RhbGxzDQojfiAnZGVjb3JhdG9yIHRvIHRyaW0gZnVuY3Rpb24gY2FsbHMgdG8gbWF0Y2ggdGhlIGFyaXR5IG9mIHRoZSB0YXJnZXQnDQojfiBkZWYgX3RyaW1fYXJpdHkoZnVuYywgbWF4YXJncz0zKToNCiAgICAjfiBpZiBmdW5jIGluIHNpbmdsZUFyZ0J1aWx0aW5zOg0KICAgICAgICAjfiByZXR1cm4gbGFtYmRhIHMsbCx0OiBmdW5jKHQpDQogICAgI34gbGltaXQgPSAwDQogICAgI34gZm91bmRBcml0eSA9IEZhbHNlDQogICAgI34gZGVmIHdyYXBwZXIoKmFyZ3MpOg0KICAgICAgICAjfiBub25sb2NhbCBsaW1pdCxmb3VuZEFyaXR5DQogICAgICAgICN+IHdoaWxlIDE6DQogICAgICAgICAgICAjfiB0cnk6DQogICAgICAgICAgICAgICAgI34gcmV0ID0gZnVuYygqYXJnc1tsaW1pdDpdKQ0KICAgICAgICAgICAgICAgICN+IGZvdW5kQXJpdHkgPSBUcnVlDQogICAgICAgICAgICAgICAgI34gcmV0dXJuIHJldA0KICAgICAgICAgICAgI34gZXhjZXB0IFR5cGVFcnJvcjoNCiAgICAgICAgICAgICAgICAjfiBpZiBsaW1pdCA9PSBtYXhhcmdzIG9yIGZvdW5kQXJpdHk6DQogICAgICAgICAgICAgICAgICAgICN+IHJhaXNlDQogICAgICAgICAgICAgICAgI34gbGltaXQgKz0gMQ0KICAgICAgICAgICAgICAgICN+IGNvbnRpbnVlDQogICAgI34gcmV0dXJuIHdyYXBwZXINCg0KIyB0aGlzIHZlcnNpb24gaXMgUHl0aG9uIDIueC0zLnggY3Jvc3MtY29tcGF0aWJsZQ0KJ2RlY29yYXRvciB0byB0cmltIGZ1bmN0aW9uIGNhbGxzIHRvIG1hdGNoIHRoZSBhcml0eSBvZiB0aGUgdGFyZ2V0Jw0KZGVmIF90cmltX2FyaXR5KGZ1bmMsIG1heGFyZ3M9Mik6DQogICAgaWYgZnVuYyBpbiBzaW5nbGVBcmdCdWlsdGluczoNCiAgICAgICAgcmV0dXJuIGxhbWJkYSBzLGwsdDogZnVuYyh0KQ0KICAgIGxpbWl0ID0gWzBdDQogICAgZm91bmRBcml0eSA9IFtGYWxzZV0NCiAgICANCiAgICAjIHRyYWNlYmFjayByZXR1cm4gZGF0YSBzdHJ1Y3R1cmUgY2hhbmdlZCBpbiBQeTMuNSAtIG5vcm1hbGl6ZSBiYWNrIHRvIHBsYWluIHR1cGxlcw0KICAgIGlmIHN5c3RlbV92ZXJzaW9uWzoyXSA+PSAoMyw1KToNCiAgICAgICAgZGVmIGV4dHJhY3Rfc3RhY2sobGltaXQ9MCk6DQogICAgICAgICAgICAjIHNwZWNpYWwgaGFuZGxpbmcgZm9yIFB5dGhvbiAzLjUuMCAtIGV4dHJhIGRlZXAgY2FsbCBzdGFjayBieSAxDQogICAgICAgICAgICBvZmZzZXQgPSAtMyBpZiBzeXN0ZW1fdmVyc2lvbiA9PSAoMyw1LDApIGVsc2UgLTINCiAgICAgICAgICAgIGZyYW1lX3N1bW1hcnkgPSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjayhsaW1pdD0tb2Zmc2V0K2xpbWl0LTEpW29mZnNldF0NCiAgICAgICAgICAgIHJldHVybiBbKGZyYW1lX3N1bW1hcnkuZmlsZW5hbWUsIGZyYW1lX3N1bW1hcnkubGluZW5vKV0NCiAgICAgICAgZGVmIGV4dHJhY3RfdGIodGIsIGxpbWl0PTApOg0KICAgICAgICAgICAgZnJhbWVzID0gdHJhY2ViYWNrLmV4dHJhY3RfdGIodGIsIGxpbWl0PWxpbWl0KQ0KICAgICAgICAgICAgZnJhbWVfc3VtbWFyeSA9IGZyYW1lc1stMV0NCiAgICAgICAgICAgIHJldHVybiBbKGZyYW1lX3N1bW1hcnkuZmlsZW5hbWUsIGZyYW1lX3N1bW1hcnkubGluZW5vKV0NCiAgICBlbHNlOg0KICAgICAgICBleHRyYWN0X3N0YWNrID0gdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2sNCiAgICAgICAgZXh0cmFjdF90YiA9IHRyYWNlYmFjay5leHRyYWN0X3RiDQogICAgDQogICAgIyBzeW50aGVzaXplIHdoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkgdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2sgYXQgdGhlIGNhbGwgdG8gDQogICAgIyB1c2VyJ3MgcGFyc2UgYWN0aW9uICdmdW5jJywgc28gdGhhdCB3ZSBkb24ndCBpbmN1ciBjYWxsIHBlbmFsdHkgYXQgcGFyc2UgdGltZQ0KICAgIA0KICAgIExJTkVfRElGRiA9IDYNCiAgICAjIElGIEFOWSBDT0RFIENIQU5HRVMsIEVWRU4gSlVTVCBDT01NRU5UUyBPUiBCTEFOSyBMSU5FUywgQkVUV0VFTiBUSEUgTkVYVCBMSU5FIEFORCANCiAgICAjIFRIRSBDQUxMIFRPIEZVTkMgSU5TSURFIFdSQVBQRVIsIExJTkVfRElGRiBNVVNUIEJFIE1PRElGSUVEISEhIQ0KICAgIHRoaXNfbGluZSA9IGV4dHJhY3Rfc3RhY2sobGltaXQ9MilbLTFdDQogICAgcGFfY2FsbF9saW5lX3N5bnRoID0gKHRoaXNfbGluZVswXSwgdGhpc19saW5lWzFdK0xJTkVfRElGRikNCg0KICAgIGRlZiB3cmFwcGVyKCphcmdzKToNCiAgICAgICAgd2hpbGUgMToNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICByZXQgPSBmdW5jKCphcmdzW2xpbWl0WzBdOl0pDQogICAgICAgICAgICAgICAgZm91bmRBcml0eVswXSA9IFRydWUNCiAgICAgICAgICAgICAgICByZXR1cm4gcmV0DQogICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOg0KICAgICAgICAgICAgICAgICMgcmUtcmFpc2UgVHlwZUVycm9ycyBpZiB0aGV5IGRpZCBub3QgY29tZSBmcm9tIG91ciBhcml0eSB0ZXN0aW5nDQogICAgICAgICAgICAgICAgaWYgZm91bmRBcml0eVswXToNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgICAgICB0YiA9IHN5cy5leGNfaW5mbygpWy0xXQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGV4dHJhY3RfdGIodGIsIGxpbWl0PTIpWy0xXVs6Ml0gPT0gcGFfY2FsbF9saW5lX3N5bnRoOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICAgICAgICAgIGZpbmFsbHk6DQogICAgICAgICAgICAgICAgICAgICAgICBkZWwgdGINCg0KICAgICAgICAgICAgICAgIGlmIGxpbWl0WzBdIDw9IG1heGFyZ3M6DQogICAgICAgICAgICAgICAgICAgIGxpbWl0WzBdICs9IDENCiAgICAgICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgICAgICByYWlzZQ0KDQogICAgIyBjb3B5IGZ1bmMgbmFtZSB0byB3cmFwcGVyIGZvciBzZW5zaWJsZSBkZWJ1ZyBvdXRwdXQNCiAgICBmdW5jX25hbWUgPSAiPHBhcnNlIGFjdGlvbj4iDQogICAgdHJ5Og0KICAgICAgICBmdW5jX25hbWUgPSBnZXRhdHRyKGZ1bmMsICdfX25hbWVfXycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoZnVuYywgJ19fY2xhc3NfXycpLl9fbmFtZV9fKQ0KICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgIGZ1bmNfbmFtZSA9IHN0cihmdW5jKQ0KICAgIHdyYXBwZXIuX19uYW1lX18gPSBmdW5jX25hbWUNCg0KICAgIHJldHVybiB3cmFwcGVyDQoNCmNsYXNzIFBhcnNlckVsZW1lbnQob2JqZWN0KToNCiAgICAiIiJBYnN0cmFjdCBiYXNlIGxldmVsIHBhcnNlciBlbGVtZW50IGNsYXNzLiIiIg0KICAgIERFRkFVTFRfV0hJVEVfQ0hBUlMgPSAiIFxuXHRcciINCiAgICB2ZXJib3NlX3N0YWNrdHJhY2UgPSBGYWxzZQ0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBzZXREZWZhdWx0V2hpdGVzcGFjZUNoYXJzKCBjaGFycyApOg0KICAgICAgICByIiIiDQogICAgICAgIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCB3aGl0ZXNwYWNlIGNoYXJzDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIGRlZmF1bHQgd2hpdGVzcGFjZSBjaGFycyBhcmUgc3BhY2UsIDxUQUI+IGFuZCBuZXdsaW5lDQogICAgICAgICAgICBPbmVPck1vcmUoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygiYWJjIGRlZlxuZ2hpIGprbCIpICAjIC0+IFsnYWJjJywgJ2RlZicsICdnaGknLCAnamtsJ10NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyBjaGFuZ2UgdG8ganVzdCB0cmVhdCBuZXdsaW5lIGFzIHNpZ25pZmljYW50DQogICAgICAgICAgICBQYXJzZXJFbGVtZW50LnNldERlZmF1bHRXaGl0ZXNwYWNlQ2hhcnMoIiBcdCIpDQogICAgICAgICAgICBPbmVPck1vcmUoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygiYWJjIGRlZlxuZ2hpIGprbCIpICAjIC0+IFsnYWJjJywgJ2RlZiddDQogICAgICAgICIiIg0KICAgICAgICBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMgPSBjaGFycw0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBpbmxpbmVMaXRlcmFsc1VzaW5nKGNscyk6DQogICAgICAgICIiIg0KICAgICAgICBTZXQgY2xhc3MgdG8gYmUgdXNlZCBmb3IgaW5jbHVzaW9uIG9mIHN0cmluZyBsaXRlcmFscyBpbnRvIGEgcGFyc2VyLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIGRlZmF1bHQgbGl0ZXJhbCBjbGFzcyB1c2VkIGlzIExpdGVyYWwNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKSAgICAgICAgICAgDQoNCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddDQoNCg0KICAgICAgICAgICAgIyBjaGFuZ2UgdG8gU3VwcHJlc3MNCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuaW5saW5lTGl0ZXJhbHNVc2luZyhTdXBwcmVzcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpICAgICAgICAgICANCg0KICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbJzE5OTknLCAnMTInLCAnMzEnXQ0KICAgICAgICAiIiINCiAgICAgICAgUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzID0gY2xzDQoNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHNhdmVsaXN0PUZhbHNlICk6DQogICAgICAgIHNlbGYucGFyc2VBY3Rpb24gPSBsaXN0KCkNCiAgICAgICAgc2VsZi5mYWlsQWN0aW9uID0gTm9uZQ0KICAgICAgICAjfiBzZWxmLm5hbWUgPSAiPHVua25vd24+IiAgIyBkb24ndCBkZWZpbmUgc2VsZi5uYW1lLCBsZXQgc3ViY2xhc3NlcyB0cnkvZXhjZXB0IHVwY2FsbA0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIHNlbGYucmVzdWx0c05hbWUgPSBOb25lDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IHNhdmVsaXN0DQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBUcnVlDQogICAgICAgIHNlbGYud2hpdGVDaGFycyA9IFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUw0KICAgICAgICBzZWxmLmNvcHlEZWZhdWx0V2hpdGVDaGFycyA9IFRydWUNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlICMgdXNlZCB3aGVuIGNoZWNraW5nIGZvciBsZWZ0LXJlY3Vyc2lvbg0KICAgICAgICBzZWxmLmtlZXBUYWJzID0gRmFsc2UNCiAgICAgICAgc2VsZi5pZ25vcmVFeHBycyA9IGxpc3QoKQ0KICAgICAgICBzZWxmLmRlYnVnID0gRmFsc2UNCiAgICAgICAgc2VsZi5zdHJlYW1saW5lZCA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IFRydWUgIyB1c2VkIHRvIG9wdGltaXplIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3Igc3ViY2xhc3NlcyB0aGF0IGRvbid0IGFkdmFuY2UgcGFyc2UgaW5kZXgNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiIg0KICAgICAgICBzZWxmLm1vZGFsUmVzdWx0cyA9IFRydWUgIyB1c2VkIHRvIG1hcmsgcmVzdWx0cyBuYW1lcyBhcyBtb2RhbCAocmVwb3J0IG9ubHkgbGFzdCkgb3IgY3VtdWxhdGl2ZSAobGlzdCBhbGwpDQogICAgICAgIHNlbGYuZGVidWdBY3Rpb25zID0gKCBOb25lLCBOb25lLCBOb25lICkgI2N1c3RvbSBkZWJ1ZyBhY3Rpb25zDQogICAgICAgIHNlbGYucmUgPSBOb25lDQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gVHJ1ZSAjIHVzZWQgdG8gYXZvaWQgcmVkdW5kYW50IGNhbGxzIHRvIHByZVBhcnNlDQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IEZhbHNlDQoNCiAgICBkZWYgY29weSggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgTWFrZSBhIGNvcHkgb2YgdGhpcyBDe1BhcnNlckVsZW1lbnR9LiAgVXNlZnVsIGZvciBkZWZpbmluZyBkaWZmZXJlbnQgcGFyc2UgYWN0aW9ucw0KICAgICAgICBmb3IgdGhlIHNhbWUgcGFyc2luZyBwYXR0ZXJuLCB1c2luZyBjb3BpZXMgb2YgdGhlIG9yaWdpbmFsIHBhcnNlIGVsZW1lbnQuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpDQogICAgICAgICAgICBpbnRlZ2VySyA9IGludGVnZXIuY29weSgpLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdKjEwMjQpICsgU3VwcHJlc3MoIksiKQ0KICAgICAgICAgICAgaW50ZWdlck0gPSBpbnRlZ2VyLmNvcHkoKS5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSoxMDI0KjEwMjQpICsgU3VwcHJlc3MoIk0iKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoaW50ZWdlcksgfCBpbnRlZ2VyTSB8IGludGVnZXIpLnBhcnNlU3RyaW5nKCI1SyAxMDAgNjQwSyAyNTZNIikpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbNTEyMCwgMTAwLCA2NTUzNjAsIDI2ODQzNTQ1Nl0NCiAgICAgICAgRXF1aXZhbGVudCBmb3JtIG9mIEN7ZXhwci5jb3B5KCl9IGlzIGp1c3QgQ3tleHByKCl9OjoNCiAgICAgICAgICAgIGludGVnZXJNID0gaW50ZWdlcigpLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdKjEwMjQqMTAyNCkgKyBTdXBwcmVzcygiTSIpDQogICAgICAgICIiIg0KICAgICAgICBjcHkgPSBjb3B5LmNvcHkoIHNlbGYgKQ0KICAgICAgICBjcHkucGFyc2VBY3Rpb24gPSBzZWxmLnBhcnNlQWN0aW9uWzpdDQogICAgICAgIGNweS5pZ25vcmVFeHBycyA9IHNlbGYuaWdub3JlRXhwcnNbOl0NCiAgICAgICAgaWYgc2VsZi5jb3B5RGVmYXVsdFdoaXRlQ2hhcnM6DQogICAgICAgICAgICBjcHkud2hpdGVDaGFycyA9IFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUw0KICAgICAgICByZXR1cm4gY3B5DQoNCiAgICBkZWYgc2V0TmFtZSggc2VsZiwgbmFtZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRGVmaW5lIG5hbWUgZm9yIHRoaXMgZXhwcmVzc2lvbiwgbWFrZXMgZGVidWdnaW5nIGFuZCBleGNlcHRpb24gbWVzc2FnZXMgY2xlYXJlci4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgV29yZChudW1zKS5wYXJzZVN0cmluZygiQUJDIikgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBXOigwMTIzLi4uKSAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQogICAgICAgICAgICBXb3JkKG51bXMpLnNldE5hbWUoImludGVnZXIiKS5wYXJzZVN0cmluZygiQUJDIikgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBpbnRlZ2VyIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYubmFtZSA9IG5hbWUNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsImV4Y2VwdGlvbiIpOg0KICAgICAgICAgICAgc2VsZi5leGNlcHRpb24ubXNnID0gc2VsZi5lcnJtc2cNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXRSZXN1bHRzTmFtZSggc2VsZiwgbmFtZSwgbGlzdEFsbE1hdGNoZXM9RmFsc2UgKToNCiAgICAgICAgIiIiDQogICAgICAgIERlZmluZSBuYW1lIGZvciByZWZlcmVuY2luZyBtYXRjaGluZyB0b2tlbnMgYXMgYSBuZXN0ZWQgYXR0cmlidXRlDQogICAgICAgIG9mIHRoZSByZXR1cm5lZCBwYXJzZSByZXN1bHRzLg0KICAgICAgICBOT1RFOiB0aGlzIHJldHVybnMgYSAqY29weSogb2YgdGhlIG9yaWdpbmFsIEN7UGFyc2VyRWxlbWVudH0gb2JqZWN0Ow0KICAgICAgICB0aGlzIGlzIHNvIHRoYXQgdGhlIGNsaWVudCBjYW4gZGVmaW5lIGEgYmFzaWMgZWxlbWVudCwgc3VjaCBhcyBhbg0KICAgICAgICBpbnRlZ2VyLCBhbmQgcmVmZXJlbmNlIGl0IGluIG11bHRpcGxlIHBsYWNlcyB3aXRoIGRpZmZlcmVudCBuYW1lcy4NCg0KICAgICAgICBZb3UgY2FuIGFsc28gc2V0IHJlc3VsdHMgbmFtZXMgdXNpbmcgdGhlIGFiYnJldmlhdGVkIHN5bnRheCwNCiAgICAgICAgQ3tleHByKCJuYW1lIil9IGluIHBsYWNlIG9mIEN7ZXhwci5zZXRSZXN1bHRzTmFtZSgibmFtZSIpfSAtIA0KICAgICAgICBzZWUgTHtJe19fY2FsbF9ffTxfX2NhbGxfXz59Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZGF0ZV9zdHIgPSAoaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgieWVhciIpICsgJy8nIA0KICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJtb250aCIpICsgJy8nIA0KICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJkYXkiKSkNCg0KICAgICAgICAgICAgIyBlcXVpdmFsZW50IGZvcm06DQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQ0KICAgICAgICAiIiINCiAgICAgICAgbmV3c2VsZiA9IHNlbGYuY29weSgpDQogICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoIioiKToNCiAgICAgICAgICAgIG5hbWUgPSBuYW1lWzotMV0NCiAgICAgICAgICAgIGxpc3RBbGxNYXRjaGVzPVRydWUNCiAgICAgICAgbmV3c2VsZi5yZXN1bHRzTmFtZSA9IG5hbWUNCiAgICAgICAgbmV3c2VsZi5tb2RhbFJlc3VsdHMgPSBub3QgbGlzdEFsbE1hdGNoZXMNCiAgICAgICAgcmV0dXJuIG5ld3NlbGYNCg0KICAgIGRlZiBzZXRCcmVhayhzZWxmLGJyZWFrRmxhZyA9IFRydWUpOg0KICAgICAgICAiIiJNZXRob2QgdG8gaW52b2tlIHRoZSBQeXRob24gcGRiIGRlYnVnZ2VyIHdoZW4gdGhpcyBlbGVtZW50IGlzDQogICAgICAgICAgIGFib3V0IHRvIGJlIHBhcnNlZC4gU2V0IEN7YnJlYWtGbGFnfSB0byBUcnVlIHRvIGVuYWJsZSwgRmFsc2UgdG8NCiAgICAgICAgICAgZGlzYWJsZS4NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGJyZWFrRmxhZzoNCiAgICAgICAgICAgIF9wYXJzZU1ldGhvZCA9IHNlbGYuX3BhcnNlDQogICAgICAgICAgICBkZWYgYnJlYWtlcihpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSwgY2FsbFByZVBhcnNlPVRydWUpOg0KICAgICAgICAgICAgICAgIGltcG9ydCBwZGINCiAgICAgICAgICAgICAgICBwZGIuc2V0X3RyYWNlKCkNCiAgICAgICAgICAgICAgICByZXR1cm4gX3BhcnNlTWV0aG9kKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZSApDQogICAgICAgICAgICBicmVha2VyLl9vcmlnaW5hbFBhcnNlTWV0aG9kID0gX3BhcnNlTWV0aG9kDQogICAgICAgICAgICBzZWxmLl9wYXJzZSA9IGJyZWFrZXINCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5fcGFyc2UsIl9vcmlnaW5hbFBhcnNlTWV0aG9kIik6DQogICAgICAgICAgICAgICAgc2VsZi5fcGFyc2UgPSBzZWxmLl9wYXJzZS5fb3JpZ2luYWxQYXJzZU1ldGhvZA0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldFBhcnNlQWN0aW9uKCBzZWxmLCAqZm5zLCAqKmt3YXJncyApOg0KICAgICAgICAiIiINCiAgICAgICAgRGVmaW5lIGFjdGlvbiB0byBwZXJmb3JtIHdoZW4gc3VjY2Vzc2Z1bGx5IG1hdGNoaW5nIHBhcnNlIGVsZW1lbnQgZGVmaW5pdGlvbi4NCiAgICAgICAgUGFyc2UgYWN0aW9uIGZuIGlzIGEgY2FsbGFibGUgbWV0aG9kIHdpdGggMC0zIGFyZ3VtZW50cywgY2FsbGVkIGFzIEN7Zm4ocyxsb2MsdG9rcyl9LA0KICAgICAgICBDe2ZuKGxvYyx0b2tzKX0sIEN7Zm4odG9rcyl9LCBvciBqdXN0IEN7Zm4oKX0sIHdoZXJlOg0KICAgICAgICAgLSBzICAgPSB0aGUgb3JpZ2luYWwgc3RyaW5nIGJlaW5nIHBhcnNlZCAoc2VlIG5vdGUgYmVsb3cpDQogICAgICAgICAtIGxvYyA9IHRoZSBsb2NhdGlvbiBvZiB0aGUgbWF0Y2hpbmcgc3Vic3RyaW5nDQogICAgICAgICAtIHRva3MgPSBhIGxpc3Qgb2YgdGhlIG1hdGNoZWQgdG9rZW5zLCBwYWNrYWdlZCBhcyBhIEN7THtQYXJzZVJlc3VsdHN9fSBvYmplY3QNCiAgICAgICAgSWYgdGhlIGZ1bmN0aW9ucyBpbiBmbnMgbW9kaWZ5IHRoZSB0b2tlbnMsIHRoZXkgY2FuIHJldHVybiB0aGVtIGFzIHRoZSByZXR1cm4NCiAgICAgICAgdmFsdWUgZnJvbSBmbiwgYW5kIHRoZSBtb2RpZmllZCBsaXN0IG9mIHRva2VucyB3aWxsIHJlcGxhY2UgdGhlIG9yaWdpbmFsLg0KICAgICAgICBPdGhlcndpc2UsIGZuIGRvZXMgbm90IG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZS4NCg0KICAgICAgICBPcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50czoNCiAgICAgICAgIC0gY2FsbER1cmluZ1RyeSA9IChkZWZhdWx0PUN7RmFsc2V9KSBpbmRpY2F0ZSBpZiBwYXJzZSBhY3Rpb24gc2hvdWxkIGJlIHJ1biBkdXJpbmcgbG9va2FoZWFkcyBhbmQgYWx0ZXJuYXRlIHRlc3RpbmcNCg0KICAgICAgICBOb3RlOiB0aGUgZGVmYXVsdCBwYXJzaW5nIGJlaGF2aW9yIGlzIHRvIGV4cGFuZCB0YWJzIGluIHRoZSBpbnB1dCBzdHJpbmcNCiAgICAgICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuICBTZWUgTHtJe3BhcnNlU3RyaW5nfTxwYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uDQogICAgICAgIG9uIHBhcnNpbmcgc3RyaW5ncyBjb250YWluaW5nIEN7PFRBQj59cywgYW5kIHN1Z2dlc3RlZCBtZXRob2RzIHRvIG1haW50YWluIGENCiAgICAgICAgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBwYXJzZWQgc3RyaW5nLCB0aGUgcGFyc2UgbG9jYXRpb24sIGFuZCBsaW5lIGFuZCBjb2x1bW4NCiAgICAgICAgcG9zaXRpb25zIHdpdGhpbiB0aGUgcGFyc2VkIHN0cmluZy4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlciArICcvJyArIGludGVnZXIgKyAnLycgKyBpbnRlZ2VyDQoNCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddDQoNCiAgICAgICAgICAgICMgdXNlIHBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRvIGludHMgYXQgcGFyc2UgdGltZQ0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlciArICcvJyArIGludGVnZXIgKyAnLycgKyBpbnRlZ2VyDQoNCiAgICAgICAgICAgICMgbm90ZSB0aGF0IGludGVnZXIgZmllbGRzIGFyZSBub3cgaW50cywgbm90IHN0cmluZ3MNCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWzE5OTksICcvJywgMTIsICcvJywgMzFdDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLnBhcnNlQWN0aW9uID0gbGlzdChtYXAoX3RyaW1fYXJpdHksIGxpc3QoZm5zKSkpDQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IGt3YXJncy5nZXQoImNhbGxEdXJpbmdUcnkiLCBGYWxzZSkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBhZGRQYXJzZUFjdGlvbiggc2VsZiwgKmZucywgKiprd2FyZ3MgKToNCiAgICAgICAgIiIiDQogICAgICAgIEFkZCBwYXJzZSBhY3Rpb24gdG8gZXhwcmVzc2lvbidzIGxpc3Qgb2YgcGFyc2UgYWN0aW9ucy4gU2VlIEx7SXtzZXRQYXJzZUFjdGlvbn08c2V0UGFyc2VBY3Rpb24+fS4NCiAgICAgICAgDQogICAgICAgIFNlZSBleGFtcGxlcyBpbiBMe0l7Y29weX08Y29weT59Lg0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5wYXJzZUFjdGlvbiArPSBsaXN0KG1hcChfdHJpbV9hcml0eSwgbGlzdChmbnMpKSkNCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0gc2VsZi5jYWxsRHVyaW5nVHJ5IG9yIGt3YXJncy5nZXQoImNhbGxEdXJpbmdUcnkiLCBGYWxzZSkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBhZGRDb25kaXRpb24oc2VsZiwgKmZucywgKiprd2FyZ3MpOg0KICAgICAgICAiIiJBZGQgYSBib29sZWFuIHByZWRpY2F0ZSBmdW5jdGlvbiB0byBleHByZXNzaW9uJ3MgbGlzdCBvZiBwYXJzZSBhY3Rpb25zLiBTZWUgDQogICAgICAgIEx7SXtzZXRQYXJzZUFjdGlvbn08c2V0UGFyc2VBY3Rpb24+fSBmb3IgZnVuY3Rpb24gY2FsbCBzaWduYXR1cmVzLiBVbmxpa2UgQ3tzZXRQYXJzZUFjdGlvbn0sIA0KICAgICAgICBmdW5jdGlvbnMgcGFzc2VkIHRvIEN7YWRkQ29uZGl0aW9ufSBuZWVkIHRvIHJldHVybiBib29sZWFuIHN1Y2Nlc3MvZmFpbCBvZiB0aGUgY29uZGl0aW9uLg0KDQogICAgICAgIE9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzOg0KICAgICAgICAgLSBtZXNzYWdlID0gZGVmaW5lIGEgY3VzdG9tIG1lc3NhZ2UgdG8gYmUgdXNlZCBpbiB0aGUgcmFpc2VkIGV4Y2VwdGlvbg0KICAgICAgICAgLSBmYXRhbCAgID0gaWYgVHJ1ZSwgd2lsbCByYWlzZSBQYXJzZUZhdGFsRXhjZXB0aW9uIHRvIHN0b3AgcGFyc2luZyBpbW1lZGlhdGVseTsgb3RoZXJ3aXNlIHdpbGwgcmFpc2UgUGFyc2VFeGNlcHRpb24NCiAgICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpDQogICAgICAgICAgICB5ZWFyX2ludCA9IGludGVnZXIuY29weSgpDQogICAgICAgICAgICB5ZWFyX2ludC5hZGRDb25kaXRpb24obGFtYmRhIHRva3M6IHRva3NbMF0gPj0gMjAwMCwgbWVzc2FnZT0iT25seSBzdXBwb3J0IHllYXJzIDIwMDAgYW5kIGxhdGVyIikNCiAgICAgICAgICAgIGRhdGVfc3RyID0geWVhcl9pbnQgKyAnLycgKyBpbnRlZ2VyICsgJy8nICsgaW50ZWdlcg0KDQogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IEV4Y2VwdGlvbjogT25seSBzdXBwb3J0IHllYXJzIDIwMDAgYW5kIGxhdGVyIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCiAgICAgICAgIiIiDQogICAgICAgIG1zZyA9IGt3YXJncy5nZXQoIm1lc3NhZ2UiLCAiZmFpbGVkIHVzZXItZGVmaW5lZCBjb25kaXRpb24iKQ0KICAgICAgICBleGNfdHlwZSA9IFBhcnNlRmF0YWxFeGNlcHRpb24gaWYga3dhcmdzLmdldCgiZmF0YWwiLCBGYWxzZSkgZWxzZSBQYXJzZUV4Y2VwdGlvbg0KICAgICAgICBmb3IgZm4gaW4gZm5zOg0KICAgICAgICAgICAgZGVmIHBhKHMsbCx0KToNCiAgICAgICAgICAgICAgICBpZiBub3QgYm9vbChfdHJpbV9hcml0eShmbikocyxsLHQpKToNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXhjX3R5cGUocyxsLG1zZykNCiAgICAgICAgICAgIHNlbGYucGFyc2VBY3Rpb24uYXBwZW5kKHBhKQ0KICAgICAgICBzZWxmLmNhbGxEdXJpbmdUcnkgPSBzZWxmLmNhbGxEdXJpbmdUcnkgb3Iga3dhcmdzLmdldCgiY2FsbER1cmluZ1RyeSIsIEZhbHNlKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldEZhaWxBY3Rpb24oIHNlbGYsIGZuICk6DQogICAgICAgICIiIkRlZmluZSBhY3Rpb24gdG8gcGVyZm9ybSBpZiBwYXJzaW5nIGZhaWxzIGF0IHRoaXMgZXhwcmVzc2lvbi4NCiAgICAgICAgICAgRmFpbCBhY3RvbiBmbiBpcyBhIGNhbGxhYmxlIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIGFyZ3VtZW50cw0KICAgICAgICAgICBDe2ZuKHMsbG9jLGV4cHIsZXJyKX0gd2hlcmU6DQogICAgICAgICAgICAtIHMgPSBzdHJpbmcgYmVpbmcgcGFyc2VkDQogICAgICAgICAgICAtIGxvYyA9IGxvY2F0aW9uIHdoZXJlIGV4cHJlc3Npb24gbWF0Y2ggd2FzIGF0dGVtcHRlZCBhbmQgZmFpbGVkDQogICAgICAgICAgICAtIGV4cHIgPSB0aGUgcGFyc2UgZXhwcmVzc2lvbiB0aGF0IGZhaWxlZA0KICAgICAgICAgICAgLSBlcnIgPSB0aGUgZXhjZXB0aW9uIHRocm93bg0KICAgICAgICAgICBUaGUgZnVuY3Rpb24gcmV0dXJucyBubyB2YWx1ZS4gIEl0IG1heSB0aHJvdyBDe0x7UGFyc2VGYXRhbEV4Y2VwdGlvbn19DQogICAgICAgICAgIGlmIGl0IGlzIGRlc2lyZWQgdG8gc3RvcCBwYXJzaW5nIGltbWVkaWF0ZWx5LiIiIg0KICAgICAgICBzZWxmLmZhaWxBY3Rpb24gPSBmbg0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIF9za2lwSWdub3JhYmxlcyggc2VsZiwgaW5zdHJpbmcsIGxvYyApOg0KICAgICAgICBleHByc0ZvdW5kID0gVHJ1ZQ0KICAgICAgICB3aGlsZSBleHByc0ZvdW5kOg0KICAgICAgICAgICAgZXhwcnNGb3VuZCA9IEZhbHNlDQogICAgICAgICAgICBmb3IgZSBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgMToNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYyxkdW1teSA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJzRm91bmQgPSBUcnVlDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgICAgICBwYXNzDQogICAgICAgIHJldHVybiBsb2MNCg0KICAgIGRlZiBwcmVQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYyApOg0KICAgICAgICBpZiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgbG9jID0gc2VsZi5fc2tpcElnbm9yYWJsZXMoIGluc3RyaW5nLCBsb2MgKQ0KDQogICAgICAgIGlmIHNlbGYuc2tpcFdoaXRlc3BhY2U6DQogICAgICAgICAgICB3dCA9IHNlbGYud2hpdGVDaGFycw0KICAgICAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgICAgICB3aGlsZSBsb2MgPCBpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXSBpbiB3dDoNCiAgICAgICAgICAgICAgICBsb2MgKz0gMQ0KDQogICAgICAgIHJldHVybiBsb2MNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgcmV0dXJuIHRva2VubGlzdA0KDQogICAgI34gQHByb2ZpbGUNCiAgICBkZWYgX3BhcnNlTm9DYWNoZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUsIGNhbGxQcmVQYXJzZT1UcnVlICk6DQogICAgICAgIGRlYnVnZ2luZyA9ICggc2VsZi5kZWJ1ZyApICNhbmQgZG9BY3Rpb25zICkNCg0KICAgICAgICBpZiBkZWJ1Z2dpbmcgb3Igc2VsZi5mYWlsQWN0aW9uOg0KICAgICAgICAgICAgI34gcHJpbnQgKCJNYXRjaCIsc2VsZiwiYXQgbG9jIixsb2MsIiglZCwlZCkiICUgKCBsaW5lbm8obG9jLGluc3RyaW5nKSwgY29sKGxvYyxpbnN0cmluZykgKSkNCiAgICAgICAgICAgIGlmIChzZWxmLmRlYnVnQWN0aW9uc1swXSApOg0KICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzBdKCBpbnN0cmluZywgbG9jLCBzZWxmICkNCiAgICAgICAgICAgIGlmIGNhbGxQcmVQYXJzZSBhbmQgc2VsZi5jYWxsUHJlcGFyc2U6DQogICAgICAgICAgICAgICAgcHJlbG9jID0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHByZWxvYyA9IGxvYw0KICAgICAgICAgICAgdG9rZW5zU3RhcnQgPSBwcmVsb2MNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGxvYyx0b2tlbnMgPSBzZWxmLnBhcnNlSW1wbCggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsZW4oaW5zdHJpbmcpLCBzZWxmLmVycm1zZywgc2VsZiApDQogICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGVycjoNCiAgICAgICAgICAgICAgICAjfiBwcmludCAoIkV4Y2VwdGlvbiByYWlzZWQ6IiwgZXJyKQ0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWdBY3Rpb25zWzJdOg0KICAgICAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1syXSggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBzZWxmLCBlcnIgKQ0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZmFpbEFjdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsQWN0aW9uKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHNlbGYsIGVyciApDQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIGNhbGxQcmVQYXJzZSBhbmQgc2VsZi5jYWxsUHJlcGFyc2U6DQogICAgICAgICAgICAgICAgcHJlbG9jID0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHByZWxvYyA9IGxvYw0KICAgICAgICAgICAgdG9rZW5zU3RhcnQgPSBwcmVsb2MNCiAgICAgICAgICAgIGlmIHNlbGYubWF5SW5kZXhFcnJvciBvciBsb2MgPj0gbGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIGxvYyx0b2tlbnMgPSBzZWxmLnBhcnNlSW1wbCggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsZW4oaW5zdHJpbmcpLCBzZWxmLmVycm1zZywgc2VsZiApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGxvYyx0b2tlbnMgPSBzZWxmLnBhcnNlSW1wbCggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkNCg0KICAgICAgICB0b2tlbnMgPSBzZWxmLnBvc3RQYXJzZSggaW5zdHJpbmcsIGxvYywgdG9rZW5zICkNCg0KICAgICAgICByZXRUb2tlbnMgPSBQYXJzZVJlc3VsdHMoIHRva2Vucywgc2VsZi5yZXN1bHRzTmFtZSwgYXNMaXN0PXNlbGYuc2F2ZUFzTGlzdCwgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMgKQ0KICAgICAgICBpZiBzZWxmLnBhcnNlQWN0aW9uIGFuZCAoZG9BY3Rpb25zIG9yIHNlbGYuY2FsbER1cmluZ1RyeSk6DQogICAgICAgICAgICBpZiBkZWJ1Z2dpbmc6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBmb3IgZm4gaW4gc2VsZi5wYXJzZUFjdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyA9IGZuKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHJldFRva2VucyApDQogICAgICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbnMgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW5zID0gUGFyc2VSZXN1bHRzKCB0b2tlbnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdHNOYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNMaXN0PXNlbGYuc2F2ZUFzTGlzdCBhbmQgaXNpbnN0YW5jZSh0b2tlbnMsKFBhcnNlUmVzdWx0cyxsaXN0KSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cyApDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBlcnI6DQogICAgICAgICAgICAgICAgICAgICN+IHByaW50ICJFeGNlcHRpb24gcmFpc2VkIGluIHVzZXIgcGFyc2UgYWN0aW9uOiIsIGVycg0KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5kZWJ1Z0FjdGlvbnNbMl0gKToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzJdKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHNlbGYsIGVyciApDQogICAgICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGZvciBmbiBpbiBzZWxmLnBhcnNlQWN0aW9uOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBmbiggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCByZXRUb2tlbnMgKQ0KICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbnMgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgICAgICByZXRUb2tlbnMgPSBQYXJzZVJlc3VsdHMoIHRva2VucywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHRzTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNMaXN0PXNlbGYuc2F2ZUFzTGlzdCBhbmQgaXNpbnN0YW5jZSh0b2tlbnMsKFBhcnNlUmVzdWx0cyxsaXN0KSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzICkNCg0KICAgICAgICBpZiBkZWJ1Z2dpbmc6DQogICAgICAgICAgICAjfiBwcmludCAoIk1hdGNoZWQiLHNlbGYsIi0+IixyZXRUb2tlbnMuYXNMaXN0KCkpDQogICAgICAgICAgICBpZiAoc2VsZi5kZWJ1Z0FjdGlvbnNbMV0gKToNCiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1sxXSggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBsb2MsIHNlbGYsIHJldFRva2VucyApDQoNCiAgICAgICAgcmV0dXJuIGxvYywgcmV0VG9rZW5zDQoNCiAgICBkZWYgdHJ5UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9RmFsc2UgKVswXQ0KICAgICAgICBleGNlcHQgUGFyc2VGYXRhbEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICANCiAgICBkZWYgY2FuUGFyc2VOZXh0KHNlbGYsIGluc3RyaW5nLCBsb2MpOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLnRyeVBhcnNlKGluc3RyaW5nLCBsb2MpDQogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sIEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgcmV0dXJuIEZhbHNlDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gVHJ1ZQ0KDQogICAgY2xhc3MgX1VuYm91bmRlZENhY2hlKG9iamVjdCk6DQogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToNCiAgICAgICAgICAgIGNhY2hlID0ge30NCiAgICAgICAgICAgIHNlbGYubm90X2luX2NhY2hlID0gbm90X2luX2NhY2hlID0gb2JqZWN0KCkNCg0KICAgICAgICAgICAgZGVmIGdldChzZWxmLCBrZXkpOg0KICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5LCBub3RfaW5fY2FjaGUpDQoNCiAgICAgICAgICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6DQogICAgICAgICAgICAgICAgY2FjaGVba2V5XSA9IHZhbHVlDQoNCiAgICAgICAgICAgIGRlZiBjbGVhcihzZWxmKToNCiAgICAgICAgICAgICAgICBjYWNoZS5jbGVhcigpDQoNCiAgICAgICAgICAgIHNlbGYuZ2V0ID0gdHlwZXMuTWV0aG9kVHlwZShnZXQsIHNlbGYpDQogICAgICAgICAgICBzZWxmLnNldCA9IHR5cGVzLk1ldGhvZFR5cGUoc2V0LCBzZWxmKQ0KICAgICAgICAgICAgc2VsZi5jbGVhciA9IHR5cGVzLk1ldGhvZFR5cGUoY2xlYXIsIHNlbGYpDQoNCiAgICBpZiBfT3JkZXJlZERpY3QgaXMgbm90IE5vbmU6DQogICAgICAgIGNsYXNzIF9GaWZvQ2FjaGUob2JqZWN0KToNCiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXplKToNCiAgICAgICAgICAgICAgICBzZWxmLm5vdF9pbl9jYWNoZSA9IG5vdF9pbl9jYWNoZSA9IG9iamVjdCgpDQoNCiAgICAgICAgICAgICAgICBjYWNoZSA9IF9PcmRlcmVkRGljdCgpDQoNCiAgICAgICAgICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSk6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5LCBub3RfaW5fY2FjaGUpDQoNCiAgICAgICAgICAgICAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZVtrZXldID0gdmFsdWUNCiAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGNhY2hlKSA+IHNpemU6DQogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5wb3BpdGVtKEZhbHNlKQ0KDQogICAgICAgICAgICAgICAgZGVmIGNsZWFyKHNlbGYpOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZS5jbGVhcigpDQoNCiAgICAgICAgICAgICAgICBzZWxmLmdldCA9IHR5cGVzLk1ldGhvZFR5cGUoZ2V0LCBzZWxmKQ0KICAgICAgICAgICAgICAgIHNlbGYuc2V0ID0gdHlwZXMuTWV0aG9kVHlwZShzZXQsIHNlbGYpDQogICAgICAgICAgICAgICAgc2VsZi5jbGVhciA9IHR5cGVzLk1ldGhvZFR5cGUoY2xlYXIsIHNlbGYpDQoNCiAgICBlbHNlOg0KICAgICAgICBjbGFzcyBfRmlmb0NhY2hlKG9iamVjdCk6DQogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc2l6ZSk6DQogICAgICAgICAgICAgICAgc2VsZi5ub3RfaW5fY2FjaGUgPSBub3RfaW5fY2FjaGUgPSBvYmplY3QoKQ0KDQogICAgICAgICAgICAgICAgY2FjaGUgPSB7fQ0KICAgICAgICAgICAgICAgIGtleV9maWZvID0gY29sbGVjdGlvbnMuZGVxdWUoW10sIHNpemUpDQoNCiAgICAgICAgICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSk6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5LCBub3RfaW5fY2FjaGUpDQoNCiAgICAgICAgICAgICAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZVtrZXldID0gdmFsdWUNCiAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGNhY2hlKSA+IHNpemU6DQogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5wb3Aoa2V5X2ZpZm8ucG9wbGVmdCgpLCBOb25lKQ0KICAgICAgICAgICAgICAgICAgICBrZXlfZmlmby5hcHBlbmQoa2V5KQ0KDQogICAgICAgICAgICAgICAgZGVmIGNsZWFyKHNlbGYpOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZS5jbGVhcigpDQogICAgICAgICAgICAgICAgICAgIGtleV9maWZvLmNsZWFyKCkNCg0KICAgICAgICAgICAgICAgIHNlbGYuZ2V0ID0gdHlwZXMuTWV0aG9kVHlwZShnZXQsIHNlbGYpDQogICAgICAgICAgICAgICAgc2VsZi5zZXQgPSB0eXBlcy5NZXRob2RUeXBlKHNldCwgc2VsZikNCiAgICAgICAgICAgICAgICBzZWxmLmNsZWFyID0gdHlwZXMuTWV0aG9kVHlwZShjbGVhciwgc2VsZikNCg0KICAgICMgYXJndW1lbnQgY2FjaGUgZm9yIG9wdGltaXppbmcgcmVwZWF0ZWQgY2FsbHMgd2hlbiBiYWNrdHJhY2tpbmcgdGhyb3VnaCByZWN1cnNpdmUgZXhwcmVzc2lvbnMNCiAgICBwYWNrcmF0X2NhY2hlID0ge30gIyB0aGlzIGlzIHNldCBsYXRlciBieSBlbmFibGVkUGFja3JhdCgpOyB0aGlzIGlzIGhlcmUgc28gdGhhdCByZXNldENhY2hlKCkgZG9lc24ndCBmYWlsDQogICAgcGFja3JhdF9jYWNoZV9sb2NrID0gUkxvY2soKQ0KICAgIHBhY2tyYXRfY2FjaGVfc3RhdHMgPSBbMCwgMF0NCg0KICAgICMgdGhpcyBtZXRob2QgZ2V0cyByZXBlYXRlZGx5IGNhbGxlZCBkdXJpbmcgYmFja3RyYWNraW5nIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzIC0NCiAgICAjIHdlIGNhbiBjYWNoZSB0aGVzZSBhcmd1bWVudHMgYW5kIHNhdmUgb3Vyc2VsdmVzIHRoZSB0cm91YmxlIG9mIHJlLXBhcnNpbmcgdGhlIGNvbnRhaW5lZCBleHByZXNzaW9uDQogICAgZGVmIF9wYXJzZUNhY2hlKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSwgY2FsbFByZVBhcnNlPVRydWUgKToNCiAgICAgICAgSElULCBNSVNTID0gMCwgMQ0KICAgICAgICBsb29rdXAgPSAoc2VsZiwgaW5zdHJpbmcsIGxvYywgY2FsbFByZVBhcnNlLCBkb0FjdGlvbnMpDQogICAgICAgIHdpdGggUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX2xvY2s6DQogICAgICAgICAgICBjYWNoZSA9IFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZQ0KICAgICAgICAgICAgdmFsdWUgPSBjYWNoZS5nZXQobG9va3VwKQ0KICAgICAgICAgICAgaWYgdmFsdWUgaXMgY2FjaGUubm90X2luX2NhY2hlOg0KICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0c1tNSVNTXSArPSAxDQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX3BhcnNlTm9DYWNoZShpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZSkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIHBlOg0KICAgICAgICAgICAgICAgICAgICAjIGNhY2hlIGEgY29weSBvZiB0aGUgZXhjZXB0aW9uLCB3aXRob3V0IHRoZSB0cmFjZWJhY2sNCiAgICAgICAgICAgICAgICAgICAgY2FjaGUuc2V0KGxvb2t1cCwgcGUuX19jbGFzc19fKCpwZS5hcmdzKSkNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBjYWNoZS5zZXQobG9va3VwLCAodmFsdWVbMF0sIHZhbHVlWzFdLmNvcHkoKSkpDQogICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHNbSElUXSArPSAxDQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgRXhjZXB0aW9uKToNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgdmFsdWUNCiAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlWzBdLCB2YWx1ZVsxXS5jb3B5KCkpDQoNCiAgICBfcGFyc2UgPSBfcGFyc2VOb0NhY2hlDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIHJlc2V0Q2FjaGUoKToNCiAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlLmNsZWFyKCkNCiAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzWzpdID0gWzBdICogbGVuKFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0cykNCg0KICAgIF9wYWNrcmF0RW5hYmxlZCA9IEZhbHNlDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBlbmFibGVQYWNrcmF0KGNhY2hlX3NpemVfbGltaXQ9MTI4KToNCiAgICAgICAgIiIiRW5hYmxlcyAicGFja3JhdCIgcGFyc2luZywgd2hpY2ggYWRkcyBtZW1vaXppbmcgdG8gdGhlIHBhcnNpbmcgbG9naWMuDQogICAgICAgICAgIFJlcGVhdGVkIHBhcnNlIGF0dGVtcHRzIGF0IHRoZSBzYW1lIHN0cmluZyBsb2NhdGlvbiAod2hpY2ggaGFwcGVucw0KICAgICAgICAgICBvZnRlbiBpbiBtYW55IGNvbXBsZXggZ3JhbW1hcnMpIGNhbiBpbW1lZGlhdGVseSByZXR1cm4gYSBjYWNoZWQgdmFsdWUsDQogICAgICAgICAgIGluc3RlYWQgb2YgcmUtZXhlY3V0aW5nIHBhcnNpbmcvdmFsaWRhdGluZyBjb2RlLiAgTWVtb2l6aW5nIGlzIGRvbmUgb2YNCiAgICAgICAgICAgYm90aCB2YWxpZCByZXN1bHRzIGFuZCBwYXJzaW5nIGV4Y2VwdGlvbnMuDQogICAgICAgICAgIA0KICAgICAgICAgICBQYXJhbWV0ZXJzOg0KICAgICAgICAgICAgLSBjYWNoZV9zaXplX2xpbWl0IC0gKGRlZmF1bHQ9Q3sxMjh9KSAtIGlmIGFuIGludGVnZXIgdmFsdWUgaXMgcHJvdmlkZWQNCiAgICAgICAgICAgICAgd2lsbCBsaW1pdCB0aGUgc2l6ZSBvZiB0aGUgcGFja3JhdCBjYWNoZTsgaWYgTm9uZSBpcyBwYXNzZWQsIHRoZW4NCiAgICAgICAgICAgICAgdGhlIGNhY2hlIHNpemUgd2lsbCBiZSB1bmJvdW5kZWQ7IGlmIDAgaXMgcGFzc2VkLCB0aGUgY2FjaGUgd2lsbA0KICAgICAgICAgICAgICBiZSBlZmZlY3RpdmVseSBkaXNhYmxlZC4NCiAgICAgICAgICAgIA0KICAgICAgICAgICBUaGlzIHNwZWVkdXAgbWF5IGJyZWFrIGV4aXN0aW5nIHByb2dyYW1zIHRoYXQgdXNlIHBhcnNlIGFjdGlvbnMgdGhhdA0KICAgICAgICAgICBoYXZlIHNpZGUtZWZmZWN0cy4gIEZvciB0aGlzIHJlYXNvbiwgcGFja3JhdCBwYXJzaW5nIGlzIGRpc2FibGVkIHdoZW4NCiAgICAgICAgICAgeW91IGZpcnN0IGltcG9ydCBweXBhcnNpbmcuICBUbyBhY3RpdmF0ZSB0aGUgcGFja3JhdCBmZWF0dXJlLCB5b3VyDQogICAgICAgICAgIHByb2dyYW0gbXVzdCBjYWxsIHRoZSBjbGFzcyBtZXRob2QgQ3tQYXJzZXJFbGVtZW50LmVuYWJsZVBhY2tyYXQoKX0uICBJZg0KICAgICAgICAgICB5b3VyIHByb2dyYW0gdXNlcyBDe3BzeWNvfSB0byAiY29tcGlsZSBhcyB5b3UgZ28iLCB5b3UgbXVzdCBjYWxsDQogICAgICAgICAgIEN7ZW5hYmxlUGFja3JhdH0gYmVmb3JlIGNhbGxpbmcgQ3twc3ljby5mdWxsKCl9LiAgSWYgeW91IGRvIG5vdCBkbyB0aGlzLA0KICAgICAgICAgICBQeXRob24gd2lsbCBjcmFzaC4gIEZvciBiZXN0IHJlc3VsdHMsIGNhbGwgQ3tlbmFibGVQYWNrcmF0KCl9IGltbWVkaWF0ZWx5DQogICAgICAgICAgIGFmdGVyIGltcG9ydGluZyBweXBhcnNpbmcuDQogICAgICAgICAgIA0KICAgICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICAgIGltcG9ydCBweXBhcnNpbmcNCiAgICAgICAgICAgICAgIHB5cGFyc2luZy5QYXJzZXJFbGVtZW50LmVuYWJsZVBhY2tyYXQoKQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgbm90IFBhcnNlckVsZW1lbnQuX3BhY2tyYXRFbmFibGVkOg0KICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5fcGFja3JhdEVuYWJsZWQgPSBUcnVlDQogICAgICAgICAgICBpZiBjYWNoZV9zaXplX2xpbWl0IGlzIE5vbmU6DQogICAgICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlID0gUGFyc2VyRWxlbWVudC5fVW5ib3VuZGVkQ2FjaGUoKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUgPSBQYXJzZXJFbGVtZW50Ll9GaWZvQ2FjaGUoY2FjaGVfc2l6ZV9saW1pdCkNCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuX3BhcnNlID0gUGFyc2VyRWxlbWVudC5fcGFyc2VDYWNoZQ0KDQogICAgZGVmIHBhcnNlU3RyaW5nKCBzZWxmLCBpbnN0cmluZywgcGFyc2VBbGw9RmFsc2UgKToNCiAgICAgICAgIiIiDQogICAgICAgIEV4ZWN1dGUgdGhlIHBhcnNlIGV4cHJlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLg0KICAgICAgICBUaGlzIGlzIHRoZSBtYWluIGludGVyZmFjZSB0byB0aGUgY2xpZW50IGNvZGUsIG9uY2UgdGhlIGNvbXBsZXRlDQogICAgICAgIGV4cHJlc3Npb24gaGFzIGJlZW4gYnVpbHQuDQoNCiAgICAgICAgSWYgeW91IHdhbnQgdGhlIGdyYW1tYXIgdG8gcmVxdWlyZSB0aGF0IHRoZSBlbnRpcmUgaW5wdXQgc3RyaW5nIGJlDQogICAgICAgIHN1Y2Nlc3NmdWxseSBwYXJzZWQsIHRoZW4gc2V0IEN7cGFyc2VBbGx9IHRvIFRydWUgKGVxdWl2YWxlbnQgdG8gZW5kaW5nDQogICAgICAgIHRoZSBncmFtbWFyIHdpdGggQ3tMe1N0cmluZ0VuZCgpfX0pLg0KDQogICAgICAgIE5vdGU6IEN7cGFyc2VTdHJpbmd9IGltcGxpY2l0bHkgY2FsbHMgQ3tleHBhbmR0YWJzKCl9IG9uIHRoZSBpbnB1dCBzdHJpbmcsDQogICAgICAgIGluIG9yZGVyIHRvIHJlcG9ydCBwcm9wZXIgY29sdW1uIG51bWJlcnMgaW4gcGFyc2UgYWN0aW9ucy4NCiAgICAgICAgSWYgdGhlIGlucHV0IHN0cmluZyBjb250YWlucyB0YWJzIGFuZA0KICAgICAgICB0aGUgZ3JhbW1hciB1c2VzIHBhcnNlIGFjdGlvbnMgdGhhdCB1c2UgdGhlIEN7bG9jfSBhcmd1bWVudCB0byBpbmRleCBpbnRvIHRoZQ0KICAgICAgICBzdHJpbmcgYmVpbmcgcGFyc2VkLCB5b3UgY2FuIGVuc3VyZSB5b3UgaGF2ZSBhIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgaW5wdXQNCiAgICAgICAgc3RyaW5nIGJ5Og0KICAgICAgICAgLSBjYWxsaW5nIEN7cGFyc2VXaXRoVGFic30gb24geW91ciBncmFtbWFyIGJlZm9yZSBjYWxsaW5nIEN7cGFyc2VTdHJpbmd9DQogICAgICAgICAgIChzZWUgTHtJe3BhcnNlV2l0aFRhYnN9PHBhcnNlV2l0aFRhYnM+fSkNCiAgICAgICAgIC0gZGVmaW5lIHlvdXIgcGFyc2UgYWN0aW9uIHVzaW5nIHRoZSBmdWxsIEN7KHMsbG9jLHRva3MpfSBzaWduYXR1cmUsIGFuZA0KICAgICAgICAgICByZWZlcmVuY2UgdGhlIGlucHV0IHN0cmluZyB1c2luZyB0aGUgcGFyc2UgYWN0aW9uJ3MgQ3tzfSBhcmd1bWVudA0KICAgICAgICAgLSBleHBsaWN0bHkgZXhwYW5kIHRoZSB0YWJzIGluIHlvdXIgaW5wdXQgc3RyaW5nIGJlZm9yZSBjYWxsaW5nDQogICAgICAgICAgIEN7cGFyc2VTdHJpbmd9DQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIFdvcmQoJ2EnKS5wYXJzZVN0cmluZygnYWFhYWFiYWFhJykgICMgLT4gWydhYWFhYSddDQogICAgICAgICAgICBXb3JkKCdhJykucGFyc2VTdHJpbmcoJ2FhYWFhYmFhYScsIHBhcnNlQWxsPVRydWUpICAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgZW5kIG9mIHRleHQNCiAgICAgICAgIiIiDQogICAgICAgIFBhcnNlckVsZW1lbnQucmVzZXRDYWNoZSgpDQogICAgICAgIGlmIG5vdCBzZWxmLnN0cmVhbWxpbmVkOg0KICAgICAgICAgICAgc2VsZi5zdHJlYW1saW5lKCkNCiAgICAgICAgICAgICN+IHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgIGUuc3RyZWFtbGluZSgpDQogICAgICAgIGlmIG5vdCBzZWxmLmtlZXBUYWJzOg0KICAgICAgICAgICAgaW5zdHJpbmcgPSBpbnN0cmluZy5leHBhbmR0YWJzKCkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgbG9jLCB0b2tlbnMgPSBzZWxmLl9wYXJzZSggaW5zdHJpbmcsIDAgKQ0KICAgICAgICAgICAgaWYgcGFyc2VBbGw6DQogICAgICAgICAgICAgICAgbG9jID0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICAgICAgc2UgPSBFbXB0eSgpICsgU3RyaW5nRW5kKCkNCiAgICAgICAgICAgICAgICBzZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOg0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlDQogICAgICAgICAgICAgICAgcmFpc2UgZXhjDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gdG9rZW5zDQoNCiAgICBkZWYgc2NhblN0cmluZyggc2VsZiwgaW5zdHJpbmcsIG1heE1hdGNoZXM9X01BWF9JTlQsIG92ZXJsYXA9RmFsc2UgKToNCiAgICAgICAgIiIiDQogICAgICAgIFNjYW4gdGhlIGlucHV0IHN0cmluZyBmb3IgZXhwcmVzc2lvbiBtYXRjaGVzLiAgRWFjaCBtYXRjaCB3aWxsIHJldHVybiB0aGUNCiAgICAgICAgbWF0Y2hpbmcgdG9rZW5zLCBzdGFydCBsb2NhdGlvbiwgYW5kIGVuZCBsb2NhdGlvbi4gIE1heSBiZSBjYWxsZWQgd2l0aCBvcHRpb25hbA0KICAgICAgICBDe21heE1hdGNoZXN9IGFyZ3VtZW50LCB0byBjbGlwIHNjYW5uaW5nIGFmdGVyICduJyBtYXRjaGVzIGFyZSBmb3VuZC4gIElmDQogICAgICAgIEN7b3ZlcmxhcH0gaXMgc3BlY2lmaWVkLCB0aGVuIG92ZXJsYXBwaW5nIG1hdGNoZXMgd2lsbCBiZSByZXBvcnRlZC4NCg0KICAgICAgICBOb3RlIHRoYXQgdGhlIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb25zIGFyZSByZXBvcnRlZCByZWxhdGl2ZSB0byB0aGUgc3RyaW5nDQogICAgICAgIGJlaW5nIHBhcnNlZC4gIFNlZSBMe0l7cGFyc2VTdHJpbmd9PHBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcGFyc2luZw0KICAgICAgICBzdHJpbmdzIHdpdGggZW1iZWRkZWQgdGFicy4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHNvdXJjZSA9ICJzbGRqZjEyM2xzZGpqa2YzNDVzbGRramY4Nzlsa2pzZmQ5ODciDQogICAgICAgICAgICBwcmludChzb3VyY2UpDQogICAgICAgICAgICBmb3IgdG9rZW5zLHN0YXJ0LGVuZCBpbiBXb3JkKGFscGhhcykuc2NhblN0cmluZyhzb3VyY2UpOg0KICAgICAgICAgICAgICAgIHByaW50KCcgJypzdGFydCArICdeJyooZW5kLXN0YXJ0KSkNCiAgICAgICAgICAgICAgICBwcmludCgnICcqc3RhcnQgKyB0b2tlbnNbMF0pDQogICAgICAgIA0KICAgICAgICBwcmludHM6Og0KICAgICAgICANCiAgICAgICAgICAgIHNsZGpmMTIzbHNkamprZjM0NXNsZGtqZjg3OWxranNmZDk4Nw0KICAgICAgICAgICAgXl5eXl4NCiAgICAgICAgICAgIHNsZGpmDQogICAgICAgICAgICAgICAgICAgIF5eXl5eXl4NCiAgICAgICAgICAgICAgICAgICAgbHNkamprZg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGRramYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGtqc2ZkDQogICAgICAgICIiIg0KICAgICAgICBpZiBub3Qgc2VsZi5zdHJlYW1saW5lZDoNCiAgICAgICAgICAgIHNlbGYuc3RyZWFtbGluZSgpDQogICAgICAgIGZvciBlIGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICBlLnN0cmVhbWxpbmUoKQ0KDQogICAgICAgIGlmIG5vdCBzZWxmLmtlZXBUYWJzOg0KICAgICAgICAgICAgaW5zdHJpbmcgPSBfdXN0cihpbnN0cmluZykuZXhwYW5kdGFicygpDQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICBsb2MgPSAwDQogICAgICAgIHByZXBhcnNlRm4gPSBzZWxmLnByZVBhcnNlDQogICAgICAgIHBhcnNlRm4gPSBzZWxmLl9wYXJzZQ0KICAgICAgICBQYXJzZXJFbGVtZW50LnJlc2V0Q2FjaGUoKQ0KICAgICAgICBtYXRjaGVzID0gMA0KICAgICAgICB0cnk6DQogICAgICAgICAgICB3aGlsZSBsb2MgPD0gaW5zdHJsZW4gYW5kIG1hdGNoZXMgPCBtYXhNYXRjaGVzOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgcHJlbG9jID0gcHJlcGFyc2VGbiggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICAgICAgICAgIG5leHRMb2MsdG9rZW5zID0gcGFyc2VGbiggaW5zdHJpbmcsIHByZWxvYywgY2FsbFByZVBhcnNlPUZhbHNlICkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgIGxvYyA9IHByZWxvYysxDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgaWYgbmV4dExvYyA+IGxvYzoNCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgKz0gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdG9rZW5zLCBwcmVsb2MsIG5leHRMb2MNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG92ZXJsYXA6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dGxvYyA9IHByZXBhcnNlRm4oIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5leHRsb2MgPiBsb2M6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYyA9IG5leHRMb2MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MgKz0gMQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MgPSBuZXh0TG9jDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBsb2MgPSBwcmVsb2MrMQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOg0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlDQogICAgICAgICAgICAgICAgcmFpc2UgZXhjDQoNCiAgICBkZWYgdHJhbnNmb3JtU3RyaW5nKCBzZWxmLCBpbnN0cmluZyApOg0KICAgICAgICAiIiINCiAgICAgICAgRXh0ZW5zaW9uIHRvIEN7THtzY2FuU3RyaW5nfX0sIHRvIG1vZGlmeSBtYXRjaGluZyB0ZXh0IHdpdGggbW9kaWZpZWQgdG9rZW5zIHRoYXQgbWF5DQogICAgICAgIGJlIHJldHVybmVkIGZyb20gYSBwYXJzZSBhY3Rpb24uICBUbyB1c2UgQ3t0cmFuc2Zvcm1TdHJpbmd9LCBkZWZpbmUgYSBncmFtbWFyIGFuZA0KICAgICAgICBhdHRhY2ggYSBwYXJzZSBhY3Rpb24gdG8gaXQgdGhhdCBtb2RpZmllcyB0aGUgcmV0dXJuZWQgdG9rZW4gbGlzdC4NCiAgICAgICAgSW52b2tpbmcgQ3t0cmFuc2Zvcm1TdHJpbmcoKX0gb24gYSB0YXJnZXQgc3RyaW5nIHdpbGwgdGhlbiBzY2FuIGZvciBtYXRjaGVzLA0KICAgICAgICBhbmQgcmVwbGFjZSB0aGUgbWF0Y2hlZCB0ZXh0IHBhdHRlcm5zIGFjY29yZGluZyB0byB0aGUgbG9naWMgaW4gdGhlIHBhcnNlDQogICAgICAgIGFjdGlvbi4gIEN7dHJhbnNmb3JtU3RyaW5nKCl9IHJldHVybnMgdGhlIHJlc3VsdGluZyB0cmFuc2Zvcm1lZCBzdHJpbmcuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHdkID0gV29yZChhbHBoYXMpDQogICAgICAgICAgICB3ZC5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXS50aXRsZSgpKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBwcmludCh3ZC50cmFuc2Zvcm1TdHJpbmcoIm5vdyBpcyB0aGUgd2ludGVyIG9mIG91ciBkaXNjb250ZW50IG1hZGUgZ2xvcmlvdXMgc3VtbWVyIGJ5IHRoaXMgc3VuIG9mIHlvcmsuIikpDQogICAgICAgIFByaW50czo6DQogICAgICAgICAgICBOb3cgSXMgVGhlIFdpbnRlciBPZiBPdXIgRGlzY29udGVudCBNYWRlIEdsb3Jpb3VzIFN1bW1lciBCeSBUaGlzIFN1biBPZiBZb3JrLg0KICAgICAgICAiIiINCiAgICAgICAgb3V0ID0gW10NCiAgICAgICAgbGFzdEUgPSAwDQogICAgICAgICMgZm9yY2UgcHJlc2VydmF0aW9uIG9mIDxUQUI+cywgdG8gbWluaW1pemUgdW53YW50ZWQgdHJhbnNmb3JtYXRpb24gb2Ygc3RyaW5nLCBhbmQgdG8NCiAgICAgICAgIyBrZWVwIHN0cmluZyBsb2NzIHN0cmFpZ2h0IGJldHdlZW4gdHJhbnNmb3JtU3RyaW5nIGFuZCBzY2FuU3RyaW5nDQogICAgICAgIHNlbGYua2VlcFRhYnMgPSBUcnVlDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGZvciB0LHMsZSBpbiBzZWxmLnNjYW5TdHJpbmcoIGluc3RyaW5nICk6DQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggaW5zdHJpbmdbbGFzdEU6c10gKQ0KICAgICAgICAgICAgICAgIGlmIHQ6DQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodCxQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHQuYXNMaXN0KCkNCiAgICAgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHQsbGlzdCk6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gdA0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCh0KQ0KICAgICAgICAgICAgICAgIGxhc3RFID0gZQ0KICAgICAgICAgICAgb3V0LmFwcGVuZChpbnN0cmluZ1tsYXN0RTpdKQ0KICAgICAgICAgICAgb3V0ID0gW28gZm9yIG8gaW4gb3V0IGlmIG9dDQogICAgICAgICAgICByZXR1cm4gIiIuam9pbihtYXAoX3VzdHIsX2ZsYXR0ZW4ob3V0KSkpDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6DQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UNCiAgICAgICAgICAgICAgICByYWlzZSBleGMNCg0KICAgIGRlZiBzZWFyY2hTdHJpbmcoIHNlbGYsIGluc3RyaW5nLCBtYXhNYXRjaGVzPV9NQVhfSU5UICk6DQogICAgICAgICIiIg0KICAgICAgICBBbm90aGVyIGV4dGVuc2lvbiB0byBDe0x7c2NhblN0cmluZ319LCBzaW1wbGlmeWluZyB0aGUgYWNjZXNzIHRvIHRoZSB0b2tlbnMgZm91bmQNCiAgICAgICAgdG8gbWF0Y2ggdGhlIGdpdmVuIHBhcnNlIGV4cHJlc3Npb24uICBNYXkgYmUgY2FsbGVkIHdpdGggb3B0aW9uYWwNCiAgICAgICAgQ3ttYXhNYXRjaGVzfSBhcmd1bWVudCwgdG8gY2xpcCBzZWFyY2hpbmcgYWZ0ZXIgJ24nIG1hdGNoZXMgYXJlIGZvdW5kLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIGEgY2FwaXRhbGl6ZWQgd29yZCBzdGFydHMgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyLCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgbG93ZXJjYXNlIGxldHRlcnMNCiAgICAgICAgICAgIGNhcF93b3JkID0gV29yZChhbHBoYXMudXBwZXIoKSwgYWxwaGFzLmxvd2VyKCkpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW50KGNhcF93b3JkLnNlYXJjaFN0cmluZygiTW9yZSB0aGFuIElyb24sIG1vcmUgdGhhbiBMZWFkLCBtb3JlIHRoYW4gR29sZCBJIG5lZWQgRWxlY3RyaWNpdHkiKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFsnTW9yZScsICdJcm9uJywgJ0xlYWQnLCAnR29sZCcsICdJJ10NCiAgICAgICAgIiIiDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBQYXJzZVJlc3VsdHMoWyB0IGZvciB0LHMsZSBpbiBzZWxmLnNjYW5TdHJpbmcoIGluc3RyaW5nLCBtYXhNYXRjaGVzICkgXSkNCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQ0KICAgICAgICAgICAgICAgIHJhaXNlIGV4Yw0KDQogICAgZGVmIHNwbGl0KHNlbGYsIGluc3RyaW5nLCBtYXhzcGxpdD1fTUFYX0lOVCwgaW5jbHVkZVNlcGFyYXRvcnM9RmFsc2UpOg0KICAgICAgICAiIiINCiAgICAgICAgR2VuZXJhdG9yIG1ldGhvZCB0byBzcGxpdCBhIHN0cmluZyB1c2luZyB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhcyBhIHNlcGFyYXRvci4NCiAgICAgICAgTWF5IGJlIGNhbGxlZCB3aXRoIG9wdGlvbmFsIEN7bWF4c3BsaXR9IGFyZ3VtZW50LCB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIHNwbGl0czsNCiAgICAgICAgYW5kIHRoZSBvcHRpb25hbCBDe2luY2x1ZGVTZXBhcmF0b3JzfSBhcmd1bWVudCAoZGVmYXVsdD1De0ZhbHNlfSksIGlmIHRoZSBzZXBhcmF0aW5nDQogICAgICAgIG1hdGNoaW5nIHRleHQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBzcGxpdCByZXN1bHRzLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6ICAgICAgICANCiAgICAgICAgICAgIHB1bmMgPSBvbmVPZihsaXN0KCIuLDs6Ly0hPyIpKQ0KICAgICAgICAgICAgcHJpbnQobGlzdChwdW5jLnNwbGl0KCJUaGlzLCB0aGlzPywgdGhpcyBzZW50ZW5jZSwgaXMgYmFkbHkgcHVuY3R1YXRlZCEiKSkpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbJ1RoaXMnLCAnIHRoaXMnLCAnJywgJyB0aGlzIHNlbnRlbmNlJywgJyBpcyBiYWRseSBwdW5jdHVhdGVkJywgJyddDQogICAgICAgICIiIg0KICAgICAgICBzcGxpdHMgPSAwDQogICAgICAgIGxhc3QgPSAwDQogICAgICAgIGZvciB0LHMsZSBpbiBzZWxmLnNjYW5TdHJpbmcoaW5zdHJpbmcsIG1heE1hdGNoZXM9bWF4c3BsaXQpOg0KICAgICAgICAgICAgeWllbGQgaW5zdHJpbmdbbGFzdDpzXQ0KICAgICAgICAgICAgaWYgaW5jbHVkZVNlcGFyYXRvcnM6DQogICAgICAgICAgICAgICAgeWllbGQgdFswXQ0KICAgICAgICAgICAgbGFzdCA9IGUNCiAgICAgICAgeWllbGQgaW5zdHJpbmdbbGFzdDpdDQoNCiAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgKyBvcGVyYXRvciAtIHJldHVybnMgQ3tMe0FuZH19LiBBZGRpbmcgc3RyaW5ncyB0byBhIFBhcnNlckVsZW1lbnQNCiAgICAgICAgY29udmVydHMgdGhlbSB0byBMe0xpdGVyYWx9cyBieSBkZWZhdWx0Lg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBncmVldCA9IFdvcmQoYWxwaGFzKSArICIsIiArIFdvcmQoYWxwaGFzKSArICIhIg0KICAgICAgICAgICAgaGVsbG8gPSAiSGVsbG8sIFdvcmxkISINCiAgICAgICAgICAgIHByaW50IChoZWxsbywgIi0+IiwgZ3JlZXQucGFyc2VTdHJpbmcoaGVsbG8pKQ0KICAgICAgICBQcmludHM6Og0KICAgICAgICAgICAgSGVsbG8sIFdvcmxkISAtPiBbJ0hlbGxvJywgJywnLCAnV29ybGQnLCAnISddDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gQW5kKCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fcmFkZF9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiArIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBvdGhlciArIHNlbGYNCg0KICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIC0gb3BlcmF0b3IsIHJldHVybnMgQ3tMe0FuZH19IHdpdGggZXJyb3Igc3RvcA0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIEFuZCggWyBzZWxmLCBBbmQuX0Vycm9yU3RvcCgpLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3JzdWJfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgLSBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gb3RoZXIgLSBzZWxmDQoNCiAgICBkZWYgX19tdWxfXyhzZWxmLG90aGVyKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICogb3BlcmF0b3IsIGFsbG93cyB1c2Ugb2YgQ3tleHByICogM30gaW4gcGxhY2Ugb2YNCiAgICAgICAgQ3tleHByICsgZXhwciArIGV4cHJ9LiAgRXhwcmVzc2lvbnMgbWF5IGFsc28gbWUgbXVsdGlwbGllZCBieSBhIDItaW50ZWdlcg0KICAgICAgICB0dXBsZSwgc2ltaWxhciB0byBDe3ttaW4sbWF4fX0gbXVsdGlwbGllcnMgaW4gcmVndWxhciBleHByZXNzaW9ucy4gIFR1cGxlcw0KICAgICAgICBtYXkgYWxzbyBpbmNsdWRlIEN7Tm9uZX0gYXMgaW46DQogICAgICAgICAtIEN7ZXhwcioobixOb25lKX0gb3IgQ3tleHByKihuLCl9IGlzIGVxdWl2YWxlbnQNCiAgICAgICAgICAgICAgdG8gQ3tleHByKm4gKyBMe1plcm9Pck1vcmV9KGV4cHIpfQ0KICAgICAgICAgICAgICAocmVhZCBhcyAiYXQgbGVhc3QgbiBpbnN0YW5jZXMgb2YgQ3tleHByfSIpDQogICAgICAgICAtIEN7ZXhwciooTm9uZSxuKX0gaXMgZXF1aXZhbGVudCB0byBDe2V4cHIqKDAsbil9DQogICAgICAgICAgICAgIChyZWFkIGFzICIwIHRvIG4gaW5zdGFuY2VzIG9mIEN7ZXhwcn0iKQ0KICAgICAgICAgLSBDe2V4cHIqKE5vbmUsTm9uZSl9IGlzIGVxdWl2YWxlbnQgdG8gQ3tMe1plcm9Pck1vcmV9KGV4cHIpfQ0KICAgICAgICAgLSBDe2V4cHIqKDEsTm9uZSl9IGlzIGVxdWl2YWxlbnQgdG8gQ3tMe09uZU9yTW9yZX0oZXhwcil9DQoNCiAgICAgICAgTm90ZSB0aGF0IEN7ZXhwciooTm9uZSxuKX0gZG9lcyBub3QgcmFpc2UgYW4gZXhjZXB0aW9uIGlmDQogICAgICAgIG1vcmUgdGhhbiBuIGV4cHJzIGV4aXN0IGluIHRoZSBpbnB1dCBzdHJlYW07IHRoYXQgaXMsDQogICAgICAgIEN7ZXhwciooTm9uZSxuKX0gZG9lcyBub3QgZW5mb3JjZSBhIG1heGltdW0gbnVtYmVyIG9mIGV4cHINCiAgICAgICAgb2NjdXJyZW5jZXMuICBJZiB0aGlzIGJlaGF2aW9yIGlzIGRlc2lyZWQsIHRoZW4gd3JpdGUNCiAgICAgICAgQ3tleHByKihOb25lLG4pICsgfmV4cHJ9DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLGludCk6DQogICAgICAgICAgICBtaW5FbGVtZW50cywgb3B0RWxlbWVudHMgPSBvdGhlciwwDQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlcix0dXBsZSk6DQogICAgICAgICAgICBvdGhlciA9IChvdGhlciArIChOb25lLCBOb25lKSlbOjJdDQogICAgICAgICAgICBpZiBvdGhlclswXSBpcyBOb25lOg0KICAgICAgICAgICAgICAgIG90aGVyID0gKDAsIG90aGVyWzFdKQ0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlclswXSxpbnQpIGFuZCBvdGhlclsxXSBpcyBOb25lOg0KICAgICAgICAgICAgICAgIGlmIG90aGVyWzBdID09IDA6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBaZXJvT3JNb3JlKHNlbGYpDQogICAgICAgICAgICAgICAgaWYgb3RoZXJbMF0gPT0gMToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9uZU9yTW9yZShzZWxmKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmKm90aGVyWzBdICsgWmVyb09yTW9yZShzZWxmKQ0KICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyWzBdLGludCkgYW5kIGlzaW5zdGFuY2Uob3RoZXJbMV0saW50KToNCiAgICAgICAgICAgICAgICBtaW5FbGVtZW50cywgb3B0RWxlbWVudHMgPSBvdGhlcg0KICAgICAgICAgICAgICAgIG9wdEVsZW1lbnRzIC09IG1pbkVsZW1lbnRzDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY2Fubm90IG11bHRpcGx5ICdQYXJzZXJFbGVtZW50JyBhbmQgKCclcycsJyVzJykgb2JqZWN0cyIsIHR5cGUob3RoZXJbMF0pLHR5cGUob3RoZXJbMV0pKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgJ1BhcnNlckVsZW1lbnQnIGFuZCAnJXMnIG9iamVjdHMiLCB0eXBlKG90aGVyKSkNCg0KICAgICAgICBpZiBtaW5FbGVtZW50cyA8IDA6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgUGFyc2VyRWxlbWVudCBieSBuZWdhdGl2ZSB2YWx1ZSIpDQogICAgICAgIGlmIG9wdEVsZW1lbnRzIDwgMDoNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInNlY29uZCB0dXBsZSB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gZmlyc3QgdHVwbGUgdmFsdWUiKQ0KICAgICAgICBpZiBtaW5FbGVtZW50cyA9PSBvcHRFbGVtZW50cyA9PSAwOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IG11bHRpcGx5IFBhcnNlckVsZW1lbnQgYnkgMCBvciAoMCwwKSIpDQoNCiAgICAgICAgaWYgKG9wdEVsZW1lbnRzKToNCiAgICAgICAgICAgIGRlZiBtYWtlT3B0aW9uYWxMaXN0KG4pOg0KICAgICAgICAgICAgICAgIGlmIG4+MToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsKHNlbGYgKyBtYWtlT3B0aW9uYWxMaXN0KG4tMSkpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsKHNlbGYpDQogICAgICAgICAgICBpZiBtaW5FbGVtZW50czoNCiAgICAgICAgICAgICAgICBpZiBtaW5FbGVtZW50cyA9PSAxOg0KICAgICAgICAgICAgICAgICAgICByZXQgPSBzZWxmICsgbWFrZU9wdGlvbmFsTGlzdChvcHRFbGVtZW50cykNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICByZXQgPSBBbmQoW3NlbGZdKm1pbkVsZW1lbnRzKSArIG1ha2VPcHRpb25hbExpc3Qob3B0RWxlbWVudHMpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldCA9IG1ha2VPcHRpb25hbExpc3Qob3B0RWxlbWVudHMpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBtaW5FbGVtZW50cyA9PSAxOg0KICAgICAgICAgICAgICAgIHJldCA9IHNlbGYNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0ID0gQW5kKFtzZWxmXSptaW5FbGVtZW50cykNCiAgICAgICAgcmV0dXJuIHJldA0KDQogICAgZGVmIF9fcm11bF9fKHNlbGYsIG90aGVyKToNCiAgICAgICAgcmV0dXJuIHNlbGYuX19tdWxfXyhvdGhlcikNCg0KICAgIGRlZiBfX29yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIHwgb3BlcmF0b3IgLSByZXR1cm5zIEN7THtNYXRjaEZpcnN0fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBNYXRjaEZpcnN0KCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fcm9yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIHwgb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIG90aGVyIHwgc2VsZg0KDQogICAgZGVmIF9feG9yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIF4gb3BlcmF0b3IgLSByZXR1cm5zIEN7THtPcn19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gT3IoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19yeG9yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIF4gb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIG90aGVyIF4gc2VsZg0KDQogICAgZGVmIF9fYW5kX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICYgb3BlcmF0b3IgLSByZXR1cm5zIEN7THtFYWNofX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBFYWNoKCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fcmFuZF9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAmIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBvdGhlciAmIHNlbGYNCg0KICAgIGRlZiBfX2ludmVydF9fKCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiB+IG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7Tm90QW55fX0NCiAgICAgICAgIiIiDQogICAgICAgIHJldHVybiBOb3RBbnkoIHNlbGYgKQ0KDQogICAgZGVmIF9fY2FsbF9fKHNlbGYsIG5hbWU9Tm9uZSk6DQogICAgICAgICIiIg0KICAgICAgICBTaG9ydGN1dCBmb3IgQ3tMe3NldFJlc3VsdHNOYW1lfX0sIHdpdGggQ3tsaXN0QWxsTWF0Y2hlcz1GYWxzZX0uDQogICAgICAgIA0KICAgICAgICBJZiBDe25hbWV9IGlzIGdpdmVuIHdpdGggYSB0cmFpbGluZyBDeycqJ30gY2hhcmFjdGVyLCB0aGVuIEN7bGlzdEFsbE1hdGNoZXN9IHdpbGwgYmUNCiAgICAgICAgcGFzc2VkIGFzIEN7VHJ1ZX0uDQogICAgICAgICAgIA0KICAgICAgICBJZiBDe25hbWV9IGlzIG9taXR0ZWQsIHNhbWUgYXMgY2FsbGluZyBDe0x7Y29weX19Lg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgIyB0aGVzZSBhcmUgZXF1aXZhbGVudA0KICAgICAgICAgICAgdXNlcmRhdGEgPSBXb3JkKGFscGhhcykuc2V0UmVzdWx0c05hbWUoIm5hbWUiKSArIFdvcmQobnVtcysiLSIpLnNldFJlc3VsdHNOYW1lKCJzb2NzZWNubyIpDQogICAgICAgICAgICB1c2VyZGF0YSA9IFdvcmQoYWxwaGFzKSgibmFtZSIpICsgV29yZChudW1zKyItIikoInNvY3NlY25vIikgICAgICAgICAgICAgDQogICAgICAgICIiIg0KICAgICAgICBpZiBuYW1lIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2V0UmVzdWx0c05hbWUobmFtZSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvcHkoKQ0KDQogICAgZGVmIHN1cHByZXNzKCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBTdXBwcmVzc2VzIHRoZSBvdXRwdXQgb2YgdGhpcyBDe1BhcnNlckVsZW1lbnR9OyB1c2VmdWwgdG8ga2VlcCBwdW5jdHVhdGlvbiBmcm9tDQogICAgICAgIGNsdXR0ZXJpbmcgdXAgcmV0dXJuZWQgb3V0cHV0Lg0KICAgICAgICAiIiINCiAgICAgICAgcmV0dXJuIFN1cHByZXNzKCBzZWxmICkNCg0KICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIERpc2FibGVzIHRoZSBza2lwcGluZyBvZiB3aGl0ZXNwYWNlIGJlZm9yZSBtYXRjaGluZyB0aGUgY2hhcmFjdGVycyBpbiB0aGUNCiAgICAgICAgQ3tQYXJzZXJFbGVtZW50fSdzIGRlZmluZWQgcGF0dGVybi4gIFRoaXMgaXMgbm9ybWFsbHkgb25seSB1c2VkIGludGVybmFsbHkgYnkNCiAgICAgICAgdGhlIHB5cGFyc2luZyBtb2R1bGUsIGJ1dCBtYXkgYmUgbmVlZGVkIGluIHNvbWUgd2hpdGVzcGFjZS1zZW5zaXRpdmUgZ3JhbW1hcnMuDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXRXaGl0ZXNwYWNlQ2hhcnMoIHNlbGYsIGNoYXJzICk6DQogICAgICAgICIiIg0KICAgICAgICBPdmVycmlkZXMgdGhlIGRlZmF1bHQgd2hpdGVzcGFjZSBjaGFycw0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUNCiAgICAgICAgc2VsZi53aGl0ZUNoYXJzID0gY2hhcnMNCiAgICAgICAgc2VsZi5jb3B5RGVmYXVsdFdoaXRlQ2hhcnMgPSBGYWxzZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHBhcnNlV2l0aFRhYnMoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIE92ZXJyaWRlcyBkZWZhdWx0IGJlaGF2aW9yIHRvIGV4cGFuZCBDezxUQUI+fXMgdG8gc3BhY2VzIGJlZm9yZSBwYXJzaW5nIHRoZSBpbnB1dCBzdHJpbmcuDQogICAgICAgIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBDe3BhcnNlU3RyaW5nfSB3aGVuIHRoZSBpbnB1dCBncmFtbWFyIGNvbnRhaW5zIGVsZW1lbnRzIHRoYXQNCiAgICAgICAgbWF0Y2ggQ3s8VEFCPn0gY2hhcmFjdGVycy4NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYua2VlcFRhYnMgPSBUcnVlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgRGVmaW5lIGV4cHJlc3Npb24gdG8gYmUgaWdub3JlZCAoZS5nLiwgY29tbWVudHMpIHdoaWxlIGRvaW5nIHBhdHRlcm4NCiAgICAgICAgbWF0Y2hpbmc7IG1heSBiZSBjYWxsZWQgcmVwZWF0ZWRseSwgdG8gZGVmaW5lIG11bHRpcGxlIGNvbW1lbnQgb3Igb3RoZXINCiAgICAgICAgaWdub3JhYmxlIHBhdHRlcm5zLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBwYXR0ID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkNCiAgICAgICAgICAgIHBhdHQucGFyc2VTdHJpbmcoJ2FibGFqIC8qIGNvbW1lbnQgKi8gbHNramQnKSAjIC0+IFsnYWJsYWonXQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBwYXR0Lmlnbm9yZShjU3R5bGVDb21tZW50KQ0KICAgICAgICAgICAgcGF0dC5wYXJzZVN0cmluZygnYWJsYWogLyogY29tbWVudCAqLyBsc2tqZCcpICMgLT4gWydhYmxhaicsICdsc2tqZCddDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIG90aGVyID0gU3VwcHJlc3Mob3RoZXIpDQoNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIFN1cHByZXNzICk6DQogICAgICAgICAgICBpZiBvdGhlciBub3QgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmFwcGVuZChvdGhlcikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuaWdub3JlRXhwcnMuYXBwZW5kKCBTdXBwcmVzcyggb3RoZXIuY29weSgpICkgKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldERlYnVnQWN0aW9ucyggc2VsZiwgc3RhcnRBY3Rpb24sIHN1Y2Nlc3NBY3Rpb24sIGV4Y2VwdGlvbkFjdGlvbiApOg0KICAgICAgICAiIiINCiAgICAgICAgRW5hYmxlIGRpc3BsYXkgb2YgZGVidWdnaW5nIG1lc3NhZ2VzIHdoaWxlIGRvaW5nIHBhdHRlcm4gbWF0Y2hpbmcuDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLmRlYnVnQWN0aW9ucyA9IChzdGFydEFjdGlvbiBvciBfZGVmYXVsdFN0YXJ0RGVidWdBY3Rpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NBY3Rpb24gb3IgX2RlZmF1bHRTdWNjZXNzRGVidWdBY3Rpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkFjdGlvbiBvciBfZGVmYXVsdEV4Y2VwdGlvbkRlYnVnQWN0aW9uKQ0KICAgICAgICBzZWxmLmRlYnVnID0gVHJ1ZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHNldERlYnVnKCBzZWxmLCBmbGFnPVRydWUgKToNCiAgICAgICAgIiIiDQogICAgICAgIEVuYWJsZSBkaXNwbGF5IG9mIGRlYnVnZ2luZyBtZXNzYWdlcyB3aGlsZSBkb2luZyBwYXR0ZXJuIG1hdGNoaW5nLg0KICAgICAgICBTZXQgQ3tmbGFnfSB0byBUcnVlIHRvIGVuYWJsZSwgRmFsc2UgdG8gZGlzYWJsZS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHdkID0gV29yZChhbHBoYXMpLnNldE5hbWUoImFscGhhd29yZCIpDQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXROYW1lKCJudW13b3JkIikNCiAgICAgICAgICAgIHRlcm0gPSB3ZCB8IGludGVnZXINCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyB0dXJuIG9uIGRlYnVnZ2luZyBmb3Igd2QNCiAgICAgICAgICAgIHdkLnNldERlYnVnKCkNCg0KICAgICAgICAgICAgT25lT3JNb3JlKHRlcm0pLnBhcnNlU3RyaW5nKCJhYmMgMTIzIHh5eiA4OTAiKQ0KICAgICAgICANCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMCgxLDEpDQogICAgICAgICAgICBNYXRjaGVkIGFscGhhd29yZCAtPiBbJ2FiYyddDQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDMoMSw0KQ0KICAgICAgICAgICAgRXhjZXB0aW9uIHJhaXNlZDpFeHBlY3RlZCBhbHBoYXdvcmQgKGF0IGNoYXIgNCksIChsaW5lOjEsIGNvbDo1KQ0KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyA3KDEsOCkNCiAgICAgICAgICAgIE1hdGNoZWQgYWxwaGF3b3JkIC0+IFsneHl6J10NCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMTEoMSwxMikNCiAgICAgICAgICAgIEV4Y2VwdGlvbiByYWlzZWQ6RXhwZWN0ZWQgYWxwaGF3b3JkIChhdCBjaGFyIDEyKSwgKGxpbmU6MSwgY29sOjEzKQ0KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAxNSgxLDE2KQ0KICAgICAgICAgICAgRXhjZXB0aW9uIHJhaXNlZDpFeHBlY3RlZCBhbHBoYXdvcmQgKGF0IGNoYXIgMTUpLCAobGluZToxLCBjb2w6MTYpDQoNCiAgICAgICAgVGhlIG91dHB1dCBzaG93biBpcyB0aGF0IHByb2R1Y2VkIGJ5IHRoZSBkZWZhdWx0IGRlYnVnIGFjdGlvbnMgLSBjdXN0b20gZGVidWcgYWN0aW9ucyBjYW4gYmUNCiAgICAgICAgc3BlY2lmaWVkIHVzaW5nIEx7c2V0RGVidWdBY3Rpb25zfS4gUHJpb3IgdG8gYXR0ZW1wdGluZw0KICAgICAgICB0byBtYXRjaCB0aGUgQ3t3ZH0gZXhwcmVzc2lvbiwgdGhlIGRlYnVnZ2luZyBtZXNzYWdlIEN7Ik1hdGNoIDxleHBybmFtZT4gYXQgbG9jIDxuPig8bGluZT4sPGNvbD4pIn0NCiAgICAgICAgaXMgc2hvd24uIFRoZW4gaWYgdGhlIHBhcnNlIHN1Y2NlZWRzLCBhIEN7Ik1hdGNoZWQifSBtZXNzYWdlIGlzIHNob3duLCBvciBhbiBDeyJFeGNlcHRpb24gcmFpc2VkIn0NCiAgICAgICAgbWVzc2FnZSBpcyBzaG93bi4gQWxzbyBub3RlIHRoZSB1c2Ugb2YgTHtzZXROYW1lfSB0byBhc3NpZ24gYSBodW1hbi1yZWFkYWJsZSBuYW1lIHRvIHRoZSBleHByZXNzaW9uLA0KICAgICAgICB3aGljaCBtYWtlcyBkZWJ1Z2dpbmcgYW5kIGV4Y2VwdGlvbiBtZXNzYWdlcyBlYXNpZXIgdG8gdW5kZXJzdGFuZCAtIGZvciBpbnN0YW5jZSwgdGhlIGRlZmF1bHQNCiAgICAgICAgbmFtZSBjcmVhdGVkIGZvciB0aGUgQ3tXb3JkfSBleHByZXNzaW9uIHdpdGhvdXQgY2FsbGluZyBDe3NldE5hbWV9IGlzIEN7Ilc6KEFCQ0QuLi4pIn0uDQogICAgICAgICIiIg0KICAgICAgICBpZiBmbGFnOg0KICAgICAgICAgICAgc2VsZi5zZXREZWJ1Z0FjdGlvbnMoIF9kZWZhdWx0U3RhcnREZWJ1Z0FjdGlvbiwgX2RlZmF1bHRTdWNjZXNzRGVidWdBY3Rpb24sIF9kZWZhdWx0RXhjZXB0aW9uRGVidWdBY3Rpb24gKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5kZWJ1ZyA9IEZhbHNlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICBkZWYgX19yZXByX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuIF91c3RyKHNlbGYpDQoNCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOg0KICAgICAgICBzZWxmLnN0cmVhbWxpbmVkID0gVHJ1ZQ0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgcGFzcw0KDQogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6DQogICAgICAgICIiIg0KICAgICAgICBDaGVjayBkZWZpbmVkIGV4cHJlc3Npb25zIGZvciB2YWxpZCBzdHJ1Y3R1cmUsIGNoZWNrIGZvciBpbmZpbml0ZSByZWN1cnNpdmUgZGVmaW5pdGlvbnMuDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKCBbXSApDQoNCiAgICBkZWYgcGFyc2VGaWxlKCBzZWxmLCBmaWxlX29yX2ZpbGVuYW1lLCBwYXJzZUFsbD1GYWxzZSApOg0KICAgICAgICAiIiINCiAgICAgICAgRXhlY3V0ZSB0aGUgcGFyc2UgZXhwcmVzc2lvbiBvbiB0aGUgZ2l2ZW4gZmlsZSBvciBmaWxlbmFtZS4NCiAgICAgICAgSWYgYSBmaWxlbmFtZSBpcyBzcGVjaWZpZWQgKGluc3RlYWQgb2YgYSBmaWxlIG9iamVjdCksDQogICAgICAgIHRoZSBlbnRpcmUgZmlsZSBpcyBvcGVuZWQsIHJlYWQsIGFuZCBjbG9zZWQgYmVmb3JlIHBhcnNpbmcuDQogICAgICAgICIiIg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBmaWxlX2NvbnRlbnRzID0gZmlsZV9vcl9maWxlbmFtZS5yZWFkKCkNCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOg0KICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVfb3JfZmlsZW5hbWUsICJyIikgYXMgZjoNCiAgICAgICAgICAgICAgICBmaWxlX2NvbnRlbnRzID0gZi5yZWFkKCkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VTdHJpbmcoZmlsZV9jb250ZW50cywgcGFyc2VBbGwpDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6DQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UNCiAgICAgICAgICAgICAgICByYWlzZSBleGMNCg0KICAgIGRlZiBfX2VxX18oc2VsZixvdGhlcik6DQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFBhcnNlckVsZW1lbnQpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYgaXMgb3RoZXIgb3IgdmFycyhzZWxmKSA9PSB2YXJzKG90aGVyKQ0KICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubWF0Y2hlcyhvdGhlcikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihQYXJzZXJFbGVtZW50LHNlbGYpPT1vdGhlcg0KDQogICAgZGVmIF9fbmVfXyhzZWxmLG90aGVyKToNCiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikNCg0KICAgIGRlZiBfX2hhc2hfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuIGhhc2goaWQoc2VsZikpDQoNCiAgICBkZWYgX19yZXFfXyhzZWxmLG90aGVyKToNCiAgICAgICAgcmV0dXJuIHNlbGYgPT0gb3RoZXINCg0KICAgIGRlZiBfX3JuZV9fKHNlbGYsb3RoZXIpOg0KICAgICAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQ0KDQogICAgZGVmIG1hdGNoZXMoc2VsZiwgdGVzdFN0cmluZywgcGFyc2VBbGw9VHJ1ZSk6DQogICAgICAgICIiIg0KICAgICAgICBNZXRob2QgZm9yIHF1aWNrIHRlc3Rpbmcgb2YgYSBwYXJzZXIgYWdhaW5zdCBhIHRlc3Qgc3RyaW5nLiBHb29kIGZvciBzaW1wbGUgDQogICAgICAgIGlubGluZSBtaWNyb3Rlc3RzIG9mIHN1YiBleHByZXNzaW9ucyB3aGlsZSBidWlsZGluZyB1cCBsYXJnZXIgcGFyc2VyLg0KICAgICAgICAgICANCiAgICAgICAgUGFyYW1ldGVyczoNCiAgICAgICAgIC0gdGVzdFN0cmluZyAtIHRvIHRlc3QgYWdhaW5zdCB0aGlzIGV4cHJlc3Npb24gZm9yIGEgbWF0Y2gNCiAgICAgICAgIC0gcGFyc2VBbGwgLSAoZGVmYXVsdD1De1RydWV9KSAtIGZsYWcgdG8gcGFzcyB0byBDe0x7cGFyc2VTdHJpbmd9fSB3aGVuIHJ1bm5pbmcgdGVzdHMNCiAgICAgICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGV4cHIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBhc3NlcnQgZXhwci5tYXRjaGVzKCIxMDAiKQ0KICAgICAgICAiIiINCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2VsZi5wYXJzZVN0cmluZyhfdXN0cih0ZXN0U3RyaW5nKSwgcGFyc2VBbGw9cGFyc2VBbGwpDQogICAgICAgICAgICByZXR1cm4gVHJ1ZQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uOg0KICAgICAgICAgICAgcmV0dXJuIEZhbHNlDQogICAgICAgICAgICAgICAgDQogICAgZGVmIHJ1blRlc3RzKHNlbGYsIHRlc3RzLCBwYXJzZUFsbD1UcnVlLCBjb21tZW50PScjJywgZnVsbER1bXA9VHJ1ZSwgcHJpbnRSZXN1bHRzPVRydWUsIGZhaWx1cmVUZXN0cz1GYWxzZSk6DQogICAgICAgICIiIg0KICAgICAgICBFeGVjdXRlIHRoZSBwYXJzZSBleHByZXNzaW9uIG9uIGEgc2VyaWVzIG9mIHRlc3Qgc3RyaW5ncywgc2hvd2luZyBlYWNoDQogICAgICAgIHRlc3QsIHRoZSBwYXJzZWQgcmVzdWx0cyBvciB3aGVyZSB0aGUgcGFyc2UgZmFpbGVkLiBRdWljayBhbmQgZWFzeSB3YXkgdG8NCiAgICAgICAgcnVuIGEgcGFyc2UgZXhwcmVzc2lvbiBhZ2FpbnN0IGEgbGlzdCBvZiBzYW1wbGUgc3RyaW5ncy4NCiAgICAgICAgICAgDQogICAgICAgIFBhcmFtZXRlcnM6DQogICAgICAgICAtIHRlc3RzIC0gYSBsaXN0IG9mIHNlcGFyYXRlIHRlc3Qgc3RyaW5ncywgb3IgYSBtdWx0aWxpbmUgc3RyaW5nIG9mIHRlc3Qgc3RyaW5ncw0KICAgICAgICAgLSBwYXJzZUFsbCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gZmxhZyB0byBwYXNzIHRvIEN7THtwYXJzZVN0cmluZ319IHdoZW4gcnVubmluZyB0ZXN0cyAgICAgICAgICAgDQogICAgICAgICAtIGNvbW1lbnQgLSAoZGVmYXVsdD1DeycjJ30pIC0gZXhwcmVzc2lvbiBmb3IgaW5kaWNhdGluZyBlbWJlZGRlZCBjb21tZW50cyBpbiB0aGUgdGVzdCANCiAgICAgICAgICAgICAgc3RyaW5nOyBwYXNzIE5vbmUgdG8gZGlzYWJsZSBjb21tZW50IGZpbHRlcmluZw0KICAgICAgICAgLSBmdWxsRHVtcCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gZHVtcCByZXN1bHRzIGFzIGxpc3QgZm9sbG93ZWQgYnkgcmVzdWx0cyBuYW1lcyBpbiBuZXN0ZWQgb3V0bGluZTsNCiAgICAgICAgICAgICAgaWYgRmFsc2UsIG9ubHkgZHVtcCBuZXN0ZWQgbGlzdA0KICAgICAgICAgLSBwcmludFJlc3VsdHMgLSAoZGVmYXVsdD1De1RydWV9KSBwcmludHMgdGVzdCBvdXRwdXQgdG8gc3Rkb3V0DQogICAgICAgICAtIGZhaWx1cmVUZXN0cyAtIChkZWZhdWx0PUN7RmFsc2V9KSBpbmRpY2F0ZXMgaWYgdGhlc2UgdGVzdHMgYXJlIGV4cGVjdGVkIHRvIGZhaWwgcGFyc2luZw0KDQogICAgICAgIFJldHVybnM6IGEgKHN1Y2Nlc3MsIHJlc3VsdHMpIHR1cGxlLCB3aGVyZSBzdWNjZXNzIGluZGljYXRlcyB0aGF0IGFsbCB0ZXN0cyBzdWNjZWVkZWQNCiAgICAgICAgKG9yIGZhaWxlZCBpZiBDe2ZhaWx1cmVUZXN0c30gaXMgVHJ1ZSksIGFuZCB0aGUgcmVzdWx0cyBjb250YWluIGEgbGlzdCBvZiBsaW5lcyBvZiBlYWNoIA0KICAgICAgICB0ZXN0J3Mgb3V0cHV0DQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIG51bWJlcl9leHByID0gcHlwYXJzaW5nX2NvbW1vbi5udW1iZXIuY29weSgpDQoNCiAgICAgICAgICAgIHJlc3VsdCA9IG51bWJlcl9leHByLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgICAgICMgdW5zaWduZWQgaW50ZWdlcg0KICAgICAgICAgICAgICAgIDEwMA0KICAgICAgICAgICAgICAgICMgbmVnYXRpdmUgaW50ZWdlcg0KICAgICAgICAgICAgICAgIC0xMDANCiAgICAgICAgICAgICAgICAjIGZsb2F0IHdpdGggc2NpZW50aWZpYyBub3RhdGlvbg0KICAgICAgICAgICAgICAgIDYuMDJlMjMNCiAgICAgICAgICAgICAgICAjIGludGVnZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uDQogICAgICAgICAgICAgICAgMWUtMTINCiAgICAgICAgICAgICAgICAnJycpDQogICAgICAgICAgICBwcmludCgiU3VjY2VzcyIgaWYgcmVzdWx0WzBdIGVsc2UgIkZhaWxlZCEiKQ0KDQogICAgICAgICAgICByZXN1bHQgPSBudW1iZXJfZXhwci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICAgICAjIHN0cmF5IGNoYXJhY3Rlcg0KICAgICAgICAgICAgICAgIDEwMFoNCiAgICAgICAgICAgICAgICAjIG1pc3NpbmcgbGVhZGluZyBkaWdpdCBiZWZvcmUgJy4nDQogICAgICAgICAgICAgICAgLS4xMDANCiAgICAgICAgICAgICAgICAjIHRvbyBtYW55ICcuJw0KICAgICAgICAgICAgICAgIDMuMTQuMTU5DQogICAgICAgICAgICAgICAgJycnLCBmYWlsdXJlVGVzdHM9VHJ1ZSkNCiAgICAgICAgICAgIHByaW50KCJTdWNjZXNzIiBpZiByZXN1bHRbMF0gZWxzZSAiRmFpbGVkISIpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICAjIHVuc2lnbmVkIGludGVnZXINCiAgICAgICAgICAgIDEwMA0KICAgICAgICAgICAgWzEwMF0NCg0KICAgICAgICAgICAgIyBuZWdhdGl2ZSBpbnRlZ2VyDQogICAgICAgICAgICAtMTAwDQogICAgICAgICAgICBbLTEwMF0NCg0KICAgICAgICAgICAgIyBmbG9hdCB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24NCiAgICAgICAgICAgIDYuMDJlMjMNCiAgICAgICAgICAgIFs2LjAyZSsyM10NCg0KICAgICAgICAgICAgIyBpbnRlZ2VyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbg0KICAgICAgICAgICAgMWUtMTINCiAgICAgICAgICAgIFsxZS0xMl0NCg0KICAgICAgICAgICAgU3VjY2Vzcw0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIHN0cmF5IGNoYXJhY3Rlcg0KICAgICAgICAgICAgMTAwWg0KICAgICAgICAgICAgICAgXg0KICAgICAgICAgICAgRkFJTDogRXhwZWN0ZWQgZW5kIG9mIHRleHQgKGF0IGNoYXIgMyksIChsaW5lOjEsIGNvbDo0KQ0KDQogICAgICAgICAgICAjIG1pc3NpbmcgbGVhZGluZyBkaWdpdCBiZWZvcmUgJy4nDQogICAgICAgICAgICAtLjEwMA0KICAgICAgICAgICAgXg0KICAgICAgICAgICAgRkFJTDogRXhwZWN0ZWQge3JlYWwgbnVtYmVyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbiB8IHJlYWwgbnVtYmVyIHwgc2lnbmVkIGludGVnZXJ9IChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCg0KICAgICAgICAgICAgIyB0b28gbWFueSAnLicNCiAgICAgICAgICAgIDMuMTQuMTU5DQogICAgICAgICAgICAgICAgXg0KICAgICAgICAgICAgRkFJTDogRXhwZWN0ZWQgZW5kIG9mIHRleHQgKGF0IGNoYXIgNCksIChsaW5lOjEsIGNvbDo1KQ0KDQogICAgICAgICAgICBTdWNjZXNzDQoNCiAgICAgICAgRWFjaCB0ZXN0IHN0cmluZyBtdXN0IGJlIG9uIGEgc2luZ2xlIGxpbmUuIElmIHlvdSB3YW50IHRvIHRlc3QgYSBzdHJpbmcgdGhhdCBzcGFucyBtdWx0aXBsZQ0KICAgICAgICBsaW5lcywgY3JlYXRlIGEgdGVzdCBsaWtlIHRoaXM6Og0KDQogICAgICAgICAgICBleHByLnJ1blRlc3QociJ0aGlzIGlzIGEgdGVzdFxcbiBvZiBzdHJpbmdzIHRoYXQgc3BhbnMgXFxuIDMgbGluZXMiKQ0KICAgICAgICANCiAgICAgICAgKE5vdGUgdGhhdCB0aGlzIGlzIGEgcmF3IHN0cmluZyBsaXRlcmFsLCB5b3UgbXVzdCBpbmNsdWRlIHRoZSBsZWFkaW5nICdyJy4pDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKHRlc3RzLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIHRlc3RzID0gbGlzdChtYXAoc3RyLnN0cmlwLCB0ZXN0cy5yc3RyaXAoKS5zcGxpdGxpbmVzKCkpKQ0KICAgICAgICBpZiBpc2luc3RhbmNlKGNvbW1lbnQsIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgY29tbWVudCA9IExpdGVyYWwoY29tbWVudCkNCiAgICAgICAgYWxsUmVzdWx0cyA9IFtdDQogICAgICAgIGNvbW1lbnRzID0gW10NCiAgICAgICAgc3VjY2VzcyA9IFRydWUNCiAgICAgICAgZm9yIHQgaW4gdGVzdHM6DQogICAgICAgICAgICBpZiBjb21tZW50IGlzIG5vdCBOb25lIGFuZCBjb21tZW50Lm1hdGNoZXModCwgRmFsc2UpIG9yIGNvbW1lbnRzIGFuZCBub3QgdDoNCiAgICAgICAgICAgICAgICBjb21tZW50cy5hcHBlbmQodCkNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgaWYgbm90IHQ6DQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIG91dCA9IFsnXG4nLmpvaW4oY29tbWVudHMpLCB0XQ0KICAgICAgICAgICAgY29tbWVudHMgPSBbXQ0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHQgPSB0LnJlcGxhY2UocidcbicsJ1xuJykNCiAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLnBhcnNlU3RyaW5nKHQsIHBhcnNlQWxsPXBhcnNlQWxsKQ0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQocmVzdWx0LmR1bXAoZnVsbD1mdWxsRHVtcCkpDQogICAgICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIG5vdCBmYWlsdXJlVGVzdHMNCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgcGU6DQogICAgICAgICAgICAgICAgZmF0YWwgPSAiKEZBVEFMKSIgaWYgaXNpbnN0YW5jZShwZSwgUGFyc2VGYXRhbEV4Y2VwdGlvbikgZWxzZSAiIg0KICAgICAgICAgICAgICAgIGlmICdcbicgaW4gdDoNCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChsaW5lKHBlLmxvYywgdCkpDQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoJyAnKihjb2wocGUubG9jLHQpLTEpICsgJ14nICsgZmF0YWwpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgnICcqcGUubG9jICsgJ14nICsgZmF0YWwpDQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiRkFJTDogIiArIHN0cihwZSkpDQogICAgICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIGZhaWx1cmVUZXN0cw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBlDQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJGQUlMLUVYQ0VQVElPTjogIiArIHN0cihleGMpKQ0KICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzIGFuZCBmYWlsdXJlVGVzdHMNCiAgICAgICAgICAgICAgICByZXN1bHQgPSBleGMNCg0KICAgICAgICAgICAgaWYgcHJpbnRSZXN1bHRzOg0KICAgICAgICAgICAgICAgIGlmIGZ1bGxEdW1wOg0KICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcnKQ0KICAgICAgICAgICAgICAgIHByaW50KCdcbicuam9pbihvdXQpKQ0KDQogICAgICAgICAgICBhbGxSZXN1bHRzLmFwcGVuZCgodCwgcmVzdWx0KSkNCiAgICAgICAgDQogICAgICAgIHJldHVybiBzdWNjZXNzLCBhbGxSZXN1bHRzDQoNCiAgICAgICAgDQpjbGFzcyBUb2tlbihQYXJzZXJFbGVtZW50KToNCiAgICAiIiINCiAgICBBYnN0cmFjdCBDe1BhcnNlckVsZW1lbnR9IHN1YmNsYXNzLCBmb3IgZGVmaW5pbmcgYXRvbWljIG1hdGNoaW5nIHBhdHRlcm5zLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihUb2tlbixzZWxmKS5fX2luaXRfXyggc2F2ZWxpc3Q9RmFsc2UgKQ0KDQoNCmNsYXNzIEVtcHR5KFRva2VuKToNCiAgICAiIiINCiAgICBBbiBlbXB0eSB0b2tlbiwgd2lsbCBhbHdheXMgbWF0Y2guDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKEVtcHR5LHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5uYW1lID0gIkVtcHR5Ig0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KDQoNCmNsYXNzIE5vTWF0Y2goVG9rZW4pOg0KICAgICIiIg0KICAgIEEgdG9rZW4gdGhhdCB3aWxsIG5ldmVyIG1hdGNoLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihOb01hdGNoLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5uYW1lID0gIk5vTWF0Y2giDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYuZXJybXNnID0gIlVubWF0Y2hhYmxlIHRva2VuIg0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCg0KY2xhc3MgTGl0ZXJhbChUb2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gdG8gZXhhY3RseSBtYXRjaCBhIHNwZWNpZmllZCBzdHJpbmcuDQogICAgDQogICAgRXhhbXBsZTo6DQogICAgICAgIExpdGVyYWwoJ2JsYWgnKS5wYXJzZVN0cmluZygnYmxhaCcpICAjIC0+IFsnYmxhaCddDQogICAgICAgIExpdGVyYWwoJ2JsYWgnKS5wYXJzZVN0cmluZygnYmxhaGZvb2JsYWgnKSAgIyAtPiBbJ2JsYWgnXQ0KICAgICAgICBMaXRlcmFsKCdibGFoJykucGFyc2VTdHJpbmcoJ2JsYScpICAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgImJsYWgiDQogICAgDQogICAgRm9yIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIHVzZSBMe0Nhc2VsZXNzTGl0ZXJhbH0uDQogICAgDQogICAgRm9yIGtleXdvcmQgbWF0Y2hpbmcgKGZvcmNlIHdvcmQgYnJlYWsgYmVmb3JlIGFuZCBhZnRlciB0aGUgbWF0Y2hlZCBzdHJpbmcpLA0KICAgIHVzZSBMe0tleXdvcmR9IG9yIEx7Q2FzZWxlc3NLZXl3b3JkfS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nICk6DQogICAgICAgIHN1cGVyKExpdGVyYWwsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLm1hdGNoID0gbWF0Y2hTdHJpbmcNCiAgICAgICAgc2VsZi5tYXRjaExlbiA9IGxlbihtYXRjaFN0cmluZykNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2VsZi5maXJzdE1hdGNoQ2hhciA9IG1hdGNoU3RyaW5nWzBdDQogICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigibnVsbCBzdHJpbmcgcGFzc2VkIHRvIExpdGVyYWw7IHVzZSBFbXB0eSgpIGluc3RlYWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHNlbGYuX19jbGFzc19fID0gRW1wdHkNCiAgICAgICAgc2VsZi5uYW1lID0gJyIlcyInICUgX3VzdHIoc2VsZi5tYXRjaCkNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCg0KICAgICMgUGVyZm9ybWFuY2UgdHVuaW5nOiB0aGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgYSAqbG90Kg0KICAgICMgaWYgdGhpcyBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIgbWF0Y2ggc3RyaW5nICBhbmQgdGhlIGZpcnN0IGNoYXJhY3RlciBtYXRjaGVzLA0KICAgICMgc2hvcnQtY2lyY3VpdCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLCBhbmQgYXZvaWQgY2FsbGluZyBzdGFydHN3aXRoDQogICAgI34gQHByb2ZpbGUNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiAoaW5zdHJpbmdbbG9jXSA9PSBzZWxmLmZpcnN0TWF0Y2hDaGFyIGFuZA0KICAgICAgICAgICAgKHNlbGYubWF0Y2hMZW49PTEgb3IgaW5zdHJpbmcuc3RhcnRzd2l0aChzZWxmLm1hdGNoLGxvYykpICk6DQogICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQpfTCA9IExpdGVyYWwNClBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyA9IExpdGVyYWwNCg0KY2xhc3MgS2V5d29yZChUb2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gdG8gZXhhY3RseSBtYXRjaCBhIHNwZWNpZmllZCBzdHJpbmcgYXMgYSBrZXl3b3JkLCB0aGF0IGlzLCBpdCBtdXN0IGJlDQogICAgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBub24ta2V5d29yZCBjaGFyYWN0ZXIuICBDb21wYXJlIHdpdGggQ3tMe0xpdGVyYWx9fToNCiAgICAgLSBDe0xpdGVyYWwoImlmIil9IHdpbGwgbWF0Y2ggdGhlIGxlYWRpbmcgQ3snaWYnfSBpbiBDeydpZkFuZE9ubHlJZid9Lg0KICAgICAtIEN7S2V5d29yZCgiaWYiKX0gd2lsbCBub3Q7IGl0IHdpbGwgb25seSBtYXRjaCB0aGUgbGVhZGluZyBDeydpZid9IGluIEN7J2lmIHg9MSd9LCBvciBDeydpZih5PT0yKSd9DQogICAgQWNjZXB0cyB0d28gb3B0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzIGluIGFkZGl0aW9uIHRvIHRoZSBrZXl3b3JkIHN0cmluZzoNCiAgICAgLSBDe2lkZW50Q2hhcnN9IGlzIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBiZSB2YWxpZCBpZGVudGlmaWVyIGNoYXJhY3RlcnMsDQogICAgICAgICAgZGVmYXVsdGluZyB0byBhbGwgYWxwaGFudW1lcmljcyArICJfIiBhbmQgIiQiDQogICAgIC0gQ3tjYXNlbGVzc30gYWxsb3dzIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIGRlZmF1bHQgaXMgQ3tGYWxzZX0uDQogICAgICAgDQogICAgRXhhbXBsZTo6DQogICAgICAgIEtleXdvcmQoInN0YXJ0IikucGFyc2VTdHJpbmcoInN0YXJ0IikgICMgLT4gWydzdGFydCddDQogICAgICAgIEtleXdvcmQoInN0YXJ0IikucGFyc2VTdHJpbmcoInN0YXJ0aW5nIikgICMgLT4gRXhjZXB0aW9uDQoNCiAgICBGb3IgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZywgdXNlIEx7Q2FzZWxlc3NLZXl3b3JkfS4NCiAgICAiIiINCiAgICBERUZBVUxUX0tFWVdPUkRfQ0hBUlMgPSBhbHBoYW51bXMrIl8kIg0KDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZywgaWRlbnRDaGFycz1Ob25lLCBjYXNlbGVzcz1GYWxzZSApOg0KICAgICAgICBzdXBlcihLZXl3b3JkLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgaWYgaWRlbnRDaGFycyBpcyBOb25lOg0KICAgICAgICAgICAgaWRlbnRDaGFycyA9IEtleXdvcmQuREVGQVVMVF9LRVlXT1JEX0NIQVJTDQogICAgICAgIHNlbGYubWF0Y2ggPSBtYXRjaFN0cmluZw0KICAgICAgICBzZWxmLm1hdGNoTGVuID0gbGVuKG1hdGNoU3RyaW5nKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLmZpcnN0TWF0Y2hDaGFyID0gbWF0Y2hTdHJpbmdbMF0NCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJudWxsIHN0cmluZyBwYXNzZWQgdG8gS2V5d29yZDsgdXNlIEVtcHR5KCkgaW5zdGVhZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICBzZWxmLm5hbWUgPSAnIiVzIicgJSBzZWxmLm1hdGNoDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYuY2FzZWxlc3MgPSBjYXNlbGVzcw0KICAgICAgICBpZiBjYXNlbGVzczoNCiAgICAgICAgICAgIHNlbGYuY2FzZWxlc3NtYXRjaCA9IG1hdGNoU3RyaW5nLnVwcGVyKCkNCiAgICAgICAgICAgIGlkZW50Q2hhcnMgPSBpZGVudENoYXJzLnVwcGVyKCkNCiAgICAgICAgc2VsZi5pZGVudENoYXJzID0gc2V0KGlkZW50Q2hhcnMpDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLmNhc2VsZXNzOg0KICAgICAgICAgICAgaWYgKCAoaW5zdHJpbmdbIGxvYzpsb2Mrc2VsZi5tYXRjaExlbiBdLnVwcGVyKCkgPT0gc2VsZi5jYXNlbGVzc21hdGNoKSBhbmQNCiAgICAgICAgICAgICAgICAgKGxvYyA+PSBsZW4oaW5zdHJpbmcpLXNlbGYubWF0Y2hMZW4gb3IgaW5zdHJpbmdbbG9jK3NlbGYubWF0Y2hMZW5dLnVwcGVyKCkgbm90IGluIHNlbGYuaWRlbnRDaGFycykgYW5kDQogICAgICAgICAgICAgICAgIChsb2MgPT0gMCBvciBpbnN0cmluZ1tsb2MtMV0udXBwZXIoKSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSApOg0KICAgICAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgKGluc3RyaW5nW2xvY10gPT0gc2VsZi5maXJzdE1hdGNoQ2hhciBhbmQNCiAgICAgICAgICAgICAgICAoc2VsZi5tYXRjaExlbj09MSBvciBpbnN0cmluZy5zdGFydHN3aXRoKHNlbGYubWF0Y2gsbG9jKSkgYW5kDQogICAgICAgICAgICAgICAgKGxvYyA+PSBsZW4oaW5zdHJpbmcpLXNlbGYubWF0Y2hMZW4gb3IgaW5zdHJpbmdbbG9jK3NlbGYubWF0Y2hMZW5dIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpIGFuZA0KICAgICAgICAgICAgICAgIChsb2MgPT0gMCBvciBpbnN0cmluZ1tsb2MtMV0gbm90IGluIHNlbGYuaWRlbnRDaGFycykgKToNCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICBkZWYgY29weShzZWxmKToNCiAgICAgICAgYyA9IHN1cGVyKEtleXdvcmQsc2VsZikuY29weSgpDQogICAgICAgIGMuaWRlbnRDaGFycyA9IEtleXdvcmQuREVGQVVMVF9LRVlXT1JEX0NIQVJTDQogICAgICAgIHJldHVybiBjDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIHNldERlZmF1bHRLZXl3b3JkQ2hhcnMoIGNoYXJzICk6DQogICAgICAgICIiIk92ZXJyaWRlcyB0aGUgZGVmYXVsdCBLZXl3b3JkIGNoYXJzDQogICAgICAgICIiIg0KICAgICAgICBLZXl3b3JkLkRFRkFVTFRfS0VZV09SRF9DSEFSUyA9IGNoYXJzDQoNCmNsYXNzIENhc2VsZXNzTGl0ZXJhbChMaXRlcmFsKToNCiAgICAiIiINCiAgICBUb2tlbiB0byBtYXRjaCBhIHNwZWNpZmllZCBzdHJpbmcsIGlnbm9yaW5nIGNhc2Ugb2YgbGV0dGVycy4NCiAgICBOb3RlOiB0aGUgbWF0Y2hlZCByZXN1bHRzIHdpbGwgYWx3YXlzIGJlIGluIHRoZSBjYXNlIG9mIHRoZSBnaXZlbg0KICAgIG1hdGNoIHN0cmluZywgTk9UIHRoZSBjYXNlIG9mIHRoZSBpbnB1dCB0ZXh0Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIE9uZU9yTW9yZShDYXNlbGVzc0xpdGVyYWwoIkNNRCIpKS5wYXJzZVN0cmluZygiY21kIENNRCBDbWQxMCIpICMgLT4gWydDTUQnLCAnQ01EJywgJ0NNRCddDQogICAgICAgIA0KICAgIChDb250cmFzdCB3aXRoIGV4YW1wbGUgZm9yIEx7Q2FzZWxlc3NLZXl3b3JkfS4pDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZyApOg0KICAgICAgICBzdXBlcihDYXNlbGVzc0xpdGVyYWwsc2VsZikuX19pbml0X18oIG1hdGNoU3RyaW5nLnVwcGVyKCkgKQ0KICAgICAgICAjIFByZXNlcnZlIHRoZSBkZWZpbmluZyBsaXRlcmFsLg0KICAgICAgICBzZWxmLnJldHVyblN0cmluZyA9IG1hdGNoU3RyaW5nDQogICAgICAgIHNlbGYubmFtZSA9ICInJXMnIiAlIHNlbGYucmV0dXJuU3RyaW5nDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGluc3RyaW5nWyBsb2M6bG9jK3NlbGYubWF0Y2hMZW4gXS51cHBlcigpID09IHNlbGYubWF0Y2g6DQogICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYucmV0dXJuU3RyaW5nDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQpjbGFzcyBDYXNlbGVzc0tleXdvcmQoS2V5d29yZCk6DQogICAgIiIiDQogICAgQ2FzZWxlc3MgdmVyc2lvbiBvZiBMe0tleXdvcmR9Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIE9uZU9yTW9yZShDYXNlbGVzc0tleXdvcmQoIkNNRCIpKS5wYXJzZVN0cmluZygiY21kIENNRCBDbWQxMCIpICMgLT4gWydDTUQnLCAnQ01EJ10NCiAgICAgICAgDQogICAgKENvbnRyYXN0IHdpdGggZXhhbXBsZSBmb3IgTHtDYXNlbGVzc0xpdGVyYWx9LikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hdGNoU3RyaW5nLCBpZGVudENoYXJzPU5vbmUgKToNCiAgICAgICAgc3VwZXIoQ2FzZWxlc3NLZXl3b3JkLHNlbGYpLl9faW5pdF9fKCBtYXRjaFN0cmluZywgaWRlbnRDaGFycywgY2FzZWxlc3M9VHJ1ZSApDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiAoIChpbnN0cmluZ1sgbG9jOmxvYytzZWxmLm1hdGNoTGVuIF0udXBwZXIoKSA9PSBzZWxmLmNhc2VsZXNzbWF0Y2gpIGFuZA0KICAgICAgICAgICAgIChsb2MgPj0gbGVuKGluc3RyaW5nKS1zZWxmLm1hdGNoTGVuIG9yIGluc3RyaW5nW2xvYytzZWxmLm1hdGNoTGVuXS51cHBlcigpIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpICk6DQogICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCmNsYXNzIENsb3NlTWF0Y2goVG9rZW4pOg0KICAgICIiIg0KICAgIEEgdmFyaWF0aW9uIG9uIEx7TGl0ZXJhbH0gd2hpY2ggbWF0Y2hlcyAiY2xvc2UiIG1hdGNoZXMsIHRoYXQgaXMsIA0KICAgIHN0cmluZ3Mgd2l0aCBhdCBtb3N0ICduJyBtaXNtYXRjaGluZyBjaGFyYWN0ZXJzLiBDe0Nsb3NlTWF0Y2h9IHRha2VzIHBhcmFtZXRlcnM6DQogICAgIC0gQ3ttYXRjaF9zdHJpbmd9IC0gc3RyaW5nIHRvIGJlIG1hdGNoZWQNCiAgICAgLSBDe21heE1pc21hdGNoZXN9IC0gKEN7ZGVmYXVsdD0xfSkgbWF4aW11bSBudW1iZXIgb2YgbWlzbWF0Y2hlcyBhbGxvd2VkIHRvIGNvdW50IGFzIGEgbWF0Y2gNCiAgICANCiAgICBUaGUgcmVzdWx0cyBmcm9tIGEgc3VjY2Vzc2Z1bCBwYXJzZSB3aWxsIGNvbnRhaW4gdGhlIG1hdGNoZWQgdGV4dCBmcm9tIHRoZSBpbnB1dCBzdHJpbmcgYW5kIHRoZSBmb2xsb3dpbmcgbmFtZWQgcmVzdWx0czoNCiAgICAgLSBDe21pc21hdGNoZXN9IC0gYSBsaXN0IG9mIHRoZSBwb3NpdGlvbnMgd2l0aGluIHRoZSBtYXRjaF9zdHJpbmcgd2hlcmUgbWlzbWF0Y2hlcyB3ZXJlIGZvdW5kDQogICAgIC0gQ3tvcmlnaW5hbH0gLSB0aGUgb3JpZ2luYWwgbWF0Y2hfc3RyaW5nIHVzZWQgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBpbnB1dCBzdHJpbmcNCiAgICANCiAgICBJZiBDe21pc21hdGNoZXN9IGlzIGFuIGVtcHR5IGxpc3QsIHRoZW4gdGhlIG1hdGNoIHdhcyBhbiBleGFjdCBtYXRjaC4NCiAgICANCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcGF0dCA9IENsb3NlTWF0Y2goIkFUQ0FUQ0dBQVRHR0EiKQ0KICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBVENHQUFYR0dBIikgIyAtPiAoWydBVENBVENHQUFYR0dBJ10sIHsnbWlzbWF0Y2hlcyc6IFtbOV1dLCAnb3JpZ2luYWwnOiBbJ0FUQ0FUQ0dBQVRHR0EnXX0pDQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FYQ0dBQVhHR0EiKSAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgJ0FUQ0FUQ0dBQVRHR0EnICh3aXRoIHVwIHRvIDEgbWlzbWF0Y2hlcykgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KDQogICAgICAgICMgZXhhY3QgbWF0Y2gNCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVRDR0FBVEdHQSIpICMgLT4gKFsnQVRDQVRDR0FBVEdHQSddLCB7J21pc21hdGNoZXMnOiBbW11dLCAnb3JpZ2luYWwnOiBbJ0FUQ0FUQ0dBQVRHR0EnXX0pDQoNCiAgICAgICAgIyBjbG9zZSBtYXRjaCBhbGxvd2luZyB1cCB0byAyIG1pc21hdGNoZXMNCiAgICAgICAgcGF0dCA9IENsb3NlTWF0Y2goIkFUQ0FUQ0dBQVRHR0EiLCBtYXhNaXNtYXRjaGVzPTIpDQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FYQ0dBQVhHR0EiKSAjIC0+IChbJ0FUQ0FYQ0dBQVhHR0EnXSwgeydtaXNtYXRjaGVzJzogW1s0LCA5XV0sICdvcmlnaW5hbCc6IFsnQVRDQVRDR0FBVEdHQSddfSkNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWF0Y2hfc3RyaW5nLCBtYXhNaXNtYXRjaGVzPTEpOg0KICAgICAgICBzdXBlcihDbG9zZU1hdGNoLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5uYW1lID0gbWF0Y2hfc3RyaW5nDQogICAgICAgIHNlbGYubWF0Y2hfc3RyaW5nID0gbWF0Y2hfc3RyaW5nDQogICAgICAgIHNlbGYubWF4TWlzbWF0Y2hlcyA9IG1heE1pc21hdGNoZXMNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgJXIgKHdpdGggdXAgdG8gJWQgbWlzbWF0Y2hlcykiICUgKHNlbGYubWF0Y2hfc3RyaW5nLCBzZWxmLm1heE1pc21hdGNoZXMpDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgc3RhcnQgPSBsb2MNCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgIG1heGxvYyA9IHN0YXJ0ICsgbGVuKHNlbGYubWF0Y2hfc3RyaW5nKQ0KDQogICAgICAgIGlmIG1heGxvYyA8PSBpbnN0cmxlbjoNCiAgICAgICAgICAgIG1hdGNoX3N0cmluZyA9IHNlbGYubWF0Y2hfc3RyaW5nDQogICAgICAgICAgICBtYXRjaF9zdHJpbmdsb2MgPSAwDQogICAgICAgICAgICBtaXNtYXRjaGVzID0gW10NCiAgICAgICAgICAgIG1heE1pc21hdGNoZXMgPSBzZWxmLm1heE1pc21hdGNoZXMNCg0KICAgICAgICAgICAgZm9yIG1hdGNoX3N0cmluZ2xvYyxzX20gaW4gZW51bWVyYXRlKHppcChpbnN0cmluZ1tsb2M6bWF4bG9jXSwgc2VsZi5tYXRjaF9zdHJpbmcpKToNCiAgICAgICAgICAgICAgICBzcmMsbWF0ID0gc19tDQogICAgICAgICAgICAgICAgaWYgc3JjICE9IG1hdDoNCiAgICAgICAgICAgICAgICAgICAgbWlzbWF0Y2hlcy5hcHBlbmQobWF0Y2hfc3RyaW5nbG9jKQ0KICAgICAgICAgICAgICAgICAgICBpZiBsZW4obWlzbWF0Y2hlcykgPiBtYXhNaXNtYXRjaGVzOg0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgbG9jID0gbWF0Y2hfc3RyaW5nbG9jICsgMQ0KICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBQYXJzZVJlc3VsdHMoW2luc3RyaW5nW3N0YXJ0OmxvY11dKQ0KICAgICAgICAgICAgICAgIHJlc3VsdHNbJ29yaWdpbmFsJ10gPSBzZWxmLm1hdGNoX3N0cmluZw0KICAgICAgICAgICAgICAgIHJlc3VsdHNbJ21pc21hdGNoZXMnXSA9IG1pc21hdGNoZXMNCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jLCByZXN1bHRzDQoNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCg0KY2xhc3MgV29yZChUb2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHdvcmRzIGNvbXBvc2VkIG9mIGFsbG93ZWQgY2hhcmFjdGVyIHNldHMuDQogICAgRGVmaW5lZCB3aXRoIHN0cmluZyBjb250YWluaW5nIGFsbCBhbGxvd2VkIGluaXRpYWwgY2hhcmFjdGVycywNCiAgICBhbiBvcHRpb25hbCBzdHJpbmcgY29udGFpbmluZyBhbGxvd2VkIGJvZHkgY2hhcmFjdGVycyAoaWYgb21pdHRlZCwNCiAgICBkZWZhdWx0cyB0byB0aGUgaW5pdGlhbCBjaGFyYWN0ZXIgc2V0KSwgYW5kIGFuIG9wdGlvbmFsIG1pbmltdW0sDQogICAgbWF4aW11bSwgYW5kL29yIGV4YWN0IGxlbmd0aC4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBDe21pbn0gaXMgMSAoYQ0KICAgIG1pbmltdW0gdmFsdWUgPCAxIGlzIG5vdCB2YWxpZCk7IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgQ3ttYXh9IGFuZCBDe2V4YWN0fQ0KICAgIGFyZSAwLCBtZWFuaW5nIG5vIG1heGltdW0gb3IgZXhhY3QgbGVuZ3RoIHJlc3RyaWN0aW9uLiBBbiBvcHRpb25hbA0KICAgIEN7ZXhjbHVkZUNoYXJzfSBwYXJhbWV0ZXIgY2FuIGxpc3QgY2hhcmFjdGVycyB0aGF0IG1pZ2h0IGJlIGZvdW5kIGluIA0KICAgIHRoZSBpbnB1dCBDe2JvZHlDaGFyc30gc3RyaW5nOyB1c2VmdWwgdG8gZGVmaW5lIGEgd29yZCBvZiBhbGwgcHJpbnRhYmxlcw0KICAgIGV4Y2VwdCBmb3Igb25lIG9yIHR3byBjaGFyYWN0ZXJzLCBmb3IgaW5zdGFuY2UuDQogICAgDQogICAgTHtzcmFuZ2V9IGlzIHVzZWZ1bCBmb3IgZGVmaW5pbmcgY3VzdG9tIGNoYXJhY3RlciBzZXQgc3RyaW5ncyBmb3IgZGVmaW5pbmcgDQogICAgQ3tXb3JkfSBleHByZXNzaW9ucywgdXNpbmcgcmFuZ2Ugbm90YXRpb24gZnJvbSByZWd1bGFyIGV4cHJlc3Npb24gY2hhcmFjdGVyIHNldHMuDQogICAgDQogICAgQSBjb21tb24gbWlzdGFrZSBpcyB0byB1c2UgQ3tXb3JkfSB0byBtYXRjaCBhIHNwZWNpZmljIGxpdGVyYWwgc3RyaW5nLCBhcyBpbiANCiAgICBDe1dvcmQoIkFkZHJlc3MiKX0uIFJlbWVtYmVyIHRoYXQgQ3tXb3JkfSB1c2VzIHRoZSBzdHJpbmcgYXJndW1lbnQgdG8gZGVmaW5lDQogICAgSXtzZXRzfSBvZiBtYXRjaGFibGUgY2hhcmFjdGVycy4gVGhpcyBleHByZXNzaW9uIHdvdWxkIG1hdGNoICJBZGQiLCAiQUFBIiwNCiAgICAiZEFyZWQiLCBvciBhbnkgb3RoZXIgd29yZCBtYWRlIHVwIG9mIHRoZSBjaGFyYWN0ZXJzICdBJywgJ2QnLCAncicsICdlJywgYW5kICdzJy4NCiAgICBUbyBtYXRjaCBhbiBleGFjdCBsaXRlcmFsIHN0cmluZywgdXNlIEx7TGl0ZXJhbH0gb3IgTHtLZXl3b3JkfS4NCg0KICAgIHB5cGFyc2luZyBpbmNsdWRlcyBoZWxwZXIgc3RyaW5ncyBmb3IgYnVpbGRpbmcgV29yZHM6DQogICAgIC0gTHthbHBoYXN9DQogICAgIC0gTHtudW1zfQ0KICAgICAtIEx7YWxwaGFudW1zfQ0KICAgICAtIEx7aGV4bnVtc30NCiAgICAgLSBMe2FscGhhczhiaXR9IChhbHBoYWJldGljIGNoYXJhY3RlcnMgaW4gQVNDSUkgcmFuZ2UgMTI4LTI1NSAtIGFjY2VudGVkLCB0aWxkZWQsIHVtbGF1dGVkLCBldGMuKQ0KICAgICAtIEx7cHVuYzhiaXR9IChub24tYWxwaGFiZXRpYyBjaGFyYWN0ZXJzIGluIEFTQ0lJIHJhbmdlIDEyOC0yNTUgLSBjdXJyZW5jeSwgc3ltYm9scywgc3VwZXJzY3JpcHRzLCBkaWFjcml0aWNhbHMsIGV0Yy4pDQogICAgIC0gTHtwcmludGFibGVzfSAoYW55IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcikNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIGEgd29yZCBjb21wb3NlZCBvZiBkaWdpdHMNCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykgIyBlcXVpdmFsZW50IHRvIFdvcmQoIjAxMjM0NTY3ODkiKSBvciBXb3JkKHNyYW5nZSgiMC05IikpDQogICAgICAgIA0KICAgICAgICAjIGEgd29yZCB3aXRoIGEgbGVhZGluZyBjYXBpdGFsLCBhbmQgemVybyBvciBtb3JlIGxvd2VyY2FzZQ0KICAgICAgICBjYXBpdGFsX3dvcmQgPSBXb3JkKGFscGhhcy51cHBlcigpLCBhbHBoYXMubG93ZXIoKSkNCg0KICAgICAgICAjIGhvc3RuYW1lcyBhcmUgYWxwaGFudW1lcmljLCB3aXRoIGxlYWRpbmcgYWxwaGEsIGFuZCAnLScNCiAgICAgICAgaG9zdG5hbWUgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zKyctJykNCiAgICAgICAgDQogICAgICAgICMgcm9tYW4gbnVtZXJhbCAobm90IGEgc3RyaWN0IHBhcnNlciwgYWNjZXB0cyBpbnZhbGlkIG1peCBvZiBjaGFyYWN0ZXJzKQ0KICAgICAgICByb21hbiA9IFdvcmQoIklWWExDRE0iKQ0KICAgICAgICANCiAgICAgICAgIyBhbnkgc3RyaW5nIG9mIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMsIGV4Y2VwdCBmb3IgJywnDQogICAgICAgIGNzdl92YWx1ZSA9IFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPSIsIikNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGluaXRDaGFycywgYm9keUNoYXJzPU5vbmUsIG1pbj0xLCBtYXg9MCwgZXhhY3Q9MCwgYXNLZXl3b3JkPUZhbHNlLCBleGNsdWRlQ2hhcnM9Tm9uZSApOg0KICAgICAgICBzdXBlcihXb3JkLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgaWYgZXhjbHVkZUNoYXJzOg0KICAgICAgICAgICAgaW5pdENoYXJzID0gJycuam9pbihjIGZvciBjIGluIGluaXRDaGFycyBpZiBjIG5vdCBpbiBleGNsdWRlQ2hhcnMpDQogICAgICAgICAgICBpZiBib2R5Q2hhcnM6DQogICAgICAgICAgICAgICAgYm9keUNoYXJzID0gJycuam9pbihjIGZvciBjIGluIGJvZHlDaGFycyBpZiBjIG5vdCBpbiBleGNsdWRlQ2hhcnMpDQogICAgICAgIHNlbGYuaW5pdENoYXJzT3JpZyA9IGluaXRDaGFycw0KICAgICAgICBzZWxmLmluaXRDaGFycyA9IHNldChpbml0Q2hhcnMpDQogICAgICAgIGlmIGJvZHlDaGFycyA6DQogICAgICAgICAgICBzZWxmLmJvZHlDaGFyc09yaWcgPSBib2R5Q2hhcnMNCiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzID0gc2V0KGJvZHlDaGFycykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzT3JpZyA9IGluaXRDaGFycw0KICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnMgPSBzZXQoaW5pdENoYXJzKQ0KDQogICAgICAgIHNlbGYubWF4U3BlY2lmaWVkID0gbWF4ID4gMA0KDQogICAgICAgIGlmIG1pbiA8IDE6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3Qgc3BlY2lmeSBhIG1pbmltdW0gbGVuZ3RoIDwgMTsgdXNlIE9wdGlvbmFsKFdvcmQoKSkgaWYgemVyby1sZW5ndGggd29yZCBpcyBwZXJtaXR0ZWQiKQ0KDQogICAgICAgIHNlbGYubWluTGVuID0gbWluDQoNCiAgICAgICAgaWYgbWF4ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gbWF4DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IF9NQVhfSU5UDQoNCiAgICAgICAgaWYgZXhhY3QgPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBleGFjdA0KICAgICAgICAgICAgc2VsZi5taW5MZW4gPSBleGFjdA0KDQogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5hc0tleXdvcmQgPSBhc0tleXdvcmQNCg0KICAgICAgICBpZiAnICcgbm90IGluIHNlbGYuaW5pdENoYXJzT3JpZytzZWxmLmJvZHlDaGFyc09yaWcgYW5kIChtaW49PTEgYW5kIG1heD09MCBhbmQgZXhhY3Q9PTApOg0KICAgICAgICAgICAgaWYgc2VsZi5ib2R5Q2hhcnNPcmlnID09IHNlbGYuaW5pdENoYXJzT3JpZzoNCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gIlslc10rIiAlIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5pbml0Q2hhcnNPcmlnKQ0KICAgICAgICAgICAgZWxpZiBsZW4oc2VsZi5pbml0Q2hhcnNPcmlnKSA9PSAxOg0KICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSAiJXNbJXNdKiIgJSBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZS5lc2NhcGUoc2VsZi5pbml0Q2hhcnNPcmlnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmJvZHlDaGFyc09yaWcpLCkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9ICJbJXNdWyVzXSoiICUgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmluaXRDaGFyc09yaWcpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuYm9keUNoYXJzT3JpZyksKQ0KICAgICAgICAgICAgaWYgc2VsZi5hc0tleXdvcmQ6DQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHIiXGIiK3NlbGYucmVTdHJpbmcrciJcYiINCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBzZWxmLnJlID0gcmUuY29tcGlsZSggc2VsZi5yZVN0cmluZyApDQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgIHNlbGYucmUgPSBOb25lDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLnJlOg0KICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5yZS5tYXRjaChpbnN0cmluZyxsb2MpDQogICAgICAgICAgICBpZiBub3QgcmVzdWx0Og0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgICAgICBsb2MgPSByZXN1bHQuZW5kKCkNCiAgICAgICAgICAgIHJldHVybiBsb2MsIHJlc3VsdC5ncm91cCgpDQoNCiAgICAgICAgaWYgbm90KGluc3RyaW5nWyBsb2MgXSBpbiBzZWxmLmluaXRDaGFycyk6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICBzdGFydCA9IGxvYw0KICAgICAgICBsb2MgKz0gMQ0KICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgYm9keWNoYXJzID0gc2VsZi5ib2R5Q2hhcnMNCiAgICAgICAgbWF4bG9jID0gc3RhcnQgKyBzZWxmLm1heExlbg0KICAgICAgICBtYXhsb2MgPSBtaW4oIG1heGxvYywgaW5zdHJsZW4gKQ0KICAgICAgICB3aGlsZSBsb2MgPCBtYXhsb2MgYW5kIGluc3RyaW5nW2xvY10gaW4gYm9keWNoYXJzOg0KICAgICAgICAgICAgbG9jICs9IDENCg0KICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IEZhbHNlDQogICAgICAgIGlmIGxvYyAtIHN0YXJ0IDwgc2VsZi5taW5MZW46DQogICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IFRydWUNCiAgICAgICAgaWYgc2VsZi5tYXhTcGVjaWZpZWQgYW5kIGxvYyA8IGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdIGluIGJvZHljaGFyczoNCiAgICAgICAgICAgIHRocm93RXhjZXB0aW9uID0gVHJ1ZQ0KICAgICAgICBpZiBzZWxmLmFzS2V5d29yZDoNCiAgICAgICAgICAgIGlmIChzdGFydD4wIGFuZCBpbnN0cmluZ1tzdGFydC0xXSBpbiBib2R5Y2hhcnMpIG9yIChsb2M8aW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10gaW4gYm9keWNoYXJzKToNCiAgICAgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IFRydWUNCg0KICAgICAgICBpZiB0aHJvd0V4Y2VwdGlvbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIHJldHVybiBsb2MsIGluc3RyaW5nW3N0YXJ0OmxvY10NCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihXb3JkLHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQoNCiAgICAgICAgICAgIGRlZiBjaGFyc0FzU3RyKHMpOg0KICAgICAgICAgICAgICAgIGlmIGxlbihzKT40Og0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gc1s6NF0rIi4uLiINCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcw0KDQogICAgICAgICAgICBpZiAoIHNlbGYuaW5pdENoYXJzT3JpZyAhPSBzZWxmLmJvZHlDaGFyc09yaWcgKToNCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiVzooJXMsJXMpIiAlICggY2hhcnNBc1N0cihzZWxmLmluaXRDaGFyc09yaWcpLCBjaGFyc0FzU3RyKHNlbGYuYm9keUNoYXJzT3JpZykgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiVzooJXMpIiAlIGNoYXJzQXNTdHIoc2VsZi5pbml0Q2hhcnNPcmlnKQ0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBSZWdleChUb2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHN0cmluZ3MgdGhhdCBtYXRjaCBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbi4NCiAgICBEZWZpbmVkIHdpdGggc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbiBhIGZvcm0gcmVjb2duaXplZCBieSB0aGUgaW5idWlsdCBQeXRob24gcmUgbW9kdWxlLg0KICAgIElmIHRoZSBnaXZlbiByZWdleCBjb250YWlucyBuYW1lZCBncm91cHMgKGRlZmluZWQgdXNpbmcgQ3soP1A8bmFtZT4uLi4pfSksIHRoZXNlIHdpbGwgYmUgcHJlc2VydmVkIGFzIA0KICAgIG5hbWVkIHBhcnNlIHJlc3VsdHMuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcmVhbG51bSA9IFJlZ2V4KHIiWystXT9cZCtcLlxkKiIpDQogICAgICAgIGRhdGUgPSBSZWdleChyJyg/UDx5ZWFyPlxkezR9KS0oP1A8bW9udGg+XGRcZD8pLSg/UDxkYXk+XGRcZD8pJykNCiAgICAgICAgIyByZWY6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjY3Mzk5L2hvdy1kby15b3UtbWF0Y2gtb25seS12YWxpZC1yb21hbi1udW1lcmFscy13aXRoLWEtcmVndWxhci1leHByZXNzaW9uDQogICAgICAgIHJvbWFuID0gUmVnZXgociJNezAsNH0oQ018Q0R8RD9DezAsM30pKFhDfFhMfEw/WHswLDN9KShJWHxJVnxWP0l7MCwzfSkiKQ0KICAgICIiIg0KICAgIGNvbXBpbGVkUkV0eXBlID0gdHlwZShyZS5jb21waWxlKCJbQS1aXSIpKQ0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcGF0dGVybiwgZmxhZ3M9MCk6DQogICAgICAgICIiIlRoZSBwYXJhbWV0ZXJzIEN7cGF0dGVybn0gYW5kIEN7ZmxhZ3N9IGFyZSBwYXNzZWQgdG8gdGhlIEN7cmUuY29tcGlsZSgpfSBmdW5jdGlvbiBhcy1pcy4gU2VlIHRoZSBQeXRob24gQ3tyZX0gbW9kdWxlIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgYWNjZXB0YWJsZSBwYXR0ZXJucyBhbmQgZmxhZ3MuIiIiDQogICAgICAgIHN1cGVyKFJlZ2V4LHNlbGYpLl9faW5pdF9fKCkNCg0KICAgICAgICBpZiBpc2luc3RhbmNlKHBhdHRlcm4sIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgaWYgbm90IHBhdHRlcm46DQogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigibnVsbCBzdHJpbmcgcGFzc2VkIHRvIFJlZ2V4OyB1c2UgRW1wdHkoKSBpbnN0ZWFkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCg0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gcGF0dGVybg0KICAgICAgICAgICAgc2VsZi5mbGFncyA9IGZsYWdzDQoNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBzZWxmLnJlID0gcmUuY29tcGlsZShzZWxmLnBhdHRlcm4sIHNlbGYuZmxhZ3MpDQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHNlbGYucGF0dGVybg0KICAgICAgICAgICAgZXhjZXB0IHNyZV9jb25zdGFudHMuZXJyb3I6DQogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiaW52YWxpZCBwYXR0ZXJuICglcykgcGFzc2VkIHRvIFJlZ2V4IiAlIHBhdHRlcm4sDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgICAgICByYWlzZQ0KDQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBSZWdleC5jb21waWxlZFJFdHlwZSk6DQogICAgICAgICAgICBzZWxmLnJlID0gcGF0dGVybg0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gXA0KICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHN0cihwYXR0ZXJuKQ0KICAgICAgICAgICAgc2VsZi5mbGFncyA9IGZsYWdzDQogICAgICAgICAgICANCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlJlZ2V4IG1heSBvbmx5IGJlIGNvbnN0cnVjdGVkIHdpdGggYSBzdHJpbmcgb3IgYSBjb21waWxlZCBSRSBvYmplY3QiKQ0KDQogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHJlc3VsdCA9IHNlbGYucmUubWF0Y2goaW5zdHJpbmcsbG9jKQ0KICAgICAgICBpZiBub3QgcmVzdWx0Og0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgbG9jID0gcmVzdWx0LmVuZCgpDQogICAgICAgIGQgPSByZXN1bHQuZ3JvdXBkaWN0KCkNCiAgICAgICAgcmV0ID0gUGFyc2VSZXN1bHRzKHJlc3VsdC5ncm91cCgpKQ0KICAgICAgICBpZiBkOg0KICAgICAgICAgICAgZm9yIGsgaW4gZDoNCiAgICAgICAgICAgICAgICByZXRba10gPSBkW2tdDQogICAgICAgIHJldHVybiBsb2MscmV0DQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoUmVnZXgsc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiUmU6KCVzKSIgJSByZXByKHNlbGYucGF0dGVybikNCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCg0KY2xhc3MgUXVvdGVkU3RyaW5nKFRva2VuKToNCiAgICByIiIiDQogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHN0cmluZ3MgdGhhdCBhcmUgZGVsaW1pdGVkIGJ5IHF1b3RpbmcgY2hhcmFjdGVycy4NCiAgICANCiAgICBEZWZpbmVkIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOg0KICAgICAgICAtIHF1b3RlQ2hhciAtIHN0cmluZyBvZiBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGRlZmluaW5nIHRoZSBxdW90ZSBkZWxpbWl0aW5nIHN0cmluZw0KICAgICAgICAtIGVzY0NoYXIgLSBjaGFyYWN0ZXIgdG8gZXNjYXBlIHF1b3RlcywgdHlwaWNhbGx5IGJhY2tzbGFzaCAoZGVmYXVsdD1De05vbmV9KQ0KICAgICAgICAtIGVzY1F1b3RlIC0gc3BlY2lhbCBxdW90ZSBzZXF1ZW5jZSB0byBlc2NhcGUgYW4gZW1iZWRkZWQgcXVvdGUgc3RyaW5nIChzdWNoIGFzIFNRTCdzICIiIHRvIGVzY2FwZSBhbiBlbWJlZGRlZCAiKSAoZGVmYXVsdD1De05vbmV9KQ0KICAgICAgICAtIG11bHRpbGluZSAtIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHF1b3RlcyBjYW4gc3BhbiBtdWx0aXBsZSBsaW5lcyAoZGVmYXVsdD1De0ZhbHNlfSkNCiAgICAgICAgLSB1bnF1b3RlUmVzdWx0cyAtIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXRjaGVkIHRleHQgc2hvdWxkIGJlIHVucXVvdGVkIChkZWZhdWx0PUN7VHJ1ZX0pDQogICAgICAgIC0gZW5kUXVvdGVDaGFyIC0gc3RyaW5nIG9mIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgZGVmaW5pbmcgdGhlIGVuZCBvZiB0aGUgcXVvdGUgZGVsaW1pdGVkIHN0cmluZyAoZGVmYXVsdD1De05vbmV9ID0+IHNhbWUgYXMgcXVvdGVDaGFyKQ0KICAgICAgICAtIGNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcyAtIGNvbnZlcnQgZXNjYXBlZCB3aGl0ZXNwYWNlIChDeydcdCd9LCBDeydcbid9LCBldGMuKSB0byBhY3R1YWwgd2hpdGVzcGFjZSAoZGVmYXVsdD1De1RydWV9KQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHFzID0gUXVvdGVkU3RyaW5nKCciJykNCiAgICAgICAgcHJpbnQocXMuc2VhcmNoU3RyaW5nKCdsc2pkZiAiVGhpcyBpcyB0aGUgcXVvdGUiIHNsZGpmJykpDQogICAgICAgIGNvbXBsZXhfcXMgPSBRdW90ZWRTdHJpbmcoJ3t7JywgZW5kUXVvdGVDaGFyPSd9fScpDQogICAgICAgIHByaW50KGNvbXBsZXhfcXMuc2VhcmNoU3RyaW5nKCdsc2pkZiB7e1RoaXMgaXMgdGhlICJxdW90ZSJ9fSBzbGRqZicpKQ0KICAgICAgICBzcWxfcXMgPSBRdW90ZWRTdHJpbmcoJyInLCBlc2NRdW90ZT0nIiInKQ0KICAgICAgICBwcmludChzcWxfcXMuc2VhcmNoU3RyaW5nKCdsc2pkZiAiVGhpcyBpcyB0aGUgcXVvdGUgd2l0aCAiImVtYmVkZGVkIiIgcXVvdGVzIiBzbGRqZicpKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJ1RoaXMgaXMgdGhlIHF1b3RlJ11dDQogICAgICAgIFtbJ1RoaXMgaXMgdGhlICJxdW90ZSInXV0NCiAgICAgICAgW1snVGhpcyBpcyB0aGUgcXVvdGUgd2l0aCAiZW1iZWRkZWQiIHF1b3RlcyddXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcXVvdGVDaGFyLCBlc2NDaGFyPU5vbmUsIGVzY1F1b3RlPU5vbmUsIG11bHRpbGluZT1GYWxzZSwgdW5xdW90ZVJlc3VsdHM9VHJ1ZSwgZW5kUXVvdGVDaGFyPU5vbmUsIGNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcz1UcnVlKToNCiAgICAgICAgc3VwZXIoUXVvdGVkU3RyaW5nLHNlbGYpLl9faW5pdF9fKCkNCg0KICAgICAgICAjIHJlbW92ZSB3aGl0ZSBzcGFjZSBmcm9tIHF1b3RlIGNoYXJzIC0gd29udCB3b3JrIGFueXdheQ0KICAgICAgICBxdW90ZUNoYXIgPSBxdW90ZUNoYXIuc3RyaXAoKQ0KICAgICAgICBpZiBub3QgcXVvdGVDaGFyOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigicXVvdGVDaGFyIGNhbm5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nIixTeW50YXhXYXJuaW5nLHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCkNCg0KICAgICAgICBpZiBlbmRRdW90ZUNoYXIgaXMgTm9uZToNCiAgICAgICAgICAgIGVuZFF1b3RlQ2hhciA9IHF1b3RlQ2hhcg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgZW5kUXVvdGVDaGFyID0gZW5kUXVvdGVDaGFyLnN0cmlwKCkNCiAgICAgICAgICAgIGlmIG5vdCBlbmRRdW90ZUNoYXI6DQogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiZW5kUXVvdGVDaGFyIGNhbm5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nIixTeW50YXhXYXJuaW5nLHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigpDQoNCiAgICAgICAgc2VsZi5xdW90ZUNoYXIgPSBxdW90ZUNoYXINCiAgICAgICAgc2VsZi5xdW90ZUNoYXJMZW4gPSBsZW4ocXVvdGVDaGFyKQ0KICAgICAgICBzZWxmLmZpcnN0UXVvdGVDaGFyID0gcXVvdGVDaGFyWzBdDQogICAgICAgIHNlbGYuZW5kUXVvdGVDaGFyID0gZW5kUXVvdGVDaGFyDQogICAgICAgIHNlbGYuZW5kUXVvdGVDaGFyTGVuID0gbGVuKGVuZFF1b3RlQ2hhcikNCiAgICAgICAgc2VsZi5lc2NDaGFyID0gZXNjQ2hhcg0KICAgICAgICBzZWxmLmVzY1F1b3RlID0gZXNjUXVvdGUNCiAgICAgICAgc2VsZi51bnF1b3RlUmVzdWx0cyA9IHVucXVvdGVSZXN1bHRzDQogICAgICAgIHNlbGYuY29udmVydFdoaXRlc3BhY2VFc2NhcGVzID0gY29udmVydFdoaXRlc3BhY2VFc2NhcGVzDQoNCiAgICAgICAgaWYgbXVsdGlsaW5lOg0KICAgICAgICAgICAgc2VsZi5mbGFncyA9IHJlLk1VTFRJTElORSB8IHJlLkRPVEFMTA0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gciclcyg/OlteJXMlc10nICUgXA0KICAgICAgICAgICAgICAgICggcmUuZXNjYXBlKHNlbGYucXVvdGVDaGFyKSwNCiAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5lbmRRdW90ZUNoYXJbMF0pLA0KICAgICAgICAgICAgICAgICAgKGVzY0NoYXIgaXMgbm90IE5vbmUgYW5kIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoZXNjQ2hhcikgb3IgJycpICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSAwDQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSByJyVzKD86W14lc1xuXHIlc10nICUgXA0KICAgICAgICAgICAgICAgICggcmUuZXNjYXBlKHNlbGYucXVvdGVDaGFyKSwNCiAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5lbmRRdW90ZUNoYXJbMF0pLA0KICAgICAgICAgICAgICAgICAgKGVzY0NoYXIgaXMgbm90IE5vbmUgYW5kIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoZXNjQ2hhcikgb3IgJycpICkNCiAgICAgICAgaWYgbGVuKHNlbGYuZW5kUXVvdGVDaGFyKSA+IDE6DQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKA0KICAgICAgICAgICAgICAgICd8KD86JyArICcpfCg/Oicuam9pbigiJXNbXiVzXSIgJSAocmUuZXNjYXBlKHNlbGYuZW5kUXVvdGVDaGFyWzppXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5lbmRRdW90ZUNoYXJbaV0pKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuZW5kUXVvdGVDaGFyKS0xLDAsLTEpKSArICcpJw0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgaWYgZXNjUXVvdGU6DQogICAgICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKHInfCg/OiVzKScgJSByZS5lc2NhcGUoZXNjUXVvdGUpKQ0KICAgICAgICBpZiBlc2NDaGFyOg0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuICs9IChyJ3woPzolcy4pJyAlIHJlLmVzY2FwZShlc2NDaGFyKSkNCiAgICAgICAgICAgIHNlbGYuZXNjQ2hhclJlcGxhY2VQYXR0ZXJuID0gcmUuZXNjYXBlKHNlbGYuZXNjQ2hhcikrIiguKSINCiAgICAgICAgc2VsZi5wYXR0ZXJuICs9IChyJykqJXMnICUgcmUuZXNjYXBlKHNlbGYuZW5kUXVvdGVDaGFyKSkNCg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzZWxmLnJlID0gcmUuY29tcGlsZShzZWxmLnBhdHRlcm4sIHNlbGYuZmxhZ3MpDQogICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gc2VsZi5wYXR0ZXJuDQogICAgICAgIGV4Y2VwdCBzcmVfY29uc3RhbnRzLmVycm9yOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiaW52YWxpZCBwYXR0ZXJuICglcykgcGFzc2VkIHRvIFJlZ2V4IiAlIHNlbGYucGF0dGVybiwNCiAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByYWlzZQ0KDQogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHJlc3VsdCA9IGluc3RyaW5nW2xvY10gPT0gc2VsZi5maXJzdFF1b3RlQ2hhciBhbmQgc2VsZi5yZS5tYXRjaChpbnN0cmluZyxsb2MpIG9yIE5vbmUNCiAgICAgICAgaWYgbm90IHJlc3VsdDoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIGxvYyA9IHJlc3VsdC5lbmQoKQ0KICAgICAgICByZXQgPSByZXN1bHQuZ3JvdXAoKQ0KDQogICAgICAgIGlmIHNlbGYudW5xdW90ZVJlc3VsdHM6DQoNCiAgICAgICAgICAgICMgc3RyaXAgb2ZmIHF1b3Rlcw0KICAgICAgICAgICAgcmV0ID0gcmV0W3NlbGYucXVvdGVDaGFyTGVuOi1zZWxmLmVuZFF1b3RlQ2hhckxlbl0NCg0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXQsYmFzZXN0cmluZyk6DQogICAgICAgICAgICAgICAgIyByZXBsYWNlIGVzY2FwZWQgd2hpdGVzcGFjZQ0KICAgICAgICAgICAgICAgIGlmICdcXCcgaW4gcmV0IGFuZCBzZWxmLmNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlczoNCiAgICAgICAgICAgICAgICAgICAgd3NfbWFwID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgcidcdCcgOiAnXHQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgcidcbicgOiAnXG4nLA0KICAgICAgICAgICAgICAgICAgICAgICAgcidcZicgOiAnXGYnLA0KICAgICAgICAgICAgICAgICAgICAgICAgcidccicgOiAnXHInLA0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGZvciB3c2xpdCx3c2NoYXIgaW4gd3NfbWFwLml0ZW1zKCk6DQogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXQucmVwbGFjZSh3c2xpdCwgd3NjaGFyKQ0KDQogICAgICAgICAgICAgICAgIyByZXBsYWNlIGVzY2FwZWQgY2hhcmFjdGVycw0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNjQ2hhcjoNCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmUuc3ViKHNlbGYuZXNjQ2hhclJlcGxhY2VQYXR0ZXJuLCJcZzwxPiIscmV0KQ0KDQogICAgICAgICAgICAgICAgIyByZXBsYWNlIGVzY2FwZWQgcXVvdGVzDQogICAgICAgICAgICAgICAgaWYgc2VsZi5lc2NRdW90ZToNCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0LnJlcGxhY2Uoc2VsZi5lc2NRdW90ZSwgc2VsZi5lbmRRdW90ZUNoYXIpDQoNCiAgICAgICAgcmV0dXJuIGxvYywgcmV0DQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoUXVvdGVkU3RyaW5nLHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInF1b3RlZCBzdHJpbmcsIHN0YXJ0aW5nIHdpdGggJXMgZW5kaW5nIHdpdGggJXMiICUgKHNlbGYucXVvdGVDaGFyLCBzZWxmLmVuZFF1b3RlQ2hhcikNCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCg0KY2xhc3MgQ2hhcnNOb3RJbihUb2tlbik6DQogICAgIiIiDQogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHdvcmRzIGNvbXBvc2VkIG9mIGNoYXJhY3RlcnMgSXtub3R9IGluIGEgZ2l2ZW4gc2V0ICh3aWxsDQogICAgaW5jbHVkZSB3aGl0ZXNwYWNlIGluIG1hdGNoZWQgY2hhcmFjdGVycyBpZiBub3QgbGlzdGVkIGluIHRoZSBwcm92aWRlZCBleGNsdXNpb24gc2V0IC0gc2VlIGV4YW1wbGUpLg0KICAgIERlZmluZWQgd2l0aCBzdHJpbmcgY29udGFpbmluZyBhbGwgZGlzYWxsb3dlZCBjaGFyYWN0ZXJzLCBhbmQgYW4gb3B0aW9uYWwNCiAgICBtaW5pbXVtLCBtYXhpbXVtLCBhbmQvb3IgZXhhY3QgbGVuZ3RoLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIEN7bWlufSBpcyAxIChhDQogICAgbWluaW11bSB2YWx1ZSA8IDEgaXMgbm90IHZhbGlkKTsgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBDe21heH0gYW5kIEN7ZXhhY3R9DQogICAgYXJlIDAsIG1lYW5pbmcgbm8gbWF4aW11bSBvciBleGFjdCBsZW5ndGggcmVzdHJpY3Rpb24uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBkZWZpbmUgYSBjb21tYS1zZXBhcmF0ZWQtdmFsdWUgYXMgYW55dGhpbmcgdGhhdCBpcyBub3QgYSAnLCcNCiAgICAgICAgY3N2X3ZhbHVlID0gQ2hhcnNOb3RJbignLCcpDQogICAgICAgIHByaW50KGRlbGltaXRlZExpc3QoY3N2X3ZhbHVlKS5wYXJzZVN0cmluZygiZGtscyxsc2RramYsczEyIDM0LEAhIywyMTMiKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbJ2RrbHMnLCAnbHNka2pmJywgJ3MxMiAzNCcsICdAISMnLCAnMjEzJ10NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG5vdENoYXJzLCBtaW49MSwgbWF4PTAsIGV4YWN0PTAgKToNCiAgICAgICAgc3VwZXIoQ2hhcnNOb3RJbixzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICBzZWxmLm5vdENoYXJzID0gbm90Q2hhcnMNCg0KICAgICAgICBpZiBtaW4gPCAxOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IHNwZWNpZnkgYSBtaW5pbXVtIGxlbmd0aCA8IDE7IHVzZSBPcHRpb25hbChDaGFyc05vdEluKCkpIGlmIHplcm8tbGVuZ3RoIGNoYXIgZ3JvdXAgaXMgcGVybWl0dGVkIikNCg0KICAgICAgICBzZWxmLm1pbkxlbiA9IG1pbg0KDQogICAgICAgIGlmIG1heCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IG1heA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBfTUFYX0lOVA0KDQogICAgICAgIGlmIGV4YWN0ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gZXhhY3QNCiAgICAgICAgICAgIHNlbGYubWluTGVuID0gZXhhY3QNCg0KICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSAoIHNlbGYubWluTGVuID09IDAgKQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgaW5zdHJpbmdbbG9jXSBpbiBzZWxmLm5vdENoYXJzOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgc3RhcnQgPSBsb2MNCiAgICAgICAgbG9jICs9IDENCiAgICAgICAgbm90Y2hhcnMgPSBzZWxmLm5vdENoYXJzDQogICAgICAgIG1heGxlbiA9IG1pbiggc3RhcnQrc2VsZi5tYXhMZW4sIGxlbihpbnN0cmluZykgKQ0KICAgICAgICB3aGlsZSBsb2MgPCBtYXhsZW4gYW5kIFwNCiAgICAgICAgICAgICAgKGluc3RyaW5nW2xvY10gbm90IGluIG5vdGNoYXJzKToNCiAgICAgICAgICAgIGxvYyArPSAxDQoNCiAgICAgICAgaWYgbG9jIC0gc3RhcnQgPCBzZWxmLm1pbkxlbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIHJldHVybiBsb2MsIGluc3RyaW5nW3N0YXJ0OmxvY10NCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihDaGFyc05vdEluLCBzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIGlmIGxlbihzZWxmLm5vdENoYXJzKSA+IDQ6DQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiFXOiglcy4uLikiICUgc2VsZi5ub3RDaGFyc1s6NF0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiFXOiglcykiICUgc2VsZi5ub3RDaGFycw0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KY2xhc3MgV2hpdGUoVG9rZW4pOg0KICAgICIiIg0KICAgIFNwZWNpYWwgbWF0Y2hpbmcgY2xhc3MgZm9yIG1hdGNoaW5nIHdoaXRlc3BhY2UuICBOb3JtYWxseSwgd2hpdGVzcGFjZSBpcyBpZ25vcmVkDQogICAgYnkgcHlwYXJzaW5nIGdyYW1tYXJzLiAgVGhpcyBjbGFzcyBpcyBpbmNsdWRlZCB3aGVuIHNvbWUgd2hpdGVzcGFjZSBzdHJ1Y3R1cmVzDQogICAgYXJlIHNpZ25pZmljYW50LiAgRGVmaW5lIHdpdGggYSBzdHJpbmcgY29udGFpbmluZyB0aGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIGJlDQogICAgbWF0Y2hlZDsgZGVmYXVsdCBpcyBDeyIgXFx0XFxyXFxuIn0uICBBbHNvIHRha2VzIG9wdGlvbmFsIEN7bWlufSwgQ3ttYXh9LCBhbmQgQ3tleGFjdH0gYXJndW1lbnRzLA0KICAgIGFzIGRlZmluZWQgZm9yIHRoZSBDe0x7V29yZH19IGNsYXNzLg0KICAgICIiIg0KICAgIHdoaXRlU3RycyA9IHsNCiAgICAgICAgIiAiIDogIjxTUEM+IiwNCiAgICAgICAgIlx0IjogIjxUQUI+IiwNCiAgICAgICAgIlxuIjogIjxMRj4iLA0KICAgICAgICAiXHIiOiAiPENSPiIsDQogICAgICAgICJcZiI6ICI8RkY+IiwNCiAgICAgICAgfQ0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3cz0iIFx0XHJcbiIsIG1pbj0xLCBtYXg9MCwgZXhhY3Q9MCk6DQogICAgICAgIHN1cGVyKFdoaXRlLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5tYXRjaFdoaXRlID0gd3MNCiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoICIiLmpvaW4oYyBmb3IgYyBpbiBzZWxmLndoaXRlQ2hhcnMgaWYgYyBub3QgaW4gc2VsZi5tYXRjaFdoaXRlKSApDQogICAgICAgICN+IHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkNCiAgICAgICAgc2VsZi5uYW1lID0gKCIiLmpvaW4oV2hpdGUud2hpdGVTdHJzW2NdIGZvciBjIGluIHNlbGYubWF0Y2hXaGl0ZSkpDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCg0KICAgICAgICBzZWxmLm1pbkxlbiA9IG1pbg0KDQogICAgICAgIGlmIG1heCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IG1heA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBfTUFYX0lOVA0KDQogICAgICAgIGlmIGV4YWN0ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gZXhhY3QNCiAgICAgICAgICAgIHNlbGYubWluTGVuID0gZXhhY3QNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIG5vdChpbnN0cmluZ1sgbG9jIF0gaW4gc2VsZi5tYXRjaFdoaXRlKToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICBzdGFydCA9IGxvYw0KICAgICAgICBsb2MgKz0gMQ0KICAgICAgICBtYXhsb2MgPSBzdGFydCArIHNlbGYubWF4TGVuDQogICAgICAgIG1heGxvYyA9IG1pbiggbWF4bG9jLCBsZW4oaW5zdHJpbmcpICkNCiAgICAgICAgd2hpbGUgbG9jIDwgbWF4bG9jIGFuZCBpbnN0cmluZ1tsb2NdIGluIHNlbGYubWF0Y2hXaGl0ZToNCiAgICAgICAgICAgIGxvYyArPSAxDQoNCiAgICAgICAgaWYgbG9jIC0gc3RhcnQgPCBzZWxmLm1pbkxlbjoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIHJldHVybiBsb2MsIGluc3RyaW5nW3N0YXJ0OmxvY10NCg0KDQpjbGFzcyBfUG9zaXRpb25Ub2tlbihUb2tlbik6DQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKF9Qb3NpdGlvblRva2VuLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5uYW1lPXNlbGYuX19jbGFzc19fLl9fbmFtZV9fDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQoNCmNsYXNzIEdvVG9Db2x1bW4oX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIFRva2VuIHRvIGFkdmFuY2UgdG8gYSBzcGVjaWZpYyBjb2x1bW4gb2YgaW5wdXQgdGV4dDsgdXNlZnVsIGZvciB0YWJ1bGFyIHJlcG9ydCBzY3JhcGluZy4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGNvbG5vICk6DQogICAgICAgIHN1cGVyKEdvVG9Db2x1bW4sc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLmNvbCA9IGNvbG5vDQoNCiAgICBkZWYgcHJlUGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToNCiAgICAgICAgaWYgY29sKGxvYyxpbnN0cmluZykgIT0gc2VsZi5jb2w6DQogICAgICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgICAgIGlmIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgbG9jID0gc2VsZi5fc2tpcElnbm9yYWJsZXMoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgd2hpbGUgbG9jIDwgaW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10uaXNzcGFjZSgpIGFuZCBjb2woIGxvYywgaW5zdHJpbmcgKSAhPSBzZWxmLmNvbCA6DQogICAgICAgICAgICAgICAgbG9jICs9IDENCiAgICAgICAgcmV0dXJuIGxvYw0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgdGhpc2NvbCA9IGNvbCggbG9jLCBpbnN0cmluZyApDQogICAgICAgIGlmIHRoaXNjb2wgPiBzZWxmLmNvbDoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbG9jLCAiVGV4dCBub3QgaW4gZXhwZWN0ZWQgY29sdW1uIiwgc2VsZiApDQogICAgICAgIG5ld2xvYyA9IGxvYyArIHNlbGYuY29sIC0gdGhpc2NvbA0KICAgICAgICByZXQgPSBpbnN0cmluZ1sgbG9jOiBuZXdsb2MgXQ0KICAgICAgICByZXR1cm4gbmV3bG9jLCByZXQNCg0KDQpjbGFzcyBMaW5lU3RhcnQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSB3aXRoaW4gdGhlIHBhcnNlIHN0cmluZw0KICAgIA0KICAgIEV4YW1wbGU6Og0KICAgIA0KICAgICAgICB0ZXN0ID0gJycnXA0KICAgICAgICBBQUEgdGhpcyBsaW5lDQogICAgICAgIEFBQSBhbmQgdGhpcyBsaW5lDQogICAgICAgICAgQUFBIGJ1dCBub3QgdGhpcyBvbmUNCiAgICAgICAgQiBBQUEgYW5kIGRlZmluaXRlbHkgbm90IHRoaXMgb25lDQogICAgICAgICcnJw0KDQogICAgICAgIGZvciB0IGluIChMaW5lU3RhcnQoKSArICdBQUEnICsgcmVzdE9mTGluZSkuc2VhcmNoU3RyaW5nKHRlc3QpOg0KICAgICAgICAgICAgcHJpbnQodCkNCiAgICANCiAgICBQcmludHM6Og0KICAgICAgICBbJ0FBQScsICcgdGhpcyBsaW5lJ10NCiAgICAgICAgWydBQUEnLCAnIGFuZCB0aGlzIGxpbmUnXSAgICANCg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihMaW5lU3RhcnQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBzdGFydCBvZiBsaW5lIg0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgY29sKGxvYywgaW5zdHJpbmcpID09IDE6DQogICAgICAgICAgICByZXR1cm4gbG9jLCBbXQ0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KY2xhc3MgTGluZUVuZChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2YgYSBsaW5lIHdpdGhpbiB0aGUgcGFyc2Ugc3RyaW5nDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKExpbmVFbmQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLnJlcGxhY2UoIlxuIiwiIikgKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBlbmQgb2YgbGluZSINCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGxvYzxsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgaWYgaW5zdHJpbmdbbG9jXSA9PSAiXG4iOg0KICAgICAgICAgICAgICAgIHJldHVybiBsb2MrMSwgIlxuIg0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgZWxpZiBsb2MgPT0gbGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgIHJldHVybiBsb2MrMSwgW10NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQpjbGFzcyBTdHJpbmdTdGFydChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcnNlIHN0cmluZw0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihTdHJpbmdTdGFydCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIHN0YXJ0IG9mIHRleHQiDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBsb2MgIT0gMDoNCiAgICAgICAgICAgICMgc2VlIGlmIGVudGlyZSBzdHJpbmcgdXAgdG8gaGVyZSBpcyBqdXN0IHdoaXRlc3BhY2UgYW5kIGlnbm9yZWFibGVzDQogICAgICAgICAgICBpZiBsb2MgIT0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIDAgKToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KY2xhc3MgU3RyaW5nRW5kKF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGVuZCBvZiB0aGUgcGFyc2Ugc3RyaW5nDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6DQogICAgICAgIHN1cGVyKFN0cmluZ0VuZCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIGVuZCBvZiB0ZXh0Ig0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgbG9jIDwgbGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICBlbGlmIGxvYyA9PSBsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgcmV0dXJuIGxvYysxLCBbXQ0KICAgICAgICBlbGlmIGxvYyA+IGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICByZXR1cm4gbG9jLCBbXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCmNsYXNzIFdvcmRTdGFydChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgV29yZCwgYW5kDQogICAgaXMgbm90IHByZWNlZGVkIGJ5IGFueSBjaGFyYWN0ZXIgaW4gYSBnaXZlbiBzZXQgb2YgQ3t3b3JkQ2hhcnN9DQogICAgKGRlZmF1bHQ9Q3twcmludGFibGVzfSkuIFRvIGVtdWxhdGUgdGhlIEN7XGJ9IGJlaGF2aW9yIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMsDQogICAgdXNlIEN7V29yZFN0YXJ0KGFscGhhbnVtcyl9LiBDe1dvcmRTdGFydH0gd2lsbCBhbHNvIG1hdGNoIGF0IHRoZSBiZWdpbm5pbmcgb2YNCiAgICB0aGUgc3RyaW5nIGJlaW5nIHBhcnNlZCwgb3IgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdvcmRDaGFycyA9IHByaW50YWJsZXMpOg0KICAgICAgICBzdXBlcihXb3JkU3RhcnQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLndvcmRDaGFycyA9IHNldCh3b3JkQ2hhcnMpDQogICAgICAgIHNlbGYuZXJybXNnID0gIk5vdCBhdCB0aGUgc3RhcnQgb2YgYSB3b3JkIg0KDQogICAgZGVmIHBhcnNlSW1wbChzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBsb2MgIT0gMDoNCiAgICAgICAgICAgIGlmIChpbnN0cmluZ1tsb2MtMV0gaW4gc2VsZi53b3JkQ2hhcnMgb3INCiAgICAgICAgICAgICAgICBpbnN0cmluZ1tsb2NdIG5vdCBpbiBzZWxmLndvcmRDaGFycyk6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCmNsYXNzIFdvcmRFbmQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGVuZCBvZiBhIFdvcmQsIGFuZA0KICAgIGlzIG5vdCBmb2xsb3dlZCBieSBhbnkgY2hhcmFjdGVyIGluIGEgZ2l2ZW4gc2V0IG9mIEN7d29yZENoYXJzfQ0KICAgIChkZWZhdWx0PUN7cHJpbnRhYmxlc30pLiBUbyBlbXVsYXRlIHRoZSBDe1xifSBiZWhhdmlvciBvZiByZWd1bGFyIGV4cHJlc3Npb25zLA0KICAgIHVzZSBDe1dvcmRFbmQoYWxwaGFudW1zKX0uIEN7V29yZEVuZH0gd2lsbCBhbHNvIG1hdGNoIGF0IHRoZSBlbmQgb2YNCiAgICB0aGUgc3RyaW5nIGJlaW5nIHBhcnNlZCwgb3IgYXQgdGhlIGVuZCBvZiBhIGxpbmUuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdvcmRDaGFycyA9IHByaW50YWJsZXMpOg0KICAgICAgICBzdXBlcihXb3JkRW5kLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi53b3JkQ2hhcnMgPSBzZXQod29yZENoYXJzKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiTm90IGF0IHRoZSBlbmQgb2YgYSB3b3JkIg0KDQogICAgZGVmIHBhcnNlSW1wbChzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgaWYgaW5zdHJsZW4+MCBhbmQgbG9jPGluc3RybGVuOg0KICAgICAgICAgICAgaWYgKGluc3RyaW5nW2xvY10gaW4gc2VsZi53b3JkQ2hhcnMgb3INCiAgICAgICAgICAgICAgICBpbnN0cmluZ1tsb2MtMV0gbm90IGluIHNlbGYud29yZENoYXJzKToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KDQpjbGFzcyBQYXJzZUV4cHJlc3Npb24oUGFyc2VyRWxlbWVudCk6DQogICAgIiIiDQogICAgQWJzdHJhY3Qgc3ViY2xhc3Mgb2YgUGFyc2VyRWxlbWVudCwgZm9yIGNvbWJpbmluZyBhbmQgcG9zdC1wcm9jZXNzaW5nIHBhcnNlZCB0b2tlbnMuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBGYWxzZSApOg0KICAgICAgICBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuX19pbml0X18oc2F2ZWxpc3QpDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIGV4cHJzLCBfZ2VuZXJhdG9yVHlwZSApOg0KICAgICAgICAgICAgZXhwcnMgPSBsaXN0KGV4cHJzKQ0KDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIGV4cHJzLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBzZWxmLmV4cHJzID0gWyBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIGV4cHJzICkgXQ0KICAgICAgICBlbGlmIGlzaW5zdGFuY2UoIGV4cHJzLCBjb2xsZWN0aW9ucy5JdGVyYWJsZSApOg0KICAgICAgICAgICAgZXhwcnMgPSBsaXN0KGV4cHJzKQ0KICAgICAgICAgICAgIyBpZiBzZXF1ZW5jZSBvZiBzdHJpbmdzIHByb3ZpZGVkLCB3cmFwIHdpdGggTGl0ZXJhbA0KICAgICAgICAgICAgaWYgYWxsKGlzaW5zdGFuY2UoZXhwciwgYmFzZXN0cmluZykgZm9yIGV4cHIgaW4gZXhwcnMpOg0KICAgICAgICAgICAgICAgIGV4cHJzID0gbWFwKFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcywgZXhwcnMpDQogICAgICAgICAgICBzZWxmLmV4cHJzID0gbGlzdChleHBycykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gbGlzdCggZXhwcnMgKQ0KICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gWyBleHBycyBdDQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gRmFsc2UNCg0KICAgIGRlZiBfX2dldGl0ZW1fXyggc2VsZiwgaSApOg0KICAgICAgICByZXR1cm4gc2VsZi5leHByc1tpXQ0KDQogICAgZGVmIGFwcGVuZCggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgc2VsZi5leHBycy5hcHBlbmQoIG90aGVyICkNCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOg0KICAgICAgICAiIiJFeHRlbmRzIEN7bGVhdmVXaGl0ZXNwYWNlfSBkZWZpbmVkIGluIGJhc2UgY2xhc3MsIGFuZCBhbHNvIGludm9rZXMgQ3tsZWF2ZVdoaXRlc3BhY2V9IG9uDQogICAgICAgICAgIGFsbCBjb250YWluZWQgZXhwcmVzc2lvbnMuIiIiDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICBzZWxmLmV4cHJzID0gWyBlLmNvcHkoKSBmb3IgZSBpbiBzZWxmLmV4cHJzIF0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUubGVhdmVXaGl0ZXNwYWNlKCkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBTdXBwcmVzcyApOg0KICAgICAgICAgICAgaWYgb3RoZXIgbm90IGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgc3VwZXIoIFBhcnNlRXhwcmVzc2lvbiwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgICAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgICAgICAgICAgZS5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHN1cGVyKCBQYXJzZUV4cHJlc3Npb24sIHNlbGYpLmlnbm9yZSggb3RoZXIgKQ0KICAgICAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgICAgICBlLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIlczooJXMpIiAlICggc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIF91c3RyKHNlbGYuZXhwcnMpICkNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToNCiAgICAgICAgc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLnN0cmVhbWxpbmUoKQ0KDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLnN0cmVhbWxpbmUoKQ0KDQogICAgICAgICMgY29sbGFwc2UgbmVzdGVkIEFuZCdzIG9mIHRoZSBmb3JtIEFuZCggQW5kKCBBbmQoIGEsYiksIGMpLCBkKSB0byBBbmQoIGEsYixjLGQgKQ0KICAgICAgICAjIGJ1dCBvbmx5IGlmIHRoZXJlIGFyZSBubyBwYXJzZSBhY3Rpb25zIG9yIHJlc3VsdHNOYW1lcyBvbiB0aGUgbmVzdGVkIEFuZCdzDQogICAgICAgICMgKGxpa2V3aXNlIGZvciBPcidzIGFuZCBNYXRjaEZpcnN0J3MpDQogICAgICAgIGlmICggbGVuKHNlbGYuZXhwcnMpID09IDIgKToNCiAgICAgICAgICAgIG90aGVyID0gc2VsZi5leHByc1swXQ0KICAgICAgICAgICAgaWYgKCBpc2luc3RhbmNlKCBvdGhlciwgc2VsZi5fX2NsYXNzX18gKSBhbmQNCiAgICAgICAgICAgICAgICAgIG5vdChvdGhlci5wYXJzZUFjdGlvbikgYW5kDQogICAgICAgICAgICAgICAgICBvdGhlci5yZXN1bHRzTmFtZSBpcyBOb25lIGFuZA0KICAgICAgICAgICAgICAgICAgbm90IG90aGVyLmRlYnVnICk6DQogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IG90aGVyLmV4cHJzWzpdICsgWyBzZWxmLmV4cHJzWzFdIF0NCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSB8PSBvdGhlci5tYXlSZXR1cm5FbXB0eQ0KICAgICAgICAgICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciAgfD0gb3RoZXIubWF5SW5kZXhFcnJvcg0KDQogICAgICAgICAgICBvdGhlciA9IHNlbGYuZXhwcnNbLTFdDQogICAgICAgICAgICBpZiAoIGlzaW5zdGFuY2UoIG90aGVyLCBzZWxmLl9fY2xhc3NfXyApIGFuZA0KICAgICAgICAgICAgICAgICAgbm90KG90aGVyLnBhcnNlQWN0aW9uKSBhbmQNCiAgICAgICAgICAgICAgICAgIG90aGVyLnJlc3VsdHNOYW1lIGlzIE5vbmUgYW5kDQogICAgICAgICAgICAgICAgICBub3Qgb3RoZXIuZGVidWcgKToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gc2VsZi5leHByc1s6LTFdICsgb3RoZXIuZXhwcnNbOl0NCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSB8PSBvdGhlci5tYXlSZXR1cm5FbXB0eQ0KICAgICAgICAgICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciAgfD0gb3RoZXIubWF5SW5kZXhFcnJvcg0KDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBfdXN0cihzZWxmKQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXRSZXN1bHRzTmFtZSggc2VsZiwgbmFtZSwgbGlzdEFsbE1hdGNoZXM9RmFsc2UgKToNCiAgICAgICAgcmV0ID0gc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLnNldFJlc3VsdHNOYW1lKG5hbWUsbGlzdEFsbE1hdGNoZXMpDQogICAgICAgIHJldHVybiByZXQNCg0KICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOg0KICAgICAgICB0bXAgPSB2YWxpZGF0ZVRyYWNlWzpdK1tzZWxmXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS52YWxpZGF0ZSh0bXApDQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oIFtdICkNCiAgICAgICAgDQogICAgZGVmIGNvcHkoc2VsZik6DQogICAgICAgIHJldCA9IHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5jb3B5KCkNCiAgICAgICAgcmV0LmV4cHJzID0gW2UuY29weSgpIGZvciBlIGluIHNlbGYuZXhwcnNdDQogICAgICAgIHJldHVybiByZXQNCg0KY2xhc3MgQW5kKFBhcnNlRXhwcmVzc2lvbik6DQogICAgIiIiDQogICAgUmVxdWlyZXMgYWxsIGdpdmVuIEN7UGFyc2VFeHByZXNzaW9ufXMgdG8gYmUgZm91bmQgaW4gdGhlIGdpdmVuIG9yZGVyLg0KICAgIEV4cHJlc3Npb25zIG1heSBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4NCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7JysnfSBvcGVyYXRvci4NCiAgICBNYXkgYWxzbyBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snLSd9IG9wZXJhdG9yLCB3aGljaCB3aWxsIHN1cHByZXNzIGJhY2t0cmFja2luZy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICBuYW1lX2V4cHIgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQ0KDQogICAgICAgIGV4cHIgPSBBbmQoW2ludGVnZXIoImlkIiksbmFtZV9leHByKCJuYW1lIiksaW50ZWdlcigiYWdlIildKQ0KICAgICAgICAjIG1vcmUgZWFzaWx5IHdyaXR0ZW4gYXM6DQogICAgICAgIGV4cHIgPSBpbnRlZ2VyKCJpZCIpICsgbmFtZV9leHByKCJuYW1lIikgKyBpbnRlZ2VyKCJhZ2UiKQ0KICAgICIiIg0KDQogICAgY2xhc3MgX0Vycm9yU3RvcChFbXB0eSk6DQogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOg0KICAgICAgICAgICAgc3VwZXIoQW5kLl9FcnJvclN0b3Asc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQ0KICAgICAgICAgICAgc2VsZi5uYW1lID0gJy0nDQogICAgICAgICAgICBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpDQoNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IFRydWUgKToNCiAgICAgICAgc3VwZXIoQW5kLHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFsbChlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpDQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBzZWxmLmV4cHJzWzBdLndoaXRlQ2hhcnMgKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gc2VsZi5leHByc1swXS5za2lwV2hpdGVzcGFjZQ0KICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgICMgcGFzcyBGYWxzZSBhcyBsYXN0IGFyZyB0byBfcGFyc2UgZm9yIGZpcnN0IGVsZW1lbnQsIHNpbmNlIHdlIGFscmVhZHkNCiAgICAgICAgIyBwcmUtcGFyc2VkIHRoZSBzdHJpbmcgYXMgcGFydCBvZiBvdXIgQW5kIHByZS1wYXJzaW5nDQogICAgICAgIGxvYywgcmVzdWx0bGlzdCA9IHNlbGYuZXhwcnNbMF0uX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApDQogICAgICAgIGVycm9yU3RvcCA9IEZhbHNlDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnNbMTpdOg0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlLCBBbmQuX0Vycm9yU3RvcCk6DQogICAgICAgICAgICAgICAgZXJyb3JTdG9wID0gVHJ1ZQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICBpZiBlcnJvclN0b3A6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBsb2MsIGV4cHJ0b2tlbnMgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VTeW50YXhFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBwZToNCiAgICAgICAgICAgICAgICAgICAgcGUuX190cmFjZWJhY2tfXyA9IE5vbmUNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VTeW50YXhFeGNlcHRpb24uX2Zyb21fZXhjZXB0aW9uKHBlKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZVN5bnRheEV4Y2VwdGlvbihpbnN0cmluZywgbGVuKGluc3RyaW5nKSwgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGxvYywgZXhwcnRva2VucyA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgaWYgZXhwcnRva2VucyBvciBleHBydG9rZW5zLmhhc2tleXMoKToNCiAgICAgICAgICAgICAgICByZXN1bHRsaXN0ICs9IGV4cHJ0b2tlbnMNCiAgICAgICAgcmV0dXJuIGxvYywgcmVzdWx0bGlzdA0KDQogICAgZGVmIF9faWFkZF9fKHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICByZXR1cm4gc2VsZi5hcHBlbmQoIG90aGVyICkgI0FuZCggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApDQogICAgICAgICAgICBpZiBub3QgZS5tYXlSZXR1cm5FbXB0eToNCiAgICAgICAgICAgICAgICBicmVhaw0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9Ig0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBPcihQYXJzZUV4cHJlc3Npb24pOg0KICAgICIiIg0KICAgIFJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIEN7UGFyc2VFeHByZXNzaW9ufSBpcyBmb3VuZC4NCiAgICBJZiB0d28gZXhwcmVzc2lvbnMgbWF0Y2gsIHRoZSBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyB0aGUgbG9uZ2VzdCBzdHJpbmcgd2lsbCBiZSB1c2VkLg0KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snXid9IG9wZXJhdG9yLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgY29uc3RydWN0IE9yIHVzaW5nICdeJyBvcGVyYXRvcg0KICAgICAgICANCiAgICAgICAgbnVtYmVyID0gV29yZChudW1zKSBeIENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpDQogICAgICAgIHByaW50KG51bWJlci5zZWFyY2hTdHJpbmcoIjEyMyAzLjE0MTYgNzg5IikpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snMTIzJ10sIFsnMy4xNDE2J10sIFsnNzg5J11dDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBGYWxzZSApOg0KICAgICAgICBzdXBlcihPcixzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpDQogICAgICAgIGlmIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYW55KGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBtYXhFeGNMb2MgPSAtMQ0KICAgICAgICBtYXhFeGNlcHRpb24gPSBOb25lDQogICAgICAgIG1hdGNoZXMgPSBbXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGxvYzIgPSBlLnRyeVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlcnI6DQogICAgICAgICAgICAgICAgZXJyLl9fdHJhY2ViYWNrX18gPSBOb25lDQogICAgICAgICAgICAgICAgaWYgZXJyLmxvYyA+IG1heEV4Y0xvYzoNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gZXJyDQogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGVyci5sb2MNCiAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgICAgIGlmIGxlbihpbnN0cmluZykgPiBtYXhFeGNMb2M6DQogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLGxlbihpbnN0cmluZyksZS5lcnJtc2csc2VsZikNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIHNhdmUgbWF0Y2ggYW1vbmcgYWxsIG1hdGNoZXMsIHRvIHJldHJ5IGxvbmdlc3QgdG8gc2hvcnRlc3QNCiAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCgobG9jMiwgZSkpDQoNCiAgICAgICAgaWYgbWF0Y2hlczoNCiAgICAgICAgICAgIG1hdGNoZXMuc29ydChrZXk9bGFtYmRhIHg6IC14WzBdKQ0KICAgICAgICAgICAgZm9yIF8sZSBpbiBtYXRjaGVzOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlcnI6DQogICAgICAgICAgICAgICAgICAgIGVyci5fX3RyYWNlYmFja19fID0gTm9uZQ0KICAgICAgICAgICAgICAgICAgICBpZiBlcnIubG9jID4gbWF4RXhjTG9jOg0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gZXJyDQogICAgICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBlcnIubG9jDQoNCiAgICAgICAgaWYgbWF4RXhjZXB0aW9uIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgbWF4RXhjZXB0aW9uLm1zZyA9IHNlbGYuZXJybXNnDQogICAgICAgICAgICByYWlzZSBtYXhFeGNlcHRpb24NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsICJubyBkZWZpbmVkIGFsdGVybmF0aXZlcyB0byBtYXRjaCIsIHNlbGYpDQoNCg0KICAgIGRlZiBfX2l4b3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgcmV0dXJuIHNlbGYuYXBwZW5kKCBvdGhlciApICNPciggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiBeICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9Ig0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApDQoNCg0KY2xhc3MgTWF0Y2hGaXJzdChQYXJzZUV4cHJlc3Npb24pOg0KICAgICIiIg0KICAgIFJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIEN7UGFyc2VFeHByZXNzaW9ufSBpcyBmb3VuZC4NCiAgICBJZiB0d28gZXhwcmVzc2lvbnMgbWF0Y2gsIHRoZSBmaXJzdCBvbmUgbGlzdGVkIGlzIHRoZSBvbmUgdGhhdCB3aWxsIG1hdGNoLg0KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snfCd9IG9wZXJhdG9yLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgY29uc3RydWN0IE1hdGNoRmlyc3QgdXNpbmcgJ3wnIG9wZXJhdG9yDQogICAgICAgIA0KICAgICAgICAjIHdhdGNoIHRoZSBvcmRlciBvZiBleHByZXNzaW9ucyB0byBtYXRjaA0KICAgICAgICBudW1iZXIgPSBXb3JkKG51bXMpIHwgQ29tYmluZShXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKSkNCiAgICAgICAgcHJpbnQobnVtYmVyLnNlYXJjaFN0cmluZygiMTIzIDMuMTQxNiA3ODkiKSkgIyAgRmFpbCEgLT4gW1snMTIzJ10sIFsnMyddLCBbJzE0MTYnXSwgWyc3ODknXV0NCg0KICAgICAgICAjIHB1dCBtb3JlIHNlbGVjdGl2ZSBleHByZXNzaW9uIGZpcnN0DQogICAgICAgIG51bWJlciA9IENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpIHwgV29yZChudW1zKQ0KICAgICAgICBwcmludChudW1iZXIuc2VhcmNoU3RyaW5nKCIxMjMgMy4xNDE2IDc4OSIpKSAjICBCZXR0ZXIgLT4gW1snMTIzJ10sIFsnMy4xNDE2J10sIFsnNzg5J11dDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBGYWxzZSApOg0KICAgICAgICBzdXBlcihNYXRjaEZpcnN0LHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkNCiAgICAgICAgaWYgc2VsZi5leHByczoNCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbnkoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIG1heEV4Y0xvYyA9IC0xDQogICAgICAgIG1heEV4Y2VwdGlvbiA9IE5vbmUNCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICByZXQgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICByZXR1cm4gcmV0DQogICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZXJyOg0KICAgICAgICAgICAgICAgIGlmIGVyci5sb2MgPiBtYXhFeGNMb2M6DQogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IGVycg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBlcnIubG9jDQogICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgICAgICBpZiBsZW4oaW5zdHJpbmcpID4gbWF4RXhjTG9jOg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZyxsZW4oaW5zdHJpbmcpLGUuZXJybXNnLHNlbGYpDQogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGxlbihpbnN0cmluZykNCg0KICAgICAgICAjIG9ubHkgZ290IGhlcmUgaWYgbm8gZXhwcmVzc2lvbiBtYXRjaGVkLCByYWlzZSBleGNlcHRpb24gZm9yIG1hdGNoIHRoYXQgbWFkZSBpdCB0aGUgZnVydGhlc3QNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIG1heEV4Y2VwdGlvbiBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24ubXNnID0gc2VsZi5lcnJtc2cNCiAgICAgICAgICAgICAgICByYWlzZSBtYXhFeGNlcHRpb24NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgIm5vIGRlZmluZWQgYWx0ZXJuYXRpdmVzIHRvIG1hdGNoIiwgc2VsZikNCg0KICAgIGRlZiBfX2lvcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICByZXR1cm4gc2VsZi5hcHBlbmQoIG90aGVyICkgI01hdGNoRmlyc3QoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgfCAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gc2VsZi5leHBycykgKyAifSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQ0KDQoNCmNsYXNzIEVhY2goUGFyc2VFeHByZXNzaW9uKToNCiAgICAiIiINCiAgICBSZXF1aXJlcyBhbGwgZ2l2ZW4gQ3tQYXJzZUV4cHJlc3Npb259cyB0byBiZSBmb3VuZCwgYnV0IGluIGFueSBvcmRlci4NCiAgICBFeHByZXNzaW9ucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuDQogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeycmJ30gb3BlcmF0b3IuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgY29sb3IgPSBvbmVPZigiUkVEIE9SQU5HRSBZRUxMT1cgR1JFRU4gQkxVRSBQVVJQTEUgQkxBQ0sgV0hJVEUgQlJPV04iKQ0KICAgICAgICBzaGFwZV90eXBlID0gb25lT2YoIlNRVUFSRSBDSVJDTEUgVFJJQU5HTEUgU1RBUiBIRVhBR09OIE9DVEFHT04iKQ0KICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICBzaGFwZV9hdHRyID0gInNoYXBlOiIgKyBzaGFwZV90eXBlKCJzaGFwZSIpDQogICAgICAgIHBvc25fYXR0ciA9ICJwb3NuOiIgKyBHcm91cChpbnRlZ2VyKCJ4IikgKyAnLCcgKyBpbnRlZ2VyKCJ5IikpKCJwb3NuIikNCiAgICAgICAgY29sb3JfYXR0ciA9ICJjb2xvcjoiICsgY29sb3IoImNvbG9yIikNCiAgICAgICAgc2l6ZV9hdHRyID0gInNpemU6IiArIGludGVnZXIoInNpemUiKQ0KDQogICAgICAgICMgdXNlIEVhY2ggKHVzaW5nIG9wZXJhdG9yICcmJykgdG8gYWNjZXB0IGF0dHJpYnV0ZXMgaW4gYW55IG9yZGVyIA0KICAgICAgICAjIChzaGFwZSBhbmQgcG9zbiBhcmUgcmVxdWlyZWQsIGNvbG9yIGFuZCBzaXplIGFyZSBvcHRpb25hbCkNCiAgICAgICAgc2hhcGVfc3BlYyA9IHNoYXBlX2F0dHIgJiBwb3NuX2F0dHIgJiBPcHRpb25hbChjb2xvcl9hdHRyKSAmIE9wdGlvbmFsKHNpemVfYXR0cikNCg0KICAgICAgICBzaGFwZV9zcGVjLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgc2hhcGU6IFNRVUFSRSBjb2xvcjogQkxBQ0sgcG9zbjogMTAwLCAxMjANCiAgICAgICAgICAgIHNoYXBlOiBDSVJDTEUgc2l6ZTogNTAgY29sb3I6IEJMVUUgcG9zbjogNTAsODANCiAgICAgICAgICAgIGNvbG9yOkdSRUVOIHNpemU6MjAgc2hhcGU6VFJJQU5HTEUgcG9zbjoyMCw0MA0KICAgICAgICAgICAgJycnDQogICAgICAgICAgICApDQogICAgcHJpbnRzOjoNCiAgICAgICAgc2hhcGU6IFNRVUFSRSBjb2xvcjogQkxBQ0sgcG9zbjogMTAwLCAxMjANCiAgICAgICAgWydzaGFwZTonLCAnU1FVQVJFJywgJ2NvbG9yOicsICdCTEFDSycsICdwb3NuOicsIFsnMTAwJywgJywnLCAnMTIwJ11dDQogICAgICAgIC0gY29sb3I6IEJMQUNLDQogICAgICAgIC0gcG9zbjogWycxMDAnLCAnLCcsICcxMjAnXQ0KICAgICAgICAgIC0geDogMTAwDQogICAgICAgICAgLSB5OiAxMjANCiAgICAgICAgLSBzaGFwZTogU1FVQVJFDQoNCg0KICAgICAgICBzaGFwZTogQ0lSQ0xFIHNpemU6IDUwIGNvbG9yOiBCTFVFIHBvc246IDUwLDgwDQogICAgICAgIFsnc2hhcGU6JywgJ0NJUkNMRScsICdzaXplOicsICc1MCcsICdjb2xvcjonLCAnQkxVRScsICdwb3NuOicsIFsnNTAnLCAnLCcsICc4MCddXQ0KICAgICAgICAtIGNvbG9yOiBCTFVFDQogICAgICAgIC0gcG9zbjogWyc1MCcsICcsJywgJzgwJ10NCiAgICAgICAgICAtIHg6IDUwDQogICAgICAgICAgLSB5OiA4MA0KICAgICAgICAtIHNoYXBlOiBDSVJDTEUNCiAgICAgICAgLSBzaXplOiA1MA0KDQoNCiAgICAgICAgY29sb3I6IEdSRUVOIHNpemU6IDIwIHNoYXBlOiBUUklBTkdMRSBwb3NuOiAyMCw0MA0KICAgICAgICBbJ2NvbG9yOicsICdHUkVFTicsICdzaXplOicsICcyMCcsICdzaGFwZTonLCAnVFJJQU5HTEUnLCAncG9zbjonLCBbJzIwJywgJywnLCAnNDAnXV0NCiAgICAgICAgLSBjb2xvcjogR1JFRU4NCiAgICAgICAgLSBwb3NuOiBbJzIwJywgJywnLCAnNDAnXQ0KICAgICAgICAgIC0geDogMjANCiAgICAgICAgICAtIHk6IDQwDQogICAgICAgIC0gc2hhcGU6IFRSSUFOR0xFDQogICAgICAgIC0gc2l6ZTogMjANCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IFRydWUgKToNCiAgICAgICAgc3VwZXIoRWFjaCxzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbGwoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQ0KICAgICAgICBzZWxmLmluaXRFeHByR3JvdXBzID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgc2VsZi5pbml0RXhwckdyb3VwczoNCiAgICAgICAgICAgIHNlbGYub3B0MW1hcCA9IGRpY3QoKGlkKGUuZXhwciksZSkgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT3B0aW9uYWwpKQ0KICAgICAgICAgICAgb3B0MSA9IFsgZS5leHByIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9wdGlvbmFsKSBdDQogICAgICAgICAgICBvcHQyID0gWyBlIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgZS5tYXlSZXR1cm5FbXB0eSBhbmQgbm90IGlzaW5zdGFuY2UoZSxPcHRpb25hbCldDQogICAgICAgICAgICBzZWxmLm9wdGlvbmFscyA9IG9wdDEgKyBvcHQyDQogICAgICAgICAgICBzZWxmLm11bHRpb3B0aW9uYWxzID0gWyBlLmV4cHIgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsWmVyb09yTW9yZSkgXQ0KICAgICAgICAgICAgc2VsZi5tdWx0aXJlcXVpcmVkID0gWyBlLmV4cHIgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT25lT3JNb3JlKSBdDQogICAgICAgICAgICBzZWxmLnJlcXVpcmVkID0gWyBlIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgbm90IGlzaW5zdGFuY2UoZSwoT3B0aW9uYWwsWmVyb09yTW9yZSxPbmVPck1vcmUpKSBdDQogICAgICAgICAgICBzZWxmLnJlcXVpcmVkICs9IHNlbGYubXVsdGlyZXF1aXJlZA0KICAgICAgICAgICAgc2VsZi5pbml0RXhwckdyb3VwcyA9IEZhbHNlDQogICAgICAgIHRtcExvYyA9IGxvYw0KICAgICAgICB0bXBSZXFkID0gc2VsZi5yZXF1aXJlZFs6XQ0KICAgICAgICB0bXBPcHQgID0gc2VsZi5vcHRpb25hbHNbOl0NCiAgICAgICAgbWF0Y2hPcmRlciA9IFtdDQoNCiAgICAgICAga2VlcE1hdGNoaW5nID0gVHJ1ZQ0KICAgICAgICB3aGlsZSBrZWVwTWF0Y2hpbmc6DQogICAgICAgICAgICB0bXBFeHBycyA9IHRtcFJlcWQgKyB0bXBPcHQgKyBzZWxmLm11bHRpb3B0aW9uYWxzICsgc2VsZi5tdWx0aXJlcXVpcmVkDQogICAgICAgICAgICBmYWlsZWQgPSBbXQ0KICAgICAgICAgICAgZm9yIGUgaW4gdG1wRXhwcnM6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICB0bXBMb2MgPSBlLnRyeVBhcnNlKCBpbnN0cmluZywgdG1wTG9jICkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb246DQogICAgICAgICAgICAgICAgICAgIGZhaWxlZC5hcHBlbmQoZSkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaE9yZGVyLmFwcGVuZChzZWxmLm9wdDFtYXAuZ2V0KGlkKGUpLGUpKQ0KICAgICAgICAgICAgICAgICAgICBpZiBlIGluIHRtcFJlcWQ6DQogICAgICAgICAgICAgICAgICAgICAgICB0bXBSZXFkLnJlbW92ZShlKQ0KICAgICAgICAgICAgICAgICAgICBlbGlmIGUgaW4gdG1wT3B0Og0KICAgICAgICAgICAgICAgICAgICAgICAgdG1wT3B0LnJlbW92ZShlKQ0KICAgICAgICAgICAgaWYgbGVuKGZhaWxlZCkgPT0gbGVuKHRtcEV4cHJzKToNCiAgICAgICAgICAgICAgICBrZWVwTWF0Y2hpbmcgPSBGYWxzZQ0KDQogICAgICAgIGlmIHRtcFJlcWQ6DQogICAgICAgICAgICBtaXNzaW5nID0gIiwgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHRtcFJlcWQpDQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZyxsb2MsIk1pc3Npbmcgb25lIG9yIG1vcmUgcmVxdWlyZWQgZWxlbWVudHMgKCVzKSIgJSBtaXNzaW5nICkNCg0KICAgICAgICAjIGFkZCBhbnkgdW5tYXRjaGVkIE9wdGlvbmFscywgaW4gY2FzZSB0aGV5IGhhdmUgZGVmYXVsdCB2YWx1ZXMgZGVmaW5lZA0KICAgICAgICBtYXRjaE9yZGVyICs9IFtlIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9wdGlvbmFsKSBhbmQgZS5leHByIGluIHRtcE9wdF0NCg0KICAgICAgICByZXN1bHRsaXN0ID0gW10NCiAgICAgICAgZm9yIGUgaW4gbWF0Y2hPcmRlcjoNCiAgICAgICAgICAgIGxvYyxyZXN1bHRzID0gZS5fcGFyc2UoaW5zdHJpbmcsbG9jLGRvQWN0aW9ucykNCiAgICAgICAgICAgIHJlc3VsdGxpc3QuYXBwZW5kKHJlc3VsdHMpDQoNCiAgICAgICAgZmluYWxSZXN1bHRzID0gc3VtKHJlc3VsdGxpc3QsIFBhcnNlUmVzdWx0cyhbXSkpDQogICAgICAgIHJldHVybiBsb2MsIGZpbmFsUmVzdWx0cw0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiICYgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkNCg0KDQpjbGFzcyBQYXJzZUVsZW1lbnRFbmhhbmNlKFBhcnNlckVsZW1lbnQpOg0KICAgICIiIg0KICAgIEFic3RyYWN0IHN1YmNsYXNzIG9mIEN7UGFyc2VyRWxlbWVudH0sIGZvciBjb21iaW5pbmcgYW5kIHBvc3QtcHJvY2Vzc2luZyBwYXJzZWQgdG9rZW5zLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc2F2ZWxpc3Q9RmFsc2UgKToNCiAgICAgICAgc3VwZXIoUGFyc2VFbGVtZW50RW5oYW5jZSxzZWxmKS5fX2luaXRfXyhzYXZlbGlzdCkNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggZXhwciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgaWYgaXNzdWJjbGFzcyhQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MsIFRva2VuKToNCiAgICAgICAgICAgICAgICBleHByID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKGV4cHIpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGV4cHIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoTGl0ZXJhbChleHByKSkNCiAgICAgICAgc2VsZi5leHByID0gZXhwcg0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIGlmIGV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBleHByLm1heUluZGV4RXJyb3INCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBleHByLm1heVJldHVybkVtcHR5DQogICAgICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggZXhwci53aGl0ZUNoYXJzICkNCiAgICAgICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBleHByLnNraXBXaGl0ZXNwYWNlDQogICAgICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBleHByLnNhdmVBc0xpc3QNCiAgICAgICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gZXhwci5jYWxsUHJlcGFyc2UNCiAgICAgICAgICAgIHNlbGYuaWdub3JlRXhwcnMuZXh0ZW5kKGV4cHIuaWdub3JlRXhwcnMpDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5leHByLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIiIsbG9jLHNlbGYuZXJybXNnLHNlbGYpDQoNCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6DQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQ0KICAgICAgICBzZWxmLmV4cHIgPSBzZWxmLmV4cHIuY29weSgpDQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuZXhwci5sZWF2ZVdoaXRlc3BhY2UoKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIFN1cHByZXNzICk6DQogICAgICAgICAgICBpZiBvdGhlciBub3QgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICBzdXBlciggUGFyc2VFbGVtZW50RW5oYW5jZSwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICBzZWxmLmV4cHIuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzdXBlciggUGFyc2VFbGVtZW50RW5oYW5jZSwgc2VsZikuaWdub3JlKCBvdGhlciApDQogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgc2VsZi5leHByLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToNCiAgICAgICAgc3VwZXIoUGFyc2VFbGVtZW50RW5oYW5jZSxzZWxmKS5zdHJlYW1saW5lKCkNCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5leHByLnN0cmVhbWxpbmUoKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIGlmIHNlbGYgaW4gcGFyc2VFbGVtZW50TGlzdDoNCiAgICAgICAgICAgIHJhaXNlIFJlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb24oIHBhcnNlRWxlbWVudExpc3QrW3NlbGZdICkNCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdDQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuZXhwci5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkNCg0KICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOg0KICAgICAgICB0bXAgPSB2YWxpZGF0ZVRyYWNlWzpdK1tzZWxmXQ0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLmV4cHIudmFsaWRhdGUodG1wKQ0KICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKCBbXSApDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoUGFyc2VFbGVtZW50RW5oYW5jZSxzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZSBhbmQgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiVzOiglcykiICUgKCBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgX3VzdHIoc2VsZi5leHByKSApDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KDQpjbGFzcyBGb2xsb3dlZEJ5KFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIExvb2thaGVhZCBtYXRjaGluZyBvZiB0aGUgZ2l2ZW4gcGFyc2UgZXhwcmVzc2lvbi4gIEN7Rm9sbG93ZWRCeX0NCiAgICBkb2VzIEl7bm90fSBhZHZhbmNlIHRoZSBwYXJzaW5nIHBvc2l0aW9uIHdpdGhpbiB0aGUgaW5wdXQgc3RyaW5nLCBpdCBvbmx5DQogICAgdmVyaWZpZXMgdGhhdCB0aGUgc3BlY2lmaWVkIHBhcnNlIGV4cHJlc3Npb24gbWF0Y2hlcyBhdCB0aGUgY3VycmVudA0KICAgIHBvc2l0aW9uLiAgQ3tGb2xsb3dlZEJ5fSBhbHdheXMgcmV0dXJucyBhIG51bGwgdG9rZW4gbGlzdC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIHVzZSBGb2xsb3dlZEJ5IHRvIG1hdGNoIGEgbGFiZWwgb25seSBpZiBpdCBpcyBmb2xsb3dlZCBieSBhICc6Jw0KICAgICAgICBkYXRhX3dvcmQgPSBXb3JkKGFscGhhcykNCiAgICAgICAgbGFiZWwgPSBkYXRhX3dvcmQgKyBGb2xsb3dlZEJ5KCc6JykNCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQogICAgICAgIA0KICAgICAgICBPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZygic2hhcGU6IFNRVUFSRSBjb2xvcjogQkxBQ0sgcG9zbjogdXBwZXIgbGVmdCIpLnBwcmludCgpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsnY29sb3InLCAnQkxBQ0snXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXV0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIgKToNCiAgICAgICAgc3VwZXIoRm9sbG93ZWRCeSxzZWxmKS5fX2luaXRfXyhleHByKQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgc2VsZi5leHByLnRyeVBhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KDQpjbGFzcyBOb3RBbnkoUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgTG9va2FoZWFkIHRvIGRpc2FsbG93IG1hdGNoaW5nIHdpdGggdGhlIGdpdmVuIHBhcnNlIGV4cHJlc3Npb24uICBDe05vdEFueX0NCiAgICBkb2VzIEl7bm90fSBhZHZhbmNlIHRoZSBwYXJzaW5nIHBvc2l0aW9uIHdpdGhpbiB0aGUgaW5wdXQgc3RyaW5nLCBpdCBvbmx5DQogICAgdmVyaWZpZXMgdGhhdCB0aGUgc3BlY2lmaWVkIHBhcnNlIGV4cHJlc3Npb24gZG9lcyBJe25vdH0gbWF0Y2ggYXQgdGhlIGN1cnJlbnQNCiAgICBwb3NpdGlvbi4gIEFsc28sIEN7Tm90QW55fSBkb2VzIEl7bm90fSBza2lwIG92ZXIgbGVhZGluZyB3aGl0ZXNwYWNlLiBDe05vdEFueX0NCiAgICBhbHdheXMgcmV0dXJucyBhIG51bGwgdG9rZW4gbGlzdC4gIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgJ34nIG9wZXJhdG9yLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIA0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOg0KICAgICAgICBzdXBlcihOb3RBbnksc2VsZikuX19pbml0X18oZXhwcikNCiAgICAgICAgI34gc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UgICMgZG8gTk9UIHVzZSBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpLCBkb24ndCB3YW50IHRvIHByb3BhZ2F0ZSB0byBleHBycw0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJGb3VuZCB1bndhbnRlZCB0b2tlbiwgIitfdXN0cihzZWxmLmV4cHIpDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBzZWxmLmV4cHIuY2FuUGFyc2VOZXh0KGluc3RyaW5nLCBsb2MpOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ+eyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIn0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBfTXVsdGlwbGVNYXRjaChQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHN0b3BPbj1Ob25lKToNCiAgICAgICAgc3VwZXIoX011bHRpcGxlTWF0Y2gsIHNlbGYpLl9faW5pdF9fKGV4cHIpDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUNCiAgICAgICAgZW5kZXIgPSBzdG9wT24NCiAgICAgICAgaWYgaXNpbnN0YW5jZShlbmRlciwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICBlbmRlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhlbmRlcikNCiAgICAgICAgc2VsZi5ub3RfZW5kZXIgPSB+ZW5kZXIgaWYgZW5kZXIgaXMgbm90IE5vbmUgZWxzZSBOb25lDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBzZWxmX2V4cHJfcGFyc2UgPSBzZWxmLmV4cHIuX3BhcnNlDQogICAgICAgIHNlbGZfc2tpcF9pZ25vcmFibGVzID0gc2VsZi5fc2tpcElnbm9yYWJsZXMNCiAgICAgICAgY2hlY2tfZW5kZXIgPSBzZWxmLm5vdF9lbmRlciBpcyBub3QgTm9uZQ0KICAgICAgICBpZiBjaGVja19lbmRlcjoNCiAgICAgICAgICAgIHRyeV9ub3RfZW5kZXIgPSBzZWxmLm5vdF9lbmRlci50cnlQYXJzZQ0KICAgICAgICANCiAgICAgICAgIyBtdXN0IGJlIGF0IGxlYXN0IG9uZSAoYnV0IGZpcnN0IHNlZSBpZiB3ZSBhcmUgdGhlIHN0b3BPbiBzZW50aW5lbDsNCiAgICAgICAgIyBpZiBzbywgZmFpbCkNCiAgICAgICAgaWYgY2hlY2tfZW5kZXI6DQogICAgICAgICAgICB0cnlfbm90X2VuZGVyKGluc3RyaW5nLCBsb2MpDQogICAgICAgIGxvYywgdG9rZW5zID0gc2VsZl9leHByX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGhhc0lnbm9yZUV4cHJzID0gKG5vdCBub3Qgc2VsZi5pZ25vcmVFeHBycykNCiAgICAgICAgICAgIHdoaWxlIDE6DQogICAgICAgICAgICAgICAgaWYgY2hlY2tfZW5kZXI6DQogICAgICAgICAgICAgICAgICAgIHRyeV9ub3RfZW5kZXIoaW5zdHJpbmcsIGxvYykNCiAgICAgICAgICAgICAgICBpZiBoYXNJZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICAgICAgcHJlbG9jID0gc2VsZl9za2lwX2lnbm9yYWJsZXMoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHByZWxvYyA9IGxvYw0KICAgICAgICAgICAgICAgIGxvYywgdG1wdG9rZW5zID0gc2VsZl9leHByX3BhcnNlKCBpbnN0cmluZywgcHJlbG9jLCBkb0FjdGlvbnMgKQ0KICAgICAgICAgICAgICAgIGlmIHRtcHRva2VucyBvciB0bXB0b2tlbnMuaGFza2V5cygpOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbnMgKz0gdG1wdG9rZW5zDQogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sSW5kZXhFcnJvcik6DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgcmV0dXJuIGxvYywgdG9rZW5zDQogICAgICAgIA0KY2xhc3MgT25lT3JNb3JlKF9NdWx0aXBsZU1hdGNoKToNCiAgICAiIiINCiAgICBSZXBldGl0aW9uIG9mIG9uZSBvciBtb3JlIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uLg0KICAgIA0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gZXhwciAtIGV4cHJlc3Npb24gdGhhdCBtdXN0IG1hdGNoIG9uZSBvciBtb3JlIHRpbWVzDQogICAgIC0gc3RvcE9uIC0gKGRlZmF1bHQ9Q3tOb25lfSkgLSBleHByZXNzaW9uIGZvciBhIHRlcm1pbmF0aW5nIHNlbnRpbmVsDQogICAgICAgICAgKG9ubHkgcmVxdWlyZWQgaWYgdGhlIHNlbnRpbmVsIHdvdWxkIG9yZGluYXJpbHkgbWF0Y2ggdGhlIHJlcGV0aXRpb24gDQogICAgICAgICAgZXhwcmVzc2lvbikgICAgICAgICAgDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgZGF0YV93b3JkID0gV29yZChhbHBoYXMpDQogICAgICAgIGxhYmVsID0gZGF0YV93b3JkICsgRm9sbG93ZWRCeSgnOicpDQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCg0KICAgICAgICB0ZXh0ID0gInNoYXBlOiBTUVVBUkUgcG9zbjogdXBwZXIgbGVmdCBjb2xvcjogQkxBQ0siDQogICAgICAgIE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLnBwcmludCgpICAjIEZhaWwhIHJlYWQgJ2NvbG9yJyBhcyBkYXRhIGluc3RlYWQgb2YgbmV4dCBsYWJlbCAtPiBbWydzaGFwZScsICdTUVVBUkUgY29sb3InXV0NCg0KICAgICAgICAjIHVzZSBzdG9wT24gYXR0cmlidXRlIGZvciBPbmVPck1vcmUgdG8gYXZvaWQgcmVhZGluZyBsYWJlbCBzdHJpbmcgYXMgcGFydCBvZiB0aGUgZGF0YQ0KICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkNCiAgICAgICAgT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkucHByaW50KCkgIyBCZXR0ZXIgLT4gW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J10sIFsnY29sb3InLCAnQkxBQ0snXV0NCiAgICAgICAgDQogICAgICAgICMgY291bGQgYWxzbyBiZSB3cml0dGVuIGFzDQogICAgICAgIChhdHRyX2V4cHIgKiAoMSwpKS5wYXJzZVN0cmluZyh0ZXh0KS5wcHJpbnQoKQ0KICAgICIiIg0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIn0uLi4iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBaZXJvT3JNb3JlKF9NdWx0aXBsZU1hdGNoKToNCiAgICAiIiINCiAgICBPcHRpb25hbCByZXBldGl0aW9uIG9mIHplcm8gb3IgbW9yZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4NCiAgICANCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGV4cHIgLSBleHByZXNzaW9uIHRoYXQgbXVzdCBtYXRjaCB6ZXJvIG9yIG1vcmUgdGltZXMNCiAgICAgLSBzdG9wT24gLSAoZGVmYXVsdD1De05vbmV9KSAtIGV4cHJlc3Npb24gZm9yIGEgdGVybWluYXRpbmcgc2VudGluZWwNCiAgICAgICAgICAob25seSByZXF1aXJlZCBpZiB0aGUgc2VudGluZWwgd291bGQgb3JkaW5hcmlseSBtYXRjaCB0aGUgcmVwZXRpdGlvbiANCiAgICAgICAgICBleHByZXNzaW9uKSAgICAgICAgICANCg0KICAgIEV4YW1wbGU6IHNpbWlsYXIgdG8gTHtPbmVPck1vcmV9DQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzdG9wT249Tm9uZSk6DQogICAgICAgIHN1cGVyKFplcm9Pck1vcmUsc2VsZikuX19pbml0X18oZXhwciwgc3RvcE9uPXN0b3BPbikNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFplcm9Pck1vcmUsIHNlbGYpLnBhcnNlSW1wbChpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMpDQogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sSW5kZXhFcnJvcik6DQogICAgICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiWyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIl0uLi4iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQpjbGFzcyBfTnVsbFRva2VuKG9iamVjdCk6DQogICAgZGVmIF9fYm9vbF9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gRmFsc2UNCiAgICBfX25vbnplcm9fXyA9IF9fYm9vbF9fDQogICAgZGVmIF9fc3RyX18oc2VsZik6DQogICAgICAgIHJldHVybiAiIg0KDQpfb3B0aW9uYWxOb3RNYXRjaGVkID0gX051bGxUb2tlbigpDQpjbGFzcyBPcHRpb25hbChQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBPcHRpb25hbCBtYXRjaGluZyBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4NCg0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gZXhwciAtIGV4cHJlc3Npb24gdGhhdCBtdXN0IG1hdGNoIHplcm8gb3IgbW9yZSB0aW1lcw0KICAgICAtIGRlZmF1bHQgKG9wdGlvbmFsKSAtIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIHRoZSBvcHRpb25hbCBleHByZXNzaW9uIGlzIG5vdCBmb3VuZC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIFVTIHBvc3RhbCBjb2RlIGNhbiBiZSBhIDUtZGlnaXQgemlwLCBwbHVzIG9wdGlvbmFsIDQtZGlnaXQgcXVhbGlmaWVyDQogICAgICAgIHppcCA9IENvbWJpbmUoV29yZChudW1zLCBleGFjdD01KSArIE9wdGlvbmFsKCctJyArIFdvcmQobnVtcywgZXhhY3Q9NCkpKQ0KICAgICAgICB6aXAucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIHRyYWRpdGlvbmFsIFpJUCBjb2RlDQogICAgICAgICAgICAxMjM0NQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIFpJUCs0IGZvcm0NCiAgICAgICAgICAgIDEyMTAxLTAwMDENCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyBpbnZhbGlkIFpJUA0KICAgICAgICAgICAgOTg3NjUtDQogICAgICAgICAgICAnJycpDQogICAgcHJpbnRzOjoNCiAgICAgICAgIyB0cmFkaXRpb25hbCBaSVAgY29kZQ0KICAgICAgICAxMjM0NQ0KICAgICAgICBbJzEyMzQ1J10NCg0KICAgICAgICAjIFpJUCs0IGZvcm0NCiAgICAgICAgMTIxMDEtMDAwMQ0KICAgICAgICBbJzEyMTAxLTAwMDEnXQ0KDQogICAgICAgICMgaW52YWxpZCBaSVANCiAgICAgICAgOTg3NjUtDQogICAgICAgICAgICAgXg0KICAgICAgICBGQUlMOiBFeHBlY3RlZCBlbmQgb2YgdGV4dCAoYXQgY2hhciA1KSwgKGxpbmU6MSwgY29sOjYpDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBkZWZhdWx0PV9vcHRpb25hbE5vdE1hdGNoZWQgKToNCiAgICAgICAgc3VwZXIoT3B0aW9uYWwsc2VsZikuX19pbml0X18oIGV4cHIsIHNhdmVsaXN0PUZhbHNlICkNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gc2VsZi5leHByLnNhdmVBc0xpc3QNCiAgICAgICAgc2VsZi5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0DQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBsb2MsIHRva2VucyA9IHNlbGYuZXhwci5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkNCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbixJbmRleEVycm9yKToNCiAgICAgICAgICAgIGlmIHNlbGYuZGVmYXVsdFZhbHVlIGlzIG5vdCBfb3B0aW9uYWxOb3RNYXRjaGVkOg0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZXhwci5yZXN1bHRzTmFtZToNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gUGFyc2VSZXN1bHRzKFsgc2VsZi5kZWZhdWx0VmFsdWUgXSkNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zW3NlbGYuZXhwci5yZXN1bHRzTmFtZV0gPSBzZWxmLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IFsgc2VsZi5kZWZhdWx0VmFsdWUgXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICB0b2tlbnMgPSBbXQ0KICAgICAgICByZXR1cm4gbG9jLCB0b2tlbnMNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlsiICsgX3VzdHIoc2VsZi5leHByKSArICJdIg0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KY2xhc3MgU2tpcFRvKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIFRva2VuIGZvciBza2lwcGluZyBvdmVyIGFsbCB1bmRlZmluZWQgdGV4dCB1bnRpbCB0aGUgbWF0Y2hlZCBleHByZXNzaW9uIGlzIGZvdW5kLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBleHByIC0gdGFyZ2V0IGV4cHJlc3Npb24gbWFya2luZyB0aGUgZW5kIG9mIHRoZSBkYXRhIHRvIGJlIHNraXBwZWQNCiAgICAgLSBpbmNsdWRlIC0gKGRlZmF1bHQ9Q3tGYWxzZX0pIGlmIFRydWUsIHRoZSB0YXJnZXQgZXhwcmVzc2lvbiBpcyBhbHNvIHBhcnNlZCANCiAgICAgICAgICAodGhlIHNraXBwZWQgdGV4dCBhbmQgdGFyZ2V0IGV4cHJlc3Npb24gYXJlIHJldHVybmVkIGFzIGEgMi1lbGVtZW50IGxpc3QpLg0KICAgICAtIGlnbm9yZSAtIChkZWZhdWx0PUN7Tm9uZX0pIHVzZWQgdG8gZGVmaW5lIGdyYW1tYXJzICh0eXBpY2FsbHkgcXVvdGVkIHN0cmluZ3MgYW5kIA0KICAgICAgICAgIGNvbW1lbnRzKSB0aGF0IG1pZ2h0IGNvbnRhaW4gZmFsc2UgbWF0Y2hlcyB0byB0aGUgdGFyZ2V0IGV4cHJlc3Npb24NCiAgICAgLSBmYWlsT24gLSAoZGVmYXVsdD1De05vbmV9KSBkZWZpbmUgZXhwcmVzc2lvbnMgdGhhdCBhcmUgbm90IGFsbG93ZWQgdG8gYmUgDQogICAgICAgICAgaW5jbHVkZWQgaW4gdGhlIHNraXBwZWQgdGVzdDsgaWYgZm91bmQgYmVmb3JlIHRoZSB0YXJnZXQgZXhwcmVzc2lvbiBpcyBmb3VuZCwgDQogICAgICAgICAgdGhlIFNraXBUbyBpcyBub3QgYSBtYXRjaA0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHJlcG9ydCA9ICcnJw0KICAgICAgICAgICAgT3V0c3RhbmRpbmcgSXNzdWVzIFJlcG9ydCAtIDEgSmFuIDIwMDANCg0KICAgICAgICAgICAgICAgIyB8IFNldmVyaXR5IHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgRGF5cyBPcGVuDQogICAgICAgICAgICAtLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0NCiAgICAgICAgICAgICAxMDEgfCBDcml0aWNhbCB8IEludGVybWl0dGVudCBzeXN0ZW0gY3Jhc2ggICAgICAgICAgICAgICAgIHwgICAgICAgICAgNg0KICAgICAgICAgICAgICA5NCB8IENvc21ldGljIHwgU3BlbGxpbmcgZXJyb3Igb24gTG9naW4gKCdsb2d8bicpICAgICAgICAgfCAgICAgICAgIDE0DQogICAgICAgICAgICAgIDc5IHwgTWlub3IgICAgfCBTeXN0ZW0gc2xvdyB3aGVuIHJ1bm5pbmcgdG9vIG1hbnkgcmVwb3J0cyB8ICAgICAgICAgNDcNCiAgICAgICAgICAgICcnJw0KICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICBTRVAgPSBTdXBwcmVzcygnfCcpDQogICAgICAgICMgdXNlIFNraXBUbyB0byBzaW1wbHkgbWF0Y2ggZXZlcnl0aGluZyB1cCB1bnRpbCB0aGUgbmV4dCBTRVANCiAgICAgICAgIyAtIGlnbm9yZSBxdW90ZWQgc3RyaW5ncywgc28gdGhhdCBhICd8JyBjaGFyYWN0ZXIgaW5zaWRlIGEgcXVvdGVkIHN0cmluZyBkb2VzIG5vdCBtYXRjaA0KICAgICAgICAjIC0gcGFyc2UgYWN0aW9uIHdpbGwgY2FsbCB0b2tlbi5zdHJpcCgpIGZvciBlYWNoIG1hdGNoZWQgdG9rZW4sIGkuZS4sIHRoZSBkZXNjcmlwdGlvbiBib2R5DQogICAgICAgIHN0cmluZ19kYXRhID0gU2tpcFRvKFNFUCwgaWdub3JlPXF1b3RlZFN0cmluZykNCiAgICAgICAgc3RyaW5nX2RhdGEuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoc3RyLnN0cmlwKSkNCiAgICAgICAgdGlja2V0X2V4cHIgPSAoaW50ZWdlcigiaXNzdWVfbnVtIikgKyBTRVAgDQogICAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmdfZGF0YSgic2V2IikgKyBTRVAgDQogICAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmdfZGF0YSgiZGVzYyIpICsgU0VQIA0KICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlcigiZGF5c19vcGVuIikpDQogICAgICAgIA0KICAgICAgICBmb3IgdGt0IGluIHRpY2tldF9leHByLnNlYXJjaFN0cmluZyhyZXBvcnQpOg0KICAgICAgICAgICAgcHJpbnQgdGt0LmR1bXAoKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnMTAxJywgJ0NyaXRpY2FsJywgJ0ludGVybWl0dGVudCBzeXN0ZW0gY3Jhc2gnLCAnNiddDQogICAgICAgIC0gZGF5c19vcGVuOiA2DQogICAgICAgIC0gZGVzYzogSW50ZXJtaXR0ZW50IHN5c3RlbSBjcmFzaA0KICAgICAgICAtIGlzc3VlX251bTogMTAxDQogICAgICAgIC0gc2V2OiBDcml0aWNhbA0KICAgICAgICBbJzk0JywgJ0Nvc21ldGljJywgIlNwZWxsaW5nIGVycm9yIG9uIExvZ2luICgnbG9nfG4nKSIsICcxNCddDQogICAgICAgIC0gZGF5c19vcGVuOiAxNA0KICAgICAgICAtIGRlc2M6IFNwZWxsaW5nIGVycm9yIG9uIExvZ2luICgnbG9nfG4nKQ0KICAgICAgICAtIGlzc3VlX251bTogOTQNCiAgICAgICAgLSBzZXY6IENvc21ldGljDQogICAgICAgIFsnNzknLCAnTWlub3InLCAnU3lzdGVtIHNsb3cgd2hlbiBydW5uaW5nIHRvbyBtYW55IHJlcG9ydHMnLCAnNDcnXQ0KICAgICAgICAtIGRheXNfb3BlbjogNDcNCiAgICAgICAgLSBkZXNjOiBTeXN0ZW0gc2xvdyB3aGVuIHJ1bm5pbmcgdG9vIG1hbnkgcmVwb3J0cw0KICAgICAgICAtIGlzc3VlX251bTogNzkNCiAgICAgICAgLSBzZXY6IE1pbm9yDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBvdGhlciwgaW5jbHVkZT1GYWxzZSwgaWdub3JlPU5vbmUsIGZhaWxPbj1Ob25lICk6DQogICAgICAgIHN1cGVyKCBTa2lwVG8sIHNlbGYgKS5fX2luaXRfXyggb3RoZXIgKQ0KICAgICAgICBzZWxmLmlnbm9yZUV4cHIgPSBpZ25vcmUNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCiAgICAgICAgc2VsZi5pbmNsdWRlTWF0Y2ggPSBpbmNsdWRlDQogICAgICAgIHNlbGYuYXNMaXN0ID0gRmFsc2UNCiAgICAgICAgaWYgaXNpbnN0YW5jZShmYWlsT24sIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgc2VsZi5mYWlsT24gPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoZmFpbE9uKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5mYWlsT24gPSBmYWlsT24NCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiTm8gbWF0Y2ggZm91bmQgZm9yICIrX3VzdHIoc2VsZi5leHByKQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgc3RhcnRsb2MgPSBsb2MNCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgIGV4cHIgPSBzZWxmLmV4cHINCiAgICAgICAgZXhwcl9wYXJzZSA9IHNlbGYuZXhwci5fcGFyc2UNCiAgICAgICAgc2VsZl9mYWlsT25fY2FuUGFyc2VOZXh0ID0gc2VsZi5mYWlsT24uY2FuUGFyc2VOZXh0IGlmIHNlbGYuZmFpbE9uIGlzIG5vdCBOb25lIGVsc2UgTm9uZQ0KICAgICAgICBzZWxmX2lnbm9yZUV4cHJfdHJ5UGFyc2UgPSBzZWxmLmlnbm9yZUV4cHIudHJ5UGFyc2UgaWYgc2VsZi5pZ25vcmVFeHByIGlzIG5vdCBOb25lIGVsc2UgTm9uZQ0KICAgICAgICANCiAgICAgICAgdG1wbG9jID0gbG9jDQogICAgICAgIHdoaWxlIHRtcGxvYyA8PSBpbnN0cmxlbjoNCiAgICAgICAgICAgIGlmIHNlbGZfZmFpbE9uX2NhblBhcnNlTmV4dCBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAjIGJyZWFrIGlmIGZhaWxPbiBleHByZXNzaW9uIG1hdGNoZXMNCiAgICAgICAgICAgICAgICBpZiBzZWxmX2ZhaWxPbl9jYW5QYXJzZU5leHQoaW5zdHJpbmcsIHRtcGxvYyk6DQogICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgc2VsZl9pZ25vcmVFeHByX3RyeVBhcnNlIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICMgYWR2YW5jZSBwYXN0IGlnbm9yZSBleHByZXNzaW9ucw0KICAgICAgICAgICAgICAgIHdoaWxlIDE6DQogICAgICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgICAgIHRtcGxvYyA9IHNlbGZfaWdub3JlRXhwcl90cnlQYXJzZShpbnN0cmluZywgdG1wbG9jKQ0KICAgICAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIGV4cHJfcGFyc2UoaW5zdHJpbmcsIHRtcGxvYywgZG9BY3Rpb25zPUZhbHNlLCBjYWxsUHJlUGFyc2U9RmFsc2UpDQogICAgICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLCBJbmRleEVycm9yKToNCiAgICAgICAgICAgICAgICAjIG5vIG1hdGNoLCBhZHZhbmNlIGxvYyBpbiBzdHJpbmcNCiAgICAgICAgICAgICAgICB0bXBsb2MgKz0gMQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIG1hdGNoZWQgc2tpcHRvIGV4cHIsIGRvbmUNCiAgICAgICAgICAgICAgICBicmVhaw0KDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICAjIHJhbiBvZmYgdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyaW5nIHdpdGhvdXQgbWF0Y2hpbmcgc2tpcHRvIGV4cHIsIGZhaWwNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgICMgYnVpbGQgdXAgcmV0dXJuIHZhbHVlcw0KICAgICAgICBsb2MgPSB0bXBsb2MNCiAgICAgICAgc2tpcHRleHQgPSBpbnN0cmluZ1tzdGFydGxvYzpsb2NdDQogICAgICAgIHNraXByZXN1bHQgPSBQYXJzZVJlc3VsdHMoc2tpcHRleHQpDQogICAgICAgIA0KICAgICAgICBpZiBzZWxmLmluY2x1ZGVNYXRjaDoNCiAgICAgICAgICAgIGxvYywgbWF0ID0gZXhwcl9wYXJzZShpbnN0cmluZyxsb2MsZG9BY3Rpb25zLGNhbGxQcmVQYXJzZT1GYWxzZSkNCiAgICAgICAgICAgIHNraXByZXN1bHQgKz0gbWF0DQoNCiAgICAgICAgcmV0dXJuIGxvYywgc2tpcHJlc3VsdA0KDQpjbGFzcyBGb3J3YXJkKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgYW4gZXhwcmVzc2lvbiB0byBiZSBkZWZpbmVkIGxhdGVyIC0NCiAgICB1c2VkIGZvciByZWN1cnNpdmUgZ3JhbW1hcnMsIHN1Y2ggYXMgYWxnZWJyYWljIGluZml4IG5vdGF0aW9uLg0KICAgIFdoZW4gdGhlIGV4cHJlc3Npb24gaXMga25vd24sIGl0IGlzIGFzc2lnbmVkIHRvIHRoZSBDe0ZvcndhcmR9IHZhcmlhYmxlIHVzaW5nIHRoZSAnPDwnIG9wZXJhdG9yLg0KDQogICAgTm90ZTogdGFrZSBjYXJlIHdoZW4gYXNzaWduaW5nIHRvIEN7Rm9yd2FyZH0gbm90IHRvIG92ZXJsb29rIHByZWNlZGVuY2Ugb2Ygb3BlcmF0b3JzLg0KICAgIFNwZWNpZmljYWxseSwgJ3wnIGhhcyBhIGxvd2VyIHByZWNlZGVuY2UgdGhhbiAnPDwnLCBzbyB0aGF0OjoNCiAgICAgICAgZndkRXhwciA8PCBhIHwgYiB8IGMNCiAgICB3aWxsIGFjdHVhbGx5IGJlIGV2YWx1YXRlZCBhczo6DQogICAgICAgIChmd2RFeHByIDw8IGEpIHwgYiB8IGMNCiAgICB0aGVyZWJ5IGxlYXZpbmcgYiBhbmQgYyBvdXQgYXMgcGFyc2VhYmxlIGFsdGVybmF0aXZlcy4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91DQogICAgZXhwbGljaXRseSBncm91cCB0aGUgdmFsdWVzIGluc2VydGVkIGludG8gdGhlIEN7Rm9yd2FyZH06Og0KICAgICAgICBmd2RFeHByIDw8IChhIHwgYiB8IGMpDQogICAgQ29udmVydGluZyB0byB1c2UgdGhlICc8PD0nIG9wZXJhdG9yIGluc3RlYWQgd2lsbCBhdm9pZCB0aGlzIHByb2JsZW0uDQoNCiAgICBTZWUgTHtQYXJzZVJlc3VsdHMucHByaW50fSBmb3IgYW4gZXhhbXBsZSBvZiBhIHJlY3Vyc2l2ZSBwYXJzZXIgY3JlYXRlZCB1c2luZw0KICAgIEN7Rm9yd2FyZH0uDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBvdGhlcj1Ob25lICk6DQogICAgICAgIHN1cGVyKEZvcndhcmQsc2VsZikuX19pbml0X18oIG90aGVyLCBzYXZlbGlzdD1GYWxzZSApDQoNCiAgICBkZWYgX19sc2hpZnRfXyggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKG90aGVyKQ0KICAgICAgICBzZWxmLmV4cHIgPSBvdGhlcg0KICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IHNlbGYuZXhwci5tYXlJbmRleEVycm9yDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBzZWxmLmV4cHIubWF5UmV0dXJuRW1wdHkNCiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIHNlbGYuZXhwci53aGl0ZUNoYXJzICkNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IHNlbGYuZXhwci5za2lwV2hpdGVzcGFjZQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBzZWxmLmV4cHIuc2F2ZUFzTGlzdA0KICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmV4dGVuZChzZWxmLmV4cHIuaWdub3JlRXhwcnMpDQogICAgICAgIHJldHVybiBzZWxmDQogICAgICAgIA0KICAgIGRlZiBfX2lsc2hpZnRfXyhzZWxmLCBvdGhlcik6DQogICAgICAgIHJldHVybiBzZWxmIDw8IG90aGVyDQogICAgDQogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOg0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6DQogICAgICAgIGlmIG5vdCBzZWxmLnN0cmVhbWxpbmVkOg0KICAgICAgICAgICAgc2VsZi5zdHJlYW1saW5lZCA9IFRydWUNCiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICBzZWxmLmV4cHIuc3RyZWFtbGluZSgpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToNCiAgICAgICAgaWYgc2VsZiBub3QgaW4gdmFsaWRhdGVUcmFjZToNCiAgICAgICAgICAgIHRtcCA9IHZhbGlkYXRlVHJhY2VbOl0rW3NlbGZdDQogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgc2VsZi5leHByLnZhbGlkYXRlKHRtcCkNCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbihbXSkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyAiOiAuLi4iDQoNCiAgICAgICAgIyBzdHViYmVkIG91dCBmb3Igbm93IC0gY3JlYXRlcyBhd2Z1bCBtZW1vcnkgYW5kIHBlcmYgaXNzdWVzDQogICAgICAgIHNlbGYuX3JldmVydENsYXNzID0gc2VsZi5fX2NsYXNzX18NCiAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBfRm9yd2FyZE5vUmVjdXJzZQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgcmV0U3RyaW5nID0gX3VzdHIoc2VsZi5leHByKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXRTdHJpbmcgPSAiTm9uZSINCiAgICAgICAgZmluYWxseToNCiAgICAgICAgICAgIHNlbGYuX19jbGFzc19fID0gc2VsZi5fcmV2ZXJ0Q2xhc3MNCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgIjogIiArIHJldFN0cmluZw0KDQogICAgZGVmIGNvcHkoc2VsZik6DQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihGb3J3YXJkLHNlbGYpLmNvcHkoKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0ID0gRm9yd2FyZCgpDQogICAgICAgICAgICByZXQgPDw9IHNlbGYNCiAgICAgICAgICAgIHJldHVybiByZXQNCg0KY2xhc3MgX0ZvcndhcmROb1JlY3Vyc2UoRm9yd2FyZCk6DQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICIuLi4iDQoNCmNsYXNzIFRva2VuQ29udmVydGVyKFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIEFic3RyYWN0IHN1YmNsYXNzIG9mIEN7UGFyc2VFeHByZXNzaW9ufSwgZm9yIGNvbnZlcnRpbmcgcGFyc2VkIHJlc3VsdHMuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzYXZlbGlzdD1GYWxzZSApOg0KICAgICAgICBzdXBlcihUb2tlbkNvbnZlcnRlcixzZWxmKS5fX2luaXRfXyggZXhwciApIywgc2F2ZWxpc3QgKQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBGYWxzZQ0KDQpjbGFzcyBDb21iaW5lKFRva2VuQ29udmVydGVyKToNCiAgICAiIiINCiAgICBDb252ZXJ0ZXIgdG8gY29uY2F0ZW5hdGUgYWxsIG1hdGNoaW5nIHRva2VucyB0byBhIHNpbmdsZSBzdHJpbmcuDQogICAgQnkgZGVmYXVsdCwgdGhlIG1hdGNoaW5nIHBhdHRlcm5zIG11c3QgYWxzbyBiZSBjb250aWd1b3VzIGluIHRoZSBpbnB1dCBzdHJpbmc7DQogICAgdGhpcyBjYW4gYmUgZGlzYWJsZWQgYnkgc3BlY2lmeWluZyBDeydhZGphY2VudD1GYWxzZSd9IGluIHRoZSBjb25zdHJ1Y3Rvci4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICByZWFsID0gV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykNCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4xNDE2JykpICMgLT4gWyczJywgJy4nLCAnMTQxNiddDQogICAgICAgICMgd2lsbCBhbHNvIGVycm9uZW91c2x5IG1hdGNoIHRoZSBmb2xsb3dpbmcNCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4gMTQxNicpKSAjIC0+IFsnMycsICcuJywgJzE0MTYnXQ0KDQogICAgICAgIHJlYWwgPSBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKQ0KICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLjE0MTYnKSkgIyAtPiBbJzMuMTQxNiddDQogICAgICAgICMgbm8gbWF0Y2ggd2hlbiB0aGVyZSBhcmUgaW50ZXJuYWwgc3BhY2VzDQogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuIDE0MTYnKSkgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIFc6KDAxMjMuLi4pDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBqb2luU3RyaW5nPSIiLCBhZGphY2VudD1UcnVlICk6DQogICAgICAgIHN1cGVyKENvbWJpbmUsc2VsZikuX19pbml0X18oIGV4cHIgKQ0KICAgICAgICAjIHN1cHByZXNzIHdoaXRlc3BhY2Utc3RyaXBwaW5nIGluIGNvbnRhaW5lZCBwYXJzZSBleHByZXNzaW9ucywgYnV0IHJlLWVuYWJsZSBpdCBvbiB0aGUgQ29tYmluZSBpdHNlbGYNCiAgICAgICAgaWYgYWRqYWNlbnQ6DQogICAgICAgICAgICBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpDQogICAgICAgIHNlbGYuYWRqYWNlbnQgPSBhZGphY2VudA0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQ0KICAgICAgICBzZWxmLmpvaW5TdHJpbmcgPSBqb2luU3RyaW5nDQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gVHJ1ZQ0KDQogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgc2VsZi5hZGphY2VudDoNCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuaWdub3JlKHNlbGYsIG90aGVyKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc3VwZXIoIENvbWJpbmUsIHNlbGYpLmlnbm9yZSggb3RoZXIgKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6DQogICAgICAgIHJldFRva3MgPSB0b2tlbmxpc3QuY29weSgpDQogICAgICAgIGRlbCByZXRUb2tzWzpdDQogICAgICAgIHJldFRva3MgKz0gUGFyc2VSZXN1bHRzKFsgIiIuam9pbih0b2tlbmxpc3QuX2FzU3RyaW5nTGlzdChzZWxmLmpvaW5TdHJpbmcpKSBdLCBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cykNCg0KICAgICAgICBpZiBzZWxmLnJlc3VsdHNOYW1lIGFuZCByZXRUb2tzLmhhc2tleXMoKToNCiAgICAgICAgICAgIHJldHVybiBbIHJldFRva3MgXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHJldFRva3MNCg0KY2xhc3MgR3JvdXAoVG9rZW5Db252ZXJ0ZXIpOg0KICAgICIiIg0KICAgIENvbnZlcnRlciB0byByZXR1cm4gdGhlIG1hdGNoZWQgdG9rZW5zIGFzIGEgbGlzdCAtIHVzZWZ1bCBmb3IgcmV0dXJuaW5nIHRva2VucyBvZiBDe0x7WmVyb09yTW9yZX19IGFuZCBDe0x7T25lT3JNb3JlfX0gZXhwcmVzc2lvbnMuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgaWRlbnQgPSBXb3JkKGFscGhhcykNCiAgICAgICAgbnVtID0gV29yZChudW1zKQ0KICAgICAgICB0ZXJtID0gaWRlbnQgfCBudW0NCiAgICAgICAgZnVuYyA9IGlkZW50ICsgT3B0aW9uYWwoZGVsaW1pdGVkTGlzdCh0ZXJtKSkNCiAgICAgICAgcHJpbnQoZnVuYy5wYXJzZVN0cmluZygiZm4gYSxiLDEwMCIpKSAgIyAtPiBbJ2ZuJywgJ2EnLCAnYicsICcxMDAnXQ0KDQogICAgICAgIGZ1bmMgPSBpZGVudCArIEdyb3VwKE9wdGlvbmFsKGRlbGltaXRlZExpc3QodGVybSkpKQ0KICAgICAgICBwcmludChmdW5jLnBhcnNlU3RyaW5nKCJmbiBhLGIsMTAwIikpICAjIC0+IFsnZm4nLCBbJ2EnLCAnYicsICcxMDAnXV0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIgKToNCiAgICAgICAgc3VwZXIoR3JvdXAsc2VsZikuX19pbml0X18oIGV4cHIgKQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlDQoNCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgcmV0dXJuIFsgdG9rZW5saXN0IF0NCg0KY2xhc3MgRGljdChUb2tlbkNvbnZlcnRlcik6DQogICAgIiIiDQogICAgQ29udmVydGVyIHRvIHJldHVybiBhIHJlcGV0aXRpdmUgZXhwcmVzc2lvbiBhcyBhIGxpc3QsIGJ1dCBhbHNvIGFzIGEgZGljdGlvbmFyeS4NCiAgICBFYWNoIGVsZW1lbnQgY2FuIGFsc28gYmUgcmVmZXJlbmNlZCB1c2luZyB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIGV4cHJlc3Npb24gYXMgaXRzIGtleS4NCiAgICBVc2VmdWwgZm9yIHRhYnVsYXIgcmVwb3J0IHNjcmFwaW5nIHdoZW4gdGhlIGZpcnN0IGNvbHVtbiBjYW4gYmUgdXNlZCBhcyBhIGl0ZW0ga2V5Lg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGRhdGFfd29yZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBsYWJlbCA9IGRhdGFfd29yZCArIEZvbGxvd2VkQnkoJzonKQ0KICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQoNCiAgICAgICAgdGV4dCA9ICJzaGFwZTogU1FVQVJFIHBvc246IHVwcGVyIGxlZnQgY29sb3I6IGxpZ2h0IGJsdWUgdGV4dHVyZTogYnVybGFwIg0KICAgICAgICBhdHRyX2V4cHIgPSAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQogICAgICAgIA0KICAgICAgICAjIHByaW50IGF0dHJpYnV0ZXMgYXMgcGxhaW4gZ3JvdXBzDQogICAgICAgIHByaW50KE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLmR1bXAoKSkNCiAgICAgICAgDQogICAgICAgICMgaW5zdGVhZCBvZiBPbmVPck1vcmUoZXhwciksIHBhcnNlIHVzaW5nIERpY3QoT25lT3JNb3JlKEdyb3VwKGV4cHIpKSkgLSBEaWN0IHdpbGwgYXV0by1hc3NpZ24gbmFtZXMNCiAgICAgICAgcmVzdWx0ID0gRGljdChPbmVPck1vcmUoR3JvdXAoYXR0cl9leHByKSkpLnBhcnNlU3RyaW5nKHRleHQpDQogICAgICAgIHByaW50KHJlc3VsdC5kdW1wKCkpDQogICAgICAgIA0KICAgICAgICAjIGFjY2VzcyBuYW1lZCBmaWVsZHMgYXMgZGljdCBlbnRyaWVzLCBvciBvdXRwdXQgYXMgZGljdA0KICAgICAgICBwcmludChyZXN1bHRbJ3NoYXBlJ10pICAgICAgICANCiAgICAgICAgcHJpbnQocmVzdWx0LmFzRGljdCgpKQ0KICAgIHByaW50czo6DQogICAgICAgIFsnc2hhcGUnLCAnU1FVQVJFJywgJ3Bvc24nLCAndXBwZXIgbGVmdCcsICdjb2xvcicsICdsaWdodCBibHVlJywgJ3RleHR1cmUnLCAnYnVybGFwJ10NCg0KICAgICAgICBbWydzaGFwZScsICdTUVVBUkUnXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXSwgWydjb2xvcicsICdsaWdodCBibHVlJ10sIFsndGV4dHVyZScsICdidXJsYXAnXV0NCiAgICAgICAgLSBjb2xvcjogbGlnaHQgYmx1ZQ0KICAgICAgICAtIHBvc246IHVwcGVyIGxlZnQNCiAgICAgICAgLSBzaGFwZTogU1FVQVJFDQogICAgICAgIC0gdGV4dHVyZTogYnVybGFwDQogICAgICAgIFNRVUFSRQ0KICAgICAgICB7J2NvbG9yJzogJ2xpZ2h0IGJsdWUnLCAncG9zbic6ICd1cHBlciBsZWZ0JywgJ3RleHR1cmUnOiAnYnVybGFwJywgJ3NoYXBlJzogJ1NRVUFSRSd9DQogICAgU2VlIG1vcmUgZXhhbXBsZXMgYXQgTHtQYXJzZVJlc3VsdHN9IG9mIGFjY2Vzc2luZyBmaWVsZHMgYnkgcmVzdWx0cyBuYW1lLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciApOg0KICAgICAgICBzdXBlcihEaWN0LHNlbGYpLl9faW5pdF9fKCBleHByICkNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQ0KDQogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6DQogICAgICAgIGZvciBpLHRvayBpbiBlbnVtZXJhdGUodG9rZW5saXN0KToNCiAgICAgICAgICAgIGlmIGxlbih0b2spID09IDA6DQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIGlrZXkgPSB0b2tbMF0NCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaWtleSxpbnQpOg0KICAgICAgICAgICAgICAgIGlrZXkgPSBfdXN0cih0b2tbMF0pLnN0cmlwKCkNCiAgICAgICAgICAgIGlmIGxlbih0b2spPT0xOg0KICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KCIiLGkpDQogICAgICAgICAgICBlbGlmIGxlbih0b2spPT0yIGFuZCBub3QgaXNpbnN0YW5jZSh0b2tbMV0sUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICB0b2tlbmxpc3RbaWtleV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh0b2tbMV0saSkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgZGljdHZhbHVlID0gdG9rLmNvcHkoKSAjUGFyc2VSZXN1bHRzKGkpDQogICAgICAgICAgICAgICAgZGVsIGRpY3R2YWx1ZVswXQ0KICAgICAgICAgICAgICAgIGlmIGxlbihkaWN0dmFsdWUpIT0gMSBvciAoaXNpbnN0YW5jZShkaWN0dmFsdWUsUGFyc2VSZXN1bHRzKSBhbmQgZGljdHZhbHVlLmhhc2tleXMoKSk6DQogICAgICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KGRpY3R2YWx1ZSxpKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHRva2VubGlzdFtpa2V5XSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KGRpY3R2YWx1ZVswXSxpKQ0KDQogICAgICAgIGlmIHNlbGYucmVzdWx0c05hbWU6DQogICAgICAgICAgICByZXR1cm4gWyB0b2tlbmxpc3QgXQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHRva2VubGlzdA0KDQoNCmNsYXNzIFN1cHByZXNzKFRva2VuQ29udmVydGVyKToNCiAgICAiIiINCiAgICBDb252ZXJ0ZXIgZm9yIGlnbm9yaW5nIHRoZSByZXN1bHRzIG9mIGEgcGFyc2VkIGV4cHJlc3Npb24uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgc291cmNlID0gImEsIGIsIGMsZCINCiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykNCiAgICAgICAgd2RfbGlzdDEgPSB3ZCArIFplcm9Pck1vcmUoJywnICsgd2QpDQogICAgICAgIHByaW50KHdkX2xpc3QxLnBhcnNlU3RyaW5nKHNvdXJjZSkpDQoNCiAgICAgICAgIyBvZnRlbiwgZGVsaW1pdGVycyB0aGF0IGFyZSB1c2VmdWwgZHVyaW5nIHBhcnNpbmcgYXJlIGp1c3QgaW4gdGhlDQogICAgICAgICMgd2F5IGFmdGVyd2FyZCAtIHVzZSBTdXBwcmVzcyB0byBrZWVwIHRoZW0gb3V0IG9mIHRoZSBwYXJzZWQgb3V0cHV0DQogICAgICAgIHdkX2xpc3QyID0gd2QgKyBaZXJvT3JNb3JlKFN1cHByZXNzKCcsJykgKyB3ZCkNCiAgICAgICAgcHJpbnQod2RfbGlzdDIucGFyc2VTdHJpbmcoc291cmNlKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbJ2EnLCAnLCcsICdiJywgJywnLCAnYycsICcsJywgJ2QnXQ0KICAgICAgICBbJ2EnLCAnYicsICdjJywgJ2QnXQ0KICAgIChTZWUgYWxzbyBMe2RlbGltaXRlZExpc3R9LikNCiAgICAiIiINCiAgICBkZWYgcG9zdFBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jLCB0b2tlbmxpc3QgKToNCiAgICAgICAgcmV0dXJuIFtdDQoNCiAgICBkZWYgc3VwcHJlc3MoIHNlbGYgKToNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KDQpjbGFzcyBPbmx5T25jZShvYmplY3QpOg0KICAgICIiIg0KICAgIFdyYXBwZXIgZm9yIHBhcnNlIGFjdGlvbnMsIHRvIGVuc3VyZSB0aGV5IGFyZSBvbmx5IGNhbGxlZCBvbmNlLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2RDYWxsKToNCiAgICAgICAgc2VsZi5jYWxsYWJsZSA9IF90cmltX2FyaXR5KG1ldGhvZENhbGwpDQogICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UNCiAgICBkZWYgX19jYWxsX18oc2VsZixzLGwsdCk6DQogICAgICAgIGlmIG5vdCBzZWxmLmNhbGxlZDoNCiAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxmLmNhbGxhYmxlKHMsbCx0KQ0KICAgICAgICAgICAgc2VsZi5jYWxsZWQgPSBUcnVlDQogICAgICAgICAgICByZXR1cm4gcmVzdWx0cw0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIiIpDQogICAgZGVmIHJlc2V0KHNlbGYpOg0KICAgICAgICBzZWxmLmNhbGxlZCA9IEZhbHNlDQoNCmRlZiB0cmFjZVBhcnNlQWN0aW9uKGYpOg0KICAgICIiIg0KICAgIERlY29yYXRvciBmb3IgZGVidWdnaW5nIHBhcnNlIGFjdGlvbnMuIA0KICAgIA0KICAgIFdoZW4gdGhlIHBhcnNlIGFjdGlvbiBpcyBjYWxsZWQsIHRoaXMgZGVjb3JhdG9yIHdpbGwgcHJpbnQgQ3siPj4gZW50ZXJpbmcgSXttZXRob2QtbmFtZX0obGluZTpJe2N1cnJlbnRfc291cmNlX2xpbmV9LCBJe3BhcnNlX2xvY2F0aW9ufSwgSXttYXRjaGVkX3Rva2Vuc30pIi59DQogICAgV2hlbiB0aGUgcGFyc2UgYWN0aW9uIGNvbXBsZXRlcywgdGhlIGRlY29yYXRvciB3aWxsIHByaW50IEN7Ijw8In0gZm9sbG93ZWQgYnkgdGhlIHJldHVybmVkIHZhbHVlLCBvciBhbnkgZXhjZXB0aW9uIHRoYXQgdGhlIHBhcnNlIGFjdGlvbiByYWlzZWQuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykNCg0KICAgICAgICBAdHJhY2VQYXJzZUFjdGlvbg0KICAgICAgICBkZWYgcmVtb3ZlX2R1cGxpY2F0ZV9jaGFycyh0b2tlbnMpOg0KICAgICAgICAgICAgcmV0dXJuICcnLmpvaW4oc29ydGVkKHNldCgnJy5qb2luKHRva2VucykpKQ0KDQogICAgICAgIHdkcyA9IE9uZU9yTW9yZSh3ZCkuc2V0UGFyc2VBY3Rpb24ocmVtb3ZlX2R1cGxpY2F0ZV9jaGFycykNCiAgICAgICAgcHJpbnQod2RzLnBhcnNlU3RyaW5nKCJzbGtkanMgc2xkIHNsZGQgc2RsZiBzZGxqZiIpKQ0KICAgIHByaW50czo6DQogICAgICAgID4+ZW50ZXJpbmcgcmVtb3ZlX2R1cGxpY2F0ZV9jaGFycyhsaW5lOiAnc2xrZGpzIHNsZCBzbGRkIHNkbGYgc2RsamYnLCAwLCAoWydzbGtkanMnLCAnc2xkJywgJ3NsZGQnLCAnc2RsZicsICdzZGxqZiddLCB7fSkpDQogICAgICAgIDw8bGVhdmluZyByZW1vdmVfZHVwbGljYXRlX2NoYXJzIChyZXQ6ICdkZmprbHMnKQ0KICAgICAgICBbJ2RmamtscyddDQogICAgIiIiDQogICAgZiA9IF90cmltX2FyaXR5KGYpDQogICAgZGVmIHooKnBhQXJncyk6DQogICAgICAgIHRoaXNGdW5jID0gZi5fX25hbWVfXw0KICAgICAgICBzLGwsdCA9IHBhQXJnc1stMzpdDQogICAgICAgIGlmIGxlbihwYUFyZ3MpPjM6DQogICAgICAgICAgICB0aGlzRnVuYyA9IHBhQXJnc1swXS5fX2NsYXNzX18uX19uYW1lX18gKyAnLicgKyB0aGlzRnVuYw0KICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiPj5lbnRlcmluZyAlcyhsaW5lOiAnJXMnLCAlZCwgJXIpXG4iICUgKHRoaXNGdW5jLGxpbmUobCxzKSxsLHQpICkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0ID0gZigqcGFBcmdzKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICI8PGxlYXZpbmcgJXMgKGV4Y2VwdGlvbjogJXMpXG4iICUgKHRoaXNGdW5jLGV4YykgKQ0KICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggIjw8bGVhdmluZyAlcyAocmV0OiAlcilcbiIgJSAodGhpc0Z1bmMscmV0KSApDQogICAgICAgIHJldHVybiByZXQNCiAgICB0cnk6DQogICAgICAgIHouX19uYW1lX18gPSBmLl9fbmFtZV9fDQogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOg0KICAgICAgICBwYXNzDQogICAgcmV0dXJuIHoNCg0KIw0KIyBnbG9iYWwgaGVscGVycw0KIw0KZGVmIGRlbGltaXRlZExpc3QoIGV4cHIsIGRlbGltPSIsIiwgY29tYmluZT1GYWxzZSApOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWZpbmUgYSBkZWxpbWl0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyAtIHRoZSBkZWxpbWl0ZXIgZGVmYXVsdHMgdG8gJywnLg0KICAgIEJ5IGRlZmF1bHQsIHRoZSBsaXN0IGVsZW1lbnRzIGFuZCBkZWxpbWl0ZXJzIGNhbiBoYXZlIGludGVydmVuaW5nIHdoaXRlc3BhY2UsIGFuZA0KICAgIGNvbW1lbnRzLCBidXQgdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBwYXNzaW5nIEN7Y29tYmluZT1UcnVlfSBpbiB0aGUgY29uc3RydWN0b3IuDQogICAgSWYgQ3tjb21iaW5lfSBpcyBzZXQgdG8gQ3tUcnVlfSwgdGhlIG1hdGNoaW5nIHRva2VucyBhcmUgcmV0dXJuZWQgYXMgYSBzaW5nbGUgdG9rZW4NCiAgICBzdHJpbmcsIHdpdGggdGhlIGRlbGltaXRlcnMgaW5jbHVkZWQ7IG90aGVyd2lzZSwgdGhlIG1hdGNoaW5nIHRva2VucyBhcmUgcmV0dXJuZWQNCiAgICBhcyBhIGxpc3Qgb2YgdG9rZW5zLCB3aXRoIHRoZSBkZWxpbWl0ZXJzIHN1cHByZXNzZWQuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgZGVsaW1pdGVkTGlzdChXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCJhYSxiYixjYyIpICMgLT4gWydhYScsICdiYicsICdjYyddDQogICAgICAgIGRlbGltaXRlZExpc3QoV29yZChoZXhudW1zKSwgZGVsaW09JzonLCBjb21iaW5lPVRydWUpLnBhcnNlU3RyaW5nKCJBQTpCQjpDQzpERDpFRSIpICMgLT4gWydBQTpCQjpDQzpERDpFRSddDQogICAgIiIiDQogICAgZGxOYW1lID0gX3VzdHIoZXhwcikrIiBbIitfdXN0cihkZWxpbSkrIiAiK191c3RyKGV4cHIpKyJdLi4uIg0KICAgIGlmIGNvbWJpbmU6DQogICAgICAgIHJldHVybiBDb21iaW5lKCBleHByICsgWmVyb09yTW9yZSggZGVsaW0gKyBleHByICkgKS5zZXROYW1lKGRsTmFtZSkNCiAgICBlbHNlOg0KICAgICAgICByZXR1cm4gKCBleHByICsgWmVyb09yTW9yZSggU3VwcHJlc3MoIGRlbGltICkgKyBleHByICkgKS5zZXROYW1lKGRsTmFtZSkNCg0KZGVmIGNvdW50ZWRBcnJheSggZXhwciwgaW50RXhwcj1Ob25lICk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlZmluZSBhIGNvdW50ZWQgbGlzdCBvZiBleHByZXNzaW9ucy4NCiAgICBUaGlzIGhlbHBlciBkZWZpbmVzIGEgcGF0dGVybiBvZiB0aGUgZm9ybTo6DQogICAgICAgIGludGVnZXIgZXhwciBleHByIGV4cHIuLi4NCiAgICB3aGVyZSB0aGUgbGVhZGluZyBpbnRlZ2VyIHRlbGxzIGhvdyBtYW55IGV4cHIgZXhwcmVzc2lvbnMgZm9sbG93Lg0KICAgIFRoZSBtYXRjaGVkIHRva2VucyByZXR1cm5zIHRoZSBhcnJheSBvZiBleHByIHRva2VucyBhcyBhIGxpc3QgLSB0aGUgbGVhZGluZyBjb3VudCB0b2tlbiBpcyBzdXBwcmVzc2VkLg0KICAgIA0KICAgIElmIEN7aW50RXhwcn0gaXMgc3BlY2lmaWVkLCBpdCBzaG91bGQgYmUgYSBweXBhcnNpbmcgZXhwcmVzc2lvbiB0aGF0IHByb2R1Y2VzIGFuIGludGVnZXIgdmFsdWUuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgY291bnRlZEFycmF5KFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoJzIgYWIgY2QgZWYnKSAgIyAtPiBbJ2FiJywgJ2NkJ10NCg0KICAgICAgICAjIGluIHRoaXMgcGFyc2VyLCB0aGUgbGVhZGluZyBpbnRlZ2VyIHZhbHVlIGlzIGdpdmVuIGluIGJpbmFyeSwNCiAgICAgICAgIyAnMTAnIGluZGljYXRpbmcgdGhhdCAyIHZhbHVlcyBhcmUgaW4gdGhlIGFycmF5DQogICAgICAgIGJpbmFyeUNvbnN0YW50ID0gV29yZCgnMDEnKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDogaW50KHRbMF0sIDIpKQ0KICAgICAgICBjb3VudGVkQXJyYXkoV29yZChhbHBoYXMpLCBpbnRFeHByPWJpbmFyeUNvbnN0YW50KS5wYXJzZVN0cmluZygnMTAgYWIgY2QgZWYnKSAgIyAtPiBbJ2FiJywgJ2NkJ10NCiAgICAiIiINCiAgICBhcnJheUV4cHIgPSBGb3J3YXJkKCkNCiAgICBkZWYgY291bnRGaWVsZFBhcnNlQWN0aW9uKHMsbCx0KToNCiAgICAgICAgbiA9IHRbMF0NCiAgICAgICAgYXJyYXlFeHByIDw8IChuIGFuZCBHcm91cChBbmQoW2V4cHJdKm4pKSBvciBHcm91cChlbXB0eSkpDQogICAgICAgIHJldHVybiBbXQ0KICAgIGlmIGludEV4cHIgaXMgTm9uZToNCiAgICAgICAgaW50RXhwciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6aW50KHRbMF0pKQ0KICAgIGVsc2U6DQogICAgICAgIGludEV4cHIgPSBpbnRFeHByLmNvcHkoKQ0KICAgIGludEV4cHIuc2V0TmFtZSgiYXJyYXlMZW4iKQ0KICAgIGludEV4cHIuYWRkUGFyc2VBY3Rpb24oY291bnRGaWVsZFBhcnNlQWN0aW9uLCBjYWxsRHVyaW5nVHJ5PVRydWUpDQogICAgcmV0dXJuICggaW50RXhwciArIGFycmF5RXhwciApLnNldE5hbWUoJyhsZW4pICcgKyBfdXN0cihleHByKSArICcuLi4nKQ0KDQpkZWYgX2ZsYXR0ZW4oTCk6DQogICAgcmV0ID0gW10NCiAgICBmb3IgaSBpbiBMOg0KICAgICAgICBpZiBpc2luc3RhbmNlKGksbGlzdCk6DQogICAgICAgICAgICByZXQuZXh0ZW5kKF9mbGF0dGVuKGkpKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0LmFwcGVuZChpKQ0KICAgIHJldHVybiByZXQNCg0KZGVmIG1hdGNoUHJldmlvdXNMaXRlcmFsKGV4cHIpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWZpbmUgYW4gZXhwcmVzc2lvbiB0aGF0IGlzIGluZGlyZWN0bHkgZGVmaW5lZCBmcm9tDQogICAgdGhlIHRva2VucyBtYXRjaGVkIGluIGEgcHJldmlvdXMgZXhwcmVzc2lvbiwgdGhhdCBpcywgaXQgbG9va3MNCiAgICBmb3IgYSAncmVwZWF0JyBvZiBhIHByZXZpb3VzIGV4cHJlc3Npb24uICBGb3IgZXhhbXBsZTo6DQogICAgICAgIGZpcnN0ID0gV29yZChudW1zKQ0KICAgICAgICBzZWNvbmQgPSBtYXRjaFByZXZpb3VzTGl0ZXJhbChmaXJzdCkNCiAgICAgICAgbWF0Y2hFeHByID0gZmlyc3QgKyAiOiIgKyBzZWNvbmQNCiAgICB3aWxsIG1hdGNoIEN7IjE6MSJ9LCBidXQgbm90IEN7IjE6MiJ9LiAgQmVjYXVzZSB0aGlzIG1hdGNoZXMgYQ0KICAgIHByZXZpb3VzIGxpdGVyYWwsIHdpbGwgYWxzbyBtYXRjaCB0aGUgbGVhZGluZyBDeyIxOjEifSBpbiBDeyIxOjEwIn0uDQogICAgSWYgdGhpcyBpcyBub3QgZGVzaXJlZCwgdXNlIEN7bWF0Y2hQcmV2aW91c0V4cHJ9Lg0KICAgIERvIEl7bm90fSB1c2Ugd2l0aCBwYWNrcmF0IHBhcnNpbmcgZW5hYmxlZC4NCiAgICAiIiINCiAgICByZXAgPSBGb3J3YXJkKCkNCiAgICBkZWYgY29weVRva2VuVG9SZXBlYXRlcihzLGwsdCk6DQogICAgICAgIGlmIHQ6DQogICAgICAgICAgICBpZiBsZW4odCkgPT0gMToNCiAgICAgICAgICAgICAgICByZXAgPDwgdFswXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGZsYXR0ZW4gdCB0b2tlbnMNCiAgICAgICAgICAgICAgICB0ZmxhdCA9IF9mbGF0dGVuKHQuYXNMaXN0KCkpDQogICAgICAgICAgICAgICAgcmVwIDw8IEFuZChMaXRlcmFsKHR0KSBmb3IgdHQgaW4gdGZsYXQpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXAgPDwgRW1wdHkoKQ0KICAgIGV4cHIuYWRkUGFyc2VBY3Rpb24oY29weVRva2VuVG9SZXBlYXRlciwgY2FsbER1cmluZ1RyeT1UcnVlKQ0KICAgIHJlcC5zZXROYW1lKCcocHJldikgJyArIF91c3RyKGV4cHIpKQ0KICAgIHJldHVybiByZXANCg0KZGVmIG1hdGNoUHJldmlvdXNFeHByKGV4cHIpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWZpbmUgYW4gZXhwcmVzc2lvbiB0aGF0IGlzIGluZGlyZWN0bHkgZGVmaW5lZCBmcm9tDQogICAgdGhlIHRva2VucyBtYXRjaGVkIGluIGEgcHJldmlvdXMgZXhwcmVzc2lvbiwgdGhhdCBpcywgaXQgbG9va3MNCiAgICBmb3IgYSAncmVwZWF0JyBvZiBhIHByZXZpb3VzIGV4cHJlc3Npb24uICBGb3IgZXhhbXBsZTo6DQogICAgICAgIGZpcnN0ID0gV29yZChudW1zKQ0KICAgICAgICBzZWNvbmQgPSBtYXRjaFByZXZpb3VzRXhwcihmaXJzdCkNCiAgICAgICAgbWF0Y2hFeHByID0gZmlyc3QgKyAiOiIgKyBzZWNvbmQNCiAgICB3aWxsIG1hdGNoIEN7IjE6MSJ9LCBidXQgbm90IEN7IjE6MiJ9LiAgQmVjYXVzZSB0aGlzIG1hdGNoZXMgYnkNCiAgICBleHByZXNzaW9ucywgd2lsbCBJe25vdH0gbWF0Y2ggdGhlIGxlYWRpbmcgQ3siMToxIn0gaW4gQ3siMToxMCJ9Ow0KICAgIHRoZSBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGZpcnN0LCBhbmQgdGhlbiBjb21wYXJlZCwgc28NCiAgICBDeyIxIn0gaXMgY29tcGFyZWQgd2l0aCBDeyIxMCJ9Lg0KICAgIERvIEl7bm90fSB1c2Ugd2l0aCBwYWNrcmF0IHBhcnNpbmcgZW5hYmxlZC4NCiAgICAiIiINCiAgICByZXAgPSBGb3J3YXJkKCkNCiAgICBlMiA9IGV4cHIuY29weSgpDQogICAgcmVwIDw8PSBlMg0KICAgIGRlZiBjb3B5VG9rZW5Ub1JlcGVhdGVyKHMsbCx0KToNCiAgICAgICAgbWF0Y2hUb2tlbnMgPSBfZmxhdHRlbih0LmFzTGlzdCgpKQ0KICAgICAgICBkZWYgbXVzdE1hdGNoVGhlc2VUb2tlbnMocyxsLHQpOg0KICAgICAgICAgICAgdGhlc2VUb2tlbnMgPSBfZmxhdHRlbih0LmFzTGlzdCgpKQ0KICAgICAgICAgICAgaWYgIHRoZXNlVG9rZW5zICE9IG1hdGNoVG9rZW5zOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCIiLDAsIiIpDQogICAgICAgIHJlcC5zZXRQYXJzZUFjdGlvbiggbXVzdE1hdGNoVGhlc2VUb2tlbnMsIGNhbGxEdXJpbmdUcnk9VHJ1ZSApDQogICAgZXhwci5hZGRQYXJzZUFjdGlvbihjb3B5VG9rZW5Ub1JlcGVhdGVyLCBjYWxsRHVyaW5nVHJ5PVRydWUpDQogICAgcmVwLnNldE5hbWUoJyhwcmV2KSAnICsgX3VzdHIoZXhwcikpDQogICAgcmV0dXJuIHJlcA0KDQpkZWYgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzKToNCiAgICAjfiAgZXNjYXBlIHRoZXNlIGNoYXJzOiBeLV0NCiAgICBmb3IgYyBpbiByIlxeLV0iOg0KICAgICAgICBzID0gcy5yZXBsYWNlKGMsX2JzbGFzaCtjKQ0KICAgIHMgPSBzLnJlcGxhY2UoIlxuIixyIlxuIikNCiAgICBzID0gcy5yZXBsYWNlKCJcdCIsciJcdCIpDQogICAgcmV0dXJuIF91c3RyKHMpDQoNCmRlZiBvbmVPZiggc3RycywgY2FzZWxlc3M9RmFsc2UsIHVzZVJlZ2V4PVRydWUgKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gcXVpY2tseSBkZWZpbmUgYSBzZXQgb2YgYWx0ZXJuYXRpdmUgTGl0ZXJhbHMsIGFuZCBtYWtlcyBzdXJlIHRvIGRvDQogICAgbG9uZ2VzdC1maXJzdCB0ZXN0aW5nIHdoZW4gdGhlcmUgaXMgYSBjb25mbGljdCwgcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQgb3JkZXIsDQogICAgYnV0IHJldHVybnMgYSBDe0x7TWF0Y2hGaXJzdH19IGZvciBiZXN0IHBlcmZvcm1hbmNlLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBzdHJzIC0gYSBzdHJpbmcgb2Ygc3BhY2UtZGVsaW1pdGVkIGxpdGVyYWxzLCBvciBhIGNvbGxlY3Rpb24gb2Ygc3RyaW5nIGxpdGVyYWxzDQogICAgIC0gY2FzZWxlc3MgLSAoZGVmYXVsdD1De0ZhbHNlfSkgLSB0cmVhdCBhbGwgbGl0ZXJhbHMgYXMgY2FzZWxlc3MNCiAgICAgLSB1c2VSZWdleCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gYXMgYW4gb3B0aW1pemF0aW9uLCB3aWxsIGdlbmVyYXRlIGEgUmVnZXgNCiAgICAgICAgICBvYmplY3Q7IG90aGVyd2lzZSwgd2lsbCBnZW5lcmF0ZSBhIEN7TWF0Y2hGaXJzdH0gb2JqZWN0IChpZiBDe2Nhc2VsZXNzPVRydWV9LCBvcg0KICAgICAgICAgIGlmIGNyZWF0aW5nIGEgQ3tSZWdleH0gcmFpc2VzIGFuIGV4Y2VwdGlvbikNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBjb21wX29wZXIgPSBvbmVPZigiPCA9ID4gPD0gPj0gIT0iKQ0KICAgICAgICB2YXIgPSBXb3JkKGFscGhhcykNCiAgICAgICAgbnVtYmVyID0gV29yZChudW1zKQ0KICAgICAgICB0ZXJtID0gdmFyIHwgbnVtYmVyDQogICAgICAgIGNvbXBhcmlzb25fZXhwciA9IHRlcm0gKyBjb21wX29wZXIgKyB0ZXJtDQogICAgICAgIHByaW50KGNvbXBhcmlzb25fZXhwci5zZWFyY2hTdHJpbmcoIkIgPSAxMiAgQUE9MjMgQjw9QUEgQUE+MTIiKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbWydCJywgJz0nLCAnMTInXSwgWydBQScsICc9JywgJzIzJ10sIFsnQicsICc8PScsICdBQSddLCBbJ0FBJywgJz4nLCAnMTInXV0NCiAgICAiIiINCiAgICBpZiBjYXNlbGVzczoNCiAgICAgICAgaXNlcXVhbCA9ICggbGFtYmRhIGEsYjogYS51cHBlcigpID09IGIudXBwZXIoKSApDQogICAgICAgIG1hc2tzID0gKCBsYW1iZGEgYSxiOiBiLnVwcGVyKCkuc3RhcnRzd2l0aChhLnVwcGVyKCkpICkNCiAgICAgICAgcGFyc2VFbGVtZW50Q2xhc3MgPSBDYXNlbGVzc0xpdGVyYWwNCiAgICBlbHNlOg0KICAgICAgICBpc2VxdWFsID0gKCBsYW1iZGEgYSxiOiBhID09IGIgKQ0KICAgICAgICBtYXNrcyA9ICggbGFtYmRhIGEsYjogYi5zdGFydHN3aXRoKGEpICkNCiAgICAgICAgcGFyc2VFbGVtZW50Q2xhc3MgPSBMaXRlcmFsDQoNCiAgICBzeW1ib2xzID0gW10NCiAgICBpZiBpc2luc3RhbmNlKHN0cnMsYmFzZXN0cmluZyk6DQogICAgICAgIHN5bWJvbHMgPSBzdHJzLnNwbGl0KCkNCiAgICBlbGlmIGlzaW5zdGFuY2Uoc3RycywgY29sbGVjdGlvbnMuSXRlcmFibGUpOg0KICAgICAgICBzeW1ib2xzID0gbGlzdChzdHJzKQ0KICAgIGVsc2U6DQogICAgICAgIHdhcm5pbmdzLndhcm4oIkludmFsaWQgYXJndW1lbnQgdG8gb25lT2YsIGV4cGVjdGVkIHN0cmluZyBvciBpdGVyYWJsZSIsDQogICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgIGlmIG5vdCBzeW1ib2xzOg0KICAgICAgICByZXR1cm4gTm9NYXRjaCgpDQoNCiAgICBpID0gMA0KICAgIHdoaWxlIGkgPCBsZW4oc3ltYm9scyktMToNCiAgICAgICAgY3VyID0gc3ltYm9sc1tpXQ0KICAgICAgICBmb3IgaixvdGhlciBpbiBlbnVtZXJhdGUoc3ltYm9sc1tpKzE6XSk6DQogICAgICAgICAgICBpZiAoIGlzZXF1YWwob3RoZXIsIGN1cikgKToNCiAgICAgICAgICAgICAgICBkZWwgc3ltYm9sc1tpK2orMV0NCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgZWxpZiAoIG1hc2tzKGN1ciwgb3RoZXIpICk6DQogICAgICAgICAgICAgICAgZGVsIHN5bWJvbHNbaStqKzFdDQogICAgICAgICAgICAgICAgc3ltYm9scy5pbnNlcnQoaSxvdGhlcikNCiAgICAgICAgICAgICAgICBjdXIgPSBvdGhlcg0KICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpICs9IDENCg0KICAgIGlmIG5vdCBjYXNlbGVzcyBhbmQgdXNlUmVnZXg6DQogICAgICAgICN+IHByaW50IChzdHJzLCItPiIsICJ8Ii5qb2luKCBbIF9lc2NhcGVSZWdleENoYXJzKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzXSApKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBpZiBsZW4oc3ltYm9scyk9PWxlbigiIi5qb2luKHN5bWJvbHMpKToNCiAgICAgICAgICAgICAgICByZXR1cm4gUmVnZXgoICJbJXNdIiAlICIiLmpvaW4oX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzeW0pIGZvciBzeW0gaW4gc3ltYm9scykgKS5zZXROYW1lKCcgfCAnLmpvaW4oc3ltYm9scykpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldHVybiBSZWdleCggInwiLmpvaW4ocmUuZXNjYXBlKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzKSApLnNldE5hbWUoJyB8ICcuam9pbihzeW1ib2xzKSkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkV4Y2VwdGlvbiBjcmVhdGluZyBSZWdleCBmb3Igb25lT2YsIGJ1aWxkaW5nIE1hdGNoRmlyc3QiLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQoNCg0KICAgICMgbGFzdCByZXNvcnQsIGp1c3QgdXNlIE1hdGNoRmlyc3QNCiAgICByZXR1cm4gTWF0Y2hGaXJzdChwYXJzZUVsZW1lbnRDbGFzcyhzeW0pIGZvciBzeW0gaW4gc3ltYm9scykuc2V0TmFtZSgnIHwgJy5qb2luKHN5bWJvbHMpKQ0KDQpkZWYgZGljdE9mKCBrZXksIHZhbHVlICk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGVhc2lseSBhbmQgY2xlYXJseSBkZWZpbmUgYSBkaWN0aW9uYXJ5IGJ5IHNwZWNpZnlpbmcgdGhlIHJlc3BlY3RpdmUgcGF0dGVybnMNCiAgICBmb3IgdGhlIGtleSBhbmQgdmFsdWUuICBUYWtlcyBjYXJlIG9mIGRlZmluaW5nIHRoZSBDe0x7RGljdH19LCBDe0x7WmVyb09yTW9yZX19LCBhbmQgQ3tMe0dyb3VwfX0gdG9rZW5zDQogICAgaW4gdGhlIHByb3BlciBvcmRlci4gIFRoZSBrZXkgcGF0dGVybiBjYW4gaW5jbHVkZSBkZWxpbWl0aW5nIG1hcmtlcnMgb3IgcHVuY3R1YXRpb24sDQogICAgYXMgbG9uZyBhcyB0aGV5IGFyZSBzdXBwcmVzc2VkLCB0aGVyZWJ5IGxlYXZpbmcgdGhlIHNpZ25pZmljYW50IGtleSB0ZXh0LiAgVGhlIHZhbHVlDQogICAgcGF0dGVybiBjYW4gaW5jbHVkZSBuYW1lZCByZXN1bHRzLCBzbyB0aGF0IHRoZSBDe0RpY3R9IHJlc3VsdHMgY2FuIGluY2x1ZGUgbmFtZWQgdG9rZW4NCiAgICBmaWVsZHMuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgdGV4dCA9ICJzaGFwZTogU1FVQVJFIHBvc246IHVwcGVyIGxlZnQgY29sb3I6IGxpZ2h0IGJsdWUgdGV4dHVyZTogYnVybGFwIg0KICAgICAgICBhdHRyX2V4cHIgPSAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQogICAgICAgIHByaW50KE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLmR1bXAoKSkNCiAgICAgICAgDQogICAgICAgIGF0dHJfbGFiZWwgPSBsYWJlbA0KICAgICAgICBhdHRyX3ZhbHVlID0gU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pDQoNCiAgICAgICAgIyBzaW1pbGFyIHRvIERpY3QsIGJ1dCBzaW1wbGVyIGNhbGwgZm9ybWF0DQogICAgICAgIHJlc3VsdCA9IGRpY3RPZihhdHRyX2xhYmVsLCBhdHRyX3ZhbHVlKS5wYXJzZVN0cmluZyh0ZXh0KQ0KICAgICAgICBwcmludChyZXN1bHQuZHVtcCgpKQ0KICAgICAgICBwcmludChyZXN1bHRbJ3NoYXBlJ10pDQogICAgICAgIHByaW50KHJlc3VsdC5zaGFwZSkgICMgb2JqZWN0IGF0dHJpYnV0ZSBhY2Nlc3Mgd29ya3MgdG9vDQogICAgICAgIHByaW50KHJlc3VsdC5hc0RpY3QoKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbWydzaGFwZScsICdTUVVBUkUnXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXSwgWydjb2xvcicsICdsaWdodCBibHVlJ10sIFsndGV4dHVyZScsICdidXJsYXAnXV0NCiAgICAgICAgLSBjb2xvcjogbGlnaHQgYmx1ZQ0KICAgICAgICAtIHBvc246IHVwcGVyIGxlZnQNCiAgICAgICAgLSBzaGFwZTogU1FVQVJFDQogICAgICAgIC0gdGV4dHVyZTogYnVybGFwDQogICAgICAgIFNRVUFSRQ0KICAgICAgICBTUVVBUkUNCiAgICAgICAgeydjb2xvcic6ICdsaWdodCBibHVlJywgJ3NoYXBlJzogJ1NRVUFSRScsICdwb3NuJzogJ3VwcGVyIGxlZnQnLCAndGV4dHVyZSc6ICdidXJsYXAnfQ0KICAgICIiIg0KICAgIHJldHVybiBEaWN0KCBaZXJvT3JNb3JlKCBHcm91cCAoIGtleSArIHZhbHVlICkgKSApDQoNCmRlZiBvcmlnaW5hbFRleHRGb3IoZXhwciwgYXNTdHJpbmc9VHJ1ZSk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIHJldHVybiB0aGUgb3JpZ2luYWwsIHVudG9rZW5pemVkIHRleHQgZm9yIGEgZ2l2ZW4gZXhwcmVzc2lvbi4gIFVzZWZ1bCB0bw0KICAgIHJlc3RvcmUgdGhlIHBhcnNlZCBmaWVsZHMgb2YgYW4gSFRNTCBzdGFydCB0YWcgaW50byB0aGUgcmF3IHRhZyB0ZXh0IGl0c2VsZiwgb3IgdG8NCiAgICByZXZlcnQgc2VwYXJhdGUgdG9rZW5zIHdpdGggaW50ZXJ2ZW5pbmcgd2hpdGVzcGFjZSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtYXRjaGluZw0KICAgIGlucHV0IHRleHQuIEJ5IGRlZmF1bHQsIHJldHVybnMgYXN0cmluZyBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBwYXJzZWQgdGV4dC4gIA0KICAgICAgIA0KICAgIElmIHRoZSBvcHRpb25hbCBDe2FzU3RyaW5nfSBhcmd1bWVudCBpcyBwYXNzZWQgYXMgQ3tGYWxzZX0sIHRoZW4gdGhlIHJldHVybiB2YWx1ZSBpcyBhIA0KICAgIEN7THtQYXJzZVJlc3VsdHN9fSBjb250YWluaW5nIGFueSByZXN1bHRzIG5hbWVzIHRoYXQgd2VyZSBvcmlnaW5hbGx5IG1hdGNoZWQsIGFuZCBhIA0KICAgIHNpbmdsZSB0b2tlbiBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBtYXRjaGVkIHRleHQgZnJvbSB0aGUgaW5wdXQgc3RyaW5nLiAgU28gaWYgDQogICAgdGhlIGV4cHJlc3Npb24gcGFzc2VkIHRvIEN7THtvcmlnaW5hbFRleHRGb3J9fSBjb250YWlucyBleHByZXNzaW9ucyB3aXRoIGRlZmluZWQNCiAgICByZXN1bHRzIG5hbWVzLCB5b3UgbXVzdCBzZXQgQ3thc1N0cmluZ30gdG8gQ3tGYWxzZX0gaWYgeW91IHdhbnQgdG8gcHJlc2VydmUgdGhvc2UNCiAgICByZXN1bHRzIG5hbWUgdmFsdWVzLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHNyYyA9ICJ0aGlzIGlzIHRlc3QgPGI+IGJvbGQgPGk+dGV4dDwvaT4gPC9iPiBub3JtYWwgdGV4dCAiDQogICAgICAgIGZvciB0YWcgaW4gKCJiIiwiaSIpOg0KICAgICAgICAgICAgb3BlbmVyLGNsb3NlciA9IG1ha2VIVE1MVGFncyh0YWcpDQogICAgICAgICAgICBwYXR0ID0gb3JpZ2luYWxUZXh0Rm9yKG9wZW5lciArIFNraXBUbyhjbG9zZXIpICsgY2xvc2VyKQ0KICAgICAgICAgICAgcHJpbnQocGF0dC5zZWFyY2hTdHJpbmcoc3JjKVswXSkNCiAgICBwcmludHM6Og0KICAgICAgICBbJzxiPiBib2xkIDxpPnRleHQ8L2k+IDwvYj4nXQ0KICAgICAgICBbJzxpPnRleHQ8L2k+J10NCiAgICAiIiINCiAgICBsb2NNYXJrZXIgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGxvYyx0OiBsb2MpDQogICAgZW5kbG9jTWFya2VyID0gbG9jTWFya2VyLmNvcHkoKQ0KICAgIGVuZGxvY01hcmtlci5jYWxsUHJlcGFyc2UgPSBGYWxzZQ0KICAgIG1hdGNoRXhwciA9IGxvY01hcmtlcigiX29yaWdpbmFsX3N0YXJ0IikgKyBleHByICsgZW5kbG9jTWFya2VyKCJfb3JpZ2luYWxfZW5kIikNCiAgICBpZiBhc1N0cmluZzoNCiAgICAgICAgZXh0cmFjdFRleHQgPSBsYW1iZGEgcyxsLHQ6IHNbdC5fb3JpZ2luYWxfc3RhcnQ6dC5fb3JpZ2luYWxfZW5kXQ0KICAgIGVsc2U6DQogICAgICAgIGRlZiBleHRyYWN0VGV4dChzLGwsdCk6DQogICAgICAgICAgICB0WzpdID0gW3NbdC5wb3AoJ19vcmlnaW5hbF9zdGFydCcpOnQucG9wKCdfb3JpZ2luYWxfZW5kJyldXQ0KICAgIG1hdGNoRXhwci5zZXRQYXJzZUFjdGlvbihleHRyYWN0VGV4dCkNCiAgICBtYXRjaEV4cHIuaWdub3JlRXhwcnMgPSBleHByLmlnbm9yZUV4cHJzDQogICAgcmV0dXJuIG1hdGNoRXhwcg0KDQpkZWYgdW5ncm91cChleHByKTogDQogICAgIiIiDQogICAgSGVscGVyIHRvIHVuZG8gcHlwYXJzaW5nJ3MgZGVmYXVsdCBncm91cGluZyBvZiBBbmQgZXhwcmVzc2lvbnMsIGV2ZW4NCiAgICBpZiBhbGwgYnV0IG9uZSBhcmUgbm9uLWVtcHR5Lg0KICAgICIiIg0KICAgIHJldHVybiBUb2tlbkNvbnZlcnRlcihleHByKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdKQ0KDQpkZWYgbG9jYXRlZEV4cHIoZXhwcik6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlY29yYXRlIGEgcmV0dXJuZWQgdG9rZW4gd2l0aCBpdHMgc3RhcnRpbmcgYW5kIGVuZGluZyBsb2NhdGlvbnMgaW4gdGhlIGlucHV0IHN0cmluZy4NCiAgICBUaGlzIGhlbHBlciBhZGRzIHRoZSBmb2xsb3dpbmcgcmVzdWx0cyBuYW1lczoNCiAgICAgLSBsb2NuX3N0YXJ0ID0gbG9jYXRpb24gd2hlcmUgbWF0Y2hlZCBleHByZXNzaW9uIGJlZ2lucw0KICAgICAtIGxvY25fZW5kID0gbG9jYXRpb24gd2hlcmUgbWF0Y2hlZCBleHByZXNzaW9uIGVuZHMNCiAgICAgLSB2YWx1ZSA9IHRoZSBhY3R1YWwgcGFyc2VkIHJlc3VsdHMNCg0KICAgIEJlIGNhcmVmdWwgaWYgdGhlIGlucHV0IHRleHQgY29udGFpbnMgQ3s8VEFCPn0gY2hhcmFjdGVycywgeW91IG1heSB3YW50IHRvIGNhbGwNCiAgICBDe0x7UGFyc2VyRWxlbWVudC5wYXJzZVdpdGhUYWJzfX0NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBmb3IgbWF0Y2ggaW4gbG9jYXRlZEV4cHIod2QpLnNlYXJjaFN0cmluZygibGpzZGYxMjNsa3NkampmMTIzbGtramoxMjIyIik6DQogICAgICAgICAgICBwcmludChtYXRjaCkNCiAgICBwcmludHM6Og0KICAgICAgICBbWzAsICdsanNkZicsIDVdXQ0KICAgICAgICBbWzgsICdsa3NkampmJywgMTVdXQ0KICAgICAgICBbWzE4LCAnbGtramonLCAyM11dDQogICAgIiIiDQogICAgbG9jYXRvciA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OiBsKQ0KICAgIHJldHVybiBHcm91cChsb2NhdG9yKCJsb2NuX3N0YXJ0IikgKyBleHByKCJ2YWx1ZSIpICsgbG9jYXRvci5jb3B5KCkubGVhdmVXaGl0ZXNwYWNlKCkoImxvY25fZW5kIikpDQoNCg0KIyBjb252ZW5pZW5jZSBjb25zdGFudHMgZm9yIHBvc2l0aW9uYWwgZXhwcmVzc2lvbnMNCmVtcHR5ICAgICAgID0gRW1wdHkoKS5zZXROYW1lKCJlbXB0eSIpDQpsaW5lU3RhcnQgICA9IExpbmVTdGFydCgpLnNldE5hbWUoImxpbmVTdGFydCIpDQpsaW5lRW5kICAgICA9IExpbmVFbmQoKS5zZXROYW1lKCJsaW5lRW5kIikNCnN0cmluZ1N0YXJ0ID0gU3RyaW5nU3RhcnQoKS5zZXROYW1lKCJzdHJpbmdTdGFydCIpDQpzdHJpbmdFbmQgICA9IFN0cmluZ0VuZCgpLnNldE5hbWUoInN0cmluZ0VuZCIpDQoNCl9lc2NhcGVkUHVuYyA9IFdvcmQoIF9ic2xhc2gsIHIiXFtdLSouJCtePygpfiAiLCBleGFjdD0yICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnRbMF1bMV0pDQpfZXNjYXBlZEhleENoYXIgPSBSZWdleChyIlxcMD9beFhdWzAtOWEtZkEtRl0rIikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnVuaWNocihpbnQodFswXS5sc3RyaXAocidcMHgnKSwxNikpKQ0KX2VzY2FwZWRPY3RDaGFyID0gUmVnZXgociJcXDBbMC03XSsiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dW5pY2hyKGludCh0WzBdWzE6XSw4KSkpDQpfc2luZ2xlQ2hhciA9IF9lc2NhcGVkUHVuYyB8IF9lc2NhcGVkSGV4Q2hhciB8IF9lc2NhcGVkT2N0Q2hhciB8IFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPXInXF0nLCBleGFjdD0xKSB8IFJlZ2V4KHIiXHciLCByZS5VTklDT0RFKQ0KX2NoYXJSYW5nZSA9IEdyb3VwKF9zaW5nbGVDaGFyICsgU3VwcHJlc3MoIi0iKSArIF9zaW5nbGVDaGFyKQ0KX3JlQnJhY2tldEV4cHIgPSBMaXRlcmFsKCJbIikgKyBPcHRpb25hbCgiXiIpLnNldFJlc3VsdHNOYW1lKCJuZWdhdGUiKSArIEdyb3VwKCBPbmVPck1vcmUoIF9jaGFyUmFuZ2UgfCBfc2luZ2xlQ2hhciApICkuc2V0UmVzdWx0c05hbWUoImJvZHkiKSArICJdIg0KDQpkZWYgc3JhbmdlKHMpOg0KICAgIHIiIiINCiAgICBIZWxwZXIgdG8gZWFzaWx5IGRlZmluZSBzdHJpbmcgcmFuZ2VzIGZvciB1c2UgaW4gV29yZCBjb25zdHJ1Y3Rpb24uICBCb3Jyb3dzDQogICAgc3ludGF4IGZyb20gcmVnZXhwICdbXScgc3RyaW5nIHJhbmdlIGRlZmluaXRpb25zOjoNCiAgICAgICAgc3JhbmdlKCJbMC05XSIpICAgLT4gIjAxMjM0NTY3ODkiDQogICAgICAgIHNyYW5nZSgiW2Etel0iKSAgIC0+ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiINCiAgICAgICAgc3JhbmdlKCJbYS16JF9dIikgLT4gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JF8iDQogICAgVGhlIGlucHV0IHN0cmluZyBtdXN0IGJlIGVuY2xvc2VkIGluIFtdJ3MsIGFuZCB0aGUgcmV0dXJuZWQgc3RyaW5nIGlzIHRoZSBleHBhbmRlZA0KICAgIGNoYXJhY3RlciBzZXQgam9pbmVkIGludG8gYSBzaW5nbGUgc3RyaW5nLg0KICAgIFRoZSB2YWx1ZXMgZW5jbG9zZWQgaW4gdGhlIFtdJ3MgbWF5IGJlOg0KICAgICAtIGEgc2luZ2xlIGNoYXJhY3Rlcg0KICAgICAtIGFuIGVzY2FwZWQgY2hhcmFjdGVyIHdpdGggYSBsZWFkaW5nIGJhY2tzbGFzaCAoc3VjaCBhcyBDe1wtfSBvciBDe1xdfSkNCiAgICAgLSBhbiBlc2NhcGVkIGhleCBjaGFyYWN0ZXIgd2l0aCBhIGxlYWRpbmcgQ3snXHgnfSAoQ3tceDIxfSwgd2hpY2ggaXMgYSBDeychJ30gY2hhcmFjdGVyKSANCiAgICAgICAgIChDe1wweCMjfSBpcyBhbHNvIHN1cHBvcnRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpIA0KICAgICAtIGFuIGVzY2FwZWQgb2N0YWwgY2hhcmFjdGVyIHdpdGggYSBsZWFkaW5nIEN7J1wwJ30gKEN7XDA0MX0sIHdoaWNoIGlzIGEgQ3snISd9IGNoYXJhY3RlcikNCiAgICAgLSBhIHJhbmdlIG9mIGFueSBvZiB0aGUgYWJvdmUsIHNlcGFyYXRlZCBieSBhIGRhc2ggKEN7J2Eteid9LCBldGMuKQ0KICAgICAtIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgYWJvdmUgKEN7J2FlaW91eSd9LCBDeydhLXpBLVowLTlfJCd9LCBldGMuKQ0KICAgICIiIg0KICAgIF9leHBhbmRlZCA9IGxhbWJkYSBwOiBwIGlmIG5vdCBpc2luc3RhbmNlKHAsUGFyc2VSZXN1bHRzKSBlbHNlICcnLmpvaW4odW5pY2hyKGMpIGZvciBjIGluIHJhbmdlKG9yZChwWzBdKSxvcmQocFsxXSkrMSkpDQogICAgdHJ5Og0KICAgICAgICByZXR1cm4gIiIuam9pbihfZXhwYW5kZWQocGFydCkgZm9yIHBhcnQgaW4gX3JlQnJhY2tldEV4cHIucGFyc2VTdHJpbmcocykuYm9keSkNCiAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICByZXR1cm4gIiINCg0KZGVmIG1hdGNoT25seUF0Q29sKG4pOg0KICAgICIiIg0KICAgIEhlbHBlciBtZXRob2QgZm9yIGRlZmluaW5nIHBhcnNlIGFjdGlvbnMgdGhhdCByZXF1aXJlIG1hdGNoaW5nIGF0IGEgc3BlY2lmaWMNCiAgICBjb2x1bW4gaW4gdGhlIGlucHV0IHRleHQuDQogICAgIiIiDQogICAgZGVmIHZlcmlmeUNvbChzdHJnLGxvY24sdG9rcyk6DQogICAgICAgIGlmIGNvbChsb2NuLHN0cmcpICE9IG46DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzdHJnLGxvY24sIm1hdGNoZWQgdG9rZW4gbm90IGF0IGNvbHVtbiAlZCIgJSBuKQ0KICAgIHJldHVybiB2ZXJpZnlDb2wNCg0KZGVmIHJlcGxhY2VXaXRoKHJlcGxTdHIpOg0KICAgICIiIg0KICAgIEhlbHBlciBtZXRob2QgZm9yIGNvbW1vbiBwYXJzZSBhY3Rpb25zIHRoYXQgc2ltcGx5IHJldHVybiBhIGxpdGVyYWwgdmFsdWUuICBFc3BlY2lhbGx5DQogICAgdXNlZnVsIHdoZW4gdXNlZCB3aXRoIEN7THt0cmFuc2Zvcm1TdHJpbmc8UGFyc2VyRWxlbWVudC50cmFuc2Zvcm1TdHJpbmc+fSgpfS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBudW0gPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpDQogICAgICAgIG5hID0gb25lT2YoIk4vQSBOQSIpLnNldFBhcnNlQWN0aW9uKHJlcGxhY2VXaXRoKG1hdGgubmFuKSkNCiAgICAgICAgdGVybSA9IG5hIHwgbnVtDQogICAgICAgIA0KICAgICAgICBPbmVPck1vcmUodGVybSkucGFyc2VTdHJpbmcoIjMyNCAyMzQgTi9BIDIzNCIpICMgLT4gWzMyNCwgMjM0LCBuYW4sIDIzNF0NCiAgICAiIiINCiAgICByZXR1cm4gbGFtYmRhIHMsbCx0OiBbcmVwbFN0cl0NCg0KZGVmIHJlbW92ZVF1b3RlcyhzLGwsdCk6DQogICAgIiIiDQogICAgSGVscGVyIHBhcnNlIGFjdGlvbiBmb3IgcmVtb3ZpbmcgcXVvdGF0aW9uIG1hcmtzIGZyb20gcGFyc2VkIHF1b3RlZCBzdHJpbmdzLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgYnkgZGVmYXVsdCwgcXVvdGF0aW9uIG1hcmtzIGFyZSBpbmNsdWRlZCBpbiBwYXJzZWQgcmVzdWx0cw0KICAgICAgICBxdW90ZWRTdHJpbmcucGFyc2VTdHJpbmcoIidOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCciKSAjIC0+IFsiJ05vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50JyJdDQoNCiAgICAgICAgIyB1c2UgcmVtb3ZlUXVvdGVzIHRvIHN0cmlwIHF1b3RhdGlvbiBtYXJrcyBmcm9tIHBhcnNlZCByZXN1bHRzDQogICAgICAgIHF1b3RlZFN0cmluZy5zZXRQYXJzZUFjdGlvbihyZW1vdmVRdW90ZXMpDQogICAgICAgIHF1b3RlZFN0cmluZy5wYXJzZVN0cmluZygiJ05vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50JyIpICMgLT4gWyJOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCJdDQogICAgIiIiDQogICAgcmV0dXJuIHRbMF1bMTotMV0NCg0KZGVmIHRva2VuTWFwKGZ1bmMsICphcmdzKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVmaW5lIGEgcGFyc2UgYWN0aW9uIGJ5IG1hcHBpbmcgYSBmdW5jdGlvbiB0byBhbGwgZWxlbWVudHMgb2YgYSBQYXJzZVJlc3VsdHMgbGlzdC5JZiBhbnkgYWRkaXRpb25hbCANCiAgICBhcmdzIGFyZSBwYXNzZWQsIHRoZXkgYXJlIGZvcndhcmRlZCB0byB0aGUgZ2l2ZW4gZnVuY3Rpb24gYXMgYWRkaXRpb25hbCBhcmd1bWVudHMgYWZ0ZXINCiAgICB0aGUgdG9rZW4sIGFzIGluIEN7aGV4X2ludGVnZXIgPSBXb3JkKGhleG51bXMpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKGludCwgMTYpKX0sIHdoaWNoIHdpbGwgY29udmVydCB0aGUNCiAgICBwYXJzZWQgZGF0YSB0byBhbiBpbnRlZ2VyIHVzaW5nIGJhc2UgMTYuDQoNCiAgICBFeGFtcGxlIChjb21wYXJlIHRoZSBsYXN0IHRvIGV4YW1wbGUgaW4gTHtQYXJzZXJFbGVtZW50LnRyYW5zZm9ybVN0cmluZ306Og0KICAgICAgICBoZXhfaW50cyA9IE9uZU9yTW9yZShXb3JkKGhleG51bXMpKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChpbnQsIDE2KSkNCiAgICAgICAgaGV4X2ludHMucnVuVGVzdHMoJycnDQogICAgICAgICAgICAwMCAxMSAyMiBhYSBGRiAwYSAwZCAxYQ0KICAgICAgICAgICAgJycnKQ0KICAgICAgICANCiAgICAgICAgdXBwZXJ3b3JkID0gV29yZChhbHBoYXMpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHN0ci51cHBlcikpDQogICAgICAgIE9uZU9yTW9yZSh1cHBlcndvcmQpLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgbXkga2luZ2RvbSBmb3IgYSBob3JzZQ0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIHdkID0gV29yZChhbHBoYXMpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHN0ci50aXRsZSkpDQogICAgICAgIE9uZU9yTW9yZSh3ZCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgbm93IGlzIHRoZSB3aW50ZXIgb2Ygb3VyIGRpc2NvbnRlbnQgbWFkZSBnbG9yaW91cyBzdW1tZXIgYnkgdGhpcyBzdW4gb2YgeW9yaw0KICAgICAgICAgICAgJycnKQ0KICAgIHByaW50czo6DQogICAgICAgIDAwIDExIDIyIGFhIEZGIDBhIDBkIDFhDQogICAgICAgIFswLCAxNywgMzQsIDE3MCwgMjU1LCAxMCwgMTMsIDI2XQ0KDQogICAgICAgIG15IGtpbmdkb20gZm9yIGEgaG9yc2UNCiAgICAgICAgWydNWScsICdLSU5HRE9NJywgJ0ZPUicsICdBJywgJ0hPUlNFJ10NCg0KICAgICAgICBub3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCBtYWRlIGdsb3Jpb3VzIHN1bW1lciBieSB0aGlzIHN1biBvZiB5b3JrDQogICAgICAgIFsnTm93IElzIFRoZSBXaW50ZXIgT2YgT3VyIERpc2NvbnRlbnQgTWFkZSBHbG9yaW91cyBTdW1tZXIgQnkgVGhpcyBTdW4gT2YgWW9yayddDQogICAgIiIiDQogICAgZGVmIHBhKHMsbCx0KToNCiAgICAgICAgcmV0dXJuIFtmdW5jKHRva24sICphcmdzKSBmb3IgdG9rbiBpbiB0XQ0KDQogICAgdHJ5Og0KICAgICAgICBmdW5jX25hbWUgPSBnZXRhdHRyKGZ1bmMsICdfX25hbWVfXycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoZnVuYywgJ19fY2xhc3NfXycpLl9fbmFtZV9fKQ0KICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgIGZ1bmNfbmFtZSA9IHN0cihmdW5jKQ0KICAgIHBhLl9fbmFtZV9fID0gZnVuY19uYW1lDQoNCiAgICByZXR1cm4gcGENCg0KdXBjYXNlVG9rZW5zID0gdG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLnVwcGVyKCkpDQoiIiIoRGVwcmVjYXRlZCkgSGVscGVyIHBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byB1cHBlciBjYXNlLiBEZXByZWNhdGVkIGluIGZhdm9yIG9mIEx7cHlwYXJzaW5nX2NvbW1vbi51cGNhc2VUb2tlbnN9IiIiDQoNCmRvd25jYXNlVG9rZW5zID0gdG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLmxvd2VyKCkpDQoiIiIoRGVwcmVjYXRlZCkgSGVscGVyIHBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byBsb3dlciBjYXNlLiBEZXByZWNhdGVkIGluIGZhdm9yIG9mIEx7cHlwYXJzaW5nX2NvbW1vbi5kb3duY2FzZVRva2Vuc30iIiINCiAgICANCmRlZiBfbWFrZVRhZ3ModGFnU3RyLCB4bWwpOg0KICAgICIiIkludGVybmFsIGhlbHBlciB0byBjb25zdHJ1Y3Qgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcgZXhwcmVzc2lvbnMsIGdpdmVuIGEgdGFnIG5hbWUiIiINCiAgICBpZiBpc2luc3RhbmNlKHRhZ1N0cixiYXNlc3RyaW5nKToNCiAgICAgICAgcmVzbmFtZSA9IHRhZ1N0cg0KICAgICAgICB0YWdTdHIgPSBLZXl3b3JkKHRhZ1N0ciwgY2FzZWxlc3M9bm90IHhtbCkNCiAgICBlbHNlOg0KICAgICAgICByZXNuYW1lID0gdGFnU3RyLm5hbWUNCg0KICAgIHRhZ0F0dHJOYW1lID0gV29yZChhbHBoYXMsYWxwaGFudW1zKyJfLToiKQ0KICAgIGlmICh4bWwpOg0KICAgICAgICB0YWdBdHRyVmFsdWUgPSBkYmxRdW90ZWRTdHJpbmcuY29weSgpLnNldFBhcnNlQWN0aW9uKCByZW1vdmVRdW90ZXMgKQ0KICAgICAgICBvcGVuVGFnID0gU3VwcHJlc3MoIjwiKSArIHRhZ1N0cigidGFnIikgKyBcDQogICAgICAgICAgICAgICAgRGljdChaZXJvT3JNb3JlKEdyb3VwKCB0YWdBdHRyTmFtZSArIFN1cHByZXNzKCI9IikgKyB0YWdBdHRyVmFsdWUgKSkpICsgXA0KICAgICAgICAgICAgICAgIE9wdGlvbmFsKCIvIixkZWZhdWx0PVtGYWxzZV0pLnNldFJlc3VsdHNOYW1lKCJlbXB0eSIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp0WzBdPT0nLycpICsgU3VwcHJlc3MoIj4iKQ0KICAgIGVsc2U6DQogICAgICAgIHByaW50YWJsZXNMZXNzUkFicmFjayA9ICIiLmpvaW4oYyBmb3IgYyBpbiBwcmludGFibGVzIGlmIGMgbm90IGluICI+IikNCiAgICAgICAgdGFnQXR0clZhbHVlID0gcXVvdGVkU3RyaW5nLmNvcHkoKS5zZXRQYXJzZUFjdGlvbiggcmVtb3ZlUXVvdGVzICkgfCBXb3JkKHByaW50YWJsZXNMZXNzUkFicmFjaykNCiAgICAgICAgb3BlblRhZyA9IFN1cHByZXNzKCI8IikgKyB0YWdTdHIoInRhZyIpICsgXA0KICAgICAgICAgICAgICAgIERpY3QoWmVyb09yTW9yZShHcm91cCggdGFnQXR0ck5hbWUuc2V0UGFyc2VBY3Rpb24oZG93bmNhc2VUb2tlbnMpICsgXA0KICAgICAgICAgICAgICAgIE9wdGlvbmFsKCBTdXBwcmVzcygiPSIpICsgdGFnQXR0clZhbHVlICkgKSkpICsgXA0KICAgICAgICAgICAgICAgIE9wdGlvbmFsKCIvIixkZWZhdWx0PVtGYWxzZV0pLnNldFJlc3VsdHNOYW1lKCJlbXB0eSIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp0WzBdPT0nLycpICsgU3VwcHJlc3MoIj4iKQ0KICAgIGNsb3NlVGFnID0gQ29tYmluZShfTCgiPC8iKSArIHRhZ1N0ciArICI+IikNCg0KICAgIG9wZW5UYWcgPSBvcGVuVGFnLnNldFJlc3VsdHNOYW1lKCJzdGFydCIrIiIuam9pbihyZXNuYW1lLnJlcGxhY2UoIjoiLCIgIikudGl0bGUoKS5zcGxpdCgpKSkuc2V0TmFtZSgiPCVzPiIgJSByZXNuYW1lKQ0KICAgIGNsb3NlVGFnID0gY2xvc2VUYWcuc2V0UmVzdWx0c05hbWUoImVuZCIrIiIuam9pbihyZXNuYW1lLnJlcGxhY2UoIjoiLCIgIikudGl0bGUoKS5zcGxpdCgpKSkuc2V0TmFtZSgiPC8lcz4iICUgcmVzbmFtZSkNCiAgICBvcGVuVGFnLnRhZyA9IHJlc25hbWUNCiAgICBjbG9zZVRhZy50YWcgPSByZXNuYW1lDQogICAgcmV0dXJuIG9wZW5UYWcsIGNsb3NlVGFnDQoNCmRlZiBtYWtlSFRNTFRhZ3ModGFnU3RyKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gY29uc3RydWN0IG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFnIGV4cHJlc3Npb25zIGZvciBIVE1MLCBnaXZlbiBhIHRhZyBuYW1lLiBNYXRjaGVzDQogICAgdGFncyBpbiBlaXRoZXIgdXBwZXIgb3IgbG93ZXIgY2FzZSwgYXR0cmlidXRlcyB3aXRoIG5hbWVzcGFjZXMgYW5kIHdpdGggcXVvdGVkIG9yIHVucXVvdGVkIHZhbHVlcy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICB0ZXh0ID0gJzx0ZD5Nb3JlIGluZm8gYXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9weXBhcnNpbmcud2lraXNwYWNlcy5jb20iPnB5cGFyc2luZzwvYT4gd2lraSBwYWdlPC90ZD4nDQogICAgICAgICMgbWFrZUhUTUxUYWdzIHJldHVybnMgcHlwYXJzaW5nIGV4cHJlc3Npb25zIGZvciB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyB0YWdzIGFzIGEgMi10dXBsZQ0KICAgICAgICBhLGFfZW5kID0gbWFrZUhUTUxUYWdzKCJBIikNCiAgICAgICAgbGlua19leHByID0gYSArIFNraXBUbyhhX2VuZCkoImxpbmtfdGV4dCIpICsgYV9lbmQNCiAgICAgICAgDQogICAgICAgIGZvciBsaW5rIGluIGxpbmtfZXhwci5zZWFyY2hTdHJpbmcodGV4dCk6DQogICAgICAgICAgICAjIGF0dHJpYnV0ZXMgaW4gdGhlIDxBPiB0YWcgKGxpa2UgImhyZWYiIHNob3duIGhlcmUpIGFyZSBhbHNvIGFjY2Vzc2libGUgYXMgbmFtZWQgcmVzdWx0cw0KICAgICAgICAgICAgcHJpbnQobGluay5saW5rX3RleHQsICctPicsIGxpbmsuaHJlZikNCiAgICBwcmludHM6Og0KICAgICAgICBweXBhcnNpbmcgLT4gaHR0cDovL3B5cGFyc2luZy53aWtpc3BhY2VzLmNvbQ0KICAgICIiIg0KICAgIHJldHVybiBfbWFrZVRhZ3MoIHRhZ1N0ciwgRmFsc2UgKQ0KDQpkZWYgbWFrZVhNTFRhZ3ModGFnU3RyKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gY29uc3RydWN0IG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFnIGV4cHJlc3Npb25zIGZvciBYTUwsIGdpdmVuIGEgdGFnIG5hbWUuIE1hdGNoZXMNCiAgICB0YWdzIG9ubHkgaW4gdGhlIGdpdmVuIHVwcGVyL2xvd2VyIGNhc2UuDQoNCiAgICBFeGFtcGxlOiBzaW1pbGFyIHRvIEx7bWFrZUhUTUxUYWdzfQ0KICAgICIiIg0KICAgIHJldHVybiBfbWFrZVRhZ3MoIHRhZ1N0ciwgVHJ1ZSApDQoNCmRlZiB3aXRoQXR0cmlidXRlKCphcmdzLCoqYXR0ckRpY3QpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBjcmVhdGUgYSB2YWxpZGF0aW5nIHBhcnNlIGFjdGlvbiB0byBiZSB1c2VkIHdpdGggc3RhcnQgdGFncyBjcmVhdGVkDQogICAgd2l0aCBDe0x7bWFrZVhNTFRhZ3N9fSBvciBDe0x7bWFrZUhUTUxUYWdzfX0uIFVzZSBDe3dpdGhBdHRyaWJ1dGV9IHRvIHF1YWxpZnkgYSBzdGFydGluZyB0YWcNCiAgICB3aXRoIGEgcmVxdWlyZWQgYXR0cmlidXRlIHZhbHVlLCB0byBhdm9pZCBmYWxzZSBtYXRjaGVzIG9uIGNvbW1vbiB0YWdzIHN1Y2ggYXMNCiAgICBDezxURD59IG9yIEN7PERJVj59Lg0KDQogICAgQ2FsbCBDe3dpdGhBdHRyaWJ1dGV9IHdpdGggYSBzZXJpZXMgb2YgYXR0cmlidXRlIG5hbWVzIGFuZCB2YWx1ZXMuIFNwZWNpZnkgdGhlIGxpc3QNCiAgICBvZiBmaWx0ZXIgYXR0cmlidXRlcyBuYW1lcyBhbmQgdmFsdWVzIGFzOg0KICAgICAtIGtleXdvcmQgYXJndW1lbnRzLCBhcyBpbiBDeyhhbGlnbj0icmlnaHQiKX0sIG9yDQogICAgIC0gYXMgYW4gZXhwbGljaXQgZGljdCB3aXRoIEN7Kip9IG9wZXJhdG9yLCB3aGVuIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIGFsc28gYSBQeXRob24NCiAgICAgICAgICByZXNlcnZlZCB3b3JkLCBhcyBpbiBDeyoqeyJjbGFzcyI6IkN1c3RvbWVyIiwgImFsaWduIjoicmlnaHQifX0NCiAgICAgLSBhIGxpc3Qgb2YgbmFtZS12YWx1ZSB0dXBsZXMsIGFzIGluICggKCJuczE6Y2xhc3MiLCAiQ3VzdG9tZXIiKSwgKCJuczI6YWxpZ24iLCJyaWdodCIpICkNCiAgICBGb3IgYXR0cmlidXRlIG5hbWVzIHdpdGggYSBuYW1lc3BhY2UgcHJlZml4LCB5b3UgbXVzdCB1c2UgdGhlIHNlY29uZCBmb3JtLiAgQXR0cmlidXRlDQogICAgbmFtZXMgYXJlIG1hdGNoZWQgaW5zZW5zaXRpdmUgdG8gdXBwZXIvbG93ZXIgY2FzZS4NCiAgICAgICANCiAgICBJZiBqdXN0IHRlc3RpbmcgZm9yIEN7Y2xhc3N9ICh3aXRoIG9yIHdpdGhvdXQgYSBuYW1lc3BhY2UpLCB1c2UgQ3tMe3dpdGhDbGFzc319Lg0KDQogICAgVG8gdmVyaWZ5IHRoYXQgdGhlIGF0dHJpYnV0ZSBleGlzdHMsIGJ1dCB3aXRob3V0IHNwZWNpZnlpbmcgYSB2YWx1ZSwgcGFzcw0KICAgIEN7d2l0aEF0dHJpYnV0ZS5BTllfVkFMVUV9IGFzIHRoZSB2YWx1ZS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBodG1sID0gJycnDQogICAgICAgICAgICA8ZGl2Pg0KICAgICAgICAgICAgU29tZSB0ZXh0DQogICAgICAgICAgICA8ZGl2IHR5cGU9ImdyaWQiPjEgNCAwIDEgMDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiB0eXBlPSJncmFwaCI+MSwzIDIsMyAxLDE8L2Rpdj4NCiAgICAgICAgICAgIDxkaXY+dGhpcyBoYXMgbm8gdHlwZTwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgDQogICAgICAgICcnJw0KICAgICAgICBkaXYsZGl2X2VuZCA9IG1ha2VIVE1MVGFncygiZGl2IikNCg0KICAgICAgICAjIG9ubHkgbWF0Y2ggZGl2IHRhZyBoYXZpbmcgYSB0eXBlIGF0dHJpYnV0ZSB3aXRoIHZhbHVlICJncmlkIg0KICAgICAgICBkaXZfZ3JpZCA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhBdHRyaWJ1dGUodHlwZT0iZ3JpZCIpKQ0KICAgICAgICBncmlkX2V4cHIgPSBkaXZfZ3JpZCArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpDQogICAgICAgIGZvciBncmlkX2hlYWRlciBpbiBncmlkX2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOg0KICAgICAgICAgICAgcHJpbnQoZ3JpZF9oZWFkZXIuYm9keSkNCiAgICAgICAgDQogICAgICAgICMgY29uc3RydWN0IGEgbWF0Y2ggd2l0aCBhbnkgZGl2IHRhZyBoYXZpbmcgYSB0eXBlIGF0dHJpYnV0ZSwgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUNCiAgICAgICAgZGl2X2FueV90eXBlID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aEF0dHJpYnV0ZSh0eXBlPXdpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFKSkNCiAgICAgICAgZGl2X2V4cHIgPSBkaXZfYW55X3R5cGUgKyBTa2lwVG8oZGl2IHwgZGl2X2VuZCkoImJvZHkiKQ0KICAgICAgICBmb3IgZGl2X2hlYWRlciBpbiBkaXZfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6DQogICAgICAgICAgICBwcmludChkaXZfaGVhZGVyLmJvZHkpDQogICAgcHJpbnRzOjoNCiAgICAgICAgMSA0IDAgMSAwDQoNCiAgICAgICAgMSA0IDAgMSAwDQogICAgICAgIDEsMyAyLDMgMSwxDQogICAgIiIiDQogICAgaWYgYXJnczoNCiAgICAgICAgYXR0cnMgPSBhcmdzWzpdDQogICAgZWxzZToNCiAgICAgICAgYXR0cnMgPSBhdHRyRGljdC5pdGVtcygpDQogICAgYXR0cnMgPSBbKGssdikgZm9yIGssdiBpbiBhdHRyc10NCiAgICBkZWYgcGEocyxsLHRva2Vucyk6DQogICAgICAgIGZvciBhdHRyTmFtZSxhdHRyVmFsdWUgaW4gYXR0cnM6DQogICAgICAgICAgICBpZiBhdHRyTmFtZSBub3QgaW4gdG9rZW5zOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm8gbWF0Y2hpbmcgYXR0cmlidXRlICIgKyBhdHRyTmFtZSkNCiAgICAgICAgICAgIGlmIGF0dHJWYWx1ZSAhPSB3aXRoQXR0cmlidXRlLkFOWV9WQUxVRSBhbmQgdG9rZW5zW2F0dHJOYW1lXSAhPSBhdHRyVmFsdWU6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJhdHRyaWJ1dGUgJyVzJyBoYXMgdmFsdWUgJyVzJywgbXVzdCBiZSAnJXMnIiAlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdHRyTmFtZSwgdG9rZW5zW2F0dHJOYW1lXSwgYXR0clZhbHVlKSkNCiAgICByZXR1cm4gcGENCndpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFID0gb2JqZWN0KCkNCg0KZGVmIHdpdGhDbGFzcyhjbGFzc25hbWUsIG5hbWVzcGFjZT0nJyk6DQogICAgIiIiDQogICAgU2ltcGxpZmllZCB2ZXJzaW9uIG9mIEN7THt3aXRoQXR0cmlidXRlfX0gd2hlbiBtYXRjaGluZyBvbiBhIGRpdiBjbGFzcyAtIG1hZGUNCiAgICBkaWZmaWN1bHQgYmVjYXVzZSBDe2NsYXNzfSBpcyBhIHJlc2VydmVkIHdvcmQgaW4gUHl0aG9uLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGh0bWwgPSAnJycNCiAgICAgICAgICAgIDxkaXY+DQogICAgICAgICAgICBTb21lIHRleHQNCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdyaWQiPjEgNCAwIDEgMDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JhcGgiPjEsMyAyLDMgMSwxPC9kaXY+DQogICAgICAgICAgICA8ZGl2PnRoaXMgJmx0O2RpdiZndDsgaGFzIG5vIGNsYXNzPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICANCiAgICAgICAgJycnDQogICAgICAgIGRpdixkaXZfZW5kID0gbWFrZUhUTUxUYWdzKCJkaXYiKQ0KICAgICAgICBkaXZfZ3JpZCA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhDbGFzcygiZ3JpZCIpKQ0KICAgICAgICANCiAgICAgICAgZ3JpZF9leHByID0gZGl2X2dyaWQgKyBTa2lwVG8oZGl2IHwgZGl2X2VuZCkoImJvZHkiKQ0KICAgICAgICBmb3IgZ3JpZF9oZWFkZXIgaW4gZ3JpZF9leHByLnNlYXJjaFN0cmluZyhodG1sKToNCiAgICAgICAgICAgIHByaW50KGdyaWRfaGVhZGVyLmJvZHkpDQogICAgICAgIA0KICAgICAgICBkaXZfYW55X3R5cGUgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQ2xhc3Mod2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUpKQ0KICAgICAgICBkaXZfZXhwciA9IGRpdl9hbnlfdHlwZSArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpDQogICAgICAgIGZvciBkaXZfaGVhZGVyIGluIGRpdl9leHByLnNlYXJjaFN0cmluZyhodG1sKToNCiAgICAgICAgICAgIHByaW50KGRpdl9oZWFkZXIuYm9keSkNCiAgICBwcmludHM6Og0KICAgICAgICAxIDQgMCAxIDANCg0KICAgICAgICAxIDQgMCAxIDANCiAgICAgICAgMSwzIDIsMyAxLDENCiAgICAiIiINCiAgICBjbGFzc2F0dHIgPSAiJXM6Y2xhc3MiICUgbmFtZXNwYWNlIGlmIG5hbWVzcGFjZSBlbHNlICJjbGFzcyINCiAgICByZXR1cm4gd2l0aEF0dHJpYnV0ZSgqKntjbGFzc2F0dHIgOiBjbGFzc25hbWV9KSAgICAgICAgDQoNCm9wQXNzb2MgPSBfQ29uc3RhbnRzKCkNCm9wQXNzb2MuTEVGVCA9IG9iamVjdCgpDQpvcEFzc29jLlJJR0hUID0gb2JqZWN0KCkNCg0KZGVmIGluZml4Tm90YXRpb24oIGJhc2VFeHByLCBvcExpc3QsIGxwYXI9U3VwcHJlc3MoJygnKSwgcnBhcj1TdXBwcmVzcygnKScpICk6DQogICAgIiIiDQogICAgSGVscGVyIG1ldGhvZCBmb3IgY29uc3RydWN0aW5nIGdyYW1tYXJzIG9mIGV4cHJlc3Npb25zIG1hZGUgdXAgb2YNCiAgICBvcGVyYXRvcnMgd29ya2luZyBpbiBhIHByZWNlZGVuY2UgaGllcmFyY2h5LiAgT3BlcmF0b3JzIG1heSBiZSB1bmFyeSBvcg0KICAgIGJpbmFyeSwgbGVmdC0gb3IgcmlnaHQtYXNzb2NpYXRpdmUuICBQYXJzZSBhY3Rpb25zIGNhbiBhbHNvIGJlIGF0dGFjaGVkDQogICAgdG8gb3BlcmF0b3IgZXhwcmVzc2lvbnMuIFRoZSBnZW5lcmF0ZWQgcGFyc2VyIHdpbGwgYWxzbyByZWNvZ25pemUgdGhlIHVzZSANCiAgICBvZiBwYXJlbnRoZXNlcyB0byBvdmVycmlkZSBvcGVyYXRvciBwcmVjZWRlbmNlcyAoc2VlIGV4YW1wbGUgYmVsb3cpLg0KICAgIA0KICAgIE5vdGU6IGlmIHlvdSBkZWZpbmUgYSBkZWVwIG9wZXJhdG9yIGxpc3QsIHlvdSBtYXkgc2VlIHBlcmZvcm1hbmNlIGlzc3Vlcw0KICAgIHdoZW4gdXNpbmcgaW5maXhOb3RhdGlvbi4gU2VlIEx7UGFyc2VyRWxlbWVudC5lbmFibGVQYWNrcmF0fSBmb3IgYQ0KICAgIG1lY2hhbmlzbSB0byBwb3RlbnRpYWxseSBpbXByb3ZlIHlvdXIgcGFyc2VyIHBlcmZvcm1hbmNlLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBiYXNlRXhwciAtIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBtb3N0IGJhc2ljIGVsZW1lbnQgZm9yIHRoZSBuZXN0ZWQNCiAgICAgLSBvcExpc3QgLSBsaXN0IG9mIHR1cGxlcywgb25lIGZvciBlYWNoIG9wZXJhdG9yIHByZWNlZGVuY2UgbGV2ZWwgaW4gdGhlDQogICAgICBleHByZXNzaW9uIGdyYW1tYXI7IGVhY2ggdHVwbGUgaXMgb2YgdGhlIGZvcm0NCiAgICAgIChvcEV4cHIsIG51bVRlcm1zLCByaWdodExlZnRBc3NvYywgcGFyc2VBY3Rpb24pLCB3aGVyZToNCiAgICAgICAtIG9wRXhwciBpcyB0aGUgcHlwYXJzaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBvcGVyYXRvcjsNCiAgICAgICAgICBtYXkgYWxzbyBiZSBhIHN0cmluZywgd2hpY2ggd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBMaXRlcmFsOw0KICAgICAgICAgIGlmIG51bVRlcm1zIGlzIDMsIG9wRXhwciBpcyBhIHR1cGxlIG9mIHR3byBleHByZXNzaW9ucywgZm9yIHRoZQ0KICAgICAgICAgIHR3byBvcGVyYXRvcnMgc2VwYXJhdGluZyB0aGUgMyB0ZXJtcw0KICAgICAgIC0gbnVtVGVybXMgaXMgdGhlIG51bWJlciBvZiB0ZXJtcyBmb3IgdGhpcyBvcGVyYXRvciAobXVzdA0KICAgICAgICAgIGJlIDEsIDIsIG9yIDMpDQogICAgICAgLSByaWdodExlZnRBc3NvYyBpcyB0aGUgaW5kaWNhdG9yIHdoZXRoZXIgdGhlIG9wZXJhdG9yIGlzDQogICAgICAgICAgcmlnaHQgb3IgbGVmdCBhc3NvY2lhdGl2ZSwgdXNpbmcgdGhlIHB5cGFyc2luZy1kZWZpbmVkDQogICAgICAgICAgY29uc3RhbnRzIEN7b3BBc3NvYy5SSUdIVH0gYW5kIEN7b3BBc3NvYy5MRUZUfS4NCiAgICAgICAtIHBhcnNlQWN0aW9uIGlzIHRoZSBwYXJzZSBhY3Rpb24gdG8gYmUgYXNzb2NpYXRlZCB3aXRoDQogICAgICAgICAgZXhwcmVzc2lvbnMgbWF0Y2hpbmcgdGhpcyBvcGVyYXRvciBleHByZXNzaW9uICh0aGUNCiAgICAgICAgICBwYXJzZSBhY3Rpb24gdHVwbGUgbWVtYmVyIG1heSBiZSBvbWl0dGVkKQ0KICAgICAtIGxwYXIgLSBleHByZXNzaW9uIGZvciBtYXRjaGluZyBsZWZ0LXBhcmVudGhlc2VzIChkZWZhdWx0PUN7U3VwcHJlc3MoJygnKX0pDQogICAgIC0gcnBhciAtIGV4cHJlc3Npb24gZm9yIG1hdGNoaW5nIHJpZ2h0LXBhcmVudGhlc2VzIChkZWZhdWx0PUN7U3VwcHJlc3MoJyknKX0pDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBzaW1wbGUgZXhhbXBsZSBvZiBmb3VyLWZ1bmN0aW9uIGFyaXRobWV0aWMgd2l0aCBpbnRzIGFuZCB2YXJpYWJsZSBuYW1lcw0KICAgICAgICBpbnRlZ2VyID0gcHlwYXJzaW5nX2NvbW1vbi5zaWduZWRfaW50ZWdlcg0KICAgICAgICB2YXJuYW1lID0gcHlwYXJzaW5nX2NvbW1vbi5pZGVudGlmaWVyIA0KICAgICAgICANCiAgICAgICAgYXJpdGhfZXhwciA9IGluZml4Tm90YXRpb24oaW50ZWdlciB8IHZhcm5hbWUsDQogICAgICAgICAgICBbDQogICAgICAgICAgICAoJy0nLCAxLCBvcEFzc29jLlJJR0hUKSwNCiAgICAgICAgICAgIChvbmVPZignKiAvJyksIDIsIG9wQXNzb2MuTEVGVCksDQogICAgICAgICAgICAob25lT2YoJysgLScpLCAyLCBvcEFzc29jLkxFRlQpLA0KICAgICAgICAgICAgXSkNCiAgICAgICAgDQogICAgICAgIGFyaXRoX2V4cHIucnVuVGVzdHMoJycnDQogICAgICAgICAgICA1KzMqNg0KICAgICAgICAgICAgKDUrMykqNg0KICAgICAgICAgICAgLTItLTExDQogICAgICAgICAgICAnJycsIGZ1bGxEdW1wPUZhbHNlKQ0KICAgIHByaW50czo6DQogICAgICAgIDUrMyo2DQogICAgICAgIFtbNSwgJysnLCBbMywgJyonLCA2XV1dDQoNCiAgICAgICAgKDUrMykqNg0KICAgICAgICBbW1s1LCAnKycsIDNdLCAnKicsIDZdXQ0KDQogICAgICAgIC0yLS0xMQ0KICAgICAgICBbW1snLScsIDJdLCAnLScsIFsnLScsIDExXV1dDQogICAgIiIiDQogICAgcmV0ID0gRm9yd2FyZCgpDQogICAgbGFzdEV4cHIgPSBiYXNlRXhwciB8ICggbHBhciArIHJldCArIHJwYXIgKQ0KICAgIGZvciBpLG9wZXJEZWYgaW4gZW51bWVyYXRlKG9wTGlzdCk6DQogICAgICAgIG9wRXhwcixhcml0eSxyaWdodExlZnRBc3NvYyxwYSA9IChvcGVyRGVmICsgKE5vbmUsKSlbOjRdDQogICAgICAgIHRlcm1OYW1lID0gIiVzIHRlcm0iICUgb3BFeHByIGlmIGFyaXR5IDwgMyBlbHNlICIlcyVzIHRlcm0iICUgb3BFeHByDQogICAgICAgIGlmIGFyaXR5ID09IDM6DQogICAgICAgICAgICBpZiBvcEV4cHIgaXMgTm9uZSBvciBsZW4ob3BFeHByKSAhPSAyOg0KICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImlmIG51bXRlcm1zPTMsIG9wRXhwciBtdXN0IGJlIGEgdHVwbGUgb3IgbGlzdCBvZiB0d28gZXhwcmVzc2lvbnMiKQ0KICAgICAgICAgICAgb3BFeHByMSwgb3BFeHByMiA9IG9wRXhwcg0KICAgICAgICB0aGlzRXhwciA9IEZvcndhcmQoKS5zZXROYW1lKHRlcm1OYW1lKQ0KICAgICAgICBpZiByaWdodExlZnRBc3NvYyA9PSBvcEFzc29jLkxFRlQ6DQogICAgICAgICAgICBpZiBhcml0eSA9PSAxOg0KICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCBvcEV4cHIgKSApDQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDI6DQogICAgICAgICAgICAgICAgaWYgb3BFeHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByICsgbGFzdEV4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKCBvcEV4cHIgKyBsYXN0RXhwciApICkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByK2xhc3RFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZShsYXN0RXhwcikgKQ0KICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAzOg0KICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIxICsgbGFzdEV4cHIgKyBvcEV4cHIyICsgbGFzdEV4cHIpICsgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwKCBsYXN0RXhwciArIG9wRXhwcjEgKyBsYXN0RXhwciArIG9wRXhwcjIgKyBsYXN0RXhwciApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZXJhdG9yIG11c3QgYmUgdW5hcnkgKDEpLCBiaW5hcnkgKDIpLCBvciB0ZXJuYXJ5ICgzKSIpDQogICAgICAgIGVsaWYgcmlnaHRMZWZ0QXNzb2MgPT0gb3BBc3NvYy5SSUdIVDoNCiAgICAgICAgICAgIGlmIGFyaXR5ID09IDE6DQogICAgICAgICAgICAgICAgIyB0cnkgdG8gYXZvaWQgTFIgd2l0aCB0aGlzIGV4dHJhIHRlc3QNCiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvcEV4cHIsIE9wdGlvbmFsKToNCiAgICAgICAgICAgICAgICAgICAgb3BFeHByID0gT3B0aW9uYWwob3BFeHByKQ0KICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkob3BFeHByLmV4cHIgKyB0aGlzRXhwcikgKyBHcm91cCggb3BFeHByICsgdGhpc0V4cHIgKQ0KICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAyOg0KICAgICAgICAgICAgICAgIGlmIG9wRXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwciArIHRoaXNFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZSggb3BFeHByICsgdGhpc0V4cHIgKSApDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIHRoaXNFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZSggdGhpc0V4cHIgKSApDQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDM6DQogICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwcjEgKyB0aGlzRXhwciArIG9wRXhwcjIgKyB0aGlzRXhwcikgKyBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAoIGxhc3RFeHByICsgb3BFeHByMSArIHRoaXNFeHByICsgb3BFeHByMiArIHRoaXNFeHByICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlcmF0b3IgbXVzdCBiZSB1bmFyeSAoMSksIGJpbmFyeSAoMiksIG9yIHRlcm5hcnkgKDMpIikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZXJhdG9yIG11c3QgaW5kaWNhdGUgcmlnaHQgb3IgbGVmdCBhc3NvY2lhdGl2aXR5IikNCiAgICAgICAgaWYgcGE6DQogICAgICAgICAgICBtYXRjaEV4cHIuc2V0UGFyc2VBY3Rpb24oIHBhICkNCiAgICAgICAgdGhpc0V4cHIgPDw9ICggbWF0Y2hFeHByLnNldE5hbWUodGVybU5hbWUpIHwgbGFzdEV4cHIgKQ0KICAgICAgICBsYXN0RXhwciA9IHRoaXNFeHByDQogICAgcmV0IDw8PSBsYXN0RXhwcg0KICAgIHJldHVybiByZXQNCg0Kb3BlcmF0b3JQcmVjZWRlbmNlID0gaW5maXhOb3RhdGlvbg0KIiIiKERlcHJlY2F0ZWQpIEZvcm1lciBuYW1lIG9mIEN7THtpbmZpeE5vdGF0aW9ufX0sIHdpbGwgYmUgZHJvcHBlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLiIiIg0KDQpkYmxRdW90ZWRTdHJpbmcgPSBDb21iaW5lKFJlZ2V4KHInIig/OlteIlxuXHJcXF18KD86IiIpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKicpKyciJykuc2V0TmFtZSgic3RyaW5nIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMiKQ0Kc2dsUXVvdGVkU3RyaW5nID0gQ29tYmluZShSZWdleChyIicoPzpbXidcblxyXFxdfCg/OicnKXwoPzpcXCg/OlteeF18eFswLTlhLWZBLUZdKykpKSoiKSsiJyIpLnNldE5hbWUoInN0cmluZyBlbmNsb3NlZCBpbiBzaW5nbGUgcXVvdGVzIikNCnF1b3RlZFN0cmluZyA9IENvbWJpbmUoUmVnZXgociciKD86W14iXG5cclxcXXwoPzoiIil8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqJykrJyInfA0KICAgICAgICAgICAgICAgICAgICAgICBSZWdleChyIicoPzpbXidcblxyXFxdfCg/OicnKXwoPzpcXCg/OlteeF18eFswLTlhLWZBLUZdKykpKSoiKSsiJyIpLnNldE5hbWUoInF1b3RlZFN0cmluZyB1c2luZyBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcyIpDQp1bmljb2RlU3RyaW5nID0gQ29tYmluZShfTCgndScpICsgcXVvdGVkU3RyaW5nLmNvcHkoKSkuc2V0TmFtZSgidW5pY29kZSBzdHJpbmcgbGl0ZXJhbCIpDQoNCmRlZiBuZXN0ZWRFeHByKG9wZW5lcj0iKCIsIGNsb3Nlcj0iKSIsIGNvbnRlbnQ9Tm9uZSwgaWdub3JlRXhwcj1xdW90ZWRTdHJpbmcuY29weSgpKToNCiAgICAiIiINCiAgICBIZWxwZXIgbWV0aG9kIGZvciBkZWZpbmluZyBuZXN0ZWQgbGlzdHMgZW5jbG9zZWQgaW4gb3BlbmluZyBhbmQgY2xvc2luZw0KICAgIGRlbGltaXRlcnMgKCIoIiBhbmQgIikiIGFyZSB0aGUgZGVmYXVsdCkuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIG9wZW5lciAtIG9wZW5pbmcgY2hhcmFjdGVyIGZvciBhIG5lc3RlZCBsaXN0IChkZWZhdWx0PUN7IigifSk7IGNhbiBhbHNvIGJlIGEgcHlwYXJzaW5nIGV4cHJlc3Npb24NCiAgICAgLSBjbG9zZXIgLSBjbG9zaW5nIGNoYXJhY3RlciBmb3IgYSBuZXN0ZWQgbGlzdCAoZGVmYXVsdD1DeyIpIn0pOyBjYW4gYWxzbyBiZSBhIHB5cGFyc2luZyBleHByZXNzaW9uDQogICAgIC0gY29udGVudCAtIGV4cHJlc3Npb24gZm9yIGl0ZW1zIHdpdGhpbiB0aGUgbmVzdGVkIGxpc3RzIChkZWZhdWx0PUN7Tm9uZX0pDQogICAgIC0gaWdub3JlRXhwciAtIGV4cHJlc3Npb24gZm9yIGlnbm9yaW5nIG9wZW5pbmcgYW5kIGNsb3NpbmcgZGVsaW1pdGVycyAoZGVmYXVsdD1De3F1b3RlZFN0cmluZ30pDQoNCiAgICBJZiBhbiBleHByZXNzaW9uIGlzIG5vdCBwcm92aWRlZCBmb3IgdGhlIGNvbnRlbnQgYXJndW1lbnQsIHRoZSBuZXN0ZWQNCiAgICBleHByZXNzaW9uIHdpbGwgY2FwdHVyZSBhbGwgd2hpdGVzcGFjZS1kZWxpbWl0ZWQgY29udGVudCBiZXR3ZWVuIGRlbGltaXRlcnMNCiAgICBhcyBhIGxpc3Qgb2Ygc2VwYXJhdGUgdmFsdWVzLg0KDQogICAgVXNlIHRoZSBDe2lnbm9yZUV4cHJ9IGFyZ3VtZW50IHRvIGRlZmluZSBleHByZXNzaW9ucyB0aGF0IG1heSBjb250YWluDQogICAgb3BlbmluZyBvciBjbG9zaW5nIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgbm90IGJlIHRyZWF0ZWQgYXMgb3BlbmluZw0KICAgIG9yIGNsb3NpbmcgY2hhcmFjdGVycyBmb3IgbmVzdGluZywgc3VjaCBhcyBxdW90ZWRTdHJpbmcgb3IgYSBjb21tZW50DQogICAgZXhwcmVzc2lvbi4gIFNwZWNpZnkgbXVsdGlwbGUgZXhwcmVzc2lvbnMgdXNpbmcgYW4gQ3tMe09yfX0gb3IgQ3tMe01hdGNoRmlyc3R9fS4NCiAgICBUaGUgZGVmYXVsdCBpcyBMe3F1b3RlZFN0cmluZ30sIGJ1dCBpZiBubyBleHByZXNzaW9ucyBhcmUgdG8gYmUgaWdub3JlZCwNCiAgICB0aGVuIHBhc3MgQ3tOb25lfSBmb3IgdGhpcyBhcmd1bWVudC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBkYXRhX3R5cGUgPSBvbmVPZigidm9pZCBpbnQgc2hvcnQgbG9uZyBjaGFyIGZsb2F0IGRvdWJsZSIpDQogICAgICAgIGRlY2xfZGF0YV90eXBlID0gQ29tYmluZShkYXRhX3R5cGUgKyBPcHRpb25hbChXb3JkKCcqJykpKQ0KICAgICAgICBpZGVudCA9IFdvcmQoYWxwaGFzKydfJywgYWxwaGFudW1zKydfJykNCiAgICAgICAgbnVtYmVyID0gcHlwYXJzaW5nX2NvbW1vbi5udW1iZXINCiAgICAgICAgYXJnID0gR3JvdXAoZGVjbF9kYXRhX3R5cGUgKyBpZGVudCkNCiAgICAgICAgTFBBUixSUEFSID0gbWFwKFN1cHByZXNzLCAiKCkiKQ0KDQogICAgICAgIGNvZGVfYm9keSA9IG5lc3RlZEV4cHIoJ3snLCAnfScsIGlnbm9yZUV4cHI9KHF1b3RlZFN0cmluZyB8IGNTdHlsZUNvbW1lbnQpKQ0KDQogICAgICAgIGNfZnVuY3Rpb24gPSAoZGVjbF9kYXRhX3R5cGUoInR5cGUiKSANCiAgICAgICAgICAgICAgICAgICAgICArIGlkZW50KCJuYW1lIikNCiAgICAgICAgICAgICAgICAgICAgICArIExQQVIgKyBPcHRpb25hbChkZWxpbWl0ZWRMaXN0KGFyZyksIFtdKSgiYXJncyIpICsgUlBBUiANCiAgICAgICAgICAgICAgICAgICAgICArIGNvZGVfYm9keSgiYm9keSIpKQ0KICAgICAgICBjX2Z1bmN0aW9uLmlnbm9yZShjU3R5bGVDb21tZW50KQ0KICAgICAgICANCiAgICAgICAgc291cmNlX2NvZGUgPSAnJycNCiAgICAgICAgICAgIGludCBpc19vZGQoaW50IHgpIHsgDQogICAgICAgICAgICAgICAgcmV0dXJuICh4JTIpOyANCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIGludCBkZWNfdG9faGV4KGNoYXIgaGNoYXIpIHsgDQogICAgICAgICAgICAgICAgaWYgKGhjaGFyID49ICcwJyAmJiBoY2hhciA8PSAnOScpIHsgDQogICAgICAgICAgICAgICAgICAgIHJldHVybiAob3JkKGhjaGFyKS1vcmQoJzAnKSk7IA0KICAgICAgICAgICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDEwK29yZChoY2hhciktb3JkKCdBJykpOw0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICB9DQogICAgICAgICcnJw0KICAgICAgICBmb3IgZnVuYyBpbiBjX2Z1bmN0aW9uLnNlYXJjaFN0cmluZyhzb3VyY2VfY29kZSk6DQogICAgICAgICAgICBwcmludCgiJShuYW1lKXMgKCUodHlwZSlzKSBhcmdzOiAlKGFyZ3MpcyIgJSBmdW5jKQ0KDQogICAgcHJpbnRzOjoNCiAgICAgICAgaXNfb2RkIChpbnQpIGFyZ3M6IFtbJ2ludCcsICd4J11dDQogICAgICAgIGRlY190b19oZXggKGludCkgYXJnczogW1snY2hhcicsICdoY2hhciddXQ0KICAgICIiIg0KICAgIGlmIG9wZW5lciA9PSBjbG9zZXI6DQogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZW5pbmcgYW5kIGNsb3Npbmcgc3RyaW5ncyBjYW5ub3QgYmUgdGhlIHNhbWUiKQ0KICAgIGlmIGNvbnRlbnQgaXMgTm9uZToNCiAgICAgICAgaWYgaXNpbnN0YW5jZShvcGVuZXIsYmFzZXN0cmluZykgYW5kIGlzaW5zdGFuY2UoY2xvc2VyLGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgaWYgbGVuKG9wZW5lcikgPT0gMSBhbmQgbGVuKGNsb3Nlcik9PTE6DQogICAgICAgICAgICAgICAgaWYgaWdub3JlRXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChDb21iaW5lKE9uZU9yTW9yZSh+aWdub3JlRXhwciArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc05vdEluKG9wZW5lcitjbG9zZXIrUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLGV4YWN0PTEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChlbXB0eS5jb3B5KCkrQ2hhcnNOb3RJbihvcGVuZXIrY2xvc2VyK1BhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGlmIGlnbm9yZUV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoQ29tYmluZShPbmVPck1vcmUofmlnbm9yZUV4cHIgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5MaXRlcmFsKG9wZW5lcikgKyB+TGl0ZXJhbChjbG9zZXIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzTm90SW4oUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTLGV4YWN0PTEpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OnRbMF0uc3RyaXAoKSkpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChDb21iaW5lKE9uZU9yTW9yZSh+TGl0ZXJhbChvcGVuZXIpICsgfkxpdGVyYWwoY2xvc2VyKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc05vdEluKFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyxleGFjdD0xKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdLnN0cmlwKCkpKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlbmluZyBhbmQgY2xvc2luZyBhcmd1bWVudHMgbXVzdCBiZSBzdHJpbmdzIGlmIG5vIGNvbnRlbnQgZXhwcmVzc2lvbiBpcyBnaXZlbiIpDQogICAgcmV0ID0gRm9yd2FyZCgpDQogICAgaWYgaWdub3JlRXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgcmV0IDw8PSBHcm91cCggU3VwcHJlc3Mob3BlbmVyKSArIFplcm9Pck1vcmUoIGlnbm9yZUV4cHIgfCByZXQgfCBjb250ZW50ICkgKyBTdXBwcmVzcyhjbG9zZXIpICkNCiAgICBlbHNlOg0KICAgICAgICByZXQgPDw9IEdyb3VwKCBTdXBwcmVzcyhvcGVuZXIpICsgWmVyb09yTW9yZSggcmV0IHwgY29udGVudCApICArIFN1cHByZXNzKGNsb3NlcikgKQ0KICAgIHJldC5zZXROYW1lKCduZXN0ZWQgJXMlcyBleHByZXNzaW9uJyAlIChvcGVuZXIsY2xvc2VyKSkNCiAgICByZXR1cm4gcmV0DQoNCmRlZiBpbmRlbnRlZEJsb2NrKGJsb2NrU3RhdGVtZW50RXhwciwgaW5kZW50U3RhY2ssIGluZGVudD1UcnVlKToNCiAgICAiIiINCiAgICBIZWxwZXIgbWV0aG9kIGZvciBkZWZpbmluZyBzcGFjZS1kZWxpbWl0ZWQgaW5kZW50YXRpb24gYmxvY2tzLCBzdWNoIGFzDQogICAgdGhvc2UgdXNlZCB0byBkZWZpbmUgYmxvY2sgc3RhdGVtZW50cyBpbiBQeXRob24gc291cmNlIGNvZGUuDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGJsb2NrU3RhdGVtZW50RXhwciAtIGV4cHJlc3Npb24gZGVmaW5pbmcgc3ludGF4IG9mIHN0YXRlbWVudCB0aGF0DQogICAgICAgICAgICBpcyByZXBlYXRlZCB3aXRoaW4gdGhlIGluZGVudGVkIGJsb2NrDQogICAgIC0gaW5kZW50U3RhY2sgLSBsaXN0IGNyZWF0ZWQgYnkgY2FsbGVyIHRvIG1hbmFnZSBpbmRlbnRhdGlvbiBzdGFjaw0KICAgICAgICAgICAgKG11bHRpcGxlIHN0YXRlbWVudFdpdGhJbmRlbnRlZEJsb2NrIGV4cHJlc3Npb25zIHdpdGhpbiBhIHNpbmdsZSBncmFtbWFyDQogICAgICAgICAgICBzaG91bGQgc2hhcmUgYSBjb21tb24gaW5kZW50U3RhY2spDQogICAgIC0gaW5kZW50IC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYmxvY2sgbXVzdCBiZSBpbmRlbnRlZCBiZXlvbmQgdGhlDQogICAgICAgICAgICB0aGUgY3VycmVudCBsZXZlbDsgc2V0IHRvIEZhbHNlIGZvciBibG9jayBvZiBsZWZ0LW1vc3Qgc3RhdGVtZW50cw0KICAgICAgICAgICAgKGRlZmF1bHQ9Q3tUcnVlfSkNCg0KICAgIEEgdmFsaWQgYmxvY2sgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBDe2Jsb2NrU3RhdGVtZW50fS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBkYXRhID0gJycnDQogICAgICAgIGRlZiBBKHopOg0KICAgICAgICAgIEExDQogICAgICAgICAgQiA9IDEwMA0KICAgICAgICAgIEcgPSBBMg0KICAgICAgICAgIEEyDQogICAgICAgICAgQTMNCiAgICAgICAgQg0KICAgICAgICBkZWYgQkIoYSxiLGMpOg0KICAgICAgICAgIEJCMQ0KICAgICAgICAgIGRlZiBCQkEoKToNCiAgICAgICAgICAgIGJiYTENCiAgICAgICAgICAgIGJiYTINCiAgICAgICAgICAgIGJiYTMNCiAgICAgICAgQw0KICAgICAgICBEDQogICAgICAgIGRlZiBzcGFtKHgseSk6DQogICAgICAgICAgICAgZGVmIGVnZ3Moeik6DQogICAgICAgICAgICAgICAgIHBhc3MNCiAgICAgICAgJycnDQoNCg0KICAgICAgICBpbmRlbnRTdGFjayA9IFsxXQ0KICAgICAgICBzdG10ID0gRm9yd2FyZCgpDQoNCiAgICAgICAgaWRlbnRpZmllciA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMpDQogICAgICAgIGZ1bmNEZWNsID0gKCJkZWYiICsgaWRlbnRpZmllciArIEdyb3VwKCAiKCIgKyBPcHRpb25hbCggZGVsaW1pdGVkTGlzdChpZGVudGlmaWVyKSApICsgIikiICkgKyAiOiIpDQogICAgICAgIGZ1bmNfYm9keSA9IGluZGVudGVkQmxvY2soc3RtdCwgaW5kZW50U3RhY2spDQogICAgICAgIGZ1bmNEZWYgPSBHcm91cCggZnVuY0RlY2wgKyBmdW5jX2JvZHkgKQ0KDQogICAgICAgIHJ2YWx1ZSA9IEZvcndhcmQoKQ0KICAgICAgICBmdW5jQ2FsbCA9IEdyb3VwKGlkZW50aWZpZXIgKyAiKCIgKyBPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHJ2YWx1ZSkpICsgIikiKQ0KICAgICAgICBydmFsdWUgPDwgKGZ1bmNDYWxsIHwgaWRlbnRpZmllciB8IFdvcmQobnVtcykpDQogICAgICAgIGFzc2lnbm1lbnQgPSBHcm91cChpZGVudGlmaWVyICsgIj0iICsgcnZhbHVlKQ0KICAgICAgICBzdG10IDw8ICggZnVuY0RlZiB8IGFzc2lnbm1lbnQgfCBpZGVudGlmaWVyICkNCg0KICAgICAgICBtb2R1bGVfYm9keSA9IE9uZU9yTW9yZShzdG10KQ0KDQogICAgICAgIHBhcnNlVHJlZSA9IG1vZHVsZV9ib2R5LnBhcnNlU3RyaW5nKGRhdGEpDQogICAgICAgIHBhcnNlVHJlZS5wcHJpbnQoKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJ2RlZicsDQogICAgICAgICAgJ0EnLA0KICAgICAgICAgIFsnKCcsICd6JywgJyknXSwNCiAgICAgICAgICAnOicsDQogICAgICAgICAgW1snQTEnXSwgW1snQicsICc9JywgJzEwMCddXSwgW1snRycsICc9JywgJ0EyJ11dLCBbJ0EyJ10sIFsnQTMnXV1dLA0KICAgICAgICAgJ0InLA0KICAgICAgICAgWydkZWYnLA0KICAgICAgICAgICdCQicsDQogICAgICAgICAgWycoJywgJ2EnLCAnYicsICdjJywgJyknXSwNCiAgICAgICAgICAnOicsDQogICAgICAgICAgW1snQkIxJ10sIFtbJ2RlZicsICdCQkEnLCBbJygnLCAnKSddLCAnOicsIFtbJ2JiYTEnXSwgWydiYmEyJ10sIFsnYmJhMyddXV1dXV0sDQogICAgICAgICAnQycsDQogICAgICAgICAnRCcsDQogICAgICAgICBbJ2RlZicsDQogICAgICAgICAgJ3NwYW0nLA0KICAgICAgICAgIFsnKCcsICd4JywgJ3knLCAnKSddLA0KICAgICAgICAgICc6JywNCiAgICAgICAgICBbW1snZGVmJywgJ2VnZ3MnLCBbJygnLCAneicsICcpJ10sICc6JywgW1sncGFzcyddXV1dXV1dIA0KICAgICIiIg0KICAgIGRlZiBjaGVja1BlZXJJbmRlbnQocyxsLHQpOg0KICAgICAgICBpZiBsID49IGxlbihzKTogcmV0dXJuDQogICAgICAgIGN1ckNvbCA9IGNvbChsLHMpDQogICAgICAgIGlmIGN1ckNvbCAhPSBpbmRlbnRTdGFja1stMV06DQogICAgICAgICAgICBpZiBjdXJDb2wgPiBpbmRlbnRTdGFja1stMV06DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VGYXRhbEV4Y2VwdGlvbihzLGwsImlsbGVnYWwgbmVzdGluZyIpDQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vdCBhIHBlZXIgZW50cnkiKQ0KDQogICAgZGVmIGNoZWNrU3ViSW5kZW50KHMsbCx0KToNCiAgICAgICAgY3VyQ29sID0gY29sKGwscykNCiAgICAgICAgaWYgY3VyQ29sID4gaW5kZW50U3RhY2tbLTFdOg0KICAgICAgICAgICAgaW5kZW50U3RhY2suYXBwZW5kKCBjdXJDb2wgKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJub3QgYSBzdWJlbnRyeSIpDQoNCiAgICBkZWYgY2hlY2tVbmluZGVudChzLGwsdCk6DQogICAgICAgIGlmIGwgPj0gbGVuKHMpOiByZXR1cm4NCiAgICAgICAgY3VyQ29sID0gY29sKGwscykNCiAgICAgICAgaWYgbm90KGluZGVudFN0YWNrIGFuZCBjdXJDb2wgPCBpbmRlbnRTdGFja1stMV0gYW5kIGN1ckNvbCA8PSBpbmRlbnRTdGFja1stMl0pOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJub3QgYW4gdW5pbmRlbnQiKQ0KICAgICAgICBpbmRlbnRTdGFjay5wb3AoKQ0KDQogICAgTkwgPSBPbmVPck1vcmUoTGluZUVuZCgpLnNldFdoaXRlc3BhY2VDaGFycygiXHQgIikuc3VwcHJlc3MoKSkNCiAgICBJTkRFTlQgPSAoRW1wdHkoKSArIEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24oY2hlY2tTdWJJbmRlbnQpKS5zZXROYW1lKCdJTkRFTlQnKQ0KICAgIFBFRVIgICA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24oY2hlY2tQZWVySW5kZW50KS5zZXROYW1lKCcnKQ0KICAgIFVOREVOVCA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24oY2hlY2tVbmluZGVudCkuc2V0TmFtZSgnVU5JTkRFTlQnKQ0KICAgIGlmIGluZGVudDoNCiAgICAgICAgc21FeHByID0gR3JvdXAoIE9wdGlvbmFsKE5MKSArDQogICAgICAgICAgICAjfiBGb2xsb3dlZEJ5KGJsb2NrU3RhdGVtZW50RXhwcikgKw0KICAgICAgICAgICAgSU5ERU5UICsgKE9uZU9yTW9yZSggUEVFUiArIEdyb3VwKGJsb2NrU3RhdGVtZW50RXhwcikgKyBPcHRpb25hbChOTCkgKSkgKyBVTkRFTlQpDQogICAgZWxzZToNCiAgICAgICAgc21FeHByID0gR3JvdXAoIE9wdGlvbmFsKE5MKSArDQogICAgICAgICAgICAoT25lT3JNb3JlKCBQRUVSICsgR3JvdXAoYmxvY2tTdGF0ZW1lbnRFeHByKSArIE9wdGlvbmFsKE5MKSApKSApDQogICAgYmxvY2tTdGF0ZW1lbnRFeHByLmlnbm9yZShfYnNsYXNoICsgTGluZUVuZCgpKQ0KICAgIHJldHVybiBzbUV4cHIuc2V0TmFtZSgnaW5kZW50ZWQgYmxvY2snKQ0KDQphbHBoYXM4Yml0ID0gc3JhbmdlKHIiW1wweGMwLVwweGQ2XDB4ZDgtXDB4ZjZcMHhmOC1cMHhmZl0iKQ0KcHVuYzhiaXQgPSBzcmFuZ2UociJbXDB4YTEtXDB4YmZcMHhkN1wweGY3XSIpDQoNCmFueU9wZW5UYWcsYW55Q2xvc2VUYWcgPSBtYWtlSFRNTFRhZ3MoV29yZChhbHBoYXMsYWxwaGFudW1zKyJfOiIpLnNldE5hbWUoJ2FueSB0YWcnKSkNCl9odG1sRW50aXR5TWFwID0gZGljdCh6aXAoImd0IGx0IGFtcCBuYnNwIHF1b3QgYXBvcyIuc3BsaXQoKSwnPjwmICJcJycpKQ0KY29tbW9uSFRNTEVudGl0eSA9IFJlZ2V4KCcmKD9QPGVudGl0eT4nICsgJ3wnLmpvaW4oX2h0bWxFbnRpdHlNYXAua2V5cygpKSArIik7Iikuc2V0TmFtZSgiY29tbW9uIEhUTUwgZW50aXR5IikNCmRlZiByZXBsYWNlSFRNTEVudGl0eSh0KToNCiAgICAiIiJIZWxwZXIgcGFyc2VyIGFjdGlvbiB0byByZXBsYWNlIGNvbW1vbiBIVE1MIGVudGl0aWVzIHdpdGggdGhlaXIgc3BlY2lhbCBjaGFyYWN0ZXJzIiIiDQogICAgcmV0dXJuIF9odG1sRW50aXR5TWFwLmdldCh0LmVudGl0eSkNCg0KIyBpdCdzIGVhc3kgdG8gZ2V0IHRoZXNlIGNvbW1lbnQgc3RydWN0dXJlcyB3cm9uZyAtIHRoZXkncmUgdmVyeSBjb21tb24sIHNvIG1heSBhcyB3ZWxsIG1ha2UgdGhlbSBhdmFpbGFibGUNCmNTdHlsZUNvbW1lbnQgPSBDb21iaW5lKFJlZ2V4KHIiL1wqKD86W14qXXxcKig/IS8pKSoiKSArICcqLycpLnNldE5hbWUoIkMgc3R5bGUgY29tbWVudCIpDQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDey8qIC4uLiAqL30iDQoNCmh0bWxDb21tZW50ID0gUmVnZXgociI8IS0tW1xzXFNdKj8tLT4iKS5zZXROYW1lKCJIVE1MIGNvbW1lbnQiKQ0KIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3s8IS0tIC4uLiAtLT59Ig0KDQpyZXN0T2ZMaW5lID0gUmVnZXgociIuKiIpLmxlYXZlV2hpdGVzcGFjZSgpLnNldE5hbWUoInJlc3Qgb2YgbGluZSIpDQpkYmxTbGFzaENvbW1lbnQgPSBSZWdleChyIi8vKD86XFxcbnxbXlxuXSkqIikuc2V0TmFtZSgiLy8gY29tbWVudCIpDQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDey8vIC4uLiAodG8gZW5kIG9mIGxpbmUpfSINCg0KY3BwU3R5bGVDb21tZW50ID0gQ29tYmluZShSZWdleChyIi9cKig/OlteKl18XCooPyEvKSkqIikgKyAnKi8nfCBkYmxTbGFzaENvbW1lbnQpLnNldE5hbWUoIkMrKyBzdHlsZSBjb21tZW50IikNCiJDb21tZW50IG9mIGVpdGhlciBmb3JtIEN7THtjU3R5bGVDb21tZW50fX0gb3IgQ3tMe2RibFNsYXNoQ29tbWVudH19Ig0KDQpqYXZhU3R5bGVDb21tZW50ID0gY3BwU3R5bGVDb21tZW50DQoiU2FtZSBhcyBDe0x7Y3BwU3R5bGVDb21tZW50fX0iDQoNCnB5dGhvblN0eWxlQ29tbWVudCA9IFJlZ2V4KHIiIy4qIikuc2V0TmFtZSgiUHl0aG9uIHN0eWxlIGNvbW1lbnQiKQ0KIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3sjIC4uLiAodG8gZW5kIG9mIGxpbmUpfSINCg0KX2NvbW1hc2VwaXRlbSA9IENvbWJpbmUoT25lT3JNb3JlKFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPScsJykgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsKCBXb3JkKCIgXHQiKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5MaXRlcmFsKCIsIikgKyB+TGluZUVuZCgpICkgKSApLnN0cmVhbWxpbmUoKS5zZXROYW1lKCJjb21tYUl0ZW0iKQ0KY29tbWFTZXBhcmF0ZWRMaXN0ID0gZGVsaW1pdGVkTGlzdCggT3B0aW9uYWwoIHF1b3RlZFN0cmluZy5jb3B5KCkgfCBfY29tbWFzZXBpdGVtLCBkZWZhdWx0PSIiKSApLnNldE5hbWUoImNvbW1hU2VwYXJhdGVkTGlzdCIpDQoiIiIoRGVwcmVjYXRlZCkgUHJlZGVmaW5lZCBleHByZXNzaW9uIG9mIDEgb3IgbW9yZSBwcmludGFibGUgd29yZHMgb3IgcXVvdGVkIHN0cmluZ3MsIHNlcGFyYXRlZCBieSBjb21tYXMuDQogICBUaGlzIGV4cHJlc3Npb24gaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBMe3B5cGFyc2luZ19jb21tb24uY29tbWFfc2VwYXJhdGVkX2xpc3R9LiIiIg0KDQojIHNvbWUgb3RoZXIgdXNlZnVsIGV4cHJlc3Npb25zIC0gdXNpbmcgbG93ZXItY2FzZSBjbGFzcyBuYW1lIHNpbmNlIHdlIGFyZSByZWFsbHkgdXNpbmcgdGhpcyBhcyBhIG5hbWVzcGFjZQ0KY2xhc3MgcHlwYXJzaW5nX2NvbW1vbjoNCiAgICAiIiINCiAgICBIZXJlIGFyZSBzb21lIGNvbW1vbiBsb3ctbGV2ZWwgZXhwcmVzc2lvbnMgdGhhdCBtYXkgYmUgdXNlZnVsIGluIGp1bXAtc3RhcnRpbmcgcGFyc2VyIGRldmVsb3BtZW50Og0KICAgICAtIG51bWVyaWMgZm9ybXMgKEx7aW50ZWdlcnM8aW50ZWdlcj59LCBMe3JlYWxzPHJlYWw+fSwgTHtzY2llbnRpZmljIG5vdGF0aW9uPHNjaV9yZWFsPn0pDQogICAgIC0gY29tbW9uIEx7cHJvZ3JhbW1pbmcgaWRlbnRpZmllcnM8aWRlbnRpZmllcj59DQogICAgIC0gbmV0d29yayBhZGRyZXNzZXMgKEx7TUFDPG1hY19hZGRyZXNzPn0sIEx7SVB2NDxpcHY0X2FkZHJlc3M+fSwgTHtJUHY2PGlwdjZfYWRkcmVzcz59KQ0KICAgICAtIElTTzg2MDEgTHtkYXRlczxpc284NjAxX2RhdGU+fSBhbmQgTHtkYXRldGltZTxpc284NjAxX2RhdGV0aW1lPn0NCiAgICAgLSBMe1VVSUQ8dXVpZD59DQogICAgIC0gTHtjb21tYS1zZXBhcmF0ZWQgbGlzdDxjb21tYV9zZXBhcmF0ZWRfbGlzdD59DQogICAgUGFyc2UgYWN0aW9uczoNCiAgICAgLSBDe0x7Y29udmVydFRvSW50ZWdlcn19DQogICAgIC0gQ3tMe2NvbnZlcnRUb0Zsb2F0fX0NCiAgICAgLSBDe0x7Y29udmVydFRvRGF0ZX19DQogICAgIC0gQ3tMe2NvbnZlcnRUb0RhdGV0aW1lfX0NCiAgICAgLSBDe0x7c3RyaXBIVE1MVGFnc319DQogICAgIC0gQ3tMe3VwY2FzZVRva2Vuc319DQogICAgIC0gQ3tMe2Rvd25jYXNlVG9rZW5zfX0NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLm51bWJlci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgdGhlIGFwcHJvcHJpYXRlIHR5cGUNCiAgICAgICAgICAgIDEwMA0KICAgICAgICAgICAgLTEwMA0KICAgICAgICAgICAgKzEwMA0KICAgICAgICAgICAgMy4xNDE1OQ0KICAgICAgICAgICAgNi4wMmUyMw0KICAgICAgICAgICAgMWUtMTINCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLmZudW1iZXIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0DQogICAgICAgICAgICAxMDANCiAgICAgICAgICAgIC0xMDANCiAgICAgICAgICAgICsxMDANCiAgICAgICAgICAgIDMuMTQxNTkNCiAgICAgICAgICAgIDYuMDJlMjMNCiAgICAgICAgICAgIDFlLTEyDQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5oZXhfaW50ZWdlci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgaGV4IG51bWJlcnMNCiAgICAgICAgICAgIDEwMA0KICAgICAgICAgICAgRkYNCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLmZyYWN0aW9uLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyBmcmFjdGlvbnMNCiAgICAgICAgICAgIDEvMg0KICAgICAgICAgICAgLTMvNA0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIHB5cGFyc2luZ19jb21tb24ubWl4ZWRfaW50ZWdlci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgbWl4ZWQgZnJhY3Rpb25zDQogICAgICAgICAgICAxDQogICAgICAgICAgICAxLzINCiAgICAgICAgICAgIC0zLzQNCiAgICAgICAgICAgIDEtMy80DQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgaW1wb3J0IHV1aWQNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHV1aWQuVVVJRCkpDQogICAgICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgdXVpZA0KICAgICAgICAgICAgMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4DQogICAgICAgICAgICAnJycpDQogICAgcHJpbnRzOjoNCiAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyB0aGUgYXBwcm9wcmlhdGUgdHlwZQ0KICAgICAgICAxMDANCiAgICAgICAgWzEwMF0NCg0KICAgICAgICAtMTAwDQogICAgICAgIFstMTAwXQ0KDQogICAgICAgICsxMDANCiAgICAgICAgWzEwMF0NCg0KICAgICAgICAzLjE0MTU5DQogICAgICAgIFszLjE0MTU5XQ0KDQogICAgICAgIDYuMDJlMjMNCiAgICAgICAgWzYuMDJlKzIzXQ0KDQogICAgICAgIDFlLTEyDQogICAgICAgIFsxZS0xMl0NCg0KICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0DQogICAgICAgIDEwMA0KICAgICAgICBbMTAwLjBdDQoNCiAgICAgICAgLTEwMA0KICAgICAgICBbLTEwMC4wXQ0KDQogICAgICAgICsxMDANCiAgICAgICAgWzEwMC4wXQ0KDQogICAgICAgIDMuMTQxNTkNCiAgICAgICAgWzMuMTQxNTldDQoNCiAgICAgICAgNi4wMmUyMw0KICAgICAgICBbNi4wMmUrMjNdDQoNCiAgICAgICAgMWUtMTINCiAgICAgICAgWzFlLTEyXQ0KDQogICAgICAgICMgaGV4IG51bWJlcnMNCiAgICAgICAgMTAwDQogICAgICAgIFsyNTZdDQoNCiAgICAgICAgRkYNCiAgICAgICAgWzI1NV0NCg0KICAgICAgICAjIGZyYWN0aW9ucw0KICAgICAgICAxLzINCiAgICAgICAgWzAuNV0NCg0KICAgICAgICAtMy80DQogICAgICAgIFstMC43NV0NCg0KICAgICAgICAjIG1peGVkIGZyYWN0aW9ucw0KICAgICAgICAxDQogICAgICAgIFsxXQ0KDQogICAgICAgIDEvMg0KICAgICAgICBbMC41XQ0KDQogICAgICAgIC0zLzQNCiAgICAgICAgWy0wLjc1XQ0KDQogICAgICAgIDEtMy80DQogICAgICAgIFsxLjc1XQ0KDQogICAgICAgICMgdXVpZA0KICAgICAgICAxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgNCiAgICAgICAgW1VVSUQoJzEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OCcpXQ0KICAgICIiIg0KDQogICAgY29udmVydFRvSW50ZWdlciA9IHRva2VuTWFwKGludCkNCiAgICAiIiINCiAgICBQYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIGludGVnZXJzIHRvIFB5dGhvbiBpbnQNCiAgICAiIiINCg0KICAgIGNvbnZlcnRUb0Zsb2F0ID0gdG9rZW5NYXAoZmxvYXQpDQogICAgIiIiDQogICAgUGFyc2UgYWN0aW9uIGZvciBjb252ZXJ0aW5nIHBhcnNlZCBudW1iZXJzIHRvIFB5dGhvbiBmbG9hdA0KICAgICIiIg0KDQogICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0TmFtZSgiaW50ZWdlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0ludGVnZXIpDQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLCByZXR1cm5zIGFuIGludCIiIg0KDQogICAgaGV4X2ludGVnZXIgPSBXb3JkKGhleG51bXMpLnNldE5hbWUoImhleCBpbnRlZ2VyIikuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoaW50LDE2KSkNCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGEgaGV4YWRlY2ltYWwgaW50ZWdlciwgcmV0dXJucyBhbiBpbnQiIiINCg0KICAgIHNpZ25lZF9pbnRlZ2VyID0gUmVnZXgocidbKy1dP1xkKycpLnNldE5hbWUoInNpZ25lZCBpbnRlZ2VyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvSW50ZWdlcikNCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGFuIGludGVnZXIgd2l0aCBvcHRpb25hbCBsZWFkaW5nIHNpZ24sIHJldHVybnMgYW4gaW50IiIiDQoNCiAgICBmcmFjdGlvbiA9IChzaWduZWRfaW50ZWdlcigpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KSArICcvJyArIHNpZ25lZF9pbnRlZ2VyKCkuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpKS5zZXROYW1lKCJmcmFjdGlvbiIpDQogICAgIiIiZnJhY3Rpb25hbCBleHByZXNzaW9uIG9mIGFuIGludGVnZXIgZGl2aWRlZCBieSBhbiBpbnRlZ2VyLCByZXR1cm5zIGEgZmxvYXQiIiINCiAgICBmcmFjdGlvbi5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdDogdFswXS90Wy0xXSkNCg0KICAgIG1peGVkX2ludGVnZXIgPSAoZnJhY3Rpb24gfCBzaWduZWRfaW50ZWdlciArIE9wdGlvbmFsKE9wdGlvbmFsKCctJykuc3VwcHJlc3MoKSArIGZyYWN0aW9uKSkuc2V0TmFtZSgiZnJhY3Rpb24gb3IgbWl4ZWQgaW50ZWdlci1mcmFjdGlvbiIpDQogICAgIiIibWl4ZWQgaW50ZWdlciBvZiB0aGUgZm9ybSAnaW50ZWdlciAtIGZyYWN0aW9uJywgd2l0aCBvcHRpb25hbCBsZWFkaW5nIGludGVnZXIsIHJldHVybnMgZmxvYXQiIiINCiAgICBtaXhlZF9pbnRlZ2VyLmFkZFBhcnNlQWN0aW9uKHN1bSkNCg0KICAgIHJlYWwgPSBSZWdleChyJ1srLV0/XGQrXC5cZConKS5zZXROYW1lKCJyZWFsIG51bWJlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KQ0KICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgYW5kIHJldHVybnMgYSBmbG9hdCIiIg0KDQogICAgc2NpX3JlYWwgPSBSZWdleChyJ1srLV0/XGQrKFtlRV1bKy1dP1xkK3xcLlxkKihbZUVdWystXT9cZCspPyknKS5zZXROYW1lKCJyZWFsIG51bWJlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24iKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkNCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHdpdGggb3B0aW9uYWwgc2NpZW50aWZpYyBub3RhdGlvbiBhbmQgcmV0dXJucyBhIGZsb2F0IiIiDQoNCiAgICAjIHN0cmVhbWxpbmluZyB0aGlzIGV4cHJlc3Npb24gbWFrZXMgdGhlIGRvY3MgbmljZXItbG9va2luZw0KICAgIG51bWJlciA9IChzY2lfcmVhbCB8IHJlYWwgfCBzaWduZWRfaW50ZWdlcikuc3RyZWFtbGluZSgpDQogICAgIiIiYW55IG51bWVyaWMgZXhwcmVzc2lvbiwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBQeXRob24gdHlwZSIiIg0KDQogICAgZm51bWJlciA9IFJlZ2V4KHInWystXT9cZCtcLj9cZCooW2VFXVsrLV0/XGQrKT8nKS5zZXROYW1lKCJmbnVtYmVyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpDQogICAgIiIiYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQiIiINCiAgICANCiAgICBpZGVudGlmaWVyID0gV29yZChhbHBoYXMrJ18nLCBhbHBoYW51bXMrJ18nKS5zZXROYW1lKCJpZGVudGlmaWVyIikNCiAgICAiIiJ0eXBpY2FsIGNvZGUgaWRlbnRpZmllciAobGVhZGluZyBhbHBoYSBvciAnXycsIGZvbGxvd2VkIGJ5IDAgb3IgbW9yZSBhbHBoYXMsIG51bXMsIG9yICdfJykiIiINCiAgICANCiAgICBpcHY0X2FkZHJlc3MgPSBSZWdleChyJygyNVswLTVdfDJbMC00XVswLTldfDE/WzAtOV17MSwyfSkoXC4oMjVbMC01XXwyWzAtNF1bMC05XXwxP1swLTldezEsMn0pKXszfScpLnNldE5hbWUoIklQdjQgYWRkcmVzcyIpDQogICAgIklQdjQgYWRkcmVzcyAoQ3swLjAuMC4wIC0gMjU1LjI1NS4yNTUuMjU1fSkiDQoNCiAgICBfaXB2Nl9wYXJ0ID0gUmVnZXgocidbMC05YS1mQS1GXXsxLDR9Jykuc2V0TmFtZSgiaGV4X2ludGVnZXIiKQ0KICAgIF9mdWxsX2lwdjZfYWRkcmVzcyA9IChfaXB2Nl9wYXJ0ICsgKCc6JyArIF9pcHY2X3BhcnQpKjcpLnNldE5hbWUoImZ1bGwgSVB2NiBhZGRyZXNzIikNCiAgICBfc2hvcnRfaXB2Nl9hZGRyZXNzID0gKE9wdGlvbmFsKF9pcHY2X3BhcnQgKyAoJzonICsgX2lwdjZfcGFydCkqKDAsNikpICsgIjo6IiArIE9wdGlvbmFsKF9pcHY2X3BhcnQgKyAoJzonICsgX2lwdjZfcGFydCkqKDAsNikpKS5zZXROYW1lKCJzaG9ydCBJUHY2IGFkZHJlc3MiKQ0KICAgIF9zaG9ydF9pcHY2X2FkZHJlc3MuYWRkQ29uZGl0aW9uKGxhbWJkYSB0OiBzdW0oMSBmb3IgdHQgaW4gdCBpZiBweXBhcnNpbmdfY29tbW9uLl9pcHY2X3BhcnQubWF0Y2hlcyh0dCkpIDwgOCkNCiAgICBfbWl4ZWRfaXB2Nl9hZGRyZXNzID0gKCI6OmZmZmY6IiArIGlwdjRfYWRkcmVzcykuc2V0TmFtZSgibWl4ZWQgSVB2NiBhZGRyZXNzIikNCiAgICBpcHY2X2FkZHJlc3MgPSBDb21iaW5lKChfZnVsbF9pcHY2X2FkZHJlc3MgfCBfbWl4ZWRfaXB2Nl9hZGRyZXNzIHwgX3Nob3J0X2lwdjZfYWRkcmVzcykuc2V0TmFtZSgiSVB2NiBhZGRyZXNzIikpLnNldE5hbWUoIklQdjYgYWRkcmVzcyIpDQogICAgIklQdjYgYWRkcmVzcyAobG9uZywgc2hvcnQsIG9yIG1peGVkIGZvcm0pIg0KICAgIA0KICAgIG1hY19hZGRyZXNzID0gUmVnZXgocidbMC05YS1mQS1GXXsyfShbOi4tXSlbMC05YS1mQS1GXXsyfSg/OlwxWzAtOWEtZkEtRl17Mn0pezR9Jykuc2V0TmFtZSgiTUFDIGFkZHJlc3MiKQ0KICAgICJNQUMgYWRkcmVzcyB4eDp4eDp4eDp4eDp4eCAobWF5IGFsc28gaGF2ZSAnLScgb3IgJy4nIGRlbGltaXRlcnMpIg0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBjb252ZXJ0VG9EYXRlKGZtdD0iJVktJW0tJWQiKToNCiAgICAgICAgIiIiDQogICAgICAgIEhlbHBlciB0byBjcmVhdGUgYSBwYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIGRhdGUgc3RyaW5nIHRvIFB5dGhvbiBkYXRldGltZS5kYXRlDQoNCiAgICAgICAgUGFyYW1zIC0NCiAgICAgICAgIC0gZm10IC0gZm9ybWF0IHRvIGJlIHBhc3NlZCB0byBkYXRldGltZS5zdHJwdGltZSAoZGVmYXVsdD1DeyIlWS0lbS0lZCJ9KQ0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZGF0ZV9leHByID0gcHlwYXJzaW5nX2NvbW1vbi5pc284NjAxX2RhdGUuY29weSgpDQogICAgICAgICAgICBkYXRlX2V4cHIuc2V0UGFyc2VBY3Rpb24ocHlwYXJzaW5nX2NvbW1vbi5jb252ZXJ0VG9EYXRlKCkpDQogICAgICAgICAgICBwcmludChkYXRlX2V4cHIucGFyc2VTdHJpbmcoIjE5OTktMTItMzEiKSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIFtkYXRldGltZS5kYXRlKDE5OTksIDEyLCAzMSldDQogICAgICAgICIiIg0KICAgICAgICBkZWYgY3Z0X2ZuKHMsbCx0KToNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWUuc3RycHRpbWUodFswXSwgZm10KS5kYXRlKCkNCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIHZlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsIGwsIHN0cih2ZSkpDQogICAgICAgIHJldHVybiBjdnRfZm4NCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgY29udmVydFRvRGF0ZXRpbWUoZm10PSIlWS0lbS0lZFQlSDolTTolUy4lZiIpOg0KICAgICAgICAiIiINCiAgICAgICAgSGVscGVyIHRvIGNyZWF0ZSBhIHBhcnNlIGFjdGlvbiBmb3IgY29udmVydGluZyBwYXJzZWQgZGF0ZXRpbWUgc3RyaW5nIHRvIFB5dGhvbiBkYXRldGltZS5kYXRldGltZQ0KDQogICAgICAgIFBhcmFtcyAtDQogICAgICAgICAtIGZtdCAtIGZvcm1hdCB0byBiZSBwYXNzZWQgdG8gZGF0ZXRpbWUuc3RycHRpbWUgKGRlZmF1bHQ9Q3siJVktJW0tJWRUJUg6JU06JVMuJWYifSkNCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGR0X2V4cHIgPSBweXBhcnNpbmdfY29tbW9uLmlzbzg2MDFfZGF0ZXRpbWUuY29weSgpDQogICAgICAgICAgICBkdF9leHByLnNldFBhcnNlQWN0aW9uKHB5cGFyc2luZ19jb21tb24uY29udmVydFRvRGF0ZXRpbWUoKSkNCiAgICAgICAgICAgIHByaW50KGR0X2V4cHIucGFyc2VTdHJpbmcoIjE5OTktMTItMzFUMjM6NTk6NTkuOTk5IikpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbZGF0ZXRpbWUuZGF0ZXRpbWUoMTk5OSwgMTIsIDMxLCAyMywgNTksIDU5LCA5OTkwMDApXQ0KICAgICAgICAiIiINCiAgICAgICAgZGVmIGN2dF9mbihzLGwsdCk6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGV0aW1lLnN0cnB0aW1lKHRbMF0sIGZtdCkNCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIHZlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsIGwsIHN0cih2ZSkpDQogICAgICAgIHJldHVybiBjdnRfZm4NCg0KICAgIGlzbzg2MDFfZGF0ZSA9IFJlZ2V4KHInKD9QPHllYXI+XGR7NH0pKD86LSg/UDxtb250aD5cZFxkKSg/Oi0oP1A8ZGF5PlxkXGQpKT8pPycpLnNldE5hbWUoIklTTzg2MDEgZGF0ZSIpDQogICAgIklTTzg2MDEgZGF0ZSAoQ3t5eXl5LW1tLWRkfSkiDQoNCiAgICBpc284NjAxX2RhdGV0aW1lID0gUmVnZXgocicoP1A8eWVhcj5cZHs0fSktKD9QPG1vbnRoPlxkXGQpLSg/UDxkYXk+XGRcZClbVCBdKD9QPGhvdXI+XGRcZCk6KD9QPG1pbnV0ZT5cZFxkKSg6KD9QPHNlY29uZD5cZFxkKFwuXGQqKT8pPyk/KD9QPHR6Plp8WystXVxkXGQ6P1xkXGQpPycpLnNldE5hbWUoIklTTzg2MDEgZGF0ZXRpbWUiKQ0KICAgICJJU084NjAxIGRhdGV0aW1lIChDe3l5eXktbW0tZGRUaGg6bW06c3MucyhafCstMDA6MDApfSkgLSB0cmFpbGluZyBzZWNvbmRzLCBtaWxsaXNlY29uZHMsIGFuZCB0aW1lem9uZSBvcHRpb25hbDsgYWNjZXB0cyBzZXBhcmF0aW5nIEN7J1QnfSBvciBDeycgJ30iDQoNCiAgICB1dWlkID0gUmVnZXgocidbMC05YS1mQS1GXXs4fSgtWzAtOWEtZkEtRl17NH0pezN9LVswLTlhLWZBLUZdezEyfScpLnNldE5hbWUoIlVVSUQiKQ0KICAgICJVVUlEIChDe3h4eHh4eHh4LXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eH0pIg0KDQogICAgX2h0bWxfc3RyaXBwZXIgPSBhbnlPcGVuVGFnLnN1cHByZXNzKCkgfCBhbnlDbG9zZVRhZy5zdXBwcmVzcygpDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBzdHJpcEhUTUxUYWdzKHMsIGwsIHRva2Vucyk6DQogICAgICAgICIiIg0KICAgICAgICBQYXJzZSBhY3Rpb24gdG8gcmVtb3ZlIEhUTUwgdGFncyBmcm9tIHdlYiBwYWdlIEhUTUwgc291cmNlDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAjIHN0cmlwIEhUTUwgbGlua3MgZnJvbSBub3JtYWwgdGV4dCANCiAgICAgICAgICAgIHRleHQgPSAnPHRkPk1vcmUgaW5mbyBhdCB0aGUgPGEgaHJlZj0iaHR0cDovL3B5cGFyc2luZy53aWtpc3BhY2VzLmNvbSI+cHlwYXJzaW5nPC9hPiB3aWtpIHBhZ2U8L3RkPicNCiAgICAgICAgICAgIHRkLHRkX2VuZCA9IG1ha2VIVE1MVGFncygiVEQiKQ0KICAgICAgICAgICAgdGFibGVfdGV4dCA9IHRkICsgU2tpcFRvKHRkX2VuZCkuc2V0UGFyc2VBY3Rpb24ocHlwYXJzaW5nX2NvbW1vbi5zdHJpcEhUTUxUYWdzKSgiYm9keSIpICsgdGRfZW5kDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW50KHRhYmxlX3RleHQucGFyc2VTdHJpbmcodGV4dCkuYm9keSkgIyAtPiAnTW9yZSBpbmZvIGF0IHRoZSBweXBhcnNpbmcgd2lraSBwYWdlJw0KICAgICAgICAiIiINCiAgICAgICAgcmV0dXJuIHB5cGFyc2luZ19jb21tb24uX2h0bWxfc3RyaXBwZXIudHJhbnNmb3JtU3RyaW5nKHRva2Vuc1swXSkNCg0KICAgIF9jb21tYXNlcGl0ZW0gPSBDb21iaW5lKE9uZU9yTW9yZSh+TGl0ZXJhbCgiLCIpICsgfkxpbmVFbmQoKSArIFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPScsJykgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBPcHRpb25hbCggV2hpdGUoIiBcdCIpICkgKSApLnN0cmVhbWxpbmUoKS5zZXROYW1lKCJjb21tYUl0ZW0iKQ0KICAgIGNvbW1hX3NlcGFyYXRlZF9saXN0ID0gZGVsaW1pdGVkTGlzdCggT3B0aW9uYWwoIHF1b3RlZFN0cmluZy5jb3B5KCkgfCBfY29tbWFzZXBpdGVtLCBkZWZhdWx0PSIiKSApLnNldE5hbWUoImNvbW1hIHNlcGFyYXRlZCBsaXN0IikNCiAgICAiIiJQcmVkZWZpbmVkIGV4cHJlc3Npb24gb2YgMSBvciBtb3JlIHByaW50YWJsZSB3b3JkcyBvciBxdW90ZWQgc3RyaW5ncywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4iIiINCg0KICAgIHVwY2FzZVRva2VucyA9IHN0YXRpY21ldGhvZCh0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkudXBwZXIoKSkpDQogICAgIiIiUGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIHVwcGVyIGNhc2UuIiIiDQoNCiAgICBkb3duY2FzZVRva2VucyA9IHN0YXRpY21ldGhvZCh0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkubG93ZXIoKSkpDQogICAgIiIiUGFyc2UgYWN0aW9uIHRvIGNvbnZlcnQgdG9rZW5zIHRvIGxvd2VyIGNhc2UuIiIiDQoNCg0KaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoNCg0KICAgIHNlbGVjdFRva2VuICAgID0gQ2FzZWxlc3NMaXRlcmFsKCJzZWxlY3QiKQ0KICAgIGZyb21Ub2tlbiAgICAgID0gQ2FzZWxlc3NMaXRlcmFsKCJmcm9tIikNCg0KICAgIGlkZW50ICAgICAgICAgID0gV29yZChhbHBoYXMsIGFscGhhbnVtcyArICJfJCIpDQoNCiAgICBjb2x1bW5OYW1lICAgICA9IGRlbGltaXRlZExpc3QoaWRlbnQsICIuIiwgY29tYmluZT1UcnVlKS5zZXRQYXJzZUFjdGlvbih1cGNhc2VUb2tlbnMpDQogICAgY29sdW1uTmFtZUxpc3QgPSBHcm91cChkZWxpbWl0ZWRMaXN0KGNvbHVtbk5hbWUpKS5zZXROYW1lKCJjb2x1bW5zIikNCiAgICBjb2x1bW5TcGVjICAgICA9ICgnKicgfCBjb2x1bW5OYW1lTGlzdCkNCg0KICAgIHRhYmxlTmFtZSAgICAgID0gZGVsaW1pdGVkTGlzdChpZGVudCwgIi4iLCBjb21iaW5lPVRydWUpLnNldFBhcnNlQWN0aW9uKHVwY2FzZVRva2VucykNCiAgICB0YWJsZU5hbWVMaXN0ICA9IEdyb3VwKGRlbGltaXRlZExpc3QodGFibGVOYW1lKSkuc2V0TmFtZSgidGFibGVzIikNCiAgICANCiAgICBzaW1wbGVTUUwgICAgICA9IHNlbGVjdFRva2VuKCJjb21tYW5kIikgKyBjb2x1bW5TcGVjKCJjb2x1bW5zIikgKyBmcm9tVG9rZW4gKyB0YWJsZU5hbWVMaXN0KCJ0YWJsZXMiKQ0KDQogICAgIyBkZW1vIHJ1blRlc3RzIG1ldGhvZCwgaW5jbHVkaW5nIGVtYmVkZGVkIGNvbW1lbnRzIGluIHRlc3Qgc3RyaW5nDQogICAgc2ltcGxlU1FMLnJ1blRlc3RzKCIiIg0KICAgICAgICAjICcqJyBhcyBjb2x1bW4gbGlzdCBhbmQgZG90dGVkIHRhYmxlIG5hbWUNCiAgICAgICAgc2VsZWN0ICogZnJvbSBTWVMuWFlaWlkNCg0KICAgICAgICAjIGNhc2VsZXNzIG1hdGNoIG9uICJTRUxFQ1QiLCBhbmQgY2FzdHMgYmFjayB0byAic2VsZWN0Ig0KICAgICAgICBTRUxFQ1QgKiBmcm9tIFhZWlpZLCBBQkMNCg0KICAgICAgICAjIGxpc3Qgb2YgY29sdW1uIG5hbWVzLCBhbmQgbWl4ZWQgY2FzZSBTRUxFQ1Qga2V5d29yZA0KICAgICAgICBTZWxlY3QgQUEsQkIsQ0MgZnJvbSBTeXMuZHVhbA0KDQogICAgICAgICMgbXVsdGlwbGUgdGFibGVzDQogICAgICAgIFNlbGVjdCBBLCBCLCBDIGZyb20gU3lzLmR1YWwsIFRhYmxlMg0KDQogICAgICAgICMgaW52YWxpZCBTRUxFQ1Qga2V5d29yZCAtIHNob3VsZCBmYWlsDQogICAgICAgIFhlbGVjdCBBLCBCLCBDIGZyb20gU3lzLmR1YWwNCg0KICAgICAgICAjIGluY29tcGxldGUgY29tbWFuZCAtIHNob3VsZCBmYWlsDQogICAgICAgIFNlbGVjdA0KDQogICAgICAgICMgaW52YWxpZCBjb2x1bW4gbmFtZSAtIHNob3VsZCBmYWlsDQogICAgICAgIFNlbGVjdCBeXl4gZnJveCBTeXMuZHVhbA0KDQogICAgICAgICIiIikNCg0KICAgIHB5cGFyc2luZ19jb21tb24ubnVtYmVyLnJ1blRlc3RzKCIiIg0KICAgICAgICAxMDANCiAgICAgICAgLTEwMA0KICAgICAgICArMTAwDQogICAgICAgIDMuMTQxNTkNCiAgICAgICAgNi4wMmUyMw0KICAgICAgICAxZS0xMg0KICAgICAgICAiIiIpDQoNCiAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0DQogICAgcHlwYXJzaW5nX2NvbW1vbi5mbnVtYmVyLnJ1blRlc3RzKCIiIg0KICAgICAgICAxMDANCiAgICAgICAgLTEwMA0KICAgICAgICArMTAwDQogICAgICAgIDMuMTQxNTkNCiAgICAgICAgNi4wMmUyMw0KICAgICAgICAxZS0xMg0KICAgICAgICAiIiIpDQoNCiAgICBweXBhcnNpbmdfY29tbW9uLmhleF9pbnRlZ2VyLnJ1blRlc3RzKCIiIg0KICAgICAgICAxMDANCiAgICAgICAgRkYNCiAgICAgICAgIiIiKQ0KDQogICAgaW1wb3J0IHV1aWQNCiAgICBweXBhcnNpbmdfY29tbW9uLnV1aWQuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAodXVpZC5VVUlEKSkNCiAgICBweXBhcnNpbmdfY29tbW9uLnV1aWQucnVuVGVzdHMoIiIiDQogICAgICAgIDEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OA0KICAgICAgICAiIiIpDQpQSwMEFAAAAAAAAAAhAJlYTVqSdQAAknUAADQAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3Ivc2l4LnB5IiIiVXRpbGl0aWVzIGZvciB3cml0aW5nIGNvZGUgdGhhdCBydW5zIG9uIFB5dGhvbiAyIGFuZCAzIiIiCgojIENvcHlyaWdodCAoYykgMjAxMC0yMDE1IEJlbmphbWluIFBldGVyc29uCiMKIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiMgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKIyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCiMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAojIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwojIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiMKIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKIyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKIyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKIyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQojIFNPRlRXQVJFLgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IHN5cwppbXBvcnQgdHlwZXMKCl9fYXV0aG9yX18gPSAiQmVuamFtaW4gUGV0ZXJzb24gPGJlbmphbWluQHB5dGhvbi5vcmc+IgpfX3ZlcnNpb25fXyA9ICIxLjEwLjAiCgoKIyBVc2VmdWwgZm9yIHZlcnkgY29hcnNlIHZlcnNpb24gZGlmZmVyZW50aWF0aW9uLgpQWTIgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIKUFkzID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAzClBZMzQgPSBzeXMudmVyc2lvbl9pbmZvWzA6Ml0gPj0gKDMsIDQpCgppZiBQWTM6CiAgICBzdHJpbmdfdHlwZXMgPSBzdHIsCiAgICBpbnRlZ2VyX3R5cGVzID0gaW50LAogICAgY2xhc3NfdHlwZXMgPSB0eXBlLAogICAgdGV4dF90eXBlID0gc3RyCiAgICBiaW5hcnlfdHlwZSA9IGJ5dGVzCgogICAgTUFYU0laRSA9IHN5cy5tYXhzaXplCmVsc2U6CiAgICBzdHJpbmdfdHlwZXMgPSBiYXNlc3RyaW5nLAogICAgaW50ZWdlcl90eXBlcyA9IChpbnQsIGxvbmcpCiAgICBjbGFzc190eXBlcyA9ICh0eXBlLCB0eXBlcy5DbGFzc1R5cGUpCiAgICB0ZXh0X3R5cGUgPSB1bmljb2RlCiAgICBiaW5hcnlfdHlwZSA9IHN0cgoKICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJqYXZhIik6CiAgICAgICAgIyBKeXRob24gYWx3YXlzIHVzZXMgMzIgYml0cy4KICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDMxKSAtIDEpCiAgICBlbHNlOgogICAgICAgICMgSXQncyBwb3NzaWJsZSB0byBoYXZlIHNpemVvZihsb25nKSAhPSBzaXplb2YoUHlfc3NpemVfdCkuCiAgICAgICAgY2xhc3MgWChvYmplY3QpOgoKICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgICAgICAgICByZXR1cm4gMSA8PCAzMQogICAgICAgIHRyeToKICAgICAgICAgICAgbGVuKFgoKSkKICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKICAgICAgICAgICAgIyAzMi1iaXQKICAgICAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCAzMSkgLSAxKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgNjQtYml0CiAgICAgICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgNjMpIC0gMSkKICAgICAgICBkZWwgWAoKCmRlZiBfYWRkX2RvYyhmdW5jLCBkb2MpOgogICAgIiIiQWRkIGRvY3VtZW50YXRpb24gdG8gYSBmdW5jdGlvbi4iIiIKICAgIGZ1bmMuX19kb2NfXyA9IGRvYwoKCmRlZiBfaW1wb3J0X21vZHVsZShuYW1lKToKICAgICIiIkltcG9ydCBtb2R1bGUsIHJldHVybmluZyB0aGUgbW9kdWxlIGFmdGVyIHRoZSBsYXN0IGRvdC4iIiIKICAgIF9faW1wb3J0X18obmFtZSkKICAgIHJldHVybiBzeXMubW9kdWxlc1tuYW1lXQoKCmNsYXNzIF9MYXp5RGVzY3Iob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQoKICAgIGRlZiBfX2dldF9fKHNlbGYsIG9iaiwgdHApOgogICAgICAgIHJlc3VsdCA9IHNlbGYuX3Jlc29sdmUoKQogICAgICAgIHNldGF0dHIob2JqLCBzZWxmLm5hbWUsIHJlc3VsdCkgICMgSW52b2tlcyBfX3NldF9fLgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBUaGlzIGlzIGEgYml0IHVnbHksIGJ1dCBpdCBhdm9pZHMgcnVubmluZyB0aGlzIGFnYWluIGJ5CiAgICAgICAgICAgICMgcmVtb3ZpbmcgdGhpcyBkZXNjcmlwdG9yLgogICAgICAgICAgICBkZWxhdHRyKG9iai5fX2NsYXNzX18sIHNlbGYubmFtZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgTW92ZWRNb2R1bGUoX0xhenlEZXNjcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG9sZCwgbmV3PU5vbmUpOgogICAgICAgIHN1cGVyKE1vdmVkTW9kdWxlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIGlmIFBZMzoKICAgICAgICAgICAgaWYgbmV3IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBuZXcgPSBuYW1lCiAgICAgICAgICAgIHNlbGYubW9kID0gbmV3CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2QgPSBvbGQKCiAgICBkZWYgX3Jlc29sdmUoc2VsZik6CiAgICAgICAgcmV0dXJuIF9pbXBvcnRfbW9kdWxlKHNlbGYubW9kKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICBfbW9kdWxlID0gc2VsZi5fcmVzb2x2ZSgpCiAgICAgICAgdmFsdWUgPSBnZXRhdHRyKF9tb2R1bGUsIGF0dHIpCiAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWx1ZSkKICAgICAgICByZXR1cm4gdmFsdWUKCgpjbGFzcyBfTGF6eU1vZHVsZSh0eXBlcy5Nb2R1bGVUeXBlKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc3VwZXIoX0xhenlNb2R1bGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgc2VsZi5fX2RvY19fID0gc2VsZi5fX2NsYXNzX18uX19kb2NfXwoKICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgogICAgICAgIGF0dHJzID0gWyJfX2RvY19fIiwgIl9fbmFtZV9fIl0KICAgICAgICBhdHRycyArPSBbYXR0ci5uYW1lIGZvciBhdHRyIGluIHNlbGYuX21vdmVkX2F0dHJpYnV0ZXNdCiAgICAgICAgcmV0dXJuIGF0dHJzCgogICAgIyBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzCiAgICBfbW92ZWRfYXR0cmlidXRlcyA9IFtdCgoKY2xhc3MgTW92ZWRBdHRyaWJ1dGUoX0xhenlEZXNjcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG9sZF9tb2QsIG5ld19tb2QsIG9sZF9hdHRyPU5vbmUsIG5ld19hdHRyPU5vbmUpOgogICAgICAgIHN1cGVyKE1vdmVkQXR0cmlidXRlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIGlmIFBZMzoKICAgICAgICAgICAgaWYgbmV3X21vZCBpcyBOb25lOgogICAgICAgICAgICAgICAgbmV3X21vZCA9IG5hbWUKICAgICAgICAgICAgc2VsZi5tb2QgPSBuZXdfbW9kCiAgICAgICAgICAgIGlmIG5ld19hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpZiBvbGRfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIG5ld19hdHRyID0gbmFtZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuZXdfYXR0ciA9IG9sZF9hdHRyCiAgICAgICAgICAgIHNlbGYuYXR0ciA9IG5ld19hdHRyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2QgPSBvbGRfbW9kCiAgICAgICAgICAgIGlmIG9sZF9hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBvbGRfYXR0ciA9IG5hbWUKICAgICAgICAgICAgc2VsZi5hdHRyID0gb2xkX2F0dHIKCiAgICBkZWYgX3Jlc29sdmUoc2VsZik6CiAgICAgICAgbW9kdWxlID0gX2ltcG9ydF9tb2R1bGUoc2VsZi5tb2QpCiAgICAgICAgcmV0dXJuIGdldGF0dHIobW9kdWxlLCBzZWxmLmF0dHIpCgoKY2xhc3MgX1NpeE1ldGFQYXRoSW1wb3J0ZXIob2JqZWN0KToKCiAgICAiIiIKICAgIEEgbWV0YSBwYXRoIGltcG9ydGVyIHRvIGltcG9ydCBzaXgubW92ZXMgYW5kIGl0cyBzdWJtb2R1bGVzLgoKICAgIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIFBFUDMwMiBmaW5kZXIgYW5kIGxvYWRlci4gSXQgc2hvdWxkIGJlIGNvbXBhdGlibGUKICAgIHdpdGggUHl0aG9uIDIuNSBhbmQgYWxsIGV4aXN0aW5nIHZlcnNpb25zIG9mIFB5dGhvbjMKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXhfbW9kdWxlX25hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IHNpeF9tb2R1bGVfbmFtZQogICAgICAgIHNlbGYua25vd25fbW9kdWxlcyA9IHt9CgogICAgZGVmIF9hZGRfbW9kdWxlKHNlbGYsIG1vZCwgKmZ1bGxuYW1lcyk6CiAgICAgICAgZm9yIGZ1bGxuYW1lIGluIGZ1bGxuYW1lczoKICAgICAgICAgICAgc2VsZi5rbm93bl9tb2R1bGVzW3NlbGYubmFtZSArICIuIiArIGZ1bGxuYW1lXSA9IG1vZAoKICAgIGRlZiBfZ2V0X21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYua25vd25fbW9kdWxlc1tzZWxmLm5hbWUgKyAiLiIgKyBmdWxsbmFtZV0KCiAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CiAgICAgICAgaWYgZnVsbG5hbWUgaW4gc2VsZi5rbm93bl9tb2R1bGVzOgogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9fZ2V0X21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5rbm93bl9tb2R1bGVzW2Z1bGxuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIlRoaXMgbG9hZGVyIGRvZXMgbm90IGtub3cgbW9kdWxlICIgKyBmdWxsbmFtZSkKCiAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBpbiBjYXNlIG9mIGEgcmVsb2FkCiAgICAgICAgICAgIHJldHVybiBzeXMubW9kdWxlc1tmdWxsbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBtb2QgPSBzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSkKICAgICAgICBpZiBpc2luc3RhbmNlKG1vZCwgTW92ZWRNb2R1bGUpOgogICAgICAgICAgICBtb2QgPSBtb2QuX3Jlc29sdmUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1vZC5fX2xvYWRlcl9fID0gc2VsZgogICAgICAgIHN5cy5tb2R1bGVzW2Z1bGxuYW1lXSA9IG1vZAogICAgICAgIHJldHVybiBtb2QKCiAgICBkZWYgaXNfcGFja2FnZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRydWUsIGlmIHRoZSBuYW1lZCBtb2R1bGUgaXMgYSBwYWNrYWdlLgoKICAgICAgICBXZSBuZWVkIHRoaXMgbWV0aG9kIHRvIGdldCBjb3JyZWN0IHNwZWMgb2JqZWN0cyB3aXRoCiAgICAgICAgUHl0aG9uIDMuNCAoc2VlIFBFUDQ1MSkKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaGFzYXR0cihzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSksICJfX3BhdGhfXyIpCgogICAgZGVmIGdldF9jb2RlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICAiIiJSZXR1cm4gTm9uZQoKICAgICAgICBSZXF1aXJlZCwgaWYgaXNfcGFja2FnZSBpcyBpbXBsZW1lbnRlZCIiIgogICAgICAgIHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKSAgIyBldmVudHVhbGx5IHJhaXNlcyBJbXBvcnRFcnJvcgogICAgICAgIHJldHVybiBOb25lCiAgICBnZXRfc291cmNlID0gZ2V0X2NvZGUgICMgc2FtZSBhcyBnZXRfY29kZQoKX2ltcG9ydGVyID0gX1NpeE1ldGFQYXRoSW1wb3J0ZXIoX19uYW1lX18pCgoKY2xhc3MgX01vdmVkSXRlbXMoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIiIiCiAgICBfX3BhdGhfXyA9IFtdICAjIG1hcmsgYXMgcGFja2FnZQoKCl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoImNTdHJpbmdJTyIsICJjU3RyaW5nSU8iLCAiaW8iLCAiU3RyaW5nSU8iKSwKICAgIE1vdmVkQXR0cmlidXRlKCJmaWx0ZXIiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgImlmaWx0ZXIiLCAiZmlsdGVyIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZmlsdGVyZmFsc2UiLCAiaXRlcnRvb2xzIiwgIml0ZXJ0b29scyIsICJpZmlsdGVyZmFsc2UiLCAiZmlsdGVyZmFsc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnB1dCIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJyYXdfaW5wdXQiLCAiaW5wdXQiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnRlcm4iLCAiX19idWlsdGluX18iLCAic3lzIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgibWFwIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpbWFwIiwgIm1hcCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldGN3ZCIsICJvcyIsICJvcyIsICJnZXRjd2R1IiwgImdldGN3ZCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldGN3ZGIiLCAib3MiLCAib3MiLCAiZ2V0Y3dkIiwgImdldGN3ZGIiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyYW5nZSIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJ4cmFuZ2UiLCAicmFuZ2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyZWxvYWRfbW9kdWxlIiwgIl9fYnVpbHRpbl9fIiwgImltcG9ydGxpYiIgaWYgUFkzNCBlbHNlICJpbXAiLCAicmVsb2FkIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmVkdWNlIiwgIl9fYnVpbHRpbl9fIiwgImZ1bmN0b29scyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNobGV4X3F1b3RlIiwgInBpcGVzIiwgInNobGV4IiwgInF1b3RlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiU3RyaW5nSU8iLCAiU3RyaW5nSU8iLCAiaW8iKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyRGljdCIsICJVc2VyRGljdCIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJMaXN0IiwgIlVzZXJMaXN0IiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlclN0cmluZyIsICJVc2VyU3RyaW5nIiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgieHJhbmdlIiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInhyYW5nZSIsICJyYW5nZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInppcCIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaXppcCIsICJ6aXAiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ6aXBfbG9uZ2VzdCIsICJpdGVydG9vbHMiLCAiaXRlcnRvb2xzIiwgIml6aXBfbG9uZ2VzdCIsICJ6aXBfbG9uZ2VzdCIpLAogICAgTW92ZWRNb2R1bGUoImJ1aWx0aW5zIiwgIl9fYnVpbHRpbl9fIiksCiAgICBNb3ZlZE1vZHVsZSgiY29uZmlncGFyc2VyIiwgIkNvbmZpZ1BhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoImNvcHlyZWciLCAiY29weV9yZWciKSwKICAgIE1vdmVkTW9kdWxlKCJkYm1fZ251IiwgImdkYm0iLCAiZGJtLmdudSIpLAogICAgTW92ZWRNb2R1bGUoIl9kdW1teV90aHJlYWQiLCAiZHVtbXlfdGhyZWFkIiwgIl9kdW1teV90aHJlYWQiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2Nvb2tpZWphciIsICJjb29raWVsaWIiLCAiaHR0cC5jb29raWVqYXIiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2Nvb2tpZXMiLCAiQ29va2llIiwgImh0dHAuY29va2llcyIpLAogICAgTW92ZWRNb2R1bGUoImh0bWxfZW50aXRpZXMiLCAiaHRtbGVudGl0eWRlZnMiLCAiaHRtbC5lbnRpdGllcyIpLAogICAgTW92ZWRNb2R1bGUoImh0bWxfcGFyc2VyIiwgIkhUTUxQYXJzZXIiLCAiaHRtbC5wYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2NsaWVudCIsICJodHRwbGliIiwgImh0dHAuY2xpZW50IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9tdWx0aXBhcnQiLCAiZW1haWwuTUlNRU11bHRpcGFydCIsICJlbWFpbC5taW1lLm11bHRpcGFydCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfbm9ubXVsdGlwYXJ0IiwgImVtYWlsLk1JTUVOb25NdWx0aXBhcnQiLCAiZW1haWwubWltZS5ub25tdWx0aXBhcnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX3RleHQiLCAiZW1haWwuTUlNRVRleHQiLCAiZW1haWwubWltZS50ZXh0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9iYXNlIiwgImVtYWlsLk1JTUVCYXNlIiwgImVtYWlsLm1pbWUuYmFzZSIpLAogICAgTW92ZWRNb2R1bGUoIkJhc2VIVFRQU2VydmVyIiwgIkJhc2VIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiQ0dJSFRUUFNlcnZlciIsICJDR0lIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiU2ltcGxlSFRUUFNlcnZlciIsICJTaW1wbGVIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiY1BpY2tsZSIsICJjUGlja2xlIiwgInBpY2tsZSIpLAogICAgTW92ZWRNb2R1bGUoInF1ZXVlIiwgIlF1ZXVlIiksCiAgICBNb3ZlZE1vZHVsZSgicmVwcmxpYiIsICJyZXByIiksCiAgICBNb3ZlZE1vZHVsZSgic29ja2V0c2VydmVyIiwgIlNvY2tldFNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIl90aHJlYWQiLCAidGhyZWFkIiwgIl90aHJlYWQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyIiwgIlRraW50ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2RpYWxvZyIsICJEaWFsb2ciLCAidGtpbnRlci5kaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2ZpbGVkaWFsb2ciLCAiRmlsZURpYWxvZyIsICJ0a2ludGVyLmZpbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3Njcm9sbGVkdGV4dCIsICJTY3JvbGxlZFRleHQiLCAidGtpbnRlci5zY3JvbGxlZHRleHQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3NpbXBsZWRpYWxvZyIsICJTaW1wbGVEaWFsb2ciLCAidGtpbnRlci5zaW1wbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3RpeCIsICJUaXgiLCAidGtpbnRlci50aXgiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3R0ayIsICJ0dGsiLCAidGtpbnRlci50dGsiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbnN0YW50cyIsICJUa2NvbnN0YW50cyIsICJ0a2ludGVyLmNvbnN0YW50cyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZG5kIiwgIlRrZG5kIiwgInRraW50ZXIuZG5kIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb2xvcmNob29zZXIiLCAidGtDb2xvckNob29zZXIiLAogICAgICAgICAgICAgICAgInRraW50ZXIuY29sb3JjaG9vc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb21tb25kaWFsb2ciLCAidGtDb21tb25EaWFsb2ciLAogICAgICAgICAgICAgICAgInRraW50ZXIuY29tbW9uZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90a2ZpbGVkaWFsb2ciLCAidGtGaWxlRGlhbG9nIiwgInRraW50ZXIuZmlsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZm9udCIsICJ0a0ZvbnQiLCAidGtpbnRlci5mb250IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9tZXNzYWdlYm94IiwgInRrTWVzc2FnZUJveCIsICJ0a2ludGVyLm1lc3NhZ2Vib3giKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3Rrc2ltcGxlZGlhbG9nIiwgInRrU2ltcGxlRGlhbG9nIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLnNpbXBsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9wYXJzZSIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfcGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX2Vycm9yIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9lcnJvciIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWIiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9yb2JvdHBhcnNlciIsICJyb2JvdHBhcnNlciIsICJ1cmxsaWIucm9ib3RwYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ4bWxycGNfY2xpZW50IiwgInhtbHJwY2xpYiIsICJ4bWxycGMuY2xpZW50IiksCiAgICBNb3ZlZE1vZHVsZSgieG1scnBjX3NlcnZlciIsICJTaW1wbGVYTUxSUENTZXJ2ZXIiLCAieG1scnBjLnNlcnZlciIpLApdCiMgQWRkIHdpbmRvd3Mgc3BlY2lmaWMgbW9kdWxlcy4KaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CiAgICBfbW92ZWRfYXR0cmlidXRlcyArPSBbCiAgICAgICAgTW92ZWRNb2R1bGUoIndpbnJlZyIsICJfd2lucmVnIiksCiAgICBdCgpmb3IgYXR0ciBpbiBfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoX01vdmVkSXRlbXMsIGF0dHIubmFtZSwgYXR0cikKICAgIGlmIGlzaW5zdGFuY2UoYXR0ciwgTW92ZWRNb2R1bGUpOgogICAgICAgIF9pbXBvcnRlci5fYWRkX21vZHVsZShhdHRyLCAibW92ZXMuIiArIGF0dHIubmFtZSkKZGVsIGF0dHIKCl9Nb3ZlZEl0ZW1zLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX21vdmVkX2F0dHJpYnV0ZXMKCm1vdmVzID0gX01vdmVkSXRlbXMoX19uYW1lX18gKyAiLm1vdmVzIikKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKG1vdmVzLCAibW92ZXMiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3BhcnNlIiIiCgoKX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlBhcnNlUmVzdWx0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlNwbGl0UmVzdWx0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhcnNlX3FzIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhcnNlX3FzbCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxkZWZyYWciLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsam9pbiIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxwYXJzZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxzcGxpdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmx1bnBhcnNlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHVuc3BsaXQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicXVvdGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInF1b3RlX3BsdXMiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVucXVvdGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVucXVvdGVfcGx1cyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsZW5jb2RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHF1ZXJ5IiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHRhZyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXR1c2VyIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX2ZyYWdtZW50IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfbmV0bG9jIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcGFyYW1zIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcXVlcnkiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19yZWxhdGl2ZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZS5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfcGFyc2UiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcGFyc2UiLCAibW92ZXMudXJsbGliLnBhcnNlIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvcihfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9lcnJvciIiIgoKCl91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJVUkxFcnJvciIsICJ1cmxsaWIyIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBFcnJvciIsICJ1cmxsaWIyIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkNvbnRlbnRUb29TaG9ydEVycm9yIiwgInVybGxpYiIsICJ1cmxsaWIuZXJyb3IiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvci5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIuZXJyb3IiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfZXJyb3IiLCAibW92ZXMudXJsbGliLmVycm9yIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0KF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3JlcXVlc3QiIiIKCgpfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxvcGVuIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnN0YWxsX29wZW5lciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYnVpbGRfb3BlbmVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXRobmFtZTJ1cmwiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsMnBhdGhuYW1lIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldHByb3hpZXMiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUmVxdWVzdCIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiT3BlbmVyRGlyZWN0b3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBEZWZhdWx0RXJyb3JIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUmVkaXJlY3RIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQQ29va2llUHJvY2Vzc29yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkJhc2VIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUGFzc3dvcmRNZ3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBQYXNzd29yZE1ncldpdGhEZWZhdWx0UmVhbG0iLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkFic3RyYWN0QmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5QmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQWJzdHJhY3REaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUERpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eURpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFNIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGaWxlSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRlRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQ2FjaGVGVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVbmtub3duSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEVycm9yUHJvY2Vzc29yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxyZXRyaWV2ZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxjbGVhbnVwIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVSTG9wZW5lciIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGYW5jeVVSTG9wZW5lciIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwcm94eV9ieXBhc3MiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yZXF1ZXN0IiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3JlcXVlc3QiLCAibW92ZXMudXJsbGliLnJlcXVlc3QiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3Jlc3BvbnNlIiIiCgoKX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGJhc2UiLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGNsb3NlaG9vayIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkaW5mbyIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkaW5mb3VybCIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZSwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZShfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJlc3BvbnNlIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3Jlc3BvbnNlIiwgIm1vdmVzLnVybGxpYi5yZXNwb25zZSIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiIiIKCgpfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUm9ib3RGaWxlUGFyc2VyIiwgInJvYm90cGFyc2VyIiwgInVybGxpYi5yb2JvdHBhcnNlciIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yb2JvdHBhcnNlciIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIsICJtb3Zlcy51cmxsaWIucm9ib3RwYXJzZXIiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliKHR5cGVzLk1vZHVsZVR5cGUpOgoKICAgICIiIkNyZWF0ZSBhIHNpeC5tb3Zlcy51cmxsaWIgbmFtZXNwYWNlIHRoYXQgcmVzZW1ibGVzIHRoZSBQeXRob24gMyBuYW1lc3BhY2UiIiIKICAgIF9fcGF0aF9fID0gW10gICMgbWFyayBhcyBwYWNrYWdlCiAgICBwYXJzZSA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3BhcnNlIikKICAgIGVycm9yID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfZXJyb3IiKQogICAgcmVxdWVzdCA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3JlcXVlc3QiKQogICAgcmVzcG9uc2UgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yZXNwb25zZSIpCiAgICByb2JvdHBhcnNlciA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3JvYm90cGFyc2VyIikKCiAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gWydwYXJzZScsICdlcnJvcicsICdyZXF1ZXN0JywgJ3Jlc3BvbnNlJywgJ3JvYm90cGFyc2VyJ10KCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYihfX25hbWVfXyArICIubW92ZXMudXJsbGliIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliIikKCgpkZWYgYWRkX21vdmUobW92ZSk6CiAgICAiIiJBZGQgYW4gaXRlbSB0byBzaXgubW92ZXMuIiIiCiAgICBzZXRhdHRyKF9Nb3ZlZEl0ZW1zLCBtb3ZlLm5hbWUsIG1vdmUpCgoKZGVmIHJlbW92ZV9tb3ZlKG5hbWUpOgogICAgIiIiUmVtb3ZlIGl0ZW0gZnJvbSBzaXgubW92ZXMuIiIiCiAgICB0cnk6CiAgICAgICAgZGVsYXR0cihfTW92ZWRJdGVtcywgbmFtZSkKICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlbCBtb3Zlcy5fX2RpY3RfX1tuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoIm5vIHN1Y2ggbW92ZSwgJXIiICUgKG5hbWUsKSkKCgppZiBQWTM6CiAgICBfbWV0aF9mdW5jID0gIl9fZnVuY19fIgogICAgX21ldGhfc2VsZiA9ICJfX3NlbGZfXyIKCiAgICBfZnVuY19jbG9zdXJlID0gIl9fY2xvc3VyZV9fIgogICAgX2Z1bmNfY29kZSA9ICJfX2NvZGVfXyIKICAgIF9mdW5jX2RlZmF1bHRzID0gIl9fZGVmYXVsdHNfXyIKICAgIF9mdW5jX2dsb2JhbHMgPSAiX19nbG9iYWxzX18iCmVsc2U6CiAgICBfbWV0aF9mdW5jID0gImltX2Z1bmMiCiAgICBfbWV0aF9zZWxmID0gImltX3NlbGYiCgogICAgX2Z1bmNfY2xvc3VyZSA9ICJmdW5jX2Nsb3N1cmUiCiAgICBfZnVuY19jb2RlID0gImZ1bmNfY29kZSIKICAgIF9mdW5jX2RlZmF1bHRzID0gImZ1bmNfZGVmYXVsdHMiCiAgICBfZnVuY19nbG9iYWxzID0gImZ1bmNfZ2xvYmFscyIKCgp0cnk6CiAgICBhZHZhbmNlX2l0ZXJhdG9yID0gbmV4dApleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIGFkdmFuY2VfaXRlcmF0b3IoaXQpOgogICAgICAgIHJldHVybiBpdC5uZXh0KCkKbmV4dCA9IGFkdmFuY2VfaXRlcmF0b3IKCgp0cnk6CiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgY2FsbGFibGUob2JqKToKICAgICAgICByZXR1cm4gYW55KCJfX2NhbGxfXyIgaW4ga2xhc3MuX19kaWN0X18gZm9yIGtsYXNzIGluIHR5cGUob2JqKS5fX21yb19fKQoKCmlmIFBZMzoKICAgIGRlZiBnZXRfdW5ib3VuZF9mdW5jdGlvbih1bmJvdW5kKToKICAgICAgICByZXR1cm4gdW5ib3VuZAoKICAgIGNyZWF0ZV9ib3VuZF9tZXRob2QgPSB0eXBlcy5NZXRob2RUeXBlCgogICAgZGVmIGNyZWF0ZV91bmJvdW5kX21ldGhvZChmdW5jLCBjbHMpOgogICAgICAgIHJldHVybiBmdW5jCgogICAgSXRlcmF0b3IgPSBvYmplY3QKZWxzZToKICAgIGRlZiBnZXRfdW5ib3VuZF9mdW5jdGlvbih1bmJvdW5kKToKICAgICAgICByZXR1cm4gdW5ib3VuZC5pbV9mdW5jCgogICAgZGVmIGNyZWF0ZV9ib3VuZF9tZXRob2QoZnVuYywgb2JqKToKICAgICAgICByZXR1cm4gdHlwZXMuTWV0aG9kVHlwZShmdW5jLCBvYmosIG9iai5fX2NsYXNzX18pCgogICAgZGVmIGNyZWF0ZV91bmJvdW5kX21ldGhvZChmdW5jLCBjbHMpOgogICAgICAgIHJldHVybiB0eXBlcy5NZXRob2RUeXBlKGZ1bmMsIE5vbmUsIGNscykKCiAgICBjbGFzcyBJdGVyYXRvcihvYmplY3QpOgoKICAgICAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikuX19uZXh0X18oc2VsZikKCiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCl9hZGRfZG9jKGdldF91bmJvdW5kX2Z1bmN0aW9uLAogICAgICAgICAiIiJHZXQgdGhlIGZ1bmN0aW9uIG91dCBvZiBhIHBvc3NpYmx5IHVuYm91bmQgZnVuY3Rpb24iIiIpCgoKZ2V0X21ldGhvZF9mdW5jdGlvbiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX21ldGhfZnVuYykKZ2V0X21ldGhvZF9zZWxmID0gb3BlcmF0b3IuYXR0cmdldHRlcihfbWV0aF9zZWxmKQpnZXRfZnVuY3Rpb25fY2xvc3VyZSA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfY2xvc3VyZSkKZ2V0X2Z1bmN0aW9uX2NvZGUgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2NvZGUpCmdldF9mdW5jdGlvbl9kZWZhdWx0cyA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfZGVmYXVsdHMpCmdldF9mdW5jdGlvbl9nbG9iYWxzID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19nbG9iYWxzKQoKCmlmIFBZMzoKICAgIGRlZiBpdGVya2V5cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLmtleXMoKiprdykpCgogICAgZGVmIGl0ZXJ2YWx1ZXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC52YWx1ZXMoKiprdykpCgogICAgZGVmIGl0ZXJpdGVtcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLml0ZW1zKCoqa3cpKQoKICAgIGRlZiBpdGVybGlzdHMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5saXN0cygqKmt3KSkKCiAgICB2aWV3a2V5cyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigia2V5cyIpCgogICAgdmlld3ZhbHVlcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmFsdWVzIikKCiAgICB2aWV3aXRlbXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoIml0ZW1zIikKZWxzZToKICAgIGRlZiBpdGVya2V5cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVya2V5cygqKmt3KQoKICAgIGRlZiBpdGVydmFsdWVzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJ2YWx1ZXMoKiprdykKCiAgICBkZWYgaXRlcml0ZW1zKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJpdGVtcygqKmt3KQoKICAgIGRlZiBpdGVybGlzdHMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcmxpc3RzKCoqa3cpCgogICAgdmlld2tleXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXdrZXlzIikKCiAgICB2aWV3dmFsdWVzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3dmFsdWVzIikKCiAgICB2aWV3aXRlbXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXdpdGVtcyIpCgpfYWRkX2RvYyhpdGVya2V5cywgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVydmFsdWVzLCAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcml0ZW1zLAogICAgICAgICAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIHZhbHVlKSBwYWlycyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcmxpc3RzLAogICAgICAgICAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIFt2YWx1ZXNdKSBwYWlycyBvZiBhIGRpY3Rpb25hcnkuIikKCgppZiBQWTM6CiAgICBkZWYgYihzKToKICAgICAgICByZXR1cm4gcy5lbmNvZGUoImxhdGluLTEiKQoKICAgIGRlZiB1KHMpOgogICAgICAgIHJldHVybiBzCiAgICB1bmljaHIgPSBjaHIKICAgIGltcG9ydCBzdHJ1Y3QKICAgIGludDJieXRlID0gc3RydWN0LlN0cnVjdCgiPkIiKS5wYWNrCiAgICBkZWwgc3RydWN0CiAgICBieXRlMmludCA9IG9wZXJhdG9yLml0ZW1nZXR0ZXIoMCkKICAgIGluZGV4Ynl0ZXMgPSBvcGVyYXRvci5nZXRpdGVtCiAgICBpdGVyYnl0ZXMgPSBpdGVyCiAgICBpbXBvcnQgaW8KICAgIFN0cmluZ0lPID0gaW8uU3RyaW5nSU8KICAgIEJ5dGVzSU8gPSBpby5CeXRlc0lPCiAgICBfYXNzZXJ0Q291bnRFcXVhbCA9ICJhc3NlcnRDb3VudEVxdWFsIgogICAgaWYgc3lzLnZlcnNpb25faW5mb1sxXSA8PSAxOgogICAgICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleHAiCiAgICAgICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4cE1hdGNoZXMiCiAgICBlbHNlOgogICAgICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleCIKICAgICAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXgiCmVsc2U6CiAgICBkZWYgYihzKToKICAgICAgICByZXR1cm4gcwogICAgIyBXb3JrYXJvdW5kIGZvciBzdGFuZGFsb25lIGJhY2tzbGFzaAoKICAgIGRlZiB1KHMpOgogICAgICAgIHJldHVybiB1bmljb2RlKHMucmVwbGFjZShyJ1xcJywgcidcXFxcJyksICJ1bmljb2RlX2VzY2FwZSIpCiAgICB1bmljaHIgPSB1bmljaHIKICAgIGludDJieXRlID0gY2hyCgogICAgZGVmIGJ5dGUyaW50KGJzKToKICAgICAgICByZXR1cm4gb3JkKGJzWzBdKQoKICAgIGRlZiBpbmRleGJ5dGVzKGJ1ZiwgaSk6CiAgICAgICAgcmV0dXJuIG9yZChidWZbaV0pCiAgICBpdGVyYnl0ZXMgPSBmdW5jdG9vbHMucGFydGlhbChpdGVydG9vbHMuaW1hcCwgb3JkKQogICAgaW1wb3J0IFN0cmluZ0lPCiAgICBTdHJpbmdJTyA9IEJ5dGVzSU8gPSBTdHJpbmdJTy5TdHJpbmdJTwogICAgX2Fzc2VydENvdW50RXF1YWwgPSAiYXNzZXJ0SXRlbXNFcXVhbCIKICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleHAiCiAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXhwTWF0Y2hlcyIKX2FkZF9kb2MoYiwgIiIiQnl0ZSBsaXRlcmFsIiIiKQpfYWRkX2RvYyh1LCAiIiJUZXh0IGxpdGVyYWwiIiIpCgoKZGVmIGFzc2VydENvdW50RXF1YWwoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRDb3VudEVxdWFsKSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIGFzc2VydFJhaXNlc1JlZ2V4KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0UmFpc2VzUmVnZXgpKCphcmdzLCAqKmt3YXJncykKCgpkZWYgYXNzZXJ0UmVnZXgoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRSZWdleCkoKmFyZ3MsICoqa3dhcmdzKQoKCmlmIFBZMzoKICAgIGV4ZWNfID0gZ2V0YXR0cihtb3Zlcy5idWlsdGlucywgImV4ZWMiKQoKICAgIGRlZiByZXJhaXNlKHRwLCB2YWx1ZSwgdGI9Tm9uZSk6CiAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgdmFsdWUgPSB0cCgpCiAgICAgICAgaWYgdmFsdWUuX190cmFjZWJhY2tfXyBpcyBub3QgdGI6CiAgICAgICAgICAgIHJhaXNlIHZhbHVlLndpdGhfdHJhY2ViYWNrKHRiKQogICAgICAgIHJhaXNlIHZhbHVlCgplbHNlOgogICAgZGVmIGV4ZWNfKF9jb2RlXywgX2dsb2JzXz1Ob25lLCBfbG9jc189Tm9uZSk6CiAgICAgICAgIiIiRXhlY3V0ZSBjb2RlIGluIGEgbmFtZXNwYWNlLiIiIgogICAgICAgIGlmIF9nbG9ic18gaXMgTm9uZToKICAgICAgICAgICAgZnJhbWUgPSBzeXMuX2dldGZyYW1lKDEpCiAgICAgICAgICAgIF9nbG9ic18gPSBmcmFtZS5mX2dsb2JhbHMKICAgICAgICAgICAgaWYgX2xvY3NfIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBfbG9jc18gPSBmcmFtZS5mX2xvY2FscwogICAgICAgICAgICBkZWwgZnJhbWUKICAgICAgICBlbGlmIF9sb2NzXyBpcyBOb25lOgogICAgICAgICAgICBfbG9jc18gPSBfZ2xvYnNfCiAgICAgICAgZXhlYygiIiJleGVjIF9jb2RlXyBpbiBfZ2xvYnNfLCBfbG9jc18iIiIpCgogICAgZXhlY18oIiIiZGVmIHJlcmFpc2UodHAsIHZhbHVlLCB0Yj1Ob25lKToKICAgIHJhaXNlIHRwLCB2YWx1ZSwgdGIKIiIiKQoKCmlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID09ICgzLCAyKToKICAgIGV4ZWNfKCIiImRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgIGlmIGZyb21fdmFsdWUgaXMgTm9uZToKICAgICAgICByYWlzZSB2YWx1ZQogICAgcmFpc2UgdmFsdWUgZnJvbSBmcm9tX3ZhbHVlCiIiIikKZWxpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA+ICgzLCAyKToKICAgIGV4ZWNfKCIiImRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgIHJhaXNlIHZhbHVlIGZyb20gZnJvbV92YWx1ZQoiIiIpCmVsc2U6CiAgICBkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICAgICAgcmFpc2UgdmFsdWUKCgpwcmludF8gPSBnZXRhdHRyKG1vdmVzLmJ1aWx0aW5zLCAicHJpbnQiLCBOb25lKQppZiBwcmludF8gaXMgTm9uZToKICAgIGRlZiBwcmludF8oKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiJUaGUgbmV3LXN0eWxlIHByaW50IGZ1bmN0aW9uIGZvciBQeXRob24gMi40IGFuZCAyLjUuIiIiCiAgICAgICAgZnAgPSBrd2FyZ3MucG9wKCJmaWxlIiwgc3lzLnN0ZG91dCkKICAgICAgICBpZiBmcCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZGVmIHdyaXRlKGRhdGEpOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkYXRhLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgICAgIGRhdGEgPSBzdHIoZGF0YSkKICAgICAgICAgICAgIyBJZiB0aGUgZmlsZSBoYXMgYW4gZW5jb2RpbmcsIGVuY29kZSB1bmljb2RlIHdpdGggaXQuCiAgICAgICAgICAgIGlmIChpc2luc3RhbmNlKGZwLCBmaWxlKSBhbmQKICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGRhdGEsIHVuaWNvZGUpIGFuZAogICAgICAgICAgICAgICAgICAgIGZwLmVuY29kaW5nIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgICAgIGVycm9ycyA9IGdldGF0dHIoZnAsICJlcnJvcnMiLCBOb25lKQogICAgICAgICAgICAgICAgaWYgZXJyb3JzIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gInN0cmljdCIKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShmcC5lbmNvZGluZywgZXJyb3JzKQogICAgICAgICAgICBmcC53cml0ZShkYXRhKQogICAgICAgIHdhbnRfdW5pY29kZSA9IEZhbHNlCiAgICAgICAgc2VwID0ga3dhcmdzLnBvcCgic2VwIiwgTm9uZSkKICAgICAgICBpZiBzZXAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VwLCB1bmljb2RlKToKICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShzZXAsIHN0cik6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInNlcCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmciKQogICAgICAgIGVuZCA9IGt3YXJncy5wb3AoImVuZCIsIE5vbmUpCiAgICAgICAgaWYgZW5kIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVuZCwgdW5pY29kZSk6CiAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UoZW5kLCBzdHIpOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJlbmQgbXVzdCBiZSBOb25lIG9yIGEgc3RyaW5nIikKICAgICAgICBpZiBrd2FyZ3M6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50cyB0byBwcmludCgpIikKICAgICAgICBpZiBub3Qgd2FudF91bmljb2RlOgogICAgICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZywgdW5pY29kZSk6CiAgICAgICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgd2FudF91bmljb2RlOgogICAgICAgICAgICBuZXdsaW5lID0gdW5pY29kZSgiXG4iKQogICAgICAgICAgICBzcGFjZSA9IHVuaWNvZGUoIiAiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5ld2xpbmUgPSAiXG4iCiAgICAgICAgICAgIHNwYWNlID0gIiAiCiAgICAgICAgaWYgc2VwIGlzIE5vbmU6CiAgICAgICAgICAgIHNlcCA9IHNwYWNlCiAgICAgICAgaWYgZW5kIGlzIE5vbmU6CiAgICAgICAgICAgIGVuZCA9IG5ld2xpbmUKICAgICAgICBmb3IgaSwgYXJnIGluIGVudW1lcmF0ZShhcmdzKToKICAgICAgICAgICAgaWYgaToKICAgICAgICAgICAgICAgIHdyaXRlKHNlcCkKICAgICAgICAgICAgd3JpdGUoYXJnKQogICAgICAgIHdyaXRlKGVuZCkKaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPCAoMywgMyk6CiAgICBfcHJpbnQgPSBwcmludF8KCiAgICBkZWYgcHJpbnRfKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgZnAgPSBrd2FyZ3MuZ2V0KCJmaWxlIiwgc3lzLnN0ZG91dCkKICAgICAgICBmbHVzaCA9IGt3YXJncy5wb3AoImZsdXNoIiwgRmFsc2UpCiAgICAgICAgX3ByaW50KCphcmdzLCAqKmt3YXJncykKICAgICAgICBpZiBmbHVzaCBhbmQgZnAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZwLmZsdXNoKCkKCl9hZGRfZG9jKHJlcmFpc2UsICIiIlJlcmFpc2UgYW4gZXhjZXB0aW9uLiIiIikKCmlmIHN5cy52ZXJzaW9uX2luZm9bMDoyXSA8ICgzLCA0KToKICAgIGRlZiB3cmFwcyh3cmFwcGVkLCBhc3NpZ25lZD1mdW5jdG9vbHMuV1JBUFBFUl9BU1NJR05NRU5UUywKICAgICAgICAgICAgICB1cGRhdGVkPWZ1bmN0b29scy5XUkFQUEVSX1VQREFURVMpOgogICAgICAgIGRlZiB3cmFwcGVyKGYpOgogICAgICAgICAgICBmID0gZnVuY3Rvb2xzLndyYXBzKHdyYXBwZWQsIGFzc2lnbmVkLCB1cGRhdGVkKShmKQogICAgICAgICAgICBmLl9fd3JhcHBlZF9fID0gd3JhcHBlZAogICAgICAgICAgICByZXR1cm4gZgogICAgICAgIHJldHVybiB3cmFwcGVyCmVsc2U6CiAgICB3cmFwcyA9IGZ1bmN0b29scy53cmFwcwoKCmRlZiB3aXRoX21ldGFjbGFzcyhtZXRhLCAqYmFzZXMpOgogICAgIiIiQ3JlYXRlIGEgYmFzZSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLiIiIgogICAgIyBUaGlzIHJlcXVpcmVzIGEgYml0IG9mIGV4cGxhbmF0aW9uOiB0aGUgYmFzaWMgaWRlYSBpcyB0byBtYWtlIGEgZHVtbXkKICAgICMgbWV0YWNsYXNzIGZvciBvbmUgbGV2ZWwgb2YgY2xhc3MgaW5zdGFudGlhdGlvbiB0aGF0IHJlcGxhY2VzIGl0c2VsZiB3aXRoCiAgICAjIHRoZSBhY3R1YWwgbWV0YWNsYXNzLgogICAgY2xhc3MgbWV0YWNsYXNzKG1ldGEpOgoKICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIHRoaXNfYmFzZXMsIGQpOgogICAgICAgICAgICByZXR1cm4gbWV0YShuYW1lLCBiYXNlcywgZCkKICAgIHJldHVybiB0eXBlLl9fbmV3X18obWV0YWNsYXNzLCAndGVtcG9yYXJ5X2NsYXNzJywgKCksIHt9KQoKCmRlZiBhZGRfbWV0YWNsYXNzKG1ldGFjbGFzcyk6CiAgICAiIiJDbGFzcyBkZWNvcmF0b3IgZm9yIGNyZWF0aW5nIGEgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4iIiIKICAgIGRlZiB3cmFwcGVyKGNscyk6CiAgICAgICAgb3JpZ192YXJzID0gY2xzLl9fZGljdF9fLmNvcHkoKQogICAgICAgIHNsb3RzID0gb3JpZ192YXJzLmdldCgnX19zbG90c19fJykKICAgICAgICBpZiBzbG90cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzbG90cywgc3RyKToKICAgICAgICAgICAgICAgIHNsb3RzID0gW3Nsb3RzXQogICAgICAgICAgICBmb3Igc2xvdHNfdmFyIGluIHNsb3RzOgogICAgICAgICAgICAgICAgb3JpZ192YXJzLnBvcChzbG90c192YXIpCiAgICAgICAgb3JpZ192YXJzLnBvcCgnX19kaWN0X18nLCBOb25lKQogICAgICAgIG9yaWdfdmFycy5wb3AoJ19fd2Vha3JlZl9fJywgTm9uZSkKICAgICAgICByZXR1cm4gbWV0YWNsYXNzKGNscy5fX25hbWVfXywgY2xzLl9fYmFzZXNfXywgb3JpZ192YXJzKQogICAgcmV0dXJuIHdyYXBwZXIKCgpkZWYgcHl0aG9uXzJfdW5pY29kZV9jb21wYXRpYmxlKGtsYXNzKToKICAgICIiIgogICAgQSBkZWNvcmF0b3IgdGhhdCBkZWZpbmVzIF9fdW5pY29kZV9fIGFuZCBfX3N0cl9fIG1ldGhvZHMgdW5kZXIgUHl0aG9uIDIuCiAgICBVbmRlciBQeXRob24gMyBpdCBkb2VzIG5vdGhpbmcuCgogICAgVG8gc3VwcG9ydCBQeXRob24gMiBhbmQgMyB3aXRoIGEgc2luZ2xlIGNvZGUgYmFzZSwgZGVmaW5lIGEgX19zdHJfXyBtZXRob2QKICAgIHJldHVybmluZyB0ZXh0IGFuZCBhcHBseSB0aGlzIGRlY29yYXRvciB0byB0aGUgY2xhc3MuCiAgICAiIiIKICAgIGlmIFBZMjoKICAgICAgICBpZiAnX19zdHJfXycgbm90IGluIGtsYXNzLl9fZGljdF9fOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJAcHl0aG9uXzJfdW5pY29kZV9jb21wYXRpYmxlIGNhbm5vdCBiZSBhcHBsaWVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gJXMgYmVjYXVzZSBpdCBkb2Vzbid0IGRlZmluZSBfX3N0cl9fKCkuIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2xhc3MuX19uYW1lX18pCiAgICAgICAga2xhc3MuX191bmljb2RlX18gPSBrbGFzcy5fX3N0cl9fCiAgICAgICAga2xhc3MuX19zdHJfXyA9IGxhbWJkYSBzZWxmOiBzZWxmLl9fdW5pY29kZV9fKCkuZW5jb2RlKCd1dGYtOCcpCiAgICByZXR1cm4ga2xhc3MKCgojIENvbXBsZXRlIHRoZSBtb3ZlcyBpbXBsZW1lbnRhdGlvbi4KIyBUaGlzIGNvZGUgaXMgYXQgdGhlIGVuZCBvZiB0aGlzIG1vZHVsZSB0byBzcGVlZCB1cCBtb2R1bGUgbG9hZGluZy4KIyBUdXJuIHRoaXMgbW9kdWxlIGludG8gYSBwYWNrYWdlLgpfX3BhdGhfXyA9IFtdICAjIHJlcXVpcmVkIGZvciBQRVAgMzAyIGFuZCBQRVAgNDUxCl9fcGFja2FnZV9fID0gX19uYW1lX18gICMgc2VlIFBFUCAzNjYgQFJlc2VydmVkQXNzaWdubWVudAppZiBnbG9iYWxzKCkuZ2V0KCJfX3NwZWNfXyIpIGlzIG5vdCBOb25lOgogICAgX19zcGVjX18uc3VibW9kdWxlX3NlYXJjaF9sb2NhdGlvbnMgPSBbXSAgIyBQRVAgNDUxIEBVbmRlZmluZWRWYXJpYWJsZQojIFJlbW92ZSBvdGhlciBzaXggbWV0YSBwYXRoIGltcG9ydGVycywgc2luY2UgdGhleSBjYXVzZSBwcm9ibGVtcy4gVGhpcyBjYW4KIyBoYXBwZW4gaWYgc2l4IGlzIHJlbW92ZWQgZnJvbSBzeXMubW9kdWxlcyBhbmQgdGhlbiByZWxvYWRlZC4gKFNldHVwdG9vbHMgZG9lcwojIHRoaXMgZm9yIHNvbWUgcmVhc29uLikKaWYgc3lzLm1ldGFfcGF0aDoKICAgIGZvciBpLCBpbXBvcnRlciBpbiBlbnVtZXJhdGUoc3lzLm1ldGFfcGF0aCk6CiAgICAgICAgIyBIZXJlJ3Mgc29tZSByZWFsIG5hc3RpbmVzczogQW5vdGhlciAiaW5zdGFuY2UiIG9mIHRoZSBzaXggbW9kdWxlIG1pZ2h0CiAgICAgICAgIyBiZSBmbG9hdGluZyBhcm91bmQuIFRoZXJlZm9yZSwgd2UgY2FuJ3QgdXNlIGlzaW5zdGFuY2UoKSB0byBjaGVjayBmb3IKICAgICAgICAjIHRoZSBzaXggbWV0YSBwYXRoIGltcG9ydGVyLCBzaW5jZSB0aGUgb3RoZXIgc2l4IGluc3RhbmNlIHdpbGwgaGF2ZQogICAgICAgICMgaW5zZXJ0ZWQgYW4gaW1wb3J0ZXIgd2l0aCBkaWZmZXJlbnQgY2xhc3MuCiAgICAgICAgaWYgKHR5cGUoaW1wb3J0ZXIpLl9fbmFtZV9fID09ICJfU2l4TWV0YVBhdGhJbXBvcnRlciIgYW5kCiAgICAgICAgICAgICAgICBpbXBvcnRlci5uYW1lID09IF9fbmFtZV9fKToKICAgICAgICAgICAgZGVsIHN5cy5tZXRhX3BhdGhbaV0KICAgICAgICAgICAgYnJlYWsKICAgIGRlbCBpLCBpbXBvcnRlcgojIEZpbmFsbHksIGFkZCB0aGUgaW1wb3J0ZXIgdG8gdGhlIG1ldGEgcGF0aCBpbXBvcnQgaG9vay4Kc3lzLm1ldGFfcGF0aC5hcHBlbmQoX2ltcG9ydGVyKQpQSwMEFAAAAAAAAAAhAHXY8Xm3CQAAtwkAADgAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL2V4dGVybi9fX2luaXRfXy5weWltcG9ydCBzeXMKCgpjbGFzcyBWZW5kb3JJbXBvcnRlcjoKICAgICIiIgogICAgQSBQRVAgMzAyIG1ldGEgcGF0aCBpbXBvcnRlciBmb3IgZmluZGluZyBvcHRpb25hbGx5LXZlbmRvcmVkCiAgICBvciBvdGhlcndpc2UgbmF0dXJhbGx5LWluc3RhbGxlZCBwYWNrYWdlcyBmcm9tIHJvb3RfbmFtZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290X25hbWUsIHZlbmRvcmVkX25hbWVzPSgpLCB2ZW5kb3JfcGtnPU5vbmUpOgogICAgICAgIHNlbGYucm9vdF9uYW1lID0gcm9vdF9uYW1lCiAgICAgICAgc2VsZi52ZW5kb3JlZF9uYW1lcyA9IHNldCh2ZW5kb3JlZF9uYW1lcykKICAgICAgICBzZWxmLnZlbmRvcl9wa2cgPSB2ZW5kb3JfcGtnIG9yIHJvb3RfbmFtZS5yZXBsYWNlKCdleHRlcm4nLCAnX3ZlbmRvcicpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2VhcmNoX3BhdGgoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2VhcmNoIGZpcnN0IHRoZSB2ZW5kb3IgcGFja2FnZSB0aGVuIGFzIGEgbmF0dXJhbCBwYWNrYWdlLgogICAgICAgICIiIgogICAgICAgIHlpZWxkIHNlbGYudmVuZG9yX3BrZyArICcuJwogICAgICAgIHlpZWxkICcnCgogICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lLCBwYXRoPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBzZWxmIHdoZW4gZnVsbG5hbWUgc3RhcnRzIHdpdGggcm9vdF9uYW1lIGFuZCB0aGUKICAgICAgICB0YXJnZXQgbW9kdWxlIGlzIG9uZSB2ZW5kb3JlZCB0aHJvdWdoIHRoaXMgaW1wb3J0ZXIuCiAgICAgICAgIiIiCiAgICAgICAgcm9vdCwgYmFzZSwgdGFyZ2V0ID0gZnVsbG5hbWUucGFydGl0aW9uKHNlbGYucm9vdF9uYW1lICsgJy4nKQogICAgICAgIGlmIHJvb3Q6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIG5vdCBhbnkobWFwKHRhcmdldC5zdGFydHN3aXRoLCBzZWxmLnZlbmRvcmVkX25hbWVzKSk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICAiIiIKICAgICAgICBJdGVyYXRlIG92ZXIgdGhlIHNlYXJjaCBwYXRoIHRvIGxvY2F0ZSBhbmQgbG9hZCBmdWxsbmFtZS4KICAgICAgICAiIiIKICAgICAgICByb290LCBiYXNlLCB0YXJnZXQgPSBmdWxsbmFtZS5wYXJ0aXRpb24oc2VsZi5yb290X25hbWUgKyAnLicpCiAgICAgICAgZm9yIHByZWZpeCBpbiBzZWxmLnNlYXJjaF9wYXRoOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBleHRhbnQgPSBwcmVmaXggKyB0YXJnZXQKICAgICAgICAgICAgICAgIF9faW1wb3J0X18oZXh0YW50KQogICAgICAgICAgICAgICAgbW9kID0gc3lzLm1vZHVsZXNbZXh0YW50XQogICAgICAgICAgICAgICAgc3lzLm1vZHVsZXNbZnVsbG5hbWVdID0gbW9kCiAgICAgICAgICAgICAgICAjIG15c3RlcmlvdXMgaGFjazoKICAgICAgICAgICAgICAgICMgUmVtb3ZlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGV4dGFudCBwYWNrYWdlL21vZHVsZQogICAgICAgICAgICAgICAgIyBvbiBsYXRlciBQeXRob24gdmVyc2lvbnMgdG8gY2F1c2UgcmVsYXRpdmUgaW1wb3J0cwogICAgICAgICAgICAgICAgIyBpbiB0aGUgdmVuZG9yIHBhY2thZ2UgdG8gcmVzb2x2ZSB0aGUgc2FtZSBtb2R1bGVzCiAgICAgICAgICAgICAgICAjIGFzIHRob3NlIGdvaW5nIHRocm91Z2ggdGhpcyBpbXBvcnRlci4KICAgICAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPiAoMywgMyk6CiAgICAgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW2V4dGFudF0KICAgICAgICAgICAgICAgIHJldHVybiBtb2QKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKAogICAgICAgICAgICAgICAgIlRoZSAne3RhcmdldH0nIHBhY2thZ2UgaXMgcmVxdWlyZWQ7ICIKICAgICAgICAgICAgICAgICJub3JtYWxseSB0aGlzIGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2Ugc28gaWYgeW91IGdldCAiCiAgICAgICAgICAgICAgICAidGhpcyB3YXJuaW5nLCBjb25zdWx0IHRoZSBwYWNrYWdlciBvZiB5b3VyICIKICAgICAgICAgICAgICAgICJkaXN0cmlidXRpb24uIi5mb3JtYXQoKipsb2NhbHMoKSkKICAgICAgICAgICAgKQoKICAgIGRlZiBpbnN0YWxsKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEluc3RhbGwgdGhpcyBpbXBvcnRlciBpbnRvIHN5cy5tZXRhX3BhdGggaWYgbm90IGFscmVhZHkgcHJlc2VudC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmIG5vdCBpbiBzeXMubWV0YV9wYXRoOgogICAgICAgICAgICBzeXMubWV0YV9wYXRoLmFwcGVuZChzZWxmKQoKCm5hbWVzID0gJ3BhY2thZ2luZycsICdweXBhcnNpbmcnLCAnc2l4JywgJ2FwcGRpcnMnClZlbmRvckltcG9ydGVyKF9fbmFtZV9fLCBuYW1lcykuaW5zdGFsbCgpClBLAwQUAAAAAAAAACEAx0d9MlgCAABYAgAAMwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvcHkzMWNvbXBhdC5weWltcG9ydCBvcwppbXBvcnQgZXJybm8KaW1wb3J0IHN5cwoKCmRlZiBfbWFrZWRpcnNfMzEocGF0aCwgZXhpc3Rfb2s9RmFsc2UpOgogICAgdHJ5OgogICAgICAgIG9zLm1ha2VkaXJzKHBhdGgpCiAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CiAgICAgICAgaWYgbm90IGV4aXN0X29rIG9yIGV4Yy5lcnJubyAhPSBlcnJuby5FRVhJU1Q6CiAgICAgICAgICAgIHJhaXNlCgoKIyByZWx5IG9uIGNvbXBhdGliaWxpdHkgYmVoYXZpb3IgdW50aWwgbW9kZSBjb25zaWRlcmF0aW9ucwojICBhbmQgZXhpc3RzX29rIGNvbnNpZGVyYXRpb25zIGFyZSBkaXNlbnRhbmdsZWQuCiMgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvcHVsbC8xMDgzI2lzc3VlY29tbWVudC0zMTUxNjg2NjMKbmVlZHNfbWFrZWRpcnMgPSAoCiAgICBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDIsIDUpIG9yCiAgICAoMywgMykgPD0gc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzLCA2KSBvcgogICAgKDMsIDQpIDw9IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgNCwgMSkKKQptYWtlZGlycyA9IF9tYWtlZGlyc18zMSBpZiBuZWVkc19tYWtlZGlycyBlbHNlIG9zLm1ha2VkaXJzClBLAwQUAAAAAAAAACEAf9S6XI4FAACOBQAAQwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9ERVNDUklQVElPTi5yc3QuLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vcHlwaS92L3NldHVwdG9vbHMuc3ZnCiAgIDp0YXJnZXQ6IGh0dHBzOi8vcHlwaS5vcmcvcHJvamVjdC9zZXR1cHRvb2xzCgouLiBpbWFnZTo6IGh0dHBzOi8vcmVhZHRoZWRvY3Mub3JnL3Byb2plY3RzL3NldHVwdG9vbHMvYmFkZ2UvP3ZlcnNpb249bGF0ZXN0CiAgICA6dGFyZ2V0OiBodHRwczovL3NldHVwdG9vbHMucmVhZHRoZWRvY3MuaW8KCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby90cmF2aXMvcHlwYS9zZXR1cHRvb2xzL21hc3Rlci5zdmc/bGFiZWw9TGludXglMjBidWlsZCUyMCU0MCUyMFRyYXZpcyUyMENJCiAgIDp0YXJnZXQ6IGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9weXBhL3NldHVwdG9vbHMKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9hcHB2ZXlvci9jaS9qYXJhY28vc2V0dXB0b29scy9tYXN0ZXIuc3ZnP2xhYmVsPVdpbmRvd3MlMjBidWlsZCUyMCU0MCUyMEFwcHZleW9yCiAgIDp0YXJnZXQ6IGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvamFyYWNvL3NldHVwdG9vbHMvYnJhbmNoL21hc3RlcgoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3B5cGkvcHl2ZXJzaW9ucy9zZXR1cHRvb2xzLnN2ZwoKU2VlIHRoZSBgSW5zdGFsbGF0aW9uIEluc3RydWN0aW9ucwo8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9pbnN0YWxsaW5nLz5gXyBpbiB0aGUgUHl0aG9uIFBhY2thZ2luZwpVc2VyJ3MgR3VpZGUgZm9yIGluc3RydWN0aW9ucyBvbiBpbnN0YWxsaW5nLCB1cGdyYWRpbmcsIGFuZCB1bmluc3RhbGxpbmcKU2V0dXB0b29scy4KClRoZSBwcm9qZWN0IGlzIGBtYWludGFpbmVkIGF0IEdpdEh1YiA8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scz5gXy4KClF1ZXN0aW9ucyBhbmQgY29tbWVudHMgc2hvdWxkIGJlIGRpcmVjdGVkIHRvIHRoZSBgZGlzdHV0aWxzLXNpZwptYWlsaW5nIGxpc3QgPGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL2Rpc3R1dGlscy1zaWcvPmBfLgpCdWcgcmVwb3J0cyBhbmQgZXNwZWNpYWxseSB0ZXN0ZWQgcGF0Y2hlcyBtYXkgYmUKc3VibWl0dGVkIGRpcmVjdGx5IHRvIHRoZSBgYnVnIHRyYWNrZXIKPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzPmBfLgoKCkNvZGUgb2YgQ29uZHVjdAotLS0tLS0tLS0tLS0tLS0KCkV2ZXJ5b25lIGludGVyYWN0aW5nIGluIHRoZSBzZXR1cHRvb2xzIHByb2plY3QncyBjb2RlYmFzZXMsIGlzc3VlIHRyYWNrZXJzLApjaGF0IHJvb21zLCBhbmQgbWFpbGluZyBsaXN0cyBpcyBleHBlY3RlZCB0byBmb2xsb3cgdGhlCmBQeVBBIENvZGUgb2YgQ29uZHVjdCA8aHR0cHM6Ly93d3cucHlwYS5pby9lbi9sYXRlc3QvY29kZS1vZi1jb25kdWN0Lz5gXy4KCgpQSwMEFAAAAAAAAAAhAFDXqwc2BAAANgQAAD8AAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vTElDRU5TRS50eHRDb3B5cmlnaHQgKEMpIDIwMTYgSmFzb24gUiBDb29tYnMgPGphcmFjb0BqYXJhY28uY29tPgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgp0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgp0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCnVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCm9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbwpzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQpTT0ZUV0FSRS4KUEsDBBQAAAAAAAAAIQDxDJD/7goAAO4KAAA8AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL01FVEFEQVRBTWV0YWRhdGEtVmVyc2lvbjogMi4wCk5hbWU6IHNldHVwdG9vbHMKVmVyc2lvbjogMzguMi40ClN1bW1hcnk6IEVhc2lseSBkb3dubG9hZCwgYnVpbGQsIGluc3RhbGwsIHVwZ3JhZGUsIGFuZCB1bmluc3RhbGwgUHl0aG9uIHBhY2thZ2VzCkhvbWUtcGFnZTogaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scwpBdXRob3I6IFB5dGhvbiBQYWNrYWdpbmcgQXV0aG9yaXR5CkF1dGhvci1lbWFpbDogZGlzdHV0aWxzLXNpZ0BweXRob24ub3JnCkxpY2Vuc2U6IFVOS05PV04KRGVzY3JpcHRpb24tQ29udGVudC1UeXBlOiB0ZXh0L3gtcnN0OyBjaGFyc2V0PVVURi04CktleXdvcmRzOiBDUEFOIFB5UEkgZGlzdHV0aWxzIGVnZ3MgcGFja2FnZSBtYW5hZ2VtZW50ClBsYXRmb3JtOiBVTktOT1dOCkNsYXNzaWZpZXI6IERldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUKQ2xhc3NpZmllcjogSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycwpDbGFzc2lmaWVyOiBMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCA6OiBNSVQgTGljZW5zZQpDbGFzc2lmaWVyOiBPcGVyYXRpbmcgU3lzdGVtIDo6IE9TIEluZGVwZW5kZW50CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjcKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuMwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy40CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjUKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNgpDbGFzc2lmaWVyOiBUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBMaWJyYXJpZXMgOjogUHl0aG9uIE1vZHVsZXMKQ2xhc3NpZmllcjogVG9waWMgOjogU3lzdGVtIDo6IEFyY2hpdmluZyA6OiBQYWNrYWdpbmcKQ2xhc3NpZmllcjogVG9waWMgOjogU3lzdGVtIDo6IFN5c3RlbXMgQWRtaW5pc3RyYXRpb24KQ2xhc3NpZmllcjogVG9waWMgOjogVXRpbGl0aWVzClJlcXVpcmVzLVB5dGhvbjogPj0yLjcsIT0zLjAuKiwhPTMuMS4qLCE9My4yLioKUHJvdmlkZXMtRXh0cmE6IGNlcnRzClJlcXVpcmVzLURpc3Q6IGNlcnRpZmkgKD09MjAxNi45LjI2KTsgZXh0cmEgPT0gJ2NlcnRzJwpQcm92aWRlcy1FeHRyYTogc3NsClJlcXVpcmVzLURpc3Q6IHdpbmNlcnRzdG9yZSAoPT0wLjIpOyBzeXNfcGxhdGZvcm09PSd3aW4zMicgYW5kIGV4dHJhID09ICdzc2wnCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vcHlwaS92L3NldHVwdG9vbHMuc3ZnCiAgIDp0YXJnZXQ6IGh0dHBzOi8vcHlwaS5vcmcvcHJvamVjdC9zZXR1cHRvb2xzCgouLiBpbWFnZTo6IGh0dHBzOi8vcmVhZHRoZWRvY3Mub3JnL3Byb2plY3RzL3NldHVwdG9vbHMvYmFkZ2UvP3ZlcnNpb249bGF0ZXN0CiAgICA6dGFyZ2V0OiBodHRwczovL3NldHVwdG9vbHMucmVhZHRoZWRvY3MuaW8KCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby90cmF2aXMvcHlwYS9zZXR1cHRvb2xzL21hc3Rlci5zdmc/bGFiZWw9TGludXglMjBidWlsZCUyMCU0MCUyMFRyYXZpcyUyMENJCiAgIDp0YXJnZXQ6IGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9weXBhL3NldHVwdG9vbHMKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9hcHB2ZXlvci9jaS9qYXJhY28vc2V0dXB0b29scy9tYXN0ZXIuc3ZnP2xhYmVsPVdpbmRvd3MlMjBidWlsZCUyMCU0MCUyMEFwcHZleW9yCiAgIDp0YXJnZXQ6IGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvamFyYWNvL3NldHVwdG9vbHMvYnJhbmNoL21hc3RlcgoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3B5cGkvcHl2ZXJzaW9ucy9zZXR1cHRvb2xzLnN2ZwoKU2VlIHRoZSBgSW5zdGFsbGF0aW9uIEluc3RydWN0aW9ucwo8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9pbnN0YWxsaW5nLz5gXyBpbiB0aGUgUHl0aG9uIFBhY2thZ2luZwpVc2VyJ3MgR3VpZGUgZm9yIGluc3RydWN0aW9ucyBvbiBpbnN0YWxsaW5nLCB1cGdyYWRpbmcsIGFuZCB1bmluc3RhbGxpbmcKU2V0dXB0b29scy4KClRoZSBwcm9qZWN0IGlzIGBtYWludGFpbmVkIGF0IEdpdEh1YiA8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scz5gXy4KClF1ZXN0aW9ucyBhbmQgY29tbWVudHMgc2hvdWxkIGJlIGRpcmVjdGVkIHRvIHRoZSBgZGlzdHV0aWxzLXNpZwptYWlsaW5nIGxpc3QgPGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL2Rpc3R1dGlscy1zaWcvPmBfLgpCdWcgcmVwb3J0cyBhbmQgZXNwZWNpYWxseSB0ZXN0ZWQgcGF0Y2hlcyBtYXkgYmUKc3VibWl0dGVkIGRpcmVjdGx5IHRvIHRoZSBgYnVnIHRyYWNrZXIKPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzPmBfLgoKCkNvZGUgb2YgQ29uZHVjdAotLS0tLS0tLS0tLS0tLS0KCkV2ZXJ5b25lIGludGVyYWN0aW5nIGluIHRoZSBzZXR1cHRvb2xzIHByb2plY3QncyBjb2RlYmFzZXMsIGlzc3VlIHRyYWNrZXJzLApjaGF0IHJvb21zLCBhbmQgbWFpbGluZyBsaXN0cyBpcyBleHBlY3RlZCB0byBmb2xsb3cgdGhlCmBQeVBBIENvZGUgb2YgQ29uZHVjdCA8aHR0cHM6Ly93d3cucHlwYS5pby9lbi9sYXRlc3QvY29kZS1vZi1jb25kdWN0Lz5gXy4KCgpQSwMEFAAAAAAAAAAhAFysJqeDHgAAgx4AADoAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vUkVDT1JEZWFzeV9pbnN0YWxsLnB5LHNoYTI1Nj1NREM5dnQ1QXhEc1hYNXFjS2xCejJUblc2VHB1dl9Bb2JuZmhDSjlYM1BNLDEyNg0KcGtnX3Jlc291cmNlcy9fX2luaXRfXy5weSxzaGEyNTY9NFFZMTVQOGNTX09BemJYSXl0bWJ2R2tudlg3dmRpaW9tRzRZaGJRUlpDSSwxMDU5OTENCnBrZ19yZXNvdXJjZXMvcHkzMWNvbXBhdC5weSxzaGEyNTY9LXlzVnFveExldEFuTDk0dU0wa0hrb21LUVRDMUpaTE4yWlVqcVVoTWVLRSw2MDANCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9fX2luaXRfXy5weSxzaGEyNTY9NDdERVFwajhIQlNhLV9USW1XLTVKQ2V1UWVSa201Tk1wSldaRzNoU3VGVSwwDQpwa2dfcmVzb3VyY2VzL192ZW5kb3IvYXBwZGlycy5weSxzaGEyNTY9dGdHYUwwbTRKbzJWZXVHZm9PT2lmTHY3YTdvVUVKdTJuMXZSa3FvUHctMCwyMjM3NA0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL3B5cGFyc2luZy5weSxzaGEyNTY9UGlmZUxZMy1XaEljQlZ6THR2MFU0VF9wd0R0UHJ1QmhCQ2tnNXZMcWEyOCwyMjk4NjcNCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9zaXgucHksc2hhMjU2PUE2aGRKWlZqSTN0X2dlZWJaOUJ6VXZ3UnJJWG8wbGZ3elFsTTJMY0t5YXMsMzAwOTgNCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX19hYm91dF9fLnB5LHNoYTI1Nj16a2NDUFROXzZUY0xXME5ybGcwMTc2LVIxUVFfV1ZQVG04c3oxUjQtSGpNLDcyMA0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fX2luaXRfXy5weSxzaGEyNTY9X3ZOYWM1VHJ6d3NyemJPRkliRi01Y0hxY19ZMmFQVDJEN3pySVIwNkJPbyw1MTMNCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weSxzaGEyNTY9VmlfQTByQVFlSGJVLWE5WDB0dDF5UW05UnFrZ1FiRFN4elJ3OFdsVTlrQSw4NjANCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX3N0cnVjdHVyZXMucHksc2hhMjU2PVJJbUVDSjRjX3dUbGFUWVl3WllMSEVpZWJETWFBSm1LMW9QQVJodzFUNW8sMTQxNg0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5LHNoYTI1Nj11RWNCQnRHdnpxbHRnbkFycWI5YzRScmNJblhlekRMb3MxNHpiQkhoV0pvLDgyNDgNCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvcmVxdWlyZW1lbnRzLnB5LHNoYTI1Nj1TaWtMMlV5bmJzVDBxdFk5bHRxbmduZGhhX3NmbzB3NlhHRmhBaG9Tb2FRLDQzNTUNCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvc3BlY2lmaWVycy5weSxzaGEyNTY9U0FNUmVyek8zZksySWtGWkNhWmt1d1phTF9FR3FITk96NHBuaTR2aG5OMCwyODAyNQ0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy91dGlscy5weSxzaGEyNTY9M202V3ZQbTZOTnhFOHJrVEdtbjByNzVCX0daU0dnN2lrYWZ4SHNCTjFXQSw0MjENCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvdmVyc2lvbi5weSxzaGEyNTY9T3dHbnhZZnIyZ2hOell4NTlxV0lCa3JLM1NuQjZuLVpmZDFYYUxwbm5NMCwxMTU1Ng0KcGtnX3Jlc291cmNlcy9leHRlcm4vX19pbml0X18ucHksc2hhMjU2PUpVdGxISHZseEhTTnVCNHBXcU5qY3g3bjZrRy1md1hnN3FtSjJ6TkpsSVksMjQ4Nw0Kc2V0dXB0b29scy9fX2luaXRfXy5weSxzaGEyNTY9V1dJZENiRkpuWjlmWm9hV0ROX3gxdkRBX1JrbS1TYzE1aUt2UHRJWUtGcyw1NzAwDQpzZXR1cHRvb2xzL2FyY2hpdmVfdXRpbC5weSxzaGEyNTY9a3c4SWJfbEtqQ2NuUEtOYlM3aDhIenRSVkswZDVSYWNVM3JfS1JkVm5tTSw2NTkyDQpzZXR1cHRvb2xzL2J1aWxkX21ldGEucHksc2hhMjU2PUZsbGFLVHIxdlNKeWlVZVJqVkpFWm1lRWFSemhZdWVObGltdGN3YUpiYTgsNTY3MQ0Kc2V0dXB0b29scy9jbGktMzIuZXhlLHNoYTI1Nj1kZkV1b3ZNTm5BMkhMYTNqUmZNUFZpNXRrNFI3YWxDYnBUdnV4dEN5dzBZLDY1NTM2DQpzZXR1cHRvb2xzL2NsaS02NC5leGUsc2hhMjU2PUtMQUJ1NXB5cm5va0pDdjZza2pYWjZHc1hleVlIR2NxT1VUM29ISTNYcG8sNzQ3NTINCnNldHVwdG9vbHMvY2xpLmV4ZSxzaGEyNTY9ZGZFdW92TU5uQTJITGEzalJmTVBWaTV0azRSN2FsQ2JwVHZ1eHRDeXcwWSw2NTUzNg0Kc2V0dXB0b29scy9jb25maWcucHksc2hhMjU2PVpUQ2dBQzE4bTR4WHh1ZmxsZkd4aS1YSHZGZzZnal9qR3Bpc1JqcDBLQ3csMTYzMDUNCnNldHVwdG9vbHMvZGVwX3V0aWwucHksc2hhMjU2PWZnaXh2QzFSN3NIM3IxM2t0eWY3TjBGQUxvcUVYTDFjQmFybU5wU0VvV2csOTM1DQpzZXR1cHRvb2xzL2RlcGVuZHMucHksc2hhMjU2PWhDOFFJRGNNM1ZEcFJYdlJWQTZPZkw5QWFRZnh2aHhIY05fdzZzQXlOcTgsNTgzNw0Kc2V0dXB0b29scy9kaXN0LnB5LHNoYTI1Nj1seDVFcnJuN25hbF9fd3VILTlZSXBHRkZaR05ZbnNoY0VNRFp0SEJQcHJrLDQwMzM2DQpzZXR1cHRvb2xzL2V4dGVuc2lvbi5weSxzaGEyNTY9dWM2bkhJLU14d21OQ05QYlVpQm55YlN5cWhwSnFqYmh2T1EtZW1kdnRfRSwxNzI5DQpzZXR1cHRvb2xzL2dsaWJjLnB5LHNoYTI1Nj1YNjRWdkdQTDJBYlVSS3dZUnNXSk9YWEdBWU9pRl92MnFpeGVUa0FVTHVVLDMxNDYNCnNldHVwdG9vbHMvZ2xvYi5weSxzaGEyNTY9WS1mcHY4d2RIWnp2OURQQ2FHQUNwTVNCV0o2YW1xXzFlMFJfaThfZWw0dyw1MjA3DQpzZXR1cHRvb2xzL2d1aS0zMi5leGUsc2hhMjU2PVhCcjBiSE1BNkhwejJzOXM5QnpqbC1Qd1hmYTluSDRpZTByRm40VjJrV0EsNjU1MzYNCnNldHVwdG9vbHMvZ3VpLTY0LmV4ZSxzaGEyNTY9YVlLTWhYMUlKTG40VUxIZ1dYMHNFMHlSRVV0NkIzVEVIZl9qT3c2eU55RSw3NTI2NA0Kc2V0dXB0b29scy9ndWkuZXhlLHNoYTI1Nj1YQnIwYkhNQTZIcHoyczlzOUJ6amwtUHdYZmE5bkg0aWUwckZuNFYya1dBLDY1NTM2DQpzZXR1cHRvb2xzL2xhdW5jaC5weSxzaGEyNTY9c2Q3ZWp3aEJvY0NEeF93RzlySXMwT2FaOEh0bW1GVThaQzZJUl9TMEx2Zyw3ODcNCnNldHVwdG9vbHMvbGliMnRvM19leC5weSxzaGEyNTY9dDVlMTJoYlIycGk5VjRleldEVEI0Sk0tQUlTVW5HT2ttY25ZSGVrM3hqZywyMDEzDQpzZXR1cHRvb2xzL21vbmtleS5weSxzaGEyNTY9elpHVEg3cDB4ZVhRS0xtRXdKVFBJRTRtNW03ZkplSG9Bc3h5djVNOGVfRSw1Nzg5DQpzZXR1cHRvb2xzL21zdmMucHksc2hhMjU2PUFFYldOTEowcFR1SEpTa1F1QlpFVDZ3cl9kMi15R0dQa2RIQ01kSUtXQjQsNDA4ODQNCnNldHVwdG9vbHMvbmFtZXNwYWNlcy5weSxzaGEyNTY9RjBOcmJ2OEtDVDJPck83cndhMDNvbTRONEdaS0FsbmNlLXJyLWNnRFFhOCwzMTk5DQpzZXR1cHRvb2xzL3BhY2thZ2VfaW5kZXgucHksc2hhMjU2PUI3ZzdOcENZa19iRWpqZXFCbTNOYnFCa2JKaGgtbW5yZXMzbDFWMmhkbHcsNDA1MDcNCnNldHVwdG9vbHMvcGVwNDI1dGFncy5weSxzaGEyNTY9TnVHTXgxZ0dpZjd4NmlZZW1oMExmZ0JyX0ZaRjVHRk9SSWJnbU1kVThKNCwxMDg4Mg0Kc2V0dXB0b29scy9weTI3Y29tcGF0LnB5LHNoYTI1Nj0zbXd4Uk1EazVRNU8xclNYT0VSYlFEWGhGcXdESmhoVWl0Zk1XX3FwVUNvLDUzNg0Kc2V0dXB0b29scy9weTMxY29tcGF0LnB5LHNoYTI1Nj1YdVUxSENzR0VfM3pHdkJSSWhZdzJpQi1JaENGSzQtUHh3X2pNaXFkTlZrLDExOTINCnNldHVwdG9vbHMvcHkzM2NvbXBhdC5weSxzaGEyNTY9VzhfSkZacjhXUWJKVF83LUpGV2pjXzZsSEd0b01LLTRwQ3JISXdrNUpOMCw5OTgNCnNldHVwdG9vbHMvcHkzNmNvbXBhdC5weSxzaGEyNTY9VlVEV3htdTVydDRRSGxHVFJ0QUZ1Nlc1anZmTDZXQmplREF6ZW9CeTBPTSwyODkxDQpzZXR1cHRvb2xzL3NhbmRib3gucHksc2hhMjU2PTlVYndmRUw1UVk0MzZvTUkxTHRGV29oaG9aLVV6d0h2R3laalVIX3Foa3csMTQyNzYNCnNldHVwdG9vbHMvc2NyaXB0IChkZXYpLnRtcGwsc2hhMjU2PWY3TVIxN2RUa3phcWtDTVNWc2V5T0NNVnJQVlNNZG1UUXNhQjhjWnpmdUksMjAxDQpzZXR1cHRvb2xzL3NjcmlwdC50bXBsLHNoYTI1Nj1XR1R0NXBpZXpPMjdjLURieDZsNVE0VDNGZjIwQTV6Nzg3Mmh2M2FBaFlZLDEzOA0Kc2V0dXB0b29scy9zaXRlLXBhdGNoLnB5LHNoYTI1Nj1CVnQ2eUlyRE1YSm9mbEE1SjZESkljc0pVZldfWEVlVmhPemVsVFRGRFA0LDIzMDcNCnNldHVwdG9vbHMvc3NsX3N1cHBvcnQucHksc2hhMjU2PVlCREpzQ1pqU3A2MkNXanhtU2trZTlrbjlyaEhIajI1Q3VzNnpoSlJXM2MsODQ5Mg0Kc2V0dXB0b29scy91bmljb2RlX3V0aWxzLnB5LHNoYTI1Nj1OT2laXzVoRDcyQTZ3LTR3Vmo4YXdIRk0zbjUxS213MUljX3Z4MTVYRnF3LDk5Ng0Kc2V0dXB0b29scy92ZXJzaW9uLnB5LHNoYTI1Nj1vZ19jdVpRYjBRSTZ1a0taRmZaV1BscjFIZ0pCUFBuMnZPMm1fYkk5WlRFLDE0NA0Kc2V0dXB0b29scy93aGVlbC5weSxzaGEyNTY9NnFZOFR0T19ZSnMyY2o5SnRmaUdRZGx2TllVMlRYRFpOay0yS3ZlQkpiYyw3MjMzDQpzZXR1cHRvb2xzL3dpbmRvd3Nfc3VwcG9ydC5weSxzaGEyNTY9NUdyZnFTUDItZExHSm9aVHEyZzZkQ0treVF4eGEybjVJUWlYbEpDb1lFRSw3MTQNCnNldHVwdG9vbHMvY29tbWFuZC9fX2luaXRfXy5weSxzaGEyNTY9Tld6SjBBMUJFZW5nWnBWZXFVeVdMTm0yYms0UDNGNGlMNVFVRXJIeTdrQSw1OTQNCnNldHVwdG9vbHMvY29tbWFuZC9hbGlhcy5weSxzaGEyNTY9S2pwRTBzel9TRElIdjNmcFpjSVFLLXNDa0p6LVNyQzZHbXVnNmI5TmtjOCwyNDI2DQpzZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfZWdnLnB5LHNoYTI1Nj1kaDg4VzhwTUhVSlBIbExULVhuUHZ5eURjbU1mRWJJMmpLMUUzdzFFSEtjLDE4MDExDQpzZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfcnBtLnB5LHNoYTI1Nj1CN2wwVG56Q0diLTBuTGxtNnJTMDBqV0xrb2pBU3dWbWRoVzJ3NVF6X0FrLDE1MDgNCnNldHVwdG9vbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5LHNoYTI1Nj1fNmR6M2xwQjF0WTIwMEx4S1BMTTdxZ3dUQ2NlT01nYVdGRi1qVzItcG0wLDYzNw0Kc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2NsaWIucHksc2hhMjU2PWJROWFCci01WlNPLTlmR3NHc0RMejBtbm5GdGVIVVpuZnRWTGtodkhEcTAsNDQ4NA0Kc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2V4dC5weSxzaGEyNTY9ZE84OWotSUMwZEFqU3R5MXNTWnh2aTBMU2RrUEdSX1pQWEZ1QUFGRFpqNCwxMzA0OQ0Kc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX3B5LnB5LHNoYTI1Nj15V3lZYWFTOUYzbzlKYkljem4wNjRBNWcxQzVfVWlLUkR4R2FUcVlidExFLDk1OTYNCnNldHVwdG9vbHMvY29tbWFuZC9kZXZlbG9wLnB5LHNoYTI1Nj13S2JPdzJfcVV2Y0R0aTJsWm10eGJEbVliNTR5QUFpYkV4elhJdlRvei1BLDgwNDYNCnNldHVwdG9vbHMvY29tbWFuZC9kaXN0X2luZm8ucHksc2hhMjU2PTV0NmtPZnJkZ0FMVC1QM29nc3M2UEY5ay1MZXllc3VleWN1azNkVXlabkksOTYwDQpzZXR1cHRvb2xzL2NvbW1hbmQvZWFzeV9pbnN0YWxsLnB5LHNoYTI1Nj1ZQUlzVWh6bXdfc2h2dm9EUDhFZXNEUzJ4YkZIN3RENE11WUU4WDN4NlljLDg3MTI1DQpzZXR1cHRvb2xzL2NvbW1hbmQvZWdnX2luZm8ucHksc2hhMjU2PURMUjVfWHItZ1JxeFF3SmN5VkNrVXJmVlpacmlNdVFTV29RR0ozWEw3VDgsMjQ5NDQNCnNldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsLnB5LHNoYTI1Nj1hMEVacExfQTg2NktFZGhpY1RHYnV5RF9UWWwxc3lrZnpkcnJpLXphelQ0LDQ2ODMNCnNldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5LHNoYTI1Nj1iTWdlSWVSaVh6UTREQUdQVjEzMjhrY2p3UWpIak9XVTRGbmdBV0xWNzhRLDIyMDMNCnNldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weSxzaGEyNTY9MTFteGYwQ2gxMk5zdVl3UzhQSHdYQlJ2eWg2NzFRQU00Y1RSaDdlcHpHMCwzODQwDQpzZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9zY3JpcHRzLnB5LHNoYTI1Nj1VRDByRVo2ODYxbVRZaElkemNzcUtuVWw4UG96b2NYV2w5VkJRMVZUV25jLDI0MzkNCnNldHVwdG9vbHMvY29tbWFuZC9sYXVuY2hlciBtYW5pZmVzdC54bWwsc2hhMjU2PXhsTGJqV3JCMDF0S0MwLWhsVmtPS2tpU1Biek1tbDJlT1B0Sl91Y0NuYkUsNjI4DQpzZXR1cHRvb2xzL2NvbW1hbmQvcHkzNmNvbXBhdC5weSxzaGEyNTY9U3pqWmNPeEY3emRGVVQ0N1p2Mm43QU0zSDhrb0R5c18wT3BTLW45Z0lmYyw0OTg2DQpzZXR1cHRvb2xzL2NvbW1hbmQvcmVnaXN0ZXIucHksc2hhMjU2PWJIbE1tMXFtQmJTZGFoVE9UOHc2VWhBLUVnZVFJejdwNmNELXFPYXVhaUksMjcwDQpzZXR1cHRvb2xzL2NvbW1hbmQvcm90YXRlLnB5LHNoYTI1Nj1jbzVDMUVrSTdQMEdHVDZUcXotVDJTSWoyTEJKVFpYWUVMcG1hbzZkNEtRLDIxNjQNCnNldHVwdG9vbHMvY29tbWFuZC9zYXZlb3B0cy5weSxzaGEyNTY9emE3UUNCY1FpbUtLcmlXY29DY2JoeFBqVXozMGdTQjc0enVUTDQ3eHBQNCw2NTgNCnNldHVwdG9vbHMvY29tbWFuZC9zZGlzdC5weSxzaGEyNTY9b2JEVGUyQm1XdDJQbG5GUFpaaDdlMExXdmVtRXNiQ0NPOU16aHJUWmptOCw2NzExDQpzZXR1cHRvb2xzL2NvbW1hbmQvc2V0b3B0LnB5LHNoYTI1Nj1OVFdEeXgtZ2pERi10eGY0ZE81NzdzN0xPekhWb0tSME1xMzNyRnhhUnI4LDUwODUNCnNldHVwdG9vbHMvY29tbWFuZC90ZXN0LnB5LHNoYTI1Nj1NZUJBY1hVZVBHalBLcWp6NHp2VHJIYXRMdk5zamxQRmNhZ3QzWG5GWWRrLDkyMTQNCnNldHVwdG9vbHMvY29tbWFuZC91cGxvYWQucHksc2hhMjU2PWkxZ2ZJdFozblFPbjVGS1hiOHRMQzJLZDdlS0M4bFdPNGJkRTZOcUdwRTQsMTE3Mg0Kc2V0dXB0b29scy9jb21tYW5kL3VwbG9hZF9kb2NzLnB5LHNoYTI1Nj1vWGlHcGxNX2NVS0x3RTRDV1d3OThSekN1ZkF1OHRCaE1DOTdHZWdGY21zLDczMTENCnNldHVwdG9vbHMvZXh0ZXJuL19faW5pdF9fLnB5LHNoYTI1Nj1adENMWVE4SlR0T3RtN1NZb3hla1p3LVV6WTNUUjUwU1JJVWFlcXIyUk9rLDEzMQ0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL0RFU0NSSVBUSU9OLnJzdCxzaGEyNTY9SXQzYTNHUmpUNTcwMW1xaHJwTWNMeVdfWVMyRG9rdi1YOHpXb1RhTVJlMCwxNDIyDQpzZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vTElDRU5TRS50eHQsc2hhMjU2PXd5bzZ3NVd2WXlIdjBvdm5QUWFnRHcyMnE0aDlIQ0hVX3NSaEtOSUZiVm8sMTA3OA0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL01FVEFEQVRBLHNoYTI1Nj1XTGdwYlVYMW9PNW9HZTc0d2VjUlJMLW50bE5jampPRXdVZFFrak5RTnpJLDI3OTgNCnNldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9SRUNPUkQsLA0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL1dIRUVMLHNoYTI1Nj1rZHNOLTVPSkFaSWlITi1pTzRSaGw4Mkt5UzBiRFdmNHVCd01ia05hZnI4LDExMA0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL2RlcGVuZGVuY3lfbGlua3MudHh0LHNoYTI1Nj1IbGtDRmtvSzVUYlo1RU1MYkxLWWhMY1lfRTMxa0JXRDhUcVcyRWdtYXRRLDIzOQ0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHQsc2hhMjU2PWpCcUNZRGxWamxfX3NqWUZHWG8xSlFHSU1BWUZKRS1wcllXVXRuTVpFZXcsMjk5MA0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL21ldGFkYXRhLmpzb24sc2hhMjU2PXhkMF9OZ01PLWFUSi13c002ZHQ2ZGdRV2V4SXZ2ZkN6dU8wa1JEN01aNWssNDkwMQ0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHQsc2hhMjU2PTJIVVhWVndBNFBmZjF4Z1RGcjNHc1RYWEthUGFPNnZsRzZvTkpfNHU0VGcsMzgNCnNldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby96aXAtc2FmZSxzaGEyNTY9QWJwSEdjZ0xiLWtSc0pHbndGRWt0azd1enBaT0NjQlk3NC1ZQmRyS1ZHcywxDQpQSwMEFAAAAAAAAAAhAPbd0r5uAAAAbgAAADkAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vV0hFRUxXaGVlbC1WZXJzaW9uOiAxLjAKR2VuZXJhdG9yOiBiZGlzdF93aGVlbCAoMC4zMC4wKQpSb290LUlzLVB1cmVsaWI6IHRydWUKVGFnOiBweTItbm9uZS1hbnkKVGFnOiBweTMtbm9uZS1hbnkKClBLAwQUAAAAAAAAACEAN9lf3e8AAADvAAAASAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9kZXBlbmRlbmN5X2xpbmtzLnR4dGh0dHBzOi8vZmlsZXMucHl0aG9uaG9zdGVkLm9yZy9wYWNrYWdlcy9zb3VyY2UvYy9jZXJ0aWZpL2NlcnRpZmktMjAxNi45LjI2LnRhci5neiNtZDU9YmFhODFlOTUxYTI5OTU4NTYzNjg5ZDg2OGVmMTA2NGQKaHR0cHM6Ly9maWxlcy5weXRob25ob3N0ZWQub3JnL3BhY2thZ2VzL3NvdXJjZS93L3dpbmNlcnRzdG9yZS93aW5jZXJ0c3RvcmUtMC4yLnppcCNtZDU9YWU3MjhmMmYwMDcxODU2NDhkMGM3YTg2NzliMzYxZTIKUEsDBBQAAAAAAAAAIQDRNY6OrgsAAK4LAABEAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHRbY29uc29sZV9zY3JpcHRzXQplYXN5X2luc3RhbGwgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOm1haW4KZWFzeV9pbnN0YWxsLTMuNiA9IHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6bWFpbgoKW2Rpc3R1dGlscy5jb21tYW5kc10KYWxpYXMgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYWxpYXM6YWxpYXMKYmRpc3RfZWdnID0gc2V0dXB0b29scy5jb21tYW5kLmJkaXN0X2VnZzpiZGlzdF9lZ2cKYmRpc3RfcnBtID0gc2V0dXB0b29scy5jb21tYW5kLmJkaXN0X3JwbTpiZGlzdF9ycG0KYmRpc3Rfd2luaW5zdCA9IHNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF93aW5pbnN0OmJkaXN0X3dpbmluc3QKYnVpbGRfY2xpYiA9IHNldHVwdG9vbHMuY29tbWFuZC5idWlsZF9jbGliOmJ1aWxkX2NsaWIKYnVpbGRfZXh0ID0gc2V0dXB0b29scy5jb21tYW5kLmJ1aWxkX2V4dDpidWlsZF9leHQKYnVpbGRfcHkgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYnVpbGRfcHk6YnVpbGRfcHkKZGV2ZWxvcCA9IHNldHVwdG9vbHMuY29tbWFuZC5kZXZlbG9wOmRldmVsb3AKZGlzdF9pbmZvID0gc2V0dXB0b29scy5jb21tYW5kLmRpc3RfaW5mbzpkaXN0X2luZm8KZWFzeV9pbnN0YWxsID0gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDplYXN5X2luc3RhbGwKZWdnX2luZm8gPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86ZWdnX2luZm8KaW5zdGFsbCA9IHNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsOmluc3RhbGwKaW5zdGFsbF9lZ2dfaW5mbyA9IHNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsX2VnZ19pbmZvOmluc3RhbGxfZWdnX2luZm8KaW5zdGFsbF9saWIgPSBzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbF9saWI6aW5zdGFsbF9saWIKaW5zdGFsbF9zY3JpcHRzID0gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfc2NyaXB0czppbnN0YWxsX3NjcmlwdHMKcmVnaXN0ZXIgPSBzZXR1cHRvb2xzLmNvbW1hbmQucmVnaXN0ZXI6cmVnaXN0ZXIKcm90YXRlID0gc2V0dXB0b29scy5jb21tYW5kLnJvdGF0ZTpyb3RhdGUKc2F2ZW9wdHMgPSBzZXR1cHRvb2xzLmNvbW1hbmQuc2F2ZW9wdHM6c2F2ZW9wdHMKc2Rpc3QgPSBzZXR1cHRvb2xzLmNvbW1hbmQuc2Rpc3Q6c2Rpc3QKc2V0b3B0ID0gc2V0dXB0b29scy5jb21tYW5kLnNldG9wdDpzZXRvcHQKdGVzdCA9IHNldHVwdG9vbHMuY29tbWFuZC50ZXN0OnRlc3QKdXBsb2FkID0gc2V0dXB0b29scy5jb21tYW5kLnVwbG9hZDp1cGxvYWQKdXBsb2FkX2RvY3MgPSBzZXR1cHRvb2xzLmNvbW1hbmQudXBsb2FkX2RvY3M6dXBsb2FkX2RvY3MKCltkaXN0dXRpbHMuc2V0dXBfa2V5d29yZHNdCmNvbnZlcnRfMnRvM19kb2N0ZXN0cyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QKZGVwZW5kZW5jeV9saW5rcyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QKZWFnZXJfcmVzb3VyY2VzID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdAplbnRyeV9wb2ludHMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfZW50cnlfcG9pbnRzCmV4Y2x1ZGVfcGFja2FnZV9kYXRhID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3BhY2thZ2VfZGF0YQpleHRyYXNfcmVxdWlyZSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19leHRyYXMKaW5jbHVkZV9wYWNrYWdlX2RhdGEgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X2Jvb2wKaW5zdGFsbF9yZXF1aXJlcyA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19yZXF1aXJlbWVudHMKbmFtZXNwYWNlX3BhY2thZ2VzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX25zcApwYWNrYWdlX2RhdGEgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcGFja2FnZV9kYXRhCnBhY2thZ2VzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3BhY2thZ2VzCnB5dGhvbl9yZXF1aXJlcyA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19zcGVjaWZpZXIKc2V0dXBfcmVxdWlyZXMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcmVxdWlyZW1lbnRzCnRlc3RfbG9hZGVyID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX2ltcG9ydGFibGUKdGVzdF9ydW5uZXIgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfaW1wb3J0YWJsZQp0ZXN0X3N1aXRlID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3Rlc3Rfc3VpdGUKdGVzdHNfcmVxdWlyZSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19yZXF1aXJlbWVudHMKdXNlXzJ0bzMgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X2Jvb2wKdXNlXzJ0bzNfZXhjbHVkZV9maXhlcnMgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0CnVzZV8ydG8zX2ZpeGVycyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QKemlwX3NhZmUgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X2Jvb2wKCltlZ2dfaW5mby53cml0ZXJzXQpQS0ctSU5GTyA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV9wa2dfaW5mbwpkZXBlbmRlbmN5X2xpbmtzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzpvdmVyd3JpdGVfYXJnCmRlcGVuZHMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndhcm5fZGVwZW5kc19vYnNvbGV0ZQplYWdlcl9yZXNvdXJjZXMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOm92ZXJ3cml0ZV9hcmcKZW50cnlfcG9pbnRzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV9lbnRyaWVzCm5hbWVzcGFjZV9wYWNrYWdlcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86b3ZlcndyaXRlX2FyZwpyZXF1aXJlcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfcmVxdWlyZW1lbnRzCnRvcF9sZXZlbC50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfdG9wbGV2ZWxfbmFtZXMKCltzZXR1cHRvb2xzLmluc3RhbGxhdGlvbl0KZWdnc2VjdXRhYmxlID0gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDpib290c3RyYXAKClBLAwQUAAAAAAAAACEA+9Yg9SUTAAAlEwAAQQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9tZXRhZGF0YS5qc29ueyJjbGFzc2lmaWVycyI6IFsiRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZSIsICJJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzIiwgIkxpY2Vuc2UgOjogT1NJIEFwcHJvdmVkIDo6IE1JVCBMaWNlbnNlIiwgIk9wZXJhdGluZyBTeXN0ZW0gOjogT1MgSW5kZXBlbmRlbnQiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy4zIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjQiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNSIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy42IiwgIlRvcGljIDo6IFNvZnR3YXJlIERldmVsb3BtZW50IDo6IExpYnJhcmllcyA6OiBQeXRob24gTW9kdWxlcyIsICJUb3BpYyA6OiBTeXN0ZW0gOjogQXJjaGl2aW5nIDo6IFBhY2thZ2luZyIsICJUb3BpYyA6OiBTeXN0ZW0gOjogU3lzdGVtcyBBZG1pbmlzdHJhdGlvbiIsICJUb3BpYyA6OiBVdGlsaXRpZXMiXSwgImRlc2NyaXB0aW9uX2NvbnRlbnRfdHlwZSI6ICJ0ZXh0L3gtcnN0OyBjaGFyc2V0PVVURi04IiwgImV4dGVuc2lvbnMiOiB7InB5dGhvbi5jb21tYW5kcyI6IHsid3JhcF9jb25zb2xlIjogeyJlYXN5X2luc3RhbGwiOiAic2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDptYWluIiwgImVhc3lfaW5zdGFsbC0zLjYiOiAic2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDptYWluIn19LCAicHl0aG9uLmRldGFpbHMiOiB7ImNvbnRhY3RzIjogW3siZW1haWwiOiAiZGlzdHV0aWxzLXNpZ0BweXRob24ub3JnIiwgIm5hbWUiOiAiUHl0aG9uIFBhY2thZ2luZyBBdXRob3JpdHkiLCAicm9sZSI6ICJhdXRob3IifV0sICJkb2N1bWVudF9uYW1lcyI6IHsiZGVzY3JpcHRpb24iOiAiREVTQ1JJUFRJT04ucnN0IiwgImxpY2Vuc2UiOiAiTElDRU5TRS50eHQifSwgInByb2plY3RfdXJscyI6IHsiSG9tZSI6ICJodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzIn19LCAicHl0aG9uLmV4cG9ydHMiOiB7ImNvbnNvbGVfc2NyaXB0cyI6IHsiZWFzeV9pbnN0YWxsIjogInNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6bWFpbiIsICJlYXN5X2luc3RhbGwtMy42IjogInNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6bWFpbiJ9LCAiZGlzdHV0aWxzLmNvbW1hbmRzIjogeyJhbGlhcyI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuYWxpYXM6YWxpYXMiLCAiYmRpc3RfZWdnIjogInNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF9lZ2c6YmRpc3RfZWdnIiwgImJkaXN0X3JwbSI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuYmRpc3RfcnBtOmJkaXN0X3JwbSIsICJiZGlzdF93aW5pbnN0IjogInNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF93aW5pbnN0OmJkaXN0X3dpbmluc3QiLCAiYnVpbGRfY2xpYiI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuYnVpbGRfY2xpYjpidWlsZF9jbGliIiwgImJ1aWxkX2V4dCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuYnVpbGRfZXh0OmJ1aWxkX2V4dCIsICJidWlsZF9weSI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuYnVpbGRfcHk6YnVpbGRfcHkiLCAiZGV2ZWxvcCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZGV2ZWxvcDpkZXZlbG9wIiwgImRpc3RfaW5mbyI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZGlzdF9pbmZvOmRpc3RfaW5mbyIsICJlYXN5X2luc3RhbGwiOiAic2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDplYXN5X2luc3RhbGwiLCAiZWdnX2luZm8iOiAic2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOmVnZ19pbmZvIiwgImluc3RhbGwiOiAic2V0dXB0b29scy5jb21tYW5kLmluc3RhbGw6aW5zdGFsbCIsICJpbnN0YWxsX2VnZ19pbmZvIjogInNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsX2VnZ19pbmZvOmluc3RhbGxfZWdnX2luZm8iLCAiaW5zdGFsbF9saWIiOiAic2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfbGliOmluc3RhbGxfbGliIiwgImluc3RhbGxfc2NyaXB0cyI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbF9zY3JpcHRzOmluc3RhbGxfc2NyaXB0cyIsICJyZWdpc3RlciI6ICJzZXR1cHRvb2xzLmNvbW1hbmQucmVnaXN0ZXI6cmVnaXN0ZXIiLCAicm90YXRlIjogInNldHVwdG9vbHMuY29tbWFuZC5yb3RhdGU6cm90YXRlIiwgInNhdmVvcHRzIjogInNldHVwdG9vbHMuY29tbWFuZC5zYXZlb3B0czpzYXZlb3B0cyIsICJzZGlzdCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuc2Rpc3Q6c2Rpc3QiLCAic2V0b3B0IjogInNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQ6c2V0b3B0IiwgInRlc3QiOiAic2V0dXB0b29scy5jb21tYW5kLnRlc3Q6dGVzdCIsICJ1cGxvYWQiOiAic2V0dXB0b29scy5jb21tYW5kLnVwbG9hZDp1cGxvYWQiLCAidXBsb2FkX2RvY3MiOiAic2V0dXB0b29scy5jb21tYW5kLnVwbG9hZF9kb2NzOnVwbG9hZF9kb2NzIn0sICJkaXN0dXRpbHMuc2V0dXBfa2V5d29yZHMiOiB7ImNvbnZlcnRfMnRvM19kb2N0ZXN0cyI6ICJzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0IiwgImRlcGVuZGVuY3lfbGlua3MiOiAic2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdCIsICJlYWdlcl9yZXNvdXJjZXMiOiAic2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdCIsICJlbnRyeV9wb2ludHMiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX2VudHJ5X3BvaW50cyIsICJleGNsdWRlX3BhY2thZ2VfZGF0YSI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcGFja2FnZV9kYXRhIiwgImV4dHJhc19yZXF1aXJlIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19leHRyYXMiLCAiaW5jbHVkZV9wYWNrYWdlX2RhdGEiOiAic2V0dXB0b29scy5kaXN0OmFzc2VydF9ib29sIiwgImluc3RhbGxfcmVxdWlyZXMiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX3JlcXVpcmVtZW50cyIsICJuYW1lc3BhY2VfcGFja2FnZXMiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX25zcCIsICJwYWNrYWdlX2RhdGEiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX3BhY2thZ2VfZGF0YSIsICJwYWNrYWdlcyI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcGFja2FnZXMiLCAicHl0aG9uX3JlcXVpcmVzIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19zcGVjaWZpZXIiLCAic2V0dXBfcmVxdWlyZXMiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX3JlcXVpcmVtZW50cyIsICJ0ZXN0X2xvYWRlciI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfaW1wb3J0YWJsZSIsICJ0ZXN0X3J1bm5lciI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfaW1wb3J0YWJsZSIsICJ0ZXN0X3N1aXRlIjogInNldHVwdG9vbHMuZGlzdDpjaGVja190ZXN0X3N1aXRlIiwgInRlc3RzX3JlcXVpcmUiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX3JlcXVpcmVtZW50cyIsICJ1c2VfMnRvMyI6ICJzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X2Jvb2wiLCAidXNlXzJ0bzNfZXhjbHVkZV9maXhlcnMiOiAic2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdCIsICJ1c2VfMnRvM19maXhlcnMiOiAic2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdCIsICJ6aXBfc2FmZSI6ICJzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X2Jvb2wifSwgImVnZ19pbmZvLndyaXRlcnMiOiB7IlBLRy1JTkZPIjogInNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV9wa2dfaW5mbyIsICJkZXBlbmRlbmN5X2xpbmtzLnR4dCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86b3ZlcndyaXRlX2FyZyIsICJkZXBlbmRzLnR4dCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d2Fybl9kZXBlbmRzX29ic29sZXRlIiwgImVhZ2VyX3Jlc291cmNlcy50eHQiOiAic2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOm92ZXJ3cml0ZV9hcmciLCAiZW50cnlfcG9pbnRzLnR4dCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfZW50cmllcyIsICJuYW1lc3BhY2VfcGFja2FnZXMudHh0IjogInNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzpvdmVyd3JpdGVfYXJnIiwgInJlcXVpcmVzLnR4dCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfcmVxdWlyZW1lbnRzIiwgInRvcF9sZXZlbC50eHQiOiAic2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX3RvcGxldmVsX25hbWVzIn0sICJzZXR1cHRvb2xzLmluc3RhbGxhdGlvbiI6IHsiZWdnc2VjdXRhYmxlIjogInNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6Ym9vdHN0cmFwIn19fSwgImV4dHJhcyI6IFsiY2VydHMiLCAic3NsIl0sICJnZW5lcmF0b3IiOiAiYmRpc3Rfd2hlZWwgKDAuMzAuMCkiLCAia2V5d29yZHMiOiBbIkNQQU4iLCAiUHlQSSIsICJkaXN0dXRpbHMiLCAiZWdncyIsICJwYWNrYWdlIiwgIm1hbmFnZW1lbnQiXSwgIm1ldGFkYXRhX3ZlcnNpb24iOiAiMi4wIiwgIm5hbWUiOiAic2V0dXB0b29scyIsICJyZXF1aXJlc19weXRob24iOiAiPj0yLjcsIT0zLjAuKiwhPTMuMS4qLCE9My4yLioiLCAicnVuX3JlcXVpcmVzIjogW3siZXh0cmEiOiAiY2VydHMiLCAicmVxdWlyZXMiOiBbImNlcnRpZmkgKD09MjAxNi45LjI2KSJdfSwgeyJlbnZpcm9ubWVudCI6ICJzeXNfcGxhdGZvcm09PSd3aW4zMiciLCAiZXh0cmEiOiAic3NsIiwgInJlcXVpcmVzIjogWyJ3aW5jZXJ0c3RvcmUgKD09MC4yKSJdfV0sICJzdW1tYXJ5IjogIkVhc2lseSBkb3dubG9hZCwgYnVpbGQsIGluc3RhbGwsIHVwZ3JhZGUsIGFuZCB1bmluc3RhbGwgUHl0aG9uIHBhY2thZ2VzIiwgInZlcnNpb24iOiAiMzguMi40In1QSwMEFAAAAAAAAAAhADBcAZEmAAAAJgAAAEEAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vdG9wX2xldmVsLnR4dGVhc3lfaW5zdGFsbApwa2dfcmVzb3VyY2VzCnNldHVwdG9vbHMKUEsDBBQAAAAAAAAAIQCTBtcyAQAAAAEAAAA8AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL3ppcC1zYWZlClBLAwQUAAAAAAAAACEAIwtKA0QWAABEFgAALgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvX19pbml0X18ucHkiIiJFeHRlbnNpb25zIHRvIHRoZSAnZGlzdHV0aWxzJyBmb3IgbGFyZ2Ugb3IgY29tcGxleCBkaXN0cmlidXRpb25zIiIiCgppbXBvcnQgb3MKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgZGlzdHV0aWxzLmNvcmUKaW1wb3J0IGRpc3R1dGlscy5maWxlbGlzdApmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKZnJvbSBmbm1hdGNoIGltcG9ydCBmbm1hdGNoY2FzZQoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IGZpbHRlciwgbWFwCgppbXBvcnQgc2V0dXB0b29scy52ZXJzaW9uCmZyb20gc2V0dXB0b29scy5leHRlbnNpb24gaW1wb3J0IEV4dGVuc2lvbgpmcm9tIHNldHVwdG9vbHMuZGlzdCBpbXBvcnQgRGlzdHJpYnV0aW9uLCBGZWF0dXJlCmZyb20gc2V0dXB0b29scy5kZXBlbmRzIGltcG9ydCBSZXF1aXJlCmZyb20gLiBpbXBvcnQgbW9ua2V5CgpfX2FsbF9fID0gWwogICAgJ3NldHVwJywgJ0Rpc3RyaWJ1dGlvbicsICdGZWF0dXJlJywgJ0NvbW1hbmQnLCAnRXh0ZW5zaW9uJywgJ1JlcXVpcmUnLAogICAgJ2ZpbmRfcGFja2FnZXMnLApdCgpfX3ZlcnNpb25fXyA9IHNldHVwdG9vbHMudmVyc2lvbi5fX3ZlcnNpb25fXwoKYm9vdHN0cmFwX2luc3RhbGxfZnJvbSA9IE5vbmUKCiMgSWYgd2UgcnVuIDJ0bzMgb24gLnB5IGZpbGVzLCBzaG91bGQgd2UgYWxzbyBjb252ZXJ0IGRvY3N0cmluZ3M/CiMgRGVmYXVsdDogeWVzOyBhc3N1bWUgdGhhdCB3ZSBjYW4gZGV0ZWN0IGRvY3Rlc3RzIHJlbGlhYmx5CnJ1bl8ydG8zX29uX2RvY3Rlc3RzID0gVHJ1ZQojIFN0YW5kYXJkIHBhY2thZ2UgbmFtZXMgZm9yIGZpeGVyIHBhY2thZ2VzCmxpYjJ0bzNfZml4ZXJfcGFja2FnZXMgPSBbJ2xpYjJ0bzMuZml4ZXMnXQoKCmNsYXNzIFBhY2thZ2VGaW5kZXIob2JqZWN0KToKICAgICIiIgogICAgR2VuZXJhdGUgYSBsaXN0IG9mIGFsbCBQeXRob24gcGFja2FnZXMgZm91bmQgd2l0aGluIGEgZGlyZWN0b3J5CiAgICAiIiIKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmaW5kKGNscywgd2hlcmU9Jy4nLCBleGNsdWRlPSgpLCBpbmNsdWRlPSgnKicsKSk6CiAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBhbGwgUHl0aG9uIHBhY2thZ2VzIGZvdW5kIHdpdGhpbiBkaXJlY3RvcnkgJ3doZXJlJwoKICAgICAgICAnd2hlcmUnIGlzIHRoZSByb290IGRpcmVjdG9yeSB3aGljaCB3aWxsIGJlIHNlYXJjaGVkIGZvciBwYWNrYWdlcy4gIEl0CiAgICAgICAgc2hvdWxkIGJlIHN1cHBsaWVkIGFzIGEgImNyb3NzLXBsYXRmb3JtIiAoaS5lLiBVUkwtc3R5bGUpIHBhdGg7IGl0IHdpbGwKICAgICAgICBiZSBjb252ZXJ0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGxvY2FsIHBhdGggc3ludGF4LgoKICAgICAgICAnZXhjbHVkZScgaXMgYSBzZXF1ZW5jZSBvZiBwYWNrYWdlIG5hbWVzIHRvIGV4Y2x1ZGU7ICcqJyBjYW4gYmUgdXNlZAogICAgICAgIGFzIGEgd2lsZGNhcmQgaW4gdGhlIG5hbWVzLCBzdWNoIHRoYXQgJ2Zvby4qJyB3aWxsIGV4Y2x1ZGUgYWxsCiAgICAgICAgc3VicGFja2FnZXMgb2YgJ2ZvbycgKGJ1dCBub3QgJ2ZvbycgaXRzZWxmKS4KCiAgICAgICAgJ2luY2x1ZGUnIGlzIGEgc2VxdWVuY2Ugb2YgcGFja2FnZSBuYW1lcyB0byBpbmNsdWRlLiAgSWYgaXQncwogICAgICAgIHNwZWNpZmllZCwgb25seSB0aGUgbmFtZWQgcGFja2FnZXMgd2lsbCBiZSBpbmNsdWRlZC4gIElmIGl0J3Mgbm90CiAgICAgICAgc3BlY2lmaWVkLCBhbGwgZm91bmQgcGFja2FnZXMgd2lsbCBiZSBpbmNsdWRlZC4gICdpbmNsdWRlJyBjYW4gY29udGFpbgogICAgICAgIHNoZWxsIHN0eWxlIHdpbGRjYXJkIHBhdHRlcm5zIGp1c3QgbGlrZSAnZXhjbHVkZScuCiAgICAgICAgIiIiCgogICAgICAgIHJldHVybiBsaXN0KGNscy5fZmluZF9wYWNrYWdlc19pdGVyKAogICAgICAgICAgICBjb252ZXJ0X3BhdGgod2hlcmUpLAogICAgICAgICAgICBjbHMuX2J1aWxkX2ZpbHRlcignZXpfc2V0dXAnLCAnKl9fcHljYWNoZV9fJywgKmV4Y2x1ZGUpLAogICAgICAgICAgICBjbHMuX2J1aWxkX2ZpbHRlcigqaW5jbHVkZSkpKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9maW5kX3BhY2thZ2VzX2l0ZXIoY2xzLCB3aGVyZSwgZXhjbHVkZSwgaW5jbHVkZSk6CiAgICAgICAgIiIiCiAgICAgICAgQWxsIHRoZSBwYWNrYWdlcyBmb3VuZCBpbiAnd2hlcmUnIHRoYXQgcGFzcyB0aGUgJ2luY2x1ZGUnIGZpbHRlciwgYnV0CiAgICAgICAgbm90IHRoZSAnZXhjbHVkZScgZmlsdGVyLgogICAgICAgICIiIgogICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHdoZXJlLCBmb2xsb3dsaW5rcz1UcnVlKToKICAgICAgICAgICAgIyBDb3B5IGRpcnMgdG8gaXRlcmF0ZSBvdmVyIGl0LCB0aGVuIGVtcHR5IGRpcnMuCiAgICAgICAgICAgIGFsbF9kaXJzID0gZGlyc1s6XQogICAgICAgICAgICBkaXJzWzpdID0gW10KCiAgICAgICAgICAgIGZvciBkaXIgaW4gYWxsX2RpcnM6CiAgICAgICAgICAgICAgICBmdWxsX3BhdGggPSBvcy5wYXRoLmpvaW4ocm9vdCwgZGlyKQogICAgICAgICAgICAgICAgcmVsX3BhdGggPSBvcy5wYXRoLnJlbHBhdGgoZnVsbF9wYXRoLCB3aGVyZSkKICAgICAgICAgICAgICAgIHBhY2thZ2UgPSByZWxfcGF0aC5yZXBsYWNlKG9zLnBhdGguc2VwLCAnLicpCgogICAgICAgICAgICAgICAgIyBTa2lwIGRpcmVjdG9yeSB0cmVlcyB0aGF0IGFyZSBub3QgdmFsaWQgcGFja2FnZXMKICAgICAgICAgICAgICAgIGlmICgnLicgaW4gZGlyIG9yIG5vdCBjbHMuX2xvb2tzX2xpa2VfcGFja2FnZShmdWxsX3BhdGgpKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgICMgU2hvdWxkIHRoaXMgcGFja2FnZSBiZSBpbmNsdWRlZD8KICAgICAgICAgICAgICAgIGlmIGluY2x1ZGUocGFja2FnZSkgYW5kIG5vdCBleGNsdWRlKHBhY2thZ2UpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHBhY2thZ2UKCiAgICAgICAgICAgICAgICAjIEtlZXAgc2VhcmNoaW5nIHN1YmRpcmVjdG9yaWVzLCBhcyB0aGVyZSBtYXkgYmUgbW9yZSBwYWNrYWdlcwogICAgICAgICAgICAgICAgIyBkb3duIHRoZXJlLCBldmVuIGlmIHRoZSBwYXJlbnQgd2FzIGV4Y2x1ZGVkLgogICAgICAgICAgICAgICAgZGlycy5hcHBlbmQoZGlyKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfbG9va3NfbGlrZV9wYWNrYWdlKHBhdGgpOgogICAgICAgICIiIkRvZXMgYSBkaXJlY3RvcnkgbG9vayBsaWtlIGEgcGFja2FnZT8iIiIKICAgICAgICByZXR1cm4gb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKHBhdGgsICdfX2luaXRfXy5weScpKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfYnVpbGRfZmlsdGVyKCpwYXR0ZXJucyk6CiAgICAgICAgIiIiCiAgICAgICAgR2l2ZW4gYSBsaXN0IG9mIHBhdHRlcm5zLCByZXR1cm4gYSBjYWxsYWJsZSB0aGF0IHdpbGwgYmUgdHJ1ZSBvbmx5IGlmCiAgICAgICAgdGhlIGlucHV0IG1hdGNoZXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBwYXR0ZXJucy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gbGFtYmRhIG5hbWU6IGFueShmbm1hdGNoY2FzZShuYW1lLCBwYXQ9cGF0KSBmb3IgcGF0IGluIHBhdHRlcm5zKQoKCmNsYXNzIFBFUDQyMFBhY2thZ2VGaW5kZXIoUGFja2FnZUZpbmRlcik6CiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2xvb2tzX2xpa2VfcGFja2FnZShwYXRoKToKICAgICAgICByZXR1cm4gVHJ1ZQoKCmZpbmRfcGFja2FnZXMgPSBQYWNrYWdlRmluZGVyLmZpbmQKCgpkZWYgX2luc3RhbGxfc2V0dXBfcmVxdWlyZXMoYXR0cnMpOgogICAgIyBOb3RlOiBkbyBub3QgdXNlIGBzZXR1cHRvb2xzLkRpc3RyaWJ1dGlvbmAgZGlyZWN0bHksIGFzCiAgICAjIG91ciBQRVAgNTE3IGJhY2tlbmQgcGF0Y2ggYGRpc3R1dGlscy5jb3JlLkRpc3RyaWJ1dGlvbmAuCiAgICBkaXN0ID0gZGlzdHV0aWxzLmNvcmUuRGlzdHJpYnV0aW9uKGRpY3QoCiAgICAgICAgKGssIHYpIGZvciBrLCB2IGluIGF0dHJzLml0ZW1zKCkKICAgICAgICBpZiBrIGluICgnZGVwZW5kZW5jeV9saW5rcycsICdzZXR1cF9yZXF1aXJlcycpCiAgICApKQogICAgIyBIb25vciBzZXR1cC5jZmcncyBvcHRpb25zLgogICAgZGlzdC5wYXJzZV9jb25maWdfZmlsZXMoaWdub3JlX29wdGlvbl9lcnJvcnM9VHJ1ZSkKICAgIGlmIGRpc3Quc2V0dXBfcmVxdWlyZXM6CiAgICAgICAgZGlzdC5mZXRjaF9idWlsZF9lZ2dzKGRpc3Quc2V0dXBfcmVxdWlyZXMpCgoKZGVmIHNldHVwKCoqYXR0cnMpOgogICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhbnkgcmVxdWlyZW1lbnRzIG5lZWRlZCB0byBpbnRlcnByZXQgJ2F0dHJzJy4KICAgIF9pbnN0YWxsX3NldHVwX3JlcXVpcmVzKGF0dHJzKQogICAgcmV0dXJuIGRpc3R1dGlscy5jb3JlLnNldHVwKCoqYXR0cnMpCgpzZXR1cC5fX2RvY19fID0gZGlzdHV0aWxzLmNvcmUuc2V0dXAuX19kb2NfXwoKCl9Db21tYW5kID0gbW9ua2V5LmdldF91bnBhdGNoZWQoZGlzdHV0aWxzLmNvcmUuQ29tbWFuZCkKCgpjbGFzcyBDb21tYW5kKF9Db21tYW5kKToKICAgIF9fZG9jX18gPSBfQ29tbWFuZC5fX2RvY19fCgogICAgY29tbWFuZF9jb25zdW1lc19hcmd1bWVudHMgPSBGYWxzZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXN0LCAqKmt3KToKICAgICAgICAiIiIKICAgICAgICBDb25zdHJ1Y3QgdGhlIGNvbW1hbmQgZm9yIGRpc3QsIHVwZGF0aW5nCiAgICAgICAgdmFycyhzZWxmKSB3aXRoIGFueSBrZXl3b3JkIHBhcmFtZXRlcnMuCiAgICAgICAgIiIiCiAgICAgICAgX0NvbW1hbmQuX19pbml0X18oc2VsZiwgZGlzdCkKICAgICAgICB2YXJzKHNlbGYpLnVwZGF0ZShrdykKCiAgICBkZWYgcmVpbml0aWFsaXplX2NvbW1hbmQoc2VsZiwgY29tbWFuZCwgcmVpbml0X3N1YmNvbW1hbmRzPTAsICoqa3cpOgogICAgICAgIGNtZCA9IF9Db21tYW5kLnJlaW5pdGlhbGl6ZV9jb21tYW5kKHNlbGYsIGNvbW1hbmQsIHJlaW5pdF9zdWJjb21tYW5kcykKICAgICAgICB2YXJzKGNtZCkudXBkYXRlKGt3KQogICAgICAgIHJldHVybiBjbWQKCgpkZWYgX2ZpbmRfYWxsX3NpbXBsZShwYXRoKToKICAgICIiIgogICAgRmluZCBhbGwgZmlsZXMgdW5kZXIgJ3BhdGgnCiAgICAiIiIKICAgIHJlc3VsdHMgPSAoCiAgICAgICAgb3MucGF0aC5qb2luKGJhc2UsIGZpbGUpCiAgICAgICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aCwgZm9sbG93bGlua3M9VHJ1ZSkKICAgICAgICBmb3IgZmlsZSBpbiBmaWxlcwogICAgKQogICAgcmV0dXJuIGZpbHRlcihvcy5wYXRoLmlzZmlsZSwgcmVzdWx0cykKCgpkZWYgZmluZGFsbChkaXI9b3MuY3VyZGlyKToKICAgICIiIgogICAgRmluZCBhbGwgZmlsZXMgdW5kZXIgJ2RpcicgYW5kIHJldHVybiB0aGUgbGlzdCBvZiBmdWxsIGZpbGVuYW1lcy4KICAgIFVubGVzcyBkaXIgaXMgJy4nLCByZXR1cm4gZnVsbCBmaWxlbmFtZXMgd2l0aCBkaXIgcHJlcGVuZGVkLgogICAgIiIiCiAgICBmaWxlcyA9IF9maW5kX2FsbF9zaW1wbGUoZGlyKQogICAgaWYgZGlyID09IG9zLmN1cmRpcjoKICAgICAgICBtYWtlX3JlbCA9IGZ1bmN0b29scy5wYXJ0aWFsKG9zLnBhdGgucmVscGF0aCwgc3RhcnQ9ZGlyKQogICAgICAgIGZpbGVzID0gbWFwKG1ha2VfcmVsLCBmaWxlcykKICAgIHJldHVybiBsaXN0KGZpbGVzKQoKCm1vbmtleS5wYXRjaF9hbGwoKQpQSwMEFAAAAAAAAAAhAKWHZVHAGQAAwBkAADIAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2FyY2hpdmVfdXRpbC5weSIiIlV0aWxpdGllcyBmb3IgZXh0cmFjdGluZyBjb21tb24gYXJjaGl2ZSBmb3JtYXRzIiIiCgppbXBvcnQgemlwZmlsZQppbXBvcnQgdGFyZmlsZQppbXBvcnQgb3MKaW1wb3J0IHNodXRpbAppbXBvcnQgcG9zaXhwYXRoCmltcG9ydCBjb250ZXh0bGliCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgZW5zdXJlX2RpcmVjdG9yeQoKX19hbGxfXyA9IFsKICAgICJ1bnBhY2tfYXJjaGl2ZSIsICJ1bnBhY2tfemlwZmlsZSIsICJ1bnBhY2tfdGFyZmlsZSIsICJkZWZhdWx0X2ZpbHRlciIsCiAgICAiVW5yZWNvZ25pemVkRm9ybWF0IiwgImV4dHJhY3Rpb25fZHJpdmVycyIsICJ1bnBhY2tfZGlyZWN0b3J5IiwKXQoKCmNsYXNzIFVucmVjb2duaXplZEZvcm1hdChEaXN0dXRpbHNFcnJvcik6CiAgICAiIiJDb3VsZG4ndCByZWNvZ25pemUgdGhlIGFyY2hpdmUgdHlwZSIiIgoKCmRlZiBkZWZhdWx0X2ZpbHRlcihzcmMsIGRzdCk6CiAgICAiIiJUaGUgZGVmYXVsdCBwcm9ncmVzcy9maWx0ZXIgY2FsbGJhY2s7IHJldHVybnMgVHJ1ZSBmb3IgYWxsIGZpbGVzIiIiCiAgICByZXR1cm4gZHN0CgoKZGVmIHVucGFja19hcmNoaXZlKGZpbGVuYW1lLCBleHRyYWN0X2RpciwgcHJvZ3Jlc3NfZmlsdGVyPWRlZmF1bHRfZmlsdGVyLAogICAgICAgIGRyaXZlcnM9Tm9uZSk6CiAgICAiIiJVbnBhY2sgYGZpbGVuYW1lYCB0byBgZXh0cmFjdF9kaXJgLCBvciByYWlzZSBgYFVucmVjb2duaXplZEZvcm1hdGBgCgogICAgYHByb2dyZXNzX2ZpbHRlcmAgaXMgYSBmdW5jdGlvbiB0YWtpbmcgdHdvIGFyZ3VtZW50czogYSBzb3VyY2UgcGF0aAogICAgaW50ZXJuYWwgdG8gdGhlIGFyY2hpdmUgKCcvJy1zZXBhcmF0ZWQpLCBhbmQgYSBmaWxlc3lzdGVtIHBhdGggd2hlcmUgaXQKICAgIHdpbGwgYmUgZXh0cmFjdGVkLiAgVGhlIGNhbGxiYWNrIG11c3QgcmV0dXJuIHRoZSBkZXNpcmVkIGV4dHJhY3QgcGF0aAogICAgKHdoaWNoIG1heSBiZSB0aGUgc2FtZSBhcyB0aGUgb25lIHBhc3NlZCBpbiksIG9yIGVsc2UgYGBOb25lYGAgdG8gc2tpcAogICAgdGhhdCBmaWxlIG9yIGRpcmVjdG9yeS4gIFRoZSBjYWxsYmFjayBjYW4gdGh1cyBiZSB1c2VkIHRvIHJlcG9ydCBvbiB0aGUKICAgIHByb2dyZXNzIG9mIHRoZSBleHRyYWN0aW9uLCBhcyB3ZWxsIGFzIHRvIGZpbHRlciB0aGUgaXRlbXMgZXh0cmFjdGVkIG9yCiAgICBhbHRlciB0aGVpciBleHRyYWN0aW9uIHBhdGhzLgoKICAgIGBkcml2ZXJzYCwgaWYgc3VwcGxpZWQsIG11c3QgYmUgYSBub24tZW1wdHkgc2VxdWVuY2Ugb2YgZnVuY3Rpb25zIHdpdGggdGhlCiAgICBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIGZ1bmN0aW9uIChtaW51cyB0aGUgYGRyaXZlcnNgIGFyZ3VtZW50KSwgdGhhdCByYWlzZQogICAgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpZiB0aGV5IGRvIG5vdCBzdXBwb3J0IGV4dHJhY3RpbmcgdGhlIGRlc2lnbmF0ZWQKICAgIGFyY2hpdmUgdHlwZS4gIFRoZSBgZHJpdmVyc2AgYXJlIHRyaWVkIGluIHNlcXVlbmNlIHVudGlsIG9uZSBpcyBmb3VuZCB0aGF0CiAgICBkb2VzIG5vdCByYWlzZSBhbiBlcnJvciwgb3IgdW50aWwgYWxsIGFyZSBleGhhdXN0ZWQgKGluIHdoaWNoIGNhc2UKICAgIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAgaXMgcmFpc2VkKS4gIElmIHlvdSBkbyBub3Qgc3VwcGx5IGEgc2VxdWVuY2Ugb2YKICAgIGRyaXZlcnMsIHRoZSBtb2R1bGUncyBgYGV4dHJhY3Rpb25fZHJpdmVyc2BgIGNvbnN0YW50IHdpbGwgYmUgdXNlZCwgd2hpY2gKICAgIG1lYW5zIHRoYXQgYGB1bnBhY2tfemlwZmlsZWBgIGFuZCBgYHVucGFja190YXJmaWxlYGAgd2lsbCBiZSB0cmllZCwgaW4gdGhhdAogICAgb3JkZXIuCiAgICAiIiIKICAgIGZvciBkcml2ZXIgaW4gZHJpdmVycyBvciBleHRyYWN0aW9uX2RyaXZlcnM6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBkcml2ZXIoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCBwcm9ncmVzc19maWx0ZXIpCiAgICAgICAgZXhjZXB0IFVucmVjb2duaXplZEZvcm1hdDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4KICAgIGVsc2U6CiAgICAgICAgcmFpc2UgVW5yZWNvZ25pemVkRm9ybWF0KAogICAgICAgICAgICAiTm90IGEgcmVjb2duaXplZCBhcmNoaXZlIHR5cGU6ICVzIiAlIGZpbGVuYW1lCiAgICAgICAgKQoKCmRlZiB1bnBhY2tfZGlyZWN0b3J5KGZpbGVuYW1lLCBleHRyYWN0X2RpciwgcHJvZ3Jlc3NfZmlsdGVyPWRlZmF1bHRfZmlsdGVyKToKICAgICIiIiJVbnBhY2siIGEgZGlyZWN0b3J5LCB1c2luZyB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgZm9yIGFyY2hpdmVzCgogICAgUmFpc2VzIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAgaWYgYGZpbGVuYW1lYCBpcyBub3QgYSBkaXJlY3RvcnkKICAgICIiIgogICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZmlsZW5hbWUpOgogICAgICAgIHJhaXNlIFVucmVjb2duaXplZEZvcm1hdCgiJXMgaXMgbm90IGEgZGlyZWN0b3J5IiAlIGZpbGVuYW1lKQoKICAgIHBhdGhzID0gewogICAgICAgIGZpbGVuYW1lOiAoJycsIGV4dHJhY3RfZGlyKSwKICAgIH0KICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKGZpbGVuYW1lKToKICAgICAgICBzcmMsIGRzdCA9IHBhdGhzW2Jhc2VdCiAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgcGF0aHNbb3MucGF0aC5qb2luKGJhc2UsIGQpXSA9IHNyYyArIGQgKyAnLycsIG9zLnBhdGguam9pbihkc3QsIGQpCiAgICAgICAgZm9yIGYgaW4gZmlsZXM6CiAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihkc3QsIGYpCiAgICAgICAgICAgIHRhcmdldCA9IHByb2dyZXNzX2ZpbHRlcihzcmMgKyBmLCB0YXJnZXQpCiAgICAgICAgICAgIGlmIG5vdCB0YXJnZXQ6CiAgICAgICAgICAgICAgICAjIHNraXAgbm9uLWZpbGVzCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKICAgICAgICAgICAgZiA9IG9zLnBhdGguam9pbihiYXNlLCBmKQogICAgICAgICAgICBzaHV0aWwuY29weWZpbGUoZiwgdGFyZ2V0KQogICAgICAgICAgICBzaHV0aWwuY29weXN0YXQoZiwgdGFyZ2V0KQoKCmRlZiB1bnBhY2tfemlwZmlsZShmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcj1kZWZhdWx0X2ZpbHRlcik6CiAgICAiIiJVbnBhY2sgemlwIGBmaWxlbmFtZWAgdG8gYGV4dHJhY3RfZGlyYAoKICAgIFJhaXNlcyBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlmIGBmaWxlbmFtZWAgaXMgbm90IGEgemlwZmlsZSAoYXMgZGV0ZXJtaW5lZAogICAgYnkgYGB6aXBmaWxlLmlzX3ppcGZpbGUoKWBgKS4gIFNlZSBgYHVucGFja19hcmNoaXZlKClgYCBmb3IgYW4gZXhwbGFuYXRpb24KICAgIG9mIHRoZSBgcHJvZ3Jlc3NfZmlsdGVyYCBhcmd1bWVudC4KICAgICIiIgoKICAgIGlmIG5vdCB6aXBmaWxlLmlzX3ppcGZpbGUoZmlsZW5hbWUpOgogICAgICAgIHJhaXNlIFVucmVjb2duaXplZEZvcm1hdCgiJXMgaXMgbm90IGEgemlwIGZpbGUiICUgKGZpbGVuYW1lLCkpCgogICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZmlsZW5hbWUpIGFzIHo6CiAgICAgICAgZm9yIGluZm8gaW4gei5pbmZvbGlzdCgpOgogICAgICAgICAgICBuYW1lID0gaW5mby5maWxlbmFtZQoKICAgICAgICAgICAgIyBkb24ndCBleHRyYWN0IGFic29sdXRlIHBhdGhzIG9yIG9uZXMgd2l0aCAuLiBpbiB0aGVtCiAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnLycpIG9yICcuLicgaW4gbmFtZS5zcGxpdCgnLycpOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihleHRyYWN0X2RpciwgKm5hbWUuc3BsaXQoJy8nKSkKICAgICAgICAgICAgdGFyZ2V0ID0gcHJvZ3Jlc3NfZmlsdGVyKG5hbWUsIHRhcmdldCkKICAgICAgICAgICAgaWYgbm90IHRhcmdldDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy8nKToKICAgICAgICAgICAgICAgICMgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgZmlsZQogICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCiAgICAgICAgICAgICAgICBkYXRhID0gei5yZWFkKGluZm8uZmlsZW5hbWUpCiAgICAgICAgICAgICAgICB3aXRoIG9wZW4odGFyZ2V0LCAnd2InKSBhcyBmOgogICAgICAgICAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKICAgICAgICAgICAgdW5peF9hdHRyaWJ1dGVzID0gaW5mby5leHRlcm5hbF9hdHRyID4+IDE2CiAgICAgICAgICAgIGlmIHVuaXhfYXR0cmlidXRlczoKICAgICAgICAgICAgICAgIG9zLmNobW9kKHRhcmdldCwgdW5peF9hdHRyaWJ1dGVzKQoKCmRlZiB1bnBhY2tfdGFyZmlsZShmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcj1kZWZhdWx0X2ZpbHRlcik6CiAgICAiIiJVbnBhY2sgdGFyL3Rhci5nei90YXIuYnoyIGBmaWxlbmFtZWAgdG8gYGV4dHJhY3RfZGlyYAoKICAgIFJhaXNlcyBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlmIGBmaWxlbmFtZWAgaXMgbm90IGEgdGFyZmlsZSAoYXMgZGV0ZXJtaW5lZAogICAgYnkgYGB0YXJmaWxlLm9wZW4oKWBgKS4gIFNlZSBgYHVucGFja19hcmNoaXZlKClgYCBmb3IgYW4gZXhwbGFuYXRpb24KICAgIG9mIHRoZSBgcHJvZ3Jlc3NfZmlsdGVyYCBhcmd1bWVudC4KICAgICIiIgogICAgdHJ5OgogICAgICAgIHRhcm9iaiA9IHRhcmZpbGUub3BlbihmaWxlbmFtZSkKICAgIGV4Y2VwdCB0YXJmaWxlLlRhckVycm9yOgogICAgICAgIHJhaXNlIFVucmVjb2duaXplZEZvcm1hdCgKICAgICAgICAgICAgIiVzIGlzIG5vdCBhIGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkIHRhciBmaWxlIiAlIChmaWxlbmFtZSwpCiAgICAgICAgKQogICAgd2l0aCBjb250ZXh0bGliLmNsb3NpbmcodGFyb2JqKToKICAgICAgICAjIGRvbid0IGRvIGFueSBjaG93bmluZyEKICAgICAgICB0YXJvYmouY2hvd24gPSBsYW1iZGEgKmFyZ3M6IE5vbmUKICAgICAgICBmb3IgbWVtYmVyIGluIHRhcm9iajoKICAgICAgICAgICAgbmFtZSA9IG1lbWJlci5uYW1lCiAgICAgICAgICAgICMgZG9uJ3QgZXh0cmFjdCBhYnNvbHV0ZSBwYXRocyBvciBvbmVzIHdpdGggLi4gaW4gdGhlbQogICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCcvJykgYW5kICcuLicgbm90IGluIG5hbWUuc3BsaXQoJy8nKToKICAgICAgICAgICAgICAgIHByZWxpbV9kc3QgPSBvcy5wYXRoLmpvaW4oZXh0cmFjdF9kaXIsICpuYW1lLnNwbGl0KCcvJykpCgogICAgICAgICAgICAgICAgIyByZXNvbHZlIGFueSBsaW5rcyBhbmQgdG8gZXh0cmFjdCB0aGUgbGluayB0YXJnZXRzIGFzIG5vcm1hbAogICAgICAgICAgICAgICAgIyBmaWxlcwogICAgICAgICAgICAgICAgd2hpbGUgbWVtYmVyIGlzIG5vdCBOb25lIGFuZCAobWVtYmVyLmlzbG5rKCkgb3IgbWVtYmVyLmlzc3ltKCkpOgogICAgICAgICAgICAgICAgICAgIGxpbmtwYXRoID0gbWVtYmVyLmxpbmtuYW1lCiAgICAgICAgICAgICAgICAgICAgaWYgbWVtYmVyLmlzc3ltKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSBwb3NpeHBhdGguZGlybmFtZShtZW1iZXIubmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgbGlua3BhdGggPSBwb3NpeHBhdGguam9pbihiYXNlLCBsaW5rcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgbGlua3BhdGggPSBwb3NpeHBhdGgubm9ybXBhdGgobGlua3BhdGgpCiAgICAgICAgICAgICAgICAgICAgbWVtYmVyID0gdGFyb2JqLl9nZXRtZW1iZXIobGlua3BhdGgpCgogICAgICAgICAgICAgICAgaWYgbWVtYmVyIGlzIG5vdCBOb25lIGFuZCAobWVtYmVyLmlzZmlsZSgpIG9yIG1lbWJlci5pc2RpcigpKToKICAgICAgICAgICAgICAgICAgICBmaW5hbF9kc3QgPSBwcm9ncmVzc19maWx0ZXIobmFtZSwgcHJlbGltX2RzdCkKICAgICAgICAgICAgICAgICAgICBpZiBmaW5hbF9kc3Q6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZpbmFsX2RzdC5lbmRzd2l0aChvcy5zZXApOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxfZHN0ID0gZmluYWxfZHN0WzotMV0KICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBYWFggVWdoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJvYmouX2V4dHJhY3RfbWVtYmVyKG1lbWJlciwgZmluYWxfZHN0KQogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgdGFyZmlsZS5FeHRyYWN0RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNob3duL2NobW9kL21rZmlmby9ta25vZGUvbWFrZWRldiBmYWlsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gVHJ1ZQoKCmV4dHJhY3Rpb25fZHJpdmVycyA9IHVucGFja19kaXJlY3RvcnksIHVucGFja196aXBmaWxlLCB1bnBhY2tfdGFyZmlsZQpQSwMEFAAAAAAAAAAhAB/iPRwnFgAAJxYAADAAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2J1aWxkX21ldGEucHkiIiJBIFBFUCA1MTcgaW50ZXJmYWNlIHRvIHNldHVwdG9vbHMKClByZXZpb3VzbHksIHdoZW4gYSB1c2VyIG9yIGEgY29tbWFuZCBsaW5lIHRvb2wgKGxldCdzIGNhbGwgaXQgYSAiZnJvbnRlbmQiKQpuZWVkZWQgdG8gbWFrZSBhIHJlcXVlc3Qgb2Ygc2V0dXB0b29scyB0byB0YWtlIGEgY2VydGFpbiBhY3Rpb24sIGZvcgpleGFtcGxlLCBnZW5lcmF0aW5nIGEgbGlzdCBvZiBpbnN0YWxsYXRpb24gcmVxdWlyZW1lbnRzLCB0aGUgZnJvbnRlbmQgd291bGQKd291bGQgY2FsbCAic2V0dXAucHkgZWdnX2luZm8iIG9yICJzZXR1cC5weSBiZGlzdF93aGVlbCIgb24gdGhlIGNvbW1hbmQgbGluZS4KClBFUCA1MTcgZGVmaW5lcyBhIGRpZmZlcmVudCBtZXRob2Qgb2YgaW50ZXJmYWNpbmcgd2l0aCBzZXR1cHRvb2xzLiBSYXRoZXIKdGhhbiBjYWxsaW5nICJzZXR1cC5weSIgZGlyZWN0bHksIHRoZSBmcm9udGVuZCBzaG91bGQ6CgogIDEuIFNldCB0aGUgY3VycmVudCBkaXJlY3RvcnkgdG8gdGhlIGRpcmVjdG9yeSB3aXRoIGEgc2V0dXAucHkgZmlsZQogIDIuIEltcG9ydCB0aGlzIG1vZHVsZSBpbnRvIGEgc2FmZSBweXRob24gaW50ZXJwcmV0ZXIgKG9uZSBpbiB3aGljaAogICAgIHNldHVwdG9vbHMgY2FuIHBvdGVudGlhbGx5IHNldCBnbG9iYWwgdmFyaWFibGVzIG9yIGNyYXNoIGhhcmQpLgogIDMuIENhbGwgb25lIG9mIHRoZSBmdW5jdGlvbnMgZGVmaW5lZCBpbiBQRVAgNTE3LgoKV2hhdCBlYWNoIGZ1bmN0aW9uIGRvZXMgaXMgZGVmaW5lZCBpbiBQRVAgNTE3LiBIb3dldmVyLCBoZXJlIGlzIGEgImNhc3VhbCIKZGVmaW5pdGlvbiBvZiB0aGUgZnVuY3Rpb25zICh0aGlzIGRlZmluaXRpb24gc2hvdWxkIG5vdCBiZSByZWxpZWQgb24gZm9yCmJ1ZyByZXBvcnRzIG9yIEFQSSBzdGFiaWxpdHkpOgoKICAtIGBidWlsZF93aGVlbGA6IGJ1aWxkIGEgd2hlZWwgaW4gdGhlIGZvbGRlciBhbmQgcmV0dXJuIHRoZSBiYXNlbmFtZQogIC0gYGdldF9yZXF1aXJlc19mb3JfYnVpbGRfd2hlZWxgOiBnZXQgdGhlIGBzZXR1cF9yZXF1aXJlc2AgdG8gYnVpbGQKICAtIGBwcmVwYXJlX21ldGFkYXRhX2Zvcl9idWlsZF93aGVlbGA6IGdldCB0aGUgYGluc3RhbGxfcmVxdWlyZXNgCiAgLSBgYnVpbGRfc2Rpc3RgOiBidWlsZCBhbiBzZGlzdCBpbiB0aGUgZm9sZGVyIGFuZCByZXR1cm4gdGhlIGJhc2VuYW1lCiAgLSBgZ2V0X3JlcXVpcmVzX2Zvcl9idWlsZF9zZGlzdGA6IGdldCB0aGUgYHNldHVwX3JlcXVpcmVzYCB0byBidWlsZAoKQWdhaW4sIHRoaXMgaXMgbm90IGEgZm9ybWFsIGRlZmluaXRpb24hIEp1c3QgYSAidGFzdGUiIG9mIHRoZSBtb2R1bGUuCiIiIgoKaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IHRva2VuaXplCmltcG9ydCBzaHV0aWwKaW1wb3J0IGNvbnRleHRsaWIKCmltcG9ydCBzZXR1cHRvb2xzCmltcG9ydCBkaXN0dXRpbHMKCgpjbGFzcyBTZXR1cFJlcXVpcmVtZW50c0Vycm9yKEJhc2VFeGNlcHRpb24pOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNwZWNpZmllcnMpOgogICAgICAgIHNlbGYuc3BlY2lmaWVycyA9IHNwZWNpZmllcnMKCgpjbGFzcyBEaXN0cmlidXRpb24oc2V0dXB0b29scy5kaXN0LkRpc3RyaWJ1dGlvbik6CiAgICBkZWYgZmV0Y2hfYnVpbGRfZWdncyhzZWxmLCBzcGVjaWZpZXJzKToKICAgICAgICByYWlzZSBTZXR1cFJlcXVpcmVtZW50c0Vycm9yKHNwZWNpZmllcnMpCgogICAgQGNsYXNzbWV0aG9kCiAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogICAgZGVmIHBhdGNoKGNscyk6CiAgICAgICAgIiIiCiAgICAgICAgUmVwbGFjZQogICAgICAgIGRpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbiB3aXRoIHRoaXMgY2xhc3MKICAgICAgICBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoaXMgY29udGV4dC4KICAgICAgICAiIiIKICAgICAgICBvcmlnID0gZGlzdHV0aWxzLmNvcmUuRGlzdHJpYnV0aW9uCiAgICAgICAgZGlzdHV0aWxzLmNvcmUuRGlzdHJpYnV0aW9uID0gY2xzCiAgICAgICAgdHJ5OgogICAgICAgICAgICB5aWVsZAogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGRpc3R1dGlscy5jb3JlLkRpc3RyaWJ1dGlvbiA9IG9yaWcKCgpkZWYgX3J1bl9zZXR1cChzZXR1cF9zY3JpcHQ9J3NldHVwLnB5Jyk6CiAgICAjIE5vdGUgdGhhdCB3ZSBjYW4gcmV1c2Ugb3VyIGJ1aWxkIGRpcmVjdG9yeSBiZXR3ZWVuIGNhbGxzCiAgICAjIENvcnJlY3RuZXNzIGNvbWVzIGZpcnN0LCB0aGVuIG9wdGltaXphdGlvbiBsYXRlcgogICAgX19maWxlX18gPSBzZXR1cF9zY3JpcHQKICAgIF9fbmFtZV9fID0gJ19fbWFpbl9fJwogICAgZiA9IGdldGF0dHIodG9rZW5pemUsICdvcGVuJywgb3BlbikoX19maWxlX18pCiAgICBjb2RlID0gZi5yZWFkKCkucmVwbGFjZSgnXFxyXFxuJywgJ1xcbicpCiAgICBmLmNsb3NlKCkKICAgIGV4ZWMoY29tcGlsZShjb2RlLCBfX2ZpbGVfXywgJ2V4ZWMnKSwgbG9jYWxzKCkpCgoKZGVmIF9maXhfY29uZmlnKGNvbmZpZ19zZXR0aW5ncyk6CiAgICBjb25maWdfc2V0dGluZ3MgPSBjb25maWdfc2V0dGluZ3Mgb3Ige30KICAgIGNvbmZpZ19zZXR0aW5ncy5zZXRkZWZhdWx0KCctLWdsb2JhbC1vcHRpb24nLCBbXSkKICAgIHJldHVybiBjb25maWdfc2V0dGluZ3MKCgpkZWYgX2dldF9idWlsZF9yZXF1aXJlcyhjb25maWdfc2V0dGluZ3MpOgogICAgY29uZmlnX3NldHRpbmdzID0gX2ZpeF9jb25maWcoY29uZmlnX3NldHRpbmdzKQogICAgcmVxdWlyZW1lbnRzID0gWydzZXR1cHRvb2xzJywgJ3doZWVsJ10KCiAgICBzeXMuYXJndiA9IHN5cy5hcmd2WzoxXSArIFsnZWdnX2luZm8nXSArIFwKICAgICAgICBjb25maWdfc2V0dGluZ3NbIi0tZ2xvYmFsLW9wdGlvbiJdCiAgICB0cnk6CiAgICAgICAgd2l0aCBEaXN0cmlidXRpb24ucGF0Y2goKToKICAgICAgICAgICAgX3J1bl9zZXR1cCgpCiAgICBleGNlcHQgU2V0dXBSZXF1aXJlbWVudHNFcnJvciBhcyBlOgogICAgICAgIHJlcXVpcmVtZW50cyArPSBlLnNwZWNpZmllcnMKCiAgICByZXR1cm4gcmVxdWlyZW1lbnRzCgoKZGVmIF9nZXRfaW1tZWRpYXRlX3N1YmRpcmVjdG9yaWVzKGFfZGlyKToKICAgIHJldHVybiBbbmFtZSBmb3IgbmFtZSBpbiBvcy5saXN0ZGlyKGFfZGlyKQogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihhX2RpciwgbmFtZSkpXQoKCmRlZiBnZXRfcmVxdWlyZXNfZm9yX2J1aWxkX3doZWVsKGNvbmZpZ19zZXR0aW5ncz1Ob25lKToKICAgIGNvbmZpZ19zZXR0aW5ncyA9IF9maXhfY29uZmlnKGNvbmZpZ19zZXR0aW5ncykKICAgIHJldHVybiBfZ2V0X2J1aWxkX3JlcXVpcmVzKGNvbmZpZ19zZXR0aW5ncykKCgpkZWYgZ2V0X3JlcXVpcmVzX2Zvcl9idWlsZF9zZGlzdChjb25maWdfc2V0dGluZ3M9Tm9uZSk6CiAgICBjb25maWdfc2V0dGluZ3MgPSBfZml4X2NvbmZpZyhjb25maWdfc2V0dGluZ3MpCiAgICByZXR1cm4gX2dldF9idWlsZF9yZXF1aXJlcyhjb25maWdfc2V0dGluZ3MpCgoKZGVmIHByZXBhcmVfbWV0YWRhdGFfZm9yX2J1aWxkX3doZWVsKG1ldGFkYXRhX2RpcmVjdG9yeSwgY29uZmlnX3NldHRpbmdzPU5vbmUpOgogICAgc3lzLmFyZ3YgPSBzeXMuYXJndls6MV0gKyBbJ2Rpc3RfaW5mbycsICctLWVnZy1iYXNlJywgbWV0YWRhdGFfZGlyZWN0b3J5XQogICAgX3J1bl9zZXR1cCgpCiAgICAKICAgIGRpc3RfaW5mb19kaXJlY3RvcnkgPSBtZXRhZGF0YV9kaXJlY3RvcnkKICAgIHdoaWxlIFRydWU6ICAgIAogICAgICAgIGRpc3RfaW5mb3MgPSBbZiBmb3IgZiBpbiBvcy5saXN0ZGlyKGRpc3RfaW5mb19kaXJlY3RvcnkpCiAgICAgICAgICAgICAgICAgICAgICBpZiBmLmVuZHN3aXRoKCcuZGlzdC1pbmZvJyldCgogICAgICAgIGlmIGxlbihkaXN0X2luZm9zKSA9PSAwIGFuZCBcCiAgICAgICAgICAgICAgICBsZW4oX2dldF9pbW1lZGlhdGVfc3ViZGlyZWN0b3JpZXMoZGlzdF9pbmZvX2RpcmVjdG9yeSkpID09IDE6CiAgICAgICAgICAgIGRpc3RfaW5mb19kaXJlY3RvcnkgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICBkaXN0X2luZm9fZGlyZWN0b3J5LCBvcy5saXN0ZGlyKGRpc3RfaW5mb19kaXJlY3RvcnkpWzBdKQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBhc3NlcnQgbGVuKGRpc3RfaW5mb3MpID09IDEKICAgICAgICBicmVhawoKICAgICMgUEVQIDUxNyByZXF1aXJlcyB0aGF0IHRoZSAuZGlzdC1pbmZvIGRpcmVjdG9yeSBiZSBwbGFjZWQgaW4gdGhlCiAgICAjIG1ldGFkYXRhX2RpcmVjdG9yeS4gVG8gY29tcGx5LCB3ZSBNVVNUIGNvcHkgdGhlIGRpcmVjdG9yeSB0byB0aGUgcm9vdAogICAgaWYgZGlzdF9pbmZvX2RpcmVjdG9yeSAhPSBtZXRhZGF0YV9kaXJlY3Rvcnk6CiAgICAgICAgc2h1dGlsLm1vdmUoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihkaXN0X2luZm9fZGlyZWN0b3J5LCBkaXN0X2luZm9zWzBdKSwKICAgICAgICAgICAgbWV0YWRhdGFfZGlyZWN0b3J5KQogICAgICAgIHNodXRpbC5ybXRyZWUoZGlzdF9pbmZvX2RpcmVjdG9yeSwgaWdub3JlX2Vycm9ycz1UcnVlKQoKICAgIHJldHVybiBkaXN0X2luZm9zWzBdCgoKZGVmIGJ1aWxkX3doZWVsKHdoZWVsX2RpcmVjdG9yeSwgY29uZmlnX3NldHRpbmdzPU5vbmUsCiAgICAgICAgICAgICAgICBtZXRhZGF0YV9kaXJlY3Rvcnk9Tm9uZSk6CiAgICBjb25maWdfc2V0dGluZ3MgPSBfZml4X2NvbmZpZyhjb25maWdfc2V0dGluZ3MpCiAgICB3aGVlbF9kaXJlY3RvcnkgPSBvcy5wYXRoLmFic3BhdGgod2hlZWxfZGlyZWN0b3J5KQogICAgc3lzLmFyZ3YgPSBzeXMuYXJndls6MV0gKyBbJ2JkaXN0X3doZWVsJ10gKyBcCiAgICAgICAgY29uZmlnX3NldHRpbmdzWyItLWdsb2JhbC1vcHRpb24iXQogICAgX3J1bl9zZXR1cCgpCiAgICBpZiB3aGVlbF9kaXJlY3RvcnkgIT0gJ2Rpc3QnOgogICAgICAgIHNodXRpbC5ybXRyZWUod2hlZWxfZGlyZWN0b3J5KQogICAgICAgIHNodXRpbC5jb3B5dHJlZSgnZGlzdCcsIHdoZWVsX2RpcmVjdG9yeSkKCiAgICB3aGVlbHMgPSBbZiBmb3IgZiBpbiBvcy5saXN0ZGlyKHdoZWVsX2RpcmVjdG9yeSkKICAgICAgICAgICAgICBpZiBmLmVuZHN3aXRoKCcud2hsJyldCgogICAgYXNzZXJ0IGxlbih3aGVlbHMpID09IDEKICAgIHJldHVybiB3aGVlbHNbMF0KCgpkZWYgYnVpbGRfc2Rpc3Qoc2Rpc3RfZGlyZWN0b3J5LCBjb25maWdfc2V0dGluZ3M9Tm9uZSk6CiAgICBjb25maWdfc2V0dGluZ3MgPSBfZml4X2NvbmZpZyhjb25maWdfc2V0dGluZ3MpCiAgICBzZGlzdF9kaXJlY3RvcnkgPSBvcy5wYXRoLmFic3BhdGgoc2Rpc3RfZGlyZWN0b3J5KQogICAgc3lzLmFyZ3YgPSBzeXMuYXJndls6MV0gKyBbJ3NkaXN0J10gKyBcCiAgICAgICAgY29uZmlnX3NldHRpbmdzWyItLWdsb2JhbC1vcHRpb24iXQogICAgX3J1bl9zZXR1cCgpCiAgICBpZiBzZGlzdF9kaXJlY3RvcnkgIT0gJ2Rpc3QnOgogICAgICAgIHNodXRpbC5ybXRyZWUoc2Rpc3RfZGlyZWN0b3J5KQogICAgICAgIHNodXRpbC5jb3B5dHJlZSgnZGlzdCcsIHNkaXN0X2RpcmVjdG9yeSkKCiAgICBzZGlzdHMgPSBbZiBmb3IgZiBpbiBvcy5saXN0ZGlyKHNkaXN0X2RpcmVjdG9yeSkKICAgICAgICAgICAgICBpZiBmLmVuZHN3aXRoKCcudGFyLmd6JyldCgogICAgYXNzZXJ0IGxlbihzZGlzdHMpID09IDEKICAgIHJldHVybiBzZGlzdHNbMF0KUEsDBBQAAAAAAAAAIQD1hnppAAABAAAAAQAtAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jbGktMzIuZXhlTVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABZU/5qHTKQOR0ykDkdMpA5OvTrOR4ykDkdMpE5RjKQOaB9BjkZMpA5A2AUOTkykDkDYAU5DzKQOQNgEzltMpA5A2ABORwykDlSaWNoHTKQOQAAAAAAAAAAAAAAAAAAAABQRQAATAEDAPiwi1EAAAAAAAAAAOAAAwELAQkAAMoAAABOAAAAAAAA5yUAAAAQAAAA4AAAAABAAAAQAAAAAgAABQAAAAAAAAAFAAAAAAAAAABAAQAABAAAAAAAAAMAAIAAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAACz5AAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIj0AABAAAAAAAAAAAAAAAAA4AAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC50ZXh0AAAAXckAAAAQAAAAygAAAAQAAAAAAAAAAAAAAAAAACAAAGAucmRhdGEAAGAgAAAA4AAAACIAAADOAAAAAAAAAAAAAAAAAABAAABALmRhdGEAAADEKwAAABABAAAQAAAA8AAAAAAAAAAAAAAAAAAAQAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFGLRCQIjVABighAhMl1+VNVVivCV4vojUQtA2oBUOhzCgAAg8QIM/8z24lEJBDGACKNcAGF7X5X6waNmwAAAACLTCQYigQLPFx1A0frIDwidRqF/34QV2pcVuiBCgAAg8QMA/cz/8YGXEbrAjP/i1QkGIoEE4gGQ0Y73XzDhf9+DldqXFboVgoAAIPEDAP3i0QkEF/GBiLGRgEAXl1bWcOB7AwEAAChgBJBADPEiYQkCAQAAFaLtCQYBAAAV4u8JBgEAACKB4vPhMB0E41kJABBPC91BMZB/1yKAYTAdfGNhCQMAQAAUI2MJBACAABRjVQkFFKNRCQUUFfolw0AAIPEFIB8JAgAD4WkAAAAgHwkDFwPhJkAAACNjCQMAQAAUY2UJBACAABSjUQkFFCNTCQUUVboXg0AAI1EJCCDxBSNUAGKCECEyXX5K8KAfAQLXI1EBAt1CkiAOFx0FY1kJACNVCQMO8JyCcYAAEiAOFx172oAV41EJBRQjUwkFFGNlCQcAwAAUuj5CgAAagFoBAEAAOj/CAAAi/BoBAEAAI2EJCwDAABQVui0CQAAg8Qo6x1qAWgEAQAA6NkIAABoBAEAAIvwV1bolQkAAIPEFIuMJBAEAABfi8ZeM8zoAg0AAIHEDAQAAMPMzMzMzMzMzMyD7AhTVVZXi3wkHIvHjVABighAhMl1+SvCagRQ6IUIAACLbCQoM9uJRCQciV0AiTgPvgdQi/eJXCQc6JoNAACDxAyFwHQSD75PAUdR6IgNAACDxASFwHXuig9HiEwkHITJdGcPvtFS6G0NAACDxASFwHQHg3wkEAB0TIpEJBw8XHUDQ+vTPCJ1GfbDAXUSM8A5RCQQxkQkHAAPlMCJRCQQ0fuF23QQU2pcVuhBCAAAg8QMA/Mz24B8JBwAdJuKTCQciA5G65KKTCQchdt0FFNqXFboGQgAAIpMJCiDxAwD8zPbi1QkFMYGAP9FAItFAEaJNIKEyXQ3D74XUujZDAAAg8QEhcB0Eg++RwFHUOjHDAAAg8QEhcB17oA/AA+FNv///4tEJBRfXl1bg8QIw19eXYvCW4PECMPMzMzMzMzMzIN8JAQAdRKhACBBAIXAdAlqAFD/FQDgQAC4AQAAAMPMg+xYM8BqRFCJRCQMiUQkEIlEJBSJRCQYjUQkHFDHRCQMAAAAAOhmBwAAg8QMagFoMBNAAMdEJBxEAAAA/xUQ4EAAi0QkXI1MJARRjVQkGFJqAGoAagBqAWoAagBQagD/FQzgQACFwHUcaKjhQADoHgUAAIPAQFDo+QMAAIPECDPAg8RYw4tUJASLTCQMav9SiQ0AIEEA/xUI4EAAi0wkBI0EJFBR/xUE4EAAhcB1B2iA4UAA67iLBCSDxFjDzMzMU1VWV4t8JBSLx41QAY1JAIoIQITJdfmLXCQcK8K5AQAAADvZjXACfi2NpCQAAAAAi0QkGIsEiI14AY2bAAAAAIoQQITSdfkrx0E7y410BgF83ot8JBRqAVboKAYAAFeL6GjI4UAAVeh7CwAAi8eDxBSNUAGKCECEyXX5K8K+AQAAADvei/h+OotMJBiLFLFSjQQvaMThQABQ6EkLAACLTCQkiwSxg8QMjVAB6wONSQCKCECEyXX5K8JGO/ONfAcBfMZfXovFXVvDzMzMzMzMzIHsGAIAAKGAEkEAM8SJhCQUAgAAi4QkIAIAAGgAAQAAjUwkGFFqAIlEJBT/FRTgQACNRCQUjVABighAhMl1+SvCjUQEFI1UJBQ7wnYUjUkAgDgudAzGAABIjUwkFDvBd+/GAACNRCQUSI2kJAAAAACKSAFAhMl1+IsVKOJAAIsNLOJAAIkQZosVMOJAAIlIBIoNMuJAAFZmiVAIjVQkGGoAUohICugHtAAAi/CDxAiD/v91NI1EJBhQaBjiQADoPgMAAIPAQFDoGQIAAIPEDI1GA16LjCQUAgAAM8zoIQkAAIHEGAIAAMNXaAABAACNjCQgAQAAUVbomasAAFaNvAQsAQAA6KiKAACNhCQsAQAAg8QQSEA7x3MQigiEyXQKgPkKdAWA+Q1162oCjZQkIAEAAGgU4kAAUsYAAOhUCgAAg8QMhcB0MqEE4kAAiw0I4kAAixUM4kAAiYQkHAEAAKAQ4kAAiYwkIAEAAImUJCQBAACIhCQoAQAAjUwkCFGNlCQiAQAAUuiF+///izCJRCQgjUQkJFBW6CT6//+L+IPEEIl8JAyF/3ULVmjg4UAA6bUAAABTi1wkDFWLrCQsAgAAjQQriUQkHEBqBFDo5QMAAIvwV4l0JBzoQ/n//4kGvwEAAACDxAyDxgQ7334ci/+LTCQgixS5Uugj+f//iQZHg8QEg8YEO/t85o1EJCRQ6Az5//+JBr8BAAAAg8QEg8YEO+9+GotMJBiLFLlS6O74//+JBkeDxASDxgQ7/Xzmg7wkNAIAAABdxwYAAAAAW3RFi0QkCIt0JAxQVugkpAAAg8QIVmjM4UAA6JMBAACDwEBQ6G4AAACDxAxfuAIAAABei4wkFAIAADPM6HMHAACBxBgCAADDi0wkFItUJAiLRCQMUVJQ6Ib8//9Q6MD7//+LjCQsAgAAg8QQX14zzOg/BwAAgcQYAgAAw8zMzMzMzItEJAiLTCQEagBQUegf/f//g8QMw2oMaPD0QADonx8AADP2iXXkM8CLXQg73g+VwDvGdSDoOx8AAMcAFgAAAFZWVlZW6MMeAACDxBSDyP/pzQAAADPAOXUMD5XAO8Z01IldCFPonwEAAFmJdfz2QwxAdXdT6CodAABZg/j/dBuD+P50FovQwfoFi8iD4R/B4QYDDJWgKkEA6wW5mBJBAPZBJH91KYP4/3QZg/j+dBSLyMH5BYPgH8HgBgMEjaAqQQDrBbiYEkEA9kAkgHQc6KEeAADHABYAAABWVlZWVugpHgAAg8QUg03k/zl15HUjU+hMDQAAi/iNRRBQVv91DFPosg4AAIlF5FNX6M4NAACDxBzHRfz+////6AkAAACLReTo3x4AAMP/dQjoTAEAAFnDuAAQQQDDocA7QQBWahRehcB1B7gAAgAA6wY7xn0Hi8ajwDtBAGoEUOiTIAAAWVmjvCtBAIXAdR5qBFaJNcA7QQDoeiAAAFlZo7wrQQCFwHUFahpYXsMz0rkAEEEA6wWhvCtBAIkMAoPBIIPCBIH5gBJBAHzqav5eM9K5EBBBAFeLwsH4BYsEhaAqQQCL+oPnH8HnBosEB4P4/3QIO8Z0BIXAdQKJMYPBIEKB+XAQQQB8zl8zwF7D6KcjAACAPTAgQQAAdAXocCEAAP81vCtBAOjXIAAAWcOL/1WL7FaLdQi4ABBBADvwciKB/mASQQB3GovOK8jB+QWDwRBR6OckAACBTgwAgAAAWesKg8YgVv8VGOBAAF5dw4v/VYvsi0UIg/gUfRaDwBBQ6LokAACLRQyBSAwAgAAAWV3Di0UMg8AgUP8VGOBAAF3Di/9Vi+yLRQi5ABBBADvBch89YBJBAHcYgWAM/3///yvBwfgFg8AQUOiXIwAAWV3Dg8AgUP8VHOBAAF3Di/9Vi+yLTQiD+RSLRQx9E4FgDP9///+DwRBR6GgjAABZXcODwCBQ/xUc4EAAXcOL/1WL7FGDZfwAVo1F/FD/dQz/dQjoTCQAAIvwg8QMhfZ1GDlF/HQT6GEcAACFwHQK6FgcAACLTfyJCIvGXsnDzMzMzMzMzMzMzItUJAyLTCQEhdJ0aTPAikQkCITAdRaB+gABAAByDoM9iCpBAAB0BellJQAAV4v5g/oEcjH32YPhA3QMK9GIB4PHAYPpAXX2i8jB4AgDwYvIweAQA8GLyoPiA8HpAnQG86uF0nQKiAeDxwGD6gF19otEJAhfw4tEJATDzMzMzMzMi0wkDFeFyQ+EkgAAAFZTi9mLdCQU98YDAAAAi3wkEHULwekCD4WFAAAA6yeKBoPGAYgHg8cBg+kBdCuEwHQv98YDAAAAdeWL2cHpAnVhg+MDdBOKBoPGAYgHg8cBhMB0N4PrAXXti0QkEFteX8P3xwMAAAB0FogHg8cBg+kBD4SYAAAA98cDAAAAdeqL2cHpAnV0iAeDxwGD6wF19ltei0QkCF/DiReDxwSD6QF0n7r//v5+iwYD0IPw/zPCixaDxgSpAAEBgXTchNJ0LIT2dB73wgAA/wB0DPfCAAAA/3XEiRfrGIHi//8AAIkX6w6B4v8AAACJF+sEM9KJF4PHBDPAg+kBdAwzwIkHg8cEg+kBdfaD4wMPhXf///+LRCQQW15fw4v/VYvs/3UY/3UU/3UQ/3UMav//dQjoICUAAIPEGF3Di/9Vi+xRUVMz21ZXiV34OV0IdH2LTQw7y3UHOV0QdXHrBTldEHRqOV0UdQc5XRh1YOsFOV0YdFk5XRx1BzldIHVP6wU5XSB0SDldJHU+OV0odT6LdQgzwEA4HnQGSEY7w3f2gD46dTU7y3Qag30QAw+C9QAAAGoC/3UIav9R6CUmAACDxBBGiXUI6xc5XSh1wsdF+AEAAADpzgAAADvLdAKIGYt1CDP/iV38OB50VQ++BlDo2CUAAFmFwHQDRusWigY8L3QNPFx0CTwudQiJdfzrA41+AUY4HnXUO/t0JTldFHQbi8crRQg5RRh2fVD/dQhq//91FOisJQAAg8QQiX0I6wmLRRQ7w3QCiBiLRfw7w3RKO0UIckU5XRx0GStFCDlFIHZFUP91CGr//3Uc6HQlAACDxBA5XSQPhKsAAAArdfw5dSh2I1b/dfxq//91JOhSJQAAg8QQ6Y0AAAA5XRx0fyt1CDl1IHdmi0UMO8N0BzldEHYCiBiLRRQ7w3QHOV0YdgKIGItFHDvDdAc5XSB2AogYi0UkO8N0BzldKHYCiBjo2BgAADldCHUWahZeU1NTU1OJMOhcGAAAg8QUi8brKjld+HXlaiJZiQiLwescVv91CGr//3Uc6MkkAACDxBCLRSQ7w3QCiBgzwF9eW8nDi/9Vi+yLTRj32RvJuAABAAAjyFH/dRiLTRT32RvJI8hRi00Q/3UU99kbySPIi0UMUf91EPfYG8CD4ANQ/3UM/3UI6Mf9//+DxCRdwzsNgBJBAHUC88PpeCQAAIv/VYvsi0UIVovxxkYMAIXAdWPoNTIAAIlGCItIbIkOi0hoiU4Eiw47DXAbQQB0EosNjBpBAIVIcHUH6NAuAACJBotGBDsFkBlBAHQWi0YIiw2MGkEAhUhwdQjoRCcAAIlGBItGCPZAcAJ1FINIcALGRgwB6wqLCIkOi0AEiUYEi8ZeXcIEAIv/VYvsg+wQ/3UMjU3w6Gb///+LRfCDuKwAAAABfhONRfBQagj/dQjobzQAAIPEDOsQi4DIAAAAi00ID7cESIPgCIB9/AB0B4tN+INhcP3Jw4v/VYvsgz3oJEEAAHUSi0UIiw1gG0EAD7cEQYPgCF3DagD/dQjohf///1lZXcOL/1WL7IPsIFMz2zldDHUd6BgXAABTU1NTU8cAFgAAAOigFgAAg8QUg8j/602LRQg7w3TcVolF6IlF4I1FEFBT/3UMjUXgUMdF5P///3/HRexCAAAA6BYHAACDxBD/TeSL8HgHi0XgiBjrDI1F4FBT6GA0AABZWYvGXlvJw4v/VYvsUYNl/ABTi10Qhdt1BzPA6ZoAAABXg/sEcnWNe/yF/3Zui00Mi0UIihCDwASDwQSE0nRSOlH8dU2KUP2E0nQ8OlH9dTeKUP6E0nQmOlH+dSGKUP+E0nQQOlH/dQuDRfwEOX38csLrPw+2QP8Ptkn/60YPtkD+D7ZJ/us8D7ZA/Q+2Sf3rMg+2QPwPtkn86yiLTQyLRQjrD4oQhNJ0FDoRdRBAQf9F/Dld/HLsM8BfW8nDD7YAD7YJK8Hr8ov/VYvsV7/oAwAAV/8VJOBAAP91CP8VIOBAAIHH6AMAAIH/YOoAAHcEhcB03l9dw4v/VYvs6G02AAD/dQjoujQAAP81iBJBAOhxLQAAaP8AAAD/0IPEDF3Di/9Vi+xoROJAAP8VIOBAAIXAdBVoNOJAAFD/FSjgQACFwHQF/3UI/9Bdw4v/VYvs/3UI6Mj///9Z/3UI/xUs4EAAzGoI6PIcAABZw2oI6A8cAABZw4v/VYvsVovw6wuLBoXAdAL/0IPGBDt1CHLwXl3Di/9Vi+xWi3UIM8DrD4XAdRCLDoXJdAL/0YPGBDt1DHLsXl3Di/9Vi+yDPbQrQQAAdBlotCtBAOgVOAAAWYXAdAr/dQj/FbQrQQBZ6E83AABoYOFAAGhI4UAA6KH///9ZWYXAdUJoeFlAAOjNNgAAuEDhQADHBCRE4UAA6GP///+DPbgrQQAAWXQbaLgrQQDovTcAAFmFwHQMagBqAmoA/xW4K0EAM8Bdw2oYaBD1QADovBQAAGoI6A4cAABZg2X8ADPbQzkdOCBBAA+ExQAAAIkdNCBBAIpFEKIwIEEAg30MAA+FnQAAAP81rCtBAOgALAAAWYv4iX3Yhf90eP81qCtBAOjrKwAAWYvwiXXciX3kiXXgg+4EiXXcO/dyV+jHKwAAOQZ07Tv3ckr/NujBKwAAi/josSsAAIkG/9f/NawrQQDoqysAAIv4/zWoK0EA6J4rAACDxAw5feR1BTlF4HQOiX3kiX3YiUXgi/CJddyLfdjrn2hw4UAAuGThQADoX/7//1loeOFAALh04UAA6E/+//9Zx0X8/v///+gfAAAAg30QAHUoiR04IEEAagjoPBoAAFn/dQjo/P3//zPbQ4N9EAB0CGoI6CMaAABZw+jiEwAAw4v/VYvsagBqAP91COjD/v//g8QMXcOL/1WL7GoAagH/dQjorf7//4PEDF3DagFqAGoA6J3+//+DxAzDagFqAWoA6I7+//+DxAzDi/9W6MMqAACL8FboKTsAAFbotDoAAFboSxEAAFbomToAAFbohDoAAFbobDgAAFboBTcAAFbo7jYAAGjqI0AA6BUqAACDxCSjiBJBAF7Di/9Vi+yDPUQgQQACdAXoXDMAAP91COipMQAAaP8AAADoJ/3//1lZXcNqFGgw9UAA6M8SAAC4TVoAAGY5BQAAQAB1OKE8AEAAgbgAAEAAUEUAAHUnuQsBAABmOYgYAEAAdRmDuHQAQAAOdhAzyTmI6ABAAA+VwYlN5OsEg2XkAGoB6FY/AABZhcB1CGoc6G7///9Z6IMtAACFwHUIahDoXf///1noPTQAAINl/ADo4Q0AAIXAfQhqG+g7/P//Wf8VMOBAAKOgK0EA6Nc9AACjPCBBAOgSPQAAhcB9CGoI6BX8//9Z6Ik6AACFwH0IagnoBPz//1lqAei7/P//WYXAdAdQ6PH7//9ZoRggQQCjHCBBAFD/NRAgQQD/NQwgQQDoIPL//4PEDIlF4IN95AB1BlDoMv7//+hZ/v//6y6LReyLCIsJiU3cUFHonjUAAFlZw4tl6ItF3IlF4IN95AB1BlDoGP7//+g4/v//x0X8/v///4tF4OjPEQAAw+iMPgAA6aT+//+L/1WL7FaLdQhW6FMPAABQ6Ag/AABZWYXAdHzo0PL//4PAIDvwdQQzwOsP6MDy//+DwEA78HVgM8BA/wUEIEEA90YMDAEAAHVOU1eNPIVIIEEAgz8AuwAQAAB1IFPoCRMAAFmJB4XAdRONRhRqAolGCIkGWIlGGIlGBOsNiz+JfgiJPoleGIleBIFODAIRAAAzwF9AW+sCM8BeXcOL/1WL7IN9CAB0J1aLdQz3RgwAEAAAdBlW6A8VAACBZgz/7v//g2YYAIMmAINmCABZXl3D9kEMQHQGg3kIAHQk/0kEeAuLEYgC/wEPtsDrDA++wFFQ6OUtAABZWYP4/3UDCQbD/wbDi/9Vi+xWi/DrE4tNEIpFCP9NDOi1////gz7/dAaDfQwAf+deXcOL/1WL7PZHDEBTVovwi9l0MoN/CAB1LItFCAEG6yuKA/9NCIvP6H3///9Dgz7/dRPo1Q8AAIM4KnUPi8+wP+hk////g30IAH/VXltdw4v/VYvsgex4AgAAoYASQQAzxYlF/FOLXQxWi3UIM8BXi30U/3UQjY2k/f//ibW0/f//ib3c/f//iYW4/f//iYXw/f//iYXM/f//iYXo/f//iYXQ/f//iYXA/f//iYXI/f//6CP3//+F9nU16E0PAADHABYAAAAzwFBQUFBQ6NMOAACDxBSAvbD9//8AdAqLhaz9//+DYHD9g8j/6cgKAAD2RgxAdV5W6EANAABZupgSQQCD+P90G4P4/nQWi8iD4R+L8MH+BcHhBgMMtaAqQQDrAovK9kEkf3WRg/j/dBmD+P50FIvIg+AfwfkFweAGAwSNoCpBAOsCi8L2QCSAD4Vn////M8k72Q+EXf///4oTiY3Y/f//iY3g/f//iY28/f//iJXv/f//hNIPhB8KAABDg73Y/f//AImdxP3//w+MCwoAAIrCLCA8WHcRD77CD76AWOJAAIPgDzP26wQz9jPAD76EwXjiQABqB8H4BFmJhZT9//87wQ+HrQkAAP8khd8yQACDjej9////ibWQ/f//ibXA/f//ibXM/f//ibXQ/f//ibXw/f//ibXI/f//6XYJAAAPvsKD6CB0SoPoA3Q2g+gIdCVISHQVg+gDD4VXCQAAg43w/f//COlLCQAAg43w/f//BOk/CQAAg43w/f//AekzCQAAgY3w/f//gAAAAOkkCQAAg43w/f//AukYCQAAgPoqdSyDxwSJvdz9//+Lf/w7/om9zP3//w+N+QgAAION8P3//wT3ncz9///p5wgAAIuFzP3//2vACg++yo1ECNCJhcz9///pzAgAAIm16P3//+nBCAAAgPoqdSaDxwSJvdz9//+Lf/w7/om96P3//w+NoggAAION6P3////plggAAIuF6P3//2vACg++yo1ECNCJhej9///pewgAAID6SXRVgPpodESA+mx0GID6dw+FYwgAAIGN8P3//wAIAADpVAgAAIA7bHUWQ4GN8P3//wAQAACJncT9///pOQgAAION8P3//xDpLQgAAION8P3//yDpIQgAAIoDPDZ1HYB7ATR1F0NDgY3w/f//AIAAAImdxP3//+n+BwAAPDN1HYB7ATJ1F0NDgaXw/f///3///4mdxP3//+ndBwAAPGQPhNUHAAA8aQ+EzQcAADxvD4TFBwAAPHUPhL0HAAA8eA+EtQcAADxYD4StBwAAibWU/f//jYWk/f//UA+2wlCJtcj9///opDwAAFmFwIqF7/3//1l0IouNtP3//4212P3//+ik+///igNDiZ3E/f//hMAPhKT8//+LjbT9//+Ntdj9///ogvv//+lNBwAAD77Cg/hkD4/oAQAAD4R5AgAAg/hTD4/yAAAAD4SAAAAAg+hBdBBISHRYSEh0CEhID4WSBQAAgMIgx4WQ/f//AQAAAIiV7/3//4ON8P3//0A5tej9//+NnfT9//+4AAIAAImd5P3//4mFoP3//w+NSAIAAMeF6P3//wYAAADppQIAAPeF8P3//zAIAAAPhZgAAACBjfD9//8ACAAA6YkAAAD3hfD9//8wCAAAdQqBjfD9//8ACAAAi43o/f//g/n/dQW5////f4PHBPeF8P3//xAIAACJvdz9//+Lf/yJveT9//8PhLEEAAA7/nULoZQSQQCJheT9//+LheT9///Hhcj9//8BAAAA6X8EAACD6FgPhNoCAABISHR5K8EPhCf///9ISA+FngQAAIPHBPeF8P3//xAIAACJvdz9//90MA+3R/xQaAACAACNhfT9//9QjYXg/f//UOjnOgAAg8QQhcB0H8eFwP3//wEAAADrE4pH/IiF9P3//8eF4P3//wEAAACNhfT9//+JheT9///pNQQAAIsHg8cEib3c/f//O8Z0O4tIBDvOdDT3hfD9//8ACAAAD78AiY3k/f//dBSZK8LR+MeFyP3//wEAAADp8AMAAIm1yP3//+nlAwAAoZASQQCJheT9//9Q6F44AABZ6c4DAACD+HAPj/sBAAAPhOMBAACD+GUPjLwDAACD+GcPjjT+//+D+Gl0cYP4bnQog/hvD4WgAwAA9oXw/f//gMeF4P3//wgAAAB0YYGN8P3//wACAADrVYs3g8cEib3c/f//6Nc3AACFwA+EL/r///aF8P3//yB0DGaLhdj9//9miQbrCIuF2P3//4kGx4XA/f//AQAAAOmmBAAAg43w/f//QMeF4P3//woAAACLjfD9///3wQCAAAAPhKkBAACLB4tXBIPHCOnVAQAAdRGA+md1ZceF6P3//wEAAADrWTmF6P3//34GiYXo/f//gb3o/f//owAAAH4/i7Xo/f//gcZdAQAAVugeCwAAipXv/f//WYmFvP3//4XAdBCJheT9//+JtaD9//+L2OsKx4Xo/f//owAAADP2iweDxwiJhYj9//+LR/yJhYz9//+NhaT9//9Q/7WQ/f//D77C/7Xo/f//ib3c/f//UP+1oP3//42FiP3//1NQ/zVYHEEA6D0gAABZ/9CLvfD9//+DxByB54AAAAB0IDm16P3//3UYjYWk/f//UFP/NWQcQQDoDiAAAFn/0FlZgL3v/f//Z3UcO/51GI2FpP3//1BT/zVgHEEA6OkfAABZ/9BZWYA7LXURgY3w/f//AAEAAEOJneT9//9T6QP+///Hhej9//8IAAAAiY24/f//6ySD6HMPhLb8//9ISA+Eif7//4PoAw+FtgEAAMeFuP3//ycAAAD2hfD9//+Ax4Xg/f//EAAAAA+Eaf7//4qFuP3//wRRxoXU/f//MIiF1f3//8eF0P3//wIAAADpRf7///fBABAAAA+FS/7//4PHBPbBIHQYib3c/f//9sFAdAYPv0f86wQPt0f8mesTi0f89sFAdAOZ6wIz0om93P3///bBQHQbO9Z/F3wEO8ZzEffYg9IA99qBjfD9//8AAQAA94Xw/f//AJAAAIvai/h1AjPbg73o/f//AH0Mx4Xo/f//AQAAAOsag6Xw/f//97gAAgAAOYXo/f//fgaJhej9//+LxwvDdQYhhdD9//+NdfOLhej9////jej9//+FwH8Gi8cLw3Qti4Xg/f//mVJQU1fogDcAAIPBMIP5OYmdoP3//4v4i9p+BgONuP3//4gOTuu9jUXzK8ZG94Xw/f//AAIAAImF4P3//4m15P3//3RhhcB0B4vOgDkwdFb/jeT9//+LjeT9///GATBA6z5JZjkwdAZAQDvOdfQrheT9///R+OsoO/51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ROX//4qFJ+X//4TAD4VnAQAAiguLtSjl//8zwID5Cg+UwImFIOX//4sGA8eDeDgAdBWKUDSIVfSITfWDYDgAagKNRfRQ60sPvsFQ6Nfs//9ZhcB0OouNNOX//yvLA00QM8BAO8gPhqUBAABqAo2FQOX//1NQ6DwoAACDxAyD+P8PhLEEAABD/4VE5f//6xtqAVONhUDl//9Q6BgoAACDxAyD+P8PhI0EAAAzwFBQagWNTfRRagGNjUDl//9RUP+1HOX//0P/hUTl////FbDgQACL8IX2D4RcBAAAagCNhTzl//9QVo1F9FCLhSjl//+LAP80B/8VmOBAAIXAD4QpBAAAi4VE5f//i40w5f//A8E5tTzl//+JhTjl//8PjBUEAACDvSDl//8AD4TNAAAAagCNhTzl//9QagGNRfRQi4Uo5f//iwDGRfQN/zQH/xWY4EAAhcAPhNADAACDvTzl//8BD4zPAwAA/4Uw5f///4U45f//6YMAAAA8AXQEPAJ1IQ+3MzPJZoP+Cg+UwUNDg4VE5f//Aom1QOX//4mNIOX//zwBdAQ8AnVS/7VA5f//6CUlAABZZjuFQOX//w+FaAMAAIOFOOX//wKDvSDl//8AdClqDVhQiYVA5f//6PgkAABZZjuFQOX//w+FOwMAAP+FOOX///+FMOX//4tFEDmFROX//w+C+f3//+knAwAAiw6KE/+FOOX//4hUDzSLDolEDzjpDgMAADPJiwYDx/ZABIAPhL8CAACLhTTl//+JjUDl//+E2w+FygAAAImFPOX//zlNEA+GIAMAAOsGi7Uo5f//i4085f//g6VE5f//ACuNNOX//42FSOX//ztNEHM5i5U85f///4U85f//ihJBgPoKdRD/hTDl///GAA1A/4VE5f//iBBA/4VE5f//gb1E5f///xMAAHLCi9iNhUjl//8r2GoAjYUs5f//UFONhUjl//9Qiwb/NAf/FZjgQACFwA+EQgIAAIuFLOX//wGFOOX//zvDD4w6AgAAi4U85f//K4U05f//O0UQD4JM////6SACAACJhUTl//+A+wIPhdEAAAA5TRAPhk0CAADrBou1KOX//4uNROX//4OlPOX//wArjTTl//+NhUjl//87TRBzRouVROX//4OFROX//wIPtxJBQWaD+gp1FoOFMOX//wJqDVtmiRhAQIOFPOX//wKDhTzl//8CZokQQECBvTzl///+EwAAcrWL2I2FSOX//yvYagCNhSzl//9QU42FSOX//1CLBv80B/8VmOBAAIXAD4RiAQAAi4Us5f//AYU45f//O8MPjFoBAACLhUTl//8rhTTl//87RRAPgj/////pQAEAADlNEA+GfAEAAIuNROX//4OlPOX//wArjTTl//9qAo2FSPn//147TRBzPIuVROX//w+3EgG1ROX//wPOZoP6CnUOag1bZokYA8YBtTzl//8BtTzl//9miRADxoG9POX//6gGAAByvzP2VlZoVQ0AAI2N8Ov//1GNjUj5//8rwZkrwtH4UIvBUFZo6f0AAP8VsOBAAIvYO94PhJcAAABqAI2FLOX//1CLwyvGUI2ENfDr//9Qi4Uo5f//iwD/NAf/FZjgQACFwHQMA7Us5f//O95/y+sM/xVc4EAAiYVA5f//O95/XIuFROX//yuFNOX//4mFOOX//ztFEA+CCv///+s/agCNjSzl//9R/3UQ/7U05f///zD/FZjgQACFwHQVi4Us5f//g6VA5f//AImFOOX//+sM/xVc4EAAiYVA5f//g7045f//AHVsg71A5f//AHQtagVeObVA5f//dRToFrf//8cACQAAAOget///iTDrP/+1QOX//+git///Wesxi7Uo5f//iwb2RAcEQHQPi4U05f//gDgadQQzwOsk6Na2///HABwAAADo3rb//4MgAIPI/+sMi4U45f//K4Uw5f//X1uLTfwzzV7oaJ7//8nDahBo6PdAAOjotv//i0UIg/j+dRvoorb//4MgAOiHtv//xwAJAAAAg8j/6Z0AAAAz/zvHfAg7BZAqQQByIeh5tv//iTjoX7b//8cACQAAAFdXV1dX6Oe1//+DxBTryYvIwfkFjRyNoCpBAIvwg+YfweYGiwsPvkwxBIPhAXS/UOg5JAAAWYl9/IsD9kQwBAF0Fv91EP91DP91COgu+P//g8QMiUXk6xbo/LX//8cACQAAAOgEtv//iTiDTeT/x0X8/v///+gJAAAAi0Xk6Gi2///D/3UI6IMkAABZw2oQaAj4QADoDLb//4tFCIP4/nUT6LO1///HAAkAAACDyP/pqgAAADPbO8N8CDsFkCpBAHIa6JK1///HAAkAAABTU1NTU+gatf//g8QU69CLyMH5BY08jaAqQQCL8IPmH8HmBosP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/3UIjU3w6CGW////dSiNTfD/dST/dSD/dRz/dRj/dRT/dRD/dQzoKPz//4PEIIB9/AB0B4tN+INhcP3Jw4v/VYvsUVGhgBJBADPFiUX8oYgpQQBTVjPbV4v5O8N1Oo1F+FAz9kZWaGTqQABW/xX44EAAhcB0CIk1iClBAOs0/xVc4EAAg/h4dQpqAlijiClBAOsFoYgpQQCD+AIPhM8AAAA7ww+ExwAAAIP4AQ+F6AAAAIld+DldGHUIiweLQASJRRiLNezgQAAzwDldIFNT/3UQD5XA/3UMjQTFAQAAAFD/dRj/1ov4O/sPhKsAAAB+PIH/8P//f3c0jUQ/CD0ABAAAdxPo0h8AAIvEO8N0HMcAzMwAAOsRUOhQ4P//WTvDdAnHAN3dAACDwAiL2IXbdGmNBD9QagBT6N6Q//+DxAxXU/91EP91DGoB/3UY/9aFwHQR/3UUUFP/dQj/FfjgQACJRfhT6Mn6//+LRfhZ63Uz9jldHHUIiweLQBSJRRw5XRh1CIsHi0AEiUUY/3Uc6EEdAABZg/j/dQQzwOtHO0UYdB5TU41NEFH/dQxQ/3UY6GkdAACL8IPEGDvzdNyJdQz/dRT/dRD/dQz/dQj/dRz/FfTgQACL+DvzdAdW6Oav//9Zi8eNZexfXluLTfwzzegolP//ycOL/1WL7IPsEP91CI1N8OgilP///3UkjU3w/3Ug/3Uc/3UY/3UU/3UQ/3UM6Bb+//+DxByAffwAdAeLTfiDYXD9ycOL/1WL7FaLdQiF9g+EgQEAAP92BOh2r////3YI6G6v////dgzoZq////92EOher////3YU6Fav////dhjoTq////826Eev////diDoP6////92JOg3r////3Yo6C+v////dizoJ6////92MOgfr////3Y06Bev////dhzoD6////92OOgHr////3Y86P+u//+DxED/dkDo9K7///92ROjsrv///3ZI6OSu////dkzo3K7///92UOjUrv///3ZU6Myu////dljoxK7///92XOi8rv///3Zg6LSu////dmTorK7///92aOikrv///3Zs6Jyu////dnDolK7///92dOiMrv///3Z46ISu////dnzofK7//4PEQP+2gAAAAOhurv///7aEAAAA6GOu////togAAADoWK7///+2jAAAAOhNrv///7aQAAAA6EKu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AOshV1D/dQjoOfr//4PEDIXAdQ2LBooEBzw9dB2EwHQZg8YEiwaFwHXZi8YrBRggQQDB+AL32F5dw4vGKwUYIEEAwfgC6/CL/1WL7FFXi/gzwIvPhf90RjkHdAmDwQRAgzkAdfdWQGoEUOi5gv//i/BZWYl1/IX2dRhqCehqav//6w5Q6GMCAACJBoPGBIPHBFmLB4XAdeshBotF/F5fycOL/1WL7IPsFItFCFMz24ld9DvDdR3o8H///1NTU1NTxwAWAAAA6Hh///+DxBSDyP/rblaLMFeJdfw783RTaj1W6BcDAACL+FlZiX3sO/t0QDv3dDwzwDhfAQ+UwIlF+KEYIEEAOwUcIEEAdQroNf///6MYIEEAO8N1YDldDHQkOR0gIEEAdBzoM/n//4XAdErodX///8cAFgAAAIPI/19eW8nDOV34D4WYAQAAagToj4H//1mjGCBBADvDdN6JGDkdICBBAHUTagTodIH//1mjICBBADvDdMOJGIs1GCBBAIl18DvzdLQrffz/dfzoYv7//4v4O/tZfFI5HnROjTS+/zbobIL//1k5Xfh1G4tF/IkGi0UIiRjpggAAAItGBIkGi0XwR400uDkedfCB/////z9zamoEV/81GCBBAOjfgf//g8QMO8N0VetOOV34D4XiAAAAO/t9AvffjUcCO8cPjDb///89////Pw+DK////1BqBP81GCBBAOijgf//g8QMO8MPhBL///+LVfyNDLiJEYlZBItNCIkZoxggQQA5XQx0eIt1/GoBVujIrP//QFlAUOjQgP//i/hZWTv7dFxWVuiwrP//QFlAUFfo8dX//4PEDIXAdA1TU1NTU+iZfP//g8QUi034i8crxgNF7IgYQPfZG8n30SPIUVf/FSjhQACFwHUPg030/+j8ff//xwAqAAAAV+hZgf//WTld+HQO/3X86EuB//+LRQhZiRiLRfTpaP7///91/Og1gf//i0UIWYkYM8DpU/7//4v/VYvsUzPbOV0IdQQzwOtBVlf/dQjoEKz//4vwRlboqbD//4v4WVk7+3Qi/3UIVlfoQNX//4PEDIXAdA1TU1NTU+joe///g8QUi8frAjPAX15bXcOL/1WL7IPsEFP/dRCNTfDoI2X//4tFCDPbO8N1KOhIff//U1NTU1PHABYAAADo0Hz//4PEFDhd/HQHi0X4g2Bw/TPA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RkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+fwA9AAAARW5jb2RlUG9pbnRlcgAAAEsARQBSAE4ARQBMADMAMgAuAEQATABMAAAAAABEZWNvZGVQb2ludGVyAAAARmxzRnJlZQBGbHNTZXRWYWx1ZQBGbHNHZXRWYWx1ZQBGbHNBbGxvYwAAAABydW50aW1lIGVycm9yIAAADQoAAFRMT1NTIGVycm9yDQoAAABTSU5HIGVycm9yDQoAAAAARE9NQUlOIGVycm9yDQoAAFI2MDM0DQpBbiBhcHBsaWNhdGlvbiBoYXMgbWFkZSBhbiBhdHRlbXB0IHRvIGxvYWQgdGhlIEMgcnVudGltZSBsaWJyYXJ5IGluY29ycmVjdGx5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAAAAAABSNjAzMw0KLSBBdHRlbXB0IHRvIHVzZSBNU0lMIGNvZGUgZnJvbSB0aGlzIGFzc2VtYmx5IGR1cmluZyBuYXRpdmUgY29kZSBpbml0aWFsaXphdGlvbgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBJdCBpcyBtb3N0IGxpa2VseSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYW4gTVNJTC1jb21waWxlZCAoL2NscikgZnVuY3Rpb24gZnJvbSBhIG5hdGl2ZSBjb25zdHJ1Y3RvciBvciBmcm9tIERsbE1haW4uDQoAAFI2MDMyDQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvY2FsZSBpbmZvcm1hdGlvbg0KAAAAAAAAUjYwMzENCi0gQXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBDUlQgbW9yZSB0aGFuIG9uY2UuClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uDQoAAFI2MDMwDQotIENSVCBub3QgaW5pdGlhbGl6ZWQNCgAAUjYwMjgNCi0gdW5hYmxlIHRvIGluaXRpYWxpemUgaGVhcA0KAAAAAFI2MDI3DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvd2lvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3Igc3RkaW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNQ0KLSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbA0KAAAAUjYwMjQNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgX29uZXhpdC9hdGV4aXQgdGFibGUNCgAAAABSNjAxOQ0KLSB1bmFibGUgdG8gb3BlbiBjb25zb2xlIGRldmljZQ0KAAAAAFI2MDE4DQotIHVuZXhwZWN0ZWQgaGVhcCBlcnJvcg0KAAAAAFI2MDE3DQotIHVuZXhwZWN0ZWQgbXVsdGl0aHJlYWQgbG9jayBlcnJvcg0KAAAAAFI2MDE2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRocmVhZCBkYXRhDQoADQpUaGlzIGFwcGxpY2F0aW9uIGhhcyByZXF1ZXN0ZWQgdGhlIFJ1bnRpbWUgdG8gdGVybWluYXRlIGl0IGluIGFuIHVudXN1YWwgd2F5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAABSNjAwOQ0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBlbnZpcm9ubWVudA0KAFI2MDA4DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGFyZ3VtZW50cw0KAAAAUjYwMDINCi0gZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBub3QgbG9hZGVkDQoAAAAATWljcm9zb2Z0IFZpc3VhbCBDKysgUnVudGltZSBMaWJyYXJ5AAAAAAoKAAAuLi4APHByb2dyYW0gbmFtZSB1bmtub3duPgAAUnVudGltZSBFcnJvciEKClByb2dyYW06IAAAAAAAAAAFAADACwAAAAAAAAAdAADABAAAAAAAAACWAADABAAAAAAAAACNAADACAAAAAAAAACOAADACAAAAAAAAACPAADACAAAAAAAAACQAADACAAAAAAAAACRAADACAAAAAAAAACSAADACAAAAAAAAACTAADACAAAAAAAAAAGgICGgIGAAAAQA4aAhoKAFAUFRUVFhYWFBQAAMDCAUICIAAgAKCc4UFeAAAcANzAwUFCIAAAAICiAiICAAAAAYGhgaGhoCAgHeHBwd3BwCAgAAAgACAAHCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAKAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEAgQCBAIEAgQCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAQABAAEAAQABAAEACCAIIAggCCAIIAggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEAAQABAAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgAGgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQ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AAAAAAAAAAAAAACAEkEA0PRAAAMAAADQNwAAIGkAABCZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAANcYQAAAAAAA/v///wAAAADI////AAAAAP7///8AAAAAvCNAAAAAAAD+////AAAAAMz///8AAAAA/v///6klQAC9JUAAAAAAAP7///8AAAAAjP///wAAAAD+////PDVAAEA1QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA4zpAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAACxO0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAADs9QAAAAAAAAAAAAAc9QAD+////AAAAANT///8AAAAA/v///wAAAADAPkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAPM/QAAAAAAA/v///wAAAADU////AAAAAP7///8dQUAAOUFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAAtR0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAPtKQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAa05AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAACtUEAA/v///wAAAAC8UEAA/v///wAAAADY////AAAAAP7///8AAAAAb1JAAP7///8AAAAAe1JAAP7///8AAAAA1P///wAAAAD+////AAAAADVZQAAAAAAA/v///wAAAADY////AAAAAP7////bWkAA71pAAAAAAAD+////AAAAANj///8AAAAA/v///y1bQAAxW0AAAAAAAP7///8AAAAAwP///wAAAAD+////AAAAAIheQAAAAAAA/v///wAAAADQ////AAAAAP7///8YX0AAL19AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAApakAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAADpsQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAPnlAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABOgUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAC+CQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAJJVAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAC9l0AAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAFShQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAy6VAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAACRp0AAAAAAAAAAAADNpkAA/v///wAAAADQ////AAAAAP7///8AAAAATK5AAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABowkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAAvKQABU+QAAAAAAAAAAAAAOAAEAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlPoAALD6AADG+gAA3PoAAO76AAAG+wAAHPsAADT7AABM+wAAYPsAAGj7AAB6+wAAiPsAAJr7AACs+wAAvPsAAMr7AADc+wAA9PsAAAj8AAAc/AAAOPwAAFb8AABq/AAAevwAAIb8AACS/AAAnvwAALb8AADO/AAA2PwAAOT8AAD2/AAABP0AABD9AAAe/QAAKP0AADj9AABO/QAAWv0AAGr9AACS/QAArP0AAMT9AADe/QAA9P0AAA7+AAAc/gAAKv4AAET+AABU/gAAav4AAIT+AACQ/gAAnv4AAK7+AAC+/gAA0P4AAOT+AAD0/gAACv8AABr/AAAs/wAAPv8AAFD/AABi/wAAbv8AAHz/AACM/wAAov8AALL/AADC/wAA0P8AAOL/AAD0/wAAHAABACgAAQA4AAEASgABAAAAAABSAUdlbmVyYXRlQ29uc29sZUN0cmxFdmVudAAAxgFHZXRFeGl0Q29kZVByb2Nlc3MAAG4EV2FpdEZvclNpbmdsZU9iamVjdACVAENyZWF0ZVByb2Nlc3NBAACvA1NldENvbnNvbGVDdHJsSGFuZGxlcgD1AUdldE1vZHVsZUZpbGVOYW1lQQAA2gBFbnRlckNyaXRpY2FsU2VjdGlvbgAA9AJMZWF2ZUNyaXRpY2FsU2VjdGlvbgAA+gFHZXRNb2R1bGVIYW5kbGVXAAArBFNsZWVwACICR2V0UHJvY0FkZHJlc3MAAAUBRXhpdFByb2Nlc3MAcAFHZXRDb21tYW5kTGluZUEA8ANTZXRIYW5kbGVDb3VudAAAPgJHZXRTdGRIYW5kbGUAANgBR2V0RmlsZVR5cGUAPAJHZXRTdGFydHVwSW5mb0EAvwBEZWxldGVDcml0aWNhbFNlY3Rpb24ANwRUZXJtaW5hdGVQcm9jZXNzAACqAUdldEN1cnJlbnRQcm9jZXNzAEgEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAAfBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgDWAklzRGVidWdnZXJQcmVzZW50AOcBR2V0TGFzdEVycm9yAACmAkhlYXBGcmVlAACiAkhlYXBBbGxvYwBcAUdldENQSW5mbwDFAkludGVybG9ja2VkSW5jcmVtZW50AADBAkludGVybG9ja2VkRGVjcmVtZW50AABTAUdldEFDUAAAFAJHZXRPRU1DUAAA4AJJc1ZhbGlkQ29kZVBhZ2UAPgRUbHNHZXRWYWx1ZQA8BFRsc0FsbG9jAAA/BFRsc1NldFZhbHVlAD0EVGxzRnJlZQD0A1NldExhc3RFcnJvcgAArgFHZXRDdXJyZW50VGhyZWFkSWQAAJcEV3JpdGVGaWxlAPYCTG9hZExpYnJhcnlBAAC6AkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQASwFGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQDAAUdldEVudmlyb25tZW50U3RyaW5ncwBMAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXAIQEV2lkZUNoYXJUb011bHRpQnl0ZQDCAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKQCSGVhcENyZWF0ZQAAYQRWaXJ0dWFsRnJlZQBZA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAGoCR2V0VGlja0NvdW50AACrAUdldEN1cnJlbnRQcm9jZXNzSWQAUwJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCaA1J0bFVud2luZACpAkhlYXBSZUFsbG9jAF4EVmlydHVhbEFsbG9jAACEAUdldENvbnNvbGVDUAAAlgFHZXRDb25zb2xlTW9kZQAAQgFGbHVzaEZpbGVCdWZmZXJzAADmAkxDTWFwU3RyaW5nQQAAHwNNdWx0aUJ5dGVUb1dpZGVDaGFyAOgCTENNYXBTdHJpbmdXAABAAkdldFN0cmluZ1R5cGVBAABDAkdldFN0cmluZ1R5cGVXAADpAUdldExv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ZSBsaWJyYXJ5IGluY29ycmVjdGx5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAAAAAABSNjAzMw0KLSBBdHRlbXB0IHRvIHVzZSBNU0lMIGNvZGUgZnJvbSB0aGlzIGFzc2VtYmx5IGR1cmluZyBuYXRpdmUgY29kZSBpbml0aWFsaXphdGlvbgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBJdCBpcyBtb3N0IGxpa2VseSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYW4gTVNJTC1jb21waWxlZCAoL2NscikgZnVuY3Rpb24gZnJvbSBhIG5hdGl2ZSBjb25zdHJ1Y3RvciBvciBmcm9tIERsbE1haW4uDQoAAFI2MDMyDQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvY2FsZSBpbmZvcm1hdGlvbg0KAAAAAAAAUjYwMzENCi0gQXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBDUlQgbW9yZSB0aGFuIG9uY2UuClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uDQoAAAAAAABSNjAzMA0KLSBDUlQgbm90IGluaXRpYWxpemVkDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhlYXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAAUjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAAAAAAAAUjYwMTgNCi0gdW5leHBlY3RlZCBoZWFwIGVycm9yDQoAAAAAAAAAAFI2MDE3DQotIHVuZXhwZWN0ZWQgbXVsdGl0aHJlYWQgbG9jayBlcnJvcg0KAAAAAFI2MDE2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRocmVhZCBkYXRhDQoAAAAAAAAAAAAAAAAADQpUaGlzIGFwcGxpY2F0aW9uIGhhcyByZXF1ZXN0ZWQgdGhlIFJ1bnRpbWUgdG8gdGVybWluYXRlIGl0IGluIGFuIHVudXN1YWwgd2F5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAABSNjAwOQ0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBlbnZpcm9ubWVudA0KAAAAAABSNjAwOA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBhcmd1bWVudHMNCgAAAAAAAABSNjAwMg0KLSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IG5vdCBsb2FkZWQNCgAAAABNaWNyb3NvZnQgVmlzdWFsIEMrKyBSdW50aW1lIExpYnJhcnkAAAAACgoAAC4uLgA8cHJvZ3JhbSBuYW1lIHVua25vd24+AABSdW50aW1lIEVycm9yIQoKUHJvZ3JhbTogAAAAAAAAAAUAAMALAAAAAAAAAAAAAAAdAADABAAAAAAAAAAAAAAAlgAAwAQAAAAAAAAAAAAAAI0AAMAIAAAAAAAAAAAAAACOAADACAAAAAAAAAAAAAAAjwAAwAgAAAAAAAAAAAAAAJAAAMAIAAAAAAAAAAAAAACRAADACAAAAAAAAAAAAAAAkgAAwAgAAAAAAAAAAAAAAJMAAMAIAAAAAAAAAAAAAAAGgICGgIGAAAAQA4aAhoKAFAUFRUVFhYWFBQAAMDCAUICIAAgAKCc4UFeAAAcANzAwUFCIAAAAICiAiICAAAAAYGhgaGhoCAgHeHBwd3BwCAgAAAgACAAHCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAKAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEAgQCBAIEAgQCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAQABAAEAAQABAAEACCAIIAggCCAIIAggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEAAQABAAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgAGgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAYEBgQGBAYEBgQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBEAAQABAAEAAQABAAggGCAYIBggGCAYIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECARAAEAAQABAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA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cmVudFByb2Nlc3MATARVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAACMEU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyANACSXNEZWJ1Z2dlclByZXNlbnQAnwNSdGxWaXJ0dWFsVW53aW5kAACYA1J0bExvb2t1cEZ1bmN0aW9uRW50cnkAAJEDUnRsQ2FwdHVyZUNvbnRleHQA5wFHZXRMYXN0RXJyb3IAAKYCSGVhcEZyZWUAAKICSGVhcEFsbG9jAF0BR2V0Q1BJbmZvAFQBR2V0QUNQAAAUAkdldE9FTUNQAADaAklzVmFsaWRDb2RlUGFnZQDXAEVuY29kZVBvaW50ZXIAuQBEZWNvZGVQb2ludGVyAEABRmxzR2V0VmFsdWUAQQFGbHNTZXRWYWx1ZQA/AUZsc0ZyZWUA+ANTZXRMYXN0RXJyb3IAAK8BR2V0Q3VycmVudFRocmVhZElkAAA+AUZsc0FsbG9jAACbBFdyaXRlRmlsZQDwAkxvYWRMaWJyYXJ5QQAAugJJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50AEwBRnJlZUVudmlyb25tZW50U3RyaW5nc0EAwQFHZXRFbnZpcm9ubWVudFN0cmluZ3MATQFGcmVlRW52aXJvbm1lbnRTdHJpbmdzVwCIBFdpZGVDaGFyVG9NdWx0aUJ5dGUAwwFHZXRFbnZpcm9ubWVudFN0cmluZ3NXAACqAkhlYXBTZXRJbmZvcm1hdGlvbgAApAJIZWFwQ3JlYXRlAABTA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAGoCR2V0VGlja0NvdW50AACsAUdldEN1cnJlbnRQcm9jZXNzSWQAUwJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCpAkhlYXBSZUFsbG9jAIUBR2V0Q29uc29sZUNQAACXAUdldENvbnNvbGVNb2RlAABDAUZsdXNoRmlsZUJ1ZmZlcnMAAOACTENNYXBTdHJpbmdBAAAZA011bHRpQnl0ZVRvV2lkZUNoYXIA4gJMQ01hcFN0cmluZ1cAAEACR2V0U3RyaW5nVHlwZUEAAEMCR2V0U3RyaW5nVHlwZVcAAOkBR2V0TG9jYWxlSW5mb0EAAOwDU2V0RmlsZVBvaW50ZXIAAKsCSGVhcFNpemUAAEQAQ2xvc2VI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AAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAClZwAADAgBAKhnAADAZwAADAgBAMBnAADvaAAArAkBAPBoAAC/agAA7AsBAMBqAAC2awAACAwBALhrAABqbQAAGAwBAGxtAAC4bQAAMAwBALhtAABrbgAAOAwBAIBuAACkbgAASAwBAORuAABTbwAAUAwBAFRvAACZbwAAlAcBAJxvAADjbwAAlAcBAMBwAADQcgAAWAwBANByAADkcgAAUAwBAOxyAACicwAAeBABAKRzAAB3dAAAeBABAHh0AAASdQAAaAwBABR1AACddQAAoAkBAKB1AAAWdgAAeAwBABh2AAB2fQAAnAwBAHh9AACpfgAAwAwBAKx+AAC/fwAA8AwBAMB/AAB6gAAAGA0BAISAAAArgwAAJA0BACyDAABpiAAAPA0BAGyIAAACiQAAZA0BAASJAABuiwAAdA0BAHCLAAD5iwAAnA0BAESPAAAukQAArA0BADCRAAB4kQAA3AgBAHiRAAANkgAArA0BABCSAACZkgAAtA0BAJySAABxkwAAtA0BAHSTAADlkwAAtA0BAIiVAAAdlgAAKA4BACCWAABXlwAAvA0BAFiXAACrlwAApAcBAKyXAACgmQAA7A0BAKCZAADwmQAAUAwBAPCZAAA2mgAAUAwBAESaAADlmgAABA4BAOiaAABqnQAADA4BAGydAACcnQAAUAwBAJydAABYngAAKA4BAFieAABwnwAANA4BAHCfAACnnwAApAcBAKifAAC8oAAAYA4BALygAAAtogAA2BABAECiAADvogAAYAkBAPCiAACcowAAeA4BAJyjAAAgpAAAUAwBACCkAADGpAAAiA4BAPCkAAAMpwAAuA4BAAynAABfpwAA+A4BAGCnAADlqQAACA8BADyqAABNqwAA2BABAFCrAACrqwAAUAwBAKyrAADnqwAALA8BAOirAAAjrAAADAgBACSsAADFrAAAeBABAMisAAD7rQAAPA8BAPytAABsrwAAaA8BAGyvAAB7sAAAdA8BAISwAAB2sQAAiA8BAHixAABStgAAmA8BAFS2AADdtgAAnA0BAOC2AAD1twAAnA0BAPi3AACouwAAuA8BAKi7AAAXvAAAaAwBABi8AAAOvQAAyBABAES9AACXvQAAUAwBAJi9AAAXxQAA0A8BABjFAACKxgAA6A8BAIzGAACKzgAAGBABAIzOAAB5zwAAOBABAHzP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AOi8FAAAagjoDhwAAFmDZfwAM9tDOR04IEEAD4TFAAAAiR00IEEAikUQojAgQQCDfQwAD4WdAAAA/zWsK0EA6AAsAABZi/iJfdiF/3R4/zWoK0EA6OsrAABZi/CJddyJfeSJdeCD7gSJddw793JX6McrAAA5BnTtO/dySv826MErAACL+OixKwAAiQb/1/81rCtBAOirKwAAi/j/NagrQQDonisAAIPEDDl95HUFOUXgdA6JfeSJfdiJReCL8Il13It92OufaHDhQAC4ZOFAAOhf/v//WWh44UAAuHThQADoT/7//1nHRfz+////6B8AAACDfRAAdSiJHTggQQBqCOg8GgAAWf91COj8/f//M9tDg30QAHQIagjoIxoAAFnD6OITAADDi/9Vi+xqAGoA/3UI6MP+//+DxAxdw4v/VYvsagBqAf91COit/v//g8QMXcNqAWoAagDonf7//4PEDMNqAWoBagDojv7//4PEDMOL/1bowyoAAIvwVugpOwAAVui0OgAAVuhLEQAAVuiZOgAAVuiEOgAAVuhsOAAAVugFNwAAVujuNgAAaOojQADoFSoAAIPEJKOIEkEAXsOL/1WL7IM9RCBBAAJ0BehcMwAA/3UI6KkxAABo/wAAAOgn/f//WVldw2oUaDD1QADozxIAALhNWgAAZjkFAABAAHU4oTwAQACBuAAAQABQRQAAdSe5CwEAAGY5iBgAQAB1GYO4dABAAA52EDPJOYjoAEAAD5XBiU3k6wSDZeQAagHoVj8AAFmFwHUIahzobv///1nogy0AAIXAdQhqEOhd////Weg9NAAAg2X8AOjhDQAAhcB9CGob6Dv8//9Z/xUw4EAAo6ArQQDo1z0AAKM8IEEA6BI9AACFwH0IagjoFfz//1noiToAAIXAfQhqCegE/P//WWoB6Lv8//9ZhcB0B1Do8fv//1mhGCBBAKMcIEEAUP81ECBBAP81DCBBAOgg8v//g8QMiUXgg33kAHUGUOgy/v//6Fn+///rLotF7IsIiwmJTdxQUeieNQAAWVnDi2Xoi0XciUXgg33kAHUGUOgY/v//6Dj+///HRfz+////i0Xg6M8RAADD6Iw+AADppP7//4v/VYvsVot1CFboUw8AAFDoCD8AAFlZhcB0fOjQ8v//g8AgO/B1BDPA6w/owPL//4PAQDvwdWAzwED/BQQgQQD3RgwMAQAAdU5TV408hUggQQCDPwC7ABAAAHUgU+gJEwAAWYkHhcB1E41GFGoCiUYIiQZYiUYYiUYE6w2LP4l+CIk+iV4YiV4EgU4MAhEAADPAX0Bb6wIzwF5dw4v/VYvsg30IAHQnVot1DPdGDAAQAAB0GVboDxUAAIFmDP/u//+DZhgAgyYAg2YIAFleXcP2QQxAdAaDeQgAdCT/SQR4C4sRiAL/AQ+2wOsMD77AUVDo5S0AAFlZg/j/dQMJBsP/BsOL/1WL7FaL8OsTi00QikUI/00M6LX///+DPv90BoN9DAB/515dw4v/VYvs9kcMQFNWi/CL2XQyg38IAHUsi0UIAQbrK4oD/00Ii8/off///0ODPv91E+jVDwAAgzgqdQ+Lz7A/6GT///+DfQgAf9VeW13Di/9Vi+yB7HgCAAChgBJBADPFiUX8U4tdDFaLdQgzwFeLfRT/dRCNjaT9//+JtbT9//+Jvdz9//+Jhbj9//+JhfD9//+Jhcz9//+Jhej9//+JhdD9//+JhcD9//+Jhcj9///oI/f//4X2dTXoTQ8AAMcAFgAAADPAUFBQUFDo0w4AAIPEFIC9sP3//wB0CouFrP3//4NgcP2DyP/pyAoAAPZGDEB1XlboQA0AAFm6mBJBAIP4/3Qbg/j+dBaLyIPhH4vwwf4FweEGAwy1oCpBAOsCi8r2QSR/dZGD+P90GYP4/nQUi8iD4B/B+QXB4AYDBI2gKkEA6wKLwvZAJIAPhWf///8zyTvZD4Rd////ihOJjdj9//+JjeD9//+Jjbz9//+Ile/9//+E0g+EHwoAAEODvdj9//8AiZ3E/f//D4wLCgAAisIsIDxYdxEPvsIPvoBY4kAAg+APM/brBDP2M8APvoTBeOJAAGoHwfgEWYmFlP3//zvBD4etCQAA/ySF3zJAAION6P3///+JtZD9//+JtcD9//+Jtcz9//+JtdD9//+JtfD9//+Jtcj9///pdgkAAA++woPoIHRKg+gDdDaD6Ah0JUhIdBWD6AMPhVcJAACDjfD9//8I6UsJAACDjfD9//8E6T8JAACDjfD9//8B6TMJAACBjfD9//+AAAAA6SQJAACDjfD9//8C6RgJAACA+ip1LIPHBIm93P3//4t//Dv+ib3M/f//D435CAAAg43w/f//BPedzP3//+nnCAAAi4XM/f//a8AKD77KjUQI0ImFzP3//+nMCAAAibXo/f//6cEIAACA+ip1JoPHBIm93P3//4t//Dv+ib3o/f//D42iCAAAg43o/f///+mWCAAAi4Xo/f//a8AKD77KjUQI0ImF6P3//+l7CAAAgPpJdFWA+mh0RID6bHQYgPp3D4VjCAAAgY3w/f//AAgAAOlUCAAAgDtsdRZDgY3w/f//ABAAAImdxP3//+k5CAAAg43w/f//EOktCAAAg43w/f//IOkhCAAAigM8NnUdgHsBNHUXQ0OBjfD9//8AgAAAiZ3E/f//6f4HAAA8M3UdgHsBMnUXQ0OBpfD9////f///iZ3E/f//6d0HAAA8ZA+E1QcAADxpD4TNBwAAPG8PhMUHAAA8dQ+EvQcAADx4D4S1BwAAPFgPhK0HAACJtZT9//+NhaT9//9QD7bCUIm1yP3//+ikPAAAWYXAioXv/f//WXQii420/f//jbXY/f//6KT7//+KA0OJncT9//+EwA+EpPz//4uNtP3//4212P3//+iC+///6U0HAAAPvsKD+GQPj+gBAAAPhHkCAACD+FMPj/IAAAAPhIAAAACD6EF0EEhIdFhISHQISEgPhZIFAACAwiDHhZD9//8BAAAAiJXv/f//g43w/f//QDm16P3//42d9P3//7gAAgAAiZ3k/f//iYWg/f//D41IAgAAx4Xo/f//BgAAAOmlAgAA94Xw/f//MAgAAA+FmAAAAIGN8P3//wAIAADpiQAAAPeF8P3//zAIAAB1CoGN8P3//wAIAACLjej9//+D+f91Bbn///9/g8cE94Xw/f//EAgAAIm93P3//4t//Im95P3//w+EsQQAADv+dQuhlBJBAImF5P3//4uF5P3//8eFyP3//wEAAADpfwQAAIPoWA+E2gIAAEhIdHkrwQ+EJ////0hID4WeBAAAg8cE94Xw/f//EAgAAIm93P3//3QwD7dH/FBoAAIAAI2F9P3//1CNheD9//9Q6Oc6AACDxBCFwHQfx4XA/f//AQAAAOsTikf8iIX0/f//x4Xg/f//AQAAAI2F9P3//4mF5P3//+k1BAAAiweDxwSJvdz9//87xnQ7i0gEO850NPeF8P3//wAIAAAPvwCJjeT9//90FJkrwtH4x4XI/f//AQAAAOnwAwAAibXI/f//6eUDAAChkBJBAImF5P3//1DoXjgAAFnpzgMAAIP4cA+P+wEAAA+E4wEAAIP4ZQ+MvAMAAIP4Zw+ONP7//4P4aXRxg/hudCiD+G8PhaADAAD2hfD9//+Ax4Xg/f//CAAAAHRhgY3w/f//AAIAAOtVizeDxwSJvdz9///o1zcAAIXAD4Qv+v//9oXw/f//IHQMZouF2P3//2aJBusIi4XY/f//iQbHhcD9//8BAAAA6aYEAACDjfD9//9Ax4Xg/f//CgAAAIuN8P3///fBAIAAAA+EqQEAAIsHi1cEg8cI6dUBAAB1EYD6Z3Vlx4Xo/f//AQAAAOtZOYXo/f//fgaJhej9//+Bvej9//+jAAAAfj+Ltej9//+Bxl0BAABW6B4LAACKle/9//9ZiYW8/f//hcB0EImF5P3//4m1oP3//4vY6wrHhej9//+jAAAAM/aLB4PHCImFiP3//4tH/ImFjP3//42FpP3//1D/tZD9//8PvsL/tej9//+Jvdz9//9Q/7Wg/f//jYWI/f//U1D/NVgcQQDoPSAAAFn/0Iu98P3//4PEHIHngAAAAHQgObXo/f//dRiNhaT9//9QU/81ZBxBAOgOIAAAWf/QWVmAve/9//9ndRw7/nUYjYWk/f//UFP/NWAcQQDo6R8AAFn/0FlZgDstdRGBjfD9//8AAQAAQ4md5P3//1PpA/7//8eF6P3//wgAAACJjbj9///rJIPocw+Etvz//0hID4SJ/v//g+gDD4W2AQAAx4W4/f//JwAAAPaF8P3//4DHheD9//8QAAAAD4Rp/v//ioW4/f//BFHGhdT9//8wiIXV/f//x4XQ/f//AgAAAOlF/v//98EAEAAAD4VL/v//g8cE9sEgdBiJvdz9///2wUB0Bg+/R/zrBA+3R/yZ6xOLR/z2wUB0A5nrAjPSib3c/f//9sFAdBs71n8XfAQ7xnMR99iD0gD32oGN8P3//wABAAD3hfD9//8AkAAAi9qL+HUCM9uDvej9//8AfQzHhej9//8BAAAA6xqDpfD9///3uAACAAA5hej9//9+BomF6P3//4vHC8N1BiGF0P3//41184uF6P3///+N6P3//4XAfwaLxwvDdC2LheD9//+ZUlBTV+iANwAAg8Ewg/k5iZ2g/f//i/iL2n4GA424/f//iA5O672NRfMrxkb3hfD9//8AAgAAiYXg/f//ibXk/f//dGGFwHQHi86AOTB0Vv+N5P3//4uN5P3//8YBMEDrPklmOTB0BkBAO8519CuF5P3//9H46yg7/nULoZASQQCJheT9//+LheT9///rB0mAOAB0BUA7znX1K4Xk/f//iYXg/f//g73A/f//AA+FXAEAAIuF8P3//6hAdDKpAAEAAHQJxoXU/f//LesYqAF0CcaF1P3//yvrC6gCdBHGhdT9//8gx4XQ/f//AQAAAIudzP3//yud4P3//yud0P3///aF8P3//wx1F/+1tP3//42F2P3//1NqIOhw9f//g8QM/7XQ/f//i720/f//jYXY/f//jY3U/f//6Hb1///2hfD9//8IWXQb9oXw/f//BHUSV1NqMI2F2P3//+gu9f//g8QMg73I/f//AIuF4P3//3RmhcB+You15P3//4mFoP3//w+3Bv+NoP3//1BqBo1F9FCNhZj9//9GUEbogTUAAIPEEIXAdSg5hZj9//90IP+1mP3//42F2P3//41N9Ojx9P//g72g/f//AFl1tescg43Y/f///+sTi43k/f//UI2F2P3//+jK9P//WYO92P3//wB8G/aF8P3//wR0EldTaiCNhdj9///ogvT//4PEDIO9vP3//wB0E/+1vP3//+gECAAAg6W8/f//AFmLncT9//+KA4iF7/3//4TAdBOLjZT9//+Lvdz9//+K0Onh9f//gL2w/f//AHQKi4Ws/f//g2Bw/YuF2P3//4tN/F9eM81b6Abs///Jw5DqKkAA6yhAABspQAB5KUAAxSlAANApQAAWKkAARCtAAGpUaFD1QADoZQQAADP/iX38jUWcUP8VQOBAAMdF/P7///9qQGogXlbodQYAAFlZO8cPhBQCAACjoCpBAIk1kCpBAI2IAAgAAOswxkAEAIMI/8ZABQqJeAjGQCQAxkAlCsZAJgqJeDjGQDQAg8BAiw2gKkEAgcEACAAAO8FyzGY5fc4PhAoBAACLRdA7xw+E/wAAAIs4jVgEjQQ7iUXkvgAIAAA7/nwCi/7HReABAAAA61tqQGog6OcFAABZWYXAdFaLTeCNDI2gKkEAiQGDBZAqQQAgjZAACAAA6yrGQAQAgwj/xkAFCoNgCACAYCSAxkAlCsZAJgqDYDgAxkA0AIPAQIsRA9Y7wnLS/0XgOT2QKkEAfJ3rBos9kCpBAINl4ACF/35ti0XkiwiD+f90VoP5/nRRigOoAXRLqAh1C1H/FTzg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3OBAAIudNOX//4mFHOX//zPAiYU85f//OUUQD4ZCBQAAiYVE5f//ioUn5f//hMAPhWcBAACKC4u1KOX//zPAgPkKD5TAiYUg5f//iwYDx4N4OAB0FYpQNIhV9IhN9YNgOABqAo1F9FDrSw++wVDo1+z//1mFwHQ6i4005f//K8sDTRAzwEA7yA+GpQEAAGoCjYVA5f//U1DoPCgAAIPEDIP4/w+EsQQAAEP/hUTl///rG2oBU42FQOX//1DoGCgAAIPEDIP4/w+EjQQAADPAUFBqBY1N9FFqAY2NQOX//1FQ/7Uc5f//Q/+FROX///8VsOBAAIvwhfYPhFwEAABqAI2FPOX//1BWjUX0UIuFKOX//4sA/zQH/xWY4EAAhcAPhCkEAACLhUTl//+LjTDl//8DwTm1POX//4mFOOX//w+MFQQAAIO9IOX//wAPhM0AAABqAI2FPOX//1BqAY1F9FCLhSjl//+LAMZF9A3/NAf/FZjgQACFwA+E0AMAAIO9POX//wEPjM8DAAD/hTDl////hTjl///pgwAAADwBdAQ8AnUhD7czM8lmg/4KD5TBQ0ODhUTl//8CibVA5f//iY0g5f//PAF0BDwCdVL/tUDl///oJSUAAFlmO4VA5f//D4VoAwAAg4U45f//AoO9IOX//wB0KWoNWFCJhUDl///o+CQAAFlmO4VA5f//D4U7AwAA/4U45f///4Uw5f//i0UQOYVE5f//D4L5/f//6ScDAACLDooT/4U45f//iFQPNIsOiUQPOOkOAwAAM8mLBgPH9kAEgA+EvwIAAIuFNOX//4mNQOX//4TbD4XKAAAAiYU85f//OU0QD4YgAwAA6waLtSjl//+LjTzl//+DpUTl//8AK4005f//jYVI5f//O00QczmLlTzl////hTzl//+KEkGA+gp1EP+FMOX//8YADUD/hUTl//+IEED/hUTl//+BvUTl////EwAAcsKL2I2FSOX//yvYagCNhSzl//9QU42FSOX//1CLBv80B/8VmOBAAIXAD4RCAgAAi4Us5f//AYU45f//O8MPjDoCAACLhTzl//8rhTTl//87RRAPgkz////pIAIAAImFROX//4D7Ag+F0QAAADlNEA+GTQIAAOsGi7Uo5f//i41E5f//g6U85f//ACuNNOX//42FSOX//ztNEHNGi5VE5f//g4VE5f//Ag+3EkFBZoP6CnUWg4Uw5f//AmoNW2aJGEBAg4U85f//AoOFPOX//wJmiRBAQIG9POX///4TAABytYvYjYVI5f//K9hqAI2FLOX//1BTjYVI5f//UIsG/zQH/xWY4EAAhcAPhGIBAACLhSzl//8BhTjl//87ww+MWgEAAIuFROX//yuFNOX//ztFEA+CP////+lAAQAAOU0QD4Z8AQAAi41E5f//g6U85f//ACuNNOX//2oCjYVI+f//XjtNEHM8i5VE5f//D7cSAbVE5f//A85mg/oKdQ5qDVtmiRgDxgG1POX//wG1POX//2aJEAPGgb085f//qAYAAHK/M/ZWVmhVDQAAjY3w6///UY2NSPn//yvBmSvC0fhQi8FQVmjp/QAA/xWw4EAAi9g73g+ElwAAAGoAjYUs5f//UIvDK8ZQjYQ18Ov//1CLhSjl//+LAP80B/8VmOBAAIXAdAwDtSzl//873n/L6wz/FVzgQACJhUDl//873n9ci4VE5f//K4U05f//iYU45f//O0UQD4IK////6z9qAI2NLOX//1H/dRD/tTTl////MP8VmOBAAIXAdBWLhSzl//+DpUDl//8AiYU45f//6wz/FVzgQACJhUDl//+DvTjl//8AdWyDvUDl//8AdC1qBV45tUDl//91FOgWt///xwAJAAAA6B63//+JMOs//7VA5f//6CK3//9Z6zGLtSjl//+LBvZEBwRAdA+LhTTl//+AOBp1BDPA6yTo1rb//8cAHAAAAOjetv//gyAAg8j/6wyLhTjl//8rhTDl//9fW4tN/DPNXuhonv//ycNqEGjo90AA6Oi2//+LRQiD+P51G+iitv//gyAA6Ie2///HAAkAAACDyP/pnQAAADP/O8d8CDsFkCpBAHIh6Hm2//+JOOhftv//xwAJAAAAV1dXV1fo57X//4PEFOvJi8jB+QWNHI2gKkEAi/CD5h/B5gaLCw++TDEEg+EBdL9Q6DkkAABZiX38iwP2RDAEAXQW/3UQ/3UM/3UI6C74//+DxAyJReTrFuj8tf//xwAJAAAA6AS2//+JOINN5P/HRfz+////6AkAAACLReToaLb//8P/dQjogyQAAFnDahBoCPhAAOgMtv//i0UIg/j+dRPos7X//8cACQAAAIPI/+mqAAAAM9s7w3wIOwWQKkEAchrokrX//8cACQAAAFNT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UOjlsf//WYvGjWXgX15bi038M83oJ5b//8nDi/9Vi+yD7BD/dQiNTfDoIZb///91KI1N8P91JP91IP91HP91GP91FP91EP91DOgo/P//g8QggH38AHQHi034g2Fw/cnDi/9Vi+xRUaGAEkEAM8WJRfyhiClBAFNWM9tXi/k7w3U6jUX4UDP2RlZoZOpAAFb/FfjgQACFwHQIiTWIKUEA6zT/FVzgQACD+Hh1CmoCWKOIKUEA6wWhiClBAIP4Ag+EzwAAADvDD4THAAAAg/gBD4XoAAAAiV34OV0YdQiLB4tABIlFGIs17OBAADPAOV0gU1P/dRAPlcD/dQyNBMUBAAAAUP91GP/Wi/g7+w+EqwAAAH48gf/w//9/dzSNRD8IPQAEAAB3E+jSHwAAi8Q7w3QcxwDMzAAA6xFQ6FDg//9ZO8N0CccA3d0AAIPACIvYhdt0aY0EP1BqAFPo3pD//4PEDFdT/3UQ/3UMagH/dRj/1oXAdBH/dRRQU/91CP8V+OBAAIlF+FPoyfr//4tF+FnrdTP2OV0cdQiLB4tAFIlFHDldGHUIiweLQASJRRj/dRzoQR0AAFmD+P91BDPA60c7RRh0HlNTjU0QUf91DFD/dRjoaR0AAIvwg8QYO/N03Il1DP91FP91EP91DP91CP91HP8V9OBAAIv4O/N0B1bo5q///1mLx41l7F9eW4tN/DPN6CiU///Jw4v/VYvsg+wQ/3UIjU3w6CKU////dSSNTfD/dSD/dRz/dRj/dRT/dRD/dQzoFv7//4PEHIB9/AB0B4tN+INhcP3Jw4v/VYvsVot1CIX2D4SBAQAA/3YE6Hav////dgjobq////92DOhmr////3YQ6F6v////dhToVq////92GOhOr////zboR6////92IOg/r////3Yk6Dev////dijoL6////92LOgnr////3Yw6B+v////djToF6////92HOgPr////3Y46Aev////djzo/67//4PEQP92QOj0rv///3ZE6Oyu////dkjo5K7///92TOjcrv///3ZQ6NSu////dlTozK7///92WOjErv///3Zc6Lyu////dmDotK7///92ZOisrv///3Zo6KSu////dmzonK7///92cOiUrv///3Z06Iyu////dnjohK7///92fOh8rv//g8RA/7aAAAAA6G6u////toQAAADo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DP/WhcB0S4N96AF1RYt13MdF1AEAAACD/v91DP912Ogmvf//i/BZRjv3fluB/vD//393U41ENgg9AAQAAHcv6BYBAACLxDvHdDjHAMzMAADrLVdX/3Xc/3XYagH/dQj/04vwO/d1wzPA6dEAAABQ6HjB//9ZO8d0CccA3d0AAIPACIlF5OsDiX3kOX3kdNiNBDZQV/915Oj+cf//g8QMVv915P913P912GoB/3UI/9OFwHR/i13MO990HVdX/3UcU1b/deRX/3UM/xWw4EAAhcB0YIld4Otbix2w4EAAOX3UdRRXV1dXVv915Ff/dQz/04vwO/d0PFZqAehckP//WVmJReA7x3QrV1dWUFb/deRX/3UM/9M7x3UO/3Xg6CWR//9ZiX3g6wuDfdz/dAWLTdCJAf915Oh32///WYtF4I1lwF9eW4tN/DPN6E11///Jw8zMzMzMzMzMzFGNTCQIK8iD4Q8DwRvJC8FZ6dr5//9RjUwkCCvIg+EHA8EbyQvBWenE+f//VYvsg+wIiX38iXX4i3UMi30Ii00QwekH6waNmwAAAABmD28GZg9vThBmD29WIGYPb14wZg9/B2YPf08QZg9/VyBmD39fMGYPb2ZAZg9vblBmD292YGYPb35wZg9/Z0BmD39vUGYPf3dgZg9/f3CNtoAAAACNv4AAAABJdaOLdfiLffyL5V3DVYvsg+wciX30iXX4iV38i10Mi8OZi8iLRQgzyivKg+EPM8orypmL+DP6K/qD5w8z+iv6i9EL13VKi3UQi86D4X+JTeg78XQTK/FWU1DoJ////4PEDItFCItN6IXJdHeLXRCLVQwD0yvRiVXsA9gr2Yld8It17It98ItN6POki0UI61M7z3U199mDwRCJTeSLdQyLfQiLTeTzpItNCANN5ItVDANV5ItFECtF5FBSUehM////g8QMi0UI6xqLdQyLfQiLTRCL0cHpAvOli8qD4QPzpItFCItd/It1+It99IvlXcOL/1WL7GoKagD/dQjoD/H//4PEDF3Di/9Vi+yD7BBTM9tWVzldEA+E1QAAAP91FI1N8OiEc///OV0IdS7orYv//1NTU1NTxwAWAAAA6DWL//+DxBQ4Xfx0B4tF+INgcP24////f+mZAAAAi30MO/t0y77///9/OXUQdijobov//1NTU1NTxwAWAAAA6PaK//+DxBQ4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IyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/AD0AAABFbmNvZGVQb2ludGVyAAAASwBFAFIATgBFAEwAMwAyAC4ARABMAEwAAAAAAERlY29kZVBvaW50ZXIAAABGbHNGcmVlAEZsc1NldFZhbHVlAEZsc0dldFZhbHVlAEZsc0FsbG9jAAAAAHJ1bnRpbWUgZXJyb3IgAAANCgAAVExPU1MgZXJyb3INCgAAAFNJTkcgZXJyb3INCgAAAABET01BSU4gZXJyb3INCgAAUjYwMzQNCkFuIGFwcGxpY2F0aW9uIGhhcyBtYWRlIGFuIGF0dGVtcHQgdG8gbG9hZCB0aGUgQyBydW50aW1lIGxpYnJhcnkgaW5jb3JyZWN0bHkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAAAAAFI2MDMzDQotIEF0dGVtcHQgdG8gdXNlIE1TSUwgY29kZSBmcm9tIHRoaXMgYXNzZW1ibHkgZHVyaW5nIG5hdGl2ZSBjb2RlIGluaXRpYWxpemF0aW9uClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIEl0IGlzIG1vc3QgbGlrZWx5IHRoZSByZXN1bHQgb2YgY2FsbGluZyBhbiBNU0lMLWNvbXBpbGVkICgvY2xyKSBmdW5jdGlvbiBmcm9tIGEgbmF0aXZlIGNvbnN0cnVjdG9yIG9yIGZyb20gRGxsTWFpbi4NCgAAUjYwMzINCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG9jYWxlIGluZm9ybWF0aW9uDQoAAAAAAABSNjAzMQ0KLSBBdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIENSVCBtb3JlIHRoYW4gb25jZS4KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4NCgAAUjYwMzANCi0gQ1JUIG5vdCBpbml0aWFsaXplZA0KAABSNjAyOA0KLSB1bmFibGUgdG8gaW5pdGlhbGl6ZSBoZWFwDQoAAAAAUjYwMjcNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG93aW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBzdGRpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI1DQotIHB1cmUgdmlydHVhbCBmdW5jdGlvbiBjYWxsDQoAAABSNjAyNA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBfb25leGl0L2F0ZXhpdCB0YWJsZQ0KAAAAAFI2MDE5DQotIHVuYWJsZSB0byBvcGVuIGNvbnNvbGUgZGV2aWNlDQoAAAAAUjYwMTgNCi0gdW5leHBlY3RlZCBoZWFwIGVycm9yDQoAAAAAUjYwMTcNCi0gdW5leHBlY3RlZCBtdWx0aXRocmVhZCBsb2NrIGVycm9yDQoAAAAAUjYwMTYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgdGhyZWFkIGRhdGENCgANClRoaXMgYXBwbGljYXRpb24gaGFzIHJlcXVlc3RlZCB0aGUgUnVudGltZSB0byB0ZXJtaW5hdGUgaXQgaW4gYW4gdW51c3VhbCB3YXkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAFI2MDA5DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGVudmlyb25tZW50DQoAUjYwMDgNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgYXJndW1lbnRzDQoAAABSNjAwMg0KLSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IG5vdCBsb2FkZWQNCgAAAABNaWNyb3NvZnQgVmlzdWFsIEMrKyBSdW50aW1lIExpYnJhcnkAAAAACgoAAC4uLgA8cHJvZ3JhbSBuYW1lIHVua25vd24+AABSdW50aW1lIEVycm9yIQoKUHJvZ3JhbTogAAAAAAAAAAUAAMALAAAAAAAAAB0AAMAEAAAAAAAAAJYAAMAEAAAAAAAAAI0AAMAIAAAAAAAAAI4AAMAIAAAAAAAAAI8AAMAIAAAAAAAAAJAAAMAIAAAAAAAAAJEAAMAIAAAAAAAAAJIAAMAIAAAAAAAAAJMAAMAIAAAAAAAAAAaAgIaAgYAAABADhoCGgoAUBQVFRUWFhYUFAAAwMIBQgIgACAAoJzhQV4AABwA3MDBQUIgAAAAgKICIgIAAAABgaGBoaGgICAd4cHB3cHAICAAACAAIAAcIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAaAAoACgAKAAoACAAIAAgACAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIASQQDQ9EAAAwAAANA3AAAgaQAAEJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA1xhAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAAC8I0AAAAAAAP7///8AAAAAzP///wAAAAD+////qSVAAL0lQAAAAAAA/v///wAAAACM////AAAAAP7///88NUAAQDVAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADjOkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAALE7QAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAOz1AAAAAAAAAAAAABz1AAP7///8AAAAA1P///wAAAAD+////AAAAAMA+QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA8z9AAAAAAAD+////AAAAANT///8AAAAA/v///x1BQAA5QUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAC1HQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAA+0pAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAABrTkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAK1QQAD+////AAAAALxQQAD+////AAAAANj///8AAAAA/v///wAAAABvUkAA/v///wAAAAB7UkAA/v///wAAAADU////AAAAAP7///8AAAAANVlAAAAAAAD+////AAAAANj///8AAAAA/v///9taQADvWkAAAAAAAP7///8AAAAA2P///wAAAAD+////LVtAADFbQAAAAAAA/v///wAAAADA////AAAAAP7///8AAAAAiF5AAAAAAAD+////AAAAAND///8AAAAA/v///xhfQAAvX0AAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAClqQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAOmxAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAA+eUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAE6BQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAL4JAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAAklUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAL2XQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAVKFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADLpUAAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAAJGnQAAAAAAAAAAAAM2mQAD+////AAAAAND///8AAAAA/v///wAAAABMrkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAGjCQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAC8pAAFT5AAAAAAAAAAAAAA4AAQAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAACU+gAAsPoAAMb6AADc+gAA7voAAAb7AAAc+wAANPsAAEz7AABg+wAAaPsAAHr7AACI+wAAmvsAAKz7AAC8+wAAyvsAANz7AAD0+wAACPwAABz8AAA4/AAAVvwAAGr8AAB6/AAAhvwAAJL8AACe/AAAtvwAAM78AADY/AAA5PwAAPb8AAAE/QAAEP0AAB79AAAo/QAAOP0AAE79AABa/QAAav0AAJL9AACs/QAAxP0AAN79AAD0/QAADv4AABz+AAAq/gAARP4AAFT+AABq/gAAhP4AAJD+AACe/gAArv4AAL7+AADQ/gAA5P4AAPT+AAAK/wAAGv8AACz/AAA+/wAAUP8AAGL/AABu/wAAfP8AAIz/AACi/wAAsv8AAML/AADQ/wAA4v8AAPT/AAAcAAEAKAABADgAAQBKAAEAAAAAAFIBR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50AADGAUdldEV4aXRDb2RlUHJvY2VzcwAAbgRXYWl0Rm9yU2luZ2xlT2JqZWN0AJUAQ3JlYXRlUHJvY2Vzc0EAAK8DU2V0Q29uc29sZUN0cmxIYW5kbGVyAPUBR2V0TW9kdWxlRmlsZU5hbWVBAADaAEVudGVyQ3JpdGljYWxTZWN0aW9uAAD0AkxlYXZlQ3JpdGljYWxTZWN0aW9uAAD6AUdldE1vZHVsZUhhbmRsZVcAACsEU2xlZXAAIgJHZXRQcm9jQWRkcmVzcwAABQFFeGl0UHJvY2VzcwBwAUdldENvbW1hbmRMaW5lQQDwA1NldEhhbmRsZUNvdW50AAA+AkdldFN0ZEhhbmRsZQAA2AFHZXRGaWxlVHlwZQA8AkdldFN0YXJ0dXBJbmZvQQC/AERlbGV0ZUNyaXRpY2FsU2VjdGlvbgA3BFRlcm1pbmF0ZVByb2Nlc3MAAKoBR2V0Q3VycmVudFByb2Nlc3MASARVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAAB8EU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyANYCSXNEZWJ1Z2dlclByZXNlbnQA5wFHZXRMYXN0RXJyb3IAAKYCSGVhcEZyZWUAAKICSGVhcEFsbG9jAFwBR2V0Q1BJbmZvAMUCSW50ZXJsb2NrZWRJbmNyZW1lbnQAAMECSW50ZXJsb2NrZWREZWNyZW1lbnQAAFMBR2V0QUNQAAAUAkdldE9FTUNQAADgAklzVmFsaWRDb2RlUGFnZQA+BFRsc0dldFZhbHVlADwEVGxzQWxsb2MAAD8EVGxzU2V0VmFsdWUAPQRUbHNGcmVlAPQDU2V0TGFzdEVycm9yAACuAUdldEN1cnJlbnRUaHJlYWRJZAAAlwRXcml0ZUZpbGUA9gJMb2FkTGlicmFyeUEAALoCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudABLAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NBAMABR2V0RW52aXJvbm1lbnRTdHJpbmdzAEwBRnJlZUVudmlyb25tZW50U3RyaW5nc1cAhARXaWRlQ2hhclRvTXVsdGlCeXRlAMIBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAApAJIZWFwQ3JlYXRlAABhBFZpcnR1YWxGcmVlAFkDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAagJHZXRUaWNrQ291bnQAAKsBR2V0Q3VycmVudFByb2Nlc3NJZABTAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAJoDUnRsVW53aW5kAKkCSGVhcFJlQWxsb2MAXgRWaXJ0dWFsQWxsb2MAAIQBR2V0Q29uc29sZUNQAACWAUdldENvbnNvbGVNb2RlAABCAUZsdXNoRmlsZUJ1ZmZlcnMAAOYCTENNYXBTdHJpbmdBAAAfA011bHRpQnl0ZVRvV2lkZUNoYXIA6AJMQ01hcFN0cmluZ1cAAEACR2V0U3Ry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X2NvbW1hbmRbJ2VnZyddID0gKCdiZGlzdF9lZ2cnLCAiUHl0aG9uIC5lZ2cgZmlsZSIpCiAgICBiZGlzdC5mb3JtYXRfY29tbWFuZHMuYXBwZW5kKCdlZ2cnKQoKZGVsIGJkaXN0LCBzeXMKUEsDBBQAAAAAAAAAIQBQ+CPyegkAAHoJAAAzAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2FsaWFzLnB5ZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IG1hcAoKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuc2V0b3B0IGltcG9ydCBlZGl0X2NvbmZpZywgb3B0aW9uX2Jhc2UsIGNvbmZpZ19maWxlCgoKZGVmIHNocXVvdGUoYXJnKToKICAgICIiIlF1b3RlIGFuIGFyZ3VtZW50IGZvciBsYXRlciBwYXJzaW5nIGJ5IHNobGV4LnNwbGl0KCkiIiIKICAgIGZvciBjIGluICciJywgIiciLCAiXFwiLCAiIyI6CiAgICAgICAgaWYgYyBpbiBhcmc6CiAgICAgICAgICAgIHJldHVybiByZXByKGFyZykKICAgIGlmIGFyZy5zcGxpdCgpICE9IFthcmddOgogICAgICAgIHJldHVybiByZXByKGFyZykKICAgIHJldHVybiBhcmcKCgpjbGFzcyBhbGlhcyhvcHRpb25fYmFzZSk6CiAgICAiIiJEZWZpbmUgYSBzaG9ydGN1dCB0aGF0IGludm9rZXMgb25lIG9yIG1vcmUgY29tbWFuZHMiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJkZWZpbmUgYSBzaG9ydGN1dCB0byBpbnZva2Ugb25lIG9yIG1vcmUgY29tbWFuZHMiCiAgICBjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cyA9IFRydWUKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdyZW1vdmUnLCAncicsICdyZW1vdmUgKHVuc2V0KSB0aGUgYWxpYXMnKSwKICAgIF0gKyBvcHRpb25fYmFzZS51c2VyX29wdGlvbnMKCiAgICBib29sZWFuX29wdGlvbnMgPSBvcHRpb25fYmFzZS5ib29sZWFuX29wdGlvbnMgKyBbJ3JlbW92ZSddCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcHRpb25fYmFzZS5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLmFyZ3MgPSBOb25lCiAgICAgICAgc2VsZi5yZW1vdmUgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3B0aW9uX2Jhc2UuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIGlmIHNlbGYucmVtb3ZlIGFuZCBsZW4oc2VsZi5hcmdzKSAhPSAxOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgZXhhY3RseSBvbmUgYXJndW1lbnQgKHRoZSBhbGlhcyBuYW1lKSB3aGVuICIKICAgICAgICAgICAgICAgICJ1c2luZyAtLXJlbW92ZSIKICAgICAgICAgICAgKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgYWxpYXNlcyA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9vcHRpb25fZGljdCgnYWxpYXNlcycpCgogICAgICAgIGlmIG5vdCBzZWxmLmFyZ3M6CiAgICAgICAgICAgIHByaW50KCJDb21tYW5kIEFsaWFzZXMiKQogICAgICAgICAgICBwcmludCgiLS0tLS0tLS0tLS0tLS0tIikKICAgICAgICAgICAgZm9yIGFsaWFzIGluIGFsaWFzZXM6CiAgICAgICAgICAgICAgICBwcmludCgic2V0dXAucHkgYWxpYXMiLCBmb3JtYXRfYWxpYXMoYWxpYXMsIGFsaWFzZXMpKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZWxpZiBsZW4oc2VsZi5hcmdzKSA9PSAxOgogICAgICAgICAgICBhbGlhcywgPSBzZWxmLmFyZ3MKICAgICAgICAgICAgaWYgc2VsZi5yZW1vdmU6CiAgICAgICAgICAgICAgICBjb21tYW5kID0gTm9uZQogICAgICAgICAgICBlbGlmIGFsaWFzIGluIGFsaWFzZXM6CiAgICAgICAgICAgICAgICBwcmludCgic2V0dXAucHkgYWxpYXMiLCBmb3JtYXRfYWxpYXMoYWxpYXMsIGFsaWFzZXMpKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmludCgiTm8gYWxpYXMgZGVmaW5pdGlvbiBmb3VuZCBmb3IgJXIiICUgYWxpYXMpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICBlbHNlOgogICAgICAgICAgICBhbGlhcyA9IHNlbGYuYXJnc1swXQogICAgICAgICAgICBjb21tYW5kID0gJyAnLmpvaW4obWFwKHNocXVvdGUsIHNlbGYuYXJnc1sxOl0pKQoKICAgICAgICBlZGl0X2NvbmZpZyhzZWxmLmZpbGVuYW1lLCB7J2FsaWFzZXMnOiB7YWxpYXM6IGNvbW1hbmR9fSwgc2VsZi5kcnlfcnVuKQoKCmRlZiBmb3JtYXRfYWxpYXMobmFtZSwgYWxpYXNlcyk6CiAgICBzb3VyY2UsIGNvbW1hbmQgPSBhbGlhc2VzW25hbWVdCiAgICBpZiBzb3VyY2UgPT0gY29uZmlnX2ZpbGUoJ2dsb2JhbCcpOgogICAgICAgIHNvdXJjZSA9ICctLWdsb2JhbC1jb25maWcgJwogICAgZWxpZiBzb3VyY2UgPT0gY29uZmlnX2ZpbGUoJ3VzZXInKToKICAgICAgICBzb3VyY2UgPSAnLS11c2VyLWNvbmZpZyAnCiAgICBlbGlmIHNvdXJjZSA9PSBjb25maWdfZmlsZSgnbG9jYWwnKToKICAgICAgICBzb3VyY2UgPSAnJwogICAgZWxzZToKICAgICAgICBzb3VyY2UgPSAnLS1maWxlbmFtZT0lcicgJSBzb3VyY2UKICAgIHJldHVybiBzb3VyY2UgKyBuYW1lICsgJyAnICsgY29tbWFuZApQSwMEFAAAAAAAAAAhAEnMK6FbRgAAW0YAADcAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfZWdnLnB5IiIic2V0dXB0b29scy5jb21tYW5kLmJkaXN0X2VnZwoKQnVpbGQgLmVnZyBkaXN0cmlidXRpb25zIiIiCgpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1NldHVwRXJyb3IKZnJvbSBkaXN0dXRpbHMuZGlyX3V0aWwgaW1wb3J0IHJlbW92ZV90cmVlLCBta3BhdGgKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIHR5cGVzIGltcG9ydCBDb2RlVHlwZQppbXBvcnQgc3lzCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHRleHR3cmFwCmltcG9ydCBtYXJzaGFsCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgZ2V0X2J1aWxkX3BsYXRmb3JtLCBEaXN0cmlidXRpb24sIGVuc3VyZV9kaXJlY3RvcnkKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBFbnRyeVBvaW50CmZyb20gc2V0dXB0b29scy5leHRlbnNpb24gaW1wb3J0IExpYnJhcnkKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCgp0cnk6CiAgICAjIFB5dGhvbiAyLjcgb3IgPj0zLjIKICAgIGZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfcGF0aCwgZ2V0X3B5dGhvbl92ZXJzaW9uCgogICAgZGVmIF9nZXRfcHVyZWxpYigpOgogICAgICAgIHJldHVybiBnZXRfcGF0aCgicHVyZWxpYiIpCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgZ2V0X3B5dGhvbl9saWIsIGdldF9weXRob25fdmVyc2lvbgoKICAgIGRlZiBfZ2V0X3B1cmVsaWIoKToKICAgICAgICByZXR1cm4gZ2V0X3B5dGhvbl9saWIoRmFsc2UpCgoKZGVmIHN0cmlwX21vZHVsZShmaWxlbmFtZSk6CiAgICBpZiAnLicgaW4gZmlsZW5hbWU6CiAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKVswXQogICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoJ21vZHVsZScpOgogICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbOi02XQogICAgcmV0dXJuIGZpbGVuYW1lCgpkZWYgc29ydGVkX3dhbGsoZGlyKToKICAgICIiIkRvIG9zLndhbGsgaW4gYSByZXByb2R1Y2libGUgd2F5LAogICAgaW5kZXBlbmRlbnQgb2YgaW5kZXRlcm1pbmlzdGljIGZpbGVzeXN0ZW0gcmVhZGRpciBvcmRlcgogICAgIiIiCiAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhkaXIpOgogICAgICAgIGRpcnMuc29ydCgpCiAgICAgICAgZmlsZXMuc29ydCgpCiAgICAgICAgeWllbGQgYmFzZSwgZGlycywgZmlsZXMKCmRlZiB3cml0ZV9zdHViKHJlc291cmNlLCBweWZpbGUpOgogICAgX3N0dWJfdGVtcGxhdGUgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgZGVmIF9fYm9vdHN0cmFwX18oKToKICAgICAgICAgICAgZ2xvYmFsIF9fYm9vdHN0cmFwX18sIF9fbG9hZGVyX18sIF9fZmlsZV9fCiAgICAgICAgICAgIGltcG9ydCBzeXMsIHBrZ19yZXNvdXJjZXMsIGltcAogICAgICAgICAgICBfX2ZpbGVfXyA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoX19uYW1lX18sICVyKQogICAgICAgICAgICBfX2xvYWRlcl9fID0gTm9uZTsgZGVsIF9fYm9vdHN0cmFwX18sIF9fbG9hZGVyX18KICAgICAgICAgICAgaW1wLmxvYWRfZHluYW1pYyhfX25hbWVfXyxfX2ZpbGVfXykKICAgICAgICBfX2Jvb3RzdHJhcF9fKCkKICAgICAgICAiIiIpLmxzdHJpcCgpCiAgICB3aXRoIG9wZW4ocHlmaWxlLCAndycpIGFzIGY6CiAgICAgICAgZi53cml0ZShfc3R1Yl90ZW1wbGF0ZSAlIHJlc291cmNlKQoKCmNsYXNzIGJkaXN0X2VnZyhDb21tYW5kKToKICAgIGRlc2NyaXB0aW9uID0gImNyZWF0ZSBhbiBcImVnZ1wiIGRpc3RyaWJ1dGlvbiIKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdiZGlzdC1kaXI9JywgJ2InLAogICAgICAgICAidGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiIpLAogICAgICAgICgncGxhdC1uYW1lPScsICdwJywgInBsYXRmb3JtIG5hbWUgdG8gZW1iZWQgaW4gZ2VuZXJhdGVkIGZpbGVuYW1lcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGRlZmF1bHQ6ICVzKSIgJSBnZXRfYnVpbGRfcGxhdGZvcm0oKSksCiAgICAgICAgKCdleGNsdWRlLXNvdXJjZS1maWxlcycsIE5vbmUsCiAgICAgICAgICJyZW1vdmUgYWxsIC5weSBmaWxlcyBmcm9tIHRoZSBnZW5lcmF0ZWQgZWdnIiksCiAgICAgICAgKCdrZWVwLXRlbXAnLCAnaycsCiAgICAgICAgICJrZWVwIHRoZSBwc2V1ZG8taW5zdGFsbGF0aW9uIHRyZWUgYXJvdW5kIGFmdGVyICIgKwogICAgICAgICAiY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiBhcmNoaXZlIiksCiAgICAgICAgKCdkaXN0LWRpcj0nLCAnZCcsCiAgICAgICAgICJkaXJlY3RvcnkgdG8gcHV0IGZpbmFsIGJ1aWx0IGRpc3RyaWJ1dGlvbnMgaW4iKSwKICAgICAgICAoJ3NraXAtYnVpbGQnLCBOb25lLAogICAgICAgICAic2tpcCByZWJ1aWxkaW5nIGV2ZXJ5dGhpbmcgKGZvciB0ZXN0aW5nL2RlYnVnZ2luZykiKSwKICAgIF0KCiAgICBib29sZWFuX29wdGlvbnMgPSBbCiAgICAgICAgJ2tlZXAtdGVtcCcsICdza2lwLWJ1aWxkJywgJ2V4Y2x1ZGUtc291cmNlLWZpbGVzJwogICAgXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5wbGF0X25hbWUgPSBOb25lCiAgICAgICAgc2VsZi5rZWVwX3RlbXAgPSAwCiAgICAgICAgc2VsZi5kaXN0X2RpciA9IE5vbmUKICAgICAgICBzZWxmLnNraXBfYnVpbGQgPSAwCiAgICAgICAgc2VsZi5lZ2dfb3V0cHV0ID0gTm9uZQogICAgICAgIHNlbGYuZXhjbHVkZV9zb3VyY2VfZmlsZXMgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgZWlfY21kID0gc2VsZi5laV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgIHNlbGYuZWdnX2luZm8gPSBlaV9jbWQuZWdnX2luZm8KCiAgICAgICAgaWYgc2VsZi5iZGlzdF9kaXIgaXMgTm9uZToKICAgICAgICAgICAgYmRpc3RfYmFzZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdiZGlzdCcpLmJkaXN0X2Jhc2UKICAgICAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBvcy5wYXRoLmpvaW4oYmRpc3RfYmFzZSwgJ2VnZycpCgogICAgICAgIGlmIHNlbGYucGxhdF9uYW1lIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYucGxhdF9uYW1lID0gZ2V0X2J1aWxkX3BsYXRmb3JtKCkKCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2JkaXN0JywgKCdkaXN0X2RpcicsICdkaXN0X2RpcicpKQoKICAgICAgICBpZiBzZWxmLmVnZ19vdXRwdXQgaXMgTm9uZToKCiAgICAgICAgICAgICMgQ29tcHV0ZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IGVnZwogICAgICAgICAgICBiYXNlbmFtZSA9IERpc3RyaWJ1dGlvbigKICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUsIGVpX2NtZC5lZ2dfbmFtZSwgZWlfY21kLmVnZ192ZXJzaW9uLAogICAgICAgICAgICAgICAgZ2V0X3B5dGhvbl92ZXJzaW9uKCksCiAgICAgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKSBhbmQgc2VsZi5wbGF0X25hbWUKICAgICAgICAgICAgKS5lZ2dfbmFtZSgpCgogICAgICAgICAgICBzZWxmLmVnZ19vdXRwdXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXN0X2RpciwgYmFzZW5hbWUgKyAnLmVnZycpCgogICAgZGVmIGRvX2luc3RhbGxfZGF0YShzZWxmKToKICAgICAgICAjIEhhY2sgZm9yIHBhY2thZ2VzIHRoYXQgaW5zdGFsbCBkYXRhIHRvIGluc3RhbGwncyAtLWluc3RhbGwtbGliCiAgICAgICAgc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGwnKS5pbnN0YWxsX2xpYiA9IHNlbGYuYmRpc3RfZGlyCgogICAgICAgIHNpdGVfcGFja2FnZXMgPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgoX2dldF9wdXJlbGliKCkpKQogICAgICAgIG9sZCwgc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlcyA9IHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMsIFtdCgogICAgICAgIGZvciBpdGVtIGluIG9sZDoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCB0dXBsZSkgYW5kIGxlbihpdGVtKSA9PSAyOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2FicyhpdGVtWzBdKToKICAgICAgICAgICAgICAgICAgICByZWFscGF0aCA9IG9zLnBhdGgucmVhbHBhdGgoaXRlbVswXSkKICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkID0gb3MucGF0aC5ub3JtY2FzZShyZWFscGF0aCkKICAgICAgICAgICAgICAgICAgICBpZiBub3JtYWxpemVkID09IHNpdGVfcGFja2FnZXMgb3Igbm9ybWFsaXplZC5zdGFydHN3aXRoKAogICAgICAgICAgICAgICAgICAgICAgICBzaXRlX3BhY2thZ2VzICsgb3Muc2VwCiAgICAgICAgICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHJlYWxwYXRoW2xlbihzaXRlX3BhY2thZ2VzKSArIDE6XSwgaXRlbVsxXQogICAgICAgICAgICAgICAgICAgICAgICAjIFhYWCBlbHNlOiByYWlzZSA/Pz8KICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlcy5hcHBlbmQoaXRlbSkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBsb2cuaW5mbygiaW5zdGFsbGluZyBwYWNrYWdlIGRhdGEgdG8gJXMiLCBzZWxmLmJkaXN0X2RpcikKICAgICAgICAgICAgc2VsZi5jYWxsX2NvbW1hbmQoJ2luc3RhbGxfZGF0YScsIGZvcmNlPTAsIHJvb3Q9Tm9uZSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzID0gb2xkCgogICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgogICAgICAgIHJldHVybiBbc2VsZi5lZ2dfb3V0cHV0XQoKICAgIGRlZiBjYWxsX2NvbW1hbmQoc2VsZiwgY21kbmFtZSwgKiprdyk6CiAgICAgICAgIiIiSW52b2tlIHJlaW5pdGlhbGl6ZWQgY29tbWFuZCBgY21kbmFtZWAgd2l0aCBrZXl3b3JkIGFyZ3MiIiIKICAgICAgICBmb3IgZGlybmFtZSBpbiBJTlNUQUxMX0RJUkVDVE9SWV9BVFRSUzoKICAgICAgICAgICAga3cuc2V0ZGVmYXVsdChkaXJuYW1lLCBzZWxmLmJkaXN0X2RpcikKICAgICAgICBrdy5zZXRkZWZhdWx0KCdza2lwX2J1aWxkJywgc2VsZi5za2lwX2J1aWxkKQogICAgICAgIGt3LnNldGRlZmF1bHQoJ2RyeV9ydW4nLCBzZWxmLmRyeV9ydW4pCiAgICAgICAgY21kID0gc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZChjbWRuYW1lLCAqKmt3KQogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoY21kbmFtZSkKICAgICAgICByZXR1cm4gY21kCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAjIEdlbmVyYXRlIG1ldGFkYXRhIGZpcnN0CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgICMgV2UgcnVuIGluc3RhbGxfbGliIGJlZm9yZSBpbnN0YWxsX2RhdGEsIGJlY2F1c2Ugc29tZSBkYXRhIGhhY2tzCiAgICAgICAgIyBwdWxsIHRoZWlyIGRhdGEgcGF0aCBmcm9tIHRoZSBpbnN0YWxsX2xpYiBjb21tYW5kLgogICAgICAgIGxvZy5pbmZvKCJpbnN0YWxsaW5nIGxpYnJhcnkgY29kZSB0byAlcyIsIHNlbGYuYmRpc3RfZGlyKQogICAgICAgIGluc3RjbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbCcpCiAgICAgICAgb2xkX3Jvb3QgPSBpbnN0Y21kLnJvb3QKICAgICAgICBpbnN0Y21kLnJvb3QgPSBOb25lCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2NfbGlicmFyaWVzKCkgYW5kIG5vdCBzZWxmLnNraXBfYnVpbGQ6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2NsaWInKQogICAgICAgIGNtZCA9IHNlbGYuY2FsbF9jb21tYW5kKCdpbnN0YWxsX2xpYicsIHdhcm5fZGlyPTApCiAgICAgICAgaW5zdGNtZC5yb290ID0gb2xkX3Jvb3QKCiAgICAgICAgYWxsX291dHB1dHMsIGV4dF9vdXRwdXRzID0gc2VsZi5nZXRfZXh0X291dHB1dHMoKQogICAgICAgIHNlbGYuc3R1YnMgPSBbXQogICAgICAgIHRvX2NvbXBpbGUgPSBbXQogICAgICAgIGZvciAocCwgZXh0X25hbWUpIGluIGVudW1lcmF0ZShleHRfb3V0cHV0cyk6CiAgICAgICAgICAgIGZpbGVuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGV4dF9uYW1lKQogICAgICAgICAgICBweWZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5iZGlzdF9kaXIsIHN0cmlwX21vZHVsZShmaWxlbmFtZSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5weScpCiAgICAgICAgICAgIHNlbGYuc3R1YnMuYXBwZW5kKHB5ZmlsZSkKICAgICAgICAgICAgbG9nLmluZm8oImNyZWF0aW5nIHN0dWIgbG9hZGVyIGZvciAlcyIsIGV4dF9uYW1lKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgd3JpdGVfc3R1Yihvcy5wYXRoLmJhc2VuYW1lKGV4dF9uYW1lKSwgcHlmaWxlKQogICAgICAgICAgICB0b19jb21waWxlLmFwcGVuZChweWZpbGUpCiAgICAgICAgICAgIGV4dF9vdXRwdXRzW3BdID0gZXh0X25hbWUucmVwbGFjZShvcy5zZXAsICcvJykKCiAgICAgICAgaWYgdG9fY29tcGlsZToKICAgICAgICAgICAgY21kLmJ5dGVfY29tcGlsZSh0b19jb21waWxlKQogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXM6CiAgICAgICAgICAgIHNlbGYuZG9faW5zdGFsbF9kYXRhKCkKCiAgICAgICAgIyBNYWtlIHRoZSBFR0ctSU5GTyBkaXJlY3RvcnkKICAgICAgICBhcmNoaXZlX3Jvb3QgPSBzZWxmLmJkaXN0X2RpcgogICAgICAgIGVnZ19pbmZvID0gb3MucGF0aC5qb2luKGFyY2hpdmVfcm9vdCwgJ0VHRy1JTkZPJykKICAgICAgICBzZWxmLm1rcGF0aChlZ2dfaW5mbykKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzOgogICAgICAgICAgICBzY3JpcHRfZGlyID0gb3MucGF0aC5qb2luKGVnZ19pbmZvLCAnc2NyaXB0cycpCiAgICAgICAgICAgIGxvZy5pbmZvKCJpbnN0YWxsaW5nIHNjcmlwdHMgdG8gJXMiLCBzY3JpcHRfZGlyKQogICAgICAgICAgICBzZWxmLmNhbGxfY29tbWFuZCgnaW5zdGFsbF9zY3JpcHRzJywgaW5zdGFsbF9kaXI9c2NyaXB0X2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9fZXA9MSkKCiAgICAgICAgc2VsZi5jb3B5X21ldGFkYXRhX3RvKGVnZ19pbmZvKQogICAgICAgIG5hdGl2ZV9saWJzID0gb3MucGF0aC5qb2luKGVnZ19pbmZvLCAibmF0aXZlX2xpYnMudHh0IikKICAgICAgICBpZiBhbGxfb3V0cHV0czoKICAgICAgICAgICAgbG9nLmluZm8oIndyaXRpbmcgJXMiLCBuYXRpdmVfbGlicykKICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkobmF0aXZlX2xpYnMpCiAgICAgICAgICAgICAgICBsaWJzX2ZpbGUgPSBvcGVuKG5hdGl2ZV9saWJzLCAnd3QnKQogICAgICAgICAgICAgICAgbGlic19maWxlLndyaXRlKCdcbicuam9pbihhbGxfb3V0cHV0cykpCiAgICAgICAgICAgICAgICBsaWJzX2ZpbGUud3JpdGUoJ1xuJykKICAgICAgICAgICAgICAgIGxpYnNfZmlsZS5jbG9zZSgpCiAgICAgICAgZWxpZiBvcy5wYXRoLmlzZmlsZShuYXRpdmVfbGlicyk6CiAgICAgICAgICAgIGxvZy5pbmZvKCJyZW1vdmluZyAlcyIsIG5hdGl2ZV9saWJzKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgb3MudW5saW5rKG5hdGl2ZV9saWJzKQoKICAgICAgICB3cml0ZV9zYWZldHlfZmxhZygKICAgICAgICAgICAgb3MucGF0aC5qb2luKGFyY2hpdmVfcm9vdCwgJ0VHRy1JTkZPJyksIHNlbGYuemlwX3NhZmUoKQogICAgICAgICkKCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuZWdnX2luZm8sICdkZXBlbmRzLnR4dCcpKToKICAgICAgICAgICAgbG9nLndhcm4oCiAgICAgICAgICAgICAgICAiV0FSTklORzogJ2RlcGVuZHMudHh0JyB3aWxsIG5vdCBiZSB1c2VkIGJ5IHNldHVwdG9vbHMgMC42IVxuIgogICAgICAgICAgICAgICAgIlVzZSB0aGUgaW5zdGFsbF9yZXF1aXJlcy9leHRyYXNfcmVxdWlyZSBzZXR1cCgpIGFyZ3MgaW5zdGVhZC4iCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgc2VsZi5leGNsdWRlX3NvdXJjZV9maWxlczoKICAgICAgICAgICAgc2VsZi56YXBfcHlmaWxlcygpCgogICAgICAgICMgTWFrZSB0aGUgYXJjaGl2ZQogICAgICAgIG1ha2VfemlwZmlsZShzZWxmLmVnZ19vdXRwdXQsIGFyY2hpdmVfcm9vdCwgdmVyYm9zZT1zZWxmLnZlcmJvc2UsCiAgICAgICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuLCBtb2RlPXNlbGYuZ2VuX2hlYWRlcigpKQogICAgICAgIGlmIG5vdCBzZWxmLmtlZXBfdGVtcDoKICAgICAgICAgICAgcmVtb3ZlX3RyZWUoc2VsZi5iZGlzdF9kaXIsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQoKICAgICAgICAjIEFkZCB0byAnRGlzdHJpYnV0aW9uLmRpc3RfZmlsZXMnIHNvIHRoYXQgdGhlICJ1cGxvYWQiIGNvbW1hbmQgd29ya3MKICAgICAgICBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAnZGlzdF9maWxlcycsIFtdKS5hcHBlbmQoCiAgICAgICAgICAgICgnYmRpc3RfZWdnJywgZ2V0X3B5dGhvbl92ZXJzaW9uKCksIHNlbGYuZWdnX291dHB1dCkpCgogICAgZGVmIHphcF9weWZpbGVzKHNlbGYpOgogICAgICAgIGxvZy5pbmZvKCJSZW1vdmluZyAucHkgZmlsZXMgZnJvbSB0ZW1wb3JhcnkgZGlyZWN0b3J5IikKICAgICAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gd2Fsa19lZ2coc2VsZi5iZGlzdF9kaXIpOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oYmFzZSwgbmFtZSkKCiAgICAgICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcucHknKToKICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRlbGV0aW5nICVzIiwgcGF0aCkKICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsocGF0aCkKCiAgICAgICAgICAgICAgICBpZiBiYXNlLmVuZHN3aXRoKCdfX3B5Y2FjaGVfXycpOgogICAgICAgICAgICAgICAgICAgIHBhdGhfb2xkID0gcGF0aAoKICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcicoP1A8bmFtZT4uKylcLig/UDxtYWdpYz5bXi5dKylcLnB5YycKICAgICAgICAgICAgICAgICAgICBtID0gcmUubWF0Y2gocGF0dGVybiwgbmFtZSkKICAgICAgICAgICAgICAgICAgICBwYXRoX25ldyA9IG9zLnBhdGguam9pbihiYXNlLCBvcy5wYXJkaXIsIG0uZ3JvdXAoJ25hbWUnKSArICcucHljJykKICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiUmVuYW1pbmcgZmlsZSBmcm9tIFslc10gdG8gWyVzXSIgJSAocGF0aF9vbGQsIHBhdGhfbmV3KSkKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShwYXRoX25ldykKICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgICAgIG9zLnJlbmFtZShwYXRoX29sZCwgcGF0aF9uZXcpCgoKICAgIGRlZiB6aXBfc2FmZShzZWxmKToKICAgICAgICBzYWZlID0gZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ3ppcF9zYWZlJywgTm9uZSkKICAgICAgICBpZiBzYWZlIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2FmZQogICAgICAgIGxvZy53YXJuKCJ6aXBfc2FmZSBmbGFnIG5vdCBzZXQ7IGFuYWx5emluZyBhcmNoaXZlIGNvbnRlbnRzLi4uIikKICAgICAgICByZXR1cm4gYW5hbHl6ZV9lZ2coc2VsZi5iZGlzdF9kaXIsIHNlbGYuc3R1YnMpCgogICAgZGVmIGdlbl9oZWFkZXIoc2VsZik6CiAgICAgICAgZXBtID0gRW50cnlQb2ludC5wYXJzZV9tYXAoc2VsZi5kaXN0cmlidXRpb24uZW50cnlfcG9pbnRzIG9yICcnKQogICAgICAgIGVwID0gZXBtLmdldCgnc2V0dXB0b29scy5pbnN0YWxsYXRpb24nLCB7fSkuZ2V0KCdlZ2dzZWN1dGFibGUnKQogICAgICAgIGlmIGVwIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiAndycgICMgbm90IGFuIGVnZ3NlY3V0YWJsZSwgZG8gaXQgdGhlIHVzdWFsIHdheS4KCiAgICAgICAgaWYgbm90IGVwLmF0dHJzIG9yIGVwLmV4dHJhczoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICJlZ2dzZWN1dGFibGUgZW50cnkgcG9pbnQgKCVyKSBjYW5ub3QgaGF2ZSAnZXh0cmFzJyAiCiAgICAgICAgICAgICAgICAib3IgcmVmZXIgdG8gYSBtb2R1bGUiICUgKGVwLCkKICAgICAgICAgICAgKQoKICAgICAgICBweXZlciA9IHN5cy52ZXJzaW9uWzozXQogICAgICAgIHBrZyA9IGVwLm1vZHVsZV9uYW1lCiAgICAgICAgZnVsbCA9ICcuJy5qb2luKGVwLmF0dHJzKQogICAgICAgIGJhc2UgPSBlcC5hdHRyc1swXQogICAgICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShzZWxmLmVnZ19vdXRwdXQpCgogICAgICAgIGhlYWRlciA9ICgKICAgICAgICAgICAgIiMhL2Jpbi9zaFxuIgogICAgICAgICAgICAnaWYgWyBgYmFzZW5hbWUgJDBgID0gIiUoYmFzZW5hbWUpcyIgXVxuJwogICAgICAgICAgICAndGhlbiBleGVjIHB5dGhvbiUocHl2ZXIpcyAtYyAiJwogICAgICAgICAgICAiaW1wb3J0IHN5cywgb3M7IHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmFic3BhdGgoJyQwJykpOyAiCiAgICAgICAgICAgICJmcm9tICUocGtnKXMgaW1wb3J0ICUoYmFzZSlzOyBzeXMuZXhpdCglKGZ1bGwpcygpKSIKICAgICAgICAgICAgJyIgIiRAIlxuJwogICAgICAgICAgICAnZWxzZVxuJwogICAgICAgICAgICAnICBlY2hvICQwIGlzIG5vdCB0aGUgY29ycmVjdCBuYW1lIGZvciB0aGlzIGVnZyBmaWxlLlxuJwogICAgICAgICAgICAnICBlY2hvIFBsZWFzZSByZW5hbWUgaXQgYmFjayB0byAlKGJhc2VuYW1lKXMgYW5kIHRyeSBhZ2Fpbi5cbicKICAgICAgICAgICAgJyAgZXhlYyBmYWxzZVxuJwogICAgICAgICAgICAnZmlcbicKICAgICAgICApICUgbG9jYWxzKCkKCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgbWtwYXRoKG9zLnBhdGguZGlybmFtZShzZWxmLmVnZ19vdXRwdXQpLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi5lZ2dfb3V0cHV0LCAndycpCiAgICAgICAgICAgIGYud3JpdGUoaGVhZGVyKQogICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICByZXR1cm4gJ2EnCgogICAgZGVmIGNvcHlfbWV0YWRhdGFfdG8oc2VsZiwgdGFyZ2V0X2Rpcik6CiAgICAgICAgIkNvcHkgbWV0YWRhdGEgKGVnZyBpbmZvKSB0byB0aGUgdGFyZ2V0X2RpciIKICAgICAgICAjIG5vcm1hbGl6ZSB0aGUgcGF0aCAoc28gdGhhdCBhIGZvcndhcmQtc2xhc2ggaW4gZWdnX2luZm8gd2lsbAogICAgICAgICMgbWF0Y2ggdXNpbmcgc3RhcnRzd2l0aCBiZWxvdykKICAgICAgICBub3JtX2VnZ19pbmZvID0gb3MucGF0aC5ub3JtcGF0aChzZWxmLmVnZ19pbmZvKQogICAgICAgIHByZWZpeCA9IG9zLnBhdGguam9pbihub3JtX2VnZ19pbmZvLCAnJykKICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLmVpX2NtZC5maWxlbGlzdC5maWxlczoKICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKHByZWZpeCk6CiAgICAgICAgICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4odGFyZ2V0X2RpciwgcGF0aFtsZW4ocHJlZml4KTpdKQogICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCiAgICAgICAgICAgICAgICBzZWxmLmNvcHlfZmlsZShwYXRoLCB0YXJnZXQpCgogICAgZGVmIGdldF9leHRfb3V0cHV0cyhzZWxmKToKICAgICAgICAiIiJHZXQgYSBsaXN0IG9mIHJlbGF0aXZlIHBhdGhzIHRvIEMgZXh0ZW5zaW9ucyBpbiB0aGUgb3V0cHV0IGRpc3RybyIiIgoKICAgICAgICBhbGxfb3V0cHV0cyA9IFtdCiAgICAgICAgZXh0X291dHB1dHMgPSBbXQoKICAgICAgICBwYXRocyA9IHtzZWxmLmJkaXN0X2RpcjogJyd9CiAgICAgICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIHNvcnRlZF93YWxrKHNlbGYuYmRpc3RfZGlyKToKICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSlbMV0ubG93ZXIoKSBpbiBOQVRJVkVfRVhURU5TSU9OUzoKICAgICAgICAgICAgICAgICAgICBhbGxfb3V0cHV0cy5hcHBlbmQocGF0aHNbYmFzZV0gKyBmaWxlbmFtZSkKICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGRpcnM6CiAgICAgICAgICAgICAgICBwYXRoc1tvcy5wYXRoLmpvaW4oYmFzZSwgZmlsZW5hbWUpXSA9IChwYXRoc1tiYXNlXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSArICcvJykKCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCk6CiAgICAgICAgICAgIGJ1aWxkX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9leHQnKQogICAgICAgICAgICBmb3IgZXh0IGluIGJ1aWxkX2NtZC5leHRlbnNpb25zOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsIExpYnJhcnkpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IGJ1aWxkX2NtZC5nZXRfZXh0X2Z1bGxuYW1lKGV4dC5uYW1lKQogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBidWlsZF9jbWQuZ2V0X2V4dF9maWxlbmFtZShmdWxsbmFtZSkKICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKS5zdGFydHN3aXRoKCdkbC0nKToKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oc2VsZi5iZGlzdF9kaXIsIGZpbGVuYW1lKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGV4dF9vdXRwdXRzLmFwcGVuZChmaWxlbmFtZSkKCiAgICAgICAgcmV0dXJuIGFsbF9vdXRwdXRzLCBleHRfb3V0cHV0cwoKCk5BVElWRV9FWFRFTlNJT05TID0gZGljdC5mcm9ta2V5cygnLmRsbCAuc28gLmR5bGliIC5weWQnLnNwbGl0KCkpCgoKZGVmIHdhbGtfZWdnKGVnZ19kaXIpOgogICAgIiIiV2FsayBhbiB1bnBhY2tlZCBlZ2cncyBjb250ZW50cywgc2tpcHBpbmcgdGhlIG1ldGFkYXRhIGRpcmVjdG9yeSIiIgogICAgd2Fsa2VyID0gc29ydGVkX3dhbGsoZWdnX2RpcikKICAgIGJhc2UsIGRpcnMsIGZpbGVzID0gbmV4dCh3YWxrZXIpCiAgICBpZiAnRUdHLUlORk8nIGluIGRpcnM6CiAgICAgICAgZGlycy5yZW1vdmUoJ0VHRy1JTkZPJykKICAgIHlpZWxkIGJhc2UsIGRpcnMsIGZpbGVzCiAgICBmb3IgYmRmIGluIHdhbGtlcjoKICAgICAgICB5aWVsZCBiZGYKCgpkZWYgYW5hbHl6ZV9lZ2coZWdnX2Rpciwgc3R1YnMpOgogICAgIyBjaGVjayBmb3IgZXhpc3RpbmcgZmxhZyBpbiBFR0ctSU5GTwogICAgZm9yIGZsYWcsIGZuIGluIHNhZmV0eV9mbGFncy5pdGVtcygpOgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihlZ2dfZGlyLCAnRUdHLUlORk8nLCBmbikpOgogICAgICAgICAgICByZXR1cm4gZmxhZwogICAgaWYgbm90IGNhbl9zY2FuKCk6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBzYWZlID0gVHJ1ZQogICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIHdhbGtfZWdnKGVnZ19kaXIpOgogICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgogICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcucHknKSBvciBuYW1lLmVuZHN3aXRoKCcucHl3Jyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBlbGlmIG5hbWUuZW5kc3dpdGgoJy5weWMnKSBvciBuYW1lLmVuZHN3aXRoKCcucHlvJyk6CiAgICAgICAgICAgICAgICAjIGFsd2F5cyBzY2FuLCBldmVuIGlmIHdlIGFscmVhZHkga25vdyB3ZSdyZSBub3Qgc2FmZQogICAgICAgICAgICAgICAgc2FmZSA9IHNjYW5fbW9kdWxlKGVnZ19kaXIsIGJhc2UsIG5hbWUsIHN0dWJzKSBhbmQgc2FmZQogICAgcmV0dXJuIHNhZmUKCgpkZWYgd3JpdGVfc2FmZXR5X2ZsYWcoZWdnX2Rpciwgc2FmZSk6CiAgICAjIFdyaXRlIG9yIHJlbW92ZSB6aXAgc2FmZXR5IGZsYWcgZmlsZShzKQogICAgZm9yIGZsYWcsIGZuIGluIHNhZmV0eV9mbGFncy5pdGVtcygpOgogICAgICAgIGZuID0gb3MucGF0aC5qb2luKGVnZ19kaXIsIGZuKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZuKToKICAgICAgICAgICAgaWYgc2FmZSBpcyBOb25lIG9yIGJvb2woc2FmZSkgIT0gZmxhZzoKICAgICAgICAgICAgICAgIG9zLnVubGluayhmbikKICAgICAgICBlbGlmIHNhZmUgaXMgbm90IE5vbmUgYW5kIGJvb2woc2FmZSkgPT0gZmxhZzoKICAgICAgICAgICAgZiA9IG9wZW4oZm4sICd3dCcpCiAgICAgICAgICAgIGYud3JpdGUoJ1xuJykKICAgICAgICAgICAgZi5jbG9zZSgpCgoKc2FmZXR5X2ZsYWdzID0gewogICAgVHJ1ZTogJ3ppcC1zYWZlJywKICAgIEZhbHNlOiAnbm90LXppcC1zYWZlJywKfQoKCmRlZiBzY2FuX21vZHVsZShlZ2dfZGlyLCBiYXNlLCBuYW1lLCBzdHVicyk6CiAgICAiIiJDaGVjayB3aGV0aGVyIG1vZHVsZSBwb3NzaWJseSB1c2VzIHVuc2FmZS1mb3ItemlwZmlsZSBzdHVmZiIiIgoKICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKGJhc2UsIG5hbWUpCiAgICBpZiBmaWxlbmFtZVs6LTFdIGluIHN0dWJzOgogICAgICAgIHJldHVybiBUcnVlICAjIEV4dGVuc2lvbiBtb2R1bGUKICAgIHBrZyA9IGJhc2VbbGVuKGVnZ19kaXIpICsgMTpdLnJlcGxhY2Uob3Muc2VwLCAnLicpCiAgICBtb2R1bGUgPSBwa2cgKyAocGtnIGFuZCAnLicgb3IgJycpICsgb3MucGF0aC5zcGxpdGV4dChuYW1lKVswXQogICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzKToKICAgICAgICBza2lwID0gOCAgIyBza2lwIG1hZ2ljICYgZGF0ZQogICAgZWxzZToKICAgICAgICBza2lwID0gMTIgICMgc2tpcCBtYWdpYyAmIGRhdGUgJiBmaWxlIHNpemUKICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAncmInKQogICAgZi5yZWFkKHNraXApCiAgICBjb2RlID0gbWFyc2hhbC5sb2FkKGYpCiAgICBmLmNsb3NlKCkKICAgIHNhZmUgPSBUcnVlCiAgICBzeW1ib2xzID0gZGljdC5mcm9ta2V5cyhpdGVyX3N5bWJvbHMoY29kZSkpCiAgICBmb3IgYmFkIGluIFsnX19maWxlX18nLCAnX19wYXRoX18nXToKICAgICAgICBpZiBiYWQgaW4gc3ltYm9sczoKICAgICAgICAgICAgbG9nLndhcm4oIiVzOiBtb2R1bGUgcmVmZXJlbmNlcyAlcyIsIG1vZHVsZSwgYmFkKQogICAgICAgICAgICBzYWZlID0gRmFsc2UKICAgIGlmICdpbnNwZWN0JyBpbiBzeW1ib2xzOgogICAgICAgIGZvciBiYWQgaW4gWwogICAgICAgICAgICAnZ2V0c291cmNlJywgJ2dldGFic2ZpbGUnLCAnZ2V0c291cmNlZmlsZScsICdnZXRmaWxlJwogICAgICAgICAgICAnZ2V0c291cmNlbGluZXMnLCAnZmluZHNvdXJjZScsICdnZXRjb21tZW50cycsICdnZXRmcmFtZWluZm8nLAogICAgICAgICAgICAnZ2V0aW5uZXJmcmFtZXMnLCAnZ2V0b3V0ZXJmcmFtZXMnLCAnc3RhY2snLCAndHJhY2UnCiAgICAgICAgXToKICAgICAgICAgICAgaWYgYmFkIGluIHN5bWJvbHM6CiAgICAgICAgICAgICAgICBsb2cud2FybigiJXM6IG1vZHVsZSBNQVkgYmUgdXNpbmcgaW5zcGVjdC4lcyIsIG1vZHVsZSwgYmFkKQogICAgICAgICAgICAgICAgc2FmZSA9IEZhbHNlCiAgICByZXR1cm4gc2FmZQoKCmRlZiBpdGVyX3N5bWJvbHMoY29kZSk6CiAgICAiIiJZaWVsZCBuYW1lcyBhbmQgc3RyaW5ncyB1c2VkIGJ5IGBjb2RlYCBhbmQgaXRzIG5lc3RlZCBjb2RlIG9iamVjdHMiIiIKICAgIGZvciBuYW1lIGluIGNvZGUuY29fbmFtZXM6CiAgICAgICAgeWllbGQgbmFtZQogICAgZm9yIGNvbnN0IGluIGNvZGUuY29fY29uc3RzOgogICAgICAgIGlmIGlzaW5zdGFuY2UoY29uc3QsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB5aWVsZCBjb25zdAogICAgICAgIGVsaWYgaXNpbnN0YW5jZShjb25zdCwgQ29kZVR5cGUpOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBpdGVyX3N5bWJvbHMoY29uc3QpOgogICAgICAgICAgICAgICAgeWllbGQgbmFtZQoKCmRlZiBjYW5fc2NhbigpOgogICAgaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJykgYW5kIHN5cy5wbGF0Zm9ybSAhPSAnY2xpJzoKICAgICAgICAjIENQeXRob24sIFB5UHksIGV0Yy4KICAgICAgICByZXR1cm4gVHJ1ZQogICAgbG9nLndhcm4oIlVuYWJsZSB0byBhbmFseXplIGNvbXBpbGVkIGNvZGUgb24gdGhpcyBwbGF0Zm9ybS4iKQogICAgbG9nLndhcm4oIlBsZWFzZSBhc2sgdGhlIGF1dGhvciB0byBpbmNsdWRlIGEgJ3ppcF9zYWZlJyIKICAgICAgICAgICAgICIgc2V0dGluZyAoZWl0aGVyIFRydWUgb3IgRmFsc2UpIGluIHRoZSBwYWNrYWdlJ3Mgc2V0dXAucHkiKQoKCiMgQXR0cmlidXRlIG5hbWVzIG9mIG9wdGlvbnMgZm9yIGNvbW1hbmRzIHRoYXQgbWlnaHQgbmVlZCB0byBiZSBjb252aW5jZWQgdG8KIyBpbnN0YWxsIHRvIHRoZSBlZ2cgYnVpbGQgZGlyZWN0b3J5CgpJTlNUQUxMX0RJUkVDVE9SWV9BVFRSUyA9IFsKICAgICdpbnN0YWxsX2xpYicsICdpbnN0YWxsX2RpcicsICdpbnN0YWxsX2RhdGEnLCAnaW5zdGFsbF9iYXNlJwpdCgoKZGVmIG1ha2VfemlwZmlsZSh6aXBfZmlsZW5hbWUsIGJhc2VfZGlyLCB2ZXJib3NlPTAsIGRyeV9ydW49MCwgY29tcHJlc3M9VHJ1ZSwKICAgICAgICAgICAgICAgICBtb2RlPSd3Jyk6CiAgICAiIiJDcmVhdGUgYSB6aXAgZmlsZSBmcm9tIGFsbCB0aGUgZmlsZXMgdW5kZXIgJ2Jhc2VfZGlyJy4gIFRoZSBvdXRwdXQKICAgIHppcCBmaWxlIHdpbGwgYmUgbmFtZWQgJ2Jhc2VfZGlyJyArICIuemlwIi4gIFVzZXMgZWl0aGVyIHRoZSAiemlwZmlsZSIKICAgIFB5dGhvbiBtb2R1bGUgKGlmIGF2YWlsYWJsZSkgb3IgdGhlIEluZm9aSVAgInppcCIgdXRpbGl0eSAoaWYgaW5zdGFsbGVkCiAgICBhbmQgZm91bmQgb24gdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGgpLiAgSWYgbmVpdGhlciB0b29sIGlzIGF2YWlsYWJsZSwKICAgIHJhaXNlcyBEaXN0dXRpbHNFeGVjRXJyb3IuICBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgemlwIGZpbGUuCiAgICAiIiIKICAgIGltcG9ydCB6aXBmaWxlCgogICAgbWtwYXRoKG9zLnBhdGguZGlybmFtZSh6aXBfZmlsZW5hbWUpLCBkcnlfcnVuPWRyeV9ydW4pCiAgICBsb2cuaW5mbygiY3JlYXRpbmcgJyVzJyBhbmQgYWRkaW5nICclcycgdG8gaXQiLCB6aXBfZmlsZW5hbWUsIGJhc2VfZGlyKQoKICAgIGRlZiB2aXNpdCh6LCBkaXJuYW1lLCBuYW1lcyk6CiAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihkaXJuYW1lLCBuYW1lKSkKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CiAgICAgICAgICAgICAgICBwID0gcGF0aFtsZW4oYmFzZV9kaXIpICsgMTpdCiAgICAgICAgICAgICAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICAgICAgICAgICAgICB6LndyaXRlKHBhdGgsIHApCiAgICAgICAgICAgICAgICBsb2cuZGVidWcoImFkZGluZyAnJXMnIiwgcCkKCiAgICBjb21wcmVzc2lvbiA9IHppcGZpbGUuWklQX0RFRkxBVEVEIGlmIGNvbXByZXNzIGVsc2UgemlwZmlsZS5aSVBfU1RPUkVECiAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICB6ID0gemlwZmlsZS5aaXBGaWxlKHppcF9maWxlbmFtZSwgbW9kZSwgY29tcHJlc3Npb249Y29tcHJlc3Npb24pCiAgICAgICAgZm9yIGRpcm5hbWUsIGRpcnMsIGZpbGVzIGluIHNvcnRlZF93YWxrKGJhc2VfZGlyKToKICAgICAgICAgICAgdmlzaXQoeiwgZGlybmFtZSwgZmlsZXMpCiAgICAgICAgei5jbG9zZSgpCiAgICBlbHNlOgogICAgICAgIGZvciBkaXJuYW1lLCBkaXJzLCBmaWxlcyBpbiBzb3J0ZWRfd2FsayhiYXNlX2Rpcik6CiAgICAgICAgICAgIHZpc2l0KE5vbmUsIGRpcm5hbWUsIGZpbGVzKQogICAgcmV0dXJuIHppcF9maWxlbmFtZQpQSwMEFAAAAAAAAAAhAOvSdBbkBQAA5AUAADcAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfcnBtLnB5aW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X3JwbSBhcyBvcmlnCgoKY2xhc3MgYmRpc3RfcnBtKG9yaWcuYmRpc3RfcnBtKToKICAgICIiIgogICAgT3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmRpc3RfcnBtIGJlaGF2aW9yIHRvIGRvIHRoZSBmb2xsb3dpbmc6CgogICAgMS4gUnVuIGVnZ19pbmZvIHRvIGVuc3VyZSB0aGUgbmFtZSBhbmQgdmVyc2lvbiBhcmUgcHJvcGVybHkgY2FsY3VsYXRlZC4KICAgIDIuIEFsd2F5cyBydW4gJ2luc3RhbGwnIHVzaW5nIC0tc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkIHRvCiAgICAgICBkaXNhYmxlIGVnZ3MgaW4gUlBNIGRpc3RyaWJ1dGlvbnMuCiAgICAzLiBSZXBsYWNlIGRhc2ggd2l0aCB1bmRlcnNjb3JlIGluIHRoZSB2ZXJzaW9uIG51bWJlcnMgZm9yIGJldHRlciBSUE0KICAgICAgIGNvbXBhdGliaWxpdHkuCiAgICAiIiIKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICMgZW5zdXJlIGRpc3RybyBuYW1lIGlzIHVwLXRvLWRhdGUKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCgogICAgICAgIG9yaWcuYmRpc3RfcnBtLnJ1bihzZWxmKQoKICAgIGRlZiBfbWFrZV9zcGVjX2ZpbGUoc2VsZik6CiAgICAgICAgdmVyc2lvbiA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCkKICAgICAgICBycG12ZXJzaW9uID0gdmVyc2lvbi5yZXBsYWNlKCctJywgJ18nKQogICAgICAgIHNwZWMgPSBvcmlnLmJkaXN0X3JwbS5fbWFrZV9zcGVjX2ZpbGUoc2VsZikKICAgICAgICBsaW5lMjMgPSAnJWRlZmluZSB2ZXJzaW9uICcgKyB2ZXJzaW9uCiAgICAgICAgbGluZTI0ID0gJyVkZWZpbmUgdmVyc2lvbiAnICsgcnBtdmVyc2lvbgogICAgICAgIHNwZWMgPSBbCiAgICAgICAgICAgIGxpbmUucmVwbGFjZSgKICAgICAgICAgICAgICAgICJTb3VyY2UwOiAle25hbWV9LSV7dmVyc2lvbn0udGFyIiwKICAgICAgICAgICAgICAgICJTb3VyY2UwOiAle25hbWV9LSV7dW5tYW5nbGVkX3ZlcnNpb259LnRhciIKICAgICAgICAgICAgKS5yZXBsYWNlKAogICAgICAgICAgICAgICAgInNldHVwLnB5IGluc3RhbGwgIiwKICAgICAgICAgICAgICAgICJzZXR1cC5weSBpbnN0YWxsIC0tc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkICIKICAgICAgICAgICAgKS5yZXBsYWNlKAogICAgICAgICAgICAgICAgIiVzZXR1cCIsCiAgICAgICAgICAgICAgICAiJXNldHVwIC1uICV7bmFtZX0tJXt1bm1hbmdsZWRfdmVyc2lvbn0iCiAgICAgICAgICAgICkucmVwbGFjZShsaW5lMjMsIGxpbmUyNCkKICAgICAgICAgICAgZm9yIGxpbmUgaW4gc3BlYwogICAgICAgIF0KICAgICAgICBpbnNlcnRfbG9jID0gc3BlYy5pbmRleChsaW5lMjQpICsgMQogICAgICAgIHVubWFuZ2xlZF92ZXJzaW9uID0gIiVkZWZpbmUgdW5tYW5nbGVkX3ZlcnNpb24gIiArIHZlcnNpb24KICAgICAgICBzcGVjLmluc2VydChpbnNlcnRfbG9jLCB1bm1hbmdsZWRfdmVyc2lvbikKICAgICAgICByZXR1cm4gc3BlYwpQSwMEFAAAAAAAAAAhACCMdRR9AgAAfQIAADsAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weWltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF93aW5pbnN0IGFzIG9yaWcKCgpjbGFzcyBiZGlzdF93aW5pbnN0KG9yaWcuYmRpc3Rfd2luaW5zdCk6CiAgICBkZWYgcmVpbml0aWFsaXplX2NvbW1hbmQoc2VsZiwgY29tbWFuZCwgcmVpbml0X3N1YmNvbW1hbmRzPTApOgogICAgICAgICIiIgogICAgICAgIFN1cHBsZW1lbnQgcmVpbml0aWFsaXplX2NvbW1hbmQgdG8gd29yayBhcm91bmQKICAgICAgICBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjA4MTkKICAgICAgICAiIiIKICAgICAgICBjbWQgPSBzZWxmLmRpc3RyaWJ1dGlvbi5yZWluaXRpYWxpemVfY29tbWFuZCgKICAgICAgICAgICAgY29tbWFuZCwgcmVpbml0X3N1YmNvbW1hbmRzKQogICAgICAgIGlmIGNvbW1hbmQgaW4gKCdpbnN0YWxsJywgJ2luc3RhbGxfbGliJyk6CiAgICAgICAgICAgIGNtZC5pbnN0YWxsX2xpYiA9IE5vbmUKICAgICAgICByZXR1cm4gY21kCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLl9pc19ydW5uaW5nID0gVHJ1ZQogICAgICAgIHRyeToKICAgICAgICAgICAgb3JpZy5iZGlzdF93aW5pbnN0LnJ1bihzZWxmKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNlbGYuX2lzX3J1bm5pbmcgPSBGYWxzZQpQSwMEFAAAAAAAAAAhACcajRuEEQAAhBEAADgAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfY2xpYi5weWltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9jbGliIGFzIG9yaWcKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNTZXR1cEVycm9yCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBzZXR1cHRvb2xzLmRlcF91dGlsIGltcG9ydCBuZXdlcl9wYWlyd2lzZV9ncm91cAoKCmNsYXNzIGJ1aWxkX2NsaWIob3JpZy5idWlsZF9jbGliKToKICAgICIiIgogICAgT3ZlcnJpZGUgdGhlIGRlZmF1bHQgYnVpbGRfY2xpYiBiZWhhdmlvdXIgdG8gZG8gdGhlIGZvbGxvd2luZzoKCiAgICAxLiBJbXBsZW1lbnQgYSBydWRpbWVudGFyeSB0aW1lc3RhbXAtYmFzZWQgZGVwZW5kZW5jeSBzeXN0ZW0KICAgICAgIHNvICdjb21waWxlKCknIGRvZXNuJ3QgcnVuIGV2ZXJ5IHRpbWUuCiAgICAyLiBBZGQgbW9yZSBrZXlzIHRvIHRoZSAnYnVpbGRfaW5mbycgZGljdGlvbmFyeToKICAgICAgICAqIG9ial9kZXBzIC0gc3BlY2lmeSBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggb2JqZWN0IGNvbXBpbGVkLgogICAgICAgICAgICAgICAgICAgICB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgbWFwcGluZyBhIGtleQogICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBzb3VyY2UgZmlsZW5hbWUgdG8gYSBsaXN0IG9mCiAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy4gVXNlIGFuIGVtcHR5IHN0cmluZyBmb3IgZ2xvYmFsCiAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy4KICAgICAgICAqIGNmbGFncyAgIC0gc3BlY2lmeSBhIGxpc3Qgb2YgYWRkaXRpb25hbCBmbGFncyB0byBwYXNzIHRvCiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21waWxlci4KICAgICIiIgoKICAgIGRlZiBidWlsZF9saWJyYXJpZXMoc2VsZiwgbGlicmFyaWVzKToKICAgICAgICBmb3IgKGxpYl9uYW1lLCBidWlsZF9pbmZvKSBpbiBsaWJyYXJpZXM6CiAgICAgICAgICAgIHNvdXJjZXMgPSBidWlsZF9pbmZvLmdldCgnc291cmNlcycpCiAgICAgICAgICAgIGlmIHNvdXJjZXMgaXMgTm9uZSBvciBub3QgaXNpbnN0YW5jZShzb3VyY2VzLCAobGlzdCwgdHVwbGUpKToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgImluICdsaWJyYXJpZXMnIG9wdGlvbiAobGlicmFyeSAnJXMnKSwgIgogICAgICAgICAgICAgICAgICAgICAgICInc291cmNlcycgbXVzdCBiZSBwcmVzZW50IGFuZCBtdXN0IGJlICIKICAgICAgICAgICAgICAgICAgICAgICAiYSBsaXN0IG9mIHNvdXJjZSBmaWxlbmFtZXMiICUgbGliX25hbWUpCiAgICAgICAgICAgIHNvdXJjZXMgPSBsaXN0KHNvdXJjZXMpCgogICAgICAgICAgICBsb2cuaW5mbygiYnVpbGRpbmcgJyVzJyBsaWJyYXJ5IiwgbGliX25hbWUpCgogICAgICAgICAgICAjIE1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHRoZSBjb3JyZWN0IHR5cGUuCiAgICAgICAgICAgICMgb2JqX2RlcHMgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBvZiBrZXlzIGFzIHNvdXJjZXMKICAgICAgICAgICAgIyBhbmQgYSBsaXN0L3R1cGxlIG9mIGZpbGVzIHRoYXQgYXJlIGl0cyBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgIG9ial9kZXBzID0gYnVpbGRfaW5mby5nZXQoJ29ial9kZXBzJywgZGljdCgpKQogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvYmpfZGVwcywgZGljdCk6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICJpbiAnbGlicmFyaWVzJyBvcHRpb24gKGxpYnJhcnkgJyVzJyksICIKICAgICAgICAgICAgICAgICAgICAgICAiJ29ial9kZXBzJyBtdXN0IGJlIGEgZGljdGlvbmFyeSBvZiAiCiAgICAgICAgICAgICAgICAgICAgICAgInR5cGUgJ3NvdXJjZTogbGlzdCciICUgbGliX25hbWUpCiAgICAgICAgICAgIGRlcGVuZGVuY2llcyA9IFtdCgogICAgICAgICAgICAjIEdldCB0aGUgZ2xvYmFsIGRlcGVuZGVuY2llcyB0aGF0IGFyZSBzcGVjaWZpZWQgYnkgdGhlICcnIGtleS4KICAgICAgICAgICAgIyBUaGVzZSB3aWxsIGdvIGludG8gZXZlcnkgc291cmNlJ3MgZGVwZW5kZW5jeSBsaXN0LgogICAgICAgICAgICBnbG9iYWxfZGVwcyA9IG9ial9kZXBzLmdldCgnJywgbGlzdCgpKQogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShnbG9iYWxfZGVwcywgKGxpc3QsIHR1cGxlKSk6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICJpbiAnbGlicmFyaWVzJyBvcHRpb24gKGxpYnJhcnkgJyVzJyksICIKICAgICAgICAgICAgICAgICAgICAgICAiJ29ial9kZXBzJyBtdXN0IGJlIGEgZGljdGlvbmFyeSBvZiAiCiAgICAgICAgICAgICAgICAgICAgICAgInR5cGUgJ3NvdXJjZTogbGlzdCciICUgbGliX25hbWUpCgogICAgICAgICAgICAjIEJ1aWxkIHRoZSBsaXN0IHRvIGJlIHVzZWQgYnkgbmV3ZXJfcGFpcndpc2VfZ3JvdXAKICAgICAgICAgICAgIyBlYWNoIHNvdXJjZSB3aWxsIGJlIGF1dG8tYWRkZWQgdG8gaXRzIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgZm9yIHNvdXJjZSBpbiBzb3VyY2VzOgogICAgICAgICAgICAgICAgc3JjX2RlcHMgPSBbc291cmNlXQogICAgICAgICAgICAgICAgc3JjX2RlcHMuZXh0ZW5kKGdsb2JhbF9kZXBzKQogICAgICAgICAgICAgICAgZXh0cmFfZGVwcyA9IG9ial9kZXBzLmdldChzb3VyY2UsIGxpc3QoKSkKICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4dHJhX2RlcHMsIChsaXN0LCB0dXBsZSkpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiAnbGlicmFyaWVzJyBvcHRpb24gKGxpYnJhcnkgJyVzJyksICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIidvYmpfZGVwcycgbXVzdCBiZSBhIGRpY3Rpb25hcnkgb2YgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSAnc291cmNlOiBsaXN0JyIgJSBsaWJfbmFtZSkKICAgICAgICAgICAgICAgIHNyY19kZXBzLmV4dGVuZChleHRyYV9kZXBzKQogICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmFwcGVuZChzcmNfZGVwcykKCiAgICAgICAgICAgIGV4cGVjdGVkX29iamVjdHMgPSBzZWxmLmNvbXBpbGVyLm9iamVjdF9maWxlbmFtZXMoCiAgICAgICAgICAgICAgICAgICAgc291cmNlcywKICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPXNlbGYuYnVpbGRfdGVtcAogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgIGlmIG5ld2VyX3BhaXJ3aXNlX2dyb3VwKGRlcGVuZGVuY2llcywgZXhwZWN0ZWRfb2JqZWN0cykgIT0gKFtdLCBbXSk6CiAgICAgICAgICAgICAgICAjIEZpcnN0LCBjb21waWxlIHRoZSBzb3VyY2UgY29kZSB0byBvYmplY3QgZmlsZXMgaW4gdGhlIGxpYnJhcnkKICAgICAgICAgICAgICAgICMgZGlyZWN0b3J5LiAgKFRoaXMgc2hvdWxkIHByb2JhYmx5IGNoYW5nZSB0byBwdXR0aW5nIG9iamVjdAogICAgICAgICAgICAgICAgIyBmaWxlcyBpbiBhIHRlbXBvcmFyeSBidWlsZCBkaXJlY3RvcnkuKQogICAgICAgICAgICAgICAgbWFjcm9zID0gYnVpbGRfaW5mby5nZXQoJ21hY3JvcycpCiAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnMgPSBidWlsZF9pbmZvLmdldCgnaW5jbHVkZV9kaXJzJykKICAgICAgICAgICAgICAgIGNmbGFncyA9IGJ1aWxkX2luZm8uZ2V0KCdjZmxhZ3MnKQogICAgICAgICAgICAgICAgb2JqZWN0cyA9IHNlbGYuY29tcGlsZXIuY29tcGlsZSgKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcywKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1zZWxmLmJ1aWxkX3RlbXAsCiAgICAgICAgICAgICAgICAgICAgICAgIG1hY3Jvcz1tYWNyb3MsCiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycz1pbmNsdWRlX2RpcnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX3Bvc3RhcmdzPWNmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc9c2VsZi5kZWJ1ZwogICAgICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAjIE5vdyAibGluayIgdGhlIG9iamVjdCBmaWxlcyB0b2dldGhlciBpbnRvIGEgc3RhdGljIGxpYnJhcnkuCiAgICAgICAgICAgICMgKE9uIFVuaXggYXQgbGVhc3QsIHRoaXMgaXNuJ3QgcmVhbGx5IGxpbmtpbmcgLS0gaXQganVzdAogICAgICAgICAgICAjIGJ1aWxkcyBhbiBhcmNoaXZlLiAgV2hhdGV2ZXIuKQogICAgICAgICAgICBzZWxmLmNvbXBpbGVyLmNyZWF0ZV9zdGF0aWNfbGliKAogICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX29iamVjdHMsCiAgICAgICAgICAgICAgICAgICAgbGliX25hbWUsCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1zZWxmLmJ1aWxkX2NsaWIsCiAgICAgICAgICAgICAgICAgICAgZGVidWc9c2VsZi5kZWJ1ZwogICAgICAgICAgICAgICAgICAgICkKUEsDBBQAAAAAAAAAIQCRpWnn+TIAAPkyAAA3AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2V4dC5weWltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IGltcApmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0IGFzIF9kdV9idWlsZF9leHQKZnJvbSBkaXN0dXRpbHMuZmlsZV91dGlsIGltcG9ydCBjb3B5X2ZpbGUKZnJvbSBkaXN0dXRpbHMuY2NvbXBpbGVyIGltcG9ydCBuZXdfY29tcGlsZXIKZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBjdXN0b21pemVfY29tcGlsZXIsIGdldF9jb25maWdfdmFyCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVuc2lvbiBpbXBvcnQgTGlicmFyeQpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCnRyeToKICAgICMgQXR0ZW1wdCB0byB1c2UgQ3l0aG9uIGZvciBidWlsZGluZyBleHRlbnNpb25zLCBpZiBhdmFpbGFibGUKICAgIGZyb20gQ3l0aG9uLkRpc3R1dGlscy5idWlsZF9leHQgaW1wb3J0IGJ1aWxkX2V4dCBhcyBfYnVpbGRfZXh0CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIF9idWlsZF9leHQgPSBfZHVfYnVpbGRfZXh0CgojIG1ha2Ugc3VyZSBfY29uZmlnX3ZhcnMgaXMgaW5pdGlhbGl6ZWQKZ2V0X2NvbmZpZ192YXIoIkxEU0hBUkVEIikKZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBfY29uZmlnX3ZhcnMgYXMgX0NPTkZJR19WQVJTCgoKZGVmIF9jdXN0b21pemVfY29tcGlsZXJfZm9yX3NobGliKGNvbXBpbGVyKToKICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgICAgICAjIGJ1aWxkaW5nIC5keWxpYiByZXF1aXJlcyBhZGRpdGlvbmFsIGNvbXBpbGVyIGZsYWdzIG9uIE9TWDsgaGVyZSB3ZQogICAgICAgICMgdGVtcG9yYXJpbHkgc3Vic3RpdHV0ZSB0aGUgcHljb25maWcuaCB2YXJpYWJsZXMgc28gdGhhdCBkaXN0dXRpbHMnCiAgICAgICAgIyAnY3VzdG9taXplX2NvbXBpbGVyJyB1c2VzIHRoZW0gYmVmb3JlIHdlIGJ1aWxkIHRoZSBzaGFyZWQgbGlicmFyaWVzLgogICAgICAgIHRtcCA9IF9DT05GSUdfVkFSUy5jb3B5KCkKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgWFhYIEhlbHAhICBJIGRvbid0IGhhdmUgYW55IGlkZWEgd2hldGhlciB0aGVzZSBhcmUgcmlnaHQuLi4KICAgICAgICAgICAgX0NPTkZJR19WQVJTWydMRFNIQVJFRCddID0gKAogICAgICAgICAgICAgICAgImdjYyAtV2wsLXggLWR5bmFtaWNsaWIgLXVuZGVmaW5lZCBkeW5hbWljX2xvb2t1cCIpCiAgICAgICAgICAgIF9DT05GSUdfVkFSU1snQ0NTSEFSRUQnXSA9ICIgLWR5bmFtaWNsaWIiCiAgICAgICAgICAgIF9DT05GSUdfVkFSU1snU08nXSA9ICIuZHlsaWIiCiAgICAgICAgICAgIGN1c3RvbWl6ZV9jb21waWxlcihjb21waWxlcikKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBfQ09ORklHX1ZBUlMuY2xlYXIoKQogICAgICAgICAgICBfQ09ORklHX1ZBUlMudXBkYXRlKHRtcCkKICAgIGVsc2U6CiAgICAgICAgY3VzdG9taXplX2NvbXBpbGVyKGNvbXBpbGVyKQoKCmhhdmVfcnRsZCA9IEZhbHNlCnVzZV9zdHVicyA9IEZhbHNlCmxpYnR5cGUgPSAnc2hhcmVkJwoKaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgdXNlX3N0dWJzID0gVHJ1ZQplbGlmIG9zLm5hbWUgIT0gJ250JzoKICAgIHRyeToKICAgICAgICBpbXBvcnQgZGwKICAgICAgICB1c2Vfc3R1YnMgPSBoYXZlX3J0bGQgPSBoYXNhdHRyKGRsLCAnUlRMRF9OT1cnKQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHBhc3MKCmlmX2RsID0gbGFtYmRhIHM6IHMgaWYgaGF2ZV9ydGxkIGVsc2UgJycKCgpkZWYgZ2V0X2FiaTNfc3VmZml4KCk6CiAgICAiIiJSZXR1cm4gdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciBhbiBhYmkzLWNvbXBsaWFudCBFeHRlbnNpb24oKSIiIgogICAgZm9yIHN1ZmZpeCwgXywgXyBpbiAocyBmb3IgcyBpbiBpbXAuZ2V0X3N1ZmZpeGVzKCkgaWYgc1syXSA9PSBpbXAuQ19FWFRFTlNJT04pOgogICAgICAgIGlmICcuYWJpMycgaW4gc3VmZml4OiAgIyBVbml4CiAgICAgICAgICAgIHJldHVybiBzdWZmaXgKICAgICAgICBlbGlmIHN1ZmZpeCA9PSAnLnB5ZCc6ICAjIFdpbmRvd3MKICAgICAgICAgICAgcmV0dXJuIHN1ZmZpeAoKCmNsYXNzIGJ1aWxkX2V4dChfYnVpbGRfZXh0KToKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiQnVpbGQgZXh0ZW5zaW9ucyBpbiBidWlsZCBkaXJlY3RvcnksIHRoZW4gY29weSBpZiAtLWlucGxhY2UiIiIKICAgICAgICBvbGRfaW5wbGFjZSwgc2VsZi5pbnBsYWNlID0gc2VsZi5pbnBsYWNlLCAwCiAgICAgICAgX2J1aWxkX2V4dC5ydW4oc2VsZikKICAgICAgICBzZWxmLmlucGxhY2UgPSBvbGRfaW5wbGFjZQogICAgICAgIGlmIG9sZF9pbnBsYWNlOgogICAgICAgICAgICBzZWxmLmNvcHlfZXh0ZW5zaW9uc190b19zb3VyY2UoKQoKICAgIGRlZiBjb3B5X2V4dGVuc2lvbnNfdG9fc291cmNlKHNlbGYpOgogICAgICAgIGJ1aWxkX3B5ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykKICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9uczoKICAgICAgICAgICAgZnVsbG5hbWUgPSBzZWxmLmdldF9leHRfZnVsbG5hbWUoZXh0Lm5hbWUpCiAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5nZXRfZXh0X2ZpbGVuYW1lKGZ1bGxuYW1lKQogICAgICAgICAgICBtb2RwYXRoID0gZnVsbG5hbWUuc3BsaXQoJy4nKQogICAgICAgICAgICBwYWNrYWdlID0gJy4nLmpvaW4obW9kcGF0aFs6LTFdKQogICAgICAgICAgICBwYWNrYWdlX2RpciA9IGJ1aWxkX3B5LmdldF9wYWNrYWdlX2RpcihwYWNrYWdlKQogICAgICAgICAgICBkZXN0X2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHBhY2thZ2VfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpKQogICAgICAgICAgICBzcmNfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9saWIsIGZpbGVuYW1lKQoKICAgICAgICAgICAgIyBBbHdheXMgY29weSwgZXZlbiBpZiBzb3VyY2UgaXMgb2xkZXIgdGhhbiBkZXN0aW5hdGlvbiwgdG8gZW5zdXJlCiAgICAgICAgICAgICMgdGhhdCB0aGUgcmlnaHQgZXh0ZW5zaW9ucyBmb3IgdGhlIGN1cnJlbnQgUHl0aG9uL3BsYXRmb3JtIGFyZQogICAgICAgICAgICAjIHVzZWQuCiAgICAgICAgICAgIGNvcHlfZmlsZSgKICAgICAgICAgICAgICAgIHNyY19maWxlbmFtZSwgZGVzdF9maWxlbmFtZSwgdmVyYm9zZT1zZWxmLnZlcmJvc2UsCiAgICAgICAgICAgICAgICBkcnlfcnVuPXNlbGYuZHJ5X3J1bgogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIGV4dC5fbmVlZHNfc3R1YjoKICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfc3R1YihwYWNrYWdlX2RpciBvciBvcy5jdXJkaXIsIGV4dCwgVHJ1ZSkKCiAgICBkZWYgZ2V0X2V4dF9maWxlbmFtZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgZmlsZW5hbWUgPSBfYnVpbGRfZXh0LmdldF9leHRfZmlsZW5hbWUoc2VsZiwgZnVsbG5hbWUpCiAgICAgICAgaWYgZnVsbG5hbWUgaW4gc2VsZi5leHRfbWFwOgogICAgICAgICAgICBleHQgPSBzZWxmLmV4dF9tYXBbZnVsbG5hbWVdCiAgICAgICAgICAgIHVzZV9hYmkzID0gKAogICAgICAgICAgICAgICAgc2l4LlBZMwogICAgICAgICAgICAgICAgYW5kIGdldGF0dHIoZXh0LCAncHlfbGltaXRlZF9hcGknKQogICAgICAgICAgICAgICAgYW5kIGdldF9hYmkzX3N1ZmZpeCgpCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgdXNlX2FiaTM6CiAgICAgICAgICAgICAgICBzb19leHQgPSBfZ2V0X2NvbmZpZ192YXJfODM3KCdFWFRfU1VGRklYJykKICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbOi1sZW4oc29fZXh0KV0KICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUgKyBnZXRfYWJpM19zdWZmaXgoKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCwgTGlicmFyeSk6CiAgICAgICAgICAgICAgICBmbiwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSkKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnNobGliX2NvbXBpbGVyLmxpYnJhcnlfZmlsZW5hbWUoZm4sIGxpYnR5cGUpCiAgICAgICAgICAgIGVsaWYgdXNlX3N0dWJzIGFuZCBleHQuX2xpbmtzX3RvX2R5bmFtaWM6CiAgICAgICAgICAgICAgICBkLCBmbiA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpCiAgICAgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKGQsICdkbC0nICsgZm4pCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBfYnVpbGRfZXh0LmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYuc2hsaWJfY29tcGlsZXIgPSBOb25lCiAgICAgICAgc2VsZi5zaGxpYnMgPSBbXQogICAgICAgIHNlbGYuZXh0X21hcCA9IHt9CgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgX2J1aWxkX2V4dC5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5leHRlbnNpb25zID0gc2VsZi5leHRlbnNpb25zIG9yIFtdCiAgICAgICAgc2VsZi5jaGVja19leHRlbnNpb25zX2xpc3Qoc2VsZi5leHRlbnNpb25zKQogICAgICAgIHNlbGYuc2hsaWJzID0gW2V4dCBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9ucwogICAgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LCBMaWJyYXJ5KV0KICAgICAgICBpZiBzZWxmLnNobGliczoKICAgICAgICAgICAgc2VsZi5zZXR1cF9zaGxpYl9jb21waWxlcigpCiAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CiAgICAgICAgICAgIGV4dC5fZnVsbF9uYW1lID0gc2VsZi5nZXRfZXh0X2Z1bGxuYW1lKGV4dC5uYW1lKQogICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zOgogICAgICAgICAgICBmdWxsbmFtZSA9IGV4dC5fZnVsbF9uYW1lCiAgICAgICAgICAgIHNlbGYuZXh0X21hcFtmdWxsbmFtZV0gPSBleHQKCiAgICAgICAgICAgICMgZGlzdHV0aWxzIDMuMSB3aWxsIGFsc28gYXNrIGZvciBtb2R1bGUgbmFtZXMKICAgICAgICAgICAgIyBYWFggd2hhdCB0byBkbyB3aXRoIGNvbmZsaWN0cz8KICAgICAgICAgICAgc2VsZi5leHRfbWFwW2Z1bGxuYW1lLnNwbGl0KCcuJylbLTFdXSA9IGV4dAoKICAgICAgICAgICAgbHRkID0gc2VsZi5zaGxpYnMgYW5kIHNlbGYubGlua3NfdG9fZHluYW1pYyhleHQpIG9yIEZhbHNlCiAgICAgICAgICAgIG5zID0gbHRkIGFuZCB1c2Vfc3R1YnMgYW5kIG5vdCBpc2luc3RhbmNlKGV4dCwgTGlicmFyeSkKICAgICAgICAgICAgZXh0Ll9saW5rc190b19keW5hbWljID0gbHRkCiAgICAgICAgICAgIGV4dC5fbmVlZHNfc3R1YiA9IG5zCiAgICAgICAgICAgIGZpbGVuYW1lID0gZXh0Ll9maWxlX25hbWUgPSBzZWxmLmdldF9leHRfZmlsZW5hbWUoZnVsbG5hbWUpCiAgICAgICAgICAgIGxpYmRpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9saWIsIGZpbGVuYW1lKSkKICAgICAgICAgICAgaWYgbHRkIGFuZCBsaWJkaXIgbm90IGluIGV4dC5saWJyYXJ5X2RpcnM6CiAgICAgICAgICAgICAgICBleHQubGlicmFyeV9kaXJzLmFwcGVuZChsaWJkaXIpCiAgICAgICAgICAgIGlmIGx0ZCBhbmQgdXNlX3N0dWJzIGFuZCBvcy5jdXJkaXIgbm90IGluIGV4dC5ydW50aW1lX2xpYnJhcnlfZGlyczoKICAgICAgICAgICAgICAgIGV4dC5ydW50aW1lX2xpYnJhcnlfZGlycy5hcHBlbmQob3MuY3VyZGlyKQoKICAgIGRlZiBzZXR1cF9zaGxpYl9jb21waWxlcihzZWxmKToKICAgICAgICBjb21waWxlciA9IHNlbGYuc2hsaWJfY29tcGlsZXIgPSBuZXdfY29tcGlsZXIoCiAgICAgICAgICAgIGNvbXBpbGVyPXNlbGYuY29tcGlsZXIsIGRyeV9ydW49c2VsZi5kcnlfcnVuLCBmb3JjZT1zZWxmLmZvcmNlCiAgICAgICAgKQogICAgICAgIF9jdXN0b21pemVfY29tcGlsZXJfZm9yX3NobGliKGNvbXBpbGVyKQoKICAgICAgICBpZiBzZWxmLmluY2x1ZGVfZGlycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgY29tcGlsZXIuc2V0X2luY2x1ZGVfZGlycyhzZWxmLmluY2x1ZGVfZGlycykKICAgICAgICBpZiBzZWxmLmRlZmluZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgIyAnZGVmaW5lJyBvcHRpb24gaXMgYSBsaXN0IG9mIChuYW1lLHZhbHVlKSB0dXBsZXMKICAgICAgICAgICAgZm9yIChuYW1lLCB2YWx1ZSkgaW4gc2VsZi5kZWZpbmU6CiAgICAgICAgICAgICAgICBjb21waWxlci5kZWZpbmVfbWFjcm8obmFtZSwgdmFsdWUpCiAgICAgICAgaWYgc2VsZi51bmRlZiBpcyBub3QgTm9uZToKICAgICAgICAgICAgZm9yIG1hY3JvIGluIHNlbGYudW5kZWY6CiAgICAgICAgICAgICAgICBjb21waWxlci51bmRlZmluZV9tYWNybyhtYWNybykKICAgICAgICBpZiBzZWxmLmxpYnJhcmllcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgY29tcGlsZXIuc2V0X2xpYnJhcmllcyhzZWxmLmxpYnJhcmllcykKICAgICAgICBpZiBzZWxmLmxpYnJhcnlfZGlycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgY29tcGlsZXIuc2V0X2xpYnJhcnlfZGlycyhzZWxmLmxpYnJhcnlfZGlycykKICAgICAgICBpZiBzZWxmLnJwYXRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjb21waWxlci5zZXRfcnVudGltZV9saWJyYXJ5X2RpcnMoc2VsZi5ycGF0aCkKICAgICAgICBpZiBzZWxmLmxpbmtfb2JqZWN0cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgY29tcGlsZXIuc2V0X2xpbmtfb2JqZWN0cyhzZWxmLmxpbmtfb2JqZWN0cykKCiAgICAgICAgIyBoYWNrIHNvIGRpc3R1dGlscycgYnVpbGRfZXh0ZW5zaW9uKCkgYnVpbGRzIGEgbGlicmFyeSBpbnN0ZWFkCiAgICAgICAgY29tcGlsZXIubGlua19zaGFyZWRfb2JqZWN0ID0gbGlua19zaGFyZWRfb2JqZWN0Ll9fZ2V0X18oY29tcGlsZXIpCgogICAgZGVmIGdldF9leHBvcnRfc3ltYm9scyhzZWxmLCBleHQpOgogICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LCBMaWJyYXJ5KToKICAgICAgICAgICAgcmV0dXJuIGV4dC5leHBvcnRfc3ltYm9scwogICAgICAgIHJldHVybiBfYnVpbGRfZXh0LmdldF9leHBvcnRfc3ltYm9scyhzZWxmLCBleHQpCgogICAgZGVmIGJ1aWxkX2V4dGVuc2lvbihzZWxmLCBleHQpOgogICAgICAgIGV4dC5fY29udmVydF9weXhfc291cmNlc190b19sYW5nKCkKICAgICAgICBfY29tcGlsZXIgPSBzZWxmLmNvbXBpbGVyCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCwgTGlicmFyeSk6CiAgICAgICAgICAgICAgICBzZWxmLmNvbXBpbGVyID0gc2VsZi5zaGxpYl9jb21waWxlcgogICAgICAgICAgICBfYnVpbGRfZXh0LmJ1aWxkX2V4dGVuc2lvbihzZWxmLCBleHQpCiAgICAgICAgICAgIGlmIGV4dC5fbmVlZHNfc3R1YjoKICAgICAgICAgICAgICAgIGNtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpLmJ1aWxkX2xpYgogICAgICAgICAgICAgICAgc2VsZi53cml0ZV9zdHViKGNtZCwgZXh0KQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNlbGYuY29tcGlsZXIgPSBfY29tcGlsZXIKCiAgICBkZWYgbGlua3NfdG9fZHluYW1pYyhzZWxmLCBleHQpOgogICAgICAgICIiIlJldHVybiB0cnVlIGlmICdleHQnIGxpbmtzIHRvIGEgZHluYW1pYyBsaWIgaW4gdGhlIHNhbWUgcGFja2FnZSIiIgogICAgICAgICMgWFhYIHRoaXMgc2hvdWxkIGNoZWNrIHRvIGVuc3VyZSB0aGUgbGliIGlzIGFjdHVhbGx5IGJlaW5nIGJ1aWx0CiAgICAgICAgIyBYWFggYXMgZHluYW1pYywgYW5kIG5vdCBqdXN0IHVzaW5nIGEgbG9jYWxseS1mb3VuZCB2ZXJzaW9uIG9yIGEKICAgICAgICAjIFhYWCBzdGF0aWMtY29tcGlsZWQgdmVyc2lvbgogICAgICAgIGxpYm5hbWVzID0gZGljdC5mcm9ta2V5cyhbbGliLl9mdWxsX25hbWUgZm9yIGxpYiBpbiBzZWxmLnNobGlic10pCiAgICAgICAgcGtnID0gJy4nLmpvaW4oZXh0Ll9mdWxsX25hbWUuc3BsaXQoJy4nKVs6LTFdICsgWycnXSkKICAgICAgICByZXR1cm4gYW55KHBrZyArIGxpYm5hbWUgaW4gbGlibmFtZXMgZm9yIGxpYm5hbWUgaW4gZXh0LmxpYnJhcmllcykKCiAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CiAgICAgICAgcmV0dXJuIF9idWlsZF9leHQuZ2V0X291dHB1dHMoc2VsZikgKyBzZWxmLl9fZ2V0X3N0dWJzX291dHB1dHMoKQoKICAgIGRlZiBfX2dldF9zdHVic19vdXRwdXRzKHNlbGYpOgogICAgICAgICMgYXNzZW1ibGUgdGhlIGJhc2UgbmFtZSBmb3IgZWFjaCBleHRlbnNpb24gdGhhdCBuZWVkcyBhIHN0dWIKICAgICAgICBuc19leHRfYmFzZXMgPSAoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2xpYiwgKmV4dC5fZnVsbF9uYW1lLnNwbGl0KCcuJykpCiAgICAgICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zCiAgICAgICAgICAgIGlmIGV4dC5fbmVlZHNfc3R1YgogICAgICAgICkKICAgICAgICAjIHBhaXIgZWFjaCBiYXNlIHdpdGggdGhlIGV4dGVuc2lvbgogICAgICAgIHBhaXJzID0gaXRlcnRvb2xzLnByb2R1Y3QobnNfZXh0X2Jhc2VzLCBzZWxmLl9fZ2V0X291dHB1dF9leHRlbnNpb25zKCkpCiAgICAgICAgcmV0dXJuIGxpc3QoYmFzZSArIGZuZXh0IGZvciBiYXNlLCBmbmV4dCBpbiBwYWlycykKCiAgICBkZWYgX19nZXRfb3V0cHV0X2V4dGVuc2lvbnMoc2VsZik6CiAgICAgICAgeWllbGQgJy5weScKICAgICAgICB5aWVsZCAnLnB5YycKICAgICAgICBpZiBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKS5vcHRpbWl6ZToKICAgICAgICAgICAgeWllbGQgJy5weW8nCgogICAgZGVmIHdyaXRlX3N0dWIoc2VsZiwgb3V0cHV0X2RpciwgZXh0LCBjb21waWxlPUZhbHNlKToKICAgICAgICBsb2cuaW5mbygid3JpdGluZyBzdHViIGxvYWRlciBmb3IgJXMgdG8gJXMiLCBleHQuX2Z1bGxfbmFtZSwKICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyKQogICAgICAgIHN0dWJfZmlsZSA9IChvcy5wYXRoLmpvaW4ob3V0cHV0X2RpciwgKmV4dC5fZnVsbF9uYW1lLnNwbGl0KCcuJykpICsKICAgICAgICAgICAgICAgICAgICAgJy5weScpCiAgICAgICAgaWYgY29tcGlsZSBhbmQgb3MucGF0aC5leGlzdHMoc3R1Yl9maWxlKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3Ioc3R1Yl9maWxlICsgIiBhbHJlYWR5IGV4aXN0cyEgUGxlYXNlIGRlbGV0ZS4iKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGYgPSBvcGVuKHN0dWJfZmlsZSwgJ3cnKQogICAgICAgICAgICBmLndyaXRlKAogICAgICAgICAgICAgICAgJ1xuJy5qb2luKFsKICAgICAgICAgICAgICAgICAgICAiZGVmIF9fYm9vdHN0cmFwX18oKToiLAogICAgICAgICAgICAgICAgICAgICIgICBnbG9iYWwgX19ib290c3RyYXBfXywgX19maWxlX18sIF9fbG9hZGVyX18iLAogICAgICAgICAgICAgICAgICAgICIgICBpbXBvcnQgc3lzLCBvcywgcGtnX3Jlc291cmNlcywgaW1wIiArIGlmX2RsKCIsIGRsIiksCiAgICAgICAgICAgICAgICAgICAgIiAgIF9fZmlsZV9fID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSIKICAgICAgICAgICAgICAgICAgICAiKF9fbmFtZV9fLCVyKSIKICAgICAgICAgICAgICAgICAgICAlIG9zLnBhdGguYmFzZW5hbWUoZXh0Ll9maWxlX25hbWUpLAogICAgICAgICAgICAgICAgICAgICIgICBkZWwgX19ib290c3RyYXBfXyIsCiAgICAgICAgICAgICAgICAgICAgIiAgIGlmICdfX2xvYWRlcl9fJyBpbiBnbG9iYWxzKCk6IiwKICAgICAgICAgICAgICAgICAgICAiICAgICAgIGRlbCBfX2xvYWRlcl9fIiwKICAgICAgICAgICAgICAgICAgICBpZl9kbCgiICAgb2xkX2ZsYWdzID0gc3lzLmdldGRsb3BlbmZsYWdzKCkiKSwKICAgICAgICAgICAgICAgICAgICAiICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpIiwKICAgICAgICAgICAgICAgICAgICAiICAgdHJ5OiIsCiAgICAgICAgICAgICAgICAgICAgIiAgICAgb3MuY2hkaXIob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkiLAogICAgICAgICAgICAgICAgICAgIGlmX2RsKCIgICAgIHN5cy5zZXRkbG9wZW5mbGFncyhkbC5SVExEX05PVykiKSwKICAgICAgICAgICAgICAgICAgICAiICAgICBpbXAubG9hZF9keW5hbWljKF9fbmFtZV9fLF9fZmlsZV9fKSIsCiAgICAgICAgICAgICAgICAgICAgIiAgIGZpbmFsbHk6IiwKICAgICAgICAgICAgICAgICAgICBpZl9kbCgiICAgICBzeXMuc2V0ZGxvcGVuZmxhZ3Mob2xkX2ZsYWdzKSIpLAogICAgICAgICAgICAgICAgICAgICIgICAgIG9zLmNoZGlyKG9sZF9kaXIpIiwKICAgICAgICAgICAgICAgICAgICAiX19ib290c3RyYXBfXygpIiwKICAgICAgICAgICAgICAgICAgICAiIiAgIyB0ZXJtaW5hbCBcbgogICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgKQogICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICBpZiBjb21waWxlOgogICAgICAgICAgICBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBieXRlX2NvbXBpbGUKCiAgICAgICAgICAgIGJ5dGVfY29tcGlsZShbc3R1Yl9maWxlXSwgb3B0aW1pemU9MCwKICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPVRydWUsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogICAgICAgICAgICBvcHRpbWl6ZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsX2xpYicpLm9wdGltaXplCiAgICAgICAgICAgIGlmIG9wdGltaXplID4gMDoKICAgICAgICAgICAgICAgIGJ5dGVfY29tcGlsZShbc3R1Yl9maWxlXSwgb3B0aW1pemU9b3B0aW1pemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9VHJ1ZSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHN0dWJfZmlsZSkgYW5kIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICBvcy51bmxpbmsoc3R1Yl9maWxlKQoKCmlmIHVzZV9zdHVicyBvciBvcy5uYW1lID09ICdudCc6CiAgICAjIEJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMKICAgICMKICAgIGRlZiBsaW5rX3NoYXJlZF9vYmplY3QoCiAgICAgICAgICAgIHNlbGYsIG9iamVjdHMsIG91dHB1dF9saWJuYW1lLCBvdXRwdXRfZGlyPU5vbmUsIGxpYnJhcmllcz1Ob25lLAogICAgICAgICAgICBsaWJyYXJ5X2RpcnM9Tm9uZSwgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwgZXhwb3J0X3N5bWJvbHM9Tm9uZSwKICAgICAgICAgICAgZGVidWc9MCwgZXh0cmFfcHJlYXJncz1Ob25lLCBleHRyYV9wb3N0YXJncz1Ob25lLCBidWlsZF90ZW1wPU5vbmUsCiAgICAgICAgICAgIHRhcmdldF9sYW5nPU5vbmUpOgogICAgICAgIHNlbGYubGluaygKICAgICAgICAgICAgc2VsZi5TSEFSRURfTElCUkFSWSwgb2JqZWN0cywgb3V0cHV0X2xpYm5hbWUsCiAgICAgICAgICAgIG91dHB1dF9kaXIsIGxpYnJhcmllcywgbGlicmFyeV9kaXJzLCBydW50aW1lX2xpYnJhcnlfZGlycywKICAgICAgICAgICAgZXhwb3J0X3N5bWJvbHMsIGRlYnVnLCBleHRyYV9wcmVhcmdzLCBleHRyYV9wb3N0YXJncywKICAgICAgICAgICAgYnVpbGRfdGVtcCwgdGFyZ2V0X2xhbmcKICAgICAgICApCmVsc2U6CiAgICAjIEJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgZXZlcnl3aGVyZSBlbHNlCiAgICBsaWJ0eXBlID0gJ3N0YXRpYycKCiAgICBkZWYgbGlua19zaGFyZWRfb2JqZWN0KAogICAgICAgICAgICBzZWxmLCBvYmplY3RzLCBvdXRwdXRfbGlibmFtZSwgb3V0cHV0X2Rpcj1Ob25lLCBsaWJyYXJpZXM9Tm9uZSwKICAgICAgICAgICAgbGlicmFyeV9kaXJzPU5vbmUsIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsIGV4cG9ydF9zeW1ib2xzPU5vbmUsCiAgICAgICAgICAgIGRlYnVnPTAsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwgYnVpbGRfdGVtcD1Ob25lLAogICAgICAgICAgICB0YXJnZXRfbGFuZz1Ob25lKToKICAgICAgICAjIFhYWCB3ZSBuZWVkIHRvIGVpdGhlciBkaXNhbGxvdyB0aGVzZSBhdHRycyBvbiBMaWJyYXJ5IGluc3RhbmNlcywKICAgICAgICAjIG9yIHdhcm4vYWJvcnQgaGVyZSBpZiBzZXQsIG9yIHNvbWV0aGluZy4uLgogICAgICAgICMgbGlicmFyaWVzPU5vbmUsIGxpYnJhcnlfZGlycz1Ob25lLCBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLAogICAgICAgICMgZXhwb3J0X3N5bWJvbHM9Tm9uZSwgZXh0cmFfcHJlYXJncz1Ob25lLCBleHRyYV9wb3N0YXJncz1Ob25lLAogICAgICAgICMgYnVpbGRfdGVtcD1Ob25lCgogICAgICAgIGFzc2VydCBvdXRwdXRfZGlyIGlzIE5vbmUgICMgZGlzdHV0aWxzIGJ1aWxkX2V4dCBkb2Vzbid0IHBhc3MgdGhpcwogICAgICAgIG91dHB1dF9kaXIsIGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChvdXRwdXRfbGlibmFtZSkKICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSkKICAgICAgICBpZiBzZWxmLmxpYnJhcnlfZmlsZW5hbWUoIngiKS5zdGFydHN3aXRoKCdsaWInKToKICAgICAgICAgICAgIyBzdHJpcCAnbGliJyBwcmVmaXg7IHRoaXMgaXMga2x1ZGd5IGlmIHNvbWUgcGxhdGZvcm0gdXNlcwogICAgICAgICAgICAjIGEgZGlmZmVyZW50IHByZWZpeAogICAgICAgICAgICBiYXNlbmFtZSA9IGJhc2VuYW1lWzM6XQoKICAgICAgICBzZWxmLmNyZWF0ZV9zdGF0aWNfbGliKAogICAgICAgICAgICBvYmplY3RzLCBiYXNlbmFtZSwgb3V0cHV0X2RpciwgZGVidWcsIHRhcmdldF9sYW5nCiAgICAgICAgKQoKCmRlZiBfZ2V0X2NvbmZpZ192YXJfODM3KG5hbWUpOgogICAgIiIiCiAgICBJbiBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL3B1bGwvODM3LCB3ZSBkaXNjb3ZlcmVkCiAgICBQeXRob24gMy4zLjAgZXhwb3NlcyB0aGUgZXh0ZW5zaW9uIHN1ZmZpeCB1bmRlciB0aGUgbmFtZSAnU08nLgogICAgIiIiCiAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDMsIDEpOgogICAgICAgIG5hbWUgPSAnU08nCiAgICByZXR1cm4gZ2V0X2NvbmZpZ192YXIobmFtZSkKUEsDBBQAAAAAAAAAIQBARkLcfCUAAHwlAAA2AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX3B5LnB5ZnJvbSBnbG9iIGltcG9ydCBnbG9iCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAppbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfcHkgYXMgb3JpZwppbXBvcnQgb3MKaW1wb3J0IGZubWF0Y2gKaW1wb3J0IHRleHR3cmFwCmltcG9ydCBpbwppbXBvcnQgZGlzdHV0aWxzLmVycm9ycwppbXBvcnQgaXRlcnRvb2xzCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IG1hcCwgZmlsdGVyLCBmaWx0ZXJmYWxzZQoKdHJ5OgogICAgZnJvbSBzZXR1cHRvb2xzLmxpYjJ0bzNfZXggaW1wb3J0IE1peGluMnRvMwpleGNlcHQgSW1wb3J0RXJyb3I6CgogICAgY2xhc3MgTWl4aW4ydG8zOgogICAgICAgIGRlZiBydW5fMnRvMyhzZWxmLCBmaWxlcywgZG9jdGVzdHM9VHJ1ZSk6CiAgICAgICAgICAgICJkbyBub3RoaW5nIgoKCmNsYXNzIGJ1aWxkX3B5KG9yaWcuYnVpbGRfcHksIE1peGluMnRvMyk6CiAgICAiIiJFbmhhbmNlZCAnYnVpbGRfcHknIGNvbW1hbmQgdGhhdCBpbmNsdWRlcyBkYXRhIGZpbGVzIHdpdGggcGFja2FnZXMKCiAgICBUaGUgZGF0YSBmaWxlcyBhcmUgc3BlY2lmaWVkIHZpYSBhICdwYWNrYWdlX2RhdGEnIGFyZ3VtZW50IHRvICdzZXR1cCgpJy4KICAgIFNlZSAnc2V0dXB0b29scy5kaXN0LkRpc3RyaWJ1dGlvbicgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBBbHNvLCB0aGlzIHZlcnNpb24gb2YgdGhlICdidWlsZF9weScgY29tbWFuZCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYm90aAogICAgJ3B5X21vZHVsZXMnIGFuZCAncGFja2FnZXMnIGluIHRoZSBzYW1lIHNldHVwIG9wZXJhdGlvbi4KICAgICIiIgoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9yaWcuYnVpbGRfcHkuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYucGFja2FnZV9kYXRhID0gc2VsZi5kaXN0cmlidXRpb24ucGFja2FnZV9kYXRhCiAgICAgICAgc2VsZi5leGNsdWRlX3BhY2thZ2VfZGF0YSA9IChzZWxmLmRpc3RyaWJ1dGlvbi5leGNsdWRlX3BhY2thZ2VfZGF0YSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30pCiAgICAgICAgaWYgJ2RhdGFfZmlsZXMnIGluIHNlbGYuX19kaWN0X186CiAgICAgICAgICAgIGRlbCBzZWxmLl9fZGljdF9fWydkYXRhX2ZpbGVzJ10KICAgICAgICBzZWxmLl9fdXBkYXRlZF9maWxlcyA9IFtdCiAgICAgICAgc2VsZi5fX2RvY3Rlc3RzXzJ0bzMgPSBbXQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiQnVpbGQgbW9kdWxlcywgcGFja2FnZXMsIGFuZCBjb3B5IGRhdGEgZmlsZXMgdG8gYnVpbGQgZGlyZWN0b3J5IiIiCiAgICAgICAgaWYgbm90IHNlbGYucHlfbW9kdWxlcyBhbmQgbm90IHNlbGYucGFja2FnZXM6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBzZWxmLnB5X21vZHVsZXM6CiAgICAgICAgICAgIHNlbGYuYnVpbGRfbW9kdWxlcygpCgogICAgICAgIGlmIHNlbGYucGFja2FnZXM6CiAgICAgICAgICAgIHNlbGYuYnVpbGRfcGFja2FnZXMoKQogICAgICAgICAgICBzZWxmLmJ1aWxkX3BhY2thZ2VfZGF0YSgpCgogICAgICAgIHNlbGYucnVuXzJ0bzMoc2VsZi5fX3VwZGF0ZWRfZmlsZXMsIEZhbHNlKQogICAgICAgIHNlbGYucnVuXzJ0bzMoc2VsZi5fX3VwZGF0ZWRfZmlsZXMsIFRydWUpCiAgICAgICAgc2VsZi5ydW5fMnRvMyhzZWxmLl9fZG9jdGVzdHNfMnRvMywgVHJ1ZSkKCiAgICAgICAgIyBPbmx5IGNvbXBpbGUgYWN0dWFsIC5weSBmaWxlcywgdXNpbmcgb3VyIGJhc2UgY2xhc3MnIGlkZWEgb2Ygd2hhdCBvdXIKICAgICAgICAjIG91dHB1dCBmaWxlcyBhcmUuCiAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUob3JpZy5idWlsZF9weS5nZXRfb3V0cHV0cyhzZWxmLCBpbmNsdWRlX2J5dGVjb2RlPTApKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICAibGF6aWx5IGNvbXB1dGUgZGF0YSBmaWxlcyIKICAgICAgICBpZiBhdHRyID09ICdkYXRhX2ZpbGVzJzoKICAgICAgICAgICAgc2VsZi5kYXRhX2ZpbGVzID0gc2VsZi5fZ2V0X2RhdGFfZmlsZXMoKQogICAgICAgICAgICByZXR1cm4gc2VsZi5kYXRhX2ZpbGVzCiAgICAgICAgcmV0dXJuIG9yaWcuYnVpbGRfcHkuX19nZXRhdHRyX18oc2VsZiwgYXR0cikKCiAgICBkZWYgYnVpbGRfbW9kdWxlKHNlbGYsIG1vZHVsZSwgbW9kdWxlX2ZpbGUsIHBhY2thZ2UpOgogICAgICAgIGlmIHNpeC5QWTIgYW5kIGlzaW5zdGFuY2UocGFja2FnZSwgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICMgYXZvaWQgZXJyb3JzIG9uIFB5dGhvbiAyIHdoZW4gdW5pY29kZSBpcyBwYXNzZWQgKCMxOTApCiAgICAgICAgICAgIHBhY2thZ2UgPSBwYWNrYWdlLnNwbGl0KCcuJykKICAgICAgICBvdXRmaWxlLCBjb3BpZWQgPSBvcmlnLmJ1aWxkX3B5LmJ1aWxkX21vZHVsZShzZWxmLCBtb2R1bGUsIG1vZHVsZV9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UpCiAgICAgICAgaWYgY29waWVkOgogICAgICAgICAgICBzZWxmLl9fdXBkYXRlZF9maWxlcy5hcHBlbmQob3V0ZmlsZSkKICAgICAgICByZXR1cm4gb3V0ZmlsZSwgY29waWVkCgogICAgZGVmIF9nZXRfZGF0YV9maWxlcyhzZWxmKToKICAgICAgICAiIiJHZW5lcmF0ZSBsaXN0IG9mICcocGFja2FnZSxzcmNfZGlyLGJ1aWxkX2RpcixmaWxlbmFtZXMpJyB0dXBsZXMiIiIKICAgICAgICBzZWxmLmFuYWx5emVfbWFuaWZlc3QoKQogICAgICAgIHJldHVybiBsaXN0KG1hcChzZWxmLl9nZXRfcGtnX2RhdGFfZmlsZXMsIHNlbGYucGFja2FnZXMgb3IgKCkpKQoKICAgIGRlZiBfZ2V0X3BrZ19kYXRhX2ZpbGVzKHNlbGYsIHBhY2thZ2UpOgogICAgICAgICMgTG9jYXRlIHBhY2thZ2Ugc291cmNlIGRpcmVjdG9yeQogICAgICAgIHNyY19kaXIgPSBzZWxmLmdldF9wYWNrYWdlX2RpcihwYWNrYWdlKQoKICAgICAgICAjIENvbXB1dGUgcGFja2FnZSBidWlsZCBkaXJlY3RvcnkKICAgICAgICBidWlsZF9kaXIgPSBvcy5wYXRoLmpvaW4oKihbc2VsZi5idWlsZF9saWJdICsgcGFja2FnZS5zcGxpdCgnLicpKSkKCiAgICAgICAgIyBTdHJpcCBkaXJlY3RvcnkgZnJvbSBnbG9iYmVkIGZpbGVuYW1lcwogICAgICAgIGZpbGVuYW1lcyA9IFsKICAgICAgICAgICAgb3MucGF0aC5yZWxwYXRoKGZpbGUsIHNyY19kaXIpCiAgICAgICAgICAgIGZvciBmaWxlIGluIHNlbGYuZmluZF9kYXRhX2ZpbGVzKHBhY2thZ2UsIHNyY19kaXIpCiAgICAgICAgXQogICAgICAgIHJldHVybiBwYWNrYWdlLCBzcmNfZGlyLCBidWlsZF9kaXIsIGZpbGVuYW1lcwoKICAgIGRlZiBmaW5kX2RhdGFfZmlsZXMoc2VsZiwgcGFja2FnZSwgc3JjX2Rpcik6CiAgICAgICAgIiIiUmV0dXJuIGZpbGVuYW1lcyBmb3IgcGFja2FnZSdzIGRhdGEgZmlsZXMgaW4gJ3NyY19kaXInIiIiCiAgICAgICAgcGF0dGVybnMgPSBzZWxmLl9nZXRfcGxhdGZvcm1fcGF0dGVybnMoCiAgICAgICAgICAgIHNlbGYucGFja2FnZV9kYXRhLAogICAgICAgICAgICBwYWNrYWdlLAogICAgICAgICAgICBzcmNfZGlyLAogICAgICAgICkKICAgICAgICBnbG9ic19leHBhbmRlZCA9IG1hcChnbG9iLCBwYXR0ZXJucykKICAgICAgICAjIGZsYXR0ZW4gdGhlIGV4cGFuZGVkIGdsb2JzIGludG8gYW4gaXRlcmFibGUgb2YgbWF0Y2hlcwogICAgICAgIGdsb2JzX21hdGNoZXMgPSBpdGVydG9vbHMuY2hhaW4uZnJvbV9pdGVyYWJsZShnbG9ic19leHBhbmRlZCkKICAgICAgICBnbG9iX2ZpbGVzID0gZmlsdGVyKG9zLnBhdGguaXNmaWxlLCBnbG9ic19tYXRjaGVzKQogICAgICAgIGZpbGVzID0gaXRlcnRvb2xzLmNoYWluKAogICAgICAgICAgICBzZWxmLm1hbmlmZXN0X2ZpbGVzLmdldChwYWNrYWdlLCBbXSksCiAgICAgICAgICAgIGdsb2JfZmlsZXMsCiAgICAgICAgKQogICAgICAgIHJldHVybiBzZWxmLmV4Y2x1ZGVfZGF0YV9maWxlcyhwYWNrYWdlLCBzcmNfZGlyLCBmaWxlcykKCiAgICBkZWYgYnVpbGRfcGFja2FnZV9kYXRhKHNlbGYpOgogICAgICAgICIiIkNvcHkgZGF0YSBmaWxlcyBpbnRvIGJ1aWxkIGRpcmVjdG9yeSIiIgogICAgICAgIGZvciBwYWNrYWdlLCBzcmNfZGlyLCBidWlsZF9kaXIsIGZpbGVuYW1lcyBpbiBzZWxmLmRhdGFfZmlsZXM6CiAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oYnVpbGRfZGlyLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgIHNlbGYubWtwYXRoKG9zLnBhdGguZGlybmFtZSh0YXJnZXQpKQogICAgICAgICAgICAgICAgc3JjZmlsZSA9IG9zLnBhdGguam9pbihzcmNfZGlyLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgIG91dGYsIGNvcGllZCA9IHNlbGYuY29weV9maWxlKHNyY2ZpbGUsIHRhcmdldCkKICAgICAgICAgICAgICAgIHNyY2ZpbGUgPSBvcy5wYXRoLmFic3BhdGgoc3JjZmlsZSkKICAgICAgICAgICAgICAgIGlmIChjb3BpZWQgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIHNyY2ZpbGUgaW4gc2VsZi5kaXN0cmlidXRpb24uY29udmVydF8ydG8zX2RvY3Rlc3RzKToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9fZG9jdGVzdHNfMnRvMy5hcHBlbmQob3V0ZikKCiAgICBkZWYgYW5hbHl6ZV9tYW5pZmVzdChzZWxmKToKICAgICAgICBzZWxmLm1hbmlmZXN0X2ZpbGVzID0gbWYgPSB7fQogICAgICAgIGlmIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5pbmNsdWRlX3BhY2thZ2VfZGF0YToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc3JjX2RpcnMgPSB7fQogICAgICAgIGZvciBwYWNrYWdlIGluIHNlbGYucGFja2FnZXMgb3IgKCk6CiAgICAgICAgICAgICMgTG9jYXRlIHBhY2thZ2Ugc291cmNlIGRpcmVjdG9yeQogICAgICAgICAgICBzcmNfZGlyc1thc3NlcnRfcmVsYXRpdmUoc2VsZi5nZXRfcGFja2FnZV9kaXIocGFja2FnZSkpXSA9IHBhY2thZ2UKCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgZm9yIHBhdGggaW4gZWlfY21kLmZpbGVsaXN0LmZpbGVzOgogICAgICAgICAgICBkLCBmID0gb3MucGF0aC5zcGxpdChhc3NlcnRfcmVsYXRpdmUocGF0aCkpCiAgICAgICAgICAgIHByZXYgPSBOb25lCiAgICAgICAgICAgIG9sZGYgPSBmCiAgICAgICAgICAgIHdoaWxlIGQgYW5kIGQgIT0gcHJldiBhbmQgZCBub3QgaW4gc3JjX2RpcnM6CiAgICAgICAgICAgICAgICBwcmV2ID0gZAogICAgICAgICAgICAgICAgZCwgZGYgPSBvcy5wYXRoLnNwbGl0KGQpCiAgICAgICAgICAgICAgICBmID0gb3MucGF0aC5qb2luKGRmLCBmKQogICAgICAgICAgICBpZiBkIGluIHNyY19kaXJzOgogICAgICAgICAgICAgICAgaWYgcGF0aC5lbmRzd2l0aCgnLnB5JykgYW5kIGYgPT0gb2xkZjoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAgIyBpdCdzIGEgbW9kdWxlLCBub3QgZGF0YQogICAgICAgICAgICAgICAgbWYuc2V0ZGVmYXVsdChzcmNfZGlyc1tkXSwgW10pLmFwcGVuZChwYXRoKQoKICAgIGRlZiBnZXRfZGF0YV9maWxlcyhzZWxmKToKICAgICAgICBwYXNzICAjIExhemlseSBjb21wdXRlIGRhdGEgZmlsZXMgaW4gX2dldF9kYXRhX2ZpbGVzKCkgZnVuY3Rpb24uCgogICAgZGVmIGNoZWNrX3BhY2thZ2Uoc2VsZiwgcGFja2FnZSwgcGFja2FnZV9kaXIpOgogICAgICAgICIiIkNoZWNrIG5hbWVzcGFjZSBwYWNrYWdlcycgX19pbml0X18gZm9yIGRlY2xhcmVfbmFtZXNwYWNlIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYWNrYWdlc19jaGVja2VkW3BhY2thZ2VdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGluaXRfcHkgPSBvcmlnLmJ1aWxkX3B5LmNoZWNrX3BhY2thZ2Uoc2VsZiwgcGFja2FnZSwgcGFja2FnZV9kaXIpCiAgICAgICAgc2VsZi5wYWNrYWdlc19jaGVja2VkW3BhY2thZ2VdID0gaW5pdF9weQoKICAgICAgICBpZiBub3QgaW5pdF9weSBvciBub3Qgc2VsZi5kaXN0cmlidXRpb24ubmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICByZXR1cm4gaW5pdF9weQoKICAgICAgICBmb3IgcGtnIGluIHNlbGYuZGlzdHJpYnV0aW9uLm5hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgaWYgcGtnID09IHBhY2thZ2Ugb3IgcGtnLnN0YXJ0c3dpdGgocGFja2FnZSArICcuJyk6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBpbml0X3B5CgogICAgICAgIHdpdGggaW8ub3Blbihpbml0X3B5LCAncmInKSBhcyBmOgogICAgICAgICAgICBjb250ZW50cyA9IGYucmVhZCgpCiAgICAgICAgaWYgYidkZWNsYXJlX25hbWVzcGFjZScgbm90IGluIGNvbnRlbnRzOgogICAgICAgICAgICByYWlzZSBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgIk5hbWVzcGFjZSBwYWNrYWdlIHByb2JsZW06ICVzIGlzIGEgbmFtZXNwYWNlIHBhY2thZ2UsIGJ1dCAiCiAgICAgICAgICAgICAgICAiaXRzXG5fX2luaXRfXy5weSBkb2VzIG5vdCBjYWxsIGRlY2xhcmVfbmFtZXNwYWNlKCkhIFBsZWFzZSAiCiAgICAgICAgICAgICAgICAnZml4IGl0LlxuKFNlZSB0aGUgc2V0dXB0b29scyBtYW51YWwgdW5kZXIgJwogICAgICAgICAgICAgICAgJyJOYW1lc3BhY2UgUGFja2FnZXMiIGZvciBkZXRhaWxzLilcbiInICUgKHBhY2thZ2UsKQogICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGluaXRfcHkKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYucGFja2FnZXNfY2hlY2tlZCA9IHt9CiAgICAgICAgb3JpZy5idWlsZF9weS5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKCiAgICBkZWYgZ2V0X3BhY2thZ2VfZGlyKHNlbGYsIHBhY2thZ2UpOgogICAgICAgIHJlcyA9IG9yaWcuYnVpbGRfcHkuZ2V0X3BhY2thZ2VfZGlyKHNlbGYsIHBhY2thZ2UpCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uc3JjX3Jvb3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5kaXN0cmlidXRpb24uc3JjX3Jvb3QsIHJlcykKICAgICAgICByZXR1cm4gcmVzCgogICAgZGVmIGV4Y2x1ZGVfZGF0YV9maWxlcyhzZWxmLCBwYWNrYWdlLCBzcmNfZGlyLCBmaWxlcyk6CiAgICAgICAgIiIiRmlsdGVyIGZpbGVuYW1lcyBmb3IgcGFja2FnZSdzIGRhdGEgZmlsZXMgaW4gJ3NyY19kaXInIiIiCiAgICAgICAgZmlsZXMgPSBsaXN0KGZpbGVzKQogICAgICAgIHBhdHRlcm5zID0gc2VsZi5fZ2V0X3BsYXRmb3JtX3BhdHRlcm5zKAogICAgICAgICAgICBzZWxmLmV4Y2x1ZGVfcGFja2FnZV9kYXRhLAogICAgICAgICAgICBwYWNrYWdlLAogICAgICAgICAgICBzcmNfZGlyLAogICAgICAgICkKICAgICAgICBtYXRjaF9ncm91cHMgPSAoCiAgICAgICAgICAgIGZubWF0Y2guZmlsdGVyKGZpbGVzLCBwYXR0ZXJuKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJucwogICAgICAgICkKICAgICAgICAjIGZsYXR0ZW4gdGhlIGdyb3VwcyBvZiBtYXRjaGVzIGludG8gYW4gaXRlcmFibGUgb2YgbWF0Y2hlcwogICAgICAgIG1hdGNoZXMgPSBpdGVydG9vbHMuY2hhaW4uZnJvbV9pdGVyYWJsZShtYXRjaF9ncm91cHMpCiAgICAgICAgYmFkID0gc2V0KG1hdGNoZXMpCiAgICAgICAga2VlcGVycyA9ICgKICAgICAgICAgICAgZm4KICAgICAgICAgICAgZm9yIGZuIGluIGZpbGVzCiAgICAgICAgICAgIGlmIGZuIG5vdCBpbiBiYWQKICAgICAgICApCiAgICAgICAgIyBkaXRjaCBkdXBlcwogICAgICAgIHJldHVybiBsaXN0KF91bmlxdWVfZXZlcnNlZW4oa2VlcGVycykpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9nZXRfcGxhdGZvcm1fcGF0dGVybnMoc3BlYywgcGFja2FnZSwgc3JjX2Rpcik6CiAgICAgICAgIiIiCiAgICAgICAgeWllbGQgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aCBwYXR0ZXJucyAoc3VpdGFibGUgZm9yIGdsb2IKICAgICAgICBvciBmbl9tYXRjaCkgZnJvbSBhIGdsb2ItYmFzZWQgc3BlYyAoc3VjaCBhcwogICAgICAgIHNlbGYucGFja2FnZV9kYXRhIG9yIHNlbGYuZXhjbHVkZV9wYWNrYWdlX2RhdGEpCiAgICAgICAgbWF0Y2hpbmcgcGFja2FnZSBpbiBzcmNfZGlyLgogICAgICAgICIiIgogICAgICAgIHJhd19wYXR0ZXJucyA9IGl0ZXJ0b29scy5jaGFpbigKICAgICAgICAgICAgc3BlYy5nZXQoJycsIFtdKSwKICAgICAgICAgICAgc3BlYy5nZXQocGFja2FnZSwgW10pLAogICAgICAgICkKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAjIEVhY2ggcGF0dGVybiBoYXMgdG8gYmUgY29udmVydGVkIHRvIGEgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3JjX2RpciwgY29udmVydF9wYXRoKHBhdHRlcm4pKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiByYXdfcGF0dGVybnMKICAgICAgICApCgoKIyBmcm9tIFB5dGhvbiBkb2NzCmRlZiBfdW5pcXVlX2V2ZXJzZWVuKGl0ZXJhYmxlLCBrZXk9Tm9uZSk6CiAgICAiTGlzdCB1bmlxdWUgZWxlbWVudHMsIHByZXNlcnZpbmcgb3JkZXIuIFJlbWVtYmVyIGFsbCBlbGVtZW50cyBldmVyIHNlZW4uIgogICAgIyB1bmlxdWVfZXZlcnNlZW4oJ0FBQUFCQkJDQ0RBQUJCQicpIC0tPiBBIEIgQyBECiAgICAjIHVuaXF1ZV9ldmVyc2VlbignQUJCQ2NBRCcsIHN0ci5sb3dlcikgLS0+IEEgQiBDIEQKICAgIHNlZW4gPSBzZXQoKQogICAgc2Vlbl9hZGQgPSBzZWVuLmFkZAogICAgaWYga2V5IGlzIE5vbmU6CiAgICAgICAgZm9yIGVsZW1lbnQgaW4gZmlsdGVyZmFsc2Uoc2Vlbi5fX2NvbnRhaW5zX18sIGl0ZXJhYmxlKToKICAgICAgICAgICAgc2Vlbl9hZGQoZWxlbWVudCkKICAgICAgICAgICAgeWllbGQgZWxlbWVudAogICAgZWxzZToKICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVyYWJsZToKICAgICAgICAgICAgayA9IGtleShlbGVtZW50KQogICAgICAgICAgICBpZiBrIG5vdCBpbiBzZWVuOgogICAgICAgICAgICAgICAgc2Vlbl9hZGQoaykKICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQKCgpkZWYgYXNzZXJ0X3JlbGF0aXZlKHBhdGgpOgogICAgaWYgbm90IG9zLnBhdGguaXNhYnMocGF0aCk6CiAgICAgICAgcmV0dXJuIHBhdGgKICAgIGZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzU2V0dXBFcnJvcgoKICAgIG1zZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBFcnJvcjogc2V0dXAgc2NyaXB0IHNwZWNpZmllcyBhbiBhYnNvbHV0ZSBwYXRoOgoKICAgICAgICAgICAgJXMKCiAgICAgICAgc2V0dXAoKSBhcmd1bWVudHMgbXVzdCAqYWx3YXlzKiBiZSAvLXNlcGFyYXRlZCBwYXRocyByZWxhdGl2ZSB0byB0aGUKICAgICAgICBzZXR1cC5weSBkaXJlY3RvcnksICpuZXZlciogYWJzb2x1dGUgcGF0aHMuCiAgICAgICAgIiIiKS5sc3RyaXAoKSAlIHBhdGgKICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IobXNnKQpQSwMEFAAAAAAAAAAhAEBcO/9uHwAAbh8AADUAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvZGV2ZWxvcC5weWZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aApmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IsIERpc3R1dGlsc09wdGlvbkVycm9yCmltcG9ydCBvcwppbXBvcnQgZ2xvYgppbXBvcnQgaW8KCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBEaXN0cmlidXRpb24sIFBhdGhNZXRhZGF0YSwgbm9ybWFsaXplX3BhdGgKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBlYXN5X2luc3RhbGwKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBuYW1lc3BhY2VzCmltcG9ydCBzZXR1cHRvb2xzCgoKY2xhc3MgZGV2ZWxvcChuYW1lc3BhY2VzLkRldmVsb3BJbnN0YWxsZXIsIGVhc3lfaW5zdGFsbCk6CiAgICAiIiJTZXQgdXAgcGFja2FnZSBmb3IgZGV2ZWxvcG1lbnQiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJpbnN0YWxsIHBhY2thZ2UgaW4gJ2RldmVsb3BtZW50IG1vZGUnIgoKICAgIHVzZXJfb3B0aW9ucyA9IGVhc3lfaW5zdGFsbC51c2VyX29wdGlvbnMgKyBbCiAgICAgICAgKCJ1bmluc3RhbGwiLCAidSIsICJVbmluc3RhbGwgdGhpcyBzb3VyY2UgcGFja2FnZSIpLAogICAgICAgICgiZWdnLXBhdGg9IiwgTm9uZSwgIlNldCB0aGUgcGF0aCB0byBiZSB1c2VkIGluIHRoZSAuZWdnLWxpbmsgZmlsZSIpLAogICAgXQoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IGVhc3lfaW5zdGFsbC5ib29sZWFuX29wdGlvbnMgKyBbJ3VuaW5zdGFsbCddCgogICAgY29tbWFuZF9jb25zdW1lc19hcmd1bWVudHMgPSBGYWxzZSAgIyBvdmVycmlkZSBiYXNlCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBpZiBzZWxmLnVuaW5zdGFsbDoKICAgICAgICAgICAgc2VsZi5tdWx0aV92ZXJzaW9uID0gVHJ1ZQogICAgICAgICAgICBzZWxmLnVuaW5zdGFsbF9saW5rKCkKICAgICAgICAgICAgc2VsZi51bmluc3RhbGxfbmFtZXNwYWNlcygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2Zvcl9kZXZlbG9wbWVudCgpCiAgICAgICAgc2VsZi53YXJuX2RlcHJlY2F0ZWRfb3B0aW9ucygpCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLnVuaW5zdGFsbCA9IE5vbmUKICAgICAgICBzZWxmLmVnZ19wYXRoID0gTm9uZQogICAgICAgIGVhc3lfaW5zdGFsbC5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLnNldHVwX3BhdGggPSBOb25lCiAgICAgICAgc2VsZi5hbHdheXNfY29weV9mcm9tID0gJy4nICAjIGFsd2F5cyBjb3B5IGVnZ3MgaW5zdGFsbGVkIGluIGN1cmRpcgoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIGVpID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICBpZiBlaS5icm9rZW5fZWdnX2luZm86CiAgICAgICAgICAgIHRlbXBsYXRlID0gIlBsZWFzZSByZW5hbWUgJXIgdG8gJXIgYmVmb3JlIHVzaW5nICdkZXZlbG9wJyIKICAgICAgICAgICAgYXJncyA9IGVpLmVnZ19pbmZvLCBlaS5icm9rZW5fZWdnX2luZm8KICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IodGVtcGxhdGUgJSBhcmdzKQogICAgICAgIHNlbGYuYXJncyA9IFtlaS5lZ2dfbmFtZV0KCiAgICAgICAgZWFzeV9pbnN0YWxsLmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLmV4cGFuZF9iYXNlZGlycygpCiAgICAgICAgc2VsZi5leHBhbmRfZGlycygpCiAgICAgICAgIyBwaWNrIHVwIHNldHVwLWRpciAuZWdnIGZpbGVzIG9ubHk6IG5vIC5lZ2ctaW5mbwogICAgICAgIHNlbGYucGFja2FnZV9pbmRleC5zY2FuKGdsb2IuZ2xvYignKi5lZ2cnKSkKCiAgICAgICAgZWdnX2xpbmtfZm4gPSBlaS5lZ2dfbmFtZSArICcuZWdnLWxpbmsnCiAgICAgICAgc2VsZi5lZ2dfbGluayA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCBlZ2dfbGlua19mbikKICAgICAgICBzZWxmLmVnZ19iYXNlID0gZWkuZWdnX2Jhc2UKICAgICAgICBpZiBzZWxmLmVnZ19wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuZWdnX3BhdGggPSBvcy5wYXRoLmFic3BhdGgoZWkuZWdnX2Jhc2UpCgogICAgICAgIHRhcmdldCA9IG5vcm1hbGl6ZV9wYXRoKHNlbGYuZWdnX2Jhc2UpCiAgICAgICAgZWdnX3BhdGggPSBub3JtYWxpemVfcGF0aChvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVnZ19wYXRoKSkKICAgICAgICBpZiBlZ2dfcGF0aCAhPSB0YXJnZXQ6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIi0tZWdnLXBhdGggbXVzdCBiZSBhIHJlbGF0aXZlIHBhdGggZnJvbSB0aGUgaW5zdGFsbCIKICAgICAgICAgICAgICAgICIgZGlyZWN0b3J5IHRvICIgKyB0YXJnZXQKICAgICAgICAgICAgKQoKICAgICAgICAjIE1ha2UgYSBkaXN0cmlidXRpb24gZm9yIHRoZSBwYWNrYWdlJ3Mgc291cmNlCiAgICAgICAgc2VsZi5kaXN0ID0gRGlzdHJpYnV0aW9uKAogICAgICAgICAgICB0YXJnZXQsCiAgICAgICAgICAgIFBhdGhNZXRhZGF0YSh0YXJnZXQsIG9zLnBhdGguYWJzcGF0aChlaS5lZ2dfaW5mbykpLAogICAgICAgICAgICBwcm9qZWN0X25hbWU9ZWkuZWdnX25hbWUKICAgICAgICApCgogICAgICAgIHNlbGYuc2V0dXBfcGF0aCA9IHNlbGYuX3Jlc29sdmVfc2V0dXBfcGF0aCgKICAgICAgICAgICAgc2VsZi5lZ2dfYmFzZSwKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2RpciwKICAgICAgICAgICAgc2VsZi5lZ2dfcGF0aCwKICAgICAgICApCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9yZXNvbHZlX3NldHVwX3BhdGgoZWdnX2Jhc2UsIGluc3RhbGxfZGlyLCBlZ2dfcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgR2VuZXJhdGUgYSBwYXRoIGZyb20gZWdnX2Jhc2UgYmFjayB0byAnLicgd2hlcmUgdGhlCiAgICAgICAgc2V0dXAgc2NyaXB0IHJlc2lkZXMgYW5kIGVuc3VyZSB0aGF0IHBhdGggcG9pbnRzIHRvIHRoZQogICAgICAgIHNldHVwIHBhdGggZnJvbSAkaW5zdGFsbF9kaXIvJGVnZ19wYXRoLgogICAgICAgICIiIgogICAgICAgIHBhdGhfdG9fc2V0dXAgPSBlZ2dfYmFzZS5yZXBsYWNlKG9zLnNlcCwgJy8nKS5yc3RyaXAoJy8nKQogICAgICAgIGlmIHBhdGhfdG9fc2V0dXAgIT0gb3MuY3VyZGlyOgogICAgICAgICAgICBwYXRoX3RvX3NldHVwID0gJy4uLycgKiAocGF0aF90b19zZXR1cC5jb3VudCgnLycpICsgMSkKICAgICAgICByZXNvbHZlZCA9IG5vcm1hbGl6ZV9wYXRoKAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oaW5zdGFsbF9kaXIsIGVnZ19wYXRoLCBwYXRoX3RvX3NldHVwKQogICAgICAgICkKICAgICAgICBpZiByZXNvbHZlZCAhPSBub3JtYWxpemVfcGF0aChvcy5jdXJkaXIpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICJDYW4ndCBnZXQgYSBjb25zaXN0ZW50IHBhdGggdG8gc2V0dXAgc2NyaXB0IGZyb20iCiAgICAgICAgICAgICAgICAiIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkiLCByZXNvbHZlZCwgbm9ybWFsaXplX3BhdGgob3MuY3VyZGlyKSkKICAgICAgICByZXR1cm4gcGF0aF90b19zZXR1cAoKICAgIGRlZiBpbnN0YWxsX2Zvcl9kZXZlbG9wbWVudChzZWxmKToKICAgICAgICBpZiBzaXguUFkzIGFuZCBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAndXNlXzJ0bzMnLCBGYWxzZSk6CiAgICAgICAgICAgICMgSWYgd2UgcnVuIDJ0bzMgd2UgY2FuIG5vdCBkbyB0aGlzIGlucGxhY2U6CgogICAgICAgICAgICAjIEVuc3VyZSBtZXRhZGF0YSBpcyB1cC10by1kYXRlCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2J1aWxkX3B5JywgaW5wbGFjZT0wKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9weScpCiAgICAgICAgICAgIGJweV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiYnVpbGRfcHkiKQogICAgICAgICAgICBidWlsZF9wYXRoID0gbm9ybWFsaXplX3BhdGgoYnB5X2NtZC5idWlsZF9saWIpCgogICAgICAgICAgICAjIEJ1aWxkIGV4dGVuc2lvbnMKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnZWdnX2luZm8nLCBlZ2dfYmFzZT1idWlsZF9wYXRoKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCgogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9leHQnLCBpbnBsYWNlPTApCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCgogICAgICAgICAgICAjIEZpeHVwIGVnZy1saW5rIGFuZCBlYXN5LWluc3RhbGwucHRoCiAgICAgICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgICAgIHNlbGYuZWdnX3BhdGggPSBidWlsZF9wYXRoCiAgICAgICAgICAgIHNlbGYuZGlzdC5sb2NhdGlvbiA9IGJ1aWxkX3BhdGgKICAgICAgICAgICAgIyBYWFgKICAgICAgICAgICAgc2VsZi5kaXN0Ll9wcm92aWRlciA9IFBhdGhNZXRhZGF0YShidWlsZF9wYXRoLCBlaV9jbWQuZWdnX2luZm8pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBXaXRob3V0IDJ0bzMgaW5wbGFjZSB3b3JrcyBmaW5lOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCgogICAgICAgICAgICAjIEJ1aWxkIGV4dGVuc2lvbnMgaW4tcGxhY2UKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfZXh0JywgaW5wbGFjZT0xKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9leHQnKQoKICAgICAgICBzZWxmLmluc3RhbGxfc2l0ZV9weSgpICAjIGVuc3VyZSB0aGF0IHRhcmdldCBkaXIgaXMgc2l0ZS1zYWZlCiAgICAgICAgaWYgc2V0dXB0b29scy5ib290c3RyYXBfaW5zdGFsbF9mcm9tOgogICAgICAgICAgICBzZWxmLmVhc3lfaW5zdGFsbChzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20pCiAgICAgICAgICAgIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbSA9IE5vbmUKCiAgICAgICAgc2VsZi5pbnN0YWxsX25hbWVzcGFjZXMoKQoKICAgICAgICAjIGNyZWF0ZSBhbiAuZWdnLWxpbmsgaW4gdGhlIGluc3RhbGxhdGlvbiBkaXIsIHBvaW50aW5nIHRvIG91ciBlZ2cKICAgICAgICBsb2cuaW5mbygiQ3JlYXRpbmcgJXMgKGxpbmsgdG8gJXMpIiwgc2VsZi5lZ2dfbGluaywgc2VsZi5lZ2dfYmFzZSkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5lZ2dfbGluaywgInciKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZShzZWxmLmVnZ19wYXRoICsgIlxuIiArIHNlbGYuc2V0dXBfcGF0aCkKICAgICAgICAjIHBvc3Rwcm9jZXNzIHRoZSBpbnN0YWxsZWQgZGlzdHJvLCBmaXhpbmcgdXAgLnB0aCwgaW5zdGFsbGluZyBzY3JpcHRzLAogICAgICAgICMgYW5kIGhhbmRsaW5nIHJlcXVpcmVtZW50cwogICAgICAgIHNlbGYucHJvY2Vzc19kaXN0cmlidXRpb24oTm9uZSwgc2VsZi5kaXN0LCBub3Qgc2VsZi5ub19kZXBzKQoKICAgIGRlZiB1bmluc3RhbGxfbGluayhzZWxmKToKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmVnZ19saW5rKToKICAgICAgICAgICAgbG9nLmluZm8oIlJlbW92aW5nICVzIChsaW5rIHRvICVzKSIsIHNlbGYuZWdnX2xpbmssIHNlbGYuZWdnX2Jhc2UpCiAgICAgICAgICAgIGVnZ19saW5rX2ZpbGUgPSBvcGVuKHNlbGYuZWdnX2xpbmspCiAgICAgICAgICAgIGNvbnRlbnRzID0gW2xpbmUucnN0cmlwKCkgZm9yIGxpbmUgaW4gZWdnX2xpbmtfZmlsZV0KICAgICAgICAgICAgZWdnX2xpbmtfZmlsZS5jbG9zZSgpCiAgICAgICAgICAgIGlmIGNvbnRlbnRzIG5vdCBpbiAoW3NlbGYuZWdnX3BhdGhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmLmVnZ19wYXRoLCBzZWxmLnNldHVwX3BhdGhdKToKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJMaW5rIHBvaW50cyB0byAlczogdW5pbnN0YWxsIGFib3J0ZWQiLCBjb250ZW50cykKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgb3MudW5saW5rKHNlbGYuZWdnX2xpbmspCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgc2VsZi51cGRhdGVfcHRoKHNlbGYuZGlzdCkgICMgcmVtb3ZlIGFueSAucHRoIGxpbmsgdG8gdXMKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzOgogICAgICAgICAgICAjIFhYWCBzaG91bGQgYWxzbyBjaGVjayBmb3IgZW50cnkgcG9pbnQgc2NyaXB0cyEKICAgICAgICAgICAgbG9nLndhcm4oIk5vdGU6IHlvdSBtdXN0IHVuaW5zdGFsbCBvciByZXBsYWNlIHNjcmlwdHMgbWFudWFsbHkhIikKCiAgICBkZWYgaW5zdGFsbF9lZ2dfc2NyaXB0cyhzZWxmLCBkaXN0KToKICAgICAgICBpZiBkaXN0IGlzIG5vdCBzZWxmLmRpc3Q6CiAgICAgICAgICAgICMgSW5zdGFsbGluZyBhIGRlcGVuZGVuY3ksIHNvIGZhbGwgYmFjayB0byBub3JtYWwgYmVoYXZpb3IKICAgICAgICAgICAgcmV0dXJuIGVhc3lfaW5zdGFsbC5pbnN0YWxsX2VnZ19zY3JpcHRzKHNlbGYsIGRpc3QpCgogICAgICAgICMgY3JlYXRlIHdyYXBwZXIgc2NyaXB0cyBpbiB0aGUgc2NyaXB0IGRpciwgcG9pbnRpbmcgdG8gZGlzdC5zY3JpcHRzCgogICAgICAgICMgbmV3LXN0eWxlLi4uCiAgICAgICAgc2VsZi5pbnN0YWxsX3dyYXBwZXJfc2NyaXB0cyhkaXN0KQoKICAgICAgICAjIC4uLmFuZCBvbGQtc3R5bGUKICAgICAgICBmb3Igc2NyaXB0X25hbWUgaW4gc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0cyBvciBbXToKICAgICAgICAgICAgc2NyaXB0X3BhdGggPSBvcy5wYXRoLmFic3BhdGgoY29udmVydF9wYXRoKHNjcmlwdF9uYW1lKSkKICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHNjcmlwdF9wYXRoKQogICAgICAgICAgICB3aXRoIGlvLm9wZW4oc2NyaXB0X3BhdGgpIGFzIHN0cm06CiAgICAgICAgICAgICAgICBzY3JpcHRfdGV4dCA9IHN0cm0ucmVhZCgpCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zY3JpcHQoZGlzdCwgc2NyaXB0X25hbWUsIHNjcmlwdF90ZXh0LCBzY3JpcHRfcGF0aCkKCiAgICBkZWYgaW5zdGFsbF93cmFwcGVyX3NjcmlwdHMoc2VsZiwgZGlzdCk6CiAgICAgICAgZGlzdCA9IFZlcnNpb25sZXNzUmVxdWlyZW1lbnQoZGlzdCkKICAgICAgICByZXR1cm4gZWFzeV9pbnN0YWxsLmluc3RhbGxfd3JhcHBlcl9zY3JpcHRzKHNlbGYsIGRpc3QpCgoKY2xhc3MgVmVyc2lvbmxlc3NSZXF1aXJlbWVudChvYmplY3QpOgogICAgIiIiCiAgICBBZGFwdCBhIHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uIHRvIHNpbXBseSByZXR1cm4gdGhlIHByb2plY3QKICAgIG5hbWUgYXMgdGhlICdyZXF1aXJlbWVudCcgc28gdGhhdCBzY3JpcHRzIHdpbGwgd29yayBhY3Jvc3MKICAgIG11bHRpcGxlIHZlcnNpb25zLgoKICAgID4+PiBkaXN0ID0gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT0nZm9vJywgdmVyc2lvbj0nMS4wJykKICAgID4+PiBzdHIoZGlzdC5hc19yZXF1aXJlbWVudCgpKQogICAgJ2Zvbz09MS4wJwogICAgPj4+IGFkYXB0ZWRfZGlzdCA9IFZlcnNpb25sZXNzUmVxdWlyZW1lbnQoZGlzdCkKICAgID4+PiBzdHIoYWRhcHRlZF9kaXN0LmFzX3JlcXVpcmVtZW50KCkpCiAgICAnZm9vJwogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpc3QpOgogICAgICAgIHNlbGYuX19kaXN0ID0gZGlzdAoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9fZGlzdCwgbmFtZSkKCiAgICBkZWYgYXNfcmVxdWlyZW1lbnQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYucHJvamVjdF9uYW1lClBLAwQUAAAAAAAAACEA/+j2kcADAADAAwAANwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9kaXN0X2luZm8ucHkiIiIKQ3JlYXRlIGEgZGlzdF9pbmZvIGRpcmVjdG9yeQpBcyBkZWZpbmVkIGluIHRoZSB3aGVlbCBzcGVjaWZpY2F0aW9uCiIiIgoKaW1wb3J0IG9zCgpmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKCgpjbGFzcyBkaXN0X2luZm8oQ29tbWFuZCk6CgogICAgZGVzY3JpcHRpb24gPSAnY3JlYXRlIGEgLmRpc3QtaW5mbyBkaXJlY3RvcnknCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnZWdnLWJhc2U9JywgJ2UnLCAiZGlyZWN0b3J5IGNvbnRhaW5pbmcgLmVnZy1pbmZvIGRpcmVjdG9yaWVzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAiIChkZWZhdWx0OiB0b3Agb2YgdGhlIHNvdXJjZSB0cmVlKSIpLAogICAgXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5lZ2dfYmFzZSA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBlZ2dfaW5mbyA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgZWdnX2luZm8uZWdnX2Jhc2UgPSBzZWxmLmVnZ19iYXNlCiAgICAgICAgZWdnX2luZm8uZmluYWxpemVfb3B0aW9ucygpCiAgICAgICAgZWdnX2luZm8ucnVuKCkKICAgICAgICBkaXN0X2luZm9fZGlyID0gZWdnX2luZm8uZWdnX2luZm9bOi1sZW4oJy5lZ2ctaW5mbycpXSArICcuZGlzdC1pbmZvJwogICAgICAgIGxvZy5pbmZvKCJjcmVhdGluZyAne30nIi5mb3JtYXQob3MucGF0aC5hYnNwYXRoKGRpc3RfaW5mb19kaXIpKSkKCiAgICAgICAgYmRpc3Rfd2hlZWwgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYmRpc3Rfd2hlZWwnKQogICAgICAgIGJkaXN0X3doZWVsLmVnZzJkaXN0KGVnZ19pbmZvLmVnZ19pbmZvLCBkaXN0X2luZm9fZGlyKQpQSwMEFAAAAAAAAAAhAKt0EulVVAEAVVQBADoAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvZWFzeV9pbnN0YWxsLnB5IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiIiIgpFYXN5IEluc3RhbGwKLS0tLS0tLS0tLS0tCgpBIHRvb2wgZm9yIGRvaW5nIGF1dG9tYXRpYyBkb3dubG9hZC9leHRyYWN0L2J1aWxkIG9mIGRpc3R1dGlscy1iYXNlZCBQeXRob24KcGFja2FnZXMuICBGb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgRWFzeUluc3RhbGwudHh0CmZpbGUsIG9yIHZpc2l0IHRoZSBgRWFzeUluc3RhbGwgaG9tZSBwYWdlYF9fLgoKX18gaHR0cHM6Ly9zZXR1cHRvb2xzLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9lYXN5X2luc3RhbGwuaHRtbAoKIiIiCgpmcm9tIGdsb2IgaW1wb3J0IGdsb2IKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aCwgc3Vic3RfdmFycwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0ICgKICAgIERpc3R1dGlsc0FyZ0Vycm9yLCBEaXN0dXRpbHNPcHRpb25FcnJvciwKICAgIERpc3R1dGlsc0Vycm9yLCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLAopCmZyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbCBpbXBvcnQgSU5TVEFMTF9TQ0hFTUVTLCBTQ0hFTUVfS0VZUwpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nLCBkaXJfdXRpbApmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3NjcmlwdHMgaW1wb3J0IGZpcnN0X2xpbmVfcmUKZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IGZpbmRfZXhlY3V0YWJsZQppbXBvcnQgc3lzCmltcG9ydCBvcwppbXBvcnQgemlwaW1wb3J0CmltcG9ydCBzaHV0aWwKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCB6aXBmaWxlCmltcG9ydCByZQppbXBvcnQgc3RhdAppbXBvcnQgcmFuZG9tCmltcG9ydCB0ZXh0d3JhcAppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHNpdGUKaW1wb3J0IHN0cnVjdAppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgc3VicHJvY2VzcwppbXBvcnQgc2hsZXgKaW1wb3J0IGlvCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IGNvbmZpZ3BhcnNlciwgbWFwCgpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKZnJvbSBzZXR1cHRvb2xzLnNhbmRib3ggaW1wb3J0IHJ1bl9zZXR1cApmcm9tIHNldHVwdG9vbHMucHkzMWNvbXBhdCBpbXBvcnQgZ2V0X3BhdGgsIGdldF9jb25maWdfdmFycwpmcm9tIHNldHVwdG9vbHMucHkyN2NvbXBhdCBpbXBvcnQgcm10cmVlX3NhZmUKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQgaW1wb3J0IHNldG9wdApmcm9tIHNldHVwdG9vbHMuYXJjaGl2ZV91dGlsIGltcG9ydCB1bnBhY2tfYXJjaGl2ZQpmcm9tIHNldHVwdG9vbHMucGFja2FnZV9pbmRleCBpbXBvcnQgKAogICAgUGFja2FnZUluZGV4LCBwYXJzZV9yZXF1aXJlbWVudF9hcmcsIFVSTF9TQ0hFTUUsCikKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQgaW1wb3J0IGJkaXN0X2VnZywgZWdnX2luZm8KZnJvbSBzZXR1cHRvb2xzLndoZWVsIGltcG9ydCBXaGVlbApmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0ICgKICAgIHlpZWxkX2xpbmVzLCBub3JtYWxpemVfcGF0aCwgcmVzb3VyY2Vfc3RyaW5nLCBlbnN1cmVfZGlyZWN0b3J5LAogICAgZ2V0X2Rpc3RyaWJ1dGlvbiwgZmluZF9kaXN0cmlidXRpb25zLCBFbnZpcm9ubWVudCwgUmVxdWlyZW1lbnQsCiAgICBEaXN0cmlidXRpb24sIFBhdGhNZXRhZGF0YSwgRWdnTWV0YWRhdGEsIFdvcmtpbmdTZXQsIERpc3RyaWJ1dGlvbk5vdEZvdW5kLAogICAgVmVyc2lvbkNvbmZsaWN0LCBERVZFTE9QX0RJU1QsCikKaW1wb3J0IHBrZ19yZXNvdXJjZXMucHkzMWNvbXBhdAoKIyBUdXJuIG9uIFBFUDQ0MFdhcm5pbmdzCndhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJkZWZhdWx0IiwgY2F0ZWdvcnk9cGtnX3Jlc291cmNlcy5QRVA0NDBXYXJuaW5nKQoKX19hbGxfXyA9IFsKICAgICdzYW1lZmlsZScsICdlYXN5X2luc3RhbGwnLCAnUHRoRGlzdHJpYnV0aW9ucycsICdleHRyYWN0X3dpbmluc3RfY2ZnJywKICAgICdtYWluJywgJ2dldF9leGVfcHJlZml4ZXMnLApdCgoKZGVmIGlzXzY0Yml0KCk6CiAgICByZXR1cm4gc3RydWN0LmNhbGNzaXplKCJQIikgPT0gOAoKCmRlZiBzYW1lZmlsZShwMSwgcDIpOgogICAgIiIiCiAgICBEZXRlcm1pbmUgaWYgdHdvIHBhdGhzIHJlZmVyZW5jZSB0aGUgc2FtZSBmaWxlLgoKICAgIEF1Z21lbnRzIG9zLnBhdGguc2FtZWZpbGUgdG8gd29yayBvbiBXaW5kb3dzIGFuZAogICAgc3VwcHJlc3NlcyBlcnJvcnMgaWYgdGhlIHBhdGggZG9lc24ndCBleGlzdC4KICAgICIiIgogICAgYm90aF9leGlzdCA9IG9zLnBhdGguZXhpc3RzKHAxKSBhbmQgb3MucGF0aC5leGlzdHMocDIpCiAgICB1c2Vfc2FtZWZpbGUgPSBoYXNhdHRyKG9zLnBhdGgsICdzYW1lZmlsZScpIGFuZCBib3RoX2V4aXN0CiAgICBpZiB1c2Vfc2FtZWZpbGU6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguc2FtZWZpbGUocDEsIHAyKQogICAgbm9ybV9wMSA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5ub3JtY2FzZShwMSkpCiAgICBub3JtX3AyID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLm5vcm1jYXNlKHAyKSkKICAgIHJldHVybiBub3JtX3AxID09IG5vcm1fcDIKCgppZiBzaXguUFkyOgoKICAgIGRlZiBfdG9fYXNjaWkocyk6CiAgICAgICAgcmV0dXJuIHMKCiAgICBkZWYgaXNhc2NpaShzKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNpeC50ZXh0X3R5cGUocywgJ2FzY2lpJykKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKZWxzZToKCiAgICBkZWYgX3RvX2FzY2lpKHMpOgogICAgICAgIHJldHVybiBzLmVuY29kZSgnYXNjaWknKQoKICAgIGRlZiBpc2FzY2lpKHMpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcy5lbmNvZGUoJ2FzY2lpJykKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCgpfb25lX2xpbmVyID0gbGFtYmRhIHRleHQ6IHRleHR3cmFwLmRlZGVudCh0ZXh0KS5zdHJpcCgpLnJlcGxhY2UoJ1xuJywgJzsgJykKCgpjbGFzcyBlYXN5X2luc3RhbGwoQ29tbWFuZCk6CiAgICAiIiJNYW5hZ2UgYSBkb3dubG9hZC9idWlsZC9pbnN0YWxsIHByb2Nlc3MiIiIKICAgIGRlc2NyaXB0aW9uID0gIkZpbmQvZ2V0L2luc3RhbGwgUHl0aG9uIHBhY2thZ2VzIgogICAgY29tbWFuZF9jb25zdW1lc19hcmd1bWVudHMgPSBUcnVlCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgncHJlZml4PScsIE5vbmUsICJpbnN0YWxsYXRpb24gcHJlZml4IiksCiAgICAgICAgKCJ6aXAtb2siLCAieiIsICJpbnN0YWxsIHBhY2thZ2UgYXMgYSB6aXBmaWxlIiksCiAgICAgICAgKCJtdWx0aS12ZXJzaW9uIiwgIm0iLCAibWFrZSBhcHBzIGhhdmUgdG8gcmVxdWlyZSgpIGEgdmVyc2lvbiIpLAogICAgICAgICgidXBncmFkZSIsICJVIiwgImZvcmNlIHVwZ3JhZGUgKHNlYXJjaGVzIFB5UEkgZm9yIGxhdGVzdCB2ZXJzaW9ucykiKSwKICAgICAgICAoImluc3RhbGwtZGlyPSIsICJkIiwgImluc3RhbGwgcGFja2FnZSB0byBESVIiKSwKICAgICAgICAoInNjcmlwdC1kaXI9IiwgInMiLCAiaW5zdGFsbCBzY3JpcHRzIHRvIERJUiIpLAogICAgICAgICgiZXhjbHVkZS1zY3JpcHRzIiwgIngiLCAiRG9uJ3QgaW5zdGFsbCBzY3JpcHRzIiksCiAgICAgICAgKCJhbHdheXMtY29weSIsICJhIiwgIkNvcHkgYWxsIG5lZWRlZCBwYWNrYWdlcyB0byBpbnN0YWxsIGRpciIpLAogICAgICAgICgiaW5kZXgtdXJsPSIsICJpIiwgImJhc2UgVVJMIG9mIFB5dGhvbiBQYWNrYWdlIEluZGV4IiksCiAgICAgICAgKCJmaW5kLWxpbmtzPSIsICJmIiwgImFkZGl0aW9uYWwgVVJMKHMpIHRvIHNlYXJjaCBmb3IgcGFja2FnZXMiKSwKICAgICAgICAoImJ1aWxkLWRpcmVjdG9yeT0iLCAiYiIsCiAgICAgICAgICJkb3dubG9hZC9leHRyYWN0L2J1aWxkIGluIERJUjsga2VlcCB0aGUgcmVzdWx0cyIpLAogICAgICAgICgnb3B0aW1pemU9JywgJ08nLAogICAgICAgICAiYWxzbyBjb21waWxlIHdpdGggb3B0aW1pemF0aW9uOiAtTzEgZm9yIFwicHl0aG9uIC1PXCIsICIKICAgICAgICAgIi1PMiBmb3IgXCJweXRob24gLU9PXCIsIGFuZCAtTzAgdG8gZGlzYWJsZSBbZGVmYXVsdDogLU8wXSIpLAogICAgICAgICgncmVjb3JkPScsIE5vbmUsCiAgICAgICAgICJmaWxlbmFtZSBpbiB3aGljaCB0byByZWNvcmQgbGlzdCBvZiBpbnN0YWxsZWQgZmlsZXMiKSwKICAgICAgICAoJ2Fsd2F5cy11bnppcCcsICdaJywgImRvbid0IGluc3RhbGwgYXMgYSB6aXBmaWxlLCBubyBtYXR0ZXIgd2hhdCIpLAogICAgICAgICgnc2l0ZS1kaXJzPScsICdTJywgImxpc3Qgb2YgZGlyZWN0b3JpZXMgd2hlcmUgLnB0aCBmaWxlcyB3b3JrIiksCiAgICAgICAgKCdlZGl0YWJsZScsICdlJywgIkluc3RhbGwgc3BlY2lmaWVkIHBhY2thZ2VzIGluIGVkaXRhYmxlIGZvcm0iKSwKICAgICAgICAoJ25vLWRlcHMnLCAnTicsICJkb24ndCBpbnN0YWxsIGRlcGVuZGVuY2llcyIpLAogICAgICAgICgnYWxsb3ctaG9zdHM9JywgJ0gnLCAicGF0dGVybihzKSB0aGF0IGhvc3RuYW1lcyBtdXN0IG1hdGNoIiksCiAgICAgICAgKCdsb2NhbC1zbmFwc2hvdHMtb2snLCAnbCcsCiAgICAgICAgICJhbGxvdyBidWlsZGluZyBlZ2dzIGZyb20gbG9jYWwgY2hlY2tvdXRzIiksCiAgICAgICAgKCd2ZXJzaW9uJywgTm9uZSwgInByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQiKSwKICAgICAgICAoJ25vLWZpbmQtbGlua3MnLCBOb25lLAogICAgICAgICAiRG9uJ3QgbG9hZCBmaW5kLWxpbmtzIGRlZmluZWQgaW4gcGFja2FnZXMgYmVpbmcgaW5zdGFsbGVkIikKICAgIF0KICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsKICAgICAgICAnemlwLW9rJywgJ211bHRpLXZlcnNpb24nLCAnZXhjbHVkZS1zY3JpcHRzJywgJ3VwZ3JhZGUnLCAnYWx3YXlzLWNvcHknLAogICAgICAgICdlZGl0YWJsZScsCiAgICAgICAgJ25vLWRlcHMnLCAnbG9jYWwtc25hcHNob3RzLW9rJywgJ3ZlcnNpb24nCiAgICBdCgogICAgaWYgc2l0ZS5FTkFCTEVfVVNFUl9TSVRFOgogICAgICAgIGhlbHBfbXNnID0gImluc3RhbGwgaW4gdXNlciBzaXRlLXBhY2thZ2UgJyVzJyIgJSBzaXRlLlVTRVJfU0lURQogICAgICAgIHVzZXJfb3B0aW9ucy5hcHBlbmQoKCd1c2VyJywgTm9uZSwgaGVscF9tc2cpKQogICAgICAgIGJvb2xlYW5fb3B0aW9ucy5hcHBlbmQoJ3VzZXInKQoKICAgIG5lZ2F0aXZlX29wdCA9IHsnYWx3YXlzLXVuemlwJzogJ3ppcC1vayd9CiAgICBjcmVhdGVfaW5kZXggPSBQYWNrYWdlSW5kZXgKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgICMgdGhlIC0tdXNlciBvcHRpb24gc2VlbXMgdG8gYmUgYW4gb3B0LWluIG9uZSwKICAgICAgICAjIHNvIHRoZSBkZWZhdWx0IHNob3VsZCBiZSBGYWxzZS4KICAgICAgICBzZWxmLnVzZXIgPSAwCiAgICAgICAgc2VsZi56aXBfb2sgPSBzZWxmLmxvY2FsX3NuYXBzaG90c19vayA9IE5vbmUKICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gc2VsZi5zY3JpcHRfZGlyID0gc2VsZi5leGNsdWRlX3NjcmlwdHMgPSBOb25lCiAgICAgICAgc2VsZi5pbmRleF91cmwgPSBOb25lCiAgICAgICAgc2VsZi5maW5kX2xpbmtzID0gTm9uZQogICAgICAgIHNlbGYuYnVpbGRfZGlyZWN0b3J5ID0gTm9uZQogICAgICAgIHNlbGYuYXJncyA9IE5vbmUKICAgICAgICBzZWxmLm9wdGltaXplID0gc2VsZi5yZWNvcmQgPSBOb25lCiAgICAgICAgc2VsZi51cGdyYWRlID0gc2VsZi5hbHdheXNfY29weSA9IHNlbGYubXVsdGlfdmVyc2lvbiA9IE5vbmUKICAgICAgICBzZWxmLmVkaXRhYmxlID0gc2VsZi5ub19kZXBzID0gc2VsZi5hbGxvd19ob3N0cyA9IE5vbmUKICAgICAgICBzZWxmLnJvb3QgPSBzZWxmLnByZWZpeCA9IHNlbGYubm9fcmVwb3J0ID0gTm9uZQogICAgICAgIHNlbGYudmVyc2lvbiA9IE5vbmUKICAgICAgICBzZWxmLmluc3RhbGxfcHVyZWxpYiA9IE5vbmUgICMgZm9yIHB1cmUgbW9kdWxlIGRpc3RyaWJ1dGlvbnMKICAgICAgICBzZWxmLmluc3RhbGxfcGxhdGxpYiA9IE5vbmUgICMgbm9uLXB1cmUgKGRpc3RzIHcvIGV4dGVuc2lvbnMpCiAgICAgICAgc2VsZi5pbnN0YWxsX2hlYWRlcnMgPSBOb25lICAjIGZvciBDL0MrKyBoZWFkZXJzCiAgICAgICAgc2VsZi5pbnN0YWxsX2xpYiA9IE5vbmUgICMgc2V0IHRvIGVpdGhlciBwdXJlbGliIG9yIHBsYXRsaWIKICAgICAgICBzZWxmLmluc3RhbGxfc2NyaXB0cyA9IE5vbmUKICAgICAgICBzZWxmLmluc3RhbGxfZGF0YSA9IE5vbmUKICAgICAgICBzZWxmLmluc3RhbGxfYmFzZSA9IE5vbmUKICAgICAgICBzZWxmLmluc3RhbGxfcGxhdGJhc2UgPSBOb25lCiAgICAgICAgaWYgc2l0ZS5FTkFCTEVfVVNFUl9TSVRFOgogICAgICAgICAgICBzZWxmLmluc3RhbGxfdXNlcmJhc2UgPSBzaXRlLlVTRVJfQkFTRQogICAgICAgICAgICBzZWxmLmluc3RhbGxfdXNlcnNpdGUgPSBzaXRlLlVTRVJfU0lURQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF91c2VyYmFzZSA9IE5vbmUKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3VzZXJzaXRlID0gTm9uZQogICAgICAgIHNlbGYubm9fZmluZF9saW5rcyA9IE5vbmUKCiAgICAgICAgIyBPcHRpb25zIG5vdCBzcGVjaWZpYWJsZSB2aWEgY29tbWFuZCBsaW5lCiAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4ID0gTm9uZQogICAgICAgIHNlbGYucHRoX2ZpbGUgPSBzZWxmLmFsd2F5c19jb3B5X2Zyb20gPSBOb25lCiAgICAgICAgc2VsZi5zaXRlX2RpcnMgPSBOb25lCiAgICAgICAgc2VsZi5pbnN0YWxsZWRfcHJvamVjdHMgPSB7fQogICAgICAgIHNlbGYuc2l0ZXB5X2luc3RhbGxlZCA9IEZhbHNlCiAgICAgICAgIyBBbHdheXMgcmVhZCBlYXN5X2luc3RhbGwgb3B0aW9ucywgZXZlbiBpZiB3ZSBhcmUgc3ViY2xhc3NlZCwgb3IgaGF2ZQogICAgICAgICMgYW4gaW5kZXBlbmRlbnQgaW5zdGFuY2UgY3JlYXRlZC4gIFRoaXMgZW5zdXJlcyB0aGF0IGRlZmF1bHRzIHdpbGwKICAgICAgICAjIGFsd2F5cyBjb21lIGZyb20gdGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZmlsZShzKScgImVhc3lfaW5zdGFsbCIKICAgICAgICAjIHNlY3Rpb24sIGV2ZW4gaWYgdGhpcyBpcyBhICJkZXZlbG9wIiBvciAiaW5zdGFsbCIgY29tbWFuZCwgb3Igc29tZQogICAgICAgICMgb3RoZXIgZW1iZWRkaW5nLgogICAgICAgIHNlbGYuX2RyeV9ydW4gPSBOb25lCiAgICAgICAgc2VsZi52ZXJib3NlID0gc2VsZi5kaXN0cmlidXRpb24udmVyYm9zZQogICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLl9zZXRfY29tbWFuZF9vcHRpb25zKAogICAgICAgICAgICBzZWxmLCBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfb3B0aW9uX2RpY3QoJ2Vhc3lfaW5zdGFsbCcpCiAgICAgICAgKQoKICAgIGRlZiBkZWxldGVfYmxvY2tlcnMoc2VsZiwgYmxvY2tlcnMpOgogICAgICAgIGV4dGFudF9ibG9ja2VycyA9ICgKICAgICAgICAgICAgZmlsZW5hbWUgZm9yIGZpbGVuYW1lIGluIGJsb2NrZXJzCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKSBvciBvcy5wYXRoLmlzbGluayhmaWxlbmFtZSkKICAgICAgICApCiAgICAgICAgbGlzdChtYXAoc2VsZi5fZGVsZXRlX3BhdGgsIGV4dGFudF9ibG9ja2VycykpCgogICAgZGVmIF9kZWxldGVfcGF0aChzZWxmLCBwYXRoKToKICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgJXMiLCBwYXRoKQogICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlzX3RyZWUgPSBvcy5wYXRoLmlzZGlyKHBhdGgpIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsocGF0aCkKICAgICAgICByZW1vdmVyID0gcm10cmVlIGlmIGlzX3RyZWUgZWxzZSBvcy51bmxpbmsKICAgICAgICByZW1vdmVyKHBhdGgpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9yZW5kZXJfdmVyc2lvbigpOgogICAgICAgICIiIgogICAgICAgIFJlbmRlciB0aGUgU2V0dXB0b29scyB2ZXJzaW9uIGFuZCBpbnN0YWxsYXRpb24gZGV0YWlscywgdGhlbiBleGl0LgogICAgICAgICIiIgogICAgICAgIHZlciA9IHN5cy52ZXJzaW9uWzozXQogICAgICAgIGRpc3QgPSBnZXRfZGlzdHJpYnV0aW9uKCdzZXR1cHRvb2xzJykKICAgICAgICB0bXBsID0gJ3NldHVwdG9vbHMge2Rpc3QudmVyc2lvbn0gZnJvbSB7ZGlzdC5sb2NhdGlvbn0gKFB5dGhvbiB7dmVyfSknCiAgICAgICAgcHJpbnQodG1wbC5mb3JtYXQoKipsb2NhbHMoKSkpCiAgICAgICAgcmFpc2UgU3lzdGVtRXhpdCgpCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi52ZXJzaW9uIGFuZCBzZWxmLl9yZW5kZXJfdmVyc2lvbigpCgogICAgICAgIHB5X3ZlcnNpb24gPSBzeXMudmVyc2lvbi5zcGxpdCgpWzBdCiAgICAgICAgcHJlZml4LCBleGVjX3ByZWZpeCA9IGdldF9jb25maWdfdmFycygncHJlZml4JywgJ2V4ZWNfcHJlZml4JykKCiAgICAgICAgc2VsZi5jb25maWdfdmFycyA9IHsKICAgICAgICAgICAgJ2Rpc3RfbmFtZSc6IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9uYW1lKCksCiAgICAgICAgICAgICdkaXN0X3ZlcnNpb24nOiBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpLAogICAgICAgICAgICAnZGlzdF9mdWxsbmFtZSc6IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9mdWxsbmFtZSgpLAogICAgICAgICAgICAncHlfdmVyc2lvbic6IHB5X3ZlcnNpb24sCiAgICAgICAgICAgICdweV92ZXJzaW9uX3Nob3J0JzogcHlfdmVyc2lvblswOjNdLAogICAgICAgICAgICAncHlfdmVyc2lvbl9ub2RvdCc6IHB5X3ZlcnNpb25bMF0gKyBweV92ZXJzaW9uWzJdLAogICAgICAgICAgICAnc3lzX3ByZWZpeCc6IHByZWZpeCwKICAgICAgICAgICAgJ3ByZWZpeCc6IHByZWZpeCwKICAgICAgICAgICAgJ3N5c19leGVjX3ByZWZpeCc6IGV4ZWNfcHJlZml4LAogICAgICAgICAgICAnZXhlY19wcmVmaXgnOiBleGVjX3ByZWZpeCwKICAgICAgICAgICAgIyBPbmx5IHB5dGhvbiAzLjIrIGhhcyBhYmlmbGFncwogICAgICAgICAgICAnYWJpZmxhZ3MnOiBnZXRhdHRyKHN5cywgJ2FiaWZsYWdzJywgJycpLAogICAgICAgIH0KCiAgICAgICAgaWYgc2l0ZS5FTkFCTEVfVVNFUl9TSVRFOgogICAgICAgICAgICBzZWxmLmNvbmZpZ192YXJzWyd1c2VyYmFzZSddID0gc2VsZi5pbnN0YWxsX3VzZXJiYXNlCiAgICAgICAgICAgIHNlbGYuY29uZmlnX3ZhcnNbJ3VzZXJzaXRlJ10gPSBzZWxmLmluc3RhbGxfdXNlcnNpdGUKCiAgICAgICAgc2VsZi5fZml4X2luc3RhbGxfZGlyX2Zvcl91c2VyX3NpdGUoKQoKICAgICAgICBzZWxmLmV4cGFuZF9iYXNlZGlycygpCiAgICAgICAgc2VsZi5leHBhbmRfZGlycygpCgogICAgICAgIHNlbGYuX2V4cGFuZCgKICAgICAgICAgICAgJ2luc3RhbGxfZGlyJywgJ3NjcmlwdF9kaXInLCAnYnVpbGRfZGlyZWN0b3J5JywKICAgICAgICAgICAgJ3NpdGVfZGlycycsCiAgICAgICAgKQogICAgICAgICMgSWYgYSBub24tZGVmYXVsdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHdhcyBzcGVjaWZpZWQsIGRlZmF1bHQgdGhlCiAgICAgICAgIyBzY3JpcHQgZGlyZWN0b3J5IHRvIG1hdGNoIGl0LgogICAgICAgIGlmIHNlbGYuc2NyaXB0X2RpciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnNjcmlwdF9kaXIgPSBzZWxmLmluc3RhbGxfZGlyCgogICAgICAgIGlmIHNlbGYubm9fZmluZF9saW5rcyBpcyBOb25lOgogICAgICAgICAgICBzZWxmLm5vX2ZpbmRfbGlua3MgPSBGYWxzZQoKICAgICAgICAjIExldCBpbnN0YWxsX2RpciBnZXQgc2V0IGJ5IGluc3RhbGxfbGliIGNvbW1hbmQsIHdoaWNoIGluIHR1cm4KICAgICAgICAjIGdldHMgaXRzIGluZm8gZnJvbSB0aGUgaW5zdGFsbCBjb21tYW5kLCBhbmQgdGFrZXMgaW50byBhY2NvdW50CiAgICAgICAgIyAtLXByZWZpeCBhbmQgLS1ob21lIGFuZCBhbGwgdGhhdCBvdGhlciBjcnVkLgogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKAogICAgICAgICAgICAnaW5zdGFsbF9saWInLCAoJ2luc3RhbGxfZGlyJywgJ2luc3RhbGxfZGlyJykKICAgICAgICApCiAgICAgICAgIyBMaWtld2lzZSwgc2V0IGRlZmF1bHQgc2NyaXB0X2RpciBmcm9tICdpbnN0YWxsX3NjcmlwdHMuaW5zdGFsbF9kaXInCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoCiAgICAgICAgICAgICdpbnN0YWxsX3NjcmlwdHMnLCAoJ2luc3RhbGxfZGlyJywgJ3NjcmlwdF9kaXInKQogICAgICAgICkKCiAgICAgICAgaWYgc2VsZi51c2VyIGFuZCBzZWxmLmluc3RhbGxfcHVyZWxpYjoKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IHNlbGYuaW5zdGFsbF9wdXJlbGliCiAgICAgICAgICAgIHNlbGYuc2NyaXB0X2RpciA9IHNlbGYuaW5zdGFsbF9zY3JpcHRzCiAgICAgICAgIyBkZWZhdWx0IC0tcmVjb3JkIGZyb20gdGhlIGluc3RhbGwgY29tbWFuZAogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsJywgKCdyZWNvcmQnLCAncmVjb3JkJykpCiAgICAgICAgIyBTaG91bGQgdGhpcyBiZSBtb3ZlZCB0byB0aGUgaWYgc3RhdGVtZW50IGJlbG93PyBJdCdzIG5vdCB1c2VkCiAgICAgICAgIyBlbHNld2hlcmUKICAgICAgICBub3JtcGF0aCA9IG1hcChub3JtYWxpemVfcGF0aCwgc3lzLnBhdGgpCiAgICAgICAgc2VsZi5hbGxfc2l0ZV9kaXJzID0gZ2V0X3NpdGVfZGlycygpCiAgICAgICAgaWYgc2VsZi5zaXRlX2RpcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNpdGVfZGlycyA9IFsKICAgICAgICAgICAgICAgIG9zLnBhdGguZXhwYW5kdXNlcihzLnN0cmlwKCkpIGZvciBzIGluCiAgICAgICAgICAgICAgICBzZWxmLnNpdGVfZGlycy5zcGxpdCgnLCcpCiAgICAgICAgICAgIF0KICAgICAgICAgICAgZm9yIGQgaW4gc2l0ZV9kaXJzOgogICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZCk6CiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIiVzIChpbiAtLXNpdGUtZGlycykgZG9lcyBub3QgZXhpc3QiLCBkKQogICAgICAgICAgICAgICAgZWxpZiBub3JtYWxpemVfcGF0aChkKSBub3QgaW4gbm9ybXBhdGg6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIGQgKyAiIChpbiAtLXNpdGUtZGlycykgaXMgbm90IG9uIHN5cy5wYXRoIgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hbGxfc2l0ZV9kaXJzLmFwcGVuZChub3JtYWxpemVfcGF0aChkKSkKICAgICAgICBpZiBub3Qgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgc2VsZi5jaGVja19zaXRlX2RpcigpCiAgICAgICAgc2VsZi5pbmRleF91cmwgPSBzZWxmLmluZGV4X3VybCBvciAiaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvc2ltcGxlIgogICAgICAgIHNlbGYuc2hhZG93X3BhdGggPSBzZWxmLmFsbF9zaXRlX2RpcnNbOl0KICAgICAgICBmb3IgcGF0aF9pdGVtIGluIHNlbGYuaW5zdGFsbF9kaXIsIG5vcm1hbGl6ZV9wYXRoKHNlbGYuc2NyaXB0X2Rpcik6CiAgICAgICAgICAgIGlmIHBhdGhfaXRlbSBub3QgaW4gc2VsZi5zaGFkb3dfcGF0aDoKICAgICAgICAgICAgICAgIHNlbGYuc2hhZG93X3BhdGguaW5zZXJ0KDAsIHBhdGhfaXRlbSkKCiAgICAgICAgaWYgc2VsZi5hbGxvd19ob3N0cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaG9zdHMgPSBbcy5zdHJpcCgpIGZvciBzIGluIHNlbGYuYWxsb3dfaG9zdHMuc3BsaXQoJywnKV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBob3N0cyA9IFsnKiddCiAgICAgICAgaWYgc2VsZi5wYWNrYWdlX2luZGV4IGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYucGFja2FnZV9pbmRleCA9IHNlbGYuY3JlYXRlX2luZGV4KAogICAgICAgICAgICAgICAgc2VsZi5pbmRleF91cmwsIHNlYXJjaF9wYXRoPXNlbGYuc2hhZG93X3BhdGgsIGhvc3RzPWhvc3RzLAogICAgICAgICAgICApCiAgICAgICAgc2VsZi5sb2NhbF9pbmRleCA9IEVudmlyb25tZW50KHNlbGYuc2hhZG93X3BhdGggKyBzeXMucGF0aCkKCiAgICAgICAgaWYgc2VsZi5maW5kX2xpbmtzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZmluZF9saW5rcywgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICBzZWxmLmZpbmRfbGlua3MgPSBzZWxmLmZpbmRfbGlua3Muc3BsaXQoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZmluZF9saW5rcyA9IFtdCiAgICAgICAgaWYgc2VsZi5sb2NhbF9zbmFwc2hvdHNfb2s6CiAgICAgICAgICAgIHNlbGYucGFja2FnZV9pbmRleC5zY2FuX2VnZ19saW5rcyhzZWxmLnNoYWRvd19wYXRoICsgc3lzLnBhdGgpCiAgICAgICAgaWYgbm90IHNlbGYubm9fZmluZF9saW5rczoKICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4LmFkZF9maW5kX2xpbmtzKHNlbGYuZmluZF9saW5rcykKICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbF9saWInLCAoJ29wdGltaXplJywgJ29wdGltaXplJykpCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi5vcHRpbWl6ZSwgaW50KToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5vcHRpbWl6ZSA9IGludChzZWxmLm9wdGltaXplKQogICAgICAgICAgICAgICAgaWYgbm90ICgwIDw9IHNlbGYub3B0aW1pemUgPD0gMik6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCItLW9wdGltaXplIG11c3QgYmUgMCwgMSwgb3IgMiIpCgogICAgICAgIGlmIHNlbGYuZWRpdGFibGUgYW5kIG5vdCBzZWxmLmJ1aWxkX2RpcmVjdG9yeToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCiAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IGEgYnVpbGQgZGlyZWN0b3J5ICgtYikgd2hlbiB1c2luZyAtLWVkaXRhYmxlIgogICAgICAgICAgICApCiAgICAgICAgaWYgbm90IHNlbGYuYXJnczoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCiAgICAgICAgICAgICAgICAiTm8gdXJscywgZmlsZW5hbWVzLCBvciByZXF1aXJlbWVudHMgc3BlY2lmaWVkIChzZWUgLS1oZWxwKSIpCgogICAgICAgIHNlbGYub3V0cHV0cyA9IFtdCgogICAgZGVmIF9maXhfaW5zdGFsbF9kaXJfZm9yX3VzZXJfc2l0ZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBGaXggdGhlIGluc3RhbGxfZGlyIGlmICItLXVzZXIiIHdhcyB1c2VkLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLnVzZXIgb3Igbm90IHNpdGUuRU5BQkxFX1VTRVJfU0lURToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuY3JlYXRlX2hvbWVfcGF0aCgpCiAgICAgICAgaWYgc2VsZi5pbnN0YWxsX3VzZXJiYXNlIGlzIE5vbmU6CiAgICAgICAgICAgIG1zZyA9ICJVc2VyIGJhc2UgZGlyZWN0b3J5IGlzIG5vdCBzcGVjaWZpZWQiCiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IobXNnKQogICAgICAgIHNlbGYuaW5zdGFsbF9iYXNlID0gc2VsZi5pbnN0YWxsX3BsYXRiYXNlID0gc2VsZi5pbnN0YWxsX3VzZXJiYXNlCiAgICAgICAgc2NoZW1lX25hbWUgPSBvcy5uYW1lLnJlcGxhY2UoJ3Bvc2l4JywgJ3VuaXgnKSArICdfdXNlcicKICAgICAgICBzZWxmLnNlbGVjdF9zY2hlbWUoc2NoZW1lX25hbWUpCgogICAgZGVmIF9leHBhbmRfYXR0cnMoc2VsZiwgYXR0cnMpOgogICAgICAgIGZvciBhdHRyIGluIGF0dHJzOgogICAgICAgICAgICB2YWwgPSBnZXRhdHRyKHNlbGYsIGF0dHIpCiAgICAgICAgICAgIGlmIHZhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JyBvciBvcy5uYW1lID09ICdudCc6CiAgICAgICAgICAgICAgICAgICAgdmFsID0gb3MucGF0aC5leHBhbmR1c2VyKHZhbCkKICAgICAgICAgICAgICAgIHZhbCA9IHN1YnN0X3ZhcnModmFsLCBzZWxmLmNvbmZpZ192YXJzKQogICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWwpCgogICAgZGVmIGV4cGFuZF9iYXNlZGlycyhzZWxmKToKICAgICAgICAiIiJDYWxscyBgb3MucGF0aC5leHBhbmR1c2VyYCBvbiBpbnN0YWxsX2Jhc2UsIGluc3RhbGxfcGxhdGJhc2UgYW5kCiAgICAgICAgcm9vdC4iIiIKICAgICAgICBzZWxmLl9leHBhbmRfYXR0cnMoWydpbnN0YWxsX2Jhc2UnLCAnaW5zdGFsbF9wbGF0YmFzZScsICdyb290J10pCgogICAgZGVmIGV4cGFuZF9kaXJzKHNlbGYpOgogICAgICAgICIiIkNhbGxzIGBvcy5wYXRoLmV4cGFuZHVzZXJgIG9uIGluc3RhbGwgZGlycy4iIiIKICAgICAgICBkaXJzID0gWwogICAgICAgICAgICAnaW5zdGFsbF9wdXJlbGliJywKICAgICAgICAgICAgJ2luc3RhbGxfcGxhdGxpYicsCiAgICAgICAgICAgICdpbnN0YWxsX2xpYicsCiAgICAgICAgICAgICdpbnN0YWxsX2hlYWRlcnMnLAogICAgICAgICAgICAnaW5zdGFsbF9zY3JpcHRzJywKICAgICAgICAgICAgJ2luc3RhbGxfZGF0YScsCiAgICAgICAgXQogICAgICAgIHNlbGYuX2V4cGFuZF9hdHRycyhkaXJzKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgaWYgc2VsZi52ZXJib3NlICE9IHNlbGYuZGlzdHJpYnV0aW9uLnZlcmJvc2U6CiAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYudmVyYm9zZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZvciBzcGVjIGluIHNlbGYuYXJnczoKICAgICAgICAgICAgICAgIHNlbGYuZWFzeV9pbnN0YWxsKHNwZWMsIG5vdCBzZWxmLm5vX2RlcHMpCiAgICAgICAgICAgIGlmIHNlbGYucmVjb3JkOgogICAgICAgICAgICAgICAgb3V0cHV0cyA9IHNlbGYub3V0cHV0cwogICAgICAgICAgICAgICAgaWYgc2VsZi5yb290OiAgIyBzdHJpcCBhbnkgcGFja2FnZSBwcmVmaXgKICAgICAgICAgICAgICAgICAgICByb290X2xlbiA9IGxlbihzZWxmLnJvb3QpCiAgICAgICAgICAgICAgICAgICAgZm9yIGNvdW50ZXIgaW4gcmFuZ2UobGVuKG91dHB1dHMpKToKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0c1tjb3VudGVyXSA9IG91dHB1dHNbY291bnRlcl1bcm9vdF9sZW46XQogICAgICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGZpbGVfdXRpbAoKICAgICAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSgKICAgICAgICAgICAgICAgICAgICBmaWxlX3V0aWwud3JpdGVfZmlsZSwgKHNlbGYucmVjb3JkLCBvdXRwdXRzKSwKICAgICAgICAgICAgICAgICAgICAid3JpdGluZyBsaXN0IG9mIGluc3RhbGxlZCBmaWxlcyB0byAnJXMnIiAlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWNvcmQKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi53YXJuX2RlcHJlY2F0ZWRfb3B0aW9ucygpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgbG9nLnNldF92ZXJib3NpdHkoc2VsZi5kaXN0cmlidXRpb24udmVyYm9zZSkKCiAgICBkZWYgcHNldWRvX3RlbXBuYW1lKHNlbGYpOgogICAgICAgICIiIlJldHVybiBhIHBzZXVkby10ZW1wbmFtZSBiYXNlIGluIHRoZSBpbnN0YWxsIGRpcmVjdG9yeS4KICAgICAgICBUaGlzIGNvZGUgaXMgaW50ZW50aW9uYWxseSBuYWl2ZTsgaWYgYSBtYWxpY2lvdXMgcGFydHkgY2FuIHdyaXRlIHRvCiAgICAgICAgdGhlIHRhcmdldCBkaXJlY3RvcnkgeW91J3JlIGFscmVhZHkgaW4gZGVlcCBkb29kb28uCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwaWQgPSBvcy5nZXRwaWQoKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBpZCA9IHJhbmRvbS5yYW5kaW50KDAsIHN5cy5tYXhzaXplKQogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgInRlc3QtZWFzeS1pbnN0YWxsLSVzIiAlIHBpZCkKCiAgICBkZWYgd2Fybl9kZXByZWNhdGVkX29wdGlvbnMoc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBjaGVja19zaXRlX2RpcihzZWxmKToKICAgICAgICAiIiJWZXJpZnkgdGhhdCBzZWxmLmluc3RhbGxfZGlyIGlzIC5wdGgtY2FwYWJsZSBkaXIsIGlmIG5lZWRlZCIiIgoKICAgICAgICBpbnN0ZGlyID0gbm9ybWFsaXplX3BhdGgoc2VsZi5pbnN0YWxsX2RpcikKICAgICAgICBwdGhfZmlsZSA9IG9zLnBhdGguam9pbihpbnN0ZGlyLCAnZWFzeS1pbnN0YWxsLnB0aCcpCgogICAgICAgICMgSXMgaXQgYSBjb25maWd1cmVkLCBQWVRIT05QQVRILCBpbXBsaWNpdCwgb3IgZXhwbGljaXQgc2l0ZSBkaXI/CiAgICAgICAgaXNfc2l0ZV9kaXIgPSBpbnN0ZGlyIGluIHNlbGYuYWxsX3NpdGVfZGlycwoKICAgICAgICBpZiBub3QgaXNfc2l0ZV9kaXIgYW5kIG5vdCBzZWxmLm11bHRpX3ZlcnNpb246CiAgICAgICAgICAgICMgTm8/ICBUaGVuIGRpcmVjdGx5IHRlc3Qgd2hldGhlciBpdCBkb2VzIC5wdGggZmlsZSBwcm9jZXNzaW5nCiAgICAgICAgICAgIGlzX3NpdGVfZGlyID0gc2VsZi5jaGVja19wdGhfcHJvY2Vzc2luZygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBtYWtlIHN1cmUgd2UgY2FuIHdyaXRlIHRvIHRhcmdldCBkaXIKICAgICAgICAgICAgdGVzdGZpbGUgPSBzZWxmLnBzZXVkb190ZW1wbmFtZSgpICsgJy53cml0ZS10ZXN0JwogICAgICAgICAgICB0ZXN0X2V4aXN0cyA9IG9zLnBhdGguZXhpc3RzKHRlc3RmaWxlKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpZiB0ZXN0X2V4aXN0czoKICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsodGVzdGZpbGUpCiAgICAgICAgICAgICAgICBvcGVuKHRlc3RmaWxlLCAndycpLmNsb3NlKCkKICAgICAgICAgICAgICAgIG9zLnVubGluayh0ZXN0ZmlsZSkKICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgIHNlbGYuY2FudF93cml0ZV90b190YXJnZXQoKQoKICAgICAgICBpZiBub3QgaXNfc2l0ZV9kaXIgYW5kIG5vdCBzZWxmLm11bHRpX3ZlcnNpb246CiAgICAgICAgICAgICMgQ2FuJ3QgaW5zdGFsbCBub24tbXVsdGkgdG8gbm9uLXNpdGUgZGlyCiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKHNlbGYubm9fZGVmYXVsdF92ZXJzaW9uX21zZygpKQoKICAgICAgICBpZiBpc19zaXRlX2RpcjoKICAgICAgICAgICAgaWYgc2VsZi5wdGhfZmlsZSBpcyBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5wdGhfZmlsZSA9IFB0aERpc3RyaWJ1dGlvbnMocHRoX2ZpbGUsIHNlbGYuYWxsX3NpdGVfZGlycykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnB0aF9maWxlID0gTm9uZQoKICAgICAgICBpZiBpbnN0ZGlyIG5vdCBpbiBtYXAobm9ybWFsaXplX3BhdGgsIF9weXRob25wYXRoKCkpOgogICAgICAgICAgICAjIG9ubHkgUFlUSE9OUEFUSCBkaXJzIG5lZWQgYSBzaXRlLnB5LCBzbyBwcmV0ZW5kIGl0J3MgdGhlcmUKICAgICAgICAgICAgc2VsZi5zaXRlcHlfaW5zdGFsbGVkID0gVHJ1ZQogICAgICAgIGVsaWYgc2VsZi5tdWx0aV92ZXJzaW9uIGFuZCBub3Qgb3MucGF0aC5leGlzdHMocHRoX2ZpbGUpOgogICAgICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBUcnVlICAjIGRvbid0IG5lZWQgc2l0ZS5weSBpbiB0aGlzIGNhc2UKICAgICAgICAgICAgc2VsZi5wdGhfZmlsZSA9IE5vbmUgICMgYW5kIGRvbid0IGNyZWF0ZSBhIC5wdGggZmlsZQogICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBpbnN0ZGlyCgogICAgX19jYW50X3dyaXRlX21zZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBjYW4ndCBjcmVhdGUgb3IgcmVtb3ZlIGZpbGVzIGluIGluc3RhbGwgZGlyZWN0b3J5CgogICAgICAgIFRoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGFkZCBvciByZW1vdmUgZmlsZXMgaW4gdGhlCiAgICAgICAgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeToKCiAgICAgICAgICAgICVzCgogICAgICAgIFRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHlvdSBzcGVjaWZpZWQgKHZpYSAtLWluc3RhbGwtZGlyLCAtLXByZWZpeCwgb3IKICAgICAgICB0aGUgZGlzdHV0aWxzIGRlZmF1bHQgc2V0dGluZykgd2FzOgoKICAgICAgICAgICAgJXMKICAgICAgICAiIiIpLmxzdHJpcCgpCgogICAgX19ub3RfZXhpc3RzX2lkID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIFRoaXMgZGlyZWN0b3J5IGRvZXMgbm90IGN1cnJlbnRseSBleGlzdC4gIFBsZWFzZSBjcmVhdGUgaXQgYW5kIHRyeSBhZ2Fpbiwgb3IKICAgICAgICBjaG9vc2UgYSBkaWZmZXJlbnQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSAodXNpbmcgdGhlIC1kIG9yIC0taW5zdGFsbC1kaXIKICAgICAgICBvcHRpb24pLgogICAgICAgICIiIikubHN0cmlwKCkKCiAgICBfX2FjY2Vzc19tc2cgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgUGVyaGFwcyB5b3VyIGFjY291bnQgZG9lcyBub3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhpcyBkaXJlY3Rvcnk/ICBJZiB0aGUKICAgICAgICBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGlzIGEgc3lzdGVtLW93bmVkIGRpcmVjdG9yeSwgeW91IG1heSBuZWVkIHRvIHNpZ24gaW4KICAgICAgICBhcyB0aGUgYWRtaW5pc3RyYXRvciBvciAicm9vdCIgYWNjb3VudC4gIElmIHlvdSBkbyBub3QgaGF2ZSBhZG1pbmlzdHJhdGl2ZQogICAgICAgIGFjY2VzcyB0byB0aGlzIG1hY2hpbmUsIHlvdSBtYXkgd2lzaCB0byBjaG9vc2UgYSBkaWZmZXJlbnQgaW5zdGFsbGF0aW9uCiAgICAgICAgZGlyZWN0b3J5LCBwcmVmZXJhYmx5IG9uZSB0aGF0IGlzIGxpc3RlZCBpbiB5b3VyIFBZVEhPTlBBVEggZW52aXJvbm1lbnQKICAgICAgICB2YXJpYWJsZS4KCiAgICAgICAgRm9yIGluZm9ybWF0aW9uIG9uIG90aGVyIG9wdGlvbnMsIHlvdSBtYXkgd2lzaCB0byBjb25zdWx0IHRoZQogICAgICAgIGRvY3VtZW50YXRpb24gYXQ6CgogICAgICAgICAgaHR0cHM6Ly9zZXR1cHRvb2xzLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9lYXN5X2luc3RhbGwuaHRtbAoKICAgICAgICBQbGVhc2UgbWFrZSB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlcyBmb3IgeW91ciBzeXN0ZW0gYW5kIHRyeSBhZ2Fpbi4KICAgICAgICAiIiIpLmxzdHJpcCgpCgogICAgZGVmIGNhbnRfd3JpdGVfdG9fdGFyZ2V0KHNlbGYpOgogICAgICAgIG1zZyA9IHNlbGYuX19jYW50X3dyaXRlX21zZyAlIChzeXMuZXhjX2luZm8oKVsxXSwgc2VsZi5pbnN0YWxsX2RpciwpCgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmluc3RhbGxfZGlyKToKICAgICAgICAgICAgbXNnICs9ICdcbicgKyBzZWxmLl9fbm90X2V4aXN0c19pZAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1zZyArPSAnXG4nICsgc2VsZi5fX2FjY2Vzc19tc2cKICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihtc2cpCgogICAgZGVmIGNoZWNrX3B0aF9wcm9jZXNzaW5nKHNlbGYpOgogICAgICAgICIiIkVtcGlyaWNhbGx5IHZlcmlmeSB3aGV0aGVyIC5wdGggZmlsZXMgYXJlIHN1cHBvcnRlZCBpbiBpbnN0LiBkaXIiIiIKICAgICAgICBpbnN0ZGlyID0gc2VsZi5pbnN0YWxsX2RpcgogICAgICAgIGxvZy5pbmZvKCJDaGVja2luZyAucHRoIGZpbGUgc3VwcG9ydCBpbiAlcyIsIGluc3RkaXIpCiAgICAgICAgcHRoX2ZpbGUgPSBzZWxmLnBzZXVkb190ZW1wbmFtZSgpICsgIi5wdGgiCiAgICAgICAgb2tfZmlsZSA9IHB0aF9maWxlICsgJy5vaycKICAgICAgICBva19leGlzdHMgPSBvcy5wYXRoLmV4aXN0cyhva19maWxlKQogICAgICAgIHRtcGwgPSBfb25lX2xpbmVyKCIiIgogICAgICAgICAgICBpbXBvcnQgb3MKICAgICAgICAgICAgZiA9IG9wZW4oe29rX2ZpbGUhcn0sICd3JykKICAgICAgICAgICAgZi53cml0ZSgnT0snKQogICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgIiIiKSArICdcbicKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIG9rX2V4aXN0czoKICAgICAgICAgICAgICAgIG9zLnVubGluayhva19maWxlKQogICAgICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKG9rX2ZpbGUpCiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMucHkzMWNvbXBhdC5tYWtlZGlycyhkaXJuYW1lLCBleGlzdF9vaz1UcnVlKQogICAgICAgICAgICBmID0gb3BlbihwdGhfZmlsZSwgJ3cnKQogICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgIHNlbGYuY2FudF93cml0ZV90b190YXJnZXQoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGYud3JpdGUodG1wbC5mb3JtYXQoKipsb2NhbHMoKSkpCiAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgICAgIGYgPSBOb25lCiAgICAgICAgICAgICAgICBleGVjdXRhYmxlID0gc3lzLmV4ZWN1dGFibGUKICAgICAgICAgICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKICAgICAgICAgICAgICAgICAgICBkaXJuYW1lLCBiYXNlbmFtZSA9IG9zLnBhdGguc3BsaXQoZXhlY3V0YWJsZSkKICAgICAgICAgICAgICAgICAgICBhbHQgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgJ3B5dGhvbncuZXhlJykKICAgICAgICAgICAgICAgICAgICB1c2VfYWx0ID0gKAogICAgICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZS5sb3dlcigpID09ICdweXRob24uZXhlJyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5leGlzdHMoYWx0KQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBpZiB1c2VfYWx0OgogICAgICAgICAgICAgICAgICAgICAgICAjIHVzZSBweXRob253LmV4ZSB0byBhdm9pZCBvcGVuaW5nIGEgY29uc29sZSB3aW5kb3cKICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0YWJsZSA9IGFsdAoKICAgICAgICAgICAgICAgIGZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3bgoKICAgICAgICAgICAgICAgIHNwYXduKFtleGVjdXRhYmxlLCAnLUUnLCAnLWMnLCAncGFzcyddLCAwKQoKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9rX2ZpbGUpOgogICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAiVEVTVCBQQVNTRUQ6ICVzIGFwcGVhcnMgdG8gc3VwcG9ydCAucHRoIGZpbGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGRpcgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgaWYgZjoKICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9rX2ZpbGUpOgogICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhva19maWxlKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocHRoX2ZpbGUpOgogICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhwdGhfZmlsZSkKICAgICAgICBpZiBub3Qgc2VsZi5tdWx0aV92ZXJzaW9uOgogICAgICAgICAgICBsb2cud2FybigiVEVTVCBGQUlMRUQ6ICVzIGRvZXMgTk9UIHN1cHBvcnQgLnB0aCBmaWxlcyIsIGluc3RkaXIpCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIGluc3RhbGxfZWdnX3NjcmlwdHMoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiV3JpdGUgYWxsIHRoZSBzY3JpcHRzIGZvciBgZGlzdGAsIHVubGVzcyBzY3JpcHRzIGFyZSBleGNsdWRlZCIiIgogICAgICAgIGlmIG5vdCBzZWxmLmV4Y2x1ZGVfc2NyaXB0cyBhbmQgZGlzdC5tZXRhZGF0YV9pc2Rpcignc2NyaXB0cycpOgogICAgICAgICAgICBmb3Igc2NyaXB0X25hbWUgaW4gZGlzdC5tZXRhZGF0YV9saXN0ZGlyKCdzY3JpcHRzJyk6CiAgICAgICAgICAgICAgICBpZiBkaXN0Lm1ldGFkYXRhX2lzZGlyKCdzY3JpcHRzLycgKyBzY3JpcHRfbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgIyBUaGUgInNjcmlwdCIgaXMgYSBkaXJlY3RvcnksIGxpa2VseSBhIFB5dGhvbiAzCiAgICAgICAgICAgICAgICAgICAgIyBfX3B5Y2FjaGVfXyBkaXJlY3RvcnksIHNvIHNraXAgaXQuCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zY3JpcHQoCiAgICAgICAgICAgICAgICAgICAgZGlzdCwgc2NyaXB0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgZGlzdC5nZXRfbWV0YWRhdGEoJ3NjcmlwdHMvJyArIHNjcmlwdF9uYW1lKQogICAgICAgICAgICAgICAgKQogICAgICAgIHNlbGYuaW5zdGFsbF93cmFwcGVyX3NjcmlwdHMoZGlzdCkKCiAgICBkZWYgYWRkX291dHB1dChzZWxmLCBwYXRoKToKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgICAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoKToKICAgICAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlczoKICAgICAgICAgICAgICAgICAgICBzZWxmLm91dHB1dHMuYXBwZW5kKG9zLnBhdGguam9pbihiYXNlLCBmaWxlbmFtZSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5vdXRwdXRzLmFwcGVuZChwYXRoKQoKICAgIGRlZiBub3RfZWRpdGFibGUoc2VsZiwgc3BlYyk6CiAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCiAgICAgICAgICAgICAgICAiSW52YWxpZCBhcmd1bWVudCAlcjogeW91IGNhbid0IHVzZSBmaWxlbmFtZXMgb3IgVVJMcyAiCiAgICAgICAgICAgICAgICAid2l0aCAtLWVkaXRhYmxlIChleGNlcHQgdmlhIHRoZSAtLWZpbmQtbGlua3Mgb3B0aW9uKS4iCiAgICAgICAgICAgICAgICAlIChzcGVjLCkKICAgICAgICAgICAgKQoKICAgIGRlZiBjaGVja19lZGl0YWJsZShzZWxmLCBzcGVjKToKICAgICAgICBpZiBub3Qgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2RpcmVjdG9yeSwgc3BlYy5rZXkpKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCiAgICAgICAgICAgICAgICAiJXIgYWxyZWFkeSBleGlzdHMgaW4gJXM7IGNhbid0IGRvIGEgY2hlY2tvdXQgdGhlcmUiICUKICAgICAgICAgICAgICAgIChzcGVjLmtleSwgc2VsZi5idWlsZF9kaXJlY3RvcnkpCiAgICAgICAgICAgICkKCiAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogICAgZGVmIF90bXBkaXIoc2VsZik6CiAgICAgICAgdG1wZGlyID0gdGVtcGZpbGUubWtkdGVtcChwcmVmaXg9c2l4LnUoImVhc3lfaW5zdGFsbC0iKSkKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgY2FzdCB0byBzdHIgYXMgd29ya2Fyb3VuZCBmb3IgIzcwOSBhbmQgIzcxMCBhbmQgIzcxMgogICAgICAgICAgICB5aWVsZCBzdHIodG1wZGlyKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIG9zLnBhdGguZXhpc3RzKHRtcGRpcikgYW5kIHJtdHJlZShybXRyZWVfc2FmZSh0bXBkaXIpKQoKICAgIGRlZiBlYXN5X2luc3RhbGwoc2VsZiwgc3BlYywgZGVwcz1GYWxzZSk6CiAgICAgICAgaWYgbm90IHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zaXRlX3B5KCkKCiAgICAgICAgd2l0aCBzZWxmLl90bXBkaXIoKSBhcyB0bXBkaXI6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNwZWMsIFJlcXVpcmVtZW50KToKICAgICAgICAgICAgICAgIGlmIFVSTF9TQ0hFTUUoc3BlYyk6CiAgICAgICAgICAgICAgICAgICAgIyBJdCdzIGEgdXJsLCBkb3dubG9hZCBpdCB0byB0bXBkaXIgYW5kIHByb2Nlc3MKICAgICAgICAgICAgICAgICAgICBzZWxmLm5vdF9lZGl0YWJsZShzcGVjKQogICAgICAgICAgICAgICAgICAgIGRsID0gc2VsZi5wYWNrYWdlX2luZGV4LmRvd25sb2FkKHNwZWMsIHRtcGRpcikKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2l0ZW0oTm9uZSwgZGwsIHRtcGRpciwgZGVwcywgVHJ1ZSkKCiAgICAgICAgICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNwZWMpOgogICAgICAgICAgICAgICAgICAgICMgRXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnksIGp1c3QgcHJvY2VzcyBpdCBkaXJlY3RseQogICAgICAgICAgICAgICAgICAgIHNlbGYubm90X2VkaXRhYmxlKHNwZWMpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5zdGFsbF9pdGVtKE5vbmUsIHNwZWMsIHRtcGRpciwgZGVwcywgVHJ1ZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc3BlYyA9IHBhcnNlX3JlcXVpcmVtZW50X2FyZyhzcGVjKQoKICAgICAgICAgICAgc2VsZi5jaGVja19lZGl0YWJsZShzcGVjKQogICAgICAgICAgICBkaXN0ID0gc2VsZi5wYWNrYWdlX2luZGV4LmZldGNoX2Rpc3RyaWJ1dGlvbigKICAgICAgICAgICAgICAgIHNwZWMsIHRtcGRpciwgc2VsZi51cGdyYWRlLCBzZWxmLmVkaXRhYmxlLAogICAgICAgICAgICAgICAgbm90IHNlbGYuYWx3YXlzX2NvcHksIHNlbGYubG9jYWxfaW5kZXgKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBtc2cgPSAiQ291bGQgbm90IGZpbmQgc3VpdGFibGUgZGlzdHJpYnV0aW9uIGZvciAlciIgJSBzcGVjCiAgICAgICAgICAgICAgICBpZiBzZWxmLmFsd2F5c19jb3B5OgogICAgICAgICAgICAgICAgICAgIG1zZyArPSAiICgtLWFsd2F5cy1jb3B5IHNraXBzIHN5c3RlbSBhbmQgZGV2ZWxvcG1lbnQgZWdncykiCiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihtc2cpCiAgICAgICAgICAgIGVsaWYgZGlzdC5wcmVjZWRlbmNlID09IERFVkVMT1BfRElTVDoKICAgICAgICAgICAgICAgICMgLmVnZy1pbmZvIGRpc3RzIGRvbid0IG5lZWQgaW5zdGFsbGluZywganVzdCBwcm9jZXNzIGRlcHMKICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc19kaXN0cmlidXRpb24oc3BlYywgZGlzdCwgZGVwcywgIlVzaW5nIikKICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2l0ZW0oc3BlYywgZGlzdC5sb2NhdGlvbiwgdG1wZGlyLCBkZXBzKQoKICAgIGRlZiBpbnN0YWxsX2l0ZW0oc2VsZiwgc3BlYywgZG93bmxvYWQsIHRtcGRpciwgZGVwcywgaW5zdGFsbF9uZWVkZWQ9RmFsc2UpOgoKICAgICAgICAjIEluc3RhbGxhdGlvbiBpcyBhbHNvIG5lZWRlZCBpZiBmaWxlIGluIHRtcGRpciBvciBpcyBub3QgYW4gZWdnCiAgICAgICAgaW5zdGFsbF9uZWVkZWQgPSBpbnN0YWxsX25lZWRlZCBvciBzZWxmLmFsd2F5c19jb3B5CiAgICAgICAgaW5zdGFsbF9uZWVkZWQgPSBpbnN0YWxsX25lZWRlZCBvciBvcy5wYXRoLmRpcm5hbWUoZG93bmxvYWQpID09IHRtcGRpcgogICAgICAgIGluc3RhbGxfbmVlZGVkID0gaW5zdGFsbF9uZWVkZWQgb3Igbm90IGRvd25sb2FkLmVuZHN3aXRoKCcuZWdnJykKICAgICAgICBpbnN0YWxsX25lZWRlZCA9IGluc3RhbGxfbmVlZGVkIG9yICgKICAgICAgICAgICAgc2VsZi5hbHdheXNfY29weV9mcm9tIGlzIG5vdCBOb25lIGFuZAogICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUobm9ybWFsaXplX3BhdGgoZG93bmxvYWQpKSA9PQogICAgICAgICAgICBub3JtYWxpemVfcGF0aChzZWxmLmFsd2F5c19jb3B5X2Zyb20pCiAgICAgICAgKQoKICAgICAgICBpZiBzcGVjIGFuZCBub3QgaW5zdGFsbF9uZWVkZWQ6CiAgICAgICAgICAgICMgYXQgdGhpcyBwb2ludCwgd2Uga25vdyBpdCdzIGEgbG9jYWwgLmVnZywgd2UganVzdCBkb24ndCBrbm93IGlmCiAgICAgICAgICAgICMgaXQncyBhbHJlYWR5IGluc3RhbGxlZC4KICAgICAgICAgICAgZm9yIGRpc3QgaW4gc2VsZi5sb2NhbF9pbmRleFtzcGVjLnByb2plY3RfbmFtZV06CiAgICAgICAgICAgICAgICBpZiBkaXN0LmxvY2F0aW9uID09IGRvd25sb2FkOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpbnN0YWxsX25lZWRlZCA9IFRydWUgICMgaXQncyBub3QgaW4gdGhlIGxvY2FsIGluZGV4CgogICAgICAgIGxvZy5pbmZvKCJQcm9jZXNzaW5nICVzIiwgb3MucGF0aC5iYXNlbmFtZShkb3dubG9hZCkpCgogICAgICAgIGlmIGluc3RhbGxfbmVlZGVkOgogICAgICAgICAgICBkaXN0cyA9IHNlbGYuaW5zdGFsbF9lZ2dzKHNwZWMsIGRvd25sb2FkLCB0bXBkaXIpCiAgICAgICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2Rpc3RyaWJ1dGlvbihzcGVjLCBkaXN0LCBkZXBzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRpc3RzID0gW3NlbGYuZWdnX2Rpc3RyaWJ1dGlvbihkb3dubG9hZCldCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc19kaXN0cmlidXRpb24oc3BlYywgZGlzdHNbMF0sIGRlcHMsICJVc2luZyIpCgogICAgICAgIGlmIHNwZWMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgICAgICAgICAgaWYgZGlzdCBpbiBzcGVjOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CgogICAgZGVmIHNlbGVjdF9zY2hlbWUoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiU2V0cyB0aGUgaW5zdGFsbCBkaXJlY3RvcmllcyBieSBhcHBseWluZyB0aGUgaW5zdGFsbCBzY2hlbWVzLiIiIgogICAgICAgICMgaXQncyB0aGUgY2FsbGVyJ3MgcHJvYmxlbSBpZiB0aGV5IHN1cHBseSBhIGJhZCBuYW1lIQogICAgICAgIHNjaGVtZSA9IElOU1RBTExfU0NIRU1FU1tuYW1lXQogICAgICAgIGZvciBrZXkgaW4gU0NIRU1FX0tFWVM6CiAgICAgICAgICAgIGF0dHJuYW1lID0gJ2luc3RhbGxfJyArIGtleQogICAgICAgICAgICBpZiBnZXRhdHRyKHNlbGYsIGF0dHJuYW1lKSBpcyBOb25lOgogICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRybmFtZSwgc2NoZW1lW2tleV0pCgogICAgZGVmIHByb2Nlc3NfZGlzdHJpYnV0aW9uKHNlbGYsIHJlcXVpcmVtZW50LCBkaXN0LCBkZXBzPVRydWUsICppbmZvKToKICAgICAgICBzZWxmLnVwZGF0ZV9wdGgoZGlzdCkKICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXguYWRkKGRpc3QpCiAgICAgICAgaWYgZGlzdCBpbiBzZWxmLmxvY2FsX2luZGV4W2Rpc3Qua2V5XToKICAgICAgICAgICAgc2VsZi5sb2NhbF9pbmRleC5yZW1vdmUoZGlzdCkKICAgICAgICBzZWxmLmxvY2FsX2luZGV4LmFkZChkaXN0KQogICAgICAgIHNlbGYuaW5zdGFsbF9lZ2dfc2NyaXB0cyhkaXN0KQogICAgICAgIHNlbGYuaW5zdGFsbGVkX3Byb2plY3RzW2Rpc3Qua2V5XSA9IGRpc3QKICAgICAgICBsb2cuaW5mbyhzZWxmLmluc3RhbGxhdGlvbl9yZXBvcnQocmVxdWlyZW1lbnQsIGRpc3QsICppbmZvKSkKICAgICAgICBpZiAoZGlzdC5oYXNfbWV0YWRhdGEoJ2RlcGVuZGVuY3lfbGlua3MudHh0JykgYW5kCiAgICAgICAgICAgICAgICBub3Qgc2VsZi5ub19maW5kX2xpbmtzKToKICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4LmFkZF9maW5kX2xpbmtzKAogICAgICAgICAgICAgICAgZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ2RlcGVuZGVuY3lfbGlua3MudHh0JykKICAgICAgICAgICAgKQogICAgICAgIGlmIG5vdCBkZXBzIGFuZCBub3Qgc2VsZi5hbHdheXNfY29weToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZWxpZiByZXF1aXJlbWVudCBpcyBub3QgTm9uZSBhbmQgZGlzdC5rZXkgIT0gcmVxdWlyZW1lbnQua2V5OgogICAgICAgICAgICBsb2cud2FybigiU2tpcHBpbmcgZGVwZW5kZW5jaWVzIGZvciAlcyIsIGRpc3QpCiAgICAgICAgICAgIHJldHVybiAgIyBYWFggdGhpcyBpcyBub3QgdGhlIGRpc3RyaWJ1dGlvbiB3ZSB3ZXJlIGxvb2tpbmcgZm9yCiAgICAgICAgZWxpZiByZXF1aXJlbWVudCBpcyBOb25lIG9yIGRpc3Qgbm90IGluIHJlcXVpcmVtZW50OgogICAgICAgICAgICAjIGlmIHdlIHdvdW5kIHVwIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbiwgcmVzb2x2ZSB3aGF0IHdlJ3ZlIGdvdAogICAgICAgICAgICBkaXN0cmVxID0gZGlzdC5hc19yZXF1aXJlbWVudCgpCiAgICAgICAgICAgIHJlcXVpcmVtZW50ID0gUmVxdWlyZW1lbnQoc3RyKGRpc3RyZXEpKQogICAgICAgIGxvZy5pbmZvKCJQcm9jZXNzaW5nIGRlcGVuZGVuY2llcyBmb3IgJXMiLCByZXF1aXJlbWVudCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRpc3Ryb3MgPSBXb3JraW5nU2V0KFtdKS5yZXNvbHZlKAogICAgICAgICAgICAgICAgW3JlcXVpcmVtZW50XSwgc2VsZi5sb2NhbF9pbmRleCwgc2VsZi5lYXN5X2luc3RhbGwKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBEaXN0cmlidXRpb25Ob3RGb3VuZCBhcyBlOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihzdHIoZSkpCiAgICAgICAgZXhjZXB0IFZlcnNpb25Db25mbGljdCBhcyBlOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihlLnJlcG9ydCgpKQogICAgICAgIGlmIHNlbGYuYWx3YXlzX2NvcHkgb3Igc2VsZi5hbHdheXNfY29weV9mcm9tOgogICAgICAgICAgICAjIEZvcmNlIGFsbCB0aGUgcmVsZXZhbnQgZGlzdHJvcyB0byBiZSBjb3BpZWQgb3IgYWN0aXZhdGVkCiAgICAgICAgICAgIGZvciBkaXN0IGluIGRpc3Ryb3M6CiAgICAgICAgICAgICAgICBpZiBkaXN0LmtleSBub3QgaW4gc2VsZi5pbnN0YWxsZWRfcHJvamVjdHM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5lYXN5X2luc3RhbGwoZGlzdC5hc19yZXF1aXJlbWVudCgpKQogICAgICAgIGxvZy5pbmZvKCJGaW5pc2hlZCBwcm9jZXNzaW5nIGRlcGVuZGVuY2llcyBmb3IgJXMiLCByZXF1aXJlbWVudCkKCiAgICBkZWYgc2hvdWxkX3VuemlwKHNlbGYsIGRpc3QpOgogICAgICAgIGlmIHNlbGYuemlwX29rIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gbm90IHNlbGYuemlwX29rCiAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ25vdC16aXAtc2FmZScpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGlmIG5vdCBkaXN0Lmhhc19tZXRhZGF0YSgnemlwLXNhZmUnKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgbWF5YmVfbW92ZShzZWxmLCBzcGVjLCBkaXN0X2ZpbGVuYW1lLCBzZXR1cF9iYXNlKToKICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9kaXJlY3RvcnksIHNwZWMua2V5KQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRzdCk6CiAgICAgICAgICAgIG1zZyA9ICgKICAgICAgICAgICAgICAgICIlciBhbHJlYWR5IGV4aXN0cyBpbiAlczsgYnVpbGQgZGlyZWN0b3J5ICVzIHdpbGwgbm90IGJlIGtlcHQiCiAgICAgICAgICAgICkKICAgICAgICAgICAgbG9nLndhcm4obXNnLCBzcGVjLmtleSwgc2VsZi5idWlsZF9kaXJlY3RvcnksIHNldHVwX2Jhc2UpCiAgICAgICAgICAgIHJldHVybiBzZXR1cF9iYXNlCiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkaXN0X2ZpbGVuYW1lKToKICAgICAgICAgICAgc2V0dXBfYmFzZSA9IGRpc3RfZmlsZW5hbWUKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBvcy5wYXRoLmRpcm5hbWUoZGlzdF9maWxlbmFtZSkgPT0gc2V0dXBfYmFzZToKICAgICAgICAgICAgICAgIG9zLnVubGluayhkaXN0X2ZpbGVuYW1lKSAgIyBnZXQgaXQgb3V0IG9mIHRoZSB0bXAgZGlyCiAgICAgICAgICAgIGNvbnRlbnRzID0gb3MubGlzdGRpcihzZXR1cF9iYXNlKQogICAgICAgICAgICBpZiBsZW4oY29udGVudHMpID09IDE6CiAgICAgICAgICAgICAgICBkaXN0X2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNldHVwX2Jhc2UsIGNvbnRlbnRzWzBdKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkaXN0X2ZpbGVuYW1lKToKICAgICAgICAgICAgICAgICAgICAjIGlmIHRoZSBvbmx5IHRoaW5nIHRoZXJlIGlzIGEgZGlyZWN0b3J5LCBtb3ZlIGl0IGluc3RlYWQKICAgICAgICAgICAgICAgICAgICBzZXR1cF9iYXNlID0gZGlzdF9maWxlbmFtZQogICAgICAgIGVuc3VyZV9kaXJlY3RvcnkoZHN0KQogICAgICAgIHNodXRpbC5tb3ZlKHNldHVwX2Jhc2UsIGRzdCkKICAgICAgICByZXR1cm4gZHN0CgogICAgZGVmIGluc3RhbGxfd3JhcHBlcl9zY3JpcHRzKHNlbGYsIGRpc3QpOgogICAgICAgIGlmIHNlbGYuZXhjbHVkZV9zY3JpcHRzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBmb3IgYXJncyBpbiBTY3JpcHRXcml0ZXIuYmVzdCgpLmdldF9hcmdzKGRpc3QpOgogICAgICAgICAgICBzZWxmLndyaXRlX3NjcmlwdCgqYXJncykKCiAgICBkZWYgaW5zdGFsbF9zY3JpcHQoc2VsZiwgZGlzdCwgc2NyaXB0X25hbWUsIHNjcmlwdF90ZXh0LCBkZXZfcGF0aD1Ob25lKToKICAgICAgICAiIiJHZW5lcmF0ZSBhIGxlZ2FjeSBzY3JpcHQgd3JhcHBlciBhbmQgaW5zdGFsbCBpdCIiIgogICAgICAgIHNwZWMgPSBzdHIoZGlzdC5hc19yZXF1aXJlbWVudCgpKQogICAgICAgIGlzX3NjcmlwdCA9IGlzX3B5dGhvbl9zY3JpcHQoc2NyaXB0X3RleHQsIHNjcmlwdF9uYW1lKQoKICAgICAgICBpZiBpc19zY3JpcHQ6CiAgICAgICAgICAgIGJvZHkgPSBzZWxmLl9sb2FkX3RlbXBsYXRlKGRldl9wYXRoKSAlIGxvY2FscygpCiAgICAgICAgICAgIHNjcmlwdF90ZXh0ID0gU2NyaXB0V3JpdGVyLmdldF9oZWFkZXIoc2NyaXB0X3RleHQpICsgYm9keQogICAgICAgIHNlbGYud3JpdGVfc2NyaXB0KHNjcmlwdF9uYW1lLCBfdG9fYXNjaWkoc2NyaXB0X3RleHQpLCAnYicpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9sb2FkX3RlbXBsYXRlKGRldl9wYXRoKToKICAgICAgICAiIiIKICAgICAgICBUaGVyZSBhcmUgYSBjb3VwbGUgb2YgdGVtcGxhdGUgc2NyaXB0cyBpbiB0aGUgcGFja2FnZS4gVGhpcwogICAgICAgIGZ1bmN0aW9uIGxvYWRzIG9uZSBvZiB0aGVtIGFuZCBwcmVwYXJlcyBpdCBmb3IgdXNlLgogICAgICAgICIiIgogICAgICAgICMgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzLzEzNCBmb3IgaW5mbwogICAgICAgICMgb24gc2NyaXB0IGZpbGUgbmFtaW5nIGFuZCBkb3duc3RyZWFtIGlzc3VlcyB3aXRoIFNWUjQKICAgICAgICBuYW1lID0gJ3NjcmlwdC50bXBsJwogICAgICAgIGlmIGRldl9wYXRoOgogICAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCcudG1wbCcsICcgKGRldikudG1wbCcpCgogICAgICAgIHJhd19ieXRlcyA9IHJlc291cmNlX3N0cmluZygnc2V0dXB0b29scycsIG5hbWUpCiAgICAgICAgcmV0dXJuIHJhd19ieXRlcy5kZWNvZGUoJ3V0Zi04JykKCiAgICBkZWYgd3JpdGVfc2NyaXB0KHNlbGYsIHNjcmlwdF9uYW1lLCBjb250ZW50cywgbW9kZT0idCIsIGJsb2NrZXJzPSgpKToKICAgICAgICAiIiJXcml0ZSBhbiBleGVjdXRhYmxlIGZpbGUgdG8gdGhlIHNjcmlwdHMgZGlyZWN0b3J5IiIiCiAgICAgICAgc2VsZi5kZWxldGVfYmxvY2tlcnMoICAjIGNsZWFuIHVwIG9sZCAucHkvLnB5dyB3L28gYSBzY3JpcHQKICAgICAgICAgICAgW29zLnBhdGguam9pbihzZWxmLnNjcmlwdF9kaXIsIHgpIGZvciB4IGluIGJsb2NrZXJzXQogICAgICAgICkKICAgICAgICBsb2cuaW5mbygiSW5zdGFsbGluZyAlcyBzY3JpcHQgdG8gJXMiLCBzY3JpcHRfbmFtZSwgc2VsZi5zY3JpcHRfZGlyKQogICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihzZWxmLnNjcmlwdF9kaXIsIHNjcmlwdF9uYW1lKQogICAgICAgIHNlbGYuYWRkX291dHB1dCh0YXJnZXQpCgogICAgICAgIG1hc2sgPSBjdXJyZW50X3VtYXNrKCkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHModGFyZ2V0KToKICAgICAgICAgICAgICAgIG9zLnVubGluayh0YXJnZXQpCiAgICAgICAgICAgIHdpdGggb3Blbih0YXJnZXQsICJ3IiArIG1vZGUpIGFzIGY6CiAgICAgICAgICAgICAgICBmLndyaXRlKGNvbnRlbnRzKQogICAgICAgICAgICBjaG1vZCh0YXJnZXQsIDBvNzc3IC0gbWFzaykKCiAgICBkZWYgaW5zdGFsbF9lZ2dzKHNlbGYsIHNwZWMsIGRpc3RfZmlsZW5hbWUsIHRtcGRpcik6CiAgICAgICAgIyAuZWdnIGRpcnMgb3IgZmlsZXMgYXJlIGFscmVhZHkgYnVpbHQsIHNvIGp1c3QgcmV0dXJuIHRoZW0KICAgICAgICBpZiBkaXN0X2ZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoJy5lZ2cnKToKICAgICAgICAgICAgcmV0dXJuIFtzZWxmLmluc3RhbGxfZWdnKGRpc3RfZmlsZW5hbWUsIHRtcGRpcildCiAgICAgICAgZWxpZiBkaXN0X2ZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoJy5leGUnKToKICAgICAgICAgICAgcmV0dXJuIFtzZWxmLmluc3RhbGxfZXhlKGRpc3RfZmlsZW5hbWUsIHRtcGRpcildCiAgICAgICAgZWxpZiBkaXN0X2ZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoJy53aGwnKToKICAgICAgICAgICAgcmV0dXJuIFtzZWxmLmluc3RhbGxfd2hlZWwoZGlzdF9maWxlbmFtZSwgdG1wZGlyKV0KCiAgICAgICAgIyBBbnl0aGluZyBlbHNlLCB0cnkgdG8gZXh0cmFjdCBhbmQgYnVpbGQKICAgICAgICBzZXR1cF9iYXNlID0gdG1wZGlyCiAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZGlzdF9maWxlbmFtZSkgYW5kIG5vdCBkaXN0X2ZpbGVuYW1lLmVuZHN3aXRoKCcucHknKToKICAgICAgICAgICAgdW5wYWNrX2FyY2hpdmUoZGlzdF9maWxlbmFtZSwgdG1wZGlyLCBzZWxmLnVucGFja19wcm9ncmVzcykKICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoZGlzdF9maWxlbmFtZSk6CiAgICAgICAgICAgIHNldHVwX2Jhc2UgPSBvcy5wYXRoLmFic3BhdGgoZGlzdF9maWxlbmFtZSkKCiAgICAgICAgaWYgKHNldHVwX2Jhc2Uuc3RhcnRzd2l0aCh0bXBkaXIpICAjIHNvbWV0aGluZyB3ZSBkb3dubG9hZGVkCiAgICAgICAgICAgICAgICBhbmQgc2VsZi5idWlsZF9kaXJlY3RvcnkgYW5kIHNwZWMgaXMgbm90IE5vbmUpOgogICAgICAgICAgICBzZXR1cF9iYXNlID0gc2VsZi5tYXliZV9tb3ZlKHNwZWMsIGRpc3RfZmlsZW5hbWUsIHNldHVwX2Jhc2UpCgogICAgICAgICMgRmluZCB0aGUgc2V0dXAucHkgZmlsZQogICAgICAgIHNldHVwX3NjcmlwdCA9IG9zLnBhdGguam9pbihzZXR1cF9iYXNlLCAnc2V0dXAucHknKQoKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2V0dXBfc2NyaXB0KToKICAgICAgICAgICAgc2V0dXBzID0gZ2xvYihvcy5wYXRoLmpvaW4oc2V0dXBfYmFzZSwgJyonLCAnc2V0dXAucHknKSkKICAgICAgICAgICAgaWYgbm90IHNldHVwczoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIGEgc2V0dXAgc2NyaXB0IGluICVzIiAlCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5hYnNwYXRoKGRpc3RfZmlsZW5hbWUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGlmIGxlbihzZXR1cHMpID4gMToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgICAgICJNdWx0aXBsZSBzZXR1cCBzY3JpcHRzIGluICVzIiAlCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5hYnNwYXRoKGRpc3RfZmlsZW5hbWUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHNldHVwX3NjcmlwdCA9IHNldHVwc1swXQoKICAgICAgICAjIE5vdyBydW4gaXQsIGFuZCByZXR1cm4gdGhlIHJlc3VsdAogICAgICAgIGlmIHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgIGxvZy5pbmZvKHNlbGYucmVwb3J0X2VkaXRhYmxlKHNwZWMsIHNldHVwX3NjcmlwdCkpCiAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmJ1aWxkX2FuZF9pbnN0YWxsKHNldHVwX3NjcmlwdCwgc2V0dXBfYmFzZSkKCiAgICBkZWYgZWdnX2Rpc3RyaWJ1dGlvbihzZWxmLCBlZ2dfcGF0aCk6CiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihlZ2dfcGF0aCk6CiAgICAgICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKGVnZ19wYXRoLCBvcy5wYXRoLmpvaW4oZWdnX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0VHRy1JTkZPJykpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWV0YWRhdGEgPSBFZ2dNZXRhZGF0YSh6aXBpbXBvcnQuemlwaW1wb3J0ZXIoZWdnX3BhdGgpKQogICAgICAgIHJldHVybiBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShlZ2dfcGF0aCwgbWV0YWRhdGE9bWV0YWRhdGEpCgogICAgZGVmIGluc3RhbGxfZWdnKHNlbGYsIGVnZ19wYXRoLCB0bXBkaXIpOgogICAgICAgIGRlc3RpbmF0aW9uID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICBzZWxmLmluc3RhbGxfZGlyLAogICAgICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKGVnZ19wYXRoKSwKICAgICAgICApCiAgICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmFic3BhdGgoZGVzdGluYXRpb24pCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShkZXN0aW5hdGlvbikKCiAgICAgICAgZGlzdCA9IHNlbGYuZWdnX2Rpc3RyaWJ1dGlvbihlZ2dfcGF0aCkKICAgICAgICBpZiBub3Qgc2FtZWZpbGUoZWdnX3BhdGgsIGRlc3RpbmF0aW9uKToKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkZXN0aW5hdGlvbikgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhkZXN0aW5hdGlvbik6CiAgICAgICAgICAgICAgICBkaXJfdXRpbC5yZW1vdmVfdHJlZShkZXN0aW5hdGlvbiwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoZGVzdGluYXRpb24pOgogICAgICAgICAgICAgICAgc2VsZi5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgIG9zLnVubGluaywKICAgICAgICAgICAgICAgICAgICAoZGVzdGluYXRpb24sKSwKICAgICAgICAgICAgICAgICAgICAiUmVtb3ZpbmcgIiArIGRlc3RpbmF0aW9uLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBuZXdfZGlzdF9pc196aXBwZWQgPSBGYWxzZQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihlZ2dfcGF0aCk6CiAgICAgICAgICAgICAgICAgICAgaWYgZWdnX3BhdGguc3RhcnRzd2l0aCh0bXBkaXIpOgogICAgICAgICAgICAgICAgICAgICAgICBmLCBtID0gc2h1dGlsLm1vdmUsICJNb3ZpbmciCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgZiwgbSA9IHNodXRpbC5jb3B5dHJlZSwgIkNvcHlpbmciCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYuc2hvdWxkX3VuemlwKGRpc3QpOgogICAgICAgICAgICAgICAgICAgIHNlbGYubWtwYXRoKGRlc3RpbmF0aW9uKQogICAgICAgICAgICAgICAgICAgIGYsIG0gPSBzZWxmLnVucGFja19hbmRfY29tcGlsZSwgIkV4dHJhY3RpbmciCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5ld19kaXN0X2lzX3ppcHBlZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICBpZiBlZ2dfcGF0aC5zdGFydHN3aXRoKHRtcGRpcik6CiAgICAgICAgICAgICAgICAgICAgICAgIGYsIG0gPSBzaHV0aWwubW92ZSwgIk1vdmluZyIKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBmLCBtID0gc2h1dGlsLmNvcHkyLCAiQ29weWluZyIKICAgICAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSgKICAgICAgICAgICAgICAgICAgICBmLAogICAgICAgICAgICAgICAgICAgIChlZ2dfcGF0aCwgZGVzdGluYXRpb24pLAogICAgICAgICAgICAgICAgICAgIChtICsgIiAlcyB0byAlcyIpICUgKAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKGVnZ19wYXRoKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKGRlc3RpbmF0aW9uKQogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB1cGRhdGVfZGlzdF9jYWNoZXMoCiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24sCiAgICAgICAgICAgICAgICAgICAgZml4X3ppcGltcG9ydGVyX2NhY2hlcz1uZXdfZGlzdF9pc196aXBwZWQsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICB1cGRhdGVfZGlzdF9jYWNoZXMoZGVzdGluYXRpb24sIGZpeF96aXBpbXBvcnRlcl9jYWNoZXM9RmFsc2UpCiAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICBzZWxmLmFkZF9vdXRwdXQoZGVzdGluYXRpb24pCiAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2Rpc3RyaWJ1dGlvbihkZXN0aW5hdGlvbikKCiAgICBkZWYgaW5zdGFsbF9leGUoc2VsZiwgZGlzdF9maWxlbmFtZSwgdG1wZGlyKToKICAgICAgICAjIFNlZSBpZiBpdCdzIHZhbGlkLCBnZXQgZGF0YQogICAgICAgIGNmZyA9IGV4dHJhY3Rfd2luaW5zdF9jZmcoZGlzdF9maWxlbmFtZSkKICAgICAgICBpZiBjZmcgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGEgdmFsaWQgZGlzdHV0aWxzIFdpbmRvd3MgLmV4ZSIgJSBkaXN0X2ZpbGVuYW1lCiAgICAgICAgICAgICkKICAgICAgICAjIENyZWF0ZSBhIGR1bW15IGRpc3RyaWJ1dGlvbiBvYmplY3QgdW50aWwgd2UgYnVpbGQgdGhlIHJlYWwgZGlzdHJvCiAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigKICAgICAgICAgICAgTm9uZSwKICAgICAgICAgICAgcHJvamVjdF9uYW1lPWNmZy5nZXQoJ21ldGFkYXRhJywgJ25hbWUnKSwKICAgICAgICAgICAgdmVyc2lvbj1jZmcuZ2V0KCdtZXRhZGF0YScsICd2ZXJzaW9uJyksIHBsYXRmb3JtPWdldF9wbGF0Zm9ybSgpLAogICAgICAgICkKCiAgICAgICAgIyBDb252ZXJ0IHRoZSAuZXhlIHRvIGFuIHVucGFja2VkIGVnZwogICAgICAgIGVnZ19wYXRoID0gb3MucGF0aC5qb2luKHRtcGRpciwgZGlzdC5lZ2dfbmFtZSgpICsgJy5lZ2cnKQogICAgICAgIGRpc3QubG9jYXRpb24gPSBlZ2dfcGF0aAogICAgICAgIGVnZ190bXAgPSBlZ2dfcGF0aCArICcudG1wJwogICAgICAgIF9lZ2dfaW5mbyA9IG9zLnBhdGguam9pbihlZ2dfdG1wLCAnRUdHLUlORk8nKQogICAgICAgIHBrZ19pbmYgPSBvcy5wYXRoLmpvaW4oX2VnZ19pbmZvLCAnUEtHLUlORk8nKQogICAgICAgIGVuc3VyZV9kaXJlY3RvcnkocGtnX2luZikgICMgbWFrZSBzdXJlIEVHRy1JTkZPIGRpciBleGlzdHMKICAgICAgICBkaXN0Ll9wcm92aWRlciA9IFBhdGhNZXRhZGF0YShlZ2dfdG1wLCBfZWdnX2luZm8pICAjIFhYWAogICAgICAgIHNlbGYuZXhlX3RvX2VnZyhkaXN0X2ZpbGVuYW1lLCBlZ2dfdG1wKQoKICAgICAgICAjIFdyaXRlIEVHRy1JTkZPL1BLRy1JTkZPCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBrZ19pbmYpOgogICAgICAgICAgICBmID0gb3Blbihwa2dfaW5mLCAndycpCiAgICAgICAgICAgIGYud3JpdGUoJ01ldGFkYXRhLVZlcnNpb246IDEuMFxuJykKICAgICAgICAgICAgZm9yIGssIHYgaW4gY2ZnLml0ZW1zKCdtZXRhZGF0YScpOgogICAgICAgICAgICAgICAgaWYgayAhPSAndGFyZ2V0X3ZlcnNpb24nOgogICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJyVzOiAlc1xuJyAlIChrLnJlcGxhY2UoJ18nLCAnLScpLnRpdGxlKCksIHYpKQogICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICBzY3JpcHRfZGlyID0gb3MucGF0aC5qb2luKF9lZ2dfaW5mbywgJ3NjcmlwdHMnKQogICAgICAgICMgZGVsZXRlIGVudHJ5LXBvaW50IHNjcmlwdHMgdG8gYXZvaWQgZHVwaW5nCiAgICAgICAgc2VsZi5kZWxldGVfYmxvY2tlcnMoWwogICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2NyaXB0X2RpciwgYXJnc1swXSkKICAgICAgICAgICAgZm9yIGFyZ3MgaW4gU2NyaXB0V3JpdGVyLmdldF9hcmdzKGRpc3QpCiAgICAgICAgXSkKICAgICAgICAjIEJ1aWxkIC5lZ2cgZmlsZSBmcm9tIHRtcGRpcgogICAgICAgIGJkaXN0X2VnZy5tYWtlX3ppcGZpbGUoCiAgICAgICAgICAgIGVnZ19wYXRoLCBlZ2dfdG1wLCB2ZXJib3NlPXNlbGYudmVyYm9zZSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4sCiAgICAgICAgKQogICAgICAgICMgaW5zdGFsbCB0aGUgLmVnZwogICAgICAgIHJldHVybiBzZWxmLmluc3RhbGxfZWdnKGVnZ19wYXRoLCB0bXBkaXIpCgogICAgZGVmIGV4ZV90b19lZ2coc2VsZiwgZGlzdF9maWxlbmFtZSwgZWdnX3RtcCk6CiAgICAgICAgIiIiRXh0cmFjdCBhIGJkaXN0X3dpbmluc3QgdG8gdGhlIGRpcmVjdG9yaWVzIGFuIGVnZyB3b3VsZCB1c2UiIiIKICAgICAgICAjIENoZWNrIGZvciAucHRoIGZpbGUgYW5kIHNldCB1cCBwcmVmaXggdHJhbnNsYXRpb25zCiAgICAgICAgcHJlZml4ZXMgPSBnZXRfZXhlX3ByZWZpeGVzKGRpc3RfZmlsZW5hbWUpCiAgICAgICAgdG9fY29tcGlsZSA9IFtdCiAgICAgICAgbmF0aXZlX2xpYnMgPSBbXQogICAgICAgIHRvcF9sZXZlbCA9IHt9CgogICAgICAgIGRlZiBwcm9jZXNzKHNyYywgZHN0KToKICAgICAgICAgICAgcyA9IHNyYy5sb3dlcigpCiAgICAgICAgICAgIGZvciBvbGQsIG5ldyBpbiBwcmVmaXhlczoKICAgICAgICAgICAgICAgIGlmIHMuc3RhcnRzd2l0aChvbGQpOgogICAgICAgICAgICAgICAgICAgIHNyYyA9IG5ldyArIHNyY1tsZW4ob2xkKTpdCiAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBzcmMuc3BsaXQoJy8nKQogICAgICAgICAgICAgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihlZ2dfdG1wLCAqcGFydHMpCiAgICAgICAgICAgICAgICAgICAgZGwgPSBkc3QubG93ZXIoKQogICAgICAgICAgICAgICAgICAgIGlmIGRsLmVuZHN3aXRoKCcucHlkJykgb3IgZGwuZW5kc3dpdGgoJy5kbGwnKToKICAgICAgICAgICAgICAgICAgICAgICAgcGFydHNbLTFdID0gYmRpc3RfZWdnLnN0cmlwX21vZHVsZShwYXJ0c1stMV0pCiAgICAgICAgICAgICAgICAgICAgICAgIHRvcF9sZXZlbFtvcy5wYXRoLnNwbGl0ZXh0KHBhcnRzWzBdKVswXV0gPSAxCiAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9saWJzLmFwcGVuZChzcmMpCiAgICAgICAgICAgICAgICAgICAgZWxpZiBkbC5lbmRzd2l0aCgnLnB5JykgYW5kIG9sZCAhPSAnU0NSSVBUUy8nOgogICAgICAgICAgICAgICAgICAgICAgICB0b3BfbGV2ZWxbb3MucGF0aC5zcGxpdGV4dChwYXJ0c1swXSlbMF1dID0gMQogICAgICAgICAgICAgICAgICAgICAgICB0b19jb21waWxlLmFwcGVuZChkc3QpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRzdAogICAgICAgICAgICBpZiBub3Qgc3JjLmVuZHN3aXRoKCcucHRoJyk6CiAgICAgICAgICAgICAgICBsb2cud2FybigiV0FSTklORzogY2FuJ3QgcHJvY2VzcyAlcyIsIHNyYykKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgIyBleHRyYWN0LCB0cmFja2luZyAucHlkLy5kbGwtPm5hdGl2ZV9saWJzIGFuZCAucHkgLT4gdG9fY29tcGlsZQogICAgICAgIHVucGFja19hcmNoaXZlKGRpc3RfZmlsZW5hbWUsIGVnZ190bXAsIHByb2Nlc3MpCiAgICAgICAgc3R1YnMgPSBbXQogICAgICAgIGZvciByZXMgaW4gbmF0aXZlX2xpYnM6CiAgICAgICAgICAgIGlmIHJlcy5sb3dlcigpLmVuZHN3aXRoKCcucHlkJyk6ICAjIGNyZWF0ZSBzdHVicyBmb3IgLnB5ZCdzCiAgICAgICAgICAgICAgICBwYXJ0cyA9IHJlcy5zcGxpdCgnLycpCiAgICAgICAgICAgICAgICByZXNvdXJjZSA9IHBhcnRzWy0xXQogICAgICAgICAgICAgICAgcGFydHNbLTFdID0gYmRpc3RfZWdnLnN0cmlwX21vZHVsZShwYXJ0c1stMV0pICsgJy5weScKICAgICAgICAgICAgICAgIHB5ZmlsZSA9IG9zLnBhdGguam9pbihlZ2dfdG1wLCAqcGFydHMpCiAgICAgICAgICAgICAgICB0b19jb21waWxlLmFwcGVuZChweWZpbGUpCiAgICAgICAgICAgICAgICBzdHVicy5hcHBlbmQocHlmaWxlKQogICAgICAgICAgICAgICAgYmRpc3RfZWdnLndyaXRlX3N0dWIocmVzb3VyY2UsIHB5ZmlsZSkKICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZSh0b19jb21waWxlKSAgIyBjb21waWxlIC5weSdzCiAgICAgICAgYmRpc3RfZWdnLndyaXRlX3NhZmV0eV9mbGFnKAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgJ0VHRy1JTkZPJyksCiAgICAgICAgICAgIGJkaXN0X2VnZy5hbmFseXplX2VnZyhlZ2dfdG1wLCBzdHVicykpICAjIHdyaXRlIHppcC1zYWZldHkgZmxhZwoKICAgICAgICBmb3IgbmFtZSBpbiAndG9wX2xldmVsJywgJ25hdGl2ZV9saWJzJzoKICAgICAgICAgICAgaWYgbG9jYWxzKClbbmFtZV06CiAgICAgICAgICAgICAgICB0eHQgPSBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgJ0VHRy1JTkZPJywgbmFtZSArICcudHh0JykKICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh0eHQpOgogICAgICAgICAgICAgICAgICAgIGYgPSBvcGVuKHR4dCwgJ3cnKQogICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJ1xuJy5qb2luKGxvY2FscygpW25hbWVdKSArICdcbicpCiAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCgogICAgZGVmIGluc3RhbGxfd2hlZWwoc2VsZiwgd2hlZWxfcGF0aCwgdG1wZGlyKToKICAgICAgICB3aGVlbCA9IFdoZWVsKHdoZWVsX3BhdGgpCiAgICAgICAgYXNzZXJ0IHdoZWVsLmlzX2NvbXBhdGlibGUoKQogICAgICAgIGRlc3RpbmF0aW9uID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIHdoZWVsLmVnZ19uYW1lKCkpCiAgICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmFic3BhdGgoZGVzdGluYXRpb24pCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShkZXN0aW5hdGlvbikKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRlc3RpbmF0aW9uKSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKGRlc3RpbmF0aW9uKToKICAgICAgICAgICAgZGlyX3V0aWwucmVtb3ZlX3RyZWUoZGVzdGluYXRpb24sIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoZGVzdGluYXRpb24pOgogICAgICAgICAgICBzZWxmLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICBvcy51bmxpbmssCiAgICAgICAgICAgICAgICAoZGVzdGluYXRpb24sKSwKICAgICAgICAgICAgICAgICJSZW1vdmluZyAiICsgZGVzdGluYXRpb24sCiAgICAgICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSgKICAgICAgICAgICAgICAgIHdoZWVsLmluc3RhbGxfYXNfZWdnLAogICAgICAgICAgICAgICAgKGRlc3RpbmF0aW9uLCksCiAgICAgICAgICAgICAgICAoIkluc3RhbGxpbmcgJXMgdG8gJXMiKSAlICgKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKHdoZWVsX3BhdGgpLAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShkZXN0aW5hdGlvbikKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICB1cGRhdGVfZGlzdF9jYWNoZXMoZGVzdGluYXRpb24sIGZpeF96aXBpbXBvcnRlcl9jYWNoZXM9RmFsc2UpCiAgICAgICAgc2VsZi5hZGRfb3V0cHV0KGRlc3RpbmF0aW9uKQogICAgICAgIHJldHVybiBzZWxmLmVnZ19kaXN0cmlidXRpb24oZGVzdGluYXRpb24pCgogICAgX19tdl93YXJuaW5nID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIEJlY2F1c2UgdGhpcyBkaXN0cmlidXRpb24gd2FzIGluc3RhbGxlZCAtLW11bHRpLXZlcnNpb24sIGJlZm9yZSB5b3UgY2FuCiAgICAgICAgaW1wb3J0IG1vZHVsZXMgZnJvbSB0aGlzIHBhY2thZ2UgaW4gYW4gYXBwbGljYXRpb24sIHlvdSB3aWxsIG5lZWQgdG8KICAgICAgICAnaW1wb3J0IHBrZ19yZXNvdXJjZXMnIGFuZCB0aGVuIHVzZSBhICdyZXF1aXJlKCknIGNhbGwgc2ltaWxhciB0byBvbmUgb2YKICAgICAgICB0aGVzZSBleGFtcGxlcywgaW4gb3JkZXIgdG8gc2VsZWN0IHRoZSBkZXNpcmVkIHZlcnNpb246CgogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLnJlcXVpcmUoIiUobmFtZSlzIikgICMgbGF0ZXN0IGluc3RhbGxlZCB2ZXJzaW9uCiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMucmVxdWlyZSgiJShuYW1lKXM9PSUodmVyc2lvbilzIikgICMgdGhpcyBleGFjdCB2ZXJzaW9uCiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMucmVxdWlyZSgiJShuYW1lKXM+PSUodmVyc2lvbilzIikgICMgdGhpcyB2ZXJzaW9uIG9yIGhpZ2hlcgogICAgICAgICIiIikubHN0cmlwKCkKCiAgICBfX2lkX3dhcm5pbmcgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgTm90ZSBhbHNvIHRoYXQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgbXVzdCBiZSBvbiBzeXMucGF0aCBhdCBydW50aW1lIGZvcgogICAgICAgIHRoaXMgdG8gd29yay4gIChlLmcuIGJ5IGJlaW5nIHRoZSBhcHBsaWNhdGlvbidzIHNjcmlwdCBkaXJlY3RvcnksIGJ5IGJlaW5nIG9uCiAgICAgICAgUFlUSE9OUEFUSCwgb3IgYnkgYmVpbmcgYWRkZWQgdG8gc3lzLnBhdGggYnkgeW91ciBjb2RlLikKICAgICAgICAiIiIpCgogICAgZGVmIGluc3RhbGxhdGlvbl9yZXBvcnQoc2VsZiwgcmVxLCBkaXN0LCB3aGF0PSJJbnN0YWxsZWQiKToKICAgICAgICAiIiJIZWxwZnVsIGluc3RhbGxhdGlvbiBtZXNzYWdlIGZvciBkaXNwbGF5IHRvIHBhY2thZ2UgdXNlcnMiIiIKICAgICAgICBtc2cgPSAiXG4lKHdoYXQpcyAlKGVnZ2xvYylzJShleHRyYXMpcyIKICAgICAgICBpZiBzZWxmLm11bHRpX3ZlcnNpb24gYW5kIG5vdCBzZWxmLm5vX3JlcG9ydDoKICAgICAgICAgICAgbXNnICs9ICdcbicgKyBzZWxmLl9fbXZfd2FybmluZwogICAgICAgICAgICBpZiBzZWxmLmluc3RhbGxfZGlyIG5vdCBpbiBtYXAobm9ybWFsaXplX3BhdGgsIHN5cy5wYXRoKToKICAgICAgICAgICAgICAgIG1zZyArPSAnXG4nICsgc2VsZi5fX2lkX3dhcm5pbmcKCiAgICAgICAgZWdnbG9jID0gZGlzdC5sb2NhdGlvbgogICAgICAgIG5hbWUgPSBkaXN0LnByb2plY3RfbmFtZQogICAgICAgIHZlcnNpb24gPSBkaXN0LnZlcnNpb24KICAgICAgICBleHRyYXMgPSAnJyAgIyBUT0RPOiBzZWxmLnJlcG9ydF9leHRyYXMocmVxLCBkaXN0KQogICAgICAgIHJldHVybiBtc2cgJSBsb2NhbHMoKQoKICAgIF9fZWRpdGFibGVfbXNnID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIEV4dHJhY3RlZCBlZGl0YWJsZSB2ZXJzaW9uIG9mICUoc3BlYylzIHRvICUoZGlybmFtZSlzCgogICAgICAgIElmIGl0IHVzZXMgc2V0dXB0b29scyBpbiBpdHMgc2V0dXAgc2NyaXB0LCB5b3UgY2FuIGFjdGl2YXRlIGl0IGluCiAgICAgICAgImRldmVsb3BtZW50IiBtb2RlIGJ5IGdvaW5nIHRvIHRoYXQgZGlyZWN0b3J5IGFuZCBydW5uaW5nOjoKCiAgICAgICAgICAgICUocHl0aG9uKXMgc2V0dXAucHkgZGV2ZWxvcAoKICAgICAgICBTZWUgdGhlIHNldHVwdG9vbHMgZG9jdW1lbnRhdGlvbiBmb3IgdGhlICJkZXZlbG9wIiBjb21tYW5kIGZvciBtb3JlIGluZm8uCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIGRlZiByZXBvcnRfZWRpdGFibGUoc2VsZiwgc3BlYywgc2V0dXBfc2NyaXB0KToKICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKHNldHVwX3NjcmlwdCkKICAgICAgICBweXRob24gPSBzeXMuZXhlY3V0YWJsZQogICAgICAgIHJldHVybiAnXG4nICsgc2VsZi5fX2VkaXRhYmxlX21zZyAlIGxvY2FscygpCgogICAgZGVmIHJ1bl9zZXR1cChzZWxmLCBzZXR1cF9zY3JpcHQsIHNldHVwX2Jhc2UsIGFyZ3MpOgogICAgICAgIHN5cy5tb2R1bGVzLnNldGRlZmF1bHQoJ2Rpc3R1dGlscy5jb21tYW5kLmJkaXN0X2VnZycsIGJkaXN0X2VnZykKICAgICAgICBzeXMubW9kdWxlcy5zZXRkZWZhdWx0KCdkaXN0dXRpbHMuY29tbWFuZC5lZ2dfaW5mbycsIGVnZ19pbmZvKQoKICAgICAgICBhcmdzID0gbGlzdChhcmdzKQogICAgICAgIGlmIHNlbGYudmVyYm9zZSA+IDI6CiAgICAgICAgICAgIHYgPSAndicgKiAoc2VsZi52ZXJib3NlIC0gMSkKICAgICAgICAgICAgYXJncy5pbnNlcnQoMCwgJy0nICsgdikKICAgICAgICBlbGlmIHNlbGYudmVyYm9zZSA8IDI6CiAgICAgICAgICAgIGFyZ3MuaW5zZXJ0KDAsICctcScpCiAgICAgICAgaWYgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBhcmdzLmluc2VydCgwLCAnLW4nKQogICAgICAgIGxvZy5pbmZvKAogICAgICAgICAgICAiUnVubmluZyAlcyAlcyIsIHNldHVwX3NjcmlwdFtsZW4oc2V0dXBfYmFzZSkgKyAxOl0sICcgJy5qb2luKGFyZ3MpCiAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgcnVuX3NldHVwKHNldHVwX3NjcmlwdCwgYXJncykKICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCBhcyB2OgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigiU2V0dXAgc2NyaXB0IGV4aXRlZCB3aXRoICVzIiAlICh2LmFyZ3NbMF0sKSkKCiAgICBkZWYgYnVpbGRfYW5kX2luc3RhbGwoc2VsZiwgc2V0dXBfc2NyaXB0LCBzZXR1cF9iYXNlKToKICAgICAgICBhcmdzID0gWydiZGlzdF9lZ2cnLCAnLS1kaXN0LWRpciddCgogICAgICAgIGRpc3RfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgKICAgICAgICAgICAgcHJlZml4PSdlZ2ctZGlzdC10bXAtJywgZGlyPW9zLnBhdGguZGlybmFtZShzZXR1cF9zY3JpcHQpCiAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5fc2V0X2ZldGNoZXJfb3B0aW9ucyhvcy5wYXRoLmRpcm5hbWUoc2V0dXBfc2NyaXB0KSkKICAgICAgICAgICAgYXJncy5hcHBlbmQoZGlzdF9kaXIpCgogICAgICAgICAgICBzZWxmLnJ1bl9zZXR1cChzZXR1cF9zY3JpcHQsIHNldHVwX2Jhc2UsIGFyZ3MpCiAgICAgICAgICAgIGFsbF9lZ2dzID0gRW52aXJvbm1lbnQoW2Rpc3RfZGlyXSkKICAgICAgICAgICAgZWdncyA9IFtdCiAgICAgICAgICAgIGZvciBrZXkgaW4gYWxsX2VnZ3M6CiAgICAgICAgICAgICAgICBmb3IgZGlzdCBpbiBhbGxfZWdnc1trZXldOgogICAgICAgICAgICAgICAgICAgIGVnZ3MuYXBwZW5kKHNlbGYuaW5zdGFsbF9lZ2coZGlzdC5sb2NhdGlvbiwgc2V0dXBfYmFzZSkpCiAgICAgICAgICAgIGlmIG5vdCBlZ2dzIGFuZCBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgbG9nLndhcm4oIk5vIGVnZ3MgZm91bmQgaW4gJXMgKHNldHVwIHNjcmlwdCBwcm9ibGVtPykiLAogICAgICAgICAgICAgICAgICAgICAgICAgZGlzdF9kaXIpCiAgICAgICAgICAgIHJldHVybiBlZ2dzCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgcm10cmVlKGRpc3RfZGlyKQogICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLnZlcmJvc2UpICAjIHJlc3RvcmUgb3VyIGxvZyB2ZXJib3NpdHkKCiAgICBkZWYgX3NldF9mZXRjaGVyX29wdGlvbnMoc2VsZiwgYmFzZSk6CiAgICAgICAgIiIiCiAgICAgICAgV2hlbiBlYXN5X2luc3RhbGwgaXMgYWJvdXQgdG8gcnVuIGJkaXN0X2VnZyBvbiBhIHNvdXJjZSBkaXN0LCB0aGF0CiAgICAgICAgc291cmNlIGRpc3QgbWlnaHQgaGF2ZSAnc2V0dXBfcmVxdWlyZXMnIGRpcmVjdGl2ZXMsIHJlcXVpcmluZwogICAgICAgIGFkZGl0aW9uYWwgZmV0Y2hpbmcuIEVuc3VyZSB0aGUgZmV0Y2hlciBvcHRpb25zIGdpdmVuIHRvIGVhc3lfaW5zdGFsbAogICAgICAgIGFyZSBhdmFpbGFibGUgdG8gdGhhdCBjb21tYW5kIGFzIHdlbGwuCiAgICAgICAgIiIiCiAgICAgICAgIyBmaW5kIHRoZSBmZXRjaCBvcHRpb25zIGZyb20gZWFzeV9pbnN0YWxsIGFuZCB3cml0ZSB0aGVtIG91dAogICAgICAgICMgdG8gdGhlIHNldHVwLmNmZyBmaWxlLgogICAgICAgIGVpX29wdHMgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfb3B0aW9uX2RpY3QoJ2Vhc3lfaW5zdGFsbCcpLmNvcHkoKQogICAgICAgIGZldGNoX2RpcmVjdGl2ZXMgPSAoCiAgICAgICAgICAgICdmaW5kX2xpbmtzJywgJ3NpdGVfZGlycycsICdpbmRleF91cmwnLCAnb3B0aW1pemUnLAogICAgICAgICAgICAnc2l0ZV9kaXJzJywgJ2FsbG93X2hvc3RzJywKICAgICAgICApCiAgICAgICAgZmV0Y2hfb3B0aW9ucyA9IHt9CiAgICAgICAgZm9yIGtleSwgdmFsIGluIGVpX29wdHMuaXRlbXMoKToKICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBmZXRjaF9kaXJlY3RpdmVzOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZmV0Y2hfb3B0aW9uc1trZXkucmVwbGFjZSgnXycsICctJyldID0gdmFsWzFdCiAgICAgICAgIyBjcmVhdGUgYSBzZXR0aW5ncyBkaWN0aW9uYXJ5IHN1aXRhYmxlIGZvciBgZWRpdF9jb25maWdgCiAgICAgICAgc2V0dGluZ3MgPSBkaWN0KGVhc3lfaW5zdGFsbD1mZXRjaF9vcHRpb25zKQogICAgICAgIGNmZ19maWxlbmFtZSA9IG9zLnBhdGguam9pbihiYXNlLCAnc2V0dXAuY2ZnJykKICAgICAgICBzZXRvcHQuZWRpdF9jb25maWcoY2ZnX2ZpbGVuYW1lLCBzZXR0aW5ncykKCiAgICBkZWYgdXBkYXRlX3B0aChzZWxmLCBkaXN0KToKICAgICAgICBpZiBzZWxmLnB0aF9maWxlIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBmb3IgZCBpbiBzZWxmLnB0aF9maWxlW2Rpc3Qua2V5XTogICMgZHJvcCBvbGQgZW50cmllcwogICAgICAgICAgICBpZiBzZWxmLm11bHRpX3ZlcnNpb24gb3IgZC5sb2NhdGlvbiAhPSBkaXN0LmxvY2F0aW9uOgogICAgICAgICAgICAgICAgbG9nLmluZm8oIlJlbW92aW5nICVzIGZyb20gZWFzeS1pbnN0YWxsLnB0aCBmaWxlIiwgZCkKICAgICAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUucmVtb3ZlKGQpCiAgICAgICAgICAgICAgICBpZiBkLmxvY2F0aW9uIGluIHNlbGYuc2hhZG93X3BhdGg6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zaGFkb3dfcGF0aC5yZW1vdmUoZC5sb2NhdGlvbikKCiAgICAgICAgaWYgbm90IHNlbGYubXVsdGlfdmVyc2lvbjoKICAgICAgICAgICAgaWYgZGlzdC5sb2NhdGlvbiBpbiBzZWxmLnB0aF9maWxlLnBhdGhzOgogICAgICAgICAgICAgICAgbG9nLmluZm8oCiAgICAgICAgICAgICAgICAgICAgIiVzIGlzIGFscmVhZHkgdGhlIGFjdGl2ZSB2ZXJzaW9uIGluIGVhc3ktaW5zdGFsbC5wdGgiLAogICAgICAgICAgICAgICAgICAgIGRpc3QsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2cuaW5mbygiQWRkaW5nICVzIHRvIGVhc3ktaW5zdGFsbC5wdGggZmlsZSIsIGRpc3QpCiAgICAgICAgICAgICAgICBzZWxmLnB0aF9maWxlLmFkZChkaXN0KSAgIyBhZGQgbmV3IGVudHJ5CiAgICAgICAgICAgICAgICBpZiBkaXN0LmxvY2F0aW9uIG5vdCBpbiBzZWxmLnNoYWRvd19wYXRoOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hhZG93X3BhdGguYXBwZW5kKGRpc3QubG9jYXRpb24pCgogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CgogICAgICAgICAgICBzZWxmLnB0aF9maWxlLnNhdmUoKQoKICAgICAgICAgICAgaWYgZGlzdC5rZXkgPT0gJ3NldHVwdG9vbHMnOgogICAgICAgICAgICAgICAgIyBFbnN1cmUgdGhhdCBzZXR1cHRvb2xzIGl0c2VsZiBuZXZlciBiZWNvbWVzIHVuYXZhaWxhYmxlIQogICAgICAgICAgICAgICAgIyBYWFggc2hvdWxkIHRoaXMgY2hlY2sgZm9yIGxhdGVzdCB2ZXJzaW9uPwogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgJ3NldHVwdG9vbHMucHRoJykKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNsaW5rKGZpbGVuYW1lKToKICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3d0JykKICAgICAgICAgICAgICAgIGYud3JpdGUoc2VsZi5wdGhfZmlsZS5tYWtlX3JlbGF0aXZlKGRpc3QubG9jYXRpb24pICsgJ1xuJykKICAgICAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgIGRlZiB1bnBhY2tfcHJvZ3Jlc3Moc2VsZiwgc3JjLCBkc3QpOgogICAgICAgICMgUHJvZ3Jlc3MgZmlsdGVyIGZvciB1bnBhY2tpbmcKICAgICAgICBsb2cuZGVidWcoIlVucGFja2luZyAlcyB0byAlcyIsIHNyYywgZHN0KQogICAgICAgIHJldHVybiBkc3QgICMgb25seSB1bnBhY2stYW5kLWNvbXBpbGUgc2tpcHMgZmlsZXMgZm9yIGRyeSBydW4KCiAgICBkZWYgdW5wYWNrX2FuZF9jb21waWxlKHNlbGYsIGVnZ19wYXRoLCBkZXN0aW5hdGlvbik6CiAgICAgICAgdG9fY29tcGlsZSA9IFtdCiAgICAgICAgdG9fY2htb2QgPSBbXQoKICAgICAgICBkZWYgcGYoc3JjLCBkc3QpOgogICAgICAgICAgICBpZiBkc3QuZW5kc3dpdGgoJy5weScpIGFuZCBub3Qgc3JjLnN0YXJ0c3dpdGgoJ0VHRy1JTkZPLycpOgogICAgICAgICAgICAgICAgdG9fY29tcGlsZS5hcHBlbmQoZHN0KQogICAgICAgICAgICBlbGlmIGRzdC5lbmRzd2l0aCgnLmRsbCcpIG9yIGRzdC5lbmRzd2l0aCgnLnNvJyk6CiAgICAgICAgICAgICAgICB0b19jaG1vZC5hcHBlbmQoZHN0KQogICAgICAgICAgICBzZWxmLnVucGFja19wcm9ncmVzcyhzcmMsIGRzdCkKICAgICAgICAgICAgcmV0dXJuIG5vdCBzZWxmLmRyeV9ydW4gYW5kIGRzdCBvciBOb25lCgogICAgICAgIHVucGFja19hcmNoaXZlKGVnZ19wYXRoLCBkZXN0aW5hdGlvbiwgcGYpCiAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUodG9fY29tcGlsZSkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBmb3IgZiBpbiB0b19jaG1vZDoKICAgICAgICAgICAgICAgIG1vZGUgPSAoKG9zLnN0YXQoZilbc3RhdC5TVF9NT0RFXSkgfCAwbzU1NSkgJiAwbzc3NTUKICAgICAgICAgICAgICAgIGNobW9kKGYsIG1vZGUpCgogICAgZGVmIGJ5dGVfY29tcGlsZShzZWxmLCB0b19jb21waWxlKToKICAgICAgICBpZiBzeXMuZG9udF93cml0ZV9ieXRlY29kZToKICAgICAgICAgICAgc2VsZi53YXJuKCdieXRlLWNvbXBpbGluZyBpcyBkaXNhYmxlZCwgc2tpcHBpbmcuJykKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGJ5dGVfY29tcGlsZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgdHJ5IHRvIG1ha2UgdGhlIGJ5dGUgY29tcGlsZSBtZXNzYWdlcyBxdWlldGVyCiAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYudmVyYm9zZSAtIDEpCgogICAgICAgICAgICBieXRlX2NvbXBpbGUodG9fY29tcGlsZSwgb3B0aW1pemU9MCwgZm9yY2U9MSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAgICAgICAgICAgIGlmIHNlbGYub3B0aW1pemU6CiAgICAgICAgICAgICAgICBieXRlX2NvbXBpbGUoCiAgICAgICAgICAgICAgICAgICAgdG9fY29tcGlsZSwgb3B0aW1pemU9c2VsZi5vcHRpbWl6ZSwgZm9yY2U9MSwKICAgICAgICAgICAgICAgICAgICBkcnlfcnVuPXNlbGYuZHJ5X3J1biwKICAgICAgICAgICAgICAgICkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLnZlcmJvc2UpICAjIHJlc3RvcmUgb3JpZ2luYWwgdmVyYm9zaXR5CgogICAgX19ub19kZWZhdWx0X21zZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBiYWQgaW5zdGFsbCBkaXJlY3Rvcnkgb3IgUFlUSE9OUEFUSAoKICAgICAgICBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gaW5zdGFsbCBhIHBhY2thZ2UgdG8gYSBkaXJlY3RvcnkgdGhhdCBpcyBub3QKICAgICAgICBvbiBQWVRIT05QQVRIIGFuZCB3aGljaCBQeXRob24gZG9lcyBub3QgcmVhZCAiLnB0aCIgZmlsZXMgZnJvbS4gIFRoZQogICAgICAgIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgeW91IHNwZWNpZmllZCAodmlhIC0taW5zdGFsbC1kaXIsIC0tcHJlZml4LCBvcgogICAgICAgIHRoZSBkaXN0dXRpbHMgZGVmYXVsdCBzZXR0aW5nKSB3YXM6CgogICAgICAgICAgICAlcwoKICAgICAgICBhbmQgeW91ciBQWVRIT05QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGN1cnJlbnRseSBjb250YWluczoKCiAgICAgICAgICAgICVyCgogICAgICAgIEhlcmUgYXJlIHNvbWUgb2YgeW91ciBvcHRpb25zIGZvciBjb3JyZWN0aW5nIHRoZSBwcm9ibGVtOgoKICAgICAgICAqIFlvdSBjYW4gY2hvb3NlIGEgZGlmZmVyZW50IGluc3RhbGxhdGlvbiBkaXJlY3RvcnksIGkuZS4sIG9uZSB0aGF0IGlzCiAgICAgICAgICBvbiBQWVRIT05QQVRIIG9yIHN1cHBvcnRzIC5wdGggZmlsZXMKCiAgICAgICAgKiBZb3UgY2FuIGFkZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB0byB0aGUgUFlUSE9OUEFUSCBlbnZpcm9ubWVudAogICAgICAgICAgdmFyaWFibGUuICAoSXQgbXVzdCB0aGVuIGFsc28gYmUgb24gUFlUSE9OUEFUSCB3aGVuZXZlciB5b3UgcnVuCiAgICAgICAgICBQeXRob24gYW5kIHdhbnQgdG8gdXNlIHRoZSBwYWNrYWdlKHMpIHlvdSBhcmUgaW5zdGFsbGluZy4pCgogICAgICAgICogWW91IGNhbiBzZXQgdXAgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgdG8gc3VwcG9ydCAiLnB0aCIgZmlsZXMgYnkKICAgICAgICAgIHVzaW5nIG9uZSBvZiB0aGUgYXBwcm9hY2hlcyBkZXNjcmliZWQgaGVyZToKCiAgICAgICAgICBodHRwczovL3NldHVwdG9vbHMucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2Vhc3lfaW5zdGFsbC5odG1sI2N1c3RvbS1pbnN0YWxsYXRpb24tbG9jYXRpb25zCgoKICAgICAgICBQbGVhc2UgbWFrZSB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlcyBmb3IgeW91ciBzeXN0ZW0gYW5kIHRyeSBhZ2Fpbi4iIiIpLmxzdHJpcCgpCgogICAgZGVmIG5vX2RlZmF1bHRfdmVyc2lvbl9tc2coc2VsZik6CiAgICAgICAgdGVtcGxhdGUgPSBzZWxmLl9fbm9fZGVmYXVsdF9tc2cKICAgICAgICByZXR1cm4gdGVtcGxhdGUgJSAoc2VsZi5pbnN0YWxsX2Rpciwgb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnLCAnJykpCgogICAgZGVmIGluc3RhbGxfc2l0ZV9weShzZWxmKToKICAgICAgICAiIiJNYWtlIHN1cmUgdGhlcmUncyBhIHNpdGUucHkgaW4gdGhlIHRhcmdldCBkaXIsIGlmIG5lZWRlZCIiIgoKICAgICAgICBpZiBzZWxmLnNpdGVweV9pbnN0YWxsZWQ6CiAgICAgICAgICAgIHJldHVybiAgIyBhbHJlYWR5IGRpZCBpdCwgb3IgZG9uJ3QgbmVlZCB0bwoKICAgICAgICBzaXRlcHkgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgInNpdGUucHkiKQogICAgICAgIHNvdXJjZSA9IHJlc291cmNlX3N0cmluZygic2V0dXB0b29scyIsICJzaXRlLXBhdGNoLnB5IikKICAgICAgICBzb3VyY2UgPSBzb3VyY2UuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgY3VycmVudCA9ICIiCgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNpdGVweSk6CiAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hlY2tpbmcgZXhpc3Rpbmcgc2l0ZS5weSBpbiAlcyIsIHNlbGYuaW5zdGFsbF9kaXIpCiAgICAgICAgICAgIHdpdGggaW8ub3BlbihzaXRlcHkpIGFzIHN0cm06CiAgICAgICAgICAgICAgICBjdXJyZW50ID0gc3RybS5yZWFkKCkKCiAgICAgICAgICAgIGlmIG5vdCBjdXJyZW50LnN0YXJ0c3dpdGgoJ2RlZiBfX2Jvb3QoKTonKToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSBzZXR1cHRvb2xzLWdlbmVyYXRlZCBzaXRlLnB5OyBwbGVhc2UiCiAgICAgICAgICAgICAgICAgICAgIiByZW1vdmUgaXQuIiAlIHNpdGVweQogICAgICAgICAgICAgICAgKQoKICAgICAgICBpZiBjdXJyZW50ICE9IHNvdXJjZToKICAgICAgICAgICAgbG9nLmluZm8oIkNyZWF0aW5nICVzIiwgc2l0ZXB5KQogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShzaXRlcHkpCiAgICAgICAgICAgICAgICB3aXRoIGlvLm9wZW4oc2l0ZXB5LCAndycsIGVuY29kaW5nPSd1dGYtOCcpIGFzIHN0cm06CiAgICAgICAgICAgICAgICAgICAgc3RybS53cml0ZShzb3VyY2UpCiAgICAgICAgICAgIHNlbGYuYnl0ZV9jb21waWxlKFtzaXRlcHldKQoKICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBUcnVlCgogICAgZGVmIGNyZWF0ZV9ob21lX3BhdGgoc2VsZik6CiAgICAgICAgIiIiQ3JlYXRlIGRpcmVjdG9yaWVzIHVuZGVyIH4uIiIiCiAgICAgICAgaWYgbm90IHNlbGYudXNlcjoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaG9tZSA9IGNvbnZlcnRfcGF0aChvcy5wYXRoLmV4cGFuZHVzZXIoIn4iKSkKICAgICAgICBmb3IgbmFtZSwgcGF0aCBpbiBzaXguaXRlcml0ZW1zKHNlbGYuY29uZmlnX3ZhcnMpOgogICAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoaG9tZSkgYW5kIG5vdCBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgib3MubWFrZWRpcnMoJyVzJywgMG83MDApIiAlIHBhdGgpCiAgICAgICAgICAgICAgICBvcy5tYWtlZGlycyhwYXRoLCAwbzcwMCkKCiAgICBJTlNUQUxMX1NDSEVNRVMgPSBkaWN0KAogICAgICAgIHBvc2l4PWRpY3QoCiAgICAgICAgICAgIGluc3RhbGxfZGlyPSckYmFzZS9saWIvcHl0aG9uJHB5X3ZlcnNpb25fc2hvcnQvc2l0ZS1wYWNrYWdlcycsCiAgICAgICAgICAgIHNjcmlwdF9kaXI9JyRiYXNlL2JpbicsCiAgICAgICAgKSwKICAgICkKCiAgICBERUZBVUxUX1NDSEVNRSA9IGRpY3QoCiAgICAgICAgaW5zdGFsbF9kaXI9JyRiYXNlL0xpYi9zaXRlLXBhY2thZ2VzJywKICAgICAgICBzY3JpcHRfZGlyPSckYmFzZS9TY3JpcHRzJywKICAgICkKCiAgICBkZWYgX2V4cGFuZChzZWxmLCAqYXR0cnMpOgogICAgICAgIGNvbmZpZ192YXJzID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGwnKS5jb25maWdfdmFycwoKICAgICAgICBpZiBzZWxmLnByZWZpeDoKICAgICAgICAgICAgIyBTZXQgZGVmYXVsdCBpbnN0YWxsX2Rpci9zY3JpcHRzIGZyb20gLS1wcmVmaXgKICAgICAgICAgICAgY29uZmlnX3ZhcnMgPSBjb25maWdfdmFycy5jb3B5KCkKICAgICAgICAgICAgY29uZmlnX3ZhcnNbJ2Jhc2UnXSA9IHNlbGYucHJlZml4CiAgICAgICAgICAgIHNjaGVtZSA9IHNlbGYuSU5TVEFMTF9TQ0hFTUVTLmdldChvcy5uYW1lLCBzZWxmLkRFRkFVTFRfU0NIRU1FKQogICAgICAgICAgICBmb3IgYXR0ciwgdmFsIGluIHNjaGVtZS5pdGVtcygpOgogICAgICAgICAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCBhdHRyLCBOb25lKSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsKQoKICAgICAgICBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBzdWJzdF92YXJzCgogICAgICAgIGZvciBhdHRyIGluIGF0dHJzOgogICAgICAgICAgICB2YWwgPSBnZXRhdHRyKHNlbGYsIGF0dHIpCiAgICAgICAgICAgIGlmIHZhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHZhbCA9IHN1YnN0X3ZhcnModmFsLCBjb25maWdfdmFycykKICAgICAgICAgICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKICAgICAgICAgICAgICAgICAgICB2YWwgPSBvcy5wYXRoLmV4cGFuZHVzZXIodmFsKQogICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWwpCgoKZGVmIF9weXRob25wYXRoKCk6CiAgICBpdGVtcyA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJywgJycpLnNwbGl0KG9zLnBhdGhzZXApCiAgICByZXR1cm4gZmlsdGVyKE5vbmUsIGl0ZW1zKQoKCmRlZiBnZXRfc2l0ZV9kaXJzKCk6CiAgICAiIiIKICAgIFJldHVybiBhIGxpc3Qgb2YgJ3NpdGUnIGRpcnMKICAgICIiIgoKICAgIHNpdGVkaXJzID0gW10KCiAgICAjIHN0YXJ0IHdpdGggUFlUSE9OUEFUSAogICAgc2l0ZWRpcnMuZXh0ZW5kKF9weXRob25wYXRoKCkpCgogICAgcHJlZml4ZXMgPSBbc3lzLnByZWZpeF0KICAgIGlmIHN5cy5leGVjX3ByZWZpeCAhPSBzeXMucHJlZml4OgogICAgICAgIHByZWZpeGVzLmFwcGVuZChzeXMuZXhlY19wcmVmaXgpCiAgICBmb3IgcHJlZml4IGluIHByZWZpeGVzOgogICAgICAgIGlmIHByZWZpeDoKICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtIGluICgnb3MyZW14JywgJ3Jpc2NvcycpOgogICAgICAgICAgICAgICAgc2l0ZWRpcnMuYXBwZW5kKG9zLnBhdGguam9pbihwcmVmaXgsICJMaWIiLCAic2l0ZS1wYWNrYWdlcyIpKQogICAgICAgICAgICBlbGlmIG9zLnNlcCA9PSAnLyc6CiAgICAgICAgICAgICAgICBzaXRlZGlycy5leHRlbmQoWwogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAibGliIiwKICAgICAgICAgICAgICAgICAgICAgICAgInB5dGhvbiIgKyBzeXMudmVyc2lvbls6M10sCiAgICAgICAgICAgICAgICAgICAgICAgICJzaXRlLXBhY2thZ2VzIiwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihwcmVmaXgsICJsaWIiLCAic2l0ZS1weXRob24iKSwKICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzaXRlZGlycy5leHRlbmQoWwogICAgICAgICAgICAgICAgICAgIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4ocHJlZml4LCAibGliIiwgInNpdGUtcGFja2FnZXMiKSwKICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICAgICAgICAgICMgZm9yIGZyYW1ld29yayBidWlsZHMgKm9ubHkqIHdlIGFkZCB0aGUgc3RhbmRhcmQgQXBwbGUKICAgICAgICAgICAgICAgICMgbG9jYXRpb25zLiBDdXJyZW50bHkgb25seSBwZXItdXNlciwgYnV0IC9MaWJyYXJ5IGFuZAogICAgICAgICAgICAgICAgIyAvTmV0d29yay9MaWJyYXJ5IGNvdWxkIGJlIGFkZGVkIHRvbwogICAgICAgICAgICAgICAgaWYgJ1B5dGhvbi5mcmFtZXdvcmsnIGluIHByZWZpeDoKICAgICAgICAgICAgICAgICAgICBob21lID0gb3MuZW52aXJvbi5nZXQoJ0hPTUUnKQogICAgICAgICAgICAgICAgICAgIGlmIGhvbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIGhvbWVfc3AgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob21lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xpYnJhcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1B5dGhvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMudmVyc2lvbls6M10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l0ZS1wYWNrYWdlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZWRpcnMuYXBwZW5kKGhvbWVfc3ApCiAgICBsaWJfcGF0aHMgPSBnZXRfcGF0aCgncHVyZWxpYicpLCBnZXRfcGF0aCgncGxhdGxpYicpCiAgICBmb3Igc2l0ZV9saWIgaW4gbGliX3BhdGhzOgogICAgICAgIGlmIHNpdGVfbGliIG5vdCBpbiBzaXRlZGlyczoKICAgICAgICAgICAgc2l0ZWRpcnMuYXBwZW5kKHNpdGVfbGliKQoKICAgIGlmIHNpdGUuRU5BQkxFX1VTRVJfU0lURToKICAgICAgICBzaXRlZGlycy5hcHBlbmQoc2l0ZS5VU0VSX1NJVEUpCgogICAgdHJ5OgogICAgICAgIHNpdGVkaXJzLmV4dGVuZChzaXRlLmdldHNpdGVwYWNrYWdlcygpKQogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHBhc3MKCiAgICBzaXRlZGlycyA9IGxpc3QobWFwKG5vcm1hbGl6ZV9wYXRoLCBzaXRlZGlycykpCgogICAgcmV0dXJuIHNpdGVkaXJzCgoKZGVmIGV4cGFuZF9wYXRocyhpbnB1dHMpOgogICAgIiIiWWllbGQgc3lzLnBhdGggZGlyZWN0b3JpZXMgdGhhdCBtaWdodCBjb250YWluICJvbGQtc3R5bGUiIHBhY2thZ2VzIiIiCgogICAgc2VlbiA9IHt9CgogICAgZm9yIGRpcm5hbWUgaW4gaW5wdXRzOgogICAgICAgIGRpcm5hbWUgPSBub3JtYWxpemVfcGF0aChkaXJuYW1lKQogICAgICAgIGlmIGRpcm5hbWUgaW4gc2VlbjoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgc2VlbltkaXJuYW1lXSA9IDEKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkaXJuYW1lKToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCiAgICAgICAgeWllbGQgZGlybmFtZSwgZmlsZXMKCiAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CiAgICAgICAgICAgIGlmIG5vdCBuYW1lLmVuZHN3aXRoKCcucHRoJyk6CiAgICAgICAgICAgICAgICAjIFdlIG9ubHkgY2FyZSBhYm91dCB0aGUgLnB0aCBmaWxlcwogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbmFtZSBpbiAoJ2Vhc3ktaW5zdGFsbC5wdGgnLCAnc2V0dXB0b29scy5wdGgnKToKICAgICAgICAgICAgICAgICMgSWdub3JlIC5wdGggZmlsZXMgdGhhdCB3ZSBjb250cm9sCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgIyBSZWFkIHRoZSAucHRoIGZpbGUKICAgICAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKGRpcm5hbWUsIG5hbWUpKQogICAgICAgICAgICBsaW5lcyA9IGxpc3QoeWllbGRfbGluZXMoZikpCiAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgICAgICAgICAgIyBZaWVsZCBleGlzdGluZyBub24tZHVwZSwgbm9uLWltcG9ydCBkaXJlY3RvcnkgbGluZXMgZnJvbSBpdAogICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lLnN0YXJ0c3dpdGgoImltcG9ydCIpOgogICAgICAgICAgICAgICAgICAgIGxpbmUgPSBub3JtYWxpemVfcGF0aChsaW5lLnJzdHJpcCgpKQogICAgICAgICAgICAgICAgICAgIGlmIGxpbmUgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5bbGluZV0gPSAxCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGxpbmUpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgbGluZSwgb3MubGlzdGRpcihsaW5lKQoKCmRlZiBleHRyYWN0X3dpbmluc3RfY2ZnKGRpc3RfZmlsZW5hbWUpOgogICAgIiIiRXh0cmFjdCBjb25maWd1cmF0aW9uIGRhdGEgZnJvbSBhIGJkaXN0X3dpbmluc3QgLmV4ZQoKICAgIFJldHVybnMgYSBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyLCBvciBOb25lCiAgICAiIiIKICAgIGYgPSBvcGVuKGRpc3RfZmlsZW5hbWUsICdyYicpCiAgICB0cnk6CiAgICAgICAgZW5kcmVjID0gemlwZmlsZS5fRW5kUmVjRGF0YShmKQogICAgICAgIGlmIGVuZHJlYyBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBwcmVwZW5kZWQgPSAoZW5kcmVjWzldIC0gZW5kcmVjWzVdKSAtIGVuZHJlY1s2XQogICAgICAgIGlmIHByZXBlbmRlZCA8IDEyOiAgIyBubyB3aW5pbnN0IGRhdGEgaGVyZQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGYuc2VlayhwcmVwZW5kZWQgLSAxMikKCiAgICAgICAgdGFnLCBjZmdsZW4sIGJtbGVuID0gc3RydWN0LnVucGFjaygiPGlpaSIsIGYucmVhZCgxMikpCiAgICAgICAgaWYgdGFnIG5vdCBpbiAoMHgxMjM0NTY3QSwgMHgxMjM0NTY3Qik6CiAgICAgICAgICAgIHJldHVybiBOb25lICAjIG5vdCBhIHZhbGlkIHRhZwoKICAgICAgICBmLnNlZWsocHJlcGVuZGVkIC0gKDEyICsgY2ZnbGVuKSkKICAgICAgICBpbml0ID0geyd2ZXJzaW9uJzogJycsICd0YXJnZXRfdmVyc2lvbic6ICcnfQogICAgICAgIGNmZyA9IGNvbmZpZ3BhcnNlci5SYXdDb25maWdQYXJzZXIoaW5pdCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBhcnQgPSBmLnJlYWQoY2ZnbGVuKQogICAgICAgICAgICAjIFJlYWQgdXAgdG8gdGhlIGZpcnN0IG51bGwgYnl0ZS4KICAgICAgICAgICAgY29uZmlnID0gcGFydC5zcGxpdChiJ1wwJywgMSlbMF0KICAgICAgICAgICAgIyBOb3cgdGhlIGNvbmZpZyBpcyBpbiBieXRlcywgYnV0IGZvciBSYXdDb25maWdQYXJzZXIsIGl0IHNob3VsZAogICAgICAgICAgICAjICBiZSB0ZXh0LCBzbyBkZWNvZGUgaXQuCiAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZy5kZWNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQogICAgICAgICAgICBjZmcucmVhZGZwKHNpeC5TdHJpbmdJTyhjb25maWcpKQogICAgICAgIGV4Y2VwdCBjb25maWdwYXJzZXIuRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgaWYgbm90IGNmZy5oYXNfc2VjdGlvbignbWV0YWRhdGEnKSBvciBub3QgY2ZnLmhhc19zZWN0aW9uKCdTZXR1cCcpOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBjZmcKCiAgICBmaW5hbGx5OgogICAgICAgIGYuY2xvc2UoKQoKCmRlZiBnZXRfZXhlX3ByZWZpeGVzKGV4ZV9maWxlbmFtZSk6CiAgICAiIiJHZXQgZXhlLT5lZ2cgcGF0aCB0cmFuc2xhdGlvbnMgZm9yIGEgZ2l2ZW4gLmV4ZSBmaWxlIiIiCgogICAgcHJlZml4ZXMgPSBbCiAgICAgICAgKCdQVVJFTElCLycsICcnKSwKICAgICAgICAoJ1BMQVRMSUIvcHl3aW4zMl9zeXN0ZW0zMicsICcnKSwKICAgICAgICAoJ1BMQVRMSUIvJywgJycpLAogICAgICAgICgnU0NSSVBUUy8nLCAnRUdHLUlORk8vc2NyaXB0cy8nKSwKICAgICAgICAoJ0RBVEEvbGliL3NpdGUtcGFja2FnZXMnLCAnJyksCiAgICBdCiAgICB6ID0gemlwZmlsZS5aaXBGaWxlKGV4ZV9maWxlbmFtZSkKICAgIHRyeToKICAgICAgICBmb3IgaW5mbyBpbiB6LmluZm9saXN0KCk6CiAgICAgICAgICAgIG5hbWUgPSBpbmZvLmZpbGVuYW1lCiAgICAgICAgICAgIHBhcnRzID0gbmFtZS5zcGxpdCgnLycpCiAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgPT0gMyBhbmQgcGFydHNbMl0gPT0gJ1BLRy1JTkZPJzoKICAgICAgICAgICAgICAgIGlmIHBhcnRzWzFdLmVuZHN3aXRoKCcuZWdnLWluZm8nKToKICAgICAgICAgICAgICAgICAgICBwcmVmaXhlcy5pbnNlcnQoMCwgKCcvJy5qb2luKHBhcnRzWzoyXSksICdFR0ctSU5GTy8nKSkKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBsZW4ocGFydHMpICE9IDIgb3Igbm90IG5hbWUuZW5kc3dpdGgoJy5wdGgnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy1uc3BrZy5wdGgnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIHBhcnRzWzBdLnVwcGVyKCkgaW4gKCdQVVJFTElCJywgJ1BMQVRMSUInKToKICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gei5yZWFkKG5hbWUpCiAgICAgICAgICAgICAgICBpZiBzaXguUFkzOgogICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gY29udGVudHMuZGVjb2RlKCkKICAgICAgICAgICAgICAgIGZvciBwdGggaW4geWllbGRfbGluZXMoY29udGVudHMpOgogICAgICAgICAgICAgICAgICAgIHB0aCA9IHB0aC5zdHJpcCgpLnJlcGxhY2UoJ1xcJywgJy8nKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwdGguc3RhcnRzd2l0aCgnaW1wb3J0Jyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeGVzLmFwcGVuZCgoKCclcy8lcy8nICUgKHBhcnRzWzBdLCBwdGgpKSwgJycpKQogICAgZmluYWxseToKICAgICAgICB6LmNsb3NlKCkKICAgIHByZWZpeGVzID0gWyh4Lmxvd2VyKCksIHkpIGZvciB4LCB5IGluIHByZWZpeGVzXQogICAgcHJlZml4ZXMuc29ydCgpCiAgICBwcmVmaXhlcy5yZXZlcnNlKCkKICAgIHJldHVybiBwcmVmaXhlcwoKCmNsYXNzIFB0aERpc3RyaWJ1dGlvbnMoRW52aXJvbm1lbnQpOgogICAgIiIiQSAucHRoIGZpbGUgd2l0aCBEaXN0cmlidXRpb24gcGF0aHMgaW4gaXQiIiIKCiAgICBkaXJ0eSA9IEZhbHNlCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBzaXRlZGlycz0oKSk6CiAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCiAgICAgICAgc2VsZi5zaXRlZGlycyA9IGxpc3QobWFwKG5vcm1hbGl6ZV9wYXRoLCBzaXRlZGlycykpCiAgICAgICAgc2VsZi5iYXNlZGlyID0gbm9ybWFsaXplX3BhdGgob3MucGF0aC5kaXJuYW1lKHNlbGYuZmlsZW5hbWUpKQogICAgICAgIHNlbGYuX2xvYWQoKQogICAgICAgIEVudmlyb25tZW50Ll9faW5pdF9fKHNlbGYsIFtdLCBOb25lLCBOb25lKQogICAgICAgIGZvciBwYXRoIGluIHlpZWxkX2xpbmVzKHNlbGYucGF0aHMpOgogICAgICAgICAgICBsaXN0KG1hcChzZWxmLmFkZCwgZmluZF9kaXN0cmlidXRpb25zKHBhdGgsIFRydWUpKSkKCiAgICBkZWYgX2xvYWQoc2VsZik6CiAgICAgICAgc2VsZi5wYXRocyA9IFtdCiAgICAgICAgc2F3X2ltcG9ydCA9IEZhbHNlCiAgICAgICAgc2VlbiA9IGRpY3QuZnJvbWtleXMoc2VsZi5zaXRlZGlycykKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShzZWxmLmZpbGVuYW1lKToKICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi5maWxlbmFtZSwgJ3J0JykKICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnaW1wb3J0Jyk6CiAgICAgICAgICAgICAgICAgICAgc2F3X2ltcG9ydCA9IFRydWUKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgcGF0aCA9IGxpbmUucnN0cmlwKCkKICAgICAgICAgICAgICAgIHNlbGYucGF0aHMuYXBwZW5kKHBhdGgpCiAgICAgICAgICAgICAgICBpZiBub3QgcGF0aC5zdHJpcCgpIG9yIHBhdGguc3RyaXAoKS5zdGFydHN3aXRoKCcjJyk6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICMgc2tpcCBub24tZXhpc3RlbnQgcGF0aHMsIGluIGNhc2Ugc29tZWJvZHkgZGVsZXRlZCBhIHBhY2thZ2UKICAgICAgICAgICAgICAgICMgbWFudWFsbHksIGFuZCBkdXBsaWNhdGUgcGF0aHMgYXMgd2VsbAogICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYucGF0aHNbLTFdID0gbm9ybWFsaXplX3BhdGgoCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuYmFzZWRpciwgcGF0aCkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKSBvciBwYXRoIGluIHNlZW46CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRocy5wb3AoKSAgIyBza2lwIGl0CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXJ0eSA9IFRydWUgICMgd2UgY2xlYW5lZCB1cCwgc28gd2UncmUgZGlydHkgbm93IDopCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHNlZW5bcGF0aF0gPSAxCiAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgICAgICBpZiBzZWxmLnBhdGhzIGFuZCBub3Qgc2F3X2ltcG9ydDoKICAgICAgICAgICAgc2VsZi5kaXJ0eSA9IFRydWUgICMgZW5zdXJlIGFueXRoaW5nIHdlIHRvdWNoIGhhcyBpbXBvcnQgd3JhcHBlcnMKICAgICAgICB3aGlsZSBzZWxmLnBhdGhzIGFuZCBub3Qgc2VsZi5wYXRoc1stMV0uc3RyaXAoKToKICAgICAgICAgICAgc2VsZi5wYXRocy5wb3AoKQoKICAgIGRlZiBzYXZlKHNlbGYpOgogICAgICAgICIiIldyaXRlIGNoYW5nZWQgLnB0aCBmaWxlIGJhY2sgdG8gZGlzayIiIgogICAgICAgIGlmIG5vdCBzZWxmLmRpcnR5OgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgcmVsX3BhdGhzID0gbGlzdChtYXAoc2VsZi5tYWtlX3JlbGF0aXZlLCBzZWxmLnBhdGhzKSkKICAgICAgICBpZiByZWxfcGF0aHM6CiAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2F2aW5nICVzIiwgc2VsZi5maWxlbmFtZSkKICAgICAgICAgICAgbGluZXMgPSBzZWxmLl93cmFwX2xpbmVzKHJlbF9wYXRocykKICAgICAgICAgICAgZGF0YSA9ICdcbicuam9pbihsaW5lcykgKyAnXG4nCgogICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhzZWxmLmZpbGVuYW1lKToKICAgICAgICAgICAgICAgIG9zLnVubGluayhzZWxmLmZpbGVuYW1lKQogICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5maWxlbmFtZSwgJ3d0JykgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKCiAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmZpbGVuYW1lKToKICAgICAgICAgICAgbG9nLmRlYnVnKCJEZWxldGluZyBlbXB0eSAlcyIsIHNlbGYuZmlsZW5hbWUpCiAgICAgICAgICAgIG9zLnVubGluayhzZWxmLmZpbGVuYW1lKQoKICAgICAgICBzZWxmLmRpcnR5ID0gRmFsc2UKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3dyYXBfbGluZXMobGluZXMpOgogICAgICAgIHJldHVybiBsaW5lcwoKICAgIGRlZiBhZGQoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiQWRkIGBkaXN0YCB0byB0aGUgZGlzdHJpYnV0aW9uIG1hcCIiIgogICAgICAgIG5ld19wYXRoID0gKAogICAgICAgICAgICBkaXN0LmxvY2F0aW9uIG5vdCBpbiBzZWxmLnBhdGhzIGFuZCAoCiAgICAgICAgICAgICAgICBkaXN0LmxvY2F0aW9uIG5vdCBpbiBzZWxmLnNpdGVkaXJzIG9yCiAgICAgICAgICAgICAgICAjIGFjY291bnQgZm9yICcuJyBiZWluZyBpbiBQWVRIT05QQVRICiAgICAgICAgICAgICAgICBkaXN0LmxvY2F0aW9uID09IG9zLmdldGN3ZCgpCiAgICAgICAgICAgICkKICAgICAgICApCiAgICAgICAgaWYgbmV3X3BhdGg6CiAgICAgICAgICAgIHNlbGYucGF0aHMuYXBwZW5kKGRpc3QubG9jYXRpb24pCiAgICAgICAgICAgIHNlbGYuZGlydHkgPSBUcnVlCiAgICAgICAgRW52aXJvbm1lbnQuYWRkKHNlbGYsIGRpc3QpCgogICAgZGVmIHJlbW92ZShzZWxmLCBkaXN0KToKICAgICAgICAiIiJSZW1vdmUgYGRpc3RgIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiBtYXAiIiIKICAgICAgICB3aGlsZSBkaXN0LmxvY2F0aW9uIGluIHNlbGYucGF0aHM6CiAgICAgICAgICAgIHNlbGYucGF0aHMucmVtb3ZlKGRpc3QubG9jYXRpb24pCiAgICAgICAgICAgIHNlbGYuZGlydHkgPSBUcnVlCiAgICAgICAgRW52aXJvbm1lbnQucmVtb3ZlKHNlbGYsIGRpc3QpCgogICAgZGVmIG1ha2VfcmVsYXRpdmUoc2VsZiwgcGF0aCk6CiAgICAgICAgbnBhdGgsIGxhc3QgPSBvcy5wYXRoLnNwbGl0KG5vcm1hbGl6ZV9wYXRoKHBhdGgpKQogICAgICAgIGJhc2VsZW4gPSBsZW4oc2VsZi5iYXNlZGlyKQogICAgICAgIHBhcnRzID0gW2xhc3RdCiAgICAgICAgc2VwID0gb3MuYWx0c2VwID09ICcvJyBhbmQgJy8nIG9yIG9zLnNlcAogICAgICAgIHdoaWxlIGxlbihucGF0aCkgPj0gYmFzZWxlbjoKICAgICAgICAgICAgaWYgbnBhdGggPT0gc2VsZi5iYXNlZGlyOgogICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKG9zLmN1cmRpcikKICAgICAgICAgICAgICAgIHBhcnRzLnJldmVyc2UoKQogICAgICAgICAgICAgICAgcmV0dXJuIHNlcC5qb2luKHBhcnRzKQogICAgICAgICAgICBucGF0aCwgbGFzdCA9IG9zLnBhdGguc3BsaXQobnBhdGgpCiAgICAgICAgICAgIHBhcnRzLmFwcGVuZChsYXN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBwYXRoCgoKY2xhc3MgUmV3cml0ZVB0aERpc3RyaWJ1dGlvbnMoUHRoRGlzdHJpYnV0aW9ucyk6CiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfd3JhcF9saW5lcyhjbHMsIGxpbmVzKToKICAgICAgICB5aWVsZCBjbHMucHJlbHVkZQogICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgICAgICB5aWVsZCBsaW5lCiAgICAgICAgeWllbGQgY2xzLnBvc3RsdWRlCgogICAgcHJlbHVkZSA9IF9vbmVfbGluZXIoIiIiCiAgICAgICAgaW1wb3J0IHN5cwogICAgICAgIHN5cy5fX3BsZW4gPSBsZW4oc3lzLnBhdGgpCiAgICAgICAgIiIiKQogICAgcG9zdGx1ZGUgPSBfb25lX2xpbmVyKCIiIgogICAgICAgIGltcG9ydCBzeXMKICAgICAgICBuZXcgPSBzeXMucGF0aFtzeXMuX19wbGVuOl0KICAgICAgICBkZWwgc3lzLnBhdGhbc3lzLl9fcGxlbjpdCiAgICAgICAgcCA9IGdldGF0dHIoc3lzLCAnX19lZ2dpbnNlcnQnLCAwKQogICAgICAgIHN5cy5wYXRoW3A6cF0gPSBuZXcKICAgICAgICBzeXMuX19lZ2dpbnNlcnQgPSBwICsgbGVuKG5ldykKICAgICAgICAiIiIpCgoKaWYgb3MuZW52aXJvbi5nZXQoJ1NFVFVQVE9PTFNfU1lTX1BBVEhfVEVDSE5JUVVFJywgJ3JhdycpID09ICdyZXdyaXRlJzoKICAgIFB0aERpc3RyaWJ1dGlvbnMgPSBSZXdyaXRlUHRoRGlzdHJpYnV0aW9ucwoKCmRlZiBfZmlyc3RfbGluZV9yZSgpOgogICAgIiIiCiAgICBSZXR1cm4gYSByZWd1bGFyIGV4cHJlc3Npb24gYmFzZWQgb24gZmlyc3RfbGluZV9yZSBzdWl0YWJsZSBmb3IgbWF0Y2hpbmcKICAgIHN0cmluZ3MuCiAgICAiIiIKICAgIGlmIGlzaW5zdGFuY2UoZmlyc3RfbGluZV9yZS5wYXR0ZXJuLCBzdHIpOgogICAgICAgIHJldHVybiBmaXJzdF9saW5lX3JlCgogICAgIyBmaXJzdF9saW5lX3JlIGluIFB5dGhvbiA+PTMuMS40IGFuZCA+PTMuMi4xIGlzIGEgYnl0ZXMgcGF0dGVybi4KICAgIHJldHVybiByZS5jb21waWxlKGZpcnN0X2xpbmVfcmUucGF0dGVybi5kZWNvZGUoKSkKCgpkZWYgYXV0b19jaG1vZChmdW5jLCBhcmcsIGV4Yyk6CiAgICBpZiBmdW5jIGluIFtvcy51bmxpbmssIG9zLnJlbW92ZV0gYW5kIG9zLm5hbWUgPT0gJ250JzoKICAgICAgICBjaG1vZChhcmcsIHN0YXQuU19JV1JJVEUpCiAgICAgICAgcmV0dXJuIGZ1bmMoYXJnKQogICAgZXQsIGV2LCBfID0gc3lzLmV4Y19pbmZvKCkKICAgIHNpeC5yZXJhaXNlKGV0LCAoZXZbMF0sIGV2WzFdICsgKCIgJXMgJXMiICUgKGZ1bmMsIGFyZykpKSkKCgpkZWYgdXBkYXRlX2Rpc3RfY2FjaGVzKGRpc3RfcGF0aCwgZml4X3ppcGltcG9ydGVyX2NhY2hlcyk6CiAgICAiIiIKICAgIEZpeCBhbnkgZ2xvYmFsbHkgY2FjaGVkIGBkaXN0X3BhdGhgIHJlbGF0ZWQgZGF0YQoKICAgIGBkaXN0X3BhdGhgIHNob3VsZCBiZSBhIHBhdGggb2YgYSBuZXdseSBpbnN0YWxsZWQgZWdnIGRpc3RyaWJ1dGlvbiAoemlwcGVkCiAgICBvciB1bnppcHBlZCkuCgogICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUgY29udGFpbnMgZmluZGVyIG9iamVjdHMgdGhhdCBoYXZlIGJlZW4gY2FjaGVkIHdoZW4KICAgIGltcG9ydGluZyBkYXRhIGZyb20gdGhlIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbi4gQW55IHN1Y2ggZmluZGVycyBuZWVkIHRvIGJlCiAgICBjbGVhcmVkIHNpbmNlIHRoZSByZXBsYWNlbWVudCBkaXN0cmlidXRpb24gbWlnaHQgYmUgcGFja2FnZWQgZGlmZmVyZW50bHksCiAgICBlLmcuIGEgemlwcGVkIGVnZyBkaXN0cmlidXRpb24gbWlnaHQgZ2V0IHJlcGxhY2VkIHdpdGggYW4gdW56aXBwZWQgZWdnCiAgICBmb2xkZXIgb3IgdmljZSB2ZXJzYS4gSGF2aW5nIHRoZSBvbGQgZmluZGVycyBjYWNoZWQgbWF5IHRoZW4gY2F1c2UgUHl0aG9uCiAgICB0byBhdHRlbXB0IGxvYWRpbmcgbW9kdWxlcyBmcm9tIHRoZSByZXBsYWNlbWVudCBkaXN0cmlidXRpb24gdXNpbmcgYW4KICAgIGluY29ycmVjdCBsb2FkZXIuCgogICAgemlwaW1wb3J0LnppcGltcG9ydGVyIG9iamVjdHMgYXJlIFB5dGhvbiBsb2FkZXJzIGNoYXJnZWQgd2l0aCBpbXBvcnRpbmcKICAgIGRhdGEgcGFja2FnZWQgaW5zaWRlIHppcCBhcmNoaXZlcy4gSWYgc3RhbGUgbG9hZGVycyByZWZlcmVuY2luZyB0aGUKICAgIG9yaWdpbmFsIGRpc3RyaWJ1dGlvbiwgYXJlIGxlZnQgYmVoaW5kLCB0aGV5IGNhbiBmYWlsIHRvIGxvYWQgbW9kdWxlcyBmcm9tCiAgICB0aGUgcmVwbGFjZW1lbnQgZGlzdHJpYnV0aW9uLiBFLmcuIGlmIGFuIG9sZCB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgaW5zdGFuY2UKICAgIGlzIHVzZWQgdG8gbG9hZCBkYXRhIGZyb20gYSBuZXcgemlwcGVkIGVnZyBhcmNoaXZlLCBpdCBtYXkgY2F1c2UgdGhlCiAgICBvcGVyYXRpb24gdG8gYXR0ZW1wdCB0byBsb2NhdGUgdGhlIHJlcXVlc3RlZCBkYXRhIGluIHRoZSB3cm9uZyBsb2NhdGlvbiAtCiAgICBvbmUgaW5kaWNhdGVkIGJ5IHRoZSBvcmlnaW5hbCBkaXN0cmlidXRpb24ncyB6aXAgYXJjaGl2ZSBkaXJlY3RvcnkKICAgIGluZm9ybWF0aW9uLiBTdWNoIGFuIG9wZXJhdGlvbiBtYXkgdGhlbiBmYWlsIG91dHJpZ2h0LCBlLmcuIHJlcG9ydCBoYXZpbmcKICAgIHJlYWQgYSAnYmFkIGxvY2FsIGZpbGUgaGVhZGVyJywgb3IgZXZlbiB3b3JzZSwgaXQgbWF5IGZhaWwgc2lsZW50bHkgJgogICAgcmV0dXJuIGludmFsaWQgZGF0YS4KCiAgICB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUgY29udGFpbnMgY2FjaGVkIHppcCBhcmNoaXZlIGRpcmVjdG9yeQogICAgaW5mb3JtYXRpb24gZm9yIGFsbCBleGlzdGluZyB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgaW5zdGFuY2VzIGFuZCBhbGwgc3VjaAogICAgaW5zdGFuY2VzIGNvbm5lY3RlZCB0byB0aGUgc2FtZSBhcmNoaXZlIHNoYXJlIHRoZSBzYW1lIGNhY2hlZCBkaXJlY3RvcnkKICAgIGluZm9ybWF0aW9uLgoKICAgIElmIGFza2VkLCBhbmQgdGhlIHVuZGVybHlpbmcgUHl0aG9uIGltcGxlbWVudGF0aW9uIGFsbG93cyBpdCwgd2UgY2FuIGZpeAogICAgYWxsIGV4aXN0aW5nIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZXMgaW5zdGVhZCBvZiBoYXZpbmcgdG8gdHJhY2sKICAgIHRoZW0gZG93biBhbmQgcmVtb3ZlIHRoZW0gb25lIGJ5IG9uZSwgYnkgdXBkYXRpbmcgdGhlaXIgc2hhcmVkIGNhY2hlZCB6aXAKICAgIGFyY2hpdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uLiBUaGlzLCBvZiBjb3Vyc2UsIGFzc3VtZXMgdGhhdCB0aGUKICAgIHJlcGxhY2VtZW50IGRpc3RyaWJ1dGlvbiBpcyBwYWNrYWdlZCBhcyBhIHppcHBlZCBlZ2cuCgogICAgSWYgbm90IGFza2VkIHRvIGZpeCBleGlzdGluZyB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgaW5zdGFuY2VzLCB3ZSBzdGlsbCBkbwogICAgb3VyIGJlc3QgdG8gY2xlYXIgYW55IHJlbWFpbmluZyB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgcmVsYXRlZCBjYWNoZWQgZGF0YQogICAgdGhhdCBtaWdodCBzb21laG93IGxhdGVyIGdldCB1c2VkIHdoZW4gYXR0ZW1wdGluZyB0byBsb2FkIGRhdGEgZnJvbSB0aGUgbmV3CiAgICBkaXN0cmlidXRpb24gYW5kIHRodXMgY2F1c2Ugc3VjaCBsb2FkIG9wZXJhdGlvbnMgdG8gZmFpbC4gTm90ZSB0aGF0IHdoZW4KICAgIHRyYWNraW5nIGRvd24gc3VjaCByZW1haW5pbmcgc3RhbGUgZGF0YSwgd2UgY2FuIG5vdCBjYXRjaCBldmVyeSBjb25jZWl2YWJsZQogICAgdXNhZ2UgZnJvbSBoZXJlLCBhbmQgd2UgY2xlYXIgb25seSB0aG9zZSB0aGF0IHdlIGtub3cgb2YgYW5kIGhhdmUgZm91bmQgdG8KICAgIGNhdXNlIHByb2JsZW1zIGlmIGxlZnQgYWxpdmUuIEFueSByZW1haW5pbmcgY2FjaGVzIHNob3VsZCBiZSB1cGRhdGVkIGJ5CiAgICB3aG9tZXZlciBpcyBpbiBjaGFyZ2Ugb2YgbWFpbnRhaW5pbmcgdGhlbSwgaS5lLiB0aGV5IHNob3VsZCBiZSByZWFkeSB0bwogICAgaGFuZGxlIHVzIHJlcGxhY2luZyB0aGVpciB6aXAgYXJjaGl2ZXMgd2l0aCBuZXcgZGlzdHJpYnV0aW9ucyBhdCBydW50aW1lLgoKICAgICIiIgogICAgIyBUaGVyZSBhcmUgc2V2ZXJhbCBvdGhlciBrbm93biBzb3VyY2VzIG9mIHN0YWxlIHppcGltcG9ydC56aXBpbXBvcnRlcgogICAgIyBpbnN0YW5jZXMgdGhhdCB3ZSBkbyBub3QgY2xlYXIgaGVyZSwgYnV0IG1pZ2h0IGlmIGV2ZXIgZ2l2ZW4gYSByZWFzb24gdG8KICAgICMgZG8gc286CiAgICAjICogR2xvYmFsIHNldHVwdG9vbHMgcGtnX3Jlc291cmNlcy53b3JraW5nX3NldCAoYS5rLmEuICdtYXN0ZXIgd29ya2luZwogICAgIyBzZXQnKSBtYXkgY29udGFpbiBkaXN0cmlidXRpb25zIHdoaWNoIG1heSBpbiB0dXJuIGNvbnRhaW4gdGhlaXIKICAgICMgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgbG9hZGVycy4KICAgICMgKiBTZXZlcmFsIHppcGltcG9ydC56aXBpbXBvcnRlciBsb2FkZXJzIGhlbGQgYnkgbG9jYWwgdmFyaWFibGVzIGZ1cnRoZXIKICAgICMgICB1cCB0aGUgZnVuY3Rpb24gY2FsbCBzdGFjayB3aGVuIHJ1bm5pbmcgdGhlIHNldHVwdG9vbHMgaW5zdGFsbGF0aW9uLgogICAgIyAqIEFscmVhZHkgbG9hZGVkIG1vZHVsZXMgbWF5IGhhdmUgdGhlaXIgX19sb2FkZXJfXyBhdHRyaWJ1dGUgc2V0IHRvIHRoZQogICAgIyAgIGV4YWN0IGxvYWRlciBpbnN0YW5jZSB1c2VkIHdoZW4gaW1wb3J0aW5nIHRoZW0uIFB5dGhvbiAzLjQgZG9jcyBzdGF0ZQogICAgIyAgIHRoYXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBpbnRlbmRlZCBtb3N0bHkgZm9yIGludHJvc3BlY3Rpb24gYW5kIHNvIGlzCiAgICAjICAgbm90IGV4cGVjdGVkIHRvIGNhdXNlIHVzIHByb2JsZW1zLgogICAgbm9ybWFsaXplZF9wYXRoID0gbm9ybWFsaXplX3BhdGgoZGlzdF9wYXRoKQogICAgX3VuY2FjaGUobm9ybWFsaXplZF9wYXRoLCBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZSkKICAgIGlmIGZpeF96aXBpbXBvcnRlcl9jYWNoZXM6CiAgICAgICAgX3JlcGxhY2VfemlwX2RpcmVjdG9yeV9jYWNoZV9kYXRhKG5vcm1hbGl6ZWRfcGF0aCkKICAgIGVsc2U6CiAgICAgICAgIyBIZXJlLCBldmVuIHRob3VnaCB3ZSBkbyBub3Qgd2FudCB0byBmaXggZXhpc3RpbmcgYW5kIG5vdyBzdGFsZQogICAgICAgICMgemlwaW1wb3J0ZXIgY2FjaGUgaW5mb3JtYXRpb24sIHdlIHN0aWxsIHdhbnQgdG8gcmVtb3ZlIGl0LiBSZWxhdGVkIHRvCiAgICAgICAgIyBQeXRob24ncyB6aXAgYXJjaGl2ZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24gY2FjaGUsIHdlIGNsZWFyIGVhY2ggb2YKICAgICAgICAjIGl0cyBzdGFsZSBlbnRyaWVzIGluIHR3byBwaGFzZXM6CiAgICAgICAgIyAgIDEuIENsZWFyIHRoZSBlbnRyeSBzbyBhdHRlbXB0aW5nIHRvIGFjY2VzcyB6aXAgYXJjaGl2ZSBpbmZvcm1hdGlvbgogICAgICAgICMgICAgICB2aWEgYW55IGV4aXN0aW5nIHN0YWxlIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZXMgZmFpbHMuCiAgICAgICAgIyAgIDIuIFJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgY2FjaGUgc28gYW55IG5ld2x5IGNvbnN0cnVjdGVkCiAgICAgICAgIyAgICAgIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZXMgZG8gbm90IGVuZCB1cCB1c2luZyBvbGQgc3RhbGUKICAgICAgICAjICAgICAgemlwIGFyY2hpdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uLgogICAgICAgICMgVGhpcyB3aG9sZSBzdGFsZSBkYXRhIHJlbW92YWwgc3RlcCBkb2VzIG5vdCBzZWVtIHN0cmljdGx5IG5lY2Vzc2FyeSwKICAgICAgICAjIGJ1dCBoYXMgYmVlbiBsZWZ0IGluIGJlY2F1c2UgaXQgd2FzIGRvbmUgYmVmb3JlIHdlIHN0YXJ0ZWQgcmVwbGFjaW5nCiAgICAgICAgIyB0aGUgemlwIGFyY2hpdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGNhY2hlIGNvbnRlbnQgaWYgcG9zc2libGUsIGFuZAogICAgICAgICMgdGhlcmUgYXJlIG5vIHJlbGV2YW50IHVuaXQgdGVzdHMgdGhhdCB3ZSBjYW4gZGVwZW5kIG9uIHRvIHRlbGwgdXMgaWYKICAgICAgICAjIHRoaXMgaXMgcmVhbGx5IG5lZWRlZC4KICAgICAgICBfcmVtb3ZlX2FuZF9jbGVhcl96aXBfZGlyZWN0b3J5X2NhY2hlX2RhdGEobm9ybWFsaXplZF9wYXRoKQoKCmRlZiBfY29sbGVjdF96aXBpbXBvcnRlcl9jYWNoZV9lbnRyaWVzKG5vcm1hbGl6ZWRfcGF0aCwgY2FjaGUpOgogICAgIiIiCiAgICBSZXR1cm4gemlwaW1wb3J0ZXIgY2FjaGUgZW50cnkga2V5cyByZWxhdGVkIHRvIGEgZ2l2ZW4gbm9ybWFsaXplZCBwYXRoLgoKICAgIEFsdGVybmF0aXZlIHBhdGggc3BlbGxpbmdzIChlLmcuIHRob3NlIHVzaW5nIGRpZmZlcmVudCBjaGFyYWN0ZXIgY2FzZSBvcgogICAgdGhvc2UgdXNpbmcgYWx0ZXJuYXRpdmUgcGF0aCBzZXBhcmF0b3JzKSByZWxhdGVkIHRvIHRoZSBzYW1lIHBhdGggYXJlCiAgICBpbmNsdWRlZC4gQW55IHN1Yi1wYXRoIGVudHJpZXMgYXJlIGluY2x1ZGVkIGFzIHdlbGwsIGkuZS4gdGhvc2UKICAgIGNvcnJlc3BvbmRpbmcgdG8gemlwIGFyY2hpdmVzIGVtYmVkZGVkIGluIG90aGVyIHppcCBhcmNoaXZlcy4KCiAgICAiIiIKICAgIHJlc3VsdCA9IFtdCiAgICBwcmVmaXhfbGVuID0gbGVuKG5vcm1hbGl6ZWRfcGF0aCkKICAgIGZvciBwIGluIGNhY2hlOgogICAgICAgIG5wID0gbm9ybWFsaXplX3BhdGgocCkKICAgICAgICBpZiAobnAuc3RhcnRzd2l0aChub3JtYWxpemVkX3BhdGgpIGFuZAogICAgICAgICAgICAgICAgbnBbcHJlZml4X2xlbjpwcmVmaXhfbGVuICsgMV0gaW4gKG9zLnNlcCwgJycpKToKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwKQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBfdXBkYXRlX3ppcGltcG9ydGVyX2NhY2hlKG5vcm1hbGl6ZWRfcGF0aCwgY2FjaGUsIHVwZGF0ZXI9Tm9uZSk6CiAgICAiIiIKICAgIFVwZGF0ZSB6aXBpbXBvcnRlciBjYWNoZSBkYXRhIGZvciBhIGdpdmVuIG5vcm1hbGl6ZWQgcGF0aC4KCiAgICBBbnkgc3ViLXBhdGggZW50cmllcyBhcmUgcHJvY2Vzc2VkIGFzIHdlbGwsIGkuZS4gdGhvc2UgY29ycmVzcG9uZGluZyB0byB6aXAKICAgIGFyY2hpdmVzIGVtYmVkZGVkIGluIG90aGVyIHppcCBhcmNoaXZlcy4KCiAgICBHaXZlbiB1cGRhdGVyIGlzIGEgY2FsbGFibGUgdGFraW5nIGEgY2FjaGUgZW50cnkga2V5IGFuZCB0aGUgb3JpZ2luYWwgZW50cnkKICAgIChhZnRlciBhbHJlYWR5IHJlbW92aW5nIHRoZSBlbnRyeSBmcm9tIHRoZSBjYWNoZSksIGFuZCBleHBlY3RlZCB0byB1cGRhdGUKICAgIHRoZSBlbnRyeSBhbmQgcG9zc2libHkgcmV0dXJuIGEgbmV3IG9uZSB0byBiZSBpbnNlcnRlZCBpbiBpdHMgcGxhY2UuCiAgICBSZXR1cm5pbmcgTm9uZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50cnkgc2hvdWxkIG5vdCBiZSByZXBsYWNlZCB3aXRoIGEgbmV3CiAgICBvbmUuIElmIG5vIHVwZGF0ZXIgaXMgZ2l2ZW4sIHRoZSBjYWNoZSBlbnRyaWVzIGFyZSBzaW1wbHkgcmVtb3ZlZCB3aXRob3V0CiAgICBhbnkgYWRkaXRpb25hbCBwcm9jZXNzaW5nLCB0aGUgc2FtZSBhcyBpZiB0aGUgdXBkYXRlciBzaW1wbHkgcmV0dXJuZWQgTm9uZS4KCiAgICAiIiIKICAgIGZvciBwIGluIF9jb2xsZWN0X3ppcGltcG9ydGVyX2NhY2hlX2VudHJpZXMobm9ybWFsaXplZF9wYXRoLCBjYWNoZSk6CiAgICAgICAgIyBOLkIuIHB5cHkncyBjdXN0b20gemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlIGltcGxlbWVudGF0aW9uIGRvZXMKICAgICAgICAjIG5vdCBzdXBwb3J0IHRoZSBjb21wbGV0ZSBkaWN0IGludGVyZmFjZToKICAgICAgICAjICogRG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQsIHRodXMgbm90IGFsbG93aW5nIHRoaXMgZnVuY3Rpb24KICAgICAgICAjICAgIHRvIGJlIHVzZWQgb25seSBmb3IgcmVtb3ZpbmcgZXhpc3RpbmcgY2FjaGUgZW50cmllcy4KICAgICAgICAjICAqIERvZXMgbm90IHN1cHBvcnQgdGhlIGRpY3QucG9wKCkgbWV0aG9kLCBmb3JjaW5nIHVzIHRvIHVzZSB0aGUKICAgICAgICAjICAgIGdldC9kZWwgcGF0dGVybnMgaW5zdGVhZC4gRm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gc2VlIHRoZQogICAgICAgICMgICAgZm9sbG93aW5nIGxpbmtzOgogICAgICAgICMgICAgICBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL2lzc3Vlcy8yMDIjaXNzdWVjb21tZW50LTIwMjkxMzQyMAogICAgICAgICMgICAgICBodHRwOi8vYml0Lmx5LzJoOWl0SlgKICAgICAgICBvbGRfZW50cnkgPSBjYWNoZVtwXQogICAgICAgIGRlbCBjYWNoZVtwXQogICAgICAgIG5ld19lbnRyeSA9IHVwZGF0ZXIgYW5kIHVwZGF0ZXIocCwgb2xkX2VudHJ5KQogICAgICAgIGlmIG5ld19lbnRyeSBpcyBub3QgTm9uZToKICAgICAgICAgICAgY2FjaGVbcF0gPSBuZXdfZW50cnkKCgpkZWYgX3VuY2FjaGUobm9ybWFsaXplZF9wYXRoLCBjYWNoZSk6CiAgICBfdXBkYXRlX3ppcGltcG9ydGVyX2NhY2hlKG5vcm1hbGl6ZWRfcGF0aCwgY2FjaGUpCgoKZGVmIF9yZW1vdmVfYW5kX2NsZWFyX3ppcF9kaXJlY3RvcnlfY2FjaGVfZGF0YShub3JtYWxpemVkX3BhdGgpOgogICAgZGVmIGNsZWFyX2FuZF9yZW1vdmVfY2FjaGVkX3ppcF9hcmNoaXZlX2RpcmVjdG9yeV9kYXRhKHBhdGgsIG9sZF9lbnRyeSk6CiAgICAgICAgb2xkX2VudHJ5LmNsZWFyKCkKCiAgICBfdXBkYXRlX3ppcGltcG9ydGVyX2NhY2hlKAogICAgICAgIG5vcm1hbGl6ZWRfcGF0aCwgemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlLAogICAgICAgIHVwZGF0ZXI9Y2xlYXJfYW5kX3JlbW92ZV9jYWNoZWRfemlwX2FyY2hpdmVfZGlyZWN0b3J5X2RhdGEpCgoKIyBQeVB5IFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBhbGxvdyBkaXJlY3RseSB3cml0aW5nIHRvIHRoZQojIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZSBhbmQgc28gcHJldmVudHMgdXMgZnJvbSBhdHRlbXB0aW5nIHRvIGNvcnJlY3QKIyBpdHMgY29udGVudC4gVGhlIGJlc3Qgd2UgY2FuIGRvIHRoZXJlIGlzIGNsZWFyIHRoZSBwcm9ibGVtYXRpYyBjYWNoZSBjb250ZW50CiMgYW5kIGhhdmUgUHlQeSByZXBvcHVsYXRlIGl0IGFzIG5lZWRlZC4gVGhlIGRvd25zaWRlIGlzIHRoYXQgaWYgdGhlcmUgYXJlIGFueQojIHN0YWxlIHppcGltcG9ydC56aXBpbXBvcnRlciBpbnN0YW5jZXMgbGF5aW5nIGFyb3VuZCwgYXR0ZW1wdGluZyB0byB1c2UgdGhlbQojIHdpbGwgZmFpbCBkdWUgdG8gbm90IGhhdmluZyBpdHMgemlwIGFyY2hpdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGF2YWlsYWJsZQojIGluc3RlYWQgb2YgYmVpbmcgYXV0b21hdGljYWxseSBjb3JyZWN0ZWQgdG8gdXNlIHRoZSBuZXcgY29ycmVjdCB6aXAgYXJjaGl2ZQojIGRpcmVjdG9yeSBpbmZvcm1hdGlvbi4KaWYgJ19fcHlweV9fJyBpbiBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXM6CiAgICBfcmVwbGFjZV96aXBfZGlyZWN0b3J5X2NhY2hlX2RhdGEgPSBcCiAgICAgICAgX3JlbW92ZV9hbmRfY2xlYXJfemlwX2RpcmVjdG9yeV9jYWNoZV9kYXRhCmVsc2U6CgogICAgZGVmIF9yZXBsYWNlX3ppcF9kaXJlY3RvcnlfY2FjaGVfZGF0YShub3JtYWxpemVkX3BhdGgpOgogICAgICAgIGRlZiByZXBsYWNlX2NhY2hlZF96aXBfYXJjaGl2ZV9kaXJlY3RvcnlfZGF0YShwYXRoLCBvbGRfZW50cnkpOgogICAgICAgICAgICAjIE4uQi4gSW4gdGhlb3J5LCB3ZSBjb3VsZCBsb2FkIHRoZSB6aXAgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGp1c3QKICAgICAgICAgICAgIyBvbmNlIGZvciBhbGwgdXBkYXRlZCBwYXRoIHNwZWxsaW5ncywgYW5kIHRoZW4gY29weSBpdCBsb2NhbGx5IGFuZAogICAgICAgICAgICAjIHVwZGF0ZSBpdHMgY29udGFpbmVkIHBhdGggc3RyaW5ncyB0byBjb250YWluIHRoZSBjb3JyZWN0CiAgICAgICAgICAgICMgc3BlbGxpbmcsIGJ1dCB0aGF0IHNlZW1zIGxpa2UgYSB3YXkgdG9vIGludmFzaXZlIG1vdmUgKHRoaXMgY2FjaGUKICAgICAgICAgICAgIyBzdHJ1Y3R1cmUgaXMgbm90IG9mZmljaWFsbHkgZG9jdW1lbnRlZCBhbnl3aGVyZSBhbmQgY291bGQgaW4KICAgICAgICAgICAgIyB0aGVvcnkgY2hhbmdlIHdpdGggbmV3IFB5dGhvbiByZWxlYXNlcykgZm9yIG5vIHNpZ25pZmljYW50CiAgICAgICAgICAgICMgYmVuZWZpdC4KICAgICAgICAgICAgb2xkX2VudHJ5LmNsZWFyKCkKICAgICAgICAgICAgemlwaW1wb3J0LnppcGltcG9ydGVyKHBhdGgpCiAgICAgICAgICAgIG9sZF9lbnRyeS51cGRhdGUoemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlW3BhdGhdKQogICAgICAgICAgICByZXR1cm4gb2xkX2VudHJ5CgogICAgICAgIF91cGRhdGVfemlwaW1wb3J0ZXJfY2FjaGUoCiAgICAgICAgICAgIG5vcm1hbGl6ZWRfcGF0aCwgemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlLAogICAgICAgICAgICB1cGRhdGVyPXJlcGxhY2VfY2FjaGVkX3ppcF9hcmNoaXZlX2RpcmVjdG9yeV9kYXRhKQoKCmRlZiBpc19weXRob24odGV4dCwgZmlsZW5hbWU9JzxzdHJpbmc+Jyk6CiAgICAiSXMgdGhpcyBzdHJpbmcgYSB2YWxpZCBQeXRob24gc2NyaXB0PyIKICAgIHRyeToKICAgICAgICBjb21waWxlKHRleHQsIGZpbGVuYW1lLCAnZXhlYycpCiAgICBleGNlcHQgKFN5bnRheEVycm9yLCBUeXBlRXJyb3IpOgogICAgICAgIHJldHVybiBGYWxzZQogICAgZWxzZToKICAgICAgICByZXR1cm4gVHJ1ZQoKCmRlZiBpc19zaChleGVjdXRhYmxlKToKICAgICIiIkRldGVybWluZSBpZiB0aGUgc3BlY2lmaWVkIGV4ZWN1dGFibGUgaXMgYSAuc2ggKGNvbnRhaW5zIGEgIyEgbGluZSkiIiIKICAgIHRyeToKICAgICAgICB3aXRoIGlvLm9wZW4oZXhlY3V0YWJsZSwgZW5jb2Rpbmc9J2xhdGluLTEnKSBhcyBmcDoKICAgICAgICAgICAgbWFnaWMgPSBmcC5yZWFkKDIpCiAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgIHJldHVybiBleGVjdXRhYmxlCiAgICByZXR1cm4gbWFnaWMgPT0gJyMhJwoKCmRlZiBudF9xdW90ZV9hcmcoYXJnKToKICAgICIiIlF1b3RlIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50IGFjY29yZGluZyB0byBXaW5kb3dzIHBhcnNpbmcgcnVsZXMiIiIKICAgIHJldHVybiBzdWJwcm9jZXNzLmxpc3QyY21kbGluZShbYXJnXSkKCgpkZWYgaXNfcHl0aG9uX3NjcmlwdChzY3JpcHRfdGV4dCwgZmlsZW5hbWUpOgogICAgIiIiSXMgdGhpcyB0ZXh0LCBhcyBhIHdob2xlLCBhIFB5dGhvbiBzY3JpcHQ/IChhcyBvcHBvc2VkIHRvIHNoZWxsL2JhdC9ldGMuCiAgICAiIiIKICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcucHknKSBvciBmaWxlbmFtZS5lbmRzd2l0aCgnLnB5dycpOgogICAgICAgIHJldHVybiBUcnVlICAjIGV4dGVuc2lvbiBzYXlzIGl0J3MgUHl0aG9uCiAgICBpZiBpc19weXRob24oc2NyaXB0X3RleHQsIGZpbGVuYW1lKToKICAgICAgICByZXR1cm4gVHJ1ZSAgIyBpdCdzIHN5bnRhY3RpY2FsbHkgdmFsaWQgUHl0aG9uCiAgICBpZiBzY3JpcHRfdGV4dC5zdGFydHN3aXRoKCcjIScpOgogICAgICAgICMgSXQgYmVnaW5zIHdpdGggYSAnIyEnIGxpbmUsIHNvIGNoZWNrIGlmICdweXRob24nIGlzIGluIGl0IHNvbWV3aGVyZQogICAgICAgIHJldHVybiAncHl0aG9uJyBpbiBzY3JpcHRfdGV4dC5zcGxpdGxpbmVzKClbMF0ubG93ZXIoKQoKICAgIHJldHVybiBGYWxzZSAgIyBOb3QgYW55IFB5dGhvbiBJIGNhbiByZWNvZ25pemUKCgp0cnk6CiAgICBmcm9tIG9zIGltcG9ydCBjaG1vZCBhcyBfY2htb2QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgIyBKeXRob24gY29tcGF0aWJpbGl0eQogICAgZGVmIF9jaG1vZCgqYXJncyk6CiAgICAgICAgcGFzcwoKCmRlZiBjaG1vZChwYXRoLCBtb2RlKToKICAgIGxvZy5kZWJ1ZygiY2hhbmdpbmcgbW9kZSBvZiAlcyB0byAlbyIsIHBhdGgsIG1vZGUpCiAgICB0cnk6CiAgICAgICAgX2NobW9kKHBhdGgsIG1vZGUpCiAgICBleGNlcHQgb3MuZXJyb3IgYXMgZToKICAgICAgICBsb2cuZGVidWcoImNobW9kIGZhaWxlZDogJXMiLCBlKQoKCmNsYXNzIENvbW1hbmRTcGVjKGxpc3QpOgogICAgIiIiCiAgICBBIGNvbW1hbmQgc3BlYyBmb3IgYSAjISBoZWFkZXIsIHNwZWNpZmllZCBhcyBhIGxpc3Qgb2YgYXJndW1lbnRzIGFraW4gdG8KICAgIHRob3NlIHBhc3NlZCB0byBQb3Blbi4KICAgICIiIgoKICAgIG9wdGlvbnMgPSBbXQogICAgc3BsaXRfYXJncyA9IGRpY3QoKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGJlc3QoY2xzKToKICAgICAgICAiIiIKICAgICAgICBDaG9vc2UgdGhlIGJlc3QgQ29tbWFuZFNwZWMgY2xhc3MgYmFzZWQgb24gZW52aXJvbm1lbnRhbCBjb25kaXRpb25zLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBjbHMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfc3lzX2V4ZWN1dGFibGUoY2xzKToKICAgICAgICBfZGVmYXVsdCA9IG9zLnBhdGgubm9ybXBhdGgoc3lzLmV4ZWN1dGFibGUpCiAgICAgICAgcmV0dXJuIG9zLmVudmlyb24uZ2V0KCdfX1BZVkVOVl9MQVVOQ0hFUl9fJywgX2RlZmF1bHQpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9wYXJhbShjbHMsIHBhcmFtKToKICAgICAgICAiIiIKICAgICAgICBDb25zdHJ1Y3QgYSBDb21tYW5kU3BlYyBmcm9tIGEgcGFyYW1ldGVyIHRvIGJ1aWxkX3NjcmlwdHMsIHdoaWNoIG1heQogICAgICAgIGJlIE5vbmUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJhbSwgY2xzKToKICAgICAgICAgICAgcmV0dXJuIHBhcmFtCiAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJhbSwgbGlzdCk6CiAgICAgICAgICAgIHJldHVybiBjbHMocGFyYW0pCiAgICAgICAgaWYgcGFyYW0gaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGNscy5mcm9tX2Vudmlyb25tZW50KCkKICAgICAgICAjIG90aGVyd2lzZSwgYXNzdW1lIGl0J3MgYSBzdHJpbmcuCiAgICAgICAgcmV0dXJuIGNscy5mcm9tX3N0cmluZyhwYXJhbSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2Vudmlyb25tZW50KGNscyk6CiAgICAgICAgcmV0dXJuIGNscyhbY2xzLl9zeXNfZXhlY3V0YWJsZSgpXSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX3N0cmluZyhjbHMsIHN0cmluZyk6CiAgICAgICAgIiIiCiAgICAgICAgQ29uc3RydWN0IGEgY29tbWFuZCBzcGVjIGZyb20gYSBzaW1wbGUgc3RyaW5nIHJlcHJlc2VudGluZyBhIGNvbW1hbmQKICAgICAgICBsaW5lIHBhcnNlYWJsZSBieSBzaGxleC5zcGxpdC4KICAgICAgICAiIiIKICAgICAgICBpdGVtcyA9IHNobGV4LnNwbGl0KHN0cmluZywgKipjbHMuc3BsaXRfYXJncykKICAgICAgICByZXR1cm4gY2xzKGl0ZW1zKQoKICAgIGRlZiBpbnN0YWxsX29wdGlvbnMoc2VsZiwgc2NyaXB0X3RleHQpOgogICAgICAgIHNlbGYub3B0aW9ucyA9IHNobGV4LnNwbGl0KHNlbGYuX2V4dHJhY3Rfb3B0aW9ucyhzY3JpcHRfdGV4dCkpCiAgICAgICAgY21kbGluZSA9IHN1YnByb2Nlc3MubGlzdDJjbWRsaW5lKHNlbGYpCiAgICAgICAgaWYgbm90IGlzYXNjaWkoY21kbGluZSk6CiAgICAgICAgICAgIHNlbGYub3B0aW9uc1s6MF0gPSBbJy14J10KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2V4dHJhY3Rfb3B0aW9ucyhvcmlnX3NjcmlwdCk6CiAgICAgICAgIiIiCiAgICAgICAgRXh0cmFjdCBhbnkgb3B0aW9ucyBmcm9tIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBzY3JpcHQuCiAgICAgICAgIiIiCiAgICAgICAgZmlyc3QgPSAob3JpZ19zY3JpcHQgKyAnXG4nKS5zcGxpdGxpbmVzKClbMF0KICAgICAgICBtYXRjaCA9IF9maXJzdF9saW5lX3JlKCkubWF0Y2goZmlyc3QpCiAgICAgICAgb3B0aW9ucyA9IG1hdGNoLmdyb3VwKDEpIG9yICcnIGlmIG1hdGNoIGVsc2UgJycKICAgICAgICByZXR1cm4gb3B0aW9ucy5zdHJpcCgpCgogICAgZGVmIGFzX2hlYWRlcihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fcmVuZGVyKHNlbGYgKyBsaXN0KHNlbGYub3B0aW9ucykpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9zdHJpcF9xdW90ZXMoaXRlbSk6CiAgICAgICAgX1FVT1RFUyA9ICciXCcnCiAgICAgICAgZm9yIHEgaW4gX1FVT1RFUzoKICAgICAgICAgICAgaWYgaXRlbS5zdGFydHN3aXRoKHEpIGFuZCBpdGVtLmVuZHN3aXRoKHEpOgogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1bMTotMV0KICAgICAgICByZXR1cm4gaXRlbQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfcmVuZGVyKGl0ZW1zKToKICAgICAgICBjbWRsaW5lID0gc3VicHJvY2Vzcy5saXN0MmNtZGxpbmUoCiAgICAgICAgICAgIENvbW1hbmRTcGVjLl9zdHJpcF9xdW90ZXMoaXRlbS5zdHJpcCgpKSBmb3IgaXRlbSBpbiBpdGVtcykKICAgICAgICByZXR1cm4gJyMhJyArIGNtZGxpbmUgKyAnXG4nCgoKIyBGb3IgcGJyIGNvbXBhdDsgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uCnN5c19leGVjdXRhYmxlID0gQ29tbWFuZFNwZWMuX3N5c19leGVjdXRhYmxlKCkKCgpjbGFzcyBXaW5kb3dzQ29tbWFuZFNwZWMoQ29tbWFuZFNwZWMpOgogICAgc3BsaXRfYXJncyA9IGRpY3QocG9zaXg9RmFsc2UpCgoKY2xhc3MgU2NyaXB0V3JpdGVyKG9iamVjdCk6CiAgICAiIiIKICAgIEVuY2Fwc3VsYXRlcyBiZWhhdmlvciBhcm91bmQgd3JpdGluZyBlbnRyeSBwb2ludCBzY3JpcHRzIGZvciBjb25zb2xlIGFuZAogICAgZ3VpIGFwcHMuCiAgICAiIiIKCiAgICB0ZW1wbGF0ZSA9IHRleHR3cmFwLmRlZGVudChyIiIiCiAgICAgICAgIyBFQVNZLUlOU1RBTEwtRU5UUlktU0NSSVBUOiAlKHNwZWMpciwlKGdyb3VwKXIsJShuYW1lKXIKICAgICAgICBfX3JlcXVpcmVzX18gPSAlKHNwZWMpcgogICAgICAgIGltcG9ydCByZQogICAgICAgIGltcG9ydCBzeXMKICAgICAgICBmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IGxvYWRfZW50cnlfcG9pbnQKCiAgICAgICAgaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICAgICAgICAgc3lzLmFyZ3ZbMF0gPSByZS5zdWIocicoLXNjcmlwdFwucHl3P3xcLmV4ZSk/JCcsICcnLCBzeXMuYXJndlswXSkKICAgICAgICAgICAgc3lzLmV4aXQoCiAgICAgICAgICAgICAgICBsb2FkX2VudHJ5X3BvaW50KCUoc3BlYylyLCAlKGdyb3VwKXIsICUobmFtZSlyKSgpCiAgICAgICAgICAgICkKICAgICIiIikubHN0cmlwKCkKCiAgICBjb21tYW5kX3NwZWNfY2xhc3MgPSBDb21tYW5kU3BlYwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGdldF9zY3JpcHRfYXJncyhjbHMsIGRpc3QsIGV4ZWN1dGFibGU9Tm9uZSwgd2luaW5zdD1GYWxzZSk6CiAgICAgICAgIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgICAgIHdhcm5pbmdzLndhcm4oIlVzZSBnZXRfYXJncyIsIERlcHJlY2F0aW9uV2FybmluZykKICAgICAgICB3cml0ZXIgPSAoV2luZG93c1NjcmlwdFdyaXRlciBpZiB3aW5pbnN0IGVsc2UgU2NyaXB0V3JpdGVyKS5iZXN0KCkKICAgICAgICBoZWFkZXIgPSBjbHMuZ2V0X3NjcmlwdF9oZWFkZXIoIiIsIGV4ZWN1dGFibGUsIHdpbmluc3QpCiAgICAgICAgcmV0dXJuIHdyaXRlci5nZXRfYXJncyhkaXN0LCBoZWFkZXIpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X3NjcmlwdF9oZWFkZXIoY2xzLCBzY3JpcHRfdGV4dCwgZXhlY3V0YWJsZT1Ob25lLCB3aW5pbnN0PUZhbHNlKToKICAgICAgICAjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICAgICAgd2FybmluZ3Mud2FybigiVXNlIGdldF9oZWFkZXIiLCBEZXByZWNhdGlvbldhcm5pbmcpCiAgICAgICAgaWYgd2luaW5zdDoKICAgICAgICAgICAgZXhlY3V0YWJsZSA9ICJweXRob24uZXhlIgogICAgICAgIGNtZCA9IGNscy5jb21tYW5kX3NwZWNfY2xhc3MuYmVzdCgpLmZyb21fcGFyYW0oZXhlY3V0YWJsZSkKICAgICAgICBjbWQuaW5zdGFsbF9vcHRpb25zKHNjcmlwdF90ZXh0KQogICAgICAgIHJldHVybiBjbWQuYXNfaGVhZGVyKCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfYXJncyhjbHMsIGRpc3QsIGhlYWRlcj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBZaWVsZCB3cml0ZV9zY3JpcHQoKSBhcmd1bWVudCB0dXBsZXMgZm9yIGEgZGlzdHJpYnV0aW9uJ3MKICAgICAgICBjb25zb2xlX3NjcmlwdHMgYW5kIGd1aV9zY3JpcHRzIGVudHJ5IHBvaW50cy4KICAgICAgICAiIiIKICAgICAgICBpZiBoZWFkZXIgaXMgTm9uZToKICAgICAgICAgICAgaGVhZGVyID0gY2xzLmdldF9oZWFkZXIoKQogICAgICAgIHNwZWMgPSBzdHIoZGlzdC5hc19yZXF1aXJlbWVudCgpKQogICAgICAgIGZvciB0eXBlXyBpbiAnY29uc29sZScsICdndWknOgogICAgICAgICAgICBncm91cCA9IHR5cGVfICsgJ19zY3JpcHRzJwogICAgICAgICAgICBmb3IgbmFtZSwgZXAgaW4gZGlzdC5nZXRfZW50cnlfbWFwKGdyb3VwKS5pdGVtcygpOgogICAgICAgICAgICAgICAgY2xzLl9lbnN1cmVfc2FmZV9uYW1lKG5hbWUpCiAgICAgICAgICAgICAgICBzY3JpcHRfdGV4dCA9IGNscy50ZW1wbGF0ZSAlIGxvY2FscygpCiAgICAgICAgICAgICAgICBhcmdzID0gY2xzLl9nZXRfc2NyaXB0X2FyZ3ModHlwZV8sIG5hbWUsIGhlYWRlciwgc2NyaXB0X3RleHQpCiAgICAgICAgICAgICAgICBmb3IgcmVzIGluIGFyZ3M6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgcmVzCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9lbnN1cmVfc2FmZV9uYW1lKG5hbWUpOgogICAgICAgICIiIgogICAgICAgIFByZXZlbnQgcGF0aHMgaW4gKl9zY3JpcHRzIGVudHJ5IHBvaW50IG5hbWVzLgogICAgICAgICIiIgogICAgICAgIGhhc19wYXRoX3NlcCA9IHJlLnNlYXJjaChyJ1tcXC9dJywgbmFtZSkKICAgICAgICBpZiBoYXNfcGF0aF9zZXA6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlBhdGggc2VwYXJhdG9ycyBub3QgYWxsb3dlZCBpbiBzY3JpcHQgbmFtZXMiKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGdldF93cml0ZXIoY2xzLCBmb3JjZV93aW5kb3dzKToKICAgICAgICAjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICAgICAgd2FybmluZ3Mud2FybigiVXNlIGJlc3QiLCBEZXByZWNhdGlvbldhcm5pbmcpCiAgICAgICAgcmV0dXJuIFdpbmRvd3NTY3JpcHRXcml0ZXIuYmVzdCgpIGlmIGZvcmNlX3dpbmRvd3MgZWxzZSBjbHMuYmVzdCgpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYmVzdChjbHMpOgogICAgICAgICIiIgogICAgICAgIFNlbGVjdCB0aGUgYmVzdCBTY3JpcHRXcml0ZXIgZm9yIHRoaXMgZW52aXJvbm1lbnQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMicgb3IgKG9zLm5hbWUgPT0gJ2phdmEnIGFuZCBvcy5fbmFtZSA9PSAnbnQnKToKICAgICAgICAgICAgcmV0dXJuIFdpbmRvd3NTY3JpcHRXcml0ZXIuYmVzdCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGNscwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9nZXRfc2NyaXB0X2FyZ3MoY2xzLCB0eXBlXywgbmFtZSwgaGVhZGVyLCBzY3JpcHRfdGV4dCk6CiAgICAgICAgIyBTaW1wbHkgd3JpdGUgdGhlIHN0dWIgd2l0aCBubyBleHRlbnNpb24uCiAgICAgICAgeWllbGQgKG5hbWUsIGhlYWRlciArIHNjcmlwdF90ZXh0KQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGdldF9oZWFkZXIoY2xzLCBzY3JpcHRfdGV4dD0iIiwgZXhlY3V0YWJsZT1Ob25lKToKICAgICAgICAiIiJDcmVhdGUgYSAjISBsaW5lLCBnZXR0aW5nIG9wdGlvbnMgKGlmIGFueSkgZnJvbSBzY3JpcHRfdGV4dCIiIgogICAgICAgIGNtZCA9IGNscy5jb21tYW5kX3NwZWNfY2xhc3MuYmVzdCgpLmZyb21fcGFyYW0oZXhlY3V0YWJsZSkKICAgICAgICBjbWQuaW5zdGFsbF9vcHRpb25zKHNjcmlwdF90ZXh0KQogICAgICAgIHJldHVybiBjbWQuYXNfaGVhZGVyKCkKCgpjbGFzcyBXaW5kb3dzU2NyaXB0V3JpdGVyKFNjcmlwdFdyaXRlcik6CiAgICBjb21tYW5kX3NwZWNfY2xhc3MgPSBXaW5kb3dzQ29tbWFuZFNwZWMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfd3JpdGVyKGNscyk6CiAgICAgICAgIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgICAgIHdhcm5pbmdzLndhcm4oIlVzZSBiZXN0IiwgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgICAgIHJldHVybiBjbHMuYmVzdCgpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYmVzdChjbHMpOgogICAgICAgICIiIgogICAgICAgIFNlbGVjdCB0aGUgYmVzdCBTY3JpcHRXcml0ZXIgc3VpdGFibGUgZm9yIFdpbmRvd3MKICAgICAgICAiIiIKICAgICAgICB3cml0ZXJfbG9va3VwID0gZGljdCgKICAgICAgICAgICAgZXhlY3V0YWJsZT1XaW5kb3dzRXhlY3V0YWJsZUxhdW5jaGVyV3JpdGVyLAogICAgICAgICAgICBuYXR1cmFsPWNscywKICAgICAgICApCiAgICAgICAgIyBmb3IgY29tcGF0aWJpbGl0eSwgdXNlIHRoZSBleGVjdXRhYmxlIGxhdW5jaGVyIGJ5IGRlZmF1bHQKICAgICAgICBsYXVuY2hlciA9IG9zLmVudmlyb24uZ2V0KCdTRVRVUFRPT0xTX0xBVU5DSEVSJywgJ2V4ZWN1dGFibGUnKQogICAgICAgIHJldHVybiB3cml0ZXJfbG9va3VwW2xhdW5jaGVyXQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9nZXRfc2NyaXB0X2FyZ3MoY2xzLCB0eXBlXywgbmFtZSwgaGVhZGVyLCBzY3JpcHRfdGV4dCk6CiAgICAgICAgIkZvciBXaW5kb3dzLCBhZGQgYSAucHkgZXh0ZW5zaW9uIgogICAgICAgIGV4dCA9IGRpY3QoY29uc29sZT0nLnB5YScsIGd1aT0nLnB5dycpW3R5cGVfXQogICAgICAgIGlmIGV4dCBub3QgaW4gb3MuZW52aXJvblsnUEFUSEVYVCddLmxvd2VyKCkuc3BsaXQoJzsnKToKICAgICAgICAgICAgbXNnID0gKAogICAgICAgICAgICAgICAgIntleHR9IG5vdCBsaXN0ZWQgaW4gUEFUSEVYVDsgc2NyaXB0cyB3aWxsIG5vdCBiZSAiCiAgICAgICAgICAgICAgICAicmVjb2duaXplZCBhcyBleGVjdXRhYmxlcy4iCiAgICAgICAgICAgICkuZm9ybWF0KCoqbG9jYWxzKCkpCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnLCBVc2VyV2FybmluZykKICAgICAgICBvbGQgPSBbJy5weWEnLCAnLnB5JywgJy1zY3JpcHQucHknLCAnLnB5YycsICcucHlvJywgJy5weXcnLCAnLmV4ZSddCiAgICAgICAgb2xkLnJlbW92ZShleHQpCiAgICAgICAgaGVhZGVyID0gY2xzLl9hZGp1c3RfaGVhZGVyKHR5cGVfLCBoZWFkZXIpCiAgICAgICAgYmxvY2tlcnMgPSBbbmFtZSArIHggZm9yIHggaW4gb2xkXQogICAgICAgIHlpZWxkIG5hbWUgKyBleHQsIGhlYWRlciArIHNjcmlwdF90ZXh0LCAndCcsIGJsb2NrZXJzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2FkanVzdF9oZWFkZXIoY2xzLCB0eXBlXywgb3JpZ19oZWFkZXIpOgogICAgICAgICIiIgogICAgICAgIE1ha2Ugc3VyZSAncHl0aG9udycgaXMgdXNlZCBmb3IgZ3VpIGFuZCBhbmQgJ3B5dGhvbicgaXMgdXNlZCBmb3IKICAgICAgICBjb25zb2xlIChyZWdhcmRsZXNzIG9mIHdoYXQgc3lzLmV4ZWN1dGFibGUgaXMpLgogICAgICAgICIiIgogICAgICAgIHBhdHRlcm4gPSAncHl0aG9udy5leGUnCiAgICAgICAgcmVwbCA9ICdweXRob24uZXhlJwogICAgICAgIGlmIHR5cGVfID09ICdndWknOgogICAgICAgICAgICBwYXR0ZXJuLCByZXBsID0gcmVwbCwgcGF0dGVybgogICAgICAgIHBhdHRlcm5fb2IgPSByZS5jb21waWxlKHJlLmVzY2FwZShwYXR0ZXJuKSwgcmUuSUdOT1JFQ0FTRSkKICAgICAgICBuZXdfaGVhZGVyID0gcGF0dGVybl9vYi5zdWIoc3RyaW5nPW9yaWdfaGVhZGVyLCByZXBsPXJlcGwpCiAgICAgICAgcmV0dXJuIG5ld19oZWFkZXIgaWYgY2xzLl91c2VfaGVhZGVyKG5ld19oZWFkZXIpIGVsc2Ugb3JpZ19oZWFkZXIKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3VzZV9oZWFkZXIobmV3X2hlYWRlcik6CiAgICAgICAgIiIiCiAgICAgICAgU2hvdWxkIF9hZGp1c3RfaGVhZGVyIHVzZSB0aGUgcmVwbGFjZWQgaGVhZGVyPwoKICAgICAgICBPbiBub24td2luZG93cyBzeXN0ZW1zLCBhbHdheXMgdXNlLiBPbgogICAgICAgIFdpbmRvd3Mgc3lzdGVtcywgb25seSB1c2UgdGhlIHJlcGxhY2VkIGhlYWRlciBpZiBpdCByZXNvbHZlcwogICAgICAgIHRvIGFuIGV4ZWN1dGFibGUgb24gdGhlIHN5c3RlbS4KICAgICAgICAiIiIKICAgICAgICBjbGVhbl9oZWFkZXIgPSBuZXdfaGVhZGVyWzI6LTFdLnN0cmlwKCciJykKICAgICAgICByZXR1cm4gc3lzLnBsYXRmb3JtICE9ICd3aW4zMicgb3IgZmluZF9leGVjdXRhYmxlKGNsZWFuX2hlYWRlcikKCgpjbGFzcyBXaW5kb3dzRXhlY3V0YWJsZUxhdW5jaGVyV3JpdGVyKFdpbmRvd3NTY3JpcHRXcml0ZXIpOgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2dldF9zY3JpcHRfYXJncyhjbHMsIHR5cGVfLCBuYW1lLCBoZWFkZXIsIHNjcmlwdF90ZXh0KToKICAgICAgICAiIiIKICAgICAgICBGb3IgV2luZG93cywgYWRkIGEgLnB5IGV4dGVuc2lvbiBhbmQgYW4gLmV4ZSBsYXVuY2hlcgogICAgICAgICIiIgogICAgICAgIGlmIHR5cGVfID09ICdndWknOgogICAgICAgICAgICBsYXVuY2hlcl90eXBlID0gJ2d1aScKICAgICAgICAgICAgZXh0ID0gJy1zY3JpcHQucHl3JwogICAgICAgICAgICBvbGQgPSBbJy5weXcnXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxhdW5jaGVyX3R5cGUgPSAnY2xpJwogICAgICAgICAgICBleHQgPSAnLXNjcmlwdC5weScKICAgICAgICAgICAgb2xkID0gWycucHknLCAnLnB5YycsICcucHlvJ10KICAgICAgICBoZHIgPSBjbHMuX2FkanVzdF9oZWFkZXIodHlwZV8sIGhlYWRlcikKICAgICAgICBibG9ja2VycyA9IFtuYW1lICsgeCBmb3IgeCBpbiBvbGRdCiAgICAgICAgeWllbGQgKG5hbWUgKyBleHQsIGhkciArIHNjcmlwdF90ZXh0LCAndCcsIGJsb2NrZXJzKQogICAgICAgIHlpZWxkICgKICAgICAgICAgICAgbmFtZSArICcuZXhlJywgZ2V0X3dpbl9sYXVuY2hlcihsYXVuY2hlcl90eXBlKSwKICAgICAgICAgICAgJ2InICAjIHdyaXRlIGluIGJpbmFyeSBtb2RlCiAgICAgICAgKQogICAgICAgIGlmIG5vdCBpc182NGJpdCgpOgogICAgICAgICAgICAjIGluc3RhbGwgYSBtYW5pZmVzdCBmb3IgdGhlIGxhdW5jaGVyIHRvIHByZXZlbnQgV2luZG93cwogICAgICAgICAgICAjIGZyb20gZGV0ZWN0aW5nIGl0IGFzIGFuIGluc3RhbGxlciAod2hpY2ggaXQgd2lsbCBmb3IKICAgICAgICAgICAgIyAgbGF1bmNoZXJzIGxpa2UgZWFzeV9pbnN0YWxsLmV4ZSkuIENvbnNpZGVyIG9ubHkKICAgICAgICAgICAgIyAgYWRkaW5nIGEgbWFuaWZlc3QgZm9yIGxhdW5jaGVycyBkZXRlY3RlZCBhcyBpbnN0YWxsZXJzLgogICAgICAgICAgICAjICBTZWUgRGlzdHJpYnV0ZSAjMTQzIGZvciBkZXRhaWxzLgogICAgICAgICAgICBtX25hbWUgPSBuYW1lICsgJy5leGUubWFuaWZlc3QnCiAgICAgICAgICAgIHlpZWxkIChtX25hbWUsIGxvYWRfbGF1bmNoZXJfbWFuaWZlc3QobmFtZSksICd0JykKCgojIGZvciBiYWNrd2FyZC1jb21wYXRpYmlsaXR5CmdldF9zY3JpcHRfYXJncyA9IFNjcmlwdFdyaXRlci5nZXRfc2NyaXB0X2FyZ3MKZ2V0X3NjcmlwdF9oZWFkZXIgPSBTY3JpcHRXcml0ZXIuZ2V0X3NjcmlwdF9oZWFkZXIKCgpkZWYgZ2V0X3dpbl9sYXVuY2hlcih0eXBlKToKICAgICIiIgogICAgTG9hZCB0aGUgV2luZG93cyBsYXVuY2hlciAoZXhlY3V0YWJsZSkgc3VpdGFibGUgZm9yIGxhdW5jaGluZyBhIHNjcmlwdC4KCiAgICBgdHlwZWAgc2hvdWxkIGJlIGVpdGhlciAnY2xpJyBvciAnZ3VpJwoKICAgIFJldHVybnMgdGhlIGV4ZWN1dGFibGUgYXMgYSBieXRlIHN0cmluZy4KICAgICIiIgogICAgbGF1bmNoZXJfZm4gPSAnJXMuZXhlJyAlIHR5cGUKICAgIGlmIGlzXzY0Yml0KCk6CiAgICAgICAgbGF1bmNoZXJfZm4gPSBsYXVuY2hlcl9mbi5yZXBsYWNlKCIuIiwgIi02NC4iKQogICAgZWxzZToKICAgICAgICBsYXVuY2hlcl9mbiA9IGxhdW5jaGVyX2ZuLnJlcGxhY2UoIi4iLCAiLTMyLiIpCiAgICByZXR1cm4gcmVzb3VyY2Vfc3RyaW5nKCdzZXR1cHRvb2xzJywgbGF1bmNoZXJfZm4pCgoKZGVmIGxvYWRfbGF1bmNoZXJfbWFuaWZlc3QobmFtZSk6CiAgICBtYW5pZmVzdCA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2Vfc3RyaW5nKF9fbmFtZV9fLCAnbGF1bmNoZXIgbWFuaWZlc3QueG1sJykKICAgIGlmIHNpeC5QWTI6CiAgICAgICAgcmV0dXJuIG1hbmlmZXN0ICUgdmFycygpCiAgICBlbHNlOgogICAgICAgIHJldHVybiBtYW5pZmVzdC5kZWNvZGUoJ3V0Zi04JykgJSB2YXJzKCkKCgpkZWYgcm10cmVlKHBhdGgsIGlnbm9yZV9lcnJvcnM9RmFsc2UsIG9uZXJyb3I9YXV0b19jaG1vZCk6CiAgICByZXR1cm4gc2h1dGlsLnJtdHJlZShwYXRoLCBpZ25vcmVfZXJyb3JzLCBvbmVycm9yKQoKCmRlZiBjdXJyZW50X3VtYXNrKCk6CiAgICB0bXAgPSBvcy51bWFzaygwbzAyMikKICAgIG9zLnVtYXNrKHRtcCkKICAgIHJldHVybiB0bXAKCgpkZWYgYm9vdHN0cmFwKCk6CiAgICAjIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gc2V0dXB0b29scyouZWdnIGlzIHJ1biB1c2luZyAvYmluL3NoCiAgICBpbXBvcnQgc2V0dXB0b29scwoKICAgIGFyZ3YwID0gb3MucGF0aC5kaXJuYW1lKHNldHVwdG9vbHMuX19wYXRoX19bMF0pCiAgICBzeXMuYXJndlswXSA9IGFyZ3YwCiAgICBzeXMuYXJndi5hcHBlbmQoYXJndjApCiAgICBtYWluKCkKCgpkZWYgbWFpbihhcmd2PU5vbmUsICoqa3cpOgogICAgZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cAogICAgZnJvbSBzZXR1cHRvb2xzLmRpc3QgaW1wb3J0IERpc3RyaWJ1dGlvbgoKICAgIGNsYXNzIERpc3RyaWJ1dGlvbldpdGhvdXRIZWxwQ29tbWFuZHMoRGlzdHJpYnV0aW9uKToKICAgICAgICBjb21tb25fdXNhZ2UgPSAiIgoKICAgICAgICBkZWYgX3Nob3dfaGVscChzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgICAgIHdpdGggX3BhdGNoX3VzYWdlKCk6CiAgICAgICAgICAgICAgICBEaXN0cmlidXRpb24uX3Nob3dfaGVscChzZWxmLCAqYXJncywgKiprdykKCiAgICBpZiBhcmd2IGlzIE5vbmU6CiAgICAgICAgYXJndiA9IHN5cy5hcmd2WzE6XQoKICAgIHdpdGggX3BhdGNoX3VzYWdlKCk6CiAgICAgICAgc2V0dXAoCiAgICAgICAgICAgIHNjcmlwdF9hcmdzPVsnLXEnLCAnZWFzeV9pbnN0YWxsJywgJy12J10gKyBhcmd2LAogICAgICAgICAgICBzY3JpcHRfbmFtZT1zeXMuYXJndlswXSBvciAnZWFzeV9pbnN0YWxsJywKICAgICAgICAgICAgZGlzdGNsYXNzPURpc3RyaWJ1dGlvbldpdGhvdXRIZWxwQ29tbWFuZHMsCiAgICAgICAgICAgICoqa3cKICAgICAgICApCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIF9wYXRjaF91c2FnZSgpOgogICAgaW1wb3J0IGRpc3R1dGlscy5jb3JlCiAgICBVU0FHRSA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICB1c2FnZTogJShzY3JpcHQpcyBbb3B0aW9uc10gcmVxdWlyZW1lbnRfb3JfdXJsIC4uLgogICAgICAgICAgIG9yOiAlKHNjcmlwdClzIC0taGVscAogICAgICAgICIiIikubHN0cmlwKCkKCiAgICBkZWYgZ2VuX3VzYWdlKHNjcmlwdF9uYW1lKToKICAgICAgICByZXR1cm4gVVNBR0UgJSBkaWN0KAogICAgICAgICAgICBzY3JpcHQ9b3MucGF0aC5iYXNlbmFtZShzY3JpcHRfbmFtZSksCiAgICAgICAgKQoKICAgIHNhdmVkID0gZGlzdHV0aWxzLmNvcmUuZ2VuX3VzYWdlCiAgICBkaXN0dXRpbHMuY29yZS5nZW5fdXNhZ2UgPSBnZW5fdXNhZ2UKICAgIHRyeToKICAgICAgICB5aWVsZAogICAgZmluYWxseToKICAgICAgICBkaXN0dXRpbHMuY29yZS5nZW5fdXNhZ2UgPSBzYXZlZApQSwMEFAAAAAAAAAAhAE4sckJwYQAAcGEAADYAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvZWdnX2luZm8ucHkiIiJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm8KCkNyZWF0ZSBhIGRpc3RyaWJ1dGlvbidzIC5lZ2ctaW5mbyBkaXJlY3RvcnkgYW5kIGNvbnRlbnRzIiIiCgpmcm9tIGRpc3R1dGlscy5maWxlbGlzdCBpbXBvcnQgRmlsZUxpc3QgYXMgX0ZpbGVMaXN0CmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzSW50ZXJuYWxFcnJvcgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwppbXBvcnQgZGlzdHV0aWxzLmVycm9ycwppbXBvcnQgZGlzdHV0aWxzLmZpbGVsaXN0CmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHN5cwppbXBvcnQgaW8KaW1wb3J0IHdhcm5pbmdzCmltcG9ydCB0aW1lCmltcG9ydCBjb2xsZWN0aW9ucwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAKCmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZApmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZGlzdCBpbXBvcnQgc2Rpc3QKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuc2Rpc3QgaW1wb3J0IHdhbGtfcmV2Y3RybApmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQgaW1wb3J0IGVkaXRfY29uZmlnCmZyb20gc2V0dXB0b29scy5jb21tYW5kIGltcG9ydCBiZGlzdF9lZ2cKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCAoCiAgICBwYXJzZV9yZXF1aXJlbWVudHMsIHNhZmVfbmFtZSwgcGFyc2VfdmVyc2lvbiwKICAgIHNhZmVfdmVyc2lvbiwgeWllbGRfbGluZXMsIEVudHJ5UG9pbnQsIGl0ZXJfZW50cnlfcG9pbnRzLCB0b19maWxlbmFtZSkKaW1wb3J0IHNldHVwdG9vbHMudW5pY29kZV91dGlscyBhcyB1bmljb2RlX3V0aWxzCmZyb20gc2V0dXB0b29scy5nbG9iIGltcG9ydCBnbG9iCgpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuIGltcG9ydCBwYWNrYWdpbmcKCgpkZWYgdHJhbnNsYXRlX3BhdHRlcm4oZ2xvYik6CiAgICAiIiIKICAgIFRyYW5zbGF0ZSBhIGZpbGUgcGF0aCBnbG9iIGxpa2UgJyoudHh0JyBpbiB0byBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KICAgIFRoaXMgZGlmZmVycyBmcm9tIGZubWF0Y2gudHJhbnNsYXRlIHdoaWNoIGFsbG93cyB3aWxkY2FyZHMgdG8gbWF0Y2gKICAgIGRpcmVjdG9yeSBzZXBhcmF0b3JzLiBJdCBhbHNvIGtub3dzIGFib3V0ICcqKi8nIHdoaWNoIG1hdGNoZXMgYW55IG51bWJlciBvZgogICAgZGlyZWN0b3JpZXMuCiAgICAiIiIKICAgIHBhdCA9ICcnCgogICAgIyBUaGlzIHdpbGwgc3BsaXQgb24gJy8nIHdpdGhpbiBbY2hhcmFjdGVyIGNsYXNzZXNdLiBUaGlzIGlzIGRlbGliZXJhdGUuCiAgICBjaHVua3MgPSBnbG9iLnNwbGl0KG9zLnBhdGguc2VwKQoKICAgIHNlcCA9IHJlLmVzY2FwZShvcy5zZXApCiAgICB2YWxpZF9jaGFyID0gJ1teJXNdJyAlIChzZXAsKQoKICAgIGZvciBjLCBjaHVuayBpbiBlbnVtZXJhdGUoY2h1bmtzKToKICAgICAgICBsYXN0X2NodW5rID0gYyA9PSBsZW4oY2h1bmtzKSAtIDEKCiAgICAgICAgIyBDaHVua3MgdGhhdCBhcmUgYSBsaXRlcmFsICoqIGFyZSBnbG9ic3RhcnMuIFRoZXkgbWF0Y2ggYW55dGhpbmcuCiAgICAgICAgaWYgY2h1bmsgPT0gJyoqJzoKICAgICAgICAgICAgaWYgbGFzdF9jaHVuazoKICAgICAgICAgICAgICAgICMgTWF0Y2ggYW55dGhpbmcgaWYgdGhpcyBpcyB0aGUgbGFzdCBjb21wb25lbnQKICAgICAgICAgICAgICAgIHBhdCArPSAnLionCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIE1hdGNoICcobmFtZS8pKicKICAgICAgICAgICAgICAgIHBhdCArPSAnKD86JXMrJXMpKicgJSAodmFsaWRfY2hhciwgc2VwKQogICAgICAgICAgICBjb250aW51ZSAgIyBCcmVhayBoZXJlIGFzIHRoZSB3aG9sZSBwYXRoIGNvbXBvbmVudCBoYXMgYmVlbiBoYW5kbGVkCgogICAgICAgICMgRmluZCBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRoZSByZW1haW5kZXIKICAgICAgICBpID0gMAogICAgICAgIGNodW5rX2xlbiA9IGxlbihjaHVuaykKICAgICAgICB3aGlsZSBpIDwgY2h1bmtfbGVuOgogICAgICAgICAgICBjaGFyID0gY2h1bmtbaV0KICAgICAgICAgICAgaWYgY2hhciA9PSAnKic6CiAgICAgICAgICAgICAgICAjIE1hdGNoIGFueSBudW1iZXIgb2YgbmFtZSBjaGFyYWN0ZXJzCiAgICAgICAgICAgICAgICBwYXQgKz0gdmFsaWRfY2hhciArICcqJwogICAgICAgICAgICBlbGlmIGNoYXIgPT0gJz8nOgogICAgICAgICAgICAgICAgIyBNYXRjaCBhIG5hbWUgY2hhcmFjdGVyCiAgICAgICAgICAgICAgICBwYXQgKz0gdmFsaWRfY2hhcgogICAgICAgICAgICBlbGlmIGNoYXIgPT0gJ1snOgogICAgICAgICAgICAgICAgIyBDaGFyYWN0ZXIgY2xhc3MKICAgICAgICAgICAgICAgIGlubmVyX2kgPSBpICsgMQogICAgICAgICAgICAgICAgIyBTa2lwIGluaXRpYWwgIS9dIGNoYXJzCiAgICAgICAgICAgICAgICBpZiBpbm5lcl9pIDwgY2h1bmtfbGVuIGFuZCBjaHVua1tpbm5lcl9pXSA9PSAnISc6CiAgICAgICAgICAgICAgICAgICAgaW5uZXJfaSA9IGlubmVyX2kgKyAxCiAgICAgICAgICAgICAgICBpZiBpbm5lcl9pIDwgY2h1bmtfbGVuIGFuZCBjaHVua1tpbm5lcl9pXSA9PSAnXSc6CiAgICAgICAgICAgICAgICAgICAgaW5uZXJfaSA9IGlubmVyX2kgKyAxCgogICAgICAgICAgICAgICAgIyBMb29wIHRpbGwgdGhlIGNsb3NpbmcgXSBpcyBmb3VuZAogICAgICAgICAgICAgICAgd2hpbGUgaW5uZXJfaSA8IGNodW5rX2xlbiBhbmQgY2h1bmtbaW5uZXJfaV0gIT0gJ10nOgogICAgICAgICAgICAgICAgICAgIGlubmVyX2kgPSBpbm5lcl9pICsgMQoKICAgICAgICAgICAgICAgIGlmIGlubmVyX2kgPj0gY2h1bmtfbGVuOgogICAgICAgICAgICAgICAgICAgICMgR290IHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyB3aXRob3V0IGZpbmRpbmcgYSBjbG9zaW5nIF0KICAgICAgICAgICAgICAgICAgICAjIERvIG5vdCB0cmVhdCB0aGlzIGFzIGEgbWF0Y2hpbmcgZ3JvdXAsIGJ1dCBhcyBhIGxpdGVyYWwgWwogICAgICAgICAgICAgICAgICAgIHBhdCArPSByZS5lc2NhcGUoY2hhcikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBHcmFiIHRoZSBpbnNpZGVzIG9mIHRoZSBbYnJhY2tldHNdCiAgICAgICAgICAgICAgICAgICAgaW5uZXIgPSBjaHVua1tpICsgMTppbm5lcl9pXQogICAgICAgICAgICAgICAgICAgIGNoYXJfY2xhc3MgPSAnJwoKICAgICAgICAgICAgICAgICAgICAjIENsYXNzIG5lZ2F0aW9uCiAgICAgICAgICAgICAgICAgICAgaWYgaW5uZXJbMF0gPT0gJyEnOgogICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2NsYXNzID0gJ14nCiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyID0gaW5uZXJbMTpdCgogICAgICAgICAgICAgICAgICAgIGNoYXJfY2xhc3MgKz0gcmUuZXNjYXBlKGlubmVyKQogICAgICAgICAgICAgICAgICAgIHBhdCArPSAnWyVzXScgJSAoY2hhcl9jbGFzcywpCgogICAgICAgICAgICAgICAgICAgICMgU2tpcCB0byB0aGUgZW5kIF0KICAgICAgICAgICAgICAgICAgICBpID0gaW5uZXJfaQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0ICs9IHJlLmVzY2FwZShjaGFyKQogICAgICAgICAgICBpICs9IDEKCiAgICAgICAgIyBKb2luIGVhY2ggY2h1bmsgd2l0aCB0aGUgZGlyIHNlcGFyYXRvcgogICAgICAgIGlmIG5vdCBsYXN0X2NodW5rOgogICAgICAgICAgICBwYXQgKz0gc2VwCgogICAgcGF0ICs9IHInXFonCiAgICByZXR1cm4gcmUuY29tcGlsZShwYXQsIGZsYWdzPXJlLk1VTFRJTElORXxyZS5ET1RBTEwpCgoKY2xhc3MgZWdnX2luZm8oQ29tbWFuZCk6CiAgICBkZXNjcmlwdGlvbiA9ICJjcmVhdGUgYSBkaXN0cmlidXRpb24ncyAuZWdnLWluZm8gZGlyZWN0b3J5IgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2VnZy1iYXNlPScsICdlJywgImRpcmVjdG9yeSBjb250YWluaW5nIC5lZ2ctaW5mbyBkaXJlY3RvcmllcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoZGVmYXVsdDogdG9wIG9mIHRoZSBzb3VyY2UgdHJlZSkiKSwKICAgICAgICAoJ3RhZy1kYXRlJywgJ2QnLCAiQWRkIGRhdGUgc3RhbXAgKGUuZy4gMjAwNTA1MjgpIHRvIHZlcnNpb24gbnVtYmVyIiksCiAgICAgICAgKCd0YWctYnVpbGQ9JywgJ2InLCAiU3BlY2lmeSBleHBsaWNpdCB0YWcgdG8gYWRkIHRvIHZlcnNpb24gbnVtYmVyIiksCiAgICAgICAgKCduby1kYXRlJywgJ0QnLCAiRG9uJ3QgaW5jbHVkZSBkYXRlIHN0YW1wIFtkZWZhdWx0XSIpLAogICAgXQoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsndGFnLWRhdGUnXQogICAgbmVnYXRpdmVfb3B0ID0gewogICAgICAgICduby1kYXRlJzogJ3RhZy1kYXRlJywKICAgIH0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuZWdnX25hbWUgPSBOb25lCiAgICAgICAgc2VsZi5lZ2dfdmVyc2lvbiA9IE5vbmUKICAgICAgICBzZWxmLmVnZ19iYXNlID0gTm9uZQogICAgICAgIHNlbGYuZWdnX2luZm8gPSBOb25lCiAgICAgICAgc2VsZi50YWdfYnVpbGQgPSBOb25lCiAgICAgICAgc2VsZi50YWdfZGF0ZSA9IDAKICAgICAgICBzZWxmLmJyb2tlbl9lZ2dfaW5mbyA9IEZhbHNlCiAgICAgICAgc2VsZi52dGFncyA9IE5vbmUKCiAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICMgYWxsb3cgdGhlICd0YWdfc3ZuX3JldmlzaW9uJyB0byBiZSBkZXRlY3RlZCBhbmQKICAgICMgc2V0LCBzdXBwb3J0aW5nIHNkaXN0cyBidWlsdCBvbiBvbGRlciBTZXR1cHRvb2xzLgogICAgQHByb3BlcnR5CiAgICBkZWYgdGFnX3N2bl9yZXZpc2lvbihzZWxmKToKICAgICAgICBwYXNzCgogICAgQHRhZ19zdm5fcmV2aXNpb24uc2V0dGVyCiAgICBkZWYgdGFnX3N2bl9yZXZpc2lvbihzZWxmLCB2YWx1ZSk6CiAgICAgICAgcGFzcwogICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgZGVmIHNhdmVfdmVyc2lvbl9pbmZvKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICAiIiIKICAgICAgICBNYXRlcmlhbGl6ZSB0aGUgdmFsdWUgb2YgZGF0ZSBpbnRvIHRoZQogICAgICAgIGJ1aWxkIHRhZy4gSW5zdGFsbCBidWlsZCBrZXlzIGluIGEgZGV0ZXJtaW5pc3RpYyBvcmRlcgogICAgICAgIHRvIGF2b2lkIGFyYml0cmFyeSByZW9yZGVyaW5nIG9uIHN1YnNlcXVlbnQgYnVpbGRzLgogICAgICAgICIiIgogICAgICAgIGVnZ19pbmZvID0gY29sbGVjdGlvbnMuT3JkZXJlZERpY3QoKQogICAgICAgICMgZm9sbG93IHRoZSBvcmRlciB0aGVzZSBrZXlzIHdvdWxkIGhhdmUgYmVlbiBhZGRlZAogICAgICAgICMgd2hlbiBQWVRIT05IQVNIU0VFRD0wCiAgICAgICAgZWdnX2luZm9bJ3RhZ19idWlsZCddID0gc2VsZi50YWdzKCkKICAgICAgICBlZ2dfaW5mb1sndGFnX2RhdGUnXSA9IDAKICAgICAgICBlZGl0X2NvbmZpZyhmaWxlbmFtZSwgZGljdChlZ2dfaW5mbz1lZ2dfaW5mbykpCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5lZ2dfbmFtZSA9IHNhZmVfbmFtZShzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpKQogICAgICAgIHNlbGYudnRhZ3MgPSBzZWxmLnRhZ3MoKQogICAgICAgIHNlbGYuZWdnX3ZlcnNpb24gPSBzZWxmLnRhZ2dlZF92ZXJzaW9uKCkKCiAgICAgICAgcGFyc2VkX3ZlcnNpb24gPSBwYXJzZV92ZXJzaW9uKHNlbGYuZWdnX3ZlcnNpb24pCgogICAgICAgIHRyeToKICAgICAgICAgICAgaXNfdmVyc2lvbiA9IGlzaW5zdGFuY2UocGFyc2VkX3ZlcnNpb24sIHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24pCiAgICAgICAgICAgIHNwZWMgPSAoCiAgICAgICAgICAgICAgICAiJXM9PSVzIiBpZiBpc192ZXJzaW9uIGVsc2UgIiVzPT09JXMiCiAgICAgICAgICAgICkKICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgIHBhcnNlX3JlcXVpcmVtZW50cyhzcGVjICUgKHNlbGYuZWdnX25hbWUsIHNlbGYuZWdnX3ZlcnNpb24pKQogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiSW52YWxpZCBkaXN0cmlidXRpb24gbmFtZSBvciB2ZXJzaW9uIHN5bnRheDogJXMtJXMiICUKICAgICAgICAgICAgICAgIChzZWxmLmVnZ19uYW1lLCBzZWxmLmVnZ192ZXJzaW9uKQogICAgICAgICAgICApCgogICAgICAgIGlmIHNlbGYuZWdnX2Jhc2UgaXMgTm9uZToKICAgICAgICAgICAgZGlycyA9IHNlbGYuZGlzdHJpYnV0aW9uLnBhY2thZ2VfZGlyCiAgICAgICAgICAgIHNlbGYuZWdnX2Jhc2UgPSAoZGlycyBvciB7fSkuZ2V0KCcnLCBvcy5jdXJkaXIpCgogICAgICAgIHNlbGYuZW5zdXJlX2Rpcm5hbWUoJ2VnZ19iYXNlJykKICAgICAgICBzZWxmLmVnZ19pbmZvID0gdG9fZmlsZW5hbWUoc2VsZi5lZ2dfbmFtZSkgKyAnLmVnZy1pbmZvJwogICAgICAgIGlmIHNlbGYuZWdnX2Jhc2UgIT0gb3MuY3VyZGlyOgogICAgICAgICAgICBzZWxmLmVnZ19pbmZvID0gb3MucGF0aC5qb2luKHNlbGYuZWdnX2Jhc2UsIHNlbGYuZWdnX2luZm8pCiAgICAgICAgaWYgJy0nIGluIHNlbGYuZWdnX25hbWU6CiAgICAgICAgICAgIHNlbGYuY2hlY2tfYnJva2VuX2VnZ19pbmZvKCkKCiAgICAgICAgIyBTZXQgcGFja2FnZSB2ZXJzaW9uIGZvciB0aGUgYmVuZWZpdCBvZiBkdW1iZXIgY29tbWFuZHMKICAgICAgICAjIChlLmcuIHNkaXN0LCBiZGlzdF93aW5pbnN0LCBldGMuKQogICAgICAgICMKICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YS52ZXJzaW9uID0gc2VsZi5lZ2dfdmVyc2lvbgoKICAgICAgICAjIElmIHdlIGJvb3RzdHJhcHBlZCBhcm91bmQgdGhlIGxhY2sgb2YgYSBQS0ctSU5GTywgYXMgbWlnaHQgYmUgdGhlCiAgICAgICAgIyBjYXNlIGluIGEgZnJlc2ggY2hlY2tvdXQsIG1ha2Ugc3VyZSB0aGF0IGFueSBzcGVjaWFsIHRhZ3MgZ2V0IGFkZGVkCiAgICAgICAgIyB0byB0aGUgdmVyc2lvbiBpbmZvCiAgICAgICAgIwogICAgICAgIHBkID0gc2VsZi5kaXN0cmlidXRpb24uX3BhdGNoZWRfZGlzdAogICAgICAgIGlmIHBkIGlzIG5vdCBOb25lIGFuZCBwZC5rZXkgPT0gc2VsZi5lZ2dfbmFtZS5sb3dlcigpOgogICAgICAgICAgICBwZC5fdmVyc2lvbiA9IHNlbGYuZWdnX3ZlcnNpb24KICAgICAgICAgICAgcGQuX3BhcnNlZF92ZXJzaW9uID0gcGFyc2VfdmVyc2lvbihzZWxmLmVnZ192ZXJzaW9uKQogICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5fcGF0Y2hlZF9kaXN0ID0gTm9uZQoKICAgIGRlZiB3cml0ZV9vcl9kZWxldGVfZmlsZShzZWxmLCB3aGF0LCBmaWxlbmFtZSwgZGF0YSwgZm9yY2U9RmFsc2UpOgogICAgICAgICIiIldyaXRlIGBkYXRhYCB0byBgZmlsZW5hbWVgIG9yIGRlbGV0ZSBpZiBlbXB0eQoKICAgICAgICBJZiBgZGF0YWAgaXMgbm9uLWVtcHR5LCB0aGlzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgYGB3cml0ZV9maWxlKClgYC4KICAgICAgICBJZiBgZGF0YWAgaXMgZW1wdHkgYnV0IG5vdCBgYE5vbmVgYCwgdGhpcyBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nCiAgICAgICAgYGBkZWxldGVfZmlsZShmaWxlbmFtZSlgLiAgSWYgYGRhdGFgIGlzIGBgTm9uZWBgLCB0aGVuIHRoaXMgaXMgYSBuby1vcAogICAgICAgIHVubGVzcyBgZmlsZW5hbWVgIGV4aXN0cywgaW4gd2hpY2ggY2FzZSBhIHdhcm5pbmcgaXMgaXNzdWVkIGFib3V0IHRoZQogICAgICAgIG9ycGhhbmVkIGZpbGUgKGlmIGBmb3JjZWAgaXMgZmFsc2UpLCBvciBkZWxldGVkIChpZiBgZm9yY2VgIGlzIHRydWUpLgogICAgICAgICIiIgogICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgIHNlbGYud3JpdGVfZmlsZSh3aGF0LCBmaWxlbmFtZSwgZGF0YSkKICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICAgICAgaWYgZGF0YSBpcyBOb25lIGFuZCBub3QgZm9yY2U6CiAgICAgICAgICAgICAgICBsb2cud2FybigKICAgICAgICAgICAgICAgICAgICAiJXMgbm90IHNldCBpbiBzZXR1cCgpLCBidXQgJXMgZXhpc3RzIiwgd2hhdCwgZmlsZW5hbWUKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5kZWxldGVfZmlsZShmaWxlbmFtZSkKCiAgICBkZWYgd3JpdGVfZmlsZShzZWxmLCB3aGF0LCBmaWxlbmFtZSwgZGF0YSk6CiAgICAgICAgIiIiV3JpdGUgYGRhdGFgIHRvIGBmaWxlbmFtZWAgKGlmIG5vdCBhIGRyeSBydW4pIGFmdGVyIGFubm91bmNpbmcgaXQKCiAgICAgICAgYHdoYXRgIGlzIHVzZWQgaW4gYSBsb2cgbWVzc2FnZSB0byBpZGVudGlmeSB3aGF0IGlzIGJlaW5nIHdyaXR0ZW4KICAgICAgICB0byB0aGUgZmlsZS4KICAgICAgICAiIiIKICAgICAgICBsb2cuaW5mbygid3JpdGluZyAlcyB0byAlcyIsIHdoYXQsIGZpbGVuYW1lKQogICAgICAgIGlmIHNpeC5QWTM6CiAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZSgidXRmLTgiKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAnd2InKQogICAgICAgICAgICBmLndyaXRlKGRhdGEpCiAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgIGRlZiBkZWxldGVfZmlsZShzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgIiIiRGVsZXRlIGBmaWxlbmFtZWAgKGlmIG5vdCBhIGRyeSBydW4pIGFmdGVyIGFubm91bmNpbmcgaXQiIiIKICAgICAgICBsb2cuaW5mbygiZGVsZXRpbmcgJXMiLCBmaWxlbmFtZSkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCgogICAgZGVmIHRhZ2dlZF92ZXJzaW9uKHNlbGYpOgogICAgICAgIHZlcnNpb24gPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpCiAgICAgICAgIyBlZ2dfaW5mbyBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGZvciBhIGRpc3RyaWJ1dGlvbiwKICAgICAgICAjIGluIHdoaWNoIGNhc2UgdGhlIHZlcnNpb24gc3RyaW5nIGFscmVhZHkgY29udGFpbnMgYWxsIHRhZ3MuCiAgICAgICAgaWYgc2VsZi52dGFncyBhbmQgdmVyc2lvbi5lbmRzd2l0aChzZWxmLnZ0YWdzKToKICAgICAgICAgICAgcmV0dXJuIHNhZmVfdmVyc2lvbih2ZXJzaW9uKQogICAgICAgIHJldHVybiBzYWZlX3ZlcnNpb24odmVyc2lvbiArIHNlbGYudnRhZ3MpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLm1rcGF0aChzZWxmLmVnZ19pbmZvKQogICAgICAgIGluc3RhbGxlciA9IHNlbGYuZGlzdHJpYnV0aW9uLmZldGNoX2J1aWxkX2VnZwogICAgICAgIGZvciBlcCBpbiBpdGVyX2VudHJ5X3BvaW50cygnZWdnX2luZm8ud3JpdGVycycpOgogICAgICAgICAgICBlcC5yZXF1aXJlKGluc3RhbGxlcj1pbnN0YWxsZXIpCiAgICAgICAgICAgIHdyaXRlciA9IGVwLnJlc29sdmUoKQogICAgICAgICAgICB3cml0ZXIoc2VsZiwgZXAubmFtZSwgb3MucGF0aC5qb2luKHNlbGYuZWdnX2luZm8sIGVwLm5hbWUpKQoKICAgICAgICAjIEdldCByaWQgb2YgbmF0aXZlX2xpYnMudHh0IGlmIGl0IHdhcyBwdXQgdGhlcmUgYnkgb2xkZXIgYmRpc3RfZWdnCiAgICAgICAgbmwgPSBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfaW5mbywgIm5hdGl2ZV9saWJzLnR4dCIpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobmwpOgogICAgICAgICAgICBzZWxmLmRlbGV0ZV9maWxlKG5sKQoKICAgICAgICBzZWxmLmZpbmRfc291cmNlcygpCgogICAgZGVmIHRhZ3Moc2VsZik6CiAgICAgICAgdmVyc2lvbiA9ICcnCiAgICAgICAgaWYgc2VsZi50YWdfYnVpbGQ6CiAgICAgICAgICAgIHZlcnNpb24gKz0gc2VsZi50YWdfYnVpbGQKICAgICAgICBpZiBzZWxmLnRhZ19kYXRlOgogICAgICAgICAgICB2ZXJzaW9uICs9IHRpbWUuc3RyZnRpbWUoIi0lWSVtJWQiKQogICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgZGVmIGZpbmRfc291cmNlcyhzZWxmKToKICAgICAgICAiIiJHZW5lcmF0ZSBTT1VSQ0VTLnR4dCBtYW5pZmVzdCBmaWxlIiIiCiAgICAgICAgbWFuaWZlc3RfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfaW5mbywgIlNPVVJDRVMudHh0IikKICAgICAgICBtbSA9IG1hbmlmZXN0X21ha2VyKHNlbGYuZGlzdHJpYnV0aW9uKQogICAgICAgIG1tLm1hbmlmZXN0ID0gbWFuaWZlc3RfZmlsZW5hbWUKICAgICAgICBtbS5ydW4oKQogICAgICAgIHNlbGYuZmlsZWxpc3QgPSBtbS5maWxlbGlzdAoKICAgIGRlZiBjaGVja19icm9rZW5fZWdnX2luZm8oc2VsZik6CiAgICAgICAgYmVpID0gc2VsZi5lZ2dfbmFtZSArICcuZWdnLWluZm8nCiAgICAgICAgaWYgc2VsZi5lZ2dfYmFzZSAhPSBvcy5jdXJkaXI6CiAgICAgICAgICAgIGJlaSA9IG9zLnBhdGguam9pbihzZWxmLmVnZ19iYXNlLCBiZWkpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoYmVpKToKICAgICAgICAgICAgbG9nLndhcm4oCiAgICAgICAgICAgICAgICAiLSIgKiA3OCArICdcbicKICAgICAgICAgICAgICAgICJOb3RlOiBZb3VyIGN1cnJlbnQgLmVnZy1pbmZvIGRpcmVjdG9yeSBoYXMgYSAnLScgaW4gaXRzIG5hbWU7IgogICAgICAgICAgICAgICAgJ1xudGhpcyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSB3aXRoICJzZXR1cC5weSBkZXZlbG9wIi5cblxuJwogICAgICAgICAgICAgICAgJ1BsZWFzZSByZW5hbWUgJXMgdG8gJXMgdG8gY29ycmVjdCB0aGlzIHByb2JsZW0uXG4nICsgJy0nICogNzgsCiAgICAgICAgICAgICAgICBiZWksIHNlbGYuZWdnX2luZm8KICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLmJyb2tlbl9lZ2dfaW5mbyA9IHNlbGYuZWdnX2luZm8KICAgICAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IGJlaSAgIyBtYWtlIGl0IHdvcmsgZm9yIG5vdwoKCmNsYXNzIEZpbGVMaXN0KF9GaWxlTGlzdCk6CiAgICAjIEltcGxlbWVudGF0aW9ucyBvZiB0aGUgdmFyaW91cyBNQU5JRkVTVC5pbiBjb21tYW5kcwoKICAgIGRlZiBwcm9jZXNzX3RlbXBsYXRlX2xpbmUoc2VsZiwgbGluZSk6CiAgICAgICAgIyBQYXJzZSB0aGUgbGluZTogc3BsaXQgaXQgdXAsIG1ha2Ugc3VyZSB0aGUgcmlnaHQgbnVtYmVyIG9mIHdvcmRzCiAgICAgICAgIyBpcyB0aGVyZSwgYW5kIHJldHVybiB0aGUgcmVsZXZhbnQgd29yZHMuICAnYWN0aW9uJyBpcyBhbHdheXMKICAgICAgICAjIGRlZmluZWQ6IGl0J3MgdGhlIGZpcnN0IHdvcmQgb2YgdGhlIGxpbmUuICBXaGljaCBvZiB0aGUgb3RoZXIKICAgICAgICAjIHRocmVlIGFyZSBkZWZpbmVkIGRlcGVuZHMgb24gdGhlIGFjdGlvbjsgaXQnbGwgYmUgZWl0aGVyCiAgICAgICAgIyBwYXR0ZXJucywgKGRpciBhbmQgcGF0dGVybnMpLCBvciAoZGlyX3BhdHRlcm4pLgogICAgICAgIChhY3Rpb24sIHBhdHRlcm5zLCBkaXIsIGRpcl9wYXR0ZXJuKSA9IHNlbGYuX3BhcnNlX3RlbXBsYXRlX2xpbmUobGluZSkKCiAgICAgICAgIyBPSywgbm93IHdlIGtub3cgdGhhdCB0aGUgYWN0aW9uIGlzIHZhbGlkIGFuZCB3ZSBoYXZlIHRoZQogICAgICAgICMgcmlnaHQgbnVtYmVyIG9mIHdvcmRzIG9uIHRoZSBsaW5lIGZvciB0aGF0IGFjdGlvbiAtLSBzbyB3ZQogICAgICAgICMgY2FuIHByb2NlZWQgd2l0aCBtaW5pbWFsIGVycm9yLWNoZWNraW5nLgogICAgICAgIGlmIGFjdGlvbiA9PSAnaW5jbHVkZSc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoImluY2x1ZGUgIiArICcgJy5qb2luKHBhdHRlcm5zKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5pbmNsdWRlKHBhdHRlcm4pOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJ3YXJuaW5nOiBubyBmaWxlcyBmb3VuZCBtYXRjaGluZyAnJXMnIiwgcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2V4Y2x1ZGUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJleGNsdWRlICIgKyAnICcuam9pbihwYXR0ZXJucykpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZXhjbHVkZShwYXR0ZXJuKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIHByZXZpb3VzbHktaW5jbHVkZWQgZmlsZXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm91bmQgbWF0Y2hpbmcgJyVzJyIpLCBwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAnZ2xvYmFsLWluY2x1ZGUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJnbG9iYWwtaW5jbHVkZSAiICsgJyAnLmpvaW4ocGF0dGVybnMpKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmdsb2JhbF9pbmNsdWRlKHBhdHRlcm4pOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCgid2FybmluZzogbm8gZmlsZXMgZm91bmQgbWF0Y2hpbmcgJyVzJyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbnl3aGVyZSBpbiBkaXN0cmlidXRpb24iKSwgcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2dsb2JhbC1leGNsdWRlJzoKICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiZ2xvYmFsLWV4Y2x1ZGUgIiArICcgJy5qb2luKHBhdHRlcm5zKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5nbG9iYWxfZXhjbHVkZShwYXR0ZXJuKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIHByZXZpb3VzbHktaW5jbHVkZWQgZmlsZXMgbWF0Y2hpbmcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBmb3VuZCBhbnl3aGVyZSBpbiBkaXN0cmlidXRpb24iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAncmVjdXJzaXZlLWluY2x1ZGUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJyZWN1cnNpdmUtaW5jbHVkZSAlcyAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXIsICcgJy5qb2luKHBhdHRlcm5zKSkpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucmVjdXJzaXZlX2luY2x1ZGUoZGlyLCBwYXR0ZXJuKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIGZpbGVzIGZvdW5kIG1hdGNoaW5nICclcycgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5kZXIgZGlyZWN0b3J5ICclcyciKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLCBkaXIpCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdyZWN1cnNpdmUtZXhjbHVkZSc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoInJlY3Vyc2l2ZS1leGNsdWRlICVzICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpciwgJyAnLmpvaW4ocGF0dGVybnMpKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5yZWN1cnNpdmVfZXhjbHVkZShkaXIsIHBhdHRlcm4pOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCgid2FybmluZzogbm8gcHJldmlvdXNseS1pbmNsdWRlZCBmaWxlcyBtYXRjaGluZyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIGZvdW5kIHVuZGVyIGRpcmVjdG9yeSAnJXMnIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiwgZGlyKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAnZ3JhZnQnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJncmFmdCAiICsgZGlyX3BhdHRlcm4pCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmdyYWZ0KGRpcl9wYXR0ZXJuKToKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJ3YXJuaW5nOiBubyBkaXJlY3RvcmllcyBmb3VuZCBtYXRjaGluZyAnJXMnIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGRpcl9wYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAncHJ1bmUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJwcnVuZSAiICsgZGlyX3BhdHRlcm4pCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBydW5lKGRpcl9wYXR0ZXJuKToKICAgICAgICAgICAgICAgIGxvZy53YXJuKCgibm8gcHJldmlvdXNseS1pbmNsdWRlZCBkaXJlY3RvcmllcyBmb3VuZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdGNoaW5nICclcyciKSwgZGlyX3BhdHRlcm4pCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0ludGVybmFsRXJyb3IoCiAgICAgICAgICAgICAgICAidGhpcyBjYW5ub3QgaGFwcGVuOiBpbnZhbGlkIGFjdGlvbiAnJXMnIiAlIGFjdGlvbikKCiAgICBkZWYgX3JlbW92ZV9maWxlcyhzZWxmLCBwcmVkaWNhdGUpOgogICAgICAgICIiIgogICAgICAgIFJlbW92ZSBhbGwgZmlsZXMgZnJvbSB0aGUgZmlsZSBsaXN0IHRoYXQgbWF0Y2ggdGhlIHByZWRpY2F0ZS4KICAgICAgICBSZXR1cm4gVHJ1ZSBpZiBhbnkgbWF0Y2hpbmcgZmlsZXMgd2VyZSByZW1vdmVkCiAgICAgICAgIiIiCiAgICAgICAgZm91bmQgPSBGYWxzZQogICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmZpbGVzKSAtIDEsIC0xLCAtMSk6CiAgICAgICAgICAgIGlmIHByZWRpY2F0ZShzZWxmLmZpbGVzW2ldKToKICAgICAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoIiByZW1vdmluZyAiICsgc2VsZi5maWxlc1tpXSkKICAgICAgICAgICAgICAgIGRlbCBzZWxmLmZpbGVzW2ldCiAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKICAgICAgICByZXR1cm4gZm91bmQKCiAgICBkZWYgaW5jbHVkZShzZWxmLCBwYXR0ZXJuKToKICAgICAgICAiIiJJbmNsdWRlIGZpbGVzIHRoYXQgbWF0Y2ggJ3BhdHRlcm4nLiIiIgogICAgICAgIGZvdW5kID0gW2YgZm9yIGYgaW4gZ2xvYihwYXR0ZXJuKSBpZiBub3Qgb3MucGF0aC5pc2RpcihmKV0KICAgICAgICBzZWxmLmV4dGVuZChmb3VuZCkKICAgICAgICByZXR1cm4gYm9vbChmb3VuZCkKCiAgICBkZWYgZXhjbHVkZShzZWxmLCBwYXR0ZXJuKToKICAgICAgICAiIiJFeGNsdWRlIGZpbGVzIHRoYXQgbWF0Y2ggJ3BhdHRlcm4nLiIiIgogICAgICAgIG1hdGNoID0gdHJhbnNsYXRlX3BhdHRlcm4ocGF0dGVybikKICAgICAgICByZXR1cm4gc2VsZi5fcmVtb3ZlX2ZpbGVzKG1hdGNoLm1hdGNoKQoKICAgIGRlZiByZWN1cnNpdmVfaW5jbHVkZShzZWxmLCBkaXIsIHBhdHRlcm4pOgogICAgICAgICIiIgogICAgICAgIEluY2x1ZGUgYWxsIGZpbGVzIGFueXdoZXJlIGluICdkaXIvJyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLgogICAgICAgICIiIgogICAgICAgIGZ1bGxfcGF0dGVybiA9IG9zLnBhdGguam9pbihkaXIsICcqKicsIHBhdHRlcm4pCiAgICAgICAgZm91bmQgPSBbZiBmb3IgZiBpbiBnbG9iKGZ1bGxfcGF0dGVybiwgcmVjdXJzaXZlPVRydWUpCiAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZildCiAgICAgICAgc2VsZi5leHRlbmQoZm91bmQpCiAgICAgICAgcmV0dXJuIGJvb2woZm91bmQpCgogICAgZGVmIHJlY3Vyc2l2ZV9leGNsdWRlKHNlbGYsIGRpciwgcGF0dGVybik6CiAgICAgICAgIiIiCiAgICAgICAgRXhjbHVkZSBhbnkgZmlsZSBhbnl3aGVyZSBpbiAnZGlyLycgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4KICAgICAgICAiIiIKICAgICAgICBtYXRjaCA9IHRyYW5zbGF0ZV9wYXR0ZXJuKG9zLnBhdGguam9pbihkaXIsICcqKicsIHBhdHRlcm4pKQogICAgICAgIHJldHVybiBzZWxmLl9yZW1vdmVfZmlsZXMobWF0Y2gubWF0Y2gpCgogICAgZGVmIGdyYWZ0KHNlbGYsIGRpcik6CiAgICAgICAgIiIiSW5jbHVkZSBhbGwgZmlsZXMgZnJvbSAnZGlyLycuIiIiCiAgICAgICAgZm91bmQgPSBbCiAgICAgICAgICAgIGl0ZW0KICAgICAgICAgICAgZm9yIG1hdGNoX2RpciBpbiBnbG9iKGRpcikKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gZGlzdHV0aWxzLmZpbGVsaXN0LmZpbmRhbGwobWF0Y2hfZGlyKQogICAgICAgIF0KICAgICAgICBzZWxmLmV4dGVuZChmb3VuZCkKICAgICAgICByZXR1cm4gYm9vbChmb3VuZCkKCiAgICBkZWYgcHJ1bmUoc2VsZiwgZGlyKToKICAgICAgICAiIiJGaWx0ZXIgb3V0IGZpbGVzIGZyb20gJ2Rpci8nLiIiIgogICAgICAgIG1hdGNoID0gdHJhbnNsYXRlX3BhdHRlcm4ob3MucGF0aC5qb2luKGRpciwgJyoqJykpCiAgICAgICAgcmV0dXJuIHNlbGYuX3JlbW92ZV9maWxlcyhtYXRjaC5tYXRjaCkKCiAgICBkZWYgZ2xvYmFsX2luY2x1ZGUoc2VsZiwgcGF0dGVybik6CiAgICAgICAgIiIiCiAgICAgICAgSW5jbHVkZSBhbGwgZmlsZXMgYW55d2hlcmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRoYXQgbWF0Y2ggdGhlCiAgICAgICAgcGF0dGVybi4gVGhpcyBpcyB2ZXJ5IGluZWZmaWNpZW50IG9uIGxhcmdlIGZpbGUgdHJlZXMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5hbGxmaWxlcyBpcyBOb25lOgogICAgICAgICAgICBzZWxmLmZpbmRhbGwoKQogICAgICAgIG1hdGNoID0gdHJhbnNsYXRlX3BhdHRlcm4ob3MucGF0aC5qb2luKCcqKicsIHBhdHRlcm4pKQogICAgICAgIGZvdW5kID0gW2YgZm9yIGYgaW4gc2VsZi5hbGxmaWxlcyBpZiBtYXRjaC5tYXRjaChmKV0KICAgICAgICBzZWxmLmV4dGVuZChmb3VuZCkKICAgICAgICByZXR1cm4gYm9vbChmb3VuZCkKCiAgICBkZWYgZ2xvYmFsX2V4Y2x1ZGUoc2VsZiwgcGF0dGVybik6CiAgICAgICAgIiIiCiAgICAgICAgRXhjbHVkZSBhbGwgZmlsZXMgYW55d2hlcmUgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4KICAgICAgICAiIiIKICAgICAgICBtYXRjaCA9IHRyYW5zbGF0ZV9wYXR0ZXJuKG9zLnBhdGguam9pbignKionLCBwYXR0ZXJuKSkKICAgICAgICByZXR1cm4gc2VsZi5fcmVtb3ZlX2ZpbGVzKG1hdGNoLm1hdGNoKQoKICAgIGRlZiBhcHBlbmQoc2VsZiwgaXRlbSk6CiAgICAgICAgaWYgaXRlbS5lbmRzd2l0aCgnXHInKTogICMgRml4IG9sZGVyIHNkaXN0cyBidWlsdCBvbiBXaW5kb3dzCiAgICAgICAgICAgIGl0ZW0gPSBpdGVtWzotMV0KICAgICAgICBwYXRoID0gY29udmVydF9wYXRoKGl0ZW0pCgogICAgICAgIGlmIHNlbGYuX3NhZmVfcGF0aChwYXRoKToKICAgICAgICAgICAgc2VsZi5maWxlcy5hcHBlbmQocGF0aCkKCiAgICBkZWYgZXh0ZW5kKHNlbGYsIHBhdGhzKToKICAgICAgICBzZWxmLmZpbGVzLmV4dGVuZChmaWx0ZXIoc2VsZi5fc2FmZV9wYXRoLCBwYXRocykpCgogICAgZGVmIF9yZXBhaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVwbGFjZSBzZWxmLmZpbGVzIHdpdGggb25seSBzYWZlIHBhdGhzCgogICAgICAgIEJlY2F1c2Ugc29tZSBvd25lcnMgb2YgRmlsZUxpc3QgbWFuaXB1bGF0ZSB0aGUgdW5kZXJseWluZwogICAgICAgIGBgZmlsZXNgYCBhdHRyaWJ1dGUgZGlyZWN0bHksIHRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHRvCiAgICAgICAgcmVwYWlyIHRob3NlIHBhdGhzLgogICAgICAgICIiIgogICAgICAgIHNlbGYuZmlsZXMgPSBsaXN0KGZpbHRlcihzZWxmLl9zYWZlX3BhdGgsIHNlbGYuZmlsZXMpKQoKICAgIGRlZiBfc2FmZV9wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgIGVuY193YXJuID0gIiclcycgbm90ICVzIGVuY29kYWJsZSAtLSBza2lwcGluZyIKCiAgICAgICAgIyBUbyBhdm9pZCBhY2NpZGVudGFsIHRyYW5zLWNvZGluZ3MgZXJyb3JzLCBmaXJzdCB0byB1bmljb2RlCiAgICAgICAgdV9wYXRoID0gdW5pY29kZV91dGlscy5maWxlc3lzX2RlY29kZShwYXRoKQogICAgICAgIGlmIHVfcGF0aCBpcyBOb25lOgogICAgICAgICAgICBsb2cud2FybigiJyVzJyBpbiB1bmV4cGVjdGVkIGVuY29kaW5nIC0tIHNraXBwaW5nIiAlIHBhdGgpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIE11c3QgZW5zdXJlIHV0Zi04IGVuY29kYWJpbGl0eQogICAgICAgIHV0ZjhfcGF0aCA9IHVuaWNvZGVfdXRpbHMudHJ5X2VuY29kZSh1X3BhdGgsICJ1dGYtOCIpCiAgICAgICAgaWYgdXRmOF9wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIGxvZy53YXJuKGVuY193YXJuLCBwYXRoLCAndXRmLTgnKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIGFjY2VwdCBpcyBlaXRoZXIgd2F5IGNoZWNrcyBvdXQKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHModV9wYXRoKSBvciBvcy5wYXRoLmV4aXN0cyh1dGY4X3BhdGgpOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAjIHRoaXMgd2lsbCBjYXRjaCBhbnkgZW5jb2RlIGVycm9ycyBkZWNvZGluZyB1X3BhdGgKICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgICAgICBsb2cud2FybihlbmNfd2FybiwgcGF0aCwgc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQoKCmNsYXNzIG1hbmlmZXN0X21ha2VyKHNkaXN0KToKICAgIHRlbXBsYXRlID0gIk1BTklGRVNULmluIgoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi51c2VfZGVmYXVsdHMgPSAxCiAgICAgICAgc2VsZi5wcnVuZSA9IDEKICAgICAgICBzZWxmLm1hbmlmZXN0X29ubHkgPSAxCiAgICAgICAgc2VsZi5mb3JjZV9tYW5pZmVzdCA9IDEKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLmZpbGVsaXN0ID0gRmlsZUxpc3QoKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLm1hbmlmZXN0KToKICAgICAgICAgICAgc2VsZi53cml0ZV9tYW5pZmVzdCgpICAjIGl0IG11c3QgZXhpc3Qgc28gaXQnbGwgZ2V0IGluIHRoZSBsaXN0CiAgICAgICAgc2VsZi5hZGRfZGVmYXVsdHMoKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYudGVtcGxhdGUpOgogICAgICAgICAgICBzZWxmLnJlYWRfdGVtcGxhdGUoKQogICAgICAgIHNlbGYucHJ1bmVfZmlsZV9saXN0KCkKICAgICAgICBzZWxmLmZpbGVsaXN0LnNvcnQoKQogICAgICAgIHNlbGYuZmlsZWxpc3QucmVtb3ZlX2R1cGxpY2F0ZXMoKQogICAgICAgIHNlbGYud3JpdGVfbWFuaWZlc3QoKQoKICAgIGRlZiBfbWFuaWZlc3Rfbm9ybWFsaXplKHNlbGYsIHBhdGgpOgogICAgICAgIHBhdGggPSB1bmljb2RlX3V0aWxzLmZpbGVzeXNfZGVjb2RlKHBhdGgpCiAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZShvcy5zZXAsICcvJykKCiAgICBkZWYgd3JpdGVfbWFuaWZlc3Qoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgV3JpdGUgdGhlIGZpbGUgbGlzdCBpbiAnc2VsZi5maWxlbGlzdCcgdG8gdGhlIG1hbmlmZXN0IGZpbGUKICAgICAgICBuYW1lZCBieSAnc2VsZi5tYW5pZmVzdCcuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5maWxlbGlzdC5fcmVwYWlyKCkKCiAgICAgICAgIyBOb3cgX3JlcGFpcnMgc2hvdWxkIGVuY29kYWJpbGl0eSwgYnV0IG5vdCB1bmljb2RlCiAgICAgICAgZmlsZXMgPSBbc2VsZi5fbWFuaWZlc3Rfbm9ybWFsaXplKGYpIGZvciBmIGluIHNlbGYuZmlsZWxpc3QuZmlsZXNdCiAgICAgICAgbXNnID0gIndyaXRpbmcgbWFuaWZlc3QgZmlsZSAnJXMnIiAlIHNlbGYubWFuaWZlc3QKICAgICAgICBzZWxmLmV4ZWN1dGUod3JpdGVfZmlsZSwgKHNlbGYubWFuaWZlc3QsIGZpbGVzKSwgbXNnKQoKICAgIGRlZiB3YXJuKHNlbGYsIG1zZyk6CiAgICAgICAgaWYgbm90IHNlbGYuX3Nob3VsZF9zdXBwcmVzc193YXJuaW5nKG1zZyk6CiAgICAgICAgICAgIHNkaXN0Lndhcm4oc2VsZiwgbXNnKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfc2hvdWxkX3N1cHByZXNzX3dhcm5pbmcobXNnKToKICAgICAgICAiIiIKICAgICAgICBzdXBwcmVzcyBtaXNzaW5nLWZpbGUgd2FybmluZ3MgZnJvbSBzZGlzdAogICAgICAgICIiIgogICAgICAgIHJldHVybiByZS5tYXRjaChyInN0YW5kYXJkIGZpbGUgLipub3QgZm91bmQiLCBtc2cpCgogICAgZGVmIGFkZF9kZWZhdWx0cyhzZWxmKToKICAgICAgICBzZGlzdC5hZGRfZGVmYXVsdHMoc2VsZikKICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChzZWxmLnRlbXBsYXRlKQogICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKHNlbGYubWFuaWZlc3QpCiAgICAgICAgcmNmaWxlcyA9IGxpc3Qod2Fsa19yZXZjdHJsKCkpCiAgICAgICAgaWYgcmNmaWxlczoKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQocmNmaWxlcykKICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNlbGYubWFuaWZlc3QpOgogICAgICAgICAgICBzZWxmLnJlYWRfbWFuaWZlc3QoKQogICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgc2VsZi5maWxlbGlzdC5ncmFmdChlaV9jbWQuZWdnX2luZm8pCgogICAgZGVmIHBydW5lX2ZpbGVfbGlzdChzZWxmKToKICAgICAgICBidWlsZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZCcpCiAgICAgICAgYmFzZV9kaXIgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfZnVsbG5hbWUoKQogICAgICAgIHNlbGYuZmlsZWxpc3QucHJ1bmUoYnVpbGQuYnVpbGRfYmFzZSkKICAgICAgICBzZWxmLmZpbGVsaXN0LnBydW5lKGJhc2VfZGlyKQogICAgICAgIHNlcCA9IHJlLmVzY2FwZShvcy5zZXApCiAgICAgICAgc2VsZi5maWxlbGlzdC5leGNsdWRlX3BhdHRlcm4ocicoXnwnICsgc2VwICsgcicpKFJDU3xDVlN8XC5zdm4pJyArIHNlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZWdleD0xKQoKCmRlZiB3cml0ZV9maWxlKGZpbGVuYW1lLCBjb250ZW50cyk6CiAgICAiIiJDcmVhdGUgYSBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCB3cml0ZSAnY29udGVudHMnIChhCiAgICBzZXF1ZW5jZSBvZiBzdHJpbmdzIHdpdGhvdXQgbGluZSB0ZXJtaW5hdG9ycykgdG8gaXQuCiAgICAiIiIKICAgIGNvbnRlbnRzID0gIlxuIi5qb2luKGNvbnRlbnRzKQoKICAgICMgYXNzdW1pbmcgdGhlIGNvbnRlbnRzIGhhcyBiZWVuIHZldHRlZCBmb3IgdXRmLTggZW5jb2RpbmcKICAgIGNvbnRlbnRzID0gY29udGVudHMuZW5jb2RlKCJ1dGYtOCIpCgogICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAid2IiKSBhcyBmOiAgIyBhbHdheXMgd3JpdGUgUE9TSVgtc3R5bGUgbWFuaWZlc3QKICAgICAgICBmLndyaXRlKGNvbnRlbnRzKQoKCmRlZiB3cml0ZV9wa2dfaW5mbyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBsb2cuaW5mbygid3JpdGluZyAlcyIsIGZpbGVuYW1lKQogICAgaWYgbm90IGNtZC5kcnlfcnVuOgogICAgICAgIG1ldGFkYXRhID0gY21kLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YQogICAgICAgIG1ldGFkYXRhLnZlcnNpb24sIG9sZHZlciA9IGNtZC5lZ2dfdmVyc2lvbiwgbWV0YWRhdGEudmVyc2lvbgogICAgICAgIG1ldGFkYXRhLm5hbWUsIG9sZG5hbWUgPSBjbWQuZWdnX25hbWUsIG1ldGFkYXRhLm5hbWUKICAgICAgICBtZXRhZGF0YS5sb25nX2Rlc2NyaXB0aW9uX2NvbnRlbnRfdHlwZSA9IGdldGF0dHIoCiAgICAgICAgICAgIGNtZC5kaXN0cmlidXRpb24sCiAgICAgICAgICAgICdsb25nX2Rlc2NyaXB0aW9uX2NvbnRlbnRfdHlwZScKICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIHdyaXRlIHVuZXNjYXBlZCBkYXRhIHRvIFBLRy1JTkZPLCBzbyBvbGRlciBwa2dfcmVzb3VyY2VzCiAgICAgICAgICAgICMgY2FuIHN0aWxsIHBhcnNlIGl0CiAgICAgICAgICAgIG1ldGFkYXRhLndyaXRlX3BrZ19pbmZvKGNtZC5lZ2dfaW5mbykKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBtZXRhZGF0YS5uYW1lLCBtZXRhZGF0YS52ZXJzaW9uID0gb2xkbmFtZSwgb2xkdmVyCgogICAgICAgIHNhZmUgPSBnZXRhdHRyKGNtZC5kaXN0cmlidXRpb24sICd6aXBfc2FmZScsIE5vbmUpCgogICAgICAgIGJkaXN0X2VnZy53cml0ZV9zYWZldHlfZmxhZyhjbWQuZWdnX2luZm8sIHNhZmUpCgoKZGVmIHdhcm5fZGVwZW5kc19vYnNvbGV0ZShjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CiAgICAgICAgbG9nLndhcm4oCiAgICAgICAgICAgICJXQVJOSU5HOiAnZGVwZW5kcy50eHQnIGlzIG5vdCB1c2VkIGJ5IHNldHVwdG9vbHMgMC42IVxuIgogICAgICAgICAgICAiVXNlIHRoZSBpbnN0YWxsX3JlcXVpcmVzL2V4dHJhc19yZXF1aXJlIHNldHVwKCkgYXJncyBpbnN0ZWFkLiIKICAgICAgICApCgoKZGVmIF93cml0ZV9yZXF1aXJlbWVudHMoc3RyZWFtLCByZXFzKToKICAgIGxpbmVzID0geWllbGRfbGluZXMocmVxcyBvciAoKSkKICAgIGFwcGVuZF9jciA9IGxhbWJkYSBsaW5lOiBsaW5lICsgJ1xuJwogICAgbGluZXMgPSBtYXAoYXBwZW5kX2NyLCBsaW5lcykKICAgIHN0cmVhbS53cml0ZWxpbmVzKGxpbmVzKQoKCmRlZiB3cml0ZV9yZXF1aXJlbWVudHMoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgogICAgZGlzdCA9IGNtZC5kaXN0cmlidXRpb24KICAgIGRhdGEgPSBzaXguU3RyaW5nSU8oKQogICAgX3dyaXRlX3JlcXVpcmVtZW50cyhkYXRhLCBkaXN0Lmluc3RhbGxfcmVxdWlyZXMpCiAgICBleHRyYXNfcmVxdWlyZSA9IGRpc3QuZXh0cmFzX3JlcXVpcmUgb3Ige30KICAgIGZvciBleHRyYSBpbiBzb3J0ZWQoZXh0cmFzX3JlcXVpcmUpOgogICAgICAgIGRhdGEud3JpdGUoJ1xuW3tleHRyYX1dXG4nLmZvcm1hdCgqKnZhcnMoKSkpCiAgICAgICAgX3dyaXRlX3JlcXVpcmVtZW50cyhkYXRhLCBleHRyYXNfcmVxdWlyZVtleHRyYV0pCiAgICBjbWQud3JpdGVfb3JfZGVsZXRlX2ZpbGUoInJlcXVpcmVtZW50cyIsIGZpbGVuYW1lLCBkYXRhLmdldHZhbHVlKCkpCgoKZGVmIHdyaXRlX3NldHVwX3JlcXVpcmVtZW50cyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBkYXRhID0gaW8uU3RyaW5nSU8oKQogICAgX3dyaXRlX3JlcXVpcmVtZW50cyhkYXRhLCBjbWQuZGlzdHJpYnV0aW9uLnNldHVwX3JlcXVpcmVzKQogICAgY21kLndyaXRlX29yX2RlbGV0ZV9maWxlKCJzZXR1cC1yZXF1aXJlbWVudHMiLCBmaWxlbmFtZSwgZGF0YS5nZXR2YWx1ZSgpKQoKCmRlZiB3cml0ZV90b3BsZXZlbF9uYW1lcyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBwa2dzID0gZGljdC5mcm9ta2V5cygKICAgICAgICBbCiAgICAgICAgICAgIGsuc3BsaXQoJy4nLCAxKVswXQogICAgICAgICAgICBmb3IgayBpbiBjbWQuZGlzdHJpYnV0aW9uLml0ZXJfZGlzdHJpYnV0aW9uX25hbWVzKCkKICAgICAgICBdCiAgICApCiAgICBjbWQud3JpdGVfZmlsZSgidG9wLWxldmVsIG5hbWVzIiwgZmlsZW5hbWUsICdcbicuam9pbihzb3J0ZWQocGtncykpICsgJ1xuJykKCgpkZWYgb3ZlcndyaXRlX2FyZyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICB3cml0ZV9hcmcoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUsIFRydWUpCgoKZGVmIHdyaXRlX2FyZyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSwgZm9yY2U9RmFsc2UpOgogICAgYXJnbmFtZSA9IG9zLnBhdGguc3BsaXRleHQoYmFzZW5hbWUpWzBdCiAgICB2YWx1ZSA9IGdldGF0dHIoY21kLmRpc3RyaWJ1dGlvbiwgYXJnbmFtZSwgTm9uZSkKICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgIHZhbHVlID0gJ1xuJy5qb2luKHZhbHVlKSArICdcbicKICAgIGNtZC53cml0ZV9vcl9kZWxldGVfZmlsZShhcmduYW1lLCBmaWxlbmFtZSwgdmFsdWUsIGZvcmNlKQoKCmRlZiB3cml0ZV9lbnRyaWVzKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKICAgIGVwID0gY21kLmRpc3RyaWJ1dGlvbi5lbnRyeV9wb2ludHMKCiAgICBpZiBpc2luc3RhbmNlKGVwLCBzaXguc3RyaW5nX3R5cGVzKSBvciBlcCBpcyBOb25lOgogICAgICAgIGRhdGEgPSBlcAogICAgZWxpZiBlcCBpcyBub3QgTm9uZToKICAgICAgICBkYXRhID0gW10KICAgICAgICBmb3Igc2VjdGlvbiwgY29udGVudHMgaW4gc29ydGVkKGVwLml0ZW1zKCkpOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjb250ZW50cywgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICBjb250ZW50cyA9IEVudHJ5UG9pbnQucGFyc2VfZ3JvdXAoc2VjdGlvbiwgY29udGVudHMpCiAgICAgICAgICAgICAgICBjb250ZW50cyA9ICdcbicuam9pbihzb3J0ZWQobWFwKHN0ciwgY29udGVudHMudmFsdWVzKCkpKSkKICAgICAgICAgICAgZGF0YS5hcHBlbmQoJ1slc11cbiVzXG5cbicgJSAoc2VjdGlvbiwgY29udGVudHMpKQogICAgICAgIGRhdGEgPSAnJy5qb2luKGRhdGEpCgogICAgY21kLndyaXRlX29yX2RlbGV0ZV9maWxlKCdlbnRyeSBwb2ludHMnLCBmaWxlbmFtZSwgZGF0YSwgVHJ1ZSkKCgpkZWYgZ2V0X3BrZ19pbmZvX3JldmlzaW9uKCk6CiAgICAiIiIKICAgIEdldCBhIC1yIyMjIG9mZiBvZiBQS0ctSU5GTyBWZXJzaW9uIGluIGNhc2UgdGhpcyBpcyBhbiBzZGlzdCBvZgogICAgYSBzdWJ2ZXJzaW9uIHJldmlzaW9uLgogICAgIiIiCiAgICB3YXJuaW5ncy53YXJuKCJnZXRfcGtnX2luZm9fcmV2aXNpb24gaXMgZGVwcmVjYXRlZC4iLCBEZXByZWNhdGlvbldhcm5pbmcpCiAgICBpZiBvcy5wYXRoLmV4aXN0cygnUEtHLUlORk8nKToKICAgICAgICB3aXRoIGlvLm9wZW4oJ1BLRy1JTkZPJykgYXMgZjoKICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgIG1hdGNoID0gcmUubWF0Y2gociJWZXJzaW9uOi4qLXIoXGQrKVxzKiQiLCBsaW5lKQogICAgICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludChtYXRjaC5ncm91cCgxKSkKICAgIHJldHVybiAwClBLAwQUAAAAAAAAACEAjdu1P0sSAABLEgAANQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsLnB5ZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNBcmdFcnJvcgppbXBvcnQgaW5zcGVjdAppbXBvcnQgZ2xvYgppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsIGFzIG9yaWcKCmltcG9ydCBzZXR1cHRvb2xzCgojIFByaW9yIHRvIG51bXB5IDEuOSwgTnVtUHkgcmVsaWVzIG9uIHRoZSAnX2luc3RhbGwnIG5hbWUsIHNvIHByb3ZpZGUgaXQgZm9yCiMgbm93LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXMvMTk5LwpfaW5zdGFsbCA9IG9yaWcuaW5zdGFsbAoKCmNsYXNzIGluc3RhbGwob3JpZy5pbnN0YWxsKToKICAgICIiIlVzZSBlYXN5X2luc3RhbGwgdG8gaW5zdGFsbCB0aGUgcGFja2FnZSwgdy9kZXBlbmRlbmNpZXMiIiIKCiAgICB1c2VyX29wdGlvbnMgPSBvcmlnLmluc3RhbGwudXNlcl9vcHRpb25zICsgWwogICAgICAgICgnb2xkLWFuZC11bm1hbmFnZWFibGUnLCBOb25lLCAiVHJ5IG5vdCB0byB1c2UgdGhpcyEiKSwKICAgICAgICAoJ3NpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZCcsIE5vbmUsCiAgICAgICAgICJ1c2VkIGJ5IHN5c3RlbSBwYWNrYWdlIGJ1aWxkZXJzIHRvIGNyZWF0ZSAnZmxhdCcgZWdncyIpLAogICAgXQogICAgYm9vbGVhbl9vcHRpb25zID0gb3JpZy5pbnN0YWxsLmJvb2xlYW5fb3B0aW9ucyArIFsKICAgICAgICAnb2xkLWFuZC11bm1hbmFnZWFibGUnLCAnc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkJywKICAgIF0KICAgIG5ld19jb21tYW5kcyA9IFsKICAgICAgICAoJ2luc3RhbGxfZWdnX2luZm8nLCBsYW1iZGEgc2VsZjogVHJ1ZSksCiAgICAgICAgKCdpbnN0YWxsX3NjcmlwdHMnLCBsYW1iZGEgc2VsZjogVHJ1ZSksCiAgICBdCiAgICBfbmMgPSBkaWN0KG5ld19jb21tYW5kcykKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9yaWcuaW5zdGFsbC5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLm9sZF9hbmRfdW5tYW5hZ2VhYmxlID0gTm9uZQogICAgICAgIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9yaWcuaW5zdGFsbC5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgaWYgc2VsZi5yb290OgogICAgICAgICAgICBzZWxmLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZCA9IFRydWUKICAgICAgICBlbGlmIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5yb290IGFuZCBub3Qgc2VsZi5yZWNvcmQ6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKICAgICAgICAgICAgICAgICAgICAiWW91IG11c3Qgc3BlY2lmeSAtLXJlY29yZCBvciAtLXJvb3Qgd2hlbiBidWlsZGluZyBzeXN0ZW0iCiAgICAgICAgICAgICAgICAgICAgIiBwYWNrYWdlcyIKICAgICAgICAgICAgICAgICkKCiAgICBkZWYgaGFuZGxlX2V4dHJhX3BhdGgoc2VsZik6CiAgICAgICAgaWYgc2VsZi5yb290IG9yIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkOgogICAgICAgICAgICAjIGV4cGxpY2l0IGJhY2t3YXJkLWNvbXBhdGliaWxpdHkgbW9kZSwgYWxsb3cgZXh0cmFfcGF0aCB0byB3b3JrCiAgICAgICAgICAgIHJldHVybiBvcmlnLmluc3RhbGwuaGFuZGxlX2V4dHJhX3BhdGgoc2VsZikKCiAgICAgICAgIyBJZ25vcmUgZXh0cmFfcGF0aCB3aGVuIGluc3RhbGxpbmcgYW4gZWdnIChvciBiZWluZyBydW4gYnkgYW5vdGhlcgogICAgICAgICMgY29tbWFuZCB3aXRob3V0IC0tcm9vdCBvciAtLXNpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZAogICAgICAgIHNlbGYucGF0aF9maWxlID0gTm9uZQogICAgICAgIHNlbGYuZXh0cmFfZGlycyA9ICcnCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAjIEV4cGxpY2l0IHJlcXVlc3QgZm9yIG9sZC1zdHlsZSBpbnN0YWxsPyAgSnVzdCBkbyBpdAogICAgICAgIGlmIHNlbGYub2xkX2FuZF91bm1hbmFnZWFibGUgb3Igc2VsZi5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQ6CiAgICAgICAgICAgIHJldHVybiBvcmlnLmluc3RhbGwucnVuKHNlbGYpCgogICAgICAgIGlmIG5vdCBzZWxmLl9jYWxsZWRfZnJvbV9zZXR1cChpbnNwZWN0LmN1cnJlbnRmcmFtZSgpKToKICAgICAgICAgICAgIyBSdW4gaW4gYmFja3dhcmQtY29tcGF0aWJpbGl0eSBtb2RlIHRvIHN1cHBvcnQgYmRpc3RfKiBjb21tYW5kcy4KICAgICAgICAgICAgb3JpZy5pbnN0YWxsLnJ1bihzZWxmKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZG9fZWdnX2luc3RhbGwoKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfY2FsbGVkX2Zyb21fc2V0dXAocnVuX2ZyYW1lKToKICAgICAgICAiIiIKICAgICAgICBBdHRlbXB0IHRvIGRldGVjdCB3aGV0aGVyIHJ1bigpIHdhcyBjYWxsZWQgZnJvbSBzZXR1cCgpIG9yIGJ5IGFub3RoZXIKICAgICAgICBjb21tYW5kLiAgSWYgY2FsbGVkIGJ5IHNldHVwKCksIHRoZSBwYXJlbnQgY2FsbGVyIHdpbGwgYmUgdGhlCiAgICAgICAgJ3J1bl9jb21tYW5kJyBtZXRob2QgaW4gJ2Rpc3R1dGlscy5kaXN0JywgYW5kICppdHMqIGNhbGxlciB3aWxsIGJlCiAgICAgICAgdGhlICdydW5fY29tbWFuZHMnIG1ldGhvZC4gIElmIGNhbGxlZCBhbnkgb3RoZXIgd2F5LCB0aGUKICAgICAgICBpbW1lZGlhdGUgY2FsbGVyICptaWdodCogYmUgJ3J1bl9jb21tYW5kJywgYnV0IGl0IHdvbid0IGhhdmUgYmVlbgogICAgICAgIGNhbGxlZCBieSAncnVuX2NvbW1hbmRzJy4gUmV0dXJuIFRydWUgaW4gdGhhdCBjYXNlIG9yIGlmIGEgY2FsbCBzdGFjawogICAgICAgIGlzIHVuYXZhaWxhYmxlLiBSZXR1cm4gRmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICIiIgogICAgICAgIGlmIHJ1bl9mcmFtZSBpcyBOb25lOgogICAgICAgICAgICBtc2cgPSAiQ2FsbCBzdGFjayBub3QgYXZhaWxhYmxlLiBiZGlzdF8qIGNvbW1hbmRzIG1heSBmYWlsLiIKICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2cpCiAgICAgICAgICAgIGlmIHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpID09ICdJcm9uUHl0aG9uJzoKICAgICAgICAgICAgICAgIG1zZyA9ICJGb3IgYmVzdCByZXN1bHRzLCBwYXNzIC1YOkZyYW1lcyB0byBlbmFibGUgY2FsbCBzdGFjay4iCiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZykKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXMgPSBpbnNwZWN0LmdldG91dGVyZnJhbWVzKHJ1bl9mcmFtZSlbMl0KICAgICAgICBjYWxsZXIsID0gcmVzWzoxXQogICAgICAgIGluZm8gPSBpbnNwZWN0LmdldGZyYW1laW5mbyhjYWxsZXIpCiAgICAgICAgY2FsbGVyX21vZHVsZSA9IGNhbGxlci5mX2dsb2JhbHMuZ2V0KCdfX25hbWVfXycsICcnKQogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIGNhbGxlcl9tb2R1bGUgPT0gJ2Rpc3R1dGlscy5kaXN0JwogICAgICAgICAgICBhbmQgaW5mby5mdW5jdGlvbiA9PSAncnVuX2NvbW1hbmRzJwogICAgICAgICkKCiAgICBkZWYgZG9fZWdnX2luc3RhbGwoc2VsZik6CgogICAgICAgIGVhc3lfaW5zdGFsbCA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9jb21tYW5kX2NsYXNzKCdlYXN5X2luc3RhbGwnKQoKICAgICAgICBjbWQgPSBlYXN5X2luc3RhbGwoCiAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLCBhcmdzPSJ4Iiwgcm9vdD1zZWxmLnJvb3QsIHJlY29yZD1zZWxmLnJlY29yZCwKICAgICAgICApCiAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKSAgIyBmaW5hbGl6ZSBiZWZvcmUgYmRpc3RfZWdnIG11bmdlcyBpbnN0YWxsIGNtZAogICAgICAgIGNtZC5hbHdheXNfY29weV9mcm9tID0gJy4nICAjIG1ha2Ugc3VyZSBsb2NhbC1kaXIgZWdncyBnZXQgaW5zdGFsbGVkCgogICAgICAgICMgcGljayB1cCBzZXR1cC1kaXIgLmVnZyBmaWxlcyBvbmx5OiBubyAuZWdnLWluZm8KICAgICAgICBjbWQucGFja2FnZV9pbmRleC5zY2FuKGdsb2IuZ2xvYignKi5lZ2cnKSkKCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYmRpc3RfZWdnJykKICAgICAgICBhcmdzID0gW3NlbGYuZGlzdHJpYnV0aW9uLmdldF9jb21tYW5kX29iaignYmRpc3RfZWdnJykuZWdnX291dHB1dF0KCiAgICAgICAgaWYgc2V0dXB0b29scy5ib290c3RyYXBfaW5zdGFsbF9mcm9tOgogICAgICAgICAgICAjIEJvb3RzdHJhcCBzZWxmLWluc3RhbGxhdGlvbiBvZiBzZXR1cHRvb2xzCiAgICAgICAgICAgIGFyZ3MuaW5zZXJ0KDAsIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbSkKCiAgICAgICAgY21kLmFyZ3MgPSBhcmdzCiAgICAgICAgY21kLnJ1bigpCiAgICAgICAgc2V0dXB0b29scy5ib290c3RyYXBfaW5zdGFsbF9mcm9tID0gTm9uZQoKCiMgWFhYIFB5dGhvbiAzLjEgZG9lc24ndCBzZWUgX25jIGlmIHRoaXMgaXMgaW5zaWRlIHRoZSBjbGFzcwppbnN0YWxsLnN1Yl9jb21tYW5kcyA9ICgKICAgIFtjbWQgZm9yIGNtZCBpbiBvcmlnLmluc3RhbGwuc3ViX2NvbW1hbmRzIGlmIGNtZFswXSBub3QgaW4gaW5zdGFsbC5fbmNdICsKICAgIGluc3RhbGwubmV3X2NvbW1hbmRzCikKUEsDBBQAAAAAAAAAIQBc0qjlmwgAAJsIAAA+AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHlmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nLCBkaXJfdXRpbAppbXBvcnQgb3MKCmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZApmcm9tIHNldHVwdG9vbHMgaW1wb3J0IG5hbWVzcGFjZXMKZnJvbSBzZXR1cHRvb2xzLmFyY2hpdmVfdXRpbCBpbXBvcnQgdW5wYWNrX2FyY2hpdmUKaW1wb3J0IHBrZ19yZXNvdXJjZXMKCgpjbGFzcyBpbnN0YWxsX2VnZ19pbmZvKG5hbWVzcGFjZXMuSW5zdGFsbGVyLCBDb21tYW5kKToKICAgICIiIkluc3RhbGwgYW4gLmVnZy1pbmZvIGRpcmVjdG9yeSBmb3IgdGhlIHBhY2thZ2UiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJJbnN0YWxsIGFuIC5lZ2ctaW5mbyBkaXJlY3RvcnkgZm9yIHRoZSBwYWNrYWdlIgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2luc3RhbGwtZGlyPScsICdkJywgImRpcmVjdG9yeSB0byBpbnN0YWxsIHRvIiksCiAgICBdCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsX2xpYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdpbnN0YWxsX2RpcicsICdpbnN0YWxsX2RpcicpKQogICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgYmFzZW5hbWUgPSBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbigKICAgICAgICAgICAgTm9uZSwgTm9uZSwgZWlfY21kLmVnZ19uYW1lLCBlaV9jbWQuZWdnX3ZlcnNpb24KICAgICAgICApLmVnZ19uYW1lKCkgKyAnLmVnZy1pbmZvJwogICAgICAgIHNlbGYuc291cmNlID0gZWlfY21kLmVnZ19pbmZvCiAgICAgICAgc2VsZi50YXJnZXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgYmFzZW5hbWUpCiAgICAgICAgc2VsZi5vdXRwdXRzID0gW10KCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHNlbGYudGFyZ2V0KSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKHNlbGYudGFyZ2V0KToKICAgICAgICAgICAgZGlyX3V0aWwucmVtb3ZlX3RyZWUoc2VsZi50YXJnZXQsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc2VsZi50YXJnZXQpOgogICAgICAgICAgICBzZWxmLmV4ZWN1dGUob3MudW5saW5rLCAoc2VsZi50YXJnZXQsKSwgIlJlbW92aW5nICIgKyBzZWxmLnRhcmdldCkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLmVuc3VyZV9kaXJlY3Rvcnkoc2VsZi50YXJnZXQpCiAgICAgICAgc2VsZi5leGVjdXRlKAogICAgICAgICAgICBzZWxmLmNvcHl0cmVlLCAoKSwgIkNvcHlpbmcgJXMgdG8gJXMiICUgKHNlbGYuc291cmNlLCBzZWxmLnRhcmdldCkKICAgICAgICApCiAgICAgICAgc2VsZi5pbnN0YWxsX25hbWVzcGFjZXMoKQoKICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5vdXRwdXRzCgogICAgZGVmIGNvcHl0cmVlKHNlbGYpOgogICAgICAgICMgQ29weSB0aGUgLmVnZy1pbmZvIHRyZWUgdG8gc2l0ZS1wYWNrYWdlcwogICAgICAgIGRlZiBza2ltbWVyKHNyYywgZHN0KToKICAgICAgICAgICAgIyBmaWx0ZXIgb3V0IHNvdXJjZS1jb250cm9sIGRpcmVjdG9yaWVzOyBub3RlIHRoYXQgJ3NyYycgaXMgYWx3YXlzCiAgICAgICAgICAgICMgYSAnLyctc2VwYXJhdGVkIHBhdGgsIHJlZ2FyZGxlc3Mgb2YgcGxhdGZvcm0uICAnZHN0JyBpcyBhCiAgICAgICAgICAgICMgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aC4KICAgICAgICAgICAgZm9yIHNraXAgaW4gJy5zdm4vJywgJ0NWUy8nOgogICAgICAgICAgICAgICAgaWYgc3JjLnN0YXJ0c3dpdGgoc2tpcCkgb3IgJy8nICsgc2tpcCBpbiBzcmM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgc2VsZi5vdXRwdXRzLmFwcGVuZChkc3QpCiAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29weWluZyAlcyB0byAlcyIsIHNyYywgZHN0KQogICAgICAgICAgICByZXR1cm4gZHN0CgogICAgICAgIHVucGFja19hcmNoaXZlKHNlbGYuc291cmNlLCBzZWxmLnRhcmdldCwgc2tpbW1lcikKUEsDBBQAAAAAAAAAIQCQnDtTAA8AAAAPAAA5AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfbGliLnB5aW1wb3J0IG9zCmltcG9ydCBpbXAKZnJvbSBpdGVydG9vbHMgaW1wb3J0IHByb2R1Y3QsIHN0YXJtYXAKaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfbGliIGFzIG9yaWcKCgpjbGFzcyBpbnN0YWxsX2xpYihvcmlnLmluc3RhbGxfbGliKToKICAgICIiIkRvbid0IGFkZCBjb21waWxlZCBmbGFncyB0byBmaWxlbmFtZXMgb2Ygbm9uLVB5dGhvbiBmaWxlcyIiIgoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5idWlsZCgpCiAgICAgICAgb3V0ZmlsZXMgPSBzZWxmLmluc3RhbGwoKQogICAgICAgIGlmIG91dGZpbGVzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAjIGFsd2F5cyBjb21waWxlLCBpbiBjYXNlIHdlIGhhdmUgYW55IGV4dGVuc2lvbiBzdHVicyB0byBkZWFsIHdpdGgKICAgICAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUob3V0ZmlsZXMpCgogICAgZGVmIGdldF9leGNsdXNpb25zKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIGNvbGxlY3Rpb25zLlNpemVkIGNvbGxlY3Rpb25zLkNvbnRhaW5lciBvZiBwYXRocyB0byBiZQogICAgICAgIGV4Y2x1ZGVkIGZvciBzaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQgaW5zdGFsbGF0aW9ucy4KICAgICAgICAiIiIKICAgICAgICBhbGxfcGFja2FnZXMgPSAoCiAgICAgICAgICAgIHBrZwogICAgICAgICAgICBmb3IgbnNfcGtnIGluIHNlbGYuX2dldF9TVkVNX05TUHMoKQogICAgICAgICAgICBmb3IgcGtnIGluIHNlbGYuX2FsbF9wYWNrYWdlcyhuc19wa2cpCiAgICAgICAgKQoKICAgICAgICBleGNsX3NwZWNzID0gcHJvZHVjdChhbGxfcGFja2FnZXMsIHNlbGYuX2dlbl9leGNsdXNpb25fcGF0aHMoKSkKICAgICAgICByZXR1cm4gc2V0KHN0YXJtYXAoc2VsZi5fZXhjbHVkZV9wa2dfcGF0aCwgZXhjbF9zcGVjcykpCgogICAgZGVmIF9leGNsdWRlX3BrZ19wYXRoKHNlbGYsIHBrZywgZXhjbHVzaW9uX3BhdGgpOgogICAgICAgICIiIgogICAgICAgIEdpdmVuIGEgcGFja2FnZSBuYW1lIGFuZCBleGNsdXNpb24gcGF0aCB3aXRoaW4gdGhhdCBwYWNrYWdlLAogICAgICAgIGNvbXB1dGUgdGhlIGZ1bGwgZXhjbHVzaW9uIHBhdGguCiAgICAgICAgIiIiCiAgICAgICAgcGFydHMgPSBwa2cuc3BsaXQoJy4nKSArIFtleGNsdXNpb25fcGF0aF0KICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsICpwYXJ0cykKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2FsbF9wYWNrYWdlcyhwa2dfbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgPj4+IGxpc3QoaW5zdGFsbF9saWIuX2FsbF9wYWNrYWdlcygnZm9vLmJhci5iYXonKSkKICAgICAgICBbJ2Zvby5iYXIuYmF6JywgJ2Zvby5iYXInLCAnZm9vJ10KICAgICAgICAiIiIKICAgICAgICB3aGlsZSBwa2dfbmFtZToKICAgICAgICAgICAgeWllbGQgcGtnX25hbWUKICAgICAgICAgICAgcGtnX25hbWUsIHNlcCwgY2hpbGQgPSBwa2dfbmFtZS5ycGFydGl0aW9uKCcuJykKCiAgICBkZWYgX2dldF9TVkVNX05TUHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IG5hbWVzcGFjZSBwYWNrYWdlcyAobGlzdCkgYnV0IG9ubHkgZm9yCiAgICAgICAgc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkIGluc3RhbGxhdGlvbnMgYW5kIGVtcHR5IG90aGVyd2lzZS4KICAgICAgICAiIiIKICAgICAgICAjIFRPRE86IGlzIGl0IG5lY2Vzc2FyeSB0byBzaG9ydC1jaXJjdWl0IGhlcmU/IGkuZS4gd2hhdCdzIHRoZSBjb3N0CiAgICAgICAgIyBpZiBnZXRfZmluYWxpemVkX2NvbW1hbmQgaXMgY2FsbGVkIGV2ZW4gd2hlbiBuYW1lc3BhY2VfcGFja2FnZXMgaXMKICAgICAgICAjIEZhbHNlPwogICAgICAgIGlmIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICBpbnN0YWxsX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsJykKICAgICAgICBzdmVtID0gaW5zdGFsbF9jbWQuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkCgogICAgICAgIHJldHVybiBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXMgaWYgc3ZlbSBlbHNlIFtdCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9nZW5fZXhjbHVzaW9uX3BhdGhzKCk6CiAgICAgICAgIiIiCiAgICAgICAgR2VuZXJhdGUgZmlsZSBwYXRocyB0byBiZSBleGNsdWRlZCBmb3IgbmFtZXNwYWNlIHBhY2thZ2VzIChieXRlY29kZQogICAgICAgIGNhY2hlIGZpbGVzKS4KICAgICAgICAiIiIKICAgICAgICAjIGFsd2F5cyBleGNsdWRlIHRoZSBwYWNrYWdlIG1vZHVsZSBpdHNlbGYKICAgICAgICB5aWVsZCAnX19pbml0X18ucHknCgogICAgICAgIHlpZWxkICdfX2luaXRfXy5weWMnCiAgICAgICAgeWllbGQgJ19faW5pdF9fLnB5bycKCiAgICAgICAgaWYgbm90IGhhc2F0dHIoaW1wLCAnZ2V0X3RhZycpOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgYmFzZSA9IG9zLnBhdGguam9pbignX19weWNhY2hlX18nLCAnX19pbml0X18uJyArIGltcC5nZXRfdGFnKCkpCiAgICAgICAgeWllbGQgYmFzZSArICcucHljJwogICAgICAgIHlpZWxkIGJhc2UgKyAnLnB5bycKICAgICAgICB5aWVsZCBiYXNlICsgJy5vcHQtMS5weWMnCiAgICAgICAgeWllbGQgYmFzZSArICcub3B0LTIucHljJwoKICAgIGRlZiBjb3B5X3RyZWUoCiAgICAgICAgICAgIHNlbGYsIGluZmlsZSwgb3V0ZmlsZSwKICAgICAgICAgICAgcHJlc2VydmVfbW9kZT0xLCBwcmVzZXJ2ZV90aW1lcz0xLCBwcmVzZXJ2ZV9zeW1saW5rcz0wLCBsZXZlbD0xCiAgICApOgogICAgICAgIGFzc2VydCBwcmVzZXJ2ZV9tb2RlIGFuZCBwcmVzZXJ2ZV90aW1lcyBhbmQgbm90IHByZXNlcnZlX3N5bWxpbmtzCiAgICAgICAgZXhjbHVkZSA9IHNlbGYuZ2V0X2V4Y2x1c2lvbnMoKQoKICAgICAgICBpZiBub3QgZXhjbHVkZToKICAgICAgICAgICAgcmV0dXJuIG9yaWcuaW5zdGFsbF9saWIuY29weV90cmVlKHNlbGYsIGluZmlsZSwgb3V0ZmlsZSkKCiAgICAgICAgIyBFeGNsdWRlIG5hbWVzcGFjZSBwYWNrYWdlIF9faW5pdF9fLnB5KiBmaWxlcyBmcm9tIHRoZSBvdXRwdXQKCiAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmFyY2hpdmVfdXRpbCBpbXBvcnQgdW5wYWNrX2RpcmVjdG9yeQogICAgICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKCiAgICAgICAgb3V0ZmlsZXMgPSBbXQoKICAgICAgICBkZWYgcGYoc3JjLCBkc3QpOgogICAgICAgICAgICBpZiBkc3QgaW4gZXhjbHVkZToKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJTa2lwcGluZyBpbnN0YWxsYXRpb24gb2YgJXMgKG5hbWVzcGFjZSBwYWNrYWdlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBkc3QpCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgICAgIGxvZy5pbmZvKCJjb3B5aW5nICVzIC0+ICVzIiwgc3JjLCBvcy5wYXRoLmRpcm5hbWUoZHN0KSkKICAgICAgICAgICAgb3V0ZmlsZXMuYXBwZW5kKGRzdCkKICAgICAgICAgICAgcmV0dXJuIGRzdAoKICAgICAgICB1bnBhY2tfZGlyZWN0b3J5KGluZmlsZSwgb3V0ZmlsZSwgcGYpCiAgICAgICAgcmV0dXJuIG91dGZpbGVzCgogICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgogICAgICAgIG91dHB1dHMgPSBvcmlnLmluc3RhbGxfbGliLmdldF9vdXRwdXRzKHNlbGYpCiAgICAgICAgZXhjbHVkZSA9IHNlbGYuZ2V0X2V4Y2x1c2lvbnMoKQogICAgICAgIGlmIGV4Y2x1ZGU6CiAgICAgICAgICAgIHJldHVybiBbZiBmb3IgZiBpbiBvdXRwdXRzIGlmIGYgbm90IGluIGV4Y2x1ZGVdCiAgICAgICAgcmV0dXJuIG91dHB1dHMKUEsDBBQAAAAAAAAAIQBGP/EehwkAAIcJAAA9AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weWZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfc2NyaXB0cyBhcyBvcmlnCmltcG9ydCBvcwppbXBvcnQgc3lzCgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IERpc3RyaWJ1dGlvbiwgUGF0aE1ldGFkYXRhLCBlbnN1cmVfZGlyZWN0b3J5CgoKY2xhc3MgaW5zdGFsbF9zY3JpcHRzKG9yaWcuaW5zdGFsbF9zY3JpcHRzKToKICAgICIiIkRvIG5vcm1hbCBzY3JpcHQgaW5zdGFsbCwgcGx1cyBhbnkgZWdnX2luZm8gd3JhcHBlciBzY3JpcHRzIiIiCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcmlnLmluc3RhbGxfc2NyaXB0cy5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLm5vX2VwID0gRmFsc2UKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIGltcG9ydCBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGFzIGVpCgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzOgogICAgICAgICAgICBvcmlnLmluc3RhbGxfc2NyaXB0cy5ydW4oc2VsZikgICMgcnVuIGZpcnN0IHRvIHNldCB1cCBzZWxmLm91dGZpbGVzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5vdXRmaWxlcyA9IFtdCiAgICAgICAgaWYgc2VsZi5ub19lcDoKICAgICAgICAgICAgIyBkb24ndCBpbnN0YWxsIGVudHJ5IHBvaW50IHNjcmlwdHMgaW50byAuZWdnIGZpbGUhCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oCiAgICAgICAgICAgIGVpX2NtZC5lZ2dfYmFzZSwgUGF0aE1ldGFkYXRhKGVpX2NtZC5lZ2dfYmFzZSwgZWlfY21kLmVnZ19pbmZvKSwKICAgICAgICAgICAgZWlfY21kLmVnZ19uYW1lLCBlaV9jbWQuZWdnX3ZlcnNpb24sCiAgICAgICAgKQogICAgICAgIGJzX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9zY3JpcHRzJykKICAgICAgICBleGVjX3BhcmFtID0gZ2V0YXR0cihic19jbWQsICdleGVjdXRhYmxlJywgTm9uZSkKICAgICAgICBid19jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiYmRpc3Rfd2luaW5zdCIpCiAgICAgICAgaXNfd2luaW5zdCA9IGdldGF0dHIoYndfY21kLCAnX2lzX3J1bm5pbmcnLCBGYWxzZSkKICAgICAgICB3cml0ZXIgPSBlaS5TY3JpcHRXcml0ZXIKICAgICAgICBpZiBpc193aW5pbnN0OgogICAgICAgICAgICBleGVjX3BhcmFtID0gInB5dGhvbi5leGUiCiAgICAgICAgICAgIHdyaXRlciA9IGVpLldpbmRvd3NTY3JpcHRXcml0ZXIKICAgICAgICBpZiBleGVjX3BhcmFtID09IHN5cy5leGVjdXRhYmxlOgogICAgICAgICAgICAjIEluIGNhc2UgdGhlIHBhdGggdG8gdGhlIFB5dGhvbiBleGVjdXRhYmxlIGNvbnRhaW5zIGEgc3BhY2UsIHdyYXAKICAgICAgICAgICAgIyBpdCBzbyBpdCdzIG5vdCBzcGxpdCB1cC4KICAgICAgICAgICAgZXhlY19wYXJhbSA9IFtleGVjX3BhcmFtXQogICAgICAgICMgcmVzb2x2ZSB0aGUgd3JpdGVyIHRvIHRoZSBlbnZpcm9ubWVudAogICAgICAgIHdyaXRlciA9IHdyaXRlci5iZXN0KCkKICAgICAgICBjbWQgPSB3cml0ZXIuY29tbWFuZF9zcGVjX2NsYXNzLmJlc3QoKS5mcm9tX3BhcmFtKGV4ZWNfcGFyYW0pCiAgICAgICAgZm9yIGFyZ3MgaW4gd3JpdGVyLmdldF9hcmdzKGRpc3QsIGNtZC5hc19oZWFkZXIoKSk6CiAgICAgICAgICAgIHNlbGYud3JpdGVfc2NyaXB0KCphcmdzKQoKICAgIGRlZiB3cml0ZV9zY3JpcHQoc2VsZiwgc2NyaXB0X25hbWUsIGNvbnRlbnRzLCBtb2RlPSJ0IiwgKmlnbm9yZWQpOgogICAgICAgICIiIldyaXRlIGFuIGV4ZWN1dGFibGUgZmlsZSB0byB0aGUgc2NyaXB0cyBkaXJlY3RvcnkiIiIKICAgICAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IGNobW9kLCBjdXJyZW50X3VtYXNrCgogICAgICAgIGxvZy5pbmZvKCJJbnN0YWxsaW5nICVzIHNjcmlwdCB0byAlcyIsIHNjcmlwdF9uYW1lLCBzZWxmLmluc3RhbGxfZGlyKQogICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCBzY3JpcHRfbmFtZSkKICAgICAgICBzZWxmLm91dGZpbGVzLmFwcGVuZCh0YXJnZXQpCgogICAgICAgIG1hc2sgPSBjdXJyZW50X3VtYXNrKCkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKICAgICAgICAgICAgZiA9IG9wZW4odGFyZ2V0LCAidyIgKyBtb2RlKQogICAgICAgICAgICBmLndyaXRlKGNvbnRlbnRzKQogICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgY2htb2QodGFyZ2V0LCAwbzc3NyAtIG1hc2spClBLAwQUAAAAAAAAACEAfXNgv3oTAAB6EwAAOAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9weTM2Y29tcGF0LnB5aW1wb3J0IG9zCmZyb20gZ2xvYiBpbXBvcnQgZ2xvYgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKZnJvbSBkaXN0dXRpbHMuY29tbWFuZCBpbXBvcnQgc2Rpc3QKCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBmaWx0ZXIKCgpjbGFzcyBzZGlzdF9hZGRfZGVmYXVsdHM6CiAgICAiIiIKICAgIE1peC1pbiBwcm92aWRpbmcgZm9yd2FyZC1jb21wYXRpYmlsaXR5IGZvciBmdW5jdGlvbmFsaXR5IGFzIGZvdW5kIGluCiAgICBkaXN0dXRpbHMgb24gUHl0aG9uIDMuNy4KCiAgICBEbyBub3QgZWRpdCB0aGUgY29kZSBpbiB0aGlzIGNsYXNzIGV4Y2VwdCB0byB1cGRhdGUgZnVuY3Rpb25hbGl0eQogICAgYXMgaW1wbGVtZW50ZWQgaW4gZGlzdHV0aWxzLiBJbnN0ZWFkLCBvdmVycmlkZSBpbiB0aGUgc3ViY2xhc3MuCiAgICAiIiIKCiAgICBkZWYgYWRkX2RlZmF1bHRzKHNlbGYpOgogICAgICAgICIiIkFkZCBhbGwgdGhlIGRlZmF1bHQgZmlsZXMgdG8gc2VsZi5maWxlbGlzdDoKICAgICAgICAgIC0gUkVBRE1FIG9yIFJFQURNRS50eHQKICAgICAgICAgIC0gc2V0dXAucHkKICAgICAgICAgIC0gdGVzdC90ZXN0Ki5weQogICAgICAgICAgLSBhbGwgcHVyZSBQeXRob24gbW9kdWxlcyBtZW50aW9uZWQgaW4gc2V0dXAgc2NyaXB0CiAgICAgICAgICAtIGFsbCBmaWxlcyBwb2ludGVkIGJ5IHBhY2thZ2VfZGF0YSAoYnVpbGRfcHkpCiAgICAgICAgICAtIGFsbCBmaWxlcyBkZWZpbmVkIGluIGRhdGFfZmlsZXMuCiAgICAgICAgICAtIGFsbCBmaWxlcyBkZWZpbmVkIGFzIHNjcmlwdHMuCiAgICAgICAgICAtIGFsbCBDIHNvdXJjZXMgbGlzdGVkIGFzIHBhcnQgb2YgZXh0ZW5zaW9ucyBvciBDIGxpYnJhcmllcwogICAgICAgICAgICBpbiB0aGUgc2V0dXAgc2NyaXB0IChkb2Vzbid0IGNhdGNoIEMgaGVhZGVycyEpCiAgICAgICAgV2FybnMgaWYgKFJFQURNRSBvciBSRUFETUUudHh0KSBvciBzZXR1cC5weSBhcmUgbWlzc2luZzsgZXZlcnl0aGluZwogICAgICAgIGVsc2UgaXMgb3B0aW9uYWwuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fYWRkX2RlZmF1bHRzX3N0YW5kYXJkcygpCiAgICAgICAgc2VsZi5fYWRkX2RlZmF1bHRzX29wdGlvbmFsKCkKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfcHl0aG9uKCkKICAgICAgICBzZWxmLl9hZGRfZGVmYXVsdHNfZGF0YV9maWxlcygpCiAgICAgICAgc2VsZi5fYWRkX2RlZmF1bHRzX2V4dCgpCiAgICAgICAgc2VsZi5fYWRkX2RlZmF1bHRzX2NfbGlicygpCiAgICAgICAgc2VsZi5fYWRkX2RlZmF1bHRzX3NjcmlwdHMoKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfY3NfcGF0aF9leGlzdHMoZnNwYXRoKToKICAgICAgICAiIiIKICAgICAgICBDYXNlLXNlbnNpdGl2ZSBwYXRoIGV4aXN0ZW5jZSBjaGVjawoKICAgICAgICA+Pj4gc2Rpc3RfYWRkX2RlZmF1bHRzLl9jc19wYXRoX2V4aXN0cyhfX2ZpbGVfXykKICAgICAgICBUcnVlCiAgICAgICAgPj4+IHNkaXN0X2FkZF9kZWZhdWx0cy5fY3NfcGF0aF9leGlzdHMoX19maWxlX18udXBwZXIoKSkKICAgICAgICBGYWxzZQogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmc3BhdGgpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAjIG1ha2UgYWJzb2x1dGUgc28gd2UgYWx3YXlzIGhhdmUgYSBkaXJlY3RvcnkKICAgICAgICBhYnNwYXRoID0gb3MucGF0aC5hYnNwYXRoKGZzcGF0aCkKICAgICAgICBkaXJlY3RvcnksIGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChhYnNwYXRoKQogICAgICAgIHJldHVybiBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSkKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19zdGFuZGFyZHMoc2VsZik6CiAgICAgICAgc3RhbmRhcmRzID0gW3NlbGYuUkVBRE1FUywgc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0X25hbWVdCiAgICAgICAgZm9yIGZuIGluIHN0YW5kYXJkczoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmbiwgdHVwbGUpOgogICAgICAgICAgICAgICAgYWx0cyA9IGZuCiAgICAgICAgICAgICAgICBnb3RfaXQgPSBGYWxzZQogICAgICAgICAgICAgICAgZm9yIGZuIGluIGFsdHM6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fY3NfcGF0aF9leGlzdHMoZm4pOgogICAgICAgICAgICAgICAgICAgICAgICBnb3RfaXQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKGZuKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAgICAgICAgIGlmIG5vdCBnb3RfaXQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuKCJzdGFuZGFyZCBmaWxlIG5vdCBmb3VuZDogc2hvdWxkIGhhdmUgb25lIG9mICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCAnLmpvaW4oYWx0cykpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBzZWxmLl9jc19wYXRoX2V4aXN0cyhmbik6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoZm4pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYud2Fybigic3RhbmRhcmQgZmlsZSAnJXMnIG5vdCBmb3VuZCIgJSBmbikKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19vcHRpb25hbChzZWxmKToKICAgICAgICBvcHRpb25hbCA9IFsndGVzdC90ZXN0Ki5weScsICdzZXR1cC5jZmcnXQogICAgICAgIGZvciBwYXR0ZXJuIGluIG9wdGlvbmFsOgogICAgICAgICAgICBmaWxlcyA9IGZpbHRlcihvcy5wYXRoLmlzZmlsZSwgZ2xvYihwYXR0ZXJuKSkKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoZmlsZXMpCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfcHl0aG9uKHNlbGYpOgogICAgICAgICMgYnVpbGRfcHkgaXMgdXNlZCB0byBnZXQ6CiAgICAgICAgIyAgLSBweXRob24gbW9kdWxlcwogICAgICAgICMgIC0gZmlsZXMgZGVmaW5lZCBpbiBwYWNrYWdlX2RhdGEKICAgICAgICBidWlsZF9weSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpCgogICAgICAgICMgZ2V0dGluZyBweXRob24gZmlsZXMKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfcHVyZV9tb2R1bGVzKCk6CiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKGJ1aWxkX3B5LmdldF9zb3VyY2VfZmlsZXMoKSkKCiAgICAgICAgIyBnZXR0aW5nIHBhY2thZ2VfZGF0YSBmaWxlcwogICAgICAgICMgKGNvbXB1dGVkIGluIGJ1aWxkX3B5LmRhdGFfZmlsZXMgYnkgYnVpbGRfcHkuZmluYWxpemVfb3B0aW9ucykKICAgICAgICBmb3IgcGtnLCBzcmNfZGlyLCBidWlsZF9kaXIsIGZpbGVuYW1lcyBpbiBidWlsZF9weS5kYXRhX2ZpbGVzOgogICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQob3MucGF0aC5qb2luKHNyY19kaXIsIGZpbGVuYW1lKSkKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19kYXRhX2ZpbGVzKHNlbGYpOgogICAgICAgICMgZ2V0dGluZyBkaXN0cmlidXRpb24uZGF0YV9maWxlcwogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19kYXRhX2ZpbGVzKCk6CiAgICAgICAgICAgIGZvciBpdGVtIGluIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXM6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIHN0cik6CiAgICAgICAgICAgICAgICAgICAgIyBwbGFpbiBmaWxlCiAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGNvbnZlcnRfcGF0aChpdGVtKQogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGl0ZW0pOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChpdGVtKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIGEgKGRpcm5hbWUsIGZpbGVuYW1lcykgdHVwbGUKICAgICAgICAgICAgICAgICAgICBkaXJuYW1lLCBmaWxlbmFtZXMgPSBpdGVtCiAgICAgICAgICAgICAgICAgICAgZm9yIGYgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICAgICAgICAgICAgICBmID0gY29udmVydF9wYXRoKGYpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGYpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoZikKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19leHQoc2VsZik6CiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCk6CiAgICAgICAgICAgIGJ1aWxkX2V4dCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9leHQnKQogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChidWlsZF9leHQuZ2V0X3NvdXJjZV9maWxlcygpKQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX2NfbGlicyhzZWxmKToKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfY19saWJyYXJpZXMoKToKICAgICAgICAgICAgYnVpbGRfY2xpYiA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9jbGliJykKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoYnVpbGRfY2xpYi5nZXRfc291cmNlX2ZpbGVzKCkpCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfc2NyaXB0cyhzZWxmKToKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfc2NyaXB0cygpOgogICAgICAgICAgICBidWlsZF9zY3JpcHRzID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3NjcmlwdHMnKQogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChidWlsZF9zY3JpcHRzLmdldF9zb3VyY2VfZmlsZXMoKSkKCgppZiBoYXNhdHRyKHNkaXN0LnNkaXN0LCAnX2FkZF9kZWZhdWx0c19zdGFuZGFyZHMnKToKICAgICMgZGlzYWJsZSB0aGUgZnVuY3Rpb25hbGl0eSBhbHJlYWR5IGF2YWlsYWJsZSB1cHN0cmVhbQogICAgY2xhc3Mgc2Rpc3RfYWRkX2RlZmF1bHRzOgogICAgICAgIHBhc3MKUEsDBBQAAAAAAAAAIQDN/62QDgEAAA4BAAA2AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3JlZ2lzdGVyLnB5aW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLnJlZ2lzdGVyIGFzIG9yaWcKCgpjbGFzcyByZWdpc3RlcihvcmlnLnJlZ2lzdGVyKToKICAgIF9fZG9jX18gPSBvcmlnLnJlZ2lzdGVyLl9fZG9jX18KCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2UgYXJlIHVzaW5nIHZhbGlkIGN1cnJlbnQgbmFtZS92ZXJzaW9uIGluZm8KICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgb3JpZy5yZWdpc3Rlci5ydW4oc2VsZikKUEsDBBQAAAAAAAAAIQAZytSkdAgAAHQIAAA0AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3JvdGF0ZS5weWZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aApmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKaW1wb3J0IG9zCmltcG9ydCBzaHV0aWwKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCgoKY2xhc3Mgcm90YXRlKENvbW1hbmQpOgogICAgIiIiRGVsZXRlIG9sZGVyIGRpc3RyaWJ1dGlvbnMiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJkZWxldGUgb2xkZXIgZGlzdHJpYnV0aW9ucywga2VlcGluZyBOIG5ld2VzdCBmaWxlcyIKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ21hdGNoPScsICdtJywgInBhdHRlcm5zIHRvIG1hdGNoIChyZXF1aXJlZCkiKSwKICAgICAgICAoJ2Rpc3QtZGlyPScsICdkJywgImRpcmVjdG9yeSB3aGVyZSB0aGUgZGlzdHJpYnV0aW9ucyBhcmUiKSwKICAgICAgICAoJ2tlZXA9JywgJ2snLCAibnVtYmVyIG9mIG1hdGNoaW5nIGRpc3RyaWJ1dGlvbnMgdG8ga2VlcCIpLAogICAgXQoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IFtdCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLm1hdGNoID0gTm9uZQogICAgICAgIHNlbGYuZGlzdF9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5rZWVwID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIGlmIHNlbGYubWF0Y2ggaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IG9uZSBvciBtb3JlIChjb21tYS1zZXBhcmF0ZWQpIG1hdGNoIHBhdHRlcm5zICIKICAgICAgICAgICAgICAgICIoZS5nLiAnLnppcCcgb3IgJy5lZ2cnKSIKICAgICAgICAgICAgKQogICAgICAgIGlmIHNlbGYua2VlcCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiTXVzdCBzcGVjaWZ5IG51bWJlciBvZiBmaWxlcyB0byBrZWVwIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYua2VlcCA9IGludChzZWxmLmtlZXApCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCItLWtlZXAgbXVzdCBiZSBhbiBpbnRlZ2VyIikKICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYubWF0Y2gsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBzZWxmLm1hdGNoID0gWwogICAgICAgICAgICAgICAgY29udmVydF9wYXRoKHAuc3RyaXAoKSkgZm9yIHAgaW4gc2VsZi5tYXRjaC5zcGxpdCgnLCcpCiAgICAgICAgICAgIF0KICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnYmRpc3QnLCAoJ2Rpc3RfZGlyJywgJ2Rpc3RfZGlyJykpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgZnJvbSBnbG9iIGltcG9ydCBnbG9iCgogICAgICAgIGZvciBwYXR0ZXJuIGluIHNlbGYubWF0Y2g6CiAgICAgICAgICAgIHBhdHRlcm4gPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpICsgJyonICsgcGF0dGVybgogICAgICAgICAgICBmaWxlcyA9IGdsb2Iob3MucGF0aC5qb2luKHNlbGYuZGlzdF9kaXIsIHBhdHRlcm4pKQogICAgICAgICAgICBmaWxlcyA9IFsob3MucGF0aC5nZXRtdGltZShmKSwgZikgZm9yIGYgaW4gZmlsZXNdCiAgICAgICAgICAgIGZpbGVzLnNvcnQoKQogICAgICAgICAgICBmaWxlcy5yZXZlcnNlKCkKCiAgICAgICAgICAgIGxvZy5pbmZvKCIlZCBmaWxlKHMpIG1hdGNoaW5nICVzIiwgbGVuKGZpbGVzKSwgcGF0dGVybikKICAgICAgICAgICAgZmlsZXMgPSBmaWxlc1tzZWxmLmtlZXA6XQogICAgICAgICAgICBmb3IgKHQsIGYpIGluIGZpbGVzOgogICAgICAgICAgICAgICAgbG9nLmluZm8oIkRlbGV0aW5nICVzIiwgZikKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmKToKICAgICAgICAgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShmKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmKQpQSwMEFAAAAAAAAAAhAASB1jSSAgAAkgIAADYAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvc2F2ZW9wdHMucHlmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQgaW1wb3J0IGVkaXRfY29uZmlnLCBvcHRpb25fYmFzZQoKCmNsYXNzIHNhdmVvcHRzKG9wdGlvbl9iYXNlKToKICAgICIiIlNhdmUgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gYSBmaWxlIiIiCgogICAgZGVzY3JpcHRpb24gPSAic2F2ZSBzdXBwbGllZCBvcHRpb25zIHRvIHNldHVwLmNmZyBvciBvdGhlciBjb25maWcgZmlsZSIKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIGRpc3QgPSBzZWxmLmRpc3RyaWJ1dGlvbgogICAgICAgIHNldHRpbmdzID0ge30KCiAgICAgICAgZm9yIGNtZCBpbiBkaXN0LmNvbW1hbmRfb3B0aW9uczoKCiAgICAgICAgICAgIGlmIGNtZCA9PSAnc2F2ZW9wdHMnOgogICAgICAgICAgICAgICAgY29udGludWUgICMgZG9uJ3Qgc2F2ZSBvdXIgb3duIG9wdGlvbnMhCgogICAgICAgICAgICBmb3Igb3B0LCAoc3JjLCB2YWwpIGluIGRpc3QuZ2V0X29wdGlvbl9kaWN0KGNtZCkuaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmIHNyYyA9PSAiY29tbWFuZCBsaW5lIjoKICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXRkZWZhdWx0KGNtZCwge30pW29wdF0gPSB2YWwKCiAgICAgICAgZWRpdF9jb25maWcoc2VsZi5maWxlbmFtZSwgc2V0dGluZ3MsIHNlbGYuZHJ5X3J1bikKUEsDBBQAAAAAAAAAIQC3H9FuNxoAADcaAAAzAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3NkaXN0LnB5ZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwppbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuc2Rpc3QgYXMgb3JpZwppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgaW8KaW1wb3J0IGNvbnRleHRsaWIKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKZnJvbSAucHkzNmNvbXBhdCBpbXBvcnQgc2Rpc3RfYWRkX2RlZmF1bHRzCgppbXBvcnQgcGtnX3Jlc291cmNlcwoKX2RlZmF1bHRfcmV2Y3RybCA9IGxpc3QKCgpkZWYgd2Fsa19yZXZjdHJsKGRpcm5hbWU9JycpOgogICAgIiIiRmluZCBhbGwgZmlsZXMgdW5kZXIgcmV2aXNpb24gY29udHJvbCIiIgogICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ3NldHVwdG9vbHMuZmlsZV9maW5kZXJzJyk6CiAgICAgICAgZm9yIGl0ZW0gaW4gZXAubG9hZCgpKGRpcm5hbWUpOgogICAgICAgICAgICB5aWVsZCBpdGVtCgoKY2xhc3Mgc2Rpc3Qoc2Rpc3RfYWRkX2RlZmF1bHRzLCBvcmlnLnNkaXN0KToKICAgICIiIlNtYXJ0IHNkaXN0IHRoYXQgZmluZHMgYW55dGhpbmcgc3VwcG9ydGVkIGJ5IHJldmlzaW9uIGNvbnRyb2wiIiIKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdmb3JtYXRzPScsIE5vbmUsCiAgICAgICAgICJmb3JtYXRzIGZvciBzb3VyY2UgZGlzdHJpYnV0aW9uIChjb21tYS1zZXBhcmF0ZWQgbGlzdCkiKSwKICAgICAgICAoJ2tlZXAtdGVtcCcsICdrJywKICAgICAgICAgImtlZXAgdGhlIGRpc3RyaWJ1dGlvbiB0cmVlIGFyb3VuZCBhZnRlciBjcmVhdGluZyAiICsKICAgICAgICAgImFyY2hpdmUgZmlsZShzKSIpLAogICAgICAgICgnZGlzdC1kaXI9JywgJ2QnLAogICAgICAgICAiZGlyZWN0b3J5IHRvIHB1dCB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBhcmNoaXZlKHMpIGluICIKICAgICAgICAgIltkZWZhdWx0OiBkaXN0XSIpLAogICAgXQoKICAgIG5lZ2F0aXZlX29wdCA9IHt9CgogICAgUkVBRE1FX0VYVEVOU0lPTlMgPSBbJycsICcucnN0JywgJy50eHQnLCAnLm1kJ10KICAgIFJFQURNRVMgPSB0dXBsZSgnUkVBRE1FezB9Jy5mb3JtYXQoZXh0KSBmb3IgZXh0IGluIFJFQURNRV9FWFRFTlNJT05TKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgc2VsZi5maWxlbGlzdCA9IGVpX2NtZC5maWxlbGlzdAogICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKG9zLnBhdGguam9pbihlaV9jbWQuZWdnX2luZm8sICdTT1VSQ0VTLnR4dCcpKQogICAgICAgIHNlbGYuY2hlY2tfcmVhZG1lKCkKCiAgICAgICAgIyBSdW4gc3ViIGNvbW1hbmRzCiAgICAgICAgZm9yIGNtZF9uYW1lIGluIHNlbGYuZ2V0X3N1Yl9jb21tYW5kcygpOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKGNtZF9uYW1lKQoKICAgICAgICBzZWxmLm1ha2VfZGlzdHJpYnV0aW9uKCkKCiAgICAgICAgZGlzdF9maWxlcyA9IGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICdkaXN0X2ZpbGVzJywgW10pCiAgICAgICAgZm9yIGZpbGUgaW4gc2VsZi5hcmNoaXZlX2ZpbGVzOgogICAgICAgICAgICBkYXRhID0gKCdzZGlzdCcsICcnLCBmaWxlKQogICAgICAgICAgICBpZiBkYXRhIG5vdCBpbiBkaXN0X2ZpbGVzOgogICAgICAgICAgICAgICAgZGlzdF9maWxlcy5hcHBlbmQoZGF0YSkKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9yaWcuc2Rpc3QuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCgogICAgICAgIHNlbGYuX2RlZmF1bHRfdG9fZ3p0YXIoKQoKICAgIGRlZiBfZGVmYXVsdF90b19nenRhcihzZWxmKToKICAgICAgICAjIG9ubHkgbmVlZGVkIG9uIFB5dGhvbiBwcmlvciB0byAzLjYuCiAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMywgNiwgMCwgJ2JldGEnLCAxKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5mb3JtYXRzID0gWydnenRhciddCgogICAgZGVmIG1ha2VfZGlzdHJpYnV0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFdvcmthcm91bmQgZm9yICM1MTYKICAgICAgICAiIiIKICAgICAgICB3aXRoIHNlbGYuX3JlbW92ZV9vc19saW5rKCk6CiAgICAgICAgICAgIG9yaWcuc2Rpc3QubWFrZV9kaXN0cmlidXRpb24oc2VsZikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogICAgZGVmIF9yZW1vdmVfb3NfbGluaygpOgogICAgICAgICIiIgogICAgICAgIEluIGEgY29udGV4dCwgcmVtb3ZlIGFuZCByZXN0b3JlIG9zLmxpbmsgaWYgaXQgZXhpc3RzCiAgICAgICAgIiIiCgogICAgICAgIGNsYXNzIE5vVmFsdWU6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgb3JpZ192YWwgPSBnZXRhdHRyKG9zLCAnbGluaycsIE5vVmFsdWUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZWwgb3MubGluawogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKICAgICAgICB0cnk6CiAgICAgICAgICAgIHlpZWxkCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgaWYgb3JpZ192YWwgaXMgbm90IE5vVmFsdWU6CiAgICAgICAgICAgICAgICBzZXRhdHRyKG9zLCAnbGluaycsIG9yaWdfdmFsKQoKICAgIGRlZiBfX3JlYWRfdGVtcGxhdGVfaGFjayhzZWxmKToKICAgICAgICAjIFRoaXMgZ3JvZHkgaGFjayBjbG9zZXMgdGhlIHRlbXBsYXRlIGZpbGUgKE1BTklGRVNULmluKSBpZiBhbgogICAgICAgICMgIGV4Y2VwdGlvbiBvY2N1cnMgZHVyaW5nIHJlYWRfdGVtcGxhdGUuCiAgICAgICAgIyBEb2luZyBzbyBwcmV2ZW50cyBhbiBlcnJvciB3aGVuIGVhc3lfaW5zdGFsbCBhdHRlbXB0cyB0byBkZWxldGUgdGhlCiAgICAgICAgIyAgZmlsZS4KICAgICAgICB0cnk6CiAgICAgICAgICAgIG9yaWcuc2Rpc3QucmVhZF90ZW1wbGF0ZShzZWxmKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIF8sIF8sIHRiID0gc3lzLmV4Y19pbmZvKCkKICAgICAgICAgICAgdGIudGJfbmV4dC50Yl9mcmFtZS5mX2xvY2Fsc1sndGVtcGxhdGUnXS5jbG9zZSgpCiAgICAgICAgICAgIHJhaXNlCgogICAgIyBCZWdpbm5pbmcgd2l0aCBQeXRob24gMi43LjIsIDMuMS40LCBhbmQgMy4yLjEsIHRoaXMgbGVha3kgZmlsZSBoYW5kbGUKICAgICMgIGhhcyBiZWVuIGZpeGVkLCBzbyBvbmx5IG92ZXJyaWRlIHRoZSBtZXRob2QgaWYgd2UncmUgdXNpbmcgYW4gZWFybGllcgogICAgIyAgUHl0aG9uLgogICAgaGFzX2xlYWt5X2hhbmRsZSA9ICgKICAgICAgICBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDcsIDIpCiAgICAgICAgb3IgKDMsIDApIDw9IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMSwgNCkKICAgICAgICBvciAoMywgMikgPD0gc3lzLnZlcnNpb25faW5mbyA8ICgzLCAyLCAxKQogICAgKQogICAgaWYgaGFzX2xlYWt5X2hhbmRsZToKICAgICAgICByZWFkX3RlbXBsYXRlID0gX19yZWFkX3RlbXBsYXRlX2hhY2sKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19weXRob24oc2VsZik6CiAgICAgICAgIiIiZ2V0dGluZyBweXRob24gZmlsZXMiIiIKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfcHVyZV9tb2R1bGVzKCk6CiAgICAgICAgICAgIGJ1aWxkX3B5ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoYnVpbGRfcHkuZ2V0X3NvdXJjZV9maWxlcygpKQogICAgICAgICAgICAjIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbmNvbXBhdGlibGUgd2l0aCBpbmNsdWRlX3BhY2thZ2VfZGF0YSwgYW5kCiAgICAgICAgICAgICMgd2lsbCBpbiBmYWN0IGNyZWF0ZSBhbiBpbmZpbml0ZSByZWN1cnNpb24gaWYgaW5jbHVkZV9wYWNrYWdlX2RhdGEKICAgICAgICAgICAgIyBpcyBUcnVlLiAgVXNlIG9mIGluY2x1ZGVfcGFja2FnZV9kYXRhIHdpbGwgaW1wbHkgdGhhdAogICAgICAgICAgICAjIGRpc3R1dGlscy1zdHlsZSBhdXRvbWF0aWMgaGFuZGxpbmcgb2YgcGFja2FnZV9kYXRhIGlzIGRpc2FibGVkCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5pbmNsdWRlX3BhY2thZ2VfZGF0YToKICAgICAgICAgICAgICAgIGZvciBfLCBzcmNfZGlyLCBfLCBmaWxlbmFtZXMgaW4gYnVpbGRfcHkuZGF0YV9maWxlczoKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChbb3MucGF0aC5qb2luKHNyY19kaXIsIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzXSkKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19kYXRhX2ZpbGVzKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgc2l4LlBZMjoKICAgICAgICAgICAgICAgIHNkaXN0X2FkZF9kZWZhdWx0cy5fYWRkX2RlZmF1bHRzX2RhdGFfZmlsZXMoc2VsZikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHN1cGVyKCkuX2FkZF9kZWZhdWx0c19kYXRhX2ZpbGVzKCkKICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICBsb2cud2FybigiZGF0YV9maWxlcyBjb250YWlucyB1bmV4cGVjdGVkIG9iamVjdHMiKQoKICAgIGRlZiBjaGVja19yZWFkbWUoc2VsZik6CiAgICAgICAgZm9yIGYgaW4gc2VsZi5SRUFETUVTOgogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmKToKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYud2FybigKICAgICAgICAgICAgICAgICJzdGFuZGFyZCBmaWxlIG5vdCBmb3VuZDogc2hvdWxkIGhhdmUgb25lIG9mICIgKwogICAgICAgICAgICAgICAgJywgJy5qb2luKHNlbGYuUkVBRE1FUykKICAgICAgICAgICAgKQoKICAgIGRlZiBtYWtlX3JlbGVhc2VfdHJlZShzZWxmLCBiYXNlX2RpciwgZmlsZXMpOgogICAgICAgIG9yaWcuc2Rpc3QubWFrZV9yZWxlYXNlX3RyZWUoc2VsZiwgYmFzZV9kaXIsIGZpbGVzKQoKICAgICAgICAjIFNhdmUgYW55IGVnZ19pbmZvIGNvbW1hbmQgbGluZSBvcHRpb25zIHVzZWQgdG8gY3JlYXRlIHRoaXMgc2Rpc3QKICAgICAgICBkZXN0ID0gb3MucGF0aC5qb2luKGJhc2VfZGlyLCAnc2V0dXAuY2ZnJykKICAgICAgICBpZiBoYXNhdHRyKG9zLCAnbGluaycpIGFuZCBvcy5wYXRoLmV4aXN0cyhkZXN0KToKICAgICAgICAgICAgIyB1bmxpbmsgYW5kIHJlLWNvcHksIHNpbmNlIGl0IG1pZ2h0IGJlIGhhcmQtbGlua2VkLCBhbmQKICAgICAgICAgICAgIyB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUgc291cmNlIHZlcnNpb24KICAgICAgICAgICAgb3MudW5saW5rKGRlc3QpCiAgICAgICAgICAgIHNlbGYuY29weV9maWxlKCdzZXR1cC5jZmcnLCBkZXN0KQoKICAgICAgICBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnZWdnX2luZm8nKS5zYXZlX3ZlcnNpb25faW5mbyhkZXN0KQoKICAgIGRlZiBfbWFuaWZlc3RfaXNfbm90X2dlbmVyYXRlZChzZWxmKToKICAgICAgICAjIGNoZWNrIGZvciBzcGVjaWFsIGNvbW1lbnQgdXNlZCBpbiAyLjcuMSBhbmQgaGlnaGVyCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKHNlbGYubWFuaWZlc3QpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgd2l0aCBpby5vcGVuKHNlbGYubWFuaWZlc3QsICdyYicpIGFzIGZwOgogICAgICAgICAgICBmaXJzdF9saW5lID0gZnAucmVhZGxpbmUoKQogICAgICAgIHJldHVybiAoZmlyc3RfbGluZSAhPQogICAgICAgICAgICAgICAgJyMgZmlsZSBHRU5FUkFURUQgYnkgZGlzdHV0aWxzLCBkbyBOT1QgZWRpdFxuJy5lbmNvZGUoKSkKCiAgICBkZWYgcmVhZF9tYW5pZmVzdChzZWxmKToKICAgICAgICAiIiJSZWFkIHRoZSBtYW5pZmVzdCBmaWxlIChuYW1lZCBieSAnc2VsZi5tYW5pZmVzdCcpIGFuZCB1c2UgaXQgdG8KICAgICAgICBmaWxsIGluICdzZWxmLmZpbGVsaXN0JywgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgc291cmNlCiAgICAgICAgZGlzdHJpYnV0aW9uLgogICAgICAgICIiIgogICAgICAgIGxvZy5pbmZvKCJyZWFkaW5nIG1hbmlmZXN0IGZpbGUgJyVzJyIsIHNlbGYubWFuaWZlc3QpCiAgICAgICAgbWFuaWZlc3QgPSBvcGVuKHNlbGYubWFuaWZlc3QsICdyYicpCiAgICAgICAgZm9yIGxpbmUgaW4gbWFuaWZlc3Q6CiAgICAgICAgICAgICMgVGhlIG1hbmlmZXN0IG11c3QgY29udGFpbiBVVEYtOC4gU2VlICMzMDMuCiAgICAgICAgICAgIGlmIHNpeC5QWTM6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuZGVjb2RlKCdVVEYtOCcpCiAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCIlciBub3QgVVRGLTggZGVjb2RhYmxlIC0tIHNraXBwaW5nIiAlIGxpbmUpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIyBpZ25vcmUgY29tbWVudHMgYW5kIGJsYW5rIGxpbmVzCiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCcjJykgb3Igbm90IGxpbmU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChsaW5lKQogICAgICAgIG1hbmlmZXN0LmNsb3NlKCkKUEsDBBQAAAAAAAAAIQCbcMvH3RMAAN0TAAA0AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3NldG9wdC5weWZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aApmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKaW1wb3J0IGRpc3R1dGlscwppbXBvcnQgb3MKCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBjb25maWdwYXJzZXIKCmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZAoKX19hbGxfXyA9IFsnY29uZmlnX2ZpbGUnLCAnZWRpdF9jb25maWcnLCAnb3B0aW9uX2Jhc2UnLCAnc2V0b3B0J10KCgpkZWYgY29uZmlnX2ZpbGUoa2luZD0ibG9jYWwiKToKICAgICIiIkdldCB0aGUgZmlsZW5hbWUgb2YgdGhlIGRpc3R1dGlscywgbG9jYWwsIGdsb2JhbCwgb3IgcGVyLXVzZXIgY29uZmlnCgogICAgYGtpbmRgIG11c3QgYmUgb25lIG9mICJsb2NhbCIsICJnbG9iYWwiLCBvciAidXNlciIKICAgICIiIgogICAgaWYga2luZCA9PSAnbG9jYWwnOgogICAgICAgIHJldHVybiAnc2V0dXAuY2ZnJwogICAgaWYga2luZCA9PSAnZ2xvYmFsJzoKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKAogICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUoZGlzdHV0aWxzLl9fZmlsZV9fKSwgJ2Rpc3R1dGlscy5jZmcnCiAgICAgICAgKQogICAgaWYga2luZCA9PSAndXNlcic6CiAgICAgICAgZG90ID0gb3MubmFtZSA9PSAncG9zaXgnIGFuZCAnLicgb3IgJycKICAgICAgICByZXR1cm4gb3MucGF0aC5leHBhbmR1c2VyKGNvbnZlcnRfcGF0aCgifi8lc3B5ZGlzdHV0aWxzLmNmZyIgJSBkb3QpKQogICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAiY29uZmlnX2ZpbGUoKSB0eXBlIG11c3QgYmUgJ2xvY2FsJywgJ2dsb2JhbCcsIG9yICd1c2VyJyIsIGtpbmQKICAgICkKCgpkZWYgZWRpdF9jb25maWcoZmlsZW5hbWUsIHNldHRpbmdzLCBkcnlfcnVuPUZhbHNlKToKICAgICIiIkVkaXQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW5jbHVkZSBgc2V0dGluZ3NgCgogICAgYHNldHRpbmdzYCBpcyBhIGRpY3Rpb25hcnkgb2YgZGljdGlvbmFyaWVzIG9yIGBgTm9uZWBgIHZhbHVlcywga2V5ZWQgYnkKICAgIGNvbW1hbmQvc2VjdGlvbiBuYW1lLiAgQSBgYE5vbmVgYCB2YWx1ZSBtZWFucyB0byBkZWxldGUgdGhlIGVudGlyZSBzZWN0aW9uLAogICAgd2hpbGUgYSBkaWN0aW9uYXJ5IGxpc3RzIHNldHRpbmdzIHRvIGJlIGNoYW5nZWQgb3IgZGVsZXRlZCBpbiB0aGF0IHNlY3Rpb24uCiAgICBBIHNldHRpbmcgb2YgYGBOb25lYGAgbWVhbnMgdG8gZGVsZXRlIHRoYXQgc2V0dGluZy4KICAgICIiIgogICAgbG9nLmRlYnVnKCJSZWFkaW5nIGNvbmZpZ3VyYXRpb24gZnJvbSAlcyIsIGZpbGVuYW1lKQogICAgb3B0cyA9IGNvbmZpZ3BhcnNlci5SYXdDb25maWdQYXJzZXIoKQogICAgb3B0cy5yZWFkKFtmaWxlbmFtZV0pCiAgICBmb3Igc2VjdGlvbiwgb3B0aW9ucyBpbiBzZXR0aW5ncy5pdGVtcygpOgogICAgICAgIGlmIG9wdGlvbnMgaXMgTm9uZToKICAgICAgICAgICAgbG9nLmluZm8oIkRlbGV0aW5nIHNlY3Rpb24gWyVzXSBmcm9tICVzIiwgc2VjdGlvbiwgZmlsZW5hbWUpCiAgICAgICAgICAgIG9wdHMucmVtb3ZlX3NlY3Rpb24oc2VjdGlvbikKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBub3Qgb3B0cy5oYXNfc2VjdGlvbihzZWN0aW9uKToKICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIG5ldyBzZWN0aW9uIFslc10gdG8gJXMiLCBzZWN0aW9uLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgIG9wdHMuYWRkX3NlY3Rpb24oc2VjdGlvbikKICAgICAgICAgICAgZm9yIG9wdGlvbiwgdmFsdWUgaW4gb3B0aW9ucy5pdGVtcygpOgogICAgICAgICAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCiAgICAgICAgICAgICAgICAgICAgICAgICJEZWxldGluZyAlcy4lcyBmcm9tICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgb3B0aW9uLCBmaWxlbmFtZQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBvcHRzLnJlbW92ZV9vcHRpb24oc2VjdGlvbiwgb3B0aW9uKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcHRzLm9wdGlvbnMoc2VjdGlvbik6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJEZWxldGluZyBlbXB0eSBbJXNdIHNlY3Rpb24gZnJvbSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBvcHRzLnJlbW92ZV9zZWN0aW9uKHNlY3Rpb24pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKICAgICAgICAgICAgICAgICAgICAgICAgIlNldHRpbmcgJXMuJXMgdG8gJXIgaW4gJXMiLAogICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLCBvcHRpb24sIHZhbHVlLCBmaWxlbmFtZQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBvcHRzLnNldChzZWN0aW9uLCBvcHRpb24sIHZhbHVlKQoKICAgIGxvZy5pbmZvKCJXcml0aW5nICVzIiwgZmlsZW5hbWUpCiAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3JykgYXMgZjoKICAgICAgICAgICAgb3B0cy53cml0ZShmKQoKCmNsYXNzIG9wdGlvbl9iYXNlKENvbW1hbmQpOgogICAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY29tbWFuZHMgdGhhdCBtZXNzIHdpdGggY29uZmlnIGZpbGVzIiIiCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnZ2xvYmFsLWNvbmZpZycsICdnJywKICAgICAgICAgInNhdmUgb3B0aW9ucyB0byB0aGUgc2l0ZS13aWRlIGRpc3R1dGlscy5jZmcgZmlsZSIpLAogICAgICAgICgndXNlci1jb25maWcnLCAndScsCiAgICAgICAgICJzYXZlIG9wdGlvbnMgdG8gdGhlIGN1cnJlbnQgdXNlcidzIHB5ZGlzdHV0aWxzLmNmZyBmaWxlIiksCiAgICAgICAgKCdmaWxlbmFtZT0nLCAnZicsCiAgICAgICAgICJjb25maWd1cmF0aW9uIGZpbGUgdG8gdXNlIChkZWZhdWx0PXNldHVwLmNmZykiKSwKICAgIF0KCiAgICBib29sZWFuX29wdGlvbnMgPSBbCiAgICAgICAgJ2dsb2JhbC1jb25maWcnLCAndXNlci1jb25maWcnLAogICAgXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5nbG9iYWxfY29uZmlnID0gTm9uZQogICAgICAgIHNlbGYudXNlcl9jb25maWcgPSBOb25lCiAgICAgICAgc2VsZi5maWxlbmFtZSA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBmaWxlbmFtZXMgPSBbXQogICAgICAgIGlmIHNlbGYuZ2xvYmFsX2NvbmZpZzoKICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChjb25maWdfZmlsZSgnZ2xvYmFsJykpCiAgICAgICAgaWYgc2VsZi51c2VyX2NvbmZpZzoKICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChjb25maWdfZmlsZSgndXNlcicpKQogICAgICAgIGlmIHNlbGYuZmlsZW5hbWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQoc2VsZi5maWxlbmFtZSkKICAgICAgICBpZiBub3QgZmlsZW5hbWVzOgogICAgICAgICAgICBmaWxlbmFtZXMuYXBwZW5kKGNvbmZpZ19maWxlKCdsb2NhbCcpKQogICAgICAgIGlmIGxlbihmaWxlbmFtZXMpID4gMToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IG9ubHkgb25lIGNvbmZpZ3VyYXRpb24gZmlsZSBvcHRpb24iLAogICAgICAgICAgICAgICAgZmlsZW5hbWVzCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLmZpbGVuYW1lLCA9IGZpbGVuYW1lcwoKCmNsYXNzIHNldG9wdChvcHRpb25fYmFzZSk6CiAgICAiIiJTYXZlIGNvbW1hbmQtbGluZSBvcHRpb25zIHRvIGEgZmlsZSIiIgoKICAgIGRlc2NyaXB0aW9uID0gInNldCBhbiBvcHRpb24gaW4gc2V0dXAuY2ZnIG9yIGFub3RoZXIgY29uZmlnIGZpbGUiCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnY29tbWFuZD0nLCAnYycsICdjb21tYW5kIHRvIHNldCBhbiBvcHRpb24gZm9yJyksCiAgICAgICAgKCdvcHRpb249JywgJ28nLCAnb3B0aW9uIHRvIHNldCcpLAogICAgICAgICgnc2V0LXZhbHVlPScsICdzJywgJ3ZhbHVlIG9mIHRoZSBvcHRpb24nKSwKICAgICAgICAoJ3JlbW92ZScsICdyJywgJ3JlbW92ZSAodW5zZXQpIHRoZSB2YWx1ZScpLAogICAgXSArIG9wdGlvbl9iYXNlLnVzZXJfb3B0aW9ucwoKICAgIGJvb2xlYW5fb3B0aW9ucyA9IG9wdGlvbl9iYXNlLmJvb2xlYW5fb3B0aW9ucyArIFsncmVtb3ZlJ10KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9wdGlvbl9iYXNlLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYuY29tbWFuZCA9IE5vbmUKICAgICAgICBzZWxmLm9wdGlvbiA9IE5vbmUKICAgICAgICBzZWxmLnNldF92YWx1ZSA9IE5vbmUKICAgICAgICBzZWxmLnJlbW92ZSA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcHRpb25fYmFzZS5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgaWYgc2VsZi5jb21tYW5kIGlzIE5vbmUgb3Igc2VsZi5vcHRpb24gaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIk11c3Qgc3BlY2lmeSAtLWNvbW1hbmQgKmFuZCogLS1vcHRpb24iKQogICAgICAgIGlmIHNlbGYuc2V0X3ZhbHVlIGlzIE5vbmUgYW5kIG5vdCBzZWxmLnJlbW92ZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIk11c3Qgc3BlY2lmeSAtLXNldC12YWx1ZSBvciAtLXJlbW92ZSIpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBlZGl0X2NvbmZpZygKICAgICAgICAgICAgc2VsZi5maWxlbmFtZSwgewogICAgICAgICAgICAgICAgc2VsZi5jb21tYW5kOiB7c2VsZi5vcHRpb24ucmVwbGFjZSgnLScsICdfJyk6IHNlbGYuc2V0X3ZhbHVlfQogICAgICAgICAgICB9LAogICAgICAgICAgICBzZWxmLmRyeV9ydW4KICAgICAgICApClBLAwQUAAAAAAAAACEA3Rnhnv4jAAD+IwAAMgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC90ZXN0LnB5aW1wb3J0IG9zCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgc3lzCmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHVuaXR0ZXN0CmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IsIERpc3R1dGlsc09wdGlvbkVycm9yCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdExvYWRlcgoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAsIGZpbHRlcgoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCAocmVzb3VyY2VfbGlzdGRpciwgcmVzb3VyY2VfZXhpc3RzLCBub3JtYWxpemVfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZ19zZXQsIF9uYW1lc3BhY2VfcGFja2FnZXMsIGV2YWx1YXRlX21hcmtlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2FjdGl2YXRpb25fbGlzdGVuZXIsIHJlcXVpcmUsIEVudHJ5UG9pbnQpCmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZAoKCmNsYXNzIFNjYW5uaW5nTG9hZGVyKFRlc3RMb2FkZXIpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBUZXN0TG9hZGVyLl9faW5pdF9fKHNlbGYpCiAgICAgICAgc2VsZi5fdmlzaXRlZCA9IHNldCgpCgogICAgZGVmIGxvYWRUZXN0c0Zyb21Nb2R1bGUoc2VsZiwgbW9kdWxlLCBwYXR0ZXJuPU5vbmUpOgogICAgICAgICIiIlJldHVybiBhIHN1aXRlIG9mIGFsbCB0ZXN0cyBjYXNlcyBjb250YWluZWQgaW4gdGhlIGdpdmVuIG1vZHVsZQoKICAgICAgICBJZiB0aGUgbW9kdWxlIGlzIGEgcGFja2FnZSwgbG9hZCB0ZXN0cyBmcm9tIGFsbCB0aGUgbW9kdWxlcyBpbiBpdC4KICAgICAgICBJZiB0aGUgbW9kdWxlIGhhcyBhbiBgYGFkZGl0aW9uYWxfdGVzdHNgYCBmdW5jdGlvbiwgY2FsbCBpdCBhbmQgYWRkCiAgICAgICAgdGhlIHJldHVybiB2YWx1ZSB0byB0aGUgdGVzdHMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbW9kdWxlIGluIHNlbGYuX3Zpc2l0ZWQ6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgc2VsZi5fdmlzaXRlZC5hZGQobW9kdWxlKQoKICAgICAgICB0ZXN0cyA9IFtdCiAgICAgICAgdGVzdHMuYXBwZW5kKFRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZShzZWxmLCBtb2R1bGUpKQoKICAgICAgICBpZiBoYXNhdHRyKG1vZHVsZSwgImFkZGl0aW9uYWxfdGVzdHMiKToKICAgICAgICAgICAgdGVzdHMuYXBwZW5kKG1vZHVsZS5hZGRpdGlvbmFsX3Rlc3RzKCkpCgogICAgICAgIGlmIGhhc2F0dHIobW9kdWxlLCAnX19wYXRoX18nKToKICAgICAgICAgICAgZm9yIGZpbGUgaW4gcmVzb3VyY2VfbGlzdGRpcihtb2R1bGUuX19uYW1lX18sICcnKToKICAgICAgICAgICAgICAgIGlmIGZpbGUuZW5kc3dpdGgoJy5weScpIGFuZCBmaWxlICE9ICdfX2luaXRfXy5weSc6CiAgICAgICAgICAgICAgICAgICAgc3VibW9kdWxlID0gbW9kdWxlLl9fbmFtZV9fICsgJy4nICsgZmlsZVs6LTNdCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmIHJlc291cmNlX2V4aXN0cyhtb2R1bGUuX19uYW1lX18sIGZpbGUgKyAnL19faW5pdF9fLnB5Jyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1vZHVsZSA9IG1vZHVsZS5fX25hbWVfXyArICcuJyArIGZpbGUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgdGVzdHMuYXBwZW5kKHNlbGYubG9hZFRlc3RzRnJvbU5hbWUoc3VibW9kdWxlKSkKCiAgICAgICAgaWYgbGVuKHRlc3RzKSAhPSAxOgogICAgICAgICAgICByZXR1cm4gc2VsZi5zdWl0ZUNsYXNzKHRlc3RzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiB0ZXN0c1swXSAgIyBkb24ndCBjcmVhdGUgYSBuZXN0ZWQgc3VpdGUgZm9yIG9ubHkgb25lIHJldHVybgoKCiMgYWRhcHRlZCBmcm9tIGphcmFjby5jbGFzc2VzLnByb3BlcnRpZXM6Tm9uRGF0YVByb3BlcnR5CmNsYXNzIE5vbkRhdGFQcm9wZXJ0eShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZnZXQpOgogICAgICAgIHNlbGYuZmdldCA9IGZnZXQKCiAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIG9ianR5cGU9Tm9uZSk6CiAgICAgICAgaWYgb2JqIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgcmV0dXJuIHNlbGYuZmdldChvYmopCgoKY2xhc3MgdGVzdChDb21tYW5kKToKICAgICIiIkNvbW1hbmQgdG8gcnVuIHVuaXQgdGVzdHMgYWZ0ZXIgaW4tcGxhY2UgYnVpbGQiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJydW4gdW5pdCB0ZXN0cyBhZnRlciBpbi1wbGFjZSBidWlsZCIKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCd0ZXN0LW1vZHVsZT0nLCAnbScsICJSdW4gJ3Rlc3Rfc3VpdGUnIGluIHNwZWNpZmllZCBtb2R1bGUiKSwKICAgICAgICAoJ3Rlc3Qtc3VpdGU9JywgJ3MnLAogICAgICAgICAiUnVuIHNpbmdsZSB0ZXN0LCBjYXNlIG9yIHN1aXRlIChlLmcuICdtb2R1bGUudGVzdF9zdWl0ZScpIiksCiAgICAgICAgKCd0ZXN0LXJ1bm5lcj0nLCAncicsICJUZXN0IHJ1bm5lciB0byB1c2UiKSwKICAgIF0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYudGVzdF9zdWl0ZSA9IE5vbmUKICAgICAgICBzZWxmLnRlc3RfbW9kdWxlID0gTm9uZQogICAgICAgIHNlbGYudGVzdF9sb2FkZXIgPSBOb25lCiAgICAgICAgc2VsZi50ZXN0X3J1bm5lciA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKCiAgICAgICAgaWYgc2VsZi50ZXN0X3N1aXRlIGFuZCBzZWxmLnRlc3RfbW9kdWxlOgogICAgICAgICAgICBtc2cgPSAiWW91IG1heSBzcGVjaWZ5IGEgbW9kdWxlIG9yIGEgc3VpdGUsIGJ1dCBub3QgYm90aCIKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IobXNnKQoKICAgICAgICBpZiBzZWxmLnRlc3Rfc3VpdGUgaXMgTm9uZToKICAgICAgICAgICAgaWYgc2VsZi50ZXN0X21vZHVsZSBpcyBOb25lOgogICAgICAgICAgICAgICAgc2VsZi50ZXN0X3N1aXRlID0gc2VsZi5kaXN0cmlidXRpb24udGVzdF9zdWl0ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi50ZXN0X3N1aXRlID0gc2VsZi50ZXN0X21vZHVsZSArICIudGVzdF9zdWl0ZSIKCiAgICAgICAgaWYgc2VsZi50ZXN0X2xvYWRlciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnRlc3RfbG9hZGVyID0gZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ3Rlc3RfbG9hZGVyJywgTm9uZSkKICAgICAgICBpZiBzZWxmLnRlc3RfbG9hZGVyIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYudGVzdF9sb2FkZXIgPSAic2V0dXB0b29scy5jb21tYW5kLnRlc3Q6U2Nhbm5pbmdMb2FkZXIiCiAgICAgICAgaWYgc2VsZi50ZXN0X3J1bm5lciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnRlc3RfcnVubmVyID0gZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ3Rlc3RfcnVubmVyJywgTm9uZSkKCiAgICBATm9uRGF0YVByb3BlcnR5CiAgICBkZWYgdGVzdF9hcmdzKHNlbGYpOgogICAgICAgIHJldHVybiBsaXN0KHNlbGYuX3Rlc3RfYXJncygpKQoKICAgIGRlZiBfdGVzdF9hcmdzKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLnRlc3Rfc3VpdGUgYW5kIHN5cy52ZXJzaW9uX2luZm8gPj0gKDIsIDcpOgogICAgICAgICAgICB5aWVsZCAnZGlzY292ZXInCiAgICAgICAgaWYgc2VsZi52ZXJib3NlOgogICAgICAgICAgICB5aWVsZCAnLS12ZXJib3NlJwogICAgICAgIGlmIHNlbGYudGVzdF9zdWl0ZToKICAgICAgICAgICAgeWllbGQgc2VsZi50ZXN0X3N1aXRlCgogICAgZGVmIHdpdGhfcHJvamVjdF9vbl9zeXNfcGF0aChzZWxmLCBmdW5jKToKICAgICAgICAiIiIKICAgICAgICBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciBwcm9qZWN0X29uX3N5c19wYXRoIGNvbnRleHQuCiAgICAgICAgIiIiCiAgICAgICAgd2l0aCBzZWxmLnByb2plY3Rfb25fc3lzX3BhdGgoKToKICAgICAgICAgICAgZnVuYygpCgogICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKICAgIGRlZiBwcm9qZWN0X29uX3N5c19wYXRoKHNlbGYsIGluY2x1ZGVfZGlzdHM9W10pOgogICAgICAgIHdpdGhfMnRvMyA9IHNpeC5QWTMgYW5kIGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICd1c2VfMnRvMycsIEZhbHNlKQoKICAgICAgICBpZiB3aXRoXzJ0bzM6CiAgICAgICAgICAgICMgSWYgd2UgcnVuIDJ0bzMgd2UgY2FuIG5vdCBkbyB0aGlzIGlucGxhY2U6CgogICAgICAgICAgICAjIEVuc3VyZSBtZXRhZGF0YSBpcyB1cC10by1kYXRlCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2J1aWxkX3B5JywgaW5wbGFjZT0wKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9weScpCiAgICAgICAgICAgIGJweV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiYnVpbGRfcHkiKQogICAgICAgICAgICBidWlsZF9wYXRoID0gbm9ybWFsaXplX3BhdGgoYnB5X2NtZC5idWlsZF9saWIpCgogICAgICAgICAgICAjIEJ1aWxkIGV4dGVuc2lvbnMKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnZWdnX2luZm8nLCBlZ2dfYmFzZT1idWlsZF9wYXRoKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCgogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9leHQnLCBpbnBsYWNlPTApCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBXaXRob3V0IDJ0bzMgaW5wbGFjZSB3b3JrcyBmaW5lOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCgogICAgICAgICAgICAjIEJ1aWxkIGV4dGVuc2lvbnMgaW4tcGxhY2UKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfZXh0JywgaW5wbGFjZT0xKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9leHQnKQoKICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQoKICAgICAgICBvbGRfcGF0aCA9IHN5cy5wYXRoWzpdCiAgICAgICAgb2xkX21vZHVsZXMgPSBzeXMubW9kdWxlcy5jb3B5KCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwcm9qZWN0X3BhdGggPSBub3JtYWxpemVfcGF0aChlaV9jbWQuZWdnX2Jhc2UpCiAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBwcm9qZWN0X3BhdGgpCiAgICAgICAgICAgIHdvcmtpbmdfc2V0Ll9faW5pdF9fKCkKICAgICAgICAgICAgYWRkX2FjdGl2YXRpb25fbGlzdGVuZXIobGFtYmRhIGRpc3Q6IGRpc3QuYWN0aXZhdGUoKSkKICAgICAgICAgICAgcmVxdWlyZSgnJXM9PSVzJyAlIChlaV9jbWQuZWdnX25hbWUsIGVpX2NtZC5lZ2dfdmVyc2lvbikpCiAgICAgICAgICAgIHdpdGggc2VsZi5wYXRoc19vbl9weXRob25wYXRoKFtwcm9qZWN0X3BhdGhdKToKICAgICAgICAgICAgICAgIHlpZWxkCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc3lzLnBhdGhbOl0gPSBvbGRfcGF0aAogICAgICAgICAgICBzeXMubW9kdWxlcy5jbGVhcigpCiAgICAgICAgICAgIHN5cy5tb2R1bGVzLnVwZGF0ZShvbGRfbW9kdWxlcykKICAgICAgICAgICAgd29ya2luZ19zZXQuX19pbml0X18oKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCiAgICBkZWYgcGF0aHNfb25fcHl0aG9ucGF0aChwYXRocyk6CiAgICAgICAgIiIiCiAgICAgICAgQWRkIHRoZSBpbmRpY2F0ZWQgcGF0aHMgdG8gdGhlIGhlYWQgb2YgdGhlIFBZVEhPTlBBVEggZW52aXJvbm1lbnQKICAgICAgICB2YXJpYWJsZSBzbyB0aGF0IHN1YnByb2Nlc3NlcyB3aWxsIGFsc28gc2VlIHRoZSBwYWNrYWdlcyBhdAogICAgICAgIHRoZXNlIHBhdGhzLgoKICAgICAgICBEbyB0aGlzIGluIGEgY29udGV4dCB0aGF0IHJlc3RvcmVzIHRoZSB2YWx1ZSBvbiBleGl0LgogICAgICAgICIiIgogICAgICAgIG5vdGhpbmcgPSBvYmplY3QoKQogICAgICAgIG9yaWdfcHl0aG9ucGF0aCA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJywgbm90aGluZykKICAgICAgICBjdXJyZW50X3B5dGhvbnBhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcsICcnKQogICAgICAgIHRyeToKICAgICAgICAgICAgcHJlZml4ID0gb3MucGF0aHNlcC5qb2luKHBhdGhzKQogICAgICAgICAgICB0b19qb2luID0gZmlsdGVyKE5vbmUsIFtwcmVmaXgsIGN1cnJlbnRfcHl0aG9ucGF0aF0pCiAgICAgICAgICAgIG5ld19wYXRoID0gb3MucGF0aHNlcC5qb2luKHRvX2pvaW4pCiAgICAgICAgICAgIGlmIG5ld19wYXRoOgogICAgICAgICAgICAgICAgb3MuZW52aXJvblsnUFlUSE9OUEFUSCddID0gbmV3X3BhdGgKICAgICAgICAgICAgeWllbGQKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBpZiBvcmlnX3B5dGhvbnBhdGggaXMgbm90aGluZzoKICAgICAgICAgICAgICAgIG9zLmVudmlyb24ucG9wKCdQWVRIT05QQVRIJywgTm9uZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG9zLmVudmlyb25bJ1BZVEhPTlBBVEgnXSA9IG9yaWdfcHl0aG9ucGF0aAoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBpbnN0YWxsX2Rpc3RzKGRpc3QpOgogICAgICAgICIiIgogICAgICAgIEluc3RhbGwgdGhlIHJlcXVpcmVtZW50cyBpbmRpY2F0ZWQgYnkgc2VsZi5kaXN0cmlidXRpb24gYW5kCiAgICAgICAgcmV0dXJuIGFuIGl0ZXJhYmxlIG9mIHRoZSBkaXN0cyB0aGF0IHdlcmUgYnVpbHQuCiAgICAgICAgIiIiCiAgICAgICAgaXJfZCA9IGRpc3QuZmV0Y2hfYnVpbGRfZWdncyhkaXN0Lmluc3RhbGxfcmVxdWlyZXMpCiAgICAgICAgdHJfZCA9IGRpc3QuZmV0Y2hfYnVpbGRfZWdncyhkaXN0LnRlc3RzX3JlcXVpcmUgb3IgW10pCiAgICAgICAgZXJfZCA9IGRpc3QuZmV0Y2hfYnVpbGRfZWdncygKICAgICAgICAgICAgdiBmb3IgaywgdiBpbiBkaXN0LmV4dHJhc19yZXF1aXJlLml0ZW1zKCkKICAgICAgICAgICAgaWYgay5zdGFydHN3aXRoKCc6JykgYW5kIGV2YWx1YXRlX21hcmtlcihrWzE6XSkKICAgICAgICApCiAgICAgICAgcmV0dXJuIGl0ZXJ0b29scy5jaGFpbihpcl9kLCB0cl9kLCBlcl9kKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgaW5zdGFsbGVkX2Rpc3RzID0gc2VsZi5pbnN0YWxsX2Rpc3RzKHNlbGYuZGlzdHJpYnV0aW9uKQoKICAgICAgICBjbWQgPSAnICcuam9pbihzZWxmLl9hcmd2KQogICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnc2tpcHBpbmcgIiVzIiAoZHJ5IHJ1biknICUgY21kKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5hbm5vdW5jZSgncnVubmluZyAiJXMiJyAlIGNtZCkKCiAgICAgICAgcGF0aHMgPSBtYXAob3BlcmF0b3IuYXR0cmdldHRlcignbG9jYXRpb24nKSwgaW5zdGFsbGVkX2Rpc3RzKQogICAgICAgIHdpdGggc2VsZi5wYXRoc19vbl9weXRob25wYXRoKHBhdGhzKToKICAgICAgICAgICAgd2l0aCBzZWxmLnByb2plY3Rfb25fc3lzX3BhdGgoKToKICAgICAgICAgICAgICAgIHNlbGYucnVuX3Rlc3RzKCkKCiAgICBkZWYgcnVuX3Rlc3RzKHNlbGYpOgogICAgICAgICMgUHVyZ2UgbW9kdWxlcyB1bmRlciB0ZXN0IGZyb20gc3lzLm1vZHVsZXMuIFRoZSB0ZXN0IGxvYWRlciB3aWxsCiAgICAgICAgIyByZS1pbXBvcnQgdGhlbSBmcm9tIHRoZSBidWlsZCBsb2NhdGlvbi4gUmVxdWlyZWQgd2hlbiAydG8zIGlzIHVzZWQKICAgICAgICAjIHdpdGggbmFtZXNwYWNlIHBhY2thZ2VzLgogICAgICAgIGlmIHNpeC5QWTMgYW5kIGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICd1c2VfMnRvMycsIEZhbHNlKToKICAgICAgICAgICAgbW9kdWxlID0gc2VsZi50ZXN0X3N1aXRlLnNwbGl0KCcuJylbMF0KICAgICAgICAgICAgaWYgbW9kdWxlIGluIF9uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgICAgICBkZWxfbW9kdWxlcyA9IFtdCiAgICAgICAgICAgICAgICBpZiBtb2R1bGUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICAgICAgICAgZGVsX21vZHVsZXMuYXBwZW5kKG1vZHVsZSkKICAgICAgICAgICAgICAgIG1vZHVsZSArPSAnLicKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHN5cy5tb2R1bGVzOgogICAgICAgICAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aChtb2R1bGUpOgogICAgICAgICAgICAgICAgICAgICAgICBkZWxfbW9kdWxlcy5hcHBlbmQobmFtZSkKICAgICAgICAgICAgICAgIGxpc3QobWFwKHN5cy5tb2R1bGVzLl9fZGVsaXRlbV9fLCBkZWxfbW9kdWxlcykpCgogICAgICAgIHRlc3QgPSB1bml0dGVzdC5tYWluKAogICAgICAgICAgICBOb25lLCBOb25lLCBzZWxmLl9hcmd2LAogICAgICAgICAgICB0ZXN0TG9hZGVyPXNlbGYuX3Jlc29sdmVfYXNfZXAoc2VsZi50ZXN0X2xvYWRlciksCiAgICAgICAgICAgIHRlc3RSdW5uZXI9c2VsZi5fcmVzb2x2ZV9hc19lcChzZWxmLnRlc3RfcnVubmVyKSwKICAgICAgICAgICAgZXhpdD1GYWxzZSwKICAgICAgICApCiAgICAgICAgaWYgbm90IHRlc3QucmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKToKICAgICAgICAgICAgbXNnID0gJ1Rlc3QgZmFpbGVkOiAlcycgJSB0ZXN0LnJlc3VsdAogICAgICAgICAgICBzZWxmLmFubm91bmNlKG1zZywgbG9nLkVSUk9SKQogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihtc2cpCgogICAgQHByb3BlcnR5CiAgICBkZWYgX2FyZ3Yoc2VsZik6CiAgICAgICAgcmV0dXJuIFsndW5pdHRlc3QnXSArIHNlbGYudGVzdF9hcmdzCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9yZXNvbHZlX2FzX2VwKHZhbCk6CiAgICAgICAgIiIiCiAgICAgICAgTG9hZCB0aGUgaW5kaWNhdGVkIGF0dHJpYnV0ZSB2YWx1ZSwgY2FsbGVkLCBhcyBhIGFzIGlmIGl0IHdlcmUKICAgICAgICBzcGVjaWZpZWQgYXMgYW4gZW50cnkgcG9pbnQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgdmFsIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHBhcnNlZCA9IEVudHJ5UG9pbnQucGFyc2UoIng9IiArIHZhbCkKICAgICAgICByZXR1cm4gcGFyc2VkLnJlc29sdmUoKSgpClBLAwQUAAAAAAAAACEA2SSLZ5QEAACUBAAANAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC91cGxvYWQucHlpbXBvcnQgZ2V0cGFzcwpmcm9tIGRpc3R1dGlscy5jb21tYW5kIGltcG9ydCB1cGxvYWQgYXMgb3JpZwoKCmNsYXNzIHVwbG9hZChvcmlnLnVwbG9hZCk6CiAgICAiIiIKICAgIE92ZXJyaWRlIGRlZmF1bHQgdXBsb2FkIGJlaGF2aW9yIHRvIG9idGFpbiBwYXNzd29yZAogICAgaW4gYSB2YXJpZXR5IG9mIGRpZmZlcmVudCB3YXlzLgogICAgIiIiCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3JpZy51cGxvYWQuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYudXNlcm5hbWUgPSAoCiAgICAgICAgICAgIHNlbGYudXNlcm5hbWUgb3IKICAgICAgICAgICAgZ2V0cGFzcy5nZXR1c2VyKCkKICAgICAgICApCiAgICAgICAgIyBBdHRlbXB0IHRvIG9idGFpbiBwYXNzd29yZC4gU2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uIGF0IHRoZSBmaXJzdAogICAgICAgICMgc2lnbiBvZiBzdWNjZXNzLgogICAgICAgIHNlbGYucGFzc3dvcmQgPSAoCiAgICAgICAgICAgIHNlbGYucGFzc3dvcmQgb3IKICAgICAgICAgICAgc2VsZi5fbG9hZF9wYXNzd29yZF9mcm9tX2tleXJpbmcoKSBvcgogICAgICAgICAgICBzZWxmLl9wcm9tcHRfZm9yX3Bhc3N3b3JkKCkKICAgICAgICApCgogICAgZGVmIF9sb2FkX3Bhc3N3b3JkX2Zyb21fa2V5cmluZyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBBdHRlbXB0IHRvIGxvYWQgcGFzc3dvcmQgZnJvbSBrZXlyaW5nLiBTdXBwcmVzcyBFeGNlcHRpb25zLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAga2V5cmluZyA9IF9faW1wb3J0X18oJ2tleXJpbmcnKQogICAgICAgICAgICByZXR1cm4ga2V5cmluZy5nZXRfcGFzc3dvcmQoc2VsZi5yZXBvc2l0b3J5LCBzZWxmLnVzZXJuYW1lKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgX3Byb21wdF9mb3JfcGFzc3dvcmQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUHJvbXB0IGZvciBhIHBhc3N3b3JkIG9uIHRoZSB0dHkuIFN1cHByZXNzIEV4Y2VwdGlvbnMuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gZ2V0cGFzcy5nZXRwYXNzKCkKICAgICAgICBleGNlcHQgKEV4Y2VwdGlvbiwgS2V5Ym9hcmRJbnRlcnJ1cHQpOgogICAgICAgICAgICBwYXNzClBLAwQUAAAAAAAAACEA8pfzxo8cAACPHAAAOQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC91cGxvYWRfZG9jcy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiIiInVwbG9hZF9kb2NzCgpJbXBsZW1lbnRzIGEgRGlzdHV0aWxzICd1cGxvYWRfZG9jcycgc3ViY29tbWFuZCAodXBsb2FkIGRvY3VtZW50YXRpb24gdG8KUHlQSSdzIHB5dGhvbmhvc3RlZC5vcmcpLgoiIiIKCmZyb20gYmFzZTY0IGltcG9ydCBzdGFuZGFyZF9iNjRlbmNvZGUKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCmltcG9ydCBvcwppbXBvcnQgc29ja2V0CmltcG9ydCB6aXBmaWxlCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgc2h1dGlsCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IGZ1bmN0b29scwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBodHRwX2NsaWVudCwgdXJsbGliCgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IGl0ZXJfZW50cnlfcG9pbnRzCmZyb20gLnVwbG9hZCBpbXBvcnQgdXBsb2FkCgoKZGVmIF9lbmNvZGUocyk6CiAgICBlcnJvcnMgPSAnc3Vycm9nYXRlZXNjYXBlJyBpZiBzaXguUFkzIGVsc2UgJ3N0cmljdCcKICAgIHJldHVybiBzLmVuY29kZSgndXRmLTgnLCBlcnJvcnMpCgoKY2xhc3MgdXBsb2FkX2RvY3ModXBsb2FkKToKICAgICMgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcmVwb3NpdG9yeSBhcyB1cGxvYWRfZG9jcyBpc24ndAogICAgIyBzdXBwb3J0ZWQgYnkgV2FyZWhvdXNlIChhbmQgd29uJ3QgYmUpLgogICAgREVGQVVMVF9SRVBPU0lUT1JZID0gJ2h0dHBzOi8vcHlwaS5weXRob24ub3JnL3B5cGkvJwoKICAgIGRlc2NyaXB0aW9uID0gJ1VwbG9hZCBkb2N1bWVudGF0aW9uIHRvIFB5UEknCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgncmVwb3NpdG9yeT0nLCAncicsCiAgICAgICAgICJ1cmwgb2YgcmVwb3NpdG9yeSBbZGVmYXVsdDogJXNdIiAlIHVwbG9hZC5ERUZBVUxUX1JFUE9TSVRPUlkpLAogICAgICAgICgnc2hvdy1yZXNwb25zZScsIE5vbmUsCiAgICAgICAgICdkaXNwbGF5IGZ1bGwgcmVzcG9uc2UgdGV4dCBmcm9tIHNlcnZlcicpLAogICAgICAgICgndXBsb2FkLWRpcj0nLCBOb25lLCAnZGlyZWN0b3J5IHRvIHVwbG9hZCcpLAogICAgXQogICAgYm9vbGVhbl9vcHRpb25zID0gdXBsb2FkLmJvb2xlYW5fb3B0aW9ucwoKICAgIGRlZiBoYXNfc3BoaW54KHNlbGYpOgogICAgICAgIGlmIHNlbGYudXBsb2FkX2RpciBpcyBOb25lOgogICAgICAgICAgICBmb3IgZXAgaW4gaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5jb21tYW5kcycsICdidWlsZF9zcGhpbngnKToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgc3ViX2NvbW1hbmRzID0gWygnYnVpbGRfc3BoaW54JywgaGFzX3NwaGlueCldCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICB1cGxvYWQuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi51cGxvYWRfZGlyID0gTm9uZQogICAgICAgIHNlbGYudGFyZ2V0X2RpciA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICB1cGxvYWQuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIGlmIHNlbGYudXBsb2FkX2RpciBpcyBOb25lOgogICAgICAgICAgICBpZiBzZWxmLmhhc19zcGhpbngoKToKICAgICAgICAgICAgICAgIGJ1aWxkX3NwaGlueCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9zcGhpbngnKQogICAgICAgICAgICAgICAgc2VsZi50YXJnZXRfZGlyID0gYnVpbGRfc3BoaW54LmJ1aWxkZXJfdGFyZ2V0X2RpcgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYnVpbGQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGQnKQogICAgICAgICAgICAgICAgc2VsZi50YXJnZXRfZGlyID0gb3MucGF0aC5qb2luKGJ1aWxkLmJ1aWxkX2Jhc2UsICdkb2NzJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmVuc3VyZV9kaXJuYW1lKCd1cGxvYWRfZGlyJykKICAgICAgICAgICAgc2VsZi50YXJnZXRfZGlyID0gc2VsZi51cGxvYWRfZGlyCiAgICAgICAgaWYgJ3B5cGkucHl0aG9uLm9yZycgaW4gc2VsZi5yZXBvc2l0b3J5OgogICAgICAgICAgICBsb2cud2FybigiVXBsb2FkX2RvY3MgY29tbWFuZCBpcyBkZXByZWNhdGVkLiBVc2UgUlREIGluc3RlYWQuIikKICAgICAgICBzZWxmLmFubm91bmNlKCdVc2luZyB1cGxvYWQgZGlyZWN0b3J5ICVzJyAlIHNlbGYudGFyZ2V0X2RpcikKCiAgICBkZWYgY3JlYXRlX3ppcGZpbGUoc2VsZiwgZmlsZW5hbWUpOgogICAgICAgIHppcF9maWxlID0gemlwZmlsZS5aaXBGaWxlKGZpbGVuYW1lLCAidyIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLm1rcGF0aChzZWxmLnRhcmdldF9kaXIpICAjIGp1c3QgaW4gY2FzZQogICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhzZWxmLnRhcmdldF9kaXIpOgogICAgICAgICAgICAgICAgaWYgcm9vdCA9PSBzZWxmLnRhcmdldF9kaXIgYW5kIG5vdCBmaWxlczoKICAgICAgICAgICAgICAgICAgICB0bXBsID0gIm5vIGZpbGVzIGZvdW5kIGluIHVwbG9hZCBkaXJlY3RvcnkgJyVzJyIKICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcih0bXBsICUgc2VsZi50YXJnZXRfZGlyKQogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICAgICAgZnVsbCA9IG9zLnBhdGguam9pbihyb290LCBuYW1lKQogICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlID0gcm9vdFtsZW4oc2VsZi50YXJnZXRfZGlyKTpdLmxzdHJpcChvcy5wYXRoLnNlcCkKICAgICAgICAgICAgICAgICAgICBkZXN0ID0gb3MucGF0aC5qb2luKHJlbGF0aXZlLCBuYW1lKQogICAgICAgICAgICAgICAgICAgIHppcF9maWxlLndyaXRlKGZ1bGwsIGRlc3QpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgemlwX2ZpbGUuY2xvc2UoKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIyBSdW4gc3ViIGNvbW1hbmRzCiAgICAgICAgZm9yIGNtZF9uYW1lIGluIHNlbGYuZ2V0X3N1Yl9jb21tYW5kcygpOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKGNtZF9uYW1lKQoKICAgICAgICB0bXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICAgICAgbmFtZSA9IHNlbGYuZGlzdHJpYnV0aW9uLm1ldGFkYXRhLmdldF9uYW1lKCkKICAgICAgICB6aXBfZmlsZSA9IG9zLnBhdGguam9pbih0bXBfZGlyLCAiJXMuemlwIiAlIG5hbWUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmNyZWF0ZV96aXBmaWxlKHppcF9maWxlKQogICAgICAgICAgICBzZWxmLnVwbG9hZF9maWxlKHppcF9maWxlKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodG1wX2RpcikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2J1aWxkX3BhcnQoaXRlbSwgc2VwX2JvdW5kYXJ5KToKICAgICAgICBrZXksIHZhbHVlcyA9IGl0ZW0KICAgICAgICB0aXRsZSA9ICdcbkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iJXMiJyAlIGtleQogICAgICAgICMgaGFuZGxlIG11bHRpcGxlIGVudHJpZXMgZm9yIHRoZSBzYW1lIG5hbWUKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZXMsIGxpc3QpOgogICAgICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXQogICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXM6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKICAgICAgICAgICAgICAgIHRpdGxlICs9ICc7IGZpbGVuYW1lPSIlcyInICUgdmFsdWVbMF0KICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbMV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZhbHVlID0gX2VuY29kZSh2YWx1ZSkKICAgICAgICAgICAgeWllbGQgc2VwX2JvdW5kYXJ5CiAgICAgICAgICAgIHlpZWxkIF9lbmNvZGUodGl0bGUpCiAgICAgICAgICAgIHlpZWxkIGIiXG5cbiIKICAgICAgICAgICAgeWllbGQgdmFsdWUKICAgICAgICAgICAgaWYgdmFsdWUgYW5kIHZhbHVlWy0xOl0gPT0gYidccic6CiAgICAgICAgICAgICAgICB5aWVsZCBiJ1xuJyAgIyB3cml0ZSBhbiBleHRyYSBuZXdsaW5lIChsdXJ2ZSBNYWNzKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9idWlsZF9tdWx0aXBhcnQoY2xzLCBkYXRhKToKICAgICAgICAiIiIKICAgICAgICBCdWlsZCB1cCB0aGUgTUlNRSBwYXlsb2FkIGZvciB0aGUgUE9TVCBkYXRhCiAgICAgICAgIiIiCiAgICAgICAgYm91bmRhcnkgPSBiJy0tLS0tLS0tLS0tLS0tR0hTS0ZKRExHRFM3NTQzRkpLTEZIUkU3NTY0Mjc1Njc0MzI1NCcKICAgICAgICBzZXBfYm91bmRhcnkgPSBiJ1xuLS0nICsgYm91bmRhcnkKICAgICAgICBlbmRfYm91bmRhcnkgPSBzZXBfYm91bmRhcnkgKyBiJy0tJwogICAgICAgIGVuZF9pdGVtcyA9IGVuZF9ib3VuZGFyeSwgYiJcbiIsCiAgICAgICAgYnVpbGRlciA9IGZ1bmN0b29scy5wYXJ0aWFsKAogICAgICAgICAgICBjbHMuX2J1aWxkX3BhcnQsCiAgICAgICAgICAgIHNlcF9ib3VuZGFyeT1zZXBfYm91bmRhcnksCiAgICAgICAgKQogICAgICAgIHBhcnRfZ3JvdXBzID0gbWFwKGJ1aWxkZXIsIGRhdGEuaXRlbXMoKSkKICAgICAgICBwYXJ0cyA9IGl0ZXJ0b29scy5jaGFpbi5mcm9tX2l0ZXJhYmxlKHBhcnRfZ3JvdXBzKQogICAgICAgIGJvZHlfaXRlbXMgPSBpdGVydG9vbHMuY2hhaW4ocGFydHMsIGVuZF9pdGVtcykKICAgICAgICBjb250ZW50X3R5cGUgPSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JXMnICUgYm91bmRhcnkuZGVjb2RlKCdhc2NpaScpCiAgICAgICAgcmV0dXJuIGInJy5qb2luKGJvZHlfaXRlbXMpLCBjb250ZW50X3R5cGUKCiAgICBkZWYgdXBsb2FkX2ZpbGUoc2VsZiwgZmlsZW5hbWUpOgogICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgY29udGVudCA9IGYucmVhZCgpCiAgICAgICAgbWV0YSA9IHNlbGYuZGlzdHJpYnV0aW9uLm1ldGFkYXRhCiAgICAgICAgZGF0YSA9IHsKICAgICAgICAgICAgJzphY3Rpb24nOiAnZG9jX3VwbG9hZCcsCiAgICAgICAgICAgICduYW1lJzogbWV0YS5nZXRfbmFtZSgpLAogICAgICAgICAgICAnY29udGVudCc6IChvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSwgY29udGVudCksCiAgICAgICAgfQogICAgICAgICMgc2V0IHVwIHRoZSBhdXRoZW50aWNhdGlvbgogICAgICAgIGNyZWRlbnRpYWxzID0gX2VuY29kZShzZWxmLnVzZXJuYW1lICsgJzonICsgc2VsZi5wYXNzd29yZCkKICAgICAgICBjcmVkZW50aWFscyA9IHN0YW5kYXJkX2I2NGVuY29kZShjcmVkZW50aWFscykKICAgICAgICBpZiBzaXguUFkzOgogICAgICAgICAgICBjcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzLmRlY29kZSgnYXNjaWknKQogICAgICAgIGF1dGggPSAiQmFzaWMgIiArIGNyZWRlbnRpYWxzCgogICAgICAgIGJvZHksIGN0ID0gc2VsZi5fYnVpbGRfbXVsdGlwYXJ0KGRhdGEpCgogICAgICAgIG1zZyA9ICJTdWJtaXR0aW5nIGRvY3VtZW50YXRpb24gdG8gJXMiICUgKHNlbGYucmVwb3NpdG9yeSkKICAgICAgICBzZWxmLmFubm91bmNlKG1zZywgbG9nLklORk8pCgogICAgICAgICMgYnVpbGQgdGhlIFJlcXVlc3QKICAgICAgICAjIFdlIGNhbid0IHVzZSB1cmxsaWIyIHNpbmNlIHdlIG5lZWQgdG8gc2VuZCB0aGUgQmFzaWMKICAgICAgICAjIGF1dGggcmlnaHQgd2l0aCB0aGUgZmlyc3QgcmVxdWVzdAogICAgICAgIHNjaGVtYSwgbmV0bG9jLCB1cmwsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50cyA9IFwKICAgICAgICAgICAgdXJsbGliLnBhcnNlLnVybHBhcnNlKHNlbGYucmVwb3NpdG9yeSkKICAgICAgICBhc3NlcnQgbm90IHBhcmFtcyBhbmQgbm90IHF1ZXJ5IGFuZCBub3QgZnJhZ21lbnRzCiAgICAgICAgaWYgc2NoZW1hID09ICdodHRwJzoKICAgICAgICAgICAgY29ubiA9IGh0dHBfY2xpZW50LkhUVFBDb25uZWN0aW9uKG5ldGxvYykKICAgICAgICBlbGlmIHNjaGVtYSA9PSAnaHR0cHMnOgogICAgICAgICAgICBjb25uID0gaHR0cF9jbGllbnQuSFRUUFNDb25uZWN0aW9uKG5ldGxvYykKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigidW5zdXBwb3J0ZWQgc2NoZW1hICIgKyBzY2hlbWEpCgogICAgICAgIGRhdGEgPSAnJwogICAgICAgIHRyeToKICAgICAgICAgICAgY29ubi5jb25uZWN0KCkKICAgICAgICAgICAgY29ubi5wdXRyZXF1ZXN0KCJQT1NUIiwgdXJsKQogICAgICAgICAgICBjb250ZW50X3R5cGUgPSBjdAogICAgICAgICAgICBjb25uLnB1dGhlYWRlcignQ29udGVudC10eXBlJywgY29udGVudF90eXBlKQogICAgICAgICAgICBjb25uLnB1dGhlYWRlcignQ29udGVudC1sZW5ndGgnLCBzdHIobGVuKGJvZHkpKSkKICAgICAgICAgICAgY29ubi5wdXRoZWFkZXIoJ0F1dGhvcml6YXRpb24nLCBhdXRoKQogICAgICAgICAgICBjb25uLmVuZGhlYWRlcnMoKQogICAgICAgICAgICBjb25uLnNlbmQoYm9keSkKICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGU6CiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2Uoc3RyKGUpLCBsb2cuRVJST1IpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICByID0gY29ubi5nZXRyZXNwb25zZSgpCiAgICAgICAgaWYgci5zdGF0dXMgPT0gMjAwOgogICAgICAgICAgICBtc2cgPSAnU2VydmVyIHJlc3BvbnNlICglcyk6ICVzJyAlIChyLnN0YXR1cywgci5yZWFzb24pCiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UobXNnLCBsb2cuSU5GTykKICAgICAgICBlbGlmIHIuc3RhdHVzID09IDMwMToKICAgICAgICAgICAgbG9jYXRpb24gPSByLmdldGhlYWRlcignTG9jYXRpb24nKQogICAgICAgICAgICBpZiBsb2NhdGlvbiBpcyBOb25lOgogICAgICAgICAgICAgICAgbG9jYXRpb24gPSAnaHR0cHM6Ly9weXRob25ob3N0ZWQub3JnLyVzLycgJSBtZXRhLmdldF9uYW1lKCkKICAgICAgICAgICAgbXNnID0gJ1VwbG9hZCBzdWNjZXNzZnVsLiBWaXNpdCAlcycgJSBsb2NhdGlvbgogICAgICAgICAgICBzZWxmLmFubm91bmNlKG1zZywgbG9nLklORk8pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbXNnID0gJ1VwbG9hZCBmYWlsZWQgKCVzKTogJXMnICUgKHIuc3RhdHVzLCByLnJlYXNvbikKICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShtc2csIGxvZy5FUlJPUikKICAgICAgICBpZiBzZWxmLnNob3dfcmVzcG9uc2U6CiAgICAgICAgICAgIHByaW50KCctJyAqIDc1LCByLnJlYWQoKSwgJy0nICogNzUpClBLAwQUAAAAAAAAACEAiUcQJLE/AACxPwAALAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29uZmlnLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIHVuaWNvZGVfbGl0ZXJhbHMKaW1wb3J0IGlvCmltcG9ydCBvcwppbXBvcnQgc3lzCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CmZyb20gZnVuY3Rvb2xzIGltcG9ydCBwYXJ0aWFsCmZyb20gaW1wb3J0bGliIGltcG9ydCBpbXBvcnRfbW9kdWxlCgpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yLCBEaXN0dXRpbHNGaWxlRXJyb3IKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXggaW1wb3J0IHN0cmluZ190eXBlcwoKCmRlZiByZWFkX2NvbmZpZ3VyYXRpb24oCiAgICAgICAgZmlsZXBhdGgsIGZpbmRfb3RoZXJzPUZhbHNlLCBpZ25vcmVfb3B0aW9uX2Vycm9ycz1GYWxzZSk6CiAgICAiIiJSZWFkIGdpdmVuIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgcmV0dXJucyBvcHRpb25zIGZyb20gaXQgYXMgYSBkaWN0LgoKICAgIDpwYXJhbSBzdHJ8dW5pY29kZSBmaWxlcGF0aDogUGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUKICAgICAgICB0byBnZXQgb3B0aW9ucyBmcm9tLgoKICAgIDpwYXJhbSBib29sIGZpbmRfb3RoZXJzOiBXaGV0aGVyIHRvIHNlYXJjaCBmb3Igb3RoZXIgY29uZmlndXJhdGlvbiBmaWxlcwogICAgICAgIHdoaWNoIGNvdWxkIGJlIG9uIGluIHZhcmlvdXMgcGxhY2VzLgoKICAgIDpwYXJhbSBib29sIGlnbm9yZV9vcHRpb25fZXJyb3JzOiBXaGV0aGVyIHRvIHNpbGVudGx5IGlnbm9yZQogICAgICAgIG9wdGlvbnMsIHZhbHVlcyBvZiB3aGljaCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgKGUuZy4gZHVlIHRvIGV4Y2VwdGlvbnMKICAgICAgICBpbiBkaXJlY3RpdmVzIHN1Y2ggYXMgZmlsZTosIGF0dHI6LCBldGMuKS4KICAgICAgICBJZiBGYWxzZSBleGNlcHRpb25zIGFyZSBwcm9wYWdhdGVkIGFzIGV4cGVjdGVkLgoKICAgIDpydHlwZTogZGljdAogICAgIiIiCiAgICBmcm9tIHNldHVwdG9vbHMuZGlzdCBpbXBvcnQgRGlzdHJpYnV0aW9uLCBfRGlzdHJpYnV0aW9uCgogICAgZmlsZXBhdGggPSBvcy5wYXRoLmFic3BhdGgoZmlsZXBhdGgpCgogICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGZpbGVwYXRoKToKICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IoCiAgICAgICAgICAgICdDb25maWd1cmF0aW9uIGZpbGUgJXMgZG9lcyBub3QgZXhpc3QuJyAlIGZpbGVwYXRoKQoKICAgIGN1cnJlbnRfZGlyZWN0b3J5ID0gb3MuZ2V0Y3dkKCkKICAgIG9zLmNoZGlyKG9zLnBhdGguZGlybmFtZShmaWxlcGF0aCkpCgogICAgdHJ5OgogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oKQoKICAgICAgICBmaWxlbmFtZXMgPSBkaXN0LmZpbmRfY29uZmlnX2ZpbGVzKCkgaWYgZmluZF9vdGhlcnMgZWxzZSBbXQogICAgICAgIGlmIGZpbGVwYXRoIG5vdCBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQoZmlsZXBhdGgpCgogICAgICAgIF9EaXN0cmlidXRpb24ucGFyc2VfY29uZmlnX2ZpbGVzKGRpc3QsIGZpbGVuYW1lcz1maWxlbmFtZXMpCgogICAgICAgIGhhbmRsZXJzID0gcGFyc2VfY29uZmlndXJhdGlvbigKICAgICAgICAgICAgZGlzdCwgZGlzdC5jb21tYW5kX29wdGlvbnMsCiAgICAgICAgICAgIGlnbm9yZV9vcHRpb25fZXJyb3JzPWlnbm9yZV9vcHRpb25fZXJyb3JzKQoKICAgIGZpbmFsbHk6CiAgICAgICAgb3MuY2hkaXIoY3VycmVudF9kaXJlY3RvcnkpCgogICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25fdG9fZGljdChoYW5kbGVycykKCgpkZWYgY29uZmlndXJhdGlvbl90b19kaWN0KGhhbmRsZXJzKToKICAgICIiIlJldHVybnMgY29uZmlndXJhdGlvbiBkYXRhIGdhdGhlcmVkIGJ5IGdpdmVuIGhhbmRsZXJzIGFzIGEgZGljdC4KCiAgICA6cGFyYW0gbGlzdFtDb25maWdIYW5kbGVyXSBoYW5kbGVyczogSGFuZGxlcnMgbGlzdCwKICAgICAgICB1c3VhbGx5IGZyb20gcGFyc2VfY29uZmlndXJhdGlvbigpCgogICAgOnJ0eXBlOiBkaWN0CiAgICAiIiIKICAgIGNvbmZpZ19kaWN0ID0gZGVmYXVsdGRpY3QoZGljdCkKCiAgICBmb3IgaGFuZGxlciBpbiBoYW5kbGVyczoKCiAgICAgICAgb2JqX2FsaWFzID0gaGFuZGxlci5zZWN0aW9uX3ByZWZpeAogICAgICAgIHRhcmdldF9vYmogPSBoYW5kbGVyLnRhcmdldF9vYmoKCiAgICAgICAgZm9yIG9wdGlvbiBpbiBoYW5kbGVyLnNldF9vcHRpb25zOgogICAgICAgICAgICBnZXR0ZXIgPSBnZXRhdHRyKHRhcmdldF9vYmosICdnZXRfJXMnICUgb3B0aW9uLCBOb25lKQoKICAgICAgICAgICAgaWYgZ2V0dGVyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIodGFyZ2V0X29iaiwgb3B0aW9uKQoKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0dGVyKCkKCiAgICAgICAgICAgIGNvbmZpZ19kaWN0W29ial9hbGlhc11bb3B0aW9uXSA9IHZhbHVlCgogICAgcmV0dXJuIGNvbmZpZ19kaWN0CgoKZGVmIHBhcnNlX2NvbmZpZ3VyYXRpb24oCiAgICAgICAgZGlzdHJpYnV0aW9uLCBjb21tYW5kX29wdGlvbnMsIGlnbm9yZV9vcHRpb25fZXJyb3JzPUZhbHNlKToKICAgICIiIlBlcmZvcm1zIGFkZGl0aW9uYWwgcGFyc2luZyBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMKICAgIGZvciBhIGRpc3RyaWJ1dGlvbi4KCiAgICBSZXR1cm5zIGEgbGlzdCBvZiB1c2VkIG9wdGlvbiBoYW5kbGVycy4KCiAgICA6cGFyYW0gRGlzdHJpYnV0aW9uIGRpc3RyaWJ1dGlvbjoKICAgIDpwYXJhbSBkaWN0IGNvbW1hbmRfb3B0aW9uczoKICAgIDpwYXJhbSBib29sIGlnbm9yZV9vcHRpb25fZXJyb3JzOiBXaGV0aGVyIHRvIHNpbGVudGx5IGlnbm9yZQogICAgICAgIG9wdGlvbnMsIHZhbHVlcyBvZiB3aGljaCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgKGUuZy4gZHVlIHRvIGV4Y2VwdGlvbnMKICAgICAgICBpbiBkaXJlY3RpdmVzIHN1Y2ggYXMgZmlsZTosIGF0dHI6LCBldGMuKS4KICAgICAgICBJZiBGYWxzZSBleGNlcHRpb25zIGFyZSBwcm9wYWdhdGVkIGFzIGV4cGVjdGVkLgogICAgOnJ0eXBlOiBsaXN0CiAgICAiIiIKICAgIG1ldGEgPSBDb25maWdNZXRhZGF0YUhhbmRsZXIoCiAgICAgICAgZGlzdHJpYnV0aW9uLm1ldGFkYXRhLCBjb21tYW5kX29wdGlvbnMsIGlnbm9yZV9vcHRpb25fZXJyb3JzKQogICAgbWV0YS5wYXJzZSgpCgogICAgb3B0aW9ucyA9IENvbmZpZ09wdGlvbnNIYW5kbGVyKAogICAgICAgIGRpc3RyaWJ1dGlvbiwgY29tbWFuZF9vcHRpb25zLCBpZ25vcmVfb3B0aW9uX2Vycm9ycykKICAgIG9wdGlvbnMucGFyc2UoKQoKICAgIHJldHVybiBbbWV0YSwgb3B0aW9uc10KCgpjbGFzcyBDb25maWdIYW5kbGVyKG9iamVjdCk6CiAgICAiIiJIYW5kbGVzIG1ldGFkYXRhIHN1cHBsaWVkIGluIGNvbmZpZ3VyYXRpb24gZmlsZXMuIiIiCgogICAgc2VjdGlvbl9wcmVmaXggPSBOb25lCiAgICAiIiJQcmVmaXggZm9yIGNvbmZpZyBzZWN0aW9ucyBoYW5kbGVkIGJ5IHRoaXMgaGFuZGxlci4KICAgIE11c3QgYmUgcHJvdmlkZWQgYnkgY2xhc3MgaGVpcnMuCgogICAgIiIiCgogICAgYWxpYXNlcyA9IHt9CiAgICAiIiJPcHRpb25zIGFsaWFzZXMuCiAgICBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZhcmlvdXMgcGFja2FnZXMuIEUuZy46IGQydG8xIGFuZCBwYnIuCiAgICBOb3RlOiBgLWAgaW4ga2V5cyBpcyByZXBsYWNlZCB3aXRoIGBfYCBieSBjb25maWcgcGFyc2VyLgoKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJnZXRfb2JqLCBvcHRpb25zLCBpZ25vcmVfb3B0aW9uX2Vycm9ycz1GYWxzZSk6CiAgICAgICAgc2VjdGlvbnMgPSB7fQoKICAgICAgICBzZWN0aW9uX3ByZWZpeCA9IHNlbGYuc2VjdGlvbl9wcmVmaXgKICAgICAgICBmb3Igc2VjdGlvbl9uYW1lLCBzZWN0aW9uX29wdGlvbnMgaW4gb3B0aW9ucy5pdGVtcygpOgogICAgICAgICAgICBpZiBub3Qgc2VjdGlvbl9uYW1lLnN0YXJ0c3dpdGgoc2VjdGlvbl9wcmVmaXgpOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIHNlY3Rpb25fbmFtZSA9IHNlY3Rpb25fbmFtZS5yZXBsYWNlKHNlY3Rpb25fcHJlZml4LCAnJykuc3RyaXAoJy4nKQogICAgICAgICAgICBzZWN0aW9uc1tzZWN0aW9uX25hbWVdID0gc2VjdGlvbl9vcHRpb25zCgogICAgICAgIHNlbGYuaWdub3JlX29wdGlvbl9lcnJvcnMgPSBpZ25vcmVfb3B0aW9uX2Vycm9ycwogICAgICAgIHNlbGYudGFyZ2V0X29iaiA9IHRhcmdldF9vYmoKICAgICAgICBzZWxmLnNlY3Rpb25zID0gc2VjdGlvbnMKICAgICAgICBzZWxmLnNldF9vcHRpb25zID0gW10KCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXJzZXJzKHNlbGYpOgogICAgICAgICIiIk1ldGFkYXRhIGl0ZW0gbmFtZSB0byBwYXJzZXIgZnVuY3Rpb24gbWFwcGluZy4iIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAnJXMgbXVzdCBwcm92aWRlIC5wYXJzZXJzIHByb3BlcnR5JyAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fKQoKICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBvcHRpb25fbmFtZSwgdmFsdWUpOgogICAgICAgIHVua25vd24gPSB0dXBsZSgpCiAgICAgICAgdGFyZ2V0X29iaiA9IHNlbGYudGFyZ2V0X29iagoKICAgICAgICAjIFRyYW5zbGF0ZSBhbGlhcyBpbnRvIHJlYWwgbmFtZS4KICAgICAgICBvcHRpb25fbmFtZSA9IHNlbGYuYWxpYXNlcy5nZXQob3B0aW9uX25hbWUsIG9wdGlvbl9uYW1lKQoKICAgICAgICBjdXJyZW50X3ZhbHVlID0gZ2V0YXR0cih0YXJnZXRfb2JqLCBvcHRpb25fbmFtZSwgdW5rbm93bikKCiAgICAgICAgaWYgY3VycmVudF92YWx1ZSBpcyB1bmtub3duOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcihvcHRpb25fbmFtZSkKCiAgICAgICAgaWYgY3VycmVudF92YWx1ZToKICAgICAgICAgICAgIyBBbHJlYWR5IGluaGFiaXRlZC4gU2tpcHBpbmcuCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBza2lwX29wdGlvbiA9IEZhbHNlCiAgICAgICAgcGFyc2VyID0gc2VsZi5wYXJzZXJzLmdldChvcHRpb25fbmFtZSkKICAgICAgICBpZiBwYXJzZXI6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyc2VyKHZhbHVlKQoKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHNraXBfb3B0aW9uID0gVHJ1ZQogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaWdub3JlX29wdGlvbl9lcnJvcnM6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgaWYgc2tpcF9vcHRpb246CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZXR0ZXIgPSBnZXRhdHRyKHRhcmdldF9vYmosICdzZXRfJXMnICUgb3B0aW9uX25hbWUsIE5vbmUpCiAgICAgICAgaWYgc2V0dGVyIGlzIE5vbmU6CiAgICAgICAgICAgIHNldGF0dHIodGFyZ2V0X29iaiwgb3B0aW9uX25hbWUsIHZhbHVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNldHRlcih2YWx1ZSkKCiAgICAgICAgc2VsZi5zZXRfb3B0aW9ucy5hcHBlbmQob3B0aW9uX25hbWUpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2xpc3QoY2xzLCB2YWx1ZSwgc2VwYXJhdG9yPScsJyk6CiAgICAgICAgIiIiUmVwcmVzZW50cyB2YWx1ZSBhcyBhIGxpc3QuCgogICAgICAgIFZhbHVlIGlzIHNwbGl0IGVpdGhlciBieSBzZXBhcmF0b3IgKGRlZmF1bHRzIHRvIGNvbW1hKSBvciBieSBsaW5lcy4KCiAgICAgICAgOnBhcmFtIHZhbHVlOgogICAgICAgIDpwYXJhbSBzZXBhcmF0b3I6IExpc3QgaXRlbXMgc2VwYXJhdG9yIGNoYXJhY3Rlci4KICAgICAgICA6cnR5cGU6IGxpc3QKICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KTogICMgX2dldF9wYXJzZXJfY29tcG91bmQgY2FzZQogICAgICAgICAgICByZXR1cm4gdmFsdWUKCiAgICAgICAgaWYgJ1xuJyBpbiB2YWx1ZToKICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zcGxpdGxpbmVzKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0KHNlcGFyYXRvcikKCiAgICAgICAgcmV0dXJuIFtjaHVuay5zdHJpcCgpIGZvciBjaHVuayBpbiB2YWx1ZSBpZiBjaHVuay5zdHJpcCgpXQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9kaWN0KGNscywgdmFsdWUpOgogICAgICAgICIiIlJlcHJlc2VudHMgdmFsdWUgYXMgYSBkaWN0LgoKICAgICAgICA6cGFyYW0gdmFsdWU6CiAgICAgICAgOnJ0eXBlOiBkaWN0CiAgICAgICAgIiIiCiAgICAgICAgc2VwYXJhdG9yID0gJz0nCiAgICAgICAgcmVzdWx0ID0ge30KICAgICAgICBmb3IgbGluZSBpbiBjbHMuX3BhcnNlX2xpc3QodmFsdWUpOgogICAgICAgICAgICBrZXksIHNlcCwgdmFsID0gbGluZS5wYXJ0aXRpb24oc2VwYXJhdG9yKQogICAgICAgICAgICBpZiBzZXAgIT0gc2VwYXJhdG9yOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBwYXJzZSBvcHRpb24gdmFsdWUgdG8gZGljdDogJXMnICUgdmFsdWUpCiAgICAgICAgICAgIHJlc3VsdFtrZXkuc3RyaXAoKV0gPSB2YWwuc3RyaXAoKQoKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2Jvb2woY2xzLCB2YWx1ZSk6CiAgICAgICAgIiIiUmVwcmVzZW50cyB2YWx1ZSBhcyBib29sZWFuLgoKICAgICAgICA6cGFyYW0gdmFsdWU6CiAgICAgICAgOnJ0eXBlOiBib29sCiAgICAgICAgIiIiCiAgICAgICAgdmFsdWUgPSB2YWx1ZS5sb3dlcigpCiAgICAgICAgcmV0dXJuIHZhbHVlIGluICgnMScsICd0cnVlJywgJ3llcycpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2ZpbGUoY2xzLCB2YWx1ZSk6CiAgICAgICAgIiIiUmVwcmVzZW50cyB2YWx1ZSBhcyBhIHN0cmluZywgYWxsb3dpbmcgaW5jbHVkaW5nIHRleHQKICAgICAgICBmcm9tIG5lYXJlc3QgZmlsZXMgdXNpbmcgYGZpbGU6YCBkaXJlY3RpdmUuCgogICAgICAgIERpcmVjdGl2ZSBpcyBzYW5kYm94ZWQgYW5kIHdvbid0IHJlYWNoIGFueXRoaW5nIG91dHNpZGUKICAgICAgICBkaXJlY3Rvcnkgd2l0aCBzZXR1cC5weS4KCiAgICAgICAgRXhhbXBsZXM6CiAgICAgICAgICAgIGZpbGU6IExJQ0VOU0UKICAgICAgICAgICAgZmlsZTogUkVBRE1FLnJzdCwgQ0hBTkdFTE9HLm1kLCBzcmMvZmlsZS50eHQKCiAgICAgICAgOnBhcmFtIHN0ciB2YWx1ZToKICAgICAgICA6cnR5cGU6IHN0cgogICAgICAgICIiIgogICAgICAgIGluY2x1ZGVfZGlyZWN0aXZlID0gJ2ZpbGU6JwoKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgICAgIGlmIG5vdCB2YWx1ZS5zdGFydHN3aXRoKGluY2x1ZGVfZGlyZWN0aXZlKToKICAgICAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgICAgIHNwZWMgPSB2YWx1ZVtsZW4oaW5jbHVkZV9kaXJlY3RpdmUpOl0KICAgICAgICBmaWxlcGF0aHMgPSAob3MucGF0aC5hYnNwYXRoKHBhdGguc3RyaXAoKSkgZm9yIHBhdGggaW4gc3BlYy5zcGxpdCgnLCcpKQogICAgICAgIHJldHVybiAnXG4nLmpvaW4oCiAgICAgICAgICAgIGNscy5fcmVhZF9maWxlKHBhdGgpCiAgICAgICAgICAgIGZvciBwYXRoIGluIGZpbGVwYXRocwogICAgICAgICAgICBpZiAoY2xzLl9hc3NlcnRfbG9jYWwocGF0aCkgb3IgVHJ1ZSkKICAgICAgICAgICAgYW5kIG9zLnBhdGguaXNmaWxlKHBhdGgpCiAgICAgICAgKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfYXNzZXJ0X2xvY2FsKGZpbGVwYXRoKToKICAgICAgICBpZiBub3QgZmlsZXBhdGguc3RhcnRzd2l0aChvcy5nZXRjd2QoKSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgJ2BmaWxlOmAgZGlyZWN0aXZlIGNhbiBub3QgYWNjZXNzICVzJyAlIGZpbGVwYXRoKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfcmVhZF9maWxlKGZpbGVwYXRoKToKICAgICAgICB3aXRoIGlvLm9wZW4oZmlsZXBhdGgsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGY6CiAgICAgICAgICAgIHJldHVybiBmLnJlYWQoKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9hdHRyKGNscywgdmFsdWUpOgogICAgICAgICIiIlJlcHJlc2VudHMgdmFsdWUgYXMgYSBtb2R1bGUgYXR0cmlidXRlLgoKICAgICAgICBFeGFtcGxlczoKICAgICAgICAgICAgYXR0cjogcGFja2FnZS5hdHRyCiAgICAgICAgICAgIGF0dHI6IHBhY2thZ2UubW9kdWxlLmF0dHIKCiAgICAgICAgOnBhcmFtIHN0ciB2YWx1ZToKICAgICAgICA6cnR5cGU6IHN0cgogICAgICAgICIiIgogICAgICAgIGF0dHJfZGlyZWN0aXZlID0gJ2F0dHI6JwogICAgICAgIGlmIG5vdCB2YWx1ZS5zdGFydHN3aXRoKGF0dHJfZGlyZWN0aXZlKToKICAgICAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgICAgIGF0dHJzX3BhdGggPSB2YWx1ZS5yZXBsYWNlKGF0dHJfZGlyZWN0aXZlLCAnJykuc3RyaXAoKS5zcGxpdCgnLicpCiAgICAgICAgYXR0cl9uYW1lID0gYXR0cnNfcGF0aC5wb3AoKQoKICAgICAgICBtb2R1bGVfbmFtZSA9ICcuJy5qb2luKGF0dHJzX3BhdGgpCiAgICAgICAgbW9kdWxlX25hbWUgPSBtb2R1bGVfbmFtZSBvciAnX19pbml0X18nCgogICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5nZXRjd2QoKSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIG1vZHVsZSA9IGltcG9ydF9tb2R1bGUobW9kdWxlX25hbWUpCiAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihtb2R1bGUsIGF0dHJfbmFtZSkKCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc3lzLnBhdGggPSBzeXMucGF0aFsxOl0KCiAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2dldF9wYXJzZXJfY29tcG91bmQoY2xzLCAqcGFyc2VfbWV0aG9kcyk6CiAgICAgICAgIiIiUmV0dXJucyBwYXJzZXIgZnVuY3Rpb24gdG8gcmVwcmVzZW50cyB2YWx1ZSBhcyBhIGxpc3QuCgogICAgICAgIFBhcnNlcyBhIHZhbHVlIGFwcGx5aW5nIGdpdmVuIG1ldGhvZHMgb25lIGFmdGVyIGFub3RoZXIuCgogICAgICAgIDpwYXJhbSBwYXJzZV9tZXRob2RzOgogICAgICAgIDpydHlwZTogY2FsbGFibGUKICAgICAgICAiIiIKICAgICAgICBkZWYgcGFyc2UodmFsdWUpOgogICAgICAgICAgICBwYXJzZWQgPSB2YWx1ZQoKICAgICAgICAgICAgZm9yIG1ldGhvZCBpbiBwYXJzZV9tZXRob2RzOgogICAgICAgICAgICAgICAgcGFyc2VkID0gbWV0aG9kKHBhcnNlZCkKCiAgICAgICAgICAgIHJldHVybiBwYXJzZWQKCiAgICAgICAgcmV0dXJuIHBhcnNlCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX3NlY3Rpb25fdG9fZGljdChjbHMsIHNlY3Rpb25fb3B0aW9ucywgdmFsdWVzX3BhcnNlcj1Ob25lKToKICAgICAgICAiIiJQYXJzZXMgc2VjdGlvbiBvcHRpb25zIGludG8gYSBkaWN0aW9uYXJ5LgoKICAgICAgICBPcHRpb25hbGx5IGFwcGxpZXMgYSBnaXZlbiBwYXJzZXIgdG8gdmFsdWVzLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgOnBhcmFtIGNhbGxhYmxlIHZhbHVlc19wYXJzZXI6CiAgICAgICAgOnJ0eXBlOiBkaWN0CiAgICAgICAgIiIiCiAgICAgICAgdmFsdWUgPSB7fQogICAgICAgIHZhbHVlc19wYXJzZXIgPSB2YWx1ZXNfcGFyc2VyIG9yIChsYW1iZGEgdmFsOiB2YWwpCiAgICAgICAgZm9yIGtleSwgKF8sIHZhbCkgaW4gc2VjdGlvbl9vcHRpb25zLml0ZW1zKCk6CiAgICAgICAgICAgIHZhbHVlW2tleV0gPSB2YWx1ZXNfcGFyc2VyKHZhbCkKICAgICAgICByZXR1cm4gdmFsdWUKCiAgICBkZWYgcGFyc2Vfc2VjdGlvbihzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgICIiIlBhcnNlcyBjb25maWd1cmF0aW9uIGZpbGUgc2VjdGlvbi4KCiAgICAgICAgOnBhcmFtIGRpY3Qgc2VjdGlvbl9vcHRpb25zOgogICAgICAgICIiIgogICAgICAgIGZvciAobmFtZSwgKF8sIHZhbHVlKSkgaW4gc2VjdGlvbl9vcHRpb25zLml0ZW1zKCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSB2YWx1ZQoKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcGFzcyAgIyBLZWVwIHNpbGVudCBmb3IgYSBuZXcgb3B0aW9uIG1heSBhcHBlYXIgYW55dGltZS4KCiAgICBkZWYgcGFyc2Uoc2VsZik6CiAgICAgICAgIiIiUGFyc2VzIGNvbmZpZ3VyYXRpb24gZmlsZSBpdGVtcyBmcm9tIG9uZQogICAgICAgIG9yIG1vcmUgcmVsYXRlZCBzZWN0aW9ucy4KCiAgICAgICAgIiIiCiAgICAgICAgZm9yIHNlY3Rpb25fbmFtZSwgc2VjdGlvbl9vcHRpb25zIGluIHNlbGYuc2VjdGlvbnMuaXRlbXMoKToKCiAgICAgICAgICAgIG1ldGhvZF9wb3N0Zml4ID0gJycKICAgICAgICAgICAgaWYgc2VjdGlvbl9uYW1lOiAgIyBbc2VjdGlvbi5vcHRpb25dIHZhcmlhbnQKICAgICAgICAgICAgICAgIG1ldGhvZF9wb3N0Zml4ID0gJ18lcycgJSBzZWN0aW9uX25hbWUKCiAgICAgICAgICAgIHNlY3Rpb25fcGFyc2VyX21ldGhvZCA9IGdldGF0dHIoCiAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICAgICAgIyBEb3RzIGluIHNlY3Rpb24gbmFtZXMgYXJlIHRyYW5sc2F0ZWQgaW50byBkdW5kZXJzY29yZXMuCiAgICAgICAgICAgICAgICAoJ3BhcnNlX3NlY3Rpb24lcycgJSBtZXRob2RfcG9zdGZpeCkucmVwbGFjZSgnLicsICdfXycpLAogICAgICAgICAgICAgICAgTm9uZSkKCiAgICAgICAgICAgIGlmIHNlY3Rpb25fcGFyc2VyX21ldGhvZCBpcyBOb25lOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ1Vuc3VwcG9ydGVkIGRpc3RyaWJ1dGlvbiBvcHRpb24gc2VjdGlvbjogWyVzLiVzXScgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VjdGlvbl9wcmVmaXgsIHNlY3Rpb25fbmFtZSkpCgogICAgICAgICAgICBzZWN0aW9uX3BhcnNlcl9tZXRob2Qoc2VjdGlvbl9vcHRpb25zKQoKCmNsYXNzIENvbmZpZ01ldGFkYXRhSGFuZGxlcihDb25maWdIYW5kbGVyKToKCiAgICBzZWN0aW9uX3ByZWZpeCA9ICdtZXRhZGF0YScKCiAgICBhbGlhc2VzID0gewogICAgICAgICdob21lX3BhZ2UnOiAndXJsJywKICAgICAgICAnc3VtbWFyeSc6ICdkZXNjcmlwdGlvbicsCiAgICAgICAgJ2NsYXNzaWZpZXInOiAnY2xhc3NpZmllcnMnLAogICAgICAgICdwbGF0Zm9ybSc6ICdwbGF0Zm9ybXMnLAogICAgfQoKICAgIHN0cmljdF9tb2RlID0gRmFsc2UKICAgICIiIldlIG5lZWQgdG8ga2VlcCBpdCBsb29zZSwgdG8gYmUgcGFydGlhbGx5IGNvbXBhdGlibGUgd2l0aAogICAgYHBicmAgYW5kIGBkMnRvMWAgcGFja2FnZXMgd2hpY2ggYWxzbyB1c2VzIGBtZXRhZGF0YWAgc2VjdGlvbi4KCiAgICAiIiIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXJzZXJzKHNlbGYpOgogICAgICAgICIiIk1ldGFkYXRhIGl0ZW0gbmFtZSB0byBwYXJzZXIgZnVuY3Rpb24gbWFwcGluZy4iIiIKICAgICAgICBwYXJzZV9saXN0ID0gc2VsZi5fcGFyc2VfbGlzdAogICAgICAgIHBhcnNlX2ZpbGUgPSBzZWxmLl9wYXJzZV9maWxlCgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICdwbGF0Zm9ybXMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAna2V5d29yZHMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAncHJvdmlkZXMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAncmVxdWlyZXMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnb2Jzb2xldGVzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ2NsYXNzaWZpZXJzJzogc2VsZi5fZ2V0X3BhcnNlcl9jb21wb3VuZChwYXJzZV9maWxlLCBwYXJzZV9saXN0KSwKICAgICAgICAgICAgJ2xpY2Vuc2UnOiBwYXJzZV9maWxlLAogICAgICAgICAgICAnZGVzY3JpcHRpb24nOiBwYXJzZV9maWxlLAogICAgICAgICAgICAnbG9uZ19kZXNjcmlwdGlvbic6IHBhcnNlX2ZpbGUsCiAgICAgICAgICAgICd2ZXJzaW9uJzogc2VsZi5fcGFyc2VfdmVyc2lvbiwKICAgICAgICB9CgogICAgZGVmIF9wYXJzZV92ZXJzaW9uKHNlbGYsIHZhbHVlKToKICAgICAgICAiIiJQYXJzZXMgYHZlcnNpb25gIG9wdGlvbiB2YWx1ZS4KCiAgICAgICAgOnBhcmFtIHZhbHVlOgogICAgICAgIDpydHlwZTogc3RyCgogICAgICAgICIiIgogICAgICAgIHZlcnNpb24gPSBzZWxmLl9wYXJzZV9hdHRyKHZhbHVlKQoKICAgICAgICBpZiBjYWxsYWJsZSh2ZXJzaW9uKToKICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24oKQoKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2ZXJzaW9uLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBpZiBoYXNhdHRyKHZlcnNpb24sICdfX2l0ZXJfXycpOgogICAgICAgICAgICAgICAgdmVyc2lvbiA9ICcuJy5qb2luKG1hcChzdHIsIHZlcnNpb24pKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmVyc2lvbiA9ICclcycgJSB2ZXJzaW9uCgogICAgICAgIHJldHVybiB2ZXJzaW9uCgoKY2xhc3MgQ29uZmlnT3B0aW9uc0hhbmRsZXIoQ29uZmlnSGFuZGxlcik6CgogICAgc2VjdGlvbl9wcmVmaXggPSAnb3B0aW9ucycKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXJzZXJzKHNlbGYpOgogICAgICAgICIiIk1ldGFkYXRhIGl0ZW0gbmFtZSB0byBwYXJzZXIgZnVuY3Rpb24gbWFwcGluZy4iIiIKICAgICAgICBwYXJzZV9saXN0ID0gc2VsZi5fcGFyc2VfbGlzdAogICAgICAgIHBhcnNlX2xpc3Rfc2VtaWNvbG9uID0gcGFydGlhbChzZWxmLl9wYXJzZV9saXN0LCBzZXBhcmF0b3I9JzsnKQogICAgICAgIHBhcnNlX2Jvb2wgPSBzZWxmLl9wYXJzZV9ib29sCiAgICAgICAgcGFyc2VfZGljdCA9IHNlbGYuX3BhcnNlX2RpY3QKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgJ3ppcF9zYWZlJzogcGFyc2VfYm9vbCwKICAgICAgICAgICAgJ3VzZV8ydG8zJzogcGFyc2VfYm9vbCwKICAgICAgICAgICAgJ2luY2x1ZGVfcGFja2FnZV9kYXRhJzogcGFyc2VfYm9vbCwKICAgICAgICAgICAgJ3BhY2thZ2VfZGlyJzogcGFyc2VfZGljdCwKICAgICAgICAgICAgJ3VzZV8ydG8zX2ZpeGVycyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICd1c2VfMnRvM19leGNsdWRlX2ZpeGVycyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdjb252ZXJ0XzJ0bzNfZG9jdGVzdHMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnc2NyaXB0cyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdlYWdlcl9yZXNvdXJjZXMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnZGVwZW5kZW5jeV9saW5rcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICduYW1lc3BhY2VfcGFja2FnZXMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnaW5zdGFsbF9yZXF1aXJlcyc6IHBhcnNlX2xpc3Rfc2VtaWNvbG9uLAogICAgICAgICAgICAnc2V0dXBfcmVxdWlyZXMnOiBwYXJzZV9saXN0X3NlbWljb2xvbiwKICAgICAgICAgICAgJ3Rlc3RzX3JlcXVpcmUnOiBwYXJzZV9saXN0X3NlbWljb2xvbiwKICAgICAgICAgICAgJ3BhY2thZ2VzJzogc2VsZi5fcGFyc2VfcGFja2FnZXMsCiAgICAgICAgICAgICdlbnRyeV9wb2ludHMnOiBzZWxmLl9wYXJzZV9maWxlLAogICAgICAgICAgICAncHlfbW9kdWxlcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgfQoKICAgIGRlZiBfcGFyc2VfcGFja2FnZXMoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIlBhcnNlcyBgcGFja2FnZXNgIG9wdGlvbiB2YWx1ZS4KCiAgICAgICAgOnBhcmFtIHZhbHVlOgogICAgICAgIDpydHlwZTogbGlzdAogICAgICAgICIiIgogICAgICAgIGZpbmRfZGlyZWN0aXZlID0gJ2ZpbmQ6JwoKICAgICAgICBpZiBub3QgdmFsdWUuc3RhcnRzd2l0aChmaW5kX2RpcmVjdGl2ZSk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wYXJzZV9saXN0KHZhbHVlKQoKICAgICAgICAjIFJlYWQgZnVuY3Rpb24gYXJndW1lbnRzIGZyb20gYSBkZWRpY2F0ZWQgc2VjdGlvbi4KICAgICAgICBmaW5kX2t3YXJncyA9IHNlbGYucGFyc2Vfc2VjdGlvbl9wYWNrYWdlc19fZmluZCgKICAgICAgICAgICAgc2VsZi5zZWN0aW9ucy5nZXQoJ3BhY2thZ2VzLmZpbmQnLCB7fSkpCgogICAgICAgIGZyb20gc2V0dXB0b29scyBpbXBvcnQgZmluZF9wYWNrYWdlcwoKICAgICAgICByZXR1cm4gZmluZF9wYWNrYWdlcygqKmZpbmRfa3dhcmdzKQoKICAgIGRlZiBwYXJzZV9zZWN0aW9uX3BhY2thZ2VzX19maW5kKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgIiIiUGFyc2VzIGBwYWNrYWdlcy5maW5kYCBjb25maWd1cmF0aW9uIGZpbGUgc2VjdGlvbi4KCiAgICAgICAgVG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIF9wYXJzZV9wYWNrYWdlcygpLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgIiIiCiAgICAgICAgc2VjdGlvbl9kYXRhID0gc2VsZi5fcGFyc2Vfc2VjdGlvbl90b19kaWN0KAogICAgICAgICAgICBzZWN0aW9uX29wdGlvbnMsIHNlbGYuX3BhcnNlX2xpc3QpCgogICAgICAgIHZhbGlkX2tleXMgPSBbJ3doZXJlJywgJ2luY2x1ZGUnLCAnZXhjbHVkZSddCgogICAgICAgIGZpbmRfa3dhcmdzID0gZGljdCgKICAgICAgICAgICAgWyhrLCB2KSBmb3IgaywgdiBpbiBzZWN0aW9uX2RhdGEuaXRlbXMoKSBpZiBrIGluIHZhbGlkX2tleXMgYW5kIHZdKQoKICAgICAgICB3aGVyZSA9IGZpbmRfa3dhcmdzLmdldCgnd2hlcmUnKQogICAgICAgIGlmIHdoZXJlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmaW5kX2t3YXJnc1snd2hlcmUnXSA9IHdoZXJlWzBdICAjIGNhc3QgbGlzdCB0byBzaW5nbGUgdmFsCgogICAgICAgIHJldHVybiBmaW5kX2t3YXJncwoKICAgIGRlZiBwYXJzZV9zZWN0aW9uX2VudHJ5X3BvaW50cyhzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgICIiIlBhcnNlcyBgZW50cnlfcG9pbnRzYCBjb25maWd1cmF0aW9uIGZpbGUgc2VjdGlvbi4KCiAgICAgICAgOnBhcmFtIGRpY3Qgc2VjdGlvbl9vcHRpb25zOgogICAgICAgICIiIgogICAgICAgIHBhcnNlZCA9IHNlbGYuX3BhcnNlX3NlY3Rpb25fdG9fZGljdChzZWN0aW9uX29wdGlvbnMsIHNlbGYuX3BhcnNlX2xpc3QpCiAgICAgICAgc2VsZlsnZW50cnlfcG9pbnRzJ10gPSBwYXJzZWQKCiAgICBkZWYgX3BhcnNlX3BhY2thZ2VfZGF0YShzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgIHBhcnNlZCA9IHNlbGYuX3BhcnNlX3NlY3Rpb25fdG9fZGljdChzZWN0aW9uX29wdGlvbnMsIHNlbGYuX3BhcnNlX2xpc3QpCgogICAgICAgIHJvb3QgPSBwYXJzZWQuZ2V0KCcqJykKICAgICAgICBpZiByb290OgogICAgICAgICAgICBwYXJzZWRbJyddID0gcm9vdAogICAgICAgICAgICBkZWwgcGFyc2VkWycqJ10KCiAgICAgICAgcmV0dXJuIHBhcnNlZAoKICAgIGRlZiBwYXJzZV9zZWN0aW9uX3BhY2thZ2VfZGF0YShzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgICIiIlBhcnNlcyBgcGFja2FnZV9kYXRhYCBjb25maWd1cmF0aW9uIGZpbGUgc2VjdGlvbi4KCiAgICAgICAgOnBhcmFtIGRpY3Qgc2VjdGlvbl9vcHRpb25zOgogICAgICAgICIiIgogICAgICAgIHNlbGZbJ3BhY2thZ2VfZGF0YSddID0gc2VsZi5fcGFyc2VfcGFja2FnZV9kYXRhKHNlY3Rpb25fb3B0aW9ucykKCiAgICBkZWYgcGFyc2Vfc2VjdGlvbl9leGNsdWRlX3BhY2thZ2VfZGF0YShzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgICIiIlBhcnNlcyBgZXhjbHVkZV9wYWNrYWdlX2RhdGFgIGNvbmZpZ3VyYXRpb24gZmlsZSBzZWN0aW9uLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgIiIiCiAgICAgICAgc2VsZlsnZXhjbHVkZV9wYWNrYWdlX2RhdGEnXSA9IHNlbGYuX3BhcnNlX3BhY2thZ2VfZGF0YSgKICAgICAgICAgICAgc2VjdGlvbl9vcHRpb25zKQoKICAgIGRlZiBwYXJzZV9zZWN0aW9uX2V4dHJhc19yZXF1aXJlKHNlbGYsIHNlY3Rpb25fb3B0aW9ucyk6CiAgICAgICAgIiIiUGFyc2VzIGBleHRyYXNfcmVxdWlyZWAgY29uZmlndXJhdGlvbiBmaWxlIHNlY3Rpb24uCgogICAgICAgIDpwYXJhbSBkaWN0IHNlY3Rpb25fb3B0aW9uczoKICAgICAgICAiIiIKICAgICAgICBwYXJzZV9saXN0ID0gcGFydGlhbChzZWxmLl9wYXJzZV9saXN0LCBzZXBhcmF0b3I9JzsnKQogICAgICAgIHNlbGZbJ2V4dHJhc19yZXF1aXJlJ10gPSBzZWxmLl9wYXJzZV9zZWN0aW9uX3RvX2RpY3QoCiAgICAgICAgICAgIHNlY3Rpb25fb3B0aW9ucywgcGFyc2VfbGlzdCkKUEsDBBQAAAAAAAAAIQAaIgQypwMAAKcDAAAuAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9kZXBfdXRpbC5weWZyb20gZGlzdHV0aWxzLmRlcF91dGlsIGltcG9ydCBuZXdlcl9ncm91cAoKIyB5ZXMsIHRoaXMgaXMgd2FzIGFsbW9zdCBlbnRpcmVseSBjb3B5LXBhc3RlZCBmcm9tCiMgJ25ld2VyX3BhaXJ3aXNlKCknLCB0aGlzIGlzIGp1c3QgYW5vdGhlciBjb252ZW5pZW5jZQojIGZ1bmN0aW9uLgpkZWYgbmV3ZXJfcGFpcndpc2VfZ3JvdXAoc291cmNlc19ncm91cHMsIHRhcmdldHMpOgogICAgIiIiV2FsayBib3RoIGFyZ3VtZW50cyBpbiBwYXJhbGxlbCwgdGVzdGluZyBpZiBlYWNoIHNvdXJjZSBncm91cCBpcyBuZXdlcgogICAgdGhhbiBpdHMgY29ycmVzcG9uZGluZyB0YXJnZXQuIFJldHVybnMgYSBwYWlyIG9mIGxpc3RzIChzb3VyY2VzX2dyb3VwcywKICAgIHRhcmdldHMpIHdoZXJlIHNvdXJjZXMgaXMgbmV3ZXIgdGhhbiB0YXJnZXQsIGFjY29yZGluZyB0byB0aGUgc2VtYW50aWNzCiAgICBvZiAnbmV3ZXJfZ3JvdXAoKScuCiAgICAiIiIKICAgIGlmIGxlbihzb3VyY2VzX2dyb3VwcykgIT0gbGVuKHRhcmdldHMpOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIidzb3VyY2VzX2dyb3VwJyBhbmQgJ3RhcmdldHMnIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoIikKCiAgICAjIGJ1aWxkIGEgcGFpciBvZiBsaXN0cyAoc291cmNlc19ncm91cHMsIHRhcmdldHMpIHdoZXJlIHNvdXJjZSBpcyBuZXdlcgogICAgbl9zb3VyY2VzID0gW10KICAgIG5fdGFyZ2V0cyA9IFtdCiAgICBmb3IgaSBpbiByYW5nZShsZW4oc291cmNlc19ncm91cHMpKToKICAgICAgICBpZiBuZXdlcl9ncm91cChzb3VyY2VzX2dyb3Vwc1tpXSwgdGFyZ2V0c1tpXSk6CiAgICAgICAgICAgIG5fc291cmNlcy5hcHBlbmQoc291cmNlc19ncm91cHNbaV0pCiAgICAgICAgICAgIG5fdGFyZ2V0cy5hcHBlbmQodGFyZ2V0c1tpXSkKCiAgICByZXR1cm4gbl9zb3VyY2VzLCBuX3RhcmdldHMKUEsDBBQAAAAAAAAAIQBbKS1qzRYAAM0WAAAtAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9kZXBlbmRzLnB5aW1wb3J0IHN5cwppbXBvcnQgaW1wCmltcG9ydCBtYXJzaGFsCmZyb20gZGlzdHV0aWxzLnZlcnNpb24gaW1wb3J0IFN0cmljdFZlcnNpb24KZnJvbSBpbXAgaW1wb3J0IFBLR19ESVJFQ1RPUlksIFBZX0NPTVBJTEVELCBQWV9TT1VSQ0UsIFBZX0ZST1pFTgoKZnJvbSAucHkzM2NvbXBhdCBpbXBvcnQgQnl0ZWNvZGUKCgpfX2FsbF9fID0gWwogICAgJ1JlcXVpcmUnLCAnZmluZF9tb2R1bGUnLCAnZ2V0X21vZHVsZV9jb25zdGFudCcsICdleHRyYWN0X2NvbnN0YW50JwpdCgoKY2xhc3MgUmVxdWlyZToKICAgICIiIkEgcHJlcmVxdWlzaXRlIHRvIGJ1aWxkaW5nIG9yIGluc3RhbGxpbmcgYSBkaXN0cmlidXRpb24iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcmVxdWVzdGVkX3ZlcnNpb24sIG1vZHVsZSwgaG9tZXBhZ2U9JycsCiAgICAgICAgICAgIGF0dHJpYnV0ZT1Ob25lLCBmb3JtYXQ9Tm9uZSk6CgogICAgICAgIGlmIGZvcm1hdCBpcyBOb25lIGFuZCByZXF1ZXN0ZWRfdmVyc2lvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgZm9ybWF0ID0gU3RyaWN0VmVyc2lvbgoKICAgICAgICBpZiBmb3JtYXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJlcXVlc3RlZF92ZXJzaW9uID0gZm9ybWF0KHJlcXVlc3RlZF92ZXJzaW9uKQogICAgICAgICAgICBpZiBhdHRyaWJ1dGUgaXMgTm9uZToKICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICdfX3ZlcnNpb25fXycKCiAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUobG9jYWxzKCkpCiAgICAgICAgZGVsIHNlbGYuc2VsZgoKICAgIGRlZiBmdWxsX25hbWUoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGZ1bGwgcGFja2FnZS9kaXN0cmlidXRpb24gbmFtZSwgdy92ZXJzaW9uIiIiCiAgICAgICAgaWYgc2VsZi5yZXF1ZXN0ZWRfdmVyc2lvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuICclcy0lcycgJSAoc2VsZi5uYW1lLCBzZWxmLnJlcXVlc3RlZF92ZXJzaW9uKQogICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICBkZWYgdmVyc2lvbl9vayhzZWxmLCB2ZXJzaW9uKToKICAgICAgICAiIiJJcyAndmVyc2lvbicgc3VmZmljaWVudGx5IHVwLXRvLWRhdGU/IiIiCiAgICAgICAgcmV0dXJuIHNlbGYuYXR0cmlidXRlIGlzIE5vbmUgb3Igc2VsZi5mb3JtYXQgaXMgTm9uZSBvciBcCiAgICAgICAgICAgIHN0cih2ZXJzaW9uKSAhPSAidW5rbm93biIgYW5kIHZlcnNpb24gPj0gc2VsZi5yZXF1ZXN0ZWRfdmVyc2lvbgoKICAgIGRlZiBnZXRfdmVyc2lvbihzZWxmLCBwYXRocz1Ob25lLCBkZWZhdWx0PSJ1bmtub3duIik6CiAgICAgICAgIiIiR2V0IHZlcnNpb24gbnVtYmVyIG9mIGluc3RhbGxlZCBtb2R1bGUsICdOb25lJywgb3IgJ2RlZmF1bHQnCgogICAgICAgIFNlYXJjaCAncGF0aHMnIGZvciBtb2R1bGUuICBJZiBub3QgZm91bmQsIHJldHVybiAnTm9uZScuICBJZiBmb3VuZCwKICAgICAgICByZXR1cm4gdGhlIGV4dHJhY3RlZCB2ZXJzaW9uIGF0dHJpYnV0ZSwgb3IgJ2RlZmF1bHQnIGlmIG5vIHZlcnNpb24KICAgICAgICBhdHRyaWJ1dGUgd2FzIHNwZWNpZmllZCwgb3IgdGhlIHZhbHVlIGNhbm5vdCBiZSBkZXRlcm1pbmVkIHdpdGhvdXQKICAgICAgICBpbXBvcnRpbmcgdGhlIG1vZHVsZS4gIFRoZSB2ZXJzaW9uIGlzIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlCiAgICAgICAgcmVxdWlyZW1lbnQncyB2ZXJzaW9uIGZvcm1hdCAoaWYgYW55KSwgdW5sZXNzIGl0IGlzICdOb25lJyBvciB0aGUKICAgICAgICBzdXBwbGllZCAnZGVmYXVsdCcuCiAgICAgICAgIiIiCgogICAgICAgIGlmIHNlbGYuYXR0cmlidXRlIGlzIE5vbmU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGYsIHAsIGkgPSBmaW5kX21vZHVsZShzZWxmLm1vZHVsZSwgcGF0aHMpCiAgICAgICAgICAgICAgICBpZiBmOgogICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgdiA9IGdldF9tb2R1bGVfY29uc3RhbnQoc2VsZi5tb2R1bGUsIHNlbGYuYXR0cmlidXRlLCBkZWZhdWx0LCBwYXRocykKCiAgICAgICAgaWYgdiBpcyBub3QgTm9uZSBhbmQgdiBpcyBub3QgZGVmYXVsdCBhbmQgc2VsZi5mb3JtYXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmZvcm1hdCh2KQoKICAgICAgICByZXR1cm4gdgoKICAgIGRlZiBpc19wcmVzZW50KHNlbGYsIHBhdGhzPU5vbmUpOgogICAgICAgICIiIlJldHVybiB0cnVlIGlmIGRlcGVuZGVuY3kgaXMgcHJlc2VudCBvbiAncGF0aHMnIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X3ZlcnNpb24ocGF0aHMpIGlzIG5vdCBOb25lCgogICAgZGVmIGlzX2N1cnJlbnQoc2VsZiwgcGF0aHM9Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgZGVwZW5kZW5jeSBpcyBwcmVzZW50IGFuZCB1cC10by1kYXRlIG9uICdwYXRocyciIiIKICAgICAgICB2ZXJzaW9uID0gc2VsZi5nZXRfdmVyc2lvbihwYXRocykKICAgICAgICBpZiB2ZXJzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBzZWxmLnZlcnNpb25fb2sodmVyc2lvbikKCgpkZWYgZmluZF9tb2R1bGUobW9kdWxlLCBwYXRocz1Ob25lKToKICAgICIiIkp1c3QgbGlrZSAnaW1wLmZpbmRfbW9kdWxlKCknLCBidXQgd2l0aCBwYWNrYWdlIHN1cHBvcnQiIiIKCiAgICBwYXJ0cyA9IG1vZHVsZS5zcGxpdCgnLicpCgogICAgd2hpbGUgcGFydHM6CiAgICAgICAgcGFydCA9IHBhcnRzLnBvcCgwKQogICAgICAgIGYsIHBhdGgsIChzdWZmaXgsIG1vZGUsIGtpbmQpID0gaW5mbyA9IGltcC5maW5kX21vZHVsZShwYXJ0LCBwYXRocykKCiAgICAgICAgaWYga2luZCA9PSBQS0dfRElSRUNUT1JZOgogICAgICAgICAgICBwYXJ0cyA9IHBhcnRzIG9yIFsnX19pbml0X18nXQogICAgICAgICAgICBwYXRocyA9IFtwYXRoXQoKICAgICAgICBlbGlmIHBhcnRzOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiQ2FuJ3QgZmluZCAlciBpbiAlcyIgJSAocGFydHMsIG1vZHVsZSkpCgogICAgcmV0dXJuIGluZm8KCgpkZWYgZ2V0X21vZHVsZV9jb25zdGFudChtb2R1bGUsIHN5bWJvbCwgZGVmYXVsdD0tMSwgcGF0aHM9Tm9uZSk6CiAgICAiIiJGaW5kICdtb2R1bGUnIGJ5IHNlYXJjaGluZyAncGF0aHMnLCBhbmQgZXh0cmFjdCAnc3ltYm9sJwoKICAgIFJldHVybiAnTm9uZScgaWYgJ21vZHVsZScgZG9lcyBub3QgZXhpc3Qgb24gJ3BhdGhzJywgb3IgaXQgZG9lcyBub3QgZGVmaW5lCiAgICAnc3ltYm9sJy4gIElmIHRoZSBtb2R1bGUgZGVmaW5lcyAnc3ltYm9sJyBhcyBhIGNvbnN0YW50LCByZXR1cm4gdGhlCiAgICBjb25zdGFudC4gIE90aGVyd2lzZSwgcmV0dXJuICdkZWZhdWx0Jy4iIiIKCiAgICB0cnk6CiAgICAgICAgZiwgcGF0aCwgKHN1ZmZpeCwgbW9kZSwga2luZCkgPSBmaW5kX21vZHVsZShtb2R1bGUsIHBhdGhzKQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICMgTW9kdWxlIGRvZXNuJ3QgZXhpc3QKICAgICAgICByZXR1cm4gTm9uZQoKICAgIHRyeToKICAgICAgICBpZiBraW5kID09IFBZX0NPTVBJTEVEOgogICAgICAgICAgICBmLnJlYWQoOCkgICMgc2tpcCBtYWdpYyAmIGRhdGUKICAgICAgICAgICAgY29kZSA9IG1hcnNoYWwubG9hZChmKQogICAgICAgIGVsaWYga2luZCA9PSBQWV9GUk9aRU46CiAgICAgICAgICAgIGNvZGUgPSBpbXAuZ2V0X2Zyb3plbl9vYmplY3QobW9kdWxlKQogICAgICAgIGVsaWYga2luZCA9PSBQWV9TT1VSQ0U6CiAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGYucmVhZCgpLCBwYXRoLCAnZXhlYycpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBOb3Qgc29tZXRoaW5nIHdlIGNhbiBwYXJzZTsgd2UnbGwgaGF2ZSB0byBpbXBvcnQgaXQuICA6KAogICAgICAgICAgICBpZiBtb2R1bGUgbm90IGluIHN5cy5tb2R1bGVzOgogICAgICAgICAgICAgICAgaW1wLmxvYWRfbW9kdWxlKG1vZHVsZSwgZiwgcGF0aCwgKHN1ZmZpeCwgbW9kZSwga2luZCkpCiAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHN5cy5tb2R1bGVzW21vZHVsZV0sIHN5bWJvbCwgTm9uZSkKCiAgICBmaW5hbGx5OgogICAgICAgIGlmIGY6CiAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgIHJldHVybiBleHRyYWN0X2NvbnN0YW50KGNvZGUsIHN5bWJvbCwgZGVmYXVsdCkKCgpkZWYgZXh0cmFjdF9jb25zdGFudChjb2RlLCBzeW1ib2wsIGRlZmF1bHQ9LTEpOgogICAgIiIiRXh0cmFjdCB0aGUgY29uc3RhbnQgdmFsdWUgb2YgJ3N5bWJvbCcgZnJvbSAnY29kZScKCiAgICBJZiB0aGUgbmFtZSAnc3ltYm9sJyBpcyBib3VuZCB0byBhIGNvbnN0YW50IHZhbHVlIGJ5IHRoZSBQeXRob24gY29kZQogICAgb2JqZWN0ICdjb2RlJywgcmV0dXJuIHRoYXQgdmFsdWUuICBJZiAnc3ltYm9sJyBpcyBib3VuZCB0byBhbiBleHByZXNzaW9uLAogICAgcmV0dXJuICdkZWZhdWx0Jy4gIE90aGVyd2lzZSwgcmV0dXJuICdOb25lJy4KCiAgICBSZXR1cm4gdmFsdWUgaXMgYmFzZWQgb24gdGhlIGZpcnN0IGFzc2lnbm1lbnQgdG8gJ3N5bWJvbCcuICAnc3ltYm9sJyBtdXN0CiAgICBiZSBhIGdsb2JhbCwgb3IgYXQgbGVhc3QgYSBub24tImZhc3QiIGxvY2FsIGluIHRoZSBjb2RlIGJsb2NrLiAgVGhhdCBpcywKICAgIG9ubHkgJ1NUT1JFX05BTUUnIGFuZCAnU1RPUkVfR0xPQkFMJyBvcGNvZGVzIGFyZSBjaGVja2VkLCBhbmQgJ3N5bWJvbCcKICAgIG11c3QgYmUgcHJlc2VudCBpbiAnY29kZS5jb19uYW1lcycuCiAgICAiIiIKICAgIGlmIHN5bWJvbCBub3QgaW4gY29kZS5jb19uYW1lczoKICAgICAgICAjIG5hbWUncyBub3QgdGhlcmUsIGNhbid0IHBvc3NpYmx5IGJlIGFuIGFzc2lnbm1lbnQKICAgICAgICByZXR1cm4gTm9uZQoKICAgIG5hbWVfaWR4ID0gbGlzdChjb2RlLmNvX25hbWVzKS5pbmRleChzeW1ib2wpCgogICAgU1RPUkVfTkFNRSA9IDkwCiAgICBTVE9SRV9HTE9CQUwgPSA5NwogICAgTE9BRF9DT05TVCA9IDEwMAoKICAgIGNvbnN0ID0gZGVmYXVsdAoKICAgIGZvciBieXRlX2NvZGUgaW4gQnl0ZWNvZGUoY29kZSk6CiAgICAgICAgb3AgPSBieXRlX2NvZGUub3Bjb2RlCiAgICAgICAgYXJnID0gYnl0ZV9jb2RlLmFyZwoKICAgICAgICBpZiBvcCA9PSBMT0FEX0NPTlNUOgogICAgICAgICAgICBjb25zdCA9IGNvZGUuY29fY29uc3RzW2FyZ10KICAgICAgICBlbGlmIGFyZyA9PSBuYW1lX2lkeCBhbmQgKG9wID09IFNUT1JFX05BTUUgb3Igb3AgPT0gU1RPUkVfR0xPQkFMKToKICAgICAgICAgICAgcmV0dXJuIGNvbnN0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29uc3QgPSBkZWZhdWx0CgoKZGVmIF91cGRhdGVfZ2xvYmFscygpOgogICAgIiIiCiAgICBQYXRjaCB0aGUgZ2xvYmFscyB0byByZW1vdmUgdGhlIG9iamVjdHMgbm90IGF2YWlsYWJsZSBvbiBzb21lIHBsYXRmb3Jtcy4KCiAgICBYWFggaXQnZCBiZSBiZXR0ZXIgdG8gdGVzdCBhc3NlcnRpb25zIGFib3V0IGJ5dGVjb2RlIGluc3RlYWQuCiAgICAiIiIKCiAgICBpZiBub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKSBhbmQgc3lzLnBsYXRmb3JtICE9ICdjbGknOgogICAgICAgIHJldHVybgogICAgaW5jb21wYXRpYmxlID0gJ2V4dHJhY3RfY29uc3RhbnQnLCAnZ2V0X21vZHVsZV9jb25zdGFudCcKICAgIGZvciBuYW1lIGluIGluY29tcGF0aWJsZToKICAgICAgICBkZWwgZ2xvYmFscygpW25hbWVdCiAgICAgICAgX19hbGxfXy5yZW1vdmUobmFtZSkKCgpfdXBkYXRlX2dsb2JhbHMoKQpQSwMEFAAAAAAAAAAhACV0hwWQnQAAkJ0AACoAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2Rpc3QucHlfX2FsbF9fID0gWydEaXN0cmlidXRpb24nXQoKaW1wb3J0IHJlCmltcG9ydCBvcwppbXBvcnQgd2FybmluZ3MKaW1wb3J0IG51bWJlcnMKaW1wb3J0IGRpc3R1dGlscy5sb2cKaW1wb3J0IGRpc3R1dGlscy5jb3JlCmltcG9ydCBkaXN0dXRpbHMuY21kCmltcG9ydCBkaXN0dXRpbHMuZGlzdAppbXBvcnQgaXRlcnRvb2xzCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKAogICAgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsIERpc3R1dGlsc1NldHVwRXJyb3IsCikKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgcmZjODIyX2VzY2FwZQoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAsIGZpbHRlciwgZmlsdGVyZmFsc2UKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybiBpbXBvcnQgcGFja2FnaW5nCgpmcm9tIHNldHVwdG9vbHMuZGVwZW5kcyBpbXBvcnQgUmVxdWlyZQpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHdpbmRvd3Nfc3VwcG9ydApmcm9tIHNldHVwdG9vbHMubW9ua2V5IGltcG9ydCBnZXRfdW5wYXRjaGVkCmZyb20gc2V0dXB0b29scy5jb25maWcgaW1wb3J0IHBhcnNlX2NvbmZpZ3VyYXRpb24KaW1wb3J0IHBrZ19yZXNvdXJjZXMKZnJvbSAucHkzNmNvbXBhdCBpbXBvcnQgRGlzdHJpYnV0aW9uX3BhcnNlX2NvbmZpZ19maWxlcwoKX19pbXBvcnRfXygncGtnX3Jlc291cmNlcy5leHRlcm4ucGFja2FnaW5nLnNwZWNpZmllcnMnKQpfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzLmV4dGVybi5wYWNrYWdpbmcudmVyc2lvbicpCgoKZGVmIF9nZXRfdW5wYXRjaGVkKGNscyk6CiAgICB3YXJuaW5ncy53YXJuKCJEbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIiwgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgcmV0dXJuIGdldF91bnBhdGNoZWQoY2xzKQoKCiMgQmFzZWQgb24gUHl0aG9uIDMuNSB2ZXJzaW9uCmRlZiB3cml0ZV9wa2dfZmlsZShzZWxmLCBmaWxlKToKICAgICIiIldyaXRlIHRoZSBQS0ctSU5GTyBmb3JtYXQgZGF0YSB0byBhIGZpbGUgb2JqZWN0LgogICAgIiIiCiAgICB2ZXJzaW9uID0gJzEuMCcKICAgIGlmIChzZWxmLnByb3ZpZGVzIG9yIHNlbGYucmVxdWlyZXMgb3Igc2VsZi5vYnNvbGV0ZXMgb3IKICAgICAgICAgICAgc2VsZi5jbGFzc2lmaWVycyBvciBzZWxmLmRvd25sb2FkX3VybCk6CiAgICAgICAgdmVyc2lvbiA9ICcxLjEnCiAgICAjIFNldHVwdG9vbHMgc3BlY2lmaWMgZm9yIFBFUCAzNDUKICAgIGlmIGhhc2F0dHIoc2VsZiwgJ3B5dGhvbl9yZXF1aXJlcycpOgogICAgICAgIHZlcnNpb24gPSAnMS4yJwoKICAgIGZpbGUud3JpdGUoJ01ldGFkYXRhLVZlcnNpb246ICVzXG4nICUgdmVyc2lvbikKICAgIGZpbGUud3JpdGUoJ05hbWU6ICVzXG4nICUgc2VsZi5nZXRfbmFtZSgpKQogICAgZmlsZS53cml0ZSgnVmVyc2lvbjogJXNcbicgJSBzZWxmLmdldF92ZXJzaW9uKCkpCiAgICBmaWxlLndyaXRlKCdTdW1tYXJ5OiAlc1xuJyAlIHNlbGYuZ2V0X2Rlc2NyaXB0aW9uKCkpCiAgICBmaWxlLndyaXRlKCdIb21lLXBhZ2U6ICVzXG4nICUgc2VsZi5nZXRfdXJsKCkpCiAgICBmaWxlLndyaXRlKCdBdXRob3I6ICVzXG4nICUgc2VsZi5nZXRfY29udGFjdCgpKQogICAgZmlsZS53cml0ZSgnQXV0aG9yLWVtYWlsOiAlc1xuJyAlIHNlbGYuZ2V0X2NvbnRhY3RfZW1haWwoKSkKICAgIGZpbGUud3JpdGUoJ0xpY2Vuc2U6ICVzXG4nICUgc2VsZi5nZXRfbGljZW5zZSgpKQogICAgaWYgc2VsZi5kb3dubG9hZF91cmw6CiAgICAgICAgZmlsZS53cml0ZSgnRG93bmxvYWQtVVJMOiAlc1xuJyAlIHNlbGYuZG93bmxvYWRfdXJsKQoKICAgIGxvbmdfZGVzY19jb250ZW50X3R5cGUgPSBnZXRhdHRyKAogICAgICAgIHNlbGYsCiAgICAgICAgJ2xvbmdfZGVzY3JpcHRpb25fY29udGVudF90eXBlJywKICAgICAgICBOb25lCiAgICApIG9yICdVTktOT1dOJwogICAgZmlsZS53cml0ZSgnRGVzY3JpcHRpb24tQ29udGVudC1UeXBlOiAlc1xuJyAlIGxvbmdfZGVzY19jb250ZW50X3R5cGUpCgogICAgbG9uZ19kZXNjID0gcmZjODIyX2VzY2FwZShzZWxmLmdldF9sb25nX2Rlc2NyaXB0aW9uKCkpCiAgICBmaWxlLndyaXRlKCdEZXNjcmlwdGlvbjogJXNcbicgJSBsb25nX2Rlc2MpCgogICAga2V5d29yZHMgPSAnLCcuam9pbihzZWxmLmdldF9rZXl3b3JkcygpKQogICAgaWYga2V5d29yZHM6CiAgICAgICAgZmlsZS53cml0ZSgnS2V5d29yZHM6ICVzXG4nICUga2V5d29yZHMpCgogICAgc2VsZi5fd3JpdGVfbGlzdChmaWxlLCAnUGxhdGZvcm0nLCBzZWxmLmdldF9wbGF0Zm9ybXMoKSkKICAgIHNlbGYuX3dyaXRlX2xpc3QoZmlsZSwgJ0NsYXNzaWZpZXInLCBzZWxmLmdldF9jbGFzc2lmaWVycygpKQoKICAgICMgUEVQIDMxNAogICAgc2VsZi5fd3JpdGVfbGlzdChmaWxlLCAnUmVxdWlyZXMnLCBzZWxmLmdldF9yZXF1aXJlcygpKQogICAgc2VsZi5fd3JpdGVfbGlzdChmaWxlLCAnUHJvdmlkZXMnLCBzZWxmLmdldF9wcm92aWRlcygpKQogICAgc2VsZi5fd3JpdGVfbGlzdChmaWxlLCAnT2Jzb2xldGVzJywgc2VsZi5nZXRfb2Jzb2xldGVzKCkpCgogICAgIyBTZXR1cHRvb2xzIHNwZWNpZmljIGZvciBQRVAgMzQ1CiAgICBpZiBoYXNhdHRyKHNlbGYsICdweXRob25fcmVxdWlyZXMnKToKICAgICAgICBmaWxlLndyaXRlKCdSZXF1aXJlcy1QeXRob246ICVzXG4nICUgc2VsZi5weXRob25fcmVxdWlyZXMpCgoKIyBmcm9tIFB5dGhvbiAzLjQKZGVmIHdyaXRlX3BrZ19pbmZvKHNlbGYsIGJhc2VfZGlyKToKICAgICIiIldyaXRlIHRoZSBQS0ctSU5GTyBmaWxlIGludG8gdGhlIHJlbGVhc2UgdHJlZS4KICAgICIiIgogICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihiYXNlX2RpciwgJ1BLRy1JTkZPJyksICd3JywKICAgICAgICAgICAgICBlbmNvZGluZz0nVVRGLTgnKSBhcyBwa2dfaW5mbzoKICAgICAgICBzZWxmLndyaXRlX3BrZ19maWxlKHBrZ19pbmZvKQoKCnNlcXVlbmNlID0gdHVwbGUsIGxpc3QKCgpkZWYgY2hlY2tfaW1wb3J0YWJsZShkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICB0cnk6CiAgICAgICAgZXAgPSBwa2dfcmVzb3VyY2VzLkVudHJ5UG9pbnQucGFyc2UoJ3g9JyArIHZhbHVlKQogICAgICAgIGFzc2VydCBub3QgZXAuZXh0cmFzCiAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvciwgQXR0cmlidXRlRXJyb3IsIEFzc2VydGlvbkVycm9yKToKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAiJXIgbXVzdCBiZSBpbXBvcnRhYmxlICdtb2R1bGU6YXR0cnMnIHN0cmluZyAoZ290ICVyKSIKICAgICAgICAgICAgJSAoYXR0ciwgdmFsdWUpCiAgICAgICAgKQoKCmRlZiBhc3NlcnRfc3RyaW5nX2xpc3QoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgdmFsdWUgaXMgYSBzdHJpbmcgbGlzdCBvciBOb25lIiIiCiAgICB0cnk6CiAgICAgICAgYXNzZXJ0ICcnLmpvaW4odmFsdWUpICE9IHZhbHVlCiAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvciwgQXR0cmlidXRlRXJyb3IsIEFzc2VydGlvbkVycm9yKToKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAiJXIgbXVzdCBiZSBhIGxpc3Qgb2Ygc3RyaW5ncyAoZ290ICVyKSIgJSAoYXR0ciwgdmFsdWUpCiAgICAgICAgKQoKCmRlZiBjaGVja19uc3AoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgbmFtZXNwYWNlIHBhY2thZ2VzIGFyZSB2YWxpZCIiIgogICAgbnNfcGFja2FnZXMgPSB2YWx1ZQogICAgYXNzZXJ0X3N0cmluZ19saXN0KGRpc3QsIGF0dHIsIG5zX3BhY2thZ2VzKQogICAgZm9yIG5zcCBpbiBuc19wYWNrYWdlczoKICAgICAgICBpZiBub3QgZGlzdC5oYXNfY29udGVudHNfZm9yKG5zcCk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAiRGlzdHJpYnV0aW9uIGNvbnRhaW5zIG5vIG1vZHVsZXMgb3IgcGFja2FnZXMgZm9yICIgKwogICAgICAgICAgICAgICAgIm5hbWVzcGFjZSBwYWNrYWdlICVyIiAlIG5zcAogICAgICAgICAgICApCiAgICAgICAgcGFyZW50LCBzZXAsIGNoaWxkID0gbnNwLnJwYXJ0aXRpb24oJy4nKQogICAgICAgIGlmIHBhcmVudCBhbmQgcGFyZW50IG5vdCBpbiBuc19wYWNrYWdlczoKICAgICAgICAgICAgZGlzdHV0aWxzLmxvZy53YXJuKAogICAgICAgICAgICAgICAgIldBUk5JTkc6ICVyIGlzIGRlY2xhcmVkIGFzIGEgcGFja2FnZSBuYW1lc3BhY2UsIGJ1dCAlciIKICAgICAgICAgICAgICAgICIgaXMgbm90OiBwbGVhc2UgY29ycmVjdCB0aGlzIGluIHNldHVwLnB5IiwgbnNwLCBwYXJlbnQKICAgICAgICAgICAgKQoKCmRlZiBjaGVja19leHRyYXMoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgZXh0cmFzX3JlcXVpcmUgbWFwcGluZyBpcyB2YWxpZCIiIgogICAgdHJ5OgogICAgICAgIGxpc3QoaXRlcnRvb2xzLnN0YXJtYXAoX2NoZWNrX2V4dHJhLCB2YWx1ZS5pdGVtcygpKSkKICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgIidleHRyYXNfcmVxdWlyZScgbXVzdCBiZSBhIGRpY3Rpb25hcnkgd2hvc2UgdmFsdWVzIGFyZSAiCiAgICAgICAgICAgICJzdHJpbmdzIG9yIGxpc3RzIG9mIHN0cmluZ3MgY29udGFpbmluZyB2YWxpZCBwcm9qZWN0L3ZlcnNpb24gIgogICAgICAgICAgICAicmVxdWlyZW1lbnQgc3BlY2lmaWVycy4iCiAgICAgICAgKQoKCmRlZiBfY2hlY2tfZXh0cmEoZXh0cmEsIHJlcXMpOgogICAgbmFtZSwgc2VwLCBtYXJrZXIgPSBleHRyYS5wYXJ0aXRpb24oJzonKQogICAgaWYgbWFya2VyIGFuZCBwa2dfcmVzb3VyY2VzLmludmFsaWRfbWFya2VyKG1hcmtlcik6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigiSW52YWxpZCBlbnZpcm9ubWVudCBtYXJrZXI6ICIgKyBtYXJrZXIpCiAgICBsaXN0KHBrZ19yZXNvdXJjZXMucGFyc2VfcmVxdWlyZW1lbnRzKHJlcXMpKQoKCmRlZiBhc3NlcnRfYm9vbChkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCB2YWx1ZSBpcyBUcnVlLCBGYWxzZSwgMCwgb3IgMSIiIgogICAgaWYgYm9vbCh2YWx1ZSkgIT0gdmFsdWU6CiAgICAgICAgdG1wbCA9ICJ7YXR0ciFyfSBtdXN0IGJlIGEgYm9vbGVhbiB2YWx1ZSAoZ290IHt2YWx1ZSFyfSkiCiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcih0bXBsLmZvcm1hdChhdHRyPWF0dHIsIHZhbHVlPXZhbHVlKSkKCgpkZWYgY2hlY2tfcmVxdWlyZW1lbnRzKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IGluc3RhbGxfcmVxdWlyZXMgaXMgYSB2YWxpZCByZXF1aXJlbWVudHMgbGlzdCIiIgogICAgdHJ5OgogICAgICAgIGxpc3QocGtnX3Jlc291cmNlcy5wYXJzZV9yZXF1aXJlbWVudHModmFsdWUpKQogICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIChkaWN0LCBzZXQpKToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJVbm9yZGVyZWQgdHlwZXMgYXJlIG5vdCBhbGxvd2VkIikKICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yKSBhcyBlcnJvcjoKICAgICAgICB0bXBsID0gKAogICAgICAgICAgICAie2F0dHIhcn0gbXVzdCBiZSBhIHN0cmluZyBvciBsaXN0IG9mIHN0cmluZ3MgIgogICAgICAgICAgICAiY29udGFpbmluZyB2YWxpZCBwcm9qZWN0L3ZlcnNpb24gcmVxdWlyZW1lbnQgc3BlY2lmaWVyczsge2Vycm9yfSIKICAgICAgICApCiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcih0bXBsLmZvcm1hdChhdHRyPWF0dHIsIGVycm9yPWVycm9yKSkKCgpkZWYgY2hlY2tfc3BlY2lmaWVyKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IHZhbHVlIGlzIGEgdmFsaWQgdmVyc2lvbiBzcGVjaWZpZXIiIiIKICAgIHRyeToKICAgICAgICBwYWNrYWdpbmcuc3BlY2lmaWVycy5TcGVjaWZpZXJTZXQodmFsdWUpCiAgICBleGNlcHQgcGFja2FnaW5nLnNwZWNpZmllcnMuSW52YWxpZFNwZWNpZmllciBhcyBlcnJvcjoKICAgICAgICB0bXBsID0gKAogICAgICAgICAgICAie2F0dHIhcn0gbXVzdCBiZSBhIHN0cmluZyAiCiAgICAgICAgICAgICJjb250YWluaW5nIHZhbGlkIHZlcnNpb24gc3BlY2lmaWVyczsge2Vycm9yfSIKICAgICAgICApCiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcih0bXBsLmZvcm1hdChhdHRyPWF0dHIsIGVycm9yPWVycm9yKSkKCgpkZWYgY2hlY2tfZW50cnlfcG9pbnRzKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IGVudHJ5X3BvaW50cyBtYXAgaXMgcGFyc2VhYmxlIiIiCiAgICB0cnk6CiAgICAgICAgcGtnX3Jlc291cmNlcy5FbnRyeVBvaW50LnBhcnNlX21hcCh2YWx1ZSkKICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcihlKQoKCmRlZiBjaGVja190ZXN0X3N1aXRlKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKCJ0ZXN0X3N1aXRlIG11c3QgYmUgYSBzdHJpbmciKQoKCmRlZiBjaGVja19wYWNrYWdlX2RhdGEoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgdmFsdWUgaXMgYSBkaWN0aW9uYXJ5IG9mIHBhY2thZ2UgbmFtZXMgdG8gZ2xvYiBsaXN0cyIiIgogICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgZGljdCk6CiAgICAgICAgZm9yIGssIHYgaW4gdmFsdWUuaXRlbXMoKToKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoaywgc3RyKToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGl0ZXIodikKICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuCiAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgIGF0dHIgKyAiIG11c3QgYmUgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgcGFja2FnZSBuYW1lcyB0byBsaXN0cyBvZiAiCiAgICAgICAgIndpbGRjYXJkIHBhdHRlcm5zIgogICAgKQoKCmRlZiBjaGVja19wYWNrYWdlcyhkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICBmb3IgcGtnbmFtZSBpbiB2YWx1ZToKICAgICAgICBpZiBub3QgcmUubWF0Y2gocidcdysoXC5cdyspKicsIHBrZ25hbWUpOgogICAgICAgICAgICBkaXN0dXRpbHMubG9nLndhcm4oCiAgICAgICAgICAgICAgICAiV0FSTklORzogJXIgbm90IGEgdmFsaWQgcGFja2FnZSBuYW1lOyBwbGVhc2UgdXNlIG9ubHkgIgogICAgICAgICAgICAgICAgIi4tc2VwYXJhdGVkIHBhY2thZ2UgbmFtZXMgaW4gc2V0dXAucHkiLCBwa2duYW1lCiAgICAgICAgICAgICkKCgpfRGlzdHJpYnV0aW9uID0gZ2V0X3VucGF0Y2hlZChkaXN0dXRpbHMuY29yZS5EaXN0cmlidXRpb24pCgoKY2xhc3MgRGlzdHJpYnV0aW9uKERpc3RyaWJ1dGlvbl9wYXJzZV9jb25maWdfZmlsZXMsIF9EaXN0cmlidXRpb24pOgogICAgIiIiRGlzdHJpYnV0aW9uIHdpdGggc3VwcG9ydCBmb3IgZmVhdHVyZXMsIHRlc3RzLCBhbmQgcGFja2FnZSBkYXRhCgogICAgVGhpcyBpcyBhbiBlbmhhbmNlZCB2ZXJzaW9uIG9mICdkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb24nIHRoYXQKICAgIGVmZmVjdGl2ZWx5IGFkZHMgdGhlIGZvbGxvd2luZyBuZXcgb3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHMgdG8gJ3NldHVwKCknOgoKICAgICAnaW5zdGFsbF9yZXF1aXJlcycgLS0gYSBzdHJpbmcgb3Igc2VxdWVuY2Ugb2Ygc3RyaW5ncyBzcGVjaWZ5aW5nIHByb2plY3QKICAgICAgICB2ZXJzaW9ucyB0aGF0IHRoZSBkaXN0cmlidXRpb24gcmVxdWlyZXMgd2hlbiBpbnN0YWxsZWQsIGluIHRoZSBmb3JtYXQKICAgICAgICB1c2VkIGJ5ICdwa2dfcmVzb3VyY2VzLnJlcXVpcmUoKScuICBUaGV5IHdpbGwgYmUgaW5zdGFsbGVkCiAgICAgICAgYXV0b21hdGljYWxseSB3aGVuIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZC4gIElmIHlvdSB3aXNoIHRvIHVzZQogICAgICAgIHBhY2thZ2VzIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUgaW4gUHlQSSwgb3Igd2FudCB0byBnaXZlIHlvdXIgdXNlcnMgYW4KICAgICAgICBhbHRlcm5hdGUgZG93bmxvYWQgbG9jYXRpb24sIHlvdSBjYW4gYWRkIGEgJ2ZpbmRfbGlua3MnIG9wdGlvbiB0byB0aGUKICAgICAgICAnW2Vhc3lfaW5zdGFsbF0nIHNlY3Rpb24gb2YgeW91ciBwcm9qZWN0J3MgJ3NldHVwLmNmZycgZmlsZSwgYW5kIHRoZW4KICAgICAgICBzZXR1cHRvb2xzIHdpbGwgc2NhbiB0aGUgbGlzdGVkIHdlYiBwYWdlcyBmb3IgbGlua3MgdGhhdCBzYXRpc2Z5IHRoZQogICAgICAgIHJlcXVpcmVtZW50cy4KCiAgICAgJ2V4dHJhc19yZXF1aXJlJyAtLSBhIGRpY3Rpb25hcnkgbWFwcGluZyBuYW1lcyBvZiBvcHRpb25hbCAiZXh0cmFzIiB0byB0aGUKICAgICAgICBhZGRpdGlvbmFsIHJlcXVpcmVtZW50KHMpIHRoYXQgdXNpbmcgdGhvc2UgZXh0cmFzIGluY3Vycy4gRm9yIGV4YW1wbGUsCiAgICAgICAgdGhpczo6CgogICAgICAgICAgICBleHRyYXNfcmVxdWlyZSA9IGRpY3QocmVTVCA9IFsiZG9jdXRpbHM+PTAuMyIsICJyZVNUZWRpdCJdKQoKICAgICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgYW4gZXh0cmEKICAgICAgICBjYXBhYmlsaXR5IGNhbGxlZCAicmVTVCIsIGJ1dCBpdCBjYW4gb25seSBiZSB1c2VkIGlmIGRvY3V0aWxzIGFuZAogICAgICAgIHJlU1RlZGl0IGFyZSBpbnN0YWxsZWQuICBJZiB0aGUgdXNlciBpbnN0YWxscyB5b3VyIHBhY2thZ2UgdXNpbmcKICAgICAgICBFYXN5SW5zdGFsbCBhbmQgcmVxdWVzdHMgb25lIG9mIHlvdXIgZXh0cmFzLCB0aGUgY29ycmVzcG9uZGluZwogICAgICAgIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIHdpbGwgYmUgaW5zdGFsbGVkIGlmIG5lZWRlZC4KCiAgICAgJ2ZlYXR1cmVzJyAqKmRlcHJlY2F0ZWQqKiAtLSBhIGRpY3Rpb25hcnkgbWFwcGluZyBvcHRpb24gbmFtZXMgdG8KICAgICAgICAnc2V0dXB0b29scy5GZWF0dXJlJwogICAgICAgIG9iamVjdHMuICBGZWF0dXJlcyBhcmUgYSBwb3J0aW9uIG9mIHRoZSBkaXN0cmlidXRpb24gdGhhdCBjYW4gYmUKICAgICAgICBpbmNsdWRlZCBvciBleGNsdWRlZCBiYXNlZCBvbiB1c2VyIG9wdGlvbnMsIGludGVyLWZlYXR1cmUgZGVwZW5kZW5jaWVzLAogICAgICAgIGFuZCBhdmFpbGFiaWxpdHkgb24gdGhlIGN1cnJlbnQgc3lzdGVtLiAgRXhjbHVkZWQgZmVhdHVyZXMgYXJlIG9taXR0ZWQKICAgICAgICBmcm9tIGFsbCBzZXR1cCBjb21tYW5kcywgaW5jbHVkaW5nIHNvdXJjZSBhbmQgYmluYXJ5IGRpc3RyaWJ1dGlvbnMsIHNvCiAgICAgICAgeW91IGNhbiBjcmVhdGUgbXVsdGlwbGUgZGlzdHJpYnV0aW9ucyBmcm9tIHRoZSBzYW1lIHNvdXJjZSB0cmVlLgogICAgICAgIEZlYXR1cmUgbmFtZXMgc2hvdWxkIGJlIHZhbGlkIFB5dGhvbiBpZGVudGlmaWVycywgZXhjZXB0IHRoYXQgdGhleSBtYXkKICAgICAgICBjb250YWluIHRoZSAnLScgKG1pbnVzKSBzaWduLiAgRmVhdHVyZXMgY2FuIGJlIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkCiAgICAgICAgdmlhIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyAnLS13aXRoLVgnIGFuZCAnLS13aXRob3V0LVgnLCB3aGVyZSAnWCcgaXMKICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZS4gIFdoZXRoZXIgYSBmZWF0dXJlIGlzIGluY2x1ZGVkIGJ5IGRlZmF1bHQsIGFuZAogICAgICAgIHdoZXRoZXIgeW91IGFyZSBhbGxvd2VkIHRvIGNvbnRyb2wgdGhpcyBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIGlzCiAgICAgICAgZGV0ZXJtaW5lZCBieSB0aGUgRmVhdHVyZSBvYmplY3QuICBTZWUgdGhlICdGZWF0dXJlJyBjbGFzcyBmb3IgbW9yZQogICAgICAgIGluZm9ybWF0aW9uLgoKICAgICAndGVzdF9zdWl0ZScgLS0gdGhlIG5hbWUgb2YgYSB0ZXN0IHN1aXRlIHRvIHJ1biBmb3IgdGhlICd0ZXN0JyBjb21tYW5kLgogICAgICAgIElmIHRoZSB1c2VyIHJ1bnMgJ3B5dGhvbiBzZXR1cC5weSB0ZXN0JywgdGhlIHBhY2thZ2Ugd2lsbCBiZSBpbnN0YWxsZWQsCiAgICAgICAgYW5kIHRoZSBuYW1lZCB0ZXN0IHN1aXRlIHdpbGwgYmUgcnVuLiAgVGhlIGZvcm1hdCBpcyB0aGUgc2FtZSBhcwogICAgICAgIHdvdWxkIGJlIHVzZWQgb24gYSAndW5pdHRlc3QucHknIGNvbW1hbmQgbGluZS4gIFRoYXQgaXMsIGl0IGlzIHRoZQogICAgICAgIGRvdHRlZCBuYW1lIG9mIGFuIG9iamVjdCB0byBpbXBvcnQgYW5kIGNhbGwgdG8gZ2VuZXJhdGUgYSB0ZXN0IHN1aXRlLgoKICAgICAncGFja2FnZV9kYXRhJyAtLSBhIGRpY3Rpb25hcnkgbWFwcGluZyBwYWNrYWdlIG5hbWVzIHRvIGxpc3RzIG9mIGZpbGVuYW1lcwogICAgICAgIG9yIGdsb2JzIHRvIHVzZSB0byBmaW5kIGRhdGEgZmlsZXMgY29udGFpbmVkIGluIHRoZSBuYW1lZCBwYWNrYWdlcy4KICAgICAgICBJZiB0aGUgZGljdGlvbmFyeSBoYXMgZmlsZW5hbWVzIG9yIGdsb2JzIGxpc3RlZCB1bmRlciAnIiInICh0aGUgZW1wdHkKICAgICAgICBzdHJpbmcpLCB0aG9zZSBuYW1lcyB3aWxsIGJlIHNlYXJjaGVkIGZvciBpbiBldmVyeSBwYWNrYWdlLCBpbiBhZGRpdGlvbgogICAgICAgIHRvIGFueSBuYW1lcyBmb3IgdGhlIHNwZWNpZmljIHBhY2thZ2UuICBEYXRhIGZpbGVzIGZvdW5kIHVzaW5nIHRoZXNlCiAgICAgICAgbmFtZXMvZ2xvYnMgd2lsbCBiZSBpbnN0YWxsZWQgYWxvbmcgd2l0aCB0aGUgcGFja2FnZSwgaW4gdGhlIHNhbWUKICAgICAgICBsb2NhdGlvbiBhcyB0aGUgcGFja2FnZS4gIE5vdGUgdGhhdCBnbG9icyBhcmUgYWxsb3dlZCB0byByZWZlcmVuY2UKICAgICAgICB0aGUgY29udGVudHMgb2Ygbm9uLXBhY2thZ2Ugc3ViZGlyZWN0b3JpZXMsIGFzIGxvbmcgYXMgeW91IHVzZSAnLycgYXMKICAgICAgICBhIHBhdGggc2VwYXJhdG9yLiAgKEdsb2JzIGFyZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0bwogICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIHBhdGhzIGF0IHJ1bnRpbWUuKQoKICAgIEluIGFkZGl0aW9uIHRvIHRoZXNlIG5ldyBrZXl3b3JkcywgdGhpcyBjbGFzcyBhbHNvIGhhcyBzZXZlcmFsIG5ldyBtZXRob2RzCiAgICBmb3IgbWFuaXB1bGF0aW5nIHRoZSBkaXN0cmlidXRpb24ncyBjb250ZW50cy4gIEZvciBleGFtcGxlLCB0aGUgJ2luY2x1ZGUoKScKICAgIGFuZCAnZXhjbHVkZSgpJyBtZXRob2RzIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGluLXBsYWNlIGFkZCBhbmQgc3VidHJhY3QKICAgIGNvbW1hbmRzIHRoYXQgYWRkIG9yIHJlbW92ZSBwYWNrYWdlcywgbW9kdWxlcywgZXh0ZW5zaW9ucywgYW5kIHNvIG9uIGZyb20KICAgIHRoZSBkaXN0cmlidXRpb24uICBUaGV5IGFyZSB1c2VkIGJ5IHRoZSBmZWF0dXJlIHN1YnN5c3RlbSB0byBjb25maWd1cmUgdGhlCiAgICBkaXN0cmlidXRpb24gZm9yIHRoZSBpbmNsdWRlZCBhbmQgZXhjbHVkZWQgZmVhdHVyZXMuCiAgICAiIiIKCiAgICBfcGF0Y2hlZF9kaXN0ID0gTm9uZQoKICAgIGRlZiBwYXRjaF9taXNzaW5nX3BrZ19pbmZvKHNlbGYsIGF0dHJzKToKICAgICAgICAjIEZha2UgdXAgYSByZXBsYWNlbWVudCBmb3IgdGhlIGRhdGEgdGhhdCB3b3VsZCBub3JtYWxseSBjb21lIGZyb20KICAgICAgICAjIFBLRy1JTkZPLCBidXQgd2hpY2ggbWlnaHQgbm90IHlldCBiZSBidWlsdCBpZiB0aGlzIGlzIGEgZnJlc2gKICAgICAgICAjIGNoZWNrb3V0LgogICAgICAgICMKICAgICAgICBpZiBub3QgYXR0cnMgb3IgJ25hbWUnIG5vdCBpbiBhdHRycyBvciAndmVyc2lvbicgbm90IGluIGF0dHJzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBrZXkgPSBwa2dfcmVzb3VyY2VzLnNhZmVfbmFtZShzdHIoYXR0cnNbJ25hbWUnXSkpLmxvd2VyKCkKICAgICAgICBkaXN0ID0gcGtnX3Jlc291cmNlcy53b3JraW5nX3NldC5ieV9rZXkuZ2V0KGtleSkKICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lIGFuZCBub3QgZGlzdC5oYXNfbWV0YWRhdGEoJ1BLRy1JTkZPJyk6CiAgICAgICAgICAgIGRpc3QuX3ZlcnNpb24gPSBwa2dfcmVzb3VyY2VzLnNhZmVfdmVyc2lvbihzdHIoYXR0cnNbJ3ZlcnNpb24nXSkpCiAgICAgICAgICAgIHNlbGYuX3BhdGNoZWRfZGlzdCA9IGRpc3QKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYXR0cnM9Tm9uZSk6CiAgICAgICAgaGF2ZV9wYWNrYWdlX2RhdGEgPSBoYXNhdHRyKHNlbGYsICJwYWNrYWdlX2RhdGEiKQogICAgICAgIGlmIG5vdCBoYXZlX3BhY2thZ2VfZGF0YToKICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2RhdGEgPSB7fQogICAgICAgIGF0dHJzID0gYXR0cnMgb3Ige30KICAgICAgICBpZiAnZmVhdHVyZXMnIGluIGF0dHJzIG9yICdyZXF1aXJlX2ZlYXR1cmVzJyBpbiBhdHRyczoKICAgICAgICAgICAgRmVhdHVyZS53YXJuX2RlcHJlY2F0ZWQoKQogICAgICAgIHNlbGYucmVxdWlyZV9mZWF0dXJlcyA9IFtdCiAgICAgICAgc2VsZi5mZWF0dXJlcyA9IHt9CiAgICAgICAgc2VsZi5kaXN0X2ZpbGVzID0gW10KICAgICAgICBzZWxmLnNyY19yb290ID0gYXR0cnMucG9wKCJzcmNfcm9vdCIsIE5vbmUpCiAgICAgICAgc2VsZi5wYXRjaF9taXNzaW5nX3BrZ19pbmZvKGF0dHJzKQogICAgICAgIHNlbGYubG9uZ19kZXNjcmlwdGlvbl9jb250ZW50X3R5cGUgPSBhdHRycy5nZXQoCiAgICAgICAgICAgICdsb25nX2Rlc2NyaXB0aW9uX2NvbnRlbnRfdHlwZScKICAgICAgICApCiAgICAgICAgc2VsZi5kZXBlbmRlbmN5X2xpbmtzID0gYXR0cnMucG9wKCdkZXBlbmRlbmN5X2xpbmtzJywgW10pCiAgICAgICAgc2VsZi5zZXR1cF9yZXF1aXJlcyA9IGF0dHJzLnBvcCgnc2V0dXBfcmVxdWlyZXMnLCBbXSkKICAgICAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLnNldHVwX2tleXdvcmRzJyk6CiAgICAgICAgICAgIHZhcnMoc2VsZikuc2V0ZGVmYXVsdChlcC5uYW1lLCBOb25lKQogICAgICAgIF9EaXN0cmlidXRpb24uX19pbml0X18oc2VsZiwgYXR0cnMpCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLm1ldGFkYXRhLnZlcnNpb24sIG51bWJlcnMuTnVtYmVyKToKICAgICAgICAgICAgIyBTb21lIHBlb3BsZSBhcHBhcmVudGx5IHRha2UgInZlcnNpb24gbnVtYmVyIiB0b28gbGl0ZXJhbGx5IDopCiAgICAgICAgICAgIHNlbGYubWV0YWRhdGEudmVyc2lvbiA9IHN0cihzZWxmLm1ldGFkYXRhLnZlcnNpb24pCgogICAgICAgIGlmIHNlbGYubWV0YWRhdGEudmVyc2lvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdmVyID0gcGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbihzZWxmLm1ldGFkYXRhLnZlcnNpb24pCiAgICAgICAgICAgICAgICBub3JtYWxpemVkX3ZlcnNpb24gPSBzdHIodmVyKQogICAgICAgICAgICAgICAgaWYgc2VsZi5tZXRhZGF0YS52ZXJzaW9uICE9IG5vcm1hbGl6ZWRfdmVyc2lvbjoKICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgICAgICAgICAiTm9ybWFsaXppbmcgJyVzJyB0byAnJXMnIiAlICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWV0YWRhdGEudmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRfdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBzZWxmLm1ldGFkYXRhLnZlcnNpb24gPSBub3JtYWxpemVkX3ZlcnNpb24KICAgICAgICAgICAgZXhjZXB0IChwYWNrYWdpbmcudmVyc2lvbi5JbnZhbGlkVmVyc2lvbiwgVHlwZUVycm9yKToKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAgICAgIlRoZSB2ZXJzaW9uIHNwZWNpZmllZCAoJXIpIGlzIGFuIGludmFsaWQgdmVyc2lvbiwgdGhpcyAiCiAgICAgICAgICAgICAgICAgICAgIm1heSBub3Qgd29yayBhcyBleHBlY3RlZCB3aXRoIG5ld2VyIHZlcnNpb25zIG9mICIKICAgICAgICAgICAgICAgICAgICAic2V0dXB0b29scywgcGlwLCBhbmQgUHlQSS4gUGxlYXNlIHNlZSBQRVAgNDQwIGZvciBtb3JlICIKICAgICAgICAgICAgICAgICAgICAiZGV0YWlscy4iICUgc2VsZi5tZXRhZGF0YS52ZXJzaW9uCiAgICAgICAgICAgICAgICApCiAgICAgICAgc2VsZi5fZmluYWxpemVfcmVxdWlyZXMoKQoKICAgIGRlZiBfZmluYWxpemVfcmVxdWlyZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2V0IGBtZXRhZGF0YS5weXRob25fcmVxdWlyZXNgIGFuZCBmaXggZW52aXJvbm1lbnQgbWFya2VycwogICAgICAgIGluIGBpbnN0YWxsX3JlcXVpcmVzYCBhbmQgYGV4dHJhc19yZXF1aXJlYC4KICAgICAgICAiIiIKICAgICAgICBpZiBnZXRhdHRyKHNlbGYsICdweXRob25fcmVxdWlyZXMnLCBOb25lKToKICAgICAgICAgICAgc2VsZi5tZXRhZGF0YS5weXRob25fcmVxdWlyZXMgPSBzZWxmLnB5dGhvbl9yZXF1aXJlcwogICAgICAgIHNlbGYuX2NvbnZlcnRfZXh0cmFzX3JlcXVpcmVtZW50cygpCiAgICAgICAgc2VsZi5fbW92ZV9pbnN0YWxsX3JlcXVpcmVtZW50c19tYXJrZXJzKCkKCiAgICBkZWYgX2NvbnZlcnRfZXh0cmFzX3JlcXVpcmVtZW50cyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDb252ZXJ0IHJlcXVpcmVtZW50cyBpbiBgZXh0cmFzX3JlcXVpcmVgIG9mIHRoZSBmb3JtCiAgICAgICAgYCJleHRyYSI6IFsiYmFyYmF6cXV1eDsge21hcmtlcn0iXWAgdG8KICAgICAgICBgImV4dHJhOnttYXJrZXJ9IjogWyJiYXJiYXpxdXV4Il1gLgogICAgICAgICIiIgogICAgICAgIHNwZWNfZXh0X3JlcXMgPSBnZXRhdHRyKHNlbGYsICdleHRyYXNfcmVxdWlyZScsIE5vbmUpIG9yIHt9CiAgICAgICAgc2VsZi5fdG1wX2V4dHJhc19yZXF1aXJlID0gZGVmYXVsdGRpY3QobGlzdCkKICAgICAgICBmb3Igc2VjdGlvbiwgdiBpbiBzcGVjX2V4dF9yZXFzLml0ZW1zKCk6CiAgICAgICAgICAgICMgRG8gbm90IHN0cmlwIGVtcHR5IHNlY3Rpb25zLgogICAgICAgICAgICBzZWxmLl90bXBfZXh0cmFzX3JlcXVpcmVbc2VjdGlvbl0KICAgICAgICAgICAgZm9yIHIgaW4gcGtnX3Jlc291cmNlcy5wYXJzZV9yZXF1aXJlbWVudHModik6CiAgICAgICAgICAgICAgICBzdWZmaXggPSBzZWxmLl9zdWZmaXhfZm9yKHIpCiAgICAgICAgICAgICAgICBzZWxmLl90bXBfZXh0cmFzX3JlcXVpcmVbc2VjdGlvbiArIHN1ZmZpeF0uYXBwZW5kKHIpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9zdWZmaXhfZm9yKHJlcSk6CiAgICAgICAgIiIiCiAgICAgICAgRm9yIGEgcmVxdWlyZW1lbnQsIHJldHVybiB0aGUgJ2V4dHJhc19yZXF1aXJlJyBzdWZmaXggZm9yCiAgICAgICAgdGhhdCByZXF1aXJlbWVudC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gJzonICsgc3RyKHJlcS5tYXJrZXIpIGlmIHJlcS5tYXJrZXIgZWxzZSAnJwoKICAgIGRlZiBfbW92ZV9pbnN0YWxsX3JlcXVpcmVtZW50c19tYXJrZXJzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1vdmUgcmVxdWlyZW1lbnRzIGluIGBpbnN0YWxsX3JlcXVpcmVzYCB0aGF0IGFyZSB1c2luZyBlbnZpcm9ubWVudAogICAgICAgIG1hcmtlcnMgYGV4dHJhc19yZXF1aXJlYC4KICAgICAgICAiIiIKCiAgICAgICAgIyBkaXZpZGUgdGhlIGluc3RhbGxfcmVxdWlyZXMgaW50byB0d28gc2V0cywgc2ltcGxlIG9uZXMgc3RpbGwKICAgICAgICAjIGhhbmRsZWQgYnkgaW5zdGFsbF9yZXF1aXJlcyBhbmQgbW9yZSBjb21wbGV4IG9uZXMgaGFuZGxlZAogICAgICAgICMgYnkgZXh0cmFzX3JlcXVpcmUuCgogICAgICAgIGRlZiBpc19zaW1wbGVfcmVxKHJlcSk6CiAgICAgICAgICAgIHJldHVybiBub3QgcmVxLm1hcmtlcgoKICAgICAgICBzcGVjX2luc3RfcmVxcyA9IGdldGF0dHIoc2VsZiwgJ2luc3RhbGxfcmVxdWlyZXMnLCBOb25lKSBvciAoKQogICAgICAgIGluc3RfcmVxcyA9IGxpc3QocGtnX3Jlc291cmNlcy5wYXJzZV9yZXF1aXJlbWVudHMoc3BlY19pbnN0X3JlcXMpKQogICAgICAgIHNpbXBsZV9yZXFzID0gZmlsdGVyKGlzX3NpbXBsZV9yZXEsIGluc3RfcmVxcykKICAgICAgICBjb21wbGV4X3JlcXMgPSBmaWx0ZXJmYWxzZShpc19zaW1wbGVfcmVxLCBpbnN0X3JlcXMpCiAgICAgICAgc2VsZi5pbnN0YWxsX3JlcXVpcmVzID0gbGlzdChtYXAoc3RyLCBzaW1wbGVfcmVxcykpCgogICAgICAgIGZvciByIGluIGNvbXBsZXhfcmVxczoKICAgICAgICAgICAgc2VsZi5fdG1wX2V4dHJhc19yZXF1aXJlWyc6JyArIHN0cihyLm1hcmtlcildLmFwcGVuZChyKQogICAgICAgIHNlbGYuZXh0cmFzX3JlcXVpcmUgPSBkaWN0KAogICAgICAgICAgICAoaywgW3N0cihyKSBmb3IgciBpbiBtYXAoc2VsZi5fY2xlYW5fcmVxLCB2KV0pCiAgICAgICAgICAgIGZvciBrLCB2IGluIHNlbGYuX3RtcF9leHRyYXNfcmVxdWlyZS5pdGVtcygpCiAgICAgICAgKQoKICAgIGRlZiBfY2xlYW5fcmVxKHNlbGYsIHJlcSk6CiAgICAgICAgIiIiCiAgICAgICAgR2l2ZW4gYSBSZXF1aXJlbWVudCwgcmVtb3ZlIGVudmlyb25tZW50IG1hcmtlcnMgYW5kIHJldHVybiBpdC4KICAgICAgICAiIiIKICAgICAgICByZXEubWFya2VyID0gTm9uZQogICAgICAgIHJldHVybiByZXEKCiAgICBkZWYgcGFyc2VfY29uZmlnX2ZpbGVzKHNlbGYsIGZpbGVuYW1lcz1Ob25lLCBpZ25vcmVfb3B0aW9uX2Vycm9ycz1GYWxzZSk6CiAgICAgICAgIiIiUGFyc2VzIGNvbmZpZ3VyYXRpb24gZmlsZXMgZnJvbSB2YXJpb3VzIGxldmVscwogICAgICAgIGFuZCBsb2FkcyBjb25maWd1cmF0aW9uLgoKICAgICAgICAiIiIKICAgICAgICBfRGlzdHJpYnV0aW9uLnBhcnNlX2NvbmZpZ19maWxlcyhzZWxmLCBmaWxlbmFtZXM9ZmlsZW5hbWVzKQoKICAgICAgICBwYXJzZV9jb25maWd1cmF0aW9uKHNlbGYsIHNlbGYuY29tbWFuZF9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlX29wdGlvbl9lcnJvcnM9aWdub3JlX29wdGlvbl9lcnJvcnMpCiAgICAgICAgc2VsZi5fZmluYWxpemVfcmVxdWlyZXMoKQoKICAgIGRlZiBwYXJzZV9jb21tYW5kX2xpbmUoc2VsZik6CiAgICAgICAgIiIiUHJvY2VzcyBmZWF0dXJlcyBhZnRlciBwYXJzaW5nIGNvbW1hbmQgbGluZSBvcHRpb25zIiIiCiAgICAgICAgcmVzdWx0ID0gX0Rpc3RyaWJ1dGlvbi5wYXJzZV9jb21tYW5kX2xpbmUoc2VsZikKICAgICAgICBpZiBzZWxmLmZlYXR1cmVzOgogICAgICAgICAgICBzZWxmLl9maW5hbGl6ZV9mZWF0dXJlcygpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfZmVhdHVyZV9hdHRybmFtZShzZWxmLCBuYW1lKToKICAgICAgICAiIiJDb252ZXJ0IGZlYXR1cmUgbmFtZSB0byBjb3JyZXNwb25kaW5nIG9wdGlvbiBhdHRyaWJ1dGUgbmFtZSIiIgogICAgICAgIHJldHVybiAnd2l0aF8nICsgbmFtZS5yZXBsYWNlKCctJywgJ18nKQoKICAgIGRlZiBmZXRjaF9idWlsZF9lZ2dzKHNlbGYsIHJlcXVpcmVzKToKICAgICAgICAiIiJSZXNvbHZlIHByZS1zZXR1cCByZXF1aXJlbWVudHMiIiIKICAgICAgICByZXNvbHZlZF9kaXN0cyA9IHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQucmVzb2x2ZSgKICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5wYXJzZV9yZXF1aXJlbWVudHMocmVxdWlyZXMpLAogICAgICAgICAgICBpbnN0YWxsZXI9c2VsZi5mZXRjaF9idWlsZF9lZ2csCiAgICAgICAgICAgIHJlcGxhY2VfY29uZmxpY3Rpbmc9VHJ1ZSwKICAgICAgICApCiAgICAgICAgZm9yIGRpc3QgaW4gcmVzb2x2ZWRfZGlzdHM6CiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQuYWRkKGRpc3QsIHJlcGxhY2U9VHJ1ZSkKICAgICAgICByZXR1cm4gcmVzb2x2ZWRfZGlzdHMKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBfRGlzdHJpYnV0aW9uLmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBpZiBzZWxmLmZlYXR1cmVzOgogICAgICAgICAgICBzZWxmLl9zZXRfZ2xvYmFsX29wdHNfZnJvbV9mZWF0dXJlcygpCgogICAgICAgIGZvciBlcCBpbiBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuc2V0dXBfa2V5d29yZHMnKToKICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKHNlbGYsIGVwLm5hbWUsIE5vbmUpCiAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgZXAucmVxdWlyZShpbnN0YWxsZXI9c2VsZi5mZXRjaF9idWlsZF9lZ2cpCiAgICAgICAgICAgICAgICBlcC5sb2FkKCkoc2VsZiwgZXAubmFtZSwgdmFsdWUpCiAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCAnY29udmVydF8ydG8zX2RvY3Rlc3RzJywgTm9uZSk6CiAgICAgICAgICAgICMgWFhYIG1heSBjb252ZXJ0IHRvIHNldCBoZXJlIHdoZW4gd2UgY2FuIHJlbHkgb24gc2V0IGJlaW5nIGJ1aWx0aW4KICAgICAgICAgICAgc2VsZi5jb252ZXJ0XzJ0bzNfZG9jdGVzdHMgPSBbCiAgICAgICAgICAgICAgICBvcy5wYXRoLmFic3BhdGgocCkKICAgICAgICAgICAgICAgIGZvciBwIGluIHNlbGYuY29udmVydF8ydG8zX2RvY3Rlc3RzCiAgICAgICAgICAgIF0KICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmNvbnZlcnRfMnRvM19kb2N0ZXN0cyA9IFtdCgogICAgZGVmIGdldF9lZ2dfY2FjaGVfZGlyKHNlbGYpOgogICAgICAgIGVnZ19jYWNoZV9kaXIgPSBvcy5wYXRoLmpvaW4ob3MuY3VyZGlyLCAnLmVnZ3MnKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhlZ2dfY2FjaGVfZGlyKToKICAgICAgICAgICAgb3MubWtkaXIoZWdnX2NhY2hlX2RpcikKICAgICAgICAgICAgd2luZG93c19zdXBwb3J0LmhpZGVfZmlsZShlZ2dfY2FjaGVfZGlyKQogICAgICAgICAgICByZWFkbWVfdHh0X2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKGVnZ19jYWNoZV9kaXIsICdSRUFETUUudHh0JykKICAgICAgICAgICAgd2l0aCBvcGVuKHJlYWRtZV90eHRfZmlsZW5hbWUsICd3JykgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoJ1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGVnZ3MgdGhhdCB3ZXJlIGRvd25sb2FkZWQgJwogICAgICAgICAgICAgICAgICAgICAgICAnYnkgc2V0dXB0b29scyB0byBidWlsZCwgdGVzdCwgYW5kIHJ1biBwbHVnLWlucy5cblxuJykKICAgICAgICAgICAgICAgIGYud3JpdGUoJ1RoaXMgZGlyZWN0b3J5IGNhY2hlcyB0aG9zZSBlZ2dzIHRvIHByZXZlbnQgJwogICAgICAgICAgICAgICAgICAgICAgICAncmVwZWF0ZWQgZG93bmxvYWRzLlxuXG4nKQogICAgICAgICAgICAgICAgZi53cml0ZSgnSG93ZXZlciwgaXQgaXMgc2FmZSB0byBkZWxldGUgdGhpcyBkaXJlY3RvcnkuXG5cbicpCgogICAgICAgIHJldHVybiBlZ2dfY2FjaGVfZGlyCgogICAgZGVmIGZldGNoX2J1aWxkX2VnZyhzZWxmLCByZXEpOgogICAgICAgICIiIkZldGNoIGFuIGVnZyBuZWVkZWQgZm9yIGJ1aWxkaW5nIiIiCiAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBlYXN5X2luc3RhbGwKICAgICAgICBkaXN0ID0gc2VsZi5fX2NsYXNzX18oeydzY3JpcHRfYXJncyc6IFsnZWFzeV9pbnN0YWxsJ119KQogICAgICAgIG9wdHMgPSBkaXN0LmdldF9vcHRpb25fZGljdCgnZWFzeV9pbnN0YWxsJykKICAgICAgICBvcHRzLmNsZWFyKCkKICAgICAgICBvcHRzLnVwZGF0ZSgKICAgICAgICAgICAgKGssIHYpCiAgICAgICAgICAgIGZvciBrLCB2IGluIHNlbGYuZ2V0X29wdGlvbl9kaWN0KCdlYXN5X2luc3RhbGwnKS5pdGVtcygpCiAgICAgICAgICAgIGlmIGsgaW4gKAogICAgICAgICAgICAgICAgIyBkb24ndCB1c2UgYW55IG90aGVyIHNldHRpbmdzCiAgICAgICAgICAgICAgICAnZmluZF9saW5rcycsICdzaXRlX2RpcnMnLCAnaW5kZXhfdXJsJywKICAgICAgICAgICAgICAgICdvcHRpbWl6ZScsICdzaXRlX2RpcnMnLCAnYWxsb3dfaG9zdHMnLAogICAgICAgICkpCiAgICAgICAgaWYgc2VsZi5kZXBlbmRlbmN5X2xpbmtzOgogICAgICAgICAgICBsaW5rcyA9IHNlbGYuZGVwZW5kZW5jeV9saW5rc1s6XQogICAgICAgICAgICBpZiAnZmluZF9saW5rcycgaW4gb3B0czoKICAgICAgICAgICAgICAgIGxpbmtzID0gb3B0c1snZmluZF9saW5rcyddWzFdICsgbGlua3MKICAgICAgICAgICAgb3B0c1snZmluZF9saW5rcyddID0gKCdzZXR1cCcsIGxpbmtzKQogICAgICAgIGluc3RhbGxfZGlyID0gc2VsZi5nZXRfZWdnX2NhY2hlX2RpcigpCiAgICAgICAgY21kID0gZWFzeV9pbnN0YWxsKAogICAgICAgICAgICBkaXN0LCBhcmdzPVsieCJdLCBpbnN0YWxsX2Rpcj1pbnN0YWxsX2RpciwKICAgICAgICAgICAgZXhjbHVkZV9zY3JpcHRzPVRydWUsCiAgICAgICAgICAgIGFsd2F5c19jb3B5PUZhbHNlLCBidWlsZF9kaXJlY3Rvcnk9Tm9uZSwgZWRpdGFibGU9RmFsc2UsCiAgICAgICAgICAgIHVwZ3JhZGU9RmFsc2UsIG11bHRpX3ZlcnNpb249VHJ1ZSwgbm9fcmVwb3J0PVRydWUsIHVzZXI9RmFsc2UKICAgICAgICApCiAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQogICAgICAgIHJldHVybiBjbWQuZWFzeV9pbnN0YWxsKHJlcSkKCiAgICBkZWYgX3NldF9nbG9iYWxfb3B0c19mcm9tX2ZlYXR1cmVzKHNlbGYpOgogICAgICAgICIiIkFkZCAtLXdpdGgtWC8tLXdpdGhvdXQtWCBvcHRpb25zIGJhc2VkIG9uIG9wdGlvbmFsIGZlYXR1cmVzIiIiCgogICAgICAgIGdvID0gW10KICAgICAgICBubyA9IHNlbGYubmVnYXRpdmVfb3B0LmNvcHkoKQoKICAgICAgICBmb3IgbmFtZSwgZmVhdHVyZSBpbiBzZWxmLmZlYXR1cmVzLml0ZW1zKCk6CiAgICAgICAgICAgIHNlbGYuX3NldF9mZWF0dXJlKG5hbWUsIE5vbmUpCiAgICAgICAgICAgIGZlYXR1cmUudmFsaWRhdGUoc2VsZikKCiAgICAgICAgICAgIGlmIGZlYXR1cmUub3B0aW9uYWw6CiAgICAgICAgICAgICAgICBkZXNjciA9IGZlYXR1cmUuZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgIGluY2RlZiA9ICcgKGRlZmF1bHQpJwogICAgICAgICAgICAgICAgZXhjZGVmID0gJycKICAgICAgICAgICAgICAgIGlmIG5vdCBmZWF0dXJlLmluY2x1ZGVfYnlfZGVmYXVsdCgpOgogICAgICAgICAgICAgICAgICAgIGV4Y2RlZiwgaW5jZGVmID0gaW5jZGVmLCBleGNkZWYKCiAgICAgICAgICAgICAgICBuZXcgPSAoCiAgICAgICAgICAgICAgICAgICAgKCd3aXRoLScgKyBuYW1lLCBOb25lLCAnaW5jbHVkZSAnICsgZGVzY3IgKyBpbmNkZWYpLAogICAgICAgICAgICAgICAgICAgICgnd2l0aG91dC0nICsgbmFtZSwgTm9uZSwgJ2V4Y2x1ZGUgJyArIGRlc2NyICsgZXhjZGVmKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGdvLmV4dGVuZChuZXcpCiAgICAgICAgICAgICAgICBub1snd2l0aG91dC0nICsgbmFtZV0gPSAnd2l0aC0nICsgbmFtZQoKICAgICAgICBzZWxmLmdsb2JhbF9vcHRpb25zID0gc2VsZi5mZWF0dXJlX29wdGlvbnMgPSBnbyArIHNlbGYuZ2xvYmFsX29wdGlvbnMKICAgICAgICBzZWxmLm5lZ2F0aXZlX29wdCA9IHNlbGYuZmVhdHVyZV9uZWdvcHQgPSBubwoKICAgIGRlZiBfZmluYWxpemVfZmVhdHVyZXMoc2VsZik6CiAgICAgICAgIiIiQWRkL3JlbW92ZSBmZWF0dXJlcyBhbmQgcmVzb2x2ZSBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0aGVtIiIiCgogICAgICAgICMgRmlyc3QsIGZsYWcgYWxsIHRoZSBlbmFibGVkIGl0ZW1zIChhbmQgdGh1cyB0aGVpciBkZXBlbmRlbmNpZXMpCiAgICAgICAgZm9yIG5hbWUsIGZlYXR1cmUgaW4gc2VsZi5mZWF0dXJlcy5pdGVtcygpOgogICAgICAgICAgICBlbmFibGVkID0gc2VsZi5mZWF0dXJlX2lzX2luY2x1ZGVkKG5hbWUpCiAgICAgICAgICAgIGlmIGVuYWJsZWQgb3IgKGVuYWJsZWQgaXMgTm9uZSBhbmQgZmVhdHVyZS5pbmNsdWRlX2J5X2RlZmF1bHQoKSk6CiAgICAgICAgICAgICAgICBmZWF0dXJlLmluY2x1ZGVfaW4oc2VsZikKICAgICAgICAgICAgICAgIHNlbGYuX3NldF9mZWF0dXJlKG5hbWUsIDEpCgogICAgICAgICMgVGhlbiBkaXNhYmxlIHRoZSByZXN0LCBzbyB0aGF0IG9mZi1ieS1kZWZhdWx0IGZlYXR1cmVzIGRvbid0CiAgICAgICAgIyBnZXQgZmxhZ2dlZCBhcyBlcnJvcnMgd2hlbiB0aGV5J3JlIHJlcXVpcmVkIGJ5IGFuIGVuYWJsZWQgZmVhdHVyZQogICAgICAgIGZvciBuYW1lLCBmZWF0dXJlIGluIHNlbGYuZmVhdHVyZXMuaXRlbXMoKToKICAgICAgICAgICAgaWYgbm90IHNlbGYuZmVhdHVyZV9pc19pbmNsdWRlZChuYW1lKToKICAgICAgICAgICAgICAgIGZlYXR1cmUuZXhjbHVkZV9mcm9tKHNlbGYpCiAgICAgICAgICAgICAgICBzZWxmLl9zZXRfZmVhdHVyZShuYW1lLCAwKQoKICAgIGRlZiBnZXRfY29tbWFuZF9jbGFzcyhzZWxmLCBjb21tYW5kKToKICAgICAgICAiIiJQbHVnZ2FibGUgdmVyc2lvbiBvZiBnZXRfY29tbWFuZF9jbGFzcygpIiIiCiAgICAgICAgaWYgY29tbWFuZCBpbiBzZWxmLmNtZGNsYXNzOgogICAgICAgICAgICByZXR1cm4gc2VsZi5jbWRjbGFzc1tjb21tYW5kXQoKICAgICAgICBlcHMgPSBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuY29tbWFuZHMnLCBjb21tYW5kKQogICAgICAgIGZvciBlcCBpbiBlcHM6CiAgICAgICAgICAgIGVwLnJlcXVpcmUoaW5zdGFsbGVyPXNlbGYuZmV0Y2hfYnVpbGRfZWdnKQogICAgICAgICAgICBzZWxmLmNtZGNsYXNzW2NvbW1hbmRdID0gY21kY2xhc3MgPSBlcC5sb2FkKCkKICAgICAgICAgICAgcmV0dXJuIGNtZGNsYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24uZ2V0X2NvbW1hbmRfY2xhc3Moc2VsZiwgY29tbWFuZCkKCiAgICBkZWYgcHJpbnRfY29tbWFuZHMoc2VsZik6CiAgICAgICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5jb21tYW5kcycpOgogICAgICAgICAgICBpZiBlcC5uYW1lIG5vdCBpbiBzZWxmLmNtZGNsYXNzOgogICAgICAgICAgICAgICAgIyBkb24ndCByZXF1aXJlIGV4dHJhcyBhcyB0aGUgY29tbWFuZHMgd29uJ3QgYmUgaW52b2tlZAogICAgICAgICAgICAgICAgY21kY2xhc3MgPSBlcC5yZXNvbHZlKCkKICAgICAgICAgICAgICAgIHNlbGYuY21kY2xhc3NbZXAubmFtZV0gPSBjbWRjbGFzcwogICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLnByaW50X2NvbW1hbmRzKHNlbGYpCgogICAgZGVmIGdldF9jb21tYW5kX2xpc3Qoc2VsZik6CiAgICAgICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5jb21tYW5kcycpOgogICAgICAgICAgICBpZiBlcC5uYW1lIG5vdCBpbiBzZWxmLmNtZGNsYXNzOgogICAgICAgICAgICAgICAgIyBkb24ndCByZXF1aXJlIGV4dHJhcyBhcyB0aGUgY29tbWFuZHMgd29uJ3QgYmUgaW52b2tlZAogICAgICAgICAgICAgICAgY21kY2xhc3MgPSBlcC5yZXNvbHZlKCkKICAgICAgICAgICAgICAgIHNlbGYuY21kY2xhc3NbZXAubmFtZV0gPSBjbWRjbGFzcwogICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLmdldF9jb21tYW5kX2xpc3Qoc2VsZikKCiAgICBkZWYgX3NldF9mZWF0dXJlKHNlbGYsIG5hbWUsIHN0YXR1cyk6CiAgICAgICAgIiIiU2V0IGZlYXR1cmUncyBpbmNsdXNpb24gc3RhdHVzIiIiCiAgICAgICAgc2V0YXR0cihzZWxmLCBzZWxmLl9mZWF0dXJlX2F0dHJuYW1lKG5hbWUpLCBzdGF0dXMpCgogICAgZGVmIGZlYXR1cmVfaXNfaW5jbHVkZWQoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIDEgaWYgZmVhdHVyZSBpcyBpbmNsdWRlZCwgMCBpZiBleGNsdWRlZCwgJ05vbmUnIGlmIHVua25vd24iIiIKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBzZWxmLl9mZWF0dXJlX2F0dHJuYW1lKG5hbWUpKQoKICAgIGRlZiBpbmNsdWRlX2ZlYXR1cmUoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiUmVxdWVzdCBpbmNsdXNpb24gb2YgZmVhdHVyZSBuYW1lZCAnbmFtZSciIiIKCiAgICAgICAgaWYgc2VsZi5mZWF0dXJlX2lzX2luY2x1ZGVkKG5hbWUpID09IDA6CiAgICAgICAgICAgIGRlc2NyID0gc2VsZi5mZWF0dXJlc1tuYW1lXS5kZXNjcmlwdGlvbgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgIGRlc2NyICsgIiBpcyByZXF1aXJlZCwgYnV0IHdhcyBleGNsdWRlZCBvciBpcyBub3QgYXZhaWxhYmxlIgogICAgICAgICAgICApCiAgICAgICAgc2VsZi5mZWF0dXJlc1tuYW1lXS5pbmNsdWRlX2luKHNlbGYpCiAgICAgICAgc2VsZi5fc2V0X2ZlYXR1cmUobmFtZSwgMSkKCiAgICBkZWYgaW5jbHVkZShzZWxmLCAqKmF0dHJzKToKICAgICAgICAiIiJBZGQgaXRlbXMgdG8gZGlzdHJpYnV0aW9uIHRoYXQgYXJlIG5hbWVkIGluIGtleXdvcmQgYXJndW1lbnRzCgogICAgICAgIEZvciBleGFtcGxlLCAnZGlzdC5leGNsdWRlKHB5X21vZHVsZXM9WyJ4Il0pJyB3b3VsZCBhZGQgJ3gnIHRvCiAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbidzICdweV9tb2R1bGVzJyBhdHRyaWJ1dGUsIGlmIGl0IHdhcyBub3QgYWxyZWFkeQogICAgICAgIHRoZXJlLgoKICAgICAgICBDdXJyZW50bHksIHRoaXMgbWV0aG9kIG9ubHkgc3VwcG9ydHMgaW5jbHVzaW9uIGZvciBhdHRyaWJ1dGVzIHRoYXQgYXJlCiAgICAgICAgbGlzdHMgb3IgdHVwbGVzLiAgSWYgeW91IG5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yIGFkZGluZyB0byBvdGhlcgogICAgICAgIGF0dHJpYnV0ZXMgaW4gdGhpcyBvciBhIHN1YmNsYXNzLCB5b3UgY2FuIGFkZCBhbiAnX2luY2x1ZGVfWCcgbWV0aG9kLAogICAgICAgIHdoZXJlICdYJyBpcyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiAgVGhlIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoCiAgICAgICAgdGhlIHZhbHVlIHBhc3NlZCB0byAnaW5jbHVkZSgpJy4gIFNvLCAnZGlzdC5pbmNsdWRlKGZvbz17ImJhciI6ImJheiJ9KScKICAgICAgICB3aWxsIHRyeSB0byBjYWxsICdkaXN0Ll9pbmNsdWRlX2Zvbyh7ImJhciI6ImJheiJ9KScsIHdoaWNoIGNhbiB0aGVuCiAgICAgICAgaGFuZGxlIHdoYXRldmVyIHNwZWNpYWwgaW5jbHVzaW9uIGxvZ2ljIGlzIG5lZWRlZC4KICAgICAgICAiIiIKICAgICAgICBmb3IgaywgdiBpbiBhdHRycy5pdGVtcygpOgogICAgICAgICAgICBpbmNsdWRlID0gZ2V0YXR0cihzZWxmLCAnX2luY2x1ZGVfJyArIGssIE5vbmUpCiAgICAgICAgICAgIGlmIGluY2x1ZGU6CiAgICAgICAgICAgICAgICBpbmNsdWRlKHYpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9pbmNsdWRlX21pc2MoaywgdikKCiAgICBkZWYgZXhjbHVkZV9wYWNrYWdlKHNlbGYsIHBhY2thZ2UpOgogICAgICAgICIiIlJlbW92ZSBwYWNrYWdlcywgbW9kdWxlcywgYW5kIGV4dGVuc2lvbnMgaW4gbmFtZWQgcGFja2FnZSIiIgoKICAgICAgICBwZnggPSBwYWNrYWdlICsgJy4nCiAgICAgICAgaWYgc2VsZi5wYWNrYWdlczoKICAgICAgICAgICAgc2VsZi5wYWNrYWdlcyA9IFsKICAgICAgICAgICAgICAgIHAgZm9yIHAgaW4gc2VsZi5wYWNrYWdlcwogICAgICAgICAgICAgICAgaWYgcCAhPSBwYWNrYWdlIGFuZCBub3QgcC5zdGFydHN3aXRoKHBmeCkKICAgICAgICAgICAgXQoKICAgICAgICBpZiBzZWxmLnB5X21vZHVsZXM6CiAgICAgICAgICAgIHNlbGYucHlfbW9kdWxlcyA9IFsKICAgICAgICAgICAgICAgIHAgZm9yIHAgaW4gc2VsZi5weV9tb2R1bGVzCiAgICAgICAgICAgICAgICBpZiBwICE9IHBhY2thZ2UgYW5kIG5vdCBwLnN0YXJ0c3dpdGgocGZ4KQogICAgICAgICAgICBdCgogICAgICAgIGlmIHNlbGYuZXh0X21vZHVsZXM6CiAgICAgICAgICAgIHNlbGYuZXh0X21vZHVsZXMgPSBbCiAgICAgICAgICAgICAgICBwIGZvciBwIGluIHNlbGYuZXh0X21vZHVsZXMKICAgICAgICAgICAgICAgIGlmIHAubmFtZSAhPSBwYWNrYWdlIGFuZCBub3QgcC5uYW1lLnN0YXJ0c3dpdGgocGZ4KQogICAgICAgICAgICBdCgogICAgZGVmIGhhc19jb250ZW50c19mb3Ioc2VsZiwgcGFja2FnZSk6CiAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgJ2V4Y2x1ZGVfcGFja2FnZShwYWNrYWdlKScgd291bGQgZG8gc29tZXRoaW5nIiIiCgogICAgICAgIHBmeCA9IHBhY2thZ2UgKyAnLicKCiAgICAgICAgZm9yIHAgaW4gc2VsZi5pdGVyX2Rpc3RyaWJ1dGlvbl9uYW1lcygpOgogICAgICAgICAgICBpZiBwID09IHBhY2thZ2Ugb3IgcC5zdGFydHN3aXRoKHBmeCk6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfZXhjbHVkZV9taXNjKHNlbGYsIG5hbWUsIHZhbHVlKToKICAgICAgICAiIiJIYW5kbGUgJ2V4Y2x1ZGUoKScgZm9yIGxpc3QvdHVwbGUgYXR0cnMgd2l0aG91dCBhIHNwZWNpYWwgaGFuZGxlciIiIgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBzZXF1ZW5jZSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAiJXM6IHNldHRpbmcgbXVzdCBiZSBhIGxpc3Qgb3IgdHVwbGUgKCVyKSIgJSAobmFtZSwgdmFsdWUpCiAgICAgICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9sZCA9IGdldGF0dHIoc2VsZiwgbmFtZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAiJXM6IE5vIHN1Y2ggZGlzdHJpYnV0aW9uIHNldHRpbmciICUgbmFtZQogICAgICAgICAgICApCiAgICAgICAgaWYgb2xkIGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZShvbGQsIHNlcXVlbmNlKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgIG5hbWUgKyAiOiB0aGlzIHNldHRpbmcgY2Fubm90IGJlIGNoYW5nZWQgdmlhIGluY2x1ZGUvZXhjbHVkZSIKICAgICAgICAgICAgKQogICAgICAgIGVsaWYgb2xkOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIFtpdGVtIGZvciBpdGVtIGluIG9sZCBpZiBpdGVtIG5vdCBpbiB2YWx1ZV0pCgogICAgZGVmIF9pbmNsdWRlX21pc2Moc2VsZiwgbmFtZSwgdmFsdWUpOgogICAgICAgICIiIkhhbmRsZSAnaW5jbHVkZSgpJyBmb3IgbGlzdC90dXBsZSBhdHRycyB3aXRob3V0IGEgc3BlY2lhbCBoYW5kbGVyIiIiCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBzZXF1ZW5jZSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAiJXM6IHNldHRpbmcgbXVzdCBiZSBhIGxpc3QgKCVyKSIgJSAobmFtZSwgdmFsdWUpCiAgICAgICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9sZCA9IGdldGF0dHIoc2VsZiwgbmFtZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAiJXM6IE5vIHN1Y2ggZGlzdHJpYnV0aW9uIHNldHRpbmciICUgbmFtZQogICAgICAgICAgICApCiAgICAgICAgaWYgb2xkIGlzIE5vbmU6CiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgdmFsdWUpCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvbGQsIHNlcXVlbmNlKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgIG5hbWUgKyAiOiB0aGlzIHNldHRpbmcgY2Fubm90IGJlIGNoYW5nZWQgdmlhIGluY2x1ZGUvZXhjbHVkZSIKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5ldyA9IFtpdGVtIGZvciBpdGVtIGluIHZhbHVlIGlmIGl0ZW0gbm90IGluIG9sZF0KICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBvbGQgKyBuZXcpCgogICAgZGVmIGV4Y2x1ZGUoc2VsZiwgKiphdHRycyk6CiAgICAgICAgIiIiUmVtb3ZlIGl0ZW1zIGZyb20gZGlzdHJpYnV0aW9uIHRoYXQgYXJlIG5hbWVkIGluIGtleXdvcmQgYXJndW1lbnRzCgogICAgICAgIEZvciBleGFtcGxlLCAnZGlzdC5leGNsdWRlKHB5X21vZHVsZXM9WyJ4Il0pJyB3b3VsZCByZW1vdmUgJ3gnIGZyb20KICAgICAgICB0aGUgZGlzdHJpYnV0aW9uJ3MgJ3B5X21vZHVsZXMnIGF0dHJpYnV0ZS4gIEV4Y2x1ZGluZyBwYWNrYWdlcyB1c2VzCiAgICAgICAgdGhlICdleGNsdWRlX3BhY2thZ2UoKScgbWV0aG9kLCBzbyBhbGwgb2YgdGhlIHBhY2thZ2UncyBjb250YWluZWQKICAgICAgICBwYWNrYWdlcywgbW9kdWxlcywgYW5kIGV4dGVuc2lvbnMgYXJlIGFsc28gZXhjbHVkZWQuCgogICAgICAgIEN1cnJlbnRseSwgdGhpcyBtZXRob2Qgb25seSBzdXBwb3J0cyBleGNsdXNpb24gZnJvbSBhdHRyaWJ1dGVzIHRoYXQgYXJlCiAgICAgICAgbGlzdHMgb3IgdHVwbGVzLiAgSWYgeW91IG5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yIGV4Y2x1ZGluZyBmcm9tIG90aGVyCiAgICAgICAgYXR0cmlidXRlcyBpbiB0aGlzIG9yIGEgc3ViY2xhc3MsIHlvdSBjYW4gYWRkIGFuICdfZXhjbHVkZV9YJyBtZXRob2QsCiAgICAgICAgd2hlcmUgJ1gnIGlzIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICBUaGUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdpdGgKICAgICAgICB0aGUgdmFsdWUgcGFzc2VkIHRvICdleGNsdWRlKCknLiAgU28sICdkaXN0LmV4Y2x1ZGUoZm9vPXsiYmFyIjoiYmF6In0pJwogICAgICAgIHdpbGwgdHJ5IHRvIGNhbGwgJ2Rpc3QuX2V4Y2x1ZGVfZm9vKHsiYmFyIjoiYmF6In0pJywgd2hpY2ggY2FuIHRoZW4KICAgICAgICBoYW5kbGUgd2hhdGV2ZXIgc3BlY2lhbCBleGNsdXNpb24gbG9naWMgaXMgbmVlZGVkLgogICAgICAgICIiIgogICAgICAgIGZvciBrLCB2IGluIGF0dHJzLml0ZW1zKCk6CiAgICAgICAgICAgIGV4Y2x1ZGUgPSBnZXRhdHRyKHNlbGYsICdfZXhjbHVkZV8nICsgaywgTm9uZSkKICAgICAgICAgICAgaWYgZXhjbHVkZToKICAgICAgICAgICAgICAgIGV4Y2x1ZGUodikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX2V4Y2x1ZGVfbWlzYyhrLCB2KQoKICAgIGRlZiBfZXhjbHVkZV9wYWNrYWdlcyhzZWxmLCBwYWNrYWdlcyk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocGFja2FnZXMsIHNlcXVlbmNlKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICJwYWNrYWdlczogc2V0dGluZyBtdXN0IGJlIGEgbGlzdCBvciB0dXBsZSAoJXIpIiAlIChwYWNrYWdlcywpCiAgICAgICAgICAgICkKICAgICAgICBsaXN0KG1hcChzZWxmLmV4Y2x1ZGVfcGFja2FnZSwgcGFja2FnZXMpKQoKICAgIGRlZiBfcGFyc2VfY29tbWFuZF9vcHRzKHNlbGYsIHBhcnNlciwgYXJncyk6CiAgICAgICAgIyBSZW1vdmUgLS13aXRoLVgvLS13aXRob3V0LVggb3B0aW9ucyB3aGVuIHByb2Nlc3NpbmcgY29tbWFuZCBhcmdzCiAgICAgICAgc2VsZi5nbG9iYWxfb3B0aW9ucyA9IHNlbGYuX19jbGFzc19fLmdsb2JhbF9vcHRpb25zCiAgICAgICAgc2VsZi5uZWdhdGl2ZV9vcHQgPSBzZWxmLl9fY2xhc3NfXy5uZWdhdGl2ZV9vcHQKCiAgICAgICAgIyBGaXJzdCwgZXhwYW5kIGFueSBhbGlhc2VzCiAgICAgICAgY29tbWFuZCA9IGFyZ3NbMF0KICAgICAgICBhbGlhc2VzID0gc2VsZi5nZXRfb3B0aW9uX2RpY3QoJ2FsaWFzZXMnKQogICAgICAgIHdoaWxlIGNvbW1hbmQgaW4gYWxpYXNlczoKICAgICAgICAgICAgc3JjLCBhbGlhcyA9IGFsaWFzZXNbY29tbWFuZF0KICAgICAgICAgICAgZGVsIGFsaWFzZXNbY29tbWFuZF0gICMgZW5zdXJlIGVhY2ggYWxpYXMgY2FuIGV4cGFuZCBvbmx5IG9uY2UhCiAgICAgICAgICAgIGltcG9ydCBzaGxleAogICAgICAgICAgICBhcmdzWzoxXSA9IHNobGV4LnNwbGl0KGFsaWFzLCBUcnVlKQogICAgICAgICAgICBjb21tYW5kID0gYXJnc1swXQoKICAgICAgICBuYXJncyA9IF9EaXN0cmlidXRpb24uX3BhcnNlX2NvbW1hbmRfb3B0cyhzZWxmLCBwYXJzZXIsIGFyZ3MpCgogICAgICAgICMgSGFuZGxlIGNvbW1hbmRzIHRoYXQgd2FudCB0byBjb25zdW1lIGFsbCByZW1haW5pbmcgYXJndW1lbnRzCiAgICAgICAgY21kX2NsYXNzID0gc2VsZi5nZXRfY29tbWFuZF9jbGFzcyhjb21tYW5kKQogICAgICAgIGlmIGdldGF0dHIoY21kX2NsYXNzLCAnY29tbWFuZF9jb25zdW1lc19hcmd1bWVudHMnLCBOb25lKToKICAgICAgICAgICAgc2VsZi5nZXRfb3B0aW9uX2RpY3QoY29tbWFuZClbJ2FyZ3MnXSA9ICgiY29tbWFuZCBsaW5lIiwgbmFyZ3MpCiAgICAgICAgICAgIGlmIG5hcmdzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIHJldHVybiBuYXJncwoKICAgIGRlZiBnZXRfY21kbGluZV9vcHRpb25zKHNlbGYpOgogICAgICAgICIiIlJldHVybiBhICd7Y21kOiB7b3B0OnZhbH19JyBtYXAgb2YgYWxsIGNvbW1hbmQtbGluZSBvcHRpb25zCgogICAgICAgIE9wdGlvbiBuYW1lcyBhcmUgYWxsIGxvbmcsIGJ1dCBkbyBub3QgaW5jbHVkZSB0aGUgbGVhZGluZyAnLS0nLCBhbmQKICAgICAgICBjb250YWluIGRhc2hlcyByYXRoZXIgdGhhbiB1bmRlcnNjb3Jlcy4gIElmIHRoZSBvcHRpb24gZG9lc24ndCB0YWtlCiAgICAgICAgYW4gYXJndW1lbnQgKGUuZy4gJy0tcXVpZXQnKSwgdGhlICd2YWwnIGlzICdOb25lJy4KCiAgICAgICAgTm90ZSB0aGF0IG9wdGlvbnMgcHJvdmlkZWQgYnkgY29uZmlnIGZpbGVzIGFyZSBpbnRlbnRpb25hbGx5IGV4Y2x1ZGVkLgogICAgICAgICIiIgoKICAgICAgICBkID0ge30KCiAgICAgICAgZm9yIGNtZCwgb3B0cyBpbiBzZWxmLmNvbW1hbmRfb3B0aW9ucy5pdGVtcygpOgoKICAgICAgICAgICAgZm9yIG9wdCwgKHNyYywgdmFsKSBpbiBvcHRzLml0ZW1zKCk6CgogICAgICAgICAgICAgICAgaWYgc3JjICE9ICJjb21tYW5kIGxpbmUiOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgb3B0ID0gb3B0LnJlcGxhY2UoJ18nLCAnLScpCgogICAgICAgICAgICAgICAgaWYgdmFsID09IDA6CiAgICAgICAgICAgICAgICAgICAgY21kb2JqID0gc2VsZi5nZXRfY29tbWFuZF9vYmooY21kKQogICAgICAgICAgICAgICAgICAgIG5lZ19vcHQgPSBzZWxmLm5lZ2F0aXZlX29wdC5jb3B5KCkKICAgICAgICAgICAgICAgICAgICBuZWdfb3B0LnVwZGF0ZShnZXRhdHRyKGNtZG9iaiwgJ25lZ2F0aXZlX29wdCcsIHt9KSkKICAgICAgICAgICAgICAgICAgICBmb3IgbmVnLCBwb3MgaW4gbmVnX29wdC5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBwb3MgPT0gb3B0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0ID0gbmVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJTaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgaGVyZSIpCgogICAgICAgICAgICAgICAgZWxpZiB2YWwgPT0gMToKICAgICAgICAgICAgICAgICAgICB2YWwgPSBOb25lCgogICAgICAgICAgICAgICAgZC5zZXRkZWZhdWx0KGNtZCwge30pW29wdF0gPSB2YWwKCiAgICAgICAgcmV0dXJuIGQKCiAgICBkZWYgaXRlcl9kaXN0cmlidXRpb25fbmFtZXMoc2VsZik6CiAgICAgICAgIiIiWWllbGQgYWxsIHBhY2thZ2VzLCBtb2R1bGVzLCBhbmQgZXh0ZW5zaW9uIG5hbWVzIGluIGRpc3RyaWJ1dGlvbiIiIgoKICAgICAgICBmb3IgcGtnIGluIHNlbGYucGFja2FnZXMgb3IgKCk6CiAgICAgICAgICAgIHlpZWxkIHBrZwoKICAgICAgICBmb3IgbW9kdWxlIGluIHNlbGYucHlfbW9kdWxlcyBvciAoKToKICAgICAgICAgICAgeWllbGQgbW9kdWxlCgogICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRfbW9kdWxlcyBvciAoKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsIHR1cGxlKToKICAgICAgICAgICAgICAgIG5hbWUsIGJ1aWxkaW5mbyA9IGV4dAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbmFtZSA9IGV4dC5uYW1lCiAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJ21vZHVsZScpOgogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWVbOi02XQogICAgICAgICAgICB5aWVsZCBuYW1lCgogICAgZGVmIGhhbmRsZV9kaXNwbGF5X29wdGlvbnMoc2VsZiwgb3B0aW9uX29yZGVyKToKICAgICAgICAiIiJJZiB0aGVyZSB3ZXJlIGFueSBub24tZ2xvYmFsICJkaXNwbGF5LW9ubHkiIG9wdGlvbnMKICAgICAgICAoLS1oZWxwLWNvbW1hbmRzIG9yIHRoZSBtZXRhZGF0YSBkaXNwbGF5IG9wdGlvbnMpIG9uIHRoZSBjb21tYW5kCiAgICAgICAgbGluZSwgZGlzcGxheSB0aGUgcmVxdWVzdGVkIGluZm8gYW5kIHJldHVybiB0cnVlOyBlbHNlIHJldHVybgogICAgICAgIGZhbHNlLgogICAgICAgICIiIgogICAgICAgIGltcG9ydCBzeXMKCiAgICAgICAgaWYgc2l4LlBZMiBvciBzZWxmLmhlbHBfY29tbWFuZHM6CiAgICAgICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLmhhbmRsZV9kaXNwbGF5X29wdGlvbnMoc2VsZiwgb3B0aW9uX29yZGVyKQoKICAgICAgICAjIFN0ZG91dCBtYXkgYmUgU3RyaW5nSU8gKGUuZy4gaW4gdGVzdHMpCiAgICAgICAgaW1wb3J0IGlvCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3lzLnN0ZG91dCwgaW8uVGV4dElPV3JhcHBlcik6CiAgICAgICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLmhhbmRsZV9kaXNwbGF5X29wdGlvbnMoc2VsZiwgb3B0aW9uX29yZGVyKQoKICAgICAgICAjIERvbid0IHdyYXAgc3Rkb3V0IGlmIHV0Zi04IGlzIGFscmVhZHkgdGhlIGVuY29kaW5nLiBQcm92aWRlcwogICAgICAgICMgIHdvcmthcm91bmQgZm9yICMzMzQuCiAgICAgICAgaWYgc3lzLnN0ZG91dC5lbmNvZGluZy5sb3dlcigpIGluICgndXRmLTgnLCAndXRmOCcpOgogICAgICAgICAgICByZXR1cm4gX0Rpc3RyaWJ1dGlvbi5oYW5kbGVfZGlzcGxheV9vcHRpb25zKHNlbGYsIG9wdGlvbl9vcmRlcikKCiAgICAgICAgIyBQcmludCBtZXRhZGF0YSBpbiBVVEYtOCBubyBtYXR0ZXIgdGhlIHBsYXRmb3JtCiAgICAgICAgZW5jb2RpbmcgPSBzeXMuc3Rkb3V0LmVuY29kaW5nCiAgICAgICAgZXJyb3JzID0gc3lzLnN0ZG91dC5lcnJvcnMKICAgICAgICBuZXdsaW5lID0gc3lzLnBsYXRmb3JtICE9ICd3aW4zMicgYW5kICdcbicgb3IgTm9uZQogICAgICAgIGxpbmVfYnVmZmVyaW5nID0gc3lzLnN0ZG91dC5saW5lX2J1ZmZlcmluZwoKICAgICAgICBzeXMuc3Rkb3V0ID0gaW8uVGV4dElPV3JhcHBlcigKICAgICAgICAgICAgc3lzLnN0ZG91dC5kZXRhY2goKSwgJ3V0Zi04JywgZXJyb3JzLCBuZXdsaW5lLCBsaW5lX2J1ZmZlcmluZykKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLmhhbmRsZV9kaXNwbGF5X29wdGlvbnMoc2VsZiwgb3B0aW9uX29yZGVyKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBpby5UZXh0SU9XcmFwcGVyKAogICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5kZXRhY2goKSwgZW5jb2RpbmcsIGVycm9ycywgbmV3bGluZSwgbGluZV9idWZmZXJpbmcpCgoKY2xhc3MgRmVhdHVyZToKICAgICIiIgogICAgKipkZXByZWNhdGVkKiogLS0gVGhlIGBGZWF0dXJlYCBmYWNpbGl0eSB3YXMgbmV2ZXIgY29tcGxldGVseSBpbXBsZW1lbnRlZAogICAgb3Igc3VwcG9ydGVkLCBgaGFzIHJlcG9ydGVkIGlzc3VlcwogICAgPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzLzU4PmBfIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4KICAgIGEgZnV0dXJlIHZlcnNpb24uCgogICAgQSBzdWJzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbiB0aGF0IGNhbiBiZSBleGNsdWRlZCBpZiB1bm5lZWRlZC93YW50ZWQKCiAgICBGZWF0dXJlcyBhcmUgY3JlYXRlZCB1c2luZyB0aGVzZSBrZXl3b3JkIGFyZ3VtZW50czoKCiAgICAgICdkZXNjcmlwdGlvbicgLS0gYSBzaG9ydCwgaHVtYW4gcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUsIHRvCiAgICAgICAgIGJlIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMsIGFuZCBvcHRpb24gaGVscCBtZXNzYWdlcy4KCiAgICAgICdzdGFuZGFyZCcgLS0gaWYgdHJ1ZSwgdGhlIGZlYXR1cmUgaXMgaW5jbHVkZWQgYnkgZGVmYXVsdCBpZiBpdCBpcwogICAgICAgICBhdmFpbGFibGUgb24gdGhlIGN1cnJlbnQgc3lzdGVtLiAgT3RoZXJ3aXNlLCB0aGUgZmVhdHVyZSBpcyBvbmx5CiAgICAgICAgIGluY2x1ZGVkIGlmIHJlcXVlc3RlZCB2aWEgYSBjb21tYW5kIGxpbmUgJy0td2l0aC1YJyBvcHRpb24sIG9yIGlmCiAgICAgICAgIGFub3RoZXIgaW5jbHVkZWQgZmVhdHVyZSByZXF1aXJlcyBpdC4gIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgJ0ZhbHNlJy4KCiAgICAgICdhdmFpbGFibGUnIC0tIGlmIHRydWUsIHRoZSBmZWF0dXJlIGlzIGF2YWlsYWJsZSBmb3IgaW5zdGFsbGF0aW9uIG9uIHRoZQogICAgICAgICBjdXJyZW50IHN5c3RlbS4gIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgJ1RydWUnLgoKICAgICAgJ29wdGlvbmFsJyAtLSBpZiB0cnVlLCB0aGUgZmVhdHVyZSdzIGluY2x1c2lvbiBjYW4gYmUgY29udHJvbGxlZCBmcm9tIHRoZQogICAgICAgICBjb21tYW5kIGxpbmUsIHVzaW5nIHRoZSAnLS13aXRoLVgnIG9yICctLXdpdGhvdXQtWCcgb3B0aW9ucy4gIElmCiAgICAgICAgIGZhbHNlLCB0aGUgZmVhdHVyZSdzIGluY2x1c2lvbiBzdGF0dXMgaXMgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5LAogICAgICAgICBiYXNlZCBvbiAnYXZhaWxhYmlsZScsICdzdGFuZGFyZCcsIGFuZCB3aGV0aGVyIGFueSBvdGhlciBmZWF0dXJlCiAgICAgICAgIHJlcXVpcmVzIGl0LiAgVGhlIGRlZmF1bHQgc2V0dGluZyBpcyAnVHJ1ZScuCgogICAgICAncmVxdWlyZV9mZWF0dXJlcycgLS0gYSBzdHJpbmcgb3Igc2VxdWVuY2Ugb2Ygc3RyaW5ncyBuYW1pbmcgZmVhdHVyZXMKICAgICAgICAgdGhhdCBzaG91bGQgYWxzbyBiZSBpbmNsdWRlZCBpZiB0aGlzIGZlYXR1cmUgaXMgaW5jbHVkZWQuICBEZWZhdWx0cyB0bwogICAgICAgICBlbXB0eSBsaXN0LiAgTWF5IGFsc28gY29udGFpbiAnUmVxdWlyZScgb2JqZWN0cyB0aGF0IHNob3VsZCBiZQogICAgICAgICBhZGRlZC9yZW1vdmVkIGZyb20gdGhlIGRpc3RyaWJ1dGlvbi4KCiAgICAgICdyZW1vdmUnIC0tIGEgc3RyaW5nIG9yIGxpc3Qgb2Ygc3RyaW5ncyBuYW1pbmcgcGFja2FnZXMgdG8gYmUgcmVtb3ZlZAogICAgICAgICBmcm9tIHRoZSBkaXN0cmlidXRpb24gaWYgdGhpcyBmZWF0dXJlIGlzICpub3QqIGluY2x1ZGVkLiAgSWYgdGhlCiAgICAgICAgIGZlYXR1cmUgKmlzKiBpbmNsdWRlZCwgdGhpcyBhcmd1bWVudCBpcyBpZ25vcmVkLiAgVGhpcyBhcmd1bWVudCBleGlzdHMKICAgICAgICAgdG8gc3VwcG9ydCByZW1vdmluZyBmZWF0dXJlcyB0aGF0ICJjcm9zc2N1dCIgYSBkaXN0cmlidXRpb24sIHN1Y2ggYXMKICAgICAgICAgZGVmaW5pbmcgYSAndGVzdHMnIGZlYXR1cmUgdGhhdCByZW1vdmVzIGFsbCB0aGUgJ3Rlc3RzJyBzdWJwYWNrYWdlcwogICAgICAgICBwcm92aWRlZCBieSBvdGhlciBmZWF0dXJlcy4gIFRoZSBkZWZhdWx0IGZvciB0aGlzIGFyZ3VtZW50IGlzIGFuIGVtcHR5CiAgICAgICAgIGxpc3QuICAoTm90ZTogdGhlIG5hbWVkIHBhY2thZ2Uocykgb3IgbW9kdWxlcyBtdXN0IGV4aXN0IGluIHRoZSBiYXNlCiAgICAgICAgIGRpc3RyaWJ1dGlvbiB3aGVuIHRoZSAnc2V0dXAoKScgZnVuY3Rpb24gaXMgaW5pdGlhbGx5IGNhbGxlZC4pCgogICAgICBvdGhlciBrZXl3b3JkcyAtLSBhbnkgb3RoZXIga2V5d29yZCBhcmd1bWVudHMgYXJlIHNhdmVkLCBhbmQgcGFzc2VkIHRvCiAgICAgICAgIHRoZSBkaXN0cmlidXRpb24ncyAnaW5jbHVkZSgpJyBhbmQgJ2V4Y2x1ZGUoKScgbWV0aG9kcyB3aGVuIHRoZQogICAgICAgICBmZWF0dXJlIGlzIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkLCByZXNwZWN0aXZlbHkuICBTbywgZm9yIGV4YW1wbGUsIHlvdQogICAgICAgICBjb3VsZCBwYXNzICdwYWNrYWdlcz1bImEiLCJiIl0nIHRvIGNhdXNlIHBhY2thZ2VzICdhJyBhbmQgJ2InIHRvIGJlCiAgICAgICAgIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgZGlzdHJpYnV0aW9uIGFzIGFwcHJvcHJpYXRlLgoKICAgIEEgZmVhdHVyZSBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lICdyZXF1aXJlcycsICdyZW1vdmUnLCBvciBvdGhlcgogICAga2V5d29yZCBhcmd1bWVudC4gIE90aGVyd2lzZSwgaXQgY2FuJ3QgYWZmZWN0IHRoZSBkaXN0cmlidXRpb24gaW4gYW55IHdheS4KICAgIE5vdGUgYWxzbyB0aGF0IHlvdSBjYW4gc3ViY2xhc3MgJ0ZlYXR1cmUnIHRvIGNyZWF0ZSB5b3VyIG93biBzcGVjaWFsaXplZAogICAgZmVhdHVyZSB0eXBlcyB0aGF0IG1vZGlmeSB0aGUgZGlzdHJpYnV0aW9uIGluIG90aGVyIHdheXMgd2hlbiBpbmNsdWRlZCBvcgogICAgZXhjbHVkZWQuICBTZWUgdGhlIGRvY3N0cmluZ3MgZm9yIHRoZSB2YXJpb3VzIG1ldGhvZHMgaGVyZSBmb3IgbW9yZSBkZXRhaWwuCiAgICBBc2lkZSBmcm9tIHRoZSBtZXRob2RzLCB0aGUgb25seSBmZWF0dXJlIGF0dHJpYnV0ZXMgdGhhdCBkaXN0cmlidXRpb25zIGxvb2sKICAgIGF0IGFyZSAnZGVzY3JpcHRpb24nIGFuZCAnb3B0aW9uYWwnLgogICAgIiIiCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHdhcm5fZGVwcmVjYXRlZCgpOgogICAgICAgIG1zZyA9ICgKICAgICAgICAgICAgIkZlYXR1cmVzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgIgogICAgICAgICAgICAidmVyc2lvbi4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzLzY1LiIKICAgICAgICApCiAgICAgICAgd2FybmluZ3Mud2Fybihtc2csIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0zKQoKICAgIGRlZiBfX2luaXRfXygKICAgICAgICAgICAgc2VsZiwgZGVzY3JpcHRpb24sIHN0YW5kYXJkPUZhbHNlLCBhdmFpbGFibGU9VHJ1ZSwKICAgICAgICAgICAgb3B0aW9uYWw9VHJ1ZSwgcmVxdWlyZV9mZWF0dXJlcz0oKSwgcmVtb3ZlPSgpLCAqKmV4dHJhcyk6CiAgICAgICAgc2VsZi53YXJuX2RlcHJlY2F0ZWQoKQoKICAgICAgICBzZWxmLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24KICAgICAgICBzZWxmLnN0YW5kYXJkID0gc3RhbmRhcmQKICAgICAgICBzZWxmLmF2YWlsYWJsZSA9IGF2YWlsYWJsZQogICAgICAgIHNlbGYub3B0aW9uYWwgPSBvcHRpb25hbAogICAgICAgIGlmIGlzaW5zdGFuY2UocmVxdWlyZV9mZWF0dXJlcywgKHN0ciwgUmVxdWlyZSkpOgogICAgICAgICAgICByZXF1aXJlX2ZlYXR1cmVzID0gcmVxdWlyZV9mZWF0dXJlcywKCiAgICAgICAgc2VsZi5yZXF1aXJlX2ZlYXR1cmVzID0gWwogICAgICAgICAgICByIGZvciByIGluIHJlcXVpcmVfZmVhdHVyZXMgaWYgaXNpbnN0YW5jZShyLCBzdHIpCiAgICAgICAgXQogICAgICAgIGVyID0gW3IgZm9yIHIgaW4gcmVxdWlyZV9mZWF0dXJlcyBpZiBub3QgaXNpbnN0YW5jZShyLCBzdHIpXQogICAgICAgIGlmIGVyOgogICAgICAgICAgICBleHRyYXNbJ3JlcXVpcmVfZmVhdHVyZXMnXSA9IGVyCgogICAgICAgIGlmIGlzaW5zdGFuY2UocmVtb3ZlLCBzdHIpOgogICAgICAgICAgICByZW1vdmUgPSByZW1vdmUsCiAgICAgICAgc2VsZi5yZW1vdmUgPSByZW1vdmUKICAgICAgICBzZWxmLmV4dHJhcyA9IGV4dHJhcwoKICAgICAgICBpZiBub3QgcmVtb3ZlIGFuZCBub3QgcmVxdWlyZV9mZWF0dXJlcyBhbmQgbm90IGV4dHJhczoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICJGZWF0dXJlICVzOiBtdXN0IGRlZmluZSAncmVxdWlyZV9mZWF0dXJlcycsICdyZW1vdmUnLCBvciAiCiAgICAgICAgICAgICAgICAiYXQgbGVhc3Qgb25lIG9mICdwYWNrYWdlcycsICdweV9tb2R1bGVzJywgZXRjLiIKICAgICAgICAgICAgKQoKICAgIGRlZiBpbmNsdWRlX2J5X2RlZmF1bHQoc2VsZik6CiAgICAgICAgIiIiU2hvdWxkIHRoaXMgZmVhdHVyZSBiZSBpbmNsdWRlZCBieSBkZWZhdWx0PyIiIgogICAgICAgIHJldHVybiBzZWxmLmF2YWlsYWJsZSBhbmQgc2VsZi5zdGFuZGFyZAoKICAgIGRlZiBpbmNsdWRlX2luKHNlbGYsIGRpc3QpOgogICAgICAgICIiIkVuc3VyZSBmZWF0dXJlIGFuZCBpdHMgcmVxdWlyZW1lbnRzIGFyZSBpbmNsdWRlZCBpbiBkaXN0cmlidXRpb24KCiAgICAgICAgWW91IG1heSBvdmVycmlkZSB0aGlzIGluIGEgc3ViY2xhc3MgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIG9wZXJhdGlvbnMgb24KICAgICAgICB0aGUgZGlzdHJpYnV0aW9uLiAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UKICAgICAgICBwZXIgZmVhdHVyZSwgYW5kIHNvIHNob3VsZCBiZSBpZGVtcG90ZW50LgoKICAgICAgICAiIiIKCiAgICAgICAgaWYgbm90IHNlbGYuYXZhaWxhYmxlOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKAogICAgICAgICAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiArICIgaXMgcmVxdWlyZWQsICIKICAgICAgICAgICAgICAgICJidXQgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtIgogICAgICAgICAgICApCgogICAgICAgIGRpc3QuaW5jbHVkZSgqKnNlbGYuZXh0cmFzKQoKICAgICAgICBmb3IgZiBpbiBzZWxmLnJlcXVpcmVfZmVhdHVyZXM6CiAgICAgICAgICAgIGRpc3QuaW5jbHVkZV9mZWF0dXJlKGYpCgogICAgZGVmIGV4Y2x1ZGVfZnJvbShzZWxmLCBkaXN0KToKICAgICAgICAiIiJFbnN1cmUgZmVhdHVyZSBpcyBleGNsdWRlZCBmcm9tIGRpc3RyaWJ1dGlvbgoKICAgICAgICBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgaW4gYSBzdWJjbGFzcyB0byBwZXJmb3JtIGFkZGl0aW9uYWwgb3BlcmF0aW9ucyBvbgogICAgICAgIHRoZSBkaXN0cmlidXRpb24uICBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UgcGVyCiAgICAgICAgZmVhdHVyZSwgYW5kIG9ubHkgYWZ0ZXIgYWxsIGluY2x1ZGVkIGZlYXR1cmVzIGhhdmUgYmVlbiBhc2tlZCB0bwogICAgICAgIGluY2x1ZGUgdGhlbXNlbHZlcy4KICAgICAgICAiIiIKCiAgICAgICAgZGlzdC5leGNsdWRlKCoqc2VsZi5leHRyYXMpCgogICAgICAgIGlmIHNlbGYucmVtb3ZlOgogICAgICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLnJlbW92ZToKICAgICAgICAgICAgICAgIGRpc3QuZXhjbHVkZV9wYWNrYWdlKGl0ZW0pCgogICAgZGVmIHZhbGlkYXRlKHNlbGYsIGRpc3QpOgogICAgICAgICIiIlZlcmlmeSB0aGF0IGZlYXR1cmUgbWFrZXMgc2Vuc2UgaW4gY29udGV4dCBvZiBkaXN0cmlidXRpb24KCiAgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBkaXN0cmlidXRpb24ganVzdCBiZWZvcmUgaXQgcGFyc2VzIGl0cwogICAgICAgIGNvbW1hbmQgbGluZS4gIEl0IGNoZWNrcyB0byBlbnN1cmUgdGhhdCB0aGUgJ3JlbW92ZScgYXR0cmlidXRlLCBpZiBhbnksCiAgICAgICAgY29udGFpbnMgb25seSB2YWxpZCBwYWNrYWdlL21vZHVsZSBuYW1lcyB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSBiYXNlCiAgICAgICAgZGlzdHJpYnV0aW9uIHdoZW4gJ3NldHVwKCknIGlzIGNhbGxlZC4gIFlvdSBtYXkgb3ZlcnJpZGUgaXQgaW4gYQogICAgICAgIHN1YmNsYXNzIHRvIHBlcmZvcm0gYW55IG90aGVyIHJlcXVpcmVkIHZhbGlkYXRpb24gb2YgdGhlIGZlYXR1cmUKICAgICAgICBhZ2FpbnN0IGEgdGFyZ2V0IGRpc3RyaWJ1dGlvbi4KICAgICAgICAiIiIKCiAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5yZW1vdmU6CiAgICAgICAgICAgIGlmIG5vdCBkaXN0Lmhhc19jb250ZW50c19mb3IoaXRlbSk6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgICAgICIlcyB3YW50cyB0byBiZSBhYmxlIHRvIHJlbW92ZSAlcywgYnV0IHRoZSBkaXN0cmlidXRpb24iCiAgICAgICAgICAgICAgICAgICAgIiBkb2Vzbid0IGNvbnRhaW4gYW55IHBhY2thZ2VzIG9yIG1vZHVsZXMgdW5kZXIgJXMiCiAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi5kZXNjcmlwdGlvbiwgaXRlbSwgaXRlbSkKICAgICAgICAgICAgICAgICkKUEsDBBQAAAAAAAAAIQC5qpHuwQYAAMEGAAAvAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9leHRlbnNpb24ucHlpbXBvcnQgcmUKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgZGlzdHV0aWxzLmNvcmUKaW1wb3J0IGRpc3R1dGlscy5lcnJvcnMKaW1wb3J0IGRpc3R1dGlscy5leHRlbnNpb24KCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAKCmZyb20gLm1vbmtleSBpbXBvcnQgZ2V0X3VucGF0Y2hlZAoKCmRlZiBfaGF2ZV9jeXRob24oKToKICAgICIiIgogICAgUmV0dXJuIFRydWUgaWYgQ3l0aG9uIGNhbiBiZSBpbXBvcnRlZC4KICAgICIiIgogICAgY3l0aG9uX2ltcGwgPSAnQ3l0aG9uLkRpc3R1dGlscy5idWlsZF9leHQnCiAgICB0cnk6CiAgICAgICAgIyBmcm9tIChjeXRob25faW1wbCkgaW1wb3J0IGJ1aWxkX2V4dAogICAgICAgIF9faW1wb3J0X18oY3l0aG9uX2ltcGwsIGZyb21saXN0PVsnYnVpbGRfZXh0J10pLmJ1aWxkX2V4dAogICAgICAgIHJldHVybiBUcnVlCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHBhc3MKICAgIHJldHVybiBGYWxzZQoKCiMgZm9yIGNvbXBhdGliaWxpdHkKaGF2ZV9weXJleCA9IF9oYXZlX2N5dGhvbgoKX0V4dGVuc2lvbiA9IGdldF91bnBhdGNoZWQoZGlzdHV0aWxzLmNvcmUuRXh0ZW5zaW9uKQoKCmNsYXNzIEV4dGVuc2lvbihfRXh0ZW5zaW9uKToKICAgICIiIkV4dGVuc2lvbiB0aGF0IHVzZXMgJy5jJyBmaWxlcyBpbiBwbGFjZSBvZiAnLnB5eCcgZmlsZXMiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgc291cmNlcywgKmFyZ3MsICoqa3cpOgogICAgICAgICMgVGhlICphcmdzIGlzIG5lZWRlZCBmb3IgY29tcGF0aWJpbGl0eSBhcyBjYWxscyBtYXkgdXNlIHBvc2l0aW9uYWwKICAgICAgICAjIGFyZ3VtZW50cy4gcHlfbGltaXRlZF9hcGkgbWF5IGJlIHNldCBvbmx5IHZpYSBrZXl3b3JkLgogICAgICAgIHNlbGYucHlfbGltaXRlZF9hcGkgPSBrdy5wb3AoInB5X2xpbWl0ZWRfYXBpIiwgRmFsc2UpCiAgICAgICAgX0V4dGVuc2lvbi5fX2luaXRfXyhzZWxmLCBuYW1lLCBzb3VyY2VzLCAqYXJncywgKiprdykKCiAgICBkZWYgX2NvbnZlcnRfcHl4X3NvdXJjZXNfdG9fbGFuZyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXBsYWNlIHNvdXJjZXMgd2l0aCAucHl4IGV4dGVuc2lvbnMgdG8gc291cmNlcyB3aXRoIHRoZSB0YXJnZXQKICAgICAgICBsYW5ndWFnZSBleHRlbnNpb24uIFRoaXMgbWVjaGFuaXNtIGFsbG93cyBsYW5ndWFnZSBhdXRob3JzIHRvIHN1cHBseQogICAgICAgIHByZS1jb252ZXJ0ZWQgc291cmNlcyBidXQgdG8gcHJlZmVyIHRoZSAucHl4IHNvdXJjZXMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgX2hhdmVfY3l0aG9uKCk6CiAgICAgICAgICAgICMgdGhlIGJ1aWxkIGhhcyBDeXRob24sIHNvIGFsbG93IGl0IHRvIGNvbXBpbGUgdGhlIC5weXggZmlsZXMKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbGFuZyA9IHNlbGYubGFuZ3VhZ2Ugb3IgJycKICAgICAgICB0YXJnZXRfZXh0ID0gJy5jcHAnIGlmIGxhbmcubG93ZXIoKSA9PSAnYysrJyBlbHNlICcuYycKICAgICAgICBzdWIgPSBmdW5jdG9vbHMucGFydGlhbChyZS5zdWIsICcucHl4JCcsIHRhcmdldF9leHQpCiAgICAgICAgc2VsZi5zb3VyY2VzID0gbGlzdChtYXAoc3ViLCBzZWxmLnNvdXJjZXMpKQoKCmNsYXNzIExpYnJhcnkoRXh0ZW5zaW9uKToKICAgICIiIkp1c3QgbGlrZSBhIHJlZ3VsYXIgRXh0ZW5zaW9uLCBidXQgYnVpbHQgYXMgYSBsaWJyYXJ5IGluc3RlYWQiIiIKUEsDBBQAAAAAAAAAIQDQintlgwAAAIMAAAA1AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9leHRlcm4vX19pbml0X18ucHlmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuIGltcG9ydCBWZW5kb3JJbXBvcnRlcgoKbmFtZXMgPSAnc2l4JywKVmVuZG9ySW1wb3J0ZXIoX19uYW1lX18sIG5hbWVzLCAncGtnX3Jlc291cmNlcy5fdmVuZG9yJykuaW5zdGFsbCgpClBLAwQUAAAAAAAAACEABOrBvUoMAABKDAAAKwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZ2xpYmMucHkjIFRoaXMgZmlsZSBvcmlnaW5hbGx5IGZyb20gcGlwOgojIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9ibG9iLzhmNGYxNWE1YTk1ZDdkNWI1MTFjZWFlZTllZDI2MTE3NmMxODE5NzAvc3JjL3BpcC9faW50ZXJuYWwvdXRpbHMvZ2xpYmMucHkKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBjdHlwZXMKaW1wb3J0IHJlCmltcG9ydCB3YXJuaW5ncwoKCmRlZiBnbGliY192ZXJzaW9uX3N0cmluZygpOgogICAgIlJldHVybnMgZ2xpYmMgdmVyc2lvbiBzdHJpbmcsIG9yIE5vbmUgaWYgbm90IHVzaW5nIGdsaWJjLiIKCiAgICAjIGN0eXBlcy5DRExMKE5vbmUpIGludGVybmFsbHkgY2FsbHMgZGxvcGVuKE5VTEwpLCBhbmQgYXMgdGhlIGRsb3BlbgogICAgIyBtYW5wYWdlIHNheXMsICJJZiBmaWxlbmFtZSBpcyBOVUxMLCB0aGVuIHRoZSByZXR1cm5lZCBoYW5kbGUgaXMgZm9yIHRoZQogICAgIyBtYWluIHByb2dyYW0iLiBUaGlzIHdheSB3ZSBjYW4gbGV0IHRoZSBsaW5rZXIgZG8gdGhlIHdvcmsgdG8gZmlndXJlIG91dAogICAgIyB3aGljaCBsaWJjIG91ciBwcm9jZXNzIGlzIGFjdHVhbGx5IHVzaW5nLgogICAgcHJvY2Vzc19uYW1lc3BhY2UgPSBjdHlwZXMuQ0RMTChOb25lKQogICAgdHJ5OgogICAgICAgIGdudV9nZXRfbGliY192ZXJzaW9uID0gcHJvY2Vzc19uYW1lc3BhY2UuZ251X2dldF9saWJjX3ZlcnNpb24KICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAjIFN5bWJvbCBkb2Vzbid0IGV4aXN0IC0+IHRoZXJlZm9yZSwgd2UgYXJlIG5vdCBsaW5rZWQgdG8KICAgICAgICAjIGdsaWJjLgogICAgICAgIHJldHVybiBOb25lCgogICAgIyBDYWxsIGdudV9nZXRfbGliY192ZXJzaW9uLCB3aGljaCByZXR1cm5zIGEgc3RyaW5nIGxpa2UgIjIuNSIKICAgIGdudV9nZXRfbGliY192ZXJzaW9uLnJlc3R5cGUgPSBjdHlwZXMuY19jaGFyX3AKICAgIHZlcnNpb25fc3RyID0gZ251X2dldF9saWJjX3ZlcnNpb24oKQogICAgIyBweTIgLyBweTMgY29tcGF0aWJpbGl0eToKICAgIGlmIG5vdCBpc2luc3RhbmNlKHZlcnNpb25fc3RyLCBzdHIpOgogICAgICAgIHZlcnNpb25fc3RyID0gdmVyc2lvbl9zdHIuZGVjb2RlKCJhc2NpaSIpCgogICAgcmV0dXJuIHZlcnNpb25fc3RyCgoKIyBTZXBhcmF0ZWQgb3V0IGZyb20gaGF2ZV9jb21wYXRpYmxlX2dsaWJjIGZvciBlYXNpZXIgdW5pdCB0ZXN0aW5nCmRlZiBjaGVja19nbGliY192ZXJzaW9uKHZlcnNpb25fc3RyLCByZXF1aXJlZF9tYWpvciwgbWluaW11bV9taW5vcik6CiAgICAjIFBhcnNlIHN0cmluZyBhbmQgY2hlY2sgYWdhaW5zdCByZXF1ZXN0ZWQgdmVyc2lvbi4KICAgICMKICAgICMgV2UgdXNlIGEgcmVnZXhwIGluc3RlYWQgb2Ygc3RyLnNwbGl0IGJlY2F1c2Ugd2Ugd2FudCB0byBkaXNjYXJkIGFueQogICAgIyByYW5kb20ganVuayB0aGF0IG1pZ2h0IGNvbWUgYWZ0ZXIgdGhlIG1pbm9yIHZlcnNpb24gLS0gdGhpcyBtaWdodCBoYXBwZW4KICAgICMgaW4gcGF0Y2hlZC9mb3JrZWQgdmVyc2lvbnMgb2YgZ2xpYmMgKGUuZy4gTGluYXJvJ3MgdmVyc2lvbiBvZiBnbGliYwogICAgIyB1c2VzIHZlcnNpb24gc3RyaW5ncyBsaWtlICIyLjIwLTIwMTQuMTEiKS4gU2VlIGdoLTM1ODguCiAgICBtID0gcmUubWF0Y2gociIoP1A8bWFqb3I+WzAtOV0rKVwuKD9QPG1pbm9yPlswLTldKykiLCB2ZXJzaW9uX3N0cikKICAgIGlmIG5vdCBtOgogICAgICAgIHdhcm5pbmdzLndhcm4oIkV4cGVjdGVkIGdsaWJjIHZlcnNpb24gd2l0aCAyIGNvbXBvbmVudHMgbWFqb3IubWlub3IsIgogICAgICAgICAgICAgICAgICAgICAgIiBnb3Q6ICVzIiAlIHZlcnNpb25fc3RyLCBSdW50aW1lV2FybmluZykKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiAoaW50KG0uZ3JvdXAoIm1ham9yIikpID09IHJlcXVpcmVkX21ham9yIGFuZAogICAgICAgICAgICBpbnQobS5ncm91cCgibWlub3IiKSkgPj0gbWluaW11bV9taW5vcikKCgpkZWYgaGF2ZV9jb21wYXRpYmxlX2dsaWJjKHJlcXVpcmVkX21ham9yLCBtaW5pbXVtX21pbm9yKToKICAgIHZlcnNpb25fc3RyID0gZ2xpYmNfdmVyc2lvbl9zdHJpbmcoKQogICAgaWYgdmVyc2lvbl9zdHIgaXMgTm9uZToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiBjaGVja19nbGliY192ZXJzaW9uKHZlcnNpb25fc3RyLCByZXF1aXJlZF9tYWpvciwgbWluaW11bV9taW5vcikKCgojIHBsYXRmb3JtLmxpYmNfdmVyIHJlZ3VsYXJseSByZXR1cm5zIGNvbXBsZXRlbHkgbm9uc2Vuc2ljYWwgZ2xpYmMKIyB2ZXJzaW9ucy4gRS5nLiBvbiBteSBjb21wdXRlciwgcGxhdGZvcm0gc2F5czoKIwojICAgfiQgcHl0aG9uMi43IC1jICdpbXBvcnQgcGxhdGZvcm07IHByaW50KHBsYXRmb3JtLmxpYmNfdmVyKCkpJwojICAgKCdnbGliYycsICcyLjcnKQojICAgfiQgcHl0aG9uMy41IC1jICdpbXBvcnQgcGxhdGZvcm07IHByaW50KHBsYXRmb3JtLmxpYmNfdmVyKCkpJwojICAgKCdnbGliYycsICcyLjknKQojCiMgQnV0IHRoZSB0cnV0aCBpczoKIwojICAgfiQgbGRkIC0tdmVyc2lvbgojICAgbGRkIChEZWJpYW4gR0xJQkMgMi4yMi0xMSkgMi4yMgojCiMgVGhpcyBpcyB1bmZvcnR1bmF0ZSwgYmVjYXVzZSBpdCBtZWFucyB0aGF0IHRoZSBsaW5laGF1bCBkYXRhIG9uIGxpYmMKIyB2ZXJzaW9ucyB0aGF0IHdhcyBnZW5lcmF0ZWQgYnkgcGlwIDguMS4yIGFuZCBlYXJsaWVyIGlzIHVzZWxlc3MgYW5kCiMgbWlzbGVhZGluZy4gU29sdXRpb246IGluc3RlYWQgb2YgdXNpbmcgcGxhdGZvcm0sIHVzZSBvdXIgY29kZSB0aGF0IGFjdHVhbGx5CiMgd29ya3MuCmRlZiBsaWJjX3ZlcigpOgogICAgIiIiVHJ5IHRvIGRldGVybWluZSB0aGUgZ2xpYmMgdmVyc2lvbgoKICAgIFJldHVybnMgYSB0dXBsZSBvZiBzdHJpbmdzIChsaWIsIHZlcnNpb24pIHdoaWNoIGRlZmF1bHQgdG8gZW1wdHkgc3RyaW5ncwogICAgaW4gY2FzZSB0aGUgbG9va3VwIGZhaWxzLgogICAgIiIiCiAgICBnbGliY192ZXJzaW9uID0gZ2xpYmNfdmVyc2lvbl9zdHJpbmcoKQogICAgaWYgZ2xpYmNfdmVyc2lvbiBpcyBOb25lOgogICAgICAgIHJldHVybiAoIiIsICIiKQogICAgZWxzZToKICAgICAgICByZXR1cm4gKCJnbGliYyIsIGdsaWJjX3ZlcnNpb24pClBLAwQUAAAAAAAAACEAvF2hOVcUAABXFAAAKgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZ2xvYi5weSIiIgpGaWxlbmFtZSBnbG9iYmluZyB1dGlsaXR5LiBNb3N0bHkgYSBjb3B5IG9mIGBnbG9iYCBmcm9tIFB5dGhvbiAzLjUuCgpDaGFuZ2VzIGluY2x1ZGU6CiAqIGB5aWVsZCBmcm9tYCBhbmQgUEVQMzEwMiBgKmAgcmVtb3ZlZC4KICogYGJ5dGVzYCBjaGFuZ2VkIHRvIGBzaXguYmluYXJ5X3R5cGVgLgogKiBIaWRkZW4gZmlsZXMgYXJlIG5vdCBpZ25vcmVkLgoiIiIKCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IGZubWF0Y2gKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXggaW1wb3J0IGJpbmFyeV90eXBlCgpfX2FsbF9fID0gWyJnbG9iIiwgImlnbG9iIiwgImVzY2FwZSJdCgoKZGVmIGdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZT1GYWxzZSk6CiAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHBhdGhzIG1hdGNoaW5nIGEgcGF0aG5hbWUgcGF0dGVybi4KCiAgICBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBzaW1wbGUgc2hlbGwtc3R5bGUgd2lsZGNhcmRzIGEgbGEKICAgIGZubWF0Y2guIEhvd2V2ZXIsIHVubGlrZSBmbm1hdGNoLCBmaWxlbmFtZXMgc3RhcnRpbmcgd2l0aCBhCiAgICBkb3QgYXJlIHNwZWNpYWwgY2FzZXMgdGhhdCBhcmUgbm90IG1hdGNoZWQgYnkgJyonIGFuZCAnPycKICAgIHBhdHRlcm5zLgoKICAgIElmIHJlY3Vyc2l2ZSBpcyB0cnVlLCB0aGUgcGF0dGVybiAnKionIHdpbGwgbWF0Y2ggYW55IGZpbGVzIGFuZAogICAgemVybyBvciBtb3JlIGRpcmVjdG9yaWVzIGFuZCBzdWJkaXJlY3Rvcmllcy4KICAgICIiIgogICAgcmV0dXJuIGxpc3QoaWdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZT1yZWN1cnNpdmUpKQoKCmRlZiBpZ2xvYihwYXRobmFtZSwgcmVjdXJzaXZlPUZhbHNlKToKICAgICIiIlJldHVybiBhbiBpdGVyYXRvciB3aGljaCB5aWVsZHMgdGhlIHBhdGhzIG1hdGNoaW5nIGEgcGF0aG5hbWUgcGF0dGVybi4KCiAgICBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBzaW1wbGUgc2hlbGwtc3R5bGUgd2lsZGNhcmRzIGEgbGEKICAgIGZubWF0Y2guIEhvd2V2ZXIsIHVubGlrZSBmbm1hdGNoLCBmaWxlbmFtZXMgc3RhcnRpbmcgd2l0aCBhCiAgICBkb3QgYXJlIHNwZWNpYWwgY2FzZXMgdGhhdCBhcmUgbm90IG1hdGNoZWQgYnkgJyonIGFuZCAnPycKICAgIHBhdHRlcm5zLgoKICAgIElmIHJlY3Vyc2l2ZSBpcyB0cnVlLCB0aGUgcGF0dGVybiAnKionIHdpbGwgbWF0Y2ggYW55IGZpbGVzIGFuZAogICAgemVybyBvciBtb3JlIGRpcmVjdG9yaWVzIGFuZCBzdWJkaXJlY3Rvcmllcy4KICAgICIiIgogICAgaXQgPSBfaWdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZSkKICAgIGlmIHJlY3Vyc2l2ZSBhbmQgX2lzcmVjdXJzaXZlKHBhdGhuYW1lKToKICAgICAgICBzID0gbmV4dChpdCkgICMgc2tpcCBlbXB0eSBzdHJpbmcKICAgICAgICBhc3NlcnQgbm90IHMKICAgIHJldHVybiBpdAoKCmRlZiBfaWdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZSk6CiAgICBkaXJuYW1lLCBiYXNlbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aG5hbWUpCiAgICBpZiBub3QgaGFzX21hZ2ljKHBhdGhuYW1lKToKICAgICAgICBpZiBiYXNlbmFtZToKICAgICAgICAgICAgaWYgb3MucGF0aC5sZXhpc3RzKHBhdGhuYW1lKToKICAgICAgICAgICAgICAgIHlpZWxkIHBhdGhuYW1lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBQYXR0ZXJucyBlbmRpbmcgd2l0aCBhIHNsYXNoIHNob3VsZCBtYXRjaCBvbmx5IGRpcmVjdG9yaWVzCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlybmFtZSk6CiAgICAgICAgICAgICAgICB5aWVsZCBwYXRobmFtZQogICAgICAgIHJldHVybgogICAgaWYgbm90IGRpcm5hbWU6CiAgICAgICAgaWYgcmVjdXJzaXZlIGFuZCBfaXNyZWN1cnNpdmUoYmFzZW5hbWUpOgogICAgICAgICAgICBmb3IgeCBpbiBnbG9iMihkaXJuYW1lLCBiYXNlbmFtZSk6CiAgICAgICAgICAgICAgICB5aWVsZCB4CiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm9yIHggaW4gZ2xvYjEoZGlybmFtZSwgYmFzZW5hbWUpOgogICAgICAgICAgICAgICAgeWllbGQgeAogICAgICAgIHJldHVybgogICAgIyBgb3MucGF0aC5zcGxpdCgpYCByZXR1cm5zIHRoZSBhcmd1bWVudCBpdHNlbGYgYXMgYSBkaXJuYW1lIGlmIGl0IGlzIGEKICAgICMgZHJpdmUgb3IgVU5DIHBhdGguICBQcmV2ZW50IGFuIGluZmluaXRlIHJlY3Vyc2lvbiBpZiBhIGRyaXZlIG9yIFVOQyBwYXRoCiAgICAjIGNvbnRhaW5zIG1hZ2ljIGNoYXJhY3RlcnMgKGkuZS4gcidcXD9cQzonKS4KICAgIGlmIGRpcm5hbWUgIT0gcGF0aG5hbWUgYW5kIGhhc19tYWdpYyhkaXJuYW1lKToKICAgICAgICBkaXJzID0gX2lnbG9iKGRpcm5hbWUsIHJlY3Vyc2l2ZSkKICAgIGVsc2U6CiAgICAgICAgZGlycyA9IFtkaXJuYW1lXQogICAgaWYgaGFzX21hZ2ljKGJhc2VuYW1lKToKICAgICAgICBpZiByZWN1cnNpdmUgYW5kIF9pc3JlY3Vyc2l2ZShiYXNlbmFtZSk6CiAgICAgICAgICAgIGdsb2JfaW5fZGlyID0gZ2xvYjIKICAgICAgICBlbHNlOgogICAgICAgICAgICBnbG9iX2luX2RpciA9IGdsb2IxCiAgICBlbHNlOgogICAgICAgIGdsb2JfaW5fZGlyID0gZ2xvYjAKICAgIGZvciBkaXJuYW1lIGluIGRpcnM6CiAgICAgICAgZm9yIG5hbWUgaW4gZ2xvYl9pbl9kaXIoZGlybmFtZSwgYmFzZW5hbWUpOgogICAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4oZGlybmFtZSwgbmFtZSkKCgojIFRoZXNlIDIgaGVscGVyIGZ1bmN0aW9ucyBub24tcmVjdXJzaXZlbHkgZ2xvYiBpbnNpZGUgYSBsaXRlcmFsIGRpcmVjdG9yeS4KIyBUaGV5IHJldHVybiBhIGxpc3Qgb2YgYmFzZW5hbWVzLiBgZ2xvYjFgIGFjY2VwdHMgYSBwYXR0ZXJuIHdoaWxlIGBnbG9iMGAKIyB0YWtlcyBhIGxpdGVyYWwgYmFzZW5hbWUgKHNvIGl0IG9ubHkgaGFzIHRvIGNoZWNrIGZvciBpdHMgZXhpc3RlbmNlKS4KCgpkZWYgZ2xvYjEoZGlybmFtZSwgcGF0dGVybik6CiAgICBpZiBub3QgZGlybmFtZToKICAgICAgICBpZiBpc2luc3RhbmNlKHBhdHRlcm4sIGJpbmFyeV90eXBlKToKICAgICAgICAgICAgZGlybmFtZSA9IG9zLmN1cmRpci5lbmNvZGUoJ0FTQ0lJJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBkaXJuYW1lID0gb3MuY3VyZGlyCiAgICB0cnk6CiAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCiAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICByZXR1cm4gW10KICAgIHJldHVybiBmbm1hdGNoLmZpbHRlcihuYW1lcywgcGF0dGVybikKCgpkZWYgZ2xvYjAoZGlybmFtZSwgYmFzZW5hbWUpOgogICAgaWYgbm90IGJhc2VuYW1lOgogICAgICAgICMgYG9zLnBhdGguc3BsaXQoKWAgcmV0dXJucyBhbiBlbXB0eSBiYXNlbmFtZSBmb3IgcGF0aHMgZW5kaW5nIHdpdGggYQogICAgICAgICMgZGlyZWN0b3J5IHNlcGFyYXRvci4gICdxKngvJyBzaG91bGQgbWF0Y2ggb25seSBkaXJlY3Rvcmllcy4KICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgogICAgICAgICAgICByZXR1cm4gW2Jhc2VuYW1lXQogICAgZWxzZToKICAgICAgICBpZiBvcy5wYXRoLmxleGlzdHMob3MucGF0aC5qb2luKGRpcm5hbWUsIGJhc2VuYW1lKSk6CiAgICAgICAgICAgIHJldHVybiBbYmFzZW5hbWVdCiAgICByZXR1cm4gW10KCgojIFRoaXMgaGVscGVyIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5IHlpZWxkcyByZWxhdGl2ZSBwYXRobmFtZXMgaW5zaWRlIGEgbGl0ZXJhbAojIGRpcmVjdG9yeS4KCgpkZWYgZ2xvYjIoZGlybmFtZSwgcGF0dGVybik6CiAgICBhc3NlcnQgX2lzcmVjdXJzaXZlKHBhdHRlcm4pCiAgICB5aWVsZCBwYXR0ZXJuWzowXQogICAgZm9yIHggaW4gX3JsaXN0ZGlyKGRpcm5hbWUpOgogICAgICAgIHlpZWxkIHgKCgojIFJlY3Vyc2l2ZWx5IHlpZWxkcyByZWxhdGl2ZSBwYXRobmFtZXMgaW5zaWRlIGEgbGl0ZXJhbCBkaXJlY3RvcnkuCmRlZiBfcmxpc3RkaXIoZGlybmFtZSk6CiAgICBpZiBub3QgZGlybmFtZToKICAgICAgICBpZiBpc2luc3RhbmNlKGRpcm5hbWUsIGJpbmFyeV90eXBlKToKICAgICAgICAgICAgZGlybmFtZSA9IGJpbmFyeV90eXBlKG9zLmN1cmRpciwgJ0FTQ0lJJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBkaXJuYW1lID0gb3MuY3VyZGlyCiAgICB0cnk6CiAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCiAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgcmV0dXJuCiAgICBmb3IgeCBpbiBuYW1lczoKICAgICAgICB5aWVsZCB4CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihkaXJuYW1lLCB4KSBpZiBkaXJuYW1lIGVsc2UgeAogICAgICAgIGZvciB5IGluIF9ybGlzdGRpcihwYXRoKToKICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHgsIHkpCgoKbWFnaWNfY2hlY2sgPSByZS5jb21waWxlKCcoWyo/W10pJykKbWFnaWNfY2hlY2tfYnl0ZXMgPSByZS5jb21waWxlKGInKFsqP1tdKScpCgoKZGVmIGhhc19tYWdpYyhzKToKICAgIGlmIGlzaW5zdGFuY2UocywgYmluYXJ5X3R5cGUpOgogICAgICAgIG1hdGNoID0gbWFnaWNfY2hlY2tfYnl0ZXMuc2VhcmNoKHMpCiAgICBlbHNlOgogICAgICAgIG1hdGNoID0gbWFnaWNfY2hlY2suc2VhcmNoKHMpCiAgICByZXR1cm4gbWF0Y2ggaXMgbm90IE5vbmUKCgpkZWYgX2lzcmVjdXJzaXZlKHBhdHRlcm4pOgogICAgaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBiaW5hcnlfdHlwZSk6CiAgICAgICAgcmV0dXJuIHBhdHRlcm4gPT0gYicqKicKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHBhdHRlcm4gPT0gJyoqJwoKCmRlZiBlc2NhcGUocGF0aG5hbWUpOgogICAgIiIiRXNjYXBlIGFsbCBzcGVjaWFsIGNoYXJhY3RlcnMuCiAgICAiIiIKICAgICMgRXNjYXBpbmcgaXMgZG9uZSBieSB3cmFwcGluZyBhbnkgb2YgIio/WyIgYmV0d2VlbiBzcXVhcmUgYnJhY2tldHMuCiAgICAjIE1ldGFjaGFyYWN0ZXJzIGRvIG5vdCB3b3JrIGluIHRoZSBkcml2ZSBwYXJ0IGFuZCBzaG91bGRuJ3QgYmUgZXNjYXBlZC4KICAgIGRyaXZlLCBwYXRobmFtZSA9IG9zLnBhdGguc3BsaXRkcml2ZShwYXRobmFtZSkKICAgIGlmIGlzaW5zdGFuY2UocGF0aG5hbWUsIGJpbmFyeV90eXBlKToKICAgICAgICBwYXRobmFtZSA9IG1hZ2ljX2NoZWNrX2J5dGVzLnN1YihicidbXDFdJywgcGF0aG5hbWUpCiAgICBlbHNlOgogICAgICAgIHBhdGhuYW1lID0gbWFnaWNfY2hlY2suc3ViKHInW1wxXScsIHBhdGhuYW1lKQogICAgcmV0dXJuIGRyaXZlICsgcGF0aG5hbWUKUEsDBBQA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0Iu98P3//4PEHIHngAAAAHQgObXo/f//dRiNhaT9//9QU/81ZBxBAOgSIAAAWf/QWVmAve/9//9ndRw7/nUYjYWk/f//UFP/NWAcQQDo7R8AAFn/0FlZgDstdRGBjfD9//8AAQAAQ4md5P3//1PpA/7//8eF6P3//wgAAACJjbj9///rJIPocw+Etvz//0hID4SJ/v//g+gDD4W2AQAAx4W4/f//JwAAAPaF8P3//4DHheD9//8QAAAAD4Rp/v//ioW4/f//BFHGhdT9//8wiIXV/f//x4XQ/f//AgAAAOlF/v//98EAEAAAD4VL/v//g8cE9sEgdBiJvdz9///2wUB0Bg+/R/zrBA+3R/yZ6xOLR/z2wUB0A5nrAjPSib3c/f//9sFAdBs71n8XfAQ7xnMR99iD0gD32oGN8P3//wABAAD3hfD9//8AkAAAi9qL+HUCM9uDvej9//8AfQzHhej9//8BAAAA6xqDpfD9///3uAACAAA5hej9//9+BomF6P3//4vHC8N1BiGF0P3//41184uF6P3///+N6P3//4XAfwaLxwvDdC2LheD9//+ZUlBTV+jkNwAAg8Ewg/k5iZ2g/f//i/iL2n4GA424/f//iA5O672NRfMrxkb3hfD9//8AAgAAiYXg/f//ibXk/f//dGGFwHQHi86AOTB0Vv+N5P3//4uN5P3//8YBMEDrPklmOTB0BkBAO8519CuF5P3//9H46yg7/nULoZASQQCJheT9//+LheT9///rB0mAOAB0BUA7znX1K4Xk/f//iYXg/f//g73A/f//AA+FXAEAAIuF8P3//6hAdDKpAAEAAHQJxoXU/f//LesYqAF0CcaF1P3//yvrC6gCdBHGhdT9//8gx4XQ/f//AQAAAIudzP3//yud4P3//yud0P3///aF8P3//wx1F/+1tP3//42F2P3//1NqIOhw9f//g8QM/7XQ/f//i720/f//jYXY/f//jY3U/f//6Hb1///2hfD9//8IWXQb9oXw/f//BHUSV1NqMI2F2P3//+gu9f//g8QMg73I/f//AIuF4P3//3RmhcB+You15P3//4mFoP3//w+3Bv+NoP3//1BqBo1F9FCNhZj9//9GUEbo5TUAAIPEEIXAdSg5hZj9//90IP+1mP3//42F2P3//41N9Ojx9P//g72g/f//AFl1tescg43Y/f//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mOBAAIXAD4QpBAAAi4VE5f//i40w5f//A8E5tTzl//+JhTjl//8PjBUEAACDvSDl//8AD4TNAAAAagCNhTzl//9QagGNRfRQi4Uo5f//iwDGRfQN/zQH/xWY4EAAhcAPhNADAACDvTzl//8BD4zPAwAA/4Uw5f///4U45f//6YMAAAA8AXQEPAJ1IQ+3MzPJZoP+Cg+UwUNDg4VE5f//Aom1QOX//4mNIOX//zwBdAQ8AnVS/7VA5f//6CUlAABZZjuFQOX//w+FaAMAAIOFOOX//wKDvSDl//8AdClqDVhQiYVA5f//6PgkAABZZjuFQOX//w+FOwMAAP+FOOX///+FMOX//4tFEDmFROX//w+C+f3//+knAwAAiw6KE/+FOOX//4hUDzSLDolEDzjpDgMAADPJiwYDx/ZABIAPhL8CAACLhTTl//+JjUDl//+E2w+FygAAAImFPOX//zlNEA+GIAMAAOsGi7Uo5f//i4085f//g6VE5f//ACuNNOX//42FSOX//ztNEHM5i5U85f///4U85f//ihJBgPoKdRD/hTDl///GAA1A/4VE5f//iBBA/4VE5f//gb1E5f///xMAAHLCi9iNhUjl//8r2GoAjYUs5f//UFONhUjl//9Qiwb/NAf/FZjgQACFwA+EQgIAAIuFLOX//wGFOOX//zvDD4w6AgAAi4U85f//K4U05f//O0UQD4JM////6SACAACJhUTl//+A+wIPhdEAAAA5TRAPhk0CAADrBou1KOX//4uNROX//4OlPOX//wArjTTl//+NhUjl//87TRBzRouVROX//4OFROX//wIPtxJBQWaD+gp1FoOFMOX//wJqDVtmiRhAQIOFPOX//wKDhTzl//8CZokQQECBvTzl///+EwAAcrWL2I2FSOX//yvYagCNhSzl//9QU42FSOX//1CLBv80B/8VmOBAAIXAD4RiAQAAi4Us5f//AYU45f//O8MPjFoBAACLhUTl//8rhTTl//87RRAPgj/////pQAEAADlNEA+GfAEAAIuNROX//4OlPOX//wArjTTl//9qAo2FSPn//147TRBzPIuVROX//w+3EgG1ROX//wPOZoP6CnUOag1bZokYA8YBtTzl//8BtTzl//9miRADxoG9POX//6gGAAByvzP2VlZoVQ0AAI2N8Ov//1GNjUj5//8rwZkrwtH4UIvBUFZo6f0AAP8VsOBAAIvYO94PhJcAAABqAI2FLOX//1CLwyvGUI2ENfDr//9Qi4Uo5f//iwD/NAf/FZjgQACFwHQMA7Us5f//O95/y+sM/xVc4EAAiYVA5f//O95/XIuFROX//yuFNOX//4mFOOX//ztFEA+CCv///+s/agCNjSzl//9R/3UQ/7U05f///zD/FZjgQACFwHQVi4Us5f//g6VA5f//AImFOOX//+sM/xVc4EAAiYVA5f//g7045f//AHVsg71A5f//AHQtagVeObVA5f//dRTosrb//8cACQAAAOi6tv//iTDrP/+1QOX//+i+tv//Wesxi7Uo5f//iwb2RAcEQHQPi4U05f//gDgadQQzwOsk6HK2///HABwAAADoerb//4MgAIPI/+sMi4U45f//K4Uw5f//X1uLTfwzzV7o2J3//8nDahBo8PdAAOiEtv//i0UIg/j+dRvoPrb//4MgAOgjtv//xwAJAAAAg8j/6Z0AAAAz/zvHfAg7BZAqQQByIegVtv//iTjo+7X//8cACQAAAFdXV1dX6IO1//+DxBTryYvIwfkFjRyNoCpBAIvwg+YfweYGiwsPvkwxBIPhAXS/UOg5JAAAWYl9/IsD9kQwBAF0Fv91EP91DP91COgu+P//g8QMiUXk6xbomLX//8cACQAAAOigtf//iTiDTeT/x0X8/v///+gJAAAAi0Xk6AS2///D/3UI6IMkAABZw2oQaBD4QADoqLX//4tFCIP4/nUT6E+1///HAAkAAACDyP/pqgAAADPbO8N8CDsFkCpBAHIa6C61///HAAkAAABTU1NTU+i2tP//g8QU69CLyMH5BY08jaAqQQCL8IPmH8HmBosPD75MDgSD4QF0xlDobCMAAFmJXfyLB/ZEBgQBdDH/dQjo4CIAAFlQ/xXk4EAAhcB1C/8VXOBAAIlF5OsDiV3kOV3kdBnozbT//4tN5IkI6LC0///HAAkAAACDTeT/x0X8/v///+gJAAAAi0Xk6CO1///D/3UI6KIjAABZw4v/VYvsg+wQUzPbOV0IdRzocrT//1NTU1NTxwAWAAAA6Pqz//+DxBQzwOtqVot1DDvzdRroTrT//1NTU1NTxwAWAAAA6Naz//+DxBTrBTl1CHIEM8DrPv91EI1N8OjGm///i030jUb/OVkIdBxIOUUIdwoPthD2RAod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f3c0jUQ/CD0ABAAAdxPo0h8AAIvEO8N0HMcAzMwAAOsRUOhQ4P//WTvDdAnHAN3dAACDwAiL2IXbdGmNBD9QagBT6E6Q//+DxAxXU/91EP91DGoB/3UY/9aFwHQR/3UUUFP/dQj/FfjgQACJRfhT6Mn6//+LRfhZ63Uz9jldHHUIiweLQBSJRRw5XRh1CIsHi0AEiUUY/3Uc6EEdAABZg/j/dQQzwOtHO0UYdB5TU41NEFH/dQxQ/3UY6GkdAACL8IPEGDvzdNyJdQz/dRT/dRD/dQz/dQj/dRz/FfTgQACL+DvzdAdW6Iav//9Zi8eNZexfXluLTfwzzeiYk///ycOL/1WL7IPsEP91CI1N8OiSk////3UkjU3w/3Ug/3Uc/3UY/3UU/3UQ/3UM6Bb+//+DxByAffwAdAeLTfiDYXD9ycOL/1WL7FaLdQiF9g+EgQEAAP92BOgWr////3YI6A6v////dgzoBq////92EOj+rv///3YU6Pau////dhjo7q7///826Oeu////diDo367///92JOjXrv///3Yo6M+u////dizox67///92MOi/rv///3Y06Leu////dhzor67///92OOinrv///3Y86J+u//+DxED/dkDolK7///92ROiMrv///3ZI6ISu////dkzofK7///92UOh0rv///3ZU6Gyu////dljoZK7///92XOhcrv///3Zg6FSu////dmToTK7///92aOhErv///3Zs6Dyu////dnDoNK7///92dOgsrv///3Z46CSu////dnzoHK7//4PEQP+2gAAAAOgOrv///7aEAAAA6AOu////togAAADo+K3///+2jAAAAOjtrf///7aQAAAA6OKt////tpQAAADo163///+2mAAAAOjMrf///7acAAAA6MGt////tqAAAADotq3///+2pAAAAOirrf///7aoAAAA6KCt//+DxCxeXcOL/1WL7FaLdQiF9nQ1iwY7BUgdQQB0B1Dofa3//1mLRgQ7BUwdQQB0B1Doa63//1mLdgg7NVAdQQB0B1boWa3//1leXcOL/1WL7FaLdQiF9nR+i0YMOwVUHUEAdAdQ6Det//9Zi0YQOwVYHUEAdAdQ6CWt//9Zi0YUOwVcHUEAdAdQ6BOt//9Zi0YYOwVgHUEAdAdQ6AGt//9Zi0YcOwVkHUEAdAdQ6O+s//9Z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AAAAAABSNjAzMw0KLSBBdHRlbXB0IHRvIHVzZSBNU0lMIGNvZGUgZnJvbSB0aGlzIGFzc2VtYmx5IGR1cmluZyBuYXRpdmUgY29kZSBpbml0aWFsaXphdGlvbgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBJdCBpcyBtb3N0IGxpa2VseSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYW4gTVNJTC1jb21waWxlZCAoL2NscikgZnVuY3Rpb24gZnJvbSBhIG5hdGl2ZSBjb25zdHJ1Y3RvciBvciBmcm9tIERsbE1haW4uDQoAAFI2MDMyDQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvY2FsZSBpbmZvcm1hdGlvbg0KAAAAAAAAUjYwMzENCi0gQXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBDUlQgbW9yZSB0aGFuIG9uY2UuClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uDQoAAFI2MDMwDQotIENSVCBub3QgaW5pdGlhbGl6ZWQNCgAAUjYwMjgNCi0gdW5hYmxlIHRvIGluaXRpYWxpemUgaGVhcA0KAAAAAFI2MDI3DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvd2lvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3Igc3RkaW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNQ0KLSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbA0KAAAAUjYwMjQNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgX29uZXhpdC9hdGV4aXQgdGFibGUNCgAAAABSNjAxOQ0KLSB1bmFibGUgdG8gb3BlbiBjb25zb2xlIGRldmljZQ0KAAAAAFI2MDE4DQotIHVuZXhwZWN0ZWQgaGVhcCBlcnJvcg0KAAAAAFI2MDE3DQotIHVuZXhwZWN0ZWQgbXVsdGl0aHJlYWQgbG9jayBlcnJvcg0KAAAAAFI2MDE2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRocmVhZCBkYXRhDQoADQpUaGlzIGFwcGxpY2F0aW9uIGhhcyByZXF1ZXN0ZWQgdGhlIFJ1bnRpbWUgdG8gdGVybWluYXRlIGl0IGluIGFuIHVudXN1YWwgd2F5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAABSNjAwOQ0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBlbnZpcm9ubWVudA0KAFI2MDA4DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGFyZ3VtZW50cw0KAAAAUjYwMDINCi0gZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBub3QgbG9hZGVkDQoAAAAATWljcm9zb2Z0IFZpc3VhbCBDKysgUnVudGltZSBMaWJyYXJ5AAAAAAoKAAAuLi4APHByb2dyYW0gbmFtZSB1bmtub3duPgAAUnVudGltZSBFcnJvciEKClByb2dyYW06IAAAAAAAAAAFAADACwAAAAAAAAAdAADABAAAAAAAAACWAADABAAAAAAAAACNAADACAAAAAAAAACOAADACAAAAAAAAACPAADACAAAAAAAAACQAADACAAAAAAAAACRAADACAAAAAAAAACSAADACAAAAAAAAACTAADACAAAAAAAAAAGgICGgIGAAAAQA4aAhoKAFAUFRUVFhYWFBQAAMDCAUICIAAgAKCc4UFeAAAcANzAwUFCIAAAAICiAiICAAAAAYGhgaGhoCAgHeHBwd3BwCAgAAAgACAAHCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAKAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEAgQCBAIEAgQCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAQABAAEAAQABAAEACCAIIAggCCAIIAggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEAAQABAAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgAGgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAYEBgQGBAYEBgQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBEAAQABAAEAAQABAAggGCAYIBggGCAYIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECARAAEAAQABAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAFAAUABAAEAAQABAAEAAUABAAEAAQABAAEAAQAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEQAAEBAQEBAQEBAQEBAQEBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBEAACAQIBAgECAQIBAgECAQIBAQEAAAAAgIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6W1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/SEg6bW06c3MAAAAAZGRkZCwgTU1NTSBkZCwgeXl5eQBNTS9kZC95eQAAAABQTQAAQU0AAERlY2VtYmVyAAAAAE5vdmVtYmVyAAAAAE9jdG9iZXIAU2VwdGVtYmVyAAAAQXVndXN0AABKdWx5AAAAAEp1bmUAAAAAQXByaWwAAABNYXJjaAAAAEZlYnJ1YXJ5AAAAAEphbnVhcnkARGVjAE5vdgBPY3QAU2VwAEF1ZwBKdWwASnVuAE1heQBBcHIATWFyAEZlYgBKYW4AU2F0dXJkYXkAAAAARnJpZGF5AABUaHVyc2RheQAAAABXZWRuZXNkYXkAAABUdWVzZGF5AE1vbmRheQAAU3VuZGF5AABTYXQARnJpAFRodQBXZWQAVHVlAE1vbgBTdW4AR2V0UHJvY2Vzc1dpbmRvd1N0YXRpb24AR2V0VXNlck9iamVjdEluZm9ybWF0aW9uQQAAAEdldExhc3RBY3RpdmVQb3B1cAAAR2V0QWN0aXZlV2luZG93AE1lc3NhZ2VCb3hBAFVTRVIzMi5ETEwAAFN1bk1vblR1ZVdlZFRodUZyaVNhdAAAAEphbkZlYk1hckFwck1heUp1bkp1bEF1Z1NlcE9jdE5vdkRlYwAAAABDT05PVVQkAC5jb20AAAAALmV4ZQAAAAAuYmF0AAAAAC5jbWQAAAAALlwAAFN5c3RlbVJvb3QAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEkEA0PRAAAMAAAAAOAAAsGkAAKCZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAANwYQAAAAAAA/v///wAAAADI////AAAAAP7///8AAAAAvCNAAAAAAAD+////AAAAAIj///8AAAAA/v////olQAD+JUAA/v///8AlQADUJUAA/v///wAAAACM////AAAAAP7///9oNUAAbDVAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAATO0AAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAOE7QAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAaz1AAAAAAAAAAAAANz1AAP7///8AAAAA1P///wAAAAD+////AAAAAPA+QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAI0BAAAAAAAD+////AAAAANT///8AAAAA/v///01BQABpQUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAF1HQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAK0tAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAACbTkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAN1QQAD+////AAAAAOxQQAD+////AAAAANj///8AAAAA/v///wAAAACfUkAA/v///wAAAACrUkAA/v///wAAAADU////AAAAAP7///8AAAAAZVlAAAAAAAD+////AAAAANj///8AAAAA/v///wtbQAAfW0AAAAAAAP7///8AAAAA2P///wAAAAD+////XVtAAGFbQAAAAAAA/v///wAAAADA////AAAAAP7///8AAAAAuF5AAAAAAAD+////AAAAAND///8AAAAA/v///0hfQABfX0AAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAALlqQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAymxAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADOeUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAN6BQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAv4JAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAC0lUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAE2YQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAA5KFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAABbpkAAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAACGoQAAAAAAAAAAAAF2nQAD+////AAAAAND///8AAAAA/v///wAAAADcrkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAPjCQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAm8pAAFz5AAAAAAAAAAAAABYAAQAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAACc+gAAuPoAAM76AADk+gAA9voAAA77AAAk+wAAPPsAAFT7AABo+wAAcPsAAIL7AACQ+wAAovsAALT7AADG+wAA1vsAAOT7AAD8+wAAEPwAACT8AABA/AAAXvwAAHL8AACC/AAAjvwAAJr8AACm/AAAvvwAANb8AADg/AAA7PwAAP78AAAM/QAAGP0AACb9AAAw/QAAQP0AAFb9AABi/QAAcv0AAJr9AAC0/QAAzP0AAOb9AAD8/QAAFv4AACT+AAAy/gAATP4AAFz+AABy/gAAjP4AAJj+AACm/gAAtv4AAMb+AADY/gAA7P4AAPz+AAAS/wAAIv8AADT/AABG/wAAWP8AAGr/AAB2/wAAhP8AAJT/AACq/wAAuv8AAMr/AADY/wAA6v8AAPz/AAAkAAEAMAABAEAAAQBSAAEAAAAAAFIBR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50AADGAUdldEV4aXRDb2RlUHJvY2VzcwAAbgRXYWl0Rm9yU2luZ2xlT2JqZWN0AJUAQ3JlYXRlUHJvY2Vzc0EAAK8DU2V0Q29uc29sZUN0cmxIYW5kbGVyAPUBR2V0TW9kdWxlRmlsZU5hbWVBAADaAEVudGVyQ3JpdGljYWxTZWN0aW9uAAD0AkxlYXZlQ3JpdGljYWxTZWN0aW9uAAD6AUdldE1vZHVsZUhhbmRsZVcAACsEU2xlZXAAIgJHZXRQcm9jQWRkcmVzcwAABQFFeGl0UHJvY2VzcwBwAUdldENvbW1hbmRMaW5lQQA8AkdldFN0YXJ0dXBJbmZvQQDwA1NldEhhbmRsZUNvdW50AAA+AkdldFN0ZEhhbmRsZQAA2AFHZXRGaWxlVHlwZQC/AERlbGV0ZUNyaXRpY2FsU2VjdGlvbgA3BFRlcm1pbmF0ZVByb2Nlc3MAAKoBR2V0Q3VycmVudFByb2Nlc3MASARVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAAB8EU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyANYCSXNEZWJ1Z2dlclByZXNlbnQA5wFHZXRMYXN0RXJyb3IAAKYCSGVhcEZyZWUAAKICSGVhcEFsbG9jAFwBR2V0Q1BJbmZvAMUCSW50ZXJsb2NrZWRJbmNyZW1lbnQAAMECSW50ZXJsb2NrZWREZWNyZW1lbnQAAFMBR2V0QUNQAAAUAkdldE9FTUNQAADgAklzVmFsaWRDb2RlUGFnZQA+BFRsc0dldFZhbHVlADwEVGxzQWxsb2MAAD8EVGxzU2V0VmFsdWUAPQRUbHNGcmVlAPQDU2V0TGFzdEVycm9yAACuAUdldEN1cnJlbnRUaHJlYWRJZAAAlwRXcml0ZUZpbGUA9gJMb2FkTGlicmFyeUEAALoCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudABLAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NBAMABR2V0RW52aXJvbm1lbnRTdHJpbmdzAEwBRnJlZUVudmlyb25tZW50U3RyaW5nc1cAhARXaWRlQ2hhclRvTXVsdGlCeXRlAMIBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAApAJIZWFwQ3JlYXRlAABhBFZpcnR1YWxGcmVlAFkDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAagJHZXRUaWNrQ291bnQAAKsBR2V0Q3VycmVudFByb2Nlc3NJZABTAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAJoDUnRsVW53aW5kAKkCSGVhcFJlQWxsb2MAXgRWaXJ0dWFsQWxsb2MAAIQBR2V0Q29uc29sZUNQAACWAUdldENvbnNvbGVNb2RlAABCAUZsdXNoRmlsZUJ1ZmZlcnMAAOYCTENNYXBTdHJpbmdBAAAfA011bHRpQnl0ZVRvV2lkZUNoYXIA6AJMQ01hcFN0cmluZ1cAAEACR2V0U3RyaW5nVHlwZUEAAEMCR2V0U3RyaW5nVHlwZVcAAOkBR2V0TG9jYWxlSW5mb0EAAOcDU2V0RmlsZVBvaW50ZXIAAKsCSGVhcFNpemUAAEQAQ2xvc2VIYW5kbGUAjARXcml0ZUNvbnNvbGVBAJoBR2V0Q29uc29sZU91dHB1dENQAACWBFdyaXRlQ29uc29sZVcABgRTZXRTdGRIYW5kbGUAAHkAQ3JlYXRlRmlsZUEAUwBDb21wYXJlU3RyaW5nQQAAVgBDb21wYXJlU3RyaW5nVwAA2ANTZXRFbnZpcm9ubWVudFZhcmlhYmxlQQBLRVJORUwzMi5kbGwAAG4DUmVhZEZpbGUAANUDU2V0RW5kT2ZGaWxlAAAmAkdldFByb2Nlc3NIZWFwAADKAUdldEZpbGVBdHRyaWJ1dGVzQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwCtBAAAAAADAK0EAAQEAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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IyFweXRob24uZXhlAAAAACMhAAAAAAAAQ2Fubm90IG9wZW4gJXMKAC1zY3JpcHQucHl3AAAAAABDb3JFeGl0UHJvY2VzcwAAbQBzAGMAbwByAGUAZQAuAGQAbABsAAAAKABuAHUAbABsACkAAAAAAChudWxsKQAAAAAAAAAAAAAGAAAGAAEAABAAAwYABgIQBEVFRQUFBQUFNTAAUAAAAAAoIDhQWAcIADcwMFdQBwAAICAIAAAAAAhgaGBgYGAAAHhweHh4eAgHCAAABwAICAgAAAgACAAHCAAAAAAAAAAQOAFAAQAAALA4AUABAAAAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+fwA9AAAAAAAAAHJ1bnRpbWUgZXJyb3IgAAANCgAAAAAAAFRMT1NTIGVycm9yDQoAAABTSU5HIGVycm9yDQoAAAAARE9NQUlOIGVycm9yDQoAAFI2MDM0DQpBbiBhcHBsaWNhdGlvbiBoYXMgbWFkZSBhbiBhdHRlbXB0IHRvIGxvYWQgdGhlIEMgcnVudGltZSBsaWJyYXJ5IGluY29ycmVjdGx5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAAAAAABSNjAzMw0KLSBBdHRlbXB0IHRvIHVzZSBNU0lMIGNvZGUgZnJvbSB0aGlzIGFzc2VtYmx5IGR1cmluZyBuYXRpdmUgY29kZSBpbml0aWFsaXphdGlvbgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBJdCBpcyBtb3N0IGxpa2VseSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYW4gTVNJTC1jb21waWxlZCAoL2NscikgZnVuY3Rpb24gZnJvbSBhIG5hdGl2ZSBjb25zdHJ1Y3RvciBvciBmcm9tIERsbE1haW4uDQoAAFI2MDMyDQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvY2FsZSBpbmZvcm1hdGlvbg0KAAAAAAAAUjYwMzENCi0gQXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBDUlQgbW9yZSB0aGFuIG9uY2UuClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uDQoAAAAAAABSNjAzMA0KLSBDUlQgbm90IGluaXRpYWxpemVkDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhlYXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAAUjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAAAAAAAAUjYwMTgNCi0gdW5leHBlY3RlZCBoZWFwIGVycm9yDQoAAAAAAAAAAFI2MDE3DQotIHVuZXhwZWN0ZWQgbXVsdGl0aHJlYWQgbG9jayBlcnJvcg0KAAAAAFI2MDE2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRocmVhZCBkYXRhDQoAAAAAAAAAAAAAAAAADQpUaGlzIGFwcGxpY2F0aW9uIGhhcyByZXF1ZXN0ZWQgdGhlIFJ1bnRpbWUgdG8gdGVybWluYXRlIGl0IGluIGFuIHVudXN1YWwgd2F5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAABSNjAwOQ0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBlbnZpcm9ubWVudA0KAAAAAABSNjAwOA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBhcmd1bWVudHMNCgAAAAAAAABSNjAwMg0KLSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IG5vdCBsb2FkZWQNCgAAAABNaWNyb3NvZnQgVmlzdWFsIEMrKyBSdW50aW1lIExpYnJhcnkAAAAACgoAAC4uLgA8cHJvZ3JhbSBuYW1lIHVua25vd24+AABSdW50aW1lIEVycm9yIQoKUHJvZ3JhbTogAAAAAAAAAAUAAMALAAAAAAAAAAAAAAAdAADABAAAAAAAAAAAAAAAlgAAwAQAAAAAAAAAAAAAAI0AAMAIAAAAAAAAAAAAAACOAADACAAAAAAAAAAAAAAAjwAAwAgAAAAAAAAAAAAAAJAAAMAIAAAAAAAAAAAAAACRAADACAAAAAAAAAAAAAAAkgAAwAgAAAAAAAAAAAAAAJMAAMAIAAAAAAAAAAAAAAAGgICGgIGAAAAQA4aAhoKAFAUFRUVFhYWFBQAAMDCAUICIAAgAKCc4UFeAAAcANzAwUFCIAAAAICiAiICAAAAAYGhgaGhoCAgHeHBwd3BwCAgAAAgACAAHCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAKAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEAgQCBAIEAgQCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAQABAAEAAQABAAEACCAIIAggCCAIIAggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEAAQABAAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgAGgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAYEBgQGBAYEBgQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBEAAQABAAEAAQABAAggGCAYIBggGCAYIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECARAAEAAQABAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAFAAUABAAEAAQABAAEAAUABAAEAAQABAAEAAQAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEQAAEBAQEBAQEBAQEBAQEBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBEAACAQIBAgECAQIBAgECAQIBAQEAAAAAAAAAAAAAAACAgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/wABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/wABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWnt8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v9ISDptbTpzcwAAAAAAAAAAZGRkZCwgTU1NTSBkZCwgeXl5eQAAAAAATU0vZGQveXkAAAAAUE0AAEFNAAAAAAAARGVjZW1iZXIAAAAAAAAAAE5vdmVtYmVyAAAAAAAAAABPY3RvYmVyAFNlcHRlbWJlcgAAAEF1Z3VzdAAASnVseQAAAABKdW5lAAAAAEFwcmlsAAAATWFyY2gAAAAAAAAARmVicnVhcnkAAAAAAAAAAEphbnVhcnkARGVjAE5vdgBPY3QAU2VwAEF1ZwBKdWwASnVuAE1heQBBcHIATWFyAEZlYgBKYW4AU2F0dXJkYXkAAAAARnJpZGF5AAAAAAAAVGh1cnNkYXkAAAAAAAAAAFdlZG5lc2RheQAAAAAAAABUdWVzZGF5AE1vbmRheQAAU3VuZGF5AABTYXQARnJpAFRodQBXZWQAVHVlAE1vbgBTdW4AAAAAAEdldFByb2Nlc3NXaW5kb3dTdGF0aW9uAEdldFVzZXJPYmplY3RJbmZvcm1hdGlvbkEAAAAAAAAAR2V0TGFzdEFjdGl2ZVBvcHVwAAAAAAAAR2V0QWN0aXZlV2luZG93AE1lc3NhZ2VCb3hBAAAAAABVU0VSMzIuRExMAAAAAAAAU3VuTW9uVHVlV2VkVGh1RnJpU2F0AAAASmFuRmViTWFyQXByTWF5SnVuSnVsQXVnU2VwT2N0Tm92RGVjAAAAAENPTk9VVCQALmNvbQAAAAAuZXhlAAAAAC5iYXQAAAAALmNtZAAAAAAuXAAAAAAAAFN5c3RlbVJvb3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEeDAAedAsAHmQKAB5UCQAeNAgAHjIa4BjQFsAZHwUADTSQAA0BjAAGcAAAuB8AAFAEAAABDQUADTQfAA0BHAAGcAAAIQAAAPAVAADOFgAAJAcBACEAAADOFgAAohcAABAHAQAhAAQAANRIAADESQDOFgAAohcAABAHAQAhHAYAHNRIABTESQAIZEoAzhYAAKIXAAAQBwEAIQgCAAhUUgDwFQAAzhYAACQHAQAZIAYADgFLAAfwBeADcAIwuB8AADACAAARHAUAHGIYwBZwFWAUMAAA4CsAAAEAAACMGQAAWRoAAEDiAAAAAAAAARkKABk0DwAZUhXwE+AR0A/ADXAMYAtQAQYCAAZyAjABFAIAFLIQMAEPBAAPNAYADzILcAEKBAAKNAYACjIGcBEcCgAcZA8AHDQOABxyGPAW4BTQEsAQcOArAAABAAAA8ycAAPwoAABY4gAAAAAAAAEGAgAGMgJQCRIHABJkGAASNBcAEgEUAAtwAADgKwAAAgAAAAIqAAAOKgAAAQAAAK8rAADvKgAAkSsAAHriAACRKwAAASAMACBkEQAgVBAAIDQOACByHPAa4BjQFsAUcAEQBgAQdAcAEDQGABAyDMABCQIACTIFMAEYCAAYZAgAGFQHABg0BgAYMhRwARQIABRkCAAUVAcAFDQGABQyEHAZKQsAFzRkABcBWgAQ8A7gDNAKwAhwB2AGUAAAuB8AAMgCAAAJIA0AIMQZACB0GAAgZBcAIDQWACABEgAZ8BfgFdAAAOArAAABAAAAtDoAAMA6AAABAAAAXD0AAAEJAwAJAbwAAjAAAAEZCgAZdAkAGWQIABlUBwAZNAYAGTIVwAEYCgAYZAoAGFQJABg0CAAYMhTQEsAQcAEKAgAKMgYwERAGABBkCQAQNAgAEFIMwOArAAABAAAAn0IAABdDAACW4gAAAAAAABEZCgAZxAwAGXQLABlkCgAZUhXwE+AR0OArAAACAAAAW0QAAKFEAACv4gAAAAAAACJEAAC+RAAA3+IAAAAAAAABFQgAFXQIABVkBwAVNAYAFTIRwBEVCAAVdAgAFWQHABU0BgAVMhHQ4CsAAAEAAACjRgAA40YAAPjiAAAAAAAAARQIABRkCgAUVAkAFDQIABRSEHABDwYAD2QLAA80CgAPcgtwAQwCAAwBEQAZJAcAEmS0ABI0swASAbAAC3AAALgfAABwBQAAEQoEAAo0BwAKMgZw4CsAAAEAAAASTgAAa04AABTjAAAAAAAAGR8IABA0EAAQcgzQCsAIcAdgBlC4HwAAOAAAABEZCgAZxAsAGXQKABlkCQAZNAgAGVIV0OArAAABAAAAgVIAADtTAAAU4wAAAAAAABEGAgAGMgIw4CsAAAEAAAALVwAAIVcAAC3jAAAAAAAAEQoEAAo0BgAKMgZw4CsAAAIAAADeVwAA6VcAAEbjAAAAAAAA/lcAACVYAABm4wAAAAAAABETBAATNAcAEzIPcOArAAACAAAAglkAALBZAABG4wAAAAAAAMVZAAD8WQAAZuMAAAAAAAABDwYAD2QQAA9UDwAPsgtwARcIABdkCQAXVAgAFzQHABcyE3ABFQgAFdQLABV0CgAVNAgAFVIR4BEZCgAZdAoAGWQJABk0CAAZMhXgE9ARwOArAAABAAAADmAAAM9gAAB/4wAAAAAAAAEEAQAEQgAACQQBAARCAADgKwAAAQAAAEdiAAB6YgAAoOMAAHpiAAAJBAEABEIAAOArAAABAAAAmWIAAJ1iAAABAAAAnWIAABEXCgAXZBAAFzQPABdyE/AR4A/QDcALcOArAAABAAAAQGYAANNmAADB4wAAAAAAAAkEAQAEYgAA4CsAAAEAAABUZwAAY2cAAN3jAABjZwAAAR0MAB10CwAdZAoAHVQJAB00CAAdMhngF9AVwAEPBgAPZAsADzQKAA9SC3ABGQoAGXQNABlkDAAZVAsAGTQKABlyFcABCAEACEIAAAEKBAAKNAgACjIGcAAAAAABBwIABwGbAAESBgASNBAAErIOcA1gDFABDwYAD2QJAA80CAAPUgtwAQoEAAo0CAAKUgZwAQYCAAZSAlARDwQADzQJAA9SC3DgKwAAAQAAANd2AADhdgAA/+MAAAAAAAAZLwsAHTRxAx0BZgMQ8A7gDNAKwAhwB2AGUAAAuB8AACAbAAARGwoAG2QOABs0DQAbUhfwFeAT0BHAD3DgKwAAAQAAAAx/AAA9fwAALuQAAAAAAAAREQYAETQMABFSDcALcApg4CsAAAEAAAAfgAAAY4AAABfkAAAAAAAAAQoEAAo0DAAKkgZwARgKABhkEAAYVA8AGDQOABiSFNASwBBwGS0NRR90FAAbZBMAFzQSABNDDrIK8AjgBtAEwAJQAAC4HwAAWAAAAAEPBgAPZBEADzQQAA/SC3AZMQ01I3QQAB9kDwAbNA4AFzMScg7wDOAK0AjABlAAALgfAAA4AAAAAQ8GAA9kDwAPNA4AD7ILcAEOAgAOMgowERsKABtkDgAbNA0AG1IX8BXgE9ARwA9w4CsAAAEAAAC2lwAA6ZcAAC7kAAAAAAAAARYKABZUDwAWNA4AFnIS4BDQDsAMcAtgAQcCAAcBtQABHQwAHXQRAB1kEAAdVA8AHTQOAB2SGeAX0BXAERcIABdkDQAXNAwAF1IT0BHAD3DgKwAAAQAAAOOfAAAIoAAAF+QAAAAAAAABBgIABjICMBkTAQAEwgAAuB8AAFAAAAABBAEABBIAAAEPBgAPVAcADzQGAA8yC3ARGQoAGcQJABl0CAAZZAcAGTQGABkyFdDgKwAAAQAAAEulAABrpQAAReQAAAAAAAARGQoAGcQOABl0DQAZNAwAGXIV8BPgEdDgKwAAAgAAAG2mAACTpgAAXuQAAAAAAAAUpgAAxacAAH7kAAAAAAAAGRMBAARiAAC4HwAAKAAAABknC0UZQxQBEQAN8AvgCdAHwAVwBGADMAJQAAC4HwAAcAAAAAEEAQAEYgAAAQQBAASCAAARFQgAFXQKABVkCQAVNAgAFVIRwOArAAABAAAA0a0AALmuAACX5AAAAAAAAAEKBAAKVBEACtIGcAEUCAAUZBAAFFQPABQ0DgAUshBwAQ8GAA9UDAAPNAsAD3ILcBkkCjUWMxHCDfAL4AnQB8AFcARgAzACULgfAABYAAAAARgKABg0EAAYUhTwEuAQ0A7ADHALYApQAQ8GAA9kDQAPNAwAD5ILcAEZCQAZohXwE+AR0A/ADXAMYAtQCjAAABEbCgAbZA4AGzQNABtSF/AV4BPQEcAPcOArAAABAAAA7MYAAB7HAAAu5AAAAAAAAAEhCgAhNBkAIfIa8BjgFtAUwBJwEWAQUAEGAgAGcgJQERQDABSiEHAPYAAA4CsAAAEAAADPzwAA/M8AALDkAAAAAAAAAQYCAAZSAjABHQwAHXQLAB1kCgAdVAkAHTQIAB0yGfAX0BXAAQ8GAA9kBwAPNAYADzILcAEFAgAFNAEAARwJABwBHAAV8BPgEdAPwA1wDFALMAAAGSMKABQBEQAN8AvgCdAHwAVwBGADUAIwuB8AAHgAAAABFAgAFGQOABRUDQAUNAwAFJIQcDARAQAAAAAAAAAAAGYZAQAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwBMBAAAAAADcEwEAAAAAAPITAQAAAAAACBQBAAAAAAAaFAEAAAAAADIUAQAAAAAASBQBAAAAAABgFAEAAAAAAHgUAQAAAAAAjBQBAAAAAACUFAEAAAAAAKYUAQAAAAAAtBQBAAAAAADGFAEAAAAAANgUAQAAAAAA5hQBAAAAAAD4FAEAAAAAAAgVAQAAAAAAFhUBAAAAAAAuFQEAAAAAAEIVAQAAAAAAVhUBAAAAAAByFQEAAAAAAJAVAQAAAAAApBUBAAAAAAC4FQEAAAAAANIVAQAAAAAA5hUBAAAAAAD2FQEAAAAAAAIWAQAAAAAADhYBAAAAAAAaFgEAAAAAACQWAQAAAAAAMBYBAAAAAABCFgEAAAAAAFIWAQAAAAAAYhYBAAAAAABwFgEAAAAAAH4WAQAAAAAAiBYBAAAAAACYFgEAAAAAAK4WAQAAAAAAuhYBAAAAAADGFgEAAAAAANYWAQAAAAAA/hYBAAAAAAAYFwEAAAAAADAXAQAAAAAAShcBAAAAAABgFwEAAAAAAHoXAQAAAAAAkBcBAAAAAACeFwEAAAAAALgXAQAAAAAAyBcBAAAAAADeFwEAAAAAAPgXAQAAAAAABhgBAAAAAAAWGAEAAAAAACgYAQAAAAAAPBgBAAAAAABMGAEAAAAAAGIYAQAAAAAAchgBAAAAAACEGAEAAAAAAJYYAQAAAAAAqBgBAAAAAAC6GAEAAAAAAMYYAQAAAAAA1BgBAAAAAADkGAEAAAAAAPoYAQAAAAAAChkBAAAAAAAaGQEAAAAAACgZAQAAAAAAOhkBAAAAAABMGQEAAAAAAHQZAQAAAAAAgBkBAAAAAACQGQEAAAAAAKIZAQAAAAAAAAAAAAAAAABTAUdlbmVyYXRlQ29uc29sZUN0cmxFdmVudAAAxwFHZXRFeGl0Q29kZVByb2Nlc3MAAHIEV2FpdEZvclNpbmdsZU9iamVjdACWAENyZWF0ZVByb2Nlc3NBAAC0A1NldENvbnNvbGVDdHJsSGFuZGxlcgD1AUdldE1vZHVsZUZpbGVOYW1lQQAA2wBFbnRlckNyaXRpY2FsU2VjdGlvbgAA7gJMZWF2ZUNyaXRpY2FsU2VjdGlvbgAA+gFHZXRNb2R1bGVIYW5kbGVXAAAvBFNsZWVwACICR2V0UHJvY0FkZHJlc3MAAAYBRXhpdFByb2Nlc3MAcQFHZXRDb21tYW5kTGluZUEAPAJHZXRTdGFydHVwSW5mb0EAngNSdGxVbndpbmRFeAD0A1NldEhhbmRsZUNvdW50AAA+AkdldFN0ZEhhbmRsZQAA2QFHZXRGaWxlVHlwZQDAAERlbGV0ZUNyaXRpY2FsU2VjdGlvbgA7BFRlcm1pbmF0ZVByb2Nlc3MAAKsBR2V0Q3VycmVudFByb2Nlc3MATARVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAACMEU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyANACSXNEZWJ1Z2dlclByZXNlbnQAnwNSdGxWaXJ0dWFsVW53aW5kAACYA1J0bExvb2t1cEZ1bmN0aW9uRW50cnkAAJEDUnRsQ2FwdHVyZUNvbnRleHQA5wFHZXRMYXN0RXJyb3IAAKYCSGVhcEZyZWUAAKICSGVhcEFsbG9jAF0BR2V0Q1BJbmZvAFQBR2V0QUNQAAAUAkdldE9FTUNQAADaAklzVmFsaWRDb2RlUGFnZQDXAEVuY29kZVBvaW50ZXIAuQBEZWNvZGVQb2ludGVyAEABRmxzR2V0VmFsdWUAQQFGbHNTZXRWYWx1ZQA/AUZsc0ZyZWUA+ANTZXRMYXN0RXJyb3IAAK8BR2V0Q3VycmVudFRocmVhZElkAAA+AUZsc0FsbG9jAACbBFdyaXRlRmlsZQDwAkxvYWRMaWJyYXJ5QQAAugJJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50AEwBRnJlZUVudmlyb25tZW50U3RyaW5nc0EAwQFHZXRFbnZpcm9ubWVudFN0cmluZ3MATQFGcmVlRW52aXJvbm1lbnRTdHJpbmdzVwCIBFdpZGVDaGFyVG9NdWx0aUJ5dGUAwwFHZXRFbnZpcm9ubWVudFN0cmluZ3NXAACqAkhlYXBTZXRJbmZvcm1hdGlvbgAApAJIZWFwQ3JlYXRlAABTA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAGoCR2V0VGlja0NvdW50AACsAUdldEN1cnJlbnRQcm9jZXNzSWQAUwJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCpAkhlYXBSZUFsbG9jAIUBR2V0Q29uc29sZUNQAACXAUdldENvbnNvbGVNb2RlAABDAUZsdXNoRmlsZUJ1ZmZlcnMAAOACTENNYXBTdHJpbmdBAAAZA011bHRpQnl0ZVRvV2lkZUNoYXIA4gJMQ01hcFN0cmluZ1cAAEACR2V0U3RyaW5nVHlwZUEAAEMCR2V0U3RyaW5nVHlwZVcAAOkBR2V0TG9jYWxlSW5mb0EAAOwDU2V0RmlsZVBvaW50ZXIAAKsCSGVhcFNpemUAAEQAQ2xvc2VIYW5kbGUAkARXcml0ZUNvbnNvbGVBAJsBR2V0Q29uc29sZU91dHB1dENQAACaBFdyaXRlQ29uc29sZVcACgRTZXRTdGRIYW5kbGUAAHoAQ3JlYXRlRmlsZUEAUwBDb21wYXJlU3RyaW5nQQAAVgBDb21wYXJlU3RyaW5nVwAA3QNTZXRFbnZpcm9ubWVudFZhcmlhYmxlQQBLRVJORUwzMi5kbGwAAGgDUmVhZEZpbGUAANoDU2V0RW5kT2ZGaWxlAAAmAkdldFByb2Nlc3NIZWFwAADLAUdldEZpbGVBdHRyaWJ1dGVzQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4EUBQAEAAAAAAAAAAAAAAOBFAUABAAAAAQEAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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fBABAHyTAABRlAAAfBABAFSUAADFlAAAfBABAGiWAAD9lgAAmAcBAACXAAA3mAAA0A0BADiYAACLmAAAaA4BAIyYAACAmgAAAA4BAICaAADQmgAAPA8BANCaAAAWmwAAPA8BACSbAADFmwAAGA4BAMibAABKngAAIA4BAEyeAAB8ngAAPA8BAHyeAAA4nwAAmAcBADifAABQoAAAPA4BAFCgAACHoAAAaA4BAIigAACcoQAAcA4BAJyhAAANowAA8BABACCjAADPowAAYAgBANCjAAB8pAAAiA4BAHykAAAApQAAPA8BAAClAACmpQAAmA4BANClAADspwAAyA4BAOynAAA/qAAACA8BAECoAADFqgAAGA8BAByrAAAtrAAA8BABADCsAACLrAAAPA8BAIysAADHrAAARA8BAMisAAADrQAAZAsBAAStAAClrQAAoBABAKitAADbrgAATA8BANyuAABMsAAAeA8BAEywAABbsQAAhA8BAGSxAABWsgAAmA8BAFiyAAAytwAAqA8BADS3AAC9twAAuA0BAMC3AADVuAAAuA0BANi4AACIvAAAyA8BAIi8AAD3vAAAcAwBAPi8AADuvQAA4A8BACS+AAB3vgAAPA8BAHi+AAD3xQAA8A8BAPjFAABqxwAACBABAGzHAABqzwAAOBABAGzPAABZ0AAAWBABAFzQAADx0AAAfBABAPTQAAB10wAAZAcBAHjTAAAQ1QAAhBABABDVAACm1QAAoBABAKjVAAB21gAAsBABAHjWAAC31gAAPA8BALjWAACD2QAAuBABAITZAABg3gAA0BABAGDeAADw3gAAfBABAPDeAADd3wAA4A8BAOjfAACr4QAA8BABAPDhAAA+4gAAgA4BAEDiAABY4gAAjAwBAFjiAAB64gAA1AcBAHriAACW4gAA1AcBAJbiAACv4gAA1AcBAK/iAADV4gAA1AcBAN/iAAD44gAA1AcBAPjiAAAU4wAA1AcBABTjAAAt4wAA1AcBAC3jAABG4wAA1AcBAEbjAABf4wAA1AcBAGbjAAB/4wAA1AcBAH/jAACT4wAA1AcBAKDjAADB4wAA1AcBAMHjAADd4wAAjAwBAN3jAAD/4wAA1AcBAP/jAAAX5AAAjAwBABfkAAAu5AAAjAwBAC7kAABF5AAAjAwBAEXkAABe5AAA1AcBAF7kAAB35AAA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ibXI/f//6XYJAAAPvsKD6CB0SoPoA3Q2g+gIdCVISHQVg+gDD4VXCQAAg43w/f//COlLCQAAg43w/f//BOk/CQAAg43w/f//AekzCQAAgY3w/f//gAAAAOkkCQAAg43w/f//AukYCQAAgPoqdSyDxwSJvdz9//+Lf/w7/om9zP3//w+N+QgAAION8P3//wT3ncz9///p5wgAAIuFzP3//2vACg++yo1ECNCJhcz9///pzAgAAIm16P3//+nBCAAAgPoqdSaDxwSJvdz9//+Lf/w7/om96P3//w+NoggAAION6P3////plggAAIuF6P3//2vACg++yo1ECNCJhej9///pewgAAID6SXRVgPpodESA+mx0GID6dw+FYwgAAIGN8P3//wAIAADpVAgAAIA7bHUWQ4GN8P3//wAQAACJncT9///pOQgAAION8P3//xDpLQgAAION8P3//yDpIQgAAIoDPDZ1HYB7ATR1F0NDgY3w/f//AIAAAImdxP3//+n+BwAAPDN1HYB7ATJ1F0NDgaXw/f///3///4mdxP3//+ndBwAAPGQPhNUHAAA8aQ+EzQcAADxvD4TFBwAAPHUPhL0HAAA8eA+EtQcAADxYD4StBwAAibWU/f//jYWk/f//UA+2wlCJtcj9///oCD0AAFmFwIqF7/3//1l0IouNtP3//4212P3//+ik+///igNDiZ3E/f//hMAPhKT8//+LjbT9//+Ntdj9///ogvv//+lNBwAAD77Cg/hkD4/oAQAAD4R5AgAAg/hTD4/yAAAAD4SAAAAAg+hBdBBISHRYSEh0CEhID4WSBQAAgMIgx4WQ/f//AQAAAIiV7/3//4ON8P3//0A5tej9//+NnfT9//+4AAIAAImd5P3//4mFoP3//w+NSAIAAMeF6P3//wYAAADppQIAAPeF8P3//zAIAAAPhZgAAACBjfD9//8ACAAA6YkAAAD3hfD9//8wCAAAdQqBjfD9//8ACAAAi43o/f//g/n/dQW5////f4PHBPeF8P3//xAIAACJvdz9//+Lf/yJveT9//8PhLEEAAA7/nULoZQSQQCJheT9//+LheT9///Hhcj9//8BAAAA6X8EAACD6FgPhNoCAABISHR5K8EPhCf///9ISA+FngQAAIPHBPeF8P3//xAIAACJvdz9//90MA+3R/xQaAACAACNhfT9//9QjYXg/f//UOhLOwAAg8QQhcB0H8eFwP3//wEAAADrE4pH/IiF9P3//8eF4P3//wEAAACNhfT9//+JheT9///pNQQAAIsHg8cEib3c/f//O8Z0O4tIBDvOdDT3hfD9//8ACAAAD78AiY3k/f//dBSZK8LR+MeFyP3//wEAAADp8AMAAIm1yP3//+nlAwAAoZASQQCJheT9//9Q6MI4AABZ6c4DAACD+HAPj/sBAAAPhOMBAACD+GUPjLwDAACD+GcPjjT+//+D+Gl0cYP4bnQog/hvD4WgAwAA9oXw/f//gMeF4P3//wgAAAB0YYGN8P3//wACAADrVYs3g8cEib3c/f//6Do4AACFwA+EL/r///aF8P3//yB0DGaLhdj9//9miQbrCIuF2P3//4kGx4XA/f//AQAAAOmmBAAAg43w/f//QMeF4P3//woAAACLjfD9///3wQCAAAAPhKkBAACLB4tXBIPHCOnVAQAAdRGA+md1ZceF6P3//wEAAADrWTmF6P3//34GiYXo/f//gb3o/f//owAAAH4/i7Xo/f//gcZdAQAAVugiCwAAipXv/f//WYmFvP3//4XAdBCJheT9//+JtaD9//+L2OsKx4Xo/f//owAAADP2iweDxwiJhYj9//+LR/yJhYz9//+NhaT9//9Q/7WQ/f//D77C/7Xo/f//ib3c/f//UP+1oP3//42FiP3//1NQ/zVYHEEA6EEgAABZ/9CLvfD9//+DxByB54AAAAB0IDm16P3//3UYjYWk/f//UFP/NWQcQQDoEiAAAFn/0FlZgL3v/f//Z3UcO/51GI2FpP3//1BT/zVgHEEA6O0fAABZ/9BZWYA7LXURgY3w/f//AAEAAEOJneT9//9T6QP+///Hhej9//8IAAAAiY24/f//6ySD6HMPhLb8//9ISA+Eif7//4PoAw+FtgEAAMeFuP3//ycAAAD2hfD9//+Ax4Xg/f//EAAAAA+Eaf7//4qFuP3//wRRxoXU/f//MIiF1f3//8eF0P3//wIAAADpRf7///fBABAAAA+FS/7//4PHBPbBIHQYib3c/f//9sFAdAYPv0f86wQPt0f8mesTi0f89sFAdAOZ6wIz0om93P3///bBQHQbO9Z/F3wEO8ZzEffYg9IA99qBjfD9//8AAQAA94Xw/f//AJAAAIvai/h1AjPbg73o/f//AH0Mx4Xo/f//AQAAAOsag6Xw/f//97gAAgAAOYXo/f//fgaJhej9//+LxwvDdQYhhdD9//+NdfOLhej9////jej9//+FwH8Gi8cLw3Qti4Xg/f//mVJQU1fo5DcAAIPBMIP5OYmdoP3//4v4i9p+BgONuP3//4gOTuu9jUXzK8ZG94Xw/f//AAIAAImF4P3//4m15P3//3RhhcB0B4vOgDkwdFb/jeT9//+LjeT9///GATBA6z5JZjkwdAZAQDvOdfQrheT9///R+OsoO/51C6GQEkEAiYXk/f//i4Xk/f//6wdJgDgAdAVAO8519SuF5P3//4mF4P3//4O9wP3//wAPhVwBAACLhfD9//+oQHQyqQABAAB0CcaF1P3//y3rGKgBdAnGhdT9//8r6wuoAnQRxoXU/f//IMeF0P3//wEAAACLncz9//8rneD9//8rndD9///2hfD9//8MdRf/tbT9//+Nhdj9//9TaiDocPX//4PEDP+10P3//4u9tP3//42F2P3//42N1P3//+h29f//9oXw/f//CFl0G/aF8P3//wR1EldTajCNhdj9///oLvX//4PEDIO9yP3//wCLheD9//90ZoXAfmKLteT9//+JhaD9//8Ptwb/jaD9//9QagaNRfRQjYWY/f//RlBG6OU1AACDxBCFwHUoOYWY/f//dCD/tZj9//+Nhdj9//+NTfTo8fT//4O9oP3//wBZdbXrHION2P3////rE4uN5P3//1CNhdj9///oyvT//1mDvdj9//8AfBv2hfD9//8EdBJXU2ogjYXY/f//6IL0//+DxAyDvbz9//8AdBP/tbz9///oCAgAAIOlvP3//wBZi53E/f//igOIhe/9//+EwHQTi42U/f//i73c/f//itDp4fX//4C9sP3//wB0CouFrP3//4NgcP2Lhdj9//+LTfxfXjPNW+ja6///ycOQFitAABcpQABHKUAApSlAAPEpQAD8KUAAQipAAHArQABqVGhY9UAA6GUEAAAz/4l9/I1FnFD/FTTgQADHRfz+////akBqIF5W6HkGAABZWTvHD4QUAgAAo6AqQQCJNZAqQQCNiAAIAADrMMZABACDCP/GQAUKiXgIxkAkAMZAJQrGQCYKiXg4xkA0AIPAQIsNoCpBAIHBAAgAADvBcsxmOX3OD4QKAQAAi0XQO8cPhP8AAACLOI1YBI0EO4lF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GQAAah7oAhgAAGj/AAAA6FDj//9ZWYt1CI009UgUQQA5HnQEi8frbmoY6An7//9Zi/g7+3UP6MH4///HAAwAAAAzwOtRagroWQAAAFmJXfw5HnUsaKAPAABX6HQgAABZWYXAdRdX6P77//9Z6Iv4///HAAwAAACJXeTrC4k+6wdX6OP7//9Zx0X8/v///+gJAAAAi0Xk6PL4///DagroKP///1nDi/9Vi+yLRQhWjTTFSBRBAIM+AHUTUOgi////WYXAdQhqEehE4v//Wf82/xUY4EAAXl3DagxoAPZAAOhk+P//i00IM/87z3YuauBYM9L38TtFDBvAQHUf6Pv3///HAAwAAABXV1dXV+iD9///g8QUM8Dp1QAAAA+vTQyL8Yl1CDv3dQMz9kYz24ld5IP+4Hdpgz2EKkEAA3VLg8YPg+bwiXUMi0UIOwVwKkEAdzdqBOhM////WYl9/P91COhINgAAWYlF5MdF/P7////oXwAAAItd5DvfdBH/dQhXU+gG2///g8QMO991YVZqCP81dClBAP8VZOBAAIvYO991TDk9gClBAHQzVuiSHwAAWYXAD4Vy////i0UQO8cPhFD////HAAwAAADpRf///zP/i3UMagTo8P3//1nDO991DYtFEDvHdAbHAAwAAACLw+iY9///w1WL7IPsBIl9/It9CItNDMHpB2YP78DrCI2kJAAAAACQZg9/B2YPf0cQZg9/RyBmD39HMGYPf0dAZg9/R1BmD39HYGYPf0dwjb+AAAAASXXQi338i+Vdw1WL7IPsEIl9/ItFCJmL+DP6K/qD5w8z+iv6hf91PItNEIvRg+J/iVX0O8p0EivKUVDoc////4PECItFCItV9IXSdEUDRRArwolF+DPAi334i03086qLRQjrLvffg8cQiX3wM8CLfQiLTfDzqotF8ItNCItVEAPIK9BSagBR6H7///+DxAyLRQiLffyL5V3DagxoIPZAAOhg9v//g2X8AGYPKMHHReQBAAAA6yOLReyLAIsAPQUAAMB0Cj0dAADAdAMzwMMzwEDDi2Xog2XkAMdF/P7///+LReToYvb//8OL/1WL7IPsGDPAU4lF/IlF9IlF+FOcWIvINQAAIABQnZxaK9F0H1GdM8APoolF9Ild6IlV7IlN8LgBAAAAD6KJVfyJRfhb90X8AAAABHQO6Fz///+FwHQF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hiADAADrBou1KOX//4uNPOX//4OlROX//wArjTTl//+NhUjl//87TRBzOYuVPOX///+FPOX//4oSQYD6CnUQ/4Uw5f//xgANQP+FROX//4gQQP+FROX//4G9ROX///8TAABywovYjYVI5f//K9hqAI2FLOX//1BTjYVI5f//UIsG/zQH/xWY4EAAhcAPhEICAACLhSzl//8BhTjl//87ww+MOgIAAIuFPOX//yuFNOX//ztFEA+CTP///+kgAgAAiYVE5f//gPsCD4XRAAAAOU0QD4ZNAgAA6waLtSjl//+LjUTl//+DpTzl//8AK4005f//jYVI5f//O00Qc0aLlUTl//+DhUTl//8CD7cSQUFmg/oKdRaDhTDl//8Cag1bZokYQECDhTzl//8Cg4U85f//AmaJEEBAgb085f///hMAAHK1i9iNhUjl//8r2GoAjYUs5f//UFONhUjl//9Qiwb/NAf/FZjgQACFwA+EYgEAAIuFLOX//wGFOOX//zvDD4xaAQAAi4VE5f//K4U05f//O0UQD4I/////6UABAAA5TRAPhnwBAACLjUTl//+DpTzl//8AK4005f//agKNhUj5//9eO00QczyLlUTl//8PtxIBtUTl//8DzmaD+gp1DmoNW2aJGAPGAbU85f//AbU85f//ZokQA8aBvTzl//+oBgAAcr8z9lZWaFUNAACNjfDr//9RjY1I+f//K8GZK8LR+FCLwVBWaOn9AAD/FbDgQACL2DveD4SXAAAAagCNhSzl//9Qi8MrxlCNhDXw6///UIuFKOX//4sA/zQH/xWY4EAAhcB0DAO1LOX//zvef8vrDP8VXOBAAImFQOX//zvef1yLhUTl//8rhTTl//+JhTjl//87RRAPggr////rP2oAjY0s5f//Uf91EP+1NOX///8w/xWY4EAAhcB0FYuFLOX//4OlQOX//wCJhTjl///rDP8VXOBAAImFQOX//4O9OOX//wB1bIO9QOX//wB0LWoFXjm1QOX//3UU6LK2///HAAkAAADourb//4kw6z//tUDl///ovrb//1nrMYu1KOX//4sG9kQHBEB0D4uFNOX//4A4GnUEM8DrJOhytv//xwAcAAAA6Hq2//+DIACDyP/rDIuFOOX//yuFMOX//19bi038M81e6Nid///Jw2oQaPD3QADohLb//4tFCIP4/nUb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r////3YM6Aav////dhDo/q7///92FOj2rv///3YY6O6u////Nujnrv///3Yg6N+u////diTo167///92KOjPrv///3Ys6Meu////djDov67///92NOi3rv///3Yc6K+u////djjop67///92POifrv//g8RA/3ZA6JSu////dkTojK7///92SOiErv///3ZM6Hyu////dlDodK7///92VOhsrv///3ZY6GSu////dlzoXK7///92YOhUrv///3Zk6Eyu////dmjoRK7///92bOg8rv///3Zw6DSu////dnToLK7///92eOgkrv///3Z86Byu//+DxED/toAAAADoDq7///+2hAAAAOgDrv///7aIAAAA6Pit////towAAADo7a3///+2kAAAAOjirf///7aUAAAA6Net////tpgAAADozK3///+2nAAAAOjBrf///7agAAAA6Lat////tqQAAADoq63///+2qAAAAOigrf//g8QsXl3Di/9Vi+xWi3UIhfZ0NYsGOwVIHUEAdAdQ6H2t//9Zi0YEOwVMHUEAdAdQ6Gut//9Zi3YIOzVQHUEAdAdW6Fmt//9ZXl3Di/9Vi+xWi3UIhfZ0fotGDDsFVB1BAHQHUOg3rf//WYtGEDsFWB1BAHQHUOglrf//WYtGFDsFXB1BAHQHUOgTrf//WYtGGDsFYB1BAHQHUOgBrf//WYtGHDsFZB1BAHQHUOjvrP//WYtGIDsFaB1BAHQHUOjdrP//WYt2JDs1bB1BAHQHVujLrP//WV5dw4v/VYvsi0UIUzPbVlc7w3QHi30MO/t3G+g9qf//ahZeiTBTU1NTU+jGqP//g8QUi8brPIt1EDvzdQSIGOvai9A4GnQEQk91+Dv7dO6KDogKQkY6y3QDT3XzO/t1EIgY6Pao//9qIlmJCIvx67UzwF9eW13DzMzMzMzMVYvsVjPAUFBQUFBQUFCLVQyNSQCKAgrAdAmDwgEPqwQk6/GLdQiDyf+NSQCDwQGKBgrAdAmDxgEPowQkc+6LwYPEIF7Jw4v/VYvsU1aLdQgz21c5XRR1EDvzdRA5XQx1EjPAX15bXcM783QHi30MO/t3G+hoqP//ahZeiTBTU1NTU+jxp///g8QUi8br1TldFHUEiB7ryotVEDvTdQSIHuvRg30U/4vGdQ+KCogIQEI6y3QeT3Xz6xmKCogIQEI6y3QIT3QF/00Ude45XRR1AogYO/t1i4N9FP91D4tFDGpQiFwG/1jpeP///4ge6O6n//9qIlmJCIvx64KL/1WL7ItNCFMz21ZXO8t0B4t9DDv7dxvoyKf//2oWXokwU1NTU1PoUaf//4PEFIvG6zCLdRA783UEiBnr2ovRigaIAkJGOsN0A0918zv7dRCIGeiNp///aiJZiQiL8evBM8BfXltdw8zMzMzMzMzMzMzMzMyLVCQEi0wkCPfCAwAAAHU8iwI6AXUuCsB0JjphAXUlCuR0HcHoEDpBAnUZCsB0ETphA3UQg8EEg8IECuR10ov/M8DDkBvA0eCDwAHD98IBAAAAdBiKAoPCAToBdeeDwQEKwHTc98ICAAAAdKRmiwKDwgI6AXXOCsB0xjphAXXFCuR0vYPBAuuIzMzMzMzMzMxVi+xXVot1DItNEIt9CIvBi9EDxjv+dgg7+A+CpAEAAIH5AAEAAHIfgz2IKkEAAHQWV1aD5w+D5g87/l5fdQheX13pLBoAAPfHAwAAAHUVwekCg+IDg/kIcirzpf8kleSRQACQi8e6AwAAAIPpBHIMg+ADA8j/JIX4kEAA/ySN9JFAAJD/JI14kUAAkAiRQAA0kUAAWJFAACPRigaIB4pGAYhHAYpGAsHpAohHAoPGA4PHA4P5CHLM86X/JJXkkUAAjUkAI9GKBogHikYBwekCiEcBg8YCg8cCg/kIcqbzpf8kleSRQACQI9GKBogHg8YBwekCg8cBg/kIcojzpf8kleSRQACNSQDbkUAAyJFAAMCRQAC4kUAAsJFAAKiRQACgkUAAmJFAAItEjuSJRI/ki0SO6IlEj+iLRI7siUSP7ItEjvCJRI/wi0SO9IlEj/SLRI74iUSP+ItEjvyJRI/8jQSNAAAAAAPwA/j/JJXkkUAAi//0kUAA/JFAAAiSQAAckkAAi0UIXl/Jw5CKBogHi0UIXl/Jw5CKBogHikYBiEcBi0UIXl/Jw41JAIoGiAeKRgGIRwGKRgKIRwKLRQheX8nDkI10MfyNfDn898cDAAAAdSTB6QKD4gOD+QhyDf3zpfz/JJWAk0AAi//32f8kjTCTQACNSQCLx7oDAAAAg/kEcgyD4AMryP8khYSSQAD/JI2Ak0AAkJSSQAC4kkAA4JJAAIpGAyPRiEcDg+4BwekCg+8Bg/kIcrL986X8/ySVgJNAAI1JAIpGAyPRiEcDikYCwekCiEcCg+4Cg+8Cg/kIcoj986X8/ySVgJNAAJCKRgMj0YhHA4pGAohHAopGAcHpAohHAYPuA4PvA4P5CA+CVv////3zpfz/JJWAk0AAjUkANJNAADyTQABEk0AATJNAAFSTQABck0AAZJNAAHeTQACLRI4ciUSPHItEjhiJRI8Yi0SOFIlEjxSLRI4QiUSPEItEjgyJRI8Mi0SOCIlEjwiLRI4EiUSPBI0EjQAAAAAD8AP4/ySVgJNAAIv/kJNAAJiTQACok0AAvJNAAItFCF5fycOQikYDiEcDi0UIXl/Jw41JAIpGA4hHA4pGAohHAotFCF5fycOQikYDiEcDikYCiEcCikYBiEcBi0UIXl/Jw8zMzMzMzMzMzMzMVYvsVjPAUFBQUFBQUFCLVQyNSQCKAgrAdAmDwgEPqwQk6/GLdQiL/4oGCsB0DIPGAQ+jBCRz8Y1G/4PEIF7Jw4v/VYvsUVGLRQxWi3UIiUX4i0UQV1aJRfzoFBEAAIPP/1k7x3UR6AWj///HAAkAAACLx4vX60r/dRSNTfxR/3X4UP8VAOFAAIlF+DvHdRP/FVzgQACFwHQJUOj3ov//WevPi8bB+AWLBIWgKkEAg+YfweYGjUQwBIAg/YtF+ItV/F9eycNqFGgw+EAA6Oui//+Dzv+JddyJdeCLRQiD+P51HOicov//gyAA6IGi///HAAkAAACLxovW6dAAAAAz/zvHfAg7BZAqQQByIehyov//iTjoWKL//8cACQAAAFdXV1dX6OCh//+DxBTryIvIwfkFjRyNoCpBAIvwg+YfweYGiwsPvkwxBIPhAXUm6DGi//+JOOgXov//xwAJAAAAV1dXV1fon6H//4PEFIPK/4vC61tQ6HAQAABZiX38iwP2RDAEAXQc/3UU/3UQ/3UM/3UI6Kn+//+DxBCJRdyJVeDrGujJof//xwAJAAAA6NGh//+JOINN3P+DTeD/x0X8/v///+gMAAAAi0Xci1Xg6C6i///D/3UI6K0QAABZw4v/VYvs/wUEIEEAaAAQAADouaP//1mLTQiJQQiFwHQNg0kMCMdBGAAQAADrEYNJDASNQRSJQQjHQRgCAAAAi0EIg2EEAIkBXcOL/1WL7IPsFFNWV+gCuf//g2X8AIM9kClBAACL2A+FjgAAAGgA9EAA/xWc4EAAi/iF/w+EKgEAAIs1KOBAAGj080AAV//WhcAPhBQBAABQ6Ey4///HBCTk80AAV6OQKUEA/9ZQ6De4///HBCTQ80AAV6OUKUEA/9ZQ6CK4///HBCS080AAV6OYKUEA/9ZQ6A24//9Zo6ApQQCFwHQUaJzzQABX/9ZQ6PW3//9Zo5wpQQChnClBADvDdE85HaApQQB0R1DoU7j///81oClBAIvw6Ea4//9ZWYv4hfZ0LIX/dCj/1oXAdBmNTfhRagyNTexRagFQ/9eFwHQG9kX0AXUJgU0QAAAgAOs5oZQpQQA7w3QwUOgDuP//WYXAdCX/0IlF/IXAdByhmClBADvDdBNQ6Oa3//9ZhcB0CP91/P/QiUX8/zWQKUEA6M63//9ZhcB0EP91EP91DP91CP91/P/Q6wIzwF9eW8nDi/9Vi+yLTQhWM/Y7znweg/kCfgyD+QN1FKFEIEEA6yihRCBBAIkNRCBBAOsb6K6f//9WVlZWVscAFgAAAOg2n///g8QUg8j/Xl3DahBoUPhAAOjVn///M8CLXQgz/zvfD5XAO8d1Heh0n///xwAWAAAAV1dXV1fo/J7//4PEFIPI/+tTgz2EKkEAA3U4agTo9ab//1mJffxT6BTW//9ZiUXgO8d0C4tz/IPuCYl15OsDi3Xkx0X8/v///+glAAAAOX3gdRBTV/81dClBAP8VBOFAAIvwi8bolZ///8Mz/4tdCIt15GoE6MOl//9Zw2oC6P+I//9Zw4v/VYvsgewoAwAAoYASQQAzxYlF/PYFkB1BAAFWdAhqCujTvf//WeiqxP//hcB0CGoW6KzE//9Z9gWQHUEAAg+EygAAAImF4P3//4mN3P3//4mV2P3//4md1P3//4m10P3//4m9zP3//2aMlfj9//9mjI3s/f//ZoydyP3//2aMhcT9//9mjKXA/f//ZoytvP3//5yPhfD9//+LdQSNRQSJhfT9///HhTD9//8BAAEAibXo/f//i0D8alCJheT9//+Nhdj8//9qAFDoqoH//42F2Pz//4PEDImFKP3//42FMP3//2oAx4XY/P//FQAAQIm15Pz//4mFLP3///8VVOBAAI2FKP3//1D/FVDgQABqA+htiv//zMzMVYvsU1ZXVWoAagBomJlAAP91COhWIgAAXV9eW4vlXcOLTCQE90EEBgAAALgBAAAAdDKLRCQUi0j8M8joIoX//1WLaBCLUChSi1AkUugUAAAAg8QIXYtEJAiLVCQQiQK4AwAAAMNTVleLRCQQVVBq/migmUAAZP81AAAAAKGAEkEAM8RQjUQkBGSjAAAAAItEJCiLWAiLcAyD/v90OoN8JCz/dAY7dCQsdi2NNHaLDLOJTCQMiUgMg3yzBAB1F2gBAQAAi0SzCOhJAAAAi0SzCOhfAAAA67eLTCQEZIkNAAAAAIPEGF9eW8MzwGSLDQAAAACBeQSgmUAAdRCLUQyLUgw5UQh1BbgBAAAAw1NRu5QdQQDrC1NRu5QdQQCLTCQMiUsIiUMEiWsMVVFQWFldWVvCBAD/0MOL/1WL7IPsFFZX/3UIjU3s6CWE//+LRRCLdQwz/zvHdAKJMDv3dSzobZz//1dXV1dXxwAWAAAA6PWb//+DxBSAffgAdAeLRfSDYHD9M8Dp2AEAADl9FHQMg30UAnzJg30UJH/Di03sU4oeiX38jX4Bg7msAAAAAX4XjUXsUA+2w2oIUOgFuf//i03sg8QM6xCLkcgAAAAPtsMPtwRCg+AIhcB0BYofR+vHgPstdQaDTRgC6wWA+yt1A4ofR4tFFIXAD4xLAQAAg/gBD4RCAQAAg/gkD485AQAAhcB1KoD7MHQJx0UUCgAAAOs0igc8eHQNPFh0CcdFFAgAAADrIcdFFBAAAADrCoP4EHUTgPswdQ6KBzx4dAQ8WHUER4ofR4uxyAAAALj/////M9L3dRQPtssPtwxO9sEEdAgPvsuD6TDrG/fBAwEAAHQxisuA6WGA+RkPvst3A4PpIIPByTtNFHMZg00YCDlF/HIndQQ7ynYhg00YBIN9EAB1I4tFGE+oCHUgg30QAHQDi30Mg2X8AOtbi138D69dFAPZiV38ih9H64u+////f6gEdRuoAXU9g+ACdAmBffwAAACAdwmFwHUrOXX8dibozJr///ZFGAHHACIAAAB0BoNN/P/rD/ZFGAJqAFgPlcADxolF/ItFEIXAdAKJOPZFGAJ0A/dd/IB9+AB0B4tF9INgcP2LRfzrGItFEIXAdAKJMIB9+AB0B4tF9INgcP0zwFtfXsnDi/9Vi+wzwFD/dRD/dQz/dQg5BegkQQB1B2h4G0EA6wFQ6Kv9//+DxBRdw8zMzMzMzMzMzMzMzMzMzFWL7FdWi3UMi00Qi30Ii8GL0QPGO/52CDv4D4KkAQAAgfkAAQAAch+DPYgqQQAAdBZXVoPnD4PmDzv+Xl91CF5fXel8DQAA98cDAAAAdRXB6QKD4gOD+QhyKvOl/ySVlJ5AAJCLx7oDAAAAg+kEcgyD4AMDyP8khaidQAD/JI2knkAAkP8kjSieQACQuJ1AAOSdQAAInkAAI9GKBogHikYBiEcBikYCwekCiEcCg8YDg8cDg/kIcszzpf8klZSeQACNSQAj0YoGiAeKRgHB6QKIRwGDxgKDxwKD+QhypvOl/ySVlJ5AAJAj0YoGiAeDxgHB6QKDxwGD+QhyiPOl/ySVlJ5AAI1JAIueQAB4nkAAcJ5AAGieQABgnkAAWJ5AAFCeQABInkAAi0SO5IlEj+SLRI7oiUSP6ItEjuyJRI/si0SO8IlEj/CLRI70iUSP9ItEjviJRI/4i0SO/IlEj/yNBI0AAAAAA/AD+P8klZSeQACL/6SeQACsnkAAuJ5AAMyeQACLRQheX8nDkIoGiAeLRQheX8nDkIoGiAeKRgGIRwGLRQheX8nDjUkAigaIB4pGAYhHAYpGAohHAotFCF5fycOQjXQx/I18Ofz3xwMAAAB1JMHpAoPiA4P5CHIN/fOl/P8klTCgQACL//fZ/ySN4J9AAI1JAIvHugMAAACD+QRyDIPgAyvI/ySFNJ9AAP8kjTCgQACQRJ9AAGifQACQn0AAikYDI9GIRwOD7gHB6QKD7wGD+Qhysv3zpfz/JJUwoEAAjUkAikYDI9GIRwOKRgLB6QKIRwKD7gKD7wKD+QhyiP3zpfz/JJUwoEAAkIpGAyPRiEcDikYCiEcCikYBwekCiEcBg+4Dg+8Dg/kID4JW/////fOl/P8klTCgQACNSQDkn0AA7J9AAPSfQAD8n0AABKBAAAygQAAUoEAAJ6BAAItEjhyJRI8ci0SOGIlEjxiLRI4UiUSPFItEjhCJRI8Qi0SODIlEjwyLRI4IiUSPCItEjgSJRI8EjQSNAAAAAAPwA/j/JJUwoEAAi/9AoEAASKBAAFigQABsoEAAi0UIXl/Jw5CKRgOIRwOLRQheX8nDjUkAikYDiEcDikYCiEcCi0UIXl/Jw5CKRgOIRwOKRgKIRwKKRgGIRwGLRQheX8nDi/9Vi+xWi3UIV1bovQQAAFmD+P90UKGgKkEAg/4BdQn2gIQAAAABdQuD/gJ1HPZARAF0FmoC6JIEAABqAYv46IkEAABZWTvHdBxW6H0EAABZUP8VCOFAAIXAdQr/FVzgQACL+OsCM/9W6NkDAACLxsH4BYsEhaAqQQCD5h/B5gZZxkQwBACF/3QMV+hhlv//WYPI/+sCM8BfXl3DahBocPhAAOhvlv//i0UIg/j+dRvoKZb//4MgAOgOlv//xwAJAAAAg8j/6Y4AAAAz/zvHfAg7BZAqQQByIegAlv//iTjo5pX//8cACQAAAFdXV1dX6G6V//+DxBTryYvIwfkFjRyNoCpBAIvwg+YfweYGiwsPvkwxBIPhAXS/UOgkBAAAWYl9/IsD9kQwBAF0Dv91COjL/v//WYlF5OsP6IuV///HAAkAAACDTeT/x0X8/v///+gJAAAAi0Xk6P6V///D/3UI6H0EAABZw4v/VYvsVot1CItGDKiDdB6oCHQa/3YI6LOY//+BZgz3+///M8BZiQaJRgiJRgReXcOL/1WL7IPsEKGAEkEAM8WJRfxWM/Y5NbAdQQB0T4M9dB5BAP51BejiCgAAoXQeQQCD+P91B7j//wAA63BWjU3wUWoBjU0IUVD/FRThQACFwHVngz2wHUEAAnXa/xVc4EAAg/h4dc+JNbAdQQBWVmoFjUX0UGoBjUUIUFb/FRDhQABQ/xWw4EAAiw10HkEAg/n/dKJWjVXwUlCNRfRQUf8VDOFAAIXAdI1mi0UIi038M81e6Ax8///Jw8cFsB1BAAEAAADr44v/VYvsg+wQU1aLdQwz2zvzdBU5XRB0EDgedRKLRQg7w3QFM8lmiQgzwF5bycP/dRSNTfDo1Hv//4tF8DlYFHUfi0UIO8N0B2YPtg5miQg4Xfx0B4tF+INgcP0zwEDryo1F8FAPtgZQ6OPE//9ZWYXAdH2LRfCLiKwAAACD+QF+JTlNEHwgM9I5XQgPlcJS/3UIUVZqCf9wBP8V7OBAAIXAi0XwdRCLTRA7iKwAAAByIDheAXQbi4CsAAAAOF38D4Rl////i034g2Fw/elZ////6JaT///HACoAAAA4Xfx0B4tF+INgcP2DyP/pOv///zPAOV0ID5XAUP91CItF8GoBVmoJ/3AE/xXs4EAAhcAPhTr////ruov/VYvsagD/dRD/dQz/dQjo1P7//4PEEF3DzMzMzMzMzMzMzMxRjUwkBCvIG8D30CPIi8QlAPD//zvIcgqLwVmUiwCJBCTDLQAQAACFAOvpi/9Vi+yLRQhWV4XAfFk7BZAqQQBzUYvIwfkFi/CD5h+NPI2gKkEAiw/B5gaDPA7/dTWDPYwSQQABU4tdDHUeg+gAdBBIdAhIdRNTavTrCFNq9esDU2r2/xUY4UAAiweJHAYzwFvrFuiZkv//xwAJAAAA6KGS//+DIACDyP9fXl3Di/9Vi+yLTQhTM9s7y1ZXfFs7DZAqQQBzU4vBwfgFi/GNPIWgKkEAiweD5h/B5gYDxvZABAF0NYM4/3Qwgz2MEkEAAXUdK8t0EEl0CEl1E1Nq9OsIU2r16wNTavb/FRjhQACLB4MMBv8zwOsV6BOS///HAAkAAADoG5L//4kYg8j/X15bXcOL/1WL7ItFCIP4/nUY6P+R//+DIADo5JH//8cACQAAAIPI/13DVjP2O8Z8IjsFkCpBAHMai8iD4B/B+QWLDI2gKkEAweAGA8H2QAQBdSTovpH//4kw6KSR//9WVlZWVscACQAAAOgskf//g8QUg8j/6wKLAF5dw2oMaJD4QADox5H//4t9CIvHwfgFi/eD5h/B5gYDNIWgKkEAx0XkAQAAADPbOV4IdTZqCuj4mP//WYld/DleCHUaaKAPAACNRgxQ6A+5//9ZWYXAdQOJXeT/RgjHRfz+////6DAAAAA5XeR0HYvHwfgFg+cfwecGiwSFoCpBAI1EOAxQ/xUY4EAAi0Xk6IeR///DM9uLfQhqCui4l///WcOL/1WL7ItFCIvIg+AfwfkFiwyNoCpBAMHgBo1EAQxQ/xUc4EAAXcNqGGiw+EAA6ACR//+DTeT/M/+JfdxqC+iKl///WYXAdQiDyP/pYgEAAGoL6DmY//9ZiX38iX3Yg/9AD408AQAAizS9oCpBAIX2D4S6AAAAiXXgiwS9oCpBAAUACAAAO/APg5cAAAD2RgQBdVyDfggAdTlqCujwl///WTPbQ4ld/IN+CAB1HGigDwAAjUYMUOgDuP//WVmFwHUFiV3c6wP/RgiDZfwA6CgAAACDfdwAdReNXgxT/xUY4EAA9kYEAXQbU/8VHOBAAIPGQOuCi33Yi3XgagrotZb//1nDg33cAHXmxkYEAYMO/ys0vaAqQQDB/gaLx8HgBQPwiXXkg33k/3V5R+kr////akBqIOgvkv//WVmJReCFwHRhjQy9oCpBAIkBgwWQKkEAIIsRgcIACAAAO8JzF8ZABACDCP/GQAUKg2AIAIPAQIlF4OvdwecFiX3ki8fB+AWLz4PhH8HhBosEhaAqQQDGRAgEAVfoxv3//1mFwHUEg03k/8dF/P7////oCQAAAItF5OjBj///w2oL6PeV//9Zw4v/VYvsg+wMoYASQQAzxYlF/GoGjUX0UGgEEAAA/3UIxkX6AP8V/OBAAIXAdQWDyP/rCo1F9FDoYAMAAFmLTfwzzehxdv//ycOL/1WL7IPsNKGAEkEAM8WJRfyLRRCLTRiJRdiLRRRTiUXQiwBWiUXci0UIVzP/iU3MiX3giX3UO0UMD4RfAQAAizVo4EAAjU3oUVD/1osd7OBAAIXAdF6DfegBdViNRehQ/3UM/9aFwHRLg33oAXVFi3Xcx0XUAQAAAIP+/3UM/3XY6Ca9//+L8FlGO/d+W4H+8P//f3dTjUQ2CD0ABAAAdy/oFgEAAIvEO8d0OMcAzMwAAOstV1f/ddz/ddhqAf91CP/Ti/A793XDM8Dp0QAAAFDoeMH//1k7x3QJxwDd3QAAg8AIiUXk6wOJfeQ5feR02I0ENlBX/3Xk6G5x//+DxAxW/3Xk/3Xc/3XYagH/dQj/04XAdH+LXcw733QdV1f/dRxTVv915Ff/dQz/FbDgQACFwHRgiV3g61uLHbDgQAA5fdR1FFdXV1dW/3XkV/91DP/Ti/A793Q8VmoB6PyP//9ZWYlF4DvHdCtXV1ZQVv915Ff/dQz/0zvHdQ7/deDoxZD//1mJfeDrC4N93P90BYtN0IkB/3Xk6Hfb//9Zi0XgjWXAX15bi038M83ovXT//8nDzMzMzMzMzMzMUY1MJAgryIPhDwPBG8kLwVnp2vn//1GNTCQIK8iD4QcDwRvJC8FZ6cT5//9Vi+yD7AiJffyJdfiLdQyLfQiLTRDB6QfrBo2bAAAAAGYPbwZmD29OEGYPb1YgZg9vXjBmD38HZg9/TxBmD39XIGYPf18wZg9vZkBmD29uUGYPb3ZgZg9vfnBmD39nQGYPf29QZg9/d2BmD39/cI22gAAAAI2/gAAAAEl1o4t1+It9/IvlXcNVi+yD7ByJffSJdfiJXfyLXQyLw5mLyItFCDPKK8qD4Q8zyivKmYv4M/or+oPnDzP6K/qL0QvXdUqLdRCLzoPhf4lN6DvxdBMr8VZTUOgn////g8QMi0UIi03ohcl0d4tdEItVDAPTK9GJVewD2CvZiV3wi3Xsi33wi03o86SLRQjrUzvPdTX32YPBEIlN5It1DIt9CItN5POki00IA03ki1UMA1Xki0UQK0XkUFJR6Ez///+DxAyLRQjrGot1DIt9CItNEIvRwekC86WLyoPhA/Oki0UIi138i3X4i330i+Vdw4v/VYvsagpqAP91COgP8f//g8QMXcOL/1WL7IPsEFMz21ZXOV0QD4TVAAAA/3UUjU3w6PRy//85XQh1LuhJi///U1NTU1PHABYAAADo0Yr//4PEFDhd/HQHi0X4g2Bw/bj///9/6ZkAAACLfQw7+3TLvv///385dRB2KOgKi///U1NTU1PHABYAAADokor//4PEFDhd/HQHi0X4g2Bw/YvG62CLRfA5WBR1Hf91EFf/dQjogwMAAIPEDDhd/HREi034g2Fw/es7i0UID7YAjU3wUVDoRwIAAP9FCIvwD7YHjU3wUVDoNQIAAIPEEEf/TRB0CDvzdAQ78HTNK/CLxuu5M8BfXlvJw4v/VYvsVjP2OTXoJEEAdTk5dQh1H+hoiv//VlZWVlbHABYAAADo8In//4PEFLj///9/6yc5dQx03IF9EP///393015d6ekCAABW/3UQ/3UM/3UI6Lb+//+DxBBeXcMzwFBQagNQagNoAAAAQGhM9EAA/xUc4UAAo3QeQQDDoXQeQQBWizUI4UAAg/j/dAiD+P50A1D/1qFwHkEAg/j/dAiD+P50A1D/1l7Di/9Vi+yDPaQrQQAAVos1GCBBAHUEM8DrY1eF9nUbOTUgIEEAdFPoxgMAAIXAdUqLNRggQQCF9nRAg30IAHQ6/3UI6GG4//9Zi/jrJ1DoVrj//1k7x3YZiwaAPDg9dRFX/3UIUOhuAwAAg8QMhcB0D4PGBIsGhcB10zPAX15dw4sGjUQ4Aev0ahBo2PhAAOiRif//agfo55D//1kz9ol1/DPAi10IO94PlcA7xnUf6CWJ//9qFl+JOFZWVlZW6K6I//+DxBSJfeTpggAAAIkzi0UMO8Z0AokwM8A5dRAPlcA7xnTK/3UQ6BT///9ZiUXgO8Z0WFDorrf//4v4R2oBV+gebP//g8QMiQM7xnUX6MWI///HAAwAAADouoj//4sAiUXk6yr/deBXUOjE4P//g8QMO8Z0DVZWVlZW6AiH//+DxBSLRQw7xnQCiTiJdeTHRfz+////6AkAAACLReToBon//8NqB+g8j///WcOL/1WL7IPsGFNW/3UMjU3o6Pdv//+LXQi+AAEAADvec1SLTeiDuawAAAABfhSNRehQagFT6Cal//+LTeiDxAzrDYuByAAAAA+3BFiD4AGFwHQPi4HMAAAAD7YEGOmjAAAAgH30AHQHi0Xwg2Bw/YvD6ZwAAACLReiDuKwAAAABfjGJXQjBfQgIjUXoUItFCCX/AAAAUOi1uP//WVmFwHQSikUIagKIRfyIXf3GRf4AWesV6LSH///HACoAAAAzyYhd/MZF/QBBi0XoagH/cASNVfhqA1JRjU38UVb/cBSNRehQ6IHZ//+DxCSFwA+Eb////4P4AQ+2Rfh0CQ+2TfnB4AgLwYB99AB0B4tN8INhcP1eW8nDzMzMzMzMVYvsV1ZTi00QC8l0TYt1CIt9DLdBs1q2II1JAIomCuSKB3QnCsB0I4PGAYPHATrncgY643cCAuY6x3IGOsN3AgLGOuB1C4PpAXXRM8k64HQJuf////9yAvfZi8FbXl/Jw4v/VYvsg+wQU/91FI1N8Oh8bv//i00QM9s7y3UTOF38dAeLRfiDYHD9M8DpuwAAADldCHUu6LWG//9TU1NTU8cAFgAAAOg9hv//g8QUOF38dAeLRfiDYHD9uP///3/piAAAADldDHTNVr7///9/O852Guh4hv//U1NTU1PHABYAAADoAIb//4PEFOs/i0X0OVgIdRT/dRRR/3UM/3UI6AAFAACDxBDrNv9wBFH/dQxR/3UIaAEQAAD/cAyNRfBQ6J0EAACDxCA7w3UQOF38dAeLRfiDYHD9i8brD4PA/jhd/HQHi034g2Fw/V5bycOL/1WL7GoA/3UQ/3UM/3UI6P3+//+DxBBdw4v/VYvsUVFTVjP2V4s9ICBBAIl1/IsHO8Z0ZYsdsOBAAFZWVlZq/1BWVv/TiUX4O8Z0VGoBUOgtiP//WVmJRfw7xnRDVlb/dfhQav//N1ZW/9OFwHQ2jUX8VlDo4QUAAFlZhcB9ETl1/HQM/3X86OGI//9ZiXX8g8cEiwc7xnWhM8BfXlvJw4PI/+v2/3X86MCI//9Z6/CLRCQIi0wkEAvIi0wkDHUJi0QkBPfhwhAAU/fhi9iLRCQI92QkFAPYi0QkCPfhA9NbwhAAi/9Vi+yLTQjrB0mAOAB0BkCFyXX1SYtFCCvBSF3Di/9Vi+yD7CyhgBJBADPFiUX8i0UUU1ZXM/+L2ovxiV3ciUXkOT1gKkEAdThqAbhk6kAAUGoBUFdX/xUk4UAAhcB0DMcFYCpBAAEAAADrFf8VXOBAAIP4eHUKxwVgKkEAAgAAADl9EH4m/3UQi8Pob////1mJRRCLVRg7134ei0XkUuhb////i9BZiVUY6xKDfRD/feIzwOnCAgAAg/r/fPSLDWAqQQCD+QIPhPkBAAA7zw+E8QEAADPAQDvIddaJfdg5fRx1CIsOi0kEiU0cOX0QdAg71w+FmgAAADlVEHUIagJY6XUCAAA70A+PbQIAADlFEH4EagPr6Y1F6FD/dRz/FWjgQACFwHSKOX0QfimDfegCcuCAfe4AjUXudNeKUAGE0nTQigs6CHIEOsp2sUBAgDgAdejrvTl9GH44g33oAnMIM8BA6RICAACAfe4AjUXudO+KUAGE0nToi03kigk6CHIIOsoPhnT///9AQIA4AHXh686LNezgQABXV/91EFNqCf91HP/Wi9iJXdQ73w+E//7//78ABAAAhdt+QGrgM9JY9/OD+AJyNI1EGwg7x3cT6Cb2//+LxIXAdBzHAMzMAADrEVDopLb//1mFwHQJxwDd3QAAg8AIiUXg6wSDZeAAg33gAA+EqP7//1P/deD/dRD/ddxqAf91HP/WhcAPhJIAAABqAGoA/3UY/3Xkagn/dRz/1ovYhdt0e35CauAz0lj384P4AnI2jUQbCDvHdxbopvX//4v8hf90WscHzMwAAIPHCOsaUOghtv//WYXAdAnHAN3dAACDwAiL+OsCM/+F/3QxU1f/dRj/deRqAf91HP/WhcB0F1NX/3XU/3Xg/3UM/3UI/xUk4UAAiUXYV+if0P//Wf914OiW0P//i0XYWem1AAAAM/8z2zl9CHUIiwaLQBSJRQg5fRx1CIsGi0AEiUUc/3UI6Anz//+L8FmD/v8PhLr9//87dRx0UGoAagCNRRBQ/3XcVv91HOgt8///i9iDxBiF2w+ElP3//2oAagCNRRhQ/3XkVv91HOgM8///i/iDxBiF/3UMU+hHhf//Welr/f//iV3ciX3k/3UY/3Xk/3UQ/3Xc/3UM/3UI/xUg4UAAi/CF23QOU+gXhf//V+gRhf//WVmLxo1lyF9eW4tN/DPN6CJp///Jw4v/VYvsg+wQ/3UIjU3w6Bxp////dSSLVRT/dSCNTfD/dRz/dRj/dRD/dQzoYPz//4PEGIB9/AB0B4tN+INhcP3Jw4v/VYvsg+wQU/91FI1N8OjZaP//i1UQM9s703UTOF38dAeLRfiDYHD9M8DpxwAAADldCHUu6BKB//9TU1NTU8cAFgAAAOiagP//g8QUOF38dAeLRfiDYHD9uP///3/plAAAADldDHTNVr7///9/O9Z2GujVgP//U1NTU1PHABYAAADoXYD//4PEFOtLi0Xwi0gQO8t1FY1F8FBS/3UM/3UI6DL1//+DxBDrP/9wCI1F8FL/dQxS/3UIaAEQAABRUOj5/v//g8QgO8N1G+h7gP//xwAWAAAAOF38dAeLRfiDYHD9i8brD4PA/jhd/HQHi034g2Fw/V5bycOL/1WL7FaLNRggQQDrIVdQ/3UI6Dn6//+DxAyFwHUNiwaKBAc8PXQdhMB0GYPGBIsGhcB12YvGKwUYIEEAwfgC99heXcOLxisFGCBBAMH4Auvwi/9Vi+xRV4v4M8CLz4X/dEY5B3QJg8EEQIM5AHX3VkBqBFDoWYL//4vwWVmJdfyF9nUYagno2mn//+sOUOhjAgAAiQaDxgSDxwRZiweFwHXrIQaLRfxeX8nDi/9Vi+yD7BSLRQhTM9uJXfQ7w3Ud6Ix///9TU1NTU8cAFgAAAOgUf///g8QUg8j/625WizBXiXX8O/N0U2o9VugXAwAAi/hZWYl97Dv7dEA793Q8M8A4XwEPlMCJRfihGCBBADsFHCBBAHUK6DX///+jGCBBADvDdWA5XQx0JDkdICBBAHQc6DP5//+FwHRK6BF////HABYAAACDyP9fXlvJwzld+A+FmAEAAGoE6C+B//9ZoxggQQA7w3TeiRg5HSAgQQB1E2oE6BSB//9ZoyAgQQA7w3TDiRiLNRggQQCJdfA783S0K338/3X86GL+//+L+Dv7WXxSOR50To00vv826AyC//9ZOV34dRuLRfyJBotFCIkY6YIAAACLRgSJBotF8EeNNLg5HnXwgf////8/c2pqBFf/NRggQQDof4H//4PEDDvDdFXrTjld+A+F4gAAADv7fQL3341HAjvHD4w2////Pf///z8Pgyv///9QagT/NRggQQDoQ4H//4PEDDvDD4QS////i1X8jQy4iRGJWQSLTQiJGaMYIEEAOV0MdHiLdfxqAVboyKz//0BZQFDocID//4v4WVk7+3RcVlbosKz//0BZQFBX6PHV//+DxAyFwHQNU1NTU1PoNXz//4PEFItN+IvHK8YDReyIGED32RvJ99EjyFFX/xUo4UAAhcB1D4NN9P/omH3//8cAKgAAAFfo+YD//1k5Xfh0Dv91/OjrgP//i0UIWYkYi0X06Wj+////dfzo1YD//4tFCFmJGDPA6VP+//+L/1WL7FMz2zldCHUEM8DrQVZX/3UI6BCs//+L8EZW6Kmw//+L+FlZO/t0Iv91CFZX6EDV//+DxAyFwHQNU1NTU1PohHv//4PEFIvH6wIzwF9eW13Di/9Vi+yD7BBT/3UQjU3w6JNk//+LRQgz2zvDdSjo5Hz//1NTU1NTxwAWAAAA6Gx8//+DxBQ4Xfx0B4tF+INgcP0zwOt0Vot19DleCHU6/3UMUOiPAAAAWVnrQQ+20fZEMh0EdBpAihA603Q+D7fJD7bSweEIC8o5TQx1C0jrHQ+30TlVDHQNQGYPtggPt8lmO8t1xw+3yTlNDHUOOF38dBeLTfiDYXD96w44Xfx0B4tF+INgcP0zwF5bycOL/1WL7GoA/3UM/3UI6DL///+DxAxdw8zMzI1C/1vDjaQkAAAAAI1kJAAzwIpEJAhTi9jB4AiLVCQI98IDAAAAdBWKCoPCATrLdM+EyXRR98IDAAAAdesL2FeLw8HjEFYL2IsKv//+/n6LwYv3M8sD8AP5g/H/g/D/M88zxoPCBIHhAAEBgXUcJQABAYF00yUAAQEBdQiB5gAAAIB1xF5fWzPAw4tC/DrDdDaEwHTvOuN0J4TkdOfB6BA6w3QVhMB03DrjdAaE5HTU65ZeX41C/1vDjUL+Xl9bw41C/V5fW8ONQvxeX1vD/yXQ4EAAi/9Vi+yLVQhTM9s703Ud6Eh7//9TU1NTU8cAFgAAAOjQev//g8QUg8j/6yA4GnTfi00MO8t02IsBO8N00jgYdM5TUVLoEw8AAIPEDFtdw4v/VYvsg+wci1UQVot1CGr+WIlF7IlV5DvwdRvo/3r//4MgAOjkev//xwAJAAAAg8j/6YgFAABTM9s783wIOzWQKkEAcifo1Xr//4kY6Lt6//9TU1NTU8cACQAAAOhDev//g8QUg8j/6VEFAACLxsH4BVeNPIWgKkEAiweD5h/B5gYDxopIBPbBAXUU6I96//+JGOh1ev//xwAJAAAA62qB+v///393UIld8DvTD4QIBQAA9sECD4X/BAAAOV0MdDeKQCQCwND4iEX+D77ASGoEWXQcSHUOi8L30KgBdBmD4v6JVRCLRQyJRfTpgQAAAIvC99CoAXUh6CN6//+JGOgJev//xwAWAAAAU1NTU1PokXn//4PEFOs0i8LR6IlNEDvBcgOJRRD/dRDoGnz//1mJRfQ7w3Ue6NF5///HAAwAAADo2Xn//8cACAAAAIPI/+loBAAAagFTU/91COh81v//iw+JRA4oi0X0g8QQiVQOLIsPA872QQRIdHSKSQWA+Qp0bDldEHRniAiLD0D/TRDHRfABAAAAxkQOBQo4Xf50TosPikwOJYD5CnRDOV0QdD6ICIsPQP9NEIB9/gHHRfACAAAAxkQOJQp1JIsPikwOJoD5CnQZOV0QdBSICIsPQP9NEMdF8AMAAADGRA4mClONTehR/3UQUIsH/zQG/xUs4UAAhcAPhHsDAACLTeg7yw+McAMAADtNEA+HZwMAAIsHAU3wjUQGBPYAgA+E5gEAAIB9/gIPhBYCAAA7y3QNi030gDkKdQWACATrA4Ag+4td9ItF8APDiV0QiUXwO9gPg9AAAACLTRCKATwaD4SuAAAAPA10DIgDQ0GJTRDpkAAAAItF8Eg7yHMXjUEBgDgKdQpBQYlNEMYDCut1iUUQ623/RRBqAI1F6FBqAY1F/1CLB/80Bv8VLOFAAIXAdQr/FVzgQACFwHVFg33oAHQ/iwf2RAYESHQUgH3/CnS5xgMNiweKTf+ITAYF6yU7XfR1BoB9/wp0oGoBav9q//91COjY1P//g8QQgH3/CnQExgMNQ4tF8DlFEA+CR////+sViweNRAYE9gBAdQWACALrBYoBiANDi8MrRfSAff4BiUXwD4XQAAAAhcAPhMgAAABLiguEyXgGQ+mGAAAAM8BAD7bJ6w+D+AR/Eztd9HIOSw+2C0CAueAeQQAAdOiKEw+2yg++ieAeQQCFyXUN6Hx3///HACoAAADrekE7yHUEA9jrQIsPA872QQRIdCRDg/gCiFEFfAmKE4sPiFQOJUOD+AN1CYoTiw+IVA4mQyvY6xL32JlqAVJQ/3UI6P7T//+DxBCLReQrXfTR6FD/dQxT/3X0agBo6f0AAP8V7OBAAIlF8IXAdTT/FVzgQABQ6CF3//9Zg03s/4tF9DtFDHQHUOhVev//WYtF7IP4/g+FiwEAAItF8OmDAQAAi0XwixczyTvDD5XBA8CJRfCJTBYw68Y7y3QOi030ZoM5CnUFgAgE6wOAIPuLXfSLRfADw4ldEIlF8DvYD4P/AAAAi0UQD7cIZoP5Gg+E1wAAAGaD+Q10D2aJC0NDQECJRRDptAAAAItN8IPB/jvBcx6NSAJmgzkKdQ2DwASJRRBqCumOAAAAiU0Q6YQAAACDRRACagCNRehQagKNRfhQiwf/NAb/FSzhQACFwHUK/xVc4EAAhcB1W4N96AB0VYsH9kQGBEh0KGaDffgKdLJqDVhmiQOLB4pN+IhMBgWLB4pN+YhMBiWLB8ZEBiYK6yo7XfR1B2aDffgKdIVqAWr/av7/dQjomtL//4PEEGaDffgKdAhqDVhmiQNDQ4tF8DlFEA+CG////+sYiw+NdA4E9gZAdQWADgLrCGaLAGaJA0NDK130iV3w6ZH+////FVzgQABqBV47xnUX6HV1///HAAkAAADofXX//4kw6Wn+//+D+G0PhVn+//+JXezpXP7//zPAX1teycNqEGj4+EAA6It1//+LRQiD+P51G+hFdf//gyAA6Cp1///HAAkAAACDyP/pvgAAADP2O8Z8CDsFkCpBAHIh6Bx1//+JMOgCdf//xwAJAAAAVlZWVlboinT//4PEFOvJi8jB+QWNHI2gKkEAi/iD5x/B5waLCw++TDkEg+EBdL+5////fztNEBvJQXUU6M50//+JMOi0dP//xwAWAAAA67BQ6B/j//9ZiXX8iwP2RDgEAXQW/3UQ/3UM/3UI6H75//+DxAyJReTrFuh+dP//xwAJAAAA6IZ0//+JMINN5P/HRfz+////6AkAAACLReTo6nT//8P/dQjoaeP//1nDi/9Vi+yD7DBTM9v2RRCAVleL8Ild4Ihd/sdF0AwAAACJXdR0CYld2MZF/xDrCsdF2AEAAACIXf+NReBQ6A8NAABZhcB0DVNTU1NT6G5y//+DxBSLTRC4AIAAAIXIdRH3wQBABwB1BTlF4HQEgE3/gIvBg+ADK8O6AAAAwL8AAACAdEdIdC5IdCbo03P//4kYgw7/6LZz//9qFl5TU1NTU4kw6D9z//+DxBTpAAUAAIlV+OsZ9sEIdAj3wQAABwB17sdF+AAAAEDrA4l9+ItFFGoQWSvBdDcrwXQqK8F0HSvBdBCD6EB1oTl9+A+UwIlF8Osex0XwAwAAAOsVx0XwAgAAAOsMx0XwAQAAAOsDiV3wi0UQugAHAAAjwrkABAAAO8G/AAEAAH87dDA7w3QsO8d0Hz0AAgAAD4SUAAAAPQADAAAPhUD////HRewCAAAA6y/HRewEAAAA6ybHRewDAAAA6x09AAUAAHQPPQAGAAB0YDvCD4UP////x0XsAQAAAItFEMdF9IAAAACFx3QWiw0IIEEA99EjTRiEyXgHx0X0AQAAAKhAdBKBTfQAAAAEgU34AAABAINN8ASpABAAAHQDCX30qCB0EoFN9AAAAAjrFMdF7AUAAADrpqgQdAeBTfQAAAAQ6KPh//+JBoP4/3Ua6Gpy//+JGIMO/+hNcv//xwAYAAAA6Y4AAACLRQiLPRzhQABT/3X0xwABAAAA/3XsjUXQUP918P91+P91DP/XiUXkg/j/dW2LTfi4AAAAwCPIO8h1K/ZFEAF0JYFl+P///39T/3X0jUXQ/3XsUP918P91+P91DP/XiUXkg/j/dTSLNovGwfgFiwSFoCpBAIPmH8HmBo1EMASAIP7/FVzgQABQ6Ntx//9Z6K9x//+LAOl0BAAA/3Xk/xVA4EAAO8N1RIs2i8bB+AWLBIWgKkEAg+YfweYGjUQwBIAg/v8VXOBAAIvwVuiYcf//Wf915P8VCOFAADvzdbDoX3H//8cADQAAAOujg/gCdQaATf9A6wmD+AN1BIBN/wj/deT/Nug03v//iwaL0IPgH8H6BYsUlaAqQQBZweAGWYpN/4DJAYhMAgSLBovQg+AfwfoFixSVoCpBAMHgBo1EAiSAIICITf2AZf1IiE3/D4WAAAAA9sGAD4SxAgAA9kUQAnRxagKDz/9X/zboowgAAIPEDIlF6DvHdRno1nD//4E4gwAAAHRN/zbo6dn//+n6/v//agGNRfxQ/zaIXfzokvX//4PEDIXAdRqAffwadRSLReiZUlD/NuigBgAAg8QMO8d0w1NT/zboRggAAIPEDDvHdLP2Rf+AD4QwAgAAvwBABwC5AEAAAIV9EHUPi0XgI8d1BQlNEOsDCUUQi0UQI8c7wXREPQAAAQB0KT0AQAEAdCI9AAACAHQpPQBAAgB0Ij0AAAQAdAc9AEAEAHUdxkX+AesXi00QuAEDAAAjyDvIdQnGRf4C6wOIXf73RRAAAAcAD4S1AQAA9kX/QIld6A+FqAEAAItF+LkAAADAI8E9AAAAQA+EtwAAAD0AAACAdHc7wQ+FhAEAAItF7DvDD4Z5AQAAg/gCdg6D+AR2MIP4BQ+FZgEAAA++Rf4z/0gPhCYBAABID4VSAQAAx0Xo//4AAMdF7AIAAADpGgEAAGoCU1P/Nug4zP//g8QQC8J0x1NTU/826CfM//8jwoPEEIP4/w+Ejv7//2oDjUXoUP826C/0//+DxAyD+P8PhHX+//+D+AJ0a4P4Aw+FrQAAAIF96O+7vwB1WcZF/gHp3AAAAItF7DvDD4bRAAAAg/gCD4Zi////g/gED4dQ////agJTU/826LjL//+DxBALwg+EQ////1NTU/826KPL//+DxBAjwoP4/w+FkQAAAOkF/v//i0XoJf//AAA9/v8AAHUZ/zbo39f//1nopG7//2oWXokwi8bpZAEAAD3//gAAdRxTagL/NuhYBgAAg8QMg/j/D4TA/f//xkX+AutBU1P/Nug9BgAAg8QM65nHRejvu78Ax0XsAwAAAItF7CvHUI1EPehQ/zboA7j//4PEDIP4/w+EgP3//wP4OX3sf9uLBovIwfkFiwyNoCpBAIPgH8HgBo1EASSKCDJN/oDhfzAIiwaLyMH5BYsMjaAqQQCD4B/B4AaNRAEki00QihDB6RDA4QeA4n8KyogIOF39dSH2RRAIdBuLBovIg+AfwfkFiwyNoCpBAMHgBo1EAQSACCCLffi4AAAAwIvPI8g7yHV89kUQAXR2/3Xk/xUI4UAAU/919I1F0GoDUP918IHn////f1f/dQz/FRzhQACD+P91NP8VXOBAAFDom23//4sGi8iD4B/B+QWLDI2gKkEAweAGjUQBBIAg/v826M/a//9Z6Zj7//+LNovOwfkFiwyNoCpBAIPmH8HmBokEDovDX15bycNqFGgY+UAA6G9t//+DTeT/M/aJdeAzwDl1CA+VwDvGdR3oCW3//8cAFgAAAFZWVlZW6JFs//+DxBSDyP/rcol1/P91EGpA/3UM/3UIjUXgUI1F5OiJ+P//g8QUiUXcx0X8/v///+gSAAAAi33cO/50POi5bP//iTjrvzP2OXXgdCs5ddx0HYtF5MH4BYtN5IPhH8HhBosEhaAqQQCNRAgEgCD+/3Xk6J3b//9Zw4tF5OgLbf//w4v/VYvsUVFWM/Y5dQh1HehlbP//VlZWVlbHABYAAADo7Wv//4PEFIPI/+tKOXUMdN7/dQiNRfhQjUX8UP91EP91DOh8BwAAg8QUg/j/dNj/dfj/dfz/dQhqAuhVBQAA/3X8i/DofW////91+Oh1b///g8QYi8ZeycOL/1WL7IPsFFNXi30IM9uJffw7+3Ug6OVr//9TU1NTU8cAFgAAAOhta///g8QUg8j/6eEBAAA4H3Tci0UMO8N01YsAO8N0zzgYdMtWalxX6BQMAABqL1eL8OgKDAAAg8QQO8MPhYEAAAA78w+FgwAAAGo6V+g97///i/BZWTvzdXNX6Ema//+L8IPGA2oBVujtbf//i/iDxAyJffw7+w+ErQAAAGh09EAAVlfoa8P//4PEDIXAdA1TU1NTU+ivaf//g8QU/3UIVlfo2MH//4PEDIXAdA1TU1NTU+iRaf//g8QUjXcCi30I6wo783QEO8Z2Aovwg03w/2ouVuhoCwAAWVmFwHQsU/91/OgUCgAAWVmFwA+F7AAAAP91EP91DP91/Ohg/v//g8QMiUXw6dMAAAD/dfzolpn//4vwg8YFagFW6Dpt//+DxAyJRfg7w3UIg8j/6b0AAAD/dfxWUOi4wv//g8QMhcB0DVNTU1NT6Pxo//+DxBT/dfzoUZn//4v4A334Weh2av//iwCJReyLRfgr9wPwx0X07B9BAItF9P8wVlfocsL//4PEDIXAdA1TU1NTU+i2aP//g8QUU/91+OhdCQAAWVmFwHQPg230BIF99OAfQQB9xOse6CBq////dRCLTez/dQyJCP91+OiU/f//g8QMiUXw/3X46Gxt//+LfQhZOX38dAn/dfzoW23//1mLRfBeX1vJw4v/VYvsg+wYU1ZXM9tqAVNT/3UIiV3wiV306JbG//+JRegjwoPEEIlV7IP4/3RZagJTU/91COh6xv//i8gjyoPEEIP5/3RBi3UMi30QK/Ab+g+IxgAAAH8IO/MPhrwAAAC7ABAAAFNqCP8VNOFAAFD/FWTgQACJRfyFwHUX6GNp///HAAwAAADoWGn//4sAX15bycNoAIAAAP91COiKAQAAWVmJRfiF/3wKfwQ783IEi8PrAovGUP91/P91COisq///g8QMg/j/dDaZK/Ab+ngGf9OF9nfPi3Xw/3X4/3UI6EYBAABZWf91/GoA/xU04UAAUP8VYOBAADPb6YYAAADo82j//4M4BXUL6NZo///HAA0AAACDzv+JdfTrvTv7f3F8BDvzc2tT/3UQ/3UM/3UI6H/F//8jwoPEEIP4/w+ERP////91COib1v//WVD/FTDhQAD32BvA99hImYlF8CPCiVX0g/j/dSnod2j//8cADQAAAOh/aP//i/D/FVzgQACJBot18CN19IP+/w+E9v7//1P/dez/dej/dQjoFMX//yPCg8QQg/j/D4TZ/v//M8Dp2f7//4v/VYvsVot1CFboItb//1mD+P91EOgVaP//xwAJAAAAg8j/601X/3UQagD/dQxQ/xUA4UAAi/iD//91CP8VXOBAAOsCM8CFwHQMUOgFaP//WYPI/+sbi8bB+AWLBIWgKkEAg+YfweYGjUQwBIAg/YvHX15dw4v/VYvsU4tdDFaLdQiLxsH4BY0UhaAqQQCLAoPmH8HmBo0MMIpBJALAVw+2eQQPvsCB54AAAADR+IH7AEAAAHRQgfsAgAAAdEKB+wAAAQB0JoH7AAACAHQegfsAAAQAdT2ASQSAiwqNTDEkihGA4oGAygGIEesngEkEgIsKjUwxJIoRgOKCgMoC6+iAYQR/6w2ASQSAiwqNTDEkgCGAhf9fXlt1B7gAgAAAXcP32BvAJQDAAAAFAEAAAF3Di/9Vi+yLRQhWM/Y7xnUd6Opm//9WVlZWVscAFgAAAOhyZv//g8QUahZY6wqLDWQqQQCJCDPAXl3Di/9Vi+yD7GiLRQhTM9tXiV30iF3/O8N0FYP4AXQQfhaD+AN+CYP4BHUMxkX/AYtFEIlF8Os46J1m//+JGOiDZv//U1NTU1PHABYAAADoC2b//4PEFIPI/+muAQAAQDgYdfuNSAE4GXQFxgAgi8E4GHXrVmpEXlaNRZhTUOjUSf//iXWYizWQKkEAg8QMO/N0K41G/4vIi9DB+QWLDI2gKkEAg+IfweIGOFwRBHUGTkg783XgO/MPjEABAACB/jIzAAAPgzQBAACLxmvABYPABGaJRcoPt8BqAVDoZ2j//1lZiUXMO8MPhBABAAA784kwi0XMjUgEjXwwBIld+H45i0X4i9CD4B/B+gXB4AYDBJWgKkEAilAE9sIQdQiIEYsAiQfrBYgZgw///0X4QYPHBDl1+HzKi0XMOF3/dCyNSAQz0o1EMASD/gN9BIv+6wNqA187130MiBmDCP9CQYPABOvkx0X0CAAAAOhqZf//iRiNRdxQjUWYUFP/dRT/dfRqAVNT/3Xw/3UM/xUM4EAAi/D/FVzgQAD/dcyL+OiRaP//WTvzdQlX6D9l//9Z61iDfQgCdQZT6KRR//+LNQjhQAA5XQh1HWr//3Xc/xUI4EAAjUXsUP913P8VBOBAAItd7OsGg30IBHUH/3Xc/9brA4td3P914P/Wi8PrDujEZP//xwAMAAAAg8j/Xl9bycOL/1WL7IPsQKGAEkEAM8WJRfyLTQyLRQhTVle+ePRAAI198KWlZqWJTdSLTRAz24lN4ItNFKRqAolFyIv4iwCJTeiJXdyJXeyJXcRe6xBQ6DKT//+DxwSNdAYBiwdZO8N17GoBVol1zOjKZv//i3XgWVmJBjvDdSOLReiJGOg0ZP//xwAMAAAA6Dxk///HAAgAAACDyP/pLwMAAI1F8FCNRexTUOi82v//g8QMO8N0FIP4FnVxU1NTU1PoZ2L//4PEFOtijUXwUOi5kv//i/hHR1mJfdA5Xex0Dv917Oikkv//A/hZiX3Qi0XUO8N0T2oCi/CLAF/rEFDoiJL//4PGBI18BwGLBlk7w3XsoTwgQQA7w3VD6OyP//+jPCBBADvDdTWLdeD/NoNN3P/o8mb//4tF6IkeWYkY6WUCAACLReiJGIt9yIsHizY7ww+F8QAAAEbpVQEAAIld5DgYdCiKCIvwgPk9dB9W6BiS//9Zi03kjUwBAaE8IEEAjTQIiU3kig46y3Xci03kiU3Y6ys4WAF0LYB4Ajp1J4B4Az11IYPABFDo3ZH//1mLTdiNRAEFiw08IEEAiUXYA8GAOD10zotF2CtF5It11AP4iX3A6x+NRfBQ6KyR//9QjUXwUP826BcFAACDxBCFwHRNg8YEOR513QN90GoBV+g4Zf//i3XgWVmLTeiJATvDD4Uy/////zboC2b//1mJHuiWYv//xwAMAAAA6J5i//+DTdz/xwAIAAAA6WkBAADHRcQBAAAA67RQi8YrxgNFzFBW6H+6//+DxAyFwHQNU1NTU1Pow2D//4PEFP836BmR//+NdAYBg8cE6zZQi0XgiwArxgNFzFBW6Em6//+DxAyFwHQNU1NTU1PojWD//4PEFP836OOQ//8D8IPHBMYGIEZZiwc7w3XDi0XoiF7/iB6LMDld1A+EzQAAAIt92ItF5IvPK8hRiw08IEEAA8hRVuj2uv//K33kg8QMA/eLfdTrNotFwItN6P83K8YDAVBW6NG5//+DxAyFwHQNU1NTU1PoFWD//4PEFP836GuQ//9ZjXQGAYPHBDkfdcY5XcR1Z4t90I1F8FBXVuiXuf//g8QMhcB0DVNTU1NT6Ntf//+DxBRoYONAAFdW6AK4//+DxAyFwHQNU1NTU1Pou1///4PEFDld7HQe/3XsV1bo37f//4PEDIXAdA1TU1NTU+iYX///g8QUA/c783QMi0XoOzB1A4geRogeoTwgQQA7w3QHUOhxZP//WYkdPCBBADld7HQJ/3Xs6F1k//9Zi0Xci038X14zzVvocUj//8nDi/9Vi+xWM/Y5dQh1JOjeYP//iTDoxGD//1ZWVlZWxwAWAAAA6Exg//+DxBRqFljrVfdFDPn///910/91CP8VOOFAAIP4/3UW/xVc4EAAUOivYP//WeiDYP//iwDrKKgQdSKoAXQe9kUMAnQY6H9g///HAAUAAADoYWD//8cADQAAAOvRM8BeXcOL/1WL7IPsFFP/dRAz241N7Ild/OjcR///i00IO8t1KOgvYP//U1NTU1PHABYAAADot1///4PEFDhd+HQHi0X0g2Bw/TPA63FWi3XwOV4IdRn/dQxR6GoCAABZWThd+HRXi030g2Fw/etOV4oRD7bCD7b49kQ3HQR0IUGKETrTdBUPtvrB4AgLxzlFDHUVjUH/iUX86w05XfzrAzlFDHUDiU38QTrTdcNfOF34dAeLRfSDYHD9i0X8XlvJw4v/VYvsagD/dQz/dQjoMv///4PEDF3Di/9Vi+yD7BRTM9s5XRB1BzPA6ZoBAAD/dRSNTezoAEf//4tF8DlYCHUm/3UQ/3UM/3UI6MfU//+DxAw4XfgPhG0BAACLTfSDYXD96WEBAABXi30IO/t0BTldDHUu6B9f//9TU1NTU8cAFgAAAOinXv//g8QUOF34dAeLRfSDYHD9uP///3/pJQEAAFZmD7YP/00QD7fJD7bRR/ZEAh0EiU38dEOKFzrTdQWJXfzrWMHhCGYPttJmC8oPt8lmi/FHiU38ZjtwEHIMZjtwEncGZgNwFOs2ZjtwFnIwZjtwGHcqZgNwGuskD7dV/I0MAvZBHRB0DWYPtokdAQAAD7fJ6wMPt8qJTfxmi3X8i00MZg+2Cf9FDA+3yQ+20fZEAh0EiU38dEWLVQyKEjrTdQWJXfzrV8HhCGYPttJmC8r/RQwPt8mJTfxmO0gQcgxmO0gSdwZmA0gU6zZmO0gWcjBmO0gYdypmA0ga6yQPt1X8jQwC9kEdEHQNZg+2iR0BAAAPt8nrAw+3yolN/GaLTfxmO851IWY783QJOV0QD4Xr/v//OF34dAeLRfSDYHD9M8BeX1vJwxvAg+ACSDhd+HTwi030g2Fw/evni/9Vi+xqAP91EP91DP91COgj/v//g8QQXcPMzMzMzMzMzMzMzMzMzMxVi+xXi30IM8CDyf/yroPBAffZg+8BikUM/fKug8cBOAd0BDPA6wKLx/xfycMAAAAAAAAAAAAAAAAAAAAAAAAAnPoAALj6AADO+gAA5PoAAPb6AAAO+wAAJPsAADz7AABU+wAAaPsAAHD7AACC+wAAkPsAAKL7AAC0+wAAxvsAANb7AADk+wAA/PsAABD8AAAk/AAAQPwAAF78AABy/AAAgvwAAI78AACa/AAApvwAAL78AADW/AAA4PwAAOz8AAD+/AAADP0AABj9AAAm/QAAMP0AAED9AABW/QAAYv0AAHL9AACa/QAAtP0AAMz9AADm/QAA/P0AABb+AAAk/gAAMv4AAEz+AABc/gAAcv4AAIz+AACY/gAApv4AALb+AADG/gAA2P4AAOz+AAD8/gAAEv8AACL/AAA0/wAARv8AAFj/AABq/wAAdv8AAIT/AACU/wAAqv8AALr/AADK/wAA2P8AAOr/AAD8/wAAJAABADAAAQBAAAEAUgABAAAAAAAAAAAAAAAAAAAAAADsGEAA4kFAAGRLQAD+WEAAAGBAAAAAAAAAAAAAS61AAJ0ZQAAAAAAAAAAAAAAAAAAAAAAAZmFpbGVkIHRvIGdldCBleGl0IGNvZGUgZnJvbSBwcm9jZXNzLgoAAGZhaWxlZCB0byBjcmVhdGUgcHJvY2Vzcy4KAAAgJXMAJXMAAENvdWxkIG5vdCBleGVjICVzAAAAQ2Fubm90IGZpbmQgUHl0aG9uIGV4ZWN1dGFibGUgJXMKAAAAIyFweXRob24uZXhlAAAAACMhAABDYW5ub3Qgb3BlbiAlcwoALXNjcmlwdC5weXcAQ29yRXhpdFByb2Nlc3MAAG0AcwBjAG8AcgBlAGUALgBkAGwAbAAAACgAbgB1AGwAbAApAAAAAAAobnVsbCkAAAAAAAAGAAAGAAEAABAAAwYABgIQBEVFRQUFBQUFNTAAUAAAAAAoIDhQWAcIADcwMFdQBwAAICAIAAAAAAhgaGBgYGAAAHhweHh4eAgHCAAABwAICAgAAAgACAAHCAAAAKghQQAAIkEAAAAAAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8APQAAAEVuY29kZVBvaW50ZXIAAABLAEUAUgBOAEUATAAzADIALgBEAEwATAAAAAAARGVjb2RlUG9pbnRlcgAAAEZsc0ZyZWUARmxzU2V0VmFsdWUARmxzR2V0VmFsdWUARmxzQWxsb2MAAAAAcnVudGltZSBlcnJvciAAAA0KAABUTE9TUyBlcnJvcg0KAAAAU0lORyBlcnJvcg0KAAAAAERPTUFJTiBlcnJvcg0KAABSNjAzNA0KQW4gYXBwbGljYXRpb24gaGFzIG1hZGUgYW4gYXR0ZW1wdCB0byBsb2FkIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBpbmNvcnJlY3RseS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAAAAAUjYwMzMNCi0gQXR0ZW1wdCB0byB1c2UgTVNJTCBjb2RlIGZyb20gdGhpcyBhc3NlbWJseSBkdXJpbmcgbmF0aXZlIGNvZGUgaW5pdGlhbGl6YXRpb24KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gSXQgaXMgbW9zdCBsaWtlbHkgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGFuIE1TSUwtY29tcGlsZWQgKC9jbHIpIGZ1bmN0aW9uIGZyb20gYSBuYXRpdmUgY29uc3RydWN0b3Igb3IgZnJvbSBEbGxNYWluLg0KAABSNjAzMg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb2NhbGUgaW5mb3JtYXRpb24NCgAAAAAAAFI2MDMxDQotIEF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgQ1JUIG1vcmUgdGhhbiBvbmNlLgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLg0KAABSNjAzMA0KLSBDUlQgbm90IGluaXRpYWxpemVkDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhlYXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAAUjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAABSNjAxOA0KLSB1bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAABSNjAxNw0KLSB1bmV4cGVjdGVkIG11bHRpdGhyZWFkIGxvY2sgZXJyb3INCgAAAABSNjAxNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciB0aHJlYWQgZGF0YQ0KAA0KVGhpcyBhcHBsaWNhdGlvbiBoYXMgcmVxdWVzdGVkIHRoZSBSdW50aW1lIHRvIHRlcm1pbmF0ZSBpdCBpbiBhbiB1bnVzdWFsIHdheS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAUjYwMDkNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgZW52aXJvbm1lbnQNCgBSNjAwOA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBhcmd1bWVudHMNCgAAAFI2MDAyDQotIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgbm90IGxvYWRlZA0KAAAAAE1pY3Jvc29mdCBWaXN1YWwgQysrIFJ1bnRpbWUgTGlicmFyeQAAAAAKCgAALi4uADxwcm9ncmFtIG5hbWUgdW5rbm93bj4AAFJ1bnRpbWUgRXJyb3IhCgpQcm9ncmFtOiAAAAAAAAAABQAAwAsAAAAAAAAAHQAAwAQAAAAAAAAAlgAAwAQAAAAAAAAAjQAAwAgAAAAAAAAAjgAAwAgAAAAAAAAAjwAAwAgAAAAAAAAAkAAAwAgAAAAAAAAAkQAAwAgAAAAAAAAAkgAAwAgAAAAAAAAAkwAAwAgAAAAAAAAABoCAhoCBgAAAEAOGgIaCgBQFBUVFRYWFhQUAADAwgFCAiAAIACgnOFBXgAAHADcwMFBQiAAAACAogIiAgAAAAGBoYGhoaAgIB3hwcHdwcAgIAAAIAAgABwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgACgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAIEAgQCBAIEAgQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEAAQABAAEAAQABAAggCCAIIAggCCAIIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAEAAQABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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cmlTYXQAAABKYW5GZWJNYXJBcHJNYXlKdW5KdWxBdWdTZXBPY3ROb3ZEZWMAAAAAQ09OT1VUJAAuY29tAAAAAC5leGUAAAAALmJhdAAAAAAuY21kAAAAAC5cAABTeXN0ZW1Sb290AAAAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBJBAND0QAADAAAAADgAALBpAACgmQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADcGEAAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAALwjQAAAAAAA/v///wAAAACI////AAAAAP7////6JUAA/iVAAP7////AJUAA1CVAAP7///8AAAAAjP///wAAAAD+////aDVAAGw1QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAEztAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADhO0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAGs9QAAAAAAAAAAAADc9QAD+////AAAAANT///8AAAAA/v///wAAAADwPkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAACNAQAAAAAAA/v///wAAAADU////AAAAAP7///9NQUAAaUFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAABdR0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAACtLQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAm05AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADdUEAA/v///wAAAADsUEAA/v///wAAAADY////AAAAAP7///8AAAAAn1JAAP7///8AAAAAq1JAAP7///8AAAAA1P///wAAAAD+////AAAAAGVZQAAAAAAA/v///wAAAADY////AAAAAP7///8LW0AAH1tAAAAAAAD+////AAAAANj///8AAAAA/v///11bQABhW0AAAAAAAP7///8AAAAAwP///wAAAAD+////AAAAALheQAAAAAAA/v///wAAAADQ////AAAAAP7///9IX0AAX19AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAC5akAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAMpsQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAznlAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADegUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAL+CQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAtJVAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABNmEAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAOShQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAW6ZAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAAAhqEAAAAAAAAAAAABdp0AA/v///wAAAADQ////AAAAAP7///8AAAAA3K5AAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAD4wkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAJvKQABc+QAAAAAAAAAAAAAWAAEAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnPoAALj6AADO+gAA5PoAAPb6AAAO+wAAJPsAADz7AABU+wAAaPsAAHD7AACC+wAAkPsAAKL7AAC0+wAAxvsAANb7AADk+wAA/PsAABD8AAAk/AAAQPwAAF78AABy/AAAgvwAAI78AACa/AAApvwAAL78AADW/AAA4PwAAOz8AAD+/AAADP0AABj9AAAm/QAAMP0AAED9AABW/QAAYv0AAHL9AACa/QAAtP0AAMz9AADm/QAA/P0AABb+AAAk/gAAMv4AAEz+AABc/gAAcv4AAIz+AACY/gAApv4AALb+AADG/gAA2P4AAOz+AAD8/gAAEv8AACL/AAA0/wAARv8AAFj/AABq/wAAdv8AAIT/AACU/wAAqv8AALr/AADK/wAA2P8AAOr/AAD8/wAAJAABADAAAQBAAAEAUgABAAAAAABSAUdlbmVyYXRlQ29uc29sZUN0cmxFdmVudAAAxgFHZXRFeGl0Q29kZVByb2Nlc3MAAG4EV2FpdEZvclNpbmdsZU9iamVjdACVAENyZWF0ZVByb2Nlc3NBAACvA1NldENvbnNvbGVDdHJsSGFuZGxlcgD1AUdldE1vZHVsZUZpbGVOYW1lQQAA2gBFbnRlckNyaXRpY2FsU2VjdGlvbgAA9AJMZWF2ZUNyaXRpY2FsU2VjdGlvbgAA+gFHZXRNb2R1bGVIYW5kbGVXAAArBFNsZWVwACICR2V0UHJvY0FkZHJlc3MAAAUBRXhpdFByb2Nlc3MAcAFHZXRDb21tYW5kTGluZUEAPAJHZXRTdGFydHVwSW5mb0EA8ANTZXRIYW5kbGVDb3VudAAAPgJHZXRTdGRIYW5kbGUAANgBR2V0RmlsZVR5cGUAvwBEZWxldGVDcml0aWNhbFNlY3Rpb24ANwRUZXJtaW5hdGVQcm9jZXNzAACqAUdldEN1cnJlbnRQcm9jZXNzAEgEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAAfBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgDWAklzRGVidWdnZXJQcmVzZW50AOcBR2V0TGFzdEVycm9yAACmAkhlYXBGcmVlAACiAkhlYXBBbGxvYwBcAUdldENQSW5mbwDFAkludGVybG9ja2VkSW5jcmVtZW50AADBAkludGVybG9ja2VkRGVjcmVtZW50AABTAUdldEFDUAAAFAJHZXRPRU1DUAAA4AJJc1ZhbGlkQ29kZVBhZ2UAPgRUbHNHZXRWYWx1ZQA8BFRsc0FsbG9jAAA/BFRsc1NldFZhbHVlAD0EVGxzRnJlZQD0A1NldExhc3RFcnJvcgAArgFHZXRDdXJyZW50VGhyZWFkSWQAAJcEV3JpdGVGaWxlAPYCTG9hZExpYnJhcnlBAAC6AkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQASwFGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQDAAUdldEVudmlyb25tZW50U3RyaW5ncwBMAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXAIQEV2lkZUNoYXJUb011bHRpQnl0ZQDCAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKQCSGVhcENyZWF0ZQAAYQRWaXJ0dWFsRnJlZQBZA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAGoCR2V0VGlja0NvdW50AACrAUdldEN1cnJlbnRQcm9jZXNzSWQAUwJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCaA1J0bFVud2luZACpAkhlYXBSZUFsbG9jAF4EVmlydHVhbEFsbG9jAACEAUdldENvbnNvbGVDUAAAlgFHZXRDb25zb2xlTW9kZQAAQgFGbHVzaEZpbGVCdWZmZXJzAADmAkxDTWFwU3RyaW5nQQAAHwNNdWx0aUJ5dGVUb1dpZGVDaGFyAOgCTENNYXBTdHJpbmdXAABAAkdldFN0cmluZ1R5cGVBAABDAkdldFN0cmluZ1R5cGVXAADpAUdldExvY2FsZUluZm9BAADnA1NldEZpbGVQb2ludGVyAACrAkhlYXBTaXplAABEAENsb3NlSGFuZGxlAIwEV3JpdGVDb25zb2xlQQCaAUdldENvbnNvbGVPdXRwdXRDUAAAlgRXcml0ZUNvbnNvbGVXAAYEU2V0U3RkSGFuZGxlAAB5AENyZWF0ZUZpbGVBAFMAQ29tcGFyZVN0cmluZ0EAAFYAQ29tcGFyZVN0cmluZ1cAANgDU2V0RW52aXJvbm1lbnRWYXJpYWJsZUEAS0VSTkVMMzIuZGxsAABuA1JlYWRGaWxlAADVA1NldEVuZE9mRmlsZQAAJgJHZXRQcm9jZXNzSGVhcAAAygFHZXRGaWxlQXR0cmlidXRlc0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMArQQAAAAAAwCtBAAEBAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABO5kC7sRm/ROojQAACAAAAbOJAAFziQAD/////gAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABYAAAACAAAAAgAAAAMAAAACAAAABAAAABgAAAAFAAAADQAAAAYAAAAJAAAABwAAAAwAAAAIAAAADAAAAAkAAAAMAAAACgAAAAcAAAALAAAACAAAAAwAAAAWAAAADQAAABYAAAAPAAAAAgAAABAAAAANAAAAEQAAABIAAAASAAAAAgAAACEAAAANAAAANQAAAAIAAABBAAAADQAAAEMAAAACAAAAUAAAABEAAABSAAAADQAAAFMAAAANAAAAVwAAABYAAABZAAAACwAAAGwAAAANAAAA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dF9uYW1lID0gc3lzLmFyZ3ZbMV0KICAgIG5hbWVzcGFjZSA9IGRpY3QoCiAgICAgICAgX19maWxlX189c2NyaXB0X25hbWUsCiAgICAgICAgX19uYW1lX189J19fbWFpbl9fJywKICAgICAgICBfX2RvY19fPU5vbmUsCiAgICApCiAgICBzeXMuYXJndls6XSA9IHN5cy5hcmd2WzE6XQoKICAgIG9wZW5fID0gZ2V0YXR0cih0b2tlbml6ZSwgJ29wZW4nLCBvcGVuKQogICAgc2NyaXB0ID0gb3Blbl8oc2NyaXB0X25hbWUpLnJlYWQoKQogICAgbm9ybV9zY3JpcHQgPSBzY3JpcHQucmVwbGFjZSgnXFxyXFxuJywgJ1xcbicpCiAgICBjb2RlID0gY29tcGlsZShub3JtX3NjcmlwdCwgc2NyaXB0X25hbWUsICdleGVjJykKICAgIGV4ZWMoY29kZSwgbmFtZXNwYWNlKQoKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBydW4oKQpQSwMEFAAAAAAAAAAhAIdR66LdBwAA3QcAADAAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2xpYjJ0bzNfZXgucHkiIiIKQ3VzdG9taXplZCBNaXhpbjJ0bzMgc3VwcG9ydDoKCiAtIGFkZHMgc3VwcG9ydCBmb3IgY29udmVydGluZyBkb2N0ZXN0cwoKClRoaXMgbW9kdWxlIHJhaXNlcyBhbiBJbXBvcnRFcnJvciBvbiBQeXRob24gMi4KIiIiCgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBNaXhpbjJ0bzMgYXMgX01peGluMnRvMwpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gbGliMnRvMy5yZWZhY3RvciBpbXBvcnQgUmVmYWN0b3JpbmdUb29sLCBnZXRfZml4ZXJzX2Zyb21fcGFja2FnZQoKaW1wb3J0IHNldHVwdG9vbHMKCgpjbGFzcyBEaXN0dXRpbHNSZWZhY3RvcmluZ1Rvb2woUmVmYWN0b3JpbmdUb29sKToKICAgIGRlZiBsb2dfZXJyb3Ioc2VsZiwgbXNnLCAqYXJncywgKiprdyk6CiAgICAgICAgbG9nLmVycm9yKG1zZywgKmFyZ3MpCgogICAgZGVmIGxvZ19tZXNzYWdlKHNlbGYsIG1zZywgKmFyZ3MpOgogICAgICAgIGxvZy5pbmZvKG1zZywgKmFyZ3MpCgogICAgZGVmIGxvZ19kZWJ1ZyhzZWxmLCBtc2csICphcmdzKToKICAgICAgICBsb2cuZGVidWcobXNnLCAqYXJncykKCgpjbGFzcyBNaXhpbjJ0bzMoX01peGluMnRvMyk6CiAgICBkZWYgcnVuXzJ0bzMoc2VsZiwgZmlsZXMsIGRvY3Rlc3RzPUZhbHNlKToKICAgICAgICAjIFNlZSBvZiB0aGUgZGlzdHJpYnV0aW9uIG9wdGlvbiBoYXMgYmVlbiBzZXQsIG90aGVyd2lzZSBjaGVjayB0aGUKICAgICAgICAjIHNldHVwdG9vbHMgZGVmYXVsdC4KICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi51c2VfMnRvMyBpcyBub3QgVHJ1ZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgbm90IGZpbGVzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBsb2cuaW5mbygiRml4aW5nICIgKyAiICIuam9pbihmaWxlcykpCiAgICAgICAgc2VsZi5fX2J1aWxkX2ZpeGVyX25hbWVzKCkKICAgICAgICBzZWxmLl9fZXhjbHVkZV9maXhlcnMoKQogICAgICAgIGlmIGRvY3Rlc3RzOgogICAgICAgICAgICBpZiBzZXR1cHRvb2xzLnJ1bl8ydG8zX29uX2RvY3Rlc3RzOgogICAgICAgICAgICAgICAgciA9IERpc3R1dGlsc1JlZmFjdG9yaW5nVG9vbChzZWxmLmZpeGVyX25hbWVzKQogICAgICAgICAgICAgICAgci5yZWZhY3RvcihmaWxlcywgd3JpdGU9VHJ1ZSwgZG9jdGVzdHNfb25seT1UcnVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9NaXhpbjJ0bzMucnVuXzJ0bzMoc2VsZiwgZmlsZXMpCgogICAgZGVmIF9fYnVpbGRfZml4ZXJfbmFtZXMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5maXhlcl9uYW1lczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5maXhlcl9uYW1lcyA9IFtdCiAgICAgICAgZm9yIHAgaW4gc2V0dXB0b29scy5saWIydG8zX2ZpeGVyX3BhY2thZ2VzOgogICAgICAgICAgICBzZWxmLmZpeGVyX25hbWVzLmV4dGVuZChnZXRfZml4ZXJzX2Zyb21fcGFja2FnZShwKSkKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi51c2VfMnRvM19maXhlcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZvciBwIGluIHNlbGYuZGlzdHJpYnV0aW9uLnVzZV8ydG8zX2ZpeGVyczoKICAgICAgICAgICAgICAgIHNlbGYuZml4ZXJfbmFtZXMuZXh0ZW5kKGdldF9maXhlcnNfZnJvbV9wYWNrYWdlKHApKQoKICAgIGRlZiBfX2V4Y2x1ZGVfZml4ZXJzKHNlbGYpOgogICAgICAgIGV4Y2x1ZGVkX2ZpeGVycyA9IGdldGF0dHIoc2VsZiwgJ2V4Y2x1ZGVfZml4ZXJzJywgW10pCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24udXNlXzJ0bzNfZXhjbHVkZV9maXhlcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGV4Y2x1ZGVkX2ZpeGVycy5leHRlbmQoc2VsZi5kaXN0cmlidXRpb24udXNlXzJ0bzNfZXhjbHVkZV9maXhlcnMpCiAgICAgICAgZm9yIGZpeGVyX25hbWUgaW4gZXhjbHVkZWRfZml4ZXJzOgogICAgICAgICAgICBpZiBmaXhlcl9uYW1lIGluIHNlbGYuZml4ZXJfbmFtZXM6CiAgICAgICAgICAgICAgICBzZWxmLmZpeGVyX25hbWVzLnJlbW92ZShmaXhlcl9uYW1lKQpQSwMEFAAAAAAAAAAhAI1Dcl6dFgAAnRYAACwAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL21vbmtleS5weSIiIgpNb25rZXkgcGF0Y2hpbmcgb2YgZGlzdHV0aWxzLgoiIiIKCmltcG9ydCBzeXMKaW1wb3J0IGRpc3R1dGlscy5maWxlbGlzdAppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHR5cGVzCmltcG9ydCBmdW5jdG9vbHMKZnJvbSBpbXBvcnRsaWIgaW1wb3J0IGltcG9ydF9tb2R1bGUKaW1wb3J0IGluc3BlY3QKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKaW1wb3J0IHNldHVwdG9vbHMKCl9fYWxsX18gPSBbXQoiIiIKRXZlcnl0aGluZyBpcyBwcml2YXRlLiBDb250YWN0IHRoZSBwcm9qZWN0IHRlYW0KaWYgeW91IHRoaW5rIHlvdSBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4KIiIiCgoKZGVmIF9nZXRfbXJvKGNscyk6CiAgICAiIiIKICAgIFJldHVybnMgdGhlIGJhc2VzIGNsYXNzZXMgZm9yIGNscyBzb3J0ZWQgYnkgdGhlIE1STy4KCiAgICBXb3JrcyBhcm91bmQgYW4gaXNzdWUgb24gSnl0aG9uIHdoZXJlIGluc3BlY3QuZ2V0bXJvIHdpbGwgbm90IHJldHVybiBhbGwKICAgIGJhc2UgY2xhc3NlcyBpZiBtdWx0aXBsZSBjbGFzc2VzIHNoYXJlIHRoZSBzYW1lIG5hbWUuIEluc3RlYWQsIHRoaXMKICAgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgdHVwbGUgY29udGFpbmluZyB0aGUgY2xhc3MgaXRzZWxmLCBhbmQgdGhlIGNvbnRlbnRzCiAgICBvZiBjbHMuX19iYXNlc19fLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXMvMTAyNC4KICAgICIiIgogICAgaWYgcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCkgPT0gIkp5dGhvbiI6CiAgICAgICAgcmV0dXJuIChjbHMsKSArIGNscy5fX2Jhc2VzX18KICAgIHJldHVybiBpbnNwZWN0LmdldG1ybyhjbHMpCgoKZGVmIGdldF91bnBhdGNoZWQoaXRlbSk6CiAgICBsb29rdXAgPSAoCiAgICAgICAgZ2V0X3VucGF0Y2hlZF9jbGFzcyBpZiBpc2luc3RhbmNlKGl0ZW0sIHNpeC5jbGFzc190eXBlcykgZWxzZQogICAgICAgIGdldF91bnBhdGNoZWRfZnVuY3Rpb24gaWYgaXNpbnN0YW5jZShpdGVtLCB0eXBlcy5GdW5jdGlvblR5cGUpIGVsc2UKICAgICAgICBsYW1iZGEgaXRlbTogTm9uZQogICAgKQogICAgcmV0dXJuIGxvb2t1cChpdGVtKQoKCmRlZiBnZXRfdW5wYXRjaGVkX2NsYXNzKGNscyk6CiAgICAiIiJQcm90ZWN0IGFnYWluc3QgcmUtcGF0Y2hpbmcgdGhlIGRpc3R1dGlscyBpZiByZWxvYWRlZAoKICAgIEFsc28gZW5zdXJlcyB0aGF0IG5vIG90aGVyIGRpc3R1dGlscyBleHRlbnNpb24gbW9ua2V5cGF0Y2hlZCB0aGUgZGlzdHV0aWxzCiAgICBmaXJzdC4KICAgICIiIgogICAgZXh0ZXJuYWxfYmFzZXMgPSAoCiAgICAgICAgY2xzCiAgICAgICAgZm9yIGNscyBpbiBfZ2V0X21ybyhjbHMpCiAgICAgICAgaWYgbm90IGNscy5fX21vZHVsZV9fLnN0YXJ0c3dpdGgoJ3NldHVwdG9vbHMnKQogICAgKQogICAgYmFzZSA9IG5leHQoZXh0ZXJuYWxfYmFzZXMpCiAgICBpZiBub3QgYmFzZS5fX21vZHVsZV9fLnN0YXJ0c3dpdGgoJ2Rpc3R1dGlscycpOgogICAgICAgIG1zZyA9ICJkaXN0dXRpbHMgaGFzIGFscmVhZHkgYmVlbiBwYXRjaGVkIGJ5ICVyIiAlIGNscwogICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKG1zZykKICAgIHJldHVybiBiYXNlCgoKZGVmIHBhdGNoX2FsbCgpOgogICAgIyB3ZSBjYW4ndCBwYXRjaCBkaXN0dXRpbHMuY21kLCBhbGFzCiAgICBkaXN0dXRpbHMuY29yZS5Db21tYW5kID0gc2V0dXB0b29scy5Db21tYW5kCgogICAgaGFzX2lzc3VlXzEyODg1ID0gc3lzLnZlcnNpb25faW5mbyA8PSAoMywgNSwgMykKCiAgICBpZiBoYXNfaXNzdWVfMTI4ODU6CiAgICAgICAgIyBmaXggZmluZGFsbCBidWcgaW4gZGlzdHV0aWxzIChodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTI4ODUpCiAgICAgICAgZGlzdHV0aWxzLmZpbGVsaXN0LmZpbmRhbGwgPSBzZXR1cHRvb2xzLmZpbmRhbGwKCiAgICBuZWVkc193YXJlaG91c2UgPSAoCiAgICAgICAgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA3LCAxMykKICAgICAgICBvcgogICAgICAgICgzLCAwKSA8IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMywgNykKICAgICAgICBvcgogICAgICAgICgzLCA0KSA8IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgNCwgNikKICAgICAgICBvcgogICAgICAgICgzLCA1KSA8IHN5cy52ZXJzaW9uX2luZm8gPD0gKDMsIDUsIDMpCiAgICApCgogICAgaWYgbmVlZHNfd2FyZWhvdXNlOgogICAgICAgIHdhcmVob3VzZSA9ICdodHRwczovL3VwbG9hZC5weXBpLm9yZy9sZWdhY3kvJwogICAgICAgIGRpc3R1dGlscy5jb25maWcuUHlQSVJDQ29tbWFuZC5ERUZBVUxUX1JFUE9TSVRPUlkgPSB3YXJlaG91c2UKCiAgICBfcGF0Y2hfZGlzdHJpYnV0aW9uX21ldGFkYXRhX3dyaXRlX3BrZ19maWxlKCkKICAgIF9wYXRjaF9kaXN0cmlidXRpb25fbWV0YWRhdGFfd3JpdGVfcGtnX2luZm8oKQoKICAgICMgSW5zdGFsbCBEaXN0cmlidXRpb24gdGhyb3VnaG91dCB0aGUgZGlzdHV0aWxzCiAgICBmb3IgbW9kdWxlIGluIGRpc3R1dGlscy5kaXN0LCBkaXN0dXRpbHMuY29yZSwgZGlzdHV0aWxzLmNtZDoKICAgICAgICBtb2R1bGUuRGlzdHJpYnV0aW9uID0gc2V0dXB0b29scy5kaXN0LkRpc3RyaWJ1dGlvbgoKICAgICMgSW5zdGFsbCB0aGUgcGF0Y2hlZCBFeHRlbnNpb24KICAgIGRpc3R1dGlscy5jb3JlLkV4dGVuc2lvbiA9IHNldHVwdG9vbHMuZXh0ZW5zaW9uLkV4dGVuc2lvbgogICAgZGlzdHV0aWxzLmV4dGVuc2lvbi5FeHRlbnNpb24gPSBzZXR1cHRvb2xzLmV4dGVuc2lvbi5FeHRlbnNpb24KICAgIGlmICdkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQnIGluIHN5cy5tb2R1bGVzOgogICAgICAgIHN5cy5tb2R1bGVzWydkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQnXS5FeHRlbnNpb24gPSAoCiAgICAgICAgICAgIHNldHVwdG9vbHMuZXh0ZW5zaW9uLkV4dGVuc2lvbgogICAgICAgICkKCiAgICBwYXRjaF9mb3JfbXN2Y19zcGVjaWFsaXplZF9jb21waWxlcigpCgoKZGVmIF9wYXRjaF9kaXN0cmlidXRpb25fbWV0YWRhdGFfd3JpdGVfcGtnX2ZpbGUoKToKICAgICIiIlBhdGNoIHdyaXRlX3BrZ19maWxlIHRvIGFsc28gd3JpdGUgUmVxdWlyZXMtUHl0aG9uL1JlcXVpcmVzLUV4dGVybmFsIiIiCiAgICBkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb25NZXRhZGF0YS53cml0ZV9wa2dfZmlsZSA9ICgKICAgICAgICBzZXR1cHRvb2xzLmRpc3Qud3JpdGVfcGtnX2ZpbGUKICAgICkKCgpkZWYgX3BhdGNoX2Rpc3RyaWJ1dGlvbl9tZXRhZGF0YV93cml0ZV9wa2dfaW5mbygpOgogICAgIiIiCiAgICBXb3JrYXJvdW5kIGlzc3VlICMxOTcgLSBQeXRob24gMyBwcmlvciB0byAzLjIuMiB1c2VzIGFuIGVudmlyb25tZW50LWxvY2FsCiAgICBlbmNvZGluZyB0byBzYXZlIHRoZSBwa2dfaW5mby4gTW9ua2V5LXBhdGNoIGl0cyB3cml0ZV9wa2dfaW5mbyBtZXRob2QgdG8KICAgIGNvcnJlY3QgdGhpcyB1bmRlc2lyYWJsZSBiZWhhdmlvci4KICAgICIiIgogICAgZW52aXJvbm1lbnRfbG9jYWwgPSAoMywpIDw9IHN5cy52ZXJzaW9uX2luZm9bOjNdIDwgKDMsIDIsIDIpCiAgICBpZiBub3QgZW52aXJvbm1lbnRfbG9jYWw6CiAgICAgICAgcmV0dXJuCgogICAgZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uTWV0YWRhdGEud3JpdGVfcGtnX2luZm8gPSAoCiAgICAgICAgc2V0dXB0b29scy5kaXN0LndyaXRlX3BrZ19pbmZvCiAgICApCgoKZGVmIHBhdGNoX2Z1bmMocmVwbGFjZW1lbnQsIHRhcmdldF9tb2QsIGZ1bmNfbmFtZSk6CiAgICAiIiIKICAgIFBhdGNoIGZ1bmNfbmFtZSBpbiB0YXJnZXRfbW9kIHdpdGggcmVwbGFjZW1lbnQKCiAgICBJbXBvcnRhbnQgLSBvcmlnaW5hbCBtdXN0IGJlIHJlc29sdmVkIGJ5IG5hbWUgdG8gYXZvaWQKICAgIHBhdGNoaW5nIGFuIGFscmVhZHkgcGF0Y2hlZCBmdW5jdGlvbi4KICAgICIiIgogICAgb3JpZ2luYWwgPSBnZXRhdHRyKHRhcmdldF9tb2QsIGZ1bmNfbmFtZSkKCiAgICAjIHNldCB0aGUgJ3VucGF0Y2hlZCcgYXR0cmlidXRlIG9uIHRoZSByZXBsYWNlbWVudCB0bwogICAgIyBwb2ludCB0byB0aGUgb3JpZ2luYWwuCiAgICB2YXJzKHJlcGxhY2VtZW50KS5zZXRkZWZhdWx0KCd1bnBhdGNoZWQnLCBvcmlnaW5hbCkKCiAgICAjIHJlcGxhY2UgdGhlIGZ1bmN0aW9uIGluIHRoZSBvcmlnaW5hbCBtb2R1bGUKICAgIHNldGF0dHIodGFyZ2V0X21vZCwgZnVuY19uYW1lLCByZXBsYWNlbWVudCkKCgpkZWYgZ2V0X3VucGF0Y2hlZF9mdW5jdGlvbihjYW5kaWRhdGUpOgogICAgcmV0dXJuIGdldGF0dHIoY2FuZGlkYXRlLCAndW5wYXRjaGVkJykKCgpkZWYgcGF0Y2hfZm9yX21zdmNfc3BlY2lhbGl6ZWRfY29tcGlsZXIoKToKICAgICIiIgogICAgUGF0Y2ggZnVuY3Rpb25zIGluIGRpc3R1dGlscyB0byB1c2Ugc3RhbmRhbG9uZSBNaWNyb3NvZnQgVmlzdWFsIEMrKwogICAgY29tcGlsZXJzLgogICAgIiIiCiAgICAjIGltcG9ydCBsYXRlIHRvIGF2b2lkIGNpcmN1bGFyIGltcG9ydHMgb24gUHl0aG9uIDwgMy41CiAgICBtc3ZjID0gaW1wb3J0X21vZHVsZSgnc2V0dXB0b29scy5tc3ZjJykKCiAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cyc6CiAgICAgICAgIyBDb21waWxlcnMgb25seSBhdmFpbGFibGVzIG9uIE1pY3Jvc29mdCBXaW5kb3dzCiAgICAgICAgcmV0dXJuCgogICAgZGVmIHBhdGNoX3BhcmFtcyhtb2RfbmFtZSwgZnVuY19uYW1lKToKICAgICAgICAiIiIKICAgICAgICBQcmVwYXJlIHRoZSBwYXJhbWV0ZXJzIGZvciBwYXRjaF9mdW5jIHRvIHBhdGNoIGluZGljYXRlZCBmdW5jdGlvbi4KICAgICAgICAiIiIKICAgICAgICByZXBsX3ByZWZpeCA9ICdtc3ZjOV8nIGlmICdtc3ZjOScgaW4gbW9kX25hbWUgZWxzZSAnbXN2YzE0XycKICAgICAgICByZXBsX25hbWUgPSByZXBsX3ByZWZpeCArIGZ1bmNfbmFtZS5sc3RyaXAoJ18nKQogICAgICAgIHJlcGwgPSBnZXRhdHRyKG1zdmMsIHJlcGxfbmFtZSkKICAgICAgICBtb2QgPSBpbXBvcnRfbW9kdWxlKG1vZF9uYW1lKQogICAgICAgIGlmIG5vdCBoYXNhdHRyKG1vZCwgZnVuY19uYW1lKToKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoZnVuY19uYW1lKQogICAgICAgIHJldHVybiByZXBsLCBtb2QsIGZ1bmNfbmFtZQoKICAgICMgUHl0aG9uIDIuNyB0byAzLjQKICAgIG1zdmM5ID0gZnVuY3Rvb2xzLnBhcnRpYWwocGF0Y2hfcGFyYW1zLCAnZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXInKQoKICAgICMgUHl0aG9uIDMuNSsKICAgIG1zdmMxNCA9IGZ1bmN0b29scy5wYXJ0aWFsKHBhdGNoX3BhcmFtcywgJ2Rpc3R1dGlscy5fbXN2Y2NvbXBpbGVyJykKCiAgICB0cnk6CiAgICAgICAgIyBQYXRjaCBkaXN0dXRpbHMubXN2Yzljb21waWxlcgogICAgICAgIHBhdGNoX2Z1bmMoKm1zdmM5KCdmaW5kX3ZjdmFyc2FsbCcpKQogICAgICAgIHBhdGNoX2Z1bmMoKm1zdmM5KCdxdWVyeV92Y3ZhcnNhbGwnKSkKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBwYXNzCgogICAgdHJ5OgogICAgICAgICMgUGF0Y2ggZGlzdHV0aWxzLl9tc3ZjY29tcGlsZXIuX2dldF92Y19lbnYKICAgICAgICBwYXRjaF9mdW5jKCptc3ZjMTQoJ19nZXRfdmNfZW52JykpCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcGFzcwoKICAgIHRyeToKICAgICAgICAjIFBhdGNoIGRpc3R1dGlscy5fbXN2Y2NvbXBpbGVyLmdlbl9saWJfb3B0aW9ucyBmb3IgTnVtcHkKICAgICAgICBwYXRjaF9mdW5jKCptc3ZjMTQoJ2dlbl9saWJfb3B0aW9ucycpKQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHBhc3MKUEsDBBQAAAAAAAAAIQCCw5TmtJ8AALSfAAAqAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9tc3ZjLnB5IiIiCkltcHJvdmVkIHN1cHBvcnQgZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrIGNvbXBpbGVycy4KCktub3duIHN1cHBvcnRlZCBjb21waWxlcnM6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk1pY3Jvc29mdCBWaXN1YWwgQysrIDkuMDoKICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIENvbXBpbGVyIGZvciBQeXRob24gMi43ICh4ODYsIGFtZDY0KQogICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIDYuMSAoeDg2LCB4NjQsIGlhNjQpCiAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgNy4wICh4ODYsIHg2NCwgaWE2NCkKCk1pY3Jvc29mdCBWaXN1YWwgQysrIDEwLjA6CiAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgNy4xICh4ODYsIHg2NCwgaWE2NCkKCk1pY3Jvc29mdCBWaXN1YWwgQysrIDE0LjA6CiAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBCdWlsZCBUb29scyAyMDE1ICh4ODYsIHg2NCwgYXJtKQogICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMjAxNyAoeDg2LCB4NjQsIGFybSwgYXJtNjQpCiAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBCdWlsZCBUb29scyAyMDE3ICh4ODYsIHg2NCwgYXJtLCBhcm02NCkKIiIiCgppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgZGlzdHV0aWxzLmVycm9ycwpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnBhY2thZ2luZy52ZXJzaW9uIGltcG9ydCBMZWdhY3lWZXJzaW9uCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgZmlsdGVyZmFsc2UKCmZyb20gLm1vbmtleSBpbXBvcnQgZ2V0X3VucGF0Y2hlZAoKaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgogICAgZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IHdpbnJlZwogICAgc2FmZV9lbnYgPSBvcy5lbnZpcm9uCmVsc2U6CiAgICAiIiIKICAgIE1vY2sgd2lucmVnIGFuZCBlbnZpcm9uIHNvIHRoZSBtb2R1bGUgY2FuIGJlIGltcG9ydGVkCiAgICBvbiB0aGlzIHBsYXRmb3JtLgogICAgIiIiCgogICAgY2xhc3Mgd2lucmVnOgogICAgICAgIEhLRVlfVVNFUlMgPSBOb25lCiAgICAgICAgSEtFWV9DVVJSRU5UX1VTRVIgPSBOb25lCiAgICAgICAgSEtFWV9MT0NBTF9NQUNISU5FID0gTm9uZQogICAgICAgIEhLRVlfQ0xBU1NFU19ST09UID0gTm9uZQoKICAgIHNhZmVfZW52ID0gZGljdCgpCgpfbXN2Yzlfc3VwcHJlc3NfZXJyb3JzID0gKAogICAgIyBtc3ZjOWNvbXBpbGVyIGlzbid0IGF2YWlsYWJsZSBvbiBzb21lIHBsYXRmb3JtcwogICAgSW1wb3J0RXJyb3IsCiAgICAKICAgICMgbXN2Yzljb21waWxlciByYWlzZXMgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciBpbiBzb21lCiAgICAjIGVudmlyb25tZW50cy4gU2VlICMxMTE4LgogICAgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yLAopCgp0cnk6CiAgICBmcm9tIGRpc3R1dGlscy5tc3ZjOWNvbXBpbGVyIGltcG9ydCBSZWcKZXhjZXB0IF9tc3ZjOV9zdXBwcmVzc19lcnJvcnM6CiAgICBwYXNzCgoKZGVmIG1zdmM5X2ZpbmRfdmN2YXJzYWxsKHZlcnNpb24pOgogICAgIiIiCiAgICBQYXRjaGVkICJkaXN0dXRpbHMubXN2Yzljb21waWxlci5maW5kX3ZjdmFyc2FsbCIgdG8gdXNlIHRoZSBzdGFuZGFsb25lCiAgICBjb21waWxlciBidWlsZCBmb3IgUHl0aG9uIChWQ0ZvclB5dGhvbikuIEZhbGwgYmFjayB0byBvcmlnaW5hbCBiZWhhdmlvcgogICAgd2hlbiB0aGUgc3RhbmRhbG9uZSBjb21waWxlciBpcyBub3QgYXZhaWxhYmxlLgoKICAgIFJlZGlyZWN0IHRoZSBwYXRoIG9mICJ2Y3ZhcnNhbGwuYmF0Ii4KCiAgICBLbm93biBzdXBwb3J0ZWQgY29tcGlsZXJzCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyA5LjA6CiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgQ29tcGlsZXIgZm9yIFB5dGhvbiAyLjcgKHg4NiwgYW1kNjQpCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgdmVyc2lvbjogZmxvYXQKICAgICAgICBSZXF1aXJlZCBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uLgoKICAgIFJldHVybgogICAgLS0tLS0tCiAgICB2Y3ZhcnNhbGwuYmF0IHBhdGg6IHN0cgogICAgIiIiCiAgICBWQ19CQVNFID0gcidTb2Z0d2FyZVwlc01pY3Jvc29mdFxEZXZEaXZcVkNGb3JQeXRob25cJTAuMWYnCiAgICBrZXkgPSBWQ19CQVNFICUgKCcnLCB2ZXJzaW9uKQogICAgdHJ5OgogICAgICAgICMgUGVyLXVzZXIgaW5zdGFsbHMgcmVnaXN0ZXIgdGhlIGNvbXBpbGVyIHBhdGggaGVyZQogICAgICAgIHByb2R1Y3RkaXIgPSBSZWcuZ2V0X3ZhbHVlKGtleSwgImluc3RhbGxkaXIiKQogICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBBbGwtdXNlciBpbnN0YWxscyBvbiBhIDY0LWJpdCBzeXN0ZW0gcmVnaXN0ZXIgaGVyZQogICAgICAgICAgICBrZXkgPSBWQ19CQVNFICUgKCdXb3c2NDMyTm9kZVxcJywgdmVyc2lvbikKICAgICAgICAgICAgcHJvZHVjdGRpciA9IFJlZy5nZXRfdmFsdWUoa2V5LCAiaW5zdGFsbGRpciIpCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBwcm9kdWN0ZGlyID0gTm9uZQoKICAgIGlmIHByb2R1Y3RkaXI6CiAgICAgICAgdmN2YXJzYWxsID0gb3MucGF0aC5vcy5wYXRoLmpvaW4ocHJvZHVjdGRpciwgInZjdmFyc2FsbC5iYXQiKQogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHZjdmFyc2FsbCk6CiAgICAgICAgICAgIHJldHVybiB2Y3ZhcnNhbGwKCiAgICByZXR1cm4gZ2V0X3VucGF0Y2hlZChtc3ZjOV9maW5kX3ZjdmFyc2FsbCkodmVyc2lvbikKCgpkZWYgbXN2YzlfcXVlcnlfdmN2YXJzYWxsKHZlciwgYXJjaD0neDg2JywgKmFyZ3MsICoqa3dhcmdzKToKICAgICIiIgogICAgUGF0Y2hlZCAiZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXIucXVlcnlfdmN2YXJzYWxsIiBmb3Igc3VwcG9ydCBleHRyYQogICAgY29tcGlsZXJzLgoKICAgIFNldCBlbnZpcm9ubWVudCB3aXRob3V0IHVzZSBvZiAidmN2YXJzYWxsLmJhdCIuCgogICAgS25vd24gc3VwcG9ydGVkIGNvbXBpbGVycwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgOS4wOgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIENvbXBpbGVyIGZvciBQeXRob24gMi43ICh4ODYsIGFtZDY0KQogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyA2LjEgKHg4NiwgeDY0LCBpYTY0KQogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyA3LjAgKHg4NiwgeDY0LCBpYTY0KQoKICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIDEwLjA6CiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIDcuMSAoeDg2LCB4NjQsIGlhNjQpCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgdmVyOiBmbG9hdAogICAgICAgIFJlcXVpcmVkIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24uCiAgICBhcmNoOiBzdHIKICAgICAgICBUYXJnZXQgYXJjaGl0ZWN0dXJlLgoKICAgIFJldHVybgogICAgLS0tLS0tCiAgICBlbnZpcm9ubWVudDogZGljdAogICAgIiIiCiAgICAjIFRyeSB0byBnZXQgZW52aXJvbmVtZW50IGZyb20gdmN2YXJzYWxsLmJhdCAoQ2xhc3NpY2FsIHdheSkKICAgIHRyeToKICAgICAgICBvcmlnID0gZ2V0X3VucGF0Y2hlZChtc3ZjOV9xdWVyeV92Y3ZhcnNhbGwpCiAgICAgICAgcmV0dXJuIG9yaWcodmVyLCBhcmNoLCAqYXJncywgKiprd2FyZ3MpCiAgICBleGNlcHQgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yOgogICAgICAgICMgUGFzcyBlcnJvciBpZiBWY3ZhcnNhbGwuYmF0IGlzIG1pc3NpbmcKICAgICAgICBwYXNzCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAjIFBhc3MgZXJyb3IgaWYgZW52aXJvbm1lbnQgbm90IHNldCBhZnRlciBleGVjdXRpbmcgdmN2YXJzYWxsLmJhdAogICAgICAgIHBhc3MKCiAgICAjIElmIGVycm9yLCB0cnkgdG8gc2V0IGVudmlyb25tZW50IGRpcmVjdGx5CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIEVudmlyb25tZW50SW5mbyhhcmNoLCB2ZXIpLnJldHVybl9lbnYoKQogICAgZXhjZXB0IGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvciBhcyBleGM6CiAgICAgICAgX2F1Z21lbnRfZXhjZXB0aW9uKGV4YywgdmVyLCBhcmNoKQogICAgICAgIHJhaXNlCgoKZGVmIG1zdmMxNF9nZXRfdmNfZW52KHBsYXRfc3BlYyk6CiAgICAiIiIKICAgIFBhdGNoZWQgImRpc3R1dGlscy5fbXN2Y2NvbXBpbGVyLl9nZXRfdmNfZW52IiBmb3Igc3VwcG9ydCBleHRyYQogICAgY29tcGlsZXJzLgoKICAgIFNldCBlbnZpcm9ubWVudCB3aXRob3V0IHVzZSBvZiAidmN2YXJzYWxsLmJhdCIuCgogICAgS25vd24gc3VwcG9ydGVkIGNvbXBpbGVycwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgMTQuMDoKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBCdWlsZCBUb29scyAyMDE1ICh4ODYsIHg2NCwgYXJtKQogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDIwMTcgKHg4NiwgeDY0LCBhcm0sIGFybTY0KQogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIEJ1aWxkIFRvb2xzIDIwMTcgKHg4NiwgeDY0LCBhcm0sIGFybTY0KQoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHBsYXRfc3BlYzogc3RyCiAgICAgICAgVGFyZ2V0IGFyY2hpdGVjdHVyZS4KCiAgICBSZXR1cm4KICAgIC0tLS0tLQogICAgZW52aXJvbm1lbnQ6IGRpY3QKICAgICIiIgogICAgIyBUcnkgdG8gZ2V0IGVudmlyb25tZW50IGZyb20gdmN2YXJzYWxsLmJhdCAoQ2xhc3NpY2FsIHdheSkKICAgIHRyeToKICAgICAgICByZXR1cm4gZ2V0X3VucGF0Y2hlZChtc3ZjMTRfZ2V0X3ZjX2VudikocGxhdF9zcGVjKQogICAgZXhjZXB0IGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvcjoKICAgICAgICAjIFBhc3MgZXJyb3IgVmN2YXJzYWxsLmJhdCBpcyBtaXNzaW5nCiAgICAgICAgcGFzcwoKICAgICMgSWYgZXJyb3IsIHRyeSB0byBzZXQgZW52aXJvbm1lbnQgZGlyZWN0bHkKICAgIHRyeToKICAgICAgICByZXR1cm4gRW52aXJvbm1lbnRJbmZvKHBsYXRfc3BlYywgdmNfbWluX3Zlcj0xNC4wKS5yZXR1cm5fZW52KCkKICAgIGV4Y2VwdCBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IgYXMgZXhjOgogICAgICAgIF9hdWdtZW50X2V4Y2VwdGlvbihleGMsIDE0LjApCiAgICAgICAgcmFpc2UKCgpkZWYgbXN2YzE0X2dlbl9saWJfb3B0aW9ucygqYXJncywgKiprd2FyZ3MpOgogICAgIiIiCiAgICBQYXRjaGVkICJkaXN0dXRpbHMuX21zdmNjb21waWxlci5nZW5fbGliX29wdGlvbnMiIGZvciBmaXgKICAgIGNvbXBhdGliaWxpdHkgYmV0d2VlbiAibnVtcHkuZGlzdHV0aWxzIiBhbmQgImRpc3R1dGlscy5fbXN2Y2NvbXBpbGVyIgogICAgKGZvciBOdW1weSA8IDEuMTEuMikKICAgICIiIgogICAgaWYgIm51bXB5LmRpc3R1dGlscyIgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgaW1wb3J0IG51bXB5IGFzIG5wCiAgICAgICAgaWYgTGVnYWN5VmVyc2lvbihucC5fX3ZlcnNpb25fXykgPCBMZWdhY3lWZXJzaW9uKCcxLjExLjInKToKICAgICAgICAgICAgcmV0dXJuIG5wLmRpc3R1dGlscy5jY29tcGlsZXIuZ2VuX2xpYl9vcHRpb25zKCphcmdzLCAqKmt3YXJncykKICAgIHJldHVybiBnZXRfdW5wYXRjaGVkKG1zdmMxNF9nZW5fbGliX29wdGlvbnMpKCphcmdzLCAqKmt3YXJncykKCgpkZWYgX2F1Z21lbnRfZXhjZXB0aW9uKGV4YywgdmVyc2lvbiwgYXJjaD0nJyk6CiAgICAiIiIKICAgIEFkZCBkZXRhaWxzIHRvIHRoZSBleGNlcHRpb24gbWVzc2FnZSB0byBoZWxwIGd1aWRlIHRoZSB1c2VyCiAgICBhcyB0byB3aGF0IGFjdGlvbiB3aWxsIHJlc29sdmUgaXQuCiAgICAiIiIKICAgICMgRXJyb3IgaWYgTVNWQysrIGRpcmVjdG9yeSBub3QgZm91bmQgb3IgZW52aXJvbm1lbnQgbm90IHNldAogICAgbWVzc2FnZSA9IGV4Yy5hcmdzWzBdCgogICAgaWYgInZjdmFyc2FsbCIgaW4gbWVzc2FnZS5sb3dlcigpIG9yICJ2aXN1YWwgYyIgaW4gbWVzc2FnZS5sb3dlcigpOgogICAgICAgICMgU3BlY2lhbCBlcnJvciBtZXNzYWdlIGlmIE1TVkMrKyBub3QgaW5zdGFsbGVkCiAgICAgICAgdG1wbCA9ICdNaWNyb3NvZnQgVmlzdWFsIEMrKyB7dmVyc2lvbjowLjFmfSBpcyByZXF1aXJlZC4nCiAgICAgICAgbWVzc2FnZSA9IHRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpCiAgICAgICAgbXNkb3dubG9hZCA9ICd3d3cubWljcm9zb2Z0LmNvbS9kb3dubG9hZC9kZXRhaWxzLmFzcHg/aWQ9JWQnCiAgICAgICAgaWYgdmVyc2lvbiA9PSA5LjA6CiAgICAgICAgICAgIGlmIGFyY2gubG93ZXIoKS5maW5kKCdpYTY0JykgPiAtMToKICAgICAgICAgICAgICAgICMgRm9yIFZDKysgOS4wLCBpZiBJQTY0IHN1cHBvcnQgaXMgbmVlZGVkLCByZWRpcmVjdCB1c2VyCiAgICAgICAgICAgICAgICAjIHRvIFdpbmRvd3MgU0RLIDcuMAogICAgICAgICAgICAgICAgbWVzc2FnZSArPSAnIEdldCBpdCB3aXRoICJNaWNyb3NvZnQgV2luZG93cyBTREsgNy4wIjogJwogICAgICAgICAgICAgICAgbWVzc2FnZSArPSBtc2Rvd25sb2FkICUgMzEzOAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBGb3IgVkMrKyA5LjAgcmVkaXJlY3QgdXNlciB0byBWYysrIGZvciBQeXRob24gMi43IDoKICAgICAgICAgICAgICAgICMgVGhpcyByZWRpcmVjdGlvbiBsaW5rIGlzIG1haW50YWluZWQgYnkgTWljcm9zb2Z0LgogICAgICAgICAgICAgICAgIyBDb250YWN0IHZzcHl0aG9uQG1pY3Jvc29mdC5jb20gaWYgaXQgbmVlZHMgdXBkYXRpbmcuCiAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICcgR2V0IGl0IGZyb20gaHR0cDovL2FrYS5tcy92Y3B5dGhvbjI3JwogICAgICAgIGVsaWYgdmVyc2lvbiA9PSAxMC4wOgogICAgICAgICAgICAjIEZvciBWQysrIDEwLjAgUmVkaXJlY3QgdXNlciB0byBXaW5kb3dzIFNESyA3LjEKICAgICAgICAgICAgbWVzc2FnZSArPSAnIEdldCBpdCB3aXRoICJNaWNyb3NvZnQgV2luZG93cyBTREsgNy4xIjogJwogICAgICAgICAgICBtZXNzYWdlICs9IG1zZG93bmxvYWQgJSA4Mjc5CiAgICAgICAgZWxpZiB2ZXJzaW9uID49IDE0LjA6CiAgICAgICAgICAgICMgRm9yIFZDKysgMTQuMCBSZWRpcmVjdCB1c2VyIHRvIFZpc3VhbCBDKysgQnVpbGQgVG9vbHMKICAgICAgICAgICAgbWVzc2FnZSArPSAoJyBHZXQgaXQgd2l0aCAiTWljcm9zb2Z0IFZpc3VhbCBDKysgQnVpbGQgVG9vbHMiOiAnCiAgICAgICAgICAgICAgICAgICAgICAgIHInaHR0cDovL2xhbmRpbmdodWIudmlzdWFsc3R1ZGlvLmNvbS8nCiAgICAgICAgICAgICAgICAgICAgICAgICd2aXN1YWwtY3BwLWJ1aWxkLXRvb2xzJykKCiAgICBleGMuYXJncyA9IChtZXNzYWdlLCApCgoKY2xhc3MgUGxhdGZvcm1JbmZvOgogICAgIiIiCiAgICBDdXJyZW50IGFuZCBUYXJnZXQgQXJjaGl0ZWN0dXJlcyBpbmZvcm1hdGlvbnMuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYXJjaDogc3RyCiAgICAgICAgVGFyZ2V0IGFyY2hpdGVjdHVyZS4KICAgICIiIgogICAgY3VycmVudF9jcHUgPSBzYWZlX2Vudi5nZXQoJ3Byb2Nlc3Nvcl9hcmNoaXRlY3R1cmUnLCAnJykubG93ZXIoKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmNoKToKICAgICAgICBzZWxmLmFyY2ggPSBhcmNoLmxvd2VyKCkucmVwbGFjZSgneDY0JywgJ2FtZDY0JykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB0YXJnZXRfY3B1KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyY2hbc2VsZi5hcmNoLmZpbmQoJ18nKSArIDE6XQoKICAgIGRlZiB0YXJnZXRfaXNfeDg2KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnRhcmdldF9jcHUgPT0gJ3g4NicKCiAgICBkZWYgY3VycmVudF9pc194ODYoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuY3VycmVudF9jcHUgPT0gJ3g4NicKCiAgICBkZWYgY3VycmVudF9kaXIoc2VsZiwgaGlkZXg4Nj1GYWxzZSwgeDY0PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBDdXJyZW50IHBsYXRmb3JtIHNwZWNpZmljIHN1YmZvbGRlci4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBoaWRleDg2OiBib29sCiAgICAgICAgICAgIHJldHVybiAnJyBhbmQgbm90ICdceDg2JyBpZiBhcmNoaXRlY3R1cmUgaXMgeDg2LgogICAgICAgIHg2NDogYm9vbAogICAgICAgICAgICByZXR1cm4gJ1x4NjQnIGFuZCBub3QgJ1xhbWQ2NCcgaWYgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdWJmb2xkZXI6IHN0cgogICAgICAgICAgICAnXHRhcmdldCcsIG9yICcnIChzZWUgaGlkZXg4NiBwYXJhbWV0ZXIpCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgJycgaWYgKHNlbGYuY3VycmVudF9jcHUgPT0gJ3g4NicgYW5kIGhpZGV4ODYpIGVsc2UKICAgICAgICAgICAgcidceDY0JyBpZiAoc2VsZi5jdXJyZW50X2NwdSA9PSAnYW1kNjQnIGFuZCB4NjQpIGVsc2UKICAgICAgICAgICAgcidcJXMnICUgc2VsZi5jdXJyZW50X2NwdQogICAgICAgICkKCiAgICBkZWYgdGFyZ2V0X2RpcihzZWxmLCBoaWRleDg2PUZhbHNlLCB4NjQ9RmFsc2UpOgogICAgICAgIHIiIiIKICAgICAgICBUYXJnZXQgcGxhdGZvcm0gc3BlY2lmaWMgc3ViZm9sZGVyLgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIGhpZGV4ODY6IGJvb2wKICAgICAgICAgICAgcmV0dXJuICcnIGFuZCBub3QgJ1x4ODYnIGlmIGFyY2hpdGVjdHVyZSBpcyB4ODYuCiAgICAgICAgeDY0OiBib29sCiAgICAgICAgICAgIHJldHVybiAnXHg2NCcgYW5kIG5vdCAnXGFtZDY0JyBpZiBhcmNoaXRlY3R1cmUgaXMgYW1kNjQuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN1YmZvbGRlcjogc3RyCiAgICAgICAgICAgICdcY3VycmVudCcsIG9yICcnIChzZWUgaGlkZXg4NiBwYXJhbWV0ZXIpCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgJycgaWYgKHNlbGYudGFyZ2V0X2NwdSA9PSAneDg2JyBhbmQgaGlkZXg4NikgZWxzZQogICAgICAgICAgICByJ1x4NjQnIGlmIChzZWxmLnRhcmdldF9jcHUgPT0gJ2FtZDY0JyBhbmQgeDY0KSBlbHNlCiAgICAgICAgICAgIHInXCVzJyAlIHNlbGYudGFyZ2V0X2NwdQogICAgICAgICkKCiAgICBkZWYgY3Jvc3NfZGlyKHNlbGYsIGZvcmNleDg2PUZhbHNlKToKICAgICAgICByIiIiCiAgICAgICAgQ3Jvc3MgcGxhdGZvcm0gc3BlY2lmaWMgc3ViZm9sZGVyLgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIGZvcmNleDg2OiBib29sCiAgICAgICAgICAgIFVzZSAneDg2JyBhcyBjdXJyZW50IGFyY2hpdGVjdHVyZSBldmVuIGlmIGN1cnJlbnQgYWNyaXRlY3R1cmUgaXMKICAgICAgICAgICAgbm90IHg4Ni4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3ViZm9sZGVyOiBzdHIKICAgICAgICAgICAgJycgaWYgdGFyZ2V0IGFyY2hpdGVjdHVyZSBpcyBjdXJyZW50IGFyY2hpdGVjdHVyZSwKICAgICAgICAgICAgJ1xjdXJyZW50X3RhcmdldCcgaWYgbm90LgogICAgICAgICIiIgogICAgICAgIGN1cnJlbnQgPSAneDg2JyBpZiBmb3JjZXg4NiBlbHNlIHNlbGYuY3VycmVudF9jcHUKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAnJyBpZiBzZWxmLnRhcmdldF9jcHUgPT0gY3VycmVudCBlbHNlCiAgICAgICAgICAgIHNlbGYudGFyZ2V0X2RpcigpLnJlcGxhY2UoJ1xcJywgJ1xcJXNfJyAlIGN1cnJlbnQpCiAgICAgICAgKQoKCmNsYXNzIFJlZ2lzdHJ5SW5mbzoKICAgICIiIgogICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gcmVsYXRlZCByZWdpc3RyeSBpbmZvcm1hdGlvbnMuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgcGxhdGZvcm1faW5mbzogUGxhdGZvcm1JbmZvCiAgICAgICAgIlBsYXRmb3JtSW5mbyIgaW5zdGFuY2UuCiAgICAiIiIKICAgIEhLRVlTID0gKHdpbnJlZy5IS0VZX1VTRVJTLAogICAgICAgICAgICAgd2lucmVnLkhLRVlfQ1VSUkVOVF9VU0VSLAogICAgICAgICAgICAgd2lucmVnLkhLRVlfTE9DQUxfTUFDSElORSwKICAgICAgICAgICAgIHdpbnJlZy5IS0VZX0NMQVNTRVNfUk9PVCkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGxhdGZvcm1faW5mbyk6CiAgICAgICAgc2VsZi5waSA9IHBsYXRmb3JtX2luZm8KCiAgICBAcHJvcGVydHkKICAgIGRlZiB2aXN1YWxzdHVkaW8oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gcm9vdCByZWdpc3RyeSBrZXkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICdWaXN1YWxTdHVkaW8nCgogICAgQHByb3BlcnR5CiAgICBkZWYgc3hzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFN4UyByZWdpc3RyeSBrZXkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLnZpc3VhbHN0dWRpbywgJ1N4UycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgVkM3IHJlZ2lzdHJ5IGtleS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuc3hzLCAnVkM3JykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2cyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBWUzcgcmVnaXN0cnkga2V5LgogICAgICAgICIiIgogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5zeHMsICdWUzcnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZjX2Zvcl9weXRob24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgZm9yIFB5dGhvbiByZWdpc3RyeSBrZXkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHInRGV2RGl2XFZDRm9yUHl0aG9uJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG1pY3Jvc29mdF9zZGsoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFNESyByZWdpc3RyeSBrZXkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICdNaWNyb3NvZnQgU0RLcycKCiAgICBAcHJvcGVydHkKICAgIGRlZiB3aW5kb3dzX3NkayhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cy9QbGF0Zm9ybSBTREsgcmVnaXN0cnkga2V5LgogICAgICAgICIiIgogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5taWNyb3NvZnRfc2RrLCAnV2luZG93cycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgbmV0Znhfc2RrKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayBTREsgcmVnaXN0cnkga2V5LgogICAgICAgICIiIgogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5taWNyb3NvZnRfc2RrLCAnTkVURlhTREsnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdpbmRvd3Nfa2l0c19yb290cyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBLaXRzIFJvb3RzIHJlZ2lzdHJ5IGtleS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gcidXaW5kb3dzIEtpdHNcSW5zdGFsbGVkIFJvb3RzJwoKICAgIGRlZiBtaWNyb3NvZnQoc2VsZiwga2V5LCB4ODY9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBrZXkgaW4gTWljcm9zb2Z0IHNvZnR3YXJlIHJlZ2lzdHJ5LgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIGtleTogc3RyCiAgICAgICAgICAgIFJlZ2lzdHJ5IGtleSBwYXRoIHdoZXJlIGxvb2suCiAgICAgICAgeDg2OiBzdHIKICAgICAgICAgICAgRm9yY2UgeDg2IHNvZnR3YXJlIHJlZ2lzdHJ5LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHI6IHZhbHVlCiAgICAgICAgIiIiCiAgICAgICAgbm9kZTY0ID0gJycgaWYgc2VsZi5waS5jdXJyZW50X2lzX3g4NigpIG9yIHg4NiBlbHNlICdXb3c2NDMyTm9kZScKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKCdTb2Z0d2FyZScsIG5vZGU2NCwgJ01pY3Jvc29mdCcsIGtleSkKCiAgICBkZWYgbG9va3VwKHNlbGYsIGtleSwgbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgTG9vayBmb3IgdmFsdWVzIGluIHJlZ2lzdHJ5IGluIE1pY3Jvc29mdCBzb2Z0d2FyZSByZWdpc3RyeS4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBrZXk6IHN0cgogICAgICAgICAgICBSZWdpc3RyeSBrZXkgcGF0aCB3aGVyZSBsb29rLgogICAgICAgIG5hbWU6IHN0cgogICAgICAgICAgICBWYWx1ZSBuYW1lIHRvIGZpbmQuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN0cjogdmFsdWUKICAgICAgICAiIiIKICAgICAgICBLRVlfUkVBRCA9IHdpbnJlZy5LRVlfUkVBRAogICAgICAgIG9wZW5rZXkgPSB3aW5yZWcuT3BlbktleQogICAgICAgIG1zID0gc2VsZi5taWNyb3NvZnQKICAgICAgICBmb3IgaGtleSBpbiBzZWxmLkhLRVlTOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBia2V5ID0gb3BlbmtleShoa2V5LCBtcyhrZXkpLCAwLCBLRVlfUkVBRCkKICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBpLmN1cnJlbnRfaXNfeDg2KCk6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBia2V5ID0gb3BlbmtleShoa2V5LCBtcyhrZXksIFRydWUpLCAwLCBLRVlfUkVBRCkKICAgICAgICAgICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gd2lucmVnLlF1ZXJ5VmFsdWVFeChia2V5LCBuYW1lKVswXQogICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICAgICAgcGFzcwoKCmNsYXNzIFN5c3RlbUluZm86CiAgICAiIiIKICAgIE1pY3Jvc29mdCBXaW5kb3dzIGFuZCBWaXN1YWwgU3R1ZGlvIHJlbGF0ZWQgc3lzdGVtIGlub3JtYXRpb25zLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHJlZ2lzdHJ5X2luZm86IFJlZ2lzdHJ5SW5mbwogICAgICAgICJSZWdpc3RyeUluZm8iIGluc3RhbmNlLgogICAgdmNfdmVyOiBmbG9hdAogICAgICAgIFJlcXVpcmVkIE1pY3Jvc29mdCBWaXN1YWwgQysrIHZlcnNpb24uCiAgICAiIiIKCiAgICAjIFZhcmlhYmxlcyBhbmQgcHJvcGVydGllcyBpbiB0aGlzIGNsYXNzIHVzZSBvcmlnaW5hbHMgQ2FtZWxDYXNlIHZhcmlhYmxlcwogICAgIyBuYW1lcyBmcm9tIE1pY3Jvc29mdCBzb3VyY2UgZmlsZXMgZm9yIG1vcmUgZWFzeSBjb21wYXJhaXNvbi4KICAgIFdpbkRpciA9IHNhZmVfZW52LmdldCgnV2luRGlyJywgJycpCiAgICBQcm9ncmFtRmlsZXMgPSBzYWZlX2Vudi5nZXQoJ1Byb2dyYW1GaWxlcycsICcnKQogICAgUHJvZ3JhbUZpbGVzeDg2ID0gc2FmZV9lbnYuZ2V0KCdQcm9ncmFtRmlsZXMoeDg2KScsIFByb2dyYW1GaWxlcykKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcmVnaXN0cnlfaW5mbywgdmNfdmVyPU5vbmUpOgogICAgICAgIHNlbGYucmkgPSByZWdpc3RyeV9pbmZvCiAgICAgICAgc2VsZi5waSA9IHNlbGYucmkucGkKICAgICAgICBzZWxmLnZjX3ZlciA9IHZjX3ZlciBvciBzZWxmLl9maW5kX2xhdGVzdF9hdmFpbGFibGVfdmNfdmVyKCkKCiAgICBkZWYgX2ZpbmRfbGF0ZXN0X2F2YWlsYWJsZV92Y192ZXIoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5maW5kX2F2YWlsYWJsZV92Y192ZXJzKClbLTFdCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgIGVyciA9ICdObyBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uIGZvdW5kJwogICAgICAgICAgICByYWlzZSBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IoZXJyKQoKICAgIGRlZiBmaW5kX2F2YWlsYWJsZV92Y192ZXJzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEZpbmQgYWxsIGF2YWlsYWJsZSBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9ucy4KICAgICAgICAiIiIKICAgICAgICBtcyA9IHNlbGYucmkubWljcm9zb2Z0CiAgICAgICAgdmNrZXlzID0gKHNlbGYucmkudmMsIHNlbGYucmkudmNfZm9yX3B5dGhvbiwgc2VsZi5yaS52cykKICAgICAgICB2Y192ZXJzID0gW10KICAgICAgICBmb3IgaGtleSBpbiBzZWxmLnJpLkhLRVlTOgogICAgICAgICAgICBmb3Iga2V5IGluIHZja2V5czoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBia2V5ID0gd2lucmVnLk9wZW5LZXkoaGtleSwgbXMoa2V5KSwgMCwgd2lucmVnLktFWV9SRUFEKQogICAgICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgc3Via2V5cywgdmFsdWVzLCBfID0gd2lucmVnLlF1ZXJ5SW5mb0tleShia2V5KQogICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UodmFsdWVzKToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHZlciA9IGZsb2F0KHdpbnJlZy5FbnVtVmFsdWUoYmtleSwgaSlbMF0pCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZlciBub3QgaW4gdmNfdmVyczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZjX3ZlcnMuYXBwZW5kKHZlcikKICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3Via2V5cyk6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICB2ZXIgPSBmbG9hdCh3aW5yZWcuRW51bUtleShia2V5LCBpKSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmVyIG5vdCBpbiB2Y192ZXJzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmNfdmVycy5hcHBlbmQodmVyKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIHNvcnRlZCh2Y192ZXJzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZTSW5zdGFsbERpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgIyBEZWZhdWx0IHBhdGgKICAgICAgICBuYW1lID0gJ01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvICUwLjFmJyAlIHNlbGYudmNfdmVyCiAgICAgICAgZGVmYXVsdCA9IG9zLnBhdGguam9pbihzZWxmLlByb2dyYW1GaWxlc3g4NiwgbmFtZSkKCiAgICAgICAgIyBUcnkgdG8gZ2V0IHBhdGggZnJvbSByZWdpc3RyeSwgaWYgZmFpbCB1c2UgZGVmYXVsdCBwYXRoCiAgICAgICAgcmV0dXJuIHNlbGYucmkubG9va3VwKHNlbGYucmkudnMsICclMC4xZicgJSBzZWxmLnZjX3Zlcikgb3IgZGVmYXVsdAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZDSW5zdGFsbERpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5WU0luc3RhbGxEaXIKCiAgICAgICAgZ3Vlc3NfdmMgPSBzZWxmLl9ndWVzc192YygpIG9yIHNlbGYuX2d1ZXNzX3ZjX2xlZ2FjeSgpCgogICAgICAgICMgVHJ5IHRvIGdldCAiVkMrKyBmb3IgUHl0aG9uIiBwYXRoIGZyb20gcmVnaXN0cnkgYXMgZGVmYXVsdCBwYXRoCiAgICAgICAgcmVnX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5yaS52Y19mb3JfcHl0aG9uLCAnJTAuMWYnICUgc2VsZi52Y192ZXIpCiAgICAgICAgcHl0aG9uX3ZjID0gc2VsZi5yaS5sb29rdXAocmVnX3BhdGgsICdpbnN0YWxsZGlyJykKICAgICAgICBkZWZhdWx0X3ZjID0gb3MucGF0aC5qb2luKHB5dGhvbl92YywgJ1ZDJykgaWYgcHl0aG9uX3ZjIGVsc2UgZ3Vlc3NfdmMKCiAgICAgICAgIyBUcnkgdG8gZ2V0IHBhdGggZnJvbSByZWdpc3RyeSwgaWYgZmFpbCB1c2UgZGVmYXVsdCBwYXRoCiAgICAgICAgcGF0aCA9IHNlbGYucmkubG9va3VwKHNlbGYucmkudmMsICclMC4xZicgJSBzZWxmLnZjX3Zlcikgb3IgZGVmYXVsdF92YwoKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihwYXRoKToKICAgICAgICAgICAgbXNnID0gJ01pY3Jvc29mdCBWaXN1YWwgQysrIGRpcmVjdG9yeSBub3QgZm91bmQnCiAgICAgICAgICAgIHJhaXNlIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihtc2cpCgogICAgICAgIHJldHVybiBwYXRoCgogICAgZGVmIF9ndWVzc192YyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBMb2NhdGUgVmlzdWFsIEMgZm9yIDIwMTcKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8PSAxNC4wOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZGVmYXVsdCA9IHInVkNcVG9vbHNcTVNWQycKICAgICAgICBndWVzc192YyA9IG9zLnBhdGguam9pbihzZWxmLlZTSW5zdGFsbERpciwgZGVmYXVsdCkKICAgICAgICAjIFN1YmRpciB3aXRoIFZDIGV4YWN0IHZlcnNpb24gYXMgbmFtZQogICAgICAgIHRyeToKICAgICAgICAgICAgdmNfZXhhY3RfdmVyID0gb3MubGlzdGRpcihndWVzc192YylbLTFdCiAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oZ3Vlc3NfdmMsIHZjX2V4YWN0X3ZlcikKICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IsIEluZGV4RXJyb3IpOgogICAgICAgICAgICBwYXNzCgogICAgZGVmIF9ndWVzc192Y19sZWdhY3koc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTG9jYXRlIFZpc3VhbCBDIGZvciB2ZXJzaW9ucyBwcmlvciB0byAyMDE3CiAgICAgICAgIiIiCiAgICAgICAgZGVmYXVsdCA9IHInTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gJTAuMWZcVkMnICUgc2VsZi52Y192ZXIKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuUHJvZ3JhbUZpbGVzeDg2LCBkZWZhdWx0KQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFdpbmRvd3NTZGtWZXJzaW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyB2ZXJzaW9ucyBmb3Igc3BlY2lmaWVkIE1TVkMrKyB2ZXJzaW9uLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyIDw9IDkuMDoKICAgICAgICAgICAgcmV0dXJuICgnNy4wJywgJzYuMScsICc2LjBhJykKICAgICAgICBlbGlmIHNlbGYudmNfdmVyID09IDEwLjA6CiAgICAgICAgICAgIHJldHVybiAoJzcuMScsICc3LjBhJykKICAgICAgICBlbGlmIHNlbGYudmNfdmVyID09IDExLjA6CiAgICAgICAgICAgIHJldHVybiAoJzguMCcsICc4LjBhJykKICAgICAgICBlbGlmIHNlbGYudmNfdmVyID09IDEyLjA6CiAgICAgICAgICAgIHJldHVybiAoJzguMScsICc4LjFhJykKICAgICAgICBlbGlmIHNlbGYudmNfdmVyID49IDE0LjA6CiAgICAgICAgICAgIHJldHVybiAoJzEwLjAnLCAnOC4xJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBXaW5kb3dzU2RrTGFzdFZlcnNpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIGxhc3QgdmVyc2lvbgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl91c2VfbGFzdF9kaXJfbmFtZShvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIHNlbGYuV2luZG93c1Nka0RpciwgJ2xpYicpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFdpbmRvd3NTZGtEaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIGRpcmVjdG9yeS4KICAgICAgICAiIiIKICAgICAgICBzZGtkaXIgPSAnJwogICAgICAgIGZvciB2ZXIgaW4gc2VsZi5XaW5kb3dzU2RrVmVyc2lvbjoKICAgICAgICAgICAgIyBUcnkgdG8gZ2V0IGl0IGZyb20gcmVnaXN0cnkKICAgICAgICAgICAgbG9jID0gb3MucGF0aC5qb2luKHNlbGYucmkud2luZG93c19zZGssICd2JXMnICUgdmVyKQogICAgICAgICAgICBzZGtkaXIgPSBzZWxmLnJpLmxvb2t1cChsb2MsICdpbnN0YWxsYXRpb25mb2xkZXInKQogICAgICAgICAgICBpZiBzZGtkaXI6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIG5vdCBzZGtkaXIgb3Igbm90IG9zLnBhdGguaXNkaXIoc2RrZGlyKToKICAgICAgICAgICAgIyBUcnkgdG8gZ2V0ICJWQysrIGZvciBQeXRob24iIHZlcnNpb24gZnJvbSByZWdpc3RyeQogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYucmkudmNfZm9yX3B5dGhvbiwgJyUwLjFmJyAlIHNlbGYudmNfdmVyKQogICAgICAgICAgICBpbnN0YWxsX2Jhc2UgPSBzZWxmLnJpLmxvb2t1cChwYXRoLCAnaW5zdGFsbGRpcicpCiAgICAgICAgICAgIGlmIGluc3RhbGxfYmFzZToKICAgICAgICAgICAgICAgIHNka2RpciA9IG9zLnBhdGguam9pbihpbnN0YWxsX2Jhc2UsICdXaW5TREsnKQogICAgICAgIGlmIG5vdCBzZGtkaXIgb3Igbm90IG9zLnBhdGguaXNkaXIoc2RrZGlyKToKICAgICAgICAgICAgIyBJZiBmYWlsLCB1c2UgZGVmYXVsdCBuZXcgcGF0aAogICAgICAgICAgICBmb3IgdmVyIGluIHNlbGYuV2luZG93c1Nka1ZlcnNpb246CiAgICAgICAgICAgICAgICBpbnR2ZXIgPSB2ZXJbOnZlci5yZmluZCgnLicpXQogICAgICAgICAgICAgICAgcGF0aCA9IHInTWljcm9zb2Z0IFNES3NcV2luZG93cyBLaXRzXCVzJyAlIChpbnR2ZXIpCiAgICAgICAgICAgICAgICBkID0gb3MucGF0aC5qb2luKHNlbGYuUHJvZ3JhbUZpbGVzLCBwYXRoKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkKToKICAgICAgICAgICAgICAgICAgICBzZGtkaXIgPSBkCiAgICAgICAgaWYgbm90IHNka2RpciBvciBub3Qgb3MucGF0aC5pc2RpcihzZGtkaXIpOgogICAgICAgICAgICAjIElmIGZhaWwsIHVzZSBkZWZhdWx0IG9sZCBwYXRoCiAgICAgICAgICAgIGZvciB2ZXIgaW4gc2VsZi5XaW5kb3dzU2RrVmVyc2lvbjoKICAgICAgICAgICAgICAgIHBhdGggPSByJ01pY3Jvc29mdCBTREtzXFdpbmRvd3NcdiVzJyAlIHZlcgogICAgICAgICAgICAgICAgZCA9IG9zLnBhdGguam9pbihzZWxmLlByb2dyYW1GaWxlcywgcGF0aCkKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZCk6CiAgICAgICAgICAgICAgICAgICAgc2RrZGlyID0gZAogICAgICAgIGlmIG5vdCBzZGtkaXI6CiAgICAgICAgICAgICMgSWYgZmFpbCwgdXNlIFBsYXRmb3JtIFNESwogICAgICAgICAgICBzZGtkaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5WQ0luc3RhbGxEaXIsICdQbGF0Zm9ybVNESycpCiAgICAgICAgcmV0dXJuIHNka2RpcgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFdpbmRvd3NTREtFeGVjdXRhYmxlUGF0aChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgZXhlY3V0YWJsZSBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgIyBGaW5kIFdpblNESyBOZXRGeCBUb29scyByZWdpc3RyeSBkaXIgbmFtZQogICAgICAgIGlmIHNlbGYudmNfdmVyIDw9IDExLjA6CiAgICAgICAgICAgIG5ldGZ4dmVyID0gMzUKICAgICAgICAgICAgYXJjaCA9ICcnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmV0Znh2ZXIgPSA0MAogICAgICAgICAgICBoaWRleDg2ID0gVHJ1ZSBpZiBzZWxmLnZjX3ZlciA8PSAxMi4wIGVsc2UgRmFsc2UKICAgICAgICAgICAgYXJjaCA9IHNlbGYucGkuY3VycmVudF9kaXIoeDY0PVRydWUsIGhpZGV4ODY9aGlkZXg4NikKICAgICAgICBmeCA9ICdXaW5TREstTmV0RnglZFRvb2xzJXMnICUgKG5ldGZ4dmVyLCBhcmNoLnJlcGxhY2UoJ1xcJywgJy0nKSkKCiAgICAgICAgIyBsaXN0ZSBhbGwgcG9zc2libGVzIHJlZ2lzdHJ5IHBhdGhzCiAgICAgICAgcmVncGF0aHMgPSBbXQogICAgICAgIGlmIHNlbGYudmNfdmVyID49IDE0LjA6CiAgICAgICAgICAgIGZvciB2ZXIgaW4gc2VsZi5OZXRGeFNka1ZlcnNpb246CiAgICAgICAgICAgICAgICByZWdwYXRocyArPSBbb3MucGF0aC5qb2luKHNlbGYucmkubmV0Znhfc2RrLCB2ZXIsIGZ4KV0KCiAgICAgICAgZm9yIHZlciBpbiBzZWxmLldpbmRvd3NTZGtWZXJzaW9uOgogICAgICAgICAgICByZWdwYXRocyArPSBbb3MucGF0aC5qb2luKHNlbGYucmkud2luZG93c19zZGssICd2JXNBJyAlIHZlciwgZngpXQoKICAgICAgICAjIFJldHVybiBpbnN0YWxsYXRpb24gZm9sZGVyIGZyb20gdGhlIG1vcmUgcmVjZW50IHBhdGgKICAgICAgICBmb3IgcGF0aCBpbiByZWdwYXRoczoKICAgICAgICAgICAgZXhlY3BhdGggPSBzZWxmLnJpLmxvb2t1cChwYXRoLCAnaW5zdGFsbGF0aW9uZm9sZGVyJykKICAgICAgICAgICAgaWYgZXhlY3BhdGg6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiBleGVjcGF0aAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZTaGFycEluc3RhbGxEaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBGIyBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgcGF0aCA9IHInJTAuMWZcU2V0dXBcRiMnICUgc2VsZi52Y192ZXIKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYucmkudmlzdWFsc3R1ZGlvLCBwYXRoKQogICAgICAgIHJldHVybiBzZWxmLnJpLmxvb2t1cChwYXRoLCAncHJvZHVjdGRpcicpIG9yICcnCgogICAgQHByb3BlcnR5CiAgICBkZWYgVW5pdmVyc2FsQ1JUU2RrRGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBVbml2ZXJzYWwgQ1JUIFNESyBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgIyBTZXQgS2l0IFJvb3RzIHZlcnNpb25zIGZvciBzcGVjaWZpZWQgTVNWQysrIHZlcnNpb24KICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxNC4wOgogICAgICAgICAgICB2ZXJzID0gKCcxMCcsICc4MScpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdmVycyA9ICgpCgogICAgICAgICMgRmluZCBwYXRoIG9mIHRoZSBtb3JlIHJlY2VudCBLaXQKICAgICAgICBmb3IgdmVyIGluIHZlcnM6CiAgICAgICAgICAgIHNka2RpciA9IHNlbGYucmkubG9va3VwKHNlbGYucmkud2luZG93c19raXRzX3Jvb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAna2l0c3Jvb3QlcycgJSB2ZXIpCiAgICAgICAgICAgIGlmIHNka2RpcjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIHNka2RpciBvciAnJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFVuaXZlcnNhbENSVFNka0xhc3RWZXJzaW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBVbml2ZXJzYWwgQyBSdW50aW1lIFNESyBsYXN0IHZlcnNpb24KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fdXNlX2xhc3RfZGlyX25hbWUob3MucGF0aC5qb2luKAogICAgICAgICAgICBzZWxmLlVuaXZlcnNhbENSVFNka0RpciwgJ2xpYicpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE5ldEZ4U2RrVmVyc2lvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgU0RLIHZlcnNpb25zLgogICAgICAgICIiIgogICAgICAgICMgU2V0IEZ4U2RrIHZlcnNpb25zIGZvciBzcGVjaWZpZWQgTVNWQysrIHZlcnNpb24KICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxNC4wOgogICAgICAgICAgICByZXR1cm4gKCc0LjYuMScsICc0LjYnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE5ldEZ4U2RrRGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayBTREsgZGlyZWN0b3J5LgogICAgICAgICIiIgogICAgICAgIGZvciB2ZXIgaW4gc2VsZi5OZXRGeFNka1ZlcnNpb246CiAgICAgICAgICAgIGxvYyA9IG9zLnBhdGguam9pbihzZWxmLnJpLm5ldGZ4X3NkaywgdmVyKQogICAgICAgICAgICBzZGtkaXIgPSBzZWxmLnJpLmxvb2t1cChsb2MsICdraXRzaW5zdGFsbGF0aW9uZm9sZGVyJykKICAgICAgICAgICAgaWYgc2RrZGlyOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gc2RrZGlyIG9yICcnCgogICAgQHByb3BlcnR5CiAgICBkZWYgRnJhbWV3b3JrRGlyMzIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIDMyYml0IGRpcmVjdG9yeS4KICAgICAgICAiIiIKICAgICAgICAjIERlZmF1bHQgcGF0aAogICAgICAgIGd1ZXNzX2Z3ID0gb3MucGF0aC5qb2luKHNlbGYuV2luRGlyLCByJ01pY3Jvc29mdC5ORVRcRnJhbWV3b3JrJykKCiAgICAgICAgIyBUcnkgdG8gZ2V0IHBhdGggZnJvbSByZWdpc3RyeSwgaWYgZmFpbCB1c2UgZGVmYXVsdCBwYXRoCiAgICAgICAgcmV0dXJuIHNlbGYucmkubG9va3VwKHNlbGYucmkudmMsICdmcmFtZXdvcmtkaXIzMicpIG9yIGd1ZXNzX2Z3CgogICAgQHByb3BlcnR5CiAgICBkZWYgRnJhbWV3b3JrRGlyNjQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIDY0Yml0IGRpcmVjdG9yeS4KICAgICAgICAiIiIKICAgICAgICAjIERlZmF1bHQgcGF0aAogICAgICAgIGd1ZXNzX2Z3ID0gb3MucGF0aC5qb2luKHNlbGYuV2luRGlyLCByJ01pY3Jvc29mdC5ORVRcRnJhbWV3b3JrNjQnKQoKICAgICAgICAjIFRyeSB0byBnZXQgcGF0aCBmcm9tIHJlZ2lzdHJ5LCBpZiBmYWlsIHVzZSBkZWZhdWx0IHBhdGgKICAgICAgICByZXR1cm4gc2VsZi5yaS5sb29rdXAoc2VsZi5yaS52YywgJ2ZyYW1ld29ya2RpcjY0Jykgb3IgZ3Vlc3NfZncKCiAgICBAcHJvcGVydHkKICAgIGRlZiBGcmFtZXdvcmtWZXJzaW9uMzIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIDMyYml0IHZlcnNpb25zLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9maW5kX2RvdF9uZXRfdmVyc2lvbnMoMzIpCgogICAgQHByb3BlcnR5CiAgICBkZWYgRnJhbWV3b3JrVmVyc2lvbjY0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayA2NGJpdCB2ZXJzaW9ucy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fZmluZF9kb3RfbmV0X3ZlcnNpb25zKDY0KQoKICAgIGRlZiBfZmluZF9kb3RfbmV0X3ZlcnNpb25zKHNlbGYsIGJpdHMpOgogICAgICAgICIiIgogICAgICAgIEZpbmQgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIHZlcnNpb25zLgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIGJpdHM6IGludAogICAgICAgICAgICBQbGF0Zm9ybSBudW1iZXIgb2YgYml0czogMzIgb3IgNjQuCiAgICAgICAgIiIiCiAgICAgICAgIyBGaW5kIGFjdHVhbCAuTkVUIHZlcnNpb24gaW4gcmVnaXN0cnkKICAgICAgICByZWdfdmVyID0gc2VsZi5yaS5sb29rdXAoc2VsZi5yaS52YywgJ2ZyYW1ld29ya3ZlciVkJyAlIGJpdHMpCiAgICAgICAgZG90X25ldF9kaXIgPSBnZXRhdHRyKHNlbGYsICdGcmFtZXdvcmtEaXIlZCcgJSBiaXRzKQogICAgICAgIHZlciA9IHJlZ192ZXIgb3Igc2VsZi5fdXNlX2xhc3RfZGlyX25hbWUoZG90X25ldF9kaXIsICd2Jykgb3IgJycKCiAgICAgICAgIyBTZXQgLk5FVCB2ZXJzaW9ucyBmb3Igc3BlY2lmaWVkIE1TVkMrKyB2ZXJzaW9uCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTIuMDoKICAgICAgICAgICAgZnJhbWV3b3JrdmVyID0gKHZlciwgJ3Y0LjAnKQogICAgICAgIGVsaWYgc2VsZi52Y192ZXIgPj0gMTAuMDoKICAgICAgICAgICAgZnJhbWV3b3JrdmVyID0gKCd2NC4wLjMwMzE5JyBpZiB2ZXIubG93ZXIoKVs6Ml0gIT0gJ3Y0JyBlbHNlIHZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2My41JykKICAgICAgICBlbGlmIHNlbGYudmNfdmVyID09IDkuMDoKICAgICAgICAgICAgZnJhbWV3b3JrdmVyID0gKCd2My41JywgJ3YyLjAuNTA3MjcnKQogICAgICAgIGlmIHNlbGYudmNfdmVyID09IDguMDoKICAgICAgICAgICAgZnJhbWV3b3JrdmVyID0gKCd2My4wJywgJ3YyLjAuNTA3MjcnKQogICAgICAgIHJldHVybiBmcmFtZXdvcmt2ZXIKCiAgICBkZWYgX3VzZV9sYXN0X2Rpcl9uYW1lKHNlbGYsIHBhdGgsIHByZWZpeD0nJyk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIG5hbWUgb2YgdGhlIGxhc3QgZGlyIGluIHBhdGggb3IgJycgaWYgbm8gZGlyIGZvdW5kLgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIHBhdGg6IHN0cgogICAgICAgICAgICBVc2UgZGlycyBpbiB0aGlzIHBhdGgKICAgICAgICBwcmVmaXg6IHN0cgogICAgICAgICAgICBVc2Ugb25seSBkaXJzIHN0YXJ0aW5ncyBieSB0aGlzIHByZWZpeAogICAgICAgICIiIgogICAgICAgIG1hdGNoaW5nX2RpcnMgPSAoCiAgICAgICAgICAgIGRpcl9uYW1lCiAgICAgICAgICAgIGZvciBkaXJfbmFtZSBpbiByZXZlcnNlZChvcy5saXN0ZGlyKHBhdGgpKQogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihwYXRoLCBkaXJfbmFtZSkpIGFuZAogICAgICAgICAgICBkaXJfbmFtZS5zdGFydHN3aXRoKHByZWZpeCkKICAgICAgICApCiAgICAgICAgcmV0dXJuIG5leHQobWF0Y2hpbmdfZGlycywgTm9uZSkgb3IgJycKCgpjbGFzcyBFbnZpcm9ubWVudEluZm86CiAgICAiIiIKICAgIFJldHVybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHNwZWNpZmllZCBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uCiAgICBhbmQgcGxhdGZvcm0gOiBMaWIsIEluY2x1ZGUsIFBhdGggYW5kIGxpYnBhdGguCgogICAgVGhpcyBmdW5jdGlvbiBpcyBjb21wYXRpYmxlIHdpdGggTWljcm9zb2Z0IFZpc3VhbCBDKysgOS4wIHRvIDE0LjAuCgogICAgU2NyaXB0IGNyZWF0ZWQgYnkgYW5hbHlzaW5nIE1pY3Jvc29mdCBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uIGZpbGVzIGxpa2UKICAgICJ2Y3ZhcnNbLi4uXS5iYXQiLCAiU2V0RW52LkNtZCIsICJ2Y2J1aWxkdG9vbHMuYmF0IiwgLi4uCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYXJjaDogc3RyCiAgICAgICAgVGFyZ2V0IGFyY2hpdGVjdHVyZS4KICAgIHZjX3ZlcjogZmxvYXQKICAgICAgICBSZXF1aXJlZCBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uLiBJZiBub3Qgc2V0LCBhdXRvZGV0ZWN0IHRoZSBsYXN0CiAgICAgICAgdmVyc2lvbi4KICAgIHZjX21pbl92ZXI6IGZsb2F0CiAgICAgICAgTWluaW11bSBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uLgogICAgIiIiCgogICAgIyBWYXJpYWJsZXMgYW5kIHByb3BlcnRpZXMgaW4gdGhpcyBjbGFzcyB1c2Ugb3JpZ2luYWxzIENhbWVsQ2FzZSB2YXJpYWJsZXMKICAgICMgbmFtZXMgZnJvbSBNaWNyb3NvZnQgc291cmNlIGZpbGVzIGZvciBtb3JlIGVhc3kgY29tcGFyYWlzb24uCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyY2gsIHZjX3Zlcj1Ob25lLCB2Y19taW5fdmVyPTApOgogICAgICAgIHNlbGYucGkgPSBQbGF0Zm9ybUluZm8oYXJjaCkKICAgICAgICBzZWxmLnJpID0gUmVnaXN0cnlJbmZvKHNlbGYucGkpCiAgICAgICAgc2VsZi5zaSA9IFN5c3RlbUluZm8oc2VsZi5yaSwgdmNfdmVyKQoKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8IHZjX21pbl92ZXI6CiAgICAgICAgICAgIGVyciA9ICdObyBzdWl0YWJsZSBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uIGZvdW5kJwogICAgICAgICAgICByYWlzZSBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IoZXJyKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZjX3ZlcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLnNpLnZjX3ZlcgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZTVG9vbHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gVG9vbHMKICAgICAgICAiIiIKICAgICAgICBwYXRocyA9IFtyJ0NvbW1vbjdcSURFJywgcidDb21tb243XFRvb2xzJ10KCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTQuMDoKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLmN1cnJlbnRfZGlyKGhpZGV4ODY9VHJ1ZSwgeDY0PVRydWUpCiAgICAgICAgICAgIHBhdGhzICs9IFtyJ0NvbW1vbjdcSURFXENvbW1vbkV4dGVuc2lvbnNcTWljcm9zb2Z0XFRlc3RXaW5kb3cnXQogICAgICAgICAgICBwYXRocyArPSBbcidUZWFtIFRvb2xzXFBlcmZvcm1hbmNlIFRvb2xzJ10KICAgICAgICAgICAgcGF0aHMgKz0gW3InVGVhbSBUb29sc1xQZXJmb3JtYW5jZSBUb29scyVzJyAlIGFyY2hfc3ViZGlyXQoKICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihzZWxmLnNpLlZTSW5zdGFsbERpciwgcGF0aCkgZm9yIHBhdGggaW4gcGF0aHNdCgogICAgQHByb3BlcnR5CiAgICBkZWYgVkNJbmNsdWRlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAmIE1pY3Jvc29mdCBGb3VuZGF0aW9uIENsYXNzIEluY2x1ZGVzCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oc2VsZi5zaS5WQ0luc3RhbGxEaXIsICdJbmNsdWRlJyksCiAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5zaS5WQ0luc3RhbGxEaXIsIHInQVRMTUZDXEluY2x1ZGUnKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBWQ0xpYnJhcmllcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAmIE1pY3Jvc29mdCBGb3VuZGF0aW9uIENsYXNzIExpYnJhcmllcwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyID49IDE1LjA6CiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS50YXJnZXRfZGlyKHg2ND1UcnVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS50YXJnZXRfZGlyKGhpZGV4ODY9VHJ1ZSkKICAgICAgICBwYXRocyA9IFsnTGliJXMnICUgYXJjaF9zdWJkaXIsIHInQVRMTUZDXExpYiVzJyAlIGFyY2hfc3ViZGlyXQoKICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxNC4wOgogICAgICAgICAgICBwYXRocyArPSBbcidMaWJcc3RvcmUlcycgJSBhcmNoX3N1YmRpcl0KCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oc2VsZi5zaS5WQ0luc3RhbGxEaXIsIHBhdGgpIGZvciBwYXRoIGluIHBhdGhzXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZDU3RvcmVSZWZzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIHN0b3JlIHJlZmVyZW5jZXMgTGlicmFyaWVzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCAxNC4wOgogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihzZWxmLnNpLlZDSW5zdGFsbERpciwgcidMaWJcc3RvcmVccmVmZXJlbmNlcycpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZDVG9vbHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgVG9vbHMKICAgICAgICAiIiIKICAgICAgICBzaSA9IHNlbGYuc2kKICAgICAgICB0b29scyA9IFtvcy5wYXRoLmpvaW4oc2kuVkNJbnN0YWxsRGlyLCAnVkNQYWNrYWdlcycpXQoKICAgICAgICBmb3JjZXg4NiA9IFRydWUgaWYgc2VsZi52Y192ZXIgPD0gMTAuMCBlbHNlIEZhbHNlCiAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLmNyb3NzX2Rpcihmb3JjZXg4NikKICAgICAgICBpZiBhcmNoX3N1YmRpcjoKICAgICAgICAgICAgdG9vbHMgKz0gW29zLnBhdGguam9pbihzaS5WQ0luc3RhbGxEaXIsICdCaW4lcycgJSBhcmNoX3N1YmRpcildCgogICAgICAgIGlmIHNlbGYudmNfdmVyID09IDE0LjA6CiAgICAgICAgICAgIHBhdGggPSAnQmluJXMnICUgc2VsZi5waS5jdXJyZW50X2RpcihoaWRleDg2PVRydWUpCiAgICAgICAgICAgIHRvb2xzICs9IFtvcy5wYXRoLmpvaW4oc2kuVkNJbnN0YWxsRGlyLCBwYXRoKV0KCiAgICAgICAgZWxpZiBzZWxmLnZjX3ZlciA+PSAxNS4wOgogICAgICAgICAgICBob3N0X2RpciA9IChyJ2JpblxIb3N0WDg2JXMnIGlmIHNlbGYucGkuY3VycmVudF9pc194ODYoKSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHInYmluXEhvc3RYNjQlcycpCiAgICAgICAgICAgIHRvb2xzICs9IFtvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICBzaS5WQ0luc3RhbGxEaXIsIGhvc3RfZGlyICUgc2VsZi5waS50YXJnZXRfZGlyKHg2ND1UcnVlKSldCgogICAgICAgICAgICBpZiBzZWxmLnBpLmN1cnJlbnRfY3B1ICE9IHNlbGYucGkudGFyZ2V0X2NwdToKICAgICAgICAgICAgICAgIHRvb2xzICs9IFtvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgc2kuVkNJbnN0YWxsRGlyLCBob3N0X2RpciAlIHNlbGYucGkuY3VycmVudF9kaXIoeDY0PVRydWUpKV0KCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdG9vbHMgKz0gW29zLnBhdGguam9pbihzaS5WQ0luc3RhbGxEaXIsICdCaW4nKV0KCiAgICAgICAgcmV0dXJuIHRvb2xzCgogICAgQHByb3BlcnR5CiAgICBkZWYgT1NMaWJyYXJpZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIExpYnJhcmllcwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyIDw9IDEwLjA6CiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS50YXJnZXRfZGlyKGhpZGV4ODY9VHJ1ZSwgeDY0PVRydWUpCiAgICAgICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgJ0xpYiVzJyAlIGFyY2hfc3ViZGlyKV0KCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLnRhcmdldF9kaXIoeDY0PVRydWUpCiAgICAgICAgICAgIGxpYiA9IG9zLnBhdGguam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdsaWInKQogICAgICAgICAgICBsaWJ2ZXIgPSBzZWxmLl9zZGtfc3ViZGlyCiAgICAgICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKGxpYiwgJyVzdW0lcycgJSAobGlidmVyICwgYXJjaF9zdWJkaXIpKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBPU0luY2x1ZGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBJbmNsdWRlCiAgICAgICAgIiIiCiAgICAgICAgaW5jbHVkZSA9IG9zLnBhdGguam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdpbmNsdWRlJykKCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPD0gMTAuMDoKICAgICAgICAgICAgcmV0dXJuIFtpbmNsdWRlLCBvcy5wYXRoLmpvaW4oaW5jbHVkZSwgJ2dsJyldCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHNlbGYudmNfdmVyID49IDE0LjA6CiAgICAgICAgICAgICAgICBzZGt2ZXIgPSBzZWxmLl9zZGtfc3ViZGlyCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZGt2ZXIgPSAnJwogICAgICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihpbmNsdWRlLCAnJXNzaGFyZWQnICUgc2RrdmVyKSwKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oaW5jbHVkZSwgJyVzdW0nICUgc2RrdmVyKSwKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oaW5jbHVkZSwgJyVzd2lucnQnICUgc2RrdmVyKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBPU0xpYnBhdGgoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIExpYnJhcmllcyBQYXRocwogICAgICAgICIiIgogICAgICAgIHJlZiA9IG9zLnBhdGguam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdSZWZlcmVuY2VzJykKICAgICAgICBsaWJwYXRoID0gW10KCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPD0gOS4wOgogICAgICAgICAgICBsaWJwYXRoICs9IHNlbGYuT1NMaWJyYXJpZXMKCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTEuMDoKICAgICAgICAgICAgbGlicGF0aCArPSBbb3MucGF0aC5qb2luKHJlZiwgcidDb21tb25Db25maWd1cmF0aW9uXE5ldXRyYWwnKV0KCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTQuMDoKICAgICAgICAgICAgbGlicGF0aCArPSBbCiAgICAgICAgICAgICAgICByZWYsCiAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCAnVW5pb25NZXRhZGF0YScpLAogICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgIHJlZiwKICAgICAgICAgICAgICAgICAgICAnV2luZG93cy5Gb3VuZGF0aW9uLlVuaXZlcnNhbEFwaUNvbnRyYWN0JywKICAgICAgICAgICAgICAgICAgICAnMS4wLjAuMCcsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgIHJlZiwKICAgICAgICAgICAgICAgICAgICAnV2luZG93cy5Gb3VuZGF0aW9uLkZvdW5kYXRpb25Db250cmFjdCcsCiAgICAgICAgICAgICAgICAgICAgJzEuMC4wLjAnLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICByZWYsCiAgICAgICAgICAgICAgICAgICAgJ1dpbmRvd3MuTmV0d29ya2luZy5Db25uZWN0aXZpdHkuV3dhbkNvbnRyYWN0JywKICAgICAgICAgICAgICAgICAgICAnMS4wLjAuMCcsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgIHNlbGYuc2kuV2luZG93c1Nka0RpciwKICAgICAgICAgICAgICAgICAgICAnRXh0ZW5zaW9uU0RLcycsCiAgICAgICAgICAgICAgICAgICAgJ01pY3Jvc29mdC5WQ0xpYnMnLAogICAgICAgICAgICAgICAgICAgICclMC4xZicgJSBzZWxmLnZjX3ZlciwKICAgICAgICAgICAgICAgICAgICAnUmVmZXJlbmNlcycsCiAgICAgICAgICAgICAgICAgICAgJ0NvbW1vbkNvbmZpZ3VyYXRpb24nLAogICAgICAgICAgICAgICAgICAgICduZXV0cmFsJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIF0KICAgICAgICByZXR1cm4gbGlicGF0aAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFNka1Rvb2xzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBUb29scwogICAgICAgICIiIgogICAgICAgIHJldHVybiBsaXN0KHNlbGYuX3Nka190b29scygpKQoKICAgIGRlZiBfc2RrX3Rvb2xzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBUb29scyBwYXRocyBnZW5lcmF0b3IKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8IDE1LjA6CiAgICAgICAgICAgIGJpbl9kaXIgPSAnQmluJyBpZiBzZWxmLnZjX3ZlciA8PSAxMS4wIGVsc2UgcidCaW5ceDg2JwogICAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCBiaW5fZGlyKQoKICAgICAgICBpZiBub3Qgc2VsZi5waS5jdXJyZW50X2lzX3g4NigpOgogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkuY3VycmVudF9kaXIoeDY0PVRydWUpCiAgICAgICAgICAgIHBhdGggPSAnQmluJXMnICUgYXJjaF9zdWJkaXIKICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgcGF0aCkKCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPT0gMTAuMCBvciBzZWxmLnZjX3ZlciA9PSAxMS4wOgogICAgICAgICAgICBpZiBzZWxmLnBpLnRhcmdldF9pc194ODYoKToKICAgICAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gJycKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS5jdXJyZW50X2RpcihoaWRleDg2PVRydWUsIHg2ND1UcnVlKQogICAgICAgICAgICBwYXRoID0gcidCaW5cTkVURlggNC4wIFRvb2xzJXMnICUgYXJjaF9zdWJkaXIKICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgcGF0aCkKCiAgICAgICAgZWxpZiBzZWxmLnZjX3ZlciA+PSAxNS4wOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgJ0JpbicpCiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS5jdXJyZW50X2Rpcih4NjQ9VHJ1ZSkKICAgICAgICAgICAgc2RrdmVyID0gc2VsZi5zaS5XaW5kb3dzU2RrTGFzdFZlcnNpb24KICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHBhdGgsICclcyVzJyAlIChzZGt2ZXIsIGFyY2hfc3ViZGlyKSkKCiAgICAgICAgaWYgc2VsZi5zaS5XaW5kb3dzU0RLRXhlY3V0YWJsZVBhdGg6CiAgICAgICAgICAgIHlpZWxkIHNlbGYuc2kuV2luZG93c1NES0V4ZWN1dGFibGVQYXRoCgogICAgQHByb3BlcnR5CiAgICBkZWYgX3Nka19zdWJkaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIHZlcnNpb24gc3ViZGlyCiAgICAgICAgIiIiCiAgICAgICAgdWNydHZlciA9IHNlbGYuc2kuV2luZG93c1Nka0xhc3RWZXJzaW9uCiAgICAgICAgcmV0dXJuICgnJXNcXCcgJSB1Y3J0dmVyKSBpZiB1Y3J0dmVyIGVsc2UgJycKCiAgICBAcHJvcGVydHkKICAgIGRlZiBTZGtTZXR1cChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgU2V0dXAKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA+IDkuMDoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgJ1NldHVwJyldCgogICAgQHByb3BlcnR5CiAgICBkZWYgRnhUb29scyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgVG9vbHMKICAgICAgICAiIiIKICAgICAgICBwaSA9IHNlbGYucGkKICAgICAgICBzaSA9IHNlbGYuc2kKCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPD0gMTAuMDoKICAgICAgICAgICAgaW5jbHVkZTMyID0gVHJ1ZQogICAgICAgICAgICBpbmNsdWRlNjQgPSBub3QgcGkudGFyZ2V0X2lzX3g4NigpIGFuZCBub3QgcGkuY3VycmVudF9pc194ODYoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGluY2x1ZGUzMiA9IHBpLnRhcmdldF9pc194ODYoKSBvciBwaS5jdXJyZW50X2lzX3g4NigpCiAgICAgICAgICAgIGluY2x1ZGU2NCA9IHBpLmN1cnJlbnRfY3B1ID09ICdhbWQ2NCcgb3IgcGkudGFyZ2V0X2NwdSA9PSAnYW1kNjQnCgogICAgICAgIHRvb2xzID0gW10KICAgICAgICBpZiBpbmNsdWRlMzI6CiAgICAgICAgICAgIHRvb2xzICs9IFtvcy5wYXRoLmpvaW4oc2kuRnJhbWV3b3JrRGlyMzIsIHZlcikKICAgICAgICAgICAgICAgICAgICAgIGZvciB2ZXIgaW4gc2kuRnJhbWV3b3JrVmVyc2lvbjMyXQogICAgICAgIGlmIGluY2x1ZGU2NDoKICAgICAgICAgICAgdG9vbHMgKz0gW29zLnBhdGguam9pbihzaS5GcmFtZXdvcmtEaXI2NCwgdmVyKQogICAgICAgICAgICAgICAgICAgICAgZm9yIHZlciBpbiBzaS5GcmFtZXdvcmtWZXJzaW9uNjRdCiAgICAgICAgcmV0dXJuIHRvb2xzCgogICAgQHByb3BlcnR5CiAgICBkZWYgTmV0RnhTREtMaWJyYXJpZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5OZXQgRnJhbWV3b3JrIFNESyBMaWJyYXJpZXMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8IDE0LjAgb3Igbm90IHNlbGYuc2kuTmV0RnhTZGtEaXI6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkudGFyZ2V0X2Rpcih4NjQ9VHJ1ZSkKICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihzZWxmLnNpLk5ldEZ4U2RrRGlyLCByJ2xpYlx1bSVzJyAlIGFyY2hfc3ViZGlyKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBOZXRGeFNES0luY2x1ZGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTmV0IEZyYW1ld29yayBTREsgSW5jbHVkZXMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8IDE0LjAgb3Igbm90IHNlbGYuc2kuTmV0RnhTZGtEaXI6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihzZWxmLnNpLk5ldEZ4U2RrRGlyLCByJ2luY2x1ZGVcdW0nKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBWc1REYihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBUZWFtIFN5c3RlbSBEYXRhYmFzZQogICAgICAgICIiIgogICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKHNlbGYuc2kuVlNJbnN0YWxsRGlyLCByJ1ZTVFNEQlxEZXBsb3knKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBNU0J1aWxkKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBCdWlsZCBFbmdpbmUKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8IDEyLjA6CiAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgIGVsaWYgc2VsZi52Y192ZXIgPCAxNS4wOgogICAgICAgICAgICBiYXNlX3BhdGggPSBzZWxmLnNpLlByb2dyYW1GaWxlc3g4NgogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkuY3VycmVudF9kaXIoaGlkZXg4Nj1UcnVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJhc2VfcGF0aCA9IHNlbGYuc2kuVlNJbnN0YWxsRGlyCiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gJycKCiAgICAgICAgcGF0aCA9IHInTVNCdWlsZFwlMC4xZlxiaW4lcycgJSAoc2VsZi52Y192ZXIsIGFyY2hfc3ViZGlyKQogICAgICAgIGJ1aWxkID0gW29zLnBhdGguam9pbihiYXNlX3BhdGgsIHBhdGgpXQoKICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxNS4wOgogICAgICAgICAgICAjIEFkZCBSb3NseW4gQyMgJiBWaXN1YWwgQmFzaWMgQ29tcGlsZXIKICAgICAgICAgICAgYnVpbGQgKz0gW29zLnBhdGguam9pbihiYXNlX3BhdGgsIHBhdGgsICdSb3NseW4nKV0KCiAgICAgICAgcmV0dXJuIGJ1aWxkCgogICAgQHByb3BlcnR5CiAgICBkZWYgSFRNTEhlbHBXb3Jrc2hvcChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgSFRNTCBIZWxwIFdvcmtzaG9wCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCAxMS4wOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oc2VsZi5zaS5Qcm9ncmFtRmlsZXN4ODYsICdIVE1MIEhlbHAgV29ya3Nob3AnKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBVQ1JUTGlicmFyaWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBVbml2ZXJzYWwgQyBSdW50aW1lIFNESyBMaWJyYXJpZXMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8IDE0LjA6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkudGFyZ2V0X2Rpcih4NjQ9VHJ1ZSkKICAgICAgICBsaWIgPSBvcy5wYXRoLmpvaW4oc2VsZi5zaS5Vbml2ZXJzYWxDUlRTZGtEaXIsICdsaWInKQogICAgICAgIHVjcnR2ZXIgPSBzZWxmLl91Y3J0X3N1YmRpcgogICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKGxpYiwgJyVzdWNydCVzJyAlICh1Y3J0dmVyLCBhcmNoX3N1YmRpcikpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFVDUlRJbmNsdWRlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVW5pdmVyc2FsIEMgUnVudGltZSBTREsgSW5jbHVkZQogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyIDwgMTQuMDoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIGluY2x1ZGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5zaS5Vbml2ZXJzYWxDUlRTZGtEaXIsICdpbmNsdWRlJykKICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihpbmNsdWRlLCAnJXN1Y3J0JyAlIHNlbGYuX3VjcnRfc3ViZGlyKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBfdWNydF9zdWJkaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFVuaXZlcnNhbCBDIFJ1bnRpbWUgU0RLIHZlcnNpb24gc3ViZGlyCiAgICAgICAgIiIiCiAgICAgICAgdWNydHZlciA9IHNlbGYuc2kuVW5pdmVyc2FsQ1JUU2RrTGFzdFZlcnNpb24KICAgICAgICByZXR1cm4gKCclc1xcJyAlIHVjcnR2ZXIpIGlmIHVjcnR2ZXIgZWxzZSAnJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZTaGFycChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEYjCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCAxMS4wIGFuZCBzZWxmLnZjX3ZlciA+IDEyLjA6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICByZXR1cm4gc2VsZi5zaS5GU2hhcnBJbnN0YWxsRGlyCgogICAgQHByb3BlcnR5CiAgICBkZWYgVkNSdW50aW1lUmVkaXN0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIHJ1bnRpbWUgcmVkaXN0cmlidWFibGUgZGxsCiAgICAgICAgIiIiCiAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLnRhcmdldF9kaXIoeDY0PVRydWUpCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCAxNToKICAgICAgICAgICAgcmVkaXN0X3BhdGggPSBzZWxmLnNpLlZDSW5zdGFsbERpcgogICAgICAgICAgICB2Y3J1bnRpbWUgPSAncmVkaXN0JXNcXE1pY3Jvc29mdC5WQyVkMC5DUlRcXHZjcnVudGltZSVkMC5kbGwnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVkaXN0X3BhdGggPSBzZWxmLnNpLlZDSW5zdGFsbERpci5yZXBsYWNlKCdcXFRvb2xzJywgJ1xcUmVkaXN0JykKICAgICAgICAgICAgdmNydW50aW1lID0gJ29uZWNvcmUlc1xcTWljcm9zb2Z0LlZDJWQwLkNSVFxcdmNydW50aW1lJWQwLmRsbCcKCiAgICAgICAgIyBWaXN1YWwgU3R1ZGlvIDIwMTcgIGlzIHN0aWxsIFZpc3VhbCBDKysgMTQuMAogICAgICAgIGRsbF92ZXIgPSAxNC4wIGlmIHNlbGYudmNfdmVyID09IDE1IGVsc2Ugc2VsZi52Y192ZXIKCiAgICAgICAgdmNydW50aW1lID0gdmNydW50aW1lICUgKGFyY2hfc3ViZGlyLCBzZWxmLnZjX3ZlciwgZGxsX3ZlcikKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHJlZGlzdF9wYXRoLCB2Y3J1bnRpbWUpCgogICAgZGVmIHJldHVybl9lbnYoc2VsZiwgZXhpc3RzPVRydWUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBlbnZpcm9ubWVudCBkaWN0LgoKICAgICAgICBQYXJhbWV0ZXJzCiAgICAgICAgLS0tLS0tLS0tLQogICAgICAgIGV4aXN0czogYm9vbAogICAgICAgICAgICBJdCBUcnVlLCBvbmx5IHJldHVybiBleGlzdGluZyBwYXRocy4KICAgICAgICAiIiIKICAgICAgICBlbnYgPSBkaWN0KAogICAgICAgICAgICBpbmNsdWRlPXNlbGYuX2J1aWxkX3BhdGhzKCdpbmNsdWRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZi5WQ0luY2x1ZGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk9TSW5jbHVkZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVUNSVEluY2x1ZGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk5ldEZ4U0RLSW5jbHVkZXNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyksCiAgICAgICAgICAgIGxpYj1zZWxmLl9idWlsZF9wYXRocygnbGliJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmLlZDTGlicmFyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuT1NMaWJyYXJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5GeFRvb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVUNSVExpYnJhcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk5ldEZ4U0RLTGlicmFyaWVzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyksCiAgICAgICAgICAgIGxpYnBhdGg9c2VsZi5fYnVpbGRfcGF0aHMoJ2xpYnBhdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmLlZDTGlicmFyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkZ4VG9vbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVkNTdG9yZVJlZnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuT1NMaWJwYXRoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMpLAogICAgICAgICAgICBwYXRoPXNlbGYuX2J1aWxkX3BhdGhzKCdwYXRoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZi5WQ1Rvb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlZTVG9vbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVnNURGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuU2RrVG9vbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuU2RrU2V0dXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRnhUb29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5NU0J1aWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkhUTUxIZWxwV29ya3Nob3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRlNoYXJwXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMpLAogICAgICAgICkKICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxNCBhbmQgb3MucGF0aC5pc2ZpbGUoc2VsZi5WQ1J1bnRpbWVSZWRpc3QpOgogICAgICAgICAgICBlbnZbJ3B5X3ZjcnVudGltZV9yZWRpc3QnXSA9IHNlbGYuVkNSdW50aW1lUmVkaXN0CiAgICAgICAgcmV0dXJuIGVudgoKICAgIGRlZiBfYnVpbGRfcGF0aHMoc2VsZiwgbmFtZSwgc3BlY19wYXRoX2xpc3RzLCBleGlzdHMpOgogICAgICAgICIiIgogICAgICAgIEdpdmVuIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUgYW5kIHNwZWNpZmllZCBwYXRocywKICAgICAgICByZXR1cm4gYSBwYXRoc2VwLXNlcGFyYXRlZCBzdHJpbmcgb2YgcGF0aHMgY29udGFpbmluZwogICAgICAgIHVuaXF1ZSwgZXh0YW50LCBkaXJlY3RvcmllcyBmcm9tIHRob3NlIHBhdGhzIGFuZCBmcm9tCiAgICAgICAgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLiBSYWlzZSBhbiBlcnJvciBpZiBubyBwYXRocwogICAgICAgIGFyZSByZXNvbHZlZC4KICAgICAgICAiIiIKICAgICAgICAjIGZsYXR0ZW4gc3BlY19wYXRoX2xpc3RzCiAgICAgICAgc3BlY19wYXRocyA9IGl0ZXJ0b29scy5jaGFpbi5mcm9tX2l0ZXJhYmxlKHNwZWNfcGF0aF9saXN0cykKICAgICAgICBlbnZfcGF0aHMgPSBzYWZlX2Vudi5nZXQobmFtZSwgJycpLnNwbGl0KG9zLnBhdGhzZXApCiAgICAgICAgcGF0aHMgPSBpdGVydG9vbHMuY2hhaW4oc3BlY19wYXRocywgZW52X3BhdGhzKQogICAgICAgIGV4dGFudF9wYXRocyA9IGxpc3QoZmlsdGVyKG9zLnBhdGguaXNkaXIsIHBhdGhzKSkgaWYgZXhpc3RzIGVsc2UgcGF0aHMKICAgICAgICBpZiBub3QgZXh0YW50X3BhdGhzOgogICAgICAgICAgICBtc2cgPSAiJXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgZW1wdHkiICUgbmFtZS51cHBlcigpCiAgICAgICAgICAgIHJhaXNlIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihtc2cpCiAgICAgICAgdW5pcXVlX3BhdGhzID0gc2VsZi5fdW5pcXVlX2V2ZXJzZWVuKGV4dGFudF9wYXRocykKICAgICAgICByZXR1cm4gb3MucGF0aHNlcC5qb2luKHVuaXF1ZV9wYXRocykKCiAgICAjIGZyb20gUHl0aG9uIGRvY3MKICAgIGRlZiBfdW5pcXVlX2V2ZXJzZWVuKHNlbGYsIGl0ZXJhYmxlLCBrZXk9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgTGlzdCB1bmlxdWUgZWxlbWVudHMsIHByZXNlcnZpbmcgb3JkZXIuCiAgICAgICAgUmVtZW1iZXIgYWxsIGVsZW1lbnRzIGV2ZXIgc2Vlbi4KCiAgICAgICAgX3VuaXF1ZV9ldmVyc2VlbignQUFBQUJCQkNDREFBQkJCJykgLS0+IEEgQiBDIEQKCiAgICAgICAgX3VuaXF1ZV9ldmVyc2VlbignQUJCQ2NBRCcsIHN0ci5sb3dlcikgLS0+IEEgQiBDIEQKICAgICAgICAiIiIKICAgICAgICBzZWVuID0gc2V0KCkKICAgICAgICBzZWVuX2FkZCA9IHNlZW4uYWRkCiAgICAgICAgaWYga2V5IGlzIE5vbmU6CiAgICAgICAgICAgIGZvciBlbGVtZW50IGluIGZpbHRlcmZhbHNlKHNlZW4uX19jb250YWluc19fLCBpdGVyYWJsZSk6CiAgICAgICAgICAgICAgICBzZWVuX2FkZChlbGVtZW50KQogICAgICAgICAgICAgICAgeWllbGQgZWxlbWVudAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZvciBlbGVtZW50IGluIGl0ZXJhYmxlOgogICAgICAgICAgICAgICAgayA9IGtleShlbGVtZW50KQogICAgICAgICAgICAgICAgaWYgayBub3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgICAgICBzZWVuX2FkZChrKQogICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQKUEsDBBQAAAAAAAAAIQBjC+PWfwwAAH8MAAAwAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9uYW1lc3BhY2VzLnB5aW1wb3J0IG9zCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKaW1wb3J0IGl0ZXJ0b29scwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IG1hcAoKCmZsYXR0ZW4gPSBpdGVydG9vbHMuY2hhaW4uZnJvbV9pdGVyYWJsZQoKCmNsYXNzIEluc3RhbGxlcjoKCiAgICBuc3BrZ19leHQgPSAnLW5zcGtnLnB0aCcKCiAgICBkZWYgaW5zdGFsbF9uYW1lc3BhY2VzKHNlbGYpOgogICAgICAgIG5zcCA9IHNlbGYuX2dldF9hbGxfbnNfcGFja2FnZXMoKQogICAgICAgIGlmIG5vdCBuc3A6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGZpbGVuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KHNlbGYuX2dldF90YXJnZXQoKSkKICAgICAgICBmaWxlbmFtZSArPSBzZWxmLm5zcGtnX2V4dAogICAgICAgIHNlbGYub3V0cHV0cy5hcHBlbmQoZmlsZW5hbWUpCiAgICAgICAgbG9nLmluZm8oIkluc3RhbGxpbmcgJXMiLCBmaWxlbmFtZSkKICAgICAgICBsaW5lcyA9IG1hcChzZWxmLl9nZW5fbnNwa2dfbGluZSwgbnNwKQoKICAgICAgICBpZiBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICMgYWx3YXlzIGdlbmVyYXRlIHRoZSBsaW5lcywgZXZlbiBpbiBkcnkgcnVuCiAgICAgICAgICAgIGxpc3QobGluZXMpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3dCcpIGFzIGY6CiAgICAgICAgICAgIGYud3JpdGVsaW5lcyhsaW5lcykKCiAgICBkZWYgdW5pbnN0YWxsX25hbWVzcGFjZXMoc2VsZik6CiAgICAgICAgZmlsZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc2VsZi5fZ2V0X3RhcmdldCgpKQogICAgICAgIGZpbGVuYW1lICs9IHNlbGYubnNwa2dfZXh0CiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbG9nLmluZm8oIlJlbW92aW5nICVzIiwgZmlsZW5hbWUpCiAgICAgICAgb3MucmVtb3ZlKGZpbGVuYW1lKQoKICAgIGRlZiBfZ2V0X3RhcmdldChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50YXJnZXQKCiAgICBfbnNwa2dfdG1wbCA9ICgKICAgICAgICAiaW1wb3J0IHN5cywgdHlwZXMsIG9zIiwKICAgICAgICAiaGFzX21mcyA9IHN5cy52ZXJzaW9uX2luZm8gPiAoMywgNSkiLAogICAgICAgICJwID0gb3MucGF0aC5qb2luKCUocm9vdClzLCAqJShwdGgpcikiLAogICAgICAgICJpbXBvcnRsaWIgPSBoYXNfbWZzIGFuZCBfX2ltcG9ydF9fKCdpbXBvcnRsaWIudXRpbCcpIiwKICAgICAgICAiaGFzX21mcyBhbmQgX19pbXBvcnRfXygnaW1wb3J0bGliLm1hY2hpbmVyeScpIiwKICAgICAgICAibSA9IGhhc19tZnMgYW5kICIKICAgICAgICAgICAgInN5cy5tb2R1bGVzLnNldGRlZmF1bHQoJShwa2cpciwgIgogICAgICAgICAgICAgICAgImltcG9ydGxpYi51dGlsLm1vZHVsZV9mcm9tX3NwZWMoIgogICAgICAgICAgICAgICAgICAgICJpbXBvcnRsaWIubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9zcGVjKCUocGtnKXIsICIKICAgICAgICAgICAgICAgICAgICAgICAgIltvcy5wYXRoLmRpcm5hbWUocCldKSkpIiwKICAgICAgICAibSA9IG0gb3IgIgogICAgICAgICAgICAic3lzLm1vZHVsZXMuc2V0ZGVmYXVsdCglKHBrZylyLCB0eXBlcy5Nb2R1bGVUeXBlKCUocGtnKXIpKSIsCiAgICAgICAgIm1wID0gKG0gb3IgW10pIGFuZCBtLl9fZGljdF9fLnNldGRlZmF1bHQoJ19fcGF0aF9fJyxbXSkiLAogICAgICAgICIocCBub3QgaW4gbXApIGFuZCBtcC5hcHBlbmQocCkiLAogICAgKQogICAgImxpbmVzIGZvciB0aGUgbmFtZXNwYWNlIGluc3RhbGxlciIKCiAgICBfbnNwa2dfdG1wbF9tdWx0aSA9ICgKICAgICAgICAnbSBhbmQgc2V0YXR0cihzeXMubW9kdWxlc1slKHBhcmVudClyXSwgJShjaGlsZClyLCBtKScsCiAgICApCiAgICAiYWRkaXRpb25hbCBsaW5lKHMpIHdoZW4gYSBwYXJlbnQgcGFja2FnZSBpcyBpbmRpY2F0ZWQiCgogICAgZGVmIF9nZXRfcm9vdChzZWxmKToKICAgICAgICByZXR1cm4gInN5cy5fZ2V0ZnJhbWUoMSkuZl9sb2NhbHNbJ3NpdGVkaXInXSIKCiAgICBkZWYgX2dlbl9uc3BrZ19saW5lKHNlbGYsIHBrZyk6CiAgICAgICAgIyBlbnN1cmUgcGtnIGlzIG5vdCBhIHVuaWNvZGUgc3RyaW5nIHVuZGVyIFB5dGhvbiAyLjcKICAgICAgICBwa2cgPSBzdHIocGtnKQogICAgICAgIHB0aCA9IHR1cGxlKHBrZy5zcGxpdCgnLicpKQogICAgICAgIHJvb3QgPSBzZWxmLl9nZXRfcm9vdCgpCiAgICAgICAgdG1wbF9saW5lcyA9IHNlbGYuX25zcGtnX3RtcGwKICAgICAgICBwYXJlbnQsIHNlcCwgY2hpbGQgPSBwa2cucnBhcnRpdGlvbignLicpCiAgICAgICAgaWYgcGFyZW50OgogICAgICAgICAgICB0bXBsX2xpbmVzICs9IHNlbGYuX25zcGtnX3RtcGxfbXVsdGkKICAgICAgICByZXR1cm4gJzsnLmpvaW4odG1wbF9saW5lcykgJSBsb2NhbHMoKSArICdcbicKCiAgICBkZWYgX2dldF9hbGxfbnNfcGFja2FnZXMoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHNvcnRlZCBsaXN0IG9mIGFsbCBwYWNrYWdlIG5hbWVzcGFjZXMiIiIKICAgICAgICBwa2dzID0gc2VsZi5kaXN0cmlidXRpb24ubmFtZXNwYWNlX3BhY2thZ2VzIG9yIFtdCiAgICAgICAgcmV0dXJuIHNvcnRlZChmbGF0dGVuKG1hcChzZWxmLl9wa2dfbmFtZXMsIHBrZ3MpKSkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3BrZ19uYW1lcyhwa2cpOgogICAgICAgICIiIgogICAgICAgIEdpdmVuIGEgbmFtZXNwYWNlIHBhY2thZ2UsIHlpZWxkIHRoZSBjb21wb25lbnRzIG9mIHRoYXQKICAgICAgICBwYWNrYWdlLgoKICAgICAgICA+Pj4gbmFtZXMgPSBJbnN0YWxsZXIuX3BrZ19uYW1lcygnYS5iLmMnKQogICAgICAgID4+PiBzZXQobmFtZXMpID09IHNldChbJ2EnLCAnYS5iJywgJ2EuYi5jJ10pCiAgICAgICAgVHJ1ZQogICAgICAgICIiIgogICAgICAgIHBhcnRzID0gcGtnLnNwbGl0KCcuJykKICAgICAgICB3aGlsZSBwYXJ0czoKICAgICAgICAgICAgeWllbGQgJy4nLmpvaW4ocGFydHMpCiAgICAgICAgICAgIHBhcnRzLnBvcCgpCgoKY2xhc3MgRGV2ZWxvcEluc3RhbGxlcihJbnN0YWxsZXIpOgogICAgZGVmIF9nZXRfcm9vdChzZWxmKToKICAgICAgICByZXR1cm4gcmVwcihzdHIoc2VsZi5lZ2dfcGF0aCkpCgogICAgZGVmIF9nZXRfdGFyZ2V0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmVnZ19saW5rClBLAwQUAAAAAAAAACEAibATzjueAAA7ngAAMwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcGFja2FnZV9pbmRleC5weSIiIlB5UEkgYW5kIGRpcmVjdCBwYWNrYWdlIGRvd25sb2FkaW5nIiIiCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgc2h1dGlsCmltcG9ydCBzb2NrZXQKaW1wb3J0IGJhc2U2NAppbXBvcnQgaGFzaGxpYgppbXBvcnQgaXRlcnRvb2xzCmZyb20gZnVuY3Rvb2xzIGltcG9ydCB3cmFwcwoKdHJ5OgogICAgZnJvbSB1cmxsaWIucGFyc2UgaW1wb3J0IHNwbGl0dXNlcgpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIHVybGxpYjIgaW1wb3J0IHNwbGl0dXNlcgoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCB1cmxsaWIsIGh0dHBfY2xpZW50LCBjb25maWdwYXJzZXIsIG1hcAoKaW1wb3J0IHNldHVwdG9vbHMKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCAoCiAgICBDSEVDS09VVF9ESVNULCBEaXN0cmlidXRpb24sIEJJTkFSWV9ESVNULCBub3JtYWxpemVfcGF0aCwgU09VUkNFX0RJU1QsCiAgICBFbnZpcm9ubWVudCwgZmluZF9kaXN0cmlidXRpb25zLCBzYWZlX25hbWUsIHNhZmVfdmVyc2lvbiwKICAgIHRvX2ZpbGVuYW1lLCBSZXF1aXJlbWVudCwgREVWRUxPUF9ESVNULCBFR0dfRElTVCwKKQpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNzbF9zdXBwb3J0CmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvcgpmcm9tIGZubWF0Y2ggaW1wb3J0IHRyYW5zbGF0ZQpmcm9tIHNldHVwdG9vbHMucHkyN2NvbXBhdCBpbXBvcnQgZ2V0X2FsbF9oZWFkZXJzCmZyb20gc2V0dXB0b29scy53aGVlbCBpbXBvcnQgV2hlZWwKCkVHR19GUkFHTUVOVCA9IHJlLmNvbXBpbGUocideZWdnPShbLUEtWmEtejAtOV8uKyFdKykkJykKSFJFRiA9IHJlLmNvbXBpbGUoIiIiaHJlZlxccyo9XFxzKlsnIl0/KFteJyI+IF0rKSIiIiwgcmUuSSkKIyB0aGlzIGlzIGhlcmUgdG8gZml4IGVtYWNzJyBjcnVkZHkgYnJva2VuIHN5bnRheCBoaWdobGlnaHRpbmcKUFlQSV9NRDUgPSByZS5jb21waWxlKAogICAgJzxhIGhyZWY9IihbXiIjXSspIj4oW148XSspPC9hPlxuXFxzK1xcKDxhICg/OnRpdGxlPSJNRDUgaGFzaCJcblxccyspJwogICAgJ2hyZWY9IlteP10rXFw/OmFjdGlvbj1zaG93X21kNSZhbXA7ZGlnZXN0PShbMC05YS1mXXszMn0pIj5tZDU8L2E+XFwpJwopClVSTF9TQ0hFTUUgPSByZS5jb21waWxlKCcoWy0rLmEtejAtOV17Mix9KTonLCByZS5JKS5tYXRjaApFWFRFTlNJT05TID0gIi50YXIuZ3ogLnRhci5iejIgLnRhciAuemlwIC50Z3oiLnNwbGl0KCkKCl9fYWxsX18gPSBbCiAgICAnUGFja2FnZUluZGV4JywgJ2Rpc3Ryb3NfZm9yX3VybCcsICdwYXJzZV9iZGlzdF93aW5pbnN0JywKICAgICdpbnRlcnByZXRfZGlzdHJvX25hbWUnLApdCgpfU09DS0VUX1RJTUVPVVQgPSAxNQoKX3RtcGwgPSAic2V0dXB0b29scy97c2V0dXB0b29scy5fX3ZlcnNpb25fX30gUHl0aG9uLXVybGxpYi97cHlfbWFqb3J9Igp1c2VyX2FnZW50ID0gX3RtcGwuZm9ybWF0KHB5X21ham9yPXN5cy52ZXJzaW9uWzozXSwgc2V0dXB0b29scz1zZXR1cHRvb2xzKQoKCmRlZiBwYXJzZV9yZXF1aXJlbWVudF9hcmcoc3BlYyk6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIFJlcXVpcmVtZW50LnBhcnNlKHNwZWMpCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgIk5vdCBhIFVSTCwgZXhpc3RpbmcgZmlsZSwgb3IgcmVxdWlyZW1lbnQgc3BlYzogJXIiICUgKHNwZWMsKQogICAgICAgICkKCgpkZWYgcGFyc2VfYmRpc3Rfd2luaW5zdChuYW1lKToKICAgICIiIlJldHVybiAoYmFzZSxweXZlcnNpb24pIG9yIChOb25lLE5vbmUpIGZvciBwb3NzaWJsZSAuZXhlIG5hbWUiIiIKCiAgICBsb3dlciA9IG5hbWUubG93ZXIoKQogICAgYmFzZSwgcHlfdmVyLCBwbGF0ID0gTm9uZSwgTm9uZSwgTm9uZQoKICAgIGlmIGxvd2VyLmVuZHN3aXRoKCcuZXhlJyk6CiAgICAgICAgaWYgbG93ZXIuZW5kc3dpdGgoJy53aW4zMi5leGUnKToKICAgICAgICAgICAgYmFzZSA9IG5hbWVbOi0xMF0KICAgICAgICAgICAgcGxhdCA9ICd3aW4zMicKICAgICAgICBlbGlmIGxvd2VyLnN0YXJ0c3dpdGgoJy53aW4zMi1weScsIC0xNik6CiAgICAgICAgICAgIHB5X3ZlciA9IG5hbWVbLTc6LTRdCiAgICAgICAgICAgIGJhc2UgPSBuYW1lWzotMTZdCiAgICAgICAgICAgIHBsYXQgPSAnd2luMzInCiAgICAgICAgZWxpZiBsb3dlci5lbmRzd2l0aCgnLndpbi1hbWQ2NC5leGUnKToKICAgICAgICAgICAgYmFzZSA9IG5hbWVbOi0xNF0KICAgICAgICAgICAgcGxhdCA9ICd3aW4tYW1kNjQnCiAgICAgICAgZWxpZiBsb3dlci5zdGFydHN3aXRoKCcud2luLWFtZDY0LXB5JywgLTIwKToKICAgICAgICAgICAgcHlfdmVyID0gbmFtZVstNzotNF0KICAgICAgICAgICAgYmFzZSA9IG5hbWVbOi0yMF0KICAgICAgICAgICAgcGxhdCA9ICd3aW4tYW1kNjQnCiAgICByZXR1cm4gYmFzZSwgcHlfdmVyLCBwbGF0CgoKZGVmIGVnZ19pbmZvX2Zvcl91cmwodXJsKToKICAgIHBhcnRzID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKHVybCkKICAgIHNjaGVtZSwgc2VydmVyLCBwYXRoLCBwYXJhbWV0ZXJzLCBxdWVyeSwgZnJhZ21lbnQgPSBwYXJ0cwogICAgYmFzZSA9IHVybGxpYi5wYXJzZS51bnF1b3RlKHBhdGguc3BsaXQoJy8nKVstMV0pCiAgICBpZiBzZXJ2ZXIgPT0gJ3NvdXJjZWZvcmdlLm5ldCcgYW5kIGJhc2UgPT0gJ2Rvd25sb2FkJzogICMgWFhYIFl1Y2sKICAgICAgICBiYXNlID0gdXJsbGliLnBhcnNlLnVucXVvdGUocGF0aC5zcGxpdCgnLycpWy0yXSkKICAgIGlmICcjJyBpbiBiYXNlOgogICAgICAgIGJhc2UsIGZyYWdtZW50ID0gYmFzZS5zcGxpdCgnIycsIDEpCiAgICByZXR1cm4gYmFzZSwgZnJhZ21lbnQKCgpkZWYgZGlzdHJvc19mb3JfdXJsKHVybCwgbWV0YWRhdGE9Tm9uZSk6CiAgICAiIiJZaWVsZCBlZ2cgb3Igc291cmNlIGRpc3RyaWJ1dGlvbiBvYmplY3RzIHRoYXQgbWlnaHQgYmUgZm91bmQgYXQgYSBVUkwiIiIKICAgIGJhc2UsIGZyYWdtZW50ID0gZWdnX2luZm9fZm9yX3VybCh1cmwpCiAgICBmb3IgZGlzdCBpbiBkaXN0cm9zX2Zvcl9sb2NhdGlvbih1cmwsIGJhc2UsIG1ldGFkYXRhKToKICAgICAgICB5aWVsZCBkaXN0CiAgICBpZiBmcmFnbWVudDoKICAgICAgICBtYXRjaCA9IEVHR19GUkFHTUVOVC5tYXRjaChmcmFnbWVudCkKICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKAogICAgICAgICAgICAgICAgdXJsLCBtYXRjaC5ncm91cCgxKSwgbWV0YWRhdGEsIHByZWNlZGVuY2U9Q0hFQ0tPVVRfRElTVAogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgeWllbGQgZGlzdAoKCmRlZiBkaXN0cm9zX2Zvcl9sb2NhdGlvbihsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhPU5vbmUpOgogICAgIiIiWWllbGQgZWdnIG9yIHNvdXJjZSBkaXN0cmlidXRpb24gb2JqZWN0cyBiYXNlZCBvbiBiYXNlbmFtZSIiIgogICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy5lZ2cuemlwJyk6CiAgICAgICAgYmFzZW5hbWUgPSBiYXNlbmFtZVs6LTRdICAjIHN0cmlwIHRoZSAuemlwCiAgICBpZiBiYXNlbmFtZS5lbmRzd2l0aCgnLmVnZycpIGFuZCAnLScgaW4gYmFzZW5hbWU6CiAgICAgICAgIyBvbmx5IG9uZSwgdW5hbWJpZ3VvdXMgaW50ZXJwcmV0YXRpb24KICAgICAgICByZXR1cm4gW0Rpc3RyaWJ1dGlvbi5mcm9tX2xvY2F0aW9uKGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGEpXQogICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy53aGwnKSBhbmQgJy0nIGluIGJhc2VuYW1lOgogICAgICAgIHdoZWVsID0gV2hlZWwoYmFzZW5hbWUpCiAgICAgICAgaWYgbm90IHdoZWVsLmlzX2NvbXBhdGlibGUoKToKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgcmV0dXJuIFtEaXN0cmlidXRpb24oCiAgICAgICAgICAgIGxvY2F0aW9uPWxvY2F0aW9uLAogICAgICAgICAgICBwcm9qZWN0X25hbWU9d2hlZWwucHJvamVjdF9uYW1lLAogICAgICAgICAgICB2ZXJzaW9uPXdoZWVsLnZlcnNpb24sCiAgICAgICAgICAgICMgSW5jcmVhc2UgcHJpb3JpdHkgb3ZlciBlZ2dzLgogICAgICAgICAgICBwcmVjZWRlbmNlPUVHR19ESVNUICsgMSwKICAgICAgICApXQogICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy5leGUnKToKICAgICAgICB3aW5fYmFzZSwgcHlfdmVyLCBwbGF0Zm9ybSA9IHBhcnNlX2JkaXN0X3dpbmluc3QoYmFzZW5hbWUpCiAgICAgICAgaWYgd2luX2Jhc2UgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBpbnRlcnByZXRfZGlzdHJvX25hbWUoCiAgICAgICAgICAgICAgICBsb2NhdGlvbiwgd2luX2Jhc2UsIG1ldGFkYXRhLCBweV92ZXIsIEJJTkFSWV9ESVNULCBwbGF0Zm9ybQogICAgICAgICAgICApCiAgICAjIFRyeSBzb3VyY2UgZGlzdHJvIGV4dGVuc2lvbnMgKC56aXAsIC50Z3osIGV0Yy4pCiAgICAjCiAgICBmb3IgZXh0IGluIEVYVEVOU0lPTlM6CiAgICAgICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoZXh0KToKICAgICAgICAgICAgYmFzZW5hbWUgPSBiYXNlbmFtZVs6LWxlbihleHQpXQogICAgICAgICAgICByZXR1cm4gaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGEpCiAgICByZXR1cm4gW10gICMgbm8gZXh0ZW5zaW9uIG1hdGNoZWQKCgpkZWYgZGlzdHJvc19mb3JfZmlsZW5hbWUoZmlsZW5hbWUsIG1ldGFkYXRhPU5vbmUpOgogICAgIiIiWWllbGQgcG9zc2libGUgZWdnIG9yIHNvdXJjZSBkaXN0cmlidXRpb24gb2JqZWN0cyBiYXNlZCBvbiBhIGZpbGVuYW1lIiIiCiAgICByZXR1cm4gZGlzdHJvc19mb3JfbG9jYXRpb24oCiAgICAgICAgbm9ybWFsaXplX3BhdGgoZmlsZW5hbWUpLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSwgbWV0YWRhdGEKICAgICkKCgpkZWYgaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKAogICAgICAgIGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGEsIHB5X3ZlcnNpb249Tm9uZSwgcHJlY2VkZW5jZT1TT1VSQ0VfRElTVCwKICAgICAgICBwbGF0Zm9ybT1Ob25lCik6CiAgICAiIiJHZW5lcmF0ZSBhbHRlcm5hdGl2ZSBpbnRlcnByZXRhdGlvbnMgb2YgYSBzb3VyY2UgZGlzdHJvIG5hbWUKCiAgICBOb3RlOiBpZiBgbG9jYXRpb25gIGlzIGEgZmlsZXN5c3RlbSBmaWxlbmFtZSwgeW91IHNob3VsZCBjYWxsCiAgICBgYHBrZ19yZXNvdXJjZXMubm9ybWFsaXplX3BhdGgoKWBgIG9uIGl0IGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoaXMKICAgIHJvdXRpbmUhCiAgICAiIiIKICAgICMgR2VuZXJhdGUgYWx0ZXJuYXRpdmUgaW50ZXJwcmV0YXRpb25zIG9mIGEgc291cmNlIGRpc3RybyBuYW1lCiAgICAjIEJlY2F1c2Ugc29tZSBwYWNrYWdlcyBhcmUgYW1iaWd1b3VzIGFzIHRvIG5hbWUvdmVyc2lvbnMgc3BsaXQKICAgICMgZS5nLiAiYWRucy1weXRob24tMS4xLjAiLCAiZWdlbml4LW14LWNvbW1lcmNpYWwiLCBldGMuCiAgICAjIFNvLCB3ZSBnZW5lcmF0ZSBlYWNoIHBvc3NpYmxlIGludGVyZXByZXRhdGlvbiAoZS5nLiAiYWRucywgcHl0aG9uLTEuMS4wIgogICAgIyAiYWRucy1weXRob24sIDEuMS4wIiwgYW5kICJhZG5zLXB5dGhvbi0xLjEuMCwgbm8gdmVyc2lvbiIpLiAgSW4gcHJhY3RpY2UsCiAgICAjIHRoZSBzcHVyaW91cyBpbnRlcnByZXRhdGlvbnMgc2hvdWxkIGJlIGlnbm9yZWQsIGJlY2F1c2UgaW4gdGhlIGV2ZW50CiAgICAjIHRoZXJlJ3MgYWxzbyBhbiAiYWRucyIgcGFja2FnZSwgdGhlIHNwdXJpb3VzICJweXRob24tMS4xLjAiIHZlcnNpb24gd2lsbAogICAgIyBjb21wYXJlIGxvd2VyIHRoYW4gYW55IG51bWVyaWMgdmVyc2lvbiBudW1iZXIsIGFuZCBpcyB0aGVyZWZvcmUgdW5saWtlbHkKICAgICMgdG8gbWF0Y2ggYSByZXF1ZXN0IGZvciBpdC4gIEl0J3Mgc3RpbGwgYSBwb3RlbnRpYWwgcHJvYmxlbSwgdGhvdWdoLCBhbmQKICAgICMgaW4gdGhlIGxvbmcgcnVuIFB5UEkgYW5kIHRoZSBkaXN0dXRpbHMgc2hvdWxkIGdvIGZvciAic2FmZSIgbmFtZXMgYW5kCiAgICAjIHZlcnNpb25zIGluIGRpc3RyaWJ1dGlvbiBhcmNoaXZlIG5hbWVzIChzZGlzdCBhbmQgYmRpc3QpLgoKICAgIHBhcnRzID0gYmFzZW5hbWUuc3BsaXQoJy0nKQogICAgaWYgbm90IHB5X3ZlcnNpb24gYW5kIGFueShyZS5tYXRjaChyJ3B5XGRcLlxkJCcsIHApIGZvciBwIGluIHBhcnRzWzI6XSk6CiAgICAgICAgIyBpdCBpcyBhIGJkaXN0X2R1bWIsIG5vdCBhbiBzZGlzdCAtLSBiYWlsIG91dAogICAgICAgIHJldHVybgoKICAgIGZvciBwIGluIHJhbmdlKDEsIGxlbihwYXJ0cykgKyAxKToKICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24oCiAgICAgICAgICAgIGxvY2F0aW9uLCBtZXRhZGF0YSwgJy0nLmpvaW4ocGFydHNbOnBdKSwgJy0nLmpvaW4ocGFydHNbcDpdKSwKICAgICAgICAgICAgcHlfdmVyc2lvbj1weV92ZXJzaW9uLCBwcmVjZWRlbmNlPXByZWNlZGVuY2UsCiAgICAgICAgICAgIHBsYXRmb3JtPXBsYXRmb3JtCiAgICAgICAgKQoKCiMgRnJvbSBQeXRob24gMi43IGRvY3MKZGVmIHVuaXF1ZV9ldmVyc2VlbihpdGVyYWJsZSwga2V5PU5vbmUpOgogICAgIkxpc3QgdW5pcXVlIGVsZW1lbnRzLCBwcmVzZXJ2aW5nIG9yZGVyLiBSZW1lbWJlciBhbGwgZWxlbWVudHMgZXZlciBzZWVuLiIKICAgICMgdW5pcXVlX2V2ZXJzZWVuKCdBQUFBQkJCQ0NEQUFCQkInKSAtLT4gQSBCIEMgRAogICAgIyB1bmlxdWVfZXZlcnNlZW4oJ0FCQkNjQUQnLCBzdHIubG93ZXIpIC0tPiBBIEIgQyBECiAgICBzZWVuID0gc2V0KCkKICAgIHNlZW5fYWRkID0gc2Vlbi5hZGQKICAgIGlmIGtleSBpcyBOb25lOgogICAgICAgIGZvciBlbGVtZW50IGluIHNpeC5tb3Zlcy5maWx0ZXJmYWxzZShzZWVuLl9fY29udGFpbnNfXywgaXRlcmFibGUpOgogICAgICAgICAgICBzZWVuX2FkZChlbGVtZW50KQogICAgICAgICAgICB5aWVsZCBlbGVtZW50CiAgICBlbHNlOgogICAgICAgIGZvciBlbGVtZW50IGluIGl0ZXJhYmxlOgogICAgICAgICAgICBrID0ga2V5KGVsZW1lbnQpCiAgICAgICAgICAgIGlmIGsgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICBzZWVuX2FkZChrKQogICAgICAgICAgICAgICAgeWllbGQgZWxlbWVudAoKCmRlZiB1bmlxdWVfdmFsdWVzKGZ1bmMpOgogICAgIiIiCiAgICBXcmFwIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGFuIGl0ZXJhYmxlIHN1Y2ggdGhhdCB0aGUgcmVzdWx0aW5nIGl0ZXJhYmxlCiAgICBvbmx5IGV2ZXIgeWllbGRzIHVuaXF1ZSBpdGVtcy4KICAgICIiIgoKICAgIEB3cmFwcyhmdW5jKQogICAgZGVmIHdyYXBwZXIoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICByZXR1cm4gdW5pcXVlX2V2ZXJzZWVuKGZ1bmMoKmFyZ3MsICoqa3dhcmdzKSkKCiAgICByZXR1cm4gd3JhcHBlcgoKClJFTCA9IHJlLmNvbXBpbGUociIiIjwoW14+XSpcc3JlbFxzKj1ccypbJyJdPyhbXiciPl0rKVtePl0qKT4iIiIsIHJlLkkpCiMgdGhpcyBsaW5lIGlzIGhlcmUgdG8gZml4IGVtYWNzJyBjcnVkZHkgYnJva2VuIHN5bnRheCBoaWdobGlnaHRpbmcKCgpAdW5pcXVlX3ZhbHVlcwpkZWYgZmluZF9leHRlcm5hbF9saW5rcyh1cmwsIHBhZ2UpOgogICAgIiIiRmluZCByZWw9ImhvbWVwYWdlIiBhbmQgcmVsPSJkb3dubG9hZCIgbGlua3MgaW4gYHBhZ2VgLCB5aWVsZGluZyBVUkxzIiIiCgogICAgZm9yIG1hdGNoIGluIFJFTC5maW5kaXRlcihwYWdlKToKICAgICAgICB0YWcsIHJlbCA9IG1hdGNoLmdyb3VwcygpCiAgICAgICAgcmVscyA9IHNldChtYXAoc3RyLnN0cmlwLCByZWwubG93ZXIoKS5zcGxpdCgnLCcpKSkKICAgICAgICBpZiAnaG9tZXBhZ2UnIGluIHJlbHMgb3IgJ2Rvd25sb2FkJyBpbiByZWxzOgogICAgICAgICAgICBmb3IgbWF0Y2ggaW4gSFJFRi5maW5kaXRlcih0YWcpOgogICAgICAgICAgICAgICAgeWllbGQgdXJsbGliLnBhcnNlLnVybGpvaW4odXJsLCBodG1sZGVjb2RlKG1hdGNoLmdyb3VwKDEpKSkKCiAgICBmb3IgdGFnIGluICgiPHRoPkhvbWUgUGFnZSIsICI8dGg+RG93bmxvYWQgVVJMIik6CiAgICAgICAgcG9zID0gcGFnZS5maW5kKHRhZykKICAgICAgICBpZiBwb3MgIT0gLTE6CiAgICAgICAgICAgIG1hdGNoID0gSFJFRi5zZWFyY2gocGFnZSwgcG9zKQogICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgIHlpZWxkIHVybGxpYi5wYXJzZS51cmxqb2luKHVybCwgaHRtbGRlY29kZShtYXRjaC5ncm91cCgxKSkpCgoKY2xhc3MgQ29udGVudENoZWNrZXIob2JqZWN0KToKICAgICIiIgogICAgQSBudWxsIGNvbnRlbnQgY2hlY2tlciB0aGF0IGRlZmluZXMgdGhlIGludGVyZmFjZSBmb3IgY2hlY2tpbmcgY29udGVudAogICAgIiIiCgogICAgZGVmIGZlZWQoc2VsZiwgYmxvY2spOgogICAgICAgICIiIgogICAgICAgIEZlZWQgYSBibG9jayBvZiBkYXRhIHRvIHRoZSBoYXNoLgogICAgICAgICIiIgogICAgICAgIHJldHVybgoKICAgIGRlZiBpc192YWxpZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayB0aGUgaGFzaC4gUmV0dXJuIEZhbHNlIGlmIHZhbGlkYXRpb24gZmFpbHMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmVwb3J0KHNlbGYsIHJlcG9ydGVyLCB0ZW1wbGF0ZSk6CiAgICAgICAgIiIiCiAgICAgICAgQ2FsbCByZXBvcnRlciB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGVja2VyIChoYXNoIG5hbWUpCiAgICAgICAgc3Vic3RpdHV0ZWQgaW50byB0aGUgdGVtcGxhdGUuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuCgoKY2xhc3MgSGFzaENoZWNrZXIoQ29udGVudENoZWNrZXIpOgogICAgcGF0dGVybiA9IHJlLmNvbXBpbGUoCiAgICAgICAgcicoP1A8aGFzaF9uYW1lPnNoYTF8c2hhMjI0fHNoYTM4NHxzaGEyNTZ8c2hhNTEyfG1kNSk9JwogICAgICAgIHInKD9QPGV4cGVjdGVkPlthLWYwLTldKyknCiAgICApCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhhc2hfbmFtZSwgZXhwZWN0ZWQpOgogICAgICAgIHNlbGYuaGFzaF9uYW1lID0gaGFzaF9uYW1lCiAgICAgICAgc2VsZi5oYXNoID0gaGFzaGxpYi5uZXcoaGFzaF9uYW1lKQogICAgICAgIHNlbGYuZXhwZWN0ZWQgPSBleHBlY3RlZAoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fdXJsKGNscywgdXJsKToKICAgICAgICAiQ29uc3RydWN0IGEgKHBvc3NpYmx5IG51bGwpIENvbnRlbnRDaGVja2VyIGZyb20gYSBVUkwiCiAgICAgICAgZnJhZ21lbnQgPSB1cmxsaWIucGFyc2UudXJscGFyc2UodXJsKVstMV0KICAgICAgICBpZiBub3QgZnJhZ21lbnQ6CiAgICAgICAgICAgIHJldHVybiBDb250ZW50Q2hlY2tlcigpCiAgICAgICAgbWF0Y2ggPSBjbHMucGF0dGVybi5zZWFyY2goZnJhZ21lbnQpCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByZXR1cm4gQ29udGVudENoZWNrZXIoKQogICAgICAgIHJldHVybiBjbHMoKiptYXRjaC5ncm91cGRpY3QoKSkKCiAgICBkZWYgZmVlZChzZWxmLCBibG9jayk6CiAgICAgICAgc2VsZi5oYXNoLnVwZGF0ZShibG9jaykKCiAgICBkZWYgaXNfdmFsaWQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaC5oZXhkaWdlc3QoKSA9PSBzZWxmLmV4cGVjdGVkCgogICAgZGVmIHJlcG9ydChzZWxmLCByZXBvcnRlciwgdGVtcGxhdGUpOgogICAgICAgIG1zZyA9IHRlbXBsYXRlICUgc2VsZi5oYXNoX25hbWUKICAgICAgICByZXR1cm4gcmVwb3J0ZXIobXNnKQoKCmNsYXNzIFBhY2thZ2VJbmRleChFbnZpcm9ubWVudCk6CiAgICAiIiJBIGRpc3RyaWJ1dGlvbiBpbmRleCB0aGF0IHNjYW5zIHdlYiBwYWdlcyBmb3IgZG93bmxvYWQgVVJMcyIiIgoKICAgIGRlZiBfX2luaXRfXygKICAgICAgICAgICAgc2VsZiwgaW5kZXhfdXJsPSJodHRwczovL3B5cGkucHl0aG9uLm9yZy9zaW1wbGUiLCBob3N0cz0oJyonLCksCiAgICAgICAgICAgIGNhX2J1bmRsZT1Ob25lLCB2ZXJpZnlfc3NsPVRydWUsICphcmdzLCAqKmt3CiAgICApOgogICAgICAgIEVudmlyb25tZW50Ll9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KQogICAgICAgIHNlbGYuaW5kZXhfdXJsID0gaW5kZXhfdXJsICsgIi8iIFs6bm90IGluZGV4X3VybC5lbmRzd2l0aCgnLycpXQogICAgICAgIHNlbGYuc2Nhbm5lZF91cmxzID0ge30KICAgICAgICBzZWxmLmZldGNoZWRfdXJscyA9IHt9CiAgICAgICAgc2VsZi5wYWNrYWdlX3BhZ2VzID0ge30KICAgICAgICBzZWxmLmFsbG93cyA9IHJlLmNvbXBpbGUoJ3wnLmpvaW4obWFwKHRyYW5zbGF0ZSwgaG9zdHMpKSkubWF0Y2gKICAgICAgICBzZWxmLnRvX3NjYW4gPSBbXQogICAgICAgIHVzZV9zc2wgPSAoCiAgICAgICAgICAgIHZlcmlmeV9zc2wKICAgICAgICAgICAgYW5kIHNzbF9zdXBwb3J0LmlzX2F2YWlsYWJsZQogICAgICAgICAgICBhbmQgKGNhX2J1bmRsZSBvciBzc2xfc3VwcG9ydC5maW5kX2NhX2J1bmRsZSgpKQogICAgICAgICkKICAgICAgICBpZiB1c2Vfc3NsOgogICAgICAgICAgICBzZWxmLm9wZW5lciA9IHNzbF9zdXBwb3J0Lm9wZW5lcl9mb3IoY2FfYnVuZGxlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYub3BlbmVyID0gdXJsbGliLnJlcXVlc3QudXJsb3BlbgoKICAgIGRlZiBwcm9jZXNzX3VybChzZWxmLCB1cmwsIHJldHJpZXZlPUZhbHNlKToKICAgICAgICAiIiJFdmFsdWF0ZSBhIFVSTCBhcyBhIHBvc3NpYmxlIGRvd25sb2FkLCBhbmQgbWF5YmUgcmV0cmlldmUgaXQiIiIKICAgICAgICBpZiB1cmwgaW4gc2VsZi5zY2FubmVkX3VybHMgYW5kIG5vdCByZXRyaWV2ZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5zY2FubmVkX3VybHNbdXJsXSA9IFRydWUKICAgICAgICBpZiBub3QgVVJMX1NDSEVNRSh1cmwpOgogICAgICAgICAgICBzZWxmLnByb2Nlc3NfZmlsZW5hbWUodXJsKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBlbHNlOgogICAgICAgICAgICBkaXN0cyA9IGxpc3QoZGlzdHJvc19mb3JfdXJsKHVybCkpCiAgICAgICAgICAgIGlmIGRpc3RzOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYudXJsX29rKHVybCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnKCJGb3VuZCBsaW5rOiAlcyIsIHVybCkKCiAgICAgICAgaWYgZGlzdHMgb3Igbm90IHJldHJpZXZlIG9yIHVybCBpbiBzZWxmLmZldGNoZWRfdXJsczoKICAgICAgICAgICAgbGlzdChtYXAoc2VsZi5hZGQsIGRpc3RzKSkKICAgICAgICAgICAgcmV0dXJuICAjIGRvbid0IG5lZWQgdGhlIGFjdHVhbCBwYWdlCgogICAgICAgIGlmIG5vdCBzZWxmLnVybF9vayh1cmwpOgogICAgICAgICAgICBzZWxmLmZldGNoZWRfdXJsc1t1cmxdID0gVHJ1ZQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5pbmZvKCJSZWFkaW5nICVzIiwgdXJsKQogICAgICAgIHNlbGYuZmV0Y2hlZF91cmxzW3VybF0gPSBUcnVlICAjIHByZXZlbnQgbXVsdGlwbGUgZmV0Y2ggYXR0ZW1wdHMKICAgICAgICB0bXBsID0gIkRvd25sb2FkIGVycm9yIG9uICVzOiAlJXMgLS0gU29tZSBwYWNrYWdlcyBtYXkgbm90IGJlIGZvdW5kISIKICAgICAgICBmID0gc2VsZi5vcGVuX3VybCh1cmwsIHRtcGwgJSB1cmwpCiAgICAgICAgaWYgZiBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmZldGNoZWRfdXJsc1tmLnVybF0gPSBUcnVlCiAgICAgICAgaWYgJ2h0bWwnIG5vdCBpbiBmLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnLCAnJykubG93ZXIoKToKICAgICAgICAgICAgZi5jbG9zZSgpICAjIG5vdCBodG1sLCB3ZSBjYW4ndCBwcm9jZXNzIGl0CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBiYXNlID0gZi51cmwgICMgaGFuZGxlIHJlZGlyZWN0cwogICAgICAgIHBhZ2UgPSBmLnJlYWQoKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBhZ2UsIHN0cik6CiAgICAgICAgICAgICMgSW4gUHl0aG9uIDMgYW5kIGdvdCBieXRlcyBidXQgd2FudCBzdHIuCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZiwgdXJsbGliLmVycm9yLkhUVFBFcnJvcik6CiAgICAgICAgICAgICAgICAjIEVycm9ycyBoYXZlIG5vIGNoYXJzZXQsIGFzc3VtZSBsYXRpbjE6CiAgICAgICAgICAgICAgICBjaGFyc2V0ID0gJ2xhdGluLTEnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBjaGFyc2V0ID0gZi5oZWFkZXJzLmdldF9wYXJhbSgnY2hhcnNldCcpIG9yICdsYXRpbi0xJwogICAgICAgICAgICBwYWdlID0gcGFnZS5kZWNvZGUoY2hhcnNldCwgImlnbm9yZSIpCiAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgZm9yIG1hdGNoIGluIEhSRUYuZmluZGl0ZXIocGFnZSk6CiAgICAgICAgICAgIGxpbmsgPSB1cmxsaWIucGFyc2UudXJsam9pbihiYXNlLCBodG1sZGVjb2RlKG1hdGNoLmdyb3VwKDEpKSkKICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3VybChsaW5rKQogICAgICAgIGlmIHVybC5zdGFydHN3aXRoKHNlbGYuaW5kZXhfdXJsKSBhbmQgZ2V0YXR0cihmLCAnY29kZScsIE5vbmUpICE9IDQwNDoKICAgICAgICAgICAgcGFnZSA9IHNlbGYucHJvY2Vzc19pbmRleCh1cmwsIHBhZ2UpCgogICAgZGVmIHByb2Nlc3NfZmlsZW5hbWUoc2VsZiwgZm4sIG5lc3RlZD1GYWxzZSk6CiAgICAgICAgIyBwcm9jZXNzIGZpbGVuYW1lcyBvciBkaXJlY3RvcmllcwogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmbik6CiAgICAgICAgICAgIHNlbGYud2FybigiTm90IGZvdW5kOiAlcyIsIGZuKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmbikgYW5kIG5vdCBuZXN0ZWQ6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKGZuKQogICAgICAgICAgICBmb3IgaXRlbSBpbiBvcy5saXN0ZGlyKHBhdGgpOgogICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2ZpbGVuYW1lKG9zLnBhdGguam9pbihwYXRoLCBpdGVtKSwgVHJ1ZSkKCiAgICAgICAgZGlzdHMgPSBkaXN0cm9zX2Zvcl9maWxlbmFtZShmbikKICAgICAgICBpZiBkaXN0czoKICAgICAgICAgICAgc2VsZi5kZWJ1ZygiRm91bmQ6ICVzIiwgZm4pCiAgICAgICAgICAgIGxpc3QobWFwKHNlbGYuYWRkLCBkaXN0cykpCgogICAgZGVmIHVybF9vayhzZWxmLCB1cmwsIGZhdGFsPUZhbHNlKToKICAgICAgICBzID0gVVJMX1NDSEVNRSh1cmwpCiAgICAgICAgaXNfZmlsZSA9IHMgYW5kIHMuZ3JvdXAoMSkubG93ZXIoKSA9PSAnZmlsZScKICAgICAgICBpZiBpc19maWxlIG9yIHNlbGYuYWxsb3dzKHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpWzFdKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBtc2cgPSAoCiAgICAgICAgICAgICJcbk5vdGU6IEJ5cGFzc2luZyAlcyAoZGlzYWxsb3dlZCBob3N0OyBzZWUgIgogICAgICAgICAgICAiaHR0cDovL2JpdC5seS8yaHJJbW5ZIGZvciBkZXRhaWxzKS5cbiIpCiAgICAgICAgaWYgZmF0YWw6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKG1zZyAlIHVybCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLndhcm4obXNnLCB1cmwpCgogICAgZGVmIHNjYW5fZWdnX2xpbmtzKHNlbGYsIHNlYXJjaF9wYXRoKToKICAgICAgICBkaXJzID0gZmlsdGVyKG9zLnBhdGguaXNkaXIsIHNlYXJjaF9wYXRoKQogICAgICAgIGVnZ19saW5rcyA9ICgKICAgICAgICAgICAgKHBhdGgsIGVudHJ5KQogICAgICAgICAgICBmb3IgcGF0aCBpbiBkaXJzCiAgICAgICAgICAgIGZvciBlbnRyeSBpbiBvcy5saXN0ZGlyKHBhdGgpCiAgICAgICAgICAgIGlmIGVudHJ5LmVuZHN3aXRoKCcuZWdnLWxpbmsnKQogICAgICAgICkKICAgICAgICBsaXN0KGl0ZXJ0b29scy5zdGFybWFwKHNlbGYuc2Nhbl9lZ2dfbGluaywgZWdnX2xpbmtzKSkKCiAgICBkZWYgc2Nhbl9lZ2dfbGluayhzZWxmLCBwYXRoLCBlbnRyeSk6CiAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihwYXRoLCBlbnRyeSkpIGFzIHJhd19saW5lczoKICAgICAgICAgICAgIyBmaWx0ZXIgbm9uLWVtcHR5IGxpbmVzCiAgICAgICAgICAgIGxpbmVzID0gbGlzdChmaWx0ZXIoTm9uZSwgbWFwKHN0ci5zdHJpcCwgcmF3X2xpbmVzKSkpCgogICAgICAgIGlmIGxlbihsaW5lcykgIT0gMjoKICAgICAgICAgICAgIyBmb3JtYXQgaXMgbm90IHJlY29nbml6ZWQ7IHB1bnQKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGVnZ19wYXRoLCBzZXR1cF9wYXRoID0gbGluZXMKCiAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0cmlidXRpb25zKG9zLnBhdGguam9pbihwYXRoLCBlZ2dfcGF0aCkpOgogICAgICAgICAgICBkaXN0LmxvY2F0aW9uID0gb3MucGF0aC5qb2luKHBhdGgsICpsaW5lcykKICAgICAgICAgICAgZGlzdC5wcmVjZWRlbmNlID0gU09VUkNFX0RJU1QKICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKCiAgICBkZWYgcHJvY2Vzc19pbmRleChzZWxmLCB1cmwsIHBhZ2UpOgogICAgICAgICIiIlByb2Nlc3MgdGhlIGNvbnRlbnRzIG9mIGEgUHlQSSBwYWdlIiIiCgogICAgICAgIGRlZiBzY2FuKGxpbmspOgogICAgICAgICAgICAjIFByb2Nlc3MgYSBVUkwgdG8gc2VlIGlmIGl0J3MgZm9yIGEgcGFja2FnZSBwYWdlCiAgICAgICAgICAgIGlmIGxpbmsuc3RhcnRzd2l0aChzZWxmLmluZGV4X3VybCk6CiAgICAgICAgICAgICAgICBwYXJ0cyA9IGxpc3QobWFwKAogICAgICAgICAgICAgICAgICAgIHVybGxpYi5wYXJzZS51bnF1b3RlLCBsaW5rW2xlbihzZWxmLmluZGV4X3VybCk6XS5zcGxpdCgnLycpCiAgICAgICAgICAgICAgICApKQogICAgICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSA9PSAyIGFuZCAnIycgbm90IGluIHBhcnRzWzFdOgogICAgICAgICAgICAgICAgICAgICMgaXQncyBhIHBhY2thZ2UgcGFnZSwgc2FuaXRpemUgYW5kIGluZGV4IGl0CiAgICAgICAgICAgICAgICAgICAgcGtnID0gc2FmZV9uYW1lKHBhcnRzWzBdKQogICAgICAgICAgICAgICAgICAgIHZlciA9IHNhZmVfdmVyc2lvbihwYXJ0c1sxXSkKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2VfcGFnZXMuc2V0ZGVmYXVsdChwa2cubG93ZXIoKSwge30pW2xpbmtdID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0b19maWxlbmFtZShwa2cpLCB0b19maWxlbmFtZSh2ZXIpCiAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCgogICAgICAgICMgcHJvY2VzcyBhbiBpbmRleCBwYWdlIGludG8gdGhlIHBhY2thZ2UtcGFnZSBpbmRleAogICAgICAgIGZvciBtYXRjaCBpbiBIUkVGLmZpbmRpdGVyKHBhZ2UpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzY2FuKHVybGxpYi5wYXJzZS51cmxqb2luKHVybCwgaHRtbGRlY29kZShtYXRjaC5ncm91cCgxKSkpKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgcGtnLCB2ZXIgPSBzY2FuKHVybCkgICMgZW5zdXJlIHRoaXMgcGFnZSBpcyBpbiB0aGUgcGFnZSBpbmRleAogICAgICAgIGlmIHBrZzoKICAgICAgICAgICAgIyBwcm9jZXNzIGluZGl2aWR1YWwgcGFja2FnZSBwYWdlCiAgICAgICAgICAgIGZvciBuZXdfdXJsIGluIGZpbmRfZXh0ZXJuYWxfbGlua3ModXJsLCBwYWdlKToKICAgICAgICAgICAgICAgICMgUHJvY2VzcyB0aGUgZm91bmQgVVJMCiAgICAgICAgICAgICAgICBiYXNlLCBmcmFnID0gZWdnX2luZm9fZm9yX3VybChuZXdfdXJsKQogICAgICAgICAgICAgICAgaWYgYmFzZS5lbmRzd2l0aCgnLnB5JykgYW5kIG5vdCBmcmFnOgogICAgICAgICAgICAgICAgICAgIGlmIHZlcjoKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3VybCArPSAnI2VnZz0lcy0lcycgJSAocGtnLCB2ZXIpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uZWVkX3ZlcnNpb25faW5mbyh1cmwpCiAgICAgICAgICAgICAgICBzZWxmLnNjYW5fdXJsKG5ld191cmwpCgogICAgICAgICAgICByZXR1cm4gUFlQSV9NRDUuc3ViKAogICAgICAgICAgICAgICAgbGFtYmRhIG06ICc8YSBocmVmPSIlcyNtZDU9JXMiPiVzPC9hPicgJSBtLmdyb3VwKDEsIDMsIDIpLCBwYWdlCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gIiIgICMgbm8gc2Vuc2UgZG91YmxlLXNjYW5uaW5nIG5vbi1wYWNrYWdlIHBhZ2VzCgogICAgZGVmIG5lZWRfdmVyc2lvbl9pbmZvKHNlbGYsIHVybCk6CiAgICAgICAgc2VsZi5zY2FuX2FsbCgKICAgICAgICAgICAgIlBhZ2UgYXQgJXMgbGlua3MgdG8gLnB5IGZpbGUocykgd2l0aG91dCB2ZXJzaW9uIGluZm87IGFuIGluZGV4ICIKICAgICAgICAgICAgInNjYW4gaXMgcmVxdWlyZWQuIiwgdXJsCiAgICAgICAgKQoKICAgIGRlZiBzY2FuX2FsbChzZWxmLCBtc2c9Tm9uZSwgKmFyZ3MpOgogICAgICAgIGlmIHNlbGYuaW5kZXhfdXJsIG5vdCBpbiBzZWxmLmZldGNoZWRfdXJsczoKICAgICAgICAgICAgaWYgbXNnOgogICAgICAgICAgICAgICAgc2VsZi53YXJuKG1zZywgKmFyZ3MpCiAgICAgICAgICAgIHNlbGYuaW5mbygKICAgICAgICAgICAgICAgICJTY2FubmluZyBpbmRleCBvZiBhbGwgcGFja2FnZXMgKHRoaXMgbWF5IHRha2UgYSB3aGlsZSkiCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLnNjYW5fdXJsKHNlbGYuaW5kZXhfdXJsKQoKICAgIGRlZiBmaW5kX3BhY2thZ2VzKHNlbGYsIHJlcXVpcmVtZW50KToKICAgICAgICBzZWxmLnNjYW5fdXJsKHNlbGYuaW5kZXhfdXJsICsgcmVxdWlyZW1lbnQudW5zYWZlX25hbWUgKyAnLycpCgogICAgICAgIGlmIG5vdCBzZWxmLnBhY2thZ2VfcGFnZXMuZ2V0KHJlcXVpcmVtZW50LmtleSk6CiAgICAgICAgICAgICMgRmFsbCBiYWNrIHRvIHNhZmUgdmVyc2lvbiBvZiB0aGUgbmFtZQogICAgICAgICAgICBzZWxmLnNjYW5fdXJsKHNlbGYuaW5kZXhfdXJsICsgcmVxdWlyZW1lbnQucHJvamVjdF9uYW1lICsgJy8nKQoKICAgICAgICBpZiBub3Qgc2VsZi5wYWNrYWdlX3BhZ2VzLmdldChyZXF1aXJlbWVudC5rZXkpOgogICAgICAgICAgICAjIFdlIGNvdWxkbid0IGZpbmQgdGhlIHRhcmdldCBwYWNrYWdlLCBzbyBzZWFyY2ggdGhlIGluZGV4IHBhZ2UgdG9vCiAgICAgICAgICAgIHNlbGYubm90X2ZvdW5kX2luX2luZGV4KHJlcXVpcmVtZW50KQoKICAgICAgICBmb3IgdXJsIGluIGxpc3Qoc2VsZi5wYWNrYWdlX3BhZ2VzLmdldChyZXF1aXJlbWVudC5rZXksICgpKSk6CiAgICAgICAgICAgICMgc2NhbiBlYWNoIHBhZ2UgdGhhdCBtaWdodCBiZSByZWxhdGVkIHRvIHRoZSBkZXNpcmVkIHBhY2thZ2UKICAgICAgICAgICAgc2VsZi5zY2FuX3VybCh1cmwpCgogICAgZGVmIG9idGFpbihzZWxmLCByZXF1aXJlbWVudCwgaW5zdGFsbGVyPU5vbmUpOgogICAgICAgIHNlbGYucHJlc2NhbigpCiAgICAgICAgc2VsZi5maW5kX3BhY2thZ2VzKHJlcXVpcmVtZW50KQogICAgICAgIGZvciBkaXN0IGluIHNlbGZbcmVxdWlyZW1lbnQua2V5XToKICAgICAgICAgICAgaWYgZGlzdCBpbiByZXF1aXJlbWVudDoKICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CiAgICAgICAgICAgIHNlbGYuZGVidWcoIiVzIGRvZXMgbm90IG1hdGNoICVzIiwgcmVxdWlyZW1lbnQsIGRpc3QpCiAgICAgICAgcmV0dXJuIHN1cGVyKFBhY2thZ2VJbmRleCwgc2VsZikub2J0YWluKHJlcXVpcmVtZW50LCBpbnN0YWxsZXIpCgogICAgZGVmIGNoZWNrX2hhc2goc2VsZiwgY2hlY2tlciwgZmlsZW5hbWUsIHRmcCk6CiAgICAgICAgIiIiCiAgICAgICAgY2hlY2tlciBpcyBhIENvbnRlbnRDaGVja2VyCiAgICAgICAgIiIiCiAgICAgICAgY2hlY2tlci5yZXBvcnQoCiAgICAgICAgICAgIHNlbGYuZGVidWcsCiAgICAgICAgICAgICJWYWxpZGF0aW5nICUlcyBjaGVja3N1bSBmb3IgJXMiICUgZmlsZW5hbWUpCiAgICAgICAgaWYgbm90IGNoZWNrZXIuaXNfdmFsaWQoKToKICAgICAgICAgICAgdGZwLmNsb3NlKCkKICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICIlcyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgJXM7ICIKICAgICAgICAgICAgICAgICJwb3NzaWJsZSBkb3dubG9hZCBwcm9ibGVtPyIKICAgICAgICAgICAgICAgICUgKGNoZWNrZXIuaGFzaC5uYW1lLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSkKICAgICAgICAgICAgKQoKICAgIGRlZiBhZGRfZmluZF9saW5rcyhzZWxmLCB1cmxzKToKICAgICAgICAiIiJBZGQgYHVybHNgIHRvIHRoZSBsaXN0IHRoYXQgd2lsbCBiZSBwcmVzY2FubmVkIGZvciBzZWFyY2hlcyIiIgogICAgICAgIGZvciB1cmwgaW4gdXJsczoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgc2VsZi50b19zY2FuIGlzIE5vbmUgICMgaWYgd2UgaGF2ZSBhbHJlYWR5ICJnb25lIG9ubGluZSIKICAgICAgICAgICAgICAgIG9yIG5vdCBVUkxfU0NIRU1FKHVybCkgICMgb3IgaXQncyBhIGxvY2FsIGZpbGUvZGlyZWN0b3J5CiAgICAgICAgICAgICAgICBvciB1cmwuc3RhcnRzd2l0aCgnZmlsZTonKQogICAgICAgICAgICAgICAgb3IgbGlzdChkaXN0cm9zX2Zvcl91cmwodXJsKSkgICMgb3IgYSBkaXJlY3QgcGFja2FnZSBsaW5rCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICAjIHRoZW4gZ28gYWhlYWQgYW5kIHByb2Nlc3MgaXQgbm93CiAgICAgICAgICAgICAgICBzZWxmLnNjYW5fdXJsKHVybCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlLCBkZWZlciByZXRyaWV2YWwgdGlsbCBsYXRlcgogICAgICAgICAgICAgICAgc2VsZi50b19zY2FuLmFwcGVuZCh1cmwpCgogICAgZGVmIHByZXNjYW4oc2VsZik6CiAgICAgICAgIiIiU2NhbiB1cmxzIHNjaGVkdWxlZCBmb3IgcHJlc2Nhbm5pbmcgKGUuZy4gLS1maW5kLWxpbmtzKSIiIgogICAgICAgIGlmIHNlbGYudG9fc2NhbjoKICAgICAgICAgICAgbGlzdChtYXAoc2VsZi5zY2FuX3VybCwgc2VsZi50b19zY2FuKSkKICAgICAgICBzZWxmLnRvX3NjYW4gPSBOb25lICAjIGZyb20gbm93IG9uLCBnbyBhaGVhZCBhbmQgcHJvY2VzcyBpbW1lZGlhdGVseQoKICAgIGRlZiBub3RfZm91bmRfaW5faW5kZXgoc2VsZiwgcmVxdWlyZW1lbnQpOgogICAgICAgIGlmIHNlbGZbcmVxdWlyZW1lbnQua2V5XTogICMgd2UndmUgc2VlbiBhdCBsZWFzdCBvbmUgZGlzdHJvCiAgICAgICAgICAgIG1ldGgsIG1zZyA9IHNlbGYuaW5mbywgIkNvdWxkbid0IHJldHJpZXZlIGluZGV4IHBhZ2UgZm9yICVyIgogICAgICAgIGVsc2U6ICAjIG5vIGRpc3Ryb3Mgc2VlbiBmb3IgdGhpcyBuYW1lLCBtaWdodCBiZSBtaXNzcGVsbGVkCiAgICAgICAgICAgIG1ldGgsIG1zZyA9ICgKICAgICAgICAgICAgICAgIHNlbGYud2FybiwKICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIGluZGV4IHBhZ2UgZm9yICVyIChtYXliZSBtaXNzcGVsbGVkPykiKQogICAgICAgIG1ldGgobXNnLCByZXF1aXJlbWVudC51bnNhZmVfbmFtZSkKICAgICAgICBzZWxmLnNjYW5fYWxsKCkKCiAgICBkZWYgZG93bmxvYWQoc2VsZiwgc3BlYywgdG1wZGlyKToKICAgICAgICAiIiJMb2NhdGUgYW5kL29yIGRvd25sb2FkIGBzcGVjYCB0byBgdG1wZGlyYCwgcmV0dXJuaW5nIGEgbG9jYWwgcGF0aAoKICAgICAgICBgc3BlY2AgbWF5IGJlIGEgYGBSZXF1aXJlbWVudGBgIG9iamVjdCwgb3IgYSBzdHJpbmcgY29udGFpbmluZyBhIFVSTCwKICAgICAgICBhbiBleGlzdGluZyBsb2NhbCBmaWxlbmFtZSwgb3IgYSBwcm9qZWN0L3ZlcnNpb24gcmVxdWlyZW1lbnQgc3BlYwogICAgICAgIChpLmUuIHRoZSBzdHJpbmcgZm9ybSBvZiBhIGBgUmVxdWlyZW1lbnRgYCBvYmplY3QpLiAgSWYgaXQgaXMgdGhlIFVSTAogICAgICAgIG9mIGEgLnB5IGZpbGUgd2l0aCBhbiB1bmFtYmlndW91cyBgYCNlZ2c9bmFtZS12ZXJzaW9uYGAgdGFnIChpLmUuLCBvbmUKICAgICAgICB0aGF0IGVzY2FwZXMgYGAtYGAgYXMgYGBfYGAgdGhyb3VnaG91dCksIGEgdHJpdmlhbCBgYHNldHVwLnB5YGAgaXMKICAgICAgICBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYWxvbmdzaWRlIHRoZSBkb3dubG9hZGVkIGZpbGUuCgogICAgICAgIElmIGBzcGVjYCBpcyBhIGBgUmVxdWlyZW1lbnRgYCBvYmplY3Qgb3IgYSBzdHJpbmcgY29udGFpbmluZyBhCiAgICAgICAgcHJvamVjdC92ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWMsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGxvY2F0aW9uIG9mCiAgICAgICAgYSBtYXRjaGluZyBkaXN0cmlidXRpb24gKHBvc3NpYmx5IGFmdGVyIGRvd25sb2FkaW5nIGl0IHRvIGB0bXBkaXJgKS4KICAgICAgICBJZiBgc3BlY2AgaXMgYSBsb2NhbGx5IGV4aXN0aW5nIGZpbGUgb3IgZGlyZWN0b3J5IG5hbWUsIGl0IGlzIHNpbXBseQogICAgICAgIHJldHVybmVkIHVuY2hhbmdlZC4gIElmIGBzcGVjYCBpcyBhIFVSTCwgaXQgaXMgZG93bmxvYWRlZCB0byBhIHN1YnBhdGgKICAgICAgICBvZiBgdG1wZGlyYCwgYW5kIHRoZSBsb2NhbCBmaWxlbmFtZSBpcyByZXR1cm5lZC4gIFZhcmlvdXMgZXJyb3JzIG1heSBiZQogICAgICAgIHJhaXNlZCBpZiBhIHByb2JsZW0gb2NjdXJzIGR1cmluZyBkb3dubG9hZGluZy4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzcGVjLCBSZXF1aXJlbWVudCk6CiAgICAgICAgICAgIHNjaGVtZSA9IFVSTF9TQ0hFTUUoc3BlYykKICAgICAgICAgICAgaWYgc2NoZW1lOgogICAgICAgICAgICAgICAgIyBJdCdzIGEgdXJsLCBkb3dubG9hZCBpdCB0byB0bXBkaXIKICAgICAgICAgICAgICAgIGZvdW5kID0gc2VsZi5fZG93bmxvYWRfdXJsKHNjaGVtZS5ncm91cCgxKSwgc3BlYywgdG1wZGlyKQogICAgICAgICAgICAgICAgYmFzZSwgZnJhZ21lbnQgPSBlZ2dfaW5mb19mb3JfdXJsKHNwZWMpCiAgICAgICAgICAgICAgICBpZiBiYXNlLmVuZHN3aXRoKCcucHknKToKICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHNlbGYuZ2VuX3NldHVwKGZvdW5kLCBmcmFnbWVudCwgdG1wZGlyKQogICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kCiAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc3BlYyk6CiAgICAgICAgICAgICAgICAjIEV4aXN0aW5nIGZpbGUgb3IgZGlyZWN0b3J5LCBqdXN0IHJldHVybiBpdAogICAgICAgICAgICAgICAgcmV0dXJuIHNwZWMKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNwZWMgPSBwYXJzZV9yZXF1aXJlbWVudF9hcmcoc3BlYykKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLmZldGNoX2Rpc3RyaWJ1dGlvbihzcGVjLCB0bXBkaXIpLCAnbG9jYXRpb24nLCBOb25lKQoKICAgIGRlZiBmZXRjaF9kaXN0cmlidXRpb24oCiAgICAgICAgICAgIHNlbGYsIHJlcXVpcmVtZW50LCB0bXBkaXIsIGZvcmNlX3NjYW49RmFsc2UsIHNvdXJjZT1GYWxzZSwKICAgICAgICAgICAgZGV2ZWxvcF9vaz1GYWxzZSwgbG9jYWxfaW5kZXg9Tm9uZSk6CiAgICAgICAgIiIiT2J0YWluIGEgZGlzdHJpYnV0aW9uIHN1aXRhYmxlIGZvciBmdWxmaWxsaW5nIGByZXF1aXJlbWVudGAKCiAgICAgICAgYHJlcXVpcmVtZW50YCBtdXN0IGJlIGEgYGBwa2dfcmVzb3VyY2VzLlJlcXVpcmVtZW50YGAgaW5zdGFuY2UuCiAgICAgICAgSWYgbmVjZXNzYXJ5LCBvciBpZiB0aGUgYGZvcmNlX3NjYW5gIGZsYWcgaXMgc2V0LCB0aGUgcmVxdWlyZW1lbnQgaXMKICAgICAgICBzZWFyY2hlZCBmb3IgaW4gdGhlIChvbmxpbmUpIHBhY2thZ2UgaW5kZXggYXMgd2VsbCBhcyB0aGUgbG9jYWxseQogICAgICAgIGluc3RhbGxlZCBwYWNrYWdlcy4gIElmIGEgZGlzdHJpYnV0aW9uIG1hdGNoaW5nIGByZXF1aXJlbWVudGAgaXMgZm91bmQsCiAgICAgICAgdGhlIHJldHVybmVkIGRpc3RyaWJ1dGlvbidzIGBgbG9jYXRpb25gYCBpcyB0aGUgdmFsdWUgeW91IHdvdWxkIGhhdmUKICAgICAgICBnb3R0ZW4gZnJvbSBjYWxsaW5nIHRoZSBgYGRvd25sb2FkKClgYCBtZXRob2Qgd2l0aCB0aGUgbWF0Y2hpbmcKICAgICAgICBkaXN0cmlidXRpb24ncyBVUkwgb3IgZmlsZW5hbWUuICBJZiBubyBtYXRjaGluZyBkaXN0cmlidXRpb24gaXMgZm91bmQsCiAgICAgICAgYGBOb25lYGAgaXMgcmV0dXJuZWQuCgogICAgICAgIElmIHRoZSBgc291cmNlYCBmbGFnIGlzIHNldCwgb25seSBzb3VyY2UgZGlzdHJpYnV0aW9ucyBhbmQgc291cmNlCiAgICAgICAgY2hlY2tvdXQgbGlua3Mgd2lsbCBiZSBjb25zaWRlcmVkLiAgVW5sZXNzIHRoZSBgZGV2ZWxvcF9va2AgZmxhZyBpcwogICAgICAgIHNldCwgZGV2ZWxvcG1lbnQgYW5kIHN5c3RlbSBlZ2dzIChpLmUuLCB0aG9zZSB1c2luZyB0aGUgYGAuZWdnLWluZm9gYAogICAgICAgIGZvcm1hdCkgd2lsbCBiZSBpZ25vcmVkLgogICAgICAgICIiIgogICAgICAgICMgcHJvY2VzcyBhIFJlcXVpcmVtZW50CiAgICAgICAgc2VsZi5pbmZvKCJTZWFyY2hpbmcgZm9yICVzIiwgcmVxdWlyZW1lbnQpCiAgICAgICAgc2tpcHBlZCA9IHt9CiAgICAgICAgZGlzdCA9IE5vbmUKCiAgICAgICAgZGVmIGZpbmQocmVxLCBlbnY9Tm9uZSk6CiAgICAgICAgICAgIGlmIGVudiBpcyBOb25lOgogICAgICAgICAgICAgICAgZW52ID0gc2VsZgogICAgICAgICAgICAjIEZpbmQgYSBtYXRjaGluZyBkaXN0cmlidXRpb247IG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UKCiAgICAgICAgICAgIGZvciBkaXN0IGluIGVudltyZXEua2V5XToKCiAgICAgICAgICAgICAgICBpZiBkaXN0LnByZWNlZGVuY2UgPT0gREVWRUxPUF9ESVNUIGFuZCBub3QgZGV2ZWxvcF9vazoKICAgICAgICAgICAgICAgICAgICBpZiBkaXN0IG5vdCBpbiBza2lwcGVkOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndhcm4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2tpcHBpbmcgZGV2ZWxvcG1lbnQgb3Igc3lzdGVtIGVnZzogJXMiLCBkaXN0LAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWRbZGlzdF0gPSAxCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICB0ZXN0ID0gKAogICAgICAgICAgICAgICAgICAgIGRpc3QgaW4gcmVxCiAgICAgICAgICAgICAgICAgICAgYW5kIChkaXN0LnByZWNlZGVuY2UgPD0gU09VUkNFX0RJU1Qgb3Igbm90IHNvdXJjZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIHRlc3Q6CiAgICAgICAgICAgICAgICAgICAgbG9jID0gc2VsZi5kb3dubG9hZChkaXN0LmxvY2F0aW9uLCB0bXBkaXIpCiAgICAgICAgICAgICAgICAgICAgZGlzdC5kb3dubG9hZF9sb2NhdGlvbiA9IGxvYwogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRpc3QuZG93bmxvYWRfbG9jYXRpb24pOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAoKICAgICAgICBpZiBmb3JjZV9zY2FuOgogICAgICAgICAgICBzZWxmLnByZXNjYW4oKQogICAgICAgICAgICBzZWxmLmZpbmRfcGFja2FnZXMocmVxdWlyZW1lbnQpCiAgICAgICAgICAgIGRpc3QgPSBmaW5kKHJlcXVpcmVtZW50KQoKICAgICAgICBpZiBub3QgZGlzdCBhbmQgbG9jYWxfaW5kZXggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGRpc3QgPSBmaW5kKHJlcXVpcmVtZW50LCBsb2NhbF9pbmRleCkKCiAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICBpZiBzZWxmLnRvX3NjYW4gaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLnByZXNjYW4oKQogICAgICAgICAgICBkaXN0ID0gZmluZChyZXF1aXJlbWVudCkKCiAgICAgICAgaWYgZGlzdCBpcyBOb25lIGFuZCBub3QgZm9yY2Vfc2NhbjoKICAgICAgICAgICAgc2VsZi5maW5kX3BhY2thZ2VzKHJlcXVpcmVtZW50KQogICAgICAgICAgICBkaXN0ID0gZmluZChyZXF1aXJlbWVudCkKCiAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICBzZWxmLndhcm4oCiAgICAgICAgICAgICAgICAiTm8gbG9jYWwgcGFja2FnZXMgb3Igd29ya2luZyBkb3dubG9hZCBsaW5rcyBmb3VuZCBmb3IgJXMlcyIsCiAgICAgICAgICAgICAgICAoc291cmNlIGFuZCAiYSBzb3VyY2UgZGlzdHJpYnV0aW9uIG9mICIgb3IgIiIpLAogICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQsCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmluZm8oIkJlc3QgbWF0Y2g6ICVzIiwgZGlzdCkKICAgICAgICAgICAgcmV0dXJuIGRpc3QuY2xvbmUobG9jYXRpb249ZGlzdC5kb3dubG9hZF9sb2NhdGlvbikKCiAgICBkZWYgZmV0Y2goc2VsZiwgcmVxdWlyZW1lbnQsIHRtcGRpciwgZm9yY2Vfc2Nhbj1GYWxzZSwgc291cmNlPUZhbHNlKToKICAgICAgICAiIiJPYnRhaW4gYSBmaWxlIHN1aXRhYmxlIGZvciBmdWxmaWxsaW5nIGByZXF1aXJlbWVudGAKCiAgICAgICAgREVQUkVDQVRFRDsgdXNlIHRoZSBgYGZldGNoX2Rpc3RyaWJ1dGlvbigpYGAgbWV0aG9kIG5vdyBpbnN0ZWFkLiAgRm9yCiAgICAgICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhpcyByb3V0aW5lIGlzIGlkZW50aWNhbCBidXQgcmV0dXJucyB0aGUKICAgICAgICBgYGxvY2F0aW9uYGAgb2YgdGhlIGRvd25sb2FkZWQgZGlzdHJpYnV0aW9uIGluc3RlYWQgb2YgYSBkaXN0cmlidXRpb24KICAgICAgICBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgZGlzdCA9IHNlbGYuZmV0Y2hfZGlzdHJpYnV0aW9uKHJlcXVpcmVtZW50LCB0bXBkaXIsIGZvcmNlX3NjYW4sIHNvdXJjZSkKICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gZGlzdC5sb2NhdGlvbgogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIGdlbl9zZXR1cChzZWxmLCBmaWxlbmFtZSwgZnJhZ21lbnQsIHRtcGRpcik6CiAgICAgICAgbWF0Y2ggPSBFR0dfRlJBR01FTlQubWF0Y2goZnJhZ21lbnQpCiAgICAgICAgZGlzdHMgPSBtYXRjaCBhbmQgWwogICAgICAgICAgICBkIGZvciBkIGluCiAgICAgICAgICAgIGludGVycHJldF9kaXN0cm9fbmFtZShmaWxlbmFtZSwgbWF0Y2guZ3JvdXAoMSksIE5vbmUpIGlmIGQudmVyc2lvbgogICAgICAgIF0gb3IgW10KCiAgICAgICAgaWYgbGVuKGRpc3RzKSA9PSAxOiAgIyB1bmFtYmlndW91cyBgYCNlZ2dgYCBmcmFnbWVudAogICAgICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpCgogICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgZmlsZSBoYXMgYmVlbiBkb3dubG9hZGVkIHRvIHRoZSB0ZW1wIGRpci4KICAgICAgICAgICAgaWYgb3MucGF0aC5kaXJuYW1lKGZpbGVuYW1lKSAhPSB0bXBkaXI6CiAgICAgICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCBiYXNlbmFtZSkKICAgICAgICAgICAgICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgc2FtZWZpbGUKICAgICAgICAgICAgICAgIGlmIG5vdCBzYW1lZmlsZShmaWxlbmFtZSwgZHN0KToKICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weTIoZmlsZW5hbWUsIGRzdCkKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGRzdAoKICAgICAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbih0bXBkaXIsICdzZXR1cC5weScpLCAndycpIGFzIGZpbGU6CiAgICAgICAgICAgICAgICBmaWxlLndyaXRlKAogICAgICAgICAgICAgICAgICAgICJmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwXG4iCiAgICAgICAgICAgICAgICAgICAgInNldHVwKG5hbWU9JXIsIHZlcnNpb249JXIsIHB5X21vZHVsZXM9WyVyXSlcbiIKICAgICAgICAgICAgICAgICAgICAlICgKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHNbMF0ucHJvamVjdF9uYW1lLCBkaXN0c1swXS52ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLnNwbGl0ZXh0KGJhc2VuYW1lKVswXQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgICAgIGVsaWYgbWF0Y2g6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IHVuYW1iaWd1b3VzbHkgaW50ZXJwcmV0IHByb2plY3QvdmVyc2lvbiBpZGVudGlmaWVyICVyOyAiCiAgICAgICAgICAgICAgICAiYW55IGRhc2hlcyBpbiB0aGUgbmFtZSBvciB2ZXJzaW9uIHNob3VsZCBiZSBlc2NhcGVkIHVzaW5nICIKICAgICAgICAgICAgICAgICJ1bmRlcnNjb3Jlcy4gJXIiICUgKGZyYWdtZW50LCBkaXN0cykKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IHByb2Nlc3MgcGxhaW4gLnB5IGZpbGVzIHdpdGhvdXQgYW4gJyNlZ2c9bmFtZS12ZXJzaW9uJyIKICAgICAgICAgICAgICAgICIgc3VmZml4IHRvIGVuYWJsZSBhdXRvbWF0aWMgc2V0dXAgc2NyaXB0IGdlbmVyYXRpb24uIgogICAgICAgICAgICApCgogICAgZGxfYmxvY2tzaXplID0gODE5MgoKICAgIGRlZiBfZG93bmxvYWRfdG8oc2VsZiwgdXJsLCBmaWxlbmFtZSk6CiAgICAgICAgc2VsZi5pbmZvKCJEb3dubG9hZGluZyAlcyIsIHVybCkKICAgICAgICAjIERvd25sb2FkIHRoZSBmaWxlCiAgICAgICAgZnAgPSBOb25lCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjaGVja2VyID0gSGFzaENoZWNrZXIuZnJvbV91cmwodXJsKQogICAgICAgICAgICBmcCA9IHNlbGYub3Blbl91cmwodXJsKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGZwLCB1cmxsaWIuZXJyb3IuSFRUUEVycm9yKToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgICAgICJDYW4ndCBkb3dubG9hZCAlczogJXMgJXMiICUgKHVybCwgZnAuY29kZSwgZnAubXNnKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBoZWFkZXJzID0gZnAuaW5mbygpCiAgICAgICAgICAgIGJsb2NrbnVtID0gMAogICAgICAgICAgICBicyA9IHNlbGYuZGxfYmxvY2tzaXplCiAgICAgICAgICAgIHNpemUgPSAtMQogICAgICAgICAgICBpZiAiY29udGVudC1sZW5ndGgiIGluIGhlYWRlcnM6CiAgICAgICAgICAgICAgICAjIFNvbWUgc2VydmVycyByZXR1cm4gbXVsdGlwbGUgQ29udGVudC1MZW5ndGggaGVhZGVycyA6KAogICAgICAgICAgICAgICAgc2l6ZXMgPSBnZXRfYWxsX2hlYWRlcnMoaGVhZGVycywgJ0NvbnRlbnQtTGVuZ3RoJykKICAgICAgICAgICAgICAgIHNpemUgPSBtYXgobWFwKGludCwgc2l6ZXMpKQogICAgICAgICAgICAgICAgc2VsZi5yZXBvcnRob29rKHVybCwgZmlsZW5hbWUsIGJsb2NrbnVtLCBicywgc2l6ZSkKICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAnd2InKSBhcyB0ZnA6CiAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgICAgIGJsb2NrID0gZnAucmVhZChicykKICAgICAgICAgICAgICAgICAgICBpZiBibG9jazoKICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlci5mZWVkKGJsb2NrKQogICAgICAgICAgICAgICAgICAgICAgICB0ZnAud3JpdGUoYmxvY2spCiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrbnVtICs9IDEKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnRob29rKHVybCwgZmlsZW5hbWUsIGJsb2NrbnVtLCBicywgc2l6ZSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgc2VsZi5jaGVja19oYXNoKGNoZWNrZXIsIGZpbGVuYW1lLCB0ZnApCiAgICAgICAgICAgIHJldHVybiBoZWFkZXJzCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgaWYgZnA6CiAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCgogICAgZGVmIHJlcG9ydGhvb2soc2VsZiwgdXJsLCBmaWxlbmFtZSwgYmxvY2tudW0sIGJsa3NpemUsIHNpemUpOgogICAgICAgIHBhc3MgICMgbm8tb3AKCiAgICBkZWYgb3Blbl91cmwoc2VsZiwgdXJsLCB3YXJuaW5nPU5vbmUpOgogICAgICAgIGlmIHVybC5zdGFydHN3aXRoKCdmaWxlOicpOgogICAgICAgICAgICByZXR1cm4gbG9jYWxfb3Blbih1cmwpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gb3Blbl93aXRoX2F1dGgodXJsLCBzZWxmLm9wZW5lcikKICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIGh0dHBfY2xpZW50LkludmFsaWRVUkwpIGFzIHY6CiAgICAgICAgICAgIG1zZyA9ICcgJy5qb2luKFtzdHIoYXJnKSBmb3IgYXJnIGluIHYuYXJnc10pCiAgICAgICAgICAgIGlmIHdhcm5pbmc6CiAgICAgICAgICAgICAgICBzZWxmLndhcm4od2FybmluZywgbXNnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoJyVzICVzJyAlICh1cmwsIG1zZykpCiAgICAgICAgZXhjZXB0IHVybGxpYi5lcnJvci5IVFRQRXJyb3IgYXMgdjoKICAgICAgICAgICAgcmV0dXJuIHYKICAgICAgICBleGNlcHQgdXJsbGliLmVycm9yLlVSTEVycm9yIGFzIHY6CiAgICAgICAgICAgIGlmIHdhcm5pbmc6CiAgICAgICAgICAgICAgICBzZWxmLndhcm4od2FybmluZywgdi5yZWFzb24pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigiRG93bmxvYWQgZXJyb3IgZm9yICVzOiAlcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHVybCwgdi5yZWFzb24pKQogICAgICAgIGV4Y2VwdCBodHRwX2NsaWVudC5CYWRTdGF0dXNMaW5lIGFzIHY6CiAgICAgICAgICAgIGlmIHdhcm5pbmc6CiAgICAgICAgICAgICAgICBzZWxmLndhcm4od2FybmluZywgdi5saW5lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJyVzIHJldHVybmVkIGEgYmFkIHN0YXR1cyBsaW5lLiBUaGUgc2VydmVyIG1pZ2h0IGJlICcKICAgICAgICAgICAgICAgICAgICAnZG93biwgJXMnICUKICAgICAgICAgICAgICAgICAgICAodXJsLCB2LmxpbmUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IChodHRwX2NsaWVudC5IVFRQRXhjZXB0aW9uLCBzb2NrZXQuZXJyb3IpIGFzIHY6CiAgICAgICAgICAgIGlmIHdhcm5pbmc6CiAgICAgICAgICAgICAgICBzZWxmLndhcm4od2FybmluZywgdikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCJEb3dubG9hZCBlcnJvciBmb3IgJXM6ICVzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodXJsLCB2KSkKCiAgICBkZWYgX2Rvd25sb2FkX3VybChzZWxmLCBzY2hlbWUsIHVybCwgdG1wZGlyKToKICAgICAgICAjIERldGVybWluZSBkb3dubG9hZCBmaWxlbmFtZQogICAgICAgICMKICAgICAgICBuYW1lLCBmcmFnbWVudCA9IGVnZ19pbmZvX2Zvcl91cmwodXJsKQogICAgICAgIGlmIG5hbWU6CiAgICAgICAgICAgIHdoaWxlICcuLicgaW4gbmFtZToKICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJy4uJywgJy4nKS5yZXBsYWNlKCdcXCcsICdfJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBuYW1lID0gIl9fZG93bmxvYWRlZF9fIiAgIyBkZWZhdWx0IGlmIFVSTCBoYXMgbm8gcGF0aCBjb250ZW50cwoKICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcuZWdnLnppcCcpOgogICAgICAgICAgICBuYW1lID0gbmFtZVs6LTRdICAjIHN0cmlwIHRoZSBleHRyYSAuemlwIGJlZm9yZSBkb3dubG9hZAoKICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbih0bXBkaXIsIG5hbWUpCgogICAgICAgICMgRG93bmxvYWQgdGhlIGZpbGUKICAgICAgICAjCiAgICAgICAgaWYgc2NoZW1lID09ICdzdm4nIG9yIHNjaGVtZS5zdGFydHN3aXRoKCdzdm4rJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF9zdm4odXJsLCBmaWxlbmFtZSkKICAgICAgICBlbGlmIHNjaGVtZSA9PSAnZ2l0JyBvciBzY2hlbWUuc3RhcnRzd2l0aCgnZ2l0KycpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfZ2l0KHVybCwgZmlsZW5hbWUpCiAgICAgICAgZWxpZiBzY2hlbWUuc3RhcnRzd2l0aCgnaGcrJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF9oZyh1cmwsIGZpbGVuYW1lKQogICAgICAgIGVsaWYgc2NoZW1lID09ICdmaWxlJzoKICAgICAgICAgICAgcmV0dXJuIHVybGxpYi5yZXF1ZXN0LnVybDJwYXRobmFtZSh1cmxsaWIucGFyc2UudXJscGFyc2UodXJsKVsyXSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnVybF9vayh1cmwsIFRydWUpICAjIHJhaXNlcyBlcnJvciBpZiBub3QgYWxsb3dlZAogICAgICAgICAgICByZXR1cm4gc2VsZi5fYXR0ZW1wdF9kb3dubG9hZCh1cmwsIGZpbGVuYW1lKQoKICAgIGRlZiBzY2FuX3VybChzZWxmLCB1cmwpOgogICAgICAgIHNlbGYucHJvY2Vzc191cmwodXJsLCBUcnVlKQoKICAgIGRlZiBfYXR0ZW1wdF9kb3dubG9hZChzZWxmLCB1cmwsIGZpbGVuYW1lKToKICAgICAgICBoZWFkZXJzID0gc2VsZi5fZG93bmxvYWRfdG8odXJsLCBmaWxlbmFtZSkKICAgICAgICBpZiAnaHRtbCcgaW4gaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScsICcnKS5sb3dlcigpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfaHRtbCh1cmwsIGhlYWRlcnMsIGZpbGVuYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIGRlZiBfZG93bmxvYWRfaHRtbChzZWxmLCB1cmwsIGhlYWRlcnMsIGZpbGVuYW1lKToKICAgICAgICBmaWxlID0gb3BlbihmaWxlbmFtZSkKICAgICAgICBmb3IgbGluZSBpbiBmaWxlOgogICAgICAgICAgICBpZiBsaW5lLnN0cmlwKCk6CiAgICAgICAgICAgICAgICAjIENoZWNrIGZvciBhIHN1YnZlcnNpb24gaW5kZXggcGFnZQogICAgICAgICAgICAgICAgaWYgcmUuc2VhcmNoKHInPHRpdGxlPihbXi0gXSsgLSApP1JldmlzaW9uIFxkKzonLCBsaW5lKToKICAgICAgICAgICAgICAgICAgICAjIGl0J3MgYSBzdWJ2ZXJzaW9uIGluZGV4IHBhZ2U6CiAgICAgICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF9zdm4odXJsLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgIGJyZWFrICAjIG5vdCBhbiBpbmRleCBwYWdlCiAgICAgICAgZmlsZS5jbG9zZSgpCiAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQogICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCJVbmV4cGVjdGVkIEhUTUwgcGFnZSBmb3VuZCBhdCAiICsgdXJsKQoKICAgIGRlZiBfZG93bmxvYWRfc3ZuKHNlbGYsIHVybCwgZmlsZW5hbWUpOgogICAgICAgIHVybCA9IHVybC5zcGxpdCgnIycsIDEpWzBdICAjIHJlbW92ZSBhbnkgZnJhZ21lbnQgZm9yIHN2bidzIHNha2UKICAgICAgICBjcmVkcyA9ICcnCiAgICAgICAgaWYgdXJsLmxvd2VyKCkuc3RhcnRzd2l0aCgnc3ZuOicpIGFuZCAnQCcgaW4gdXJsOgogICAgICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcCwgcSwgZiA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpCiAgICAgICAgICAgIGlmIG5vdCBuZXRsb2MgYW5kIHBhdGguc3RhcnRzd2l0aCgnLy8nKSBhbmQgJy8nIGluIHBhdGhbMjpdOgogICAgICAgICAgICAgICAgbmV0bG9jLCBwYXRoID0gcGF0aFsyOl0uc3BsaXQoJy8nLCAxKQogICAgICAgICAgICAgICAgYXV0aCwgaG9zdCA9IHNwbGl0dXNlcihuZXRsb2MpCiAgICAgICAgICAgICAgICBpZiBhdXRoOgogICAgICAgICAgICAgICAgICAgIGlmICc6JyBpbiBhdXRoOgogICAgICAgICAgICAgICAgICAgICAgICB1c2VyLCBwdyA9IGF1dGguc3BsaXQoJzonLCAxKQogICAgICAgICAgICAgICAgICAgICAgICBjcmVkcyA9ICIgLS11c2VybmFtZT0lcyAtLXBhc3N3b3JkPSVzIiAlICh1c2VyLCBwdykKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjcmVkcyA9ICIgLS11c2VybmFtZT0iICsgYXV0aAogICAgICAgICAgICAgICAgICAgIG5ldGxvYyA9IGhvc3QKICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IHNjaGVtZSwgbmV0bG9jLCB1cmwsIHAsIHEsIGYKICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmxsaWIucGFyc2UudXJsdW5wYXJzZShwYXJ0cykKICAgICAgICBzZWxmLmluZm8oIkRvaW5nIHN1YnZlcnNpb24gY2hlY2tvdXQgZnJvbSAlcyB0byAlcyIsIHVybCwgZmlsZW5hbWUpCiAgICAgICAgb3Muc3lzdGVtKCJzdm4gY2hlY2tvdXQlcyAtcSAlcyAlcyIgJSAoY3JlZHMsIHVybCwgZmlsZW5hbWUpKQogICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfdmNzX3NwbGl0X3Jldl9mcm9tX3VybCh1cmwsIHBvcF9wcmVmaXg9RmFsc2UpOgogICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgZnJhZyA9IHVybGxpYi5wYXJzZS51cmxzcGxpdCh1cmwpCgogICAgICAgIHNjaGVtZSA9IHNjaGVtZS5zcGxpdCgnKycsIDEpWy0xXQoKICAgICAgICAjIFNvbWUgZnJhZ21lbnQgaWRlbnRpZmljYXRpb24gZmFpbHMKICAgICAgICBwYXRoID0gcGF0aC5zcGxpdCgnIycsIDEpWzBdCgogICAgICAgIHJldiA9IE5vbmUKICAgICAgICBpZiAnQCcgaW4gcGF0aDoKICAgICAgICAgICAgcGF0aCwgcmV2ID0gcGF0aC5yc3BsaXQoJ0AnLCAxKQoKICAgICAgICAjIEFsc28sIGRpc2NhcmQgZnJhZ21lbnQKICAgICAgICB1cmwgPSB1cmxsaWIucGFyc2UudXJsdW5zcGxpdCgoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCAnJykpCgogICAgICAgIHJldHVybiB1cmwsIHJldgoKICAgIGRlZiBfZG93bmxvYWRfZ2l0KHNlbGYsIHVybCwgZmlsZW5hbWUpOgogICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3BsaXQoJyMnLCAxKVswXQogICAgICAgIHVybCwgcmV2ID0gc2VsZi5fdmNzX3NwbGl0X3Jldl9mcm9tX3VybCh1cmwsIHBvcF9wcmVmaXg9VHJ1ZSkKCiAgICAgICAgc2VsZi5pbmZvKCJEb2luZyBnaXQgY2xvbmUgZnJvbSAlcyB0byAlcyIsIHVybCwgZmlsZW5hbWUpCiAgICAgICAgb3Muc3lzdGVtKCJnaXQgY2xvbmUgLS1xdWlldCAlcyAlcyIgJSAodXJsLCBmaWxlbmFtZSkpCgogICAgICAgIGlmIHJldiBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5pbmZvKCJDaGVja2luZyBvdXQgJXMiLCByZXYpCiAgICAgICAgICAgIG9zLnN5c3RlbSgiKGNkICVzICYmIGdpdCBjaGVja291dCAtLXF1aWV0ICVzKSIgJSAoCiAgICAgICAgICAgICAgICBmaWxlbmFtZSwKICAgICAgICAgICAgICAgIHJldiwKICAgICAgICAgICAgKSkKCiAgICAgICAgcmV0dXJuIGZpbGVuYW1lCgogICAgZGVmIF9kb3dubG9hZF9oZyhzZWxmLCB1cmwsIGZpbGVuYW1lKToKICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnNwbGl0KCcjJywgMSlbMF0KICAgICAgICB1cmwsIHJldiA9IHNlbGYuX3Zjc19zcGxpdF9yZXZfZnJvbV91cmwodXJsLCBwb3BfcHJlZml4PVRydWUpCgogICAgICAgIHNlbGYuaW5mbygiRG9pbmcgaGcgY2xvbmUgZnJvbSAlcyB0byAlcyIsIHVybCwgZmlsZW5hbWUpCiAgICAgICAgb3Muc3lzdGVtKCJoZyBjbG9uZSAtLXF1aWV0ICVzICVzIiAlICh1cmwsIGZpbGVuYW1lKSkKCiAgICAgICAgaWYgcmV2IGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmluZm8oIlVwZGF0aW5nIHRvICVzIiwgcmV2KQogICAgICAgICAgICBvcy5zeXN0ZW0oIihjZCAlcyAmJiBoZyB1cCAtQyAtciAlcyAtcSkiICUgKAogICAgICAgICAgICAgICAgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICByZXYsCiAgICAgICAgICAgICkpCgogICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIGRlZiBkZWJ1ZyhzZWxmLCBtc2csICphcmdzKToKICAgICAgICBsb2cuZGVidWcobXNnLCAqYXJncykKCiAgICBkZWYgaW5mbyhzZWxmLCBtc2csICphcmdzKToKICAgICAgICBsb2cuaW5mbyhtc2csICphcmdzKQoKICAgIGRlZiB3YXJuKHNlbGYsIG1zZywgKmFyZ3MpOgogICAgICAgIGxvZy53YXJuKG1zZywgKmFyZ3MpCgoKIyBUaGlzIHBhdHRlcm4gbWF0Y2hlcyBhIGNoYXJhY3RlciBlbnRpdHkgcmVmZXJlbmNlIChhIGRlY2ltYWwgbnVtZXJpYwojIHJlZmVyZW5jZXMsIGEgaGV4YWRlY2ltYWwgbnVtZXJpYyByZWZlcmVuY2UsIG9yIGEgbmFtZWQgcmVmZXJlbmNlKS4KZW50aXR5X3N1YiA9IHJlLmNvbXBpbGUocicmKCMoXGQrfHhbXGRhLWZBLUZdKyl8W1x3LjotXSspOz8nKS5zdWIKCgpkZWYgdWNocihjKToKICAgIGlmIG5vdCBpc2luc3RhbmNlKGMsIGludCk6CiAgICAgICAgcmV0dXJuIGMKICAgIGlmIGMgPiAyNTU6CiAgICAgICAgcmV0dXJuIHNpeC51bmljaHIoYykKICAgIHJldHVybiBjaHIoYykKCgpkZWYgZGVjb2RlX2VudGl0eShtYXRjaCk6CiAgICB3aGF0ID0gbWF0Y2guZ3JvdXAoMSkKICAgIGlmIHdoYXQuc3RhcnRzd2l0aCgnI3gnKToKICAgICAgICB3aGF0ID0gaW50KHdoYXRbMjpdLCAxNikKICAgIGVsaWYgd2hhdC5zdGFydHN3aXRoKCcjJyk6CiAgICAgICAgd2hhdCA9IGludCh3aGF0WzE6XSkKICAgIGVsc2U6CiAgICAgICAgd2hhdCA9IHNpeC5tb3Zlcy5odG1sX2VudGl0aWVzLm5hbWUyY29kZXBvaW50LmdldCh3aGF0LCBtYXRjaC5ncm91cCgwKSkKICAgIHJldHVybiB1Y2hyKHdoYXQpCgoKZGVmIGh0bWxkZWNvZGUodGV4dCk6CiAgICAiIiJEZWNvZGUgSFRNTCBlbnRpdGllcyBpbiB0aGUgZ2l2ZW4gdGV4dC4iIiIKICAgIHJldHVybiBlbnRpdHlfc3ViKGRlY29kZV9lbnRpdHksIHRleHQpCgoKZGVmIHNvY2tldF90aW1lb3V0KHRpbWVvdXQ9MTUpOgogICAgZGVmIF9zb2NrZXRfdGltZW91dChmdW5jKToKICAgICAgICBkZWYgX3NvY2tldF90aW1lb3V0KCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgIG9sZF90aW1lb3V0ID0gc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkKICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChvbGRfdGltZW91dCkKCiAgICAgICAgcmV0dXJuIF9zb2NrZXRfdGltZW91dAoKICAgIHJldHVybiBfc29ja2V0X3RpbWVvdXQKCgpkZWYgX2VuY29kZV9hdXRoKGF1dGgpOgogICAgIiIiCiAgICBBIGZ1bmN0aW9uIGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLTMuMyB0aGF0IHdpbGwgZW5jb2RlCiAgICBhdXRoIGZyb20gYSBVUkwgc3VpdGFibGUgZm9yIGFuIEhUVFAgaGVhZGVyLgogICAgPj4+IHN0cihfZW5jb2RlX2F1dGgoJ3VzZXJuYW1lJTNBcGFzc3dvcmQnKSkKICAgICdkWE5sY201aGJXVTZjR0Z6YzNkdmNtUT0nCgogICAgTG9uZyBhdXRoIHN0cmluZ3Mgc2hvdWxkIG5vdCBjYXVzZSBhIG5ld2xpbmUgdG8gYmUgaW5zZXJ0ZWQuCiAgICA+Pj4gbG9uZ19hdXRoID0gJ3VzZXJuYW1lOicgKyAncGFzc3dvcmQnKjEwCiAgICA+Pj4gY2hyKDEwKSBpbiBzdHIoX2VuY29kZV9hdXRoKGxvbmdfYXV0aCkpCiAgICBGYWxzZQogICAgIiIiCiAgICBhdXRoX3MgPSB1cmxsaWIucGFyc2UudW5xdW90ZShhdXRoKQogICAgIyBjb252ZXJ0IHRvIGJ5dGVzCiAgICBhdXRoX2J5dGVzID0gYXV0aF9zLmVuY29kZSgpCiAgICAjIHVzZSB0aGUgbGVnYWN5IGludGVyZmFjZSBmb3IgUHl0aG9uIDIuMyBzdXBwb3J0CiAgICBlbmNvZGVkX2J5dGVzID0gYmFzZTY0LmVuY29kZXN0cmluZyhhdXRoX2J5dGVzKQogICAgIyBjb252ZXJ0IGJhY2sgdG8gYSBzdHJpbmcKICAgIGVuY29kZWQgPSBlbmNvZGVkX2J5dGVzLmRlY29kZSgpCiAgICAjIHN0cmlwIHRoZSB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4KICAgIHJldHVybiBlbmNvZGVkLnJlcGxhY2UoJ1xuJywgJycpCgoKY2xhc3MgQ3JlZGVudGlhbChvYmplY3QpOgogICAgIiIiCiAgICBBIHVzZXJuYW1lL3Bhc3N3b3JkIHBhaXIuIFVzZSBsaWtlIGEgbmFtZWR0dXBsZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1c2VybmFtZSwgcGFzc3dvcmQpOgogICAgICAgIHNlbGYudXNlcm5hbWUgPSB1c2VybmFtZQogICAgICAgIHNlbGYucGFzc3dvcmQgPSBwYXNzd29yZAoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICB5aWVsZCBzZWxmLnVzZXJuYW1lCiAgICAgICAgeWllbGQgc2VsZi5wYXNzd29yZAoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnJSh1c2VybmFtZSlzOiUocGFzc3dvcmQpcycgJSB2YXJzKHNlbGYpCgoKY2xhc3MgUHlQSUNvbmZpZyhjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBMb2FkIGZyb20gfi8ucHlwaXJjCiAgICAgICAgIiIiCiAgICAgICAgZGVmYXVsdHMgPSBkaWN0LmZyb21rZXlzKFsndXNlcm5hbWUnLCAncGFzc3dvcmQnLCAncmVwb3NpdG9yeSddLCAnJykKICAgICAgICBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyLl9faW5pdF9fKHNlbGYsIGRlZmF1bHRzKQoKICAgICAgICByYyA9IG9zLnBhdGguam9pbihvcy5wYXRoLmV4cGFuZHVzZXIoJ34nKSwgJy5weXBpcmMnKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJjKToKICAgICAgICAgICAgc2VsZi5yZWFkKHJjKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNyZWRzX2J5X3JlcG9zaXRvcnkoc2VsZik6CiAgICAgICAgc2VjdGlvbnNfd2l0aF9yZXBvc2l0b3JpZXMgPSBbCiAgICAgICAgICAgIHNlY3Rpb24gZm9yIHNlY3Rpb24gaW4gc2VsZi5zZWN0aW9ucygpCiAgICAgICAgICAgIGlmIHNlbGYuZ2V0KHNlY3Rpb24sICdyZXBvc2l0b3J5Jykuc3RyaXAoKQogICAgICAgIF0KCiAgICAgICAgcmV0dXJuIGRpY3QobWFwKHNlbGYuX2dldF9yZXBvX2NyZWQsIHNlY3Rpb25zX3dpdGhfcmVwb3NpdG9yaWVzKSkKCiAgICBkZWYgX2dldF9yZXBvX2NyZWQoc2VsZiwgc2VjdGlvbik6CiAgICAgICAgcmVwbyA9IHNlbGYuZ2V0KHNlY3Rpb24sICdyZXBvc2l0b3J5Jykuc3RyaXAoKQogICAgICAgIHJldHVybiByZXBvLCBDcmVkZW50aWFsKAogICAgICAgICAgICBzZWxmLmdldChzZWN0aW9uLCAndXNlcm5hbWUnKS5zdHJpcCgpLAogICAgICAgICAgICBzZWxmLmdldChzZWN0aW9uLCAncGFzc3dvcmQnKS5zdHJpcCgpLAogICAgICAgICkKCiAgICBkZWYgZmluZF9jcmVkZW50aWFsKHNlbGYsIHVybCk6CiAgICAgICAgIiIiCiAgICAgICAgSWYgdGhlIFVSTCBpbmRpY2F0ZWQgYXBwZWFycyB0byBiZSBhIHJlcG9zaXRvcnkgZGVmaW5lZCBpbiB0aGlzCiAgICAgICAgY29uZmlnLCByZXR1cm4gdGhlIGNyZWRlbnRpYWwgZm9yIHRoYXQgcmVwb3NpdG9yeS4KICAgICAgICAiIiIKICAgICAgICBmb3IgcmVwb3NpdG9yeSwgY3JlZCBpbiBzZWxmLmNyZWRzX2J5X3JlcG9zaXRvcnkuaXRlbXMoKToKICAgICAgICAgICAgaWYgdXJsLnN0YXJ0c3dpdGgocmVwb3NpdG9yeSk6CiAgICAgICAgICAgICAgICByZXR1cm4gY3JlZAoKCmRlZiBvcGVuX3dpdGhfYXV0aCh1cmwsIG9wZW5lcj11cmxsaWIucmVxdWVzdC51cmxvcGVuKToKICAgICIiIk9wZW4gYSB1cmxsaWIyIHJlcXVlc3QsIGhhbmRsaW5nIEhUVFAgYXV0aGVudGljYXRpb24iIiIKCiAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZyA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpCgogICAgIyBEb3VibGUgc2NoZW1lIGRvZXMgbm90IHJhaXNlIG9uIE1hYyBPUyBYIGFzIHJldmVhbGVkIGJ5IGEKICAgICMgZmFpbGluZyB0ZXN0LiBXZSB3b3VsZCBleHBlY3QgIm5vbm51bWVyaWMgcG9ydCIuIFJlZnMgIzIwLgogICAgaWYgbmV0bG9jLmVuZHN3aXRoKCc6Jyk6CiAgICAgICAgcmFpc2UgaHR0cF9jbGllbnQuSW52YWxpZFVSTCgibm9ubnVtZXJpYyBwb3J0OiAnJyIpCgogICAgaWYgc2NoZW1lIGluICgnaHR0cCcsICdodHRwcycpOgogICAgICAgIGF1dGgsIGhvc3QgPSBzcGxpdHVzZXIobmV0bG9jKQogICAgZWxzZToKICAgICAgICBhdXRoID0gTm9uZQoKICAgIGlmIG5vdCBhdXRoOgogICAgICAgIGNyZWQgPSBQeVBJQ29uZmlnKCkuZmluZF9jcmVkZW50aWFsKHVybCkKICAgICAgICBpZiBjcmVkOgogICAgICAgICAgICBhdXRoID0gc3RyKGNyZWQpCiAgICAgICAgICAgIGluZm8gPSBjcmVkLnVzZXJuYW1lLCB1cmwKICAgICAgICAgICAgbG9nLmluZm8oJ0F1dGhlbnRpY2F0aW5nIGFzICVzIGZvciAlcyAoZnJvbSAucHlwaXJjKScsICppbmZvKQoKICAgIGlmIGF1dGg6CiAgICAgICAgYXV0aCA9ICJCYXNpYyAiICsgX2VuY29kZV9hdXRoKGF1dGgpCiAgICAgICAgcGFydHMgPSBzY2hlbWUsIGhvc3QsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWcKICAgICAgICBuZXdfdXJsID0gdXJsbGliLnBhcnNlLnVybHVucGFyc2UocGFydHMpCiAgICAgICAgcmVxdWVzdCA9IHVybGxpYi5yZXF1ZXN0LlJlcXVlc3QobmV3X3VybCkKICAgICAgICByZXF1ZXN0LmFkZF9oZWFkZXIoIkF1dGhvcml6YXRpb24iLCBhdXRoKQogICAgZWxzZToKICAgICAgICByZXF1ZXN0ID0gdXJsbGliLnJlcXVlc3QuUmVxdWVzdCh1cmwpCgogICAgcmVxdWVzdC5hZGRfaGVhZGVyKCdVc2VyLUFnZW50JywgdXNlcl9hZ2VudCkKICAgIGZwID0gb3BlbmVyKHJlcXVlc3QpCgogICAgaWYgYXV0aDoKICAgICAgICAjIFB1dCBhdXRoZW50aWNhdGlvbiBpbmZvIGJhY2sgaW50byByZXF1ZXN0IFVSTCBpZiBzYW1lIGhvc3QsCiAgICAgICAgIyBzbyB0aGF0IGxpbmtzIGZvdW5kIG9uIHRoZSBwYWdlIHdpbGwgd29yawogICAgICAgIHMyLCBoMiwgcGF0aDIsIHBhcmFtMiwgcXVlcnkyLCBmcmFnMiA9IHVybGxpYi5wYXJzZS51cmxwYXJzZShmcC51cmwpCiAgICAgICAgaWYgczIgPT0gc2NoZW1lIGFuZCBoMiA9PSBob3N0OgogICAgICAgICAgICBwYXJ0cyA9IHMyLCBuZXRsb2MsIHBhdGgyLCBwYXJhbTIsIHF1ZXJ5MiwgZnJhZzIKICAgICAgICAgICAgZnAudXJsID0gdXJsbGliLnBhcnNlLnVybHVucGFyc2UocGFydHMpCgogICAgcmV0dXJuIGZwCgoKIyBhZGRpbmcgYSB0aW1lb3V0IHRvIGF2b2lkIGZyZWV6aW5nIHBhY2thZ2VfaW5kZXgKb3Blbl93aXRoX2F1dGggPSBzb2NrZXRfdGltZW91dChfU09DS0VUX1RJTUVPVVQpKG9wZW5fd2l0aF9hdXRoKQoKCmRlZiBmaXhfc2ZfdXJsKHVybCk6CiAgICByZXR1cm4gdXJsICAjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKCgpkZWYgbG9jYWxfb3Blbih1cmwpOgogICAgIiIiUmVhZCBhIGxvY2FsIHBhdGgsIHdpdGggc3BlY2lhbCBzdXBwb3J0IGZvciBkaXJlY3RvcmllcyIiIgogICAgc2NoZW1lLCBzZXJ2ZXIsIHBhdGgsIHBhcmFtLCBxdWVyeSwgZnJhZyA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpCiAgICBmaWxlbmFtZSA9IHVybGxpYi5yZXF1ZXN0LnVybDJwYXRobmFtZShwYXRoKQogICAgaWYgb3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUpOgogICAgICAgIHJldHVybiB1cmxsaWIucmVxdWVzdC51cmxvcGVuKHVybCkKICAgIGVsaWYgcGF0aC5lbmRzd2l0aCgnLycpIGFuZCBvcy5wYXRoLmlzZGlyKGZpbGVuYW1lKToKICAgICAgICBmaWxlcyA9IFtdCiAgICAgICAgZm9yIGYgaW4gb3MubGlzdGRpcihmaWxlbmFtZSk6CiAgICAgICAgICAgIGZpbGVwYXRoID0gb3MucGF0aC5qb2luKGZpbGVuYW1lLCBmKQogICAgICAgICAgICBpZiBmID09ICdpbmRleC5odG1sJzoKICAgICAgICAgICAgICAgIHdpdGggb3BlbihmaWxlcGF0aCwgJ3InKSBhcyBmcDoKICAgICAgICAgICAgICAgICAgICBib2R5ID0gZnAucmVhZCgpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoZmlsZXBhdGgpOgogICAgICAgICAgICAgICAgZiArPSAnLycKICAgICAgICAgICAgZmlsZXMuYXBwZW5kKCc8YSBocmVmPSJ7bmFtZX0iPntuYW1lfTwvYT4nLmZvcm1hdChuYW1lPWYpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRtcGwgPSAoCiAgICAgICAgICAgICAgICAiPGh0bWw+PGhlYWQ+PHRpdGxlPnt1cmx9PC90aXRsZT4iCiAgICAgICAgICAgICAgICAiPC9oZWFkPjxib2R5PntmaWxlc308L2JvZHk+PC9odG1sPiIpCiAgICAgICAgICAgIGJvZHkgPSB0bXBsLmZvcm1hdCh1cmw9dXJsLCBmaWxlcz0nXG4nLmpvaW4oZmlsZXMpKQogICAgICAgIHN0YXR1cywgbWVzc2FnZSA9IDIwMCwgIk9LIgogICAgZWxzZToKICAgICAgICBzdGF0dXMsIG1lc3NhZ2UsIGJvZHkgPSA0MDQsICJQYXRoIG5vdCBmb3VuZCIsICJOb3QgZm91bmQiCgogICAgaGVhZGVycyA9IHsnY29udGVudC10eXBlJzogJ3RleHQvaHRtbCd9CiAgICBib2R5X3N0cmVhbSA9IHNpeC5TdHJpbmdJTyhib2R5KQogICAgcmV0dXJuIHVybGxpYi5lcnJvci5IVFRQRXJyb3IodXJsLCBzdGF0dXMsIG1lc3NhZ2UsIGhlYWRlcnMsIGJvZHlfc3RyZWFtKQpQSwMEFAAAAAAAAAAhAOXm6L6CKgAAgioAADAAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3BlcDQyNXRhZ3MucHkjIFRoaXMgZmlsZSBvcmlnaW5hbGx5IGZyb20gcGlwOgojIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9ibG9iLzhmNGYxNWE1YTk1ZDdkNWI1MTFjZWFlZTllZDI2MTE3NmMxODE5NzAvc3JjL3BpcC9faW50ZXJuYWwvcGVwNDI1dGFncy5weQoiIiJHZW5lcmF0ZSBhbmQgd29yayB3aXRoIFBFUCA0MjUgQ29tcGF0aWJpbGl0eSBUYWdzLiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGRpc3R1dGlscy51dGlsCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgcmUKaW1wb3J0IHN5cwppbXBvcnQgc3lzY29uZmlnCmltcG9ydCB3YXJuaW5ncwpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdAoKZnJvbSAuIGltcG9ydCBnbGliYwoKX29zeF9hcmNoX3BhdCA9IHJlLmNvbXBpbGUocicoLispXyhcZCspXyhcZCspXyguKyknKQoKCmRlZiBnZXRfY29uZmlnX3Zhcih2YXIpOgogICAgdHJ5OgogICAgICAgIHJldHVybiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIodmFyKQogICAgZXhjZXB0IElPRXJyb3IgYXMgZTogICMgSXNzdWUgIzEwNzQKICAgICAgICB3YXJuaW5ncy53YXJuKCJ7fSIuZm9ybWF0KGUpLCBSdW50aW1lV2FybmluZykKICAgICAgICByZXR1cm4gTm9uZQoKCmRlZiBnZXRfYWJicl9pbXBsKCk6CiAgICAiIiJSZXR1cm4gYWJicmV2aWF0ZWQgaW1wbGVtZW50YXRpb24gbmFtZS4iIiIKICAgIGlmIGhhc2F0dHIoc3lzLCAncHlweV92ZXJzaW9uX2luZm8nKToKICAgICAgICBweWltcGwgPSAncHAnCiAgICBlbGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CiAgICAgICAgcHlpbXBsID0gJ2p5JwogICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gJ2NsaSc6CiAgICAgICAgcHlpbXBsID0gJ2lwJwogICAgZWxzZToKICAgICAgICBweWltcGwgPSAnY3AnCiAgICByZXR1cm4gcHlpbXBsCgoKZGVmIGdldF9pbXBsX3ZlcigpOgogICAgIiIiUmV0dXJuIGltcGxlbWVudGF0aW9uIHZlcnNpb24uIiIiCiAgICBpbXBsX3ZlciA9IGdldF9jb25maWdfdmFyKCJweV92ZXJzaW9uX25vZG90IikKICAgIGlmIG5vdCBpbXBsX3ZlciBvciBnZXRfYWJicl9pbXBsKCkgPT0gJ3BwJzoKICAgICAgICBpbXBsX3ZlciA9ICcnLmpvaW4obWFwKHN0ciwgZ2V0X2ltcGxfdmVyc2lvbl9pbmZvKCkpKQogICAgcmV0dXJuIGltcGxfdmVyCgoKZGVmIGdldF9pbXBsX3ZlcnNpb25faW5mbygpOgogICAgIiIiUmV0dXJuIHN5cy52ZXJzaW9uX2luZm8tbGlrZSB0dXBsZSBmb3IgdXNlIGluIGRlY3JlbWVudGluZyB0aGUgbWlub3IKICAgIHZlcnNpb24uIiIiCiAgICBpZiBnZXRfYWJicl9pbXBsKCkgPT0gJ3BwJzoKICAgICAgICAjIGFzIHBlciBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzI4ODIKICAgICAgICByZXR1cm4gKHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy5weXB5X3ZlcnNpb25faW5mby5tYWpvciwKICAgICAgICAgICAgICAgIHN5cy5weXB5X3ZlcnNpb25faW5mby5taW5vcikKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy52ZXJzaW9uX2luZm9bMV0KCgpkZWYgZ2V0X2ltcGxfdGFnKCk6CiAgICAiIiIKICAgIFJldHVybnMgdGhlIFRhZyBmb3IgdGhpcyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KICAgICIiIgogICAgcmV0dXJuICJ7fXt9Ii5mb3JtYXQoZ2V0X2FiYnJfaW1wbCgpLCBnZXRfaW1wbF92ZXIoKSkKCgpkZWYgZ2V0X2ZsYWcodmFyLCBmYWxsYmFjaywgZXhwZWN0ZWQ9VHJ1ZSwgd2Fybj1UcnVlKToKICAgICIiIlVzZSBhIGZhbGxiYWNrIG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgU09BQkkgZmxhZ3MgaWYgdGhlIG5lZWRlZCBjb25maWcKICAgIHZhciBpcyB1bnNldCBvciB1bmF2YWlsYWJsZS4iIiIKICAgIHZhbCA9IGdldF9jb25maWdfdmFyKHZhcikKICAgIGlmIHZhbCBpcyBOb25lOgogICAgICAgIGlmIHdhcm46CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNvbmZpZyB2YXJpYWJsZSAnezB9JyBpcyB1bnNldCwgUHl0aG9uIEFCSSB0YWcgbWF5ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAiYmUgaW5jb3JyZWN0Ii5mb3JtYXQodmFyKSwgUnVudGltZVdhcm5pbmcsIDIpCiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCkKICAgIHJldHVybiB2YWwgPT0gZXhwZWN0ZWQKCgpkZWYgZ2V0X2FiaV90YWcoKToKICAgICIiIlJldHVybiB0aGUgQUJJIHRhZyBiYXNlZCBvbiBTT0FCSSAoaWYgYXZhaWxhYmxlKSBvciBlbXVsYXRlIFNPQUJJCiAgICAoQ1B5dGhvbiAyLCBQeVB5KS4iIiIKICAgIHNvYWJpID0gZ2V0X2NvbmZpZ192YXIoJ1NPQUJJJykKICAgIGltcGwgPSBnZXRfYWJicl9pbXBsKCkKICAgIGlmIG5vdCBzb2FiaSBhbmQgaW1wbCBpbiB7J2NwJywgJ3BwJ30gYW5kIGhhc2F0dHIoc3lzLCAnbWF4dW5pY29kZScpOgogICAgICAgIGQgPSAnJwogICAgICAgIG0gPSAnJwogICAgICAgIHUgPSAnJwogICAgICAgIGlmIGdldF9mbGFnKCdQeV9ERUJVRycsCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBoYXNhdHRyKHN5cywgJ2dldHRvdGFscmVmY291bnQnKSwKICAgICAgICAgICAgICAgICAgICB3YXJuPShpbXBsID09ICdjcCcpKToKICAgICAgICAgICAgZCA9ICdkJwogICAgICAgIGlmIGdldF9mbGFnKCdXSVRIX1BZTUFMTE9DJywKICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IGltcGwgPT0gJ2NwJywKICAgICAgICAgICAgICAgICAgICB3YXJuPShpbXBsID09ICdjcCcpKToKICAgICAgICAgICAgbSA9ICdtJwogICAgICAgIGlmIGdldF9mbGFnKCdQeV9VTklDT0RFX1NJWkUnLAogICAgICAgICAgICAgICAgICAgIGxhbWJkYTogc3lzLm1heHVuaWNvZGUgPT0gMHgxMGZmZmYsCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9NCwKICAgICAgICAgICAgICAgICAgICB3YXJuPShpbXBsID09ICdjcCcgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzKSkpIFwKICAgICAgICAgICAgICAgIGFuZCBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDMpOgogICAgICAgICAgICB1ID0gJ3UnCiAgICAgICAgYWJpID0gJyVzJXMlcyVzJXMnICUgKGltcGwsIGdldF9pbXBsX3ZlcigpLCBkLCBtLCB1KQogICAgZWxpZiBzb2FiaSBhbmQgc29hYmkuc3RhcnRzd2l0aCgnY3B5dGhvbi0nKToKICAgICAgICBhYmkgPSAnY3AnICsgc29hYmkuc3BsaXQoJy0nKVsxXQogICAgZWxpZiBzb2FiaToKICAgICAgICBhYmkgPSBzb2FiaS5yZXBsYWNlKCcuJywgJ18nKS5yZXBsYWNlKCctJywgJ18nKQogICAgZWxzZToKICAgICAgICBhYmkgPSBOb25lCiAgICByZXR1cm4gYWJpCgoKZGVmIF9pc19ydW5uaW5nXzMyYml0KCk6CiAgICByZXR1cm4gc3lzLm1heHNpemUgPT0gMjE0NzQ4MzY0NwoKCmRlZiBnZXRfcGxhdGZvcm0oKToKICAgICIiIlJldHVybiBvdXIgcGxhdGZvcm0gbmFtZSAnd2luMzInLCAnbGludXhfeDg2XzY0JyIiIgogICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgogICAgICAgICMgZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkgcmV0dXJucyB0aGUgcmVsZWFzZSBiYXNlZCBvbiB0aGUgdmFsdWUKICAgICAgICAjIG9mIE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCBvbiB3aGljaCBQeXRob24gd2FzIGJ1aWx0LCB3aGljaCBtYXkKICAgICAgICAjIGJlIHNpZ25pZmljYW50bHkgb2xkZXIgdGhhbiB0aGUgdXNlcidzIGN1cnJlbnQgbWFjaGluZS4KICAgICAgICByZWxlYXNlLCBfLCBtYWNoaW5lID0gcGxhdGZvcm0ubWFjX3ZlcigpCiAgICAgICAgc3BsaXRfdmVyID0gcmVsZWFzZS5zcGxpdCgnLicpCgogICAgICAgIGlmIG1hY2hpbmUgPT0gIng4Nl82NCIgYW5kIF9pc19ydW5uaW5nXzMyYml0KCk6CiAgICAgICAgICAgIG1hY2hpbmUgPSAiaTM4NiIKICAgICAgICBlbGlmIG1hY2hpbmUgPT0gInBwYzY0IiBhbmQgX2lzX3J1bm5pbmdfMzJiaXQoKToKICAgICAgICAgICAgbWFjaGluZSA9ICJwcGMiCgogICAgICAgIHJldHVybiAnbWFjb3N4X3t9X3t9X3t9Jy5mb3JtYXQoc3BsaXRfdmVyWzBdLCBzcGxpdF92ZXJbMV0sIG1hY2hpbmUpCgogICAgIyBYWFggcmVtb3ZlIGRpc3R1dGlscyBkZXBlbmRlbmN5CiAgICByZXN1bHQgPSBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKS5yZXBsYWNlKCcuJywgJ18nKS5yZXBsYWNlKCctJywgJ18nKQogICAgaWYgcmVzdWx0ID09ICJsaW51eF94ODZfNjQiIGFuZCBfaXNfcnVubmluZ18zMmJpdCgpOgogICAgICAgICMgMzIgYml0IFB5dGhvbiBwcm9ncmFtIChydW5uaW5nIG9uIGEgNjQgYml0IExpbnV4KTogcGlwIHNob3VsZCBvbmx5CiAgICAgICAgIyBpbnN0YWxsIGFuZCBydW4gMzIgYml0IGNvbXBpbGVkIGV4dGVuc2lvbnMgaW4gdGhhdCBjYXNlLgogICAgICAgIHJlc3VsdCA9ICJsaW51eF9pNjg2IgoKICAgIHJldHVybiByZXN1bHQKCgpkZWYgaXNfbWFueWxpbnV4MV9jb21wYXRpYmxlKCk6CiAgICAjIE9ubHkgTGludXgsIGFuZCBvbmx5IHg4Ni02NCAvIGk2ODYKICAgIGlmIGdldF9wbGF0Zm9ybSgpIG5vdCBpbiB7ImxpbnV4X3g4Nl82NCIsICJsaW51eF9pNjg2In06CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgIyBDaGVjayBmb3IgcHJlc2VuY2Ugb2YgX21hbnlsaW51eCBtb2R1bGUKICAgIHRyeToKICAgICAgICBpbXBvcnQgX21hbnlsaW51eAogICAgICAgIHJldHVybiBib29sKF9tYW55bGludXgubWFueWxpbnV4MV9jb21wYXRpYmxlKQogICAgZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgogICAgICAgICMgRmFsbCB0aHJvdWdoIHRvIGhldXJpc3RpYyBjaGVjayBiZWxvdwogICAgICAgIHBhc3MKCiAgICAjIENoZWNrIGdsaWJjIHZlcnNpb24uIENlbnRPUyA1IHVzZXMgZ2xpYmMgMi41LgogICAgcmV0dXJuIGdsaWJjLmhhdmVfY29tcGF0aWJsZV9nbGliYygyLCA1KQoKCmRlZiBnZXRfZGFyd2luX2FyY2hlcyhtYWpvciwgbWlub3IsIG1hY2hpbmUpOgogICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBzdXBwb3J0ZWQgYXJjaGVzIChpbmNsdWRpbmcgZ3JvdXAgYXJjaGVzKSBmb3IKICAgIHRoZSBnaXZlbiBtYWpvciwgbWlub3IgYW5kIG1hY2hpbmUgYXJjaGl0ZWN0dXJlIG9mIGFuIG1hY09TIG1hY2hpbmUuCiAgICAiIiIKICAgIGFyY2hlcyA9IFtdCgogICAgZGVmIF9zdXBwb3J0c19hcmNoKG1ham9yLCBtaW5vciwgYXJjaCk6CiAgICAgICAgIyBMb29raW5nIGF0IHRoZSBhcHBsaWNhdGlvbiBzdXBwb3J0IGZvciBtYWNPUyB2ZXJzaW9ucyBpbiB0aGUgY2hhcnQKICAgICAgICAjIHByb3ZpZGVkIGJ5IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09TX1gjVmVyc2lvbnMgaXQgYXBwZWFycwogICAgICAgICMgb3VyIHRpbWVsaW5lIGxvb2tzIHJvdWdobHkgbGlrZToKICAgICAgICAjCiAgICAgICAgIyAxMC4wIC0gSW50cm9kdWNlcyBwcGMgc3VwcG9ydC4KICAgICAgICAjIDEwLjQgLSBJbnRyb2R1Y2VzIHBwYzY0LCBpMzg2LCBhbmQgeDg2XzY0IHN1cHBvcnQsIGhvd2V2ZXIgdGhlIHBwYzY0CiAgICAgICAgIyAgICAgICAgYW5kIHg4Nl82NCBzdXBwb3J0IGlzIENMSSBvbmx5LCBhbmQgY2Fubm90IGJlIHVzZWQgZm9yIEdVSQogICAgICAgICMgICAgICAgIGFwcGxpY2F0aW9ucy4KICAgICAgICAjIDEwLjUgLSBFeHRlbmRzIHBwYzY0IGFuZCB4ODZfNjQgc3VwcG9ydCB0byBjb3ZlciBHVUkgYXBwbGljYXRpb25zLgogICAgICAgICMgMTAuNiAtIERyb3BzIHN1cHBvcnQgZm9yIHBwYzY0CiAgICAgICAgIyAxMC43IC0gRHJvcHMgc3VwcG9ydCBmb3IgcHBjCiAgICAgICAgIwogICAgICAgICMgR2l2ZW4gdGhhdCB3ZSBkbyBub3Qga25vdyBpZiB3ZSdyZSBpbnN0YWxsaW5nIGEgQ0xJIG9yIGEgR1VJCiAgICAgICAgIyBhcHBsaWNhdGlvbiwgd2UgbXVzdCBiZSBjb25zZXJ2YXRpdmUgYW5kIGFzc3VtZSBpdCBtaWdodCBiZSBhIEdVSQogICAgICAgICMgYXBwbGljYXRpb24gYW5kIGJlaGF2ZSBhcyBpZiBwcGM2NCBhbmQgeDg2XzY0IHN1cHBvcnQgZGlkIG5vdCBvY2N1cgogICAgICAgICMgdW50aWwgMTAuNS4KICAgICAgICAjCiAgICAgICAgIyBOb3RlOiBUaGUgYWJvdmUgaW5mb3JtYXRpb24gaXMgdGFrZW4gZnJvbSB0aGUgIkFwcGxpY2F0aW9uIHN1cHBvcnQiCiAgICAgICAgIyAgICAgICBjb2x1bW4gaW4gdGhlIGNoYXJ0IG5vdCB0aGUgIlByb2Nlc3NvciBzdXBwb3J0IiBzaW5jZSBJIGJlbGlldmUKICAgICAgICAjICAgICAgIHRoYXQgd2UgY2FyZSBhYm91dCB3aGF0IGluc3RydWN0aW9uIHNldHMgYW4gYXBwbGljYXRpb24gY2FuIHVzZQogICAgICAgICMgICAgICAgbm90IHdoaWNoIHByb2Nlc3NvcnMgdGhlIE9TIHN1cHBvcnRzLgogICAgICAgIGlmIGFyY2ggPT0gJ3BwYyc6CiAgICAgICAgICAgIHJldHVybiAobWFqb3IsIG1pbm9yKSA8PSAoMTAsIDUpCiAgICAgICAgaWYgYXJjaCA9PSAncHBjNjQnOgogICAgICAgICAgICByZXR1cm4gKG1ham9yLCBtaW5vcikgPT0gKDEwLCA1KQogICAgICAgIGlmIGFyY2ggPT0gJ2kzODYnOgogICAgICAgICAgICByZXR1cm4gKG1ham9yLCBtaW5vcikgPj0gKDEwLCA0KQogICAgICAgIGlmIGFyY2ggPT0gJ3g4Nl82NCc6CiAgICAgICAgICAgIHJldHVybiAobWFqb3IsIG1pbm9yKSA+PSAoMTAsIDUpCiAgICAgICAgaWYgYXJjaCBpbiBncm91cHM6CiAgICAgICAgICAgIGZvciBnYXJjaCBpbiBncm91cHNbYXJjaF06CiAgICAgICAgICAgICAgICBpZiBfc3VwcG9ydHNfYXJjaChtYWpvciwgbWlub3IsIGdhcmNoKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGdyb3VwcyA9IE9yZGVyZWREaWN0KFsKICAgICAgICAoImZhdCIsICgiaTM4NiIsICJwcGMiKSksCiAgICAgICAgKCJpbnRlbCIsICgieDg2XzY0IiwgImkzODYiKSksCiAgICAgICAgKCJmYXQ2NCIsICgieDg2XzY0IiwgInBwYzY0IikpLAogICAgICAgICgiZmF0MzIiLCAoIng4Nl82NCIsICJpMzg2IiwgInBwYyIpKSwKICAgIF0pCgogICAgaWYgX3N1cHBvcnRzX2FyY2gobWFqb3IsIG1pbm9yLCBtYWNoaW5lKToKICAgICAgICBhcmNoZXMuYXBwZW5kKG1hY2hpbmUpCgogICAgZm9yIGdhcmNoIGluIGdyb3VwczoKICAgICAgICBpZiBtYWNoaW5lIGluIGdyb3Vwc1tnYXJjaF0gYW5kIF9zdXBwb3J0c19hcmNoKG1ham9yLCBtaW5vciwgZ2FyY2gpOgogICAgICAgICAgICBhcmNoZXMuYXBwZW5kKGdhcmNoKQoKICAgIGFyY2hlcy5hcHBlbmQoJ3VuaXZlcnNhbCcpCgogICAgcmV0dXJuIGFyY2hlcwoKCmRlZiBnZXRfc3VwcG9ydGVkKHZlcnNpb25zPU5vbmUsIG5vYXJjaD1GYWxzZSwgcGxhdGZvcm09Tm9uZSwKICAgICAgICAgICAgICAgICAgaW1wbD1Ob25lLCBhYmk9Tm9uZSk6CiAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHN1cHBvcnRlZCB0YWdzIGZvciBlYWNoIHZlcnNpb24gc3BlY2lmaWVkIGluCiAgICBgdmVyc2lvbnNgLgoKICAgIDpwYXJhbSB2ZXJzaW9uczogYSBsaXN0IG9mIHN0cmluZyB2ZXJzaW9ucywgb2YgdGhlIGZvcm0gWyIzMyIsICIzMiJdLAogICAgICAgIG9yIE5vbmUuIFRoZSBmaXJzdCB2ZXJzaW9uIHdpbGwgYmUgYXNzdW1lZCB0byBzdXBwb3J0IG91ciBBQkkuCiAgICA6cGFyYW0gcGxhdGZvcm06IHNwZWNpZnkgdGhlIGV4YWN0IHBsYXRmb3JtIHlvdSB3YW50IHZhbGlkCiAgICAgICAgdGFncyBmb3IsIG9yIE5vbmUuIElmIE5vbmUsIHVzZSB0aGUgbG9jYWwgc3lzdGVtIHBsYXRmb3JtLgogICAgOnBhcmFtIGltcGw6IHNwZWNpZnkgdGhlIGV4YWN0IGltcGxlbWVudGF0aW9uIHlvdSB3YW50IHZhbGlkCiAgICAgICAgdGFncyBmb3IsIG9yIE5vbmUuIElmIE5vbmUsIHVzZSB0aGUgbG9jYWwgaW50ZXJwcmV0ZXIgaW1wbC4KICAgIDpwYXJhbSBhYmk6IHNwZWNpZnkgdGhlIGV4YWN0IGFiaSB5b3Ugd2FudCB2YWxpZAogICAgICAgIHRhZ3MgZm9yLCBvciBOb25lLiBJZiBOb25lLCB1c2UgdGhlIGxvY2FsIGludGVycHJldGVyIGFiaS4KICAgICIiIgogICAgc3VwcG9ydGVkID0gW10KCiAgICAjIFZlcnNpb25zIG11c3QgYmUgZ2l2ZW4gd2l0aCByZXNwZWN0IHRvIHRoZSBwcmVmZXJlbmNlCiAgICBpZiB2ZXJzaW9ucyBpcyBOb25lOgogICAgICAgIHZlcnNpb25zID0gW10KICAgICAgICB2ZXJzaW9uX2luZm8gPSBnZXRfaW1wbF92ZXJzaW9uX2luZm8oKQogICAgICAgIG1ham9yID0gdmVyc2lvbl9pbmZvWzotMV0KICAgICAgICAjIFN1cHBvcnQgYWxsIHByZXZpb3VzIG1pbm9yIFB5dGhvbiB2ZXJzaW9ucy4KICAgICAgICBmb3IgbWlub3IgaW4gcmFuZ2UodmVyc2lvbl9pbmZvWy0xXSwgLTEsIC0xKToKICAgICAgICAgICAgdmVyc2lvbnMuYXBwZW5kKCcnLmpvaW4obWFwKHN0ciwgbWFqb3IgKyAobWlub3IsKSkpKQoKICAgIGltcGwgPSBpbXBsIG9yIGdldF9hYmJyX2ltcGwoKQoKICAgIGFiaXMgPSBbXQoKICAgIGFiaSA9IGFiaSBvciBnZXRfYWJpX3RhZygpCiAgICBpZiBhYmk6CiAgICAgICAgYWJpc1swOjBdID0gW2FiaV0KCiAgICBhYmkzcyA9IHNldCgpCiAgICBpbXBvcnQgaW1wCiAgICBmb3Igc3VmZml4IGluIGltcC5nZXRfc3VmZml4ZXMoKToKICAgICAgICBpZiBzdWZmaXhbMF0uc3RhcnRzd2l0aCgnLmFiaScpOgogICAgICAgICAgICBhYmkzcy5hZGQoc3VmZml4WzBdLnNwbGl0KCcuJywgMilbMV0pCgogICAgYWJpcy5leHRlbmQoc29ydGVkKGxpc3QoYWJpM3MpKSkKCiAgICBhYmlzLmFwcGVuZCgnbm9uZScpCgogICAgaWYgbm90IG5vYXJjaDoKICAgICAgICBhcmNoID0gcGxhdGZvcm0gb3IgZ2V0X3BsYXRmb3JtKCkKICAgICAgICBpZiBhcmNoLnN0YXJ0c3dpdGgoJ21hY29zeCcpOgogICAgICAgICAgICAjIHN1cHBvcnQgbWFjb3N4LTEwLjYtaW50ZWwgb24gbWFjb3N4LTEwLjkteDg2XzY0CiAgICAgICAgICAgIG1hdGNoID0gX29zeF9hcmNoX3BhdC5tYXRjaChhcmNoKQogICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgIG5hbWUsIG1ham9yLCBtaW5vciwgYWN0dWFsX2FyY2ggPSBtYXRjaC5ncm91cHMoKQogICAgICAgICAgICAgICAgdHBsID0gJ3t9X3t9XyVpXyVzJy5mb3JtYXQobmFtZSwgbWFqb3IpCiAgICAgICAgICAgICAgICBhcmNoZXMgPSBbXQogICAgICAgICAgICAgICAgZm9yIG0gaW4gcmV2ZXJzZWQocmFuZ2UoaW50KG1pbm9yKSArIDEpKToKICAgICAgICAgICAgICAgICAgICBmb3IgYSBpbiBnZXRfZGFyd2luX2FyY2hlcyhpbnQobWFqb3IpLCBtLCBhY3R1YWxfYXJjaCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hlcy5hcHBlbmQodHBsICUgKG0sIGEpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBhcmNoIHBhdHRlcm4gZGlkbid0IG1hdGNoICg/ISkKICAgICAgICAgICAgICAgIGFyY2hlcyA9IFthcmNoXQogICAgICAgIGVsaWYgcGxhdGZvcm0gaXMgTm9uZSBhbmQgaXNfbWFueWxpbnV4MV9jb21wYXRpYmxlKCk6CiAgICAgICAgICAgIGFyY2hlcyA9IFthcmNoLnJlcGxhY2UoJ2xpbnV4JywgJ21hbnlsaW51eDEnKSwgYXJjaF0KICAgICAgICBlbHNlOgogICAgICAgICAgICBhcmNoZXMgPSBbYXJjaF0KCiAgICAgICAgIyBDdXJyZW50IHZlcnNpb24sIGN1cnJlbnQgQVBJIChidWlsdCBzcGVjaWZpY2FsbHkgZm9yIG91ciBQeXRob24pOgogICAgICAgIGZvciBhYmkgaW4gYWJpczoKICAgICAgICAgICAgZm9yIGFyY2ggaW4gYXJjaGVzOgogICAgICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJyVzJXMnICUgKGltcGwsIHZlcnNpb25zWzBdKSwgYWJpLCBhcmNoKSkKCiAgICAgICAgIyBhYmkzIG1vZHVsZXMgY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb24gb2YgUHl0aG9uCiAgICAgICAgZm9yIHZlcnNpb24gaW4gdmVyc2lvbnNbMTpdOgogICAgICAgICAgICAjIGFiaTMgd2FzIGludHJvZHVjZWQgaW4gUHl0aG9uIDMuMgogICAgICAgICAgICBpZiB2ZXJzaW9uIGluIHsnMzEnLCAnMzAnfToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGZvciBhYmkgaW4gYWJpM3M6ICAgIyBlbXB0eSBzZXQgaWYgbm90IFB5dGhvbiAzCiAgICAgICAgICAgICAgICBmb3IgYXJjaCBpbiBhcmNoZXM6CiAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoIiVzJXMiICUgKGltcGwsIHZlcnNpb24pLCBhYmksIGFyY2gpKQoKICAgICAgICAjIEhhcyBiaW5hcmllcywgZG9lcyBub3QgdXNlIHRoZSBQeXRob24gQVBJOgogICAgICAgIGZvciBhcmNoIGluIGFyY2hlczoKICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJ3B5JXMnICUgKHZlcnNpb25zWzBdWzBdKSwgJ25vbmUnLCBhcmNoKSkKCiAgICAjIE5vIGFiaSAvIGFyY2gsIGJ1dCByZXF1aXJlcyBvdXIgaW1wbGVtZW50YXRpb246CiAgICBzdXBwb3J0ZWQuYXBwZW5kKCgnJXMlcycgJSAoaW1wbCwgdmVyc2lvbnNbMF0pLCAnbm9uZScsICdhbnknKSkKICAgICMgVGFnZ2VkIHNwZWNpZmljYWxseSBhcyBiZWluZyBjcm9zcy12ZXJzaW9uIGNvbXBhdGlibGUKICAgICMgKHdpdGgganVzdCB0aGUgbWFqb3IgdmVyc2lvbiBzcGVjaWZpZWQpCiAgICBzdXBwb3J0ZWQuYXBwZW5kKCgnJXMlcycgJSAoaW1wbCwgdmVyc2lvbnNbMF1bMF0pLCAnbm9uZScsICdhbnknKSkKCiAgICAjIE5vIGFiaSAvIGFyY2gsIGdlbmVyaWMgUHl0aG9uCiAgICBmb3IgaSwgdmVyc2lvbiBpbiBlbnVtZXJhdGUodmVyc2lvbnMpOgogICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCdweSVzJyAlICh2ZXJzaW9uLCksICdub25lJywgJ2FueScpKQogICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJ3B5JXMnICUgKHZlcnNpb25bMF0pLCAnbm9uZScsICdhbnknKSkKCiAgICByZXR1cm4gc3VwcG9ydGVkCgoKaW1wbGVtZW50YXRpb25fdGFnID0gZ2V0X2ltcGxfdGFnKCkKUEsDBBQAAAAAAAAAIQCyZqdXGAIAABgCAAAwAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9weTI3Y29tcGF0LnB5IiIiCkNvbXBhdGliaWxpdHkgU3VwcG9ydCBmb3IgUHl0aG9uIDIuNyBhbmQgZWFybGllcgoiIiIKCmltcG9ydCBwbGF0Zm9ybQoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CgoKZGVmIGdldF9hbGxfaGVhZGVycyhtZXNzYWdlLCBrZXkpOgogICAgIiIiCiAgICBHaXZlbiBhbiBIVFRQTWVzc2FnZSwgcmV0dXJuIGFsbCBoZWFkZXJzIG1hdGNoaW5nIGEgZ2l2ZW4ga2V5LgogICAgIiIiCiAgICByZXR1cm4gbWVzc2FnZS5nZXRfYWxsKGtleSkKCgppZiBzaXguUFkyOgogICAgZGVmIGdldF9hbGxfaGVhZGVycyhtZXNzYWdlLCBrZXkpOgogICAgICAgIHJldHVybiBtZXNzYWdlLmdldGhlYWRlcnMoa2V5KQoKCmxpbnV4X3B5Ml9hc2NpaSA9ICgKICAgIHBsYXRmb3JtLnN5c3RlbSgpID09ICdMaW51eCcgYW5kCiAgICBzaXguUFkyCikKCnJtdHJlZV9zYWZlID0gc3RyIGlmIGxpbnV4X3B5Ml9hc2NpaSBlbHNlIGxhbWJkYSB4OiB4CiIiIldvcmthcm91bmQgZm9yIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyNDY3MiIiIgpQSwMEFAAAAAAAAAAhANC5SFqoBAAAqAQAADAAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3B5MzFjb21wYXQucHlfX2FsbF9fID0gWydnZXRfY29uZmlnX3ZhcnMnLCAnZ2V0X3BhdGgnXQoKdHJ5OgogICAgIyBQeXRob24gMi43IG9yID49My4yCiAgICBmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X2NvbmZpZ192YXJzLCBnZXRfcGF0aApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGdldF9jb25maWdfdmFycywgZ2V0X3B5dGhvbl9saWIKCiAgICBkZWYgZ2V0X3BhdGgobmFtZSk6CiAgICAgICAgaWYgbmFtZSBub3QgaW4gKCdwbGF0bGliJywgJ3B1cmVsaWInKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTmFtZSBtdXN0IGJlIHB1cmVsaWIgb3IgcGxhdGxpYiIpCiAgICAgICAgcmV0dXJuIGdldF9weXRob25fbGliKG5hbWUgPT0gJ3BsYXRsaWInKQoKCnRyeToKICAgICMgUHl0aG9uID49My4yCiAgICBmcm9tIHRlbXBmaWxlIGltcG9ydCBUZW1wb3JhcnlEaXJlY3RvcnkKZXhjZXB0IEltcG9ydEVycm9yOgogICAgaW1wb3J0IHNodXRpbAogICAgaW1wb3J0IHRlbXBmaWxlCgogICAgY2xhc3MgVGVtcG9yYXJ5RGlyZWN0b3J5KG9iamVjdCk6CiAgICAgICAgIiIiCiAgICAgICAgVmVyeSBzaW1wbGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBjb250ZXh0IG1hbmFnZXIuCiAgICAgICAgV2lsbCB0cnkgdG8gZGVsZXRlIGFmdGVyd2FyZCwgYnV0IHdpbGwgYWxzbyBpZ25vcmUgT1MgYW5kIHNpbWlsYXIKICAgICAgICBlcnJvcnMgb24gZGVsZXRpb24uCiAgICAgICAgIiIiCgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgc2VsZi5uYW1lID0gTm9uZSAgIyBIYW5kbGUgbWtkdGVtcCByYWlzaW5nIGFuIGV4Y2VwdGlvbgogICAgICAgICAgICBzZWxmLm5hbWUgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKCiAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjdHlwZSwgZXhjdmFsdWUsIGV4Y3RyYWNlKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLm5hbWUsIFRydWUpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOiAgIyByZW1vdmFsIGVycm9ycyBhcmUgbm90IHRoZSBvbmx5IHBvc3NpYmxlCiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIHNlbGYubmFtZSA9IE5vbmUKUEsDBBQAAAAAAAAAIQDJYZLA5gMAAOYDAAAwAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9weTMzY29tcGF0LnB5aW1wb3J0IGRpcwppbXBvcnQgYXJyYXkKaW1wb3J0IGNvbGxlY3Rpb25zCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCgpPcEFyZyA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoJ09wQXJnJywgJ29wY29kZSBhcmcnKQoKCmNsYXNzIEJ5dGVjb2RlX2NvbXBhdChvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvZGUpOgogICAgICAgIHNlbGYuY29kZSA9IGNvZGUKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiWWllbGQgJyhvcCxhcmcpJyBwYWlyIGZvciBlYWNoIG9wZXJhdGlvbiBpbiBjb2RlIG9iamVjdCAnY29kZSciIiIKCiAgICAgICAgYnl0ZXMgPSBhcnJheS5hcnJheSgnYicsIHNlbGYuY29kZS5jb19jb2RlKQogICAgICAgIGVvZiA9IGxlbihzZWxmLmNvZGUuY29fY29kZSkKCiAgICAgICAgcHRyID0gMAogICAgICAgIGV4dGVuZGVkX2FyZyA9IDAKCiAgICAgICAgd2hpbGUgcHRyIDwgZW9mOgoKICAgICAgICAgICAgb3AgPSBieXRlc1twdHJdCgogICAgICAgICAgICBpZiBvcCA+PSBkaXMuSEFWRV9BUkdVTUVOVDoKCiAgICAgICAgICAgICAgICBhcmcgPSBieXRlc1twdHIgKyAxXSArIGJ5dGVzW3B0ciArIDJdICogMjU2ICsgZXh0ZW5kZWRfYXJnCiAgICAgICAgICAgICAgICBwdHIgKz0gMwoKICAgICAgICAgICAgICAgIGlmIG9wID09IGRpcy5FWFRFTkRFRF9BUkc6CiAgICAgICAgICAgICAgICAgICAgbG9uZ190eXBlID0gc2l4LmludGVnZXJfdHlwZXNbLTFdCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRfYXJnID0gYXJnICogbG9uZ190eXBlKDY1NTM2KQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXJnID0gTm9uZQogICAgICAgICAgICAgICAgcHRyICs9IDEKCiAgICAgICAgICAgIHlpZWxkIE9wQXJnKG9wLCBhcmcpCgoKQnl0ZWNvZGUgPSBnZXRhdHRyKGRpcywgJ0J5dGVjb2RlJywgQnl0ZWNvZGVfY29tcGF0KQpQSwMEFAAAAAAAAAAhAIUZmgtLCwAASwsAADAAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3B5MzZjb21wYXQucHlpbXBvcnQgc3lzCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgc3RydG9ib29sCmZyb20gZGlzdHV0aWxzLmRlYnVnIGltcG9ydCBERUJVRwoKCmNsYXNzIERpc3RyaWJ1dGlvbl9wYXJzZV9jb25maWdfZmlsZXM6CiAgICAiIiIKICAgIE1peC1pbiBwcm92aWRpbmcgZm9yd2FyZC1jb21wYXRpYmlsaXR5IGZvciBmdW5jdGlvbmFsaXR5IHRvIGJlCiAgICBpbmNsdWRlZCBieSBkZWZhdWx0IG9uIFB5dGhvbiAzLjcuCgogICAgRG8gbm90IGVkaXQgdGhlIGNvZGUgaW4gdGhpcyBjbGFzcyBleGNlcHQgdG8gdXBkYXRlIGZ1bmN0aW9uYWxpdHkKICAgIGFzIGltcGxlbWVudGVkIGluIGRpc3R1dGlscy4KICAgICIiIgogICAgZGVmIHBhcnNlX2NvbmZpZ19maWxlcyhzZWxmLCBmaWxlbmFtZXM9Tm9uZSk6CiAgICAgICAgZnJvbSBjb25maWdwYXJzZXIgaW1wb3J0IENvbmZpZ1BhcnNlcgoKICAgICAgICAjIElnbm9yZSBpbnN0YWxsIGRpcmVjdG9yeSBvcHRpb25zIGlmIHdlIGhhdmUgYSB2ZW52CiAgICAgICAgaWYgc3lzLnByZWZpeCAhPSBzeXMuYmFzZV9wcmVmaXg6CiAgICAgICAgICAgIGlnbm9yZV9vcHRpb25zID0gWwogICAgICAgICAgICAgICAgJ2luc3RhbGwtYmFzZScsICdpbnN0YWxsLXBsYXRiYXNlJywgJ2luc3RhbGwtbGliJywKICAgICAgICAgICAgICAgICdpbnN0YWxsLXBsYXRsaWInLCAnaW5zdGFsbC1wdXJlbGliJywgJ2luc3RhbGwtaGVhZGVycycsCiAgICAgICAgICAgICAgICAnaW5zdGFsbC1zY3JpcHRzJywgJ2luc3RhbGwtZGF0YScsICdwcmVmaXgnLCAnZXhlYy1wcmVmaXgnLAogICAgICAgICAgICAgICAgJ2hvbWUnLCAndXNlcicsICdyb290J10KICAgICAgICBlbHNlOgogICAgICAgICAgICBpZ25vcmVfb3B0aW9ucyA9IFtdCgogICAgICAgIGlnbm9yZV9vcHRpb25zID0gZnJvemVuc2V0KGlnbm9yZV9vcHRpb25zKQoKICAgICAgICBpZiBmaWxlbmFtZXMgaXMgTm9uZToKICAgICAgICAgICAgZmlsZW5hbWVzID0gc2VsZi5maW5kX2NvbmZpZ19maWxlcygpCgogICAgICAgIGlmIERFQlVHOgogICAgICAgICAgICBzZWxmLmFubm91bmNlKCJEaXN0cmlidXRpb24ucGFyc2VfY29uZmlnX2ZpbGVzKCk6IikKCiAgICAgICAgcGFyc2VyID0gQ29uZmlnUGFyc2VyKGludGVycG9sYXRpb249Tm9uZSkKICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICBpZiBERUJVRzoKICAgICAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoIiAgcmVhZGluZyAlcyIgJSBmaWxlbmFtZSkKICAgICAgICAgICAgcGFyc2VyLnJlYWQoZmlsZW5hbWUpCiAgICAgICAgICAgIGZvciBzZWN0aW9uIGluIHBhcnNlci5zZWN0aW9ucygpOgogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHBhcnNlci5vcHRpb25zKHNlY3Rpb24pCiAgICAgICAgICAgICAgICBvcHRfZGljdCA9IHNlbGYuZ2V0X29wdGlvbl9kaWN0KHNlY3Rpb24pCgogICAgICAgICAgICAgICAgZm9yIG9wdCBpbiBvcHRpb25zOgogICAgICAgICAgICAgICAgICAgIGlmIG9wdCAhPSAnX19uYW1lX18nIGFuZCBvcHQgbm90IGluIGlnbm9yZV9vcHRpb25zOgogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBwYXJzZXIuZ2V0KHNlY3Rpb24sb3B0KQogICAgICAgICAgICAgICAgICAgICAgICBvcHQgPSBvcHQucmVwbGFjZSgnLScsICdfJykKICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2RpY3Rbb3B0XSA9IChmaWxlbmFtZSwgdmFsKQoKICAgICAgICAgICAgIyBNYWtlIHRoZSBDb25maWdQYXJzZXIgZm9yZ2V0IGV2ZXJ5dGhpbmcgKHNvIHdlIHJldGFpbgogICAgICAgICAgICAjIHRoZSBvcmlnaW5hbCBmaWxlbmFtZXMgdGhhdCBvcHRpb25zIGNvbWUgZnJvbSkKICAgICAgICAgICAgcGFyc2VyLl9faW5pdF9fKCkKCiAgICAgICAgIyBJZiB0aGVyZSB3YXMgYSAiZ2xvYmFsIiBzZWN0aW9uIGluIHRoZSBjb25maWcgZmlsZSwgdXNlIGl0CiAgICAgICAgIyB0byBzZXQgRGlzdHJpYnV0aW9uIG9wdGlvbnMuCgogICAgICAgIGlmICdnbG9iYWwnIGluIHNlbGYuY29tbWFuZF9vcHRpb25zOgogICAgICAgICAgICBmb3IgKG9wdCwgKHNyYywgdmFsKSkgaW4gc2VsZi5jb21tYW5kX29wdGlvbnNbJ2dsb2JhbCddLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBhbGlhcyA9IHNlbGYubmVnYXRpdmVfb3B0LmdldChvcHQpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgaWYgYWxpYXM6CiAgICAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYWxpYXMsIG5vdCBzdHJ0b2Jvb2wodmFsKSkKICAgICAgICAgICAgICAgICAgICBlbGlmIG9wdCBpbiAoJ3ZlcmJvc2UnLCAnZHJ5X3J1bicpOiAjIHVnaCEKICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBvcHQsIHN0cnRvYm9vbCh2YWwpKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgb3B0LCB2YWwpCiAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBtc2c6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IobXNnKQoKCmlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMywpOgogICAgIyBQeXRob24gMiBiZWhhdmlvciBpcyBzdWZmaWNpZW50CiAgICBjbGFzcyBEaXN0cmlidXRpb25fcGFyc2VfY29uZmlnX2ZpbGVzOgogICAgICAgIHBhc3MKCgppZiBGYWxzZToKICAgICMgV2hlbiB1cGRhdGVkIGJlaGF2aW9yIGlzIGF2YWlsYWJsZSB1cHN0cmVhbSwKICAgICMgZGlzYWJsZSBvdmVycmlkZSBoZXJlLgogICAgY2xhc3MgRGlzdHJpYnV0aW9uX3BhcnNlX2NvbmZpZ19maWxlczoKICAgICAgICBwYXNzClBLAwQUAAAAAAAAACEAjFOaY8Q3AADENwAALQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvc2FuZGJveC5weWltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCByZQppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgcGlja2xlCmltcG9ydCB0ZXh0d3JhcAoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBidWlsdGlucywgbWFwCgppbXBvcnQgcGtnX3Jlc291cmNlcy5weTMxY29tcGF0CgppZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgaW1wb3J0IG9yZy5weXRob24ubW9kdWxlcy5wb3NpeC5Qb3NpeE1vZHVsZSBhcyBfb3MKZWxzZToKICAgIF9vcyA9IHN5cy5tb2R1bGVzW29zLm5hbWVdCnRyeToKICAgIF9maWxlID0gZmlsZQpleGNlcHQgTmFtZUVycm9yOgogICAgX2ZpbGUgPSBOb25lCl9vcGVuID0gb3Blbgpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgd29ya2luZ19zZXQKCgpfX2FsbF9fID0gWwogICAgIkFic3RyYWN0U2FuZGJveCIsICJEaXJlY3RvcnlTYW5kYm94IiwgIlNhbmRib3hWaW9sYXRpb24iLCAicnVuX3NldHVwIiwKXQoKCmRlZiBfZXhlY2ZpbGUoZmlsZW5hbWUsIGdsb2JhbHMsIGxvY2Fscz1Ob25lKToKICAgICIiIgogICAgUHl0aG9uIDMgaW1wbGVtZW50YXRpb24gb2YgZXhlY2ZpbGUuCiAgICAiIiIKICAgIG1vZGUgPSAncmInCiAgICB3aXRoIG9wZW4oZmlsZW5hbWUsIG1vZGUpIGFzIHN0cmVhbToKICAgICAgICBzY3JpcHQgPSBzdHJlYW0ucmVhZCgpCiAgICBpZiBsb2NhbHMgaXMgTm9uZToKICAgICAgICBsb2NhbHMgPSBnbG9iYWxzCiAgICBjb2RlID0gY29tcGlsZShzY3JpcHQsIGZpbGVuYW1lLCAnZXhlYycpCiAgICBleGVjKGNvZGUsIGdsb2JhbHMsIGxvY2FscykKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2F2ZV9hcmd2KHJlcGw9Tm9uZSk6CiAgICBzYXZlZCA9IHN5cy5hcmd2WzpdCiAgICBpZiByZXBsIGlzIG5vdCBOb25lOgogICAgICAgIHN5cy5hcmd2WzpdID0gcmVwbAogICAgdHJ5OgogICAgICAgIHlpZWxkIHNhdmVkCiAgICBmaW5hbGx5OgogICAgICAgIHN5cy5hcmd2WzpdID0gc2F2ZWQKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2F2ZV9wYXRoKCk6CiAgICBzYXZlZCA9IHN5cy5wYXRoWzpdCiAgICB0cnk6CiAgICAgICAgeWllbGQgc2F2ZWQKICAgIGZpbmFsbHk6CiAgICAgICAgc3lzLnBhdGhbOl0gPSBzYXZlZAoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBvdmVycmlkZV90ZW1wKHJlcGxhY2VtZW50KToKICAgICIiIgogICAgTW9ua2V5LXBhdGNoIHRlbXBmaWxlLnRlbXBkaXIgd2l0aCByZXBsYWNlbWVudCwgZW5zdXJpbmcgaXQgZXhpc3RzCiAgICAiIiIKICAgIHBrZ19yZXNvdXJjZXMucHkzMWNvbXBhdC5tYWtlZGlycyhyZXBsYWNlbWVudCwgZXhpc3Rfb2s9VHJ1ZSkKCiAgICBzYXZlZCA9IHRlbXBmaWxlLnRlbXBkaXIKCiAgICB0ZW1wZmlsZS50ZW1wZGlyID0gcmVwbGFjZW1lbnQKCiAgICB0cnk6CiAgICAgICAgeWllbGQKICAgIGZpbmFsbHk6CiAgICAgICAgdGVtcGZpbGUudGVtcGRpciA9IHNhdmVkCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHB1c2hkKHRhcmdldCk6CiAgICBzYXZlZCA9IG9zLmdldGN3ZCgpCiAgICBvcy5jaGRpcih0YXJnZXQpCiAgICB0cnk6CiAgICAgICAgeWllbGQgc2F2ZWQKICAgIGZpbmFsbHk6CiAgICAgICAgb3MuY2hkaXIoc2F2ZWQpCgoKY2xhc3MgVW5waWNrbGVhYmxlRXhjZXB0aW9uKEV4Y2VwdGlvbik6CiAgICAiIiIKICAgIEFuIGV4Y2VwdGlvbiByZXByZXNlbnRpbmcgYW5vdGhlciBFeGNlcHRpb24gdGhhdCBjb3VsZCBub3QgYmUgcGlja2xlZC4KICAgICIiIgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBkdW1wKHR5cGUsIGV4Yyk6CiAgICAgICAgIiIiCiAgICAgICAgQWx3YXlzIHJldHVybiBhIGR1bXBlZCAocGlja2xlZCkgdHlwZSBhbmQgZXhjLiBJZiBleGMgY2FuJ3QgYmUgcGlja2xlZCwKICAgICAgICB3cmFwIGl0IGluIFVucGlja2xlYWJsZUV4Y2VwdGlvbiBmaXJzdC4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBwaWNrbGUuZHVtcHModHlwZSksIHBpY2tsZS5kdW1wcyhleGMpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgIyBnZXQgVW5waWNrbGVhYmxlRXhjZXB0aW9uIGluc2lkZSB0aGUgc2FuZGJveAogICAgICAgICAgICBmcm9tIHNldHVwdG9vbHMuc2FuZGJveCBpbXBvcnQgVW5waWNrbGVhYmxlRXhjZXB0aW9uIGFzIGNscwogICAgICAgICAgICByZXR1cm4gY2xzLmR1bXAoY2xzLCBjbHMocmVwcihleGMpKSkKCgpjbGFzcyBFeGNlcHRpb25TYXZlcjoKICAgICIiIgogICAgQSBDb250ZXh0IE1hbmFnZXIgdGhhdCB3aWxsIHNhdmUgYW4gZXhjZXB0aW9uLCBzZXJpYWxpemVkLCBhbmQgcmVzdG9yZSBpdAogICAgbGF0ZXIuCiAgICAiIiIKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsIHR5cGUsIGV4YywgdGIpOgogICAgICAgIGlmIG5vdCBleGM6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIGR1bXAgdGhlIGV4Y2VwdGlvbgogICAgICAgIHNlbGYuX3NhdmVkID0gVW5waWNrbGVhYmxlRXhjZXB0aW9uLmR1bXAodHlwZSwgZXhjKQogICAgICAgIHNlbGYuX3RiID0gdGIKCiAgICAgICAgIyBzdXBwcmVzcyB0aGUgZXhjZXB0aW9uCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmVzdW1lKHNlbGYpOgogICAgICAgICJyZXN0b3JlIGFuZCByZS1yYWlzZSBhbnkgZXhjZXB0aW9uIgoKICAgICAgICBpZiAnX3NhdmVkJyBub3QgaW4gdmFycyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHR5cGUsIGV4YyA9IG1hcChwaWNrbGUubG9hZHMsIHNlbGYuX3NhdmVkKQogICAgICAgIHNpeC5yZXJhaXNlKHR5cGUsIGV4Yywgc2VsZi5fdGIpCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHNhdmVfbW9kdWxlcygpOgogICAgIiIiCiAgICBDb250ZXh0IGluIHdoaWNoIGltcG9ydGVkIG1vZHVsZXMgYXJlIHNhdmVkLgoKICAgIFRyYW5zbGF0ZXMgZXhjZXB0aW9ucyBpbnRlcm5hbCB0byB0aGUgY29udGV4dCBpbnRvIHRoZSBlcXVpdmFsZW50IGV4Y2VwdGlvbgogICAgb3V0c2lkZSB0aGUgY29udGV4dC4KICAgICIiIgogICAgc2F2ZWQgPSBzeXMubW9kdWxlcy5jb3B5KCkKICAgIHdpdGggRXhjZXB0aW9uU2F2ZXIoKSBhcyBzYXZlZF9leGM6CiAgICAgICAgeWllbGQgc2F2ZWQKCiAgICBzeXMubW9kdWxlcy51cGRhdGUoc2F2ZWQpCiAgICAjIHJlbW92ZSBhbnkgbW9kdWxlcyBpbXBvcnRlZCBzaW5jZQogICAgZGVsX21vZHVsZXMgPSAoCiAgICAgICAgbW9kX25hbWUgZm9yIG1vZF9uYW1lIGluIHN5cy5tb2R1bGVzCiAgICAgICAgaWYgbW9kX25hbWUgbm90IGluIHNhdmVkCiAgICAgICAgIyBleGNsdWRlIGFueSBlbmNvZGluZ3MgbW9kdWxlcy4gU2VlICMyODUKICAgICAgICBhbmQgbm90IG1vZF9uYW1lLnN0YXJ0c3dpdGgoJ2VuY29kaW5ncy4nKQogICAgKQogICAgX2NsZWFyX21vZHVsZXMoZGVsX21vZHVsZXMpCgogICAgc2F2ZWRfZXhjLnJlc3VtZSgpCgoKZGVmIF9jbGVhcl9tb2R1bGVzKG1vZHVsZV9uYW1lcyk6CiAgICBmb3IgbW9kX25hbWUgaW4gbGlzdChtb2R1bGVfbmFtZXMpOgogICAgICAgIGRlbCBzeXMubW9kdWxlc1ttb2RfbmFtZV0KCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2F2ZV9wa2dfcmVzb3VyY2VzX3N0YXRlKCk6CiAgICBzYXZlZCA9IHBrZ19yZXNvdXJjZXMuX19nZXRzdGF0ZV9fKCkKICAgIHRyeToKICAgICAgICB5aWVsZCBzYXZlZAogICAgZmluYWxseToKICAgICAgICBwa2dfcmVzb3VyY2VzLl9fc2V0c3RhdGVfXyhzYXZlZCkKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2V0dXBfY29udGV4dChzZXR1cF9kaXIpOgogICAgdGVtcF9kaXIgPSBvcy5wYXRoLmpvaW4oc2V0dXBfZGlyLCAndGVtcCcpCiAgICB3aXRoIHNhdmVfcGtnX3Jlc291cmNlc19zdGF0ZSgpOgogICAgICAgIHdpdGggc2F2ZV9tb2R1bGVzKCk6CiAgICAgICAgICAgIGhpZGVfc2V0dXB0b29scygpCiAgICAgICAgICAgIHdpdGggc2F2ZV9wYXRoKCk6CiAgICAgICAgICAgICAgICB3aXRoIHNhdmVfYXJndigpOgogICAgICAgICAgICAgICAgICAgIHdpdGggb3ZlcnJpZGVfdGVtcCh0ZW1wX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggcHVzaGQoc2V0dXBfZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZW5zdXJlIHNldHVwdG9vbHMgY29tbWFuZHMgYXJlIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pbXBvcnRfXygnc2V0dXB0b29scycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZAoKCmRlZiBfbmVlZHNfaGlkaW5nKG1vZF9uYW1lKToKICAgICIiIgogICAgPj4+IF9uZWVkc19oaWRpbmcoJ3NldHVwdG9vbHMnKQogICAgVHJ1ZQogICAgPj4+IF9uZWVkc19oaWRpbmcoJ3BrZ19yZXNvdXJjZXMnKQogICAgVHJ1ZQogICAgPj4+IF9uZWVkc19oaWRpbmcoJ3NldHVwdG9vbHNfcGx1Z2luJykKICAgIEZhbHNlCiAgICA+Pj4gX25lZWRzX2hpZGluZygnc2V0dXB0b29scy5fX2luaXRfXycpCiAgICBUcnVlCiAgICA+Pj4gX25lZWRzX2hpZGluZygnZGlzdHV0aWxzJykKICAgIFRydWUKICAgID4+PiBfbmVlZHNfaGlkaW5nKCdvcycpCiAgICBGYWxzZQogICAgPj4+IF9uZWVkc19oaWRpbmcoJ0N5dGhvbicpCiAgICBUcnVlCiAgICAiIiIKICAgIHBhdHRlcm4gPSByZS5jb21waWxlKHInKHNldHVwdG9vbHN8cGtnX3Jlc291cmNlc3xkaXN0dXRpbHN8Q3l0aG9uKShcLnwkKScpCiAgICByZXR1cm4gYm9vbChwYXR0ZXJuLm1hdGNoKG1vZF9uYW1lKSkKCgpkZWYgaGlkZV9zZXR1cHRvb2xzKCk6CiAgICAiIiIKICAgIFJlbW92ZSByZWZlcmVuY2VzIHRvIHNldHVwdG9vbHMnIG1vZHVsZXMgZnJvbSBzeXMubW9kdWxlcyB0byBhbGxvdyB0aGUKICAgIGludm9jYXRpb24gdG8gaW1wb3J0IHRoZSBtb3N0IGFwcHJvcHJpYXRlIHNldHVwdG9vbHMuIFRoaXMgdGVjaG5pcXVlIGlzCiAgICBuZWNlc3NhcnkgdG8gYXZvaWQgaXNzdWVzIHN1Y2ggYXMgIzMxNSB3aGVyZSBzZXR1cHRvb2xzIHVwZ3JhZGluZyBpdHNlbGYKICAgIHdvdWxkIGZhaWwgdG8gZmluZCBhIGZ1bmN0aW9uIGRlY2xhcmVkIGluIHRoZSBtZXRhZGF0YS4KICAgICIiIgogICAgbW9kdWxlcyA9IGZpbHRlcihfbmVlZHNfaGlkaW5nLCBzeXMubW9kdWxlcykKICAgIF9jbGVhcl9tb2R1bGVzKG1vZHVsZXMpCgoKZGVmIHJ1bl9zZXR1cChzZXR1cF9zY3JpcHQsIGFyZ3MpOgogICAgIiIiUnVuIGEgZGlzdHV0aWxzIHNldHVwIHNjcmlwdCwgc2FuZGJveGVkIGluIGl0cyBkaXJlY3RvcnkiIiIKICAgIHNldHVwX2RpciA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoc2V0dXBfc2NyaXB0KSkKICAgIHdpdGggc2V0dXBfY29udGV4dChzZXR1cF9kaXIpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc3lzLmFyZ3ZbOl0gPSBbc2V0dXBfc2NyaXB0XSArIGxpc3QoYXJncykKICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHNldHVwX2RpcikKICAgICAgICAgICAgIyByZXNldCB0byBpbmNsdWRlIHNldHVwIGRpciwgdy9jbGVhbiBjYWxsYmFjayBsaXN0CiAgICAgICAgICAgIHdvcmtpbmdfc2V0Ll9faW5pdF9fKCkKICAgICAgICAgICAgd29ya2luZ19zZXQuY2FsbGJhY2tzLmFwcGVuZChsYW1iZGEgZGlzdDogZGlzdC5hY3RpdmF0ZSgpKQoKICAgICAgICAgICAgIyBfX2ZpbGVfXyBzaG91bGQgYmUgYSBieXRlIHN0cmluZyBvbiBQeXRob24gMiAoIzcxMikKICAgICAgICAgICAgZHVuZGVyX2ZpbGUgPSAoCiAgICAgICAgICAgICAgICBzZXR1cF9zY3JpcHQKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2V0dXBfc2NyaXB0LCBzdHIpIGVsc2UKICAgICAgICAgICAgICAgIHNldHVwX3NjcmlwdC5lbmNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQogICAgICAgICAgICApCgogICAgICAgICAgICB3aXRoIERpcmVjdG9yeVNhbmRib3goc2V0dXBfZGlyKToKICAgICAgICAgICAgICAgIG5zID0gZGljdChfX2ZpbGVfXz1kdW5kZXJfZmlsZSwgX19uYW1lX189J19fbWFpbl9fJykKICAgICAgICAgICAgICAgIF9leGVjZmlsZShzZXR1cF9zY3JpcHQsIG5zKQogICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0IGFzIHY6CiAgICAgICAgICAgIGlmIHYuYXJncyBhbmQgdi5hcmdzWzBdOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgIyBOb3JtYWwgZXhpdCwganVzdCByZXR1cm4KCgpjbGFzcyBBYnN0cmFjdFNhbmRib3g6CiAgICAiIiJXcmFwICdvcycgbW9kdWxlIGFuZCAnb3BlbigpJyBidWlsdGluIGZvciB2aXJ0dWFsaXppbmcgc2V0dXAgc2NyaXB0cyIiIgoKICAgIF9hY3RpdmUgPSBGYWxzZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9hdHRycyA9IFsKICAgICAgICAgICAgbmFtZSBmb3IgbmFtZSBpbiBkaXIoX29zKQogICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJykgYW5kIGhhc2F0dHIoc2VsZiwgbmFtZSkKICAgICAgICBdCgogICAgZGVmIF9jb3B5KHNlbGYsIHNvdXJjZSk6CiAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5fYXR0cnM6CiAgICAgICAgICAgIHNldGF0dHIob3MsIG5hbWUsIGdldGF0dHIoc291cmNlLCBuYW1lKSkKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHNlbGYuX2NvcHkoc2VsZikKICAgICAgICBpZiBfZmlsZToKICAgICAgICAgICAgYnVpbHRpbnMuZmlsZSA9IHNlbGYuX2ZpbGUKICAgICAgICBidWlsdGlucy5vcGVuID0gc2VsZi5fb3BlbgogICAgICAgIHNlbGYuX2FjdGl2ZSA9IFRydWUKCiAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKToKICAgICAgICBzZWxmLl9hY3RpdmUgPSBGYWxzZQogICAgICAgIGlmIF9maWxlOgogICAgICAgICAgICBidWlsdGlucy5maWxlID0gX2ZpbGUKICAgICAgICBidWlsdGlucy5vcGVuID0gX29wZW4KICAgICAgICBzZWxmLl9jb3B5KF9vcykKCiAgICBkZWYgcnVuKHNlbGYsIGZ1bmMpOgogICAgICAgICIiIlJ1biAnZnVuYycgdW5kZXIgb3Mgc2FuZGJveGluZyIiIgogICAgICAgIHdpdGggc2VsZjoKICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKQoKICAgIGRlZiBfbWtfZHVhbF9wYXRoX3dyYXBwZXIobmFtZSk6CiAgICAgICAgb3JpZ2luYWwgPSBnZXRhdHRyKF9vcywgbmFtZSkKCiAgICAgICAgZGVmIHdyYXAoc2VsZiwgc3JjLCBkc3QsICphcmdzLCAqKmt3KToKICAgICAgICAgICAgaWYgc2VsZi5fYWN0aXZlOgogICAgICAgICAgICAgICAgc3JjLCBkc3QgPSBzZWxmLl9yZW1hcF9wYWlyKG5hbWUsIHNyYywgZHN0LCAqYXJncywgKiprdykKICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsKHNyYywgZHN0LCAqYXJncywgKiprdykKCiAgICAgICAgcmV0dXJuIHdyYXAKCiAgICBmb3IgbmFtZSBpbiBbInJlbmFtZSIsICJsaW5rIiwgInN5bWxpbmsiXToKICAgICAgICBpZiBoYXNhdHRyKF9vcywgbmFtZSk6CiAgICAgICAgICAgIGxvY2FscygpW25hbWVdID0gX21rX2R1YWxfcGF0aF93cmFwcGVyKG5hbWUpCgogICAgZGVmIF9ta19zaW5nbGVfcGF0aF93cmFwcGVyKG5hbWUsIG9yaWdpbmFsPU5vbmUpOgogICAgICAgIG9yaWdpbmFsID0gb3JpZ2luYWwgb3IgZ2V0YXR0cihfb3MsIG5hbWUpCgogICAgICAgIGRlZiB3cmFwKHNlbGYsIHBhdGgsICphcmdzLCAqKmt3KToKICAgICAgICAgICAgaWYgc2VsZi5fYWN0aXZlOgogICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYuX3JlbWFwX2lucHV0KG5hbWUsIHBhdGgsICphcmdzLCAqKmt3KQogICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwocGF0aCwgKmFyZ3MsICoqa3cpCgogICAgICAgIHJldHVybiB3cmFwCgogICAgaWYgX2ZpbGU6CiAgICAgICAgX2ZpbGUgPSBfbWtfc2luZ2xlX3BhdGhfd3JhcHBlcignZmlsZScsIF9maWxlKQogICAgX29wZW4gPSBfbWtfc2luZ2xlX3BhdGhfd3JhcHBlcignb3BlbicsIF9vcGVuKQogICAgZm9yIG5hbWUgaW4gWwogICAgICAgICJzdGF0IiwgImxpc3RkaXIiLCAiY2hkaXIiLCAib3BlbiIsICJjaG1vZCIsICJjaG93biIsICJta2RpciIsCiAgICAgICAgInJlbW92ZSIsICJ1bmxpbmsiLCAicm1kaXIiLCAidXRpbWUiLCAibGNob3duIiwgImNocm9vdCIsICJsc3RhdCIsCiAgICAgICAgInN0YXJ0ZmlsZSIsICJta2ZpZm8iLCAibWtub2QiLCAicGF0aGNvbmYiLCAiYWNjZXNzIgogICAgXToKICAgICAgICBpZiBoYXNhdHRyKF9vcywgbmFtZSk6CiAgICAgICAgICAgIGxvY2FscygpW25hbWVdID0gX21rX3NpbmdsZV9wYXRoX3dyYXBwZXIobmFtZSkKCiAgICBkZWYgX21rX3NpbmdsZV93aXRoX3JldHVybihuYW1lKToKICAgICAgICBvcmlnaW5hbCA9IGdldGF0dHIoX29zLCBuYW1lKQoKICAgICAgICBkZWYgd3JhcChzZWxmLCBwYXRoLCAqYXJncywgKiprdyk6CiAgICAgICAgICAgIGlmIHNlbGYuX2FjdGl2ZToKICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLl9yZW1hcF9pbnB1dChuYW1lLCBwYXRoLCAqYXJncywgKiprdykKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZW1hcF9vdXRwdXQobmFtZSwgb3JpZ2luYWwocGF0aCwgKmFyZ3MsICoqa3cpKQogICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwocGF0aCwgKmFyZ3MsICoqa3cpCgogICAgICAgIHJldHVybiB3cmFwCgogICAgZm9yIG5hbWUgaW4gWydyZWFkbGluaycsICd0ZW1wbmFtJ106CiAgICAgICAgaWYgaGFzYXR0cihfb3MsIG5hbWUpOgogICAgICAgICAgICBsb2NhbHMoKVtuYW1lXSA9IF9ta19zaW5nbGVfd2l0aF9yZXR1cm4obmFtZSkKCiAgICBkZWYgX21rX3F1ZXJ5KG5hbWUpOgogICAgICAgIG9yaWdpbmFsID0gZ2V0YXR0cihfb3MsIG5hbWUpCgogICAgICAgIGRlZiB3cmFwKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICAgICAgcmV0dmFsID0gb3JpZ2luYWwoKmFyZ3MsICoqa3cpCiAgICAgICAgICAgIGlmIHNlbGYuX2FjdGl2ZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZW1hcF9vdXRwdXQobmFtZSwgcmV0dmFsKQogICAgICAgICAgICByZXR1cm4gcmV0dmFsCgogICAgICAgIHJldHVybiB3cmFwCgogICAgZm9yIG5hbWUgaW4gWydnZXRjd2QnLCAndG1wbmFtJ106CiAgICAgICAgaWYgaGFzYXR0cihfb3MsIG5hbWUpOgogICAgICAgICAgICBsb2NhbHMoKVtuYW1lXSA9IF9ta19xdWVyeShuYW1lKQoKICAgIGRlZiBfdmFsaWRhdGVfcGF0aChzZWxmLCBwYXRoKToKICAgICAgICAiIiJDYWxsZWQgdG8gcmVtYXAgb3IgdmFsaWRhdGUgYW55IHBhdGgsIHdoZXRoZXIgaW5wdXQgb3Igb3V0cHV0IiIiCiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBkZWYgX3JlbWFwX2lucHV0KHNlbGYsIG9wZXJhdGlvbiwgcGF0aCwgKmFyZ3MsICoqa3cpOgogICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBpbnB1dHMiIiIKICAgICAgICByZXR1cm4gc2VsZi5fdmFsaWRhdGVfcGF0aChwYXRoKQoKICAgIGRlZiBfcmVtYXBfb3V0cHV0KHNlbGYsIG9wZXJhdGlvbiwgcGF0aCk6CiAgICAgICAgIiIiQ2FsbGVkIGZvciBwYXRoIG91dHB1dHMiIiIKICAgICAgICByZXR1cm4gc2VsZi5fdmFsaWRhdGVfcGF0aChwYXRoKQoKICAgIGRlZiBfcmVtYXBfcGFpcihzZWxmLCBvcGVyYXRpb24sIHNyYywgZHN0LCAqYXJncywgKiprdyk6CiAgICAgICAgIiIiQ2FsbGVkIGZvciBwYXRoIHBhaXJzIGxpa2UgcmVuYW1lLCBsaW5rLCBhbmQgc3ltbGluayBvcGVyYXRpb25zIiIiCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgc2VsZi5fcmVtYXBfaW5wdXQob3BlcmF0aW9uICsgJy1mcm9tJywgc3JjLCAqYXJncywgKiprdyksCiAgICAgICAgICAgIHNlbGYuX3JlbWFwX2lucHV0KG9wZXJhdGlvbiArICctdG8nLCBkc3QsICphcmdzLCAqKmt3KQogICAgICAgICkKCgppZiBoYXNhdHRyKG9zLCAnZGV2bnVsbCcpOgogICAgX0VYQ0VQVElPTlMgPSBbb3MuZGV2bnVsbCxdCmVsc2U6CiAgICBfRVhDRVBUSU9OUyA9IFtdCgoKY2xhc3MgRGlyZWN0b3J5U2FuZGJveChBYnN0cmFjdFNhbmRib3gpOgogICAgIiIiUmVzdHJpY3Qgb3BlcmF0aW9ucyB0byBhIHNpbmdsZSBzdWJkaXJlY3RvcnkgLSBwc2V1ZG8tY2hyb290IiIiCgogICAgd3JpdGVfb3BzID0gZGljdC5mcm9ta2V5cyhbCiAgICAgICAgIm9wZW4iLCAiY2htb2QiLCAiY2hvd24iLCAibWtkaXIiLCAicmVtb3ZlIiwgInVubGluayIsICJybWRpciIsCiAgICAgICAgInV0aW1lIiwgImxjaG93biIsICJjaHJvb3QiLCAibWtmaWZvIiwgIm1rbm9kIiwgInRlbXBuYW0iLAogICAgXSkKCiAgICBfZXhjZXB0aW9uX3BhdHRlcm5zID0gWwogICAgICAgICMgQWxsb3cgbGliMnRvMyB0byBhdHRlbXB0IHRvIHNhdmUgYSBwaWNrbGVkIGdyYW1tYXIgb2JqZWN0ICgjMTIxKQogICAgICAgIHInLipsaWIydG8zLipcLnBpY2tsZSQnLAogICAgXQogICAgImV4ZW1wdCB3cml0aW5nIHRvIHBhdGhzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4iCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNhbmRib3gsIGV4Y2VwdGlvbnM9X0VYQ0VQVElPTlMpOgogICAgICAgIHNlbGYuX3NhbmRib3ggPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgoc2FuZGJveCkpCiAgICAgICAgc2VsZi5fcHJlZml4ID0gb3MucGF0aC5qb2luKHNlbGYuX3NhbmRib3gsICcnKQogICAgICAgIHNlbGYuX2V4Y2VwdGlvbnMgPSBbCiAgICAgICAgICAgIG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5yZWFscGF0aChwYXRoKSkKICAgICAgICAgICAgZm9yIHBhdGggaW4gZXhjZXB0aW9ucwogICAgICAgIF0KICAgICAgICBBYnN0cmFjdFNhbmRib3guX19pbml0X18oc2VsZikKCiAgICBkZWYgX3Zpb2xhdGlvbihzZWxmLCBvcGVyYXRpb24sICphcmdzLCAqKmt3KToKICAgICAgICBmcm9tIHNldHVwdG9vbHMuc2FuZGJveCBpbXBvcnQgU2FuZGJveFZpb2xhdGlvbgogICAgICAgIHJhaXNlIFNhbmRib3hWaW9sYXRpb24ob3BlcmF0aW9uLCBhcmdzLCBrdykKCiAgICBpZiBfZmlsZToKCiAgICAgICAgZGVmIF9maWxlKHNlbGYsIHBhdGgsIG1vZGU9J3InLCAqYXJncywgKiprdyk6CiAgICAgICAgICAgIGlmIG1vZGUgbm90IGluICgncicsICdydCcsICdyYicsICdyVScsICdVJykgYW5kIG5vdCBzZWxmLl9vayhwYXRoKToKICAgICAgICAgICAgICAgIHNlbGYuX3Zpb2xhdGlvbigiZmlsZSIsIHBhdGgsIG1vZGUsICphcmdzLCAqKmt3KQogICAgICAgICAgICByZXR1cm4gX2ZpbGUocGF0aCwgbW9kZSwgKmFyZ3MsICoqa3cpCgogICAgZGVmIF9vcGVuKHNlbGYsIHBhdGgsIG1vZGU9J3InLCAqYXJncywgKiprdyk6CiAgICAgICAgaWYgbW9kZSBub3QgaW4gKCdyJywgJ3J0JywgJ3JiJywgJ3JVJywgJ1UnKSBhbmQgbm90IHNlbGYuX29rKHBhdGgpOgogICAgICAgICAgICBzZWxmLl92aW9sYXRpb24oIm9wZW4iLCBwYXRoLCBtb2RlLCAqYXJncywgKiprdykKICAgICAgICByZXR1cm4gX29wZW4ocGF0aCwgbW9kZSwgKmFyZ3MsICoqa3cpCgogICAgZGVmIHRtcG5hbShzZWxmKToKICAgICAgICBzZWxmLl92aW9sYXRpb24oInRtcG5hbSIpCgogICAgZGVmIF9vayhzZWxmLCBwYXRoKToKICAgICAgICBhY3RpdmUgPSBzZWxmLl9hY3RpdmUKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX2FjdGl2ZSA9IEZhbHNlCiAgICAgICAgICAgIHJlYWxwYXRoID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKHBhdGgpKQogICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgICAgc2VsZi5fZXhlbXB0ZWQocmVhbHBhdGgpCiAgICAgICAgICAgICAgICBvciByZWFscGF0aCA9PSBzZWxmLl9zYW5kYm94CiAgICAgICAgICAgICAgICBvciByZWFscGF0aC5zdGFydHN3aXRoKHNlbGYuX3ByZWZpeCkKICAgICAgICAgICAgKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNlbGYuX2FjdGl2ZSA9IGFjdGl2ZQoKICAgIGRlZiBfZXhlbXB0ZWQoc2VsZiwgZmlsZXBhdGgpOgogICAgICAgIHN0YXJ0X21hdGNoZXMgPSAoCiAgICAgICAgICAgIGZpbGVwYXRoLnN0YXJ0c3dpdGgoZXhjZXB0aW9uKQogICAgICAgICAgICBmb3IgZXhjZXB0aW9uIGluIHNlbGYuX2V4Y2VwdGlvbnMKICAgICAgICApCiAgICAgICAgcGF0dGVybl9tYXRjaGVzID0gKAogICAgICAgICAgICByZS5tYXRjaChwYXR0ZXJuLCBmaWxlcGF0aCkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gc2VsZi5fZXhjZXB0aW9uX3BhdHRlcm5zCiAgICAgICAgKQogICAgICAgIGNhbmRpZGF0ZXMgPSBpdGVydG9vbHMuY2hhaW4oc3RhcnRfbWF0Y2hlcywgcGF0dGVybl9tYXRjaGVzKQogICAgICAgIHJldHVybiBhbnkoY2FuZGlkYXRlcykKCiAgICBkZWYgX3JlbWFwX2lucHV0KHNlbGYsIG9wZXJhdGlvbiwgcGF0aCwgKmFyZ3MsICoqa3cpOgogICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBpbnB1dHMiIiIKICAgICAgICBpZiBvcGVyYXRpb24gaW4gc2VsZi53cml0ZV9vcHMgYW5kIG5vdCBzZWxmLl9vayhwYXRoKToKICAgICAgICAgICAgc2VsZi5fdmlvbGF0aW9uKG9wZXJhdGlvbiwgb3MucGF0aC5yZWFscGF0aChwYXRoKSwgKmFyZ3MsICoqa3cpCiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBkZWYgX3JlbWFwX3BhaXIoc2VsZiwgb3BlcmF0aW9uLCBzcmMsIGRzdCwgKmFyZ3MsICoqa3cpOgogICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBwYWlycyBsaWtlIHJlbmFtZSwgbGluaywgYW5kIHN5bWxpbmsgb3BlcmF0aW9ucyIiIgogICAgICAgIGlmIG5vdCBzZWxmLl9vayhzcmMpIG9yIG5vdCBzZWxmLl9vayhkc3QpOgogICAgICAgICAgICBzZWxmLl92aW9sYXRpb24ob3BlcmF0aW9uLCBzcmMsIGRzdCwgKmFyZ3MsICoqa3cpCiAgICAgICAgcmV0dXJuIChzcmMsIGRzdCkKCiAgICBkZWYgb3BlbihzZWxmLCBmaWxlLCBmbGFncywgbW9kZT0wbzc3NywgKmFyZ3MsICoqa3cpOgogICAgICAgICIiIkNhbGxlZCBmb3IgbG93LWxldmVsIG9zLm9wZW4oKSIiIgogICAgICAgIGlmIGZsYWdzICYgV1JJVEVfRkxBR1MgYW5kIG5vdCBzZWxmLl9vayhmaWxlKToKICAgICAgICAgICAgc2VsZi5fdmlvbGF0aW9uKCJvcy5vcGVuIiwgZmlsZSwgZmxhZ3MsIG1vZGUsICphcmdzLCAqKmt3KQogICAgICAgIHJldHVybiBfb3Mub3BlbihmaWxlLCBmbGFncywgbW9kZSwgKmFyZ3MsICoqa3cpCgoKV1JJVEVfRkxBR1MgPSBmdW5jdG9vbHMucmVkdWNlKAogICAgb3BlcmF0b3Iub3JfLCBbZ2V0YXR0cihfb3MsIGEsIDApIGZvciBhIGluCiAgICAgICAgIk9fV1JPTkxZIE9fUkRXUiBPX0FQUEVORCBPX0NSRUFUIE9fVFJVTkMgT19URU1QT1JBUlkiLnNwbGl0KCldCikKCgpjbGFzcyBTYW5kYm94VmlvbGF0aW9uKERpc3R1dGlsc0Vycm9yKToKICAgICIiIkEgc2V0dXAgc2NyaXB0IGF0dGVtcHRlZCB0byBtb2RpZnkgdGhlIGZpbGVzeXN0ZW0gb3V0c2lkZSB0aGUgc2FuZGJveCIiIgoKICAgIHRtcGwgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgU2FuZGJveFZpb2xhdGlvbjoge2NtZH17YXJncyFyfSB7a3dhcmdzfQoKICAgICAgICBUaGUgcGFja2FnZSBzZXR1cCBzY3JpcHQgaGFzIGF0dGVtcHRlZCB0byBtb2RpZnkgZmlsZXMgb24geW91ciBzeXN0ZW0KICAgICAgICB0aGF0IGFyZSBub3Qgd2l0aGluIHRoZSBFYXN5SW5zdGFsbCBidWlsZCBhcmVhLCBhbmQgaGFzIGJlZW4gYWJvcnRlZC4KCiAgICAgICAgVGhpcyBwYWNrYWdlIGNhbm5vdCBiZSBzYWZlbHkgaW5zdGFsbGVkIGJ5IEVhc3lJbnN0YWxsLCBhbmQgbWF5IG5vdAogICAgICAgIHN1cHBvcnQgYWx0ZXJuYXRlIGluc3RhbGxhdGlvbiBsb2NhdGlvbnMgZXZlbiBpZiB5b3UgcnVuIGl0cyBzZXR1cAogICAgICAgIHNjcmlwdCBieSBoYW5kLiAgUGxlYXNlIGluZm9ybSB0aGUgcGFja2FnZSdzIGF1dGhvciBhbmQgdGhlIEVhc3lJbnN0YWxsCiAgICAgICAgbWFpbnRhaW5lcnMgdG8gZmluZCBvdXQgaWYgYSBmaXggb3Igd29ya2Fyb3VuZCBpcyBhdmFpbGFibGUuCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIGNtZCwgYXJncywga3dhcmdzID0gc2VsZi5hcmdzCiAgICAgICAgcmV0dXJuIHNlbGYudG1wbC5mb3JtYXQoKipsb2NhbHMoKSkKUEsDBBQAAAAAAAAAIQCoM7S+igAAAIoAAAAuAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9zY3JpcHQudG1wbCMgRUFTWS1JTlNUQUxMLVNDUklQVDogJShzcGVjKXIsJShzY3JpcHRfbmFtZSlyCl9fcmVxdWlyZXNfXyA9ICUoc3BlYylyCl9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMnKS5ydW5fc2NyaXB0KCUoc3BlYylyLCAlKHNjcmlwdF9uYW1lKXIpClBLAwQUAAAAAAAAACEAAsGU4wMJAAADCQAAMAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvc2l0ZS1wYXRjaC5weWRlZiBfX2Jvb3QoKToKICAgIGltcG9ydCBzeXMKICAgIGltcG9ydCBvcwogICAgUFlUSE9OUEFUSCA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJykKICAgIGlmIFBZVEhPTlBBVEggaXMgTm9uZSBvciAoc3lzLnBsYXRmb3JtID09ICd3aW4zMicgYW5kIG5vdCBQWVRIT05QQVRIKToKICAgICAgICBQWVRIT05QQVRIID0gW10KICAgIGVsc2U6CiAgICAgICAgUFlUSE9OUEFUSCA9IFBZVEhPTlBBVEguc3BsaXQob3MucGF0aHNlcCkKCiAgICBwaWMgPSBnZXRhdHRyKHN5cywgJ3BhdGhfaW1wb3J0ZXJfY2FjaGUnLCB7fSkKICAgIHN0ZHBhdGggPSBzeXMucGF0aFtsZW4oUFlUSE9OUEFUSCk6XQogICAgbXlkaXIgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCgogICAgZm9yIGl0ZW0gaW4gc3RkcGF0aDoKICAgICAgICBpZiBpdGVtID09IG15ZGlyIG9yIG5vdCBpdGVtOgogICAgICAgICAgICBjb250aW51ZSAgIyBza2lwIGlmIGN1cnJlbnQgZGlyLiBvbiBXaW5kb3dzLCBvciBteSBvd24gZGlyZWN0b3J5CiAgICAgICAgaW1wb3J0ZXIgPSBwaWMuZ2V0KGl0ZW0pCiAgICAgICAgaWYgaW1wb3J0ZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGxvYWRlciA9IGltcG9ydGVyLmZpbmRfbW9kdWxlKCdzaXRlJykKICAgICAgICAgICAgaWYgbG9hZGVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBhY3R1YWxseSByZWxvYWQgdGhlIGN1cnJlbnQgbW9kdWxlCiAgICAgICAgICAgICAgICBsb2FkZXIubG9hZF9tb2R1bGUoJ3NpdGUnKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpbXBvcnQgaW1wICAjIEF2b2lkIGltcG9ydCBsb29wIGluIFB5dGhvbiA+PSAzLjMKICAgICAgICAgICAgICAgIHN0cmVhbSwgcGF0aCwgZGVzY3IgPSBpbXAuZmluZF9tb2R1bGUoJ3NpdGUnLCBbaXRlbV0pCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIHN0cmVhbSBpcyBOb25lOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBhY3R1YWxseSByZWxvYWQgdGhlIGN1cnJlbnQgbW9kdWxlCiAgICAgICAgICAgICAgICBpbXAubG9hZF9tb2R1bGUoJ3NpdGUnLCBzdHJlYW0sIHBhdGgsIGRlc2NyKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCkKICAgICAgICAgICAgYnJlYWsKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkNvdWxkbid0IGZpbmQgdGhlIHJlYWwgJ3NpdGUnIG1vZHVsZSIpCgogICAga25vd25fcGF0aHMgPSBkaWN0KFsobWFrZXBhdGgoaXRlbSlbMV0sIDEpIGZvciBpdGVtIGluIHN5cy5wYXRoXSkgICMgMi4yIGNvbXAKCiAgICBvbGRwb3MgPSBnZXRhdHRyKHN5cywgJ19fZWdnaW5zZXJ0JywgMCkgICMgc2F2ZSBvbGQgaW5zZXJ0aW9uIHBvc2l0aW9uCiAgICBzeXMuX19lZ2dpbnNlcnQgPSAwICAjIGFuZCByZXNldCB0aGUgY3VycmVudCBvbmUKCiAgICBmb3IgaXRlbSBpbiBQWVRIT05QQVRIOgogICAgICAgIGFkZHNpdGVkaXIoaXRlbSkKCiAgICBzeXMuX19lZ2dpbnNlcnQgKz0gb2xkcG9zICAjIHJlc3RvcmUgZWZmZWN0aXZlIG9sZCBwb3NpdGlvbgoKICAgIGQsIG5kID0gbWFrZXBhdGgoc3RkcGF0aFswXSkKICAgIGluc2VydF9hdCA9IE5vbmUKICAgIG5ld19wYXRoID0gW10KCiAgICBmb3IgaXRlbSBpbiBzeXMucGF0aDoKICAgICAgICBwLCBucCA9IG1ha2VwYXRoKGl0ZW0pCgogICAgICAgIGlmIG5wID09IG5kIGFuZCBpbnNlcnRfYXQgaXMgTm9uZToKICAgICAgICAgICAgIyBXZSd2ZSBoaXQgdGhlIGZpcnN0ICdzeXN0ZW0nIHBhdGggZW50cnksIHNvIGFkZGVkIGVudHJpZXMgZ28gaGVyZQogICAgICAgICAgICBpbnNlcnRfYXQgPSBsZW4obmV3X3BhdGgpCgogICAgICAgIGlmIG5wIGluIGtub3duX3BhdGhzIG9yIGluc2VydF9hdCBpcyBOb25lOgogICAgICAgICAgICBuZXdfcGF0aC5hcHBlbmQoaXRlbSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIG5ldyBwYXRoIGFmdGVyIHRoZSBpbnNlcnQgcG9pbnQsIGJhY2staW5zZXJ0IGl0CiAgICAgICAgICAgIG5ld19wYXRoLmluc2VydChpbnNlcnRfYXQsIGl0ZW0pCiAgICAgICAgICAgIGluc2VydF9hdCArPSAxCgogICAgc3lzLnBhdGhbOl0gPSBuZXdfcGF0aAoKCmlmIF9fbmFtZV9fID09ICdzaXRlJzoKICAgIF9fYm9vdCgpCiAgICBkZWwgX19ib290ClBLAwQUAAAAAAAAACEAiJtbTiwhAAAsIQAAMQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvc3NsX3N1cHBvcnQucHlpbXBvcnQgb3MKaW1wb3J0IHNvY2tldAppbXBvcnQgYXRleGl0CmltcG9ydCByZQppbXBvcnQgZnVuY3Rvb2xzCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgdXJsbGliLCBodHRwX2NsaWVudCwgbWFwLCBmaWx0ZXIKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgUmVzb2x1dGlvbkVycm9yLCBFeHRyYWN0aW9uRXJyb3IKCnRyeToKICAgIGltcG9ydCBzc2wKZXhjZXB0IEltcG9ydEVycm9yOgogICAgc3NsID0gTm9uZQoKX19hbGxfXyA9IFsKICAgICdWZXJpZnlpbmdIVFRQU0hhbmRsZXInLCAnZmluZF9jYV9idW5kbGUnLCAnaXNfYXZhaWxhYmxlJywgJ2NlcnRfcGF0aHMnLAogICAgJ29wZW5lcl9mb3InCl0KCmNlcnRfcGF0aHMgPSAiIiIKL2V0Yy9wa2kvdGxzL2NlcnRzL2NhLWJ1bmRsZS5jcnQKL2V0Yy9zc2wvY2VydHMvY2EtY2VydGlmaWNhdGVzLmNydAovdXNyL3NoYXJlL3NzbC9jZXJ0cy9jYS1idW5kbGUuY3J0Ci91c3IvbG9jYWwvc2hhcmUvY2VydHMvY2Etcm9vdC5jcnQKL2V0Yy9zc2wvY2VydC5wZW0KL1N5c3RlbS9MaWJyYXJ5L09wZW5TU0wvY2VydHMvY2VydC5wZW0KL3Vzci9sb2NhbC9zaGFyZS9jZXJ0cy9jYS1yb290LW5zcy5jcnQKL2V0Yy9zc2wvY2EtYnVuZGxlLnBlbQoiIiIuc3RyaXAoKS5zcGxpdCgpCgp0cnk6CiAgICBIVFRQU0hhbmRsZXIgPSB1cmxsaWIucmVxdWVzdC5IVFRQU0hhbmRsZXIKICAgIEhUVFBTQ29ubmVjdGlvbiA9IGh0dHBfY2xpZW50LkhUVFBTQ29ubmVjdGlvbgpleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICBIVFRQU0hhbmRsZXIgPSBIVFRQU0Nvbm5lY3Rpb24gPSBvYmplY3QKCmlzX2F2YWlsYWJsZSA9IHNzbCBpcyBub3QgTm9uZSBhbmQgb2JqZWN0IG5vdCBpbiAoSFRUUFNIYW5kbGVyLCBIVFRQU0Nvbm5lY3Rpb24pCgoKdHJ5OgogICAgZnJvbSBzc2wgaW1wb3J0IENlcnRpZmljYXRlRXJyb3IsIG1hdGNoX2hvc3RuYW1lCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHRyeToKICAgICAgICBmcm9tIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaW1wb3J0IENlcnRpZmljYXRlRXJyb3IKICAgICAgICBmcm9tIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaW1wb3J0IG1hdGNoX2hvc3RuYW1lCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgQ2VydGlmaWNhdGVFcnJvciA9IE5vbmUKICAgICAgICBtYXRjaF9ob3N0bmFtZSA9IE5vbmUKCmlmIG5vdCBDZXJ0aWZpY2F0ZUVycm9yOgoKICAgIGNsYXNzIENlcnRpZmljYXRlRXJyb3IoVmFsdWVFcnJvcik6CiAgICAgICAgcGFzcwoKCmlmIG5vdCBtYXRjaF9ob3N0bmFtZToKCiAgICBkZWYgX2Ruc25hbWVfbWF0Y2goZG4sIGhvc3RuYW1lLCBtYXhfd2lsZGNhcmRzPTEpOgogICAgICAgICIiIk1hdGNoaW5nIGFjY29yZGluZyB0byBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMwoKICAgICAgICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MTI1I3NlY3Rpb24tNi40LjMKICAgICAgICAiIiIKICAgICAgICBwYXRzID0gW10KICAgICAgICBpZiBub3QgZG46CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIFBvcnRlZCBmcm9tIHB5dGhvbjMtc3ludGF4OgogICAgICAgICMgbGVmdG1vc3QsICpyZW1haW5kZXIgPSBkbi5zcGxpdChyJy4nKQogICAgICAgIHBhcnRzID0gZG4uc3BsaXQocicuJykKICAgICAgICBsZWZ0bW9zdCA9IHBhcnRzWzBdCiAgICAgICAgcmVtYWluZGVyID0gcGFydHNbMTpdCgogICAgICAgIHdpbGRjYXJkcyA9IGxlZnRtb3N0LmNvdW50KCcqJykKICAgICAgICBpZiB3aWxkY2FyZHMgPiBtYXhfd2lsZGNhcmRzOgogICAgICAgICAgICAjIElzc3VlICMxNzk4MDogYXZvaWQgZGVuaWFscyBvZiBzZXJ2aWNlIGJ5IHJlZnVzaW5nIG1vcmUKICAgICAgICAgICAgIyB0aGFuIG9uZSB3aWxkY2FyZCBwZXIgZnJhZ21lbnQuICBBIHN1cnZleSBvZiBlc3RhYmxpc2hlZAogICAgICAgICAgICAjIHBvbGljeSBhbW9uZyBTU0wgaW1wbGVtZW50YXRpb25zIHNob3dlZCBpdCB0byBiZSBhCiAgICAgICAgICAgICMgcmVhc29uYWJsZSBjaG9pY2UuCiAgICAgICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoCiAgICAgICAgICAgICAgICAidG9vIG1hbnkgd2lsZGNhcmRzIGluIGNlcnRpZmljYXRlIEROUyBuYW1lOiAiICsgcmVwcihkbikpCgogICAgICAgICMgc3BlZWQgdXAgY29tbW9uIGNhc2Ugdy9vIHdpbGRjYXJkcwogICAgICAgIGlmIG5vdCB3aWxkY2FyZHM6CiAgICAgICAgICAgIHJldHVybiBkbi5sb3dlcigpID09IGhvc3RuYW1lLmxvd2VyKCkKCiAgICAgICAgIyBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMywgc3ViaXRlbSAxLgogICAgICAgICMgVGhlIGNsaWVudCBTSE9VTEQgTk9UIGF0dGVtcHQgdG8gbWF0Y2ggYSBwcmVzZW50ZWQgaWRlbnRpZmllciBpbiB3aGljaAogICAgICAgICMgdGhlIHdpbGRjYXJkIGNoYXJhY3RlciBjb21wcmlzZXMgYSBsYWJlbCBvdGhlciB0aGFuIHRoZSBsZWZ0LW1vc3QgbGFiZWwuCiAgICAgICAgaWYgbGVmdG1vc3QgPT0gJyonOgogICAgICAgICAgICAjIFdoZW4gJyonIGlzIGEgZnJhZ21lbnQgYnkgaXRzZWxmLCBpdCBtYXRjaGVzIGEgbm9uLWVtcHR5IGRvdGxlc3MKICAgICAgICAgICAgIyBmcmFnbWVudC4KICAgICAgICAgICAgcGF0cy5hcHBlbmQoJ1teLl0rJykKICAgICAgICBlbGlmIGxlZnRtb3N0LnN0YXJ0c3dpdGgoJ3huLS0nKSBvciBob3N0bmFtZS5zdGFydHN3aXRoKCd4bi0tJyk6CiAgICAgICAgICAgICMgUkZDIDYxMjUsIHNlY3Rpb24gNi40LjMsIHN1Yml0ZW0gMy4KICAgICAgICAgICAgIyBUaGUgY2xpZW50IFNIT1VMRCBOT1QgYXR0ZW1wdCB0byBtYXRjaCBhIHByZXNlbnRlZCBpZGVudGlmaWVyCiAgICAgICAgICAgICMgd2hlcmUgdGhlIHdpbGRjYXJkIGNoYXJhY3RlciBpcyBlbWJlZGRlZCB3aXRoaW4gYW4gQS1sYWJlbCBvcgogICAgICAgICAgICAjIFUtbGFiZWwgb2YgYW4gaW50ZXJuYXRpb25hbGl6ZWQgZG9tYWluIG5hbWUuCiAgICAgICAgICAgIHBhdHMuYXBwZW5kKHJlLmVzY2FwZShsZWZ0bW9zdCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBPdGhlcndpc2UsICcqJyBtYXRjaGVzIGFueSBkb3RsZXNzIHN0cmluZywgZS5nLiB3d3cqCiAgICAgICAgICAgIHBhdHMuYXBwZW5kKHJlLmVzY2FwZShsZWZ0bW9zdCkucmVwbGFjZShyJ1wqJywgJ1teLl0qJykpCgogICAgICAgICMgYWRkIHRoZSByZW1haW5pbmcgZnJhZ21lbnRzLCBpZ25vcmUgYW55IHdpbGRjYXJkcwogICAgICAgIGZvciBmcmFnIGluIHJlbWFpbmRlcjoKICAgICAgICAgICAgcGF0cy5hcHBlbmQocmUuZXNjYXBlKGZyYWcpKQoKICAgICAgICBwYXQgPSByZS5jb21waWxlKHInXEEnICsgcidcLicuam9pbihwYXRzKSArIHInXFonLCByZS5JR05PUkVDQVNFKQogICAgICAgIHJldHVybiBwYXQubWF0Y2goaG9zdG5hbWUpCgogICAgZGVmIG1hdGNoX2hvc3RuYW1lKGNlcnQsIGhvc3RuYW1lKToKICAgICAgICAiIiJWZXJpZnkgdGhhdCAqY2VydCogKGluIGRlY29kZWQgZm9ybWF0IGFzIHJldHVybmVkIGJ5CiAgICAgICAgU1NMU29ja2V0LmdldHBlZXJjZXJ0KCkpIG1hdGNoZXMgdGhlICpob3N0bmFtZSouICBSRkMgMjgxOCBhbmQgUkZDIDYxMjUKICAgICAgICBydWxlcyBhcmUgZm9sbG93ZWQsIGJ1dCBJUCBhZGRyZXNzZXMgYXJlIG5vdCBhY2NlcHRlZCBmb3IgKmhvc3RuYW1lKi4KCiAgICAgICAgQ2VydGlmaWNhdGVFcnJvciBpcyByYWlzZWQgb24gZmFpbHVyZS4gT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uCiAgICAgICAgcmV0dXJucyBub3RoaW5nLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBjZXJ0OgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJlbXB0eSBvciBubyBjZXJ0aWZpY2F0ZSIpCiAgICAgICAgZG5zbmFtZXMgPSBbXQogICAgICAgIHNhbiA9IGNlcnQuZ2V0KCdzdWJqZWN0QWx0TmFtZScsICgpKQogICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNhbjoKICAgICAgICAgICAgaWYga2V5ID09ICdETlMnOgogICAgICAgICAgICAgICAgaWYgX2Ruc25hbWVfbWF0Y2godmFsdWUsIGhvc3RuYW1lKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIGRuc25hbWVzLmFwcGVuZCh2YWx1ZSkKICAgICAgICBpZiBub3QgZG5zbmFtZXM6CiAgICAgICAgICAgICMgVGhlIHN1YmplY3QgaXMgb25seSBjaGVja2VkIHdoZW4gdGhlcmUgaXMgbm8gZE5TTmFtZSBlbnRyeQogICAgICAgICAgICAjIGluIHN1YmplY3RBbHROYW1lCiAgICAgICAgICAgIGZvciBzdWIgaW4gY2VydC5nZXQoJ3N1YmplY3QnLCAoKSk6CiAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzdWI6CiAgICAgICAgICAgICAgICAgICAgIyBYWFggYWNjb3JkaW5nIHRvIFJGQyAyODE4LCB0aGUgbW9zdCBzcGVjaWZpYyBDb21tb24gTmFtZQogICAgICAgICAgICAgICAgICAgICMgbXVzdCBiZSB1c2VkLgogICAgICAgICAgICAgICAgICAgIGlmIGtleSA9PSAnY29tbW9uTmFtZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIF9kbnNuYW1lX21hdGNoKHZhbHVlLCBob3N0bmFtZSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgICAgICAgICAgZG5zbmFtZXMuYXBwZW5kKHZhbHVlKQogICAgICAgIGlmIGxlbihkbnNuYW1lcykgPiAxOgogICAgICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKCJob3N0bmFtZSAlciAiCiAgICAgICAgICAgICAgICAiZG9lc24ndCBtYXRjaCBlaXRoZXIgb2YgJXMiCiAgICAgICAgICAgICAgICAlIChob3N0bmFtZSwgJywgJy5qb2luKG1hcChyZXByLCBkbnNuYW1lcykpKSkKICAgICAgICBlbGlmIGxlbihkbnNuYW1lcykgPT0gMToKICAgICAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigiaG9zdG5hbWUgJXIgIgogICAgICAgICAgICAgICAgImRvZXNuJ3QgbWF0Y2ggJXIiCiAgICAgICAgICAgICAgICAlIChob3N0bmFtZSwgZG5zbmFtZXNbMF0pKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoIm5vIGFwcHJvcHJpYXRlIGNvbW1vbk5hbWUgb3IgIgogICAgICAgICAgICAgICAgInN1YmplY3RBbHROYW1lIGZpZWxkcyB3ZXJlIGZvdW5kIikKCgpjbGFzcyBWZXJpZnlpbmdIVFRQU0hhbmRsZXIoSFRUUFNIYW5kbGVyKToKICAgICIiIlNpbXBsZSB2ZXJpZnlpbmcgaGFuZGxlcjogbm8gYXV0aCwgc3ViY2xhc3NlcywgdGltZW91dHMsIGV0Yy4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgY2FfYnVuZGxlKToKICAgICAgICBzZWxmLmNhX2J1bmRsZSA9IGNhX2J1bmRsZQogICAgICAgIEhUVFBTSGFuZGxlci5fX2luaXRfXyhzZWxmKQoKICAgIGRlZiBodHRwc19vcGVuKHNlbGYsIHJlcSk6CiAgICAgICAgcmV0dXJuIHNlbGYuZG9fb3BlbigKICAgICAgICAgICAgbGFtYmRhIGhvc3QsICoqa3c6IFZlcmlmeWluZ0hUVFBTQ29ubihob3N0LCBzZWxmLmNhX2J1bmRsZSwgKiprdyksIHJlcQogICAgICAgICkKCgpjbGFzcyBWZXJpZnlpbmdIVFRQU0Nvbm4oSFRUUFNDb25uZWN0aW9uKToKICAgICIiIlNpbXBsZSB2ZXJpZnlpbmcgY29ubmVjdGlvbjogbm8gYXV0aCwgc3ViY2xhc3NlcywgdGltZW91dHMsIGV0Yy4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgY2FfYnVuZGxlLCAqKmt3KToKICAgICAgICBIVFRQU0Nvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgaG9zdCwgKiprdykKICAgICAgICBzZWxmLmNhX2J1bmRsZSA9IGNhX2J1bmRsZQoKICAgIGRlZiBjb25uZWN0KHNlbGYpOgogICAgICAgIHNvY2sgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oCiAgICAgICAgICAgIChzZWxmLmhvc3QsIHNlbGYucG9ydCksIGdldGF0dHIoc2VsZiwgJ3NvdXJjZV9hZGRyZXNzJywgTm9uZSkKICAgICAgICApCgogICAgICAgICMgSGFuZGxlIHRoZSBzb2NrZXQgaWYgYSAocHJveHkpIHR1bm5lbCBpcyBwcmVzZW50CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnX3R1bm5lbCcpIGFuZCBnZXRhdHRyKHNlbGYsICdfdHVubmVsX2hvc3QnLCBOb25lKToKICAgICAgICAgICAgc2VsZi5zb2NrID0gc29jawogICAgICAgICAgICBzZWxmLl90dW5uZWwoKQogICAgICAgICAgICAjIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU3Nzc2OiBQeXRob24+PTMuNC4xIGFuZCA+PTIuNy43CiAgICAgICAgICAgICMgY2hhbmdlIHNlbGYuaG9zdCB0byBtZWFuIHRoZSBwcm94eSBzZXJ2ZXIgaG9zdCB3aGVuIHR1bm5lbGluZyBpcwogICAgICAgICAgICAjIGJlaW5nIHVzZWQuIEFkYXB0LCBzaW5jZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgZGVzdGluYXRpb24KICAgICAgICAgICAgIyBob3N0IGZvciB0aGUgbWF0Y2hfaG9zdG5hbWUoKSBjb21wYXJpc29uLgogICAgICAgICAgICBhY3R1YWxfaG9zdCA9IHNlbGYuX3R1bm5lbF9ob3N0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgYWN0dWFsX2hvc3QgPSBzZWxmLmhvc3QKCiAgICAgICAgaWYgaGFzYXR0cihzc2wsICdjcmVhdGVfZGVmYXVsdF9jb250ZXh0Jyk6CiAgICAgICAgICAgIGN0eCA9IHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0KGNhZmlsZT1zZWxmLmNhX2J1bmRsZSkKICAgICAgICAgICAgc2VsZi5zb2NrID0gY3R4LndyYXBfc29ja2V0KHNvY2ssIHNlcnZlcl9ob3N0bmFtZT1hY3R1YWxfaG9zdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFRoaXMgaXMgZm9yIHB5dGhvbiA8IDIuNy45IGFuZCA8IDMuND8KICAgICAgICAgICAgc2VsZi5zb2NrID0gc3NsLndyYXBfc29ja2V0KAogICAgICAgICAgICAgICAgc29jaywgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBjYV9jZXJ0cz1zZWxmLmNhX2J1bmRsZQogICAgICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBtYXRjaF9ob3N0bmFtZShzZWxmLnNvY2suZ2V0cGVlcmNlcnQoKSwgYWN0dWFsX2hvc3QpCiAgICAgICAgZXhjZXB0IENlcnRpZmljYXRlRXJyb3I6CiAgICAgICAgICAgIHNlbGYuc29jay5zaHV0ZG93bihzb2NrZXQuU0hVVF9SRFdSKQogICAgICAgICAgICBzZWxmLnNvY2suY2xvc2UoKQogICAgICAgICAgICByYWlzZQoKCmRlZiBvcGVuZXJfZm9yKGNhX2J1bmRsZT1Ob25lKToKICAgICIiIkdldCBhIHVybG9wZW4oKSByZXBsYWNlbWVudCB0aGF0IHVzZXMgY2FfYnVuZGxlIGZvciB2ZXJpZmljYXRpb24iIiIKICAgIHJldHVybiB1cmxsaWIucmVxdWVzdC5idWlsZF9vcGVuZXIoCiAgICAgICAgVmVyaWZ5aW5nSFRUUFNIYW5kbGVyKGNhX2J1bmRsZSBvciBmaW5kX2NhX2J1bmRsZSgpKQogICAgKS5vcGVuCgoKIyBmcm9tIGphcmFjby5mdW5jdG9vbHMKZGVmIG9uY2UoZnVuYyk6CiAgICBAZnVuY3Rvb2xzLndyYXBzKGZ1bmMpCiAgICBkZWYgd3JhcHBlcigqYXJncywgKiprd2FyZ3MpOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKGZ1bmMsICdhbHdheXNfcmV0dXJucycpOgogICAgICAgICAgICBmdW5jLmFsd2F5c19yZXR1cm5zID0gZnVuYygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcmV0dXJuIGZ1bmMuYWx3YXlzX3JldHVybnMKICAgIHJldHVybiB3cmFwcGVyCgoKQG9uY2UKZGVmIGdldF93aW5fY2VydGZpbGUoKToKICAgIHRyeToKICAgICAgICBpbXBvcnQgd2luY2VydHN0b3JlCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBjbGFzcyBDZXJ0RmlsZSh3aW5jZXJ0c3RvcmUuQ2VydEZpbGUpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgc3VwZXIoQ2VydEZpbGUsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICAgICAgYXRleGl0LnJlZ2lzdGVyKHNlbGYuY2xvc2UpCgogICAgICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc3VwZXIoQ2VydEZpbGUsIHNlbGYpLmNsb3NlKCkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgX3dpbmNlcnRzID0gQ2VydEZpbGUoKQogICAgX3dpbmNlcnRzLmFkZHN0b3JlKCdDQScpCiAgICBfd2luY2VydHMuYWRkc3RvcmUoJ1JPT1QnKQogICAgcmV0dXJuIF93aW5jZXJ0cy5uYW1lCgoKZGVmIGZpbmRfY2FfYnVuZGxlKCk6CiAgICAiIiJSZXR1cm4gYW4gZXhpc3RpbmcgQ0EgYnVuZGxlIHBhdGgsIG9yIE5vbmUiIiIKICAgIGV4dGFudF9jZXJ0X3BhdGhzID0gZmlsdGVyKG9zLnBhdGguaXNmaWxlLCBjZXJ0X3BhdGhzKQogICAgcmV0dXJuICgKICAgICAgICBnZXRfd2luX2NlcnRmaWxlKCkKICAgICAgICBvciBuZXh0KGV4dGFudF9jZXJ0X3BhdGhzLCBOb25lKQogICAgICAgIG9yIF9jZXJ0aWZpX3doZXJlKCkKICAgICkKCgpkZWYgX2NlcnRpZmlfd2hlcmUoKToKICAgIHRyeToKICAgICAgICByZXR1cm4gX19pbXBvcnRfXygnY2VydGlmaScpLndoZXJlKCkKICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIFJlc29sdXRpb25FcnJvciwgRXh0cmFjdGlvbkVycm9yKToKICAgICAgICBwYXNzClBLAwQUAAAAAAAAACEAmkLXmuQDAADkAwAAMwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvdW5pY29kZV91dGlscy5weWltcG9ydCB1bmljb2RlZGF0YQppbXBvcnQgc3lzCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCgojIEhGUyBQbHVzIHVzZXMgZGVjb21wb3NlZCBVVEYtOApkZWYgZGVjb21wb3NlKHBhdGgpOgogICAgaWYgaXNpbnN0YW5jZShwYXRoLCBzaXgudGV4dF90eXBlKToKICAgICAgICByZXR1cm4gdW5pY29kZWRhdGEubm9ybWFsaXplKCdORkQnLCBwYXRoKQogICAgdHJ5OgogICAgICAgIHBhdGggPSBwYXRoLmRlY29kZSgndXRmLTgnKQogICAgICAgIHBhdGggPSB1bmljb2RlZGF0YS5ub3JtYWxpemUoJ05GRCcsIHBhdGgpCiAgICAgICAgcGF0aCA9IHBhdGguZW5jb2RlKCd1dGYtOCcpCiAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgIHBhc3MgICMgTm90IFVURi04CiAgICByZXR1cm4gcGF0aAoKCmRlZiBmaWxlc3lzX2RlY29kZShwYXRoKToKICAgICIiIgogICAgRW5zdXJlIHRoYXQgdGhlIGdpdmVuIHBhdGggaXMgZGVjb2RlZCwKICAgIE5PTkUgd2hlbiBubyBleHBlY3RlZCBlbmNvZGluZyB3b3JrcwogICAgIiIiCgogICAgaWYgaXNpbnN0YW5jZShwYXRoLCBzaXgudGV4dF90eXBlKToKICAgICAgICByZXR1cm4gcGF0aAoKICAgIGZzX2VuYyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSBvciAndXRmLTgnCiAgICBjYW5kaWRhdGVzID0gZnNfZW5jLCAndXRmLTgnCgogICAgZm9yIGVuYyBpbiBjYW5kaWRhdGVzOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHBhdGguZGVjb2RlKGVuYykKICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICBjb250aW51ZQoKCmRlZiB0cnlfZW5jb2RlKHN0cmluZywgZW5jKToKICAgICJ0dXJuIHVuaWNvZGUgZW5jb2RpbmcgaW50byBhIGZ1bmN0aW9uYWwgcm91dGluZSIKICAgIHRyeToKICAgICAgICByZXR1cm4gc3RyaW5nLmVuY29kZShlbmMpCiAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgIHJldHVybiBOb25lClBLAwQUAAAAAAAAACEASLFMYpAAAACQAAAALQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvdmVyc2lvbi5weWltcG9ydCBwa2dfcmVzb3VyY2VzCgp0cnk6CiAgICBfX3ZlcnNpb25fXyA9IHBrZ19yZXNvdXJjZXMuZ2V0X2Rpc3RyaWJ1dGlvbignc2V0dXB0b29scycpLnZlcnNpb24KZXhjZXB0IEV4Y2VwdGlvbjoKICAgIF9fdmVyc2lvbl9fID0gJ3Vua25vd24nClBLAwQUAAAAAAAAACEAcB0I80EcAABBHAAAKwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvd2hlZWwucHknJydXaGVlbHMgc3VwcG9ydC4nJycKCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdldF9wbGF0Zm9ybQppbXBvcnQgZW1haWwKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCB6aXBmaWxlCgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IERpc3RyaWJ1dGlvbiwgUGF0aE1ldGFkYXRhLCBwYXJzZV92ZXJzaW9uCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4uc2l4IGltcG9ydCBQWTMKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBEaXN0cmlidXRpb24gYXMgU2V0dXB0b29sc0Rpc3RyaWJ1dGlvbgpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHBlcDQyNXRhZ3MKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm8gaW1wb3J0IHdyaXRlX3JlcXVpcmVtZW50cwoKCldIRUVMX05BTUUgPSByZS5jb21waWxlKAogICAgciIiIl4oP1A8cHJvamVjdF9uYW1lPi4rPyktKD9QPHZlcnNpb24+XGQuKj8pCiAgICAoKC0oP1A8YnVpbGQ+XGQuKj8pKT8tKD9QPHB5X3ZlcnNpb24+Lis/KS0oP1A8YWJpPi4rPyktKD9QPHBsYXRmb3JtPi4rPykKICAgIClcLndobCQiIiIsCnJlLlZFUkJPU0UpLm1hdGNoCgpOQU1FU1BBQ0VfUEFDS0FHRV9JTklUID0gJycnXAp0cnk6CiAgICBfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzJykuZGVjbGFyZV9uYW1lc3BhY2UoX19uYW1lX18pCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIF9fcGF0aF9fID0gX19pbXBvcnRfXygncGtndXRpbCcpLmV4dGVuZF9wYXRoKF9fcGF0aF9fLCBfX25hbWVfXykKJycnCgoKZGVmIHVucGFjayhzcmNfZGlyLCBkc3RfZGlyKToKICAgICcnJ01vdmUgZXZlcnl0aGluZyB1bmRlciBgc3JjX2RpcmAgdG8gYGRzdF9kaXJgLCBhbmQgZGVsZXRlIHRoZSBmb3JtZXIuJycnCiAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKHNyY19kaXIpOgogICAgICAgIHN1YmRpciA9IG9zLnBhdGgucmVscGF0aChkaXJwYXRoLCBzcmNfZGlyKQogICAgICAgIGZvciBmIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgc3JjID0gb3MucGF0aC5qb2luKGRpcnBhdGgsIGYpCiAgICAgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihkc3RfZGlyLCBzdWJkaXIsIGYpCiAgICAgICAgICAgIG9zLnJlbmFtZXMoc3JjLCBkc3QpCiAgICAgICAgZm9yIG4sIGQgaW4gcmV2ZXJzZWQobGlzdChlbnVtZXJhdGUoZGlybmFtZXMpKSk6CiAgICAgICAgICAgIHNyYyA9IG9zLnBhdGguam9pbihkaXJwYXRoLCBkKQogICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oZHN0X2Rpciwgc3ViZGlyLCBkKQogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZHN0KToKICAgICAgICAgICAgICAgICMgRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IGluIGRlc3RpbmF0aW9uLAogICAgICAgICAgICAgICAgIyByZW5hbWUgaXQgYW5kIHBydW5lIGl0IGZyb20gb3Mud2FsayBsaXN0LgogICAgICAgICAgICAgICAgb3MucmVuYW1lcyhzcmMsIGRzdCkKICAgICAgICAgICAgICAgIGRlbCBkaXJuYW1lc1tuXQogICAgIyBDbGVhbnVwLgogICAgZm9yIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhzcmNfZGlyLCB0b3Bkb3duPVRydWUpOgogICAgICAgIGFzc2VydCBub3QgZmlsZW5hbWVzCiAgICAgICAgb3Mucm1kaXIoZGlycGF0aCkKCgpjbGFzcyBXaGVlbChvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgbWF0Y2ggPSBXSEVFTF9OQU1FKG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpKQogICAgICAgIGlmIG1hdGNoIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ludmFsaWQgd2hlZWwgbmFtZTogJXInICUgZmlsZW5hbWUpCiAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCiAgICAgICAgZm9yIGssIHYgaW4gbWF0Y2guZ3JvdXBkaWN0KCkuaXRlbXMoKToKICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBrLCB2KQoKICAgIGRlZiB0YWdzKHNlbGYpOgogICAgICAgICcnJ0xpc3QgdGFncyAocHlfdmVyc2lvbiwgYWJpLCBwbGF0Zm9ybSkgc3VwcG9ydGVkIGJ5IHRoaXMgd2hlZWwuJycnCiAgICAgICAgcmV0dXJuIGl0ZXJ0b29scy5wcm9kdWN0KHNlbGYucHlfdmVyc2lvbi5zcGxpdCgnLicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFiaS5zcGxpdCgnLicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBsYXRmb3JtLnNwbGl0KCcuJykpCgogICAgZGVmIGlzX2NvbXBhdGlibGUoc2VsZik6CiAgICAgICAgJycnSXMgdGhlIHdoZWVsIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBwbGF0Zm9ybT8nJycKICAgICAgICBzdXBwb3J0ZWRfdGFncyA9IHBlcDQyNXRhZ3MuZ2V0X3N1cHBvcnRlZCgpCiAgICAgICAgcmV0dXJuIG5leHQoKFRydWUgZm9yIHQgaW4gc2VsZi50YWdzKCkgaWYgdCBpbiBzdXBwb3J0ZWRfdGFncyksIEZhbHNlKQoKICAgIGRlZiBlZ2dfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBwcm9qZWN0X25hbWU9c2VsZi5wcm9qZWN0X25hbWUsIHZlcnNpb249c2VsZi52ZXJzaW9uLAogICAgICAgICAgICBwbGF0Zm9ybT0oTm9uZSBpZiBzZWxmLnBsYXRmb3JtID09ICdhbnknIGVsc2UgZ2V0X3BsYXRmb3JtKCkpLAogICAgICAgICkuZWdnX25hbWUoKSArICcuZWdnJwoKICAgIGRlZiBpbnN0YWxsX2FzX2VnZyhzZWxmLCBkZXN0aW5hdGlvbl9lZ2dkaXIpOgogICAgICAgICcnJ0luc3RhbGwgd2hlZWwgYXMgYW4gZWdnIGRpcmVjdG9yeS4nJycKICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShzZWxmLmZpbGVuYW1lKSBhcyB6ZjoKICAgICAgICAgICAgZGlzdF9iYXNlbmFtZSA9ICclcy0lcycgJSAoc2VsZi5wcm9qZWN0X25hbWUsIHNlbGYudmVyc2lvbikKICAgICAgICAgICAgZGlzdF9pbmZvID0gJyVzLmRpc3QtaW5mbycgJSBkaXN0X2Jhc2VuYW1lCiAgICAgICAgICAgIGRpc3RfZGF0YSA9ICclcy5kYXRhJyAlIGRpc3RfYmFzZW5hbWUKICAgICAgICAgICAgZGVmIGdldF9tZXRhZGF0YShuYW1lKToKICAgICAgICAgICAgICAgIHdpdGggemYub3BlbignJXMvJXMnICUgKGRpc3RfaW5mbywgbmFtZSkpIGFzIGZwOgogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZnAucmVhZCgpLmRlY29kZSgndXRmLTgnKSBpZiBQWTMgZWxzZSBmcC5yZWFkKCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1haWwucGFyc2VyLlBhcnNlcigpLnBhcnNlc3RyKHZhbHVlKQogICAgICAgICAgICB3aGVlbF9tZXRhZGF0YSA9IGdldF9tZXRhZGF0YSgnV0hFRUwnKQogICAgICAgICAgICBkaXN0X21ldGFkYXRhID0gZ2V0X21ldGFkYXRhKCdNRVRBREFUQScpCiAgICAgICAgICAgICMgQ2hlY2sgd2hlZWwgZm9ybWF0IHZlcnNpb24gaXMgc3VwcG9ydGVkLgogICAgICAgICAgICB3aGVlbF92ZXJzaW9uID0gcGFyc2VfdmVyc2lvbih3aGVlbF9tZXRhZGF0YS5nZXQoJ1doZWVsLVZlcnNpb24nKSkKICAgICAgICAgICAgaWYgbm90IHBhcnNlX3ZlcnNpb24oJzEuMCcpIDw9IHdoZWVsX3ZlcnNpb24gPCBwYXJzZV92ZXJzaW9uKCcyLjBkZXYwJyk6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd1bnN1cHBvcnRlZCB3aGVlbCBmb3JtYXQgdmVyc2lvbjogJXMnICUgd2hlZWxfdmVyc2lvbikKICAgICAgICAgICAgIyBFeHRyYWN0IHRvIHRhcmdldCBkaXJlY3RvcnkuCiAgICAgICAgICAgIG9zLm1rZGlyKGRlc3RpbmF0aW9uX2VnZ2RpcikKICAgICAgICAgICAgemYuZXh0cmFjdGFsbChkZXN0aW5hdGlvbl9lZ2dkaXIpCiAgICAgICAgICAgICMgQ29udmVydCBtZXRhZGF0YS4KICAgICAgICAgICAgZGlzdF9pbmZvID0gb3MucGF0aC5qb2luKGRlc3RpbmF0aW9uX2VnZ2RpciwgZGlzdF9pbmZvKQogICAgICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uLmZyb21fbG9jYXRpb24oCiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbl9lZ2dkaXIsIGRpc3RfaW5mbywKICAgICAgICAgICAgICAgIG1ldGFkYXRhPVBhdGhNZXRhZGF0YShkZXN0aW5hdGlvbl9lZ2dkaXIsIGRpc3RfaW5mbykKICAgICAgICAgICAgKQogICAgICAgICAgICAjIE5vdGU6IHdlIG5lZWQgdG8gZXZhbHVhdGUgYW5kIHN0cmlwIG1hcmtlcnMgbm93LAogICAgICAgICAgICAjIGFzIHdlIGNhbid0IGVhc2lseSBjb252ZXJ0IGJhY2sgZnJvbSB0aGUgc3ludGF4OgogICAgICAgICAgICAjIGZvb2JhcjsgImxpbnV4IiBpbiBzeXNfcGxhdGZvcm0gYW5kIGV4dHJhID09ICd0ZXN0JwogICAgICAgICAgICBkZWYgcmF3X3JlcShyZXEpOgogICAgICAgICAgICAgICAgcmVxLm1hcmtlciA9IE5vbmUKICAgICAgICAgICAgICAgIHJldHVybiBzdHIocmVxKQogICAgICAgICAgICBpbnN0YWxsX3JlcXVpcmVzID0gbGlzdChzb3J0ZWQobWFwKHJhd19yZXEsIGRpc3QucmVxdWlyZXMoKSkpKQogICAgICAgICAgICBleHRyYXNfcmVxdWlyZSA9IHsKICAgICAgICAgICAgICAgIGV4dHJhOiBsaXN0KHNvcnRlZCgKICAgICAgICAgICAgICAgICAgICByZXEKICAgICAgICAgICAgICAgICAgICBmb3IgcmVxIGluIG1hcChyYXdfcmVxLCBkaXN0LnJlcXVpcmVzKChleHRyYSwpKSkKICAgICAgICAgICAgICAgICAgICBpZiByZXEgbm90IGluIGluc3RhbGxfcmVxdWlyZXMKICAgICAgICAgICAgICAgICkpCiAgICAgICAgICAgICAgICBmb3IgZXh0cmEgaW4gZGlzdC5leHRyYXMKICAgICAgICAgICAgfQogICAgICAgICAgICBlZ2dfaW5mbyA9IG9zLnBhdGguam9pbihkZXN0aW5hdGlvbl9lZ2dkaXIsICdFR0ctSU5GTycpCiAgICAgICAgICAgIG9zLnJlbmFtZShkaXN0X2luZm8sIGVnZ19pbmZvKQogICAgICAgICAgICBvcy5yZW5hbWUob3MucGF0aC5qb2luKGVnZ19pbmZvLCAnTUVUQURBVEEnKSwKICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihlZ2dfaW5mbywgJ1BLRy1JTkZPJykpCiAgICAgICAgICAgIHNldHVwX2Rpc3QgPSBTZXR1cHRvb2xzRGlzdHJpYnV0aW9uKGF0dHJzPWRpY3QoCiAgICAgICAgICAgICAgICBpbnN0YWxsX3JlcXVpcmVzPWluc3RhbGxfcmVxdWlyZXMsCiAgICAgICAgICAgICAgICBleHRyYXNfcmVxdWlyZT1leHRyYXNfcmVxdWlyZSwKICAgICAgICAgICAgKSkKICAgICAgICAgICAgd3JpdGVfcmVxdWlyZW1lbnRzKHNldHVwX2Rpc3QuZ2V0X2NvbW1hbmRfb2JqKCdlZ2dfaW5mbycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgb3MucGF0aC5qb2luKGVnZ19pbmZvLCAncmVxdWlyZXMudHh0JykpCiAgICAgICAgICAgICMgTW92ZSBkYXRhIGVudHJpZXMgdG8gdGhlaXIgY29ycmVjdCBsb2NhdGlvbi4KICAgICAgICAgICAgZGlzdF9kYXRhID0gb3MucGF0aC5qb2luKGRlc3RpbmF0aW9uX2VnZ2RpciwgZGlzdF9kYXRhKQogICAgICAgICAgICBkaXN0X2RhdGFfc2NyaXB0cyA9IG9zLnBhdGguam9pbihkaXN0X2RhdGEsICdzY3JpcHRzJykKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZGlzdF9kYXRhX3NjcmlwdHMpOgogICAgICAgICAgICAgICAgZWdnX2luZm9fc2NyaXB0cyA9IG9zLnBhdGguam9pbihkZXN0aW5hdGlvbl9lZ2dkaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFR0ctSU5GTycsICdzY3JpcHRzJykKICAgICAgICAgICAgICAgIG9zLm1rZGlyKGVnZ19pbmZvX3NjcmlwdHMpCiAgICAgICAgICAgICAgICBmb3IgZW50cnkgaW4gb3MubGlzdGRpcihkaXN0X2RhdGFfc2NyaXB0cyk6CiAgICAgICAgICAgICAgICAgICAgIyBSZW1vdmUgYnl0ZWNvZGUsIGFzIGl0J3Mgbm90IHByb3Blcmx5IGhhbmRsZWQKICAgICAgICAgICAgICAgICAgICAjIGR1cmluZyBlYXN5X2luc3RhbGwgc2NyaXB0cyBpbnN0YWxsIHBoYXNlLgogICAgICAgICAgICAgICAgICAgIGlmIGVudHJ5LmVuZHN3aXRoKCcucHljJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhvcy5wYXRoLmpvaW4oZGlzdF9kYXRhX3NjcmlwdHMsIGVudHJ5KSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBvcy5yZW5hbWUob3MucGF0aC5qb2luKGRpc3RfZGF0YV9zY3JpcHRzLCBlbnRyeSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZWdnX2luZm9fc2NyaXB0cywgZW50cnkpKQogICAgICAgICAgICAgICAgb3Mucm1kaXIoZGlzdF9kYXRhX3NjcmlwdHMpCiAgICAgICAgICAgIGZvciBzdWJkaXIgaW4gZmlsdGVyKG9zLnBhdGguZXhpc3RzLCAoCiAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZGlzdF9kYXRhLCBkKQogICAgICAgICAgICAgICAgZm9yIGQgaW4gKCdkYXRhJywgJ2hlYWRlcnMnLCAncHVyZWxpYicsICdwbGF0bGliJykKICAgICAgICAgICAgKSk6CiAgICAgICAgICAgICAgICB1bnBhY2soc3ViZGlyLCBkZXN0aW5hdGlvbl9lZ2dkaXIpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRpc3RfZGF0YSk6CiAgICAgICAgICAgICAgICBvcy5ybWRpcihkaXN0X2RhdGEpCiAgICAgICAgICAgICMgRml4IG5hbWVzcGFjZSBwYWNrYWdlcy4KICAgICAgICAgICAgbmFtZXNwYWNlX3BhY2thZ2VzID0gb3MucGF0aC5qb2luKGVnZ19pbmZvLCAnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG5hbWVzcGFjZV9wYWNrYWdlcyk6CiAgICAgICAgICAgICAgICB3aXRoIG9wZW4obmFtZXNwYWNlX3BhY2thZ2VzKSBhcyBmcDoKICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VfcGFja2FnZXMgPSBmcC5yZWFkKCkuc3BsaXQoKQogICAgICAgICAgICAgICAgZm9yIG1vZCBpbiBuYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgICAgICAgICAgbW9kX2RpciA9IG9zLnBhdGguam9pbihkZXN0aW5hdGlvbl9lZ2dkaXIsICptb2Quc3BsaXQoJy4nKSkKICAgICAgICAgICAgICAgICAgICBtb2RfaW5pdCA9IG9zLnBhdGguam9pbihtb2RfZGlyLCAnX19pbml0X18ucHknKQogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG1vZF9kaXIpIGFuZCBub3Qgb3MucGF0aC5leGlzdHMobW9kX2luaXQpOgogICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4obW9kX2luaXQsICd3JykgYXMgZnA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcC53cml0ZShOQU1FU1BBQ0VfUEFDS0FHRV9JTklUKQpQSwMEFAAAAAAAAAAhAPnL7g3KAgAAygIAADUAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3dpbmRvd3Nfc3VwcG9ydC5weWltcG9ydCBwbGF0Zm9ybQppbXBvcnQgY3R5cGVzCgoKZGVmIHdpbmRvd3Nfb25seShmdW5jKToKICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpICE9ICdXaW5kb3dzJzoKICAgICAgICByZXR1cm4gbGFtYmRhICphcmdzLCAqKmt3YXJnczogTm9uZQogICAgcmV0dXJuIGZ1bmMKCgpAd2luZG93c19vbmx5CmRlZiBoaWRlX2ZpbGUocGF0aCk6CiAgICAiIiIKICAgIFNldCB0aGUgaGlkZGVuIGF0dHJpYnV0ZSBvbiBhIGZpbGUgb3IgZGlyZWN0b3J5LgoKICAgIEZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTYyMjEzMy8KCiAgICBgcGF0aGAgbXVzdCBiZSB0ZXh0LgogICAgIiIiCiAgICBfX2ltcG9ydF9fKCdjdHlwZXMud2ludHlwZXMnKQogICAgU2V0RmlsZUF0dHJpYnV0ZXMgPSBjdHlwZXMud2luZGxsLmtlcm5lbDMyLlNldEZpbGVBdHRyaWJ1dGVzVwogICAgU2V0RmlsZUF0dHJpYnV0ZXMuYXJndHlwZXMgPSBjdHlwZXMud2ludHlwZXMuTFBXU1RSLCBjdHlwZXMud2ludHlwZXMuRFdPUkQKICAgIFNldEZpbGVBdHRyaWJ1dGVzLnJlc3R5cGUgPSBjdHlwZXMud2ludHlwZXMuQk9PTAoKICAgIEZJTEVfQVRUUklCVVRFX0hJRERFTiA9IDB4MDIKCiAgICByZXQgPSBTZXRGaWxlQXR0cmlidXRlcyhwYXRoLCBGSUxFX0FUVFJJQlVURV9ISURERU4pCiAgICBpZiBub3QgcmV0OgogICAgICAgIHJhaXNlIGN0eXBlcy5XaW5FcnJvcigpClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAIAAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQCIOqXUVSYAAFUmAAA9AAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL0RFU0NSSVBUSU9OLnJzdFdoZWVsCj09PT09CgpBIGJ1aWx0LXBhY2thZ2UgZm9ybWF0IGZvciBQeXRob24uCgpBIHdoZWVsIGlzIGEgWklQLWZvcm1hdCBhcmNoaXZlIHdpdGggYSBzcGVjaWFsbHkgZm9ybWF0dGVkIGZpbGVuYW1lCmFuZCB0aGUgLndobCBleHRlbnNpb24uIEl0IGlzIGRlc2lnbmVkIHRvIGNvbnRhaW4gYWxsIHRoZSBmaWxlcyBmb3IgYQpQRVAgMzc2IGNvbXBhdGlibGUgaW5zdGFsbCBpbiBhIHdheSB0aGF0IGlzIHZlcnkgY2xvc2UgdG8gdGhlIG9uLWRpc2sKZm9ybWF0LiBNYW55IHBhY2thZ2VzIHdpbGwgYmUgcHJvcGVybHkgaW5zdGFsbGVkIHdpdGggb25seSB0aGUgIlVucGFjayIKc3RlcCAoc2ltcGx5IGV4dHJhY3RpbmcgdGhlIGZpbGUgb250byBzeXMucGF0aCksIGFuZCB0aGUgdW5wYWNrZWQgYXJjaGl2ZQpwcmVzZXJ2ZXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvICJTcHJlYWQiIChjb3B5IGRhdGEgYW5kIHNjcmlwdHMgdG8gdGhlaXIKZmluYWwgbG9jYXRpb25zKSBhdCBhbnkgbGF0ZXIgdGltZS4KClRoZSB3aGVlbCBwcm9qZWN0IHByb3ZpZGVzIGEgYGJkaXN0X3doZWVsYCBjb21tYW5kIGZvciBzZXR1cHRvb2xzCihyZXF1aXJlcyBzZXR1cHRvb2xzID49IDAuOC4wKS4gV2hlZWwgZmlsZXMgY2FuIGJlIGluc3RhbGxlZCB3aXRoIGEKbmV3ZXIgYHBpcGAgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAgb3Igd2l0aCB3aGVlbCdzIG93biBjb21tYW5kCmxpbmUgdXRpbGl0eS4KClRoZSB3aGVlbCBkb2N1bWVudGF0aW9uIGlzIGF0IGh0dHA6Ly93aGVlbC5ydGZkLm9yZy8uIFRoZSBmaWxlIGZvcm1hdAppcyBkb2N1bWVudGVkIGluIFBFUCA0MjcgKGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQyNy8pLgoKVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBhdCBodHRwczovL2JpdGJ1Y2tldC5vcmcvcHlwYS93aGVlbAoKV2h5IG5vdCBlZ2c/Ci0tLS0tLS0tLS0tLQoKUHl0aG9uJ3MgZWdnIGZvcm1hdCBwcmVkYXRlcyB0aGUgcGFja2FnaW5nIHJlbGF0ZWQgc3RhbmRhcmRzIHdlIGhhdmUKdG9kYXksIHRoZSBtb3N0IGltcG9ydGFudCBiZWluZyBQRVAgMzc2ICJEYXRhYmFzZSBvZiBJbnN0YWxsZWQgUHl0aG9uCkRpc3RyaWJ1dGlvbnMiIHdoaWNoIHNwZWNpZmllcyB0aGUgLmRpc3QtaW5mbyBkaXJlY3RvcnkgKGluc3RlYWQgb2YKLmVnZy1pbmZvKSBhbmQgUEVQIDQyNiAiTWV0YWRhdGEgZm9yIFB5dGhvbiBTb2Z0d2FyZSBQYWNrYWdlcyAyLjAiCndoaWNoIHNwZWNpZmllcyBob3cgdG8gZXhwcmVzcyBkZXBlbmRlbmNpZXMgKGluc3RlYWQgb2YgcmVxdWlyZXMudHh0CmluIC5lZ2ctaW5mbykuCgpXaGVlbCBpbXBsZW1lbnRzIHRoZXNlIHRoaW5ncy4gSXQgYWxzbyBwcm92aWRlcyBhIHJpY2hlciBmaWxlIG5hbWluZwpjb252ZW50aW9uIHRoYXQgY29tbXVuaWNhdGVzIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gYW5kIEFCSSBhcyB3ZWxsCmFzIHNpbXBseSB0aGUgbGFuZ3VhZ2UgdmVyc2lvbiB1c2VkIGluIGEgcGFydGljdWxhciBwYWNrYWdlLgoKVW5saWtlIC5lZ2csIHdoZWVsIHdpbGwgYmUgYSBmdWxseS1kb2N1bWVudGVkIHN0YW5kYXJkIGF0IHRoZSBiaW5hcnkKbGV2ZWwgdGhhdCBpcyB0cnVseSBlYXN5IHRvIGluc3RhbGwgZXZlbiBpZiB5b3UgZG8gbm90IHdhbnQgdG8gdXNlIHRoZQpyZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uCgoKQ29kZSBvZiBDb25kdWN0Ci0tLS0tLS0tLS0tLS0tLQoKRXZlcnlvbmUgaW50ZXJhY3RpbmcgaW4gdGhlIHdoZWVsIHByb2plY3QncyBjb2RlYmFzZXMsIGlzc3VlIHRyYWNrZXJzLCBjaGF0CnJvb21zLCBhbmQgbWFpbGluZyBsaXN0cyBpcyBleHBlY3RlZCB0byBmb2xsb3cgdGhlIGBQeVBBIENvZGUgb2YgQ29uZHVjdGBfLgoKLi4gX1B5UEEgQ29kZSBvZiBDb25kdWN0OiBodHRwczovL3d3dy5weXBhLmlvL2VuL2xhdGVzdC9jb2RlLW9mLWNvbmR1Y3QvCgoKCjAuMjkuMAo9PT09PT0KLSBGaXggY29tcHJlc3Npb24gdHlwZSBvZiBmaWxlcyBpbiBhcmNoaXZlIChJc3N1ZSAjMTU1LCBQdWxsIFJlcXVlc3QgIzYyLAogIHRoYW5rcyBYYXZpZXIgRmVybmFuZGV6KQoKMC4yOC4wCj09PT09PQotIEZpeCBmaWxlIG1vZGVzIGluIGFyY2hpdmUgKElzc3VlICMxNTQpCgowLjI3LjAKPT09PT09Ci0gU3VwcG9ydCBmb3JjaW5nIGEgcGxhdGZvcm0gdGFnIHVzaW5nIGAtLXBsYXQtbmFtZWAgb24gcHVyZS1QeXRob24gd2hlZWxzLCBhcwogIHdlbGwgYXMgbm9uc3RhbmRhcmQgcGxhdGZvcm0gdGFncyBvbiBub24tcHVyZSB3aGVlbHMgKFB1bGwgUmVxdWVzdCAjNjAsIElzc3VlCiAgIzE0NCwgdGhhbmtzIEFuZHLDqXMgRMOtYXopCi0gQWRkIFNPQUJJIHRhZ3MgdG8gcGxhdGZvcm0tc3BlY2lmaWMgd2hlZWxzIGJ1aWx0IGZvciBQeXRob24gMi5YIChQdWxsIFJlcXVlc3QKICAjNTUsIElzc3VlICM2MywgSXNzdWUgIzEwMSkKLSBTdXBwb3J0IHJlcHJvZHVjaWJsZSB3aGVlbCBmaWxlcywgd2hlZWxzIHRoYXQgY2FuIGJlIHJlYnVpbHQgYW5kIHdpbGwgaGFzaCB0bwogIHRoZSBzYW1lIHZhbHVlcyBhcyBwcmV2aW91cyBidWlsZHMgKFB1bGwgUmVxdWVzdCAjNTIsIElzc3VlICMxNDMsIHRoYW5rcwogIEJhcnJ5IFdhcnNhdykKLSBTdXBwb3J0IGZvciBjaGFuZ2VzIGluIGtleXJpbmcgPj0gOC4wIChQdWxsIFJlcXVlc3QgIzYxLCB0aGFua3MgSmFzb24gUi4KICBDb29tYnMpCi0gVXNlIHRoZSBmaWxlIGNvbnRleHQgbWFuYWdlciB3aGVuIGNoZWNraW5nIGlmIGRlcGVuZGVuY3lfbGlua3MudHh0IGlzIGVtcHR5LAogIGZpeGVzIHByb2JsZW1zIGJ1aWxkaW5nIHdoZWVscyB1bmRlciBQeVB5IG9uIFdpbmRvd3MgIChJc3N1ZSAjMTUwLCB0aGFua3MKICBDb3NpbW8gTHVwbykKLSBEb24ndCBhdHRlbXB0IHRvIChyZWN1cnNpdmVseSkgY3JlYXRlIGEgYnVpbGQgZGlyZWN0b3J5IGVuZGluZyB3aXRoIGAuLmAKICAoaW52YWxpZCBvbiBhbGwgcGxhdGZvcm1zLCBidXQgY29kZSB3YXMgb25seSBleGVjdXRlZCBvbiBXaW5kb3dzKSAoSXNzdWUgIzkxKQotIEFkZGVkIHRoZSBQeVBBIENvZGUgb2YgQ29uZHVjdCAoUHVsbCBSZXF1ZXN0ICM1NikKCjAuMjYuMAo9PT09PT0KLSBGaXggbXVsdGlwbGUgZW50cnlwb2ludCBjb21wYXJpc29uIGZhaWx1cmUgb24gUHl0aG9uIDMgKElzc3VlICMxNDgpCgowLjI1LjAKPT09PT09Ci0gQWRkIFB5dGhvbiAzLjUgdG8gdG94IGNvbmZpZ3VyYXRpb24KLSBEZXRlcm1pbmlzdGljIChzb3J0ZWQpIG1ldGFkYXRhCi0gRml4IHRhZ2dpbmcgZm9yIFB5dGhvbiAzLjUgY29tcGF0aWJpbGl0eQotIFN1cHBvcnQgcHkyLW5vbmUtJ2FyY2gnIGFuZCBweTMtbm9uZS0nYXJjaCcgdGFncwotIFRyZWF0IGRhdGEtb25seSB3aGVlbHMgYXMgcHVyZQotIFdyaXRlIHRvIHRlbXBvcmFyeSBmaWxlIGFuZCByZW5hbWUgd2hlbiB1c2luZyB3aGVlbCBpbnN0YWxsIC0tZm9yY2UKCjAuMjQuMAo9PT09PT0KLSBUaGUgcHl0aG9uIHRhZyB1c2VkIGZvciBwdXJlLXB5dGhvbiBwYWNrYWdlcyBpcyBub3cgLnB5TiAobWFqb3IgdmVyc2lvbgogIG9ubHkpLiBUaGlzIGNoYW5nZSBhY3R1YWxseSBvY2N1cnJlZCBpbiAwLjIzLjAgd2hlbiB0aGUgLS1weXRob24tdGFnCiAgb3B0aW9uIHdhcyBhZGRlZCwgYnV0IHdhcyBub3QgZXhwbGljaXRseSBtZW50aW9uZWQgaW4gdGhlIGNoYW5nZWxvZyB0aGVuLgotIHdpbmluc3Qyd2hlZWwgYW5kIGVnZzJ3aGVlbCByZW1vdmVkLiBVc2UgIndoZWVsIGNvbnZlcnQgW2FyY2hpdmVdIgogIGluc3RlYWQuCi0gV2hlZWwgbm93IHN1cHBvcnRzIHNldHVwdG9vbHMgc3R5bGUgY29uZGl0aW9uYWwgcmVxdWlyZW1lbnRzIHZpYSB0aGUKICBleHRyYXNfcmVxdWlyZT17fSBzeW50YXguIFNlcGFyYXRlICdleHRyYScgbmFtZXMgZnJvbSBjb25kaXRpb25zIHVzaW5nCiAgdGhlIDogY2hhcmFjdGVyLiBXaGVlbCdzIG93biBzZXR1cC5weSBkb2VzIHRoaXMuIChUaGUgZW1wdHktc3RyaW5nCiAgZXh0cmEgaXMgdGhlIHNhbWUgYXMgaW5zdGFsbF9yZXF1aXJlcy4pIFRoZXNlIGNvbmRpdGlvbmFsIHJlcXVpcmVtZW50cwogIHNob3VsZCB3b3JrIHRoZSBzYW1lIHdoZXRoZXIgdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkIGJ5IHdoZWVsIG9yCiAgYnkgc2V0dXAucHkuCgowLjIzLjAKPT09PT09Ci0gQ29tcGF0aWJpbGl0eSB0YWcgZmxhZ3MgYWRkZWQgdG8gdGhlIGJkaXN0X3doZWVsIGNvbW1hbmQKLSBzZGlzdCBzaG91bGQgaW5jbHVkZSBmaWxlcyBuZWNlc3NhcnkgZm9yIHRlc3RzCi0gJ3doZWVsIGNvbnZlcnQnIGNhbiBub3cgYWxzbyBjb252ZXJ0IHVucGFja2VkIGVnZ3MgdG8gd2hlZWwKLSBSZW5hbWUgcHlkaXN0Lmpzb24gdG8gbWV0YWRhdGEuanNvbiB0byBhdm9pZCBzdGVwcGluZyBvbiB0aGUgUEVQCi0gVGhlIC0tc2tpcC1zY3JpcHRzIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkLCBhbmQgbm90IGdlbmVyYXRpbmcgc2NyaXB0cyBpcyBub3cKICB0aGUgZGVmYXVsdC4gVGhlIG9wdGlvbiB3YXMgYSB0ZW1wb3JhcnkgYXBwcm9hY2ggdW50aWwgaW5zdGFsbGVycyBjb3VsZAogIGdlbmVyYXRlIHNjcmlwdHMgdGhlbXNlbHZlcy4gVGhhdCBpcyBub3cgdGhlIGNhc2Ugd2l0aCBwaXAgMS41IGFuZCBsYXRlci4KICBOb3RlIHRoYXQgdXNpbmcgcGlwIDEuNCB0byBpbnN0YWxsIGEgd2hlZWwgd2l0aG91dCBzY3JpcHRzIHdpbGwgbGVhdmUgdGhlCiAgaW5zdGFsbGF0aW9uIHdpdGhvdXQgZW50cnktcG9pbnQgd3JhcHBlcnMuIFRoZSAid2hlZWwgaW5zdGFsbC1zY3JpcHRzIgogIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHNjcmlwdHMgaW4gc3VjaCBjYXNlcy4KLSBUaGFuayB5b3UgY29udHJpYnV0b3JzCgowLjIyLjAKPT09PT09Ci0gSW5jbHVkZSBlbnRyeV9wb2ludHMudHh0LCBzY3JpcHRzIGEuay5hLiBjb21tYW5kcywgaW4gZXhwZXJpbWVudGFsCiAgcHlkaXN0Lmpzb24KLSBJbXByb3ZlZCB0ZXN0X3JlcXVpcmVzIHBhcnNpbmcKLSBQeXRob24gMi42IGZpeGVzLCAid2hlZWwgdmVyc2lvbiIgY29tbWFuZCBjb3VydGVzeSBwb21icmVkYW5uZQoKMC4yMS4wCj09PT09PQotIFByZWdlbmVyYXRlZCBzY3JpcHRzIGFyZSB0aGUgZGVmYXVsdCBhZ2Fpbi4KLSAic2V0dXAucHkgYmRpc3Rfd2hlZWwgLS1za2lwLXNjcmlwdHMiIHR1cm5zIHRoZW0gb2ZmLgotIHNldHVwdG9vbHMgaXMgbm8gbG9uZ2VyIGEgbGlzdGVkIHJlcXVpcmVtZW50IGZvciB0aGUgJ3doZWVsJwogIHBhY2thZ2UuIEl0IGlzIG9mIGNvdXJzZSBzdGlsbCByZXF1aXJlZCBpbiBvcmRlciBmb3IgYmRpc3Rfd2hlZWwKICB0byB3b3JrLgotICJweXRob24gLW0gd2hlZWwiIGF2b2lkcyBpbXBvcnRpbmcgcGtnX3Jlc291cmNlcyB1bnRpbCBpdCdzIG5lY2Vzc2FyeS4KCjAuMjAuMAo9PT09PT0KLSBObyBsb25nZXIgaW5jbHVkZSBjb25zb2xlX3NjcmlwdHMgaW4gd2hlZWxzLiBPcmRpbmFyeSBzY3JpcHRzIChzaGVsbCBmaWxlcywKICBzdGFuZGFsb25lIFB5dGhvbiBmaWxlcykgYXJlIGluY2x1ZGVkIGFzIHVzdWFsLgotIEluY2x1ZGUgbmV3IGNvbW1hbmQgInB5dGhvbiAtbSB3aGVlbCBpbnN0YWxsLXNjcmlwdHMgW2Rpc3RyaWJ1dGlvbgogIFtkaXN0cmlidXRpb24gLi4uXV0iIHRvIGluc3RhbGwgdGhlIGNvbnNvbGVfc2NyaXB0cyAoc2V0dXB0b29scy1zdHlsZQogIHNjcmlwdHMgdXNpbmcgcGtnX3Jlc291cmNlcykgZm9yIGEgZGlzdHJpYnV0aW9uLgoKMC4xOS4wCj09PT09PQotIHB5bWV0YS5qc29uIGJlY29tZXMgcHlkaXN0Lmpzb24KCjAuMTguMAo9PT09PT0KLSBQeXRob24gMyBVbmljb2RlIGltcHJvdmVtZW50cwoKMC4xNy4wCj09PT09PQotIFN1cHBvcnQgbGF0ZXN0IFBFUC00MjYgInB5bWV0YS5qc29uIiAoanNvbi1mb3JtYXQgbWV0YWRhdGEpCgowLjE2LjAKPT09PT09Ci0gUHl0aG9uIDIuNiBjb21wYXRpYmlsaXR5IGJ1Z2ZpeCAodGhhbmtzIEpvaG4gTWNGYXJsYW5lKQotIE5vbi1wcmVyZWxlYXNlIHZlcnNpb24gbnVtYmVyCgoxLjAuMGEyCj09PT09PT0KLSBCdWdmaXggZm9yIEMtZXh0ZW5zaW9uIHRhZ3MgZm9yIENQeXRob24gMy4zICh1c2luZyBTT0FCSSkKCjEuMC4wYTEKPT09PT09PQotIEJ1Z2ZpeCBmb3IgYmRpc3Rfd2luaW5zdCBjb252ZXJ0ZXIgIndoZWVsIGNvbnZlcnQiCi0gQnVnZml4IGZvciBkaXN0cyB3aGVyZSAiaXMgcHVyZSIgaXMgTm9uZSBpbnN0ZWFkIG9mIFRydWUgb3IgRmFsc2UKCjEuMC4wYTAKPT09PT09PQotIFVwZGF0ZSBmb3IgdmVyc2lvbiAxLjAgb2YgV2hlZWwgKFBFUCBhY2NlcHRlZCkuCi0gUHl0aG9uIDMgZml4IGZvciBtb3ZpbmcgVW5pY29kZSBEZXNjcmlwdGlvbiB0byBtZXRhZGF0YSBib2R5Ci0gSW5jbHVkZSBydWRpbWVudGFyeSBBUEkgZG9jdW1lbnRhdGlvbiBpbiBTcGhpbnggKHRoYW5rcyBLZXZpbiBIb3JuKQoKMC4xNS4wCj09PT09PQotIFZhcmlvdXMgaW1wcm92ZW1lbnRzCgowLjE0LjAKPT09PT09Ci0gQ2hhbmdlZCB0aGUgc2lnbmF0dXJlIGZvcm1hdCB0byBiZXR0ZXIgY29tcGx5IHdpdGggdGhlIGN1cnJlbnQgSldTIHNwZWMuCiAgQnJlYWtzIGFsbCBleGlzdGluZyBzaWduYXR1cmVzLgotIEluY2x1ZGUgYGB3aGVlbCB1bnNpZ25gYCBjb21tYW5kIHRvIHJlbW92ZSBSRUNPUkQuandzIGZyb20gYW4gYXJjaGl2ZS4KLSBQdXQgdGhlIGRlc2NyaXB0aW9uIGluIHRoZSBuZXdseSBhbGxvd2VkIHBheWxvYWQgc2VjdGlvbiBvZiBQS0ctSU5GTwogIChNRVRBREFUQSkgZmlsZXMuCgowLjEzLjAKPT09PT09Ci0gVXNlIGRpc3R1dGlscyBpbnN0ZWFkIG9mIHN5c2NvbmZpZyB0byBnZXQgaW5zdGFsbGF0aW9uIHBhdGhzOyBjYW4gaW5zdGFsbAogIGhlYWRlcnMuCi0gSW1wcm92ZSBXaGVlbEZpbGUoKSBzb3J0LgotIEFsbG93IGJvb3RzdHJhcCBpbnN0YWxscyB3aXRob3V0IGFueSBwa2dfcmVzb3VyY2VzLgoKMC4xMi4wCj09PT09PQotIFVuaXQgdGVzdCBmb3Igd2hlZWwudG9vbC5pbnN0YWxsCgowLjExLjAKPT09PT09Ci0gQVBJIGNsZWFudXAKCjAuMTAuMwo9PT09PT0KLSBTY3JpcHRzIGZpeGVyIGZpeAoKMC4xMC4yCj09PT09PQotIEZpeCBrZXlnZW4KCjAuMTAuMQo9PT09PT0KLSBQcmVzZXJ2ZSBhdHRyaWJ1dGVzIG9uIGluc3RhbGwuCgowLjEwLjAKPT09PT09Ci0gSW5jbHVkZSBhIGNvcHkgb2YgcGtnX3Jlc291cmNlcy4gV2hlZWwgY2FuIG5vdyBpbnN0YWxsIGludG8gYSB2aXJ0dWFsZW52CiAgdGhhdCBkb2VzIG5vdCBoYXZlIGRpc3RyaWJ1dGUgKHRob3VnaCBtb3N0IHBhY2thZ2VzIHN0aWxsIHJlcXVpcmUKICBwa2dfcmVzb3VyY2VzIHRvIGFjdHVhbGx5IHdvcms7IHdoZWVsIGluc3RhbGwgZGlzdHJpYnV0ZSkKLSBEZWZpbmUgYSBuZXcgc2V0dXAuY2ZnIHNlY3Rpb24gW3doZWVsXS4gdW5pdmVyc2FsPTEgd2lsbAogIGFwcGx5IHRoZSBweTIucHkzLW5vbmUtYW55IHRhZyBmb3IgcHVyZSBweXRob24gd2hlZWxzLgoKMC45LjcKPT09PT0KLSBPbmx5IGltcG9ydCBkaXJzcGVjIHdoZW4gbmVlZGVkLiBkaXJzcGVjIGlzIG9ubHkgbmVlZGVkIHRvIGZpbmQgdGhlCiAgY29uZmlndXJhdGlvbiBmb3Iga2V5Z2VuL3NpZ25pbmcgb3BlcmF0aW9ucy4KCjAuOS42Cj09PT09Ci0gcmVxdWlyZXMtZGlzdCBmcm9tIHNldHVwLmNmZyBvdmVyd3JpdGVzIGFueSByZXF1aXJlbWVudHMgZnJvbSBzZXR1cC5weQogIENhcmUgbXVzdCBiZSB0YWtlbiB0aGF0IHRoZSByZXF1aXJlbWVudHMgYXJlIHRoZSBzYW1lIGluIGJvdGggY2FzZXMsCiAgb3IganVzdCBhbHdheXMgaW5zdGFsbCBmcm9tIHdoZWVsLgotIGRyb3AgZGlyc3BlYyByZXF1aXJlbWVudCBvbiB3aW4zMgotIGltcHJvdmVkIGNvbW1hbmQgbGluZSB1dGlsaXR5LCBhZGRzICd3aGVlbCBjb252ZXJ0IFtlZ2cgb3Igd2luaW5zdF0nIHRvCiAgY29udmVydCBsZWdhY3kgYmluYXJ5IGZvcm1hdHMgdG8gd2hlZWwKCjAuOS41Cj09PT09Ci0gV2hlZWwncyBvd24gd2hlZWwgZmlsZSBjYW4gYmUgZXhlY3V0ZWQgYnkgUHl0aG9uLCBhbmQgY2FuIGluc3RhbGwgaXRzZWxmOgogIGBgcHl0aG9uIHdoZWVsLTAuOS41LXB5Mjctbm9uZS1hbnkvd2hlZWwgaW5zdGFsbCAuLi5gYAotIFVzZSBhcmdwYXJzZTsgYmFzaWMgYGB3aGVlbCBpbnN0YWxsYGAgY29tbWFuZCBzaG91bGQgcnVuIHdpdGggb25seSBzdGRsaWIKICBkZXBlbmRlbmNpZXMuCi0gQWxsb3cgcmVxdWlyZXNfZGlzdCBpbiBzZXR1cC5jZmcncyBbbWV0YWRhdGFdIHNlY3Rpb24uIEluIGFkZGl0aW9uIHRvCiAgZGVwZW5kZW5jaWVzIGluIHNldHVwLnB5LCBidXQgd2lsbCBvbmx5IGJlIGludGVycHJldGVkIHdoZW4gaW5zdGFsbGluZwogIGZyb20gd2hlZWwsIG5vdCBmcm9tIHNkaXN0LiBDYW4gYmUgcXVhbGlmaWVkIHdpdGggZW52aXJvbm1lbnQgbWFya2Vycy4KCjAuOS40Cj09PT09Ci0gRml4IHdoZWVsLnNpZ25hdHVyZXMgaW4gc2Rpc3QKCjAuOS4zCj09PT09Ci0gSW50ZWdyYXRlZCBkaWdpdGFsIHNpZ25hdHVyZXMgc3VwcG9ydCB3aXRob3V0IEMgZXh0ZW5zaW9ucy4KLSBJbnRlZ3JhdGVkICJ3aGVlbCBpbnN0YWxsIiBjb21tYW5kIChzaW5nbGUgcGFja2FnZSwgbm8gZGVwZW5kZW5jeQogIHJlc29sdXRpb24pIGluY2x1ZGluZyBjb21wYXRpYmlsaXR5IGNoZWNrLgotIFN1cHBvcnQgUHl0aG9uIDMuMwotIFVzZSBNZXRhZGF0YSAxLjMgKFBFUCA0MjYpCgowLjkuMgo9PT09PQotIEF1dG9tYXRpYyBzaWduaW5nIGlmIFdIRUVMX1RPT0wgcG9pbnRzIHRvIHRoZSB3aGVlbCBiaW5hcnkKLSBFdmVuIG1vcmUgUHl0aG9uIDMgZml4ZXMKCjAuOS4xCj09PT09Ci0gJ3doZWVsIHNpZ24nIHVzZXMgdGhlIGtleXMgZ2VuZXJhdGVkIGJ5ICd3aGVlbCBrZXlnZW4nIChpbnN0ZWFkIG9mIGdlbmVyYXRpbmcKICBhIG5ldyBrZXkgYXQgcmFuZG9tIGVhY2ggdGltZSkKLSBQeXRob24gMi8zIGVuY29kaW5nL2RlY29kaW5nIGZpeGVzCi0gUnVuIHRlc3RzIG9uIFB5dGhvbiAyLjYgKHdpdGhvdXQgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbikKCjAuOQo9PT0KLSBVcGRhdGVkIGRpZ2l0YWwgc2lnbmF0dXJlcyBzY2hlbWUKLSBQeXRob24gMyBzdXBwb3J0IGZvciBkaWdpdGFsIHNpZ25hdHVyZXMKLSBBbHdheXMgdmVyaWZ5IFJFQ09SRCBoYXNoZXMgb24gZXh0cmFjdAotICJ3aGVlbCIgY29tbWFuZCBsaW5lIHRvb2wgdG8gc2lnbiwgdmVyaWZ5LCB1bnBhY2sgd2hlZWwgZmlsZXMKCjAuOAo9PT0KLSBub25lL2FueSBkcmFmdCBwZXAgdGFncyB1cGRhdGUKLSBpbXByb3ZlZCB3aW5pbnN0MndoZWVsIHNjcmlwdAotIGRvYyBjaGFuZ2VzIGFuZCBvdGhlciBpbXByb3ZlbWVudHMKCjAuNwo9PT0KLSBzb3J0IC5kaXN0LWluZm8gYXQgZW5kIG9mIHdoZWVsIGFyY2hpdmUKLSBXaW5kb3dzICYgUHl0aG9uIDMgZml4ZXMgZnJvbSBQYXVsIE1vb3JlCi0gcGVwOAotIHNjcmlwdHMgdG8gY29udmVydCB3aW5pbnN0ICYgZWdnIHRvIHdoZWVsCgowLjYKPT09Ci0gcmVxdWlyZSBkaXN0cmlidXRlID49IDAuNi4yOAotIHN0b3AgdXNpbmcgdmVybGliCgowLjUKPT09Ci0gd29ya2luZyBwcmV0dHkgd2VsbAoKMC40LjIKPT09PT0KLSBoeXBoZW5hdGVkIG5hbWUgZml4CgowLjQKPT09Ci0gaW1wcm92ZSB0ZXN0IGNvdmVyYWdlCi0gaW1wcm92ZSBXaW5kb3dzIGNvbXBhdGliaWxpdHkKLSBpbmNsdWRlIHRveC5pbmkgY291cnRlc3kgb2YgTWFyYyBBYnJhbW93aXR6Ci0gZHJhZnQgaG1hYyBzaGEtMjU2IHNpZ25pbmcgZnVuY3Rpb24KCjAuMwo9PT0KLSBwcm90b3R5cGUgZWdnMndoZWVsIGNvbnZlcnNpb24gc2NyaXB0CgowLjIKPT09Ci0gUHl0aG9uIDMgY29tcGF0aWJpbGl0eQoKMC4xCj09PQotIEluaXRpYWwgdmVyc2lvbgoKClBLAwQUAAAAAAAAACEAcP+un2UEAABlBAAAOQAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9MSUNFTlNFLnR4dCJ3aGVlbCIgY29weXJpZ2h0IChjKSAyMDEyLTIwMTQgRGFuaWVsIEhvbHRoIDxkaG9sdGhAZmFzdG1haWwuZm0+IGFuZApjb250cmlidXRvcnMuCgpUaGUgTUlUIExpY2Vuc2UKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCmNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCnRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCmFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQpTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCkFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgpPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuClBLAwQUAAAAAAAAACEARG2ZgQ0rAAANKwAANgAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9NRVRBREFUQU1ldGFkYXRhLVZlcnNpb246IDIuMApOYW1lOiB3aGVlbApWZXJzaW9uOiAwLjMwLjBhMApTdW1tYXJ5OiBBIGJ1aWx0LXBhY2thZ2UgZm9ybWF0IGZvciBQeXRob24uCkhvbWUtcGFnZTogaHR0cHM6Ly9iaXRidWNrZXQub3JnL3B5cGEvd2hlZWwvCkF1dGhvcjogRGFuaWVsIEhvbHRoCkF1dGhvci1lbWFpbDogZGhvbHRoQGZhc3RtYWlsLmZtCkxpY2Vuc2U6IE1JVApLZXl3b3Jkczogd2hlZWwscGFja2FnaW5nClBsYXRmb3JtOiBVTktOT1dOCkNsYXNzaWZpZXI6IERldmVsb3BtZW50IFN0YXR1cyA6OiA0IC0gQmV0YQpDbGFzc2lmaWVyOiBJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbgpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMgpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi42CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjcKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuMgpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy4zCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjQKUmVxdWlyZXMtRGlzdDogYXJncGFyc2U7IHB5dGhvbl92ZXJzaW9uPT0iMi42IgpQcm92aWRlcy1FeHRyYTogZmFzdGVyLXNpZ25hdHVyZXMKUmVxdWlyZXMtRGlzdDogZWQyNTUxOWxsOyBleHRyYSA9PSAnZmFzdGVyLXNpZ25hdHVyZXMnClByb3ZpZGVzLUV4dHJhOiBzaWduYXR1cmVzClJlcXVpcmVzLURpc3Q6IGtleXJpbmc7IGV4dHJhID09ICdzaWduYXR1cmVzJwpSZXF1aXJlcy1EaXN0OiBrZXlyaW5ncy5hbHQ7IGV4dHJhID09ICdzaWduYXR1cmVzJwpQcm92aWRlcy1FeHRyYTogc2lnbmF0dXJlcwpSZXF1aXJlcy1EaXN0OiBpbXBvcnRsaWI7IHB5dGhvbl92ZXJzaW9uPT0iMi42IiBhbmQgZXh0cmEgPT0gJ3NpZ25hdHVyZXMnClByb3ZpZGVzLUV4dHJhOiBzaWduYXR1cmVzClJlcXVpcmVzLURpc3Q6IHB5eGRnOyBzeXNfcGxhdGZvcm0hPSJ3aW4zMiIgYW5kIGV4dHJhID09ICdzaWduYXR1cmVzJwpQcm92aWRlcy1FeHRyYTogdG9vbAoKV2hlZWwKPT09PT0KCkEgYnVpbHQtcGFja2FnZSBmb3JtYXQgZm9yIFB5dGhvbi4KCkEgd2hlZWwgaXMgYSBaSVAtZm9ybWF0IGFyY2hpdmUgd2l0aCBhIHNwZWNpYWxseSBmb3JtYXR0ZWQgZmlsZW5hbWUKYW5kIHRoZSAud2hsIGV4dGVuc2lvbi4gSXQgaXMgZGVzaWduZWQgdG8gY29udGFpbiBhbGwgdGhlIGZpbGVzIGZvciBhClBFUCAzNzYgY29tcGF0aWJsZSBpbnN0YWxsIGluIGEgd2F5IHRoYXQgaXMgdmVyeSBjbG9zZSB0byB0aGUgb24tZGlzawpmb3JtYXQuIE1hbnkgcGFja2FnZXMgd2lsbCBiZSBwcm9wZXJseSBpbnN0YWxsZWQgd2l0aCBvbmx5IHRoZSAiVW5wYWNrIgpzdGVwIChzaW1wbHkgZXh0cmFjdGluZyB0aGUgZmlsZSBvbnRvIHN5cy5wYXRoKSwgYW5kIHRoZSB1bnBhY2tlZCBhcmNoaXZlCnByZXNlcnZlcyBlbm91Z2ggaW5mb3JtYXRpb24gdG8gIlNwcmVhZCIgKGNvcHkgZGF0YSBhbmQgc2NyaXB0cyB0byB0aGVpcgpmaW5hbCBsb2NhdGlvbnMpIGF0IGFueSBsYXRlciB0aW1lLgoKVGhlIHdoZWVsIHByb2plY3QgcHJvdmlkZXMgYSBgYmRpc3Rfd2hlZWxgIGNvbW1hbmQgZm9yIHNldHVwdG9vbHMKKHJlcXVpcmVzIHNldHVwdG9vbHMgPj0gMC44LjApLiBXaGVlbCBmaWxlcyBjYW4gYmUgaW5zdGFsbGVkIHdpdGggYQpuZXdlciBgcGlwYCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcCBvciB3aXRoIHdoZWVsJ3Mgb3duIGNvbW1hbmQKbGluZSB1dGlsaXR5LgoKVGhlIHdoZWVsIGRvY3VtZW50YXRpb24gaXMgYXQgaHR0cDovL3doZWVsLnJ0ZmQub3JnLy4gVGhlIGZpbGUgZm9ybWF0CmlzIGRvY3VtZW50ZWQgaW4gUEVQIDQyNyAoaHR0cDovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDI3LykuCgpUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGlzIGF0IGh0dHBzOi8vYml0YnVja2V0Lm9yZy9weXBhL3doZWVsCgpXaHkgbm90IGVnZz8KLS0tLS0tLS0tLS0tCgpQeXRob24ncyBlZ2cgZm9ybWF0IHByZWRhdGVzIHRoZSBwYWNrYWdpbmcgcmVsYXRlZCBzdGFuZGFyZHMgd2UgaGF2ZQp0b2RheSwgdGhlIG1vc3QgaW1wb3J0YW50IGJlaW5nIFBFUCAzNzYgIkRhdGFiYXNlIG9mIEluc3RhbGxlZCBQeXRob24KRGlzdHJpYnV0aW9ucyIgd2hpY2ggc3BlY2lmaWVzIHRoZSAuZGlzdC1pbmZvIGRpcmVjdG9yeSAoaW5zdGVhZCBvZgouZWdnLWluZm8pIGFuZCBQRVAgNDI2ICJNZXRhZGF0YSBmb3IgUHl0aG9uIFNvZnR3YXJlIFBhY2thZ2VzIDIuMCIKd2hpY2ggc3BlY2lmaWVzIGhvdyB0byBleHByZXNzIGRlcGVuZGVuY2llcyAoaW5zdGVhZCBvZiByZXF1aXJlcy50eHQKaW4gLmVnZy1pbmZvKS4KCldoZWVsIGltcGxlbWVudHMgdGhlc2UgdGhpbmdzLiBJdCBhbHNvIHByb3ZpZGVzIGEgcmljaGVyIGZpbGUgbmFtaW5nCmNvbnZlbnRpb24gdGhhdCBjb21tdW5pY2F0ZXMgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBhbmQgQUJJIGFzIHdlbGwKYXMgc2ltcGx5IHRoZSBsYW5ndWFnZSB2ZXJzaW9uIHVzZWQgaW4gYSBwYXJ0aWN1bGFyIHBhY2thZ2UuCgpVbmxpa2UgLmVnZywgd2hlZWwgd2lsbCBiZSBhIGZ1bGx5LWRvY3VtZW50ZWQgc3RhbmRhcmQgYXQgdGhlIGJpbmFyeQpsZXZlbCB0aGF0IGlzIHRydWx5IGVhc3kgdG8gaW5zdGFsbCBldmVuIGlmIHlvdSBkbyBub3Qgd2FudCB0byB1c2UgdGhlCnJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbi4KCgpDb2RlIG9mIENvbmR1Y3QKLS0tLS0tLS0tLS0tLS0tCgpFdmVyeW9uZSBpbnRlcmFjdGluZyBpbiB0aGUgd2hlZWwgcHJvamVjdCdzIGNvZGViYXNlcywgaXNzdWUgdHJhY2tlcnMsIGNoYXQKcm9vbXMsIGFuZCBtYWlsaW5nIGxpc3RzIGlzIGV4cGVjdGVkIHRvIGZvbGxvdyB0aGUgYFB5UEEgQ29kZSBvZiBDb25kdWN0YF8uCgouLiBfUHlQQSBDb2RlIG9mIENvbmR1Y3Q6IGh0dHBzOi8vd3d3LnB5cGEuaW8vZW4vbGF0ZXN0L2NvZGUtb2YtY29uZHVjdC8KCgoKMC4yOS4wCj09PT09PQotIEZpeCBjb21wcmVzc2lvbiB0eXBlIG9mIGZpbGVzIGluIGFyY2hpdmUgKElzc3VlICMxNTUsIFB1bGwgUmVxdWVzdCAjNjIsCiAgdGhhbmtzIFhhdmllciBGZXJuYW5kZXopCgowLjI4LjAKPT09PT09Ci0gRml4IGZpbGUgbW9kZXMgaW4gYXJjaGl2ZSAoSXNzdWUgIzE1NCkKCjAuMjcuMAo9PT09PT0KLSBTdXBwb3J0IGZvcmNpbmcgYSBwbGF0Zm9ybSB0YWcgdXNpbmcgYC0tcGxhdC1uYW1lYCBvbiBwdXJlLVB5dGhvbiB3aGVlbHMsIGFzCiAgd2VsbCBhcyBub25zdGFuZGFyZCBwbGF0Zm9ybSB0YWdzIG9uIG5vbi1wdXJlIHdoZWVscyAoUHVsbCBSZXF1ZXN0ICM2MCwgSXNzdWUKICAjMTQ0LCB0aGFua3MgQW5kcsOpcyBEw61heikKLSBBZGQgU09BQkkgdGFncyB0byBwbGF0Zm9ybS1zcGVjaWZpYyB3aGVlbHMgYnVpbHQgZm9yIFB5dGhvbiAyLlggKFB1bGwgUmVxdWVzdAogICM1NSwgSXNzdWUgIzYzLCBJc3N1ZSAjMTAxKQotIFN1cHBvcnQgcmVwcm9kdWNpYmxlIHdoZWVsIGZpbGVzLCB3aGVlbHMgdGhhdCBjYW4gYmUgcmVidWlsdCBhbmQgd2lsbCBoYXNoIHRvCiAgdGhlIHNhbWUgdmFsdWVzIGFzIHByZXZpb3VzIGJ1aWxkcyAoUHVsbCBSZXF1ZXN0ICM1MiwgSXNzdWUgIzE0MywgdGhhbmtzCiAgQmFycnkgV2Fyc2F3KQotIFN1cHBvcnQgZm9yIGNoYW5nZXMgaW4ga2V5cmluZyA+PSA4LjAgKFB1bGwgUmVxdWVzdCAjNjEsIHRoYW5rcyBKYXNvbiBSLgogIENvb21icykKLSBVc2UgdGhlIGZpbGUgY29udGV4dCBtYW5hZ2VyIHdoZW4gY2hlY2tpbmcgaWYgZGVwZW5kZW5jeV9saW5rcy50eHQgaXMgZW1wdHksCiAgZml4ZXMgcHJvYmxlbXMgYnVpbGRpbmcgd2hlZWxzIHVuZGVyIFB5UHkgb24gV2luZG93cyAgKElzc3VlICMxNTAsIHRoYW5rcwogIENvc2ltbyBMdXBvKQotIERvbid0IGF0dGVtcHQgdG8gKHJlY3Vyc2l2ZWx5KSBjcmVhdGUgYSBidWlsZCBkaXJlY3RvcnkgZW5kaW5nIHdpdGggYC4uYAogIChpbnZhbGlkIG9uIGFsbCBwbGF0Zm9ybXMsIGJ1dCBjb2RlIHdhcyBvbmx5IGV4ZWN1dGVkIG9uIFdpbmRvd3MpIChJc3N1ZSAjOTEpCi0gQWRkZWQgdGhlIFB5UEEgQ29kZSBvZiBDb25kdWN0IChQdWxsIFJlcXVlc3QgIzU2KQoKMC4yNi4wCj09PT09PQotIEZpeCBtdWx0aXBsZSBlbnRyeXBvaW50IGNvbXBhcmlzb24gZmFpbHVyZSBvbiBQeXRob24gMyAoSXNzdWUgIzE0OCkKCjAuMjUuMAo9PT09PT0KLSBBZGQgUHl0aG9uIDMuNSB0byB0b3ggY29uZmlndXJhdGlvbgotIERldGVybWluaXN0aWMgKHNvcnRlZCkgbWV0YWRhdGEKLSBGaXggdGFnZ2luZyBmb3IgUHl0aG9uIDMuNSBjb21wYXRpYmlsaXR5Ci0gU3VwcG9ydCBweTItbm9uZS0nYXJjaCcgYW5kIHB5My1ub25lLSdhcmNoJyB0YWdzCi0gVHJlYXQgZGF0YS1vbmx5IHdoZWVscyBhcyBwdXJlCi0gV3JpdGUgdG8gdGVtcG9yYXJ5IGZpbGUgYW5kIHJlbmFtZSB3aGVuIHVzaW5nIHdoZWVsIGluc3RhbGwgLS1mb3JjZQoKMC4yNC4wCj09PT09PQotIFRoZSBweXRob24gdGFnIHVzZWQgZm9yIHB1cmUtcHl0aG9uIHBhY2thZ2VzIGlzIG5vdyAucHlOIChtYWpvciB2ZXJzaW9uCiAgb25seSkuIFRoaXMgY2hhbmdlIGFjdHVhbGx5IG9jY3VycmVkIGluIDAuMjMuMCB3aGVuIHRoZSAtLXB5dGhvbi10YWcKICBvcHRpb24gd2FzIGFkZGVkLCBidXQgd2FzIG5vdCBleHBsaWNpdGx5IG1lbnRpb25lZCBpbiB0aGUgY2hhbmdlbG9nIHRoZW4uCi0gd2luaW5zdDJ3aGVlbCBhbmQgZWdnMndoZWVsIHJlbW92ZWQuIFVzZSAid2hlZWwgY29udmVydCBbYXJjaGl2ZV0iCiAgaW5zdGVhZC4KLSBXaGVlbCBub3cgc3VwcG9ydHMgc2V0dXB0b29scyBzdHlsZSBjb25kaXRpb25hbCByZXF1aXJlbWVudHMgdmlhIHRoZQogIGV4dHJhc19yZXF1aXJlPXt9IHN5bnRheC4gU2VwYXJhdGUgJ2V4dHJhJyBuYW1lcyBmcm9tIGNvbmRpdGlvbnMgdXNpbmcKICB0aGUgOiBjaGFyYWN0ZXIuIFdoZWVsJ3Mgb3duIHNldHVwLnB5IGRvZXMgdGhpcy4gKFRoZSBlbXB0eS1zdHJpbmcKICBleHRyYSBpcyB0aGUgc2FtZSBhcyBpbnN0YWxsX3JlcXVpcmVzLikgVGhlc2UgY29uZGl0aW9uYWwgcmVxdWlyZW1lbnRzCiAgc2hvdWxkIHdvcmsgdGhlIHNhbWUgd2hldGhlciB0aGUgcGFja2FnZSBpcyBpbnN0YWxsZWQgYnkgd2hlZWwgb3IKICBieSBzZXR1cC5weS4KCjAuMjMuMAo9PT09PT0KLSBDb21wYXRpYmlsaXR5IHRhZyBmbGFncyBhZGRlZCB0byB0aGUgYmRpc3Rfd2hlZWwgY29tbWFuZAotIHNkaXN0IHNob3VsZCBpbmNsdWRlIGZpbGVzIG5lY2Vzc2FyeSBmb3IgdGVzdHMKLSAnd2hlZWwgY29udmVydCcgY2FuIG5vdyBhbHNvIGNvbnZlcnQgdW5wYWNrZWQgZWdncyB0byB3aGVlbAotIFJlbmFtZSBweWRpc3QuanNvbiB0byBtZXRhZGF0YS5qc29uIHRvIGF2b2lkIHN0ZXBwaW5nIG9uIHRoZSBQRVAKLSBUaGUgLS1za2lwLXNjcmlwdHMgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQsIGFuZCBub3QgZ2VuZXJhdGluZyBzY3JpcHRzIGlzIG5vdwogIHRoZSBkZWZhdWx0LiBUaGUgb3B0aW9uIHdhcyBhIHRlbXBvcmFyeSBhcHByb2FjaCB1bnRpbCBpbnN0YWxsZXJzIGNvdWxkCiAgZ2VuZXJhdGUgc2NyaXB0cyB0aGVtc2VsdmVzLiBUaGF0IGlzIG5vdyB0aGUgY2FzZSB3aXRoIHBpcCAxLjUgYW5kIGxhdGVyLgogIE5vdGUgdGhhdCB1c2luZyBwaXAgMS40IHRvIGluc3RhbGwgYSB3aGVlbCB3aXRob3V0IHNjcmlwdHMgd2lsbCBsZWF2ZSB0aGUKICBpbnN0YWxsYXRpb24gd2l0aG91dCBlbnRyeS1wb2ludCB3cmFwcGVycy4gVGhlICJ3aGVlbCBpbnN0YWxsLXNjcmlwdHMiCiAgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgc2NyaXB0cyBpbiBzdWNoIGNhc2VzLgotIFRoYW5rIHlvdSBjb250cmlidXRvcnMKCjAuMjIuMAo9PT09PT0KLSBJbmNsdWRlIGVudHJ5X3BvaW50cy50eHQsIHNjcmlwdHMgYS5rLmEuIGNvbW1hbmRzLCBpbiBleHBlcmltZW50YWwKICBweWRpc3QuanNvbgotIEltcHJvdmVkIHRlc3RfcmVxdWlyZXMgcGFyc2luZwotIFB5dGhvbiAyLjYgZml4ZXMsICJ3aGVlbCB2ZXJzaW9uIiBjb21tYW5kIGNvdXJ0ZXN5IHBvbWJyZWRhbm5lCgowLjIxLjAKPT09PT09Ci0gUHJlZ2VuZXJhdGVkIHNjcmlwdHMgYXJlIHRoZSBkZWZhdWx0IGFnYWluLgotICJzZXR1cC5weSBiZGlzdF93aGVlbCAtLXNraXAtc2NyaXB0cyIgdHVybnMgdGhlbSBvZmYuCi0gc2V0dXB0b29scyBpcyBubyBsb25nZXIgYSBsaXN0ZWQgcmVxdWlyZW1lbnQgZm9yIHRoZSAnd2hlZWwnCiAgcGFja2FnZS4gSXQgaXMgb2YgY291cnNlIHN0aWxsIHJlcXVpcmVkIGluIG9yZGVyIGZvciBiZGlzdF93aGVlbAogIHRvIHdvcmsuCi0gInB5dGhvbiAtbSB3aGVlbCIgYXZvaWRzIGltcG9ydGluZyBwa2dfcmVzb3VyY2VzIHVudGlsIGl0J3MgbmVjZXNzYXJ5LgoKMC4yMC4wCj09PT09PQotIE5vIGxvbmdlciBpbmNsdWRlIGNvbnNvbGVfc2NyaXB0cyBpbiB3aGVlbHMuIE9yZGluYXJ5IHNjcmlwdHMgKHNoZWxsIGZpbGVzLAogIHN0YW5kYWxvbmUgUHl0aG9uIGZpbGVzKSBhcmUgaW5jbHVkZWQgYXMgdXN1YWwuCi0gSW5jbHVkZSBuZXcgY29tbWFuZCAicHl0aG9uIC1tIHdoZWVsIGluc3RhbGwtc2NyaXB0cyBbZGlzdHJpYnV0aW9uCiAgW2Rpc3RyaWJ1dGlvbiAuLi5dXSIgdG8gaW5zdGFsbCB0aGUgY29uc29sZV9zY3JpcHRzIChzZXR1cHRvb2xzLXN0eWxlCiAgc2NyaXB0cyB1c2luZyBwa2dfcmVzb3VyY2VzKSBmb3IgYSBkaXN0cmlidXRpb24uCgowLjE5LjAKPT09PT09Ci0gcHltZXRhLmpzb24gYmVjb21lcyBweWRpc3QuanNvbgoKMC4xOC4wCj09PT09PQotIFB5dGhvbiAzIFVuaWNvZGUgaW1wcm92ZW1lbnRzCgowLjE3LjAKPT09PT09Ci0gU3VwcG9ydCBsYXRlc3QgUEVQLTQyNiAicHltZXRhLmpzb24iIChqc29uLWZvcm1hdCBtZXRhZGF0YSkKCjAuMTYuMAo9PT09PT0KLSBQeXRob24gMi42IGNvbXBhdGliaWxpdHkgYnVnZml4ICh0aGFua3MgSm9obiBNY0ZhcmxhbmUpCi0gTm9uLXByZXJlbGVhc2UgdmVyc2lvbiBudW1iZXIKCjEuMC4wYTIKPT09PT09PQotIEJ1Z2ZpeCBmb3IgQy1leHRlbnNpb24gdGFncyBmb3IgQ1B5dGhvbiAzLjMgKHVzaW5nIFNPQUJJKQoKMS4wLjBhMQo9PT09PT09Ci0gQnVnZml4IGZvciBiZGlzdF93aW5pbnN0IGNvbnZlcnRlciAid2hlZWwgY29udmVydCIKLSBCdWdmaXggZm9yIGRpc3RzIHdoZXJlICJpcyBwdXJlIiBpcyBOb25lIGluc3RlYWQgb2YgVHJ1ZSBvciBGYWxzZQoKMS4wLjBhMAo9PT09PT09Ci0gVXBkYXRlIGZvciB2ZXJzaW9uIDEuMCBvZiBXaGVlbCAoUEVQIGFjY2VwdGVkKS4KLSBQeXRob24gMyBmaXggZm9yIG1vdmluZyBVbmljb2RlIERlc2NyaXB0aW9uIHRvIG1ldGFkYXRhIGJvZHkKLSBJbmNsdWRlIHJ1ZGltZW50YXJ5IEFQSSBkb2N1bWVudGF0aW9uIGluIFNwaGlueCAodGhhbmtzIEtldmluIEhvcm4pCgowLjE1LjAKPT09PT09Ci0gVmFyaW91cyBpbXByb3ZlbWVudHMKCjAuMTQuMAo9PT09PT0KLSBDaGFuZ2VkIHRoZSBzaWduYXR1cmUgZm9ybWF0IHRvIGJldHRlciBjb21wbHkgd2l0aCB0aGUgY3VycmVudCBKV1Mgc3BlYy4KICBCcmVha3MgYWxsIGV4aXN0aW5nIHNpZ25hdHVyZXMuCi0gSW5jbHVkZSBgYHdoZWVsIHVuc2lnbmBgIGNvbW1hbmQgdG8gcmVtb3ZlIFJFQ09SRC5qd3MgZnJvbSBhbiBhcmNoaXZlLgotIFB1dCB0aGUgZGVzY3JpcHRpb24gaW4gdGhlIG5ld2x5IGFsbG93ZWQgcGF5bG9hZCBzZWN0aW9uIG9mIFBLRy1JTkZPCiAgKE1FVEFEQVRBKSBmaWxlcy4KCjAuMTMuMAo9PT09PT0KLSBVc2UgZGlzdHV0aWxzIGluc3RlYWQgb2Ygc3lzY29uZmlnIHRvIGdldCBpbnN0YWxsYXRpb24gcGF0aHM7IGNhbiBpbnN0YWxsCiAgaGVhZGVycy4KLSBJbXByb3ZlIFdoZWVsRmlsZSgpIHNvcnQuCi0gQWxsb3cgYm9vdHN0cmFwIGluc3RhbGxzIHdpdGhvdXQgYW55IHBrZ19yZXNvdXJjZXMuCgowLjEyLjAKPT09PT09Ci0gVW5pdCB0ZXN0IGZvciB3aGVlbC50b29sLmluc3RhbGwKCjAuMTEuMAo9PT09PT0KLSBBUEkgY2xlYW51cAoKMC4xMC4zCj09PT09PQotIFNjcmlwdHMgZml4ZXIgZml4CgowLjEwLjIKPT09PT09Ci0gRml4IGtleWdlbgoKMC4xMC4xCj09PT09PQotIFByZXNlcnZlIGF0dHJpYnV0ZXMgb24gaW5zdGFsbC4KCjAuMTAuMAo9PT09PT0KLSBJbmNsdWRlIGEgY29weSBvZiBwa2dfcmVzb3VyY2VzLiBXaGVlbCBjYW4gbm93IGluc3RhbGwgaW50byBhIHZpcnR1YWxlbnYKICB0aGF0IGRvZXMgbm90IGhhdmUgZGlzdHJpYnV0ZSAodGhvdWdoIG1vc3QgcGFja2FnZXMgc3RpbGwgcmVxdWlyZQogIHBrZ19yZXNvdXJjZXMgdG8gYWN0dWFsbHkgd29yazsgd2hlZWwgaW5zdGFsbCBkaXN0cmlidXRlKQotIERlZmluZSBhIG5ldyBzZXR1cC5jZmcgc2VjdGlvbiBbd2hlZWxdLiB1bml2ZXJzYWw9MSB3aWxsCiAgYXBwbHkgdGhlIHB5Mi5weTMtbm9uZS1hbnkgdGFnIGZvciBwdXJlIHB5dGhvbiB3aGVlbHMuCgowLjkuNwo9PT09PQotIE9ubHkgaW1wb3J0IGRpcnNwZWMgd2hlbiBuZWVkZWQuIGRpcnNwZWMgaXMgb25seSBuZWVkZWQgdG8gZmluZCB0aGUKICBjb25maWd1cmF0aW9uIGZvciBrZXlnZW4vc2lnbmluZyBvcGVyYXRpb25zLgoKMC45LjYKPT09PT0KLSByZXF1aXJlcy1kaXN0IGZyb20gc2V0dXAuY2ZnIG92ZXJ3cml0ZXMgYW55IHJlcXVpcmVtZW50cyBmcm9tIHNldHVwLnB5CiAgQ2FyZSBtdXN0IGJlIHRha2VuIHRoYXQgdGhlIHJlcXVpcmVtZW50cyBhcmUgdGhlIHNhbWUgaW4gYm90aCBjYXNlcywKICBvciBqdXN0IGFsd2F5cyBpbnN0YWxsIGZyb20gd2hlZWwuCi0gZHJvcCBkaXJzcGVjIHJlcXVpcmVtZW50IG9uIHdpbjMyCi0gaW1wcm92ZWQgY29tbWFuZCBsaW5lIHV0aWxpdHksIGFkZHMgJ3doZWVsIGNvbnZlcnQgW2VnZyBvciB3aW5pbnN0XScgdG8KICBjb252ZXJ0IGxlZ2FjeSBiaW5hcnkgZm9ybWF0cyB0byB3aGVlbAoKMC45LjUKPT09PT0KLSBXaGVlbCdzIG93biB3aGVlbCBmaWxlIGNhbiBiZSBleGVjdXRlZCBieSBQeXRob24sIGFuZCBjYW4gaW5zdGFsbCBpdHNlbGY6CiAgYGBweXRob24gd2hlZWwtMC45LjUtcHkyNy1ub25lLWFueS93aGVlbCBpbnN0YWxsIC4uLmBgCi0gVXNlIGFyZ3BhcnNlOyBiYXNpYyBgYHdoZWVsIGluc3RhbGxgYCBjb21tYW5kIHNob3VsZCBydW4gd2l0aCBvbmx5IHN0ZGxpYgogIGRlcGVuZGVuY2llcy4KLSBBbGxvdyByZXF1aXJlc19kaXN0IGluIHNldHVwLmNmZydzIFttZXRhZGF0YV0gc2VjdGlvbi4gSW4gYWRkaXRpb24gdG8KICBkZXBlbmRlbmNpZXMgaW4gc2V0dXAucHksIGJ1dCB3aWxsIG9ubHkgYmUgaW50ZXJwcmV0ZWQgd2hlbiBpbnN0YWxsaW5nCiAgZnJvbSB3aGVlbCwgbm90IGZyb20gc2Rpc3QuIENhbiBiZSBxdWFsaWZpZWQgd2l0aCBlbnZpcm9ubWVudCBtYXJrZXJzLgoKMC45LjQKPT09PT0KLSBGaXggd2hlZWwuc2lnbmF0dXJlcyBpbiBzZGlzdAoKMC45LjMKPT09PT0KLSBJbnRlZ3JhdGVkIGRpZ2l0YWwgc2lnbmF0dXJlcyBzdXBwb3J0IHdpdGhvdXQgQyBleHRlbnNpb25zLgotIEludGVncmF0ZWQgIndoZWVsIGluc3RhbGwiIGNvbW1hbmQgKHNpbmdsZSBwYWNrYWdlLCBubyBkZXBlbmRlbmN5CiAgcmVzb2x1dGlvbikgaW5jbHVkaW5nIGNvbXBhdGliaWxpdHkgY2hlY2suCi0gU3VwcG9ydCBQeXRob24gMy4zCi0gVXNlIE1ldGFkYXRhIDEuMyAoUEVQIDQyNikKCjAuOS4yCj09PT09Ci0gQXV0b21hdGljIHNpZ25pbmcgaWYgV0hFRUxfVE9PTCBwb2ludHMgdG8gdGhlIHdoZWVsIGJpbmFyeQotIEV2ZW4gbW9yZSBQeXRob24gMyBmaXhlcwoKMC45LjEKPT09PT0KLSAnd2hlZWwgc2lnbicgdXNlcyB0aGUga2V5cyBnZW5lcmF0ZWQgYnkgJ3doZWVsIGtleWdlbicgKGluc3RlYWQgb2YgZ2VuZXJhdGluZwogIGEgbmV3IGtleSBhdCByYW5kb20gZWFjaCB0aW1lKQotIFB5dGhvbiAyLzMgZW5jb2RpbmcvZGVjb2RpbmcgZml4ZXMKLSBSdW4gdGVzdHMgb24gUHl0aG9uIDIuNiAod2l0aG91dCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uKQoKMC45Cj09PQotIFVwZGF0ZWQgZGlnaXRhbCBzaWduYXR1cmVzIHNjaGVtZQotIFB5dGhvbiAzIHN1cHBvcnQgZm9yIGRpZ2l0YWwgc2lnbmF0dXJlcwotIEFsd2F5cyB2ZXJpZnkgUkVDT1JEIGhhc2hlcyBvbiBleHRyYWN0Ci0gIndoZWVsIiBjb21tYW5kIGxpbmUgdG9vbCB0byBzaWduLCB2ZXJpZnksIHVucGFjayB3aGVlbCBmaWxlcwoKMC44Cj09PQotIG5vbmUvYW55IGRyYWZ0IHBlcCB0YWdzIHVwZGF0ZQotIGltcHJvdmVkIHdpbmluc3Qyd2hlZWwgc2NyaXB0Ci0gZG9jIGNoYW5nZXMgYW5kIG90aGVyIGltcHJvdmVtZW50cwoKMC43Cj09PQotIHNvcnQgLmRpc3QtaW5mbyBhdCBlbmQgb2Ygd2hlZWwgYXJjaGl2ZQotIFdpbmRvd3MgJiBQeXRob24gMyBmaXhlcyBmcm9tIFBhdWwgTW9vcmUKLSBwZXA4Ci0gc2NyaXB0cyB0byBjb252ZXJ0IHdpbmluc3QgJiBlZ2cgdG8gd2hlZWwKCjAuNgo9PT0KLSByZXF1aXJlIGRpc3RyaWJ1dGUgPj0gMC42LjI4Ci0gc3RvcCB1c2luZyB2ZXJsaWIKCjAuNQo9PT0KLSB3b3JraW5nIHByZXR0eSB3ZWxsCgowLjQuMgo9PT09PQotIGh5cGhlbmF0ZWQgbmFtZSBmaXgKCjAuNAo9PT0KLSBpbXByb3ZlIHRlc3QgY292ZXJhZ2UKLSBpbXByb3ZlIFdpbmRvd3MgY29tcGF0aWJpbGl0eQotIGluY2x1ZGUgdG94LmluaSBjb3VydGVzeSBvZiBNYXJjIEFicmFtb3dpdHoKLSBkcmFmdCBobWFjIHNoYS0yNTYgc2lnbmluZyBmdW5jdGlvbgoKMC4zCj09PQotIHByb3RvdHlwZSBlZ2cyd2hlZWwgY29udmVyc2lvbiBzY3JpcHQKCjAuMgo9PT0KLSBQeXRob24gMyBjb21wYXRpYmlsaXR5CgowLjEKPT09Ci0gSW5pdGlhbCB2ZXJzaW9uCgoKUEsDBBQAAAAAAAAAIQCnD7sWnQ8AAJ0PAAA0AAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL1JFQ09SRHdoZWVsL19faW5pdF9fLnB5LHNoYTI1Nj1kbWJvVURmcGJXeGVyY1ZYYmJRRUxzVDFMNFpReU9IUXZKS2p2Y0FLWXRjLDk5DQp3aGVlbC9fX21haW5fXy5weSxzaGEyNTY9TGJEREdJZDA4cVR4dWhMWXFYNW1YTzFNVXM5RC1IaHhiNU5WYzUzZWowayw0MTYNCndoZWVsL2FyY2hpdmUucHksc2hhMjU2PU82dVhrLXpKOHk0WS0wckNvSFA3Q0xLbFBwV1FCSDQ0emVSZWdhSzhGSm8sMjI0Nw0Kd2hlZWwvYmRpc3Rfd2hlZWwucHksc2hhMjU2PXVzZEZrWnZRb3BLLVN4XzNsMFRFTTJabTMzQncxQ19vYlRJVXo3Sk03cEksMTg0MDgNCndoZWVsL2RlY29yYXRvci5weSxzaGEyNTY9VTJLNzdaWjh4M3g1dlNJR0NjRWVoOEdBeEI2ckFCQjdBbER3UnVrYW9Dayw1NDENCndoZWVsL2VnZzJ3aGVlbC5weSxzaGEyNTY9LTdNMkpGaTIza1ota2hiTndrMWlWTDhQMTRORmRiQWhNYzFTSGhuWjJmQSwzMDI3DQp3aGVlbC9lZ2duYW1lcy50eHQsc2hhMjU2PVg2TFlzT2pNZDhsbHJ6TG8zU0IzRndKLXVOOUlza0pxWUtKRHEyekljYnMsMjQ5MA0Kd2hlZWwvaW5zdGFsbC5weSxzaGEyNTY9ZENSN0lIbWVBckxqZ2IweUY5WW1NaDNfcUlqLUM5ajFwM3VQU3JwelpPOCwxODA5OA0Kd2hlZWwvbWV0YWRhdGEucHksc2hhMjU2PU96OHgyVkQweExiYVdIMDZ5VFJDYjN2U2RXbld2cFBPd1kybzlEOGlGR1UsMTE2NzYNCndoZWVsL3BhdGhzLnB5LHNoYTI1Nj02QW1HLU1LeC1OZUpPQzl6VUpvU1NaalloWllHbVgxVUhHX04wSWJrcGxJLDExMzANCndoZWVsL3BlcDQyNXRhZ3MucHksc2hhMjU2PXBBMWV5YjFIT0Ftd1NpWFRtZlFobUFja2Zrbmh0RWVsTERaT2NWS1phRTAsNTgyOQ0Kd2hlZWwvcGtnaW5mby5weSxzaGEyNTY9LWdMT1R1UXJrUmY0Z2VPRDA0cW0wSVVrZFlBYmpnODFqLTV6TnR2V0E5QSwxMjI1DQp3aGVlbC91dGlsLnB5LHNoYTI1Nj1QZTJKWjlnck5qbUFjUlJKYXkyMEZsRFZKVWJlUFdhUjVsdHlTbzNjNnpRLDQ4OTANCndoZWVsL3dpbmluc3Qyd2hlZWwucHksc2hhMjU2PXhWZkVFS2JTNGhNcHYtd2dPUWliNG4wcFNwZ3Jwam5yQkRIMkpEU05jckUsNzg2Mw0Kd2hlZWwvc2lnbmF0dXJlcy9fX2luaXRfXy5weSxzaGEyNTY9a1pwS05zbXhCRFpodVhmODVfdXl5NXFCSDQwQXhWVF8wdXRiQWlUcF95ZywzNzc5DQp3aGVlbC9zaWduYXR1cmVzL2RqYmVjLnB5LHNoYTI1Nj01M0hUbmxObGZxT0hGRGY4T1lfNktMOHN4UjRzd2lMc1doVWp0dzNXM25JLDY3NTUNCndoZWVsL3NpZ25hdHVyZXMvZWQyNTUxOXB5LnB5LHNoYTI1Nj1TZVR4aU1aN2ttb01kSXVyQlNhS2I4S3UtYW1HbmY2WlRSR0VsTHpWOGlJLDE2OTUNCndoZWVsL3NpZ25hdHVyZXMva2V5cy5weSxzaGEyNTY9UThGTFZ5NWRpeERpeS01b19SbWxzRGhnWWRFclRDcDVjM1o4eDcwWDFzZywzMzE2DQp3aGVlbC90ZXN0L19faW5pdF9fLnB5LHNoYTI1Nj1NME5adVE3LTExMmw4SzJoMWVheVZ2U212UXJ1ZnJPY0Q1QVlLZ0lmX0lzLDENCndoZWVsL3Rlc3QvY29uZnRlc3QucHksc2hhMjU2PVM3M25IdG90UnI2X09HQlhtZVdQVmRqVm1WS1phejR1aTRMUFlkMGFQOVUsMTY4OQ0Kd2hlZWwvdGVzdC9weWRpc3Qtc2NoZW1hLmpzb24sc2hhMjU2PXluRXZOdlRoQzF6UmE3RmlvTXNXM2stOW5sOTh5dEVvbzFfM3hiT1AyZW8sMTE0ODMNCndoZWVsL3Rlc3QvdGVzdC0xLjAtcHkyLnB5My1ub25lLXdpbjMyLndobCxzaGEyNTY9SkNfVVhUTjVLbExyZHU0M3VINGNhWlNVeXpydFBjVXNSZS12VE11bnBsRSw1MjI2DQp3aGVlbC90ZXN0L3Rlc3RfYmFzaWMucHksc2hhMjU2PWExdVJ1NE1aUGJFRUt5VXNLWXZHdHo0cWo0S1gzRTc3VjZKbVhKTGRYLWssNjUwOQ0Kd2hlZWwvdGVzdC90ZXN0X2luc3RhbGwucHksc2hhMjU2PWMwRUVDWFBrVklHaENEOVY1YWQycXNCUFJQWWIxZWhoYVMwazZHdjVKUWMsMTg2Ng0Kd2hlZWwvdGVzdC90ZXN0X2tleXMucHksc2hhMjU2PTVtQmM5dGYyVHdDM1RDcHgxeVNUWXNDZTV5dmQ2a01LNjRBbFVVQ2NLRVksMjU3NQ0Kd2hlZWwvdGVzdC90ZXN0X3BhdGhzLnB5LHNoYTI1Nj0tUU9WVURGSklwRjlPUE5SekNKLVhmNG5CaWJLbFVlX2c0YWFaNnNtM3dFLDE3Mg0Kd2hlZWwvdGVzdC90ZXN0X3JhbmtpbmcucHksc2hhMjU2PUZTQVFYNG9IWjQ3NmpMZGRxVk1sR21RRnRiRWVsOWE4U3pPbmdKMDNUSncsMTQ5Ng0Kd2hlZWwvdGVzdC90ZXN0X3NpZ25hdHVyZXMucHksc2hhMjU2PVo0UkVYajYycDI4Z2JTREIyRF9PeG9wQS1UVFhJQ1RaNWUyeVozZWpFVmMsMTEyMA0Kd2hlZWwvdGVzdC90ZXN0X3RhZ29wdC5weSxzaGEyNTY9dDdBLWlSYmUzYkgySXo2TktkU0VPcEZGSUZTRjlJNEFUbWxyUkJYb0NjUSw1OTI3DQp3aGVlbC90ZXN0L3Rlc3RfdG9vbC5weSxzaGEyNTY9eXQ1ZEFyOG1wNTFXb0R6dDBNbWx3UGsweGY3RnZYQWVkeS1ZbE5aWHYxSSw2NTYNCndoZWVsL3Rlc3QvdGVzdF93aGVlbGZpbGUucHksc2hhMjU2PXg0ZXh6UVl1UUI0OFlIcWhVMk5aeU43NmstQlNLNjc4NC03cnllMHE2U3MsNDU4NQ0Kd2hlZWwvdGVzdC9jb21wbGV4LWRpc3Qvc2V0dXAucHksc2hhMjU2PTRpMV9BSm9KeG80aTZpay1tdnlkbzIzQUY4Qkh6am1BRVFZYTVKNFlQSzQsODU1DQp3aGVlbC90ZXN0L2NvbXBsZXgtZGlzdC9jb21wbGV4ZGlzdC9fX2luaXRfXy5weSxzaGEyNTY9UEdESldRVHhqTFhxbk5yYnFtVEtLX3lrNkRWUUJOZVJwLVlwUDd3MXJWaywyMw0Kd2hlZWwvdGVzdC9leHRlbnNpb24uZGlzdC9zZXR1cC5weSxzaGEyNTY9cGRSbC13dnE1T1ZNRzA0M1hyV1p3ejRmaXZGWldkV01Od0w4ZHlLYlQwYyw0NTYNCndoZWVsL3Rlc3QvaGVhZGVycy5kaXN0L2hlYWRlci5oLHNoYTI1Nj00N0RFUXBqOEhCU2EtX1RJbVctNUpDZXVRZVJrbTVOTXBKV1pHM2hTdUZVLDANCndoZWVsL3Rlc3QvaGVhZGVycy5kaXN0L2hlYWRlcnNkaXN0LnB5LHNoYTI1Nj00N0RFUXBqOEhCU2EtX1RJbVctNUpDZXVRZVJrbTVOTXBKV1pHM2hTdUZVLDANCndoZWVsL3Rlc3QvaGVhZGVycy5kaXN0L3NldHVwLnB5LHNoYTI1Nj1wM2Q5VEd5N05MWDZUbmtCSG5OSHplZHFZb09rZEdRdndoZXlEUWpmLUpRLDMyNA0Kd2hlZWwvdGVzdC9zaW1wbGUuZGlzdC9zZXR1cC5weSxzaGEyNTY9OHpXZW43MVVtLWlOX0E1dGhvdDZWRm9ncmtXc19SR1ZPLWpyX014a0ZvZywzODMNCndoZWVsL3Rlc3Qvc2ltcGxlLmRpc3Qvc2ltcGxlZGlzdC9fX2luaXRfXy5weSxzaGEyNTY9NDdERVFwajhIQlNhLV9USW1XLTVKQ2V1UWVSa201Tk1wSldaRzNoU3VGVSwwDQp3aGVlbC90b29sL19faW5pdF9fLnB5LHNoYTI1Nj1wMHVubDlNZ3Jia1pZVk9EVnhFS01XUkk5WWExTV91WGNxWG5YSHpJNERrLDEzMjE3DQp3aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vREVTQ1JJUFRJT04ucnN0LHNoYTI1Nj1KSDZtb2dVSWF0UVZRZXdJaDRHQjF5d0N4dVdibTdHNFRqSV82M2RVUnA4LDk4MTMNCndoZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9MSUNFTlNFLnR4dCxzaGEyNTY9ektuaURHcnhfUHYybEFqemQzYVNoc3Z1dk43VE5oQU1tMG9fTmZ2bU5lUSwxMTI1DQp3aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vTUVUQURBVEEsc2hhMjU2PWl4OXpONWZhNGplT0RRcm42NGZVQVFhX3Vscm1ScGhpNFNLSEFZVXF0TncsMTEwMjENCndoZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9SRUNPUkQsLA0Kd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL1dIRUVMLHNoYTI1Nj01d3ZmQjdHdmdaQWJLQlNFOXVYOVpiaTZMQ0wtX0tnZXpnSGJsWGhDUm5NLDExMw0Kd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHQsc2hhMjU2PXBUeWVHVnN1Y3lmcl9CWGU1T1FLdUExQnA1WUthSUFXeTVwZWprcTRReDAsMTA5DQp3aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vbWV0YWRhdGEuanNvbixzaGEyNTY9eF9tWmpMek9hWWNlem1uclN2RzY3ZDA3U2hwY1JGZHJnV2VVZTZ6cEw1WSwxNjI2DQp3aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vdG9wX2xldmVsLnR4dCxzaGEyNTY9SHhTQkliZ0VzdE1QZTRlRmF3aEE2Nk1xLVFZSE1vcFhWb0FuY2ZqYl8xYyw2DQpQSwMEFAAAAAAAAAAhAJTflntxAAAAcQAAADMAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vV0hFRUxXaGVlbC1WZXJzaW9uOiAxLjAKR2VuZXJhdG9yOiBiZGlzdF93aGVlbCAoMC4zMC4wLmEwKQpSb290LUlzLVB1cmVsaWI6IHRydWUKVGFnOiBweTItbm9uZS1hbnkKVGFnOiBweTMtbm9uZS1hbnkKClBLAwQUAAAAAAAAACEA4kXfrG0AAABtAAAAPgAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9lbnRyeV9wb2ludHMudHh0W2NvbnNvbGVfc2NyaXB0c10Kd2hlZWwgPSB3aGVlbC50b29sOm1haW4KCltkaXN0dXRpbHMuY29tbWFuZHNdCmJkaXN0X3doZWVsID0gd2hlZWwuYmRpc3Rfd2hlZWw6YmRpc3Rfd2hlZWwKClBLAwQUAAAAAAAAACEAUrJO1loGAABaBgAAOwAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9tZXRhZGF0YS5qc29ueyJjbGFzc2lmaWVycyI6IFsiRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDQgLSBCZXRhIiwgIkludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjYiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy4yIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjMiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNCJdLCAiZXh0ZW5zaW9ucyI6IHsicHl0aG9uLmNvbW1hbmRzIjogeyJ3cmFwX2NvbnNvbGUiOiB7IndoZWVsIjogIndoZWVsLnRvb2w6bWFpbiJ9fSwgInB5dGhvbi5kZXRhaWxzIjogeyJjb250YWN0cyI6IFt7ImVtYWlsIjogImRob2x0aEBmYXN0bWFpbC5mbSIsICJuYW1lIjogIkRhbmllbCBIb2x0aCIsICJyb2xlIjogImF1dGhvciJ9XSwgImRvY3VtZW50X25hbWVzIjogeyJkZXNjcmlwdGlvbiI6ICJERVNDUklQVElPTi5yc3QiLCAibGljZW5zZSI6ICJMSUNFTlNFLnR4dCJ9LCAicHJvamVjdF91cmxzIjogeyJIb21lIjogImh0dHBzOi8vYml0YnVja2V0Lm9yZy9weXBhL3doZWVsLyJ9fSwgInB5dGhvbi5leHBvcnRzIjogeyJjb25zb2xlX3NjcmlwdHMiOiB7IndoZWVsIjogIndoZWVsLnRvb2w6bWFpbiJ9LCAiZGlzdHV0aWxzLmNvbW1hbmRzIjogeyJiZGlzdF93aGVlbCI6ICJ3aGVlbC5iZGlzdF93aGVlbDpiZGlzdF93aGVlbCJ9fX0sICJleHRyYXMiOiBbImZhc3Rlci1zaWduYXR1cmVzIiwgInNpZ25hdHVyZXMiLCAidG9vbCJdLCAiZ2VuZXJhdG9yIjogImJkaXN0X3doZWVsICgwLjMwLjAuYTApIiwgImtleXdvcmRzIjogWyJ3aGVlbCIsICJwYWNrYWdpbmciXSwgImxpY2Vuc2UiOiAiTUlUIiwgIm1ldGFkYXRhX3ZlcnNpb24iOiAiMi4wIiwgIm5hbWUiOiAid2hlZWwiLCAicnVuX3JlcXVpcmVzIjogW3siZXh0cmEiOiAiZmFzdGVyLXNpZ25hdHVyZXMiLCAicmVxdWlyZXMiOiBbImVkMjU1MTlsbCJdfSwgeyJleHRyYSI6ICJzaWduYXR1cmVzIiwgInJlcXVpcmVzIjogWyJrZXlyaW5nIiwgImtleXJpbmdzLmFsdCJdfSwgeyJlbnZpcm9ubWVudCI6ICJweXRob25fdmVyc2lvbj09XCIyLjZcIiIsICJyZXF1aXJlcyI6IFsiYXJncGFyc2UiXX0sIHsiZW52aXJvbm1lbnQiOiAicHl0aG9uX3ZlcnNpb249PVwiMi42XCIiLCAiZXh0cmEiOiAic2lnbmF0dXJlcyIsICJyZXF1aXJlcyI6IFsiaW1wb3J0bGliIl19LCB7ImVudmlyb25tZW50IjogInN5c19wbGF0Zm9ybSE9XCJ3aW4zMlwiIiwgImV4dHJhIjogInNpZ25hdHVyZXMiLCAicmVxdWlyZXMiOiBbInB5eGRnIl19XSwgInN1bW1hcnkiOiAiQSBidWlsdC1wYWNrYWdlIGZvcm1hdCBmb3IgUHl0aG9uLiIsICJ0ZXN0X3JlcXVpcmVzIjogW3sicmVxdWlyZXMiOiBbImNvdmVyYWdlIiwgImpzb25zY2hlbWEiLCAicHl0ZXN0IiwgInB5dGVzdC1jb3YiXX1dLCAidmVyc2lvbiI6ICIwLjMwLjBhMCJ9UEsDBBQAAAAAAAAAIQAZY95lBgAAAAYAAAA7AAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHR3aGVlbApQSwMEFAAAAAAAAAAhAGE3pUdjAAAAYwAAACYAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9fX2luaXRfXy5weSMgX192YXJpYWJsZXNfXyB3aXRoIGRvdWJsZS1xdW90ZWQgdmFsdWVzIHdpbGwgYmUgYXZhaWxhYmxlIGluIHNldHVwLnB5OgpfX3ZlcnNpb25fXyA9ICIwLjMwLjAuYTAiClBLAwQUAAAAAAAAACEAJGm3VKABAACgAQAAJgAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL19fbWFpbl9fLnB5IiIiCldoZWVsIGNvbW1hbmQgbGluZSB0b29sIChlbmFibGUgcHl0aG9uIC1tIHdoZWVsIHN5bnRheCkKIiIiCgppbXBvcnQgc3lzCgpkZWYgbWFpbigpOiAjIG5lZWRlZCBmb3IgY29uc29sZSBzY3JpcHQKICAgIGlmIF9fcGFja2FnZV9fID09ICcnOgogICAgICAgICMgVG8gYmUgYWJsZSB0byBydW4gJ3B5dGhvbiB3aGVlbC0wLjkud2hsL3doZWVsJzoKICAgICAgICBpbXBvcnQgb3MucGF0aAogICAgICAgIHBhdGggPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKICAgICAgICBzeXMucGF0aFswOjBdID0gW3BhdGhdCiAgICBpbXBvcnQgd2hlZWwudG9vbAogICAgc3lzLmV4aXQod2hlZWwudG9vbC5tYWluKCkpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgc3lzLmV4aXQobWFpbigpKQpQSwMEFAAAAAAAAAAhACBTglLHCAAAxwgAACUAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9hcmNoaXZlLnB5IiIiCkFyY2hpdmUgdG9vbHMgZm9yIHdoZWVsLgoiIiIKCmltcG9ydCBvcwppbXBvcnQgdGltZQppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MucGF0aAppbXBvcnQgemlwZmlsZQoKbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoIndoZWVsIikKCgpkZWYgYXJjaGl2ZV93aGVlbGZpbGUoYmFzZV9uYW1lLCBiYXNlX2Rpcik6CiAgICAnJydBcmNoaXZlIGFsbCBmaWxlcyB1bmRlciBgYmFzZV9kaXJgIGluIGEgd2hsIGZpbGUgYW5kIG5hbWUgaXQgbGlrZQogICAgYGJhc2VfbmFtZWAuCiAgICAnJycKICAgIG9sZGRpciA9IG9zLnBhdGguYWJzcGF0aChvcy5jdXJkaXIpCiAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmFic3BhdGgoYmFzZV9uYW1lKQogICAgdHJ5OgogICAgICAgIG9zLmNoZGlyKGJhc2VfZGlyKQogICAgICAgIHJldHVybiBtYWtlX3doZWVsZmlsZV9pbm5lcihiYXNlX25hbWUpCiAgICBmaW5hbGx5OgogICAgICAgIG9zLmNoZGlyKG9sZGRpcikKCgpkZWYgbWFrZV93aGVlbGZpbGVfaW5uZXIoYmFzZV9uYW1lLCBiYXNlX2Rpcj0nLicpOgogICAgIiIiQ3JlYXRlIGEgd2hsIGZpbGUgZnJvbSBhbGwgdGhlIGZpbGVzIHVuZGVyICdiYXNlX2RpcicuCgogICAgUGxhY2VzIC5kaXN0LWluZm8gYXQgdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZS4iIiIKCiAgICB6aXBfZmlsZW5hbWUgPSBiYXNlX25hbWUgKyAiLndobCIKCiAgICBsb2cuaW5mbygiY3JlYXRpbmcgJyVzJyBhbmQgYWRkaW5nICclcycgdG8gaXQiLCB6aXBfZmlsZW5hbWUsIGJhc2VfZGlyKQoKICAgICMgU29tZSBhcHBsaWNhdGlvbnMgbmVlZCByZXByb2R1Y2libGUgLndobCBmaWxlcywgYnV0IHRoZXkgY2FuJ3QgZG8gdGhpcwogICAgIyB3aXRob3V0IGZvcmNpbmcgdGhlIHRpbWVzdGFtcCBvZiB0aGUgaW5kaXZpZHVhbCBaaXBJbmZvIG9iamVjdHMuICBTZWUKICAgICMgaXNzdWUgIzE0My4KICAgIHRpbWVzdGFtcCA9IG9zLmVudmlyb24uZ2V0KCdTT1VSQ0VfREFURV9FUE9DSCcpCiAgICBpZiB0aW1lc3RhbXAgaXMgTm9uZToKICAgICAgICBkYXRlX3RpbWUgPSBOb25lCiAgICBlbHNlOgogICAgICAgIGRhdGVfdGltZSA9IHRpbWUuZ210aW1lKGludCh0aW1lc3RhbXApKVswOjZdCgogICAgIyBYWFggc3VwcG9ydCBiejIsIHh6IHdoZW4gYXZhaWxhYmxlCiAgICB6aXAgPSB6aXBmaWxlLlppcEZpbGUoemlwX2ZpbGVuYW1lLCAidyIsIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX0RFRkxBVEVEKQoKICAgIHNjb3JlID0geydXSEVFTCc6IDEsICdNRVRBREFUQSc6IDIsICdSRUNPUkQnOiAzfQogICAgZGVmZXJyZWQgPSBbXQoKICAgIGRlZiB3cml0ZWZpbGUocGF0aCwgZGF0ZV90aW1lKToKICAgICAgICBzdCA9IG9zLnN0YXQocGF0aCkKICAgICAgICBpZiBkYXRlX3RpbWUgaXMgTm9uZToKICAgICAgICAgICAgbXRpbWUgPSB0aW1lLmdtdGltZShzdC5zdF9tdGltZSkKICAgICAgICAgICAgZGF0ZV90aW1lID0gbXRpbWVbMDo2XQogICAgICAgIHppbmZvID0gemlwZmlsZS5aaXBJbmZvKHBhdGgsIGRhdGVfdGltZSkKICAgICAgICB6aW5mby5leHRlcm5hbF9hdHRyID0gc3Quc3RfbW9kZSA8PCAxNgogICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSB6aXBmaWxlLlpJUF9ERUZMQVRFRAogICAgICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBmcDoKICAgICAgICAgICAgemlwLndyaXRlc3RyKHppbmZvLCBmcC5yZWFkKCkpCiAgICAgICAgbG9nLmluZm8oImFkZGluZyAnJXMnIiAlIHBhdGgpCgogICAgZm9yIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhiYXNlX2Rpcik6CiAgICAgICAgZm9yIG5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oZGlycGF0aCwgbmFtZSkpCgogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKICAgICAgICAgICAgICAgIGlmIGRpcnBhdGguZW5kc3dpdGgoJy5kaXN0LWluZm8nKToKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5hcHBlbmQoKHNjb3JlLmdldChuYW1lLCAwKSwgcGF0aCkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHdyaXRlZmlsZShwYXRoLCBkYXRlX3RpbWUpCgogICAgZGVmZXJyZWQuc29ydCgpCiAgICBmb3Igc2NvcmUsIHBhdGggaW4gZGVmZXJyZWQ6CiAgICAgICAgd3JpdGVmaWxlKHBhdGgsIGRhdGVfdGltZSkKCiAgICB6aXAuY2xvc2UoKQoKICAgIHJldHVybiB6aXBfZmlsZW5hbWUKUEsDBBQAAAAAAAAAIQBKryTR6EcAAOhHAAApAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvYmRpc3Rfd2hlZWwucHkiIiIKQ3JlYXRlIGEgd2hlZWwgKC53aGwpIGRpc3RyaWJ1dGlvbi4KCkEgd2hlZWwgaXMgYSBidWlsdCBhcmNoaXZlIGZvcm1hdC4KIiIiCgppbXBvcnQgY3N2CmltcG9ydCBoYXNobGliCmltcG9ydCBvcwppbXBvcnQgc3VicHJvY2VzcwppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHNodXRpbAppbXBvcnQganNvbgppbXBvcnQgc3lzCmltcG9ydCByZQoKdHJ5OgogICAgaW1wb3J0IHN5c2NvbmZpZwpleGNlcHQgSW1wb3J0RXJyb3I6ICAjIHByYWdtYSBub2NvdmVyCiAgICAjIFB5dGhvbiA8IDIuNwogICAgaW1wb3J0IGRpc3R1dGlscy5zeXNjb25maWcgYXMgc3lzY29uZmlnCgppbXBvcnQgcGtnX3Jlc291cmNlcwoKc2FmZV9uYW1lID0gcGtnX3Jlc291cmNlcy5zYWZlX25hbWUKc2FmZV92ZXJzaW9uID0gcGtnX3Jlc291cmNlcy5zYWZlX3ZlcnNpb24KCmZyb20gc2h1dGlsIGltcG9ydCBybXRyZWUKZnJvbSBlbWFpbC5nZW5lcmF0b3IgaW1wb3J0IEdlbmVyYXRvcgoKZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgQ29tbWFuZApmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGdldF9weXRob25fdmVyc2lvbgoKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZyBhcyBsb2dnZXIKCmZyb20gLnBlcDQyNXRhZ3MgaW1wb3J0IGdldF9hYmJyX2ltcGwsIGdldF9pbXBsX3ZlciwgZ2V0X2FiaV90YWcsIGdldF9wbGF0Zm9ybQpmcm9tIC51dGlsIGltcG9ydCBuYXRpdmUsIG9wZW5fZm9yX2Nzdgpmcm9tIC5hcmNoaXZlIGltcG9ydCBhcmNoaXZlX3doZWVsZmlsZQpmcm9tIC5wa2dpbmZvIGltcG9ydCByZWFkX3BrZ19pbmZvLCB3cml0ZV9wa2dfaW5mbwpmcm9tIC5tZXRhZGF0YSBpbXBvcnQgcGtnaW5mb190b19kaWN0CmZyb20gLiBpbXBvcnQgcGVwNDI1dGFncywgbWV0YWRhdGEKZnJvbSAuIGltcG9ydCBfX3ZlcnNpb25fXyBhcyB3aGVlbF92ZXJzaW9uCgpQWV9MSU1JVEVEX0FQSV9QQVRURVJOID0gcidjcDNcZCcKCmRlZiBzYWZlcl9uYW1lKG5hbWUpOgogICAgcmV0dXJuIHNhZmVfbmFtZShuYW1lKS5yZXBsYWNlKCctJywgJ18nKQoKZGVmIHNhZmVyX3ZlcnNpb24odmVyc2lvbik6CiAgICByZXR1cm4gc2FmZV92ZXJzaW9uKHZlcnNpb24pLnJlcGxhY2UoJy0nLCAnXycpCgpjbGFzcyBiZGlzdF93aGVlbChDb21tYW5kKToKCiAgICBkZXNjcmlwdGlvbiA9ICdjcmVhdGUgYSB3aGVlbCBkaXN0cmlidXRpb24nCgogICAgdXNlcl9vcHRpb25zID0gWygnYmRpc3QtZGlyPScsICdiJywKICAgICAgICAgICAgICAgICAgICAgInRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNyZWF0aW5nIHRoZSBkaXN0cmlidXRpb24iKSwKICAgICAgICAgICAgICAgICAgICAoJ3BsYXQtbmFtZT0nLCAncCcsCiAgICAgICAgICAgICAgICAgICAgICJwbGF0Zm9ybSBuYW1lIHRvIGVtYmVkIGluIGdlbmVyYXRlZCBmaWxlbmFtZXMgIgogICAgICAgICAgICAgICAgICAgICAiKGRlZmF1bHQ6ICVzKSIgJSBnZXRfcGxhdGZvcm0oKSksCiAgICAgICAgICAgICAgICAgICAgKCdrZWVwLXRlbXAnLCAnaycsCiAgICAgICAgICAgICAgICAgICAgICJrZWVwIHRoZSBwc2V1ZG8taW5zdGFsbGF0aW9uIHRyZWUgYXJvdW5kIGFmdGVyICIgKwogICAgICAgICAgICAgICAgICAgICAiY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiBhcmNoaXZlIiksCiAgICAgICAgICAgICAgICAgICAgKCdkaXN0LWRpcj0nLCAnZCcsCiAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RvcnkgdG8gcHV0IGZpbmFsIGJ1aWx0IGRpc3RyaWJ1dGlvbnMgaW4iKSwKICAgICAgICAgICAgICAgICAgICAoJ3NraXAtYnVpbGQnLCBOb25lLAogICAgICAgICAgICAgICAgICAgICAic2tpcCByZWJ1aWxkaW5nIGV2ZXJ5dGhpbmcgKGZvciB0ZXN0aW5nL2RlYnVnZ2luZykiKSwKICAgICAgICAgICAgICAgICAgICAoJ3JlbGF0aXZlJywgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgImJ1aWxkIHRoZSBhcmNoaXZlIHVzaW5nIHJlbGF0aXZlIHBhdGhzIgogICAgICAgICAgICAgICAgICAgICAiKGRlZmF1bHQ6IGZhbHNlKSIpLAogICAgICAgICAgICAgICAgICAgICgnb3duZXI9JywgJ3UnLAogICAgICAgICAgICAgICAgICAgICAiT3duZXIgbmFtZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0YXIgZmlsZSIKICAgICAgICAgICAgICAgICAgICAgIiBbZGVmYXVsdDogY3VycmVudCB1c2VyXSIpLAogICAgICAgICAgICAgICAgICAgICgnZ3JvdXA9JywgJ2cnLAogICAgICAgICAgICAgICAgICAgICAiR3JvdXAgbmFtZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0YXIgZmlsZSIKICAgICAgICAgICAgICAgICAgICAgIiBbZGVmYXVsdDogY3VycmVudCBncm91cF0iKSwKICAgICAgICAgICAgICAgICAgICAoJ3VuaXZlcnNhbCcsIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICJtYWtlIGEgdW5pdmVyc2FsIHdoZWVsIgogICAgICAgICAgICAgICAgICAgICAiIChkZWZhdWx0OiBmYWxzZSkiKSwKICAgICAgICAgICAgICAgICAgICAoJ3B5dGhvbi10YWc9JywgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiBpbXBsZW1lbnRhdGlvbiBjb21wYXRpYmlsaXR5IHRhZyIKICAgICAgICAgICAgICAgICAgICAgIiAoZGVmYXVsdDogcHklcykiICUgZ2V0X2ltcGxfdmVyKClbMF0pLAogICAgICAgICAgICAgICAgICAgICgncHktbGltaXRlZC1hcGk9JywgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiB0YWcgKGNwMzJ8Y3AzM3xjcE5OKSBmb3IgYWJpMyB3aGVlbCB0YWciCiAgICAgICAgICAgICAgICAgICAgICIgKGRlZmF1bHQ6IGZhbHNlKSIpLAogICAgICAgICAgICAgICAgICAgIF0KCiAgICBib29sZWFuX29wdGlvbnMgPSBbJ2tlZXAtdGVtcCcsICdza2lwLWJ1aWxkJywgJ3JlbGF0aXZlJywgJ3VuaXZlcnNhbCddCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLmJkaXN0X2RpciA9IE5vbmUKICAgICAgICBzZWxmLmRhdGFfZGlyID0gTm9uZQogICAgICAgIHNlbGYucGxhdF9uYW1lID0gTm9uZQogICAgICAgIHNlbGYucGxhdF90YWcgPSBOb25lCiAgICAgICAgc2VsZi5mb3JtYXQgPSAnemlwJwogICAgICAgIHNlbGYua2VlcF90ZW1wID0gRmFsc2UKICAgICAgICBzZWxmLmRpc3RfZGlyID0gTm9uZQogICAgICAgIHNlbGYuZGlzdGluZm9fZGlyID0gTm9uZQogICAgICAgIHNlbGYuZWdnaW5mb19kaXIgPSBOb25lCiAgICAgICAgc2VsZi5yb290X2lzX3B1cmUgPSBOb25lCiAgICAgICAgc2VsZi5za2lwX2J1aWxkID0gTm9uZQogICAgICAgIHNlbGYucmVsYXRpdmUgPSBGYWxzZQogICAgICAgIHNlbGYub3duZXIgPSBOb25lCiAgICAgICAgc2VsZi5ncm91cCA9IE5vbmUKICAgICAgICBzZWxmLnVuaXZlcnNhbCA9IEZhbHNlCiAgICAgICAgc2VsZi5weXRob25fdGFnID0gJ3B5JyArIGdldF9pbXBsX3ZlcigpWzBdCiAgICAgICAgc2VsZi5weV9saW1pdGVkX2FwaSA9IEZhbHNlCiAgICAgICAgc2VsZi5wbGF0X25hbWVfc3VwcGxpZWQgPSBGYWxzZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIGlmIHNlbGYuYmRpc3RfZGlyIGlzIE5vbmU6CiAgICAgICAgICAgIGJkaXN0X2Jhc2UgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYmRpc3QnKS5iZGlzdF9iYXNlCiAgICAgICAgICAgIHNlbGYuYmRpc3RfZGlyID0gb3MucGF0aC5qb2luKGJkaXN0X2Jhc2UsICd3aGVlbCcpCgogICAgICAgIHNlbGYuZGF0YV9kaXIgPSBzZWxmLndoZWVsX2Rpc3RfbmFtZSArICcuZGF0YScKICAgICAgICBzZWxmLnBsYXRfbmFtZV9zdXBwbGllZCA9IHNlbGYucGxhdF9uYW1lIGlzIG5vdCBOb25lCgogICAgICAgIG5lZWRfb3B0aW9ucyA9ICgnZGlzdF9kaXInLCAncGxhdF9uYW1lJywgJ3NraXBfYnVpbGQnKQoKICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnYmRpc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp6aXAobmVlZF9vcHRpb25zLCBuZWVkX29wdGlvbnMpKQoKICAgICAgICBzZWxmLnJvb3RfaXNfcHVyZSA9IG5vdCAoc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igc2VsZi5kaXN0cmlidXRpb24uaGFzX2NfbGlicmFyaWVzKCkpCgogICAgICAgIGlmIHNlbGYucHlfbGltaXRlZF9hcGkgYW5kIG5vdCByZS5tYXRjaChQWV9MSU1JVEVEX0FQSV9QQVRURVJOLCBzZWxmLnB5X2xpbWl0ZWRfYXBpKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicHktbGltaXRlZC1hcGkgbXVzdCBtYXRjaCAnJXMnIiAlIFBZX0xJTUlURURfQVBJX1BBVFRFUk4pCgogICAgICAgICMgU3VwcG9ydCBsZWdhY3kgW3doZWVsXSBzZWN0aW9uIGZvciBzZXR0aW5nIHVuaXZlcnNhbAogICAgICAgIHdoZWVsID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X29wdGlvbl9kaWN0KCd3aGVlbCcpCiAgICAgICAgaWYgJ3VuaXZlcnNhbCcgaW4gd2hlZWw6CiAgICAgICAgICAgICMgcGxlYXNlIGRvbid0IGRlZmluZSB0aGlzIGluIHlvdXIgZ2xvYmFsIGNvbmZpZ3MKICAgICAgICAgICAgdmFsID0gd2hlZWxbJ3VuaXZlcnNhbCddWzFdLnN0cmlwKCkKICAgICAgICAgICAgaWYgdmFsLmxvd2VyKCkgaW4gKCcxJywgJ3RydWUnLCAneWVzJyk6CiAgICAgICAgICAgICAgICBzZWxmLnVuaXZlcnNhbCA9IFRydWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiB3aGVlbF9kaXN0X25hbWUoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGRpc3RyaWJ1dGlvbiBmdWxsIG5hbWUgd2l0aCAtIHJlcGxhY2VkIHdpdGggXyIiIgogICAgICAgIHJldHVybiAnLScuam9pbigoc2FmZXJfbmFtZShzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVyX3ZlcnNpb24oc2VsZi5kaXN0cmlidXRpb24uZ2V0X3ZlcnNpb24oKSkpKQoKICAgIGRlZiBnZXRfdGFnKHNlbGYpOgogICAgICAgICMgYmRpc3Qgc2V0cyBzZWxmLnBsYXRfbmFtZSBpZiB1bnNldCwgd2Ugc2hvdWxkIG9ubHkgdXNlIGl0IGZvciBwdXJlcHkKICAgICAgICAjIHdoZWVscyBpZiB0aGUgdXNlciBzdXBwbGllZCBpdC4KICAgICAgICBpZiBzZWxmLnBsYXRfbmFtZV9zdXBwbGllZDoKICAgICAgICAgICAgcGxhdF9uYW1lID0gc2VsZi5wbGF0X25hbWUKICAgICAgICBlbGlmIHNlbGYucm9vdF9pc19wdXJlOgogICAgICAgICAgICBwbGF0X25hbWUgPSAnYW55JwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBsYXRfbmFtZSA9IHNlbGYucGxhdF9uYW1lIG9yIGdldF9wbGF0Zm9ybSgpCiAgICAgICAgICAgIGlmIHBsYXRfbmFtZSBpbiAoJ2xpbnV4LXg4Nl82NCcsICdsaW51eF94ODZfNjQnKSBhbmQgc3lzLm1heHNpemUgPT0gMjE0NzQ4MzY0NzoKICAgICAgICAgICAgICAgIHBsYXRfbmFtZSA9ICdsaW51eF9pNjg2JwogICAgICAgIHBsYXRfbmFtZSA9IHBsYXRfbmFtZS5yZXBsYWNlKCctJywgJ18nKS5yZXBsYWNlKCcuJywgJ18nKQoKCiAgICAgICAgaWYgc2VsZi5yb290X2lzX3B1cmU6CiAgICAgICAgICAgIGlmIHNlbGYudW5pdmVyc2FsOgogICAgICAgICAgICAgICAgaW1wbCA9ICdweTIucHkzJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaW1wbCA9IHNlbGYucHl0aG9uX3RhZwogICAgICAgICAgICB0YWcgPSAoaW1wbCwgJ25vbmUnLCBwbGF0X25hbWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaW1wbF9uYW1lID0gZ2V0X2FiYnJfaW1wbCgpCiAgICAgICAgICAgIGltcGxfdmVyID0gZ2V0X2ltcGxfdmVyKCkKICAgICAgICAgICAgaW1wbCA9IGltcGxfbmFtZSArIGltcGxfdmVyCiAgICAgICAgICAgICMgV2UgZG9uJ3Qgd29yayBvbiBDUHl0aG9uIDMuMSwgMy4wLgogICAgICAgICAgICBpZiBzZWxmLnB5X2xpbWl0ZWRfYXBpIGFuZCAoaW1wbF9uYW1lICsgaW1wbF92ZXIpLnN0YXJ0c3dpdGgoJ2NwMycpOgogICAgICAgICAgICAgICAgaW1wbCA9IHNlbGYucHlfbGltaXRlZF9hcGkKICAgICAgICAgICAgICAgIGFiaV90YWcgPSAnYWJpMycKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFiaV90YWcgPSBzdHIoZ2V0X2FiaV90YWcoKSkubG93ZXIoKQogICAgICAgICAgICB0YWcgPSAoaW1wbCwgYWJpX3RhZywgcGxhdF9uYW1lKQogICAgICAgICAgICBzdXBwb3J0ZWRfdGFncyA9IHBlcDQyNXRhZ3MuZ2V0X3N1cHBvcnRlZCgKICAgICAgICAgICAgICAgIHN1cHBsaWVkX3BsYXRmb3JtPXBsYXRfbmFtZSBpZiBzZWxmLnBsYXRfbmFtZV9zdXBwbGllZCBlbHNlIE5vbmUpCiAgICAgICAgICAgICMgWFhYIHN3aXRjaCB0byB0aGlzIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbiBmb3Igbm9uLXB1cmU6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnB5X2xpbWl0ZWRfYXBpOgogICAgICAgICAgICAgICAgYXNzZXJ0IHRhZyA9PSBzdXBwb3J0ZWRfdGFnc1swXSwgIiVzICE9ICVzIiAlICh0YWcsIHN1cHBvcnRlZF90YWdzWzBdKQogICAgICAgICAgICBhc3NlcnQgdGFnIGluIHN1cHBvcnRlZF90YWdzLCAid291bGQgYnVpbGQgd2hlZWwgd2l0aCB1bnN1cHBvcnRlZCB0YWcgJXMiICUgdGFnCiAgICAgICAgcmV0dXJuIHRhZwoKICAgIGRlZiBnZXRfYXJjaGl2ZV9iYXNlbmFtZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYXJjaGl2ZSBuYW1lIHdpdGhvdXQgZXh0ZW5zaW9uIiIiCgogICAgICAgIGltcGxfdGFnLCBhYmlfdGFnLCBwbGF0X3RhZyA9IHNlbGYuZ2V0X3RhZygpCgogICAgICAgIGFyY2hpdmVfYmFzZW5hbWUgPSAiJXMtJXMtJXMtJXMiICUgKAogICAgICAgICAgICBzZWxmLndoZWVsX2Rpc3RfbmFtZSwKICAgICAgICAgICAgaW1wbF90YWcsCiAgICAgICAgICAgIGFiaV90YWcsCiAgICAgICAgICAgIHBsYXRfdGFnKQogICAgICAgIHJldHVybiBhcmNoaXZlX2Jhc2VuYW1lCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBidWlsZF9zY3JpcHRzID0gc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfc2NyaXB0cycpCiAgICAgICAgYnVpbGRfc2NyaXB0cy5leGVjdXRhYmxlID0gJ3B5dGhvbicKCiAgICAgICAgaWYgbm90IHNlbGYuc2tpcF9idWlsZDoKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGQnKQoKICAgICAgICBpbnN0YWxsID0gc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnaW5zdGFsbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbml0X3N1YmNvbW1hbmRzPVRydWUpCiAgICAgICAgaW5zdGFsbC5yb290ID0gc2VsZi5iZGlzdF9kaXIKICAgICAgICBpbnN0YWxsLmNvbXBpbGUgPSBGYWxzZQogICAgICAgIGluc3RhbGwuc2tpcF9idWlsZCA9IHNlbGYuc2tpcF9idWlsZAogICAgICAgIGluc3RhbGwud2Fybl9kaXIgPSBGYWxzZQoKICAgICAgICAjIEEgd2hlZWwgd2l0aG91dCBzZXR1cHRvb2xzIHNjcmlwdHMgaXMgbW9yZSBjcm9zcy1wbGF0Zm9ybS4KICAgICAgICAjIFVzZSB0aGUgKHVuZG9jdW1lbnRlZCkgYG5vX2VwYCBvcHRpb24gdG8gc2V0dXB0b29scycKICAgICAgICAjIGluc3RhbGxfc2NyaXB0cyBjb21tYW5kIHRvIGF2b2lkIGNyZWF0aW5nIGVudHJ5IHBvaW50IHNjcmlwdHMuCiAgICAgICAgaW5zdGFsbF9zY3JpcHRzID0gc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnaW5zdGFsbF9zY3JpcHRzJykKICAgICAgICBpbnN0YWxsX3NjcmlwdHMubm9fZXAgPSBUcnVlCgogICAgICAgICMgVXNlIGEgY3VzdG9tIHNjaGVtZSBmb3IgdGhlIGFyY2hpdmUsIGJlY2F1c2Ugd2UgaGF2ZSB0byBkZWNpZGUKICAgICAgICAjIGF0IGluc3RhbGxhdGlvbiB0aW1lIHdoaWNoIHNjaGVtZSB0byB1c2UuCiAgICAgICAgZm9yIGtleSBpbiAoJ2hlYWRlcnMnLCAnc2NyaXB0cycsICdkYXRhJywgJ3B1cmVsaWInLCAncGxhdGxpYicpOgogICAgICAgICAgICBzZXRhdHRyKGluc3RhbGwsCiAgICAgICAgICAgICAgICAgICAgJ2luc3RhbGxfJyArIGtleSwKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5kYXRhX2Rpciwga2V5KSkKCiAgICAgICAgYmFzZWRpcl9vYnNlcnZlZCA9ICcnCgogICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKICAgICAgICAgICAgIyB3aW4zMiBiYXJmcyBpZiBhbnkgb2YgdGhlc2UgYXJlICcnOyBjb3VsZCBiZSAnLic/CiAgICAgICAgICAgICMgKGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGw6Y2hhbmdlX3Jvb3RzIGJ1ZykKICAgICAgICAgICAgYmFzZWRpcl9vYnNlcnZlZCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKHNlbGYuZGF0YV9kaXIsICcuLicpKQogICAgICAgICAgICBzZWxmLmluc3RhbGxfbGliYmFzZSA9IHNlbGYuaW5zdGFsbF9saWIgPSBiYXNlZGlyX29ic2VydmVkCgogICAgICAgIHNldGF0dHIoaW5zdGFsbCwKICAgICAgICAgICAgICAgICdpbnN0YWxsX3B1cmVsaWInIGlmIHNlbGYucm9vdF9pc19wdXJlIGVsc2UgJ2luc3RhbGxfcGxhdGxpYicsCiAgICAgICAgICAgICAgICBiYXNlZGlyX29ic2VydmVkKQoKICAgICAgICBsb2dnZXIuaW5mbygiaW5zdGFsbGluZyB0byAlcyIsIHNlbGYuYmRpc3RfZGlyKQoKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdpbnN0YWxsJykKCiAgICAgICAgYXJjaGl2ZV9iYXNlbmFtZSA9IHNlbGYuZ2V0X2FyY2hpdmVfYmFzZW5hbWUoKQoKICAgICAgICBwc2V1ZG9pbnN0YWxsX3Jvb3QgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXN0X2RpciwgYXJjaGl2ZV9iYXNlbmFtZSkKICAgICAgICBpZiBub3Qgc2VsZi5yZWxhdGl2ZToKICAgICAgICAgICAgYXJjaGl2ZV9yb290ID0gc2VsZi5iZGlzdF9kaXIKICAgICAgICBlbHNlOgogICAgICAgICAgICBhcmNoaXZlX3Jvb3QgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICBzZWxmLmJkaXN0X2RpciwKICAgICAgICAgICAgICAgIHNlbGYuX2Vuc3VyZV9yZWxhdGl2ZShpbnN0YWxsLmluc3RhbGxfYmFzZSkpCgogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKAogICAgICAgICAgICAnaW5zdGFsbF9lZ2dfaW5mbycsICgndGFyZ2V0JywgJ2VnZ2luZm9fZGlyJykpCiAgICAgICAgc2VsZi5kaXN0aW5mb19kaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5iZGlzdF9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzLmRpc3QtaW5mbycgJSBzZWxmLndoZWVsX2Rpc3RfbmFtZSkKICAgICAgICBzZWxmLmVnZzJkaXN0KHNlbGYuZWdnaW5mb19kaXIsCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3RpbmZvX2RpcikKCiAgICAgICAgc2VsZi53cml0ZV93aGVlbGZpbGUoc2VsZi5kaXN0aW5mb19kaXIpCgogICAgICAgIHNlbGYud3JpdGVfcmVjb3JkKHNlbGYuYmRpc3RfZGlyLCBzZWxmLmRpc3RpbmZvX2RpcikKCiAgICAgICAgIyBNYWtlIHRoZSBhcmNoaXZlCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuZGlzdF9kaXIpOgogICAgICAgICAgICBvcy5tYWtlZGlycyhzZWxmLmRpc3RfZGlyKQogICAgICAgIHdoZWVsX25hbWUgPSBhcmNoaXZlX3doZWVsZmlsZShwc2V1ZG9pbnN0YWxsX3Jvb3QsIGFyY2hpdmVfcm9vdCkKCiAgICAgICAgIyBTaWduIHRoZSBhcmNoaXZlCiAgICAgICAgaWYgJ1dIRUVMX1RPT0wnIGluIG9zLmVudmlyb246CiAgICAgICAgICAgIHN1YnByb2Nlc3MuY2FsbChbb3MuZW52aXJvblsnV0hFRUxfVE9PTCddLCAnc2lnbicsIHdoZWVsX25hbWVdKQoKICAgICAgICAjIEFkZCB0byAnRGlzdHJpYnV0aW9uLmRpc3RfZmlsZXMnIHNvIHRoYXQgdGhlICJ1cGxvYWQiIGNvbW1hbmQgd29ya3MKICAgICAgICBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAnZGlzdF9maWxlcycsIFtdKS5hcHBlbmQoCiAgICAgICAgICAgICgnYmRpc3Rfd2hlZWwnLCBnZXRfcHl0aG9uX3ZlcnNpb24oKSwgd2hlZWxfbmFtZSkpCgogICAgICAgIGlmIG5vdCBzZWxmLmtlZXBfdGVtcDoKICAgICAgICAgICAgaWYgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ3JlbW92aW5nICVzJywgc2VsZi5iZGlzdF9kaXIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBybXRyZWUoc2VsZi5iZGlzdF9kaXIpCgogICAgZGVmIHdyaXRlX3doZWVsZmlsZShzZWxmLCB3aGVlbGZpbGVfYmFzZSwgZ2VuZXJhdG9yPSdiZGlzdF93aGVlbCAoJyArIHdoZWVsX3ZlcnNpb24gKyAnKScpOgogICAgICAgIGZyb20gZW1haWwubWVzc2FnZSBpbXBvcnQgTWVzc2FnZQogICAgICAgIG1zZyA9IE1lc3NhZ2UoKQogICAgICAgIG1zZ1snV2hlZWwtVmVyc2lvbiddID0gJzEuMCcgICMgb2YgdGhlIHNwZWMKICAgICAgICBtc2dbJ0dlbmVyYXRvciddID0gZ2VuZXJhdG9yCiAgICAgICAgbXNnWydSb290LUlzLVB1cmVsaWInXSA9IHN0cihzZWxmLnJvb3RfaXNfcHVyZSkubG93ZXIoKQoKICAgICAgICAjIERvZXNuJ3Qgd29yayBmb3IgYmRpc3Rfd2luaW5zdAogICAgICAgIGltcGxfdGFnLCBhYmlfdGFnLCBwbGF0X3RhZyA9IHNlbGYuZ2V0X3RhZygpCiAgICAgICAgZm9yIGltcGwgaW4gaW1wbF90YWcuc3BsaXQoJy4nKToKICAgICAgICAgICAgZm9yIGFiaSBpbiBhYmlfdGFnLnNwbGl0KCcuJyk6CiAgICAgICAgICAgICAgICBmb3IgcGxhdCBpbiBwbGF0X3RhZy5zcGxpdCgnLicpOgogICAgICAgICAgICAgICAgICAgIG1zZ1snVGFnJ10gPSAnLScuam9pbigoaW1wbCwgYWJpLCBwbGF0KSkKCiAgICAgICAgd2hlZWxmaWxlX3BhdGggPSBvcy5wYXRoLmpvaW4od2hlZWxmaWxlX2Jhc2UsICdXSEVFTCcpCiAgICAgICAgbG9nZ2VyLmluZm8oJ2NyZWF0aW5nICVzJywgd2hlZWxmaWxlX3BhdGgpCiAgICAgICAgd2l0aCBvcGVuKHdoZWVsZmlsZV9wYXRoLCAndycpIGFzIGY6CiAgICAgICAgICAgIEdlbmVyYXRvcihmLCBtYXhoZWFkZXJsZW49MCkuZmxhdHRlbihtc2cpCgogICAgZGVmIF9lbnN1cmVfcmVsYXRpdmUoc2VsZiwgcGF0aCk6CiAgICAgICAgIyBjb3BpZWQgZnJvbSBkaXJfdXRpbCwgZGVsZXRlZAogICAgICAgIGRyaXZlLCBwYXRoID0gb3MucGF0aC5zcGxpdGRyaXZlKHBhdGgpCiAgICAgICAgaWYgcGF0aFswOjFdID09IG9zLnNlcDoKICAgICAgICAgICAgcGF0aCA9IGRyaXZlICsgcGF0aFsxOl0KICAgICAgICByZXR1cm4gcGF0aAoKICAgIGRlZiBfcGtnaW5mb190b19tZXRhZGF0YShzZWxmLCBlZ2dfaW5mb19wYXRoLCBwa2dpbmZvX3BhdGgpOgogICAgICAgIHJldHVybiBtZXRhZGF0YS5wa2dpbmZvX3RvX21ldGFkYXRhKGVnZ19pbmZvX3BhdGgsIHBrZ2luZm9fcGF0aCkKCiAgICBkZWYgbGljZW5zZV9maWxlKHNlbGYpOgogICAgICAgICIiIlJldHVybiBsaWNlbnNlIGZpbGVuYW1lIGZyb20gYSBsaWNlbnNlLWZpbGUga2V5IGluIHNldHVwLmNmZywgb3IgTm9uZS4iIiIKICAgICAgICBtZXRhZGF0YSA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9vcHRpb25fZGljdCgnbWV0YWRhdGEnKQogICAgICAgIGlmIG5vdCAnbGljZW5zZV9maWxlJyBpbiBtZXRhZGF0YToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gbWV0YWRhdGFbJ2xpY2Vuc2VfZmlsZSddWzFdCgogICAgZGVmIHNldHVwY2ZnX3JlcXVpcmVtZW50cyhzZWxmKToKICAgICAgICAiIiJHZW5lcmF0ZSByZXF1aXJlbWVudHMgZnJvbSBzZXR1cC5jZmcgYXMKICAgICAgICAoJ1JlcXVpcmVzLURpc3QnLCAncmVxdWlyZW1lbnQ7IHF1YWxpZmllcicpIHR1cGxlcy4gRnJvbSBhIG1ldGFkYXRhCiAgICAgICAgc2VjdGlvbiBpbiBzZXR1cC5jZmc6CgogICAgICAgIFttZXRhZGF0YV0KICAgICAgICBwcm92aWRlcy1leHRyYSA9IGV4dHJhMQogICAgICAgICAgICBleHRyYTIKICAgICAgICByZXF1aXJlcy1kaXN0ID0gcmVxdWlyZW1lbnQ7IHF1YWxpZmllcgogICAgICAgICAgICBhbm90aGVyOyBxdWFsaWZpZXIyCiAgICAgICAgICAgIHVucXVhbGlmaWVkCgogICAgICAgIFlpZWxkcwoKICAgICAgICAoJ1Byb3ZpZGVzLUV4dHJhJywgJ2V4dHJhMScpLAogICAgICAgICgnUHJvdmlkZXMtRXh0cmEnLCAnZXh0cmEyJyksCiAgICAgICAgKCdSZXF1aXJlcy1EaXN0JywgJ3JlcXVpcmVtZW50OyBxdWFsaWZpZXInKSwKICAgICAgICAoJ1JlcXVpcmVzLURpc3QnLCAnYW5vdGhlcjsgcXVhbGlmaWVyMicpLAogICAgICAgICgnUmVxdWlyZXMtRGlzdCcsICd1bnF1YWxpZmllZCcpCiAgICAgICAgIiIiCiAgICAgICAgbWV0YWRhdGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfb3B0aW9uX2RpY3QoJ21ldGFkYXRhJykKCiAgICAgICAgIyBvdXIgLmluaSBwYXJzZXIgZm9sZHMgLSB0byBfIGluIGtleSBuYW1lczoKICAgICAgICBmb3Iga2V5LCB0aXRsZSBpbiAoKCdwcm92aWRlc19leHRyYScsICdQcm92aWRlcy1FeHRyYScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3JlcXVpcmVzX2Rpc3QnLCAnUmVxdWlyZXMtRGlzdCcpKToKICAgICAgICAgICAgaWYgbm90IGtleSBpbiBtZXRhZGF0YToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGZpZWxkID0gbWV0YWRhdGFba2V5XQogICAgICAgICAgICBmb3IgbGluZSBpbiBmaWVsZFsxXS5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgeWllbGQgKHRpdGxlLCBsaW5lKQoKICAgIGRlZiBhZGRfcmVxdWlyZW1lbnRzKHNlbGYsIG1ldGFkYXRhX3BhdGgpOgogICAgICAgICIiIkFkZCBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyBmcm9tIHNldHVwLmNmZyB0byBmaWxlIG1ldGFkYXRhX3BhdGgiIiIKICAgICAgICBhZGRpdGlvbmFsID0gbGlzdChzZWxmLnNldHVwY2ZnX3JlcXVpcmVtZW50cygpKQogICAgICAgIGlmIG5vdCBhZGRpdGlvbmFsOiByZXR1cm4KICAgICAgICBwa2dfaW5mbyA9IHJlYWRfcGtnX2luZm8obWV0YWRhdGFfcGF0aCkKICAgICAgICBpZiAnUHJvdmlkZXMtRXh0cmEnIGluIHBrZ19pbmZvIG9yICdSZXF1aXJlcy1EaXN0JyBpbiBwa2dfaW5mbzoKICAgICAgICAgICAgd2FybmluZ3Mud2Fybignc2V0dXAuY2ZnIHJlcXVpcmVtZW50cyBvdmVyd3JpdGUgdmFsdWVzIGZyb20gc2V0dXAucHknKQogICAgICAgICAgICBkZWwgcGtnX2luZm9bJ1Byb3ZpZGVzLUV4dHJhJ10KICAgICAgICAgICAgZGVsIHBrZ19pbmZvWydSZXF1aXJlcy1EaXN0J10KICAgICAgICBmb3IgaywgdiBpbiBhZGRpdGlvbmFsOgogICAgICAgICAgICBwa2dfaW5mb1trXSA9IHYKICAgICAgICB3cml0ZV9wa2dfaW5mbyhtZXRhZGF0YV9wYXRoLCBwa2dfaW5mbykKCiAgICBkZWYgZWdnMmRpc3Qoc2VsZiwgZWdnaW5mb19wYXRoLCBkaXN0aW5mb19wYXRoKToKICAgICAgICAiIiJDb252ZXJ0IGFuIC5lZ2ctaW5mbyBkaXJlY3RvcnkgaW50byBhIC5kaXN0LWluZm8gZGlyZWN0b3J5IiIiCiAgICAgICAgZGVmIGFkaW9zKHApOgogICAgICAgICAgICAiIiJBcHByb3ByaWF0ZWx5IGRlbGV0ZSBkaXJlY3RvcnksIGZpbGUgb3IgbGluay4iIiIKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocCkgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhwKSBhbmQgb3MucGF0aC5pc2RpcihwKToKICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUocCkKICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhwKToKICAgICAgICAgICAgICAgIG9zLnVubGluayhwKQoKICAgICAgICBhZGlvcyhkaXN0aW5mb19wYXRoKQoKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZWdnaW5mb19wYXRoKToKICAgICAgICAgICAgIyBUaGVyZSBpcyBubyBlZ2ctaW5mby4gVGhpcyBpcyBwcm9iYWJseSBiZWNhdXNlIHRoZSBlZ2ctaW5mbwogICAgICAgICAgICAjIGZpbGUvZGlyZWN0b3J5IGlzIG5vdCBuYW1lZCBtYXRjaGluZyB0aGUgZGlzdHJpYnV0aW9uIG5hbWUgdXNlZAogICAgICAgICAgICAjIHRvIG5hbWUgdGhlIGFyY2hpdmUgZmlsZS4gQ2hlY2sgZm9yIHRoaXMgY2FzZSBhbmQgcmVwb3J0CiAgICAgICAgICAgICMgYWNjb3JkaW5nbHkuCiAgICAgICAgICAgIGltcG9ydCBnbG9iCiAgICAgICAgICAgIHBhdCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoZWdnaW5mb19wYXRoKSwgJyouZWdnLWluZm8nKQogICAgICAgICAgICBwb3NzaWJsZSA9IGdsb2IuZ2xvYihwYXQpCiAgICAgICAgICAgIGVyciA9ICJFZ2cgbWV0YWRhdGEgZXhwZWN0ZWQgYXQgJXMgYnV0IG5vdCBmb3VuZCIgJSAoZWdnaW5mb19wYXRoLCkKICAgICAgICAgICAgaWYgcG9zc2libGU6CiAgICAgICAgICAgICAgICBhbHQgPSBvcy5wYXRoLmJhc2VuYW1lKHBvc3NpYmxlWzBdKQogICAgICAgICAgICAgICAgZXJyICs9ICIgKCVzIGZvdW5kIC0gcG9zc2libGUgbWlzbmFtZWQgYXJjaGl2ZSBmaWxlPykiICUgKGFsdCwpCgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGVycikKCiAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZWdnaW5mb19wYXRoKToKICAgICAgICAgICAgIyAuZWdnLWluZm8gaXMgYSBzaW5nbGUgZmlsZQogICAgICAgICAgICBwa2dpbmZvX3BhdGggPSBlZ2dpbmZvX3BhdGgKICAgICAgICAgICAgcGtnX2luZm8gPSBzZWxmLl9wa2dpbmZvX3RvX21ldGFkYXRhKGVnZ2luZm9fcGF0aCwgZWdnaW5mb19wYXRoKQogICAgICAgICAgICBvcy5ta2RpcihkaXN0aW5mb19wYXRoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgLmVnZy1pbmZvIGlzIGEgZGlyZWN0b3J5CiAgICAgICAgICAgIHBrZ2luZm9fcGF0aCA9IG9zLnBhdGguam9pbihlZ2dpbmZvX3BhdGgsICdQS0ctSU5GTycpCiAgICAgICAgICAgIHBrZ19pbmZvID0gc2VsZi5fcGtnaW5mb190b19tZXRhZGF0YShlZ2dpbmZvX3BhdGgsIHBrZ2luZm9fcGF0aCkKCiAgICAgICAgICAgICMgaWdub3JlIGNvbW1vbiBlZ2cgbWV0YWRhdGEgdGhhdCBpcyB1c2VsZXNzIHRvIHdoZWVsCiAgICAgICAgICAgIHNodXRpbC5jb3B5dHJlZShlZ2dpbmZvX3BhdGgsIGRpc3RpbmZvX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmU9bGFtYmRhIHgsIHk6IHNldCgoJ1BLRy1JTkZPJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVxdWlyZXMudHh0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU09VUkNFUy50eHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub3QtemlwLXNhZmUnLCkpKQoKICAgICAgICAgICAgIyBkZWxldGUgZGVwZW5kZW5jeV9saW5rcyBpZiBpdCBpcyBvbmx5IHdoaXRlc3BhY2UKICAgICAgICAgICAgZGVwZW5kZW5jeV9saW5rc19wYXRoID0gb3MucGF0aC5qb2luKGRpc3RpbmZvX3BhdGgsICdkZXBlbmRlbmN5X2xpbmtzLnR4dCcpCiAgICAgICAgICAgIHdpdGggb3BlbihkZXBlbmRlbmN5X2xpbmtzX3BhdGgsICdyJykgYXMgZGVwZW5kZW5jeV9saW5rc19maWxlOgogICAgICAgICAgICAgICAgZGVwZW5kZW5jeV9saW5rcyA9IGRlcGVuZGVuY3lfbGlua3NfZmlsZS5yZWFkKCkuc3RyaXAoKQogICAgICAgICAgICBpZiBub3QgZGVwZW5kZW5jeV9saW5rczoKICAgICAgICAgICAgICAgIGFkaW9zKGRlcGVuZGVuY3lfbGlua3NfcGF0aCkKCiAgICAgICAgd3JpdGVfcGtnX2luZm8ob3MucGF0aC5qb2luKGRpc3RpbmZvX3BhdGgsICdNRVRBREFUQScpLCBwa2dfaW5mbykKCiAgICAgICAgIyBYWFggZGVwcmVjYXRlZC4gU3RpbGwgdXNlZnVsIGZvciBjdXJyZW50IGRpc3RyaWJ1dGUvc2V0dXB0b29scy4KICAgICAgICBtZXRhZGF0YV9wYXRoID0gb3MucGF0aC5qb2luKGRpc3RpbmZvX3BhdGgsICdNRVRBREFUQScpCiAgICAgICAgc2VsZi5hZGRfcmVxdWlyZW1lbnRzKG1ldGFkYXRhX3BhdGgpCgogICAgICAgICMgWFhYIGludGVudGlvbmFsbHkgYSBkaWZmZXJlbnQgcGF0aCB0aGFuIHRoZSBQRVAuCiAgICAgICAgbWV0YWRhdGFfanNvbl9wYXRoID0gb3MucGF0aC5qb2luKGRpc3RpbmZvX3BhdGgsICdtZXRhZGF0YS5qc29uJykKICAgICAgICBweW1ldGEgPSBwa2dpbmZvX3RvX2RpY3QobWV0YWRhdGFfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uPXNlbGYuZGlzdHJpYnV0aW9uKQoKICAgICAgICBpZiAnZGVzY3JpcHRpb24nIGluIHB5bWV0YToKICAgICAgICAgICAgZGVzY3JpcHRpb25fZmlsZW5hbWUgPSAnREVTQ1JJUFRJT04ucnN0JwogICAgICAgICAgICBkZXNjcmlwdGlvbl90ZXh0ID0gcHltZXRhLnBvcCgnZGVzY3JpcHRpb24nKQogICAgICAgICAgICBkZXNjcmlwdGlvbl9wYXRoID0gb3MucGF0aC5qb2luKGRpc3RpbmZvX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25fZmlsZW5hbWUpCiAgICAgICAgICAgIHdpdGggb3BlbihkZXNjcmlwdGlvbl9wYXRoLCAid2IiKSBhcyBkZXNjcmlwdGlvbl9maWxlOgogICAgICAgICAgICAgICAgZGVzY3JpcHRpb25fZmlsZS53cml0ZShkZXNjcmlwdGlvbl90ZXh0LmVuY29kZSgndXRmLTgnKSkKICAgICAgICAgICAgcHltZXRhWydleHRlbnNpb25zJ11bJ3B5dGhvbi5kZXRhaWxzJ11bJ2RvY3VtZW50X25hbWVzJ11bJ2Rlc2NyaXB0aW9uJ10gPSBkZXNjcmlwdGlvbl9maWxlbmFtZQoKICAgICAgICAjIFhYWCBoZXVyaXN0aWNhbGx5IGNvcHkgYW55IExJQ0VOU0UvTElDRU5TRS50eHQ/CiAgICAgICAgbGljZW5zZSA9IHNlbGYubGljZW5zZV9maWxlKCkKICAgICAgICBpZiBsaWNlbnNlOgogICAgICAgICAgICBsaWNlbnNlX2ZpbGVuYW1lID0gJ0xJQ0VOU0UudHh0JwogICAgICAgICAgICBzaHV0aWwuY29weShsaWNlbnNlLCBvcy5wYXRoLmpvaW4oc2VsZi5kaXN0aW5mb19kaXIsIGxpY2Vuc2VfZmlsZW5hbWUpKQogICAgICAgICAgICBweW1ldGFbJ2V4dGVuc2lvbnMnXVsncHl0aG9uLmRldGFpbHMnXVsnZG9jdW1lbnRfbmFtZXMnXVsnbGljZW5zZSddID0gbGljZW5zZV9maWxlbmFtZQoKICAgICAgICB3aXRoIG9wZW4obWV0YWRhdGFfanNvbl9wYXRoLCAidyIpIGFzIG1ldGFkYXRhX2pzb246CiAgICAgICAgICAgIGpzb24uZHVtcChweW1ldGEsIG1ldGFkYXRhX2pzb24sIHNvcnRfa2V5cz1UcnVlKQoKICAgICAgICBhZGlvcyhlZ2dpbmZvX3BhdGgpCgogICAgZGVmIHdyaXRlX3JlY29yZChzZWxmLCBiZGlzdF9kaXIsIGRpc3RpbmZvX2Rpcik6CiAgICAgICAgZnJvbSAudXRpbCBpbXBvcnQgdXJsc2FmZV9iNjRlbmNvZGUKCiAgICAgICAgcmVjb3JkX3BhdGggPSBvcy5wYXRoLmpvaW4oZGlzdGluZm9fZGlyLCAnUkVDT1JEJykKICAgICAgICByZWNvcmRfcmVscGF0aCA9IG9zLnBhdGgucmVscGF0aChyZWNvcmRfcGF0aCwgYmRpc3RfZGlyKQoKICAgICAgICBkZWYgd2FsaygpOgogICAgICAgICAgICBmb3IgZGlyLCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKGJkaXN0X2Rpcik6CiAgICAgICAgICAgICAgICBkaXJzLnNvcnQoKQogICAgICAgICAgICAgICAgZm9yIGYgaW4gc29ydGVkKGZpbGVzKToKICAgICAgICAgICAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4oZGlyLCBmKQoKICAgICAgICBkZWYgc2tpcChwYXRoKToKICAgICAgICAgICAgIiIiV2hlZWwgaGFzaGVzIGV2ZXJ5IHBvc3NpYmxlIGZpbGUuIiIiCiAgICAgICAgICAgIHJldHVybiAocGF0aCA9PSByZWNvcmRfcmVscGF0aCkKCiAgICAgICAgd2l0aCBvcGVuX2Zvcl9jc3YocmVjb3JkX3BhdGgsICd3KycpIGFzIHJlY29yZF9maWxlOgogICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKHJlY29yZF9maWxlKQogICAgICAgICAgICBmb3IgcGF0aCBpbiB3YWxrKCk6CiAgICAgICAgICAgICAgICByZWxwYXRoID0gb3MucGF0aC5yZWxwYXRoKHBhdGgsIGJkaXN0X2RpcikKICAgICAgICAgICAgICAgIGlmIHNraXAocmVscGF0aCk6CiAgICAgICAgICAgICAgICAgICAgaGFzaCA9ICcnCiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9ICcnCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBmOgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKICAgICAgICAgICAgICAgICAgICBkaWdlc3QgPSBoYXNobGliLnNoYTI1NihkYXRhKS5kaWdlc3QoKQogICAgICAgICAgICAgICAgICAgIGhhc2ggPSAnc2hhMjU2PScgKyBuYXRpdmUodXJsc2FmZV9iNjRlbmNvZGUoZGlnZXN0KSkKICAgICAgICAgICAgICAgICAgICBzaXplID0gbGVuKGRhdGEpCiAgICAgICAgICAgICAgICByZWNvcmRfcGF0aCA9IG9zLnBhdGgucmVscGF0aCgKICAgICAgICAgICAgICAgICAgICBwYXRoLCBiZGlzdF9kaXIpLnJlcGxhY2Uob3MucGF0aC5zZXAsICcvJykKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdygocmVjb3JkX3BhdGgsIGhhc2gsIHNpemUpKQpQSwMEFAAAAAAAAAAhAKN5UncdAgAAHQIAACcAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9kZWNvcmF0b3IucHkjIGZyb20gUHlyYW1pZAoKCmNsYXNzIHJlaWZ5KG9iamVjdCk6CiAgICAiIiJQdXQgdGhlIHJlc3VsdCBvZiBhIG1ldGhvZCB3aGljaCB1c2VzIHRoaXMgKG5vbi1kYXRhKQogICAgZGVzY3JpcHRvciBkZWNvcmF0b3IgaW4gdGhlIGluc3RhbmNlIGRpY3QgYWZ0ZXIgdGhlIGZpcnN0IGNhbGwsCiAgICBlZmZlY3RpdmVseSByZXBsYWNpbmcgdGhlIGRlY29yYXRvciB3aXRoIGFuIGluc3RhbmNlIHZhcmlhYmxlLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdyYXBwZWQpOgogICAgICAgIHNlbGYud3JhcHBlZCA9IHdyYXBwZWQKICAgICAgICBzZWxmLl9fZG9jX18gPSB3cmFwcGVkLl9fZG9jX18KCiAgICBkZWYgX19nZXRfXyhzZWxmLCBpbnN0LCBvYmp0eXBlPU5vbmUpOgogICAgICAgIGlmIGluc3QgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICB2YWwgPSBzZWxmLndyYXBwZWQoaW5zdCkKICAgICAgICBzZXRhdHRyKGluc3QsIHNlbGYud3JhcHBlZC5fX25hbWVfXywgdmFsKQogICAgICAgIHJldHVybiB2YWwKUEsDBBQAAAAAAAAAIQDTYQ8k0wsAANMLAAAnAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvZWdnMndoZWVsLnB5IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCmltcG9ydCBvcy5wYXRoCmltcG9ydCByZQppbXBvcnQgc3lzCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgemlwZmlsZQppbXBvcnQgd2hlZWwuYmRpc3Rfd2hlZWwKaW1wb3J0IHNodXRpbAppbXBvcnQgZGlzdHV0aWxzLmRpc3QKZnJvbSBkaXN0dXRpbHMuYXJjaGl2ZV91dGlsIGltcG9ydCBtYWtlX2FyY2hpdmUKZnJvbSBhcmdwYXJzZSBpbXBvcnQgQXJndW1lbnRQYXJzZXIKZnJvbSBnbG9iIGltcG9ydCBpZ2xvYgpmcm9tIHdoZWVsLndpbmluc3Qyd2hlZWwgaW1wb3J0IF9iZGlzdF93aGVlbF90YWcKCmVnZ19pbmZvX3JlID0gcmUuY29tcGlsZShyJycnKD9QPG5hbWU+Lis/KS0oP1A8dmVyPi4rPykKICAgICgtKD9QPHB5dmVyPi4rPykpPygtKD9QPGFyY2g+Lis/KSk/LmVnZycnJywgcmUuVkVSQk9TRSkKCmRlZiBlZ2cyd2hlZWwoZWdnX3BhdGgsIGRlc3RfZGlyKToKICAgIGVnZ19pbmZvID0gZWdnX2luZm9fcmUubWF0Y2gob3MucGF0aC5iYXNlbmFtZShlZ2dfcGF0aCkpLmdyb3VwZGljdCgpCiAgICBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHN1ZmZpeD0iX2UydyIpCiAgICBpZiBvcy5wYXRoLmlzZmlsZShlZ2dfcGF0aCk6CiAgICAgICAgIyBhc3N1bWUgd2UgaGF2ZSBhIGJkaXN0X2VnZyBvdGhlcndpc2UKICAgICAgICBlZ2cgPSB6aXBmaWxlLlppcEZpbGUoZWdnX3BhdGgpCiAgICAgICAgZWdnLmV4dHJhY3RhbGwoZGlyKQogICAgZWxzZToKICAgICAgICAjIHN1cHBvcnQgYnVpbGRvdXQtc3R5bGUgaW5zdGFsbGVkIGVnZ3MgZGlyZWN0b3JpZXMKICAgICAgICBmb3IgcHRoIGluIG9zLmxpc3RkaXIoZWdnX3BhdGgpOgogICAgICAgICAgICBzcmMgPSBvcy5wYXRoLmpvaW4oZWdnX3BhdGgsIHB0aCkKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoc3JjKToKICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5MihzcmMsIGRpcikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5dHJlZShzcmMsIG9zLnBhdGguam9pbihkaXIsIHB0aCkpCgogICAgZGlzdF9pbmZvID0gIiVzLSVzIiAlIChlZ2dfaW5mb1snbmFtZSddLCBlZ2dfaW5mb1sndmVyJ10pCiAgICBhYmkgPSAnbm9uZScKICAgIHB5dmVyID0gZWdnX2luZm9bJ3B5dmVyJ10ucmVwbGFjZSgnLicsICcnKQogICAgYXJjaCA9IChlZ2dfaW5mb1snYXJjaCddIG9yICdhbnknKS5yZXBsYWNlKCcuJywgJ18nKS5yZXBsYWNlKCctJywgJ18nKQogICAgaWYgYXJjaCAhPSAnYW55JzoKICAgICAgICAjIGFzc3VtZSBhbGwgYmluYXJ5IGVnZ3MgYXJlIGZvciBDUHl0aG9uCiAgICAgICAgcHl2ZXIgPSAnY3AnICsgcHl2ZXJbMjpdCiAgICB3aGVlbF9uYW1lID0gJy0nLmpvaW4oKAogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RfaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICBweXZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBhYmksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaAogICAgICAgICAgICAgICAgICAgICAgICAgICkpCiAgICByb290X2lzX3B1cmVsaWIgPSBlZ2dfaW5mb1snYXJjaCddIGlzIE5vbmUKICAgIGlmIHJvb3RfaXNfcHVyZWxpYjoKICAgICAgICBidyA9IHdoZWVsLmJkaXN0X3doZWVsLmJkaXN0X3doZWVsKGRpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbigpKQogICAgZWxzZToKICAgICAgICBidyA9IF9iZGlzdF93aGVlbF90YWcoZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uKCkpCgogICAgYncucm9vdF9pc19wdXJlID0gcm9vdF9pc19wdXJlbGliCiAgICBidy5weXRob25fdGFnID0gcHl2ZXIKICAgIGJ3LnBsYXRfbmFtZV9zdXBwbGllZCA9IFRydWUKICAgIGJ3LnBsYXRfbmFtZSA9IGVnZ19pbmZvWydhcmNoJ10gb3IgJ2FueScKICAgIGlmIG5vdCByb290X2lzX3B1cmVsaWI6CiAgICAgICAgYncuZnVsbF90YWdfc3VwcGxpZWQgPSBUcnVlCiAgICAgICAgYncuZnVsbF90YWcgPSAocHl2ZXIsIGFiaSwgYXJjaCkKCiAgICBkaXN0X2luZm9fZGlyID0gb3MucGF0aC5qb2luKGRpciwgJyVzLmRpc3QtaW5mbycgJSBkaXN0X2luZm8pCiAgICBidy5lZ2cyZGlzdChvcy5wYXRoLmpvaW4oZGlyLCAnRUdHLUlORk8nKSwKICAgICAgICAgICAgICAgIGRpc3RfaW5mb19kaXIpCiAgICBidy53cml0ZV93aGVlbGZpbGUoZGlzdF9pbmZvX2RpciwgZ2VuZXJhdG9yPSdlZ2cyd2hlZWwnKQogICAgYncud3JpdGVfcmVjb3JkKGRpciwgZGlzdF9pbmZvX2RpcikKICAgIGZpbGVuYW1lID0gbWFrZV9hcmNoaXZlKG9zLnBhdGguam9pbihkZXN0X2Rpciwgd2hlZWxfbmFtZSksICd6aXAnLCByb290X2Rpcj1kaXIpCiAgICBvcy5yZW5hbWUoZmlsZW5hbWUsIGZpbGVuYW1lWzotM10gKyAnd2hsJykKICAgIHNodXRpbC5ybXRyZWUoZGlyKQoKZGVmIG1haW4oKToKICAgIHBhcnNlciA9IEFyZ3VtZW50UGFyc2VyKCkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2VnZ3MnLCBuYXJncz0nKicsIGhlbHA9IkVnZ3MgdG8gY29udmVydCIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWRlc3QtZGlyJywgJy1kJywgZGVmYXVsdD1vcy5wYXRoLmN1cmRpciwKICAgICAgICAgICAgaGVscD0iRGlyZWN0b3J5IHRvIHN0b3JlIHdoZWVscyAoZGVmYXVsdCAlKGRlZmF1bHQpcykiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywgJy12JywgYWN0aW9uPSdzdG9yZV90cnVlJykKICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAgICBmb3IgcGF0IGluIGFyZ3MuZWdnczoKICAgICAgICBmb3IgZWdnIGluIGlnbG9iKHBhdCk6CiAgICAgICAgICAgIGlmIGFyZ3MudmVyYm9zZToKICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoInswfS4uLiAiLmZvcm1hdChlZ2cpKQogICAgICAgICAgICBlZ2cyd2hlZWwoZWdnLCBhcmdzLmRlc3RfZGlyKQogICAgICAgICAgICBpZiBhcmdzLnZlcmJvc2U6CiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJPS1xuIikKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBtYWluKCkKUEsDBBQAAAAAAAAAIQAQJPIzugkAALoJAAAnAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvZWdnbmFtZXMudHh0dmNhcmQtMC43LjgtcHkyLjcuZWdnCnF0YWxjaGVteS0wLjcuMS1weTIuNy5lZ2cKQU1RUERlbGl2ZXItMC4xLXB5Mi43LmVnZwppbmZpLnJlZ2lzdHJ5LTAuMS4xLXB5Mi43LmVnZwppbmZpLmluc3RydWN0LTAuNS41LXB5Mi43LmVnZwppbmZpLmRldmljZW1hbmFnZXItMC4xLjItcHkyLjcuZWdnClRyYWNUaXhTdW1tYXJ5LTEuMC1weTIuNy5lZ2cKVG9zY2FXaWRnZXRzLTAuOS4xMi1weTIuNy5lZ2cKYXJjaGlwZWxfYWdlbnRfaXBob25lX25vdGlmaWNhdGlvbi0wLjUuMGJldGEtcHkyLjcuZWdnCmFyY2hpcGVsX2FnZW50X2FjdGlvbl9zY2hlZHVsZXItMC41LjBiZXRhLXB5Mi43LmVnZwphby5zb2NpYWwtMS4wLjItcHkyLjcuZWdnCmFwZ2wtMC43LXB5Mi43LmVnZwpzYXRjaG1vX3BheW1lbnRfcGF5d29ybGQtMC4xLjEtcHkyLjcuZWdnCnNubXBzaW0tMC4xLjMtcHkyLjcuZWdnCnNzaGltLTAuMi1weTIuNy5lZ2cKc2hvdmUtMC4zLjQtcHkyLjcuZWdnCnNpbXBsZWF2cm8tMC4zLjAtcHkyLjcuZWdnCndraHRtbHRvcGRmLTAuMi1weTIuNy5lZ2cKd29ra2VsLTAuNy4wLXB5Mi43LmVnZwpqbWJvX3NvY2lhbC0wLjAuNi1weTIuNy5lZ2cKam1ib19wb3N0LTAuMC42LXB5Mi43LmVnZwpqY3JhY2stMC4wLjItcHkyLjcuZWdnCnJpYWstMS40LjAtcHkyLjcuZWdnCnJlc3RjbGllbnQtMC4xMC4yLXB5Mi43LmVnZwpTdXRla2gtMC44LjEtcHkyLjcuZWdnCnRyYXlpZnktMC4wLjEtcHkyLjcuZWdnCnR3ZWVweS0xLjktcHkyLjcuZWdnCnRvcHpvb3Rvb2xzLTAuMi4xLXB5Mi43LmVnZwpoYXlzdGFjay0wLjE2LXB5Mi43LmVnZwp6b3BlLmludGVyZmFjZS00LjAuMS1weTIuNy13aW4zMi5lZ2cKbmV1cm9zaGFyZS0wLjguNS1weTIuNy1tYWNvc3gtMTAuNy1pbnRlbC5lZ2cKbmRnX2h0dHBzY2xpZW50LTAuMi4wLXB5Mi43LmVnZwpsaWJ0ZWxlLTAuMy1weTIuNy5lZ2cKbGl0ZXguY3hwb29sLTEuMC4yLXB5Mi43LmVnZwpvYnNweS5pcmlzLTAuNS4xLXB5Mi43LmVnZwpvYnNweS5tc2VlZC0wLjYuMS1weTIuNy13aW4zMi5lZ2cKb2JzcHkuY29yZS0wLjYuMi1weTIuNy5lZ2cKQ29yZVBvc3QtMC4wLjMtcHkyLjcuZWdnCmZub3Jkc3RhbGstMC4wLjMtcHkyLjcuZWdnClBlcnNpc3RlbmNlLTIuMTMuMi1weTIuNy13aW4zMi5lZ2cKUHlkYXAtMy4xLlJDMS1weTIuNy5lZ2cKUHlFeGVjSlMtMS4wLjQtcHkyLjcuZWdnCldhbGx5LTAuNy4yLXB5Mi43LmVnZwpFeHRlbnNpb25DbGFzcy00LjBhMS1weTIuNy13aW4zMi5lZ2cKRmVlZGphY2stMC45LjE2LXB5Mi43LmVnZwpNYXJzMjQtMC4zLjktcHkyLjcuZWdnCkhhbFdlYi0wLjYuMC1weTIuNy5lZ2cKREFSRS0wLjcuMTQwLXB5Mi43LmVnZwptYWNob2xpYi0xLjMtcHkyLjcuZWdnCm1hcnJvdy53c2dpLmVncmVzcy5jb21wcmVzc2lvbi0xLjEtcHkyLjcuZWdnCm1jcy0wLjMuNy1weTIuNy5lZ2cKS29vay0wLjYuMC1weTIuNy5lZ2cKZXItMC4xLXB5Mi43LmVnZwpldmFzaW9uX2RpcmVjdG9yLTEuMS40LXB5Mi43LmVnZwpkanF1ZXJ5LTAuMWEtcHkyLjcuZWdnCmRqYW5nb19mYWN0b3J5LTAuNy1weTIuNy5lZ2cKZGphbmdvX2dpem1vLTAuMC4zLXB5Mi43LmVnZwpkamFuZ29fY2F0ZWdvcnktMC4xLXB5Mi43LmVnZwpkYndyYXAtMC4zLjItcHkyLjcuZWdnCmRqYW5nb19zdXBlcmdlbmVyaWMtMS4wLXB5Mi43LmVnZwpkamFuZ29fZHluYW1vLTAuMjUtcHkyLjcuZWdnCmRqYW5nb19hY29sbGFiYXV0aC0wLjEtcHkyLjcuZWdnCmRqYW5nb19xcmxpbmstMC4xLjAtcHkyLjcuZWdnCmRqYW5nb19hZGRvbnMtMC42LjYtcHkyLjcuZWdnCmNvdmVyX2dyYWJiZXItMS4xLjItcHkyLjcuZWdnCmNoZW0tMS4xLXB5Mi43LmVnZwpjcnVkLTAuMS1weTIuNy5lZ2cKYm9uZ28tMC4xLXB5Mi43LmVnZwpieXRlY29kZWhhY2tzLUFwcmlsMjAwMC1weTIuNy5lZ2cKZ3JlZW5sZXQtMC4zLjQtcHkyLjctd2luMzIuZWdnCmdpbnZva2UtMC4zLjEtcHkyLjcuZWdnCnB5b2JqY19mcmFtZXdvcmtfU2NyaXB0aW5nQnJpZGdlLTIuMy1weTIuNy5lZ2cKcGVjYW4tMC4yLjBhLXB5Mi43LmVnZwpweXJlc3MtMC4yLjAtcHkyLjcuZWdnCnB5b2JqY19mcmFtZXdvcmtfUHViU3ViLTIuMy1weTIuNy5lZ2cKcHlvYmpjX2ZyYW1ld29ya19FeGNlcHRpb25IYW5kbGluZy0yLjMtcHkyLjcuZWdnCnB5d3BzLXRydW5rLXB5Mi43LmVnZwpweW9iamNfZnJhbWV3b3JrX0NGTmV0d29yay0yLjMtcHkyLjctbWFjb3N4LTEwLjYtZmF0LmVnZwpweS5zYXVudGVyLTAuNDAtcHkyLjcuZWdnCnB5Zm5vcmRtZXRyaWMtMC4wLjEtcHkyLjcuZWdnCnB5d3MtMS4xLjEtcHkyLjcuZWdnCnByZXN0YXB5dC0wLjQuMC1weTIuNy5lZ2cKcGFzc2xpYi0xLjUuMy1weTIuNy5lZ2cKcHlnYS0yLjEtcHkyLjcuZWdnCnB5Z2l0aHViMy0wLjMtcHkyLjcuZWdnCnB5b2JqY19mcmFtZXdvcmtfT3BlbkRpcmVjdG9yeS0yLjMtcHkyLjcuZWdnCnlhcG9zaWItMC4yLjc1LXB5Mi43LWxpbnV4LXg4Nl82NC5lZ2cKUEsDBBQAAAAAAAAAIQCxvLn2skYAALJGAAAlAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvaW5zdGFsbC5weSIiIgpPcGVyYXRpb25zIG9uIGV4aXN0aW5nIHdoZWVsIGZpbGVzLCBpbmNsdWRpbmcgYmFzaWMgaW5zdGFsbGF0aW9uLiAKIiIiCiMgWFhYIHNlZSBwYXRjaGVkIHBpcCB0byBpbnN0YWxsCgppbXBvcnQgc3lzCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgb3MucGF0aAppbXBvcnQgcmUKaW1wb3J0IHppcGZpbGUKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IGNzdgoKaW1wb3J0IHNodXRpbAoKdHJ5OgogICAgX2JpZ19udW1iZXIgPSBzeXMubWF4c2l6ZQpleGNlcHQgTmFtZUVycm9yOgogICAgX2JpZ19udW1iZXIgPSBzeXMubWF4aW50Cgpmcm9tIC5kZWNvcmF0b3IgaW1wb3J0IHJlaWZ5CmZyb20gLnV0aWwgaW1wb3J0ICh1cmxzYWZlX2I2NGVuY29kZSwgZnJvbV9qc29uLCB1cmxzYWZlX2I2NGRlY29kZSwKICAgICAgICAgICAgICAgICAgIG5hdGl2ZSwgYmluYXJ5LCBIYXNoaW5nRmlsZSkKZnJvbSAuIGltcG9ydCBzaWduYXR1cmVzCmZyb20gLnBrZ2luZm8gaW1wb3J0IHJlYWRfcGtnX2luZm9fYnl0ZXMKZnJvbSAudXRpbCBpbXBvcnQgb3Blbl9mb3JfY3N2Cgpmcm9tIC5wZXA0MjV0YWdzIGltcG9ydCBnZXRfc3VwcG9ydGVkCmZyb20gLnBhdGhzIGltcG9ydCBnZXRfaW5zdGFsbF9wYXRocwoKIyBUaGUgbmV4dCBtYWpvciB2ZXJzaW9uIGFmdGVyIHRoaXMgdmVyc2lvbiBvZiB0aGUgJ3doZWVsJyB0b29sOgpWRVJTSU9OX1RPT19ISUdIID0gKDEsIDApCgojIE5vbi1ncmVlZHkgbWF0Y2hpbmcgb2YgYW4gb3B0aW9uYWwgYnVpbGQgbnVtYmVyIG1heSBiZSB0b28gY2xldmVyIChtb3JlCiMgaW52YWxpZCB3aGVlbCBmaWxlbmFtZXMgd2lsbCBtYXRjaCkuIFNlcGFyYXRlIHJlZ2V4IGZvciAuZGlzdC1pbmZvPwpXSEVFTF9JTkZPX1JFID0gcmUuY29tcGlsZSgKICAgIHIiIiJeKD9QPG5hbWV2ZXI+KD9QPG5hbWU+Lis/KSgtKD9QPHZlcj5cZC4rPykpPykKICAgICgoLSg/UDxidWlsZD5cZC4qPykpPy0oP1A8cHl2ZXI+Lis/KS0oP1A8YWJpPi4rPyktKD9QPHBsYXQ+Lis/KQogICAgXC53aGx8XC5kaXN0LWluZm8pJCIiIiwKICAgIHJlLlZFUkJPU0UpLm1hdGNoCgpkZWYgcGFyc2VfdmVyc2lvbih2ZXJzaW9uKToKICAgICIiIlVzZSBwYXJzZV92ZXJzaW9uIGZyb20gcGtnX3Jlc291cmNlcyBvciBkaXN0dXRpbHMgYXMgYXZhaWxhYmxlLiIiIgogICAgZ2xvYmFsIHBhcnNlX3ZlcnNpb24KICAgIHRyeToKICAgICAgICBmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IHBhcnNlX3ZlcnNpb24KICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBmcm9tIGRpc3R1dGlscy52ZXJzaW9uIGltcG9ydCBMb29zZVZlcnNpb24gYXMgcGFyc2VfdmVyc2lvbgogICAgcmV0dXJuIHBhcnNlX3ZlcnNpb24odmVyc2lvbikKCmNsYXNzIEJhZFdoZWVsRmlsZShWYWx1ZUVycm9yKToKICAgIHBhc3MKCgpjbGFzcyBXaGVlbEZpbGUob2JqZWN0KToKICAgICIiIlBhcnNlIHdoZWVsLXNwZWNpZmljIGF0dHJpYnV0ZXMgZnJvbSBhIHdoZWVsICgud2hsKSBmaWxlIGFuZCBvZmZlcgogICAgYmFzaWMgaW5zdGFsbGF0aW9uIGFuZCB2ZXJpZmljYXRpb24gc3VwcG9ydC4KICAgIAogICAgV2hlZWxGaWxlIGNhbiBiZSB1c2VkIHRvIHNpbXBseSBwYXJzZSBhIHdoZWVsIGZpbGVuYW1lIGJ5IGF2b2lkaW5nIHRoZQogICAgbWV0aG9kcyB0aGF0IHJlcXVpcmUgdGhlIGFjdHVhbCBmaWxlIGNvbnRlbnRzLiIiIgoKICAgIFdIRUVMX0lORk8gPSAiV0hFRUwiCiAgICBSRUNPUkQgPSAiUkVDT1JEIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgIGZpbGVuYW1lLAogICAgICAgICAgICAgICAgIGZwPU5vbmUsCiAgICAgICAgICAgICAgICAgYXBwZW5kPUZhbHNlLAogICAgICAgICAgICAgICAgIGNvbnRleHQ9Z2V0X3N1cHBvcnRlZCk6CiAgICAgICAgIiIiCiAgICAgICAgOnBhcmFtIGZwOiBBIHNlZWthYmxlIGZpbGUtbGlrZSBvYmplY3Qgb3IgTm9uZSB0byBvcGVuKGZpbGVuYW1lKS4KICAgICAgICA6cGFyYW0gYXBwZW5kOiBPcGVuIGFyY2hpdmUgaW4gYXBwZW5kIG1vZGUuCiAgICAgICAgOnBhcmFtIGNvbnRleHQ6IEZ1bmN0aW9uIHJldHVybmluZyBsaXN0IG9mIHN1cHBvcnRlZCB0YWdzLiBXaGVlbHMKICAgICAgICBtdXN0IGhhdmUgdGhlIHNhbWUgY29udGV4dCB0byBiZSBzb3J0YWJsZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKICAgICAgICBzZWxmLmZwID0gZnAKICAgICAgICBzZWxmLmFwcGVuZCA9IGFwcGVuZAogICAgICAgIHNlbGYuY29udGV4dCA9IGNvbnRleHQKICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpCiAgICAgICAgc2VsZi5wYXJzZWRfZmlsZW5hbWUgPSBXSEVFTF9JTkZPX1JFKGJhc2VuYW1lKQogICAgICAgIGlmIG5vdCBiYXNlbmFtZS5lbmRzd2l0aCgnLndobCcpIG9yIHNlbGYucGFyc2VkX2ZpbGVuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEJhZFdoZWVsRmlsZSgiQmFkIGZpbGVuYW1lICclcyciICUgZmlsZW5hbWUpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmZpbGVuYW1lCgogICAgQHByb3BlcnR5CiAgICBkZWYgZGlzdGluZm9fbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gIiVzLmRpc3QtaW5mbyIgJSBzZWxmLnBhcnNlZF9maWxlbmFtZS5ncm91cCgnbmFtZXZlcicpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZGF0YWRpcl9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiJXMuZGF0YSIgJSBzZWxmLnBhcnNlZF9maWxlbmFtZS5ncm91cCgnbmFtZXZlcicpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVjb3JkX25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuICIlcy8lcyIgJSAoc2VsZi5kaXN0aW5mb19uYW1lLCBzZWxmLlJFQ09SRCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB3aGVlbGluZm9fbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gIiVzLyVzIiAlIChzZWxmLmRpc3RpbmZvX25hbWUsIHNlbGYuV0hFRUxfSU5GTykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB0YWdzKHNlbGYpOgogICAgICAgICIiIkEgd2hlZWwgZmlsZSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIENhcnRlc2lhbiBwcm9kdWN0IG9mIHRoZQogICAgICAgIHBlcmlvZC1kZWxpbWl0ZWQgdGFncyBpbiBpdHMgZmlsZW5hbWUuCiAgICAgICAgVG8gY2hvb3NlIGEgd2hlZWwgZmlsZSBhbW9uZyBzZXZlcmFsIGNhbmRpZGF0ZXMgaGF2aW5nIHRoZSBzYW1lCiAgICAgICAgZGlzdHJpYnV0aW9uIHZlcnNpb24gJ3ZlcicsIGFuIGluc3RhbGxlciByYW5rcyBlYWNoIHRyaXBsZSBvZgogICAgICAgIChweXZlciwgYWJpLCBwbGF0KSB0aGF0IGl0cyBQeXRob24gaW5zdGFsbGF0aW9uIGNhbiBydW4sIHNvcnRpbmcKICAgICAgICB0aGUgd2hlZWxzIGJ5IHRoZSBiZXN0LXJhbmtlZCB0YWcgaXQgc3VwcG9ydHMgYW5kIHRoZW4gYnkgdGhlaXIKICAgICAgICBhcml0eSB3aGljaCBpcyBqdXN0IGxlbihsaXN0KGNvbXBhdGliaWxpdHlfdGFncykpLgogICAgICAgICIiIgogICAgICAgIHRhZ3MgPSBzZWxmLnBhcnNlZF9maWxlbmFtZS5ncm91cGRpY3QoKQogICAgICAgIGZvciBweXZlciBpbiB0YWdzWydweXZlciddLnNwbGl0KCcuJyk6CiAgICAgICAgICAgIGZvciBhYmkgaW4gdGFnc1snYWJpJ10uc3BsaXQoJy4nKToKICAgICAgICAgICAgICAgIGZvciBwbGF0IGluIHRhZ3NbJ3BsYXQnXS5zcGxpdCgnLicpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIChweXZlciwgYWJpLCBwbGF0KQoKICAgIGNvbXBhdGliaWxpdHlfdGFncyA9IHRhZ3MKCiAgICBAcHJvcGVydHkKICAgIGRlZiBhcml0eShzZWxmKToKICAgICAgICAiIiJUaGUgbnVtYmVyIG9mIGNvbXBhdGliaWxpdHkgdGFncyB0aGUgd2hlZWwgZGVjbGFyZXMuIiIiCiAgICAgICAgcmV0dXJuIGxlbihsaXN0KHNlbGYuY29tcGF0aWJpbGl0eV90YWdzKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiByYW5rKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIExvd2VzdCBpbmRleCBvZiBhbnkgb2YgdGhpcyB3aGVlbCdzIHRhZ3MgaW4gc2VsZi5jb250ZXh0KCksIGFuZCB0aGUKICAgICAgICBhcml0eSBlLmcuICgwLCAxKQogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLmNvbXBhdGliaWxpdHlfcmFuayhzZWxmLmNvbnRleHQoKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wYXRpYmxlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnJhbmtbMF0gIT0gX2JpZ19udW1iZXIgICMgYmFkIEFQSSEKCiAgICAjIGRlcHJlY2F0ZWQ6CiAgICBkZWYgY29tcGF0aWJpbGl0eV9yYW5rKHNlbGYsIHN1cHBvcnRlZCk6CiAgICAgICAgIiIiUmFuayB0aGUgd2hlZWwgYWdhaW5zdCB0aGUgc3VwcG9ydGVkIHRhZ3MuIFNtYWxsZXIgcmFua3MgYXJlIG1vcmUKICAgICAgICBjb21wYXRpYmxlIQoKICAgICAgICA6cGFyYW0gc3VwcG9ydGVkOiBBIGxpc3Qgb2YgY29tcGF0aWJpbGl0eSB0YWdzIHRoYXQgdGhlIGN1cnJlbnQKICAgICAgICAgICAgUHl0aG9uIGltcGxlbWVuYXRpb24gY2FuIHJ1bi4KICAgICAgICAiIiIKICAgICAgICBwcmVmZXJlbmNlcyA9IFtdCiAgICAgICAgZm9yIHRhZyBpbiBzZWxmLmNvbXBhdGliaWxpdHlfdGFnczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcHJlZmVyZW5jZXMuYXBwZW5kKHN1cHBvcnRlZC5pbmRleCh0YWcpKQogICAgICAgICAgICAjIFRhZyBub3QgcHJlc2VudAogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICBpZiBsZW4ocHJlZmVyZW5jZXMpOgogICAgICAgICAgICByZXR1cm4gKG1pbihwcmVmZXJlbmNlcyksIHNlbGYuYXJpdHkpCiAgICAgICAgcmV0dXJuIChfYmlnX251bWJlciwgMCkKCiAgICAjIGRlcHJlY2F0ZWQKICAgIGRlZiBzdXBwb3J0c19jdXJyZW50X3B5dGhvbihzZWxmLCB4KToKICAgICAgICBhc3NlcnQgc2VsZi5jb250ZXh0ID09IHgsICdjb250ZXh0IG1pc21hdGNoJwogICAgICAgIHJldHVybiBzZWxmLmNvbXBhdGlibGUKCiAgICAjIENvbXBhcmFiaWxpdHkuCiAgICAjIFdoZWVscyBhcmUgZXF1YWwgaWYgdGhleSByZWZlciB0byB0aGUgc2FtZSBmaWxlLgogICAgIyBJZiB0d28gd2hlZWxzIGFyZSBub3QgZXF1YWwsIGNvbXBhcmUgYmFzZWQgb24gKGluIHRoaXMgb3JkZXIpOgogICAgIyAgIDEuIE5hbWUKICAgICMgICAyLiBWZXJzaW9uCiAgICAjICAgMy4gQ29tcGF0aWJpbGl0eSByYW5rCiAgICAjICAgNC4gRmlsZW5hbWUgKGFzIGEgdGllYnJlYWtlcikKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9zb3J0X2tleShzZWxmKToKICAgICAgICByZXR1cm4gKHNlbGYucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCduYW1lJyksCiAgICAgICAgICAgICAgICBwYXJzZV92ZXJzaW9uKHNlbGYucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCd2ZXInKSksCiAgICAgICAgICAgICAgICB0dXBsZSgteCBmb3IgeCBpbiBzZWxmLnJhbmspLAogICAgICAgICAgICAgICAgc2VsZi5maWxlbmFtZSkKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5maWxlbmFtZSA9PSBvdGhlci5maWxlbmFtZQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmZpbGVuYW1lICE9IG90aGVyLmZpbGVuYW1lCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgc2VsZi5jb250ZXh0ICE9IG90aGVyLmNvbnRleHQ6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiezB9LmNvbnRleHQgIT0gezF9LmNvbnRleHQiLmZvcm1hdChzZWxmLCBvdGhlcikpCgogICAgICAgIHJldHVybiBzZWxmLl9zb3J0X2tleSA8IG90aGVyLl9zb3J0X2tleQoKICAgICAgICAjIFhYWCBwcnVuZQoKICAgICAgICBzbiA9IHNlbGYucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCduYW1lJykKICAgICAgICBvbiA9IG90aGVyLnBhcnNlZF9maWxlbmFtZS5ncm91cCgnbmFtZScpCiAgICAgICAgaWYgc24gIT0gb246CiAgICAgICAgICAgIHJldHVybiBzbiA8IG9uCiAgICAgICAgc3YgPSBwYXJzZV92ZXJzaW9uKHNlbGYucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCd2ZXInKSkKICAgICAgICBvdiA9IHBhcnNlX3ZlcnNpb24ob3RoZXIucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCd2ZXInKSkKICAgICAgICBpZiBzdiAhPSBvdjoKICAgICAgICAgICAgcmV0dXJuIHN2IDwgb3YKICAgICAgICAjIENvbXBhdGliaWxpdHkKICAgICAgICBpZiBzZWxmLmNvbnRleHQgIT0gb3RoZXIuY29udGV4dDoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJ7MH0uY29udGV4dCAhPSB7MX0uY29udGV4dCIuZm9ybWF0KHNlbGYsIG90aGVyKSkKICAgICAgICBzYyA9IHNlbGYucmFuawogICAgICAgIG9jID0gb3RoZXIucmFuawogICAgICAgIGlmIHNjICE9IE5vbmUgYW5kIG9jICE9IE5vbmUgYW5kIHNjICE9IG9jOgogICAgICAgICAgICAjIFNtYWxsZXIgY29tcGF0aWJpbGl0eSByYW5rcyBhcmUgImJldHRlciIgdGhhbiBsYXJnZXIgb25lcywKICAgICAgICAgICAgIyBzbyB3ZSBoYXZlIHRvIHJldmVyc2UgdGhlIHNlbnNlIG9mIHRoZSBjb21wYXJpc29uIGhlcmUhCiAgICAgICAgICAgIHJldHVybiBzYyA+IG9jCiAgICAgICAgZWxpZiBzYyA9PSBOb25lIGFuZCBvYyAhPSBOb25lOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gc2VsZi5maWxlbmFtZSA8IG90aGVyLmZpbGVuYW1lCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG90aGVyIDwgc2VsZgoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmID09IG90aGVyIG9yIHNlbGYgPCBvdGhlcgoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmID09IG90aGVyIG9yIG90aGVyIDwgc2VsZgoKICAgICMKICAgICMgTWV0aG9kcyB1c2luZyB0aGUgZmlsZSdzIGNvbnRlbnRzOgogICAgIwoKICAgIEByZWlmeQogICAgZGVmIHppcGZpbGUoc2VsZik6CiAgICAgICAgbW9kZSA9ICJyIgogICAgICAgIGlmIHNlbGYuYXBwZW5kOgogICAgICAgICAgICBtb2RlID0gImEiCiAgICAgICAgdnpmID0gVmVyaWZ5aW5nWmlwRmlsZShzZWxmLmZwIGlmIHNlbGYuZnAgZWxzZSBzZWxmLmZpbGVuYW1lLCBtb2RlKQogICAgICAgIGlmIG5vdCBzZWxmLmFwcGVuZDoKICAgICAgICAgICAgc2VsZi52ZXJpZnkodnpmKQogICAgICAgIHJldHVybiB2emYKCiAgICBAcmVpZnkKICAgIGRlZiBwYXJzZWRfd2hlZWxfaW5mbyhzZWxmKToKICAgICAgICAiIiJQYXJzZSB3aGVlbCBtZXRhZGF0YSAodGhlIC5kYXRhL1dIRUVMIGZpbGUpIiIiCiAgICAgICAgcmV0dXJuIHJlYWRfcGtnX2luZm9fYnl0ZXMoc2VsZi56aXBmaWxlLnJlYWQoc2VsZi53aGVlbGluZm9fbmFtZSkpCgogICAgZGVmIGNoZWNrX3ZlcnNpb24oc2VsZik6CiAgICAgICAgdmVyc2lvbiA9IHNlbGYucGFyc2VkX3doZWVsX2luZm9bJ1doZWVsLVZlcnNpb24nXQogICAgICAgIGlmIHR1cGxlKG1hcChpbnQsIHZlcnNpb24uc3BsaXQoJy4nKSkpID49IFZFUlNJT05fVE9PX0hJR0g6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIldoZWVsIHZlcnNpb24gaXMgdG9vIGhpZ2giKQoKICAgIEByZWlmeQogICAgZGVmIGluc3RhbGxfcGF0aHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ29uc3VsdCBkaXN0dXRpbHMgdG8gZ2V0IHRoZSBpbnN0YWxsIHBhdGhzIGZvciBvdXIgZGlzdC4gIEEgZGljdCB3aXRoCiAgICAgICAgKCdwdXJlbGliJywgJ3BsYXRsaWInLCAnaGVhZGVycycsICdzY3JpcHRzJywgJ2RhdGEnKS4KICAgICAgICAKICAgICAgICBXZSB1c2UgdGhlIG5hbWUgZnJvbSBvdXIgZmlsZW5hbWUgYXMgdGhlIGRpc3QgbmFtZSwgd2hpY2ggbWVhbnMgaGVhZGVycwogICAgICAgIGNvdWxkIGJlIGluc3RhbGxlZCBpbiB0aGUgd3JvbmcgcGxhY2UgaWYgdGhlIGZpbGVzeXN0ZW0tZXNjYXBlZCBuYW1lCiAgICAgICAgaXMgZGlmZmVyZW50IHRoYW4gdGhlIE5hbWUuICBXaG8gY2FyZXM/IAogICAgICAgICIiIgogICAgICAgIG5hbWUgPSBzZWxmLnBhcnNlZF9maWxlbmFtZS5ncm91cCgnbmFtZScpCiAgICAgICAgcmV0dXJuIGdldF9pbnN0YWxsX3BhdGhzKG5hbWUpCgogICAgZGVmIGluc3RhbGwoc2VsZiwgZm9yY2U9RmFsc2UsIG92ZXJyaWRlcz17fSk6CiAgICAgICAgIiIiCiAgICAgICAgSW5zdGFsbCB0aGUgd2hlZWwgaW50byBzaXRlLXBhY2thZ2VzLgogICAgICAgICIiIgoKICAgICAgICAjIFV0aWxpdHkgdG8gZ2V0IHRoZSB0YXJnZXQgZGlyZWN0b3J5IGZvciBhIHBhcnRpY3VsYXIga2V5CiAgICAgICAgZGVmIGdldF9wYXRoKGtleSk6CiAgICAgICAgICAgIHJldHVybiBvdmVycmlkZXMuZ2V0KGtleSkgb3Igc2VsZi5pbnN0YWxsX3BhdGhzW2tleV0KCiAgICAgICAgIyBUaGUgYmFzZSB0YXJnZXQgbG9jYXRpb24gaXMgZWl0aGVyIHB1cmVsaWIgb3IgcGxhdGxpYgogICAgICAgIGlmIHNlbGYucGFyc2VkX3doZWVsX2luZm9bJ1Jvb3QtSXMtUHVyZWxpYiddID09ICd0cnVlJzoKICAgICAgICAgICAgcm9vdCA9IGdldF9wYXRoKCdwdXJlbGliJykKICAgICAgICBlbHNlOgogICAgICAgICAgICByb290ID0gZ2V0X3BhdGgoJ3BsYXRsaWInKQoKICAgICAgICAjIFBhcnNlIGFsbCB0aGUgbmFtZXMgaW4gdGhlIGFyY2hpdmUKICAgICAgICBuYW1lX3RyYW5zID0ge30KICAgICAgICBmb3IgaW5mbyBpbiBzZWxmLnppcGZpbGUuaW5mb2xpc3QoKToKICAgICAgICAgICAgbmFtZSA9IGluZm8uZmlsZW5hbWUKICAgICAgICAgICAgIyBaaXAgZmlsZXMgY2FuIGNvbnRhaW4gZW50cmllcyByZXByZXNlbnRpbmcgZGlyZWN0b3JpZXMuCiAgICAgICAgICAgICMgVGhlc2UgZW5kIGluIGEgJy8nLgogICAgICAgICAgICAjIFdlIGlnbm9yZSB0aGVzZSwgYXMgd2UgY3JlYXRlIGRpcmVjdG9yaWVzIG9uIGRlbWFuZC4KICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLycpOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICMgUGF0aG5hbWVzIGluIGEgemlwZmlsZSBuYW1lbGlzdCBhcmUgYWx3YXlzIC8tc2VwYXJhdGVkLgogICAgICAgICAgICAjIEluIHRoZW9yeSwgcGF0aHMgY291bGQgc3RhcnQgd2l0aCAuLyBvciBoYXZlIG90aGVyIG9kZGl0aWVzCiAgICAgICAgICAgICMgYnV0IHRoaXMgd29uJ3QgaGFwcGVuIGluIHByYWN0aWNhbCBjYXNlcyBvZiB3ZWxsLWZvcm1lZCB3aGVlbHMuCiAgICAgICAgICAgICMgV2UnbGwgY292ZXIgdGhlIHNpbXBsZSBjYXNlIG9mIGFuIGluaXRpYWwgJy4vJyBhcyBpdCdzIGJvdGggZWFzeQogICAgICAgICAgICAjIHRvIGRvIGFuZCBtb3JlIGNvbW1vbiB0aGFuIG1vc3Qgb3RoZXIgb2RkaXRpZXMuCiAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnLi8nKToKICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lWzI6XQoKICAgICAgICAgICAgIyBTcGxpdCBvZmYgdGhlIGJhc2UgZGlyZWN0b3J5IHRvIGlkZW50aWZ5IGZpbGVzIHRoYXQgYXJlIHRvIGJlCiAgICAgICAgICAgICMgaW5zdGFsbGVkIGluIG5vbi1yb290IGxvY2F0aW9ucwogICAgICAgICAgICBiYXNlZGlyLCBzZXAsIGZpbGVuYW1lID0gbmFtZS5wYXJ0aXRpb24oJy8nKQogICAgICAgICAgICBpZiBzZXAgYW5kIGJhc2VkaXIgPT0gc2VsZi5kYXRhZGlyX25hbWU6CiAgICAgICAgICAgICAgICAjIERhdGEgZmlsZS4gVGFyZ2V0IGRlc3RpbmF0aW9uIGlzIGVsc2V3aGVyZQogICAgICAgICAgICAgICAga2V5LCBzZXAsIGZpbGVuYW1lID0gZmlsZW5hbWUucGFydGl0aW9uKCcvJykKICAgICAgICAgICAgICAgIGlmIG5vdCBzZXA6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBmaWxlbmFtZSBpbiB3aGVlbDogezB9Ii5mb3JtYXQobmFtZSkpCiAgICAgICAgICAgICAgICB0YXJnZXQgPSBnZXRfcGF0aChrZXkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIE5vcm1hbCBmaWxlLiBUYXJnZXQgZGVzdGluYXRpb24gaXMgcm9vdAogICAgICAgICAgICAgICAga2V5ID0gJycKICAgICAgICAgICAgICAgIHRhcmdldCA9IHJvb3QKICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbmFtZQoKICAgICAgICAgICAgIyBNYXAgdGhlIGFjdHVhbCBmaWxlbmFtZSBmcm9tIHRoZSB6aXBmaWxlIHRvIGl0cyBpbnRlbmRlZCB0YXJnZXQKICAgICAgICAgICAgIyBkaXJlY3RvcnkgYW5kIHRoZSBwYXRobmFtZSByZWxhdGl2ZSB0byB0aGF0IGRpcmVjdG9yeS4KICAgICAgICAgICAgZGVzdCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKHRhcmdldCwgZmlsZW5hbWUpKQogICAgICAgICAgICBuYW1lX3RyYW5zW2luZm9dID0gKGtleSwgdGFyZ2V0LCBmaWxlbmFtZSwgZGVzdCkKCiAgICAgICAgIyBXZSdyZSBub3cgcmVhZHkgdG8gc3RhcnQgcHJvY2Vzc2luZyB0aGUgYWN0dWFsIGluc3RhbGwuIFRoZSBwcm9jZXNzCiAgICAgICAgIyBpcyBhcyBmb2xsb3dzOgogICAgICAgICMgICAxLiBQcmVjaGVja3MgLSBpcyB0aGUgd2hlZWwgdmFsaWQsIGlzIGl0cyBkZWNsYXJlZCBhcmNoaXRlY3R1cmUKICAgICAgICAjICAgICAgT0ssIGV0Yy4gW1tSZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyXV0KICAgICAgICAjICAgMi4gT3ZlcndyaXRlIGNoZWNrIC0gZG8gYW55IG9mIHRoZSBmaWxlcyB0byBiZSBpbnN0YWxsZWQgYWxyZWFkeQogICAgICAgICMgICAgICBleGlzdD8KICAgICAgICAjICAgMy4gQWN0dWFsIGluc3RhbGwgLSBwdXQgdGhlIGZpbGVzIGluIHRoZWlyIHRhcmdldCBsb2NhdGlvbnMuCiAgICAgICAgIyAgIDQuIFVwZGF0ZSBSRUNPUkQgLSB3cml0ZSBhIHN1aXRhYmx5IG1vZGlmaWVkIFJFQ09SRCBmaWxlIHRvCiAgICAgICAgIyAgICAgIHJlZmxlY3QgdGhlIGFjdHVhbCBpbnN0YWxsZWQgcGF0aHMuCgogICAgICAgIGlmIG5vdCBmb3JjZToKICAgICAgICAgICAgZm9yIGluZm8sIHYgaW4gbmFtZV90cmFucy5pdGVtcygpOgogICAgICAgICAgICAgICAgayA9IGluZm8uZmlsZW5hbWUKICAgICAgICAgICAgICAgIGtleSwgdGFyZ2V0LCBmaWxlbmFtZSwgZGVzdCA9IHYKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRlc3QpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIldoZWVsIGZpbGUgezB9IHdvdWxkIG92ZXJ3cml0ZSB7MX0uIFVzZSBmb3JjZSBpZiB0aGlzIGlzIGludGVuZGVkIi5mb3JtYXQoaywgZGVzdCkpCgogICAgICAgICMgR2V0IHRoZSBuYW1lIG9mIG91ciBleGVjdXRhYmxlLCBmb3IgdXNlIHdoZW4gcmVwbGFjaW5nIHNjcmlwdAogICAgICAgICMgd3JhcHBlciBoYXNoYmFuZyBsaW5lcy4KICAgICAgICAjIFdlIGVuY29kZSBpdCB1c2luZyBnZXRmaWxlc3lzdGVtZW5jb2RpbmcsIGFzIHRoYXQgaXMgInRoZSBuYW1lIG9mCiAgICAgICAgIyB0aGUgZW5jb2RpbmcgdXNlZCB0byBjb252ZXJ0IFVuaWNvZGUgZmlsZW5hbWVzIGludG8gc3lzdGVtIGZpbGUKICAgICAgICAjIG5hbWVzIi4KICAgICAgICBleGVuYW1lID0gc3lzLmV4ZWN1dGFibGUuZW5jb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKICAgICAgICByZWNvcmRfZGF0YSA9IFtdCiAgICAgICAgcmVjb3JkX25hbWUgPSBzZWxmLmRpc3RpbmZvX25hbWUgKyAnL1JFQ09SRCcKICAgICAgICBmb3IgaW5mbywgKGtleSwgdGFyZ2V0LCBmaWxlbmFtZSwgZGVzdCkgaW4gbmFtZV90cmFucy5pdGVtcygpOgogICAgICAgICAgICBuYW1lID0gaW5mby5maWxlbmFtZQogICAgICAgICAgICBzb3VyY2UgPSBzZWxmLnppcGZpbGUub3BlbihpbmZvKQogICAgICAgICAgICAjIFNraXAgdGhlIFJFQ09SRCBmaWxlCiAgICAgICAgICAgIGlmIG5hbWUgPT0gcmVjb3JkX25hbWU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBkZGlyID0gb3MucGF0aC5kaXJuYW1lKGRlc3QpCiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRkaXIpOgogICAgICAgICAgICAgICAgb3MubWFrZWRpcnMoZGRpcikKICAgICAgICAgICAgZGVzdGluYXRpb24gPSBIYXNoaW5nRmlsZShvcGVuKGRlc3QsICd3YicpKQogICAgICAgICAgICBpZiBrZXkgPT0gJ3NjcmlwdHMnOgogICAgICAgICAgICAgICAgaGFzaGJhbmcgPSBzb3VyY2UucmVhZGxpbmUoKQogICAgICAgICAgICAgICAgaWYgaGFzaGJhbmcuc3RhcnRzd2l0aChiJyMhcHl0aG9uJyk6CiAgICAgICAgICAgICAgICAgICAgaGFzaGJhbmcgPSBiJyMhJyArIGV4ZW5hbWUgKyBiaW5hcnkob3MubGluZXNlcCkKICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLndyaXRlKGhhc2hiYW5nKQogICAgICAgICAgICBzaHV0aWwuY29weWZpbGVvYmooc291cmNlLCBkZXN0aW5hdGlvbikKICAgICAgICAgICAgcmVsZGVzdCA9IG9zLnBhdGgucmVscGF0aChkZXN0LCByb290KQogICAgICAgICAgICByZWxkZXN0LnJlcGxhY2Uob3Muc2VwLCAnLycpCiAgICAgICAgICAgIHJlY29yZF9kYXRhLmFwcGVuZCgocmVsZGVzdCwgZGVzdGluYXRpb24uZGlnZXN0KCksIGRlc3RpbmF0aW9uLmxlbmd0aCkpCiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmNsb3NlKCkKICAgICAgICAgICAgc291cmNlLmNsb3NlKCkKICAgICAgICAgICAgIyBwcmVzZXJ2ZSBhdHRyaWJ1dGVzIChlc3BlY2lhbGx5ICt4IGJpdCBmb3Igc2NyaXB0cykKICAgICAgICAgICAgYXR0cnMgPSBpbmZvLmV4dGVybmFsX2F0dHIgPj4gMTYKICAgICAgICAgICAgaWYgYXR0cnM6ICAjIHRlbmRzIHRvIGJlIDAgaWYgV2luZG93cy4KICAgICAgICAgICAgICAgIG9zLmNobW9kKGRlc3QsIGluZm8uZXh0ZXJuYWxfYXR0ciA+PiAxNikKCiAgICAgICAgcmVjb3JkX25hbWUgPSBvcy5wYXRoLmpvaW4ocm9vdCwgc2VsZi5yZWNvcmRfbmFtZSkKICAgICAgICB3aXRoIG9wZW5fZm9yX2NzdihyZWNvcmRfbmFtZSwgJ3crJykgYXMgcmVjb3JkX2ZpbGU6CiAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIocmVjb3JkX2ZpbGUpCiAgICAgICAgICAgIGZvciByZWxkZXN0LCBkaWdlc3QsIGxlbmd0aCBpbiBzb3J0ZWQocmVjb3JkX2RhdGEpOgogICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KChyZWxkZXN0LCBkaWdlc3QsIGxlbmd0aCkpCiAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdygoc2VsZi5yZWNvcmRfbmFtZSwgJycsICcnKSkKCiAgICBkZWYgdmVyaWZ5KHNlbGYsIHppcGZpbGU9Tm9uZSk6CiAgICAgICAgIiIiQ29uZmlndXJlIHRoZSBWZXJpZnlpbmdaaXBGaWxlIGB6aXBmaWxlYCBieSB2ZXJpZnlpbmcgaXRzIHNpZ25hdHVyZSAKICAgICAgICBhbmQgc2V0dGluZyBleHBlY3RlZCBoYXNoZXMgZm9yIGV2ZXJ5IGhhc2ggaW4gUkVDT1JELgogICAgICAgIENhbGxlciBtdXN0IGNvbXBsZXRlIHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSBjb21wbGV0ZWx5IHJlYWRpbmcgCiAgICAgICAgZXZlcnkgZmlsZSBpbiB0aGUgYXJjaGl2ZSAoZS5nLiB3aXRoIGV4dHJhY3RhbGwpLiIiIgogICAgICAgIHNpZyA9IE5vbmUKICAgICAgICBpZiB6aXBmaWxlIGlzIE5vbmU6CiAgICAgICAgICAgIHppcGZpbGUgPSBzZWxmLnppcGZpbGUKICAgICAgICB6aXBmaWxlLnN0cmljdCA9IFRydWUKCiAgICAgICAgcmVjb3JkX25hbWUgPSAnLycuam9pbigoc2VsZi5kaXN0aW5mb19uYW1lLCAnUkVDT1JEJykpCiAgICAgICAgc2lnX25hbWUgPSAnLycuam9pbigoc2VsZi5kaXN0aW5mb19uYW1lLCAnUkVDT1JELmp3cycpKQogICAgICAgICMgdG9sZXJhdGUgcy9taW1lIHNpZ25hdHVyZXM6CiAgICAgICAgc21pbWVfc2lnX25hbWUgPSAnLycuam9pbigoc2VsZi5kaXN0aW5mb19uYW1lLCAnUkVDT1JELnA3cycpKQogICAgICAgIHppcGZpbGUuc2V0X2V4cGVjdGVkX2hhc2gocmVjb3JkX25hbWUsIE5vbmUpCiAgICAgICAgemlwZmlsZS5zZXRfZXhwZWN0ZWRfaGFzaChzaWdfbmFtZSwgTm9uZSkKICAgICAgICB6aXBmaWxlLnNldF9leHBlY3RlZF9oYXNoKHNtaW1lX3NpZ19uYW1lLCBOb25lKQogICAgICAgIHJlY29yZCA9IHppcGZpbGUucmVhZChyZWNvcmRfbmFtZSkKCiAgICAgICAgcmVjb3JkX2RpZ2VzdCA9IHVybHNhZmVfYjY0ZW5jb2RlKGhhc2hsaWIuc2hhMjU2KHJlY29yZCkuZGlnZXN0KCkpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzaWcgPSBmcm9tX2pzb24obmF0aXZlKHppcGZpbGUucmVhZChzaWdfbmFtZSkpKQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjogICMgbm8gc2lnbmF0dXJlCiAgICAgICAgICAgIHBhc3MKICAgICAgICBpZiBzaWc6CiAgICAgICAgICAgIGhlYWRlcnMsIHBheWxvYWQgPSBzaWduYXR1cmVzLnZlcmlmeShzaWcpCiAgICAgICAgICAgIGlmIHBheWxvYWRbJ2hhc2gnXSAhPSAic2hhMjU2PSIgKyBuYXRpdmUocmVjb3JkX2RpZ2VzdCk6CiAgICAgICAgICAgICAgICBtc2cgPSAiUkVDT1JELnNpZyBjbGFpbWVkIFJFQ09SRCBoYXNoIHswfSAhPSBjb21wdXRlZCBoYXNoIHsxfS4iCiAgICAgICAgICAgICAgICByYWlzZSBCYWRXaGVlbEZpbGUobXNnLmZvcm1hdChwYXlsb2FkWydoYXNoJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmUocmVjb3JkX2RpZ2VzdCkpKQoKICAgICAgICByZWFkZXIgPSBjc3YucmVhZGVyKChuYXRpdmUocikgZm9yIHIgaW4gcmVjb3JkLnNwbGl0bGluZXMoKSkpCgogICAgICAgIGZvciByb3cgaW4gcmVhZGVyOgogICAgICAgICAgICBmaWxlbmFtZSA9IHJvd1swXQogICAgICAgICAgICBoYXNoID0gcm93WzFdCiAgICAgICAgICAgIGlmIG5vdCBoYXNoOgogICAgICAgICAgICAgICAgaWYgZmlsZW5hbWUgbm90IGluIChyZWNvcmRfbmFtZSwgc2lnX25hbWUpOgogICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIiVzIGhhcyBubyBoYXNoIVxuIiAlIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgYWxnbywgZGF0YSA9IHJvd1sxXS5zcGxpdCgnPScsIDEpCiAgICAgICAgICAgIGFzc2VydCBhbGdvID09ICJzaGEyNTYiLCAiVW5zdXBwb3J0ZWQgaGFzaCBhbGdvcml0aG0iCiAgICAgICAgICAgIHppcGZpbGUuc2V0X2V4cGVjdGVkX2hhc2goZmlsZW5hbWUsIHVybHNhZmVfYjY0ZGVjb2RlKGJpbmFyeShkYXRhKSkpCgoKY2xhc3MgVmVyaWZ5aW5nWmlwRmlsZSh6aXBmaWxlLlppcEZpbGUpOgogICAgIiIiWmlwRmlsZSB0aGF0IGNhbiBhc3NlcnQgdGhhdCBlYWNoIG9mIGl0cyBleHRyYWN0ZWQgY29udGVudHMgbWF0Y2hlcwogICAgYW4gZXhwZWN0ZWQgc2hhMjU2IGhhc2guIE5vdGUgdGhhdCBlYWNoIGZpbGUgbXVzdCBiZSBjb21wbGV0bHkgcmVhZCBpbiAKICAgIG9yZGVyIGZvciBpdHMgaGFzaCB0byBiZSBjaGVja2VkLiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlLCBtb2RlPSJyIiwKICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbj16aXBmaWxlLlpJUF9TVE9SRUQsCiAgICAgICAgICAgICAgICAgYWxsb3daaXA2ND1GYWxzZSk6CiAgICAgICAgemlwZmlsZS5aaXBGaWxlLl9faW5pdF9fKHNlbGYsIGZpbGUsIG1vZGUsIGNvbXByZXNzaW9uLCBhbGxvd1ppcDY0KQoKICAgICAgICBzZWxmLnN0cmljdCA9IEZhbHNlCiAgICAgICAgc2VsZi5fZXhwZWN0ZWRfaGFzaGVzID0ge30KICAgICAgICBzZWxmLl9oYXNoX2FsZ29yaXRobSA9IGhhc2hsaWIuc2hhMjU2CgogICAgZGVmIHNldF9leHBlY3RlZF9oYXNoKHNlbGYsIG5hbWUsIGhhc2gpOgogICAgICAgICIiIgogICAgICAgIDpwYXJhbSBuYW1lOiBuYW1lIG9mIHppcCBlbnRyeQogICAgICAgIDpwYXJhbSBoYXNoOiBieXRlcyBvZiBoYXNoIChvciBOb25lIGZvciAiZG9uJ3QgY2FyZSIpCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fZXhwZWN0ZWRfaGFzaGVzW25hbWVdID0gaGFzaAoKICAgIGRlZiBvcGVuKHNlbGYsIG5hbWVfb3JfaW5mbywgbW9kZT0iciIsIHB3ZD1Ob25lKToKICAgICAgICAiIiJSZXR1cm4gZmlsZS1saWtlIG9iamVjdCBmb3IgJ25hbWUnLiIiIgogICAgICAgICMgQSBub24tbW9ua2V5LXBhdGNoZWQgdmVyc2lvbiB3b3VsZCBjb250YWluIG1vc3Qgb2YgemlwZmlsZS5weQogICAgICAgIGVmID0gemlwZmlsZS5aaXBGaWxlLm9wZW4oc2VsZiwgbmFtZV9vcl9pbmZvLCBtb2RlLCBwd2QpCiAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lX29yX2luZm8sIHppcGZpbGUuWmlwSW5mbyk6CiAgICAgICAgICAgIG5hbWUgPSBuYW1lX29yX2luZm8uZmlsZW5hbWUKICAgICAgICBlbHNlOgogICAgICAgICAgICBuYW1lID0gbmFtZV9vcl9pbmZvCiAgICAgICAgaWYgKG5hbWUgaW4gc2VsZi5fZXhwZWN0ZWRfaGFzaGVzCiAgICAgICAgICAgIGFuZCBzZWxmLl9leHBlY3RlZF9oYXNoZXNbbmFtZV0gIT0gTm9uZSk6CiAgICAgICAgICAgIGV4cGVjdGVkX2hhc2ggPSBzZWxmLl9leHBlY3RlZF9oYXNoZXNbbmFtZV0KICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgX3VwZGF0ZV9jcmNfb3JpZyA9IGVmLl91cGRhdGVfY3JjCiAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oJ05lZWQgWmlwRXh0RmlsZS5fdXBkYXRlX2NyYyB0byBpbXBsZW1lbnQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmlsZSBoYXNoIHZlcmlmaWNhdGlvbiAoaW4gUHl0aG9uID49IDIuNyknKQogICAgICAgICAgICAgICAgcmV0dXJuIGVmCiAgICAgICAgICAgIHJ1bm5pbmdfaGFzaCA9IHNlbGYuX2hhc2hfYWxnb3JpdGhtKCkKICAgICAgICAgICAgaWYgaGFzYXR0cihlZiwgJ19lb2YnKTogICMgcHkzMwogICAgICAgICAgICAgICAgZGVmIF91cGRhdGVfY3JjKGRhdGEpOgogICAgICAgICAgICAgICAgICAgIF91cGRhdGVfY3JjX29yaWcoZGF0YSkKICAgICAgICAgICAgICAgICAgICBydW5uaW5nX2hhc2gudXBkYXRlKGRhdGEpCiAgICAgICAgICAgICAgICAgICAgaWYgZWYuX2VvZiBhbmQgcnVubmluZ19oYXNoLmRpZ2VzdCgpICE9IGV4cGVjdGVkX2hhc2g6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEJhZFdoZWVsRmlsZSgiQmFkIGhhc2ggZm9yIGZpbGUgJXIiICUgZWYubmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGRlZiBfdXBkYXRlX2NyYyhkYXRhLCBlb2Y9Tm9uZSk6CiAgICAgICAgICAgICAgICAgICAgX3VwZGF0ZV9jcmNfb3JpZyhkYXRhLCBlb2Y9ZW9mKQogICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdfaGFzaC51cGRhdGUoZGF0YSkKICAgICAgICAgICAgICAgICAgICBpZiBlb2YgYW5kIHJ1bm5pbmdfaGFzaC5kaWdlc3QoKSAhPSBleHBlY3RlZF9oYXNoOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBCYWRXaGVlbEZpbGUoIkJhZCBoYXNoIGZvciBmaWxlICVyIiAlIGVmLm5hbWUpCiAgICAgICAgICAgIGVmLl91cGRhdGVfY3JjID0gX3VwZGF0ZV9jcmMKICAgICAgICBlbGlmIHNlbGYuc3RyaWN0IGFuZCBuYW1lIG5vdCBpbiBzZWxmLl9leHBlY3RlZF9oYXNoZXM6CiAgICAgICAgICAgIHJhaXNlIEJhZFdoZWVsRmlsZSgiTm8gZXhwZWN0ZWQgaGFzaCBmb3IgZmlsZSAlciIgJSBlZi5uYW1lKQogICAgICAgIHJldHVybiBlZgoKICAgIGRlZiBwb3Aoc2VsZik6CiAgICAgICAgIiIiVHJ1bmNhdGUgdGhlIGxhc3QgZmlsZSBvZmYgdGhpcyB6aXBmaWxlLgogICAgICAgIEFzc3VtZXMgaW5mb2xpc3QoKSBpcyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgZmlsZXMgKHRydWUgZm9yCiAgICAgICAgb3JkaW5hcnkgemlwIGZpbGVzIGNyZWF0ZWQgYnkgUHl0aG9uKSIiIgogICAgICAgIGlmIG5vdCBzZWxmLmZwOgogICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCiAgICAgICAgICAgICAgICAgICJBdHRlbXB0IHRvIHBvcCBmcm9tIFpJUCBhcmNoaXZlIHRoYXQgd2FzIGFscmVhZHkgY2xvc2VkIikKICAgICAgICBsYXN0ID0gc2VsZi5pbmZvbGlzdCgpLnBvcCgpCiAgICAgICAgZGVsIHNlbGYuTmFtZVRvSW5mb1tsYXN0LmZpbGVuYW1lXQogICAgICAgIHNlbGYuZnAuc2VlayhsYXN0LmhlYWRlcl9vZmZzZXQsIG9zLlNFRUtfU0VUKQogICAgICAgIHNlbGYuZnAudHJ1bmNhdGUoKQogICAgICAgIHNlbGYuX2RpZE1vZGlmeSA9IFRydWUKUEsDBBQAAAAAAAAAIQA5KHcLnC0AAJwtAAAmAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvbWV0YWRhdGEucHkiIiIKVG9vbHMgZm9yIGNvbnZlcnRpbmcgb2xkLSB0byBuZXctc3R5bGUgbWV0YWRhdGEuCiIiIgoKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQpmcm9tIC5wa2dpbmZvIGltcG9ydCByZWFkX3BrZ19pbmZvCmZyb20gLnV0aWwgaW1wb3J0IE9yZGVyZWREZWZhdWx0RGljdAp0cnk6CiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBPcmRlcmVkRGljdCA9IGRpY3QKCmltcG9ydCByZQppbXBvcnQgb3MucGF0aAppbXBvcnQgdGV4dHdyYXAKaW1wb3J0IHBrZ19yZXNvdXJjZXMKaW1wb3J0IGVtYWlsLnBhcnNlcgoKZnJvbSAuIGltcG9ydCBfX3ZlcnNpb25fXyBhcyB3aGVlbF92ZXJzaW9uCgpNRVRBREFUQV9WRVJTSU9OID0gIjIuMCIKClBMVVJBTF9GSUVMRFMgPSB7ICJjbGFzc2lmaWVyIiA6ICJjbGFzc2lmaWVycyIsCiAgICAgICAgICAgICAgICAgICJwcm92aWRlc19kaXN0IiA6ICJwcm92aWRlcyIsCiAgICAgICAgICAgICAgICAgICJwcm92aWRlc19leHRyYSIgOiAiZXh0cmFzIiB9CgpTS0lQX0ZJRUxEUyA9IHNldCgpCgpDT05UQUNUX0ZJRUxEUyA9ICgoeyJlbWFpbCI6ImF1dGhvcl9lbWFpbCIsICJuYW1lIjogImF1dGhvciJ9LAogICAgICAgICAgICAgICAgICAgICJhdXRob3IiKSwKICAgICAgICAgICAgICAgICAgKHsiZW1haWwiOiJtYWludGFpbmVyX2VtYWlsIiwgIm5hbWUiOiAibWFpbnRhaW5lciJ9LAogICAgICAgICAgICAgICAgICAgICJtYWludGFpbmVyIikpCgojIGNvbW1vbmx5IGZpbGxlZCBvdXQgYXMgIlVOS05PV04iIGJ5IGRpc3R1dGlsczoKVU5LTk9XTl9GSUVMRFMgPSBzZXQoKCJhdXRob3IiLCAiYXV0aG9yX2VtYWlsIiwgInBsYXRmb3JtIiwgImhvbWVfcGFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAibGljZW5zZSIpKQoKIyBXaGVlbCBpdHNlbGYgaXMgcHJvYmFibHkgdGhlIG9ubHkgcHJvZ3JhbSB0aGF0IHVzZXMgbm9uLWV4dHJhcyBtYXJrZXJzCiMgaW4gTUVUQURBVEEvUEtHLUlORk8uIFN1cHBvcnQgaXRzIHN5bnRheCB3aXRoIHRoZSBleHRyYSBhdCB0aGUgZW5kIG9ubHkuCkVYVFJBX1JFID0gcmUuY29tcGlsZSgiIiJeKD9QPHBhY2thZ2U+Lio/KSg7XHMqKD9QPGNvbmRpdGlvbj4uKj8pKGV4dHJhID09ICcoP1A8ZXh0cmE+Lio/KScpPykkIiIiKQpLRVlXT1JEU19SRSA9IHJlLmNvbXBpbGUoIltcMC0sXSsiKQoKTWF5UmVxdWlyZXNLZXkgPSBuYW1lZHR1cGxlKCdNYXlSZXF1aXJlc0tleScsICgnY29uZGl0aW9uJywgJ2V4dHJhJykpCgpkZWYgdW5pcXVlKGl0ZXJhYmxlKToKICAgICIiIgogICAgWWllbGQgdW5pcXVlIHZhbHVlcyBpbiBpdGVyYWJsZSwgcHJlc2VydmluZyBvcmRlci4KICAgICIiIgogICAgc2VlbiA9IHNldCgpCiAgICBmb3IgdmFsdWUgaW4gaXRlcmFibGU6CiAgICAgICAgaWYgbm90IHZhbHVlIGluIHNlZW46CiAgICAgICAgICAgIHNlZW4uYWRkKHZhbHVlKQogICAgICAgICAgICB5aWVsZCB2YWx1ZQoKCmRlZiBoYW5kbGVfcmVxdWlyZXMobWV0YWRhdGEsIHBrZ19pbmZvLCBrZXkpOgogICAgIiIiCiAgICBQbGFjZSB0aGUgcnVudGltZSByZXF1aXJlbWVudHMgZnJvbSBwa2dfaW5mbyBpbnRvIG1ldGFkYXRhLgogICAgIiIiCiAgICBtYXlfcmVxdWlyZXMgPSBPcmRlcmVkRGVmYXVsdERpY3QobGlzdCkKICAgIGZvciB2YWx1ZSBpbiBzb3J0ZWQocGtnX2luZm8uZ2V0X2FsbChrZXkpKToKICAgICAgICBleHRyYV9tYXRjaCA9IEVYVFJBX1JFLnNlYXJjaCh2YWx1ZSkKICAgICAgICBpZiBleHRyYV9tYXRjaDoKICAgICAgICAgICAgZ3JvdXBkaWN0ID0gZXh0cmFfbWF0Y2guZ3JvdXBkaWN0KCkKICAgICAgICAgICAgY29uZGl0aW9uID0gZ3JvdXBkaWN0Wydjb25kaXRpb24nXQogICAgICAgICAgICBleHRyYSA9IGdyb3VwZGljdFsnZXh0cmEnXQogICAgICAgICAgICBwYWNrYWdlID0gZ3JvdXBkaWN0WydwYWNrYWdlJ10KICAgICAgICAgICAgaWYgY29uZGl0aW9uLmVuZHN3aXRoKCcgYW5kICcpOgogICAgICAgICAgICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uWzotNV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBjb25kaXRpb24sIGV4dHJhID0gTm9uZSwgTm9uZQogICAgICAgICAgICBwYWNrYWdlID0gdmFsdWUKICAgICAgICBrZXkgPSBNYXlSZXF1aXJlc0tleShjb25kaXRpb24sIGV4dHJhKQogICAgICAgIG1heV9yZXF1aXJlc1trZXldLmFwcGVuZChwYWNrYWdlKQoKICAgIGlmIG1heV9yZXF1aXJlczoKICAgICAgICBtZXRhZGF0YVsncnVuX3JlcXVpcmVzJ10gPSBbXQogICAgICAgIGRlZiBzb3J0X2tleShpdGVtKToKICAgICAgICAgICAgIyBCb3RoIGNvbmRpdGlvbiBhbmQgZXh0cmEgY291bGQgYmUgTm9uZSwgd2hpY2ggY2FuJ3QgYmUgY29tcGFyZWQKICAgICAgICAgICAgIyBhZ2FpbnN0IHN0cmluZ3MgaW4gUHl0aG9uIDMuCiAgICAgICAgICAgIGtleSwgdmFsdWUgPSBpdGVtCiAgICAgICAgICAgIGlmIGtleS5jb25kaXRpb24gaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiAnJwogICAgICAgICAgICByZXR1cm4ga2V5LmNvbmRpdGlvbgogICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNvcnRlZChtYXlfcmVxdWlyZXMuaXRlbXMoKSwga2V5PXNvcnRfa2V5KToKICAgICAgICAgICAgbWF5X3JlcXVpcmVtZW50ID0gT3JkZXJlZERpY3QoKCgncmVxdWlyZXMnLCB2YWx1ZSksKSkKICAgICAgICAgICAgaWYga2V5LmV4dHJhOgogICAgICAgICAgICAgICAgbWF5X3JlcXVpcmVtZW50WydleHRyYSddID0ga2V5LmV4dHJhCiAgICAgICAgICAgIGlmIGtleS5jb25kaXRpb246CiAgICAgICAgICAgICAgICBtYXlfcmVxdWlyZW1lbnRbJ2Vudmlyb25tZW50J10gPSBrZXkuY29uZGl0aW9uCiAgICAgICAgICAgIG1ldGFkYXRhWydydW5fcmVxdWlyZXMnXS5hcHBlbmQobWF5X3JlcXVpcmVtZW50KQoKICAgICAgICBpZiBub3QgJ2V4dHJhcycgaW4gbWV0YWRhdGE6CiAgICAgICAgICAgIG1ldGFkYXRhWydleHRyYXMnXSA9IFtdCiAgICAgICAgbWV0YWRhdGFbJ2V4dHJhcyddLmV4dGVuZChba2V5LmV4dHJhIGZvciBrZXkgaW4gbWF5X3JlcXVpcmVzLmtleXMoKSBpZiBrZXkuZXh0cmFdKQoKCmRlZiBwa2dpbmZvX3RvX2RpY3QocGF0aCwgZGlzdHJpYnV0aW9uPU5vbmUpOgogICAgIiIiCiAgICBDb252ZXJ0IFBLRy1JTkZPIHRvIGEgcHJvdG90eXBlIE1ldGFkYXRhIDIuMCAoUEVQIDQyNikgZGljdC4KCiAgICBUaGUgZGVzY3JpcHRpb24gaXMgaW5jbHVkZWQgdW5kZXIgdGhlIGtleSBbJ2Rlc2NyaXB0aW9uJ10gcmF0aGVyIHRoYW4KICAgIGJlaW5nIHdyaXR0ZW4gdG8gYSBzZXBhcmF0ZSBmaWxlLgoKICAgIHBhdGg6IHBhdGggdG8gUEtHLUlORk8gZmlsZQogICAgZGlzdHJpYnV0aW9uOiBvcHRpb25hbCBkaXN0dXRpbHMgRGlzdHJpYnV0aW9uKCkKICAgICIiIgoKICAgIG1ldGFkYXRhID0gT3JkZXJlZERlZmF1bHREaWN0KGxhbWJkYTogT3JkZXJlZERlZmF1bHREaWN0KGxhbWJkYTogT3JkZXJlZERlZmF1bHREaWN0KE9yZGVyZWREaWN0KSkpCiAgICBtZXRhZGF0YVsiZ2VuZXJhdG9yIl0gPSAiYmRpc3Rfd2hlZWwgKCIgKyB3aGVlbF92ZXJzaW9uICsgIikiCiAgICB0cnk6CiAgICAgICAgdW5pY29kZQogICAgICAgIHBrZ19pbmZvID0gcmVhZF9wa2dfaW5mbyhwYXRoKQogICAgZXhjZXB0IE5hbWVFcnJvcjoKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgcGtnX2luZm9fZmlsZToKICAgICAgICAgICAgcGtnX2luZm8gPSBlbWFpbC5wYXJzZXIuUGFyc2VyKCkucGFyc2VzdHIocGtnX2luZm9fZmlsZS5yZWFkKCkuZGVjb2RlKCd1dGYtOCcpKQogICAgZGVzY3JpcHRpb24gPSBOb25lCgogICAgaWYgcGtnX2luZm9bJ1N1bW1hcnknXToKICAgICAgICBtZXRhZGF0YVsnc3VtbWFyeSddID0gcGtnaW5mb191bmljb2RlKHBrZ19pbmZvLCAnU3VtbWFyeScpCiAgICAgICAgZGVsIHBrZ19pbmZvWydTdW1tYXJ5J10KCiAgICBpZiBwa2dfaW5mb1snRGVzY3JpcHRpb24nXToKICAgICAgICBkZXNjcmlwdGlvbiA9IGRlZGVudF9kZXNjcmlwdGlvbihwa2dfaW5mbykKICAgICAgICBkZWwgcGtnX2luZm9bJ0Rlc2NyaXB0aW9uJ10KICAgIGVsc2U6CiAgICAgICAgcGF5bG9hZCA9IHBrZ19pbmZvLmdldF9wYXlsb2FkKCkKICAgICAgICBpZiBpc2luc3RhbmNlKHBheWxvYWQsIGJ5dGVzKToKICAgICAgICAgICAgIyBBdm9pZCBhIFB5dGhvbiAyIFVuaWNvZGUgZXJyb3IuCiAgICAgICAgICAgICMgV2Ugc3RpbGwgc3VmZmVyID8gZ2x5cGhzIG9uIFB5dGhvbiAzLgogICAgICAgICAgICBwYXlsb2FkID0gcGF5bG9hZC5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBpZiBwYXlsb2FkOgogICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHBheWxvYWQKCiAgICBpZiBkZXNjcmlwdGlvbjoKICAgICAgICBwa2dfaW5mb1snZGVzY3JpcHRpb24nXSA9IGRlc2NyaXB0aW9uCgogICAgZm9yIGtleSBpbiBzb3J0ZWQodW5pcXVlKGsubG93ZXIoKSBmb3IgayBpbiBwa2dfaW5mby5rZXlzKCkpKToKICAgICAgICBsb3dfa2V5ID0ga2V5LnJlcGxhY2UoJy0nLCAnXycpCgogICAgICAgIGlmIGxvd19rZXkgaW4gU0tJUF9GSUVMRFM6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIGxvd19rZXkgaW4gVU5LTk9XTl9GSUVMRFMgYW5kIHBrZ19pbmZvLmdldChrZXkpID09ICdVTktOT1dOJzoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgbG93X2tleSBpbiBzb3J0ZWQoUExVUkFMX0ZJRUxEUyk6CiAgICAgICAgICAgIG1ldGFkYXRhW1BMVVJBTF9GSUVMRFNbbG93X2tleV1dID0gcGtnX2luZm8uZ2V0X2FsbChrZXkpCgogICAgICAgIGVsaWYgbG93X2tleSA9PSAicmVxdWlyZXNfZGlzdCI6CiAgICAgICAgICAgIGhhbmRsZV9yZXF1aXJlcyhtZXRhZGF0YSwgcGtnX2luZm8sIGtleSkKCiAgICAgICAgZWxpZiBsb3dfa2V5ID09ICdwcm92aWRlc19leHRyYSc6CiAgICAgICAgICAgIGlmIG5vdCAnZXh0cmFzJyBpbiBtZXRhZGF0YToKICAgICAgICAgICAgICAgIG1ldGFkYXRhWydleHRyYXMnXSA9IFtdCiAgICAgICAgICAgIG1ldGFkYXRhWydleHRyYXMnXS5leHRlbmQocGtnX2luZm8uZ2V0X2FsbChrZXkpKQoKICAgICAgICBlbGlmIGxvd19rZXkgPT0gJ2hvbWVfcGFnZSc6CiAgICAgICAgICAgIG1ldGFkYXRhWydleHRlbnNpb25zJ11bJ3B5dGhvbi5kZXRhaWxzJ11bJ3Byb2plY3RfdXJscyddID0geydIb21lJzpwa2dfaW5mb1trZXldfQoKICAgICAgICBlbGlmIGxvd19rZXkgPT0gJ2tleXdvcmRzJzoKICAgICAgICAgICAgbWV0YWRhdGFbJ2tleXdvcmRzJ10gPSBLRVlXT1JEU19SRS5zcGxpdChwa2dfaW5mb1trZXldKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICBtZXRhZGF0YVtsb3dfa2V5XSA9IHBrZ19pbmZvW2tleV0KCiAgICBtZXRhZGF0YVsnbWV0YWRhdGFfdmVyc2lvbiddID0gTUVUQURBVEFfVkVSU0lPTgoKICAgIGlmICdleHRyYXMnIGluIG1ldGFkYXRhOgogICAgICAgIG1ldGFkYXRhWydleHRyYXMnXSA9IHNvcnRlZChzZXQobWV0YWRhdGFbJ2V4dHJhcyddKSkKCiAgICAjIGluY2x1ZGUgbW9yZSBpbmZvcm1hdGlvbiBpZiBkaXN0cmlidXRpb24gaXMgYXZhaWxhYmxlCiAgICBpZiBkaXN0cmlidXRpb246CiAgICAgICAgZm9yIHJlcXVpcmVzLCBhdHRyIGluICgoJ3Rlc3RfcmVxdWlyZXMnLCAndGVzdHNfcmVxdWlyZScpLCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50cyA9IGdldGF0dHIoZGlzdHJpYnV0aW9uLCBhdHRyKQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXF1aXJlbWVudHMsIGxpc3QpOgogICAgICAgICAgICAgICAgICAgIG5ld19yZXF1aXJlbWVudHMgPSBzb3J0ZWQoY29udmVydF9yZXF1aXJlbWVudHMocmVxdWlyZW1lbnRzKSkKICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVtyZXF1aXJlc10gPSBbeydyZXF1aXJlcyc6bmV3X3JlcXVpcmVtZW50c31dCiAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAjIGhhbmRsZSBjb250YWN0cwogICAgY29udGFjdHMgPSBbXQogICAgZm9yIGNvbnRhY3RfdHlwZSwgcm9sZSBpbiBDT05UQUNUX0ZJRUxEUzoKICAgICAgICBjb250YWN0ID0gT3JkZXJlZERpY3QoKQogICAgICAgIGZvciBrZXkgaW4gc29ydGVkKGNvbnRhY3RfdHlwZSk6CiAgICAgICAgICAgIGlmIGNvbnRhY3RfdHlwZVtrZXldIGluIG1ldGFkYXRhOgogICAgICAgICAgICAgICAgY29udGFjdFtrZXldID0gbWV0YWRhdGEucG9wKGNvbnRhY3RfdHlwZVtrZXldKQogICAgICAgIGlmIGNvbnRhY3Q6CiAgICAgICAgICAgIGNvbnRhY3RbJ3JvbGUnXSA9IHJvbGUKICAgICAgICAgICAgY29udGFjdHMuYXBwZW5kKGNvbnRhY3QpCiAgICBpZiBjb250YWN0czoKICAgICAgICBtZXRhZGF0YVsnZXh0ZW5zaW9ucyddWydweXRob24uZGV0YWlscyddWydjb250YWN0cyddID0gY29udGFjdHMKCiAgICAjIGNvbnZlcnQgZW50cnkgcG9pbnRzIHRvIGV4cG9ydHMKICAgIHRyeToKICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShwYXRoKSwgImVudHJ5X3BvaW50cy50eHQiKSwgInIiKSBhcyBlcF9maWxlOgogICAgICAgICAgICBlcF9tYXAgPSBwa2dfcmVzb3VyY2VzLkVudHJ5UG9pbnQucGFyc2VfbWFwKGVwX2ZpbGUucmVhZCgpKQogICAgICAgIGV4cG9ydHMgPSBPcmRlcmVkRGljdCgpCiAgICAgICAgZm9yIGdyb3VwLCBpdGVtcyBpbiBzb3J0ZWQoZXBfbWFwLml0ZW1zKCkpOgogICAgICAgICAgICBleHBvcnRzW2dyb3VwXSA9IE9yZGVyZWREaWN0KCkKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc29ydGVkKG1hcChzdHIsIGl0ZW1zLnZhbHVlcygpKSk6CiAgICAgICAgICAgICAgICBuYW1lLCBleHBvcnQgPSBpdGVtLnNwbGl0KCcgPSAnLCAxKQogICAgICAgICAgICAgICAgZXhwb3J0c1tncm91cF1bbmFtZV0gPSBleHBvcnQKICAgICAgICBpZiBleHBvcnRzOgogICAgICAgICAgICBtZXRhZGF0YVsnZXh0ZW5zaW9ucyddWydweXRob24uZXhwb3J0cyddID0gZXhwb3J0cwogICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgcGFzcwoKICAgICMgY29weSBjb25zb2xlX3NjcmlwdHMgZW50cnkgcG9pbnRzIHRvIGNvbW1hbmRzCiAgICBpZiAncHl0aG9uLmV4cG9ydHMnIGluIG1ldGFkYXRhWydleHRlbnNpb25zJ106CiAgICAgICAgZm9yIChlcF9zY3JpcHQsIHdyYXBfc2NyaXB0KSBpbiAoKCdjb25zb2xlX3NjcmlwdHMnLCAnd3JhcF9jb25zb2xlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdndWlfc2NyaXB0cycsICd3cmFwX2d1aScpKToKICAgICAgICAgICAgaWYgZXBfc2NyaXB0IGluIG1ldGFkYXRhWydleHRlbnNpb25zJ11bJ3B5dGhvbi5leHBvcnRzJ106CiAgICAgICAgICAgICAgICBtZXRhZGF0YVsnZXh0ZW5zaW9ucyddWydweXRob24uY29tbWFuZHMnXVt3cmFwX3NjcmlwdF0gPSBcCiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFbJ2V4dGVuc2lvbnMnXVsncHl0aG9uLmV4cG9ydHMnXVtlcF9zY3JpcHRdCgogICAgcmV0dXJuIG1ldGFkYXRhCgpkZWYgcmVxdWlyZXNfdG9fcmVxdWlyZXNfZGlzdChyZXF1aXJlbWVudCk6CiAgICAiIiJDb21wb3NlIHRoZSB2ZXJzaW9uIHByZWRpY2F0ZXMgZm9yIHJlcXVpcmVtZW50IGluIFBFUCAzNDUgZmFzaGlvbi4iIiIKICAgIHJlcXVpcmVzX2Rpc3QgPSBbXQogICAgZm9yIG9wLCB2ZXIgaW4gcmVxdWlyZW1lbnQuc3BlY3M6CiAgICAgICAgcmVxdWlyZXNfZGlzdC5hcHBlbmQob3AgKyB2ZXIpCiAgICBpZiBub3QgcmVxdWlyZXNfZGlzdDoKICAgICAgICByZXR1cm4gJycKICAgIHJldHVybiAiICglcykiICUgJywnLmpvaW4ocmVxdWlyZXNfZGlzdCkKCmRlZiBjb252ZXJ0X3JlcXVpcmVtZW50cyhyZXF1aXJlbWVudHMpOgogICAgIiIiWWllbGQgUmVxdWlyZXMtRGlzdDogc3RyaW5ncyBmb3IgcGFyc2VkIHJlcXVpcmVtZW50cyBzdHJpbmdzLiIiIgogICAgZm9yIHJlcSBpbiByZXF1aXJlbWVudHM6CiAgICAgICAgcGFyc2VkX3JlcXVpcmVtZW50ID0gcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZShyZXEpCiAgICAgICAgc3BlYyA9IHJlcXVpcmVzX3RvX3JlcXVpcmVzX2Rpc3QocGFyc2VkX3JlcXVpcmVtZW50KQogICAgICAgIGV4dHJhcyA9ICIsIi5qb2luKHBhcnNlZF9yZXF1aXJlbWVudC5leHRyYXMpCiAgICAgICAgaWYgZXh0cmFzOgogICAgICAgICAgICBleHRyYXMgPSAiWyVzXSIgJSBleHRyYXMKICAgICAgICB5aWVsZCAocGFyc2VkX3JlcXVpcmVtZW50LnByb2plY3RfbmFtZSArIGV4dHJhcyArIHNwZWMpCgpkZWYgZ2VuZXJhdGVfcmVxdWlyZW1lbnRzKGV4dHJhc19yZXF1aXJlKToKICAgICIiIgogICAgQ29udmVydCByZXF1aXJlbWVudHMgZnJvbSBhIHNldHVwKCktc3R5bGUgZGljdGlvbmFyeSB0byAoJ1JlcXVpcmVzLURpc3QnLCAncmVxdWlyZW1lbnQnKQogICAgYW5kICgnUHJvdmlkZXMtRXh0cmEnLCAnZXh0cmEnKSB0dXBsZXMuCgogICAgZXh0cmFzX3JlcXVpcmUgaXMgYSBkaWN0aW9uYXJ5IG9mIHtleHRyYTogW3JlcXVpcmVtZW50c119IGFzIHBhc3NlZCB0byBzZXR1cCgpLAogICAgdXNpbmcgdGhlIGVtcHR5IGV4dHJhIHsnJzogW3JlcXVpcmVtZW50c119IHRvIGhvbGQgaW5zdGFsbF9yZXF1aXJlcy4KICAgICIiIgogICAgZm9yIGV4dHJhLCBkZXBlbmRzIGluIGV4dHJhc19yZXF1aXJlLml0ZW1zKCk6CiAgICAgICAgY29uZGl0aW9uID0gJycKICAgICAgICBpZiBleHRyYSBhbmQgJzonIGluIGV4dHJhOiAgIyBzZXR1cHRvb2xzIGV4dHJhOmNvbmRpdGlvbiBzeW50YXgKICAgICAgICAgICAgZXh0cmEsIGNvbmRpdGlvbiA9IGV4dHJhLnNwbGl0KCc6JywgMSkKICAgICAgICAgICAgZXh0cmEgPSBwa2dfcmVzb3VyY2VzLnNhZmVfZXh0cmEoZXh0cmEpCiAgICAgICAgaWYgZXh0cmE6CiAgICAgICAgICAgIHlpZWxkICgnUHJvdmlkZXMtRXh0cmEnLCBleHRyYSkKICAgICAgICAgICAgaWYgY29uZGl0aW9uOgogICAgICAgICAgICAgICAgY29uZGl0aW9uICs9ICIgYW5kICIKICAgICAgICAgICAgY29uZGl0aW9uICs9ICJleHRyYSA9PSAnJXMnIiAlIGV4dHJhCiAgICAgICAgaWYgY29uZGl0aW9uOgogICAgICAgICAgICBjb25kaXRpb24gPSAnOyAnICsgY29uZGl0aW9uCiAgICAgICAgZm9yIG5ld19yZXEgaW4gY29udmVydF9yZXF1aXJlbWVudHMoZGVwZW5kcyk6CiAgICAgICAgICAgIHlpZWxkICgnUmVxdWlyZXMtRGlzdCcsIG5ld19yZXEgKyBjb25kaXRpb24pCgpkZWYgcGtnaW5mb190b19tZXRhZGF0YShlZ2dfaW5mb19wYXRoLCBwa2dpbmZvX3BhdGgpOgogICAgIiIiCiAgICBDb252ZXJ0IC5lZ2ctaW5mbyBkaXJlY3Rvcnkgd2l0aCBQS0ctSU5GTyB0byB0aGUgTWV0YWRhdGEgMS4zIGFrYQogICAgb2xkLWRyYWZ0IE1ldGFkYXRhIDIuMCBmb3JtYXQuCiAgICAiIiIKICAgIHBrZ19pbmZvID0gcmVhZF9wa2dfaW5mbyhwa2dpbmZvX3BhdGgpCiAgICBwa2dfaW5mby5yZXBsYWNlX2hlYWRlcignTWV0YWRhdGEtVmVyc2lvbicsICcyLjAnKQogICAgcmVxdWlyZXNfcGF0aCA9IG9zLnBhdGguam9pbihlZ2dfaW5mb19wYXRoLCAncmVxdWlyZXMudHh0JykKICAgIGlmIG9zLnBhdGguZXhpc3RzKHJlcXVpcmVzX3BhdGgpOgogICAgICAgIHdpdGggb3BlbihyZXF1aXJlc19wYXRoKSBhcyByZXF1aXJlc19maWxlOgogICAgICAgICAgICByZXF1aXJlcyA9IHJlcXVpcmVzX2ZpbGUucmVhZCgpCiAgICAgICAgZm9yIGV4dHJhLCByZXFzIGluIHNvcnRlZChwa2dfcmVzb3VyY2VzLnNwbGl0X3NlY3Rpb25zKHJlcXVpcmVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT1sYW1iZGEgeDogeFswXSBvciAnJyk6CiAgICAgICAgICAgIGZvciBpdGVtIGluIGdlbmVyYXRlX3JlcXVpcmVtZW50cyh7ZXh0cmE6IHJlcXN9KToKICAgICAgICAgICAgICAgIHBrZ19pbmZvW2l0ZW1bMF1dID0gaXRlbVsxXQoKICAgIGRlc2NyaXB0aW9uID0gcGtnX2luZm9bJ0Rlc2NyaXB0aW9uJ10KICAgIGlmIGRlc2NyaXB0aW9uOgogICAgICAgIHBrZ19pbmZvLnNldF9wYXlsb2FkKGRlZGVudF9kZXNjcmlwdGlvbihwa2dfaW5mbykpCiAgICAgICAgZGVsIHBrZ19pbmZvWydEZXNjcmlwdGlvbiddCgogICAgcmV0dXJuIHBrZ19pbmZvCgoKZGVmIHBrZ2luZm9fdW5pY29kZShwa2dfaW5mbywgZmllbGQpOgogICAgIiIiSGFjayB0byBjb2F4IFVuaWNvZGUgb3V0IG9mIGFuIGVtYWlsIE1lc3NhZ2UoKSAtIFB5dGhvbiAzLjMrIiIiCiAgICB0ZXh0ID0gcGtnX2luZm9bZmllbGRdCiAgICBmaWVsZCA9IGZpZWxkLmxvd2VyKCkKICAgIGlmIG5vdCBpc2luc3RhbmNlKHRleHQsIHN0cik6CiAgICAgICAgaWYgbm90IGhhc2F0dHIocGtnX2luZm8sICdyYXdfaXRlbXMnKTogICMgUHl0aG9uIDMuMgogICAgICAgICAgICByZXR1cm4gc3RyKHRleHQpCiAgICAgICAgZm9yIGl0ZW0gaW4gcGtnX2luZm8ucmF3X2l0ZW1zKCk6CiAgICAgICAgICAgIGlmIGl0ZW1bMF0ubG93ZXIoKSA9PSBmaWVsZDoKICAgICAgICAgICAgICAgIHRleHQgPSBpdGVtWzFdLmVuY29kZSgnYXNjaWknLCAnc3Vycm9nYXRlZXNjYXBlJylcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgYnJlYWsKCiAgICByZXR1cm4gdGV4dAoKCmRlZiBkZWRlbnRfZGVzY3JpcHRpb24ocGtnX2luZm8pOgogICAgIiIiCiAgICBEZWRlbnQgYW5kIGNvbnZlcnQgcGtnX2luZm9bJ0Rlc2NyaXB0aW9uJ10gdG8gVW5pY29kZS4KICAgICIiIgogICAgZGVzY3JpcHRpb24gPSBwa2dfaW5mb1snRGVzY3JpcHRpb24nXQoKICAgICMgUHl0aG9uIDMgVW5pY29kZSBoYW5kbGluZywgc29ydGEuCiAgICBzdXJyb2dhdGVzID0gRmFsc2UKICAgIGlmIG5vdCBpc2luc3RhbmNlKGRlc2NyaXB0aW9uLCBzdHIpOgogICAgICAgIHN1cnJvZ2F0ZXMgPSBUcnVlCiAgICAgICAgZGVzY3JpcHRpb24gPSBwa2dpbmZvX3VuaWNvZGUocGtnX2luZm8sICdEZXNjcmlwdGlvbicpCgogICAgZGVzY3JpcHRpb25fbGluZXMgPSBkZXNjcmlwdGlvbi5zcGxpdGxpbmVzKCkKICAgIGRlc2NyaXB0aW9uX2RlZGVudCA9ICdcbicuam9pbigKICAgICAgICAgICAgIyBpZiB0aGUgZmlyc3QgbGluZSBvZiBsb25nX2Rlc2NyaXB0aW9uIGlzIGJsYW5rLAogICAgICAgICAgICAjIHRoZSBmaXJzdCBsaW5lIGhlcmUgd2lsbCBiZSBpbmRlbnRlZC4KICAgICAgICAgICAgKGRlc2NyaXB0aW9uX2xpbmVzWzBdLmxzdHJpcCgpLAogICAgICAgICAgICAgdGV4dHdyYXAuZGVkZW50KCdcbicuam9pbihkZXNjcmlwdGlvbl9saW5lc1sxOl0pKSwKICAgICAgICAgICAgICdcbicpKQoKICAgIGlmIHN1cnJvZ2F0ZXM6CiAgICAgICAgZGVzY3JpcHRpb25fZGVkZW50ID0gZGVzY3JpcHRpb25fZGVkZW50XAogICAgICAgICAgICAgICAgLmVuY29kZSgidXRmOCIpXAogICAgICAgICAgICAgICAgLmRlY29kZSgiYXNjaWkiLCAic3Vycm9nYXRlZXNjYXBlIikKCiAgICByZXR1cm4gZGVzY3JpcHRpb25fZGVkZW50CgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIGltcG9ydCBzeXMsIHBwcmludAogICAgcHByaW50LnBwcmludChwa2dpbmZvX3RvX2RpY3Qoc3lzLmFyZ3ZbMV0pKQpQSwMEFAAAAAAAAAAhAGH2NdJqBAAAagQAACMAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9wYXRocy5weSIiIgpJbnN0YWxsYXRpb24gcGF0aHMuCgpNYXAgdGhlIC5kYXRhLyBzdWJkaXJlY3RvcnkgbmFtZXMgdG8gaW5zdGFsbCBwYXRocy4KIiIiCgppbXBvcnQgb3MucGF0aAppbXBvcnQgc3lzCmltcG9ydCBkaXN0dXRpbHMuZGlzdCBhcyBkaXN0CmltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsIGFzIGluc3RhbGwKCmRlZiBnZXRfaW5zdGFsbF9jb21tYW5kKG5hbWUpOgogICAgIyBsYXRlIGJpbmRpbmcgZHVlIHRvIHBvdGVudGlhbCBtb25rZXlwYXRjaGluZwogICAgZCA9IGRpc3QuRGlzdHJpYnV0aW9uKHsnbmFtZSc6bmFtZX0pCiAgICBpID0gaW5zdGFsbC5pbnN0YWxsKGQpCiAgICBpLmZpbmFsaXplX29wdGlvbnMoKQogICAgcmV0dXJuIGkKCmRlZiBnZXRfaW5zdGFsbF9wYXRocyhuYW1lKToKICAgICIiIgogICAgUmV0dXJuIHRoZSAoZGlzdHV0aWxzKSBpbnN0YWxsIHBhdGhzIGZvciB0aGUgbmFtZWQgZGlzdC4KICAgIAogICAgQSBkaWN0IHdpdGggKCdwdXJlbGliJywgJ3BsYXRsaWInLCAnaGVhZGVycycsICdzY3JpcHRzJywgJ2RhdGEnKSBrZXlzLgogICAgIiIiCiAgICBwYXRocyA9IHt9CgogICAgaSA9IGdldF9pbnN0YWxsX2NvbW1hbmQobmFtZSkKCiAgICBmb3Iga2V5IGluIGluc3RhbGwuU0NIRU1FX0tFWVM6CiAgICAgICAgcGF0aHNba2V5XSA9IGdldGF0dHIoaSwgJ2luc3RhbGxfJyArIGtleSkKCiAgICAjIHBpcCB1c2VzIGEgc2ltaWxhciBwYXRoIGFzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBzeXN0ZW0ncyAocmVhZC1vbmx5KQogICAgIyBpbmNsdWRlIGRpcmVjdG9yeToKICAgIGlmIGhhc2F0dHIoc3lzLCAncmVhbF9wcmVmaXgnKTogICMgdmlydHVhbGVudgogICAgICAgIHBhdGhzWydoZWFkZXJzJ10gPSBvcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNsdWRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdweXRob24nICsgc3lzLnZlcnNpb25bOjNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSkKCiAgICByZXR1cm4gcGF0aHMKUEsDBBQAAAAAAAAAIQBrYlZ8xRYAAMUWAAAoAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvcGVwNDI1dGFncy5weSIiIkdlbmVyYXRlIGFuZCB3b3JrIHdpdGggUEVQIDQyNSBDb21wYXRpYmlsaXR5IFRhZ3MuIiIiCgppbXBvcnQgc3lzCmltcG9ydCB3YXJuaW5ncwoKdHJ5OgogICAgaW1wb3J0IHN5c2NvbmZpZwpleGNlcHQgSW1wb3J0RXJyb3I6ICAjIHByYWdtYSBub2NvdmVyCiAgICAjIFB5dGhvbiA8IDIuNwogICAgaW1wb3J0IGRpc3R1dGlscy5zeXNjb25maWcgYXMgc3lzY29uZmlnCmltcG9ydCBkaXN0dXRpbHMudXRpbAoKCmRlZiBnZXRfY29uZmlnX3Zhcih2YXIpOgogICAgdHJ5OgogICAgICAgIHJldHVybiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIodmFyKQogICAgZXhjZXB0IElPRXJyb3IgYXMgZTogICMgcGlwIElzc3VlICMxMDc0CiAgICAgICAgd2FybmluZ3Mud2FybigiezB9Ii5mb3JtYXQoZSksIFJ1bnRpbWVXYXJuaW5nKQogICAgICAgIHJldHVybiBOb25lCgoKZGVmIGdldF9hYmJyX2ltcGwoKToKICAgICIiIlJldHVybiBhYmJyZXZpYXRlZCBpbXBsZW1lbnRhdGlvbiBuYW1lLiIiIgogICAgaWYgaGFzYXR0cihzeXMsICdweXB5X3ZlcnNpb25faW5mbycpOgogICAgICAgIHB5aW1wbCA9ICdwcCcKICAgIGVsaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKICAgICAgICBweWltcGwgPSAnanknCiAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAnY2xpJzoKICAgICAgICBweWltcGwgPSAnaXAnCiAgICBlbHNlOgogICAgICAgIHB5aW1wbCA9ICdjcCcKICAgIHJldHVybiBweWltcGwKCgpkZWYgZ2V0X2ltcGxfdmVyKCk6CiAgICAiIiJSZXR1cm4gaW1wbGVtZW50YXRpb24gdmVyc2lvbi4iIiIKICAgIGltcGxfdmVyID0gZ2V0X2NvbmZpZ192YXIoInB5X3ZlcnNpb25fbm9kb3QiKQogICAgaWYgbm90IGltcGxfdmVyIG9yIGdldF9hYmJyX2ltcGwoKSA9PSAncHAnOgogICAgICAgIGltcGxfdmVyID0gJycuam9pbihtYXAoc3RyLCBnZXRfaW1wbF92ZXJzaW9uX2luZm8oKSkpCiAgICByZXR1cm4gaW1wbF92ZXIKCgpkZWYgZ2V0X2ltcGxfdmVyc2lvbl9pbmZvKCk6CiAgICAiIiJSZXR1cm4gc3lzLnZlcnNpb25faW5mby1saWtlIHR1cGxlIGZvciB1c2UgaW4gZGVjcmVtZW50aW5nIHRoZSBtaW5vcgogICAgdmVyc2lvbi4iIiIKICAgIGlmIGdldF9hYmJyX2ltcGwoKSA9PSAncHAnOgogICAgICAgICMgYXMgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMjg4MgogICAgICAgIHJldHVybiAoc3lzLnZlcnNpb25faW5mb1swXSwgc3lzLnB5cHlfdmVyc2lvbl9pbmZvLm1ham9yLAogICAgICAgICAgICAgICAgc3lzLnB5cHlfdmVyc2lvbl9pbmZvLm1pbm9yKQogICAgZWxzZToKICAgICAgICByZXR1cm4gc3lzLnZlcnNpb25faW5mb1swXSwgc3lzLnZlcnNpb25faW5mb1sxXQoKCmRlZiBnZXRfZmxhZyh2YXIsIGZhbGxiYWNrLCBleHBlY3RlZD1UcnVlLCB3YXJuPVRydWUpOgogICAgIiIiVXNlIGEgZmFsbGJhY2sgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBTT0FCSSBmbGFncyBpZiB0aGUgbmVlZGVkIGNvbmZpZwogICAgdmFyIGlzIHVuc2V0IG9yIHVuYXZhaWxhYmxlLiIiIgogICAgdmFsID0gZ2V0X2NvbmZpZ192YXIodmFyKQogICAgaWYgdmFsIGlzIE5vbmU6CiAgICAgICAgaWYgd2FybjoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ29uZmlnIHZhcmlhYmxlICd7MH0nIGlzIHVuc2V0LCBQeXRob24gQUJJIHRhZyBtYXkgIgogICAgICAgICAgICAgICAgICAgICAgICAgICJiZSBpbmNvcnJlY3QiLmZvcm1hdCh2YXIpLCBSdW50aW1lV2FybmluZywgMikKICAgICAgICByZXR1cm4gZmFsbGJhY2soKQogICAgcmV0dXJuIHZhbCA9PSBleHBlY3RlZAoKCmRlZiBnZXRfYWJpX3RhZygpOgogICAgIiIiUmV0dXJuIHRoZSBBQkkgdGFnIGJhc2VkIG9uIFNPQUJJIChpZiBhdmFpbGFibGUpIG9yIGVtdWxhdGUgU09BQkkKICAgIChDUHl0aG9uIDIsIFB5UHkpLiIiIgogICAgc29hYmkgPSBnZXRfY29uZmlnX3ZhcignU09BQkknKQogICAgaW1wbCA9IGdldF9hYmJyX2ltcGwoKQogICAgaWYgbm90IHNvYWJpIGFuZCBpbXBsIGluICgnY3AnLCAncHAnKSBhbmQgaGFzYXR0cihzeXMsICdtYXh1bmljb2RlJyk6CiAgICAgICAgZCA9ICcnCiAgICAgICAgbSA9ICcnCiAgICAgICAgdSA9ICcnCiAgICAgICAgaWYgZ2V0X2ZsYWcoJ1B5X0RFQlVHJywKICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IGhhc2F0dHIoc3lzLCAnZ2V0dG90YWxyZWZjb3VudCcpLAogICAgICAgICAgICAgICAgICAgIHdhcm49KGltcGwgPT0gJ2NwJykpOgogICAgICAgICAgICBkID0gJ2QnCiAgICAgICAgaWYgZ2V0X2ZsYWcoJ1dJVEhfUFlNQUxMT0MnLAogICAgICAgICAgICAgICAgICAgIGxhbWJkYTogaW1wbCA9PSAnY3AnLAogICAgICAgICAgICAgICAgICAgIHdhcm49KGltcGwgPT0gJ2NwJykpOgogICAgICAgICAgICBtID0gJ20nCiAgICAgICAgaWYgZ2V0X2ZsYWcoJ1B5X1VOSUNPREVfU0laRScsCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBzeXMubWF4dW5pY29kZSA9PSAweDEwZmZmZiwKICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD00LAogICAgICAgICAgICAgICAgICAgIHdhcm49KGltcGwgPT0gJ2NwJyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDMpKSkgXAogICAgICAgICAgICAgICAgYW5kIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMyk6CiAgICAgICAgICAgIHUgPSAndScKICAgICAgICBhYmkgPSAnJXMlcyVzJXMlcycgJSAoaW1wbCwgZ2V0X2ltcGxfdmVyKCksIGQsIG0sIHUpCiAgICBlbGlmIHNvYWJpIGFuZCBzb2FiaS5zdGFydHN3aXRoKCdjcHl0aG9uLScpOgogICAgICAgIGFiaSA9ICdjcCcgKyBzb2FiaS5zcGxpdCgnLScpWzFdCiAgICBlbGlmIHNvYWJpOgogICAgICAgIGFiaSA9IHNvYWJpLnJlcGxhY2UoJy4nLCAnXycpLnJlcGxhY2UoJy0nLCAnXycpCiAgICBlbHNlOgogICAgICAgIGFiaSA9IE5vbmUKICAgIHJldHVybiBhYmkKCgpkZWYgZ2V0X3BsYXRmb3JtKCk6CiAgICAiIiJSZXR1cm4gb3VyIHBsYXRmb3JtIG5hbWUgJ3dpbjMyJywgJ2xpbnV4X3g4Nl82NCciIiIKICAgICMgWFhYIHJlbW92ZSBkaXN0dXRpbHMgZGVwZW5kZW5jeQogICAgcmVzdWx0ID0gZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkucmVwbGFjZSgnLicsICdfJykucmVwbGFjZSgnLScsICdfJykKICAgIGlmIHJlc3VsdCA9PSAibGludXhfeDg2XzY0IiBhbmQgc3lzLm1heHNpemUgPT0gMjE0NzQ4MzY0NzoKICAgICAgICAjIHBpcCBwdWxsIHJlcXVlc3QgIzM0OTcKICAgICAgICByZXN1bHQgPSAibGludXhfaTY4NiIKICAgIHJldHVybiByZXN1bHQKCgpkZWYgZ2V0X3N1cHBvcnRlZCh2ZXJzaW9ucz1Ob25lLCBzdXBwbGllZF9wbGF0Zm9ybT1Ob25lKToKICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHRhZ3MgZm9yIGVhY2ggdmVyc2lvbiBzcGVjaWZpZWQgaW4KICAgIGB2ZXJzaW9uc2AuCgogICAgOnBhcmFtIHZlcnNpb25zOiBhIGxpc3Qgb2Ygc3RyaW5nIHZlcnNpb25zLCBvZiB0aGUgZm9ybSBbIjMzIiwgIjMyIl0sIAogICAgICAgIG9yIE5vbmUuIFRoZSBmaXJzdCB2ZXJzaW9uIHdpbGwgYmUgYXNzdW1lZCB0byBzdXBwb3J0IG91ciBBQkkuCiAgICAiIiIKICAgIHN1cHBvcnRlZCA9IFtdCiAgICAKICAgICMgVmVyc2lvbnMgbXVzdCBiZSBnaXZlbiB3aXRoIHJlc3BlY3QgdG8gdGhlIHByZWZlcmVuY2UKICAgIGlmIHZlcnNpb25zIGlzIE5vbmU6CiAgICAgICAgdmVyc2lvbnMgPSBbXQogICAgICAgIHZlcnNpb25faW5mbyA9IGdldF9pbXBsX3ZlcnNpb25faW5mbygpCiAgICAgICAgbWFqb3IgPSB2ZXJzaW9uX2luZm9bOi0xXQogICAgICAgICMgU3VwcG9ydCBhbGwgcHJldmlvdXMgbWlub3IgUHl0aG9uIHZlcnNpb25zLgogICAgICAgIGZvciBtaW5vciBpbiByYW5nZSh2ZXJzaW9uX2luZm9bLTFdLCAtMSwgLTEpOgogICAgICAgICAgICB2ZXJzaW9ucy5hcHBlbmQoJycuam9pbihtYXAoc3RyLCBtYWpvciArIChtaW5vciwpKSkpCiAgICAgICAgICAgIAogICAgaW1wbCA9IGdldF9hYmJyX2ltcGwoKQogICAgCiAgICBhYmlzID0gW10KCiAgICBhYmkgPSBnZXRfYWJpX3RhZygpCiAgICBpZiBhYmk6CiAgICAgICAgYWJpc1swOjBdID0gW2FiaV0KIAogICAgYWJpM3MgPSBzZXQoKQogICAgaW1wb3J0IGltcAogICAgZm9yIHN1ZmZpeCBpbiBpbXAuZ2V0X3N1ZmZpeGVzKCk6CiAgICAgICAgaWYgc3VmZml4WzBdLnN0YXJ0c3dpdGgoJy5hYmknKToKICAgICAgICAgICAgYWJpM3MuYWRkKHN1ZmZpeFswXS5zcGxpdCgnLicsIDIpWzFdKQoKICAgIGFiaXMuZXh0ZW5kKHNvcnRlZChsaXN0KGFiaTNzKSkpCgogICAgYWJpcy5hcHBlbmQoJ25vbmUnKQoKICAgIHBsYXRmb3JtcyA9IFtdCiAgICBpZiBzdXBwbGllZF9wbGF0Zm9ybToKICAgICAgICBwbGF0Zm9ybXMuYXBwZW5kKHN1cHBsaWVkX3BsYXRmb3JtKQogICAgcGxhdGZvcm1zLmFwcGVuZChnZXRfcGxhdGZvcm0oKSkKICAgIAogICAgIyBDdXJyZW50IHZlcnNpb24sIGN1cnJlbnQgQVBJIChidWlsdCBzcGVjaWZpY2FsbHkgZm9yIG91ciBQeXRob24pOgogICAgZm9yIGFiaSBpbiBhYmlzOgogICAgICAgIGZvciBhcmNoIGluIHBsYXRmb3JtczoKICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJyVzJXMnICUgKGltcGwsIHZlcnNpb25zWzBdKSwgYWJpLCBhcmNoKSkKCiAgICAjIGFiaTMgbW9kdWxlcyBjb21wYXRpYmxlIHdpdGggb2xkZXIgdmVyc2lvbiBvZiBQeXRob24KICAgIGZvciB2ZXJzaW9uIGluIHZlcnNpb25zWzE6XToKICAgICAgICAjIGFiaTMgd2FzIGludHJvZHVjZWQgaW4gUHl0aG9uIDMuMgogICAgICAgIGlmIHZlcnNpb24gaW4gKCczMScsICczMCcpOgogICAgICAgICAgICBicmVhawogICAgICAgIGZvciBhYmkgaW4gYWJpM3M6ICAgIyBlbXB0eSBzZXQgaWYgbm90IFB5dGhvbiAzCiAgICAgICAgICAgIGZvciBhcmNoIGluIHBsYXRmb3JtczoKICAgICAgICAgICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCIlcyVzIiAlIChpbXBsLCB2ZXJzaW9uKSwgYWJpLCBhcmNoKSkKCiAgICAjIE5vIGFiaSAvIGFyY2gsIGJ1dCByZXF1aXJlcyBvdXIgaW1wbGVtZW50YXRpb246CiAgICBmb3IgaSwgdmVyc2lvbiBpbiBlbnVtZXJhdGUodmVyc2lvbnMpOgogICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCclcyVzJyAlIChpbXBsLCB2ZXJzaW9uKSwgJ25vbmUnLCAnYW55JykpCiAgICAgICAgaWYgaSA9PSAwOgogICAgICAgICAgICAjIFRhZ2dlZCBzcGVjaWZpY2FsbHkgYXMgYmVpbmcgY3Jvc3MtdmVyc2lvbiBjb21wYXRpYmxlIAogICAgICAgICAgICAjICh3aXRoIGp1c3QgdGhlIG1ham9yIHZlcnNpb24gc3BlY2lmaWVkKQogICAgICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgnJXMlcycgJSAoaW1wbCwgdmVyc2lvbnNbMF1bMF0pLCAnbm9uZScsICdhbnknKSkgCiAgICAKICAgICMgTWFqb3IgUHl0aG9uIHZlcnNpb24gKyBwbGF0Zm9ybTsgZS5nLiBiaW5hcmllcyBub3QgdXNpbmcgdGhlIFB5dGhvbiBBUEkKICAgIHN1cHBvcnRlZC5hcHBlbmQoKCdweSVzJyAlICh2ZXJzaW9uc1swXVswXSksICdub25lJywgYXJjaCkpCgogICAgIyBObyBhYmkgLyBhcmNoLCBnZW5lcmljIFB5dGhvbgogICAgZm9yIGksIHZlcnNpb24gaW4gZW51bWVyYXRlKHZlcnNpb25zKToKICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgncHklcycgJSAodmVyc2lvbiwpLCAnbm9uZScsICdhbnknKSkKICAgICAgICBpZiBpID09IDA6CiAgICAgICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCdweSVzJyAlICh2ZXJzaW9uWzBdKSwgJ25vbmUnLCAnYW55JykpCiAgICAgICAgCiAgICByZXR1cm4gc3VwcG9ydGVkClBLAwQUAAAAAAAAACEAgEMYoMkEAADJBAAAJQAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3BrZ2luZm8ucHkiIiJUb29scyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBQS0ctSU5GTyAvIE1FVEFEQVRBIHdpdGhvdXQgY2FyaW5nCmFib3V0IHRoZSBlbmNvZGluZy4iIiIKCmZyb20gZW1haWwucGFyc2VyIGltcG9ydCBQYXJzZXIKCnRyeToKICAgIHVuaWNvZGUKICAgIF9QWTMgPSBGYWxzZQpleGNlcHQgTmFtZUVycm9yOgogICAgX1BZMyA9IFRydWUKCmlmIG5vdCBfUFkzOgogICAgZnJvbSBlbWFpbC5nZW5lcmF0b3IgaW1wb3J0IEdlbmVyYXRvcgogICAgCiAgICBkZWYgcmVhZF9wa2dfaW5mb19ieXRlcyhieXRlc3RyKToKICAgICAgICByZXR1cm4gUGFyc2VyKCkucGFyc2VzdHIoYnl0ZXN0cikKCiAgICBkZWYgcmVhZF9wa2dfaW5mbyhwYXRoKToKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgInIiKSBhcyBoZWFkZXJzOgogICAgICAgICAgICBtZXNzYWdlID0gUGFyc2VyKCkucGFyc2UoaGVhZGVycykKICAgICAgICByZXR1cm4gbWVzc2FnZQoKICAgIGRlZiB3cml0ZV9wa2dfaW5mbyhwYXRoLCBtZXNzYWdlKToKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3cnKSBhcyBtZXRhZGF0YToKICAgICAgICAgICAgR2VuZXJhdG9yKG1ldGFkYXRhLCBtYXhoZWFkZXJsZW49MCkuZmxhdHRlbihtZXNzYWdlKSAKCmVsc2U6CiAgICBmcm9tIGVtYWlsLmdlbmVyYXRvciBpbXBvcnQgQnl0ZXNHZW5lcmF0b3IKICAgIGRlZiByZWFkX3BrZ19pbmZvX2J5dGVzKGJ5dGVzdHIpOgogICAgICAgIGhlYWRlcnMgPSBieXRlc3RyLmRlY29kZShlbmNvZGluZz0iYXNjaWkiLCBlcnJvcnM9InN1cnJvZ2F0ZWVzY2FwZSIpCiAgICAgICAgbWVzc2FnZSA9IFBhcnNlcigpLnBhcnNlc3RyKGhlYWRlcnMpCiAgICAgICAgcmV0dXJuIG1lc3NhZ2UKCiAgICBkZWYgcmVhZF9wa2dfaW5mbyhwYXRoKToKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgInIiLCAKICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc9ImFzY2lpIiwgCiAgICAgICAgICAgICAgICAgIGVycm9ycz0ic3Vycm9nYXRlZXNjYXBlIikgYXMgaGVhZGVyczoKICAgICAgICAgICAgbWVzc2FnZSA9IFBhcnNlcigpLnBhcnNlKGhlYWRlcnMpCiAgICAgICAgcmV0dXJuIG1lc3NhZ2UKCiAgICBkZWYgd3JpdGVfcGtnX2luZm8ocGF0aCwgbWVzc2FnZSk6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJ3YiIpIGFzIG91dDoKICAgICAgICAgICAgQnl0ZXNHZW5lcmF0b3Iob3V0LCBtYXhoZWFkZXJsZW49MCkuZmxhdHRlbihtZXNzYWdlKQoKUEsDBBQAAAAAAAAAIQD8TOZMww4AAMMOAAAxAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvc2lnbmF0dXJlcy9fX2luaXRfXy5weSIiIgpDcmVhdGUgYW5kIHZlcmlmeSBqd3MtanMgZm9ybWF0IEVkMjU1MTkgc2lnbmF0dXJlcy4KIiIiCgpfX2FsbF9fID0gWyAnc2lnbicsICd2ZXJpZnknIF0KCmltcG9ydCBqc29uCmZyb20gLi51dGlsIGltcG9ydCB1cmxzYWZlX2I2NGRlY29kZSwgdXJsc2FmZV9iNjRlbmNvZGUsIG5hdGl2ZSwgYmluYXJ5CgplZDI1NTE5bGwgPSBOb25lCgpBTEcgPSAiRWQyNTUxOSIKCmRlZiBnZXRfZWQyNTUxOWxsKCk6CiAgICAiIiJMYXp5IGltcG9ydC1hbmQtdGVzdCBvZiBlZDI1NTE5IG1vZHVsZSIiIgogICAgZ2xvYmFsIGVkMjU1MTlsbAogICAgCiAgICBpZiBub3QgZWQyNTUxOWxsOgogICAgICAgIHRyeToKICAgICAgICAgICAgaW1wb3J0IGVkMjU1MTlsbCAjIGZhc3QgKHRob3VzYW5kcyAvIHMpCiAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgT1NFcnJvcik6ICMgcHJhZ21hIG5vY292ZXIKICAgICAgICAgICAgZnJvbSAuIGltcG9ydCBlZDI1NTE5cHkgYXMgZWQyNTUxOWxsICMgcHVyZSBQeXRob24gKGh1bmRyZWRzIC8gcykKICAgICAgICB0ZXN0KCkKICAgIAogICAgcmV0dXJuIGVkMjU1MTlsbAoKZGVmIHNpZ24ocGF5bG9hZCwga2V5cGFpcik6CiAgICAiIiJSZXR1cm4gYSBKV1MtSlMgZm9ybWF0IHNpZ25hdHVyZSBnaXZlbiBhIEpTT04tc2VyaWFsaXphYmxlIHBheWxvYWQgYW5kIAogICAgYW4gRWQyNTUxOSBrZXlwYWlyLiIiIgogICAgZ2V0X2VkMjU1MTlsbCgpCiAgICAjCiAgICBoZWFkZXIgPSB7CiAgICAgICAgICAgICAgICAiYWxnIjogQUxHLAogICAgICAgICAgICAgICAgImp3ayI6IHsKICAgICAgICAgICAgICAgICAgICAia3R5IjogQUxHLCAjIGFsZyAtPiBrdHkgaW4gandrLTA4LgogICAgICAgICAgICAgICAgICAgICJ2ayI6IG5hdGl2ZSh1cmxzYWZlX2I2NGVuY29kZShrZXlwYWlyLnZrKSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgIAogICAgZW5jb2RlZF9oZWFkZXIgPSB1cmxzYWZlX2I2NGVuY29kZShiaW5hcnkoanNvbi5kdW1wcyhoZWFkZXIsIHNvcnRfa2V5cz1UcnVlKSkpCiAgICBlbmNvZGVkX3BheWxvYWQgPSB1cmxzYWZlX2I2NGVuY29kZShiaW5hcnkoanNvbi5kdW1wcyhwYXlsb2FkLCBzb3J0X2tleXM9VHJ1ZSkpKQogICAgc2VjdXJlZF9pbnB1dCA9IGIiLiIuam9pbigoZW5jb2RlZF9oZWFkZXIsIGVuY29kZWRfcGF5bG9hZCkpCiAgICBzaWdfbXNnID0gZWQyNTUxOWxsLmNyeXB0b19zaWduKHNlY3VyZWRfaW5wdXQsIGtleXBhaXIuc2spCiAgICBzaWduYXR1cmUgPSBzaWdfbXNnWzplZDI1NTE5bGwuU0lHTkFUVVJFQllURVNdCiAgICBlbmNvZGVkX3NpZ25hdHVyZSA9IHVybHNhZmVfYjY0ZW5jb2RlKHNpZ25hdHVyZSkKICAgIAogICAgcmV0dXJuIHsicmVjaXBpZW50cyI6IAogICAgICAgICAgICBbeyJoZWFkZXIiOm5hdGl2ZShlbmNvZGVkX2hlYWRlciksCiAgICAgICAgICAgICAic2lnbmF0dXJlIjpuYXRpdmUoZW5jb2RlZF9zaWduYXR1cmUpfV0sCiAgICAgICAgICAgICJwYXlsb2FkIjogbmF0aXZlKGVuY29kZWRfcGF5bG9hZCl9CgpkZWYgYXNzZXJ0VHJ1ZShjb25kaXRpb24sIG1lc3NhZ2U9IiIpOgogICAgaWYgbm90IGNvbmRpdGlvbjoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1lc3NhZ2UpCiAgICAKZGVmIHZlcmlmeShqd3Nqcyk6CiAgICAiIiJSZXR1cm4gKGRlY29kZWQgaGVhZGVycywgcGF5bG9hZCkgaWYgYWxsIHNpZ25hdHVyZXMgaW4gandzanMgYXJlCiAgICBjb25zaXN0ZW50LCBlbHNlIHJhaXNlIFZhbHVlRXJyb3IuCiAgICAKICAgIENhbGxlciBtdXN0IGRlY2lkZSB3aGV0aGVyIHRoZSBrZXlzIGFyZSBhY3R1YWxseSB0cnVzdGVkLiIiIgogICAgZ2V0X2VkMjU1MTlsbCgpICAgIAogICAgIyBYWFggZm9yYmlkIGR1cGxpY2F0ZSBrZXlzIGluIEpTT04gaW5wdXQgdXNpbmcgb2JqZWN0X3BhaXJzX2hvb2sgKDIuNyspCiAgICByZWNpcGllbnRzID0gandzanNbInJlY2lwaWVudHMiXQogICAgZW5jb2RlZF9wYXlsb2FkID0gYmluYXJ5KGp3c2pzWyJwYXlsb2FkIl0pCiAgICBoZWFkZXJzID0gW10KICAgIGZvciByZWNpcGllbnQgaW4gcmVjaXBpZW50czoKICAgICAgICBhc3NlcnRUcnVlKGxlbihyZWNpcGllbnQpID09IDIsICJVbmtub3duIHJlY2lwaWVudCBrZXkgezB9Ii5mb3JtYXQocmVjaXBpZW50KSkKICAgICAgICBoID0gYmluYXJ5KHJlY2lwaWVudFsiaGVhZGVyIl0pCiAgICAgICAgcyA9IGJpbmFyeShyZWNpcGllbnRbInNpZ25hdHVyZSJdKQogICAgICAgIGhlYWRlciA9IGpzb24ubG9hZHMobmF0aXZlKHVybHNhZmVfYjY0ZGVjb2RlKGgpKSkKICAgICAgICBhc3NlcnRUcnVlKGhlYWRlclsiYWxnIl0gPT0gQUxHLCAKICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGFsZ29yaXRobSB7MH0iLmZvcm1hdChoZWFkZXJbImFsZyJdKSkKICAgICAgICBpZiAiYWxnIiBpbiBoZWFkZXJbImp3ayJdIGFuZCBub3QgImt0eSIgaW4gaGVhZGVyWyJqd2siXToKICAgICAgICAgICAgaGVhZGVyWyJqd2siXVsia3R5Il0gPSBoZWFkZXJbImp3ayJdWyJhbGciXSAjIGIvdyBmb3IgSldLIDwgLTA4CiAgICAgICAgYXNzZXJ0VHJ1ZShoZWFkZXJbImp3ayJdWyJrdHkiXSA9PSBBTEcsICMgdHJ1ZSBmb3IgRWQyNTUxOQogICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQga2V5IHR5cGUgezB9Ii5mb3JtYXQoaGVhZGVyWyJqd2siXVsia3R5Il0pKQogICAgICAgIHZrID0gdXJsc2FmZV9iNjRkZWNvZGUoYmluYXJ5KGhlYWRlclsiandrIl1bInZrIl0pKQogICAgICAgIHNlY3VyZWRfaW5wdXQgPSBiIi4iLmpvaW4oKGgsIGVuY29kZWRfcGF5bG9hZCkpCiAgICAgICAgc2lnID0gdXJsc2FmZV9iNjRkZWNvZGUocykKICAgICAgICBzaWdfbXNnID0gc2lnK3NlY3VyZWRfaW5wdXQKICAgICAgICB2ZXJpZmllZF9pbnB1dCA9IG5hdGl2ZShlZDI1NTE5bGwuY3J5cHRvX3NpZ25fb3BlbihzaWdfbXNnLCB2aykpCiAgICAgICAgdmVyaWZpZWRfaGVhZGVyLCB2ZXJpZmllZF9wYXlsb2FkID0gdmVyaWZpZWRfaW5wdXQuc3BsaXQoJy4nKQogICAgICAgIHZlcmlmaWVkX2hlYWRlciA9IGJpbmFyeSh2ZXJpZmllZF9oZWFkZXIpCiAgICAgICAgZGVjb2RlZF9oZWFkZXIgPSBuYXRpdmUodXJsc2FmZV9iNjRkZWNvZGUodmVyaWZpZWRfaGVhZGVyKSkKICAgICAgICBoZWFkZXJzLmFwcGVuZChqc29uLmxvYWRzKGRlY29kZWRfaGVhZGVyKSkKCiAgICB2ZXJpZmllZF9wYXlsb2FkID0gYmluYXJ5KHZlcmlmaWVkX3BheWxvYWQpCgogICAgIyBvbmx5IHJldHVybiBoZWFkZXIsIHBheWxvYWQgdGhhdCBoYXZlIHBhc3NlZCB0aHJvdWdoIHRoZSBjcnlwdG8gbGlicmFyeS4KICAgIHBheWxvYWQgPSBqc29uLmxvYWRzKG5hdGl2ZSh1cmxzYWZlX2I2NGRlY29kZSh2ZXJpZmllZF9wYXlsb2FkKSkpCgogICAgcmV0dXJuIGhlYWRlcnMsIHBheWxvYWQKCmRlZiB0ZXN0KCk6CiAgICBrcCA9IGVkMjU1MTlsbC5jcnlwdG9fc2lnbl9rZXlwYWlyKCkKICAgIHBheWxvYWQgPSB7J3Rlc3QnOiAnb25zdGFydHVwJ30KICAgIGp3c2pzID0ganNvbi5sb2Fkcyhqc29uLmR1bXBzKHNpZ24ocGF5bG9hZCwga3ApKSkKICAgIHZlcmlmeShqd3NqcykKICAgIGp3c2pzWydwYXlsb2FkJ10gKz0gJ3gnCiAgICB0cnk6CiAgICAgICAgdmVyaWZ5KGp3c2pzKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcGFzcwogICAgZWxzZTogIyBwcmFnbWEgbm8gY292ZXIKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIk5vIGVycm9yIGZyb20gYmFkIHdoZWVsLnNpZ25hdHVyZXMgcGF5bG9hZC4iKQoKUEsDBBQAAAAAAAAAIQD8UP/gYxoAAGMaAAAuAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvc2lnbmF0dXJlcy9kamJlYy5weSMgRWQyNTUxOSBkaWdpdGFsIHNpZ25hdHVyZXMKIyBCYXNlZCBvbiBodHRwOi8vZWQyNTUxOS5jci55cC50by9weXRob24vZWQyNTUxOS5weQojIFNlZSBhbHNvIGh0dHA6Ly9lZDI1NTE5LmNyLnlwLnRvL3NvZnR3YXJlLmh0bWwKIyBBZGFwdGVkIGJ5IFJvbiBHYXJyZXQKIyBTcGVkIHVwIGNvbnNpZGVyYWJseSB1c2luZyBjb29yZGluYXRlIHRyYW5zZm9ybXMgZm91bmQgb246CiMgaHR0cDovL3d3dy5oeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tdHdpc3RlZC1leHRlbmRlZC0xLmh0bWwKIyBTcGVjaWZpY2FsbHkgYWRkLTIwMDgtaHdjZC00IGFuZCBkYmwtMjAwOC1od2NkCgp0cnk6ICMgcHJhZ21hIG5vY292ZXIKICAgIHVuaWNvZGUKICAgIFBZMyA9IEZhbHNlCiAgICBkZWYgYXNieXRlcyhiKToKICAgICAgICAiIiJDb252ZXJ0IGFycmF5IG9mIGludGVnZXJzIHRvIGJ5dGUgc3RyaW5nIiIiCiAgICAgICAgcmV0dXJuICcnLmpvaW4oY2hyKHgpIGZvciB4IGluIGIpCiAgICBkZWYgam9pbmJ5dGVzKGIpOgogICAgICAgICIiIkNvbnZlcnQgYXJyYXkgb2YgYnl0ZXMgdG8gYnl0ZSBzdHJpbmciIiIKICAgICAgICByZXR1cm4gJycuam9pbihiKQogICAgZGVmIGJpdChoLCBpKToKICAgICAgICAiIiJSZXR1cm4gaSd0aCBiaXQgb2YgYnl0ZXN0cmluZyBoIiIiCiAgICAgICAgcmV0dXJuIChvcmQoaFtpLy84XSkgPj4gKGklOCkpICYgMQoKZXhjZXB0IE5hbWVFcnJvcjogIyBwcmFnbWEgbm9jb3ZlcgogICAgUFkzID0gVHJ1ZQogICAgYXNieXRlcyA9IGJ5dGVzCiAgICBqb2luYnl0ZXMgPSBieXRlcwogICAgZGVmIGJpdChoLCBpKToKICAgICAgICByZXR1cm4gKGhbaS8vOF0gPj4gKGklOCkpICYgMQoKaW1wb3J0IGhhc2hsaWIKCmIgPSAyNTYKcSA9IDIqKjI1NSAtIDE5CmwgPSAyKioyNTIgKyAyNzc0MjMxNzc3NzM3MjM1MzUzNTg1MTkzNzc5MDg4MzY0ODQ5MwoKZGVmIEgobSk6CiAgICByZXR1cm4gaGFzaGxpYi5zaGE1MTIobSkuZGlnZXN0KCkKCmRlZiBleHBtb2QoYiwgZSwgbSk6CiAgICBpZiBlID09IDA6IHJldHVybiAxCiAgICB0ID0gZXhwbW9kKGIsIGUgLy8gMiwgbSkgKiogMiAlIG0KICAgIGlmIGUgJiAxOiB0ID0gKHQgKiBiKSAlIG0KICAgIHJldHVybiB0CgojIENhbiBwcm9iYWJseSBnZXQgc29tZSBleHRyYSBzcGVlZHVwIGhlcmUgYnkgcmVwbGFjaW5nIHRoaXMgd2l0aAojIGFuIGV4dGVuZGVkLWV1Y2xpZGVhbiwgYnV0IHBlcmZvcm1hbmNlIHNlZW1zIE9LIHdpdGhvdXQgdGhhdApkZWYgaW52KHgpOgogICAgcmV0dXJuIGV4cG1vZCh4LCBxLTIsIHEpCgpkID0gLTEyMTY2NSAqIGludigxMjE2NjYpCkkgPSBleHBtb2QoMiwocS0xKS8vNCxxKQoKZGVmIHhyZWNvdmVyKHkpOgogICAgeHggPSAoeSp5LTEpICogaW52KGQqeSp5KzEpCiAgICB4ID0gZXhwbW9kKHh4LChxKzMpLy84LHEpCiAgICBpZiAoeCp4IC0geHgpICUgcSAhPSAwOiB4ID0gKHgqSSkgJSBxCiAgICBpZiB4ICUgMiAhPSAwOiB4ID0gcS14CiAgICByZXR1cm4geAoKQnkgPSA0ICogaW52KDUpCkJ4ID0geHJlY292ZXIoQnkpCkIgPSBbQnggJSBxLEJ5ICUgcV0KCiNkZWYgZWR3YXJkcyhQLFEpOgojICAgIHgxID0gUFswXQojICAgIHkxID0gUFsxXQojICAgIHgyID0gUVswXQojICAgIHkyID0gUVsxXQojICAgIHgzID0gKHgxKnkyK3gyKnkxKSAqIGludigxK2QqeDEqeDIqeTEqeTIpCiMgICAgeTMgPSAoeTEqeTIreDEqeDIpICogaW52KDEtZCp4MSp4Mip5MSp5MikKIyAgICByZXR1cm4gKHgzICUgcSx5MyAlIHEpCgojZGVmIHNjYWxhcm11bHQoUCxlKToKIyAgICBpZiBlID09IDA6IHJldHVybiBbMCwxXQojICAgIFEgPSBzY2FsYXJtdWx0KFAsZS8yKQojICAgIFEgPSBlZHdhcmRzKFEsUSkKIyAgICBpZiBlICYgMTogUSA9IGVkd2FyZHMoUSxQKQojICAgIHJldHVybiBRCgojIEZhc3RlciAoISkgdmVyc2lvbiBiYXNlZCBvbjoKIyBodHRwOi8vd3d3Lmh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLWV4dGVuZGVkLTEuaHRtbAoKZGVmIHhwdF9hZGQocHQxLCBwdDIpOgogICAgKFgxLCBZMSwgWjEsIFQxKSA9IHB0MQogICAgKFgyLCBZMiwgWjIsIFQyKSA9IHB0MgogICAgQSA9ICgoWTEtWDEpKihZMitYMikpICUgcQogICAgQiA9ICgoWTErWDEpKihZMi1YMikpICUgcQogICAgQyA9IChaMSoyKlQyKSAlIHEKICAgIEQgPSAoVDEqMipaMikgJSBxCiAgICBFID0gKEQrQykgJSBxCiAgICBGID0gKEItQSkgJSBxCiAgICBHID0gKEIrQSkgJSBxCiAgICBIID0gKEQtQykgJSBxCiAgICBYMyA9IChFKkYpICUgcQogICAgWTMgPSAoRypIKSAlIHEKICAgIFozID0gKEYqRykgJSBxCiAgICBUMyA9IChFKkgpICUgcQogICAgcmV0dXJuIChYMywgWTMsIFozLCBUMykKCmRlZiB4cHRfZG91YmxlIChwdCk6CiAgICAoWDEsIFkxLCBaMSwgXykgPSBwdAogICAgQSA9IChYMSpYMSkKICAgIEIgPSAoWTEqWTEpCiAgICBDID0gKDIqWjEqWjEpCiAgICBEID0gKC1BKSAlIHEKICAgIEogPSAoWDErWTEpICUgcQogICAgRSA9IChKKkotQS1CKSAlIHEKICAgIEcgPSAoRCtCKSAlIHEKICAgIEYgPSAoRy1DKSAlIHEKICAgIEggPSAoRC1CKSAlIHEKICAgIFgzID0gKEUqRikgJSBxCiAgICBZMyA9IChHKkgpICUgcQogICAgWjMgPSAoRipHKSAlIHEKICAgIFQzID0gKEUqSCkgJSBxCiAgICByZXR1cm4gKFgzLCBZMywgWjMsIFQzKQoKZGVmIHB0X3hmb3JtIChwdCk6CiAgICAoeCwgeSkgPSBwdAogICAgcmV0dXJuICh4LCB5LCAxLCAoeCp5KSVxKQoKZGVmIHB0X3VueGZvcm0gKHB0KToKICAgICh4LCB5LCB6LCBfKSA9IHB0CiAgICByZXR1cm4gKCh4Kmludih6KSklcSwgKHkqaW52KHopKSVxKQoKZGVmIHhwdF9tdWx0IChwdCwgbik6CiAgICBpZiBuPT0wOiByZXR1cm4gcHRfeGZvcm0oKDAsMSkpCiAgICBfID0geHB0X2RvdWJsZSh4cHRfbXVsdChwdCwgbj4+MSkpCiAgICByZXR1cm4geHB0X2FkZChfLCBwdCkgaWYgbiYxIGVsc2UgXwoKZGVmIHNjYWxhcm11bHQocHQsIGUpOgogICAgcmV0dXJuIHB0X3VueGZvcm0oeHB0X211bHQocHRfeGZvcm0ocHQpLCBlKSkKCmRlZiBlbmNvZGVpbnQoeSk6CiAgICBiaXRzID0gWyh5ID4+IGkpICYgMSBmb3IgaSBpbiByYW5nZShiKV0KICAgIGUgPSBbKHN1bShbYml0c1tpICogOCArIGpdIDw8IGogZm9yIGogaW4gcmFuZ2UoOCldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoYi8vOCldCiAgICByZXR1cm4gYXNieXRlcyhlKQoKZGVmIGVuY29kZXBvaW50KFApOgogICAgeCA9IFBbMF0KICAgIHkgPSBQWzFdCiAgICBiaXRzID0gWyh5ID4+IGkpICYgMSBmb3IgaSBpbiByYW5nZShiIC0gMSldICsgW3ggJiAxXQogICAgZSA9IFsoc3VtKFtiaXRzW2kgKiA4ICsgal0gPDwgaiBmb3IgaiBpbiByYW5nZSg4KV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShiLy84KV0KICAgIHJldHVybiBhc2J5dGVzKGUpCiAgICAKZGVmIHB1YmxpY2tleShzayk6CiAgICBoID0gSChzaykKICAgIGEgPSAyKiooYi0yKSArIHN1bSgyKippICogYml0KGgsaSkgZm9yIGkgaW4gcmFuZ2UoMyxiLTIpKQogICAgQSA9IHNjYWxhcm11bHQoQixhKQogICAgcmV0dXJuIGVuY29kZXBvaW50KEEpCgpkZWYgSGludChtKToKICAgIGggPSBIKG0pCiAgICByZXR1cm4gc3VtKDIqKmkgKiBiaXQoaCxpKSBmb3IgaSBpbiByYW5nZSgyKmIpKQoKZGVmIHNpZ25hdHVyZShtLHNrLHBrKToKICAgIGggPSBIKHNrKQogICAgYSA9IDIqKihiLTIpICsgc3VtKDIqKmkgKiBiaXQoaCxpKSBmb3IgaSBpbiByYW5nZSgzLGItMikpCiAgICBpbnRlciA9IGpvaW5ieXRlcyhbaFtpXSBmb3IgaSBpbiByYW5nZShiLy84LGIvLzQpXSkKICAgIHIgPSBIaW50KGludGVyICsgbSkKICAgIFIgPSBzY2FsYXJtdWx0KEIscikKICAgIFMgPSAociArIEhpbnQoZW5jb2RlcG9pbnQoUikgKyBwayArIG0pICogYSkgJSBsCiAgICByZXR1cm4gZW5jb2RlcG9pbnQoUikgKyBlbmNvZGVpbnQoUykKCmRlZiBpc29uY3VydmUoUCk6CiAgICB4ID0gUFswXQogICAgeSA9IFBbMV0KICAgIHJldHVybiAoLXgqeCArIHkqeSAtIDEgLSBkKngqeCp5KnkpICUgcSA9PSAwCgpkZWYgZGVjb2RlaW50KHMpOgogICAgcmV0dXJuIHN1bSgyKippICogYml0KHMsaSkgZm9yIGkgaW4gcmFuZ2UoMCxiKSkKCmRlZiBkZWNvZGVwb2ludChzKToKICAgIHkgPSBzdW0oMioqaSAqIGJpdChzLGkpIGZvciBpIGluIHJhbmdlKDAsYi0xKSkKICAgIHggPSB4cmVjb3Zlcih5KQogICAgaWYgeCAmIDEgIT0gYml0KHMsYi0xKTogeCA9IHEteAogICAgUCA9IFt4LHldCiAgICBpZiBub3QgaXNvbmN1cnZlKFApOiByYWlzZSBFeGNlcHRpb24oImRlY29kaW5nIHBvaW50IHRoYXQgaXMgbm90IG9uIGN1cnZlIikKICAgIHJldHVybiBQCgpkZWYgY2hlY2t2YWxpZChzLCBtLCBwayk6CiAgICBpZiBsZW4ocykgIT0gYi8vNDogcmFpc2UgRXhjZXB0aW9uKCJzaWduYXR1cmUgbGVuZ3RoIGlzIHdyb25nIikKICAgIGlmIGxlbihwaykgIT0gYi8vODogcmFpc2UgRXhjZXB0aW9uKCJwdWJsaWMta2V5IGxlbmd0aCBpcyB3cm9uZyIpCiAgICBSID0gZGVjb2RlcG9pbnQoc1swOmIvLzhdKQogICAgQSA9IGRlY29kZXBvaW50KHBrKQogICAgUyA9IGRlY29kZWludChzW2IvLzg6Yi8vNF0pCiAgICBoID0gSGludChlbmNvZGVwb2ludChSKSArIHBrICsgbSkKICAgIHYxID0gc2NhbGFybXVsdChCLFMpCiMgIHYyID0gZWR3YXJkcyhSLHNjYWxhcm11bHQoQSxoKSkKICAgIHYyID0gcHRfdW54Zm9ybSh4cHRfYWRkKHB0X3hmb3JtKFIpLCBwdF94Zm9ybShzY2FsYXJtdWx0KEEsIGgpKSkpCiAgICByZXR1cm4gdjE9PXYyCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMKIyBDdXJ2ZTI1NTE5IHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBieSBNYXR0aGV3IERlbXBza3ksIGZyb206CiMgaHR0cDovL2NyLnlwLnRvL2hpZ2hzcGVlZC9uYWNsY3J5cHRvLTIwMDkwMzEwLnBkZgoKIyBQID0gMiAqKiAyNTUgLSAxOQpQID0gcQpBID0gNDg2NjYyCgojZGVmIGV4cG1vZChiLCBlLCBtKToKIyAgICBpZiBlID09IDA6IHJldHVybiAxCiMgICAgdCA9IGV4cG1vZChiLCBlIC8gMiwgbSkgKiogMiAlIG0KIyAgICBpZiBlICYgMTogdCA9ICh0ICogYikgJSBtCiMgICAgcmV0dXJuIHQKCiMgZGVmIGludih4KTogcmV0dXJuIGV4cG1vZCh4LCBQIC0gMiwgUCkKCmRlZiBhZGQobiwgbSwgZCk6CiAgICAoeG4sIHpuKSA9IG4KICAgICh4bSwgem0pID0gbSAKICAgICh4ZCwgemQpID0gZAogICAgeCA9IDQgKiAoeG0gKiB4biAtIHptICogem4pICoqIDIgKiB6ZAogICAgeiA9IDQgKiAoeG0gKiB6biAtIHptICogeG4pICoqIDIgKiB4ZAogICAgcmV0dXJuICh4ICUgUCwgeiAlIFApCgpkZWYgZG91YmxlKG4pOgogICAgKHhuLCB6bikgPSBuCiAgICB4ID0gKHhuICoqIDIgLSB6biAqKiAyKSAqKiAyCiAgICB6ID0gNCAqIHhuICogem4gKiAoeG4gKiogMiArIEEgKiB4biAqIHpuICsgem4gKiogMikKICAgIHJldHVybiAoeCAlIFAsIHogJSBQKQoKZGVmIGN1cnZlMjU1MTkobiwgYmFzZT05KToKICAgIG9uZSA9IChiYXNlLDEpCiAgICB0d28gPSBkb3VibGUob25lKQogICAgIyBmKG0pIGV2YWx1YXRlcyB0byBhIHR1cGxlCiAgICAjIGNvbnRhaW5pbmcgdGhlIG10aCBtdWx0aXBsZSBhbmQgdGhlCiAgICAjIChtKzEpdGggbXVsdGlwbGUgb2YgYmFzZS4KICAgIGRlZiBmKG0pOgogICAgICAgIGlmIG0gPT0gMTogcmV0dXJuIChvbmUsIHR3bykKICAgICAgICAocG0sIHBtMSkgPSBmKG0gLy8gMikKICAgICAgICBpZiAobSAmIDEpOgogICAgICAgICAgICByZXR1cm4gKGFkZChwbSwgcG0xLCBvbmUpLCBkb3VibGUocG0xKSkKICAgICAgICByZXR1cm4gKGRvdWJsZShwbSksIGFkZChwbSwgcG0xLCBvbmUpKQogICAgKCh4LHopLCBfKSA9IGYobikKICAgIHJldHVybiAoeCAqIGludih6KSkgJSBQCgppbXBvcnQgcmFuZG9tCgpkZWYgZ2Vua2V5KG49MCk6CiAgICBuID0gbiBvciByYW5kb20ucmFuZGludCgwLFApCiAgICBuICY9IH43CiAgICBuICY9IH4oMTI4IDw8IDggKiAzMSkKICAgIG4gfD0gNjQgPDwgOCAqIDMxCiAgICByZXR1cm4gbgoKI2RlZiBzdHIyaW50KHMpOgojICAgIHJldHVybiBpbnQoaGV4bGlmeShzKSwgMTYpCiMgICAgIyByZXR1cm4gc3VtKG9yZChzW2ldKSA8PCAoOCAqIGkpIGZvciBpIGluIHJhbmdlKDMyKSkKIwojZGVmIGludDJzdHIobik6CiMgICAgcmV0dXJuIHVuaGV4bGlmeSgiJXgiICUgbikKIyAgICAjIHJldHVybiAnJy5qb2luKFtjaHIoKG4gPj4gKDggKiBpKSkgJiAyNTUpIGZvciBpIGluIHJhbmdlKDMyKV0pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpkZWYgZHNhX3Rlc3QoKToKICAgIGltcG9ydCBvcwogICAgbXNnID0gc3RyKHJhbmRvbS5yYW5kaW50KHEscStxKSkuZW5jb2RlKCd1dGYtOCcpCiAgICBzayA9IG9zLnVyYW5kb20oMzIpCiAgICBwayA9IHB1YmxpY2tleShzaykKICAgIHNpZyA9IHNpZ25hdHVyZShtc2csIHNrLCBwaykKICAgIHJldHVybiBjaGVja3ZhbGlkKHNpZywgbXNnLCBwaykKCmRlZiBkaF90ZXN0KCk6CiAgICBzazEgPSBnZW5rZXkoKQogICAgc2syID0gZ2Vua2V5KCkKICAgIHJldHVybiBjdXJ2ZTI1NTE5KHNrMSwgY3VydmUyNTUxOShzazIpKSA9PSBjdXJ2ZTI1NTE5KHNrMiwgY3VydmUyNTUxOShzazEpKQoKUEsDBBQAAAAAAAAAIQBMASU+nwYAAJ8GAAAyAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvc2lnbmF0dXJlcy9lZDI1NTE5cHkucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBvcwoKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQpmcm9tIC4gaW1wb3J0IGRqYmVjCgpfX2FsbF9fID0gWydjcnlwdG9fc2lnbicsICdjcnlwdG9fc2lnbl9vcGVuJywgJ2NyeXB0b19zaWduX2tleXBhaXInLCAnS2V5cGFpcicsCiAgICAgICAgICAgJ1BVQkxJQ0tFWUJZVEVTJywgJ1NFQ1JFVEtFWUJZVEVTJywgJ1NJR05BVFVSRUJZVEVTJ10KClBVQkxJQ0tFWUJZVEVTPTMyClNFQ1JFVEtFWUJZVEVTPTY0ClNJR05BVFVSRUJZVEVTPTY0CgpLZXlwYWlyID0gbmFtZWR0dXBsZSgnS2V5cGFpcicsICgndmsnLCAnc2snKSkgIyB2ZXJpZnlpbmcga2V5LCBzZWNyZXQga2V5CgpkZWYgY3J5cHRvX3NpZ25fa2V5cGFpcihzZWVkPU5vbmUpOgogICAgIiIiUmV0dXJuICh2ZXJpZnlpbmcsIHNlY3JldCkga2V5IGZyb20gYSBnaXZlbiBzZWVkLCBvciBvcy51cmFuZG9tKDMyKSIiIiAgICAKICAgIGlmIHNlZWQgaXMgTm9uZToKICAgICAgICBzZWVkID0gb3MudXJhbmRvbShQVUJMSUNLRVlCWVRFUykKICAgIGVsc2U6CiAgICAgICAgd2FybmluZ3Mud2FybigiZWQyNTUxOWxsIHNob3VsZCBjaG9vc2UgcmFuZG9tIHNlZWQuIiwKICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVXYXJuaW5nKQogICAgaWYgbGVuKHNlZWQpICE9IDMyOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInNlZWQgbXVzdCBiZSAzMiByYW5kb20gYnl0ZXMgb3IgTm9uZS4iKQogICAgc2tieXRlcyA9IHNlZWQKICAgIHZrYnl0ZXMgPSBkamJlYy5wdWJsaWNrZXkoc2tieXRlcykKICAgIHJldHVybiBLZXlwYWlyKHZrYnl0ZXMsIHNrYnl0ZXMrdmtieXRlcykKCgpkZWYgY3J5cHRvX3NpZ24obXNnLCBzayk6CiAgICAiIiJSZXR1cm4gc2lnbmF0dXJlK21lc3NhZ2UgZ2l2ZW4gbWVzc2FnZSBhbmQgc2VjcmV0IGtleS4KICAgIFRoZSBzaWduYXR1cmUgaXMgdGhlIGZpcnN0IFNJR05BVFVSRUJZVEVTIGJ5dGVzIG9mIHRoZSByZXR1cm4gdmFsdWUuCiAgICBBIGNvcHkgb2YgbXNnIGlzIGluIHRoZSByZW1haW5kZXIuIiIiCiAgICBpZiBsZW4oc2spICE9IFNFQ1JFVEtFWUJZVEVTOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkJhZCBzaWduaW5nIGtleSBsZW5ndGggJWQiICUgbGVuKHNrKSkKICAgIHZrYnl0ZXMgPSBza1tQVUJMSUNLRVlCWVRFUzpdCiAgICBza2J5dGVzID0gc2tbOlBVQkxJQ0tFWUJZVEVTXQogICAgc2lnID0gZGpiZWMuc2lnbmF0dXJlKG1zZywgc2tieXRlcywgdmtieXRlcykKICAgIHJldHVybiBzaWcgKyBtc2cKCgpkZWYgY3J5cHRvX3NpZ25fb3BlbihzaWduZWQsIHZrKToKICAgICIiIlJldHVybiBtZXNzYWdlIGdpdmVuIHNpZ25hdHVyZSttZXNzYWdlIGFuZCB0aGUgdmVyaWZ5aW5nIGtleS4iIiIKICAgIGlmIGxlbih2aykgIT0gUFVCTElDS0VZQllURVM6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQmFkIHZlcmlmeWluZyBrZXkgbGVuZ3RoICVkIiAlIGxlbih2aykpCiAgICByYyA9IGRqYmVjLmNoZWNrdmFsaWQoc2lnbmVkWzpTSUdOQVRVUkVCWVRFU10sIHNpZ25lZFtTSUdOQVRVUkVCWVRFUzpdLCB2aykKICAgIGlmIG5vdCByYzoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJyYyAhPSBUcnVlIiwgcmMpICAgIAogICAgcmV0dXJuIHNpZ25lZFtTSUdOQVRVUkVCWVRFUzpdCgpQSwMEFAAAAAAAAAAhANvb4i30DAAA9AwAAC0AAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9zaWduYXR1cmVzL2tleXMucHkiIiJTdG9yZSBhbmQgcmV0cmlldmUgd2hlZWwgc2lnbmluZyAvIHZlcmlmeWluZyBrZXlzLgoKR2l2ZW4gYSBzY29wZSAoYSBwYWNrYWdlIG5hbWUsICsgbWVhbmluZyAiYWxsIHBhY2thZ2VzIiwgb3IgLSBtZWFuaW5nIAoibm8gcGFja2FnZXMiKSwgcmV0dXJuIGEgbGlzdCBvZiB2ZXJpZnlpbmcga2V5cyB0aGF0IGFyZSB0cnVzdGVkIGZvciB0aGF0IApzY29wZS4KCkdpdmVuIGEgcGFja2FnZSBuYW1lLCByZXR1cm4gYSBsaXN0IG9mIChzY29wZSwga2V5KSBzdWdnZXN0ZWQga2V5cyB0byBzaWduCnRoYXQgcGFja2FnZSAob25seSB0aGUgdmVyaWZ5aW5nIGtleXM7IHRoZSBwcml2YXRlIHNpZ25pbmcga2V5IGlzIHN0b3JlZAplbHNld2hlcmUpLgoKS2V5cyBoZXJlIGFyZSByZXByZXNlbnRlZCBhcyB1cmxzYWZlX2I2NGVuY29kZWQgc3RyaW5ncyB3aXRoIG5vIHBhZGRpbmcuCgpUZW50YXRpdmUgY29tbWFuZCBsaW5lIGludGVyZmFjZToKCiMgbGlzdCB0cnVzdHMKd2hlZWwgdHJ1c3QKIyB0cnVzdCBhIHBhcnRpY3VsYXIga2V5IGZvciBhbGwKd2hlZWwgdHJ1c3QgKyBrZXkKIyB0cnVzdCBrZXkgZm9yIGJlYWdsZXZvdGUKd2hlZWwgdHJ1c3QgYmVhZ2xldm90ZSBrZXkKIyBzdG9wIHRydXN0aW5nIGEga2V5IGZvciBhbGwKd2hlZWwgdW50cnVzdCArIGtleQoKIyBnZW5lcmF0ZSBhIGtleSBwYWlyCndoZWVsIGtleWdlbgoKIyBpbXBvcnQgYSBzaWduaW5nIGtleSBmcm9tIGEgZmlsZQp3aGVlbCBpbXBvcnQga2V5ZmlsZQoKIyBleHBvcnQgYSBzaWduaW5nIGtleQp3aGVlbCBleHBvcnQga2V5CiIiIgoKaW1wb3J0IGpzb24KaW1wb3J0IG9zLnBhdGgKZnJvbSAuLnV0aWwgaW1wb3J0IG5hdGl2ZSwgbG9hZF9jb25maWdfcGF0aHMsIHNhdmVfY29uZmlnX3BhdGgKCmNsYXNzIFdoZWVsS2V5cyhvYmplY3QpOgogICAgU0NIRU1BID0gMQogICAgQ09ORklHX05BTUUgPSAnd2hlZWwuanNvbicKICAgIAogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuZGF0YSA9IHsnc2lnbmVycyc6W10sICd2ZXJpZmllcnMnOltdfQogICAgICAgIAogICAgZGVmIGxvYWQoc2VsZik6CiAgICAgICAgIyBYWFggSlNPTiBpcyBub3QgYSBncmVhdCBkYXRhYmFzZQogICAgICAgIGZvciBwYXRoIGluIGxvYWRfY29uZmlnX3BhdGhzKCd3aGVlbCcpOgogICAgICAgICAgICBjb25mID0gb3MucGF0aC5qb2luKG5hdGl2ZShwYXRoKSwgc2VsZi5DT05GSUdfTkFNRSkKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoY29uZik6CiAgICAgICAgICAgICAgICB3aXRoIG9wZW4oY29uZiwgJ3InKSBhcyBpbmZpbGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0ganNvbi5sb2FkKGluZmlsZSkKICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiAoJ3NpZ25lcnMnLCAndmVyaWZpZXJzJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCB4IGluIHNlbGYuZGF0YToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YVt4XSA9IFtdCiAgICAgICAgICAgICAgICAgICAgaWYgJ3NjaGVtYScgbm90IGluIHNlbGYuZGF0YToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhWydzY2hlbWEnXSA9IHNlbGYuU0NIRU1BCiAgICAgICAgICAgICAgICAgICAgZWxpZiBzZWxmLmRhdGFbJ3NjaGVtYSddICE9IHNlbGYuU0NIRU1BOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCB3aGVlbC5qc29uIHZlcnNpb24gezB9LCBleHBlY3RlZCB7MX0iLmZvcm1hdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGFbJ3NjaGVtYSddLCBzZWxmLlNDSEVNQSkpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHNhdmUoc2VsZik6CiAgICAgICAgIyBUcnkgbm90IHRvIGNhbGwgdGhpcyBhIHZlcnkgbG9uZyB0aW1lIGFmdGVyIGxvYWQoKSAKICAgICAgICBwYXRoID0gc2F2ZV9jb25maWdfcGF0aCgnd2hlZWwnKQogICAgICAgIGNvbmYgPSBvcy5wYXRoLmpvaW4obmF0aXZlKHBhdGgpLCBzZWxmLkNPTkZJR19OQU1FKQogICAgICAgIHdpdGggb3Blbihjb25mLCAndysnKSBhcyBvdXQ6CiAgICAgICAgICAgIGpzb24uZHVtcChzZWxmLmRhdGEsIG91dCwgaW5kZW50PTIpCiAgICAgICAgcmV0dXJuIHNlbGYKICAgIAogICAgZGVmIHRydXN0KHNlbGYsIHNjb3BlLCB2ayk6CiAgICAgICAgIiIiU3RhcnQgdHJ1c3RpbmcgYSBwYXJ0aWN1bGFyIGtleSBmb3IgZ2l2ZW4gc2NvcGUuIiIiCiAgICAgICAgc2VsZi5kYXRhWyd2ZXJpZmllcnMnXS5hcHBlbmQoeydzY29wZSc6c2NvcGUsICd2ayc6dmt9KQogICAgICAgIHJldHVybiBzZWxmCiAgICAKICAgIGRlZiB1bnRydXN0KHNlbGYsIHNjb3BlLCB2ayk6CiAgICAgICAgIiIiU3RvcCB0cnVzdGluZyBhIHBhcnRpY3VsYXIga2V5IGZvciBnaXZlbiBzY29wZS4iIiIKICAgICAgICBzZWxmLmRhdGFbJ3ZlcmlmaWVycyddLnJlbW92ZSh7J3Njb3BlJzpzY29wZSwgJ3ZrJzp2a30pCiAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICAKICAgIGRlZiB0cnVzdGVkKHNlbGYsIHNjb3BlPU5vbmUpOgogICAgICAgICIiIlJldHVybiBsaXN0IG9mIFsoc2NvcGUsIHRydXN0ZWQga2V5KSwgLi4uXSBmb3IgZ2l2ZW4gc2NvcGUuIiIiCiAgICAgICAgdHJ1c3QgPSBbKHhbJ3Njb3BlJ10sIHhbJ3ZrJ10pIGZvciB4IGluIHNlbGYuZGF0YVsndmVyaWZpZXJzJ10gaWYgeFsnc2NvcGUnXSBpbiAoc2NvcGUsICcrJyldCiAgICAgICAgdHJ1c3Quc29ydChrZXk9bGFtYmRhIHg6IHhbMF0pCiAgICAgICAgdHJ1c3QucmV2ZXJzZSgpCiAgICAgICAgcmV0dXJuIHRydXN0CiAgICAKICAgIGRlZiBzaWduZXJzKHNlbGYsIHNjb3BlKToKICAgICAgICAiIiJSZXR1cm4gbGlzdCBvZiBzaWduaW5nIGtleShzKS4iIiIKICAgICAgICBzaWduID0gWyh4WydzY29wZSddLCB4Wyd2ayddKSBmb3IgeCBpbiBzZWxmLmRhdGFbJ3NpZ25lcnMnXSBpZiB4WydzY29wZSddIGluIChzY29wZSwgJysnKV0KICAgICAgICBzaWduLnNvcnQoa2V5PWxhbWJkYSB4OiB4WzBdKQogICAgICAgIHNpZ24ucmV2ZXJzZSgpCiAgICAgICAgcmV0dXJuIHNpZ24KICAgIAogICAgZGVmIGFkZF9zaWduZXIoc2VsZiwgc2NvcGUsIHZrKToKICAgICAgICAiIiJSZW1lbWJlciB2ZXJpZnlpbmcga2V5IHZrIGFzIGJlaW5nIHZhbGlkIGZvciBzaWduaW5nIGluIHNjb3BlLiIiIgogICAgICAgIHNlbGYuZGF0YVsnc2lnbmVycyddLmFwcGVuZCh7J3Njb3BlJzpzY29wZSwgJ3ZrJzp2a30pCiAgICAKUEsDBBQAAAAAAAAAIQD/nmVwAQAAAAEAAAArAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9fX2luaXRfXy5weSNQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAADgAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2NvbXBsZXgtZGlzdC9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAShdH0hcAAAAXAAAARAAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvY29tcGxleC1kaXN0L2NvbXBsZXhkaXN0L19faW5pdF9fLnB5ZGVmIG1haW4oKToKICAgIHJldHVybgpQSwMEFAAAAAAAAAAhABwKFzhXAwAAVwMAADUAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2NvbXBsZXgtZGlzdC9zZXR1cC5weWZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAKCnRyeToKICAgIHVuaWNvZGUKICAgIGRlZiB1OChzKToKICAgICAgICByZXR1cm4gcy5kZWNvZGUoJ3VuaWNvZGUtZXNjYXBlJykKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiB1OChzKToKICAgICAgICByZXR1cm4gcwoKc2V0dXAobmFtZT0nY29tcGxleC1kaXN0JywKICAgICAgdmVyc2lvbj0nMC4xJywKICAgICAgZGVzY3JpcHRpb249dTgoJ0Fub3RoZXIgdGVzdGluZyBkaXN0cmlidXRpb24gXE57U05PV01BTn0nKSwKICAgICAgbG9uZ19kZXNjcmlwdGlvbj11OCgnQW5vdGhlciB0ZXN0aW5nIGRpc3RyaWJ1dGlvbiBcTntTTk9XTUFOfScpLAogICAgICBhdXRob3I9IklsbHVzdHJpb3VzIEF1dGhvciIsCiAgICAgIGF1dGhvcl9lbWFpbD0iaWxsdXN0cmlvdXNAZXhhbXBsZS5vcmciLAogICAgICB1cmw9Imh0dHA6Ly9leGFtcGxlLm9yZy9leGVtcGxhcnkiLAogICAgICBwYWNrYWdlcz1bJ2NvbXBsZXhkaXN0J10sCiAgICAgIHNldHVwX3JlcXVpcmVzPVsid2hlZWwiLCAic2V0dXB0b29scyJdLAogICAgICBpbnN0YWxsX3JlcXVpcmVzPVsicXV1eCIsICJzcGxvcnQiXSwKICAgICAgZXh0cmFzX3JlcXVpcmU9eydzaW1wbGUnOlsnc2ltcGxlLmRpc3QnXX0sCiAgICAgIHRlc3RzX3JlcXVpcmU9WyJmb28iLCAiYmFyPj0xMC4wLjAiXSwKICAgICAgZW50cnlfcG9pbnRzPXsKICAgICAgICAgICdjb25zb2xlX3NjcmlwdHMnOiBbCiAgICAgICAgICAgICAgJ2NvbXBsZXgtZGlzdD1jb21wbGV4ZGlzdDptYWluJywKICAgICAgICAgICAgICAnY29tcGxleC1kaXN0Mj1jb21wbGV4ZGlzdDptYWluJywKICAgICAgICAgIF0sCiAgICAgIH0sCiAgICAgICkKClBLAwQUAAAAAAAAACEAKEsYZZkGAACZBgAAKwAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvY29uZnRlc3QucHkiIiINCnB5dGVzdCBsb2NhbCBjb25maWd1cmF0aW9uIHBsdWctaW4NCiIiIg0KDQppbXBvcnQgZ2MNCmltcG9ydCB3YXJuaW5ncw0KDQppbXBvcnQgcHl0ZXN0DQoNCkBweXRlc3QueWllbGRfZml4dHVyZShzY29wZT0nZnVuY3Rpb24nLCBhdXRvdXNlPVRydWUpDQpkZWYgZXJyb3Jfb25fUmVzb3VyY2VXYXJuaW5nKCk6DQogICAgIiIiVGhpcyBmaXh0dXJlIGNhcHR1cmVzIFJlc291cmNlV2FybmluZydzIGFuZCByZXBvcnRzIGFuICJlcnJvciINCiAgICBkZXNjcmliaW5nIHRoZSBmaWxlIGhhbmRsZXMgbGVmdCBvcGVuLg0KICAgIA0KICAgIFRoaXMgaXMgc2hvd24gcmVnYXJkbGVzcyBvZiBob3cgc3VjY2Vzc2Z1bCB0aGUgdGVzdCB3YXMsIGlmIGEgdGVzdCBmYWlscw0KICAgIGFuZCBsZWF2ZXMgZmlsZXMgb3BlbiB0aGVuIHRob3NlIGZpbGVzIHdpbGwgYmUgcmVwb3J0ZWQuICBJZGVhbGx5LCBldmVuDQogICAgdGhvc2UgZmlsZXMgc2hvdWxkIGJlIGNsb3NlZCBwcm9wZXJseSBhZnRlciBhIHRlc3QgZmFpbHVyZSBvciBleGNlcHRpb24uDQoNCiAgICBTaW5jZSBvbmx5IFB5dGhvbiAzIGFuZCBQeVB5MyBoYXZlIFJlc291cmNlV2FybmluZydzLCB0aGlzIGNvbnRleHQgd2lsbA0KICAgIGhhdmUgbm8gZWZmZWN0IHdoZW4gcnVubmluZyB0ZXN0cyBvbiBQeXRob24gMiBvciBQeVB5Lg0KDQogICAgQmVjYXVzZSBvZiBhdXRvdXNlPVRydWUsIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgZm9yDQogICAgYWxsIHRlc3RfKiBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUuDQoNCiAgICBUaGlzIGNvZGUgaXMgcHJpbWFyaWx5IGJhc2VkIG9uIHRoZSBleGFtcGxlcyBmb3VuZCBoZXJlOg0KICAgIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI0NzE3MDI3L2NvbnZlcnQtcHl0aG9uLTMtcmVzb3VyY2V3YXJuaW5ncy1pbnRvLWV4Y2VwdGlvbg0KICAgICIiIg0KICAgIHRyeToNCiAgICAgICAgUmVzb3VyY2VXYXJuaW5nDQogICAgZXhjZXB0IE5hbWVFcnJvcjoNCiAgICAgICAgIyBQeXRob24gMiwgUHlQeQ0KICAgICAgICB5aWVsZA0KICAgICAgICByZXR1cm4NCiAgICAjIFB5dGhvbiAzLCBQeVB5Mw0KICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIGNhdWdodDoNCiAgICAgICAgd2FybmluZ3MucmVzZXR3YXJuaW5ncygpICMgY2xlYXIgYWxsIGZpbHRlcnMNCiAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnKSAjIGlnbm9yZSBhbGwNCiAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdhbHdheXMnLCBSZXNvdXJjZVdhcm5pbmcpICMgYWRkIGZpbHRlcg0KICAgICAgICB5aWVsZCAjIHJ1biB0ZXN0cyBpbiB0aGlzIGNvbnRleHQNCiAgICAgICAgZ2MuY29sbGVjdCgpICMgcnVuIGdhcmJhZ2UgY29sbGVjdGlvbiAoZm9yIHB5cHkzKQ0KICAgICAgICBpZiBub3QgY2F1Z2h0Og0KICAgICAgICAgICAgcmV0dXJuDQogICAgICAgIHB5dGVzdC5mYWlsKCdUaGUgZm9sbG93aW5nIGZpbGUgZGVzY3JpcHRvcnMgd2VyZSBub3QgY2xvc2VkIHByb3Blcmx5OlxuJyArDQogICAgICAgICAgICAgICAgICAgICdcbicuam9pbigoc3RyKHdhcm5pbmcubWVzc2FnZSkgZm9yIHdhcm5pbmcgaW4gY2F1Z2h0KSksDQogICAgICAgICAgICAgICAgICAgIHB5dHJhY2U9RmFsc2UpDQpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAADoAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2V4dGVuc2lvbi5kaXN0L19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQBfhsxPyAEAAMgBAAA3AAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9leHRlbnNpb24uZGlzdC9zZXR1cC5weWZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgoKdHJ5OgogICAgdW5pY29kZQogICAgZGVmIHU4KHMpOgogICAgICAgIHJldHVybiBzLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKS5lbmNvZGUoJ3V0Zi04JykKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiB1OChzKToKICAgICAgICByZXR1cm4gcy5lbmNvZGUoJ3V0Zi04JykKCnNldHVwKG5hbWU9J2V4dGVuc2lvbi5kaXN0JywKICAgICAgdmVyc2lvbj0nMC4xJywKICAgICAgZGVzY3JpcHRpb249dTgoJ0EgdGVzdGluZyBkaXN0cmlidXRpb24gXE57U05PV01BTn0nKSwKICAgICAgZXh0X21vZHVsZXM9WwogICAgICAgICAgRXh0ZW5zaW9uKG5hbWU9J2V4dGVuc2lvbicsIAogICAgICAgICAgc291cmNlcz1bJ2V4dGVuc2lvbi5jJ10sIAogICAgICAgICAgcHlfbGltaXRlZF9hcGk9VHJ1ZSkKICAgICAgICAgIF0sCiAgICAgICkKClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAOAAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvaGVhZGVycy5kaXN0L19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAA1AAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3QvaGVhZGVyLmhQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAADsAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2hlYWRlcnMuZGlzdC9oZWFkZXJzZGlzdC5weVBLAwQUAAAAAAAAACEAmcQnLEQBAABEAQAANQAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvaGVhZGVycy5kaXN0L3NldHVwLnB5ZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cAoKdHJ5OgogICAgdW5pY29kZQogICAgZGVmIHU4KHMpOgogICAgICAgIHJldHVybiBzLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKS5lbmNvZGUoJ3V0Zi04JykKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiB1OChzKToKICAgICAgICByZXR1cm4gcy5lbmNvZGUoJ3V0Zi04JykKCnNldHVwKG5hbWU9J2hlYWRlcnMuZGlzdCcsCiAgICAgIHZlcnNpb249JzAuMScsCiAgICAgIGRlc2NyaXB0aW9uPXU4KCdBIGRpc3RyaWJ1dGlvbiB3aXRoIGhlYWRlcnMnKSwKICAgICAgaGVhZGVycz1bJ2hlYWRlci5oJ10KICAgICAgKQoKUEsDBBQAAAAAAAAAIQBqPt3X2ywAANssAAAyAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9weWRpc3Qtc2NoZW1hLmpzb257CiAgImlkIjogImh0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQyNi8iLAogICIkc2NoZW1hIjogImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyIsCiAgInRpdGxlIjogIk1ldGFkYXRhIGZvciBQeXRob24gU29mdHdhcmUgUGFja2FnZXMgMi4wIiwKICAidHlwZSI6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIjogewogICAgIm1ldGFkYXRhX3ZlcnNpb24iOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJWZXJzaW9uIG9mIHRoZSBmaWxlIGZvcm1hdCIsCiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICJwYXR0ZXJuIjogIl4oXFxkKyhcXC5cXGQrKSopJCIKICAgIH0sCiAgICAiZ2VuZXJhdG9yIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiTmFtZSBhbmQgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbSB0aGF0IHByb2R1Y2VkIHRoaXMgZmlsZS4iLAogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAicGF0dGVybiI6ICJeWzAtOUEtWmEtel0oWzAtOUEtWmEtel8uLV0qWzAtOUEtWmEtel0pKCBcXCguKlxcKSk/JCIKICAgIH0sCiAgICAibmFtZSI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBuYW1lIG9mIHRoZSBkaXN0cmlidXRpb24uIiwKICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9kaXN0cmlidXRpb25fbmFtZSIKICAgIH0sCiAgICAidmVyc2lvbiI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBkaXN0cmlidXRpb24ncyBwdWJsaWMgdmVyc2lvbiBpZGVudGlmaWVyIiwKICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgInBhdHRlcm4iOiAiXihcXGQrKFxcLlxcZCspKikoKGF8YnxjfHJjKShcXGQrKSk/KFxcLihwb3N0KShcXGQrKSk/KFxcLihkZXYpKFxcZCspKT8kIgogICAgfSwKICAgICJzb3VyY2VfbGFiZWwiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGNvbnN0cmFpbmVkIGlkZW50aWZ5aW5nIHRleHQgc3RyaW5nIiwKICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgInBhdHRlcm4iOiAiXlswLTlhLXpfLi0rXSskIgogICAgfSwKICAgICJzb3VyY2VfdXJsIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBzdHJpbmcgY29udGFpbmluZyBhIGZ1bGwgVVJMIHdoZXJlIHRoZSBzb3VyY2UgZm9yIHRoaXMgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgZGlzdHJpYnV0aW9uIGNhbiBiZSBkb3dubG9hZGVkLiIsCiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICJmb3JtYXQiOiAidXJpIgogICAgfSwKICAgICJzdW1tYXJ5IjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBvbmUtbGluZSBzdW1tYXJ5IG9mIHdoYXQgdGhlIGRpc3RyaWJ1dGlvbiBkb2VzLiIsCiAgICAgICJ0eXBlIjogInN0cmluZyIKICAgIH0sCiAgICAiZXh0cmFzIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIG9wdGlvbmFsIHNldHMgb2YgZGVwZW5kZW5jaWVzIHRoYXQgbWF5IGJlIHVzZWQgdG8gZGVmaW5lIGNvbmRpdGlvbmFsIGRlcGVuZGVuY2llcyBpbiBcIm1heV9yZXF1aXJlXCIgYW5kIHNpbWlsYXIgZmllbGRzLiIsCiAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgIml0ZW1zIjogewogICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9leHRyYV9uYW1lIgogICAgICB9CiAgICB9LAogICAgIm1ldGFfcmVxdWlyZXMiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2Ygc3ViZGlzdHJpYnV0aW9ucyBtYWRlIGF2YWlsYWJsZSB0aHJvdWdoIHRoaXMgbWV0YWRpc3RyaWJ1dGlvbi4iLAogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZGVwZW5kZW5jaWVzIgogICAgfSwKICAgICJydW5fcmVxdWlyZXMiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2Ygb3RoZXIgZGlzdHJpYnV0aW9ucyBuZWVkZWQgdG8gcnVuIHRoaXMgZGlzdHJpYnV0aW9uLiIsCiAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9kZXBlbmRlbmNpZXMiCiAgICB9LAogICAgInRlc3RfcmVxdWlyZXMiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2Ygb3RoZXIgZGlzdHJpYnV0aW9ucyBuZWVkZWQgd2hlbiB0aGlzIGRpc3RyaWJ1dGlvbiBpcyB0ZXN0ZWQuIiwKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2RlcGVuZGVuY2llcyIKICAgIH0sCiAgICAiYnVpbGRfcmVxdWlyZXMiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2Ygb3RoZXIgZGlzdHJpYnV0aW9ucyBuZWVkZWQgd2hlbiB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBidWlsdC4iLAogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZGVwZW5kZW5jaWVzIgogICAgfSwKICAgICJkZXZfcmVxdWlyZXMiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2Ygb3RoZXIgZGlzdHJpYnV0aW9ucyBuZWVkZWQgd2hlbiB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBkZXZlbG9wZWQuIiwKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2RlcGVuZGVuY2llcyIKICAgIH0sCiAgICAicHJvdmlkZXMiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2Ygc3RyaW5ncyBuYW1pbmcgYWRkaXRpb25hbCBkZXBlbmRlbmN5IHJlcXVpcmVtZW50cyB0aGF0IGFyZSBzYXRpc2ZpZWQgYnkgaW5zdGFsbGluZyB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlc2Ugc3RyaW5ncyBtdXN0IGJlIG9mIHRoZSBmb3JtIE5hbWUgb3IgTmFtZSAoVmVyc2lvbikiLAogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICJpdGVtcyI6IHsKICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcHJvdmlkZXNfZGVjbGFyYXRpb24iCiAgICAgIH0KICAgIH0sCiAgICAibW9kdWxlcyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBtb2R1bGVzIGFuZC9vciBwYWNrYWdlcyBhdmFpbGFibGUgZm9yIGltcG9ydCBhZnRlciBpbnN0YWxsaW5nIHRoaXMgZGlzdHJpYnV0aW9uLiIsCiAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgIml0ZW1zIjogewogICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9xdWFsaWZpZWRfbmFtZSIKICAgICAgfQogICAgfSwKICAgICJuYW1lc3BhY2VzIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIG5hbWVzcGFjZSBwYWNrYWdlcyB0aGlzIGRpc3RyaWJ1dGlvbiBjb250cmlidXRlcyB0byIsCiAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgIml0ZW1zIjogewogICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9xdWFsaWZpZWRfbmFtZSIKICAgICAgfQogICAgfSwKICAgICJvYnNvbGV0ZWRfYnkiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHN0cmluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoaXMgcHJvamVjdCBpcyBubyBsb25nZXIgYmVpbmcgZGV2ZWxvcGVkLiBUaGUgbmFtZWQgcHJvamVjdCBwcm92aWRlcyBhIHN1YnN0aXR1dGUgb3IgcmVwbGFjZW1lbnQuIiwKICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9yZXF1aXJlbWVudCIKICAgIH0sCiAgICAic3VwcG9ydHNfZW52aXJvbm1lbnRzIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIHN0cmluZ3Mgc3BlY2lmeWluZyB0aGUgZW52aXJvbm1lbnRzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBleHBsaWNpdGx5IHN1cHBvcnRzLiIsCiAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgIml0ZW1zIjogewogICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9lbnZpcm9ubWVudF9tYXJrZXIiCiAgICAgIH0KICAgIH0sCiAgICAiaW5zdGFsbF9ob29rcyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBpbnN0YWxsX2hvb2tzIGZpZWxkIGlzIHVzZWQgdG8gZGVmaW5lIHZhcmlvdXMgb3BlcmF0aW9ucyB0aGF0IG1heSBiZSBpbnZva2VkIG9uIGEgZGlzdHJpYnV0aW9uIGluIGEgcGxhdGZvcm0gaW5kZXBlbmRlbnQgbWFubmVyLiIsCiAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICJwb3N0aW5zdGFsbCI6IHsKICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2V4cG9ydF9zcGVjaWZpZXIiCiAgICAgICAgfSwKICAgICAgICAicHJldW5pbnN0YWxsIjogewogICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXhwb3J0X3NwZWNpZmllciIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiZXh0ZW5zaW9ucyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkV4dGVuc2lvbnMgdG8gdGhlIG1ldGFkYXRhIG1heSBiZSBwcmVzZW50IGluIGEgbWFwcGluZyB1bmRlciB0aGUgJ2V4dGVuc2lvbnMnIGtleS4iLAogICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2V4dGVuc2lvbnMiCiAgICB9CiAgfSwKCiAgInJlcXVpcmVkIjogWyJtZXRhZGF0YV92ZXJzaW9uIiwgIm5hbWUiLCAidmVyc2lvbiIsICJzdW1tYXJ5Il0sCiAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UsCgogICJkZWZpbml0aW9ucyI6IHsKICAgICJjb250YWN0IjogewogICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICB9LAogICAgICAgICJlbWFpbCI6IHsKICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICB9LAogICAgICAgICJ1cmwiOiB7CiAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgfSwKICAgICAgICAicm9sZSI6IHsKICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJyZXF1aXJlZCI6IFsibmFtZSJdLAogICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZQogICAgfSwKICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgIml0ZW1zIjogewogICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9kZXBlbmRlbmN5IgogICAgICB9CiAgICB9LAogICAgImRlcGVuZGVuY3kiOiB7CiAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2V4dHJhX25hbWUiCiAgICAgICAgfSwKICAgICAgICAiZW52aXJvbm1lbnQiOiB7CiAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9lbnZpcm9ubWVudF9tYXJrZXIiCiAgICAgICAgfSwKICAgICAgICAicmVxdWlyZXMiOiB7CiAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcmVxdWlyZW1lbnQiCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAicmVxdWlyZWQiOiBbInJlcXVpcmVzIl0sCiAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlCiAgICB9LAogICAgImV4dGVuc2lvbnMiOiB7CiAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICJwYXR0ZXJuUHJvcGVydGllcyI6IHsKICAgICAgICAiXltBLVphLXpdWzAtOUEtWmEtel9dKihbLl1bMC05QS1aYS16X10qKSokIjoge30KICAgICAgfSwKICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgInB5dGhvbi5kZXRhaWxzIiA6IHsKICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgZGlzdHJpYnV0aW9uLiIsCiAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICJkb2N1bWVudF9uYW1lcyI6IHsKICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTmFtZXMgb2Ygc3VwcG9ydGluZyBtZXRhZGF0YSBkb2N1bWVudHMiLAogICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiB7CiAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZG9jdW1lbnRfbmFtZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2hhbmdlbG9nIjogewogICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2RvY3VtZW50X25hbWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImxpY2Vuc2UiOiB7CiAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZG9jdW1lbnRfbmFtZSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJrZXl3b3JkcyI6IHsKICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIGFkZGl0aW9uYWwga2V5d29yZHMgdG8gYmUgdXNlZCB0byBhc3Npc3Qgc2VhcmNoaW5nIGZvciB0aGUgZGlzdHJpYnV0aW9uIGluIGEgbGFyZ2VyIGNhdGFsb2cuIiwKICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImxpY2Vuc2UiOiB7CiAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgc3RyaW5nIGluZGljYXRpbmcgdGhlIGxpY2Vuc2UgY292ZXJpbmcgdGhlIGRpc3RyaWJ1dGlvbi4iLAogICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImNsYXNzaWZpZXJzIjogewogICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2Ygc3RyaW5ncywgd2l0aCBlYWNoIGdpdmluZyBhIHNpbmdsZSBjbGFzc2lmaWNhdGlvbiB2YWx1ZSBmb3IgdGhlIGRpc3RyaWJ1dGlvbi4iLAogICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicHl0aG9uLnByb2plY3QiIDogewogICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBjcmVhdGlvbiBhbmQgbWFpbnRlbmFuY2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4iLAogICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9wcm9qZWN0X29yX2ludGVncmF0b3IiCiAgICAgICAgfSwKICAgICAgICAicHl0aG9uLmludGVncmF0b3IiIDogewogICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBkb3duc3RyZWFtIHJlZGlzdHJpYnV0b3Igb2YgdGhlIGRpc3RyaWJ1dGlvbi4iLAogICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9wcm9qZWN0X29yX2ludGVncmF0b3IiCiAgICAgICAgfSwKICAgICAgICAicHl0aG9uLmNvbW1hbmRzIiA6IHsKICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJDb21tYW5kIGxpbmUgaW50ZXJmYWNlcyBwcm92aWRlZCBieSB0aGlzIGRpc3RyaWJ1dGlvbiIsCiAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9jb21tYW5kcyIKICAgICAgICB9LAogICAgICAgICJweXRob24uZXhwb3J0cyIgOiB7CiAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3RoZXIgZXhwb3J0ZWQgaW50ZXJmYWNlcyBwcm92aWRlZCBieSB0aGlzIGRpc3RyaWJ1dGlvbiIsCiAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9leHBvcnRzIgogICAgICAgIH0KICAgICAgfSwKICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UKICAgIH0sCiAgICAiY29tbWFuZHMiOiB7CiAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICJ3cmFwX2NvbnNvbGUiOiB7CiAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9jb21tYW5kX21hcCIKICAgICAgICB9LAogICAgICAgICJ3cmFwX2d1aSI6IHsKICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2NvbW1hbmRfbWFwIgogICAgICAgIH0sCiAgICAgICAgInByZWJ1aWx0IjogewogICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3JlbGF0aXZlX3BhdGgiCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZQogICAgfSwKICAgICJleHBvcnRzIjogewogICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAicGF0dGVyblByb3BlcnRpZXMiOiB7CiAgICAgICAgIl5bQS1aYS16XVswLTlBLVphLXpfXSooWy5dWzAtOUEtWmEtel9dKikqJCI6IHsKICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAicGF0dGVyblByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICIuIjogewogICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9leHBvcnRfc3BlY2lmaWVyIgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlCiAgICB9LAogICAgImNvbW1hbmRfbWFwIjogewogICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAicGF0dGVyblByb3BlcnRpZXMiOiB7CiAgICAgICAgIl5bMC05QS1aYS16XShbMC05QS1aYS16Xy4tXSpbMC05QS1aYS16XSk/JCI6IHsKICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2V4cG9ydF9zcGVjaWZpZXIiCiAgICAgICAgfQogICAgICB9LAogICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZQogICAgfSwKICAgICJwcm9qZWN0X29yX2ludGVncmF0b3IiIDogewogICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAicHJvcGVydGllcyIgOiB7CiAgICAgICAgImNvbnRhY3RzIjogewogICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBjb250cmlidXRvciBlbnRyaWVzIGdpdmluZyB0aGUgcmVjb21tZW5kZWQgY29udGFjdCBwb2ludHMgZm9yIGdldHRpbmcgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvamVjdC4iLAogICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2NvbnRhY3QiCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiY29udHJpYnV0b3JzIjogewogICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBjb250cmlidXRvciBlbnRyaWVzIGZvciBvdGhlciBjb250cmlidXRvcnMgbm90IGFscmVhZHkgbGlzdGVkIGFzIGN1cnJlbnQgcHJvamVjdCBwb2ludHMgb2YgY29udGFjdC4iLAogICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2NvbnRhY3QiCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicHJvamVjdF91cmxzIjogewogICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgbWFwcGluZyBvZiBhcmJpdHJhcnkgdGV4dCBsYWJlbHMgdG8gYWRkaXRpb25hbCBVUkxzIHJlbGV2YW50IHRvIHRoZSBwcm9qZWN0LiIsCiAgICAgICAgICAidHlwZSI6ICJvYmplY3QiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgImRpc3RyaWJ1dGlvbl9uYW1lIjogewogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAicGF0dGVybiI6ICJeWzAtOUEtWmEtel0oWzAtOUEtWmEtel8uLV0qWzAtOUEtWmEtel0pPyQiCiAgICB9LAogICAgInJlcXVpcmVtZW50IjogewogICAgICAidHlwZSI6ICJzdHJpbmciCiAgICB9LAogICAgInByb3ZpZGVzX2RlY2xhcmF0aW9uIjogewogICAgICAidHlwZSI6ICJzdHJpbmciCiAgICB9LAogICAgImVudmlyb25tZW50X21hcmtlciI6IHsKICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgfSwKICAgICJkb2N1bWVudF9uYW1lIjogewogICAgICAidHlwZSI6ICJzdHJpbmciCiAgICB9LAogICAgImV4dHJhX25hbWUiIDogewogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAicGF0dGVybiI6ICJeWzAtOUEtWmEtel0oWzAtOUEtWmEtel8uLV0qWzAtOUEtWmEtel0pPyQiCiAgICB9LAogICAgInJlbGF0aXZlX3BhdGgiIDogewogICAgICAidHlwZSI6ICJzdHJpbmciCiAgICB9LAogICAgImV4cG9ydF9zcGVjaWZpZXIiOiB7CiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICJwYXR0ZXJuIjogIl4oW0EtWmEtel9dW0EtWmEtel8wLTldKihbLl1bQS1aYS16X11bQS1aYS16XzAtOV0qKSopKDpbQS1aYS16X11bQS1aYS16XzAtOV0qKFsuXVtBLVphLXpfXVtBLVphLXpfMC05XSopKik/KFxcW1swLTlBLVphLXpdKFswLTlBLVphLXpfLi1dKlswLTlBLVphLXpdKT9cXF0pPyQiCiAgICB9LAogICAgInF1YWxpZmllZF9uYW1lIiA6IHsKICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgInBhdHRlcm4iOiAiXltBLVphLXpfXVtBLVphLXpfMC05XSooWy5dW0EtWmEtel9dW0EtWmEtel8wLTldKikqJCIKICAgIH0sCiAgICAicHJlZml4ZWRfbmFtZSIgOiB7CiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICJwYXR0ZXJuIjogIl5bQS1aYS16X11bQS1aYS16XzAtOV0qKFsuXVtBLVphLXpfMC05XSopKiQiCiAgICB9CiAgfQp9ClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAANwAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3Qvc2ltcGxlLmRpc3QvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhANNNBKN/AQAAfwEAADQAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3NpbXBsZS5kaXN0L3NldHVwLnB5ZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cAoKdHJ5OgogICAgdW5pY29kZQogICAgZGVmIHU4KHMpOgogICAgICAgIHJldHVybiBzLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKS5lbmNvZGUoJ3V0Zi04JykKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiB1OChzKToKICAgICAgICByZXR1cm4gcy5lbmNvZGUoJ3V0Zi04JykKCnNldHVwKG5hbWU9J3NpbXBsZS5kaXN0JywKICAgICAgdmVyc2lvbj0nMC4xJywKICAgICAgZGVzY3JpcHRpb249dTgoJ0EgdGVzdGluZyBkaXN0cmlidXRpb24gXE57U05PV01BTn0nKSwKICAgICAgcGFja2FnZXM9WydzaW1wbGVkaXN0J10sCiAgICAgIGV4dHJhc19yZXF1aXJlPXsndm90aW5nJzogWydiZWFnbGV2b3RlJ119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Q09SRFBLBQYAAAAACQAJAGsCAADpEQAAAABQSwMEFAAAAAAAAAAhADgr7xFtGQAAbRkAAC0AAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfYmFzaWMucHkiIiIKQmFzaWMgd2hlZWwgdGVzdHMuCiIiIgoKaW1wb3J0IG9zCmltcG9ydCBwa2dfcmVzb3VyY2VzCmltcG9ydCBqc29uCmltcG9ydCBzeXMKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgcmVzb3VyY2VfZmlsZW5hbWUKCmltcG9ydCB3aGVlbC51dGlsCmltcG9ydCB3aGVlbC50b29sCgpmcm9tIHdoZWVsIGltcG9ydCBlZ2cyd2hlZWwKZnJvbSB3aGVlbC5pbnN0YWxsIGltcG9ydCBXaGVlbEZpbGUKZnJvbSB6aXBmaWxlIGltcG9ydCBaaXBGaWxlCmZyb20gc2h1dGlsIGltcG9ydCBybXRyZWUKCnRlc3RfZGlzdHJpYnV0aW9ucyA9ICgiY29tcGxleC1kaXN0IiwgInNpbXBsZS5kaXN0IiwgImhlYWRlcnMuZGlzdCIpCgpkZWYgdGVhcmRvd25fbW9kdWxlKCk6CiAgICAiIiJEZWxldGUgZWdncy93aGVlbHMgY3JlYXRlZCBieSB0ZXN0cy4iIiIKICAgIGJhc2UgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKCd3aGVlbC50ZXN0JywgJycpCiAgICBmb3IgZGlzdCBpbiB0ZXN0X2Rpc3RyaWJ1dGlvbnM6CiAgICAgICAgZm9yIHN1YmRpciBpbiAoJ2J1aWxkJywgJ2Rpc3QnKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcm10cmVlKG9zLnBhdGguam9pbihiYXNlLCBkaXN0LCBzdWJkaXIpKQogICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKCmRlZiBzZXR1cF9tb2R1bGUoKToKICAgIGJ1aWxkX3doZWVsKCkKICAgIGJ1aWxkX2VnZygpCgpkZWYgYnVpbGRfd2hlZWwoKToKICAgICIiIkJ1aWxkIHdoZWVscyBmcm9tIHRlc3QgZGlzdHJpYnV0aW9ucy4iIiIKICAgIGZvciBkaXN0IGluIHRlc3RfZGlzdHJpYnV0aW9uczoKICAgICAgICBwd2QgPSBvcy5wYXRoLmFic3BhdGgob3MuY3VyZGlyKQogICAgICAgIGRpc3RkaXIgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKCd3aGVlbC50ZXN0JywgZGlzdCkKICAgICAgICBvcy5jaGRpcihkaXN0ZGlyKQogICAgICAgIHRyeToKICAgICAgICAgICAgc3lzLmFyZ3YgPSBbJycsICdiZGlzdF93aGVlbCddCiAgICAgICAgICAgIGV4ZWMoY29tcGlsZShvcGVuKCdzZXR1cC5weScpLnJlYWQoKSwgJ3NldHVwLnB5JywgJ2V4ZWMnKSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBvcy5jaGRpcihwd2QpCgpkZWYgYnVpbGRfZWdnKCk6CiAgICAiIiJCdWlsZCBlZ2dzIGZyb20gdGVzdCBkaXN0cmlidXRpb25zLiIiIgogICAgZm9yIGRpc3QgaW4gdGVzdF9kaXN0cmlidXRpb25zOgogICAgICAgIHB3ZCA9IG9zLnBhdGguYWJzcGF0aChvcy5jdXJkaXIpCiAgICAgICAgZGlzdGRpciA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoJ3doZWVsLnRlc3QnLCBkaXN0KQogICAgICAgIG9zLmNoZGlyKGRpc3RkaXIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzeXMuYXJndiA9IFsnJywgJ2JkaXN0X2VnZyddCiAgICAgICAgICAgIGV4ZWMoY29tcGlsZShvcGVuKCdzZXR1cC5weScpLnJlYWQoKSwgJ3NldHVwLnB5JywgJ2V4ZWMnKSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBvcy5jaGRpcihwd2QpCgpkZWYgdGVzdF9maW5kYWJsZSgpOgogICAgIiIiTWFrZSBzdXJlIHBrZ19yZXNvdXJjZXMgY2FuIGZpbmQgdXMuIiIiCiAgICBhc3NlcnQgcGtnX3Jlc291cmNlcy53b3JraW5nX3NldC5ieV9rZXlbJ3doZWVsJ10udmVyc2lvbgoKZGVmIHRlc3RfZWdnX3JlKCk6CiAgICAiIiJNYWtlIHN1cmUgZWdnX2luZm9fcmUgbWF0Y2hlcy4iIiIKICAgIGVnZ19uYW1lc19wYXRoID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgnd2hlZWwnLCAnZWdnbmFtZXMudHh0JykKICAgIHdpdGggb3BlbihlZ2dfbmFtZXNfcGF0aCkgYXMgZWdnX25hbWVzOgogICAgICAgIGZvciBsaW5lIGluIGVnZ19uYW1lczoKICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICBpZiBub3QgbGluZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGFzc2VydCBlZ2cyd2hlZWwuZWdnX2luZm9fcmUubWF0Y2gobGluZSksIGxpbmUKCmRlZiB0ZXN0X2NvbXBhdGliaWxpdHlfdGFncygpOgogICAgIiIiVGVzdCBjb21wYXRpYmlsdHkgdGFncyBhcmUgd29ya2luZy4iIiIKICAgIHdmID0gV2hlZWxGaWxlKCJwYWNrYWdlLTEuMC4wLWNwMzIuY3AzMy1ub2FiaS1ub2FyY2gud2hsIikKICAgIGFzc2VydCAobGlzdCh3Zi5jb21wYXRpYmlsaXR5X3RhZ3MpID09CiAgICAgICAgICAgICAgICAgWygnY3AzMicsICdub2FiaScsICdub2FyY2gnKSwgKCdjcDMzJywgJ25vYWJpJywgJ25vYXJjaCcpXSkKICAgIGFzc2VydCAod2YuYXJpdHkgPT0gMikKCiAgICB3ZjIgPSBXaGVlbEZpbGUoInBhY2thZ2UtMS4wLjAtMXN0LWNwMzMtbm9hYmktbm9hcmNoLndobCIpCiAgICB3ZjJfaW5mbyA9IHdmMi5wYXJzZWRfZmlsZW5hbWUuZ3JvdXBkaWN0KCkKICAgIGFzc2VydCB3ZjJfaW5mb1snYnVpbGQnXSA9PSAnMXN0Jywgd2YyX2luZm8KCmRlZiB0ZXN0X2NvbnZlcnRfZWdnKCk6CiAgICBiYXNlID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgnd2hlZWwudGVzdCcsICcnKQogICAgZm9yIGRpc3QgaW4gdGVzdF9kaXN0cmlidXRpb25zOgogICAgICAgIGRpc3RkaXIgPSBvcy5wYXRoLmpvaW4oYmFzZSwgZGlzdCwgJ2Rpc3QnKQogICAgICAgIGVnZ3MgPSBbZSBmb3IgZSBpbiBvcy5saXN0ZGlyKGRpc3RkaXIpIGlmIGUuZW5kc3dpdGgoJy5lZ2cnKV0KICAgICAgICB3aGVlbC50b29sLmNvbnZlcnQoZWdncywgZGlzdGRpciwgdmVyYm9zZT1GYWxzZSkKCmRlZiB0ZXN0X3VucGFjaygpOgogICAgIiIiCiAgICBNYWtlIHN1cmUgJ3doZWVsIHVucGFjaycgd29ya3MuCiAgICBUaGlzIGFsc28gdmVyaWZpZXMgdGhlIGludGVncml0eSBvZiBvdXIgdGVzdGluZyB3aGVlbCBmaWxlcy4KICAgICIiIgogICAgZm9yIGRpc3QgaW4gdGVzdF9kaXN0cmlidXRpb25zOgogICAgICAgIGRpc3RkaXIgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKCd3aGVlbC50ZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZGlzdCwgJ2Rpc3QnKSkKICAgICAgICBmb3Igd2hlZWxmaWxlIGluICh3IGZvciB3IGluIG9zLmxpc3RkaXIoZGlzdGRpcikgaWYgdy5lbmRzd2l0aCgnLndobCcpKToKICAgICAgICAgICAgd2hlZWwudG9vbC51bnBhY2sob3MucGF0aC5qb2luKGRpc3RkaXIsIHdoZWVsZmlsZSksIGRpc3RkaXIpCgpkZWYgdGVzdF9ub19zY3JpcHRzKCk6CiAgICAiIiJNYWtlIHN1cmUgZW50cnkgcG9pbnQgc2NyaXB0cyBhcmUgbm90IGdlbmVyYXRlZC4iIiIKICAgIGRpc3QgPSAiY29tcGxleC1kaXN0IgogICAgYmFzZWRpciA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoJ3doZWVsLnRlc3QnLCBkaXN0KQogICAgZm9yIChkaXJuYW1lLCBzdWJkaXJzLCBmaWxlbmFtZXMpIGluIG9zLndhbGsoYmFzZWRpcik6CiAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoJy53aGwnKToKICAgICAgICAgICAgICAgIHdobCA9IFppcEZpbGUob3MucGF0aC5qb2luKGRpcm5hbWUsIGZpbGVuYW1lKSkKICAgICAgICAgICAgICAgIGZvciBlbnRyeSBpbiB3aGwuaW5mb2xpc3QoKToKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbm90ICcuZGF0YS9zY3JpcHRzLycgaW4gZW50cnkuZmlsZW5hbWUKCmRlZiB0ZXN0X3B5ZGlzdCgpOgogICAgIiIiTWFrZSBzdXJlIHB5ZGlzdC5qc29uIGV4aXN0cyBhbmQgdmFsaWRhdGVzIGFnYWluc3Qgb3VyIHNjaGVtYS4iIiIKICAgICMgWFhYIHRoaXMgdGVzdCBtYXkgbmVlZCBtYW51YWwgY2xlYW51cCBvZiBvbGRlciB3aGVlbHMKCiAgICBpbXBvcnQganNvbnNjaGVtYQoKICAgIGRlZiBvcGVuX2pzb24oZmlsZW5hbWUpOgogICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3JiJykgYXMganNvbl9maWxlOgogICAgICAgICAgICByZXR1cm4ganNvbi5sb2Fkcyhqc29uX2ZpbGUucmVhZCgpLmRlY29kZSgndXRmLTgnKSkKCiAgICBweW1ldGFfc2NoZW1hID0gb3Blbl9qc29uKHJlc291cmNlX2ZpbGVuYW1lKCd3aGVlbC50ZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5ZGlzdC1zY2hlbWEuanNvbicpKQogICAgdmFsaWQgPSAwCiAgICBmb3IgZGlzdCBpbiAoInNpbXBsZS5kaXN0IiwgImNvbXBsZXgtZGlzdCIpOgogICAgICAgIGJhc2VkaXIgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKCd3aGVlbC50ZXN0JywgZGlzdCkKICAgICAgICBmb3IgKGRpcm5hbWUsIHN1YmRpcnMsIGZpbGVuYW1lcykgaW4gb3Mud2FsayhiYXNlZGlyKToKICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcud2hsJyk6CiAgICAgICAgICAgICAgICAgICAgd2hsID0gWmlwRmlsZShvcy5wYXRoLmpvaW4oZGlybmFtZSwgZmlsZW5hbWUpKQogICAgICAgICAgICAgICAgICAgIGZvciBlbnRyeSBpbiB3aGwuaW5mb2xpc3QoKToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZW50cnkuZmlsZW5hbWUuZW5kc3dpdGgoJy9tZXRhZGF0YS5qc29uJyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBweW1ldGEgPSBqc29uLmxvYWRzKHdobC5yZWFkKGVudHJ5KS5kZWNvZGUoJ3V0Zi04JykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uc2NoZW1hLnZhbGlkYXRlKHB5bWV0YSwgcHltZXRhX3NjaGVtYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkICs9IDEKICAgIGFzc2VydCB2YWxpZCA+IDAsICJObyBtZXRhZGF0YS5qc29uIGZvdW5kIgoKZGVmIHRlc3RfdXRpbCgpOgogICAgIiIiVGVzdCBmdW5jdGlvbnMgaW4gdXRpbC5weS4iIiIKICAgIGZvciBpIGluIHJhbmdlKDEwKToKICAgICAgICBiZWZvcmUgPSBiJyonICogaQogICAgICAgIGVuY29kZWQgPSB3aGVlbC51dGlsLnVybHNhZmVfYjY0ZW5jb2RlKGJlZm9yZSkKICAgICAgICBhc3NlcnQgbm90IGVuY29kZWQuZW5kc3dpdGgoYic9JykKICAgICAgICBhZnRlciA9IHdoZWVsLnV0aWwudXJsc2FmZV9iNjRkZWNvZGUoZW5jb2RlZCkKICAgICAgICBhc3NlcnQgYmVmb3JlID09IGFmdGVyCgoKZGVmIHRlc3RfcGlja19iZXN0KCk6CiAgICAiIiJUZXN0IHRoZSB3aGVlbCByYW5raW5nIGFsZ29yaXRobS4iIiIKICAgIGRlZiBnZXRfdGFncyhyZXMpOgogICAgICAgIGluZm8gPSByZXNbLTFdLnBhcnNlZF9maWxlbmFtZS5ncm91cGRpY3QoKQogICAgICAgIHJldHVybiBpbmZvWydweXZlciddLCBpbmZvWydhYmknXSwgaW5mb1sncGxhdCddCgogICAgY2FuZF90YWdzID0gWygncHkyNycsICdub2FiaScsICdub2FyY2gnKSwgKCdweTI2JywgJ25vYWJpJywgJ25vYXJjaCcpLAogICAgICAgICAgICAgICAgICgnY3AyNycsICdub2FiaScsICdsaW51eF9pNjg2JyksCiAgICAgICAgICAgICAgICAgKCdjcDI2JywgJ25vYWJpJywgJ2xpbnV4X2k2ODYnKSwKICAgICAgICAgICAgICAgICAoJ2NwMjcnLCAnbm9hYmknLCAnbGludXhfeDg2XzY0JyksCiAgICAgICAgICAgICAgICAgKCdjcDI2JywgJ25vYWJpJywgJ2xpbnV4X3g4Nl82NCcpXQogICAgY2FuZF93aGVlbHMgPSBbV2hlZWxGaWxlKCd0ZXN0cGtnLTEuMC0lcy0lcy0lcy53aGwnICUgdCkKICAgICAgICAgICAgICAgICAgIGZvciB0IGluIGNhbmRfdGFnc10KCiAgICBzdXBwb3J0ZWQgPSBbKCdjcDI3JywgJ25vYWJpJywgJ2xpbnV4X2k2ODYnKSwgKCdweTI3JywgJ25vYWJpJywgJ25vYXJjaCcpXQogICAgc3VwcG9ydGVkMiA9IFsoJ2NwMjcnLCAnbm9hYmknLCAnbGludXhfaTY4NicpLCAoJ3B5MjcnLCAnbm9hYmknLCAnbm9hcmNoJyksCiAgICAgICAgICAgICAgICAgICgnY3AyNicsICdub2FiaScsICdsaW51eF9pNjg2JyksICgncHkyNicsICdub2FiaScsICdub2FyY2gnKV0KICAgIHN1cHBvcnRlZDMgPSBbKCdjcDI2JywgJ25vYWJpJywgJ2xpbnV4X2k2ODYnKSwgKCdweTI2JywgJ25vYWJpJywgJ25vYXJjaCcpLAogICAgICAgICAgICAgICAgICAoJ2NwMjcnLCAnbm9hYmknLCAnbGludXhfaTY4NicpLCAoJ3B5MjcnLCAnbm9hYmknLCAnbm9hcmNoJyldCgogICAgZm9yIHN1cHAgaW4gKHN1cHBvcnRlZCwgc3VwcG9ydGVkMiwgc3VwcG9ydGVkMyk6CiAgICAgICAgY29udGV4dCA9IGxhbWJkYTogbGlzdChzdXBwKQogICAgICAgIGZvciB3aGVlbCBpbiBjYW5kX3doZWVsczoKICAgICAgICAgICAgd2hlZWwuY29udGV4dCA9IGNvbnRleHQKICAgICAgICBiZXN0ID0gbWF4KGNhbmRfd2hlZWxzKQogICAgICAgIGFzc2VydCBsaXN0KGJlc3QudGFncylbMF0gPT0gc3VwcFswXQoKICAgICAgICAjIGFzc2VydF9lcXVhbCgKICAgICAgICAjICAgICBsaXN0KG1hcChnZXRfdGFncywgcGlja19iZXN0KGNhbmRfd2hlZWxzLCBzdXBwLCB0b3A9RmFsc2UpKSksIHN1cHApClBLAwQUAAAAAAAAACEAbQSyvkoHAABKBwAALwAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF9pbnN0YWxsLnB5IyBUZXN0IHdoZWVsLg0KIyBUaGUgZmlsZSBoYXMgdGhlIGZvbGxvd2luZyBjb250ZW50czoNCiMgICBoZWxsby5weWQNCiMgICBoZWxsby9oZWxsby5weQ0KIyAgIGhlbGxvL19faW5pdF9fLnB5DQojICAgdGVzdC0xLjAuZGF0YS9kYXRhL2hlbGxvLmRhdA0KIyAgIHRlc3QtMS4wLmRhdGEvaGVhZGVycy9oZWxsby5kYXQNCiMgICB0ZXN0LTEuMC5kYXRhL3NjcmlwdHMvaGVsbG8uc2gNCiMgICB0ZXN0LTEuMC5kaXN0LWluZm8vV0hFRUwNCiMgICB0ZXN0LTEuMC5kaXN0LWluZm8vTUVUQURBVEENCiMgICB0ZXN0LTEuMC5kaXN0LWluZm8vUkVDT1JEDQojIFRoZSByb290IGlzIFBMQVRMSUINCiMgU28sIHNvbWUgaW4gUExBVExJQiwgYW5kIG9uZSBpbiBlYWNoIG9mIERBVEEsIEhFQURFUlMgYW5kIFNDUklQVFMuDQoNCmltcG9ydCB3aGVlbC50b29sDQppbXBvcnQgd2hlZWwucGVwNDI1dGFncw0KZnJvbSB3aGVlbC5pbnN0YWxsIGltcG9ydCBXaGVlbEZpbGUNCmZyb20gdGVtcGZpbGUgaW1wb3J0IG1rZHRlbXANCmltcG9ydCBzaHV0aWwNCmltcG9ydCBvcw0KDQpUSElTRElSID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQ0KVEVTVFdIRUVMID0gb3MucGF0aC5qb2luKFRISVNESVIsICd0ZXN0LTEuMC1weTIucHkzLW5vbmUtd2luMzIud2hsJykNCg0KZGVmIGNoZWNrKCpwYXRoKToNCiAgICByZXR1cm4gb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKCpwYXRoKSkNCg0KZGVmIHRlc3RfaW5zdGFsbCgpOg0KICAgIHRlbXBkaXIgPSBta2R0ZW1wKCkNCiAgICBkZWYgZ2V0X3N1cHBvcnRlZCgpOg0KICAgICAgICByZXR1cm4gbGlzdCh3aGVlbC5wZXA0MjV0YWdzLmdldF9zdXBwb3J0ZWQoKSkgKyBbKCdweTMnLCAnbm9uZScsICd3aW4zMicpXQ0KICAgIHdobCA9IFdoZWVsRmlsZShURVNUV0hFRUwsIGNvbnRleHQ9Z2V0X3N1cHBvcnRlZCkNCiAgICBhc3NlcnQgd2hsLnN1cHBvcnRzX2N1cnJlbnRfcHl0aG9uKGdldF9zdXBwb3J0ZWQpDQogICAgdHJ5Og0KICAgICAgICBsb2NzID0ge30NCiAgICAgICAgZm9yIGtleSBpbiAoJ3B1cmVsaWInLCAncGxhdGxpYicsICdzY3JpcHRzJywgJ2hlYWRlcnMnLCAnZGF0YScpOg0KICAgICAgICAgICAgbG9jc1trZXldID0gb3MucGF0aC5qb2luKHRlbXBkaXIsIGtleSkNCiAgICAgICAgICAgIG9zLm1rZGlyKGxvY3Nba2V5XSkNCiAgICAgICAgd2hsLmluc3RhbGwob3ZlcnJpZGVzPWxvY3MpDQogICAgICAgIGFzc2VydCBsZW4ob3MubGlzdGRpcihsb2NzWydwdXJlbGliJ10pKSA9PSAwDQogICAgICAgIGFzc2VydCBjaGVjayhsb2NzWydwbGF0bGliJ10sICdoZWxsby5weWQnKQ0KICAgICAgICBhc3NlcnQgY2hlY2sobG9jc1sncGxhdGxpYiddLCAnaGVsbG8nLCAnaGVsbG8ucHknKQ0KICAgICAgICBhc3NlcnQgY2hlY2sobG9jc1sncGxhdGxpYiddLCAnaGVsbG8nLCAnX19pbml0X18ucHknKQ0KICAgICAgICBhc3NlcnQgY2hlY2sobG9jc1snZGF0YSddLCAnaGVsbG8uZGF0JykNCiAgICAgICAgYXNzZXJ0IGNoZWNrKGxvY3NbJ2hlYWRlcnMnXSwgJ2hlbGxvLmRhdCcpDQogICAgICAgIGFzc2VydCBjaGVjayhsb2NzWydzY3JpcHRzJ10sICdoZWxsby5zaCcpDQogICAgICAgIGFzc2VydCBjaGVjayhsb2NzWydwbGF0bGliJ10sICd0ZXN0LTEuMC5kaXN0LWluZm8nLCAnUkVDT1JEJykNCiAgICBmaW5hbGx5Og0KICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBkaXIpDQoNCmRlZiB0ZXN0X2luc3RhbGxfdG9vbCgpOg0KICAgICIiIlNsaWdodGx5IGltcHJvdmUgY292ZXJhZ2Ugb2Ygd2hlZWwuaW5zdGFsbCIiIg0KICAgIHdoZWVsLnRvb2wuaW5zdGFsbChbVEVTVFdIRUVMXSwgZm9yY2U9VHJ1ZSwgZHJ5X3J1bj1UcnVlKQ0KDQogICAgUEsDBBQAAAAAAAAAIQD3YR+TDwoAAA8KAAAsAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X2tleXMucHlpbXBvcnQgdGVtcGZpbGUKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHVuaXR0ZXN0CmltcG9ydCBqc29uCgpmcm9tIHdoZWVsLnNpZ25hdHVyZXMgaW1wb3J0IGtleXMKCndoZWVsX2pzb24gPSAiIiIKewogICJ2ZXJpZmllcnMiOiBbCiAgICB7CiAgICAgICJzY29wZSI6ICIrIiwgCiAgICAgICJ2ayI6ICJicC1iaksyZkZndEEtOERoS0tBQVBtOS1lQVpjWF91MDNvQnYyUmxLT0JjIgogICAgfSwgCiAgICB7CiAgICAgICJzY29wZSI6ICIrIiwgCiAgICAgICJ2ayI6ICJLQUhaQmZ5cUZXM09jRkRiTFNHNG5QQ2pYeFVQeTcycGhQOUk0Um45TUFvIgogICAgfSwKICAgIHsKICAgICAgInNjb3BlIjogIisiLCAKICAgICAgInZrIjogInRtQVlDclNmajhndEoxMHYzVmt2VzdqT25kS21RSVlFMTJoZ25GdTNjdmsiCiAgICB9IAogIF0sIAogICJzaWduZXJzIjogWwogICAgewogICAgICAic2NvcGUiOiAiKyIsIAogICAgICAidmsiOiAidG1BWUNyU2ZqOGd0SjEwdjNWa3ZXN2pPbmRLbVFJWUUxMmhnbkZ1M2N2ayIKICAgIH0sIAogICAgewogICAgICAic2NvcGUiOiAiKyIsIAogICAgICAidmsiOiAiS0FIWkJmeXFGVzNPY0ZEYkxTRzRuUENqWHhVUHk3MnBoUDlJNFJuOU1BbyIKICAgIH0KICBdLCAKICAic2NoZW1hIjogMQp9CiIiIgoKY2xhc3MgVGVzdFdoZWVsS2V5cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi5jb25maWcgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoc3VmZml4PScuanNvbicpCiAgICAgICAgc2VsZi5jb25maWcuY2xvc2UoKQogICAgICAgIAogICAgICAgIHNlbGYuY29uZmlnX3BhdGgsIHNlbGYuY29uZmlnX2ZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChzZWxmLmNvbmZpZy5uYW1lKSAKICAgICAgICBkZWYgbG9hZCgqYXJncyk6CiAgICAgICAgICAgIHJldHVybiBbc2VsZi5jb25maWdfcGF0aF0KICAgICAgICBkZWYgc2F2ZSgqYXJncyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbmZpZ19wYXRoCiAgICAgICAga2V5cy5sb2FkX2NvbmZpZ19wYXRocyA9IGxvYWQKICAgICAgICBrZXlzLnNhdmVfY29uZmlnX3BhdGggPSBzYXZlCiAgICAgICAgc2VsZi53ayA9IGtleXMuV2hlZWxLZXlzKCkKICAgICAgICBzZWxmLndrLkNPTkZJR19OQU1FID0gc2VsZi5jb25maWdfZmlsZW5hbWUKICAgICAgICAKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBvcy51bmxpbmsoc2VsZi5jb25maWcubmFtZSkKICAgICAgICAKICAgIGRlZiB0ZXN0X2xvYWRfc2F2ZShzZWxmKToKICAgICAgICBzZWxmLndrLmRhdGEgPSBqc29uLmxvYWRzKHdoZWVsX2pzb24pCiAgICAgICAgCiAgICAgICAgc2VsZi53ay5hZGRfc2lnbmVyKCcrJywgJzY3ODkwJykKICAgICAgICBzZWxmLndrLmFkZF9zaWduZXIoJ3Njb3BlJywgJ2FiY2RlZmcnKQogICAgICAgIAogICAgICAgIHNlbGYud2sudHJ1c3QoJ2Vwb2NzJywgJ2dmZWRjYmEnKQogICAgICAgIHNlbGYud2sudHJ1c3QoJysnLCAnMTIzNDUnKQogICAgICAgIAogICAgICAgIHNlbGYud2suc2F2ZSgpCiAgICAgICAgCiAgICAgICAgZGVsIHNlbGYud2suZGF0YQogICAgICAgIHNlbGYud2subG9hZCgpCiAgICAgICAgCiAgICAgICAgc2lnbmVycyA9IHNlbGYud2suc2lnbmVycygnc2NvcGUnKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzaWduZXJzWzBdID09ICgnc2NvcGUnLCAnYWJjZGVmZycpLCBzZWxmLndrLmRhdGFbJ3NpZ25lcnMnXSkKICAgICAgICBzZWxmLmFzc2VydFRydWUoc2lnbmVyc1sxXVswXSA9PSAnKycsIHNlbGYud2suZGF0YVsnc2lnbmVycyddKQogICAgICAgIAogICAgICAgIHRydXN0ZWQgPSBzZWxmLndrLnRydXN0ZWQoJ2Vwb2NzJykKICAgICAgICBzZWxmLmFzc2VydFRydWUodHJ1c3RlZFswXSA9PSAoJ2Vwb2NzJywgJ2dmZWRjYmEnKSkKICAgICAgICBzZWxmLmFzc2VydFRydWUodHJ1c3RlZFsxXVswXSA9PSAnKycpCiAgICAgICAgCiAgICAgICAgc2VsZi53ay51bnRydXN0KCdlcG9jcycsICdnZmVkY2JhJykKICAgICAgICB0cnVzdGVkID0gc2VsZi53ay50cnVzdGVkKCdlcG9jcycpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnZXBvY3MnLCAnZ2ZlZGNiYScpIG5vdCBpbiB0cnVzdGVkKQogICAgICAgIAogICAgZGVmIHRlc3RfbG9hZF9zYXZlX2luY29tcGxldGUoc2VsZik6CiAgICAgICAgc2VsZi53ay5kYXRhID0ganNvbi5sb2Fkcyh3aGVlbF9qc29uKQogICAgICAgIGRlbCBzZWxmLndrLmRhdGFbJ3NpZ25lcnMnXQogICAgICAgIHNlbGYud2suZGF0YVsnc2NoZW1hJ10gPSBzZWxmLndrLlNDSEVNQSsxCiAgICAgICAgc2VsZi53ay5zYXZlKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYud2subG9hZCgpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkV4cGVjdGVkIFZhbHVlRXJyb3IiKQogICAgICAgIAogICAgICAgIGRlbCBzZWxmLndrLmRhdGFbJ3NjaGVtYSddCiAgICAgICAgc2VsZi53ay5zYXZlKCkKICAgICAgICBzZWxmLndrLmxvYWQoKQogICAgCiAgICAKUEsDBBQAAAAAAAAAIQBiWHRjrAAAAKwAAAAtAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X3BhdGhzLnB5aW1wb3J0IHdoZWVsLnBhdGhzCmZyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbCBpbXBvcnQgU0NIRU1FX0tFWVMKCmRlZiB0ZXN0X3BhdGgoKToKICAgIGQgPSB3aGVlbC5wYXRocy5nZXRfaW5zdGFsbF9wYXRocygnd2hlZWwnKQogICAgYXNzZXJ0IGxlbihkKSA9PSBsZW4oU0NIRU1FX0tFWVMpClBLAwQUAAAAAAAAACEAbZYx+dgFAADYBQAALwAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF9yYW5raW5nLnB5aW1wb3J0IHVuaXR0ZXN0Cgpmcm9tIHdoZWVsLnBlcDQyNXRhZ3MgaW1wb3J0IGdldF9zdXBwb3J0ZWQKZnJvbSB3aGVlbC5pbnN0YWxsIGltcG9ydCBXaGVlbEZpbGUKCldIRUVMUEFUID0gIiUobmFtZSlzLSUodmVyKXMtJShweXZlcilzLSUoYWJpKXMtJShhcmNoKXMud2hsIgpkZWYgbWFrZV93aGVlbChuYW1lLCB2ZXIsIHB5dmVyLCBhYmksIGFyY2gpOgogICAgbmFtZSA9IFdIRUVMUEFUICUgZGljdChuYW1lPW5hbWUsIHZlcj12ZXIsIHB5dmVyPXB5dmVyLCBhYmk9YWJpLAogICAgICAgICAgICBhcmNoPWFyY2gpCiAgICByZXR1cm4gV2hlZWxGaWxlKG5hbWUpCgojIFRoaXMgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgZ2VuZXJhdGVfc3VwcG9ydGVkIHdpbGwgYWx3YXlzIHJldHVybiB0aGUKIyBleGFjdCBweXZlciwgYWJpLCBhbmQgYXJjaGl0ZWN0dXJlIGZvciBpdHMgZmlyc3QgKGJlc3QpIG1hdGNoLgpzdXAgPSBnZXRfc3VwcG9ydGVkKCkKcHl2ZXIsIGFiaSwgYXJjaCA9IHN1cFswXQpnZW52ZXIgPSAncHknICsgcHl2ZXJbMjpdCm1hanZlciA9IGdlbnZlcls6M10KCkNPTUJJTkFUSU9OUyA9ICgKICAgICgnYmFyJywgJzAuOScsICdweTIucHkzJywgJ25vbmUnLCAnYW55JyksCiAgICAoJ2JhcicsICcwLjknLCBtYWp2ZXIsICdub25lJywgJ2FueScpLAogICAgKCdiYXInLCAnMC45JywgZ2VudmVyLCAnbm9uZScsICdhbnknKSwKICAgICgnYmFyJywgJzAuOScsIHB5dmVyLCBhYmksIGFyY2gpLAogICAgKCdiYXInLCAnMS4zLjInLCBtYWp2ZXIsICdub25lJywgJ2FueScpLAogICAgKCdiYXInLCAnMy4xJywgZ2VudmVyLCAnbm9uZScsICdhbnknKSwKICAgICgnYmFyJywgJzMuMScsIHB5dmVyLCBhYmksIGFyY2gpLAogICAgKCdmb28nLCAnMS4wJywgbWFqdmVyLCAnbm9uZScsICdhbnknKSwKICAgICgnZm9vJywgJzEuMScsIHB5dmVyLCBhYmksIGFyY2gpLAogICAgKCdmb28nLCAnMi4xJywgbWFqdmVyICsgJzAnLCAnbm9uZScsICdhbnknKSwKICAgICMgVGhpcyB3aWxsIG5vdCBiZSBjb21wYXRpYmxlIGZvciBQeXRob24geC4wLiBCZXdhcmUgd2hlbiB3ZSBoaXQgUHl0aG9uCiAgICAjIDQuMCwgYW5kIGRvbid0IHRlc3Qgd2l0aCAzLjAhISEKICAgICgnZm9vJywgJzIuMScsIG1hanZlciArICcxJywgJ25vbmUnLCAnYW55JyksCiAgICAoJ2ZvbycsICcyLjEnLCBweXZlciAsICdub25lJywgJ2FueScpLAogICAgKCdmb28nLCAnMi4xJywgcHl2ZXIgLCBhYmksIGFyY2gpLAopCgpXSEVFTFMgPSBbIG1ha2Vfd2hlZWwoKmFyZ3MpIGZvciBhcmdzIGluIENPTUJJTkFUSU9OUyBdCgpjbGFzcyBUZXN0UmFua2luZyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgdGVzdF9jb21wYXJpc29uKHNlbGYpOgogICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihXSEVFTFMpLTEpOgogICAgICAgICAgICBmb3IgaiBpbiByYW5nZShpKToKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShXSEVFTFNbal08V0hFRUxTW2ldKQpQSwMEFAAAAAAAAAAhAKQpfzFgBAAAYAQAADIAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3Rfc2lnbmF0dXJlcy5weWZyb20gd2hlZWwgaW1wb3J0IHNpZ25hdHVyZXMKZnJvbSB3aGVlbC5zaWduYXR1cmVzIGltcG9ydCBkamJlYywgZWQyNTUxOXB5CmZyb20gd2hlZWwudXRpbCBpbXBvcnQgYmluYXJ5CgpkZWYgdGVzdF9nZXRsaWIoKToKICAgIHNpZ25hdHVyZXMuZ2V0X2VkMjU1MTlsbCgpCgpkZWYgdGVzdF9kamJlYygpOgogICAgZGpiZWMuZHNhX3Rlc3QoKSAgICAKICAgIGRqYmVjLmRoX3Rlc3QoKQogICAgCmRlZiB0ZXN0X2VkMjU1MTlweSgpOgogICAga3AwID0gZWQyNTUxOXB5LmNyeXB0b19zaWduX2tleXBhaXIoYmluYXJ5KCcgJyozMikpCiAgICBrcCA9IGVkMjU1MTlweS5jcnlwdG9fc2lnbl9rZXlwYWlyKCkKICAgICAgICAKICAgIHNpZ25lZCA9IGVkMjU1MTlweS5jcnlwdG9fc2lnbihiaW5hcnkoJ3Rlc3QnKSwga3Auc2spCiAgICAKICAgIGVkMjU1MTlweS5jcnlwdG9fc2lnbl9vcGVuKHNpZ25lZCwga3AudmspCiAgICAKICAgIHRyeToKICAgICAgICBlZDI1NTE5cHkuY3J5cHRvX3NpZ25fb3BlbihzaWduZWQsIGtwMC52aykKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJFeHBlY3RlZCBWYWx1ZUVycm9yIikKICAgIAogICAgdHJ5OgogICAgICAgIGVkMjU1MTlweS5jcnlwdG9fc2lnbl9rZXlwYWlyKGJpbmFyeSgnICcqMzMpKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICByYWlzZSBFeGNlcHRpb24oIkV4cGVjdGVkIFZhbHVlRXJyb3IiKQogICAgCiAgICB0cnk6CiAgICAgICAgZWQyNTUxOXB5LmNyeXB0b19zaWduKGJpbmFyeSgnJyksIGJpbmFyeSgnICcpKjMxKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICByYWlzZSBFeGNlcHRpb24oIkV4cGVjdGVkIFZhbHVlRXJyb3IiKQogICAgCiAgICB0cnk6CiAgICAgICAgZWQyNTUxOXB5LmNyeXB0b19zaWduX29wZW4oYmluYXJ5KCcnKSwgYmluYXJ5KCcgJykqMzEpCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRXhwZWN0ZWQgVmFsdWVFcnJvciIpCiAgICBQSwMEFAAAAAAAAAAhAJxXQvAnFwAAJxcAAC4AAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfdGFnb3B0LnB5IiIiClRlc3RzIGZvciB0aGUgYmRpc3Rfd2hlZWwgdGFnIG9wdGlvbnMgKC0tcHl0aG9uLXRhZywgLS11bml2ZXJzYWwsIGFuZAotLXBsYXQtbmFtZSkKIiIiCgppbXBvcnQgc3lzCmltcG9ydCBzaHV0aWwKaW1wb3J0IHB5dGVzdAppbXBvcnQgcHkucGF0aAppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHN1YnByb2Nlc3MKClNFVFVQX1BZID0gIiIiXApmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24KCnNldHVwKAogICAgbmFtZT0iVGVzdCIsCiAgICB2ZXJzaW9uPSIxLjAiLAogICAgYXV0aG9yX2VtYWlsPSJhdXRob3JAZXhhbXBsZS5jb20iLAogICAgcHlfbW9kdWxlcz1bInRlc3QiXSwKICAgIHtleHRfbW9kdWxlc30KKQoiIiIKCkVYVF9NT0RVTEVTID0gImV4dF9tb2R1bGVzPVtFeHRlbnNpb24oJ190ZXN0Jywgc291cmNlcz1bJ3Rlc3QuYyddKV0sIgoKQHB5dGVzdC5maXh0dXJlCmRlZiB0ZW1wX3BrZyhyZXF1ZXN0LCBleHQ9RmFsc2UpOgogICAgdGVtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgZGVmIGZpbigpOgogICAgICAgIHNodXRpbC5ybXRyZWUodGVtcGRpcikKICAgIHJlcXVlc3QuYWRkZmluYWxpemVyKGZpbikKICAgIHRlbXBwYXRoID0gcHkucGF0aC5sb2NhbCh0ZW1wZGlyKQogICAgdGVtcHBhdGguam9pbigndGVzdC5weScpLndyaXRlKCdwcmludCgiSGVsbG8sIHdvcmxkIiknKQogICAgaWYgZXh0OgogICAgICAgIHRlbXBwYXRoLmpvaW4oJ3Rlc3QuYycpLndyaXRlKCcjaW5jbHVkZSA8c3RkaW8uaD4nKQogICAgICAgIHNldHVwX3B5ID0gU0VUVVBfUFkuZm9ybWF0KGV4dF9tb2R1bGVzPUVYVF9NT0RVTEVTKQogICAgZWxzZToKICAgICAgICBzZXR1cF9weSA9IFNFVFVQX1BZLmZvcm1hdChleHRfbW9kdWxlcz0nJykKICAgIHRlbXBwYXRoLmpvaW4oJ3NldHVwLnB5Jykud3JpdGUoc2V0dXBfcHkpCiAgICByZXR1cm4gdGVtcHBhdGgKCkBweXRlc3QuZml4dHVyZQpkZWYgdGVtcF9leHRfcGtnKHJlcXVlc3QpOgogICAgcmV0dXJuIHRlbXBfcGtnKHJlcXVlc3QsIGV4dD1UcnVlKQoKZGVmIHRlc3RfZGVmYXVsdF90YWcodGVtcF9wa2cpOgogICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJ10sCiAgICAgICAgICAgIGN3ZD1zdHIodGVtcF9wa2cpKQogICAgZGlzdF9kaXIgPSB0ZW1wX3BrZy5qb2luKCdkaXN0JykKICAgIGFzc2VydCBkaXN0X2Rpci5jaGVjayhkaXI9MSkKICAgIHdoZWVscyA9IGRpc3RfZGlyLmxpc3RkaXIoKQogICAgYXNzZXJ0IGxlbih3aGVlbHMpID09IDEKICAgIGFzc2VydCB3aGVlbHNbMF0uYmFzZW5hbWUgPT0gJ1Rlc3QtMS4wLXB5JXMtbm9uZS1hbnkud2hsJyAlIChzeXMudmVyc2lvblswXSwpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKCmRlZiB0ZXN0X2V4cGxpY2l0X3RhZyh0ZW1wX3BrZyk6CiAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnc2V0dXAucHknLCAnYmRpc3Rfd2hlZWwnLCAnLS1weXRob24tdGFnPXB5MzInXSwKICAgICAgICBjd2Q9c3RyKHRlbXBfcGtnKSkKICAgIGRpc3RfZGlyID0gdGVtcF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lLnN0YXJ0c3dpdGgoJ1Rlc3QtMS4wLXB5MzItJykKICAgIGFzc2VydCB3aGVlbHNbMF0uZXh0ID09ICcud2hsJwoKZGVmIHRlc3RfdW5pdmVyc2FsX3RhZyh0ZW1wX3BrZyk6CiAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnc2V0dXAucHknLCAnYmRpc3Rfd2hlZWwnLCAnLS11bml2ZXJzYWwnXSwKICAgICAgICBjd2Q9c3RyKHRlbXBfcGtnKSkKICAgIGRpc3RfZGlyID0gdGVtcF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lLnN0YXJ0c3dpdGgoJ1Rlc3QtMS4wLXB5Mi5weTMtJykKICAgIGFzc2VydCB3aGVlbHNbMF0uZXh0ID09ICcud2hsJwoKZGVmIHRlc3RfdW5pdmVyc2FsX2JlYXRzX2V4cGxpY2l0X3RhZyh0ZW1wX3BrZyk6CiAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnc2V0dXAucHknLCAnYmRpc3Rfd2hlZWwnLCAnLS11bml2ZXJzYWwnLCAnLS1weXRob24tdGFnPXB5MzInXSwKICAgICAgICBjd2Q9c3RyKHRlbXBfcGtnKSkKICAgIGRpc3RfZGlyID0gdGVtcF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lLnN0YXJ0c3dpdGgoJ1Rlc3QtMS4wLXB5Mi5weTMtJykKICAgIGFzc2VydCB3aGVlbHNbMF0uZXh0ID09ICcud2hsJwoKZGVmIHRlc3RfdW5pdmVyc2FsX2luX3NldHVwX2NmZyh0ZW1wX3BrZyk6CiAgICB0ZW1wX3BrZy5qb2luKCdzZXR1cC5jZmcnKS53cml0ZSgnW2JkaXN0X3doZWVsXVxudW5pdmVyc2FsPTEnKQogICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJ10sCiAgICAgICAgY3dkPXN0cih0ZW1wX3BrZykpCiAgICBkaXN0X2RpciA9IHRlbXBfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZS5zdGFydHN3aXRoKCdUZXN0LTEuMC1weTIucHkzLScpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKCmRlZiB0ZXN0X3B5dGhvbnRhZ19pbl9zZXR1cF9jZmcodGVtcF9wa2cpOgogICAgdGVtcF9wa2cuam9pbignc2V0dXAuY2ZnJykud3JpdGUoJ1tiZGlzdF93aGVlbF1cbnB5dGhvbl90YWc9cHkzMicpCiAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnc2V0dXAucHknLCAnYmRpc3Rfd2hlZWwnXSwKICAgICAgICBjd2Q9c3RyKHRlbXBfcGtnKSkKICAgIGRpc3RfZGlyID0gdGVtcF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lLnN0YXJ0c3dpdGgoJ1Rlc3QtMS4wLXB5MzItJykKICAgIGFzc2VydCB3aGVlbHNbMF0uZXh0ID09ICcud2hsJwoKZGVmIHRlc3RfbGVnYWN5X3doZWVsX3NlY3Rpb25faW5fc2V0dXBfY2ZnKHRlbXBfcGtnKToKICAgIHRlbXBfcGtnLmpvaW4oJ3NldHVwLmNmZycpLndyaXRlKCdbd2hlZWxdXG51bml2ZXJzYWw9MScpCiAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnc2V0dXAucHknLCAnYmRpc3Rfd2hlZWwnXSwKICAgICAgICBjd2Q9c3RyKHRlbXBfcGtnKSkKICAgIGRpc3RfZGlyID0gdGVtcF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lLnN0YXJ0c3dpdGgoJ1Rlc3QtMS4wLXB5Mi5weTMtJykKICAgIGFzc2VydCB3aGVlbHNbMF0uZXh0ID09ICcud2hsJwoKZGVmIHRlc3RfcGxhdF9uYW1lX3B1cmVweSh0ZW1wX3BrZyk6CiAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnc2V0dXAucHknLCAnYmRpc3Rfd2hlZWwnLCAnLS1wbGF0LW5hbWU9dGVzdHBsYXQucHVyZSddLAogICAgICAgIGN3ZD1zdHIodGVtcF9wa2cpKQogICAgZGlzdF9kaXIgPSB0ZW1wX3BrZy5qb2luKCdkaXN0JykKICAgIGFzc2VydCBkaXN0X2Rpci5jaGVjayhkaXI9MSkKICAgIHdoZWVscyA9IGRpc3RfZGlyLmxpc3RkaXIoKQogICAgYXNzZXJ0IGxlbih3aGVlbHMpID09IDEKICAgIGFzc2VydCB3aGVlbHNbMF0uYmFzZW5hbWUuZW5kc3dpdGgoJy10ZXN0cGxhdF9wdXJlLndobCcpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKCmRlZiB0ZXN0X3BsYXRfbmFtZV9leHQodGVtcF9leHRfcGtnKToKICAgIHRyeToKICAgICAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJywgJy0tcGxhdC1uYW1lPXRlc3RwbGF0LmFyY2gnXSwKICAgICAgICAgICAgY3dkPXN0cih0ZW1wX2V4dF9wa2cpKQogICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yOgogICAgICAgIHB5dGVzdC5za2lwKCJDYW5ub3QgY29tcGlsZSBDIEV4dGVuc2lvbnMiKQogICAgZGlzdF9kaXIgPSB0ZW1wX2V4dF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lLmVuZHN3aXRoKCctdGVzdHBsYXRfYXJjaC53aGwnKQogICAgYXNzZXJ0IHdoZWVsc1swXS5leHQgPT0gJy53aGwnCgpkZWYgdGVzdF9wbGF0X25hbWVfcHVyZXB5X2luX3NldHVwY2ZnKHRlbXBfcGtnKToKICAgIHRlbXBfcGtnLmpvaW4oJ3NldHVwLmNmZycpLndyaXRlKCdbYmRpc3Rfd2hlZWxdXG5wbGF0X25hbWU9dGVzdHBsYXQucHVyZScpCiAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnc2V0dXAucHknLCAnYmRpc3Rfd2hlZWwnXSwKICAgICAgICBjd2Q9c3RyKHRlbXBfcGtnKSkKICAgIGRpc3RfZGlyID0gdGVtcF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lLmVuZHN3aXRoKCctdGVzdHBsYXRfcHVyZS53aGwnKQogICAgYXNzZXJ0IHdoZWVsc1swXS5leHQgPT0gJy53aGwnCgpkZWYgdGVzdF9wbGF0X25hbWVfZXh0X2luX3NldHVwY2ZnKHRlbXBfZXh0X3BrZyk6CiAgICB0ZW1wX2V4dF9wa2cuam9pbignc2V0dXAuY2ZnJykud3JpdGUoJ1tiZGlzdF93aGVlbF1cbnBsYXRfbmFtZT10ZXN0cGxhdC5hcmNoJykKICAgIHRyeToKICAgICAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJ10sCiAgICAgICAgICAgIGN3ZD1zdHIodGVtcF9leHRfcGtnKSkKICAgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcjoKICAgICAgICBweXRlc3Quc2tpcCgiQ2Fubm90IGNvbXBpbGUgQyBFeHRlbnNpb25zIikKICAgIGRpc3RfZGlyID0gdGVtcF9leHRfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZS5lbmRzd2l0aCgnLXRlc3RwbGF0X2FyY2gud2hsJykKICAgIGFzc2VydCB3aGVlbHNbMF0uZXh0ID09ICcud2hsJwpQSwMEFAAAAAAAAAAhANQ+H1aQAgAAkAIAACwAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfdG9vbC5weWZyb20gLi4gaW1wb3J0IHRvb2wKCmRlZiB0ZXN0X2tleWdlbigpOgogICAgZGVmIGdldF9rZXlyaW5nKCk6CiAgICAgICAgV2hlZWxLZXlzLCBrZXlyaW5nID0gdG9vbC5nZXRfa2V5cmluZygpCgogICAgICAgIGNsYXNzIFdoZWVsS2V5c1Rlc3QoV2hlZWxLZXlzKToKICAgICAgICAgICAgZGVmIHNhdmUoc2VsZik6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgIGNsYXNzIGtleXJpbmdUZXN0OgogICAgICAgICAgICBAY2xhc3NtZXRob2QKICAgICAgICAgICAgZGVmIGdldF9rZXlyaW5nKGNscyk6CiAgICAgICAgICAgICAgICBjbGFzcyBrZXlyaW5nVGVzdDI6CiAgICAgICAgICAgICAgICAgICAgcHcgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgZGVmIHNldF9wYXNzd29yZChzZWxmLCBhLCBiLCBjKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wdyA9IGMKICAgICAgICAgICAgICAgICAgICBkZWYgZ2V0X3Bhc3N3b3JkKHNlbGYsIGEsIGIpOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wdwoKICAgICAgICAgICAgICAgIHJldHVybiBrZXlyaW5nVGVzdDIoKQoKICAgICAgICByZXR1cm4gV2hlZWxLZXlzVGVzdCwga2V5cmluZ1Rlc3QKCiAgICB0b29sLmtleWdlbihnZXRfa2V5cmluZz1nZXRfa2V5cmluZykKUEsDBBQAAAAAAAAAIQBFYkRM6REAAOkRAAAxAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X3doZWVsZmlsZS5weWltcG9ydCBvcwppbXBvcnQgd2hlZWwuaW5zdGFsbAppbXBvcnQgd2hlZWwuYXJjaGl2ZQppbXBvcnQgaGFzaGxpYgp0cnk6CiAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIGlvIGltcG9ydCBCeXRlc0lPIGFzIFN0cmluZ0lPCmltcG9ydCBjb2RlY3MKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHB5dGVzdAppbXBvcnQgc2h1dGlsCmltcG9ydCB0ZW1wZmlsZQpmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyCgpAY29udGV4dG1hbmFnZXIKZGVmIGVudmlyb24oa2V5LCB2YWx1ZSk6CiAgICBvbGRfdmFsdWUgPSBvcy5lbnZpcm9uLmdldChrZXkpCiAgICB0cnk6CiAgICAgICAgb3MuZW52aXJvbltrZXldID0gdmFsdWUKICAgICAgICB5aWVsZAogICAgZmluYWxseToKICAgICAgICBpZiBvbGRfdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgZGVsIG9zLmVudmlyb25ba2V5XQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG9zLmVudmlyb25ba2V5XSA9IG9sZF92YWx1ZQoKQGNvbnRleHRtYW5hZ2VyCmRlZiB0ZW1wb3JhcnlfZGlyZWN0b3J5KCk6CiAgICAjIHRlbXBmaWxlLlRlbXBvcmFyeURpcmVjdG9yeSBkb2Vzbid0IGV4aXN0IGluIFB5dGhvbiAyLgogICAgdGVtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgdHJ5OgogICAgICAgIHlpZWxkIHRlbXBkaXIKICAgIGZpbmFsbHk6CiAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wZGlyKQoKQGNvbnRleHRtYW5hZ2VyCmRlZiByZWFkYWJsZV96aXBmaWxlKHBhdGgpOgogICAgIyB6aXBmaWxlLlppcEZpbGUoKSBpc24ndCBhIGNvbnRleHQgbWFuYWdlciB1bmRlciBQeXRob24gMi4KICAgIHpmID0gemlwZmlsZS5aaXBGaWxlKHBhdGgsICdyJykKICAgIHRyeToKICAgICAgICB5aWVsZCB6ZgogICAgZmluYWxseToKICAgICAgICB6Zi5jbG9zZSgpCgoKZGVmIHRlc3RfdmVyaWZ5aW5nX3ppcGZpbGUoKToKICAgIGlmIG5vdCBoYXNhdHRyKHppcGZpbGUuWmlwRXh0RmlsZSwgJ191cGRhdGVfY3JjJyk6CiAgICAgICAgcHl0ZXN0LnNraXAoJ05vIFpJUCB2ZXJpZmljYXRpb24uIE1pc3NpbmcgWmlwRXh0RmlsZS5fdXBkYXRlX2NyYy4nKQogICAgCiAgICBzaW8gPSBTdHJpbmdJTygpCiAgICB6ZiA9IHppcGZpbGUuWmlwRmlsZShzaW8sICd3JykKICAgIHpmLndyaXRlc3RyKCJvbmUiLCBiImZpcnN0IGZpbGUiKQogICAgemYud3JpdGVzdHIoInR3byIsIGIic2Vjb25kIGZpbGUiKQogICAgemYud3JpdGVzdHIoInRocmVlIiwgYiJ0aGlyZCBmaWxlIikKICAgIHpmLmNsb3NlKCkKICAgIAogICAgIyBJbiBkZWZhdWx0IG1vZGUsIFZlcmlmeWluZ1ppcEZpbGUgY2hlY2tzIHRoZSBoYXNoIG9mIGFueSByZWFkIGZpbGUKICAgICMgbWVudGlvbmVkIHdpdGggc2V0X2V4cGVjdGVkX2hhc2goKS4gRmlsZXMgbm90IG1lbnRpb25lZCB3aXRoCiAgICAjIHNldF9leHBlY3RlZF9oYXNoKCkgYXJlIG5vdCBjaGVja2VkLgogICAgdnpmID0gd2hlZWwuaW5zdGFsbC5WZXJpZnlpbmdaaXBGaWxlKHNpbywgJ3InKQogICAgdnpmLnNldF9leHBlY3RlZF9oYXNoKCJvbmUiLCBoYXNobGliLnNoYTI1NihiImZpcnN0IGZpbGUiKS5kaWdlc3QoKSkKICAgIHZ6Zi5zZXRfZXhwZWN0ZWRfaGFzaCgidGhyZWUiLCAiYmx1cmJsZSIpCiAgICB2emYub3Blbigib25lIikucmVhZCgpCiAgICB2emYub3BlbigidHdvIikucmVhZCgpCiAgICB0cnk6CiAgICAgICAgdnpmLm9wZW4oInRocmVlIikucmVhZCgpCiAgICBleGNlcHQgd2hlZWwuaW5zdGFsbC5CYWRXaGVlbEZpbGU6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICByYWlzZSBFeGNlcHRpb24oImV4cGVjdGVkIGV4Y2VwdGlvbiAnQmFkV2hlZWxGaWxlKCknIikKICAgIAogICAgIyBJbiBzdHJpY3QgbW9kZSwgVmVyaWZ5aW5nWmlwRmlsZSByZXF1aXJlcyBldmVyeSByZWFkIGZpbGUgdG8gYmUKICAgICMgbWVudGlvbmVkIHdpdGggc2V0X2V4cGVjdGVkX2hhc2goKS4KICAgIHZ6Zi5zdHJpY3QgPSBUcnVlCiAgICB0cnk6CiAgICAgICAgdnpmLm9wZW4oInR3byIpLnJlYWQoKQogICAgZXhjZXB0IHdoZWVsLmluc3RhbGwuQmFkV2hlZWxGaWxlOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJleHBlY3RlZCBleGNlcHRpb24gJ0JhZFdoZWVsRmlsZSgpJyIpCiAgICAgICAgCiAgICB2emYuc2V0X2V4cGVjdGVkX2hhc2goInR3byIsIE5vbmUpCiAgICB2emYub3BlbigidHdvIikucmVhZCgpCiAgICAKZGVmIHRlc3RfcG9wX3ppcGZpbGUoKToKICAgIHNpbyA9IFN0cmluZ0lPKCkKICAgIHpmID0gd2hlZWwuaW5zdGFsbC5WZXJpZnlpbmdaaXBGaWxlKHNpbywgJ3cnKQogICAgemYud3JpdGVzdHIoIm9uZSIsIGIiZmlyc3QgZmlsZSIpCiAgICB6Zi53cml0ZXN0cigidHdvIiwgYiJzZWNvbmQgZmlsZSIpCiAgICB6Zi5jbG9zZSgpCiAgICAKICAgIHRyeToKICAgICAgICB6Zi5wb3AoKQogICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKICAgICAgICBwYXNzICMgYWxyZWFkeSBjbG9zZWQKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJleHBlY3RlZCBSdW50aW1lRXJyb3IiKQogICAgCiAgICB6ZiA9IHdoZWVsLmluc3RhbGwuVmVyaWZ5aW5nWmlwRmlsZShzaW8sICdhJykKICAgIHpmLnBvcCgpCiAgICB6Zi5jbG9zZSgpCiAgICAKICAgIHpmID0gd2hlZWwuaW5zdGFsbC5WZXJpZnlpbmdaaXBGaWxlKHNpbywgJ3InKQogICAgYXNzZXJ0IGxlbih6Zi5pbmZvbGlzdCgpKSA9PSAxCgpkZWYgdGVzdF96aXBmaWxlX3RpbWVzdGFtcCgpOgogICAgIyBBbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0byBpbmZsdWVuY2UgdGhlIHRpbWVzdGFtcCBvbgogICAgIyBUYXJJbmZvIG9iamVjdHMgaW5zaWRlIHRoZSB6aXAuICBTZWUgaXNzdWUgIzE0My4gIFRlbXBvcmFyeURpcmVjdG9yeSBpcwogICAgIyBub3QgYSBjb250ZXh0IG1hbmFnZXIgdW5kZXIgUHl0aG9uIDMuCiAgICB3aXRoIHRlbXBvcmFyeV9kaXJlY3RvcnkoKSBhcyB0ZW1wZGlyOgogICAgICAgIGZvciBmaWxlbmFtZSBpbiAoJ29uZScsICd0d28nLCAndGhyZWUnKToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCBmaWxlbmFtZSkKICAgICAgICAgICAgd2l0aCBjb2RlY3Mub3BlbihwYXRoLCAndycsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGZwOgogICAgICAgICAgICAgICAgZnAud3JpdGUoZmlsZW5hbWUgKyAnXG4nKQogICAgICAgIHppcF9iYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgJ2R1bW15JykKICAgICAgICAjIFRoZSBlYXJsaWVzdCBkYXRlIHJlcHJlc2VudGFibGUgaW4gVGFySW5mb3MsIDE5ODAtMDEtMDEKICAgICAgICB3aXRoIGVudmlyb24oJ1NPVVJDRV9EQVRFX0VQT0NIJywgJzMxNTU3NjA2MCcpOgogICAgICAgICAgICB6aXBfZmlsZW5hbWUgPSB3aGVlbC5hcmNoaXZlLm1ha2Vfd2hlZWxmaWxlX2lubmVyKAogICAgICAgICAgICAgICAgemlwX2Jhc2VfbmFtZSwgdGVtcGRpcikKICAgICAgICB3aXRoIHJlYWRhYmxlX3ppcGZpbGUoemlwX2ZpbGVuYW1lKSBhcyB6ZjoKICAgICAgICAgICAgZm9yIGluZm8gaW4gemYuaW5mb2xpc3QoKToKICAgICAgICAgICAgICAgIGFzc2VydCBpbmZvLmRhdGVfdGltZVs6M10gPT0gKDE5ODAsIDEsIDEpCgpkZWYgdGVzdF96aXBmaWxlX2F0dHJpYnV0ZXMoKToKICAgICMgV2l0aCB0aGUgY2hhbmdlIGZyb20gWmlwRmlsZS53cml0ZSgpIHRvIC53cml0ZXN0cigpLCB3ZSBuZWVkIHRvIG1hbnVhbGx5CiAgICAjIHNldCBtZW1iZXIgYXR0cmlidXRlcy4KICAgIHdpdGggdGVtcG9yYXJ5X2RpcmVjdG9yeSgpIGFzIHRlbXBkaXI6CiAgICAgICAgZmlsZXMgPSAoKCdmb28nLCAwbzY0NCksICgnYmFyJywgMG83NTUpKQogICAgICAgIGZvciBmaWxlbmFtZSwgbW9kZSBpbiBmaWxlczoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCBmaWxlbmFtZSkKICAgICAgICAgICAgd2l0aCBjb2RlY3Mub3BlbihwYXRoLCAndycsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGZwOgogICAgICAgICAgICAgICAgZnAud3JpdGUoZmlsZW5hbWUgKyAnXG4nKQogICAgICAgICAgICBvcy5jaG1vZChwYXRoLCBtb2RlKQogICAgICAgIHppcF9iYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgJ2R1bW15JykKICAgICAgICB6aXBfZmlsZW5hbWUgPSB3aGVlbC5hcmNoaXZlLm1ha2Vfd2hlZWxmaWxlX2lubmVyKAogICAgICAgICAgICB6aXBfYmFzZV9uYW1lLCB0ZW1wZGlyKQogICAgICAgIHdpdGggcmVhZGFibGVfemlwZmlsZSh6aXBfZmlsZW5hbWUpIGFzIHpmOgogICAgICAgICAgICBmb3IgZmlsZW5hbWUsIG1vZGUgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICBpbmZvID0gemYuZ2V0aW5mbyhvcy5wYXRoLmpvaW4odGVtcGRpciwgZmlsZW5hbWUpKQogICAgICAgICAgICAgICAgYXNzZXJ0IGluZm8uZXh0ZXJuYWxfYXR0ciA9PSAobW9kZSB8IDBvMTAwMDAwKSA8PCAxNgogICAgICAgICAgICAgICAgYXNzZXJ0IGluZm8uY29tcHJlc3NfdHlwZSA9PSB6aXBmaWxlLlpJUF9ERUZMQVRFRApQSwMEFAAAAAAAAAAhAKMtAxehMwAAoTMAACsAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90b29sL19faW5pdF9fLnB5IiIiCldoZWVsIGNvbW1hbmQtbGluZSB1dGlsaXR5LgoiIiIKCmltcG9ydCBvcwppbXBvcnQgaGFzaGxpYgppbXBvcnQgc3lzCmltcG9ydCBqc29uCgpmcm9tIGdsb2IgaW1wb3J0IGlnbG9iCmZyb20gLi4gaW1wb3J0IHNpZ25hdHVyZXMKZnJvbSAuLnV0aWwgaW1wb3J0ICh1cmxzYWZlX2I2NGRlY29kZSwgdXJsc2FmZV9iNjRlbmNvZGUsIG5hdGl2ZSwgYmluYXJ5LAogICAgICAgICAgICAgICAgICAgIG1hdGNoZXNfcmVxdWlyZW1lbnQpCmZyb20gLi5pbnN0YWxsIGltcG9ydCBXaGVlbEZpbGUsIFZlcmlmeWluZ1ppcEZpbGUKZnJvbSAuLnBhdGhzIGltcG9ydCBnZXRfaW5zdGFsbF9jb21tYW5kCgpkZWYgcmVxdWlyZV9wa2dyZXNvdXJjZXMobmFtZSk6CiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHBrZ19yZXNvdXJjZXMKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIid7MH0nIG5lZWRzIHBrZ19yZXNvdXJjZXMgKHBhcnQgb2Ygc2V0dXB0b29scykuIi5mb3JtYXQobmFtZSkpCgppbXBvcnQgYXJncGFyc2UKCmNsYXNzIFdoZWVsRXJyb3IoRXhjZXB0aW9uKTogcGFzcwoKIyBGb3IgdGVzdGFiaWxpdHkKZGVmIGdldF9rZXlyaW5nKCk6CiAgICB0cnk6CiAgICAgICAgZnJvbSAuLnNpZ25hdHVyZXMgaW1wb3J0IGtleXMKICAgICAgICBpbXBvcnQga2V5cmluZwogICAgICAgIGFzc2VydCBrZXlyaW5nLmdldF9rZXlyaW5nKCkucHJpb3JpdHkKICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEFzc2VydGlvbkVycm9yKToKICAgICAgICByYWlzZSBXaGVlbEVycm9yKCJJbnN0YWxsIHdoZWVsW3NpZ25hdHVyZXNdIChyZXF1aXJlcyBrZXlyaW5nLCBrZXlyaW5ncy5hbHQsIHB5eGRnKSBmb3Igc2lnbmF0dXJlcy4iKQogICAgcmV0dXJuIGtleXMuV2hlZWxLZXlzLCBrZXlyaW5nCgpkZWYga2V5Z2VuKGdldF9rZXlyaW5nPWdldF9rZXlyaW5nKToKICAgICIiIkdlbmVyYXRlIGEgcHVibGljL3ByaXZhdGUga2V5IHBhaXIuIiIiCiAgICBXaGVlbEtleXMsIGtleXJpbmcgPSBnZXRfa2V5cmluZygpCgogICAgZWQyNTUxOWxsID0gc2lnbmF0dXJlcy5nZXRfZWQyNTUxOWxsKCkKCiAgICB3ayA9IFdoZWVsS2V5cygpLmxvYWQoKQoKICAgIGtleXBhaXIgPSBlZDI1NTE5bGwuY3J5cHRvX3NpZ25fa2V5cGFpcigpCiAgICB2ayA9IG5hdGl2ZSh1cmxzYWZlX2I2NGVuY29kZShrZXlwYWlyLnZrKSkKICAgIHNrID0gbmF0aXZlKHVybHNhZmVfYjY0ZW5jb2RlKGtleXBhaXIuc2spKQogICAga3IgPSBrZXlyaW5nLmdldF9rZXlyaW5nKCkKICAgIGtyLnNldF9wYXNzd29yZCgid2hlZWwiLCB2aywgc2spCiAgICBzeXMuc3Rkb3V0LndyaXRlKCJDcmVhdGVkIEVkMjU1MTkga2V5cGFpciB3aXRoIHZrPXswfVxuIi5mb3JtYXQodmspKQogICAgc3lzLnN0ZG91dC53cml0ZSgiaW4gezAhcn1cbiIuZm9ybWF0KGtyKSkKCiAgICBzazIgPSBrci5nZXRfcGFzc3dvcmQoJ3doZWVsJywgdmspCiAgICBpZiBzazIgIT0gc2s6CiAgICAgICAgcmFpc2UgV2hlZWxFcnJvcigiS2V5cmluZyBpcyBicm9rZW4uIENvdWxkIG5vdCByZXRyaWV2ZSBzZWNyZXQga2V5LiIpCgogICAgc3lzLnN0ZG91dC53cml0ZSgiVHJ1c3RpbmcgezB9IHRvIHNpZ24gYW5kIHZlcmlmeSBhbGwgcGFja2FnZXMuXG4iLmZvcm1hdCh2aykpCiAgICB3ay5hZGRfc2lnbmVyKCcrJywgdmspCiAgICB3ay50cnVzdCgnKycsIHZrKQogICAgd2suc2F2ZSgpCgpkZWYgc2lnbih3aGVlbGZpbGUsIHJlcGxhY2U9RmFsc2UsIGdldF9rZXlyaW5nPWdldF9rZXlyaW5nKToKICAgICIiIlNpZ24gYSB3aGVlbCIiIgogICAgV2hlZWxLZXlzLCBrZXlyaW5nID0gZ2V0X2tleXJpbmcoKQoKICAgIGVkMjU1MTlsbCA9IHNpZ25hdHVyZXMuZ2V0X2VkMjU1MTlsbCgpCgogICAgd2YgPSBXaGVlbEZpbGUod2hlZWxmaWxlLCBhcHBlbmQ9VHJ1ZSkKICAgIHdrID0gV2hlZWxLZXlzKCkubG9hZCgpCgogICAgbmFtZSA9IHdmLnBhcnNlZF9maWxlbmFtZS5ncm91cCgnbmFtZScpCiAgICBzaWduX3dpdGggPSB3ay5zaWduZXJzKG5hbWUpWzBdCiAgICBzeXMuc3Rkb3V0LndyaXRlKCJTaWduaW5nIHswfSB3aXRoIHsxfVxuIi5mb3JtYXQobmFtZSwgc2lnbl93aXRoWzFdKSkKCiAgICB2ayA9IHNpZ25fd2l0aFsxXQogICAga3IgPSBrZXlyaW5nLmdldF9rZXlyaW5nKCkKICAgIHNrID0ga3IuZ2V0X3Bhc3N3b3JkKCd3aGVlbCcsIHZrKQogICAga2V5cGFpciA9IGVkMjU1MTlsbC5LZXlwYWlyKHVybHNhZmVfYjY0ZGVjb2RlKGJpbmFyeSh2aykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybHNhZmVfYjY0ZGVjb2RlKGJpbmFyeShzaykpKQoKCiAgICByZWNvcmRfbmFtZSA9IHdmLmRpc3RpbmZvX25hbWUgKyAnL1JFQ09SRCcKICAgIHNpZ19uYW1lID0gd2YuZGlzdGluZm9fbmFtZSArICcvUkVDT1JELmp3cycKICAgIGlmIHNpZ19uYW1lIGluIHdmLnppcGZpbGUubmFtZWxpc3QoKToKICAgICAgICByYWlzZSBXaGVlbEVycm9yKCJXaGVlbCBpcyBhbHJlYWR5IHNpZ25lZC4iKQogICAgcmVjb3JkX2RhdGEgPSB3Zi56aXBmaWxlLnJlYWQocmVjb3JkX25hbWUpCiAgICBwYXlsb2FkID0geyJoYXNoIjoic2hhMjU2PSIgKyBuYXRpdmUodXJsc2FmZV9iNjRlbmNvZGUoaGFzaGxpYi5zaGEyNTYocmVjb3JkX2RhdGEpLmRpZ2VzdCgpKSl9CiAgICBzaWcgPSBzaWduYXR1cmVzLnNpZ24ocGF5bG9hZCwga2V5cGFpcikKICAgIHdmLnppcGZpbGUud3JpdGVzdHIoc2lnX25hbWUsIGpzb24uZHVtcHMoc2lnLCBzb3J0X2tleXM9VHJ1ZSkpCiAgICB3Zi56aXBmaWxlLmNsb3NlKCkKCmRlZiB1bnNpZ24od2hlZWxmaWxlKToKICAgICIiIgogICAgUmVtb3ZlIFJFQ09SRC5qd3MgZnJvbSBhIHdoZWVsIGJ5IHRydW5jYXRpbmcgdGhlIHppcCBmaWxlLgoKICAgIFJFQ09SRC5qd3MgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLiBUaGUgemlwIGZpbGUgbXVzdCBiZSBhbgogICAgb3JkaW5hcnkgYXJjaGl2ZSwgd2l0aCB0aGUgY29tcHJlc3NlZCBmaWxlcyBhbmQgdGhlIGRpcmVjdG9yeSBpbiB0aGUgc2FtZQogICAgb3JkZXIsIGFuZCB3aXRob3V0IGFueSBub24temlwIGNvbnRlbnQgYWZ0ZXIgdGhlIHRydW5jYXRpb24gcG9pbnQuCiAgICAiIiIKICAgIHZ6ZiA9IFZlcmlmeWluZ1ppcEZpbGUod2hlZWxmaWxlLCAiYSIpCiAgICBpbmZvID0gdnpmLmluZm9saXN0KCkKICAgIGlmIG5vdCAobGVuKGluZm8pIGFuZCBpbmZvWy0xXS5maWxlbmFtZS5lbmRzd2l0aCgnL1JFQ09SRC5qd3MnKSk6CiAgICAgICAgcmFpc2UgV2hlZWxFcnJvcigiUkVDT1JELmp3cyBub3QgZm91bmQgYXQgZW5kIG9mIGFyY2hpdmUuIikKICAgIHZ6Zi5wb3AoKQogICAgdnpmLmNsb3NlKCkKCmRlZiB2ZXJpZnkod2hlZWxmaWxlKToKICAgICIiIlZlcmlmeSBhIHdoZWVsLgoKICAgIFRoZSBzaWduYXR1cmUgd2lsbCBiZSB2ZXJpZmllZCBmb3IgaW50ZXJuYWwgY29uc2lzdGVuY3kgT05MWSBhbmQgcHJpbnRlZC4KICAgIFdoZWVsJ3Mgb3duIHVucGFjay9pbnN0YWxsIGNvbW1hbmRzIHZlcmlmeSB0aGUgbWFuaWZlc3QgYWdhaW5zdCB0aGUKICAgIHNpZ25hdHVyZSBhbmQgZmlsZSBjb250ZW50cy4KICAgICIiIgogICAgd2YgPSBXaGVlbEZpbGUod2hlZWxmaWxlKQogICAgc2lnX25hbWUgPSB3Zi5kaXN0aW5mb19uYW1lICsgJy9SRUNPUkQuandzJwogICAgc2lnID0ganNvbi5sb2FkcyhuYXRpdmUod2YuemlwZmlsZS5vcGVuKHNpZ19uYW1lKS5yZWFkKCkpKQogICAgdmVyaWZpZWQgPSBzaWduYXR1cmVzLnZlcmlmeShzaWcpCiAgICBzeXMuc3RkZXJyLndyaXRlKCJTaWduYXR1cmVzIGFyZSBpbnRlcm5hbGx5IGNvbnNpc3RlbnQuXG4iKQogICAgc3lzLnN0ZG91dC53cml0ZShqc29uLmR1bXBzKHZlcmlmaWVkLCBpbmRlbnQ9MikpCiAgICBzeXMuc3Rkb3V0LndyaXRlKCdcbicpCgpkZWYgdW5wYWNrKHdoZWVsZmlsZSwgZGVzdD0nLicpOgogICAgIiIiVW5wYWNrIGEgd2hlZWwuCgogICAgV2hlZWwgY29udGVudCB3aWxsIGJlIHVucGFja2VkIHRvIHtkZXN0fS97bmFtZX0te3Zlcn0sIHdoZXJlIHtuYW1lfQogICAgaXMgdGhlIHBhY2thZ2UgbmFtZSBhbmQge3Zlcn0gaXRzIHZlcnNpb24uCgogICAgOnBhcmFtIHdoZWVsZmlsZTogVGhlIHBhdGggdG8gdGhlIHdoZWVsLgogICAgOnBhcmFtIGRlc3Q6IERlc3RpbmF0aW9uIGRpcmVjdG9yeSAoZGVmYXVsdCB0byBjdXJyZW50IGRpcmVjdG9yeSkuCiAgICAiIiIKICAgIHdmID0gV2hlZWxGaWxlKHdoZWVsZmlsZSkKICAgIG5hbWV2ZXIgPSB3Zi5wYXJzZWRfZmlsZW5hbWUuZ3JvdXAoJ25hbWV2ZXInKQogICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmpvaW4oZGVzdCwgbmFtZXZlcikKICAgIHN5cy5zdGRlcnIud3JpdGUoIlVucGFja2luZyB0bzogJXNcbiIgJSAoZGVzdGluYXRpb24pKQogICAgd2YuemlwZmlsZS5leHRyYWN0YWxsKGRlc3RpbmF0aW9uKQogICAgd2YuemlwZmlsZS5jbG9zZSgpCgpkZWYgaW5zdGFsbChyZXF1aXJlbWVudHMsIHJlcXVpcmVtZW50c19maWxlPU5vbmUsCiAgICAgICAgICAgIHdoZWVsX2RpcnM9Tm9uZSwgZm9yY2U9RmFsc2UsIGxpc3RfZmlsZXM9RmFsc2UsCiAgICAgICAgICAgIGRyeV9ydW49RmFsc2UpOgogICAgIiIiSW5zdGFsbCB3aGVlbHMuCgogICAgOnBhcmFtIHJlcXVpcmVtZW50czogQSBsaXN0IG9mIHJlcXVpcmVtZW50cyBvciB3aGVlbCBmaWxlcyB0byBpbnN0YWxsLgogICAgOnBhcmFtIHJlcXVpcmVtZW50c19maWxlOiBBIGZpbGUgY29udGFpbmluZyByZXF1aXJlbWVudHMgdG8gaW5zdGFsbC4KICAgIDpwYXJhbSB3aGVlbF9kaXJzOiBBIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvciB3aGVlbHMuCiAgICA6cGFyYW0gZm9yY2U6IEluc3RhbGwgYSB3aGVlbCBmaWxlIGV2ZW4gaWYgaXQgaXMgbm90IGNvbXBhdGlibGUuCiAgICA6cGFyYW0gbGlzdF9maWxlczogT25seSBsaXN0IHRoZSBmaWxlcyB0byBpbnN0YWxsLCBkb24ndCBpbnN0YWxsIHRoZW0uCiAgICA6cGFyYW0gZHJ5X3J1bjogRG8gZXZlcnl0aGluZyBidXQgdGhlIGFjdHVhbCBpbnN0YWxsLgogICAgIiIiCgogICAgIyBJZiBubyB3aGVlbCBkaXJlY3RvcmllcyBzcGVjaWZpZWQsIHVzZSB0aGUgV0hFRUxQQVRIIGVudmlyb25tZW50CiAgICAjIHZhcmlhYmxlLCBvciB0aGUgY3VycmVudCBkaXJlY3RvcnkgaWYgdGhhdCBpcyBub3Qgc2V0LgogICAgaWYgbm90IHdoZWVsX2RpcnM6CiAgICAgICAgd2hlZWxwYXRoID0gb3MuZ2V0ZW52KCJXSEVFTFBBVEgiKQogICAgICAgIGlmIHdoZWVscGF0aDoKICAgICAgICAgICAgd2hlZWxfZGlycyA9IHdoZWVscGF0aC5zcGxpdChvcy5wYXRoc2VwKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHdoZWVsX2RpcnMgPSBbIG9zLnBhdGguY3VyZGlyIF0KCiAgICAjIEdldCBhIGxpc3Qgb2YgYWxsIHZhbGlkIHdoZWVscyBpbiB3aGVlbF9kaXJzCiAgICBhbGxfd2hlZWxzID0gW10KICAgIGZvciBkIGluIHdoZWVsX2RpcnM6CiAgICAgICAgZm9yIHcgaW4gb3MubGlzdGRpcihkKToKICAgICAgICAgICAgaWYgdy5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICAgICAgICAgd2YgPSBXaGVlbEZpbGUob3MucGF0aC5qb2luKGQsIHcpKQogICAgICAgICAgICAgICAgaWYgd2YuY29tcGF0aWJsZToKICAgICAgICAgICAgICAgICAgICBhbGxfd2hlZWxzLmFwcGVuZCh3ZikKCiAgICAjIElmIHRoZXJlIGlzIGEgcmVxdWlyZW1lbnRzIGZpbGUsIGFkZCBpdCB0byB0aGUgbGlzdCBvZiByZXF1aXJlbWVudHMKICAgIGlmIHJlcXVpcmVtZW50c19maWxlOgogICAgICAgICMgSWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCwgc2VhcmNoIGZvciBpdCBpbiB3aGVlbF9kaXJzCiAgICAgICAgIyBUaGlzIGFsbG93cyBzdGFuZGFyZCByZXF1aXJlbWVudHMgZmlsZXMgdG8gYmUgc3RvcmVkIHdpdGggdGhlCiAgICAgICAgIyB3aGVlbHMuCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHJlcXVpcmVtZW50c19maWxlKToKICAgICAgICAgICAgZm9yIGQgaW4gd2hlZWxfZGlyczoKICAgICAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLmpvaW4oZCwgcmVxdWlyZW1lbnRzX2ZpbGUpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhuYW1lKToKICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudHNfZmlsZSA9IG5hbWUKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICB3aXRoIG9wZW4ocmVxdWlyZW1lbnRzX2ZpbGUpIGFzIGZkOgogICAgICAgICAgICByZXF1aXJlbWVudHMuZXh0ZW5kKGZkKQoKICAgIHRvX2luc3RhbGwgPSBbXQogICAgZm9yIHJlcSBpbiByZXF1aXJlbWVudHM6CiAgICAgICAgaWYgcmVxLmVuZHN3aXRoKCcud2hsJyk6CiAgICAgICAgICAgICMgRXhwbGljaXRseSBzcGVjaWZpZWQgd2hlZWwgZmlsZW5hbWUKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmVxKToKICAgICAgICAgICAgICAgIHdmID0gV2hlZWxGaWxlKHJlcSkKICAgICAgICAgICAgICAgIGlmIHdmLmNvbXBhdGlibGUgb3IgZm9yY2U6CiAgICAgICAgICAgICAgICAgICAgdG9faW5zdGFsbC5hcHBlbmQod2YpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG1zZyA9ICgiezB9IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyBQeXRob24uICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tZm9yY2UgdG8gaW5zdGFsbCBhbnl3YXkuIi5mb3JtYXQocmVxKSkKICAgICAgICAgICAgICAgICAgICByYWlzZSBXaGVlbEVycm9yKG1zZykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgV2UgY291bGQgc2VhcmNoIG9uIHdoZWVsX2RpcnMsIGJ1dCBpdCdzIHByb2JhYmx5IE9LIHRvCiAgICAgICAgICAgICAgICAjIGFzc3VtZSB0aGUgdXNlciBoYXMgbWFkZSBhbiBlcnJvci4KICAgICAgICAgICAgICAgIHJhaXNlIFdoZWVsRXJyb3IoIk5vIHN1Y2ggd2hlZWwgZmlsZToge30iLmZvcm1hdChyZXEpKQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIFdlIGhhdmUgYSByZXF1aXJlbWVudCBzcGVjCiAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIHBrZ19yZXNvdXJjZXMsIHRoaXMgd2lsbCByYWlzZSBhbiBleGNlcHRpb24KICAgICAgICBtYXRjaGVzID0gbWF0Y2hlc19yZXF1aXJlbWVudChyZXEsIGFsbF93aGVlbHMpCiAgICAgICAgaWYgbm90IG1hdGNoZXM6CiAgICAgICAgICAgIHJhaXNlIFdoZWVsRXJyb3IoIk5vIG1hdGNoIGZvciByZXF1aXJlbWVudCB7fSIuZm9ybWF0KHJlcSkpCiAgICAgICAgdG9faW5zdGFsbC5hcHBlbmQobWF4KG1hdGNoZXMpKQoKICAgICMgV2Ugbm93IGhhdmUgYSBsaXN0IG9mIHdoZWVscyB0byBpbnN0YWxsCiAgICBpZiBsaXN0X2ZpbGVzOgogICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIkluc3RhbGxpbmc6XG4iKQoKICAgIGlmIGRyeV9ydW46CiAgICAgICAgcmV0dXJuCgogICAgZm9yIHdmIGluIHRvX2luc3RhbGw6CiAgICAgICAgaWYgbGlzdF9maWxlczoKICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiICAgIHswfVxuIi5mb3JtYXQod2YuZmlsZW5hbWUpKQogICAgICAgICAgICBjb250aW51ZQogICAgICAgIHdmLmluc3RhbGwoZm9yY2U9Zm9yY2UpCiAgICAgICAgd2YuemlwZmlsZS5jbG9zZSgpCgpkZWYgaW5zdGFsbF9zY3JpcHRzKGRpc3RyaWJ1dGlvbnMpOgogICAgIiIiCiAgICBSZWdlbmVyYXRlIHRoZSBlbnRyeV9wb2ludHMgY29uc29sZV9zY3JpcHRzIGZvciB0aGUgbmFtZWQgZGlzdHJpYnV0aW9uLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQgaW1wb3J0IGVhc3lfaW5zdGFsbAogICAgICAgIGltcG9ydCBwa2dfcmVzb3VyY2VzCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCInd2hlZWwgaW5zdGFsbF9zY3JpcHRzJyBuZWVkcyBzZXR1cHRvb2xzLiIpCgogICAgZm9yIGRpc3QgaW4gZGlzdHJpYnV0aW9uczoKICAgICAgICBwa2dfcmVzb3VyY2VzX2Rpc3QgPSBwa2dfcmVzb3VyY2VzLmdldF9kaXN0cmlidXRpb24oZGlzdCkKICAgICAgICBpbnN0YWxsID0gZ2V0X2luc3RhbGxfY29tbWFuZChkaXN0KQogICAgICAgIGNvbW1hbmQgPSBlYXN5X2luc3RhbGwuZWFzeV9pbnN0YWxsKGluc3RhbGwuZGlzdHJpYnV0aW9uKQogICAgICAgIGNvbW1hbmQuYXJncyA9IFsnd2hlZWwnXSAjIGR1bW15IGFyZ3VtZW50CiAgICAgICAgY29tbWFuZC5maW5hbGl6ZV9vcHRpb25zKCkKICAgICAgICBjb21tYW5kLmluc3RhbGxfZWdnX3NjcmlwdHMocGtnX3Jlc291cmNlc19kaXN0KQoKZGVmIGNvbnZlcnQoaW5zdGFsbGVycywgZGVzdF9kaXIsIHZlcmJvc2UpOgogICAgcmVxdWlyZV9wa2dyZXNvdXJjZXMoJ3doZWVsIGNvbnZlcnQnKQoKICAgICMgT25seSBzdXBwb3J0IHdoZWVsIGNvbnZlcnQgaWYgcGtnX3Jlc291cmNlcyBpcyBwcmVzZW50CiAgICBmcm9tIC4ud2luaW5zdDJ3aGVlbCBpbXBvcnQgYmRpc3Rfd2luaW5zdDJ3aGVlbAogICAgZnJvbSAuLmVnZzJ3aGVlbCBpbXBvcnQgZWdnMndoZWVsCgogICAgZm9yIHBhdCBpbiBpbnN0YWxsZXJzOgogICAgICAgIGZvciBpbnN0YWxsZXIgaW4gaWdsb2IocGF0KToKICAgICAgICAgICAgaWYgb3MucGF0aC5zcGxpdGV4dChpbnN0YWxsZXIpWzFdID09ICcuZWdnJzoKICAgICAgICAgICAgICAgIGNvbnYgPSBlZ2cyd2hlZWwKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNvbnYgPSBiZGlzdF93aW5pbnN0MndoZWVsCiAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJ7MH0uLi4gIi5mb3JtYXQoaW5zdGFsbGVyKSkKICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQogICAgICAgICAgICBjb252KGluc3RhbGxlciwgZGVzdF9kaXIpCiAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJPS1xuIikKCmRlZiBwYXJzZXIoKToKICAgIHAgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCiAgICBzID0gcC5hZGRfc3VicGFyc2VycyhoZWxwPSJjb21tYW5kcyIpCgogICAgZGVmIGtleWdlbl9mKGFyZ3MpOgogICAgICAgIGtleWdlbigpCiAgICBrZXlnZW5fcGFyc2VyID0gcy5hZGRfcGFyc2VyKCdrZXlnZW4nLCBoZWxwPSdHZW5lcmF0ZSBzaWduaW5nIGtleScpCiAgICBrZXlnZW5fcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPWtleWdlbl9mKQoKICAgIGRlZiBzaWduX2YoYXJncyk6CiAgICAgICAgc2lnbihhcmdzLndoZWVsZmlsZSkKICAgIHNpZ25fcGFyc2VyID0gcy5hZGRfcGFyc2VyKCdzaWduJywgaGVscD0nU2lnbiB3aGVlbCcpCiAgICBzaWduX3BhcnNlci5hZGRfYXJndW1lbnQoJ3doZWVsZmlsZScsIGhlbHA9J1doZWVsIGZpbGUnKQogICAgc2lnbl9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9c2lnbl9mKQoKICAgIGRlZiB1bnNpZ25fZihhcmdzKToKICAgICAgICB1bnNpZ24oYXJncy53aGVlbGZpbGUpCiAgICB1bnNpZ25fcGFyc2VyID0gcy5hZGRfcGFyc2VyKCd1bnNpZ24nLCBoZWxwPXVuc2lnbi5fX2RvY19fKQogICAgdW5zaWduX3BhcnNlci5hZGRfYXJndW1lbnQoJ3doZWVsZmlsZScsIGhlbHA9J1doZWVsIGZpbGUnKQogICAgdW5zaWduX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz11bnNpZ25fZikKCiAgICBkZWYgdmVyaWZ5X2YoYXJncyk6CiAgICAgICAgdmVyaWZ5KGFyZ3Mud2hlZWxmaWxlKQogICAgdmVyaWZ5X3BhcnNlciA9IHMuYWRkX3BhcnNlcigndmVyaWZ5JywgaGVscD12ZXJpZnkuX19kb2NfXykKICAgIHZlcmlmeV9wYXJzZXIuYWRkX2FyZ3VtZW50KCd3aGVlbGZpbGUnLCBoZWxwPSdXaGVlbCBmaWxlJykKICAgIHZlcmlmeV9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9dmVyaWZ5X2YpCgogICAgZGVmIHVucGFja19mKGFyZ3MpOgogICAgICAgIHVucGFjayhhcmdzLndoZWVsZmlsZSwgYXJncy5kZXN0KQogICAgdW5wYWNrX3BhcnNlciA9IHMuYWRkX3BhcnNlcigndW5wYWNrJywgaGVscD0nVW5wYWNrIHdoZWVsJykKICAgIHVucGFja19wYXJzZXIuYWRkX2FyZ3VtZW50KCctLWRlc3QnLCAnLWQnLCBoZWxwPSdEZXN0aW5hdGlvbiBkaXJlY3RvcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0nLicpCiAgICB1bnBhY2tfcGFyc2VyLmFkZF9hcmd1bWVudCgnd2hlZWxmaWxlJywgaGVscD0nV2hlZWwgZmlsZScpCiAgICB1bnBhY2tfcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPXVucGFja19mKQoKICAgIGRlZiBpbnN0YWxsX2YoYXJncyk6CiAgICAgICAgaW5zdGFsbChhcmdzLnJlcXVpcmVtZW50cywgYXJncy5yZXF1aXJlbWVudHNfZmlsZSwKICAgICAgICAgICAgICAgIGFyZ3Mud2hlZWxfZGlycywgYXJncy5mb3JjZSwgYXJncy5saXN0X2ZpbGVzKQogICAgaW5zdGFsbF9wYXJzZXIgPSBzLmFkZF9wYXJzZXIoJ2luc3RhbGwnLCBoZWxwPSdJbnN0YWxsIHdoZWVscycpCiAgICBpbnN0YWxsX3BhcnNlci5hZGRfYXJndW1lbnQoJ3JlcXVpcmVtZW50cycsIG5hcmdzPScqJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdSZXF1aXJlbWVudHMgdG8gaW5zdGFsbC4nKQogICAgaW5zdGFsbF9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLWZvcmNlJywgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0luc3RhbGwgaW5jb21wYXRpYmxlIHdoZWVsIGZpbGVzLicpCiAgICBpbnN0YWxsX3BhcnNlci5hZGRfYXJndW1lbnQoJy0td2hlZWwtZGlyJywgJy1kJywgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3doZWVsX2RpcnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0RpcmVjdG9yaWVzIGNvbnRhaW5pbmcgd2hlZWxzLicpCiAgICBpbnN0YWxsX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tcmVxdWlyZW1lbnRzLWZpbGUnLCAnLXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkEgZmlsZSBjb250YWluaW5nIHJlcXVpcmVtZW50cyB0byAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbGwuIikKICAgIGluc3RhbGxfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1saXN0JywgJy1sJywgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSdsaXN0X2ZpbGVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Ikxpc3Qgd2hlZWxzIHdoaWNoIHdvdWxkIGJlIGluc3RhbGxlZCwgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgZG9uJ3QgYWN0dWFsbHkgaW5zdGFsbCBhbnl0aGluZy4iKQogICAgaW5zdGFsbF9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9aW5zdGFsbF9mKQoKICAgIGRlZiBpbnN0YWxsX3NjcmlwdHNfZihhcmdzKToKICAgICAgICBpbnN0YWxsX3NjcmlwdHMoYXJncy5kaXN0cmlidXRpb25zKQogICAgaW5zdGFsbF9zY3JpcHRzX3BhcnNlciA9IHMuYWRkX3BhcnNlcignaW5zdGFsbC1zY3JpcHRzJywgaGVscD0nSW5zdGFsbCBjb25zb2xlX3NjcmlwdHMnKQogICAgaW5zdGFsbF9zY3JpcHRzX3BhcnNlci5hZGRfYXJndW1lbnQoJ2Rpc3RyaWJ1dGlvbnMnLCBuYXJncz0nKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdSZWdlbmVyYXRlIGNvbnNvbGVfc2NyaXB0cyBmb3IgdGhlc2UgZGlzdHJpYnV0aW9ucycpCiAgICBpbnN0YWxsX3NjcmlwdHNfcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPWluc3RhbGxfc2NyaXB0c19mKQoKICAgIGRlZiBjb252ZXJ0X2YoYXJncyk6CiAgICAgICAgY29udmVydChhcmdzLmluc3RhbGxlcnMsIGFyZ3MuZGVzdF9kaXIsIGFyZ3MudmVyYm9zZSkKICAgIGNvbnZlcnRfcGFyc2VyID0gcy5hZGRfcGFyc2VyKCdjb252ZXJ0JywgaGVscD0nQ29udmVydCBlZ2cgb3Igd2luaW5zdCB0byB3aGVlbCcpCiAgICBjb252ZXJ0X3BhcnNlci5hZGRfYXJndW1lbnQoJ2luc3RhbGxlcnMnLCBuYXJncz0nKicsIGhlbHA9J0luc3RhbGxlcnMgdG8gY29udmVydCcpCiAgICBjb252ZXJ0X3BhcnNlci5hZGRfYXJndW1lbnQoJy0tZGVzdC1kaXInLCAnLWQnLCBkZWZhdWx0PW9zLnBhdGguY3VyZGlyLAogICAgICAgICAgICBoZWxwPSJEaXJlY3RvcnkgdG8gc3RvcmUgd2hlZWxzIChkZWZhdWx0ICUoZGVmYXVsdClzKSIpCiAgICBjb252ZXJ0X3BhcnNlci5hZGRfYXJndW1lbnQoJy0tdmVyYm9zZScsICctdicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCiAgICBjb252ZXJ0X3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1jb252ZXJ0X2YpCgogICAgZGVmIHZlcnNpb25fZihhcmdzKToKICAgICAgICBmcm9tIC4uIGltcG9ydCBfX3ZlcnNpb25fXwogICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIndoZWVsICVzXG4iICUgX192ZXJzaW9uX18pCiAgICB2ZXJzaW9uX3BhcnNlciA9IHMuYWRkX3BhcnNlcigndmVyc2lvbicsIGhlbHA9J1ByaW50IHZlcnNpb24gYW5kIGV4aXQnKQogICAgdmVyc2lvbl9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9dmVyc2lvbl9mKQoKICAgIGRlZiBoZWxwX2YoYXJncyk6CiAgICAgICAgcC5wcmludF9oZWxwKCkKICAgIGhlbHBfcGFyc2VyID0gcy5hZGRfcGFyc2VyKCdoZWxwJywgaGVscD0nU2hvdyB0aGlzIGhlbHAnKQogICAgaGVscF9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9aGVscF9mKQoKICAgIHJldHVybiBwCgpkZWYgbWFpbigpOgogICAgcCA9IHBhcnNlcigpCiAgICBhcmdzID0gcC5wYXJzZV9hcmdzKCkKICAgIGlmIG5vdCBoYXNhdHRyKGFyZ3MsICdmdW5jJyk6CiAgICAgICAgcC5wcmludF9oZWxwKCkKICAgIGVsc2U6CiAgICAgICAgIyBYWFggb24gUHl0aG9uIDMuMyB3ZSBnZXQgJ2FyZ3MgaGFzIG5vIGZ1bmMnIHJhdGhlciB0aGFuIHNob3J0IGhlbHAuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBhcmdzLmZ1bmMoYXJncykKICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICBleGNlcHQgV2hlZWxFcnJvciBhcyBlOgogICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGUubWVzc2FnZSArICJcbiIpCiAgICByZXR1cm4gMQpQSwMEFAAAAAAAAAAhAM/YM7IaEwAAGhMAACIAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC91dGlsLnB5IiIiVXRpbGl0eSBmdW5jdGlvbnMuIiIiCgppbXBvcnQgc3lzCmltcG9ydCBvcwppbXBvcnQgYmFzZTY0CmltcG9ydCBqc29uCmltcG9ydCBoYXNobGliCnRyeToKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIE9yZGVyZWREaWN0ID0gZGljdAoKX19hbGxfXyA9IFsndXJsc2FmZV9iNjRlbmNvZGUnLCAndXJsc2FmZV9iNjRkZWNvZGUnLCAndXRmOCcsCiAgICAgICAgICAgJ3RvX2pzb24nLCAnZnJvbV9qc29uJywgJ21hdGNoZXNfcmVxdWlyZW1lbnQnXQoKZGVmIHVybHNhZmVfYjY0ZW5jb2RlKGRhdGEpOgogICAgIiIidXJsc2FmZV9iNjRlbmNvZGUgd2l0aG91dCBwYWRkaW5nIiIiCiAgICByZXR1cm4gYmFzZTY0LnVybHNhZmVfYjY0ZW5jb2RlKGRhdGEpLnJzdHJpcChiaW5hcnkoJz0nKSkKCgpkZWYgdXJsc2FmZV9iNjRkZWNvZGUoZGF0YSk6CiAgICAiIiJ1cmxzYWZlX2I2NGRlY29kZSB3aXRob3V0IHBhZGRpbmciIiIKICAgIHBhZCA9IGInPScgKiAoNCAtIChsZW4oZGF0YSkgJiAzKSkKICAgIHJldHVybiBiYXNlNjQudXJsc2FmZV9iNjRkZWNvZGUoZGF0YSArIHBhZCkKCgpkZWYgdG9fanNvbihvKToKICAgICcnJ0NvbnZlcnQgZ2l2ZW4gZGF0YSB0byBKU09OLicnJwogICAgcmV0dXJuIGpzb24uZHVtcHMobywgc29ydF9rZXlzPVRydWUpCgoKZGVmIGZyb21fanNvbihqKToKICAgICcnJ0RlY29kZSBhIEpTT04gcGF5bG9hZC4nJycKICAgIHJldHVybiBqc29uLmxvYWRzKGopCgpkZWYgb3Blbl9mb3JfY3N2KG5hbWUsIG1vZGUpOgogICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CiAgICAgICAgbmwgPSB7fQogICAgICAgIGJpbiA9ICdiJwogICAgZWxzZToKICAgICAgICBubCA9IHsgJ25ld2xpbmUnOiAnJyB9CiAgICAgICAgYmluID0gJycKICAgIHJldHVybiBvcGVuKG5hbWUsIG1vZGUgKyBiaW4sICoqbmwpCgp0cnk6CiAgICB1bmljb2RlCgogICAgZGVmIHV0ZjgoZGF0YSk6CiAgICAgICAgJycnVXRmLTggZW5jb2RlIGRhdGEuJycnCiAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCB1bmljb2RlKToKICAgICAgICAgICAgcmV0dXJuIGRhdGEuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgcmV0dXJuIGRhdGEKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiB1dGY4KGRhdGEpOgogICAgICAgICcnJ1V0Zi04IGVuY29kZSBkYXRhLicnJwogICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgc3RyKToKICAgICAgICAgICAgcmV0dXJuIGRhdGEuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgcmV0dXJuIGRhdGEKCgp0cnk6CiAgICAjIEZvciBlbmNvZGluZyBhc2NpaSBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIGJ5dGVzdHJpbmdzLCBhcyBpcyByZXBlYXRlZGx5CiAgICAjIG5lY2Vzc2FyeSBpbiBKU09OLWJhc2VkIGNyeXB0byB1bmRlciBQeXRob24gMwogICAgdW5pY29kZQogICAgZGVmIG5hdGl2ZShzKToKICAgICAgICByZXR1cm4gcwogICAgZGVmIGJpbmFyeShzKToKICAgICAgICBpZiBpc2luc3RhbmNlKHMsIHVuaWNvZGUpOgogICAgICAgICAgICByZXR1cm4gcy5lbmNvZGUoJ2FzY2lpJykKICAgICAgICByZXR1cm4gcwpleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIG5hdGl2ZShzKToKICAgICAgICBpZiBpc2luc3RhbmNlKHMsIGJ5dGVzKToKICAgICAgICAgICAgcmV0dXJuIHMuZGVjb2RlKCdhc2NpaScpCiAgICAgICAgcmV0dXJuIHMKICAgIGRlZiBiaW5hcnkocyk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShzLCBzdHIpOgogICAgICAgICAgICByZXR1cm4gcy5lbmNvZGUoJ2FzY2lpJykKCmNsYXNzIEhhc2hpbmdGaWxlKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZmQsIGhhc2h0eXBlPSdzaGEyNTYnKToKICAgICAgICBzZWxmLmZkID0gZmQKICAgICAgICBzZWxmLmhhc2h0eXBlID0gaGFzaHR5cGUKICAgICAgICBzZWxmLmhhc2ggPSBoYXNobGliLm5ldyhoYXNodHlwZSkKICAgICAgICBzZWxmLmxlbmd0aCA9IDAKICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKToKICAgICAgICBzZWxmLmhhc2gudXBkYXRlKGRhdGEpCiAgICAgICAgc2VsZi5sZW5ndGggKz0gbGVuKGRhdGEpCiAgICAgICAgc2VsZi5mZC53cml0ZShkYXRhKQogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgIHNlbGYuZmQuY2xvc2UoKQogICAgZGVmIGRpZ2VzdChzZWxmKToKICAgICAgICBpZiBzZWxmLmhhc2h0eXBlID09ICdtZDUnOgogICAgICAgICAgICByZXR1cm4gc2VsZi5oYXNoLmhleGRpZ2VzdCgpCiAgICAgICAgZGlnZXN0ID0gc2VsZi5oYXNoLmRpZ2VzdCgpCiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaHR5cGUgKyAnPScgKyBuYXRpdmUodXJsc2FmZV9iNjRlbmNvZGUoZGlnZXN0KSkKCmNsYXNzIE9yZGVyZWREZWZhdWx0RGljdChPcmRlcmVkRGljdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBpZiBub3QgYXJnczoKICAgICAgICAgICAgc2VsZi5kZWZhdWx0X2ZhY3RvcnkgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgbm90IChhcmdzWzBdIGlzIE5vbmUgb3IgY2FsbGFibGUoYXJnc1swXSkpOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGNhbGxhYmxlIG9yIE5vbmUnKQogICAgICAgICAgICBzZWxmLmRlZmF1bHRfZmFjdG9yeSA9IGFyZ3NbMF0KICAgICAgICAgICAgYXJncyA9IGFyZ3NbMTpdCiAgICAgICAgc3VwZXIoT3JkZXJlZERlZmF1bHREaWN0LCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCgogICAgZGVmIF9fbWlzc2luZ19fIChzZWxmLCBrZXkpOgogICAgICAgIGlmIHNlbGYuZGVmYXVsdF9mYWN0b3J5IGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKGtleSkKICAgICAgICBzZWxmW2tleV0gPSBkZWZhdWx0ID0gc2VsZi5kZWZhdWx0X2ZhY3RvcnkoKQogICAgICAgIHJldHVybiBkZWZhdWx0CgppZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKICAgIGltcG9ydCBjdHlwZXMud2ludHlwZXMKICAgICMgQ1NJRExfQVBQREFUQSBmb3IgcmVmZXJlbmNlIC0gbm90IHVzZWQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCiAgICAjIGRpcnNwZWMsIHdoaWNoIHVzZXMgTE9DQUxfQVBQREFUQSBhbmQgQ09NTU9OX0FQUERBVEEgaW4gdGhhdCBvcmRlcgogICAgY3NpZGwgPSBkaWN0KENTSURMX0FQUERBVEE9MjYsIENTSURMX0xPQ0FMX0FQUERBVEE9MjgsCiAgICAgICAgICAgIENTSURMX0NPTU1PTl9BUFBEQVRBPTM1KQogICAgZGVmIGdldF9wYXRoKG5hbWUpOgogICAgICAgIFNIR0ZQX1RZUEVfQ1VSUkVOVCA9IDAKICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKGN0eXBlcy53aW50eXBlcy5NQVhfUEFUSCkKICAgICAgICBjdHlwZXMud2luZGxsLnNoZWxsMzIuU0hHZXRGb2xkZXJQYXRoVygwLCBjc2lkbFtuYW1lXSwgMCwgU0hHRlBfVFlQRV9DVVJSRU5ULCBidWYpCiAgICAgICAgcmV0dXJuIGJ1Zi52YWx1ZQoKICAgIGRlZiBzYXZlX2NvbmZpZ19wYXRoKCpyZXNvdXJjZSk6CiAgICAgICAgYXBwZGF0YSA9IGdldF9wYXRoKCJDU0lETF9MT0NBTF9BUFBEQVRBIikKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGFwcGRhdGEsICpyZXNvdXJjZSkKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihwYXRoKToKICAgICAgICAgICAgb3MubWFrZWRpcnMocGF0aCkKICAgICAgICByZXR1cm4gcGF0aAogICAgZGVmIGxvYWRfY29uZmlnX3BhdGhzKCpyZXNvdXJjZSk6CiAgICAgICAgaWRzID0gWyJDU0lETF9MT0NBTF9BUFBEQVRBIiwgIkNTSURMX0NPTU1PTl9BUFBEQVRBIl0KICAgICAgICBmb3IgaWQgaW4gaWRzOgogICAgICAgICAgICBiYXNlID0gZ2V0X3BhdGgoaWQpCiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oYmFzZSwgKnJlc291cmNlKQogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKICAgICAgICAgICAgICAgIHlpZWxkIHBhdGgKZWxzZToKICAgIGRlZiBzYXZlX2NvbmZpZ19wYXRoKCpyZXNvdXJjZSk6CiAgICAgICAgaW1wb3J0IHhkZy5CYXNlRGlyZWN0b3J5CiAgICAgICAgcmV0dXJuIHhkZy5CYXNlRGlyZWN0b3J5LnNhdmVfY29uZmlnX3BhdGgoKnJlc291cmNlKQogICAgZGVmIGxvYWRfY29uZmlnX3BhdGhzKCpyZXNvdXJjZSk6CiAgICAgICAgaW1wb3J0IHhkZy5CYXNlRGlyZWN0b3J5CiAgICAgICAgcmV0dXJuIHhkZy5CYXNlRGlyZWN0b3J5LmxvYWRfY29uZmlnX3BhdGhzKCpyZXNvdXJjZSkKCmRlZiBtYXRjaGVzX3JlcXVpcmVtZW50KHJlcSwgd2hlZWxzKToKICAgICIiIkxpc3Qgb2Ygd2hlZWxzIG1hdGNoaW5nIGEgcmVxdWlyZW1lbnQuCgogICAgOnBhcmFtIHJlcTogVGhlIHJlcXVpcmVtZW50IHRvIHNhdGlzZnkKICAgIDpwYXJhbSB3aGVlbHM6IExpc3Qgb2Ygd2hlZWxzIHRvIHNlYXJjaC4KICAgICIiIgogICAgdHJ5OgogICAgICAgIGZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgRGlzdHJpYnV0aW9uLCBSZXF1aXJlbWVudAogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2Fubm90IHVzZSByZXF1aXJlbWVudHMgd2l0aG91dCBwa2dfcmVzb3VyY2VzIikKCiAgICByZXEgPSBSZXF1aXJlbWVudC5wYXJzZShyZXEpCgogICAgc2VsZWN0ZWQgPSBbXQogICAgZm9yIHdmIGluIHdoZWVsczoKICAgICAgICBmID0gd2YucGFyc2VkX2ZpbGVuYW1lCiAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihwcm9qZWN0X25hbWU9Zi5ncm91cCgibmFtZSIpLCB2ZXJzaW9uPWYuZ3JvdXAoInZlciIpKQogICAgICAgIGlmIGRpc3QgaW4gcmVxOgogICAgICAgICAgICBzZWxlY3RlZC5hcHBlbmQod2YpCiAgICByZXR1cm4gc2VsZWN0ZWQKUEsDBBQAAAAAAAAAIQDztOQotx4AALceAAArAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvd2luaW5zdDJ3aGVlbC5weSMhL3Vzci9iaW4vZW52IHB5dGhvbgppbXBvcnQgb3MucGF0aAppbXBvcnQgcmUKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHdoZWVsLmJkaXN0X3doZWVsCmltcG9ydCBkaXN0dXRpbHMuZGlzdApmcm9tIGRpc3R1dGlscy5hcmNoaXZlX3V0aWwgaW1wb3J0IG1ha2VfYXJjaGl2ZQpmcm9tIHNodXRpbCBpbXBvcnQgcm10cmVlCmZyb20gd2hlZWwuYXJjaGl2ZSBpbXBvcnQgYXJjaGl2ZV93aGVlbGZpbGUKZnJvbSBhcmdwYXJzZSBpbXBvcnQgQXJndW1lbnRQYXJzZXIKZnJvbSBnbG9iIGltcG9ydCBpZ2xvYgoKZWdnX2luZm9fcmUgPSByZS5jb21waWxlKHInJycoXnwvKSg/UDxuYW1lPlteL10rPyktKD9QPHZlcj4uKz8pCiAgICAoLSg/UDxweXZlcj4uKz8pKT8oLSg/UDxhcmNoPi4rPykpPy5lZ2ctaW5mbygvfCQpJycnLCByZS5WRVJCT1NFKQoKZGVmIHBhcnNlX2luZm8od2luaW5mb19uYW1lLCBlZ2dpbmZvX25hbWUpOgogICAgIiIiRXh0cmFjdCBtZXRhZGF0YSBmcm9tIGZpbGVuYW1lcy4KICAgIAogICAgRXh0cmFjdHMgdGhlIDQgbWV0YWRhdGFpdGVtcyBuZWVkZWQgKG5hbWUsIHZlcnNpb24sIHB5dmVyc2lvbiwgYXJjaCkgZnJvbQogICAgdGhlIGluc3RhbGxlciBmaWxlbmFtZSBhbmQgdGhlIG5hbWUgb2YgdGhlIGVnZy1pbmZvIGRpcmVjdG9yeSBlbWJlZGRlZCBpbgogICAgdGhlIHppcGZpbGUgKGlmIGFueSkuCgogICAgVGhlIGVnZ2luZm8gZmlsZW5hbWUgaGFzIHRoZSBmb3JtYXQ6OgoKICAgICAgICBuYW1lLXZlcigtcHl2ZXIpKC1hcmNoKS5lZ2ctaW5mbwoKICAgIFRoZSBpbnN0YWxsZXIgZmlsZW5hbWUgaGFzIHRoZSBmb3JtYXQ6OgoKICAgICAgICBuYW1lLXZlci5hcmNoKC1weXZlcikuZXhlCgogICAgU29tZSB0aGluZ3MgdG8gbm90ZToKCiAgICAxLiBUaGUgaW5zdGFsbGVyIGZpbGVuYW1lIGlzIG5vdCBkZWZpbml0aXZlLiBBbiBpbnN0YWxsZXIgY2FuIGJlIHJlbmFtZWQKICAgICAgIGFuZCB3b3JrIHBlcmZlY3RseSB3ZWxsIGFzIGFuIGluc3RhbGxlci4gU28gbW9yZSByZWxpYWJsZSBkYXRhIHNob3VsZAogICAgICAgYmUgdXNlZCB3aGVuZXZlciBwb3NzaWJsZS4KICAgIDIuIFRoZSBlZ2ctaW5mbyBkYXRhIHNob3VsZCBiZSBwcmVmZXJyZWQgZm9yIHRoZSBuYW1lIGFuZCB2ZXJzaW9uLCBiZWNhdXNlCiAgICAgICB0aGVzZSBjb21lIHN0cmFpZ2h0IGZyb20gdGhlIGRpc3R1dGlscyBtZXRhZGF0YSwgYW5kIGFyZSBtYW5kYXRvcnkuCiAgICAzLiBUaGUgcHl2ZXIgZnJvbSB0aGUgZWdnLWluZm8gZGF0YSBzaG91bGQgYmUgaWdub3JlZCwgYXMgaXQgaXMKICAgICAgIGNvbnN0cnVjdGVkIGZyb20gdGhlIHZlcnNpb24gb2YgUHl0aG9uIHVzZWQgdG8gYnVpbGQgdGhlIGluc3RhbGxlciwKICAgICAgIHdoaWNoIGlzIGlycmVsZXZhbnQgLSB0aGUgaW5zdGFsbGVyIGZpbGVuYW1lIGlzIGNvcnJlY3QgaGVyZSAoZXZlbiB0bwogICAgICAgdGhlIHBvaW50IHRoYXQgd2hlbiBpdCdzIG5vdCB0aGVyZSwgYW55IHZlcnNpb24gaXMgaW1wbGllZCkuCiAgICA0LiBUaGUgYXJjaGl0ZWN0dXJlIG11c3QgYmUgdGFrZW4gZnJvbSB0aGUgaW5zdGFsbGVyIGZpbGVuYW1lLCBhcyBpdCBpcwogICAgICAgbm90IGluY2x1ZGVkIGluIHRoZSBlZ2ctaW5mbyBkYXRhLgogICAgNS4gQXJjaGl0ZWN0dXJlLW5ldXRyYWwgaW5zdGFsbGVycyBzdGlsbCBoYXZlIGFuIGFyY2hpdGVjdHVyZSBiZWNhdXNlIHRoZQogICAgICAgaW5zdGFsbGVyIGZvcm1hdCBpdHNlbGYgKGJlaW5nIGV4ZWN1dGFibGUpIGlzIGFyY2hpdGVjdHVyZS1zcGVjaWZpYy4gV2UKICAgICAgIHNob3VsZCB0aGVyZWZvcmUgaWdub3JlIHRoZSBhcmNoaXRlY3R1cmUgaWYgdGhlIGNvbnRlbnQgaXMgcHVyZS1weXRob24uCiAgICAiIiIKCiAgICBlZ2dpbmZvID0gTm9uZQogICAgaWYgZWdnaW5mb19uYW1lOgogICAgICAgIGVnZ2luZm8gPSBlZ2dfaW5mb19yZS5zZWFyY2goZWdnaW5mb19uYW1lKQogICAgICAgIGlmIG5vdCBlZ2dpbmZvOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJFZ2cgaW5mbyBmaWxlbmFtZSAlcyBpcyBub3QgdmFsaWQiICUKICAgICAgICAgICAgICAgICAgICAoZWdnaW5mb19uYW1lLCkpCgogICAgIyBQYXJzZSB0aGUgd2luaW5zdCBmaWxlbmFtZQogICAgIyAxLiBEaXN0cmlidXRpb24gbmFtZSAodXAgdG8gdGhlIGZpcnN0ICctJykKICAgIHdfbmFtZSwgc2VwLCByZXN0ID0gd2luaW5mb19uYW1lLnBhcnRpdGlvbignLScpCiAgICBpZiBub3Qgc2VwOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkluc3RhbGxlciBmaWxlbmFtZSAlcyBpcyBub3QgdmFsaWQiICUKICAgICAgICAgICAgICAgICh3aW5pbmZvX25hbWUsKSkKICAgICMgU3RyaXAgJy5leGUnCiAgICByZXN0ID0gcmVzdFs6LTRdCiAgICAjIDIuIFB5dGhvbiB2ZXJzaW9uIChmcm9tIHRoZSBsYXN0ICctJywgbXVzdCBzdGFydCB3aXRoICdweScpCiAgICByZXN0Miwgc2VwLCB3X3B5dmVyID0gcmVzdC5ycGFydGl0aW9uKCctJykKICAgIGlmIHNlcCBhbmQgd19weXZlci5zdGFydHN3aXRoKCdweScpOgogICAgICAgIHJlc3QgPSByZXN0MgogICAgICAgIHdfcHl2ZXIgPSB3X3B5dmVyLnJlcGxhY2UoJy4nLCAnJykKICAgIGVsc2U6CiAgICAgICAgIyBOb3QgdmVyc2lvbiBzcGVjaWZpYyAtIHVzZSBweTIucHkzLiBXaGlsZSBpdCBpcyBwb3NzaWJsZSB0aGF0CiAgICAgICAgIyBwdXJlLVB5dGhvbiBjb2RlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggYm90aCBQeXRob24gMiBhbmQgMywgdGhlcmUKICAgICAgICAjIGlzIG5vIHdheSBvZiBrbm93aW5nIGZyb20gdGhlIHdpbmluc3QgZm9ybWF0LCBzbyB3ZSBhc3N1bWUgdGhlIGJlc3QKICAgICAgICAjIGhlcmUgKHRoZSB1c2VyIGNhbiBhbHdheXMgbWFudWFsbHkgcmVuYW1lIHRoZSB3aGVlbCB0byBiZSBtb3JlCiAgICAgICAgIyByZXN0cmljdGl2ZSBpZiBuZWVkZWQpLgogICAgICAgIHdfcHl2ZXIgPSAncHkyLnB5MycKICAgICMgMy4gVmVyc2lvbiBhbmQgYXJjaGl0ZWN0dXJlCiAgICB3X3Zlciwgc2VwLCB3X2FyY2ggPSByZXN0LnJwYXJ0aXRpb24oJy4nKQogICAgaWYgbm90IHNlcDoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnN0YWxsZXIgZmlsZW5hbWUgJXMgaXMgbm90IHZhbGlkIiAlCiAgICAgICAgICAgICAgICAod2luaW5mb19uYW1lLCkpCgogICAgaWYgZWdnaW5mbzoKICAgICAgICB3X25hbWUgPSBlZ2dpbmZvLmdyb3VwKCduYW1lJykKICAgICAgICB3X3ZlciA9IGVnZ2luZm8uZ3JvdXAoJ3ZlcicpCgogICAgcmV0dXJuIGRpY3QobmFtZT13X25hbWUsIHZlcj13X3ZlciwgYXJjaD13X2FyY2gsIHB5dmVyPXdfcHl2ZXIpCgpkZWYgYmRpc3Rfd2luaW5zdDJ3aGVlbChwYXRoLCBkZXN0X2Rpcj1vcy5wYXRoLmN1cmRpcik6CiAgICBiZHcgPSB6aXBmaWxlLlppcEZpbGUocGF0aCkKCiAgICAjIFNlYXJjaCBmb3IgZWdnLWluZm8gaW4gdGhlIGFyY2hpdmUKICAgIGVnZ2luZm9fbmFtZSA9IE5vbmUKICAgIGZvciBmaWxlbmFtZSBpbiBiZHcubmFtZWxpc3QoKToKICAgICAgICBpZiAnLmVnZy1pbmZvJyBpbiBmaWxlbmFtZToKICAgICAgICAgICAgZWdnaW5mb19uYW1lID0gZmlsZW5hbWUKICAgICAgICAgICAgYnJlYWsKCiAgICBpbmZvID0gcGFyc2VfaW5mbyhvcy5wYXRoLmJhc2VuYW1lKHBhdGgpLCBlZ2dpbmZvX25hbWUpCgogICAgcm9vdF9pc19wdXJlbGliID0gVHJ1ZQogICAgZm9yIHppcGluZm8gaW4gYmR3LmluZm9saXN0KCk6CiAgICAgICAgaWYgemlwaW5mby5maWxlbmFtZS5zdGFydHN3aXRoKCdQTEFUTElCJyk6CiAgICAgICAgICAgIHJvb3RfaXNfcHVyZWxpYiA9IEZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICBpZiByb290X2lzX3B1cmVsaWI6CiAgICAgICAgcGF0aHMgPSB7J3B1cmVsaWInOiAnJ30KICAgIGVsc2U6CiAgICAgICAgcGF0aHMgPSB7J3BsYXRsaWInOiAnJ30KCiAgICBkaXN0X2luZm8gPSAiJShuYW1lKXMtJSh2ZXIpcyIgJSBpbmZvCiAgICBkYXRhZGlyID0gIiVzLmRhdGEvIiAlIGRpc3RfaW5mbwoKICAgICMgcmV3cml0ZSBwYXRocyB0byB0cmljayBaaXBGaWxlIGludG8gZXh0cmFjdGluZyBhbiBlZ2cKICAgICMgWFhYIGdyYWIgd2luaW5zdCAuaW5pIC0gYmV0d2VlbiAuZXhlLCBwYWRkaW5nLCBhbmQgZmlyc3QgemlwIGZpbGUuCiAgICBtZW1iZXJzID0gW10KICAgIGVnZ2luZm9fbmFtZSA9ICcnCiAgICBmb3IgemlwaW5mbyBpbiBiZHcuaW5mb2xpc3QoKToKICAgICAgICBrZXksIGJhc2VuYW1lID0gemlwaW5mby5maWxlbmFtZS5zcGxpdCgnLycsIDEpCiAgICAgICAga2V5ID0ga2V5Lmxvd2VyKCkKICAgICAgICBiYXNlcGF0aCA9IHBhdGhzLmdldChrZXksIE5vbmUpCiAgICAgICAgaWYgYmFzZXBhdGggaXMgTm9uZToKICAgICAgICAgICAgYmFzZXBhdGggPSBkYXRhZGlyICsga2V5Lmxvd2VyKCkgKyAnLycKICAgICAgICBvbGRuYW1lID0gemlwaW5mby5maWxlbmFtZQogICAgICAgIG5ld25hbWUgPSBiYXNlcGF0aCArIGJhc2VuYW1lCiAgICAgICAgemlwaW5mby5maWxlbmFtZSA9IG5ld25hbWUKICAgICAgICBkZWwgYmR3Lk5hbWVUb0luZm9bb2xkbmFtZV0KICAgICAgICBiZHcuTmFtZVRvSW5mb1tuZXduYW1lXSA9IHppcGluZm8KICAgICAgICAjIENvbGxlY3QgbWVtYmVyIG5hbWVzLCBidXQgb21pdCAnJyAoZnJvbSBhbiBlbnRyeSBsaWtlICJQTEFUTElCLyIKICAgICAgICBpZiBuZXduYW1lOgogICAgICAgICAgICBtZW1iZXJzLmFwcGVuZChuZXduYW1lKQogICAgICAgICMgUmVtZW1iZXIgZWdnLWluZm8gbmFtZSBmb3IgdGhlIGVnZzJkaXN0IGNhbGwgYmVsb3cKICAgICAgICBpZiBub3QgZWdnaW5mb19uYW1lOgogICAgICAgICAgICBpZiBuZXduYW1lLmVuZHN3aXRoKCcuZWdnLWluZm8nKToKICAgICAgICAgICAgICAgIGVnZ2luZm9fbmFtZSA9IG5ld25hbWUKICAgICAgICAgICAgZWxpZiAnLmVnZy1pbmZvLycgaW4gbmV3bmFtZToKICAgICAgICAgICAgICAgIGVnZ2luZm9fbmFtZSwgc2VwLCBfID0gbmV3bmFtZS5ycGFydGl0aW9uKCcvJykKICAgIGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoc3VmZml4PSJfYjJ3IikKICAgIGJkdy5leHRyYWN0YWxsKGRpciwgbWVtYmVycykKCiAgICAjIGVnZzJ3aGVlbAogICAgYWJpID0gJ25vbmUnCiAgICBweXZlciA9IGluZm9bJ3B5dmVyJ10KICAgIGFyY2ggPSAoaW5mb1snYXJjaCddIG9yICdhbnknKS5yZXBsYWNlKCcuJywgJ18nKS5yZXBsYWNlKCctJywgJ18nKQogICAgIyBXaW5pbnN0IGluc3RhbGxlcnMgYWx3YXlzIGhhdmUgYXJjaCBldmVuIGlmIHRoZXkgYXJlIG5vdAogICAgIyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgKGJlY2F1c2UgdGhlIGZvcm1hdCBpdHNlbGYgaXMpLgogICAgIyBTbywgYXNzdW1lIHRoZSBjb250ZW50IGlzIGFyY2hpdGVjdHVyZS1uZXV0cmFsIGlmIHJvb3QgaXMgcHVyZWxpYi4KICAgIGlmIHJvb3RfaXNfcHVyZWxpYjoKICAgICAgICBhcmNoID0gJ2FueScKICAgICMgSWYgdGhlIGluc3RhbGxlciBpcyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMsIGl0J3MgYWxtb3N0IGNlcnRhaW5seSBhbHNvCiAgICAjIENQeXRob24tc3BlY2lmaWMuCiAgICBpZiBhcmNoICE9ICdhbnknOgogICAgICAgIHB5dmVyID0gcHl2ZXIucmVwbGFjZSgncHknLCAnY3AnKQogICAgd2hlZWxfbmFtZSA9ICctJy5qb2luKCgKICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0X2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHl2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWJpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFyY2gKICAgICAgICAgICAgICAgICAgICAgICAgICApKQogICAgaWYgcm9vdF9pc19wdXJlbGliOgogICAgICAgIGJ3ID0gd2hlZWwuYmRpc3Rfd2hlZWwuYmRpc3Rfd2hlZWwoZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uKCkpCiAgICBlbHNlOgogICAgICAgIGJ3ID0gX2JkaXN0X3doZWVsX3RhZyhkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb24oKSkKCiAgICBidy5yb290X2lzX3B1cmUgPSByb290X2lzX3B1cmVsaWIKICAgIGJ3LnB5dGhvbl90YWcgPSBweXZlcgogICAgYncucGxhdF9uYW1lX3N1cHBsaWVkID0gVHJ1ZQogICAgYncucGxhdF9uYW1lID0gaW5mb1snYXJjaCddIG9yICdhbnknCgogICAgaWYgbm90IHJvb3RfaXNfcHVyZWxpYjoKICAgICAgICBidy5mdWxsX3RhZ19zdXBwbGllZCA9IFRydWUKICAgICAgICBidy5mdWxsX3RhZyA9IChweXZlciwgYWJpLCBhcmNoKQoKICAgIGRpc3RfaW5mb19kaXIgPSBvcy5wYXRoLmpvaW4oZGlyLCAnJXMuZGlzdC1pbmZvJyAlIGRpc3RfaW5mbykKICAgIGJ3LmVnZzJkaXN0KG9zLnBhdGguam9pbihkaXIsIGVnZ2luZm9fbmFtZSksIGRpc3RfaW5mb19kaXIpCiAgICBidy53cml0ZV93aGVlbGZpbGUoZGlzdF9pbmZvX2RpciwgZ2VuZXJhdG9yPSd3aW5pbnN0MndoZWVsJykKICAgIGJ3LndyaXRlX3JlY29yZChkaXIsIGRpc3RfaW5mb19kaXIpCiAgICAKICAgIGFyY2hpdmVfd2hlZWxmaWxlKG9zLnBhdGguam9pbihkZXN0X2Rpciwgd2hlZWxfbmFtZSksIGRpcikKICAgIHJtdHJlZShkaXIpCgoKY2xhc3MgX2JkaXN0X3doZWVsX3RhZyh3aGVlbC5iZGlzdF93aGVlbC5iZGlzdF93aGVlbCk6CiAgICAjIGFsbG93IHRoZSBjbGllbnQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZ2VuZXJhdGVkIHdoZWVsIHRhZwogICAgIyBUaGUgZGVmYXVsdCBiZGlzdF93aGVlbCBpbXBsZW1lbnRhdGlvbiB1c2VzIHB5dGhvbiBhbmQgYWJpIHRhZ3MKICAgICMgb2YgdGhlIHJ1bm5pbmcgcHl0aG9uIHByb2Nlc3MuIFRoaXMgaXMgbm90IHN1aXRhYmxlIGZvcgogICAgIyBnZW5lcmF0aW5nL3JlcGFja2FnaW5nIHByZWJ1aWxkIGJpbmFyaWVzLgoKICAgIGZ1bGxfdGFnX3N1cHBsaWVkID0gRmFsc2UKICAgIGZ1bGxfdGFnID0gTm9uZSAgIyBOb25lIG9yIGEgKHB5dGFnLCBzb2FiaXRhZywgcGxhdHRhZykgdHJpcGxlCgogICAgZGVmIGdldF90YWcoc2VsZik6CiAgICAgICAgaWYgc2VsZi5mdWxsX3RhZ19zdXBwbGllZCBhbmQgc2VsZi5mdWxsX3RhZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZnVsbF90YWcKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX2JkaXN0X3doZWVsX3RhZywgc2VsZikuZ2V0X3RhZygpCgoKZGVmIG1haW4oKToKICAgIHBhcnNlciA9IEFyZ3VtZW50UGFyc2VyKCkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2luc3RhbGxlcnMnLCBuYXJncz0nKicsIGhlbHA9Ikluc3RhbGxlcnMgdG8gY29udmVydCIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWRlc3QtZGlyJywgJy1kJywgZGVmYXVsdD1vcy5wYXRoLmN1cmRpciwKICAgICAgICAgICAgaGVscD0iRGlyZWN0b3J5IHRvIHN0b3JlIHdoZWVscyAoZGVmYXVsdCAlKGRlZmF1bHQpcykiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywgJy12JywgYWN0aW9uPSdzdG9yZV90cnVlJykKICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAgICBmb3IgcGF0IGluIGFyZ3MuaW5zdGFsbGVyczoKICAgICAgICBmb3IgaW5zdGFsbGVyIGluIGlnbG9iKHBhdCk6CiAgICAgICAgICAgIGlmIGFyZ3MudmVyYm9zZToKICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoInswfS4uLiAiLmZvcm1hdChpbnN0YWxsZXIpKQogICAgICAgICAgICBiZGlzdF93aW5pbnN0MndoZWVsKGluc3RhbGxlciwgYXJncy5kZXN0X2RpcikKICAgICAgICAgICAgaWYgYXJncy52ZXJib3NlOgogICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiT0tcbiIpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWFpbigpClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAJQAAAHJ1bGVzX3B5dGhvbi9ydWxlc19weXRob24vX19pbml0X18ucHlQSwMEFAAAAAAAAAAhACyKqssfMgAAHzIAACEAAABydWxlc19weXRob24vcnVsZXNfcHl0aG9uL3BpcHRvb2wjIS91c3IvYmluL2VudiBweXRob24KCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgc3VicHJvY2VzcwppbXBvcnQgemlwZmlsZQoKIyBSZXR1cm4gVHJ1ZSBpZiBydW5uaW5nIG9uIFdpbmRvd3MKZGVmIElzV2luZG93cygpOgogIHJldHVybiBvcy5uYW1lID09ICdudCcKCmRlZiBHZXRXaW5kb3dzUGF0aFdpdGhVTkNQcmVmaXgocGF0aCk6CiAgIiIiCiAgQWRkaW5nIFVOQyBwcmVmaXggYWZ0ZXIgZ2V0dGluZyBhIG5vcm1hbGl6ZWQgYWJzb2x1dGUgV2luZG93cyBwYXRoLAogIGl0J3Mgbm8tb3AgZm9yIG5vbi1XaW5kb3dzIHBsYXRmb3JtcyBvciBpZiBydW5uaW5nIHVuZGVyIHB5dGhvbjIuCiAgIiIiCiAgcGF0aCA9IHBhdGguc3RyaXAoKQoKICAjIE5vIG5lZWQgdG8gYWRkIHByZWZpeCBmb3Igbm9uLVdpbmRvd3MgcGxhdGZvcm1zLgogICMgQW5kIFxcP1wgZG9lc24ndCB3b3JrIGluIHB5dGhvbiAyCiAgaWYgbm90IElzV2luZG93cygpIG9yIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgogICAgcmV0dXJuIHBhdGgKCiAgIyBMZXRzIHN0YXJ0IHRoZSB1bmljb2RlIGZ1bgogIHVuaWNvZGVfcHJlZml4ID0gIlxcXFw/XFwiCiAgaWYgcGF0aC5zdGFydHN3aXRoKHVuaWNvZGVfcHJlZml4KToKICAgIHJldHVybiBwYXRoCgogICMgb3MucGF0aC5hYnNwYXRoIHJldHVybnMgYSBub3JtYWxpemVkIGFic29sdXRlIHBhdGgKICByZXR1cm4gdW5pY29kZV9wcmVmaXggKyBvcy5wYXRoLmFic3BhdGgocGF0aCkKCmRlZiBIYXNXaW5kb3dzRXhlY3V0YWJsZUV4dGVuc2lvbihwYXRoKToKICByZXR1cm4gcGF0aC5lbmRzd2l0aCgnLmV4ZScpIG9yIHBhdGguZW5kc3dpdGgoJy5jb20nKSBvciBwYXRoLmVuZHN3aXRoKCcuYmF0JykKClBZVEhPTl9CSU5BUlkgPSAnYmF6ZWxfdG9vbHMvdG9vbHMvcHl0aG9uL3B5M3dyYXBwZXIuc2gnCmlmIElzV2luZG93cygpIGFuZCBub3QgSGFzV2luZG93c0V4ZWN1dGFibGVFeHRlbnNpb24oUFlUSE9OX0JJTkFSWSk6CiAgUFlUSE9OX0JJTkFSWSA9IFBZVEhPTl9CSU5BUlkgKyAnLmV4ZScKCiMgRmluZCBhIGZpbGUgaW4gYSBnaXZlbiBzZWFyY2ggcGF0aC4KZGVmIFNlYXJjaFBhdGgobmFtZSk6CiAgc2VhcmNoX3BhdGggPSBvcy5nZXRlbnYoJ1BBVEgnLCBvcy5kZWZwYXRoKS5zcGxpdChvcy5wYXRoc2VwKQogIGZvciBkaXJlY3RvcnkgaW4gc2VhcmNoX3BhdGg6CiAgICBpZiBkaXJlY3RvcnkgPT0gJyc6IGNvbnRpbnVlCiAgICBwYXRoID0gb3MucGF0aC5qb2luKGRpcmVjdG9yeSwgbmFtZSkKICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpIGFuZCBvcy5hY2Nlc3MocGF0aCwgb3MuWF9PSyk6CiAgICAgIHJldHVybiBwYXRoCiAgcmV0dXJuIE5vbmUKCmRlZiBJc1J1bm5pbmdGcm9tWmlwKCk6CiAgcmV0dXJuIEZhbHNlCgojIEZpbmQgdGhlIHJlYWwgUHl0aG9uIGJpbmFyeSBpZiBpdCdzIG5vdCBhIG5vcm1hbCBhYnNvbHV0ZSBwYXRoCmRlZiBGaW5kUHl0aG9uQmluYXJ5KG1vZHVsZV9zcGFjZSk6CiAgaWYgUFlUSE9OX0JJTkFSWS5zdGFydHN3aXRoKCcvLycpOgogICAgIyBDYXNlIDE6IFBhdGggaXMgYSBsYWJlbC4gTm90IHN1cHBvcnRlZCB5ZXQuCiAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgJ0JhemVsIGRvZXMgbm90IHN1cHBvcnQgZXhlY3V0aW9uIG9mIFB5dGhvbiBpbnRlcnByZXRlcnMgdmlhIGxhYmVscyB5ZXQnKQogIGVsaWYgb3MucGF0aC5pc2FicyhQWVRIT05fQklOQVJZKToKICAgICMgQ2FzZSAyOiBBYnNvbHV0ZSBwYXRoLgogICAgcmV0dXJuIFBZVEhPTl9CSU5BUlkKICAjIFVzZSBub3JtcGF0aCgpIHRvIGNvbnZlcnQgc2xhc2hlcyB0byBvcy5zZXAgb24gV2luZG93cy4KICBlbGlmIG9zLnNlcCBpbiBvcy5wYXRoLm5vcm1wYXRoKFBZVEhPTl9CSU5BUlkpOgogICAgIyBDYXNlIDM6IFBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdC4KICAgIHJldHVybiBvcy5wYXRoLmpvaW4obW9kdWxlX3NwYWNlLCBQWVRIT05fQklOQVJZKQogIGVsc2U6CiAgICAjIENhc2UgNDogUGF0aCBoYXMgdG8gYmUgbG9va2VkIHVwIGluIHRoZSBzZWFyY2ggcGF0aC4KICAgIHJldHVybiBTZWFyY2hQYXRoKFBZVEhPTl9CSU5BUlkpCgpkZWYgQ3JlYXRlUHl0aG9uUGF0aEVudHJpZXMocHl0aG9uX2ltcG9ydHMsIG1vZHVsZV9zcGFjZSk6CiAgcGFydHMgPSBweXRob25faW1wb3J0cy5zcGxpdCgnOicpOwogIHJldHVybiBbbW9kdWxlX3NwYWNlXSArIFsiJXMvJXMiICUgKG1vZHVsZV9zcGFjZSwgcGF0aCkgZm9yIHBhdGggaW4gcGFydHNdCgojIEZpbmQgdGhlIHJ1bmZpbGVzIHRyZWUKZGVmIEZpbmRNb2R1bGVTcGFjZSgpOgogIHN0dWJfZmlsZW5hbWUgPSBzeXMuYXJndlswXQogIGlmIG5vdCBvcy5wYXRoLmlzYWJzKHN0dWJfZmlsZW5hbWUpOgogICAgc3R1Yl9maWxlbmFtZSA9IG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgc3R1Yl9maWxlbmFtZSkKCiAgd2hpbGUgVHJ1ZToKICAgIG1vZHVsZV9zcGFjZSA9IHN0dWJfZmlsZW5hbWUgKyAoJy5leGUnIGlmIElzV2luZG93cygpIGVsc2UgJycpICsgJy5ydW5maWxlcycKICAgIGlmIG9zLnBhdGguaXNkaXIobW9kdWxlX3NwYWNlKToKICAgICAgcmV0dXJuIG1vZHVsZV9zcGFjZQoKICAgIHJ1bmZpbGVzX3BhdHRlcm4gPSByJyguKlwucnVuZmlsZXMpJyArIChyJ1xcJyBpZiBJc1dpbmRvd3MoKSBlbHNlICcvJykgKyAnLionCiAgICBtYXRjaG9iaiA9IHJlLm1hdGNoKHJ1bmZpbGVzX3BhdHRlcm4sIHN0dWJfZmlsZW5hbWUpCiAgICBpZiBtYXRjaG9iajoKICAgICAgcmV0dXJuIG1hdGNob2JqLmdyb3VwKDEpCgogICAgaWYgbm90IG9zLnBhdGguaXNsaW5rKHN0dWJfZmlsZW5hbWUpOgogICAgICBicmVhawogICAgdGFyZ2V0ID0gb3MucmVhZGxpbmsoc3R1Yl9maWxlbmFtZSkKICAgIGlmIG9zLnBhdGguaXNhYnModGFyZ2V0KToKICAgICAgc3R1Yl9maWxlbmFtZSA9IHRhcmdldAogICAgZWxzZToKICAgICAgc3R1Yl9maWxlbmFtZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoc3R1Yl9maWxlbmFtZSksIHRhcmdldCkKCiAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ0Nhbm5vdCBmaW5kIC5ydW5maWxlcyBkaXJlY3RvcnkgZm9yICVzJyAlIHN5cy5hcmd2WzBdKQoKZGVmIEV4dHJhY3RaaXAoemlwX3BhdGgsIGRlc3RfZGlyKToKICAiIiJFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSwgcHJlc2VydmluZyB0aGUgdW5peCBmaWxlIG1vZGUgYml0cy4KCiAgVGhlc2UgaW5jbHVkZSB0aGUgcGVybWlzc2lvbiBiaXRzLCBhbmQgaW4gcGFydGljdWxhciwgdGhlIGV4ZWN1dGFibGUgYml0LgoKICBJZGVhbGx5IHRoZSB6aXBmaWxlIG1vZHVsZSBzaG91bGQgc2V0IHRoZXNlIGJpdHMsIGJ1dCBpdCBkb2Vzbid0LiBTZWU6CiAgaHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxNTc5NS4KCiAgQXJnczoKICAgICAgemlwX3BhdGg6IFRoZSBwYXRoIHRvIHRoZSB6aXAgZmlsZSB0byBleHRyYWN0CiAgICAgIGRlc3RfZGlyOiBUaGUgcGF0aCB0byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5CiAgIiIiCiAgemlwX3BhdGggPSBHZXRXaW5kb3dzUGF0aFdpdGhVTkNQcmVmaXgoemlwX3BhdGgpCiAgZGVzdF9kaXIgPSBHZXRXaW5kb3dzUGF0aFdpdGhVTkNQcmVmaXgoZGVzdF9kaXIpCiAgd2l0aCB6aXBmaWxlLlppcEZpbGUoemlwX3BhdGgpIGFzIHpmOgogICAgZm9yIGluZm8gaW4gemYuaW5mb2xpc3QoKToKICAgICAgemYuZXh0cmFjdChpbmZvLCBkZXN0X2RpcikKICAgICAgIyBVTkMtcHJlZml4ZWQgcGF0aHMgbXVzdCBiZSBhYnNvbHV0ZS9ub3JtYWxpemVkLiBTZWUKICAgICAgIyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy93aW5kb3dzL2Rlc2t0b3AvZmlsZWlvL25hbWluZy1hLWZpbGUjbWF4aW11bS1wYXRoLWxlbmd0aC1saW1pdGF0aW9uCiAgICAgIGZpbGVfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oZGVzdF9kaXIsIGluZm8uZmlsZW5hbWUpKQogICAgICAjIFRoZSBVbml4IHN0X21vZGUgYml0cyAoc2VlICJtYW4gNyBpbm9kZSIpIGFyZSBzdG9yZWQgaW4gdGhlIHVwcGVyIDE2CiAgICAgICMgYml0cyBvZiBleHRlcm5hbF9hdHRyLiBPZiB0aG9zZSwgd2Ugc2V0IHRoZSBsb3dlciAxMiBiaXRzLCB3aGljaCBhcmUgdGhlCiAgICAgICMgZmlsZSBtb2RlIGJpdHMgKHNpbmNlIHRoZSBmaWxlIHR5cGUgYml0cyBjYW4ndCBiZSBzZXQgYnkgY2htb2QgYW55d2F5KS4KICAgICAgYXR0cnMgPSBpbmZvLmV4dGVybmFsX2F0dHIgPj4gMTYKICAgICAgaWYgYXR0cnMgIT0gMDogICMgUnVtb3IgaGFzIGl0IHRoZXNlIGNhbiBiZSAwIGZvciB6aXBzIGNyZWF0ZWQgb24gV2luZG93cy4KICAgICAgICBvcy5jaG1vZChmaWxlX3BhdGgsIGF0dHJzICYgMG83Nzc3KQoKIyBDcmVhdGUgdGhlIHJ1bmZpbGVzIHRyZWUgYnkgZXh0cmFjdGluZyB0aGUgemlwIGZpbGUKZGVmIENyZWF0ZU1vZHVsZVNwYWNlKCk6CiAgdGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCIiLCAiQmF6ZWwucnVuZmlsZXNfIikKICBFeHRyYWN0WmlwKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksIHRlbXBfZGlyKQogIHJldHVybiBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJydW5maWxlcyIpCgojIFJldHVybnMgcmVwb3NpdG9yeSByb290cyB0byBhZGQgdG8gdGhlIGltcG9ydCBwYXRoLgpkZWYgR2V0UmVwb3NpdG9yaWVzSW1wb3J0cyhtb2R1bGVfc3BhY2UsIGltcG9ydF9hbGwpOgogIGlmIGltcG9ydF9hbGw6CiAgICByZXBvX2RpcnMgPSBbb3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgZCkgZm9yIGQgaW4gb3MubGlzdGRpcihtb2R1bGVfc3BhY2UpXQogICAgcmV0dXJuIFtkIGZvciBkIGluIHJlcG9fZGlycyBpZiBvcy5wYXRoLmlzZGlyKGQpXQogIHJldHVybiBbb3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgInJ1bGVzX3B5dGhvbiIpXQoKIyBGaW5kcyB0aGUgcnVuZmlsZXMgbWFuaWZlc3Qgb3IgdGhlIHJ1bmZpbGVzIGRpcmVjdG9yeS4KZGVmIFJ1bmZpbGVzRW52dmFyKG1vZHVsZV9zcGFjZSk6CiAgIyBJZiB0aGlzIGJpbmFyeSBpcyB0aGUgZGF0YS1kZXBlbmRlbmN5IG9mIGFub3RoZXIgb25lLCB0aGUgb3RoZXIgc2V0cwogICMgUlVORklMRVNfTUFOSUZFU1RfRklMRSBvciBSVU5GSUxFU19ESVIgZm9yIG91ciBzYWtlLgogIHJ1bmZpbGVzID0gb3MuZW52aXJvbi5nZXQoJ1JVTkZJTEVTX01BTklGRVNUX0ZJTEUnLCBOb25lKQogIGlmIHJ1bmZpbGVzOgogICAgcmV0dXJuICgnUlVORklMRVNfTUFOSUZFU1RfRklMRScsIHJ1bmZpbGVzKQoKICBydW5maWxlcyA9IG9zLmVudmlyb24uZ2V0KCdSVU5GSUxFU19ESVInLCBOb25lKQogIGlmIHJ1bmZpbGVzOgogICAgcmV0dXJuICgnUlVORklMRVNfRElSJywgcnVuZmlsZXMpCgogICMgSWYgcnVubmluZyBmcm9tIGEgemlwLCB0aGVyZSdzIG5vIG1hbmlmZXN0IGZpbGUuCiAgaWYgSXNSdW5uaW5nRnJvbVppcCgpOgogICAgcmV0dXJuICgnUlVORklMRVNfRElSJywgbW9kdWxlX3NwYWNlKQoKICAjIExvb2sgZm9yIHRoZSBydW5maWxlcyAib3V0cHV0IiBtYW5pZmVzdCwgYXJndlswXSArICIucnVuZmlsZXNfbWFuaWZlc3QiCiAgcnVuZmlsZXMgPSBtb2R1bGVfc3BhY2UgKyAnX21hbmlmZXN0JwogIGlmIG9zLnBhdGguZXhpc3RzKHJ1bmZpbGVzKToKICAgIHJldHVybiAoJ1JVTkZJTEVTX01BTklGRVNUX0ZJTEUnLCBydW5maWxlcykKCiAgIyBMb29rIGZvciB0aGUgcnVuZmlsZXMgImlucHV0IiBtYW5pZmVzdCwgYXJndlswXSArICIucnVuZmlsZXMvTUFOSUZFU1QiCiAgcnVuZmlsZXMgPSBvcy5wYXRoLmpvaW4obW9kdWxlX3NwYWNlLCAnTUFOSUZFU1QnKQogIGlmIG9zLnBhdGguZXhpc3RzKHJ1bmZpbGVzKToKICAgIHJldHVybiAoJ1JVTkZJTEVTX0RJUicsIHJ1bmZpbGVzKQoKICAjIElmIHJ1bm5pbmcgaW4gYSBzYW5kYm94IGFuZCBubyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNldCwgdGhlbgogICMgTG9vayBmb3IgdGhlIHJ1bmZpbGVzICBuZXh0IHRvIHRoZSBiaW5hcnkuCiAgaWYgbW9kdWxlX3NwYWNlLmVuZHN3aXRoKCcucnVuZmlsZXMnKSBhbmQgb3MucGF0aC5pc2Rpcihtb2R1bGVfc3BhY2UpOgogICAgcmV0dXJuICgnUlVORklMRVNfRElSJywgbW9kdWxlX3NwYWNlKQoKICByZXR1cm4gKE5vbmUsIE5vbmUpCgojIFRPRE8oIzY0NDMpOiBSZW1vdmUgdGhpcyBvbmNlIHRoZXJlJ3Mgbm8gbG9uZ2VyIGEgaG9zdCBjb25maWd1cmF0aW9uIGZvcgojIFB5dGhvbiB0YXJnZXRzIHRvIGFwcGVhciBpbi4KZGVmIE1heWJlRW1pdEhvc3RWZXJzaW9uV2FybmluZyhyZXRfY29kZSk6CiAgIiIiV2FybiB0aGUgdXNlciBpZiBhIGZhaWx1cmUgbWF5IGJlIGR1ZSB0byB0aGUgaG9zdCBjb25maWcncyB2ZXJzaW9uLgoKICBUaGlzIGVtaXRzIGEgbWVzc2FnZSB0byBzdGRlcnIgaWYKICAgIDEpIHJldF9jb2RlIGlzIG5vbi16ZXJvLAogICAgMikgdGhlIHRhcmdldCB3YXMgYnVpbHQgaW4gdGhlIGhvc3QgY29uZmlnIGFuZCB3aXRoIHRvb2xjaGFpbnMgZW5hYmxlZCwgYW5kCiAgICAzKSBhdCBhbmFseXNpcyB0aW1lIHdlIGRldGVjdGVkIGEgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgaG9zdCBjb25maWcncyB2ZXJzaW9uCiAgICAgICBhbmQgdGhpcyB0YXJnZXQncyBleHBsaWNpdGx5IGRlY2xhcmVkIHZlcnNpb24sIG9yIGVsc2UgdGhpcyB0YXJnZXQgZGlkCiAgICAgICBub3QgZXhwbGljaXRseSBkZWNsYXJlIGl0cyB2ZXJzaW9uLiAoVGhlIGZvcm1lciBkaWFnbm9zZXMgdGFyZ2V0cwogICAgICAgYWZmZWN0ZWQgYnkgIzY0NDMsIGFuZCB0aGUgbGF0dGVyIGRpYWdub3NlcyB0YXJnZXRzIHRoYXQgYXJlIGJyb2tlbiBieQogICAgICAgZml4aW5nICM0ODE1LikKCiAgU2VlIGFsc28gIzc4OTksICM4NTQ5LCBhbmQgUHlDb21tb24jc2hvdWxkV2FybkFib3V0SG9zdFZlcnNpb25VcG9uRmFpbHVyZS4KCiAgU2luY2UgdGhpcyB3YXJuaW5nIGlzIGVtaXR0ZWQgaGVyZSBpbiB0aGUgc3R1YiBzY3JpcHQgYW5kIG5vdCBpbiBCYXplbCBpdHNlbGYsCiAgaXQgd2lsbCBiZSBwcmVzZW50IGluIGFsbCBmYWlsaW5nIHJ1bnMgb2YgYWZmZWN0ZWQgdGFyZ2V0cywgZXZlbiB3aGVuIGV4ZWN1dGVkCiAgZGlyZWN0bHkgYW5kIG5vdCB2aWEgYGJhemVsIHJ1bmAuIEhvd2V2ZXIsIG5vdGUgdGhhdCB0aGlzIHdhcm5pbmcgaXMgbmV2ZXIKICBhZGRlZCB0byBub24taG9zdC1jb25maWd1cmVkIHRhcmdldHMsIGFuZCB0aGF0IGl0IGNhbiBiZSBkaXNhYmxlZCBieSBlbnN1cmluZwogIHRoZSBjb3JyZWN0IFB5dGhvbiB2ZXJzaW9uIGlzIHBhc3NlZCB0byAtLWhvc3RfZm9yY2VfcHl0aG9uIGFuZCBkZWNsYXJlZCBpbgogIHRvb2xzJyBweXRob25fdmVyc2lvbiBhdHRyaWJ1dGVzLgoKICBBcmdzOgogICAgICByZXRfY29kZTogVGhlIGV4aXQgY29kZSBvZiB0aGUgcGF5bG9hZCB1c2VyIHByb2dyYW0KICAiIiIKICBpZiByZXRfY29kZSA9PSAwOgogICAgcmV0dXJuCiAgaWYgbm90IEZhbHNlOgogICAgcmV0dXJuCgogIGhvc3RfdmVyc2lvbiA9ICIzIgogIHRhcmdldF92ZXJzaW9uID0gIjMiCiAgb3Bwb3NpdGVfb2ZfaG9zdF92ZXJzaW9uID0gIjIiIGlmIGhvc3RfdmVyc2lvbiA9PSAiMyIgZWxzZSAiMyIKCiAgaWYgRmFsc2U6CiAgICAjIE1pc21hdGNoIHdpdGggZXhwbGljaXRseSBkZWNsYXJlZCB2ZXJzaW9uLgogICAgZGlhZ25vc3RpYyA9ICIiIlwKTm90ZTogVGhlIGZhaWx1cmUgb2YgdGFyZ2V0IHt0YXJnZXR9ICh3aXRoIGV4aXQgY29kZSB7cmV0X2NvZGV9KSBtYXkgaGF2ZSBiZWVuIFwKY2F1c2VkIGJ5IHRoZSBmYWN0IHRoYXQgaXQgaXMgYSBQeXRob24ge3RhcmdldF92ZXJzaW9ufSBwcm9ncmFtIHRoYXQgd2FzIGJ1aWx0IFwKaW4gdGhlIGhvc3QgY29uZmlndXJhdGlvbiwgd2hpY2ggdXNlcyBQeXRob24ge2hvc3RfdmVyc2lvbn0uIFlvdSBjYW4gY2hhbmdlIFwKdGhlIGhvc3QgY29uZmlndXJhdGlvbiAoZm9yIHRoZSBlbnRpcmUgYnVpbGQpIHRvIGluc3RlYWQgdXNlIFB5dGhvbiBcCnt0YXJnZXRfdmVyc2lvbn0gYnkgc2V0dGluZyAtLWhvc3RfZm9yY2VfcHl0aG9uPVBZe3RhcmdldF92ZXJzaW9ufS5cCiIiIi5mb3JtYXQoCiAgICB0YXJnZXQ9Ii8vcnVsZXNfcHl0aG9uOnBpcHRvb2wiLAogICAgcmV0X2NvZGU9cmV0X2NvZGUsCiAgICB0YXJnZXRfdmVyc2lvbj10YXJnZXRfdmVyc2lvbiwKICAgIGhvc3RfdmVyc2lvbj1ob3N0X3ZlcnNpb24pCiAgZWxzZToKICAgIGRpYWdub3N0aWMgPSAiIiJcCk5vdGU6IFRoZSBmYWlsdXJlIG9mIHRhcmdldCB7dGFyZ2V0fSAod2l0aCBleGl0IGNvZGUge3JldF9jb2RlfSkgbWF5IGhhdmUgYmVlbiBcCmNhdXNlZCBieSB0aGUgZmFjdCB0aGF0IGl0IGlzIHJ1bm5pbmcgdW5kZXIgUHl0aG9uIHtob3N0X3ZlcnNpb259IGluc3RlYWQgb2YgXApQeXRob24ge29wcG9zaXRlX29mX2hvc3RfdmVyc2lvbn0uIEV4YW1pbmUgdGhlIGVycm9yIHRvIGRldGVybWluZSBpZiB0aGF0IFwKYXBwZWFycyB0byBiZSB0aGUgcHJvYmxlbS4gU2luY2UgdGhpcyB0YXJnZXQgaXMgYnVpbHQgaW4gdGhlIGhvc3QgXApjb25maWd1cmF0aW9uLCB0aGUgb25seSB3YXkgdG8gY2hhbmdlIGl0cyB2ZXJzaW9uIGlzIHRvIHNldCBcCi0taG9zdF9mb3JjZV9weXRob249UFl7b3Bwb3NpdGVfb2ZfaG9zdF92ZXJzaW9ufSwgd2hpY2ggYWZmZWN0cyB0aGUgZW50aXJlIFwKYnVpbGQuXAoiIiIuZm9ybWF0KAogICAgdGFyZ2V0PSIvL3J1bGVzX3B5dGhvbjpwaXB0b29sIiwKICAgIHJldF9jb2RlPXJldF9jb2RlLAogICAgaG9zdF92ZXJzaW9uPWhvc3RfdmVyc2lvbiwKICAgIG9wcG9zaXRlX29mX2hvc3RfdmVyc2lvbj1vcHBvc2l0ZV9vZl9ob3N0X3ZlcnNpb24pCgogICMgVE9ETyhicmFuZGpvbik6IENoYW5nZSB0aGUgd29yZGluZyAiWW91IGFyZSBsaWtlbHkgc2VlaW5nIHRoaXMgbWVzc2FnZQogICMgYmVjYXVzZSIgdG8gc29tZXRoaW5nIGxlc3Mgc3Ryb25nIGFmdGVyIGEgZmV3IHJlbGVhc2VzIGZyb20gMC4yNy4gQnkgdGhhdAogICMgcG9pbnQsIG1pZ3JhdGlvbiBmb3IgdG9vbGNoYWlucyB3b24ndCBiZSB0aGUgbWFpbiByZWFzb24gdGhpcyBlcnJvciBpcyBzZWVuCiAgIyBieSB1c2Vycy4KICBtZXNzYWdlID0gIiIiXAotLS0tLS0tLS0tLS0tLS0tCntkaWFnbm9zdGljfQoKSWYgdGhpcyBlcnJvciBzdGFydGVkIG9jY3VycmluZyBpbiBCYXplbCAwLjI3IGFuZCBsYXRlciwgaXQgbWF5IGJlIGJlY2F1c2UgdGhlIFwKUHl0aG9uIHRvb2xjaGFpbiBub3cgZW5mb3JjZXMgdGhhdCB0YXJnZXRzIGFuYWx5emVkIGFzIFBZMiBhbmQgUFkzIHJ1biB1bmRlciBhIFwKUHl0aG9uIDIgYW5kIFB5dGhvbiAzIGludGVycHJldGVyLCByZXNwZWN0aXZlbHkuIFNlZSBcCmh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL2JhemVsL2lzc3Vlcy83ODk5IGZvciBtb3JlIGluZm9ybWF0aW9uLgotLS0tLS0tLS0tLS0tLS0tIiIiLmZvcm1hdChkaWFnbm9zdGljPWRpYWdub3N0aWMpCiAgcHJpbnQobWVzc2FnZSwgZmlsZT1zeXMuc3RkZXJyKQoKZGVmIE1haW4oKToKICBhcmdzID0gc3lzLmFyZ3ZbMTpdCgogIG5ld19lbnYgPSB7fQoKICBpZiBJc1J1bm5pbmdGcm9tWmlwKCk6CiAgICBtb2R1bGVfc3BhY2UgPSBDcmVhdGVNb2R1bGVTcGFjZSgpCiAgZWxzZToKICAgIG1vZHVsZV9zcGFjZSA9IEZpbmRNb2R1bGVTcGFjZSgpCgogIHB5dGhvbl9pbXBvcnRzID0gJ3B5cGlfX3NldHVwdG9vbHNfMzhfMl80OnB5cGlfX3BpcF85XzBfMzpweXBpX193aGVlbF8wXzMwXzBhMCcKICBweXRob25fcGF0aF9lbnRyaWVzID0gQ3JlYXRlUHl0aG9uUGF0aEVudHJpZXMocHl0aG9uX2ltcG9ydHMsIG1vZHVsZV9zcGFjZSkKICBweXRob25fcGF0aF9lbnRyaWVzICs9IEdldFJlcG9zaXRvcmllc0ltcG9ydHMobW9kdWxlX3NwYWNlLCBUcnVlKQoKICBweXRob25fcGF0aF9lbnRyaWVzID0gW0dldFdpbmRvd3NQYXRoV2l0aFVOQ1ByZWZpeChkKSBmb3IgZCBpbiBweXRob25fcGF0aF9lbnRyaWVzXQoKICBvbGRfcHl0aG9uX3BhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcpCiAgcHl0aG9uX3BhdGggPSBvcy5wYXRoc2VwLmpvaW4ocHl0aG9uX3BhdGhfZW50cmllcykKICBpZiBvbGRfcHl0aG9uX3BhdGg6CiAgICBweXRob25fcGF0aCArPSBvcy5wYXRoc2VwICsgb2xkX3B5dGhvbl9wYXRoCgogIGlmIElzV2luZG93cygpOgogICAgcHl0aG9uX3BhdGggPSBweXRob25fcGF0aC5yZXBsYWNlKCIvIiwgb3Muc2VwKQoKICBuZXdfZW52WydQWVRIT05QQVRIJ10gPSBweXRob25fcGF0aAogIHJ1bmZpbGVzX2VudmtleSwgcnVuZmlsZXNfZW52dmFsdWUgPSBSdW5maWxlc0VudnZhcihtb2R1bGVfc3BhY2UpCiAgaWYgcnVuZmlsZXNfZW52a2V5OgogICAgbmV3X2VudltydW5maWxlc19lbnZrZXldID0gcnVuZmlsZXNfZW52dmFsdWUKCiAgIyBOb3cgbG9vayBmb3IgbXkgbWFpbiBweXRob24gc291cmNlIGZpbGUuCiAgIyBUaGUgbWFnaWMgc3RyaW5nIHBlcmNlbnQtbWFpbi1wZXJjZW50IGlzIHJlcGxhY2VkIHdpdGggdGhlIGZpbGVuYW1lIG9mIHRoZQogICMgbWFpbiBmaWxlIG9mIHRoZSBQeXRob24gYmluYXJ5IGluIEJhemVsUHl0aG9uU2VtYW50aWNzLmphdmEuCiAgcmVsX3BhdGggPSAncnVsZXNfcHl0aG9uL3J1bGVzX3B5dGhvbi9waXB0b29sLnB5JwogIGlmIElzV2luZG93cygpOgogICAgcmVsX3BhdGggPSByZWxfcGF0aC5yZXBsYWNlKCIvIiwgb3Muc2VwKQoKICBtYWluX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgcmVsX3BhdGgpCiAgbWFpbl9maWxlbmFtZSA9IEdldFdpbmRvd3NQYXRoV2l0aFVOQ1ByZWZpeChtYWluX2ZpbGVuYW1lKQogIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhtYWluX2ZpbGVuYW1lKSwgXAogICAgICAgICAnQ2Fubm90IGV4ZWMoKSAlcjogZmlsZSBub3QgZm91bmQuJyAlIG1haW5fZmlsZW5hbWUKICBhc3NlcnQgb3MuYWNjZXNzKG1haW5fZmlsZW5hbWUsIG9zLlJfT0spLCBcCiAgICAgICAgICdDYW5ub3QgZXhlYygpICVyOiBmaWxlIG5vdCByZWFkYWJsZS4nICUgbWFpbl9maWxlbmFtZQoKICBwcm9ncmFtID0gcHl0aG9uX3Byb2dyYW0gPSBGaW5kUHl0aG9uQmluYXJ5KG1vZHVsZV9zcGFjZSkKICBpZiBweXRob25fcHJvZ3JhbSBpcyBOb25lOgogICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHB5dGhvbiBiaW5hcnk6ICcgKyBQWVRIT05fQklOQVJZKQogIGFyZ3MgPSBbcHl0aG9uX3Byb2dyYW0sIG1haW5fZmlsZW5hbWVdICsgYXJncwoKICBvcy5lbnZpcm9uLnVwZGF0ZShuZXdfZW52KQoKICB0cnk6CiAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKICAgIGlmIElzUnVubmluZ0Zyb21aaXAoKToKICAgICAgIyBJZiBSVU5fVU5ERVJfUlVORklMRVMgZXF1YWxzIDEsIGl0IG1lYW5zIHdlIG5lZWQgdG8KICAgICAgIyBjaGFuZ2UgZGlyZWN0b3J5IHRvIHRoZSByaWdodCBydW5maWxlcyBkaXJlY3RvcnkuCiAgICAgICMgKFNvIHRoYXQgdGhlIGRhdGEgZmlsZXMgYXJlIGFjY2Vzc2libGUpCiAgICAgIGlmIG9zLmVudmlyb24uZ2V0KCJSVU5fVU5ERVJfUlVORklMRVMiKSA9PSAiMSI6CiAgICAgICAgb3MuY2hkaXIob3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgInJ1bGVzX3B5dGhvbiIpKQogICAgICByZXRfY29kZSA9IHN1YnByb2Nlc3MuY2FsbChhcmdzKQogICAgICBzaHV0aWwucm10cmVlKG9zLnBhdGguZGlybmFtZShtb2R1bGVfc3BhY2UpLCBUcnVlKQogICAgICBNYXliZUVtaXRIb3N0VmVyc2lvbldhcm5pbmcocmV0X2NvZGUpCiAgICAgIHN5cy5leGl0KHJldF9jb2RlKQogICAgZWxzZToKICAgICAgIyBPbiBXaW5kb3dzLCBvcy5leGVjdiBkb2Vzbid0IGhhbmRsZSBhcmd1bWVudHMgd2l0aCBzcGFjZXMgY29ycmVjdGx5LAogICAgICAjIGFuZCBpdCBhY3R1YWxseSBzdGFydHMgYSBzdWJwcm9jZXNzIGp1c3QgbGlrZSBzdWJwcm9jZXNzLmNhbGwuCiAgICAgICMKICAgICAgIyBJZiB3ZSBtYXkgbmVlZCB0byBlbWl0IGEgaG9zdCBjb25maWcgd2FybmluZyBhZnRlciBleGVjdXRpb24sIGRvbid0CiAgICAgICMgZXhlY3YgYmVjYXVzZSB3ZSBuZWVkIGNvbnRyb2wgdG8gcmV0dXJuIGhlcmUuIFRoaXMgb25seSBoYXBwZW5zIGZvcgogICAgICAjIHRhcmdldHMgYnVpbHQgaW4gdGhlIGhvc3QgY29uZmlnLCBzbyBvdGhlciB0YXJnZXRzIHN0aWxsIGdldCB0byB0YWtlCiAgICAgICMgYWR2YW50YWdlIG9mIHRoZSBwZXJmb3JtYW5jZSBiZW5lZml0cyBvZiBleGVjdi4KICAgICAgaWYgSXNXaW5kb3dzKCkgb3IgRmFsc2U6CiAgICAgICAgcmV0X2NvZGUgPSBzdWJwcm9jZXNzLmNhbGwoYXJncykKICAgICAgICBNYXliZUVtaXRIb3N0VmVyc2lvbldhcm5pbmcocmV0X2NvZGUpCiAgICAgICAgc3lzLmV4aXQocmV0X2NvZGUpCiAgICAgIGVsc2U6CiAgICAgICAgb3MuZXhlY3YoYXJnc1swXSwgYXJncykKICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKICAgICMgVGhpcyB3b3JrcyBmcm9tIFB5dGhvbiAyLjQgYWxsIHRoZSB3YXkgdG8gMy54LgogICAgZSA9IHN5cy5leGNfaW5mbygpWzFdCiAgICAjIFRoaXMgZXhjZXB0aW9uIG9jY3VycyB3aGVuIG9zLmV4ZWN2KCkgZmFpbHMgZm9yIHNvbWUgcmVhc29uLgogICAgaWYgbm90IGdldGF0dHIoZSwgJ2ZpbGVuYW1lJywgTm9uZSk6CiAgICAgIGUuZmlsZW5hbWUgPSBwcm9ncmFtICAjIEFkZCBpbmZvIHRvIGVycm9yIG1lc3NhZ2UKICAgIHJhaXNlCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogIE1haW4oKQpQSwMEFAAAAAAAAAAhAMBoHY8PHQAADx0AACQAAABydWxlc19weXRob24vcnVsZXNfcHl0aG9uL3BpcHRvb2wucHkjIENvcHlyaWdodCAyMDE3IFRoZSBCYXplbCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgojCiMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgojIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAojCiMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiIiIlRoZSBwaXB0b29sIG1vZHVsZSBpbXBvcnRzIHBpcCByZXF1aXJlbWVudHMgaW50byBCYXplbCBydWxlcy4iIiIKCmltcG9ydCBhcmdwYXJzZQppbXBvcnQgYXRleGl0CmltcG9ydCBqc29uCmltcG9ydCBvcwppbXBvcnQgcGtndXRpbAppbXBvcnQgcGtnX3Jlc291cmNlcwppbXBvcnQgcmUKaW1wb3J0IHNodXRpbAppbXBvcnQgc3lzCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgemlwZmlsZQoKIyBOb3RlOiBXZSBjYXJlZnVsbHkgaW1wb3J0IHRoZSBmb2xsb3dpbmcgbW9kdWxlcyBpbiBhIHBhcnRpY3VsYXIKIyBvcmRlciwgc2luY2UgdGhlc2UgbW9kdWxlcyBtb2RpZnkgdGhlIGltcG9ydCBwYXRoIGFuZCBtYWNoaW5lcnkuCmltcG9ydCBwa2dfcmVzb3VyY2VzCgoKZGVmIGV4dHJhY3RfcGFja2FnZXMocGFja2FnZV9uYW1lcyk6CiAgICAiIiJFeHRyYWN0IHppcGZpbGUgY29udGVudHMgdG8gZGlzayBhbmQgYWRkIHRvIGltcG9ydCBwYXRoIiIiCgogICAgIyBTZXQgYSBzYWZlIGV4dHJhY3Rpb24gZGlyCiAgICBleHRyYWN0aW9uX3RtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgYXRleGl0LnJlZ2lzdGVyKGxhbWJkYTogc2h1dGlsLnJtdHJlZSgKICAgICAgICBleHRyYWN0aW9uX3RtcGRpciwgaWdub3JlX2Vycm9ycz1UcnVlKSkKICAgIHBrZ19yZXNvdXJjZXMuc2V0X2V4dHJhY3Rpb25fcGF0aChleHRyYWN0aW9uX3RtcGRpcikKCiAgICAjIEV4dHJhY3QgZWFjaCBwYWNrYWdlIHRvIGRpc2sKICAgIGRpcnNfdG9fYWRkID0gW10KICAgIGZvciBwYWNrYWdlX25hbWUgaW4gcGFja2FnZV9uYW1lczoKICAgICAgICByZXEgPSBwa2dfcmVzb3VyY2VzLlJlcXVpcmVtZW50LnBhcnNlKHBhY2thZ2VfbmFtZSkKICAgICAgICBleHRyYWN0aW9uX2RpciA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUocmVxLCAnJykKICAgICAgICBkaXJzX3RvX2FkZC5hcHBlbmQoZXh0cmFjdGlvbl9kaXIpCgogICAgIyBBZGQgZXh0cmFjdGVkIGRpcmVjdG9yaWVzIHRvIGltcG9ydCBwYXRoIGFoZWFkIG9mIHRoZWlyIHppcCBmaWxlCiAgICAjIGNvdW50ZXJwYXJ0cy4KICAgIHN5cy5wYXRoWzA6MF0gPSBkaXJzX3RvX2FkZAogICAgZXhpc3RpbmdfcHl0aG9ucGF0aCA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJykKICAgIGlmIGV4aXN0aW5nX3B5dGhvbnBhdGg6CiAgICAgICAgZGlyc190b19hZGQuZXh0ZW5kKGV4aXN0aW5nX3B5dGhvbnBhdGguc3BsaXQoJzonKSkKICAgIG9zLmVudmlyb25bJ1BZVEhPTlBBVEgnXSA9ICc6Jy5qb2luKGRpcnNfdG9fYWRkKQoKCiMgV2hlZWwsIHBpcCwgYW5kIHNldHVwdG9vbHMgYXJlIG11Y2ggaGFwcGllciBydW5uaW5nIGZyb20gYWN0dWFsCiMgZmlsZXMgb24gZGlzaywgcmF0aGVyIHRoYW4gZW50cmllcyBpbiBhIHppcGZpbGUuICBFeHRyYWN0IHppcGZpbGUKIyBjb250ZW50cywgYWRkIHRob3NlIGNvbnRlbnRzIHRvIHRoZSBwYXRoLCB0aGVuIGltcG9ydCB0aGVtLgpleHRyYWN0X3BhY2thZ2VzKFsncGlwJywgJ3NldHVwdG9vbHMnLCAnd2hlZWwnXSkKCiMgRGVmZWF0IHBpcCdzIGF0dGVtcHQgdG8gbWFuZ2xlIHN5cy5wYXRoCnNhdmVkX3N5c19wYXRoID0gc3lzLnBhdGgKc3lzLnBhdGggPSBzeXMucGF0aFs6XQppbXBvcnQgcGlwCnN5cy5wYXRoID0gc2F2ZWRfc3lzX3BhdGgKCmltcG9ydCBzZXR1cHRvb2xzCmltcG9ydCB3aGVlbAoKCmRlZiBwaXBfbWFpbihhcmd2KToKICAgICMgRXh0cmFjdCB0aGUgY2VydGlmaWNhdGVzIGZyb20gdGhlIFBBUiBmb2xsb3dpbmcgdGhlIGV4YW1wbGUgb2YgZ2V0LXBpcC5weQogICAgIyBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9nZXQtcGlwL2Jsb2IvNDMwYmEzNzc3NmFlMmFkODkvdGVtcGxhdGUucHkjTDE2NC1MMTY4CiAgICBjZXJ0X3RtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgY2VydF9wYXRoID0gb3MucGF0aC5qb2luKGNlcnRfdG1wZGlyLCAiY2FjZXJ0LnBlbSIpCiAgICBhdGV4aXQucmVnaXN0ZXIobGFtYmRhOiBzaHV0aWwucm10cmVlKGNlcnRfdG1wZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpKQogICAgd2l0aCBvcGVuKGNlcnRfcGF0aCwgIndiIikgYXMgY2VydDoKICAgICAgY2VydC53cml0ZShwa2d1dGlsLmdldF9kYXRhKCJwaXAuX3ZlbmRvci5yZXF1ZXN0cyIsICJjYWNlcnQucGVtIikpCiAgICBhcmd2ID0gWyItLWRpc2FibGUtcGlwLXZlcnNpb24tY2hlY2siLCAiLS1jZXJ0IiwgY2VydF9wYXRoXSArIGFyZ3YKICAgIHJldHVybiBwaXAubWFpbihhcmd2KQoKZnJvbSBydWxlc19weXRob24ud2hsIGltcG9ydCBXaGVlbAoKcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCiAgICBkZXNjcmlwdGlvbj0nSW1wb3J0IFB5dGhvbiBkZXBlbmRlbmNpZXMgaW50byBCYXplbC4nKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1uYW1lJywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSBuYW1lc3BhY2Ugb2YgdGhlIGltcG9ydC4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0taW5wdXQnLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVGhlIHJlcXVpcmVtZW50cy50eHQgZmlsZSB0byBpbXBvcnQuJykpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW91dHB1dCcsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9KCdUaGUgcmVxdWlyZW1lbnRzLmJ6bCBmaWxlIHRvIGV4cG9ydC4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tZGlyZWN0b3J5JywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0byBwdXQgLndobCBmaWxlcy4nKSkKCmRlZiBkZXRlcm1pbmVfcG9zc2libGVfZXh0cmFzKHdobHMpOgogICIiIkRldGVybWluZXMgdGhlIGxpc3Qgb2YgcG9zc2libGUgImV4dHJhcyIgZm9yIGVhY2ggLndobAoKICBUaGUgcG9zc2liaWxpdHkgb2YgYW4gZXh0cmEgaXMgZGV0ZXJtaW5lZCBieSBsb29raW5nIGF0IGl0cwogIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzLCBhbmQgZGV0ZXJtaW5pbmUgd2hldGhlciB0aGV5IGFyZQogIHNhdGlzZmllZCBieSB0aGUgY29tcGxldGUgbGlzdCBvZiBhdmFpbGFibGUgd2hlZWxzLgoKICBBcmdzOgogICAgd2hsczogYSBsaXN0IG9mIFdoZWVsIG9iamVjdHMKCiAgUmV0dXJuczoKICAgIGEgZGljdCB0aGF0IGlzIGtleWVkIGJ5IHRoZSBXaGVlbCBvYmplY3RzIGluIHdobHMsIGFuZCB3aG9zZQogICAgdmFsdWVzIGFyZSBsaXN0cyBvZiBwb3NzaWJsZSBleHRyYXMuCiAgIiIiCiAgd2hsX21hcCA9IHsKICAgIHdobC5kaXN0cmlidXRpb24oKTogd2hsCiAgICBmb3Igd2hsIGluIHdobHMKICB9CgogICMgVE9ETyhtYXR0bW9vcik6IENvbnNpZGVyIG1lbW9pemluZyBpZiB0aGlzIHJlY3Vyc2lvbiBldmVyIGJlY29tZXMKICAjIGV4cGVuc2l2ZSBlbm91Z2ggdG8gd2FycmFudCBpdC4KICBkZWYgaXNfcG9zc2libGUoZGlzdHJvLCBleHRyYSk6CiAgICBkaXN0cm8gPSBkaXN0cm8ucmVwbGFjZSgiLSIsICJfIikKICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgLndobCBhdCBhbGwsIHRoZW4gdGhpcyBpc24ndCBwb3NzaWJsZS4KICAgIGlmIGRpc3RybyBub3QgaW4gd2hsX21hcDoKICAgICAgcmV0dXJuIEZhbHNlCiAgICB3aGwgPSB3aGxfbWFwW2Rpc3Ryb10KICAgICMgSWYgd2UgaGF2ZSB0aGUgLndobCwgYW5kIHdlIGRvbid0IG5lZWQgYW55dGhpbmcgZXh0cmEgdGhlbgogICAgIyB3ZSBjYW4gc2F0aXNmeSB0aGlzIGRlcGVuZGVuY3kuCiAgICBpZiBub3QgZXh0cmE6CiAgICAgIHJldHVybiBUcnVlCiAgICAjIElmIHdlIGRvIG5lZWQgc29tZXRoaW5nIGV4dHJhLCB0aGVuIGNoZWNrIHRoZSBleHRyYSdzCiAgICAjIGRlcGVuZGVuY2llcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgZnVsbHkgc2F0aXNmaWVkLgogICAgZm9yIGV4dHJhX2RlcCBpbiB3aGwuZGVwZW5kZW5jaWVzKGV4dHJhPWV4dHJhKToKICAgICAgcmVxID0gcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZShleHRyYV9kZXApCiAgICAgICMgQ2hlY2sgdGhhdCB0aGUgZGVwIGFuZCBhbnkgZXh0cmFzIGFyZSBhbGwgcG9zc2libGUuCiAgICAgIGlmIG5vdCBpc19wb3NzaWJsZShyZXEucHJvamVjdF9uYW1lLCBOb25lKToKICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgZm9yIGUgaW4gcmVxLmV4dHJhczoKICAgICAgICBpZiBub3QgaXNfcG9zc2libGUocmVxLnByb2plY3RfbmFtZSwgZSk6CiAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICMgSWYgYWxsIG9mIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGV4dHJhIGFyZSBzYXRpc2ZpYWJsZSB0aGVuCiAgICAjIGl0IGlzIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCB0aGlzIGRlcGVuZGVuY3kuCiAgICByZXR1cm4gVHJ1ZQoKICByZXR1cm4gewogICAgd2hsOiBbCiAgICAgIGV4dHJhCiAgICAgIGZvciBleHRyYSBpbiB3aGwuZXh0cmFzKCkKICAgICAgaWYgaXNfcG9zc2libGUod2hsLmRpc3RyaWJ1dGlvbigpLCBleHRyYSkKICAgIF0KICAgIGZvciB3aGwgaW4gd2hscwogIH0KCmRlZiBtYWluKCk6CiAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKCiAgIyBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvYmxvYi85LjAuMS9waXAvX19pbml0X18ucHkjTDIwOQogIGlmIHBpcF9tYWluKFsid2hlZWwiLCAiLXciLCBhcmdzLmRpcmVjdG9yeSwgIi1yIiwgYXJncy5pbnB1dF0pOgogICAgc3lzLmV4aXQoMSkKCiAgIyBFbnVtZXJhdGUgdGhlIC53aGwgZmlsZXMgd2UgZG93bmxvYWRlZC4KICBkZWYgbGlzdF93aGxzKCk6CiAgICBkaXIgPSBhcmdzLmRpcmVjdG9yeSArICcvJwogICAgZm9yIHJvb3QsIHVudXNlZF9kaXJuYW1lcywgZmlsZW5hbWVzIGluIG9zLndhbGsoZGlyKToKICAgICAgZm9yIGZuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICBpZiBmbmFtZS5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHJvb3QsIGZuYW1lKQoKICB3aGxzID0gW1doZWVsKHBhdGgpIGZvciBwYXRoIGluIGxpc3Rfd2hscygpXQogIHBvc3NpYmxlX2V4dHJhcyA9IGRldGVybWluZV9wb3NzaWJsZV9leHRyYXMod2hscykKCiAgZGVmIHdobF9saWJyYXJ5KHdoZWVsKToKICAgICMgSW5kZW50YXRpb24gaGVyZSBtYXR0ZXJzLiAgd2hsX2xpYnJhcnkgbXVzdCBiZSB3aXRoaW4gdGhlIHNjb3BlCiAgICAjIG9mIHRoZSBmdW5jdGlvbiBiZWxvdy4gIFdlIGFsc28gYXZvaWQgcmVpbXBvcnRpbmcgYW4gZXhpc3RpbmcgV0hMLgogICAgcmV0dXJuICIiIgogIGlmICJ7cmVwb19uYW1lfSIgbm90IGluIG5hdGl2ZS5leGlzdGluZ19ydWxlcygpOgogICAgd2hsX2xpYnJhcnkoCiAgICAgICAgbmFtZSA9ICJ7cmVwb19uYW1lfSIsCiAgICAgICAgd2hsID0gIkB7bmFtZX0vLzp7cGF0aH0iLAogICAgICAgIHJlcXVpcmVtZW50cyA9ICJAe25hbWV9Ly86cmVxdWlyZW1lbnRzLmJ6bCIsCiAgICAgICAgZXh0cmFzID0gW3tleHRyYXN9XQogICAgKSIiIi5mb3JtYXQobmFtZT1hcmdzLm5hbWUsIHJlcG9fbmFtZT13aGVlbC5yZXBvc2l0b3J5X25hbWUoKSwKICAgICAgICAgICAgICAgIHBhdGg9d2hlZWwuYmFzZW5hbWUoKSwKICAgICAgICAgICAgICAgIGV4dHJhcz0nLCcuam9pbihbCiAgICAgICAgICAgICAgICAgICciJXMiJyAlIGV4dHJhCiAgICAgICAgICAgICAgICAgIGZvciBleHRyYSBpbiBwb3NzaWJsZV9leHRyYXMuZ2V0KHdoZWVsLCBbXSkKICAgICAgICAgICAgICAgIF0pKQoKICB3aGxfdGFyZ2V0cyA9ICcsJy5qb2luKFsKICAgICcsJy5qb2luKFsKICAgICAgJyIlcyI6ICJAJXMvLzpwa2ciJyAlICh3aGwuZGlzdHJpYnV0aW9uKCkubG93ZXIoKSwgd2hsLnJlcG9zaXRvcnlfbmFtZSgpKQogICAgXSArIFsKICAgICAgIyBGb3IgZXZlcnkgZXh0cmEgdGhhdCBpcyBwb3NzaWJsZSBmcm9tIHRoaXMgcmVxdWlyZW1lbnRzLnR4dAogICAgICAnIiVzWyVzXSI6ICJAJXMvLzolcyInICUgKHdobC5kaXN0cmlidXRpb24oKS5sb3dlcigpLCBleHRyYS5sb3dlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdobC5yZXBvc2l0b3J5X25hbWUoKSwgZXh0cmEpCiAgICAgIGZvciBleHRyYSBpbiBwb3NzaWJsZV9leHRyYXMuZ2V0KHdobCwgW10pCiAgICBdKQogICAgZm9yIHdobCBpbiB3aGxzCiAgXSkKCiAgd2l0aCBvcGVuKGFyZ3Mub3V0cHV0LCAndycpIGFzIGY6CiAgICBmLndyaXRlKCIiIlwKIyBJbnN0YWxsIHBpcCByZXF1aXJlbWVudHMuCiMKIyBHZW5lcmF0ZWQgZnJvbSB7aW5wdXR9Cgpsb2FkKCJAcnVsZXNfcHl0aG9uLy9weXRob246d2hsLmJ6bCIsICJ3aGxfbGlicmFyeSIpCgpkZWYgcGlwX2luc3RhbGwoKToKICB7d2hsX2xpYnJhcmllc30KCl9yZXF1aXJlbWVudHMgPSB7ewogIHttYXBwaW5nc30KfX0KCmFsbF9yZXF1aXJlbWVudHMgPSBfcmVxdWlyZW1lbnRzLnZhbHVlcygpCgpkZWYgcmVxdWlyZW1lbnQobmFtZSk6CiAgbmFtZV9rZXkgPSBuYW1lLnJlcGxhY2UoIi0iLCAiXyIpLmxvd2VyKCkKICBpZiBuYW1lX2tleSBub3QgaW4gX3JlcXVpcmVtZW50czoKICAgIGZhaWwoIkNvdWxkIG5vdCBmaW5kIHBpcC1wcm92aWRlZCBkZXBlbmRlbmN5OiAnJXMnIiAlIG5hbWUpCiAgcmV0dXJuIF9yZXF1aXJlbWVudHNbbmFtZV9rZXldCiIiIi5mb3JtYXQoaW5wdXQ9YXJncy5pbnB1dCwKICAgICAgICAgICB3aGxfbGlicmFyaWVzPSdcbicuam9pbihtYXAod2hsX2xpYnJhcnksIHdobHMpKSBpZiB3aGxzIGVsc2UgInBhc3MiLAogICAgICAgICAgIG1hcHBpbmdzPXdobF90YXJnZXRzKSkKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgbWFpbigpClBLAwQUAAAAAAAAACEAzk1ZsmAWAABgFgAAIAAAAHJ1bGVzX3B5dGhvbi9ydWxlc19weXRob24vd2hsLnB5IyBDb3B5cmlnaHQgMjAxNyBUaGUgQmF6ZWwgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIwojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIwojICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoiIiJUaGUgd2hsIG1vZHVsZXMgZGVmaW5lcyBjbGFzc2VzIGZvciBpbnRlcmFjdGluZyB3aXRoIFB5dGhvbiBwYWNrYWdlcy4iIiIKCmltcG9ydCBhcmdwYXJzZQppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHBrZ19yZXNvdXJjZXMKaW1wb3J0IHJlCmltcG9ydCB6aXBmaWxlCgoKY2xhc3MgV2hlZWwob2JqZWN0KToKCiAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgogICAgc2VsZi5fcGF0aCA9IHBhdGgKCiAgZGVmIHBhdGgoc2VsZik6CiAgICByZXR1cm4gc2VsZi5fcGF0aAoKICBkZWYgYmFzZW5hbWUoc2VsZik6CiAgICByZXR1cm4gb3MucGF0aC5iYXNlbmFtZShzZWxmLnBhdGgoKSkKCiAgZGVmIGRpc3RyaWJ1dGlvbihzZWxmKToKICAgICMgU2VlIGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjcvI2ZpbGUtbmFtZS1jb252ZW50aW9uCiAgICBwYXJ0cyA9IHNlbGYuYmFzZW5hbWUoKS5zcGxpdCgnLScpCiAgICByZXR1cm4gcGFydHNbMF0KCiAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAjIFNlZSBodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDI3LyNmaWxlLW5hbWUtY29udmVudGlvbgogICAgcGFydHMgPSBzZWxmLmJhc2VuYW1lKCkuc3BsaXQoJy0nKQogICAgcmV0dXJuIHBhcnRzWzFdCgogIGRlZiByZXBvc2l0b3J5X25hbWUoc2VsZik6CiAgICAjIFJldHVybnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBCYXplbCByZXBvc2l0b3J5IGZvciB0aGlzIHBhY2thZ2UuCiAgICBjYW5vbmljYWwgPSAncHlwaV9fe31fe30nLmZvcm1hdChzZWxmLmRpc3RyaWJ1dGlvbigpLCBzZWxmLnZlcnNpb24oKSkKICAgICMgRXNjYXBlIGFueSBpbGxlZ2FsIGNoYXJhY3RlcnMgd2l0aCB1bmRlcnNjb3JlLgogICAgcmV0dXJuIHJlLnN1YignWy0uK10nLCAnXycsIGNhbm9uaWNhbCkKCiAgZGVmIF9kaXN0X2luZm8oc2VsZik6CiAgICAjIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZGlzdC1pbmZvIGRpcmVjdG9yeSB3aXRoaW4gdGhlIC53aGwgZmlsZS4KICAgICMgZS5nLiBnb29nbGVfY2xvdWQtMC4yNy4wLXB5Mi5weTMtbm9uZS1hbnkud2hsIC0+CiAgICAjICAgICAgZ29vZ2xlX2Nsb3VkLTAuMjcuMC5kaXN0LWluZm8KICAgIHJldHVybiAne30te30uZGlzdC1pbmZvJy5mb3JtYXQoc2VsZi5kaXN0cmlidXRpb24oKSwgc2VsZi52ZXJzaW9uKCkpCgogIGRlZiBtZXRhZGF0YShzZWxmKToKICAgICMgRXh0cmFjdCB0aGUgc3RydWN0dXJlZCBkYXRhIGZyb20gbWV0YWRhdGEuanNvbiBpbiB0aGUgV0hMJ3MgZGlzdC1pbmZvCiAgICAjIGRpcmVjdG9yeS4KICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHNlbGYucGF0aCgpLCAncicpIGFzIHdobDoKICAgICAgIyBmaXJzdCBjaGVjayBmb3IgbWV0YWRhdGEuanNvbgogICAgICB0cnk6CiAgICAgICAgd2l0aCB3aGwub3BlbihzZWxmLl9kaXN0X2luZm8oKSArICcvbWV0YWRhdGEuanNvbicpIGFzIGY6CiAgICAgICAgICByZXR1cm4ganNvbi5sb2FkcyhmLnJlYWQoKS5kZWNvZGUoInV0Zi04IikpCiAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgIHBhc3MKICAgICAgIyBmYWxsIGJhY2sgdG8gTUVUQURBVEEgZmlsZSAoaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQyNy8pCiAgICAgIHdpdGggd2hsLm9wZW4oc2VsZi5fZGlzdF9pbmZvKCkgKyAnL01FVEFEQVRBJykgYXMgZjoKICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VfbWV0YWRhdGEoZi5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQoKICBkZWYgbmFtZShzZWxmKToKICAgIHJldHVybiBzZWxmLm1ldGFkYXRhKCkuZ2V0KCduYW1lJykKCiAgZGVmIGRlcGVuZGVuY2llcyhzZWxmLCBleHRyYT1Ob25lKToKICAgICIiIkFjY2VzcyB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoaXMgV2hlZWwuCgogICAgQXJnczoKICAgICAgZXh0cmE6IGlmIHNwZWNpZmllZCwgaW5jbHVkZSB0aGUgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgb2YgdGhlIG5hbWVkICJleHRyYSIuCgogICAgWWllbGRzOgogICAgICB0aGUgbmFtZXMgb2YgcmVxdWlyZW1lbnRzIGZyb20gdGhlIG1ldGFkYXRhLmpzb24KICAgICIiIgogICAgIyBUT0RPKG1hdHRtb29yKTogSXMgdGhlcmUgYSBzY2hlbWEgdG8gZm9sbG93IGZvciB0aGlzPwogICAgZGVwZW5kZW5jeV9zZXQgPSBzZXQoKQoKICAgIHJ1bl9yZXF1aXJlcyA9IHNlbGYubWV0YWRhdGEoKS5nZXQoJ3J1bl9yZXF1aXJlcycsIFtdKQogICAgZm9yIHJlcXVpcmVtZW50IGluIHJ1bl9yZXF1aXJlczoKICAgICAgaWYgcmVxdWlyZW1lbnQuZ2V0KCdleHRyYScpICE9IGV4dHJhOgogICAgICAgICMgTWF0Y2ggdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIGV4dHJhIHdlJ3JlIGxvb2tpbmcgZm9yLgogICAgICAgIGNvbnRpbnVlCiAgICAgIG1hcmtlciA9IHJlcXVpcmVtZW50LmdldCgnZW52aXJvbm1lbnQnKQogICAgICBpZiBtYXJrZXIgYW5kIG5vdCBwa2dfcmVzb3VyY2VzLmV2YWx1YXRlX21hcmtlcihtYXJrZXIpOgogICAgICAgICMgVGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgZG9lcyBub3QgbWF0Y2ggdGhlIHByb3ZpZGVkIFBFUCA1MDggbWFya2VyLAogICAgICAgICMgc28gaWdub3JlIHRoaXMgcmVxdWlyZW1lbnQuCiAgICAgICAgY29udGludWUKICAgICAgcmVxdWlyZXMgPSByZXF1aXJlbWVudC5nZXQoJ3JlcXVpcmVzJywgW10pCiAgICAgIGZvciBlbnRyeSBpbiByZXF1aXJlczoKICAgICAgICAjIFN0cmlwIG9mZiBhbnkgdHJhaWxpbmcgdmVyc2lvbmluZyBkYXRhLgogICAgICAgIHBhcnRzID0gcmUuc3BsaXQoJ1sgPjw9KCldJywgZW50cnkpCiAgICAgICAgZGVwZW5kZW5jeV9zZXQuYWRkKHBhcnRzWzBdKQoKICAgIHJldHVybiBkZXBlbmRlbmN5X3NldAoKICBkZWYgZXh0cmFzKHNlbGYpOgogICAgcmV0dXJuIHNlbGYubWV0YWRhdGEoKS5nZXQoJ2V4dHJhcycsIFtdKQoKICBkZWYgZXhwYW5kKHNlbGYsIGRpcmVjdG9yeSk6CiAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShzZWxmLnBhdGgoKSwgJ3InKSBhcyB3aGw6CiAgICAgIHdobC5leHRyYWN0YWxsKGRpcmVjdG9yeSkKCiAgIyBfcGFyc2VfbWV0YWRhdGEgcGFyc2VzIE1FVEFEQVRBIGZpbGVzIGFjY29yZGluZyB0byBodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wMzE0LwogIGRlZiBfcGFyc2VfbWV0YWRhdGEoc2VsZiwgY29udGVudCk6CiAgICAjIFRPRE86IGhhbmRsZSBmaWVsZHMgb3RoZXIgdGhhbiBqdXN0IG5hbWUKICAgIG5hbWVfcGF0dGVybiA9IHJlLmNvbXBpbGUoJ05hbWU6ICguKiknKQogICAgcmV0dXJuIHsgJ25hbWUnOiBuYW1lX3BhdHRlcm4uc2VhcmNoKGNvbnRlbnQpLmdyb3VwKDEpIH0KCgpwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKICAgIGRlc2NyaXB0aW9uPSdVbnBhY2sgYSBXSEwgZmlsZSBhcyBhIHB5X2xpYnJhcnkuJykKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0td2hsJywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSAud2hsIGZpbGUgd2UgYXJlIGV4cGFuZGluZy4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tcmVxdWlyZW1lbnRzJywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIHBpcF9pbXBvcnQgZnJvbSB3aGljaCB0byBkcmF3IGRlcGVuZGVuY2llcy4nKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1kaXJlY3RvcnknLCBhY3Rpb249J3N0b3JlJywgZGVmYXVsdD0nLicsCiAgICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRvIGV4cGFuZCB0aGluZ3MuJykKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tZXh0cmFzJywgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBzZXQgb2YgZXh0cmFzIGZvciB3aGljaCB0byBnZW5lcmF0ZSBsaWJyYXJ5IHRhcmdldHMuJykKCmRlZiBtYWluKCk6CiAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKICB3aGwgPSBXaGVlbChhcmdzLndobCkKCiAgIyBFeHRyYWN0IHRoZSBmaWxlcyBpbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeQogIHdobC5leHBhbmQoYXJncy5kaXJlY3RvcnkpCgogIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oYXJncy5kaXJlY3RvcnksICdCVUlMRCcpLCAndycpIGFzIGY6CiAgICBmLndyaXRlKCIiIgpwYWNrYWdlKGRlZmF1bHRfdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdKQoKbG9hZCgiQHJ1bGVzX3B5dGhvbi8vcHl0aG9uOmRlZnMuYnpsIiwgInB5X2xpYnJhcnkiKQpsb2FkKCJ7cmVxdWlyZW1lbnRzfSIsICJyZXF1aXJlbWVudCIpCgpweV9saWJyYXJ5KAogICAgbmFtZSA9ICJwa2ciLAogICAgc3JjcyA9IGdsb2IoWyIqKi8qLnB5Il0pLAogICAgZGF0YSA9IGdsb2IoWyIqKi8qIl0sIGV4Y2x1ZGU9WyIqKi8qLnB5IiwgIioqLyogKiIsICJCVUlMRCIsICJXT1JLU1BBQ0UiXSksCiAgICAjIFRoaXMgbWFrZXMgdGhpcyBkaXJlY3RvcnkgYSB0b3AtbGV2ZWwgaW4gdGhlIHB5dGhvbiBpbXBvcnQKICAgICMgc2VhcmNoIHBhdGggZm9yIGFueXRoaW5nIHRoYXQgZGVwZW5kcyBvbiB0aGlzLgogICAgaW1wb3J0cyA9IFsiLiJdLAogICAgZGVwcyA9IFt7ZGVwZW5kZW5jaWVzfV0sCikKe2V4dHJhc30iIiIuZm9ybWF0KAogIHJlcXVpcmVtZW50cz1hcmdzLnJlcXVpcmVtZW50cywKICBkZXBlbmRlbmNpZXM9JywnLmpvaW4oWwogICAgJ3JlcXVpcmVtZW50KCIlcyIpJyAlIGQKICAgIGZvciBkIGluIHdobC5kZXBlbmRlbmNpZXMoKQogIF0pLAogIGV4dHJhcz0nXG5cbicuam9pbihbCiAgICAiIiJweV9saWJyYXJ5KAogICAgbmFtZSA9ICJ7ZXh0cmF9IiwKICAgIGRlcHMgPSBbCiAgICAgICAgIjpwa2ciLHtkZXBzfQogICAgXSwKKSIiIi5mb3JtYXQoZXh0cmE9ZXh0cmEsCiAgICAgICAgICAgIGRlcHM9JywnLmpvaW4oWwogICAgICAgICAgICAgICAgJ3JlcXVpcmVtZW50KCIlcyIpJyAlIGRlcAogICAgICAgICAgICAgICAgZm9yIGRlcCBpbiB3aGwuZGVwZW5kZW5jaWVzKGV4dHJhKQogICAgICAgICAgICBdKSkKICAgIGZvciBleHRyYSBpbiBhcmdzLmV4dHJhcyBvciBbXQogIF0pKSkKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgbWFpbigpClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAEgAAAHN1YnBhci9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAGgAAAHN1YnBhci9ydW50aW1lL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQCPoHM8ty4AALcuAAAZAAAAc3VicGFyL3J1bnRpbWUvc3VwcG9ydC5weSMgQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIwojICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIwojIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAojIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgojIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiIiIlJ1bnRpbWUgc3VwcG9ydCBjb2RlIGZvciBleGVjdXRhYmxlcyBjcmVhdGVkIGJ5IFN1YnBhci4KCjEuIFRoaXJkLXBhcnR5IG1vZHVsZXMgcmVxdWlyZSBzb21lIFBZVEhPTlBBVEggbWFuaXB1bGF0aW9uLgoKMi4gUHl0aG9uIGNhbiBuYXRpdmVseSBpbXBvcnQgcHl0aG9uIG1vZHVsZXMgZnJvbSBhIHppcCBhcmNoaXZlLCBidXQKICAgQyBleHRlbnNpb24gbW9kdWxlcyByZXF1aXJlIHNvbWUgaGVscC4KCjMuIFJlc291cmNlcyBzdG9yZWQgaW4gYSAucGFyIGZpbGUgbWF5IG5lZWQgdG8gYmUgZXhwb3NlZCBhcyBPUy1sZXZlbAogICBmaWxlcyBpbnN0ZWFkIG9mIFB5dGhvbiBGaWxlIG9iamVjdHMuCgpXZSBob29rIGludG8gdGhlIHBrZ19yZXNvdXJjZXMgbW9kdWxlLCBpZiBwcmVzZW50LCB0byBhY2hpZXZlIDIgYW5kIDMuCgpMaW1pdGF0aW9uczoKCkEuIFJldHJpZXZpbmcgcmVzb3VyY2VzIGZyb20gcGFja2FnZXMKCkl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBkbyB0aGlzOgogICAgZm4gPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKCdteXBhY2thZ2UnLCAnbXlmaWxlJykKQnV0IGluc3RlYWQgb25lIG11c3QgZG8KICAgIGZuID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgKICAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMuUmVxdWlyZW1lbnQucGFyc2Uuc3BlYygnbXlwYWNrYWdlJyksCiAgICAgICAgICAgICAnbXlmaWxlJykKCkIuIEV4dHJhY3Rpb24gZGlyCgpZb3Ugc2hvdWxkIGV4cGxpY2l0bHkgc2V0IHRoZSBkZWZhdWx0IGV4dHJhY3Rpb24gZGlyZWN0b3J5LCB2aWEKYHBrZ19yZXNvdXJjZXMuc2V0X2V4dHJhY3Rpb25fcGF0aChteV9kaXJlY3RvcnkpYCwgc2luY2UgdGhlIGRlZmF1bHQKaXMgbm90IHNhZmUuICBGb3IgZXhhbXBsZToKCiAgICB0bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIHBrZ19yZXNvdXJjZXMuc2V0X2V4dHJhY3Rpb24odG1wZGlyKQoKWW91IHNob3VsZCBhcnJhbmdlIGZvciB0aGF0IGRpcmVjdG9yeSB0byBiZSBkZWxldGVkIGF0IHNvbWUgcG9pbnQuCk5vdGUgdGhhdCBwa2dfcmVzb3VyY2VzLmNsZWFudXBfcmVzb3VyY2VzKCkgaXMgYW4gdW5pbXBsZW1lbnRlZCBuby1vcCwKc28gdXNlIHNvbWV0aGluZyBlbHNlLiAgRm9yIGV4YW1wbGU6CgogICAgYXRleGl0LnJlZ2lzdGVyKGxhbWJkYTogc2h1dGlsLnJtdHJlZSh0bXBkaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkpCgoiIiIKCmltcG9ydCBhdGV4aXQKaW1wb3J0IG9zCmltcG9ydCBwa2d1dGlsCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCB6aXBmaWxlCmltcG9ydCB6aXBpbXBvcnQKCgpkZWYgX2xvZyhtc2cpOgogICAgIiIiUHJpbnQgYSBkZWJ1Z2dpbmcgbWVzc2FnZSBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgcHl0aG9uIC12diBvdXRwdXQiIiIKICAgIGlmIHN5cy5mbGFncy52ZXJib3NlOgogICAgICAgIHN5cy5zdGRlcnIud3JpdGUobXNnKQogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ1xuJykKCgpkZWYgX2ZpbmRfYXJjaGl2ZSgpOgogICAgIiIiRmluZCB0aGUgcGF0aCB0byB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyAucGFyIGZpbGUKCiAgICBXZSBkb24ndCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgcHJlZml4IGlzIG5vbi1lbXB0eS4KICAgICIiIgogICAgbWFpbiA9IHN5cy5tb2R1bGVzLmdldCgnX19tYWluX18nKQogICAgaWYgbm90IG1haW46CiAgICAgICAgX2xvZygnIyBfX21haW5fXyBtb2R1bGUgbm90IGZvdW5kJykKICAgICAgICByZXR1cm4gTm9uZQogICAgbWFpbl9sb2FkZXIgPSBnZXRhdHRyKG1haW4sICdfX2xvYWRlcl9fJykKICAgIGlmIG5vdCBtYWluX2xvYWRlcjoKICAgICAgICBfbG9nKCcjIF9fbWFpbl9fLl9fbG9hZGVyX18gbm90IHNldCcpCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHByZWZpeCA9IGdldGF0dHIobWFpbl9sb2FkZXIsICdwcmVmaXgnKQogICAgaWYgcHJlZml4ICE9ICcnOgogICAgICAgIF9sb2coJyMgdW5leHBlY3RlZCBwcmVmaXggZm9yIF9fbWFpbl9fLl9fbG9hZGVyX18gaXMgJXMnICUKICAgICAgICAgICAgIG1haW5fbG9hZGVyLnByZWZpeCkKICAgICAgICByZXR1cm4gTm9uZQogICAgYXJjaGl2ZV9wYXRoID0gZ2V0YXR0cihtYWluX2xvYWRlciwgJ2FyY2hpdmUnKQogICAgaWYgbm90IGFyY2hpdmVfcGF0aDoKICAgICAgICBfbG9nKCcjIG1pc3NpbmcgYXJjaGl2ZSBmb3IgX19tYWluX18uX19sb2FkZXJfXycpCiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHJldHVybiBhcmNoaXZlX3BhdGgKCgpkZWYgX2V4dHJhY3RfZmlsZXMoYXJjaGl2ZV9wYXRoKToKICAgICIiIkV4dHJhY3QgdGhlIGNvbnRlbnRzIG9mIHRoaXMgLnBhciBmaWxlIHRvIGRpc2suCgogICAgVGhpcyBjcmVhdGVzIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgYW5kIHJlZ2lzdGVycyBhbiBhdGV4aXQKICAgIGhhbmRsZXIgdG8gY2xlYW4gdGhhdCBkaXJlY3Rvcnkgb24gcHJvZ3JhbSBleGl0LiAgRXh0cmFjdGlvbiBhbmQKICAgIGNsZWFudXAgd2lsbCBwb3RlbnRpYWxseSB1c2Ugc2lnbmlmaWNhbnQgdGltZSBhbmQgZGlzayBzcGFjZS4KCiAgICBSZXR1cm5zOgogICAgICAgIERpcmVjdG9yeSB3aGVyZSBjb250ZW50cyB3ZXJlIGV4dHJhY3RlZCB0by4KICAgICIiIgogICAgZXh0cmFjdF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKCiAgICBkZWYgX2V4dHJhY3RfZmlsZXNfY2xlYW51cCgpOgogICAgICAgIHNodXRpbC5ybXRyZWUoZXh0cmFjdF9kaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKICAgIGF0ZXhpdC5yZWdpc3RlcihfZXh0cmFjdF9maWxlc19jbGVhbnVwKQogICAgX2xvZygnIyBleHRyYWN0aW5nICVzIHRvICVzJyAlIChhcmNoaXZlX3BhdGgsIGV4dHJhY3RfZGlyKSkKCiAgICB6aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZShhcmNoaXZlX3BhdGgsIG1vZGU9J3InKQogICAgemlwX2ZpbGUuZXh0cmFjdGFsbChleHRyYWN0X2RpcikKICAgIHppcF9maWxlLmNsb3NlKCkKCiAgICByZXR1cm4gZXh0cmFjdF9kaXIKCgpkZWYgX3ZlcnNpb25fY2hlY2tfcGtnX3Jlc291cmNlcyhwa2dfcmVzb3VyY2VzKToKICAgICIiIkNoZWNrIHRoYXQgcGtnX3Jlc291cmNlcyBzdXBwb3J0cyB0aGUgQVBJcyB3ZSBuZWVkLiIiIgogICAgIyBDaGVjayB0aGF0IHBrZ19yZXNvdXJjZXMgaXMgbmV3IGVub3VnaC4KICAgICMKICAgICMgRGV0ZXJtaW5pbmcgdGhlIHZlcnNpb24gb2YgYW4gYXJiaXRyYXJpbHkgb2xkIHZlcnNpb24gb2YKICAgICMgcGtnX3Jlc291cmNlcyBpcyB0b3VnaCwgc2luY2UgaXQgZG9lc24ndCBoYXZlIGEgdmVyc2lvbiBsaXRlcmFsLAogICAgIyBhbmQgdGhlIGFjY29tcGFueWluZyBzZXR1cHRvb2xzIHBhY2thZ2UgY29tcHV0ZXMgaXRzIHZlcnNpb24KICAgICMgZHluYW1pY2FsbHkgZnJvbSBtZXRhZGF0YSB0aGF0IG1pZ2h0IG5vdCBleGlzdC4gIEFsc28gc2V0dXB0b29scwogICAgIyBtaWdodCBub3QgZXhpc3QsIGVzcGVjaWFsbHkgaW4gdGhlIGNhc2Ugb2YgdGhlIHBpcC12ZW5kb3JlZCBjb3B5CiAgICAjIG9mIHBrZ19yZXNvdXJjZXMuCiAgICAjCiAgICAjIFdlIGRvIGEgZmVhdHVyZSBkZXRlY3Rpb24gaW5zdGVhZC4gIFdlIGV4YW1pbmUKICAgICMgcGtnX3Jlc291cmNlcy5Xb3JraW5nU2V0LmFkZCwgYW5kIHNlZSBpZiBpdCBoYXMgYXQgbGVhc3QgdGhlCiAgICAjIHRoaXJkIGRlZmF1bHQgYXJndW1lbnQgKCdyZXBsYWNlJykuCiAgICB0cnk6CiAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CiAgICAgICAgICAgIGRlZmF1bHRzID0gcGtnX3Jlc291cmNlcy5Xb3JraW5nU2V0LmFkZC5pbV9mdW5jLmZ1bmNfZGVmYXVsdHMKICAgICAgICBlbHNlOgogICAgICAgICAgICBkZWZhdWx0cyA9IHBrZ19yZXNvdXJjZXMuV29ya2luZ1NldC5hZGQuX19kZWZhdWx0c19fCiAgICAgICAgcmV0dXJuIGxlbihkZWZhdWx0cykgPj0gMwogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHJldHVybiBGYWxzZQoKCmRlZiBfc2V0dXBfcGtnX3Jlc291cmNlcyhwa2dfcmVzb3VyY2VzX25hbWUpOgogICAgIiIiU2V0dXAgaG9va3MgaW50byB0aGUgYHBrZ19yZXNvdXJjZXNgIG1vZHVsZQoKICAgIFRoaXMgZW5hYmxlcyB0aGUgcGtnX3Jlc291cmNlcyBtb2R1bGUgdG8gZmluZCBtZXRhZGF0YSBmcm9tIHdoZWVscwogICAgdGhhdCBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gdGhpcyAucGFyIGZpbGUuCgogICAgVGhlIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyBoZXJlIGFyZSBzY29wZWQgdG8gdGhpcyBmdW5jdGlvbiwgc2luY2UKICAgIHdlIG1pZ2h0IGhhdmUgbXVsdGl0cGxlIHBrZ19yZXNvdXJjZXMgbW9kdWxlcywgb3Igbm9uZS4KICAgICIiIgoKICAgIHRyeToKICAgICAgICBfX2ltcG9ydF9fKHBrZ19yZXNvdXJjZXNfbmFtZSkKICAgICAgICBwa2dfcmVzb3VyY2VzID0gc3lzLm1vZHVsZXMuZ2V0KHBrZ19yZXNvdXJjZXNfbmFtZSkKICAgICAgICBpZiBwa2dfcmVzb3VyY2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICMgU2tpcCBzZXR1cAogICAgICAgIHJldHVybgoKICAgIGlmIG5vdCBfdmVyc2lvbl9jaGVja19wa2dfcmVzb3VyY2VzKHBrZ19yZXNvdXJjZXMpOgogICAgICAgICMgU2tpcCBzZXR1cAogICAgICAgIHJldHVybgoKICAgIGNsYXNzIERpc3RJbmZvTWV0YWRhdGEocGtnX3Jlc291cmNlcy5FZ2dNZXRhZGF0YSk6CiAgICAgICAgIiIiTWV0YWRhdGEgcHJvdmlkZXIgZm9yIHppcCBmaWxlcyBjb250YWluaW5nIC5kaXN0LWluZm8KCiAgICAgICAgSW4gZmluZF9kaXN0X2luZm9faW5femlwKCksIHdlIGNhbGwKICAgICAgICBtZXRhZGF0YS5yZXNvdXJjZV9saXN0ZGlyKGRpcmVjdG9yeV9uYW1lKS4gIEhvd2V2ZXIsIGl0IGRvZXNuJ3QKICAgICAgICB3b3JrIHdpdGggRWdnTWV0YWRhdGEsIGJlY2F1c2UgX3ppcGluZm9fbmFtZSgpIGV4cGVjdHMgdGhlCiAgICAgICAgZGlyZWN0b3J5IG5hbWUgdG8gZW5kIHdpdGggYSAvLCBidXQgbWV0YWRhdGEuX2xpc3RkaXIoKSB3aGljaAogICAgICAgIGV4cGVjdHMgdGhlIGRpcmVjdG9yeSB0byBfbm90XyBlbmQgd2l0aCBhIC8uCgogICAgICAgIFRoZXJlZm9yZSB0aGlzIGNsYXNzIGV4aXN0cy4KICAgICAgICAiIiIKCiAgICAgICAgZGVmIF96aXBpbmZvX25hbWUoc2VsZiwgZnNwYXRoKToKICAgICAgICAgICAgIiIiT3ZlcnJpZGVzIEVnZ01ldGFkYXRhLl96aXBpbmZvX25hbWUiIiIKICAgICAgICAgICAgIyBDb252ZXJ0IGEgdmlydHVhbCBmaWxlbmFtZSAoZnVsbCBwYXRoIHRvIGZpbGUpIGludG8gYQogICAgICAgICAgICAjIHppcGZpbGUgc3VicGF0aCB1c2FibGUgd2l0aCB0aGUgemlwaW1wb3J0IGRpcmVjdG9yeQogICAgICAgICAgICAjIGNhY2hlIGZvciBvdXIgdGFyZ2V0IGFyY2hpdmUKICAgICAgICAgICAgZnNwYXRoID0gZnNwYXRoLnJzdHJpcChvcy5zZXApCiAgICAgICAgICAgIGlmIGZzcGF0aCA9PSBzZWxmLmxvYWRlci5hcmNoaXZlOgogICAgICAgICAgICAgICAgcmV0dXJuICcnCiAgICAgICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuemlwX3ByZSk6CiAgICAgICAgICAgICAgICByZXR1cm4gZnNwYXRoW2xlbihzZWxmLnppcF9wcmUpOl0KICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGEgc3VicGF0aCBvZiAlcyIgJSAoZnNwYXRoLCBzZWxmLnppcF9wcmUpCiAgICAgICAgICAgICkKCiAgICAgICAgZGVmIF9wYXJ0cyhzZWxmLCB6aXBfcGF0aCk6CiAgICAgICAgICAgICIiIk92ZXJyaWRlcyBFZ2dNZXRhZGF0YS5fcGFydHMiIiIKICAgICAgICAgICAgIyBDb252ZXJ0IGEgemlwZmlsZSBzdWJwYXRoIGludG8gYW4gZWdnLXJlbGF0aXZlIHBhdGggcGFydAogICAgICAgICAgICAjIGxpc3QuCiAgICAgICAgICAgIGZzcGF0aCA9IHNlbGYuemlwX3ByZSArIHppcF9wYXRoCiAgICAgICAgICAgIGlmIGZzcGF0aCA9PSBzZWxmLmVnZ19yb290OgogICAgICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuZWdnX3Jvb3QgKyBvcy5zZXApOgogICAgICAgICAgICAgICAgcmV0dXJuIGZzcGF0aFtsZW4oc2VsZi5lZ2dfcm9vdCkgKyAxOl0uc3BsaXQob3Muc2VwKQogICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdWJwYXRoIG9mICVzIiAlIChmc3BhdGgsIHNlbGYuZWdnX3Jvb3QpCiAgICAgICAgICAgICkKCiAgICBkZWYgZmluZF9kaXN0X2luZm9faW5femlwKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgICAgICIiIkZpbmQgZGlzdC1pbmZvIHN0eWxlIG1ldGFkYXRhIGluIHppcCBmaWxlcy4KCiAgICAgICAgaW1wb3J0ZXI6IFBFUCAzMDItc3R5bGUgSW1wb3J0ZXIgb2JqZWN0CiAgICAgICAgcGF0aF9pdGVtIChzdHIpOiBmaWxlbmFtZSBvciBwc2V1ZG8tZmlsZW5hbWUgbGlrZToKICAgICAgICAgICAgL3Vzci9zb21lZGlycy9tYWluLnBhcgogICAgICAgICAgICBvcgogICAgICAgICAgICAvdXNyL3NvbWVkaXJzL21haW4ucGFyL3B5cGlfX3BvcnRwaWNrZXJfMV8yXzAKICAgICAgICBvbmx5IChib29sKTogV2UgaWdub3JlIHRoZSBgb25seWAgZmxhZyBiZWNhdXNlIGl0J3Mgbm90IGNsZWFyCiAgICAgICAgICAgIHdoYXQgaXQgc2hvdWxkIGFjdHVhbGx5IGRvIGluIHRoaXMgY2FzZS4KCiAgICAgICAgWWllbGRzIHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uIG9iamVjdHMKICAgICAgICAiIiIKICAgICAgICBtZXRhZGF0YSA9IERpc3RJbmZvTWV0YWRhdGEoaW1wb3J0ZXIpCiAgICAgICAgZm9yIHN1Yml0ZW0gaW4gbWV0YWRhdGEucmVzb3VyY2VfbGlzdGRpcignLycpOgogICAgICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChzdWJpdGVtKQogICAgICAgICAgICBpZiBleHQubG93ZXIoKSA9PSAnLmRpc3QtaW5mbyc6CiAgICAgICAgICAgICAgICAjIFBhcnNlIGRpc3RyaWJ1dGlvbiBuYW1lCiAgICAgICAgICAgICAgICBtYXRjaCA9IHBrZ19yZXNvdXJjZXMuRUdHX05BTUUoYmFzZW5hbWUpCiAgICAgICAgICAgICAgICBwcm9qZWN0X25hbWUgPSAndW5rbm93bicKICAgICAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgICAgIHByb2plY3RfbmFtZSA9IG1hdGNoLmdyb3VwKCduYW1lJykKICAgICAgICAgICAgICAgICMgQ3JlYXRlIG1ldGFkYXRhIG9iamVjdAogICAgICAgICAgICAgICAgc3VicGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIHN1Yml0ZW0pCiAgICAgICAgICAgICAgICBzdWJtZXRhID0gRGlzdEluZm9NZXRhZGF0YSgKICAgICAgICAgICAgICAgICAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIocGF0aF9pdGVtKSkKICAgICAgICAgICAgICAgICMgT3ZlcnJpZGUgcGtnX3Jlc291cmNlcyBkZWZhdWx0cyB0byBhdm9pZAogICAgICAgICAgICAgICAgIyAicmVzb3VyY2VfZmlsZW5hbWUoKSBvbmx5IHN1cHBvcnRlZCBmb3IgLmVnZywgbm90CiAgICAgICAgICAgICAgICAjIC56aXAiIG1lc3NhZ2UKICAgICAgICAgICAgICAgIHN1Ym1ldGEuZWdnX25hbWUgPSBwcm9qZWN0X25hbWUKICAgICAgICAgICAgICAgIHN1Ym1ldGEuZWdnX2luZm8gPSBzdWJwYXRoCiAgICAgICAgICAgICAgICBzdWJtZXRhLmVnZ19yb290ID0gcGF0aF9pdGVtCiAgICAgICAgICAgICAgICBkaXN0ID0gcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24uZnJvbV9sb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICBwYXRoX2l0ZW0sIHN1Yml0ZW0sIHN1Ym1ldGEpCiAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CgogICAgZGVmIGZpbmRfZWdnc19hbmRfZGlzdF9pbmZvX2luX3ppcChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgICAgICAiIiJDaGFpbiB0b2dldGhlciBvdXIgZmluZGVyIGFuZCB0aGUgc3RhbmRhcmQgcGtnX3Jlc291cmNlcyBmaW5kZXIKCiAgICAgICAgRm9yIHNpbXBsaWNpdHksIGFuZCBzaW5jZSBwa2dfcmVzb3VyY2VzIGRvZXNuJ3QgcHJvdmlkZSBhIHB1YmxpYwogICAgICAgIGludGVyZmFjZSB0byBkbyBzbywgd2UgaGFyZGNvZGUgdGhlIGNoYWluaW5nIChmaW5kX2VnZ3NfaW5femlwKS4KICAgICAgICAiIiIKICAgICAgICAjIE91ciBmaW5kZXIKICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RfaW5mb19pbl96aXAoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seSk6CiAgICAgICAgICAgIHlpZWxkIGRpc3QKICAgICAgICAjIFRoZSBzdGFuZGFyZCBwa2dfcmVzb3VyY2VzIGZpbmRlcgogICAgICAgIGZvciBkaXN0IGluIHBrZ19yZXNvdXJjZXMuZmluZF9lZ2dzX2luX3ppcChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5KToKICAgICAgICAgICAgeWllbGQgZGlzdAogICAgICAgIHJldHVybgoKICAgICMgVGhpcyBvdmVyd3JpdGVzIHRoZSBleGlzdGluZyByZWdpc3RlcmVkIGZpbmRlci4KICAgIHBrZ19yZXNvdXJjZXMucmVnaXN0ZXJfZmluZGVyKHppcGltcG9ydC56aXBpbXBvcnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRfZWdnc19hbmRfZGlzdF9pbmZvX2luX3ppcCkKCiAgICAjIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBXb3JraW5nU2V0IGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgYW5kCiAgICAjIHRoZXJlIGlzIG5vIHB1YmxpYyBpbnRlcmZhY2UgdG8gZWFzaWx5IHJlZnJlc2gvcmVsb2FkIGl0IHRoYXQKICAgICMgZG9lc24ndCBhbHNvIGhhdmUgYSAiRG9uJ3QgdXNlIHRoaXMiIHdhcm5pbmcuICBTbyB3ZSBtYW51YWxseQogICAgIyBhZGQganVzdCB0aGUgZW50cmllcyB3ZSBrbm93IGFib3V0IHRvIHRoZSBleGlzdGluZyBXb3JraW5nU2V0LgogICAgZm9yIGVudHJ5IGluIHN5cy5wYXRoOgogICAgICAgIGltcG9ydGVyID0gcGtndXRpbC5nZXRfaW1wb3J0ZXIoZW50cnkpCiAgICAgICAgaWYgaXNpbnN0YW5jZShpbXBvcnRlciwgemlwaW1wb3J0LnppcGltcG9ydGVyKToKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0X2luZm9faW5femlwKGltcG9ydGVyLCBlbnRyeSwgb25seT1UcnVlKToKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGlzdC5fcHJvdmlkZXIsIERpc3RJbmZvTWV0YWRhdGEpOgogICAgICAgICAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQuYWRkKGRpc3QsIGVudHJ5LCBpbnNlcnQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZT1UcnVlKQoKCmRlZiBfaW5pdGlhbGl6ZV9pbXBvcnRfcGF0aChpbXBvcnRfcm9vdHMsIGltcG9ydF9wcmVmaXgpOgogICAgIiIiQWRkIGV4dHJhIGVudHJpZXMgdG8gUFlUSE9OUEFUSCBzbyB0aGF0IG1vZHVsZXMgY2FuIGJlIGltcG9ydGVkLiIiIgogICAgIyBXZSB0cnkgdG8gbWF0Y2ggdG8gb3JkZXIgb2YgQmF6ZWwncyBzdHViCiAgICBmdWxsX3Jvb3RzID0gWwogICAgICAgIG9zLnBhdGguam9pbihpbXBvcnRfcHJlZml4LCBpbXBvcnRfcm9vdCkKICAgICAgICBmb3IgaW1wb3J0X3Jvb3QgaW4gaW1wb3J0X3Jvb3RzXQogICAgc3lzLnBhdGhbMToxXSA9IGZ1bGxfcm9vdHMKICAgIF9sb2coJyMgYWRkaW5nICVzIHRvIHN5cy5wYXRoJyAlIGZ1bGxfcm9vdHMpCgoKZGVmIHNldHVwKGltcG9ydF9yb290cywgemlwX3NhZmUpOgogICAgIiIiSW5pdGlhbGl6ZSBzdWJwYXIgcnVuLXRpbWUgc3VwcG9ydAoKICAgIEFyZ3M6CiAgICAgIGltcG9ydF9yb290IChsaXN0KTogc3ViZGlycyBpbnNpZGUgLnBhciBmaWxlIHRvIGFkZCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgaW1wb3J0IHBhdGggYXQgcnVudGltZS4KICAgICAgemlwX3NhZmUgKGJvb2wpOiBJZiBGYWxzZSwgZXh0cmFjdCB0aGUgLnBhciBmaWxlIGNvbnRlbnRzIHRvIGEKICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBhbmQgaW1wb3J0IGV2ZXJ5dGhpbmcgZnJvbQogICAgICAgICAgICAgICAgICAgICAgIHRoYXQgZGlyZWN0b3J5LgoKICAgIFJldHVybnM6CiAgICAgIFRydWUgaWYgc2V0dXAgd2FzIHN1Y2Nlc3NmdWwsIGVsc2UgRmFsc2UKICAgICIiIgogICAgYXJjaGl2ZV9wYXRoID0gX2ZpbmRfYXJjaGl2ZSgpCiAgICBpZiBub3QgYXJjaGl2ZV9wYXRoOgogICAgICAgIHdhcm5pbmdzLndhcm4oJ0ZhaWxlZCB0byBpbml0aWFsaXplIC5wYXIgZmlsZSBydW50aW1lIHN1cHBvcnQnLAogICAgICAgICAgICAgICAgICAgICAgVXNlcldhcm5pbmcpCiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBpZiBvcy5wYXRoLmFic3BhdGgoc3lzLnBhdGhbMF0pICE9IG9zLnBhdGguYWJzcGF0aChhcmNoaXZlX3BhdGgpOgogICAgICAgIHdhcm5pbmdzLndhcm4oJ0ZhaWxlZCB0byBpbml0aWFsaXplIC5wYXIgZmlsZSBydW50aW1lIHN1cHBvcnQuICcgKwogICAgICAgICAgICAgICAgICAgICAgJ2FyY2hpdmVfcGF0aCB3YXMgJXIsIHN5cy5wYXRoIHdhcyAlcicgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZV9wYXRoLCBzeXMucGF0aCksCiAgICAgICAgICAgICAgICAgICAgICBVc2VyV2FybmluZykKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAjIEV4dHJhY3QgZmlsZXMgdG8gZGlzayBpZiBuZWNlc3NhcnkKICAgIGlmIG5vdCB6aXBfc2FmZToKICAgICAgICBleHRyYWN0X2RpciA9IF9leHRyYWN0X2ZpbGVzKGFyY2hpdmVfcGF0aCkKICAgICAgICAjIHN5cy5wYXRoWzBdIGlzIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRpbmcgLnBhciBmaWxlLiAgUG9pbnQKICAgICAgICAjIGl0IHRvIHRoZSBleHRyYWN0IGRpcmVjdG9yeSBpbnN0ZWFkLCBzbyB0aGF0IFB5dGhvbiBzZWFyY2hlcwogICAgICAgICMgdGhlcmUgZm9yIGltcG9ydHMuCiAgICAgICAgc3lzLnBhdGhbMF0gPSBleHRyYWN0X2RpcgogICAgICAgIGltcG9ydF9wcmVmaXggPSBleHRyYWN0X2RpcgogICAgZWxzZTogICMgSW1wb3J0IGRpcmVjdGx5IGZyb20gLnBhciBmaWxlCiAgICAgICAgZXh0cmFjdF9kaXIgPSBOb25lCiAgICAgICAgaW1wb3J0X3ByZWZpeCA9IGFyY2hpdmVfcGF0aAoKICAgICMgSW5pdGlhbGl6ZSBpbXBvcnQgcGF0aAogICAgX2luaXRpYWxpemVfaW1wb3J0X3BhdGgoaW1wb3J0X3Jvb3RzLCBpbXBvcnRfcHJlZml4KQoKICAgICMgQWRkIGhvb2sgZm9yIHBhY2thZ2UgbWV0YWRhdGEKICAgIF9zZXR1cF9wa2dfcmVzb3VyY2VzKCdwa2dfcmVzb3VyY2VzJykKICAgIF9zZXR1cF9wa2dfcmVzb3VyY2VzKCdwaXAuX3ZlbmRvci5wa2dfcmVzb3VyY2VzJykKCiAgICByZXR1cm4gVHJ1ZQpQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAACwAAAAAAAAAAAAAAAAAXAAAAX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEA6OeQvFkeAABZHgAACwAAAAAAAAAAAAAAAABAAAAAX19tYWluX18ucHlQSwECFAMUAAAAAAAAACEATzlpVeINAADiDQAAJgAAAAAAAAAAAAAAAADCHgAAYmF6ZWxfdG9vbHMvdG9vbHMvcHl0aG9uL3B5M3dyYXBwZXIuc2hQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAGwAAAAAAAAAAAAAAAADoLAAAcHlwaV9fcGlwXzlfMF8zL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAKtxNFcHBQAABwUAADMAAAAAAAAAAAAAAAAAIS0AAHB5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL0RFU0NSSVBUSU9OLnJzdFBLAQIUAxQAAAAAAAAAIQA8UH8l+QkAAPkJAAAsAAAAAAAAAAAAAAAAAHkyAABweXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9NRVRBREFUQVBLAQIUAxQAAAAAAAAAIQBX/iPlmGIAAJhiAAAqAAAAAAAAAAAAAAAAALw8AABweXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9SRUNPUkRQSwECFAMUAAAAAAAAACEA9t3Svm4AAABuAAAAKQAAAAAAAAAAAAAAAACcnwAAcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vV0hFRUxQSwECFAMUAAAAAAAAACEAtBeYxEQAAABEAAAANAAAAAAAAAAAAAAAAABRoAAAcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dFBLAQIUAxQAAAAAAAAAIQDI4LebHQYAAB0GAAAxAAAAAAAAAAAAAAAAAOegAABweXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9tZXRhZGF0YS5qc29uUEsBAhQDFAAAAAAAAAAhAMcfl8IEAAAABAAAADEAAAAAAAAAAAAAAAAAU6cAAHB5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHRQSwECFAMUAAAAAAAAACEADVvQdrQuAAC0LgAAHwAAAAAAAAAAAAAAAACmpwAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBLSaRlSAIAAEgCAAAfAAAAAAAAAAAAAAAAAJfWAABweXBpX19waXBfOV8wXzMvcGlwL19fbWFpbl9fLnB5UEsBAhQDFAAAAAAAAAAhAE+9zEg+EgAAPhIAACcAAAAAAAAAAAAAAAAAHNkAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCFiZaKYFcAAGBXAAAmAAAAAAAAAAAAAAAAAJ/rAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvYXBwZGlycy5weVBLAQIUAxQAAAAAAAAAIQAAVqw6LgEAAC4BAAA0AAAAAAAAAAAAAAAAAENDAQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhANpURqUoBQAAKAUAADAAAAAAAAAAAAAAAAAAw0QBAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvX2NtZC5weVBLAQIUAxQAAAAAAAAAIQBQ5qksABIAAAASAAAzAAAAAAAAAAAAAAAAADlKAQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2FkYXB0ZXIucHlQSwECFAMUAAAAAAAAACEAEqrG8BYDAAAWAwAAMQAAAAAAAAAAAAAAAACKXAEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jYWNoZS5weVBLAQIUAxQAAAAAAAAAIQCeHVb8cQEAAHEBAAA7AAAAAAAAAAAAAAAAAO9fAQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlcy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDBpwb/zA0AAMwNAAA9AAAAAAAAAAAAAAAAALlhAQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlcy9maWxlX2NhY2hlLnB5UEsBAhQDFAAAAAAAAAAhANOIxlTNAwAAzQMAAD4AAAAAAAAAAAAAAAAA4G8BAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY2FjaGVzL3JlZGlzX2NhY2hlLnB5UEsBAhQDFAAAAAAAAAAhAC08LTN8AQAAfAEAADIAAAAAAAAAAAAAAAAACXQBAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAMdgud7gMgAA4DIAADYAAAAAAAAAAAAAAAAA1XUBAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY29udHJvbGxlci5weVBLAQIUAxQAAAAAAAAAIQBsJjR84wkAAOMJAAA3AAAAAAAAAAAAAAAAAAmpAQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2ZpbGV3cmFwcGVyLnB5UEsBAhQDFAAAAAAAAAAhAA5UHvwtEAAALRAAADYAAAAAAAAAAAAAAAAAQbMBAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvaGV1cmlzdGljcy5weVBLAQIUAxQAAAAAAAAAIQASYYC4iBkAAIgZAAA1AAAAAAAAAAAAAAAAAMLDAQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL3NlcmlhbGl6ZS5weVBLAQIUAxQAAAAAAAAAIQCLe8VC8gEAAPIBAAAzAAAAAAAAAAAAAAAAAJ3dAQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL3dyYXBwZXIucHlQSwECFAMUAAAAAAAAACEAFHAFRz8AAAA/AAAALwAAAAAAAAAAAAAAAADg3wEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NlcnRpZmkvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAgyvawSkAAAApAAAALwAAAAAAAAAAAAAAAABs4AEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NlcnRpZmkvX19tYWluX18ucHlQSwECFAMUAAAAAAAAACEABaHa9fAiBADwIgQALgAAAAAAAAAAAAAAAADi4AEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NlcnRpZmkvY2FjZXJ0LnBlbVBLAQIUAxQAAAAAAAAAIQAJE0JHRAMAAEQDAAArAAAAAAAAAAAAAAAAAB4EBgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2VydGlmaS9jb3JlLnB5UEsBAhQDFAAAAAAAAAAhAPDPD1MXBgAAFwYAAC8AAAAAAAAAAAAAAAAAqwcGAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhADm/hBAWegAAFnoAAC8AAAAAAAAAAAAAAAAADw4GAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2JpZzVmcmVxLnB5UEsBAhQDFAAAAAAAAAAhAMvnZ2bdBgAA3QYAADEAAAAAAAAAAAAAAAAAcogGAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2JpZzVwcm9iZXIucHlQSwECFAMUAAAAAAAAACEA4FkoPcMkAADDJAAANwAAAAAAAAAAAAAAAACejwYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY2hhcmRpc3RyaWJ1dGlvbi5weVBLAQIUAxQAAAAAAAAAIQCJWSSIyw4AAMsOAAA5AAAAAAAAAAAAAAAAALa0BgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jaGFyc2V0Z3JvdXBwcm9iZXIucHlQSwECFAMUAAAAAAAAACEA4JdhWvYTAAD2EwAANAAAAAAAAAAAAAAAAADYwwYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY2hhcnNldHByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQCTBtcyAQAAAAEAAAAzAAAAAAAAAAAAAAAAACDYBgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jbGkvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAX92tubIKAACyCgAANQAAAAAAAAAAAAAAAABy2AYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY2xpL2NoYXJkZXRlY3QucHlQSwECFAMUAAAAAAAAACEAXPs3SAYOAAAGDgAAOQAAAAAAAAAAAAAAAAB34wYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY29kaW5nc3RhdGVtYWNoaW5lLnB5UEsBAhQDFAAAAAAAAAAhAHyG5WVuBAAAbgQAAC0AAAAAAAAAAAAAAAAA1PEGAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQC9QpoxPwcAAD8HAAAyAAAAAAAAAAAAAAAAAI32BgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jcDk0OXByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQBEBKzJfQYAAH0GAAAsAAAAAAAAAAAAAAAAABz+BgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9lbnVtcy5weVBLAQIUAxQAAAAAAAAAIQAEiAU9bg8AAG4PAAAwAAAAAAAAAAAAAAAAAOMEBwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9lc2Nwcm9iZXIucHlQSwECFAMUAAAAAAAAACEAwQpgog4pAAAOKQAALAAAAAAAAAAAAAAAAACfFAcAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXNjc20ucHlQSwECFAMUAAAAAAAAACEAIDfE0KUOAAClDgAAMgAAAAAAAAAAAAAAAAD3PQcAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXVjanBwcm9iZXIucHlQSwECFAMUAAAAAAAAACEA9EEDeeo0AADqNAAAMAAAAAAAAAAAAAAAAADsTAcAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXVja3JmcmVxLnB5UEsBAhQDFAAAAAAAAAAhACYFl/jUBgAA1AYAADIAAAAAAAAAAAAAAAAAJIIHAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2V1Y2tycHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhAMzbSdWFewAAhXsAADAAAAAAAAAAAAAAAAAASIkHAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2V1Y3R3ZnJlcS5weVBLAQIUAxQAAAAAAAAAIQCgQY0Y0wYAANMGAAAyAAAAAAAAAAAAAAAAABsFCABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9ldWN0d3Byb2Jlci5weVBLAQIUAxQAAAAAAAAAIQAZRdLX61AAAOtQAAAxAAAAAAAAAAAAAAAAAD4MCABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9nYjIzMTJmcmVxLnB5UEsBAhQDFAAAAAAAAAAhAH6r/o/aBgAA2gYAADMAAAAAAAAAAAAAAAAAeF0IAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2diMjMxMnByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQANKdOyDjYAAA42AAAzAAAAAAAAAAAAAAAAAKNkCABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9oZWJyZXdwcm9iZXIucHlQSwECFAMUAAAAAAAAACEAwho5YbFkAACxZAAALgAAAAAAAAAAAAAAAAACmwgAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvamlzZnJlcS5weVBLAQIUAxQAAAAAAAAAIQAGeSVqu0wAALtMAAAtAAAAAAAAAAAAAAAAAP//CABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9qcGNudHgucHlQSwECFAMUAAAAAAAAACEA8GjJyicyAAAnMgAAOQAAAAAAAAAAAAAAAAAFTQkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2J1bGdhcmlhbm1vZGVsLnB5UEsBAhQDFAAAAAAAAAAhAMjxVpscRgAAHEYAADgAAAAAAAAAAAAAAAAAg38JAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdjeXJpbGxpY21vZGVsLnB5UEsBAhQDFAAAAAAAAAAhAP67rymQMQAAkDEAADUAAAAAAAAAAAAAAAAA9cUJAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdncmVla21vZGVsLnB5UEsBAhQDFAAAAAAAAAAhAI9mrRhRLAAAUSwAADYAAAAAAAAAAAAAAAAA2PcJAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdoZWJyZXdtb2RlbC5weVBLAQIUAxQAAAAAAAAAIQDDwVWAMDEAADAxAAA5AAAAAAAAAAAAAAAAAH0kCgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5naHVuZ2FyaWFubW9kZWwucHlQSwECFAMUAAAAAAAAACEAIg/SPxosAAAaLAAANAAAAAAAAAAAAAAAAAAEVgoAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ3RoYWltb2RlbC5weVBLAQIUAxQAAAAAAAAAIQC1MsNkXisAAF4rAAA3AAAAAAAAAAAAAAAAAHCCCgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5ndHVya2lzaG1vZGVsLnB5UEsBAhQDFAAAAAAAAAAhAOTs8KT6FAAA+hQAADMAAAAAAAAAAAAAAAAAI64KAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhdGluMXByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQA2dRhNVQ0AAFUNAAA2AAAAAAAAAAAAAAAAAG7DCgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9tYmNoYXJzZXRwcm9iZXIucHlQSwECFAMUAAAAAAAAACEArdMRqNwHAADcBwAANgAAAAAAAAAAAAAAAAAX0QoAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbWJjc2dyb3VwcHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhAGn24Q+JYwAAiWMAAC0AAAAAAAAAAAAAAAAAR9kKAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L21iY3NzbS5weVBLAQIUAxQAAAAAAAAAIQAede8eGRYAABkWAAA2AAAAAAAAAAAAAAAAABs9CwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9zYmNoYXJzZXRwcm9iZXIucHlQSwECFAMUAAAAAAAAACEAiv5PoNoNAADaDQAANgAAAAAAAAAAAAAAAACIUwsAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvc2Jjc2dyb3VwcHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhANaRZzK+DgAAvg4AADEAAAAAAAAAAAAAAAAAtmELAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L3NqaXNwcm9iZXIucHlQSwECFAMUAAAAAAAAACEAdYBHPcUwAADFMAAAOAAAAAAAAAAAAAAAAADDcAsAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvdW5pdmVyc2FsZGV0ZWN0b3IucHlQSwECFAMUAAAAAAAAACEA9b+8Pc4KAADOCgAAMQAAAAAAAAAAAAAAAADeoQsAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvdXRmOHByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQBHx5DX8gAAAPIAAAAuAAAAAAAAAAAAAAAAAPusCwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC92ZXJzaW9uLnB5UEsBAhQDFAAAAAAAAAAhAFjUaTnwAAAA8AAAADAAAAAAAAAAAAAAAAAAOa4LAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jb2xvcmFtYS9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQA+Fadf3AkAANwJAAAsAAAAAAAAAAAAAAAAAHevCwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvYW5zaS5weVBLAQIUAxQAAAAAAAAAIQDHY8DZxCUAAMQlAAAzAAAAAAAAAAAAAAAAAJ25CwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvYW5zaXRvd2luMzIucHlQSwECFAMUAAAAAAAAACEAfdbYL30HAAB9BwAAMgAAAAAAAAAAAAAAAACy3wsAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL2luaXRpYWxpc2UucHlQSwECFAMUAAAAAAAAACEADW2iPfUUAAD1FAAALQAAAAAAAAAAAAAAAAB/5wsAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL3dpbjMyLnB5UEsBAhQDFAAAAAAAAAAhAHd7ZyGSGAAAkhgAAC8AAAAAAAAAAAAAAAAAv/wLAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jb2xvcmFtYS93aW50ZXJtLnB5UEsBAhQDFAAAAAAAAAAhACacUZdFAgAARQIAAC8AAAAAAAAAAAAAAAAAnhUMAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhACPvZ/wSAQAAEgEAADkAAAAAAAAAAAAAAAAAMBgMAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCvii9lywMAAMsDAAA1AAAAAAAAAAAAAAAAAJkZDABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvbWlzYy5weVBLAQIUAxQAAAAAAAAAIQDiYj3QL2QAAC9kAAA3AAAAAAAAAAAAAAAAALcdDABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvc2h1dGlsLnB5UEsBAhQDFAAAAAAAAAAhAG8WAK05CgAAOQoAADsAAAAAAAAAAAAAAAAAO4IMAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9zeXNjb25maWcuY2ZnUEsBAhQDFAAAAAAAAAAhADYPUtZLaQAAS2kAADoAAAAAAAAAAAAAAAAAzYwMAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9zeXNjb25maWcucHlQSwECFAMUAAAAAAAAACEAREIfQ9RpAQDUaQEAOAAAAAAAAAAAAAAAAABw9gwAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L3RhcmZpbGUucHlQSwECFAMUAAAAAAAAACEAXwlzYGGfAABhnwAALQAAAAAAAAAAAAAAAACaYA4AcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhADoKw7wIwgAACMIAAC8AAAAAAAAAAAAAAAAARgAPAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL2RhdGFiYXNlLnB5UEsBAhQDFAAAAAAAAAAhAIM44i1dUgAAXVIAACwAAAAAAAAAAAAAAAAAm8IPAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL2luZGV4LnB5UEsBAhQDFAAAAAAAAAAhANHFeK9FxwAARccAAC8AAAAAAAAAAAAAAAAAQhUQAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL2xvY2F0b3JzLnB5UEsBAhQDFAAAAAAAAAAhAIaXtZvaOQAA2jkAAC8AAAAAAAAAAAAAAAAA1NwQAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL21hbmlmZXN0LnB5UEsBAhQDFAAAAAAAAAAhAD0RrgKKGAAAihgAAC4AAAAAAAAAAAAAAAAA+xYRAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL21hcmtlcnMucHlQSwECFAMUAAAAAAAAACEADaZs8bGXAACxlwAALwAAAAAAAAAAAAAAAADRLxEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvbWV0YWRhdGEucHlQSwECFAMUAAAAAAAAACEAyLdFmA4qAAAOKgAAMAAAAAAAAAAAAAAAAADPxxEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvcmVzb3VyY2VzLnB5UEsBAhQDFAAAAAAAAAAhALr/69t4OwAAeDsAAC4AAAAAAAAAAAAAAAAAK/IRAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL3NjcmlwdHMucHlQSwECFAMUAAAAAAAAACEA9ZiQDABcAQAAXAEAKwAAAAAAAAAAAAAAAADvLRIAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdDMyLmV4ZVBLAQIUAxQAAAAAAAAAIQCe4sVZAH4BAAB+AQArAAAAAAAAAAAAAAAAADiKEwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi90NjQuZXhlUEsBAhQDFAAAAAAAAAAhADfYASX/zgAA/84AACsAAAAAAAAAAAAAAAAAgQgVAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL3V0aWwucHlQSwECFAMUAAAAAAAAACEAoP0FVp9cAACfXAAALgAAAAAAAAAAAAAAAADJ1xUAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdmVyc2lvbi5weVBLAQIUAxQAAAAAAAAAIQDYfQCJAE4BAABOAQArAAAAAAAAAAAAAAAAALQ0FgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi93MzIuZXhlUEsBAhQDFAAAAAAAAAAhAF7MS+8AcAEAAHABACsAAAAAAAAAAAAAAAAA/YIXAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL3c2NC5leGVQSwECFAMUAAAAAAAAACEAX9SgqcuYAADLmAAALAAAAAAAAAAAAAAAAABG8xgAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvd2hlZWwucHlQSwECFAMUAAAAAAAAACEAkcHArs2VAADNlQAAJQAAAAAAAAAAAAAAAABbjBkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3Ryby5weVBLAQIUAxQAAAAAAAAAIQCim5mcDAMAAAwDAAAwAAAAAAAAAAAAAAAAAGsiGgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEA1XgO4kFBAABBQQAAMQAAAAAAAAAAAAAAAADFJRoAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL19paGF0ZXhtbC5weVBLAQIUAxQAAAAAAAAAIQAeDG01FH8AABR/AAA0AAAAAAAAAAAAAAAAAFVnGgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX2lucHV0c3RyZWFtLnB5UEsBAhQDFAAAAAAAAAAhAMRGahYkKwEAJCsBADIAAAAAAAAAAAAAAAAAu+YaAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdG9rZW5pemVyLnB5UEsBAhQDFAAAAAAAAAAhAO/Trw8hAQAAIQEAADYAAAAAAAAAAAAAAAAALxIcAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDMlT6W0wMAANMDAAAzAAAAAAAAAAAAAAAAAKQTHABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvX2Jhc2UucHlQSwECFAMUAAAAAAAAACEAJFWdqZoEAACaBAAANAAAAAAAAAAAAAAAAADIFxwAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL190cmllL2RhdHJpZS5weVBLAQIUAxQAAAAAAAAAIQBLT27O7wYAAO8GAAAwAAAAAAAAAAAAAAAAALQcHABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvcHkucHlQSwECFAMUAAAAAAAAACEAJuOuWAAQAAAAEAAALgAAAAAAAAAAAAAAAADxIxwAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL191dGlscy5weVBLAQIUAxQAAAAAAAAAIQDIpH3+u0UBALtFAQAxAAAAAAAAAAAAAAAAAD00HABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvY29uc3RhbnRzLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAR3odAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAG7QfIBtAgAAbQIAAEYAAAAAAAAAAAAAAAAAnXodAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2FscGhhYmV0aWNhbGF0dHJpYnV0ZXMucHlQSwECFAMUAAAAAAAAACEAIoD7xB4BAAAeAQAANAAAAAAAAAAAAAAAAABufR0AcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvYmFzZS5weVBLAQIUAxQAAAAAAAAAIQAhwDyMtgoAALYKAABDAAAAAAAAAAAAAAAAAN5+HQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9pbmplY3RfbWV0YV9jaGFyc2V0LnB5UEsBAhQDFAAAAAAAAAAhAH3r0rUlDQAAJQ0AADQAAAAAAAAAAAAAAAAA9YkdAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2xpbnQucHlQSwECFAMUAAAAAAAAACEAIe2dJCYpAAAmKQAAPAAAAAAAAAAAAAAAAABslx0AcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvb3B0aW9uYWx0YWdzLnB5UEsBAhQDFAAAAAAAAAAhAJoeVJgYYgAAGGIAADkAAAAAAAAAAAAAAAAA7MAdAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL3Nhbml0aXplci5weVBLAQIUAxQAAAAAAAAAIQCfjmqtcwQAAHMEAAA6AAAAAAAAAAAAAAAAAFsjHgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy93aGl0ZXNwYWNlLnB5UEsBAhQDFAAAAAAAAAAhAGPYd9yyyQEAsskBADMAAAAAAAAAAAAAAAAAJigeAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9odG1sNXBhcnNlci5weVBLAQIUAxQAAAAAAAAAIQDcx7s0YTcAAGE3AAAyAAAAAAAAAAAAAAAAACnyHwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvc2VyaWFsaXplci5weVBLAQIUAxQAAAAAAAAAIQCCMmMk0AAAANAAAAA9AAAAAAAAAAAAAAAAANopIABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWFkYXB0ZXJzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhADEnx74TBgAAEwYAADsAAAAAAAAAAAAAAAAABSsgAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYWRhcHRlcnMvZ2Vuc2hpLnB5UEsBAhQDFAAAAAAAAAAhAORcXxB9BgAAfQYAADgAAAAAAAAAAAAAAAAAcTEgAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYWRhcHRlcnMvc2F4LnB5UEsBAhQDFAAAAAAAAAAhAEfZN25ODQAATg0AAD0AAAAAAAAAAAAAAAAARDggAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEARMpWqnY2AAB2NgAAOQAAAAAAAAAAAAAAAADtRSAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9iYXNlLnB5UEsBAhQDFAAAAAAAAAAhAAjqLviDIgAAgyIAADgAAAAAAAAAAAAAAAAAunwgAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvZG9tLnB5UEsBAhQDFAAAAAAAAAAhAKF9l/DcMQAA3DEAADoAAAAAAAAAAAAAAAAAk58gAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvZXRyZWUucHlQSwECFAMUAAAAAAAAACEA2v5K0FE3AABRNwAAPwAAAAAAAAAAAAAAAADH0SAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9ldHJlZV9seG1sLnB5UEsBAhQDFAAAAAAAAAAhAHNEIZaoFQAAqBUAADwAAAAAAAAAAAAAAAAAdQkhAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBNI5jASxMAAEsTAAA4AAAAAAAAAAAAAAAAAHcfIQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvYmFzZS5weVBLAQIUAxQAAAAAAAAAIQBlim+phQUAAIUFAAA3AAAAAAAAAAAAAAAAABgzIQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvZG9tLnB5UEsBAhQDFAAAAAAAAAAhACLBEDFMEgAATBIAADkAAAAAAAAAAAAAAAAA8jghAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9ldHJlZS5weVBLAQIUAxQAAAAAAAAAIQCWDZxHpRgAAKUYAAA+AAAAAAAAAAAAAAAAAJVLIQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvZXRyZWVfbHhtbC5weVBLAQIUAxQAAAAAAAAAIQATX20QBQkAAAUJAAA6AAAAAAAAAAAAAAAAAJZkIQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvZ2Vuc2hpLnB5UEsBAhQDFAAAAAAAAAAhAABHXJs6AAAAOgAAACwAAAAAAAAAAAAAAAAA820hAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAPNI1OnjDAAA4wwAACkAAAAAAAAAAAAAAAAAd24hAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL2NvZGVjLnB5UEsBAhQDFAAAAAAAAAAhAHyBlnDoAAAA6AAAACoAAAAAAAAAAAAAAAAAoXshAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQAJLvpxfiwAAH4sAAAoAAAAAAAAAAAAAAAAANF8IQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9jb3JlLnB5UEsBAhQDFAAAAAAAAAAhAGO8+hHngAAA54AAACwAAAAAAAAAAAAAAAAAlakhAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL2lkbmFkYXRhLnB5UEsBAhQDFAAAAAAAAAAhALdj9LLVBgAA1QYAAC0AAAAAAAAAAAAAAAAAxioiAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL2ludHJhbmdlcy5weVBLAQIUAxQAAAAAAAAAIQAb532iFQAAABUAAAAwAAAAAAAAAAAAAAAAAOYxIgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9wYWNrYWdlX2RhdGEucHlQSwECFAMUAAAAAAAAACEAyYWFhXDSAgBw0gIALQAAAAAAAAAAAAAAAABJMiIAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvdXRzNDZkYXRhLnB5UEsBAhQDFAAAAAAAAAAhAN3EpgUwOQEAMDkBACgAAAAAAAAAAAAAAAAABAUlAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pcGFkZHJlc3MucHlQSwECFAMUAAAAAAAAACEA85kjgJskAACbJAAAMAAAAAAAAAAAAAAAAAB6PiYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhACve8idcCgAAXAoAADQAAAAAAAAAAAAAAAAAY2MmAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9sb2NrZmlsZS9saW5rbG9ja2ZpbGUucHlQSwECFAMUAAAAAAAAACEAISa8fhgMAAAYDAAANQAAAAAAAAAAAAAAAAARbiYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL21rZGlybG9ja2ZpbGUucHlQSwECFAMUAAAAAAAAACEAIDxyLcoXAADKFwAAMwAAAAAAAAAAAAAAAAB8eiYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL3BpZGxvY2tmaWxlLnB5UEsBAhQDFAAAAAAAAAAhALuF8L2CFQAAghUAADYAAAAAAAAAAAAAAAAAl5ImAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9sb2NrZmlsZS9zcWxpdGVsb2NrZmlsZS5weVBLAQIUAxQAAAAAAAAAIQCRIwnZOAoAADgKAAA3AAAAAAAAAAAAAAAAAG2oJgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvc3ltbGlua2xvY2tmaWxlLnB5UEsBAhQDFAAAAAAAAAAhANZSGSP+DwAA/g8AACoAAAAAAAAAAAAAAAAA+rImAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9vcmRlcmVkZGljdC5weVBLAQIUAxQAAAAAAAAAIQA8KVjG0AIAANACAAAyAAAAAAAAAAAAAAAAAEDDJgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL19fYWJvdXRfXy5weVBLAQIUAxQAAAAAAAAAIQCBdpbKAQIAAAECAAAxAAAAAAAAAAAAAAAAAGDGJgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAOZpSuNcAwAAXAMAADAAAAAAAAAAAAAAAAAAsMgmAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQD6/aQSiAUAAIgFAAA0AAAAAAAAAAAAAAAAAFrMJgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL19zdHJ1Y3R1cmVzLnB5UEsBAhQDFAAAAAAAAAAhAH0sK1cmIAAAJiAAADAAAAAAAAAAAAAAAAAANNImAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvbWFya2Vycy5weVBLAQIUAxQAAAAAAAAAIQCuEZ/z5xAAAOcQAAA1AAAAAAAAAAAAAAAAAKjyJgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL3JlcXVpcmVtZW50cy5weVBLAQIUAxQAAAAAAAAAIQB8RYOMeW0AAHltAAAzAAAAAAAAAAAAAAAAAOIDJwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL3NwZWNpZmllcnMucHlQSwECFAMUAAAAAAAAACEAxeonD6UBAAClAQAALgAAAAAAAAAAAAAAAACscScAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy91dGlscy5weVBLAQIUAxQAAAAAAAAAIQAO78ahJC0AACQtAAAwAAAAAAAAAAAAAAAAAJ1zJwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL3ZlcnNpb24ucHlQSwECFAMUAAAAAAAAACEAyS1AJj6TAQA+kwEANQAAAAAAAAAAAAAAAAAPoScAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BrZ19yZXNvdXJjZXMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEA+lpxjM8LAADPCwAAMAAAAAAAAAAAAAAAAACgNCkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3Byb2dyZXNzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAA/DRgN9CgAAfQoAACsAAAAAAAAAAAAAAAAAvUApAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wcm9ncmVzcy9iYXIucHlQSwECFAMUAAAAAAAAACEAKn/xMN4FAADeBQAALwAAAAAAAAAAAAAAAACDSykAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3Byb2dyZXNzL2NvdW50ZXIucHlQSwECFAMUAAAAAAAAACEAzuwPTiYLAAAmCwAALwAAAAAAAAAAAAAAAACuUSkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3Byb2dyZXNzL2hlbHBlcnMucHlQSwECFAMUAAAAAAAAACEAdwhSeyIFAAAiBQAALwAAAAAAAAAAAAAAAAAhXSkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3Byb2dyZXNzL3NwaW5uZXIucHlQSwECFAMUAAAAAAAAACEAwSB0jqtrAwCrawMAKAAAAAAAAAAAAAAAAACQYikAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3B5cGFyc2luZy5weVBLAQIUAxQAAAAAAAAAIQBgHgeNBQMAAAUDAAAoAAAAAAAAAAAAAAAAAIHOLABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmUtdmVuZG9yLnB5UEsBAhQDFAAAAAAAAAAhAB/G7jD3DQAA9w0AADAAAAAAAAAAAAAAAAAAzNEsAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDffHkltAEAALQBAAAzAAAAAAAAAAAAAAAAABHgLABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvX192ZXJzaW9uX18ucHlQSwECFAMUAAAAAAAAACEAiKk5u0gEAABIBAAANwAAAAAAAAAAAAAAAAAW4iwAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL19pbnRlcm5hbF91dGlscy5weVBLAQIUAxQAAAAAAAAAIQAjUN5SGFIAABhSAAAwAAAAAAAAAAAAAAAAALPmLABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvYWRhcHRlcnMucHlQSwECFAMUAAAAAAAAACEAmGPoL10YAABdGAAAKwAAAAAAAAAAAAAAAAAZOS0AcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2FwaS5weVBLAQIUAxQAAAAAAAAAIQADrfKSACYAAAAmAAAsAAAAAAAAAAAAAAAAAL9RLQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvYXV0aC5weVBLAQIUAxQAAAAAAAAAIQAFodr18CIEAPAiBAAvAAAAAAAAAAAAAAAAAAl4LQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvY2FjZXJ0LnBlbVBLAQIUAxQAAAAAAAAAIQCCsqLP0QEAANEBAAAtAAAAAAAAAAAAAAAAAEabMQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvY2VydHMucHlQSwECFAMUAAAAAAAAACEAd8lhTVoGAABaBgAALgAAAAAAAAAAAAAAAABinTEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQATQ8kzIEcAACBHAAAvAAAAAAAAAAAAAAAAAAikMQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvY29va2llcy5weVBLAQIUAxQAAAAAAAAAIQD5zunQKwwAACsMAAAyAAAAAAAAAAAAAAAAAHXrMQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvZXhjZXB0aW9ucy5weVBLAQIUAxQAAAAAAAAAIQCEHWDiUw4AAFMOAAAsAAAAAAAAAAAAAAAAAPD3MQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvaGVscC5weVBLAQIUAxQAAAAAAAAAIQB52qPK/wIAAP8CAAAtAAAAAAAAAAAAAAAAAI0GMgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvaG9va3MucHlQSwECFAMUAAAAAAAAACEAZX1HdAOFAAADhQAALgAAAAAAAAAAAAAAAADXCTIAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL21vZGVscy5weVBLAQIUAxQAAAAAAAAAIQASPN6BtwIAALcCAAAwAAAAAAAAAAAAAAAAACaPMgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvcGFja2FnZXMucHlQSwECFAMUAAAAAAAAACEAX59mmZprAACaawAAMAAAAAAAAAAAAAAAAAArkjIAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3Nlc3Npb25zLnB5UEsBAhQDFAAAAAAAAAAhAEE41+L7DAAA+wwAADQAAAAAAAAAAAAAAAAAE/4yAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9zdGF0dXNfY29kZXMucHlQSwECFAMUAAAAAAAAACEA5iDKD8QLAADECwAAMgAAAAAAAAAAAAAAAABgCzMAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3N0cnVjdHVyZXMucHlQSwECFAMUAAAAAAAAACEAR8HZVwRsAAAEbAAALQAAAAAAAAAAAAAAAAB0FzMAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3V0aWxzLnB5UEsBAhQDFAAAAAAAAAAhACF7vAr0JgAA9CYAACcAAAAAAAAAAAAAAAAAw4MzAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXRyeWluZy5weVBLAQIUAxQAAAAAAAAAIQCZWE1aknUAAJJ1AAAiAAAAAAAAAAAAAAAAAPyqMwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivc2l4LnB5UEsBAhQDFAAAAAAAAAAhAJI+9YclCwAAJQsAAC8AAAAAAAAAAAAAAAAAziA0AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAAAZ05TcJwAA3CcAADMAAAAAAAAAAAAAAAAAQCw0AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL19jb2xsZWN0aW9ucy5weVBLAQIUAxQAAAAAAAAAIQBghK6nyzIAAMsyAAAxAAAAAAAAAAAAAAAAAG1UNABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb25uZWN0aW9uLnB5UEsBAhQDFAAAAAAAAAAhABcaHG8eigAAHooAADUAAAAAAAAAAAAAAAAAh4c0AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2Nvbm5lY3Rpb25wb29sLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAADcAAAAAAAAAAAAAAAAA+BE1AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAASAAAAAAAAAAAAAAAAABNEjUAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fc2VjdXJldHJhbnNwb3J0L19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhALdZi32YRAAAmEQAAEgAAAAAAAAAAAAAAAAAsxI1AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvX3NlY3VyZXRyYW5zcG9ydC9iaW5kaW5ncy5weVBLAQIUAxQAAAAAAAAAIQAEr9yQHi8AAB4vAABJAAAAAAAAAAAAAAAAALFXNQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19zZWN1cmV0cmFuc3BvcnQvbG93X2xldmVsLnB5UEsBAhQDFAAAAAAAAAAhABjDrZNxKgAAcSoAADgAAAAAAAAAAAAAAAAANoc1AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvYXBwZW5naW5lLnB5UEsBAhQDFAAAAAAAAAAhAC6lcY1+EQAAfhEAADcAAAAAAAAAAAAAAAAA/bE1AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvbnRsbXBvb2wucHlQSwECFAMUAAAAAAAAACEA8yq2cfo7AAD6OwAAOAAAAAAAAAAAAAAAAADQwzUAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9weW9wZW5zc2wucHlQSwECFAMUAAAAAAAAACEA51PA8yV3AAAldwAAPgAAAAAAAAAAAAAAAAAgADYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9zZWN1cmV0cmFuc3BvcnQucHlQSwECFAMUAAAAAAAAACEA0FMpmTMYAAAzGAAANAAAAAAAAAAAAAAAAAChdzYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9zb2Nrcy5weVBLAQIUAxQAAAAAAAAAIQDymskDyxkAAMsZAAAxAAAAAAAAAAAAAAAAACaQNgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9leGNlcHRpb25zLnB5UEsBAhQDFAAAAAAAAAAhAAE5jLI3FwAANxcAAC0AAAAAAAAAAAAAAAAAQKo2AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2ZpZWxkcy5weVBLAQIUAxQAAAAAAAAAIQDXXdAXEQkAABEJAAAvAAAAAAAAAAAAAAAAAMLBNgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9maWxlcG9zdC5weVBLAQIUAxQAAAAAAAAAIQCPXaB8bQAAAG0AAAA4AAAAAAAAAAAAAAAAACDLNgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAABCAAAAAAAAAAAAAAAAAOPLNgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9iYWNrcG9ydHMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAUlccubUFAAC1BQAAQgAAAAAAAAAAAAAAAABDzDYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvYmFja3BvcnRzL21ha2VmaWxlLnB5UEsBAhQDFAAAAAAAAAAhAEbBpmfnIgAA5yIAADwAAAAAAAAAAAAAAAAAWNI2AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL29yZGVyZWRfZGljdC5weVBLAQIUAxQAAAAAAAAAIQCZWE1aknUAAJJ1AAAzAAAAAAAAAAAAAAAAAJn1NgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9zaXgucHlQSwECFAMUAAAAAAAAACEA+23K5bACAACwAgAASwAAAAAAAAAAAAAAAAB8azcAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvc3NsX21hdGNoX2hvc3RuYW1lL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhALU6jytGFgAARhYAAFIAAAAAAAAAAAAAAAAAlW43AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL3NzbF9tYXRjaF9ob3N0bmFtZS9faW1wbGVtZW50YXRpb24ucHlQSwECFAMUAAAAAAAAACEA8K4Yktk/AADZPwAAMgAAAAAAAAAAAAAAAABLhTcAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcG9vbG1hbmFnZXIucHlQSwECFAMUAAAAAAAAACEAyjHkxDoXAAA6FwAALgAAAAAAAAAAAAAAAAB0xTcAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcmVxdWVzdC5weVBLAQIUAxQAAAAAAAAAIQA/SoJhd1kAAHdZAAAvAAAAAAAAAAAAAAAAAPrcNwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9yZXNwb25zZS5weVBLAQIUAxQAAAAAAAAAIQBSdeG/FAQAABQEAAA0AAAAAAAAAAAAAAAAAL42OABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAKufXz2NEAAAjRAAADYAAAAAAAAAAAAAAAAAJDs4AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvY29ubmVjdGlvbi5weVBLAQIUAxQAAAAAAAAAIQBBYZDXeQ4AAHkOAAAzAAAAAAAAAAAAAAAAAAVMOABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3JlcXVlc3QucHlQSwECFAMUAAAAAAAAACEA9DkcnycJAAAnCQAANAAAAAAAAAAAAAAAAADPWjgAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9yZXNwb25zZS5weVBLAQIUAxQAAAAAAAAAIQA9Ye/bCTkAAAk5AAAxAAAAAAAAAAAAAAAAAEhkOABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3JldHJ5LnB5UEsBAhQDFAAAAAAAAAAhAH3POz2bUgAAm1IAADUAAAAAAAAAAAAAAAAAoJ04AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvc2VsZWN0b3JzLnB5UEsBAhQDFAAAAAAAAAAhANXvyKKwLwAAsC8AADAAAAAAAAAAAAAAAAAAjvA4AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvc3NsXy5weVBLAQIUAxQAAAAAAAAAIQBVUs4gHSYAAB0mAAAzAAAAAAAAAAAAAAAAAIwgOQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3RpbWVvdXQucHlQSwECFAMUAAAAAAAAACEAwx5tEVcZAABXGQAALwAAAAAAAAAAAAAAAAD6RjkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC91cmwucHlQSwECFAMUAAAAAAAAACEAtjwj/KsFAACrBQAAMAAAAAAAAAAAAAAAAACeYDkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC93YWl0LnB5UEsBAhQDFAAAAAAAAAAhAG/BoThQKQAAUCkAADQAAAAAAAAAAAAAAAAAl2Y5AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAx60IixMjAAATIwAAMgAAAAAAAAAAAAAAAAA5kDkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy9sYWJlbHMucHlQSwECFAMUAAAAAAAAACEAUH8xHxkFAAAZBQAANAAAAAAAAAAAAAAAAACcszkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy9ta2xhYmVscy5weVBLAQIUAxQAAAAAAAAAIQAWmz4dohkAAKIZAAAxAAAAAAAAAAAAAAAAAAe5OQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL3Rlc3RzLnB5UEsBAhQDFAAAAAAAAAAhAEhvRb7SEAAA0hAAADoAAAAAAAAAAAAAAAAA+NI5AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MveF91c2VyX2RlZmluZWQucHlQSwECFAMUAAAAAAAAACEAghiL9YYuAACGLgAA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FAMUAAAAAAAAACEAF0SeKQeeAQAHngEAMQAAAAAAAAAAAAAAAACfTkEAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAA5AAAAAAAAAAAAAAAAAPXsQgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAQ6uwJmZXAABmVwAAOAAAAAAAAAAAAAAAAABM7UIAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL2FwcGRpcnMucHlQSwECFAMUAAAAAAAAACEAPClYxtACAADQAgAARAAAAAAAAAAAAAAAAAAIRUMAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fX2Fib3V0X18ucHlQSwECFAMUAAAAAAAAACEAgXaWygECAAABAgAAQwAAAAAAAAAAAAAAAAA6SEMAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDmaUrjXAMAAFwDAABCAAAAAAAAAAAAAAAAAJxKQwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19jb21wYXQucHlQSwECFAMUAAAAAAAAACEA+v2kEogFAACIBQAARgAAAAAAAAAAAAAAAABYTkMAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fc3RydWN0dXJlcy5weVBLAQIUAxQAAAAAAAAAIQAw+BPcOCAAADggAABCAAAAAAAAAAAAAAAAAERUQwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL21hcmtlcnMucHlQSwECFAMUAAAAAAAAACEApYYd2wMRAAADEQAARwAAAAAAAAAAAAAAAADcdEMAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9yZXF1aXJlbWVudHMucHlQSwECFAMUAAAAAAAAACEAfEWDjHltAAB5bQAARQAAAAAAAAAAAAAAAABEhkMAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9zcGVjaWZpZXJzLnB5UEsBAhQDFAAAAAAAAAAhAMXqJw+lAQAApQEAAEAAAAAAAAAAAAAAAAAAIPRDAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvdXRpbHMucHlQSwECFAMUAAAAAAAAACEADu/GoSQtAAAkLQAAQgAAAAAAAAAAAAAAAAAj9kMAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy92ZXJzaW9uLnB5UEsBAhQDFAAAAAAAAAAhAHgoFMPrgQMA64EDADoAAAAAAAAAAAAAAAAApyNEAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9weXBhcnNpbmcucHlQSwECFAMUAAAAAAAAACEAmVhNWpJ1AACSdQAANAAAAAAAAAAAAAAAAADqpUcAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3NpeC5weVBLAQIUAxQAAAAAAAAAIQB12PF5twkAALcJAAA4AAAAAAAAAAAAAAAAAM4bSABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL2V4dGVybi9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDHR30yWAIAAFgCAAAzAAAAAAAAAAAAAAAAANslSABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL3B5MzFjb21wYXQucHlQSwECFAMUAAAAAAAAACEAf9S6XI4FAACOBQAAQwAAAAAAAAAAAAAAAACEKEgAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL0RFU0NSSVBUSU9OLnJzdFBLAQIUAxQAAAAAAAAAIQBQ16sHNgQAADYEAAA/AAAAAAAAAAAAAAAAAHMuSABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vTElDRU5TRS50eHRQSwECFAMUAAAAAAAAACEA8QyQ/+4KAADuCgAAPAAAAAAAAAAAAAAAAAAGM0gAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL01FVEFEQVRBUEsBAhQDFAAAAAAAAAAhAFysJqeDHgAAgx4AADoAAAAAAAAAAAAAAAAATj5IAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9SRUNPUkRQSwECFAMUAAAAAAAAACEA9t3Svm4AAABuAAAAOQAAAAAAAAAAAAAAAAApXUgAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL1dIRUVMUEsBAhQDFAAAAAAAAAAhADfZX93vAAAA7wAAAEgAAAAAAAAAAAAAAAAA7l1IAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9kZXBlbmRlbmN5X2xpbmtzLnR4dFBLAQIUAxQAAAAAAAAAIQDRNY6OrgsAAK4LAABEAAAAAAAAAAAAAAAAAENfSABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dFBLAQIUAxQAAAAAAAAAIQD71iD1JRMAACUTAABBAAAAAAAAAAAAAAAAAFNrSABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vbWV0YWRhdGEuanNvblBLAQIUAxQAAAAAAAAAIQAwXAGRJgAAACYAAABBAAAAAAAAAAAAAAAAANd+SABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vdG9wX2xldmVsLnR4dFBLAQIUAxQAAAAAAAAAIQCTBtcyAQAAAAEAAAA8AAAAAAAAAAAAAAAAAFx/SABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vemlwLXNhZmVQSwECFAMUAAAAAAAAACEAIwtKA0QWAABEFgAALgAAAAAAAAAAAAAAAAC3f0gAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQClh2VRwBkAAMAZAAAyAAAAAAAAAAAAAAAAAEeWSABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2FyY2hpdmVfdXRpbC5weVBLAQIUAxQAAAAAAAAAIQAf4j0cJxYAACcWAAAwAAAAAAAAAAAAAAAAAFewSABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2J1aWxkX21ldGEucHlQSwECFAMUAAAAAAAAACEA9YZ6aQAAAQAAAAEALQAAAAAAAAAAAAAAAADMxkgAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jbGktMzIuZXhlUEsBAhQDFAAAAAAAAAAhAGJwztsAJAEAACQBAC0AAAAAAAAAAAAAAAAAF8dJAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY2xpLTY0LmV4ZVBLAQIUAxQAAAAAAAAAIQD1hnppAAABAAAAAQAqAAAAAAAAAAAAAAAAAGLrSgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NsaS5leGVQSwECFAMUAAAAAAAAACEAQZwWUlICAABSAgAANgAAAAAAAAAAAAAAAACq60sAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAFD4I/J6CQAAegkAADMAAAAAAAAAAAAAAAAAUO5LAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9hbGlhcy5weVBLAQIUAxQAAAAAAAAAIQBJzCuhW0YAAFtGAAA3AAAAAAAAAAAAAAAAABv4SwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfZWdnLnB5UEsBAhQDFAAAAAAAAAAhAOvSdBbkBQAA5AUAADcAAAAAAAAAAAAAAAAAyz5MAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9ycG0ucHlQSwECFAMUAAAAAAAAACEAIIx1FH0CAAB9AgAAOwAAAAAAAAAAAAAAAAAERUwAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHlQSwECFAMUAAAAAAAAACEAJxqNG4QRAACEEQAAOAAAAAAAAAAAAAAAAADaR0wAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2NsaWIucHlQSwECFAMUAAAAAAAAACEAkaVp5/kyAAD5MgAANwAAAAAAAAAAAAAAAAC0WUwAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2V4dC5weVBLAQIUAxQAAAAAAAAAIQBARkLcfCUAAHwlAAA2AAAAAAAAAAAAAAAAAAKNTABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfcHkucHlQSwECFAMUAAAAAAAAACEAQFw7/24fAABuHwAANQAAAAAAAAAAAAAAAADSskwAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2RldmVsb3AucHlQSwECFAMUAAAAAAAAACEA/+j2kcADAADAAwAANwAAAAAAAAAAAAAAAACT0kwAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2Rpc3RfaW5mby5weVBLAQIUAxQAAAAAAAAAIQCrdBLpVVQBAFVUAQA6AAAAAAAAAAAAAAAAAKjWTABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvZWFzeV9pbnN0YWxsLnB5UEsBAhQDFAAAAAAAAAAhAE4sckJwYQAAcGEAADYAAAAAAAAAAAAAAAAAVStOAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9lZ2dfaW5mby5weVBLAQIUAxQAAAAAAAAAIQCN27U/SxIAAEsSAAA1AAAAAAAAAAAAAAAAABmNTgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbC5weVBLAQIUAxQAAAAAAAAAIQBc0qjlmwgAAJsIAAA+AAAAAAAAAAAAAAAAALefTgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weVBLAQIUAxQAAAAAAAAAIQCQnDtTAA8AAAAPAAA5AAAAAAAAAAAAAAAAAK6oTgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9saWIucHlQSwECFAMUAAAAAAAAACEARj/xHocJAACHCQAAPQAAAAAAAAAAAAAAAAAFuE4AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weVBLAQIUAxQAAAAAAAAAIQB9c2C/ehMAAHoTAAA4AAAAAAAAAAAAAAAAAOfBTgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvcHkzNmNvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQDN/62QDgEAAA4BAAA2AAAAAAAAAAAAAAAAALfVTgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvcmVnaXN0ZXIucHlQSwECFAMUAAAAAAAAACEAGcrUpHQIAAB0CAAANAAAAAAAAAAAAAAAAAAZ104AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3JvdGF0ZS5weVBLAQIUAxQAAAAAAAAAIQAEgdY0kgIAAJICAAA2AAAAAAAAAAAAAAAAAN/fTgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvc2F2ZW9wdHMucHlQSwECFAMUAAAAAAAAACEAtx/RbjcaAAA3GgAAMwAAAAAAAAAAAAAAAADF4k4AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3NkaXN0LnB5UEsBAhQDFAAAAAAAAAAhAJtwy8fdEwAA3RMAADQAAAAAAAAAAAAAAAAATf1OAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9zZXRvcHQucHlQSwECFAMUAAAAAAAAACEA3Rnhnv4jAAD+IwAAMgAAAAAAAAAAAAAAAAB8EU8AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3Rlc3QucHlQSwECFAMUAAAAAAAAACEA2SSLZ5QEAACUBAAANAAAAAAAAAAAAAAAAADKNU8AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3VwbG9hZC5weVBLAQIUAxQAAAAAAAAAIQDyl/PGjxwAAI8cAAA5AAAAAAAAAAAAAAAAALA6TwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkX2RvY3MucHlQSwECFAMUAAAAAAAAACEAiUcQJLE/AACxPwAALAAAAAAAAAAAAAAAAACWV08AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb25maWcucHlQSwECFAMUAAAAAAAAACEAGiIEMqcDAACnAwAALgAAAAAAAAAAAAAAAACRl08AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9kZXBfdXRpbC5weVBLAQIUAxQAAAAAAAAAIQBbKS1qzRYAAM0WAAAtAAAAAAAAAAAAAAAAAISbTwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2RlcGVuZHMucHlQSwECFAMUAAAAAAAAACEAJXSHBZCdAACQnQAAKgAAAAAAAAAAAAAAAACcsk8AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9kaXN0LnB5UEsBAhQDFAAAAAAAAAAhALmqke7BBgAAwQYAAC8AAAAAAAAAAAAAAAAAdFBQAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZXh0ZW5zaW9uLnB5UEsBAhQDFAAAAAAAAAAhANCKe2WDAAAAgwAAADUAAAAAAAAAAAAAAAAAgldQAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZXh0ZXJuL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAATqwb1KDAAASgwAACsAAAAAAAAAAAAAAAAAWFhQAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZ2xpYmMucHlQSwECFAMUAAAAAAAAACEAvF2hOVcUAABXFAAAKgAAAAAAAAAAAAAAAADrZFAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9nbG9iLnB5UEsBAhQDFAAAAAAAAAAhABD5/CkAAAEAAAABAC0AAAAAAAAAAAAAAAAAinlQAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZ3VpLTMyLmV4ZVBLAQIUAxQAAAAAAAAAIQDYDqv0ACYBAAAmAQAtAAAAAAAAAAAAAAAAANV5UQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2d1aS02NC5leGVQSwECFAMUAAAAAAAAACEAEPn8KQAAAQAAAAEAKgAAAAAAAAAAAAAAAAAgoFIAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9ndWkuZXhlUEsBAhQDFAAAAAAAAAAhAGT5fpsTAwAAEwMAACwAAAAAAAAAAAAAAAAAaKBTAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvbGF1bmNoLnB5UEsBAhQDFAAAAAAAAAAhAIdR66LdBwAA3QcAADAAAAAAAAAAAAAAAAAAxaNTAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvbGliMnRvM19leC5weVBLAQIUAxQAAAAAAAAAIQCNQ3JenRYAAJ0WAAAsAAAAAAAAAAAAAAAAAPCrUwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL21vbmtleS5weVBLAQIUAxQAAAAAAAAAIQCCw5TmtJ8AALSfAAAqAAAAAAAAAAAAAAAAANfCUwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL21zdmMucHlQSwECFAMUAAAAAAAAACEAYwvj1n8MAAB/DAAAMAAAAAAAAAAAAAAAAADTYlQAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9uYW1lc3BhY2VzLnB5UEsBAhQDFAAAAAAAAAAhAImwE847ngAAO54AADMAAAAAAAAAAAAAAAAAoG9UAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcGFja2FnZV9pbmRleC5weVBLAQIUAxQAAAAAAAAAIQDl5ui+gioAAIIqAAAwAAAAAAAAAAAAAAAAACwOVQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3BlcDQyNXRhZ3MucHlQSwECFAMUAAAAAAAAACEAsmanVxgCAAAYAgAAMAAAAAAAAAAAAAAAAAD8OFUAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9weTI3Y29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhANC5SFqoBAAAqAQAADAAAAAAAAAAAAAAAAAAYjtVAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcHkzMWNvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQDJYZLA5gMAAOYDAAAwAAAAAAAAAAAAAAAAAFhAVQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3B5MzNjb21wYXQucHlQSwECFAMUAAAAAAAAACEAhRmaC0sLAABLCwAAMAAAAAAAAAAAAAAAAACMRFUAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9weTM2Y29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAIxTmmPENwAAxDcAAC0AAAAAAAAAAAAAAAAAJVBVAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvc2FuZGJveC5weVBLAQIUAxQAAAAAAAAAIQCoM7S+igAAAIoAAAAuAAAAAAAAAAAAAAAAADSIVQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3NjcmlwdC50bXBsUEsBAhQDFAAAAAAAAAAhAALBlOMDCQAAAwkAADAAAAAAAAAAAAAAAAAAColVAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvc2l0ZS1wYXRjaC5weVBLAQIUAxQAAAAAAAAAIQCIm1tOLCEAACwhAAAxAAAAAAAAAAAAAAAAAFuSVQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3NzbF9zdXBwb3J0LnB5UEsBAhQDFAAAAAAAAAAhAJpC15rkAwAA5AMAADMAAAAAAAAAAAAAAAAA1rNVAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvdW5pY29kZV91dGlscy5weVBLAQIUAxQAAAAAAAAAIQBIsUxikAAAAJAAAAAtAAAAAAAAAAAAAAAAAAu4VQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3ZlcnNpb24ucHlQSwECFAMUAAAAAAAAACEAcB0I80EcAABBHAAAKwAAAAAAAAAAAAAAAADmuFUAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy93aGVlbC5weVBLAQIUAxQAAAAAAAAAIQD5y+4NygIAAMoCAAA1AAAAAAAAAAAAAAAAAHDVVQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3dpbmRvd3Nfc3VwcG9ydC5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAI3YVQBweXBpX193aGVlbF8wXzMwXzBhMC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCIOqXUVSYAAFUmAAA9AAAAAAAAAAAAAAAAAMvYVQBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vREVTQ1JJUFRJT04ucnN0UEsBAhQDFAAAAAAAAAAhAHD/rp9lBAAAZQQAADkAAAAAAAAAAAAAAAAAe/9VAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9MSUNFTlNFLnR4dFBLAQIUAxQAAAAAAAAAIQBEbZmBDSsAAA0rAAA2AAAAAAAAAAAAAAAAADcEVgBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vTUVUQURBVEFQSwECFAMUAAAAAAAAACEApw+7Fp0PAACdDwAANAAAAAAAAAAAAAAAAACYL1YAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL1JFQ09SRFBLAQIUAxQAAAAAAAAAIQCU35Z7cQAAAHEAAAAzAAAAAAAAAAAAAAAAAIc/VgBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vV0hFRUxQSwECFAMUAAAAAAAAACEA4kXfrG0AAABtAAAAPgAAAAAAAAAAAAAAAABJQFYAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL2VudHJ5X3BvaW50cy50eHRQSwECFAMUAAAAAAAAACEAUrJO1loGAABaBgAAOwAAAAAAAAAAAAAAAAASQVYAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL21ldGFkYXRhLmpzb25QSwECFAMUAAAAAAAAACEAGWPeZQYAAAAGAAAAOwAAAAAAAAAAAAAAAADFR1YAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHRQSwECFAMUAAAAAAAAACEAYTelR2MAAABjAAAAJgAAAAAAAAAAAAAAAAAkSFYAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAJGm3VKABAACgAQAAJgAAAAAAAAAAAAAAAADLSFYAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvX19tYWluX18ucHlQSwECFAMUAAAAAAAAACEAIFOCUscIAADHCAAAJQAAAAAAAAAAAAAAAACvSlYAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvYXJjaGl2ZS5weVBLAQIUAxQAAAAAAAAAIQBKryTR6EcAAOhHAAApAAAAAAAAAAAAAAAAALlTVgBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9iZGlzdF93aGVlbC5weVBLAQIUAxQAAAAAAAAAIQCjeVJ3HQIAAB0CAAAnAAAAAAAAAAAAAAAAAOibVgBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9kZWNvcmF0b3IucHlQSwECFAMUAAAAAAAAACEA02EPJNMLAADTCwAAJwAAAAAAAAAAAAAAAABKnlYAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvZWdnMndoZWVsLnB5UEsBAhQDFAAAAAAAAAAhABAk8jO6CQAAugkAACcAAAAAAAAAAAAAAAAAYqpWAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL2VnZ25hbWVzLnR4dFBLAQIUAxQAAAAAAAAAIQCxvLn2skYAALJGAAAlAAAAAAAAAAAAAAAAAGG0VgBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9pbnN0YWxsLnB5UEsBAhQDFAAAAAAAAAAhADkodwucLQAAnC0AACYAAAAAAAAAAAAAAAAAVvtWAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL21ldGFkYXRhLnB5UEsBAhQDFAAAAAAAAAAhAGH2NdJqBAAAagQAACMAAAAAAAAAAAAAAAAANilXAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3BhdGhzLnB5UEsBAhQDFAAAAAAAAAAhAGtiVnzFFgAAxRYAACgAAAAAAAAAAAAAAAAA4S1XAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3BlcDQyNXRhZ3MucHlQSwECFAMUAAAAAAAAACEAgEMYoMkEAADJBAAAJQAAAAAAAAAAAAAAAADsRFcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvcGtnaW5mby5weVBLAQIUAxQAAAAAAAAAIQD8TOZMww4AAMMOAAAxAAAAAAAAAAAAAAAAAPhJVwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9zaWduYXR1cmVzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAPxQ/+BjGgAAYxoAAC4AAAAAAAAAAAAAAAAACllXAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3NpZ25hdHVyZXMvZGpiZWMucHlQSwECFAMUAAAAAAAAACEATAElPp8GAACfBgAAMgAAAAAAAAAAAAAAAAC5c1cAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvc2lnbmF0dXJlcy9lZDI1NTE5cHkucHlQSwECFAMUAAAAAAAAACEA29viLfQMAAD0DAAALQAAAAAAAAAAAAAAAACoelcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvc2lnbmF0dXJlcy9rZXlzLnB5UEsBAhQDFAAAAAAAAAAhAP+eZXABAAAAAQAAACsAAAAAAAAAAAAAAAAA54dXAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAxiFcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9jb21wbGV4LWRpc3QvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAShdH0hcAAAAXAAAARAAAAAAAAAAAAAAAAACHiFcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9jb21wbGV4LWRpc3QvY29tcGxleGRpc3QvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAHAoXOFcDAABXAwAANQAAAAAAAAAAAAAAAAAAiVcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9jb21wbGV4LWRpc3Qvc2V0dXAucHlQSwECFAMUAAAAAAAAACEAKEsYZZkGAACZBgAAKwAAAAAAAAAAAAAAAACqjFcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9jb25mdGVzdC5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAA6AAAAAAAAAAAAAAAAAIyTVwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2V4dGVuc2lvbi5kaXN0L19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAF+GzE/IAQAAyAEAADcAAAAAAAAAAAAAAAAA5JNXAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvZXh0ZW5zaW9uLmRpc3Qvc2V0dXAucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAABllcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3QvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAANQAAAAAAAAAAAAAAAABXllcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3QvaGVhZGVyLmhQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAOwAAAAAAAAAAAAAAAACqllcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3QvaGVhZGVyc2Rpc3QucHlQSwECFAMUAAAAAAAAACEAmcQnLEQBAABEAQAANQAAAAAAAAAAAAAAAAADl1cAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3Qvc2V0dXAucHlQSwECFAMUAAAAAAAAACEAaj7d19ssAADbLAAAMgAAAAAAAAAAAAAAAACamFcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9weWRpc3Qtc2NoZW1hLmpzb25QSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAANwAAAAAAAAAAAAAAAADFxVcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9zaW1wbGUuZGlzdC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDTTQSjfwEAAH8BAAA0AAAAAAAAAAAAAAAAABrGVwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3NpbXBsZS5kaXN0L3NldHVwLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEIAAAAAAAAAAAAAAAAA68dXAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3Qvc2ltcGxlLmRpc3Qvc2ltcGxlZGlzdC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQB24Ez6ahQAAGoUAAA/AAAAAAAAAAAAAAAAAEvIVwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3QtMS4wLXB5Mi5weTMtbm9uZS13aW4zMi53aGxQSwECFAMUAAAAAAAAACEAOCvvEW0ZAABtGQAALQAAAAAAAAAAAAAAAAAS3VcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X2Jhc2ljLnB5UEsBAhQDFAAAAAAAAAAhAG0Esr5KBwAASgcAAC8AAAAAAAAAAAAAAAAAyvZXAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF9pbnN0YWxsLnB5UEsBAhQDFAAAAAAAAAAhAPdhH5MPCgAADwoAACwAAAAAAAAAAAAAAAAAYf5XAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF9rZXlzLnB5UEsBAhQDFAAAAAAAAAAhAGJYdGOsAAAArAAAAC0AAAAAAAAAAAAAAAAAughYAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF9wYXRocy5weVBLAQIUAxQAAAAAAAAAIQBtljH52AUAANgFAAAvAAAAAAAAAAAAAAAAALEJWABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfcmFua2luZy5weVBLAQIUAxQAAAAAAAAAIQCkKX8xYAQAAGAEAAAyAAAAAAAAAAAAAAAAANYPWABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3Rfc2lnbmF0dXJlcy5weVBLAQIUAxQAAAAAAAAAIQCcV0LwJxcAACcXAAAuAAAAAAAAAAAAAAAAAIYUWABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfdGFnb3B0LnB5UEsBAhQDFAAAAAAAAAAhANQ+H1aQAgAAkAIAACwAAAAAAAAAAAAAAAAA+StYAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF90b29sLnB5UEsBAhQDFAAAAAAAAAAhAEViREzpEQAA6REAADEAAAAAAAAAAAAAAAAA0y5YAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF93aGVlbGZpbGUucHlQSwECFAMUAAAAAAAAACEAoy0DF6EzAAChMwAAKwAAAAAAAAAAAAAAAAALQVgAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdG9vbC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDP2DOyGhMAABoTAAAiAAAAAAAAAAAAAAAAAPV0WABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC91dGlsLnB5UEsBAhQDFAAAAAAAAAAhAPO05Ci3HgAAtx4AACsAAAAAAAAAAAAAAAAAT4hYAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3dpbmluc3Qyd2hlZWwucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAJQAAAAAAAAAAAAAAAABPp1gAcnVsZXNfcHl0aG9uL3J1bGVzX3B5dGhvbi9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAsiqrLHzIAAB8yAAAhAAAAAAAAAAAAAAAAAJKnWABydWxlc19weXRob24vcnVsZXNfcHl0aG9uL3BpcHRvb2xQSwECFAMUAAAAAAAAACEAwGgdjw8dAAAPHQAAJAAAAAAAAAAAAAAAAADw2VgAcnVsZXNfcHl0aG9uL3J1bGVzX3B5dGhvbi9waXB0b29sLnB5UEsBAhQDFAAAAAAAAAAhAM5NWbJgFgAAYBYAACAAAAAAAAAAAAAAAAAAQfdYAHJ1bGVzX3B5dGhvbi9ydWxlc19weXRob24vd2hsLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAABIAAAAAAAAAAAAAAAAA3w1ZAHN1YnBhci9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAAaAAAAAAAAAAAAAAAAAA8OWQBzdWJwYXIvcnVudGltZS9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCPoHM8ty4AALcuAAAZAAAAAAAAAAAAAAAAAEcOWQBzdWJwYXIvcnVudGltZS9zdXBwb3J0LnB5UEsFBgAAAACyAbIBLaAAADU9WQAAAA==